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

How to Implement Hot xy routing in ns3

To implement XY routing in ns3,we need to create a new module. Because in this routing strategy, packets are first routed along the X-axis and then along the Y-axis. One of the type in XY routing is Hot XY routing which is oftenly used in mesh networks and chip multiprocessors, when the preferred path is congested it will add the flexibility to the deflection routing.

Here’s a step-by-step guide to implement Hot XY routing in ns3:

Step-by-step guide to Implement Hot XY in ns3

  1. Set Up Your ns-3 Workspace: Make sure ns3 is installed on the system.
  2. Create a New Module for Hot XY Routing:
    • Navigate to the src directory of ns3 and create a new directory named hot-xy-routing.
    • Inside the hot-xy-routing directory, create subdirectories: model, helper, and examples.
  3. Define the Hot XY Routing Protocol:
    • In the model directory, create .cc and .h files for the Hot XY routing protocol. Define the HotXyRoutingProtocol class that inherits from the Ipv4RoutingProtocol class.
  4. Implement the Routing Logic:
    • Implement the Hot XY routing logic to route packets along the X-axis first and then the Y-axis. If the preferred route is congested, deflect to alternative routes.
  5. Integrate with ns-3’s Routing System:
    • Modify the RoutingHelper class to include your Hot XY routing protocol.
    • Register the Hot XY routing protocol as a routing protocol in ns3.
  6. Create a Simulation Script:
    • Set up a network topology.
    • Install the Internet stack.
    • Use the Hot XY routing helper to enable the Hot XY routing protocol.
    • Set up applications and run the simulation.

Example Code Structure

Here’s an example code structure for implementing Hot XY routing in ns3.

Define Hot XY Routing Protocol

// src/hot-xy-routing/model/hot-xy-routing-protocol.h

#ifndef HOT_XY_ROUTING_PROTOCOL_H

#define HOT_XY_ROUTING_PROTOCOL_H

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

#include “ns3/ipv4.h”

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

#include “ns3/ipv4-route.h”

#include “ns3/node.h”

#include “ns3/net-device.h”

#include “ns3/socket.h”

#include “ns3/timer.h”

#include <map>

#include <vector>

namespace ns3 {

class HotXyRoutingProtocol : public Ipv4RoutingProtocol

{

public:

static TypeId GetTypeId (void);

HotXyRoutingProtocol ();

virtual ~HotXyRoutingProtocol ();

 

// 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);

private:

void Start ();

void Stop ();

Ptr<Ipv4> m_ipv4;

std::map<Ipv4Address, Ptr<Ipv4Route>> m_routes;

Ptr<Ipv4Route> FindRoute (Ipv4Address dest);

Ptr<Ipv4Route> DeflectRoute (Ipv4Address dest);

};

} // namespace ns3

#endif // HOT_XY_ROUTING_PROTOCOL_H

Implement Hot XY Routing Protocol

// src/hot-xy-routing/model/hot-xy-routing-protocol.cc

#include “hot-xy-routing-protocol.h”

#include “ns3/log.h”

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

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

