OMNeT++ AODV Simulation
OMNeT++ AODV referred as Ad Hoc On Demand Distance vector routing protocol which enables constructing routes for particular destination.Main advantage of OMNeT++ AODV is that it doesn’t require nodes to keep routes when there is no active communication.OMNeT++ AODV uses destination sequence number method to avoid “counting to infinity” problem which makes it free loop environment.
Functionalities of message types in AODV:
- RREQ is used to initiate the route finding process.
- RERR messages are used to notify the network or a link breakage in an active route.
- RREP message is used to finalize the routes.
Advantages of using OMNeT++ AODV Routing Protocol:
- Adaptability to dynamic networks.
- Higher bandwidth share.
- Lower setup delay.
- Reduced overhead.
Characteristics of AODV:
- Link breakages in active routes efficiently repaired.
- Use of sequence numbers to track accuracy of information.
- Multicast trees connecting group members maintained for lifetime of multicast groups.
- Use of periodic HELLO messages to track neighbors.
- On-demand route establishment with small delay.
- Only keeps track of the next hop for a route instead of the entire route.
Download Sample Source Code for OMNeT++ AODV Routing Protocol
[code lang="js"]
void AODVRouting::delayDatagram(IPv4Datagram *datagram)
{
EV_DETAIL << "Queuing datagram, source " << datagram->getSrcAddress() << ", destination " << datagram->getDestAddress() << endl; const IPv4Address& target = datagram->getDestAddress();
targetAddressToDelayedPackets.insert(std::pair<IPv4Address, IPv4Datagram *>(target, datagram));
}
void AODVRouting::sendRREQ(AODVRREQ *rreq, const IPv4Address& destAddr, unsigned int timeToLive)
{
std::map<IPv4Address, WaitForRREP *>::iterator rrepTimer = waitForRREPTimers.find(rreq->getDestAddr());
WaitForRREP *rrepTimerMsg = NULL;
if (rrepTimer != waitForRREPTimers.end()) {
rrepTimerMsg = rrepTimer->second;
unsigned int lastTTL = rrepTimerMsg->getLastTTL();
rrepTimerMsg->setDestAddr(rreq->getDestAddr());
if (timeToLive != 0) {
rrepTimerMsg->setLastTTL(timeToLive);
rrepTimerMsg->setFromInvalidEntry(true);
cancelEvent(rrepTimerMsg);
}
else if (lastTTL + ttlIncrement < ttlThreshold) { ASSERT(!rrepTimerMsg->isScheduled());
timeToLive = lastTTL + ttlIncrement;
rrepTimerMsg->setLastTTL(lastTTL + ttlIncrement);
}
else {
ASSERT(!rrepTimerMsg->isScheduled());
timeToLive = netDiameter;
rrepTimerMsg->setLastTTL(netDiameter);
}
}
else {
rrepTimerMsg = new WaitForRREP();
waitForRREPTimers[rreq->getDestAddr()] = rrepTimerMsg;
ASSERT(hasOngoingRouteDiscovery(rreq->getDestAddr()));
timeToLive = ttlStart;
rrepTimerMsg->setLastTTL(ttlStart);
rrepTimerMsg->setFromInvalidEntry(false);
rrepTimerMsg->setDestAddr(rreq->getDestAddr()); }
// Each time, the timeout for receiving a RREP is RING_TRAVERSAL_TIME.
simtime_t ringTraversalTime = 2.0 * nodeTraversalTime * (timeToLive + timeoutBuffer);
scheduleAt(simTime() + ringTraversalTime, rrepTimerMsg);
EV_INFO << "Sending a Route Request with target " << rreq->getDestAddr() << " and TTL= " << timeToLive << endl; sendAODVPacket(rreq, destAddr, timeToLive, jitterPar->doubleValue());
rreqCount++;
}
[/code]


