From c0fe4b57bfb654b2aec8d4ea9aa7c8c12f29b991 Mon Sep 17 00:00:00 2001 From: WanqQixiang Date: Thu, 28 Aug 2025 11:00:26 +0800 Subject: [PATCH] revert commit c91d9d5a `components/esp_matter: resize group data provider when ep count change` --- .../data_model/esp_matter_data_model.cpp | 45 ------------------- components/esp_matter/esp_matter_core.cpp | 16 +++++++ 2 files changed, 16 insertions(+), 45 deletions(-) diff --git a/components/esp_matter/data_model/esp_matter_data_model.cpp b/components/esp_matter/data_model/esp_matter_data_model.cpp index 754f85b21..d7b30ba13 100644 --- a/components/esp_matter/data_model/esp_matter_data_model.cpp +++ b/components/esp_matter/data_model/esp_matter_data_model.cpp @@ -31,7 +31,6 @@ #include "credentials/GroupDataProviderImpl.h" #define ESP_MATTER_MAX_DEVICE_TYPE_COUNT CONFIG_ESP_MATTER_MAX_DEVICE_TYPE_COUNT -#define MAX_GROUPS_PER_FABRIC_PER_ENDPOINT CONFIG_MAX_GROUPS_PER_FABRIC_PER_ENDPOINT static const char *TAG = "data_model"; @@ -291,44 +290,6 @@ static int get_next_index() return 0xFFFF; } -// global instance so that we can reset it when needed. -// We may need to reset it when new endpoint is added or existing endpoint is removed. -// This is specifically for bridged device. -static chip::Credentials::GroupDataProviderImpl *s_group_data_provider = nullptr; -static uint16_t s_groups_server_cluster_count = 0; - -static void resize_group_data_provider() -{ - // don't do anything if the count is the same - uint16_t groups_server_cluster_count = node::get_server_cluster_endpoint_count(chip::app::Clusters::Groups::Id); - if (s_groups_server_cluster_count == groups_server_cluster_count) { - return; - } - - s_groups_server_cluster_count = groups_server_cluster_count; - uint16_t max_groups_per_fabric = s_groups_server_cluster_count * MAX_GROUPS_PER_FABRIC_PER_ENDPOINT; - auto group_data_provider = new (std::nothrow) chip::Credentials::GroupDataProviderImpl(max_groups_per_fabric, CHIP_CONFIG_MAX_GROUP_KEYS_PER_FABRIC); - if (!group_data_provider) { - ESP_LOGE(TAG, "Failed to allocate memory for group data provider"); - return; - } - - group_data_provider->SetStorageDelegate(&chip::Server::GetInstance().GetPersistentStorage()); - group_data_provider->SetSessionKeystore(chip::Server::GetInstance().GetSessionKeystore()); - - // As we are re-using the persistent storage instance from the Server class instance, - // which has all the data from the previous endpoints, so no harm in re-sizing. - group_data_provider->Init(); - - // delete the old one if it exists - if (s_group_data_provider) { - delete s_group_data_provider; - } - - s_group_data_provider = group_data_provider; - chip::Credentials::SetGroupDataProvider(s_group_data_provider); -} - static esp_err_t disable(endpoint_t *endpoint) { /* Take lock if not already taken */ @@ -568,9 +529,6 @@ esp_err_t enable(endpoint_t *endpoint) } ESP_LOGI(TAG, "Dynamic endpoint %" PRIu16 " added", current_endpoint->endpoint_id); - // resize the group data provider to match the new endpoint count - resize_group_data_provider(); - return err; cleanup: @@ -1566,9 +1524,6 @@ esp_err_t destroy(node_t *node, endpoint_t *endpoint) } esp_matter_mem_free(current_endpoint); - // resize the group data provider to match the new endpoint count - resize_group_data_provider(); - return ESP_OK; } diff --git a/components/esp_matter/esp_matter_core.cpp b/components/esp_matter/esp_matter_core.cpp index 1e56eba03..876b799d8 100644 --- a/components/esp_matter/esp_matter_core.cpp +++ b/components/esp_matter/esp_matter_core.cpp @@ -65,6 +65,8 @@ using chip::DeviceLayer::GetDiagnosticDataProvider; using chip::DeviceLayer::ThreadStackMgr; #endif +#define MAX_GROUPS_PER_FABRIC_PER_ENDPOINT CONFIG_MAX_GROUPS_PER_FABRIC_PER_ENDPOINT + static const char *TAG = "esp_matter_core"; static bool esp_matter_started = false; @@ -219,6 +221,20 @@ static void esp_matter_chip_init_task(intptr_t context) initParams.testEventTriggerDelegate = test_event_trigger::get_delegate(); initParams.dataModelProvider = chip::app::CodegenDataModelProviderInstance(initParams.persistentStorageDelegate); +#ifdef CONFIG_ESP_MATTER_ENABLE_DATA_MODEL + { + // We should reserve one endpoint for root node endpoint + uint8_t max_groups_server_cluster_count = CONFIG_ESP_MATTER_MAX_DYNAMIC_ENDPOINT_COUNT - 1; + uint16_t max_groups_per_fabric = max_groups_server_cluster_count * MAX_GROUPS_PER_FABRIC_PER_ENDPOINT; + static chip::Credentials::GroupDataProviderImpl groupDataProvider(max_groups_per_fabric, + CHIP_CONFIG_MAX_GROUP_KEYS_PER_FABRIC); + groupDataProvider.SetStorageDelegate(initParams.persistentStorageDelegate); + groupDataProvider.SetSessionKeystore(initParams.sessionKeystore); + groupDataProvider.Init(); + initParams.groupDataProvider = &groupDataProvider; + } +#endif // CONFIG_ESP_MATTER_ENABLE_DATA_MODEL + CHIP_ERROR ret = chip::Server::GetInstance().GetFabricTable().AddFabricDelegate(&s_fabric_delegate); if (ret != CHIP_NO_ERROR) {