NetSim Source Code Help v14.4
All 13 Components
 
Loading...
Searching...
No Matches
IERP.c
1/************************************************************************************
2 * Copyright (C) 2023 *
3 * TETCOS, Bangalore. India *
4 * *
5 * Tetcos owns the intellectual property rights in the Product and its content. *
6 * The copying, redistribution, reselling or publication of any or all of the *
7 * Product or its content without express prior written consent of Tetcos is *
8 * prohibited. Ownership and / or any other right relating to the software and all *
9 * intellectual property rights therein shall remain at all times with Tetcos. *
10 * *
11 * Author: Shashi Kant Suman *
12 * *
13 * ---------------------------------------------------------------------------------*/
14#include "main.h"
15#include "ZRP.h"
16#include "ZRP_Enum.h"
17
18int fn_NetSim_IERP_Init()
19{
20 NETSIM_ID i;
21 for(i=0;i<NETWORK->nDeviceCount;i++)
22 {
23 if(DEVICE_NWLAYER(i+1)->nRoutingProtocolId==NW_PROTOCOL_ZRP)
24 {
25 NODE_ZRP* zrp=DEVICE_NWROUTINGVAR(i+1);
26 zrp->ierp=calloc(1,sizeof(NODE_IERP));
27 }
28 }
29 return 0;
30}
31int fn_NetSim_IERP_RoutePacket()
32{
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);
38 if(route)
39 {
40 NETSIM_ID i;
41 //Route found
42 packet->pstruNetworkData->szGatewayIP = IP_COPY(DEVICE_NWADDRESS(pstruEventDetails->nDeviceId,1));
43 if(route->Route)
44 packet->pstruNetworkData->szNextHopIp = IP_COPY(route->Route[0]);
45 else
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);
51 return 2;
52 }
53 else
54 {
55 //Initiate route discovery
56 //Add packet to buffer
57 NetSim_PACKET* buffer=ierp->buffer;
58 while(buffer && buffer->pstruNextPacket)
59 buffer=buffer->pstruNextPacket;
60 if(buffer)
61 buffer->pstruNextPacket=packet;
62 else
63 ierp->buffer=packet;
64 pstruEventDetails->pPacket=NULL;
65
66 if(!brp->bodercastTree)
67 {
68 //IARP link state routing is not completed. wait...
69 return 1;
70 }
71 else
72 {
73 fn_NetSim_IERP_GenerateRouteRequest(ierp,packet);
74 }
75 }
76 return 0;
77}
78
79IERP_ROUTE_TABLE* checkDestInRouteTable(IERP_ROUTE_TABLE* table,NETSIM_IPAddress dest)
80{
81 while(table)
82 {
83 if(!IP_COMPARE(table->DestAddr,dest))
84 return table;
85 table=(IERP_ROUTE_TABLE*)LIST_NEXT(table);
86 }
87 return NULL;
88}
89int fn_NetSim_IERP_GenerateRouteRequest(NODE_IERP* ierp,NetSim_PACKET* dataPacket)
90{
91 NetSim_PACKET* packet = fn_NetSim_ZRP_GeneratePacket(pstruEventDetails->dEventTime,
92 IERP_ROUTE_REQUEST,
93 NW_PROTOCOL_IERP,
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);
102 request->NodePtr=0;
103 request->QueryID=++ierp->nQueryId;
104 request->RouteSourceAddress = IP_COPY(dataPacket->pstruNetworkData->szSourceIP);
105 request->RouteDestinationAddress = IP_COPY(dataPacket->pstruNetworkData->szDestIP);
106 //Call BRP to send packet
107 fn_NetSim_BRP_BodercastPacket(packet);
108 return 0;
109}
110bool fn_NetSim_IERP_ProcessRouteRequest(NetSim_PACKET* packet)
111{
112 NODE_ZRP* zrp=(NODE_ZRP*)DEVICE_NWROUTINGVAR(pstruEventDetails->nDeviceId);
113 ZRP_ZONE* zone = zrp->zone;
114
115 IERP_PACKET* request = (IERP_PACKET*)packet->pstruNetworkData->Packet_RoutingProtocol;
116 if(!IP_COMPARE(request->RouteDestinationAddress,
117 DEVICE_NWADDRESS(pstruEventDetails->nDeviceId,1)))
118 {
119 //Generate route reply
120 fn_NetSim_IERP_GenerateRouteReply(packet);
121 return false;
122 }
123 while(zone)
124 {
125 if(!IP_COMPARE(request->RouteDestinationAddress,
126 zone->zoneNodeIP))
127 {
128 //Generate route reply
129 fn_NetSim_IERP_GenerateRouteReply(packet);
130 return false;
131 }
132 zone=(ZRP_ZONE*)LIST_NEXT(zone);
133 }
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;
140 return true;
141}
142bool fn_NetSim_IERP_ProcessPacket(NetSim_PACKET* packet)
143{
144 switch(packet->nControlDataType)
145 {
146 case IERP_ROUTE_REQUEST:
147 return fn_NetSim_IERP_ProcessRouteRequest(packet);
148 break;
149 case IERP_ROUTE_REPLY:
150 break;
151 }
152 return false;
153}
154
155
156int fn_NetSim_IERP_CopyIerpHeader(const NetSim_PACKET* destPacket,const NetSim_PACKET* srcPacket)
157{
158 unsigned int i;
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;
163
164 if (dest->IntermediateNodeCount)
165 {
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]);
169 }
170 dest->RouteDestinationAddress = IP_COPY(src->RouteDestinationAddress);
171 dest->RouteSourceAddress=IP_COPY(src->RouteSourceAddress);
172 return 0;
173}
174int fn_NetSim_IERP_FreeIerpHeader(NetSim_PACKET* packet)
175{
176 IERP_PACKET* header = (IERP_PACKET*)packet->pstruNetworkData->Packet_RoutingProtocol;
177 unsigned int i;
178 for(i=0;i<header->IntermediateNodeCount;i++)
179 IP_FREE(header->IntermediateNodeAddress[i]);
180 IP_FREE(header->RouteDestinationAddress);
181 IP_FREE(header->RouteSourceAddress);
182 free(header);
183 packet->pstruNetworkData->Packet_RoutingProtocol=NULL;
184 return 0;
185}
186
187NETSIM_IPAddress replyGetNextHop(IERP_PACKET* reply,NETSIM_IPAddress ip)
188{
189 unsigned int i;
190 if(!IP_COMPARE(ip,reply->RouteSourceAddress))
191 {
192 if(reply->IntermediateNodeAddress)
193 return reply->IntermediateNodeAddress[0];
194 else
195 return reply->RouteDestinationAddress;
196 }
197 for(i=0;i<reply->IntermediateNodeCount;i++)
198 {
199 if(!IP_COMPARE(ip,reply->IntermediateNodeAddress[i]))
200 {
201 if(i==reply->IntermediateNodeCount-1)
202 return reply->RouteDestinationAddress;
203 else
204 return reply->IntermediateNodeAddress[i+1];
205 }
206 }
207 return NULL;
208}
209int fn_NetSim_IERP_GenerateRouteReply(NetSim_PACKET* requestPacket)
210{
211 NetSim_EVENTDETAILS pevent;
212 unsigned int i,j;
213 NODE_ZRP* zrp=(NODE_ZRP*)DEVICE_NWROUTINGVAR(pstruEventDetails->nDeviceId);
214 NODE_IERP* ierp=(NODE_IERP*)zrp->ierp;
215
216 IERP_PACKET* request = (IERP_PACKET*)requestPacket->pstruNetworkData->Packet_RoutingProtocol;
217
218 if (pstruEventDetails->nDeviceId == requestPacket->nSourceId)
219 return -1;
220
221 IERP_ROUTE_TABLE* route = checkDestInRouteTable(ierp->routeTable,request->RouteDestinationAddress);
222 int count = request->IntermediateNodeCount+route->count+1;
223
224 IERP_PACKET* reply = (IERP_PACKET*)calloc(1,sizeof* reply);
225 NetSim_PACKET* packet = fn_NetSim_ZRP_GeneratePacket(pstruEventDetails->dEventTime,
226 IERP_ROUTE_REPLY,
227 NW_PROTOCOL_IERP,
228 pstruEventDetails->nDeviceId,
229 requestPacket->nSourceId,
230 IERP_ROUTE_REPLY_SIZE_FIXED+4*count);
231
232 packet->pstruNetworkData->Packet_RoutingProtocol=reply;
233 packet->pstruNetworkData->szNextHopIp = NULL;
234 packet->pstruNetworkData->nTTL=MAX_TTL;
235
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++)
239 {
240 if(i<route->count)
241 {
242 reply->IntermediateNodeAddress[i] = IP_COPY(route->Route[route->count-i-1]);
243 }
244 else if(j==0)
245 {
246 reply->IntermediateNodeAddress[i] = IP_COPY(DEVICE_NWADDRESS(pstruEventDetails->nDeviceId,1));
247 j++;
248 }
249 else
250 {
251 reply->IntermediateNodeAddress[i]=IP_COPY(request->IntermediateNodeAddress[request->IntermediateNodeCount-j]);
252 j++;
253 }
254 }
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;
260 reply->NodePtr=0;
261 //Set the next hop
262 if(reply->IntermediateNodeCount)
263 {
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);
266 }
267
268 //Add network out event to transmit packet
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;
276 pevent.nPacketId=0;
277 pevent.nProtocolId=NW_PROTOCOL_IPV4;
278 pevent.nSegmentId=0;
279 pevent.nSubEventType=0;
280 pevent.pPacket=packet;
281 pevent.szOtherDetails=NULL;
282 fnpAddEvent(&pevent);
283 return 0;
284}
285
286int fn_NetSim_IERP_ProcessRouteReply()
287{
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;
295 else
296 {
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;
304 }
305 return 0;
306}
307int routePacketFromBuffer()
308{
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;
313 while(buffer)
314 {
315 IERP_ROUTE_TABLE* route=checkDestInRouteTable(ierp->routeTable,buffer->pstruNetworkData->szDestIP);
316 if(route)
317 {
318 NetSim_EVENTDETAILS pevent;
319 //Route found
320 buffer->pstruNetworkData->szGatewayIP = IP_COPY(DEVICE_NWADDRESS(pstruEventDetails->nDeviceId,1));
321 if(route->Route)
322 buffer->pstruNetworkData->szNextHopIp = IP_COPY(route->Route[0]);
323 else
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);
328
329 if(prev)
330 prev->pstruNextPacket=buffer->pstruNextPacket;
331 else
332 ierp->buffer=buffer->pstruNextPacket;
333 pevent.pPacket=buffer;
334 buffer=buffer->pstruNextPacket;
335 pevent.pPacket->pstruNextPacket=NULL;
336
337 pevent.dEventTime=pstruEventDetails->dEventTime;
338 pevent.dPacketSize=fnGetPacketSize(pevent.pPacket);
339 if(pevent.pPacket->pstruAppData)
340 {
341 pevent.nApplicationId=pevent.pPacket->pstruAppData->nApplicationId;
342 pevent.nSegmentId=pevent.pPacket->pstruAppData->nSegmentId;
343 }
344 else
345 {
346 pevent.nApplicationId=0;
347 pevent.nSegmentId=0;
348 }
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);
358 continue;
359
360 }
361 prev=buffer;
362 buffer=buffer->pstruNextPacket;
363 }
364 return 0;
365}
366
367
368