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.
This commit is contained in:
Stefano Avallone
2023-09-08 09:26:15 +02:00
parent d6db2e45de
commit 0d693ef45e
2 changed files with 7 additions and 1 deletions

View File

@@ -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
------------

View File

@@ -127,11 +127,16 @@ MsduAggregator::GetNextAmsdu(Ptr<WifiMpdu> 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<const WifiMpdu> msdu = peekedItem->GetOriginal();
peekedItem = queue->PeekByTidAndAddress(tid, recipient, msdu);