A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
rraa-wifi-manager.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2004,2005,2006 INRIA
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 *
6 * Author: Federico Maguolo <maguolof@dei.unipd.it>
7 */
8
9#include "rraa-wifi-manager.h"
10
11#include "ns3/log.h"
12#include "ns3/packet.h"
13#include "ns3/simulator.h"
14#include "ns3/wifi-mac.h"
15#include "ns3/wifi-phy.h"
16
17#define Min(a, b) ((a < b) ? a : b)
18
19namespace ns3
20{
21
22NS_LOG_COMPONENT_DEFINE("RraaWifiManager");
23
24/**
25 * \brief hold per-remote-station state for RRAA Wifi manager.
26 *
27 * This struct extends from WifiRemoteStation struct to hold additional
28 * information required by the RRAA Wifi manager
29 */
31{
32 uint32_t m_counter; //!< Counter for transmission attempts.
33 uint32_t m_nFailed; //!< Number of failed transmission attempts.
34 uint32_t m_adaptiveRtsWnd; //!< Window size for the Adaptive RTS mechanism.
35 uint32_t m_rtsCounter; //!< Counter for RTS transmission attempts.
36 Time m_lastReset; //!< Time of the last reset.
37 bool m_adaptiveRtsOn; //!< Check if Adaptive RTS mechanism is on.
38 bool m_lastFrameFail; //!< Flag if the last frame sent has failed.
39 bool m_initialized; //!< For initializing variables.
40 uint8_t m_nRate; //!< Number of supported rates.
41 uint8_t m_rateIndex; //!< Current rate index.
42
43 RraaThresholdsTable m_thresholds; //!< RRAA thresholds for this station.
44};
45
47
50{
51 static TypeId tid =
52 TypeId("ns3::RraaWifiManager")
54 .SetGroupName("Wifi")
55 .AddConstructor<RraaWifiManager>()
56 .AddAttribute(
57 "Basic",
58 "If true the RRAA-BASIC algorithm will be used, otherwise the RRAA will be used",
59 BooleanValue(false),
62 .AddAttribute("Timeout",
63 "Timeout for the RRAA BASIC loss estimation block",
64 TimeValue(Seconds(0.05)),
67 .AddAttribute("FrameLength",
68 "The Data frame length (in bytes) used for calculating mode TxTime.",
69 UintegerValue(1420),
72 .AddAttribute("AckFrameLength",
73 "The Ack frame length (in bytes) used for calculating mode TxTime.",
74 UintegerValue(14),
77 .AddAttribute("Alpha",
78 "Constant for calculating the MTL threshold.",
79 DoubleValue(1.25),
82 .AddAttribute("Beta",
83 "Constant for calculating the ORI threshold.",
84 DoubleValue(2),
87 .AddAttribute("Tau",
88 "Constant for calculating the EWND size.",
89 DoubleValue(0.012),
92 .AddTraceSource("Rate",
93 "Traced value for rate changes (b/s)",
95 "ns3::TracedValueCallback::Uint64");
96 return tid;
97}
98
101 m_currentRate(0)
102{
103 NS_LOG_FUNCTION(this);
104}
105
110
111void
113{
114 NS_LOG_FUNCTION(this << phy);
115 m_sifs = phy->GetSifs();
116 m_difs = m_sifs + 2 * phy->GetSlot();
117 for (const auto& mode : phy->GetModeList())
118 {
119 WifiTxVector txVector;
120 txVector.SetMode(mode);
122 /* Calculate the TX Time of the Data and the corresponding Ack */
123 Time dataTxTime = phy->CalculateTxDuration(m_frameLength, txVector, phy->GetPhyBand());
124 Time ackTxTime = phy->CalculateTxDuration(m_ackLength, txVector, phy->GetPhyBand());
125 NS_LOG_DEBUG("Calculating TX times: Mode= " << mode << " DataTxTime= " << dataTxTime
126 << " AckTxTime= " << ackTxTime);
127 AddCalcTxTime(mode, dataTxTime + ackTxTime);
128 }
130}
131
132void
138
139void
141{
142 NS_LOG_FUNCTION(this);
143 if (GetHtSupported())
144 {
145 NS_FATAL_ERROR("WifiRemoteStationManager selected does not support HT rates");
146 }
147 if (GetVhtSupported())
148 {
149 NS_FATAL_ERROR("WifiRemoteStationManager selected does not support VHT rates");
150 }
151 if (GetHeSupported())
152 {
153 NS_FATAL_ERROR("WifiRemoteStationManager selected does not support HE rates");
154 }
155}
156
157Time
159{
160 NS_LOG_FUNCTION(this << mode);
161 for (auto i = m_calcTxTime.begin(); i != m_calcTxTime.end(); i++)
162 {
163 if (mode == i->second)
164 {
165 return i->first;
166 }
167 }
168 NS_ASSERT(false);
169 return Seconds(0);
170}
171
172void
174{
175 NS_LOG_FUNCTION(this << mode << t);
176 m_calcTxTime.emplace_back(t, mode);
177}
178
181{
182 NS_LOG_FUNCTION(this << station << mode);
183 WifiRraaThresholds threshold;
184 for (auto i = station->m_thresholds.begin(); i != station->m_thresholds.end(); i++)
185 {
186 if (mode == i->second)
187 {
188 return i->first;
189 }
190 }
191 NS_ABORT_MSG("No thresholds for mode " << mode << " found");
192 return threshold; // Silence compiler warning
193}
194
197{
198 auto station = new RraaWifiRemoteStation();
199 station->m_initialized = false;
200 station->m_adaptiveRtsWnd = 0;
201 station->m_rtsCounter = 0;
202 station->m_adaptiveRtsOn = false;
203 station->m_lastFrameFail = false;
204 return station;
205}
206
207void
209{
210 NS_LOG_FUNCTION(this << station);
211 if (!station->m_initialized)
212 {
213 // Note: we appear to be doing late initialization of the table
214 // to make sure that the set of supported rates has been initialized
215 // before we perform our own initialization.
216 station->m_nRate = GetNSupported(station);
217 // Initialize at maximal rate
218 station->m_rateIndex = GetMaxRate(station);
219
220 station->m_initialized = true;
221
222 station->m_thresholds = RraaThresholdsTable(station->m_nRate);
223 InitThresholds(station);
224 ResetCountersBasic(station);
225 }
226}
227
228void
230{
231 NS_LOG_FUNCTION(this << station);
232 NS_LOG_DEBUG("InitThresholds = " << station);
233
234 double nextCritical = 0;
235 double nextMtl = 0;
236 double mtl = 0;
237 double ori = 0;
238 for (uint8_t i = 0; i < station->m_nRate; i++)
239 {
240 WifiMode mode = GetSupported(station, i);
241 Time totalTxTime = GetCalcTxTime(mode) + m_sifs + m_difs;
242 if (i == GetMaxRate(station))
243 {
244 ori = 0;
245 }
246 else
247 {
248 WifiMode nextMode = GetSupported(station, i + 1);
249 Time nextTotalTxTime = GetCalcTxTime(nextMode) + m_sifs + m_difs;
250 nextCritical = 1 - (nextTotalTxTime.GetSeconds() / totalTxTime.GetSeconds());
251 nextMtl = m_alpha * nextCritical;
252 ori = nextMtl / m_beta;
253 }
254 if (i == 0)
255 {
256 mtl = 1;
257 }
259 th.m_ewnd = static_cast<uint32_t>(ceil(m_tau / totalTxTime.GetSeconds()));
260 th.m_ori = ori;
261 th.m_mtl = mtl;
262 station->m_thresholds.emplace_back(th, mode);
263 mtl = nextMtl;
264 NS_LOG_DEBUG(mode << " " << th.m_ewnd << " " << th.m_mtl << " " << th.m_ori);
265 }
266}
267
268void
270{
271 NS_LOG_FUNCTION(this << station);
272 station->m_nFailed = 0;
273 station->m_counter = GetThresholds(station, station->m_rateIndex).m_ewnd;
274 station->m_lastReset = Simulator::Now();
275}
276
277uint8_t
279{
280 return station->m_nRate - 1;
281}
282
283void
288
289void
291{
292 NS_LOG_FUNCTION(this << st);
293 auto station = static_cast<RraaWifiRemoteStation*>(st);
294 station->m_lastFrameFail = true;
295 CheckTimeout(station);
296 station->m_counter--;
297 station->m_nFailed++;
298 RunBasicAlgorithm(station);
299}
300
301void
303{
304 NS_LOG_FUNCTION(this << st << rxSnr << txMode);
305}
306
307void
309 double ctsSnr,
310 WifiMode ctsMode,
311 double rtsSnr)
312{
313 NS_LOG_FUNCTION(this << st << ctsSnr << ctsMode << rtsSnr);
314}
315
316void
318 double ackSnr,
319 WifiMode ackMode,
320 double dataSnr,
321 MHz_u dataChannelWidth,
322 uint8_t dataNss)
323{
324 NS_LOG_FUNCTION(this << st << ackSnr << ackMode << dataSnr << dataChannelWidth << +dataNss);
325 auto station = static_cast<RraaWifiRemoteStation*>(st);
326 station->m_lastFrameFail = false;
327 CheckTimeout(station);
328 station->m_counter--;
329 RunBasicAlgorithm(station);
330}
331
332void
337
338void
343
346{
347 NS_LOG_FUNCTION(this << st << allowedWidth);
348 auto station = static_cast<RraaWifiRemoteStation*>(st);
349 auto channelWidth = GetChannelWidth(station);
350 if (channelWidth > 20 && channelWidth != 22)
351 {
352 channelWidth = 20;
353 }
354 CheckInit(station);
355 WifiMode mode = GetSupported(station, station->m_rateIndex);
356 uint64_t rate = mode.GetDataRate(channelWidth);
357 if (m_currentRate != rate)
358 {
359 NS_LOG_DEBUG("New datarate: " << rate);
360 m_currentRate = rate;
361 }
362 return WifiTxVector(
363 mode,
366 NanoSeconds(800),
367 1,
368 1,
369 0,
370 channelWidth,
371 GetAggregation(station));
372}
373
376{
377 NS_LOG_FUNCTION(this << st);
378 auto station = static_cast<RraaWifiRemoteStation*>(st);
379 auto channelWidth = GetChannelWidth(station);
380 if (channelWidth > 20 && channelWidth != 22)
381 {
382 channelWidth = 20;
383 }
384 WifiMode mode;
386 {
387 mode = GetSupported(station, 0);
388 }
389 else
390 {
391 mode = GetNonErpSupported(station, 0);
392 }
393 return WifiTxVector(
394 mode,
397 NanoSeconds(800),
398 1,
399 1,
400 0,
401 channelWidth,
402 GetAggregation(station));
403}
404
405bool
407{
408 NS_LOG_FUNCTION(this << st << size << normally);
409 auto station = static_cast<RraaWifiRemoteStation*>(st);
410 CheckInit(station);
411 if (m_basic)
412 {
413 return normally;
414 }
415 ARts(station);
416 return station->m_adaptiveRtsOn;
417}
418
419void
421{
422 NS_LOG_FUNCTION(this << station);
423 Time d = Simulator::Now() - station->m_lastReset;
424 if (station->m_counter == 0 || d > m_timeout)
425 {
426 ResetCountersBasic(station);
427 }
428}
429
430void
432{
433 NS_LOG_FUNCTION(this << station);
434 WifiRraaThresholds thresholds = GetThresholds(station, station->m_rateIndex);
435 auto ploss = (static_cast<double>(station->m_nFailed) / thresholds.m_ewnd);
436 if (station->m_counter == 0 || ploss > thresholds.m_mtl)
437 {
438 if (ploss > thresholds.m_mtl)
439 {
440 station->m_rateIndex--;
441 }
442 else if (station->m_rateIndex < GetMaxRate(station) && ploss < thresholds.m_ori)
443 {
444 station->m_rateIndex++;
445 }
446 ResetCountersBasic(station);
447 }
448}
449
450void
452{
453 if (!station->m_adaptiveRtsOn && station->m_lastFrameFail)
454 {
455 station->m_adaptiveRtsWnd++;
456 station->m_rtsCounter = station->m_adaptiveRtsWnd;
457 }
458 else if ((station->m_adaptiveRtsOn && station->m_lastFrameFail) ||
459 (!station->m_adaptiveRtsOn && !station->m_lastFrameFail))
460 {
461 station->m_adaptiveRtsWnd = station->m_adaptiveRtsWnd / 2;
462 station->m_rtsCounter = station->m_adaptiveRtsWnd;
463 }
464 if (station->m_rtsCounter > 0)
465 {
466 station->m_adaptiveRtsOn = true;
467 station->m_rtsCounter--;
468 }
469 else
470 {
471 station->m_adaptiveRtsOn = false;
472 }
473}
474
477{
478 NS_LOG_FUNCTION(this << station << +index);
479 WifiMode mode = GetSupported(station, index);
480 return GetThresholds(station, mode);
481}
482
483} // namespace ns3
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Definition double.h:31
Smart pointer class similar to boost::intrusive_ptr.
Robust Rate Adaptation Algorithm.
WifiRemoteStation * DoCreateStation() const override
double m_tau
Tau value for RRAA (value for calculating EWND size).
WifiTxVector DoGetRtsTxVector(WifiRemoteStation *station) override
void ARts(RraaWifiRemoteStation *station)
Activate the use of RTS for the given station if the conditions are met.
void CheckInit(RraaWifiRemoteStation *station)
Check for initializations.
void DoReportDataFailed(WifiRemoteStation *station) override
This method is a pure virtual method that must be implemented by the sub-class.
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...
TracedValue< uint64_t > m_currentRate
Trace rate changes.
static TypeId GetTypeId()
Get the type ID.
uint32_t m_frameLength
Data frame length used to calculate mode TxTime.
bool DoNeedRts(WifiRemoteStation *st, uint32_t size, bool normally) override
Time m_difs
Value of DIFS configured in the device.
void AddCalcTxTime(WifiMode mode, Time t)
Add transmission time for the given mode to an internal list.
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...
WifiTxVector DoGetDataTxVector(WifiRemoteStation *station, MHz_u allowedWidth) override
void RunBasicAlgorithm(RraaWifiRemoteStation *station)
Find an appropriate rate for the given station, using a basic algorithm.
Time GetCalcTxTime(WifiMode mode) const
Get the estimated TxTime of a packet with a given mode.
void ResetCountersBasic(RraaWifiRemoteStation *station)
Reset the counters of the given station.
TxTime m_calcTxTime
To hold all the calculated TxTime for all modes.
void DoReportRtsFailed(WifiRemoteStation *station) override
This method is a pure virtual method that must be implemented by the sub-class.
void DoReportRxOk(WifiRemoteStation *station, double rxSnr, WifiMode txMode) override
This method is a pure virtual method that must be implemented by the sub-class.
double m_beta
Beta value for RRAA (value for calculating ORI threshold).
void CheckTimeout(RraaWifiRemoteStation *station)
Check if the counter should be reset.
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 DoReportFinalDataFailed(WifiRemoteStation *station) override
This method is a pure virtual method that must be implemented by the sub-class.
WifiRraaThresholds GetThresholds(RraaWifiRemoteStation *station, WifiMode mode) const
Get the thresholds for the given station and mode.
void DoInitialize() override
Initialize() implementation.
uint32_t m_ackLength
Ack frame length used to calculate mode TxTime.
double m_alpha
Alpha value for RRAA (value for calculating MTL threshold)
Time m_sifs
Value of SIFS configured in the device.
void InitThresholds(RraaWifiRemoteStation *station)
Initialize the thresholds internal list for the given station.
uint8_t GetMaxRate(RraaWifiRemoteStation *station) const
Return the index for the maximum transmission rate for the given station.
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.
static Time Now()
Return the current simulation virtual time.
Definition simulator.cc:197
Simulation virtual time values and global simulation resolution.
Definition nstime.h:94
double GetSeconds() const
Get an approximation of the time stored in this instance in the indicated unit.
Definition nstime.h:392
a unique identifier for an interface.
Definition type-id.h:48
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition type-id.cc:1001
Hold an unsigned integer type.
Definition uinteger.h:34
represent a single transmission mode
Definition wifi-mode.h:40
WifiModulationClass GetModulationClass() const
Definition wifi-mode.cc:174
uint64_t GetDataRate(MHz_u channelWidth, Time guardInterval, uint8_t nss) const
Definition wifi-mode.cc:111
hold a list of per-remote-station state.
uint8_t GetNSupported(const WifiRemoteStation *station) const
Return the number of modes supported by the given station.
MHz_u GetChannelWidth(const WifiRemoteStation *station) const
Return the channel width supported by the station.
bool GetAggregation(const WifiRemoteStation *station) const
Return whether the given station supports A-MPDU.
bool GetHtSupported() const
Return whether the device has HT capability support enabled on the link this manager is associated wi...
WifiMode GetNonErpSupported(const WifiRemoteStation *station, uint8_t i) const
Return whether non-ERP mode associated with the specified station at the specified index.
virtual 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...
bool GetUseNonErpProtection() const
Return whether the device supports protection of non-ERP stations.
bool GetVhtSupported() const
Return whether the device has VHT capability support enabled on the link this manager is associated w...
bool GetShortPreambleEnabled() const
Return whether the device uses short PHY preambles.
WifiMode GetSupported(const WifiRemoteStation *station, uint8_t i) const
Return whether mode associated with the specified station at the specified index.
bool GetHeSupported() const
Return whether the device has HE capability support enabled.
virtual 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...
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
void SetMode(WifiMode mode)
Sets the selected payload transmission mode.
void SetPreambleType(WifiPreamble preamble)
Sets the preamble type.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
Definition assert.h:55
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
#define NS_ABORT_MSG(msg)
Unconditional abnormal program termination with a message.
Definition abort.h:38
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition log.h:191
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition log.h:257
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition object-base.h:35
Time NanoSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition nstime.h:1344
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition nstime.h:1308
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
@ WIFI_PREAMBLE_LONG
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Ptr< const AttributeChecker > MakeBooleanChecker()
Definition boolean.cc:113
Ptr< const AttributeChecker > MakeUintegerChecker()
Definition uinteger.h:85
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
Definition nstime.h:1396
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Definition uinteger.h:35
Ptr< const AttributeChecker > MakeDoubleChecker()
Definition double.h:82
std::vector< std::pair< WifiRraaThresholds, WifiMode > > RraaThresholdsTable
List of thresholds for each mode.
WifiPreamble GetPreambleForTransmission(WifiModulationClass modulation, bool useShortPreamble)
Return the preamble to be used for the transmission.
Ptr< const AttributeAccessor > MakeBooleanAccessor(T1 a1)
Definition boolean.h:70
Ptr< const AttributeAccessor > MakeDoubleAccessor(T1 a1)
Definition double.h:32
Ptr< const AttributeChecker > MakeTimeChecker()
Helper to make an unbounded Time checker.
Definition nstime.h:1416
hold per-remote-station state for RRAA Wifi manager.
uint8_t m_nRate
Number of supported rates.
Time m_lastReset
Time of the last reset.
RraaThresholdsTable m_thresholds
RRAA thresholds for this station.
bool m_initialized
For initializing variables.
uint32_t m_counter
Counter for transmission attempts.
uint32_t m_rtsCounter
Counter for RTS transmission attempts.
uint32_t m_adaptiveRtsWnd
Window size for the Adaptive RTS mechanism.
bool m_lastFrameFail
Flag if the last frame sent has failed.
bool m_adaptiveRtsOn
Check if Adaptive RTS mechanism is on.
uint8_t m_rateIndex
Current rate index.
uint32_t m_nFailed
Number of failed transmission attempts.
hold per-remote-station state.
WifiRraaThresholds structure.
double m_mtl
Maximum Tolerable Loss threshold.
uint32_t m_ewnd
Evaluation Window.
double m_ori
Opportunistic Rate Increase threshold.