A Discrete-Event Network Simulator
API
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/nist-error-rate-model.h"
23#include "ns3/ofdm-phy.h"
24#include "ns3/ofdm-ppdu.h"
25#include "ns3/spectrum-wifi-helper.h"
26#include "ns3/spectrum-wifi-phy.h"
27#include "ns3/test.h"
28#include "ns3/wifi-mac-header.h"
29#include "ns3/wifi-psdu.h"
30#include "ns3/wifi-spectrum-signal-parameters.h"
31#include "ns3/wifi-spectrum-value-helper.h"
32#include "ns3/wifi-utils.h"
33
34using namespace ns3;
35
36NS_LOG_COMPONENT_DEFINE("WifiPhyThresholdsTest");
37
38static const uint8_t CHANNEL_NUMBER = 36;
39static const uint32_t FREQUENCY = 5180; // MHz
40static const uint16_t CHANNEL_WIDTH = 20; // MHz
41
49{
50 public:
56 WifiPhyThresholdsTest(std::string test_name);
60 ~WifiPhyThresholdsTest() override;
61
62 protected:
68 virtual Ptr<SpectrumSignalParameters> MakeWifiSignal(double txPowerWatts);
74 virtual Ptr<SpectrumSignalParameters> MakeForeignSignal(double txPowerWatts);
80 virtual void SendSignal(double txPowerWatts, bool wifiSignal);
88 virtual void RxSuccess(Ptr<const WifiPsdu> psdu,
89 RxSignalInfo rxSignalInfo,
90 WifiTxVector txVector,
91 std::vector<bool> statusPerMpdu);
96 virtual void RxFailure(Ptr<const WifiPsdu> psdu);
109 virtual void PhyStateChanged(Time start, Time duration, WifiPhyState newState);
110
119
120 private:
121 void DoSetup() override;
122 void DoTeardown() override;
123};
124
126 : TestCase(test_name),
127 m_rxSuccess(0),
128 m_rxFailure(0),
129 m_rxDropped(0),
130 m_stateChanged(0),
131 m_rxStateCount(0),
132 m_idleStateCount(0),
133 m_ccabusyStateCount(0)
134{
135}
136
138{
139}
140
143{
144 WifiTxVector txVector =
145 WifiTxVector(OfdmPhy::GetOfdmRate6Mbps(), 0, WIFI_PREAMBLE_LONG, 800, 1, 1, 0, 20, false);
146
147 Ptr<Packet> pkt = Create<Packet>(1000);
148 WifiMacHeader hdr;
149
151 hdr.SetQosTid(0);
152
153 Ptr<WifiPsdu> psdu = Create<WifiPsdu>(pkt, hdr);
154 Time txDuration = m_phy->CalculateTxDuration(psdu->GetSize(), txVector, m_phy->GetPhyBand());
155
156 Ptr<WifiPpdu> ppdu = Create<OfdmPpdu>(psdu, txVector, FREQUENCY, WIFI_PHY_BAND_5GHZ, 0);
157
158 Ptr<SpectrumValue> txPowerSpectrum =
159 WifiSpectrumValueHelper::CreateHeOfdmTxPowerSpectralDensity(FREQUENCY,
161 txPowerWatts,
163 Ptr<WifiSpectrumSignalParameters> txParams = Create<WifiSpectrumSignalParameters>();
164 txParams->psd = txPowerSpectrum;
165 txParams->txPhy = nullptr;
166 txParams->duration = txDuration;
167 txParams->ppdu = ppdu;
168 return txParams;
169}
170
173{
174 Ptr<SpectrumValue> txPowerSpectrum =
175 WifiSpectrumValueHelper::CreateHeOfdmTxPowerSpectralDensity(FREQUENCY,
177 txPowerWatts,
179 Ptr<SpectrumSignalParameters> txParams = Create<SpectrumSignalParameters>();
180 txParams->psd = txPowerSpectrum;
181 txParams->txPhy = nullptr;
182 txParams->duration = Seconds(0.5);
183 return txParams;
184}
185
186void
187WifiPhyThresholdsTest::SendSignal(double txPowerWatts, bool wifiSignal)
188{
189 if (wifiSignal)
190 {
191 m_phy->StartRx(MakeWifiSignal(txPowerWatts));
192 }
193 else
194 {
195 m_phy->StartRx(MakeForeignSignal(txPowerWatts));
196 }
197}
198
199void
201 RxSignalInfo rxSignalInfo,
202 WifiTxVector txVector,
203 std::vector<bool> statusPerMpdu)
204{
205 NS_LOG_FUNCTION(this << *psdu << rxSignalInfo << txVector);
206 m_rxSuccess++;
207}
208
209void
211{
212 NS_LOG_FUNCTION(this << *psdu);
213 m_rxFailure++;
214}
215
216void
218{
219 NS_LOG_FUNCTION(this << p << reason);
220 m_rxDropped++;
221}
222
223void
225{
226 NS_LOG_FUNCTION(this << start << duration << newState);
228 if (newState == WifiPhyState::IDLE)
229 {
231 }
232 else if (newState == WifiPhyState::RX)
233 {
235 }
236 else if (newState == WifiPhyState::CCA_BUSY)
237 {
239 }
240}
241
242void
244{
245 m_phy = CreateObject<SpectrumWifiPhy>();
247 Ptr<InterferenceHelper> interferenceHelper = CreateObject<InterferenceHelper>();
248 m_phy->SetInterferenceHelper(interferenceHelper);
249 Ptr<ErrorRateModel> error = CreateObject<NistErrorRateModel>();
250 m_phy->SetErrorRateModel(error);
256 m_phy->GetState()->TraceConnectWithoutContext(
257 "State",
259}
260
261void
263{
264 m_phy->Dispose();
265 m_phy = nullptr;
266}
267
278{
279 public:
282 void DoRun() override;
283};
284
286 : WifiPhyThresholdsTest("WifiPhy reception thresholds: test weak wifi signal reception")
287{
288}
289
291{
292}
293
294void
296{
297 double txPowerWatts = DbmToW(-110);
298
299 Simulator::Schedule(Seconds(1),
301 this,
302 txPowerWatts,
303 true);
304
305 Simulator::Run();
306 Simulator::Destroy();
307
309 0,
310 "Reception should not have been triggered if packet is weaker than "
311 "RxSensitivity threshold");
313 0,
314 "State should stay idle if reception involves a signal weaker than "
315 "RxSensitivity threshold");
316}
317
328{
329 public:
332 void DoRun() override;
333};
334
336 : WifiPhyThresholdsTest("WifiPhy reception thresholds: test weak foreign signal reception")
337{
338}
339
341{
342}
343
344void
346{
347 double txPowerWatts = DbmToW(-90);
348
349 Simulator::Schedule(Seconds(1),
351 this,
352 txPowerWatts,
353 false);
354
355 Simulator::Run();
356 Simulator::Destroy();
357
359 0,
360 "Reception of non-wifi packet should not be triggered");
362 0,
363 "State should stay idle if reception involves a signal weaker than "
364 "RxSensitivity threshold");
365}
366
377{
378 public:
381 void DoRun() override;
382};
383
385 : WifiPhyThresholdsTest("WifiPhy reception thresholds: test strong wifi signal reception")
386{
387}
388
390{
391}
392
393void
395{
396 double txPowerWatts = DbmToW(-60);
397
398 Simulator::Schedule(Seconds(1),
400 this,
401 txPowerWatts,
402 true);
403
404 Simulator::Run();
405 Simulator::Destroy();
406
408 0,
409 "Packet reception should have been successfull");
410 NS_TEST_ASSERT_MSG_EQ(m_rxSuccess, 1, "Packet should have been successfully received");
411 NS_TEST_ASSERT_MSG_EQ(m_ccabusyStateCount, 2, "State should have moved to CCA_BUSY once");
414 4,
415 "State should have moved to CCA_BUSY, then to RX and finally back to IDLE");
416 NS_TEST_ASSERT_MSG_EQ(m_rxStateCount, 1, "State should have moved to RX once");
417 NS_TEST_ASSERT_MSG_EQ(m_idleStateCount, 1, "State should have moved to IDLE once");
418}
419
430{
431 public:
434 void DoRun() override;
435};
436
438 : WifiPhyThresholdsTest("WifiPhy reception thresholds: test weak foreign signal reception")
439{
440}
441
443{
444}
445
446void
448{
449 double txPowerWatts = DbmToW(-60);
450
451 Simulator::Schedule(Seconds(1),
453 this,
454 txPowerWatts,
455 false);
456
457 Simulator::Run();
458 Simulator::Destroy();
459
461 0,
462 "Reception of non-wifi packet should not be triggered");
464 1,
465 "State should have moved to CCA-BUSY then back to IDLE");
466}
467
475{
476 public:
478};
479
481 : TestSuite("wifi-phy-thresholds", UNIT)
482{
487}
488
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
virtual Ptr< SpectrumSignalParameters > MakeWifiSignal(double txPowerWatts)
Make wifi signal function.
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.
~WifiPhyThresholdsTest() override
Destructor.
uint32_t m_stateChanged
count number of PHY state change
uint32_t m_rxFailure
count number of unsuccessfully 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:369
void Dispose()
Dispose of this Object.
Definition: object.cc:219
void StartRx(Ptr< SpectrumSignalParameters > rxParams)
Input method for delivering a signal from the spectrum channel and low-level PHY interface to this Sp...
encapsulates test code
Definition: test.h:1060
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:305
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:606
void SetErrorRateModel(const Ptr< ErrorRateModel > model)
Sets the error rate model.
Definition: wifi-phy.cc:614
void SetReceiveErrorCallback(RxErrorCallback callback)
Definition: wifi-phy.cc:423
virtual void ConfigureStandard(WifiStandard standard)
Configure the PHY-level parameters for different Wi-Fi standard.
Definition: wifi-phy.cc:895
static Time CalculateTxDuration(uint32_t size, const WifiTxVector &txVector, WifiPhyBand band, uint16_t staId=SU_STA_ID)
Definition: wifi-phy.cc:1422
Ptr< WifiPhyStateHelper > GetState() const
Return the WifiPhyStateHelper of this PHY.
Definition: wifi-phy.cc:411
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:1004
WifiPhyBand GetPhyBand() const
Get the configured Wi-Fi band.
Definition: wifi-phy.cc:950
void SetReceiveOkCallback(RxOkCallback callback)
Definition: wifi-phy.cc:417
std::tuple< uint8_t, uint16_t, int, uint8_t > ChannelTuple
Tuple identifying an operating channel.
Definition: wifi-phy.h:869
uint32_t GetSize() const
Return the size of the PSDU in bytes.
Definition: wifi-psdu.cc:263
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:1338
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:691
double DbmToW(double dBm)
Convert from dBm to Watts.
Definition: wifi-utils.cc:40
@ WIFI_MAC_QOSDATA
def start()
Definition: core.py:1861
RxSignalInfo structure containing info on the received signal.
Definition: phy-entity.h:70
Time duration
The duration of the packet transmission.
Ptr< SpectrumPhy > txPhy
The SpectrumPhy instance that is making the transmission.
Ptr< SpectrumValue > psd
The Power Spectral Density of the waveform, in linear units.
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.
static const uint8_t CHANNEL_NUMBER
static WifiPhyThresholdsTestSuite wifiPhyThresholdsTestSuite
the test suite
static const uint16_t CHANNEL_WIDTH
static const uint32_t FREQUENCY