merge
authorGustavo J. A. M. Carneiro <gjc@inescporto.pt>
Thu, 04 Sep 2008 18:46:56 +0100
changeset 3620 25871ba19a71
parent 3619 a97d3ed04035 (current diff)
parent 3618 da5482f27f7e (diff)
child 3622 a74c78bfc304
merge
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/wifi-wired-bridging.cc	Thu Sep 04 18:46:56 2008 +0100
@@ -0,0 +1,162 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+
+#include "ns3/core-module.h"
+#include "ns3/simulator-module.h"
+#include "ns3/mobility-module.h"
+#include "ns3/helper-module.h"
+#include "ns3/wifi-module.h"
+#include "ns3/node-module.h"
+#include "ns3/global-route-manager.h"
+#include <vector>
+#include <stdint.h>
+#include <sstream>
+
+using namespace ns3;
+
+Ptr<WifiChannel>
+CreateChannel (void)
+{
+  Ptr<WifiChannel> channel = CreateObject<WifiChannel> ();
+  channel->SetPropagationDelayModel (CreateObject<ConstantSpeedPropagationDelayModel> ());
+  Ptr<LogDistancePropagationLossModel> log = CreateObject<LogDistancePropagationLossModel> ();
+  log->SetReferenceModel (CreateObject<FriisPropagationLossModel> ());
+  channel->SetPropagationLossModel (log);
+  return channel;
+}
+
+int main (int argc, char *argv[])
+{
+  uint32_t nWifis = 2;
+  uint32_t nStas = 2;
+  bool sendIp = true;
+
+  RandomVariable::UseGlobalSeed (1, 1, 2, 3, 5, 8);
+
+  CommandLine cmd;
+  cmd.AddValue ("nWifis", "Number of wifi networks", nWifis);
+  cmd.AddValue ("nStas", "Number of stations per wifi network", nStas);
+  cmd.AddValue ("SendIp", "Send Ipv4 or raw packets", sendIp);
+  cmd.Parse (argc, argv);
+
+  NodeContainer backboneNodes;
+  NetDeviceContainer backboneDevices;
+  Ipv4InterfaceContainer backboneInterfaces;
+  std::vector<NodeContainer> staNodes;
+  std::vector<NetDeviceContainer> staDevices;
+  std::vector<NetDeviceContainer> apDevices;
+  std::vector<Ipv4InterfaceContainer> staInterfaces;
+  std::vector<Ipv4InterfaceContainer> apInterfaces;
+
+  InternetStackHelper stack;
+  CsmaHelper csma;
+  Ipv4AddressHelper ip;
+  ip.SetBase ("192.168.0.0", "255.255.255.0");
+
+  backboneNodes.Create (nWifis);
+  stack.Install (backboneNodes);
+
+  backboneDevices = csma.Install (backboneNodes);
+  backboneInterfaces = ip.Assign (backboneDevices);
+
+  double wifiX = 0.0;
+  for (uint32_t i = 0; i < nWifis; ++i)
+    {
+      // calculate ssid for wifi subnetwork
+      std::ostringstream oss;
+      oss << "wifi-default-" << i;
+      Ssid ssid = Ssid (oss.str ());
+
+      NodeContainer sta;
+      NetDeviceContainer staDev;
+      NetDeviceContainer apDev;
+      Ipv4InterfaceContainer staInterface;
+      Ipv4InterfaceContainer apInterface;
+      MobilityHelper mobility;
+      BridgeHelper bridge;
+      WifiHelper wifi;
+      Ptr<WifiChannel> channel;
+
+      sta.Create (nStas);
+      wifi.SetPhy ("ns3::WifiPhy");
+      channel = CreateChannel ();
+      ip.NewNetwork ();
+      mobility.SetPositionAllocator ("ns3::GridPositionAllocator",
+				     "MinX", DoubleValue (wifiX),
+				     "MinY", DoubleValue (0.0),
+				     "DeltaX", DoubleValue (5.0),
+				     "DeltaY", DoubleValue (5.0),
+				     "GridWidth", UintegerValue (1),
+				     "LayoutType", StringValue ("RowFirst"));
+
+
+      // setup the AP.
+      mobility.SetMobilityModel ("ns3::StaticMobilityModel");
+      mobility.Install (backboneNodes.Get (i));
+      wifi.SetMac ("ns3::NqapWifiMac",
+		   "Ssid", SsidValue (ssid),
+		   "BeaconGeneration", BooleanValue (true),
+		   "BeaconInterval", TimeValue (Seconds (2.5)));
+      apDev = wifi.Install (backboneNodes.Get (i), channel);
+      apInterface = ip.Assign (apDev);
+      bridge.Install (backboneNodes.Get (i), NetDeviceContainer (apDev, backboneDevices.Get (i)));
+
+      // setup the STAs
+      stack.Install (sta);
+      mobility.SetMobilityModel ("ns3::RandomWalk2dMobilityModel",
+				 "Mode", StringValue ("Time"),
+				 "Time", StringValue ("2s"),
+				 "Speed", StringValue ("Constant:1.0"),
+				 "Bounds", RectangleValue (Rectangle (wifiX, wifiX+5.0,0.0, (nStas+1)*5.0)));
+      mobility.Install (sta);
+      wifi.SetMac ("ns3::NqstaWifiMac",
+		   "Ssid", SsidValue (ssid),
+		   "ActiveProbing", BooleanValue (false));
+      staDev = wifi.Install (sta, channel);
+      staInterface = ip.Assign (staDev);
+
+      // save everything in containers.
+      staNodes.push_back (sta);
+      apDevices.push_back (apDev);
+      apInterfaces.push_back (apInterface);
+      staDevices.push_back (staDev);
+      staInterfaces.push_back (staInterface);
+
+      wifiX += 20.0;
+    }
+
+  GlobalRouteManager::PopulateRoutingTables ();
+
+  Address dest;
+  std::string protocol;
+  if (sendIp)
+    {
+      dest = InetSocketAddress (staInterfaces[1].GetAddress (1), 1025);
+      protocol = "ns3::UdpSocketFactory";
+    }
+  else
+    {
+      PacketSocketAddress tmp;
+      tmp.SetSingleDevice (staDevices[0].Get (0)->GetIfIndex ());
+      tmp.SetPhysicalAddress (staDevices[1].Get (0)->GetAddress ());
+      tmp.SetProtocol (0x807);
+      dest = tmp;
+      protocol = "ns3::PacketSocketFactory";
+    }
+  OnOffHelper onoff = OnOffHelper (protocol, dest);
+  onoff.SetAttribute ("OnTime", RandomVariableValue (ConstantVariable (1)));
+  onoff.SetAttribute ("OffTime", RandomVariableValue (ConstantVariable (0)));
+  ApplicationContainer apps = onoff.Install (staNodes[0].Get (0));
+  apps.Start (Seconds (0.5));
+  apps.Stop (Seconds (3.0));
+  
+
+  WifiHelper::EnablePcap ("wifi-wire-bridging", staNodes[1].Get (1));
+  WifiHelper::EnablePcap ("wifi-wire-bridging", staNodes[0].Get (0));
+  std::ofstream os;
+  os.open ("wifi-wire-bridging.mob");
+  MobilityHelper::EnableAsciiAll (os);
+
+  Simulator::Stop (Seconds (100.0));
+  Simulator::Run ();
+
+}
--- a/examples/wscript	Thu Sep 04 18:45:21 2008 +0100
+++ b/examples/wscript	Thu Sep 04 18:46:56 2008 +0100
@@ -85,3 +85,8 @@
     obj.source = 'wifi-ap.cc'
 
     bld.add_subdirs('stats')
