A Discrete-Event Network Simulator
API
wifi-mac.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2008 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/pointer.h"
23 #include "ns3/packet.h"
24 #include "wifi-mac.h"
25 #include "qos-txop.h"
26 #include "ssid.h"
27 #include "mgt-headers.h"
28 #include "wifi-net-device.h"
29 #include "wifi-mac-queue.h"
30 #include "mac-rx-middle.h"
31 #include "mac-tx-middle.h"
32 #include "channel-access-manager.h"
33 #include "ns3/ht-configuration.h"
34 #include "ns3/vht-configuration.h"
35 #include "ns3/he-configuration.h"
36 #include "ns3/he-frame-exchange-manager.h"
37 #include "extended-capabilities.h"
38 
39 namespace ns3 {
40 
41 NS_LOG_COMPONENT_DEFINE ("WifiMac");
42 
44 
46  : m_qosSupported (false),
47  m_erpSupported (false),
48  m_dsssSupported (false)
49 {
50  NS_LOG_FUNCTION (this);
51 
52  m_rxMiddle = Create<MacRxMiddle> ();
53  m_rxMiddle->SetForwardCallback (MakeCallback (&WifiMac::Receive, this));
54 
55  m_txMiddle = Create<MacTxMiddle> ();
56 
57  m_channelAccessManager = CreateObject<ChannelAccessManager> ();
58 }
59 
61 {
62  NS_LOG_FUNCTION (this);
63 }
64 
65 TypeId
67 {
68  static TypeId tid = TypeId ("ns3::WifiMac")
69  .SetParent<Object> ()
70  .SetGroupName ("Wifi")
71  .AddAttribute ("Ssid", "The ssid we want to belong to.",
72  SsidValue (Ssid ("default")),
75  MakeSsidChecker ())
76  .AddAttribute ("QosSupported",
77  "This Boolean attribute is set to enable 802.11e/WMM-style QoS support at this STA.",
78  TypeId::ATTR_GET | TypeId::ATTR_CONSTRUCT, // prevent setting after construction
79  BooleanValue (false),
83  .AddAttribute ("CtsToSelfSupported",
84  "Use CTS to Self when using a rate that is not in the basic rate set.",
85  BooleanValue (false),
88  .AddAttribute ("ShortSlotTimeSupported",
89  "Whether or not short slot time is supported (only used by ERP APs or STAs).",
90  BooleanValue (true),
94  .AddAttribute ("Txop",
95  "The Txop object.",
96  PointerValue (),
98  MakePointerChecker<Txop> ())
99  .AddAttribute ("VO_Txop",
100  "Queue that manages packets belonging to AC_VO access class.",
101  PointerValue (),
103  MakePointerChecker<QosTxop> ())
104  .AddAttribute ("VI_Txop",
105  "Queue that manages packets belonging to AC_VI access class.",
106  PointerValue (),
108  MakePointerChecker<QosTxop> ())
109  .AddAttribute ("BE_Txop",
110  "Queue that manages packets belonging to AC_BE access class.",
111  PointerValue (),
113  MakePointerChecker<QosTxop> ())
114  .AddAttribute ("BK_Txop",
115  "Queue that manages packets belonging to AC_BK access class.",
116  PointerValue (),
118  MakePointerChecker<QosTxop> ())
119  .AddAttribute ("VO_MaxAmsduSize",
120  "Maximum length in bytes of an A-MSDU for AC_VO access class "
121  "(capped to 7935 for HT PPDUs and 11398 for VHT/HE PPDUs). "
122  "Value 0 means A-MSDU aggregation is disabled for that AC.",
123  UintegerValue (0),
125  MakeUintegerChecker<uint16_t> (0, 11398))
126  .AddAttribute ("VI_MaxAmsduSize",
127  "Maximum length in bytes of an A-MSDU for AC_VI access class "
128  "(capped to 7935 for HT PPDUs and 11398 for VHT/HE PPDUs). "
129  "Value 0 means A-MSDU aggregation is disabled for that AC.",
130  UintegerValue (0),
132  MakeUintegerChecker<uint16_t> (0, 11398))
133  .AddAttribute ("BE_MaxAmsduSize",
134  "Maximum length in bytes of an A-MSDU for AC_BE access class "
135  "(capped to 7935 for HT PPDUs and 11398 for VHT/HE PPDUs). "
136  "Value 0 means A-MSDU aggregation is disabled for that AC.",
137  UintegerValue (0),
139  MakeUintegerChecker<uint16_t> (0, 11398))
140  .AddAttribute ("BK_MaxAmsduSize",
141  "Maximum length in bytes of an A-MSDU for AC_BK access class "
142  "(capped to 7935 for HT PPDUs and 11398 for VHT/HE PPDUs). "
143  "Value 0 means A-MSDU aggregation is disabled for that AC.",
144  UintegerValue (0),
146  MakeUintegerChecker<uint16_t> (0, 11398))
147  .AddAttribute ("VO_MaxAmpduSize",
148  "Maximum length in bytes of an A-MPDU for AC_VO access class "
149  "(capped to 65535 for HT PPDUs, 1048575 for VHT PPDUs, and 6500631 for HE PPDUs). "
150  "Value 0 means A-MPDU aggregation is disabled for that AC.",
151  UintegerValue (0),
153  MakeUintegerChecker<uint32_t> (0, 6500631))
154  .AddAttribute ("VI_MaxAmpduSize",
155  "Maximum length in bytes of an A-MPDU for AC_VI access class "
156  "(capped to 65535 for HT PPDUs, 1048575 for VHT PPDUs, and 6500631 for HE PPDUs). "
157  "Value 0 means A-MPDU aggregation is disabled for that AC.",
158  UintegerValue (65535),
160  MakeUintegerChecker<uint32_t> (0, 6500631))
161  .AddAttribute ("BE_MaxAmpduSize",
162  "Maximum length in bytes of an A-MPDU for AC_BE access class "
163  "(capped to 65535 for HT PPDUs, 1048575 for VHT PPDUs, and 6500631 for HE PPDUs). "
164  "Value 0 means A-MPDU aggregation is disabled for that AC.",
165  UintegerValue (65535),
167  MakeUintegerChecker<uint32_t> (0, 6500631))
168  .AddAttribute ("BK_MaxAmpduSize",
169  "Maximum length in bytes of an A-MPDU for AC_BK access class "
170  "(capped to 65535 for HT PPDUs, 1048575 for VHT PPDUs, and 6500631 for HE PPDUs). "
171  "Value 0 means A-MPDU aggregation is disabled for that AC.",
172  UintegerValue (0),
174  MakeUintegerChecker<uint32_t> (0, 6500631))
175  .AddAttribute ("VO_BlockAckThreshold",
176  "If number of packets in VO queue reaches this value, "
177  "block ack mechanism is used. If this value is 0, block ack is never used."
178  "When A-MPDU is enabled, block ack mechanism is used regardless of this value.",
179  UintegerValue (0),
181  MakeUintegerChecker<uint8_t> (0, 64))
182  .AddAttribute ("VI_BlockAckThreshold",
183  "If number of packets in VI queue reaches this value, "
184  "block ack mechanism is used. If this value is 0, block ack is never used."
185  "When A-MPDU is enabled, block ack mechanism is used regardless of this value.",
186  UintegerValue (0),
188  MakeUintegerChecker<uint8_t> (0, 64))
189  .AddAttribute ("BE_BlockAckThreshold",
190  "If number of packets in BE queue reaches this value, "
191  "block ack mechanism is used. If this value is 0, block ack is never used."
192  "When A-MPDU is enabled, block ack mechanism is used regardless of this value.",
193  UintegerValue (0),
195  MakeUintegerChecker<uint8_t> (0, 64))
196  .AddAttribute ("BK_BlockAckThreshold",
197  "If number of packets in BK queue reaches this value, "
198  "block ack mechanism is used. If this value is 0, block ack is never used."
199  "When A-MPDU is enabled, block ack mechanism is used regardless of this value.",
200  UintegerValue (0),
202  MakeUintegerChecker<uint8_t> (0, 64))
203  .AddAttribute ("VO_BlockAckInactivityTimeout",
204  "Represents max time (blocks of 1024 microseconds) allowed for block ack"
205  "inactivity for AC_VO. If this value isn't equal to 0 a timer start after that a"
206  "block ack setup is completed and will be reset every time that a block ack"
207  "frame is received. If this value is 0, block ack inactivity timeout won't be used.",
208  UintegerValue (0),
210  MakeUintegerChecker<uint16_t> ())
211  .AddAttribute ("VI_BlockAckInactivityTimeout",
212  "Represents max time (blocks of 1024 microseconds) allowed for block ack"
213  "inactivity for AC_VI. If this value isn't equal to 0 a timer start after that a"
214  "block ack setup is completed and will be reset every time that a block ack"
215  "frame is received. If this value is 0, block ack inactivity timeout won't be used.",
216  UintegerValue (0),
218  MakeUintegerChecker<uint16_t> ())
219  .AddAttribute ("BE_BlockAckInactivityTimeout",
220  "Represents max time (blocks of 1024 microseconds) allowed for block ack"
221  "inactivity for AC_BE. If this value isn't equal to 0 a timer start after that a"
222  "block ack setup is completed and will be reset every time that a block ack"
223  "frame is received. If this value is 0, block ack inactivity timeout won't be used.",
224  UintegerValue (0),
226  MakeUintegerChecker<uint16_t> ())
227  .AddAttribute ("BK_BlockAckInactivityTimeout",
228  "Represents max time (blocks of 1024 microseconds) allowed for block ack"
229  "inactivity for AC_BK. If this value isn't equal to 0 a timer start after that a"
230  "block ack setup is completed and will be reset every time that a block ack"
231  "frame is received. If this value is 0, block ack inactivity timeout won't be used.",
232  UintegerValue (0),
234  MakeUintegerChecker<uint16_t> ())
235  .AddTraceSource ("MacTx",
236  "A packet has been received from higher layers and is being processed in preparation for "
237  "queueing for transmission.",
239  "ns3::Packet::TracedCallback")
240  .AddTraceSource ("MacTxDrop",
241  "A packet has been dropped in the MAC layer before being queued for transmission. "
242  "This trace source is fired, e.g., when an AP's MAC receives from the upper layer "
243  "a packet destined to a station that is not associated with the AP or a STA's MAC "
244  "receives a packet from the upper layer while it is not associated with any AP.",
246  "ns3::Packet::TracedCallback")
247  .AddTraceSource ("MacPromiscRx",
248  "A packet has been received by this device, has been passed up from the physical layer "
249  "and is being forwarded up the local protocol stack. This is a promiscuous trace.",
251  "ns3::Packet::TracedCallback")
252  .AddTraceSource ("MacRx",
253  "A packet has been received by this device, has been passed up from the physical layer "
254  "and is being forwarded up the local protocol stack. This is a non-promiscuous trace.",
256  "ns3::Packet::TracedCallback")
257  .AddTraceSource ("MacRxDrop",
258  "A packet has been dropped in the MAC layer after it has been passed up from the physical layer.",
260  "ns3::Packet::TracedCallback")
261  .AddTraceSource ("TxOkHeader",
262  "The header of successfully transmitted packet.",
264  "ns3::WifiMacHeader::TracedCallback",
266  "Use the AckedMpdu trace instead.")
267  .AddTraceSource ("TxErrHeader",
268  "The header of unsuccessfully transmitted packet.",
270  "ns3::WifiMacHeader::TracedCallback",
272  "Depending on the failure type, use the NAckedMpdu trace, the "
273  "DroppedMpdu trace or one of the traces associated with TX timeouts.")
274  .AddTraceSource ("AckedMpdu",
275  "An MPDU that was successfully acknowledged, via either a "
276  "Normal Ack or a Block Ack.",
278  "ns3::WifiMacQueueItem::TracedCallback")
279  .AddTraceSource ("NAckedMpdu",
280  "An MPDU that was negatively acknowledged via a Block Ack.",
282  "ns3::WifiMacQueueItem::TracedCallback")
283  .AddTraceSource ("DroppedMpdu",
284  "An MPDU that was dropped for the given reason (see WifiMacDropReason).",
286  "ns3::WifiMac::DroppedMpduCallback")
287  .AddTraceSource ("MpduResponseTimeout",
288  "An MPDU whose response was not received before the timeout, along with "
289  "an identifier of the type of timeout (see WifiTxTimer::Reason) and the "
290  "TXVECTOR used to transmit the MPDU. This trace source is fired when a "
291  "CTS is missing after an RTS or a Normal Ack is missing after an MPDU "
292  "or after a DL MU PPDU acknowledged in SU format.",
294  "ns3::WifiMac::MpduResponseTimeoutCallback")
295  .AddTraceSource ("PsduResponseTimeout",
296  "A PSDU whose response was not received before the timeout, along with "
297  "an identifier of the type of timeout (see WifiTxTimer::Reason) and the "
298  "TXVECTOR used to transmit the PSDU. This trace source is fired when a "
299  "BlockAck is missing after an A-MPDU, a BlockAckReq (possibly in the "
300  "context of the acknowledgment of a DL MU PPDU in SU format) or a TB PPDU "
301  "(in the latter case the missing BlockAck is a Multi-STA BlockAck).",
303  "ns3::WifiMac::PsduResponseTimeoutCallback")
304  .AddTraceSource ("PsduMapResponseTimeout",
305  "A PSDU map for which not all the responses were received before the timeout, "
306  "along with an identifier of the type of timeout (see WifiTxTimer::Reason), "
307  "the set of MAC addresses of the stations that did not respond and the total "
308  "number of stations that had to respond. This trace source is fired when not "
309  "all the addressed stations responded to an MU-BAR Trigger frame (either sent as "
310  "a SU frame or aggregated to PSDUs in the DL MU PPDU), a Basic Trigger Frame or "
311  "a BSRP Trigger Frame.",
313  "ns3::WifiMac::PsduMapResponseTimeoutCallback")
314  ;
315  return tid;
316 }
317 
318 
319 void
321 {
322  NS_LOG_FUNCTION (this);
323 
324  if (m_txop != nullptr)
325  {
326  m_txop->Initialize ();
327  }
328 
329  for (auto it = m_edca.begin (); it != m_edca.end (); ++it)
330  {
331  it->second->Initialize ();
332  }
333 }
334 
335 void
337 {
338  NS_LOG_FUNCTION (this);
339 
340  m_rxMiddle = 0;
341  m_txMiddle = 0;
342 
343  m_channelAccessManager->Dispose ();
345 
346  if (m_txop != nullptr)
347  {
348  m_txop->Dispose ();
349  }
350  m_txop = 0;
351 
352  for (auto it = m_edca.begin (); it != m_edca.end (); ++it)
353  {
354  it->second->Dispose ();
355  it->second = 0;
356  }
357 
358  if (m_feManager != 0)
359  {
360  m_feManager->Dispose ();
361  }
362  m_feManager = 0;
363 
364  m_stationManager = 0;
365  m_phy = 0;
366 
367  m_device = 0;
368 }
369 
370 void
372 {
373  NS_LOG_FUNCTION (this << type);
374  m_typeOfStation = type;
375 }
376 
379 {
380  return m_typeOfStation;
381 }
382 
383 void
385 {
386  m_device = device;
387 }
388 
390 WifiMac::GetDevice (void) const
391 {
392  return m_device;
393 }
394 
395 void
397 {
398  NS_LOG_FUNCTION (this << address);
399  m_address = address;
400 }
401 
404 {
405  return m_address;
406 }
407 
408 void
410 {
411  NS_LOG_FUNCTION (this << ssid);
412  m_ssid = ssid;
413 }
414 
415 Ssid
416 WifiMac::GetSsid (void) const
417 {
418  return m_ssid;
419 }
420 
421 void
423 {
424  NS_LOG_FUNCTION (this << bssid);
425  m_bssid = bssid;
426  if (m_feManager)
427  {
428  m_feManager->SetBssid (bssid);
429  }
430 }
431 
433 WifiMac::GetBssid (void) const
434 {
435  return m_bssid;
436 }
437 
438 void
440 {
441  NS_ASSERT (m_feManager != 0);
442  m_feManager->SetPromisc ();
443 }
444 
445 Ptr<Txop>
447 {
448  return m_txop;
449 }
450 
453 {
454  // Use std::find_if() instead of std::map::find() because the latter compares
455  // the given AC index with the AC index of an element in the map by using the
456  // operator< defined for AcIndex, which aborts if an operand is not a QoS AC
457  // (the AC index passed to this method may not be a QoS AC).
458  // The performance penalty is limited because std::map::find() performs 3
459  // comparisons in the worst case, while std::find_if() performs 4 comparisons
460  // in the worst case.
461  const auto it = std::find_if (m_edca.cbegin (), m_edca.cend (),
462  [ac](const auto& pair){ return pair.first == ac; });
463  return (it == m_edca.cend () ? nullptr : it->second);
464 }
465 
467 WifiMac::GetQosTxop (uint8_t tid) const
468 {
469  return GetQosTxop (QosUtilsMapTidToAc (tid));
470 }
471 
474 {
475  return (m_qosSupported ? GetQosTxop (AC_VO) : nullptr);
476 }
477 
480 {
481  return (m_qosSupported ? GetQosTxop (AC_VI) : nullptr);
482 }
483 
486 {
487  return (m_qosSupported ? GetQosTxop (AC_BE) : nullptr);
488 }
489 
492 {
493  return (m_qosSupported ? GetQosTxop (AC_BK) : nullptr);
494 }
495 
498 {
499  Ptr<Txop> txop = (ac == AC_BE_NQOS ? m_txop : StaticCast<Txop> (GetQosTxop (ac)));
500  return (txop != nullptr ? txop->GetWifiMacQueue () : nullptr);
501 }
502 
503 void
505 {
506  NS_LOG_FUNCTION (this);
507 
508  // we may have changed PHY band, in which case it is necessary to re-configure
509  // the PHY dependent parameters. In any case, this makes no harm
511 
512  // SetupPhy not only resets the remote station manager, but also sets the
513  // default TX mode and MCS, which is required when switching to a channel
514  // in a different band
516 }
517 
518 void
520 {
521  m_macTxTrace (packet);
522 }
523 
524 void
526 {
527  m_macTxDropTrace (packet);
528 }
529 
530 void
532 {
533  m_macRxTrace (packet);
534 }
535 
536 void
538 {
539  m_macPromiscRxTrace (packet);
540 }
541 
542 void
544 {
545  m_macRxDropTrace (packet);
546 }
547 
548 void
550 {
551  NS_LOG_FUNCTION (this << ac);
552 
553  //Our caller shouldn't be attempting to setup a queue that is
554  //already configured.
555  NS_ASSERT (m_edca.find (ac) == m_edca.end ());
556 
557  Ptr<QosTxop> edca = CreateObject<QosTxop> (ac);
559  edca->SetWifiMac (this);
560  edca->SetTxMiddle (m_txMiddle);
561  edca->GetBaManager ()->SetTxOkCallback (MakeCallback (&MpduTracedCallback::operator(),
563  edca->GetBaManager ()->SetTxFailedCallback (MakeCallback (&MpduTracedCallback::operator(),
565  edca->SetDroppedMpduCallback (MakeCallback (&DroppedMpduTracedCallback::operator(),
567 
568  m_edca.insert (std::make_pair (ac, edca));
569 }
570 
571 void
572 WifiMac::ConfigureContentionWindow (uint32_t cwMin, uint32_t cwMax)
573 {
574  bool isDsssOnly = GetDsssSupported () && !GetErpSupported ();
575  if (m_txop != nullptr)
576  {
577  //The special value of AC_BE_NQOS which exists in the Access
578  //Category enumeration allows us to configure plain old DCF.
579  ConfigureDcf (m_txop, cwMin, cwMax, isDsssOnly, AC_BE_NQOS);
580  }
581 
582  //Now we configure the EDCA functions
583  for (auto it = m_edca.begin (); it!= m_edca.end (); ++it)
584  {
585  ConfigureDcf (it->second, cwMin, cwMax, isDsssOnly, it->first);
586  }
587 }
588 
589 void
590 WifiMac::ConfigureDcf (Ptr<Txop> dcf, uint32_t cwmin, uint32_t cwmax, bool isDsss, AcIndex ac)
591 {
592  NS_LOG_FUNCTION (this << dcf << cwmin << cwmax << isDsss << +ac);
593  /* see IEEE 802.11 section 7.3.2.29 */
594  switch (ac)
595  {
596  case AC_VO:
597  dcf->SetMinCw ((cwmin + 1) / 4 - 1);
598  dcf->SetMaxCw ((cwmin + 1) / 2 - 1);
599  dcf->SetAifsn (2);
600  if (isDsss)
601  {
602  dcf->SetTxopLimit (MicroSeconds (3264));
603  }
604  else
605  {
606  dcf->SetTxopLimit (MicroSeconds (1504));
607  }
608  break;
609  case AC_VI:
610  dcf->SetMinCw ((cwmin + 1) / 2 - 1);
611  dcf->SetMaxCw (cwmin);
612  dcf->SetAifsn (2);
613  if (isDsss)
614  {
615  dcf->SetTxopLimit (MicroSeconds (6016));
616  }
617  else
618  {
619  dcf->SetTxopLimit (MicroSeconds (3008));
620  }
621  break;
622  case AC_BE:
623  dcf->SetMinCw (cwmin);
624  dcf->SetMaxCw (cwmax);
625  dcf->SetAifsn (3);
626  dcf->SetTxopLimit (MicroSeconds (0));
627  break;
628  case AC_BK:
629  dcf->SetMinCw (cwmin);
630  dcf->SetMaxCw (cwmax);
631  dcf->SetAifsn (7);
632  dcf->SetTxopLimit (MicroSeconds (0));
633  break;
634  case AC_BE_NQOS:
635  dcf->SetMinCw (cwmin);
636  dcf->SetMaxCw (cwmax);
637  dcf->SetAifsn (2);
638  dcf->SetTxopLimit (MicroSeconds (0));
639  break;
640  case AC_BEACON:
641  // done by ApWifiMac
642  break;
643  case AC_UNDEF:
644  NS_FATAL_ERROR ("I don't know what to do with this");
645  break;
646  }
647 }
648 
649 void
651 {
652  NS_LOG_FUNCTION (this << standard);
653 
655 
656  SetupFrameExchangeManager (standard);
657 }
658 
659 void
661 {
662  WifiPhyBand band = m_phy->GetPhyBand ();
663  NS_LOG_FUNCTION (this << band);
664 
665  uint32_t cwmin = 0;
666  uint32_t cwmax = 0;
667 
668  NS_ASSERT (m_phy != 0);
669  WifiStandard standard = m_phy->GetStandard ();
670 
671  if (standard == WIFI_STANDARD_80211b)
672  {
673  SetDsssSupported (true);
674  cwmin = 31;
675  cwmax = 1023;
676  }
677  else
678  {
679  if (standard >= WIFI_STANDARD_80211g && band == WIFI_PHY_BAND_2_4GHZ)
680  {
681  SetErpSupported (true);
682  }
683 
684  cwmin = 15;
685  cwmax = 1023;
686  }
687 
688  ConfigureContentionWindow (cwmin, cwmax);
689 }
690 
691 void
693 {
694  NS_LOG_FUNCTION (this << standard);
695  NS_ABORT_MSG_IF (standard == WIFI_STANDARD_UNSPECIFIED, "Wifi standard not set");
696 
697  if (standard >= WIFI_STANDARD_80211ax)
698  {
699  m_feManager = CreateObject<HeFrameExchangeManager> ();
700  }
701  else if (standard >= WIFI_STANDARD_80211ac)
702  {
703  m_feManager = CreateObject<VhtFrameExchangeManager> ();
704  }
705  else if (standard >= WIFI_STANDARD_80211n)
706  {
707  m_feManager = CreateObject<HtFrameExchangeManager> ();
708  }
709  else if (m_qosSupported)
710  {
711  m_feManager = CreateObject<QosFrameExchangeManager> ();
712  }
713  else
714  {
715  m_feManager = CreateObject<FrameExchangeManager> ();
716  }
717 
718  m_feManager->SetWifiMac (this);
719  m_feManager->SetMacTxMiddle (m_txMiddle);
720  m_feManager->SetMacRxMiddle (m_rxMiddle);
721  m_feManager->SetAddress (GetAddress ());
722  m_feManager->SetBssid (GetBssid ());
723  m_feManager->GetWifiTxTimer ().SetMpduResponseTimeoutCallback (MakeCallback (&MpduResponseTimeoutTracedCallback::operator(),
725  m_feManager->GetWifiTxTimer ().SetPsduResponseTimeoutCallback (MakeCallback (&PsduResponseTimeoutTracedCallback::operator(),
727  m_feManager->GetWifiTxTimer ().SetPsduMapResponseTimeoutCallback (MakeCallback (&PsduMapResponseTimeoutTracedCallback::operator(),
729  m_feManager->SetDroppedMpduCallback (MakeCallback (&DroppedMpduTracedCallback::operator(),
731  m_feManager->SetAckedMpduCallback (MakeCallback (&MpduTracedCallback::operator(),
733  m_channelAccessManager->SetupFrameExchangeManager (m_feManager);
734  if (GetQosSupported ())
735  {
736  for (const auto& pair : m_edca)
737  {
738  pair.second->SetQosFrameExchangeManager (DynamicCast<QosFrameExchangeManager> (m_feManager));
739  }
740  }
741 }
742 
745 {
746  return m_feManager;
747 }
748 
749 void
751 {
752  NS_LOG_FUNCTION (this << stationManager);
753  m_stationManager = stationManager;
754 }
755 
758 {
759  return m_stationManager;
760 }
761 
762 void
764 {
765  NS_LOG_FUNCTION (this << phy);
766  m_phy = phy;
768  "PHY operating channel must have been set");
770  m_channelAccessManager->SetupPhyListener (phy);
771  NS_ASSERT (m_feManager != 0);
772  m_feManager->SetWifiPhy (phy);
773 }
774 
777 {
778  NS_LOG_FUNCTION (this);
779  return m_phy;
780 }
781 
782 void
784 {
785  NS_LOG_FUNCTION (this);
786  NS_ASSERT (m_feManager != 0);
787  m_feManager->ResetPhy ();
788  m_channelAccessManager->RemovePhyListener (m_phy);
789  m_phy = 0;
790 }
791 
792 void
794 {
795  NS_LOG_FUNCTION (this << enable);
797  m_qosSupported = enable;
798 
799  if (!m_qosSupported)
800  {
801  // create a non-QoS TXOP
802  m_txop = CreateObject<Txop> ();
804  m_txop->SetWifiMac (this);
806  m_txop->SetDroppedMpduCallback (MakeCallback (&DroppedMpduTracedCallback::operator(),
808  }
809  else
810  {
811  //Construct the EDCAFs. The ordering is important - highest
812  //priority (Table 9-1 UP-to-AC mapping; IEEE 802.11-2012) must be created
813  //first.
818  }
819 }
820 
821 bool
823 {
824  return m_qosSupported;
825 }
826 
827 bool
829 {
830  return m_erpSupported;
831 }
832 
833 void
835 {
836  NS_LOG_FUNCTION (this);
837  if (enable)
838  {
839  SetDsssSupported (true);
840  }
841  m_erpSupported = enable;
842 }
843 
844 void
846 {
847  NS_LOG_FUNCTION (this);
848  m_dsssSupported = enable;
849 }
850 
851 bool
853 {
854  return m_dsssSupported;
855 }
856 
857 void
859 {
860  NS_LOG_FUNCTION (this);
861  m_ctsToSelfSupported = enable;
862 }
863 
864 void
866 {
867  NS_LOG_FUNCTION (this << enable);
868  m_shortSlotTimeSupported = enable;
869 }
870 
871 bool
873 {
875 }
876 
877 bool
879 {
880  return false;
881 }
882 
883 void
885 {
886  NS_LOG_FUNCTION (this);
887  m_forwardUp = upCallback;
888 }
889 
890 void
892 {
893  NS_LOG_FUNCTION (this);
894  m_linkUp = linkUp;
895 }
896 
897 void
899 {
900  NS_LOG_FUNCTION (this);
901  m_linkDown = linkDown;
902 }
903 
904 void
906 {
907  //We expect WifiMac subclasses which do support forwarding (e.g.,
908  //AP) to override this method. Therefore, we throw a fatal error if
909  //someone tries to invoke this method on a class which has not done
910  //this.
911  NS_FATAL_ERROR ("This MAC entity (" << this << ", " << GetAddress ()
912  << ") does not support Enqueue() with from address");
913 }
914 
915 void
917 {
918  NS_LOG_FUNCTION (this << packet << from << to);
919  m_forwardUp (packet, from, to);
920 }
921 
922 void
924 {
925  NS_LOG_FUNCTION (this << *mpdu);
926 
927  const WifiMacHeader* hdr = &mpdu->GetHeader ();
928  Ptr<Packet> packet = mpdu->GetPacket ()->Copy ();
929  Mac48Address to = hdr->GetAddr1 ();
930  Mac48Address from = hdr->GetAddr2 ();
931 
932  //We don't know how to deal with any frame that is not addressed to
933  //us (and odds are there is nothing sensible we could do anyway),
934  //so we ignore such frames.
935  //
936  //The derived class may also do some such filtering, but it doesn't
937  //hurt to have it here too as a backstop.
938  if (to != GetAddress ())
939  {
940  return;
941  }
942 
943  if (hdr->IsMgt () && hdr->IsAction ())
944  {
945  //There is currently only any reason for Management Action
946  //frames to be flying about if we are a QoS STA.
948 
949  WifiActionHeader actionHdr;
950  packet->RemoveHeader (actionHdr);
951 
952  switch (actionHdr.GetCategory ())
953  {
955 
956  switch (actionHdr.GetAction ().blockAck)
957  {
959  {
960  MgtAddBaRequestHeader reqHdr;
961  packet->RemoveHeader (reqHdr);
962 
963  //We've received an ADDBA Request. Our policy here is
964  //to automatically accept it, so we get the ADDBA
965  //Response on it's way immediately.
966  NS_ASSERT (m_feManager != 0);
967  Ptr<HtFrameExchangeManager> htFem = DynamicCast<HtFrameExchangeManager> (m_feManager);
968  if (htFem != 0)
969  {
970  htFem->SendAddBaResponse (&reqHdr, from);
971  }
972  //This frame is now completely dealt with, so we're done.
973  return;
974  }
976  {
977  MgtAddBaResponseHeader respHdr;
978  packet->RemoveHeader (respHdr);
979 
980  //We've received an ADDBA Response. We assume that it
981  //indicates success after an ADDBA Request we have
982  //sent (we could, in principle, check this, but it
983  //seems a waste given the level of the current model)
984  //and act by locally establishing the agreement on
985  //the appropriate queue.
986  GetQosTxop (respHdr.GetTid ())->GotAddBaResponse (&respHdr, from);
987  auto htFem = DynamicCast<HtFrameExchangeManager> (m_feManager);
988  if (htFem != 0)
989  {
990  GetQosTxop (respHdr.GetTid ())->GetBaManager ()->SetBlockAckInactivityCallback (MakeCallback (&HtFrameExchangeManager::SendDelbaFrame, htFem));
991  }
992  //This frame is now completely dealt with, so we're done.
993  return;
994  }
996  {
997  MgtDelBaHeader delBaHdr;
998  packet->RemoveHeader (delBaHdr);
999 
1000  if (delBaHdr.IsByOriginator ())
1001  {
1002  //This DELBA frame was sent by the originator, so
1003  //this means that an ingoing established
1004  //agreement exists in HtFrameExchangeManager and we need to
1005  //destroy it.
1006  NS_ASSERT (m_feManager != 0);
1007  Ptr<HtFrameExchangeManager> htFem = DynamicCast<HtFrameExchangeManager> (m_feManager);
1008  if (htFem != 0)
1009  {
1010  htFem->DestroyBlockAckAgreement (from, delBaHdr.GetTid ());
1011  }
1012  }
1013  else
1014  {
1015  //We must have been the originator. We need to
1016  //tell the correct queue that the agreement has
1017  //been torn down
1018  GetQosTxop (delBaHdr.GetTid ())->GotDelBaFrame (&delBaHdr, from);
1019  }
1020  //This frame is now completely dealt with, so we're done.
1021  return;
1022  }
1023  default:
1024  NS_FATAL_ERROR ("Unsupported Action field in Block Ack Action frame");
1025  return;
1026  }
1027  default:
1028  NS_FATAL_ERROR ("Unsupported Action frame received");
1029  return;
1030  }
1031  }
1032  NS_FATAL_ERROR ("Don't know how to handle frame (type=" << hdr->GetType ());
1033 }
1034 
1035 void
1037 {
1038  NS_LOG_FUNCTION (this << *mpdu);
1039  for (auto& msduPair : *PeekPointer (mpdu))
1040  {
1041  ForwardUp (msduPair.first, msduPair.second.GetSourceAddr (),
1042  msduPair.second.GetDestinationAddr ());
1043  }
1044 }
1045 
1048 {
1049  return GetDevice ()->GetHtConfiguration ();
1050 }
1051 
1054 {
1055  return GetDevice ()->GetVhtConfiguration ();
1056 }
1057 
1060 {
1061  return GetDevice ()->GetHeConfiguration ();
1062 }
1063 
1064 bool
1066 {
1067  if (GetHtConfiguration ())
1068  {
1069  return true;
1070  }
1071  return false;
1072 }
1073 
1074 bool
1076 {
1077  if (GetVhtConfiguration ())
1078  {
1079  return true;
1080  }
1081  return false;
1082 }
1083 
1084 bool
1086 {
1087  if (GetHeConfiguration ())
1088  {
1089  return true;
1090  }
1091  return false;
1092 }
1093 
1094 void
1096 {
1097  NS_LOG_FUNCTION (this << +threshold);
1098  if (m_qosSupported)
1099  {
1100  GetVOQueue ()->SetBlockAckThreshold (threshold);
1101  }
1102 }
1103 
1104 void
1106 {
1107  NS_LOG_FUNCTION (this << +threshold);
1108  if (m_qosSupported)
1109  {
1110  GetVIQueue ()->SetBlockAckThreshold (threshold);
1111  }
1112 }
1113 
1114 void
1116 {
1117  NS_LOG_FUNCTION (this << +threshold);
1118  if (m_qosSupported)
1119  {
1120  GetBEQueue ()->SetBlockAckThreshold (threshold);
1121  }
1122 }
1123 
1124 void
1126 {
1127  NS_LOG_FUNCTION (this << +threshold);
1128  if (m_qosSupported)
1129  {
1130  GetBKQueue ()->SetBlockAckThreshold (threshold);
1131  }
1132 }
1133 
1134 void
1136 {
1137  NS_LOG_FUNCTION (this << timeout);
1138  if (m_qosSupported)
1139  {
1141  }
1142 }
1143 
1144 void
1146 {
1147  NS_LOG_FUNCTION (this << timeout);
1148  if (m_qosSupported)
1149  {
1151  }
1152 }
1153 
1154 void
1156 {
1157  NS_LOG_FUNCTION (this << timeout);
1158  if (m_qosSupported)
1159  {
1161  }
1162 }
1163 
1164 void
1166 {
1167  NS_LOG_FUNCTION (this << timeout);
1168  if (m_qosSupported)
1169  {
1171  }
1172 }
1173 
1176 {
1177  NS_LOG_FUNCTION (this);
1178  ExtendedCapabilities capabilities;
1179  capabilities.SetHtSupported (GetHtSupported ());
1180  capabilities.SetVhtSupported (GetVhtSupported ());
1181  //TODO: to be completed
1182  return capabilities;
1183 }
1184 
1187 {
1188  NS_LOG_FUNCTION (this);
1189  HtCapabilities capabilities;
1190  if (GetHtSupported ())
1191  {
1192  Ptr<HtConfiguration> htConfiguration = GetHtConfiguration ();
1193  bool sgiSupported = htConfiguration->GetShortGuardIntervalSupported ();
1194  capabilities.SetHtSupported (1);
1195  capabilities.SetLdpc (htConfiguration->GetLdpcSupported ());
1196  capabilities.SetSupportedChannelWidth (GetWifiPhy ()->GetChannelWidth () >= 40);
1197  capabilities.SetShortGuardInterval20 (sgiSupported);
1198  capabilities.SetShortGuardInterval40 (GetWifiPhy ()->GetChannelWidth () >= 40 && sgiSupported);
1199  // Set Maximum A-MSDU Length subfield
1200  uint16_t maxAmsduSize = std::max ({m_voMaxAmsduSize, m_viMaxAmsduSize,
1202  if (maxAmsduSize <= 3839)
1203  {
1204  capabilities.SetMaxAmsduLength (3839);
1205  }
1206  else
1207  {
1208  capabilities.SetMaxAmsduLength (7935);
1209  }
1210  uint32_t maxAmpduLength = std::max ({m_voMaxAmpduSize, m_viMaxAmpduSize,
1212  // round to the next power of two minus one
1213  maxAmpduLength = (1ul << static_cast<uint32_t> (std::ceil (std::log2 (maxAmpduLength + 1)))) - 1;
1214  // The maximum A-MPDU length in HT capabilities elements ranges from 2^13-1 to 2^16-1
1215  capabilities.SetMaxAmpduLength (std::min (std::max (maxAmpduLength, 8191u), 65535u));
1216 
1217  capabilities.SetLSigProtectionSupport (true);
1218  uint64_t maxSupportedRate = 0; //in bit/s
1219  for (const auto & mcs : GetWifiPhy ()->GetMcsList (WIFI_MOD_CLASS_HT))
1220  {
1221  capabilities.SetRxMcsBitmask (mcs.GetMcsValue ());
1222  uint8_t nss = (mcs.GetMcsValue () / 8) + 1;
1223  NS_ASSERT (nss > 0 && nss < 5);
1224  uint64_t dataRate = mcs.GetDataRate (GetWifiPhy ()->GetChannelWidth (), sgiSupported ? 400 : 800, nss);
1225  if (dataRate > maxSupportedRate)
1226  {
1227  maxSupportedRate = dataRate;
1228  NS_LOG_DEBUG ("Updating maxSupportedRate to " << maxSupportedRate);
1229  }
1230  }
1231  capabilities.SetRxHighestSupportedDataRate (static_cast<uint16_t> (maxSupportedRate / 1e6)); //in Mbit/s
1232  capabilities.SetTxMcsSetDefined (GetWifiPhy ()->GetNMcs () > 0);
1233  capabilities.SetTxMaxNSpatialStreams (GetWifiPhy ()->GetMaxSupportedTxSpatialStreams ());
1234  //we do not support unequal modulations
1235  capabilities.SetTxRxMcsSetUnequal (0);
1236  capabilities.SetTxUnequalModulation (0);
1237  }
1238  return capabilities;
1239 }
1240 
1243 {
1244  NS_LOG_FUNCTION (this);
1245  VhtCapabilities capabilities;
1246  if (GetVhtSupported ())
1247  {
1248  Ptr<HtConfiguration> htConfiguration = GetHtConfiguration ();
1249  Ptr<VhtConfiguration> vhtConfiguration = GetVhtConfiguration ();
1250  bool sgiSupported = htConfiguration->GetShortGuardIntervalSupported ();
1251  capabilities.SetVhtSupported (1);
1252  if (GetWifiPhy ()->GetChannelWidth () == 160)
1253  {
1254  capabilities.SetSupportedChannelWidthSet (1);
1255  }
1256  else
1257  {
1258  capabilities.SetSupportedChannelWidthSet (0);
1259  }
1260  // Set Maximum MPDU Length subfield
1261  uint16_t maxAmsduSize = std::max ({m_voMaxAmsduSize, m_viMaxAmsduSize,
1263  if (maxAmsduSize <= 3839)
1264  {
1265  capabilities.SetMaxMpduLength (3895);
1266  }
1267  else if (maxAmsduSize <= 7935)
1268  {
1269  capabilities.SetMaxMpduLength (7991);
1270  }
1271  else
1272  {
1273  capabilities.SetMaxMpduLength (11454);
1274  }
1275  uint32_t maxAmpduLength = std::max ({m_voMaxAmpduSize, m_viMaxAmpduSize,
1277  // round to the next power of two minus one
1278  maxAmpduLength = (1ul << static_cast<uint32_t> (std::ceil (std::log2 (maxAmpduLength + 1)))) - 1;
1279  // The maximum A-MPDU length in VHT capabilities elements ranges from 2^13-1 to 2^20-1
1280  capabilities.SetMaxAmpduLength (std::min (std::max (maxAmpduLength, 8191u), 1048575u));
1281 
1282  capabilities.SetRxLdpc (htConfiguration->GetLdpcSupported ());
1283  capabilities.SetShortGuardIntervalFor80Mhz ((GetWifiPhy ()->GetChannelWidth () == 80) && sgiSupported);
1284  capabilities.SetShortGuardIntervalFor160Mhz ((GetWifiPhy ()->GetChannelWidth () == 160) && sgiSupported);
1285  uint8_t maxMcs = 0;
1286  for (const auto & mcs : GetWifiPhy ()->GetMcsList (WIFI_MOD_CLASS_VHT))
1287  {
1288  if (mcs.GetMcsValue () > maxMcs)
1289  {
1290  maxMcs = mcs.GetMcsValue ();
1291  }
1292  }
1293  // Support same MaxMCS for each spatial stream
1294  for (uint8_t nss = 1; nss <= GetWifiPhy ()->GetMaxSupportedRxSpatialStreams (); nss++)
1295  {
1296  capabilities.SetRxMcsMap (maxMcs, nss);
1297  }
1298  for (uint8_t nss = 1; nss <= GetWifiPhy ()->GetMaxSupportedTxSpatialStreams (); nss++)
1299  {
1300  capabilities.SetTxMcsMap (maxMcs, nss);
1301  }
1302  uint64_t maxSupportedRateLGI = 0; //in bit/s
1303  for (const auto & mcs : GetWifiPhy ()->GetMcsList (WIFI_MOD_CLASS_VHT))
1304  {
1305  if (!mcs.IsAllowed (GetWifiPhy ()->GetChannelWidth (), 1))
1306  {
1307  continue;
1308  }
1309  if (mcs.GetDataRate (GetWifiPhy ()->GetChannelWidth ()) > maxSupportedRateLGI)
1310  {
1311  maxSupportedRateLGI = mcs.GetDataRate (GetWifiPhy ()->GetChannelWidth ());
1312  NS_LOG_DEBUG ("Updating maxSupportedRateLGI to " << maxSupportedRateLGI);
1313  }
1314  }
1315  capabilities.SetRxHighestSupportedLgiDataRate (static_cast<uint16_t> (maxSupportedRateLGI / 1e6)); //in Mbit/s
1316  capabilities.SetTxHighestSupportedLgiDataRate (static_cast<uint16_t> (maxSupportedRateLGI / 1e6)); //in Mbit/s
1317  //To be filled in once supported
1318  capabilities.SetRxStbc (0);
1319  capabilities.SetTxStbc (0);
1320  }
1321  return capabilities;
1322 }
1323 
1326 {
1327  NS_LOG_FUNCTION (this);
1328  HeCapabilities capabilities;
1329  if (GetHeSupported ())
1330  {
1331  Ptr<HtConfiguration> htConfiguration = GetHtConfiguration ();
1332  Ptr<HeConfiguration> heConfiguration = GetHeConfiguration ();
1333  capabilities.SetHeSupported (1);
1334  uint8_t channelWidthSet = 0;
1335  if ((m_phy->GetChannelWidth () >= 40) && (m_phy->GetPhyBand () == WIFI_PHY_BAND_2_4GHZ))
1336  {
1337  channelWidthSet |= 0x01;
1338  }
1339  if ((m_phy->GetChannelWidth () >= 80) && ((m_phy->GetPhyBand () == WIFI_PHY_BAND_5GHZ) || (m_phy->GetPhyBand () == WIFI_PHY_BAND_6GHZ)))
1340  {
1341  channelWidthSet |= 0x02;
1342  }
1343  if ((m_phy->GetChannelWidth () >= 160) && ((m_phy->GetPhyBand () == WIFI_PHY_BAND_5GHZ) || (m_phy->GetPhyBand () == WIFI_PHY_BAND_6GHZ)))
1344  {
1345  channelWidthSet |= 0x04;
1346  }
1347  capabilities.SetChannelWidthSet (channelWidthSet);
1348  capabilities.SetLdpcCodingInPayload (htConfiguration->GetLdpcSupported ());
1349  if (heConfiguration->GetGuardInterval () == NanoSeconds (800))
1350  {
1351  //todo: We assume for now that if we support 800ns GI then 1600ns GI is supported as well
1352  //todo: Assuming reception support for both 1x HE LTF and 4x HE LTF 800 ns
1353  capabilities.SetHeSuPpdu1xHeLtf800nsGi (true);
1354  capabilities.SetHePpdu4xHeLtf800nsGi (true);
1355  }
1356 
1357  uint32_t maxAmpduLength = std::max ({m_voMaxAmpduSize, m_viMaxAmpduSize,
1359  // round to the next power of two minus one
1360  maxAmpduLength = (1ul << static_cast<uint32_t> (std::ceil (std::log2 (maxAmpduLength + 1)))) - 1;
1361  // The maximum A-MPDU length in HE capabilities elements ranges from 2^20-1 to 2^23-1
1362  capabilities.SetMaxAmpduLength (std::min (std::max (maxAmpduLength, 1048575u), 8388607u));
1363 
1364  uint8_t maxMcs = 0;
1365  for (const auto & mcs : m_phy->GetMcsList (WIFI_MOD_CLASS_HE))
1366  {
1367  if (mcs.GetMcsValue () > maxMcs)
1368  {
1369  maxMcs = mcs.GetMcsValue ();
1370  }
1371  }
1372  capabilities.SetHighestMcsSupported (maxMcs);
1374  }
1375  return capabilities;
1376 }
1377 
1378 uint32_t
1380 {
1381  uint32_t maxSize = 0;
1382  switch (ac)
1383  {
1384  case AC_BE:
1385  maxSize = m_beMaxAmpduSize;
1386  break;
1387  case AC_BK:
1388  maxSize = m_bkMaxAmpduSize;
1389  break;
1390  case AC_VI:
1391  maxSize = m_viMaxAmpduSize;
1392  break;
1393  case AC_VO:
1394  maxSize = m_voMaxAmpduSize;
1395  break;
1396  default:
1397  NS_ABORT_MSG ("Unknown AC " << ac);
1398  return 0;
1399  }
1400  return maxSize;
1401 }
1402 
1403 uint16_t
1405 {
1406  uint16_t maxSize = 0;
1407  switch (ac)
1408  {
1409  case AC_BE:
1410  maxSize = m_beMaxAmsduSize;
1411  break;
1412  case AC_BK:
1413  maxSize = m_bkMaxAmsduSize;
1414  break;
1415  case AC_VI:
1416  maxSize = m_viMaxAmsduSize;
1417  break;
1418  case AC_VO:
1419  maxSize = m_voMaxAmsduSize;
1420  break;
1421  default:
1422  NS_ABORT_MSG ("Unknown AC " << ac);
1423  return 0;
1424  }
1425  return maxSize;
1426 }
1427 
1428 } //namespace ns3
1429 
#define min(a, b)
Definition: 80211b.c:42
#define max(a, b)
Definition: 80211b.c:43
AttributeValue implementation for Boolean.
Definition: boolean.h:37
The Extended Capabilities Information Element.
void SetHtSupported(uint8_t htSupported)
Set the HT Supported flag.
void SetVhtSupported(uint8_t vhtSupported)
Set the VHT Supported flag.
The IEEE 802.11ax HE Capabilities.
void SetHeSuPpdu1xHeLtf800nsGi(bool heSuPpdu1xHeLtf800nsGi)
Set 1xHE-LTF and 800ns GI in HE SU PPDU reception support.
void SetLdpcCodingInPayload(uint8_t ldpcCodingInPayload)
Set indication whether the transmission and reception of LDPC encoded packets is supported.
void SetHePpdu4xHeLtf800nsGi(bool heSuPpdu4xHeLtf800nsGi)
Set 4xHE-LTF and 800ns GI in HE SU PPDU and HE MU PPDU reception support.
void SetHeSupported(uint8_t heSupported)
Set HE supported.
void SetHighestNssSupported(uint8_t nss)
Set highest NSS supported.
void SetMaxAmpduLength(uint32_t maxAmpduLength)
Set the maximum AMPDU length.
void SetChannelWidthSet(uint8_t channelWidthSet)
Set channel width set.
void SetHighestMcsSupported(uint8_t mcs)
Set highest MCS supported.
The HT Capabilities Information Element.
void SetLdpc(uint8_t ldpc)
Set the LDPC field.
void SetTxRxMcsSetUnequal(uint8_t txRxMcsSetUnequal)
Set the transmit / receive MCS set unequal.
void SetRxHighestSupportedDataRate(uint16_t maxSupportedRate)
Set the receive highest supported data rate.
void SetLSigProtectionSupport(uint8_t lSigProtection)
Set the LSIG protection support.
void SetMaxAmsduLength(uint16_t maxAmsduLength)
Set the maximum AMSDU length.
void SetTxMaxNSpatialStreams(uint8_t maxTxSpatialStreams)
Set the transmit maximum N spatial streams.
void SetShortGuardInterval20(uint8_t shortGuardInterval)
Set the short guard interval 20 field.
void SetTxUnequalModulation(uint8_t txUnequalModulation)
Set the transmit unequal modulation.
void SetTxMcsSetDefined(uint8_t txMcsSetDefined)
Set the transmit MCS set defined.
void SetHtSupported(uint8_t htSupported)
Set the HT supported field.
void SetRxMcsBitmask(uint8_t index)
Set the receive MCS bitmask.
void SetSupportedChannelWidth(uint8_t supportedChannelWidth)
Set the supported channel width field.
void SetMaxAmpduLength(uint32_t maxAmpduLength)
Set the maximum AMPDU length.
void SetShortGuardInterval40(uint8_t shortGuardInterval)
Set the short guard interval 40 field.
void SendDelbaFrame(Mac48Address addr, uint8_t tid, bool byOriginator)
Sends DELBA frame to cancel a block ack agreement with STA addressed by addr for TID tid.
an EUI-48 address
Definition: mac48-address.h:44
Implement the header for management frames of type Add Block Ack request.
Definition: mgt-headers.h:1018
Implement the header for management frames of type Add Block Ack response.
Definition: mgt-headers.h:1150
uint8_t GetTid(void) const
Return the Traffic ID (TID).
Implement the header for management frames of type Delete Block Ack.
Definition: mgt-headers.h:1271
uint8_t GetTid(void) const
Return the Traffic ID (TID).
bool IsByOriginator(void) const
Check if the initiator bit in the DELBA is set.
A base class which provides memory management and object aggregation.
Definition: object.h:88
bool IsInitialized(void) const
Check if the object has been initialized.
Definition: object.cc:208
void Initialize(void)
Invoke DoInitialize on all Objects aggregated to this one.
Definition: object.cc:183
void Dispose(void)
Dispose of this Object.
Definition: object.cc:214
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
Definition: packet.cc:280
Hold objects of type Ptr<T>.
Definition: pointer.h:37
void SetDroppedMpduCallback(DroppedMpdu callback) override
Definition: qos-txop.cc:150
Ptr< BlockAckManager > GetBaManager(void)
Get the Block Ack Manager associated with this QosTxop.
Definition: qos-txop.cc:243
void GotAddBaResponse(const MgtAddBaResponseHeader *respHdr, Mac48Address recipient)
Event handler when an ADDBA response is received.
Definition: qos-txop.cc:591
void SetBlockAckThreshold(uint8_t threshold)
Set threshold for block ack mechanism.
Definition: qos-txop.cc:645
void GotDelBaFrame(const MgtDelBaHeader *delBaHdr, Mac48Address recipient)
Event handler when a DELBA frame is received.
Definition: qos-txop.cc:626
void SetBlockAckInactivityTimeout(uint16_t timeout)
Set the BlockAck inactivity timeout.
Definition: qos-txop.cc:653
The IEEE 802.11 SSID Information Element.
Definition: ssid.h:36
AttributeValue implementation for Ssid.
Definition: ssid.h:105
void SetMaxCw(uint32_t maxCw)
Set the maximum contention window size.
Definition: txop.cc:173
Ptr< WifiMacQueue > GetWifiMacQueue() const
Return the packet queue associated with this Txop.
Definition: txop.cc:154
virtual void SetWifiMac(const Ptr< WifiMac > mac)
Set the wifi MAC this Txop is associated to.
Definition: txop.cc:136
void SetTxopLimit(Time txopLimit)
Set the TXOP limit.
Definition: txop.cc:254
void SetTxMiddle(const Ptr< MacTxMiddle > txMiddle)
Set MacTxMiddle this Txop is associated to.
Definition: txop.cc:129
void SetAifsn(uint8_t aifsn)
Set the number of slots that make up an AIFS.
Definition: txop.cc:247
virtual void SetDroppedMpduCallback(DroppedMpdu callback)
Definition: txop.cc:143
void SetMinCw(uint32_t minCw)
Set the minimum contention window size.
Definition: txop.cc:161
void SetChannelAccessManager(const Ptr< ChannelAccessManager > manager)
Set ChannelAccessManager this Txop is associated to.
Definition: txop.cc:122
a unique identifier for an interface.
Definition: type-id.h:59
@ ATTR_GET
The attribute can be read.
Definition: type-id.h:64
@ ATTR_CONSTRUCT
The attribute can be written at construction-time.
Definition: type-id.h:66
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:922
@ OBSOLETE
Attribute or trace source is not used anymore; simulation fails.
Definition: type-id.h:74
Hold an unsigned integer type.
Definition: uinteger.h:44
The IEEE 802.11ac VHT Capabilities.
void SetRxHighestSupportedLgiDataRate(uint16_t supportedDatarate)
Set the receive highest supported LGI data rate.
void SetSupportedChannelWidthSet(uint8_t channelWidthSet)
Set the supported channel width set.
void SetMaxMpduLength(uint16_t length)
Set the maximum MPDU length.
void SetRxLdpc(uint8_t rxLdpc)
Set the receive LDPC.
void SetTxStbc(uint8_t txStbc)
Set the transmit STBC.
void SetTxMcsMap(uint8_t mcs, uint8_t nss)
void SetShortGuardIntervalFor80Mhz(uint8_t shortGuardInterval)
Set the short guard interval 80 MHz.
void SetTxHighestSupportedLgiDataRate(uint16_t supportedDatarate)
Set the transmit highest supported LGI data rate.
void SetShortGuardIntervalFor160Mhz(uint8_t shortGuardInterval)
Set the short guard interval 160 MHz.
void SetMaxAmpduLength(uint32_t maxAmpduLength)
Set the maximum AMPDU length.
void SetRxMcsMap(uint8_t mcs, uint8_t nss)
void SetRxStbc(uint8_t rxStbc)
Set the receive STBC.
void SetVhtSupported(uint8_t vhtSupported)
Set the VHT supported field.
See IEEE 802.11 chapter 7.3.1.11 Header format: | category: 1 | action value: 1 |.
Definition: mgt-headers.h:885
CategoryValue GetCategory()
Return the category value.
ActionValue GetAction()
Return the action value.
Implements the IEEE 802.11 MAC header.
Mac48Address GetAddr2(void) const
Return the address in the Address 2 field.
bool IsAction(void) const
Return true if the header is an Action header.
bool IsMgt(void) const
Return true if the Type is Management.
Mac48Address GetAddr1(void) const
Return the address in the Address 1 field.
WifiMacType GetType(void) const
Return the type (enum WifiMacType)
uint16_t GetMaxAmsduSize(AcIndex ac) const
Return the maximum A-MSDU size of the given Access Category.
Definition: wifi-mac.cc:1404
Ptr< HtConfiguration > GetHtConfiguration(void) const
Definition: wifi-mac.cc:1047
uint16_t m_viMaxAmsduSize
maximum A-MSDU size for AC_VI (in bytes)
Definition: wifi-mac.h:682
bool m_shortSlotTimeSupported
flag whether short slot time is supported
Definition: wifi-mac.h:660
ExtendedCapabilities GetExtendedCapabilities(void) const
Return the extended capabilities of the device.
Definition: wifi-mac.cc:1175
Ptr< FrameExchangeManager > GetFrameExchangeManager(void) const
Get the Frame Exchange Manager.
Definition: wifi-mac.cc:744
DroppedMpduTracedCallback m_droppedMpduCallback
This trace indicates that an MPDU was dropped for the given reason.
Definition: wifi-mac.h:748
Ptr< WifiRemoteStationManager > m_stationManager
Remote station manager (rate control, RTS/CTS/fragmentation thresholds etc.)
Definition: wifi-mac.h:667
void SetErpSupported(bool enable)
Enable or disable ERP support for the device.
Definition: wifi-mac.cc:834
bool GetShortSlotTimeSupported(void) const
Definition: wifi-mac.cc:872
bool m_qosSupported
This Boolean is set true iff this WifiMac is to model 802.11e/WMM style Quality of Service.
Definition: wifi-mac.h:648
Ptr< HeConfiguration > GetHeConfiguration(void) const
Definition: wifi-mac.cc:1059
bool m_dsssSupported
This Boolean is set true iff this WifiMac is to model 802.11b.
Definition: wifi-mac.h:658
bool m_erpSupported
This Boolean is set true iff this WifiMac is to model 802.11g.
Definition: wifi-mac.h:653
Ptr< QosTxop > GetBKQueue(void) const
Accessor for the AC_BK channel access function.
Definition: wifi-mac.cc:491
Callback< void > m_linkDown
Callback when a link is down.
Definition: wifi-mac.h:526
bool GetVhtSupported() const
Return whether the device supports VHT.
Definition: wifi-mac.cc:1075
bool GetQosSupported() const
Return whether the device supports QoS.
Definition: wifi-mac.cc:822
virtual void SetAddress(Mac48Address address)
Definition: wifi-mac.cc:396
Ptr< Txop > m_txop
TXOP used for transmission of frames to non-QoS peers.
Definition: wifi-mac.h:523
void SetQosSupported(bool enable)
Enable or disable QoS support for the device.
Definition: wifi-mac.cc:793
Mac48Address m_address
MAC address of this station.
Definition: wifi-mac.h:669
HeCapabilities GetHeCapabilities(void) const
Return the HE capabilities of the device.
Definition: wifi-mac.cc:1325
Ssid GetSsid(void) const
Definition: wifi-mac.cc:416
uint16_t m_voMaxAmsduSize
maximum A-MSDU size for AC_VO (in bytes)
Definition: wifi-mac.h:681
Ptr< MacRxMiddle > m_rxMiddle
RX middle (defragmentation etc.)
Definition: wifi-mac.h:519
void DoInitialize() override
Initialize() implementation.
Definition: wifi-mac.cc:320
void ResetWifiPhy(void)
Remove currently attached WifiPhy device from this MAC.
Definition: wifi-mac.cc:783
TypeOfStation m_typeOfStation
the type of station
Definition: wifi-mac.h:663
uint32_t m_beMaxAmpduSize
maximum A-MPDU size for AC_BE (in bytes)
Definition: wifi-mac.h:688
virtual void ConfigureStandard(WifiStandard standard)
Definition: wifi-mac.cc:650
void SetupFrameExchangeManager(WifiStandard standard)
Create a Frame Exchange Manager depending on the supported version of the standard.
Definition: wifi-mac.cc:692
Mac48Address GetAddress(void) const
Definition: wifi-mac.cc:403
void SetDsssSupported(bool enable)
Enable or disable DSSS support for the device.
Definition: wifi-mac.cc:845
void SetBeBlockAckThreshold(uint8_t threshold)
Set the block ack threshold for AC_BE.
Definition: wifi-mac.cc:1115
void SetPromisc(void)
Sets the interface in promiscuous mode.
Definition: wifi-mac.cc:439
Ptr< QosTxop > GetBEQueue(void) const
Accessor for the AC_BE channel access function.
Definition: wifi-mac.cc:485
bool GetHtSupported() const
Return whether the device supports HT.
Definition: wifi-mac.cc:1065
TracedCallback< Ptr< const Packet > > m_macTxTrace
The trace source fired when packets come into the "top" of the device at the L3/L2 transition,...
Definition: wifi-mac.h:699
void ConfigureDcf(Ptr< Txop > dcf, uint32_t cwmin, uint32_t cwmax, bool isDsss, AcIndex ac)
Definition: wifi-mac.cc:590
void ConfigurePhyDependentParameters(void)
Configure PHY dependent parameters such as CWmin and CWmax.
Definition: wifi-mac.cc:660
uint32_t m_voMaxAmpduSize
maximum A-MPDU size for AC_VO (in bytes)
Definition: wifi-mac.h:686
Ptr< WifiNetDevice > m_device
Pointer to the device.
Definition: wifi-mac.h:665
void SetSsid(Ssid ssid)
Definition: wifi-mac.cc:409
void SetTypeOfStation(TypeOfStation type)
This method is invoked by a subclass to specify what type of station it is implementing.
Definition: wifi-mac.cc:371
Ptr< WifiRemoteStationManager > GetWifiRemoteStationManager(void) const
Definition: wifi-mac.cc:757
MpduTracedCallback m_ackedMpduCallback
ack'ed MPDU callback
Definition: wifi-mac.h:753
Ptr< QosTxop > GetVOQueue(void) const
Accessor for the AC_VO channel access function.
Definition: wifi-mac.cc:473
MpduTracedCallback m_nackedMpduCallback
nack'ed MPDU callback
Definition: wifi-mac.h:754
Ptr< ChannelAccessManager > m_channelAccessManager
channel access manager
Definition: wifi-mac.h:521
Mac48Address GetBssid(void) const
Definition: wifi-mac.cc:433
bool GetHeSupported() const
Return whether the device supports HE.
Definition: wifi-mac.cc:1085
void SetBkBlockAckThreshold(uint8_t threshold)
Set the block ack threshold for AC_BK.
Definition: wifi-mac.cc:1125
TracedCallback< const WifiMacHeader & > m_txErrCallback
transmit error callback
Definition: wifi-mac.h:732
void SetVoBlockAckThreshold(uint8_t threshold)
Set the block ack threshold for AC_VO.
Definition: wifi-mac.cc:1095
Ptr< QosTxop > GetVIQueue(void) const
Accessor for the AC_VI channel access function.
Definition: wifi-mac.cc:479
virtual void Receive(Ptr< WifiMacQueueItem > mpdu)
This method acts as the MacRxMiddle receive callback and is invoked to notify us that a frame has bee...
Definition: wifi-mac.cc:923
void NotifyPromiscRx(Ptr< const Packet > packet)
Definition: wifi-mac.cc:537
virtual void NotifyChannelSwitching(void)
Notify that channel has been switched.
Definition: wifi-mac.cc:504
static TypeId GetTypeId(void)
Get the type ID.
Definition: wifi-mac.cc:66
void SetWifiRemoteStationManager(Ptr< WifiRemoteStationManager > stationManager)
Definition: wifi-mac.cc:750
void SetBeBlockAckInactivityTimeout(uint16_t timeout)
Set BE block ack inactivity timeout.
Definition: wifi-mac.cc:1155
TracedCallback< Ptr< const Packet > > m_macRxTrace
The trace source fired for packets successfully received by the device immediately before being forwa...
Definition: wifi-mac.h:722
TracedCallback< Ptr< const Packet > > m_macTxDropTrace
The trace source fired when packets coming into the "top" of the device are dropped at the MAC layer ...
Definition: wifi-mac.h:706
Ptr< MacTxMiddle > m_txMiddle
TX middle (aggregation etc.)
Definition: wifi-mac.h:520
void NotifyTx(Ptr< const Packet > packet)
Definition: wifi-mac.cc:519
uint32_t GetMaxAmpduSize(AcIndex ac) const
Return the maximum A-MPDU size of the given Access Category.
Definition: wifi-mac.cc:1379
Ssid m_ssid
Service Set ID (SSID)
Definition: wifi-mac.h:670
TypeOfStation GetTypeOfStation(void) const
Return the type of station.
Definition: wifi-mac.cc:378
Ptr< WifiPhy > GetWifiPhy(void) const
Definition: wifi-mac.cc:776
Mac48Address m_bssid
the BSSID
Definition: wifi-mac.h:671
virtual void SetWifiPhy(Ptr< WifiPhy > phy)
Definition: wifi-mac.cc:763
virtual void Enqueue(Ptr< Packet > packet, Mac48Address to, Mac48Address from)
Definition: wifi-mac.cc:905
void NotifyRx(Ptr< const Packet > packet)
Definition: wifi-mac.cc:531
TracedCallback< Ptr< const Packet > > m_macRxDropTrace
The trace source fired when packets coming into the "top" of the device are dropped at the MAC layer ...
Definition: wifi-mac.h:729
MpduResponseTimeoutTracedCallback m_mpduResponseTimeoutCallback
MPDU response timeout traced callback.
Definition: wifi-mac.h:773
void SetForwardUpCallback(ForwardUpCallback upCallback)
Definition: wifi-mac.cc:884
PsduMapResponseTimeoutTracedCallback m_psduMapResponseTimeoutCallback
PSDU map response timeout traced callback.
Definition: wifi-mac.h:813
TracedCallback< Ptr< const Packet > > m_macPromiscRxTrace
The trace source fired for packets successfully received by the device immediately before being forwa...
Definition: wifi-mac.h:714
uint16_t m_bkMaxAmsduSize
maximum A-MSDU size for AC_BK (in bytes)
Definition: wifi-mac.h:684
void SetBkBlockAckInactivityTimeout(uint16_t timeout)
Set BK block ack inactivity timeout.
Definition: wifi-mac.cc:1165
Ptr< VhtConfiguration > GetVhtConfiguration(void) const
Definition: wifi-mac.cc:1053
virtual void DeaggregateAmsduAndForward(Ptr< WifiMacQueueItem > mpdu)
This method can be called to de-aggregate an A-MSDU and forward the constituent packets up the stack.
Definition: wifi-mac.cc:1036
virtual Ptr< WifiMacQueue > GetTxopQueue(AcIndex ac) const
Get the wifi MAC queue of the (Qos)Txop associated with the given AC, if such (Qos)Txop is installed,...
Definition: wifi-mac.cc:497
void SetViBlockAckThreshold(uint8_t threshold)
Set the block ack threshold for AC_VI.
Definition: wifi-mac.cc:1105
void SetViBlockAckInactivityTimeout(uint16_t timeout)
Set VI block ack inactivity timeout.
Definition: wifi-mac.cc:1145
void SetupEdcaQueue(AcIndex ac)
This method is a private utility invoked to configure the channel access function for the specified A...
Definition: wifi-mac.cc:549
Ptr< FrameExchangeManager > m_feManager
Frame Exchange Manager.
Definition: wifi-mac.h:522
void SetLinkDownCallback(Callback< void > linkDown)
Definition: wifi-mac.cc:898
virtual ~WifiMac()
Definition: wifi-mac.cc:60
void NotifyRxDrop(Ptr< const Packet > packet)
Definition: wifi-mac.cc:543
virtual void SetLinkUpCallback(Callback< void > linkUp)
Definition: wifi-mac.cc:891
void SetDevice(const Ptr< WifiNetDevice > device)
Sets the device this PHY is associated with.
Definition: wifi-mac.cc:384
void SetCtsToSelfSupported(bool enable)
Enable or disable CTS-to-self feature.
Definition: wifi-mac.cc:858
Ptr< WifiNetDevice > GetDevice(void) const
Return the device this PHY is associated with.
Definition: wifi-mac.cc:390
EdcaQueues m_edca
This is a map from Access Category index to the corresponding channel access function.
Definition: wifi-mac.h:679
uint32_t m_bkMaxAmpduSize
maximum A-MPDU size for AC_BK (in bytes)
Definition: wifi-mac.h:689
void ForwardUp(Ptr< const Packet > packet, Mac48Address from, Mac48Address to)
Forward the packet up to the device.
Definition: wifi-mac.cc:916
virtual void ConfigureContentionWindow(uint32_t cwMin, uint32_t cwMax)
Definition: wifi-mac.cc:572
VhtCapabilities GetVhtCapabilities(void) const
Return the VHT capabilities of the device.
Definition: wifi-mac.cc:1242
bool GetErpSupported() const
Return whether the device supports ERP.
Definition: wifi-mac.cc:828
ForwardUpCallback m_forwardUp
Callback to forward packet up the stack.
Definition: wifi-mac.h:691
TracedCallback< const WifiMacHeader & > m_txOkCallback
transmit OK callback
Definition: wifi-mac.h:731
Callback< void > m_linkUp
Callback when a link is up.
Definition: wifi-mac.h:525
bool GetDsssSupported() const
Return whether the device supports DSSS.
Definition: wifi-mac.cc:852
HtCapabilities GetHtCapabilities(void) const
Return the HT capabilities of the device.
Definition: wifi-mac.cc:1186
virtual bool SupportsSendFrom(void) const
Definition: wifi-mac.cc:878
PsduResponseTimeoutTracedCallback m_psduResponseTimeoutCallback
PSDU response timeout traced callback.
Definition: wifi-mac.h:792
Ptr< QosTxop > GetQosTxop(AcIndex ac) const
Accessor for a specified EDCA object.
Definition: wifi-mac.cc:452
void NotifyTxDrop(Ptr< const Packet > packet)
Definition: wifi-mac.cc:525
void DoDispose() override
Destructor implementation.
Definition: wifi-mac.cc:336
void SetVoBlockAckInactivityTimeout(uint16_t timeout)
Set VO block ack inactivity timeout.
Definition: wifi-mac.cc:1135
Ptr< WifiPhy > m_phy
Wifi PHY.
Definition: wifi-mac.h:666
void SetShortSlotTimeSupported(bool enable)
Enable or disable short slot time feature.
Definition: wifi-mac.cc:865
void SetBssid(Mac48Address bssid)
Definition: wifi-mac.cc:422
bool m_ctsToSelfSupported
flag indicating whether CTS-To-Self is supported
Definition: wifi-mac.h:661
Ptr< Txop > GetTxop(void) const
Accessor for the Txop object.
Definition: wifi-mac.cc:446
uint16_t m_beMaxAmsduSize
maximum A-MSDU size for AC_BE (in bytes)
Definition: wifi-mac.h:683
uint32_t m_viMaxAmpduSize
maximum A-MPDU size for AC_VI (in bytes)
Definition: wifi-mac.h:687
Ptr< HtConfiguration > GetHtConfiguration(void) const
Ptr< VhtConfiguration > GetVhtConfiguration(void) const
Ptr< HeConfiguration > GetHeConfiguration(void) const
std::list< WifiMode > GetMcsList(void) const
The WifiPhy::GetMcsList() method is used (e.g., by a WifiRemoteStationManager) to determine the set o...
Definition: wifi-phy.cc:1767
const WifiPhyOperatingChannel & GetOperatingChannel(void) const
Get a const reference to the operating channel.
Definition: wifi-phy.cc:900
WifiPhyBand GetPhyBand(void) const
Get the configured Wi-Fi band.
Definition: wifi-phy.cc:887
WifiStandard GetStandard(void) const
Get the configured Wi-Fi standard.
Definition: wifi-phy.cc:894
uint8_t GetMaxSupportedRxSpatialStreams(void) const
Definition: wifi-phy.cc:1138
uint8_t GetMaxSupportedTxSpatialStreams(void) const
Definition: wifi-phy.cc:1120
uint16_t GetChannelWidth(void) const
Definition: wifi-phy.cc:918
bool IsSet(void) const
Return true if a valid channel has been set, false otherwise.
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...
#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 AttributeChecker > MakeBooleanChecker(void)
Definition: boolean.cc:121
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
Ptr< const AttributeAccessor > MakePointerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
Definition: pointer.h:227
Ptr< const AttributeChecker > MakeSsidChecker(void)
Definition: ssid.cc:118
Ptr< const AttributeAccessor > MakeSsidAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
Definition: ssid.h:105
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
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:165
#define NS_ABORT_MSG(msg)
Unconditional abnormal program termination with a message.
Definition: abort.h:50
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
Definition: abort.h:108
#define NS_ABORT_IF(cond)
Abnormal program termination if a condition is true.
Definition: abort.h:77
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Definition: log.h:273
#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:45
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:1260
Time NanoSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:1268
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
WifiStandard
Identifies the IEEE 802.11 specifications that a Wifi device can be configured to use.
AcIndex QosUtilsMapTidToAc(uint8_t tid)
Maps TID (Traffic ID) to Access classes.
Definition: qos-utils.cc:126
WifiPhyBand
Identifies the PHY band.
Definition: wifi-phy-band.h:33
AcIndex
This enumeration defines the Access Categories as an enumeration with values corresponding to the AC ...
Definition: qos-utils.h:71
@ WIFI_STANDARD_80211n
@ WIFI_STANDARD_80211g
@ WIFI_STANDARD_80211ax
@ WIFI_STANDARD_UNSPECIFIED
@ WIFI_STANDARD_80211ac
@ WIFI_STANDARD_80211b
@ WIFI_PHY_BAND_6GHZ
The 6 GHz band.
Definition: wifi-phy-band.h:39
@ WIFI_PHY_BAND_2_4GHZ
The 2.4 GHz band.
Definition: wifi-phy-band.h:35
@ WIFI_PHY_BAND_5GHZ
The 5 GHz band.
Definition: wifi-phy-band.h:37
@ WIFI_MOD_CLASS_HT
HT (Clause 19)
@ WIFI_MOD_CLASS_VHT
VHT (Clause 22)
@ WIFI_MOD_CLASS_HE
HE (Clause 27)
@ AC_BE_NQOS
Non-QoS.
Definition: qos-utils.h:81
@ AC_BE
Best Effort.
Definition: qos-utils.h:73
@ AC_VO
Voice.
Definition: qos-utils.h:79
@ AC_VI
Video.
Definition: qos-utils.h:77
@ AC_BK
Background.
Definition: qos-utils.h:75
@ AC_UNDEF
Total number of ACs.
Definition: qos-utils.h:85
@ AC_BEACON
Beacon queue.
Definition: qos-utils.h:83
address
Definition: first.py:44
Every class exported by the ns3 library is enclosed in the ns3 namespace.
TypeOfStation
Enumeration for type of station.
Definition: wifi-mac.h:52
Callback< R, Ts... > MakeCallback(R(T::*memPtr)(Ts...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
Definition: callback.h:1648
U * PeekPointer(const Ptr< U > &p)
Definition: ptr.h:415
ssid
Definition: third.py:100
phy
Definition: third.py:93
ns3::Time timeout
BlockAckActionValue blockAck
block ack
Definition: mgt-headers.h:960