20 #include "ns3/command-line.h"
21 #include "ns3/config.h"
22 #include "ns3/ht-configuration.h"
23 #include "ns3/internet-stack-helper.h"
24 #include "ns3/ipv4-address-helper.h"
26 #include "ns3/mobility-helper.h"
27 #include "ns3/on-off-helper.h"
28 #include "ns3/packet-sink-helper.h"
29 #include "ns3/packet-sink.h"
30 #include "ns3/pointer.h"
31 #include "ns3/qos-txop.h"
33 #include "ns3/string.h"
34 #include "ns3/udp-client-server-helper.h"
35 #include "ns3/udp-server.h"
36 #include "ns3/wifi-mac.h"
37 #include "ns3/wifi-net-device.h"
38 #include "ns3/yans-wifi-channel.h"
39 #include "ns3/yans-wifi-helper.h"
106 std::string apTypeString;
109 apTypeString =
"WIFI_STANDARD_80211g";
113 apTypeString =
"WIFI_STANDARD_80211n_2_4GHZ";
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;
130 uint32_t nWifiB =
params.nWifiB;
131 uint32_t nWifiG =
params.nWifiG;
132 uint32_t nWifiN =
params.nWifiN;
133 double simulationTime =
params.simulationTime;
134 uint32_t payloadSize =
params.payloadSize;
137 wifiBStaNodes.
Create(nWifiB);
139 wifiGStaNodes.
Create(nWifiG);
141 wifiNStaNodes.
Create(nWifiN);
146 channel.AddPropagationLoss(
"ns3::RangePropagationLossModel");
152 wifi.SetRemoteStationManager(
"ns3::IdealWifiManager");
160 mac.SetType(
"ns3::StaWifiMac",
163 "ShortSlotTimeSupported",
170 bStaDevice =
wifi.Install(
phy,
mac, wifiBStaNodes);
175 gStaDevice =
wifi.Install(
phy,
mac, wifiGStaNodes);
180 mac.SetType(
"ns3::StaWifiMac",
183 "BE_BlockAckThreshold",
185 "ShortSlotTimeSupported",
187 nStaDevice =
wifi.Install(
phy,
mac, wifiNStaNodes);
192 mac.SetType(
"ns3::ApWifiMac",
195 "EnableBeaconJitter",
197 "BE_BlockAckThreshold",
199 "EnableNonErpProtection",
201 "ShortSlotTimeSupported",
227 Config::Set(
"/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Mac/BE_MaxAmpduSize",
234 positionAlloc->Add(Vector(0.0, 0.0, 0.0));
235 for (uint32_t i = 0; i < nWifiB; i++)
237 positionAlloc->Add(Vector(5.0, 0.0, 0.0));
239 for (uint32_t i = 0; i < nWifiG; i++)
241 positionAlloc->Add(Vector(0.0, 5.0, 0.0));
243 for (uint32_t i = 0; i < nWifiN; i++)
245 positionAlloc->Add(Vector(0.0, 0.0, 5.0));
248 mobility.SetPositionAllocator(positionAlloc);
249 mobility.SetMobilityModel(
"ns3::ConstantPositionMobilityModel");
258 stack.Install(wifiBStaNodes);
259 stack.Install(wifiGStaNodes);
260 stack.Install(wifiNStaNodes);
263 address.SetBase(
"192.168.1.0",
"255.255.255.0");
265 bStaInterface =
address.Assign(bStaDevice);
267 gStaInterface =
address.Assign(gStaDevice);
269 nStaInterface =
address.Assign(nStaDevice);
271 ApInterface =
address.Assign(apDevice);
306 uint64_t totalPacketsThrough = DynamicCast<UdpServer>(serverApp.
Get(0))->GetReceived();
307 throughput = totalPacketsThrough * payloadSize * 8 / (simulationTime * 1000000.0);
311 uint16_t
port = 50000;
320 onoff.SetAttribute(
"OnTime",
StringValue(
"ns3::ConstantRandomVariable[Constant=1]"));
321 onoff.SetAttribute(
"OffTime",
StringValue(
"ns3::ConstantRandomVariable[Constant=0]"));
323 onoff.SetAttribute(
"DataRate", DataRateValue(150000000));
347 uint64_t totalPacketsThrough = DynamicCast<PacketSink>(serverApp.
Get(0))->GetTotalRx();
348 throughput += totalPacketsThrough * 8 / (simulationTime * 1000000.0);
355 main(
int argc,
char* argv[])
359 params.enableErpProtection =
false;
360 params.erpProtectionMode =
"Cts-To-Self";
361 params.enableShortSlotTime =
false;
362 params.enableShortPhyPreamble =
false;
365 params.bHasTraffic =
false;
367 params.gHasTraffic =
true;
369 params.nHasTraffic =
false;
371 params.payloadSize = 1472;
372 params.simulationTime = 10;
374 bool verifyResults =
false;
377 cmd.AddValue(
"payloadSize",
"Payload size in bytes",
params.payloadSize);
378 cmd.AddValue(
"simulationTime",
"Simulation time in seconds",
params.simulationTime);
379 cmd.AddValue(
"isUdp",
"UDP if set to 1, TCP otherwise",
params.isUdp);
380 cmd.AddValue(
"verifyResults",
381 "Enable/disable results verification at the end of the simulation",
383 cmd.Parse(argc, argv);
388 params.testName =
"g only with all g features disabled";
390 if (verifyResults && (throughput < 22.5 || throughput > 23.5))
395 std::cout <<
"Throughput: " <<
throughput <<
" Mbit/s \n" << std::endl;
397 params.testName =
"g only with short slot time enabled";
398 params.enableErpProtection =
false;
399 params.enableShortSlotTime =
true;
400 params.enableShortPhyPreamble =
false;
403 if (verifyResults && (throughput < 29 || throughput > 30))
408 std::cout <<
"Throughput: " <<
throughput <<
" Mbit/s \n" << std::endl;
410 params.testName =
"Mixed b/g with all g features disabled";
411 params.enableErpProtection =
false;
412 params.enableShortSlotTime =
false;
413 params.enableShortPhyPreamble =
false;
416 if (verifyResults && (throughput < 22.5 || throughput > 23.5))
421 std::cout <<
"Throughput: " <<
throughput <<
" Mbit/s \n" << std::endl;
423 params.testName =
"Mixed b/g with short plcp preamble enabled";
424 params.enableErpProtection =
false;
425 params.enableShortSlotTime =
false;
426 params.enableShortPhyPreamble =
true;
429 if (verifyResults && (throughput < 22.5 || throughput > 23.5))
434 std::cout <<
"Throughput: " <<
throughput <<
" Mbit/s \n" << std::endl;
436 params.testName =
"Mixed b/g with short slot time enabled using RTS-CTS protection";
437 params.enableErpProtection =
true;
438 params.erpProtectionMode =
"Rts-Cts";
439 params.enableShortSlotTime =
false;
440 params.enableShortPhyPreamble =
false;
443 if (verifyResults && (throughput < 19 || throughput > 20))
448 std::cout <<
"Throughput: " <<
throughput <<
" Mbit/s \n" << std::endl;
450 params.testName =
"Mixed b/g with short plcp preamble enabled using RTS-CTS protection";
451 params.enableErpProtection =
true;
452 params.enableShortSlotTime =
false;
453 params.enableShortPhyPreamble =
true;
456 if (verifyResults && (throughput < 19 || throughput > 20))
461 std::cout <<
"Throughput: " <<
throughput <<
" Mbit/s \n" << std::endl;
463 params.testName =
"Mixed b/g with short slot time enabled using CTS-TO-SELF protection";
464 params.enableErpProtection =
true;
465 params.erpProtectionMode =
"Cts-To-Self";
466 params.enableShortSlotTime =
false;
467 params.enableShortPhyPreamble =
false;
470 if (verifyResults && (throughput < 20.5 || throughput > 21.5))
475 std::cout <<
"Throughput: " <<
throughput <<
" Mbit/s \n" << std::endl;
477 params.testName =
"Mixed b/g with short plcp preamble enabled using CTS-TO-SELF protection";
478 params.enableErpProtection =
true;
479 params.enableShortSlotTime =
false;
480 params.enableShortPhyPreamble =
true;
483 if (verifyResults && (throughput < 20.5 || throughput > 21.5))
488 std::cout <<
"Throughput: " <<
throughput <<
" Mbit/s \n" << std::endl;
490 params.testName =
"HT only";
491 params.enableErpProtection =
false;
492 params.enableShortSlotTime =
false;
493 params.enableShortPhyPreamble =
false;
496 params.bHasTraffic =
false;
498 params.gHasTraffic =
false;
500 params.nHasTraffic =
true;
502 if (verifyResults && (throughput < 44 || throughput > 45))
507 std::cout <<
"Throughput: " <<
throughput <<
" Mbit/s \n" << std::endl;
509 params.testName =
"Mixed HT/non-HT";
510 params.enableErpProtection =
false;
511 params.enableShortSlotTime =
false;
512 params.enableShortPhyPreamble =
false;
515 params.bHasTraffic =
false;
517 params.gHasTraffic =
false;
519 params.nHasTraffic =
true;
521 if (verifyResults && (throughput < 44 || throughput > 45))
526 std::cout <<
"Throughput: " <<
throughput <<
" Mbit/s \n" << std::endl;
WiFi adhoc experiment class.
Gnuplot2dDataset Run(const WifiHelper &wifi, const YansWifiPhyHelper &wifiPhy, const WifiMacHelper &wifiMac, const YansWifiChannelHelper &wifiChannel)
Run an experiment.
a polymophic address class
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.
Parse command-line arguments.
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.
void GetAttribute(std::string name, AttributeValue &value) const
Get the value of an attribute, raising fatal errors if unsuccessful.
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.
Hold objects of type Ptr<T>.
Smart pointer class similar to boost::intrusive_ptr.
Handle packet fragmentation and retransmissions for QoS data frames as well as MSDU aggregation (A-MS...
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
static void Run()
Run the simulation.
static void Stop()
Tell the Simulator the calling event should be the last one executed.
The IEEE 802.11 SSID Information Element.
Hold variables of type string.
void SetTxopLimit(Time txopLimit)
Set the TXOP limit.
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.
helps to create WifiNetDevice objects
create MAC layers for a ns3::WifiNetDevice.
Ptr< WifiMac > GetMac() const
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)
void SetDefault(std::string name, const AttributeValue &value)
void Set(std::string path, const AttributeValue &value)
#define NS_LOG_ERROR(msg)
Use NS_LOG to output a message of level LOG_ERROR.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
Time Seconds(double value)
Construct a Time in the indicated unit.
WifiStandard
Identifies the IEEE 802.11 specifications that a Wifi device can be configured to use.
void(* Time)(Time oldValue, Time newValue)
TracedValue callback signature for Time.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
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.
double simulationTime
Simulation time in seconds.
std::string erpProtectionMode
ERP protection mode.
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.