From 2231287e2758eb084733d888d6af9395e86e1bb5 Mon Sep 17 00:00:00 2001 From: Veijo Pesonen Date: Tue, 1 Feb 2022 13:44:08 +0200 Subject: [PATCH] net: lwm2m: Resource Instance level read access. Makes possible to read a single resource instance at a time with plaint text, JSON and TLV content formats. Signed-off-by: Veijo Pesonen --- subsys/net/lib/lwm2m/lwm2m_engine.c | 17 +++++++++++++++-- subsys/net/lib/lwm2m/lwm2m_rw_oma_tlv.c | 6 ++++++ subsys/net/lib/lwm2m/lwm2m_rw_plain_text.c | 12 +++++++++--- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/subsys/net/lib/lwm2m/lwm2m_engine.c b/subsys/net/lib/lwm2m/lwm2m_engine.c index fa1ac31d98e..5b471e2d26b 100644 --- a/subsys/net/lib/lwm2m/lwm2m_engine.c +++ b/subsys/net/lib/lwm2m/lwm2m_engine.c @@ -2399,6 +2399,12 @@ static int lwm2m_read_handler(struct lwm2m_engine_obj_inst *obj_inst, continue; } + if (IS_ENABLED(CONFIG_LWM2M_VERSION_1_1) && + msg->path.level == LWM2M_PATH_LEVEL_RESOURCE_INST && + msg->path.res_inst_id != res->res_instances[i].res_inst_id) { + continue; + } + if (res->res_inst_count > 1) { msg->path.res_inst_id = res->res_instances[i].res_inst_id; @@ -3496,8 +3502,15 @@ int lwm2m_perform_read_op(struct lwm2m_message *msg, uint16_t content_format) memcpy(&msg->path, &temp_path, sizeof(temp_path)); /* did not read anything even if we should have - on single item */ - if (ret == 0 && num_read == 0U && msg->path.level >= LWM2M_PATH_LEVEL_RESOURCE) { - return -ENOENT; + if (ret == 0 && num_read == 0U) { + if (msg->path.level == LWM2M_PATH_LEVEL_RESOURCE) { + return -ENOENT; + } + + if (IS_ENABLED(CONFIG_LWM2M_VERSION_1_1) && + msg->path.level == LWM2M_PATH_LEVEL_RESOURCE_INST) { + return -ENOENT; + } } return ret; diff --git a/subsys/net/lib/lwm2m/lwm2m_rw_oma_tlv.c b/subsys/net/lib/lwm2m/lwm2m_rw_oma_tlv.c index fa6353974a0..858c1da4bc1 100644 --- a/subsys/net/lib/lwm2m/lwm2m_rw_oma_tlv.c +++ b/subsys/net/lib/lwm2m/lwm2m_rw_oma_tlv.c @@ -382,6 +382,12 @@ static int put_end_ri(struct lwm2m_output_context *out, return -EINVAL; } + /* Skip writing Multiple Resource TLV if path level is 4 */ + if (IS_ENABLED(CONFIG_LWM2M_VERSION_1_1) && + path->level == LWM2M_PATH_LEVEL_RESOURCE_INST) { + return 0; + } + return put_end_tlv(out, fd->mark_pos_ri, &fd->writer_flags, WRITER_RESOURCE_INSTANCE, OMA_TLV_TYPE_MULTI_RESOURCE, path->res_id); diff --git a/subsys/net/lib/lwm2m/lwm2m_rw_plain_text.c b/subsys/net/lib/lwm2m/lwm2m_rw_plain_text.c index 488c279993f..9d99fe73ca7 100644 --- a/subsys/net/lib/lwm2m/lwm2m_rw_plain_text.c +++ b/subsys/net/lib/lwm2m/lwm2m_rw_plain_text.c @@ -421,9 +421,15 @@ const struct lwm2m_reader plain_text_reader = { int do_read_op_plain_text(struct lwm2m_message *msg, int content_format) { - /* Plain text can only return single resource */ - if (msg->path.level != 3U) { - return -EPERM; /* NOT_ALLOWED */ + /* Plain text can only return single resource (instance) */ + if (msg->path.level < LWM2M_PATH_LEVEL_RESOURCE) { + return -EPERM; + } else if (msg->path.level > LWM2M_PATH_LEVEL_RESOURCE) { + if (!IS_ENABLED(CONFIG_LWM2M_VERSION_1_1)) { + return -ENOENT; + } else if (msg->path.level > LWM2M_PATH_LEVEL_RESOURCE_INST) { + return -ENOENT; + } } return lwm2m_perform_read_op(msg, content_format);