diff --git a/src/core/thread/network_diagnostic.cpp b/src/core/thread/network_diagnostic.cpp index 6c1789049..6e0e1e550 100644 --- a/src/core/thread/network_diagnostic.cpp +++ b/src/core/thread/network_diagnostic.cpp @@ -162,15 +162,15 @@ exit: Error Server::AppendRouterNeighborTlvs(Message &aMessage) { - Error error = kErrorNone; - RouterNeighborTlv neighborTlv; + Error error = kErrorNone; + RouterNeighborTlvValue neighborTlvValue; for (Router &router : Get()) { if (router.IsStateValid()) { - neighborTlv.InitFrom(router); - SuccessOrExit(error = neighborTlv.AppendTo(aMessage)); + neighborTlvValue.InitFrom(router); + SuccessOrExit(error = Tlv::Append(aMessage, neighborTlvValue)); } } @@ -755,8 +755,8 @@ exit: Error Server::AppendRouterNeighborTlvs(Coap::Message *&aAnswer, AnswerInfo &aInfo) { - Error error = kErrorNone; - RouterNeighborTlv neighborTlv; + Error error = kErrorNone; + RouterNeighborTlvValue neighborTlvValue; for (Router &router : Get()) { @@ -765,9 +765,9 @@ Error Server::AppendRouterNeighborTlvs(Coap::Message *&aAnswer, AnswerInfo &aInf continue; } - neighborTlv.InitFrom(router); + neighborTlvValue.InitFrom(router); - SuccessOrExit(error = neighborTlv.AppendTo(*aAnswer)); + SuccessOrExit(error = Tlv::Append(*aAnswer, neighborTlvValue)); SuccessOrExit(error = CheckAnswerLength(aAnswer, aInfo)); } diff --git a/src/core/thread/network_diagnostic_tlvs.cpp b/src/core/thread/network_diagnostic_tlvs.cpp index 1ce08a8f0..c05dab4cf 100644 --- a/src/core/thread/network_diagnostic_tlvs.cpp +++ b/src/core/thread/network_diagnostic_tlvs.cpp @@ -170,15 +170,12 @@ void ChildTlvValue::InitFrom(const Child &aChild) } //--------------------------------------------------------------------------------------------------------------------- -// RouterNeighborTlv +// RouterNeighborTlvValue -void RouterNeighborTlv::InitFrom(const Router &aRouter) +void RouterNeighborTlvValue::InitFrom(const Router &aRouter) { Clear(); - SetType(kRouterNeighbor); - SetLength(sizeof(*this) - sizeof(Tlv)); - mFlags |= kFlagsTrackErrRate; mRloc16 = BigEndian::HostSwap16(aRouter.GetRloc16()); mExtAddress = aRouter.GetExtAddress(); diff --git a/src/core/thread/network_diagnostic_tlvs.hpp b/src/core/thread/network_diagnostic_tlvs.hpp index 0264da664..305881846 100644 --- a/src/core/thread/network_diagnostic_tlvs.hpp +++ b/src/core/thread/network_diagnostic_tlvs.hpp @@ -647,10 +647,10 @@ private: } OT_TOOL_PACKED_END; /** - * Implements Router Neighbor TLV generation and parsing. + * Implements Router Neighbor TLV Value generation and parsing. */ OT_TOOL_PACKED_BEGIN -class RouterNeighborTlv : public Tlv, public TlvInfo, public Clearable +class RouterNeighborTlvValue : public Clearable { public: static constexpr uint8_t kFlagsTrackErrRate = 1 << 7; ///< Supports tracking error rates. @@ -751,6 +751,11 @@ private: uint16_t mMessageErrorRate; // (IPv6) msg error rate (0x0000->0%, 0xffff->100%) } OT_TOOL_PACKED_END; +/** + * Defines Router Neighbor TLV constants and types. + */ +typedef SimpleTlvInfo RouterNeighborTlv; + #endif // OPENTHREAD_FTD /** diff --git a/src/core/utils/mesh_diag.cpp b/src/core/utils/mesh_diag.cpp index ce57cec01..05cd2e568 100644 --- a/src/core/utils/mesh_diag.cpp +++ b/src/core/utils/mesh_diag.cpp @@ -325,21 +325,20 @@ exit: bool MeshDiag::ProcessRouterNeighborTableAnswer(Coap::Message &aMessage, const Ip6::MessageInfo &aMessageInfo) { - bool didProcess = false; - RouterNeighborTlv neighborTlv; - RouterNeighborEntry entry; - uint16_t offset; + bool didProcess = false; + Tlv::Info tlvInfo; + RouterNeighborTlvValue neighborTlvValue; + RouterNeighborEntry entry; SuccessOrExit(ProcessMessage(aMessage, aMessageInfo, mQueryRouterNeighborTable.mRouterRloc16)); while (true) { - SuccessOrExit(Tlv::FindTlv(aMessage, neighborTlv, offset)); - VerifyOrExit(!neighborTlv.IsExtended()); + SuccessOrExit(tlvInfo.FindIn(aMessage, RouterNeighborTlv::kType)); didProcess = true; - if (neighborTlv.GetLength() == 0) + if (tlvInfo.GetLength() == 0) { // We reached end of the list. mState = kStateIdle; @@ -348,16 +347,16 @@ bool MeshDiag::ProcessRouterNeighborTableAnswer(Coap::Message &aMessage, const I ExitNow(); } - VerifyOrExit(neighborTlv.GetLength() >= sizeof(RouterNeighborTlv) - sizeof(Tlv)); + SuccessOrExit(tlvInfo.Read(aMessage, neighborTlvValue)); - entry.SetFrom(neighborTlv); + entry.SetFrom(neighborTlvValue); mQueryRouterNeighborTable.mCallback.InvokeIfSet(kErrorPending, &entry); // Make sure query operation is not canceled from the // callback. VerifyOrExit(mState == kStateQueryRouterNeighborTable); - aMessage.SetOffset(static_cast(offset + neighborTlv.GetSize())); + aMessage.SetOffset(tlvInfo.GetTlvOffsetRange().GetEndOffset()); } exit: @@ -607,18 +606,18 @@ void MeshDiag::ChildEntry::SetFrom(const ChildTlvValue &aChildTlvValue) //--------------------------------------------------------------------------------------------------------------------- // MeshDiag::RouterNeighborEntry -void MeshDiag::RouterNeighborEntry::SetFrom(const RouterNeighborTlv &aTlv) +void MeshDiag::RouterNeighborEntry::SetFrom(const RouterNeighborTlvValue &aTlvValue) { - mSupportsErrRate = (aTlv.GetFlags() & RouterNeighborTlv::kFlagsTrackErrRate); - mRloc16 = aTlv.GetRloc16(); - mExtAddress = aTlv.GetExtAddress(); - mVersion = aTlv.GetVersion(); - mConnectionTime = aTlv.GetConnectionTime(); - mLinkMargin = aTlv.GetLinkMargin(); - mAverageRssi = aTlv.GetAverageRssi(); - mLastRssi = aTlv.GetLastRssi(); - mFrameErrorRate = aTlv.GetFrameErrorRate(); - mMessageErrorRate = aTlv.GetMessageErrorRate(); + mSupportsErrRate = (aTlvValue.GetFlags() & RouterNeighborTlvValue::kFlagsTrackErrRate); + mRloc16 = aTlvValue.GetRloc16(); + mExtAddress = aTlvValue.GetExtAddress(); + mVersion = aTlvValue.GetVersion(); + mConnectionTime = aTlvValue.GetConnectionTime(); + mLinkMargin = aTlvValue.GetLinkMargin(); + mAverageRssi = aTlvValue.GetAverageRssi(); + mLastRssi = aTlvValue.GetLastRssi(); + mFrameErrorRate = aTlvValue.GetFrameErrorRate(); + mMessageErrorRate = aTlvValue.GetMessageErrorRate(); } } // namespace Utils diff --git a/src/core/utils/mesh_diag.hpp b/src/core/utils/mesh_diag.hpp index 35a142738..0fe81c0d6 100644 --- a/src/core/utils/mesh_diag.hpp +++ b/src/core/utils/mesh_diag.hpp @@ -294,7 +294,7 @@ private: friend class MeshDiag; private: - void SetFrom(const NetworkDiagnostic::RouterNeighborTlv &aTlv); + void SetFrom(const NetworkDiagnostic::RouterNeighborTlvValue &aTlvValue); }; Error SendQuery(uint16_t aRloc16, const uint8_t *aTlvs, uint8_t aTlvsLength);