19int fn_NetSim_OLSR_PopulateLinkSet()
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;
29 NETSIM_IPAddress src=packet->pstruNetworkData->szSourceIP;
30 OLSR_LINK_SET* link = olsrFindLinkSet(olsr,src);
31 double vTime = olsrConvertMEToDouble(header->message->Vtime)*SECOND;
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;
44 link->L_ASYM_time = pstruEventDetails->dEventTime + vTime;
47 if(!IP_COMPARE(linkInfo->NeighborInterfaceAddress,DEVICE_NWADDRESS(pstruEventDetails->nDeviceId,1)))
52 linkInfo = linkInfo->next;
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)
60 link->L_SYM_time = pstruEventDetails->dEventTime + vTime;
61 link->L_time = pstruEventDetails->dEventTime + NEIGHB_HOLD_TIME;
64 link->L_time = max(link->L_time,link->L_ASYM_time);
66 olsrAddLinktuplesExpiryEvent(link);
70int fn_NetSim_OLSR_PopulateNeighborSet()
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;
82 OLSR_NEIGHBOR_SET* neighbor;
83 neighbor = olsrFindNeighborSet(olsr->neighborSet,linkSet->L_neighbor_iface_addr);
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;
94 if(linkSet->L_SYM_time >= pstruEventDetails->dEventTime)
96 neighbor->N_status = SYM;
97 olsr->bRoutingTableUpdate=
true;
100 neighbor->N_status = NOT_SYM;
101 linkSet=(OLSR_LINK_SET*)LIST_NEXT(linkSet);
103 neighborSet=olsr->neighborSet;
107 OLSR_LINK_SET* link = olsrFindLinkSet(olsr,neighborSet->N_neighbor_main_addr);
111 LIST_FREE((
void**)olsr->neighborSet,neighborSet);
113 neighborSet = (OLSR_NEIGHBOR_SET*)LIST_NEXT(neighborSet);
118 OLSR_NEIGHBOR_SET* neighbor=olsrFindNeighborSet(olsr->neighborSet,linkInfo->NeighborInterfaceAddress);
121 neighbor->N_willingness = hello->Willingness;
123 linkInfo = linkInfo->next;
128int fn_NetSim_OLSR_Populate2HopNeighbor()
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)
143 if(linkInfo->LinkCode.neighTypes == SYM_NEIGH ||
144 linkInfo->LinkCode.neighTypes == MPR_NEIGH)
146 if(!IP_COMPARE(linkInfo->NeighborInterfaceAddress,olsr->mainAddress))
150 else if (olsrFindNeighborSet(olsr->neighborSet, linkInfo->NeighborInterfaceAddress))
157 OLSR_2HOP_NEIGHBOR_SET* neighbor=olsrFind2HopNeighbor(olsr,header->message->OriginatorAddress,linkInfo->NeighborInterfaceAddress);
160 neighbor=(OLSR_2HOP_NEIGHBOR_SET*)OLSR_2HOPTUPLES_ALLOC();
161 LIST_ADD_LAST((
void**)&olsr->twoHopNeighborSet,neighbor);
162 olsr->bRoutingTableUpdate=
true;
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;
170 else if(linkInfo->LinkCode.neighTypes == NOT_NEIGH)
172 OLSR_2HOP_NEIGHBOR_SET* neighbor=olsrFind2HopNeighbor(olsr,header->message->OriginatorAddress,linkInfo->NeighborInterfaceAddress);
175 LIST_FREE((
void**)&olsr->twoHopNeighborSet,neighbor);
180 fnNetSimError(
"Unknown neighbor type %d in populate 2 hop neighbor set.\n",linkInfo->LinkCode.neighTypes);
182 linkInfo=linkInfo->next;
185 OLSR_2HOP_NEIGHBOR_SET* currNeighbor = olsr->twoHopNeighborSet;
188 if (currNeighbor->N_time <= pstruEventDetails->dEventTime)
190 OLSR_2HOP_NEIGHBOR_SET* nextNeighbor = (OLSR_2HOP_NEIGHBOR_SET*)LIST_NEXT(currNeighbor);
191 LIST_FREE((
void**)&olsr->twoHopNeighborSet, currNeighbor);
192 currNeighbor = nextNeighbor;
196 currNeighbor = (OLSR_2HOP_NEIGHBOR_SET*)LIST_NEXT(currNeighbor);
203 OLSR_NEIGHBOR_SET* y;
208unsigned int getD(
struct stru_Degree* D,OLSR_NEIGHBOR_SET* y)
218struct stru_Degree* fnCalculateDegree(OLSR_NEIGHBOR_SET* N,OLSR_2HOP_NEIGHBOR_SET* N2)
221 OLSR_NEIGHBOR_SET* i;
222 for(i=N;i;i=(OLSR_NEIGHBOR_SET*)LIST_NEXT(i))
224 OLSR_2HOP_NEIGHBOR_SET* j;
227 for(j=N2;j;j=(OLSR_2HOP_NEIGHBOR_SET*)LIST_NEXT(j))
229 if(!IP_COMPARE(i->N_neighbor_main_addr,j->N_neighbor_main_addr))
240int fnFlushN2(OLSR_2HOP_NEIGHBOR_SET** N2,NETSIM_IPAddress two_hop_ip)
242 OLSR_2HOP_NEIGHBOR_SET* i;
246 if(!IP_COMPARE(i->N_2hop_addr,two_hop_ip))
248 LIST_FREE((
void**)N2,i);
252 i=(OLSR_2HOP_NEIGHBOR_SET*)LIST_NEXT(i);
256int fnFlush2HopSetBasedonMPR(OLSR_2HOP_NEIGHBOR_SET** N2,OLSR_MPR_SET* mprSet)
258 OLSR_2HOP_NEIGHBOR_SET* i;
260 for(j=mprSet;j;j=(OLSR_MPR_SET*)LIST_NEXT(j))
265 if(!IP_COMPARE(j->neighborAddress,i->N_neighbor_main_addr))
267 fnFlushN2(N2,i->N_2hop_addr);
271 i=(OLSR_2HOP_NEIGHBOR_SET*)LIST_NEXT(i);
347int fn_NetSim_OLSR_PopulateMPRSet()
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);
355 OLSR_2HOP_NEIGHBOR_SET* i=N2;
358 OLSR_2HOP_NEIGHBOR_SET* j;
360 for(j=N2;j;j=(OLSR_2HOP_NEIGHBOR_SET*)LIST_NEXT(j))
364 if(!IP_COMPARE(i->N_2hop_addr,j->N_2hop_addr))
373 olsrAddtoMPRSet(&mprSet,N,i);
374 fnFlush2HopSetBasedonMPR(&N2,mprSet);
376 olsr->bRoutingTableUpdate=
true;
379 i=(OLSR_2HOP_NEIGHBOR_SET*)LIST_NEXT(i);
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);
391 for(j=N2;j;j=(OLSR_2HOP_NEIGHBOR_SET*)LIST_NEXT(j))
395 if(!IP_COMPARE(i->N_2hop_addr,j->N_2hop_addr))
397 temp=olsrFindNeighborSet(N,j->N_neighbor_main_addr);
398 if(temp->N_willingness > current->N_willingness)
401 degree=getD(D,current);
403 else if(temp->N_willingness == current->N_willingness)
405 if(getD(D,temp) > degree)
408 degree = getD(D,current);
418 olsrAddtoMPRSet(&mprSet,N,i);
419 fnFlush2HopSetBasedonMPR(&N2,mprSet);
421 olsr->bRoutingTableUpdate=
true;
425 LIST_FREE((
void**)&olsr->mprSet,olsr->mprSet);
431 write_MPR_log(mprSet, olsr->neighborSet, olsr->twoHopNeighborSet);
432 olsrPrintMPR(mprSet);
436 LIST_FREE((
void**)&N,N);
446int fn_NetSim_OLSR_PopulateMPRSelectorSet()
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);
457 if(linkInfo->LinkCode.neighTypes==MPR_NEIGH)
459 OLSR_MPR_SELECTION_SET* set = olsrFindMPRSelectorSet(olsr->mprSelectionSet,header->message->OriginatorAddress);
462 set=MPR_SELECTION_SET_ALLOC();
463 LIST_ADD_LAST((
void**)&olsr->mprSelectionSet,set);
464 set->MS_main_addr = IP_COPY(header->message->OriginatorAddress);
466 set->MS_time = pstruEventDetails->dEventTime + validityTime;
468 linkInfo = linkInfo->next;
473OLSR_NEIGHBOR_SET* olsrFindNeighborSet(OLSR_NEIGHBOR_SET* neighborSet,NETSIM_IPAddress ip)
475 OLSR_NEIGHBOR_SET* set =neighborSet;
478 if(!IP_COMPARE(set->N_neighbor_main_addr,ip))
480 set = (OLSR_NEIGHBOR_SET*)LIST_NEXT(set);
484OLSR_LINK_SET* olsrFindLinkSet(NODE_OLSR* olsr,NETSIM_IPAddress ip)
486 OLSR_LINK_SET* linkSet = olsr->linkSet;
489 if(!IP_COMPARE(linkSet->L_neighbor_iface_addr,ip))
491 linkSet = (OLSR_LINK_SET*)LIST_NEXT(linkSet);
495OLSR_2HOP_NEIGHBOR_SET* olsrFind2HopNeighbor(NODE_OLSR* olsr,NETSIM_IPAddress neighborAddress,NETSIM_IPAddress N_2_Hop_Address)
497 OLSR_2HOP_NEIGHBOR_SET* neighbor = olsr->twoHopNeighborSet;
500 if(!IP_COMPARE(neighbor->N_neighbor_main_addr,neighborAddress) &&
501 !IP_COMPARE(neighbor->N_2hop_addr,N_2_Hop_Address))
503 neighbor=(OLSR_2HOP_NEIGHBOR_SET*)LIST_NEXT(neighbor);
507OLSR_NEIGHBOR_SET* olsrFillNeighbor(NODE_OLSR* olsr)
509 OLSR_NEIGHBOR_SET* ret=NULL;
510 OLSR_NEIGHBOR_SET* neighbor = olsr->neighborSet;
513 if(neighbor->N_willingness != WILL_NEVER)
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);
521 neighbor = (OLSR_NEIGHBOR_SET*)LIST_NEXT(neighbor);
525OLSR_2HOP_NEIGHBOR_SET* olsrFill2HopNeighbor(NODE_OLSR* olsr)
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))
531 OLSR_NEIGHBOR_SET* neighbor = olsrFindNeighborSet(olsr->neighborSet,two_hop_neighbor->N_neighbor_main_addr);
532 if (neighbor->N_willingness != WILL_NEVER)
534 OLSR_NEIGHBOR_SET* neighSet = olsrFindNeighborSet(olsr->neighborSet, two_hop_neighbor->N_2hop_addr);
535 if (neighSet)
continue;
537 OLSR_LINK_SET* link = olsrFindLinkSet(olsr, two_hop_neighbor->N_2hop_addr);
538 if (link && link->L_SYM_time >= pstruEventDetails->dEventTime)
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);
554int olsrAddtoMPRSet(OLSR_MPR_SET** mpr,OLSR_NEIGHBOR_SET* N,OLSR_2HOP_NEIGHBOR_SET* N2)
556 OLSR_NEIGHBOR_SET* i;
557 for(i=N;i;i=(OLSR_NEIGHBOR_SET*)LIST_NEXT(i))
559 if(!IP_COMPARE(i->N_neighbor_main_addr,N2->N_neighbor_main_addr))
561 OLSR_MPR_SET* set=MPRSET_ALLOC();
562 set->neighborAddress=i->N_neighbor_main_addr;
563 LIST_ADD_LAST((
void**)mpr,set);
569int olsrMarkMPR(NODE_OLSR* olsr)
571 OLSR_MPR_SET* mpr = olsr->mprSet;
572 OLSR_NEIGHBOR_SET* neighbor = olsr->neighborSet;
575 OLSR_NEIGHBOR_SET* N=olsrFindNeighborSet(neighbor,mpr->neighborAddress);
577 N->N_status=MPR_NEIGH;
578 mpr=(OLSR_MPR_SET*)LIST_NEXT(mpr);
582OLSR_MPR_SELECTION_SET* olsrFindMPRSelectorSet(OLSR_MPR_SELECTION_SET* set,NETSIM_IPAddress ip)
586 if(!IP_COMPARE(set->MS_main_addr,ip))
588 set=(OLSR_MPR_SELECTION_SET*)LIST_NEXT(set);
592int olsrAddLinktuplesExpiryEvent(OLSR_LINK_SET* link)
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;
603 pevent.nProtocolId=NW_PROTOCOL_OLSR;
605 pevent.nSubEventType=OLSR_LINK_TUPLE_Expire;
607 pevent.szOtherDetails=link;
608 fnpAddEvent(&pevent);
611int olsrPrintMPR(OLSR_MPR_SET* mprSet)
613 printf(
"\nMpr Set of node %d at time %lf--- ",pstruEventDetails->nDeviceId,pstruEventDetails->dEventTime);
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);
621 fprintf(stdout,
"\n");
624int fn_NetSim_OLSR_PacketProcessing()
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)
632 fn_NetSim_Packet_FreePacket(pstruEventDetails->pPacket);
633 pstruEventDetails->pPacket=NULL;
637 if(hdrMessage->TimeToLive == 0)
639 fn_NetSim_Packet_FreePacket(pstruEventDetails->pPacket);
640 pstruEventDetails->pPacket=NULL;
643 if(!IP_COMPARE(hdrMessage->OriginatorAddress,olsr->mainAddress))
645 fn_NetSim_Packet_FreePacket(pstruEventDetails->pPacket);
646 pstruEventDetails->pPacket=NULL;
650 if(olsrExistInDuplicateSet(olsr->duplicateSet,header))
652 fn_NetSim_Packet_FreePacket(pstruEventDetails->pPacket);
653 pstruEventDetails->pPacket=NULL;
656 switch(hdrMessage->MessageType)
659 fn_NetSim_OLSR_ReceiveTC();
660 fn_NetSim_OLSR_UpdateRoutingTable();
663 fnNetSimError(
"Unknown message type %d for OLSR protocol in packet processing function\n",hdrMessage->MessageType);
668bool olsrExistInDuplicateSet(OLSR_DUPLICATE_SET* set,OLSR_HEADER* header)
672 if(!IP_COMPARE(set->D_addr,header->message->OriginatorAddress) &&
673 set->D_seq_num == header->message->MessageSequenceNumber)
675 set=(OLSR_DUPLICATE_SET*)LIST_NEXT(set);
679int fn_NetSim_OLSR_PacketForwarding()
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;
692 neighbor = olsrFindNeighborSet(olsr->neighborSet,packet->pstruNetworkData->szGatewayIP);
693 if(neighbor && neighbor->N_status<SYM_NEIGH)
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)))
705 mpr=olsrFindMPRSelectorSet(olsr->mprSelectionSet,packet->pstruNetworkData->szGatewayIP);
706 if(mpr && header->message->TimeToLive > 1)
712 duplicate->D_time=pstruEventDetails->dEventTime+DUP_HOLD_TIME;
713 duplicate->D_iface_list=IP_COPY(olsr->mainAddress);
715 duplicate->D_retransmitted=
true;
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;
725 duplicate->D_retransmitted=
true;
726 LIST_ADD_LAST((
void**)&olsr->duplicateSet,duplicate);
729 retransmitted=fn_NetSim_Packet_CopyPacket(packet);
732 OLSR_HEADER* reheader=(OLSR_HEADER*)retransmitted->pstruNetworkData->Packet_RoutingProtocol;
733 retransmitted->pstruNetworkData->nTTL--;
734 reheader->message->TimeToLive--;
735 reheader->message->HopCount++;
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);
752OLSR_DUPLICATE_SET* olsrFindDuplicateSet(OLSR_DUPLICATE_SET* duplicate,NETSIM_IPAddress ip,
unsigned short int seq_no)
756 if(!IP_COMPARE(duplicate->D_addr,ip) &&
757 duplicate->D_seq_num == seq_no)
759 duplicate=(OLSR_DUPLICATE_SET*)LIST_NEXT(duplicate);
763int fn_NetSim_OLSR_LinkTupleExpire()
765 NODE_OLSR* olsr=GetOLSRData(pstruEventDetails->nDeviceId);
766 OLSR_LINK_SET* link=(OLSR_LINK_SET*)pstruEventDetails->szOtherDetails;
767 if(link->L_time<=pstruEventDetails->dEventTime)
770 fn_NetSim_OLSR_RemoveNeighbortuple(link);
772 LIST_FREE((
void**)&olsr->linkSet,link);
774 fn_NetSim_OLSR_UpdateRoutingTable();
778 pstruEventDetails->dEventTime=link->L_time;
779 fnpAddEvent(pstruEventDetails);
783int fn_NetSim_OLSR_RemoveNeighbortuple(OLSR_LINK_SET* link)
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;
791 if(!IP_COMPARE(linkset->L_neighbor_iface_addr,link->L_neighbor_iface_addr))
793 linkset=(OLSR_LINK_SET*)LIST_NEXT(linkset);
799 if(!IP_COMPARE(link->L_neighbor_iface_addr,neighbor->N_neighbor_main_addr))
801 fn_NetSim_OLSR_Remove2HopTuple(olsr,neighbor);
802 LIST_FREE((
void**)&olsr->neighborSet,neighbor);
803 neighbor=olsr->neighborSet;
804 olsr->bRoutingTableUpdate=
true;
807 neighbor=(OLSR_NEIGHBOR_SET*)LIST_NEXT(neighbor);
812int fn_NetSim_OLSR_Remove2HopTuple(NODE_OLSR* olsr,OLSR_NEIGHBOR_SET* neighbor)
814 OLSR_2HOP_NEIGHBOR_SET* two_hop_neighbor=olsr->twoHopNeighborSet;
815 while(two_hop_neighbor)
817 if(!IP_COMPARE(two_hop_neighbor->N_neighbor_main_addr,neighbor->N_neighbor_main_addr))
819 LIST_FREE(&olsr->twoHopNeighborSet,two_hop_neighbor);
820 two_hop_neighbor=olsr->twoHopNeighborSet;
823 two_hop_neighbor=(OLSR_2HOP_NEIGHBOR_SET*)LIST_NEXT(two_hop_neighbor);
828int fn_NetSim_OLSR_2HopTupleExpire()
830 NODE_OLSR* olsr=GetOLSRData(pstruEventDetails->nDeviceId);
831 OLSR_2HOP_NEIGHBOR_SET* neighbor=pstruEventDetails->szOtherDetails;
832 if(neighbor->N_time<=pstruEventDetails->dEventTime)
835 LIST_FREE(&olsr->twoHopNeighborSet,neighbor);
836 olsr->bRoutingTableUpdate=
true;
838 fn_NetSim_OLSR_UpdateRoutingTable();
842 pstruEventDetails->dEventTime=neighbor->N_time;
843 fnpAddEvent(pstruEventDetails);
848void write_MPR_log(OLSR_MPR_SET* mprSet, OLSR_NEIGHBOR_SET* neighborset,
849OLSR_2HOP_NEIGHBOR_SET* twohopneighborset)
852 NETSIM_ID nInterface;
853 if (fpRMlog == NULL)
return;
854 fprintf(fpRMlog,
"%.2lf,%s,%d,", pstruEventDetails->dEventTime / MILLISECOND, DEVICE_NAME(pstruEventDetails->nDeviceId), pstruEventDetails->nDeviceId);
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);
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);
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);
879 fprintf(fpRMlog,
"\n");
880 if (nDbgFlag) fflush(fpRMlog);