A Discrete-Event Network Simulator
API
wifi-multi-tos.cc
Go to the documentation of this file.
1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2016
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Sebastien Deronne <sebastien.deronne@gmail.com>
19  */
20 
21 #include "ns3/command-line.h"
22 #include "ns3/config.h"
23 #include "ns3/uinteger.h"
24 #include "ns3/boolean.h"
25 #include "ns3/string.h"
26 #include "ns3/log.h"
27 #include "ns3/yans-wifi-helper.h"
28 #include "ns3/ssid.h"
29 #include "ns3/mobility-helper.h"
30 #include "ns3/internet-stack-helper.h"
31 #include "ns3/ipv4-address-helper.h"
32 #include "ns3/packet-sink-helper.h"
33 #include "ns3/on-off-helper.h"
34 #include "ns3/ipv4-global-routing-helper.h"
35 #include "ns3/packet-sink.h"
36 #include "ns3/yans-wifi-channel.h"
37 
38 // This is a simple example in order to show how to configure an IEEE 802.11n Wi-Fi network
39 // with multiple TOS. It outputs the aggregated UDP throughput, which depends on the number of
40 // stations, the HT MCS value (0 to 7), the channel width (20 or 40 MHz) and the guard interval
41 // (long or short). The user can also specify the distance between the access point and the
42 // stations (in meters), and can specify whether RTS/CTS is used or not.
43 
44 using namespace ns3;
45 
46 NS_LOG_COMPONENT_DEFINE ("WifiMultiTos");
47 
48 int main (int argc, char *argv[])
49 {
50  uint32_t nWifi = 4;
51  double simulationTime = 10; //seconds
52  double distance = 1.0; //meters
53  uint16_t mcs = 7;
54  uint8_t channelWidth = 20; //MHz
55  bool useShortGuardInterval = false;
56  bool useRts = false;
57 
58  CommandLine cmd (__FILE__);
59  cmd.AddValue ("nWifi", "Number of stations", nWifi);
60  cmd.AddValue ("distance", "Distance in meters between the stations and the access point", distance);
61  cmd.AddValue ("simulationTime", "Simulation time in seconds", simulationTime);
62  cmd.AddValue ("useRts", "Enable/disable RTS/CTS", useRts);
63  cmd.AddValue ("mcs", "MCS value (0 - 7)", mcs);
64  cmd.AddValue ("channelWidth", "Channel width in MHz", channelWidth);
65  cmd.AddValue ("useShortGuardInterval", "Enable/disable short guard interval", useShortGuardInterval);
66  cmd.Parse (argc,argv);
67 
69  wifiStaNodes.Create (nWifi);
71  wifiApNode.Create (1);
72 
75  phy.SetChannel (channel.Create ());
76 
79  wifi.SetStandard (WIFI_STANDARD_80211n_5GHZ);
80 
81  std::ostringstream oss;
82  oss << "HtMcs" << mcs;
83  wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager",
84  "DataMode", StringValue (oss.str ()),
85  "ControlMode", StringValue (oss.str ()),
86  "RtsCtsThreshold", UintegerValue (useRts ? 0 : 999999));
87 
88  Ssid ssid = Ssid ("ns3-80211n");
89 
90  mac.SetType ("ns3::StaWifiMac",
91  "Ssid", SsidValue (ssid));
92 
94  staDevices = wifi.Install (phy, mac, wifiStaNodes);
95 
96  mac.SetType ("ns3::ApWifiMac",
97  "Ssid", SsidValue (ssid));
98 
99  NetDeviceContainer apDevice;
100  apDevice = wifi.Install (phy, mac, wifiApNode);
101 
102  // Set channel width
103  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/ChannelWidth", UintegerValue (channelWidth));
104 
105  // Set guard interval
106  Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/ShortGuardIntervalSupported", BooleanValue (useShortGuardInterval));
107 
108  // mobility
110  Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
111  positionAlloc->Add (Vector (0.0, 0.0, 0.0));
112  for (uint32_t i = 0; i < nWifi; i++)
113  {
114  positionAlloc->Add (Vector (distance, 0.0, 0.0));
115  }
116  mobility.SetPositionAllocator (positionAlloc);
117  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
118  mobility.Install (wifiApNode);
119  mobility.Install (wifiStaNodes);
120 
121  // Internet stack
123  stack.Install (wifiApNode);
124  stack.Install (wifiStaNodes);
126 
127  address.SetBase ("192.168.1.0", "255.255.255.0");
128  Ipv4InterfaceContainer staNodeInterfaces, apNodeInterface;
129 
130  staNodeInterfaces = address.Assign (staDevices);
131  apNodeInterface = address.Assign (apDevice);
132 
133  // Setting applications
134  ApplicationContainer sourceApplications, sinkApplications;
135  std::vector<uint8_t> tosValues = {0x70, 0x28, 0xb8, 0xc0}; //AC_BE, AC_BK, AC_VI, AC_VO
136  uint32_t portNumber = 9;
137  for (uint32_t index = 0; index < nWifi; ++index)
138  {
139  for (uint8_t tosValue : tosValues)
140  {
141  auto ipv4 = wifiApNode.Get (0)->GetObject<Ipv4> ();
142  const auto address = ipv4->GetAddress (1, 0).GetLocal ();
143  InetSocketAddress sinkSocket (address, portNumber++);
144  sinkSocket.SetTos (tosValue);
145  OnOffHelper onOffHelper ("ns3::UdpSocketFactory", sinkSocket);
146  onOffHelper.SetAttribute ("OnTime", StringValue ("ns3::ConstantRandomVariable[Constant=1]"));
147  onOffHelper.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0]"));
148  onOffHelper.SetAttribute ("DataRate", DataRateValue (50000000 / nWifi));
149  onOffHelper.SetAttribute ("PacketSize", UintegerValue (1472)); //bytes
150  sourceApplications.Add (onOffHelper.Install (wifiStaNodes.Get (index)));
151  PacketSinkHelper packetSinkHelper ("ns3::UdpSocketFactory", sinkSocket);
152  sinkApplications.Add (packetSinkHelper.Install (wifiApNode.Get (0)));
153  }
154  }
155 
156  sinkApplications.Start (Seconds (0.0));
157  sinkApplications.Stop (Seconds (simulationTime + 1));
158  sourceApplications.Start (Seconds (1.0));
159  sourceApplications.Stop (Seconds (simulationTime + 1));
160 
162 
163  Simulator::Stop (Seconds (simulationTime + 1));
164  Simulator::Run ();
165 
166  double throughput = 0;
167  for (uint32_t index = 0; index < sinkApplications.GetN (); ++index)
168  {
169  uint64_t totalPacketsThrough = DynamicCast<PacketSink> (sinkApplications.Get (index))->GetTotalRx ();
170  throughput += ((totalPacketsThrough * 8) / (simulationTime * 1000000.0)); //Mbit/s
171  }
172 
174 
175  if (throughput > 0)
176  {
177  std::cout << "Aggregated throughput: " << throughput << " Mbit/s" << std::endl;
178  }
179  else
180  {
181  NS_LOG_ERROR ("Obtained throughput is 0!");
182  exit (1);
183  }
184 
185  return 0;
186 }
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 Add(ApplicationContainer other)
Append the contents of another ApplicationContainer to the end of this container.
void Stop(Time stop)
Arrange for all of the Applications in this container to Stop() at the Time given as a parameter.
uint32_t GetN(void) const
Get the number of Ptr<Application> stored in this container.
AttributeValue implementation for Boolean.
Definition: boolean.h:37
Parse command-line arguments.
Definition: command-line.h:229
AttributeValue implementation for DataRate.
Definition: data-rate.h:298
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 void PopulateRoutingTables(void)
Build a routing database and initialize the routing tables of the nodes in the simulation.
Access to the IPv4 forwarding table, interfaces, and configuration.
Definition: ipv4.h:77
holds a vector of std::pair of Ptr<Ipv4> and interface index.
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.
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.
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:74
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
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
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.
manage and create wifi channel objects for the YANS model.
static YansWifiChannelHelper Default(void)
Create a channel helper in a default working state.
Make it easy to create and manage PHY objects for the YANS model.
void Set(std::string path, const AttributeValue &value)
Definition: config.cc:839
#define NS_LOG_ERROR(msg)
Use NS_LOG to output a message of level LOG_ERROR.
Definition: log.h:257
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
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.
cmd
Definition: second.py:35
staDevices
Definition: third.py:103
ssid
Definition: third.py:100
channel
Definition: third.py:92
nWifi
Definition: third.py:43
mac
Definition: third.py:99
wifi
Definition: third.py:96
wifiApNode
Definition: third.py:90
mobility
Definition: third.py:108
wifiStaNodes
Definition: third.py:88
phy
Definition: third.py:93