20#include "ns3/ap-wifi-mac.h"
21#include "ns3/boolean.h"
22#include "ns3/config.h"
23#include "ns3/he-phy.h"
25#include "ns3/mobility-helper.h"
26#include "ns3/multi-model-spectrum-channel.h"
27#include "ns3/packet-socket-client.h"
28#include "ns3/packet-socket-helper.h"
29#include "ns3/packet-socket-server.h"
30#include "ns3/packet.h"
31#include "ns3/pointer.h"
32#include "ns3/qos-txop.h"
33#include "ns3/qos-utils.h"
34#include "ns3/rng-seed-manager.h"
35#include "ns3/spectrum-wifi-helper.h"
36#include "ns3/string.h"
38#include "ns3/wifi-mac-header.h"
39#include "ns3/wifi-net-device.h"
40#include "ns3/wifi-ppdu.h"
41#include "ns3/wifi-psdu.h"
111 void DoRun()
override;
146 :
TestCase(
"Check correct operation within TXOPs"),
150 m_nonHt(params.nonHt),
151 m_payloadSizeRtsOn(m_nonHt ? 2000 : 540),
152 m_payloadSizeRtsOff(500),
154 m_mode(m_nonHt ?
OfdmPhy::GetOfdmRate12Mbps() :
HePhy::GetHeMcs0()),
155 m_pifsRecovery(params.pifsRecovery),
156 m_singleRtsPerTxop(params.singleRtsPerTxop),
157 m_lengthBasedRtsCtsThresh(params.lengthBasedRtsCtsThresh),
160 m_apCorrupted(false),
161 m_staCorrupted(false)
180 bool corrupted{
false};
184 if (
const auto& hdr = psduMap.begin()->second->GetHeader(0);
194 if (
const auto& hdr = psduMap.begin()->second->GetHeader(0);
224 NS_LOG_INFO(psduMap.begin()->second->GetHeader(0).GetTypeString()
225 <<
" seq " << psduMap.begin()->second->GetHeader(0).GetSequenceNumber() <<
" to "
226 << psduMap.begin()->second->GetAddr1() <<
" TX duration "
228 <<
" duration/ID " << psduMap.begin()->second->GetHeader(0).GetDuration()
229 << (corrupted ?
" CORRUPTED" :
"") << std::endl);
237 int64_t streamNumber = 100;
240 wifiApNode.Create(1);
245 auto spectrumChannel = CreateObject<MultiModelSpectrumChannel>();
246 auto lossModel = CreateObject<FriisPropagationLossModel>();
247 spectrumChannel->AddPropagationLossModel(lossModel);
248 auto delayModel = CreateObject<ConstantSpeedPropagationDelayModel>();
249 spectrumChannel->SetPropagationDelayModel(delayModel);
252 phy.SetChannel(spectrumChannel);
254 phy.Set(
"ChannelSettings",
StringValue(
"{0, 20, BAND_5GHZ, 0}"));
273 wifi.SetRemoteStationManager(
"ns3::ConstantRateWifiManager",
280 mac.SetType(
"ns3::StaWifiMac",
288 mac.SetType(
"ns3::ApWifiMac",
295 "EnableBeaconJitter",
304 dev->GetMac()->SetSsid(
Ssid(
"wifi-txop-ssid"));
312 Ssid(
"wifi-txop-ssid"));
321 positionAlloc->Add(Vector(0.0, 0.0, 0.0));
322 positionAlloc->Add(Vector(1.0, 0.0, 0.0));
323 positionAlloc->Add(Vector(0.0, 1.0, 0.0));
324 positionAlloc->Add(Vector(-1.0, 0.0, 0.0));
325 mobility.SetPositionAllocator(positionAlloc);
327 mobility.SetMobilityModel(
"ns3::ConstantPositionMobilityModel");
328 mobility.Install(wifiApNode);
329 mobility.Install(wifiStaNodes);
334 dev->GetMac()->GetAttribute(
"BE_Txop", ptr);
340 packetSocket.
Install(wifiApNode);
341 packetSocket.
Install(wifiStaNodes);
355 auto client = CreateObject<PacketSocketClient>();
359 client->SetRemote(socket);
360 wifiApNode.Get(0)->AddApplication(client);
362 client->SetStopTime(
Seconds(1.0));
366 auto client1 = CreateObject<PacketSocketClient>();
370 client1->SetRemote(socket);
371 wifiApNode.Get(0)->AddApplication(client1);
373 client1->SetStopTime(
Seconds(1.0));
376 auto client2 = CreateObject<PacketSocketClient>();
380 client2->SetRemote(socket);
381 wifiApNode.Get(0)->AddApplication(client2);
383 client2->SetStopTime(
Seconds(1.0));
385 auto server = CreateObject<PacketSocketServer>();
386 server->SetLocal(socket);
387 wifiStaNodes.Get(i)->AddApplication(server);
388 server->SetStartTime(
Seconds(0.0));
389 server->SetStopTime(
Seconds(1.0));
394 dev->GetMac()->GetWifiPhy()->SetPostReceptionErrorModel(
m_apErrorModel);
398 dev->GetMac()->GetWifiPhy()->SetPostReceptionErrorModel(
m_staErrorModel);
411 auto client = CreateObject<PacketSocketClient>();
415 client->SetRemote(socket);
416 wifiStaNodes.Get(0)->AddApplication(client);
418 client->SetStopTime(
Seconds(1.0));
421 auto client = CreateObject<PacketSocketClient>();
425 client->SetRemote(socket);
426 wifiStaNodes.Get(0)->AddApplication(client);
428 client->SetStopTime(
Seconds(1.0));
430 auto server = CreateObject<PacketSocketServer>();
431 server->SetLocal(socket);
432 wifiApNode.Get(0)->AddApplication(server);
433 server->SetStartTime(
Seconds(0.0));
434 server->SetStopTime(
Seconds(1.0));
437 Config::Connect(
"/NodeList/*/ApplicationList/*/$ns3::PacketSocketServer/Rx",
440 Config::Connect(
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/PhyTxPsduBegin",
454 const auto apDev = DynamicCast<WifiNetDevice>(
m_apDevices.
Get(0));
459 Time sifs = apDev->GetPhy()->GetSifs();
460 Time slot = apDev->GetPhy()->GetSlot();
466 const Time rtsCtsTxDurationThresh = DynamicCast<const TimeValue>(info.
initialValue)->Get();
469 auto RoundDurationId = [](
Time t) {
470 return MicroSeconds(ceil(
static_cast<double>(t.GetNanoSeconds()) / 1000));
498 "Unexpected number of transmitted frames");
505 DynamicCast<WifiNetDevice>(
m_staDevices.
Get(0))->GetMac()->GetAddress(),
506 "Expected a frame sent by the AP to the first station");
511 "PSDU size expected not to exceed length based RTS/CTS threshold");
517 rtsCtsTxDurationThresh,
518 "PSDU duration expected not to exceed duration based RTS/CTS threshold");
522 "Duration/ID of the first frame must cover the whole TXOP");
530 tEnd + sifs + tolerance,
531 "Ack in response to the first frame sent too late");
534 apDev->GetMac()->GetAddress(),
535 "Expected a Normal Ack sent to the AP");
539 "Duration/ID of the Ack must be derived from that of the first frame");
550 auto eifsNoDifs = apPhy->GetSifs() + apPhy->GetAckTxTime();
554 eifsNoDifs + sifs +
m_aifsn * slot,
555 "Less than AIFS elapsed between AckTimeout and the next TXOP start");
558 eifsNoDifs + sifs +
m_aifsn * slot + (2 * (
m_cwMin + 1) - 1) * slot,
559 "More than AIFS+BO elapsed between AckTimeout and the next TXOP start");
562 "Expected to retransmit a QoS data frame");
564 DynamicCast<WifiNetDevice>(
m_staDevices.
Get(0))->GetMac()->GetAddress(),
565 "Expected to retransmit a frame to the first station");
570 "PSDU size expected not to exceed length based RTS/CTS threshold");
576 rtsCtsTxDurationThresh,
577 "PSDU duration expected not to exceed duration based RTS/CTS threshold");
581 "Duration/ID of the retransmitted frame must cover the whole TXOP");
589 tEnd + sifs + tolerance,
590 "Ack in response to the first frame sent too late");
593 apDev->GetMac()->GetAddress(),
594 "Expected a Normal Ack sent to the AP");
598 "Duration/ID of the Ack must be derived from that of the previous frame");
608 DynamicCast<WifiNetDevice>(
m_staDevices.
Get(1))->GetMac()->GetAddress(),
609 "Expected a frame sent by the AP to the second station");
614 "PSDU size expected not to exceed length based RTS/CTS threshold");
620 rtsCtsTxDurationThresh,
621 "PSDU duration expected not to exceed duration based RTS/CTS threshold");
626 "Duration/ID of the second frame does not cover the remaining TXOP");
632 auto staAddress = DynamicCast<WifiNetDevice>(
m_staDevices.
Get(1))->GetMac()->GetAddress();
633 auto ackTxVector = apStationManager->GetAckTxVector(staAddress,
m_txPsdus[4].txVector);
642 "Second frame must have been sent after a PIFS");
649 "Less than AIFS elapsed between AckTimeout and the next transmission");
653 "More than AIFS+BO elapsed between AckTimeout and the next TXOP start");
657 DynamicCast<WifiNetDevice>(
m_staDevices.
Get(1))->GetMac()->GetAddress(),
658 "Expected a frame sent by the AP to the second station");
663 "PSDU size expected not to exceed length based RTS/CTS threshold");
669 rtsCtsTxDurationThresh,
670 "PSDU duration expected not to exceed duration based RTS/CTS threshold");
675 "Duration/ID of the second frame does not cover the remaining TXOP");
683 "Ack in response to the second frame sent too early");
685 tEnd + sifs + tolerance,
686 "Ack in response to the second frame sent too late");
689 apDev->GetMac()->GetAddress(),
690 "Expected a Normal Ack sent to the AP");
694 "Duration/ID of the Ack must be derived from that of the previous frame");
704 DynamicCast<WifiNetDevice>(
m_staDevices.
Get(2))->GetMac()->GetAddress(),
705 "Expected a frame sent by the AP to the third station");
710 "PSDU size expected not to exceed length based RTS/CTS threshold");
716 rtsCtsTxDurationThresh,
717 "PSDU duration expected not to exceed duration based RTS/CTS threshold");
722 "Duration/ID of the third frame does not cover the remaining TXOP");
730 tEnd + sifs + tolerance,
731 "Ack in response to the third frame sent too late");
734 apDev->GetMac()->GetAddress(),
735 "Expected a Normal Ack sent to the AP");
739 "Duration/ID of the Ack must be derived from that of the previous frame");
750 "Duration/ID must be set to 0 for CF-End frames");
758 "Less than AIFS elapsed between two TXOPs");
761 "More than AIFS+BO elapsed between two TXOPs");
764 apDev->GetMac()->GetAddress(),
765 "Expected a frame sent by the first station to the AP");
770 "PSDU size expected not to exceed length based RTS/CTS threshold");
776 rtsCtsTxDurationThresh,
777 "PSDU duration expected not to exceed duration based RTS/CTS threshold");
782 "Duration/ID of the frame sent by the first station does not cover the remaining TXOP");
792 DynamicCast<WifiNetDevice>(
m_staDevices.
Get(0))->GetMac()->GetAddress(),
793 "Expected a Normal Ack sent to the first station");
796 RoundDurationId(
m_txPsdus[10].header.GetDuration() - sifs -
m_txPsdus[11].txDuration),
797 "Duration/ID of the Ack must be derived from that of the previous frame");
808 "Duration/ID must be set to 0 for CF-End frames");
836 std::string ack(
m_nonHt ?
"Normal Ack" :
"Block Ack");
840 DynamicCast<WifiNetDevice>(
m_staDevices.
Get(0))->GetMac()->GetAddress(),
841 "Expected an RTS frame sent by the AP to the first station");
844 "Duration/ID of the first RTS frame must cover the whole TXOP");
852 "CTS in response to the first RTS frame sent too early");
854 tEnd + sifs + tolerance,
855 "CTS in response to the first RTS frame sent too late");
858 apDev->GetMac()->GetAddress(),
859 "Expected a CTS frame sent to the AP");
862 RoundDurationId(
m_txPsdus[13].header.GetDuration() - sifs -
m_txPsdus[14].txDuration),
863 "Duration/ID of the CTS frame must be derived from that of the RTS frame");
873 DynamicCast<WifiNetDevice>(
m_staDevices.
Get(0))->GetMac()->GetAddress(),
874 "Expected a frame sent by the AP to the first station");
879 "PSDU size expected to exceed length based RTS/CTS threshold");
884 rtsCtsTxDurationThresh,
885 "PSDU duration expected to exceed duration based RTS/CTS threshold");
891 "Duration/ID of the first QoS data frame does not cover the remaining TXOP");
899 ack <<
" in response to the first QoS data frame sent too early");
901 tEnd + sifs + tolerance,
902 ack <<
" in response to the first QoS data frame sent too late");
906 "Expected a " << ack);
908 apDev->GetMac()->GetAddress(),
909 "Expected a " << ack <<
" sent to the AP");
912 RoundDurationId(
m_txPsdus[15].header.GetDuration() - sifs -
m_txPsdus[16].txDuration),
913 "Duration/ID of the " << ack <<
" must be derived from that of the previous frame");
915 std::size_t idx = 16;
929 DynamicCast<WifiNetDevice>(
m_staDevices.
Get(1))->GetMac()->GetAddress(),
930 "Expected an RTS frame sent by the AP to the second station");
934 "Duration/ID of the second RTS frame must cover the whole TXOP");
942 "CTS in response to the second RTS frame sent too early");
944 tEnd + sifs + tolerance,
945 "CTS in response to the second RTS frame sent too late");
948 apDev->GetMac()->GetAddress(),
949 "Expected a CTS frame sent to the AP");
952 RoundDurationId(
m_txPsdus[idx].header.GetDuration() - sifs -
954 "Duration/ID of the CTS frame must be derived from that of the RTS frame");
968 DynamicCast<WifiNetDevice>(
m_staDevices.
Get(1))->GetMac()->GetAddress(),
969 "Expected a frame sent by the AP to the second station");
974 "PSDU size expected to exceed length based RTS/CTS threshold");
979 rtsCtsTxDurationThresh,
980 "PSDU duration expected to exceed duration based RTS/CTS threshold");
986 "Duration/ID of the second QoS data frame does not cover the remaining TXOP");
994 ack <<
" in response to the second QoS data frame sent too early");
996 tEnd + sifs + tolerance,
997 ack <<
" in response to the second QoS data frame sent too late");
1001 "Expected a " << ack);
1003 apDev->GetMac()->GetAddress(),
1004 "Expected a " << ack <<
" sent to the AP");
1006 m_txPsdus[idx + 1].header.GetDuration(),
1007 RoundDurationId(
m_txPsdus[idx].header.GetDuration() - sifs -
m_txPsdus[idx + 1].txDuration),
1008 "Duration/ID of the " << ack <<
" must be derived from that of the previous frame");
1023 DynamicCast<WifiNetDevice>(
m_staDevices.
Get(2))->GetMac()->GetAddress(),
1024 "Expected an RTS frame sent by the AP to the third station");
1028 "Duration/ID of the third RTS frame must cover the whole TXOP");
1036 "CTS in response to the third RTS frame sent too early");
1038 tEnd + sifs + tolerance,
1039 "CTS in response to the third RTS frame sent too late");
1042 apDev->GetMac()->GetAddress(),
1043 "Expected a CTS frame sent to the AP");
1045 m_txPsdus[idx + 1].header.GetDuration(),
1046 RoundDurationId(
m_txPsdus[idx].header.GetDuration() - sifs -
1048 "Duration/ID of the CTS frame must be derived from that of the RTS frame");
1061 DynamicCast<WifiNetDevice>(
m_staDevices.
Get(2))->GetMac()->GetAddress(),
1062 "Expected a frame sent by the AP to the third station");
1067 "PSDU size expected to exceed length based RTS/CTS threshold");
1072 rtsCtsTxDurationThresh,
1073 "PSDU duration expected to exceed duration based RTS/CTS threshold");
1079 "Duration/ID of the third QoS data frame does not cover the remaining TXOP");
1087 ack <<
" in response to the third QoS data frame sent too early");
1089 tEnd + sifs + tolerance,
1090 ack <<
" in response to the third QoS data frame sent too late");
1094 "Expected a " << ack);
1096 apDev->GetMac()->GetAddress(),
1097 "Expected a " << ack <<
" sent to the AP");
1099 m_txPsdus[idx + 1].header.GetDuration(),
1100 RoundDurationId(
m_txPsdus[idx].header.GetDuration() - sifs -
m_txPsdus[idx + 1].txDuration),
1101 "Duration/ID of the " << ack <<
" must be derived from that of the previous frame");
1117 "Duration/ID must be set to 0 for CF-End frames");
1142 for (
const auto nonHt : {
true,
false})
1145 .pifsRecovery =
true,
1146 .singleRtsPerTxop =
false,
1147 .lengthBasedRtsCtsThresh =
false}),
1148 TestCase::Duration::QUICK);
1150 .pifsRecovery =
false,
1151 .singleRtsPerTxop =
true,
1152 .lengthBasedRtsCtsThresh =
false}),
1153 TestCase::Duration::QUICK);
1155 .pifsRecovery =
true,
1156 .singleRtsPerTxop =
true,
1157 .lengthBasedRtsCtsThresh =
true}),
1158 TestCase::Duration::QUICK);
void L7Receive(std::string context, Ptr< const Packet > p, const Address &addr)
Function to trace packets received by the server application.
bool m_pifsRecovery
whether to use PIFS recovery
NetDeviceContainer m_apDevices
container for AP's NetDevice
WifiTxopTest(const Params ¶ms)
Constructor.
void DoRun() override
Implementation to actually run this TestCase.
uint32_t m_cwMin
CWmin for BE.
uint16_t m_received
number of packets received by the stations
uint16_t m_nStations
number of stations
uint8_t m_aifsn
AIFSN for BE.
Time m_txopLimit
TXOP limit.
Ptr< ListErrorModel > m_apErrorModel
error model to install on the AP
bool m_nonHt
whether to use 802.11a or 802.11ax
std::size_t m_payloadSizeRtsOff
size in bytes of packets not protected by RTS
WifiMode m_mode
wifi mode used to transmit data frames
std::vector< FrameInfo > m_txPsdus
transmitted PSDUs
Time m_startTime
time when data frame exchanges start
bool m_staCorrupted
whether the frame to be corrupted by the STA has been corrupted
void Transmit(std::string context, WifiConstPsduMap psduMap, WifiTxVector txVector, double txPowerW)
Callback invoked when PHY receives a PSDU to transmit.
bool m_singleRtsPerTxop
whether to use single RTS per TXOP
NetDeviceContainer m_staDevices
container for stations' NetDevices
bool m_apCorrupted
whether the frame to be corrupted by the AP has been corrupted
std::size_t m_payloadSizeRtsOn
size in bytes of packets protected by RTS
bool m_lengthBasedRtsCtsThresh
whether to use length based RTS/CTS threshold
Ptr< ListErrorModel > m_staErrorModel
error model to install on a STA
void CheckResults()
Check correctness of transmitted frames.
a polymophic address class
AttributeValue implementation for Boolean.
Provide a list of Packet uids to corrupt.
void SetList(const std::list< uint64_t > &packetlist)
Helper class used to assign positions and mobility models to nodes.
holds a vector of ns3::NetDevice pointers
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.
PHY entity for OFDM (11a)
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.
AttributeValue implementation for Pointer.
Smart pointer class similar to boost::intrusive_ptr.
Handle packet fragmentation and retransmissions for QoS data frames as well as MSDU aggregation (A-MS...
static void SetRun(uint64_t run)
Set the run number of simulation.
static void SetSeed(uint32_t seed)
Set the seed.
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.
static void Stop()
Tell the Simulator the calling event should be the last one executed.
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, Duration duration=Duration::QUICK)
Add an individual child TestCase to this test suite.
Simulation virtual time values and global simulation resolution.
AttributeValue implementation for Time.
uint32_t GetMinCw() const
Return the minimum contention window size.
uint8_t GetAifsn() const
Return the number of slots that make up an AIFS.
bool LookupAttributeByName(std::string name, AttributeInformation *info) const
Find an Attribute by name, retrieving the associated AttributeInformation.
Hold an unsigned integer type.
helps to create WifiNetDevice objects
create MAC layers for a ns3::WifiNetDevice.
represent a single transmission mode
uint64_t GetDataRate(uint16_t channelWidth, uint16_t guardInterval, uint8_t nss) const
AttributeValue implementation for WifiMode.
static Time CalculateTxDuration(uint32_t size, const WifiTxVector &txVector, WifiPhyBand band, uint16_t staId=SU_STA_ID)
static Time CalculatePhyPreambleAndHeaderDuration(const WifiTxVector &txVector)
static TypeId GetTypeId()
Get the type ID.
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
void SetDefault(std::string name, const AttributeValue &value)
void Connect(std::string path, const CallbackBase &cb)
#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.
Ptr< T > CreateObject(Args &&... args)
Create an object by type, with varying number of constructor parameters.
#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_ASSERT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report and abort 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.
@ WIFI_PHY_BAND_5GHZ
The 5 GHz band.
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, Args... > MakeCallback(R(T::*memPtr)(Args...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
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...
static constexpr uint16_t SU_STA_ID
STA_ID to identify a single user (SU)
Information about transmitted frames.
WifiMacHeader header
Frame MAC header.
WifiTxVector txVector
TX vector used to transmit the frame.
Time txStart
Frame start TX time.
Time txDuration
Frame TX duration.
uint32_t size
PSDU size in bytes.
Parameters for this test.
bool lengthBasedRtsCtsThresh
if true, use length based RTS/CTS threshold; if false, use TX duration based RTS/CTS threshold
bool singleRtsPerTxop
whether protection mechanism is used no more than once per TXOP
bool nonHt
use 802.11a standard if true, 802.11ax standard otherwise
bool pifsRecovery
whether PIFS recovery is used after failure of a non-initial frame
static WifiTxopTestSuite g_wifiTxopTestSuite
the test suite