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 
30 #include "minstrel-wifi-manager.h"
31 
32 namespace ns3 {
33 
38 typedef std::vector<std::pair<Time, WifiMode> > TxTime;
39 
46 struct McsGroup
47 {
48  uint8_t streams;
49  uint8_t sgi;
50  uint8_t chWidth;
51  bool isVht;
52  bool isSupported;
53 
54  // To accurately account for TX times, we separate the TX time of the first
55  // MPDU in an A-MPDU from the rest of the MPDUs.
58 };
59 
64 typedef std::vector<McsGroup> MinstrelMcsGroups;
65 
70 struct HtRateInfo
71 {
77 
78  bool supported;
79 
80  uint32_t mcsIndex;
81 
82  uint32_t retryCount;
83  uint32_t adjustedRetryCount;
84  uint32_t numRateAttempt;
85  uint32_t numRateSuccess;
86  double prob;
87 
88  bool retryUpdated;
89 
95  double ewmaProb;
96 
97  double ewmsdProb;
98 
99  uint32_t prevNumRateAttempt;
101  uint32_t numSamplesSkipped;
102  uint64_t successHist;
103  uint64_t attemptHist;
104  double throughput;
105 };
106 
111 typedef std::vector<HtRateInfo> HtMinstrelRate;
112 
116 struct GroupInfo
117 {
121  uint8_t m_col;
122  uint8_t m_index;
123 
124  bool m_supported;
125 
126  uint32_t m_maxTpRate;
127  uint32_t m_maxTpRate2;
128  uint32_t m_maxProbRate;
129 
130  HtMinstrelRate m_ratesTable;
131 };
132 
137 typedef std::vector<struct GroupInfo> McsGroupData;
138 
143 typedef std::vector<std::vector<uint32_t> > HtSampleRate;
144 
149 static const uint8_t MAX_SUPPORTED_STREAMS = 4;
150 static const uint8_t MAX_HT_STREAM_GROUPS = 4;
151 static const uint8_t MAX_VHT_STREAM_GROUPS = 8;
152 static const uint8_t MAX_HT_GROUP_RATES = 8;
153 static const uint8_t MAX_VHT_GROUP_RATES = 10;
154 static const uint8_t MAX_HT_WIDTH = 40;
155 static const uint8_t MAX_VHT_WIDTH = 160;
156 
202 {
203 public:
208  static TypeId GetTypeId (void);
210  virtual ~MinstrelHtWifiManager ();
211 
220  int64_t AssignStreams (int64_t stream);
221 
222  // Inherited from WifiRemoteStationManager
223  void SetupPhy (const Ptr<WifiPhy> phy);
224  void SetupMac (const Ptr<WifiMac> mac);
225  void SetHeSupported (bool enable); //HE rates not yet supported
226 
233  typedef void (*RateChangeTracedCallback)(const uint64_t rate, const Mac48Address remoteAddress);
234 
235 
236 private:
237  // Overriden from base class.
238  void DoInitialize (void);
239  WifiRemoteStation * DoCreateStation (void) const;
240  void DoReportRxOk (WifiRemoteStation *station,
241  double rxSnr, WifiMode txMode);
242  void DoReportRtsFailed (WifiRemoteStation *station);
243  void DoReportDataFailed (WifiRemoteStation *station);
244  void DoReportRtsOk (WifiRemoteStation *station,
245  double ctsSnr, WifiMode ctsMode, double rtsSnr);
246  void DoReportDataOk (WifiRemoteStation *station,
247  double ackSnr, WifiMode ackMode, double dataSnr);
253  uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus,
254  double rxSnr, double dataSnr);
255  bool IsLowLatency (void) const;
256  bool DoNeedDataRetransmission (WifiRemoteStation *st, Ptr<const Packet> packet, bool normally);
261  void DoDisposeStation (WifiRemoteStation *station);
262 
272  bool IsValidMcs (Ptr<WifiPhy> phy, uint8_t streams, uint8_t chWidth, WifiMode mode);
273 
284  Time CalculateMpduTxDuration (Ptr<WifiPhy> phy, uint8_t streams, uint8_t sgi, uint8_t chWidth, WifiMode mode);
285 
296  Time CalculateFirstMpduTxDuration (Ptr<WifiPhy> phy, uint8_t streams, uint8_t sgi, uint8_t chWidth, WifiMode mode);
297 
305  Time GetMpduTxTime (uint32_t groupId, WifiMode mode) const;
306 
314  void AddMpduTxTime (uint32_t groupId, WifiMode mode, Time t);
315 
323  Time GetFirstMpduTxTime (uint32_t groupId, WifiMode mode) const;
324 
332  void AddFirstMpduTxTime (uint32_t groupId, WifiMode mode, Time t);
333 
339 
347  void UpdatePacketCounters (MinstrelHtWifiRemoteStation *station, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus);
348 
355  uint32_t GetNextSample (MinstrelHtWifiRemoteStation *station);
356 
363 
370  uint32_t FindRate (MinstrelHtWifiRemoteStation *station);
371 
378 
384  void RateInit (MinstrelHtWifiRemoteStation *station);
385 
395  double CalculateThroughput (MinstrelHtWifiRemoteStation *station, uint32_t groupId, uint32_t rateId, double ewmaProb);
396 
403  void SetBestStationThRates (MinstrelHtWifiRemoteStation *station, uint32_t index);
404 
411  void SetBestProbabilityRate (MinstrelHtWifiRemoteStation *station, uint32_t index);
412 
419  void CalculateRetransmits (MinstrelHtWifiRemoteStation *station, uint32_t index);
420 
428  void CalculateRetransmits (MinstrelHtWifiRemoteStation *station, uint32_t groupId, uint32_t rateId);
429 
451  Time CalculateTimeUnicastPacket (Time dataTransmissionTime, uint32_t shortRetries, uint32_t longRetries);
452 
462  double CalculateEwmsd (double oldEwmsd, double currentProb, double ewmaProb, uint32_t weight);
463 
470 
477 
483  void PrintTable (MinstrelHtWifiRemoteStation *station);
484 
492  void StatsDump (MinstrelHtWifiRemoteStation *station, uint32_t index, std::ofstream &of);
493 
499  void CheckInit (MinstrelHtWifiRemoteStation *station);
500 
507  uint32_t CountRetries (MinstrelHtWifiRemoteStation * station);
508 
514  void UpdateRate (MinstrelHtWifiRemoteStation *station);
515 
533  uint32_t GetRateId (uint32_t index);
534 
541  uint32_t GetGroupId (uint32_t index);
542 
550  uint32_t GetIndex (uint32_t groupId, uint32_t rateId);
551 
560  uint32_t GetHtGroupId (uint8_t txstreams, uint8_t sgi, uint8_t chWidth);
561 
570  uint32_t GetVhtGroupId (uint8_t txstreams, uint8_t sgi, uint8_t chWidth);
571 
578  uint32_t GetLowestIndex (MinstrelHtWifiRemoteStation *station);
579 
587  uint32_t GetLowestIndex (MinstrelHtWifiRemoteStation *station, uint32_t groupId);
588 
593  WifiModeList GetVhtDeviceMcsList (void) const;
594 
599  WifiModeList GetHtDeviceMcsList (void) const;
600 
603  double m_ewmaLevel;
604 
605  uint32_t m_nSampleCol;
606  uint32_t m_frameLength;
607 
608 
609  uint8_t m_numGroups;
610  uint8_t m_numRates;
611 
613 
615 
616 
617  MinstrelMcsGroups m_minstrelGroups;
618 
620 
621 
623 
628 };
629 
630 } // namespace ns3
631 
632 #endif /* MINSTREL_HT_WIFI_MANAGER_H */
void DoReportRtsOk(WifiRemoteStation *station, double ctsSnr, WifiMode ctsMode, double rtsSnr)
This method is a pure virtual method that must be implemented by the sub-class.
double throughput
Throughput of this rate (in pkts per second).
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:102
bool m_supported
If the rates of this group are supported by the station.
void DoReportAmpduTxStatus(WifiRemoteStation *station, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus, double rxSnr, double dataSnr)
Typically called per A-MPDU, either when a Block ACK was successfully received or when a BlockAckTime...
A struct to contain information of a group.
double CalculateThroughput(MinstrelHtWifiRemoteStation *station, uint32_t groupId, uint32_t rateId, double ewmaProb)
Return the average throughput of the MCS defined by groupId and rateId.
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
static const uint8_t MAX_SUPPORTED_STREAMS
Constants for maximum values.
WifiModeList GetHtDeviceMcsList(void) const
Returns a list of only the HT MCS supported by the device.
void PrintTable(MinstrelHtWifiRemoteStation *station)
Printing Minstrel Table.
void SetupMac(const Ptr< WifiMac > mac)
Set up MAC associated with this device since it is the object that knows the full set of timing param...
void UpdatePacketCounters(MinstrelHtWifiRemoteStation *station, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus)
Update the number of sample count variables.
uint8_t m_col
MCS rates are divided into groups based on the number of streams and flags that they use...
uint32_t GetLowestIndex(MinstrelHtWifiRemoteStation *station)
Returns the lowest global index of the rates supported by the station.
uint32_t m_maxProbRate
The highest success probability rate of this group.
double CalculateEwmsd(double oldEwmsd, double currentProb, double ewmaProb, uint32_t weight)
Perform EWMSD (Exponentially Weighted Moving Standard Deviation) calculation.
MinstrelHtWifiRemoteStation structure.
Forward calls to a chain of Callback.
WifiTxVector DoGetDataTxVector(WifiRemoteStation *station)
uint32_t GetIndex(uint32_t groupId, uint32_t rateId)
Returns the global index corresponding to the groupId and rateId.
static const uint8_t MAX_VHT_STREAM_GROUPS
Maximal number of groups per stream in VHT (4 possible channel widths and 2 possible SGI configuratio...
bool isSupported
is supported?
uint32_t m_maxTpRate
The max throughput rate of this group.
double prob
Current probability within last time interval.
void DoReportFinalRtsFailed(WifiRemoteStation *station)
This method is a pure virtual method that must be implemented by the sub-class.
void StatsDump(MinstrelHtWifiRemoteStation *station, uint32_t index, std::ofstream &of)
Print group statistics.
HtMinstrelRate m_ratesTable
Information about rates of this group.
uint8_t sgi
short guard interval (0 or 1)
uint32_t GetHtGroupId(uint8_t txstreams, uint8_t sgi, uint8_t chWidth)
Returns the groupId of a HT MCS with the given number of streams, if using sgi and the channel width ...
void DoReportRxOk(WifiRemoteStation *station, double rxSnr, WifiMode txMode)
This method is a pure virtual method that must be implemented by the sub-class.
bool DoNeedDataRetransmission(WifiRemoteStation *st, Ptr< const Packet > packet, bool normally)
uint32_t m_frameLength
Frame length used for calculate modes TxTime.
std::vector< std::vector< uint32_t > > HtSampleRate
Data structure for a Sample Rate table.
MinstrelMcsGroups m_minstrelGroups
Global array for groups information.
STL namespace.
uint32_t m_maxTpRate2
The second max throughput rate of this group.
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:97
TxTime ratesFirstMpduTxTimeTable
rates MPDU transmit time table
bool m_printStats
If statistics table should be printed.
uint32_t adjustedRetryCount
Adjust the retry limit for this rate.
uint32_t numRateAttempt
Number of transmission attempts so far.
uint8_t m_index
Sample table index.
TxTime ratesTxTimeTable
rates transmit time table
void AddFirstMpduTxTime(uint32_t groupId, WifiMode mode, Time t)
Save a TxTime to the vector of groups.
tuple phy
Definition: third.py:86
WifiTxVector DoGetRtsTxVector(WifiRemoteStation *station)
double m_ewmaLevel
Exponential weighted moving average level (or coefficient).
void CalculateRetransmits(MinstrelHtWifiRemoteStation *station, uint32_t index)
Calculate the number of retransmissions to set for the index rate.
static const uint8_t MAX_VHT_GROUP_RATES
Number of rates (or MCS) per VHT group.
Time GetMpduTxTime(uint32_t groupId, WifiMode mode) const
Obtain the TXtime saved in the group information.
static const uint8_t MAX_HT_WIDTH
Maximal channel width.
bool IsValidMcs(Ptr< WifiPhy > phy, uint8_t streams, uint8_t chWidth, WifiMode mode)
Check the validity of a combination of number of streams, chWidth and mode.
uint8_t streams
streams
static const uint8_t MAX_HT_STREAM_GROUPS
Maximal number of groups per stream in HT (2 possible channel widths and 2 possible SGI configuration...
void DoDisposeStation(WifiRemoteStation *station)
Dispose station function.
uint32_t GetRateId(uint32_t index)
For managing rates from different groups, a global index for all rates in all groups is used...
tuple mac
Definition: third.py:92
Ptr< UniformRandomVariable > m_uniformRandomVariable
Provides uniform random variables.
hold a list of per-remote-station state.
bool m_useVhtOnly
If only VHT MCS should be used, instead of HT and VHT.
uint32_t mcsIndex
The index in the operationalMcsSet of the WifiRemoteStationManager.
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.
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model...
WifiRemoteStation * DoCreateStation(void) const
Time CalculateFirstMpduTxDuration(Ptr< WifiPhy > phy, uint8_t streams, uint8_t sgi, uint8_t chWidth, WifiMode mode)
Estimates the TxTime of a frame with a given mode and group (stream, guard interval and channel width...
bool retryUpdated
If number of retries was updated already.
double ewmaProb
Exponential weighted moving average of probability.
std::vector< std::pair< Time, WifiMode > > TxTime
Data structure to save transmission time calculations per rate.
Time perfectTxTime
Perfect transmission time calculation, or frame calculation.
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 SetBestStationThRates(MinstrelHtWifiRemoteStation *station, uint32_t index)
Set index rate as maxTpRate or maxTp2Rate if is better than current values.
void InitSampleTable(MinstrelHtWifiRemoteStation *station)
Initialize Sample Table.
void DoReportRtsFailed(WifiRemoteStation *station)
This method is a pure virtual method that must be implemented by the sub-class.
void UpdateRetry(MinstrelHtWifiRemoteStation *station)
Update the number of retries and reset accordingly.
uint32_t m_nSampleCol
Number of sample columns.
void DoReportFinalDataFailed(WifiRemoteStation *station)
This method is a pure virtual method that must be implemented by the sub-class.
bool supported
If the rate is supported.
uint8_t m_numGroups
Number of groups Minstrel should consider.
void SetHeSupported(bool enable)
Enable or disable HE capability support.
Time m_updateStats
How frequent do we calculate the stats (1/10 seconds).
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.
void DoReportDataFailed(WifiRemoteStation *station)
This method is a pure virtual method that must be implemented by the sub-class.
void UpdateStats(MinstrelHtWifiRemoteStation *station)
Updating the Minstrel Table every 1/10 seconds.
uint32_t prevNumRateAttempt
Number of transmission attempts with previous rate.
std::vector< WifiMode > WifiModeList
In various parts of the code, folk are interested in maintaining a list of transmission modes...
Definition: wifi-mode.h:251
uint32_t GetVhtGroupId(uint8_t txstreams, uint8_t sgi, uint8_t chWidth)
Returns the groupId of a VHT MCS with the given number of streams, if using sgi and the channel width...
WifiModeList GetVhtDeviceMcsList(void) const
Returns a list of only the VHT MCS supported by the device.
std::vector< HtRateInfo > HtMinstrelRate
Data structure for a Minstrel Rate table.
void RateInit(MinstrelHtWifiRemoteStation *station)
Initialize Minstrel Table.
Implementation of Minstrel HT Rate Control AlgorithmMinstrel-HT is a rate adaptation mechanism for th...
uint32_t FindRate(MinstrelHtWifiRemoteStation *station)
Find a rate to use from Minstrel Table.
void SetupPhy(const Ptr< WifiPhy > phy)
Set up PHY associated with this device since it is the object that knows the full set of transmit rat...
Data structure to contain the information that defines a group.
uint32_t retryCount
Retry limit.
double ewmsdProb
Exponential weighted moving standard deviation of probability.
void DoInitialize(void)
Initialize() implementation.
Time CalculateMpduTxDuration(Ptr< WifiPhy > phy, uint8_t streams, uint8_t sgi, uint8_t chWidth, WifiMode mode)
Estimates the TxTime of a frame with a given mode and group (stream, guard interval and channel width...
double m_lookAroundRate
The % to try other rates than our current rate.
void(* RateChangeTracedCallback)(const uint64_t rate, const Mac48Address remoteAddress)
TracedCallback signature for rate change events.
uint32_t numRateSuccess
Number of successful frames transmitted so far.
std::vector< McsGroup > MinstrelMcsGroups
Data structure for a table of group definitions.
void AddMpduTxTime(uint32_t groupId, WifiMode mode, Time t)
Save a TxTime to the vector of groups.
A struct to contain all statistics information related to a data rate.
void SetNextSample(MinstrelHtWifiRemoteStation *station)
Set the next sample from Sample Table.
void PrintSampleTable(MinstrelHtWifiRemoteStation *station)
Printing Sample Table.
Ptr< MinstrelWifiManager > m_legacyManager
Pointer to an instance of MinstrelWifiManager.
uint32_t numSamplesSkipped
Number of times this rate statistics were not updated because no attempts have been made...
uint32_t GetGroupId(uint32_t index)
Return the groupId from the global index.
uint64_t successHist
Aggregate of all transmission successes.
void SetBestProbabilityRate(MinstrelHtWifiRemoteStation *station, uint32_t index)
Set index rate as maxProbRate if it is better than current value.
uint32_t prevNumRateSuccess
Number of successful frames transmitted with previous rate.
uint64_t attemptHist
Aggregate of all transmission attempts.
uint8_t chWidth
channel width (MHz)
Time GetFirstMpduTxTime(uint32_t groupId, WifiMode mode) const
Obtain the TXtime saved in the group information.
uint32_t CountRetries(MinstrelHtWifiRemoteStation *station)
Count retries.
TracedCallback< uint64_t, Mac48Address > m_rateChange
The trace source fired when the transmission rate change.
void UpdateRate(MinstrelHtWifiRemoteStation *station)
Update rate.
uint32_t GetNextSample(MinstrelHtWifiRemoteStation *station)
Getting the next sample from Sample Table.
void DoReportDataOk(WifiRemoteStation *station, double ackSnr, WifiMode ackMode, double dataSnr)
This method is a pure virtual method that must be implemented by the sub-class.
a unique identifier for an interface.
Definition: type-id.h:58
void CheckInit(MinstrelHtWifiRemoteStation *station)
Check for initializations.
hold per-remote-station state.