20 #include "ns3/ap-wifi-mac.h"
21 #include "ns3/boolean.h"
22 #include "ns3/constant-position-mobility-model.h"
23 #include "ns3/he-configuration.h"
24 #include "ns3/he-phy.h"
25 #include "ns3/interference-helper.h"
27 #include "ns3/mobility-helper.h"
28 #include "ns3/multi-model-spectrum-channel.h"
29 #include "ns3/nist-error-rate-model.h"
31 #include "ns3/non-communicating-net-device.h"
32 #include "ns3/rng-seed-manager.h"
33 #include "ns3/simulator.h"
34 #include "ns3/spectrum-wifi-helper.h"
35 #include "ns3/spectrum-wifi-phy.h"
36 #include "ns3/sta-wifi-mac.h"
38 #include "ns3/waveform-generator.h"
39 #include "ns3/wifi-mac-header.h"
40 #include "ns3/wifi-net-device.h"
41 #include "ns3/wifi-psdu.h"
42 #include "ns3/wifi-spectrum-signal-parameters.h"
43 #include "ns3/wifi-spectrum-value-helper.h"
44 #include "ns3/wifi-utils.h"
68 void SetPreviousTxPpduUid(uint64_t uid);
75 void SetMuRtsTxVector(
const WifiTxVector& muRtsTxVector);
165 SpectrumWifiPhy::DoInitialize();
172 SpectrumWifiPhy::DoDispose();
205 using StasParams = std::vector<std::tuple<WifiStandard, uint16_t, uint8_t>>;
218 uint16_t apFrequency,
221 std::vector<bool> per20MhzInterference = {});
226 void DoRun()
override;
240 std::vector<bool> statusPerMpdu);
255 void CheckResults(std::size_t index, uint32_t expectedRxSuccess, uint32_t expectedRxFailure);
297 std::vector<Ptr<WaveformGenerator>>
303 uint16_t apFrequency,
306 std::vector<bool> per20MhzInterference)
307 :
TestCase{
"non-HT duplicate PHY reception test"},
308 m_apStandard{apStandard},
309 m_apFrequency{apFrequency},
310 m_apP20Index{apP20Index},
311 m_stasParams{stasParams},
312 m_per20MhzInterference{per20MhzInterference},
313 m_countRxSuccessStas{},
314 m_countRxFailureStas{},
368 Simulator::Schedule(duration,
401 uint32_t expectedRxSuccess,
402 uint32_t expectedRxFailure)
404 NS_LOG_FUNCTION(
this << index << expectedRxSuccess << expectedRxFailure);
407 "The number of successfully received packets by STA "
408 << index <<
" is not correct!");
411 "The number of unsuccessfully received packets by STA "
412 << index <<
" is not correct!");
418 auto spectrumChannel = CreateObject<MultiModelSpectrumChannel>();
419 auto lossModel = CreateObject<FriisPropagationLossModel>();
421 spectrumChannel->AddPropagationLossModel(lossModel);
422 auto delayModel = CreateObject<ConstantSpeedPropagationDelayModel>();
423 spectrumChannel->SetPropagationDelayModel(delayModel);
425 auto apNode = CreateObject<Node>();
426 auto apDev = CreateObject<WifiNetDevice>();
427 m_phyAp = CreateObject<SpectrumWifiPhy>();
429 auto apInterferenceHelper = CreateObject<InterferenceHelper>();
431 auto apErrorModel = CreateObject<NistErrorRateModel>();
436 auto apMobility = CreateObject<ConstantPositionMobilityModel>();
439 apNode->AggregateObject(apMobility);
440 apNode->AddDevice(apDev);
444 auto staNode = CreateObject<Node>();
445 auto staDev = CreateObject<WifiNetDevice>();
446 auto staPhy = CreateObject<SpectrumWifiPhy>();
447 staPhy->CreateWifiSpectrumPhyInterface(staDev);
448 auto sta1InterferenceHelper = CreateObject<InterferenceHelper>();
449 staPhy->SetInterferenceHelper(sta1InterferenceHelper);
450 auto sta1ErrorModel = CreateObject<NistErrorRateModel>();
451 staPhy->SetErrorRateModel(sta1ErrorModel);
452 staPhy->SetDevice(staDev);
453 staPhy->SetChannel(spectrumChannel);
454 staPhy->ConfigureStandard(std::get<0>(staParams));
455 staPhy->SetReceiveOkCallback(
457 staPhy->SetReceiveErrorCallback(
459 auto staMobility = CreateObject<ConstantPositionMobilityModel>();
460 staPhy->SetMobility(staMobility);
461 staDev->SetPhy(staPhy);
462 staNode->AggregateObject(staMobility);
463 staNode->AddDevice(staDev);
471 [[maybe_unused]]
auto [channelNum, centerFreq, apChannelWidth,
type, phyBand] =
472 (*WifiPhyOperatingChannel::FindFirst(0,
480 auto interfererNode = CreateObject<Node>();
481 auto interfererDev = CreateObject<NonCommunicatingNetDevice>();
482 auto phyInterferer = CreateObject<WaveformGenerator>();
483 phyInterferer->SetDevice(interfererDev);
484 phyInterferer->SetChannel(spectrumChannel);
485 phyInterferer->SetDutyCycle(1);
486 interfererNode->AddDevice(interfererDev);
504 phyInterferer->Dispose();
505 phyInterferer =
nullptr;
512 RngSeedManager::SetSeed(1);
513 RngSeedManager::SetRun(1);
514 int64_t streamNumber = 0;
518 phySta->AssignStreams(streamNumber);
521 [[maybe_unused]]
auto [apChannelNum, centerFreq, apChannelWidth,
type, phyBand] =
522 (*WifiPhyOperatingChannel::FindFirst(0,
531 for (
const auto& [staStandard, staFrequency, staP20Index] :
m_stasParams)
533 [[maybe_unused]]
auto [staChannelNum, centerFreq, staChannelWidth,
type, phyBand] =
534 (*WifiPhyOperatingChannel::FindFirst(0,
539 m_phyStas.at(index++)->SetOperatingChannel(
544 const auto minApCenterFrequency =
546 for (
auto channelWidth = 20; channelWidth <= apChannelWidth; channelWidth *= 2, ++index)
557 bandInfo.
fc = (minApCenterFrequency + (i * 20)) * 1e6;
558 bandInfo.
fl = bandInfo.
fc - (5 * 1e6);
559 bandInfo.
fh = bandInfo.
fc + (5 * 1e6);
561 bands.push_back(bandInfo);
562 auto spectrumInterference = Create<SpectrumModel>(bands);
563 auto interferencePsd = Create<SpectrumValue>(spectrumInterference);
564 auto interferencePower = 0.005;
566 *interferencePsd = interferencePower / 10e6;
567 Simulator::Schedule(
Seconds(index),
575 const auto apCenterFreq =
577 const auto apMinFreq = apCenterFreq - (channelWidth / 2);
578 const auto apMaxFreq = apCenterFreq + (channelWidth / 2);
579 Simulator::Schedule(
Seconds(index + 0.1),
585 const auto p20Width = 20;
586 const auto staP20Freq =
587 m_phyStas.at(i)->GetOperatingChannel().GetPrimaryChannelCenterFrequency(p20Width);
588 const auto staP20MinFreq = staP20Freq - (p20Width / 2);
589 const auto staP20MaxFreq = staP20Freq + (p20Width / 2);
590 bool expectRx = (staP20MinFreq >= apMinFreq && staP20MaxFreq <= apMaxFreq);
591 bool expectSuccess =
true;
594 const auto index20MhzSubBand = ((staP20Freq - minApCenterFrequency) / 20);
597 Simulator::Schedule(
Seconds(index + 0.5),
601 expectRx ? expectSuccess : 0,
602 expectRx ? !expectSuccess : 0);
604 Simulator::Schedule(
Seconds(index + 0.5),
610 Simulator::Destroy();
635 void DoRun()
override;
662 std::vector<bool> statusPerMpdu);
675 void CheckResults(std::size_t expectedRxCtsSuccess, std::size_t expectedRxCtsFailure);
689 const std::vector<uint16_t>& bwPerSta)
690 :
TestCase{
"test PHY reception of multiple CTS frames following a MU-RTS frame"},
691 m_bwPerSta{bwPerSta},
692 m_countRxCtsSuccess{0},
693 m_countRxCtsFailure{0},
694 m_stasTxPowerDbm(10.0)
713 phySta->SetPpduUid(0);
742 auto pkt = Create<Packet>();
743 auto mpdu = Create<WifiMpdu>(pkt, hdr);
744 auto psdu = Create<WifiPsdu>(mpdu,
false);
746 phy->Send(psdu, txVector);
759 "RX power is not correct!");
772 std::size_t expectedRxCtsFailure)
775 expectedRxCtsSuccess,
776 "The number of successfully received CTS frames by AP is not correct!");
778 expectedRxCtsFailure,
779 "The number of unsuccessfully received CTS frames by AP is not correct!");
785 RngSeedManager::SetSeed(1);
786 RngSeedManager::SetRun(1);
787 int64_t streamNumber = 0;
789 auto spectrumChannel = CreateObject<MultiModelSpectrumChannel>();
790 auto lossModel = CreateObject<FriisPropagationLossModel>();
792 spectrumChannel->AddPropagationLossModel(lossModel);
793 auto delayModel = CreateObject<ConstantSpeedPropagationDelayModel>();
794 spectrumChannel->SetPropagationDelayModel(delayModel);
796 auto apNode = CreateObject<Node>();
797 auto apDev = CreateObject<WifiNetDevice>();
798 auto apMac = CreateObject<ApWifiMac>();
799 apMac->SetAttribute(
"BeaconGeneration",
BooleanValue(
false));
800 apDev->SetMac(apMac);
801 m_phyAp = CreateObject<MuRtsCtsSpectrumWifiPhy>();
803 apDev->SetHeConfiguration(CreateObject<HeConfiguration>());
804 auto apInterferenceHelper = CreateObject<InterferenceHelper>();
806 auto apErrorModel = CreateObject<NistErrorRateModel>();
819 auto channelNum = std::get<0>(
824 auto apMobility = CreateObject<ConstantPositionMobilityModel>();
828 apDev->SetHeConfiguration(CreateObject<HeConfiguration>());
830 apNode->AggregateObject(apMobility);
831 apNode->AddDevice(apDev);
833 for (std::size_t i = 0; i <
m_bwPerSta.size(); ++i)
835 auto staNode = CreateObject<Node>();
836 auto staDev = CreateObject<WifiNetDevice>();
837 auto phySta = CreateObject<MuRtsCtsSpectrumWifiPhy>();
838 phySta->CreateWifiSpectrumPhyInterface(staDev);
839 auto staInterferenceHelper = CreateObject<InterferenceHelper>();
840 phySta->SetInterferenceHelper(staInterferenceHelper);
841 auto staErrorModel = CreateObject<NistErrorRateModel>();
842 phySta->SetErrorRateModel(staErrorModel);
843 phySta->SetDevice(staDev);
844 phySta->SetChannel(spectrumChannel);
846 phySta->AssignStreams(streamNumber);
850 channelNum = std::get<0>(*WifiPhyOperatingChannel::FindFirst(0,
856 phySta->SetOperatingChannel(
859 auto staMobility = CreateObject<ConstantPositionMobilityModel>();
860 phySta->SetMobility(staMobility);
861 staDev->SetPhy(phySta);
863 staDev->SetHeConfiguration(CreateObject<HeConfiguration>());
864 staNode->AggregateObject(staMobility);
865 staNode->AddDevice(staDev);
887 Simulator::Schedule(
Seconds(0.0),
892 std::size_t index = 1;
898 Simulator::Schedule(
Seconds(0.0) + delay,
911 Simulator::Destroy();
977 {
false,
true,
false,
false}),
HE PHY used for testing MU-RTS/CTS.
void SetPreviousTxPpduUid(uint64_t uid)
Set the previous TX PPDU UID counter.
void SetMuRtsTxVector(const WifiTxVector &muRtsTxVector)
Set the TXVECTOR of the previously transmitted MU-RTS.
~MuRtsCtsHePhy() override
Spectrum PHY used for testing MU-RTS/CTS.
void DoDispose() override
Destructor implementation.
MuRtsCtsSpectrumWifiPhy()
~MuRtsCtsSpectrumWifiPhy() override
Ptr< MuRtsCtsHePhy > m_muRtsCtsHePhy
Pointer to HE PHY instance used for MU-RTS/CTS PHY test.
void SetPpduUid(uint64_t uid)
Set the global PPDU UID counter.
void SetMuRtsTxVector(const WifiTxVector &muRtsTxVector)
Set the TXVECTOR of the previously transmitted MU-RTS.
void DoInitialize() override
Initialize() implementation.
static TypeId GetTypeId()
Get the type ID.
test PHY reception of multiple CTS frames as a response to a MU-RTS frame.
void FakePreviousMuRts(uint16_t bw)
Function called to fake the transmission of a MU-RTS.
void DoSetup() override
Implementation to do any local setup required for this TestCase.
void RxCtsFailure(Ptr< const WifiPsdu > psdu)
CTS RX failure function.
TestMultipleCtsResponsesFromMuRts(const std::vector< uint16_t > &bwPerSta)
Constructor.
std::vector< uint16_t > m_bwPerSta
Bandwidth per STA in MHz.
std::size_t m_countRxCtsFailure
count the number of unsuccessfully received CTS frames
void RxCtsSuccess(Ptr< const WifiPsdu > psdu, RxSignalInfo rxSignalInfo, WifiTxVector txVector, std::vector< bool > statusPerMpdu)
CTS RX success function.
std::vector< Ptr< MuRtsCtsSpectrumWifiPhy > > m_phyStas
STAs PHYs.
std::size_t m_countRxCtsSuccess
count the number of successfully received CTS frames
void DoTeardown() override
Implementation to do any local setup required for this TestCase.
void DoRun() override
Implementation to actually run this TestCase.
void CheckResults(std::size_t expectedRxCtsSuccess, std::size_t expectedRxCtsFailure)
Check the results.
Ptr< MuRtsCtsSpectrumWifiPhy > m_phyAp
AP PHY.
double m_stasTxPowerDbm
TX power in dBm configured for the STAs.
void TxNonHtDuplicateCts(Ptr< SpectrumWifiPhy > phy, uint16_t bw)
Function called to trigger a CTS frame sent by a STA using non-HT duplicate.
non-HT duplicate PHY reception test The test consists in an AP sending a single non-HT duplicate PPDU...
void GenerateInterference(Ptr< WaveformGenerator > interferer, Ptr< SpectrumValue > interferencePsd, Time duration)
Generate interference function.
std::vector< bool > m_per20MhzInterference
flags per 20 MHz subchannel whether an interference should be generated on that subchannel
void DoTeardown() override
Implementation to do any local setup required for this TestCase.
void ResetResults()
Reset the results.
std::vector< Ptr< SpectrumWifiPhy > > m_phyStas
PHYs of STAs.
void RxFailure(std::size_t index, Ptr< const WifiPsdu > psdu)
Receive failure function.
std::vector< uint32_t > m_countRxFailureStas
count RX failure for STAs
void SendNonHtDuplicatePpdu(uint16_t channelWidth)
Send non-HT duplicate PPDU function.
StasParams m_stasParams
the parameters of the STAs
std::vector< std::tuple< WifiStandard, uint16_t, uint8_t > > StasParams
A vector containing parameters per STA: the standard, the center frequency and the P20 index.
void CheckResults(std::size_t index, uint32_t expectedRxSuccess, uint32_t expectedRxFailure)
Check the results.
void StopInterference(Ptr< WaveformGenerator > interferer)
Stop interference function.
void DoSetup() override
Implementation to do any local setup required for this TestCase.
TestNonHtDuplicatePhyReception(WifiStandard apStandard, uint16_t apFrequency, uint8_t apP20Index, StasParams stasParams, std::vector< bool > per20MhzInterference={})
Constructor.
void RxSuccess(std::size_t index, Ptr< const WifiPsdu > psdu, RxSignalInfo rxSignalInfo, WifiTxVector txVector, std::vector< bool > statusPerMpdu)
Receive success function.
WifiStandard m_apStandard
the standard to use for the AP
Ptr< SpectrumWifiPhy > m_phyAp
PHY of AP.
uint8_t m_apP20Index
the index of the primary 20 MHz channel of the AP
void DoRun() override
Implementation to actually run this TestCase.
std::vector< uint32_t > m_countRxSuccessStas
count RX success for STAs
std::vector< Ptr< WaveformGenerator > > m_phyInterferers
PHYs of interferers (1 interferer per 20 MHz subchannel)
uint16_t m_apFrequency
the center frequency of the AP (in MHz)
wifi non-HT duplicate Test Suite
WifiNonHtDuplicateTestSuite()
AttributeValue implementation for Boolean.
std::optional< WifiTxVector > m_currentTxVector
If the STA is an AP STA, this holds the TXVECTOR of the PPDU that has been sent.
uint64_t m_previouslyTxPpduUid
UID of the previously sent PPDU, used by AP to recognize response HE TB PPDUs.
void Dispose()
Dispose of this Object.
void SetOwner(Ptr< WifiPhy > wifiPhy)
Set the WifiPhy owning this PHY entity.
void SetChannel(const Ptr< SpectrumChannel > channel)
Set the SpectrumChannel this SpectrumWifiPhy is to be connected to.
void CreateWifiSpectrumPhyInterface(Ptr< NetDevice > device)
Method to encapsulate the creation of the WifiSpectrumPhyInterface object (used to bind the WifiSpect...
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Simulation virtual time values and global simulation resolution.
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
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.
uint16_t GetChannelWidth() const
uint16_t GetFrequency() const
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.
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 SetMobility(const Ptr< MobilityModel > mobility)
assign a mobility model to this device
void SetReceiveOkCallback(RxOkCallback callback)
std::tuple< uint8_t, uint16_t, int, uint8_t > ChannelTuple
Tuple identifying an operating channel.
const WifiPhyOperatingChannel & GetOperatingChannel() const
Get a const reference to the operating channel.
virtual int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model.
uint16_t GetPrimaryChannelCenterFrequency(uint16_t primaryChannelWidth) const
Get the center frequency of the primary channel of the given width.
uint32_t GetSize() const
Return the size of the PSDU in bytes.
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
void SetChannelWidth(uint16_t channelWidth)
Sets the selected channelWidth (in MHz)
void SetTriggerResponding(bool triggerResponding)
Set the Trigger Responding parameter to the given value.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_TEST_ASSERT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report and abort if not.
#define NS_TEST_EXPECT_MSG_EQ_TOL(actual, limit, tol, msg)
Test that actual and expected (limit) values are equal to plus or minus some tolerance and report if ...
Time NanoSeconds(uint64_t value)
Construct a Time in the indicated unit.
Time Seconds(double value)
Construct a Time in the indicated unit.
WifiStandard
Identifies the IEEE 802.11 specifications that a Wifi device can be configured to use.
@ 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.
double WToDbm(double w)
Convert from Watts to dBm.
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::vector< BandInfo > Bands
Container of BandInfo.
double DbmToW(double dBm)
Convert from dBm to Watts.
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 WifiNonHtDuplicateTestSuite wifiNonHtDuplicateTestSuite
the test suite
constexpr uint32_t DEFAULT_FREQUENCY