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" 
  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);
 
  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{},
 
  365    interferer->SetTxPowerSpectralDensity(interferencePsd);
 
  366    interferer->SetPeriod(duration);
 
  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] =
 
  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;
 
  514    int64_t streamNumber = 0;
 
  518        phySta->AssignStreams(streamNumber);
 
  521    [[maybe_unused]] 
auto [apChannelNum, centerFreq, apChannelWidth, type, phyBand] =
 
  531    for (
const auto& [staStandard, staFrequency, staP20Index] : 
m_stasParams)
 
  533        [[maybe_unused]] 
auto [staChannelNum, centerFreq, staChannelWidth, type, phyBand] =
 
  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;
 
  575        const auto apCenterFreq =
 
  577        const auto apMinFreq = apCenterFreq - (channelWidth / 2);
 
  578        const auto apMaxFreq = apCenterFreq + (channelWidth / 2);
 
  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);
 
  601                                expectRx ? expectSuccess : 0,
 
  602                                expectRx ? !expectSuccess : 0);
 
  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!");
 
  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);
 
  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);
 
  892    std::size_t index = 1;
 
  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.
 
static WifiMode GetOfdmRate54Mbps()
Return a WifiMode for OFDM at 54 Mbps.
 
static WifiMode GetOfdmRate24Mbps()
Return a WifiMode for OFDM at 24 Mbps.
 
void SetOwner(Ptr< WifiPhy > wifiPhy)
Set the WifiPhy owning this PHY entity.
 
Smart pointer class similar to boost::intrusive_ptr.
 
static void SetRun(uint64_t run)
Set the run number of simulation.
 
static void SetSeed(uint32_t seed)
Set the seed.
 
static EventId Schedule(const Time &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
 
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
 
static void Run()
Run the simulation.
 
void DoInitialize() override
Initialize() implementation.
 
void SetChannel(const Ptr< SpectrumChannel > channel)
Set the SpectrumChannel this SpectrumWifiPhy is to be connected to.
 
void DoDispose() override
Destructor implementation.
 
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.
 
static ConstIterator FindFirst(uint8_t number, uint16_t frequency, uint16_t width, WifiStandard standard, WifiPhyBand band, ConstIterator start=m_frequencyChannels.begin())
Find the first channel matching the specified parameters.
 
uint16_t GetPrimaryChannelCenterFrequency(uint16_t primaryChannelWidth) const
Get the center frequency of the primary channel of the given width.
 
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