A Discrete-Event Network Simulator
API
wifi-spectrum-per-example.cc
Go to the documentation of this file.
1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2009 MIRKO BANCHI
4  * Copyright (c) 2015 University of Washington
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation;
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18  *
19  * Authors: Mirko Banchi <mk.banchi@gmail.com>
20  * Sebastien Deronne <sebastien.deronne@gmail.com>
21  * Tom Henderson <tomhend@u.washington.edu>
22  *
23  * Adapted from wifi-ht-network.cc example
24  */
25 
26 #include <iomanip>
27 #include "ns3/command-line.h"
28 #include "ns3/config.h"
29 #include "ns3/uinteger.h"
30 #include "ns3/boolean.h"
31 #include "ns3/double.h"
32 #include "ns3/string.h"
33 #include "ns3/log.h"
34 #include "ns3/yans-wifi-helper.h"
35 #include "ns3/spectrum-wifi-helper.h"
36 #include "ns3/ssid.h"
37 #include "ns3/mobility-helper.h"
38 #include "ns3/internet-stack-helper.h"
39 #include "ns3/ipv4-address-helper.h"
40 #include "ns3/udp-client-server-helper.h"
41 #include "ns3/packet-sink-helper.h"
42 #include "ns3/on-off-helper.h"
43 #include "ns3/ipv4-global-routing-helper.h"
44 #include "ns3/packet-sink.h"
45 #include "ns3/yans-wifi-channel.h"
46 #include "ns3/multi-model-spectrum-channel.h"
47 #include "ns3/propagation-loss-model.h"
48 
49 // This is a simple example of an IEEE 802.11n Wi-Fi network.
50 //
51 // The main use case is to enable and test SpectrumWifiPhy vs YansWifiPhy
52 // for packet error ratio
53 //
54 // Network topology:
55 //
56 // Wi-Fi 192.168.1.0
57 //
58 // STA AP
59 // * <-- distance --> *
60 // | |
61 // n1 n2
62 //
63 // Users may vary the following command-line arguments in addition to the
64 // attributes, global values, and default values typically available:
65 //
66 // --simulationTime: Simulation time in seconds [10]
67 // --udp: UDP if set to 1, TCP otherwise [true]
68 // --distance: meters separation between nodes [50]
69 // --index: restrict index to single value between 0 and 31 [256]
70 // --wifiType: select ns3::SpectrumWifiPhy or ns3::YansWifiPhy [ns3::SpectrumWifiPhy]
71 // --errorModelType: select ns3::NistErrorRateModel or ns3::YansErrorRateModel [ns3::NistErrorRateModel]
72 // --enablePcap: enable pcap output [false]
73 //
74 // By default, the program will step through 32 index values, corresponding
75 // to the following MCS, channel width, and guard interval combinations:
76 // index 0-7: MCS 0-7, long guard interval, 20 MHz channel
77 // index 8-15: MCS 0-7, short guard interval, 20 MHz channel
78 // index 16-23: MCS 0-7, long guard interval, 40 MHz channel
79 // index 24-31: MCS 0-7, short guard interval, 40 MHz channel
80 // and send UDP for 10 seconds using each MCS, using the SpectrumWifiPhy and the
81 // NistErrorRateModel, at a distance of 50 meters. The program outputs
82 // results such as:
83 //
84 // wifiType: ns3::SpectrumWifiPhy distance: 50m; time: 10; TxPower: 1 dBm (1.3 mW)
85 // index MCS Rate (Mb/s) Tput (Mb/s) Received Signal (dBm) Noise (dBm) SNR (dB)
86 // 0 0 6.50 5.77 7414 -79.71 -93.97 14.25
87 // 1 1 13.00 11.58 14892 -79.71 -93.97 14.25
88 // 2 2 19.50 17.39 22358 -79.71 -93.97 14.25
89 // 3 3 26.00 22.96 29521 -79.71 -93.97 14.25
90 // ...
91 //
92 
93 using namespace ns3;
94 
95 // Global variables for use in callbacks.
98 uint32_t g_samples;
99 
101  uint16_t channelFreqMhz,
102  WifiTxVector txVector,
103  MpduInfo aMpdu,
104  SignalNoiseDbm signalNoise,
105  uint16_t staId)
106 
107 {
108  g_samples++;
109  g_signalDbmAvg += ((signalNoise.signal - g_signalDbmAvg) / g_samples);
110  g_noiseDbmAvg += ((signalNoise.noise - g_noiseDbmAvg) / g_samples);
111 }
112 
113 NS_LOG_COMPONENT_DEFINE ("WifiSpectrumPerExample");
114 
115 int main (int argc, char *argv[])
116 {
117  bool udp = true;
118  double distance = 50;
119  double simulationTime = 10; //seconds
120  uint16_t index = 256;
121  std::string wifiType = "ns3::SpectrumWifiPhy";
122  std::string errorModelType = "ns3::NistErrorRateModel";
123  bool enablePcap = false;
124  const uint32_t tcpPacketSize = 1448;
125 
126  CommandLine cmd (__FILE__);
127  cmd.AddValue ("simulationTime", "Simulation time in seconds", simulationTime);
128  cmd.AddValue ("udp", "UDP if set to 1, TCP otherwise", udp);
129  cmd.AddValue ("distance", "meters separation between nodes", distance);
130  cmd.AddValue ("index", "restrict index to single value between 0 and 31", index);
131  cmd.AddValue ("wifiType", "select ns3::SpectrumWifiPhy or ns3::YansWifiPhy", wifiType);
132  cmd.AddValue ("errorModelType", "select ns3::NistErrorRateModel or ns3::YansErrorRateModel", errorModelType);
133  cmd.AddValue ("enablePcap", "enable pcap output", enablePcap);
134  cmd.Parse (argc,argv);
135 
136  uint16_t startIndex = 0;
137  uint16_t stopIndex = 31;
138  if (index < 32)
139  {
140  startIndex = index;
141  stopIndex = index;
142  }
143 
144  std::cout << "wifiType: " << wifiType << " distance: " << distance << "m; time: " << simulationTime << "; TxPower: 1 dBm (1.3 mW)" << std::endl;
145  std::cout << std::setw (5) << "index" <<
146  std::setw (6) << "MCS" <<
147  std::setw (13) << "Rate (Mb/s)" <<
148  std::setw (12) << "Tput (Mb/s)" <<
149  std::setw (10) << "Received " <<
150  std::setw (12) << "Signal (dBm)" <<
151  std::setw (12) << "Noise (dBm)" <<
152  std::setw (9) << "SNR (dB)" <<
153  std::endl;
154  for (uint16_t i = startIndex; i <= stopIndex; i++)
155  {
156  uint32_t payloadSize;
157  if (udp)
158  {
159  payloadSize = 972; // 1000 bytes IPv4
160  }
161  else
162  {
163  payloadSize = 1448; // 1500 bytes IPv6
164  Config::SetDefault ("ns3::TcpSocket::SegmentSize", UintegerValue (payloadSize));
165  }
166 
167  NodeContainer wifiStaNode;
168  wifiStaNode.Create (1);
170  wifiApNode.Create (1);
171 
173  SpectrumWifiPhyHelper spectrumPhy;
174  if (wifiType == "ns3::YansWifiPhy")
175  {
177  channel.AddPropagationLoss ("ns3::FriisPropagationLossModel",
178  "Frequency", DoubleValue (5.180e9));
179  channel.SetPropagationDelay ("ns3::ConstantSpeedPropagationDelayModel");
180  phy.SetChannel (channel.Create ());
181  phy.Set ("TxPowerStart", DoubleValue (1)); // dBm (1.26 mW)
182  phy.Set ("TxPowerEnd", DoubleValue (1));
183  phy.Set ("Frequency", UintegerValue (5180));
184  }
185  else if (wifiType == "ns3::SpectrumWifiPhy")
186  {
187  Ptr<MultiModelSpectrumChannel> spectrumChannel
188  = CreateObject<MultiModelSpectrumChannel> ();
190  = CreateObject<FriisPropagationLossModel> ();
191  lossModel->SetFrequency (5.180e9);
192  spectrumChannel->AddPropagationLossModel (lossModel);
193 
195  = CreateObject<ConstantSpeedPropagationDelayModel> ();
196  spectrumChannel->SetPropagationDelayModel (delayModel);
197 
198  spectrumPhy.SetChannel (spectrumChannel);
199  spectrumPhy.SetErrorRateModel (errorModelType);
200  spectrumPhy.Set ("Frequency", UintegerValue (5180));
201  spectrumPhy.Set ("TxPowerStart", DoubleValue (1)); // dBm (1.26 mW)
202  spectrumPhy.Set ("TxPowerEnd", DoubleValue (1));
203  }
204  else
205  {
206  NS_FATAL_ERROR ("Unsupported WiFi type " << wifiType);
207  }
208 
209 
211  wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
213 
214  Ssid ssid = Ssid ("ns380211n");
215 
216  double datarate = 0;
218  if (i == 0)
219  {
220  DataRate = StringValue ("HtMcs0");
221  datarate = 6.5;
222  }
223  else if (i == 1)
224  {
225  DataRate = StringValue ("HtMcs1");
226  datarate = 13;
227  }
228  else if (i == 2)
229  {
230  DataRate = StringValue ("HtMcs2");
231  datarate = 19.5;
232  }
233  else if (i == 3)
234  {
235  DataRate = StringValue ("HtMcs3");
236  datarate = 26;
237  }
238  else if (i == 4)
239  {
240  DataRate = StringValue ("HtMcs4");
241  datarate = 39;
242  }
243  else if (i == 5)
244  {
245  DataRate = StringValue ("HtMcs5");
246  datarate = 52;
247  }
248  else if (i == 6)
249  {
250  DataRate = StringValue ("HtMcs6");
251  datarate = 58.5;
252  }
253  else if (i == 7)
254  {
255  DataRate = StringValue ("HtMcs7");
256  datarate = 65;
257  }
258  else if (i == 8)
259  {
260  DataRate = StringValue ("HtMcs0");
261  datarate = 7.2;
262  }
263  else if (i == 9)
264  {
265  DataRate = StringValue ("HtMcs1");
266  datarate = 14.4;
267  }
268  else if (i == 10)
269  {
270  DataRate = StringValue ("HtMcs2");
271  datarate = 21.7;
272  }
273  else if (i == 11)
274  {
275  DataRate = StringValue ("HtMcs3");
276  datarate = 28.9;
277  }
278  else if (i == 12)
279  {
280  DataRate = StringValue ("HtMcs4");
281  datarate = 43.3;
282  }
283  else if (i == 13)
284  {
285  DataRate = StringValue ("HtMcs5");
286  datarate = 57.8;
287  }
288  else if (i == 14)
289  {
290  DataRate = StringValue ("HtMcs6");
291  datarate = 65;
292  }
293  else if (i == 15)
294  {
295  DataRate = StringValue ("HtMcs7");
296  datarate = 72.2;
297  }
298  else if (i == 16)
299  {
300  DataRate = StringValue ("HtMcs0");
301  datarate = 13.5;
302  }
303  else if (i == 17)
304  {
305  DataRate = StringValue ("HtMcs1");
306  datarate = 27;
307  }
308  else if (i == 18)
309  {
310  DataRate = StringValue ("HtMcs2");
311  datarate = 40.5;
312  }
313  else if (i == 19)
314  {
315  DataRate = StringValue ("HtMcs3");
316  datarate = 54;
317  }
318  else if (i == 20)
319  {
320  DataRate = StringValue ("HtMcs4");
321  datarate = 81;
322  }
323  else if (i == 21)
324  {
325  DataRate = StringValue ("HtMcs5");
326  datarate = 108;
327  }
328  else if (i == 22)
329  {
330  DataRate = StringValue ("HtMcs6");
331  datarate = 121.5;
332  }
333  else if (i == 23)
334  {
335  DataRate = StringValue ("HtMcs7");
336  datarate = 135;
337  }
338  else if (i == 24)
339  {
340  DataRate = StringValue ("HtMcs0");
341  datarate = 15;
342  }
343  else if (i == 25)
344  {
345  DataRate = StringValue ("HtMcs1");
346  datarate = 30;
347  }
348  else if (i == 26)
349  {
350  DataRate = StringValue ("HtMcs2");
351  datarate = 45;
352  }
353  else if (i == 27)
354  {
355  DataRate = StringValue ("HtMcs3");
356  datarate = 60;
357  }
358  else if (i == 28)
359  {
360  DataRate = StringValue ("HtMcs4");
361  datarate = 90;
362  }
363  else if (i == 29)
364  {
365  DataRate = StringValue ("HtMcs5");
366  datarate = 120;
367  }
368  else if (i == 30)
369  {
370  DataRate = StringValue ("HtMcs6");
371  datarate = 135;
372  }
373  else
374  {
375  DataRate = StringValue ("HtMcs7");
376  datarate = 150;
377  }
378 
379  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager","DataMode", DataRate,
380  "ControlMode", DataRate);
381 
382  NetDeviceContainer staDevice;
383  NetDeviceContainer apDevice;
384 
385  if (wifiType == "ns3::YansWifiPhy")
386  {
387  mac.SetType ("ns3::StaWifiMac",
388  "Ssid", SsidValue (ssid));
389  staDevice = wifi.Install (phy, mac, wifiStaNode);
390  mac.SetType ("ns3::ApWifiMac",
391  "Ssid", SsidValue (ssid));
392  apDevice = wifi.Install (phy, mac, wifiApNode);
393 
394  }
395  else if (wifiType == "ns3::SpectrumWifiPhy")
396  {
397  mac.SetType ("ns3::StaWifiMac",
398  "Ssid", SsidValue (ssid));
399  staDevice = wifi.Install (spectrumPhy, mac, wifiStaNode);
400  mac.SetType ("ns3::ApWifiMac",
401  "Ssid", SsidValue (ssid));
402  apDevice = wifi.Install (spectrumPhy, mac, wifiApNode);
403  }
404 
405  if (i <= 7)
406  {
407  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/ChannelWidth", UintegerValue (20));
408  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/ShortGuardIntervalSupported", BooleanValue (false));
409  }
410  else if (i > 7 && i <= 15)
411  {
412  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/ChannelWidth", UintegerValue (20));
413  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/ShortGuardIntervalSupported", BooleanValue (true));
414  }
415  else if (i > 15 && i <= 23)
416  {
417  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/ChannelWidth", UintegerValue (40));
418  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/ShortGuardIntervalSupported", BooleanValue (false));
419  }
420  else
421  {
422  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/ChannelWidth", UintegerValue (40));
423  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/ShortGuardIntervalSupported", BooleanValue (true));
424  }
425 
426  // mobility.
428  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
429 
430  positionAlloc->Add (Vector (0.0, 0.0, 0.0));
431  positionAlloc->Add (Vector (distance, 0.0, 0.0));
432  mobility.SetPositionAllocator (positionAlloc);
433 
434  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
435 
436  mobility.Install (wifiApNode);
437  mobility.Install (wifiStaNode);
438 
439  /* Internet stack*/
441  stack.Install (wifiApNode);
442  stack.Install (wifiStaNode);
443 
445  address.SetBase ("192.168.1.0", "255.255.255.0");
446  Ipv4InterfaceContainer staNodeInterface;
447  Ipv4InterfaceContainer apNodeInterface;
448 
449  staNodeInterface = address.Assign (staDevice);
450  apNodeInterface = address.Assign (apDevice);
451 
452  /* Setting applications */
453  ApplicationContainer serverApp;
454  if (udp)
455  {
456  //UDP flow
457  uint16_t port = 9;
458  UdpServerHelper server (port);
459  serverApp = server.Install (wifiStaNode.Get (0));
460  serverApp.Start (Seconds (0.0));
461  serverApp.Stop (Seconds (simulationTime + 1));
462 
463  UdpClientHelper client (staNodeInterface.GetAddress (0), port);
464  client.SetAttribute ("MaxPackets", UintegerValue (4294967295u));
465  client.SetAttribute ("Interval", TimeValue (Time ("0.0001"))); //packets/s
466  client.SetAttribute ("PacketSize", UintegerValue (payloadSize));
467  ApplicationContainer clientApp = client.Install (wifiApNode.Get (0));
468  clientApp.Start (Seconds (1.0));
469  clientApp.Stop (Seconds (simulationTime + 1));
470  }
471  else
472  {
473  //TCP flow
474  uint16_t port = 50000;
475  Address localAddress (InetSocketAddress (Ipv4Address::GetAny (), port));
476  PacketSinkHelper packetSinkHelper ("ns3::TcpSocketFactory", localAddress);
477  serverApp = packetSinkHelper.Install (wifiStaNode.Get (0));
478  serverApp.Start (Seconds (0.0));
479  serverApp.Stop (Seconds (simulationTime + 1));
480 
481  OnOffHelper onoff ("ns3::TcpSocketFactory", Ipv4Address::GetAny ());
482  onoff.SetAttribute ("OnTime", StringValue ("ns3::ConstantRandomVariable[Constant=1]"));
483  onoff.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0]"));
484  onoff.SetAttribute ("PacketSize", UintegerValue (payloadSize));
485  onoff.SetAttribute ("DataRate", DataRateValue (1000000000)); //bit/s
486  AddressValue remoteAddress (InetSocketAddress (staNodeInterface.GetAddress (0), port));
487  onoff.SetAttribute ("Remote", remoteAddress);
488  ApplicationContainer clientApp = onoff.Install (wifiApNode.Get (0));
489  clientApp.Start (Seconds (1.0));
490  clientApp.Stop (Seconds (simulationTime + 1));
491  }
492 
493  Config::ConnectWithoutContext ("/NodeList/0/DeviceList/*/Phy/MonitorSnifferRx", MakeCallback (&MonitorSniffRx));
494 
495  if (enablePcap)
496  {
497  std::stringstream ss;
498  ss << "wifi-spectrum-per-example-" << i;
499  phy.EnablePcap (ss.str (), apDevice);
500  }
501  g_signalDbmAvg = 0;
502  g_noiseDbmAvg = 0;
503  g_samples = 0;
504 
505  Simulator::Stop (Seconds (simulationTime + 1));
506  Simulator::Run ();
507 
508  double throughput = 0;
509  uint64_t totalPacketsThrough = 0;
510  if (udp)
511  {
512  //UDP
513  totalPacketsThrough = DynamicCast<UdpServer> (serverApp.Get (0))->GetReceived ();
514  throughput = totalPacketsThrough * payloadSize * 8 / (simulationTime * 1000000.0); //Mbit/s
515  }
516  else
517  {
518  //TCP
519  uint64_t totalBytesRx = DynamicCast<PacketSink> (serverApp.Get (0))->GetTotalRx ();
520  totalPacketsThrough = totalBytesRx / tcpPacketSize;
521  throughput = totalBytesRx * 8 / (simulationTime * 1000000.0); //Mbit/s
522  }
523  std::cout << std::setw (5) << i <<
524  std::setw (6) << (i % 8) <<
525  std::setprecision (2) << std::fixed <<
526  std::setw (10) << datarate <<
527  std::setw (12) << throughput <<
528  std::setw (8) << totalPacketsThrough;
529  if (totalPacketsThrough > 0)
530  {
531  std::cout << std::setw (12) << g_signalDbmAvg <<
532  std::setw (12) << g_noiseDbmAvg <<
533  std::setw (12) << (g_signalDbmAvg - g_noiseDbmAvg) <<
534  std::endl;
535  }
536  else
537  {
538  std::cout << std::setw (12) << "N/A" <<
539  std::setw (12) << "N/A" <<
540  std::setw (12) << "N/A" <<
541  std::endl;
542  }
544  }
545  return 0;
546 }
a polymophic address class
Definition: address.h:91
AttributeValue implementation for Address.
Definition: address.h:278
holds a vector of ns3::Application pointers.
Ptr< Application > Get(uint32_t i) const
Get the Ptr<Application> stored in this container at a given index.
void Start(Time start)
Arrange for all of the Applications in this container to Start() at the Time given as a parameter.
void Stop(Time stop)
Arrange for all of the Applications in this container to Stop() at the Time given as a parameter.
AttributeValue implementation for Boolean.
Definition: boolean.h:37
Parse command-line arguments.
Definition: command-line.h:229
Class for representing data rates.
Definition: data-rate.h:89
AttributeValue implementation for DataRate.
Definition: data-rate.h:298
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Definition: double.h:41
an Inet address class
aggregate IP/TCP/UDP functionality to existing Nodes.
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
static Ipv4Address GetAny(void)
holds a vector of std::pair of Ptr<Ipv4> and interface index.
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const
Helper class used to assign positions and mobility models to nodes.
holds a vector of ns3::NetDevice pointers
keep track of a set of node pointers.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
Ptr< Node > Get(uint32_t i) const
Get the Ptr<Node> stored in this container at a given index.
A helper to make it easier to instantiate an ns3::OnOffApplication on a set of nodes.
Definition: on-off-helper.h:43
A helper to make it easier to instantiate an ns3::PacketSinkApplication on a set of nodes.
static void Stop(void)
Tell the Simulator the calling event should be the last one executed.
Definition: simulator.cc:180
static void Destroy(void)
Execute the events scheduled with ScheduleDestroy().
Definition: simulator.cc:136
static void Run(void)
Run the simulation.
Definition: simulator.cc:172
Make it easy to create and manage PHY objects for the spectrum model.
void SetChannel(Ptr< SpectrumChannel > channel)
The IEEE 802.11 SSID Information Element.
Definition: ssid.h:36
AttributeValue implementation for Ssid.
Definition: ssid.h:105
Hold variables of type string.
Definition: string.h:41
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:103
AttributeValue implementation for Time.
Definition: nstime.h:1308
Create a client application which sends UDP packets carrying a 32bit sequence number and a 64 bit tim...
Create a server application which waits for input UDP packets and uses the information carried into t...
Hold an unsigned integer type.
Definition: uinteger.h:44
helps to create WifiNetDevice objects
Definition: wifi-helper.h:274
create MAC layers for a ns3::WifiNetDevice.
void Set(std::string name, const AttributeValue &v)
Definition: wifi-helper.cc:154
void SetErrorRateModel(std::string type, Args &&... args)
Helper function used to set the error rate model.
Definition: wifi-helper.h:440
This class mimics the TXVECTOR which is to be passed to the PHY in order to define the parameters whi...
manage and create wifi channel objects for the YANS model.
Make it easy to create and manage PHY objects for the YANS model.
uint16_t port
Definition: dsdv-manet.cc:45
void SetDefault(std::string name, const AttributeValue &value)
Definition: config.cc:849
void ConnectWithoutContext(std::string path, const CallbackBase &cb)
Definition: config.cc:901
void Set(std::string path, const AttributeValue &value)
Definition: config.cc:839
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:165
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
void(* DataRate)(DataRate oldValue, DataRate newValue)
TracedValue callback signature for DataRate.
Definition: data-rate.h:329
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1244
address
Definition: first.py:44
stack
Definition: first.py:41
Every class exported by the ns3 library is enclosed in the ns3 namespace.
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
cmd
Definition: second.py:35
ssid
Definition: third.py:100
channel
Definition: third.py:92
mac
Definition: third.py:99
wifi
Definition: third.py:96
wifiApNode
Definition: third.py:90
mobility
Definition: third.py:108
phy
Definition: third.py:93
MpduInfo structure.
Definition: phy-entity.h:60
SignalNoiseDbm structure.
Definition: phy-entity.h:53
double noise
noise power in dBm
Definition: phy-entity.h:55
double signal
signal strength in dBm
Definition: phy-entity.h:54
bool enablePcap
double g_signalDbmAvg
double g_noiseDbmAvg
uint32_t g_samples
void MonitorSniffRx(Ptr< const Packet > packet, uint16_t channelFreqMhz, WifiTxVector txVector, MpduInfo aMpdu, SignalNoiseDbm signalNoise, uint16_t staId)