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"
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"
38
39namespace ns3 {
40
41NS_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
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")),
73 MakeSsidAccessor (&WifiMac::GetSsid,
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
319void
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
335void
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
365 m_phy = 0;
366
367 m_device = 0;
368}
369
370void
372{
373 NS_LOG_FUNCTION (this << type);
374 m_typeOfStation = type;
375}
376
379{
380 return m_typeOfStation;
381}
382
383void
385{
386 m_device = device;
387}
388
391{
392 return m_device;
393}
394
395void
397{
398 NS_LOG_FUNCTION (this << address);
400}
401
404{
405 return m_address;
406}
407
408void
410{
411 NS_LOG_FUNCTION (this << ssid);
412 m_ssid = ssid;
413}
414
415Ssid
417{
418 return m_ssid;
419}
420
421void
423{
424 NS_LOG_FUNCTION (this << bssid);
425 m_bssid = bssid;
426 if (m_feManager)
427 {
428 m_feManager->SetBssid (bssid);
429 }
430}
431
434{
435 return m_bssid;
436}
437
438void
440{
441 NS_ASSERT (m_feManager != 0);
442 m_feManager->SetPromisc ();
443}
444
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
467WifiMac::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
503void
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
518void
520{
521 m_macTxTrace (packet);
522}
523
524void
526{
527 m_macTxDropTrace (packet);
528}
529
530void
532{
533 m_macRxTrace (packet);
534}
535
536void
538{
539 m_macPromiscRxTrace (packet);
540}
541
542void
544{
545 m_macRxDropTrace (packet);
546}
547
548void
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
571void
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
589void
590WifiMac::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
649void
651{
652 NS_LOG_FUNCTION (this << standard);
653
655
656 SetupFrameExchangeManager (standard);
657}
658
659void
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
691void
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
749void
751{
752 NS_LOG_FUNCTION (this << stationManager);
753 m_stationManager = stationManager;
754}
755
758{
759 return m_stationManager;
760}
761
762void
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
782void
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
792void
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
821bool
823{
824 return m_qosSupported;
825}
826
827bool
829{
830 return m_erpSupported;
831}
832
833void
835{
836 NS_LOG_FUNCTION (this);
837 if (enable)
838 {
839 SetDsssSupported (true);
840 }
841 m_erpSupported = enable;
842}
843
844void
846{
847 NS_LOG_FUNCTION (this);
848 m_dsssSupported = enable;
849}
850
851bool
853{
854 return m_dsssSupported;
855}
856
857void
859{
860 NS_LOG_FUNCTION (this);
861 m_ctsToSelfSupported = enable;
862}
863
864void
866{
867 NS_LOG_FUNCTION (this << enable);
869}
870
871bool
873{
875}
876
877bool
879{
880 return false;
881}
882
883void
885{
886 NS_LOG_FUNCTION (this);
887 m_forwardUp = upCallback;
888}
889
890void
892{
893 NS_LOG_FUNCTION (this);
894 m_linkUp = linkUp;
895}
896
897void
899{
900 NS_LOG_FUNCTION (this);
901 m_linkDown = linkDown;
902}
903
904void
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
915void
917{
918 NS_LOG_FUNCTION (this << packet << from << to);
919 m_forwardUp (packet, from, to);
920}
921
922void
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 {
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 {
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
1035void
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
1064bool
1066{
1067 if (GetHtConfiguration ())
1068 {
1069 return true;
1070 }
1071 return false;
1072}
1073
1074bool
1076{
1077 if (GetVhtConfiguration ())
1078 {
1079 return true;
1080 }
1081 return false;
1082}
1083
1084bool
1086{
1087 if (GetHeConfiguration ())
1088 {
1089 return true;
1090 }
1091 return false;
1092}
1093
1094void
1096{
1097 NS_LOG_FUNCTION (this << +threshold);
1098 if (m_qosSupported)
1099 {
1100 GetVOQueue ()->SetBlockAckThreshold (threshold);
1101 }
1102}
1103
1104void
1106{
1107 NS_LOG_FUNCTION (this << +threshold);
1108 if (m_qosSupported)
1109 {
1110 GetVIQueue ()->SetBlockAckThreshold (threshold);
1111 }
1112}
1113
1114void
1116{
1117 NS_LOG_FUNCTION (this << +threshold);
1118 if (m_qosSupported)
1119 {
1120 GetBEQueue ()->SetBlockAckThreshold (threshold);
1121 }
1122}
1123
1124void
1126{
1127 NS_LOG_FUNCTION (this << +threshold);
1128 if (m_qosSupported)
1129 {
1130 GetBKQueue ()->SetBlockAckThreshold (threshold);
1131 }
1132}
1133
1134void
1136{
1137 NS_LOG_FUNCTION (this << timeout);
1138 if (m_qosSupported)
1139 {
1141 }
1142}
1143
1144void
1146{
1147 NS_LOG_FUNCTION (this << timeout);
1148 if (m_qosSupported)
1149 {
1151 }
1152}
1153
1154void
1156{
1157 NS_LOG_FUNCTION (this << timeout);
1158 if (m_qosSupported)
1159 {
1161 }
1162}
1163
1164void
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 }
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 }
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 }
1340 {
1341 channelWidthSet |= 0x02;
1342 }
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
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
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
1403uint16_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.
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)
Definition: boolean.h:85
Ptr< const AttributeAccessor > MakePointerAccessor(T1 a1)
Definition: pointer.h:227
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
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.
U * PeekPointer(const Ptr< U > &p)
Definition: ptr.h:415
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
ssid
Definition: third.py:97
phy
Definition: third.py:93
ns3::Time timeout
BlockAckActionValue blockAck
block ack
Definition: mgt-headers.h:960