20#ifndef _NETSIM_AODV_H_
21#define _NETSIM_AODV_H_
26#define AODV_ACTIVE_ROUTE_TIMEOUT 3000* MILLISECOND
27#define AODV_ALLOWED_HELLO_LOSS 2
28#define AODV_BLACKLIST_TIMEOUT AODV_RREQ_RETRIES * AODV_NET_TRAVERSAL_TIME
29#define AODV_DELETE_PERIOD K * max (AODV_ACTIVE_ROUTE_TIMEOUT, AODV_HELLO_INTERVAL)
31#define AODV_HELLO_INTERVAL 1000* MILLISECOND
32#define AODV_LOCAL_ADD_TTL 2
33#define AODV_MAX_REPAIR_TTL 0.3 * AODV_NET_DIAMETER
34#define AODV_MIN_REPAIR_TTL
35#define AODV_MY_ROUTE_TIMEOUT (2 * AODV_ACTIVE_ROUTE_TIMEOUT)
36#define AODV_NET_DIAMETER 35
37#define AODV_NET_TRAVERSAL_TIME 2 * AODV_NODE_TRAVERSAL_TIME * AODV_NET_DIAMETER
38#define AODV_NEXT_HOP_WAIT AODV_NODE_TRAVERSAL_TIME + 10
39#define AODV_NODE_TRAVERSAL_TIME 40 * MILLISECOND
40#define AODV_PATH_DISCOVERY_TIME 2 * AODV_NET_TRAVERSAL_TIME
41#define AODV_RERR_RATELIMIT 10
42#define AODV_RING_TRAVERSAL_TIME(ttl) 2 * AODV_NODE_TRAVERSAL_TIME *(ttl + AODV_TIMEOUT_BUFFER)
43#define AODV_RREQ_RETRIES 2
44#define AODV_RREQ_RATELIMIT 10
45#define AODV_TIMEOUT_BUFFER 2
46#define AODV_TTL_START 1
47#define AODV_TTL_INCREMENT 2
48#define AODV_TTL_THRESHOLD 7
51#define AODV_RREQ_SIZE_IPV4 24
52#define AODV_RREQ_SIZE_IPV6 72
53#define AODV_RREQ_SIZE(dev) DEVICE_NWPROTOCOL(dev,1) == NW_PROTOCOL_IPV4 ? AODV_RREQ_SIZE_IPV4:AODV_RREQ_SIZE_IPV6
54#define AODV_RREP_SIZE_IPV4 20
55#define AODV_RREP_SIZE_IPV6 56
56#define AODV_RREP_SIZE(dev) DEVICE_NWPROTOCOL(dev,1) == NW_PROTOCOL_IPV4 ? AODV_RREP_SIZE_IPV4:AODV_RREP_SIZE_IPV6
57#define AODV_RERR_SIZE_FIXED 4
59#define AODV_ROUTE_TABLE_LOG_NAME "AODV_ROUTE_TABLE_LOG"
62 typedef enum enum_AODV_Ctrl_Packet AODV_CONTROL_PACKET;
63 typedef struct stru_AODV_Primitives AODV_PRIMITIVES;
77 enum enum_AODV_Ctrl_Packet
79 AODVctrlPacket_RREQ=NW_PROTOCOL_AODV*100+1,
86 AODVsubevent_RREQ_TIMEOUT=NW_PROTOCOL_AODV*100+1,
87 AODVsubevent_TRANSMIT_HELLO,
88 AODVsubevent_ACTIVE_ROUTE_TIMEOUT,
155 NETSIM_IPAddress LastAddress;
202 NETSIM_IPAddress DestinationIPaddress;
206 NETSIM_IPAddress LastAddress;
281 unsigned int Reserved:8;
287 AODV_RoutingFlag_Valid,
288 AODV_RoutingFlag_InValid,
289 AODV_RoutingFlag_Repairable,
290 AODV_RoutingFlag_beingRepaired,
294 NETSIM_IPAddress* list;
319 NETSIM_IPAddress DestinationIPAddress;
320 unsigned int DestinationSequenceNumber;
321 bool ValidDestinationSequenceNumberflag;
322 AODV_RoutingFlag routingFlags;
323 NETSIM_ID NetworkInterface;
324 unsigned int HopCount;
325 NETSIM_IPAddress NextHop;
326 AODV_PRECURSORS_LIST* ListofPrecursors;
360 unsigned int rreqSent;
361 unsigned int rreqForwarded;
362 unsigned int rrepSent;
363 unsigned int rrepForwarded;
364 unsigned int rerrSent;
365 unsigned int rerrForwarded;
366 unsigned int routeBreak;
367 unsigned int packetTransmitted;
368 unsigned int packetOrginated;
369 unsigned int packetReceived;
370 unsigned int packetDropped;
380 unsigned int nSequenceNumber;
382 AODV_ROUTETABLE* routeTable;
383 AODV_RREQ_SEEN_TABLE* rreqSeenTable;
384 AODV_RREQ_SENT_TABLE* rreqSentTable;
385 AODV_PRECURSORS_LIST* precursorsList;
386 double dLastBroadcastTime;
387 unsigned int nRerrCount;
388 double dFirstRerrTime;
389 AODV_METRICS aodvMetrics;
393#define AODV_PACKET_PROCESSING() fn_NetSim_AODV_GeneralPacketProcessing(pstruEventDetails)
394#define AODV_CHECK_ROUTE_FOUND(destIP) fn_NetSim_AODV_CheckRouteFound(destIP,pstruEventDetails)
395#define AODV_ADD_TO_FIFO(packet,fifoBuffer,time) fn_NetSim_AODV_AddToFIFOBuffer(packet,fifoBuffer,time)
396#define AODV_GEN_RREQ() fn_NetSim_AODV_GenerateRREQ(pstruEventDetails)
397#define AODV_RETRY_RREQ() fn_NetSim_AODV_RetryRREQ(pstruEventDetails)
398#define AODV_PROCESS_RREQ() fn_NetSim_AODV_ProcessRREQ(pstruEventDetails)
399#define AODV_INSERT_ROUTE_TABLE(ip,seq,hopcount,nexthop,lifeTime) fn_NetSim_AODV_InsertInRouteTable(ip,seq,hopcount,nexthop,lifeTime,pstruEventDetails)
400#define AODV_INSERT_PRECURSOR(ip) fn_NetSim_AODV_InsertInPrecursorsList(ip,pstruEventDetails)
401#define AODV_FORWARD_RREQ() fn_NetSim_AODV_ForwardRREQ(pstruEventDetails)
402#define AODV_GENERATE_RREP() fn_NetSim_AODV_GenerateRREP(pstruEventDetails)
403#define AODV_TRANSMIT_FIFO(devVar) fn_NetSim_AODV_TransmitFIFOBuffer(devVar,pstruEventDetails)
404#define AODV_PROCESS_RREP() fn_NetSim_AODV_ProcessRREP(pstruEventDetails)
405#define AODV_FORWARD_RREP() fn_NetSim_AODV_ForwardRREP(pstruEventDetails)
406#define AODV_FIND_NEXT_HOP(devVar,dest) fn_NetSim_AODV_FindNextHop(devVar,dest,pstruEventDetails)
407#define AODV_GENERATE_RREP_BY_IN() fn_NetSim_AODV_GenerateRREPByIntermediate(pstruEventDetails)
408#define AODV_TRANSMIT_HELLO() fn_NetSim_AODV_TransmitHelloMessage(pstruEventDetails)
409#define AODV_UPDATE_ROUTE_TABLE(ip,lifetime) fn_NetSim_AODV_UpdateRouteTable(ip,lifetime,pstruEventDetails)
410#define AODV_ACTIVE_ROUTE_TIMEOUT_EVENT() fn_NetSim_AODV_ActiveRouteTimeout(pstruEventDetails)
411#define AODV_GENERATE_RERR(DevId,UnreachableIP) fn_NetSim_AODV_GenerateRERR(DevId,UnreachableIP,pstruEventDetails)
412#define AODV_PROCESS_RERR() fn_NetSim_AODV_ProcessRERR(pstruEventDetails)
415#define AODV_DEV_VAR(devId) ((AODV_DEVICE_VAR*)NETWORK->ppstruDeviceList[devId-1]->pstruNetworkLayer->RoutingVar)
416#define AODV_METRICS_VAR(devId) (AODV_DEV_VAR(devId)->aodvMetrics)
417#define FIFO_ALLOC() (AODV_FIFO*)list_alloc(sizeof(AODV_FIFO),offsetof(AODV_FIFO,ele))
418#define RREQSEENTABLE_ALLOC() (AODV_RREQ_SEEN_TABLE*)list_alloc(sizeof(AODV_RREQ_SEEN_TABLE),offsetof(AODV_RREQ_SEEN_TABLE,ele))
419#define RREQSENTTABLE_ALLOC() (AODV_RREQ_SENT_TABLE*)list_alloc(sizeof(AODV_RREQ_SENT_TABLE),offsetof(AODV_RREQ_SENT_TABLE,ele))
420#define ROUTETABLE_ALLOC() (AODV_ROUTETABLE*)list_alloc(sizeof(AODV_ROUTETABLE),offsetof(AODV_ROUTETABLE,ele))
423#define AODV_LOG_ENABLED() get_protocol_log_status(AODV_ROUTE_TABLE_LOG_NAME)
425 void set_aodv_curr();
426 NETSIM_IPAddress aodv_get_curr_ip();
427 NETSIM_ID aodv_get_curr_if();
428 NETSIM_IPAddress aodv_get_dev_ip(NETSIM_ID d);
429 bool isAodvConfigured(NETSIM_ID d, NETSIM_ID in);
432 unsigned int fnFindSequenceNumber(AODV_DEVICE_VAR* devVar,NETSIM_IPAddress ip);
433 int fnEmptyFIFOBuffer(AODV_DEVICE_VAR* devVar,NETSIM_IPAddress dest);
434 AODV_ROUTETABLE* fnFindRouteTable(AODV_ROUTETABLE* table,NETSIM_IPAddress dest);
435 NetSim_PACKET* fn_NetSim_AODV_GenerateCtrlPacket(NETSIM_ID src,
439 AODV_CONTROL_PACKET type);
440 int fn_NetSim_AODV_InsertInRouteTable(NETSIM_IPAddress ip,
441 unsigned int seqNumber,
442 unsigned int hopCount,
443 NETSIM_IPAddress nextHop,
445 NetSim_EVENTDETAILS* pstruEventDetails);
446 int fn_NetSim_AODV_TransmitFIFOBuffer(AODV_DEVICE_VAR* devVar,NetSim_EVENTDETAILS* pstruEventDetails);
447 int fn_NetSim_AODV_InsertInPrecursorsList(NETSIM_IPAddress ip,NetSim_EVENTDETAILS* pstruEventDetails);
448 int fn_NetSim_AODV_UpdateRouteTable(NETSIM_IPAddress ip,
double lifetime,NetSim_EVENTDETAILS* pstruEventDetails);
449 int fn_NetSim_AODV_ForwardRREP(NetSim_EVENTDETAILS* pstruEventDetails);
450 bool fn_NetSim_AODV_CheckRouteFound(NETSIM_IPAddress ip, NetSim_EVENTDETAILS* pstruEventDetails);
451 NETSIM_IPAddress fn_NetSim_AODV_FindNextHop(AODV_DEVICE_VAR* devVar,
452 NETSIM_IPAddress dest,
453 NetSim_EVENTDETAILS* pstruEventDetails);
454 int fn_NetSim_AODV_ForwardRREQ(NetSim_EVENTDETAILS* pstruEventDetails);
455 int fn_NetSim_AODV_GeneralPacketProcessing(NetSim_EVENTDETAILS* pstruEventDetails);
457 bool fn_NetSim_AODV_CheckRouteFound(NETSIM_IPAddress destIP,
458 NetSim_EVENTDETAILS* pstruEventDetails);
460 bool fn_NetSim_AODV_AddToFIFOBuffer(NetSim_PACKET* packet,
461 AODV_FIFO** fifoBuffer,
464 NetSim_PACKET* fn_NetSim_AODV_GenerateRREQ(NetSim_EVENTDETAILS* pstruEventDetails);
466 int fn_NetSim_AODV_RetryRREQ(NetSim_EVENTDETAILS* pstruEventDetails);
468 int fn_NetSim_AODV_ProcessRREQ(NetSim_EVENTDETAILS* pstruEventDetails);
470 int fn_NetSim_AODV_InsertInRouteTable(NETSIM_IPAddress ip,
471 unsigned int seqNumber,
472 unsigned int hopCount,
473 NETSIM_IPAddress nextHop,
475 NetSim_EVENTDETAILS* pstruEventDetails);
477 int fn_NetSim_AODV_InsertInPrecursorsList(NETSIM_IPAddress ip,
478 NetSim_EVENTDETAILS* pstruEventDetails);
480 int fn_NetSim_AODV_ForwardRREQ(NetSim_EVENTDETAILS* pstruEventDetails);
482 int fn_NetSim_AODV_GenerateRREP(NetSim_EVENTDETAILS* pstruEventDetails);
484 int fn_NetSim_AODV_ProcessRREP(NetSim_EVENTDETAILS* pstruEventDetails);
485 int fn_NetSim_AODV_ForwardRREP(NetSim_EVENTDETAILS* pstruEventDetails);
486 NETSIM_IPAddress fn_NetSim_AODV_FindNextHop(AODV_DEVICE_VAR* devVar,
487 NETSIM_IPAddress dest,
488 NetSim_EVENTDETAILS* pstruEventDetails);
490 int fn_NetSim_AODV_GenerateRREPByIntermediate(NetSim_EVENTDETAILS* pstruEventDetails);
492 int fn_NetSim_AODV_TransmitHelloMessage(NetSim_EVENTDETAILS* pstruEventDetails);
494 int fn_NetSim_AODV_ReceiveHelloMessage(NetSim_EVENTDETAILS* pstruEventDetails);
496 int fn_NetSim_AODV_UpdateRouteTable(NETSIM_IPAddress nextHop,
498 NetSim_EVENTDETAILS* pstruEventDetails);
500 int fn_NetSim_AODV_ActiveRouteTimeout(NetSim_EVENTDETAILS* pstruEventDetails);
502 int fn_NetSim_AODV_GenerateRERR(NETSIM_ID nDeviceId,
503 NETSIM_IPAddress UnreachableIP,
504 NetSim_EVENTDETAILS* pstruEventDetails);
505 int fn_NetSim_AODV_ProcessRERR(NetSim_EVENTDETAILS* pstruEventDetails);
507 bool get_protocol_log_status(
char* logname);
509 int fn_NetSim_AODV_Route_Table_Log_Init();
510 int fn_NetSim_AODV_Route_Table_Log_Update(NETSIM_ID devid,
char* msg);
511 void fn_NetSim_AODV_Route_Table_Log_Finish();
512 char comment[BUFSIZ];
NetSim_PACKET * packetList
PacketList - List of packets added to the FIFO buffer.
NETSIM_IPAddress destination
Destination - destination ip address.
struct element * ele
ele - next buffer
Stucture for AODV Metrics.
Structure of RREQ Seen Table in which entry is made of the RREQ received.
struct element * ele
Next AODV_RREQ_Seen_Table.
unsigned int nRREQId
RREQ identification no.
NETSIM_IPAddress OrginatingNode
IP address of a node originating RREQ.
Structure of RREQ sent Table in which entry of RREQ sent is made.
NETSIM_IPAddress DestAddress
Destination IP Address.
struct element * ele
Next AODV_RREQ_Sent_Table.
unsigned int * UnreachableDestinationSequenceNumber
unsigned int Reserved
Sent as 0; ignored on reception.
NETSIM_IPAddress * UnreachableDestinationIPAddress
NETSIM_IPAddress OriginatorIPaddress
The IP address of the node which originated the RREQ for which the route is supplied.
unsigned int Reserved
Sent as 0; ignored on reception.
unsigned int DestinationSequenceNumber
The destination sequence number associated to the route.
unsigned int Lifetime
The time in milliseconds for which nodes receiving the RREP consider the route to be valid.
NETSIM_IPAddress DestinationIPAddress
NETSIM_IPAddress OriginatorIPAddress
unsigned int Reserved
Sent as 0; ignored on reception.
unsigned int OriginatorSequenceNumber
unsigned int DestinationSequenceNumber