]> git.puffer.fish Git - matthieu/frr.git/commitdiff
isisd: fix incorrect vrf lookups
authorIgor Ryzhov <iryzhov@nfware.com>
Thu, 8 Oct 2020 16:23:08 +0000 (19:23 +0300)
committerIgor Ryzhov <iryzhov@nfware.com>
Sat, 10 Oct 2020 09:53:34 +0000 (12:53 +0300)
Lookup in C_STATE_NA must be made before the new circuit creation, or it
will be leaked if the isis instance is not found. All other lookups are
unnecessary - we just need to remember the previously used instance.

Signed-off-by: Igor Ryzhov <iryzhov@nfware.com>
isisd/isis_circuit.h
isisd/isis_csm.c

index da358f411b01694c3cb231fc63df145d8b18b8cc..008d7444ffa352637fd695370cdcfbd936ccb4ad 100644 (file)
@@ -79,6 +79,7 @@ struct isis_circuit_arg {
 struct isis_circuit {
        int state;
        uint8_t circuit_id;       /* l1/l2 bcast CircuitID */
+       struct isis *isis;
        struct isis_area *area;      /* back pointer to the area */
        struct interface *interface; /* interface info from z */
        int fd;                      /* IS-IS l1/2 socket */
index c848ed2638d852255cff837c53fd3c04aafe147d..f5ad0aff4818b03903fdb147782021c1ea76dc34 100644 (file)
@@ -83,16 +83,17 @@ isis_csm_state_change(int event, struct isis_circuit *circuit, void *arg)
                        circuit->state = C_STATE_CONF;
                        break;
                case IF_UP_FROM_Z:
-                       circuit = isis_circuit_new();
-                       isis_circuit_if_add(circuit, (struct interface *)arg);
-                       isis = isis_lookup_by_vrfid(circuit->interface->vrf_id);
+                       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;
                        circuit->state = C_STATE_INIT;
                        break;
                case ISIS_DISABLE:
@@ -117,7 +118,7 @@ isis_csm_state_change(int event, struct isis_circuit *circuit, void *arg)
                        circuit->state = C_STATE_UP;
                        isis_event_circuit_state_change(circuit, circuit->area,
                                                        1);
-                       listnode_delete(circuit->area->isis->init_circ_list,
+                       listnode_delete(circuit->isis->init_circ_list,
                                        circuit);
                        break;
                case IF_UP_FROM_Z:
@@ -129,15 +130,8 @@ isis_csm_state_change(int event, struct isis_circuit *circuit, void *arg)
                        break;
                case IF_DOWN_FROM_Z:
                        isis_circuit_if_del(circuit, (struct interface *)arg);
-                       isis = isis_lookup_by_vrfid(circuit->interface->vrf_id);
-                       if (isis == NULL) {
-                               zlog_warn(
-                                       "%s : ISIS routing instance not found",
-                                       __func__);
-                               break;
-                       }
-
-                       listnode_delete(isis->init_circ_list, circuit);
+                       listnode_delete(circuit->isis->init_circ_list,
+                                       circuit);
                        isis_circuit_del(circuit);
                        circuit = NULL;
                        break;
@@ -184,22 +178,15 @@ isis_csm_state_change(int event, struct isis_circuit *circuit, void *arg)
                        zlog_warn("circuit already connected");
                        break;
                case ISIS_DISABLE:
+                       isis = circuit->area->isis;
                        isis_circuit_down(circuit);
                        isis_circuit_deconfigure(circuit,
                                                 (struct isis_area *)arg);
                        circuit->state = C_STATE_INIT;
                        isis_event_circuit_state_change(
                                circuit, (struct isis_area *)arg, 0);
-
-                       isis = isis_lookup_by_vrfid(circuit->interface->vrf_id);
-                       if (isis == NULL) {
-                               zlog_warn(
-                                       "%s : ISIS routing instance not found",
-                                       __func__);
-                               break;
-                       }
-
                        listnode_add(isis->init_circ_list, circuit);
+                       circuit->isis = isis;
                        break;
                case IF_DOWN_FROM_Z:
                        isis_circuit_down(circuit);