diff --git a/src/wifi/test/tx-duration-test.cc b/src/wifi/test/tx-duration-test.cc index 8fe72101f..2546557d7 100644 --- a/src/wifi/test/tx-duration-test.cc +++ b/src/wifi/test/tx-duration-test.cc @@ -1457,6 +1457,7 @@ class HeSigBDurationTest : public TestCase * @param userInfos the HE MU specific per-user information to use for the test * @param sigBMode the mode to transmit HE-SIG-B for the test * @param channelWidth the channel width to select for the test + * @param p20Index the index of the primary20 channel * @param expectedMuType the expected MU type (OFDMA or MU-MIMO) * @param expectedRuAllocation the expected RU_ALLOCATION * @param expectedNumUsersPerCc the expected number of users per content channel @@ -1465,6 +1466,7 @@ class HeSigBDurationTest : public TestCase HeSigBDurationTest(const std::list& userInfos, const WifiMode& sigBMode, MHz_u channelWidth, + uint8_t p20Index, MuType expectedMuType, const RuAllocation& expectedRuAllocation, const std::pair& expectedNumUsersPerCc, @@ -1483,6 +1485,7 @@ class HeSigBDurationTest : public TestCase std::list m_userInfos; ///< HE MU specific per-user information WifiMode m_sigBMode; ///< Mode used to transmit HE-SIG-B MHz_u m_channelWidth; ///< Channel width + uint8_t m_p20Index; ///< index of the primary20 channel MuType m_expectedMuType; ///< Expected MU type (OFDMA or MU-MIMO) RuAllocation m_expectedRuAllocation; ///< Expected RU_ALLOCATION std::pair @@ -1494,6 +1497,7 @@ HeSigBDurationTest::HeSigBDurationTest( const std::list& userInfos, const WifiMode& sigBMode, MHz_u channelWidth, + uint8_t p20Index, MuType expectedMuType, const RuAllocation& expectedRuAllocation, const std::pair& expectedNumUsersPerCc, @@ -1502,6 +1506,7 @@ HeSigBDurationTest::HeSigBDurationTest( m_userInfos{userInfos}, m_sigBMode{sigBMode}, m_channelWidth{channelWidth}, + m_p20Index{p20Index}, m_expectedMuType{expectedMuType}, m_expectedRuAllocation{expectedRuAllocation}, m_expectedNumUsersPerCc{expectedNumUsersPerCc}, @@ -1533,8 +1538,19 @@ HeSigBDurationTest::BuildTxVector() const void HeSigBDurationTest::DoRun() { - const auto& hePhy = WifiPhy::GetStaticPhyEntity(WIFI_MOD_CLASS_HE); + auto phy = CreateObject(); + auto channelNum = WifiPhyOperatingChannel::FindFirst(0, + MHz_u{0}, + MHz_u{160}, + WIFI_STANDARD_80211ax, + WIFI_PHY_BAND_6GHZ) + ->number; + phy->SetOperatingChannel( + WifiPhy::ChannelTuple{channelNum, 160, WIFI_PHY_BAND_6GHZ, m_p20Index}); + phy->ConfigureStandard(WIFI_STANDARD_80211ax); + const auto& txVector = BuildTxVector(); + const auto& hePhy = phy->GetPhyEntity(WIFI_MOD_CLASS_HE); // Verify mode for HE-SIG-B field NS_TEST_EXPECT_MSG_EQ(hePhy->GetSigMode(WIFI_PPDU_FIELD_SIG_B, txVector), @@ -1549,7 +1565,7 @@ HeSigBDurationTest::DoRun() // Verify number of users for content channels 1 and 2 const auto& numUsersPerCc = HePpdu::GetNumRusPerHeSigBContentChannel( txVector.GetChannelWidth(), - txVector.GetRuAllocation(0), + txVector.GetRuAllocation(m_p20Index), txVector.GetCenter26ToneRuIndication(), txVector.IsSigBCompression(), txVector.IsSigBCompression() ? txVector.GetHeMuUserInfoMap().size() : 0); @@ -1571,6 +1587,25 @@ HeSigBDurationTest::DoRun() NS_TEST_EXPECT_MSG_EQ(hePhy->GetDuration(WIFI_PPDU_FIELD_SIG_B, txVector), m_expectedSigBDuration, "Incorrect duration for HE-SIG-B"); + + // Verify user infos in reconstructed TX vector + WifiConstPsduMap psdus; + Time ppduDuration; + for (std::size_t i = 0; i < m_userInfos.size(); ++i) + { + WifiMacHeader hdr; + auto psdu = Create(Create(1000), hdr); + ppduDuration = std::max( + ppduDuration, + WifiPhy::CalculateTxDuration(psdu->GetSize(), txVector, phy->GetPhyBand(), i + 1)); + psdus.insert(std::make_pair(i, psdu)); + } + auto ppdu = hePhy->BuildPpdu(psdus, txVector, ppduDuration); + ppdu->ResetTxVector(); + const auto& rxVector = ppdu->GetTxVector(); + NS_TEST_EXPECT_MSG_EQ((txVector.GetHeMuUserInfoMap() == rxVector.GetHeMuUserInfoMap()), + true, + "Incorrect user infos in reconstructed TXVECTOR"); } /** @@ -1945,18 +1980,19 @@ TxDurationTestSuite::TxDurationTestSuite() AddTestCase(new PhyHeaderSectionsTest, TestCase::Duration::QUICK); - // 20 MHz band, HeSigBDurationTest::OFDMA, even number of users per HE-SIG-B content channel + // 20 MHz band, OFDMA, even number of users in HE-SIG-B content channel AddTestCase(new HeSigBDurationTest( {{{HeRu::RU_106_TONE, 1, true}, 11, 1}, {{HeRu::RU_106_TONE, 2, true}, 10, 4}}, VhtPhy::GetVhtMcs5(), MHz_u{20}, + 0, HeSigBDurationTest::OFDMA, {96}, std::make_pair(2, 0), // both users in HE-SIG-B content channel 1 MicroSeconds(4)), // one OFDM symbol; TestCase::Duration::QUICK); - // 40 MHz band, HeSigBDurationTest::OFDMA, even number of users per HE-SIG-B content channel + // 40 MHz band, OFDMA, even number of users per HE-SIG-B content channel AddTestCase( new HeSigBDurationTest({{{HeRu::RU_106_TONE, 1, true}, 11, 1}, // CC1 {{HeRu::RU_106_TONE, 2, true}, 10, 4}, // CC1 @@ -1966,6 +2002,7 @@ TxDurationTestSuite::TxDurationTestSuite() {{HeRu::RU_52_TONE, 8, true}, 6, 2}}, // CC2 VhtPhy::GetVhtMcs4(), MHz_u{40}, + 0, HeSigBDurationTest::OFDMA, {96, 112}, std::make_pair(2, 4), // two users in HE-SIG-B content channel 1 and @@ -1973,7 +2010,7 @@ TxDurationTestSuite::TxDurationTestSuite() MicroSeconds(4)), // one OFDM symbol; TestCase::Duration::QUICK); - // 40 MHz band, HeSigBDurationTest::OFDMA, odd number of users per HE-SIG-B content channel + // 40 MHz band, OFDMA, odd number of users in second HE-SIG-B content channel AddTestCase( new HeSigBDurationTest({{{HeRu::RU_106_TONE, 1, true}, 11, 1}, // CC1 {{HeRu::RU_106_TONE, 2, true}, 10, 4}, // CC1 @@ -1984,6 +2021,7 @@ TxDurationTestSuite::TxDurationTestSuite() {{HeRu::RU_26_TONE, 14, true}, 3, 1}}, // CC2 VhtPhy::GetVhtMcs3(), MHz_u{40}, + 0, HeSigBDurationTest::OFDMA, {96, 15}, std::make_pair(2, 5), // two users in HE-SIG-B content channel 1 and @@ -2004,6 +2042,7 @@ TxDurationTestSuite::TxDurationTestSuite() {{HeRu::RU_242_TONE, 4, true}, 4, 1}}, // CC2 VhtPhy::GetVhtMcs1(), MHz_u{80}, + 0, HeSigBDurationTest::OFDMA, {96, 15, 192, 192}, std::make_pair(3, 6), // three users in HE-SIG-B content channel 1 @@ -2011,7 +2050,105 @@ TxDurationTestSuite::TxDurationTestSuite() MicroSeconds(16)), // four OFDM symbols TestCase::Duration::QUICK); - // 160 MHz band, OFDMA + // 80 MHz band, OFDMA, no central 26-tones RU + AddTestCase(new HeSigBDurationTest( + {{{HeRu::RU_26_TONE, 1, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 2, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 3, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 4, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 5, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 6, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 7, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 8, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 9, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 10, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 11, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 12, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 13, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 14, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 15, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 16, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 17, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 18, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 20, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 21, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 22, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 23, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 24, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 25, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 26, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 27, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 28, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 29, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 30, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 31, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 32, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 33, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 34, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 35, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 36, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 37, true}, 8, 1}}, // CC2 + VhtPhy::GetVhtMcs5(), + MHz_u{80}, + 0, + HeSigBDurationTest::OFDMA, + {0, 0, 0, 0}, + std::make_pair(18, 18), // 18 users users in each HE-SIG-B content channel + MicroSeconds(12)), // three OFDM symbols + TestCase::Duration::QUICK); + + // 80 MHz band, OFDMA, central 26-tones RU + AddTestCase( + new HeSigBDurationTest( + {{{HeRu::RU_26_TONE, 1, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 2, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 3, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 4, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 5, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 6, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 7, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 8, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 9, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 10, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 11, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 12, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 13, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 14, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 15, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 16, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 17, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 18, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 19, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 20, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 21, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 22, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 23, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 24, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 25, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 26, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 27, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 28, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 29, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 30, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 31, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 32, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 33, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 34, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 35, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 36, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 37, true}, 8, 1}}, // CC2 + VhtPhy::GetVhtMcs5(), + MHz_u{80}, + 0, + HeSigBDurationTest::OFDMA, + {0, 0, 0, 0}, + std::make_pair(19, + 18), // 19 users (18 users + 1 central tones-RU user) in HE-SIG-B content + // channel 1 and 18 users user in HE-SIG-B content channel 2 + MicroSeconds(12)), // three OFDM symbols + TestCase::Duration::QUICK); + + // 160 MHz band, OFDMA, no central 26-tones RU AddTestCase(new HeSigBDurationTest( {{{HeRu::RU_106_TONE, 1, true}, 11, 1}, // CC1 {{HeRu::RU_106_TONE, 2, true}, 10, 4}, // CC1 @@ -2025,6 +2162,7 @@ TxDurationTestSuite::TxDurationTestSuite() {{HeRu::RU_996_TONE, 1, false}, 1, 1}}, // CC1 or CC2 => CC1 for better split VhtPhy::GetVhtMcs1(), MHz_u{160}, + 0, HeSigBDurationTest::OFDMA, {96, 15, 192, 192, 208, 115, 208, 115}, std::make_pair(4, 6), // four users in HE-SIG-B content channel 1 and @@ -2032,7 +2170,185 @@ TxDurationTestSuite::TxDurationTestSuite() MicroSeconds(16)), // four OFDM symbols TestCase::Duration::QUICK); - // 20 MHz band, HeSigBDurationTest::OFDMA, one unallocated RU at the middle + // 160 MHz band, OFDMA, central 26-tones RU in low 80 MHz + AddTestCase(new HeSigBDurationTest( + {{{HeRu::RU_106_TONE, 1, true}, 11, 1}, // CC1 + {{HeRu::RU_106_TONE, 2, true}, 10, 4}, // CC1 + {{HeRu::RU_52_TONE, 5, true}, 4, 1}, // CC2 + {{HeRu::RU_52_TONE, 6, true}, 6, 2}, // CC2 + {{HeRu::RU_52_TONE, 7, true}, 5, 3}, // CC2 + {{HeRu::RU_52_TONE, 8, true}, 6, 2}, // CC2 + {{HeRu::RU_26_TONE, 14, true}, 3, 1}, // CC2 + {{HeRu::RU_26_TONE, 19, true}, 8, 2}, // CC1 + {{HeRu::RU_242_TONE, 3, true}, 1, 1}, // CC1 + {{HeRu::RU_242_TONE, 4, true}, 4, 1}, // CC2 + {{HeRu::RU_996_TONE, 1, false}, 1, 1}}, // CC1 or CC2 => CC1 for better split + VhtPhy::GetVhtMcs1(), + MHz_u{160}, + 0, + HeSigBDurationTest::OFDMA, + {96, 15, 192, 192, 208, 115, 208, 115}, + std::make_pair(5, 6), // five users in HE-SIG-B content channel 1 and + // seven users in HE-SIG-B content channel 2 + MicroSeconds(16)), // four OFDM symbols + TestCase::Duration::QUICK); + + // 160 MHz band, OFDMA, central 26-tones RU in high 80 MHz + AddTestCase( + new HeSigBDurationTest({{{HeRu::RU_106_TONE, 1, true}, 11, 1}, // CC1 + {{HeRu::RU_106_TONE, 2, true}, 10, 4}, // CC1 + {{HeRu::RU_106_TONE, 3, true}, 11, 1}, // CC2 + {{HeRu::RU_106_TONE, 4, true}, 10, 4}, // CC2 + {{HeRu::RU_242_TONE, 3, true}, 10, 1}, // CC1 + {{HeRu::RU_242_TONE, 4, true}, 11, 1}, // CC2 + {{HeRu::RU_484_TONE, 1, false}, 7, 1}, // CC1 or CC2 + {{HeRu::RU_26_TONE, 19, false}, 8, 2}, // CC2 + {{HeRu::RU_484_TONE, 2, false}, 9, 1}}, // CC1 or CC2 + VhtPhy::GetVhtMcs5(), + MHz_u{160}, + 0, + HeSigBDurationTest::OFDMA, + {96, 96, 192, 192, 200, 114, 114, 200}, + std::make_pair(4, 5), // two users in HE-SIG-B content channel 1 and + // one user in HE-SIG-B content channel 2 + MicroSeconds(4)), // two OFDM symbols + TestCase::Duration::QUICK); + + // 160 MHz band, OFDMA, central 26-tones RU in both 80 MHz + AddTestCase( + new HeSigBDurationTest({{{HeRu::RU_106_TONE, 1, true}, 11, 1}, // CC1 + {{HeRu::RU_106_TONE, 2, true}, 10, 4}, // CC1 + {{HeRu::RU_106_TONE, 3, true}, 11, 1}, // CC2 + {{HeRu::RU_106_TONE, 4, true}, 10, 4}, // CC2 + {{HeRu::RU_26_TONE, 19, true}, 8, 2}, // CC1 + {{HeRu::RU_242_TONE, 3, true}, 10, 1}, // CC1 + {{HeRu::RU_242_TONE, 4, true}, 11, 1}, // CC2 + {{HeRu::RU_484_TONE, 1, false}, 7, 1}, // CC1 or CC2 + {{HeRu::RU_26_TONE, 19, false}, 8, 2}, // CC2 + {{HeRu::RU_484_TONE, 2, false}, 9, 1}}, // CC1 or CC2 + VhtPhy::GetVhtMcs5(), + MHz_u{160}, + 0, + HeSigBDurationTest::OFDMA, + {96, 96, 192, 192, 200, 114, 114, 200}, + std::make_pair(5, 5), // two users in HE-SIG-B content channel 1 and + // one user in HE-SIG-B content channel 2 + MicroSeconds(4)), // two OFDM symbols + TestCase::Duration::QUICK); + + // 160 MHz band, OFDMA, maximum number of users + AddTestCase( + new HeSigBDurationTest({{{HeRu::RU_26_TONE, 1, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 2, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 3, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 4, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 5, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 6, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 7, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 8, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 9, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 10, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 11, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 12, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 13, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 14, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 15, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 16, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 17, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 18, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 19, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 20, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 21, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 22, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 23, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 24, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 25, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 26, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 27, true}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 28, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 29, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 30, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 31, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 32, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 33, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 34, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 35, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 36, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 37, true}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 1, false}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 2, false}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 3, false}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 4, false}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 5, false}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 6, false}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 7, false}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 8, false}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 9, false}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 10, false}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 11, false}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 12, false}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 13, false}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 14, false}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 15, false}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 16, false}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 17, false}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 18, false}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 19, false}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 20, false}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 21, false}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 22, false}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 23, false}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 24, false}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 25, false}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 26, false}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 27, false}, 8, 1}, // CC1 + {{HeRu::RU_26_TONE, 28, false}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 29, false}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 30, false}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 31, false}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 32, false}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 33, false}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 34, false}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 35, false}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 36, false}, 8, 1}, // CC2 + {{HeRu::RU_26_TONE, 37, false}, 8, 1}}, // CC2 + VhtPhy::GetVhtMcs5(), + MHz_u{160}, + 0, + HeSigBDurationTest::OFDMA, + {0, 0, 0, 0, 0, 0, 0, 0}, + std::make_pair(37, + 37), // 37 users (36 users + 1 central tones-RU user) + // in each HE-SIG-B content channel + MicroSeconds(20)), // five OFDM symbols + TestCase::Duration::QUICK); + + // 160 MHz band, OFDMA, single-user using 2x996 tones RU + AddTestCase( + new HeSigBDurationTest({{{HeRu::RU_2x996_TONE, 1, true}, 8, 1}}, // CC1 + VhtPhy::GetVhtMcs5(), + MHz_u{160}, + 0, + HeSigBDurationTest::OFDMA, + {208, 208, 208, 208, 208, 208, 208, 208}, + std::make_pair(1, 0), // one user in HE-SIG-B content channel 1 + MicroSeconds(4)), // one OFDM symbol; + TestCase::Duration::QUICK); + + // 160 MHz band, OFDMA, primary80 is in the high 80 MHz band + AddTestCase( + new HeSigBDurationTest({{{HeRu::RU_996_TONE, 1, false}, 8, 1}, // CC2 + {{HeRu::RU_996_TONE, 1, true}, 8, 1}}, // CC1 + VhtPhy::GetVhtMcs5(), + MHz_u{160}, + 4, + HeSigBDurationTest::OFDMA, + {208, 115, 208, 115, 115, 208, 115, 208}, + std::make_pair(1, 1), // one user in each HE-SIG-B content channel + MicroSeconds(4)), // one OFDM symbol; + TestCase::Duration::QUICK); + + // 20 MHz band, OFDMA, one unallocated RU at the middle AddTestCase( new HeSigBDurationTest( {{{HeRu::RU_26_TONE, 1, true}, 11, 1}, // CC1 @@ -2045,13 +2361,14 @@ TxDurationTestSuite::TxDurationTestSuite() {{HeRu::RU_26_TONE, 9, true}, 11, 1}}, // CC1 VhtPhy::GetVhtMcs5(), MHz_u{20}, + 0, HeSigBDurationTest::OFDMA, {0}, std::make_pair(9, 0), // 9 users (8 users + 1 empty user) in HE-SIG-B content channel 1 MicroSeconds(8)), // two OFDM symbols TestCase::Duration::QUICK); - // 40 MHz band, HeSigBDurationTest::OFDMA, unallocated RUs at the begin and at the end of the + // 40 MHz band, OFDMA, unallocated RUs at the begin and at the end of the // first 20 MHz subband and in the middle of the second 20 MHz subband AddTestCase( new HeSigBDurationTest( @@ -2061,6 +2378,7 @@ TxDurationTestSuite::TxDurationTestSuite() {{HeRu::RU_52_TONE, 8, true}, 11, 2}}, // CC2 VhtPhy::GetVhtMcs5(), MHz_u{40}, + 0, HeSigBDurationTest::OFDMA, {112, 112}, std::make_pair(4, @@ -2068,7 +2386,7 @@ TxDurationTestSuite::TxDurationTestSuite() MicroSeconds(4)), // one OFDM symbol TestCase::Duration::QUICK); - // 40 MHz band, HeSigBDurationTest::OFDMA, one unallocated RUs in the first 20 MHz subband and + // 40 MHz band, OFDMA, one unallocated RUs in the first 20 MHz subband and // two unallocated RUs in second 20 MHz subband AddTestCase( new HeSigBDurationTest( @@ -2079,6 +2397,7 @@ TxDurationTestSuite::TxDurationTestSuite() {{HeRu::RU_52_TONE, 6, true}, 11, 3}}, // CC2 VhtPhy::GetVhtMcs5(), MHz_u{40}, + 0, HeSigBDurationTest::OFDMA, {112, 112}, std::make_pair(4, @@ -2087,12 +2406,25 @@ TxDurationTestSuite::TxDurationTestSuite() MicroSeconds(4)), // one OFDM symbol TestCase::Duration::QUICK); + // 40 MHz band, OFDMA, first 20 MHz is punctured + AddTestCase( + new HeSigBDurationTest({{{HeRu::RU_242_TONE, 2, true}, 11, 1}}, // CC2 + VhtPhy::GetVhtMcs5(), + MHz_u{40}, + 1, + HeSigBDurationTest::OFDMA, + {113, 192}, + std::make_pair(0, 1), // one user in HE-SIG-B content channel 1 + MicroSeconds(4)), // one OFDM symbol; + TestCase::Duration::QUICK); + // 20 MHz band, MU-MIMO, 2 users AddTestCase( new HeSigBDurationTest({{{HeRu::RU_242_TONE, 1, true}, 11, 1}, // CC1 {{HeRu::RU_242_TONE, 1, true}, 10, 4}}, // CC1 VhtPhy::GetVhtMcs5(), MHz_u{20}, + 0, HeSigBDurationTest::MU_MIMO, {192}, std::make_pair(2, 0), // both users in HE-SIG-B content channel 1 @@ -2106,6 +2438,7 @@ TxDurationTestSuite::TxDurationTestSuite() {{HeRu::RU_242_TONE, 1, true}, 6, 1}}, // CC1 VhtPhy::GetVhtMcs4(), MHz_u{20}, + 0, HeSigBDurationTest::MU_MIMO, {192}, std::make_pair(3, 0), // all users in HE-SIG-B content channel 1 @@ -2120,6 +2453,7 @@ TxDurationTestSuite::TxDurationTestSuite() {{HeRu::RU_242_TONE, 1, true}, 7, 2}}, // CC1 VhtPhy::GetVhtMcs4(), MHz_u{20}, + 0, HeSigBDurationTest::MU_MIMO, {192}, std::make_pair(4, 0), // all users in HE-SIG-B content channel 1 @@ -2136,6 +2470,7 @@ TxDurationTestSuite::TxDurationTestSuite() {{HeRu::RU_242_TONE, 1, true}, 9, 1}}, // CC1 VhtPhy::GetVhtMcs4(), MHz_u{20}, + 0, HeSigBDurationTest::MU_MIMO, {192}, std::make_pair(6, 0), // all users in HE-SIG-B content channel 1 @@ -2154,6 +2489,7 @@ TxDurationTestSuite::TxDurationTestSuite() {{HeRu::RU_242_TONE, 1, true}, 11, 1}}, // CC1 VhtPhy::GetVhtMcs4(), MHz_u{20}, + 0, HeSigBDurationTest::MU_MIMO, {192}, std::make_pair(8, 0), // all users in HE-SIG-B content channel 1 @@ -2166,6 +2502,7 @@ TxDurationTestSuite::TxDurationTestSuite() {{HeRu::RU_484_TONE, 1, true}, 10, 4}}, // CC2 VhtPhy::GetVhtMcs5(), MHz_u{40}, + 0, HeSigBDurationTest::MU_MIMO, {200, 200}, std::make_pair(1, 1), // users equally split between the two content channels @@ -2180,6 +2517,7 @@ TxDurationTestSuite::TxDurationTestSuite() {{HeRu::RU_484_TONE, 1, true}, 6, 1}}, // CC1 VhtPhy::GetVhtMcs4(), MHz_u{40}, + 0, HeSigBDurationTest::MU_MIMO, {200, 200}, std::make_pair(2, 1), // 2 users in content channel 1 and 1 user in content channel 2 @@ -2194,6 +2532,7 @@ TxDurationTestSuite::TxDurationTestSuite() {{HeRu::RU_484_TONE, 1, true}, 7, 2}}, // CC2 VhtPhy::GetVhtMcs4(), MHz_u{40}, + 0, HeSigBDurationTest::MU_MIMO, {200, 200}, std::make_pair(2, 2), // users equally split between the two content channels @@ -2210,6 +2549,7 @@ TxDurationTestSuite::TxDurationTestSuite() {{HeRu::RU_484_TONE, 1, true}, 9, 1}}, // CC2 VhtPhy::GetVhtMcs4(), MHz_u{40}, + 0, HeSigBDurationTest::MU_MIMO, {200, 200}, std::make_pair(3, 3), // users equally split between the two content channels @@ -2228,6 +2568,7 @@ TxDurationTestSuite::TxDurationTestSuite() {{HeRu::RU_484_TONE, 1, true}, 11, 1}}, // CC2 VhtPhy::GetVhtMcs4(), MHz_u{40}, + 0, HeSigBDurationTest::MU_MIMO, {200, 200}, std::make_pair(4, 4), // users equally split between the two content channels @@ -2240,6 +2581,7 @@ TxDurationTestSuite::TxDurationTestSuite() {{HeRu::RU_996_TONE, 1, true}, 10, 4}}, // CC2 VhtPhy::GetVhtMcs5(), MHz_u{80}, + 0, HeSigBDurationTest::MU_MIMO, {208, 208, 208, 208}, std::make_pair(1, 1), // users equally split between the two content channels @@ -2254,6 +2596,7 @@ TxDurationTestSuite::TxDurationTestSuite() {{HeRu::RU_996_TONE, 1, true}, 6, 1}}, // CC1 VhtPhy::GetVhtMcs4(), MHz_u{80}, + 0, HeSigBDurationTest::MU_MIMO, {208, 208, 208, 208}, std::make_pair(2, 1), // 2 users in content channel 1 and 1 user in content channel 2 @@ -2268,6 +2611,7 @@ TxDurationTestSuite::TxDurationTestSuite() {{HeRu::RU_996_TONE, 1, true}, 7, 2}}, // CC2 VhtPhy::GetVhtMcs4(), MHz_u{80}, + 0, HeSigBDurationTest::MU_MIMO, {208, 208, 208, 208}, std::make_pair(2, 2), // users equally split between the two content channels @@ -2284,6 +2628,7 @@ TxDurationTestSuite::TxDurationTestSuite() {{HeRu::RU_996_TONE, 1, true}, 9, 1}}, // CC2 VhtPhy::GetVhtMcs4(), MHz_u{80}, + 0, HeSigBDurationTest::MU_MIMO, {208, 208, 208, 208}, std::make_pair(3, 3), // users equally split between the two content channels @@ -2302,6 +2647,7 @@ TxDurationTestSuite::TxDurationTestSuite() {{HeRu::RU_996_TONE, 1, true}, 11, 1}}, // CC2 VhtPhy::GetVhtMcs4(), MHz_u{80}, + 0, HeSigBDurationTest::MU_MIMO, {208, 208, 208, 208}, std::make_pair(4, 4), // users equally split between the two content channels @@ -2314,6 +2660,7 @@ TxDurationTestSuite::TxDurationTestSuite() {{HeRu::RU_2x996_TONE, 1, true}, 10, 4}}, // CC2 VhtPhy::GetVhtMcs5(), MHz_u{160}, + 0, HeSigBDurationTest::MU_MIMO, {208, 208, 208, 208, 208, 208, 208, 208}, std::make_pair(1, 1), // users equally split between the two content channels @@ -2328,6 +2675,7 @@ TxDurationTestSuite::TxDurationTestSuite() {{HeRu::RU_2x996_TONE, 1, true}, 6, 1}}, // CC1 VhtPhy::GetVhtMcs4(), MHz_u{160}, + 0, HeSigBDurationTest::MU_MIMO, {208, 208, 208, 208, 208, 208, 208, 208}, std::make_pair(2, 1), // 2 users in content channel 1 and 1 user in content channel 2 @@ -2342,6 +2690,7 @@ TxDurationTestSuite::TxDurationTestSuite() {{HeRu::RU_2x996_TONE, 1, true}, 7, 2}}, // CC2 VhtPhy::GetVhtMcs4(), MHz_u{160}, + 0, HeSigBDurationTest::MU_MIMO, {208, 208, 208, 208, 208, 208, 208, 208}, std::make_pair(2, 2), // users equally split between the two content channels @@ -2358,6 +2707,7 @@ TxDurationTestSuite::TxDurationTestSuite() {{HeRu::RU_2x996_TONE, 1, true}, 9, 1}}, // CC2 VhtPhy::GetVhtMcs4(), MHz_u{160}, + 0, HeSigBDurationTest::MU_MIMO, {208, 208, 208, 208, 208, 208, 208, 208}, std::make_pair(3, 3), // users equally split between the two content channels @@ -2376,6 +2726,7 @@ TxDurationTestSuite::TxDurationTestSuite() {{HeRu::RU_2x996_TONE, 1, true}, 11, 1}}, // CC2 VhtPhy::GetVhtMcs4(), MHz_u{160}, + 0, HeSigBDurationTest::MU_MIMO, {208, 208, 208, 208, 208, 208, 208, 208}, std::make_pair(4, 4), // users equally split between the two content channels