diff --git a/components/openthread/include/esp_openthread_types.h b/components/openthread/include/esp_openthread_types.h index e046c4606f..debc464066 100644 --- a/components/openthread/include/esp_openthread_types.h +++ b/components/openthread/include/esp_openthread_types.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -46,6 +46,7 @@ typedef enum { OPENTHREAD_EVENT_SET_DNS_SERVER, /*!< OpenThread stack set DNS server >*/ OPENTHREAD_EVENT_PUBLISH_MESHCOP_E, /*!< OpenThread stack start to publish meshcop-e service >*/ OPENTHREAD_EVENT_REMOVE_MESHCOP_E, /*!< OpenThread stack start to remove meshcop-e service >*/ + OPENTHREAD_EVENT_DATASET_CHANGED, /*!< OpenThread dataset changed >*/ } esp_openthread_event_t; /** @@ -63,6 +64,24 @@ typedef struct { otDeviceRole current_role; /*!< Current Thread role */ } esp_openthread_role_changed_event_t; +/** + * @brief OpenThread dataset type + * + */ +typedef enum { + OPENTHREAD_ACTIVE_DATASET, /*!< Active dataset */ + OPENTHREAD_PENDING_DATASET, /*!< Pending dataset */ +} esp_openthread_dataset_type_t; + +/** + * @brief OpenThread dataset changed event data + * + */ +typedef struct { + esp_openthread_dataset_type_t type; /*!< Dataset type */ + otOperationalDataset new_dataset; /*!< New dataset */ +} esp_openthread_dataset_changed_event_t; + /** * This structure represents a context for a select() based mainloop. * diff --git a/components/openthread/src/port/esp_openthread_state.c b/components/openthread/src/port/esp_openthread_state.c index 6dbe101670..7d04cba9f5 100644 --- a/components/openthread/src/port/esp_openthread_state.c +++ b/components/openthread/src/port/esp_openthread_state.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -80,6 +80,21 @@ exit: s_previous_role = role; } +static void handle_ot_dataset_change(esp_openthread_dataset_type_t type, otInstance *instance) +{ + esp_openthread_dataset_changed_event_t event_data; + event_data.type = type; + memset(&event_data.new_dataset, 0, sizeof(event_data.new_dataset)); + if (type == OPENTHREAD_ACTIVE_DATASET) { + (void)otDatasetGetActive(instance, &event_data.new_dataset); + } else if (type == OPENTHREAD_PENDING_DATASET) { + (void)otDatasetGetPending(instance, &event_data.new_dataset); + } + if (esp_event_post(OPENTHREAD_EVENT, OPENTHREAD_EVENT_DATASET_CHANGED, &event_data, sizeof(event_data), 0) != ESP_OK) { + ESP_LOGE(TAG, "Failed to post dataset changed event"); + } +} + static void ot_state_change_callback(otChangedFlags changed_flags, void* ctx) { OT_UNUSED_VARIABLE(ctx); @@ -99,6 +114,14 @@ static void ot_state_change_callback(otChangedFlags changed_flags, void* ctx) if (changed_flags & OT_CHANGED_THREAD_NETIF_STATE) { handle_ot_netif_state_change(instance); } + + if (changed_flags & OT_CHANGED_ACTIVE_DATASET) { + handle_ot_dataset_change(OPENTHREAD_ACTIVE_DATASET, instance); + } + + if (changed_flags & OT_CHANGED_PENDING_DATASET) { + handle_ot_dataset_change(OPENTHREAD_PENDING_DATASET, instance); + } } esp_err_t esp_openthread_state_event_init(otInstance* instance)