diff --git a/include/zephyr/net/lwm2m.h b/include/zephyr/net/lwm2m.h index 81af75ca95b..305861dda95 100644 --- a/include/zephyr/net/lwm2m.h +++ b/include/zephyr/net/lwm2m.h @@ -1403,6 +1403,8 @@ int lwm2m_get_time(const struct lwm2m_obj_path *path, time_t *buf); /** * @brief Set resource (instance) read callback * + * @deprecated Use lwm2m_register_read_callback() instead. + * * LwM2M clients can use this to set the callback function for resource reads when data * handling in the LwM2M engine needs to be bypassed. * For example reading back opaque binary data from external storage. @@ -1418,12 +1420,35 @@ int lwm2m_get_time(const struct lwm2m_obj_path *path, time_t *buf); * * @return 0 for success or negative in case of error. */ +__deprecated int lwm2m_engine_register_read_callback(const char *pathstr, lwm2m_engine_get_data_cb_t cb); +/** + * @brief Set resource (instance) read callback + * + * LwM2M clients can use this to set the callback function for resource reads when data + * handling in the LwM2M engine needs to be bypassed. + * For example reading back opaque binary data from external storage. + * + * This callback should not generally be used for any data that might be observed as + * engine does not have any knowledge of data changes. + * + * When separate buffer for data should be used, use lwm2m_engine_set_res_buf() instead + * to set the storage. + * + * @param[in] path LwM2M path as a struct + * @param[in] cb Read resource callback + * + * @return 0 for success or negative in case of error. + */ +int lwm2m_register_read_callback(const struct lwm2m_obj_path *path, lwm2m_engine_get_data_cb_t cb); + /** * @brief Set resource (instance) pre-write callback * + * @deprecated Use lwm2m_register_pre_write_callback() instead. + * * This callback is triggered before setting the value of a resource. It * can pass a special data buffer to the engine so that the actual resource * value can be calculated later, etc. @@ -1433,12 +1458,30 @@ int lwm2m_engine_register_read_callback(const char *pathstr, * * @return 0 for success or negative in case of error. */ +__deprecated int lwm2m_engine_register_pre_write_callback(const char *pathstr, lwm2m_engine_get_data_cb_t cb); +/** + * @brief Set resource (instance) pre-write callback + * + * This callback is triggered before setting the value of a resource. It + * can pass a special data buffer to the engine so that the actual resource + * value can be calculated later, etc. + * + * @param[in] path LwM2M path as a struct + * @param[in] cb Pre-write resource callback + * + * @return 0 for success or negative in case of error. + */ +int lwm2m_register_pre_write_callback(const struct lwm2m_obj_path *path, + lwm2m_engine_get_data_cb_t cb); + /** * @brief Set resource (instance) validation callback * + * @deprecated Use lwm2m_register_validate_callback() instead. + * * This callback is triggered before setting the value of a resource to the * resource data buffer. * @@ -1456,12 +1499,38 @@ int lwm2m_engine_register_pre_write_callback(const char *pathstr, * * @return 0 for success or negative in case of error. */ +__deprecated int lwm2m_engine_register_validate_callback(const char *pathstr, lwm2m_engine_set_data_cb_t cb); +/** + * @brief Set resource (instance) validation callback + * + * This callback is triggered before setting the value of a resource to the + * resource data buffer. + * + * The callback allows an LwM2M client or object to validate the data before + * writing and notify an error if the data should be discarded for any reason + * (by returning a negative error code). + * + * @note All resources that have a validation callback registered are initially + * decoded into a temporary validation buffer. Make sure that + * ``CONFIG_LWM2M_ENGINE_VALIDATION_BUFFER_SIZE`` is large enough to + * store each of the validated resources (individually). + * + * @param[in] path LwM2M path as a struct + * @param[in] cb Validate resource data callback + * + * @return 0 for success or negative in case of error. + */ +int lwm2m_register_validate_callback(const struct lwm2m_obj_path *path, + lwm2m_engine_set_data_cb_t cb); + /** * @brief Set resource (instance) post-write callback * + * @deprecated Use lwm2m_register_post_write_callback() instead. + * * This callback is triggered after setting the value of a resource to the * resource data buffer. * @@ -1473,12 +1542,32 @@ int lwm2m_engine_register_validate_callback(const char *pathstr, * * @return 0 for success or negative in case of error. */ +__deprecated int lwm2m_engine_register_post_write_callback(const char *pathstr, lwm2m_engine_set_data_cb_t cb); +/** + * @brief Set resource (instance) post-write callback + * + * This callback is triggered after setting the value of a resource to the + * resource data buffer. + * + * It allows an LwM2M client or object to post-process the value of a resource + * or trigger other related resource calculations. + * + * @param[in] path LwM2M path as a struct + * @param[in] cb Post-write resource callback + * + * @return 0 for success or negative in case of error. + */ +int lwm2m_register_post_write_callback(const struct lwm2m_obj_path *path, + lwm2m_engine_set_data_cb_t cb); + /** * @brief Set resource execute event callback * + * @deprecated Use lwm2m_register_exec_callback() instead. + * * This event is triggered when the execute method of a resource is enabled. * * @param[in] pathstr LwM2M path string "obj/obj-inst/res" @@ -1486,9 +1575,38 @@ int lwm2m_engine_register_post_write_callback(const char *pathstr, * * @return 0 for success or negative in case of error. */ +__deprecated int lwm2m_engine_register_exec_callback(const char *pathstr, lwm2m_engine_execute_cb_t cb); +/** + * @brief Set resource execute event callback + * + * This event is triggered when the execute method of a resource is enabled. + * + * @param[in] path LwM2M path as a struct + * @param[in] cb Execute resource callback + * + * @return 0 for success or negative in case of error. + */ +int lwm2m_register_exec_callback(const struct lwm2m_obj_path *path, lwm2m_engine_execute_cb_t cb); + +/** + * @brief Set object instance create event callback + * + * @deprecated Use lwm2m_register_create_callback instead. + * + * This event is triggered when an object instance is created. + * + * @param[in] obj_id LwM2M object id + * @param[in] cb Create object instance callback + * + * @return 0 for success or negative in case of error. + */ +__deprecated +int lwm2m_engine_register_create_callback(uint16_t obj_id, + lwm2m_engine_user_cb_t cb); + /** * @brief Set object instance create event callback * @@ -1499,7 +1617,23 @@ int lwm2m_engine_register_exec_callback(const char *pathstr, * * @return 0 for success or negative in case of error. */ -int lwm2m_engine_register_create_callback(uint16_t obj_id, +int lwm2m_register_create_callback(uint16_t obj_id, + lwm2m_engine_user_cb_t cb); + +/** + * @brief Set object instance delete event callback + * + * @deprecated Use lwm2m_register_delete_callback instead + * + * This event is triggered when an object instance is deleted. + * + * @param[in] obj_id LwM2M object id + * @param[in] cb Delete object instance callback + * + * @return 0 for success or negative in case of error. + */ +__deprecated +int lwm2m_engine_register_delete_callback(uint16_t obj_id, lwm2m_engine_user_cb_t cb); /** @@ -1512,7 +1646,7 @@ int lwm2m_engine_register_create_callback(uint16_t obj_id, * * @return 0 for success or negative in case of error. */ -int lwm2m_engine_register_delete_callback(uint16_t obj_id, +int lwm2m_register_delete_callback(uint16_t obj_id, lwm2m_engine_user_cb_t cb); /** diff --git a/subsys/net/lib/lwm2m/lwm2m_registry.c b/subsys/net/lib/lwm2m/lwm2m_registry.c index 2ef0e12c741..6e33d49bdc8 100644 --- a/subsys/net/lib/lwm2m/lwm2m_registry.c +++ b/subsys/net/lib/lwm2m/lwm2m_registry.c @@ -1411,6 +1411,16 @@ int lwm2m_engine_get_time(const char *pathstr, time_t *buf) return lwm2m_get_time(&path, buf); } +int lwm2m_get_resource(const struct lwm2m_obj_path *path, struct lwm2m_engine_res **res) +{ + if (path->level < LWM2M_PATH_LEVEL_RESOURCE) { + LOG_ERR("path must have 3 parts"); + return -EINVAL; + } + + return path_to_objs(path, NULL, NULL, res, NULL); +} + int lwm2m_engine_get_resource(const char *pathstr, struct lwm2m_engine_res **res) { int ret; @@ -1421,12 +1431,7 @@ int lwm2m_engine_get_resource(const char *pathstr, struct lwm2m_engine_res **res return ret; } - if (path.level < LWM2M_PATH_LEVEL_RESOURCE) { - LOG_ERR("path must have 3 parts"); - return -EINVAL; - } - - return path_to_objs(&path, NULL, NULL, res, NULL); + return lwm2m_get_resource(&path, res); } size_t lwm2m_engine_get_opaque_more(struct lwm2m_input_context *in, uint8_t *buf, size_t buflen, @@ -1628,12 +1633,12 @@ int lwm2m_engine_delete_res_inst(const char *pathstr) } /* Register callbacks */ -int lwm2m_engine_register_read_callback(const char *pathstr, lwm2m_engine_get_data_cb_t cb) +int lwm2m_register_read_callback(const struct lwm2m_obj_path *path, lwm2m_engine_get_data_cb_t cb) { int ret; struct lwm2m_engine_res *res = NULL; - ret = lwm2m_engine_get_resource(pathstr, &res); + ret = lwm2m_get_resource(path, &res); if (ret < 0) { return ret; } @@ -1642,12 +1647,26 @@ int lwm2m_engine_register_read_callback(const char *pathstr, lwm2m_engine_get_da return 0; } -int lwm2m_engine_register_pre_write_callback(const char *pathstr, lwm2m_engine_get_data_cb_t cb) +int lwm2m_engine_register_read_callback(const char *pathstr, lwm2m_engine_get_data_cb_t cb) +{ + int ret; + struct lwm2m_obj_path path; + + ret = lwm2m_string_to_path(pathstr, &path, '/'); + if (ret < 0) { + return ret; + } + + return lwm2m_register_read_callback(&path, cb); +} + +int lwm2m_register_pre_write_callback(const struct lwm2m_obj_path *path, + lwm2m_engine_get_data_cb_t cb) { int ret; struct lwm2m_engine_res *res = NULL; - ret = lwm2m_engine_get_resource(pathstr, &res); + ret = lwm2m_get_resource(path, &res); if (ret < 0) { return ret; } @@ -1656,19 +1675,56 @@ int lwm2m_engine_register_pre_write_callback(const char *pathstr, lwm2m_engine_g return 0; } -int lwm2m_engine_register_validate_callback(const char *pathstr, lwm2m_engine_set_data_cb_t cb) +int lwm2m_engine_register_pre_write_callback(const char *pathstr, lwm2m_engine_get_data_cb_t cb) +{ + int ret; + struct lwm2m_obj_path path; + + ret = lwm2m_string_to_path(pathstr, &path, '/'); + if (ret < 0) { + return ret; + } + + return lwm2m_register_pre_write_callback(&path, cb); +} + +int lwm2m_register_validate_callback(const struct lwm2m_obj_path *path, + lwm2m_engine_set_data_cb_t cb) { #if CONFIG_LWM2M_ENGINE_VALIDATION_BUFFER_SIZE > 0 int ret; struct lwm2m_engine_res *res = NULL; - ret = lwm2m_engine_get_resource(pathstr, &res); + ret = lwm2m_get_resource(path, &res); if (ret < 0) { return ret; } res->validate_cb = cb; return 0; +#else + ARG_UNUSED(path); + ARG_UNUSED(cb); + + LOG_ERR("Validation disabled. Set " + "CONFIG_LWM2M_ENGINE_VALIDATION_BUFFER_SIZE > 0 to " + "enable validation support."); + return -ENOTSUP; +#endif /* CONFIG_LWM2M_ENGINE_VALIDATION_BUFFER_SIZE > 0 */ +} + +int lwm2m_engine_register_validate_callback(const char *pathstr, lwm2m_engine_set_data_cb_t cb) +{ +#if CONFIG_LWM2M_ENGINE_VALIDATION_BUFFER_SIZE > 0 + int ret; + struct lwm2m_obj_path path; + + ret = lwm2m_string_to_path(pathstr, &path, '/'); + if (ret < 0) { + return ret; + } + + return lwm2m_register_validate_callback(&path, cb); #else ARG_UNUSED(pathstr); ARG_UNUSED(cb); @@ -1680,12 +1736,13 @@ int lwm2m_engine_register_validate_callback(const char *pathstr, lwm2m_engine_se #endif /* CONFIG_LWM2M_ENGINE_VALIDATION_BUFFER_SIZE > 0 */ } -int lwm2m_engine_register_post_write_callback(const char *pathstr, lwm2m_engine_set_data_cb_t cb) +int lwm2m_register_post_write_callback(const struct lwm2m_obj_path *path, + lwm2m_engine_set_data_cb_t cb) { int ret; struct lwm2m_engine_res *res = NULL; - ret = lwm2m_engine_get_resource(pathstr, &res); + ret = lwm2m_get_resource(path, &res); if (ret < 0) { return ret; } @@ -1694,12 +1751,25 @@ int lwm2m_engine_register_post_write_callback(const char *pathstr, lwm2m_engine_ return 0; } -int lwm2m_engine_register_exec_callback(const char *pathstr, lwm2m_engine_execute_cb_t cb) +int lwm2m_engine_register_post_write_callback(const char *pathstr, lwm2m_engine_set_data_cb_t cb) +{ + int ret; + struct lwm2m_obj_path path; + + ret = lwm2m_string_to_path(pathstr, &path, '/'); + if (ret < 0) { + return ret; + } + + return lwm2m_register_post_write_callback(&path, cb); +} + +int lwm2m_register_exec_callback(const struct lwm2m_obj_path *path, lwm2m_engine_execute_cb_t cb) { int ret; struct lwm2m_engine_res *res = NULL; - ret = lwm2m_engine_get_resource(pathstr, &res); + ret = lwm2m_get_resource(path, &res); if (ret < 0) { return ret; } @@ -1708,7 +1778,20 @@ int lwm2m_engine_register_exec_callback(const char *pathstr, lwm2m_engine_execut return 0; } -int lwm2m_engine_register_create_callback(uint16_t obj_id, lwm2m_engine_user_cb_t cb) +int lwm2m_engine_register_exec_callback(const char *pathstr, lwm2m_engine_execute_cb_t cb) +{ + int ret; + struct lwm2m_obj_path path; + + ret = lwm2m_string_to_path(pathstr, &path, '/'); + if (ret < 0) { + return ret; + } + + return lwm2m_register_exec_callback(&path, cb); +} + +int lwm2m_register_create_callback(uint16_t obj_id, lwm2m_engine_user_cb_t cb) { struct lwm2m_engine_obj *obj = NULL; @@ -1722,7 +1805,12 @@ int lwm2m_engine_register_create_callback(uint16_t obj_id, lwm2m_engine_user_cb_ return 0; } -int lwm2m_engine_register_delete_callback(uint16_t obj_id, lwm2m_engine_user_cb_t cb) +int lwm2m_engine_register_create_callback(uint16_t obj_id, lwm2m_engine_user_cb_t cb) +{ + return lwm2m_register_create_callback(obj_id, cb); +} + +int lwm2m_register_delete_callback(uint16_t obj_id, lwm2m_engine_user_cb_t cb) { struct lwm2m_engine_obj *obj = NULL; @@ -1735,6 +1823,11 @@ int lwm2m_engine_register_delete_callback(uint16_t obj_id, lwm2m_engine_user_cb_ obj->user_delete_cb = cb; return 0; } + +int lwm2m_engine_register_delete_callback(uint16_t obj_id, lwm2m_engine_user_cb_t cb) +{ + return lwm2m_register_delete_callback(obj_id, cb); +} /* Generic data handlers */ int lwm2m_get_or_create_engine_obj(struct lwm2m_message *msg, diff --git a/subsys/net/lib/lwm2m/lwm2m_registry.h b/subsys/net/lib/lwm2m/lwm2m_registry.h index fb4dccef61e..8f83e5cca11 100644 --- a/subsys/net/lib/lwm2m/lwm2m_registry.h +++ b/subsys/net/lib/lwm2m/lwm2m_registry.h @@ -71,12 +71,23 @@ int lwm2m_engine_get_create_res_inst(struct lwm2m_obj_path *path, struct lwm2m_e /** * @brief Gets the resource specified by @p pathstr. * + * @deprecated Use lwm2m_get_resource() instead. + * * @param[in] pathstr Path to resource (i.e 100/100/100/x, the fourth component is optional) * @param[out] res Engine resource buffer pointer. * @return 0 for success or negative in case of error. */ int lwm2m_engine_get_resource(const char *pathstr, struct lwm2m_engine_res **res); +/** + * @brief Gets the resource specified by @p path. + * + * @param[in] path Path to resource (i.e 100/100/100/x, the fourth component is optional) + * @param[out] res Engine resource buffer pointer. + * @return 0 for success or negative in case of error. + */ +int lwm2m_get_resource(const struct lwm2m_obj_path *path, struct lwm2m_engine_res **res); + /** * @brief Returns pointer to the object in the registry specified by @p path. * Returns NULL if it does not exist.