1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * IS-IS Rout(e)ing protocol - isis_csm.c
4 * IS-IS circuit state machine
5 * Copyright (C) 2001,2002 Sampo Saaristo
6 * Tampere University of Technology
7 * Institute of Communications Engineering
22 #include "isisd/isis_constants.h"
23 #include "isisd/isis_common.h"
24 #include "isisd/isis_flags.h"
25 #include "isisd/isis_circuit.h"
26 #include "isisd/isis_lsp.h"
27 #include "isisd/isis_pdu.h"
28 #include "isisd/isis_network.h"
29 #include "isisd/isis_misc.h"
30 #include "isisd/isis_constants.h"
31 #include "isisd/isis_adjacency.h"
32 #include "isisd/isis_dr.h"
33 #include "isisd/isisd.h"
34 #include "isisd/isis_csm.h"
35 #include "isisd/isis_events.h"
36 #include "isisd/isis_errors.h"
38 static const char *const csm_statestr
[] = {"C_STATE_NA", "C_STATE_INIT",
39 "C_STATE_CONF", "C_STATE_UP"};
41 #define STATE2STR(S) csm_statestr[S]
43 static const char *const csm_eventstr
[] = {
44 "NO_STATE", "ISIS_ENABLE", "IF_UP_FROM_Z",
45 "ISIS_DISABLE", "IF_DOWN_FROM_Z",
48 #define EVENT2STR(E) csm_eventstr[E]
50 struct isis_circuit
*isis_csm_state_change(enum isis_circuit_event event
,
51 struct isis_circuit
*circuit
,
54 enum isis_circuit_state old_state
;
55 struct isis_area
*area
= NULL
;
56 struct interface
*ifp
;
60 old_state
= circuit
->state
;
62 zlog_debug("CSM_EVENT for %s: %s", circuit
->interface
->name
,
71 isis_circuit_configure(circuit
, area
);
72 circuit
->state
= C_STATE_CONF
;
77 isis_circuit_if_add(circuit
, ifp
);
78 circuit
->state
= C_STATE_INIT
;
82 zlog_debug("circuit %s already disabled",
83 circuit
->interface
->name
);
87 zlog_debug("circuit %s already disconnected",
88 circuit
->interface
->name
);
97 isis_circuit_configure(circuit
, area
);
98 if (isis_circuit_up(circuit
) != ISIS_OK
) {
99 isis_circuit_deconfigure(circuit
, area
);
102 circuit
->state
= C_STATE_UP
;
103 isis_event_circuit_state_change(circuit
, circuit
->area
,
108 zlog_debug("circuit %s already connected",
109 circuit
->interface
->name
);
113 zlog_debug("circuit %s already disabled",
114 circuit
->interface
->name
);
119 isis_circuit_if_del(circuit
, ifp
);
120 circuit
->state
= C_STATE_NA
;
128 zlog_debug("circuit %s is already enabled",
129 circuit
->interface
->name
);
134 isis_circuit_if_add(circuit
, ifp
);
135 if (isis_circuit_up(circuit
) != ISIS_OK
) {
136 isis_circuit_if_del(circuit
, ifp
);
139 "Could not bring up %s because of invalid config.",
140 circuit
->interface
->name
);
143 circuit
->state
= C_STATE_UP
;
144 isis_event_circuit_state_change(circuit
, circuit
->area
,
150 isis_circuit_deconfigure(circuit
, area
);
151 circuit
->state
= C_STATE_NA
;
155 zlog_debug("circuit %s already disconnected",
156 circuit
->interface
->name
);
164 zlog_debug("circuit %s already enabled",
165 circuit
->interface
->name
);
169 zlog_debug("circuit %s already connected",
170 circuit
->interface
->name
);
175 isis_circuit_down(circuit
);
176 isis_circuit_deconfigure(circuit
, area
);
177 circuit
->state
= C_STATE_INIT
;
178 isis_event_circuit_state_change(circuit
, area
, 0);
183 isis_circuit_down(circuit
);
184 isis_circuit_if_del(circuit
, ifp
);
185 circuit
->state
= C_STATE_CONF
;
186 isis_event_circuit_state_change(circuit
, circuit
->area
,
194 zlog_debug("CSM_STATE_CHANGE: %s -> %s ", STATE2STR(old_state
),
195 STATE2STR(circuit
->state
));