18static unsigned int nRREQId=0;
19double fn_NetSim_AODV_AddTimeOut(NETSIM_IPAddress dest,NetSim_EVENTDETAILS* pstruEventDetails,
double time);
20double fnGetTimeoutTime(
int ttl,
int count);
21int fn_NetSim_AODV_InsertInRREQSeenTable(AODV_DEVICE_VAR* devVar,
22 NETSIM_IPAddress orginator,
25int fnIncreaseTTL(AODV_DEVICE_VAR* devVar,NETSIM_IPAddress ip);
26int fn_NetSim_AODV_InterstInRREQSentTable(AODV_DEVICE_VAR* devVar,
27 NETSIM_IPAddress dest,
30int fnDeleteRREQSentTable(AODV_DEVICE_VAR* devVar,AODV_RREQ_SENT_TABLE* table);
31bool fnCheckRREQSeenTable(AODV_DEVICE_VAR* devVar,AODV_RREQ* rreq);
36NetSim_PACKET* fn_NetSim_AODV_GenerateRREQ(NetSim_EVENTDETAILS* pstruEventDetails)
39 NETSIM_IPAddress Dest = pstruEventDetails->pPacket->pstruNetworkData->szDestIP;
40 unsigned int nDestSeq = fnFindSequenceNumber(AODV_DEV_VAR(pstruEventDetails->nDeviceId),Dest);
41 NetSim_PACKET* packet = fn_NetSim_AODV_GenerateCtrlPacket(pstruEventDetails->nDeviceId,
44 pstruEventDetails->dEventTime,
46 AODV_RREQ* rreq = (AODV_RREQ*)calloc(1,
sizeof* rreq);
48 packet->pstruNetworkData->dPacketSize = AODV_RREQ_SIZE(pstruEventDetails->nDeviceId);
49 packet->pstruNetworkData->dOverhead = AODV_RREQ_SIZE(pstruEventDetails->nDeviceId);
50 packet->pstruNetworkData->Packet_RoutingProtocol = rreq;
61 fn_NetSim_AODV_InsertInRREQSeenTable(AODV_DEV_VAR(pstruEventDetails->nDeviceId),
64 pstruEventDetails->dEventTime);
66 packet->pstruNetworkData->nTTL = fnIncreaseTTL(AODV_DEV_VAR(pstruEventDetails->nDeviceId),
68 packet->pstruNetworkData->nTTL += 1;
69 time = fnGetTimeoutTime(packet->pstruNetworkData->nTTL-1,1);
73 fn_NetSim_AODV_InterstInRREQSentTable(AODV_DEV_VAR(pstruEventDetails->nDeviceId),
75 packet->pstruNetworkData->nTTL-1,
78 AODV_METRICS_VAR(pstruEventDetails->nDeviceId).rreqSent++;
86AODV_RREQ_SENT_TABLE* fnFindSentTable(AODV_DEVICE_VAR* devVar,NETSIM_IPAddress ip)
88 AODV_RREQ_SENT_TABLE* table = devVar->rreqSentTable;
93 table=LIST_NEXT(table);
100int fn_NetSim_AODV_InterstInRREQSentTable(AODV_DEVICE_VAR* devVar,
101 NETSIM_IPAddress dest,
105 AODV_RREQ_SENT_TABLE* table = fnFindSentTable(devVar,dest);
108 table = RREQSENTTABLE_ALLOC();
111 LIST_ADD_LAST(&devVar->rreqSentTable,table);
113 if(ttl == AODV_NET_DIAMETER)
116 table->dTimeoutTime = dTimout;
122int fnIncreaseTTL(AODV_DEVICE_VAR* devVar,NETSIM_IPAddress ip)
124 AODV_RREQ_SENT_TABLE* table = fnFindSentTable(devVar,ip);
126 return AODV_TTL_START;
127 if(table->
ttl >= AODV_TTL_THRESHOLD)
128 return AODV_NET_DIAMETER;
129 if(table->
ttl+AODV_TTL_INCREMENT > AODV_TTL_THRESHOLD)
130 return AODV_TTL_THRESHOLD;
131 return table->
ttl+AODV_TTL_INCREMENT;
138int fn_NetSim_AODV_InsertInRREQSeenTable(AODV_DEVICE_VAR* devVar,
139 NETSIM_IPAddress orginator,
140 unsigned int nRREQId,
143 AODV_RREQ_SEEN_TABLE* table = RREQSEENTABLE_ALLOC();
146 table->time = dTime+AODV_PATH_DISCOVERY_TIME;
147 LIST_ADD_LAST(&devVar->rreqSeenTable,table);
153double fn_NetSim_AODV_AddTimeOut(NETSIM_IPAddress dest,NetSim_EVENTDETAILS* pstruEventDetails,
double time)
155 NetSim_EVENTDETAILS pevent;
156 pevent.dEventTime = pstruEventDetails->dEventTime+time;
157 pevent.dPacketSize = 0;
158 pevent.nApplicationId =0;
159 pevent.nDeviceId=pstruEventDetails->nDeviceId;
160 pevent.nDeviceType=pstruEventDetails->nDeviceType;
161 pevent.nInterfaceId = aodv_get_curr_if();
162 pevent.nEventType = TIMER_EVENT;
164 pevent.nProtocolId = NW_PROTOCOL_AODV;
166 pevent.nSubEventType = AODVsubevent_RREQ_TIMEOUT;
168 pevent.szOtherDetails=IP_COPY(dest);
169 fnpAddEvent(&pevent);
170 return pevent.dEventTime;
179int fn_NetSim_AODV_RetryRREQ(NetSim_EVENTDETAILS* pstruEventDetails)
181 unsigned int nDestSeq;
182 NetSim_PACKET* packet;
185 NETSIM_IPAddress Dest = pstruEventDetails->szOtherDetails;
186 AODV_RREQ_SENT_TABLE* table = fnFindSentTable(AODV_DEV_VAR(pstruEventDetails->nDeviceId),
190 IP_FREE(pstruEventDetails->szOtherDetails);
193 if(table->dTimeoutTime > pstruEventDetails->dEventTime)
195 IP_FREE(pstruEventDetails->szOtherDetails);
198 if(table->times > AODV_RREQ_RETRIES)
200 fnDeleteRREQSentTable(AODV_DEV_VAR(pstruEventDetails->nDeviceId),table);
201 fnEmptyFIFOBuffer(AODV_DEV_VAR(pstruEventDetails->nDeviceId),Dest);
202 IP_FREE(pstruEventDetails->szOtherDetails);
206 nDestSeq = fnFindSequenceNumber(AODV_DEV_VAR(pstruEventDetails->nDeviceId),Dest);
207 packet = fn_NetSim_AODV_GenerateCtrlPacket(pstruEventDetails->nDeviceId,
210 pstruEventDetails->dEventTime,
211 AODVctrlPacket_RREQ);
212 rreq = calloc(1,
sizeof* rreq);
215 packet->pstruNetworkData->dPacketSize = AODV_RREQ_SIZE(pstruEventDetails->nDeviceId);
216 packet->pstruNetworkData->dOverhead = AODV_RREQ_SIZE(pstruEventDetails->nDeviceId);
217 packet->pstruNetworkData->Packet_RoutingProtocol = rreq;
222 rreq->
JRGDU[4] =
'1';
228 fn_NetSim_AODV_InsertInRREQSeenTable(AODV_DEV_VAR(pstruEventDetails->nDeviceId),
231 pstruEventDetails->dEventTime);
233 packet->pstruNetworkData->nTTL = fnIncreaseTTL(AODV_DEV_VAR(pstruEventDetails->nDeviceId),
235 time = fnGetTimeoutTime(packet->pstruNetworkData->nTTL,table->times);
239 fn_NetSim_AODV_InterstInRREQSentTable(AODV_DEV_VAR(pstruEventDetails->nDeviceId),
241 packet->pstruNetworkData->nTTL-1,
244 pstruEventDetails->dPacketSize = 0;
245 pstruEventDetails->nApplicationId = 0;
246 pstruEventDetails->nEventType = NETWORK_OUT_EVENT;
247 pstruEventDetails->nPacketId = 0;
248 pstruEventDetails->nProtocolId = fn_NetSim_Stack_GetNWProtocol(pstruEventDetails->nDeviceId);
249 pstruEventDetails->nSegmentId = 0;
250 pstruEventDetails->nSubEventType = 0;
251 pstruEventDetails->pPacket = packet;
252 if(pstruEventDetails->szOtherDetails)
253 IP_FREE(pstruEventDetails->szOtherDetails);
254 pstruEventDetails->szOtherDetails = NULL;
255 pstruEventDetails->pPacket->pstruNetworkData->szNextHopIp=NULL;
256 fnpAddEvent(pstruEventDetails);
258 AODV_METRICS_VAR(pstruEventDetails->nDeviceId).rreqSent++;
264double fnGetTimeoutTime(
int ttl,
int count)
266 if(ttl!=AODV_NET_DIAMETER)
267 return AODV_RING_TRAVERSAL_TIME(ttl);
268 return count*AODV_NET_TRAVERSAL_TIME;
273int fnDeleteRREQSentTable(AODV_DEVICE_VAR* devVar,AODV_RREQ_SENT_TABLE* table)
275 LIST_FREE(&devVar->rreqSentTable,table);
285int fn_NetSim_AODV_ProcessRREQ(NetSim_EVENTDETAILS* pstruEventDetails)
287 NetSim_PACKET* packet = pstruEventDetails->pPacket;
288 AODV_RREQ* rreq=(AODV_RREQ*)pstruEventDetails->pPacket->pstruNetworkData->Packet_RoutingProtocol;
290 if(fnCheckRREQSeenTable(AODV_DEV_VAR(pstruEventDetails->nDeviceId),rreq))
292 fn_NetSim_Packet_FreePacket(packet);
293 pstruEventDetails->pPacket=NULL;
297 fn_NetSim_AODV_InsertInRREQSeenTable(AODV_DEV_VAR(pstruEventDetails->nDeviceId),
300 pstruEventDetails->dEventTime);
302 AODV_INSERT_PRECURSOR(rreq->LastAddress);
305 sprintf(comment,
"Received RREQ as destination");
307 sprintf(comment,
"Received RREQ as intermediate");
312 pstruEventDetails->dEventTime+2*AODV_NET_TRAVERSAL_TIME-2*rreq->
HopCount*AODV_NODE_TRAVERSAL_TIME);
314 AODV_TRANSMIT_FIFO(AODV_DEV_VAR(pstruEventDetails->nDeviceId));
319 AODV_GENERATE_RREP();
321 fn_NetSim_Packet_FreePacket(packet);
322 pstruEventDetails->pPacket=NULL;
327 rreq->
JRGDU[3] !=
'1' )
329 if(AODV_GENERATE_RREP_BY_IN())
331 fn_NetSim_Packet_FreePacket(packet);
332 pstruEventDetails->pPacket=NULL;
346bool fnCheckRREQSeenTable(AODV_DEVICE_VAR* devVar,AODV_RREQ* rreq)
348 AODV_RREQ_SEEN_TABLE* table = devVar->rreqSeenTable;
354 table=LIST_NEXT(table);
362int fn_NetSim_AODV_ForwardRREQ(NetSim_EVENTDETAILS* pstruEventDetails)
365 NetSim_EVENTDETAILS pevent;
366 AODV_RREQ* rreq = (AODV_RREQ*)pstruEventDetails->pPacket->pstruNetworkData->Packet_RoutingProtocol;
367 if(pstruEventDetails->pPacket->pstruNetworkData->nTTL == 1)
369 fn_NetSim_Packet_FreePacket(pstruEventDetails->pPacket);
373 nSeq = fnFindSequenceNumber(AODV_DEV_VAR(pstruEventDetails->nDeviceId),rreq->
DestinationIPAddress);
378 if(rreq->LastAddress)
379 IP_FREE(rreq->LastAddress);
380 rreq->LastAddress = aodv_get_curr_ip();
381 pstruEventDetails->pPacket->nTransmitterId = pstruEventDetails->nDeviceId;
382 pstruEventDetails->pPacket->nReceiverId = 0;
384 memcpy(&pevent,pstruEventDetails,
sizeof pevent);
385 pevent.nEventType = NETWORK_OUT_EVENT;
386 pevent.nSubEventType = 0;
387 pstruEventDetails->pPacket->pstruNetworkData->szNextHopIp=NULL;
388 fnpAddEvent(&pevent);
390 AODV_METRICS_VAR(pstruEventDetails->nDeviceId).rreqForwarded++;
unsigned int nRREQId
RREQ identification no.
NETSIM_IPAddress OrginatingNode
IP address of a node originating RREQ.
NETSIM_IPAddress DestAddress
Destination IP Address.
NETSIM_IPAddress DestinationIPAddress
NETSIM_IPAddress OriginatorIPAddress
unsigned int OriginatorSequenceNumber
unsigned int DestinationSequenceNumber