From 5394ee025ddba3f2bec5f87ff5957badbdd95cbf Mon Sep 17 00:00:00 2001 From: Stefano Avallone Date: Mon, 22 Jul 2024 22:11:16 +0200 Subject: [PATCH] wifi: Increment frame retry count on CTS timeout --- examples/wireless/examples-to-run.py | 4 +- src/wifi/model/frame-exchange-manager.cc | 23 +++------ .../model/he/he-frame-exchange-manager.cc | 50 +++++++------------ 3 files changed, 27 insertions(+), 50 deletions(-) diff --git a/examples/wireless/examples-to-run.py b/examples/wireless/examples-to-run.py index f19188742..e98cd8a83 100755 --- a/examples/wireless/examples-to-run.py +++ b/examples/wireless/examples-to-run.py @@ -215,12 +215,12 @@ cpp_examples = [ "True", ), ( - "wifi-eht-network --simulationTime=0.3s --frequency=2.4 --frequency2=5 --frequency3=6 --guardInterval=1600 --udp=0 --downlink=1 --useRts=0 --mpduBufferSize=512 --emlsrLinks=0,1,2 --emlsrPaddingDelay=32 --emlsrTransitionDelay=32 --channelSwitchDelay=32 --emlsrAuxSwitch=True --emlsrAuxTxCapable=True --nStations=4 --dlAckType=AGGR-MU-BAR --enableUlOfdma=1 --enableBsrp=0 --mcs=0,3,5,9,10 --minExpectedThroughput=8 --maxExpectedThroughput=300", + "wifi-eht-network --simulationTime=0.3s --frequency=2.4 --frequency2=5 --frequency3=6 --guardInterval=1600 --udp=0 --downlink=1 --useRts=0 --mpduBufferSize=512 --emlsrLinks=0,1,2 --emlsrPaddingDelay=32 --emlsrTransitionDelay=32 --channelSwitchDelay=32 --emlsrAuxSwitch=True --emlsrAuxTxCapable=True --nStations=4 --dlAckType=AGGR-MU-BAR --enableUlOfdma=1 --enableBsrp=0 --mcs=0,3,5,9,10 --minExpectedThroughput=8 --maxExpectedThroughput=300 --RngRun=2", "True", "True", ), ( - "wifi-eht-network --simulationTime=0.3s --frequency=2.4 --frequency2=5 --frequency3=6 --guardInterval=1600 --udp=0 --downlink=0 --useRts=1 --mpduBufferSize=512 --emlsrLinks=0,1,2 --emlsrPaddingDelay=64 --emlsrTransitionDelay=64 --channelSwitchDelay=64 --emlsrAuxSwitch=False --emlsrAuxTxCapable=True --nStations=4 --dlAckType=MU-BAR --enableUlOfdma=1 --enableBsrp=1 --mcs=1,4,8,11,13 --minExpectedThroughput=10 --maxExpectedThroughput=260 --RngRun=3", + "wifi-eht-network --simulationTime=0.3s --frequency=2.4 --frequency2=5 --frequency3=6 --guardInterval=1600 --udp=0 --downlink=0 --useRts=1 --mpduBufferSize=512 --emlsrLinks=0,1,2 --emlsrPaddingDelay=64 --emlsrTransitionDelay=64 --channelSwitchDelay=64 --emlsrAuxSwitch=False --emlsrAuxTxCapable=True --nStations=4 --dlAckType=MU-BAR --enableUlOfdma=1 --enableBsrp=1 --mcs=1,4,8,11,13 --minExpectedThroughput=10 --maxExpectedThroughput=260 --RngRun=4", "True", "True", ), diff --git a/src/wifi/model/frame-exchange-manager.cc b/src/wifi/model/frame-exchange-manager.cc index 072b7c476..b1aecd817 100644 --- a/src/wifi/model/frame-exchange-manager.cc +++ b/src/wifi/model/frame-exchange-manager.cc @@ -1071,24 +1071,13 @@ FrameExchangeManager::DoCtsTimeout(Ptr psdu) } GetWifiRemoteStationManager()->ReportRtsFailed(psdu->GetHeader(0)); + if (auto droppedMpdu = DropMpduIfRetryLimitReached(psdu)) + { + GetWifiRemoteStationManager()->ReportFinalRtsFailed(droppedMpdu->GetHeader()); + } + + m_dcf->UpdateFailedCw(m_linkId); - if (!GetWifiRemoteStationManager()->NeedRetransmission(*psdu->begin())) - { - NS_LOG_DEBUG("Missed CTS, discard MPDU(s)"); - GetWifiRemoteStationManager()->ReportFinalRtsFailed(psdu->GetHeader(0)); - for (const auto& mpdu : *PeekPointer(psdu)) - { - // Dequeue the MPDU if it is stored in a queue - DequeueMpdu(mpdu); - NotifyPacketDiscarded(mpdu); - } - m_dcf->ResetCw(m_linkId); - } - else - { - NS_LOG_DEBUG("Missed CTS, retransmit MPDU(s)"); - m_dcf->UpdateFailedCw(m_linkId); - } // Make the sequence numbers of the MPDUs available again if the MPDUs have never // been transmitted, both in case the MPDUs have been discarded and in case the // MPDUs have to be transmitted (because a new sequence number is assigned to diff --git a/src/wifi/model/he/he-frame-exchange-manager.cc b/src/wifi/model/he/he-frame-exchange-manager.cc index 3edbca288..9c19ac491 100644 --- a/src/wifi/model/he/he-frame-exchange-manager.cc +++ b/src/wifi/model/he/he-frame-exchange-manager.cc @@ -451,45 +451,33 @@ HeFrameExchangeManager::DoCtsAfterMuRtsTimeout(Ptr muRts, } } - // NOTE Implementation of QSRC[AC] and QLRC[AC] should be improved... - const auto& hdr = m_psduMap.cbegin()->second->GetHeader(0); - if (!hdr.GetAddr1().IsGroup()) + if (const auto& hdr = m_psduMap.cbegin()->second->GetHeader(0); !hdr.GetAddr1().IsGroup()) { GetWifiRemoteStationManager()->ReportRtsFailed(hdr); } - if (!hdr.GetAddr1().IsGroup() && - !GetWifiRemoteStationManager()->NeedRetransmission(*m_psduMap.cbegin()->second->begin())) - { - NS_LOG_DEBUG("Missed CTS, discard MPDUs"); - GetWifiRemoteStationManager()->ReportFinalRtsFailed(hdr); - for (const auto& psdu : m_psduMap) - { - // Dequeue the MPDUs if they are stored in a queue - DequeuePsdu(psdu.second); - for (const auto& mpdu : *PeekPointer(psdu.second)) - { - NotifyPacketDiscarded(mpdu); - } - } - m_edca->ResetCw(m_linkId); - } - else - { - NS_LOG_DEBUG("Missed CTS, retransmit MPDUs"); - if (updateFailedCw) - { - m_edca->UpdateFailedCw(m_linkId); - } - } - // Make the sequence numbers of the MPDUs available again if the MPDUs have never - // been transmitted, both in case the MPDUs have been discarded and in case the - // MPDUs have to be transmitted (because a new sequence number is assigned to - // MPDUs that have never been transmitted and are selected for transmission) for (const auto& [staId, psdu] : m_psduMap) { + if (psdu->GetAddr1().IsGroup()) + { + continue; + } + if (auto droppedMpdu = DropMpduIfRetryLimitReached(psdu)) + { + GetWifiRemoteStationManager()->ReportFinalRtsFailed(droppedMpdu->GetHeader()); + } + // Make the sequence numbers of the MPDUs available again if the MPDUs have never + // been transmitted, both in case the MPDUs have been discarded and in case the + // MPDUs have to be transmitted (because a new sequence number is assigned to + // MPDUs that have never been transmitted and are selected for transmission) ReleaseSequenceNumbers(psdu); } + + if (updateFailedCw) + { + m_edca->UpdateFailedCw(m_linkId); + } + m_psduMap.clear(); TransmissionFailed(); }