diff --git a/src/core/meshcop/dataset.cpp b/src/core/meshcop/dataset.cpp index f63b41254..6de70073c 100644 --- a/src/core/meshcop/dataset.cpp +++ b/src/core/meshcop/dataset.cpp @@ -585,72 +585,6 @@ void Dataset::RemoveTlv(Tlv *aTlv) } } -Error Dataset::ApplyConfiguration(Instance &aInstance) const -{ - Mac::Mac &mac = aInstance.Get(); - KeyManager &keyManager = aInstance.Get(); - Error error = kErrorNone; - - SuccessOrExit(error = ValidateTlvs()); - - for (const Tlv *cur = GetTlvsStart(); cur < GetTlvsEnd(); cur = cur->GetNext()) - { - switch (cur->GetType()) - { - case Tlv::kChannel: - { - uint8_t channel = static_cast(cur->ReadValueAs().GetChannel()); - - error = mac.SetPanChannel(channel); - - if (error != kErrorNone) - { - LogWarn("ApplyConfiguration() Failed to set channel to %d (%s)", channel, ErrorToString(error)); - ExitNow(); - } - - break; - } - - case Tlv::kPanId: - mac.SetPanId(cur->ReadValueAs()); - break; - - case Tlv::kExtendedPanId: - aInstance.Get().SetExtPanId(cur->ReadValueAs()); - break; - - case Tlv::kNetworkName: - IgnoreError(aInstance.Get().SetNetworkName(As(cur)->GetNetworkName())); - break; - - case Tlv::kNetworkKey: - keyManager.SetNetworkKey(cur->ReadValueAs()); - break; - -#if OPENTHREAD_FTD - case Tlv::kPskc: - keyManager.SetPskc(cur->ReadValueAs()); - break; -#endif - - case Tlv::kMeshLocalPrefix: - aInstance.Get().SetMeshLocalPrefix(cur->ReadValueAs()); - break; - - case Tlv::kSecurityPolicy: - keyManager.SetSecurityPolicy(As(cur)->GetSecurityPolicy()); - break; - - default: - break; - } - } - -exit: - return error; -} - const char *Dataset::TypeToString(Type aType) { return (aType == kActive) ? "Active" : "Pending"; } #if OPENTHREAD_CONFIG_PLATFORM_KEY_REFERENCES_ENABLE diff --git a/src/core/meshcop/dataset.hpp b/src/core/meshcop/dataset.hpp index 4fd007060..515d66709 100644 --- a/src/core/meshcop/dataset.hpp +++ b/src/core/meshcop/dataset.hpp @@ -636,17 +636,6 @@ public: */ Error SetFrom(const Message &aMessage, uint16_t aOffset, uint16_t aLength); - /** - * Applies the Active or Pending Dataset to the Thread interface. - * - * @param[in] aInstance A reference to the OpenThread instance. - * - * @retval kErrorNone Successfully applied configuration. - * @retval kErrorParse The dataset has at least one TLV with invalid format. - * - */ - Error ApplyConfiguration(Instance &aInstance) const; - /** * Returns a pointer to the start of Dataset TLVs sequence. * diff --git a/src/core/meshcop/dataset_manager.cpp b/src/core/meshcop/dataset_manager.cpp index dd7f74eb8..04800bed5 100644 --- a/src/core/meshcop/dataset_manager.cpp +++ b/src/core/meshcop/dataset_manager.cpp @@ -98,7 +98,7 @@ Error DatasetManager::Restore(void) if (IsActiveDataset()) { - IgnoreError(dataset.ApplyConfiguration(GetInstance())); + IgnoreError(ApplyConfiguration(dataset)); } SignalDatasetChange(); @@ -172,7 +172,71 @@ Error DatasetManager::ApplyConfiguration(void) const Dataset dataset; SuccessOrExit(error = Read(dataset)); - SuccessOrExit(error = dataset.ApplyConfiguration(GetInstance())); + error = ApplyConfiguration(dataset); + +exit: + return error; +} + +Error DatasetManager::ApplyConfiguration(const Dataset &aDataset) const +{ + Error error = kErrorNone; + + SuccessOrExit(error = aDataset.ValidateTlvs()); + + for (const Tlv *cur = aDataset.GetTlvsStart(); cur < aDataset.GetTlvsEnd(); cur = cur->GetNext()) + { + switch (cur->GetType()) + { + case Tlv::kChannel: + { + uint8_t channel = static_cast(cur->ReadValueAs().GetChannel()); + + error = Get().SetPanChannel(channel); + + if (error != kErrorNone) + { + LogWarn("ApplyConfiguration() Failed to set channel to %d (%s)", channel, ErrorToString(error)); + ExitNow(); + } + + break; + } + + case Tlv::kPanId: + Get().SetPanId(cur->ReadValueAs()); + break; + + case Tlv::kExtendedPanId: + Get().SetExtPanId(cur->ReadValueAs()); + break; + + case Tlv::kNetworkName: + IgnoreError(Get().SetNetworkName(As(cur)->GetNetworkName())); + break; + + case Tlv::kNetworkKey: + Get().SetNetworkKey(cur->ReadValueAs()); + break; + +#if OPENTHREAD_FTD + case Tlv::kPskc: + Get().SetPskc(cur->ReadValueAs()); + break; +#endif + + case Tlv::kMeshLocalPrefix: + Get().SetMeshLocalPrefix(cur->ReadValueAs()); + break; + + case Tlv::kSecurityPolicy: + Get().SetSecurityPolicy(As(cur)->GetSecurityPolicy()); + break; + + default: + break; + } + } exit: return error; @@ -237,7 +301,7 @@ Error DatasetManager::Save(const Dataset &aDataset, bool aAllowOlderTimestamp) if (IsActiveDataset()) { - SuccessOrExit(error = aDataset.ApplyConfiguration(GetInstance())); + SuccessOrExit(error = ApplyConfiguration(aDataset)); } } diff --git a/src/core/meshcop/dataset_manager.hpp b/src/core/meshcop/dataset_manager.hpp index effdcb02c..5a683d045 100644 --- a/src/core/meshcop/dataset_manager.hpp +++ b/src/core/meshcop/dataset_manager.hpp @@ -300,6 +300,7 @@ private: bool IsActiveDataset(void) const { return (mType == Dataset::kActive); } bool IsPendingDataset(void) const { return (mType == Dataset::kPending); } void Clear(void); + Error ApplyConfiguration(const Dataset &aDataset) const; void HandleGet(const Coap::Message &aMessage, const Ip6::MessageInfo &aMessageInfo) const; void HandleTimer(void); Error Save(const Dataset &aDataset, bool aAllowOlderTimestamp);