Ns3 Projects for B.E/B.Tech M.E/M.Tech PhD Scholars.  Phone-Number:9790238391   E-mail: ns3simulation@gmail.com

How to implement DYMO protocol in ns3

To implement the Dynamic MANET On-demand (DYMO) protocol in ns3 is a general task that consists to make a unique routing module that manages the particular characteristics of DYMO, we have shared with you some ideas. Here are the step by step procedures to make the DYMO protocol in ns3 environment.

Step-by-Step Guide to Implementing DYMO in ns-3

  1. Set Up Your Environment

Make sure you have ns-3 installed. If not, download and set it up from the official website

  1. Create a New ns-3 Module

Create a new module for DYMO in the src directory of your ns-3 installation. This involves creating the necessary directory structure and files.

cd ns-3.xx

cd src

mkdir -p dymo/model

mkdir -p dymo/helper

3.      Create the DYMO Protocol Header File

Create the DYMO routing protocol header file dymo-routing-protocol.h in the model directory.

#ifndef DYMO_ROUTING_PROTOCOL_H

#define DYMO_ROUTING_PROTOCOL_H

#include “ns3/ipv4-routing-protocol.h”

#include “ns3/ipv4-address.h”

#include “ns3/timer.h”

#include “ns3/mobility-model.h”

#include “ns3/node.h”

#include “ns3/net-device.h”

#include “ns3/ipv4.h”

#include “ns3/ipv4-routing-table-entry.h”

#include <map>

#include <vector>

namespace ns3 {

class DymoRoutingProtocol : public Ipv4RoutingProtocol

{

public:

  static TypeId GetTypeId (void);

  DymoRoutingProtocol ();

  virtual ~DymoRoutingProtocol ();

  // Inherited from Ipv4RoutingProtocol

  virtual Ptr<Ipv4Route> RouteOutput (Ptr<Packet> p, const Ipv4Header &header, Ptr<NetDevice> oif, Socket::SocketErrno &sockerr);

  virtual bool RouteInput (Ptr<const Packet> p, const Ipv4Header &header, Ptr<const NetDevice> idev,

                           UnicastForwardCallback ucb, MulticastForwardCallback mcb, LocalDeliverCallback lcb, ErrorCallback ecb);

  virtual void NotifyInterfaceUp (uint32_t interface);

  virtual void NotifyInterfaceDown (uint32_t interface);

  virtual void NotifyAddAddress (uint32_t interface, Ipv4InterfaceAddress address);

  virtual void NotifyRemoveAddress (uint32_t interface, Ipv4InterfaceAddress address);

  virtual void SetIpv4 (Ptr<Ipv4> ipv4);

  virtual void PrintRoutingTable (Ptr<OutputStreamWrapper> stream) const;

private:

  Ptr<Ipv4> m_ipv4;

  std::map<Ipv4Address, Ipv4RoutingTableEntry> m_routingTable;

  void SendRREQ (Ipv4Address dest);

  void SendRREP (Ipv4Address dest, Ipv4Address origin);

  void SendRERR (Ipv4Address dest);

  Ptr<NetDevice> GetNetDevice (uint32_t interface);

  Ptr<MobilityModel> GetMobilityModel (Ptr<NetDevice> netDevice);

  Ipv4Address GetNextHop (Ipv4Address dest);

};

} // namespace ns3

#endif /* DYMO_ROUTING_PROTOCOL_H */

4.      Create the DYMO Protocol Source File

Create the DYMO routing protocol source file dymo-routing-protocol.cc in the model directory.

#include “dymo-routing-protocol.h”

#include “ns3/log.h”

#include “ns3/ipv4-route.h”

#include “ns3/simulator.h”