namespace ns3 {

NS_LOG_COMPONENT_DEFINE (“HotXyRoutingProtocol”);

NS_OBJECT_ENSURE_REGISTERED (HotXyRoutingProtocol);

TypeId

HotXyRoutingProtocol::GetTypeId (void)

{

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

.SetParent<Ipv4RoutingProtocol> ()

.SetGroupName (“Internet”)

.AddConstructor<HotXyRoutingProtocol> ();

return tid;

}

HotXyRoutingProtocol::HotXyRoutingProtocol ()

{

NS_LOG_FUNCTION (this);

}

HotXyRoutingProtocol::~HotXyRoutingProtocol ()

{

NS_LOG_FUNCTION (this);

}

void

HotXyRoutingProtocol::SetIpv4 (Ptr<Ipv4> ipv4)

{

NS_LOG_FUNCTION (this << ipv4);

m_ipv4 = ipv4;

}

void

HotXyRoutingProtocol::NotifyInterfaceUp (uint32_t interface)

{

NS_LOG_FUNCTION (this << interface);

}

void

HotXyRoutingProtocol::NotifyInterfaceDown (uint32_t interface)

{

NS_LOG_FUNCTION (this << interface);

}

void

HotXyRoutingProtocol::NotifyAddAddress (uint32_t interface, Ipv4InterfaceAddress address)

{

NS_LOG_FUNCTION (this << interface << address);

}

void

HotXyRoutingProtocol::NotifyRemoveAddress (uint32_t interface, Ipv4InterfaceAddress address)

{

NS_LOG_FUNCTION (this << interface << address);

}

void

HotXyRoutingProtocol::Start ()

{

NS_LOG_FUNCTION (this);

}

void

HotXyRoutingProtocol::Stop ()

{

NS_LOG_FUNCTION (this);

}

Ptr<Ipv4Route>

HotXyRoutingProtocol::RouteOutput (Ptr<Packet> p, const Ipv4Header &header,

Ptr<NetDevice> oif, Socket::SocketErrno &sockerr)

{

NS_LOG_FUNCTION (this << p << header << oif << sockerr);

Ipv4Address dest = header.GetDestination ();

Ptr<Ipv4Route> route = FindRoute (dest);

if (route == nullptr)

{

route = DeflectRoute (dest);

}

return route;

}

bool

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

UnicastForwardCallback ucb, MulticastForwardCallback mcb,

LocalDeliverCallback lcb, ErrorCallback ecb)

{

NS_LOG_FUNCTION (this << p << header << idev << ucb << mcb << lcb << ecb);

Ipv4Address dest = header.GetDestination ();

Ptr<Ipv4Route> route = FindRoute (dest);

if (route != nullptr)

{

ucb (route, p, header);

return true;

}

route = DeflectRoute (dest);

if (route != nullptr)

{

ucb (route, p, header);

return true;

}

return false;

}

Ptr<Ipv4Route>

HotXyRoutingProtocol::FindRoute (Ipv4Address dest)

{

NS_LOG_FUNCTION (this << dest);

// Implement XY routing logic here

// This example assumes a simple grid topology

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

route->SetDestination (dest);

// Example logic to find the route

// Replace with actual logic to find the next hop based on XY routing

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

{

route = m_routes[dest];

}

return route;

}

 

Ptr<Ipv4Route>

HotXyRoutingProtocol::DeflectRoute (Ipv4Address dest)

{

NS_LOG_FUNCTION (this << dest);

// Implement deflection logic here

// This example deflects to the first available route

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

route->SetDestination (dest);

if (!m_routes.empty ())

{

route = m_routes.begin ()->second;

}

return route;

}

} // namespace ns3

Helper Class

// src/hot-xy-routing/helper/hot-xy-routing-helper.h

#ifndef HOT_XY_ROUTING_HELPER_H

#define HOT_XY_ROUTING_HELPER_H

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

#include “ns3/object-factory.h”

#include “ns3/hot-xy-routing-protocol.h”

 

namespace ns3 {

class HotXyRoutingHelper : public Ipv4RoutingHelper

{

public:

HotXyRoutingHelper ();

HotXyRoutingHelper (const HotXyRoutingHelper &);

HotXyRoutingHelper &operator= (const HotXyRoutingHelper &);

virtual ~HotXyRoutingHelper ();

virtual HotXyRoutingHelper* Copy (void) const;

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

};

} // namespace ns3

#endif // HOT_XY_ROUTING_HELPER_H

Implement Helper Class

// src/hot-xy-routing/helper/hot-xy-routing-helper.cc

#include “hot-xy-routing-helper.h”

#include “ns3/hot-xy-routing-protocol.h”

#include “ns3/node.h”

