A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
wifi-phy-thresholds-test.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2018
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation;
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 *
17 * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
18 */
19
20#include "ns3/interference-helper.h"
21#include "ns3/log.h"
22#include "ns3/multi-model-spectrum-channel.h"
23#include "ns3/nist-error-rate-model.h"
24#include "ns3/ofdm-phy.h"
25#include "ns3/ofdm-ppdu.h"
26#include "ns3/spectrum-phy.h"
27#include "ns3/spectrum-wifi-helper.h"
28#include "ns3/spectrum-wifi-phy.h"
29#include "ns3/test.h"
30#include "ns3/wifi-mac-header.h"
31#include "ns3/wifi-net-device.h"
32#include "ns3/wifi-psdu.h"
33#include "ns3/wifi-spectrum-phy-interface.h"
34#include "ns3/wifi-spectrum-signal-parameters.h"
35#include "ns3/wifi-spectrum-value-helper.h"
36#include "ns3/wifi-utils.h"
37
38using namespace ns3;
39
40NS_LOG_COMPONENT_DEFINE("WifiPhyThresholdsTest");
41
42static const uint8_t CHANNEL_NUMBER = 36;
43static const uint32_t FREQUENCY = 5180; // MHz
44static const uint16_t CHANNEL_WIDTH = 20; // MHz
45
53{
54 public:
60 WifiPhyThresholdsTest(std::string test_name);
64 ~WifiPhyThresholdsTest() override;
65
66 protected:
73 virtual Ptr<SpectrumSignalParameters> MakeWifiSignal(double txPowerWatts,
74 const WifiPhyOperatingChannel& channel);
80 virtual Ptr<SpectrumSignalParameters> MakeForeignSignal(double txPowerWatts);
86 virtual void SendSignal(double txPowerWatts, bool wifiSignal);
94 virtual void RxSuccess(Ptr<const WifiPsdu> psdu,
95 RxSignalInfo rxSignalInfo,
96 WifiTxVector txVector,
97 std::vector<bool> statusPerMpdu);
102 virtual void RxFailure(Ptr<const WifiPsdu> psdu);
115 virtual void PhyStateChanged(Time start, Time duration, WifiPhyState newState);
116
125
126 private:
127 void DoSetup() override;
128 void DoTeardown() override;
129};
130
132 : TestCase(test_name),
133 m_rxSuccess(0),
134 m_rxFailure(0),
135 m_rxDropped(0),
136 m_stateChanged(0),
137 m_rxStateCount(0),
138 m_idleStateCount(0),
139 m_ccabusyStateCount(0)
140{
141}
142
144{
145}
146
149{
151 0,
153 800,
154 1,
155 1,
156 0,
158 false);
159
160 Ptr<Packet> pkt = Create<Packet>(1000);
161 WifiMacHeader hdr;
162
164 hdr.SetQosTid(0);
165
166 Ptr<WifiPsdu> psdu = Create<WifiPsdu>(pkt, hdr);
167 Time txDuration = m_phy->CalculateTxDuration(psdu->GetSize(), txVector, m_phy->GetPhyBand());
168
169 Ptr<WifiPpdu> ppdu = Create<OfdmPpdu>(psdu, txVector, channel, 0);
170
171 Ptr<SpectrumValue> txPowerSpectrum =
173 channel.GetPrimaryChannelCenterFrequency(CHANNEL_WIDTH),
175 txPowerWatts,
177 Ptr<WifiSpectrumSignalParameters> txParams = Create<WifiSpectrumSignalParameters>();
178 txParams->psd = txPowerSpectrum;
179 txParams->txPhy = nullptr;
180 txParams->duration = txDuration;
181 txParams->ppdu = ppdu;
182 txParams->txWidth = CHANNEL_WIDTH;
183 return txParams;
184}
185
188{
189 Ptr<SpectrumValue> txPowerSpectrum =
192 txPowerWatts,
194 Ptr<SpectrumSignalParameters> txParams = Create<SpectrumSignalParameters>();
195 txParams->psd = txPowerSpectrum;
196 txParams->txPhy = nullptr;
197 txParams->duration = Seconds(0.5);
198 return txParams;
199}
200
201void
202WifiPhyThresholdsTest::SendSignal(double txPowerWatts, bool wifiSignal)
203{
204 if (wifiSignal)
205 {
206 m_phy->StartRx(MakeWifiSignal(txPowerWatts, m_phy->GetOperatingChannel()), nullptr);
207 }
208 else
209 {
210 m_phy->StartRx(MakeForeignSignal(txPowerWatts), nullptr);
211 }
212}
213
214void
216 RxSignalInfo rxSignalInfo,
217 WifiTxVector txVector,
218 std::vector<bool> statusPerMpdu)
219{
220 NS_LOG_FUNCTION(this << *psdu << rxSignalInfo << txVector);
221 m_rxSuccess++;
222}
223
224void
226{
227 NS_LOG_FUNCTION(this << *psdu);
228 m_rxFailure++;
229}
230
231void
233{
234 NS_LOG_FUNCTION(this << p << reason);
235 m_rxDropped++;
236}
237
238void
240{
241 NS_LOG_FUNCTION(this << start << duration << newState);
243 if (newState == WifiPhyState::IDLE)
244 {
246 }
247 else if (newState == WifiPhyState::RX)
248 {
250 }
251 else if (newState == WifiPhyState::CCA_BUSY)
252 {
254 }
255}
256
257void
259{
260 Ptr<MultiModelSpectrumChannel> spectrumChannel = CreateObject<MultiModelSpectrumChannel>();
261 Ptr<Node> node = CreateObject<Node>();
262 Ptr<WifiNetDevice> dev = CreateObject<WifiNetDevice>();
263 m_phy = CreateObject<SpectrumWifiPhy>();
264 Ptr<InterferenceHelper> interferenceHelper = CreateObject<InterferenceHelper>();
265 m_phy->SetInterferenceHelper(interferenceHelper);
266 Ptr<ErrorRateModel> error = CreateObject<NistErrorRateModel>();
267 m_phy->SetErrorRateModel(error);
268 m_phy->SetDevice(dev);
269 m_phy->AddChannel(spectrumChannel);
276 m_phy->GetState()->TraceConnectWithoutContext(
277 "State",
279 dev->SetPhy(m_phy);
280 node->AddDevice(dev);
281}
282
283void
285{
286 m_phy->Dispose();
287 m_phy = nullptr;
288}
289
300{
301 public:
304 void DoRun() override;
305};
306
308 : WifiPhyThresholdsTest("WifiPhy reception thresholds: test weak wifi signal reception")
309{
310}
311
313{
314}
315
316void
318{
319 double txPowerWatts = DbmToW(-110);
320
323 this,
324 txPowerWatts,
325 true);
326
329
331 0,
332 "Reception should not have been triggered if packet is weaker than "
333 "RxSensitivity threshold");
335 0,
336 "State should stay idle if reception involves a signal weaker than "
337 "RxSensitivity threshold");
338}
339
350{
351 public:
354 void DoRun() override;
355};
356
358 : WifiPhyThresholdsTest("WifiPhy reception thresholds: test weak foreign signal reception")
359{
360}
361
363{
364}
365
366void
368{
369 double txPowerWatts = DbmToW(-90);
370
373 this,
374 txPowerWatts,
375 false);
376
379
381 0,
382 "Reception of non-wifi packet should not be triggered");
384 0,
385 "State should stay idle if reception involves a signal weaker than "
386 "RxSensitivity threshold");
387}
388
399{
400 public:
403 void DoRun() override;
404};
405
407 : WifiPhyThresholdsTest("WifiPhy reception thresholds: test strong wifi signal reception")
408{
409}
410
412{
413}
414
415void
417{
418 double txPowerWatts = DbmToW(-60);
419
422 this,
423 txPowerWatts,
424 true);
425
428
430 0,
431 "Packet reception should have been successful");
432 NS_TEST_ASSERT_MSG_EQ(m_rxSuccess, 1, "Packet should have been successfully received");
433 NS_TEST_ASSERT_MSG_EQ(m_ccabusyStateCount, 2, "State should have moved to CCA_BUSY once");
436 4,
437 "State should have moved to CCA_BUSY, then to RX and finally back to IDLE");
438 NS_TEST_ASSERT_MSG_EQ(m_rxStateCount, 1, "State should have moved to RX once");
439 NS_TEST_ASSERT_MSG_EQ(m_idleStateCount, 1, "State should have moved to IDLE once");
440}
441
452{
453 public:
456 void DoRun() override;
457};
458
460 : WifiPhyThresholdsTest("WifiPhy reception thresholds: test weak foreign signal reception")
461{
462}
463
465{
466}
467
468void
470{
471 double txPowerWatts = DbmToW(-60);
472
475 this,
476 txPowerWatts,
477 false);
478
481
483 0,
484 "Reception of non-wifi packet should not be triggered");
486 1,
487 "State should have moved to CCA-BUSY then back to IDLE");
488}
489
497{
498 public:
500};
501
503 : TestSuite("wifi-phy-thresholds", UNIT)
504{
509}
510
Wifi Phy Threshold Strong Foreign Signal Test.
void DoRun() override
Implementation to actually run this TestCase.
Wifi Phy Threshold Strong Wifi Signal Test.
void DoRun() override
Implementation to actually run this TestCase.
Wifi Phy Threshold Test base class.
uint32_t m_rxDropped
count number of dropped packets
uint32_t m_ccabusyStateCount
count number of PHY state change to CCA_BUSY state
uint32_t m_idleStateCount
count number of PHY state change to IDLE state
uint32_t m_rxStateCount
count number of PHY state change to RX state
void DoTeardown() override
Implementation to do any local setup required for this TestCase.
virtual void PhyStateChanged(Time start, Time duration, WifiPhyState newState)
PHY state changed callback function.
virtual Ptr< SpectrumSignalParameters > MakeWifiSignal(double txPowerWatts, const WifiPhyOperatingChannel &channel)
Make wifi signal function.
~WifiPhyThresholdsTest() override
Destructor.
uint32_t m_stateChanged
count number of PHY state change
uint32_t m_rxFailure
count number of unsuccessfuly received packets
virtual void RxFailure(Ptr< const WifiPsdu > psdu)
PHY receive failure callback function.
virtual Ptr< SpectrumSignalParameters > MakeForeignSignal(double txPowerWatts)
Make foreign signal function.
void RxDropped(Ptr< const Packet > p, WifiPhyRxfailureReason reason)
PHY dropped packet callback function.
Ptr< SpectrumWifiPhy > m_phy
PHY object.
void DoSetup() override
Implementation to do any local setup required for this TestCase.
virtual void RxSuccess(Ptr< const WifiPsdu > psdu, RxSignalInfo rxSignalInfo, WifiTxVector txVector, std::vector< bool > statusPerMpdu)
PHY receive success callback function.
virtual void SendSignal(double txPowerWatts, bool wifiSignal)
Send signal function.
WifiPhyThresholdsTest(std::string test_name)
Constructor.
uint32_t m_rxSuccess
count number of successfully received packets
Wifi Phy Thresholds Test Suite.
Wifi Phy Threshold Weak Foreign Signal Test.
void DoRun() override
Implementation to actually run this TestCase.
Wifi Phy Threshold Weak Wifi Signal Test.
void DoRun() override
Implementation to actually run this TestCase.
bool TraceConnectWithoutContext(std::string name, const CallbackBase &cb)
Connect a TraceSource to a Callback without a context.
Definition: object-base.cc:311
void Dispose()
Dispose of this Object.
Definition: object.cc:219
static WifiMode GetOfdmRate6Mbps()
Return a WifiMode for OFDM at 6 Mbps.
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:78
static EventId Schedule(const Time &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
Definition: simulator.h:568
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
Definition: simulator.cc:140
static void Run()
Run the simulation.
Definition: simulator.cc:176
void SetDevice(const Ptr< WifiNetDevice > device) override
Sets the device this PHY is associated with.
void StartRx(Ptr< SpectrumSignalParameters > rxParams, Ptr< const WifiSpectrumPhyInterface > interface)
Input method for delivering a signal from the spectrum channel and low-level PHY interface to this Sp...
void AddChannel(const Ptr< SpectrumChannel > channel, const FrequencyRange &freqRange=WHOLE_WIFI_SPECTRUM)
Attach a SpectrumChannel to use for a given frequency range.
encapsulates test code
Definition: test.h:1060
@ QUICK
Fast test.
Definition: test.h:1065
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:301
A suite of tests to run.
Definition: test.h:1256
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:105
Implements the IEEE 802.11 MAC header.
void SetType(WifiMacType type, bool resetToDsFromDs=true)
Set Type/Subtype values with the correct values depending on the given type.
void SetQosTid(uint8_t tid)
Set the TID for the QoS header.
virtual void SetInterferenceHelper(const Ptr< InterferenceHelper > helper)
Sets the interference helper.
Definition: wifi-phy.cc:633
void SetErrorRateModel(const Ptr< ErrorRateModel > model)
Sets the error rate model.
Definition: wifi-phy.cc:641
void SetReceiveErrorCallback(RxErrorCallback callback)
Definition: wifi-phy.cc:457
virtual void ConfigureStandard(WifiStandard standard)
Configure the PHY-level parameters for different Wi-Fi standard.
Definition: wifi-phy.cc:950
static Time CalculateTxDuration(uint32_t size, const WifiTxVector &txVector, WifiPhyBand band, uint16_t staId=SU_STA_ID)
Definition: wifi-phy.cc:1496
Ptr< WifiPhyStateHelper > GetState() const
Return the WifiPhyStateHelper of this PHY.
Definition: wifi-phy.cc:445
void SetOperatingChannel(const ChannelTuple &channelTuple)
If the standard for this object has not been set yet, store the given channel settings.
Definition: wifi-phy.cc:1082
WifiPhyBand GetPhyBand() const
Get the configured Wi-Fi band.
Definition: wifi-phy.cc:1005
void SetReceiveOkCallback(RxOkCallback callback)
Definition: wifi-phy.cc:451
std::tuple< uint8_t, uint16_t, int, uint8_t > ChannelTuple
Tuple identifying an operating channel.
Definition: wifi-phy.h:872
const WifiPhyOperatingChannel & GetOperatingChannel() const
Get a const reference to the operating channel.
Definition: wifi-phy.cc:1017
Class that keeps track of all information about the current PHY operating channel.
static Ptr< SpectrumValue > CreateHeOfdmTxPowerSpectralDensity(uint32_t centerFrequency, uint16_t channelWidth, double txPowerW, uint16_t guardBandwidth, double minInnerBandDbr=-20, double minOuterbandDbr=-28, double lowestPointDbr=-40, const std::vector< bool > &puncturedSubchannels=std::vector< bool >{})
Create a transmit power spectral density corresponding to OFDM High Efficiency (HE) (802....
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:202
#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.
Definition: test.h:144
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1336
WifiPhyRxfailureReason
Enumeration of the possible reception failure reasons.
@ WIFI_STANDARD_80211ax
@ WIFI_PREAMBLE_LONG
@ WIFI_PHY_BAND_5GHZ
The 5 GHz band.
Definition: wifi-phy-band.h:37
Every class exported by the ns3 library is enclosed in the ns3 namespace.
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...
Definition: callback.h:702
double DbmToW(double dBm)
Convert from dBm to Watts.
Definition: wifi-utils.cc:40
@ WIFI_MAC_QOSDATA
RxSignalInfo structure containing info on the received signal.
Definition: phy-entity.h:70
WifiPhyState
The state of the PHY layer.
static const uint8_t CHANNEL_NUMBER
static WifiPhyThresholdsTestSuite wifiPhyThresholdsTestSuite
the test suite
static const uint16_t CHANNEL_WIDTH
static const uint32_t FREQUENCY