From d8e3e8380c8ca0da89e639e74f00754ee8673679 Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Thu, 2 May 2024 16:03:59 -0700 Subject: [PATCH] [dataset] simplify `SendSetRequest` (#10135) This commit adds a common `SendSetRequest(const Dataset &)` method that prepares and sends an MGMT_SET message with the given Dataset. This removes similar duplicate code. --- src/core/meshcop/dataset_manager.cpp | 103 +++++++++++---------------- src/core/meshcop/dataset_manager.hpp | 2 +- 2 files changed, 42 insertions(+), 63 deletions(-) diff --git a/src/core/meshcop/dataset_manager.cpp b/src/core/meshcop/dataset_manager.cpp index b80bce475..ebe3d6b57 100644 --- a/src/core/meshcop/dataset_manager.cpp +++ b/src/core/meshcop/dataset_manager.cpp @@ -244,10 +244,8 @@ void DatasetManager::HandleTimer(void) { SendSet(); } void DatasetManager::SendSet(void) { - Error error; - Coap::Message *message = nullptr; - Tmf::MessageInfo messageInfo(GetInstance()); - Dataset dataset; + Error error = kErrorNone; + Dataset dataset; VerifyOrExit(!mMgmtPending, error = kErrorBusy); VerifyOrExit(Get().IsChild() || Get().IsRouter(), error = kErrorInvalidState); @@ -264,44 +262,49 @@ void DatasetManager::SendSet(void) if ((pendingDataset.Read(timestamp) == kErrorNone) && (Timestamp::Compare(×tamp, mLocal.GetTimestamp()) == 0)) { - // stop registration attempts during dataset transition + // Stop registration attempts during dataset transition ExitNow(error = kErrorInvalidState); } } + IgnoreError(Read(dataset)); + + error = SendSetRequest(dataset); + +exit: + if (error == kErrorNoBufs) + { + mTimer.Start(kSendSetDelay); + } + + if (error != kErrorAlready) + { + LogWarnOnError(error, "send Dataset set to leader"); + } +} + +Error DatasetManager::SendSetRequest(const Dataset &aDataset) +{ + Error error = kErrorNone; + Coap::Message *message = nullptr; + Tmf::MessageInfo messageInfo(GetInstance()); + + VerifyOrExit(!mMgmtPending, error = kErrorAlready); + message = Get().NewPriorityConfirmablePostMessage(IsActiveDataset() ? kUriActiveSet : kUriPendingSet); VerifyOrExit(message != nullptr, error = kErrorNoBufs); - IgnoreError(Read(dataset)); - SuccessOrExit(error = message->AppendBytes(dataset.GetBytes(), dataset.GetLength())); - + SuccessOrExit(error = message->AppendBytes(aDataset.GetBytes(), aDataset.GetLength())); IgnoreError(messageInfo.SetSockAddrToRlocPeerAddrToLeaderAloc()); - SuccessOrExit( - error = Get().SendMessage(*message, messageInfo, &DatasetManager::HandleMgmtSetResponse, this)); - LogInfo("Sent %s set to leader", Dataset::TypeToString(GetType())); + SuccessOrExit(error = Get().SendMessage(*message, messageInfo, HandleMgmtSetResponse, this)); + mMgmtPending = true; + + LogInfo("Sent dataset set request to leader"); exit: - - switch (error) - { - case kErrorNone: - mMgmtPending = true; - break; - - case kErrorNoBufs: - mTimer.Start(kSendSetDelay); - OT_FALL_THROUGH; - - default: - if (error != kErrorAlready) - { - LogWarnOnError(error, "send Dataset set to leader"); - } - - FreeMessage(message); - break; - } + FreeMessageOnError(message, error); + return error; } void DatasetManager::HandleMgmtSetResponse(void *aContext, @@ -408,53 +411,29 @@ exit: FreeMessageOnError(message, error); } -Error DatasetManager::AppendDatasetToMessage(const Dataset::Info &aDatasetInfo, Message &aMessage) const -{ - Dataset dataset; - - dataset.SetFrom(aDatasetInfo); - return aMessage.AppendBytes(dataset.GetBytes(), dataset.GetLength()); -} - Error DatasetManager::SendSetRequest(const Dataset::Info &aDatasetInfo, const uint8_t *aTlvs, uint8_t aLength, MgmtSetCallback aCallback, void *aContext) { - Error error = kErrorNone; - Coap::Message *message = nullptr; - Tmf::MessageInfo messageInfo(GetInstance()); + Error error = kErrorNone; + Dataset dataset; - VerifyOrExit(!mMgmtPending, error = kErrorBusy); - - message = Get().NewPriorityConfirmablePostMessage(IsActiveDataset() ? kUriActiveSet : kUriPendingSet); - VerifyOrExit(message != nullptr, error = kErrorNoBufs); + dataset.SetFrom(aDatasetInfo); + SuccessOrExit(error = dataset.AppendTlvsFrom(aTlvs, aLength)); #if OPENTHREAD_CONFIG_COMMISSIONER_ENABLE && OPENTHREAD_FTD - if (Get().IsActive() && (Tlv::Find(aTlvs, aLength) == nullptr)) + if (Get().IsActive() && !dataset.ContainsTlv(Tlv::kCommissionerSessionId)) { - SuccessOrExit(error = Tlv::Append(*message, Get().GetSessionId())); + SuccessOrExit(error = dataset.Write(Get().GetSessionId())); } #endif - SuccessOrExit(error = AppendDatasetToMessage(aDatasetInfo, *message)); - - if (aLength > 0) - { - SuccessOrExit(error = message->AppendBytes(aTlvs, aLength)); - } - - IgnoreError(messageInfo.SetSockAddrToRlocPeerAddrToLeaderAloc()); - - SuccessOrExit(error = Get().SendMessage(*message, messageInfo, HandleMgmtSetResponse, this)); + SuccessOrExit(error = SendSetRequest(dataset)); mMgmtSetCallback.Set(aCallback, aContext); - mMgmtPending = true; - - LogInfo("sent dataset set request to leader"); exit: - FreeMessageOnError(message, error); return error; } diff --git a/src/core/meshcop/dataset_manager.hpp b/src/core/meshcop/dataset_manager.hpp index fa21d5cc2..66ce5df37 100644 --- a/src/core/meshcop/dataset_manager.hpp +++ b/src/core/meshcop/dataset_manager.hpp @@ -358,8 +358,8 @@ private: bool IsPendingDataset(void) const { return GetType() == Dataset::kPending; } void SignalDatasetChange(void) const; void HandleDatasetUpdated(void); - Error AppendDatasetToMessage(const Dataset::Info &aDatasetInfo, Message &aMessage) const; void SendSet(void); + Error SendSetRequest(const Dataset &aDataset); void SendGetResponse(const Coap::Message &aRequest, const Ip6::MessageInfo &aMessageInfo, const TlvList &aTlvList) const;