20int fn_NetSim_DSR_GenerateRREP(NetSim_PACKET* rreqPacket,NetSim_EVENTDETAILS* pstruEventDetails)
23 unsigned int addressCount;
24 DSR_RREQ_OPTION* rreq = ((DSR_OPTION_HEADER*)rreqPacket->pstruNetworkData->Packet_RoutingProtocol)->options;
25 NetSim_PACKET* packet = fn_NetSim_DSR_GenerateCtrlPacket(
26 pstruEventDetails->nDeviceId,
27 rreqPacket->nSourceId,
28 rreqPacket->nSourceId,
29 pstruEventDetails->dEventTime,
30 ctrlPacket_ROUTE_REPLY);
31 DSR_OPTION_HEADER* option = calloc(1,
sizeof* option);
32 DSR_RREP_OPTION* rrep = calloc(1,
sizeof* rrep);
36 option->nPayloadLength = DSR_RREP_SIZE_FIXED;
38 option->
optType = optType_RouteReply;
39 packet->pstruNetworkData->Packet_RoutingProtocol = option;
41 option->options = rrep;
45 addressCount = DSR_RREQ_LEN(rreq);
49 rrep->
Address[0]= dsr_get_dev_ip(rreqPacket->nSourceId);
50 rrep->
Address[addressCount - 1] = dsr_get_curr_ip();
53 for(nLoop=1;nLoop<addressCount-1;nLoop++)
55 packet->nReceiverId = fn_NetSim_Stack_GetDeviceId_asIP(rrep->
Address[addressCount-2],&(nLoop));
56 IP_FREE(packet->pstruNetworkData->szNextHopIp);
57 packet->pstruNetworkData->szNextHopIp = IP_COPY(rrep->
Address[addressCount-2]);
58 packet->pstruNetworkData->dPacketSize = rrep->
nOptDataLen+DSR_OPTION_HEADER_SIZE;
59 packet->pstruNetworkData->dOverhead = rrep->
nOptDataLen+DSR_OPTION_HEADER_SIZE;
60 packet->pstruNetworkData->nTTL = addressCount+2;
63 pstruEventDetails->dEventTime+=fn_NetSim_DSR_GetBroadCastJitter();
64 pstruEventDetails->dPacketSize = rrep->
nOptDataLen+DSR_OPTION_HEADER_SIZE;
65 pstruEventDetails->nEventType = NETWORK_OUT_EVENT;
66 pstruEventDetails->nProtocolId = NW_PROTOCOL_DSR;
67 pstruEventDetails->nSubEventType = 0;
68 pstruEventDetails->pPacket = packet;
69 fnpAddEvent(pstruEventDetails);
71 DSR_DEV_VAR(pstruEventDetails->nDeviceId)->dsrMetrics.rrepSent++;
81int fn_NetSim_DSR_ProcessRREP(NetSim_EVENTDETAILS* pstruEventDetails)
83 DSR_OPTION_HEADER* option = (DSR_OPTION_HEADER*)pstruEventDetails->pPacket->pstruNetworkData->Packet_RoutingProtocol;
84 DSR_RREP_OPTION* rrep = (DSR_RREP_OPTION*)option->options;
85 DSR_UPDATE_ROUTE_CACHE(DSR_RREP_LEN(rrep),
87 pstruEventDetails->dEventTime);
88 DSR_CHECK_SEND_BUFFER(pstruEventDetails->nDeviceId,
89 pstruEventDetails->dEventTime);
90 fn_NetSim_DSR_ForwardRREP();
94static void determine_position(DSR_ROUTE_CACHE* cache,
int* my,
int* de, NETSIM_IPAddress myIP, NETSIM_IPAddress dest)
97 for (i = 0; i < cache->nLength; i++)
99 if (!IP_COMPARE(cache->address[i], myIP))
101 if (!IP_COMPARE(cache->address[i], dest))
113bool fn_NetSim_DSR_GenerateRREPUsingRouteCache(DSR_DEVICE_VAR* devVar,
114 NetSim_PACKET* rreqPacket,
116 NetSim_EVENTDETAILS* pstruEventDetails)
118 DSR_RREQ_OPTION* rreq = ((DSR_OPTION_HEADER*)(rreqPacket->pstruNetworkData->Packet_RoutingProtocol))->options;
119 DSR_ROUTE_CACHE* cache = DSR_FIND_CACHE(devVar,rreq->targetAddress,dTime);
120 if(!DSR_VALIDATE_CACHE(cache,rreq->
address,DSR_RREQ_LEN(rreq)))
127 unsigned int addressCount;
130 NetSim_PACKET* packet = fn_NetSim_DSR_GenerateCtrlPacket(
131 pstruEventDetails->nDeviceId,
132 rreqPacket->nSourceId,
133 rreqPacket->nSourceId,
134 pstruEventDetails->dEventTime,
135 ctrlPacket_ROUTE_REPLY);
136 DSR_OPTION_HEADER* option = calloc(1,
sizeof* option);
137 DSR_RREP_OPTION* rrep = calloc(1,
sizeof* rrep);
139 determine_position(cache, &my, &de,
140 dsr_get_dev_ip(rreqPacket->nSourceId),
141 rreq->targetAddress);
143 UINT len = my == -1 ? de : de - my;
147 option->nPayloadLength = DSR_RREP_SIZE_FIXED;
149 option->
optType = optType_RouteReply;
150 packet->pstruNetworkData->Packet_RoutingProtocol = option;
152 option->options = rrep;
156 addressCount = DSR_RREQ_LEN(rreq) + len;
162 rrep->
Address[0]= dsr_get_dev_ip(rreqPacket->nSourceId);
164 for(nLoop=1;nLoop<=DSR_RREQ_LEN(rreq);nLoop++)
167 packet->nReceiverId = fn_NetSim_Stack_GetDeviceId_asIP(rrep->
Address[nLoop-1],&n);
168 packet->pstruNetworkData->szNextHopIp = IP_COPY(rrep->
Address[nLoop-1]);
169 packet->pstruNetworkData->nTTL = addressCount + 2;
170 n = my == -1 ? 0 : my;
171 for(;(
unsigned int)nLoop<addressCount;nLoop++)
172 rrep->
Address[nLoop] = IP_COPY(cache->address[n++]);
176 pstruEventDetails->dEventTime+=fn_NetSim_DSR_GetBroadCastJitter();
177 pstruEventDetails->dPacketSize = rrep->
nOptDataLen+DSR_OPTION_HEADER_SIZE;
178 pstruEventDetails->nEventType = NETWORK_OUT_EVENT;
179 pstruEventDetails->nProtocolId = NW_PROTOCOL_DSR;
180 pstruEventDetails->nSubEventType = 0;
181 pstruEventDetails->pPacket = packet;
182 fnpAddEvent(pstruEventDetails);
184 devVar->dsrMetrics.rrepSent++;
194int fn_NetSim_DSR_ForwardRREP()
196 NetSim_PACKET* packet = pstruEventDetails->pPacket;
197 NETSIM_ID nDeviceId = pstruEventDetails->nDeviceId;
199 DSR_OPTION_HEADER* option = (DSR_OPTION_HEADER*)packet->pstruNetworkData->Packet_RoutingProtocol;
200 DSR_RREP_OPTION* rrep = (DSR_RREP_OPTION*)option->options;
201 int length = DSR_RREP_LEN(rrep);
203 NETSIM_IPAddress nextHop=NULL;
205 if(!IP_COMPARE(rrep->
Address[0],dsr_get_curr_ip()))
207 DSR_RREQ_TABLE* table = getRREQTable(rrep->
Address[DSR_RREP_LEN(rrep)-1],
208 DSR_DEV_VAR(pstruEventDetails->nDeviceId)->pstruRREQTable);
212 fnDeleteEvent(table->nEventId);
214 fn_NetSim_Packet_FreePacket(packet);
215 pstruEventDetails->pPacket=NULL;
218 while(n<(NETSIM_ID)length)
221 if(!IP_COMPARE(rrep->
Address[n],dsr_get_curr_ip()))
230 IP_FREE(packet->pstruNetworkData->szNextHopIp);
231 packet->pstruNetworkData->szNextHopIp = IP_COPY(nextHop);
232 packet->pstruNetworkData->szGatewayIP = dsr_get_curr_ip();
233 packet->nTransmitterId = nDeviceId;
234 packet->nReceiverId = fn_NetSim_Stack_GetDeviceId_asIP(nextHop,&n);
236 pstruEventDetails->nEventType = NETWORK_OUT_EVENT;
237 fnpAddEvent(pstruEventDetails);
239 DSR_DEV_VAR(nDeviceId)->dsrMetrics.rrepForwarded++;
NETSIM_IPAddress * Address
DSR_OPTION_TYPE nOptionType
unsigned int nLastHopExternal
NETSIM_IPAddress * address