namespace ns3 {

HotXyRoutingHelper::HotXyRoutingHelper ()

{

}

 

HotXyRoutingHelper::HotXyRoutingHelper (const HotXyRoutingHelper &o)

{

}

HotXyRoutingHelper&

HotXyRoutingHelper::operator= (const HotXyRoutingHelper &o)

{

return *this;

}

HotXyRoutingHelper::~HotXyRoutingHelper ()

{

}

HotXyRoutingHelper*

HotXyRoutingHelper::Copy (void) const

{

return new HotXyRoutingHelper (*this);

}

Ptr<Ipv4RoutingProtocol>

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

{

Ptr<HotXyRoutingProtocol> protocol = CreateObject<HotXyRoutingProtocol> ();

node->AggregateObject (protocol);

return protocol;

}

 

} // namespace ns3

Example Simulation Script

// examples/hot-xy-routing-simulation.cc

#include “ns3/core-module.h”

#include “ns3/network-module.h”

#include “ns3/internet-module.h”

#include “ns3/point-to-point-module.h”

#include “ns3/applications-module.h”

#include “ns3/hot-xy-routing-helper.h”

using namespace ns3;

NS_LOG_COMPONENT_DEFINE (“HotXyRoutingExample”);

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

{

CommandLine cmd;

cmd.Parse (argc, argv);

// Create nodes

NodeContainer nodes;

nodes.Create (4);

// Create point-to-point links

PointToPointHelper p2p;

p2p.SetDeviceAttribute (“DataRate”, StringValue (“1Mbps”));

p2p.SetChannelAttribute (“Delay”, StringValue (“10ms”));

 

NetDeviceContainer devices01 = p2p.Install (nodes.Get (0), nodes.Get (1));

NetDeviceContainer devices02 = p2p.Install (nodes.Get (0), nodes.Get (2));

NetDeviceContainer devices13 = p2p.Install (nodes.Get (1), nodes.Get (3));

NetDeviceContainer devices23 = p2p.Install (nodes.Get (2), nodes.Get (3));

// Install the Internet stack

InternetStackHelper stack;

HotXyRoutingHelper hotXyRouting;

stack.SetRoutingHelper (hotXyRouting);

stack.Install (nodes);

// Assign IP addresses

Ipv4AddressHelper address;

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

Ipv4InterfaceContainer interfaces01 = address.Assign (devices01);

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

Ipv4InterfaceContainer interfaces02 = address.Assign (devices02);

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

Ipv4InterfaceContainer interfaces13 = address.Assign (devices13);

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

Ipv4InterfaceContainer interfaces23 = address.Assign (devices23);

// Create a packet sink to receive packets

uint16_t sinkPort = 8080;

Address sinkAddress (InetSocketAddress (Ipv4Address (“10.1.4.1”), sinkPort));

PacketSinkHelper packetSinkHelper (“ns3::TcpSocketFactory”, sinkAddress);

ApplicationContainer sinkApps = packetSinkHelper.Install (nodes.Get (3));

sinkApps.Start (Seconds (1.0));

sinkApps.Stop (Seconds (10.0));

// Create a TCP client to send packets

OnOffHelper clientHelper (“ns3::TcpSocketFactory”, sinkAddress);

clientHelper.SetAttribute(“OnTime”,StringValue (“ns3::ConstantRandomVariable[Constant=1]”));

clientHelper.SetAttribute(“OffTime”,StringValue (“ns3::ConstantRandomVariable[Constant=0]”));

clientHelper.SetAttribute (“DataRate”, DataRateValue (DataRate (“1Mbps”)));

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

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

clientApps.Start (Seconds (2.0));

clientApps.Stop (Seconds (10.0));

// Enable tracing

AsciiTraceHelper ascii;

p2p.EnableAsciiAll (ascii.CreateFileStream (“hot-xy-routing.tr”));

p2p.EnablePcapAll (“hot-xy-routing”);

// Run the simulation

Simulator::Run ();

Simulator::Destroy ();

return 0;

}

Running the Simulation

To run the simulation, compile the script and execute it:

./waf configure –enable-examples

./waf build

./waf –run hot-xy-routing-example

At last, we all get to know the implementation process of XY routing in which the packets are first routed along the X-axis and then Y-axis which adds the flexibility of deflection routing in the congested path.

Still struggling with implementation of Hot xy routing in ns3 then contact ns3simulation.com we guarantee you the best results.