22 #include "ns3/string.h"
23 #include "ns3/qos-utils.h"
24 #include "ns3/packet.h"
25 #include "ns3/wifi-net-device.h"
26 #include "ns3/wifi-mac-header.h"
27 #include "ns3/he-frame-exchange-manager.h"
28 #include "ns3/wifi-acknowledgment.h"
29 #include "ns3/wifi-protection.h"
30 #include "ns3/he-configuration.h"
31 #include "ns3/mobility-helper.h"
32 #include "ns3/spectrum-wifi-helper.h"
33 #include "ns3/multi-model-spectrum-channel.h"
34 #include "ns3/packet-socket-server.h"
35 #include "ns3/packet-socket-client.h"
36 #include "ns3/packet-socket-helper.h"
37 #include "ns3/config.h"
38 #include "ns3/pointer.h"
39 #include "ns3/rng-seed-manager.h"
40 #include "ns3/wifi-psdu.h"
41 #include "ns3/multi-user-scheduler.h"
42 #include "ns3/he-phy.h"
67 static TypeId GetTypeId (
void);
73 TxFormat SelectTxFormat (
void)
override;
74 DlMuInfo ComputeDlMuInfo (
void)
override;
75 UlMuInfo ComputeUlMuInfo (
void)
override;
80 void ComputeWifiTxVector (
void);
97 static TypeId tid =
TypeId (
"ns3::TestMultiUserScheduler")
99 .SetGroupName (
"Wifi")
106 : m_txFormat (SU_TX),
146 Time duration = WifiPhy::CalculateTxDuration (ampduSize, txVector,
147 m_apMac->GetWifiPhy ()->GetPhyBand (),
148 m_apMac->GetStaList ().begin ()->first);
151 std::tie (length, duration) = HePhy::ConvertHeTbPpduDurationToLSigLength (duration,
153 m_apMac->GetWifiPhy ()->GetPhyBand ());
165 auto item = Create<WifiMacQueueItem> (packet,
m_triggerHdr);
175 +
m_apMac->GetWifiPhy ()->GetSifs ()
180 NS_LOG_DEBUG (
"Remaining TXOP duration is not enough for BSRP TF exchange");
191 const std::map<uint16_t, Mac48Address>& staList =
m_apMac->GetStaList ();
192 NS_ABORT_MSG_IF (staList.size () != 4,
"There must be 4 associated stations");
198 for (
auto& sta : staList)
213 NS_LOG_DEBUG (
"Not enough time to send frames to all the stations");
217 std::vector<Ptr<WifiMacQueueItem>> mpduList;
220 if (mpduList.size () > 1)
222 m_psduMap[sta.first] = Create<WifiPsdu> (std::move (mpduList));
226 m_psduMap[sta.first] = Create<WifiPsdu> (mpdu,
true);
250 uint16_t bw =
m_apMac->GetWifiPhy ()->GetChannelWidth ();
257 const std::map<uint16_t, Mac48Address>& staList =
m_apMac->GetStaList ();
258 NS_ABORT_MSG_IF (staList.size () != 4,
"There must be 4 associated stations");
264 ruType = HeRu::RU_52_TONE;
267 ruType = HeRu::RU_106_TONE;
270 ruType = HeRu::RU_242_TONE;
273 ruType = HeRu::RU_484_TONE;
279 bool primary80 =
true;
280 std::size_t ruIndex = 1;
282 for (
auto& sta : staList)
284 if (bw == 160 && ruIndex == 3)
290 {{ruType, ruIndex++, primary80},
WifiMode (
"HeMcs11"), 1});
348 uint16_t txopLimit, uint16_t nPktsPerSta,
365 void TraceCw (uint32_t staIndex, uint32_t oldCw, uint32_t cw);
383 void DoRun (
void)
override;
411 uint32_t maxAmpduSize, uint16_t txopLimit,
412 uint16_t nPktsPerSta,
414 :
TestCase (
"Check correct operation of DL OFDMA acknowledgment sequences"),
416 m_channelWidth (width),
417 m_dlMuAckType (dlType),
418 m_maxAmpduSize (maxAmpduSize),
419 m_txopLimit (txopLimit),
420 m_nPktsPerSta (nPktsPerSta),
421 m_muEdcaParameterSet (muEdcaParameterSet),
424 m_edcaDisabledStartTime (
Seconds (0)),
425 m_cwValues (std::vector<uint32_t> (m_nStations, 2))
458 if (!psduMap.begin ()->second->GetHeader (0).IsBeacon ()
466 for (
const auto& psduPair : psduMap)
468 NS_LOG_INFO (
"Sending " << psduPair.second->GetHeader (0).GetTypeString ()
469 <<
" #MPDUs " << psduPair.second->GetNMpdus ()
470 <<
" txDuration " << txDuration
471 <<
" duration/ID " << psduPair.second->GetHeader (0).GetDuration ()
472 <<
" #TX PSDUs = " <<
m_txPsdus.size ());
480 auto dev = DynamicCast<WifiNetDevice> (
m_apDevice);
483 for (
auto it = queue->begin (); it != queue->end (); )
486 if (!(*tmp)->IsInFlight ())
488 queue->Remove (*tmp,
false);
494 && psduMap.begin ()->second->GetHeader (0).HasData ())
496 Mac48Address sender = psduMap.begin ()->second->GetAddr2 ();
502 if (dev->GetAddress () == sender)
526 else if (!txVector.
IsMu () && psduMap.begin ()->second->GetHeader (0).IsBlockAck ()
531 psduMap.begin ()->second->GetPayload (0)->PeekHeader (blockAck);
550 ifs = (
m_txopLimit > 0 ? sifs : sifs + aifsn * slotTime),
574 true,
"Expected a Trigger Frame");
582 &&
m_txPsdus[1].psduMap.begin ()->second->GetNMpdus () == 8),
583 true,
"Expected 8 QoS Null frames in an HE TB PPDU");
584 for (uint8_t i = 0; i < 8; i++)
602 NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance,
"QoS Null frames in HE TB PPDU sent too late");
608 &&
m_txPsdus[2].psduMap.begin ()->second->GetNMpdus () == 8),
609 true,
"Expected 8 QoS Null frames in an HE TB PPDU");
610 for (uint8_t i = 0; i < 8; i++)
626 NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance,
"QoS Null frames in HE TB PPDU sent too late");
632 &&
m_txPsdus[3].psduMap.begin ()->second->GetNMpdus () == 8),
633 true,
"Expected 8 QoS Null frames in an HE TB PPDU");
634 for (uint8_t i = 0; i < 8; i++)
650 NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance,
"QoS Null frames in HE TB PPDU sent too late");
656 &&
m_txPsdus[4].psduMap.begin ()->second->GetNMpdus () == 8),
657 true,
"Expected 8 QoS Null frames in an HE TB PPDU");
658 for (uint8_t i = 0; i < 8; i++)
674 NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance,
"QoS Null frames in HE TB PPDU sent too late");
682 true,
"Expected a Trigger Frame");
697 &&
m_txPsdus[6].psduMap.begin ()->second->GetHeader (0).IsQosData ()),
698 true,
"Expected QoS data frames in an HE TB PPDU");
702 NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance,
"QoS data frames in HE TB PPDU sent too late");
707 &&
m_txPsdus[7].psduMap.begin ()->second->GetHeader (0).IsQosData ()),
708 true,
"Expected QoS data frames in an HE TB PPDU");
712 NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance,
"QoS data frames in HE TB PPDU sent too late");
717 &&
m_txPsdus[8].psduMap.begin ()->second->GetHeader (0).IsQosData ()),
718 true,
"Expected QoS data frames in an HE TB PPDU");
722 NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance,
"QoS data frames in HE TB PPDU sent too late");
727 &&
m_txPsdus[9].psduMap.begin ()->second->GetHeader (0).IsQosData ()),
728 true,
"Expected QoS data frames in an HE TB PPDU");
732 NS_TEST_EXPECT_MSG_LT (tStart, tEnd + sifs + tolerance,
"QoS data frames in HE TB PPDU sent too late");
738 true,
"Expected a Block Ack");
742 "Expected one Per AID TID Info subfield per station");
743 for (uint8_t i = 0; i < 4; i++)
767 "Expected a DL MU PPDU");
772 "TX duration cannot exceed max PPDU duration");
787 navEnd += psdu.second->GetDuration ();
792 "Duration/ID must be the same for all PSDUs");
797 std::size_t nTxPsdus = 0;
799 if (
m_dlMuAckType == WifiAcknowledgment::DL_MU_BAR_BA_SEQUENCE)
823 true,
"Expected a Block Ack");
832 true,
"Expected a Block Ack Request");
841 true,
"Expected a Block Ack");
850 true,
"Expected a Block Ack Request");
859 true,
"Expected a Block Ack");
868 true,
"Expected a Block Ack Request");
877 true,
"Expected a Block Ack");
899 else if (
m_dlMuAckType == WifiAcknowledgment::DL_MU_TF_MU_BAR)
921 true,
"Expected a MU-BAR Trigger Frame");
929 &&
m_txPsdus[13].psduMap.begin ()->second->GetHeader (0).IsBlockAck ()),
930 true,
"Expected a Block Ack");
939 &&
m_txPsdus[14].psduMap.begin ()->second->GetHeader (0).IsBlockAck ()),
940 true,
"Expected a Block Ack");
949 &&
m_txPsdus[15].psduMap.begin ()->second->GetHeader (0).IsBlockAck ()),
950 true,
"Expected a Block Ack");
959 &&
m_txPsdus[16].psduMap.begin ()->second->GetHeader (0).IsBlockAck ()),
960 true,
"Expected a Block Ack");
983 else if (
m_dlMuAckType == WifiAcknowledgment::DL_MU_AGGREGATE_TF)
1002 for (
auto& psdu :
m_txPsdus[11].psduMap)
1005 "Expected an aggregated MU-BAR Trigger Frame");
1011 &&
m_txPsdus[12].psduMap.begin ()->second->GetHeader (0).IsBlockAck ()),
1012 true,
"Expected a Block Ack");
1022 &&
m_txPsdus[13].psduMap.begin ()->second->GetHeader (0).IsBlockAck ()),
1023 true,
"Expected a Block Ack");
1033 &&
m_txPsdus[14].psduMap.begin ()->second->GetHeader (0).IsBlockAck ()),
1034 true,
"Expected a Block Ack");
1044 &&
m_txPsdus[15].psduMap.begin ()->second->GetHeader (0).IsBlockAck ()),
1045 true,
"Expected a Block Ack");
1056 "Not all DL packets have been received");
1063 for (std::size_t i = nTxPsdus; i <
m_txPsdus.size (); ++i)
1072 "A station transmitted before the MU EDCA timer expired");
1083 true,
"A station did not set the correct MU CW min");
1093 RngSeedManager::SetSeed (1);
1094 RngSeedManager::SetRun (1);
1095 int64_t streamNumber = 20;
1105 spectrumChannel->AddPropagationLossModel (lossModel);
1107 spectrumChannel->SetPropagationDelayModel (delayModel);
1110 phy.SetPcapDataLinkType (WifiPhyHelper::DLT_IEEE802_11_RADIO);
1111 phy.SetErrorRateModel (
"ns3::NistErrorRateModel");
1112 phy.SetChannel (spectrumChannel);
1116 phy.Set (
"ChannelSettings",
StringValue (
"{36, 20, BAND_5GHZ, 0}"));
1119 phy.Set (
"ChannelSettings",
StringValue (
"{38, 40, BAND_5GHZ, 0}"));
1122 phy.Set (
"ChannelSettings",
StringValue (
"{42, 80, BAND_5GHZ, 0}"));
1125 phy.Set (
"ChannelSettings",
StringValue (
"{50, 160, BAND_5GHZ, 0}"));
1128 NS_ABORT_MSG (
"Invalid channel bandwidth (must be 20, 40, 80 or 160)");
1152 wifi.SetRemoteStationManager (
"ns3::IdealWifiManager");
1156 mac.SetType (
"ns3::StaWifiMac",
1166 mac.SetType (
"ns3::ApWifiMac",
1171 mac.SetMultiUserScheduler (
"ns3::TestMultiUserScheduler");
1183 positionAlloc->Add (Vector (0.0, 0.0, 0.0));
1184 positionAlloc->Add (Vector (1.0, 0.0, 0.0));
1185 positionAlloc->Add (Vector (0.0, 1.0, 0.0));
1186 positionAlloc->Add (Vector (-1.0, 0.0, 0.0));
1187 positionAlloc->Add (Vector (-1.0, -1.0, 0.0));
1188 mobility.SetPositionAllocator (positionAlloc);
1190 mobility.SetMobilityModel (
"ns3::ConstantPositionMobilityModel");
1202 dev = DynamicCast<WifiNetDevice> (
m_apDevice);
1206 dev->
GetMac ()->GetAttribute (
"BE_Txop", ptr);
1229 client1->SetRemote (socket);
1230 wifiApNode.Get (0)->AddApplication (client1);
1232 client1->SetStopTime (
Seconds (2.0));
1237 client2->SetAttribute (
"PacketSize",
UintegerValue (1400 + i * 100));
1240 client2->SetRemote (socket);
1241 wifiApNode.Get (0)->AddApplication (client2);
1242 client2->SetStartTime (
Seconds (1.5));
1243 client2->SetStopTime (
Seconds (2.5));
1246 server->SetLocal (socket);
1248 server->SetStartTime (
Seconds (0.0));
1249 server->SetStopTime (
Seconds (3.0));
1266 client1->SetRemote (socket);
1269 client1->SetStopTime (
Seconds (2.0));
1274 client2->SetAttribute (
"PacketSize",
UintegerValue (1400 + i * 100));
1277 client2->SetRemote (socket);
1279 client2->SetStartTime (
Seconds (1.50011));
1280 client2->SetStopTime (
Seconds (2.5));
1283 server->SetLocal (socket);
1285 server->SetStartTime (
Seconds (0.0));
1286 server->SetStopTime (
Seconds (3.0));
1289 Config::Connect (
"/NodeList/*/ApplicationList/0/$ns3::PacketSocketServer/Rx",
1292 Config::Connect (
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/PhyTxPsduBegin",
1295 Simulator::Stop (
Seconds (3));
1301 Simulator::Destroy ();
1320 using MuEdcaParams = std::initializer_list<OfdmaAckSequenceTest::MuEdcaParameterSet>;
1322 for (
auto& muEdcaParameterSet : MuEdcaParams {{0, 0, 0, 0} ,
1323 {0, 127, 2047, 100} ,
1324 {10, 127, 2047, 100} })
Test OFDMA acknowledgment sequences.
virtual ~OfdmaAckSequenceTest()
std::vector< FrameInfo > m_txPsdus
transmitted PSDUs
Time m_edcaDisabledStartTime
time when disabling EDCA started
uint16_t m_flushed
number of DL packets flushed after DL MU PPDU
void Transmit(std::string context, WifiConstPsduMap psduMap, WifiTxVector txVector, double txPowerW)
Callback invoked when FrameExchangeManager passes PSDUs to the PHY.
OfdmaAckSequenceTest(uint16_t width, WifiAcknowledgment::Method dlType, uint32_t maxAmpduSize, uint16_t txopLimit, uint16_t nPktsPerSta, MuEdcaParameterSet muEdcaParameterSet)
Constructor.
uint16_t m_received
number of packets received by the stations
void CheckResults(Time sifs, Time slotTime, uint8_t aifsn)
Check correctness of transmitted frames.
WifiAcknowledgment::Method m_dlMuAckType
DL MU ack sequence type.
Ptr< NetDevice > m_apDevice
AP's device.
uint16_t m_nPktsPerSta
number of packets to send to each station
NetDeviceContainer m_staDevices
stations' devices
uint16_t m_txopLimit
TXOP limit in microseconds.
void L7Receive(std::string context, Ptr< const Packet > p, const Address &addr)
Function to trace packets received by the server application.
uint16_t m_channelWidth
PHY channel bandwidth in MHz.
uint32_t m_maxAmpduSize
maximum A-MPDU size in bytes
std::vector< uint32_t > m_cwValues
CW used by stations after MU exchange.
void DoRun(void) override
Implementation to actually run this TestCase.
void TraceCw(uint32_t staIndex, uint32_t oldCw, uint32_t cw)
Function to trace CW value used by the given station after the MU exchange.
uint16_t m_nStations
number of stations
MuEdcaParameterSet m_muEdcaParameterSet
MU EDCA Parameter Set.
Dummy Multi User Scheduler used to test OFDMA ack sequences.
TxFormat SelectTxFormat(void) override
Select the format of the next transmission.
WifiPsduMap m_psduMap
the DL MU PPDU to transmit
virtual ~TestMultiUserScheduler()
TxFormat m_txFormat
the format of next transmission
WifiTxVector m_txVector
the TX vector for MU PPDUs
UlMuInfo ComputeUlMuInfo(void) override
Prepare the information required to solicit an UL MU transmission.
static TypeId GetTypeId(void)
Get the type ID.
TriggerFrameType m_ulTriggerType
Trigger Frame type for UL MU.
WifiTxParameters m_txParams
TX parameters.
DlMuInfo ComputeDlMuInfo(void) override
Compute the information required to perform a DL MU transmission.
void ComputeWifiTxVector(void)
Compute the TX vector to use for MU PPDUs.
WifiMacHeader m_triggerHdr
MAC header for Trigger Frame.
CtrlTriggerHeader m_trigger
Trigger Frame to send.
wifi MAC OFDMA Test Suite
a polymophic address class
AttributeValue implementation for Boolean.
Hold variables of type enum.
RuType
The different HE Resource Unit (RU) types.
Helper class used to assign positions and mobility models to nodes.
MultiUserScheduler is an abstract base class defining the API that APs supporting at least VHT can us...
bool m_initialFrame
true if a TXOP is being started
Ptr< ApWifiMac > m_apMac
the AP wifi MAC
Time m_availableTime
the time available for frame exchange
Ptr< HeFrameExchangeManager > m_heFem
HE Frame Exchange Manager.
Ptr< WifiRemoteStationManager > GetWifiRemoteStationManager(void) const
Get the station manager attached to the AP.
uint32_t m_sizeOf8QosNull
size in bytes of 8 QoS Null frames
TxFormat
Enumeration of the possible transmission formats.
holds a vector of ns3::NetDevice pointers
uint32_t GetN(void) const
Get the number of Ptr<NetDevice> stored in this container.
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
virtual Address GetAddress(void) const =0
virtual uint32_t GetIfIndex(void) const =0
keep track of a set of node pointers.
bool TraceConnectWithoutContext(std::string name, const CallbackBase &cb)
Connect a TraceSource to a Callback without a context.
void AddHeader(const Header &header)
Add header to this packet.
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
an address for a packet socket
void SetProtocol(uint16_t protocol)
Set the protocol.
void SetPhysicalAddress(const Address address)
Set the destination address.
void SetSingleDevice(uint32_t device)
Set the address to match only a specified NetDevice.
Give ns3::PacketSocket powers to ns3::Node.
void Install(Ptr< Node > node) const
Aggregate an instance of a ns3::PacketSocketFactory onto the provided node.
Hold objects of type Ptr<T>.
Handle packet fragmentation and retransmissions for QoS data frames as well as MSDU aggregation (A-MS...
uint8_t GetAifsn(void) const override
Return the number of slots that make up an AIFS according to the EDCA Parameter Set or the MU EDCA Pa...
Make it easy to create and manage PHY objects for the spectrum model.
The IEEE 802.11 SSID Information Element.
AttributeValue implementation for Ssid.
Hold variables of type string.
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Simulation virtual time values and global simulation resolution.
int64_t GetMicroSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
AttributeValue implementation for Time.
Ptr< WifiMacQueue > GetWifiMacQueue() const
Return the packet queue associated with this Txop.
void SetTxopLimit(Time txopLimit)
Set the TXOP limit.
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Hold an unsigned integer type.
helps to create WifiNetDevice objects
create MAC layers for a ns3::WifiNetDevice.
represent a single transmission mode
Ptr< WifiMac > GetMac(void) const
This class stores the TX parameters (TX vector, protection mechanism, acknowledgment mechanism,...
void Clear(void)
Reset the TX parameters.
std::unique_ptr< WifiProtection > m_protection
protection method
std::unique_ptr< WifiAcknowledgment > m_acknowledgment
acknowledgment method
Time m_txDuration
TX duration of the frame.
WifiTxVector m_txVector
TXVECTOR of the frame being prepared.
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
void SetTxPowerLevel(uint8_t powerlevel)
Sets the selected transmission power level.
void SetChannelWidth(uint16_t channelWidth)
Sets the selected channelWidth (in MHz)
void SetGuardInterval(uint16_t guardInterval)
Sets the guard interval duration (in nanoseconds)
void SetHeMuUserInfo(uint16_t staId, HeMuUserInfo userInfo)
Set the HE MU user-specific transmission information for the given STA-ID.
WifiPreamble GetPreambleType(void) const
bool IsMu(void) const
Return true if this TX vector is used for a multi-user transmission.
void SetPreambleType(WifiPreamble preamble)
Sets the preamble type.
void SetDefault(std::string name, const AttributeValue &value)
void Connect(std::string path, const CallbackBase &cb)
#define NS_ABORT_MSG(msg)
Unconditional abnormal program termination with a message.
#define NS_ABORT_MSG_IF(cond, msg)
Abnormal program termination if a condition is true, with a message.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
#define NS_LOG_FUNCTION_NOARGS()
Output the name of the function.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Time Now(void)
create an ns3::Time instance which contains the current simulation time.
#define NS_TEST_EXPECT_MSG_GT_OR_EQ(actual, limit, msg)
Test that an actual value is greater than or equal to limit and report if not.
#define NS_TEST_EXPECT_MSG_LT_OR_EQ(actual, limit, msg)
Test that an actual value is less than or equal to a limit and report if not.
#define NS_TEST_EXPECT_MSG_LT(actual, limit, msg)
Test that an actual value is less than a limit and report if not.
#define NS_TEST_EXPECT_MSG_GT(actual, limit, msg)
Test that an actual value is greater than a limit and report if not.
#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 NanoSeconds(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.
TriggerFrameType
The different Trigger frame types.
@ WIFI_PHY_BAND_5GHZ
The 5 GHz band.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Time GetPpduMaxTime(WifiPreamble preamble)
Get the maximum PPDU duration (see Section 10.14 of 802.11-2016) for the PHY layers defining the aPPD...
std::unordered_map< uint16_t, Ptr< const WifiPsdu > > WifiConstPsduMap
Map of const PSDUs indexed by STA-ID.
std::unordered_map< uint16_t, Ptr< WifiPsdu > > WifiPsduMap
Map of 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...
Information about transmitted frames.
Time startTx
start TX time
WifiTxVector txVector
TXVECTOR.
WifiConstPsduMap psduMap
transmitted PSDU map
uint8_t muAifsn
MU AIFS (0 to disable EDCA)
uint16_t muCwMin
MU CW min.
uint8_t muTimer
MU EDCA Timer in units of 8192 microseconds (0 not to use MU EDCA)
uint16_t muCwMax
MU CW max.
Information to be provided in case of DL MU transmission.
Information to be provided in case of UL MU transmission.
Method
Available acknowledgment methods.
static WifiMacOfdmaTestSuite g_wifiMacOfdmaTestSuite
the test suite