17int fn_NetSim_DSR_DeleteRREQTable(NETSIM_IPAddress targetAddress,NETSIM_ID nDeviceId);
18double getRREQBackoff(DSR_RREQ_TABLE* table);
19bool fn_NetSim_DSR_CheckIPinIPList(NETSIM_IPAddress* ipList,
int length,NETSIM_IPAddress ip);
20bool fn_NetSim_DSR_CheckEntryInRREQTable(DSR_RREQ_OPTION* rreq,DSR_RREQ_TABLE* table);
24NetSim_PACKET* fn_NetSim_DSR_InitRouteRequest(NETSIM_IPAddress target,DSR_RREQ_TABLE** rreqTable,
27 NetSim_EVENTDETAILS* pstruEventDetails)
29 NetSim_EVENTDETAILS pevent;
30 NetSim_PACKET* rreq = fn_NetSim_DSR_GenerateCtrlPacket(nDeviceId,
33 ctrlPacket_ROUTE_REQUEST);
34 DSR_OPTION_HEADER* option=(DSR_OPTION_HEADER*)calloc(1,
sizeof* option);
35 DSR_RREQ_OPTION* rreqOption=(DSR_RREQ_OPTION*)calloc(1,
sizeof* rreqOption);
36 DSR_RREQ_TABLE* table;
37 rreq->pstruNetworkData->dPacketSize=DSR_RREQ_SIZE_FIXED+DSR_OPTION_HEADER_SIZE;
38 rreq->pstruNetworkData->dOverhead=DSR_RREQ_SIZE_FIXED+DSR_OPTION_HEADER_SIZE;
39 rreq->pstruNetworkData->dPayload=0;
41 rreq->pstruNetworkData->Packet_RoutingProtocol = option;
45 option->nPayloadLength=DSR_RREQ_SIZE_FIXED;
46 option->
optType = optType_RouteRequest;
48 option->options = rreqOption;
51 rreqOption->
nIdentification = ++DSR_DEV_VAR(pstruEventDetails->nDeviceId)->nRREQIdentification;
52 rreqOption->targetAddress = target;
53 rreq->pstruNetworkData->nTTL = 1;
55 table=(DSR_RREQ_TABLE*)RREQTABLE_ALLOC();
56 table->target = IP_COPY(rreqOption->targetAddress);
61 LIST_ADD_LAST(rreqTable,table);
64 memcpy(&pevent,pstruEventDetails,
sizeof* pstruEventDetails);
65 pevent.dEventTime += NonpropRequestTimeout;
66 pevent.nInterfaceId = 1;
67 pevent.dPacketSize = 0;
68 pevent.nApplicationId = 0;
69 pevent.nEventType = TIMER_EVENT;
71 pevent.nProtocolId = NW_PROTOCOL_DSR;
72 pevent.nSubEventType = subevent_RREQ_TIMEOUT;
73 pevent.pPacket = NULL;
74 pevent.szOtherDetails = IP_COPY(rreqOption->targetAddress);
75 table->nEventId = fnpAddEvent(&pevent);
78 DSR_DEV_VAR(nDeviceId)->dsrMetrics.rreqSent++;
87int fn_NetSim_DSR_RREQTimeout(NetSim_EVENTDETAILS* pstruEventDetails)
89 DSR_ROUTE_CACHE* cache;
90 NETSIM_IPAddress nextHop;
91 NETSIM_IPAddress targetAddress=(NETSIM_IPAddress)pstruEventDetails->szOtherDetails;
93 if(!DSR_CHECK_ROUTE_FOUND(targetAddress,DSR_DEV_VAR(pstruEventDetails->nDeviceId),&nextHop,pstruEventDetails->dEventTime,&cache))
96 DSR_RREQ_TABLE* table = getRREQTable(targetAddress,DSR_DEV_VAR(pstruEventDetails->nDeviceId)->pstruRREQTable);
97 if(table->nCount < DSR_MAX_REQUEST_REXMT)
100 pstruEventDetails->nEventType = NETWORK_OUT_EVENT;
101 pstruEventDetails->pPacket = DSR_RETRY_RREQ(targetAddress,
102 pstruEventDetails->nDeviceId,pstruEventDetails->dEventTime);
103 pstruEventDetails->nSubEventType = 0;
104 IP_FREE(pstruEventDetails->szOtherDetails);
105 pstruEventDetails->szOtherDetails = NULL;
106 fnpAddEvent(pstruEventDetails);
111 DSR_EMPTY_SEND_BUFFER(targetAddress,pstruEventDetails->nDeviceId);
112 fn_NetSim_DSR_DeleteRREQTable(targetAddress,pstruEventDetails->nDeviceId);
119 IP_FREE(pstruEventDetails->szOtherDetails);
120 pstruEventDetails->szOtherDetails = NULL;
126NetSim_PACKET* fn_NetSim_DSR_RetryRREQ(NETSIM_IPAddress targetAddress,
129 NetSim_EVENTDETAILS* pstruEventDetails)
131 NetSim_EVENTDETAILS pevent;
132 DSR_RREQ_TABLE* rreqTable = DSR_DEV_VAR(nDeviceId)->pstruRREQTable;
133 NetSim_PACKET* rreq = fn_NetSim_DSR_GenerateCtrlPacket(nDeviceId,
136 ctrlPacket_ROUTE_REQUEST);
137 DSR_OPTION_HEADER* option=(DSR_OPTION_HEADER*)calloc(1,
sizeof* option);
138 DSR_RREQ_OPTION* rreqOption=(DSR_RREQ_OPTION*)calloc(1,
sizeof* rreqOption);
139 DSR_RREQ_TABLE* table;
140 rreq->pstruNetworkData->dPacketSize=DSR_RREQ_SIZE_FIXED+DSR_OPTION_HEADER_SIZE;
141 rreq->pstruNetworkData->dOverhead=DSR_RREQ_SIZE_FIXED+DSR_OPTION_HEADER_SIZE;
142 rreq->pstruNetworkData->dPayload=0;
144 rreq->pstruNetworkData->Packet_RoutingProtocol = option;
148 option->nPayloadLength=DSR_RREQ_SIZE_FIXED;
149 option->
optType = optType_RouteRequest;
151 option->options = rreqOption;
154 rreqOption->
nIdentification = ++DSR_DEV_VAR(nDeviceId)->nRREQIdentification;
155 rreqOption->targetAddress = IP_COPY(targetAddress);
156 rreq->pstruNetworkData->nTTL = DSR_DISCOVERY_HOP_LIMIT;
158 table=getRREQTable(targetAddress,rreqTable);
162 table->
nTTL = DSR_DISCOVERY_HOP_LIMIT;
165 memcpy(&pevent,pstruEventDetails,
sizeof* pstruEventDetails);
166 pevent.dEventTime += getRREQBackoff(table);
167 pevent.dPacketSize = 0;
168 pevent.nApplicationId = 0;
169 pevent.nEventType = TIMER_EVENT;
170 pevent.nPacketId = 0;
171 pevent.nProtocolId = NW_PROTOCOL_DSR;
172 pevent.nSubEventType = subevent_RREQ_TIMEOUT;
173 pevent.pPacket = NULL;
174 pevent.szOtherDetails = IP_COPY(rreqOption->targetAddress);
175 table->nEventId = fnpAddEvent(&pevent);
177 DSR_DEV_VAR(nDeviceId)->dsrMetrics.rreqSent++;
184DSR_RREQ_TABLE* getRREQTable(NETSIM_IPAddress target,DSR_RREQ_TABLE* table)
189 if(!IP_COMPARE(table->target,target) && table->flag==
false)
191 table = LIST_NEXT(table);
199double getRREQBackoff(DSR_RREQ_TABLE* table)
203 table->
dBackoff = DSR_REQUEST_PERIOD;
204 return DSR_REQUEST_PERIOD;
207 if(table->
dBackoff > DSR_MAX_REQUEST_PERIOD)
208 table->
dBackoff = DSR_MAX_REQUEST_PERIOD;
214int fn_NetSim_DSR_DeleteRREQTable(NETSIM_IPAddress targetAddress,NETSIM_ID nDeviceId)
216 DSR_RREQ_TABLE* table = DSR_DEV_VAR(nDeviceId)->pstruRREQTable;
220 if(!IP_COMPARE(table->target,targetAddress))
222 LIST_FREE(&DSR_DEV_VAR(nDeviceId)->pstruRREQTable,table);
225 table = LIST_NEXT(table);
237int fn_NetSim_DSR_ProcessRREQ(NetSim_EVENTDETAILS* pstruEventDetails)
239 DSR_ROUTE_CACHE* cache;
240 NetSim_PACKET* packet = pstruEventDetails->pPacket;
241 DSR_OPTION_HEADER* option = (DSR_OPTION_HEADER*)packet->pstruNetworkData->Packet_RoutingProtocol;
242 DSR_RREQ_OPTION* rreq = (DSR_RREQ_OPTION*)option->options;
243 if (fn_NetSim_DSR_CheckEntryInRREQTable(rreq, DSR_DEV_VAR(pstruEventDetails->nDeviceId)->pstruRREQTable))
246 fn_NetSim_Packet_FreePacket(packet);
247 pstruEventDetails->pPacket = NULL;
252 DSR_RREQ_TABLE* table;
253 table = (DSR_RREQ_TABLE*)RREQTABLE_ALLOC();
254 table->target = IP_COPY(rreq->targetAddress);
259 LIST_ADD_LAST(&DSR_DEV_VAR(pstruEventDetails->nDeviceId)->pstruRREQTable, table);
262 if(!IP_COMPARE(rreq->targetAddress,dsr_get_curr_ip()))
264 DSR_GENERATE_RREP(packet);
266 fn_NetSim_Packet_FreePacket(packet);
270 int length = DSR_RREQ_LEN(rreq);
272 if(fn_NetSim_DSR_CheckIPinIPList(rreq->address,length,dsr_get_curr_ip()))
275 fn_NetSim_Packet_FreePacket(packet);
276 pstruEventDetails->pPacket = NULL;
282 NETSIM_IPAddress nexthop;
284 DSR_RREQ_TABLE* table = RREQTABLE_ALLOC();
286 table->target = IP_COPY(rreq->targetAddress);
287 LIST_ADD_LAST((
void**)&DSR_DEV_VAR(pstruEventDetails->nDeviceId)->pstruRREQTable, table);
288 if (fn_NetSim_DSR_CheckRouteFound(rreq->targetAddress,
289 DSR_DEV_VAR(pstruEventDetails->nDeviceId),
291 pstruEventDetails->dEventTime,
295 fn_NetSim_DSR_GenerateRREPUsingRouteCache(DSR_DEV_VAR(pstruEventDetails->nDeviceId),
296 pstruEventDetails->pPacket,
297 pstruEventDetails->dEventTime,
303 rreq->address = (NETSIM_IPAddress*)realloc(rreq->address, (
sizeof *rreq->address)*(DSR_RREQ_LEN(rreq) + 1));
304 rreq->address[DSR_RREQ_LEN(rreq)] = dsr_get_curr_ip();
305 rreq->nOptDataLen += 4;
306 pstruEventDetails->pPacket->pstruNetworkData->dOverhead += 4.0;
307 pstruEventDetails->pPacket->pstruNetworkData->dPacketSize += 4.0;
308 pstruEventDetails->pPacket->nTransmitterId = pstruEventDetails->nDeviceId;
309 pstruEventDetails->pPacket->nReceiverId = 0;
311 pstruEventDetails->dEventTime += fn_NetSim_DSR_GetBroadCastJitter();
312 pstruEventDetails->nEventType = NETWORK_OUT_EVENT;
313 fnpAddEvent(pstruEventDetails);
315 DSR_DEV_VAR(pstruEventDetails->nDeviceId)->dsrMetrics.rreqForwarded++;
325bool fn_NetSim_DSR_CheckIPinIPList(NETSIM_IPAddress* ipList,
int length,NETSIM_IPAddress ip)
330 if(!IP_COMPARE(ipList[length],ip))
339bool fn_NetSim_DSR_CheckEntryInRREQTable(DSR_RREQ_OPTION* rreq,DSR_RREQ_TABLE* table)
346 table = LIST_NEXT(table);
unsigned int nTTL
nTTL - Time to Live
unsigned int nIdentification
Identification value.
DSR_OPTION_TYPE nOptionType
unsigned int nIdentification