20#include "ns3/adhoc-wifi-mac.h"
21#include "ns3/channel-access-manager.h"
22#include "ns3/frame-exchange-manager.h"
23#include "ns3/interference-helper.h"
24#include "ns3/multi-model-spectrum-channel.h"
25#include "ns3/pointer.h"
26#include "ns3/qos-txop.h"
27#include "ns3/simulator.h"
28#include "ns3/spectrum-wifi-phy.h"
29#include "ns3/string.h"
37template <
typename TxopType>
46template <
typename TxopType>
63 void QueueTx(uint64_t txTime, uint64_t expectedGrantTime);
177template <
typename TxopType>
201 dcf->NotifyChannelAccessed(0);
214 m_test->NotifyChannelSwitching();
227template <
typename TxopType>
265 uint64_t eifsNoDifsNoSifs,
267 uint16_t chWidth = 20);
305 void AddRxOkEvt(uint64_t at, uint64_t duration);
318 void AddRxErrorEvt(uint64_t at, uint64_t duration, uint64_t timeUntilError);
330 void AddTxEvt(uint64_t at, uint64_t duration);
365 uint64_t expectedGrantTime,
377 uint64_t expectedGrantTime,
387 uint64_t expectedGrantTime,
399 const std::vector<Time>& per20MhzDurations = {});
422template <
typename TxopType>
426 m_expectedGrants.emplace_back(txTime, expectedGrantTime);
429template <
typename TxopType>
436template <
typename TxopType>
441 TxopType::DoDispose();
444template <
typename TxopType>
449 m_test->NotifyAccessGranted(m_i);
452template <
typename TxopType>
456 m_test->GenerateBackoff(m_i);
459template <
typename TxopType>
463 return !m_expectedGrants.empty();
466template <
typename TxopType>
472template <
typename TxopType>
478template <
typename TxopType>
484template <
typename TxopType>
490 if (!state->m_expectedGrants.empty())
492 std::pair<uint64_t, uint64_t> expected = state->m_expectedGrants.front();
493 state->m_expectedGrants.pop_front();
496 "Expected access grant is now");
497 m_ChannelAccessManager->NotifyTxStartNow(
MicroSeconds(expected.first));
498 m_ChannelAccessManager->NotifyAckTimeoutStartNow(
503template <
typename TxopType>
509 m_ChannelAccessManager,
513template <
typename TxopType>
519 "Have expected internal collisions");
520 if (!state->m_expectedInternalCollision.empty())
526 MicroSeconds(expected.at),
527 "Expected internal collision time is now");
528 state->StartBackoffNow(expected.nSlots, 0);
532template <typename TxopType>
538 if (!state->m_expectedBackoff.empty())
543 MicroSeconds(expected.at),
544 "Expected backoff is now");
545 state->StartBackoffNow(expected.nSlots, 0);
549template <typename TxopType>
553 for (
auto& state : m_txop)
555 if (!state->m_expectedGrants.empty())
557 std::pair<uint64_t, uint64_t> expected = state->m_expectedGrants.front();
558 state->m_expectedGrants.pop_front();
561 "Expected grant is now");
567template <
typename TxopType>
580template <typename TxopType>
587 backoff.nSlots = nSlots;
591template <typename TxopType>
601template <
typename TxopType>
608template <
typename TxopType>
612 uint64_t eifsNoDifsNoSifs,
616 m_ChannelAccessManager = CreateObject<ChannelAccessManagerStub>();
617 m_feManager = CreateObject<FrameExchangeManagerStub<TxopType>>(
this);
618 m_ChannelAccessManager->SetupFrameExchangeManager(m_feManager);
619 m_ChannelAccessManager->SetSlot(
MicroSeconds(slotTime));
621 m_ChannelAccessManager->SetEifsNoDifs(
MicroSeconds(eifsNoDifsNoSifs + sifs));
622 m_ackTimeoutValue = ackTimeoutValue;
627 m_phy = CreateObject<SpectrumWifiPhy>();
628 m_phy->SetInterferenceHelper(CreateObject<InterferenceHelper>());
629 m_phy->AddChannel(CreateObject<MultiModelSpectrumChannel>());
632 m_ChannelAccessManager->SetupPhyListener(m_phy);
635template <
typename TxopType>
640 m_txop.push_back(txop);
641 m_ChannelAccessManager->Add(txop);
643 auto mac = CreateObjectWithAttributes<AdhocWifiMac>(
646 mac->SetWifiPhys({
nullptr});
647 txop->SetWifiMac(mac);
648 txop->SetAifsn(aifsn);
651template <
typename TxopType>
657 for (
auto i = m_txop.begin(); i != m_txop.end(); i++)
663 "Have no internal collisions");
670 m_ChannelAccessManager->RemovePhyListener(m_phy);
672 m_ChannelAccessManager->Dispose();
673 m_ChannelAccessManager =
nullptr;
674 m_feManager =
nullptr;
678template <
typename TxopType>
684 m_ChannelAccessManager,
688 m_ChannelAccessManager);
691template <
typename TxopType>
697 m_ChannelAccessManager,
701template <
typename TxopType>
707 m_ChannelAccessManager,
711 m_ChannelAccessManager);
714template <
typename TxopType>
718 uint64_t timeUntilError)
722 m_ChannelAccessManager,
726 m_ChannelAccessManager);
729 m_ChannelAccessManager,
732 std::vector<Time>{});
735template <
typename TxopType>
741 m_ChannelAccessManager,
745template <
typename TxopType>
751 m_ChannelAccessManager,
755template <
typename TxopType>
761 m_ChannelAccessManager);
764template <
typename TxopType>
768 uint64_t expectedGrantTime,
771 AddAccessRequestWithSuccessfulAck(at, txTime, expectedGrantTime, 0, from);
774template <
typename TxopType>
778 uint64_t expectedGrantTime,
789template <
typename TxopType>
793 uint64_t expectedGrantTime,
804 AddAckTimeoutReset(expectedGrantTime + txTime + ackDelay);
807template <
typename TxopType>
810 uint64_t expectedGrantTime,
814 state->QueueTx(txTime, expectedGrantTime);
815 if (m_ChannelAccessManager->NeedBackoffUponAccess(state, hadFramesToTransmit,
true))
817 state->GenerateBackoff(0);
819 m_ChannelAccessManager->RequestAccess(state);
822template <
typename TxopType>
827 const std::vector<Time>& per20MhzDurations)
831 m_ChannelAccessManager,
837template <
typename TxopType>
843 m_ChannelAccessManager,
848template <
typename TxopType>
854 m_ChannelAccessManager,
871 AddAccessRequest(1, 1, 5, 0);
872 AddAccessRequest(8, 2, 12, 0);
883 AddAccessRequest(1, 1, 5, 0);
884 AddRxInsideSifsEvt(7, 10);
886 AddAccessRequest(14, 2, 18, 0);
904 AddAccessRequest(30, 2, 118, 0);
905 ExpectBackoff(30, 4, 0);
917 AddAccessRequest(30, 2, 70, 0);
918 ExpectBackoff(30, 0, 0);
931 AddAccessRequest(30, 2, 110, 0);
932 ExpectBackoff(30, 0, 0);
943 AddAccessRequest(62, 2, 72, 0);
954 AddAccessRequest(70, 2, 80, 0);
965 AddRxErrorEvt(20, 40);
966 AddAccessRequest(30, 2, 102, 0);
967 ExpectBackoff(30, 4, 0);
979 AddRxErrorEvt(20, 40);
980 AddAccessRequest(70, 2, 86, 0);
991 AddRxErrorEvt(20, 40, 20);
992 ExpectBusy(41,
true);
993 ExpectBusy(59,
true);
994 ExpectBusy(61,
false);
1003 StartTest(4, 6, 10);
1005 AddRxErrorEvt(20, 40);
1006 AddAccessRequest(30, 2, 101, 0);
1007 ExpectBackoff(30, 4, 0);
1020 StartTest(4, 6, 10);
1024 AddAccessRequest(30, 10, 78, 0);
1025 ExpectBackoff(30, 2, 0);
1026 AddAccessRequest(40, 2, 110, 1);
1027 ExpectBackoff(40, 0, 1);
1028 ExpectInternalCollision(78, 1, 1);
1038 StartTest(4, 6, 10);
1041 AddAccessRequestWithAckTimeout(20, 20, 34, 1);
1042 AddAccessRequest(64, 10, 80, 0);
1054 StartTest(4, 6, 10);
1057 AddAccessRequestWithSuccessfulAck(20, 20, 34, 2, 1);
1058 AddAccessRequest(55, 10, 62, 0);
1065 StartTest(4, 6, 10);
1067 AddAccessRequest(20, 20, 34, 0);
1069 AddAccessRequest(61, 10, 80, 0);
1070 ExpectBackoff(61, 1, 0);
1076 StartTest(4, 6, 10);
1079 AddNavStart(60, 15);
1082 AddAccessRequest(30, 10, 93, 0);
1083 ExpectBackoff(30, 2, 0);
1089 StartTest(4, 6, 10);
1092 AddNavStart(60, 15);
1095 AddAccessRequest(30, 10, 91, 0);
1096 ExpectBackoff(30, 2, 0);
1102 StartTest(4, 6, 10);
1105 AddAccessRequest(80, 10, 94, 0);
1108 StartTest(4, 6, 10);
1112 AddAccessRequest(30, 50, 108, 0);
1113 ExpectBackoff(30, 3, 0);
1121 StartTest(1, 3, 10);
1123 AddSwitchingEvt(0, 20);
1124 AddAccessRequest(21, 1, 25, 0);
1132 StartTest(1, 3, 10);
1134 AddSwitchingEvt(20, 20);
1135 AddCcaBusyEvt(30, 20);
1136 ExpectBackoff(45, 2, 0);
1137 AddAccessRequest(45, 1, 56, 0);
1144 StartTest(1, 3, 10);
1146 AddRxStartEvt(20, 40);
1147 AddSwitchingEvt(30, 20);
1148 AddAccessRequest(51, 1, 55, 0);
1155 StartTest(1, 3, 10);
1157 AddCcaBusyEvt(20, 40);
1158 AddSwitchingEvt(30, 20);
1159 AddAccessRequest(51, 1, 55, 0);
1166 StartTest(1, 3, 10);
1168 AddNavStart(20, 40);
1169 AddSwitchingEvt(30, 20);
1170 AddAccessRequest(51, 1, 55, 0);
1178 StartTest(1, 3, 10);
1180 AddAccessRequestWithAckTimeout(20, 20, 24, 0);
1181 AddAccessRequest(49, 1, 54, 0);
1182 AddSwitchingEvt(54, 5);
1183 AddAccessRequest(60, 1, 64, 0);
1191 StartTest(4, 6, 10);
1194 AddAccessRequest(30, 2, 80, 0);
1195 ExpectBackoff(30, 4, 0);
1196 AddSwitchingEvt(80, 20);
1197 AddAccessRequest(101, 2, 111, 0);
1215 StartTest(4, 6, 10, 20, 40);
1219 AddAccessRequest(52, 20, 60, 0);
1229 StartTest(4, 6, 10, 20, 80);
1233 AddAccessRequest(58, 20, 60, 0);
1243 StartTest(4, 6, 10, 20, 80);
1247 AddAccessRequest(62, 20, 64, 0);
1258 StartTest(4, 6, 10, 20, 160);
1260 AddRxErrorEvt(20, 30);
1262 AddAccessRequest(55, 20, 76, 0);
1273 StartTest(4, 6, 10, 20, 160);
1275 AddRxErrorEvt(20, 30);
1277 AddAccessRequest(70, 20, 76, 0);
1288 StartTest(4, 6, 10, 20, 160);
1290 AddRxErrorEvt(20, 30);
1292 AddAccessRequest(82, 20, 84, 0);
1301 StartTest(4, 6, 10);
1304 AddAccessRequest(30, 20, 76, 0);
1305 ExpectBackoff(30, 4, 0);
1316 StartTest(4, 6, 10);
1321 AddAccessRequest(30, 20, 107, 0);
1322 ExpectBackoff(30, 3, 0);
1345 void DoRun()
override;
1360 :
TestCase(
"Check calculation of the largest idle primary channel")
1395 std::vector<Time>(chWidth == 20 ? 0 : chWidth / 20,
Seconds(0)));
1400 uint16_t idleWidth = (busyChannel == WifiChannelListType::WIFI_CHANLIST_PRIMARY)
1402 : ((1 << (busyChannel - 1)) * 20);
1404 Time checkTime1 = start + ccaBusyStartDelay + ccaBusyDuration / 2;
1406 Time interval1 = (ccaBusyStartDelay + ccaBusyDuration) / 2;
1409 "Incorrect width of the idle channel in an interval "
1410 <<
"ending within CCA_BUSY (channel width: " << chWidth
1411 <<
" MHz, busy channel: " << busyChannel <<
")");
1417 Time checkTime2 = start + ccaBusyStartDelay + ccaBusyDuration + ccaBusyRxInterval / 2;
1419 Time interval2 = (ccaBusyDuration + ccaBusyRxInterval) / 2;
1422 "Incorrect width of the idle channel in an interval "
1423 <<
"starting within CCA_BUSY (channel width: " << chWidth
1424 <<
" MHz, busy channel: " << busyChannel <<
")");
1436 Time checkTime3 = start + ccaBusyStartDelay + ccaBusyDuration + ccaBusyRxInterval + rxDuration;
1438 Time interval3 = ccaBusyDuration / 2 + ccaBusyRxInterval;
1439 Time end3 = checkTime3 - rxDuration;
1442 "Incorrect width of the idle channel in an interval "
1443 <<
"preceding RX start and overlapping CCA_BUSY "
1444 <<
"(channel width: " << chWidth
1445 <<
" MHz, busy channel: " << busyChannel <<
")");
1450 const Time& checkTime4 = checkTime3;
1452 const Time& interval4 = ccaBusyRxInterval;
1453 Time end4 = checkTime4 - rxDuration;
1456 "Incorrect width of the idle channel in the interval "
1457 <<
"following CCA_BUSY and preceding RX start (channel "
1458 <<
"width: " << chWidth <<
" MHz, busy channel: " << busyChannel
1465 Time checkTime5 = checkTime4 + interval5;
1469 "Incorrect width of the idle channel in an interval "
1470 <<
"following RX end (channel width: " << chWidth
1471 <<
" MHz, busy channel: " << busyChannel <<
")");
1475 const Time& checkTime6 = checkTime5;
1477 Time interval6 = interval5 + rxDuration / 2;
1480 "Incorrect width of the idle channel in an interval "
1481 <<
"overlapping RX (channel width: " << chWidth
1482 <<
" MHz, busy channel: " << busyChannel <<
")");
1489 m_cam = CreateObject<ChannelAccessManager>();
1491 uint8_t channel = 0;
1492 std::list<WifiChannelListType> busyChannels;
1494 for (uint16_t chWidth : {20, 40, 80, 160})
1498 for (
const auto busyChannel : busyChannels)
1508 m_phy = CreateObject<SpectrumWifiPhy>();
1518 RunOne(chWidth, busyChannel);
static ChannelAccessManagerTestSuite g_camTestSuite
static TxopTestSuite g_dcfTestSuite
static QosTxopTestSuite g_edcaTestSuite
ChannelAccessManager Stub.
ChannelAccessManagerStub()
Time GetEifsNoDifs() const override
Return the EIFS duration minus a DIFS.
void SetEifsNoDifs(Time eifsNoDifs)
Set the duration of EIFS - DIFS.
void SetSlot(Time slot)
Set the slot duration.
Time GetSlot() const override
Return the slot duration for this PHY.
Time m_sifs
SIFS duration.
Time GetSifs() const override
Return the Short Interframe Space (SIFS) for this PHY.
void SetSifs(Time sifs)
Set the Short Interframe Space (SIFS).
Time m_eifsNoDifs
EIFS duration minus a DIFS.
Channel Access Manager Test.
void AddAccessRequestWithSuccessfulAck(uint64_t at, uint64_t txTime, uint64_t expectedGrantTime, uint32_t ackDelay, uint32_t from)
Add access request with successful ack.
void AddAckTimeoutReset(uint64_t at)
Add Ack timeout reset function.
void NotifyInternalCollision(Ptr< TxopTest< TxopType > > state)
Notify internal collision function.
void AddRxOkEvt(uint64_t at, uint64_t duration)
Add receive OK event function.
void AddRxStartEvt(uint64_t at, uint64_t duration)
Add receive start event function.
uint32_t m_ackTimeoutValue
the Ack timeout value
void AddAccessRequestWithAckTimeout(uint64_t at, uint64_t txTime, uint64_t expectedGrantTime, uint32_t from)
Add access request with Ack timeout.
ChannelAccessManagerTest()
void GenerateBackoff(uint32_t i)
Generate backoff function.
void NotifyAccessGranted(uint32_t i)
Notify access granted function.
std::vector< Ptr< TxopTest< TxopType > > > TxopTests
the TXOP tests typedef
void StartTest(uint64_t slotTime, uint64_t sifs, uint64_t eifsNoDifsNoSifs, uint32_t ackTimeoutValue=20, uint16_t chWidth=20)
Start test function.
void ExpectBackoff(uint64_t time, uint32_t nSlots, uint32_t from)
Expect generate backoff function.
void DoRun() override
Implementation to actually run this TestCase.
void AddTxop(uint32_t aifsn)
Add Txop function.
Ptr< SpectrumWifiPhy > m_phy
the PHY object
void DoAccessRequest(uint64_t txTime, uint64_t expectedGrantTime, Ptr< TxopTest< TxopType > > state)
Add access request with successful Ack.
void AddAccessRequest(uint64_t at, uint64_t txTime, uint64_t expectedGrantTime, uint32_t from)
Add access function.
void AddSwitchingEvt(uint64_t at, uint64_t duration)
Add switching event function.
Ptr< ChannelAccessManagerStub > m_ChannelAccessManager
the channel access manager
void AddRxErrorEvt(uint64_t at, uint64_t duration)
Add receive error event function for error at end of frame.
void ExpectBusy(uint64_t time, bool busy)
Schedule a check that the channel access manager is busy or idle.
void EndTest()
End test function.
void AddCcaBusyEvt(uint64_t at, uint64_t duration, WifiChannelListType channelType=WIFI_CHANLIST_PRIMARY, const std::vector< Time > &per20MhzDurations={})
Add CCA busy event function.
TxopTests m_txop
the vector of Txop test instances
void ExpectInternalCollision(uint64_t time, uint32_t nSlots, uint32_t from)
Expect internal collision function.
void AddNavStart(uint64_t at, uint64_t duration)
Add NAV start function.
void AddRxInsideSifsEvt(uint64_t at, uint64_t duration)
Add receive inside SIFS event function.
Ptr< FrameExchangeManagerStub< TxopType > > m_feManager
the Frame Exchange Manager stubbed
void DoCheckBusy(bool busy)
Perform check that channel access manager is busy or idle.
void AddNavReset(uint64_t at, uint64_t duration)
Add NAV reset function.
void AddTxEvt(uint64_t at, uint64_t duration)
Add transmit event function.
void NotifyChannelSwitching()
Notify channel switching function.
ChannelAccessManager Test Suite.
ChannelAccessManagerTestSuite()
Frame Exchange Manager Stub.
void NotifySwitchingStartNow(Time duration) override
void NotifyInternalCollision(Ptr< Txop > txop) override
Notify that an internal collision has occurred for the given Txop.
ChannelAccessManagerTest< TxopType > * m_test
the test DCF/EDCA manager
FrameExchangeManagerStub(ChannelAccessManagerTest< TxopType > *test)
Constructor.
bool StartTransmission(Ptr< Txop > dcf, uint16_t allowedWidth) override
Request the FrameExchangeManager to start a frame exchange sequence.
Test the calculation of the largest idle primary channel performed by ChannelAccessManager::GetLarges...
Ptr< SpectrumWifiPhy > m_phy
PHY object.
LargestIdlePrimaryChannelTest()
void RunOne(uint16_t chWidth, WifiChannelListType busyChannel)
Test a specific combination of operating channel width and busy channel type.
~LargestIdlePrimaryChannelTest() override=default
void DoRun() override
Implementation to actually run this TestCase.
Ptr< ChannelAccessManager > m_cam
channel access manager
ExpectedBackoffs m_expectedInternalCollision
expected backoff due to an internal collision
void DoDispose() override
Destructor implementation.
void GenerateBackoff(uint8_t linkId) override
Generate a new backoff for the given link now.
uint32_t m_i
the index of the Txop
void NotifyChannelAccessed(uint8_t linkId, Time txopDuration=Seconds(0)) override
Called by the FrameExchangeManager to notify that channel access has been granted on the given link f...
void QueueTx(uint64_t txTime, uint64_t expectedGrantTime)
Queue transmit function.
ExpectedBackoffs m_expectedBackoff
expected backoff (not due to an internal collision)
std::list< ExpectedGrant > ExpectedGrants
the collection of expected grants typedef
void NotifySleep(uint8_t linkId) override
Notify that the given link switched to sleep mode.
ChannelAccessManagerTest< TxopType > * m_test
Check if the Txop has frames to transmit.
ExpectedGrants m_expectedGrants
expected grants
std::list< ExpectedBackoff > ExpectedBackoffs
expected backoffs typedef
void NotifyWakeUp(uint8_t linkId) override
When wake up operation occurs on a link, channel access on that link will be restarted.
bool HasFramesToTransmit(uint8_t linkId) override
Check if the Txop has frames to transmit over the given link.
TxopTest(ChannelAccessManagerTest< TxopType > *test, uint32_t i)
Constructor.
std::pair< uint64_t, uint64_t > ExpectedGrant
the expected grant typedef
Manage a set of ns3::Txop.
uint16_t GetLargestIdlePrimaryChannel(Time interval, Time end)
Return the width of the largest primary channel that has been idle for the given time interval before...
void NotifyRxEndErrorNow()
Notify the Txop that a packet reception was just completed unsuccessfuly.
void NotifyRxStartNow(Time duration)
void NotifySwitchingStartNow(PhyListener *phyListener, Time duration)
void NotifyAckTimeoutResetNow()
Notify that ack timer has reset.
void NotifyTxStartNow(Time duration)
void NotifyRxEndOkNow()
Notify the Txop that a packet reception was just completed successfully.
void NotifyCcaBusyStartNow(Time duration, WifiChannelListType channelType, const std::vector< Time > &per20MhzDurations)
void RemovePhyListener(Ptr< WifiPhy > phy)
Remove current registered listener for PHY events on the given PHY.
void SetupPhyListener(Ptr< WifiPhy > phy)
Set up (or reactivate) listener for PHY events on the given PHY.
void NotifyNavResetNow(Time duration)
void NotifyNavStartNow(Time duration)
FrameExchangeManager is a base class handling the basic frame exchange sequences for non-QoS stations...
void Dispose()
Dispose of this Object.
AttributeValue implementation for Pointer.
Smart pointer class similar to boost::intrusive_ptr.
static EventId Schedule(const Time &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
static Time Now()
Return the current simulation virtual time.
static void Run()
Run the simulation.
void AddChannel(const Ptr< SpectrumChannel > channel, const FrequencyRange &freqRange=WHOLE_WIFI_SPECTRUM)
Attach a SpectrumChannel to use for a given frequency range.
Hold variables of type string.
void AddTestCase(TestCase *testCase, Duration duration=Duration::QUICK)
Add an individual child TestCase to this test suite.
Simulation virtual time values and global simulation resolution.
LinkEntity & GetLink(uint8_t linkId) const
Get a reference to the link associated with the given ID.
virtual void SetInterferenceHelper(const Ptr< InterferenceHelper > helper)
Sets the interference helper.
virtual void ConfigureStandard(WifiStandard standard)
Configure the PHY-level parameters for different Wi-Fi standard.
void SetOperatingChannel(const ChannelTuple &channelTuple)
If the standard for this object has not been set yet, store the given channel settings.
std::tuple< uint8_t, uint16_t, WifiPhyBand, uint8_t > ChannelTuple
Tuple identifying an operating channel.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
Time Now()
create an ns3::Time instance which contains the current simulation time.
#define NS_TEST_EXPECT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report if not.
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
Time Seconds(double value)
Construct a Time in the indicated unit.
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
WifiChannelListType
Enumeration of the possible channel-list parameter elements defined in Table 8-5 of IEEE 802....
@ WIFI_PHY_BAND_UNSPECIFIED
Unspecified.
@ WIFI_PHY_BAND_5GHZ
The 5 GHz band.
@ WIFI_CHANLIST_SECONDARY40
@ WIFI_CHANLIST_SECONDARY
@ WIFI_CHANLIST_SECONDARY80
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Ptr< T1 > DynamicCast(const Ptr< T2 > &p)
Cast a Ptr.
static constexpr uint8_t SINGLE_LINK_OP_ID
Link ID for single link operations (helps tracking places where correct link ID is to be used to supp...
-ns3 Test suite for the ns3 wrapper script
ExpectedBackoff structure.
uint32_t nSlots
number of slots
ChannelAccessStatus access
channel access status