From 5e22e38393cbbfff7b7f78b046516fb81c2b739c Mon Sep 17 00:00:00 2001 From: Piotr Koziar <44554861+piotrkoziar@users.noreply.github.com> Date: Fri, 20 Aug 2021 20:09:25 +0200 Subject: [PATCH] [csl] allow more tx failures when sending CSL data poll (#6931) Currently, we disable retries on radio/submac of data polls with CSL IE (I believe to avoid sending outdated CSL IE). To compensate for this, we use kMaxCslPollRetxAttempts (default 15) instead of kMaxPollRetxAttempts (default 4), which gives us more possible retx on mac. Assuming we get NoAck error, depending on the presence of CSL IE, there will be: a) 4 attempts (on mac) with up to 15 retries on radio/submac (if no CSL IE) b) 4 attempts on mac (if CSL IE present) because child is considered detached from parent after 4 data poll transmissions that returned NoAck error. So in the end, the increased number of RetxAttempts does not have a full effect - we start to reattach after 4 retx while having 15 retx allowed. This commit adds kFailedCslDataPollTransmissions constant that will be used instead of kFailedRouterTransmissions in case of data poll with CSL IE on Child-Parent link. --- src/core/thread/mesh_forwarder.cpp | 19 ++++++++++++++++--- src/core/thread/mesh_forwarder.hpp | 5 ++++- src/core/thread/mle_types.hpp | 3 +++ 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/core/thread/mesh_forwarder.cpp b/src/core/thread/mesh_forwarder.cpp index 85de25a6b..5dd8af920 100644 --- a/src/core/thread/mesh_forwarder.cpp +++ b/src/core/thread/mesh_forwarder.cpp @@ -910,13 +910,26 @@ Neighbor *MeshForwarder::UpdateNeighborOnSentFrame(Mac::TxFrame &aFrame, Error a } #endif // OPENTHREAD_CONFIG_RADIO_LINK_TREL_ENABLE - UpdateNeighborLinkFailures(*neighbor, aError, /* aAllowNeighborRemove */ true); +#if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE + if ((aFrame.GetHeaderIe(Mac::CslIe::kHeaderIeId) != nullptr) && aFrame.IsDataRequestCommand()) + { + UpdateNeighborLinkFailures(*neighbor, aError, /* aAllowNeighborRemove */ true, + /* aFailLimit */ Mle::kFailedCslDataPollTransmissions); + } + else +#endif + { + UpdateNeighborLinkFailures(*neighbor, aError, /* aAllowNeighborRemove */ true); + } exit: return neighbor; } -void MeshForwarder::UpdateNeighborLinkFailures(Neighbor &aNeighbor, Error aError, bool aAllowNeighborRemove) +void MeshForwarder::UpdateNeighborLinkFailures(Neighbor &aNeighbor, + Error aError, + bool aAllowNeighborRemove, + uint8_t aFailLimit) { // Update neighbor `LinkFailures` counter on ack error. @@ -929,7 +942,7 @@ void MeshForwarder::UpdateNeighborLinkFailures(Neighbor &aNeighbor, Error aError aNeighbor.IncrementLinkFailures(); if (aAllowNeighborRemove && (Mle::Mle::IsActiveRouter(aNeighbor.GetRloc16())) && - (aNeighbor.GetLinkFailures() >= Mle::kFailedRouterTransmissions)) + (aNeighbor.GetLinkFailures() >= aFailLimit)) { Get().RemoveRouterLink(static_cast(aNeighbor)); } diff --git a/src/core/thread/mesh_forwarder.hpp b/src/core/thread/mesh_forwarder.hpp index 7d288afb5..f6a9e89a6 100644 --- a/src/core/thread/mesh_forwarder.hpp +++ b/src/core/thread/mesh_forwarder.hpp @@ -462,7 +462,10 @@ private: void HandleReceivedFrame(Mac::RxFrame &aFrame); Mac::TxFrame *HandleFrameRequest(Mac::TxFrames &aTxFrames); Neighbor * UpdateNeighborOnSentFrame(Mac::TxFrame &aFrame, Error aError, const Mac::Address &aMacDest); - void UpdateNeighborLinkFailures(Neighbor &aNeighbor, Error aError, bool aAllowNeighborRemove); + void UpdateNeighborLinkFailures(Neighbor &aNeighbor, + Error aError, + bool aAllowNeighborRemove, + uint8_t aFailLimit = Mle::kFailedRouterTransmissions); void HandleSentFrame(Mac::TxFrame &aFrame, Error aError); void UpdateSendMessage(Error aFrameTxError, Mac::Address &aMacDest, Neighbor *aNeighbor); void RemoveMessageIfNoPendingTx(Message &aMessage); diff --git a/src/core/thread/mle_types.hpp b/src/core/thread/mle_types.hpp index 55a33e8f0..94af11d82 100644 --- a/src/core/thread/mle_types.hpp +++ b/src/core/thread/mle_types.hpp @@ -132,6 +132,9 @@ constexpr uint32_t kAdvertiseIntervalMax = 32; ///< Max Advertise interval (in s #endif constexpr uint8_t kFailedRouterTransmissions = 4; +#if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE +constexpr uint8_t kFailedCslDataPollTransmissions = 15; +#endif constexpr uint8_t kRouterIdReuseDelay = 100; ///< (in sec) constexpr uint32_t kRouterIdSequencePeriod = 10; ///< (in sec)