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 
34 using namespace ns3;
35 
36 NS_LOG_COMPONENT_DEFINE ("WifiPhyThresholdsTest");
37 
38 static const uint8_t CHANNEL_NUMBER = 36;
39 static const uint32_t FREQUENCY = 5180; //MHz
40 static const uint16_t CHANNEL_WIDTH = 20; //MHz
41 
49 {
50 public:
56  WifiPhyThresholdsTest (std::string test_name);
60  virtual ~WifiPhyThresholdsTest ();
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<WifiPsdu> psdu, RxSignalInfo rxSignalInfo,
89  WifiTxVector txVector, std::vector<bool> statusPerMpdu);
94  virtual void RxFailure (Ptr<WifiPsdu> psdu);
100  void RxDropped (Ptr<const Packet> p, WifiPhyRxfailureReason reason);
107  virtual void PhyStateChanged (Time start, Time duration, WifiPhyState newState);
108 
110  uint32_t m_rxSuccess;
111  uint32_t m_rxFailure;
112  uint32_t m_rxDropped;
113  uint32_t m_stateChanged;
114  uint32_t m_rxStateCount;
115  uint32_t m_idleStateCount;
117 
118 private:
119  virtual void DoSetup (void);
120  virtual void DoTeardown (void);
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 
175 void
176 WifiPhyThresholdsTest::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 
188 void
190  WifiTxVector txVector, std::vector<bool> statusPerMpdu)
191 {
192  NS_LOG_FUNCTION (this << *psdu << rxSignalInfo << txVector);
193  m_rxSuccess++;
194 }
195 
196 void
198 {
199  NS_LOG_FUNCTION (this << *psdu);
200  m_rxFailure++;
201 }
202 
203 void
205 {
206  NS_LOG_FUNCTION (this << p << reason);
207  m_rxDropped++;
208 }
209 
210 void
212 {
213  NS_LOG_FUNCTION (this << start << duration << newState);
214  m_stateChanged++;
215  if (newState == WifiPhyState::IDLE)
216  {
218  }
219  else if (newState == WifiPhyState::RX)
220  {
221  m_rxStateCount++;
222  }
223  else if (newState == WifiPhyState::CCA_BUSY)
224  {
226  }
227 }
228 
229 void
231 {
232  m_phy = CreateObject<SpectrumWifiPhy> ();
234  Ptr<ErrorRateModel> error = CreateObject<NistErrorRateModel> ();
235  m_phy->SetErrorRateModel (error);
241  m_phy->GetState ()->TraceConnectWithoutContext ("State", MakeCallback (&WifiPhyThresholdsTest::PhyStateChanged, this));
242 }
243 
244 void
246 {
247  m_phy->Dispose ();
248  m_phy = 0;
249 }
250 
261 {
262 public:
265  virtual void DoRun (void);
266 };
267 
269  : WifiPhyThresholdsTest ("WifiPhy reception thresholds: test weak wifi signal reception")
270 {
271 }
272 
274 {
275 }
276 
277 void
279 {
280  double txPowerWatts = DbmToW (-110);
281 
282  Simulator::Schedule (Seconds (1), &WifiPhyThresholdsWeakWifiSignalTest::SendSignal, this, txPowerWatts, true);
283 
284  Simulator::Run ();
285  Simulator::Destroy ();
286 
287  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");
288  NS_TEST_ASSERT_MSG_EQ (m_stateChanged, 0, "State should stay idle if reception involves a signal weaker than RxSensitivity threshold");
289 }
290 
301 {
302 public:
305  virtual void DoRun (void);
306 };
307 
309  : WifiPhyThresholdsTest ("WifiPhy reception thresholds: test weak foreign signal reception")
310 {
311 }
312 
314 {
315 }
316 
317 void
319 {
320  double txPowerWatts = DbmToW (-90);
321 
322  Simulator::Schedule (Seconds (1), &WifiPhyThresholdsWeakForeignSignalTest::SendSignal, this, txPowerWatts, false);
323 
324  Simulator::Run ();
325  Simulator::Destroy ();
326 
327  NS_TEST_ASSERT_MSG_EQ (m_rxDropped + m_rxSuccess + m_rxFailure, 0, "Reception of non-wifi packet should not be triggered");
328  NS_TEST_ASSERT_MSG_EQ (m_stateChanged, 0, "State should stay idle if reception involves a signal weaker than RxSensitivity threshold");
329 }
330 
341 {
342 public:
345  virtual void DoRun (void);
346 };
347 
349  : WifiPhyThresholdsTest ("WifiPhy reception thresholds: test strong wifi signal reception")
350 {
351 }
352 
354 {
355 }
356 
357 void
359 {
360  double txPowerWatts = DbmToW (-60);
361 
362  Simulator::Schedule (Seconds (1), &WifiPhyThresholdsStrongWifiSignalTest::SendSignal, this, txPowerWatts, true);
363 
364  Simulator::Run ();
365  Simulator::Destroy ();
366 
367  NS_TEST_ASSERT_MSG_EQ (m_rxDropped + m_rxFailure, 0, "Packet reception should have been successfull");
368  NS_TEST_ASSERT_MSG_EQ (m_rxSuccess, 1, "Packet should have been successfully received");
369  NS_TEST_ASSERT_MSG_EQ (m_ccabusyStateCount, 2, "State should have moved to CCA_BUSY once");
370  NS_TEST_ASSERT_MSG_EQ (m_stateChanged, 4, "State should have moved to CCA_BUSY, then to RX and finally back to IDLE");
371  NS_TEST_ASSERT_MSG_EQ (m_rxStateCount, 1, "State should have moved to RX once");
372  NS_TEST_ASSERT_MSG_EQ (m_idleStateCount, 1, "State should have moved to IDLE once");
373 }
374 
385 {
386 public:
389  virtual void DoRun (void);
390 };
391 
393  : WifiPhyThresholdsTest ("WifiPhy reception thresholds: test weak foreign signal reception")
394 {
395 }
396 
398 {
399 }
400 
401 void
403 {
404  double txPowerWatts = DbmToW (-60);
405 
406  Simulator::Schedule (Seconds (1), &WifiPhyThresholdsStrongForeignSignalTest::SendSignal, this, txPowerWatts, false);
407 
408  Simulator::Run ();
409  Simulator::Destroy ();
410 
411  NS_TEST_ASSERT_MSG_EQ (m_rxDropped + m_rxSuccess + m_rxFailure, 0, "Reception of non-wifi packet should not be triggered");
412  NS_TEST_ASSERT_MSG_EQ (m_idleStateCount, 1, "State should have moved to CCA-BUSY then back to IDLE");
413 }
414 
422 {
423 public:
425 };
426 
428  : TestSuite ("wifi-phy-thresholds", UNIT)
429 {
430  AddTestCase (new WifiPhyThresholdsWeakWifiSignalTest, TestCase::QUICK);
432  AddTestCase (new WifiPhyThresholdsStrongWifiSignalTest, TestCase::QUICK);
434 }
435 
void Dispose(void)
Dispose of this Object.
Definition: object.cc:214
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:103
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:73
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
static const uint32_t FREQUENCY
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
Ptr< WifiPpdu > ppdu
The PPDU being transmitted.
virtual void RxSuccess(Ptr< WifiPsdu > psdu, RxSignalInfo rxSignalInfo, WifiTxVector txVector, std::vector< bool > statusPerMpdu)
PHY receive success callback function.
Ptr< WifiPhyStateHelper > GetState(void) const
Return the WifiPhyStateHelper of this PHY.
Definition: wifi-phy.cc:629
uint32_t m_ccabusyStateCount
count number of PHY state change to CCA_BUSY state
void StartRx(Ptr< SpectrumSignalParameters > rxParams)
Input method for delivering a signal from the spectrum channel and low-level PHY interface to this Sp...
uint32_t m_rxDropped
count number of dropped packets
WifiPhyBand GetPhyBand(void) const
Get the configured Wi-Fi band.
Definition: wifi-phy.cc:1124
uint32_t m_rxSuccess
count number of successfully received packets
double DbmToW(double dBm)
Convert from dBm to Watts.
Definition: wifi-utils.cc:41
A suite of tests to run.
Definition: test.h:1343
def start()
Definition: core.py:1855
void SetReceiveErrorCallback(RxErrorCallback callback)
Definition: wifi-phy.cc:641
WifiPhyRxfailureReason
Enumeration of the possible reception failure reasons.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
uint32_t m_rxStateCount
count number of PHY state change to RX state
static const uint8_t CHANNEL_NUMBER
Wifi Phy Threshold Strong Foreign Signal Test.
Wifi Phy Threshold Weak Wifi Signal Test.
virtual void DoRun(void)
Implementation to actually run this TestCase.
The 5 GHz band.
Definition: wifi-phy-band.h:37
encapsulates test code
Definition: test.h:1153
virtual void PhyStateChanged(Time start, Time duration, WifiPhyState newState)
PHY state changed callback function.
virtual Ptr< SpectrumSignalParameters > MakeWifiSignal(double txPowerWatts)
Make wifi signal function.
Wifi Phy Threshold Strong Wifi Signal Test.
Wifi Phy Threshold Weak Foreign Signal Test.
uint32_t GetSize(void) const
Return the size of the PSDU in bytes.
Definition: wifi-psdu.cc:260
void RxDropped(Ptr< const Packet > p, WifiPhyRxfailureReason reason)
PHY dropped packet callback function.
static Time CalculateTxDuration(uint32_t size, const WifiTxVector &txVector, WifiPhyBand band, uint16_t staId=SU_STA_ID)
Definition: wifi-phy.cc:1616
RxSignalInfo structure containing info on the received signal.
Definition: phy-entity.h:66
uint32_t m_stateChanged
count number of PHY state change
static WifiPhyThresholdsTestSuite wifiPhyThresholdsTestSuite
the test suite
virtual void DoRun(void)
Implementation to actually run this TestCase.
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:299
#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:166
virtual void DoSetup(void)
Implementation to do any local setup required for this TestCase.
The PHY layer has sense the medium busy through the CCA mechanism.
Ptr< SpectrumPhy > txPhy
The SpectrumPhy instance that is making the transmission.
void SetErrorRateModel(const Ptr< ErrorRateModel > rate)
Sets the error rate model.
Definition: wifi-phy.cc:808
virtual void SendSignal(double txPowerWatts, bool wifiSignal)
Send signal function.
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:293
Every class exported by the ns3 library is enclosed in the ns3 namespace.
static const uint16_t CHANNEL_WIDTH
The PHY layer is IDLE.
WifiPhyState
The state of the PHY layer.
void SetType(WifiMacType type, bool resetToDsFromDs=true)
Set Type/Subtype values with the correct values depending on the given type.
uint32_t m_rxFailure
count number of unsuccessfully received packets
void SetReceiveOkCallback(RxOkCallback callback)
Definition: wifi-phy.cc:635
virtual void SetFrequency(uint16_t freq) override
If the operating channel for this object has not been set yet, the given center frequency is saved an...
Ptr< SpectrumValue > psd
The Power Spectral Density of the waveform, in linear units.
Ptr< SpectrumWifiPhy > m_phy
PHY object.
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1289
The PHY layer is receiving a packet.
virtual void SetChannelNumber(uint8_t id) override
Set channel number.
virtual void DoTeardown(void)
Implementation to do any local setup required for this TestCase.
virtual void DoRun(void)
Implementation to actually run this TestCase.
uint32_t m_idleStateCount
count number of PHY state change to IDLE state
virtual Ptr< SpectrumSignalParameters > MakeForeignSignal(double txPowerWatts)
Make foreign signal function.
virtual void RxFailure(Ptr< WifiPsdu > psdu)
PHY receive failure callback function.
Time duration
The duration of the packet transmission.
virtual ~WifiPhyThresholdsTest()
Destructor.
WifiPhyThresholdsTest(std::string test_name)
Constructor.
virtual void ConfigureStandardAndBand(WifiPhyStandard standard, WifiPhyBand band) override
Configure the PHY-level parameters for different Wi-Fi standard.
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:1642
Implements the IEEE 802.11 MAC header.
Wifi Phy Threshold Test base class.
Wifi Phy Thresholds Test Suite.