10#include "ns3/dsss-phy.h"
11#include "ns3/eht-phy.h"
12#include "ns3/eht-ppdu.h"
13#include "ns3/erp-ofdm-phy.h"
16#include "ns3/packet.h"
17#include "ns3/simulator.h"
19#include "ns3/wifi-psdu.h"
20#include "ns3/yans-wifi-phy.h"
40 void DoRun()
override;
97 std::list<HeMuUserInfo> userInfos,
118 std::list<uint16_t> staIds,
148 std::list<WifiPhyBand> testedBands;
162 for (
auto& testedBand : testedBands)
170 Time calculatedDuration = YansWifiPhy::GetPayloadDuration(size, txVector, testedBand);
171 if (calculatedDuration != knownDuration)
173 std::cerr <<
"size=" << size <<
" band=" << testedBand <<
" mode=" << payloadMode
174 <<
" channelWidth=" << channelWidth <<
" guardInterval=" << guardInterval
175 <<
" datarate=" << payloadMode.
GetDataRate(channelWidth, guardInterval, 1)
176 <<
" known=" << knownDuration <<
" calculated=" << calculatedDuration
200 std::list<WifiPhyBand> testedBands;
214 for (
auto& testedBand : testedBands)
222 Time calculatedDuration = YansWifiPhy::CalculateTxDuration(size, txVector, testedBand);
223 Time calculatedDurationUsingList =
228 if (calculatedDuration != knownDuration ||
229 calculatedDuration != calculatedDurationUsingList)
231 std::cerr <<
"size=" << size <<
" band=" << testedBand <<
" mode=" << payloadMode
232 <<
" channelWidth=" << +channelWidth <<
" guardInterval=" << guardInterval
233 <<
" datarate=" << payloadMode.
GetDataRate(channelWidth, guardInterval, 1)
234 <<
" preamble=" << preamble <<
" known=" << knownDuration
235 <<
" calculated=" << calculatedDuration
236 <<
" calculatedUsingList=" << calculatedDurationUsingList << std::endl;
245 std::list<HeMuUserInfo> userInfos,
251 NS_ASSERT(sizes.size() == userInfos.size() && sizes.size() > 1);
253 channelWidth < std::accumulate(
254 std::begin(userInfos),
260 "Cannot accommodate all the RUs in the provided band");
272 std::list<uint16_t> staIds;
275 for (
const auto& userInfo : userInfos)
278 staIds.push_back(staId++);
284 std::list<WifiPhyBand> testedBands{
289 for (
auto& testedBand : testedBands)
296 Time calculatedDuration;
298 auto iterStaId = staIds.begin();
299 for (
auto& size : sizes)
301 Time ppduDurationForSta =
302 YansWifiPhy::CalculateTxDuration(size, txVector, testedBand, *iterStaId);
303 if (ppduDurationForSta > calculatedDuration)
305 calculatedDuration = ppduDurationForSta;
311 Time calculatedDurationUsingList =
313 if (calculatedDuration != knownDuration ||
314 calculatedDuration != calculatedDurationUsingList)
316 std::cerr <<
"size=" << longestSize <<
" band=" << testedBand <<
" staId=" << staId
317 <<
" nss=" << +txVector.
GetNss(staId) <<
" mode=" << txVector.
GetMode(staId)
318 <<
" channelWidth=" << channelWidth <<
" guardInterval=" << guardInterval
323 <<
" known=" << knownDuration <<
" calculated=" << calculatedDuration
324 <<
" calculatedUsingList=" << calculatedDurationUsingList << std::endl;
333 std::list<uint16_t> staIds,
337 NS_ASSERT(sizes.size() == staIds.size());
339 auto itStaId = staIds.begin();
342 for (
auto& size : sizes)
345 psduMap[*itStaId++] =
1382 std::list<uint32_t>{1536, 1536},
1383 std::list<HeMuUserInfo>{{
HeRu::RuSpec{RuType::RU_242_TONE, 1,
true}, 0, 1},
1391 std::list<uint32_t>{1536, 1536},
1392 std::list<HeMuUserInfo>{{
HeRu::RuSpec{RuType::RU_242_TONE, 1,
true}, 1, 1},
1399 std::list<uint32_t>{1536, 76},
1400 std::list<HeMuUserInfo>{{
HeRu::RuSpec{RuType::RU_242_TONE, 1,
true}, 0, 1},
1412 std::list<uint32_t>{1536, 1536},
1413 std::list<HeMuUserInfo>{{
HeRu::RuSpec{RuType::RU_242_TONE, 1,
true}, 0, 1},
1420 std::list<uint32_t>{1536, 1536},
1421 std::list<HeMuUserInfo>{{
HeRu::RuSpec{RuType::RU_242_TONE, 1,
true}, 1, 1},
1428 std::list<uint32_t>{1536, 76},
1429 std::list<HeMuUserInfo>{{
HeRu::RuSpec{RuType::RU_242_TONE, 1,
true}, 0, 1},
1475 MuType expectedMuType,
1477 const std::pair<std::size_t, std::size_t>& expectedNumUsersPerCc,
1478 Time expectedSigBDuration);
1481 void DoRun()
override;
1499 std::pair<std::size_t, std::size_t>
1505 const std::list<HeMuUserInfo>& userInfos,
1511 const std::pair<std::size_t, std::size_t>& expectedNumUsersPerCc,
1512 Time expectedSigBDuration)
1513 :
TestCase{
"Check HE-SIG-B duration computation"},
1514 m_userInfos{userInfos},
1515 m_sigBMode{sigBMode},
1516 m_channelWidth{channelWidth},
1517 m_p20Index{p20Index},
1518 m_expectedMuType{expectedMuType},
1519 m_expectedRuAllocation{expectedRuAllocation},
1520 m_expectedNumUsersPerCc{expectedNumUsersPerCc},
1521 m_expectedSigBDuration{expectedSigBDuration}
1534 std::list<uint16_t> staIds;
1539 staIds.push_back(staId++);
1566 "Incorrect mode used to send HE-SIG-B");
1571 "Incorrect RuType::RU_ALLOCATION");
1575 txVector.GetChannelWidth(),
1577 txVector.GetCenter26ToneRuIndication(),
1578 txVector.IsSigBCompression(),
1579 txVector.IsSigBCompression() ? txVector.GetHeMuUserInfoMap().size() : 0);
1583 "Incorrect number of users in HE-SIG-B content channel 1");
1586 "Incorrect number of users in HE-SIG-B content channel 2");
1589 "Incorrect number of users in HE-SIG-B content channel 1");
1592 "Incorrect number of users in HE-SIG-B content channel 2");
1597 "Incorrect duration for HE-SIG-B");
1602 for (std::size_t i = 0; i <
m_userInfos.size(); ++i)
1606 ppduDuration = std::max(
1609 psdus.insert(std::make_pair(i, psdu));
1611 auto ppdu = hePhy->BuildPpdu(psdus, txVector, ppduDuration);
1612 ppdu->ResetTxVector();
1613 const auto& rxVector = ppdu->GetTxVector();
1616 "Incorrect user infos in reconstructed TXVECTOR");
1639 void DoRun()
override;
1654 :
TestCase(
"PHY header sections consistency")
1667 "The expected map size (" << expected.size() <<
") was not obtained ("
1668 << obtained.size() <<
")");
1670 auto itObtained = obtained.begin();
1671 auto itExpected = expected.begin();
1672 for (; itObtained != obtained.end() || itExpected != expected.end();)
1675 auto window = itObtained->second.first;
1676 auto mode = itObtained->second.second;
1679 auto windowRef = itExpected->second.first;
1680 auto modeRef = itExpected->second.second;
1684 "The expected PPDU field (" << fieldRef <<
") was not obtained ("
1688 "The expected start time (" << windowRef.first
1689 <<
") was not obtained (" << window.first
1693 "The expected stop time (" << windowRef.second
1694 <<
") was not obtained (" << window.second
1698 "The expected mode (" << modeRef <<
") was not obtained (" << mode
1750 std::map<OfdmPhyVariant, std::size_t> variants{
1756 for (
auto variant : variants)
1759 std::size_t ratio = variant.second;
1760 const auto bw =
MHz_u{20} / ratio;
1766 {{ppduStart, ppduStart +
MicroSeconds(16 * ratio)}, nonHtMode}},
1872 std::map<uint16_t, HeMuUserInfo> userInfoMap = {
1873 {1, {
HeRu::RuSpec{RuType::RU_106_TONE, 1,
true}, 4, 2}},
1874 {2, {
HeRu::RuSpec{RuType::RU_106_TONE, 1,
true}, 9, 1}}};
1875 sigAMode = HePhy::GetVhtMcs0();
1876 sigBMode = HePhy::GetVhtMcs4();
1945 userInfoMap = {{1, {
HeRu::RuSpec{RuType::RU_106_TONE, 1,
true}, 4, 2}},
1946 {2, {
HeRu::RuSpec{RuType::RU_106_TONE, 1,
true}, 9, 1}}};
1947 WifiMode uSigMode = EhtPhy::GetVhtMcs0();
1948 WifiMode ehtSigMode = EhtPhy::GetVhtMcs4();
2010 std::make_pair(2, 0),
2012 TestCase::Duration::QUICK);
2027 std::make_pair(2, 4),
2030 TestCase::Duration::QUICK);
2046 std::make_pair(2, 5),
2049 TestCase::Duration::QUICK);
2067 std::make_pair(3, 6),
2070 TestCase::Duration::QUICK);
2115 std::make_pair(18, 18),
2117 TestCase::Duration::QUICK);
2168 TestCase::Duration::QUICK);
2188 {96, 15, 192, 192, 208, 115, 208, 115},
2189 std::make_pair(4, 6),
2192 TestCase::Duration::QUICK);
2213 {96, 15, 192, 192, 208, 115, 208, 115},
2214 std::make_pair(5, 6),
2217 TestCase::Duration::QUICK);
2234 {96, 96, 192, 192, 200, 114, 114, 200},
2235 std::make_pair(4, 5),
2238 TestCase::Duration::QUICK);
2256 {96, 96, 192, 192, 200, 114, 114, 200},
2257 std::make_pair(5, 5),
2260 TestCase::Duration::QUICK);
2342 {0, 0, 0, 0, 0, 0, 0, 0},
2347 TestCase::Duration::QUICK);
2356 {208, 208, 208, 208, 208, 208, 208, 208},
2357 std::make_pair(1, 0),
2359 TestCase::Duration::QUICK);
2369 {208, 115, 208, 115, 115, 208, 115, 208},
2370 std::make_pair(1, 1),
2372 TestCase::Duration::QUICK);
2390 std::make_pair(9, 0),
2392 TestCase::Duration::QUICK);
2410 TestCase::Duration::QUICK);
2430 TestCase::Duration::QUICK);
2440 std::make_pair(0, 1),
2442 TestCase::Duration::QUICK);
2453 std::make_pair(2, 0),
2455 TestCase::Duration::QUICK);
2467 std::make_pair(3, 0),
2469 TestCase::Duration::QUICK);
2482 std::make_pair(4, 0),
2484 TestCase::Duration::QUICK);
2499 std::make_pair(6, 0),
2501 TestCase::Duration::QUICK);
2518 std::make_pair(8, 0),
2520 TestCase::Duration::QUICK);
2531 std::make_pair(1, 1),
2533 TestCase::Duration::QUICK);
2546 std::make_pair(2, 1),
2548 TestCase::Duration::QUICK);
2561 std::make_pair(2, 2),
2563 TestCase::Duration::QUICK);
2578 std::make_pair(3, 3),
2580 TestCase::Duration::QUICK);
2597 std::make_pair(4, 4),
2599 TestCase::Duration::QUICK);
2609 {208, 208, 208, 208},
2610 std::make_pair(1, 1),
2612 TestCase::Duration::QUICK);
2624 {208, 208, 208, 208},
2625 std::make_pair(2, 1),
2627 TestCase::Duration::QUICK);
2639 {208, 208, 208, 208},
2640 std::make_pair(2, 2),
2642 TestCase::Duration::QUICK);
2656 {208, 208, 208, 208},
2657 std::make_pair(3, 3),
2659 TestCase::Duration::QUICK);
2675 {208, 208, 208, 208},
2676 std::make_pair(4, 4),
2678 TestCase::Duration::QUICK);
2682 {{
HeRu::RuSpec{RuType::RU_2x996_TONE, 1,
true}, 11, 1},
2683 {
HeRu::RuSpec{RuType::RU_2x996_TONE, 1,
true}, 10, 4}},
2688 {208, 208, 208, 208, 208, 208, 208, 208},
2689 std::make_pair(1, 1),
2691 TestCase::Duration::QUICK);
2703 {208, 208, 208, 208, 208, 208, 208, 208},
2704 std::make_pair(2, 1),
2706 TestCase::Duration::QUICK);
2718 {208, 208, 208, 208, 208, 208, 208, 208},
2719 std::make_pair(2, 2),
2721 TestCase::Duration::QUICK);
2735 {208, 208, 208, 208, 208, 208, 208, 208},
2736 std::make_pair(3, 3),
2738 TestCase::Duration::QUICK);
2749 {
HeRu::RuSpec{RuType::RU_2x996_TONE, 1,
true}, 11, 1}},
2754 {208, 208, 208, 208, 208, 208, 208, 208},
2755 std::make_pair(4, 4),
2757 TestCase::Duration::QUICK);
std::list< HeMuUserInfo > m_userInfos
HE MU specific per-user information.
MuType m_expectedMuType
Expected MU type (OFDMA or MU-MIMO)
uint8_t m_p20Index
index of the primary20 channel
Ptr< YansWifiPhy > m_phy
the PHY under test
RuAllocation m_expectedRuAllocation
Expected RuType::RU_ALLOCATION.
HeSigBDurationTest(const std::list< HeMuUserInfo > &userInfos, const WifiMode &sigBMode, MHz_u channelWidth, uint8_t p20Index, MuType expectedMuType, const RuAllocation &expectedRuAllocation, const std::pair< std::size_t, std::size_t > &expectedNumUsersPerCc, Time expectedSigBDuration)
Constructor.
Time m_expectedSigBDuration
Expected duration of the HE-SIG-B header.
WifiMode m_sigBMode
Mode used to transmit HE-SIG-B.
MHz_u m_channelWidth
Channel width.
WifiTxVector BuildTxVector() const
Build a TXVECTOR for HE MU.
void DoRun() override
Implementation to actually run this TestCase.
std::pair< std::size_t, std::size_t > m_expectedNumUsersPerCc
Expected number of users per content channel.
void DoTeardown() override
Implementation to do any local setup required for this TestCase.
~TxDurationTest() override
static Time CalculateTxDurationUsingList(std::list< uint32_t > sizes, std::list< uint16_t > staIds, WifiTxVector txVector, WifiPhyBand band)
Calculate the overall Tx duration returned by WifiPhy for list of sizes.
bool CheckTxDuration(uint32_t size, WifiMode payloadMode, MHz_u channelWidth, Time guardInterval, WifiPreamble preamble, Time knownDuration)
Check if the overall tx duration returned by InterferenceHelper corresponds to a known value.
static bool CheckMuTxDuration(std::list< uint32_t > sizes, std::list< HeMuUserInfo > userInfos, MHz_u channelWidth, Time guardInterval, WifiPreamble preamble, Time knownDuration)
Check if the overall Tx duration returned by WifiPhy for a MU PPDU corresponds to a known value.
void DoRun() override
Implementation to actually run this TestCase.
bool CheckPayloadDuration(uint32_t size, WifiMode payloadMode, MHz_u channelWidth, Time guardInterval, WifiPreamble preamble, Time knownDuration)
Check if the payload tx duration returned by InterferenceHelper corresponds to a known value.
static WifiMode GetDsssRate5_5Mbps()
Return a WifiMode for HR/DSSS at 5.5 Mbps.
static WifiMode GetDsssRate1Mbps()
Return a WifiMode for DSSS at 1 Mbps.
static WifiMode GetDsssRate11Mbps()
Return a WifiMode for HR/DSSS at 11 Mbps.
static WifiMode GetDsssRate2Mbps()
Return a WifiMode for DSSS at 2 Mbps.
static WifiMode GetEhtMcs9()
Return MCS 9 from EHT MCS values.
static WifiMode GetErpOfdmRate(uint64_t rate)
Return a WifiMode for ERP-OFDM corresponding to the provided rate.
static WifiMode GetErpOfdmRate6Mbps()
Return a WifiMode for ERP-OFDM at 6 Mbps.
static WifiMode GetErpOfdmRate54Mbps()
Return a WifiMode for ERP-OFDM at 54 Mbps.
static WifiMode GetHeMcs9()
Return MCS 9 from HE MCS values.
static WifiMode GetHeMcs11()
Return MCS 11 from HE MCS values.
static WifiMode GetHeMcs0()
Return MCS 0 from HE MCS values.
static HeSigBContentChannels GetHeSigBContentChannels(const WifiTxVector &txVector, uint8_t p20Index)
Get the HE SIG-B content channels for a given PPDU IEEE 802.11ax-2021 27.3.11.8.2 HE-SIG-B content ch...
static std::pair< std::size_t, std::size_t > GetNumRusPerHeSigBContentChannel(MHz_u channelWidth, const RuAllocation &ruAllocation, std::optional< Center26ToneRuIndication > center26ToneRuIndication, bool sigBCompression, uint8_t numMuMimoUsers)
Get the number of STAs per HE-SIG-B content channel.
static WifiMode GetHtMcs0()
Return MCS 0 from HT MCS values.
static WifiMode GetHtMcs6()
Return MCS 6 from HT MCS values.
static WifiMode GetHtMcs7()
Return MCS 7 from HT MCS values.
void Dispose()
Dispose of this Object.
static WifiMode GetOfdmRate6Mbps()
Return a WifiMode for OFDM at 6 Mbps.
static WifiMode GetOfdmRate54Mbps()
Return a WifiMode for OFDM at 54 Mbps.
static WifiMode GetOfdmRate(uint64_t rate, MHz_u bw=MHz_u{20})
Return a WifiMode for OFDM corresponding to the provided rate and the channel bandwidth (20,...
std::map< WifiPpduField, PhyHeaderChunkInfo > PhyHeaderSections
A map of PhyHeaderChunkInfo elements per PPDU field.
Smart pointer class similar to boost::intrusive_ptr.
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
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.
static WifiMode GetVhtMcs0()
Return MCS 0 from VHT MCS values.
static WifiMode GetVhtMcs5()
Return MCS 5 from VHT MCS values.
static WifiMode GetVhtMcs3()
Return MCS 3 from VHT MCS values.
static WifiMode GetVhtMcs1()
Return MCS 1 from VHT MCS values.
static WifiMode GetVhtMcs4()
Return MCS 4 from VHT MCS values.
static WifiMode GetVhtMcs9()
Return MCS 9 from VHT MCS values.
static WifiMode GetVhtMcs8()
Return MCS 8 from VHT MCS values.
static WifiMode GetVhtMcs7()
Return MCS 7 from VHT MCS values.
represent a single transmission mode
WifiModulationClass GetModulationClass() const
uint64_t GetDataRate(MHz_u channelWidth, Time guardInterval, uint8_t nss) const
std::tuple< uint8_t, MHz_u, WifiPhyBand, uint8_t > ChannelTuple
Tuple identifying a segment of an operating channel.
virtual void ConfigureStandard(WifiStandard standard)
Configure the PHY-level parameters for different Wi-Fi standard.
static Time CalculateTxDuration(uint32_t size, const WifiTxVector &txVector, WifiPhyBand band, uint16_t staId=SU_STA_ID)
WifiPhyBand GetPhyBand() const
Get the configured Wi-Fi band.
Ptr< PhyEntity > GetPhyEntity(WifiModulationClass modulation) const
Get the supported PHY entity corresponding to the modulation class.
void SetOperatingChannel(const WifiPhyOperatingChannel &channel)
If the standard for this object has not been set yet, store the channel settings corresponding to the...
static ConstIterator FindFirst(uint8_t number, MHz_u frequency, MHz_u width, WifiStandard standard, WifiPhyBand band, ConstIterator start=m_frequencyChannels.begin())
Find the first frequency segment matching the specified parameters.
static MHz_u GetBandwidth(RuType ruType)
Get the approximate bandwidth occupied by a RU.
static RuType GetRuType(RuSpec ru)
Get the type of a given RU.
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
void SetRuAllocation(const RuAllocation &ruAlloc, uint8_t p20Index)
Set RU_ALLOCATION field.
void SetStbc(bool stbc)
Sets if STBC is being used.
void SetNess(uint8_t ness)
Sets the Ness number.
void SetEhtPpduType(uint8_t type)
Set the EHT_PPDU_TYPE parameter.
void SetGuardInterval(Time guardInterval)
Sets the guard interval duration (in nanoseconds)
WifiMode GetMode(uint16_t staId=SU_STA_ID) const
If this TX vector is associated with an SU PPDU, return the selected payload transmission mode.
void SetHeMuUserInfo(uint16_t staId, HeMuUserInfo userInfo)
Set the HE MU user-specific transmission information for the given STA-ID.
void SetChannelWidth(MHz_u channelWidth)
Sets the selected channelWidth.
bool IsDlOfdma() const
Return true if this TX vector is used for a downlink multi-user transmission using OFDMA.
uint8_t GetNss(uint16_t staId=SU_STA_ID) const
If this TX vector is associated with an SU PPDU, return the number of spatial streams.
void SetSigBMode(const WifiMode &mode)
Set the MCS used for SIG-B.
bool IsDlMuMimo() const
Return true if this TX vector is used for a downlink multi-user transmission using MU-MIMO.
void SetMode(WifiMode mode)
Sets the selected payload transmission mode.
void SetNss(uint8_t nss)
Sets the number of Nss.
void SetPreambleType(WifiPreamble preamble)
Sets the preamble type.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
#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.
Ptr< T > CreateObject(Args &&... args)
Create an object by type, with varying number of constructor parameters.
Ptr< T > Create(Ts &&... args)
Create class instances by constructors with varying numbers of arguments and return them by Ptr.
#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.
WifiPreamble
The type of preamble to be used by an IEEE 802.11 transmission.
WifiPhyBand
Identifies the PHY band.
WifiPpduField
The type of PPDU field (grouped for convenience)
@ WIFI_PHY_BAND_6GHZ
The 6 GHz band.
@ WIFI_PHY_BAND_2_4GHZ
The 2.4 GHz band.
@ WIFI_PHY_BAND_5GHZ
The 5 GHz band.
@ WIFI_MOD_CLASS_OFDM
OFDM (Clause 17)
@ WIFI_MOD_CLASS_VHT
VHT (Clause 22)
@ WIFI_MOD_CLASS_HE
HE (Clause 27)
@ WIFI_PPDU_FIELD_SIG_B
SIG-B field.
@ WIFI_PPDU_FIELD_TRAINING
STF + LTF fields (excluding those in preamble for HT-GF)
@ WIFI_PPDU_FIELD_NON_HT_HEADER
PHY header field for DSSS or ERP, short PHY header field for HR/DSSS or ERP, field not present for HT...
@ WIFI_PPDU_FIELD_EHT_SIG
EHT-SIG field.
@ WIFI_PPDU_FIELD_HT_SIG
HT-SIG field.
@ WIFI_PPDU_FIELD_PREAMBLE
SYNC + SFD fields for DSSS or ERP, shortSYNC + shortSFD fields for HR/DSSS or ERP,...
@ WIFI_PPDU_FIELD_U_SIG
U-SIG field.
@ WIFI_PPDU_FIELD_SIG_A
SIG-A field.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
bool IsEht(WifiPreamble preamble)
Return true if a preamble corresponds to an EHT transmission.
std::unordered_map< uint16_t, Ptr< const WifiPsdu > > WifiConstPsduMap
Map of const PSDUs indexed by STA-ID.
static constexpr uint16_t SU_STA_ID
STA_ID to identify a single user (SU)
std::vector< uint16_t > RuAllocation
9 bits RU_ALLOCATION per 20 MHz
HE MU specific user transmission parameters.
static TxDurationTestSuite g_txDurationTestSuite
the test suite