A Discrete-Event Network Simulator
API
wifi-phy-thresholds-test.cc
Go to the documentation of this file.
1/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2018
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation;
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 *
18 * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
19 */
20
21#include "ns3/log.h"
22#include "ns3/test.h"
23#include "ns3/spectrum-wifi-helper.h"
24#include "ns3/wifi-spectrum-value-helper.h"
25#include "ns3/spectrum-wifi-phy.h"
26#include "ns3/nist-error-rate-model.h"
27#include "ns3/wifi-mac-header.h"
28#include "ns3/wifi-spectrum-signal-parameters.h"
29#include "ns3/wifi-utils.h"
30#include "ns3/wifi-psdu.h"
31#include "ns3/ofdm-ppdu.h"
32#include "ns3/ofdm-phy.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{
50public:
56 WifiPhyThresholdsTest (std::string test_name);
60 virtual ~WifiPhyThresholdsTest ();
61
62protected:
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<WifiPsdu> psdu, RxSignalInfo rxSignalInfo,
89 WifiTxVector txVector, std::vector<bool> statusPerMpdu);
94 virtual void RxFailure (Ptr<WifiPsdu> psdu);
107 virtual void PhyStateChanged (Time start, Time duration, WifiPhyState newState);
108
117
118private:
119 void DoSetup (void) override;
120 void DoTeardown (void) override;
121};
122
124 : TestCase (test_name),
125 m_rxSuccess (0),
126 m_rxFailure (0),
127 m_rxDropped (0),
128 m_stateChanged (0),
129 m_rxStateCount (0),
130 m_idleStateCount (0),
131 m_ccabusyStateCount (0)
132{
133}
134
136{
137}
138
141{
142 WifiTxVector txVector = WifiTxVector (OfdmPhy::GetOfdmRate6Mbps (), 0, WIFI_PREAMBLE_LONG, 800, 1, 1, 0, 20, false);
143
144 Ptr<Packet> pkt = Create<Packet> (1000);
145 WifiMacHeader hdr;
146
148 hdr.SetQosTid (0);
149
150 Ptr<WifiPsdu> psdu = Create<WifiPsdu> (pkt, hdr);
151 Time txDuration = m_phy->CalculateTxDuration (psdu->GetSize (), txVector, m_phy->GetPhyBand ());
152
153 Ptr<WifiPpdu> ppdu = Create<OfdmPpdu> (psdu, txVector, WIFI_PHY_BAND_5GHZ, 0);
154
155 Ptr<SpectrumValue> txPowerSpectrum = WifiSpectrumValueHelper::CreateHeOfdmTxPowerSpectralDensity (FREQUENCY, CHANNEL_WIDTH, txPowerWatts, CHANNEL_WIDTH);
156 Ptr<WifiSpectrumSignalParameters> txParams = Create<WifiSpectrumSignalParameters> ();
157 txParams->psd = txPowerSpectrum;
158 txParams->txPhy = 0;
159 txParams->duration = txDuration;
160 txParams->ppdu = ppdu;
161 return txParams;
162}
163
166{
167 Ptr<SpectrumValue> txPowerSpectrum = WifiSpectrumValueHelper::CreateHeOfdmTxPowerSpectralDensity (FREQUENCY, CHANNEL_WIDTH, txPowerWatts, CHANNEL_WIDTH);
168 Ptr<SpectrumSignalParameters> txParams = Create<SpectrumSignalParameters> ();
169 txParams->psd = txPowerSpectrum;
170 txParams->txPhy = 0;
171 txParams->duration = Seconds (0.5);
172 return txParams;
173}
174
175void
176WifiPhyThresholdsTest::SendSignal (double txPowerWatts, bool wifiSignal)
177{
178 if (wifiSignal)
179 {
180 m_phy->StartRx (MakeWifiSignal (txPowerWatts));
181 }
182 else
183 {
184 m_phy->StartRx (MakeForeignSignal (txPowerWatts));
185 }
186}
187
188void
190 WifiTxVector txVector, std::vector<bool> statusPerMpdu)
191{
192 NS_LOG_FUNCTION (this << *psdu << rxSignalInfo << txVector);
193 m_rxSuccess++;
194}
195
196void
198{
199 NS_LOG_FUNCTION (this << *psdu);
200 m_rxFailure++;
201}
202
203void
205{
206 NS_LOG_FUNCTION (this << p << reason);
207 m_rxDropped++;
208}
209
210void
212{
213 NS_LOG_FUNCTION (this << start << duration << newState);
215 if (newState == WifiPhyState::IDLE)
216 {
218 }
219 else if (newState == WifiPhyState::RX)
220 {
222 }
223 else if (newState == WifiPhyState::CCA_BUSY)
224 {
226 }
227}
228
229void
231{
232 m_phy = CreateObject<SpectrumWifiPhy> ();
234 Ptr<ErrorRateModel> error = CreateObject<NistErrorRateModel> ();
235 m_phy->SetErrorRateModel (error);
240 m_phy->GetState ()->TraceConnectWithoutContext ("State", MakeCallback (&WifiPhyThresholdsTest::PhyStateChanged, this));
241}
242
243void
245{
246 m_phy->Dispose ();
247 m_phy = 0;
248}
249
260{
261public:
264 virtual void DoRun (void);
265};
266
268 : WifiPhyThresholdsTest ("WifiPhy reception thresholds: test weak wifi signal reception")
269{
270}
271
273{
274}
275
276void
278{
279 double txPowerWatts = DbmToW (-110);
280
281 Simulator::Schedule (Seconds (1), &WifiPhyThresholdsWeakWifiSignalTest::SendSignal, this, txPowerWatts, true);
282
283 Simulator::Run ();
284 Simulator::Destroy ();
285
286 NS_TEST_ASSERT_MSG_EQ (m_rxDropped + m_rxSuccess + m_rxFailure, 0, "Reception should not have been triggered if packet is weaker than RxSensitivity threshold");
287 NS_TEST_ASSERT_MSG_EQ (m_stateChanged, 0, "State should stay idle if reception involves a signal weaker than RxSensitivity threshold");
288}
289
300{
301public:
304 virtual void DoRun (void);
305};
306
308 : WifiPhyThresholdsTest ("WifiPhy reception thresholds: test weak foreign signal reception")
309{
310}
311
313{
314}
315
316void
318{
319 double txPowerWatts = DbmToW (-90);
320
321 Simulator::Schedule (Seconds (1), &WifiPhyThresholdsWeakForeignSignalTest::SendSignal, this, txPowerWatts, false);
322
323 Simulator::Run ();
324 Simulator::Destroy ();
325
326 NS_TEST_ASSERT_MSG_EQ (m_rxDropped + m_rxSuccess + m_rxFailure, 0, "Reception of non-wifi packet should not be triggered");
327 NS_TEST_ASSERT_MSG_EQ (m_stateChanged, 0, "State should stay idle if reception involves a signal weaker than RxSensitivity threshold");
328}
329
340{
341public:
344 virtual void DoRun (void);
345};
346
348 : WifiPhyThresholdsTest ("WifiPhy reception thresholds: test strong wifi signal reception")
349{
350}
351
353{
354}
355
356void
358{
359 double txPowerWatts = DbmToW (-60);
360
361 Simulator::Schedule (Seconds (1), &WifiPhyThresholdsStrongWifiSignalTest::SendSignal, this, txPowerWatts, true);
362
363 Simulator::Run ();
364 Simulator::Destroy ();
365
366 NS_TEST_ASSERT_MSG_EQ (m_rxDropped + m_rxFailure, 0, "Packet reception should have been successfull");
367 NS_TEST_ASSERT_MSG_EQ (m_rxSuccess, 1, "Packet should have been successfully received");
368 NS_TEST_ASSERT_MSG_EQ (m_ccabusyStateCount, 2, "State should have moved to CCA_BUSY once");
369 NS_TEST_ASSERT_MSG_EQ (m_stateChanged, 4, "State should have moved to CCA_BUSY, then to RX and finally back to IDLE");
370 NS_TEST_ASSERT_MSG_EQ (m_rxStateCount, 1, "State should have moved to RX once");
371 NS_TEST_ASSERT_MSG_EQ (m_idleStateCount, 1, "State should have moved to IDLE once");
372}
373
384{
385public:
388 virtual void DoRun (void);
389};
390
392 : WifiPhyThresholdsTest ("WifiPhy reception thresholds: test weak foreign signal reception")
393{
394}
395
397{
398}
399
400void
402{
403 double txPowerWatts = DbmToW (-60);
404
405 Simulator::Schedule (Seconds (1), &WifiPhyThresholdsStrongForeignSignalTest::SendSignal, this, txPowerWatts, false);
406
407 Simulator::Run ();
408 Simulator::Destroy ();
409
410 NS_TEST_ASSERT_MSG_EQ (m_rxDropped + m_rxSuccess + m_rxFailure, 0, "Reception of non-wifi packet should not be triggered");
411 NS_TEST_ASSERT_MSG_EQ (m_idleStateCount, 1, "State should have moved to CCA-BUSY then back to IDLE");
412}
413
421{
422public:
424};
425
427 : TestSuite ("wifi-phy-thresholds", UNIT)
428{
433}
434
Wifi Phy Threshold Strong Foreign Signal Test.
virtual void DoRun(void)
Implementation to actually run this TestCase.
Wifi Phy Threshold Strong Wifi Signal Test.
virtual void DoRun(void)
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
virtual ~WifiPhyThresholdsTest()
Destructor.
virtual void RxSuccess(Ptr< WifiPsdu > psdu, RxSignalInfo rxSignalInfo, WifiTxVector txVector, std::vector< bool > statusPerMpdu)
PHY receive success callback function.
virtual void PhyStateChanged(Time start, Time duration, WifiPhyState newState)
PHY state changed callback function.
uint32_t m_stateChanged
count number of PHY state change
uint32_t m_rxFailure
count number of unsuccessfully received packets
virtual Ptr< SpectrumSignalParameters > MakeForeignSignal(double txPowerWatts)
Make foreign signal function.
void DoSetup(void) override
Implementation to do any local setup required for this TestCase.
void RxDropped(Ptr< const Packet > p, WifiPhyRxfailureReason reason)
PHY dropped packet callback function.
Ptr< SpectrumWifiPhy > m_phy
PHY object.
void DoTeardown(void) override
Implementation to do any local setup required for this TestCase.
virtual void RxFailure(Ptr< WifiPsdu > psdu)
PHY receive failure 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.
virtual void DoRun(void)
Implementation to actually run this TestCase.
Wifi Phy Threshold Weak Wifi Signal Test.
virtual void DoRun(void)
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:364
void Dispose(void)
Dispose of this Object.
Definition: object.cc:214
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:74
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:994
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:299
A suite of tests to run.
Definition: test.h:1188
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:103
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.
WifiPhyBand GetPhyBand(void) const
Get the configured Wi-Fi band.
Definition: wifi-phy.cc:870
Ptr< WifiPhyStateHelper > GetState(void) const
Return the WifiPhyStateHelper of this PHY.
Definition: wifi-phy.cc:378
void SetReceiveErrorCallback(RxErrorCallback callback)
Definition: wifi-phy.cc:390
virtual void ConfigureStandard(WifiStandard standard)
Configure the PHY-level parameters for different Wi-Fi standard.
Definition: wifi-phy.cc:818
static Time CalculateTxDuration(uint32_t size, const WifiTxVector &txVector, WifiPhyBand band, uint16_t staId=SU_STA_ID)
Definition: wifi-phy.cc:1306
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:913
void SetReceiveOkCallback(RxOkCallback callback)
Definition: wifi-phy.cc:384
std::tuple< uint8_t, uint16_t, int, uint8_t > ChannelTuple
Tuple identifying an operating channel.
Definition: wifi-phy.h:832
void SetErrorRateModel(const Ptr< ErrorRateModel > rate)
Sets the error rate model.
Definition: wifi-phy.cc:557
uint32_t GetSize(void) const
Return the size of the PSDU in bytes.
Definition: wifi-psdu.cc:260
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:205
#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:141
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1244
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.
double DbmToW(double dBm)
Convert from dBm to Watts.
Definition: wifi-utils.cc:37
@ WIFI_MAC_QOSDATA
Callback< R, Ts... > MakeCallback(R(T::*memPtr)(Ts...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
Definition: callback.h:1648
def start()
Definition: core.py:1853
RxSignalInfo structure containing info on the received signal.
Definition: phy-entity.h:67
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