]> git.proxmox.com Git - mirror_frr.git/blobdiff - isisd/isis_csm.c
Merge pull request #12798 from donaldsharp/rib_match_multicast
[mirror_frr.git] / isisd / isis_csm.c
index 7aae326a4f182de7eb59965551207d26ee2c4512..95bbc077a32c8170b53d2a5c8ff144c6931ff6f5 100644 (file)
@@ -1,23 +1,10 @@
+// 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>
@@ -48,8 +35,6 @@
 #include "isisd/isis_events.h"
 #include "isisd/isis_errors.h"
 
-extern struct isis *isis;
-
 static const char *const csm_statestr[] = {"C_STATE_NA", "C_STATE_INIT",
                                     "C_STATE_CONF", "C_STATE_UP"};
 
@@ -62,81 +47,93 @@ static const char *const csm_eventstr[] = {
 
 #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;
+       enum isis_circuit_state old_state;
+       struct isis_area *area = NULL;
+       struct interface *ifp;
+
+       assert(circuit);
 
-       old_state = circuit ? circuit->state : C_STATE_NA;
+       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:
-                       circuit = isis_circuit_new();
-                       isis_circuit_if_add(circuit, (struct interface *)arg);
-                       listnode_add(isis->init_circ_list, circuit);
+                       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(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(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, ifp);
                                flog_err(
                                        EC_ISIS_CONFIG,
                                        "Could not bring up %s because of invalid config.",
@@ -148,52 +145,54 @@ isis_csm_state_change(int event, struct isis_circuit *circuit, void *arg)
                                                        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:
+                       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);
+                       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;
 }