net: lwm2m: OMA TLV Multi Resource TLV update

Added support for handle Multi Resource TLV for Write and Create operation.

Signed-off-by: Juha Heiskanen <juha.heiskanen@nordicsemi.no>
This commit is contained in:
Juha Heiskanen 2022-02-07 23:17:57 -08:00 committed by Anas Nashif
commit 392088ea13

View file

@ -903,6 +903,51 @@ static int write_tlv_resource(struct lwm2m_message *msg, struct oma_tlv *tlv)
return 0;
}
static int lwm2m_multi_resource_tlv_parse(struct lwm2m_message *msg,
struct oma_tlv *multi_resource_tlv)
{
struct oma_tlv tlv_resource_instance;
int len2;
int pos = 0;
int ret;
if (msg->in.block_ctx) {
msg->in.block_ctx->res_id = multi_resource_tlv->id;
}
if (multi_resource_tlv->length == 0U) {
/* No data for resource instances, so create only a resource */
return write_tlv_resource(msg, multi_resource_tlv);
}
while (pos < multi_resource_tlv->length &&
(len2 = oma_tlv_get(&tlv_resource_instance, &msg->in, true))) {
if (tlv_resource_instance.type != OMA_TLV_TYPE_RESOURCE_INSTANCE) {
LOG_ERR("Multi resource id not supported %u %d", tlv_resource_instance.id,
tlv_resource_instance.length);
return -ENOTSUP;
}
msg->path.res_id = multi_resource_tlv->id;
msg->path.res_inst_id = tlv_resource_instance.id;
msg->path.level = LWM2M_PATH_LEVEL_RESOURCE_INST;
ret = do_write_op_tlv_item(msg);
/*
* Ignore errors on optional resources when doing
* BOOTSTRAP WRITE or CREATE operation.
*/
if (ret < 0 && !((ret == -ENOTSUP) &&
(msg->ctx->bootstrap_mode || msg->operation == LWM2M_OP_CREATE))) {
return ret;
}
pos += len2;
}
return 0;
}
int do_write_op_tlv(struct lwm2m_message *msg)
{
struct lwm2m_engine_obj_inst *obj_inst = NULL;
@ -961,23 +1006,41 @@ int do_write_op_tlv(struct lwm2m_message *msg)
while (pos < tlv.length &&
(len2 = oma_tlv_get(&tlv2, &msg->in, true))) {
if (tlv2.type != OMA_TLV_TYPE_RESOURCE) {
pos += len2;
continue;
}
ret = write_tlv_resource(msg, &tlv2);
if (ret) {
return ret;
if (tlv2.type == OMA_TLV_TYPE_RESOURCE) {
ret = write_tlv_resource(msg, &tlv2);
if (ret) {
return ret;
}
} else if (tlv2.type == OMA_TLV_TYPE_MULTI_RESOURCE) {
oma_tlv_get(&tlv2, &msg->in, false);
ret = lwm2m_multi_resource_tlv_parse(msg, &tlv2);
if (ret) {
return ret;
}
} else {
/* Skip Unsupported TLV type */
return -ENOTSUP;
}
pos += len2;
}
} else if (tlv.type == OMA_TLV_TYPE_RESOURCE) {
if (msg->path.level < LWM2M_PATH_LEVEL_OBJECT_INST) {
return -ENOTSUP;
}
ret = write_tlv_resource(msg, &tlv);
if (ret) {
return ret;
}
} else if (tlv.type == OMA_TLV_TYPE_MULTI_RESOURCE) {
if (msg->path.level < LWM2M_PATH_LEVEL_OBJECT_INST) {
return -ENOTSUP;
}
oma_tlv_get(&tlv, &msg->in, false);
ret = lwm2m_multi_resource_tlv_parse(msg, &tlv);
if (ret) {
return ret;
}
} else {
return -ENOTSUP;
}