NetSim Source Code Help v14.4
All 13 Components
 
Loading...
Searching...
No Matches
OLSR.h
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
15
16/************************************************************************************
17http://tools.ietf.org/html/rfc3626
18************************************************************************************/
19#pragma once
20#include "List.h"
21#include "../IP/IP.h"
22#ifndef _NETSIM_OSLR_H_
23#define _NETSIM_OSLR_H_
24#ifdef __cplusplus
25extern "C" {
26#endif
27
28#define NW_PROTOCOL_NDP NW_PROTOCOL_OLSR
29
30//Config parameter
31#define OLSR_HELLO_INTERVAL_DEFAULT 2 //Second
32#define OLSR_REFERESH_INTERVAL_DEFAULT 2 //Second
33#define OLSR_TC_INTERVAL_DEFAULT 5 //Second
34#define OLSR_ZONE_RADIUS_DEFAULT INFINITE
35
36//Constant
37#define TC_REDUNDANCY 0
38#define MPR_COVERAGE 1
39#define MAXJITTER OLSR_HELLO_INTERVAL_DEFAULT/4.0*SECOND
40
41//Holding Time
42#define NEIGHB_HOLD_TIME OLSR_REFERESH_INTERVAL_DEFAULT*3*SECOND
43#define TOP_HOLD_TIME OLSR_TC_INTERVAL_DEFAULT*3*SECOND
44#define DUP_HOLD_TIME 30*SECOND
45
46//Packet Size
47#define OLSR_HEADER_SIZE 4 //Bytes
48#define MESSAGE_HEADER_SIZE 12 //Bytes
49#define HELLO_MESSAGE_SIZE 4 //Bytes
50#define HELLO_LINK_SIZE 8 //Bytes
51#define TC_MESSAGE_SIZE_FIXED 4 //Bytes
52
53//TTL
54#define TC_MESSAGE_TTL 255
55#define HELLO_MESSAGE_TTL 1
56
57//Scale factor. For converting in format of Exponent and mantissa
58#define SCALE_FACTOR 0.0625
59
60//Sequence Number. Section 19 RFC 3626
61#define MAXVALUE_SEQUENCE_NUMBER 0xFFFF
62#define SEQUENCE_NUMBER_GREATER_THAN(s1,s2) (((s1>s2) && ((s1-s2)<=(MAXVALUE_SEQUENCE_NUMBER/2))) || ((s2>s1) && ((s2-s1)>(MAXVALUE_SEQUENCE_NUMBER/2))))
63
64//Struct typedef's
65 typedef struct stru_Node_OLSR NODE_OLSR;
66 typedef struct stru_NetSim_OLSR_Header OLSR_HEADER;
67 typedef struct stru_OLSR_HelloPacket OLSR_HELLO_PACKET;
68 typedef struct stru_OLSR_NeighborTuples OLSR_NEIGHBOR_SET;
69 typedef struct stru_OLSR_2HopTuples OLSR_2HOP_NEIGHBOR_SET;
70 typedef struct stru_OLSR_MPRSet OLSR_MPR_SET;
71 typedef struct stru_OLSR_MPR_Selection_Tuples OLSR_MPR_SELECTION_SET;
72 typedef struct stru_OLSR_TopologyTuple OLSR_TOPOLOGY_INFORMATION_BASE;
73 typedef struct stru_Message OLSR_HEADER_MESSAGE;
74 typedef struct stru_Link OLSR_HELLO_LINK;
75 typedef struct stru_OLSR_LinkTuples OLSR_LINK_SET;
76 typedef struct stru_OLSR_TC_Message OLSR_TC_MESSAGE;
77 typedef struct stru_OLSR_DuplicateTuples OLSR_DUPLICATE_SET;
78
79
80/*
8118.4. Message Types
82
83 HELLO_MESSAGE = 1
84
85 TC_MESSAGE = 2
86
87 MID_MESSAGE = 3
88
89 HNA_MESSAGE = 4
90*/
91 typedef enum
92 {
93 HELLO_MESSAGE =1,
94 TC_MESSAGE =2,
95 MID_MESSAGE =3,
96 HNA_MESSAGE =4,
97 }MESSAGE_TYPE;
98
99#define OLSR_CONTROL_PACKET(x) NW_PROTOCOL_OLSR*100+x
100
101/*
102
10318.8. Willingness
104
105 WILL_NEVER = 0
106
107 WILL_LOW = 1
108
109 WILL_DEFAULT = 3
110
111 WILL_HIGH = 6
112
113 WILL_ALWAYS = 7
114*/
115 typedef enum
116 {
117 WILL_NEVER = 0,
118 WILL_LOW = 1,
119 WILL_DEFAULT = 3,
120 WILL_HIGH = 6,
121 WILL_ALWAYS = 7,
122 }WILLINGNESS;
123
124/*
12518.5. Link Types
126
127 UNSPEC_LINK = 0
128
129 ASYM_LINK = 1
130
131 SYM_LINK = 2
132
133 LOST_LINK = 3
134*/
135 typedef enum
136 {
137 UNSPEC_LINK = 0,
138 ASYM_LINK = 1,
139 SYM_LINK = 2,
140 LOST_LINK = 3,
141 }OLSR_LINK_TYPE;
142
143/*
14418.6. Neighbor Types
145
146 NOT_NEIGH = 0
147
148 SYM_NEIGH = 1
149
150 MPR_NEIGH = 2
151*/
152 typedef enum
153 {
154 NOT_NEIGH=0,
155 NOT_SYM=0,
156 SYM_NEIGH=1,
157 SYM=1,
158 MPR_NEIGH=2,
159 }OLSR_NEIGHBOR_TYPES;
160/*
161Clausen & Jacquet Experimental [Page 13]
162
163RFC 3626 Optimized Link State Routing October 2003
164
165
1663.3. Packet Format
167
168 The basic layout of any packet in OLSR is as follows (omitting IP and
169 UDP headers):
170
171 0 1 2 3
172 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
173 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
174 | Packet Length | Packet Sequence Number |
175 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
176 | Message Type | Vtime | Message Size |
177 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
178 | Originator Address |
179 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
180 | Time To Live | Hop Count | Message Sequence Number |
181 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
182 | |
183 : MESSAGE :
184 | |
185*/
187 {
188 MESSAGE_TYPE MessageType;
189 unsigned char Vtime;
190 unsigned short int MessageSize;
191 NETSIM_IPAddress OriginatorAddress;
192 unsigned int TimeToLive:8;
193 unsigned int HopCount:8;
194 unsigned short int MessageSequenceNumber;
195 void* MESSAGE;
196 struct stru_Message* next;
197 };
199 {
200 unsigned short int PacketLength;
201 unsigned short int PacketSequenceNumber;
202 OLSR_HEADER_MESSAGE* message;
203 };
204
205
206/*
207Clausen & Jacquet Experimental [Page 27]
208
209RFC 3626 Optimized Link State Routing October 2003
210
211
212 0 1 2 3
213 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
214
215 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
216 | Reserved | Htime | Willingness |
217 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
218 | Link Code | Reserved | Link Message Size |
219 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
220 | Neighbor Interface Address |
221 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
222 | Neighbor Interface Address |
223 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
224 : . . . :
225 : :
226 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
227 | Link Code | Reserved | Link Message Size |
228 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
229 | Neighbor Interface Address |
230 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
231 | Neighbor Interface Address |
232 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
233 : :
234 : :
235 (etc.)
236*/
238 {
239/*
2406.1.1. Link Code as Link Type and Neighbor Type
241 7 6 5 4 3 2 1 0
242 +-------+-------+-------+-------+-------+-------+-------+-------+
243 | 0 | 0 | 0 | 0 | Neighbor Type | Link Type |
244 +-------+-------+-------+-------+-------+-------+-------+-------+
245*/
247 {
248 OLSR_LINK_TYPE linkType;
249 OLSR_NEIGHBOR_TYPES neighTypes;
250 }LinkCode;
251 unsigned int Reserved:8;
252 unsigned short int LinkMessageSize;
253 NETSIM_IPAddress NeighborInterfaceAddress;
254 struct stru_Link* next;
255 };
257 {
258 unsigned short int Reserved;
259 unsigned char HTime;
260 WILLINGNESS Willingness;
261 OLSR_HELLO_LINK* link;
262 };
263
264/*
2659.1. TC Message Format
266
267 The proposed format of a TC message is as follows:
268
269 0 1 2 3
270 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
271 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
272 | ANSN | Reserved |
273 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
274 | Advertised Neighbor Main Address |
275 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
276 | Advertised Neighbor Main Address |
277 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
278 | ... |
279 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
280*/
282 {
283 unsigned short int ANSN;
284 unsigned short int Reserved;
285 unsigned short int AdvertisedNeighborCount;
286 NETSIM_IPAddress* AdvertisedNeighborMainAddress;
287 };
288
290 {
291 NETSIM_IPAddress N_neighbor_main_addr;
292 OLSR_NEIGHBOR_TYPES N_status;
293 WILLINGNESS N_willingness;
294 _ele* ele;
295 };
296#define NEIGHBOR_TUPLES_ALLOC() (struct stru_OLSR_NeighborTuples*)list_alloc(sizeof(struct stru_OLSR_NeighborTuples),offsetof(struct stru_OLSR_NeighborTuples,ele))
297
299 {
300 NETSIM_IPAddress N_neighbor_main_addr;
301 NETSIM_IPAddress N_2hop_addr;
302 double N_time;
303 _ele* ele;
304 };
305#define OLSR_2HOPTUPLES_ALLOC() (struct stru_OLSR_2HopTuples*)list_alloc(sizeof(struct stru_OLSR_2HopTuples),offsetof(struct stru_OLSR_2HopTuples,ele))
306
308 {
309 NETSIM_IPAddress neighborAddress;
310 _ele* ele;
311 };
312#define MPRSET_ALLOC() (struct stru_OLSR_MPRSet*)list_alloc(sizeof(struct stru_OLSR_MPRSet),offsetof(struct stru_OLSR_MPRSet,ele))
313
315 {
316 NETSIM_IPAddress MS_main_addr;
317 double MS_time;
318 _ele* ele;
319 };
320#define MPR_SELECTION_SET_ALLOC() (struct stru_OLSR_MPR_Selection_Tuples*)list_alloc(sizeof(struct stru_OLSR_MPR_Selection_Tuples),offsetof(struct stru_OLSR_MPR_Selection_Tuples,ele))
321
323 {
324 NETSIM_IPAddress T_dest_addr;
325 NETSIM_IPAddress T_last_addr;
326 unsigned int T_seq;
327 double T_time;
328 _ele* ele;
329 };
330#define TOPOLOGY_INFO_BASE_ALLOC() (struct stru_OLSR_TopologyTuple*)list_alloc(sizeof(struct stru_OLSR_TopologyTuple),offsetof(struct stru_OLSR_TopologyTuple,ele))
331
333 {
334 NETSIM_IPAddress L_local_iface_addr;
335 NETSIM_IPAddress L_neighbor_iface_addr;
336 double L_SYM_time;
337 double L_ASYM_time;
338 double L_time;
339 _ele* ele;
340 };
341#define LINK_SET_ALLOC() (OLSR_LINK_SET*)list_alloc(sizeof(OLSR_LINK_SET),offsetof(struct stru_OLSR_LinkTuples,ele))
342
343/* Section 3.4
344 a node records a "Duplicate Tuple" (D_addr, D_seq_num, D_retransmitted, D_iface_list,D_time),
345 where D_addr is the originator address of the message,
346 D_seq_num is the message sequence number of the message,
347 D_retransmitted is a boolean indicating whether the message has been
348 already retransmitted, D_iface_list is a list of the addresses of the
349 interfaces on which the message has been received and D_time
350 specifies the time at which a tuple expires and *MUST* be removed
351*/
353 {
354 NETSIM_IPAddress D_addr;
355 unsigned short int D_seq_num;
356 bool D_retransmitted;
357 NETSIM_IPAddress D_iface_list;
358 double D_time;
359 _ele* ele;
360 };
361#define DUPLICATE_SET_ALLOC() (OLSR_DUPLICATE_SET*)list_alloc(sizeof(OLSR_DUPLICATE_SET),offsetof(struct stru_OLSR_DuplicateTuples,ele))
362
364 {
365 //Config parameter
366 double dHelloInterval;
367 double dRefereshInterval;
368 double dTCInterval;
369 unsigned int nZoneRadius;
370
371 WILLINGNESS willingness;
372 NETSIM_IPAddress mainAddress;
373
374 //Neighbor table
375 OLSR_NEIGHBOR_SET* neighborSet;
376 OLSR_2HOP_NEIGHBOR_SET* twoHopNeighborSet;
377 OLSR_MPR_SET* mprSet;
378 OLSR_MPR_SELECTION_SET* mprSelectionSet;
379 OLSR_TOPOLOGY_INFORMATION_BASE* topologyInfoBase;
380 OLSR_LINK_SET* linkSet;
381
382 //Sequence number
383 unsigned short int nPacketSequenceNumber;
384 unsigned short int nMessageSequenceNumber;
385 unsigned short int ANSN;
386
387 //Duplicate Set
388 OLSR_DUPLICATE_SET* duplicateSet;
389
390 //Routing table update flag
391 bool bRoutingTableUpdate;
392 ptrIP_WRAPPER ipWrapper;
393 bool bTCUpdateFlag;
394 };
395
396 //Function prototype
397 unsigned char olsrConvertDoubleToME(double val); //Sec 18.3
398 double olsrConvertMEToDouble(unsigned char val); //Sec 18.3
399 NODE_OLSR* GetOLSRData(NETSIM_ID nDeviceId);
400 OLSR_LINK_SET* olsrFindLinkSet(NODE_OLSR* olsr,NETSIM_IPAddress ip);
401 int fn_NetSim_NDP_ScheduleHelloTransmission(NETSIM_ID nNodeId,double dEventTime);
402 OLSR_NEIGHBOR_SET* olsrFindNeighborSet(OLSR_NEIGHBOR_SET* neighborSet,NETSIM_IPAddress ip);
403 OLSR_HELLO_LINK* olsrFinkLinkInfoFromHello(OLSR_HELLO_LINK* link,NETSIM_IPAddress ip);
404 OLSR_2HOP_NEIGHBOR_SET* olsrFind2HopNeighbor(NODE_OLSR* olsr,NETSIM_IPAddress neighborAddress,NETSIM_IPAddress N_2_Hop_Address);
405 OLSR_2HOP_NEIGHBOR_SET* olsrFill2HopNeighbor(NODE_OLSR* olsr);
406 OLSR_NEIGHBOR_SET* olsrFillNeighbor(NODE_OLSR* olsr);
407 int olsrAddtoMPRSet(OLSR_MPR_SET** mpr,OLSR_NEIGHBOR_SET* N,OLSR_2HOP_NEIGHBOR_SET* N2);
408 int fn_NetSim_OLSR_PopulateLinkSet();
409 int fn_NetSim_NDP_CopyHelloMessage(OLSR_HEADER_MESSAGE* dest,OLSR_HEADER_MESSAGE* src);
410 unsigned short int fn_NetSim_Fill_Link_To_Hello(NODE_OLSR* olsr,OLSR_HELLO_PACKET* hello,double dCurrentTime);
411 int fn_NetSim_OLSR_Populate2HopNeighbor();
412 int fn_NetSim_OLSR_PopulateMPRSet();
413 int fn_NetSim_NDP_FreeHelloMessage(OLSR_HEADER_MESSAGE* message);
414 int fn_NetSim_NDP_Init();
415 int fn_NetSim_NDP_ReceiveHello();
416 int fn_NetSim_OLSR_PopulateNeighborSet();
417 int fn_NetSim_NDP_TransmitHello();
418 int fn_NetSim_OLSR_Configure_F(void** var,void** data);
419 int fn_NetSim_OLSR_CopyOLSRHeader(const NetSim_PACKET* destPacket,const NetSim_PACKET* srcPacket);
420 int fn_NetSim_OLSR_FreeOLSRHeader(NetSim_PACKET* packet);
421 int fn_NetSim_OLSR_Init();
422 OLSR_MPR_SELECTION_SET* olsrFindMPRSelectorSet(OLSR_MPR_SELECTION_SET* set,NETSIM_IPAddress ip);
423 OLSR_DUPLICATE_SET* olsrFindDuplicateSet(OLSR_DUPLICATE_SET* duplicate,NETSIM_IPAddress ip,unsigned short int seq_no);
424 int fn_NetSim_OLSR_CopyTCMessage(OLSR_HEADER_MESSAGE* dest,OLSR_HEADER_MESSAGE* src);
425 int fn_NetSim_OLSR_Finish_F();
426 int fn_NetSim_OLSR_FreeTCMessage(OLSR_HEADER_MESSAGE* message);
427 int fn_NetSim_OLSR_LinkTupleExpire();
428 int fn_NetSim_OLSR_UpdateRoutingTable();
429 int fn_NetSim_OLSR_PacketForwarding();
430 int fn_NetSim_OLSR_PacketProcessing();
431 int fn_NetSim_OLSR_PopulateMPRSelectorSet();
432 int fn_NetSim_OLSR_ReceiveTC();
433 int fn_NetSim_OLSR_Remove2HopTuple(NODE_OLSR* olsr,OLSR_NEIGHBOR_SET* neighbor);
434 int fn_NetSim_OLSR_RemoveNeighbortuple(OLSR_LINK_SET* link);
435 int fn_NetSim_OLSR_ScheduleTCTransmission(NETSIM_ID nNodeId,double dTime);
436 int fn_NetSim_OLSR_TransmitTCMessage();
437 int olsrAddLinktuplesExpiryEvent(OLSR_LINK_SET* link);
438 bool olsrExistInDuplicateSet(OLSR_DUPLICATE_SET* set,OLSR_HEADER* header);
439 int olsrFlushroutingTable(ptrIP_WRAPPER wrapper,NETSIM_ID nNodeId);
440 int olsrMarkMPR(NODE_OLSR* olsr);
441 int olsrPrintMPR(OLSR_MPR_SET* mprSet);
442 int olsrUpdateIptable(ptrIP_ROUTINGTABLE table,NETSIM_ID nNodeId);
443 int olsrUpdateTopologySet(NODE_OLSR* olsr,OLSR_TOPOLOGY_INFORMATION_BASE** topology,OLSR_HEADER_MESSAGE* message);
444 bool olsrValidateTopologyInfoOnCondition2(OLSR_TOPOLOGY_INFORMATION_BASE* topology,NETSIM_IPAddress originator,unsigned short int ANSN);
445
446#ifdef __cplusplus
447}
448#endif
449#endif