A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
tap-wifi-dumbbell.cc
Go to the documentation of this file.
1/*
2 * This program is free software; you can redistribute it and/or modify
3 * it under the terms of the GNU General Public License version 2 as
4 * published by the Free Software Foundation;
5 *
6 * This program is distributed in the hope that it will be useful,
7 * but WITHOUT ANY WARRANTY; without even the implied warranty of
8 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9 * GNU General Public License for more details.
10 *
11 * You should have received a copy of the GNU General Public License
12 * along with this program; if not, write to the Free Software
13 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
14 */
15
16// Network topology
17//
18// +----------+
19// | external |
20// | Linux |
21// | Host |
22// | |
23// | "mytap" |
24// +----------+
25// | n0 n3 n4
26// | +--------+ +------------+ +------------+
27// +-------| tap | | | | |
28// | bridge | ... | | | |
29// +--------+ +------------+ +------------+
30// | Wifi | | Wifi | P2P |-----| P2P | CSMA |
31// +--------+ +------+-----+ +-----+------+
32// | | ^ |
33// ((*)) ((*)) | |
34// P2P 10.1.2 |
35// ((*)) ((*)) | n5 n6 n7
36// | | | | | |
37// n1 n2 ================
38// Wifi 10.1.1 CSMA LAN 10.1.3
39//
40// The Wifi device on node zero is: 10.1.1.1
41// The Wifi device on node one is: 10.1.1.2
42// The Wifi device on node two is: 10.1.1.3
43// The Wifi device on node three is: 10.1.1.4
44// The P2P device on node three is: 10.1.2.1
45// The P2P device on node four is: 10.1.2.2
46// The CSMA device on node four is: 10.1.3.1
47// The CSMA device on node five is: 10.1.3.2
48// The CSMA device on node six is: 10.1.3.3
49// The CSMA device on node seven is: 10.1.3.4
50//
51// Some simple things to do:
52//
53// 1) Ping one of the simulated nodes on the left side of the topology.
54//
55// ./ns3 run --enable-sudo tap-wifi-dumbbell&
56// ping 10.1.1.3
57//
58// 2) Configure a route in the linux host and ping once of the nodes on the
59// right, across the point-to-point link. You will see relatively large
60// delays due to CBR background traffic on the point-to-point (see next
61// item).
62//
63// ./ns3 run --enable-sudo tap-wifi-dumbbell&
64// sudo ip route add 10.1.3.0/24 dev thetap via 10.1.1.2
65// ping 10.1.3.4
66//
67// Take a look at the pcap traces and note that the timing reflects the
68// addition of the significant delay and low bandwidth configured on the
69// point-to-point link along with the high traffic.
70//
71// 3) Fiddle with the background CBR traffic across the point-to-point
72// link and watch the ping timing change. The OnOffApplication "DataRate"
73// attribute defaults to 500kb/s and the "PacketSize" Attribute defaults
74// to 512. The point-to-point "DataRate" is set to 512kb/s in the script,
75// so in the default case, the link is pretty full. This should be
76// reflected in large delays seen by ping. You can crank down the CBR
77// traffic data rate and watch the ping timing change dramatically.
78//
79// ./ns3 run --enable-sudo "tap-wifi-dumbbell --ns3::OnOffApplication::DataRate=100kb/s"&
80// sudo ip route add 10.1.3.0/24 dev thetap via 10.1.1.2
81// ping 10.1.3.4
82//
83// 4) Try to run this in UseBridge mode. This allows you to bridge an ns-3
84// simulation to an existing pre-configured bridge. This uses tap devices
85// just for illustration, you can create your own bridge if you want.
86// The "--enable-sudo" option to "./ns3 run" is not needed in this case
87// because devices are being created outside of ns-3 execution.
88//
89// sudo ip tuntap add mode tap mytap1
90// sudo ip link set mytap1 promisc on up
91// sudo ip tuntap add mode tap mytap2
92// sudo ip link set mytap2 promisc on up
93// sudo ip link add mybridge type bridge
94// sudo ip link set dev mytap1 master mybridge
95// sudo ip link set dev mytap2 master mybridge
96// sudo ip address add 10.1.1.5/24 dev mybridge
97// sudo ip link set dev mybridge up
98// ./ns3 run "tap-wifi-dumbbell --mode=UseBridge --tapName=mytap2"&
99// ping 10.1.1.3
100
101#include "ns3/applications-module.h"
102#include "ns3/core-module.h"
103#include "ns3/csma-module.h"
104#include "ns3/internet-module.h"
105#include "ns3/ipv4-global-routing-helper.h"
106#include "ns3/mobility-module.h"
107#include "ns3/network-module.h"
108#include "ns3/point-to-point-module.h"
109#include "ns3/tap-bridge-module.h"
110#include "ns3/wifi-module.h"
111
112#include <fstream>
113#include <iostream>
114
115using namespace ns3;
116
117NS_LOG_COMPONENT_DEFINE("TapDumbbellExample");
118
119int
120main(int argc, char* argv[])
121{
122 std::string mode = "ConfigureLocal";
123 std::string tapName = "thetap";
124
125 CommandLine cmd(__FILE__);
126 cmd.AddValue("mode", "Mode setting of TapBridge", mode);
127 cmd.AddValue("tapName", "Name of the OS tap device", tapName);
128 cmd.Parse(argc, argv);
129
130 GlobalValue::Bind("SimulatorImplementationType", StringValue("ns3::RealtimeSimulatorImpl"));
131 GlobalValue::Bind("ChecksumEnabled", BooleanValue(true));
132
133 //
134 // The topology has a Wifi network of four nodes on the left side. We'll make
135 // node zero the AP and have the other three will be the STAs.
136 //
137 NodeContainer nodesLeft;
138 nodesLeft.Create(4);
139
140 YansWifiPhyHelper wifiPhy;
142 wifiPhy.SetChannel(wifiChannel.Create());
143
144 Ssid ssid = Ssid("left");
146 WifiMacHelper wifiMac;
147 wifi.SetStandard(WIFI_STANDARD_80211a);
148
149 wifiMac.SetType("ns3::ApWifiMac", "Ssid", SsidValue(ssid));
150 NetDeviceContainer devicesLeft = wifi.Install(wifiPhy, wifiMac, nodesLeft.Get(0));
151
152 wifiMac.SetType("ns3::StaWifiMac",
153 "Ssid",
154 SsidValue(ssid),
155 "ActiveProbing",
156 BooleanValue(false));
157 devicesLeft.Add(
158 wifi.Install(wifiPhy,
159 wifiMac,
160 NodeContainer(nodesLeft.Get(1), nodesLeft.Get(2), nodesLeft.Get(3))));
161
163 mobility.Install(nodesLeft);
164
165 InternetStackHelper internetLeft;
166 internetLeft.Install(nodesLeft);
167
168 Ipv4AddressHelper ipv4Left;
169 ipv4Left.SetBase("10.1.1.0", "255.255.255.0");
170 Ipv4InterfaceContainer interfacesLeft = ipv4Left.Assign(devicesLeft);
171
172 TapBridgeHelper tapBridge(interfacesLeft.GetAddress(1));
173 tapBridge.SetAttribute("Mode", StringValue(mode));
174 tapBridge.SetAttribute("DeviceName", StringValue(tapName));
175 tapBridge.Install(nodesLeft.Get(0), devicesLeft.Get(0));
176
177 //
178 // Now, create the right side.
179 //
180 NodeContainer nodesRight;
181 nodesRight.Create(4);
182
183 CsmaHelper csmaRight;
184 csmaRight.SetChannelAttribute("DataRate", DataRateValue(5000000));
185 csmaRight.SetChannelAttribute("Delay", TimeValue(MilliSeconds(2)));
186
187 NetDeviceContainer devicesRight = csmaRight.Install(nodesRight);
188
189 InternetStackHelper internetRight;
190 internetRight.Install(nodesRight);
191
192 Ipv4AddressHelper ipv4Right;
193 ipv4Right.SetBase("10.1.3.0", "255.255.255.0");
194 Ipv4InterfaceContainer interfacesRight = ipv4Right.Assign(devicesRight);
195
196 //
197 // Stick in the point-to-point line between the sides.
198 //
200 p2p.SetDeviceAttribute("DataRate", StringValue("512kbps"));
201 p2p.SetChannelAttribute("Delay", StringValue("10ms"));
202
203 NodeContainer nodes = NodeContainer(nodesLeft.Get(3), nodesRight.Get(0));
205
207 ipv4.SetBase("10.1.2.0", "255.255.255.192");
208 Ipv4InterfaceContainer interfaces = ipv4.Assign(devices);
209
210 //
211 // Simulate some CBR traffic over the point-to-point link
212 //
213 uint16_t port = 9; // Discard port (RFC 863)
214 OnOffHelper onoff("ns3::UdpSocketFactory", InetSocketAddress(interfaces.GetAddress(1), port));
215 onoff.SetConstantRate(DataRate("500kb/s"));
216
217 ApplicationContainer apps = onoff.Install(nodesLeft.Get(3));
218 apps.Start(Seconds(1.0));
219
220 // Create a packet sink to receive these packets
221 PacketSinkHelper sink("ns3::UdpSocketFactory", InetSocketAddress(Ipv4Address::GetAny(), port));
222
223 apps = sink.Install(nodesRight.Get(0));
224 apps.Start(Seconds(1.0));
225
226 wifiPhy.EnablePcapAll("tap-wifi-dumbbell");
227
228 csmaRight.EnablePcapAll("tap-wifi-dumbbell", false);
230
234
235 return 0;
236}
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.
AttributeValue implementation for Boolean.
Definition: boolean.h:37
Parse command-line arguments.
Definition: command-line.h:232
build a set of CsmaNetDevice objects
Definition: csma-helper.h:48
void SetChannelAttribute(std::string n1, const AttributeValue &v1)
Definition: csma-helper.cc:56
NetDeviceContainer Install(Ptr< Node > node) const
This method creates an ns3::CsmaChannel with the attributes configured by CsmaHelper::SetChannelAttri...
Definition: csma-helper.cc:226
Class for representing data rates.
Definition: data-rate.h:89
AttributeValue implementation for DataRate.
Definition: data-rate.h:296
static void Bind(std::string name, const AttributeValue &value)
Iterate over the set of GlobalValues until a matching name is found and then set its value with Globa...
an Inet address class
aggregate IP/TCP/UDP functionality to existing Nodes.
void Install(std::string nodeName) const
Aggregate implementations of the ns3::Ipv4, ns3::Ipv6, ns3::Udp, and ns3::Tcp classes onto the provid...
A helper class to make life easier while doing simple IPv4 address assignment in scripts.
void SetBase(Ipv4Address network, Ipv4Mask mask, Ipv4Address base="0.0.0.1")
Set the base network number, network mask and base address.
Ipv4InterfaceContainer Assign(const NetDeviceContainer &c)
Assign IP addresses to the net devices specified in the container based on the current network prefix...
static Ipv4Address GetAny()
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
void Add(NetDeviceContainer other)
Append the contents of another NetDeviceContainer to the end of this container.
Ptr< NetDevice > Get(uint32_t i) const
Get the Ptr<NetDevice> stored in this container at a given index.
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.
A helper to make it easier to instantiate an ns3::OnOffApplication on a set of nodes.
Definition: on-off-helper.h:37
A helper to make it easier to instantiate an ns3::PacketSinkApplication on a set of nodes.
void EnablePcapAll(std::string prefix, bool promiscuous=false)
Enable pcap output on each device (which is of the appropriate type) in the set of all nodes created ...
Build a set of PointToPointNetDevice objects.
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
Definition: simulator.cc:142
static void Run()
Run the simulation.
Definition: simulator.cc:178
static void Stop()
Tell the Simulator the calling event should be the last one executed.
Definition: simulator.cc:186
The IEEE 802.11 SSID Information Element.
Definition: ssid.h:36
AttributeValue implementation for Ssid.
Definition: ssid.h:96
Hold variables of type string.
Definition: string.h:56
build TapBridge to allow ns-3 simulations to interact with Linux tap devices and processes on the Lin...
AttributeValue implementation for Time.
Definition: nstime.h:1406
helps to create WifiNetDevice objects
Definition: wifi-helper.h:324
create MAC layers for a ns3::WifiNetDevice.
void SetType(std::string type, Args &&... args)
manage and create wifi channel objects for the YANS model.
static YansWifiChannelHelper Default()
Create a channel helper in a default working state.
Ptr< YansWifiChannel > Create() const
Make it easy to create and manage PHY objects for the YANS model.
void SetChannel(Ptr< YansWifiChannel > channel)
uint16_t port
Definition: dsdv-manet.cc:44
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:202
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1319
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:1331
@ WIFI_STANDARD_80211a
NodeContainer nodes
ns devices
Definition: first.py:42
ns interfaces
Definition: first.py:50
Every class exported by the ns3 library is enclosed in the ns3 namespace.
ns cmd
Definition: second.py:40
ns wifi
Definition: third.py:95
ns ssid
Definition: third.py:93
ns mobility
Definition: third.py:105
Ptr< PacketSink > sink
Pointer to the packet sink application.
Definition: wifi-tcp.cc:55