wifi: Ignore MPDUs transmitted on other links when processing received/missed BlockAck

This commit is contained in:
Stefano Avallone
2022-11-16 15:19:51 +01:00
committed by Stefano Avallone
parent c8e62e4181
commit 4d8afe006d

View File

@@ -586,12 +586,22 @@ BlockAckManager::NotifyGotBlockAck(uint8_t linkId,
// Remaining outstanding MPDUs have not been acknowledged
for (auto queueIt = it->second.second.begin(); queueIt != it->second.second.end();)
{
nFailedMpdus++;
if (!m_txFailedCallback.IsNull())
// transmission actually failed if the MPDU is inflight only on the same link on
// which we received the BlockAck frame
auto linkIds = (*queueIt)->GetInFlight();
if (linkIds.size() == 1 && *linkIds.begin() == linkId)
{
m_txFailedCallback(*queueIt);
nFailedMpdus++;
if (!m_txFailedCallback.IsNull())
{
m_txFailedCallback(*queueIt);
}
queueIt = HandleInFlightMpdu(linkId, queueIt, TO_RETRANSMIT, it, now);
continue;
}
queueIt = HandleInFlightMpdu(linkId, queueIt, TO_RETRANSMIT, it, now);
queueIt = HandleInFlightMpdu(linkId, queueIt, STAY_INFLIGHT, it, now);
}
return {nSuccessfulMpdus, nFailedMpdus};
@@ -614,6 +624,13 @@ BlockAckManager::NotifyMissedBlockAck(uint8_t linkId, const Mac48Address& recipi
// re-inserted if retransmitted)
for (auto mpduIt = it->second.second.begin(); mpduIt != it->second.second.end();)
{
// MPDUs that were transmitted on another link shall stay inflight
auto linkIds = (*mpduIt)->GetInFlight();
if (linkIds.count(linkId) == 0)
{
mpduIt = HandleInFlightMpdu(linkId, mpduIt, STAY_INFLIGHT, it, now);
continue;
}
mpduIt = HandleInFlightMpdu(linkId, mpduIt, TO_RETRANSMIT, it, now);
}
}