diff --git a/src/core/thread/network_data_leader.hpp b/src/core/thread/network_data_leader.hpp index b94cdaf26..0977f6ff5 100644 --- a/src/core/thread/network_data_leader.hpp +++ b/src/core/thread/network_data_leader.hpp @@ -325,6 +325,11 @@ protected: void SignalNetDataChanged(void); const CommissioningDataTlv *FindCommissioningData(void) const; CommissioningDataTlv *FindCommissioningData(void) { return AsNonConst(AsConst(this)->FindCommissioningData()); } + const MeshCoP::Tlv *FindCommissioningDataSubTlv(uint8_t aType) const; + MeshCoP::Tlv *FindCommissioningDataSubTlv(uint8_t aType) + { + return AsNonConst(AsConst(this)->FindCommissioningDataSubTlv(aType)); + } uint8_t mStableVersion; uint8_t mVersion; @@ -347,11 +352,6 @@ private: Error SteeringDataCheck(const FilterIndexes &aFilterIndexes) const; void GetContextForMeshLocalPrefix(Lowpan::Context &aContext) const; Error ReadCommissioningDataUint16SubTlv(MeshCoP::Tlv::Type aType, uint16_t &aValue) const; - const MeshCoP::Tlv *FindCommissioningDataSubTlv(uint8_t aType) const; - MeshCoP::Tlv *FindCommissioningDataSubTlv(uint8_t aType) - { - return AsNonConst(AsConst(this)->FindCommissioningDataSubTlv(aType)); - } uint8_t mTlvBuffer[kMaxSize]; uint8_t mMaxLength; diff --git a/src/core/thread/network_data_leader_ftd.cpp b/src/core/thread/network_data_leader_ftd.cpp index d877d2050..f61b2b956 100644 --- a/src/core/thread/network_data_leader_ftd.cpp +++ b/src/core/thread/network_data_leader_ftd.cpp @@ -284,74 +284,53 @@ exit: template <> void Leader::HandleTmf(Coap::Message &aMessage, const Ip6::MessageInfo &aMessageInfo) { - uint16_t length = 0; - uint16_t offset; + uint16_t length; + uint16_t offset; + Coap::Message *response = nullptr; VerifyOrExit(Get().IsLeader() && !mWaitingForNetDataSync); - SuccessOrExit(Tlv::FindTlvValueOffset(aMessage, MeshCoP::Tlv::kGet, offset, length)); - aMessage.SetOffset(offset); + response = Get().NewPriorityResponseMessage(aMessage); + VerifyOrExit(response != nullptr); -exit: - if (Get().IsLeader()) + if (Tlv::FindTlvValueOffset(aMessage, MeshCoP::Tlv::kGet, offset, length) == kErrorNone) { - SendCommissioningGetResponse(aMessage, length, aMessageInfo); - } -} + // Append the requested sub-TLV types given in Get TLV. -void Leader::SendCommissioningGetResponse(const Coap::Message &aRequest, - uint16_t aLength, - const Ip6::MessageInfo &aMessageInfo) -{ - Error error = kErrorNone; - Coap::Message *message; - CommissioningDataTlv *commDataTlv; - uint8_t *data = nullptr; - uint8_t length = 0; - - message = Get().NewPriorityResponseMessage(aRequest); - VerifyOrExit(message != nullptr, error = kErrorNoBufs); - - commDataTlv = FindCommissioningData(); - - if (commDataTlv != nullptr) - { - data = commDataTlv->GetValue(); - length = commDataTlv->GetLength(); - } - - VerifyOrExit(data && length, error = kErrorDrop); - - if (aLength == 0) - { - SuccessOrExit(error = message->AppendBytes(data, length)); - } - else - { - for (uint16_t index = 0; index < aLength; index++) + for (; length > 0; offset++, length--) { - uint8_t type; + uint8_t type; + const MeshCoP::Tlv *subTlv; - IgnoreError(aRequest.Read(aRequest.GetOffset() + index, type)); + IgnoreError(aMessage.Read(offset, type)); - for (MeshCoP::Tlv *cur = reinterpret_cast(data); - cur < reinterpret_cast(data + length); cur = cur->GetNext()) + subTlv = FindCommissioningDataSubTlv(type); + + if (subTlv != nullptr) { - if (cur->GetType() == type) - { - SuccessOrExit(error = cur->AppendTo(*message)); - break; - } + SuccessOrExit(subTlv->AppendTo(*response)); } } } + else + { + // Append all sub-TLVs in the Commissioning Data. - SuccessOrExit(error = Get().SendMessage(*message, aMessageInfo)); + CommissioningDataTlv *dataTlv = FindCommissioningData(); + + if (dataTlv != nullptr) + { + SuccessOrExit(response->AppendBytes(dataTlv->GetValue(), dataTlv->GetLength())); + } + } + + SuccessOrExit(Get().SendMessage(*response, aMessageInfo)); + response = nullptr; // `SendMessage` takes ownership on success LogInfo("Sent %s response", UriToString()); exit: - FreeMessageOnError(message, error); + FreeMessage(response); } void Leader::SendCommissioningSetResponse(const Coap::Message &aRequest, diff --git a/src/core/thread/network_data_leader_ftd.hpp b/src/core/thread/network_data_leader_ftd.hpp index de91ec1c6..563acee26 100644 --- a/src/core/thread/network_data_leader_ftd.hpp +++ b/src/core/thread/network_data_leader_ftd.hpp @@ -329,9 +329,6 @@ private: UpdateStatus UpdateService(ServiceTlv &aService); UpdateStatus UpdateTlv(NetworkDataTlv &aTlv, const NetworkDataTlv *aSubTlvs); - void SendCommissioningGetResponse(const Coap::Message &aRequest, - uint16_t aLength, - const Ip6::MessageInfo &aMessageInfo); void SendCommissioningSetResponse(const Coap::Message &aRequest, const Ip6::MessageInfo &aMessageInfo, MeshCoP::StateTlv::State aState);