18int fn_NetSim_IERP_Init()
21 for(i=0;i<NETWORK->nDeviceCount;i++)
23 if(DEVICE_NWLAYER(i+1)->nRoutingProtocolId==NW_PROTOCOL_ZRP)
25 NODE_ZRP* zrp=DEVICE_NWROUTINGVAR(i+1);
26 zrp->ierp=calloc(1,
sizeof(NODE_IERP));
31int fn_NetSim_IERP_RoutePacket()
33 NODE_ZRP* zrp=(NODE_ZRP*)DEVICE_NWROUTINGVAR(pstruEventDetails->nDeviceId);
34 NODE_IERP* ierp=(NODE_IERP*)zrp->ierp;
35 NODE_BRP* brp= (NODE_BRP*)zrp->brp;
36 NetSim_PACKET* packet = pstruEventDetails->pPacket;
37 IERP_ROUTE_TABLE* route = checkDestInRouteTable(ierp->routeTable,packet->pstruNetworkData->szDestIP);
42 packet->pstruNetworkData->szGatewayIP = IP_COPY(DEVICE_NWADDRESS(pstruEventDetails->nDeviceId,1));
44 packet->pstruNetworkData->szNextHopIp = IP_COPY(route->Route[0]);
46 packet->pstruNetworkData->szNextHopIp = IP_COPY(route->DestAddr);
47 pstruEventDetails->nInterfaceId=1;
48 packet->pstruNetworkData->nTTL=255;
49 packet->nTransmitterId = pstruEventDetails->nDeviceId;
50 packet->nReceiverId = fn_NetSim_Stack_GetDeviceId_asIP(packet->pstruNetworkData->szNextHopIp,&i);
57 NetSim_PACKET* buffer=ierp->buffer;
58 while(buffer && buffer->pstruNextPacket)
59 buffer=buffer->pstruNextPacket;
61 buffer->pstruNextPacket=packet;
64 pstruEventDetails->pPacket=NULL;
66 if(!brp->bodercastTree)
73 fn_NetSim_IERP_GenerateRouteRequest(ierp,packet);
79IERP_ROUTE_TABLE* checkDestInRouteTable(IERP_ROUTE_TABLE* table,NETSIM_IPAddress dest)
83 if(!IP_COMPARE(table->DestAddr,dest))
85 table=(IERP_ROUTE_TABLE*)LIST_NEXT(table);
89int fn_NetSim_IERP_GenerateRouteRequest(NODE_IERP* ierp,NetSim_PACKET* dataPacket)
91 NetSim_PACKET* packet = fn_NetSim_ZRP_GeneratePacket(pstruEventDetails->dEventTime,
94 dataPacket->nSourceId,
95 get_first_dest_from_packet(dataPacket),
96 IERP_ROUTE_REQUEST_SIZE_FIXED);
97 IERP_PACKET* request = (IERP_PACKET*)calloc(1,
sizeof* request);
98 packet->pstruNetworkData->Packet_RoutingProtocol=request;
99 packet->pstruNetworkData->nTTL=MAX_TTL;
100 request->Type = ROUTE_REQUEST;
101 request->Length = IERP_PACKET_LENGTH(IERP_ROUTE_REQUEST_SIZE_FIXED);
103 request->QueryID=++ierp->nQueryId;
104 request->RouteSourceAddress = IP_COPY(dataPacket->pstruNetworkData->szSourceIP);
105 request->RouteDestinationAddress = IP_COPY(dataPacket->pstruNetworkData->szDestIP);
107 fn_NetSim_BRP_BodercastPacket(packet);
110bool fn_NetSim_IERP_ProcessRouteRequest(NetSim_PACKET* packet)
112 NODE_ZRP* zrp=(NODE_ZRP*)DEVICE_NWROUTINGVAR(pstruEventDetails->nDeviceId);
113 ZRP_ZONE* zone = zrp->zone;
115 IERP_PACKET* request = (IERP_PACKET*)packet->pstruNetworkData->Packet_RoutingProtocol;
116 if(!IP_COMPARE(request->RouteDestinationAddress,
117 DEVICE_NWADDRESS(pstruEventDetails->nDeviceId,1)))
120 fn_NetSim_IERP_GenerateRouteReply(packet);
125 if(!IP_COMPARE(request->RouteDestinationAddress,
129 fn_NetSim_IERP_GenerateRouteReply(packet);
132 zone=(ZRP_ZONE*)LIST_NEXT(zone);
134 request->IntermediateNodeCount++;
135 request->IntermediateNodeAddress = (NETSIM_IPAddress*)realloc(request->IntermediateNodeAddress,
136 request->IntermediateNodeCount*
sizeof* request->IntermediateNodeAddress);
137 request->IntermediateNodeAddress[request->IntermediateNodeCount-1] = IP_COPY(DEVICE_NWADDRESS(pstruEventDetails->nDeviceId,1));
138 packet->pstruNetworkData->dOverhead += 4;
139 packet->pstruNetworkData->dPacketSize += 4;
142bool fn_NetSim_IERP_ProcessPacket(NetSim_PACKET* packet)
144 switch(packet->nControlDataType)
146 case IERP_ROUTE_REQUEST:
147 return fn_NetSim_IERP_ProcessRouteRequest(packet);
149 case IERP_ROUTE_REPLY:
156int fn_NetSim_IERP_CopyIerpHeader(
const NetSim_PACKET* destPacket,
const NetSim_PACKET* srcPacket)
159 IERP_PACKET* dest=(IERP_PACKET*)calloc(1,
sizeof* dest);
160 IERP_PACKET* src=(IERP_PACKET*)srcPacket->pstruNetworkData->Packet_RoutingProtocol;
161 memcpy(dest,src,
sizeof* dest);
162 destPacket->pstruNetworkData->Packet_RoutingProtocol=dest;
164 if (dest->IntermediateNodeCount)
166 dest->IntermediateNodeAddress = (NETSIM_IPAddress*)calloc(dest->IntermediateNodeCount,
sizeof* dest->IntermediateNodeAddress);
167 for (i = 0; i < dest->IntermediateNodeCount; i++)
168 dest->IntermediateNodeAddress[i] = IP_COPY(src->IntermediateNodeAddress[i]);
170 dest->RouteDestinationAddress = IP_COPY(src->RouteDestinationAddress);
171 dest->RouteSourceAddress=IP_COPY(src->RouteSourceAddress);
174int fn_NetSim_IERP_FreeIerpHeader(NetSim_PACKET* packet)
176 IERP_PACKET* header = (IERP_PACKET*)packet->pstruNetworkData->Packet_RoutingProtocol;
178 for(i=0;i<header->IntermediateNodeCount;i++)
179 IP_FREE(header->IntermediateNodeAddress[i]);
180 IP_FREE(header->RouteDestinationAddress);
181 IP_FREE(header->RouteSourceAddress);
183 packet->pstruNetworkData->Packet_RoutingProtocol=NULL;
187NETSIM_IPAddress replyGetNextHop(IERP_PACKET* reply,NETSIM_IPAddress ip)
190 if(!IP_COMPARE(ip,reply->RouteSourceAddress))
192 if(reply->IntermediateNodeAddress)
193 return reply->IntermediateNodeAddress[0];
195 return reply->RouteDestinationAddress;
197 for(i=0;i<reply->IntermediateNodeCount;i++)
199 if(!IP_COMPARE(ip,reply->IntermediateNodeAddress[i]))
201 if(i==reply->IntermediateNodeCount-1)
202 return reply->RouteDestinationAddress;
204 return reply->IntermediateNodeAddress[i+1];
209int fn_NetSim_IERP_GenerateRouteReply(NetSim_PACKET* requestPacket)
211 NetSim_EVENTDETAILS pevent;
213 NODE_ZRP* zrp=(NODE_ZRP*)DEVICE_NWROUTINGVAR(pstruEventDetails->nDeviceId);
214 NODE_IERP* ierp=(NODE_IERP*)zrp->ierp;
216 IERP_PACKET* request = (IERP_PACKET*)requestPacket->pstruNetworkData->Packet_RoutingProtocol;
218 if (pstruEventDetails->nDeviceId == requestPacket->nSourceId)
221 IERP_ROUTE_TABLE* route = checkDestInRouteTable(ierp->routeTable,request->RouteDestinationAddress);
222 int count = request->IntermediateNodeCount+route->count+1;
224 IERP_PACKET* reply = (IERP_PACKET*)calloc(1,
sizeof* reply);
225 NetSim_PACKET* packet = fn_NetSim_ZRP_GeneratePacket(pstruEventDetails->dEventTime,
228 pstruEventDetails->nDeviceId,
229 requestPacket->nSourceId,
230 IERP_ROUTE_REPLY_SIZE_FIXED+4*count);
232 packet->pstruNetworkData->Packet_RoutingProtocol=reply;
233 packet->pstruNetworkData->szNextHopIp = NULL;
234 packet->pstruNetworkData->nTTL=MAX_TTL;
236 reply->IntermediateNodeCount = count;
237 reply->IntermediateNodeAddress = (NETSIM_IPAddress*)calloc(reply->IntermediateNodeCount,
sizeof* reply->IntermediateNodeAddress);
238 for(i=0,j=0;i<reply->IntermediateNodeCount;i++)
242 reply->IntermediateNodeAddress[i] = IP_COPY(route->Route[route->count-i-1]);
246 reply->IntermediateNodeAddress[i] = IP_COPY(DEVICE_NWADDRESS(pstruEventDetails->nDeviceId,1));
251 reply->IntermediateNodeAddress[i]=IP_COPY(request->IntermediateNodeAddress[request->IntermediateNodeCount-j]);
255 reply->Length = (
unsigned char)(IERP_PACKET_LENGTH(IERP_ROUTE_REPLY_SIZE_FIXED+4*reply->IntermediateNodeCount));
256 reply->QueryID = ++ierp->nQueryId;
257 reply->RouteDestinationAddress = IP_COPY(request->RouteSourceAddress);
258 reply->RouteSourceAddress = IP_COPY(request->RouteDestinationAddress);
259 reply->Type = ROUTE_REPLY;
262 if(reply->IntermediateNodeCount)
264 packet->pstruNetworkData->szNextHopIp = IP_COPY(replyGetNextHop(reply,DEVICE_NWADDRESS(pstruEventDetails->nDeviceId,1)));
265 packet->nReceiverId = fn_NetSim_Stack_GetDeviceId_asIP(packet->pstruNetworkData->szNextHopIp,NULL);
269 pevent.dEventTime=pstruEventDetails->dEventTime;
270 pevent.dPacketSize=IERP_ROUTE_REPLY_SIZE_FIXED+4*request->IntermediateNodeCount;
271 pevent.nApplicationId=0;
272 pevent.nDeviceId=pstruEventDetails->nDeviceId;
273 pevent.nDeviceType=pstruEventDetails->nDeviceType;
274 pevent.nEventType=NETWORK_OUT_EVENT;
275 pevent.nInterfaceId=1;
277 pevent.nProtocolId=NW_PROTOCOL_IPV4;
279 pevent.nSubEventType=0;
280 pevent.pPacket=packet;
281 pevent.szOtherDetails=NULL;
282 fnpAddEvent(&pevent);
286int fn_NetSim_IERP_ProcessRouteReply()
288 NetSim_PACKET* packet = pstruEventDetails->pPacket;
289 IERP_PACKET* reply = (IERP_PACKET*)packet->pstruNetworkData->Packet_RoutingProtocol;
290 extractRouteFromreply(reply);
291 routePacketFromBuffer();
292 if(!IP_COMPARE(packet->pstruNetworkData->szDestIP,
293 DEVICE_NWADDRESS(pstruEventDetails->nDeviceId,1)))
294 pstruEventDetails->pPacket=NULL;
297 packet->pstruNetworkData->szGatewayIP = IP_COPY(DEVICE_NWADDRESS(pstruEventDetails->nDeviceId,1));
298 packet->pstruNetworkData->szNextHopIp = IP_COPY(replyGetNextHop(reply,DEVICE_NWADDRESS(pstruEventDetails->nDeviceId,1)));
299 packet->nTransmitterId=pstruEventDetails->nDeviceId;
300 packet->nReceiverId=fn_NetSim_Stack_GetDeviceId_asIP(packet->pstruNetworkData->szNextHopIp,NULL);
301 pstruEventDetails->nEventType=NETWORK_OUT_EVENT;
302 fnpAddEvent(pstruEventDetails);
303 pstruEventDetails->pPacket=NULL;
307int routePacketFromBuffer()
309 NODE_ZRP* zrp=(NODE_ZRP*)DEVICE_NWROUTINGVAR(pstruEventDetails->nDeviceId);
310 NODE_IERP* ierp=(NODE_IERP*)zrp->ierp;
311 NetSim_PACKET* buffer = ierp->buffer;
312 NetSim_PACKET* prev=NULL;
315 IERP_ROUTE_TABLE* route=checkDestInRouteTable(ierp->routeTable,buffer->pstruNetworkData->szDestIP);
318 NetSim_EVENTDETAILS pevent;
320 buffer->pstruNetworkData->szGatewayIP = IP_COPY(DEVICE_NWADDRESS(pstruEventDetails->nDeviceId,1));
322 buffer->pstruNetworkData->szNextHopIp = IP_COPY(route->Route[0]);
324 buffer->pstruNetworkData->szNextHopIp = IP_COPY(route->DestAddr);
325 buffer->pstruNetworkData->nTTL=255;
326 buffer->nTransmitterId = pstruEventDetails->nDeviceId;
327 buffer->nReceiverId = fn_NetSim_Stack_GetDeviceId_asIP(buffer->pstruNetworkData->szNextHopIp,NULL);
330 prev->pstruNextPacket=buffer->pstruNextPacket;
332 ierp->buffer=buffer->pstruNextPacket;
333 pevent.pPacket=buffer;
334 buffer=buffer->pstruNextPacket;
335 pevent.pPacket->pstruNextPacket=NULL;
337 pevent.dEventTime=pstruEventDetails->dEventTime;
338 pevent.dPacketSize=fnGetPacketSize(pevent.pPacket);
339 if(pevent.pPacket->pstruAppData)
341 pevent.nApplicationId=pevent.pPacket->pstruAppData->nApplicationId;
342 pevent.nSegmentId=pevent.pPacket->pstruAppData->nSegmentId;
346 pevent.nApplicationId=0;
349 pevent.nDeviceId=pstruEventDetails->nDeviceId;
350 pevent.nDeviceType=pstruEventDetails->nDeviceType;
351 pevent.nEventType=NETWORK_OUT_EVENT;
352 pevent.nInterfaceId=1;
353 pevent.nPacketId=pevent.pPacket->nPacketId;
354 pevent.nProtocolId=NW_PROTOCOL_IPV4;
355 pevent.nSubEventType=0;
356 pevent.szOtherDetails=NULL;
357 fnpAddEvent(&pevent);
362 buffer=buffer->pstruNextPacket;