/* -*- 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 */ #include "ns3/core-module.h" #include "ns3/network-module.h" #include "ns3/helper-module.h" #include "ns3/mobility-module.h" #include "ns3/contrib-module.h" #include NS_LOG_COMPONENT_DEFINE ("Main"); using namespace ns3; class Experiment { public: Experiment (); Experiment (std::string name); Gnuplot2dDataset Run (const WifiHelper &wifi, const YansWifiPhyHelper &wifiPhy, const NqosWifiMacHelper &wifiMac, const YansWifiChannelHelper &wifiChannel); private: void ReceivePacket (Ptr socket); void SetPosition (Ptr node, Vector position); Vector GetPosition (Ptr node); void AdvancePosition (Ptr node); Ptr SetupPacketReceive (Ptr node); uint32_t m_bytesTotal; Gnuplot2dDataset m_output; }; Experiment::Experiment () {} Experiment::Experiment (std::string name) : m_output (name) { m_output.SetStyle (Gnuplot2dDataset::LINES); } void Experiment::SetPosition (Ptr node, Vector position) { Ptr mobility = node->GetObject (); mobility->SetPosition (position); } Vector Experiment::GetPosition (Ptr node) { Ptr mobility = node->GetObject (); return mobility->GetPosition (); } void Experiment::AdvancePosition (Ptr node) { Vector pos = GetPosition (node); double mbs = ((m_bytesTotal * 8.0) / 1000000); m_bytesTotal = 0; m_output.Add (pos.x, mbs); pos.x += 1.0; if (pos.x >= 210.0) { return; } SetPosition (node, pos); //std::cout << "x="< socket) { Ptr packet; while (packet = socket->Recv ()) { m_bytesTotal += packet->GetSize (); } } Ptr Experiment::SetupPacketReceive (Ptr node) { TypeId tid = TypeId::LookupByName ("ns3::PacketSocketFactory"); Ptr sink = Socket::CreateSocket (node, tid); sink->Bind (); sink->SetRecvCallback (MakeCallback (&Experiment::ReceivePacket, this)); return sink; } Gnuplot2dDataset Experiment::Run (const WifiHelper &wifi, const YansWifiPhyHelper &wifiPhy, const NqosWifiMacHelper &wifiMac, const YansWifiChannelHelper &wifiChannel) { m_bytesTotal = 0; NodeContainer c; c.Create (2); PacketSocketHelper packetSocket; packetSocket.Install (c); YansWifiPhyHelper phy = wifiPhy; phy.SetChannel (wifiChannel.Create ()); NqosWifiMacHelper mac = wifiMac; NetDeviceContainer devices = wifi.Install (phy, mac, c); MobilityHelper mobility; Ptr positionAlloc = CreateObject (); positionAlloc->Add (Vector (0.0, 0.0, 0.0)); positionAlloc->Add (Vector (5.0, 0.0, 0.0)); mobility.SetPositionAllocator (positionAlloc); mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel"); mobility.Install (c); PacketSocketAddress socket; socket.SetSingleDevice(devices.Get (0)->GetIfIndex ()); socket.SetPhysicalAddress (devices.Get (1)->GetAddress ()); socket.SetProtocol (1); OnOffHelper onoff ("ns3::PacketSocketFactory", Address (socket)); onoff.SetAttribute ("OnTime", RandomVariableValue (ConstantVariable (250))); onoff.SetAttribute ("OffTime", RandomVariableValue (ConstantVariable (0))); onoff.SetAttribute ("DataRate", DataRateValue (DataRate (60000000))); onoff.SetAttribute ("PacketSize", UintegerValue (2000)); ApplicationContainer apps = onoff.Install (c.Get (0)); apps.Start (Seconds (0.5)); apps.Stop (Seconds (250.0)); Simulator::Schedule (Seconds (1.5), &Experiment::AdvancePosition, this, c.Get (1)); Ptr recvSink = SetupPacketReceive (c.Get (1)); Simulator::Run (); Simulator::Destroy (); return m_output; } int main (int argc, char *argv[]) { // disable fragmentation Config::SetDefault ("ns3::WifiRemoteStationManager::FragmentationThreshold", StringValue ("2200")); Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", StringValue ("2200")); CommandLine cmd; cmd.Parse (argc, argv); Gnuplot gnuplot = Gnuplot ("reference-rates.png"); Experiment experiment; WifiHelper wifi = WifiHelper::Default (); wifi.SetStandard (WIFI_PHY_STANDARD_80211a); NqosWifiMacHelper wifiMac = NqosWifiMacHelper::Default (); YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default (); YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default (); Gnuplot2dDataset dataset; wifiMac.SetType ("ns3::AdhocWifiMac"); NS_LOG_DEBUG ("54"); experiment = Experiment ("54mb"); wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("OfdmRate54Mbps")); dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel); gnuplot.AddDataset (dataset); NS_LOG_DEBUG ("48"); experiment = Experiment ("48mb"); wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("OfdmRate48Mbps")); dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel); gnuplot.AddDataset (dataset); NS_LOG_DEBUG ("36"); experiment = Experiment ("36mb"); wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("OfdmRate36Mbps")); dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel); gnuplot.AddDataset (dataset); NS_LOG_DEBUG ("24"); experiment = Experiment ("24mb"); wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("OfdmRate24Mbps")); dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel); gnuplot.AddDataset (dataset); NS_LOG_DEBUG ("18"); experiment = Experiment ("18mb"); wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("OfdmRate18Mbps")); dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel); gnuplot.AddDataset (dataset); NS_LOG_DEBUG ("12"); experiment = Experiment ("12mb"); wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("OfdmRate12Mbps")); dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel); gnuplot.AddDataset (dataset); NS_LOG_DEBUG ("9"); experiment = Experiment ("9mb"); wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("OfdmRate9Mbps")); dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel); gnuplot.AddDataset (dataset); NS_LOG_DEBUG ("6"); experiment = Experiment ("6mb"); wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("OfdmRate6Mbps")); dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel); gnuplot.AddDataset (dataset); gnuplot.GenerateOutput (std::cout); gnuplot = Gnuplot ("rate-control.png"); wifi.SetStandard (WIFI_PHY_STANDARD_holland); NS_LOG_DEBUG ("arf"); experiment = Experiment ("arf"); wifi.SetRemoteStationManager ("ns3::ArfWifiManager"); dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel); gnuplot.AddDataset (dataset); NS_LOG_DEBUG ("aarf"); experiment = Experiment ("aarf"); wifi.SetRemoteStationManager ("ns3::AarfWifiManager"); dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel); gnuplot.AddDataset (dataset); NS_LOG_DEBUG ("aarf-cd"); experiment = Experiment ("aarf-cd"); wifi.SetRemoteStationManager ("ns3::AarfcdWifiManager"); dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel); gnuplot.AddDataset (dataset); NS_LOG_DEBUG ("cara"); experiment = Experiment ("cara"); wifi.SetRemoteStationManager ("ns3::CaraWifiManager"); dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel); gnuplot.AddDataset (dataset); NS_LOG_DEBUG ("rraa"); experiment = Experiment ("rraa"); wifi.SetRemoteStationManager ("ns3::RraaWifiManager"); dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel); gnuplot.AddDataset (dataset); NS_LOG_DEBUG ("ideal"); experiment = Experiment ("ideal"); wifi.SetRemoteStationManager ("ns3::IdealWifiManager"); dataset = experiment.Run (wifi, wifiPhy, wifiMac, wifiChannel); gnuplot.AddDataset (dataset); gnuplot.GenerateOutput (std::cout); return 0; }