[dataset] simplify dataset Save() methods (#10227)

This commit streamlines dataset-related helper methods:

- Renames all methods that save local dataset to `SaveLocal()` for
  consistency and to distinguish them from `Save()` methods, which
  set the partition's dataset and perform additional checks
  (e.g., ensuring the timestamp is ahead).
- Renames `SendSet()` to `SyncLocalWithLeader()` and passes `aDataset`
  as an input parameter to avoid redundant dataset reads.
- Removes the now unnecessary `HandleDatasetUpdated()` method, as its
  functionality can be inlined within `SaveLocal(const Dataset &)`.
- Consolidates additional dataset type-specific actions(e.g., starting
  a delay timer for Pending Dataset changes) into the base class
  `DatasetManager` methods `Save()` and `SaveLocal()`, simplifying
  the code and reducing redundancy.
- Modifies `DatasetLocal` to provide a single `Save()` method with a
  `const Dataset &` input. `DatasetManager` now handles conversions
  from various dataset representations (e.g., component-wise
  structures or TLV sequences).
This commit is contained in:
Abtin Keshavarzian
2024-05-14 12:12:18 -07:00
committed by GitHub
parent e27885ecb4
commit 83e2732bae
9 changed files with 152 additions and 321 deletions
+4 -4
View File
@@ -61,14 +61,14 @@ otError otDatasetGetActiveTlvs(otInstance *aInstance, otOperationalDatasetTlvs *
otError otDatasetSetActive(otInstance *aInstance, const otOperationalDataset *aDataset)
{
return AsCoreType(aInstance).Get<MeshCoP::ActiveDatasetManager>().Save(AsCoreType(aDataset));
return AsCoreType(aInstance).Get<MeshCoP::ActiveDatasetManager>().SaveLocal(AsCoreType(aDataset));
}
otError otDatasetSetActiveTlvs(otInstance *aInstance, const otOperationalDatasetTlvs *aDataset)
{
AssertPointerIsNotNull(aDataset);
return AsCoreType(aInstance).Get<MeshCoP::ActiveDatasetManager>().Save(*aDataset);
return AsCoreType(aInstance).Get<MeshCoP::ActiveDatasetManager>().SaveLocal(*aDataset);
}
otError otDatasetGetPending(otInstance *aInstance, otOperationalDataset *aDataset)
@@ -85,14 +85,14 @@ otError otDatasetGetPendingTlvs(otInstance *aInstance, otOperationalDatasetTlvs
otError otDatasetSetPending(otInstance *aInstance, const otOperationalDataset *aDataset)
{
return AsCoreType(aInstance).Get<MeshCoP::PendingDatasetManager>().Save(AsCoreType(aDataset));
return AsCoreType(aInstance).Get<MeshCoP::PendingDatasetManager>().SaveLocal(AsCoreType(aDataset));
}
otError otDatasetSetPendingTlvs(otInstance *aInstance, const otOperationalDatasetTlvs *aDataset)
{
AssertPointerIsNotNull(aDataset);
return AsCoreType(aInstance).Get<MeshCoP::PendingDatasetManager>().Save(*aDataset);
return AsCoreType(aInstance).Get<MeshCoP::PendingDatasetManager>().SaveLocal(*aDataset);
}
otError otDatasetSendMgmtActiveGet(otInstance *aInstance,
-24
View File
@@ -146,30 +146,6 @@ exit:
return error;
}
Error DatasetLocal::Save(const Dataset::Info &aDatasetInfo)
{
Error error;
Dataset dataset;
dataset.SetFrom(aDatasetInfo);
SuccessOrExit(error = Save(dataset));
exit:
return error;
}
Error DatasetLocal::Save(const Dataset::Tlvs &aDatasetTlvs)
{
Error error = kErrorNone;
Dataset dataset;
SuccessOrExit(error = dataset.SetFrom(aDatasetTlvs));
error = Save(dataset);
exit:
return error;
}
Error DatasetLocal::Save(const Dataset &aDataset)
{
Error error = kErrorNone;
-23
View File
@@ -150,29 +150,6 @@ public:
*/
TimeMilli GetUpdateTime(void) const { return mUpdateTime; }
/**
* Stores the dataset into non-volatile memory.
*
* @param[in] aDatasetInfo The Dataset to save as `Dataset::Info`.
*
* @retval kErrorNone Successfully saved the dataset.
* @retval kErrorNotImplemented The platform does not implement settings functionality.
*
*/
Error Save(const Dataset::Info &aDatasetInfo);
/**
* Stores the dataset into non-volatile memory.
*
* @param[in] aDatasetTlvs The Dataset to save as `Dataset::Tlvs`.
*
* @retval kErrorNone Successfully saved the dataset.
* @retval kErrorInvalidArgs The dataset TLVs is invalid, its length is longer than `Dataset::kMaxLength`.
* @retval kErrorNotImplemented The platform does not implement settings functionality.
*
*/
Error Save(const Dataset::Tlvs &aDatasetTlvs);
/**
* Stores the dataset into non-volatile memory.
*
+78 -102
View File
@@ -115,6 +115,34 @@ void DatasetManager::Clear(void)
void DatasetManager::HandleDetach(void) { IgnoreError(Restore()); }
Error DatasetManager::Save(const Timestamp &aTimestamp, const Message &aMessage, uint16_t aOffset, uint16_t aLength)
{
Error error = kErrorNone;
Dataset dataset;
SuccessOrExit(error = dataset.SetFrom(aMessage, aOffset, aLength));
SuccessOrExit(error = dataset.ValidateTlvs());
if (IsActiveDataset())
{
SuccessOrExit(error = dataset.Write<ActiveTimestampTlv>(aTimestamp));
}
else
{
SuccessOrExit(error = dataset.Write<PendingTimestampTlv>(aTimestamp));
}
SuccessOrExit(error = Save(dataset));
if (IsPendingDataset())
{
Get<PendingDatasetManager>().StartDelayTimer(dataset);
}
exit:
return error;
}
Error DatasetManager::Save(const Dataset &aDataset)
{
Error error = kErrorNone;
@@ -152,23 +180,22 @@ exit:
return error;
}
Error DatasetManager::Save(const Dataset::Info &aDatasetInfo)
Error DatasetManager::SaveLocal(const Dataset::Info &aDatasetInfo)
{
Error error;
Dataset dataset;
SuccessOrExit(error = mLocal.Save(aDatasetInfo));
HandleDatasetUpdated();
dataset.SetFrom(aDatasetInfo);
exit:
return error;
return SaveLocal(dataset);
}
Error DatasetManager::Save(const Dataset::Tlvs &aDatasetTlvs)
Error DatasetManager::SaveLocal(const Dataset::Tlvs &aDatasetTlvs)
{
Error error;
Error error;
Dataset dataset;
SuccessOrExit(error = mLocal.Save(aDatasetTlvs));
HandleDatasetUpdated();
SuccessOrExit(error = dataset.SetFrom(aDatasetTlvs));
error = SaveLocal(dataset);
exit:
return error;
@@ -179,14 +206,12 @@ Error DatasetManager::SaveLocal(const Dataset &aDataset)
Error error;
SuccessOrExit(error = mLocal.Save(aDataset));
HandleDatasetUpdated();
exit:
return error;
}
if (IsPendingDataset())
{
Get<PendingDatasetManager>().StartDelayTimer(aDataset);
}
void DatasetManager::HandleDatasetUpdated(void)
{
switch (Get<Mle::MleRouter>().GetRole())
{
case Mle::kRoleDisabled:
@@ -194,11 +219,11 @@ void DatasetManager::HandleDatasetUpdated(void)
break;
case Mle::kRoleChild:
SendSet();
SyncLocalWithLeader(aDataset);
break;
#if OPENTHREAD_FTD
case Mle::kRoleRouter:
SendSet();
SyncLocalWithLeader(aDataset);
break;
case Mle::kRoleLeader:
@@ -212,6 +237,9 @@ void DatasetManager::HandleDatasetUpdated(void)
}
SignalDatasetChange();
exit:
return error;
}
void DatasetManager::SignalDatasetChange(void) const
@@ -240,13 +268,25 @@ exit:
return error;
}
void DatasetManager::HandleTimer(void) { SendSet(); }
void DatasetManager::SendSet(void)
void DatasetManager::HandleTimer(void)
{
Error error = kErrorNone;
Dataset dataset;
SuccessOrExit(Read(dataset));
SyncLocalWithLeader(dataset);
exit:
return;
}
void DatasetManager::SyncLocalWithLeader(const Dataset &aDataset)
{
// Attempts to synchronize the local Dataset with the leader by
// sending `MGMT_SET` command if the local Dataset's timestamp is
// newer.
Error error = kErrorNone;
VerifyOrExit(!mMgmtPending, error = kErrorBusy);
VerifyOrExit(Get<Mle::MleRouter>().IsChild() || Get<Mle::MleRouter>().IsRouter(), error = kErrorInvalidState);
@@ -267,9 +307,7 @@ void DatasetManager::SendSet(void)
}
}
IgnoreError(Read(dataset));
error = SendSetRequest(dataset);
error = SendSetRequest(aDataset);
exit:
if (error == kErrorNoBufs)
@@ -572,23 +610,6 @@ exit:
return isValid;
}
Error ActiveDatasetManager::Save(const Timestamp &aTimestamp,
const Message &aMessage,
uint16_t aOffset,
uint16_t aLength)
{
Error error = kErrorNone;
Dataset dataset;
SuccessOrExit(error = dataset.SetFrom(aMessage, aOffset, aLength));
SuccessOrExit(error = dataset.ValidateTlvs());
SuccessOrExit(error = dataset.Write<ActiveTimestampTlv>(aTimestamp));
error = DatasetManager::Save(dataset);
exit:
return error;
}
template <>
void ActiveDatasetManager::HandleTmf<kUriActiveGet>(Coap::Message &aMessage, const Ip6::MessageInfo &aMessageInfo)
{
@@ -621,73 +642,28 @@ void PendingDatasetManager::ClearNetwork(void)
IgnoreError(DatasetManager::Save(dataset));
}
Error PendingDatasetManager::Save(const Dataset::Info &aDatasetInfo)
{
Error error;
SuccessOrExit(error = DatasetManager::Save(aDatasetInfo));
StartDelayTimer();
exit:
return error;
}
Error PendingDatasetManager::Save(const Dataset::Tlvs &aDatasetTlvs)
{
Error error;
SuccessOrExit(error = DatasetManager::Save(aDatasetTlvs));
StartDelayTimer();
exit:
return error;
}
Error PendingDatasetManager::Save(const Dataset &aDataset)
{
Error error;
SuccessOrExit(error = DatasetManager::SaveLocal(aDataset));
StartDelayTimer();
exit:
return error;
}
Error PendingDatasetManager::Save(const Timestamp &aTimestamp,
const Message &aMessage,
uint16_t aOffset,
uint16_t aLength)
{
Error error = kErrorNone;
Dataset dataset;
SuccessOrExit(error = dataset.SetFrom(aMessage, aOffset, aLength));
SuccessOrExit(error = dataset.ValidateTlvs());
SuccessOrExit(dataset.Write<PendingTimestampTlv>(aTimestamp));
SuccessOrExit(error = DatasetManager::Save(dataset));
StartDelayTimer();
exit:
return error;
}
void PendingDatasetManager::StartDelayTimer(void)
{
Tlv *tlv;
uint32_t delay;
Dataset dataset;
Dataset dataset;
IgnoreError(Read(dataset));
SuccessOrExit(Read(dataset));
StartDelayTimer(dataset);
exit:
return;
}
void PendingDatasetManager::StartDelayTimer(const Dataset &aDataset)
{
uint32_t delay;
mDelayTimer.Stop();
tlv = dataset.FindTlv(Tlv::kDelayTimer);
VerifyOrExit(tlv != nullptr);
SuccessOrExit(aDataset.Read<DelayTimerTlv>(delay));
delay = Min(tlv->ReadValueAs<DelayTimerTlv>(), DelayTimerTlv::kMaxDelay);
delay = Min(delay, DelayTimerTlv::kMaxDelay);
mDelayTimer.StartAt(dataset.GetUpdateTime(), delay);
mDelayTimer.StartAt(aDataset.GetUpdateTime(), delay);
LogInfo("delay timer started %lu", ToUlong(delay));
exit:
@@ -703,7 +679,7 @@ void PendingDatasetManager::HandleDelayTimer(void)
dataset.ConvertToActive();
Get<ActiveDatasetManager>().Save(dataset);
IgnoreError(Get<ActiveDatasetManager>().Save(dataset));
Clear();
}
+66 -164
View File
@@ -110,6 +110,70 @@ public:
*/
Error Read(Dataset::Tlvs &aDatasetTlvs) const { return mLocal.Read(aDatasetTlvs); }
/**
* Saves the Operational Dataset in non-volatile memory.
*
* @param[in] aDataset The Operational Dataset.
*
* @retval kErrorNone Successfully applied configuration.
* @retval kErrorParse The dataset has at least one TLV with invalid format.
*
*/
Error SaveLocal(const Dataset &aDataset);
/**
* Saves the Operational Dataset in non-volatile memory.
*
* @param[in] aDatasetInfo The Operational Dataset as `Dataset::Info`.
*
* @retval kErrorNone Successfully saved the dataset.
* @retval kErrorNotImplemented The platform does not implement settings functionality.
*
*/
Error SaveLocal(const Dataset::Info &aDatasetInfo);
/**
* Saves the Operational Dataset in non-volatile memory.
*
* @param[in] aDatasetTlvs The Operational Dataset as `Dataset::Tlvs`.
*
* @retval kErrorNone Successfully saved the dataset.
* @retval kErrorNotImplemented The platform does not implement settings functionality.
*
*/
Error SaveLocal(const Dataset::Tlvs &aDatasetTlvs);
/**
* Sets the Operational Dataset for the partition.
*
* Also updates the non-volatile local version if the partition's Operational Dataset is newer. If Active
* Operational Dataset is changed, applies the configuration to to Thread interface.
*
* @param[in] aDataset The Operational Dataset.
*
* @retval kErrorNone Successfully applied configuration.
* @retval kErrorParse The dataset has at least one TLV with invalid format.
*
*/
Error Save(const Dataset &aDataset);
/**
* Sets the Operational Dataset for the partition read from a given message.
*
* Also updates the non-volatile local version if the partition's Operational Dataset is newer. If Active
* Operational Dataset is changed, applies the configuration to to Thread interface.
*
* @param[in] aTimestamp The timestamp for the Operational Dataset.
* @param[in] aMessage The message to read from.
* @param[in] aOffset The offset where the Operational Dataset begins.
* @param[in] aLength The length of the Operational Dataset.
*
* @retval kErrorNone Successfully parsed the Dataset from the @p aMessage and saved it.
* @retval kErrorParse Could not parse the Dataset from @p aMessage.
*
*/
Error Save(const Timestamp &aTimestamp, const Message &aMessage, uint16_t aOffset, uint16_t aLength);
/**
* Retrieves the channel mask from local dataset.
*
@@ -212,66 +276,6 @@ protected:
*/
void Clear(void);
/**
* Saves the Operational Dataset in non-volatile memory.
*
* @param[in] aDataset The Operational Dataset.
*
* @retval kErrorNone Successfully applied configuration.
* @retval kErrorParse The dataset has at least one TLV with invalid format.
*
*/
Error Save(const Dataset &aDataset);
/**
* Saves the Operational Dataset in non-volatile memory.
*
* @param[in] aDatasetInfo The Operational Dataset as `Dataset::Info`.
*
* @retval kErrorNone Successfully saved the dataset.
* @retval kErrorNotImplemented The platform does not implement settings functionality.
*
*/
Error Save(const Dataset::Info &aDatasetInfo);
/**
* Saves the Operational Dataset in non-volatile memory.
*
* @param[in] aDatasetTlvs The Operational Dataset as `Dataset::Tlvs`.
*
* @retval kErrorNone Successfully saved the dataset.
* @retval kErrorNotImplemented The platform does not implement settings functionality.
*
*/
Error Save(const Dataset::Tlvs &aDatasetTlvs);
/**
* Sets the Operational Dataset for the partition.
*
* Also updates the non-volatile version if the partition's Operational Dataset is newer.
*
* @param[in] aTimestamp The timestamp for the Operational Dataset.
* @param[in] aMessage The message buffer.
* @param[in] aOffset The offset where the Operational Dataset begins.
* @param[in] aLength The length of the Operational Dataset.
*
* @retval kErrorNone Successfully parsed the Dataset from the @p aMessage and saved it.
* @retval kErrorParse Could not parse the Dataset from @p aMessage.
*
*/
Error Save(const Timestamp &aTimestamp, const Message &aMessage, uint16_t aOffset, uint8_t aLength);
/**
* Saves the Operational Dataset in non-volatile memory.
*
* @param[in] aDataset The Operational Dataset.
*
* @retval kErrorNone Successfully applied configuration.
* @retval kErrorParse The dataset has at least one TLV with invalid format.
*
*/
Error SaveLocal(const Dataset &aDataset);
/**
* Handles a MGMT_GET request message.
*
@@ -341,7 +345,6 @@ private:
bool mAffectsNetworkKey;
};
#endif
static void HandleMgmtSetResponse(void *aContext,
otMessage *aMessage,
const otMessageInfo *aMessageInfo,
@@ -351,8 +354,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 SyncLocalWithLeader(const Dataset &aDataset);
Error SendSetRequest(const Dataset &aDataset);
void SendGetResponse(const Coap::Message &aRequest,
const Ip6::MessageInfo &aMessageInfo,
@@ -423,55 +425,6 @@ public:
*/
void Clear(void) { DatasetManager::Clear(); }
/**
* Saves the Operational Dataset in non-volatile memory.
*
* Also reconfigures the Thread interface.
*
* @param[in] aDataset The Operational Dataset.
*
*/
void Save(const Dataset &aDataset) { IgnoreError(DatasetManager::Save(aDataset)); }
/**
* Sets the Operational Dataset for the partition.
*
* Also reconfigures the Thread interface.
* Also updates the non-volatile version if the partition's Operational Dataset is newer.
*
* @param[in] aTimestamp The timestamp for the Operational Dataset.
* @param[in] aMessage The message buffer.
* @param[in] aOffset The offset where the Operational Dataset begins.
* @param[in] aLength The length of the Operational Dataset.
*
* @retval kErrorNone Successfully parsed the Dataset from the @p aMessage and saved it.
* @retval kErrorParse Could not parse the Dataset from @p aMessage.
*
*/
Error Save(const Timestamp &aTimestamp, const Message &aMessage, uint16_t aOffset, uint16_t aLength);
/**
* Sets the Operational Dataset in non-volatile memory.
*
* @param[in] aDatasetInfo The Operational Dataset as `Dataset::Info`.
*
* @retval kErrorNone Successfully saved the dataset.
* @retval kErrorNotImplemented The platform does not implement settings functionality.
*
*/
Error Save(const Dataset::Info &aDatasetInfo) { return DatasetManager::Save(aDatasetInfo); }
/**
* Sets the Operational Dataset in non-volatile memory.
*
* @param[in] aDatasetTlvs The Operational Dataset as `Dataset::Tlvs`.
*
* @retval kErrorNone Successfully saved the dataset.
* @retval kErrorNotImplemented The platform does not implement settings functionality.
*
*/
Error Save(const Dataset::Tlvs &aDatasetTlvs) { return DatasetManager::Save(aDatasetTlvs); }
#if OPENTHREAD_FTD
/**
@@ -547,58 +500,6 @@ public:
*/
void ClearNetwork(void);
/**
* Saves the Operational Dataset in non-volatile memory.
*
* Also starts the Delay Timer.
*
* @param[in] aDatasetInfo The Operational Dataset as `Dataset::Info`.
*
* @retval kErrorNone Successfully saved the dataset.
* @retval kErrorNotImplemented The platform does not implement settings functionality.
*
*/
Error Save(const Dataset::Info &aDatasetInfo);
/**
* Saves the Operational Dataset in non-volatile memory.
*
* Also starts the Delay Timer.
*
* @param[in] aDatasetTlvs The Operational Dataset as a sequence of TLVs.
*
* @retval kErrorNone Successfully saved the dataset.
* @retval kErrorNotImplemented The platform does not implement settings functionality.
*
*/
Error Save(const Dataset::Tlvs &aDatasetTlvs);
/**
* Sets the Operational Dataset for the partition.
*
* Also updates the non-volatile version if the partition's Operational Dataset is newer.
*
* Also starts the Delay Timer.
*
* @param[in] aTimestamp The timestamp for the Operational Dataset.
* @param[in] aMessage The message buffer.
* @param[in] aOffset The offset where the Operational Dataset begins.
* @param[in] aLength The length of the Operational Dataset.
*
*/
Error Save(const Timestamp &aTimestamp, const Message &aMessage, uint16_t aOffset, uint16_t aLength);
/**
* Saves the Operational Dataset in non-volatile memory.
*
* @param[in] aDataset The Operational Dataset.
*
* @retval kErrorNone Successfully applied configuration.
* @retval kErrorParse The dataset has at least one TLV with invalid format.
*
*/
Error Save(const Dataset &aDataset);
#if OPENTHREAD_FTD
/**
* Starts the Leader functions for maintaining the Active Operational Dataset.
@@ -613,6 +514,7 @@ private:
#endif
void StartDelayTimer(void);
void StartDelayTimer(const Dataset &aDataset);
static void HandleTimer(Timer &aTimer);
void HandleTimer(void) { DatasetManager::HandleTimer(); }
+1 -1
View File
@@ -433,7 +433,7 @@ void PendingDatasetManager::ApplyActiveDataset(Dataset &aDataset)
SuccessOrExit(aDataset.Write<DelayTimerTlv>(Get<Leader>().GetDelayTimerMinimal()));
IgnoreError(DatasetManager::Save(aDataset));
StartDelayTimer();
StartDelayTimer(aDataset);
exit:
return;
+1 -1
View File
@@ -149,7 +149,7 @@ void DatasetUpdater::PreparePendingDataset(void)
IgnoreError(dataset.Write<ActiveTimestampTlv>(timestamp));
}
SuccessOrExit(error = Get<PendingDatasetManager>().Save(dataset));
SuccessOrExit(error = Get<PendingDatasetManager>().SaveLocal(dataset));
exit:
if (error != kErrorNone)
+1 -1
View File
@@ -533,7 +533,7 @@ template <> void Joiner::HandleTmf<kUriJoinerEntrust>(Coap::Message &aMessage, c
datasetInfo.Set<Dataset::kChannel>(Get<Mac::Mac>().GetPanChannel());
datasetInfo.Set<Dataset::kPanId>(Get<Mac::Mac>().GetPanId());
IgnoreError(Get<ActiveDatasetManager>().Save(datasetInfo));
IgnoreError(Get<ActiveDatasetManager>().SaveLocal(datasetInfo));
LogInfo("Joiner successful!");
+1 -1
View File
@@ -476,7 +476,7 @@ Error TcatAgent::HandleSetActiveOperationalDataset(const Message &aIncommingMess
}
dataset.ConvertTo(datasetTlvs);
error = Get<ActiveDatasetManager>().Save(datasetTlvs);
error = Get<ActiveDatasetManager>().SaveLocal(datasetTlvs);
exit:
return error;