diff --git a/src/wifi/model/rate-control/minstrel-ht-wifi-manager.cc b/src/wifi/model/rate-control/minstrel-ht-wifi-manager.cc index 47b525d1e..2a3dbc6a4 100644 --- a/src/wifi/model/rate-control/minstrel-ht-wifi-manager.cc +++ b/src/wifi/model/rate-control/minstrel-ht-wifi-manager.cc @@ -32,6 +32,7 @@ #include "ns3/wifi-mac.h" #include "ns3/wifi-net-device.h" #include "ns3/wifi-phy.h" +#include "ns3/wifi-psdu.h" #include @@ -1173,6 +1174,27 @@ MinstrelHtWifiManager::DoGetRtsTxVector(WifiRemoteStation* st) } } +std::list> +MinstrelHtWifiManager::DoGetMpdusToDropOnTxFailure(WifiRemoteStation* station, Ptr psdu) +{ + NS_LOG_FUNCTION(this << *psdu); + + std::list> mpdusToDrop; + + for (const auto& mpdu : *PeekPointer(psdu)) + { + if (!DoNeedRetransmission(station, + mpdu->GetPacket(), + (mpdu->GetRetryCount() < GetMac()->GetFrameRetryLimit()))) + { + // this MPDU needs to be dropped + mpdusToDrop.push_back(mpdu); + } + } + + return mpdusToDrop; +} + bool MinstrelHtWifiManager::DoNeedRetransmission(WifiRemoteStation* st, Ptr packet, diff --git a/src/wifi/model/rate-control/minstrel-ht-wifi-manager.h b/src/wifi/model/rate-control/minstrel-ht-wifi-manager.h index e76e7a00a..cfbb2c669 100644 --- a/src/wifi/model/rate-control/minstrel-ht-wifi-manager.h +++ b/src/wifi/model/rate-control/minstrel-ht-wifi-manager.h @@ -272,6 +272,8 @@ class MinstrelHtWifiManager : public WifiRemoteStationManager double dataSnr, MHz_u dataChannelWidth, uint8_t dataNss) override; + std::list> DoGetMpdusToDropOnTxFailure(WifiRemoteStation* station, + Ptr psdu) override; bool DoNeedRetransmission(WifiRemoteStation* st, Ptr packet, bool normally) override; diff --git a/src/wifi/model/rate-control/minstrel-wifi-manager.cc b/src/wifi/model/rate-control/minstrel-wifi-manager.cc index b88b7c98a..c1feb5004 100644 --- a/src/wifi/model/rate-control/minstrel-wifi-manager.cc +++ b/src/wifi/model/rate-control/minstrel-wifi-manager.cc @@ -25,6 +25,7 @@ #include "ns3/simulator.h" #include "ns3/wifi-mac.h" #include "ns3/wifi-phy.h" +#include "ns3/wifi-psdu.h" #include @@ -936,6 +937,27 @@ MinstrelWifiManager::DoGetRtsTxVector(WifiRemoteStation* st) return GetRtsTxVector(station); } +std::list> +MinstrelWifiManager::DoGetMpdusToDropOnTxFailure(WifiRemoteStation* station, Ptr psdu) +{ + NS_LOG_FUNCTION(this << *psdu); + + std::list> mpdusToDrop; + + for (const auto& mpdu : *PeekPointer(psdu)) + { + if (!DoNeedRetransmission(station, + mpdu->GetPacket(), + (mpdu->GetRetryCount() < GetMac()->GetFrameRetryLimit()))) + { + // this MPDU needs to be dropped + mpdusToDrop.push_back(mpdu); + } + } + + return mpdusToDrop; +} + bool MinstrelWifiManager::DoNeedRetransmission(WifiRemoteStation* st, Ptr packet, diff --git a/src/wifi/model/rate-control/minstrel-wifi-manager.h b/src/wifi/model/rate-control/minstrel-wifi-manager.h index f9902a732..b07cdfd63 100644 --- a/src/wifi/model/rate-control/minstrel-wifi-manager.h +++ b/src/wifi/model/rate-control/minstrel-wifi-manager.h @@ -252,7 +252,8 @@ class MinstrelWifiManager : public WifiRemoteStationManager void DoReportFinalDataFailed(WifiRemoteStation* station) override; WifiTxVector DoGetDataTxVector(WifiRemoteStation* station, MHz_u allowedWidth) override; WifiTxVector DoGetRtsTxVector(WifiRemoteStation* station) override; - + std::list> DoGetMpdusToDropOnTxFailure(WifiRemoteStation* station, + Ptr psdu) override; bool DoNeedRetransmission(WifiRemoteStation* st, Ptr packet, bool normally) override;