namespace ns3 {

NS_LOG_COMPONENT_DEFINE (“DymoRoutingProtocol”);

NS_OBJECT_ENSURE_REGISTERED (DymoRoutingProtocol);

TypeId

DymoRoutingProtocol::GetTypeId (void)

{

  static TypeId tid = TypeId (“ns3::DymoRoutingProtocol”)

    .SetParent<Ipv4RoutingProtocol> ()

    .SetGroupName(“Internet”)

    .AddConstructor<DymoRoutingProtocol> ();

  return tid;

}

DymoRoutingProtocol::DymoRoutingProtocol ()

{

}

DymoRoutingProtocol::~DymoRoutingProtocol ()

{

}

void

DymoRoutingProtocol::SetIpv4 (Ptr<Ipv4> ipv4)

{

  m_ipv4 = ipv4;

}

Ptr<NetDevice>

DymoRoutingProtocol::GetNetDevice (uint32_t interface)

{

  return m_ipv4->GetNetDevice (interface);

}

Ptr<MobilityModel>

DymoRoutingProtocol::GetMobilityModel (Ptr<NetDevice> netDevice)

{

  return netDevice->GetNode ()->GetObject<MobilityModel> ();

}

Ipv4Address

DymoRoutingProtocol::GetNextHop (Ipv4Address dest)

{

  if (m_routingTable.find(dest) != m_routingTable.end())

    {

      return m_routingTable[dest].GetGateway();

    }

  return Ipv4Address::GetBroadcast ();

}

Ptr<Ipv4Route>

DymoRoutingProtocol::RouteOutput (Ptr<Packet> p, const Ipv4Header &header, Ptr<NetDevice> oif, Socket::SocketErrno &sockerr)

{

  Ipv4Address dest = header.GetDestination ();

  Ipv4Address nextHop = GetNextHop (dest);

  if (nextHop == Ipv4Address::GetBroadcast ())

    {

      SendRREQ (dest);

      sockerr = Socket::ERROR_NOROUTETOHOST;

      return nullptr;

    }

  Ptr<Ipv4Route> route = Create<Ipv4Route> ();

  route->SetDestination (dest);

  route->SetGateway (nextHop);

  route->SetOutputDevice (m_ipv4->GetNetDevice (m_ipv4->GetInterfaceForAddress (nextHop)));

  return route;

}

bool

DymoRoutingProtocol::RouteInput (Ptr<const Packet> p, const Ipv4Header &header, Ptr<const NetDevice> idev,

                                 UnicastForwardCallback ucb, MulticastForwardCallback mcb, LocalDeliverCallback lcb, ErrorCallback ecb)

{

  Ipv4Address dest = header.GetDestination ();

  Ipv4Address nextHop = GetNextHop (dest);

  if (nextHop == Ipv4Address::GetBroadcast ())

    {

      SendRREQ (dest);

      ecb (p, header, Socket::ERROR_NOROUTETOHOST);

      return false;

    }

  Ptr<Ipv4Route> route = Create<Ipv4Route> ();

  route->SetDestination (dest);

  route->SetGateway (nextHop);

  route->SetOutputDevice (m_ipv4->GetNetDevice (m_ipv4->GetInterfaceForAddress (nextHop)));

  ucb (route, p, header);

  return true;

}

void

DymoRoutingProtocol::SendRREQ (Ipv4Address dest)

{

  // Implementation of RREQ packet sending

  NS_LOG_FUNCTION (this << dest);

}

void

DymoRoutingProtocol::SendRREP (Ipv4Address dest, Ipv4Address origin)

{

  // Implementation of RREP packet sending

  NS_LOG_FUNCTION (this << dest << origin);

}

void

DymoRoutingProtocol::SendRERR (Ipv4Address dest)

{

  // Implementation of RERR packet sending

  NS_LOG_FUNCTION (this << dest);

}

void

DymoRoutingProtocol::NotifyInterfaceUp (uint32_t interface)

{

}

void

DymoRoutingProtocol::NotifyInterfaceDown (uint32_t interface)

{

}

void

DymoRoutingProtocol::NotifyAddAddress (uint32_t interface, Ipv4InterfaceAddress address)

{

}

void

DymoRoutingProtocol::NotifyRemoveAddress (uint32_t interface, Ipv4InterfaceAddress address)

{

}

void

DymoRoutingProtocol::PrintRoutingTable (Ptr<OutputStreamWrapper> stream) const

{

  *stream->GetStream () << “DYMO Routing Table” << std::endl;

  for (auto const &entry : m_routingTable)

    {

      *stream->GetStream () << entry.first << ” -> ” << entry.second.GetGateway () << ” via ” << entry.second.GetInterface () << std::endl;

    }

}

} // namespace ns3

5.      Define DYMO Helper

Create the DYMO helper header file dymo-helper.h in the helper directory.

#ifndef DYMO_HELPER_H

#define DYMO_HELPER_H

#include “ns3/ipv4-routing-helper.h”

#include “dymo-routing-protocol.h”

namespace ns3 {

class DymoHelper : public Ipv4RoutingHelper

{

public:

  DymoHelper ();

  virtual ~DymoHelper ();

  DymoHelper* Copy (void) const;

