diff --git a/subsys/net/lib/lwm2m/lwm2m_engine.c b/subsys/net/lib/lwm2m/lwm2m_engine.c index 4431e71507d..fbe2eeee579 100644 --- a/subsys/net/lib/lwm2m/lwm2m_engine.c +++ b/subsys/net/lib/lwm2m/lwm2m_engine.c @@ -2485,6 +2485,21 @@ static int lwm2m_write_handler_opaque(struct lwm2m_engine_obj_inst *obj_inst, return opaque_ctx.len; } +bool lwm2m_engine_bootstrap_override(struct lwm2m_ctx *client_ctx, struct lwm2m_obj_path *path) +{ + if (!client_ctx->bootstrap_mode) { + /* Bootstrap is not active override is not possible then */ + return false; + } + + if (path->obj_id == LWM2M_OBJECT_SECURITY_ID || path->obj_id == LWM2M_OBJECT_SERVER_ID) { + /* Bootstrap server have a access to Security and Server object */ + return true; + } + + return false; +} + /* This function is exposed for the content format writers */ int lwm2m_write_handler(struct lwm2m_engine_obj_inst *obj_inst, struct lwm2m_engine_res *res, diff --git a/subsys/net/lib/lwm2m/lwm2m_engine.h b/subsys/net/lib/lwm2m/lwm2m_engine.h index e33b307cb35..a8b16d5dde9 100644 --- a/subsys/net/lib/lwm2m/lwm2m_engine.h +++ b/subsys/net/lib/lwm2m/lwm2m_engine.h @@ -104,6 +104,8 @@ int lwm2m_write_handler(struct lwm2m_engine_obj_inst *obj_inst, struct lwm2m_engine_obj_field *obj_field, struct lwm2m_message *msg); +bool lwm2m_engine_bootstrap_override(struct lwm2m_ctx *client_ctx, struct lwm2m_obj_path *path); + int lwm2m_discover_handler(struct lwm2m_message *msg, bool is_bootstrap); enum coap_block_size lwm2m_default_block_size(void); diff --git a/subsys/net/lib/lwm2m/lwm2m_obj_server.c b/subsys/net/lib/lwm2m/lwm2m_obj_server.c index 510310a524e..f1507bdce62 100644 --- a/subsys/net/lib/lwm2m/lwm2m_obj_server.c +++ b/subsys/net/lib/lwm2m/lwm2m_obj_server.c @@ -85,12 +85,7 @@ static char transport_binding[MAX_INSTANCE_COUNT][TRANSPORT_BINDING_LEN]; static struct lwm2m_engine_obj server; static struct lwm2m_engine_obj_field fields[] = { - /* - * LwM2M TS "E.2 LwM2M Object: LwM2M Server" page 107, describes - * Short Server ID as READ-ONLY, but BOOTSTRAP server will attempt - * to write it, so it needs to be RW - */ - OBJ_FIELD_DATA(SERVER_SHORT_SERVER_ID, RW, U16), + OBJ_FIELD_DATA(SERVER_SHORT_SERVER_ID, R, U16), OBJ_FIELD_DATA(SERVER_LIFETIME_ID, RW, U32), OBJ_FIELD_DATA(SERVER_DEFAULT_MIN_PERIOD_ID, RW_OPT, U32), OBJ_FIELD_DATA(SERVER_DEFAULT_MAX_PERIOD_ID, RW_OPT, U32), diff --git a/subsys/net/lib/lwm2m/lwm2m_rw_json.c b/subsys/net/lib/lwm2m/lwm2m_rw_json.c index bfeee93e61a..0c0943eefe1 100644 --- a/subsys/net/lib/lwm2m/lwm2m_rw_json.c +++ b/subsys/net/lib/lwm2m/lwm2m_rw_json.c @@ -1028,7 +1028,8 @@ int do_write_op_json(struct lwm2m_message *msg) * resources are ignored */ - if (!LWM2M_HAS_PERM(obj_field, LWM2M_PERM_W)) { + if (!LWM2M_HAS_PERM(obj_field, LWM2M_PERM_W) && + !lwm2m_engine_bootstrap_override(msg->ctx, &msg->path)) { ret = -EPERM; break; } diff --git a/subsys/net/lib/lwm2m/lwm2m_rw_oma_tlv.c b/subsys/net/lib/lwm2m/lwm2m_rw_oma_tlv.c index 148174a57b7..11789775aa2 100644 --- a/subsys/net/lib/lwm2m/lwm2m_rw_oma_tlv.c +++ b/subsys/net/lib/lwm2m/lwm2m_rw_oma_tlv.c @@ -821,7 +821,8 @@ static int do_write_op_tlv_item(struct lwm2m_message *msg) goto error; } - if (!LWM2M_HAS_PERM(obj_field, LWM2M_PERM_W)) { + if (!LWM2M_HAS_PERM(obj_field, LWM2M_PERM_W) && + !lwm2m_engine_bootstrap_override(msg->ctx, &msg->path)) { ret = -EPERM; goto error; } diff --git a/subsys/net/lib/lwm2m/lwm2m_rw_plain_text.c b/subsys/net/lib/lwm2m/lwm2m_rw_plain_text.c index c79500bed39..36de09a4e95 100644 --- a/subsys/net/lib/lwm2m/lwm2m_rw_plain_text.c +++ b/subsys/net/lib/lwm2m/lwm2m_rw_plain_text.c @@ -446,7 +446,8 @@ int do_write_op_plain_text(struct lwm2m_message *msg) return -ENOENT; } - if (!LWM2M_HAS_PERM(obj_field, LWM2M_PERM_W)) { + if (!LWM2M_HAS_PERM(obj_field, LWM2M_PERM_W) && + !lwm2m_engine_bootstrap_override(msg->ctx, &msg->path)) { return -EPERM; }