A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
wifi-timing-attributes.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2015
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 *
6 * Author: Sebastien Deronne <sebastien.deronne@gmail.com>
7 */
8
9#include "ns3/command-line.h"
10#include "ns3/config.h"
11#include "ns3/double.h"
12#include "ns3/internet-stack-helper.h"
13#include "ns3/ipv4-address-helper.h"
14#include "ns3/ipv4-global-routing-helper.h"
15#include "ns3/log.h"
16#include "ns3/mobility-helper.h"
17#include "ns3/mobility-model.h"
18#include "ns3/ssid.h"
19#include "ns3/string.h"
20#include "ns3/udp-client-server-helper.h"
21#include "ns3/udp-server.h"
22#include "ns3/uinteger.h"
23#include "ns3/yans-wifi-channel.h"
24#include "ns3/yans-wifi-helper.h"
25
26// This example shows how to set Wi-Fi timing parameters through WifiMac attributes.
27//
28// Example: set slot time to 20 microseconds, while keeping other values as defined in the
29// simulation script:
30//
31// ./ns3 run "wifi-timing-attributes --slot=20us"
32//
33// Network topology:
34//
35// Wifi 192.168.1.0
36//
37// AP
38// * *
39// | |
40// n1 n2
41
42using namespace ns3;
43
44NS_LOG_COMPONENT_DEFINE("wifi-timing-attributes");
45
46int
47main(int argc, char* argv[])
48{
49 Time slot{"9us"}; // slot time
50 Time sifs{"10us"}; // SIFS duration
51 Time pifs{"19us"}; // PIFS duration
52 Time simulationTime{"10s"}; // Simulation time
53
54 CommandLine cmd(__FILE__);
55 cmd.AddValue("slot", "Slot time", slot);
56 cmd.AddValue("sifs", "SIFS duration", sifs);
57 cmd.AddValue("pifs", "PIFS duration", pifs);
58 cmd.AddValue("simulationTime", "Simulation time", simulationTime);
59 cmd.Parse(argc, argv);
60
61 // Since default reference loss is defined for 5 GHz, it needs to be changed when operating
62 // at 2.4 GHz
63 Config::SetDefault("ns3::LogDistancePropagationLossModel::ReferenceLoss", DoubleValue(40.046));
64
65 // Create nodes
66 NodeContainer wifiStaNode;
67 wifiStaNode.Create(1);
69 wifiApNode.Create(1);
70
71 // Create wireless channel
74 phy.SetChannel(channel.Create());
75
76 // Default IEEE 802.11n (2.4 GHz)
78 wifi.SetStandard(WIFI_STANDARD_80211n);
79 wifi.SetRemoteStationManager("ns3::ConstantRateWifiManager",
80 "DataMode",
81 StringValue("HtMcs7"),
82 "ControlMode",
83 StringValue("HtMcs0"));
85
86 // Install PHY and MAC
87 Ssid ssid = Ssid("ns3-wifi");
88 mac.SetType("ns3::StaWifiMac", "Ssid", SsidValue(ssid));
89
90 NetDeviceContainer staDevice;
91 staDevice = wifi.Install(phy, mac, wifiStaNode);
92
93 mac.SetType("ns3::ApWifiMac", "Ssid", SsidValue(ssid));
94
95 NetDeviceContainer apDevice;
96 apDevice = wifi.Install(phy, mac, wifiApNode);
97
98 // Once install is done, we overwrite the standard timing values
99 Config::Set("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/Slot", TimeValue(slot));
100 Config::Set("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/Sifs", TimeValue(sifs));
101 Config::Set("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/Pifs", TimeValue(pifs));
102
103 // Mobility
106
107 positionAlloc->Add(Vector(0.0, 0.0, 0.0));
108 positionAlloc->Add(Vector(1.0, 0.0, 0.0));
109 mobility.SetPositionAllocator(positionAlloc);
110
111 mobility.SetMobilityModel("ns3::ConstantPositionMobilityModel");
112
113 mobility.Install(wifiApNode);
114 mobility.Install(wifiStaNode);
115
116 // Internet stack
118 stack.Install(wifiApNode);
119 stack.Install(wifiStaNode);
120
122
123 address.SetBase("192.168.1.0", "255.255.255.0");
124 Ipv4InterfaceContainer staNodeInterface;
125 Ipv4InterfaceContainer apNodeInterface;
126
127 staNodeInterface = address.Assign(staDevice);
128 apNodeInterface = address.Assign(apDevice);
129
130 // Setting applications
131 uint16_t port = 9;
133 ApplicationContainer serverApp = server.Install(wifiStaNode.Get(0));
134 serverApp.Start(Seconds(0.0));
135 serverApp.Stop(simulationTime + Seconds(1.0));
136
137 UdpClientHelper client(staNodeInterface.GetAddress(0), port);
138 client.SetAttribute("MaxPackets", UintegerValue(4294967295U));
139 client.SetAttribute("Interval", TimeValue(Time("0.0001"))); // packets/s
140 client.SetAttribute("PacketSize", UintegerValue(1472)); // bytes
141
142 ApplicationContainer clientApp = client.Install(wifiApNode.Get(0));
143 clientApp.Start(Seconds(1.0));
144 clientApp.Stop(simulationTime + Seconds(1.0));
145
146 // Populate routing table
148
149 // Set simulation time and launch simulation
150 Simulator::Stop(simulationTime + Seconds(1.0));
152
153 // Get and print results
154 double totalPacketsThrough = DynamicCast<UdpServer>(serverApp.Get(0))->GetReceived();
155 auto throughput = totalPacketsThrough * 1472 * 8 / simulationTime.GetMicroSeconds(); // Mbit/s
156 std::cout << "Throughput: " << throughput << " Mbit/s" << std::endl;
157
159 return 0;
160}
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.
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Definition double.h:31
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()
Build a routing database and initialize the routing tables of the nodes in the simulation.
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.
Smart pointer class similar to boost::intrusive_ptr.
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
Definition simulator.cc:131
static void Run()
Run the simulation.
Definition simulator.cc:167
static void Stop()
Tell the Simulator the calling event should be the last one executed.
Definition simulator.cc:175
The IEEE 802.11 SSID Information Element.
Definition ssid.h:25
Hold variables of type string.
Definition string.h:45
Simulation virtual time values and global simulation resolution.
Definition nstime.h:94
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.
Definition uinteger.h:34
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.
uint16_t port
Definition dsdv-manet.cc:33
void SetDefault(std::string name, const AttributeValue &value)
Definition config.cc:883
void Set(std::string path, const AttributeValue &value)
Definition config.cc:869
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition log.h:191
Ptr< T > CreateObject(Args &&... args)
Create an object by type, with varying number of constructor parameters.
Definition object.h:619
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition nstime.h:1308
@ WIFI_STANDARD_80211n
address
Definition first.py:36
stack
Definition first.py:33
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Ptr< T1 > DynamicCast(const Ptr< T2 > &p)
Cast a Ptr.
Definition ptr.h:580
ssid
Definition third.py:82
channel
Definition third.py:77
mac
Definition third.py:81
wifi
Definition third.py:84
wifiApNode
Definition third.py:75
mobility
Definition third.py:92
phy
Definition third.py:78
std::ofstream throughput