A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
minstrel-wifi-manager.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2009 Duy Nguyen
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 *
6 * Authors: Duy Nguyen <duy@soe.ucsc.edu>
7 * Matías Richart <mrichart@fing.edu.uy>
8 */
9
10#ifndef MINSTREL_WIFI_MANAGER_H
11#define MINSTREL_WIFI_MANAGER_H
12
13#include "ns3/traced-value.h"
14#include "ns3/wifi-remote-station-manager.h"
15
16#include <fstream>
17#include <map>
18
19namespace ns3
20{
21
22class UniformRandomVariable;
23
24/**
25 * A struct to contain all information related to a data rate
26 */
28{
29 /**
30 * Perfect transmission time calculation, or frame calculation
31 * Given a bit rate and a packet length n bytes
32 */
34
35 uint32_t retryCount; ///< retry limit
36 uint32_t adjustedRetryCount; ///< adjust the retry limit for this rate
37 uint32_t numRateAttempt; ///< how many number of attempts so far
38 uint32_t numRateSuccess; ///< number of successful packets
39 uint32_t prob; ///< (# packets success)/(# total packets)
40 /**
41 * EWMA calculation
42 * ewma_prob =[prob *(100 - ewma_level) + (ewma_prob_old * ewma_level)]/100
43 */
45 uint32_t throughput; ///< throughput of a rate in bps
46
47 uint32_t prevNumRateAttempt; //!< Number of transmission attempts with previous rate.
48 uint32_t prevNumRateSuccess; //!< Number of successful frames transmitted with previous rate.
49 uint64_t successHist; //!< Aggregate of all transmission successes.
50 uint64_t attemptHist; //!< Aggregate of all transmission attempts.
51
52 uint8_t numSamplesSkipped; //!< number of samples skipped
53 int sampleLimit; //!< sample limit
54};
55
56/**
57 * Data structure for a Minstrel Rate table
58 * A vector of a struct RateInfo
59 */
60typedef std::vector<RateInfo> MinstrelRate;
61/**
62 * Data structure for a Sample Rate table
63 * A vector of a vector uint8_t
64 */
65typedef std::vector<std::vector<uint8_t>> SampleRate;
66
67/**
68 * @brief hold per-remote-station state for Minstrel Wifi manager.
69 *
70 * This struct extends from WifiRemoteStation struct to hold additional
71 * information required by the Minstrel Wifi manager
72 */
74{
75 Time m_nextStatsUpdate; ///< 10 times every second
76
77 /**
78 * To keep track of the current position in the our random sample table
79 * going row by row from 1st column until the 10th column(Minstrel defines 10)
80 * then we wrap back to the row 1 column 1.
81 * note: there are many other ways to do this.
82 */
83 uint8_t m_col; ///< column index
84 uint8_t m_index; ///< vector index
85 uint16_t m_maxTpRate; ///< the current throughput rate in bps
86 uint16_t m_maxTpRate2; ///< second highest throughput rate in bps
87 uint16_t m_maxProbRate; ///< rate with highest probability of success in bps
88 uint8_t m_nModes; ///< number of modes supported
89 int m_totalPacketsCount; ///< total number of packets as of now
90 int m_samplePacketsCount; ///< how many packets we have sample so far
91 int m_numSamplesDeferred; ///< number samples deferred
92 bool m_isSampling; ///< a flag to indicate we are currently sampling
93 uint16_t m_sampleRate; ///< current sample rate in bps
94 bool m_sampleDeferred; ///< a flag to indicate sample rate is on the second stage
95 uint32_t m_shortRetry; ///< short retries such as control packets
96 uint32_t m_longRetry; ///< long retries such as data packets
97 uint32_t m_retry; ///< total retries short + long
98 uint16_t m_txrate; ///< current transmit rate in bps
99 bool m_initialized; ///< for initializing tables
100 MinstrelRate m_minstrelTable; ///< minstrel table
101 SampleRate m_sampleTable; ///< sample table
102 std::ofstream m_statsFile; ///< stats file
103};
104
105/**
106 * @brief Implementation of Minstrel Rate Control Algorithm
107 * @ingroup wifi
108 *
109 * Minstrel is a rate control algorithm implemented in MadWifi and Linux.
110 * The basic principle is to probe the environment and adapt the rate
111 * based on statistics collected on the probability of successful
112 * transmission. The algorithm adapts the rate to the highest rate
113 * that it considers successful, and spends a fraction of its time
114 * doing 'look around' by trying other rates.
115 *
116 * Minstrel is appropriate for non-HT configurations; for HT (i.e. 802.11n
117 * or higher), users should use MinstrelHtWifiManager instead.
118 * Minstrel will error exit if the user tries to configure it with a
119 * Wi-Fi MAC that supports 802.11n or higher.
120 *
121 * Some notes on this implementation follow. The implementation has
122 * been adapted to bring it closer to the Linux implementation.
123 * For each rate, a new parameter samplesSkipped is added. This parameter
124 * is intended to solve an issue regarding the sampling of low rates when
125 * a high rate is working well, which leads to outdated statistics.
126 * This change makes throughput a bit lower in simple, stable scenarios,
127 * but may help in dynamic scenarios to react faster and more accurately
128 * to changes.
129 *
130 * Related to the previous, the logic for deciding when to sample random
131 * rates is as follows. When a sample rate is deferred to the second MRR
132 * chain stage, a new parameter (numSamplesDeferred) is increased. This
133 * parameters is used (jointly with sampleCount) to compare current
134 * sample count with the lookaround rate.
135 *
136 * Also related with sampling, another parameter sampleLimit is added.
137 * This parameter limits the number of times a very low or very high
138 * probability rate is sampled, avoiding to try a poorly working sample
139 * rate too often.
140 *
141 * When updating the EWMA probability of a rate for the first time, it does
142 * not apply EWMA but instead assigns the entire probability.
143 * Since the EWMA probability is initialized to zero, this generates
144 * a more accurate EWMA.
145 */
147{
148 public:
149 /**
150 * @brief Get the type ID.
151 * @return the object TypeId
152 */
153 static TypeId GetTypeId();
155 ~MinstrelWifiManager() override;
156
157 void SetupPhy(const Ptr<WifiPhy> phy) override;
158 void SetupMac(const Ptr<WifiMac> mac) override;
159 int64_t AssignStreams(int64_t stream) override;
160
161 /**
162 * Update the rate.
163 *
164 * @param station the station object
165 */
167
168 /**
169 * Update the Minstrel Table.
170 *
171 * @param station the station object
172 */
174
175 /**
176 * Find a rate to use from Minstrel Table.
177 *
178 * @param station the station object
179 * @returns the rate in bps
180 */
182
183 /**
184 * Get data transmit vector.
185 *
186 * @param station the station object
187 * @returns WifiTxVector
188 */
190
191 /**
192 * Get RTS transmit vector.
193 *
194 * @param station the station object
195 * @returns WifiTxVector
196 */
198
199 /**
200 * Get the number of retries.
201 *
202 * @param station the station object
203 * @returns the number of retries
204 */
206
207 /**
208 * Update packet counters.
209 *
210 * @param station the station object
211 */
213
214 /**
215 * Update the number of retries and reset accordingly.
216 *
217 * @param station the station object
218 */
220
221 /**
222 * Check for initializations.
223 *
224 * @param station the station object
225 */
227
228 /**
229 * Initialize Sample Table.
230 *
231 * @param station the station object
232 */
234
235 private:
236 void DoInitialize() override;
237 WifiRemoteStation* DoCreateStation() const override;
238 void DoReportRxOk(WifiRemoteStation* station, double rxSnr, WifiMode txMode) override;
242 double ctsSnr,
244 double rtsSnr) override;
246 double ackSnr,
248 double dataSnr,
250 uint8_t dataNss) override;
255 std::list<Ptr<WifiMpdu>> DoGetMpdusToDropOnTxFailure(WifiRemoteStation* station,
256 Ptr<WifiPsdu> psdu) override;
257
258 /**
259 * @param st the station that we need to communicate
260 * @param packet the packet to send
261 * @param normally indicates whether the normal 802.11 data retransmission mechanism
262 * would request that the data is retransmitted or not.
263 * @return true if we want to resend a packet after a failed transmission attempt,
264 * false otherwise.
265 *
266 * Note: This method is called after any unicast packet transmission (control, management,
267 * or data) has been attempted and has failed.
268 */
270
271 /**
272 * Estimate the TxTime of a packet with a given mode.
273 *
274 * @param mode Wi-Fi mode
275 * @returns the transmission time
276 */
277 Time GetCalcTxTime(WifiMode mode) const;
278 /**
279 * Add transmission time for the given mode to an internal list.
280 *
281 * @param mode Wi-Fi mode
282 * @param t transmission time
283 */
284 void AddCalcTxTime(WifiMode mode, Time t);
285
286 /**
287 * Initialize Minstrel Table.
288 *
289 * @param station the station object
290 */
292
293 /**
294 * Get the next sample from Sample Table.
295 *
296 * @param station the station object
297 * @returns the next sample
298 */
300
301 /**
302 * Estimate the time to transmit the given packet with the given number of retries.
303 * This function is "roughly" the function "calc_usecs_unicast_packet" in minstrel.c
304 * in the madwifi implementation.
305 *
306 * The basic idea is that, we try to estimate the "average" time used to transmit the
307 * packet for the given number of retries while also accounting for the 802.11 congestion
308 * window change. The original code in the madwifi seems to estimate the number of backoff
309 * slots as the half of the current CW size.
310 *
311 * There are four main parts:
312 * - wait for DIFS (sense idle channel)
313 * - Ack timeouts
314 * - Data transmission
315 * - backoffs according to CW
316 *
317 * @param dataTransmissionTime the data transmission time
318 * @param shortRetries short retries
319 * @param longRetries long retries
320 * @returns the unicast packet time
321 */
325
326 /**
327 * Print Sample Table.
328 *
329 * @param station the station object
330 */
332
333 /**
334 * Print Minstrel Table.
335 *
336 * @param station the station object
337 */
339
340 /**
341 * typedef for a vector of a pair of Time, WifiMode.
342 * Essentially a map from WifiMode to its corresponding transmission time
343 * to transmit a reference packet.
344 */
345 typedef std::map<WifiMode, Time> TxTime;
346
347 TxTime m_calcTxTime; ///< to hold all the calculated TxTime for all modes
348 Time m_updateStats; ///< how frequent do we calculate the stats
349 uint8_t m_lookAroundRate; ///< the % to try other rates than our current rate
350 uint8_t m_ewmaLevel; ///< exponential weighted moving average
351 uint8_t m_sampleCol; ///< number of sample columns
352 uint32_t m_pktLen; ///< packet length used to calculate mode TxTime
353 bool m_printStats; ///< whether statistics table should be printed.
354 bool m_printSamples; ///< whether samples table should be printed.
355
356 /// Provides uniform random variables.
358
359 TracedValue<uint64_t> m_currentRate; //!< Trace rate changes
360};
361
362} // namespace ns3
363
364#endif /* MINSTREL_WIFI_MANAGER_H */
Implementation of Minstrel Rate Control Algorithm.
WifiRemoteStation * DoCreateStation() const override
WifiTxVector DoGetRtsTxVector(WifiRemoteStation *station) override
WifiTxVector DoGetDataTxVector(WifiRemoteStation *station, MHz_u allowedWidth) override
uint8_t m_lookAroundRate
the % to try other rates than our current rate
void DoReportDataOk(WifiRemoteStation *station, double ackSnr, WifiMode ackMode, double dataSnr, MHz_u dataChannelWidth, uint8_t dataNss) override
This method is a pure virtual method that must be implemented by the sub-class.
void PrintSampleTable(MinstrelWifiRemoteStation *station) const
Print Sample Table.
void AddCalcTxTime(WifiMode mode, Time t)
Add transmission time for the given mode to an internal list.
void RateInit(MinstrelWifiRemoteStation *station)
Initialize Minstrel Table.
uint32_t m_pktLen
packet length used to calculate mode TxTime
void DoReportFinalDataFailed(WifiRemoteStation *station) override
This method is a pure virtual method that must be implemented by the sub-class.
void DoInitialize() override
Initialize() implementation.
void UpdateStats(MinstrelWifiRemoteStation *station)
Update the Minstrel Table.
void CheckInit(MinstrelWifiRemoteStation *station)
Check for initializations.
static TypeId GetTypeId()
Get the type ID.
Ptr< UniformRandomVariable > m_uniformRandomVariable
Provides uniform random variables.
TxTime m_calcTxTime
to hold all the calculated TxTime for all modes
bool m_printSamples
whether samples table should be printed.
void DoReportDataFailed(WifiRemoteStation *station) override
This method is a pure virtual method that must be implemented by the sub-class.
bool m_printStats
whether statistics table should be printed.
WifiTxVector GetRtsTxVector(MinstrelWifiRemoteStation *station)
Get RTS transmit vector.
uint8_t m_sampleCol
number of sample columns
void DoReportFinalRtsFailed(WifiRemoteStation *station) override
This method is a pure virtual method that must be implemented by the sub-class.
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...
bool DoNeedRetransmission(WifiRemoteStation *st, Ptr< const Packet > packet, bool normally)
uint16_t FindRate(MinstrelWifiRemoteStation *station)
Find a rate to use from Minstrel Table.
Time GetCalcTxTime(WifiMode mode) const
Estimate the TxTime of a packet with a given mode.
Time CalculateTimeUnicastPacket(Time dataTransmissionTime, uint32_t shortRetries, uint32_t longRetries)
Estimate the time to transmit the given packet with the given number of retries.
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.
void InitSampleTable(MinstrelWifiRemoteStation *station)
Initialize Sample Table.
TracedValue< uint64_t > m_currentRate
Trace rate changes.
Time m_updateStats
how frequent do we calculate the stats
std::map< WifiMode, Time > TxTime
typedef for a vector of a pair of Time, WifiMode.
void UpdatePacketCounters(MinstrelWifiRemoteStation *station)
Update packet counters.
void UpdateRate(MinstrelWifiRemoteStation *station)
Update the rate.
void PrintTable(MinstrelWifiRemoteStation *station)
Print Minstrel Table.
uint16_t GetNextSample(MinstrelWifiRemoteStation *station)
Get the next sample from Sample Table.
int64_t AssignStreams(int64_t stream) override
Assign a fixed random variable stream number to the random variables used by this model.
void DoReportRtsFailed(WifiRemoteStation *station) override
This method is a pure virtual method that must be implemented by the sub-class.
std::list< Ptr< WifiMpdu > > DoGetMpdusToDropOnTxFailure(WifiRemoteStation *station, Ptr< WifiPsdu > psdu) override
Find the MPDUs to drop (possibly based on their frame retry count) in the given PSDU,...
void DoReportRxOk(WifiRemoteStation *station, double rxSnr, WifiMode txMode) override
This method is a pure virtual method that must be implemented by the sub-class.
uint8_t m_ewmaLevel
exponential weighted moving average
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...
uint32_t CountRetries(MinstrelWifiRemoteStation *station)
Get the number of retries.
void UpdateRetry(MinstrelWifiRemoteStation *station)
Update the number of retries and reset accordingly.
WifiTxVector GetDataTxVector(MinstrelWifiRemoteStation *station)
Get data transmit vector.
Smart pointer class similar to boost::intrusive_ptr.
Definition ptr.h:66
Simulation virtual time values and global simulation resolution.
Definition nstime.h:94
Trace classes with value semantics.
a unique identifier for an interface.
Definition type-id.h:49
represent a single transmission mode
Definition wifi-mode.h:40
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...
Ptr< T > Create(Ts &&... args)
Create class instances by constructors with varying numbers of arguments and return them by Ptr.
Definition ptr.h:436
Every class exported by the ns3 library is enclosed in the ns3 namespace.
std::vector< RateInfo > MinstrelRate
Data structure for a Minstrel Rate table A vector of a struct RateInfo.
std::vector< std::vector< uint8_t > > SampleRate
Data structure for a Sample Rate table A vector of a vector uint8_t.
hold per-remote-station state for Minstrel Wifi manager.
uint16_t m_maxTpRate2
second highest throughput rate in bps
Time m_nextStatsUpdate
10 times every second
bool m_initialized
for initializing tables
uint16_t m_sampleRate
current sample rate in bps
int m_numSamplesDeferred
number samples deferred
uint16_t m_txrate
current transmit rate in bps
int m_totalPacketsCount
total number of packets as of now
bool m_isSampling
a flag to indicate we are currently sampling
MinstrelRate m_minstrelTable
minstrel table
uint32_t m_shortRetry
short retries such as control packets
uint32_t m_retry
total retries short + long
uint16_t m_maxTpRate
the current throughput rate in bps
bool m_sampleDeferred
a flag to indicate sample rate is on the second stage
uint8_t m_nModes
number of modes supported
int m_samplePacketsCount
how many packets we have sample so far
uint8_t m_col
To keep track of the current position in the our random sample table going row by row from 1st column...
uint32_t m_longRetry
long retries such as data packets
uint16_t m_maxProbRate
rate with highest probability of success in bps
A struct to contain all information related to a data rate.
uint8_t numSamplesSkipped
number of samples skipped
uint32_t ewmaProb
EWMA calculation ewma_prob =[prob *(100 - ewma_level) + (ewma_prob_old * ewma_level)]/100.
uint32_t numRateSuccess
number of successful packets
uint32_t adjustedRetryCount
adjust the retry limit for this rate
uint32_t prevNumRateSuccess
Number of successful frames transmitted with previous rate.
int sampleLimit
sample limit
uint32_t prob
(# packets success)/(# total packets)
uint32_t retryCount
retry limit
Time perfectTxTime
Perfect transmission time calculation, or frame calculation Given a bit rate and a packet length n by...
uint64_t successHist
Aggregate of all transmission successes.
uint32_t throughput
throughput of a rate in bps
uint32_t prevNumRateAttempt
Number of transmission attempts with previous rate.
uint32_t numRateAttempt
how many number of attempts so far
uint64_t attemptHist
Aggregate of all transmission attempts.
hold per-remote-station state.