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"
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"
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"
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;
133 auto simulationTime = params.simulationTime;
134 uint32_t payloadSize = params.payloadSize;
137 wifiBStaNodes.
Create(nWifiB);
139 wifiGStaNodes.
Create(nWifiG);
141 wifiNStaNodes.
Create(nWifiN);
143 wifiApNode.Create(1);
146 channel.AddPropagationLoss(
"ns3::RangePropagationLossModel");
149 phy.SetChannel(channel.Create());
152 wifi.SetRemoteStationManager(
"ns3::IdealWifiManager");
160 mac.SetType(
"ns3::StaWifiMac",
163 "ShortSlotTimeSupported",
167 phy.Set(
"ShortPlcpPreambleSupported",
BooleanValue(params.enableShortPhyPreamble));
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);
191 wifi.SetStandard(params.apType);
192 mac.SetType(
"ns3::ApWifiMac",
195 "EnableBeaconJitter",
197 "BE_BlockAckThreshold",
199 "EnableNonErpProtection",
201 "ShortSlotTimeSupported",
203 apDevice = wifi.Install(phy, mac, wifiApNode);
212 wifi_mac->GetAttribute(
"BE_Txop", ptr);
222 wifi_mac->GetAttribute(
"BE_Txop", ptr);
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");
250 mobility.Install(wifiApNode);
251 mobility.Install(wifiBStaNodes);
252 mobility.Install(wifiGStaNodes);
253 mobility.Install(wifiNStaNodes);
257 stack.Install(wifiApNode);
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);
283 client.SetAttribute(
"MaxPackets",
UintegerValue(4294967295U));
285 client.SetAttribute(
"PacketSize",
UintegerValue(payloadSize));
288 if (params.bHasTraffic)
290 clientApps.Add(client.Install(wifiBStaNodes));
292 if (params.gHasTraffic)
294 clientApps.Add(client.Install(wifiGStaNodes));
296 if (params.nHasTraffic)
298 clientApps.Add(client.Install(wifiNStaNodes));
301 clientApps.Stop(simulationTime +
Seconds(1));
307 throughput = totalPacketsThrough * payloadSize * 8 / simulationTime.GetMicroSeconds();
311 uint16_t
port = 50000;
320 onoff.SetAttribute(
"OnTime",
StringValue(
"ns3::ConstantRandomVariable[Constant=1]"));
321 onoff.SetAttribute(
"OffTime",
StringValue(
"ns3::ConstantRandomVariable[Constant=0]"));
322 onoff.SetAttribute(
"PacketSize",
UintegerValue(payloadSize));
326 onoff.SetAttribute(
"Remote", remoteAddress);
329 if (params.bHasTraffic)
331 clientApps.Add(onoff.Install(wifiBStaNodes));
333 if (params.gHasTraffic)
335 clientApps.Add(onoff.Install(wifiGStaNodes));
337 if (params.nHasTraffic)
339 clientApps.Add(onoff.Install(wifiNStaNodes));
342 clientApps.Stop(simulationTime +
Seconds(1));
348 throughput += totalPacketsThrough * 8 / simulationTime.GetMicroSeconds();
357main(
int argc,
char* argv[])
360 params.testName =
"";
361 params.enableErpProtection =
false;
362 params.erpProtectionMode =
"Cts-To-Self";
363 params.enableShortSlotTime =
false;
364 params.enableShortPhyPreamble =
false;
367 params.bHasTraffic =
false;
369 params.gHasTraffic =
true;
371 params.nHasTraffic =
false;
373 params.payloadSize = 1472;
374 params.simulationTime =
Seconds(10);
376 bool verifyResults =
false;
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",
385 cmd.Parse(argc, argv);
390 params.testName =
"g only with all g features disabled";
397 std::cout <<
"Throughput: " <<
throughput <<
" Mbit/s \n" << std::endl;
399 params.testName =
"g only with short slot time enabled";
400 params.enableErpProtection =
false;
401 params.enableShortSlotTime =
true;
402 params.enableShortPhyPreamble =
false;
410 std::cout <<
"Throughput: " <<
throughput <<
" Mbit/s \n" << std::endl;
412 params.testName =
"Mixed b/g with all g features disabled";
413 params.enableErpProtection =
false;
414 params.enableShortSlotTime =
false;
415 params.enableShortPhyPreamble =
false;
423 std::cout <<
"Throughput: " <<
throughput <<
" Mbit/s \n" << std::endl;
425 params.testName =
"Mixed b/g with short plcp preamble enabled";
426 params.enableErpProtection =
false;
427 params.enableShortSlotTime =
false;
428 params.enableShortPhyPreamble =
true;
436 std::cout <<
"Throughput: " <<
throughput <<
" Mbit/s \n" << std::endl;
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;
450 std::cout <<
"Throughput: " <<
throughput <<
" Mbit/s \n" << std::endl;
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;
463 std::cout <<
"Throughput: " <<
throughput <<
" Mbit/s \n" << std::endl;
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;
477 std::cout <<
"Throughput: " <<
throughput <<
" Mbit/s \n" << std::endl;
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;
490 std::cout <<
"Throughput: " <<
throughput <<
" Mbit/s \n" << std::endl;
492 params.testName =
"HT only";
493 params.enableErpProtection =
false;
494 params.enableShortSlotTime =
false;
495 params.enableShortPhyPreamble =
false;
498 params.bHasTraffic =
false;
500 params.gHasTraffic =
false;
502 params.nHasTraffic =
true;
509 std::cout <<
"Throughput: " <<
throughput <<
" Mbit/s \n" << std::endl;
511 params.testName =
"Mixed HT/non-HT";
512 params.enableErpProtection =
false;
513 params.enableShortSlotTime =
false;
514 params.enableShortPhyPreamble =
false;
517 params.bHasTraffic =
false;
519 params.gHasTraffic =
false;
521 params.nHasTraffic =
true;
528 std::cout <<
"Throughput: " <<
throughput <<
" Mbit/s \n" << std::endl;
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
AttributeValue implementation for Address.
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.
Parse command-line arguments.
AttributeValue implementation for DataRate.
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.
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.
Smart pointer class similar to boost::intrusive_ptr.
Handles the packet queue and stores DCF/EDCA access parameters (one Txop per AC).
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.
AttributeValue implementation for Ssid.
Hold variables of type string.
Simulation virtual time values and global simulation resolution.
AttributeValue implementation for Time.
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.
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.
Ptr< T > CreateObject(Args &&... args)
Create an object by type, with varying number of constructor parameters.
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.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Ptr< T1 > DynamicCast(const Ptr< T2 > &p)
Cast a Ptr.
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.