[dataset] move ApplyConfiguration() to DatasetManager (#10280)

This commit moves the implementation of `ApplyConfiguration()` from
the `Dataset` class to `DatasetManager`. This aligns better with the
responsibility of the `DatasetManager` class (managing the active and
pending dataset and being an `InstanceLocator`), keeping the
`Dataset` class focused on providing helper functions related to TLVs
in the Dataset: finding TLVs, reading TLV values, writing/updating
TLVs, etc.
This commit is contained in:
Abtin Keshavarzian
2024-05-21 13:27:14 -07:00
committed by GitHub
parent b01b262a5c
commit 8b04e9ca73
4 changed files with 68 additions and 80 deletions
-66
View File
@@ -585,72 +585,6 @@ void Dataset::RemoveTlv(Tlv *aTlv)
}
}
Error Dataset::ApplyConfiguration(Instance &aInstance) const
{
Mac::Mac &mac = aInstance.Get<Mac::Mac>();
KeyManager &keyManager = aInstance.Get<KeyManager>();
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<uint8_t>(cur->ReadValueAs<ChannelTlv>().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<PanIdTlv>());
break;
case Tlv::kExtendedPanId:
aInstance.Get<ExtendedPanIdManager>().SetExtPanId(cur->ReadValueAs<ExtendedPanIdTlv>());
break;
case Tlv::kNetworkName:
IgnoreError(aInstance.Get<NetworkNameManager>().SetNetworkName(As<NetworkNameTlv>(cur)->GetNetworkName()));
break;
case Tlv::kNetworkKey:
keyManager.SetNetworkKey(cur->ReadValueAs<NetworkKeyTlv>());
break;
#if OPENTHREAD_FTD
case Tlv::kPskc:
keyManager.SetPskc(cur->ReadValueAs<PskcTlv>());
break;
#endif
case Tlv::kMeshLocalPrefix:
aInstance.Get<Mle::MleRouter>().SetMeshLocalPrefix(cur->ReadValueAs<MeshLocalPrefixTlv>());
break;
case Tlv::kSecurityPolicy:
keyManager.SetSecurityPolicy(As<SecurityPolicyTlv>(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
-11
View File
@@ -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.
*
+67 -3
View File
@@ -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<uint8_t>(cur->ReadValueAs<ChannelTlv>().GetChannel());
error = Get<Mac::Mac>().SetPanChannel(channel);
if (error != kErrorNone)
{
LogWarn("ApplyConfiguration() Failed to set channel to %d (%s)", channel, ErrorToString(error));
ExitNow();
}
break;
}
case Tlv::kPanId:
Get<Mac::Mac>().SetPanId(cur->ReadValueAs<PanIdTlv>());
break;
case Tlv::kExtendedPanId:
Get<ExtendedPanIdManager>().SetExtPanId(cur->ReadValueAs<ExtendedPanIdTlv>());
break;
case Tlv::kNetworkName:
IgnoreError(Get<NetworkNameManager>().SetNetworkName(As<NetworkNameTlv>(cur)->GetNetworkName()));
break;
case Tlv::kNetworkKey:
Get<KeyManager>().SetNetworkKey(cur->ReadValueAs<NetworkKeyTlv>());
break;
#if OPENTHREAD_FTD
case Tlv::kPskc:
Get<KeyManager>().SetPskc(cur->ReadValueAs<PskcTlv>());
break;
#endif
case Tlv::kMeshLocalPrefix:
Get<Mle::MleRouter>().SetMeshLocalPrefix(cur->ReadValueAs<MeshLocalPrefixTlv>());
break;
case Tlv::kSecurityPolicy:
Get<KeyManager>().SetSecurityPolicy(As<SecurityPolicyTlv>(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));
}
}
+1
View File
@@ -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);