How to Start ECMP Projects Using NS3

To start Equal-Cost Multi-Path (ECMP) routing projects in NS3, we follow these steps:

Steps to Start ECMP Projects in NS3

  1. Understand ECMP
  • What is ECMP?
    • ECMP is a routing strategy, which permits several paths to concurrently use for forwarding traffic as paths contain the similar cost such as same hop count or link weight.
    • It enhances the load balancing and fault tolerance within networks.
  • Applications:
    • Data centers.
    • High-performance networks.
    • Scenarios to need effective bandwidth utilization.
  1. Set Up NS3
  1. Install NS3:

sudo apt update

sudo apt install g++ python3 git cmake

git clone https://gitlab.com/nsnam/ns-3-dev.git

cd ns-3-dev

./waf configure

./waf build

  1. Verify Installation:

./waf –run scratch/my-first

  1. Plan ECMP Simulation

ECMP isn’t directly executed in NS3, as portion of the default routing protocols. But, we can be attained the behaviour of ECMP via:

  1. Static Routing: Describe several equal-cost routes manually.
  2. Custom Routing: We prolong the Ipv4RoutingProtocol executing ECMP logic.
  3. To utilize OpenFlow/SDN, replicate the ECMP Behavior: Make use of NS3’s OpenFlow module.
  1. Option 1: Static Routing to Simulate ECMP

Set numerous routes manually including same costs in the static routing tables.

Example Code:

#include “ns3/core-module.h”

#include “ns3/network-module.h”

#include “ns3/internet-module.h”

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

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

using namespace ns3;

int main() {

NodeContainer nodes;

nodes.Create(5); // Create 5 nodes

// Create point-to-point links

PointToPointHelper pointToPoint;

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

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

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

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

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

NetDeviceContainer devices4 = pointToPoint.Install(nodes.Get(3), nodes.Get(4));

NetDeviceContainer devices5 = pointToPoint.Install(nodes.Get(2), nodes.Get(4));

// Install Internet stack

InternetStackHelper stack;

stack.Install(nodes);

// Assign IP addresses

Ipv4AddressHelper ipv4;

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

Ipv4InterfaceContainer interfaces1 = ipv4.Assign(devices1);

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

Ipv4InterfaceContainer interfaces2 = ipv4.Assign(devices2);

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

Ipv4InterfaceContainer interfaces3 = ipv4.Assign(devices3);

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

Ipv4InterfaceContainer interfaces4 = ipv4.Assign(devices4);

ipv4.SetBase(“10.1.5.0”, “255.255.255.0”);

Ipv4InterfaceContainer interfaces5 = ipv4.Assign(devices5);

// Configure ECMP using static routing

Ipv4StaticRoutingHelper staticRoutingHelper;

// Node 0 to Node 4 via Node 1 or Node 3

Ptr<Ipv4StaticRouting> staticRoutingNode0 = staticRoutingHelper.GetStaticRouting(nodes.Get(0)->GetObject<Ipv4>());

staticRoutingNode0->AddHostRouteTo(Ipv4Address(“10.1.5.2”), Ipv4Address(“10.1.1.2”), 1);

staticRoutingNode0->AddHostRouteTo(Ipv4Address(“10.1.5.2”), Ipv4Address(“10.1.3.2”), 3);

// Node 1 to Node 4 via Node 2

Ptr<Ipv4StaticRouting> staticRoutingNode1 = staticRoutingHelper.GetStaticRouting(nodes.Get(1)->GetObject<Ipv4>());

staticRoutingNode1->AddHostRouteTo(Ipv4Address(“10.1.5.2”), Ipv4Address(“10.1.2.2”), 2);

// Node 3 to Node 4 directly

Ptr<Ipv4StaticRouting> staticRoutingNode3 = staticRoutingHelper.GetStaticRouting(nodes.Get(3)->GetObject<Ipv4>());

staticRoutingNode3->AddHostRouteTo(Ipv4Address(“10.1.5.2”), Ipv4Address(“10.1.4.2”), 4);

Simulator::Run();

Simulator::Destroy();

return 0;

}

  1. Option 2: Implement ECMP as a Custom Protocol

If we require further flexibility then we can be executed the ECMP routing logic.

Key Steps:

  1. Extend Ipv4RoutingProtocol:
    • We execute the ECMP routing logic, handling several equal-cost routes.
  2. Make use of a round-robin or hash-based scheme, route packets to deliver the traffic.

Skeleton Code:

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

namespace ns3 {

class EcmpRoutingProtocol : public Ipv4RoutingProtocol {

public:

static TypeId GetTypeId();

EcmpRoutingProtocol();

virtual ~EcmpRoutingProtocol();

Ptr<Ipv4Route> RouteOutput(Ptr<Packet> packet, const Ipv4Header &header,

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

bool RouteInput(Ptr<const Packet> packet, const Ipv4Header &header,

Ptr<const NetDevice> idev, UnicastForwardCallback ucb,

MulticastForwardCallback mcb, LocalDeliverCallback lcb,

ErrorCallback ecb) override;

private:

std::map<uint32_t, std::vector<Ipv4Address>> ecmpRoutes; // Destination -> List of next hops

uint32_t nextHopIndex; // For round-robin scheduling

};

} // namespace ns3

  1. Option 3: Use OpenFlow for ECMP

For SDN-based ECMP, use NS3’s OpenFlow integration.

Steps:

  1. In NS3, we install the OpenFlow module.
  2. We need to describe an OpenFlow switch including several output ports for equal-cost routes.
  3. Set ECMP rules to utilize an OpenFlow controller.

Sample Code:

#include “ns3/core-module.h”

#include “ns3/network-module.h”

#include “ns3/openflow-module.h”

#include “ns3/internet-module.h”

using namespace ns3;

int main() {

NodeContainer nodes;

nodes.Create(3); // Create nodes

// Set up OpenFlow switch and controller

Ptr<Node> controller = CreateObject<Node>();

OpenFlowSwitchHelper ofSwitch;

Ptr<Node> switchNode = CreateObject<Node>();

// Configure controller logic for ECMP

InternetStackHelper stack;

stack.Install(nodes);

stack.Install(controller);

Simulator::Run();

Simulator::Destroy();

return 0;

}

  1. Testing and Debugging
  1. Allow Logging for debug:

NS_LOG=”EcmpRoutingProtocol” ./waf –run ecmp-simulation

  1. Verify Routing Behavior:
    • Seize traffic to utilize .pcap files.
    • Examine flow distribution to utilize tools such as Wireshark.
  2. Print Routing Tables: Analyse static or custom ECMP routes to utilize the below code:

Ptr<Ipv4> ipv4 = nodes.Get(0)->GetObject<Ipv4>();

ipv4->GetRoutingProtocol()->PrintRoutingTable(std::cout);

To conclude, we had learnt and understood how to execute and replicate the ECMP projects in NS3 environment leveraging above procedure along with sample coding. Also we will offer entire process and further information about this topic. We are dedicated to assisting you in simulating your projects and offering you the most effective ideas and topics for your endeavors. If  you encounter difficulties in starting ECMP Projects utilizing the NS3 tool, we recommend reaching out to the researchers at phdprojects.org for support. Our commitment lies in executing your projects with utmost efficiency and superior quality.