A Discrete-Event Network Simulator
API
minstrel-ht-wifi-manager.h
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2009 Duy Nguyen
4  * Copyright (c) 2015 Ghada Badawy
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation;
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18  *
19  *Authors: Duy Nguyen <duy@soe.ucsc.edu>
20  * Ghada Badawy <gbadawy@gmail.com>
21  * Matias Richart <mrichart@fing.edu.uy>
22  *
23  * MinstrelHt is a rate adaptation algorithm for high-throughput (HT) 802.11
24  */
25 
26 #ifndef MINSTREL_HT_WIFI_MANAGER_H
27 #define MINSTREL_HT_WIFI_MANAGER_H
28 
29 #include "ns3/wifi-remote-station-manager.h"
30 #include "minstrel-wifi-manager.h"
31 #include "ns3/wifi-mpdu-type.h"
32 
33 namespace ns3 {
34 
38 typedef std::map<WifiMode, Time> TxTime;
39 
45  {
46  GROUP_HT = 0,
49  };
50 
58 inline std::ostream& operator<< (std::ostream& os, McsGroupType type)
59 {
60  switch (type)
61  {
62  case GROUP_HT:
63  return (os << "HT");
64  case GROUP_VHT:
65  return (os << "VHT");
66  case GROUP_HE:
67  return (os << "HE");
68  default:
69  return (os << "INVALID");
70  }
71 }
72 
79 struct McsGroup
80 {
81  uint8_t streams;
82  uint16_t gi;
83  uint16_t chWidth;
85  bool isSupported;
86  // To accurately account for TX times, we separate the TX time of the first
87  // MPDU in an A-MPDU from the rest of the MPDUs.
90 };
91 
96 typedef std::vector<McsGroup> MinstrelMcsGroups;
97 
103 {
109  bool supported;
110  uint8_t mcsIndex;
111  uint32_t retryCount;
113  uint32_t numRateAttempt;
114  uint32_t numRateSuccess;
115  double prob;
117 
122  double ewmaProb;
123  double ewmsdProb;
126  uint32_t numSamplesSkipped;
127  uint64_t successHist;
128  uint64_t attemptHist;
129  double throughput;
130 };
131 
136 typedef std::vector<MinstrelHtRateInfo> MinstrelHtRate;
137 
141 struct GroupInfo
142 {
146  uint8_t m_col;
147  uint8_t m_index;
148  bool m_supported;
149  uint16_t m_maxTpRate;
150  uint16_t m_maxTpRate2;
151  uint16_t m_maxProbRate;
153 };
154 
159 typedef std::vector<struct GroupInfo> McsGroupData;
160 
165 static const uint8_t MAX_HT_SUPPORTED_STREAMS = 4;
166 static const uint8_t MAX_VHT_SUPPORTED_STREAMS = 8;
167 static const uint8_t MAX_HE_SUPPORTED_STREAMS = 8;
168 static const uint8_t MAX_HT_STREAM_GROUPS = 4;
169 static const uint8_t MAX_VHT_STREAM_GROUPS = 8;
170 static const uint8_t MAX_HE_STREAM_GROUPS = 12;
171 static const uint8_t MAX_HT_GROUP_RATES = 8;
172 static const uint8_t MAX_VHT_GROUP_RATES = 10;
173 static const uint8_t MAX_HE_GROUP_RATES = 12;
174 static const uint8_t MAX_HT_WIDTH = 40;
175 static const uint8_t MAX_VHT_WIDTH = 160;
176 static const uint8_t MAX_HE_WIDTH = 160;
177 
223 {
224 public:
229  static TypeId GetTypeId (void);
231  virtual ~MinstrelHtWifiManager ();
232 
233  void SetupPhy (const Ptr<WifiPhy> phy) override;
234  void SetupMac (const Ptr<WifiMac> mac) override;
235  int64_t AssignStreams (int64_t stream) override;
236 
243  typedef void (*RateChangeTracedCallback)(const uint64_t rate, const Mac48Address remoteAddress);
244 
245 
246 private:
247  void DoInitialize (void) override;
248  WifiRemoteStation * DoCreateStation (void) const override;
249  void DoReportRxOk (WifiRemoteStation *station,
250  double rxSnr, WifiMode txMode) override;
251  void DoReportRtsFailed (WifiRemoteStation *station) override;
252  void DoReportDataFailed (WifiRemoteStation *station) override;
253  void DoReportRtsOk (WifiRemoteStation *station,
254  double ctsSnr, WifiMode ctsMode, double rtsSnr) override;
255  void DoReportDataOk (WifiRemoteStation *station, double ackSnr, WifiMode ackMode,
256  double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) override;
257  void DoReportFinalRtsFailed (WifiRemoteStation *station) override;
258  void DoReportFinalDataFailed (WifiRemoteStation *station) override;
260  WifiTxVector DoGetRtsTxVector (WifiRemoteStation *station) override;
261  void DoReportAmpduTxStatus (WifiRemoteStation *station, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus,
262  double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) override;
263  bool DoNeedRetransmission (WifiRemoteStation *st, Ptr<const Packet> packet, bool normally) override;
264 
274  bool IsValidMcs (Ptr<WifiPhy> phy, uint8_t streams, uint16_t chWidth, WifiMode mode);
275 
287  Time CalculateMpduTxDuration (Ptr<WifiPhy> phy, uint8_t streams, uint16_t gi,
288  uint16_t chWidth, WifiMode mode, MpduType mpduType);
289 
297  Time GetMpduTxTime (uint8_t groupId, WifiMode mode) const;
298 
306  void AddMpduTxTime (uint8_t groupId, WifiMode mode, Time t);
307 
315  Time GetFirstMpduTxTime (uint8_t groupId, WifiMode mode) const;
316 
324  void AddFirstMpduTxTime (uint8_t groupId, WifiMode mode, Time t);
325 
331 
339  void UpdatePacketCounters (MinstrelHtWifiRemoteStation *station, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus);
340 
347  uint16_t GetNextSample (MinstrelHtWifiRemoteStation *station);
348 
355 
362  uint16_t FindRate (MinstrelHtWifiRemoteStation *station);
363 
370 
376  void RateInit (MinstrelHtWifiRemoteStation *station);
377 
387  double CalculateThroughput (MinstrelHtWifiRemoteStation *station, uint8_t groupId, uint8_t rateId, double ewmaProb);
388 
395  void SetBestStationThRates (MinstrelHtWifiRemoteStation *station, uint16_t index);
396 
403  void SetBestProbabilityRate (MinstrelHtWifiRemoteStation *station, uint16_t index);
404 
411  void CalculateRetransmits (MinstrelHtWifiRemoteStation *station, uint16_t index);
412 
420  void CalculateRetransmits (MinstrelHtWifiRemoteStation *station, uint8_t groupId, uint8_t rateId);
421 
443  Time CalculateTimeUnicastPacket (Time dataTransmissionTime, uint32_t shortRetries, uint32_t longRetries);
444 
454  double CalculateEwmsd (double oldEwmsd, double currentProb, double ewmaProb, double weight);
455 
462 
469 
475  void PrintTable (MinstrelHtWifiRemoteStation *station);
476 
484  void StatsDump (MinstrelHtWifiRemoteStation *station, uint8_t groupId, std::ofstream &of);
485 
491  void CheckInit (MinstrelHtWifiRemoteStation *station);
492 
499  uint32_t CountRetries (MinstrelHtWifiRemoteStation * station);
500 
506  void UpdateRate (MinstrelHtWifiRemoteStation *station);
507 
514  uint8_t GetRateId (uint16_t index);
515 
522  uint8_t GetGroupId (uint16_t index);
523 
535  uint16_t GetIndex (uint8_t groupId, uint8_t rateId);
536 
545  uint8_t GetHtGroupId (uint8_t txstreams, uint16_t gi, uint16_t chWidth);
546 
555  uint8_t GetVhtGroupId (uint8_t txstreams, uint16_t gi, uint16_t chWidth);
556 
565  uint8_t GetHeGroupId (uint8_t txstreams, uint16_t gi, uint16_t chWidth);
566 
573  uint16_t GetLowestIndex (MinstrelHtWifiRemoteStation *station);
574 
582  uint16_t GetLowestIndex (MinstrelHtWifiRemoteStation *station, uint8_t groupId);
583 
589 
594  WifiModeList GetVhtDeviceMcsList (void) const;
595 
600  WifiModeList GetHtDeviceMcsList (void) const;
601 
605  uint8_t m_ewmaLevel;
606  uint8_t m_nSampleCol;
607  uint32_t m_frameLength;
608  uint8_t m_numGroups;
609  uint8_t m_numRates;
612 
614 
616 
618 
620 };
621 
622 } // namespace ns3
623 
624 #endif /* MINSTREL_HT_WIFI_MANAGER_H */
uint16_t m_maxProbRate
The highest success probability rate of this group in bps.
void DoReportAmpduTxStatus(WifiRemoteStation *station, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) override
Typically called per A-MPDU, either when a Block ACK was successfully received or when a BlockAckTime...
void SetupPhy(const Ptr< WifiPhy > phy) override
Set up PHY associated with this device since it is the object that knows the full set of transmit rat...
uint8_t GetHeGroupId(uint8_t txstreams, uint16_t gi, uint16_t chWidth)
Returns the groupId of an HE MCS with the given number of streams, GI and channel width used...
uint8_t m_nSampleCol
Number of sample columns.
uint8_t GetVhtGroupId(uint8_t txstreams, uint16_t gi, uint16_t chWidth)
Returns the groupId of a VHT MCS with the given number of streams, GI and channel width used...
void DoReportRtsFailed(WifiRemoteStation *station) override
This method is a pure virtual method that must be implemented by the sub-class.
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:103
bool m_supported
If the rates of this group are supported by the station.
Time GetMpduTxTime(uint8_t groupId, WifiMode mode) const
Obtain the TxTime saved in the group information.
A struct to contain information of a group.
WifiModeList GetVhtDeviceMcsList(void) const
Returns a list of only the VHT MCS supported by the device.
bool DoNeedRetransmission(WifiRemoteStation *st, Ptr< const Packet > packet, bool normally) override
double prob
Current probability within last time interval.
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
double ewmsdProb
Exponential weighted moving standard deviation of probability.
TracedValue< uint64_t > m_currentRate
Trace rate changes.
void PrintTable(MinstrelHtWifiRemoteStation *station)
Printing Minstrel Table.
static const uint8_t MAX_HE_STREAM_GROUPS
Maximal number of groups per stream in HE (4 possible channel widths and 3 possible GI configurations...
uint16_t GetLowestIndex(MinstrelHtWifiRemoteStation *station)
Returns the lowest global index of the rates supported by the station.
uint8_t m_col
MCS rates are divided into groups based on the number of streams and flags that they use...
WifiModeList GetHeDeviceMcsList() const
Returns a list of only the HE MCS supported by the device.
void SetBestProbabilityRate(MinstrelHtWifiRemoteStation *station, uint16_t index)
Set index rate as maxProbRate if it is better than current value.
uint8_t GetHtGroupId(uint8_t txstreams, uint16_t gi, uint16_t chWidth)
Returns the groupId of an HT MCS with the given number of streams, GI and channel width used...
MinstrelHtWifiRemoteStation structure.
void DoReportFinalDataFailed(WifiRemoteStation *station) override
This method is a pure virtual method that must be implemented by the sub-class.
void CalculateRetransmits(MinstrelHtWifiRemoteStation *station, uint16_t index)
Calculate the number of retransmissions to set for the index rate.
void DoInitialize(void) override
Initialize() implementation.
static const uint8_t MAX_VHT_STREAM_GROUPS
Maximal number of groups per stream in VHT (4 possible channel widths and 2 possible GI configuration...
bool isSupported
flag whether group is supported
Time m_legacyUpdateStats
How frequent do we calculate the stats for legacy MinstrelWifiManager.
uint16_t FindRate(MinstrelHtWifiRemoteStation *station)
Find a rate to use from Minstrel Table.
A struct to contain all statistics information related to a data rate.
uint32_t m_frameLength
Frame length used for calculate modes TxTime in bytes.
MinstrelMcsGroups m_minstrelGroups
Global array for groups information.
Time CalculateTimeUnicastPacket(Time dataTransmissionTime, uint32_t shortRetries, uint32_t longRetries)
Estimate the time to transmit the given packet with the given number of retries.
represent a single transmission modeA WifiMode is implemented by a single integer which is used to lo...
Definition: wifi-mode.h:47
uint8_t mcsIndex
The index in the operationalMcsSet of the WifiRemoteStationManager.
bool supported
If the rate is supported.
TxTime ratesFirstMpduTxTimeTable
rates MPDU transmit time table
WifiRemoteStation * DoCreateStation(void) const override
uint16_t gi
guard interval duration (nanoseconds)
uint8_t GetRateId(uint16_t index)
Return the rateId inside a group, from the global index.
bool m_printStats
If statistics table should be printed.
MpduType
The type of an MPDU.
bool retryUpdated
If number of retries was updated already.
uint16_t GetIndex(uint8_t groupId, uint8_t rateId)
Returns the global index corresponding to the groupId and rateId.
uint32_t numRateSuccess
Number of successful frames transmitted so far.
uint8_t m_index
Sample table index.
uint8_t m_lookAroundRate
The % to try other rates than our current rate.
phy
Definition: third.py:93
uint8_t m_ewmaLevel
Exponential weighted moving average level (or coefficient).
void SetBestStationThRates(MinstrelHtWifiRemoteStation *station, uint16_t index)
Set index rate as maxTpRate or maxTp2Rate if is better than current values.
std::ostream & operator<<(std::ostream &os, const Angles &a)
Definition: angles.cc:137
void SetupMac(const Ptr< WifiMac > mac) override
Set up MAC associated with this device since it is the object that knows the full set of timing param...
Time GetFirstMpduTxTime(uint8_t groupId, WifiMode mode) const
Obtain the TxTime saved in the group information.
TxTime ratesTxTimeTable
rates transmit time table
std::vector< MinstrelHtRateInfo > MinstrelHtRate
Data structure for a Minstrel Rate table.
McsGroupType type
identifies the group,
uint16_t chWidth
channel width (MHz)
WifiTxVector DoGetDataTxVector(WifiRemoteStation *station) override
uint64_t successHist
Aggregate of all transmission successes.
Time perfectTxTime
Perfect transmission time calculation, or frame calculation.
double ewmaProb
Exponential weighted moving average of probability.
static const uint8_t MAX_HE_SUPPORTED_STREAMS
Maximal number of streams supported by the HE PHY layer.
static const uint8_t MAX_VHT_GROUP_RATES
Number of rates (or MCS) per VHT group.
static const uint8_t MAX_HT_WIDTH
Maximal channel width in MHz.
mac
Definition: third.py:99
uint8_t streams
number of spatial streams
static const uint8_t MAX_HT_STREAM_GROUPS
Maximal number of groups per stream in HT (2 possible channel widths and 2 possible GI configurations...
bool m_useLatestAmendmentOnly
Flag if only the latest supported amendment by both peers should be used.
Ptr< UniformRandomVariable > m_uniformRandomVariable
Provides uniform random variables.
hold a list of per-remote-station state.
double throughput
Throughput of this rate (in packets per second).
std::vector< struct GroupInfo > McsGroupData
Data structure for a table of groups.
static TypeId GetTypeId(void)
Get the type ID.
static const uint8_t MAX_VHT_WIDTH
Maximal channel width in MHz.
uint16_t GetNextSample(MinstrelHtWifiRemoteStation *station)
Getting the next sample from Sample Table.
uint64_t attemptHist
Aggregate of all transmission attempts.
uint16_t m_maxTpRate2
The second max throughput rate of this group in bps.
bool IsValidMcs(Ptr< WifiPhy > phy, uint8_t streams, uint16_t chWidth, WifiMode mode)
Check the validity of a combination of number of streams, chWidth and mode.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
uint8_t m_numRates
Number of rates per group Minstrel should consider.
void InitSampleTable(MinstrelHtWifiRemoteStation *station)
Initialize Sample Table.
double CalculateThroughput(MinstrelHtWifiRemoteStation *station, uint8_t groupId, uint8_t rateId, double ewmaProb)
Return the average throughput of the MCS defined by groupId and rateId.
void UpdateRetry(MinstrelHtWifiRemoteStation *station)
Update the number of retries and reset accordingly.
uint8_t m_numGroups
Number of groups Minstrel should consider.
uint32_t numSamplesSkipped
Number of times this rate statistics were not updated because no attempts have been made...
Time m_updateStats
How frequent do we calculate the stats.
void DoReportFinalRtsFailed(WifiRemoteStation *station) override
This method is a pure virtual method that must be implemented by the sub-class.
an EUI-48 address
Definition: mac48-address.h:43
static const uint8_t MAX_HT_GROUP_RATES
Number of rates (or MCS) per HT group.
uint32_t adjustedRetryCount
Adjust the retry limit for this rate.
uint32_t numRateAttempt
Number of transmission attempts so far.
void UpdateStats(MinstrelHtWifiRemoteStation *station)
Update the Minstrel Table.
std::vector< WifiMode > WifiModeList
In various parts of the code, folk are interested in maintaining a list of transmission modes...
Definition: wifi-mode.h:254
static const uint8_t MAX_VHT_SUPPORTED_STREAMS
Maximal number of streams supported by the VHT PHY layer.
uint16_t m_maxTpRate
The max throughput rate of this group in bps.
void RateInit(MinstrelHtWifiRemoteStation *station)
Initialize Minstrel Table.
Implementation of Minstrel-HT Rate Control AlgorithmMinstrel-HT is a rate adaptation mechanism for th...
int64_t AssignStreams(int64_t stream) override
Assign a fixed random variable stream number to the random variables used by this model...
Data structure to contain the information that defines a group.
void DoReportDataFailed(WifiRemoteStation *station) override
This method is a pure virtual method that must be implemented by the sub-class.
McsGroupType
Available MCS group types.
void StatsDump(MinstrelHtWifiRemoteStation *station, uint8_t groupId, std::ofstream &of)
Print group statistics.
void DoReportRxOk(WifiRemoteStation *station, double rxSnr, WifiMode txMode) override
This method is a pure virtual method that must be implemented by the sub-class.
void UpdatePacketCounters(MinstrelHtWifiRemoteStation *station, uint16_t nSuccessfulMpdus, uint16_t nFailedMpdus)
Update the number of sample count variables.
std::map< WifiMode, Time > TxTime
Data structure to save transmission time calculations per rate.
double CalculateEwmsd(double oldEwmsd, double currentProb, double ewmaProb, double weight)
Perform EWMSD (Exponentially Weighted Moving Standard Deviation) calculation.
void(* RateChangeTracedCallback)(const uint64_t rate, const Mac48Address remoteAddress)
TracedCallback signature for rate change events.
void DoReportRtsOk(WifiRemoteStation *station, double ctsSnr, WifiMode ctsMode, double rtsSnr) override
This method is a pure virtual method that must be implemented by the sub-class.
std::vector< McsGroup > MinstrelMcsGroups
Data structure for a table of group definitions.
uint32_t prevNumRateAttempt
Number of transmission attempts with previous rate.
void AddMpduTxTime(uint8_t groupId, WifiMode mode, Time t)
Save a TxTime to the vector of groups.
WifiTxVector DoGetRtsTxVector(WifiRemoteStation *station) override
void SetNextSample(MinstrelHtWifiRemoteStation *station)
Set the next sample from Sample Table.
void PrintSampleTable(MinstrelHtWifiRemoteStation *station)
Printing Sample Table.
WifiModeList GetHtDeviceMcsList(void) const
Returns a list of only the HT MCS supported by the device.
MinstrelHtRate m_ratesTable
Information about rates of this group.
Ptr< MinstrelWifiManager > m_legacyManager
Pointer to an instance of MinstrelWifiManager.
uint8_t GetGroupId(uint16_t index)
Return the groupId from the global index.
Time CalculateMpduTxDuration(Ptr< WifiPhy > phy, uint8_t streams, uint16_t gi, uint16_t chWidth, WifiMode mode, MpduType mpduType)
Estimates the TxTime of a frame with a given mode and group (stream, guard interval and channel width...
static const uint8_t MAX_HE_WIDTH
Maximal channel width in MHz.
static const uint8_t MAX_HT_SUPPORTED_STREAMS
Constants for maximum values.
uint32_t CountRetries(MinstrelHtWifiRemoteStation *station)
Count retries.
void DoReportDataOk(WifiRemoteStation *station, double ackSnr, WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss) override
This method is a pure virtual method that must be implemented by the sub-class.
void UpdateRate(MinstrelHtWifiRemoteStation *station)
Update rate.
void AddFirstMpduTxTime(uint8_t groupId, WifiMode mode, Time t)
Save a TxTime to the vector of groups.
a unique identifier for an interface.
Definition: type-id.h:58
void CheckInit(MinstrelHtWifiRemoteStation *station)
Check for initializations.
hold per-remote-station state.
uint32_t prevNumRateSuccess
Number of successful frames transmitted with previous rate.
static const uint8_t MAX_HE_GROUP_RATES
Number of rates (or MCS) per HE group.
uint32_t retryCount
Retry limit.