/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ /* * Copyright (c) 2009 IITP RAS * * 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 * * This is an example script for AODV manet routing protocol. * * Authors: Pavel Boyko */ #include "ns3/aodv-module.h" #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 "ns3/wifi-module.h" #include "ns3/v4ping-helper.h" #include #include using namespace ns3; /** * \brief Test script. * * This script creates 1-dimensional grid topology and then ping last node from the first one: * * [10.0.0.1] <-- step --> [10.0.0.2] <-- step --> [10.0.0.3] <-- step --> [10.0.04] * * ping 10.0.0.4 */ class AodvExample { public: AodvExample (); /// Configure script parameters, \return true on successful configuration bool Configure (int argc, char **argv); /// Run simulation void Run (); /// Report results void Report (std::ostream & os); private: ///\name parameters //\{ /// Number of nodes uint32_t size; /// Distance between nodes, meters double step; /// Simulation time, seconds double totalTime; /// Write per-device PCAP traces if true bool pcap; /// Print routes if true bool printRoutes; //\} ///\name network //\{ NodeContainer nodes; NetDeviceContainer devices; Ipv4InterfaceContainer interfaces; //\} private: void CreateNodes (); void CreateDevices (); void InstallInternetStack (); void InstallApplications (); }; int main (int argc, char **argv) { AodvExample test; if (! test.Configure(argc, argv)) NS_FATAL_ERROR ("Configuration failed. Aborted."); test.Run (); test.Report (std::cout); return 0; } //----------------------------------------------------------------------------- AodvExample::AodvExample () : size (10), step (100), totalTime (10), pcap (true), printRoutes (true) { } bool AodvExample::Configure (int argc, char **argv) { // Enable AODV logs by default. Comment this if too noisy // LogComponentEnable("AodvRoutingProtocol", LOG_LEVEL_ALL); SeedManager::SetSeed(12345); CommandLine cmd; cmd.AddValue ("pcap", "Write PCAP traces.", pcap); cmd.AddValue ("printRoutes", "Print routing table dumps.", printRoutes); cmd.AddValue ("size", "Number of nodes.", size); cmd.AddValue ("time", "Simulation time, s.", totalTime); cmd.AddValue ("step", "Grid step, m", step); cmd.Parse (argc, argv); return true; } void AodvExample::Run () { // Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", UintegerValue (1)); // enable rts cts all the time. CreateNodes (); CreateDevices (); InstallInternetStack (); InstallApplications (); std::cout << "Starting simulation for " << totalTime << " s ...\n"; Simulator::Stop (Seconds (totalTime)); Simulator::Run (); Simulator::Destroy (); } void AodvExample::Report (std::ostream &) { } void AodvExample::CreateNodes () { std::cout << "Creating " << (unsigned)size << " nodes " << step << " m apart.\n"; nodes.Create (size); // Name nodes for (uint32_t i = 0; i < size; ++i) { std::ostringstream os; os << "node-" << i; Names::Add (os.str (), nodes.Get (i)); } // Create static grid MobilityHelper mobility; mobility.SetPositionAllocator ("ns3::GridPositionAllocator", "MinX", DoubleValue (0.0), "MinY", DoubleValue (0.0), "DeltaX", DoubleValue (step), "DeltaY", DoubleValue (0), "GridWidth", UintegerValue (size), "LayoutType", StringValue ("RowFirst")); mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel"); mobility.Install (nodes); } void AodvExample::CreateDevices () { NqosWifiMacHelper wifiMac = NqosWifiMacHelper::Default (); wifiMac.SetType ("ns3::AdhocWifiMac"); YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default (); YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default (); wifiPhy.SetChannel (wifiChannel.Create ()); WifiHelper wifi = WifiHelper::Default (); wifi.SetRemoteStationManager ("ns3::ConstantRateWifiManager", "DataMode", StringValue ("OfdmRate6Mbps"), "RtsCtsThreshold", UintegerValue (0)); devices = wifi.Install (wifiPhy, wifiMac, nodes); if (pcap) { wifiPhy.EnablePcapAll (std::string ("aodv")); } } void AodvExample::InstallInternetStack () { AodvHelper aodv; // you can configure AODV attributes here using aodv.Set(name, value) InternetStackHelper stack; stack.SetRoutingHelper (aodv); stack.Install (nodes); Ipv4AddressHelper address; address.SetBase ("10.0.0.0", "255.0.0.0"); interfaces = address.Assign (devices); if (printRoutes) { Ptr routingStream = Create ("aodv.routes", std::ios::out); aodv.PrintRoutingTableAllAt (Seconds (8), routingStream); } } void AodvExample::InstallApplications () { V4PingHelper ping (interfaces.GetAddress (size - 1)); ping.SetAttribute ("Verbose", BooleanValue (true)); ApplicationContainer p = ping.Install (nodes.Get (0)); p.Start (Seconds (0)); p.Stop (Seconds (totalTime) - Seconds(0.001)); // move node away Ptr node = nodes.Get (size/2); Ptr mob = node->GetObject (); Simulator::Schedule (Seconds (totalTime/3), &MobilityModel::SetPosition, mob, Vector (1e5, 1e5, 1e5)); }