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);