+// SPDX-License-Identifier: GPL-2.0-or-later
/*
* IS-IS Rout(e)ing protocol - isis_csm.c
* IS-IS circuit state machine
* Copyright (C) 2001,2002 Sampo Saaristo
* Tampere University of Technology
* Institute of Communications Engineering
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public Licenseas published by the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; see the file COPYING; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <zebra.h>
#define EVENT2STR(E) csm_eventstr[E]
-struct isis_circuit *
-isis_csm_state_change(int event, struct isis_circuit *circuit, void *arg)
+struct isis_circuit *isis_csm_state_change(enum isis_circuit_event event,
+ struct isis_circuit *circuit,
+ void *arg)
{
- int old_state;
- struct isis *isis = NULL;
+ enum isis_circuit_state old_state;
+ struct isis_area *area = NULL;
+ struct interface *ifp;
- old_state = circuit ? circuit->state : C_STATE_NA;
+ assert(circuit);
+
+ old_state = circuit->state;
if (IS_DEBUG_EVENTS)
- zlog_debug("CSM_EVENT: %s", EVENT2STR(event));
+ zlog_debug("CSM_EVENT for %s: %s", circuit->interface->name,
+ EVENT2STR(event));
switch (old_state) {
case C_STATE_NA:
- if (circuit)
- zlog_warn("Non-null circuit while state C_STATE_NA");
- assert(circuit == NULL);
switch (event) {
case ISIS_ENABLE:
- circuit = isis_circuit_new();
- isis_circuit_configure(circuit,
- (struct isis_area *)arg);
+ area = arg;
+
+ isis_circuit_configure(circuit, area);
circuit->state = C_STATE_CONF;
break;
case IF_UP_FROM_Z:
- isis = isis_lookup_by_vrfid(((struct interface *)arg)->vrf_id);
- if (isis == NULL) {
- zlog_warn(
- " %s : ISIS routing instance not found",
- __func__);
- break;
- }
- circuit = isis_circuit_new();
- isis_circuit_if_add(circuit, (struct interface *)arg);
- listnode_add(isis->init_circ_list, circuit);
- circuit->isis = isis;
+ ifp = arg;
+
+ isis_circuit_if_add(circuit, ifp);
circuit->state = C_STATE_INIT;
break;
case ISIS_DISABLE:
- zlog_warn("circuit already disabled");
+ if (IS_DEBUG_EVENTS)
+ zlog_debug("circuit %s already disabled",
+ circuit->interface->name);
break;
case IF_DOWN_FROM_Z:
- zlog_warn("circuit already disconnected");
+ if (IS_DEBUG_EVENTS)
+ zlog_debug("circuit %s already disconnected",
+ circuit->interface->name);
break;
}
break;
case C_STATE_INIT:
- assert(circuit);
switch (event) {
case ISIS_ENABLE:
- isis_circuit_configure(circuit,
- (struct isis_area *)arg);
+ area = arg;
+
+ isis_circuit_configure(circuit, area);
if (isis_circuit_up(circuit) != ISIS_OK) {
- isis_circuit_deconfigure(
- circuit, (struct isis_area *)arg);
+ isis_circuit_deconfigure(circuit, area);
break;
}
circuit->state = C_STATE_UP;
isis_event_circuit_state_change(circuit, circuit->area,
1);
- listnode_delete(circuit->isis->init_circ_list,
- circuit);
break;
case IF_UP_FROM_Z:
- assert(circuit);
- zlog_warn("circuit already connected");
+ if (IS_DEBUG_EVENTS)
+ zlog_debug("circuit %s already connected",
+ circuit->interface->name);
break;
case ISIS_DISABLE:
- zlog_warn("circuit already disabled");
+ if (IS_DEBUG_EVENTS)
+ zlog_debug("circuit %s already disabled",
+ circuit->interface->name);
break;
case IF_DOWN_FROM_Z:
- isis_circuit_if_del(circuit, (struct interface *)arg);
- listnode_delete(circuit->isis->init_circ_list,
- circuit);
- isis_circuit_del(circuit);
- circuit = NULL;
+ ifp = arg;
+
+ isis_circuit_if_del(circuit, ifp);
+ circuit->state = C_STATE_NA;
break;
}
break;
case C_STATE_CONF:
- assert(circuit);
switch (event) {
case ISIS_ENABLE:
- zlog_warn("circuit already enabled");
+ if (IS_DEBUG_EVENTS)
+ zlog_debug("circuit %s is already enabled",
+ circuit->interface->name);
break;
case IF_UP_FROM_Z:
- isis_circuit_if_add(circuit, (struct interface *)arg);
+ ifp = arg;
+
+ isis_circuit_if_add(circuit, ifp);
if (isis_circuit_up(circuit) != ISIS_OK) {
- isis_circuit_if_del(circuit, (struct interface *)arg);
+ isis_circuit_if_del(circuit, ifp);
flog_err(
EC_ISIS_CONFIG,
"Could not bring up %s because of invalid config.",
1);
break;
case ISIS_DISABLE:
- isis_circuit_deconfigure(circuit,
- (struct isis_area *)arg);
- isis_circuit_del(circuit);
- circuit = NULL;
+ area = arg;
+
+ isis_circuit_deconfigure(circuit, area);
+ circuit->state = C_STATE_NA;
break;
case IF_DOWN_FROM_Z:
- zlog_warn("circuit already disconnected");
+ if (IS_DEBUG_EVENTS)
+ zlog_debug("circuit %s already disconnected",
+ circuit->interface->name);
break;
}
break;
case C_STATE_UP:
- assert(circuit);
switch (event) {
case ISIS_ENABLE:
- zlog_warn("circuit already configured");
+ if (IS_DEBUG_EVENTS)
+ zlog_debug("circuit %s already enabled",
+ circuit->interface->name);
break;
case IF_UP_FROM_Z:
- zlog_warn("circuit already connected");
+ if (IS_DEBUG_EVENTS)
+ zlog_debug("circuit %s already connected",
+ circuit->interface->name);
break;
case ISIS_DISABLE:
- isis = circuit->area->isis;
+ area = arg;
+
isis_circuit_down(circuit);
- isis_circuit_deconfigure(circuit,
- (struct isis_area *)arg);
+ isis_circuit_deconfigure(circuit, area);
circuit->state = C_STATE_INIT;
- isis_event_circuit_state_change(
- circuit, (struct isis_area *)arg, 0);
- listnode_add(isis->init_circ_list, circuit);
- circuit->isis = isis;
+ isis_event_circuit_state_change(circuit, area, 0);
break;
case IF_DOWN_FROM_Z:
+ ifp = arg;
+
isis_circuit_down(circuit);
- isis_circuit_if_del(circuit, (struct interface *)arg);
+ isis_circuit_if_del(circuit, ifp);
circuit->state = C_STATE_CONF;
isis_event_circuit_state_change(circuit, circuit->area,
0);
break;
}
break;
-
- default:
- zlog_warn("Invalid circuit state %d", old_state);
}
if (IS_DEBUG_EVENTS)
zlog_debug("CSM_STATE_CHANGE: %s -> %s ", STATE2STR(old_state),
- circuit ? STATE2STR(circuit->state)
- : STATE2STR(C_STATE_NA));
+ STATE2STR(circuit->state));
return circuit;
}