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