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  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 
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:1610
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
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
void DoTeardown(void) override
Implementation to do any local setup required for this TestCase.
void DoSetup(void) override
Implementation to do any local setup required for this TestCase.
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
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.
void SetChannelNumber(uint8_t id) override
Set channel number.
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.
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.