From 0d693ef45e09a080903c439ef57501f32d90c4e6 Mon Sep 17 00:00:00 2001 From: Stefano Avallone Date: Fri, 8 Sep 2023 09:26:15 +0200 Subject: [PATCH] wifi: Stop A-MSDU aggregation if an A-MSDU is found in the queue A-MSDUs with no assigned sequence number may be found in the queue after an RTS/CTS failure. --- RELEASE_NOTES.md | 1 + src/wifi/model/msdu-aggregator.cc | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 6e940d985..75edeeb52 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -32,6 +32,7 @@ Release 3-dev - (lr-wpan) !1673 - Fixes PHY BUSY_RX -> RX_ON operation - (wifi) - Fix agreement not always properly torn down when Block Ack inactivity timeout is elapsed +- (wifi) - Stop A-MSDU aggregation when an A-MSDU is found in the queue Release 3.40 ------------ diff --git a/src/wifi/model/msdu-aggregator.cc b/src/wifi/model/msdu-aggregator.cc index a6cf490aa..e58383947 100644 --- a/src/wifi/model/msdu-aggregator.cc +++ b/src/wifi/model/msdu-aggregator.cc @@ -127,11 +127,16 @@ MsduAggregator::GetNextAmsdu(Ptr peekedItem, uint8_t nMsdu = 1; peekedItem = queue->PeekByTidAndAddress(tid, recipient, peekedItem->GetOriginal()); - while (peekedItem && + // stop aggregation if we find an A-MSDU in the queue. This likely happens when an A-MSDU is + // prepared but not transmitted due to RTS/CTS failure + while (peekedItem && !peekedItem->GetHeader().IsQosAmsdu() && m_htFem->TryAggregateMsdu(peekedItem = m_htFem->CreateAliasIfNeeded(peekedItem), txParams, availableTime)) { + NS_ASSERT_MSG(!peekedItem->HasSeqNoAssigned(), + "Found item with sequence number assignment after one without: perhaps " + "sequence numbers were not released correctly?"); // find the next MPDU before dequeuing the current one Ptr msdu = peekedItem->GetOriginal(); peekedItem = queue->PeekByTidAndAddress(tid, recipient, msdu);