15#ifndef _NETSIM_OSPF_H_
16#define _NETSIM_OSPF_H_
21#pragma comment(lib,"NetworkStack.lib")
22#pragma comment(lib,"Metrics.lib")
24#include "OSPF_Typedef.h"
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))
37#define OSPF_CURR_TIME() (pstruEventDetails->dEventTime)
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"
43#define strSingleAreaId "255.255.255.255"
44#define strBackboneAreaId "0.0.0.0"
45 NETSIM_IPAddress AllSPFRouters;
46 NETSIM_IPAddress AllDRouters;
49 OSPFID backboneAreaId;
51#define ANY_DEST (GET_BROADCAST_IP(4))
53#define OSPF_BROADCAST_JITTER (0*MILLISECOND)
54#define OSPF_DO_NOT_AGE (0x8000)
55#define OSPF_LSA_MAX_AGE_DIFF (15 * MINUTE)
57 typedef enum enum_ospf_router_type
65 typedef enum enum_address_range_status
67 ADDRRNSTATUS_ADVERTISE,
68 ADDRRNSTATUS_DONOTADVERTISE,
73 NETSIM_IPAddress address;
74 NETSIM_IPAddress mask;
75 ADDR_RN_STATUS status;
76 }ADDR_RN, *ptrADDR_RN;
81 ptrOSPFLIST addressRangeList;
82 UINT assocInterfaceCount;
83 NETSIM_IPAddress* assocRouterInterface;
84 NETSIM_ID* assocRouterInterfaceId;
86 ptrOSPFLIST routerLSAList;
87 ptrOSPFLIST nwLSAList;
88 ptrOSPFLIST routerSummaryLSAList;
89 ptrOSPFLIST nwSummaryLSAList;
90 ptrOSPFLIST maxAgeList;
91 bool extRoutingCapability;
94 double lastLSAOriginateTime;
96 ptrOSPFLIST shortestPathList;
97 }OSPFAREA_DS,*ptrOSPFAREA_DS;
98 ptrOSPFAREA_DS OSPF_AREA_GET(ptrOSPF_PDS ospf,
101 NETSIM_IPAddress interfaceIP);
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);
112 OSPFRTYPE routerType;
116 ptrOSPFAREA_DS* areaDS;
117 double minLSInterval;
120 bool isAdvertSelfIntf;
123 bool isMaxAgeRemovalTimerSet;
124 double maxAgeRemovalTime;
126 double LSRefreshTime;
130 ptrOSPFROUTINGTABLE routingTable;
134 bool isPartitionedIntoArea;
142 bool isSendDelayedUpdate;
144 double incrementTime;
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))
156 ptrOSPF_NEIGHBOR neigh;
159 NETSIM_IPAddress destAddr;
160 NETSIM_IPAddress destMask;
161 OSPFDESTTYPE destType;
162 }EVENTLSDB, *ptrEVENTLSDB;
166 void ospf_process_hello();
167 void ospf_handle_helloTimer_event();
168 void start_interval_hello_timer();
171 void start_sending_dd_msg();
172 void ospf_handle_DD();
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();
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,
189 ptrOSPFLSAHDR ospf_neighbor_searchSendList(ptrOSPFLIST list,
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,
196 void ospf_neighbor_add(ptrOSPF_IF ospf, ptrOSPF_NEIGHBOR neigh);
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();
210 void ospf_area_init(NETSIM_ID d, NETSIM_ID in);
211 void ospf_area_handleABRTask(ptrOSPF_PDS ospf);
214 void ospf_lsahdr_add_lsa(ptrOSPFLSAHDR lhdr,
217 bool ospf_lsa_update_lsahdr(ptrOSPF_PDS ospf,
224 void ospf_lsa_print(
char* logid,
225 ptrOSPFLSAHDR LSHeader,
227 void ospf_lsa_printList(
char* logid,
230 void ospf_lsa_schedule_routerLSA(ptrOSPF_PDS ospf,
233 void ospf_lsa_scheduleNWLSA(ptrOSPF_PDS ospf,
234 ptrOSPF_IF thisInterface,
237 void ospf_lsa_scheduleSummaryLSA(ptrOSPF_PDS ospf,
238 ptrOSPF_IF thisInterface,
240 NETSIM_IPAddress destAddr,
241 NETSIM_IPAddress destMask,
242 OSPFDESTTYPE destType,
244 void ospf_lsa_schedule(ptrOSPF_PDS ospf,
245 ptrOSPF_IF thisInterface,
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,
255 int ospf_lsa_compare(ptrOSPF_PDS ospf,
257 ptrOSPFLSAHDR newLS);
258 bool ospf_lsa_compareToListMem(ptrOSPF_PDS ospf,
260 ptrOSPFLSAHDR newLS);
261 int ospf_lsa_isMoreRecent(ptrOSPF_PDS ospf, ptrOSPFLSAHDR newLSA, ptrOSPFLSAHDR oldLSA);
262 bool ospf_lsa_isSelfOriginated(ptrOSPF_PDS ospf,
264 void ospf_lsa_queueToFlood(ptrOSPF_PDS pds,
267 bool ospf_lsa_flood(ptrOSPF_PDS pds,
270 NETSIM_IPAddress srcAddr,
272 void ospf_lsa_flush(ptrOSPF_PDS ospf,
275 bool ospf_lsa_is_content_changed(ptrOSPF_PDS ospf,
276 ptrOSPFLSAHDR newLSA,
277 ptrOSPFLSAHDR oldLSA);
278 void ospf_lsa_assignNewLSAIntoLSOrigin(ptrOSPF_PDS pds,
280 ptrOSPFLSAHDR newLSA);
281 bool ospf_lsa_hasMaxAge(ptrOSPF_PDS ospf,
283 bool ospf_lsa_checkForDoNotAge(ptrOSPF_PDS ospf,
284 UINT16 routerLSAAge);
285 void ospf_lsa_addToMaxAgeLSAList(ptrOSPF_PDS ospf,
288 bool ospf_lsa_hasLink(ptrOSPF_PDS ospf,
291 ptrOSPFLSAHDR ospf_lsa_find_old_lsa(ptrOSPFLIST list,
296 void ospf_lsa_printRLSA(
char* logid,
298 bool Ospf_rlsa_getASBRouter(UINT8 VEB);
299 bool Ospf_rlsa_getABRouter(UINT8 VEB);
300 void ospf_rlsa_originateRouterLSA(ptrOSPFAREA_DS area,
302 bool ospf_rlsa_isBodyChanged(ptrOSPFLSAHDR newLSA,
303 ptrOSPFLSAHDR oldLSA);
304 bool ospf_rlsa_hasLink(ptrOSPF_PDS ospf,
309 ptrOSPFLSAHDR ospf_lsdb_lookup_lsaList(ptrOSPFLIST list,
312 ptrOSPFLSAHDR ospf_lsdb_lookup_lsaListByID(ptrOSPFLIST list,
314 ptrOSPFLSAHDR ospf_lsdb_lookup(ptrOSPF_PDS ospf,
319 bool ospf_lsdb_install(ptrOSPF_PDS ospf,
323 bool ospf_lsdb_update(ptrOSPF_PDS ospf,
324 ptrOSPF_IF thisInterface,
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,
333 void ospf_LSDB_handle_IncrementAge_event();
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();
343 void ospf_lsaAck_sendDelayedAck(ptrOSPF_PDS ospf,
344 ptrOSPF_IF thisInterface,
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();
354 ptrOSPFLIST ospf_lsreq_initList();
355 ptrOSPFLSAHDR ospf_lsReq_searchFromList(ptrOSPF_NEIGHBOR neigh,
357 void ospf_lsreq_insertToList(ptrOSPF_NEIGHBOR neigh,
360 void ospf_lsreq_removeFromReqList(ptrOSPFLIST list,
362 bool ospf_lsreq_isRequestedLSAReceived(ptrOSPF_NEIGHBOR neigh);
363 void ospf_lsreq_send(ptrOSPF_PDS ospf,
364 NETSIM_ID interfaceId,
365 NETSIM_IPAddress nbrAddr,
367 void ospf_lsreq_retransmit(ptrOSPF_PDS ospf,
368 ptrOSPF_IF thisInterface,
369 ptrOSPF_NEIGHBOR neigh,
371 void ospf_handle_LSRequest();
374 void ospf_spf_scheduleCalculation(ptrOSPF_PDS ospf);
375 void ospf_spf_handleCalculateSPFEvent();
378 OSPFIFSTATE ospf_DR_election(ptrOSPF_PDS ospf,
379 ptrOSPF_IF thisInterface);
382 bool ospf_isMyAddr(NETSIM_ID d, NETSIM_IPAddress addr);
383 NETSIM_ID ospf_getInterfaceIdForNextHop(NETSIM_ID d,
384 NETSIM_IPAddress addr);
387 bool isOSPFConfigured(NETSIM_ID d);
388 char* form_dlogId(
char* name,
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,
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,
400 NetSim_PACKET* packet,
404 void ospf_event_set(
int subevent);
405 void ospf_event_set_and_call(
int subevent,
void* otherDetails);
407#pragma message(__LOC__"Remove after link failure bug")
413 }OSPF_PATH, *ptrOSPF_PATH;
421 }OSPF_COST_LIST, * ptrOSPF_COST_LIST;
423 ptrOSPF_COST_LIST fn_NetSim_App_Routing_Init(NETSIM_ID d, ptrOSPF_COST_LIST list);
425 bool get_protocol_log_status(
char* logname);
426 bool get_ospf_log_status();
427 bool get_ospf_hello_log_status();