diff --git a/subsys/net/lib/lwm2m/lwm2m_engine.c b/subsys/net/lib/lwm2m/lwm2m_engine.c index 7ff27e71709..231c88ebe28 100644 --- a/subsys/net/lib/lwm2m/lwm2m_engine.c +++ b/subsys/net/lib/lwm2m/lwm2m_engine.c @@ -2057,7 +2057,7 @@ int lwm2m_write_handler(struct lwm2m_engine_obj_inst *obj_inst, } static int lwm2m_write_attr_handler(struct lwm2m_engine_obj *obj, - struct lwm2m_engine_context *context) + struct lwm2m_engine_context *context) { if (!obj || !context) { return -EINVAL; @@ -2065,7 +2065,7 @@ static int lwm2m_write_attr_handler(struct lwm2m_engine_obj *obj, /* TODO: set parameters on resource for notification */ - return 0; + return -ENOTSUP; } static int lwm2m_exec_handler(struct lwm2m_engine_obj *obj, @@ -2449,7 +2449,7 @@ static int handle_request(struct coap_packet *request, struct lwm2m_engine_obj *obj = NULL; u8_t token[8]; u8_t tkl = 0; - u16_t format, accept; + u16_t format = LWM2M_FORMAT_NONE, accept; struct lwm2m_input_context in; struct lwm2m_output_context out; struct lwm2m_obj_path path; @@ -2521,10 +2521,8 @@ static int handle_request(struct coap_packet *request, r = coap_find_options(in.in_cpkt, COAP_OPTION_CONTENT_FORMAT, options, 1); if (r > 0) { - format = coap_option_value_to_int(&options[0]); - } else { - SYS_LOG_DBG("No content-format given. Assume text plain."); - format = LWM2M_FORMAT_PLAIN_TEXT; + format = select_reader( + &in, coap_option_value_to_int(&options[0])); } /* read Accept */ @@ -2546,7 +2544,6 @@ static int handle_request(struct coap_packet *request, } } - format = select_reader(&in, format); accept = select_writer(&out, accept); /* set the operation */ @@ -2586,7 +2583,13 @@ static int handle_request(struct coap_packet *request, break; case COAP_METHOD_PUT: - context.operation = LWM2M_OP_WRITE; + /* write attributes if content-format is absent */ + if (format == LWM2M_FORMAT_NONE) { + context.operation = LWM2M_OP_WRITE_ATTR; + } else { + context.operation = LWM2M_OP_WRITE; + } + msg->code = COAP_RESPONSE_CODE_CHANGED; break; @@ -2741,6 +2744,8 @@ error: msg->code = COAP_RESPONSE_CODE_INCOMPLETE; } else if (r == -EFBIG) { msg->code = COAP_RESPONSE_CODE_REQUEST_TOO_LARGE; + } else if (r == -ENOTSUP) { + msg->code = COAP_RESPONSE_CODE_NOT_IMPLEMENTED; } else { /* Failed to handle the request */ msg->code = COAP_RESPONSE_CODE_INTERNAL_ERROR; diff --git a/subsys/net/lib/lwm2m/lwm2m_engine.h b/subsys/net/lib/lwm2m/lwm2m_engine.h index eb155dc9487..4555ce7216b 100644 --- a/subsys/net/lib/lwm2m/lwm2m_engine.h +++ b/subsys/net/lib/lwm2m/lwm2m_engine.h @@ -23,6 +23,8 @@ #define LWM2M_FORMAT_OMA_OLD_OPAQUE 1544 #define LWM2M_FORMAT_OMA_TLV 11542 #define LWM2M_FORMAT_OMA_JSON 11543 +/* 65000 ~ 65535 inclusive are reserved for experiments */ +#define LWM2M_FORMAT_NONE 65535 #define COAP_RESPONSE_CODE_CLASS(x) (x >> 5)