21 #include "ns3/core-module.h"
22 #include "ns3/network-module.h"
23 #include "ns3/applications-module.h"
24 #include "ns3/wifi-module.h"
25 #include "ns3/mobility-module.h"
26 #include "ns3/internet-module.h"
59 int main (
int argc,
char *argv[])
61 uint32_t payloadSize = 1472;
62 uint64_t simulationTime = 10;
65 bool verifyResults = 0;
68 cmd.
AddValue (
"payloadSize",
"Payload size in bytes", payloadSize);
69 cmd.
AddValue (
"simulationTime",
"Simulation time in seconds", simulationTime);
70 cmd.
AddValue (
"distance",
"Distance in meters between the station and the access point", distance);
71 cmd.
AddValue (
"enablePcap",
"Enable/disable pcap file generation", enablePcap);
72 cmd.
AddValue (
"verifyResults",
"Enable/disable results verification at the end of the simulation", verifyResults);
73 cmd.
Parse (argc, argv);
89 NetDeviceContainer staDeviceA, staDeviceB, staDeviceC, staDeviceD, apDeviceA, apDeviceB, apDeviceC, apDeviceD;
93 ssid =
Ssid (
"network-A");
98 staDeviceA = wifi.
Install (phy, mac, wifiStaNodes.
Get (0));
104 apDeviceA = wifi.
Install (phy, mac, wifiApNodes.
Get (0));
107 ssid =
Ssid (
"network-B");
109 mac.
SetType (
"ns3::StaWifiMac",
113 staDeviceB = wifi.
Install (phy, mac, wifiStaNodes.
Get (1));
119 apDeviceB = wifi.
Install (phy, mac, wifiApNodes.
Get (1));
132 ssid =
Ssid (
"network-C");
134 mac.
SetType (
"ns3::StaWifiMac",
138 staDeviceC = wifi.
Install (phy, mac, wifiStaNodes.
Get (2));
144 apDeviceC = wifi.
Install (phy, mac, wifiApNodes.
Get (2));
147 ssid =
Ssid (
"network-D");
149 mac.
SetType (
"ns3::StaWifiMac",
153 staDeviceD = wifi.
Install (phy, mac, wifiStaNodes.
Get (3));
159 apDeviceD = wifi.
Install (phy, mac, wifiApNodes.
Get (3));
163 wifi_dev = DynamicCast<WifiNetDevice> (dev);
164 wifi_mac = wifi_dev->
GetMac ();
165 wifi_mac->GetAttribute (
"VI_EdcaTxopN", ptr);
175 positionAlloc->
Add (Vector (0.0, 0.0, 0.0));
176 positionAlloc->
Add (Vector (10.0, 0.0, 0.0));
177 positionAlloc->
Add (Vector (20.0, 0.0, 0.0));
178 positionAlloc->
Add (Vector (30.0, 0.0, 0.0));
180 positionAlloc->
Add (Vector (distance, 0.0, 0.0));
181 positionAlloc->
Add (Vector (10 + distance, 0.0, 0.0));
182 positionAlloc->
Add (Vector (20 + distance, 0.0, 0.0));
183 positionAlloc->
Add (Vector (30 + distance, 0.0, 0.0));
188 mobility.
Install (wifiApNodes);
189 mobility.
Install (wifiStaNodes);
197 address.
SetBase (
"192.168.1.0",
"255.255.255.0");
199 StaInterfaceA = address.
Assign (staDeviceA);
201 ApInterfaceA = address.
Assign (apDeviceA);
203 address.
SetBase (
"192.168.2.0",
"255.255.255.0");
205 StaInterfaceB = address.
Assign (staDeviceB);
207 ApInterfaceB = address.
Assign (apDeviceB);
209 address.
SetBase (
"192.168.3.0",
"255.255.255.0");
211 StaInterfaceC = address.
Assign (staDeviceC);
213 ApInterfaceC = address.
Assign (apDeviceC);
215 address.
SetBase (
"192.168.4.0",
"255.255.255.0");
217 StaInterfaceD = address.
Assign (staDeviceD);
219 ApInterfaceD = address.
Assign (apDeviceD);
222 uint16_t
port = 5001;
231 OnOffHelper clientA (
"ns3::UdpSocketFactory", destA);
232 clientA.SetAttribute (
"OnTime",
StringValue (
"ns3::ConstantRandomVariable[Constant=1]"));
233 clientA.SetAttribute (
"OffTime",
StringValue (
"ns3::ConstantRandomVariable[Constant=0]"));
234 clientA.SetAttribute (
"DataRate",
StringValue (
"100000kb/s"));
235 clientA.SetAttribute (
"PacketSize",
UintegerValue (payloadSize));
249 OnOffHelper clientB (
"ns3::UdpSocketFactory", destB);
250 clientB.SetAttribute (
"OnTime",
StringValue (
"ns3::ConstantRandomVariable[Constant=1]"));
251 clientB.SetAttribute (
"OffTime",
StringValue (
"ns3::ConstantRandomVariable[Constant=0]"));
252 clientB.SetAttribute (
"DataRate",
StringValue (
"100000kb/s"));
253 clientB.SetAttribute (
"PacketSize",
UintegerValue (payloadSize));
267 OnOffHelper clientC (
"ns3::UdpSocketFactory", destC);
268 clientC.SetAttribute (
"OnTime",
StringValue (
"ns3::ConstantRandomVariable[Constant=1]"));
269 clientC.SetAttribute (
"OffTime",
StringValue (
"ns3::ConstantRandomVariable[Constant=0]"));
270 clientC.SetAttribute (
"DataRate",
StringValue (
"100000kb/s"));
271 clientC.SetAttribute (
"PacketSize",
UintegerValue (payloadSize));
285 OnOffHelper clientD (
"ns3::UdpSocketFactory", destD);
286 clientD.SetAttribute (
"OnTime",
StringValue (
"ns3::ConstantRandomVariable[Constant=1]"));
287 clientD.SetAttribute (
"OffTime",
StringValue (
"ns3::ConstantRandomVariable[Constant=0]"));
288 clientD.SetAttribute (
"DataRate",
StringValue (
"100000kb/s"));
289 clientD.SetAttribute (
"PacketSize",
UintegerValue (payloadSize));
312 uint32_t totalPacketsThrough = DynamicCast<UdpServer> (serverAppA.
Get (0))->GetReceived ();
313 double throughput = totalPacketsThrough * payloadSize * 8 / (simulationTime * 1000000.0);
314 std::cout <<
"Throughput for AC_BE with default TXOP limit (0ms): " << throughput <<
" Mbit/s" <<
'\n';
315 if (verifyResults && (throughput < 28 || throughput > 29))
317 NS_LOG_ERROR (
"Obtained throughput " << throughput <<
" is not in the expected boundaries!");
321 totalPacketsThrough = DynamicCast<UdpServer> (serverAppB.
Get (0))->GetReceived ();
322 throughput = totalPacketsThrough * payloadSize * 8 / (simulationTime * 1000000.0);
323 std::cout <<
"Throughput for AC_BE with non-default TXOP limit (3.008ms): " << throughput <<
" Mbit/s" <<
'\n';
324 if (verifyResults && (throughput < 35.5 || throughput > 36.5))
326 NS_LOG_ERROR (
"Obtained throughput " << throughput <<
" is not in the expected boundaries!");
330 totalPacketsThrough = DynamicCast<UdpServer> (serverAppC.
Get (0))->GetReceived ();
331 throughput = totalPacketsThrough * payloadSize * 8 / (simulationTime * 1000000.0);
332 std::cout <<
"Throughput for AC_VI with default TXOP limit (3.008ms): " << throughput <<
" Mbit/s" <<
'\n';
333 if (verifyResults && (throughput < 36 || throughput > 37))
335 NS_LOG_ERROR (
"Obtained throughput " << throughput <<
" is not in the expected boundaries!");
339 totalPacketsThrough = DynamicCast<UdpServer> (serverAppD.
Get (0))->GetReceived ();
340 throughput = totalPacketsThrough * payloadSize * 8 / (simulationTime * 1000000.0);
341 std::cout <<
"Throughput for AC_VI with non-default TXOP limit (0ms): " << throughput <<
" Mbit/s" <<
'\n';
342 if (verifyResults && (throughput < 31.5 || throughput > 32.5))
344 NS_LOG_ERROR (
"Obtained throughput " << throughput <<
" is not in the expected boundaries!");
void Set(std::string name, const AttributeValue &v)
holds a vector of ns3::Application pointers.
Smart pointer class similar to boost::intrusive_ptr.
AttributeValue implementation for Boolean.
holds a vector of std::pair of Ptr and interface index.
Ptr< YansWifiChannel > Create(void) const
void SetRemoteStationManager(std::string type, std::string n0="", const AttributeValue &v0=EmptyAttributeValue(), std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue())
Hold variables of type string.
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
Make it easy to create and manage PHY objects for the yans model.
static YansWifiChannelHelper Default(void)
Create a channel helper in a default working state.
static void Run(void)
Run the simulation.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
aggregate IP/TCP/UDP functionality to existing Nodes.
static YansWifiPhyHelper Default(void)
Create a phy helper in a default working state.
helps to create WifiNetDevice objects
A helper to make it easier to instantiate an ns3::OnOffApplication on a set of nodes.
void SetChannel(Ptr< YansWifiChannel > channel)
This queue contains packets for a particular access class.
void Install(Ptr< Node > node) const
"Layout" a single node according to the current position allocator type.
Hold an unsigned integer type.
holds a vector of ns3::NetDevice pointers
Create a server application which waits for input UDP packets and uses the information carried into t...
virtual NetDeviceContainer Install(const WifiPhyHelper &phy, const WifiMacHelper &mac, NodeContainer::Iterator first, NodeContainer::Iterator last) const
Ptr< NetDevice > GetDevice(uint32_t index) const
Retrieve the index-th NetDevice associated to this node.
void Start(Time start)
Arrange for all of the Applications in this container to Start() at the Time given as a parameter...
Parse command-line arguments.
static void Destroy(void)
Execute the events scheduled with ScheduleDestroy().
Every class exported by the ns3 library is enclosed in the ns3 namespace.
keep track of a set of node pointers.
Ptr< Application > Get(uint32_t i) const
Get the Ptr
stored in this container at a given index.
Hold objects of type Ptr.
void SetMobilityModel(std::string type, std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue(), std::string n8="", const AttributeValue &v8=EmptyAttributeValue(), std::string n9="", const AttributeValue &v9=EmptyAttributeValue())
void Install(std::string nodeName) const
Aggregate implementations of the ns3::Ipv4, ns3::Ipv6, ns3::Udp, and ns3::Tcp classes onto the provid...
manage and create wifi channel objects for the yans model.
void GetAttribute(std::string name, AttributeValue &value) const
Get the value of an attribute, raising fatal errors if unsuccessful.
create MAC layers for a ns3::WifiNetDevice.
void SetPcapDataLinkType(SupportedPcapDataLinkTypes dlt)
Set the data link type of PCAP traces to be used.
The IEEE 802.11 SSID Information Element.
virtual void SetType(std::string type, std::string n0="", const AttributeValue &v0=EmptyAttributeValue(), std::string n1="", const AttributeValue &v1=EmptyAttributeValue(), std::string n2="", const AttributeValue &v2=EmptyAttributeValue(), std::string n3="", const AttributeValue &v3=EmptyAttributeValue(), std::string n4="", const AttributeValue &v4=EmptyAttributeValue(), std::string n5="", const AttributeValue &v5=EmptyAttributeValue(), std::string n6="", const AttributeValue &v6=EmptyAttributeValue(), std::string n7="", const AttributeValue &v7=EmptyAttributeValue(), std::string n8="", const AttributeValue &v8=EmptyAttributeValue(), std::string n9="", const AttributeValue &v9=EmptyAttributeValue(), std::string n10="", const AttributeValue &v10=EmptyAttributeValue())
Helper class used to assign positions and mobility models to nodes.
void Stop(Time stop)
Arrange for all of the Applications in this container to Stop() at the Time given as a parameter...
Ipv4InterfaceContainer Assign(const NetDeviceContainer &c)
Assign IP addresses to the net devices specified in the container based on the current network prefix...
void SetTxopLimit(Time txopLimit)
Set the TXOP limit.
void AddValue(const std::string &name, const std::string &help, T &value)
Add a program argument, assigning to POD.
static void Stop(void)
Tell the Simulator the calling event should be the last one executed.
Ptr< Node > Get(uint32_t i) const
Get the Ptr stored in this container at a given index.
Time Seconds(double value)
Construct a Time in the indicated unit.
AttributeValue implementation for Ssid.
void Add(Vector v)
Add a position to the list of positions.
Ptr< WifiMac > GetMac(void) const
void Parse(int argc, char *argv[])
Parse the program arguments.
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
#define NS_LOG_ERROR(msg)
Use NS_LOG to output a message of level LOG_ERROR.
void Create(uint32_t n)
Create n nodes and append pointers to them to the end of this NodeContainer.
void EnablePcap(std::string prefix, Ptr< NetDevice > nd, bool promiscuous=false, bool explicitFilename=false)
Enable pcap output the indicated net device.
void SetPositionAllocator(Ptr< PositionAllocator > allocator)
Set the position allocator which will be used to allocate the initial position of every node initiali...
Include Radiotap link layer information.
void SetBase(Ipv4Address network, Ipv4Mask mask, Ipv4Address base="0.0.0.1")
Set the base network number, network mask and base address.
Ipv4Address GetAddress(uint32_t i, uint32_t j=0) const