NetSim Source Code Help
Loading...
Searching...
No Matches
OSPF_Interface.c
Go to the documentation of this file.
1/************************************************************************************
2* Copyright (C) 2020 *
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
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
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
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
72{
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 {
90 thisInterface->routerDeadInterval*SECOND,
93 OSPF_WAITTIMER,
94 NULL,
95 NULL);
96 }
98}
99
101{
104}
105
107{
108 OSPF_Subevent e = pstruEventDetails->nSubEventType;
110 ptrOSPF_IF thisInterface = OSPF_IF_CURRENT();
111 OSPFIFSTATE oldState = thisInterface->State;
112 OSPFIFSTATE newState = OSPFIFSTATE_DOWN;
113
114 if(((e == OSPF_BACKUPSEEN || e == OSPF_WAITTIMER) &&
115 thisInterface->State != OSPFIFSTATE_WAITING) ||
116 (e == OSPF_NEIGHBORCHANGE) &&
117 (thisInterface->State != OSPFIFSTATE_DROther &&
118 thisInterface->State != OSPFIFSTATE_BACKUP &&
119 thisInterface->State != OSPFIFSTATE_DR))
120 {
121 newState = oldState;
122 }
123 else
124 {
125 newState = ospf_DR_election(ospf, thisInterface);
126 }
127
128 if (newState != oldState)
129 ospf_interface_change_state(ospf, thisInterface, newState);
130}
131
133{
135 ptrOSPF_IF thisInterface = OSPF_IF_CURRENT();
136 UINT n;
137 for (n = 0; n < thisInterface->neighborRouterCount; n++)
138 {
139 ptrOSPF_NEIGHBOR neigh = thisInterface->neighborRouterList[n];
140 ospf_event_set_and_call(OSPF_KillNbr,
141 neigh);
142 }
143
144 thisInterface->designaterRouter = NULL;
145 thisInterface->designaterRouterAddr = NULL;
146 thisInterface->backupDesignaterRouter = NULL;
147 thisInterface->backupDesignaterRouterAddr = NULL;
148
149 thisInterface->isFloodTimerSet = false;
150 thisInterface->delayedAckTimer = false;
151
152 ospf_list_delete_all(thisInterface->updateLSAList);
153 ospf_list_delete_all(thisInterface->delayedAckList);
154
155 ospf_interface_change_state(ospf, thisInterface, OSPFIFSTATE_DOWN);
156}
unsigned int NETSIM_ID
Definition: Animation.h:45
#define _stricmp
Definition: Linux.h:127
#define UINT
Definition: Linux.h:38
void start_interval_hello_timer()
Definition: OSPF_Hello.c:50
void ospf_event_set_and_call(int subevent, void *otherDetails)
#define OSPF_CURR_TIME()
Definition: OSPF.h:40
OSPFIFSTATE ospf_DR_election(ptrOSPF_PDS ospf, ptrOSPF_IF thisInterface)
Definition: OSPF_DR.c:190
#define OSPF_PDS_CURRENT()
Definition: OSPF.h:151
#define OSPF_IF_CURRENT()
Definition: OSPF.h:179
void print_ospf_log(OSPFLOGFLAG logFlag, char *format,...)
#define OSPF_AREA_GET_ID(ospf, id)
Definition: OSPF.h:106
@ OSPF_LOG
Definition: OSPF.h:31
void ospf_lsa_schedule_routerLSA(ptrOSPF_PDS ospf, ptrOSPFAREA_DS area, bool isFlush)
Definition: OSPF_LSA.c:81
#define ospf_event_add(time, d, in, subevent, packet, eventdata)
Definition: OSPF.h:400
void ospf_lsa_scheduleNWLSA(ptrOSPF_PDS ospf, ptrOSPF_IF thisInterface, ptrOSPFAREA_DS area, bool isFlush)
Definition: OSPF_LSA.c:114
ptrOSPF_IF OSPF_IF_GET(ptrOSPF_PDS ospf, NETSIM_ID ifId)
void ospf_interface_init(ptrOSPF_PDS ospf, ptrOSPF_IF thisInterface)
void ospf_handle_interfaceDown_event()
OSPFIFTYPE OSPFIFTYPE_FROM_STR(char *val)
static void ospf_interface_change_state(ptrOSPF_PDS ospf, ptrOSPF_IF thisInterface, OSPFIFSTATE newState)
void ospf_handle_interfaceUp_event()
void ospf_interface_handleMultipleInterfaceEvent()
static char strOSPFIFTYPE[][50]
static char strOSPFIFSTATE[][50]
@ OSPFIFTYPE_P2MP
@ OSPFIFTYPE_P2P
@ OSPFIFTYPE_VIRTUALLINK
@ OSPFIFSTATE_WAITING
@ OSPFIFSTATE_DR
@ OSPFIFSTATE_BACKUP
@ OSPFIFSTATE_DOWN
@ OSPFIFSTATE_DROther
@ OSPFIFSTATE_P2P
enum enum_ospf_if_type OSPFIFTYPE
void OSPF_LSA_MSG_FREE(ptrOSPFLSAHDR hdr)
Definition: OSPF_LSA.c:231
ptrOSPFLSAHDR OSPF_LSA_MSG_COPY(ptrOSPFLSAHDR hdr)
Definition: OSPF_LSA.c:237
void ospf_list_delete_all(ptrOSPFLIST list)
ptrOSPFLIST ospf_list_init(void(*freeMem)(void *), void *(*copyMem)(void *))
enum enum_if_state OSPFIFSTATE
Definition: OSPF_Typedef.h:37
#define SECOND
Definition: Stack.h:60
EXPORTED struct stru_NetSim_EventDetails * pstruEventDetails
Definition: Stack.h:837
NETSIM_ID nSubEventType
Definition: Stack.h:757
NETSIM_ID nDeviceId
Definition: Stack.h:750
NETSIM_ID nInterfaceId
Definition: Stack.h:751
OSPFTIME routerDeadInterval
bool isFloodTimerSet
bool delayedAckTimer
ptrOSPF_NEIGHBOR * neighborRouterList
OSPFIFTYPE Type
ptrOSPFLIST delayedAckList
OSPFID backupDesignaterRouter
NETSIM_IPAddress designaterRouterAddr
NETSIM_IPAddress backupDesignaterRouterAddr
UINT8 RouterPriority
OSPFID designaterRouter
NETSIM_ID id
OSPFIFSTATE State
UINT neighborRouterCount
ptrOSPFLIST updateLSAList
ptrOSPF_IF * ospfIf
Definition: OSPF.h:118
UINT ifCount
Definition: OSPF.h:117