examples/wifi-ap.cc
changeset 2662 2ace0f6fd238
parent 2661 91a852012080
child 2700 c54fbae72e8f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/wifi-ap.cc	Wed Mar 19 12:42:54 2008 -0700
@@ -0,0 +1,196 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2005,2006,2007 INRIA
+ *
+ * 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
+ *
+ * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
+ */
+
+
+#include "ns3/simulator.h"
+#include "ns3/callback.h"
+#include "ns3/ptr.h"
+#include "ns3/node.h"
+#include "ns3/onoff-application.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/wifi-helper.h"
+#include "ns3/node-container.h"
+#include "ns3/random-variable.h"
+#include "ns3/packet-socket-address.h"
+#include "ns3/packet.h"
+#include "ns3/node-list.h"
+#include "ns3/ssid.h"
+#include "ns3/wifi-phy.h"
+#include "ns3/mobility-model.h"
+#include "ns3/config.h"
+#include "ns3/string.h"
+#include "ns3/wifi-channel.h"
+#include "ns3/boolean.h"
+#include "ns3/propagation-loss-model.h"
+#include "ns3/propagation-delay-model.h"
+
+
+#include <iostream>
+
+using namespace ns3;
+
+void
+DevTxTrace (std::string context, Ptr<const Packet> p, Mac48Address address)
+{
+  std::cout << " TX to=" << address << " p: " << *p << std::endl;
+}
+void
+DevRxTrace (std::string context, Ptr<const Packet> p, Mac48Address address)
+{
+  std::cout << " RX from=" << address << " p: " << *p << std::endl;
+}
+void
+PhyRxOkTrace (std::string context, Ptr<const Packet> packet, double snr, WifiMode mode, enum WifiPreamble preamble)
+{
+  std::cout << "PHYRXOK mode=" << mode << " snr=" << snr << " " << *packet << std::endl;
+}
+void
+PhyRxErrorTrace (std::string context, Ptr<const Packet> packet, double snr)
+{
+  std::cout << "PHYRXERROR snr=" << snr << " " << *packet << std::endl;
+}
+void
+PhyTxTrace (std::string context, Ptr<const Packet> packet, WifiMode mode, WifiPreamble preamble, uint8_t txPower)
+{
+  std::cout << "PHYTX mode=" << mode << " " << *packet << std::endl;
+}
+void
+PhyStateTrace (std::string context, Time start, Time duration, enum WifiPhy::State state)
+{
+  std::cout << " state=";
+  switch (state) {
+  case WifiPhy::TX:
+    std::cout << "tx      ";
+    break;
+  case WifiPhy::SYNC:
+    std::cout << "sync    ";
+    break;
+  case WifiPhy::CCA_BUSY:
+    std::cout << "cca-busy";
+    break;
+  case WifiPhy::IDLE:
+    std::cout << "idle    ";
+    break;
+  }
+  std::cout << " start="<<start<<" duration="<<duration<<std::endl;
+}
+
+static void
+SetPosition (Ptr<Node> node, Vector position)
+{
+  Ptr<MobilityModel> mobility = node->GetObject<MobilityModel> ();
+  mobility->SetPosition (position);
+}
+
+static Vector
+GetPosition (Ptr<Node> node)
+{
+  Ptr<MobilityModel> mobility = node->GetObject<MobilityModel> ();
+  return mobility->GetPosition ();
+}
+
+static void 
+AdvancePosition (Ptr<Node> node) 
+{
+  Vector pos = GetPosition (node);
+  pos.x += 5.0;
+  if (pos.x >= 210.0) 
+    {
+      return;
+    }
+  SetPosition (node, pos);
+  //std::cout << "x="<<pos.x << std::endl;
+  Simulator::Schedule (Seconds (1.0), &AdvancePosition, node);
+}
+
+
+
+
+int main (int argc, char *argv[])
+{
+  Packet::EnableMetadata ();
+
+  // enable rts cts all the time.
+  Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", String ("0"));
+  // disable fragmentation
+  Config::SetDefault ("ns3::WifiRemoteStationManager::FragmentationThreshold", String ("2200"));
+
+  WifiHelper wifi;
+  MobilityHelper mobility;
+  NodeContainer stas;
+  NodeContainer ap;
+  NetDeviceContainer staDevs;
+
+  stas.Create (2);
+  ap.Create (1);
+
+  Ptr<WifiChannel> channel = CreateObject<WifiChannel> ();
+  channel->SetPropagationDelayModel (CreateObject<ConstantSpeedPropagationDelayModel> ());
+  Ptr<LogDistancePropagationLossModel> log = CreateObject<LogDistancePropagationLossModel> ();
+  log->SetReferenceModel (CreateObject<FriisPropagationLossModel> ());
+  channel->SetPropagationLossModel (log);
+
+  Ssid ssid = Ssid ("wifi-default");
+  wifi.SetPhy ("ns3::WifiPhy");
+  wifi.SetRemoteStationManager ("ns3::ArfWifiManager");
+  // setup ap.
+  wifi.SetMac ("ns3::NqstaWifiMac", "Ssid", ssid,
+               "ActiveProbing", Boolean (false));
+  staDevs = wifi.Build (stas, channel);
+  // setup stas.
+  wifi.SetMac ("ns3::NqapWifiMac", "Ssid", ssid,
+               "BeaconGeneration", Boolean (true),
+               "BeaconInterval", Seconds (2.5));
+  wifi.Build (ap, channel);
+
+  // mobility.
+  mobility.Layout (stas.Begin (), stas.End ());
+  mobility.Layout (ap.Begin (), ap.End ());
+
+  Simulator::Schedule (Seconds (1.0), &AdvancePosition, ap.Get (0));
+
+  PacketSocketAddress destination = PacketSocketAddress ();
+  destination.SetProtocol (1);
+  destination.SetSingleDevice (0);
+  destination.SetPhysicalAddress (staDevs.Get(1)->GetAddress ());
+  Ptr<Application> app = 
+    CreateObject<OnOffApplication> ("Remote", Address (destination), 
+                                    "Protocol", TypeId::LookupByName ("ns3::PacketSocketFactory"),
+                                    "OnTime", ConstantVariable (42),
+                                    "OffTime", ConstantVariable (0));
+  stas.Get (0)->AddApplication (app);
+  app->Start (Seconds (0.5));
+  app->Stop (Seconds (43.0));
+
+  Simulator::StopAt (Seconds (44.0));
+
+  Config::Connect ("/NodeList/*/DeviceList/*/Tx", MakeCallback (&DevTxTrace));
+  Config::Connect ("/NodeList/*/DeviceList/*/Rx", MakeCallback (&DevRxTrace));
+  Config::Connect ("/NodeList/*/DeviceList/*/Phy/RxOk", MakeCallback (&PhyRxOkTrace));
+  Config::Connect ("/NodeList/*/DeviceList/*/Phy/RxError", MakeCallback (&PhyRxErrorTrace));
+  Config::Connect ("/NodeList/*/DeviceList/*/Phy/Tx", MakeCallback (&PhyTxTrace));
+  Config::Connect ("/NodeList/*/DeviceList/*/Phy/State", MakeCallback (&PhyStateTrace));
+
+  Simulator::Run ();
+
+  Simulator::Destroy ();
+
+  return 0;
+}