NetSim Source Code Help v14.4
All 13 Components
 
Loading...
Searching...
No Matches
OLSR.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
18
19int fn_NetSim_OLSR_PopulateLinkSet()
20{
21 bool expiry=false;
22 bool flag=false;
23 NODE_OLSR* olsr=GetOLSRData(pstruEventDetails->nDeviceId);
24 NetSim_PACKET* packet=pstruEventDetails->pPacket;
25 OLSR_HEADER* header=(OLSR_HEADER*)packet->pstruNetworkData->Packet_RoutingProtocol;
26 OLSR_HELLO_PACKET* hello=(OLSR_HELLO_PACKET*)header->message->MESSAGE;
27 OLSR_HELLO_LINK* linkInfo=hello->link;
28
29 NETSIM_IPAddress src=packet->pstruNetworkData->szSourceIP;
30 OLSR_LINK_SET* link = olsrFindLinkSet(olsr,src);
31 double vTime = olsrConvertMEToDouble(header->message->Vtime)*SECOND;
32
33 if(!link)
34 {
35 link = LINK_SET_ALLOC();
36 link->L_neighbor_iface_addr = IP_COPY(src);
37 link->L_local_iface_addr = IP_COPY(DEVICE_NWADDRESS(pstruEventDetails->nDeviceId,1));
38 link->L_SYM_time = pstruEventDetails->dEventTime -1;
39 link->L_time = pstruEventDetails->dEventTime + vTime;
40 LIST_ADD_LAST((void**)&olsr->linkSet,link);
41 olsr->bRoutingTableUpdate=true;
42 expiry=true;
43 }
44 link->L_ASYM_time = pstruEventDetails->dEventTime + vTime;
45 while(linkInfo)
46 {
47 if(!IP_COMPARE(linkInfo->NeighborInterfaceAddress,DEVICE_NWADDRESS(pstruEventDetails->nDeviceId,1)))
48 {
49 flag=true;
50 break;
51 }
52 linkInfo = linkInfo->next;
53 }
54 if(flag)
55 {
56 if(linkInfo->LinkCode.linkType == LOST_LINK)
57 link->L_SYM_time = pstruEventDetails->dEventTime-1;
58 else if(linkInfo->LinkCode.linkType == ASYM_LINK || linkInfo->LinkCode.linkType == SYM_LINK)
59 {
60 link->L_SYM_time = pstruEventDetails->dEventTime + vTime;
61 link->L_time = pstruEventDetails->dEventTime + NEIGHB_HOLD_TIME;
62 }
63 }
64 link->L_time = max(link->L_time,link->L_ASYM_time);
65 if(expiry)
66 olsrAddLinktuplesExpiryEvent(link);
67 return 0;
68}
69
70int fn_NetSim_OLSR_PopulateNeighborSet()
71{
72 //Section 8.1 RFC 3626
73 NODE_OLSR* olsr=GetOLSRData(pstruEventDetails->nDeviceId);
74 OLSR_LINK_SET* linkSet=olsr->linkSet;
75 OLSR_NEIGHBOR_SET* neighborSet=olsr->neighborSet;
76 NetSim_PACKET* packet=pstruEventDetails->pPacket;
77 OLSR_HEADER* header=(OLSR_HEADER*)packet->pstruNetworkData->Packet_RoutingProtocol;
78 OLSR_HELLO_PACKET* hello=(OLSR_HELLO_PACKET*)header->message->MESSAGE;
79 OLSR_HELLO_LINK* linkInfo=hello->link;
80 while(linkSet)
81 {
82 OLSR_NEIGHBOR_SET* neighbor;
83 neighbor = olsrFindNeighborSet(olsr->neighborSet,linkSet->L_neighbor_iface_addr);
84 if(!neighbor)
85 {
86//Create Neighbor set
87 neighbor=(OLSR_NEIGHBOR_SET*)NEIGHBOR_TUPLES_ALLOC();
88 neighbor->N_willingness=WILL_DEFAULT;
89 neighbor->N_neighbor_main_addr = IP_COPY(linkSet->L_neighbor_iface_addr);
90 LIST_ADD_LAST((void**)&olsr->neighborSet,neighbor);
91 olsr->bRoutingTableUpdate=true;
92 }
93//Update Neighbor Set
94 if(linkSet->L_SYM_time >= pstruEventDetails->dEventTime)
95 {
96 neighbor->N_status = SYM;
97 olsr->bRoutingTableUpdate=true;
98 }
99 else
100 neighbor->N_status = NOT_SYM;
101 linkSet=(OLSR_LINK_SET*)LIST_NEXT(linkSet);
102 }
103 neighborSet=olsr->neighborSet;
104//Remove neighbor set
105 while(neighborSet)
106 {
107 OLSR_LINK_SET* link = olsrFindLinkSet(olsr,neighborSet->N_neighbor_main_addr);
108 if(!link)
109 {
110 //Free the neighbor
111 LIST_FREE((void**)olsr->neighborSet,neighborSet);
112 }
113 neighborSet = (OLSR_NEIGHBOR_SET*)LIST_NEXT(neighborSet);
114 }
115//Section 8.1.1 RFC 3626
116 while(linkInfo)
117 {
118 OLSR_NEIGHBOR_SET* neighbor=olsrFindNeighborSet(olsr->neighborSet,linkInfo->NeighborInterfaceAddress);
119 if(neighbor)
120 {
121 neighbor->N_willingness = hello->Willingness;
122 }
123 linkInfo = linkInfo->next;
124 }
125 return 0;
126}
127
128int fn_NetSim_OLSR_Populate2HopNeighbor()
129{
130 //Section 8.2 RFC 3626
131 NODE_OLSR* olsr=GetOLSRData(pstruEventDetails->nDeviceId);
132 OLSR_LINK_SET* linkSet;
133 NetSim_PACKET* packet=pstruEventDetails->pPacket;
134 OLSR_HEADER* header=(OLSR_HEADER*)packet->pstruNetworkData->Packet_RoutingProtocol;
135 OLSR_HELLO_PACKET* hello=(OLSR_HELLO_PACKET*)header->message->MESSAGE;
136 OLSR_HELLO_LINK* linkInfo=hello->link;
137 double validityTime = olsrConvertMEToDouble(header->message->Vtime)*SECOND;
138 linkSet=olsrFindLinkSet(olsr,header->message->OriginatorAddress);
139 if(linkSet && linkSet->L_SYM_time >= pstruEventDetails->dEventTime)
140 {
141 while(linkInfo)
142 {
143 if(linkInfo->LinkCode.neighTypes == SYM_NEIGH ||
144 linkInfo->LinkCode.neighTypes == MPR_NEIGH)
145 {
146 if(!IP_COMPARE(linkInfo->NeighborInterfaceAddress,olsr->mainAddress))
147 {
148 //Discard
149 }
150 else if (olsrFindNeighborSet(olsr->neighborSet, linkInfo->NeighborInterfaceAddress))
151 {
152
153 }
154 else
155 {
156 bool flag=false;
157 OLSR_2HOP_NEIGHBOR_SET* neighbor=olsrFind2HopNeighbor(olsr,header->message->OriginatorAddress,linkInfo->NeighborInterfaceAddress);
158 if(!neighbor)
159 {
160 neighbor=(OLSR_2HOP_NEIGHBOR_SET*)OLSR_2HOPTUPLES_ALLOC();
161 LIST_ADD_LAST((void**)&olsr->twoHopNeighborSet,neighbor);
162 olsr->bRoutingTableUpdate=true;
163 flag=true;
164 }
165 neighbor->N_neighbor_main_addr = IP_COPY(header->message->OriginatorAddress);
166 neighbor->N_2hop_addr = IP_COPY(linkInfo->NeighborInterfaceAddress);
167 neighbor->N_time = pstruEventDetails->dEventTime + validityTime;
168 }
169 }
170 else if(linkInfo->LinkCode.neighTypes == NOT_NEIGH)
171 {
172 OLSR_2HOP_NEIGHBOR_SET* neighbor=olsrFind2HopNeighbor(olsr,header->message->OriginatorAddress,linkInfo->NeighborInterfaceAddress);
173 if(neighbor)
174 {
175 LIST_FREE((void**)&olsr->twoHopNeighborSet,neighbor);
176 }
177 }
178 else
179 {
180 fnNetSimError("Unknown neighbor type %d in populate 2 hop neighbor set.\n",linkInfo->LinkCode.neighTypes);
181 }
182 linkInfo=linkInfo->next;
183 }
184 }
185 OLSR_2HOP_NEIGHBOR_SET* currNeighbor = olsr->twoHopNeighborSet;
186 while (currNeighbor)
187 {
188 if (currNeighbor->N_time <= pstruEventDetails->dEventTime)
189 {
190 OLSR_2HOP_NEIGHBOR_SET* nextNeighbor = (OLSR_2HOP_NEIGHBOR_SET*)LIST_NEXT(currNeighbor);
191 LIST_FREE((void**)&olsr->twoHopNeighborSet, currNeighbor);
192 currNeighbor = nextNeighbor;
193 }
194 else
195 {
196 currNeighbor = (OLSR_2HOP_NEIGHBOR_SET*)LIST_NEXT(currNeighbor);
197 }
198 }
199 return 0;
200}
202{
203 OLSR_NEIGHBOR_SET* y;
204 unsigned int degree;
205 struct stru_Degree* next;
206};
207
208unsigned int getD(struct stru_Degree* D,OLSR_NEIGHBOR_SET* y)
209{
210 while(D)
211 {
212 if(D->y==y)
213 return D->degree;
214 D=D->next;
215 }
216 return 0;
217}
218struct stru_Degree* fnCalculateDegree(OLSR_NEIGHBOR_SET* N,OLSR_2HOP_NEIGHBOR_SET* N2)
219{
220 struct stru_Degree* D=NULL,*temp,*ret=NULL;
221 OLSR_NEIGHBOR_SET* i;
222 for(i=N;i;i=(OLSR_NEIGHBOR_SET*)LIST_NEXT(i))
223 {
224 OLSR_2HOP_NEIGHBOR_SET* j;
225 temp=(struct stru_Degree*)calloc(1,sizeof* temp);
226 temp->y = i;
227 for(j=N2;j;j=(OLSR_2HOP_NEIGHBOR_SET*)LIST_NEXT(j))
228 {
229 if(!IP_COMPARE(i->N_neighbor_main_addr,j->N_neighbor_main_addr))
230 temp->degree++;
231 }
232 if(D)
233 D->next=temp;
234 else
235 ret=temp;
236 D=temp;
237 }
238 return ret;
239}
240int fnFlushN2(OLSR_2HOP_NEIGHBOR_SET** N2,NETSIM_IPAddress two_hop_ip)
241{
242 OLSR_2HOP_NEIGHBOR_SET* i;
243 i=*N2;
244 while(i)
245 {
246 if(!IP_COMPARE(i->N_2hop_addr,two_hop_ip))
247 {
248 LIST_FREE((void**)N2,i);
249 i=*N2;
250 continue;
251 }
252 i=(OLSR_2HOP_NEIGHBOR_SET*)LIST_NEXT(i);
253 }
254 return 0;
255}
256int fnFlush2HopSetBasedonMPR(OLSR_2HOP_NEIGHBOR_SET** N2,OLSR_MPR_SET* mprSet)
257{
258 OLSR_2HOP_NEIGHBOR_SET* i;
259 OLSR_MPR_SET* j;
260 for(j=mprSet;j;j=(OLSR_MPR_SET*)LIST_NEXT(j))
261 {
262 i=*N2;
263 while(i)
264 {
265 if(!IP_COMPARE(j->neighborAddress,i->N_neighbor_main_addr))
266 {
267 fnFlushN2(N2,i->N_2hop_addr);
268 i=*N2;
269 continue;
270 }
271 i=(OLSR_2HOP_NEIGHBOR_SET*)LIST_NEXT(i);
272 }
273 }
274 return 0;
275}
276
277
278/**
279MPR set of an interface
280
281 a (sub)set of the neighbors of an interface with a
282 willingness different from WILL_NEVER, selected such that
283 through these selected nodes, all strict 2-hop neighbors
284 reachable from that interface are reachable.
285
286 N:
287 N is the subset of neighbors of the node, which are
288 neighbor of the interface I.
289
290 N2:
291 The set of 2-hop neighbors reachable from the interface
292 I, excluding:
293
294 (i) the nodes only reachable by members of N with
295 willingness WILL_NEVER
296
297 (ii) the node performing the computation
298
299 (iii) all the symmetric neighbors: the nodes for which
300 there exists a symmetric link to this node on some
301 interface.
302
303 D(y):
304 The degree of a 1-hop neighbor node y (where y is a
305 member of N), is defined as the number of symmetric
306 neighbors of node y, EXCLUDING all the members of N and
307 EXCLUDING the node performing the computation.
308
309 The proposed heuristic is as follows:
310
311 1 Start with an MPR set made of all members of N with
312 N_willingness equal to WILL_ALWAYS
313
314 2 Calculate D(y), where y is a member of N, for all nodes in N.
315
316 3 Add to the MPR set those nodes in N, which are the *only*
317 nodes to provide reachability to a node in N2. For example,
318 if node b in N2 can be reached only through a symmetric link
319 to node a in N, then add node a to the MPR set. Remove the
320 nodes from N2 which are now covered by a node in the MPR set.
321
322 4 While there exist nodes in N2 which are not covered by at
323 least one node in the MPR set:
324
325 4.1 For each node in N, calculate the reachability, i.e., the
326 number of nodes in N2 which are not yet covered by at
327 least one node in the MPR set, and which are reachable
328 through this 1-hop neighbor;
329
330 4.2 Select as a MPR the node with highest N_willingness among
331 the nodes in N with non-zero reachability. In case of
332 multiple choice select the node which provides
333 reachability to the maximum number of nodes in N2. In
334 case of multiple nodes providing the same amount of
335 reachability, select the node as MPR whose D(y) is
336 greater. Remove the nodes from N2 which are now covered
337 by a node in the MPR set.
338
339 5 A node's MPR set is generated from the union of the MPR sets
340 for each interface. As an optimization, process each node, y,
341 in the MPR set in increasing order of N_willingness. If all
342 nodes in N2 are still covered by at least one node in the MPR
343 set excluding node y, and if N_willingness of node y is
344 smaller than WILL_ALWAYS, then node y MAY be removed from the
345 MPR set.
346*/
347int fn_NetSim_OLSR_PopulateMPRSet()
348 {
349 //Section 8.3 RFC 3626
350 NODE_OLSR* olsr=GetOLSRData(pstruEventDetails->nDeviceId);
351 OLSR_NEIGHBOR_SET* N = olsrFillNeighbor(olsr);
352 OLSR_MPR_SET* mprSet=NULL;
353 OLSR_2HOP_NEIGHBOR_SET* N2 = olsrFill2HopNeighbor(olsr);
354 struct stru_Degree *D=fnCalculateDegree(N,N2);
355 OLSR_2HOP_NEIGHBOR_SET* i=N2;
356 while(i)
357 {
358 OLSR_2HOP_NEIGHBOR_SET* j;
359 bool flag=true;
360 for(j=N2;j;j=(OLSR_2HOP_NEIGHBOR_SET*)LIST_NEXT(j))
361 {
362 if(i!=j)
363 {
364 if(!IP_COMPARE(i->N_2hop_addr,j->N_2hop_addr))
365 {
366 flag=false;
367 break;
368 }
369 }
370 }
371 if(flag)
372 {
373 olsrAddtoMPRSet(&mprSet,N,i);
374 fnFlush2HopSetBasedonMPR(&N2,mprSet);
375 i=N2;
376 olsr->bRoutingTableUpdate=true;
377 continue;
378 }
379 i=(OLSR_2HOP_NEIGHBOR_SET*)LIST_NEXT(i);
380 }
381 if(N2)
382 {
383 i=N2;
384 while(i)
385 {
386 OLSR_2HOP_NEIGHBOR_SET* j;
387 OLSR_NEIGHBOR_SET* current=olsrFindNeighborSet(N,i->N_neighbor_main_addr);
388 OLSR_NEIGHBOR_SET* temp;
389 unsigned int degree = getD(D,current);
390
391 for(j=N2;j;j=(OLSR_2HOP_NEIGHBOR_SET*)LIST_NEXT(j))
392 {
393 if(i!=j)
394 {
395 if(!IP_COMPARE(i->N_2hop_addr,j->N_2hop_addr))
396 {
397 temp=olsrFindNeighborSet(N,j->N_neighbor_main_addr);
398 if(temp->N_willingness > current->N_willingness)
399 {
400 current=temp;
401 degree=getD(D,current);
402 }
403 else if(temp->N_willingness == current->N_willingness)
404 {
405 if(getD(D,temp) > degree)
406 {
407 current = temp;
408 degree = getD(D,current);
409 }
410 }
411 else
412 {
413 //do nothing
414 }
415 }
416 }
417 }
418 olsrAddtoMPRSet(&mprSet,N,i);
419 fnFlush2HopSetBasedonMPR(&N2,mprSet);
420 i=N2;
421 olsr->bRoutingTableUpdate=true;
422 }
423 }
424 while(olsr->mprSet)
425 LIST_FREE((void**)&olsr->mprSet,olsr->mprSet);
426 olsr->mprSet=mprSet;
427 olsrMarkMPR(olsr);
428
429 if(mprSet)
430 {
431 write_MPR_log(mprSet, olsr->neighborSet, olsr->twoHopNeighborSet);
432 olsrPrintMPR(mprSet);
433 }
434
435 while(N)
436 LIST_FREE((void**)&N,N);
437 while(D)
438 {
439 struct stru_Degree* degree=D;
440 D=D->next;
441 free(degree);
442 }
443 return 0;
444}
445
446int fn_NetSim_OLSR_PopulateMPRSelectorSet()
447{
448 //Section 8.4.1 RFC 3626
449 NODE_OLSR* olsr=GetOLSRData(pstruEventDetails->nDeviceId);
450 NetSim_PACKET* packet=pstruEventDetails->pPacket;
451 OLSR_HEADER* header=(OLSR_HEADER*)packet->pstruNetworkData->Packet_RoutingProtocol;
452 OLSR_HELLO_PACKET* hello=(OLSR_HELLO_PACKET*)header->message->MESSAGE;
453 OLSR_HELLO_LINK* linkInfo=hello->link;
454 double validityTime=olsrConvertMEToDouble(header->message->Vtime);
455 while(linkInfo)
456 {
457 if(linkInfo->LinkCode.neighTypes==MPR_NEIGH)
458 {
459 OLSR_MPR_SELECTION_SET* set = olsrFindMPRSelectorSet(olsr->mprSelectionSet,header->message->OriginatorAddress);
460 if(!set)
461 {
462 set=MPR_SELECTION_SET_ALLOC();
463 LIST_ADD_LAST((void**)&olsr->mprSelectionSet,set);
464 set->MS_main_addr = IP_COPY(header->message->OriginatorAddress);
465 }
466 set->MS_time = pstruEventDetails->dEventTime + validityTime;
467 }
468 linkInfo = linkInfo->next;
469 }
470 return 0;
471}
472
473OLSR_NEIGHBOR_SET* olsrFindNeighborSet(OLSR_NEIGHBOR_SET* neighborSet,NETSIM_IPAddress ip)
474{
475 OLSR_NEIGHBOR_SET* set =neighborSet;
476 while(set)
477 {
478 if(!IP_COMPARE(set->N_neighbor_main_addr,ip))
479 return set;
480 set = (OLSR_NEIGHBOR_SET*)LIST_NEXT(set);
481 }
482 return NULL;
483}
484OLSR_LINK_SET* olsrFindLinkSet(NODE_OLSR* olsr,NETSIM_IPAddress ip)
485{
486 OLSR_LINK_SET* linkSet = olsr->linkSet;
487 while(linkSet)
488 {
489 if(!IP_COMPARE(linkSet->L_neighbor_iface_addr,ip))
490 return linkSet;
491 linkSet = (OLSR_LINK_SET*)LIST_NEXT(linkSet);
492 }
493 return NULL;
494}
495OLSR_2HOP_NEIGHBOR_SET* olsrFind2HopNeighbor(NODE_OLSR* olsr,NETSIM_IPAddress neighborAddress,NETSIM_IPAddress N_2_Hop_Address)
496{
497 OLSR_2HOP_NEIGHBOR_SET* neighbor = olsr->twoHopNeighborSet;
498 while(neighbor)
499 {
500 if(!IP_COMPARE(neighbor->N_neighbor_main_addr,neighborAddress) &&
501 !IP_COMPARE(neighbor->N_2hop_addr,N_2_Hop_Address))
502 return neighbor;
503 neighbor=(OLSR_2HOP_NEIGHBOR_SET*)LIST_NEXT(neighbor);
504 }
505 return NULL;
506}
507OLSR_NEIGHBOR_SET* olsrFillNeighbor(NODE_OLSR* olsr)
508{
509 OLSR_NEIGHBOR_SET* ret=NULL;
510 OLSR_NEIGHBOR_SET* neighbor = olsr->neighborSet;
511 while(neighbor)
512 {
513 if(neighbor->N_willingness != WILL_NEVER)
514 {
515 OLSR_NEIGHBOR_SET* temp=(OLSR_NEIGHBOR_SET*)NEIGHBOR_TUPLES_ALLOC();
516 temp->N_neighbor_main_addr = IP_COPY(neighbor->N_neighbor_main_addr);
517 temp->N_status = neighbor->N_status;
518 temp->N_willingness = neighbor->N_willingness;
519 LIST_ADD_LAST((void**)&ret,temp);
520 }
521 neighbor = (OLSR_NEIGHBOR_SET*)LIST_NEXT(neighbor);
522 }
523 return ret;
524}
525OLSR_2HOP_NEIGHBOR_SET* olsrFill2HopNeighbor(NODE_OLSR* olsr)
526{
527 OLSR_2HOP_NEIGHBOR_SET* ret=NULL;
528 OLSR_2HOP_NEIGHBOR_SET* two_hop_neighbor;
529 for(two_hop_neighbor = olsr->twoHopNeighborSet;two_hop_neighbor;two_hop_neighbor = (OLSR_2HOP_NEIGHBOR_SET*)LIST_NEXT(two_hop_neighbor))
530 {
531 OLSR_NEIGHBOR_SET* neighbor = olsrFindNeighborSet(olsr->neighborSet,two_hop_neighbor->N_neighbor_main_addr);
532 if (neighbor->N_willingness != WILL_NEVER) // Condition (i)
533 {
534 OLSR_NEIGHBOR_SET* neighSet = olsrFindNeighborSet(olsr->neighborSet, two_hop_neighbor->N_2hop_addr);
535 if (neighSet) continue; // Condition (ii)
536
537 OLSR_LINK_SET* link = olsrFindLinkSet(olsr, two_hop_neighbor->N_2hop_addr);
538 if (link && link->L_SYM_time >= pstruEventDetails->dEventTime)
539 {
540 continue; // condition (iii)
541 }
542 else
543 {
544 OLSR_2HOP_NEIGHBOR_SET* temp = (OLSR_2HOP_NEIGHBOR_SET*)OLSR_2HOPTUPLES_ALLOC();
545 temp->N_2hop_addr = IP_COPY(two_hop_neighbor->N_2hop_addr);
546 temp->N_neighbor_main_addr = IP_COPY(two_hop_neighbor->N_neighbor_main_addr);
547 temp->N_time = two_hop_neighbor->N_time;
548 LIST_ADD_LAST((void**)&ret, temp);
549 }
550 }
551 }
552 return ret;
553}
554int olsrAddtoMPRSet(OLSR_MPR_SET** mpr,OLSR_NEIGHBOR_SET* N,OLSR_2HOP_NEIGHBOR_SET* N2)
555{
556 OLSR_NEIGHBOR_SET* i;
557 for(i=N;i;i=(OLSR_NEIGHBOR_SET*)LIST_NEXT(i))
558 {
559 if(!IP_COMPARE(i->N_neighbor_main_addr,N2->N_neighbor_main_addr))
560 {
561 OLSR_MPR_SET* set=MPRSET_ALLOC();
562 set->neighborAddress=i->N_neighbor_main_addr;
563 LIST_ADD_LAST((void**)mpr,set);
564 break;
565 }
566 }
567 return 0;
568}
569int olsrMarkMPR(NODE_OLSR* olsr)
570{
571 OLSR_MPR_SET* mpr = olsr->mprSet;
572 OLSR_NEIGHBOR_SET* neighbor = olsr->neighborSet;
573 while(mpr)
574 {
575 OLSR_NEIGHBOR_SET* N=olsrFindNeighborSet(neighbor,mpr->neighborAddress);
576 if(N)
577 N->N_status=MPR_NEIGH;
578 mpr=(OLSR_MPR_SET*)LIST_NEXT(mpr);
579 }
580 return 0;
581}
582OLSR_MPR_SELECTION_SET* olsrFindMPRSelectorSet(OLSR_MPR_SELECTION_SET* set,NETSIM_IPAddress ip)
583{
584 while(set)
585 {
586 if(!IP_COMPARE(set->MS_main_addr,ip))
587 return set;
588 set=(OLSR_MPR_SELECTION_SET*)LIST_NEXT(set);
589 }
590 return NULL;
591}
592int olsrAddLinktuplesExpiryEvent(OLSR_LINK_SET* link)
593{
594 NetSim_EVENTDETAILS pevent;
595 pevent.dEventTime=link->L_time;
596 pevent.dPacketSize=0;
597 pevent.nApplicationId=0;
598 pevent.nDeviceId=pstruEventDetails->nDeviceId;
599 pevent.nDeviceType=pstruEventDetails->nDeviceType;
600 pevent.nEventType=TIMER_EVENT;
601 pevent.nInterfaceId=pstruEventDetails->nInterfaceId;
602 pevent.nPacketId=0;
603 pevent.nProtocolId=NW_PROTOCOL_OLSR;
604 pevent.nSegmentId=0;
605 pevent.nSubEventType=OLSR_LINK_TUPLE_Expire;
606 pevent.pPacket=NULL;
607 pevent.szOtherDetails=link;
608 fnpAddEvent(&pevent);
609 return 0;
610}
611int olsrPrintMPR(OLSR_MPR_SET* mprSet)
612{
613 printf("\nMpr Set of node %d at time %lf--- ",pstruEventDetails->nDeviceId,pstruEventDetails->dEventTime);
614 while(mprSet)
615 {
616 char ip[_NETSIM_IP_LEN];
617 IP_TO_STR(mprSet->neighborAddress,ip);
618 fprintf(stdout,"%s, ",ip);
619 mprSet=(OLSR_MPR_SET*)LIST_NEXT(mprSet);
620 }
621 fprintf(stdout,"\n");
622 return 0;
623}
624int fn_NetSim_OLSR_PacketProcessing()
625{
626 //Section 3.4
627 NODE_OLSR* olsr=GetOLSRData(pstruEventDetails->nDeviceId);
628 OLSR_HEADER* header=(OLSR_HEADER*)pstruEventDetails->pPacket->pstruNetworkData->Packet_RoutingProtocol;
629 OLSR_HEADER_MESSAGE* hdrMessage=header->message;
630 if(hdrMessage->MESSAGE==NULL) //Condition 1
631 {
632 fn_NetSim_Packet_FreePacket(pstruEventDetails->pPacket);
633 pstruEventDetails->pPacket=NULL;
634 return -1;
635 }
636 //Condition 2
637 if(hdrMessage->TimeToLive == 0)
638 {
639 fn_NetSim_Packet_FreePacket(pstruEventDetails->pPacket);
640 pstruEventDetails->pPacket=NULL;
641 return -2;
642 }
643 if(!IP_COMPARE(hdrMessage->OriginatorAddress,olsr->mainAddress))
644 {
645 fn_NetSim_Packet_FreePacket(pstruEventDetails->pPacket);
646 pstruEventDetails->pPacket=NULL;
647 return -2;
648 }
649 //Condition 3
650 if(olsrExistInDuplicateSet(olsr->duplicateSet,header))
651 {
652 fn_NetSim_Packet_FreePacket(pstruEventDetails->pPacket);
653 pstruEventDetails->pPacket=NULL;
654 return -2;
655 }
656 switch(hdrMessage->MessageType)
657 {
658 case TC_MESSAGE:
659 fn_NetSim_OLSR_ReceiveTC();
660 fn_NetSim_OLSR_UpdateRoutingTable();
661 break;
662 default:
663 fnNetSimError("Unknown message type %d for OLSR protocol in packet processing function\n",hdrMessage->MessageType);
664 break;
665 }
666 return 0;
667}
668bool olsrExistInDuplicateSet(OLSR_DUPLICATE_SET* set,OLSR_HEADER* header)
669{
670 while(set)
671 {
672 if(!IP_COMPARE(set->D_addr,header->message->OriginatorAddress) &&
673 set->D_seq_num == header->message->MessageSequenceNumber)
674 return true;
675 set=(OLSR_DUPLICATE_SET*)LIST_NEXT(set);
676 }
677 return false;
678}
679int fn_NetSim_OLSR_PacketForwarding()
680{
681 //Section 3.4.1
682 bool forwardFlag=false;
683 NetSim_PACKET* packet = pstruEventDetails->pPacket;
684 OLSR_HEADER* header = (OLSR_HEADER*)packet->pstruNetworkData->Packet_RoutingProtocol;
685 NODE_OLSR* olsr=GetOLSRData(pstruEventDetails->nDeviceId);
686 OLSR_NEIGHBOR_SET* neighbor;
687 OLSR_DUPLICATE_SET* duplicate;
688 OLSR_MPR_SELECTION_SET* mpr;
689 NetSim_PACKET* retransmitted;
690
691 //Condition 1
692 neighbor = olsrFindNeighborSet(olsr->neighborSet,packet->pstruNetworkData->szGatewayIP);
693 if(neighbor && neighbor->N_status<SYM_NEIGH)
694 return -1;
695
696 //Condition 2,3
697 duplicate=olsrFindDuplicateSet(olsr->duplicateSet,header->message->OriginatorAddress,header->message->MessageSequenceNumber);
698 if(duplicate && (duplicate->D_retransmitted==true ||
699 !IP_COMPARE(olsr->mainAddress,duplicate->D_iface_list)))
700 {
701 return -2;
702 }
703
704 //condition 4
705 mpr=olsrFindMPRSelectorSet(olsr->mprSelectionSet,packet->pstruNetworkData->szGatewayIP);
706 if(mpr && header->message->TimeToLive > 1)
707 forwardFlag=true;
708
709 //condition 5
710 if(duplicate)
711 {
712 duplicate->D_time=pstruEventDetails->dEventTime+DUP_HOLD_TIME;
713 duplicate->D_iface_list=IP_COPY(olsr->mainAddress);
714 if(forwardFlag)
715 duplicate->D_retransmitted=true;
716 }
717 else
718 {
719 duplicate=DUPLICATE_SET_ALLOC();
720 duplicate->D_addr=IP_COPY(header->message->OriginatorAddress);
721 duplicate->D_seq_num=header->message->MessageSequenceNumber;
722 duplicate->D_iface_list=IP_COPY(olsr->mainAddress);
723 duplicate->D_time=pstruEventDetails->dEventTime+DUP_HOLD_TIME;
724 if(forwardFlag)
725 duplicate->D_retransmitted=true;
726 LIST_ADD_LAST((void**)&olsr->duplicateSet,duplicate);
727 }
728
729 retransmitted=fn_NetSim_Packet_CopyPacket(packet);
730 if(forwardFlag)
731 {
732 OLSR_HEADER* reheader=(OLSR_HEADER*)retransmitted->pstruNetworkData->Packet_RoutingProtocol;
733 retransmitted->pstruNetworkData->nTTL--;
734 reheader->message->TimeToLive--;
735 reheader->message->HopCount++;
736 }
737 retransmitted->pstruNetworkData->szGatewayIP=IP_COPY(olsr->mainAddress);
738 retransmitted->pstruNetworkData->szNextHopIp=NULL;
739 pstruEventDetails->dPacketSize=retransmitted->pstruNetworkData->dPacketSize;
740 pstruEventDetails->nApplicationId=0;
741 pstruEventDetails->nEventType=NETWORK_OUT_EVENT;
742 pstruEventDetails->nProtocolId=NW_PROTOCOL_IPV4;
743 pstruEventDetails->nSegmentId=0;
744 pstruEventDetails->nSubEventType=0;
745 pstruEventDetails->pPacket=retransmitted;
746 pstruEventDetails->szOtherDetails=NULL;
747 fnpAddEvent(pstruEventDetails);
748
749 return 0;
750}
751
752OLSR_DUPLICATE_SET* olsrFindDuplicateSet(OLSR_DUPLICATE_SET* duplicate,NETSIM_IPAddress ip,unsigned short int seq_no)
753{
754 while(duplicate)
755 {
756 if(!IP_COMPARE(duplicate->D_addr,ip) &&
757 duplicate->D_seq_num == seq_no)
758 return duplicate;
759 duplicate=(OLSR_DUPLICATE_SET*)LIST_NEXT(duplicate);
760 }
761 return NULL;
762}
763int fn_NetSim_OLSR_LinkTupleExpire()
764{
765 NODE_OLSR* olsr=GetOLSRData(pstruEventDetails->nDeviceId);
766 OLSR_LINK_SET* link=(OLSR_LINK_SET*)pstruEventDetails->szOtherDetails;
767 if(link->L_time<=pstruEventDetails->dEventTime)
768 {
769 //remove neighbor tuples
770 fn_NetSim_OLSR_RemoveNeighbortuple(link);
771 //Link tuples expires
772 LIST_FREE((void**)&olsr->linkSet,link);
773 //Update the routing table
774 fn_NetSim_OLSR_UpdateRoutingTable();
775 }
776 else
777 {
778 pstruEventDetails->dEventTime=link->L_time;
779 fnpAddEvent(pstruEventDetails);
780 }
781 return 0;
782}
783int fn_NetSim_OLSR_RemoveNeighbortuple(OLSR_LINK_SET* link)
784{
785 NODE_OLSR* olsr=GetOLSRData(pstruEventDetails->nDeviceId);
786 OLSR_NEIGHBOR_SET* neighbor=olsr->neighborSet;
787 OLSR_LINK_SET* linkset=olsr->linkSet;
788 unsigned int count=0;
789 while(linkset)
790 {
791 if(!IP_COMPARE(linkset->L_neighbor_iface_addr,link->L_neighbor_iface_addr))
792 count++;
793 linkset=(OLSR_LINK_SET*)LIST_NEXT(linkset);
794 }
795 if(count>=2)
796 return 0; //Other link tuple exists.
797 while(neighbor)
798 {
799 if(!IP_COMPARE(link->L_neighbor_iface_addr,neighbor->N_neighbor_main_addr))
800 {
801 fn_NetSim_OLSR_Remove2HopTuple(olsr,neighbor);
802 LIST_FREE((void**)&olsr->neighborSet,neighbor);
803 neighbor=olsr->neighborSet;
804 olsr->bRoutingTableUpdate=true;
805 continue;
806 }
807 neighbor=(OLSR_NEIGHBOR_SET*)LIST_NEXT(neighbor);
808 }
809 return 0;
810}
811
812int fn_NetSim_OLSR_Remove2HopTuple(NODE_OLSR* olsr,OLSR_NEIGHBOR_SET* neighbor)
813{
814 OLSR_2HOP_NEIGHBOR_SET* two_hop_neighbor=olsr->twoHopNeighborSet;
815 while(two_hop_neighbor)
816 {
817 if(!IP_COMPARE(two_hop_neighbor->N_neighbor_main_addr,neighbor->N_neighbor_main_addr))
818 {
819 LIST_FREE(&olsr->twoHopNeighborSet,two_hop_neighbor);
820 two_hop_neighbor=olsr->twoHopNeighborSet;
821 continue;
822 }
823 two_hop_neighbor=(OLSR_2HOP_NEIGHBOR_SET*)LIST_NEXT(two_hop_neighbor);
824 }
825 return 0;
826}
827
828int fn_NetSim_OLSR_2HopTupleExpire()
829{
830 NODE_OLSR* olsr=GetOLSRData(pstruEventDetails->nDeviceId);
831 OLSR_2HOP_NEIGHBOR_SET* neighbor=pstruEventDetails->szOtherDetails;
832 if(neighbor->N_time<=pstruEventDetails->dEventTime)
833 {
834 //Link tuples expires
835 LIST_FREE(&olsr->twoHopNeighborSet,neighbor);
836 olsr->bRoutingTableUpdate=true;
837 //Update the routing table
838 fn_NetSim_OLSR_UpdateRoutingTable();
839 }
840 else
841 {
842 pstruEventDetails->dEventTime=neighbor->N_time;
843 fnpAddEvent(pstruEventDetails);
844 }
845 return 0;
846}
847
848void write_MPR_log(OLSR_MPR_SET* mprSet, OLSR_NEIGHBOR_SET* neighborset,
849OLSR_2HOP_NEIGHBOR_SET* twohopneighborset)
850{
851 //Code to write the log file
852 NETSIM_ID nInterface;
853 if (fpRMlog == NULL) return;
854 fprintf(fpRMlog, "%.2lf,%s,%d,", pstruEventDetails->dEventTime / MILLISECOND, DEVICE_NAME(pstruEventDetails->nDeviceId), pstruEventDetails->nDeviceId);
855 while (mprSet)
856 {
857 char ip[_NETSIM_IP_LEN];
858 IP_TO_STR(mprSet->neighborAddress, ip);
859 NETSIM_ID id = fn_NetSim_Stack_GetDeviceId_asIP(mprSet->neighborAddress, &nInterface);
860 fprintf(fpRMlog, "%s; ", DEVICE_NAME(id));
861 mprSet = (OLSR_MPR_SET*)LIST_NEXT(mprSet);
862 }
863 fprintf(fpRMlog, ",");
864 while (neighborset) {
865 char ip[_NETSIM_IP_LEN];
866 IP_TO_STR(neighborset->N_neighbor_main_addr, ip);
867 NETSIM_ID id = fn_NetSim_Stack_GetDeviceId_asIP(neighborset->N_neighbor_main_addr, &nInterface);
868 fprintf(fpRMlog, "%s; ", DEVICE_NAME(id));
869 neighborset = (OLSR_NEIGHBOR_SET*)LIST_NEXT(neighborset);
870 }
871 fprintf(fpRMlog, ",");
872 while (twohopneighborset) {
873 char ip[_NETSIM_IP_LEN];
874 IP_TO_STR(twohopneighborset->N_2hop_addr, ip);
875 NETSIM_ID id = fn_NetSim_Stack_GetDeviceId_asIP(twohopneighborset->N_2hop_addr, &nInterface);
876 fprintf(fpRMlog, "%s; ", DEVICE_NAME(id));
877 twohopneighborset = (OLSR_2HOP_NEIGHBOR_SET*)LIST_NEXT(twohopneighborset);
878 }
879 fprintf(fpRMlog, "\n");
880 if (nDbgFlag) fflush(fpRMlog);
881}