From 5fb5e941cd0a3808c44c57e4afa50724365ac76b Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Tue, 27 Oct 2020 10:33:42 -0700 Subject: [PATCH] [dataset-manager] simplify 'SendSetRequest()' (#5721) This commit simplifies `DatasetManager::SendSetRequest()` by adding a method to `AppendDatasetToMessage()` which uses `Dataset::SetFrom()` method to convert a given `otOperationalDataset` to a TLV sequence before appending it to a given message. The conversion is performed in a new method to ensure that the stack/temporary variable `Dataset` is released before the call to process/send the prepared message. --- src/core/meshcop/dataset_manager.cpp | 97 ++++------------------------ src/core/meshcop/dataset_manager.hpp | 19 +++--- 2 files changed, 23 insertions(+), 93 deletions(-) diff --git a/src/core/meshcop/dataset_manager.cpp b/src/core/meshcop/dataset_manager.cpp index 594f85c5f..4a051aa80 100644 --- a/src/core/meshcop/dataset_manager.cpp +++ b/src/core/meshcop/dataset_manager.cpp @@ -443,6 +443,18 @@ exit: FreeMessageOnError(message, error); } +otError DatasetManager::AppendDatasetToMessage(const otOperationalDataset &aDataset, Message &aMessage) const +{ + otError error; + Dataset dataset(GetType()); + + SuccessOrExit(error = dataset.SetFrom(aDataset)); + error = aMessage.AppendBytes(dataset.GetBytes(), dataset.GetSize()); + +exit: + return error; +} + otError DatasetManager::SendSetRequest(const otOperationalDataset &aDataset, const uint8_t *aTlvs, uint8_t aLength) { otError error = OT_ERROR_NONE; @@ -481,90 +493,7 @@ otError DatasetManager::SendSetRequest(const otOperationalDataset &aDataset, con } #endif // OPENTHREAD_CONFIG_COMMISSIONER_ENABLE && OPENTHREAD_FTD - - if (aDataset.mComponents.mIsActiveTimestampPresent) - { - ActiveTimestampTlv timestamp; - timestamp.Init(); - timestamp.SetSeconds(aDataset.mActiveTimestamp); - timestamp.SetTicks(0); - SuccessOrExit(error = timestamp.AppendTo(*message)); - } - - if (aDataset.mComponents.mIsPendingTimestampPresent) - { - PendingTimestampTlv timestamp; - timestamp.Init(); - timestamp.SetSeconds(aDataset.mPendingTimestamp); - timestamp.SetTicks(0); - SuccessOrExit(error = timestamp.AppendTo(*message)); - } - - if (aDataset.mComponents.mIsMasterKeyPresent) - { - SuccessOrExit(error = - Tlv::AppendTlv(*message, Tlv::kNetworkMasterKey, &aDataset.mMasterKey, sizeof(MasterKey))); - } - - if (aDataset.mComponents.mIsNetworkNamePresent) - { - NetworkNameTlv networkname; - networkname.Init(); - networkname.SetNetworkName(static_cast(aDataset.mNetworkName).GetAsData()); - SuccessOrExit(error = networkname.AppendTo(*message)); - } - - if (aDataset.mComponents.mIsExtendedPanIdPresent) - { - SuccessOrExit(error = Tlv::AppendTlv(*message, Tlv::kExtendedPanId, &aDataset.mExtendedPanId, - sizeof(Mac::ExtendedPanId))); - } - - if (aDataset.mComponents.mIsMeshLocalPrefixPresent) - { - SuccessOrExit(error = Tlv::AppendTlv(*message, Tlv::kMeshLocalPrefix, &aDataset.mMeshLocalPrefix, - sizeof(otMeshLocalPrefix))); - } - - if (aDataset.mComponents.mIsDelayPresent) - { - SuccessOrExit(error = Tlv::AppendUint32Tlv(*message, Tlv::kDelayTimer, aDataset.mDelay)); - } - - if (aDataset.mComponents.mIsPanIdPresent) - { - SuccessOrExit(error = Tlv::AppendUint16Tlv(*message, Tlv::kPanId, aDataset.mPanId)); - } - - if (aDataset.mComponents.mIsChannelPresent) - { - ChannelTlv channel; - channel.Init(); - channel.SetChannel(aDataset.mChannel); - SuccessOrExit(error = channel.AppendTo(*message)); - } - - if (aDataset.mComponents.mIsChannelMaskPresent) - { - ChannelMaskTlv channelMask; - channelMask.Init(); - channelMask.SetChannelMask(aDataset.mChannelMask); - SuccessOrExit(error = channelMask.AppendTo(*message)); - } - - if (aDataset.mComponents.mIsPskcPresent) - { - SuccessOrExit(error = Tlv::AppendTlv(*message, Tlv::kPskc, aDataset.mPskc.m8, sizeof(Pskc))); - } - - if (aDataset.mComponents.mIsSecurityPolicyPresent) - { - SecurityPolicyTlv securityPolicy; - securityPolicy.Init(); - securityPolicy.SetRotationTime(aDataset.mSecurityPolicy.mRotationTime); - securityPolicy.SetFlags(aDataset.mSecurityPolicy.mFlags); - SuccessOrExit(error = securityPolicy.AppendTo(*message)); - } + SuccessOrExit(error = AppendDatasetToMessage(aDataset, *message)); if (aLength > 0) { diff --git a/src/core/meshcop/dataset_manager.hpp b/src/core/meshcop/dataset_manager.hpp index 00dacb371..87f546875 100644 --- a/src/core/meshcop/dataset_manager.hpp +++ b/src/core/meshcop/dataset_manager.hpp @@ -334,15 +334,16 @@ private: otError aError); void HandleCoapResponse(void); - 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, - const Ip6::MessageInfo &aMessageInfo, - uint8_t * aTlvs, - uint8_t aLength) const; + bool IsActiveDataset(void) const { return GetType() == Dataset::kActive; } + bool IsPendingDataset(void) const { return GetType() == Dataset::kPending; } + void SignalDatasetChange(void) const; + void HandleDatasetUpdated(void); + otError AppendDatasetToMessage(const otOperationalDataset &aDataset, Message &aMessage) const; + void SendSet(void); + void SendGetResponse(const Coap::Message & aRequest, + const Ip6::MessageInfo &aMessageInfo, + uint8_t * aTlvs, + uint8_t aLength) const; #if OPENTHREAD_FTD void SendSetResponse(const Coap::Message &aRequest, const Ip6::MessageInfo &aMessageInfo, StateTlv::State aState);