A Discrete-Event Network Simulator
API
wifi-remote-station-manager.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2005,2006,2007 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: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
19  */
20 
21 #include "ns3/log.h"
22 #include "ns3/boolean.h"
23 #include "ns3/uinteger.h"
24 #include "ns3/enum.h"
25 #include "ns3/simulator.h"
27 #include "wifi-phy.h"
28 #include "wifi-mac.h"
29 #include "wifi-utils.h"
30 #include "wifi-mac-header.h"
31 #include "wifi-mac-trailer.h"
32 #include "ht-configuration.h"
33 #include "vht-configuration.h"
34 #include "he-configuration.h"
35 #include "wifi-net-device.h"
36 
37 namespace ns3 {
38 
39 NS_LOG_COMPONENT_DEFINE ("WifiRemoteStationManager");
40 
41 NS_OBJECT_ENSURE_REGISTERED (WifiRemoteStationManager);
42 
43 TypeId
45 {
46  static TypeId tid = TypeId ("ns3::WifiRemoteStationManager")
47  .SetParent<Object> ()
48  .SetGroupName ("Wifi")
49  .AddAttribute ("MaxSsrc",
50  "The maximum number of retransmission attempts for any packet with size <= RtsCtsThreshold. "
51  "This value will not have any effect on some rate control algorithms.",
52  UintegerValue (7),
54  MakeUintegerChecker<uint32_t> ())
55  .AddAttribute ("MaxSlrc",
56  "The maximum number of retransmission attempts for any packet with size > RtsCtsThreshold. "
57  "This value will not have any effect on some rate control algorithms.",
58  UintegerValue (4),
60  MakeUintegerChecker<uint32_t> ())
61  .AddAttribute ("RtsCtsThreshold",
62  "If the size of the PSDU is bigger than this value, we use an RTS/CTS handshake before sending the data frame."
63  "This value will not have any effect on some rate control algorithms.",
64  UintegerValue (65535),
66  MakeUintegerChecker<uint32_t> ())
67  .AddAttribute ("FragmentationThreshold",
68  "If the size of the PSDU is bigger than this value, we fragment it such that the size of the fragments are equal or smaller. "
69  "This value does not apply when it is carried in an A-MPDU. "
70  "This value will not have any effect on some rate control algorithms.",
71  UintegerValue (65535),
74  MakeUintegerChecker<uint32_t> ())
75  .AddAttribute ("NonUnicastMode",
76  "Wifi mode used for non-unicast transmissions.",
77  WifiModeValue (),
80  .AddAttribute ("DefaultTxPowerLevel",
81  "Default power level to be used for transmissions. "
82  "This is the power level that is used by all those WifiManagers that do not implement TX power control.",
83  UintegerValue (0),
85  MakeUintegerChecker<uint8_t> ())
86  .AddAttribute ("ErpProtectionMode",
87  "Protection mode used when non-ERP STAs are connected to an ERP AP: Rts-Cts or Cts-To-Self",
92  .AddAttribute ("HtProtectionMode",
93  "Protection mode used when non-HT STAs are connected to a HT AP: Rts-Cts or Cts-To-Self",
98  .AddTraceSource ("MacTxRtsFailed",
99  "The transmission of a RTS by the MAC layer has failed",
101  "ns3::Mac48Address::TracedCallback")
102  .AddTraceSource ("MacTxDataFailed",
103  "The transmission of a data packet by the MAC layer has failed",
105  "ns3::Mac48Address::TracedCallback")
106  .AddTraceSource ("MacTxFinalRtsFailed",
107  "The transmission of a RTS has exceeded the maximum number of attempts",
109  "ns3::Mac48Address::TracedCallback")
110  .AddTraceSource ("MacTxFinalDataFailed",
111  "The transmission of a data packet has exceeded the maximum number of attempts",
113  "ns3::Mac48Address::TracedCallback")
114  ;
115  return tid;
116 }
117 
119  : m_pcfSupported (false),
120  m_useNonErpProtection (false),
121  m_useNonHtProtection (false),
122  m_useGreenfieldProtection (false),
123  m_shortPreambleEnabled (false),
124  m_shortSlotTimeEnabled (false),
125  m_rifsPermitted (false)
126 {
127  NS_LOG_FUNCTION (this);
128 }
129 
131 {
132  NS_LOG_FUNCTION (this);
133 }
134 
135 void
137 {
138  NS_LOG_FUNCTION (this);
139  Reset ();
140 }
141 
142 void
144 {
145  NS_LOG_FUNCTION (this << phy);
146  //We need to track our PHY because it is the object that knows the
147  //full set of transmit rates that are supported. We need to know
148  //this in order to find the relevant mandatory rates when choosing a
149  //transmit rate for automatic control responses like
150  //acknowledgments.
151  m_wifiPhy = phy;
152  m_defaultTxMode = phy->GetMode (0);
154  if (GetHtSupported ())
155  {
156  m_defaultTxMcs = phy->GetMcs (0);
157  }
158  Reset ();
159 }
160 
161 void
163 {
164  NS_LOG_FUNCTION (this << mac);
165  //We need to track our MAC because it is the object that knows the
166  //full set of interframe spaces.
167  m_wifiMac = mac;
168  Reset ();
169 }
170 
171 void
173 {
174  NS_LOG_FUNCTION (this << maxSsrc);
175  m_maxSsrc = maxSsrc;
176 }
177 
178 void
180 {
181  NS_LOG_FUNCTION (this << maxSlrc);
182  m_maxSlrc = maxSlrc;
183 }
184 
185 void
187 {
188  NS_LOG_FUNCTION (this << threshold);
189  m_rtsCtsThreshold = threshold;
190 }
191 
192 void
194 {
195  NS_LOG_FUNCTION (this << threshold);
196  DoSetFragmentationThreshold (threshold);
197 }
198 
199 void
201 {
202  NS_LOG_FUNCTION (this << enable);
203  m_shortPreambleEnabled = enable;
204 }
205 
206 void
208 {
209  NS_LOG_FUNCTION (this << enable);
210  m_shortSlotTimeEnabled = enable;
211 }
212 
213 void
215 {
216  NS_LOG_FUNCTION (this << allow);
217  m_rifsPermitted = allow;
218 }
219 
220 bool
222 {
223  return m_shortSlotTimeEnabled;
224 }
225 
226 bool
228 {
229  return m_shortPreambleEnabled;
230 }
231 
232 bool
234 {
235  return m_rifsPermitted;
236 }
237 
238 bool
240 {
241  Ptr<WifiNetDevice> device = DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ());
242  Ptr<HtConfiguration> htConfiguration = device->GetHtConfiguration ();
243  if (htConfiguration)
244  {
245  return true;
246  }
247  return false;
248 }
249 
250 bool
252 {
253  Ptr<WifiNetDevice> device = DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ());
254  Ptr<VhtConfiguration> vhtConfiguration = device->GetVhtConfiguration ();
255  if (vhtConfiguration)
256  {
257  return true;
258  }
259  return false;
260 }
261 
262 bool
264 {
265  Ptr<WifiNetDevice> device = DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ());
266  Ptr<HeConfiguration> heConfiguration = device->GetHeConfiguration ();
267  if (heConfiguration)
268  {
269  return true;
270  }
271  return false;
272 }
273 
274 void
276 {
277  m_pcfSupported = enable;
278 }
279 
280 bool
282 {
283  return m_pcfSupported;
284 }
285 
286 bool
288 {
289  if (GetHtSupported ())
290  {
291  Ptr<WifiNetDevice> device = DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ());
292  Ptr<HtConfiguration> htConfiguration = device->GetHtConfiguration ();
293  NS_ASSERT (htConfiguration); //If HT is supported, we should have a HT configuration attached
294  if (htConfiguration->GetGreenfieldSupported ())
295  {
296  return true;
297  }
298  }
299  return false;
300 }
301 
302 bool
304 {
305  if (GetHtSupported ())
306  {
307  Ptr<WifiNetDevice> device = DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ());
308  Ptr<HtConfiguration> htConfiguration = device->GetHtConfiguration ();
309  NS_ASSERT (htConfiguration); //If HT is supported, we should have a HT configuration attached
310  if (htConfiguration->GetShortGuardIntervalSupported ())
311  {
312  return true;
313  }
314  }
315  return false;
316 }
317 
318 uint16_t
320 {
321  uint16_t gi = 0;
322  if (GetHeSupported ())
323  {
324  Ptr<WifiNetDevice> device = DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ());
325  Ptr<HeConfiguration> heConfiguration = device->GetHeConfiguration ();
326  NS_ASSERT (heConfiguration); //If HE is supported, we should have a HE configuration attached
327  gi = static_cast<uint16_t>(heConfiguration->GetGuardInterval ().GetNanoSeconds ());
328  }
329  return gi;
330 }
331 
332 uint32_t
334 {
335  return DoGetFragmentationThreshold ();
336 }
337 
338 void
340 {
341  NS_LOG_FUNCTION (this << address << isShortPreambleSupported);
342  NS_ASSERT (!address.IsGroup ());
344  state->m_shortPreamble = isShortPreambleSupported;
345 }
346 
347 void
349 {
350  NS_LOG_FUNCTION (this << address << isShortSlotTimeSupported);
351  NS_ASSERT (!address.IsGroup ());
353  state->m_shortSlotTime = isShortSlotTimeSupported;
354 }
355 
356 void
358 {
359  NS_LOG_FUNCTION (this << address << mode);
360  NS_ASSERT (!address.IsGroup ());
362  for (WifiModeListIterator i = state->m_operationalRateSet.begin (); i != state->m_operationalRateSet.end (); i++)
363  {
364  if ((*i) == mode)
365  {
366  //already in.
367  return;
368  }
369  }
370  state->m_operationalRateSet.push_back (mode);
371 }
372 
373 void
375 {
376  NS_LOG_FUNCTION (this << address);
377  NS_ASSERT (!address.IsGroup ());
379  state->m_operationalRateSet.clear ();
380  for (uint8_t i = 0; i < m_wifiPhy->GetNModes (); i++)
381  {
382  state->m_operationalRateSet.push_back (m_wifiPhy->GetMode (i));
383  if (m_wifiPhy->GetMode (i).IsMandatory ())
384  {
386  }
387  }
388 }
389 
390 void
392 {
393  NS_LOG_FUNCTION (this << address);
394  NS_ASSERT (!address.IsGroup ());
396  state->m_operationalMcsSet.clear ();
397  for (uint8_t i = 0; i < m_wifiPhy->GetNMcs (); i++)
398  {
399  state->m_operationalMcsSet.push_back (m_wifiPhy->GetMcs (i));
400  }
401 }
402 
403 void
405 {
406  NS_LOG_FUNCTION (this << address);
407  NS_ASSERT (!address.IsGroup ());
409  state->m_operationalMcsSet.clear ();
410 }
411 
412 void
414 {
415  NS_LOG_FUNCTION (this << address << mcs);
416  NS_ASSERT (!address.IsGroup ());
418  for (WifiModeListIterator i = state->m_operationalMcsSet.begin (); i != state->m_operationalMcsSet.end (); i++)
419  {
420  if ((*i) == mcs)
421  {
422  //already in.
423  return;
424  }
425  }
426  state->m_operationalMcsSet.push_back (mcs);
427 }
428 
429 bool
431 {
433 }
434 
435 bool
437 {
439 }
440 
441 bool
443 {
445 }
446 
447 bool
449 {
450  if (address.IsGroup ())
451  {
452  return false;
453  }
455 }
456 
457 bool
459 {
460  if (address.IsGroup ())
461  {
462  return true;
463  }
465 }
466 
467 bool
469 {
470  if (address.IsGroup ())
471  {
472  return false;
473  }
475 }
476 
477 void
479 {
480  NS_ASSERT (!address.IsGroup ());
482 }
483 
484 void
486 {
487  NS_ASSERT (!address.IsGroup ());
489 }
490 
491 void
493 {
494  NS_ASSERT (!address.IsGroup ());
496 }
497 
498 void
500 {
501  NS_ASSERT (!address.IsGroup ());
503 }
504 
507 {
508  NS_LOG_FUNCTION (this << header);
509  Mac48Address address = header.GetAddr1 ();
510  if (!header.IsMgt () && address.IsGroup ())
511  {
512  WifiMode mode = GetNonUnicastMode ();
513  WifiTxVector v;
514  v.SetMode (mode);
518  v.SetGuardInterval (ConvertGuardIntervalToNanoSeconds (mode, DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ())));
519  v.SetNTx (1);
520  v.SetNss (1);
521  v.SetNess (0);
522  v.SetStbc (0);
523  return v;
524  }
525  WifiTxVector txVector;
526  if (header.IsMgt ())
527  {
528  //Use the lowest basic rate for management frames
529  WifiMode mgtMode;
530  if (GetNBasicModes () > 0)
531  {
532  mgtMode = GetBasicMode (0);
533  }
534  else
535  {
536  mgtMode = GetDefaultMode ();
537  }
538  txVector.SetMode (mgtMode);
542  txVector.SetGuardInterval (ConvertGuardIntervalToNanoSeconds (mgtMode, DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ())));
543  }
544  else
545  {
546  txVector = DoGetDataTxVector (Lookup (address));
547  }
548  Ptr<WifiNetDevice> device = DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ());
549  Ptr<HeConfiguration> heConfiguration = device->GetHeConfiguration ();
550  if (heConfiguration)
551  {
552  UintegerValue bssColor;
553  heConfiguration->GetAttribute ("BssColor", bssColor);
554  txVector.SetBssColor (bssColor.Get ());
555  }
556  return txVector;
557 }
558 
561 {
562  WifiMode defaultMode = GetDefaultMode ();
563  WifiPreamble defaultPreamble;
564  if (defaultMode.GetModulationClass () == WIFI_MOD_CLASS_HE)
565  {
566  defaultPreamble = WIFI_PREAMBLE_HE_SU;
567  }
568  else if (defaultMode.GetModulationClass () == WIFI_MOD_CLASS_VHT)
569  {
570  defaultPreamble = WIFI_PREAMBLE_VHT_SU;
571  }
572  else if (defaultMode.GetModulationClass () == WIFI_MOD_CLASS_HT)
573  {
574  defaultPreamble = WIFI_PREAMBLE_HT_MF;
575  }
576  else
577  {
578  defaultPreamble = WIFI_PREAMBLE_LONG;
579  }
580 
581  return WifiTxVector (defaultMode,
583  defaultPreamble,
584  ConvertGuardIntervalToNanoSeconds (defaultMode, DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ())),
587  0,
589  false,
590  false);
591 }
592 
595 {
596  NS_LOG_FUNCTION (this << address);
597  if (address.IsGroup ())
598  {
599  WifiMode mode = GetNonUnicastMode ();
600  WifiTxVector v;
601  v.SetMode (mode);
605  v.SetGuardInterval (ConvertGuardIntervalToNanoSeconds (mode, DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ())));
606  v.SetNTx (1);
607  v.SetNss (1);
608  v.SetNess (0);
609  v.SetStbc (0);
610  return v;
611  }
612  return DoGetRtsTxVector (Lookup (address));
613 }
614 
615 void
617 {
618  NS_LOG_FUNCTION (this << address << *header);
619  NS_ASSERT (!address.IsGroup ());
620  AcIndex ac = QosUtilsMapTidToAc ((header->IsQosData ()) ? header->GetQosTid () : 0);
621  m_ssrc[ac]++;
624 }
625 
626 void
628  uint32_t packetSize)
629 {
630  NS_LOG_FUNCTION (this << address << *header);
631  NS_ASSERT (!address.IsGroup ());
632  AcIndex ac = QosUtilsMapTidToAc ((header->IsQosData ()) ? header->GetQosTid () : 0);
633  bool longMpdu = (packetSize + header->GetSize () + WIFI_MAC_FCS_LENGTH) > m_rtsCtsThreshold;
634  if (longMpdu)
635  {
636  m_slrc[ac]++;
637  }
638  else
639  {
640  m_ssrc[ac]++;
641  }
644 }
645 
646 void
648  double ctsSnr, WifiMode ctsMode, double rtsSnr)
649 {
650  NS_LOG_FUNCTION (this << address << *header << ctsSnr << ctsMode << rtsSnr);
651  NS_ASSERT (!address.IsGroup ());
652  WifiRemoteStation *station = Lookup (address);
653  AcIndex ac = QosUtilsMapTidToAc ((header->IsQosData ()) ? header->GetQosTid () : 0);
654  station->m_state->m_info.NotifyTxSuccess (m_ssrc[ac]);
655  m_ssrc[ac] = 0;
656  DoReportRtsOk (station, ctsSnr, ctsMode, rtsSnr);
657 }
658 
659 void
661  double ackSnr, WifiMode ackMode, double dataSnr,
662  WifiTxVector dataTxVector, uint32_t packetSize)
663 {
664  NS_LOG_FUNCTION (this << address << *header << ackSnr << ackMode << dataSnr << dataTxVector << packetSize);
665  NS_ASSERT (!address.IsGroup ());
666  WifiRemoteStation *station = Lookup (address);
667  AcIndex ac = QosUtilsMapTidToAc ((header->IsQosData ()) ? header->GetQosTid () : 0);
668  bool longMpdu = (packetSize + header->GetSize () + WIFI_MAC_FCS_LENGTH) > m_rtsCtsThreshold;
669  if (longMpdu)
670  {
671  station->m_state->m_info.NotifyTxSuccess (m_slrc[ac]);
672  m_slrc[ac] = 0;
673  }
674  else
675  {
676  station->m_state->m_info.NotifyTxSuccess (m_ssrc[ac]);
677  m_ssrc[ac] = 0;
678  }
679  DoReportDataOk (station, ackSnr, ackMode, dataSnr, dataTxVector.GetChannelWidth (), dataTxVector.GetNss ());
680 }
681 
682 void
684 {
685  NS_LOG_FUNCTION (this << address << *header);
686  NS_ASSERT (!address.IsGroup ());
687  WifiRemoteStation *station = Lookup (address);
688  AcIndex ac = QosUtilsMapTidToAc ((header->IsQosData ()) ? header->GetQosTid () : 0);
689  station->m_state->m_info.NotifyTxFailed ();
690  m_ssrc[ac] = 0;
692  DoReportFinalRtsFailed (station);
693 }
694 
695 void
697  uint32_t packetSize)
698 {
699  NS_LOG_FUNCTION (this << address << *header);
700  NS_ASSERT (!address.IsGroup ());
701  WifiRemoteStation *station = Lookup (address);
702  AcIndex ac = QosUtilsMapTidToAc ((header->IsQosData ()) ? header->GetQosTid () : 0);
703  station->m_state->m_info.NotifyTxFailed ();
704  bool longMpdu = (packetSize + header->GetSize () + WIFI_MAC_FCS_LENGTH) > m_rtsCtsThreshold;
705  if (longMpdu)
706  {
707  m_slrc[ac] = 0;
708  }
709  else
710  {
711  m_ssrc[ac] = 0;
712  }
714  DoReportFinalDataFailed (station);
715 }
716 
717 void
719 {
720  NS_LOG_FUNCTION (this << address << rxSnr << txMode);
721  if (address.IsGroup ())
722  {
723  return;
724  }
725  DoReportRxOk (Lookup (address), rxSnr, txMode);
726 }
727 
728 void
730  uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus,
731  double rxSnr, double dataSnr, WifiTxVector dataTxVector)
732 {
733  NS_LOG_FUNCTION (this << address << +nSuccessfulMpdus << +nFailedMpdus << rxSnr << dataSnr << dataTxVector);
734  NS_ASSERT (!address.IsGroup ());
735  for (uint8_t i = 0; i < nFailedMpdus; i++)
736  {
738  }
739  DoReportAmpduTxStatus (Lookup (address), nSuccessfulMpdus, nFailedMpdus, rxSnr, dataSnr, dataTxVector.GetChannelWidth (), dataTxVector.GetNss ());
740 }
741 
742 bool
743 WifiRemoteStationManager::NeedRts (const WifiMacHeader &header, uint32_t size)
744 {
745  NS_LOG_FUNCTION (this << header << size);
746  Mac48Address address = header.GetAddr1 ();
747  WifiTxVector txVector = GetDataTxVector (header);
748  WifiMode mode = txVector.GetMode ();
749  if (address.IsGroup ())
750  {
751  return false;
752  }
755  || (mode.GetModulationClass () == WIFI_MOD_CLASS_HT)
756  || (mode.GetModulationClass () == WIFI_MOD_CLASS_VHT)
757  || (mode.GetModulationClass () == WIFI_MOD_CLASS_HE))
759  {
760  NS_LOG_DEBUG ("WifiRemoteStationManager::NeedRTS returning true to protect non-ERP stations");
761  return true;
762  }
763  else if (m_htProtectionMode == RTS_CTS
764  && ((mode.GetModulationClass () == WIFI_MOD_CLASS_HT)
765  || (mode.GetModulationClass () == WIFI_MOD_CLASS_VHT))
768  {
769  NS_LOG_DEBUG ("WifiRemoteStationManager::NeedRTS returning true to protect non-HT stations");
770  return true;
771  }
772  bool normally = (size > m_rtsCtsThreshold);
773  return DoNeedRts (Lookup (address), size, normally);
774 }
775 
776 bool
778 {
779  WifiMode mode = txVector.GetMode ();
780  NS_LOG_FUNCTION (this << mode);
783  || (mode.GetModulationClass () == WIFI_MOD_CLASS_HT)
784  || (mode.GetModulationClass () == WIFI_MOD_CLASS_VHT)
785  || (mode.GetModulationClass () == WIFI_MOD_CLASS_HE))
787  {
788  NS_LOG_DEBUG ("WifiRemoteStationManager::NeedCtsToSelf returning true to protect non-ERP stations");
789  return true;
790  }
791  else if (m_htProtectionMode == CTS_TO_SELF
792  && ((mode.GetModulationClass () == WIFI_MOD_CLASS_HT)
793  || (mode.GetModulationClass () == WIFI_MOD_CLASS_VHT))
796  {
797  NS_LOG_DEBUG ("WifiRemoteStationManager::NeedCtsToSelf returning true to protect non-HT stations");
798  return true;
799  }
800  else if (!m_useNonErpProtection)
801  {
802  //search for the BSS Basic Rate set, if the used mode is in the basic set then there is no need for CTS To Self
803  for (WifiModeListIterator i = m_bssBasicRateSet.begin (); i != m_bssBasicRateSet.end (); i++)
804  {
805  if (mode == *i)
806  {
807  NS_LOG_DEBUG ("WifiRemoteStationManager::NeedCtsToSelf returning false");
808  return false;
809  }
810  }
811  if (GetHtSupported ())
812  {
813  //search for the BSS Basic MCS set, if the used mode is in the basic set then there is no need for CTS To Self
814  for (WifiModeListIterator i = m_bssBasicMcsSet.begin (); i != m_bssBasicMcsSet.end (); i++)
815  {
816  if (mode == *i)
817  {
818  NS_LOG_DEBUG ("WifiRemoteStationManager::NeedCtsToSelf returning false");
819  return false;
820  }
821  }
822  }
823  NS_LOG_DEBUG ("WifiRemoteStationManager::NeedCtsToSelf returning true");
824  return true;
825  }
826  return false;
827 }
828 
829 void
831 {
832  NS_LOG_FUNCTION (this << enable);
833  m_useNonErpProtection = enable;
834 }
835 
836 bool
838 {
839  return m_useNonErpProtection;
840 }
841 
842 void
844 {
845  NS_LOG_FUNCTION (this << enable);
846  m_useNonHtProtection = enable;
847 }
848 
849 bool
851 {
852  return m_useNonHtProtection;
853 }
854 
855 void
857 {
858  NS_LOG_FUNCTION (this << enable);
859  m_useGreenfieldProtection = enable;
860 }
861 
862 bool
864 {
866 }
867 
868 bool
870  Ptr<const Packet> packet)
871 {
872  NS_LOG_FUNCTION (this << address << packet << *header);
873  NS_ASSERT (!address.IsGroup ());
874  AcIndex ac = QosUtilsMapTidToAc ((header->IsQosData ()) ? header->GetQosTid () : 0);
875  bool longMpdu = (packet->GetSize () + header->GetSize () + WIFI_MAC_FCS_LENGTH) > m_rtsCtsThreshold;
876  uint32_t retryCount, maxRetryCount;
877  if (longMpdu)
878  {
879  retryCount = m_slrc[ac];
880  maxRetryCount = m_maxSlrc;
881  }
882  else
883  {
884  retryCount = m_ssrc[ac];
885  maxRetryCount = m_maxSsrc;
886  }
887  bool normally = retryCount < maxRetryCount;
888  NS_LOG_DEBUG ("WifiRemoteStationManager::NeedRetransmission count: " << retryCount << " result: " << std::boolalpha << normally);
889  return DoNeedRetransmission (Lookup (address), packet, normally);
890 }
891 
892 bool
894  Ptr<const Packet> packet)
895 {
896  NS_LOG_FUNCTION (this << address << packet << *header);
897  if (address.IsGroup ())
898  {
899  return false;
900  }
901  bool normally = (packet->GetSize () + header->GetSize () + WIFI_MAC_FCS_LENGTH) > GetFragmentationThreshold ();
902  NS_LOG_DEBUG ("WifiRemoteStationManager::NeedFragmentation result: " << std::boolalpha << normally);
903  return DoNeedFragmentation (Lookup (address), packet, normally);
904 }
905 
906 void
908 {
909  NS_LOG_FUNCTION (this << threshold);
910  if (threshold < 256)
911  {
912  /*
913  * ASN.1 encoding of the MAC and PHY MIB (256 ... 8000)
914  */
915  NS_LOG_WARN ("Fragmentation threshold should be larger than 256. Setting to 256.");
917  }
918  else
919  {
920  /*
921  * The length of each fragment shall be an even number of octets, except for the last fragment if an MSDU or
922  * MMPDU, which may be either an even or an odd number of octets.
923  */
924  if (threshold % 2 != 0)
925  {
926  NS_LOG_WARN ("Fragmentation threshold should be an even number. Setting to " << threshold - 1);
927  m_nextFragmentationThreshold = threshold - 1;
928  }
929  else
930  {
931  m_nextFragmentationThreshold = threshold;
932  }
933  }
934 }
935 
936 void
938 {
940 }
941 
942 uint32_t
944 {
946 }
947 
948 uint32_t
950 {
951  NS_LOG_FUNCTION (this << *header << packet);
952  //The number of bytes a fragment can support is (Threshold - WIFI_HEADER_SIZE - WIFI_FCS).
953  uint32_t nFragments = (packet->GetSize () / (GetFragmentationThreshold () - header->GetSize () - WIFI_MAC_FCS_LENGTH));
954 
955  //If the size of the last fragment is not 0.
956  if ((packet->GetSize () % (GetFragmentationThreshold () - header->GetSize () - WIFI_MAC_FCS_LENGTH)) > 0)
957  {
958  nFragments++;
959  }
960  NS_LOG_DEBUG ("WifiRemoteStationManager::GetNFragments returning " << nFragments);
961  return nFragments;
962 }
963 
964 uint32_t
966  Ptr<const Packet> packet, uint32_t fragmentNumber)
967 {
968  NS_LOG_FUNCTION (this << address << *header << packet << fragmentNumber);
969  NS_ASSERT (!address.IsGroup ());
970  uint32_t nFragment = GetNFragments (header, packet);
971  if (fragmentNumber >= nFragment)
972  {
973  NS_LOG_DEBUG ("WifiRemoteStationManager::GetFragmentSize returning 0");
974  return 0;
975  }
976  //Last fragment
977  if (fragmentNumber == nFragment - 1)
978  {
979  uint32_t lastFragmentSize = packet->GetSize () - (fragmentNumber * (GetFragmentationThreshold () - header->GetSize () - WIFI_MAC_FCS_LENGTH));
980  NS_LOG_DEBUG ("WifiRemoteStationManager::GetFragmentSize returning " << lastFragmentSize);
981  return lastFragmentSize;
982  }
983  //All fragments but the last, the number of bytes is (Threshold - WIFI_HEADER_SIZE - WIFI_FCS).
984  else
985  {
986  uint32_t fragmentSize = GetFragmentationThreshold () - header->GetSize () - WIFI_MAC_FCS_LENGTH;
987  NS_LOG_DEBUG ("WifiRemoteStationManager::GetFragmentSize returning " << fragmentSize);
988  return fragmentSize;
989  }
990 }
991 
992 uint32_t
994  Ptr<const Packet> packet, uint32_t fragmentNumber)
995 {
996  NS_LOG_FUNCTION (this << address << *header << packet << fragmentNumber);
997  NS_ASSERT (!address.IsGroup ());
998  NS_ASSERT (fragmentNumber < GetNFragments (header, packet));
999  uint32_t fragmentOffset = fragmentNumber * (GetFragmentationThreshold () - header->GetSize () - WIFI_MAC_FCS_LENGTH);
1000  NS_LOG_DEBUG ("WifiRemoteStationManager::GetFragmentOffset returning " << fragmentOffset);
1001  return fragmentOffset;
1002 }
1003 
1004 bool
1006  Ptr<const Packet> packet, uint32_t fragmentNumber)
1007 {
1008  NS_LOG_FUNCTION (this << address << *header << packet << fragmentNumber);
1009  NS_ASSERT (!address.IsGroup ());
1010  bool isLast = fragmentNumber == (GetNFragments (header, packet) - 1);
1011  NS_LOG_DEBUG ("WifiRemoteStationManager::IsLastFragment returning " << std::boolalpha << isLast);
1012  return isLast;
1013 }
1014 
1015 uint8_t
1017 {
1018  return m_defaultTxPowerLevel;
1019 }
1020 
1023 {
1025  return state->m_info;
1026 }
1027 
1030 {
1031  NS_LOG_FUNCTION (this << address);
1032  for (StationStates::const_iterator i = m_states.begin (); i != m_states.end (); i++)
1033  {
1034  if ((*i)->m_address == address)
1035  {
1036  NS_LOG_DEBUG ("WifiRemoteStationManager::LookupState returning existing state");
1037  return (*i);
1038  }
1039  }
1042  state->m_address = address;
1043  state->m_operationalRateSet.push_back (GetDefaultMode ());
1044  state->m_operationalMcsSet.push_back (GetDefaultMcs ());
1045  state->m_htCapabilities = 0;
1046  state->m_vhtCapabilities = 0;
1047  state->m_heCapabilities = 0;
1049  state->m_guardInterval = GetGuardInterval ();
1050  state->m_ness = 0;
1051  state->m_aggregation = false;
1052  state->m_qosSupported = false;
1053  const_cast<WifiRemoteStationManager *> (this)->m_states.push_back (state);
1054  NS_LOG_DEBUG ("WifiRemoteStationManager::LookupState returning new state");
1055  return state;
1056 }
1057 
1060 {
1061  NS_LOG_FUNCTION (this << address);
1062  for (Stations::const_iterator i = m_stations.begin (); i != m_stations.end (); i++)
1063  {
1064  if ((*i)->m_state->m_address == address)
1065  {
1066  return (*i);
1067  }
1068  }
1070 
1071  WifiRemoteStation *station = DoCreateStation ();
1072  station->m_state = state;
1073  const_cast<WifiRemoteStationManager *> (this)->m_stations.push_back (station);
1074  return station;
1075 }
1076 
1077 void
1079 {
1080  NS_LOG_FUNCTION (this << from << qosSupported);
1081  WifiRemoteStationState *state;
1082  state = LookupState (from);
1083  state->m_qosSupported = qosSupported;
1084 }
1085 
1086 void
1088 {
1089  //Used by all stations to record HT capabilities of remote stations
1090  NS_LOG_FUNCTION (this << from << htCapabilities);
1091  WifiRemoteStationState *state;
1092  state = LookupState (from);
1093  if (htCapabilities.GetSupportedChannelWidth () == 1)
1094  {
1095  state->m_channelWidth = 40;
1096  }
1097  else
1098  {
1099  state->m_channelWidth = 20;
1100  }
1101  SetQosSupport (from, true);
1102  for (uint8_t j = 0; j < m_wifiPhy->GetNMcs (); j++)
1103  {
1104  WifiMode mcs = m_wifiPhy->GetMcs (j);
1105  if (mcs.GetModulationClass () == WIFI_MOD_CLASS_HT && htCapabilities.IsSupportedMcs (mcs.GetMcsValue ()))
1106  {
1107  AddSupportedMcs (from, mcs);
1108  }
1109  }
1110  state->m_htCapabilities = Create<const HtCapabilities> (htCapabilities);
1111 }
1112 
1113 void
1115 {
1116  //Used by all stations to record VHT capabilities of remote stations
1117  NS_LOG_FUNCTION (this << from << vhtCapabilities);
1118  WifiRemoteStationState *state;
1119  state = LookupState (from);
1120  if (vhtCapabilities.GetSupportedChannelWidthSet () == 1)
1121  {
1122  state->m_channelWidth = 160;
1123  }
1124  else
1125  {
1126  state->m_channelWidth = 80;
1127  }
1128  //This is a workaround to enable users to force a 20 or 40 MHz channel for a VHT-compliant device,
1129  //since IEEE 802.11ac standard says that 20, 40 and 80 MHz channels are mandatory.
1130  if (m_wifiPhy->GetChannelWidth () < state->m_channelWidth)
1131  {
1133  }
1134  for (uint8_t i = 1; i <= m_wifiPhy->GetMaxSupportedTxSpatialStreams (); i++)
1135  {
1136  for (uint8_t j = 0; j < m_wifiPhy->GetNMcs (); j++)
1137  {
1138  WifiMode mcs = m_wifiPhy->GetMcs (j);
1139  if (mcs.GetModulationClass () == WIFI_MOD_CLASS_VHT && vhtCapabilities.IsSupportedMcs (mcs.GetMcsValue (), i))
1140  {
1141  AddSupportedMcs (from, mcs);
1142  }
1143  }
1144  }
1145  state->m_vhtCapabilities = Create<const VhtCapabilities> (vhtCapabilities);
1146 }
1147 
1148 void
1150 {
1151  //Used by all stations to record HE capabilities of remote stations
1152  NS_LOG_FUNCTION (this << from << heCapabilities);
1153  WifiRemoteStationState *state;
1154  state = LookupState (from);
1155  if (Is5Ghz (m_wifiPhy->GetFrequency ()))
1156  {
1157  if (heCapabilities.GetChannelWidthSet () & 0x04)
1158  {
1159  state->m_channelWidth = 160;
1160  }
1161  else if (heCapabilities.GetChannelWidthSet () & 0x02)
1162  {
1163  state->m_channelWidth = 80;
1164  }
1165  //For other cases at 5 GHz, the supported channel width is set by the VHT capabilities
1166  }
1167  else if (Is2_4Ghz (m_wifiPhy->GetFrequency ()))
1168  {
1169  if (heCapabilities.GetChannelWidthSet () & 0x01)
1170  {
1171  state->m_channelWidth = 40;
1172  }
1173  else
1174  {
1175  state->m_channelWidth = 20;
1176  }
1177  }
1178  if (heCapabilities.GetHeLtfAndGiForHePpdus () >= 2)
1179  {
1180  state->m_guardInterval = 800;
1181  }
1182  else if (heCapabilities.GetHeLtfAndGiForHePpdus () == 1)
1183  {
1184  state->m_guardInterval = 1600;
1185  }
1186  else
1187  {
1188  state->m_guardInterval = 3200;
1189  }
1190  for (uint8_t i = 1; i <= m_wifiPhy->GetMaxSupportedTxSpatialStreams (); i++)
1191  {
1192  for (uint8_t j = 0; j < m_wifiPhy->GetNMcs (); j++)
1193  {
1194  WifiMode mcs = m_wifiPhy->GetMcs (j);
1196  && heCapabilities.GetHighestNssSupported () >= i
1197  && heCapabilities.GetHighestMcsSupported () >= j)
1198  {
1199  AddSupportedMcs (from, mcs);
1200  }
1201  }
1202  }
1203  state->m_heCapabilities = Create<const HeCapabilities> (heCapabilities);
1204  SetQosSupport (from, true);
1205 }
1206 
1209 {
1210  return LookupState (from)->m_htCapabilities;
1211 }
1212 
1215 {
1216  return LookupState (from)->m_vhtCapabilities;
1217 }
1218 
1221 {
1222  return LookupState (from)->m_heCapabilities;
1223 }
1224 
1225 bool
1227 {
1229 
1230  if (!htCapabilities)
1231  {
1232  return false;
1233  }
1234  return htCapabilities->GetGreenfield ();
1235 }
1236 
1237 WifiMode
1239 {
1240  return m_defaultTxMode;
1241 }
1242 
1243 WifiMode
1245 {
1246  return m_defaultTxMcs;
1247 }
1248 
1249 void
1251 {
1252  NS_LOG_FUNCTION (this);
1253  for (StationStates::const_iterator i = m_states.begin (); i != m_states.end (); i++)
1254  {
1255  delete (*i);
1256  }
1257  m_states.clear ();
1258  for (Stations::const_iterator i = m_stations.begin (); i != m_stations.end (); i++)
1259  {
1260  delete (*i);
1261  }
1262  m_stations.clear ();
1263  m_bssBasicRateSet.clear ();
1264  m_bssBasicMcsSet.clear ();
1265  m_ssrc.fill (0);
1266  m_slrc.fill (0);
1267 }
1268 
1269 void
1271 {
1272  NS_LOG_FUNCTION (this << mode);
1273  if (mode.GetModulationClass () >= WIFI_MOD_CLASS_HT)
1274  {
1275  NS_FATAL_ERROR ("It is not allowed to add a HT rate in the BSSBasicRateSet!");
1276  }
1277  for (uint8_t i = 0; i < GetNBasicModes (); i++)
1278  {
1279  if (GetBasicMode (i) == mode)
1280  {
1281  return;
1282  }
1283  }
1284  m_bssBasicRateSet.push_back (mode);
1285 }
1286 
1287 uint8_t
1289 {
1290  return static_cast<uint8_t> (m_bssBasicRateSet.size ());
1291 }
1292 
1293 WifiMode
1295 {
1296  NS_ASSERT (i < GetNBasicModes ());
1297  return m_bssBasicRateSet[i];
1298 }
1299 
1300 uint32_t
1302 {
1303  uint32_t size = 0;
1304  for (WifiModeListIterator i = m_bssBasicRateSet.begin (); i != m_bssBasicRateSet.end (); i++)
1305  {
1306  if (i->GetModulationClass () == WIFI_MOD_CLASS_ERP_OFDM)
1307  {
1308  continue;
1309  }
1310  size++;
1311  }
1312  return size;
1313 }
1314 
1315 WifiMode
1317 {
1319  uint32_t index = 0;
1320  bool found = false;
1321  for (WifiModeListIterator j = m_bssBasicRateSet.begin (); j != m_bssBasicRateSet.end (); )
1322  {
1323  if (i == index)
1324  {
1325  found = true;
1326  }
1327  if (j->GetModulationClass () != WIFI_MOD_CLASS_ERP_OFDM)
1328  {
1329  if (found)
1330  {
1331  break;
1332  }
1333  }
1334  index++;
1335  j++;
1336  }
1337  return m_bssBasicRateSet[index];
1338 }
1339 
1340 void
1342 {
1343  NS_LOG_FUNCTION (this << +mcs.GetMcsValue ());
1344  for (uint8_t i = 0; i < GetNBasicMcs (); i++)
1345  {
1346  if (GetBasicMcs (i) == mcs)
1347  {
1348  return;
1349  }
1350  }
1351  m_bssBasicMcsSet.push_back (mcs);
1352 }
1353 
1354 uint8_t
1356 {
1357  return static_cast<uint8_t> (m_bssBasicMcsSet.size ());
1358 }
1359 
1360 WifiMode
1362 {
1363  NS_ASSERT (i < GetNBasicMcs ());
1364  return m_bssBasicMcsSet[i];
1365 }
1366 
1367 WifiMode
1369 {
1370  if (m_nonUnicastMode == WifiMode ())
1371  {
1372  if (GetNBasicModes () > 0)
1373  {
1374  return GetBasicMode (0);
1375  }
1376  else
1377  {
1378  return GetDefaultMode ();
1379  }
1380  }
1381  else
1382  {
1383  return m_nonUnicastMode;
1384  }
1385 }
1386 
1387 bool
1389  uint32_t size, bool normally)
1390 {
1391  return normally;
1392 }
1393 
1394 bool
1396  Ptr<const Packet> packet, bool normally)
1397 {
1398  return normally;
1399 }
1400 
1401 bool
1403  Ptr<const Packet> packet, bool normally)
1404 {
1405  return normally;
1406 }
1407 
1408 void
1409 WifiRemoteStationManager::DoReportAmpduTxStatus (WifiRemoteStation *station, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
1410 {
1411  NS_LOG_DEBUG ("DoReportAmpduTxStatus received but the manager does not handle A-MPDUs!");
1412 }
1413 
1414 WifiMode
1416 {
1417  NS_ASSERT (i < GetNSupported (station));
1418  return station->m_state->m_operationalRateSet[i];
1419 }
1420 
1421 WifiMode
1423 {
1424  NS_ASSERT (i < GetNMcsSupported (station));
1425  return station->m_state->m_operationalMcsSet[i];
1426 }
1427 
1428 WifiMode
1430 {
1431  NS_ASSERT (i < GetNNonErpSupported (station));
1432  //IEEE 802.11g standard defines that if the protection mechanism is enabled, RTS, CTS and CTS-To-Self
1433  //frames should select a rate in the BSSBasicRateSet that corresponds to an 802.11b basic rate.
1434  //This is a implemented here to avoid changes in every RAA, but should maybe be moved in case it breaks standard rules.
1435  uint32_t index = 0;
1436  bool found = false;
1437  for (WifiModeListIterator j = station->m_state->m_operationalRateSet.begin (); j != station->m_state->m_operationalRateSet.end (); )
1438  {
1439  if (i == index)
1440  {
1441  found = true;
1442  }
1443  if (j->GetModulationClass () != WIFI_MOD_CLASS_ERP_OFDM)
1444  {
1445  if (found)
1446  {
1447  break;
1448  }
1449  }
1450  index++;
1451  j++;
1452  }
1453  return station->m_state->m_operationalRateSet[index];
1454 }
1455 
1458 {
1459  return station->m_state->m_address;
1460 }
1461 
1462 uint16_t
1464 {
1465  return station->m_state->m_channelWidth;
1466 }
1467 
1468 bool
1470 {
1471  Ptr<const HtCapabilities> htCapabilities = station->m_state->m_htCapabilities;
1472 
1473  if (!htCapabilities)
1474  {
1475  return false;
1476  }
1477  return htCapabilities->GetShortGuardInterval20 ();
1478 }
1479 
1480 uint16_t
1482 {
1483  return station->m_state->m_guardInterval;
1484 }
1485 
1486 bool
1488 {
1489  Ptr<const HtCapabilities> htCapabilities = station->m_state->m_htCapabilities;
1490 
1491  if (!htCapabilities)
1492  {
1493  return false;
1494  }
1495  return htCapabilities->GetGreenfield ();
1496 }
1497 
1498 bool
1500 {
1501  return station->m_state->m_aggregation;
1502 }
1503 
1504 uint8_t
1506 {
1507  Ptr<const HtCapabilities> htCapabilities = station->m_state->m_htCapabilities;
1508 
1509  if (!htCapabilities)
1510  {
1511  return 1;
1512  }
1513  return htCapabilities->GetRxHighestSupportedAntennas ();
1514 }
1515 
1516 uint8_t
1518 {
1519  return station->m_state->m_ness;
1520 }
1521 
1524 {
1525  return m_wifiPhy;
1526 }
1527 
1530 {
1531  return m_wifiMac;
1532 }
1533 
1534 uint8_t
1536 {
1537  return static_cast<uint8_t> (station->m_state->m_operationalRateSet.size ());
1538 }
1539 
1540 bool
1542 {
1543  return station->m_state->m_qosSupported;
1544 }
1545 
1546 bool
1548 {
1549  return (station->m_state->m_htCapabilities != 0);
1550 }
1551 
1552 bool
1554 {
1555  return (station->m_state->m_vhtCapabilities != 0);
1556 }
1557 
1558 bool
1560 {
1561  return (station->m_state->m_heCapabilities != 0);
1562 }
1563 
1564 uint8_t
1566 {
1567  return static_cast<uint8_t> (station->m_state->m_operationalMcsSet.size ());
1568 }
1569 
1570 uint32_t
1572 {
1573  uint32_t size = 0;
1574  for (WifiModeListIterator i = station->m_state->m_operationalRateSet.begin (); i != station->m_state->m_operationalRateSet.end (); i++)
1575  {
1576  if (i->GetModulationClass () == WIFI_MOD_CLASS_ERP_OFDM)
1577  {
1578  continue;
1579  }
1580  size++;
1581  }
1582  return size;
1583 }
1584 
1585 uint16_t
1587 {
1589 }
1590 
1591 bool
1593 {
1595 
1596  if (!htCapabilities)
1597  {
1598  return false;
1599  }
1600  return htCapabilities->GetShortGuardInterval20 ();
1601 }
1602 
1603 uint8_t
1605 {
1607 
1608  if (!htCapabilities)
1609  {
1610  return 1;
1611  }
1612  return htCapabilities->GetRxHighestSupportedAntennas ();
1613 }
1614 
1615 uint8_t
1617 {
1618  return static_cast<uint8_t> (LookupState (address)->m_operationalMcsSet.size ());
1619 }
1620 
1621 bool
1623 {
1624  return (LookupState (address)->m_htCapabilities != 0);
1625 }
1626 
1627 bool
1629 {
1630  return (LookupState (address)->m_vhtCapabilities != 0);
1631 }
1632 
1633 bool
1635 {
1636  return (LookupState (address)->m_heCapabilities != 0);
1637 }
1638 
1639 void
1641 {
1642  m_defaultTxPowerLevel = txPower;
1643 }
1644 
1645 uint8_t
1647 {
1648  return m_wifiPhy->GetNumberOfAntennas ();
1649 }
1650 
1651 uint8_t
1653 {
1655 }
1656 
1657 bool
1659 {
1661 }
1662 
1663 } //namespace ns3
std::array< uint32_t, AC_BE_NQOS > m_ssrc
short retry count per AC
uint8_t GetNMcsSupported(Mac48Address address) const
Return the number of MCS supported by the station.
bool m_useNonHtProtection
flag if protection for non-HT stations against HT transmissions is enabled
bool GetRifsPermitted(void) const
Return whether the device can use RIFS.
bool m_shortPreamble
Flag if short PHY preamble is supported by the remote station.
uint8_t GetChannelWidthSet(void) const
Get channel width set.
void AddSupportedMcs(Mac48Address address, WifiMode mcs)
Record the MCS index supported by the station.
uint32_t GetNFragments(const WifiMacHeader *header, Ptr< const Packet > packet)
Return the number of fragments needed for the given packet.
Ptr< WifiMac > GetMac(void) const
Return the WifiMac.
void SetDefaultTxPowerLevel(uint8_t txPower)
Set the default transmission power level.
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 "...
uint8_t GetNSupported(const WifiRemoteStation *station) const
Return the number of modes supported by the given station.
ERP-OFDM PHY (19.5)
Definition: wifi-mode.h:54
Ptr< HeConfiguration > GetHeConfiguration(void) const
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
uint32_t m_rtsCtsThreshold
Threshold for RTS/CTS.
bool m_shortSlotTimeEnabled
flag if short slot time is enabled
enum ns3::WifiRemoteStationState::@77 m_state
State of the station.
WifiMode GetMcs(uint8_t mcs) const
The WifiPhy::GetMcs() method is used (e.g., by a WifiRemoteStationManager) to determine the set of tr...
Definition: wifi-phy.cc:3994
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:45
void SetChannelWidth(uint16_t channelWidth)
Sets the selected channelWidth (in MHz)
bool GetShortPreambleSupported(Mac48Address address) const
Return whether the station supports short PHY preamble or not.
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Definition: packet.h:852
void ReportFinalDataFailed(Mac48Address address, const WifiMacHeader *header, uint32_t packetSize)
Should be invoked after calling ReportDataFailed if NeedRetransmission returns false.
void AddAllSupportedMcs(Mac48Address address)
Invoked in a STA or AP to store all of the MCS supported by a destination which is also supported loc...
std::array< uint32_t, AC_BE_NQOS > m_slrc
long retry count per AC
void RecordWaitAssocTxOk(Mac48Address address)
Records that we are waiting for an ACK for the association response we sent.
virtual void DoReportRtsFailed(WifiRemoteStation *station)=0
This method is a pure virtual method that must be implemented by the sub-class.
static const uint32_t packetSize
WifiMode m_nonUnicastMode
Transmission mode for non-unicast Data frames.
void SetBssColor(uint8_t color)
Set the BSS color.
uint32_t m_nextFragmentationThreshold
Threshold for fragmentation that will be used for the next transmission.
bool Is2_4Ghz(double frequency)
Definition: wifi-utils.cc:59
void AddStationVhtCapabilities(Mac48Address from, VhtCapabilities vhtCapabilities)
Records VHT capabilities of the remote station.
uint32_t GetSize(void) const
Return the size of the WifiMacHeader in octets.
Mac48Address GetAddr1(void) const
Return the address in the Address 1 field.
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
Ptr< const HeCapabilities > m_heCapabilities
remote station HE capabilities
static const uint16_t WIFI_MAC_FCS_LENGTH
The length in octects of the IEEE 802.11 MAC FCS field.
WifiMode GetDefaultMcs(void) const
Return the default Modulation and Coding Scheme (MCS) index.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
uint32_t m_fragmentationThreshold
Current threshold for fragmentation.
The HT Capabilities Information ElementThis class knows how to serialise and deserialise the HT Capab...
uint8_t m_defaultTxPowerLevel
Default transmission power level.
void SetStbc(bool stbc)
Sets if STBC is being used.
void AddSupportedPhyPreamble(Mac48Address address, bool isShortPreambleSupported)
Record whether the short PHY preamble is supported by the station.
WifiMode GetNonUnicastMode(void) const
Return a mode for non-unicast packets.
WifiMode GetBasicMcs(uint8_t i) const
Return the MCS at the given list index.
Mac48Address m_address
Mac48Address of the remote station.
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:162
void UpdateFragmentationThreshold(void)
Typically called to update the fragmentation threshold at the start of a new transmission.
bool Is5Ghz(double frequency)
Definition: wifi-utils.cc:65
void SetPcfSupported(bool enable)
Enable or disable PCF capability support.
bool GetUseNonHtProtection(void) const
Return whether the device supports protection of non-HT stations.
bool IsLastFragment(Mac48Address address, const WifiMacHeader *header, Ptr< const Packet > packet, uint32_t fragmentNumber)
VHT PHY (Clause 22)
Definition: wifi-mode.h:60
void ReportDataOk(Mac48Address address, const WifiMacHeader *header, double ackSnr, WifiMode ackMode, double dataSnr, WifiTxVector dataTxVector, uint32_t packetSize)
Should be invoked whenever we receive the ACK associated to a data packet we just sent...
TracedCallback< Mac48Address > m_macTxFinalRtsFailed
The trace source fired when the transmission of a RTS has exceeded the maximum number of attempts...
uint32_t GetFragmentationThreshold(void) const
Return the fragmentation threshold.
WifiPreamble GetPreambleForTransmission(WifiModulationClass modulation, bool useShortPreamble, bool useGreenfield)
Return the preamble to be used for the transmission.
Definition: wifi-utils.cc:128
bool GetUseGreenfieldProtection(void) const
Return whether protection for stations that do not support HT Greenfield format is enabled...
WifiMode GetSupported(const WifiRemoteStation *station, uint8_t i) const
Return whether mode associated with the specified station at the specified index. ...
uint8_t GetNBasicMcs(void) const
Return the number of basic MCS index.
Ptr< const AttributeChecker > MakeWifiModeChecker(void)
Definition: wifi-mode.cc:650
uint32_t GetNNonErpSupported(const WifiRemoteStation *station) const
Return the number of non-ERP modes supported by the given station.
represent a single transmission modeA WifiMode is implemented by a single integer which is used to lo...
Definition: wifi-mode.h:97
bool m_shortPreambleEnabled
flag if short PHY preamble is enabled
uint8_t GetSupportedChannelWidth(void) const
Return the supported channel width.
TID independent remote station statistics.
WifiRemoteStationState * m_state
Remote station state.
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
bool IsMandatory(void) const
Definition: wifi-mode.cc:434
void RecordDisassociated(Mac48Address address)
Records that the STA was disassociated.
phy
Definition: third.py:93
TracedCallback< Mac48Address > m_macTxFinalDataFailed
The trace source fired when the transmission of a data packet has exceeded the maximum number of atte...
uint16_t GetChannelWidth(void) const
Definition: wifi-phy.cc:1392
void SetShortSlotTimeEnabled(bool enable)
Enable or disable short slot time.
WifiTxVector GetDataTxVector(const WifiMacHeader &header)
uint8_t GetNMcs(void) const
The WifiPhy::GetNMcs() method is used (e.g., by a WifiRemoteStationManager) to determine the set of t...
Definition: wifi-phy.cc:3988
WifiPreamble
The type of preamble to be used by an IEEE 802.11 transmission.
Definition: wifi-preamble.h:32
uint8_t GetNumberOfSupportedStreams(Mac48Address address) const
Return the number of spatial streams supported by the station.
bool GetShortPreambleEnabled(void) const
Return whether the device uses short PHY preambles.
bool GetGreenfield(const WifiRemoteStation *station) const
Return whether the station supports Greenfield or not.
ProtectionMode m_htProtectionMode
Protection mode for HT stations when non-HT stations are detected.
void SetRtsCtsThreshold(uint32_t threshold)
Sets the RTS threshold.
bool m_qosSupported
Flag if QoS is supported by the station.
Hold variables of type enum.
Definition: enum.h:54
WifiRemoteStationState * LookupState(Mac48Address address) const
Return the state of the station associated with the given address.
WifiMode m_defaultTxMcs
The default transmission modulation-coding scheme (MCS)
bool IsSupportedMcs(uint8_t mcs) const
Return the is MCS supported flag.
virtual void DoReportRtsOk(WifiRemoteStation *station, double ctsSnr, WifiMode ctsMode, double rtsSnr)=0
This method is a pure virtual method that must be implemented by the sub-class.
Ptr< WifiPhy > m_wifiPhy
This is a pointer to the WifiPhy associated with this WifiRemoteStationManager that is set on call to...
virtual void DoReportRxOk(WifiRemoteStation *station, double rxSnr, WifiMode txMode)=0
This method is a pure virtual method that must be implemented by the sub-class.
void ReportRtsFailed(Mac48Address address, const WifiMacHeader *header)
Should be invoked whenever the RtsTimeout associated to a transmission attempt expires.
bool GetPcfSupported(void) const
Return whether the device has PCF capability support enabled.
bool GetShortSlotTimeSupported(Mac48Address address) const
Return whether the station supports short ERP slot time or not.
The IEEE 802.11ac VHT Capabilities.
void SetGuardInterval(uint16_t guardInterval)
Sets the guard interval duration (in nanoseconds)
void AddStationHtCapabilities(Mac48Address from, HtCapabilities htCapabilities)
Records HT capabilities of the remote station.
bool m_useNonErpProtection
flag if protection for non-ERP stations against ERP transmissions is enabled
Hold an unsigned integer type.
Definition: uinteger.h:44
virtual void DoReportDataFailed(WifiRemoteStation *station)=0
This method is a pure virtual method that must be implemented by the sub-class.
uint8_t GetSupportedChannelWidthSet() const
Get the supported channel width set.
Ptr< const AttributeAccessor > MakeEnumAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Definition: enum.h:225
void ReportRxOk(Mac48Address address, double rxSnr, WifiMode txMode)
void RecordGotAssocTxFailed(Mac48Address address)
Records that we missed an ACK for the association response we sent.
bool GetHtSupported(void) const
Return whether the device has HT capability support enabled.
mac
Definition: third.py:99
uint16_t ConvertGuardIntervalToNanoSeconds(WifiMode mode, const Ptr< WifiNetDevice > device)
Convert the guard interval to nanoseconds based on the WifiMode.
Definition: wifi-utils.cc:71
WifiRemoteStationInfo GetInfo(Mac48Address address)
AcIndex QosUtilsMapTidToAc(uint8_t tid)
Maps TID (Traffic ID) to Access classes.
Definition: qos-utils.cc:32
uint8_t GetQosTid(void) const
Return the Traffic ID of a QoS header.
void SetMaxSsrc(uint32_t maxSsrc)
Sets the maximum STA short retry count (SSRC).
void AddStationHeCapabilities(Mac48Address from, HeCapabilities heCapabilities)
Records HE capabilities of the remote station.
WifiMode GetMode(void) const
HT PHY (Clause 20)
Definition: wifi-mode.h:58
uint32_t m_maxSlrc
Maximum STA long retry count (SLRC)
bool m_pcfSupported
Flag if PCF capability is supported.
Ptr< const HeCapabilities > GetStationHeCapabilities(Mac48Address from)
Return the HE capabilities sent by the remote station.
bool NeedRetransmission(Mac48Address address, const WifiMacHeader *header, Ptr< const Packet > packet)
Ptr< WifiMac > m_wifiMac
This is a pointer to the WifiMac associated with this WifiRemoteStationManager that is set on call to...
Ptr< const VhtCapabilities > m_vhtCapabilities
remote station VHT capabilities
uint32_t GetNNonErpBasicModes(void) const
Return the number of non-ERP basic modes we support.
WifiTxVector GetCtsToSelfTxVector(void)
Since CTS-to-self parameters are not dependent on the station, it is implemented in wifi remote stati...
Ptr< const HtCapabilities > m_htCapabilities
remote station HT capabilities
bool IsSupportedMcs(uint8_t mcs, uint8_t nss) const
Get the is MCS supported.
WifiMode GetNonErpBasicMode(uint8_t i) const
Return a basic mode from the set of basic modes that is not an ERP mode.
bool IsAssociated(Mac48Address address) const
Return whether the station associated.
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...
hold a list of per-remote-station state.
WifiModulationClass GetModulationClass() const
Definition: wifi-mode.cc:463
bool GetQosSupported(Mac48Address address) const
Return whether the given station is QoS capable.
Ptr< const HtCapabilities > GetStationHtCapabilities(Mac48Address from)
Return the HT capabilities sent by the remote station.
bool NeedRts(const WifiMacHeader &header, uint32_t size)
WifiMode GetDefaultMode(void) const
Return the default transmission mode.
void SetQosSupport(Mac48Address from, bool qosSupported)
Records QoS support of the remote station.
WifiMode m_defaultTxMode
The default transmission mode.
void SetNss(uint8_t nss)
Sets the number of Nss refer to IEEE 802.11n Table 20-28 for explanation and range.
WifiModeList m_bssBasicRateSet
This member is the list of WifiMode objects that comprise the BSSBasicRateSet parameter.
uint64_t Get(void) const
Definition: uinteger.cc:35
uint32_t GetFragmentOffset(Mac48Address address, const WifiMacHeader *header, Ptr< const Packet > packet, uint32_t fragmentNumber)
bool GetShortSlotTimeEnabled(void) const
Return whether the device uses short slot time.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
address
Definition: first.py:44
uint16_t GetFrequency(void) const
Definition: wifi-phy.cc:1372
void SetPreambleType(WifiPreamble preamble)
Sets the preamble type.
uint8_t GetNumberOfAntennas(void) const
Definition: wifi-phy.cc:1406
void AddSupportedMode(Mac48Address address, WifiMode mode)
Invoked in a STA or AP to store the set of modes supported by a destination which is also supported l...
WifiModeList m_operationalRateSet
This member is the list of WifiMode objects that comprise the OperationalRateSet parameter for this r...
uint32_t GetFragmentSize(Mac48Address address, const WifiMacHeader *header, Ptr< const Packet > packet, uint32_t fragmentNumber)
void DoSetFragmentationThreshold(uint32_t threshold)
Actually sets the fragmentation threshold, it also checks the validity of the given threshold...
void AddBasicMode(WifiMode mode)
Invoked in a STA upon association to store the set of rates which belong to the BSSBasicRateSet of th...
uint16_t GetChannelWidthForTransmission(WifiMode mode, uint16_t maxSupportedChannelWidth)
Return the channel width that corresponds to the selected mode (instead of letting the PHY&#39;s default ...
Definition: wifi-utils.cc:109
void SetUseNonErpProtection(bool enable)
Enable or disable protection for non-ERP stations.
WifiModeList::const_iterator WifiModeListIterator
An iterator for WifiModeList vector.
Definition: wifi-mode.h:287
bool UseGreenfieldForDestination(Mac48Address dest) const
bool m_useGreenfieldProtection
flag if protection for stations that do not support HT Greenfield format is enabled ...
bool m_aggregation
Flag if MPDU aggregation is used by the remote station.
an EUI-48 address
Definition: mac48-address.h:43
TracedCallback< Mac48Address > m_macTxRtsFailed
The trace source fired when the transmission of a single RTS has failed.
virtual void DoReportDataOk(WifiRemoteStation *station, double ackSnr, WifiMode ackMode, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)=0
This method is a pure virtual method that must be implemented by the sub-class.
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 SetTxPowerLevel(uint8_t powerlevel)
Sets the selected transmission power level.
Ptr< const AttributeAccessor > MakeWifiModeAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Definition: wifi-mode.h:275
void SetNTx(uint8_t nTx)
Sets the number of TX antennas.
bool GetShortGuardIntervalSupported(void) const
Return whether the device has SGI support enabled.
Stations m_stations
Information for each known stations.
void ReportRtsOk(Mac48Address address, const WifiMacHeader *header, double ctsSnr, WifiMode ctsMode, double rtsSnr)
Should be invoked whenever we receive the CTS associated to an RTS we just sent.
TracedCallback< Mac48Address > m_macTxDataFailed
The trace source fired when the transmission of a single data packet has failed.
bool GetAggregation(const WifiRemoteStation *station) const
Return whether the given station supports A-MPDU.
uint16_t m_channelWidth
Channel width (in MHz) supported by the remote station.
virtual bool DoNeedRetransmission(WifiRemoteStation *station, Ptr< const Packet > packet, bool normally)
uint8_t GetHighestMcsSupported(void) const
Get highest MCS supported.
void AddBasicMcs(WifiMode mcs)
Add a given Modulation and Coding Scheme (MCS) index to the set of basic MCS.
void SetMode(WifiMode mode)
Sets the selected payload transmission mode.
uint8_t GetNModes(void) const
The WifiPhy::GetNModes() and WifiPhy::GetMode() methods are used (e.g., by a WifiRemoteStationManager...
Definition: wifi-phy.cc:3976
virtual bool DoNeedFragmentation(WifiRemoteStation *station, Ptr< const Packet > packet, bool normally)
bool NeedCtsToSelf(WifiTxVector txVector)
Return if we need to do CTS-to-self before sending a DATA.
uint8_t GetNBasicModes(void) const
Return the number of basic modes we support.
uint8_t GetHeLtfAndGiForHePpdus(void) const
Get HE LTF and GI for HE PDPUs.
void SetUseNonHtProtection(bool enable)
Enable or disable protection for non-HT stations.
Ptr< const AttributeChecker > MakeEnumChecker(int v1, std::string n1, int v2, std::string n2, int v3, std::string n3, int v4, std::string n4, int v5, std::string n5, int v6, std::string n6, int v7, std::string n7, int v8, std::string n8, int v9, std::string n9, int v10, std::string n10, int v11, std::string n11, int v12, std::string n12, int v13, std::string n13, int v14, std::string n14, int v15, std::string n15, int v16, std::string n16, int v17, std::string n17, int v18, std::string n18, int v19, std::string n19, int v20, std::string n20, int v21, std::string n21, int v22, std::string n22)
Make an EnumChecker pre-configured with a set of allowed values by name.
Definition: enum.cc:180
WifiMode GetMode(uint8_t mode) const
The WifiPhy::GetNModes() and WifiPhy::GetMode() methods are used (e.g., by a WifiRemoteStationManager...
Definition: wifi-phy.cc:3982
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...
void SetMaxSlrc(uint32_t maxSlrc)
Sets the maximum STA long retry count (SLRC).
Ptr< WifiPhy > GetPhy(void) const
Return the WifiPhy.
void ReportDataFailed(Mac48Address address, const WifiMacHeader *header, uint32_t packetSize)
Should be invoked whenever the AckTimeout associated to a transmission attempt expires.
uint16_t GetGuardInterval(void) const
Return the supported HE guard interval duration (in nanoseconds).
bool IsMgt(void) const
Return true if the Type is Management.
A struct that holds information about each remote station.
WifiModeList m_operationalMcsSet
operational MCS set
static TypeId GetTypeId(void)
Get the type ID.
void AddSupportedErpSlotTime(Mac48Address address, bool isShortSlotTimeSupported)
Record whether the short ERP slot time is supported by the station.
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
Definition: log.h:265
void SetFragmentationThreshold(uint32_t threshold)
Sets a fragmentation threshold.
void Reset(void)
Reset the station, invoked in a STA upon dis-association or in an AP upon reboot. ...
bool GetUseNonErpProtection(void) const
Return whether the device supports protection of non-ERP stations.
uint32_t m_maxSsrc
Maximum STA short retry count (SSRC)
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:273
virtual void DoDispose(void)
Destructor implementation.
Ptr< const VhtCapabilities > GetStationVhtCapabilities(Mac48Address from)
Return the VHT capabilities sent by the remote station.
bool GetGreenfieldSupported(void) const
Return whether the device has HT Greenfield support enabled.
WifiTxVector GetRtsTxVector(Mac48Address address)
void SetUseGreenfieldProtection(bool enable)
Enable or disable protection for stations that do not support HT Greenfield format.
bool NeedFragmentation(Mac48Address address, const WifiMacHeader *header, Ptr< const Packet > packet)
void SetNess(uint8_t ness)
Sets the Ness number refer to IEEE 802.11n Table 20-6 for explanation.
virtual void DoReportAmpduTxStatus(WifiRemoteStation *station, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus, double rxSnr, double dataSnr, uint16_t dataChannelWidth, uint8_t dataNss)
Typically called per A-MPDU, either when a Block ACK was successfully received or when a BlockAckTime...
Ptr< NetDevice > GetDevice(void) const
Return the device this PHY is associated with.
Definition: wifi-phy.cc:746
bool IsQosData(void) const
Return true if the Type is DATA and Subtype is one of the possible values for QoS Data...
uint8_t m_ness
Number of extended spatial streams of the remote station.
uint16_t GetChannelWidth(void) const
bool m_shortSlotTime
Flag if short ERP slot time is supported by the remote station.
A base class which provides memory management and object aggregation.
Definition: object.h:87
AttributeValue implementation for WifiMode.
Definition: wifi-mode.h:275
StationStates m_states
States of known stations.
bool IsWaitAssocTxOk(Mac48Address address) const
Return whether we are waiting for an ACK for the association response we sent.
void SetShortPreambleEnabled(bool enable)
Enable or disable short PHY preambles.
virtual bool DoNeedRts(WifiRemoteStation *station, uint32_t size, bool normally)
ProtectionMode m_erpProtectionMode
Protection mode for ERP stations when non-ERP stations are detected.
WifiMode GetBasicMode(uint8_t i) const
Return a basic mode from the set of basic modes.
void AddAllSupportedModes(Mac48Address address)
Invoked in a STA or AP to store all of the modes supported by a destination which is also supported l...
virtual WifiTxVector DoGetDataTxVector(WifiRemoteStation *station)=0
Ptr< VhtConfiguration > GetVhtConfiguration(void) const
The IEEE 802.11ax HE Capabilities.
uint8_t GetMcsValue(void) const
Definition: wifi-mode.cc:441
Ptr< HtConfiguration > GetHtConfiguration(void) const
virtual void DoReportFinalDataFailed(WifiRemoteStation *station)=0
This method is a pure virtual method that must be implemented by the sub-class.
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
virtual WifiTxVector DoGetRtsTxVector(WifiRemoteStation *station)=0
bool IsBrandNew(Mac48Address address) const
Return whether the station state is brand new.
uint8_t GetMaxSupportedTxSpatialStreams(void) const
Definition: wifi-phy.cc:1425
a unique identifier for an interface.
Definition: type-id.h:58
bool m_rifsPermitted
flag if RIFS is enabled
void ReportFinalRtsFailed(Mac48Address address, const WifiMacHeader *header)
Should be invoked after calling ReportRtsFailed if NeedRetransmission returns false.
WifiRemoteStation * Lookup(Mac48Address address) const
Return the station associated with the given address.
void RemoveAllSupportedMcs(Mac48Address address)
Invoked in a STA or AP to delete all of the supported MCS by a destination.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:923
AcIndex
This enumeration defines the Access Categories as an enumeration with values corresponding to the AC ...
Definition: qos-utils.h:38
WifiRemoteStationInfo m_info
remote station info
WifiModeList m_bssBasicMcsSet
basic MCS set
virtual void DoReportFinalRtsFailed(WifiRemoteStation *station)=0
This method is a pure virtual method that must be implemented by the sub-class.
HE PHY (Clause 26)
Definition: wifi-mode.h:62
hold per-remote-station state.
void SetRifsPermitted(bool allow)
Permit or prohibit RIFS.
virtual WifiRemoteStation * DoCreateStation(void) const =0
void RecordGotAssocTxOk(Mac48Address address)
Records that we got an ACK for the association response we sent.
uint8_t GetHighestNssSupported(void) const
Get highest NSS supported.
Implements the IEEE 802.11 MAC header.
WifiMode GetMcsSupported(const WifiRemoteStation *station, uint8_t i) const
Return the WifiMode supported by the specified station at the specified index.
uint16_t GetChannelWidthSupported(Mac48Address address) const
Return the channel width supported by the station.
uint8_t GetNss(void) const
uint16_t GetChannelWidth(const WifiRemoteStation *station) const
Return the channel width supported by the station.
uint8_t GetNess(const WifiRemoteStation *station) const
void ReportAmpduTxStatus(Mac48Address address, uint8_t nSuccessfulMpdus, uint8_t nFailedMpdus, double rxSnr, double dataSnr, WifiTxVector dataTxVector)
Typically called per A-MPDU, either when a Block ACK was successfully received or when a BlockAckTime...
uint16_t m_guardInterval
HE Guard interval duration (in nanoseconds) supported by the remote station.
uint32_t DoGetFragmentationThreshold(void) const
Return the current fragmentation threshold.