  virtual Ptr<Ipv4RoutingProtocol> Create (Ptr<Node> node) const;

};

} // namespace ns3

#endif /* DYMO_HELPER_H */

Create the DYMO helper source file dymo-helper.cc in the helper directory.

#include “dymo-helper.h”

#include “ns3/node.h”

#include “ns3/ipv4.h”

namespace ns3 {

DymoHelper::DymoHelper ()

{

}

DymoHelper::~DymoHelper ()

{

}

DymoHelper*

DymoHelper::Copy (void) const

{

  return new DymoHelper (*this);

}

Ptr<Ipv4RoutingProtocol>

DymoHelper::Create (Ptr<Node> node) const

{

  Ptr<DymoRoutingProtocol> dymoRouting = CreateObject<DymoRoutingProtocol> ();

  node->AggregateObject (dymoRouting);

  return dymoRouting;

}

} // namespace ns3

6.      Update CMakeLists.txt

Add the new DYMO module to the ns-3 build system. Edit src/CMakeLists.txt and add the following line:

add_subdirectory (dymo)

Create src/dymo/CMakeLists.txt with the following content:

ns3_add_library (dymo

    model/dymo-routing-protocol.cc

    helper/dymo-helper.cc

)

target_link_libraries (dymo)

7.      Set Up the Network Topology

Create a simulation script in the scratch directory to use the DYMO protocol.

#include “ns3/core-module.h”

#include “ns3/network-module.h”

#include “ns3/internet-module.h”

#include “ns3/wifi-module.h”

#include “ns3/mobility-module.h”

#include “ns3/applications-module.h”

#include “dymo-helper.h”

using namespace ns3;

int main (int argc, char *argv[])

{

  CommandLine cmd;

  cmd.Parse (argc, argv);

  NodeContainer nodes;

  nodes.Create (10);

  // Set up WiFi

  WifiHelper wifi;

  wifi.SetStandard (WIFI_PHY_STANDARD_80211b);

  YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default ();

  YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();

  wifiPhy.SetChannel (wifiChannel.Create ());

  WifiMacHelper wifiMac;

  wifiMac.SetType (“ns3::AdhocWifiMac”);

  NetDeviceContainer devices = wifi.Install (wifiPhy, wifiMac, nodes);

  // Set up mobility model

  MobilityHelper mobility;

  Ptr<UniformRandomVariable> random = CreateObject<UniformRandomVariable> ();

  mobility.SetPositionAllocator (“ns3::RandomRectanglePositionAllocator”,

                                 “MinX”, DoubleValue (0.0),

                                 “MinY”, DoubleValue (0.0),

                                 “MaxX”, DoubleValue (100.0),

                                 “MaxY”, DoubleValue (100.0));

  mobility.SetMobilityModel (“ns3::RandomWaypointMobilityModel”,

                             “Speed”, StringValue (“ns3::ConstantRandomVariable[Constant=20.0]”),

                             “Pause”, StringValue (“ns3::ConstantRandomVariable[Constant=0.0]”),

                             “PositionAllocator”, StringValue (“ns3::RandomRectanglePositionAllocator[MinX=0.0|MinY=0.0|MaxX=100.0|MaxY=100.0]”));

  mobility.Install (nodes);

  // Install the internet stack on nodes

  InternetStackHelper stack;

  DymoHelper dymo;

  stack.SetRoutingHelper (dymo);

  stack.Install (nodes);

  // Assign IP addresses to the devices

  Ipv4AddressHelper address;

  address.SetBase (“10.1.1.0”, “255.255.255.0”);

  Ipv4InterfaceContainer interfaces = address.Assign (devices);

 

  // Set up applications (e.g., a UDP echo server and client)

  UdpEchoServerHelper echoServer (9);

  ApplicationContainer serverApps = echoServer.Install (nodes.Get (9));

  serverApps.Start (Seconds (1.0));

  serverApps.Stop (Seconds (10.0));

  UdpEchoClientHelper echoClient (interfaces.GetAddress (9), 9);

  echoClient.SetAttribute (“MaxPackets”, UintegerValue (1));

  echoClient.SetAttribute (“Interval”, TimeValue (Seconds (1.0)));

  echoClient.SetAttribute (“PacketSize”, UintegerValue (1024));

  ApplicationContainer clientApps = echoClient.Install (nodes.Get (0));

  clientApps.Start (Seconds (2.0));

  clientApps.Stop (Seconds (10.0));

  // Enable tracing

  AsciiTraceHelper ascii;

  wifiPhy.EnableAsciiAll (ascii.CreateFileStream (“dymo-simulation.tr”));

  wifiPhy.EnablePcapAll (“dymo-simulation”);

  // Run the simulation

  Simulator::Run ();

  Simulator::Destroy ();

  return 0;

}

