A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
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 // ./waf --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 // ./waf --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 // ./waf --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 // ./waf --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 
113 using namespace ns3;
114 
115 NS_LOG_COMPONENT_DEFINE ("TapDumbbellExample");
116 
117 int
118 main (int argc, char *argv[])
119 {
120  std::string mode = "ConfigureLocal";
121  std::string tapName = "thetap";
122 
123  CommandLine cmd;
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 
140  wifiPhy.SetChannel (wifiChannel.Create ());
141 
142  Ssid ssid = Ssid ("left");
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 
157  MobilityHelper mobility;
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  //
194  PointToPointHelper p2p;
195  p2p.SetDeviceAttribute ("DataRate", StringValue ("512kbps"));
196  p2p.SetChannelAttribute ("Delay", StringValue ("10ms"));
197 
198  NodeContainer nodes = NodeContainer (nodesLeft.Get (3), nodesRight.Get (0));
199  NetDeviceContainer devices = p2p.Install (nodes);
200 
201  Ipv4AddressHelper ipv4;
202  ipv4.SetBase ("10.1.2.0", "255.255.255.192");
203  Ipv4InterfaceContainer interfaces = ipv4.Assign (devices);
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);
225 
226  Simulator::Stop (Seconds (60.));
227  Simulator::Run ();
229 }