A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
wifi-mixed-network.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2016 Sébastien Deronne
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 *
6 * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
7 */
8
9#include "ns3/command-line.h"
10#include "ns3/config.h"
11#include "ns3/ht-configuration.h"
12#include "ns3/internet-stack-helper.h"
13#include "ns3/ipv4-address-helper.h"
14#include "ns3/log.h"
15#include "ns3/mobility-helper.h"
16#include "ns3/on-off-helper.h"
17#include "ns3/packet-sink-helper.h"
18#include "ns3/packet-sink.h"
19#include "ns3/pointer.h"
20#include "ns3/qos-txop.h"
21#include "ns3/ssid.h"
22#include "ns3/string.h"
23#include "ns3/udp-client-server-helper.h"
24#include "ns3/udp-server.h"
25#include "ns3/wifi-mac.h"
26#include "ns3/wifi-net-device.h"
27#include "ns3/yans-wifi-channel.h"
28#include "ns3/yans-wifi-helper.h"
29
30/**
31 * @file
32 * @ingroup wifi
33 *
34 * This example shows how to configure mixed networks (i.e. mixed b/g and HT/non-HT) and how are
35 * performance in several scenarios.
36 *
37 * The example compares first g only and mixed b/g cases with various configurations depending on
38 * the following parameters:
39 * - protection mode that is configured on the AP;
40 * - whether short PPDU format is supported by the 802.11b station;
41 * - whether short slot time is supported by both the 802.11g station and the AP.
42 *
43 * The example then compares HT only and mixed HT/non-HT cases.
44 *
45 * The output results show that the presence of an 802.11b station strongly affects 802.11g
46 * performance. Protection mechanisms ensure that the NAV value of 802.11b stations is set correctly
47 * in case of 802.11g transmissions. In practice, those protection mechanism add a lot of overhead,
48 * resulting in reduced performance. CTS-To-Self introduces less overhead than Rts-Cts, but is not
49 * heard by hidden stations (and is thus generally only recommended as a protection mechanism for
50 * access points). Since short slot time is disabled once an 802.11b station enters the network,
51 * benefits from short slot time are only observed in a g only configuration.
52 *
53 * The user can also select the payload size and can choose either an UDP or a TCP connection.
54 *
55 * Example: `./ns3 run "wifi-mixed-network --isUdp=1"`
56 */
57
58using namespace ns3;
59
60NS_LOG_COMPONENT_DEFINE("MixedNetwork");
61
62/** Parameters */
64{
65 std::string testName; //!< Test name
66 bool enableErpProtection; //!< True to enable ERP protection
67 std::string erpProtectionMode; //!< ERP protection mode
68 bool enableShortSlotTime; //!< True to enable short slot time
69 bool enableShortPhyPreamble; //!< True to enable short PHY preamble
70 WifiStandard apType; //!< Wifi standard for AP
71 uint32_t nWifiB; //!< Number of 802.11b stations
72 bool bHasTraffic; //!< True if 802.11b stations generate traffic
73 uint32_t nWifiG; //!< Number of 802.11g stations
74 bool gHasTraffic; //!< True if 802.11g stations generate traffic
75 uint32_t nWifiN; //!< Number of 802.11n stations
76 bool nHasTraffic; //!< True if 802.11n stations generate traffic
77 bool isUdp; //!< True to generate UDP traffic
78 uint32_t payloadSize; //!< Payload size in bytes
79 Time simulationTime; //!< Simulation time
80};
81
82/** Unnamed namespace, to disambiguate class Experiment. */
83namespace
84{
85
86/** Experiment runner, based on Parameters */
88{
89 public:
90 Experiment();
91 /**
92 * Run an experiment with the given parameters
93 * @param params the given parameters
94 * @return the throughput
95 */
96 double Run(Parameters params);
97};
98
102
103double
105{
106 std::string apTypeString;
107 if (params.apType == WIFI_STANDARD_80211g)
108 {
109 apTypeString = "WIFI_STANDARD_80211g";
110 }
111 else if (params.apType == WIFI_STANDARD_80211n)
112 {
113 apTypeString = "WIFI_STANDARD_80211n_2_4GHZ";
114 }
115
116 std::cout << "Run: " << params.testName
117 << "\n\t enableErpProtection=" << params.enableErpProtection
118 << "\n\t erpProtectionMode=" << params.erpProtectionMode
119 << "\n\t enableShortSlotTime=" << params.enableShortSlotTime
120 << "\n\t enableShortPhyPreamble=" << params.enableShortPhyPreamble
121 << "\n\t apType=" << apTypeString << "\n\t nWifiB=" << params.nWifiB
122 << "\n\t bHasTraffic=" << params.bHasTraffic << "\n\t nWifiG=" << params.nWifiG
123 << "\n\t gHasTraffic=" << params.gHasTraffic << "\n\t nWifiN=" << params.nWifiN
124 << "\n\t nHasTraffic=" << params.nHasTraffic << std::endl;
125
126 Config::SetDefault("ns3::WifiRemoteStationManager::ErpProtectionMode",
127 StringValue(params.erpProtectionMode));
128
129 double throughput = 0;
130 uint32_t nWifiB = params.nWifiB;
131 uint32_t nWifiG = params.nWifiG;
132 uint32_t nWifiN = params.nWifiN;
133 auto simulationTime = params.simulationTime;
134 uint32_t payloadSize = params.payloadSize;
135
136 NodeContainer wifiBStaNodes;
137 wifiBStaNodes.Create(nWifiB);
138 NodeContainer wifiGStaNodes;
139 wifiGStaNodes.Create(nWifiG);
140 NodeContainer wifiNStaNodes;
141 wifiNStaNodes.Create(nWifiN);
142 NodeContainer wifiApNode;
143 wifiApNode.Create(1);
144
146 channel.AddPropagationLoss("ns3::RangePropagationLossModel");
147
149 phy.SetChannel(channel.Create());
150
151 WifiHelper wifi;
152 wifi.SetRemoteStationManager("ns3::IdealWifiManager");
153
154 // 802.11b STA
155 wifi.SetStandard(WIFI_STANDARD_80211b);
156
157 WifiMacHelper mac;
158 Ssid ssid = Ssid("ns-3-ssid");
159
160 mac.SetType("ns3::StaWifiMac",
161 "Ssid",
162 SsidValue(ssid),
163 "ShortSlotTimeSupported",
164 BooleanValue(params.enableShortSlotTime));
165
166 // Configure the PHY preamble type: long or short
167 phy.Set("ShortPlcpPreambleSupported", BooleanValue(params.enableShortPhyPreamble));
168
169 NetDeviceContainer bStaDevice;
170 bStaDevice = wifi.Install(phy, mac, wifiBStaNodes);
171
172 // 802.11b/g STA
173 wifi.SetStandard(WIFI_STANDARD_80211g);
174 NetDeviceContainer gStaDevice;
175 gStaDevice = wifi.Install(phy, mac, wifiGStaNodes);
176
177 // 802.11b/g/n STA
178 wifi.SetStandard(WIFI_STANDARD_80211n);
179 NetDeviceContainer nStaDevice;
180 mac.SetType("ns3::StaWifiMac",
181 "Ssid",
182 SsidValue(ssid),
183 "BE_BlockAckThreshold",
184 UintegerValue(2),
185 "ShortSlotTimeSupported",
186 BooleanValue(params.enableShortSlotTime));
187 nStaDevice = wifi.Install(phy, mac, wifiNStaNodes);
188
189 // AP
190 NetDeviceContainer apDevice;
191 wifi.SetStandard(params.apType);
192 mac.SetType("ns3::ApWifiMac",
193 "Ssid",
194 SsidValue(ssid),
195 "EnableBeaconJitter",
196 BooleanValue(false),
197 "BE_BlockAckThreshold",
198 UintegerValue(2),
199 "EnableNonErpProtection",
200 BooleanValue(params.enableErpProtection),
201 "ShortSlotTimeSupported",
202 BooleanValue(params.enableShortSlotTime));
203 apDevice = wifi.Install(phy, mac, wifiApNode);
204
205 // Set TXOP limit
206 if (params.apType == WIFI_STANDARD_80211n)
207 {
208 Ptr<NetDevice> dev = wifiApNode.Get(0)->GetDevice(0);
210 Ptr<WifiMac> wifi_mac = wifi_dev->GetMac();
211 PointerValue ptr;
212 wifi_mac->GetAttribute("BE_Txop", ptr);
213 Ptr<QosTxop> edca = ptr.Get<QosTxop>();
214 edca->SetTxopLimit(MicroSeconds(3008));
215 }
216 if (nWifiN > 0)
217 {
218 Ptr<NetDevice> dev = wifiNStaNodes.Get(0)->GetDevice(0);
220 Ptr<WifiMac> wifi_mac = wifi_dev->GetMac();
221 PointerValue ptr;
222 wifi_mac->GetAttribute("BE_Txop", ptr);
223 Ptr<QosTxop> edca = ptr.Get<QosTxop>();
224 edca->SetTxopLimit(MicroSeconds(3008));
225 }
226
227 Config::Set("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/BE_MaxAmpduSize",
228 UintegerValue(0)); // Disable A-MPDU
229
230 // Define mobility model
231 MobilityHelper mobility;
233
234 positionAlloc->Add(Vector(0.0, 0.0, 0.0));
235 for (uint32_t i = 0; i < nWifiB; i++)
236 {
237 positionAlloc->Add(Vector(5.0, 0.0, 0.0));
238 }
239 for (uint32_t i = 0; i < nWifiG; i++)
240 {
241 positionAlloc->Add(Vector(0.0, 5.0, 0.0));
242 }
243 for (uint32_t i = 0; i < nWifiN; i++)
244 {
245 positionAlloc->Add(Vector(0.0, 0.0, 5.0));
246 }
247
248 mobility.SetPositionAllocator(positionAlloc);
249 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
250 mobility.Install(wifiApNode);
251 mobility.Install(wifiBStaNodes);
252 mobility.Install(wifiGStaNodes);
253 mobility.Install(wifiNStaNodes);
254
255 // Internet stack
257 stack.Install(wifiApNode);
258 stack.Install(wifiBStaNodes);
259 stack.Install(wifiGStaNodes);
260 stack.Install(wifiNStaNodes);
261
262 Ipv4AddressHelper address;
263 address.SetBase("192.168.1.0", "255.255.255.0");
264 Ipv4InterfaceContainer bStaInterface;
265 bStaInterface = address.Assign(bStaDevice);
266 Ipv4InterfaceContainer gStaInterface;
267 gStaInterface = address.Assign(gStaDevice);
268 Ipv4InterfaceContainer nStaInterface;
269 nStaInterface = address.Assign(nStaDevice);
270 Ipv4InterfaceContainer ApInterface;
271 ApInterface = address.Assign(apDevice);
272
273 // Setting applications
274 if (params.isUdp)
275 {
276 uint16_t port = 9;
277 UdpServerHelper server(port);
278 ApplicationContainer serverApp = server.Install(wifiApNode);
279 serverApp.Start(Seconds(0));
280 serverApp.Stop(simulationTime + Seconds(1));
281
282 UdpClientHelper client(ApInterface.GetAddress(0), port);
283 client.SetAttribute("MaxPackets", UintegerValue(4294967295U));
284 client.SetAttribute("Interval", TimeValue(Time("0.0002"))); // packets/s
285 client.SetAttribute("PacketSize", UintegerValue(payloadSize));
286
287 ApplicationContainer clientApps;
288 if (params.bHasTraffic)
289 {
290 clientApps.Add(client.Install(wifiBStaNodes));
291 }
292 if (params.gHasTraffic)
293 {
294 clientApps.Add(client.Install(wifiGStaNodes));
295 }
296 if (params.nHasTraffic)
297 {
298 clientApps.Add(client.Install(wifiNStaNodes));
299 }
300 clientApps.Start(Seconds(1));
301 clientApps.Stop(simulationTime + Seconds(1));
302
303 Simulator::Stop(simulationTime + Seconds(1));
305
306 double totalPacketsThrough = DynamicCast<UdpServer>(serverApp.Get(0))->GetReceived();
307 throughput = totalPacketsThrough * payloadSize * 8 / simulationTime.GetMicroSeconds();
308 }
309 else
310 {
311 uint16_t port = 50000;
313 PacketSinkHelper packetSinkHelper("ns3::TcpSocketFactory", localAddress);
314
315 ApplicationContainer serverApp = packetSinkHelper.Install(wifiApNode.Get(0));
316 serverApp.Start(Seconds(0));
317 serverApp.Stop(simulationTime + Seconds(1));
318
319 OnOffHelper onoff("ns3::TcpSocketFactory", Ipv4Address::GetAny());
320 onoff.SetAttribute("OnTime", StringValue("ns3::ConstantRandomVariable[Constant=1]"));
321 onoff.SetAttribute("OffTime", StringValue("ns3::ConstantRandomVariable[Constant=0]"));
322 onoff.SetAttribute("PacketSize", UintegerValue(payloadSize));
323 onoff.SetAttribute("DataRate", DataRateValue(150000000)); // bit/s
324
325 AddressValue remoteAddress(InetSocketAddress(ApInterface.GetAddress(0), port));
326 onoff.SetAttribute("Remote", remoteAddress);
327
328 ApplicationContainer clientApps;
329 if (params.bHasTraffic)
330 {
331 clientApps.Add(onoff.Install(wifiBStaNodes));
332 }
333 if (params.gHasTraffic)
334 {
335 clientApps.Add(onoff.Install(wifiGStaNodes));
336 }
337 if (params.nHasTraffic)
338 {
339 clientApps.Add(onoff.Install(wifiNStaNodes));
340 }
341 clientApps.Start(Seconds(1));
342 clientApps.Stop(simulationTime + Seconds(1));
343
344 Simulator::Stop(simulationTime + Seconds(1));
346
347 double totalPacketsThrough = DynamicCast<PacketSink>(serverApp.Get(0))->GetTotalRx();
348 throughput += totalPacketsThrough * 8 / simulationTime.GetMicroSeconds();
349 }
351 return throughput;
352}
353
354} // unnamed namespace
355
356int
357main(int argc, char* argv[])
358{
359 Parameters params;
360 params.testName = "";
361 params.enableErpProtection = false;
362 params.erpProtectionMode = "Cts-To-Self";
363 params.enableShortSlotTime = false;
364 params.enableShortPhyPreamble = false;
365 params.apType = WIFI_STANDARD_80211g;
366 params.nWifiB = 0;
367 params.bHasTraffic = false;
368 params.nWifiG = 1;
369 params.gHasTraffic = true;
370 params.nWifiN = 0;
371 params.nHasTraffic = false;
372 params.isUdp = true;
373 params.payloadSize = 1472; // bytes
374 params.simulationTime = Seconds(10);
375
376 bool verifyResults = false; // used for regression
377
378 CommandLine cmd(__FILE__);
379 cmd.AddValue("payloadSize", "Payload size in bytes", params.payloadSize);
380 cmd.AddValue("simulationTime", "Simulation time", params.simulationTime);
381 cmd.AddValue("isUdp", "UDP if set to 1, TCP otherwise", params.isUdp);
382 cmd.AddValue("verifyResults",
383 "Enable/disable results verification at the end of the simulation",
384 verifyResults);
385 cmd.Parse(argc, argv);
386
388 double throughput = 0;
389
390 params.testName = "g only with all g features disabled";
391 throughput = experiment.Run(params);
392 if (verifyResults && (throughput < 22.5 || throughput > 23.5))
393 {
394 NS_LOG_ERROR("Obtained throughput " << throughput << " is not in the expected boundaries!");
395 exit(1);
396 }
397 std::cout << "Throughput: " << throughput << " Mbit/s \n" << std::endl;
398
399 params.testName = "g only with short slot time enabled";
400 params.enableErpProtection = false;
401 params.enableShortSlotTime = true;
402 params.enableShortPhyPreamble = false;
403 params.nWifiB = 0;
404 throughput = experiment.Run(params);
405 if (verifyResults && (throughput < 29 || throughput > 30))
406 {
407 NS_LOG_ERROR("Obtained throughput " << throughput << " is not in the expected boundaries!");
408 exit(1);
409 }
410 std::cout << "Throughput: " << throughput << " Mbit/s \n" << std::endl;
411
412 params.testName = "Mixed b/g with all g features disabled";
413 params.enableErpProtection = false;
414 params.enableShortSlotTime = false;
415 params.enableShortPhyPreamble = false;
416 params.nWifiB = 1;
417 throughput = experiment.Run(params);
418 if (verifyResults && (throughput < 22.5 || throughput > 23.5))
419 {
420 NS_LOG_ERROR("Obtained throughput " << throughput << " is not in the expected boundaries!");
421 exit(1);
422 }
423 std::cout << "Throughput: " << throughput << " Mbit/s \n" << std::endl;
424
425 params.testName = "Mixed b/g with short plcp preamble enabled";
426 params.enableErpProtection = false;
427 params.enableShortSlotTime = false;
428 params.enableShortPhyPreamble = true;
429 params.nWifiB = 1;
430 throughput = experiment.Run(params);
431 if (verifyResults && (throughput < 22.5 || throughput > 23.5))
432 {
433 NS_LOG_ERROR("Obtained throughput " << throughput << " is not in the expected boundaries!");
434 exit(1);
435 }
436 std::cout << "Throughput: " << throughput << " Mbit/s \n" << std::endl;
437
438 params.testName = "Mixed b/g with short slot time enabled using RTS-CTS protection";
439 params.enableErpProtection = true;
440 params.erpProtectionMode = "Rts-Cts";
441 params.enableShortSlotTime = false;
442 params.enableShortPhyPreamble = false;
443 params.nWifiB = 1;
444 throughput = experiment.Run(params);
445 if (verifyResults && (throughput < 19 || throughput > 20))
446 {
447 NS_LOG_ERROR("Obtained throughput " << throughput << " is not in the expected boundaries!");
448 exit(1);
449 }
450 std::cout << "Throughput: " << throughput << " Mbit/s \n" << std::endl;
451
452 params.testName = "Mixed b/g with short plcp preamble enabled using RTS-CTS protection";
453 params.enableErpProtection = true;
454 params.enableShortSlotTime = false;
455 params.enableShortPhyPreamble = true;
456 params.nWifiB = 1;
457 throughput = experiment.Run(params);
458 if (verifyResults && (throughput < 19 || throughput > 20))
459 {
460 NS_LOG_ERROR("Obtained throughput " << throughput << " is not in the expected boundaries!");
461 exit(1);
462 }
463 std::cout << "Throughput: " << throughput << " Mbit/s \n" << std::endl;
464
465 params.testName = "Mixed b/g with short slot time enabled using CTS-TO-SELF protection";
466 params.enableErpProtection = true;
467 params.erpProtectionMode = "Cts-To-Self";
468 params.enableShortSlotTime = false;
469 params.enableShortPhyPreamble = false;
470 params.nWifiB = 1;
471 throughput = experiment.Run(params);
472 if (verifyResults && (throughput < 20.5 || throughput > 21.5))
473 {
474 NS_LOG_ERROR("Obtained throughput " << throughput << " is not in the expected boundaries!");
475 exit(1);
476 }
477 std::cout << "Throughput: " << throughput << " Mbit/s \n" << std::endl;
478
479 params.testName = "Mixed b/g with short plcp preamble enabled using CTS-TO-SELF protection";
480 params.enableErpProtection = true;
481 params.enableShortSlotTime = false;
482 params.enableShortPhyPreamble = true;
483 params.nWifiB = 1;
484 throughput = experiment.Run(params);
485 if (verifyResults && (throughput < 20.5 || throughput > 21.5))
486 {
487 NS_LOG_ERROR("Obtained throughput " << throughput << " is not in the expected boundaries!");
488 exit(1);
489 }
490 std::cout << "Throughput: " << throughput << " Mbit/s \n" << std::endl;
491
492 params.testName = "HT only";
493 params.enableErpProtection = false;
494 params.enableShortSlotTime = false;
495 params.enableShortPhyPreamble = false;
497 params.nWifiB = 0;
498 params.bHasTraffic = false;
499 params.nWifiG = 0;
500 params.gHasTraffic = false;
501 params.nWifiN = 1;
502 params.nHasTraffic = true;
503 throughput = experiment.Run(params);
504 if (verifyResults && (throughput < 44 || throughput > 45))
505 {
506 NS_LOG_ERROR("Obtained throughput " << throughput << " is not in the expected boundaries!");
507 exit(1);
508 }
509 std::cout << "Throughput: " << throughput << " Mbit/s \n" << std::endl;
510
511 params.testName = "Mixed HT/non-HT";
512 params.enableErpProtection = false;
513 params.enableShortSlotTime = false;
514 params.enableShortPhyPreamble = false;
516 params.nWifiB = 0;
517 params.bHasTraffic = false;
518 params.nWifiG = 1;
519 params.gHasTraffic = false;
520 params.nWifiN = 1;
521 params.nHasTraffic = true;
522 throughput = experiment.Run(params);
523 if (verifyResults && (throughput < 44 || throughput > 45))
524 {
525 NS_LOG_ERROR("Obtained throughput " << throughput << " is not in the expected boundaries!");
526 exit(1);
527 }
528 std::cout << "Throughput: " << throughput << " Mbit/s \n" << std::endl;
529
530 return 0;
531}
Gnuplot2dDataset Run(const WifiHelper &wifi, const YansWifiPhyHelper &wifiPhy, const WifiMacHelper &wifiMac, const YansWifiChannelHelper &wifiChannel)
Run an experiment.
double Run(Parameters params)
Run an experiment with the given parameters.
a polymophic address class
Definition address.h:114
AttributeValue implementation for Address.
Definition address.h:329
holds a vector of ns3::Application pointers.
void Start(Time start) const
Start all of the Applications in this container at the start time given as a parameter.
Ptr< Application > Get(uint32_t i) const
Get the Ptr<Application> stored in this container at a given index.
void Stop(Time stop) const
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:26
Parse command-line arguments.
AttributeValue implementation for DataRate.
Definition data-rate.h:285
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()
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.
Ptr< NetDevice > GetDevice(uint32_t index) const
Retrieve the index-th NetDevice associated to this node.
Definition node.cc:138
A helper to make it easier to instantiate an ns3::OnOffApplication on a set of nodes.
A helper to make it easier to instantiate an ns3::PacketSinkApplication on a set of nodes.
AttributeValue implementation for Pointer.
Definition pointer.h:37
Ptr< T > Get() const
Definition pointer.h:224
Smart pointer class similar to boost::intrusive_ptr.
Definition ptr.h:70
Handles the packet queue and stores DCF/EDCA access parameters (one Txop per AC).
Definition qos-txop.h:52
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
Definition simulator.cc:131
static void Run()
Run the simulation.
Definition simulator.cc:167
static void Stop()
Tell the Simulator the calling event should be the last one executed.
Definition simulator.cc:175
The IEEE 802.11 SSID Information Element.
Definition ssid.h:25
AttributeValue implementation for Ssid.
Definition ssid.h:85
Hold variables of type string.
Definition string.h:45
Simulation virtual time values and global simulation resolution.
Definition nstime.h:96
AttributeValue implementation for Time.
Definition nstime.h:1483
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:34
helps to create WifiNetDevice objects
create MAC layers for a ns3::WifiNetDevice.
manage and create wifi channel objects for the YANS model.
static YansWifiChannelHelper Default()
Create a channel helper in a default working state.
Make it easy to create and manage PHY objects for the YANS model.
void experiment(std::string queue_disc_type)
uint16_t port
Definition dsdv-manet.cc:33
void SetDefault(std::string name, const AttributeValue &value)
Definition config.cc:886
void Set(std::string path, const AttributeValue &value)
Definition config.cc:872
#define NS_LOG_ERROR(msg)
Use NS_LOG to output a message of level LOG_ERROR.
Definition log.h:246
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition log.h:194
Ptr< T > CreateObject(Args &&... args)
Create an object by type, with varying number of constructor parameters.
Definition object.h:627
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition nstime.h:1415
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition nstime.h:1381
WifiStandard
Identifies the IEEE 802.11 specifications that a Wifi device can be configured to use.
@ WIFI_STANDARD_80211n
@ WIFI_STANDARD_80211g
@ WIFI_STANDARD_80211b
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Ptr< T1 > DynamicCast(const Ptr< T2 > &p)
Cast a Ptr.
Definition ptr.h:605
params
Fit Fluctuating Two Ray model to the 3GPP TR 38.901 using the Anderson-Darling goodness-of-fit ##.
WifiStandard apType
Wifi standard for AP.
uint32_t nWifiB
Number of 802.11b stations.
uint32_t nWifiN
Number of 802.11n stations.
bool enableErpProtection
True to enable ERP protection.
bool nHasTraffic
True if 802.11n stations generate traffic.
bool gHasTraffic
True if 802.11g stations generate traffic.
std::string erpProtectionMode
ERP protection mode.
Time simulationTime
Simulation time.
bool enableShortSlotTime
True to enable short slot time.
bool bHasTraffic
True if 802.11b stations generate traffic.
bool isUdp
True to generate UDP traffic.
std::string testName
Test name.
bool enableShortPhyPreamble
True to enable short PHY preamble.
uint32_t nWifiG
Number of 802.11g stations.
uint32_t payloadSize
Payload size in bytes.
std::ofstream throughput