diff --git a/src/core/thread/network_diagnostic.cpp b/src/core/thread/network_diagnostic.cpp index 6f62461f6..05ef7bbc6 100644 --- a/src/core/thread/network_diagnostic.cpp +++ b/src/core/thread/network_diagnostic.cpp @@ -435,22 +435,8 @@ Error Server::AppendDiagTlv(uint8_t aTlvType, Message &aMessage) break; case Tlv::kChannelPages: - { - ChannelPagesTlv tlv; - uint8_t length = 0; - - tlv.Init(); - - for (uint8_t page : Radio::kSupportedChannelPages) - { - tlv.GetChannelPages()[length++] = page; - } - - tlv.SetLength(length); - error = tlv.AppendTo(aMessage); - + error = Tlv::Append(aMessage, Radio::kSupportedChannelPages, Radio::kNumChannelPages); break; - } case Tlv::kNonPreferredChannels: { @@ -1172,6 +1158,14 @@ exit: return error; } +void Client::ReadDiagData(DiagData &aDiagData, const Message &aMessage, const Tlv::Info &aTlvInfo) +{ + OffsetRange offsetRange = aTlvInfo.GetValueOffsetRange(); + + offsetRange.ShrinkLength(GetArrayLength(aDiagData.m8)); + aDiagData.mCount = static_cast(aMessage.ReadBytes(offsetRange, aDiagData.m8)); +} + void Client::ParseMacCounters(const MacCountersTlv &aMacCountersTlv, otNetworkDiagMacCounters &aMacCounters) { aMacCounters.mIfInUnknownProtos = aMacCountersTlv.GetIfInUnknownProtos(); @@ -1272,8 +1266,7 @@ Error Client::GetNextDiagTlv(const Coap::Message &aMessage, Iterator &aIterator, "NetworkData array in `otNetworkDiagTlv` is too small"); VerifyOrExit(tlvInfo.GetLength() <= NetworkData::NetworkData::kMaxSize, error = kErrorParse); - aDiagTlv.mData.mNetworkData.mCount = static_cast(tlvInfo.GetLength()); - aMessage.ReadBytes(tlvInfo.GetValueOffsetRange(), aDiagTlv.mData.mNetworkData.m8); + ReadDiagData(aDiagTlv.mData.mNetworkData, aMessage, tlvInfo); break; case Tlv::kIp6AddressList: @@ -1344,10 +1337,7 @@ Error Client::GetNextDiagTlv(const Coap::Message &aMessage, Iterator &aIterator, } case Tlv::kChannelPages: - aDiagTlv.mData.mChannelPages.mCount = - static_cast(Min(tlvInfo.GetLength(), GetArrayLength(aDiagTlv.mData.mChannelPages.m8))); - aMessage.ReadBytes(tlvInfo.GetValueOffset(), aDiagTlv.mData.mChannelPages.m8, - aDiagTlv.mData.mChannelPages.mCount); + ReadDiagData(aDiagTlv.mData.mChannelPages, aMessage, tlvInfo); break; case Tlv::kMaxChildTimeout: diff --git a/src/core/thread/network_diagnostic.hpp b/src/core/thread/network_diagnostic.hpp index 16b737b67..544f783c2 100644 --- a/src/core/thread/network_diagnostic.hpp +++ b/src/core/thread/network_diagnostic.hpp @@ -281,6 +281,7 @@ public: uint16_t GetLastQueryId(void) const { return mQueryId; } private: + typedef otNetworkDiagData DiagData; typedef otNetworkDiagIp6AddrList Ip6AddrList; typedef otNetworkDiagMacCounters MacCounters; @@ -302,6 +303,7 @@ private: template void HandleTmf(Coap::Msg &aMsg); + static void ReadDiagData(DiagData &aDiagData, const Message &aMessage, const Tlv::Info &aTlvInfo); static void ParseIp6AddrList(Ip6AddrList &aIp6Addrs, const Message &aMessage, OffsetRange aOffsetRange); static void ParseMacCounters(const MacCountersTlv &aMacCountersTlv, MacCounters &aMacCounters); diff --git a/src/core/thread/network_diagnostic_tlvs.hpp b/src/core/thread/network_diagnostic_tlvs.hpp index 3a31382d8..3f7dfdb6a 100644 --- a/src/core/thread/network_diagnostic_tlvs.hpp +++ b/src/core/thread/network_diagnostic_tlvs.hpp @@ -591,43 +591,9 @@ private: } OT_TOOL_PACKED_END; /** - * Implements Channel Pages TLV generation and parsing. + * Defines Channel Pages TLV constants and types. */ -OT_TOOL_PACKED_BEGIN -class ChannelPagesTlv : public Tlv, public TlvInfo -{ -public: - /** - * Initializes the TLV. - */ - void Init(void) - { - SetType(kChannelPages); - SetLength(sizeof(*this) - sizeof(Tlv)); - } - - /** - * Indicates whether or not the TLV appears to be well-formed. - * - * @retval TRUE If the TLV appears to be well-formed. - * @retval FALSE If the TLV does not appear to be well-formed. - */ - bool IsValid(void) const - { - // At least one channel page must be included. - return GetLength() >= 1; - } - - /** - * Returns a pointer to the list of Channel Pages. - * - * @returns A pointer to the list of Channel Pages. - */ - uint8_t *GetChannelPages(void) { return mChannelPages; } - -private: - uint8_t mChannelPages[Radio::kNumChannelPages]; -} OT_TOOL_PACKED_END; +typedef TlvInfo ChannelPagesTlv; /** * Defines Type List TLV constants and types.