[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.
This commit is contained in:
Piotr Koziar
2021-08-20 11:09:25 -07:00
committed by GitHub
parent b825b8b718
commit 5e22e38393
3 changed files with 23 additions and 4 deletions
+16 -3
View File
@@ -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<Mle::MleRouter>().RemoveRouterLink(static_cast<Router &>(aNeighbor));
}
+4 -1
View File
@@ -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);
+3
View File
@@ -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)