From e2e36d61e7709370654e2d5f991206f0d5e3138a Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Thu, 26 Mar 2026 22:48:05 -0700 Subject: [PATCH] [thread] simplify `ThreadNetworkDataTlv` definition (#12770) This commit simplifies the definition of `ThreadNetworkDataTlv`. Previously, `ThreadNetworkDataTlv` included a 255-byte array to store the Network Data TLVs. The code now relies on standard TLV parsing methods like `Tlv::FindTlvValueOffsetRange()` and `Message::ReadBytes()` to access the Network Data directly from the message payload. --- src/core/thread/network_data_leader_ftd.cpp | 14 ++++++--- src/core/thread/network_data_notifier.cpp | 4 +-- src/core/thread/thread_tlvs.hpp | 35 ++------------------- 3 files changed, 13 insertions(+), 40 deletions(-) diff --git a/src/core/thread/network_data_leader_ftd.cpp b/src/core/thread/network_data_leader_ftd.cpp index 2629d18bb..7396f9804 100644 --- a/src/core/thread/network_data_leader_ftd.cpp +++ b/src/core/thread/network_data_leader_ftd.cpp @@ -221,8 +221,8 @@ void Leader::RemoveBorderRouter(uint16_t aRloc16, MatchMode aMatchMode) template <> void Leader::HandleTmf(Coap::Msg &aMsg) { - ThreadNetworkDataTlv networkDataTlv; - uint16_t rloc16; + uint16_t rloc16; + OffsetRange offsetRange; VerifyOrExit(Get().IsLeader() && !mWaitingForNetDataSync); @@ -241,12 +241,16 @@ template <> void Leader::HandleTmf(Coap::Msg &aMsg) ExitNow(); } - if (Tlv::FindTlv(aMsg.mMessage, networkDataTlv) == kErrorNone) + if (Tlv::FindTlvValueOffsetRange(aMsg.mMessage, ThreadNetworkDataTlv::kType, offsetRange) == kErrorNone) { - VerifyOrExit(networkDataTlv.IsValid()); + uint8_t bytes[kMaxSize]; + + VerifyOrExit(offsetRange.GetLength() <= kMaxSize); + + aMsg.mMessage.ReadBytes(offsetRange, bytes); { - NetworkData networkData(GetInstance(), networkDataTlv.GetTlvs(), networkDataTlv.GetLength()); + NetworkData networkData(GetInstance(), bytes, static_cast(offsetRange.GetLength())); RegisterNetworkData(aMsg.mMessageInfo.GetPeerAddr().GetIid().GetLocator(), networkData); } diff --git a/src/core/thread/network_data_notifier.cpp b/src/core/thread/network_data_notifier.cpp index e1685a27f..898d502b9 100644 --- a/src/core/thread/network_data_notifier.cpp +++ b/src/core/thread/network_data_notifier.cpp @@ -191,8 +191,8 @@ Error Notifier::SendServerDataNotification(uint16_t aOldRloc16, const NetworkDat if (aNetworkData != nullptr) { - SuccessOrExit(error = Tlv::AppendTlv(*message, ThreadTlv::kThreadNetworkData, aNetworkData->GetBytes(), - aNetworkData->GetLength())); + SuccessOrExit( + error = Tlv::Append(*message, aNetworkData->GetBytes(), aNetworkData->GetLength())); #if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BORDER_ROUTER_SIGNAL_NETWORK_DATA_FULL Get().CheckForNetDataGettingFull(*aNetworkData, aOldRloc16); diff --git a/src/core/thread/thread_tlvs.hpp b/src/core/thread/thread_tlvs.hpp index 80380d731..3564d53a0 100644 --- a/src/core/thread/thread_tlvs.hpp +++ b/src/core/thread/thread_tlvs.hpp @@ -202,40 +202,9 @@ private: } OT_TOOL_PACKED_END; /** - * Implements Thread Network Data TLV generation and parsing. + * Defines Thread Network Data TLV constants and types. */ -OT_TOOL_PACKED_BEGIN -class ThreadNetworkDataTlv : public ThreadTlv, public TlvInfo -{ -public: - /** - * Initializes the TLV. - */ - void Init(void) - { - SetType(kThreadNetworkData); - SetLength(0); - } - - /** - * Overrides same method of the base class - * - * @retval TRUE the TLV appears to be well-formed. - */ - bool IsValid(void) const { return true; } - - /** - * Returns a pointer to the Network Data TLVs. - * - * @returns A pointer to the Network Data TLVs. - */ - uint8_t *GetTlvs(void) { return mTlvs; } - -private: - static constexpr uint8_t kMaxSize = 255; - - uint8_t mTlvs[kMaxSize]; -} OT_TOOL_PACKED_END; +typedef TlvInfo ThreadNetworkDataTlv; #if OPENTHREAD_CONFIG_THREAD_VERSION >= OT_THREAD_VERSION_1_2