From ff68d5046916c885c67345a3a2b8cd7af67845d7 Mon Sep 17 00:00:00 2001 From: Yakun Xu Date: Wed, 26 Mar 2025 01:30:14 +0800 Subject: [PATCH] [mesh-forwarder] do not CSL IE for non-neighbors (#11361) This commit changes the mesh forwarder to avoid adding CSL IE when the message is not destined to a known neighbor. This change also eliminates the check to exclude the MLE Discovery Request for adding CSL IE. --- src/core/thread/mesh_forwarder.cpp | 75 +++++++++++++++--------------- 1 file changed, 37 insertions(+), 38 deletions(-) diff --git a/src/core/thread/mesh_forwarder.cpp b/src/core/thread/mesh_forwarder.cpp index 9999b36be..0b15e0047 100644 --- a/src/core/thread/mesh_forwarder.cpp +++ b/src/core/thread/mesh_forwarder.cpp @@ -815,13 +815,46 @@ exit: void MeshForwarder::PrepareMacHeaders(Mac::TxFrame &aTxFrame, Mac::TxFrame::Info &aTxFrameInfo, const Message *aMessage) { + const Neighbor *neighbor; + aTxFrameInfo.mVersion = Mac::Frame::kVersion2006; - //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Determine Header IE entries - #if OPENTHREAD_CONFIG_MAC_HEADER_IE_SUPPORT +#if (OPENTHREAD_FTD && OPENTHREAD_CONFIG_MAC_CSL_TRANSMITTER_ENABLE) || OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE || \ + OPENTHREAD_CONFIG_MLE_LINK_METRICS_INITIATOR_ENABLE + + //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + // Determine frame version and Header IE entries + + neighbor = Get().FindNeighbor(aTxFrameInfo.mAddrs.mDestination); + + if (neighbor == nullptr) + { + } +#if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE + else if (Get().IsCslEnabled()) + { + aTxFrameInfo.mAppendCslIe = true; + aTxFrameInfo.mVersion = Mac::Frame::kVersion2015; + } +#endif +#if OPENTHREAD_FTD && OPENTHREAD_CONFIG_MAC_CSL_TRANSMITTER_ENABLE + else if ((Get().Contains(*neighbor) && static_cast(neighbor)->IsCslSynchronized())) + { + aTxFrameInfo.mVersion = Mac::Frame::kVersion2015; + } +#endif +#if OPENTHREAD_CONFIG_MLE_LINK_METRICS_INITIATOR_ENABLE + else if (neighbor->IsEnhAckProbingActive()) + { + aTxFrameInfo.mVersion = Mac::Frame::kVersion2015; + } +#endif + +#endif // (OPENTHREAD_FTD && OPENTHREAD_CONFIG_MAC_CSL_TRANSMITTER_ENABLE) || OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE + // || OPENTHREAD_CONFIG_MLE_LINK_METRICS_INITIATOR_ENABLE + #if OPENTHREAD_CONFIG_TIME_SYNC_ENABLE if ((aMessage != nullptr) && aMessage->IsTimeSync()) { @@ -829,52 +862,18 @@ void MeshForwarder::PrepareMacHeaders(Mac::TxFrame &aTxFrame, Mac::TxFrame::Info aTxFrameInfo.mVersion = Mac::Frame::kVersion2015; } #endif -#if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE - if (Get().IsCslEnabled() && - !(aMessage != nullptr && aMessage->IsMleCommand(Mle::kCommandDiscoveryRequest))) - { - aTxFrameInfo.mAppendCslIe = true; - aTxFrameInfo.mVersion = Mac::Frame::kVersion2015; - } -#endif aTxFrameInfo.mEmptyPayload = (aMessage == nullptr) || (aMessage->GetLength() == 0); #endif // OPENTHREAD_CONFIG_MAC_HEADER_IE_SUPPORT -#if (OPENTHREAD_FTD && OPENTHREAD_CONFIG_MAC_CSL_TRANSMITTER_ENABLE) || \ - OPENTHREAD_CONFIG_MLE_LINK_METRICS_INITIATOR_ENABLE - - //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Determine frame version - - if (aTxFrameInfo.mVersion == Mac::Frame::kVersion2006) - { - const Neighbor *neighbor = Get().FindNeighbor(aTxFrameInfo.mAddrs.mDestination); - -#if OPENTHREAD_FTD && OPENTHREAD_CONFIG_MAC_CSL_TRANSMITTER_ENABLE - if ((neighbor != nullptr) && Get().Contains(*neighbor) && - static_cast(neighbor)->IsCslSynchronized()) - { - aTxFrameInfo.mVersion = Mac::Frame::kVersion2015; - } -#endif -#if OPENTHREAD_CONFIG_MLE_LINK_METRICS_INITIATOR_ENABLE - if ((neighbor != nullptr) && neighbor->IsEnhAckProbingActive()) - { - aTxFrameInfo.mVersion = Mac::Frame::kVersion2015; - } -#endif - } - -#endif // OPENTHREAD_CONFIG_MAC_CSL_TRANSMITTER_ENABLE || OPENTHREAD_CONFIG_MLE_LINK_METRICS_INITIATOR_ENABLE - //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Prepare MAC headers aTxFrameInfo.PrepareHeadersIn(aTxFrame); OT_UNUSED_VARIABLE(aMessage); + OT_UNUSED_VARIABLE(neighbor); } // This method constructs a MAC data from from a given IPv6 message.