21 #include "ns3/boolean.h"
24 #include "ns3/wifi-net-device.h"
25 #include "ns3/mobility-helper.h"
26 #include "ns3/spectrum-wifi-helper.h"
27 #include "ns3/multi-model-spectrum-channel.h"
28 #include "ns3/config.h"
29 #include "ns3/rng-seed-manager.h"
30 #include "ns3/wifi-psdu.h"
31 #include "ns3/ap-wifi-mac.h"
32 #include "ns3/sta-wifi-mac.h"
33 #include "ns3/he-phy.h"
34 #include "ns3/he-configuration.h"
35 #include "ns3/ctrl-headers.h"
36 #include "ns3/tuple.h"
90 void SendDlSuPpdu (uint8_t bss, uint16_t txChannelWidth);
100 void SendDlMuPpdu (uint8_t bss, uint16_t txChannelWidth,
HeRu::RuType ruType, std::size_t nRus);
111 void SendHeTbPpdu (uint8_t bss, uint16_t txChannelWidth,
HeRu::RuType ruType, std::size_t nRus);
121 void DoSendHeTbPpdu (uint8_t bss, uint16_t txChannelWidth,
HeRu::RuType ruType, std::size_t nRus);
133 WifiTxVector txVector, std::vector<bool> perMpduStatus);
144 WifiTxVector txVector, std::vector<bool> perMpduStatus);
148 void CheckAssociation (
void);
159 void CheckReceivedSuPpdus (std::set<uint8_t> txBss, uint16_t txChannelWidth);
173 void CheckReceivedMuPpdus (std::set<uint8_t> txBss, uint16_t txChannelWidth,
HeRu::RuType ruType,
174 std::size_t nRus,
bool isDlMu);
184 void CheckReceivedTriggerFrames (std::set<uint8_t> txBss, uint16_t txChannelWidth);
187 void DoSetup (
void)
override;
188 void DoRun (
void)
override;
207 :
TestCase (
"Check correct transmissions for various primary channel settings"),
208 m_channelWidth (channelWidth),
209 m_useDistinctBssColors (useDistinctBssColors)
220 for (
const auto& psduPair : psduMap)
222 std::stringstream ss;
226 ss <<
" STA-ID " << psduPair.first;
228 ss <<
" " << psduPair.second->GetHeader (0).GetTypeString ()
229 <<
" seq " << psduPair.second->GetHeader (0).GetSequenceNumber ()
230 <<
" from " << psduPair.second->GetAddr2 ()
231 <<
" to " << psduPair.second->GetAddr1 ();
240 std::vector<bool> perMpduStatus)
248 NS_LOG_INFO (
"RECEIVED BY BSS=" << +bss <<
" STA=" << +station <<
" " << *psdu);
251 << +station <<
"] received a frame twice");
254 auto dev = DynamicCast<WifiNetDevice> (
m_staDevices[bss].Get (station));
259 << +station <<
"] processed a frame twice");
277 uint8_t station = staId - 1;
282 <<
" received a frame from station " << +station <<
" twice");
288 <<
" received a frame from station " << +station <<
" twice");
297 RngSeedManager::SetSeed (1);
298 RngSeedManager::SetRun (40);
299 int64_t streamNumber = 100;
340 spectrumChannel->AddPropagationLossModel (lossModel);
342 spectrumChannel->SetPropagationDelayModel (delayModel);
345 phy.SetChannel (spectrumChannel);
349 wifi.SetRemoteStationManager (
"ns3::ConstantRateWifiManager");
352 mac.SetType (
"ns3::StaWifiMac",
359 for (uint8_t bss = 0; bss <
m_nBss; bss++)
362 phy.Set (
"ChannelSettings", channelValue);
367 for (uint8_t bss = 0; bss <
m_nBss; bss++)
370 phy.Set (
"ChannelSettings", channelValue);
372 mac.SetType (
"ns3::ApWifiMac",
382 for (uint8_t bss = 0; bss <
m_nBss; bss++)
390 for (uint8_t bss = 0; bss <
m_nBss; bss++)
393 dev->GetHeConfiguration ()->SetBssColor (bss + 1);
400 positionAlloc->Add (Vector (0.0, 0.0, 0.0));
401 mobility.SetPositionAllocator (positionAlloc);
403 mobility.SetMobilityModel (
"ns3::ConstantPositionMobilityModel");
405 for (uint8_t bss = 0; bss <
m_nBss; bss++)
418 hdr.
SetAddr1 (Mac48Address::GetBroadcast ());
428 20,
false,
false,
false);
432 apDev->GetMac ()->GetWifiPhy ()->GetPhyBand ());
444 for (uint8_t bss = 0; bss <
m_nBss; bss++)
446 dev = DynamicCast<WifiNetDevice> (
m_staDevices[bss].Get (i));
447 Simulator::Schedule (i *
MicroSeconds (102400), &WifiMac::SetSsid,
454 for (uint8_t bss = 0; bss <
m_nBss; bss++)
457 auto mac = DynamicCast<ApWifiMac> (dev->
GetMac ());
469 for (uint8_t bss = 0; bss <
m_nBss; bss++)
473 auto dev = DynamicCast<WifiNetDevice> (
m_staDevices[bss].Get (i));
474 Simulator::Schedule (
m_time, &WifiPhy::SetReceiveOkCallback, dev->
GetPhy (),
479 Simulator::Schedule (
m_time, &WifiPhy::SetReceiveOkCallback, dev->
GetPhy (),
557 for (uint16_t txChannelWidth = 20, nRounds = 2, nApsPerRound =
m_channelWidth / 20 / 2;
559 txChannelWidth *= 2, nRounds *= 2, nApsPerRound /= 2)
561 nRounds = std::min<uint16_t> (nRounds,
m_nBss);
562 nApsPerRound = std::max<uint16_t> (nApsPerRound, 1);
564 for (uint16_t round = 0; round < nRounds; round++)
566 std::set<uint8_t> txBss;
568 for (uint16_t i = 0; i < nApsPerRound; i++)
570 uint16_t ap = round + i * nRounds;
577 this, txBss, txChannelWidth);
587 for (uint16_t txChannelWidth = 20, nRounds = 2, nApsPerRound =
m_channelWidth / 20 / 2;
589 txChannelWidth *= 2, nRounds *= 2, nApsPerRound /= 2)
591 nRounds = std::min<uint16_t> (nRounds,
m_nBss);
592 nApsPerRound = std::max<uint16_t> (nApsPerRound, 1);
594 for (uint16_t round = 0; round < nRounds; round++)
596 for (
unsigned int type = 0; type < 7; type++)
599 std::size_t nRus = HeRu::GetNRus (txChannelWidth, ruType);
600 std::set<uint8_t> txBss;
603 for (uint16_t i = 0; i < nApsPerRound; i++)
605 uint16_t ap = round + i * nRounds;
608 ap, txChannelWidth, ruType, nRus);
612 this, txBss, txChannelWidth, ruType, nRus,
true);
624 for (uint16_t txChannelWidth = 20, nRounds = 2, nApsPerRound =
m_channelWidth / 20 / 2;
626 txChannelWidth *= 2, nRounds *= 2, nApsPerRound /= 2)
628 nRounds = std::min<uint16_t> (nRounds,
m_nBss);
629 nApsPerRound = std::max<uint16_t> (nApsPerRound, 1);
631 for (uint16_t round = 0; round < nRounds; round++)
633 for (
unsigned int type = 0; type < 7; type++)
636 std::size_t nRus = HeRu::GetNRus (txChannelWidth, ruType);
637 std::set<uint8_t> txBss;
640 for (uint16_t i = 0; i < nApsPerRound; i++)
642 uint16_t ap = round + i * nRounds;
645 ap, txChannelWidth, ruType, nRus);
650 this, txBss, txChannelWidth);
652 this, txBss, txChannelWidth, ruType, nRus,
false);
660 Config::Connect (
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/PhyTxPsduBegin",
666 Simulator::Destroy ();
672 NS_LOG_INFO (
"*** BSS " << +bss <<
" transmits on primary " << txChannelWidth <<
" MHz channel");
675 auto staDev = DynamicCast<WifiNetDevice> (
m_staDevices[bss].Get (0));
677 uint8_t bssColor = apDev->GetHeConfiguration ()->GetBssColor ();
678 WifiTxVector txVector =
WifiTxVector (HePhy::GetHeMcs8 (), 0,
WIFI_PREAMBLE_HE_SU, 800, 1, 1, 0, txChannelWidth,
false,
false,
false, bssColor);
682 hdr.
SetAddr1 (staDev->GetMac ()->GetAddress ());
683 hdr.
SetAddr2 (apDev->GetMac ()->GetAddress ());
684 hdr.
SetAddr3 (apDev->GetMac ()->GetBssid ());
686 Ptr<WifiPsdu> psdu = Create<WifiPsdu> (Create<Packet> (1000), hdr);
693 NS_LOG_INFO (
"*** BSS " << +bss <<
" transmits on primary " << txChannelWidth
694 <<
" MHz channel a DL MU PPDU " <<
"addressed to " << nRus
695 <<
" stations (RU type: " << ruType <<
")");
698 uint8_t bssColor = apDev->GetHeConfiguration ()->GetBssColor ();
700 WifiTxVector txVector =
WifiTxVector (HePhy::GetHeMcs8 (), 0,
WIFI_PREAMBLE_HE_MU, 800, 1, 1, 0, txChannelWidth,
false,
false,
false, bssColor);
704 hdr.
SetAddr2 (apDev->GetMac ()->GetAddress ());
705 hdr.
SetAddr3 (apDev->GetMac ()->GetBssid ());
710 for (std::size_t i = 1; i <= nRus; i++)
712 bool primary80 = !(txChannelWidth == 160 && i > nRus / 2);
713 std::size_t index = (primary80 ? i : i - nRus / 2);
715 auto staDev = DynamicCast<WifiNetDevice> (
m_staDevices[bss].Get (i - 1));
716 uint16_t staId = DynamicCast<StaWifiMac> (staDev->GetMac ())->GetAssociationId ();
717 txVector.
SetHeMuUserInfo (staId, {{ruType, index, primary80}, HePhy::GetHeMcs8 (), 1});
718 hdr.
SetAddr1 (staDev->GetMac ()->GetAddress ());
719 psduMap[staId] = Create<const WifiPsdu> (Create<Packet> (1000), hdr);
721 apDev->GetPhy ()->Send (psduMap, txVector);
727 NS_LOG_INFO (
"*** BSS " << +bss <<
" transmits a Basic Trigger Frame");
738 bss, txChannelWidth, ruType, nRus);
745 uint8_t bssColor = apDev->GetHeConfiguration ()->GetBssColor ();
750 hdr.
SetAddr1 (apDev->GetMac ()->GetAddress ());
751 hdr.
SetAddr3 (apDev->GetMac ()->GetBssid ());
756 WifiTxVector trigVector (HePhy::GetHeMcs8 (), 0,
WIFI_PREAMBLE_HE_TB, 3200, 1, 1, 0, txChannelWidth,
false,
false,
false, bssColor);
758 for (std::size_t i = 1; i <= nRus; i++)
760 NS_LOG_INFO (
"*** BSS " << +bss <<
" STA " << i - 1 <<
" transmits on primary "
761 << txChannelWidth <<
" MHz channel an HE TB PPDU (RU type: " << ruType <<
")");
763 bool primary80 = !(txChannelWidth == 160 && i > nRus / 2);
764 std::size_t index = (primary80 ? i : i - nRus / 2);
766 auto staDev = DynamicCast<WifiNetDevice> (
m_staDevices[bss].Get (i - 1));
767 uint16_t staId = DynamicCast<StaWifiMac> (staDev->GetMac ())->GetAssociationId ();
769 WifiTxVector txVector (HePhy::GetHeMcs8 (), 0,
WIFI_PREAMBLE_HE_TB, 3200, 1, 1, 0, txChannelWidth,
false,
false,
false, bssColor);
770 txVector.
SetHeMuUserInfo (staId, {{ruType, index, primary80}, HePhy::GetHeMcs8 (), 1});
771 trigVector.
SetHeMuUserInfo (staId, {{ruType, index, primary80}, HePhy::GetHeMcs8 (), 1});
773 hdr.
SetAddr2 (staDev->GetMac ()->GetAddress ());
779 duration = WifiPhy::CalculateTxDuration (psdu->
GetSize (), txVector,
780 staDev->GetMac ()->GetWifiPhy ()->GetPhyBand (), staId);
781 std::tie (length, duration) = HePhy::ConvertHeTbPpduDurationToLSigLength (duration, txVector,
782 staDev->GetMac ()->GetWifiPhy ()->GetPhyBand ());
791 auto apHePhy = StaticCast<HePhy> (apDev->GetPhy ()->GetPhyEntity (
WIFI_MOD_CLASS_HE));
792 apHePhy->SetTrigVector (trigVector, duration);
798 for (uint8_t bss = 0; bss <
m_nBss; bss++)
801 auto mac = DynamicCast<ApWifiMac> (dev->GetMac ());
803 "Not all the stations completed association");
810 for (uint8_t bss = 0; bss <
m_nBss; bss++)
812 if (txBss.find (bss) != txBss.end ())
819 <<
"] did not receive the SU frame on primary" << txChannelWidth <<
" channel");
823 <<
" did not process the SU frame on primary" << txChannelWidth <<
" channel");
827 <<
"] processed the SU frame on primary" << txChannelWidth <<
" channel");
836 || std::none_of (txBss.begin (), txBss.end (),
837 [&](
const uint8_t& txAp)
839 auto txApPhy = DynamicCast<WifiNetDevice> (m_apDevices.Get (txAp))->GetPhy ();
840 auto thisApPhy = DynamicCast<WifiNetDevice> (m_apDevices.Get (bss))->GetPhy ();
841 return txApPhy->GetOperatingChannel ().GetPrimaryChannelIndex (txChannelWidth)
842 == thisApPhy->GetOperatingChannel ().GetPrimaryChannelIndex (txChannelWidth);
848 <<
"] received the SU frame on primary" << txChannelWidth <<
" channel");
857 <<
"] did not receive the SU frame on primary" << txChannelWidth <<
" channel");
859 <<
"] processed the SU frame on primary" << txChannelWidth <<
" channel");
873 for (uint8_t bss = 0; bss <
m_nBss; bss++)
875 if (txBss.find (bss) != txBss.end ())
880 for (uint8_t sta = 0; sta < nRus; sta++)
883 (isDlMu ?
"A DL MU PPDU transmitted to" :
"An HE TB PPDU transmitted by")
884 <<
" station [" << +bss <<
"][" << +sta <<
"] on primary"
885 << txChannelWidth <<
" channel, RU type " << ruType
886 <<
" was not received");
891 (isDlMu ?
"A DL MU PPDU" :
"An HE TB PPDU")
892 <<
" transmitted on primary" << txChannelWidth
893 <<
" channel, RU type " << ruType <<
" was received "
894 << (isDlMu ?
"by" :
"from") <<
" station [" << +bss <<
"]["
899 for (uint8_t sta = 0; sta < nRus; sta++)
902 (isDlMu ?
"A DL MU PPDU transmitted to" :
"An HE TB PPDU transmitted by")
903 <<
" station [" << +bss <<
"][" << +sta <<
"] on primary"
904 << txChannelWidth <<
" channel, RU type " << ruType
905 <<
" was not processed");
910 (isDlMu ?
"A DL MU PPDU" :
"An HE TB PPDU")
911 <<
" transmitted on primary" << txChannelWidth
912 <<
" channel, RU type " << ruType <<
" was received "
913 << (isDlMu ?
"by" :
"from") <<
" station [" << +bss <<
"]["
914 << +sta <<
"] and processed");
924 || std::none_of (txBss.begin (), txBss.end (),
925 [&](
const uint8_t& txAp)
927 auto txApPhy = DynamicCast<WifiNetDevice> (m_apDevices.Get (txAp))->GetPhy ();
928 auto thisApPhy = DynamicCast<WifiNetDevice> (m_apDevices.Get (bss))->GetPhy ();
929 return txApPhy->GetOperatingChannel ().GetPrimaryChannelIndex (txChannelWidth)
930 == thisApPhy->GetOperatingChannel ().GetPrimaryChannelIndex (txChannelWidth);
936 (isDlMu ?
"A DL MU PPDU" :
"An HE TB PPDU")
937 <<
" transmitted on primary" << txChannelWidth
938 <<
" channel, RU type " << ruType <<
" was received "
939 << (isDlMu ?
"by" :
"from") <<
" station [" << +bss <<
"]["
946 for (uint8_t sta = 0; sta < nRus; sta++)
949 (isDlMu ?
"A DL MU PPDU transmitted to" :
"An HE TB PPDU transmitted by")
950 <<
" station [" << +bss <<
"][" << +sta <<
"] on primary"
951 << txChannelWidth <<
" channel, RU type " << ruType
952 <<
" was not received");
957 (isDlMu ?
"A DL MU PPDU" :
"An HE TB PPDU")
958 <<
" transmitted on primary" << txChannelWidth
959 <<
" channel, RU type " << ruType <<
" was received "
960 << (isDlMu ?
"by" :
"from") <<
" station [" << +bss <<
"]["
967 (isDlMu ?
"A DL MU PPDU" :
"An HE TB PPDU")
968 <<
" transmitted on primary" << txChannelWidth
969 <<
" channel, RU type " << ruType <<
" was received "
970 << (isDlMu ?
"by" :
"from") <<
" station [" << +bss <<
"]["
971 << +sta <<
"] and processed");
984 for (uint8_t bss = 0; bss <
m_nBss; bss++)
986 if (txBss.find (bss) != txBss.end ())
993 <<
"] did not receive the Trigger Frame soliciting a transmission on primary"
994 << txChannelWidth <<
" channel");
996 <<
"] did not process the Trigger Frame soliciting a transmission on primary"
997 << txChannelWidth <<
" channel");
1007 <<
"] received the Trigger Frame soliciting a transmission on primary"
1008 << txChannelWidth <<
" channel");
1031 :
TestSuite (
"wifi-primary-channels", UNIT)
Test transmissions under different primary channel settings.
void ReceiveDl(uint8_t bss, uint8_t station, Ptr< WifiPsdu > psdu, RxSignalInfo rxSignalInfo, WifiTxVector txVector, std::vector< bool > perMpduStatus)
Callback invoked when a station receives a DL PPDU.
std::vector< std::bitset< 74 > > m_processed
whether the last packet transmitted to/from each of the (up to 74 per BSS) stations was processed
std::vector< std::bitset< 74 > > m_received
whether the last packet transmitted to/from each of the (up to 74 per BSS) stations was received
uint8_t m_nBss
number of BSSes
void DoSetup(void) override
Implementation to do any local setup required for this TestCase.
virtual ~WifiPrimaryChannelsTest()
void CheckAssociation(void)
Check that all stations associated with an AP.
void SendHeTbPpdu(uint8_t bss, uint16_t txChannelWidth, HeRu::RuType ruType, std::size_t nRus)
Have the AP of the given BSS transmit a Basic Trigger Frame.
void Transmit(std::string context, WifiConstPsduMap psduMap, WifiTxVector txVector, double txPowerW)
Callback invoked when PHY receives a PSDU to transmit.
Ptr< WifiPsdu > m_trigger
Basic Trigger Frame.
Time m_time
the time when the current action is executed
void CheckReceivedTriggerFrames(std::set< uint8_t > txBss, uint16_t txChannelWidth)
Check that (i) all stations belonging to the given BSSes received the transmitted Trigger Frame; and ...
void DoSendHeTbPpdu(uint8_t bss, uint16_t txChannelWidth, HeRu::RuType ruType, std::size_t nRus)
Have the STAs of the given BSS transmit an HE TB PPDU using the given transmission channel width and ...
Time m_triggerTxDuration
TX duration for Basic Trigger Frame.
uint16_t m_channelWidth
operating channel width in MHz
WifiPrimaryChannelsTest(uint16_t channelWidth, bool useDistinctBssColors)
Constructor.
uint8_t m_nStationsPerBss
number of stations per AP
void ReceiveUl(uint8_t bss, Ptr< WifiPsdu > psdu, RxSignalInfo rxSignalInfo, WifiTxVector txVector, std::vector< bool > perMpduStatus)
Callback invoked when an AP receives an UL PPDU.
std::vector< NetDeviceContainer > m_staDevices
containers for stations' NetDevices
void SendDlSuPpdu(uint8_t bss, uint16_t txChannelWidth)
Have the AP of the given BSS transmit a SU PPDU using the given transmission channel width.
NetDeviceContainer m_apDevices
container for AP's NetDevice
void SendDlMuPpdu(uint8_t bss, uint16_t txChannelWidth, HeRu::RuType ruType, std::size_t nRus)
Have the AP of the given BSS transmit a MU PPDU using the given transmission channel width and RU typ...
void CheckReceivedMuPpdus(std::set< uint8_t > txBss, uint16_t txChannelWidth, HeRu::RuType ruType, std::size_t nRus, bool isDlMu)
Check that (i) all stations/APs belonging to the given BSSes received the DL/UL MU PPDUs transmitted ...
bool m_useDistinctBssColors
true to set distinct BSS colors to BSSes
void CheckReceivedSuPpdus(std::set< uint8_t > txBss, uint16_t txChannelWidth)
Check that (i) all stations belonging to the given BSSes received the SU PPDUs transmitted over the g...
WifiTxVector m_triggerTxVector
TX vector for Basic Trigger Frame.
void DoRun(void) override
Implementation to actually run this TestCase.
wifi primary channels test suite
WifiPrimaryChannelsTestSuite()
AttributeValue implementation for Boolean.
RuType
The different HE Resource Unit (RU) types.
Helper class used to assign positions and mobility models to nodes.
holds a vector of ns3::NetDevice pointers
void Add(NetDeviceContainer other)
Append the contents of another NetDeviceContainer to the end of this container.
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
keep track of a set of node pointers.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
void AddHeader(const Header &header)
Add header to this packet.
Make it easy to create and manage PHY objects for the spectrum model.
The IEEE 802.11 SSID Information Element.
AttributeValue implementation for Ssid.
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Simulation virtual time values and global simulation resolution.
bool IsZero(void) const
Exactly equivalent to t == 0.
AttributeValue implementation for Time.
Hold objects of type std::tuple<Args...>.
void Set(const result_type &value)
Set the stored values.
helps to create WifiNetDevice objects
create MAC layers for a ns3::WifiNetDevice.
Ptr< WifiMac > GetMac(void) const
Ptr< WifiPhy > GetPhy(void) const
std::tuple< uint8_t, uint16_t, int, uint8_t > ChannelTuple
Tuple identifying an operating channel.
uint32_t GetSize(void) const
Return the size of the PSDU in bytes.
const WifiMacHeader & GetHeader(std::size_t i) const
Get the header of the i-th MPDU.
std::size_t GetNMpdus(void) const
Return the number of MPDUs constituting the PSDU.
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
void SetHeMuUserInfo(uint16_t staId, HeMuUserInfo userInfo)
Set the HE MU user-specific transmission information for the given STA-ID.
void SetLength(uint16_t length)
Set the LENGTH field of the L-SIG.
const HeMuUserInfoMap & GetHeMuUserInfoMap(void) const
Get a const reference to the map HE MU user-specific transmission information indexed by STA-ID.
bool IsUlMu(void) const
Return true if this TX vector is used for an uplink multi-user transmission.
void Connect(std::string path, const CallbackBase &cb)
#define NS_ABORT_MSG(msg)
Unconditional abnormal program termination with a message.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
#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.
@ WIFI_PHY_BAND_5GHZ
The 5 GHz band.
@ WIFI_MOD_CLASS_HE
HE (Clause 27)
NLOHMANN_BASIC_JSON_TPL_DECLARATION std::string to_string(const NLOHMANN_BASIC_JSON_TPL &j)
user-defined to_string function for JSON values
Every class exported by the ns3 library is enclosed in the ns3 namespace.
std::unordered_map< uint16_t, Ptr< const WifiPsdu > > WifiConstPsduMap
Map of const PSDUs indexed by STA-ID.
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...
RxSignalInfo structure containing info on the received signal.
static WifiPrimaryChannelsTestSuite g_wifiPrimaryChannelsTestSuite
the test suite