A Discrete-Event Network Simulator
API
aarfcd-wifi-manager.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2004,2005,2006 INRIA
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  * Author: Federico Maguolo <maguolof@dei.unipd.it>
19  */
20 
21 #include "ns3/log.h"
22 #include "ns3/packet.h"
23 #include "aarfcd-wifi-manager.h"
24 #include "wifi-tx-vector.h"
25 
26 #define Min(a,b) ((a < b) ? a : b)
27 #define Max(a,b) ((a > b) ? a : b)
28 
29 namespace ns3 {
30 
31 NS_LOG_COMPONENT_DEFINE ("AarfcdWifiManager");
32 
40 {
41  uint32_t m_timer;
42  uint32_t m_success;
43  uint32_t m_failed;
44  bool m_recovery;
46  uint32_t m_successThreshold;
47  uint32_t m_timerTimeout;
48  uint8_t m_rate;
49  bool m_rtsOn;
50  uint32_t m_rtsWnd;
51  uint32_t m_rtsCounter;
53 };
54 
56 
57 TypeId
59 {
60  static TypeId tid = TypeId ("ns3::AarfcdWifiManager")
62  .SetGroupName ("Wifi")
63  .AddConstructor<AarfcdWifiManager> ()
64  .AddAttribute ("SuccessK", "Multiplication factor for the success threshold in the AARF algorithm.",
65  DoubleValue (2.0),
67  MakeDoubleChecker<double> ())
68  .AddAttribute ("TimerK",
69  "Multiplication factor for the timer threshold in the AARF algorithm.",
70  DoubleValue (2.0),
72  MakeDoubleChecker<double> ())
73  .AddAttribute ("MaxSuccessThreshold",
74  "Maximum value of the success threshold in the AARF algorithm.",
75  UintegerValue (60),
77  MakeUintegerChecker<uint32_t> ())
78  .AddAttribute ("MinTimerThreshold",
79  "The minimum value for the 'timer' threshold in the AARF algorithm.",
80  UintegerValue (15),
82  MakeUintegerChecker<uint32_t> ())
83  .AddAttribute ("MinSuccessThreshold",
84  "The minimum value for the success threshold in the AARF algorithm.",
85  UintegerValue (10),
87  MakeUintegerChecker<uint32_t> ())
88  .AddAttribute ("MinRtsWnd",
89  "Minimum value for RTS window of AARF-CD",
90  UintegerValue (1),
92  MakeUintegerChecker<uint32_t> ())
93  .AddAttribute ("MaxRtsWnd",
94  "Maximum value for RTS window of AARF-CD",
95  UintegerValue (40),
97  MakeUintegerChecker<uint32_t> ())
98  .AddAttribute ("TurnOffRtsAfterRateDecrease",
99  "If true the RTS mechanism will be turned off when the rate will be decreased",
100  BooleanValue (true),
103  .AddAttribute ("TurnOnRtsAfterRateIncrease",
104  "If true the RTS mechanism will be turned on when the rate will be increased",
105  BooleanValue (true),
108  .AddTraceSource ("Rate",
109  "Traced value for rate changes (b/s)",
111  "ns3::TracedValueCallback::Uint64")
112  ;
113  return tid;
114 }
115 
118  m_currentRate (0)
119 {
120  NS_LOG_FUNCTION (this);
121 }
122 
124 {
125  NS_LOG_FUNCTION (this);
126 }
127 
128 void
130 {
131  NS_LOG_FUNCTION (this);
132  if (GetHtSupported ())
133  {
134  NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HT rates");
135  }
136  if (GetVhtSupported ())
137  {
138  NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support VHT rates");
139  }
140  if (GetHeSupported ())
141  {
142  NS_FATAL_ERROR ("WifiRemoteStationManager selected does not support HE rates");
143  }
144 }
145 
148 {
149  NS_LOG_FUNCTION (this);
151 
152  //AARF fields below
155  station->m_rate = 0;
156  station->m_success = 0;
157  station->m_failed = 0;
158  station->m_recovery = false;
159  station->m_timer = 0;
160 
161  //AARF-CD specific fields below
162  station->m_rtsOn = false;
163  station->m_rtsWnd = m_minRtsWnd;
164  station->m_rtsCounter = 0;
165  station->m_justModifyRate = true;
166  station->m_haveASuccess = false;
167 
168  return station;
169 }
170 
171 void
173 {
174  NS_LOG_FUNCTION (this << station);
175 }
176 
177 void
179 {
180  NS_LOG_FUNCTION (this << st);
181  AarfcdWifiRemoteStation *station = static_cast<AarfcdWifiRemoteStation*> (st);
182  station->m_timer++;
183  station->m_failed++;
184  station->m_success = 0;
185 
186  if (!station->m_rtsOn)
187  {
188  TurnOnRts (station);
189  if (!station->m_justModifyRate && !station->m_haveASuccess)
190  {
191  IncreaseRtsWnd (station);
192  }
193  else
194  {
195  ResetRtsWnd (station);
196  }
197  station->m_rtsCounter = station->m_rtsWnd;
198  if (station->m_failed >= 2)
199  {
200  station->m_timer = 0;
201  }
202  }
203  else if (station->m_recovery)
204  {
205  NS_ASSERT (station->m_failed >= 1);
206  station->m_justModifyRate = false;
207  station->m_rtsCounter = station->m_rtsWnd;
208  if (station->m_failed == 1)
209  {
210  //need recovery fallback
212  {
213  TurnOffRts (station);
214  }
215  station->m_justModifyRate = true;
216  station->m_successThreshold = (int)(Min (station->m_successThreshold * m_successK,
218  station->m_timerTimeout = (int)(Max (station->m_timerTimeout * m_timerK,
220  if (station->m_rate != 0)
221  {
222  station->m_rate--;
223  }
224  }
225  station->m_timer = 0;
226  }
227  else
228  {
229  NS_ASSERT (station->m_failed >= 1);
230  station->m_justModifyRate = false;
231  station->m_rtsCounter = station->m_rtsWnd;
232  if (((station->m_failed - 1) % 2) == 1)
233  {
234  //need normal fallback
236  {
237  TurnOffRts (station);
238  }
239  station->m_justModifyRate = true;
242  if (station->m_rate != 0)
243  {
244  station->m_rate--;
245  }
246  }
247  if (station->m_failed >= 2)
248  {
249  station->m_timer = 0;
250  }
251  }
252  CheckRts (station);
253 }
254 
255 void
257  double rxSnr, WifiMode txMode)
258 {
259  NS_LOG_FUNCTION (this << station << rxSnr << txMode);
260 }
261 
262 void
264  double ctsSnr, WifiMode ctsMode, double rtsSnr)
265 {
266  NS_LOG_FUNCTION (this << st << ctsSnr << ctsMode << rtsSnr);
267  AarfcdWifiRemoteStation *station = static_cast<AarfcdWifiRemoteStation*> (st);
268  NS_LOG_DEBUG ("station=" << station << " rts ok");
269  station->m_rtsCounter--;
270 }
271 
272 void
274  double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
275 {
276  NS_LOG_FUNCTION (this << st << ackSnr << ackMode << dataSnr << dataChannelWidth << +dataNss);
277  AarfcdWifiRemoteStation *station = static_cast<AarfcdWifiRemoteStation*> (st);
278  station->m_timer++;
279  station->m_success++;
280  station->m_failed = 0;
281  station->m_recovery = false;
282  station->m_justModifyRate = false;
283  station->m_haveASuccess = true;
284  NS_LOG_DEBUG ("station=" << station << " data ok success=" << station->m_success << ", timer=" << station->m_timer);
285  if ((station->m_success == station->m_successThreshold
286  || station->m_timer == station->m_timerTimeout)
287  && (station->m_rate < (GetNSupported (station) - 1)))
288  {
289  NS_LOG_DEBUG ("station=" << station << " inc rate");
290  station->m_rate++;
291  station->m_timer = 0;
292  station->m_success = 0;
293  station->m_recovery = true;
294  station->m_justModifyRate = true;
296  {
297  TurnOnRts (station);
298  ResetRtsWnd (station);
299  station->m_rtsCounter = station->m_rtsWnd;
300  }
301  }
302  CheckRts (station);
303 }
304 
305 void
307 {
308  NS_LOG_FUNCTION (this << station);
309 }
310 
311 void
313 {
314  NS_LOG_FUNCTION (this << station);
315 }
316 
319 {
320  NS_LOG_FUNCTION (this << st);
321  AarfcdWifiRemoteStation *station = static_cast<AarfcdWifiRemoteStation*> (st);
322  uint16_t channelWidth = GetChannelWidth (station);
323  if (channelWidth > 20 && channelWidth != 22)
324  {
325  channelWidth = 20;
326  }
327  WifiMode mode = GetSupported (station, station->m_rate);
328  if (m_currentRate != mode.GetDataRate (channelWidth))
329  {
330  NS_LOG_DEBUG ("New datarate: " << mode.GetDataRate (channelWidth));
331  m_currentRate = mode.GetDataRate (channelWidth);
332  }
333  return WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled (), UseGreenfieldForDestination (GetAddress (station))), 800, 1, 1, 0, channelWidth, GetAggregation (station), false);
334 }
335 
338 {
339  NS_LOG_FUNCTION (this << st);
342  AarfcdWifiRemoteStation *station = static_cast<AarfcdWifiRemoteStation*> (st);
343  uint16_t channelWidth = GetChannelWidth (station);
344  if (channelWidth > 20 && channelWidth != 22)
345  {
346  channelWidth = 20;
347  }
348  WifiTxVector rtsTxVector;
349  WifiMode mode;
350  if (GetUseNonErpProtection () == false)
351  {
352  mode = GetSupported (station, 0);
353  }
354  else
355  {
356  mode = GetNonErpSupported (station, 0);
357  }
358  rtsTxVector = WifiTxVector (mode, GetDefaultTxPowerLevel (), GetPreambleForTransmission (mode.GetModulationClass (), GetShortPreambleEnabled (), UseGreenfieldForDestination (GetAddress (station))), 800, 1, 1, 0, channelWidth, GetAggregation (station), false);
359  return rtsTxVector;
360 }
361 
362 bool
364  uint32_t size, bool normally)
365 {
366  NS_LOG_FUNCTION (this << st << size << normally);
367  AarfcdWifiRemoteStation *station = static_cast<AarfcdWifiRemoteStation*> (st);
368  NS_LOG_INFO ("" << station << " rate=" << station->m_rate << " rts=" << (station->m_rtsOn ? "RTS" : "BASIC") <<
369  " rtsCounter=" << station->m_rtsCounter);
370  return station->m_rtsOn;
371 }
372 
373 void
375 {
376  NS_LOG_FUNCTION (this << station);
377  if (station->m_rtsCounter == 0 && station->m_rtsOn)
378  {
379  TurnOffRts (station);
380  }
381 }
382 
383 void
385 {
386  NS_LOG_FUNCTION (this << station);
387  station->m_rtsOn = false;
388  station->m_haveASuccess = false;
389 }
390 
391 void
393 {
394  NS_LOG_FUNCTION (this << station);
395  station->m_rtsOn = true;
396 }
397 
398 void
400 {
401  NS_LOG_FUNCTION (this << station);
402  if (station->m_rtsWnd == m_maxRtsWnd)
403  {
404  return;
405  }
406 
407  station->m_rtsWnd *= 2;
408  if (station->m_rtsWnd > m_maxRtsWnd)
409  {
410  station->m_rtsWnd = m_maxRtsWnd;
411  }
412 }
413 
414 void
416 {
417  NS_LOG_FUNCTION (this << station);
418  station->m_rtsWnd = m_minRtsWnd;
419 }
420 
421 } //namespace ns3
WifiRemoteStation * DoCreateStation(void) const
void DoReportDataFailed(WifiRemoteStation *station)
It is important to realize that "recovery" mode starts after failure of the first transmission after ...
uint32_t m_successThreshold
success threshold
bool GetVhtSupported(void) const
Return whether the device has VHT capability support enabled.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
WifiTxVector DoGetDataTxVector(WifiRemoteStation *station)
uint8_t GetNSupported(const WifiRemoteStation *station) const
Return the number of modes supported by the given station.
AttributeValue implementation for Boolean.
Definition: boolean.h:36
double m_timerK
Multiplication factor for the timer threshold.
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
bool m_justModifyRate
just modify rate
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:45
uint32_t m_rtsCounter
RTS counter.
bool m_haveASuccess
have a success
Ptr< const AttributeAccessor > MakeBooleanAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Definition: boolean.h:85
uint32_t m_maxSuccessThreshold
maximum success threshold
bool GetHeSupported(void) const
Return whether the device has HE capability support enabled.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
Definition: assert.h:67
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
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.
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition: log.h:281
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:165
uint32_t m_maxRtsWnd
maximum RTS window
bool DoNeedRts(WifiRemoteStation *station, uint32_t size, bool normally)
uint32_t m_minRtsWnd
minimum RTS window
WifiPreamble GetPreambleForTransmission(WifiModulationClass modulation, bool useShortPreamble, bool useGreenfield)
Return the preamble to be used for the transmission.
Definition: wifi-utils.cc:116
bool m_turnOnRtsAfterRateIncrease
turn on RTS after rate increase
WifiMode GetSupported(const WifiRemoteStation *station, uint8_t i) const
Return whether mode associated with the specified station at the specified index. ...
represent a single transmission modeA WifiMode is implemented by a single integer which is used to lo...
Definition: wifi-mode.h:99
void DoReportFinalDataFailed(WifiRemoteStation *station)
This method is a pure virtual method that must be implemented by the sub-class.
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
void DoReportFinalRtsFailed(WifiRemoteStation *station)
This method is a pure virtual method that must be implemented by the sub-class.
bool GetShortPreambleEnabled(void) const
Return whether the device uses short PHY preambles.
void TurnOnRts(AarfcdWifiRemoteStation *station)
Turn on RTS for the given station.
void TurnOffRts(AarfcdWifiRemoteStation *station)
Turn off RTS for the given station.
int64x64_t Min(const int64x64_t &a, const int64x64_t &b)
Minimum.
Definition: int64x64.h:218
void DoReportDataOk(WifiRemoteStation *station, double ackSnr, WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
This method is a pure virtual method that must be implemented by the sub-class.
Hold an unsigned integer type.
Definition: uinteger.h:44
bool GetHtSupported(void) const
Return whether the device has HT capability support enabled.
int64x64_t Max(const int64x64_t &a, const int64x64_t &b)
Maximum.
Definition: int64x64.h:230
TracedValue< uint64_t > m_currentRate
Trace rate changes.
void ResetRtsWnd(AarfcdWifiRemoteStation *station)
Reset the RTS window of the given station.
hold a list of per-remote-station state.
WifiModulationClass GetModulationClass() const
Definition: wifi-mode.cc:480
void CheckRts(AarfcdWifiRemoteStation *station)
Check if the use of RTS for the given station can be turned off.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
bool UseGreenfieldForDestination(Mac48Address dest) const
Mac48Address GetAddress(const WifiRemoteStation *station) const
Return the address of the station.
WifiMode GetNonErpSupported(const WifiRemoteStation *station, uint8_t i) const
Return whether non-ERP mode associated with the specified station at the specified index...
void DoInitialize(void)
Initialize() implementation.
void DoReportRtsFailed(WifiRemoteStation *station)
This method is a pure virtual method that must be implemented by the sub-class.
bool GetAggregation(const WifiRemoteStation *station) const
Return whether the given station supports A-MPDU.
uint32_t m_minSuccessThreshold
minimum success threshold
Ptr< const AttributeAccessor > MakeDoubleAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Definition: double.h:42
hold per-remote-station state for AARF-CD Wifi manager.
uint32_t m_minTimerThreshold
minimum timer threshold
bool m_turnOffRtsAfterRateDecrease
turn off RTS after rate decrease
bool GetUseNonErpProtection(void) const
Return whether the device supports protection of non-ERP stations.
double m_successK
Multiplication factor for the success threshold.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:273
Ptr< const AttributeChecker > MakeBooleanChecker(void)
Definition: boolean.cc:121
static TypeId GetTypeId(void)
Get the type ID.
an implementation of the AARF-CD algorithmThis algorithm was first described in "Efficient Collision ...
void DoReportRxOk(WifiRemoteStation *station, double rxSnr, WifiMode txMode)
This method is a pure virtual method that must be implemented by the sub-class.
This class can be used to hold variables of floating point type such as &#39;double&#39; or &#39;float&#39;...
Definition: double.h:41
void IncreaseRtsWnd(AarfcdWifiRemoteStation *station)
Increase the RTS window size of the given station.
uint32_t m_timerTimeout
timer timeout
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Definition: uinteger.h:45
a unique identifier for an interface.
Definition: type-id.h:58
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:923
hold per-remote-station state.
uint64_t GetDataRate(uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) const
Definition: wifi-mode.cc:127
uint16_t GetChannelWidth(const WifiRemoteStation *station) const
Return the channel width supported by the station.
WifiTxVector DoGetRtsTxVector(WifiRemoteStation *station)