To implement the on-demand routing protocol in OMNeT++ like the Ad hoc On-Demand Distance Vector (AODV) protocol requires the following steps: setting up the environment, understanding the protocol, generating the protocol module, assimilating it with the INET framework, and testing it. Here, we provided the step-by-step implementation of on demand protocol:
Step-by-Step Implementation:
Step 1: Set Up OMNeT++ and INET Framework
Step 2: Understand AODV Protocol
In mobile ad hoc networks (MANETs), we used AODV which is a reactive routing protocol. Key concepts like:
Step 3: Create the AODV Protocol Module
Define the Module in .ned File
Generate a .ned file for the AODV protocol module.
simple AODV
{
parameters:
double helloInterval @unit(s) = default(1s);
double rreqRetryTimeout @unit(s) = default(2s);
gates:
input fromNetworkLayer;
output toNetworkLayer;
input fromMacLayer;
output toMacLayer;
}
Implement the Module in C++
Create the corresponding .cc and .h files.
AODV.h
#ifndef __AODV_H_
#define __AODV_H_
#include <omnetpp.h>
#include “inet/networklayer/contract/IRoutingTable.h”
#include “inet/networklayer/common/L3AddressResolver.h”
#include “inet/networklayer/ipv4/IPv4Datagram.h”
using namespace omnetpp;
using namespace inet;
class AODV : public cSimpleModule
{
private:
double helloInterval;
double rreqRetryTimeout;
IRoutingTable *routingTable;
cMessage *helloMsg;
cMessage *rreqRetryMsg;
protected:
virtual void initialize() override;
virtual void handleMessage(cMessage *msg) override;
void sendHello();
void processHello(cMessage *msg);
void sendRREQ();
void processRREQ(cMessage *msg);
void sendRREP();
void processRREP(cMessage *msg);
void processRERR(cMessage *msg);
public:
AODV();
virtual ~AODV();
};
#endif
AODV.cc
#include “AODV.h”
Define_Module(AODV);
AODV::AODV()
{
helloMsg = nullptr;
rreqRetryMsg = nullptr;
}
AODV::~AODV()
{
cancelAndDelete(helloMsg);
cancelAndDelete(rreqRetryMsg);
}
void AODV::initialize()
{
helloInterval = par(“helloInterval”);
rreqRetryTimeout = par(“rreqRetryTimeout”);
routingTable = getModuleFromPar<IRoutingTable>(par(“routingTableModule”), this);
helloMsg = new cMessage(“sendHello”);
rreqRetryMsg = new cMessage(“sendRREQRetry”);
scheduleAt(simTime() + helloInterval, helloMsg);
}
void AODV::handleMessage(cMessage *msg)
{
if (msg == helloMsg)
{
sendHello();
scheduleAt(simTime() + helloInterval, helloMsg);
}
else if (msg == rreqRetryMsg)
{
sendRREQ();
scheduleAt(simTime() + rreqRetryTimeout, rreqRetryMsg);
}
else if (strcmp(msg->getName(), “RREQ”) == 0)
{
processRREQ(msg);
}
else if (strcmp(msg->getName(), “RREP”) == 0)
{
processRREP(msg);
}
else if (strcmp(msg->getName(), “RERR”) == 0)
{
processRERR(msg);
}
else if (strcmp(msg->getName(), “Hello”) == 0)
{
processHello(msg);
}
else
{
// Handle other messages
}
}
void AODV::sendHello()
{
cMessage *hello = new cMessage(“Hello”);
send(hello, “toNetworkLayer”);
}
void AODV::processHello(cMessage *msg)
{
// Implement processing of Hello message
delete msg;
}
void AODV::sendRREQ()
{
cMessage *rreq = new cMessage(“RREQ”);
send(rreq, “toNetworkLayer”);
}
void AODV::processRREQ(cMessage *msg)
{
// Implement processing of RREQ message
delete msg;
}
void AODV::sendRREP()
{
cMessage *rrep = new cMessage(“RREP”);
send(rrep, “toNetworkLayer”);
}
void AODV::processRREP(cMessage *msg)
{
// Implement processing of RREP message
delete msg;
}
void AODV::processRERR(cMessage *msg)
{
// Implement processing of RERR message
delete msg;
}
Step 4: Integrate with Simulation Model
Integrate the AODV module within the network simulation model.
Network Configuration .ned File
network AODVNetwork
{
submodules:
host1: StandardHost {
parameters:
@display(“p=100,100”);
}
host2: StandardHost {
parameters:
@display(“p=300,100”);
}
// Add more hosts as needed
connections:
host1.pppg++ <–> { @display(“m=100,100”); } <–> host2.pppg++;
}
omnetpp.ini Configuration
network = AODVNetwork
*.host*.pppg[*].queue.typename = “DropTailQueue”
*.host*.ipv4.routingTable = “inet.networklayer.routing.manet.Router”
*.host*.networkLayer.networkProtocol.typename = “IPv4NetworkLayer”
*.host*.transportLayer.tcp.typename = “Tcp”
*.host*.transportLayer.udp.typename = “Udp”
*.host*.application[*].typename = “UdpBasicApp”
*.host*.application[*].destAddresses = “host1” // Set destination as needed
*.host*.application[*].destPort = 2000
*.host*.application[*].startTime = uniform(0s, 10s)
*.host*.application[*].sendInterval = uniform(1s, 2s)
*.host*.application[*].packetLength = 512B
*.host*.app[0].typename = “AODV”
Step 5: Test and Debug
From this approach, we hope that you have learned the necessary details on how to implement the on demand protocol and how to execute it using frameworks in the OMNeT++. For the implementation of the demand protocol in the OMNeT++ tool, we offer comprehensive support, including simulation results and the sharing of best project performance outcomes.