NetSim Source Code Help v14.4
All 13 Components
 
Loading...
Searching...
No Matches
OSPF_Interface.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 "OSPF.h"
16#include "OSPF_enum.h"
17#include "OSPF_Interface.h"
18#include "OSPF_List.h"
19#include "OSPF_Msg.h"
20
21OSPFIFTYPE OSPFIFTYPE_FROM_STR(char* val)
22{
23 UINT i;
24 UINT len = sizeof(strOSPFIFTYPE) / sizeof(strOSPFIFTYPE[0]);
25 for (i = 0; i < len; i++)
26 {
27 if (!_stricmp(strOSPFIFTYPE[i], val))
28 return (OSPFIFTYPE)i;
29 }
30 return (OSPFIFTYPE)0;
31}
32
33ptrOSPF_IF OSPF_IF_GET(ptrOSPF_PDS ospf, NETSIM_ID ifId)
34{
35 UINT i;
36 for (i = 0; i < ospf->ifCount; i++)
37 {
38 if (ospf->ospfIf[i]->id == ifId)
39 return ospf->ospfIf[i];
40 }
41 return NULL;
42}
43
44static void ospf_interface_change_state(ptrOSPF_PDS ospf,
45 ptrOSPF_IF thisInterface,
46 OSPFIFSTATE newState)
47{
48 OSPFIFSTATE oldState = thisInterface->State;
49 print_ospf_log(OSPF_LOG, "Interface state changed to %s from %s",
50 strOSPFIFSTATE[newState],
51 strOSPFIFSTATE[oldState]);
52 thisInterface->State = newState;
53
54 ptrOSPFAREA_DS area = OSPF_AREA_GET_ID(ospf, thisInterface->areaId);
55 ospf_lsa_schedule_routerLSA(ospf, area, false);
56
57 if (oldState != OSPFIFSTATE_DR &&
58 newState == OSPFIFSTATE_DR)
59 {
60 print_ospf_log(OSPF_LOG, "I am new DR. Producing network LSA for this network");
61 ospf_lsa_scheduleNWLSA(ospf, thisInterface, area, false);
62 }
63 else if (oldState == OSPFIFSTATE_DR &&
64 newState != OSPFIFSTATE_DR)
65 {
66 print_ospf_log(OSPF_LOG, "I am no longer DR. Flush previously originated network LSA");
67 ospf_lsa_scheduleNWLSA(ospf, thisInterface, area, true);
68 }
69}
70
71void ospf_handle_interfaceUp_event()
72{
73 ptrOSPF_PDS ospf = OSPF_PDS_CURRENT();
74 ptrOSPF_IF thisInterface = OSPF_IF_CURRENT();
75
76 if (thisInterface->State != OSPFIFSTATE_DOWN)
77 return;
78
79 // Start Hello timer & enabling periodic sending of Hello packet
80 if (thisInterface->Type == OSPFIFTYPE_P2P ||
81 thisInterface->Type == OSPFIFTYPE_P2MP ||
82 thisInterface->Type == OSPFIFTYPE_VIRTUALLINK)
83 ospf_interface_change_state(ospf, thisInterface, OSPFIFSTATE_P2P);
84 else if (thisInterface->RouterPriority == 0)
85 ospf_interface_change_state(ospf, thisInterface, OSPFIFSTATE_DR);
86 else
87 {
88 ospf_interface_change_state(ospf, thisInterface, OSPFIFSTATE_WAITING);
89 ospf_event_add(OSPF_CURR_TIME() +
90 thisInterface->routerDeadInterval*SECOND,
91 pstruEventDetails->nDeviceId,
92 pstruEventDetails->nInterfaceId,
93 OSPF_WAITTIMER,
94 NULL,
95 NULL);
96 }
97 start_interval_hello_timer();
98}
99
100void ospf_interface_init(ptrOSPF_PDS ospf, ptrOSPF_IF thisInterface)
101{
102 ospf;
103 thisInterface->updateLSAList = ospf_list_init(OSPF_LSA_MSG_FREE, OSPF_LSA_MSG_COPY);
104 thisInterface->delayedAckList = ospf_list_init(OSPF_LSA_MSG_FREE, OSPF_LSA_MSG_COPY);
105}
106
107void ospf_interface_handleMultipleInterfaceEvent()
108{
109 OSPF_Subevent e = pstruEventDetails->nSubEventType;
110 ptrOSPF_PDS ospf = OSPF_PDS_CURRENT();
111 ptrOSPF_IF thisInterface = OSPF_IF_CURRENT();
112 OSPFIFSTATE oldState = thisInterface->State;
113 OSPFIFSTATE newState = OSPFIFSTATE_DOWN;
114
115 if(((e == OSPF_BACKUPSEEN || e == OSPF_WAITTIMER) &&
116 thisInterface->State != OSPFIFSTATE_WAITING) ||
117 (e == OSPF_NEIGHBORCHANGE) &&
118 (thisInterface->State != OSPFIFSTATE_DROther &&
119 thisInterface->State != OSPFIFSTATE_BACKUP &&
120 thisInterface->State != OSPFIFSTATE_DR))
121 {
122 newState = oldState;
123 }
124 else
125 {
126 newState = ospf_DR_election(ospf, thisInterface);
127 }
128
129 if (newState != oldState)
130 ospf_interface_change_state(ospf, thisInterface, newState);
131}
132
133void ospf_handle_interfaceDown_event()
134{
135 ptrOSPF_PDS ospf = OSPF_PDS_CURRENT();
136 ptrOSPF_IF thisInterface = OSPF_IF_CURRENT();
137 UINT n;
138 for (n = 0; n < thisInterface->neighborRouterCount; n++)
139 {
140 ptrOSPF_NEIGHBOR neigh = thisInterface->neighborRouterList[n];
141 ospf_event_set_and_call(OSPF_KillNbr,
142 neigh);
143 }
144
145 thisInterface->designaterRouter = NULL;
146 thisInterface->designaterRouterAddr = NULL;
147 thisInterface->backupDesignaterRouter = NULL;
148 thisInterface->backupDesignaterRouterAddr = NULL;
149
150 thisInterface->isFloodTimerSet = false;
151 thisInterface->delayedAckTimer = false;
152
153 ospf_list_delete_all(thisInterface->updateLSAList);
154 ospf_list_delete_all(thisInterface->delayedAckList);
155
156 ospf_interface_change_state(ospf, thisInterface, OSPFIFSTATE_DOWN);
157}