NetSim Source Code Help v14.4
All 13 Components
 
Loading...
Searching...
No Matches
NDP.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#define HELLO_MESSAGE_HOP_COUNT 1
19
20
21int fn_NetSim_NDP_Init()
22{
23 NETSIM_ID i;
24 for(i=0;i<NETWORK->nDeviceCount;i++)
25 {
26 NODE_OLSR* olsr=GetOLSRData(i+1);
27 if(!olsr)
28 continue;
29 fn_NetSim_NDP_ScheduleHelloTransmission(i+1,0);
30 pstruEventDetails->dEventTime = 0;
31 fn_NetSim_NDP_TransmitHello();
32 }
33 return 0;
34}
35
36int fn_NetSim_NDP_ScheduleHelloTransmission(NETSIM_ID nNodeId,double dEventTime)
37{
38 NODE_OLSR* olsr=GetOLSRData(nNodeId);
39 double jitter;
40 if(!olsr)
41 {
42 fnNetSimError("OLSR protocol is not configured for %d node\n",nNodeId);
43 return -1;
44 }
45 //Generate random time between 0 to MAXJITTER
46 jitter = (int)((fn_NetSim_Utilities_GenerateRandomNo(&NETWORK->ppstruDeviceList[nNodeId-1]->ulSeed[0],
47 &NETWORK->ppstruDeviceList[nNodeId-1]->ulSeed[1])/NETSIM_RAND_MAX)*MAXJITTER);
48
49 //Add Timer event to transmit hello packet
50 pstruEventDetails->dEventTime=dEventTime+olsr->dHelloInterval-jitter;
51 pstruEventDetails->dPacketSize=0;
52 pstruEventDetails->nApplicationId=0;
53 pstruEventDetails->nDeviceId=nNodeId;
54 pstruEventDetails->nDeviceType=DEVICE_TYPE(nNodeId);
55 pstruEventDetails->nEventType=TIMER_EVENT;
56 pstruEventDetails->nInterfaceId=0;
57 pstruEventDetails->nPacketId=0;
58 pstruEventDetails->pPacket = NULL;
59 pstruEventDetails->nProtocolId=NW_PROTOCOL_NDP;
60 pstruEventDetails->nSegmentId=0;
61 pstruEventDetails->nSubEventType=NDP_ScheduleHelloTransmission;
62 fnpAddEvent(pstruEventDetails);
63 return 0;
64}
65int fn_NetSim_NDP_TransmitHello()
66{
67 unsigned short int linkCount;
68 NODE_OLSR* olsr=GetOLSRData(pstruEventDetails->nDeviceId);
69 NetSim_PACKET* packet;
70 OLSR_HEADER* header=(OLSR_HEADER*)calloc(1,sizeof* header);
71 OLSR_HELLO_PACKET* hello=(OLSR_HELLO_PACKET*)calloc(1,sizeof* hello);
72
73 //Fill Hello information
74 hello->HTime = olsrConvertDoubleToME(olsr->dHelloInterval);
75 hello->Willingness = WILL_DEFAULT;
76 //Fill neighbor set
77 linkCount=fn_NetSim_Fill_Link_To_Hello(olsr,hello,pstruEventDetails->dEventTime);
78
79 //Fill header information
80 header->message = (OLSR_HEADER_MESSAGE*)calloc(1,sizeof* header->message);
81 header->message->HopCount=HELLO_MESSAGE_HOP_COUNT;
82 header->message->MESSAGE=hello;
83 header->message->MessageSequenceNumber=++olsr->nMessageSequenceNumber;
84 header->message->MessageType = HELLO_MESSAGE;
85 header->message->OriginatorAddress = IP_COPY(DEVICE_NWADDRESS(pstruEventDetails->nDeviceId,1));
86 header->message->TimeToLive = HELLO_MESSAGE_TTL;
87 header->message->Vtime = olsrConvertDoubleToME(NEIGHB_HOLD_TIME);
88 header->message->MessageSize = HELLO_LINK_SIZE*linkCount+HELLO_MESSAGE_SIZE+MESSAGE_HEADER_SIZE;
89
90 header->PacketLength = header->message->MessageSize+OLSR_HEADER_SIZE;
91 header->PacketSequenceNumber = ++olsr->nPacketSequenceNumber;
92
93 //Create Packet
94 packet=fn_NetSim_ZRP_GeneratePacket(pstruEventDetails->dEventTime,
95 OLSR_CONTROL_PACKET(HELLO_MESSAGE),
96 NW_PROTOCOL_OLSR,
97 pstruEventDetails->nDeviceId,
98 0,
99 header->PacketLength);
100
101 packet->pstruNetworkData->Packet_RoutingProtocol=header;
102
103 packet->pstruNetworkData->szNextHopIp = NULL;
104 packet->pstruNetworkData->nTTL = HELLO_MESSAGE_TTL;
105 //Add network out event
106 pstruEventDetails->dPacketSize = header->PacketLength;
107 pstruEventDetails->nApplicationId = 0;
108 pstruEventDetails->nEventType = NETWORK_OUT_EVENT;
109 pstruEventDetails->nInterfaceId = 0;
110 pstruEventDetails->nPacketId = 0;
111 pstruEventDetails->nProtocolId = NW_PROTOCOL_IPV4;
112 pstruEventDetails->nSegmentId = 0;
113 pstruEventDetails->nSubEventType = 0;
114 pstruEventDetails->pPacket = packet;
115 fnpAddEvent(pstruEventDetails);
116 return 0;
117}
118int fn_NetSim_NDP_ReceiveHello()
119{
120 fn_NetSim_OLSR_PopulateLinkSet();
121 fn_NetSim_OLSR_PopulateNeighborSet();
122 fn_NetSim_OLSR_Populate2HopNeighbor();
123 fn_NetSim_OLSR_PopulateMPRSet();
124 fn_NetSim_OLSR_PopulateMPRSelectorSet();
125 fn_NetSim_OLSR_UpdateRoutingTable();
126 fn_NetSim_Packet_FreePacket(pstruEventDetails->pPacket);
127 pstruEventDetails->pPacket = NULL;
128 return 0;
129}
130
131unsigned short int fn_NetSim_Fill_Link_To_Hello(NODE_OLSR* olsr,OLSR_HELLO_PACKET* hello,double dCurrentTime)
132{
133 unsigned short int count=0;
134 OLSR_NEIGHBOR_SET* neighbor;
135 OLSR_HELLO_LINK* h_link,*temp=NULL;
136 OLSR_LINK_SET* linkSet=olsr->linkSet;
137
138 while(linkSet)
139 {
140 if(!IP_COMPARE(linkSet->L_local_iface_addr,olsr->mainAddress))
141 {
142 h_link=(OLSR_HELLO_LINK*)calloc(1,sizeof* h_link);
143 if(linkSet->L_SYM_time >= dCurrentTime)
144 h_link->LinkCode.linkType=SYM_LINK;
145 else if(linkSet->L_ASYM_time >= dCurrentTime)
146 h_link->LinkCode.linkType = ASYM_LINK;
147 else
148 h_link->LinkCode.linkType = LOST_LINK;
149
150 neighbor=olsrFindNeighborSet(olsr->neighborSet,linkSet->L_neighbor_iface_addr);
151 if(neighbor)
152 {
153 if(neighbor->N_status == MPR_NEIGH)
154 h_link->LinkCode.neighTypes=MPR_NEIGH;
155 else if(neighbor->N_status == SYM_NEIGH)
156 h_link->LinkCode.neighTypes = SYM_NEIGH;
157 else
158 h_link->LinkCode.neighTypes = NOT_NEIGH;
159 }
160 h_link->LinkMessageSize=HELLO_LINK_SIZE;
161 h_link->NeighborInterfaceAddress=IP_COPY(linkSet->L_neighbor_iface_addr);
162 if(!hello->link)
163 hello->link=h_link;
164 else
165 temp->next=h_link;
166 temp=h_link;
167 count++;
168 }
169 linkSet=(OLSR_LINK_SET*)LIST_NEXT(linkSet);
170 }
171 neighbor = olsr->neighborSet;
172 while(neighbor)
173 {
174 h_link = olsrFinkLinkInfoFromHello(hello->link,neighbor->N_neighbor_main_addr);
175 if(!h_link)
176 {
177 h_link = (OLSR_HELLO_LINK*)calloc(1,sizeof* h_link);
178 h_link->LinkCode.linkType=UNSPEC_LINK;
179 if(neighbor->N_status == MPR_NEIGH)
180 h_link->LinkCode.neighTypes=MPR_NEIGH;
181 else if(neighbor->N_status == SYM_NEIGH)
182 h_link->LinkCode.neighTypes = SYM_NEIGH;
183 else
184 h_link->LinkCode.neighTypes = NOT_NEIGH;
185
186 h_link->LinkMessageSize=HELLO_LINK_SIZE;
187 h_link->NeighborInterfaceAddress=IP_COPY(neighbor->N_neighbor_main_addr);
188 if(!hello->link)
189 hello->link=h_link;
190 else
191 temp->next=h_link;
192 temp=h_link;
193 count++;
194 }
195 neighbor=(OLSR_NEIGHBOR_SET*)LIST_NEXT(neighbor);
196 }
197 return count;
198}
199
200OLSR_HELLO_LINK* olsrFinkLinkInfoFromHello(OLSR_HELLO_LINK* link,NETSIM_IPAddress ip)
201{
202 while(link)
203 {
204 if(!IP_COMPARE(link->NeighborInterfaceAddress,ip))
205 return link;
206 link=link->next;
207 }
208 return NULL;
209}
210
211int fn_NetSim_NDP_FreeHelloMessage(OLSR_HEADER_MESSAGE* message)
212{
213 OLSR_HELLO_PACKET* hello=(OLSR_HELLO_PACKET*)message->MESSAGE;
214 OLSR_HELLO_LINK* link=hello->link;
215 while(link)
216 {
217 hello->link = link->next;
218 IP_FREE(link->NeighborInterfaceAddress);
219 free(link);
220 link=hello->link;
221 }
222 free(hello);
223 return 0;
224}
225int fn_NetSim_NDP_CopyHelloMessage(OLSR_HEADER_MESSAGE* dest,OLSR_HEADER_MESSAGE* src)
226{
227 OLSR_HELLO_LINK* temp,*temp1,*temp2=NULL;
228 OLSR_HELLO_PACKET* srcHello=(OLSR_HELLO_PACKET*)src->MESSAGE;
229 OLSR_HELLO_PACKET* destHello=(OLSR_HELLO_PACKET*)calloc(1,sizeof* destHello);
230 memcpy(destHello,srcHello,sizeof* destHello);
231 dest->MESSAGE=destHello;
232
233 //Copy link
234 temp=srcHello->link;
235 destHello->link=NULL;
236 while(temp)
237 {
238 temp1=(OLSR_HELLO_LINK*)calloc(1,sizeof* temp1);
239 memcpy(temp1,temp,sizeof* temp1);
240 temp1->NeighborInterfaceAddress = IP_COPY(temp->NeighborInterfaceAddress);
241 if(!destHello->link)
242 destHello->link=temp1;
243 else
244 temp2->next=temp1;
245 temp2=temp1;
246 temp=temp->next;
247 }
248 return 0;
249}