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
44using namespace ns3;
45
46NS_LOG_COMPONENT_DEFINE ("WifiMultiTos");
47
48int 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
73 YansWifiChannelHelper channel = YansWifiChannelHelper::Default ();
75 phy.SetChannel (channel.Create ());
76
79 wifi.SetStandard (WIFI_STANDARD_80211n);
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/ChannelSettings",
104 StringValue ("{0, " + std::to_string (channelWidth) + ", BAND_2_4GHZ, 0}"));
105
106 // Set guard interval
107 Config::Set ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/HtConfiguration/ShortGuardIntervalSupported", BooleanValue (useShortGuardInterval));
108
109 // mobility
111 Ptr<ListPositionAllocator> positionAlloc = CreateObject<ListPositionAllocator> ();
112 positionAlloc->Add (Vector (0.0, 0.0, 0.0));
113 for (uint32_t i = 0; i < nWifi; i++)
114 {
115 positionAlloc->Add (Vector (distance, 0.0, 0.0));
116 }
117 mobility.SetPositionAllocator (positionAlloc);
118 mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
119 mobility.Install (wifiApNode);
120 mobility.Install (wifiStaNodes);
121
122 // Internet stack
124 stack.Install (wifiApNode);
125 stack.Install (wifiStaNodes);
127
128 address.SetBase ("192.168.1.0", "255.255.255.0");
129 Ipv4InterfaceContainer staNodeInterfaces, apNodeInterface;
130
131 staNodeInterfaces = address.Assign (staDevices);
132 apNodeInterface = address.Assign (apDevice);
133
134 // Setting applications
135 ApplicationContainer sourceApplications, sinkApplications;
136 std::vector<uint8_t> tosValues = {0x70, 0x28, 0xb8, 0xc0}; //AC_BE, AC_BK, AC_VI, AC_VO
137 uint32_t portNumber = 9;
138 for (uint32_t index = 0; index < nWifi; ++index)
139 {
140 for (uint8_t tosValue : tosValues)
141 {
142 auto ipv4 = wifiApNode.Get (0)->GetObject<Ipv4> ();
143 const auto address = ipv4->GetAddress (1, 0).GetLocal ();
144 InetSocketAddress sinkSocket (address, portNumber++);
145 sinkSocket.SetTos (tosValue);
146 OnOffHelper onOffHelper ("ns3::UdpSocketFactory", sinkSocket);
147 onOffHelper.SetAttribute ("OnTime", StringValue ("ns3::ConstantRandomVariable[Constant=1]"));
148 onOffHelper.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0]"));
149 onOffHelper.SetAttribute ("DataRate", DataRateValue (50000000 / nWifi));
150 onOffHelper.SetAttribute ("PacketSize", UintegerValue (1472)); //bytes
151 sourceApplications.Add (onOffHelper.Install (wifiStaNodes.Get (index)));
152 PacketSinkHelper packetSinkHelper ("ns3::UdpSocketFactory", sinkSocket);
153 sinkApplications.Add (packetSinkHelper.Install (wifiApNode.Get (0)));
154 }
155 }
156
157 sinkApplications.Start (Seconds (0.0));
158 sinkApplications.Stop (Seconds (simulationTime + 1));
159 sourceApplications.Start (Seconds (1.0));
160 sourceApplications.Stop (Seconds (simulationTime + 1));
161
162 Ipv4GlobalRoutingHelper::PopulateRoutingTables ();
163
164 Simulator::Stop (Seconds (simulationTime + 1));
165 Simulator::Run ();
166
167 double throughput = 0;
168 for (uint32_t index = 0; index < sinkApplications.GetN (); ++index)
169 {
170 uint64_t totalPacketsThrough = DynamicCast<PacketSink> (sinkApplications.Get (index))->GetTotalRx ();
171 throughput += ((totalPacketsThrough * 8) / (simulationTime * 1000000.0)); //Mbit/s
172 }
173
174 Simulator::Destroy ();
175
176 if (throughput > 0)
177 {
178 std::cout << "Aggregated throughput: " << throughput << " Mbit/s" << std::endl;
179 }
180 else
181 {
182 NS_LOG_ERROR ("Obtained throughput is 0!");
183 exit (1);
184 }
185
186 return 0;
187}
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.
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.
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
The IEEE 802.11 SSID Information Element.
Definition: ssid.h:36
AttributeValue implementation for Ssid.
Hold variables of type string.
Definition: string.h:41
Hold an unsigned integer type.
Definition: uinteger.h:44
Vector3D Vector
Vector alias typedef for compatibility with mobility models.
Definition: vector.h:324
helps to create WifiNetDevice objects
Definition: wifi-helper.h:323
create MAC layers for a ns3::WifiNetDevice.
manage and create wifi channel objects for the YANS model.
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
@ WIFI_STANDARD_80211n
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:102
ssid
Definition: third.py:97
channel
Definition: third.py:92
nWifi
Definition: third.py:43
mac
Definition: third.py:96
wifi
Definition: third.py:99
wifiApNode
Definition: third.py:90
mobility
Definition: third.py:107
wifiStaNodes
Definition: third.py:88
phy
Definition: third.py:93