From 252918bf10cf3ef8abdb1904178d543f6dc1e150 Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Fri, 12 Jun 2026 10:47:40 -0700 Subject: [PATCH] [tmf] introduce `SendResponseWithStateTlv()` helper (#13238) This commit adds `SendResponseWithStateTlv()` to `Tmf::Agent` to streamline sending TMF responses that consist solely of a `StateTlv`. By encapsulating message allocation, TLV appending, and message transmission into a single method, this reduces duplicate boilerplate code across `DatasetManager`, `Leader`, and `NetworkData::Leader`. --- src/core/meshcop/dataset_manager_ftd.cpp | 13 ++----------- src/core/meshcop/meshcop_leader.cpp | 12 ++---------- src/core/thread/network_data_leader_ftd.cpp | 11 ++--------- src/core/thread/tmf.cpp | 16 ++++++++++++++++ src/core/thread/tmf.hpp | 11 +++++++++++ 5 files changed, 33 insertions(+), 30 deletions(-) diff --git a/src/core/meshcop/dataset_manager_ftd.cpp b/src/core/meshcop/dataset_manager_ftd.cpp index a78dc75e3..8f5916220 100644 --- a/src/core/meshcop/dataset_manager_ftd.cpp +++ b/src/core/meshcop/dataset_manager_ftd.cpp @@ -202,20 +202,11 @@ exit: void DatasetManager::SendSetOrReplaceResponse(const Coap::Msg &aMsg, StateTlv::State aState) { - Error error = kErrorNone; - Coap::Message *message; - - message = Get().AllocateAndInitPriorityResponseFor(aMsg.mMessage); - VerifyOrExit(message != nullptr, error = kErrorNoBufs); - - SuccessOrExit(error = Tlv::Append(*message, aState)); - - SuccessOrExit(error = Get().SendMessage(*message, aMsg.mMessageInfo)); - + SuccessOrExit(Get().SendResponseWithStateTlv(aMsg, aState)); LogInfo("sent dataset set/replace response"); exit: - FreeMessageOnError(message, error); + return; } //---------------------------------------------------------------------------------------------------------------------- diff --git a/src/core/meshcop/meshcop_leader.cpp b/src/core/meshcop/meshcop_leader.cpp index 1b700fd76..fec1506af 100644 --- a/src/core/meshcop/meshcop_leader.cpp +++ b/src/core/meshcop/meshcop_leader.cpp @@ -158,20 +158,12 @@ exit: void Leader::SendKeepAliveResponse(const Coap::Msg &aMsg, StateTlv::State aState) { - Error error = kErrorNone; - Coap::Message *message; - - message = Get().AllocateAndInitPriorityResponseFor(aMsg.mMessage); - VerifyOrExit(message != nullptr, error = kErrorNoBufs); - - SuccessOrExit(error = Tlv::Append(*message, aState)); - - SuccessOrExit(error = Get().SendMessage(*message, aMsg.mMessageInfo)); + Error error; + SuccessOrExit(error = Get().SendResponseWithStateTlv(aMsg, aState)); LogInfo("Sent %s response", UriToString()); exit: - FreeMessageOnError(message, error); LogWarnOnError(error, "send keep alive response"); } diff --git a/src/core/thread/network_data_leader_ftd.cpp b/src/core/thread/network_data_leader_ftd.cpp index 7396f9804..e4c37c9d1 100644 --- a/src/core/thread/network_data_leader_ftd.cpp +++ b/src/core/thread/network_data_leader_ftd.cpp @@ -324,18 +324,11 @@ exit: void Leader::SendCommissioningSetResponse(const Coap::Msg &aMsg, MeshCoP::StateTlv::State aState) { - Coap::Message *message = Get().AllocateAndInitPriorityResponseFor(aMsg.mMessage); - - VerifyOrExit(message != nullptr); - SuccessOrExit(Tlv::Append(*message, aState)); - - SuccessOrExit(Get().SendMessage(*message, aMsg.mMessageInfo)); - message = nullptr; // `SendMessage` takes ownership on success - + SuccessOrExit(Get().SendResponseWithStateTlv(aMsg, aState)); LogInfo("Sent %s response", UriToString()); exit: - FreeMessage(message); + return; } bool Leader::RlocMatch(uint16_t aFirstRloc16, uint16_t aSecondRloc16, MatchMode aMatchMode) diff --git a/src/core/thread/tmf.cpp b/src/core/thread/tmf.cpp index 44e94fe7a..19543a8a8 100644 --- a/src/core/thread/tmf.cpp +++ b/src/core/thread/tmf.cpp @@ -275,6 +275,22 @@ void Agent::PrepareMessageInfo(Ip6::MessageInfo &aMessageInfo) const : Get().GetMeshLocalRloc()); } +Error Agent::SendResponseWithStateTlv(const Msg &aRequest, uint8_t aState) +{ + Error error = kErrorNone; + Message *message; + + message = AllocateAndInitPriorityResponseFor(aRequest.mMessage); + VerifyOrExit(message != nullptr, error = kErrorNoBufs); + + SuccessOrExit(error = Tlv::Append(*message, aState)); + SuccessOrExit(error = SendMessage(*message, aRequest.mMessageInfo)); + +exit: + FreeMessageOnError(message, error); + return error; +} + uint8_t Agent::PriorityToDscp(Message::Priority aPriority) { uint8_t dscp = Ip6::kDscpTmfNormalPriority; diff --git a/src/core/thread/tmf.hpp b/src/core/thread/tmf.hpp index 24fa49c47..830fe910b 100644 --- a/src/core/thread/tmf.hpp +++ b/src/core/thread/tmf.hpp @@ -223,6 +223,17 @@ public: */ Error SendMessageToLeaderAloc(Message &aMessage, ResponseHandler aHandler, void *aContext); + /** + * Sends a TMF response containing a State TLV. + * + * @param[in] aRequest The incoming TMF request message. + * @param[in] aState The state value to append in the State TLV. + * + * @retval kErrorNone Successfully sent the response. + * @retval kErrorNoBufs Insufficient available buffers to allocate the response. + */ + Error SendResponseWithStateTlv(const Msg &aRequest, uint8_t aState); + /** * Converts a TMF message priority to IPv6 header DSCP value. *