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

How to Implement unicast routing in ns3

To implement a unicast routing protocol in ns-3, we create a custom routing protocol for handling the routing of packets from a single source to a single destination.

The given below steps will guide to implement the unicast routing in ns3.

Step-by-Step Implementation

  1. Set Up ns-3 Environment: Make sure that ns3 is installed on the system.
  2. Include Necessary Libraries: Include the required ns-3 libraries in your script.
  3. Define Network Topology: Create the nodes and links for your network topology.
  4. Install Internet Stack: Install the Internet stack on your nodes.
  5. Implement the Unicast Routing Protocol: Create a custom routing protocol class that routes packets based on unicast routing principles.
  6. Integrate the Custom Routing Protocol: Integrate your custom routing protocol into the ns-3 stack.
  7. Set Up Applications: Install applications to generate traffic and test the routing.
  8. Run the Simulation: Configure the simulation parameters and run it.

Example Implementation in C++

Here’s a detailed example to help you implement a unicast routing protocol in ns-3:

  1. Include Libraries:

#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/ipv4-routing-protocol.h”

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

#include <map>

Define Network Topology:

using namespace ns3;

 

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

CommandLine cmd;

cmd.Parse(argc, argv);

 

NodeContainer nodes;

nodes.Create(4);

 

PointToPointHelper pointToPoint;

pointToPoint.SetDeviceAttribute(“DataRate”, StringValue(“5Mbps”));

pointToPoint.SetChannelAttribute(“Delay”, StringValue(“2ms”));

 

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

NetDeviceContainer devices12 = pointToPoint.Install(nodes.Get(1), nodes.Get(2));

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

NetDeviceContainer devices30 = pointToPoint.Install(nodes.Get(3), nodes.Get(0));

 

InternetStackHelper stack;

stack.Install(nodes);

 

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 interfaces12 = address.Assign(devices12);

 

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

Ipv4InterfaceContainer interfaces23 = address.Assign(devices23);

 

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

Ipv4InterfaceContainer interfaces30 = address.Assign(devices30);

Implement the Unicast Routing Protocol:

  • Create a new header file unicast-routing.h:

#ifndef UNICAST_ROUTING_H

#define UNICAST_ROUTING_H

 

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

#include “ns3/ipv4.h”

#include “ns3/net-device.h”

#include “ns3/ptr.h”

#include “ns3/socket.h”

#include <map>

#include <vector>

 

namespace ns3 {

class UnicastRouting : public Ipv4RoutingProtocol {

public:

static TypeId GetTypeId(void);

UnicastRouting();

virtual ~UnicastRouting();

 

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

 

void Start();

 

private:

void ComputeRoutes();

void DistributeRoutes();

void ReceiveRoutes(Ptr<Socket> socket);

 

Ptr<Ipv4> m_ipv4;

std::map<Ipv4Address, Ipv4Address> m_routingTable;

std::map<uint32_t, Ptr<Socket>> m_socketMap;

Time m_updateInterval;

EventId m_updateEvent;

};

}

 

#endif // UNICAST_ROUTING_H

Create the corresponding implementation file unicast-routing.cc:

#include “unicast-routing.h”

#include “ns3/log.h”

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

#include “ns3/simulator.h”

#include “ns3/inet-socket-address.h”

 

namespace ns3 {

NS_LOG_COMPONENT_DEFINE(“UnicastRouting”);

NS_OBJECT_ENSURE_REGISTERED(UnicastRouting);

 

TypeId UnicastRouting::GetTypeId(void) {

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

.SetParent<Ipv4RoutingProtocol>()

.SetGroupName(“Internet”)

.AddConstructor<UnicastRouting>();

return tid;

}

 

UnicastRouting::UnicastRouting() : m_updateInterval(Seconds(5)) {

NS_LOG_FUNCTION(this);

Simulator::Schedule(Seconds(1.0), &UnicastRouting::Start, this);

}

 

UnicastRouting::~UnicastRouting() {

NS_LOG_FUNCTION(this);

}

 

void UnicastRouting::SetIpv4(Ptr<Ipv4> ipv4) {

NS_LOG_FUNCTION(this << ipv4);

m_ipv4 = ipv4;

}

 

void UnicastRouting::Start() {

NS_LOG_FUNCTION(this);

ComputeRoutes();

DistributeRoutes();

m_updateEvent = Simulator::Schedule(m_updateInterval, &UnicastRouting::Start, this);

}

 

void UnicastRouting::ComputeRoutes() {

NS_LOG_FUNCTION(this);

// Example: static routes

m_routingTable[Ipv4Address(“10.1.1.2”)] = Ipv4Address(“10.1.2.1”);

m_routingTable[Ipv4Address(“10.1.2.2”)] = Ipv4Address(“10.1.3.1”);

m_routingTable[Ipv4Address(“10.1.3.2”)] = Ipv4Address(“10.1.4.1”);

m_routingTable[Ipv4Address(“10.1.4.2”)] = Ipv4Address(“10.1.1.1”);

}

 

void UnicastRouting::DistributeRoutes() {

NS_LOG_FUNCTION(this);

Ptr<Packet> packet = Create<Packet>();

 

for (auto const &entry : m_routingTable) {

Ipv4Header header;

header.SetSource(entry.first);

header.SetDestination(entry.second);

packet->AddHeader(header);

}

 

for (uint32_t i = 0; i < m_ipv4->GetNInterfaces(); ++i) {

Ptr<Socket> socket = m_socketMap[i];

socket->SendTo(packet, 0, InetSocketAddress(Ipv4Address::GetBroadcast(), 80));

}

}

 

void UnicastRouting::ReceiveRoutes(Ptr<Socket> socket) {

NS_LOG_FUNCTION(this);

Ptr<Packet> packet = socket->Recv();

Ipv4Header header;

packet->RemoveHeader(header);

 

Ipv4Address src = header.GetSource();

Ipv4Address dest = header.GetDestination();

 

m_routingTable[dest] = src;

}

 

Ptr<Ipv4Route> UnicastRouting::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();

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

sockerr = Socket::ERROR_NOROUTETOHOST;

return 0;

}

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

