From 345a3ec95fedd75ebc6248b42e99455fee013150 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deronne?= Date: Sun, 3 Dec 2023 14:34:02 +0100 Subject: [PATCH] wifi: First group addressed frame might be transmitted using No-Ack/No-Retry policy before retransmitting it to the concealment address --- src/wifi/model/frame-exchange-manager.cc | 7 +++++-- src/wifi/model/ht/ht-frame-exchange-manager.cc | 10 +++++++--- src/wifi/model/msdu-aggregator.cc | 7 +++++++ src/wifi/model/qos-txop.cc | 13 +++++++++---- 4 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/wifi/model/frame-exchange-manager.cc b/src/wifi/model/frame-exchange-manager.cc index b78f412a0..6b3b7383f 100644 --- a/src/wifi/model/frame-exchange-manager.cc +++ b/src/wifi/model/frame-exchange-manager.cc @@ -532,9 +532,12 @@ FrameExchangeManager::SendMpdu() Simulator::Schedule(txDuration + m_phy->GetSifs(), [=, this, mpdu = m_mpdu]() { NS_LOG_DEBUG("Prepare groupcast MPDU for retry"); mpdu->ResetInFlight(m_linkId); - mpdu->GetHeader().SetRetry(); // restore addr1 to the group address instead of the concealment address - mpdu->GetHeader().SetAddr1(mpdu->begin()->second.GetDestinationAddr()); + if (m_apMac->GetGcrManager()->UseConcealment(mpdu->GetHeader())) + { + mpdu->GetHeader().SetAddr1(mpdu->begin()->second.GetDestinationAddr()); + } + mpdu->GetHeader().SetRetry(); }); } else diff --git a/src/wifi/model/ht/ht-frame-exchange-manager.cc b/src/wifi/model/ht/ht-frame-exchange-manager.cc index 8db969a2d..ac94638a1 100644 --- a/src/wifi/model/ht/ht-frame-exchange-manager.cc +++ b/src/wifi/model/ht/ht-frame-exchange-manager.cc @@ -1137,9 +1137,12 @@ HtFrameExchangeManager::SendPsdu() for (const auto& mpdu : *PeekPointer(psdu)) { mpdu->ResetInFlight(m_linkId); - mpdu->GetHeader().SetRetry(); // restore addr1 to the group address instead of the concealment address - mpdu->GetHeader().SetAddr1(mpdu->begin()->second.GetDestinationAddr()); + if (m_apMac->GetGcrManager()->UseConcealment(mpdu->GetHeader())) + { + mpdu->GetHeader().SetAddr1(mpdu->begin()->second.GetDestinationAddr()); + } + mpdu->GetHeader().SetRetry(); } }); } @@ -1278,7 +1281,8 @@ HtFrameExchangeManager::FinalizeMacHeader(Ptr psdu) hdr.SetQosQueueSize(queueSizeForTid[tid].value()); } - if (m_mac->GetTypeOfStation() == AP && m_apMac->UseGcr(hdr)) + if (m_mac->GetTypeOfStation() == AP && m_apMac->UseGcr(hdr) && + m_apMac->GetGcrManager()->UseConcealment(mpdu->GetHeader())) { const auto& gcrConcealmentAddress = m_apMac->GetGcrManager()->GetGcrConcealmentAddress(); diff --git a/src/wifi/model/msdu-aggregator.cc b/src/wifi/model/msdu-aggregator.cc index 9e5ae4f01..545e0d468 100644 --- a/src/wifi/model/msdu-aggregator.cc +++ b/src/wifi/model/msdu-aggregator.cc @@ -109,6 +109,13 @@ MsduAggregator::GetNextAmsdu(Ptr peekedItem, // if GCR, A-MSDU is always used with a single A-MSDU subframe if (IsGcr(m_mac, header)) { + auto apMac = DynamicCast(m_mac); + NS_ASSERT(apMac); + auto gcrManager = apMac->GetGcrManager(); + if (!gcrManager->UseConcealment(peekedItem->GetHeader())) + { + return nullptr; + } auto msdu = peekedItem->GetOriginal(); auto gcrAmsdu = Create(msdu->GetPacket(), msdu->GetHeader(), msdu->GetTimestamp()); diff --git a/src/wifi/model/qos-txop.cc b/src/wifi/model/qos-txop.cc index 8e83bed79..429d5b4d1 100644 --- a/src/wifi/model/qos-txop.cc +++ b/src/wifi/model/qos-txop.cc @@ -14,6 +14,7 @@ #include "ap-wifi-mac.h" #include "channel-access-manager.h" #include "ctrl-headers.h" +#include "gcr-manager.h" #include "mac-tx-middle.h" #include "mgt-action-headers.h" #include "mpdu-aggregator.h" @@ -556,10 +557,14 @@ QosTxop::GetNextMpdu(uint8_t linkId, GetBaBufferSize(peekedItem->GetOriginal()->GetHeader().GetAddr1(), tid))); // try A-MSDU aggregation if the MPDU does not contain an A-MSDU and does not already - // have a sequence number assigned (may be a retransmission) - if (m_mac->GetHtConfiguration() && !recipient.IsBroadcast() && - !peekedItem->GetHeader().IsQosAmsdu() && !peekedItem->HasSeqNoAssigned() && - !peekedItem->IsFragment()) + // have a sequence number assigned (may be a retransmission) unless it is a concealed GCR + // MPDU: + if (auto apMac = DynamicCast(m_mac); + m_mac->GetHtConfiguration() && !recipient.IsBroadcast() && + !peekedItem->GetHeader().IsQosAmsdu() && !peekedItem->IsFragment() && + (!peekedItem->HasSeqNoAssigned() || + (IsGcr(m_mac, peekedItem->GetHeader()) && + (apMac->GetGcrManager()->UseConcealment(peekedItem->GetHeader()))))) { auto htFem = StaticCast(qosFem); mpdu = htFem->GetMsduAggregator()->GetNextAmsdu(peekedItem, txParams, availableTime);