add a wifi example for the tap bridge
authorCraig Dowell <craigdo@ee.washington.edu>
Mon, 02 Feb 2009 11:39:18 -0800
changeset 4177 1212830d6f76
parent 4176 0246ffdff112
child 4178 bd8625e5913a
add a wifi example for the tap bridge
examples/tap-dumbbell.cc
examples/tap-wifi-dumbbell.cc
examples/wscript
--- a/examples/tap-dumbbell.cc	Mon Feb 02 10:12:29 2009 -0800
+++ b/examples/tap-dumbbell.cc	Mon Feb 02 11:39:18 2009 -0800
@@ -59,7 +59,9 @@
 //    movement reflects the delay configured on the CSMA lan.
 //
 // 2) Configure a route in the linux host and ping once of the nodes on the 
-//    right, across the point-to-point link.
+//    right, across the point-to-point link.  You will see relatively large
+//    delays due to CBR background traffic on the point-to-point (see next
+//    item).
 //
 //    ./waf --run tap-dumbbell&
 //    sudo route add -net 10.1.3.0 netmask 255.255.255.0 dev left gw 10.1.1.2
@@ -67,12 +69,17 @@
 //
 //    Take a look at the pcap traces and note that the timing reflects the 
 //    addition of the significant delay and low bandwidth configured on the 
-//    point-to-point link.
+//    point-to-point link along with the high traffic.
 //
 // 3) Fiddle with the background CBR traffic across the point-to-point 
-//    link and watch the ping timing change.
+//    link and watch the ping timing change.  The OnOffApplication "DataRate"
+//    attribute defaults to 500kb/s and the "PacketSize" Attribute defaults
+//    to 512.  The point-to-point "DataRate" is set to 512kb/s in the script,
+//    so in the default case, the link is pretty full.  This should be 
+//    reflected in large delays seen by ping.  You can crank down the CBR 
+//    traffic data rate and watch the ping timing change dramatically.
 //
-//    ./waf --run "tap-dumbbell --ns3::OnOffApplication::DataRate=500kb/s"&
+//    ./waf --run "tap-dumbbell --ns3::OnOffApplication::DataRate=100kb/s"&
 //    sudo route add -net 10.1.3.0 netmask 255.255.255.0 dev left gw 10.1.1.2
 //    ping 10.1.3.4
 //
@@ -169,19 +176,15 @@
   OnOffHelper onoff ("ns3::UdpSocketFactory", InetSocketAddress (interfaces.GetAddress (1), port));
   onoff.SetAttribute ("OnTime", RandomVariableValue (ConstantVariable (1)));
   onoff.SetAttribute ("OffTime", RandomVariableValue (ConstantVariable (0)));
-  onoff.SetAttribute ("DataRate", StringValue ("256kb/s"));
-  onoff.SetAttribute ("PacketSize", UintegerValue (512));
 
   ApplicationContainer apps = onoff.Install (nodesLeft.Get (3));
   apps.Start (Seconds (1.0));
