How to Develop Open Shortest Path First Projects Using NS3

To develop the Open Shortest Path First (OSPF) used the NS-3 tool. If we need to simulate OSPF specifically, there are a few methods:

Steps to Develop Open Shortest Path First Projects Using NS3

  1. Introduction to OSPF in NS-3

Open Shortest Path First (OSPF) is link-state routing protocol used in IP networks. It demonstrates the shortest path terms on Dijkstra’s procedures and is generally used in large-scale networks.

OSPF Features

Hierarchical routing (Areas and Backbone – Area 0)

It used the Hello packets for neighbor discovery

We assist the several paths (Equal-Cost Multi-Path – ECMP)

rapidly converges through connection failures

  1. Setting up NS-3 for OSPF

(a) Install and download the tools in NS-3 for your system

sudo apt update

sudo apt install git g++ python3 python3-pip cmake

git clone

cd ns-3-dev

./ns3 configure –enable-examples –enable-tests

./ns3 build

  1. Implementing OSPF in NS-3

NS-3 cannot have a built-in OSPF component, so we require to:

  1. It generates the OSPF Routing Protocol Class.
  2. We apply the Link-State Advertisements (LSA) and Routing Table updates.
  3. Incorporate the OSPF by NS-3 network replication.

Step 1: Create an OSPF Routing Class

State the OSPF Routing Class in ospf-routing.h

#ifndef OSPF_ROUTING_H

#define OSPF_ROUTING_H

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

#include “ns3/ipv4-route.h”

#include “ns3/packet.h”

#include “ns3/socket.h”

#include <map>

class OspfRouting : public ns3::Ipv4RoutingProtocol {

public:

static ns3::TypeId GetTypeId(void);

OspfRouting();

virtual ~OspfRouting();

virtual ns3::Ptr<ns3::Ipv4Route> RouteOutput(

ns3::Ptr<ns3::Packet> packet,

const ns3::Ipv4Header &header,

ns3::Ptr<ns3::NetDevice> oif,

ns3::Socket::SocketErrno &sockerr) override;

virtual bool RouteInput(

ns3::Ptr<const ns3::Packet> packet,

const ns3::Ipv4Header &header,

ns3::Ptr<const ns3::NetDevice> idev,

UnicastForwardCallback ucb,

MulticastForwardCallback mcb,

LocalDeliverCallback lcb,

ErrorCallback ecb) override;

void UpdateRoutingTable();

void SendHelloPackets();

private:

std::map<uint32_t, ns3::Ipv4Route> m_routingTable;

};

#endif // OSPF_ROUTING_H

Step 2: Execute a OSPF Routing Table Updates

Create ospf-routing.cc

#include “ospf-routing.h”

#include “ns3/log.h”

NS_LOG_COMPONENT_DEFINE(“OspfRouting”);

NS_OBJECT_ENSURE_REGISTERED(OspfRouting);

ns3::TypeId OspfRouting::GetTypeId(void) {

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

.SetParent<ns3::Ipv4RoutingProtocol>()

.SetGroupName(“Internet”);

return tid;

}

OspfRouting::OspfRouting() {}

OspfRouting::~OspfRouting() {}

ns3::Ptr<ns3::Ipv4Route> OspfRouting::RouteOutput(

ns3::Ptr<ns3::Packet> packet, const ns3::Ipv4Header &header,

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

NS_LOG_INFO(“OSPF RouteOutput: Finding shortest path for packet”);

return 0;

}

bool OspfRouting::RouteInput(

ns3::Ptr<const ns3::Packet> packet, const ns3::Ipv4Header &header,

ns3::Ptr<const ns3::NetDevice> idev,

UnicastForwardCallback ucb, MulticastForwardCallback mcb,

LocalDeliverCallback lcb, ErrorCallback ecb) {

NS_LOG_INFO(“OSPF RouteInput: Received a packet, updating route”);

return true;

}

void OspfRouting::UpdateRoutingTable() {

NS_LOG_INFO(“OSPF Updating Routing Table using Dijkstra’s Algorithm”);

}

void OspfRouting::SendHelloPackets() {

NS_LOG_INFO(“OSPF Sending Hello packets to discover neighbors”);

}

Step 3: Incorporate the OSPF in NS-3 Simulation

Create ospf-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 “ospf-routing.h”

using namespace ns3;

int main() {

NodeContainer nodes;

nodes.Create(4);

PointToPointHelper p2p;

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

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

NetDeviceContainer devices;

for (uint32_t i = 0; i < 3; i++) {

devices.Add(p2p.Install(nodes.Get(i), nodes.Get(i + 1)));

}

InternetStackHelper stack;

stack.Install(nodes);

Ptr<OspfRouting> ospfRouting = CreateObject<OspfRouting>();

nodes.Get(0)->AggregateObject(ospfRouting);

Ipv4AddressHelper address;

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

address.Assign(devices);

Simulator::Run();

Simulator::Destroy();

return 0;

}

Step 4: Compile and implement the replication

Compile

./waf

Run

./waf –run “scratch/ospf-simulation”

  1. Performance Evaluation for OSPF

We calculate the amount of OSPF routing effectiveness, use FlowMonitor:

Ptr<FlowMonitor> flowMonitor;

FlowMonitorHelper flowHelper;

flowMonitor = flowHelper.InstallAll();

Simulator::Stop(Seconds(10.0));

Simulator::Run();

flowMonitor->SerializeToXmlFile(“ospf_results.xml”, true, true);

Run analysis

python3 analyze_results.py

  1. Example OSPF Project Ideas in NS-3

✅ 1. Performance Comparison of OSPF vs. RIP in Large Networks

  • Calculate a packet delivery ratio and convergence time.

✅ 2. Implement OSPFv3 for IPv6 Networks

  • Alter the OSPF protocol to encourage the IPv6.

✅ 3. Secure OSPF with Cryptographic Authentication

  • We apply the MD5 authentication for avoid the routing attacks.

✅ 4. OSPF Optimization for Software-Defined Networking (SDN)

  • We execute the OSPF in SDN network and enhance the routing dynamically.

✅ 5. QoS-Aware OSPF for Multimedia Traffic

  • We change the OSPF to give precedence to real-time traffic.

The given above is the fundamental approach that was illustrated with sample coding for Open Shortest Path First project that were simulated across the ns3 environment. We provide related information about OSPF how it adjust and perform in different environment.