diff --git a/src/core/thread/network_diagnostic.cpp b/src/core/thread/network_diagnostic.cpp index bbb305208..6c1789049 100644 --- a/src/core/thread/network_diagnostic.cpp +++ b/src/core/thread/network_diagnostic.cpp @@ -144,14 +144,14 @@ exit: #if OPENTHREAD_CONFIG_BLE_TCAT_ENABLE Error Server::AppendChildTableAsChildTlvs(Message &aMessage) { - Error error = kErrorNone; - ChildTlv childTlv; + Error error = kErrorNone; + ChildTlvValue childTlvValue; for (Child &child : Get().Iterate(Child::kInStateValid)) { - childTlv.InitFrom(child); + childTlvValue.InitFrom(child); - SuccessOrExit(error = childTlv.AppendTo(aMessage)); + SuccessOrExit(error = Tlv::Append(aMessage, childTlvValue)); } error = Tlv::AppendEmpty(aMessage); @@ -736,14 +736,14 @@ exit: Error Server::AppendChildTableAsChildTlvs(Coap::Message *&aAnswer, AnswerInfo &aInfo) { - Error error = kErrorNone; - ChildTlv childTlv; + Error error = kErrorNone; + ChildTlvValue childTlvValue; for (Child &child : Get().Iterate(Child::kInStateValid)) { - childTlv.InitFrom(child); + childTlvValue.InitFrom(child); - SuccessOrExit(error = childTlv.AppendTo(*aAnswer)); + SuccessOrExit(error = Tlv::Append(*aAnswer, childTlvValue)); SuccessOrExit(error = CheckAnswerLength(aAnswer, aInfo)); } diff --git a/src/core/thread/network_diagnostic_tlvs.cpp b/src/core/thread/network_diagnostic_tlvs.cpp index 1ed36f73b..1ce08a8f0 100644 --- a/src/core/thread/network_diagnostic_tlvs.cpp +++ b/src/core/thread/network_diagnostic_tlvs.cpp @@ -136,15 +136,12 @@ void EnhancedRouteTlvEntry::Parse(ParseInfo &aParseInfo) const #if OPENTHREAD_FTD //--------------------------------------------------------------------------------------------------------------------- -// ChildTlv +// ChildTlvValue -void ChildTlv::InitFrom(const Child &aChild) +void ChildTlvValue::InitFrom(const Child &aChild) { Clear(); - SetType(kChild); - SetLength(sizeof(*this) - sizeof(Tlv)); - mFlags |= aChild.IsRxOnWhenIdle() ? kFlagsRxOnWhenIdle : 0; mFlags |= aChild.IsFullThreadDevice() ? kFlagsFtd : 0; mFlags |= (aChild.GetNetworkDataType() == NetworkData::kFullSet) ? kFlagsFullNetdta : 0; diff --git a/src/core/thread/network_diagnostic_tlvs.hpp b/src/core/thread/network_diagnostic_tlvs.hpp index d0c78d1cc..0264da664 100644 --- a/src/core/thread/network_diagnostic_tlvs.hpp +++ b/src/core/thread/network_diagnostic_tlvs.hpp @@ -451,7 +451,7 @@ typedef TlvInfo TypeListTlv; * Implements Child TLV generation and parsing. */ OT_TOOL_PACKED_BEGIN -class ChildTlv : public Tlv, public TlvInfo, public Clearable +class ChildTlvValue : public Clearable { public: static constexpr uint8_t kFlagsRxOnWhenIdle = 1 << 7; ///< Device mode - Rx-on when idle. @@ -612,6 +612,11 @@ private: uint8_t mCslChannel; // CSL channel. } OT_TOOL_PACKED_END; +/** + * Defines Child TLV constants and types. + */ +typedef SimpleTlvInfo ChildTlv; + /** * Implements Child IPv6 Address List Value generation and parsing. * diff --git a/src/core/utils/mesh_diag.cpp b/src/core/utils/mesh_diag.cpp index cb4283ce7..ce57cec01 100644 --- a/src/core/utils/mesh_diag.cpp +++ b/src/core/utils/mesh_diag.cpp @@ -285,21 +285,20 @@ exit: bool MeshDiag::ProcessChildTableAnswer(Coap::Message &aMessage, const Ip6::MessageInfo &aMessageInfo) { - bool didProcess = false; - ChildTlv childTlv; - ChildEntry entry; - uint16_t offset; + bool didProcess = false; + Tlv::Info tlvInfo; + ChildTlvValue childTlvValue; + ChildEntry entry; SuccessOrExit(ProcessMessage(aMessage, aMessageInfo, mQueryChildTable.mRouterRloc16)); while (true) { - SuccessOrExit(Tlv::FindTlv(aMessage, childTlv, offset)); - VerifyOrExit(!childTlv.IsExtended()); + SuccessOrExit(tlvInfo.FindIn(aMessage, ChildTlv::kType)); didProcess = true; - if (childTlv.GetLength() == 0) + if (tlvInfo.GetLength() == 0) { // We reached end of the list. mState = kStateIdle; @@ -308,17 +307,16 @@ bool MeshDiag::ProcessChildTableAnswer(Coap::Message &aMessage, const Ip6::Messa ExitNow(); } - VerifyOrExit(childTlv.GetLength() >= sizeof(ChildTlv) - sizeof(Tlv)); - IgnoreError(aMessage.Read(offset, childTlv)); + SuccessOrExit(tlvInfo.Read(aMessage, childTlvValue)); - entry.SetFrom(childTlv); + entry.SetFrom(childTlvValue); mQueryChildTable.mCallback.InvokeIfSet(kErrorPending, &entry); // Make sure query operation is not canceled from the // callback. VerifyOrExit(mState == kStateQueryChildTable); - aMessage.SetOffset(static_cast(offset + childTlv.GetSize())); + aMessage.SetOffset(tlvInfo.GetTlvOffsetRange().GetEndOffset()); } exit: @@ -581,29 +579,29 @@ exit: //--------------------------------------------------------------------------------------------------------------------- // MeshDiag::ChildEntry -void MeshDiag::ChildEntry::SetFrom(const ChildTlv &aChildTlv) +void MeshDiag::ChildEntry::SetFrom(const ChildTlvValue &aChildTlvValue) { - mRxOnWhenIdle = (aChildTlv.GetFlags() & ChildTlv::kFlagsRxOnWhenIdle); - mDeviceTypeFtd = (aChildTlv.GetFlags() & ChildTlv::kFlagsFtd); - mFullNetData = (aChildTlv.GetFlags() & ChildTlv::kFlagsFullNetdta); - mCslSynchronized = (aChildTlv.GetFlags() & ChildTlv::kFlagsCslSync); - mSupportsErrRate = (aChildTlv.GetFlags() & ChildTlv::kFlagsTrackErrRate); - mRloc16 = aChildTlv.GetRloc16(); - mExtAddress = aChildTlv.GetExtAddress(); - mVersion = aChildTlv.GetVersion(); - mTimeout = aChildTlv.GetTimeout(); - mAge = aChildTlv.GetAge(); - mConnectionTime = aChildTlv.GetConnectionTime(); - mSupervisionInterval = aChildTlv.GetSupervisionInterval(); - mLinkMargin = aChildTlv.GetLinkMargin(); - mAverageRssi = aChildTlv.GetAverageRssi(); - mLastRssi = aChildTlv.GetLastRssi(); - mFrameErrorRate = aChildTlv.GetFrameErrorRate(); - mMessageErrorRate = aChildTlv.GetMessageErrorRate(); - mQueuedMessageCount = aChildTlv.GetQueuedMessageCount(); - mCslPeriod = aChildTlv.GetCslPeriod(); - mCslTimeout = aChildTlv.GetCslTimeout(); - mCslChannel = aChildTlv.GetCslChannel(); + mRxOnWhenIdle = (aChildTlvValue.GetFlags() & ChildTlvValue::kFlagsRxOnWhenIdle); + mDeviceTypeFtd = (aChildTlvValue.GetFlags() & ChildTlvValue::kFlagsFtd); + mFullNetData = (aChildTlvValue.GetFlags() & ChildTlvValue::kFlagsFullNetdta); + mCslSynchronized = (aChildTlvValue.GetFlags() & ChildTlvValue::kFlagsCslSync); + mSupportsErrRate = (aChildTlvValue.GetFlags() & ChildTlvValue::kFlagsTrackErrRate); + mRloc16 = aChildTlvValue.GetRloc16(); + mExtAddress = aChildTlvValue.GetExtAddress(); + mVersion = aChildTlvValue.GetVersion(); + mTimeout = aChildTlvValue.GetTimeout(); + mAge = aChildTlvValue.GetAge(); + mConnectionTime = aChildTlvValue.GetConnectionTime(); + mSupervisionInterval = aChildTlvValue.GetSupervisionInterval(); + mLinkMargin = aChildTlvValue.GetLinkMargin(); + mAverageRssi = aChildTlvValue.GetAverageRssi(); + mLastRssi = aChildTlvValue.GetLastRssi(); + mFrameErrorRate = aChildTlvValue.GetFrameErrorRate(); + mMessageErrorRate = aChildTlvValue.GetMessageErrorRate(); + mQueuedMessageCount = aChildTlvValue.GetQueuedMessageCount(); + mCslPeriod = aChildTlvValue.GetCslPeriod(); + mCslTimeout = aChildTlvValue.GetCslTimeout(); + mCslChannel = aChildTlvValue.GetCslChannel(); } //--------------------------------------------------------------------------------------------------------------------- diff --git a/src/core/utils/mesh_diag.hpp b/src/core/utils/mesh_diag.hpp index d20fd40d9..35a142738 100644 --- a/src/core/utils/mesh_diag.hpp +++ b/src/core/utils/mesh_diag.hpp @@ -286,7 +286,7 @@ private: friend class MeshDiag; private: - void SetFrom(const NetworkDiagnostic::ChildTlv &aChildTlv); + void SetFrom(const NetworkDiagnostic::ChildTlvValue &aChildTlvValue); }; class RouterNeighborEntry : public otMeshDiagRouterNeighborEntry