NetSim Source Code Help v14.4
All 13 Components
 
Loading...
Searching...
No Matches
OSPF.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#ifndef _NETSIM_OSPF_H_
16#define _NETSIM_OSPF_H_
17#ifdef __cplusplus
18extern "C" {
19#endif
20
21#pragma comment(lib,"NetworkStack.lib")
22#pragma comment(lib,"Metrics.lib")
23
24#include "OSPF_Typedef.h"
25
26 typedef enum
27 {
28 OSPF_LOG,
29 OSPF_HELLO_LOG,
30 }OSPFLOGFLAG;
31
32//Useful macro
33#define GET_LOWER_IP(ip1,ip2) ((ip1) ? ((ip2) ? ((ip1)->int_ip[0] < (ip2)->int_ip[0] ? (ip1) : (ip2)) : (ip1)) : (ip2));
34#define DEVICE_CURR_IP (DEVICE_NWADDRESS(pstruEventDetails->nDeviceId,pstruEventDetails->nInterfaceId))
35#define DEVICE_CURR_MASK (DEVICE_SUBNETMASK(pstruEventDetails->nDeviceId,pstruEventDetails->nInterfaceId))
36
37#define OSPF_CURR_TIME() (pstruEventDetails->dEventTime)
38
39#define strAllSPFRouters "224.0.0.5"
40#define strAllDRouters "224.0.0.6"
41#define strNULLIP "0.0.0.0"
42#define strInvalidAreaId "255.255.255.254" //0xFFFFFFFE
43#define strSingleAreaId "255.255.255.255" //0xFFFFFFFF
44#define strBackboneAreaId "0.0.0.0" //0x00
45 NETSIM_IPAddress AllSPFRouters;
46 NETSIM_IPAddress AllDRouters;
47 OSPFID NullID;
48 OSPFID invalidAreaId;
49 OSPFID backboneAreaId;
50 OSPFID singleAreaId;
51#define ANY_DEST (GET_BROADCAST_IP(4))
52
53#define OSPF_BROADCAST_JITTER (0*MILLISECOND)
54#define OSPF_DO_NOT_AGE (0x8000)
55#define OSPF_LSA_MAX_AGE_DIFF (15 * MINUTE)
56
57 typedef enum enum_ospf_router_type
58 {
59 OSPFRTYPE_INTERNAL,
60 OSPFRTYPE_ABR,
61 OSPFRTYPE_BACKBONE,
62 OSPFRTYPE_ASBOUNDARY,
63 }OSPFRTYPE;
64
65 typedef enum enum_address_range_status
66 {
67 ADDRRNSTATUS_ADVERTISE,
68 ADDRRNSTATUS_DONOTADVERTISE,
69 }ADDR_RN_STATUS;
70
71 typedef struct stru_address_range
72 {
73 NETSIM_IPAddress address;
74 NETSIM_IPAddress mask;
75 ADDR_RN_STATUS status;
76 }ADDR_RN, *ptrADDR_RN;
77
78 typedef struct stru_area_ds
79 {
80 OSPFID areaId;
81 ptrOSPFLIST addressRangeList;
82 UINT assocInterfaceCount;
83 NETSIM_IPAddress* assocRouterInterface;
84 NETSIM_ID* assocRouterInterfaceId;
85
86 ptrOSPFLIST routerLSAList;
87 ptrOSPFLIST nwLSAList;
88 ptrOSPFLIST routerSummaryLSAList;
89 ptrOSPFLIST nwSummaryLSAList;
90 ptrOSPFLIST maxAgeList;
91 bool extRoutingCapability;
92
93 bool isRouterLSTimer;
94 double lastLSAOriginateTime;
95
96 ptrOSPFLIST shortestPathList;
97 }OSPFAREA_DS,*ptrOSPFAREA_DS;
98 ptrOSPFAREA_DS OSPF_AREA_GET(ptrOSPF_PDS ospf,
99 NETSIM_ID in,
100 OSPFID areaId,
101 NETSIM_IPAddress interfaceIP); //Pass only one
102#define OSPF_AREA_GET_IN(ospf,in) (OSPF_AREA_GET((ospf),(in),NULL,NULL))
103#define OSPF_AREA_GET_ID(ospf,id) (OSPF_AREA_GET((ospf),0,(id),NULL))
104#define OSPF_AREA_GET_IP(ospf,ip) (OSPF_AREA_GET((ospf),0,NULL,(ip)))
105 void OSPF_AREA_SET(ptrOSPF_PDS ospf,
106 ptrOSPFAREA_DS area);
107
109 {
110 NETSIM_ID myId;
111 OSPFID routerId;
112 OSPFRTYPE routerType;
113 UINT areaCount;
114 UINT ifCount;
115 ptrOSPF_IF* ospfIf;
116 ptrOSPFAREA_DS* areaDS;
117 double minLSInterval;
118 bool supportDC;
119 double dFloodTimer;
120 bool isAdvertSelfIntf;
121
122 UINT16 LSAMaxAge;
123 bool isMaxAgeRemovalTimerSet;
124 double maxAgeRemovalTime;
125
126 double LSRefreshTime;
127
128 double SPFTimer;
129 double spfCalcDelay;
130 ptrOSPFROUTINGTABLE routingTable;
131 UINT ipTableCount;
132 void** ipTable;
133
134 bool isPartitionedIntoArea;
135
136 // Enabling this might reduce some duplicate LSA transmission in a network.
137 // When enable this, a node wait for time [0, OSPFv2_FLOOD_TIMER] before
138 // sending Update in response to a Request. Thus at synchronization time
139 // a node send less number of Update packet in response to several duplicate
140 // Request from different node in the network. This intern also reduce
141 // number of Ack packet transmitted in the network.
142 bool isSendDelayedUpdate;
143
144 double incrementTime;
145 };
146#define OSPF_PDS_SET(d,ospf) (fn_NetSim_Stack_SetAppProtocolData(d,APP_PROTOCOL_OSPF,ospf))
147#define OSPF_PDS_GET(d) ((ptrOSPF_PDS)(DEVICE_APPVAR(d,APP_PROTOCOL_OSPF)))
148#define OSPF_PDS_CURRENT() (OSPF_PDS_GET(pstruEventDetails->nDeviceId))
149
151 {
152 LSTYPE lsType;
153 ptrOSPFAREA_DS area;
154 bool isFlush;
155
156 ptrOSPF_NEIGHBOR neigh; // For RLSA
157 UINT nwLSASeqNum; // For NWLSA
158 //For summary LSA
159 NETSIM_IPAddress destAddr;
160 NETSIM_IPAddress destMask;
161 OSPFDESTTYPE destType;
162 }EVENTLSDB, *ptrEVENTLSDB;
163
164 //Function prototype
165 //Hello
166 void ospf_process_hello();
167 void ospf_handle_helloTimer_event();
168 void start_interval_hello_timer();
169
170 //DD
171 void start_sending_dd_msg();
172 void ospf_handle_DD();
173
174 //OSPF Interface
175 ptrOSPF_IF OSPF_IF_GET(ptrOSPF_PDS ospf, NETSIM_ID ifId);
176#define OSPF_IF_CURRENT() (OSPF_IF_GET(OSPF_PDS_CURRENT(), pstruEventDetails->nInterfaceId))
177 void ospf_handle_interfaceUp_event();
178 void ospf_handle_interfaceDown_event();
179 void ospf_interface_handleMultipleInterfaceEvent();
180
181 //OSPF Neighbor
182 ptrOSPF_NEIGHBOR OSPF_NEIGHBOR_FIND(ptrOSPF_IF ospf, OSPFID id);
183 ptrOSPF_NEIGHBOR OSPF_NEIGHBOR_FIND_BY_IP(ptrOSPF_IF thisInterface, NETSIM_IPAddress ip);
184 bool ospf_is_router_fullAdjacentWithDR(ptrOSPF_IF ospf);
185 bool ospf_is_dr_router_fulladjacentwithAnother(ptrOSPF_IF ospf);
186 void ospf_neighbor_insertToSendList(ptrOSPFLIST list,
187 ptrOSPFLSAHDR lsa,
188 double time);
189 ptrOSPFLSAHDR ospf_neighbor_searchSendList(ptrOSPFLIST list,
190 ptrOSPFLSAHDR lsa);
191 bool ospf_neighbor_isAnyNeighborInExchangeOrLoadingState(ptrOSPF_PDS ospf);
192 NETSIM_ID ospf_neighbor_getInterfaceIdforThisNeighbor(ptrOSPF_PDS ospf,
193 NETSIM_IPAddress neighIPaddr);
194 ptrOSPF_NEIGHBOR ospf_neighbor_new(NETSIM_IPAddress ip,
195 OSPFID rid);
196 void ospf_neighbor_add(ptrOSPF_IF ospf, ptrOSPF_NEIGHBOR neigh);
197
198 // OSPF Neighbor event handler
199 void ospf_neighbor_handle_helloReceived_event();
200 void ospf_neighbor_handle_1way_event();
201 void ospf_neighbor_handle_2wayReceived_event();
202 void ospf_neighbor_handle_negotiationDone_event();
203 void ospf_neighbor_handle_exchangeDone_event();
204 void ospf_neighbor_handle_start_event();
205 void ospf_neighbor_handle_inactivityTimer_event();
206 void ospf_neighbor_handle_LoadingDoneEvent();
207 void ospf_neighbor_handle_KillNbrEvent();
208
209 //OSPF Area
210 void ospf_area_init(NETSIM_ID d, NETSIM_ID in);
211 void ospf_area_handleABRTask(ptrOSPF_PDS ospf);
212
213 // LSA Header
214 void ospf_lsahdr_add_lsa(ptrOSPFLSAHDR lhdr,
215 void* lsa,
216 UINT16 len);
217 bool ospf_lsa_update_lsahdr(ptrOSPF_PDS ospf,
218 ptrOSPFAREA_DS area,
219 ptrOSPFLSAHDR lsa,
220 ptrOSPFLSAHDR old,
221 LSTYPE lstype);
222
223 //LSA
224 void ospf_lsa_print(char* logid,
225 ptrOSPFLSAHDR LSHeader,
226 char* msg);
227 void ospf_lsa_printList(char* logid,
228 ptrOSPFLIST list,
229 char* name);
230 void ospf_lsa_schedule_routerLSA(ptrOSPF_PDS ospf,
231 ptrOSPFAREA_DS area,
232 bool isFlush);
233 void ospf_lsa_scheduleNWLSA(ptrOSPF_PDS ospf,
234 ptrOSPF_IF thisInterface,
235 ptrOSPFAREA_DS area,
236 bool isFlush);
237 void ospf_lsa_scheduleSummaryLSA(ptrOSPF_PDS ospf,
238 ptrOSPF_IF thisInterface,
239 ptrOSPFAREA_DS area,
240 NETSIM_IPAddress destAddr,
241 NETSIM_IPAddress destMask,
242 OSPFDESTTYPE destType,
243 bool isFlush);
244 void ospf_lsa_schedule(ptrOSPF_PDS ospf,
245 ptrOSPF_IF thisInterface,
246 ptrOSPFAREA_DS area,
247 ptrOSPFLSAHDR lsa);
248 void ospf_lsa_ScheduleLSDB();
249 void ospf_lsa_handle_floodTimer_event();
250 UINT16 ospf_lsa_maskDoNotAge(ptrOSPF_PDS ospf,
251 UINT16 routerLSAAge);
252 void ospf_lsa_assignNewLSAge(ptrOSPF_PDS ospf,
253 UINT16* routerLSAAge,
254 UINT16 newLSAAge);
255 int ospf_lsa_compare(ptrOSPF_PDS ospf,
256 ptrOSPFLSAHDR oldLS,
257 ptrOSPFLSAHDR newLS);
258 bool ospf_lsa_compareToListMem(ptrOSPF_PDS ospf,
259 ptrOSPFLSAHDR oldLS,
260 ptrOSPFLSAHDR newLS);
261 int ospf_lsa_isMoreRecent(ptrOSPF_PDS ospf, ptrOSPFLSAHDR newLSA, ptrOSPFLSAHDR oldLSA);
262 bool ospf_lsa_isSelfOriginated(ptrOSPF_PDS ospf,
263 ptrOSPFLSAHDR lsa);
264 void ospf_lsa_queueToFlood(ptrOSPF_PDS pds,
265 ptrOSPF_IF ospf,
266 ptrOSPFLSAHDR lsa);
267 bool ospf_lsa_flood(ptrOSPF_PDS pds,
268 OSPFID area,
269 ptrOSPFLSAHDR lsa,
270 NETSIM_IPAddress srcAddr,
271 NETSIM_ID in);
272 void ospf_lsa_flush(ptrOSPF_PDS ospf,
273 ptrOSPFAREA_DS area,
274 ptrOSPFLSAHDR lsa);
275 bool ospf_lsa_is_content_changed(ptrOSPF_PDS ospf,
276 ptrOSPFLSAHDR newLSA,
277 ptrOSPFLSAHDR oldLSA);
278 void ospf_lsa_assignNewLSAIntoLSOrigin(ptrOSPF_PDS pds,
279 ptrOSPFLSAHDR LSA,
280 ptrOSPFLSAHDR newLSA);
281 bool ospf_lsa_hasMaxAge(ptrOSPF_PDS ospf,
282 ptrOSPFLSAHDR lsa);
283 bool ospf_lsa_checkForDoNotAge(ptrOSPF_PDS ospf,
284 UINT16 routerLSAAge);
285 void ospf_lsa_addToMaxAgeLSAList(ptrOSPF_PDS ospf,
286 OSPFID areaId,
287 ptrOSPFLSAHDR lsa);
288 bool ospf_lsa_hasLink(ptrOSPF_PDS ospf,
289 ptrOSPFLSAHDR wlsa,
290 ptrOSPFLSAHDR vlsa);
291 ptrOSPFLSAHDR ospf_lsa_find_old_lsa(ptrOSPFLIST list,
292 OSPFID rid,
293 OSPFID lid);
294
295 //RLSA
296 void ospf_lsa_printRLSA(char* logid,
297 ptrOSPFRLSA rlsa);
298 bool Ospf_rlsa_getASBRouter(UINT8 VEB);
299 bool Ospf_rlsa_getABRouter(UINT8 VEB);
300 void ospf_rlsa_originateRouterLSA(ptrOSPFAREA_DS area,
301 bool isFlush);
302 bool ospf_rlsa_isBodyChanged(ptrOSPFLSAHDR newLSA,
303 ptrOSPFLSAHDR oldLSA);
304 bool ospf_rlsa_hasLink(ptrOSPF_PDS ospf,
305 ptrOSPFLSAHDR wlsa,
306 ptrOSPFLSAHDR vlsa);
307
308 //LSDB
309 ptrOSPFLSAHDR ospf_lsdb_lookup_lsaList(ptrOSPFLIST list,
310 OSPFID adverRouter,
311 OSPFID linkStateId);
312 ptrOSPFLSAHDR ospf_lsdb_lookup_lsaListByID(ptrOSPFLIST list,
313 OSPFID linkStateId);
314 ptrOSPFLSAHDR ospf_lsdb_lookup(ptrOSPF_PDS ospf,
315 ptrOSPFAREA_DS area,
316 LSTYPE lsType,
317 OSPFID adveRouter,
318 OSPFID linkStateID);
319 bool ospf_lsdb_install(ptrOSPF_PDS ospf,
320 OSPFID areaId,
321 ptrOSPFLSAHDR lsa,
322 ptrOSPFLIST list);
323 bool ospf_lsdb_update(ptrOSPF_PDS ospf,
324 ptrOSPF_IF thisInterface,
325 ptrOSPFLSAHDR lsa,
326 ptrOSPFAREA_DS thisArea,
327 NETSIM_IPAddress srcAddr);
328 void ospf_lsdb_scheduleMaxAgeRemovalTimer(ptrOSPF_PDS ospf);
329 void ospf_lsdb_handleMaxAgeRemovalTimer();
330 void ospf_lsdb_removeLSA(ptrOSPF_PDS ospf,
331 ptrOSPFAREA_DS area,
332 ptrOSPFLSAHDR lsa);
333 void ospf_LSDB_handle_IncrementAge_event();
334
335 //LSU
336 void ospf_handle_LSUPDATE();
337 void ospf_lsupdate_send();
338 void ospf_lsu_sendLSUpdateToNeighbor(ptrOSPF_PDS ospf,
339 ptrOSPF_IF thisInterface);
340 void ospf_lsupdate_handleRxmtTimer();
341
342 //LSAACK
343 void ospf_lsaAck_sendDelayedAck(ptrOSPF_PDS ospf,
344 ptrOSPF_IF thisInterface,
345 ptrOSPFLSAHDR lsa);
346 void ospf_lsaAck_sendDirectAck(ptrOSPF_PDS ospf,
347 NETSIM_ID interfaceId,
348 ptrARRAYLIST ackList,
349 NETSIM_IPAddress nbrAddr);
350 void ospf_lsack_handleDelayedAckTimer();
351 void ospf_handle_LSAck();
352
353 //LSREQ
354 ptrOSPFLIST ospf_lsreq_initList();
355 ptrOSPFLSAHDR ospf_lsReq_searchFromList(ptrOSPF_NEIGHBOR neigh,
356 ptrOSPFLSAHDR lsa);
357 void ospf_lsreq_insertToList(ptrOSPF_NEIGHBOR neigh,
358 ptrOSPFLSAHDR lsHdr,
359 double time);
360 void ospf_lsreq_removeFromReqList(ptrOSPFLIST list,
361 ptrOSPFLSAHDR lsa);
362 bool ospf_lsreq_isRequestedLSAReceived(ptrOSPF_NEIGHBOR neigh);
363 void ospf_lsreq_send(ptrOSPF_PDS ospf,
364 NETSIM_ID interfaceId,
365 NETSIM_IPAddress nbrAddr,
366 bool retx);
367 void ospf_lsreq_retransmit(ptrOSPF_PDS ospf,
368 ptrOSPF_IF thisInterface,
369 ptrOSPF_NEIGHBOR neigh,
370 UINT seqNum);
371 void ospf_handle_LSRequest();
372
373 //SPF
374 void ospf_spf_scheduleCalculation(ptrOSPF_PDS ospf);
375 void ospf_spf_handleCalculateSPFEvent();
376
377 //DR
378 OSPFIFSTATE ospf_DR_election(ptrOSPF_PDS ospf,
379 ptrOSPF_IF thisInterface);
380
381 //OSPF common function
382 bool ospf_isMyAddr(NETSIM_ID d, NETSIM_IPAddress addr);
383 NETSIM_ID ospf_getInterfaceIdForNextHop(NETSIM_ID d,
384 NETSIM_IPAddress addr);
385
386 //OSPF utility function
387 bool isOSPFConfigured(NETSIM_ID d);
388 char* form_dlogId(char* name,
389 NETSIM_ID d);
390 void print_ospf_log(OSPFLOGFLAG logFlag, char* format, ...);
391 void print_ospf_Dlog(char* id, char* format, ...);
392 void init_ospf_dlog(char* id,
393 char* fileName);
394 bool ospf_dlog_isEnable(char* id);
395#define ospf_event_add(time,d,in,subevent,packet,eventdata) ospf_event_add_dbg(time,d,in,subevent,packet,eventdata,__LINE__,__FILE__)
396 UINT64 ospf_event_add_dbg(double time,
397 NETSIM_ID d,
398 NETSIM_ID in,
399 int subevent,
400 NetSim_PACKET* packet,
401 void* eventData,
402 int line,
403 char* file);
404 void ospf_event_set(int subevent);
405 void ospf_event_set_and_call(int subevent, void* otherDetails);
406
407#pragma message(__LOC__"Remove after link failure bug")
408 //Added for cost calculation
409 typedef struct stru_OSPF_PATH {
410 NETSIM_ID d;
411 NETSIM_ID in;
412 struct stru_OSPF_PATH* next;
413 }OSPF_PATH, *ptrOSPF_PATH;
414
415 typedef struct stru_OSPF_COST_LIST {
416 NETSIM_ID src_id;
417 NETSIM_ID dest_id;
418 double cost;
419 ptrOSPF_PATH path;
420 struct stru_OSPF_COST_LIST* next;
421 }OSPF_COST_LIST, * ptrOSPF_COST_LIST;
422
423 ptrOSPF_COST_LIST fn_NetSim_App_Routing_Init(NETSIM_ID d, ptrOSPF_COST_LIST list);
424
425 bool get_protocol_log_status(char* logname);
426 bool get_ospf_log_status();
427 bool get_ospf_hello_log_status();
428#ifdef __cplusplus
429}
430#endif
431#endif //_NETSIM_OSPF_H_