Implementing Fisheye State Routing (FSR) protocol in ns-3 involves creating a custom module because, the default ns3 distribution does not include it. FSR is a link-state routing protocol which designed for wireless ad hoc networks. By updating the link-state information with different frequencies which depends on the distance to the destination, it reduces the overhead. Here are the steps to implement the Fisheye State Routing (FSR) protocol in ns-3.
Steps to implement PSR in ns3
- Set up your environment
Make sure that ns3 is installed in the computer. If not, install it from the official ns3 website.
- Create a new ns3 module
On your ns3 installation, create a new module in the src directory for the FSR protocol. For this, you have to create the necessary directory structure and files.
cd ns-3.xx
cd src
mkdir -p fsr/model
mkdir -p fsr/helper
- Create the FSR header file
In the model directory, create the header file fsr-routing-protocol.h for the layer 3 routing protocol.
#ifndef FSR_ROUTING_PROTOCOL_H
#define FSR_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 FsrRoutingProtocol : public Ipv4RoutingProtocol
{
public:
static TypeId GetTypeId (void);
FsrRoutingProtocol ();
virtual ~FsrRoutingProtocol ();
// 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;
Timer m_periodicUpdateTimer;
void StartPeriodicUpdate ();
void PeriodicUpdate ();
Ptr<NetDevice> GetNetDevice (uint32_t interface);
Ptr<MobilityModel> GetMobilityModel (Ptr<NetDevice> netDevice);
Ipv4Address GetNextHop (Ipv4Address dest);
};
} // namespace ns3
#endif /* FSR_ROUTING_PROTOCOL_H */
- Create the FSR Source File
In the model directory, create the source file fsr-routing-protocol.cc for the Layer 3 routing protocol.
#include “fsr-routing-protocol.h”
#include “ns3/log.h”
#include “ns3/ipv4-route.h”
#include “ns3/simulator.h”
namespace ns3 {
NS_LOG_COMPONENT_DEFINE (“FsrRoutingProtocol”);
NS_OBJECT_ENSURE_REGISTERED (FsrRoutingProtocol);
TypeId
FsrRoutingProtocol::GetTypeId (void)
{
static TypeId tid = TypeId (“ns3::FsrRoutingProtocol”)
.SetParent<Ipv4RoutingProtocol> ()
.SetGroupName(“Internet”)
.AddConstructor<FsrRoutingProtocol> ();
return tid;
}
FsrRoutingProtocol::FsrRoutingProtocol ()
{
}
FsrRoutingProtocol::~FsrRoutingProtocol ()
{
}
void
FsrRoutingProtocol::SetIpv4 (Ptr<Ipv4> ipv4)
{
m_ipv4 = ipv4;
StartPeriodicUpdate ();
}
void
FsrRoutingProtocol::StartPeriodicUpdate ()
{
m_periodicUpdateTimer.SetFunction (&FsrRoutingProtocol::PeriodicUpdate, this);
m_periodicUpdateTimer.Schedule (Seconds (1.0));
}
void
FsrRoutingProtocol::PeriodicUpdate ()
{
NS_LOG_FUNCTION (this);
// Perform periodic link-state updates
// This is a simplified example, real implementation should include link-state packets exchange
m_periodicUpdateTimer.Schedule (Seconds (1.0));
}
Ptr<NetDevice>
FsrRoutingProtocol::GetNetDevice (uint32_t interface)
{
return m_ipv4->GetNetDevice (interface);
}
Ptr<MobilityModel>
FsrRoutingProtocol::GetMobilityModel (Ptr<NetDevice> netDevice)
{
return netDevice->GetNode ()->GetObject<MobilityModel> ();
}
Ipv4Address
FsrRoutingProtocol::GetNextHop (Ipv4Address dest)
{
// Simplified example of next hop selection
if (m_routingTable.find(dest) != m_routingTable.end())
{
return m_routingTable[dest].GetGateway();
}
return Ipv4Address::GetBroadcast ();
}
Ptr<Ipv4Route>
FsrRoutingProtocol::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 ())
{
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
FsrRoutingProtocol::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 ())
{
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
FsrRoutingProtocol::NotifyInterfaceUp (uint32_t interface)
{
}
void
FsrRoutingProtocol::NotifyInterfaceDown (uint32_t interface)
{
}
void
FsrRoutingProtocol::NotifyAddAddress (uint32_t interface, Ipv4InterfaceAddress address)
{
}
void
FsrRoutingProtocol::NotifyRemoveAddress (uint32_t interface, Ipv4InterfaceAddress address)
{
}
void
FsrRoutingProtocol::PrintRoutingTable (Ptr<OutputStreamWrapper> stream) const
{
*stream->GetStream () << “FSR 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
- Define FSR Helper
In the helper directory, create the helper header file fsr-helper.h for the layer 3.
#ifndef FSR_HELPER_H
#define FSR_HELPER_H
#include “ns3/ipv4-routing-helper.h”
#include “fsr-routing-protocol.h”
namespace ns3 {
class FsrHelper : public Ipv4RoutingHelper
{
public:
FsrHelper ();
virtual ~FsrHelper ();
FsrHelper* Copy (void) const;
virtual Ptr<Ipv4RoutingProtocol> Create (Ptr<Node> node) const;
};
} // namespace ns3
#endif /* FSR_HELPER_H */
Create the FSR helper source file fsr-helper.cc in the helper directory.
#include “fsr-helper.h”
#include “ns3/node.h”
#include “ns3/ipv4.h”
namespace ns3 {
FsrHelper::FsrHelper ()
{
}
FsrHelper::~FsrHelper ()
{
}
FsrHelper*
FsrHelper::Copy (void) const
{
return new FsrHelper (*this);
}
Ptr<Ipv4RoutingProtocol>
FsrHelper::Create (Ptr<Node> node) const
{
Ptr<FsrRoutingProtocol> fsrRouting = CreateObject<FsrRoutingProtocol> ();
node->AggregateObject (fsrRouting);
return fsrRouting;
}
} // namespace ns3
- Update CMakeLists.txt
In the ns3 build system, add a new FSR module. Edit src/CMakeLists.txt and add the following line:
add_subdirectory (fsr)
Create src/fsr/CMakeLists.txt with the following content:
ns3_add_library (fsr
model/fsr-routing-protocol.cc
helper/fsr-helper.cc
)
target_link_libraries (fsr)
- Set up the network topology
To use the FSR protocol, create a simulation script in the scratch directory.
#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/mobility-module.h”
#include “fsr-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;
FsrHelper fsr;
stack.SetRoutingHelper (fsr);
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 (“fsr-simulation.tr”));
wifiPhy.EnablePcapAll (“fsr-simulation”);
// Run the simulation
Simulator::Run ();
Simulator::Destroy ();
return 0;
}
- Build and run the simulation
Build and run your script after writing.
./waf build
./waf –run scratch/fsr-simulation
- Analyze the results
You can analyze the results after running the simulation, by using the generated trace files (fsr-simulation.tr and fsr-simulation-0-0.pcap).
Example script for FSR protocol
Below is the example script for your reference:
#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 “fsr-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;
FsrHelper fsr;
stack.SetRoutingHelper (fsr);
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 (“fsr-simulation.tr”));
wifiPhy.EnablePcapAll (“fsr-simulation”);
// Run the simulation
Simulator::Run ();
Simulator::Destroy ();
return 0;
}
Overall, we had successfully learned on implementing the Fisheye State Routing (FSR) protocol in ns-3 by creating a custom module. Also, we provide more related programming help on FSR protocol.