From 28eb35799227dc94c97a5272141fdda402fcf515 Mon Sep 17 00:00:00 2001 From: Alexander Krotov Date: Wed, 17 Feb 2021 12:33:30 +0300 Subject: [PATCH] wifi: use uint16_t to count MPDUs in A-MPDU Since IEEE 802.11ax standard increased maximum Block Ack Bitmap length to 256, and HeConfiguration::MpduBufferSize can be set to value 256, numbers of MPDUs in block ack manager and rate control should be stored in uint16_t. Before this patch, when 256 MPDUs were received in one A-MPDU, nSuccessfulMpdus counter overflowed and was accounted as 0. --- src/wifi/model/block-ack-manager.cc | 4 ++-- src/wifi/model/rate-control/ideal-wifi-manager.cc | 4 ++-- src/wifi/model/rate-control/ideal-wifi-manager.h | 2 +- .../model/rate-control/minstrel-ht-wifi-manager.cc | 10 +++++----- src/wifi/model/rate-control/minstrel-ht-wifi-manager.h | 4 ++-- src/wifi/model/wifi-remote-station-manager.cc | 6 +++--- src/wifi/model/wifi-remote-station-manager.h | 4 ++-- 7 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/wifi/model/block-ack-manager.cc b/src/wifi/model/block-ack-manager.cc index e0c3bda0f..49de49082 100644 --- a/src/wifi/model/block-ack-manager.cc +++ b/src/wifi/model/block-ack-manager.cc @@ -456,8 +456,8 @@ BlockAckManager::NotifyGotBlockAck (const CtrlBAckResponseHeader *blockAck, Mac4 if (ExistsAgreementInState (recipient, tid, OriginatorBlockAckAgreement::ESTABLISHED)) { bool foundFirstLost = false; - uint8_t nSuccessfulMpdus = 0; - uint8_t nFailedMpdus = 0; + uint16_t nSuccessfulMpdus = 0; + uint16_t nFailedMpdus = 0; AgreementsI it = m_agreements.find (std::make_pair (recipient, tid)); PacketQueueI queueEnd = it->second.second.end (); diff --git a/src/wifi/model/rate-control/ideal-wifi-manager.cc b/src/wifi/model/rate-control/ideal-wifi-manager.cc index 21a1cc153..43fe69070 100644 --- a/src/wifi/model/rate-control/ideal-wifi-manager.cc +++ b/src/wifi/model/rate-control/ideal-wifi-manager.cc @@ -282,10 +282,10 @@ IdealWifiManager::DoReportDataOk (WifiRemoteStation *st, double ackSnr, WifiMode } void -IdealWifiManager::DoReportAmpduTxStatus (WifiRemoteStation *st, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus, +IdealWifiManager::DoReportAmpduTxStatus (WifiRemoteStation *st, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) { - NS_LOG_FUNCTION (this << st << +nSuccessfulMpdus << +nFailedMpdus << rxSnr << dataSnr << dataChannelWidth << +dataNss); + NS_LOG_FUNCTION (this << st << nSuccessfulMpdus << nFailedMpdus << rxSnr << dataSnr << dataChannelWidth << +dataNss); IdealWifiRemoteStation *station = static_cast (st); if (dataSnr == 0) { diff --git a/src/wifi/model/rate-control/ideal-wifi-manager.h b/src/wifi/model/rate-control/ideal-wifi-manager.h index 36bc40a34..87c12cba5 100644 --- a/src/wifi/model/rate-control/ideal-wifi-manager.h +++ b/src/wifi/model/rate-control/ideal-wifi-manager.h @@ -69,7 +69,7 @@ private: double ctsSnr, WifiMode ctsMode, double rtsSnr); void DoReportDataOk (WifiRemoteStation *station, double ackSnr, WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss); - void DoReportAmpduTxStatus (WifiRemoteStation *station, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus, + void DoReportAmpduTxStatus (WifiRemoteStation *station, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss); void DoReportFinalRtsFailed (WifiRemoteStation *station); void DoReportFinalDataFailed (WifiRemoteStation *station); 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 1fddfe44d..323cadd1f 100644 --- a/src/wifi/model/rate-control/minstrel-ht-wifi-manager.cc +++ b/src/wifi/model/rate-control/minstrel-ht-wifi-manager.cc @@ -632,10 +632,10 @@ MinstrelHtWifiManager::DoReportFinalDataFailed (WifiRemoteStation *st) } void -MinstrelHtWifiManager::DoReportAmpduTxStatus (WifiRemoteStation *st, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus, +MinstrelHtWifiManager::DoReportAmpduTxStatus (WifiRemoteStation *st, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) { - NS_LOG_FUNCTION (this << st << +nSuccessfulMpdus << +nFailedMpdus << rxSnr << dataSnr << dataChannelWidth << +dataNss); + NS_LOG_FUNCTION (this << st << nSuccessfulMpdus << nFailedMpdus << rxSnr << dataSnr << dataChannelWidth << +dataNss); MinstrelHtWifiRemoteStation *station = static_cast (st); CheckInit (station); @@ -647,7 +647,7 @@ MinstrelHtWifiManager::DoReportAmpduTxStatus (WifiRemoteStation *st, uint8_t nSu NS_ASSERT_MSG (station->m_isHt, "A-MPDU Tx Status called but no HT or VHT supported."); NS_LOG_DEBUG ("DoReportAmpduTxStatus. TxRate=" << station->m_txrate << " SuccMpdus=" << - +nSuccessfulMpdus << " FailedMpdus=" << +nFailedMpdus); + nSuccessfulMpdus << " FailedMpdus=" << nFailedMpdus); station->m_ampduPacketCount++; station->m_ampduLen += nSuccessfulMpdus + nFailedMpdus; @@ -793,9 +793,9 @@ MinstrelHtWifiManager::UpdateRetry (MinstrelHtWifiRemoteStation *station) } void -MinstrelHtWifiManager::UpdatePacketCounters (MinstrelHtWifiRemoteStation *station, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus) +MinstrelHtWifiManager::UpdatePacketCounters (MinstrelHtWifiRemoteStation *station, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus) { - NS_LOG_FUNCTION (this << station << +nSuccessfulMpdus << +nFailedMpdus); + NS_LOG_FUNCTION (this << station << nSuccessfulMpdus << nFailedMpdus); station->m_totalPacketsCount += nSuccessfulMpdus + nFailedMpdus; if (station->m_isSampling) 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 70c1674d8..35d9b8dd2 100644 --- a/src/wifi/model/rate-control/minstrel-ht-wifi-manager.h +++ b/src/wifi/model/rate-control/minstrel-ht-wifi-manager.h @@ -235,7 +235,7 @@ private: void DoReportFinalDataFailed (WifiRemoteStation *station); WifiTxVector DoGetDataTxVector (WifiRemoteStation *station); WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station); - void DoReportAmpduTxStatus (WifiRemoteStation *station, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus, + void DoReportAmpduTxStatus (WifiRemoteStation *station, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss); bool DoNeedRetransmission (WifiRemoteStation *st, Ptr packet, bool normally); @@ -313,7 +313,7 @@ private: * \param nSuccessfulMpdus the number of successfully received MPDUs * \param nFailedMpdus the number of failed MPDUs */ - void UpdatePacketCounters (MinstrelHtWifiRemoteStation *station, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus); + void UpdatePacketCounters (MinstrelHtWifiRemoteStation *station, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus); /** * Getting the next sample from Sample Table. diff --git a/src/wifi/model/wifi-remote-station-manager.cc b/src/wifi/model/wifi-remote-station-manager.cc index 7adee45f6..28c499e00 100644 --- a/src/wifi/model/wifi-remote-station-manager.cc +++ b/src/wifi/model/wifi-remote-station-manager.cc @@ -896,10 +896,10 @@ WifiRemoteStationManager::ReportRxOk (Mac48Address address, RxSignalInfo rxSigna void WifiRemoteStationManager::ReportAmpduTxStatus (Mac48Address address, - uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus, + uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus, double rxSnr, double dataSnr, WifiTxVector dataTxVector) { - NS_LOG_FUNCTION (this << address << +nSuccessfulMpdus << +nFailedMpdus << rxSnr << dataSnr << dataTxVector); + NS_LOG_FUNCTION (this << address << SuccessfulMpdus << nFailedMpdus << rxSnr << dataSnr << dataTxVector); NS_ASSERT (!address.IsGroup ()); for (uint8_t i = 0; i < nFailedMpdus; i++) { @@ -1578,7 +1578,7 @@ WifiRemoteStationManager::DoNeedFragmentation (WifiRemoteStation *station, } void -WifiRemoteStationManager::DoReportAmpduTxStatus (WifiRemoteStation *station, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) +WifiRemoteStationManager::DoReportAmpduTxStatus (WifiRemoteStation *station, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) { NS_LOG_DEBUG ("DoReportAmpduTxStatus received but the manager does not handle A-MPDUs!"); } diff --git a/src/wifi/model/wifi-remote-station-manager.h b/src/wifi/model/wifi-remote-station-manager.h index c715e7901..8d9b494fa 100644 --- a/src/wifi/model/wifi-remote-station-manager.h +++ b/src/wifi/model/wifi-remote-station-manager.h @@ -745,7 +745,7 @@ public: * \param dataSnr data SNR reported by remote station * \param dataTxVector the TXVECTOR of the MPDUs we sent */ - void ReportAmpduTxStatus (Mac48Address address, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus, + void ReportAmpduTxStatus (Mac48Address address, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus, double rxSnr, double dataSnr, WifiTxVector dataTxVector); /** @@ -1177,7 +1177,7 @@ private: * \param dataChannelWidth the channel width (in MHz) of the A-MPDU we sent * \param dataNss the number of spatial streams used to send the A-MPDU */ - virtual void DoReportAmpduTxStatus (WifiRemoteStation *station, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus, + virtual void DoReportAmpduTxStatus (WifiRemoteStation *station, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss); /**