Professional Documents
Culture Documents
119CS0169
Network Simulation Lab Assignment – 7
AODV:
The AODV protocol builds routes between nodes only if they are requested by source nodes.
AODV is therefore considered an on-demand algorithm and does not create any extra traffic for
communication along links. The routes are maintained as long as they are required by the sources.
They also form trees to connect multicast group members. AODV makes use of sequence numbers
to ensure route freshness. They are self-starting and loop-free besides scaling to numerous mobile
nodes.
Q1:
Code:
#include <iostream>
#include <cmath>
#include "ns3/aodv-module.h"
#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/internet-module.h"
#include "ns3/mobility-module.h"
#include "ns3/point-to-point-module.h"
#include "ns3/v4ping-helper.h"
#include "ns3/yans-wifi-helper.h"
#include "ns3/netanim-module.h"
using namespace ns3;
/**
* \ingroup aodv-examples
* \ingroup examples * \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.0.4] *
* ping 10.0.0.4
*
* When 1/3 of simulation time has elapsed, one of the nodes is moved out of
* range, thereby breaking the topology. By default, this will result in * only 34 of 100 pings being
received. If the step size is reduced * to cover the gap, then all pings can be received.
*/
class AodvExample
{
public:
AodvExample ();
/**
* \brief Configure script parameters
* \param argc is the command line argument count
* \param argv is the command line arguments
* \return true on successful configuration
*/
bool Configure (int argc, char **argv);
/// Run simulation
void Run ();
/**
* Report results
* \param os the output stream
*/
void Report (std::ostream & os);
private:
// 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;
// network
/// nodes used in the example
NodeContainer nodes;
/// devices used in the example
NetDeviceContainer devices;
/// interfaces used in the example
Ipv4InterfaceContainer interfaces;
test.Run ();
test.Report (std::cout);
return 0;
}
//----------------------------------------------------------------------------AodvExample::AodvExample () :
size (10), step
(50), 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;
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::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 ()
{
WifiMacHelper wifiMac;
wifiMac.SetType ("ns3::AdhocWifiMac");
YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default ();
YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();
wifiPhy.SetChannel (wifiChannel.Create ()); WifiHelper wifi;
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); // has effect on the next Install ()
stack.Install (nodes);
Ipv4AddressHelper address;
address.SetBase ("10.0.0.0", "255.0.0.0");
interfaces = address.Assign (devices);
if (printRoutes)
{
Ptr<OutputStreamWrapper> routingStream = Create<OutputStreamWrapper> ("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));
WireShark:
Q2:
Code:
#include "ns3/aodv-module.h"
#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/internet-module.h"
#include "ns3/mobility-module.h"
#include "ns3/point-to-point-module.h"
#include "ns3/wifi-module.h"
#include "ns3/v4ping-helper.h"
#include "ns3/position-allocator.h"
#include "ns3/propagation-loss-model.h"
#include "ns3/applications-module.h"
#include "ns3/v4ping.h"
#include "ns3/flow-monitor-module.h"
#include "ns3/udp-client-server-helper.h"
#include "ns3/udp-server.h"
#include <iostream>
#include <cmath>
#include <string>
#include <fstream>
/**
* \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.0.4] *
* 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:
// parameters ///
Number of nodes
uint32_t size;
/// Distance between nodes, meters
double step;
/// Simulation time, seconds
double simTime;
/// Write per-device PCAP traces if true
bool pcap;
/// Print routes if true
bool printRoutes;
// network
NodeContainer nodes;
NetDeviceContainer devices;
Ipv4InterfaceContainer interfaces;
Address serverAddress[50];
UdpServer sermon;
YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default (); WifiMacHelper
wifiMac;
NS_LOG_COMPONENT_DEFINE ("ManetTest");
test.Run ();
test.Report (std::cout);
return 0;
}
//-----------------------------------------------------------------------------
AodvExample::AodvExample () :
size (20),
step (5),
simTime (50),
pcap (true),
printRoutes (false)
{}
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;
if (verbose)
{
LogComponentEnable ("UdpSocket", LOG_LEVEL_INFO);
LogComponentEnable ("UdpServer", LOG_LEVEL_INFO);
}
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 " << simTime << " s ...\n";
Simulator::Stop (Seconds (simTime));
Simulator::Run ();
Simulator::Destroy ();
}
void
AodvExample::Report (std::ostream &)
{
}
void
AodvExample::CreateNodes ()
{
std::cout << "Creating " << (unsigned)size << " nodes with transmission range " << txrange <<
"m.\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));
}
std::string line;
ifstream file(topology);
uint16_t i = 0;
double vec[3];
if(file.is_open())
{ while(getline(file,line)) {
while(token != NULL)
{
//printf("[%s]\n", token);
vec[i] = atof(token);
i++;
token = strtok (NULL, ",");
if(i == 3) {
//std::cout << "\n" << vec[0] << " " << vec[1] << " " << vec[2] << "\
n"; positionAllocS->Add(Vector(vec[1], vec[2], 0.0)); i = 0;
}
}
}
file.close();
}
else
{
std::cout<<"Error in csv file"<< '\n'; }
MobilityHelper mobilityS;
mobilityS.SetPositionAllocator(positionAllocS);
mobilityS.SetMobilityModel("ns3::ConstantPositionMobilityModel"); //whatever it is
mobilityS.Install(nodes);
}
void
AodvExample::CreateDevices ()
{
wifiMac.SetType ("ns3::AdhocWifiMac");
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); // has effect on the next Install ()
stack.Install (nodes);
Ipv4AddressHelper address;
address.SetBase ("10.0.0.0", "255.0.0.0");
interfaces = address.Assign (devices);
/*
if (printRoutes)
{
Ptr<OutputStreamWrapper> routingStream = Create<OutputStreamWrapper> ("aodv.routes",
std::ios::out);
aodv.PrintRoutingTableAllAt (Seconds (8), routingStream);
}
*/
}
void
AodvExample::InstallApplications ()
{
uint16_t i = 0;
uint16_t j = 0;
uint16_t k = 0;
//uint16_t n = 10;
uint16_t port = 4000;
UdpServerHelper server (port);
ApplicationContainer apps;
// Create one UdpClient application to send UDP datagrams from node zero to
// node one.
uint32_t rxPacketsum = 0;
double Delaysum = 0; uint32_t
txPacketsum = 0; uint32_t
txBytessum = 0; uint32_t
rxBytessum = 0; uint32_t
txTimeFirst = 0; uint32_t
rxTimeLast = 0;
uint32_t lostPacketssum = 0;
FlowMonitorHelper flowmon;
Ptr<FlowMonitor> monitor = flowmon.InstallAll();
monitor->CheckForLostPackets ();
//std::cout << "Flow " << i->first << " (" << t.sourceAddress << " -> " << t.destinationAddress
<< ")\n";
//std::cout << " Tx Bytes: " << i->second.txBytes << "\n";
//std::cout << " Rx Bytes: " << i->second.rxBytes << "\n";
//std::cout << " Throughput: " << i->second.rxBytes * 8.0 / (i-
>second.timeLastRxPacket.GetSeconds() - i->second.timeFirstTxPacket.GetSeconds())/1024/1024
<< " Mbps\n";
}
}
uint64_t timeDiff = (rxTimeLast - txTimeFirst);