diff --git a/include/zephyr/mgmt/mcumgr/mgmt/mgmt.h b/include/zephyr/mgmt/mcumgr/mgmt/mgmt.h index 9a139b3a04b7..2b8c10c511dc 100644 --- a/include/zephyr/mgmt/mcumgr/mgmt/mgmt.h +++ b/include/zephyr/mgmt/mcumgr/mgmt/mgmt.h @@ -120,6 +120,13 @@ void mgmt_register_group(struct mgmt_group *group); */ void mgmt_unregister_group(struct mgmt_group *group); +/** + * @brief Get list of registered groups + * + * @return Pointer to list of registered groups + */ +sys_slist_t *mgmt_get_group_list(); + /** * @brief Finds a registered command handler. * diff --git a/subsys/mgmt/mcumgr/grp/CMakeLists.txt b/subsys/mgmt/mcumgr/grp/CMakeLists.txt index 50ecacb84587..35b457796d91 100644 --- a/subsys/mgmt/mcumgr/grp/CMakeLists.txt +++ b/subsys/mgmt/mcumgr/grp/CMakeLists.txt @@ -14,3 +14,4 @@ add_subdirectory_ifdef(CONFIG_MCUMGR_GRP_STAT stat_mgmt) add_subdirectory_ifdef(CONFIG_MCUMGR_GRP_SHELL shell_mgmt) add_subdirectory_ifdef(CONFIG_MCUMGR_GRP_ZBASIC zephyr_basic) add_subdirectory_ifdef(CONFIG_MCUMGR_GRP_SETTINGS settings_mgmt) +add_subdirectory_ifdef(CONFIG_MCUMGR_GRP_ENUM enum_mgmt) diff --git a/subsys/mgmt/mcumgr/grp/Kconfig b/subsys/mgmt/mcumgr/grp/Kconfig index 618a4701f620..0dffb63e7984 100644 --- a/subsys/mgmt/mcumgr/grp/Kconfig +++ b/subsys/mgmt/mcumgr/grp/Kconfig @@ -19,3 +19,5 @@ rsource "stat_mgmt/Kconfig" rsource "zephyr_basic/Kconfig" rsource "settings_mgmt/Kconfig" + +rsource "enum_mgmt/Kconfig" diff --git a/subsys/mgmt/mcumgr/grp/enum_mgmt/CMakeLists.txt b/subsys/mgmt/mcumgr/grp/enum_mgmt/CMakeLists.txt new file mode 100644 index 000000000000..fc64d4fdedf3 --- /dev/null +++ b/subsys/mgmt/mcumgr/grp/enum_mgmt/CMakeLists.txt @@ -0,0 +1,12 @@ +# +# Copyright (c) 2018-2021 mcumgr authors +# Copyright (c) 2024 Extreme Engineering Solutions +# +# SPDX-License-Identifier: Apache-2.0 + +# Enumeration management group public API is exported by MCUmgr interface API, +# when Enumeration Management is enabled. +zephyr_library(mgmt_mcumgr_grp_enum) +zephyr_library_sources(src/enum_mgmt.c) + +zephyr_library_include_directories(include) diff --git a/subsys/mgmt/mcumgr/grp/enum_mgmt/Kconfig b/subsys/mgmt/mcumgr/grp/enum_mgmt/Kconfig new file mode 100644 index 000000000000..29cd200b5116 --- /dev/null +++ b/subsys/mgmt/mcumgr/grp/enum_mgmt/Kconfig @@ -0,0 +1,9 @@ +# Copyright (c) 2024 Extreme Engineering Solutions, Inc. +# SPDX-License-Identifier: Apache-2.0 +# + +config MCUMGR_GRP_ENUM + bool "MCUmgr handlers for enumeration management" + help + Enables MCUmgr handlers for enumeration management. This includes + a single command which returns a list of all registered groups. diff --git a/subsys/mgmt/mcumgr/grp/enum_mgmt/src/enum_mgmt.c b/subsys/mgmt/mcumgr/grp/enum_mgmt/src/enum_mgmt.c new file mode 100644 index 000000000000..5119804f252b --- /dev/null +++ b/subsys/mgmt/mcumgr/grp/enum_mgmt/src/enum_mgmt.c @@ -0,0 +1,72 @@ +/** + * Copyright (c) - 2024 Extreme Engineering Solutions + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +#define ENUMERATION_MGMT_LIST 0 +#define ENUMERATION_MGMT_GP_ID 10 + +static bool encode_id(sys_snode_t *group_node, zcbor_state_t *zse) { + struct mgmt_group *group = CONTAINER_OF(group_node, struct mgmt_group, node); + return zcbor_uint32_put(group->mg_group_id); +} + +static int enumeration_mgmt_list(struct smp_streamer *ctxt) +{ + zcbor_state_t *zse = ctxt->writer->zs; + sys_slist_t *groups; + sys_snode_t *snp, *sns; + int count; + + groups = mgmt_get_group_list(); + count = sys_slist_len(groups); + + ok = zcbor_tstr_put_lit(zse, "groups") && + zcbor_list_start_encode(zse, count); + + SYS_SLIST_FOR_EACH_NODE_SAFE(&groups, snp, sns) { + ok = encode_id(sns, zse); + if (!ok) { + return MGMT_ERR_EBADSTATE; + } + } + + ok = zcbor_list_end_encode(zse, count); + + return ok ? MGMT_ERR_EOK : MGMT_ERR_ECORRUPT; +} + +static const struct mgmt_handler enumeration_mgmt_group_handlers[] = { + [ENUMERATION_MGMT_LIST] = {enumeration_mgmt_list, NULL}, +}; + +static struct mgmt_group enumeration_mgmt_group = { + .mg_handlers = enumeration_mgmt_group_handlers, + .mg_handlers_count = ARRAY_SIZE(enumeration_mgmt_group_handlers), + .mg_group_id = ENUMERATION_MGMT_GP_ID, +}; + +static void enumeration_mgmt_register_group(void) +{ + mgmt_register_group(&enumeration_mgmt_group); +} + +MCUMGR_HANDLER_DEFINE(enumerationg_mgmt, enumeration_mgmt_register_group); diff --git a/subsys/mgmt/mcumgr/mgmt/src/mgmt.c b/subsys/mgmt/mcumgr/mgmt/src/mgmt.c index adb2c8e4bcbe..42d647207eac 100644 --- a/subsys/mgmt/mcumgr/mgmt/src/mgmt.c +++ b/subsys/mgmt/mcumgr/mgmt/src/mgmt.c @@ -1,6 +1,7 @@ /* * Copyright (c) 2018-2021 mcumgr authors * Copyright (c) 2022-2023 Nordic Semiconductor ASA + * Copyright (c) 2024 Extreme Engineering Solutions * * SPDX-License-Identifier: Apache-2.0 */ @@ -29,7 +30,7 @@ static sys_slist_t mgmt_callback_list = void mgmt_unregister_group(struct mgmt_group *group) { - (void)sys_slist_find_and_remove(&mgmt_group_list, &group->node); + sys_slist_find_and_remove(&mgmt_group_list, &group->node); } const struct mgmt_handler * @@ -133,6 +134,11 @@ mgmt_register_group(struct mgmt_group *group) sys_slist_append(&mgmt_group_list, &group->node); } +sys_slist_t *mgmt_get_group_list() +{ + return &mgmt_group_list; +} + #if defined(CONFIG_MCUMGR_MGMT_NOTIFICATION_HOOKS) void mgmt_callback_register(struct mgmt_callback *callback) {