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,
389 const auto expectedWidth =
393 "Incorrect channel width in TXVECTOR");
406 uint32_t expectedRxSuccess,
407 uint32_t expectedRxFailure)
409 NS_LOG_FUNCTION(
this << index << expectedRxSuccess << expectedRxFailure);
412 "The number of successfully received packets by STA "
413 << index <<
" is not correct!");
416 "The number of unsuccessfully received packets by STA "
417 << index <<
" is not correct!");
423 auto spectrumChannel = CreateObject<MultiModelSpectrumChannel>();
424 auto lossModel = CreateObject<FriisPropagationLossModel>();
426 spectrumChannel->AddPropagationLossModel(lossModel);
427 auto delayModel = CreateObject<ConstantSpeedPropagationDelayModel>();
428 spectrumChannel->SetPropagationDelayModel(delayModel);
430 auto apNode = CreateObject<Node>();
431 auto apDev = CreateObject<WifiNetDevice>();
432 m_phyAp = CreateObject<SpectrumWifiPhy>();
433 auto apInterferenceHelper = CreateObject<InterferenceHelper>();
435 auto apErrorModel = CreateObject<NistErrorRateModel>();
440 auto apMobility = CreateObject<ConstantPositionMobilityModel>();
443 apNode->AggregateObject(apMobility);
444 apNode->AddDevice(apDev);
448 auto staNode = CreateObject<Node>();
449 auto staDev = CreateObject<WifiNetDevice>();
450 auto staPhy = CreateObject<SpectrumWifiPhy>();
451 auto sta1InterferenceHelper = CreateObject<InterferenceHelper>();
452 staPhy->SetInterferenceHelper(sta1InterferenceHelper);
453 auto sta1ErrorModel = CreateObject<NistErrorRateModel>();
454 staPhy->SetErrorRateModel(sta1ErrorModel);
455 staPhy->SetDevice(staDev);
456 staPhy->AddChannel(spectrumChannel);
457 staPhy->ConfigureStandard(std::get<0>(staParams));
458 staPhy->SetReceiveOkCallback(
460 staPhy->SetReceiveErrorCallback(
462 auto staMobility = CreateObject<ConstantPositionMobilityModel>();
463 staPhy->SetMobility(staMobility);
464 staDev->SetPhy(staPhy);
465 staNode->AggregateObject(staMobility);
466 staNode->AddDevice(staDev);
474 [[maybe_unused]]
auto [channelNum, centerFreq, apChannelWidth,
type, phyBand] =
475 (*WifiPhyOperatingChannel::FindFirst(0,
483 auto interfererNode = CreateObject<Node>();
484 auto interfererDev = CreateObject<NonCommunicatingNetDevice>();
485 auto phyInterferer = CreateObject<WaveformGenerator>();
486 phyInterferer->SetDevice(interfererDev);
487 phyInterferer->SetChannel(spectrumChannel);
488 phyInterferer->SetDutyCycle(1);
489 interfererNode->AddDevice(interfererDev);
507 phyInterferer->Dispose();
508 phyInterferer =
nullptr;
515 RngSeedManager::SetSeed(1);
516 RngSeedManager::SetRun(1);
517 int64_t streamNumber = 0;
521 phySta->AssignStreams(streamNumber);
524 [[maybe_unused]]
auto [apChannelNum, centerFreq, apChannelWidth,
type, phyBand] =
525 (*WifiPhyOperatingChannel::FindFirst(0,
534 for (
const auto& [staStandard, staFrequency, staP20Index] :
m_stasParams)
536 [[maybe_unused]]
auto [staChannelNum, centerFreq, staChannelWidth,
type, phyBand] =
537 (*WifiPhyOperatingChannel::FindFirst(0,
542 m_phyStas.at(index++)->SetOperatingChannel(
547 const auto minApCenterFrequency =
549 for (
auto channelWidth = 20; channelWidth <= apChannelWidth; channelWidth *= 2, ++index)
560 bandInfo.
fc = (minApCenterFrequency + (i * 20)) * 1e6;
561 bandInfo.
fl = bandInfo.
fc - (5 * 1e6);
562 bandInfo.
fh = bandInfo.
fc + (5 * 1e6);
564 bands.push_back(bandInfo);
565 auto spectrumInterference = Create<SpectrumModel>(bands);
566 auto interferencePsd = Create<SpectrumValue>(spectrumInterference);
567 auto interferencePower = 0.005;
569 *interferencePsd = interferencePower / 10e6;
570 Simulator::Schedule(
Seconds(index),
578 const auto apCenterFreq =
580 const auto apMinFreq = apCenterFreq - (channelWidth / 2);
581 const auto apMaxFreq = apCenterFreq + (channelWidth / 2);
582 Simulator::Schedule(
Seconds(index + 0.1),
588 const auto p20Width = 20;
589 const auto staP20Freq =
590 m_phyStas.at(i)->GetOperatingChannel().GetPrimaryChannelCenterFrequency(p20Width);
591 const auto staP20MinFreq = staP20Freq - (p20Width / 2);
592 const auto staP20MaxFreq = staP20Freq + (p20Width / 2);
593 bool expectRx = (staP20MinFreq >= apMinFreq && staP20MaxFreq <= apMaxFreq);
594 bool expectSuccess =
true;
597 const auto index20MhzSubBand = ((staP20Freq - minApCenterFrequency) / 20);
600 Simulator::Schedule(
Seconds(index + 0.5),
604 expectRx ? expectSuccess : 0,
605 expectRx ? !expectSuccess : 0);
607 Simulator::Schedule(
Seconds(index + 0.5),
613 Simulator::Destroy();
648 void DoRun()
override;
674 std::vector<bool> statusPerMpdu);
706 const std::vector<CtsTxInfos>& ctsTxInfosPerSta)
707 :
TestCase{
"test PHY reception of multiple CTS frames following a MU-RTS frame"},
708 m_ctsTxInfosPerSta{ctsTxInfosPerSta},
709 m_countApRxCtsSuccess{0},
710 m_countApRxCtsFailure{0},
711 m_countStaRxCtsSuccess{0},
712 m_countStaRxCtsFailure{0},
713 m_stasTxPowerDbm(10.0)
725 [](
const auto& lhs,
const auto& rhs) { return lhs.bw < rhs.bw; })
737 phySta->SetPpduUid(0);
773 auto pkt = Create<Packet>();
774 auto mpdu = Create<WifiMpdu>(pkt, hdr);
775 auto psdu = Create<WifiPsdu>(mpdu,
false);
777 m_phyStas.at(phyIndex)->Send(psdu, txVector);
787 NS_LOG_FUNCTION(
this << phyIndex << *psdu << rxSignalInfo << txVector);
788 std::vector<CtsTxInfos> successfulCtsInfos{};
791 std::back_inserter(successfulCtsInfos),
792 [](
const auto& info) { return !info.discard; });
793 const auto isAp = (phyIndex == 0);
799 "RX power is not correct!");
802 std::max_element(successfulCtsInfos.cbegin(),
803 successfulCtsInfos.cend(),
804 [](
const auto& lhs,
const auto& rhs) { return lhs.bw < rhs.bw; })
812 "Incorrect channel width in TXVECTOR");
827 const auto isAp = (phyIndex == 0);
843 "The number of successfully received CTS frames by AP is not correct!");
847 "The number of successfully received CTS frames by non-participating STAs is not correct!");
850 "The number of unsuccessfully received CTS frames by AP is not correct!");
853 "The number of unsuccessfully received CTS frames by non-participating "
854 "STAs is not correct!");
860 RngSeedManager::SetSeed(1);
861 RngSeedManager::SetRun(1);
862 int64_t streamNumber = 0;
864 auto spectrumChannel = CreateObject<MultiModelSpectrumChannel>();
865 auto lossModel = CreateObject<FriisPropagationLossModel>();
867 spectrumChannel->AddPropagationLossModel(lossModel);
868 auto delayModel = CreateObject<ConstantSpeedPropagationDelayModel>();
869 spectrumChannel->SetPropagationDelayModel(delayModel);
871 auto apNode = CreateObject<Node>();
872 auto apDev = CreateObject<WifiNetDevice>();
873 auto apMac = CreateObject<ApWifiMac>();
874 apMac->SetAttribute(
"BeaconGeneration",
BooleanValue(
false));
875 apDev->SetMac(apMac);
876 m_phyAp = CreateObject<MuRtsCtsSpectrumWifiPhy>();
877 apDev->SetHeConfiguration(CreateObject<HeConfiguration>());
878 auto apInterferenceHelper = CreateObject<InterferenceHelper>();
880 auto apErrorModel = CreateObject<NistErrorRateModel>();
895 [](
const auto& lhs,
const auto& rhs) { return lhs.bw < rhs.bw; })
897 auto apChannelNum = std::get<0>(
902 auto apMobility = CreateObject<ConstantPositionMobilityModel>();
906 apDev->SetHeConfiguration(CreateObject<HeConfiguration>());
908 apNode->AggregateObject(apMobility);
909 apNode->AddDevice(apDev);
913 auto staNode = CreateObject<Node>();
914 auto staDev = CreateObject<WifiNetDevice>();
915 auto phySta = CreateObject<MuRtsCtsSpectrumWifiPhy>();
916 auto staInterferenceHelper = CreateObject<InterferenceHelper>();
917 phySta->SetInterferenceHelper(staInterferenceHelper);
918 auto staErrorModel = CreateObject<NistErrorRateModel>();
919 phySta->SetErrorRateModel(staErrorModel);
920 phySta->SetDevice(staDev);
921 phySta->AddChannel(spectrumChannel);
923 phySta->AssignStreams(streamNumber);
928 std::get<0>(*WifiPhyOperatingChannel::FindFirst(0,
934 phySta->SetOperatingChannel(
937 auto staMobility = CreateObject<ConstantPositionMobilityModel>();
938 phySta->SetMobility(staMobility);
939 staDev->SetPhy(phySta);
941 staDev->SetHeConfiguration(CreateObject<HeConfiguration>());
942 staNode->AggregateObject(staMobility);
943 staNode->AddDevice(staDev);
947 auto nonParticipatingHeStaNode = CreateObject<Node>();
948 auto nonParticipatingHeStaDev = CreateObject<WifiNetDevice>();
949 auto nonParticipatingHePhySta = CreateObject<SpectrumWifiPhy>();
950 auto nonParticipatingHeStaInterferenceHelper = CreateObject<InterferenceHelper>();
951 nonParticipatingHePhySta->SetInterferenceHelper(nonParticipatingHeStaInterferenceHelper);
952 auto nonParticipatingHeStaErrorModel = CreateObject<NistErrorRateModel>();
953 nonParticipatingHePhySta->SetErrorRateModel(nonParticipatingHeStaErrorModel);
954 nonParticipatingHePhySta->SetDevice(nonParticipatingHeStaDev);
955 nonParticipatingHePhySta->AddChannel(spectrumChannel);
958 nonParticipatingHePhySta->SetOperatingChannel(
961 auto nonParticipatingHeStaMobility = CreateObject<ConstantPositionMobilityModel>();
962 nonParticipatingHePhySta->SetMobility(nonParticipatingHeStaMobility);
963 nonParticipatingHeStaDev->SetPhy(nonParticipatingHePhySta);
965 nonParticipatingHeStaDev->SetHeConfiguration(CreateObject<HeConfiguration>());
966 nonParticipatingHePhySta->AssignStreams(streamNumber);
967 nonParticipatingHeStaNode->AggregateObject(nonParticipatingHeStaMobility);
968 nonParticipatingHeStaNode->AddDevice(nonParticipatingHeStaDev);
970 nonParticipatingHePhySta->SetReceiveOkCallback(
972 nonParticipatingHePhySta->SetReceiveErrorCallback(
977 auto nonHeStaNode = CreateObject<Node>();
978 auto nonHeStaDev = CreateObject<WifiNetDevice>();
979 auto nonHePhySta = CreateObject<SpectrumWifiPhy>();
980 auto nonHeStaInterferenceHelper = CreateObject<InterferenceHelper>();
981 nonHePhySta->SetInterferenceHelper(nonHeStaInterferenceHelper);
982 auto nonHeStaErrorModel = CreateObject<NistErrorRateModel>();
983 nonHePhySta->SetErrorRateModel(nonHeStaErrorModel);
984 nonHePhySta->SetDevice(nonHeStaDev);
985 nonHePhySta->AddChannel(spectrumChannel);
987 nonHePhySta->SetOperatingChannel(
989 auto nonHeStaMobility = CreateObject<ConstantPositionMobilityModel>();
990 nonHePhySta->SetMobility(nonHeStaMobility);
991 nonHeStaDev->SetPhy(nonHePhySta);
993 nonHePhySta->AssignStreams(streamNumber);
994 nonHeStaNode->AggregateObject(nonHeStaMobility);
995 nonHeStaNode->AddDevice(nonHeStaDev);
1017 for (std::size_t index = 0; index <
m_phyStas.size(); ++index)
1021 const auto delay = (index + 1) *
NanoSeconds(1.0);
1022 Simulator::Schedule(delay,
1033 Simulator::Destroy();
1099 {
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.
TestMultipleCtsResponsesFromMuRts(const std::vector< CtsTxInfos > &ctsTxInfosPerSta)
Constructor.
std::size_t m_countApRxCtsFailure
count the number of unsuccessfully received CTS frames by the AP
void DoSetup() override
Implementation to do any local setup required for this TestCase.
std::size_t m_countStaRxCtsFailure
count the number of unsuccessfully received CTS frames by the non-participating STA
void RxCtsSuccess(std::size_t phyIndex, Ptr< const WifiPsdu > psdu, RxSignalInfo rxSignalInfo, WifiTxVector txVector, std::vector< bool > statusPerMpdu)
CTS RX success function.
void FakePreviousMuRts()
Function called to fake the transmission of a MU-RTS.
std::vector< CtsTxInfos > m_ctsTxInfosPerSta
information about CTS responses
std::vector< Ptr< MuRtsCtsSpectrumWifiPhy > > m_phyStas
STAs PHYs.
void TxNonHtDuplicateCts(std::size_t phyIndex)
Function called to trigger a CTS frame sent by a STA using non-HT duplicate.
void DoTeardown() override
Implementation to do any local setup required for this TestCase.
void DoRun() override
Implementation to actually run this TestCase.
std::size_t m_countApRxCtsSuccess
count the number of successfully received CTS frames by the AP
Ptr< MuRtsCtsSpectrumWifiPhy > m_phyAp
AP PHY.
void RxCtsFailure(std::size_t phyIndex, Ptr< const WifiPsdu > psdu)
CTS RX failure function.
double m_stasTxPowerDbm
TX power in dBm configured for the STAs.
std::size_t m_countStaRxCtsSuccess
count the number of successfully received CTS frames by the non-participating STA
void CheckResults()
Check the results.
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()
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 SetDevice(const Ptr< WifiNetDevice > device) override
Sets the device this PHY is associated with.
void AddChannel(const Ptr< SpectrumChannel > channel, const FrequencyRange &freqRange=WHOLE_WIFI_SPECTRUM)
Attach a SpectrumChannel to use for a given frequency range.
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.
std::tuple< uint8_t, uint16_t, WifiPhyBand, uint8_t > ChannelTuple
Tuple identifying an operating channel.
void SetMobility(const Ptr< MobilityModel > mobility)
assign a mobility model to this device
void SetReceiveOkCallback(RxOkCallback callback)
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.
uint16_t GetChannelWidth() const
#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.
static constexpr uint16_t SU_STA_ID
STA_ID to identify a single user (SU)
Information about CTS responses to expect in the test.
uint16_t bw
the width in MHz of the CTS response
bool discard
flag whether the CTS response shall be discarded
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