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:
parent
fa8c851993
commit
392088ea13
1 changed files with 71 additions and 8 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue