A Discrete-Event Network Simulator
API
minstrel-ht-wifi-manager.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2009 Duy Nguyen
3  * Copyright (c) 2015 Ghada Badawy
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  *Authors: Duy Nguyen <duy@soe.ucsc.edu>
19  * Ghada Badawy <gbadawy@gmail.com>
20  * Matias Richart <mrichart@fing.edu.uy>
21  *
22  * MinstrelHt is a rate adaptation algorithm for high-throughput (HT) 802.11
23  */
24 
25 #ifndef MINSTREL_HT_WIFI_MANAGER_H
26 #define MINSTREL_HT_WIFI_MANAGER_H
27 
28 #include "minstrel-wifi-manager.h"
29 
30 #include "ns3/wifi-mpdu-type.h"
31 #include "ns3/wifi-remote-station-manager.h"
32 
33 namespace ns3
34 {
35 
39 typedef std::map<WifiMode, Time> TxTime;
40 
46 {
50 };
51 
59 inline std::ostream&
60 operator<<(std::ostream& os, McsGroupType type)
61 {
62  switch (type)
63  {
65  return (os << "HT");
67  return (os << "VHT");
69  return (os << "HE");
70  default:
71  return (os << "INVALID");
72  }
73 }
74 
81 struct McsGroup
82 {
83  uint8_t streams;
84  uint16_t gi;
85  uint16_t chWidth;
87  bool isSupported;
88  // To accurately account for TX times, we separate the TX time of the first
89  // MPDU in an A-MPDU from the rest of the MPDUs.
92 };
93 
98 typedef std::vector<McsGroup> MinstrelMcsGroups;
99 
101 
106 {
112  bool supported;
113  uint8_t mcsIndex;
114  uint32_t retryCount;
116  uint32_t numRateAttempt;
117  uint32_t numRateSuccess;
118  double prob;
126  double ewmaProb;
127  double ewmsdProb;
130  uint32_t numSamplesSkipped;
132  uint64_t successHist;
133  uint64_t attemptHist;
134  double throughput;
135 };
136 
141 typedef std::vector<MinstrelHtRateInfo> MinstrelHtRate;
142 
146 struct GroupInfo
147 {
151  uint8_t m_col;
152  uint8_t m_index;
153  bool m_supported;
154  uint16_t m_maxTpRate;
155  uint16_t m_maxTpRate2;
156  uint16_t m_maxProbRate;
158 };
159 
164 typedef std::vector<GroupInfo> McsGroupData;
165 
170 static const uint8_t MAX_HT_SUPPORTED_STREAMS =
171  4;
172 static const uint8_t MAX_VHT_SUPPORTED_STREAMS =
173  8;
174 static const uint8_t MAX_HE_SUPPORTED_STREAMS =
175  8;
176 static const uint8_t MAX_HT_STREAM_GROUPS =
177  4;
179 static const uint8_t MAX_VHT_STREAM_GROUPS =
180  8;
182 static const uint8_t MAX_HE_STREAM_GROUPS =
183  12;
185 static const uint8_t MAX_HT_GROUP_RATES = 8;
186 static const uint8_t MAX_VHT_GROUP_RATES = 10;
187 static const uint8_t MAX_HE_GROUP_RATES = 12;
188 static const uint8_t MAX_HT_WIDTH = 40;
189 static const uint8_t MAX_VHT_WIDTH = 160;
190 static const uint8_t MAX_HE_WIDTH = 160;
191 
237 {
238  public:
243  static TypeId GetTypeId();
245  ~MinstrelHtWifiManager() override;
246 
247  void SetupPhy(const Ptr<WifiPhy> phy) override;
248  void SetupMac(const Ptr<WifiMac> mac) override;
249  int64_t AssignStreams(int64_t stream) override;
250 
257  typedef void (*RateChangeTracedCallback)(const uint64_t rate, const Mac48Address remoteAddress);
258 
259  private:
260  void DoInitialize() override;
261  WifiRemoteStation* DoCreateStation() const override;
262  void DoReportRxOk(WifiRemoteStation* station, double rxSnr, WifiMode txMode) override;
263  void DoReportRtsFailed(WifiRemoteStation* station) override;
264  void DoReportDataFailed(WifiRemoteStation* station) override;
265  void DoReportRtsOk(WifiRemoteStation* station,
266  double ctsSnr,
267  WifiMode ctsMode,
268  double rtsSnr) override;
269  void DoReportDataOk(WifiRemoteStation* station,
270  double ackSnr,
271  WifiMode ackMode,
272  double dataSnr,
273  uint16_t dataChannelWidth,
274  uint8_t dataNss) override;
275  void DoReportFinalRtsFailed(WifiRemoteStation* station) override;
276  void DoReportFinalDataFailed(WifiRemoteStation* station) override;
277  WifiTxVector DoGetDataTxVector(WifiRemoteStation* station, uint16_t allowedWidth) override;
280  uint16_t nSuccessfulMpdus,
281  uint16_t nFailedMpdus,
282  double rxSnr,
283  double dataSnr,
284  uint16_t dataChannelWidth,
285  uint8_t dataNss) override;
287  Ptr<const Packet> packet,
288  bool normally) override;
289 
299  bool IsValidMcs(Ptr<WifiPhy> phy, uint8_t streams, uint16_t chWidth, WifiMode mode);
300 
314  uint8_t streams,
315  uint16_t gi,
316  uint16_t chWidth,
317  WifiMode mode,
318  MpduType mpduType);
319 
327  Time GetMpduTxTime(uint8_t groupId, WifiMode mode) const;
328 
336  void AddMpduTxTime(uint8_t groupId, WifiMode mode, Time t);
337 
345  Time GetFirstMpduTxTime(uint8_t groupId, WifiMode mode) const;
346 
354  void AddFirstMpduTxTime(uint8_t groupId, WifiMode mode, Time t);
355 
361 
370  uint16_t nSuccessfulMpdus,
371  uint16_t nFailedMpdus);
372 
379  uint16_t GetNextSample(MinstrelHtWifiRemoteStation* station);
380 
387 
394  uint16_t FindRate(MinstrelHtWifiRemoteStation* station);
395 
402 
408  void RateInit(MinstrelHtWifiRemoteStation* station);
409 
420  uint8_t groupId,
421  uint8_t rateId,
422  double ewmaProb);
423 
430  void SetBestStationThRates(MinstrelHtWifiRemoteStation* station, uint16_t index);
431 
438  void SetBestProbabilityRate(MinstrelHtWifiRemoteStation* station, uint16_t index);
439 
446  void CalculateRetransmits(MinstrelHtWifiRemoteStation* station, uint16_t index);
447 
456  uint8_t groupId,
457  uint8_t rateId);
458 
480  Time CalculateTimeUnicastPacket(Time dataTransmissionTime,
481  uint32_t shortRetries,
482  uint32_t longRetries);
483 
493  double CalculateEwmsd(double oldEwmsd, double currentProb, double ewmaProb, double weight);
494 
501 
508 
515 
523  void StatsDump(MinstrelHtWifiRemoteStation* station, uint8_t groupId, std::ofstream& of);
524 
530  void CheckInit(MinstrelHtWifiRemoteStation* station);
531 
538  uint32_t CountRetries(MinstrelHtWifiRemoteStation* station);
539 
546 
553  uint8_t GetRateId(uint16_t index);
554 
561  uint8_t GetGroupId(uint16_t index);
562 
574  uint16_t GetIndex(uint8_t groupId, uint8_t rateId);
575 
584  uint8_t GetHtGroupId(uint8_t txstreams, uint16_t gi, uint16_t chWidth);
585 
594  uint8_t GetVhtGroupId(uint8_t txstreams, uint16_t gi, uint16_t chWidth);
595 
604  uint8_t GetHeGroupId(uint8_t txstreams, uint16_t gi, uint16_t chWidth);
605 
612  uint16_t GetLowestIndex(MinstrelHtWifiRemoteStation* station);
613 
621  uint16_t GetLowestIndex(MinstrelHtWifiRemoteStation* station, uint8_t groupId);
622 
628 
634 
640 
655  uint16_t UpdateRateAfterAllowedWidth(uint16_t txRate, uint16_t allowedWidth);
656 
661  uint8_t m_ewmaLevel;
662  uint8_t m_nSampleCol;
663  uint32_t m_frameLength;
664  uint8_t m_numGroups;
665  uint8_t m_numRates;
669 
671 
674 
676 
678 };
679 
680 } // namespace ns3
681 
682 #endif /* MINSTREL_HT_WIFI_MANAGER_H */
an EUI-48 address
Definition: mac48-address.h:46
Implementation of Minstrel-HT Rate Control Algorithm.
void(* RateChangeTracedCallback)(const uint64_t rate, const Mac48Address remoteAddress)
TracedCallback signature for rate change events.
static TypeId GetTypeId()
Get the type ID.
uint32_t CountRetries(MinstrelHtWifiRemoteStation *station)
Count retries.
uint32_t m_frameLength
Frame length used to calculate modes TxTime in bytes.
void InitSampleTable(MinstrelHtWifiRemoteStation *station)
Initialize Sample Table.
bool m_printStats
If statistics table should be printed.
int64_t AssignStreams(int64_t stream) override
Assign a fixed random variable stream number to the random variables used by this model.
void DoReportRxOk(WifiRemoteStation *station, double rxSnr, WifiMode txMode) override
This method is a pure virtual method that must be implemented by the sub-class.
bool DoNeedRetransmission(WifiRemoteStation *st, Ptr< const Packet > packet, bool normally) override
WifiTxVector DoGetDataTxVector(WifiRemoteStation *station, uint16_t allowedWidth) override
Time CalculateTimeUnicastPacket(Time dataTransmissionTime, uint32_t shortRetries, uint32_t longRetries)
Estimate the time to transmit the given packet with the given number of retries.
WifiTxVector DoGetRtsTxVector(WifiRemoteStation *station) override
MinstrelMcsGroups m_minstrelGroups
Global array for groups information.
void AddMpduTxTime(uint8_t groupId, WifiMode mode, Time t)
Save a TxTime to the vector of groups.
void SetNextSample(MinstrelHtWifiRemoteStation *station)
Set the next sample from Sample Table.
uint8_t m_numRates
Number of rates per group Minstrel should consider.
uint8_t m_nSampleCol
Number of sample columns.
void RateInit(MinstrelHtWifiRemoteStation *station)
Initialize Minstrel Table.
void SetBestStationThRates(MinstrelHtWifiRemoteStation *station, uint16_t index)
Set index rate as maxTpRate or maxTp2Rate if is better than current values.
void PrintTable(MinstrelHtWifiRemoteStation *station)
Printing Minstrel Table.
void StatsDump(MinstrelHtWifiRemoteStation *station, uint8_t groupId, std::ofstream &of)
Print group statistics.
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...
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 AddFirstMpduTxTime(uint8_t groupId, WifiMode mode, Time t)
Save a TxTime to the vector of groups.
double CalculateEwmsd(double oldEwmsd, double currentProb, double ewmaProb, double weight)
Perform EWMSD (Exponentially Weighted Moving Standard Deviation) calculation.
void DoReportDataFailed(WifiRemoteStation *station) override
This method is a pure virtual method that must be implemented by the sub-class.
void SetBestProbabilityRate(MinstrelHtWifiRemoteStation *station, uint16_t index)
Set index rate as maxProbRate if it is better than current value.
WifiModeList GetHeDeviceMcsList() const
Returns a list of only the HE MCS supported by the device.
Time m_updateStats
How frequent do we calculate the stats.
TracedValue< uint64_t > m_currentRate
Trace rate changes.
uint16_t GetLowestIndex(MinstrelHtWifiRemoteStation *station)
Returns the lowest global index of the rates supported by the station.
void DoInitialize() override
Initialize() implementation.
WifiModeList GetVhtDeviceMcsList() const
Returns a list of only the VHT MCS supported by the device.
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...
void CheckInit(MinstrelHtWifiRemoteStation *station)
Check for initializations.
WifiModeList GetHtDeviceMcsList() const
Returns a list of only the HT MCS supported by the device.
void UpdateRetry(MinstrelHtWifiRemoteStation *station)
Update the number of retries and reset accordingly.
Time GetFirstMpduTxTime(uint8_t groupId, WifiMode mode) const
Obtain the TxTime saved in the group information.
Time GetMpduTxTime(uint8_t groupId, WifiMode mode) const
Obtain the TxTime saved in the group information.
uint16_t UpdateRateAfterAllowedWidth(uint16_t txRate, uint16_t allowedWidth)
Given the index of the current TX rate, check whether the channel width is not greater than the given...
uint8_t m_numGroups
Number of groups Minstrel should consider.
void CalculateRetransmits(MinstrelHtWifiRemoteStation *station, uint16_t index)
Calculate the number of retransmissions to set for the index rate.
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...
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.
uint8_t m_ewmaLevel
Exponential weighted moving average level (or coefficient).
uint16_t FindRate(MinstrelHtWifiRemoteStation *station)
Find a rate to use from Minstrel Table.
uint8_t m_lookAroundRate
The % to try other rates than our current rate.
void UpdateRate(MinstrelHtWifiRemoteStation *station)
Update rate.
uint8_t GetRateId(uint16_t index)
Return the rateId inside a group, from the global index.
Time m_legacyUpdateStats
How frequent do we calculate the stats for legacy MinstrelWifiManager.
uint8_t GetGroupId(uint16_t index)
Return the groupId from the global index.
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.
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.
void PrintSampleTable(MinstrelHtWifiRemoteStation *station)
Printing Sample Table.
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.
Ptr< UniformRandomVariable > m_uniformRandomVariable
Provides uniform random variables.
uint16_t GetNextSample(MinstrelHtWifiRemoteStation *station)
Getting the next sample from Sample Table.
void UpdateStats(MinstrelHtWifiRemoteStation *station)
Update the Minstrel Table.
uint16_t GetIndex(uint8_t groupId, uint8_t rateId)
Returns the global index corresponding to the groupId and rateId.
WifiRemoteStation * DoCreateStation() const override
Ptr< MinstrelWifiManager > m_legacyManager
Pointer to an instance of MinstrelWifiManager.
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.
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.
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...
void DoReportFinalDataFailed(WifiRemoteStation *station) 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.
void DoReportFinalRtsFailed(WifiRemoteStation *station) override
This method is a pure virtual method that must be implemented by the sub-class.
bool m_useLatestAmendmentOnly
Flag if only the latest supported amendment by both peers should be 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:105
a unique identifier for an interface.
Definition: type-id.h:59
represent a single transmission mode
Definition: wifi-mode.h:51
hold a list of per-remote-station state.
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
MpduType
The type of an MPDU.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
static const uint8_t MAX_HT_GROUP_RATES
Number of rates (or MCS) per HT group.
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...
std::vector< McsGroup > MinstrelMcsGroups
Data structure for a table of group definitions.
McsGroupType
Available MCS group types.
std::map< WifiMode, Time > TxTime
Data structure to save transmission time calculations per rate.
static const uint8_t MAX_VHT_GROUP_RATES
Number of rates (or MCS) per VHT group.
static const uint8_t MAX_VHT_SUPPORTED_STREAMS
Maximal number of streams supported by the VHT PHY layer.
static const uint8_t MAX_HT_SUPPORTED_STREAMS
Constants for maximum values.
static const uint8_t MAX_HE_GROUP_RATES
Number of rates (or MCS) per HE group.
static const uint8_t MAX_HT_WIDTH
Maximal channel width in MHz.
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...
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...
std::vector< MinstrelHtRateInfo > MinstrelHtRate
Data structure for a Minstrel Rate 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:262
std::ostream & operator<<(std::ostream &os, const Angles &a)
Definition: angles.cc:159
static const uint8_t MAX_HE_WIDTH
Maximal channel width in MHz.
static const uint8_t MAX_VHT_WIDTH
Maximal channel width in MHz.
std::vector< GroupInfo > McsGroupData
Data structure for a table of groups.
static const uint8_t MAX_HE_SUPPORTED_STREAMS
Maximal number of streams supported by the HE PHY layer.
mac
Definition: third.py:92
phy
Definition: third.py:89
A struct to contain information of a group.
MinstrelHtRate m_ratesTable
Information about rates of this group.
bool m_supported
If the rates of this group are supported by the station.
uint8_t m_index
Sample table index.
uint16_t m_maxTpRate2
The second max throughput rate of this group in bps.
uint8_t m_col
MCS rates are divided into groups based on the number of streams and flags that they use.
uint16_t m_maxProbRate
The highest success probability rate of this group in bps.
uint16_t m_maxTpRate
The max throughput rate of this group in bps.
Data structure to contain the information that defines a group.
TxTime ratesTxTimeTable
rates transmit time table
TxTime ratesFirstMpduTxTimeTable
rates MPDU transmit time table
uint16_t chWidth
channel width (MHz)
uint16_t gi
guard interval duration (nanoseconds)
McsGroupType type
identifies the group,
bool isSupported
flag whether group is supported
uint8_t streams
number of spatial streams
A struct to contain all statistics information related to a data rate.
uint32_t prevNumRateAttempt
Number of transmission attempts with previous rate.
uint32_t prevNumRateSuccess
Number of successful frames transmitted with previous rate.
bool supported
If the rate is supported.
Time perfectTxTime
Perfect transmission time calculation, or frame calculation.
uint8_t mcsIndex
The index in the operationalMcsSet of the WifiRemoteStationManager.
uint32_t numRateSuccess
Number of successful frames transmitted so far.
double ewmaProb
Exponential weighted moving average of probability.
double prob
Current probability within last time interval.
double ewmsdProb
Exponential weighted moving standard deviation of probability.
uint32_t numRateAttempt
Number of transmission attempts so far.
uint32_t numSamplesSkipped
Number of times this rate statistics were not updated because no attempts have been made.
double throughput
Throughput of this rate (in packets per second).
uint32_t adjustedRetryCount
Adjust the retry limit for this rate.
uint64_t successHist
Aggregate of all transmission successes.
uint64_t attemptHist
Aggregate of all transmission attempts.
bool retryUpdated
If number of retries was updated already.
MinstrelHtWifiRemoteStation structure.
hold per-remote-station state.