17#include "OSPF_Interface.h"
21OSPFIFTYPE OSPFIFTYPE_FROM_STR(
char* val)
24 UINT len =
sizeof(strOSPFIFTYPE) /
sizeof(strOSPFIFTYPE[0]);
25 for (i = 0; i < len; i++)
27 if (!_stricmp(strOSPFIFTYPE[i], val))
33ptrOSPF_IF OSPF_IF_GET(ptrOSPF_PDS ospf, NETSIM_ID ifId)
36 for (i = 0; i < ospf->ifCount; i++)
38 if (ospf->ospfIf[i]->id == ifId)
39 return ospf->ospfIf[i];
44static void ospf_interface_change_state(ptrOSPF_PDS ospf,
45 ptrOSPF_IF thisInterface,
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;
54 ptrOSPFAREA_DS area = OSPF_AREA_GET_ID(ospf, thisInterface->areaId);
55 ospf_lsa_schedule_routerLSA(ospf, area,
false);
57 if (oldState != OSPFIFSTATE_DR &&
58 newState == OSPFIFSTATE_DR)
60 print_ospf_log(OSPF_LOG,
"I am new DR. Producing network LSA for this network");
61 ospf_lsa_scheduleNWLSA(ospf, thisInterface, area,
false);
63 else if (oldState == OSPFIFSTATE_DR &&
64 newState != OSPFIFSTATE_DR)
66 print_ospf_log(OSPF_LOG,
"I am no longer DR. Flush previously originated network LSA");
67 ospf_lsa_scheduleNWLSA(ospf, thisInterface, area,
true);
71void ospf_handle_interfaceUp_event()
73 ptrOSPF_PDS ospf = OSPF_PDS_CURRENT();
74 ptrOSPF_IF thisInterface = OSPF_IF_CURRENT();
76 if (thisInterface->State != OSPFIFSTATE_DOWN)
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);
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,
97 start_interval_hello_timer();
100void ospf_interface_init(ptrOSPF_PDS ospf, ptrOSPF_IF thisInterface)
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);
107void ospf_interface_handleMultipleInterfaceEvent()
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;
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))
126 newState = ospf_DR_election(ospf, thisInterface);
129 if (newState != oldState)
130 ospf_interface_change_state(ospf, thisInterface, newState);
133void ospf_handle_interfaceDown_event()
135 ptrOSPF_PDS ospf = OSPF_PDS_CURRENT();
136 ptrOSPF_IF thisInterface = OSPF_IF_CURRENT();
138 for (n = 0; n < thisInterface->neighborRouterCount; n++)
140 ptrOSPF_NEIGHBOR neigh = thisInterface->neighborRouterList[n];
141 ospf_event_set_and_call(OSPF_KillNbr,
145 thisInterface->designaterRouter = NULL;
146 thisInterface->designaterRouterAddr = NULL;
147 thisInterface->backupDesignaterRouter = NULL;
148 thisInterface->backupDesignaterRouterAddr = NULL;
150 thisInterface->isFloodTimerSet =
false;
151 thisInterface->delayedAckTimer =
false;
153 ospf_list_delete_all(thisInterface->updateLSAList);
154 ospf_list_delete_all(thisInterface->delayedAckList);
156 ospf_interface_change_state(ospf, thisInterface, OSPFIFSTATE_DOWN);