From 3efe1c2c41c212cb4c777bb0c24a602901cde925 Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Thu, 17 Apr 2025 10:39:03 -0700 Subject: [PATCH] [mesh-forwarder] update and simplify `Counters` tracking (#11419) --- src/core/thread/indirect_sender.cpp | 12 +------ src/core/thread/mesh_forwarder.cpp | 50 ++++++++++++++++------------- src/core/thread/mesh_forwarder.hpp | 22 +++++++++++-- 3 files changed, 48 insertions(+), 36 deletions(-) diff --git a/src/core/thread/indirect_sender.cpp b/src/core/thread/indirect_sender.cpp index 500d3179b..cbc56c7c5 100644 --- a/src/core/thread/indirect_sender.cpp +++ b/src/core/thread/indirect_sender.cpp @@ -516,17 +516,7 @@ void IndirectSender::HandleSentFrameToChild(const Mac::TxFrame &aFrame, Get().LogMessage(MeshForwarder::kMessageTransmit, *message, txError, &macDest); } - if (message->GetType() == Message::kTypeIp6) - { - if (aChild.GetIndirectTxSuccess()) - { - Get().mIpCounters.mTxSuccess++; - } - else - { - Get().mIpCounters.mTxFailure++; - } - } + Get().mCounters.UpdateOnTxDone(*message, aChild.GetIndirectTxSuccess()); if (message->GetIndirectTxChildMask().Has(childIndex)) { diff --git a/src/core/thread/mesh_forwarder.cpp b/src/core/thread/mesh_forwarder.cpp index 0a31f87f7..d4fda4a7e 100644 --- a/src/core/thread/mesh_forwarder.cpp +++ b/src/core/thread/mesh_forwarder.cpp @@ -90,6 +90,30 @@ void ThreadLinkInfo::SetFrom(const Mac::RxFrame &aFrame) #endif } +void MeshForwarder::Counters::UpdateOnTxDone(const Message &aMessage, bool aTxSuccess) +{ + if (aMessage.GetType() == Message::kTypeIp6) + { + aTxSuccess ? mTxSuccess++ : mTxFailure++; + } +} + +void MeshForwarder::Counters::UpdateOnRx(const Message &aMessage) +{ + if (aMessage.GetType() == Message::kTypeIp6) + { + mRxSuccess++; + } +} + +void MeshForwarder::Counters::UpdateOnDrop(const Message &aMessage) +{ + if (aMessage.GetType() == Message::kTypeIp6) + { + mRxFailure++; + } +} + MeshForwarder::MeshForwarder(Instance &aInstance) : InstanceLocator(aInstance) , mMessageNextOffset(0) @@ -112,8 +136,6 @@ MeshForwarder::MeshForwarder(Instance &aInstance) { mFragTag = Random::NonCrypto::GetUint16(); - ResetCounters(); - #if OPENTHREAD_CONFIG_TX_QUEUE_STATISTICS_ENABLE mTxQueueStats.Clear(); #endif @@ -1303,10 +1325,7 @@ void MeshForwarder::FinalizeMessageDirectTx(Message &aMessage, Error aError) aMessage.SetTxSuccess(false); } - if (aMessage.GetType() == Message::kTypeIp6) - { - aMessage.GetTxSuccess() ? mIpCounters.mTxSuccess++ : mIpCounters.mTxFailure++; - } + mCounters.UpdateOnTxDone(aMessage, aMessage.GetTxSuccess()); if (aMessage.IsMleCommand(Mle::kCommandDiscoveryRequest)) { @@ -1561,12 +1580,7 @@ void MeshForwarder::ClearReassemblyList(void) for (Message &message : mReassemblyList) { LogMessage(kMessageReassemblyDrop, message, kErrorNoFrameReceived); - - if (message.GetType() == Message::kTypeIp6) - { - mIpCounters.mRxFailure++; - } - + mCounters.UpdateOnDrop(message); mReassemblyList.DequeueAndFree(message); } } @@ -1596,12 +1610,7 @@ bool MeshForwarder::UpdateReassemblyList(void) if (now - message.GetTimestamp() >= TimeMilli::SecToMsec(kReassemblyTimeout)) { LogMessage(kMessageReassemblyDrop, message, kErrorReassemblyTimeout); - - if (message.GetType() == Message::kTypeIp6) - { - mIpCounters.mRxFailure++; - } - + mCounters.UpdateOnDrop(message); mReassemblyList.DequeueAndFree(message); } } @@ -1669,10 +1678,7 @@ Error MeshForwarder::HandleDatagram(Message &aMessage, const Mac::Address &aMacS LogMessage(kMessageReceive, aMessage, kErrorNone, &aMacSource); - if (aMessage.GetType() == Message::kTypeIp6) - { - mIpCounters.mRxSuccess++; - } + mCounters.UpdateOnRx(aMessage); aMessage.SetLoopbackToHostAllowed(true); aMessage.SetOrigin(Message::kOriginThreadNetif); diff --git a/src/core/thread/mesh_forwarder.hpp b/src/core/thread/mesh_forwarder.hpp index dcb5116db..d14cef2f1 100644 --- a/src/core/thread/mesh_forwarder.hpp +++ b/src/core/thread/mesh_forwarder.hpp @@ -163,6 +163,22 @@ class MeshForwarder : public InstanceLocator, private NonCopyable friend class TimeTicker; public: + /** + * Represents the IPv6 message counters, tracking the number IPv6 message TX and RX that succeeded or failed. + */ + class Counters : public otIpCounters, public Clearable + { + friend class MeshForwarder; + friend class IndirectSender; + + private: + Counters(void) { Clear(); } + + void UpdateOnTxDone(const Message &aMessage, bool aTxSuccess); + void UpdateOnRx(const Message &aMessage); + void UpdateOnDrop(const Message &aMessage); + }; + /** * Initializes the object. * @@ -269,12 +285,12 @@ public: * * @returns A reference to the IP level counters. */ - const otIpCounters &GetCounters(void) const { return mIpCounters; } + const Counters &GetCounters(void) const { return mCounters; } /** * Resets the IP level counters. */ - void ResetCounters(void) { ClearAllBytes(mIpCounters); } + void ResetCounters(void) { mCounters.Clear(); } #if OPENTHREAD_CONFIG_TX_QUEUE_STATISTICS_ENABLE /** @@ -642,7 +658,7 @@ private: TxTask mScheduleTransmissionTask; - otIpCounters mIpCounters; + Counters mCounters; #if OPENTHREAD_FTD || OPENTHREAD_CONFIG_MAC_CSL_TRANSMITTER_ENABLE IndirectSender mIndirectSender;