8.      Build and Run the Simulation

After writing your script, you need to build and run it.

./waf build

./waf –run scratch/dymo-simulation

9.      Analyze the Results

After running the simulation, you can analyse the results using the generated trace files (dymo-simulation.tr and dymo-simulation-0-0.pcap).

Complete Example Script for DYMO Protocol

At this point we provide the sample reference to complete the DYMO protocol in ns3:

#include “ns3/core-module.h”

#include “ns3/network-module.h”

#include “ns3/internet-module.h”

#include “ns3/wifi-module.h”

#include “ns3/mobility-module.h”

#include “ns3/applications-module.h”

#include “dymo-helper.h”

using namespace ns3;

int main (int argc, char *argv[])

{

  CommandLine cmd;

  cmd.Parse (argc, argv);

  NodeContainer nodes;

  nodes.Create (10);

 

  // Set up WiFi

  WifiHelper wifi;

  wifi.SetStandard (WIFI_PHY_STANDARD_80211b);

  YansWifiPhyHelper wifiPhy = YansWifiPhyHelper::Default ();

  YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();

  wifiPhy.SetChannel (wifiChannel.Create ());

  WifiMacHelper wifiMac;

  wifiMac.SetType (“ns3::AdhocWifiMac”);

  NetDeviceContainer devices = wifi.Install (wifiPhy, wifiMac, nodes);

  // Set up mobility model

  MobilityHelper mobility;

  Ptr<UniformRandomVariable> random = CreateObject<UniformRandomVariable> ();

  mobility.SetPositionAllocator (“ns3::RandomRectanglePositionAllocator”,

                                 “MinX”, DoubleValue (0.0),

                                 “MinY”, DoubleValue (0.0),

                                 “MaxX”, DoubleValue (100.0),

                                 “MaxY”, DoubleValue (100.0));

  mobility.SetMobilityModel (“ns3::RandomWaypointMobilityModel”,

                             “Speed”, StringValue (“ns3::ConstantRandomVariable[Constant=20.0]”),

                             “Pause”, StringValue (“ns3::ConstantRandomVariable[Constant=0.0]”),

                             “PositionAllocator”, StringValue (“ns3::RandomRectanglePositionAllocator[MinX=0.0|MinY=0.0|MaxX=100.0|MaxY=100.0]”));

  mobility.Install (nodes);

  // Install the internet stack on nodes

  InternetStackHelper stack;

  DymoHelper dymo;

  stack.SetRoutingHelper (dymo);

  stack.Install (nodes);

  // Assign IP addresses to the devices

  Ipv4AddressHelper address;

  address.SetBase (“10.1.1.0”, “255.255.255.0”);

  Ipv4InterfaceContainer interfaces = address.Assign (devices);

  // Set up applications (e.g., a UDP echo server and client)

  UdpEchoServerHelper echoServer (9);

  ApplicationContainer serverApps = echoServer.Install (nodes.Get (9));

  serverApps.Start (Seconds (1.0));

  serverApps.Stop (Seconds (10.0));

  UdpEchoClientHelper echoClient (interfaces.GetAddress (9), 9);

  echoClient.SetAttribute (“MaxPackets”, UintegerValue (1));

  echoClient.SetAttribute (“Interval”, TimeValue (Seconds (1.0)));

  echoClient.SetAttribute (“PacketSize”, UintegerValue (1024));

  ApplicationContainer clientApps = echoClient.Install (nodes.Get (0));

  clientApps.Start (Seconds (2.0));

  clientApps.Stop (Seconds (10.0));

 

  // Enable tracing

  AsciiTraceHelper ascii;

  wifiPhy.EnableAsciiAll (ascii.CreateFileStream (“dymo-simulation.tr”));

  wifiPhy.EnablePcapAll (“dymo-simulation”);

  // Run the simulation

  Simulator::Run ();

  Simulator::Destroy ();

  return 0;

}

Finally, here we discussed about how to implement the DYMO protocol in ns3 environment and also provide and hep to give related information about DYMO protocol setting. DYMO protocol in ns3 coding are aided by us for all environments .