A Discrete-Event Network Simulator
API
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 
115 using namespace ns3;
116 
117 NS_LOG_COMPONENT_DEFINE("TapDumbbellExample");
118 
119 int
120 main(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));
204  NetDeviceContainer devices = p2p.Install(nodes);
205 
207  ipv4.SetBase("10.1.2.0", "255.255.255.192");
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 
231  Simulator::Stop(Seconds(60.));
232  Simulator::Run();
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.
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
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:44
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
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...
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
void(* DataRate)(DataRate oldValue, DataRate newValue)
TracedValue callback signature for DataRate.
Definition: data-rate.h:327
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1326
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
Definition: nstime.h:1338
@ WIFI_STANDARD_80211a
NodeContainer nodes
devices
Definition: first.py:42
interfaces
Definition: first.py:50
Every class exported by the ns3 library is enclosed in the ns3 namespace.
cmd
Definition: second.py:40
ssid
Definition: third.py:93
wifi
Definition: third.py:95
mobility
Definition: third.py:105
Ptr< PacketSink > sink
Pointer to the packet sink application.
Definition: wifi-tcp.cc:55