diff --git a/include/zephyr/mgmt/mcumgr/grp/fs_mgmt/fs_mgmt.h b/include/zephyr/mgmt/mcumgr/grp/fs_mgmt/fs_mgmt.h index 23c4a33fb1d..af7f612a7fa 100644 --- a/include/zephyr/mgmt/mcumgr/grp/fs_mgmt/fs_mgmt.h +++ b/include/zephyr/mgmt/mcumgr/grp/fs_mgmt/fs_mgmt.h @@ -75,17 +75,6 @@ enum fs_mgmt_ret_code_t { FS_MGMT_RET_RC_CHECKSUM_HASH_NOT_FOUND, }; -#ifdef CONFIG_MCUMGR_SMP_SUPPORT_ORIGINAL_PROTOCOL -/* - * @brief Translate FS mgmt group error code into MCUmgr error code - * - * @param ret #fs_mgmt_ret_code_t error code - * - * @return #mcumgr_err_t error code - */ -int fs_mgmt_translate_error_code(uint16_t ret); -#endif - #ifdef __cplusplus } #endif diff --git a/include/zephyr/mgmt/mcumgr/grp/img_mgmt/img_mgmt.h b/include/zephyr/mgmt/mcumgr/grp/img_mgmt/img_mgmt.h index 36220c1d128..ef5f840c261 100644 --- a/include/zephyr/mgmt/mcumgr/grp/img_mgmt/img_mgmt.h +++ b/include/zephyr/mgmt/mcumgr/grp/img_mgmt/img_mgmt.h @@ -341,17 +341,6 @@ int img_mgmt_vercmp(const struct image_version *a, const struct image_version *b void img_mgmt_reset_upload(void); #endif -#ifdef CONFIG_MCUMGR_SMP_SUPPORT_ORIGINAL_PROTOCOL -/* - * @brief Translate IMG mgmt group error code into MCUmgr error code - * - * @param ret #img_mgmt_ret_code_t error code - * - * @return #mcumgr_err_t error code - */ -int img_mgmt_translate_error_code(uint16_t ret); -#endif - #ifdef CONFIG_MCUMGR_GRP_IMG_VERBOSE_ERR #define IMG_MGMT_UPLOAD_ACTION_SET_RC_RSN(action, rsn) ((action)->rc_rsn = (rsn)) #define IMG_MGMT_UPLOAD_ACTION_RC_RSN(action) ((action)->rc_rsn) diff --git a/include/zephyr/mgmt/mcumgr/grp/os_mgmt/os_mgmt.h b/include/zephyr/mgmt/mcumgr/grp/os_mgmt/os_mgmt.h index 3fdfc01678c..c995528872c 100644 --- a/include/zephyr/mgmt/mcumgr/grp/os_mgmt/os_mgmt.h +++ b/include/zephyr/mgmt/mcumgr/grp/os_mgmt/os_mgmt.h @@ -1,6 +1,7 @@ /* * Copyright (c) 2018-2021 mcumgr authors * Copyright (c) 2022 Laird Connectivity + * Copyright (c) 2023 Nordic Semiconductor ASA * * SPDX-License-Identifier: Apache-2.0 */ @@ -97,17 +98,6 @@ struct os_mgmt_info_append { bool *prior_output; }; -#ifdef CONFIG_MCUMGR_SMP_SUPPORT_ORIGINAL_PROTOCOL -/* - * @brief Translate OS mgmt group error code into MCUmgr error code - * - * @param ret #os_mgmt_ret_code_t error code - * - * @return #mcumgr_err_t error code - */ -int os_mgmt_translate_error_code(uint16_t ret); -#endif - #ifdef __cplusplus } #endif diff --git a/include/zephyr/mgmt/mcumgr/grp/shell_mgmt/shell_mgmt.h b/include/zephyr/mgmt/mcumgr/grp/shell_mgmt/shell_mgmt.h index 25d9a25df42..c4f36dbd6db 100644 --- a/include/zephyr/mgmt/mcumgr/grp/shell_mgmt/shell_mgmt.h +++ b/include/zephyr/mgmt/mcumgr/grp/shell_mgmt/shell_mgmt.h @@ -34,17 +34,6 @@ enum shell_mgmt_ret_code_t { SHELL_MGMT_RET_RC_EMPTY_COMMAND, }; -#ifdef CONFIG_MCUMGR_SMP_SUPPORT_ORIGINAL_PROTOCOL -/* - * @brief Translate shell mgmt group error code into MCUmgr error code - * - * @param ret #shell_mgmt_ret_code_t error code - * - * @return #mcumgr_err_t error code - */ -int shell_mgmt_translate_error_code(uint16_t ret); -#endif - #ifdef __cplusplus } #endif diff --git a/include/zephyr/mgmt/mcumgr/grp/stat_mgmt/stat_mgmt.h b/include/zephyr/mgmt/mcumgr/grp/stat_mgmt/stat_mgmt.h index 36c7016c12c..b9d42465295 100644 --- a/include/zephyr/mgmt/mcumgr/grp/stat_mgmt/stat_mgmt.h +++ b/include/zephyr/mgmt/mcumgr/grp/stat_mgmt/stat_mgmt.h @@ -49,17 +49,6 @@ struct stat_mgmt_entry { uint64_t value; }; -#ifdef CONFIG_MCUMGR_SMP_SUPPORT_ORIGINAL_PROTOCOL -/* - * @brief Translate stat mgmt group error code into MCUmgr error code - * - * @param ret #stat_mgmt_ret_code_t error code - * - * @return #mcumgr_err_t error code - */ -int stat_mgmt_translate_error_code(uint16_t ret); -#endif - #ifdef __cplusplus } #endif diff --git a/include/zephyr/mgmt/mcumgr/grp/zephyr/zephyr_basic.h b/include/zephyr/mgmt/mcumgr/grp/zephyr/zephyr_basic.h index b69c57ed08c..089243ac7e3 100644 --- a/include/zephyr/mgmt/mcumgr/grp/zephyr/zephyr_basic.h +++ b/include/zephyr/mgmt/mcumgr/grp/zephyr/zephyr_basic.h @@ -35,17 +35,6 @@ enum zephyr_basic_group_ret_code_t { ZEPHYR_MGMT_GRP_CMD_RC_FLASH_ERASE_FAILED, }; -#ifdef CONFIG_MCUMGR_SMP_SUPPORT_ORIGINAL_PROTOCOL -/* - * @brief Translate zephyr basic group error code into MCUmgr error code - * - * @param ret #zephyr_basic_group_ret_code_t error code - * - * @return #mcumgr_err_t error code - */ -int zephyr_basic_group_translate_error_code(uint16_t ret); -#endif - #ifdef __cplusplus } #endif diff --git a/include/zephyr/mgmt/mcumgr/mgmt/mgmt.h b/include/zephyr/mgmt/mcumgr/mgmt/mgmt.h index f6d23a193b2..af7c844169c 100644 --- a/include/zephyr/mgmt/mcumgr/mgmt/mgmt.h +++ b/include/zephyr/mgmt/mcumgr/mgmt/mgmt.h @@ -1,6 +1,6 @@ /* * Copyright (c) 2018-2021 mcumgr authors - * Copyright (c) 2022 Nordic Semiconductor ASA + * Copyright (c) 2022-2023 Nordic Semiconductor ASA * * SPDX-License-Identifier: Apache-2.0 */ @@ -195,8 +195,15 @@ struct mgmt_group { const struct mgmt_handler *mg_handlers; uint16_t mg_handlers_count; - /* The numeric ID of this group. */ + /** The numeric ID of this group. */ uint16_t mg_group_id; + +#if IS_ENABLED(CONFIG_MCUMGR_SMP_SUPPORT_ORIGINAL_PROTOCOL) + /** A function handler for translating version 2 SMP error codes to version 1 SMP error + * codes (optional) + */ + smp_translate_error_fn mg_translate_error; +#endif }; /** @@ -224,6 +231,19 @@ void mgmt_unregister_group(struct mgmt_group *group); */ const struct mgmt_handler *mgmt_find_handler(uint16_t group_id, uint16_t command_id); +#if IS_ENABLED(CONFIG_MCUMGR_SMP_SUPPORT_ORIGINAL_PROTOCOL) +/** + * @brief Finds a registered error translation function for converting from SMP + * version 2 error codes to legacy SMP version 1 error codes. + * + * @param group_id The group of the translation function to find. + * + * @return Requested lookup function on success. + * @return NULL on failure. + */ +smp_translate_error_fn mgmt_find_error_translation_function(uint16_t group_id); +#endif + /** * @} */ diff --git a/include/zephyr/mgmt/mcumgr/smp/smp.h b/include/zephyr/mgmt/mcumgr/smp/smp.h index cb5305b40c1..fd964ae2c45 100644 --- a/include/zephyr/mgmt/mcumgr/smp/smp.h +++ b/include/zephyr/mgmt/mcumgr/smp/smp.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2018-2021 mcumgr authors + * Copyright (c) 2023 Nordic Semiconductor ASA * * SPDX-License-Identifier: Apache-2.0 */ @@ -55,7 +56,7 @@ struct cbor_nb_writer { struct net_buf *nb; zcbor_state_t zs[2]; -#ifdef CONFIG_MCUMGR_SMP_SUPPORT_ORIGINAL_PROTOCOL +#if IS_ENABLED(CONFIG_MCUMGR_SMP_SUPPORT_ORIGINAL_PROTOCOL) uint16_t error_group; uint16_t error_ret; #endif @@ -120,6 +121,17 @@ int smp_process_request_packet(struct smp_streamer *streamer, void *req); */ bool smp_add_cmd_ret(zcbor_state_t *zse, uint16_t group, uint16_t ret); +#if IS_ENABLED(CONFIG_MCUMGR_SMP_SUPPORT_ORIGINAL_PROTOCOL) +/** @typedef smp_translate_error_fn + * @brief Translates a SMP version 2 error response to a legacy SMP version 1 error code. + * + * @param ret The SMP version 2 error ret/rc value. + * + * @return #enum mcumgr_err_t Legacy SMP version 1 error code to return to client. + */ +typedef int (*smp_translate_error_fn)(uint16_t ret); +#endif + #ifdef __cplusplus } #endif diff --git a/subsys/mgmt/mcumgr/grp/fs_mgmt/src/fs_mgmt.c b/subsys/mgmt/mcumgr/grp/fs_mgmt/src/fs_mgmt.c index 0e5e934ed03..4cbd6b893b3 100644 --- a/subsys/mgmt/mcumgr/grp/fs_mgmt/src/fs_mgmt.c +++ b/subsys/mgmt/mcumgr/grp/fs_mgmt/src/fs_mgmt.c @@ -896,6 +896,46 @@ static int fs_mgmt_close_opened_file(struct smp_streamer *ctxt) return MGMT_ERR_EOK; } +#ifdef CONFIG_MCUMGR_SMP_SUPPORT_ORIGINAL_PROTOCOL +/* + * @brief Translate FS mgmt group error code into MCUmgr error code + * + * @param ret #fs_mgmt_ret_code_t error code + * + * @return #mcumgr_err_t error code + */ +static int fs_mgmt_translate_error_code(uint16_t ret) +{ + int rc; + + switch (ret) { + case FS_MGMT_RET_RC_FILE_INVALID_NAME: + case FS_MGMT_RET_RC_CHECKSUM_HASH_NOT_FOUND: + rc = MGMT_ERR_EINVAL; + break; + + case FS_MGMT_RET_RC_FILE_NOT_FOUND: + case FS_MGMT_RET_RC_FILE_IS_DIRECTORY: + rc = MGMT_ERR_ENOENT; + break; + + case FS_MGMT_RET_RC_UNKNOWN: + case FS_MGMT_RET_RC_FILE_OPEN_FAILED: + case FS_MGMT_RET_RC_FILE_SEEK_FAILED: + case FS_MGMT_RET_RC_FILE_READ_FAILED: + case FS_MGMT_RET_RC_FILE_TRUNCATE_FAILED: + case FS_MGMT_RET_RC_FILE_DELETE_FAILED: + case FS_MGMT_RET_RC_FILE_WRITE_FAILED: + case FS_MGMT_RET_RC_FILE_OFFSET_NOT_VALID: + case FS_MGMT_RET_RC_FILE_OFFSET_LARGER_THAN_FILE: + default: + rc = MGMT_ERR_EUNKNOWN; + } + + return rc; +} +#endif + static const struct mgmt_handler fs_mgmt_handlers[] = { [FS_MGMT_ID_FILE] = { .mh_read = fs_mgmt_file_download, @@ -931,6 +971,9 @@ static struct mgmt_group fs_mgmt_group = { .mg_handlers = fs_mgmt_handlers, .mg_handlers_count = FS_MGMT_HANDLER_CNT, .mg_group_id = MGMT_GROUP_ID_FS, +#ifdef CONFIG_MCUMGR_SMP_SUPPORT_ORIGINAL_PROTOCOL + .mg_translate_error = fs_mgmt_translate_error_code, +#endif }; static void fs_mgmt_register_group(void) @@ -954,37 +997,4 @@ static void fs_mgmt_register_group(void) #endif } -#ifdef CONFIG_MCUMGR_SMP_SUPPORT_ORIGINAL_PROTOCOL -int fs_mgmt_translate_error_code(uint16_t ret) -{ - int rc; - - switch (ret) { - case FS_MGMT_RET_RC_FILE_INVALID_NAME: - case FS_MGMT_RET_RC_CHECKSUM_HASH_NOT_FOUND: - rc = MGMT_ERR_EINVAL; - break; - - case FS_MGMT_RET_RC_FILE_NOT_FOUND: - case FS_MGMT_RET_RC_FILE_IS_DIRECTORY: - rc = MGMT_ERR_ENOENT; - break; - - case FS_MGMT_RET_RC_UNKNOWN: - case FS_MGMT_RET_RC_FILE_OPEN_FAILED: - case FS_MGMT_RET_RC_FILE_SEEK_FAILED: - case FS_MGMT_RET_RC_FILE_READ_FAILED: - case FS_MGMT_RET_RC_FILE_TRUNCATE_FAILED: - case FS_MGMT_RET_RC_FILE_DELETE_FAILED: - case FS_MGMT_RET_RC_FILE_WRITE_FAILED: - case FS_MGMT_RET_RC_FILE_OFFSET_NOT_VALID: - case FS_MGMT_RET_RC_FILE_OFFSET_LARGER_THAN_FILE: - default: - rc = MGMT_ERR_EUNKNOWN; - } - - return rc; -} -#endif - MCUMGR_HANDLER_DEFINE(fs_mgmt, fs_mgmt_register_group); diff --git a/subsys/mgmt/mcumgr/grp/img_mgmt/src/img_mgmt.c b/subsys/mgmt/mcumgr/grp/img_mgmt/src/img_mgmt.c index 502ed779f76..85d62acfb6a 100644 --- a/subsys/mgmt/mcumgr/grp/img_mgmt/src/img_mgmt.c +++ b/subsys/mgmt/mcumgr/grp/img_mgmt/src/img_mgmt.c @@ -752,42 +752,15 @@ int img_mgmt_my_version(struct image_version *ver) ver, NULL, NULL); } -static const struct mgmt_handler img_mgmt_handlers[] = { - [IMG_MGMT_ID_STATE] = { - .mh_read = img_mgmt_state_read, -#ifdef CONFIG_MCUBOOT_BOOTLOADER_MODE_DIRECT_XIP - .mh_write = NULL -#else - .mh_write = img_mgmt_state_write, -#endif - }, - [IMG_MGMT_ID_UPLOAD] = { - .mh_read = NULL, - .mh_write = img_mgmt_upload - }, - [IMG_MGMT_ID_ERASE] = { - .mh_read = NULL, - .mh_write = img_mgmt_erase - }, -}; - -static const struct mgmt_handler img_mgmt_handlers[]; - -#define IMG_MGMT_HANDLER_CNT ARRAY_SIZE(img_mgmt_handlers) - -static struct mgmt_group img_mgmt_group = { - .mg_handlers = (struct mgmt_handler *)img_mgmt_handlers, - .mg_handlers_count = IMG_MGMT_HANDLER_CNT, - .mg_group_id = MGMT_GROUP_ID_IMAGE, -}; - -static void img_mgmt_register_group(void) -{ - mgmt_register_group(&img_mgmt_group); -} - #ifdef CONFIG_MCUMGR_SMP_SUPPORT_ORIGINAL_PROTOCOL -int img_mgmt_translate_error_code(uint16_t ret) +/* + * @brief Translate IMG mgmt group error code into MCUmgr error code + * + * @param ret #img_mgmt_ret_code_t error code + * + * @return #mcumgr_err_t error code + */ +static int img_mgmt_translate_error_code(uint16_t ret) { int rc; @@ -841,4 +814,41 @@ int img_mgmt_translate_error_code(uint16_t ret) } #endif +static const struct mgmt_handler img_mgmt_handlers[] = { + [IMG_MGMT_ID_STATE] = { + .mh_read = img_mgmt_state_read, +#ifdef CONFIG_MCUBOOT_BOOTLOADER_MODE_DIRECT_XIP + .mh_write = NULL +#else + .mh_write = img_mgmt_state_write, +#endif + }, + [IMG_MGMT_ID_UPLOAD] = { + .mh_read = NULL, + .mh_write = img_mgmt_upload + }, + [IMG_MGMT_ID_ERASE] = { + .mh_read = NULL, + .mh_write = img_mgmt_erase + }, +}; + +static const struct mgmt_handler img_mgmt_handlers[]; + +#define IMG_MGMT_HANDLER_CNT ARRAY_SIZE(img_mgmt_handlers) + +static struct mgmt_group img_mgmt_group = { + .mg_handlers = (struct mgmt_handler *)img_mgmt_handlers, + .mg_handlers_count = IMG_MGMT_HANDLER_CNT, + .mg_group_id = MGMT_GROUP_ID_IMAGE, +#ifdef CONFIG_MCUMGR_SMP_SUPPORT_ORIGINAL_PROTOCOL + .mg_translate_error = img_mgmt_translate_error_code, +#endif +}; + +static void img_mgmt_register_group(void) +{ + mgmt_register_group(&img_mgmt_group); +} + MCUMGR_HANDLER_DEFINE(img_mgmt, img_mgmt_register_group); diff --git a/subsys/mgmt/mcumgr/grp/os_mgmt/src/os_mgmt.c b/subsys/mgmt/mcumgr/grp/os_mgmt/src/os_mgmt.c index d98dc4e2b85..8b0c3dd0246 100644 --- a/subsys/mgmt/mcumgr/grp/os_mgmt/src/os_mgmt.c +++ b/subsys/mgmt/mcumgr/grp/os_mgmt/src/os_mgmt.c @@ -674,6 +674,32 @@ fail: } #endif +#ifdef CONFIG_MCUMGR_SMP_SUPPORT_ORIGINAL_PROTOCOL +/* + * @brief Translate OS mgmt group error code into MCUmgr error code + * + * @param ret #os_mgmt_ret_code_t error code + * + * @return #mcumgr_err_t error code + */ +static int os_mgmt_translate_error_code(uint16_t ret) +{ + int rc; + + switch (ret) { + case OS_MGMT_RET_RC_INVALID_FORMAT: + rc = MGMT_ERR_EINVAL; + break; + + case OS_MGMT_RET_RC_UNKNOWN: + default: + rc = MGMT_ERR_EUNKNOWN; + } + + return rc; +} +#endif + static const struct mgmt_handler os_mgmt_group_handlers[] = { #ifdef CONFIG_MCUMGR_GRP_OS_ECHO [OS_MGMT_ID_ECHO] = { @@ -708,6 +734,9 @@ static struct mgmt_group os_mgmt_group = { .mg_handlers = os_mgmt_group_handlers, .mg_handlers_count = OS_MGMT_GROUP_SZ, .mg_group_id = MGMT_GROUP_ID_OS, +#ifdef CONFIG_MCUMGR_SMP_SUPPORT_ORIGINAL_PROTOCOL + .mg_translate_error = os_mgmt_translate_error_code, +#endif }; static void os_mgmt_register_group(void) @@ -715,23 +744,4 @@ static void os_mgmt_register_group(void) mgmt_register_group(&os_mgmt_group); } -#ifdef CONFIG_MCUMGR_SMP_SUPPORT_ORIGINAL_PROTOCOL -int os_mgmt_translate_error_code(uint16_t ret) -{ - int rc; - - switch (ret) { - case OS_MGMT_RET_RC_INVALID_FORMAT: - rc = MGMT_ERR_EINVAL; - break; - - case OS_MGMT_RET_RC_UNKNOWN: - default: - rc = MGMT_ERR_EUNKNOWN; - } - - return rc; -} -#endif - MCUMGR_HANDLER_DEFINE(os_mgmt, os_mgmt_register_group); diff --git a/subsys/mgmt/mcumgr/grp/shell_mgmt/src/shell_mgmt.c b/subsys/mgmt/mcumgr/grp/shell_mgmt/src/shell_mgmt.c index f6cb3f014ba..d0f2a394973 100644 --- a/subsys/mgmt/mcumgr/grp/shell_mgmt/src/shell_mgmt.c +++ b/subsys/mgmt/mcumgr/grp/shell_mgmt/src/shell_mgmt.c @@ -128,25 +128,15 @@ end: return ok ? MGMT_ERR_EOK : MGMT_ERR_EMSGSIZE; } -static struct mgmt_handler shell_mgmt_handlers[] = { - [SHELL_MGMT_ID_EXEC] = { NULL, shell_mgmt_exec }, -}; - -#define SHELL_MGMT_HANDLER_CNT ARRAY_SIZE(shell_mgmt_handlers) - -static struct mgmt_group shell_mgmt_group = { - .mg_handlers = shell_mgmt_handlers, - .mg_handlers_count = SHELL_MGMT_HANDLER_CNT, - .mg_group_id = MGMT_GROUP_ID_SHELL, -}; - -static void shell_mgmt_register_group(void) -{ - mgmt_register_group(&shell_mgmt_group); -} - #ifdef CONFIG_MCUMGR_SMP_SUPPORT_ORIGINAL_PROTOCOL -int shell_mgmt_translate_error_code(uint16_t ret) +/* + * @brief Translate shell mgmt group error code into MCUmgr error code + * + * @param ret #shell_mgmt_ret_code_t error code + * + * @return #mcumgr_err_t error code + */ +static int shell_mgmt_translate_error_code(uint16_t ret) { int rc; @@ -164,4 +154,24 @@ int shell_mgmt_translate_error_code(uint16_t ret) } #endif +static struct mgmt_handler shell_mgmt_handlers[] = { + [SHELL_MGMT_ID_EXEC] = { NULL, shell_mgmt_exec }, +}; + +#define SHELL_MGMT_HANDLER_CNT ARRAY_SIZE(shell_mgmt_handlers) + +static struct mgmt_group shell_mgmt_group = { + .mg_handlers = shell_mgmt_handlers, + .mg_handlers_count = SHELL_MGMT_HANDLER_CNT, + .mg_group_id = MGMT_GROUP_ID_SHELL, +#ifdef CONFIG_MCUMGR_SMP_SUPPORT_ORIGINAL_PROTOCOL + .mg_translate_error = shell_mgmt_translate_error_code, +#endif +}; + +static void shell_mgmt_register_group(void) +{ + mgmt_register_group(&shell_mgmt_group); +} + MCUMGR_HANDLER_DEFINE(shell_mgmt, shell_mgmt_register_group); diff --git a/subsys/mgmt/mcumgr/grp/stat_mgmt/src/stat_mgmt.c b/subsys/mgmt/mcumgr/grp/stat_mgmt/src/stat_mgmt.c index 78f6e8d1458..9f9b9301168 100644 --- a/subsys/mgmt/mcumgr/grp/stat_mgmt/src/stat_mgmt.c +++ b/subsys/mgmt/mcumgr/grp/stat_mgmt/src/stat_mgmt.c @@ -239,26 +239,15 @@ stat_mgmt_list(struct smp_streamer *ctxt) return 0; } -static struct mgmt_handler stat_mgmt_handlers[] = { - [STAT_MGMT_ID_SHOW] = { stat_mgmt_show, NULL }, - [STAT_MGMT_ID_LIST] = { stat_mgmt_list, NULL }, -}; - -#define STAT_MGMT_HANDLER_CNT ARRAY_SIZE(stat_mgmt_handlers) - -static struct mgmt_group stat_mgmt_group = { - .mg_handlers = stat_mgmt_handlers, - .mg_handlers_count = STAT_MGMT_HANDLER_CNT, - .mg_group_id = MGMT_GROUP_ID_STAT, -}; - -static void stat_mgmt_register_group(void) -{ - mgmt_register_group(&stat_mgmt_group); -} - #ifdef CONFIG_MCUMGR_SMP_SUPPORT_ORIGINAL_PROTOCOL -int stat_mgmt_translate_error_code(uint16_t ret) +/* + * @brief Translate stat mgmt group error code into MCUmgr error code + * + * @param ret #stat_mgmt_ret_code_t error code + * + * @return #mcumgr_err_t error code + */ +static int stat_mgmt_translate_error_code(uint16_t ret) { int rc; @@ -281,4 +270,25 @@ int stat_mgmt_translate_error_code(uint16_t ret) } #endif +static struct mgmt_handler stat_mgmt_handlers[] = { + [STAT_MGMT_ID_SHOW] = { stat_mgmt_show, NULL }, + [STAT_MGMT_ID_LIST] = { stat_mgmt_list, NULL }, +}; + +#define STAT_MGMT_HANDLER_CNT ARRAY_SIZE(stat_mgmt_handlers) + +static struct mgmt_group stat_mgmt_group = { + .mg_handlers = stat_mgmt_handlers, + .mg_handlers_count = STAT_MGMT_HANDLER_CNT, + .mg_group_id = MGMT_GROUP_ID_STAT, +#ifdef CONFIG_MCUMGR_SMP_SUPPORT_ORIGINAL_PROTOCOL + .mg_translate_error = stat_mgmt_translate_error_code, +#endif +}; + +static void stat_mgmt_register_group(void) +{ + mgmt_register_group(&stat_mgmt_group); +} + MCUMGR_HANDLER_DEFINE(stat_mgmt, stat_mgmt_register_group); diff --git a/subsys/mgmt/mcumgr/grp/zephyr_basic/src/basic_mgmt.c b/subsys/mgmt/mcumgr/grp/zephyr_basic/src/basic_mgmt.c index 025b9c557ef..4ccf95b2e71 100644 --- a/subsys/mgmt/mcumgr/grp/zephyr_basic/src/basic_mgmt.c +++ b/subsys/mgmt/mcumgr/grp/zephyr_basic/src/basic_mgmt.c @@ -64,26 +64,15 @@ static int storage_erase_handler(struct smp_streamer *ctxt) return MGMT_ERR_EOK; } -static const struct mgmt_handler zephyr_mgmt_basic_handlers[] = { - [ZEPHYR_MGMT_GRP_BASIC_CMD_ERASE_STORAGE] = { - .mh_read = NULL, - .mh_write = storage_erase_handler, - }, -}; - -static struct mgmt_group zephyr_basic_mgmt_group = { - .mg_handlers = (struct mgmt_handler *)zephyr_mgmt_basic_handlers, - .mg_handlers_count = ARRAY_SIZE(zephyr_mgmt_basic_handlers), - .mg_group_id = (ZEPHYR_MGMT_GRP_BASIC), -}; - -static void zephyr_basic_mgmt_init(void) -{ - mgmt_register_group(&zephyr_basic_mgmt_group); -} - #ifdef CONFIG_MCUMGR_SMP_SUPPORT_ORIGINAL_PROTOCOL -int zephyr_basic_group_translate_error_code(uint16_t ret) +/* + * @brief Translate zephyr basic group error code into MCUmgr error code + * + * @param ret #zephyr_basic_group_ret_code_t error code + * + * @return #mcumgr_err_t error code + */ +static int zephyr_basic_group_translate_error_code(uint16_t ret) { int rc; @@ -105,4 +94,25 @@ int zephyr_basic_group_translate_error_code(uint16_t ret) } #endif +static const struct mgmt_handler zephyr_mgmt_basic_handlers[] = { + [ZEPHYR_MGMT_GRP_BASIC_CMD_ERASE_STORAGE] = { + .mh_read = NULL, + .mh_write = storage_erase_handler, + }, +}; + +static struct mgmt_group zephyr_basic_mgmt_group = { + .mg_handlers = (struct mgmt_handler *)zephyr_mgmt_basic_handlers, + .mg_handlers_count = ARRAY_SIZE(zephyr_mgmt_basic_handlers), + .mg_group_id = (ZEPHYR_MGMT_GRP_BASIC), +#ifdef CONFIG_MCUMGR_SMP_SUPPORT_ORIGINAL_PROTOCOL + .mg_translate_error = zephyr_basic_group_translate_error_code, +#endif +}; + +static void zephyr_basic_mgmt_init(void) +{ + mgmt_register_group(&zephyr_basic_mgmt_group); +} + MCUMGR_HANDLER_DEFINE(zephyr_basic_mgmt, zephyr_basic_mgmt_init); diff --git a/subsys/mgmt/mcumgr/mgmt/src/mgmt.c b/subsys/mgmt/mcumgr/mgmt/src/mgmt.c index e83d948dca9..b2faf5ea81b 100644 --- a/subsys/mgmt/mcumgr/mgmt/src/mgmt.c +++ b/subsys/mgmt/mcumgr/mgmt/src/mgmt.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2018-2021 mcumgr authors - * Copyright (c) 2022 Nordic Semiconductor ASA + * Copyright (c) 2022-2023 Nordic Semiconductor ASA * * SPDX-License-Identifier: Apache-2.0 */ @@ -68,6 +68,30 @@ mgmt_find_handler(uint16_t group_id, uint16_t command_id) return &group->mg_handlers[command_id]; } +#if IS_ENABLED(CONFIG_MCUMGR_SMP_SUPPORT_ORIGINAL_PROTOCOL) +smp_translate_error_fn mgmt_find_error_translation_function(uint16_t group_id) +{ + struct mgmt_group *group = NULL; + sys_snode_t *snp, *sns; + + /* Find the group with the specified group ID. */ + SYS_SLIST_FOR_EACH_NODE_SAFE(&mgmt_group_list, snp, sns) { + struct mgmt_group *loop_group = + CONTAINER_OF(snp, struct mgmt_group, node); + if (loop_group->mg_group_id == group_id) { + group = loop_group; + break; + } + } + + if (group == NULL) { + return NULL; + } + + return group->mg_translate_error; +} +#endif + void mgmt_register_group(struct mgmt_group *group) { diff --git a/subsys/mgmt/mcumgr/smp/src/smp.c b/subsys/mgmt/mcumgr/smp/src/smp.c index 6107ef9ca1e..42bf633f09d 100644 --- a/subsys/mgmt/mcumgr/smp/src/smp.c +++ b/subsys/mgmt/mcumgr/smp/src/smp.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2018-2021 mcumgr authors - * Copyright (c) 2022 Nordic Semiconductor ASA + * Copyright (c) 2022-2023 Nordic Semiconductor ASA * * SPDX-License-Identifier: Apache-2.0 */ @@ -25,62 +25,26 @@ #include #endif -#ifdef CONFIG_MCUMGR_GRP_FS -#include -#endif -#ifdef CONFIG_MCUMGR_GRP_IMG -#include -#endif -#ifdef CONFIG_MCUMGR_GRP_OS -#include -#endif -#ifdef CONFIG_MCUMGR_GRP_SHELL -#include -#endif -#ifdef CONFIG_MCUMGR_GRP_STAT -#include -#endif -#ifdef CONFIG_MCUMGR_GRP_ZBASIC -#include -#endif - #ifdef CONFIG_MCUMGR_SMP_SUPPORT_ORIGINAL_PROTOCOL +/* + * @brief Translate SMP version 2 error code to legacy SMP version 1 MCUmgr error code. + * + * @param group #mcumgr_group_t group ID + * @param ret Group-specific error code + * + * @return #mcumgr_err_t error code + */ static int smp_translate_error_code(uint16_t group, uint16_t ret) { - switch (group) { -#ifdef CONFIG_MCUMGR_GRP_OS - case MGMT_GROUP_ID_OS: - return os_mgmt_translate_error_code(ret); -#endif + smp_translate_error_fn translate_error_function = NULL; -#ifdef CONFIG_MCUMGR_GRP_IMG - case MGMT_GROUP_ID_IMAGE: - return img_mgmt_translate_error_code(ret); -#endif + translate_error_function = mgmt_find_error_translation_function(group); -#ifdef CONFIG_MCUMGR_GRP_STAT - case MGMT_GROUP_ID_STAT: - return stat_mgmt_translate_error_code(ret); -#endif - -#ifdef CONFIG_MCUMGR_GRP_FS - case MGMT_GROUP_ID_FS: - return fs_mgmt_translate_error_code(ret); -#endif - -#ifdef CONFIG_MCUMGR_GRP_SHELL - case MGMT_GROUP_ID_SHELL: - return shell_mgmt_translate_error_code(ret); -#endif - -#ifdef CONFIG_MCUMGR_GRP_ZBASIC - case ZEPHYR_MGMT_GRP_BASIC: - return zephyr_basic_group_translate_error_code(ret); -#endif - - default: - return MGMT_ERR_EUNKNOWN; + if (translate_error_function == NULL) { + return MGMT_ERR_EUNKNOWN; } + + return translate_error_function(ret); } #endif