mirror of
https://github.com/espressif/openthread.git
synced 2026-08-25 03:39:52 +00:00
[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:
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user