net: lwm2m: Composite Observe operation placeholder

Added detetction for Composite Observervation request and cancel.

Signed-off-by: Juha Heiskanen <juha.heiskanen@nordicsemi.no>
This commit is contained in:
Juha Heiskanen 2022-01-26 00:12:06 -08:00 committed by Carles Cufí
commit 312dd7f887

View file

@ -3966,6 +3966,42 @@ static bool lwm2m_engine_path_included(uint8_t code, bool bootstrap_mode)
return true; return true;
} }
static int lwm2m_engine_observation_handler(struct lwm2m_message *msg, int observe, uint16_t accept)
{
int r;
if (observe == 0) {
/* add new observer */
r = coap_append_option_int(msg->out.out_cpkt, COAP_OPTION_OBSERVE,
OBSERVE_COUNTER_START);
if (r < 0) {
LOG_ERR("OBSERVE option error: %d", r);
return r;
}
r = engine_add_observer(msg, msg->token, msg->tkl, accept);
if (r < 0) {
LOG_ERR("add OBSERVE error: %d", r);
}
} else if (observe == 1) {
/* remove observer */
r = engine_remove_observer_by_token(msg->ctx, msg->token, msg->tkl);
if (r < 0) {
#if defined(CONFIG_LWM2M_CANCEL_OBSERVE_BY_PATH)
r = engine_remove_observer_by_path(msg->ctx, &msg->path);
if (r < 0)
#endif /* CONFIG_LWM2M_CANCEL_OBSERVE_BY_PATH */
{
LOG_ERR("remove observe error: %d", r);
r = 0;
}
}
} else {
r = -EINVAL;
}
return r;
}
static int handle_request(struct coap_packet *request, static int handle_request(struct coap_packet *request,
struct lwm2m_message *msg) struct lwm2m_message *msg)
{ {
@ -4241,50 +4277,35 @@ static int handle_request(struct coap_packet *request,
switch (msg->operation) { switch (msg->operation) {
case LWM2M_OP_READ: case LWM2M_OP_READ:
if (observe == 0) { if (observe >= 0) {
/* add new observer */ /* Validate That Token is valid for Observation */
if (msg->token) { if (!msg->token) {
r = coap_append_option_int(
msg->out.out_cpkt,
COAP_OPTION_OBSERVE,
OBSERVE_COUNTER_START);
if (r < 0) {
LOG_ERR("OBSERVE option error: %d", r);
goto error;
}
r = engine_add_observer(msg, token, tkl,
accept);
if (r < 0) {
LOG_ERR("add OBSERVE error: %d", r);
goto error;
}
} else {
LOG_ERR("OBSERVE request missing token"); LOG_ERR("OBSERVE request missing token");
r = -EINVAL; r = -EINVAL;
goto error; goto error;
} }
} else if (observe == 1) {
/* remove observer */ if ((code & COAP_REQUEST_MASK) == COAP_METHOD_GET) {
r = engine_remove_observer_by_token(msg->ctx, token, tkl); /* Normal Obeservation Request or Cancel */
if (r < 0) { r = lwm2m_engine_observation_handler(msg, observe, accept);
#if defined(CONFIG_LWM2M_CANCEL_OBSERVE_BY_PATH) if (r < 0) {
r = engine_remove_observer_by_path(msg->ctx, goto error;
&msg->path);
if (r < 0)
#endif /* CONFIG_LWM2M_CANCEL_OBSERVE_BY_PATH */
{
LOG_ERR("remove observe error: %d", r);
} }
r = do_read_op(msg, accept);
} else {
/* Composite Observation request & cancel handler */
/* TODO add support for Composite observation support */
r = -ENOTSUP;
goto error;
}
} else {
if ((code & COAP_REQUEST_MASK) == COAP_METHOD_GET) {
r = do_read_op(msg, accept);
} else {
r = do_composite_read_op(msg, accept);
} }
} }
if ((code & COAP_REQUEST_MASK) == COAP_METHOD_GET) {
r = do_read_op(msg, accept);
} else {
r = do_composite_read_op(msg, accept);
}
break; break;
case LWM2M_OP_DISCOVER: case LWM2M_OP_DISCOVER: