net: lwm2m: Fix core objects version reporting

Core objects version reporting was broken for LwM2M version 1.1, as the
default object version not necessarily matches the LwM2M version.
Therefore, implement a table with default object versions for particular
LwM2M version, which can be looked up when determining whether it's
needed to include object version or not during Registration/Discovery.

Signed-off-by: Robert Lubos <robert.lubos@nordicsemi.no>
This commit is contained in:
Robert Lubos 2023-11-06 16:47:05 +01:00 committed by Carles Cufí
parent e5dbb26c72
commit 8aba7740b8
2 changed files with 50 additions and 4 deletions

View File

@ -49,6 +49,7 @@
#define LWM2M_OBJECT_PORTFOLIO_ID 16 /**< Portfolio object */
#define LWM2M_OBJECT_BINARYAPPDATACONTAINER_ID 19 /**< Binary App Data Container object */
#define LWM2M_OBJECT_EVENT_LOG_ID 20 /**< Event Log object */
#define LWM2M_OBJECT_OSCORE_ID 21 /**< OSCORE object */
#define LWM2M_OBJECT_GATEWAY_ID 25 /**< Gateway object */
/* clang-format on */

View File

@ -50,6 +50,41 @@ void lwm2m_registry_unlock(void)
{
(void)k_mutex_unlock(&registry_lock);
}
/* Default core object version */
struct default_obj_version {
uint16_t obj_id;
uint8_t version_major;
uint8_t version_minor;
};
/* Based on Appendix E of the respective LwM2M specification. */
static const struct default_obj_version default_obj_versions[] = {
#if defined(CONFIG_LWM2M_VERSION_1_0)
{ LWM2M_OBJECT_SECURITY_ID, 1, 0 },
{ LWM2M_OBJECT_SERVER_ID, 1, 0 },
{ LWM2M_OBJECT_ACCESS_CONTROL_ID, 1, 0 },
{ LWM2M_OBJECT_DEVICE_ID, 1, 0 },
{ LWM2M_OBJECT_CONNECTIVITY_MONITORING_ID, 1, 0 },
{ LWM2M_OBJECT_FIRMWARE_ID, 1, 0 },
{ LWM2M_OBJECT_LOCATION_ID, 1, 0 },
{ LWM2M_OBJECT_CONNECTIVITY_STATISTICS_ID, 1, 0 },
#elif defined(CONFIG_LWM2M_VERSION_1_1)
{ LWM2M_OBJECT_SECURITY_ID, 1, 1 },
{ LWM2M_OBJECT_SERVER_ID, 1, 1 },
{ LWM2M_OBJECT_ACCESS_CONTROL_ID, 1, 0 },
{ LWM2M_OBJECT_DEVICE_ID, 1, 1 },
{ LWM2M_OBJECT_CONNECTIVITY_MONITORING_ID, 1, 2 },
{ LWM2M_OBJECT_FIRMWARE_ID, 1, 0 },
{ LWM2M_OBJECT_LOCATION_ID, 1, 0 },
{ LWM2M_OBJECT_CONNECTIVITY_STATISTICS_ID, 1, 0 },
/* OSCORE object not implemented yet, but include it for completeness */
{ LWM2M_OBJECT_OSCORE_ID, 1, 0 },
#else
#error "Default core object versions not defined for LwM2M version"
#endif
};
/* Resources */
static sys_slist_t engine_obj_list;
static sys_slist_t engine_obj_inst_list;
@ -1975,12 +2010,22 @@ struct lwm2m_engine_res_inst *lwm2m_engine_get_res_inst(const struct lwm2m_obj_p
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;
/* For non-core objects, report version other than 1.0 */
if (!obj->is_core) {
return obj->version_major != 1 || obj->version_minor != 0;
}
return obj->version_major != 1 || obj->version_minor != 0;
/* For core objects, report version based on default version array. */
for (size_t i = 0; i < ARRAY_SIZE(default_obj_versions); i++) {
if (obj->obj_id != default_obj_versions[i].obj_id) {
continue;
}
return obj->version_major != default_obj_versions[i].version_major ||
obj->version_minor != default_obj_versions[i].version_minor;
}
return true;
}
#if defined(CONFIG_LWM2M_RESOURCE_DATA_CACHE_SUPPORT)