From c9f5337a91f08387e1b46ad92b71b6d114d6fa75 Mon Sep 17 00:00:00 2001 From: Robert Lubos Date: Tue, 2 Feb 2021 13:14:21 +0100 Subject: [PATCH] net: lwm2m: Add support for object versioning Each object now have to specify the object version it implements. Based on this information the LwM2M engine can decide whether it's needed to report the object version during Registration/Discovery operations or not. Signed-off-by: Robert Lubos --- subsys/net/lib/lwm2m/ipso_accelerometer.c | 6 +++ subsys/net/lib/lwm2m/ipso_buzzer.c | 6 +++ subsys/net/lib/lwm2m/ipso_generic_sensor.c | 6 +++ subsys/net/lib/lwm2m/ipso_humidity_sensor.c | 6 +++ subsys/net/lib/lwm2m/ipso_light_control.c | 6 +++ subsys/net/lib/lwm2m/ipso_onoff_switch.c | 6 +++ subsys/net/lib/lwm2m/ipso_pressure_sensor.c | 6 +++ subsys/net/lib/lwm2m/ipso_push_button.c | 6 +++ subsys/net/lib/lwm2m/ipso_temp_sensor.c | 6 +++ subsys/net/lib/lwm2m/ipso_timer.c | 6 +++ subsys/net/lib/lwm2m/lwm2m_engine.c | 29 +++++++++++--- subsys/net/lib/lwm2m/lwm2m_engine.h | 9 ++++- subsys/net/lib/lwm2m/lwm2m_obj_connmon.c | 6 +++ subsys/net/lib/lwm2m/lwm2m_obj_device.c | 6 +++ subsys/net/lib/lwm2m/lwm2m_obj_firmware.c | 6 +++ subsys/net/lib/lwm2m/lwm2m_obj_location.c | 6 +++ subsys/net/lib/lwm2m/lwm2m_obj_security.c | 6 +++ subsys/net/lib/lwm2m/lwm2m_obj_server.c | 6 +++ subsys/net/lib/lwm2m/lwm2m_object.h | 7 ++++ subsys/net/lib/lwm2m/lwm2m_rd_client.c | 2 +- subsys/net/lib/lwm2m/lwm2m_rw_link_format.c | 43 +++++++++++++++++---- 21 files changed, 171 insertions(+), 15 deletions(-) diff --git a/subsys/net/lib/lwm2m/ipso_accelerometer.c b/subsys/net/lib/lwm2m/ipso_accelerometer.c index 33f87151e36..4558004d71b 100644 --- a/subsys/net/lib/lwm2m/ipso_accelerometer.c +++ b/subsys/net/lib/lwm2m/ipso_accelerometer.c @@ -21,6 +21,9 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME); #include "lwm2m_object.h" #include "lwm2m_engine.h" +#define ACCEL_VERSION_MAJOR 1 +#define ACCEL_VERSION_MINOR 0 + #ifdef CONFIG_LWM2M_IPSO_ACCELEROMETER_TIMESTAMP #define ADD_TIMESTAMPS 1 #else @@ -145,6 +148,9 @@ static struct lwm2m_engine_obj_inst *accel_create(uint16_t obj_inst_id) static int ipso_accel_init(const struct device *dev) { accel.obj_id = IPSO_OBJECT_ACCELEROMETER_ID; + accel.version_major = ACCEL_VERSION_MAJOR; + accel.version_minor = ACCEL_VERSION_MINOR; + accel.is_core = false; accel.fields = fields; accel.field_count = ARRAY_SIZE(fields); accel.max_instance_count = ARRAY_SIZE(inst); diff --git a/subsys/net/lib/lwm2m/ipso_buzzer.c b/subsys/net/lib/lwm2m/ipso_buzzer.c index 8f9e74b1fdb..d99aa3afb26 100644 --- a/subsys/net/lib/lwm2m/ipso_buzzer.c +++ b/subsys/net/lib/lwm2m/ipso_buzzer.c @@ -21,6 +21,9 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME); #include "lwm2m_object.h" #include "lwm2m_engine.h" +#define BUZZER_VERSION_MAJOR 1 +#define BUZZER_VERSION_MINOR 0 + /* resource IDs */ #define BUZZER_ON_OFF_ID 5850 #define BUZZER_LEVEL_ID 5548 @@ -246,6 +249,9 @@ static struct lwm2m_engine_obj_inst *buzzer_create(uint16_t obj_inst_id) static int ipso_buzzer_init(const struct device *dev) { buzzer.obj_id = IPSO_OBJECT_BUZZER_ID; + buzzer.version_major = BUZZER_VERSION_MAJOR; + buzzer.version_minor = BUZZER_VERSION_MINOR; + buzzer.is_core = false; buzzer.fields = fields; buzzer.field_count = ARRAY_SIZE(fields); buzzer.max_instance_count = ARRAY_SIZE(inst); diff --git a/subsys/net/lib/lwm2m/ipso_generic_sensor.c b/subsys/net/lib/lwm2m/ipso_generic_sensor.c index 359d4bc40b9..efd8c5243de 100644 --- a/subsys/net/lib/lwm2m/ipso_generic_sensor.c +++ b/subsys/net/lib/lwm2m/ipso_generic_sensor.c @@ -24,6 +24,9 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME); #include "lwm2m_engine.h" #include "lwm2m_resource_ids.h" +#define GENERIC_VERSION_MAJOR 1 +#define GENERIC_VERSION_MINOR 0 + #ifdef CONFIG_LWM2M_IPSO_GENERIC_SENSOR_TIMESTAMP #define ADD_TIMESTAMPS 1 #define NUMBER_OF_OBJ_FIELDS 10 @@ -241,6 +244,9 @@ static struct lwm2m_engine_obj_inst *generic_sensor_create(uint16_t obj_inst_id) static int ipso_generic_sensor_init(const struct device *dev) { sensor.obj_id = IPSO_OBJECT_ID; + sensor.version_major = GENERIC_VERSION_MAJOR; + sensor.version_minor = GENERIC_VERSION_MINOR; + sensor.is_core = false; sensor.fields = fields; sensor.field_count = ARRAY_SIZE(fields); sensor.max_instance_count = MAX_INSTANCE_COUNT; diff --git a/subsys/net/lib/lwm2m/ipso_humidity_sensor.c b/subsys/net/lib/lwm2m/ipso_humidity_sensor.c index 1bec5c1d274..843e149544a 100644 --- a/subsys/net/lib/lwm2m/ipso_humidity_sensor.c +++ b/subsys/net/lib/lwm2m/ipso_humidity_sensor.c @@ -19,6 +19,9 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME); #include "lwm2m_engine.h" #include "lwm2m_resource_ids.h" +#define HUMIDITY_VERSION_MAJOR 1 +#define HUMIDITY_VERSION_MINOR 0 + #ifdef CONFIG_LWM2M_IPSO_HUMIDITY_SENSOR_TIMESTAMP #define ADD_TIMESTAMPS 1 #define NUMBER_OF_OBJ_FIELDS 8 @@ -219,6 +222,9 @@ humidity_sensor_create(uint16_t obj_inst_id) static int ipso_humidity_sensor_init(const struct device *dev) { sensor.obj_id = IPSO_OBJECT_ID; + sensor.version_major = HUMIDITY_VERSION_MAJOR; + sensor.version_minor = HUMIDITY_VERSION_MINOR; + sensor.is_core = false; sensor.fields = fields; sensor.field_count = ARRAY_SIZE(fields); sensor.max_instance_count = MAX_INSTANCE_COUNT; diff --git a/subsys/net/lib/lwm2m/ipso_light_control.c b/subsys/net/lib/lwm2m/ipso_light_control.c index 79ce2bdf308..64c2698add9 100644 --- a/subsys/net/lib/lwm2m/ipso_light_control.c +++ b/subsys/net/lib/lwm2m/ipso_light_control.c @@ -23,6 +23,9 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME); #include "lwm2m_object.h" #include "lwm2m_engine.h" +#define LIGHT_VERSION_MAJOR 1 +#define LIGHT_VERSION_MINOR 0 + /* Server resource IDs */ #define LIGHT_ON_OFF_ID 5850 #define LIGHT_DIMMER_ID 5851 @@ -202,6 +205,9 @@ static struct lwm2m_engine_obj_inst *light_control_create(uint16_t obj_inst_id) static int ipso_light_control_init(const struct device *dev) { light_control.obj_id = IPSO_OBJECT_LIGHT_CONTROL_ID; + light_control.version_major = LIGHT_VERSION_MAJOR; + light_control.version_minor = LIGHT_VERSION_MINOR; + light_control.is_core = false; light_control.fields = fields; light_control.field_count = ARRAY_SIZE(fields); light_control.max_instance_count = MAX_INSTANCE_COUNT; diff --git a/subsys/net/lib/lwm2m/ipso_onoff_switch.c b/subsys/net/lib/lwm2m/ipso_onoff_switch.c index 4889f0fe8c9..5bad062f1e3 100644 --- a/subsys/net/lib/lwm2m/ipso_onoff_switch.c +++ b/subsys/net/lib/lwm2m/ipso_onoff_switch.c @@ -21,6 +21,9 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME); #include "lwm2m_object.h" #include "lwm2m_engine.h" +#define SWITCH_VERSION_MAJOR 1 +#define SWITCH_VERSION_MINOR 0 + #ifdef CONFIG_LWM2M_IPSO_ONOFF_SWITCH_TIMESTAMP #define ADD_TIMESTAMPS 1 #else @@ -243,6 +246,9 @@ static struct lwm2m_engine_obj_inst *switch_create(uint16_t obj_inst_id) static int ipso_switch_init(const struct device *dev) { onoff_switch.obj_id = IPSO_OBJECT_ONOFF_SWITCH_ID; + onoff_switch.version_major = SWITCH_VERSION_MAJOR; + onoff_switch.version_minor = SWITCH_VERSION_MINOR; + onoff_switch.is_core = false; onoff_switch.fields = fields; onoff_switch.field_count = ARRAY_SIZE(fields); onoff_switch.max_instance_count = ARRAY_SIZE(inst); diff --git a/subsys/net/lib/lwm2m/ipso_pressure_sensor.c b/subsys/net/lib/lwm2m/ipso_pressure_sensor.c index 1c5ca10e990..f9a4c89a8e7 100644 --- a/subsys/net/lib/lwm2m/ipso_pressure_sensor.c +++ b/subsys/net/lib/lwm2m/ipso_pressure_sensor.c @@ -19,6 +19,9 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME); #include "lwm2m_engine.h" #include "lwm2m_resource_ids.h" +#define PRESSURE_VERSION_MAJOR 1 +#define PRESSURE_VERSION_MINOR 0 + #ifdef CONFIG_LWM2M_IPSO_PRESSURE_SENSOR_TIMESTAMP #define ADD_TIMESTAMPS 1 #define NUMBER_OF_OBJ_FIELDS 8 @@ -219,6 +222,9 @@ pressure_sensor_create(uint16_t obj_inst_id) static int ipso_pressure_sensor_init(const struct device *dev) { sensor.obj_id = IPSO_OBJECT_ID; + sensor.version_major = PRESSURE_VERSION_MAJOR; + sensor.version_minor = PRESSURE_VERSION_MINOR; + sensor.is_core = false; sensor.fields = fields; sensor.field_count = ARRAY_SIZE(fields); sensor.max_instance_count = MAX_INSTANCE_COUNT; diff --git a/subsys/net/lib/lwm2m/ipso_push_button.c b/subsys/net/lib/lwm2m/ipso_push_button.c index 52a2dcd8942..83eeb103d02 100644 --- a/subsys/net/lib/lwm2m/ipso_push_button.c +++ b/subsys/net/lib/lwm2m/ipso_push_button.c @@ -21,6 +21,9 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME); #include "lwm2m_object.h" #include "lwm2m_engine.h" +#define BUTTON_VERSION_MAJOR 1 +#define BUTTON_VERSION_MINOR 0 + #ifdef CONFIG_LWM2M_IPSO_PUSH_BUTTON_TIMESTAMP #define ADD_TIMESTAMPS 1 #else @@ -169,6 +172,9 @@ static struct lwm2m_engine_obj_inst *button_create(uint16_t obj_inst_id) static int ipso_button_init(const struct device *dev) { onoff_switch.obj_id = IPSO_OBJECT_PUSH_BUTTON_ID; + onoff_switch.version_major = BUTTON_VERSION_MAJOR; + onoff_switch.version_minor = BUTTON_VERSION_MINOR; + onoff_switch.is_core = false; onoff_switch.fields = fields; onoff_switch.field_count = ARRAY_SIZE(fields); onoff_switch.max_instance_count = ARRAY_SIZE(inst); diff --git a/subsys/net/lib/lwm2m/ipso_temp_sensor.c b/subsys/net/lib/lwm2m/ipso_temp_sensor.c index 3d5ee5be843..3fd391e3d43 100644 --- a/subsys/net/lib/lwm2m/ipso_temp_sensor.c +++ b/subsys/net/lib/lwm2m/ipso_temp_sensor.c @@ -23,6 +23,9 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME); #include "lwm2m_object.h" #include "lwm2m_engine.h" +#define TEMP_VERSION_MAJOR 1 +#define TEMP_VERSION_MINOR 0 + #ifdef CONFIG_LWM2M_IPSO_TEMP_SENSOR_TIMESTAMP #define ADD_TIMESTAMPS 1 #else @@ -236,6 +239,9 @@ static struct lwm2m_engine_obj_inst *temp_sensor_create(uint16_t obj_inst_id) static int ipso_temp_sensor_init(const struct device *dev) { temp_sensor.obj_id = IPSO_OBJECT_TEMP_SENSOR_ID; + temp_sensor.version_major = TEMP_VERSION_MAJOR; + temp_sensor.version_minor = TEMP_VERSION_MINOR; + temp_sensor.is_core = false; temp_sensor.fields = fields; temp_sensor.field_count = ARRAY_SIZE(fields); temp_sensor.max_instance_count = MAX_INSTANCE_COUNT; diff --git a/subsys/net/lib/lwm2m/ipso_timer.c b/subsys/net/lib/lwm2m/ipso_timer.c index 407369c9b2b..f66b6229fa9 100644 --- a/subsys/net/lib/lwm2m/ipso_timer.c +++ b/subsys/net/lib/lwm2m/ipso_timer.c @@ -21,6 +21,9 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME); #include "lwm2m_object.h" #include "lwm2m_engine.h" +#define TIMER_VERSION_MAJOR 1 +#define TIMER_VERSION_MINOR 0 + /* Server resource IDs */ #define TIMER_DELAY_DURATION_ID 5521 #define TIMER_REMAINING_TIME_ID 5538 @@ -386,6 +389,9 @@ static struct lwm2m_engine_obj_inst *timer_create(uint16_t obj_inst_id) static int ipso_timer_init(const struct device *dev) { timer.obj_id = IPSO_OBJECT_TIMER_ID; + timer.version_major = TIMER_VERSION_MAJOR; + timer.version_minor = TIMER_VERSION_MINOR; + timer.is_core = false; timer.fields = fields; timer.field_count = ARRAY_SIZE(fields); timer.max_instance_count = MAX_INSTANCE_COUNT; diff --git a/subsys/net/lib/lwm2m/lwm2m_engine.c b/subsys/net/lib/lwm2m/lwm2m_engine.c index a75088f33d2..4e8a8aa8ed1 100644 --- a/subsys/net/lib/lwm2m/lwm2m_engine.c +++ b/subsys/net/lib/lwm2m/lwm2m_engine.c @@ -1094,8 +1094,11 @@ int lwm2m_register_payload_handler(struct lwm2m_message *msg) continue; } - /* Only report when no instance available */ - if (obj->instance_count == 0U) { + /* Only report when no instance available or it's + * needed to report object version. + */ + if (obj->instance_count == 0U || + lwm2m_engine_shall_report_obj_version(obj)) { struct lwm2m_obj_path path = { .obj_id = obj->obj_id, .level = LWM2M_PATH_LEVEL_OBJECT, @@ -1106,7 +1109,9 @@ int lwm2m_register_payload_handler(struct lwm2m_message *msg) return ret; } - continue; + if (obj->instance_count == 0U) { + continue; + } } SYS_SLIST_FOR_EACH_CONTAINER(&engine_obj_inst_list, @@ -3263,11 +3268,13 @@ int lwm2m_discover_handler(struct lwm2m_message *msg, bool is_bootstrap) } /* For bootstrap discover, only report object ID when no - * instance is available. + * instance is available or it's needed to report object + * version. * For device management discovery, only report object ID with * attributes if object ID (alone) was provided. */ - if ((is_bootstrap && obj->instance_count == 0U) || + if ((is_bootstrap && (obj->instance_count == 0U || + lwm2m_engine_shall_report_obj_version(obj))) || (!is_bootstrap && msg->path.level == LWM2M_PATH_LEVEL_OBJECT)) { struct lwm2m_obj_path path = { .obj_id = obj->obj_id, @@ -3281,7 +3288,7 @@ int lwm2m_discover_handler(struct lwm2m_message *msg, bool is_bootstrap) reported = true; - if (is_bootstrap) { + if (obj->instance_count == 0U) { continue; } } @@ -3434,6 +3441,16 @@ struct lwm2m_engine_res *lwm2m_engine_get_res( return res; } +bool lwm2m_engine_shall_report_obj_version(const struct lwm2m_engine_obj *obj) +{ + if (obj->is_core) { + return obj->version_major != LWM2M_PROTOCOL_VERSION_MAJOR || + obj->version_minor != LWM2M_PROTOCOL_VERSION_MINOR; + } + + return obj->version_major != 1 || obj->version_minor != 0; +} + static int do_write_op(struct lwm2m_message *msg, uint16_t format) { diff --git a/subsys/net/lib/lwm2m/lwm2m_engine.h b/subsys/net/lib/lwm2m/lwm2m_engine.h index 46ab089f813..81e31c4b082 100644 --- a/subsys/net/lib/lwm2m/lwm2m_engine.h +++ b/subsys/net/lib/lwm2m/lwm2m_engine.h @@ -10,7 +10,12 @@ #include "lwm2m_object.h" -#define LWM2M_PROTOCOL_VERSION "1.0" +#define LWM2M_PROTOCOL_VERSION_MAJOR 1 +#define LWM2M_PROTOCOL_VERSION_MINOR 0 + +#define LWM2M_PROTOCOL_VERSION_STRING STRINGIFY(LWM2M_PROTOCOL_VERSION_MAJOR) \ + "." \ + STRINGIFY(LWM2M_PROTOCOL_VERSION_MINOR) /* LWM2M / CoAP Content-Formats */ #define LWM2M_FORMAT_PLAIN_TEXT 0 @@ -72,6 +77,8 @@ struct lwm2m_engine_obj_inst *lwm2m_engine_get_obj_inst( struct lwm2m_engine_res *lwm2m_engine_get_res( const struct lwm2m_obj_path *path); +bool lwm2m_engine_shall_report_obj_version(const struct lwm2m_engine_obj *obj); + /* LwM2M context functions */ int lwm2m_engine_context_close(struct lwm2m_ctx *client_ctx); void lwm2m_engine_context_init(struct lwm2m_ctx *client_ctx); diff --git a/subsys/net/lib/lwm2m/lwm2m_obj_connmon.c b/subsys/net/lib/lwm2m/lwm2m_obj_connmon.c index f24ef823732..a0be3b04617 100644 --- a/subsys/net/lib/lwm2m/lwm2m_obj_connmon.c +++ b/subsys/net/lib/lwm2m/lwm2m_obj_connmon.c @@ -18,6 +18,9 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME); #include "lwm2m_object.h" #include "lwm2m_engine.h" +#define CONNMON_VERSION_MAJOR 1 +#define CONNMON_VERSION_MINOR 0 + /* Connectivity Monitoring resource IDs */ #define CONNMON_NETWORK_BEARER_ID 0 #define CONNMON_AVAIL_NETWORK_BEARER_ID 1 @@ -148,6 +151,9 @@ static int lwm2m_connmon_init(const struct device *dev) /* initialize the Connection Monitoring field data */ connmon.obj_id = LWM2M_OBJECT_CONNECTIVITY_MONITORING_ID; + connmon.version_major = CONNMON_VERSION_MAJOR; + connmon.version_minor = CONNMON_VERSION_MINOR; + connmon.is_core = true; connmon.fields = fields; connmon.field_count = ARRAY_SIZE(fields); connmon.max_instance_count = 1U; diff --git a/subsys/net/lib/lwm2m/lwm2m_obj_device.c b/subsys/net/lib/lwm2m/lwm2m_obj_device.c index f3b45aabf07..1dc3e56e13f 100644 --- a/subsys/net/lib/lwm2m/lwm2m_obj_device.c +++ b/subsys/net/lib/lwm2m/lwm2m_obj_device.c @@ -23,6 +23,9 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME); #include "lwm2m_object.h" #include "lwm2m_engine.h" +#define DEVICE_VERSION_MAJOR 1 +#define DEVICE_VERSION_MINOR 0 + /* Device resource IDs */ #define DEVICE_MANUFACTURER_ID 0 #define DEVICE_MODEL_NUMBER_ID 1 @@ -260,6 +263,9 @@ static int lwm2m_device_init(const struct device *dev) /* initialize the device field data */ device.obj_id = LWM2M_OBJECT_DEVICE_ID; + device.version_major = DEVICE_VERSION_MAJOR; + device.version_minor = DEVICE_VERSION_MINOR; + device.is_core = true; device.fields = fields; device.field_count = ARRAY_SIZE(fields); device.max_instance_count = 1U; diff --git a/subsys/net/lib/lwm2m/lwm2m_obj_firmware.c b/subsys/net/lib/lwm2m/lwm2m_obj_firmware.c index aec3f92e48f..b0fb1463cf6 100644 --- a/subsys/net/lib/lwm2m/lwm2m_obj_firmware.c +++ b/subsys/net/lib/lwm2m/lwm2m_obj_firmware.c @@ -17,6 +17,9 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME); #include "lwm2m_object.h" #include "lwm2m_engine.h" +#define FIRMWARE_VERSION_MAJOR 1 +#define FIRMWARE_VERSION_MINOR 0 + /* Firmware resource IDs */ #define FIRMWARE_PACKAGE_ID 0 #define FIRMWARE_PACKAGE_URI_ID 1 @@ -357,6 +360,9 @@ static int lwm2m_firmware_init(const struct device *dev) #endif firmware.obj_id = LWM2M_OBJECT_FIRMWARE_ID; + firmware.version_major = FIRMWARE_VERSION_MAJOR; + firmware.version_minor = FIRMWARE_VERSION_MINOR; + firmware.is_core = true; firmware.fields = fields; firmware.field_count = ARRAY_SIZE(fields); firmware.max_instance_count = 1U; diff --git a/subsys/net/lib/lwm2m/lwm2m_obj_location.c b/subsys/net/lib/lwm2m/lwm2m_obj_location.c index 12982fee97d..848a94b5cc3 100644 --- a/subsys/net/lib/lwm2m/lwm2m_obj_location.c +++ b/subsys/net/lib/lwm2m/lwm2m_obj_location.c @@ -16,6 +16,9 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME); #include "lwm2m_object.h" #include "lwm2m_engine.h" +#define LOCATION_VERSION_MAJOR 1 +#define LOCATION_VERSION_MINOR 0 + /* resource IDs */ #define LOCATION_LATITUDE_ID 0 #define LOCATION_LONGITUDE_ID 1 @@ -96,6 +99,9 @@ static int ipso_location_init(const struct device *dev) struct lwm2m_engine_obj_inst *obj_inst = NULL; location.obj_id = LWM2M_OBJECT_LOCATION_ID; + location.version_major = LOCATION_VERSION_MAJOR; + location.version_minor = LOCATION_VERSION_MINOR; + location.is_core = true; location.fields = fields; location.field_count = ARRAY_SIZE(fields); location.max_instance_count = 1U; diff --git a/subsys/net/lib/lwm2m/lwm2m_obj_security.c b/subsys/net/lib/lwm2m/lwm2m_obj_security.c index b3b69c5fa8b..5a54acdeefc 100644 --- a/subsys/net/lib/lwm2m/lwm2m_obj_security.c +++ b/subsys/net/lib/lwm2m/lwm2m_obj_security.c @@ -17,6 +17,9 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME); #include "lwm2m_object.h" #include "lwm2m_engine.h" +#define SECURITY_VERSION_MAJOR 1 +#define SECURITY_VERSION_MINOR 0 + /* Security resource IDs */ #define SECURITY_SERVER_URI_ID 0 #define SECURITY_BOOTSTRAP_FLAG_ID 1 @@ -176,6 +179,9 @@ static int lwm2m_security_init(const struct device *dev) int ret = 0; security.obj_id = LWM2M_OBJECT_SECURITY_ID; + security.version_major = SECURITY_VERSION_MAJOR; + security.version_minor = SECURITY_VERSION_MINOR; + security.is_core = true; security.fields = fields; security.field_count = ARRAY_SIZE(fields); security.max_instance_count = MAX_INSTANCE_COUNT; diff --git a/subsys/net/lib/lwm2m/lwm2m_obj_server.c b/subsys/net/lib/lwm2m/lwm2m_obj_server.c index 8dc891ab687..e50acf23cf6 100644 --- a/subsys/net/lib/lwm2m/lwm2m_obj_server.c +++ b/subsys/net/lib/lwm2m/lwm2m_obj_server.c @@ -20,6 +20,9 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME); #include "lwm2m_rd_client.h" #endif +#define SERVER_VERSION_MAJOR 1 +#define SERVER_VERSION_MINOR 0 + /* Server resource IDs */ #define SERVER_SHORT_SERVER_ID 0 #define SERVER_LIFETIME_ID 1 @@ -250,6 +253,9 @@ static int lwm2m_server_init(const struct device *dev) int ret = 0; server.obj_id = LWM2M_OBJECT_SERVER_ID; + server.version_major = SERVER_VERSION_MAJOR; + server.version_minor = SERVER_VERSION_MINOR; + server.is_core = true; server.fields = fields; server.field_count = ARRAY_SIZE(fields); server.max_instance_count = MAX_INSTANCE_COUNT; diff --git a/subsys/net/lib/lwm2m/lwm2m_object.h b/subsys/net/lib/lwm2m/lwm2m_object.h index d4a9a93a5f0..b8c2004b578 100644 --- a/subsys/net/lib/lwm2m/lwm2m_object.h +++ b/subsys/net/lib/lwm2m/lwm2m_object.h @@ -198,6 +198,13 @@ struct lwm2m_engine_obj { uint16_t field_count; uint16_t instance_count; uint16_t max_instance_count; + + /* Object version information. */ + uint8_t version_major; + uint8_t version_minor; + + /* Object is a core object (defined in the official LwM2M spec.) */ + bool is_core : 1; }; /* Resource instances with this value are considered "not created" yet */ diff --git a/subsys/net/lib/lwm2m/lwm2m_rd_client.c b/subsys/net/lib/lwm2m/lwm2m_rd_client.c index 2f11a5626c9..abdf6960859 100644 --- a/subsys/net/lib/lwm2m/lwm2m_rd_client.c +++ b/subsys/net/lib/lwm2m/lwm2m_rd_client.c @@ -714,7 +714,7 @@ static int sm_send_registration(bool send_obj_support_data, if (!sm_is_registered()) { snprintk(query_buffer, sizeof(query_buffer) - 1, - "lwm2m=%s", LWM2M_PROTOCOL_VERSION); + "lwm2m=%s", LWM2M_PROTOCOL_VERSION_STRING); ret = coap_packet_append_option( &msg->cpkt, COAP_OPTION_URI_QUERY, query_buffer, strlen(query_buffer)); diff --git a/subsys/net/lib/lwm2m/lwm2m_rw_link_format.c b/subsys/net/lib/lwm2m/lwm2m_rw_link_format.c index d0b67c527a7..f90b11076f0 100644 --- a/subsys/net/lib/lwm2m/lwm2m_rw_link_format.c +++ b/subsys/net/lib/lwm2m/lwm2m_rw_link_format.c @@ -14,7 +14,7 @@ LOG_MODULE_REGISTER(net_lwm2m_link_format, CONFIG_LWM2M_LOG_LEVEL); #define CORELINK_BUF_SIZE 24 -#define ENABLER_VERSION "lwm2m=\"" LWM2M_PROTOCOL_VERSION "\"" +#define ENABLER_VERSION "lwm2m=\"" LWM2M_PROTOCOL_VERSION_STRING "\"" /* * TODO: to implement a way for clients to specify alternate path @@ -105,6 +105,26 @@ static int put_corelink_separator(struct lwm2m_output_context *out) return (int)sizeof(comma); } +static int put_corelink_version(struct lwm2m_output_context *out, + const struct lwm2m_engine_obj *obj, + uint8_t *buf, uint16_t buflen) +{ + int ret, len; + + len = snprintk(buf, buflen, ";ver=%u.%u", obj->version_major, + obj->version_minor); + if (len < 0 || len >= buflen) { + return -ENOMEM; + } + + ret = buf_append(CPKT_BUF_WRITE(out->out_cpkt), buf, len); + if (ret < 0) { + return ret; + } + + return len; +} + static int put_corelink_dimension(struct lwm2m_output_context *out, const struct lwm2m_engine_res *res, uint8_t *buf, uint16_t buflen) @@ -264,6 +284,7 @@ static int put_obj_corelink(struct lwm2m_output_context *out, struct link_format_out_formatter_data *fd) { char obj_buf[CORELINK_BUF_SIZE]; + struct lwm2m_engine_obj *obj; int len = 0; int ret; @@ -279,16 +300,24 @@ static int put_obj_corelink(struct lwm2m_output_context *out, return ret; } + obj = lwm2m_engine_get_obj(path); + if (obj == NULL) { + return -EINVAL; + } + + if (lwm2m_engine_shall_report_obj_version(obj)) { + ret = put_corelink_version(out, obj, obj_buf, sizeof(obj_buf)); + if (ret < 0) { + return ret; + } + + len += ret; + } + if (fd->mode == LINK_FORMAT_MODE_DISCOVERY) { /* Report object attributes only in device management mode * (5.4.2). */ - struct lwm2m_engine_obj *obj = lwm2m_engine_get_obj(path); - - if (obj == NULL) { - return -EINVAL; - } - ret = put_corelink_attributes(out, obj, obj_buf, sizeof(obj_buf)); if (ret < 0) {