24 #include "ns3/pointer.h"
25 #include "ns3/string.h"
26 #include "ns3/simulator.h"
27 #include "ns3/rng-seed-manager.h"
28 #include "ns3/constant-position-mobility-model.h"
29 #include "ns3/wifi-spectrum-signal-parameters.h"
30 #include "ns3/wifi-spectrum-value-helper.h"
31 #include "ns3/multi-model-spectrum-channel.h"
32 #include "ns3/spectrum-wifi-phy.h"
33 #include "ns3/nist-error-rate-model.h"
34 #include "ns3/wifi-mac-header.h"
35 #include "ns3/wifi-net-device.h"
36 #include "ns3/wifi-psdu.h"
37 #include "ns3/he-ppdu.h"
38 #include "ns3/wifi-utils.h"
39 #include "ns3/ap-wifi-mac.h"
40 #include "ns3/sta-wifi-mac.h"
41 #include "ns3/he-configuration.h"
42 #include "ns3/ctrl-headers.h"
43 #include "ns3/threshold-preamble-detection-model.h"
44 #include "ns3/he-phy.h"
45 #include "ns3/waveform-generator.h"
46 #include "ns3/non-communicating-net-device.h"
47 #include "ns3/spectrum-wifi-helper.h"
48 #include "ns3/mobility-helper.h"
89 void SetGlobalPpduUid (uint64_t uid);
112 return HePhy::GetStaId (ppdu);
210 static TypeId tid =
TypeId (
"ns3::OfdmaSpectrumWifiPhy")
212 .SetGroupName (
"Wifi")
213 .AddTraceSource (
"TxPpduUid",
214 "UID of the PPDU to be transmitted",
216 "ns3::OfdmaSpectrumWifiPhy::TxPpduUidCallback")
237 SpectrumWifiPhy::DoInitialize ();
244 SpectrumWifiPhy::DoDispose ();
264 SpectrumWifiPhy::StartTx (ppdu);
267 std::map <std::pair<uint64_t, WifiPreamble>,
Ptr<Event> > &
314 void DoRun (
void)
override;
324 WifiTxVector txVector, std::vector<bool> statusPerMpdu);
333 WifiTxVector txVector, std::vector<bool> statusPerMpdu);
342 WifiTxVector txVector, std::vector<bool> statusPerMpdu);
366 void CheckResultsSta1 (uint32_t expectedRxSuccess, uint32_t expectedRxFailure, uint32_t expectedRxBytes);
373 void CheckResultsSta2 (uint32_t expectedRxSuccess, uint32_t expectedRxFailure, uint32_t expectedRxBytes);
380 void CheckResultsSta3 (uint32_t expectedRxSuccess, uint32_t expectedRxFailure, uint32_t expectedRxBytes);
392 void SendMuPpdu (uint16_t rxStaId1, uint16_t rxStaId2);
446 m_countRxSuccessSta1 (0),
447 m_countRxSuccessSta2 (0),
448 m_countRxSuccessSta3 (0),
449 m_countRxFailureSta1 (0),
450 m_countRxFailureSta2 (0),
451 m_countRxFailureSta3 (0),
452 m_countRxBytesSta1 (0),
453 m_countRxBytesSta2 (0),
454 m_countRxBytesSta3 (0),
484 ruType = HeRu::RU_106_TONE;
488 ruType = HeRu::RU_242_TONE;
492 ruType = HeRu::RU_484_TONE;
496 ruType = HeRu::RU_996_TONE;
504 txVector.
SetRu (ru1, rxStaId1);
505 txVector.
SetMode (HePhy::GetHeMcs7 (), rxStaId1);
506 txVector.
SetNss (1, rxStaId1);
509 txVector.
SetRu (ru2, rxStaId2);
510 txVector.
SetMode (HePhy::GetHeMcs9 (), rxStaId2);
511 txVector.
SetNss (1, rxStaId2);
520 psdus.insert (std::make_pair (rxStaId1, psdu1));
529 psdus.insert (std::make_pair (rxStaId2, psdu2));
637 phy->GetAttribute (
"State", ptr);
654 Ptr<Node> apNode = CreateObject<Node> ();
656 m_phyAp = CreateObject<SpectrumWifiPhy> ();
669 Ptr<Node> sta1Node = CreateObject<Node> ();
671 m_phySta1 = CreateObject<OfdmaSpectrumWifiPhy> (1);
685 Ptr<Node> sta2Node = CreateObject<Node> ();
687 m_phySta2 = CreateObject<OfdmaSpectrumWifiPhy> (2);
701 Ptr<Node> sta3Node = CreateObject<Node> ();
703 m_phySta3 = CreateObject<OfdmaSpectrumWifiPhy> (3);
717 Ptr<Node> interfererNode = CreateObject<Node> ();
723 interfererNode->
AddDevice (interfererDev);
744 RngSeedManager::SetSeed (1);
745 RngSeedManager::SetRun (1);
746 int64_t streamNumber = 0;
822 bands.push_back (bandInfo);
825 Ptr<SpectrumValue> interferencePsdRu1 = Create<SpectrumValue> (SpectrumInterferenceRu1);
826 double interferencePower = 0.1;
827 *interferencePsdRu1 = interferencePower / ((
m_channelWidth / 2) * 20e6);
858 bands.push_back (bandInfo);
861 Ptr<SpectrumValue> interferencePsdRu2 = Create<SpectrumValue> (SpectrumInterferenceRu2);
862 *interferencePsdRu2 = interferencePower / ((
m_channelWidth / 2) * 20e6);
893 bands.push_back (bandInfo);
896 Ptr<SpectrumValue> interferencePsdAll = Create<SpectrumValue> (SpectrumInterferenceAll);
897 *interferencePsdAll = interferencePower / (
m_channelWidth * 20e6);
946 Simulator::Destroy ();
965 void DoRun (
void)
override;
1006 void CheckUid (uint16_t staId, uint64_t expectedUid);
1018 :
TestCase (
"UL-OFDMA PPDU UID attribution test"),
1019 m_ppduUidAp (UINT64_MAX),
1020 m_ppduUidSta1 (UINT64_MAX),
1021 m_ppduUidSta2 (UINT64_MAX)
1039 Ptr<Node> apNode = CreateObject<Node> ();
1041 m_phyAp = CreateObject<OfdmaSpectrumWifiPhy> (0);
1057 Ptr<Node> sta1Node = CreateObject<Node> ();
1059 m_phySta1 = CreateObject<OfdmaSpectrumWifiPhy> (1);
1074 Ptr<Node> sta2Node = CreateObject<Node> ();
1076 m_phySta2 = CreateObject<OfdmaSpectrumWifiPhy> (2);
1163 uint16_t rxStaId1 = 1;
1165 txVector.
SetRu (ru1, rxStaId1);
1166 txVector.
SetMode (HePhy::GetHeMcs7 (), rxStaId1);
1167 txVector.
SetNss (1, rxStaId1);
1169 uint16_t rxStaId2 = 2;
1171 txVector.
SetRu (ru2, rxStaId2);
1172 txVector.
SetMode (HePhy::GetHeMcs9 (), rxStaId2);
1173 txVector.
SetNss (1, rxStaId2);
1182 psdus.insert (std::make_pair (rxStaId1, psdu1));
1191 psdus.insert (std::make_pair (rxStaId2, psdu2));
1204 uint16_t rxStaId1 = 1;
1206 txVector1.
SetRu (ru1, rxStaId1);
1207 txVector1.
SetMode (HePhy::GetHeMcs7 (), rxStaId1);
1208 txVector1.
SetNss (1, rxStaId1);
1217 psdus1.insert (std::make_pair (rxStaId1, psdu1));
1219 uint16_t rxStaId2 = 2;
1221 txVector2.
SetRu (ru2, rxStaId2);
1222 txVector2.
SetMode (HePhy::GetHeMcs9 (), rxStaId2);
1223 txVector2.
SetNss (1, rxStaId2);
1232 psdus2.insert (std::make_pair (rxStaId2, psdu2));
1257 hdr.
SetAddr1 (Mac48Address::GetBroadcast ());
1260 psdus.insert (std::make_pair (
SU_STA_ID, psdu));
1281 RngSeedManager::SetSeed (1);
1282 RngSeedManager::SetRun (1);
1283 int64_t streamNumber = 0;
1315 Simulator::Destroy ();
1333 void DoRun (
void)
override;
1343 void RxHeTbPpdu (uint64_t uid, uint16_t staId,
double txPowerWatts,
size_t payloadSize);
1391 :
TestCase (
"UL-OFDMA multiple RX events test"),
1392 m_totalBytesDropped (0)
1421 for (
auto const& uid : uids)
1424 auto it = events.find (pair);
1425 bool found = (it != events.end ());
1444 txVector.
SetRu (ru, staId);
1445 txVector.
SetMode (HePhy::GetHeMcs7 (), staId);
1446 txVector.
SetNss (1, staId);
1455 psdus.insert (std::make_pair (staId, psdu));
1459 HePpdu::PSD_HE_TB_NON_OFDMA_PORTION);
1462 Time nonOfdmaDuration =
m_phy->
GetHePhy ()->CalculateNonOfdmaDurationForHeTb (txVector);
1463 uint32_t centerFrequency =
m_phy->
GetHePhy ()->GetCenterFrequencyForNonOfdmaPart (txVector, staId);
1464 uint16_t ruWidth = HeRu::GetBandwidth (txVector.
GetRu (staId).
GetRuType ());
1465 uint16_t channelWidth = ruWidth < 20 ? 20 : ruWidth;
1468 rxParams->
psd = rxPsd;
1469 rxParams->
txPhy = 0;
1470 rxParams->
duration = nonOfdmaDuration;
1471 rxParams->
ppdu = ppdu;
1477 ppduOfdma->
SetTxPsdFlag (HePpdu::PSD_HE_TB_OFDMA_PORTION);
1481 rxParamsOfdma->
psd = rxPsd;
1482 rxParamsOfdma->
txPhy = 0;
1483 rxParamsOfdma->
duration = ppduDuration - nonOfdmaDuration;
1484 rxParamsOfdma->
ppdu = ppduOfdma;
1506 m_phy = CreateObject<OfdmaSpectrumWifiPhy> (0);
1534 RngSeedManager::SetSeed (1);
1535 RngSeedManager::SetRun (1);
1536 int64_t streamNumber = 0;
1539 double txPowerWatts = 0.01;
1543 std::vector<uint64_t> uids {0};
1554 std::vector<uint64_t> uids {1, 2};
1568 std::vector<uint64_t> uids {3, 4};
1582 std::vector<uint64_t> uids {5, 6};
1597 std::vector<uint64_t> uids {7, 8};
1612 std::vector<uint64_t> uids {9};
1625 Simulator::Destroy ();
1643 void DoRun (
void)
override;
1661 void SendHeTbPpdu (uint16_t txStaId, std::size_t index, std::size_t payloadSize, uint64_t uid, uint8_t bssColor);
1670 void SendHeSuPpdu (uint16_t txStaId, std::size_t payloadSize, uint64_t uid, uint8_t bssColor);
1708 void CheckRxFromSta1 (uint32_t expectedSuccess, uint32_t expectedFailures, uint32_t expectedBytes);
1716 void CheckRxFromSta2 (uint32_t expectedSuccess, uint32_t expectedFailures, uint32_t expectedBytes);
1784 uint32_t expectedSuccessFromSta1, uint32_t expectedFailuresFromSta1, uint32_t expectedBytesFromSta1,
1785 uint32_t expectedSuccessFromSta2, uint32_t expectedFailuresFromSta2, uint32_t expectedBytesFromSta2,
1798 double rxPowerOfdmaRu1,
double rxPowerOfdmaRu2);
1827 m_countRxSuccessFromSta1 (0),
1828 m_countRxSuccessFromSta2 (0),
1829 m_countRxFailureFromSta1 (0),
1830 m_countRxFailureFromSta2 (0),
1831 m_countRxBytesFromSta1 (0),
1832 m_countRxBytesFromSta2 (0),
1845 WifiTxVector txVector =
WifiTxVector (HePhy::GetHeMcs7 (), 0,
WIFI_PREAMBLE_HE_SU, 800, 1, 1, 0,
m_channelWidth,
false,
false,
false, bssColor);
1852 std::ostringstream addr;
1853 addr <<
"00:00:00:00:00:0" << txStaId;
1857 psdus.insert (std::make_pair (
SU_STA_ID, psdu));
1864 else if (txStaId == 2)
1868 else if (txStaId == 3)
1872 else if (txStaId == 0)
1876 phy->SetPpduUid (uid);
1877 phy->Send (psdus, txVector);
1883 WifiTxVector txVector =
WifiTxVector (HePhy::GetHeMcs7 (), 0,
WIFI_PREAMBLE_HE_TB, 800, 1, 1, 0,
m_channelWidth,
false,
false,
false, bssColor);
1888 ruType = HeRu::RU_106_TONE;
1892 ruType = HeRu::RU_242_TONE;
1896 ruType = HeRu::RU_484_TONE;
1900 ruType = HeRu::RU_996_TONE;
1907 bool primary80MHz =
true;
1910 primary80MHz =
false;
1915 txVector.
SetRu (ru, txStaId);
1916 txVector.
SetMode (HePhy::GetHeMcs7 (), txStaId);
1917 txVector.
SetNss (1, txStaId);
1924 NS_LOG_FUNCTION (
this << txStaId << index << payloadSize << uid << +bssColor);
1933 std::ostringstream addr;
1934 addr <<
"00:00:00:00:00:0" << txStaId;
1938 psdus.insert (std::make_pair (txStaId, psdu));
1945 else if (txStaId == 2)
1949 else if (txStaId == 3)
1954 Time txDuration =
phy->CalculateTxDuration (psdu->
GetSize (), txVector,
phy->GetPhyBand (), txStaId);
1955 txVector.
SetLength (HePhy::ConvertHeTbPpduDurationToLSigLength (txDuration,
phy->GetPhyBand ()));
1957 phy->SetPpduUid (uid);
1958 phy->Send (psdus, txVector);
2032 double rxPower =
event->GetRxPowerW (band);
2033 NS_LOG_FUNCTION (
this << band.first << band.second << expectedRxPower << rxPower);
2035 NS_TEST_ASSERT_MSG_EQ_TOL (rxPower, expectedRxPower, 5e-3,
"RX power " << rxPower <<
" over (" << band.first <<
", " << band.second <<
") does not match expected power " << expectedRxPower <<
" at " <<
Simulator::Now ());
2046 NS_LOG_FUNCTION (
this << band.first << band.second << expectedRxPower);
2048 if (expectedRxPower > 0.0)
2051 "At least " << expectedRxPower <<
" W expected for OFDMA part over (" << band.first <<
", " << band.second <<
") at " <<
Simulator::Now ());
2053 "At most " << expectedRxPower <<
" W expected for OFDMA part over (" << band.first <<
", " << band.second <<
") at " <<
Simulator::Now ());
2058 "At most " << expectedRxPower <<
" W expected for OFDMA part over (" << band.first <<
", " << band.second <<
") at " <<
Simulator::Now ());
2082 phy->GetAttribute (
"State", ptr);
2133 Ptr<Node> apNode = CreateObject<Node> ();
2138 m_phyAp = CreateObject<OfdmaSpectrumWifiPhy> (0);
2156 Ptr<Node> sta1Node = CreateObject<Node> ();
2158 m_phySta1 = CreateObject<OfdmaSpectrumWifiPhy> (1);
2171 Ptr<Node> sta2Node = CreateObject<Node> ();
2173 m_phySta2 = CreateObject<OfdmaSpectrumWifiPhy> (2);
2186 Ptr<Node> sta3Node = CreateObject<Node> ();
2188 m_phySta3 = CreateObject<OfdmaSpectrumWifiPhy> (3);
2201 Ptr<Node> interfererNode = CreateObject<Node> ();
2207 interfererNode->
AddDevice (interfererDev);
2211 for (
auto &
phy : phys)
2244 uint32_t expectedSuccessFromSta1, uint32_t expectedFailuresFromSta1, uint32_t expectedBytesFromSta1,
2245 uint32_t expectedSuccessFromSta2, uint32_t expectedFailuresFromSta2, uint32_t expectedBytesFromSta2,
2246 bool scheduleTxSta1,
WifiPhyState expectedStateBeforeEnd)
2265 expectedSuccessFromSta1, expectedFailuresFromSta1, expectedBytesFromSta1);
2268 expectedSuccessFromSta2, expectedFailuresFromSta2, expectedBytesFromSta2);
2278 double rxPowerOfdmaRu1,
double rxPowerOfdmaRu2)
2280 Time detectionDuration = WifiPhy::GetPreambleDetectionDuration ();
2287 std::vector<double> rxPowerNonOfdma { rxPowerNonOfdmaRu1, rxPowerNonOfdmaRu2 };
2289 std::vector<double> rxPowerOfdma { rxPowerOfdmaRu1, rxPowerOfdmaRu2 };
2292 for (uint8_t i = 0; i < 2; ++i)
2298 Simulator::Schedule (delay + detectionDuration +
NanoSeconds (1),
2300 nonOfdmaBand[i], rxPowerNonOfdma[i]);
2301 Simulator::Schedule (delay + nonOfdmaDuration -
NanoSeconds (1),
2303 nonOfdmaBand[i], rxPowerNonOfdma[i]);
2305 Simulator::Schedule (delay + nonOfdmaDuration +
NanoSeconds (1),
2307 ofdmaBand[i], rxPowerOfdma[i]);
2310 ofdmaBand[i], rxPowerOfdma[i]);
2318 Simulator::Schedule (delay + detectionDuration +
NanoSeconds (1),
2320 nonOfdmaBand[i], rxPowerNonOfdma[i]);
2321 Simulator::Schedule (delay + nonOfdmaDuration -
NanoSeconds (1),
2323 nonOfdmaBand[i], rxPowerNonOfdma[i]);
2325 Simulator::Schedule (delay + nonOfdmaDuration +
NanoSeconds (1),
2327 ofdmaBand[i], rxPowerOfdma[i]);
2330 ofdmaBand[i], rxPowerOfdma[i]);
2333 if (rxPowerOfdmaRu1 != 0.0)
2340 double rxPowerNonOfdmaSta1Only = (
m_channelWidth >= 40) ? rxPowerNonOfdma[0] : rxPowerNonOfdma[0] / 2;
2342 Simulator::Schedule (delay + detectionDuration +
NanoSeconds (1),
2344 nonOfdmaBand[0], rxPowerNonOfdmaSta1Only);
2345 Simulator::Schedule (delay + nonOfdmaDuration -
NanoSeconds (1),
2347 nonOfdmaBand[0], rxPowerNonOfdmaSta1Only);
2349 Simulator::Schedule (delay + nonOfdmaDuration +
NanoSeconds (1),
2351 ofdmaBand[0], rxPowerOfdma[0]);
2354 ofdmaBand[0], rxPowerOfdma[0]);
2361 RngSeedManager::SetSeed (1);
2362 RngSeedManager::SetRun (1);
2363 int64_t streamNumber = 0;
2396 "Reception of solicited HE TB PPDUs");
2406 "Reception of unsolicited HE TB PPDUs");
2416 "Reception of solicited HE TB PPDUs with interference on RU 1 during PSDU reception");
2423 bands.push_back (bandInfo);
2426 Ptr<SpectrumValue> interferencePsdRu1 = Create<SpectrumValue> (SpectrumInterferenceRu1);
2427 double interferencePower = 0.1;
2428 *interferencePsdRu1 = interferencePower / ((
m_channelWidth / 2) * 20e6);
2440 "Reception of unsolicited HE TB PPDUs with interference on RU 1 during PSDU reception");
2452 "Reception of solicited HE TB PPDUs with interference on RU 2 during PSDU reception");
2458 bands.push_back (bandInfo);
2461 Ptr<SpectrumValue> interferencePsdRu2 = Create<SpectrumValue> (SpectrumInterferenceRu2);
2462 *interferencePsdRu2 = interferencePower / ((
m_channelWidth / 2) * 20e6);
2474 "Reception of unsolicited HE TB PPDUs with interference on RU 2 during PSDU reception");
2486 "Reception of solicited HE TB PPDUs with interference on the full band during PSDU reception");
2492 bands.push_back (bandInfo);
2495 Ptr<SpectrumValue> interferencePsdAll = Create<SpectrumValue> (SpectrumInterferenceAll);
2496 *interferencePsdAll = interferencePower / (
m_channelWidth * 20e6);
2508 "Reception of unsolicited HE TB PPDUs with interference on the full band during PSDU reception");
2521 "Reception of solicited HE TB PPDUs with another HE TB PPDU arriving on RU 1 during PSDU reception");
2525 uint32_t succ, fail, bytes;
2550 "Reception of unsolicited HE TB PPDUs with another HE TB PPDU arriving on RU 1 during PSDU reception");
2563 "Reception of solicited HE TB PPDUs with another HE TB PPDU arriving on RU 2 during PSDU reception");
2591 "Reception of unsolicited HE TB PPDUs with another HE TB PPDU arriving on RU2 during payload reception");
2603 "Reception of solicited HE TB PPDUs with an HE SU PPDU arriving during the 400 ns window");
2615 "Reception of unsolicited HE TB PPDUs with an HE SU PPDU arriving during the 400 ns window");
2627 "Reception of solicited HE TB PPDU only on RU 2");
2642 "Reception of unsolicited HE TB PPDUs only on RU 2");
2674 "Measure power for reception of HE TB PPDU only on RU 2");
2675 double rxPower =
DbmToW (19);
2689 "Measure power for reception of HE TB PPDU only on RU 2 with PSD limitation");
2695 double rxPowerOfdma = rxPower;
2718 "Measure power for reception of HE TB PPDU on both RUs");
2720 double rxPowerNonOfdma = (
m_channelWidth >= 40) ? rxPower : rxPower * 2;
2722 rxPowerNonOfdma, rxPowerNonOfdma,
2733 "Reception of an HE SU PPDU from another BSS");
2774 Simulator::Destroy ();
2792 void DoRun (
void)
override;
2801 void SendHeTbPpdu (uint16_t txStaId, std::size_t index, std::size_t payloadSize,
Time txDuration);
2825 void CheckRxFromSta1 (uint32_t expectedSuccess, uint32_t expectedFailures, uint32_t expectedBytes);
2833 void CheckRxFromSta2 (uint32_t expectedSuccess, uint32_t expectedFailures, uint32_t expectedBytes);
2884 :
TestCase (
"PHY padding exclusion test"),
2885 m_countRxSuccessFromSta1 (0),
2886 m_countRxSuccessFromSta2 (0),
2887 m_countRxFailureFromSta1 (0),
2888 m_countRxFailureFromSta2 (0),
2889 m_countRxBytesFromSta1 (0),
2890 m_countRxBytesFromSta2 (0)
2899 WifiTxVector txVector =
WifiTxVector (HePhy::GetHeMcs7 (), 0,
WIFI_PREAMBLE_HE_TB, 800, 1, 1, 0,
DEFAULT_CHANNEL_WIDTH,
false,
false, 1);
2902 txVector.
SetRu (ru, txStaId);
2903 txVector.
SetMode (HePhy::GetHeMcs7 (), txStaId);
2904 txVector.
SetNss (1, txStaId);
2911 std::ostringstream addr;
2912 addr <<
"00:00:00:00:00:0" << txStaId;
2916 psdus.insert (std::make_pair (txStaId, psdu));
2923 else if (txStaId == 2)
2928 txVector.
SetLength (HePhy::ConvertHeTbPpduDurationToLSigLength (txDuration,
phy->GetPhyBand ()));
2930 phy->SetPpduUid (0);
2931 phy->Send (psdus, txVector);
3039 RngSeedManager::SetSeed (1);
3040 RngSeedManager::SetRun (1);
3041 int64_t streamNumber = 0;
3050 Ptr<Node> apNode = CreateObject<Node> ();
3055 m_phyAp = CreateObject<OfdmaSpectrumWifiPhy> (0);
3075 Ptr<Node> sta1Node = CreateObject<Node> ();
3077 m_phySta1 = CreateObject<OfdmaSpectrumWifiPhy> (1);
3092 Ptr<Node> sta2Node = CreateObject<Node> ();
3094 m_phySta2 = CreateObject<OfdmaSpectrumWifiPhy> (2);
3109 Ptr<Node> interfererNode = CreateObject<Node> ();
3115 interfererNode->
AddDevice (interfererDev);
3135 Time ppduWithPaddingDuration = expectedPpduDuration + 10 *
NanoSeconds (12800 + 800 );
3167 bands.push_back (bandInfo);
3170 Ptr<SpectrumValue> interferencePsdRu1 = Create<SpectrumValue> (SpectrumInterferenceRu1);
3171 double interferencePower = 0.1;
3191 Simulator::Destroy ();
3209 void DoRun (
void)
override;
3216 void SendMuBar (std::vector <uint16_t> staIds);
3232 void RunOne (
bool setupBa);
3250 WifiTxVector txVector, std::vector<bool> statusPerMpdu);
3275 :
TestCase (
"UL-OFDMA power control test"),
3280 m_txPowerLevels (0),
3281 m_requestedRssiSta1 (0),
3282 m_requestedRssiSta2 (0),
3308 NS_ASSERT (!staIds.empty () && staIds.size () <= 2);
3321 HeRu::RuType ru = (staIds.size () == 1) ? HeRu::RU_242_TONE : HeRu::RU_106_TONE;
3322 std::size_t index = 1;
3323 int8_t ulTargetRssi = -40;
3324 for (
auto const& staId : staIds)
3337 else if (staId == 2)
3348 bar.
SetType (BlockAckReqType::COMPRESSED);
3364 if (staIds.size () == 1)
3366 uint16_t aidSta1 = DynamicCast<StaWifiMac> (
m_sta1Dev->
GetMac ())->GetAssociationId ();
3367 if (staIds.front () == aidSta1)
3390 uint16_t staId = staIds.front ();
3393 psdus.insert (std::make_pair (
SU_STA_ID, psdu));
3403 double rssi = rxSignalInfo.
rssi;
3431 Ptr<Node> apNode = CreateObject<Node> ();
3449 wifi.SetRemoteStationManager (
"ns3::ConstantRateWifiManager",
3454 mac.SetType (
"ns3::StaWifiMac");
3456 wifi.AssignStreams (staDevs, 0);
3457 m_sta1Dev = DynamicCast<WifiNetDevice> (staDevs.
Get (0));
3459 m_sta2Dev = DynamicCast<WifiNetDevice> (staDevs.
Get (1));
3465 mac.SetType (
"ns3::ApWifiMac",
3468 m_apDev = DynamicCast<WifiNetDevice> (
wifi.Install (spectrumPhy,
mac, apNode).Get (0));
3476 mobility.SetMobilityModel (
"ns3::ConstantPositionMobilityModel");
3478 positionAlloc->
Add (Vector (0.0, 0.0, 0.0));
3479 positionAlloc->
Add (Vector (1.0, 0.0, 0.0));
3480 positionAlloc->
Add (Vector (2.0, 0.0, 0.0));
3481 mobility.SetPositionAllocator (positionAlloc);
3507 RngSeedManager::SetSeed (1);
3508 RngSeedManager::SetRun (1);
3509 int64_t streamNumber = 0;
3550 std::vector<uint16_t> staIds {1};
3556 std::vector<uint16_t> staIds {2};
3562 std::vector<uint16_t> staIds {1, 2};
3639 Simulator::Destroy ();