From 7b570c7fc1bf07072bde4804869032241fecf2a7 Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Wed, 14 Oct 2020 15:59:34 -0700 Subject: [PATCH] [notifier] signal change to active or pending Operational Dataset (#5657) --- include/openthread/instance.h | 4 +++- src/core/common/notifier.cpp | 8 ++++++++ src/core/common/notifier.hpp | 2 ++ src/core/meshcop/dataset_manager.cpp | 14 ++++++++++++++ src/core/meshcop/dataset_manager.hpp | 1 + 5 files changed, 28 insertions(+), 1 deletion(-) diff --git a/include/openthread/instance.h b/include/openthread/instance.h index 622e4999d..e0fd29426 100644 --- a/include/openthread/instance.h +++ b/include/openthread/instance.h @@ -53,7 +53,7 @@ extern "C" { * @note This number versions both OpenThread platform and user APIs. * */ -#define OPENTHREAD_API_VERSION (35) +#define OPENTHREAD_API_VERSION (36) /** * @addtogroup api-instance @@ -160,6 +160,8 @@ enum OT_CHANGED_THREAD_BACKBONE_ROUTER_STATE = 1 << 25, ///< Backbone Router state changed OT_CHANGED_THREAD_BACKBONE_ROUTER_LOCAL = 1 << 26, ///< Local Backbone Router configuration changed OT_CHANGED_JOINER_STATE = 1 << 27, ///< Joiner state changed + OT_CHANGED_ACTIVE_DATASET = 1 << 28, ///< Active Operational Dataset changed + OT_CHANGED_PENDING_DATASET = 1 << 29, ///< Pending Operational Dataset changed }; /** diff --git a/src/core/common/notifier.cpp b/src/core/common/notifier.cpp index 74c389163..9cc367002 100644 --- a/src/core/common/notifier.cpp +++ b/src/core/common/notifier.cpp @@ -353,6 +353,14 @@ const char *Notifier::EventToString(Event aEvent) const case kEventJoinerStateChanged: retval = "JoinerState"; break; + + case kEventActiveDatasetChanged: + retval = "ActDset"; + break; + + case kEventPendingDatasetChanged: + retval = "PndDset"; + break; } return retval; diff --git a/src/core/common/notifier.hpp b/src/core/common/notifier.hpp index 7778fd6d3..fe95f8867 100644 --- a/src/core/common/notifier.hpp +++ b/src/core/common/notifier.hpp @@ -92,6 +92,8 @@ enum Event kEventThreadBackboneRouterStateChanged = OT_CHANGED_THREAD_BACKBONE_ROUTER_STATE, ///< Backbone Router state changed kEventThreadBackboneRouterLocalChanged = OT_CHANGED_THREAD_BACKBONE_ROUTER_LOCAL, ///< Local Backbone Router changed kEventJoinerStateChanged = OT_CHANGED_JOINER_STATE, ///< Joiner state changed + kEventActiveDatasetChanged = OT_CHANGED_ACTIVE_DATASET, ///< Active Dataset changed + kEventPendingDatasetChanged = OT_CHANGED_PENDING_DATASET, ///< Pending Dataset changed }; /** diff --git a/src/core/meshcop/dataset_manager.cpp b/src/core/meshcop/dataset_manager.cpp index 304a272ff..594f85c5f 100644 --- a/src/core/meshcop/dataset_manager.cpp +++ b/src/core/meshcop/dataset_manager.cpp @@ -39,6 +39,7 @@ #include "common/instance.hpp" #include "common/locator-getters.hpp" #include "common/logging.hpp" +#include "common/notifier.hpp" #include "meshcop/meshcop.hpp" #include "meshcop/meshcop_tlvs.hpp" #include "radio/radio.hpp" @@ -102,6 +103,8 @@ otError DatasetManager::Restore(void) IgnoreError(dataset.ApplyConfiguration(GetInstance())); } + SignalDatasetChange(); + exit: return error; } @@ -124,6 +127,7 @@ void DatasetManager::Clear(void) mTimestampValid = false; mLocal.Clear(); mTimer.Stop(); + SignalDatasetChange(); } void DatasetManager::HandleDetach(void) @@ -167,6 +171,8 @@ otError DatasetManager::Save(const Dataset &aDataset) SendSet(); } + SignalDatasetChange(); + exit: return error; } @@ -218,6 +224,14 @@ void DatasetManager::HandleDatasetUpdated(void) default: break; } + + SignalDatasetChange(); +} + +void DatasetManager::SignalDatasetChange(void) const +{ + Get().Signal(mLocal.GetType() == Dataset::kActive ? kEventActiveDatasetChanged + : kEventPendingDatasetChanged); } otError DatasetManager::GetChannelMask(Mac::ChannelMask &aChannelMask) const diff --git a/src/core/meshcop/dataset_manager.hpp b/src/core/meshcop/dataset_manager.hpp index b30f6cf43..00dacb371 100644 --- a/src/core/meshcop/dataset_manager.hpp +++ b/src/core/meshcop/dataset_manager.hpp @@ -336,6 +336,7 @@ private: bool IsActiveDataset(void) const { return GetType() == Dataset::kActive; } bool IsPendingDataset(void) const { return GetType() == Dataset::kPending; } + void SignalDatasetChange(void) const; void HandleDatasetUpdated(void); void SendSet(void); void SendGetResponse(const Coap::Message & aRequest,