diff --git a/include/zephyr/net/lwm2m.h b/include/zephyr/net/lwm2m.h index c60bcd5b1a8..2170d47cb83 100644 --- a/include/zephyr/net/lwm2m.h +++ b/include/zephyr/net/lwm2m.h @@ -2089,6 +2089,8 @@ char *lwm2m_path_log_buf(char *buf, struct lwm2m_obj_path *path); /**  * @brief LwM2M SEND operation to given path list * + * @deprecated Use lwm2m_send() instead. + * * @param ctx LwM2M context * @param path_list LwM2M Path string list * @param path_list_size Length of path list. Max size is CONFIG_LWM2M_COMPOSITE_PATH_LIST_SIZE @@ -2100,6 +2102,20 @@ char *lwm2m_path_log_buf(char *buf, struct lwm2m_obj_path *path); int lwm2m_engine_send(struct lwm2m_ctx *ctx, char const *path_list[], uint8_t path_list_size, bool confirmation_request); +/**  + * @brief LwM2M SEND operation to given path list + * + * @param ctx LwM2M context + * @param path_list LwM2M path struct list + * @param path_list_size Length of path list. Max size is CONFIG_LWM2M_COMPOSITE_PATH_LIST_SIZE + * @param confirmation_request True request confirmation for operation. + *  + * @return 0 for success or negative in case of error. + * + */ +int lwm2m_send(struct lwm2m_ctx *ctx, const struct lwm2m_obj_path path_list[], + uint8_t path_list_size, bool confirmation_request); + /**  * @brief Returns LwM2M client context * diff --git a/subsys/net/lib/lwm2m/lwm2m_message_handling.c b/subsys/net/lib/lwm2m/lwm2m_message_handling.c index 3cee0378667..877ee75e108 100644 --- a/subsys/net/lib/lwm2m/lwm2m_message_handling.c +++ b/subsys/net/lib/lwm2m/lwm2m_message_handling.c @@ -2937,8 +2937,8 @@ static bool init_next_pending_timeseries_data(struct lwm2m_cache_read_info *cach } #endif -int lwm2m_engine_send(struct lwm2m_ctx *ctx, char const *path_list[], uint8_t path_list_size, - bool confirmation_request) +int lwm2m_send(struct lwm2m_ctx *ctx, const struct lwm2m_obj_path path_list[], + uint8_t path_list_size, bool confirmation_request) { #if defined(CONFIG_LWM2M_SERVER_OBJECT_VERSION_1_1) struct lwm2m_message *msg; @@ -2946,7 +2946,6 @@ int lwm2m_engine_send(struct lwm2m_ctx *ctx, char const *path_list[], uint8_t pa uint16_t content_format; /* Path list buffer */ - struct lwm2m_obj_path temp; struct lwm2m_obj_path_list lwm2m_path_list_buf[CONFIG_LWM2M_COMPOSITE_PATH_LIST_SIZE]; sys_slist_t lwm2m_path_list; sys_slist_t lwm2m_path_free_list; @@ -2986,12 +2985,9 @@ int lwm2m_engine_send(struct lwm2m_ctx *ctx, char const *path_list[], uint8_t pa /* Parse Path to internal used object path format */ for (int i = 0; i < path_list_size; i++) { - ret = lwm2m_string_to_path(path_list[i], &temp, '/'); - if (ret < 0) { - return ret; - } /* Add to linked list */ - if (lwm2m_engine_add_path_to_list(&lwm2m_path_list, &lwm2m_path_free_list, &temp)) { + if (lwm2m_engine_add_path_to_list(&lwm2m_path_list, &lwm2m_path_free_list, + &path_list[i])) { return -1; } } @@ -3087,3 +3083,24 @@ cleanup: return -ENOTSUP; #endif } + +int lwm2m_engine_send(struct lwm2m_ctx *ctx, char const *path_list[], uint8_t path_list_size, + bool confirmation_request) +{ + int ret; + struct lwm2m_obj_path lwm2m_path_list[CONFIG_LWM2M_COMPOSITE_PATH_LIST_SIZE]; + + if (path_list_size > CONFIG_LWM2M_COMPOSITE_PATH_LIST_SIZE) { + return -E2BIG; + } + + for (int i = 0; i < path_list_size; i++) { + /* translate path -> path_obj */ + ret = lwm2m_string_to_path(path_list[i], &lwm2m_path_list[i], '/'); + if (ret < 0) { + return ret; + } + } + + return lwm2m_send(ctx, lwm2m_path_list, path_list_size, confirmation_request); +} diff --git a/subsys/net/lib/lwm2m/lwm2m_observation.c b/subsys/net/lib/lwm2m/lwm2m_observation.c index 74ef9d2c99a..727dc05e7f1 100644 --- a/subsys/net/lib/lwm2m/lwm2m_observation.c +++ b/subsys/net/lib/lwm2m/lwm2m_observation.c @@ -1501,7 +1501,7 @@ void lwm2m_engine_path_list_init(sys_slist_t *lwm2m_path_list, sys_slist_t *lwm2 } int lwm2m_engine_add_path_to_list(sys_slist_t *lwm2m_path_list, sys_slist_t *lwm2m_free_list, - struct lwm2m_obj_path *path) + const struct lwm2m_obj_path *path) { struct lwm2m_obj_path_list *prev = NULL; struct lwm2m_obj_path_list *entry; diff --git a/subsys/net/lib/lwm2m/lwm2m_observation.h b/subsys/net/lib/lwm2m/lwm2m_observation.h index 04e0db67101..95e60ab0a19 100644 --- a/subsys/net/lib/lwm2m/lwm2m_observation.h +++ b/subsys/net/lib/lwm2m/lwm2m_observation.h @@ -70,7 +70,7 @@ void lwm2m_engine_path_list_init(sys_slist_t *lwm2m_path_list, sys_slist_t *lwm2 * @return 0 on success or a negative error code */ int lwm2m_engine_add_path_to_list(sys_slist_t *lwm2m_path_list, sys_slist_t *lwm2m_free_list, - struct lwm2m_obj_path *path); + const struct lwm2m_obj_path *path); int lwm2m_get_path_reference_ptr(struct lwm2m_engine_obj *obj, const struct lwm2m_obj_path *path, void **ref); diff --git a/subsys/net/lib/lwm2m/lwm2m_shell.c b/subsys/net/lib/lwm2m/lwm2m_shell.c index 6c4ce47d30a..76dd5d8191a 100644 --- a/subsys/net/lib/lwm2m/lwm2m_shell.c +++ b/subsys/net/lib/lwm2m/lwm2m_shell.c @@ -62,6 +62,7 @@ static int cmd_send(const struct shell *sh, size_t argc, char **argv) int path_cnt = argc - 1; bool confirmable = true; int ignore_cnt = 1; /* Subcmd + arguments preceding the path list */ + struct lwm2m_obj_path lwm2m_path_list[CONFIG_LWM2M_COMPOSITE_PATH_LIST_SIZE]; if (!ctx) { shell_error(sh, "no lwm2m context yet\n"); @@ -86,8 +87,20 @@ static int cmd_send(const struct shell *sh, size_t argc, char **argv) return -EINVAL; } - ret = lwm2m_engine_send(ctx, (const char **)&(argv[ignore_cnt]), - path_cnt, confirmable); + if (path_cnt > CONFIG_LWM2M_COMPOSITE_PATH_LIST_SIZE) { + return -E2BIG; + } + + for (int i = ignore_cnt; i < path_cnt; i++) { + /* translate path -> path_obj */ + ret = lwm2m_string_to_path(argv[i], &lwm2m_path_list[i], '/'); + if (ret < 0) { + return ret; + } + } + + ret = lwm2m_send(ctx, lwm2m_path_list, path_cnt, confirmable); + if (ret < 0) { shell_error(sh, "can't do send operation, request failed\n"); return -ENOEXEC;