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/qos-txop.h"
26 #include "ns3/simulator.h"
27 #include "ns3/spectrum-wifi-phy.h"
35 template <
typename TxopType>
44 template <
typename TxopType>
61 void QueueTx(uint64_t txTime, uint64_t expectedGrantTime);
68 void DoDispose()
override;
70 void NotifyChannelAccessed(uint8_t linkId,
Time txopDuration =
Seconds(0))
override;
72 bool HasFramesToTransmit(uint8_t linkId)
override;
74 void NotifySleep(uint8_t linkId)
override;
76 void NotifyWakeUp(uint8_t linkId)
override;
145 m_eifsNoDifs = eifsNoDifs;
175 template <
typename TxopType>
212 m_test->NotifyChannelSwitching();
225 template <
typename TxopType>
236 void NotifyAccessGranted(uint32_t i);
246 void GenerateBackoff(uint32_t i);
250 void NotifyChannelSwitching();
261 void StartTest(uint64_t slotTime,
263 uint64_t eifsNoDifsNoSifs,
264 uint32_t ackTimeoutValue = 20,
265 uint16_t chWidth = 20);
270 void AddTxop(uint32_t aifsn);
279 void ExpectInternalCollision(uint64_t time, uint32_t nSlots, uint32_t from);
286 void ExpectBackoff(uint64_t time, uint32_t nSlots, uint32_t from);
292 void ExpectBusy(uint64_t time,
bool busy);
297 void DoCheckBusy(
bool busy);
303 void AddRxOkEvt(uint64_t at, uint64_t duration);
309 void AddRxErrorEvt(uint64_t at, uint64_t duration);
316 void AddRxErrorEvt(uint64_t at, uint64_t duration, uint64_t timeUntilError);
322 void AddRxInsideSifsEvt(uint64_t at, uint64_t duration);
328 void AddTxEvt(uint64_t at, uint64_t duration);
334 void AddNavReset(uint64_t at, uint64_t duration);
340 void AddNavStart(uint64_t at, uint64_t duration);
345 void AddAckTimeoutReset(uint64_t at);
353 void AddAccessRequest(uint64_t at, uint64_t txTime, uint64_t expectedGrantTime, uint32_t from);
361 void AddAccessRequestWithAckTimeout(uint64_t at,
363 uint64_t expectedGrantTime,
373 void AddAccessRequestWithSuccessfulAck(uint64_t at,
375 uint64_t expectedGrantTime,
384 void DoAccessRequest(uint64_t txTime,
385 uint64_t expectedGrantTime,
394 void AddCcaBusyEvt(uint64_t at,
397 const std::vector<Time>& per20MhzDurations = {});
403 void AddSwitchingEvt(uint64_t at, uint64_t duration);
409 void AddRxStartEvt(uint64_t at, uint64_t duration);
420 template <
typename TxopType>
424 m_expectedGrants.emplace_back(txTime, expectedGrantTime);
427 template <
typename TxopType>
434 template <
typename TxopType>
439 TxopType::DoDispose();
442 template <
typename TxopType>
446 Txop::GetLink(0).access = Txop::NOT_REQUESTED;
447 m_test->NotifyAccessGranted(m_i);
450 template <
typename TxopType>
454 m_test->GenerateBackoff(m_i);
457 template <
typename TxopType>
461 return !m_expectedGrants.empty();
464 template <
typename TxopType>
470 template <
typename TxopType>
476 template <
typename TxopType>
482 template <
typename TxopType>
488 if (!state->m_expectedGrants.empty())
490 std::pair<uint64_t, uint64_t> expected = state->m_expectedGrants.front();
491 state->m_expectedGrants.pop_front();
494 "Expected access grant is now");
495 m_ChannelAccessManager->NotifyTxStartNow(
MicroSeconds(expected.first));
496 m_ChannelAccessManager->NotifyAckTimeoutStartNow(
501 template <
typename TxopType>
506 &ChannelAccessManager::NotifyTxStartNow,
507 m_ChannelAccessManager,
511 template <
typename TxopType>
517 "Have expected internal collisions");
518 if (!state->m_expectedInternalCollision.empty())
524 MicroSeconds(expected.at),
525 "Expected internal collision time is now");
526 state->StartBackoffNow(expected.nSlots, 0);
530 template <typename TxopType>
536 if (!state->m_expectedBackoff.empty())
541 MicroSeconds(expected.at),
542 "Expected backoff is now");
543 state->StartBackoffNow(expected.nSlots, 0);
547 template <typename TxopType>
551 for (
auto& state : m_txop)
553 if (!state->m_expectedGrants.empty())
555 std::pair<uint64_t, uint64_t> expected = state->m_expectedGrants.front();
556 state->m_expectedGrants.pop_front();
559 "Expected grant is now");
561 state->Txop::GetLink(0).access = Txop::NOT_REQUESTED;
565 template <
typename TxopType>
578 template <typename TxopType>
585 backoff.nSlots = nSlots;
589 template <typename TxopType>
599 template <
typename TxopType>
606 template <
typename TxopType>
610 uint64_t eifsNoDifsNoSifs,
611 uint32_t ackTimeoutValue,
614 m_ChannelAccessManager = CreateObject<ChannelAccessManagerStub>();
615 m_feManager = CreateObject<FrameExchangeManagerStub<TxopType>>(
this);
616 m_ChannelAccessManager->SetupFrameExchangeManager(m_feManager);
617 m_ChannelAccessManager->SetSlot(
MicroSeconds(slotTime));
619 m_ChannelAccessManager->SetEifsNoDifs(
MicroSeconds(eifsNoDifsNoSifs + sifs));
620 m_ackTimeoutValue = ackTimeoutValue;
625 m_phy = CreateObject<SpectrumWifiPhy>();
626 m_phy->SetInterferenceHelper(CreateObject<InterferenceHelper>());
627 m_phy->AddChannel(CreateObject<MultiModelSpectrumChannel>());
630 m_ChannelAccessManager->SetupPhyListener(m_phy);
633 template <
typename TxopType>
638 m_txop.push_back(txop);
639 m_ChannelAccessManager->Add(txop);
641 auto mac = CreateObject<AdhocWifiMac>();
642 mac->SetWifiPhys({
nullptr});
643 txop->SetWifiMac(
mac);
644 txop->SetAifsn(aifsn);
647 template <
typename TxopType>
653 for (
auto i = m_txop.begin(); i != m_txop.end(); i++)
659 "Have no internal collisions");
666 m_ChannelAccessManager->RemovePhyListener(m_phy);
668 m_ChannelAccessManager->Dispose();
669 m_ChannelAccessManager =
nullptr;
670 m_feManager =
nullptr;
671 Simulator::Destroy();
674 template <
typename TxopType>
679 &ChannelAccessManager::NotifyRxStartNow,
680 m_ChannelAccessManager,
683 &ChannelAccessManager::NotifyRxEndOkNow,
684 m_ChannelAccessManager);
687 template <
typename TxopType>
692 &ChannelAccessManager::NotifyRxStartNow,
693 m_ChannelAccessManager,
697 template <
typename TxopType>
702 &ChannelAccessManager::NotifyRxStartNow,
703 m_ChannelAccessManager,
706 &ChannelAccessManager::NotifyRxEndErrorNow,
707 m_ChannelAccessManager);
710 template <
typename TxopType>
714 uint64_t timeUntilError)
717 &ChannelAccessManager::NotifyRxStartNow,
718 m_ChannelAccessManager,
721 &ChannelAccessManager::NotifyRxEndErrorNow,
722 m_ChannelAccessManager);
724 &ChannelAccessManager::NotifyCcaBusyStartNow,
725 m_ChannelAccessManager,
728 std::vector<Time>{});
731 template <
typename TxopType>
736 &ChannelAccessManager::NotifyNavResetNow,
737 m_ChannelAccessManager,
741 template <
typename TxopType>
746 &ChannelAccessManager::NotifyNavStartNow,
747 m_ChannelAccessManager,
751 template <
typename TxopType>
756 &ChannelAccessManager::NotifyAckTimeoutResetNow,
757 m_ChannelAccessManager);
760 template <
typename TxopType>
764 uint64_t expectedGrantTime,
767 AddAccessRequestWithSuccessfulAck(at, txTime, expectedGrantTime, 0, from);
770 template <
typename TxopType>
774 uint64_t expectedGrantTime,
785 template <
typename TxopType>
789 uint64_t expectedGrantTime,
800 AddAckTimeoutReset(expectedGrantTime + txTime + ackDelay);
803 template <
typename TxopType>
806 uint64_t expectedGrantTime,
810 state->QueueTx(txTime, expectedGrantTime);
811 if (m_ChannelAccessManager->NeedBackoffUponAccess(state, hadFramesToTransmit,
true))
813 state->GenerateBackoff(0);
815 m_ChannelAccessManager->RequestAccess(state);
818 template <
typename TxopType>
823 const std::vector<Time>& per20MhzDurations)
826 &ChannelAccessManager::NotifyCcaBusyStartNow,
827 m_ChannelAccessManager,
833 template <
typename TxopType>
838 &ChannelAccessManager::NotifySwitchingStartNow,
839 m_ChannelAccessManager,
844 template <
typename TxopType>
849 &ChannelAccessManager::NotifyRxStartNow,
850 m_ChannelAccessManager,
867 AddAccessRequest(1, 1, 5, 0);
868 AddAccessRequest(8, 2, 12, 0);
879 AddAccessRequest(1, 1, 5, 0);
880 AddRxInsideSifsEvt(7, 10);
882 AddAccessRequest(14, 2, 18, 0);
900 AddAccessRequest(30, 2, 118, 0);
901 ExpectBackoff(30, 4, 0);
913 AddAccessRequest(30, 2, 70, 0);
914 ExpectBackoff(30, 0, 0);
927 AddAccessRequest(30, 2, 110, 0);
928 ExpectBackoff(30, 0, 0);
939 AddAccessRequest(62, 2, 72, 0);
950 AddAccessRequest(70, 2, 80, 0);
961 AddRxErrorEvt(20, 40);
962 AddAccessRequest(30, 2, 102, 0);
963 ExpectBackoff(30, 4, 0);
975 AddRxErrorEvt(20, 40);
976 AddAccessRequest(70, 2, 86, 0);
987 AddRxErrorEvt(20, 40, 20);
988 ExpectBusy(41,
true);
989 ExpectBusy(59,
true);
990 ExpectBusy(61,
false);
1001 AddRxErrorEvt(20, 40);
1002 AddAccessRequest(30, 2, 101, 0);
1003 ExpectBackoff(30, 4, 0);
1016 StartTest(4, 6, 10);
1020 AddAccessRequest(30, 10, 78, 0);
1021 ExpectBackoff(30, 2, 0);
1022 AddAccessRequest(40, 2, 110, 1);
1023 ExpectBackoff(40, 0, 1);
1024 ExpectInternalCollision(78, 1, 1);
1034 StartTest(4, 6, 10);
1037 AddAccessRequestWithAckTimeout(20, 20, 34, 1);
1038 AddAccessRequest(64, 10, 80, 0);
1050 StartTest(4, 6, 10);
1053 AddAccessRequestWithSuccessfulAck(20, 20, 34, 2, 1);
1054 AddAccessRequest(55, 10, 62, 0);
1061 StartTest(4, 6, 10);
1063 AddAccessRequest(20, 20, 34, 0);
1065 AddAccessRequest(61, 10, 80, 0);
1066 ExpectBackoff(61, 1, 0);
1072 StartTest(4, 6, 10);
1075 AddNavStart(60, 15);
1078 AddAccessRequest(30, 10, 93, 0);
1079 ExpectBackoff(30, 2, 0);
1085 StartTest(4, 6, 10);
1088 AddNavStart(60, 15);
1091 AddAccessRequest(30, 10, 91, 0);
1092 ExpectBackoff(30, 2, 0);
1098 StartTest(4, 6, 10);
1101 AddAccessRequest(80, 10, 94, 0);
1104 StartTest(4, 6, 10);
1108 AddAccessRequest(30, 50, 108, 0);
1109 ExpectBackoff(30, 3, 0);
1117 StartTest(1, 3, 10);
1119 AddSwitchingEvt(0, 20);
1120 AddAccessRequest(21, 1, 25, 0);
1128 StartTest(1, 3, 10);
1130 AddSwitchingEvt(20, 20);
1131 AddCcaBusyEvt(30, 20);
1132 ExpectBackoff(45, 2, 0);
1133 AddAccessRequest(45, 1, 56, 0);
1140 StartTest(1, 3, 10);
1142 AddRxStartEvt(20, 40);
1143 AddSwitchingEvt(30, 20);
1144 AddAccessRequest(51, 1, 55, 0);
1151 StartTest(1, 3, 10);
1153 AddCcaBusyEvt(20, 40);
1154 AddSwitchingEvt(30, 20);
1155 AddAccessRequest(51, 1, 55, 0);
1162 StartTest(1, 3, 10);
1164 AddNavStart(20, 40);
1165 AddSwitchingEvt(30, 20);
1166 AddAccessRequest(51, 1, 55, 0);
1174 StartTest(1, 3, 10);
1176 AddAccessRequestWithAckTimeout(20, 20, 24, 0);
1177 AddAccessRequest(49, 1, 54, 0);
1178 AddSwitchingEvt(54, 5);
1179 AddAccessRequest(60, 1, 64, 0);
1187 StartTest(4, 6, 10);
1190 AddAccessRequest(30, 2, 80, 0);
1191 ExpectBackoff(30, 4, 0);
1192 AddSwitchingEvt(80, 20);
1193 AddAccessRequest(101, 2, 111, 0);
1211 StartTest(4, 6, 10, 20, 40);
1215 AddAccessRequest(52, 20, 60, 0);
1225 StartTest(4, 6, 10, 20, 80);
1229 AddAccessRequest(58, 20, 60, 0);
1239 StartTest(4, 6, 10, 20, 80);
1243 AddAccessRequest(62, 20, 64, 0);
1254 StartTest(4, 6, 10, 20, 160);
1256 AddRxErrorEvt(20, 30);
1258 AddAccessRequest(55, 20, 76, 0);
1269 StartTest(4, 6, 10, 20, 160);
1271 AddRxErrorEvt(20, 30);
1273 AddAccessRequest(70, 20, 76, 0);
1284 StartTest(4, 6, 10, 20, 160);
1286 AddRxErrorEvt(20, 30);
1288 AddAccessRequest(82, 20, 84, 0);
1297 StartTest(4, 6, 10);
1300 AddAccessRequest(30, 20, 76, 0);
1301 ExpectBackoff(30, 4, 0);
1312 StartTest(4, 6, 10);
1317 AddAccessRequest(30, 20, 107, 0);
1318 ExpectBackoff(30, 3, 0);
1341 void DoRun()
override;
1356 :
TestCase(
"Check calculation of the largest idle primary channel")
1386 Simulator::Schedule(ccaBusyStartDelay,
1387 &ChannelAccessManager::NotifyCcaBusyStartNow,
1391 std::vector<Time>(chWidth == 20 ? 0 : chWidth / 20,
Seconds(0)));
1398 : ((1 << (busyChannel - 1)) * 20);
1400 Time checkTime1 =
start + ccaBusyStartDelay + ccaBusyDuration / 2;
1401 Simulator::Schedule(checkTime1 -
start, [=,
this]() {
1402 Time interval1 = (ccaBusyStartDelay + ccaBusyDuration) / 2;
1405 "Incorrect width of the idle channel in an interval "
1406 <<
"ending within CCA_BUSY (channel width: " << chWidth
1407 <<
" MHz, busy channel: " << busyChannel <<
")");
1413 Time checkTime2 =
start + ccaBusyStartDelay + ccaBusyDuration + ccaBusyRxInterval / 2;
1414 Simulator::Schedule(checkTime2 -
start, [=,
this]() {
1415 Time interval2 = (ccaBusyDuration + ccaBusyRxInterval) / 2;
1418 "Incorrect width of the idle channel in an interval "
1419 <<
"starting within CCA_BUSY (channel width: " << chWidth
1420 <<
" MHz, busy channel: " << busyChannel <<
")");
1425 Simulator::Schedule(ccaBusyStartDelay + ccaBusyDuration + ccaBusyRxInterval,
1426 &ChannelAccessManager::NotifyRxStartNow,
1432 Time checkTime3 =
start + ccaBusyStartDelay + ccaBusyDuration + ccaBusyRxInterval + rxDuration;
1433 Simulator::Schedule(checkTime3 -
start, [=,
this]() {
1434 Time interval3 = ccaBusyDuration / 2 + ccaBusyRxInterval;
1435 Time end3 = checkTime3 - rxDuration;
1438 "Incorrect width of the idle channel in an interval "
1439 <<
"preceding RX start and overlapping CCA_BUSY "
1440 <<
"(channel width: " << chWidth
1441 <<
" MHz, busy channel: " << busyChannel <<
")");
1446 const Time& checkTime4 = checkTime3;
1447 Simulator::Schedule(checkTime4 -
start, [=,
this]() {
1448 const Time& interval4 = ccaBusyRxInterval;
1449 Time end4 = checkTime4 - rxDuration;
1452 "Incorrect width of the idle channel in the interval "
1453 <<
"following CCA_BUSY and preceding RX start (channel "
1454 <<
"width: " << chWidth <<
" MHz, busy channel: " << busyChannel
1461 Time checkTime5 = checkTime4 + interval5;
1462 Simulator::Schedule(checkTime5 -
start, [=,
this]() {
1465 "Incorrect width of the idle channel in an interval "
1466 <<
"following RX end (channel width: " << chWidth
1467 <<
" MHz, busy channel: " << busyChannel <<
")");
1471 const Time& checkTime6 = checkTime5;
1472 Simulator::Schedule(checkTime6 -
start, [=,
this]() {
1473 Time interval6 = interval5 + rxDuration / 2;
1476 "Incorrect width of the idle channel in an interval "
1477 <<
"overlapping RX (channel width: " << chWidth
1478 <<
" MHz, busy channel: " << busyChannel <<
")");
1485 m_cam = CreateObject<ChannelAccessManager>();
1488 std::list<WifiChannelListType> busyChannels;
1490 for (uint16_t chWidth : {20, 40, 80, 160})
1494 for (
const auto busyChannel : busyChannels)
1496 Simulator::Schedule(
Seconds(delay), [=,
this]() {
1504 m_phy = CreateObject<SpectrumWifiPhy>();
1514 RunOne(chWidth, busyChannel);
1525 Simulator::Destroy();
1581 :
TestSuite(
"wifi-channel-access-manager", UNIT)
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 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 NotifyInternalCollision(Ptr< TxopTest< TxopType >> state)
Notify internal collision function.
void StartTest(uint64_t slotTime, uint64_t sifs, uint64_t eifsNoDifsNoSifs, uint32_t ackTimeoutValue=20, uint16_t chWidth=20)
Start test 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 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.
void DoAccessRequest(uint64_t txTime, uint64_t expectedGrantTime, Ptr< TxopTest< TxopType >> state)
Add access request with successful Ack.
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 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.
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 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.
FrameExchangeManager is a base class handling the basic frame exchange sequences for non-QoS stations...
void Dispose()
Dispose of this Object.
void AddChannel(const Ptr< SpectrumChannel > channel, const FrequencyRange &freqRange=WHOLE_WIFI_SPECTRUM)
Attach a SpectrumChannel to use for a given frequency range.
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Simulation virtual time values and global simulation resolution.
virtual void NotifyChannelAccessed(uint8_t linkId, Time txopDuration=Seconds(0))
Called by the FrameExchangeManager to notify that channel access has been granted on the given link f...
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.
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...
Ptr< T1 > DynamicCast(const Ptr< T2 > &p)
Cast a Ptr.
ExpectedBackoff structure.
uint32_t nSlots
number of slots