diff --git a/src/core/thread/network_diagnostic.cpp b/src/core/thread/network_diagnostic.cpp index ba921d4dc..281a178a6 100644 --- a/src/core/thread/network_diagnostic.cpp +++ b/src/core/thread/network_diagnostic.cpp @@ -329,8 +329,11 @@ Error Server::AppendMacCounters(Message &aMessage) Error Server::AppendRequestedTlvs(const Message &aRequest, Message &aResponse) { - Error error; - OffsetRange offsetRange; + Error error; + OffsetRange offsetRange; + TlvTypeBitSet processedTlvs; + + processedTlvs.Clear(); SuccessOrExit(error = Tlv::FindTlvValueOffsetRange(aRequest, Tlv::kTypeList, offsetRange)); @@ -340,6 +343,14 @@ Error Server::AppendRequestedTlvs(const Message &aRequest, Message &aResponse) SuccessOrExit(error = aRequest.Read(offsetRange, tlvType)); offsetRange.AdvanceOffset(sizeof(tlvType)); + + if (processedTlvs.Has(tlvType)) + { + continue; + } + + processedTlvs.Add(tlvType); + SuccessOrExit(error = AppendDiagTlv(tlvType, aResponse)); } @@ -350,7 +361,10 @@ exit: #if OPENTHREAD_CONFIG_BLE_TCAT_ENABLE Error Server::AppendRequestedTlvsForTcat(const Message &aRequest, Message &aResponse, OffsetRange &aOffsetRange) { - Error error = kErrorNone; + Error error = kErrorNone; + TlvTypeBitSet processedTlvs; + + processedTlvs.Clear(); while (!aOffsetRange.IsEmpty()) { @@ -359,6 +373,13 @@ Error Server::AppendRequestedTlvsForTcat(const Message &aRequest, Message &aResp SuccessOrExit(error = aRequest.Read(aOffsetRange, tlvType)); aOffsetRange.AdvanceOffset(sizeof(uint8_t)); + if (processedTlvs.Has(tlvType)) + { + continue; + } + + processedTlvs.Add(tlvType); + #if OPENTHREAD_FTD switch (tlvType) { diff --git a/src/core/thread/network_diagnostic.hpp b/src/core/thread/network_diagnostic.hpp index c5e6e7944..eff7953a1 100644 --- a/src/core/thread/network_diagnostic.hpp +++ b/src/core/thread/network_diagnostic.hpp @@ -38,9 +38,11 @@ #include +#include "common/bit_set.hpp" #include "common/callback.hpp" #include "common/locator.hpp" #include "common/non_copyable.hpp" +#include "common/numeric_limits.hpp" #include "net/udp6.hpp" #include "thread/network_diagnostic_tlvs.hpp" #include "thread/tmf.hpp" @@ -196,6 +198,8 @@ private: static constexpr uint16_t kMaxChildEntries = 398; static constexpr uint16_t kAnswerMessageLengthThreshold = 800; + typedef BitSet::kMax + 1> TlvTypeBitSet; // A bitset to store TLV types. + #if OPENTHREAD_FTD struct AnswerInfo {