+
+    obj = bld.create_ns3_program('wifi-wired-bridging',
+                                 ['core', 'simulator', 'mobility', 'wifi', 
+                                  'csma', 'helper', 'bridge'])
+    obj.source = 'wifi-wired-bridging.cc'
--- a/src/helper/net-device-container.cc	Thu Sep 04 18:45:21 2008 +0100
+++ b/src/helper/net-device-container.cc	Thu Sep 04 18:46:56 2008 +0100
@@ -21,6 +21,19 @@
 
 namespace ns3 {
 
+NetDeviceContainer::NetDeviceContainer ()
+{}
+NetDeviceContainer::NetDeviceContainer (Ptr<NetDevice> dev)
+{
+  m_devices.push_back (dev);
+}
+NetDeviceContainer::NetDeviceContainer (const NetDeviceContainer &a, const NetDeviceContainer &b)
+{
+  *this = a;
+  Add (b);
+}
+
+
 NetDeviceContainer::Iterator 
 NetDeviceContainer::Begin (void) const
 {
--- a/src/helper/net-device-container.h	Thu Sep 04 18:45:21 2008 +0100
+++ b/src/helper/net-device-container.h	Thu Sep 04 18:46:56 2008 +0100
@@ -36,6 +36,33 @@
   typedef std::vector<Ptr<NetDevice> >::const_iterator Iterator;
 
   /**
+   * Create an empty NetDeviceContainer.
+   */
+  NetDeviceContainer ();
+  /**
+   * \param dev a device to add to the container
+   *
+   * Create a NetDeviceContainer with exactly one device
+   */
+  NetDeviceContainer (Ptr<NetDevice> dev);
+  /**
+   * \param a a device container
+   * \param b another device container
+   *
+   * Create a device container which is a concatenation of the two input
+   * NetDeviceContainers.
+   *
+   * \note A frequently seen idiom that uses these constructors involves the
+   * implicit conversion by constructor of Ptr<NetDevice>.  When used, two 
+   * Ptr<NetDevice> will be passed to this constructor instead of NetDeviceContainer&.
+   * C++ will notice the implicit conversion path that goes through the 
+   * NetDeviceContainer (Ptr<NetDevice> dev) constructor above.  Using this conversion
+   * one may provide optionally provide arguments of Ptr<NetDevice> to these 
+   * constructors.
+   */
+  NetDeviceContainer (const NetDeviceContainer &a, const NetDeviceContainer &b);
+
+  /**
    * \returns an iterator which points to the start of the array of pointers.
    */
   Iterator Begin (void) const;
--- a/wscript	Thu Sep 04 18:45:21 2008 +0100
+++ b/wscript	Thu Sep 04 18:46:56 2008 +0100
@@ -425,13 +425,16 @@
     if env['NSC_ENABLED'] == 'yes':
         nsc_build(bld)
 
-def get_command_template():
+def get_command_template(arguments):
     if Params.g_options.valgrind:
         if Params.g_options.command_template:
             Params.fatal("Options --command-template and --valgrind are conflicting")
-        return "valgrind --leak-check=full %s"
+        cmd = "valgrind --leak-check=full %s"
     else:
-        return (Params.g_options.command_template or '%s')
+        cmd = Params.g_options.command_template or '%s'
+    for arg in arguments:
+        cmd = cmd + " " + arg
+    return cmd
 
 
 def shutdown():
@@ -821,7 +824,7 @@
         env = Params.g_build.env_of_name('default')
         self.diff = env['DIFF']
 
-    def run_test(self, verbose, generate, refDirName, testName):
+    def run_test(self, verbose, generate, refDirName, testName, *arguments):
         refTestDirName = os.path.join(refDirName, (testName + ".ref"))
 
         if not os.path.exists(refDirName):
@@ -834,7 +837,10 @@
                 os.mkdir(refTestDirName)
 
             Params.g_options.cwd_launch = refTestDirName
-            run_program(testName)
+            tmpl = "%s"
+            for arg in arguments:
+                tmpl = tmpl + " " + arg
+            run_program(testName, tmpl)
 
             print "Remember to commit " + refTestDirName
             return 0
@@ -849,7 +855,7 @@
             #os.system("./waf --cwd regression/traces --run " +
             #  testName + " > /dev/null 2>&1")
             Params.g_options.cwd_launch = "traces"
-            run_program(testName, command_template=get_command_template())
+            run_program(testName, command_template=get_command_template(arguments))
 
             if verbose:
                 #diffCmd = "diff traces " + refTestDirName + " | head"