-  apps.Stop (Seconds (10.0));
 
   // Create a packet sink to receive these packets
   PacketSinkHelper sink ("ns3::UdpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), port));
 
   apps = sink.Install (nodesRight.Get (0));
   apps.Start (Seconds (1.0));
-  apps.Stop (Seconds (10.0));
 
   CsmaHelper::EnablePcapAll ("tap-dumbbell");
   GlobalRouteManager::PopulateRoutingTables ();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/tap-wifi-dumbbell.cc	Mon Feb 02 11:39:18 2009 -0800
@@ -0,0 +1,213 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+// Network topology
+//
+//  +----------+                                                                  
+//  | external |                                                                  
+//  |  Linux   |                                                                  
+//  |   Host   |                                                                  
+//  |  "left"  |                                                                  
+//  +----------+                                                                  
+//       |           n0                n3                n4
+//       |       +--------+     +------------+     +------------+
+//       +-------|  tap   |     |            |     |            |
+//               | bridge | ... |            |     |            |
+//               +--------+     +------------+     +------------+
+//               |  Wifi  |     | Wifi | P2P |-----| P2P | CSMA |
+//               +--------+     +------+-----+     +-----+------+
+//                   |              |           ^           |
+//                 ((*))          ((*))         |           |         
+//                                          P2P 10.1.2      |         
+//                 ((*))          ((*))                     |    n5  n6   n7
+//                   |              |                       |     |   |    |
+//                  n1             n2                       ================
+//                     Wifi 10.1.1                           CSMA LAN 10.1.3
+//
+// The Wifi device on node zero is:  10.1.1.1
+// The Wifi device on node one is:   10.1.1.2
+// The Wifi device on node two is:   10.1.1.3
+// The Wifi device on node three is: 10.1.1.4
+// The P2P device on node three is:  10.1.2.1
+// The P2P device on node four is:   10.1.2.2
+// The CSMA device on node four is:  10.1.3.1
+// The CSMA device on node five is:  10.1.3.2
+// The CSMA device on node six is:   10.1.3.3
+// The CSMA device on node seven is: 10.1.3.4
+//
+// Some simple things to do:
+//
+// 1) Ping one of the simulated nodes on the left side of the topology.
+//
+//    ./waf --run tap-wifi-dumbbell&
+//    ping 10.1.1.3
+//
+//    Take a look at the pcap traces and note that the timing of the packet
+//    movement reflects the delay configured on the CSMA lan.
+//
+// 2) Configure a route in the linux host and ping once of the nodes on the 
+//    right, across the point-to-point link.  You will see relatively large
+//    delays due to CBR background traffic on the point-to-point (see next
+//    item).
+//
+//    ./waf --run tap-wifi-dumbbell&
+//    sudo route add -net 10.1.3.0 netmask 255.255.255.0 dev left gw 10.1.1.2
+//    ping 10.1.3.4
+//
+//    Take a look at the pcap traces and note that the timing reflects the 
+//    addition of the significant delay and low bandwidth configured on the 
+//    point-to-point link along with the high traffic.
+//
+// 3) Fiddle with the background CBR traffic across the point-to-point 
+//    link and watch the ping timing change.  The OnOffApplication "DataRate"
+//    attribute defaults to 500kb/s and the "PacketSize" Attribute defaults
+//    to 512.  The point-to-point "DataRate" is set to 512kb/s in the script,
+//    so in the default case, the link is pretty full.  This should be 
+//    reflected in large delays seen by ping.  You can crank down the CBR 
+//    traffic data rate and watch the ping timing change dramatically.
+//
+//    ./waf --run "tap-wifi-dumbbell --ns3::OnOffApplication::DataRate=100kb/s"&
+//    sudo route add -net 10.1.3.0 netmask 255.255.255.0 dev left gw 10.1.1.2
+//    ping 10.1.3.4
+//
+
+#include <iostream>
+#include <fstream>
+
+#include "ns3/simulator-module.h"
+#include "ns3/node-module.h"
+#include "ns3/core-module.h"
+#include "ns3/wifi-module.h"
+#include "ns3/helper-module.h"
+#include "ns3/global-routing-module.h"
+
+using namespace ns3;
+
+NS_LOG_COMPONENT_DEFINE ("TapDumbbellExample");
+
+int 
+main (int argc, char *argv[])
+{
+  RandomVariable::UseGlobalSeed (1, 1, 2, 3, 5, 8);
+
+  CommandLine cmd;
+  cmd.Parse (argc, argv);
+
+  GlobalValue::Bind ("SimulatorImplementationType", StringValue ("ns3::RealtimeSimulatorImpl"));
+
+  Config::SetDefault ("ns3::Ipv4L3Protocol::CalcChecksum", BooleanValue (true)); 
+  Config::SetDefault ("ns3::Icmpv4L4Protocol::CalcChecksum", BooleanValue (true)); 
+  Config::SetDefault ("ns3::TcpL4Protocol::CalcChecksum", BooleanValue (true)); 
+  Config::SetDefault ("ns3::UdpL4Protocol::CalcChecksum", BooleanValue (true)); 
+
+  //
+  // The topology has a Wifi network of four nodes on the left side.  We'll make
+  // node zero the AP and have the other three will be the STAs.
+  //
+  NodeContainer nodesLeft;
+  nodesLeft.Create (4);
+
+  YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default ();
+  YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();
+  wifiPhy.SetChannel (wifiChannel.Create ());
+
+  Ssid ssid = Ssid ("left");
+  WifiHelper wifi = WifiHelper::Default ();
+  wifi.SetRemoteStationManager ("ns3::ArfWifiManager");
+
+  wifi.SetMac ("ns3::NqapWifiMac", 
+               "Ssid", SsidValue (ssid), 
+               "BeaconGeneration", BooleanValue (true), 
+               "BeaconInterval", TimeValue (Seconds (2.5)));
+  NetDeviceContainer devicesLeft = wifi.Install (wifiPhy, nodesLeft.Get (0));
+
+
+  wifi.SetMac ("ns3::NqstaWifiMac", 
+               "Ssid", SsidValue (ssid), 
+               "ActiveProbing", BooleanValue (false));
+  devicesLeft.Add (wifi.Install (wifiPhy, NodeContainer (nodesLeft.Get (1), nodesLeft.Get (2), nodesLeft.Get (3))));
+
+  MobilityHelper mobility;
+  mobility.Install (nodesLeft);
+
+  InternetStackHelper internetLeft;
+  internetLeft.Install (nodesLeft);
+
+  Ipv4AddressHelper ipv4Left;
+  ipv4Left.SetBase ("10.1.1.0", "255.255.255.0");
+  Ipv4InterfaceContainer interfacesLeft = ipv4Left.Assign (devicesLeft);
+
+  TapBridgeHelper bridgeLeft (interfacesLeft.GetAddress (1));
+  bridgeLeft.SetAttribute ("DeviceName", StringValue ("left"));
+  bridgeLeft.Install (nodesLeft.Get (0), devicesLeft.Get (0));
+
+  //
+  // Now, create the right side.
+  //
+  NodeContainer nodesRight;
+  nodesRight.Create (4);
+
+  CsmaHelper csmaRight;
+  csmaRight.SetChannelAttribute ("DataRate", DataRateValue (5000000));
+  csmaRight.SetChannelAttribute ("Delay", TimeValue (MilliSeconds (2)));
+
+  NetDeviceContainer devicesRight = csmaRight.Install (nodesRight);
+
+  InternetStackHelper internetRight;
+  internetRight.Install (nodesRight);
+
+  Ipv4AddressHelper ipv4Right;
+  ipv4Right.SetBase ("10.1.3.0", "255.255.255.0");
+  Ipv4InterfaceContainer interfacesRight = ipv4Right.Assign (devicesRight);
+
+  //
+  // Stick in the point-to-point line between the sides.
+  //
+  PointToPointHelper p2p;
+  p2p.SetDeviceAttribute ("DataRate", StringValue ("512kbps"));
+  p2p.SetChannelAttribute ("Delay", StringValue ("10ms"));
+
+  NodeContainer nodes = NodeContainer (nodesLeft.Get(3), nodesRight.Get (0));
+  NetDeviceContainer devices = p2p.Install (nodes);
+
+  Ipv4AddressHelper ipv4;
+  ipv4.SetBase ("10.1.2.0", "255.255.255.192");
+  Ipv4InterfaceContainer interfaces = ipv4.Assign (devices);
+
+  //
+  // Simulate some CBR traffic over the point-to-point link
+  //
+  uint16_t port = 9;   // Discard port (RFC 863)
+  OnOffHelper onoff ("ns3::UdpSocketFactory", InetSocketAddress (interfaces.GetAddress (1), port));
+  onoff.SetAttribute ("OnTime", RandomVariableValue (ConstantVariable (1)));
+  onoff.SetAttribute ("OffTime", RandomVariableValue (ConstantVariable (0)));
+
+  ApplicationContainer apps = onoff.Install (nodesLeft.Get (3));
+  apps.Start (Seconds (1.0));
+
+  // Create a packet sink to receive these packets
+  PacketSinkHelper sink ("ns3::UdpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), port));
+
+  apps = sink.Install (nodesRight.Get (0));
+  apps.Start (Seconds (1.0));
+
+  CsmaHelper::EnablePcapAll ("tap-dumbbell");
+  GlobalRouteManager::PopulateRoutingTables ();
+
+  Simulator::Stop (Seconds (60.));
+  Simulator::Run ();
+  Simulator::Destroy ();
+}
--- a/examples/wscript	Mon Feb 02 10:12:29 2009 -0800
+++ b/examples/wscript	Mon Feb 02 11:39:18 2009 -0800
@@ -52,6 +52,10 @@
                                  ['csma', 'point-to-point', 'tap-bridge', 'internet-stack'])
     obj.source = 'tap-dumbbell.cc'
 
+    obj = bld.create_ns3_program('tap-wifi-dumbbell',
+                                 ['wifi', 'csma', 'point-to-point', 'tap-bridge', 'internet-stack'])
+    obj.source = 'tap-wifi-dumbbell.cc'
+
     obj = bld.create_ns3_program('csma-bridge',
                                  ['bridge', 'csma', 'internet-stack'])
     obj.source = 'csma-bridge.cc'