route->SetDestination(dest);

route->SetGateway(m_routingTable[dest]);

route->SetOutputDevice(oif);

return route;

}

 

bool UnicastRouting::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();

if (dest == m_ipv4->GetAddress(1, 0).GetLocal()) {

lcb(p, header, idev);

return true;

}

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

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

return false;

}

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

route->SetDestination(dest);

route->SetGateway(m_routingTable[dest]);

route->SetOutputDevice(idev);

ucb(route, p, header);

return true;

}

 

void UnicastRouting::NotifyInterfaceUp(uint32_t interface) {

NS_LOG_FUNCTION(this << interface);

Ptr<Socket> socket = Socket::CreateSocket(GetObject<Node>(), TypeId::LookupByName(“ns3::UdpSocketFactory”));

socket->SetAllowBroadcast(true);

socket->BindToNetDevice(m_ipv4->GetNetDevice(interface));

socket->Bind(InetSocketAddress(Ipv4Address::GetAny(), 80));

socket->SetRecvCallback(MakeCallback(&UnicastRouting::ReceiveRoutes, this));

m_socketMap[interface] = socket;

}

 

void UnicastRouting::NotifyInterfaceDown(uint32_t interface) {

NS_LOG_FUNCTION(this << interface);

m_socketMap[interface]->Close();

m_socketMap.erase(interface);

}

 

void UnicastRouting::NotifyAddAddress(uint32_t interface,

Ipv4InterfaceAddress address) {

NS_LOG_FUNCTION(this << interface << address);

}

 

void UnicastRouting::NotifyRemoveAddress(uint32_t interface,

Ipv4InterfaceAddress address) {

NS_LOG_FUNCTION(this << interface << address);

}

}

Integrate the Custom Routing Protocol:

#include “unicast-routing.h”

 

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

CommandLine cmd;

cmd.Parse(argc, argv);

 

NodeContainer nodes;

nodes.Create(4);

 

PointToPointHelper pointToPoint;

pointToPoint.SetDeviceAttribute(“DataRate”, StringValue(“5Mbps”));

pointToPoint.SetChannelAttribute(“Delay”, StringValue(“2ms”));

 

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

NetDeviceContainer devices12 = pointToPoint.Install(nodes.Get(1), nodes.Get(2));

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

NetDeviceContainer devices30 = pointToPoint.Install(nodes.Get(3), nodes.Get(0));

 

InternetStackHelper stack;

UnicastRoutingHelper unicastRouting;

Ipv4ListRoutingHelper list;

list.Add(unicastRouting, 0);

stack.SetRoutingHelper(list);

stack.Install(nodes);

 

Ipv4AddressHelper address;

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

address.Assign(devices01);

 

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

address.Assign(devices12);

 

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

address.Assign(devices23);

 

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

address.Assign(devices30);

 

// Set up applications

uint16_t port = 9;

UdpEchoServerHelper server(port);

ApplicationContainer apps = server.Install(nodes.Get(3));

apps.Start(Seconds(1.0));

apps.Stop(Seconds(10.0));

 

UdpEchoClientHelper client(address.GetAddress(3), port);

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

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

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

 

apps = client.Install(nodes.Get(0));

apps.Start(Seconds(2.0));

apps.Stop(Seconds(10.0));

 

Simulator::Run();

Simulator::Destroy();

return 0;

}

Explanation

  1. Network Topology: The code sets up a network topology with four nodes connected in a ring.
  2. Unicast Routing Protocol: A custom unicast routing protocol class (UnicastRouting) is implemented. This class handles route computation and distribution based on unicast routing principles.
  3. Route Computation: The ComputeRoutes method computes static routes for the network.
  4. Route Distribution: The DistributeRoutes method broadcasts the computed routes to all nodes in the network.
  5. Route Input and Output: The RouteInput and RouteOutput methods handle packet routing based on the routing table.
  6. Integrate Custom Routing Protocol: The custom routing protocol is integrated into the ns-3 stack using the UnicastRoutingHelper.
  7. Applications: UdpEchoServer and UdpEchoClient applications are set up to test the routing.

Running the Code

  1. Save your script to a file, for example, unicast-routing.cc.
  2. Compile the script using the ns-3 build system

./waf configure –enable-examples

./waf build

./waf –run scratch/unicast-routing

Gain touch with ns3simulation.com for best programming results on unicast routing protocol in ns-3