20#include "ns3/ap-wifi-mac.h"
21#include "ns3/boolean.h"
22#include "ns3/constant-position-mobility-model.h"
23#include "ns3/ctrl-headers.h"
24#include "ns3/double.h"
25#include "ns3/he-configuration.h"
26#include "ns3/he-phy.h"
27#include "ns3/he-ppdu.h"
28#include "ns3/interference-helper.h"
30#include "ns3/mobility-helper.h"
31#include "ns3/multi-model-spectrum-channel.h"
32#include "ns3/nist-error-rate-model.h"
34#include "ns3/non-communicating-net-device.h"
35#include "ns3/pointer.h"
36#include "ns3/rng-seed-manager.h"
37#include "ns3/simulator.h"
38#include "ns3/spectrum-wifi-helper.h"
39#include "ns3/spectrum-wifi-phy.h"
40#include "ns3/sta-wifi-mac.h"
41#include "ns3/string.h"
43#include "ns3/threshold-preamble-detection-model.h"
44#include "ns3/waveform-generator.h"
45#include "ns3/wifi-mac-header.h"
46#include "ns3/wifi-net-device.h"
47#include "ns3/wifi-phy-listener.h"
48#include "ns3/wifi-psdu.h"
49#include "ns3/wifi-spectrum-signal-parameters.h"
50#include "ns3/wifi-spectrum-value-helper.h"
51#include "ns3/wifi-utils.h"
120 return HePhy::GetStaId(ppdu);
216 TypeId(
"ns3::OfdmaSpectrumWifiPhy")
218 .SetGroupName(
"Wifi")
219 .AddTraceSource(
"TxPpduUid",
220 "UID of the PPDU to be transmitted",
222 "ns3::OfdmaSpectrumWifiPhy::TxPpduUidCallback");
242 SpectrumWifiPhy::DoInitialize();
249 SpectrumWifiPhy::DoDispose();
269 SpectrumWifiPhy::StartTx(ppdu, txVector);
272std::map<std::pair<uint64_t, WifiPreamble>,
Ptr<Event>>&
311 void DoRun()
override;
323 std::vector<bool> statusPerMpdu);
334 std::vector<bool> statusPerMpdu);
345 std::vector<bool> statusPerMpdu);
401 void SendMuPpdu(uint16_t rxStaId1, uint16_t rxStaId2);
455 m_countRxSuccessSta1(0),
456 m_countRxSuccessSta2(0),
457 m_countRxSuccessSta3(0),
458 m_countRxFailureSta1(0),
459 m_countRxFailureSta2(0),
460 m_countRxFailureSta3(0),
461 m_countRxBytesSta1(0),
462 m_countRxBytesSta2(0),
463 m_countRxBytesSta3(0),
502 ruType = HeRu::RU_106_TONE;
507 ruType = HeRu::RU_242_TONE;
512 ruType = HeRu::RU_484_TONE;
517 ruType = HeRu::RU_996_TONE;
528 txVector.
SetRu(ru1, rxStaId1);
529 txVector.
SetMode(HePhy::GetHeMcs7(), rxStaId1);
530 txVector.
SetNss(1, rxStaId1);
533 txVector.
SetRu(ru2, rxStaId2);
534 txVector.
SetMode(HePhy::GetHeMcs9(), rxStaId2);
535 txVector.
SetNss(1, rxStaId2);
544 psdus.insert(std::make_pair(rxStaId1, psdu1));
553 psdus.insert(std::make_pair(rxStaId2, psdu2));
638 "The number of successfully received packets by STA 1 is not correct!");
641 "The number of unsuccessfully received packets by STA 1 is not correct!");
644 "The number of bytes received by STA 1 is not correct!");
654 "The number of successfully received packets by STA 2 is not correct!");
657 "The number of unsuccessfully received packets by STA 2 is not correct!");
660 "The number of bytes received by STA 2 is not correct!");
670 "The number of successfully received packets by STA 3 is not correct!");
673 "The number of unsuccessfully received packets by STA 3 is not correct!");
676 "The number of bytes received by STA 3 is not correct!");
693 phy->GetAttribute(
"State", ptr);
695 currentState = state->GetState();
699 "PHY State " << currentState <<
" does not match expected state "
709 spectrumChannel->AddPropagationLossModel(lossModel);
711 CreateObject<ConstantSpeedPropagationDelayModel>();
712 spectrumChannel->SetPropagationDelayModel(delayModel);
716 m_phyAp = CreateObject<SpectrumWifiPhy>();
731 Ptr<Node> sta1Node = CreateObject<Node>();
733 m_phySta1 = CreateObject<OfdmaSpectrumWifiPhy>(1);
751 Ptr<Node> sta2Node = CreateObject<Node>();
753 m_phySta2 = CreateObject<OfdmaSpectrumWifiPhy>(2);
771 Ptr<Node> sta3Node = CreateObject<Node>();
773 m_phySta3 = CreateObject<OfdmaSpectrumWifiPhy>(3);
791 Ptr<Node> interfererNode = CreateObject<Node>();
797 interfererNode->
AddDevice(interfererDev);
818 RngSeedManager::SetSeed(1);
819 RngSeedManager::SetRun(1);
820 int64_t streamNumber = 0;
826 auto channelNum = std::get<0>(*WifiPhyOperatingChannel::FindFirst(0,
882 Simulator::Schedule(
Seconds(1.1),
889 Simulator::Schedule(
Seconds(1.1),
940 Simulator::Schedule(
Seconds(2.1),
949 Simulator::Schedule(
Seconds(2.1),
967 bands.push_back(bandInfo);
970 Ptr<SpectrumValue> interferencePsdRu1 = Create<SpectrumValue>(SpectrumInterferenceRu1);
971 double interferencePower = 0.1;
972 *interferencePsdRu1 = interferencePower / ((
m_channelWidth / 2) * 20e6);
1018 Simulator::Schedule(
Seconds(3.1),
1037 bands.push_back(bandInfo);
1040 Ptr<SpectrumValue> interferencePsdRu2 = Create<SpectrumValue>(SpectrumInterferenceRu2);
1041 *interferencePsdRu2 = interferencePower / ((
m_channelWidth / 2) * 20e6);
1084 Simulator::Schedule(
Seconds(4.1),
1106 bands.push_back(bandInfo);
1109 Ptr<SpectrumValue> interferencePsdAll = Create<SpectrumValue>(SpectrumInterferenceAll);
1110 *interferencePsdAll = interferencePower / (
m_channelWidth * 20e6);
1189 Simulator::Destroy();
1206 void DoRun()
override;
1218 const std::vector<bool> statusPerMpdu);
1230 std::vector<bool> statusPerMpdu);
1278 const std::vector<bool>& puncturedSubchannels);
1334 :
TestCase(
"DL-OFDMA PHY puncturing test"),
1335 m_countRxSuccessSta1(0),
1336 m_countRxSuccessSta2(0),
1337 m_countRxFailureSta1(0),
1338 m_countRxFailureSta2(0),
1339 m_countRxBytesSta1(0),
1340 m_countRxBytesSta2(0),
1343 m_indexSubchannel(0),
1363 const std::vector<bool>& puncturedSubchannels)
1379 puncturedSubchannels.empty()
1381 : (puncturedSubchannels.at(1) ? HeRu::RU_242_TONE : HeRu::RU_484_TONE);
1383 txVector.
SetRu(ru1, rxStaId1);
1384 txVector.
SetMode(HePhy::GetHeMcs7(), rxStaId1);
1385 txVector.
SetNss(1, rxStaId1);
1387 ruType = puncturedSubchannels.empty()
1389 : (puncturedSubchannels.at(1) ? HeRu::RU_484_TONE : HeRu::RU_242_TONE);
1391 ruType == HeRu::RU_484_TONE ? 2 : (puncturedSubchannels.at(3) ? 3 : 4),
1393 txVector.
SetRu(ru2, rxStaId2);
1394 txVector.
SetMode(HePhy::GetHeMcs9(), rxStaId2);
1395 txVector.
SetNss(1, rxStaId2);
1397 std::vector<uint8_t> ruAlloc;
1398 if (puncturedSubchannels.empty())
1400 std::fill_n(std::back_inserter(ruAlloc), 4, 200);
1404 ruAlloc.push_back(puncturedSubchannels.at(1) ? 192 : 200);
1405 ruAlloc.push_back(puncturedSubchannels.at(1) ? 113 : 200);
1406 ruAlloc.push_back(puncturedSubchannels.at(2) ? 113
1407 : (puncturedSubchannels.at(3) ? 192 : 200));
1408 ruAlloc.push_back(puncturedSubchannels.at(2) ? 192
1409 : (puncturedSubchannels.at(3) ? 113 : 200));
1422 psdus.insert(std::make_pair(rxStaId1, psdu1));
1431 psdus.insert(std::make_pair(rxStaId2, psdu2));
1433 if (!puncturedSubchannels.empty())
1501 "The number of successfully received packets by STA 1 is not correct!");
1504 "The number of unsuccessfully received packets by STA 1 is not correct!");
1507 "The number of bytes received by STA 1 is not correct!");
1517 "The number of successfully received packets by STA 2 is not correct!");
1520 "The number of unsuccessfully received packets by STA 2 is not correct!");
1523 "The number of bytes received by STA 2 is not correct!");
1539 phy->GetAttribute(
"State", ptr);
1541 currentState = state->GetState();
1545 "PHY State " << currentState <<
" does not match expected state "
1555 spectrumChannel->AddPropagationLossModel(lossModel);
1557 CreateObject<ConstantSpeedPropagationDelayModel>();
1558 spectrumChannel->SetPropagationDelayModel(delayModel);
1560 Ptr<Node> apNode = CreateObject<Node>();
1562 m_phyAp = CreateObject<SpectrumWifiPhy>();
1577 Ptr<Node> sta1Node = CreateObject<Node>();
1579 m_phySta1 = CreateObject<OfdmaSpectrumWifiPhy>(1);
1597 Ptr<Node> sta2Node = CreateObject<Node>();
1599 m_phySta2 = CreateObject<OfdmaSpectrumWifiPhy>(2);
1617 Ptr<Node> interfererNode = CreateObject<Node>();
1623 interfererNode->
AddDevice(interfererDev);
1642 RngSeedManager::SetSeed(1);
1643 RngSeedManager::SetRun(1);
1644 int64_t streamNumber = 0;
1649 auto channelNum = std::get<0>(*WifiPhyOperatingChannel::FindFirst(0,
1668 bandInfo.
fl = bandInfo.
fc - (5 * 1e6);
1669 bandInfo.
fh = bandInfo.
fc + (5 * 1e6);
1671 bands.push_back(bandInfo);
1675 double interferencePower = 0.1;
1676 *interferencePsd = interferencePower / 10e6;
1678 Simulator::Schedule(
Seconds(0.0),
1686 Simulator::Schedule(
Seconds(1.0),
1691 std::vector<bool>{});
1719 Simulator::Schedule(
Seconds(1.1),
1726 Simulator::Schedule(
Seconds(1.1),
1736 Simulator::Schedule(
Seconds(1.1),
1743 Simulator::Schedule(
Seconds(1.1),
1756 std::vector<bool> puncturedSubchannels;
1761 puncturedSubchannels.push_back(
true);
1765 puncturedSubchannels.push_back(
false);
1768 Simulator::Schedule(
Seconds(2.0),
1773 puncturedSubchannels);
1799 Simulator::Schedule(
Seconds(2.1),
1806 Simulator::Schedule(
Seconds(2.1),
1823 for (
auto index : {1, 2, 3})
1828 Simulator::Destroy();
1846 void DoRun()
override;
1887 void CheckUid(uint16_t staId, uint64_t expectedUid);
1899 :
TestCase(
"UL-OFDMA PPDU UID attribution test"),
1900 m_ppduUidAp(UINT64_MAX),
1901 m_ppduUidSta1(UINT64_MAX),
1902 m_ppduUidSta2(UINT64_MAX)
1916 spectrumChannel->AddPropagationLossModel(lossModel);
1918 CreateObject<ConstantSpeedPropagationDelayModel>();
1919 spectrumChannel->SetPropagationDelayModel(delayModel);
1921 Ptr<Node> apNode = CreateObject<Node>();
1923 m_phyAp = CreateObject<OfdmaSpectrumWifiPhy>(0);
1930 auto channelNum = std::get<0>(*WifiPhyOperatingChannel::FindFirst(0,
1949 Ptr<Node> sta1Node = CreateObject<Node>();
1951 m_phySta1 = CreateObject<OfdmaSpectrumWifiPhy>(1);
1970 Ptr<Node> sta2Node = CreateObject<Node>();
1972 m_phySta2 = CreateObject<OfdmaSpectrumWifiPhy>(2);
2027 "UID " << uid <<
" does not match expected one " << expectedUid <<
" for "
2074 uint16_t rxStaId1 = 1;
2076 txVector.
SetRu(ru1, rxStaId1);
2077 txVector.
SetMode(HePhy::GetHeMcs7(), rxStaId1);
2078 txVector.
SetNss(1, rxStaId1);
2080 uint16_t rxStaId2 = 2;
2082 txVector.
SetRu(ru2, rxStaId2);
2083 txVector.
SetMode(HePhy::GetHeMcs9(), rxStaId2);
2084 txVector.
SetNss(1, rxStaId2);
2095 psdus.insert(std::make_pair(rxStaId1, psdu1));
2104 psdus.insert(std::make_pair(rxStaId2, psdu2));
2126 uint16_t rxStaId1 = 1;
2128 txVector1.
SetRu(ru1, rxStaId1);
2129 txVector1.
SetMode(HePhy::GetHeMcs7(), rxStaId1);
2130 txVector1.
SetNss(1, rxStaId1);
2139 psdus1.insert(std::make_pair(rxStaId1, psdu1));
2141 uint16_t rxStaId2 = 2;
2143 txVector2.
SetRu(ru2, rxStaId2);
2144 txVector2.
SetMode(HePhy::GetHeMcs9(), rxStaId2);
2145 txVector2.
SetNss(1, rxStaId2);
2154 psdus2.insert(std::make_pair(rxStaId2, psdu2));
2167 HePhy::ConvertHeTbPpduDurationToLSigLength(txDuration, txVector1,
m_phySta1->
GetPhyBand())
2170 HePhy::ConvertHeTbPpduDurationToLSigLength(txDuration, txVector2,
m_phySta2->
GetPhyBand())
2196 hdr.
SetAddr1(Mac48Address::GetBroadcast());
2199 psdus.insert(std::make_pair(
SU_STA_ID, psdu));
2220 RngSeedManager::SetSeed(1);
2221 RngSeedManager::SetRun(1);
2222 int64_t streamNumber = 0;
2254 Simulator::Destroy();
2272 void DoRun()
override;
2283 void RxHeTbPpdu(uint64_t uid, uint16_t staId,
double txPowerWatts,
size_t payloadSize);
2332 :
TestCase(
"UL-OFDMA multiple RX events test"),
2333 m_totalBytesDropped(0),
2334 m_trigVector(
HePhy::GetHeMcs7(),
2373 for (
const auto& uid : uids)
2376 auto it = events.find(pair);
2377 bool found = (it != events.end());
2380 "HE TB PPDU with UID " << uid <<
" has not been received!");
2388 expectedBytesDropped,
2389 "The number of dropped bytes is not correct!");
2395 double txPowerWatts,
2412 txVector.
SetRu(ru, staId);
2413 txVector.
SetMode(HePhy::GetHeMcs7(), staId);
2414 txVector.
SetNss(1, staId);
2425 psdus.insert(std::make_pair(staId, psdu));
2435 HePpdu::PSD_NON_HE_PORTION,
2439 Time nonOfdmaDuration =
m_phy->
GetHePhy()->CalculateNonOfdmaDurationForHeTb(txVector);
2441 m_phy->
GetHePhy()->GetCenterFrequencyForNonOfdmaPart(txVector, staId);
2442 uint16_t ruWidth = HeRu::GetBandwidth(txVector.
GetRu(staId).
GetRuType());
2443 uint16_t channelWidth = ruWidth < 20 ? 20 : ruWidth;
2444 Ptr<SpectrumValue> rxPsd = WifiSpectrumValueHelper::CreateHeOfdmTxPowerSpectralDensity(
2450 rxParams->psd = rxPsd;
2451 rxParams->txPhy =
nullptr;
2452 rxParams->duration = nonOfdmaDuration;
2453 rxParams->ppdu = ppdu;
2456 std::tie(length, ppduDuration) =
2457 HePhy::ConvertHeTbPpduDurationToLSigLength(ppduDuration, txVector,
m_phy->
GetPhyBand());
2465 Ptr<HePpdu> ppduOfdma = DynamicCast<HePpdu>(ppdu->Copy());
2466 ppduOfdma->SetTxPsdFlag(HePpdu::PSD_HE_PORTION);
2469 WifiSpectrumValueHelper::CreateHeMuOfdmTxPowerSpectralDensity(
DEFAULT_FREQUENCY,
2475 rxParamsOfdma->psd = rxPsd;
2476 rxParamsOfdma->txPhy =
nullptr;
2477 rxParamsOfdma->duration = ppduDuration - nonOfdmaDuration;
2478 rxParamsOfdma->ppdu = ppduOfdma;
2479 Simulator::Schedule(nonOfdmaDuration,
2505 m_phy = CreateObject<OfdmaSpectrumWifiPhy>(0);
2522 CreateObject<ThresholdPreambleDetectionModel>();
2523 preambleDetectionModel->SetAttribute(
"Threshold",
DoubleValue(4));
2524 preambleDetectionModel->SetAttribute(
"MinimumRssi",
DoubleValue(-82));
2527 heConfiguration->SetMaxTbPpduDelay(
NanoSeconds(400));
2541 RngSeedManager::SetSeed(1);
2542 RngSeedManager::SetRun(1);
2543 int64_t streamNumber = 0;
2546 double txPowerWatts = 0.01;
2550 std::vector<uint64_t> uids{0};
2551 Simulator::Schedule(
Seconds(1),
2578 std::vector<uint64_t> uids{1, 2};
2579 Simulator::Schedule(
Seconds(2),
2622 std::vector<uint64_t> uids{3, 4};
2623 Simulator::Schedule(
Seconds(3),
2666 std::vector<uint64_t> uids{5, 6};
2667 Simulator::Schedule(
Seconds(4),
2701 std::vector<uint64_t>{uids[0]});
2714 std::vector<uint64_t> uids{7, 8};
2715 Simulator::Schedule(
Seconds(5),
2749 std::vector<uint64_t>{uids[0]});
2762 std::vector<uint64_t> uids{9};
2763 Simulator::Schedule(
Seconds(6),
2795 Simulator::Destroy();
2840 const std::vector<Time>& )
override
2958 void DoRun()
override;
2969 uint8_t bssColor)
const;
2988 std::size_t payloadSize,
3000 void SendHeSuPpdu(uint16_t txStaId, std::size_t payloadSize, uint64_t uid, uint8_t bssColor);
3060 double expectedRxPower);
3069 double expectedRxPower);
3100 Time expectedLastNotification,
3101 bool expectedSuccess);
3118 std::vector<bool> statusPerMpdu);
3155 bool scheduleTxSta1 =
true,
3170 double rxPowerNonOfdmaRu1,
3171 double rxPowerNonOfdmaRu2,
3172 double rxPowerOfdmaRu1,
3173 double rxPowerOfdmaRu2);
3186 std::unique_ptr<OfdmaTestPhyListener>
3205 m_countRxSuccessFromSta1(0),
3206 m_countRxSuccessFromSta2(0),
3207 m_countRxFailureFromSta1(0),
3208 m_countRxFailureFromSta2(0),
3209 m_countRxBytesFromSta1(0),
3210 m_countRxBytesFromSta2(0),
3219 std::size_t payloadSize,
3244 std::ostringstream addr;
3245 addr <<
"00:00:00:00:00:0" << txStaId;
3249 psdus.insert(std::make_pair(
SU_STA_ID, psdu));
3256 else if (txStaId == 2)
3260 else if (txStaId == 3)
3264 else if (txStaId == 0)
3268 phy->SetPpduUid(uid);
3269 phy->Send(psdus, txVector);
3275 uint8_t bssColor)
const
3293 ruType = HeRu::RU_106_TONE;
3297 ruType = HeRu::RU_242_TONE;
3301 ruType = HeRu::RU_484_TONE;
3305 ruType = HeRu::RU_996_TONE;
3312 bool primary80MHz =
true;
3315 primary80MHz =
false;
3320 txVector.
SetRu(ru, txStaId);
3321 txVector.
SetMode(HePhy::GetHeMcs7(), txStaId);
3322 txVector.
SetNss(1, txStaId);
3332 channelWidth = (channelWidth == 160 ? 20 : channelWidth * 2);
3349 if (channelWidth == 20)
3351 ruType = (error ==
RU_TYPE ? HeRu::RU_52_TONE : HeRu::RU_106_TONE);
3353 else if (channelWidth == 40)
3355 ruType = (error ==
RU_TYPE ? HeRu::RU_106_TONE : HeRu::RU_242_TONE);
3357 else if (channelWidth == 80)
3359 ruType = (error ==
RU_TYPE ? HeRu::RU_242_TONE : HeRu::RU_484_TONE);
3361 else if (channelWidth == 160)
3363 ruType = (error ==
RU_TYPE ? HeRu::RU_484_TONE : HeRu::RU_996_TONE);
3370 uint16_t aid1 = (error ==
AID ? 3 : 1);
3371 uint16_t aid2 = (error ==
AID ? 4 : 2);
3375 txVector.
SetRu(ru1, aid1);
3376 txVector.
SetMode((error ==
MCS ? HePhy::GetHeMcs5() : HePhy::GetHeMcs7()), aid1);
3377 txVector.
SetNss(1, aid1);
3379 HeRu::RuSpec ru2(ruType, (channelWidth == 160 ? 1 : 2), (channelWidth == 160 ?
false :
true));
3381 txVector.
SetRu(ru2, aid2);
3382 txVector.
SetMode((error ==
MCS ? HePhy::GetHeMcs5() : HePhy::GetHeMcs7()), aid2);
3383 txVector.
SetNss(1, aid2);
3402 std::size_t payloadSize,
3407 NS_LOG_FUNCTION(
this << txStaId << index << payloadSize << uid << +bssColor << (incrementUid));
3421 std::ostringstream addr;
3422 addr <<
"00:00:00:00:00:0" << txStaId;
3426 psdus.insert(std::make_pair(txStaId, psdu));
3433 else if (txStaId == 2)
3437 else if (txStaId == 3)
3443 phy->CalculateTxDuration(psdu->
GetSize(), txVector,
phy->GetPhyBand(), txStaId);
3445 HePhy::ConvertHeTbPpduDurationToLSigLength(txDuration, txVector,
phy->GetPhyBand()).first);
3447 phy->SetPpduUid(uid);
3448 phy->Send(psdus, txVector);
3511 "The number of successfully received packets from STA 1 is not correct!");
3515 "The number of unsuccessfully received packets from STA 1 is not correct!");
3518 "The number of bytes received from STA 1 is not correct!");
3528 "The number of successfully received packets from STA 2 is not correct!");
3532 "The number of unsuccessfully received packets from STA 2 is not correct!");
3535 "The number of bytes received from STA 2 is not correct!");
3541 double expectedRxPower)
3545 double rxPower =
event->GetRxPowerW(band);
3546 NS_LOG_FUNCTION(
this << band.first << band.second << expectedRxPower << rxPower);
3551 "RX power " << rxPower <<
" over (" << band.first <<
", "
3552 << band.second <<
") does not match expected power "
3559 double expectedRxPower)
3566 NS_LOG_FUNCTION(
this << band.first << band.second << expectedRxPower);
3568 if (expectedRxPower > 0.0)
3571 phy->GetEnergyDuration(expectedRxPower - step, band).IsStrictlyPositive(),
3573 "At least " << expectedRxPower <<
" W expected for OFDMA part over (" << band.first
3576 phy->GetEnergyDuration(expectedRxPower + step, band).IsStrictlyPositive(),
3578 "At most " << expectedRxPower <<
" W expected for OFDMA part over (" << band.first
3584 phy->GetEnergyDuration(expectedRxPower + step, band).IsStrictlyPositive(),
3586 "At most " << expectedRxPower <<
" W expected for OFDMA part over (" << band.first
3596 "m_currentEvent for AP was not cleared");
3599 "m_currentEvent for STA 1 was not cleared");
3602 "m_currentEvent for STA 2 was not cleared");
3619 phy->GetAttribute(
"State", ptr);
3621 currentState = state->GetState();
3625 "PHY State " << currentState <<
" does not match expected state "
3631 Time expectedLastNotification)
3634 expectedNotifications,
3635 "Number of RX start notifications "
3637 <<
" does not match expected count " << expectedNotifications
3640 expectedLastNotification,
3641 "Last time RX start notification has been received "
3643 <<
" does not match expected time " << expectedLastNotification
3649 Time expectedLastNotification,
3650 bool expectedSuccess)
3653 expectedNotifications,
3654 "Number of RX end notifications "
3656 <<
" does not match expected count " << expectedNotifications
3659 expectedLastNotification,
3660 "Last time RX end notification has been received "
3662 <<
" does not match expected time " << expectedLastNotification
3666 "Last time RX end notification indicated a "
3668 <<
" but expected a " << (expectedSuccess ?
"success" :
"failure")
3693 heConfiguration->SetAttribute(
"BssColor",
UintegerValue(bssColor));
3709 spectrumChannel->AddPropagationLossModel(lossModel);
3711 CreateObject<ConstantSpeedPropagationDelayModel>();
3712 spectrumChannel->SetPropagationDelayModel(delayModel);
3715 CreateObject<ThresholdPreambleDetectionModel>();
3716 preambleDetectionModel->SetAttribute(
3720 preambleDetectionModel->SetAttribute(
"Threshold",
DoubleValue(-100));
3722 Ptr<Node> apNode = CreateObject<Node>();
3728 m_phyAp = CreateObject<OfdmaSpectrumWifiPhy>(0);
3751 Ptr<Node> sta1Node = CreateObject<Node>();
3755 m_phySta1 = CreateObject<OfdmaSpectrumWifiPhy>(1);
3771 Ptr<Node> sta2Node = CreateObject<Node>();
3775 m_phySta2 = CreateObject<OfdmaSpectrumWifiPhy>(2);
3791 Ptr<Node> sta3Node = CreateObject<Node>();
3795 m_phySta3 = CreateObject<OfdmaSpectrumWifiPhy>(3);
3811 Ptr<Node> interfererNode = CreateObject<Node>();
3817 interfererNode->
AddDevice(interfererDev);
3821 for (
auto&
phy : phys)
3829 phy->SetAttribute(
"TxMaskInnerBandMinimumRejection",
DoubleValue(-100.0));
3830 phy->SetAttribute(
"TxMaskOuterBandMinimumRejection",
DoubleValue(-100.0));
3831 phy->SetAttribute(
"TxMaskOuterBandMaximumRejection",
DoubleValue(-100.0));
3866 bool scheduleTxSta1,
3867 Time ulTimeDifference,
3871 static uint64_t uid = 0;
3896 Simulator::Schedule(delay,
3906 Simulator::Schedule(delay + ulTimeDifference,
3921 expectedStateBeforeEnd);
3926 expectedStateAtEnd);
3929 if (expectedSuccessFromSta1 + expectedFailuresFromSta1 + expectedSuccessFromSta2 +
3930 expectedFailuresFromSta2 >
3934 const bool isSuccess = (expectedSuccessFromSta1 > 0) || (expectedSuccessFromSta2 > 0);
3944 Simulator::Schedule(expectedPayloadEnd,
3951 Simulator::Schedule(expectedPayloadEnd +
NanoSeconds(1),
3961 Simulator::Schedule(delay,
3964 expectedSuccessFromSta1,
3965 expectedFailuresFromSta1,
3966 expectedBytesFromSta1);
3968 Simulator::Schedule(delay,
3971 expectedSuccessFromSta2,
3972 expectedFailuresFromSta2,
3973 expectedBytesFromSta2);
3983 double rxPowerNonOfdmaRu1,
3984 double rxPowerNonOfdmaRu2,
3985 double rxPowerOfdmaRu1,
3986 double rxPowerOfdmaRu2)
3988 Time detectionDuration = WifiPhy::GetPreambleDetectionDuration();
3992 Time nonOfdmaDuration = hePhy->CalculateNonOfdmaDurationForHeTb(txVectorSta2);
3993 NS_ASSERT(nonOfdmaDuration == hePhy->CalculateNonOfdmaDurationForHeTb(txVectorSta1));
3995 std::vector<double> rxPowerNonOfdma{rxPowerNonOfdmaRu1, rxPowerNonOfdmaRu2};
3996 std::vector<WifiSpectrumBand> nonOfdmaBand{hePhy->GetNonOfdmaBand(txVectorSta1, 1),
3997 hePhy->GetNonOfdmaBand(txVectorSta2, 2)};
3998 std::vector<double> rxPowerOfdma{rxPowerOfdmaRu1, rxPowerOfdmaRu2};
3999 std::vector<WifiSpectrumBand> ofdmaBand{hePhy->GetRuBandForRx(txVectorSta1, 1),
4000 hePhy->GetRuBandForRx(txVectorSta2, 2)};
4002 for (uint8_t i = 0; i < 2; ++i)
4008 Simulator::Schedule(
4009 delay + detectionDuration +
4015 rxPowerNonOfdma[i]);
4016 Simulator::Schedule(delay + nonOfdmaDuration -
NanoSeconds(1),
4021 rxPowerNonOfdma[i]);
4023 Simulator::Schedule(delay + nonOfdmaDuration +
4044 Simulator::Schedule(
4045 delay + detectionDuration +
4051 rxPowerNonOfdma[i]);
4052 Simulator::Schedule(delay + nonOfdmaDuration -
NanoSeconds(1),
4057 rxPowerNonOfdma[i]);
4059 Simulator::Schedule(delay + nonOfdmaDuration +
4075 if (rxPowerOfdmaRu1 != 0.0)
4082 double rxPowerNonOfdmaSta1Only =
4084 ? rxPowerNonOfdma[0]
4085 : rxPowerNonOfdma[0] / 2;
4087 Simulator::Schedule(
4088 delay + detectionDuration +
4094 rxPowerNonOfdmaSta1Only);
4095 Simulator::Schedule(delay + nonOfdmaDuration -
NanoSeconds(1),
4100 rxPowerNonOfdmaSta1Only);
4102 Simulator::Schedule(delay + nonOfdmaDuration +
4122 RngSeedManager::SetSeed(1);
4123 RngSeedManager::SetRun(1);
4124 int64_t streamNumber = 0;
4130 auto channelNum = std::get<0>(*WifiPhyOperatingChannel::FindFirst(0,
4159 Simulator::Schedule(delay,
4162 "Reception of solicited HE TB PPDUs");
4177 Simulator::Schedule(
4181 "Reception of solicited HE TB PPDUs with delay (< 400ns) between the two signals");
4197 Simulator::Schedule(delay,
4200 "Dropping of unsolicited HE TB PPDUs");
4217 Simulator::Schedule(delay,
4220 "Dropping of HE TB PPDUs with channel width differing from TRIGVECTOR");
4238 Simulator::Schedule(delay,
4241 "Dropping of HE TB PPDUs with UL Length differing from TRIGVECTOR");
4259 Simulator::Schedule(delay,
4262 "Dropping of HE TB PPDUs with AIDs differing from TRIGVECTOR");
4280 Simulator::Schedule(delay,
4283 "Dropping of HE TB PPDUs with RU type differing from TRIGVECTOR");
4301 Simulator::Schedule(delay,
4304 "Dropping of HE TB PPDUs with MCS differing from TRIGVECTOR");
4323 Simulator::Schedule(
4327 "Reception of solicited HE TB PPDUs with interference on RU 1 during PSDU reception");
4334 bands.push_back(bandInfo);
4337 Ptr<SpectrumValue> interferencePsdRu1 = Create<SpectrumValue>(SpectrumInterferenceRu1);
4338 double interferencePower = 0.1;
4339 *interferencePsdRu1 = interferencePower / ((
m_channelWidth / 2) * 20e6);
4362 Simulator::Schedule(
4366 "Reception of solicited HE TB PPDUs with interference on RU 2 during PSDU reception");
4372 bands.push_back(bandInfo);
4375 Ptr<SpectrumValue> interferencePsdRu2 = Create<SpectrumValue>(SpectrumInterferenceRu2);
4376 *interferencePsdRu2 = interferencePower / ((
m_channelWidth / 2) * 20e6);
4401 Simulator::Schedule(delay,
4404 "Reception of solicited HE TB PPDUs with interference on the full band "
4405 "during PSDU reception");
4411 bands.push_back(bandInfo);
4414 Ptr<SpectrumValue> interferencePsdAll = Create<SpectrumValue>(SpectrumInterferenceAll);
4415 *interferencePsdAll = interferencePower / (
m_channelWidth * 20e6);
4440 Simulator::Schedule(delay,
4443 "Reception of solicited HE TB PPDUs with another HE TB PPDU arriving on RU "
4444 "1 during PSDU reception");
4492 Simulator::Schedule(delay,
4495 "Reception of solicited HE TB PPDUs with another HE TB PPDU arriving on RU "
4496 "2 during PSDU reception");
4542 Simulator::Schedule(
4546 "Reception of solicited HE TB PPDUs with an HE SU PPDU arriving during the 400 ns window");
4570 Simulator::Schedule(delay,
4573 "Reception of solicited HE TB PPDU only on RU 2");
4600 Simulator::Schedule(delay,
4603 "Measure power for reception of HE TB PPDU only on RU 2");
4628 Simulator::Schedule(
4632 "Measure power for reception of HE TB PPDU only on RU 2 with PSD limitation");
4645 double rxPowerOfdma = rxPower;
4680 Simulator::Schedule(delay,
4683 "Measure power for reception of HE TB PPDU on both RUs");
4703 Simulator::Schedule(delay,
4706 "Reception of an HE TB PPDU from another BSS");
4730 Simulator::Schedule(
4734 "Reception of solicited HE TB PPDUs with delay (< 400ns) between the two signals and "
4735 "reception of an HE TB PPDU from another BSS between the ends of the two HE TB PPDUs");
4789 Simulator::Destroy();
4807 void DoRun()
override;
4818 std::size_t payloadSize,
4892 std::vector<bool> statusPerMpdu);
4915 :
TestCase(
"PHY padding exclusion test"),
4916 m_countRxSuccessFromSta1(0),
4917 m_countRxSuccessFromSta2(0),
4918 m_countRxFailureFromSta1(0),
4919 m_countRxFailureFromSta2(0),
4920 m_countRxBytesFromSta1(0),
4921 m_countRxBytesFromSta2(0)
4928 std::size_t payloadSize,
4946 txVector.
SetRu(ru, txStaId);
4947 txVector.
SetMode(HePhy::GetHeMcs7(), txStaId);
4948 txVector.
SetNss(1, txStaId);
4955 std::ostringstream addr;
4956 addr <<
"00:00:00:00:00:0" << txStaId;
4960 psdus.insert(std::make_pair(txStaId, psdu));
4967 else if (txStaId == 2)
4973 HePhy::ConvertHeTbPpduDurationToLSigLength(txDuration, txVector,
phy->GetPhyBand()).first);
4976 phy->Send(psdus, txVector);
5038 "The number of successfully received packets from STA 1 is not correct!");
5042 "The number of unsuccessfully received packets from STA 1 is not correct!");
5045 "The number of bytes received from STA 1 is not correct!");
5055 "The number of successfully received packets from STA 2 is not correct!");
5059 "The number of unsuccessfully received packets from STA 2 is not correct!");
5062 "The number of bytes received from STA 2 is not correct!");
5070 "m_currentEvent for AP was not cleared");
5073 "m_currentEvent for STA 1 was not cleared");
5076 "m_currentEvent for STA 2 was not cleared");
5094 "PHY State " << currentState <<
" does not match expected state "
5115 RngSeedManager::SetSeed(1);
5116 RngSeedManager::SetRun(1);
5117 int64_t streamNumber = 0;
5122 spectrumChannel->AddPropagationLossModel(lossModel);
5124 CreateObject<ConstantSpeedPropagationDelayModel>();
5125 spectrumChannel->SetPropagationDelayModel(delayModel);
5127 Ptr<Node> apNode = CreateObject<Node>();
5132 m_phyAp = CreateObject<OfdmaSpectrumWifiPhy>(0);
5144 auto channelNum = std::get<0>(*WifiPhyOperatingChannel::FindFirst(0,
5163 Ptr<Node> sta1Node = CreateObject<Node>();
5165 m_phySta1 = CreateObject<OfdmaSpectrumWifiPhy>(1);
5185 Ptr<Node> sta2Node = CreateObject<Node>();
5187 m_phySta2 = CreateObject<OfdmaSpectrumWifiPhy>(2);
5207 Ptr<Node> interfererNode = CreateObject<Node>();
5213 interfererNode->
AddDevice(interfererDev);
5244 trigVector.
SetMode(HePhy::GetHeMcs7(), 1);
5247 trigVector.
SetMode(HePhy::GetHeMcs7(), 2);
5250 std::tie(length, ppduDuration) =
5251 HePhy::ConvertHeTbPpduDurationToLSigLength(ppduDuration, trigVector,
m_phyAp->
GetPhyBand());
5254 hePhyAp->SetTrigVector(trigVector, ppduDuration);
5261 Time ppduWithPaddingDuration =
5262 expectedPpduDuration + 10 *
NanoSeconds(12800 + 800 );
5267 Simulator::Schedule(
Seconds(1.0),
5273 ppduWithPaddingDuration);
5274 Simulator::Schedule(
Seconds(1.0),
5280 ppduWithPaddingDuration);
5283 Simulator::Schedule(
Seconds(1.0),
5286 ppduWithPaddingDuration);
5294 Simulator::Schedule(
Seconds(1.0) + ppduWithPaddingDuration,
5310 Simulator::Schedule(
Seconds(2.0),
5316 ppduWithPaddingDuration);
5317 Simulator::Schedule(
Seconds(2.0),
5323 ppduWithPaddingDuration);
5326 Simulator::Schedule(
Seconds(2.0),
5329 ppduWithPaddingDuration);
5337 bands.push_back(bandInfo);
5340 Ptr<SpectrumValue> interferencePsdRu1 = Create<SpectrumValue>(SpectrumInterferenceRu1);
5341 double interferencePower = 0.1;
5357 Simulator::Schedule(
Seconds(2.0) + ppduWithPaddingDuration,
5375 Simulator::Destroy();
5393 void DoRun()
override;
5400 void SendMuBar(std::vector<uint16_t> staIds);
5416 void RunOne(
bool setupBa);
5436 std::vector<bool> statusPerMpdu);
5461 :
TestCase(
"UL-OFDMA power control test"),
5467 m_requestedRssiSta1(0),
5468 m_requestedRssiSta2(0),
5494 NS_ASSERT(!staIds.empty() && staIds.size() <= 2);
5506 HeRu::RuType ru = (staIds.size() == 1) ? HeRu::RU_242_TONE : HeRu::RU_106_TONE;
5507 std::size_t index = 1;
5508 int8_t ulTargetRssi = -40;
5509 for (
const auto& staId : staIds)
5522 else if (staId == 2)
5533 bar.
SetType(BlockAckReqType::COMPRESSED);
5565 if (staIds.size() == 1)
5567 uint16_t aidSta1 = DynamicCast<StaWifiMac>(
m_sta1Dev->
GetMac())->GetAssociationId();
5568 if (staIds.front() == aidSta1)
5592 uint16_t staId = staIds.front();
5598 psdus.insert(std::make_pair(
SU_STA_ID, psdu));
5610 double rssi = rxSignalInfo.
rssi;
5620 "The obtained RSSI from STA 1 at AP is different from the expected one ("
5621 << rssi <<
" vs " <<
m_rssiSta1 <<
", with tolerance of " <<
m_tol <<
")");
5629 "The obtained RSSI from STA 2 at AP is different from the expected one ("
5630 << rssi <<
" vs " <<
m_rssiSta2 <<
", with tolerance of " <<
m_tol <<
")");
5649 Ptr<Node> apNode = CreateObject<Node>();
5655 spectrumChannel->AddPropagationLossModel(lossModel);
5657 CreateObject<ConstantSpeedPropagationDelayModel>();
5658 spectrumChannel->SetPropagationDelayModel(delayModel);
5663 spectrumPhy.
Set(
"ChannelSettings",
StringValue(
"{0, 0, BAND_5GHZ, 0}"));
5667 wifi.SetRemoteStationManager(
"ns3::ConstantRateWifiManager",
5674 mac.SetType(
"ns3::StaWifiMac");
5676 wifi.AssignStreams(staDevs, 0);
5677 m_sta1Dev = DynamicCast<WifiNetDevice>(staDevs.
Get(0));
5679 m_sta2Dev = DynamicCast<WifiNetDevice>(staDevs.
Get(1));
5685 mac.SetType(
"ns3::ApWifiMac",
5690 m_apDev = DynamicCast<WifiNetDevice>(
wifi.Install(spectrumPhy,
mac, apNode).Get(0));
5699 mobility.SetMobilityModel(
"ns3::ConstantPositionMobilityModel");
5701 positionAlloc->Add(Vector(0.0, 0.0, 0.0));
5702 positionAlloc->Add(Vector(1.0, 0.0, 0.0));
5704 Vector(2.0, 0.0, 0.0));
5705 mobility.SetPositionAllocator(positionAlloc);
5710 lossModel->SetDefaultLoss(50.0);
5733 RngSeedManager::SetSeed(1);
5734 RngSeedManager::SetRun(1);
5735 int64_t streamNumber = 0;
5778 Simulator::Schedule(relativeStart,
5784 std::vector<uint16_t> staIds{1};
5790 std::vector<uint16_t> staIds{2};
5799 std::vector<uint16_t> staIds{1, 2};
5880 Simulator::Destroy();
SpectrumWifiPhy used for testing OFDMA.
Time GetEnergyDuration(double energyW, WifiSpectrumBand band)
Wrapper to InterferenceHelper method.
void SetTriggerFrameUid(uint64_t uid)
Since we assume trigger frame was previously received from AP, this is used to set its UID.
Ptr< const HePhy > GetHePhy() const
void(* TxPpduUidCallback)(uint64_t uid)
TracedCallback signature for UID of transmitted PPDU.
void SetPpduUid(uint64_t uid)
Set the global PPDU UID counter.
~OfdmaSpectrumWifiPhy() override
static TypeId GetTypeId()
Get the type ID.
std::map< std::pair< uint64_t, WifiPreamble >, Ptr< Event > > & GetCurrentPreambleEvents()
Ptr< OfdmaTestHePhy > m_ofdmTestHePhy
Pointer to HE PHY instance used for OFDMA test.
Ptr< Event > GetCurrentEvent()
void DoDispose() override
Destructor implementation.
OfdmaSpectrumWifiPhy(uint16_t staId)
Constructor.
void StartTx(Ptr< const WifiPpdu > ppdu, const WifiTxVector &txVector) override
TracedCallback< uint64_t > m_phyTxPpduUidTrace
Callback providing UID of the PPDU that is about to be transmitted.
void DoInitialize() override
Initialize() implementation.
HE PHY slightly modified so as to return a given STA-ID in case of DL MU for OfdmaSpectrumWifiPhy.
OfdmaTestHePhy(uint16_t staId)
Constructor.
~OfdmaTestHePhy() override
void SetGlobalPpduUid(uint64_t uid)
Set the global PPDU UID counter.
uint16_t GetStaId(const Ptr< const WifiPpdu > ppdu) const override
Return the STA ID that has been assigned to the station this PHY belongs to.
uint16_t m_staId
ID of the STA to which this PHY belongs to.
PHY listener for OFDMA tests.
OfdmaTestPhyListener()=default
void NotifyRxEndError() override
We have received the last bit of a packet for which NotifyRxStart was invoked first and,...
void NotifyTxStart(Time duration, double txPowerDbm) override
bool m_lastRxSuccess
flag whether last RX has been successfull
void NotifyRxStart(Time duration) override
Time GetLastRxStartNotification() const
Return the time at which the last RX start notification has been received.
void NotifySwitchingStart(Time duration) override
void NotifyWakeup() override
Notify listeners that we woke up.
uint32_t m_notifyRxStart
count number of RX start notifications
void Reset()
Reset function.
Time m_lastRxEnd
last time a RX end notification has been received
Time m_lastRxStart
last time a RX start notification has been received
Time GetLastRxEndNotification() const
Return the time at which the last RX end notification has been received.
void NotifyCcaBusyStart(Time duration, WifiChannelListType channelType, const std::vector< Time > &) override
uint32_t m_notifyRxEnd
count number of RX end notifications
bool IsLastRxSuccess() const
Return whether last RX has been successfull.
void NotifySleep() override
Notify listeners that we went to sleep.
uint32_t GetNumRxEndNotifications() const
Return the number of RX end notifications that has been received since the last reset.
void NotifyRxEndOk() override
We have received the last bit of a packet for which NotifyRxStart was invoked first and,...
uint32_t GetNumRxStartNotifications() const
Return the number of RX start notifications that has been received since the last reset.
void NotifyOff() override
Notify listeners that we went to switch off.
void NotifyOn() override
Notify listeners that we went to switch on.
DL-OFDMA PHY puncturing test.
void DoTeardown() override
Implementation to do any local setup required for this TestCase.
uint32_t m_countRxBytesSta1
count RX bytes for STA 1
uint32_t m_countRxBytesSta2
count RX bytes for STA 2
Ptr< SpectrumWifiPhy > m_phyAp
PHY of AP.
void DoRun() override
Implementation to actually run this TestCase.
TestDlOfdmaPhyPuncturing()
Time m_expectedPpduDuration20Mhz
expected duration to send MU PPDU on 20 MHz RU
void CheckResultsSta1(uint32_t expectedRxSuccess, uint32_t expectedRxFailure, uint32_t expectedRxBytes)
Check the results for STA 1.
void ResetResults()
Reset the results.
uint32_t m_countRxSuccessSta2
count RX success for STA 2
void RunOne()
Run one function.
Ptr< OfdmaSpectrumWifiPhy > m_phySta1
PHY of STA 1.
void RxFailureSta1(Ptr< const WifiPsdu > psdu)
Receive failure function for STA 1.
uint32_t m_countRxFailureSta2
count RX failure for STA 2
void DoSetup() override
Implementation to do any local setup required for this TestCase.
void SendMuPpdu(uint16_t rxStaId1, uint16_t rxStaId2, const std::vector< bool > &puncturedSubchannels)
Send MU-PPDU function.
uint16_t m_frequency
frequency in MHz
uint16_t m_channelWidth
channel width in MHz
uint32_t m_countRxFailureSta1
count RX failure for STA 1
Time m_expectedPpduDuration40Mhz
expected duration to send MU PPDU on 40 MHz RU
void CheckResultsSta2(uint32_t expectedRxSuccess, uint32_t expectedRxFailure, uint32_t expectedRxBytes)
Check the results for STA 2.
void DoCheckPhyState(Ptr< OfdmaSpectrumWifiPhy > phy, WifiPhyState expectedState)
Check the PHY state now.
void RxFailureSta2(Ptr< const WifiPsdu > psdu)
Receive failure function for STA 2.
Ptr< WaveformGenerator > m_phyInterferer
PHY of interferer.
void StopInterference()
Stop interference function.
void CheckPhyState(Ptr< OfdmaSpectrumWifiPhy > phy, WifiPhyState expectedState)
Schedule now to check the PHY state.
uint8_t m_indexSubchannel
Index of the subchannel (starting from 0) that should contain an interference and be punctured during...
uint32_t m_countRxSuccessSta1
count RX success for STA 1
Ptr< OfdmaSpectrumWifiPhy > m_phySta2
PHY of STA 2.
void RxSuccessSta1(Ptr< const WifiPsdu > psdu, RxSignalInfo rxSignalInfo, WifiTxVector txVector, const std::vector< bool > statusPerMpdu)
Receive success function for STA 1.
void RxSuccessSta2(Ptr< const WifiPsdu > psdu, RxSignalInfo rxSignalInfo, WifiTxVector txVector, std::vector< bool > statusPerMpdu)
Receive success function for STA 2.
void GenerateInterference(Ptr< SpectrumValue > interferencePsd, Time duration)
Generate interference function.
uint16_t m_frequency
frequency in MHz
void DoSetup() override
Implementation to do any local setup required for this TestCase.
uint16_t m_channelWidth
channel width in MHz
uint32_t m_countRxFailureSta2
count RX failure for STA 2
void RxFailureSta2(Ptr< const WifiPsdu > psdu)
Receive failure function for STA 2.
void RunOne()
Run one function.
uint32_t m_countRxBytesSta2
count RX bytes for STA 2
void DoTeardown() override
Implementation to do any local setup required for this TestCase.
Time m_expectedPpduDuration
expected duration to send MU PPDU
void GenerateInterference(Ptr< SpectrumValue > interferencePsd, Time duration)
Generate interference function.
Ptr< WaveformGenerator > m_phyInterferer
PHY of interferer.
uint32_t m_countRxFailureSta3
count RX failure for STA 3
uint32_t m_countRxBytesSta1
count RX bytes for STA 1
TestDlOfdmaPhyTransmission()
Ptr< OfdmaSpectrumWifiPhy > m_phySta2
PHY of STA 2.
void RxSuccessSta2(Ptr< const WifiPsdu > psdu, RxSignalInfo rxSignalInfo, WifiTxVector txVector, std::vector< bool > statusPerMpdu)
Receive success function for STA 2.
void DoRun() override
Implementation to actually run this TestCase.
Ptr< SpectrumWifiPhy > m_phyAp
PHY of AP.
Ptr< OfdmaSpectrumWifiPhy > m_phySta1
PHY of STA 1.
void CheckResultsSta2(uint32_t expectedRxSuccess, uint32_t expectedRxFailure, uint32_t expectedRxBytes)
Check the results for STA 2.
void CheckPhyState(Ptr< OfdmaSpectrumWifiPhy > phy, WifiPhyState expectedState)
Schedule now to check the PHY state.
uint32_t m_countRxSuccessSta2
count RX success for STA 2
uint32_t m_countRxFailureSta1
count RX failure for STA 1
void RxSuccessSta1(Ptr< const WifiPsdu > psdu, RxSignalInfo rxSignalInfo, WifiTxVector txVector, std::vector< bool > statusPerMpdu)
Receive success function for STA 1.
void CheckResultsSta1(uint32_t expectedRxSuccess, uint32_t expectedRxFailure, uint32_t expectedRxBytes)
Check the results for STA 1.
Ptr< OfdmaSpectrumWifiPhy > m_phySta3
PHY of STA 3.
void RxSuccessSta3(Ptr< const WifiPsdu > psdu, RxSignalInfo rxSignalInfo, WifiTxVector txVector, std::vector< bool > statusPerMpdu)
Receive success function for STA 3.
uint32_t m_countRxSuccessSta3
count RX success for STA 3
void DoCheckPhyState(Ptr< OfdmaSpectrumWifiPhy > phy, WifiPhyState expectedState)
Check the PHY state now.
uint32_t m_countRxBytesSta3
count RX bytes for STA 3
void RxFailureSta3(Ptr< const WifiPsdu > psdu)
Receive failure function for STA 3.
void StopInterference()
Stop interference function.
void ResetResults()
Reset the results.
void RxFailureSta1(Ptr< const WifiPsdu > psdu)
Receive failure function for STA 1.
uint32_t m_countRxSuccessSta1
count RX success for STA 1
void CheckResultsSta3(uint32_t expectedRxSuccess, uint32_t expectedRxFailure, uint32_t expectedRxBytes)
Check the results for STA 3.
~TestDlOfdmaPhyTransmission() override
void SendMuPpdu(uint16_t rxStaId1, uint16_t rxStaId2)
Send MU-PPDU function.
UL-OFDMA multiple RX events test.
WifiTxVector m_trigVector
TRIGVECTOR.
Ptr< OfdmaSpectrumWifiPhy > m_phy
Phy.
void Reset()
Reset function.
~TestMultipleHeTbPreambles() override
void RxHeTbPpduOfdmaPart(Ptr< WifiSpectrumSignalParameters > rxParamsOfdma)
Receive OFDMA part of HE TB PPDU function.
void CheckHeTbPreambles(size_t nEvents, std::vector< uint64_t > uids)
Check the received HE TB preambles.
void RxHeTbPpdu(uint64_t uid, uint16_t staId, double txPowerWatts, size_t payloadSize)
Receive HE TB PPDU function.
TestMultipleHeTbPreambles()
uint64_t m_totalBytesDropped
total number of dropped bytes
void CheckBytesDropped(size_t expectedBytesDropped)
Check the number of bytes dropped.
void DoTeardown() override
Implementation to do any local setup required for this TestCase.
void DoRun() override
Implementation to actually run this TestCase.
void RxDropped(Ptr< const Packet > p, WifiPhyRxfailureReason reason)
RX dropped function.
void DoRxHeTbPpduOfdmaPart(Ptr< WifiSpectrumSignalParameters > rxParamsOfdma)
Receive OFDMA part of HE TB PPDU function.
void DoSetup() override
Implementation to do any local setup required for this TestCase.
PHY padding exclusion test.
void DoSetup() override
Implementation to do any local setup required for this TestCase.
void CheckRxFromSta1(uint32_t expectedSuccess, uint32_t expectedFailures, uint32_t expectedBytes)
Check the received PSDUs from STA1.
Ptr< OfdmaSpectrumWifiPhy > m_phySta2
PHY of STA 2.
void VerifyEventsCleared()
Verify all events are cleared at end of TX or RX.
TestPhyPaddingExclusion()
void DoCheckPhyState(Ptr< OfdmaSpectrumWifiPhy > phy, WifiPhyState expectedState)
Check the PHY state.
void DoTeardown() override
Implementation to do any local setup required for this TestCase.
~TestPhyPaddingExclusion() override
void GenerateInterference(Ptr< SpectrumValue > interferencePsd, Time duration)
Generate interference function.
Ptr< WaveformGenerator > m_phyInterferer
PHY of interferer.
uint32_t m_countRxSuccessFromSta2
count RX success from STA 2
void DoRun() override
Implementation to actually run this TestCase.
void RxFailure(Ptr< const WifiPsdu > psdu)
Receive failure function.
uint32_t m_countRxBytesFromSta1
count RX bytes from STA 1
Ptr< OfdmaSpectrumWifiPhy > m_phyAp
PHY of AP.
Ptr< OfdmaSpectrumWifiPhy > m_phySta1
PHY of STA 1.
void SendHeTbPpdu(uint16_t txStaId, std::size_t index, std::size_t payloadSize, Time txDuration)
Send HE TB PPDU function.
void RxSuccess(Ptr< const WifiPsdu > psdu, RxSignalInfo rxSignalInfo, WifiTxVector txVector, std::vector< bool > statusPerMpdu)
Receive success function.
void SetTrigVector(Time ppduDuration)
Set TRIGVECTOR for HE TB PPDU.
void Reset()
Reset function.
uint32_t m_countRxFailureFromSta1
count RX failure from STA 1
uint32_t m_countRxSuccessFromSta1
count RX success from STA 1
void StopInterference()
Stop interference function.
void RunOne()
Run one function.
void CheckRxFromSta2(uint32_t expectedSuccess, uint32_t expectedFailures, uint32_t expectedBytes)
Check the received PSDUs from STA2.
uint32_t m_countRxFailureFromSta2
count RX failure from STA 2
uint32_t m_countRxBytesFromSta2
count RX bytes from STA 2
void CheckPhyState(Ptr< OfdmaSpectrumWifiPhy > phy, WifiPhyState expectedState)
Check the PHY state.
void ScheduleTest(Time delay, bool solicited, WifiPhyState expectedStateAtEnd, uint32_t expectedSuccessFromSta1, uint32_t expectedFailuresFromSta1, uint32_t expectedBytesFromSta1, uint32_t expectedSuccessFromSta2, uint32_t expectedFailuresFromSta2, uint32_t expectedBytesFromSta2, bool scheduleTxSta1=true, Time ulTimeDifference=Seconds(0), WifiPhyState expectedStateBeforeEnd=WifiPhyState::RX, TrigVectorInfo error=NONE)
Schedule test to perform.
void GenerateInterference(Ptr< SpectrumValue > interferencePsd, Time duration)
Generate interference function.
WifiTxVector GetTxVectorForHeTbPpdu(uint16_t txStaId, std::size_t index, uint8_t bssColor) const
Get TXVECTOR for HE TB PPDU.
uint32_t m_countRxFailureFromSta1
count RX failure from STA 1
void CheckOfdmaRxPower(Ptr< OfdmaSpectrumWifiPhy > phy, WifiSpectrumBand band, double expectedRxPower)
Check the received power for the OFDMA part of the HE TB PPDUs over the given band.
void DoCheckPhyState(Ptr< OfdmaSpectrumWifiPhy > phy, WifiPhyState expectedState)
Check the PHY state.
uint32_t m_countRxBytesFromSta1
count RX bytes from STA 1
uint16_t m_frequency
frequency in MHz
std::unique_ptr< OfdmaTestPhyListener > m_apPhyStateListener
listener for AP PHY state transitions
void RxFailure(Ptr< const WifiPsdu > psdu)
Receive failure function.
void CheckApRxStart(uint32_t expectedNotifications, Time expectedLastNotification)
Check the the number of RX start notifications at the AP as well as the last time a RX start has been...
TrigVectorInfo
Erroneous info included in a TRIGVECTOR.
void SchedulePowerMeasurementChecks(Time delay, double rxPowerNonOfdmaRu1, double rxPowerNonOfdmaRu2, double rxPowerOfdmaRu1, double rxPowerOfdmaRu2)
Schedule power measurement related checks.
void SetBssColor(Ptr< WifiPhy > phy, uint8_t bssColor)
Set the BSS color.
Ptr< OfdmaSpectrumWifiPhy > m_phySta2
PHY of STA 2.
void LogScenario(std::string log) const
Log scenario description.
void CheckRxFromSta2(uint32_t expectedSuccess, uint32_t expectedFailures, uint32_t expectedBytes)
Check the received PSDUs from STA2.
void SendHeTbPpdu(uint16_t txStaId, std::size_t index, std::size_t payloadSize, uint64_t uid, uint8_t bssColor, bool incrementUid)
Send HE TB PPDU function.
void SetPsdLimit(Ptr< WifiPhy > phy, double psdLimit)
Set the PSD limit.
void DoRun() override
Implementation to actually run this TestCase.
void DoSetup() override
Implementation to do any local setup required for this TestCase.
void StopInterference()
Stop interference function.
uint32_t m_countRxBytesFromSta2
count RX bytes from STA 2
void Reset()
Reset function.
void DoTeardown() override
Implementation to do any local setup required for this TestCase.
void CheckPhyState(Ptr< OfdmaSpectrumWifiPhy > phy, WifiPhyState expectedState)
Check the PHY state.
Ptr< OfdmaSpectrumWifiPhy > m_phySta1
PHY of STA 1.
void RxSuccess(Ptr< const WifiPsdu > psdu, RxSignalInfo rxSignalInfo, WifiTxVector txVector, std::vector< bool > statusPerMpdu)
Receive success function.
~TestUlOfdmaPhyTransmission() override
TestUlOfdmaPhyTransmission()
void CheckRxFromSta1(uint32_t expectedSuccess, uint32_t expectedFailures, uint32_t expectedBytes)
Check the received PSDUs from STA1.
void CheckNonOfdmaRxPower(Ptr< OfdmaSpectrumWifiPhy > phy, WifiSpectrumBand band, double expectedRxPower)
Check the received power for the non-OFDMA of the HE TB PPDUs over the given band.
void RunOne()
Run one function.
uint32_t m_countRxSuccessFromSta2
count RX success from STA 2
Ptr< WaveformGenerator > m_phyInterferer
PHY of interferer.
void CheckApRxEnd(uint32_t expectedNotifications, Time expectedLastNotification, bool expectedSuccess)
Check the the number of RX end notifications at the AP as well as the last time a RX end has been not...
Ptr< OfdmaSpectrumWifiPhy > m_phySta3
PHY of STA 3.
uint16_t m_channelWidth
channel width in MHz
void SendHeSuPpdu(uint16_t txStaId, std::size_t payloadSize, uint64_t uid, uint8_t bssColor)
Send HE SU PPDU function.
uint32_t m_countRxFailureFromSta2
count RX failure from STA 2
void VerifyEventsCleared()
Verify all events are cleared at end of TX or RX.
void SetTrigVector(uint8_t bssColor, TrigVectorInfo error)
Set TRIGVECTOR for HE TB PPDU.
Time m_expectedPpduDuration
expected duration to send MU PPDU
uint32_t m_countRxSuccessFromSta1
count RX success from STA 1
Ptr< OfdmaSpectrumWifiPhy > m_phyAp
PHY of AP.
UL-OFDMA power control test.
double m_requestedRssiSta1
requested RSSI (in dBm) from STA 1 at AP for HE TB PPDUs
double m_txPowerStart
minimum transmission power (in dBm) for STAs
void DoRun() override
Implementation to actually run this TestCase.
double m_rssiSta2
expected RSSI (in dBm) from STA 2 at AP for HE TB PPDUs
Ptr< WifiNetDevice > m_sta2Dev
network device of STA 2
double m_txPowerEnd
maximum transmission power (in dBm) for STAs
void SetupBa(Address destination)
Send a QoS Data packet to the destination station in order to set up a block Ack session (so that the...
Ptr< WifiNetDevice > m_sta1Dev
network device of STA 1
double m_tol
tolerance (in dB) between received and expected RSSIs
Ptr< WifiNetDevice > m_apDev
network device of AP
void DoTeardown() override
Implementation to do any local setup required for this TestCase.
uint8_t m_bssColor
BSS color.
void ReceiveOkCallbackAtAp(Ptr< const WifiPsdu > psdu, RxSignalInfo rxSignalInfo, WifiTxVector txVector, std::vector< bool > statusPerMpdu)
Receive OK callback function at AP.
void ReplaceReceiveOkCallbackOfAp()
Replace the AP's callback on its PHY's ReceiveOkCallback by the ReceiveOkCallbackAtAp method.
double m_rssiSta1
expected RSSI (in dBm) from STA 1 at AP for HE TB PPDUs
uint8_t m_txPowerLevels
number of transmission power levels for STAs
double m_requestedRssiSta2
requested RSSI (in dBm) from STA 2 at AP for HE TB PPDUs
TestUlOfdmaPowerControl()
double m_txPowerAp
transmit power (in dBm) of AP
void RunOne(bool setupBa)
Run one simulation with an optional BA session set up phase.
void DoSetup() override
Implementation to do any local setup required for this TestCase.
Ptr< SpectrumWifiPhy > m_phyAp
PHY of AP.
~TestUlOfdmaPowerControl() override
void SendMuBar(std::vector< uint16_t > staIds)
Send a MU BAR through the AP to the STAs listed in the provided vector.
UL-OFDMA PPDU UID attribution test.
~TestUlOfdmaPpduUid() override
void TxPpduSta1(uint64_t uid)
Transmitted PPDU information function for STA 1.
void ResetPpduUid()
Reset the global PPDU UID counter in WifiPhy.
void CheckUid(uint16_t staId, uint64_t expectedUid)
Check the UID of the transmitted PPDU.
void TxPpduAp(uint64_t uid)
Transmitted PPDU information function for AP.
void TxPpduSta2(uint64_t uid)
Transmitted PPDU information function for STA 2.
Ptr< OfdmaSpectrumWifiPhy > m_phySta2
PHY of STA 2.
uint64_t m_ppduUidAp
UID of PPDU transmitted by AP.
uint64_t m_ppduUidSta1
UID of PPDU transmitted by STA1.
uint64_t m_ppduUidSta2
UID of PPDU transmitted by STA2.
void DoRun() override
Implementation to actually run this TestCase.
void DoTeardown() override
Implementation to do any local setup required for this TestCase.
void SendMuPpdu()
Send MU-PPDU toward both STAs.
Ptr< OfdmaSpectrumWifiPhy > m_phySta1
PHY of STA 1.
void DoSetup() override
Implementation to do any local setup required for this TestCase.
void SendTbPpdu()
Send TB-PPDU from both STAs.
Ptr< OfdmaSpectrumWifiPhy > m_phyAp
PHY of AP.
void SendSuPpdu(uint16_t txStaId)
Send SU-PPDU function.
wifi PHY OFDMA Test Suite
a polymophic address class
AttributeValue implementation for Boolean.
User Info field of Trigger frames.
void SetAid12(uint16_t aid)
Set the AID12 subfield, which carries the 12 LSBs of the AID of the station for which this User Info ...
void SetUlFecCodingType(bool ldpc)
Set the UL FEC Coding Type subfield, which indicates whether BCC or LDPC is used.
void SetUlMcs(uint8_t mcs)
Set the UL MCS subfield, which indicates the MCS of the solicited HE TB PPDU.
void SetMuBarTriggerDepUserInfo(const CtrlBAckRequestHeader &bar)
Set the Trigger Dependent User Info subfield for the MU-BAR variant of Trigger frames,...
void SetUlDcm(bool dcm)
Set the UL DCM subfield, which indicates whether or not DCM is used.
void SetSsAllocation(uint8_t startingSs, uint8_t nSs)
Set the SS Allocation subfield, which is present when the AID12 subfield is neither 0 nor 2045.
void SetUlTargetRssi(int8_t dBm)
Set the UL Target RSSI subfield to indicate the expected receive signal power in dBm.
void SetRuAllocation(HeRu::RuSpec ru)
Set the RU Allocation subfield according to the specified RU.
This class can be used to hold variables of floating point type such as 'double' or 'float'.
RuType GetRuType() const
Get the RU type.
void SetPhyIndex(uint16_t bw, uint8_t p20Index)
Set the RU PHY index.
RuType
The different HE Resource Unit (RU) types.
Helper class used to assign positions and mobility models to nodes.
Keep track of the current position and velocity of an object.
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.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
uint32_t AddDevice(Ptr< NetDevice > device)
Associate a NetDevice to this node.
bool TraceConnectWithoutContext(std::string name, const CallbackBase &cb)
Connect a TraceSource to a Callback without a context.
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
Ptr< T > GetObject() const
Get a pointer to the requested aggregated Object.
void AggregateObject(Ptr< Object > other)
Aggregate two Objects together.
void Dispose()
Dispose of this Object.
void AddHeader(const Header &header)
Add header to this packet.
uint32_t GetSize() const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
void SetOwner(Ptr< WifiPhy > wifiPhy)
Set the WifiPhy owning this PHY entity.
static uint64_t m_globalPpduUid
Global counter of the PPDU UID.
Hold objects of type Ptr<T>.
Smart pointer class similar to boost::intrusive_ptr.
Make it easy to create and manage PHY objects for the spectrum model.
void SetChannel(Ptr< SpectrumChannel > channel)
void SetChannel(const Ptr< SpectrumChannel > channel)
Set the SpectrumChannel this SpectrumWifiPhy is to be connected to.
uint16_t GetGuardBandwidth(uint16_t currentChannelWidth) const override
void StartRx(Ptr< SpectrumSignalParameters > rxParams)
Input method for delivering a signal from the spectrum channel and low-level PHY interface to this Sp...
void CreateWifiSpectrumPhyInterface(Ptr< NetDevice > device)
Method to encapsulate the creation of the WifiSpectrumPhyInterface object (used to bind the WifiSpect...
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.
AttributeValue implementation for Time.
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.
virtual void SetWifiPhys(const std::vector< Ptr< WifiPhy > > &phys)
void SetMac(const Ptr< WifiMac > mac)
void SetHeConfiguration(Ptr< HeConfiguration > heConfiguration)
Ptr< WifiMac > GetMac() const
bool Send(Ptr< Packet > packet, const Address &dest, uint16_t protocolNumber) override
Ptr< HeConfiguration > GetHeConfiguration() const
void SetStandard(WifiStandard standard)
Set the Wifi standard.
Ptr< WifiPhy > GetPhy() const
void SetPhy(const Ptr< WifiPhy > phy)
Address GetAddress() const override
void Set(std::string name, const AttributeValue &v)
void SetErrorRateModel(std::string type, Args &&... args)
Helper function used to set the error rate model.
virtual void SetInterferenceHelper(const Ptr< InterferenceHelper > helper)
Sets the interference helper.
void Send(Ptr< const WifiPsdu > psdu, const WifiTxVector &txVector)
This function is a wrapper for the Send variant that accepts a WifiConstPsduMap as first argument.
void SetErrorRateModel(const Ptr< ErrorRateModel > model)
Sets the error rate model.
std::map< std::pair< uint64_t, WifiPreamble >, Ptr< Event > > m_currentPreambleEvents
store event associated to a PPDU (that has a unique ID and preamble combination) whose preamble is be...
Time GetSifs() const
Return the Short Interframe Space (SIFS) for this PHY.
void SetReceiveErrorCallback(RxErrorCallback callback)
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)
std::map< WifiModulationClass, Ptr< PhyEntity > > m_phyEntities
This map holds the supported PHY entities.
void SetOperatingChannel(const ChannelTuple &channelTuple)
If the standard for this object has not been set yet, store the given channel settings.
WifiPhyBand GetPhyBand() const
Get the configured Wi-Fi band.
Ptr< Event > m_currentEvent
Hold the current event.
Ptr< PhyEntity > GetPhyEntity(WifiModulationClass modulation) const
Get the supported PHY entity corresponding to the modulation class.
uint64_t m_previouslyRxPpduUid
UID of the previously received PPDU, reset to UINT64_MAX upon transmission.
void SetDevice(const Ptr< WifiNetDevice > device)
Sets the device this PHY is associated with.
void SetPreambleDetectionModel(const Ptr< PreambleDetectionModel > preambleDetectionModel)
Sets the preamble detection model.
void SetMobility(const Ptr< MobilityModel > mobility)
assign a mobility model to this device
void RegisterListener(WifiPhyListener *listener)
Ptr< InterferenceHelper > m_interference
Pointer to a helper responsible for interference computations.
void SetReceiveOkCallback(RxOkCallback callback)
void Reset()
Reset data upon end of TX or RX.
std::tuple< uint8_t, uint16_t, int, uint8_t > ChannelTuple
Tuple identifying an operating channel.
virtual int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model.
receive notifications about PHY events.
This objects implements the PHY state machine of the Wifi device.
const WifiMacHeader & GetHeader(std::size_t i) const
Get the header of the i-th MPDU.
Mac48Address GetAddr2() const
Get the Transmitter Address (TA), which is common to all the MPDUs.
uint32_t GetSize() const
Return the size of the PSDU in bytes.
void SetDuration(Time duration)
Set the Duration/ID field on all the MPDUs.
std::size_t GetNMpdus() const
Return the number of MPDUs constituting the PSDU.
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
void SetInactiveSubchannels(const std::vector< bool > &inactiveSubchannels)
Set the 20 MHz subchannels that are punctured.
void SetHeMuUserInfo(uint16_t staId, HeMuUserInfo userInfo)
Set the HE MU user-specific transmission information for the given STA-ID.
WifiPreamble GetPreambleType() const
HeRu::RuSpec GetRu(uint16_t staId) const
Get the RU specification for the STA-ID.
void SetRuAllocation(const RuAllocation &ruAlloc)
Set RU Allocation of SIG-B common field.
const HeMuUserInfoMap & GetHeMuUserInfoMap() const
Get a const reference to the map HE MU user-specific transmission information indexed by STA-ID.
void SetRu(HeRu::RuSpec ru, uint16_t staId)
Set the RU specification for the STA-ID.
void SetLength(uint16_t length)
Set the LENGTH field of the L-SIG.
void SetSigBMode(const WifiMode &mode)
Set the MCS used for SIG-B.
void SetMode(WifiMode mode)
Sets the selected payload transmission mode.
void SetNss(uint8_t nss)
Sets the number of Nss.
#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...
void Reset()
Reset the initial value of every attribute as well as the value of every global to what they were bef...
#define NS_ABORT_MSG(msg)
Unconditional abnormal program termination 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(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.
Time Now()
create an ns3::Time instance which contains the current simulation time.
#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_ASSERT_MSG_EQ_TOL(actual, limit, tol, msg)
Test that actual and expected (limit) values are equal to plus or minus some tolerance and report and...
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.
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
WifiPhyRxfailureReason
Enumeration of the possible reception failure reasons.
WifiPhyBand
Identifies the PHY band.
WifiChannelListType
Enumeration of the possible channel-list parameter elements defined in Table 8-5 of IEEE 802....
@ WIFI_PHY_BAND_5GHZ
The 5 GHz band.
@ WIFI_MOD_CLASS_HE
HE (Clause 27)
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...
std::pair< uint32_t, uint32_t > WifiSpectrumBand
typedef for a pair of start and stop sub-band indexes
std::vector< BandInfo > Bands
Container of BandInfo.
double DbmToW(double dBm)
Convert from dBm to Watts.
uint32_t GetBlockAckSize(BlockAckType type)
Return the total BlockAck size (including FCS trailer).
The building block of a SpectrumModel.
double fc
center frequency
double fl
lower limit of subband
double fh
upper limit of subband
RxSignalInfo structure containing info on the received signal.
static const uint16_t DEFAULT_CHANNEL_WIDTH
static WifiPhyOfdmaTestSuite wifiPhyOfdmaTestSuite
the test suite
static const uint8_t DEFAULT_CHANNEL_NUMBER
static const WifiPhyBand DEFAULT_WIFI_BAND
static const uint16_t DEFAULT_GUARD_WIDTH
static const uint32_t DEFAULT_FREQUENCY
WifiPhyState
The state of the PHY layer.
@ CCA_BUSY
The PHY layer has sense the medium busy through the CCA mechanism.
@ RX
The PHY layer is receiving a packet.
@ IDLE
The PHY layer is IDLE.