]> git.puffer.fish Git - matthieu/frr.git/commitdiff
isisd: allocate circuit_id only for broadcast circuits
authorChristian Franke <chris@opensourcerouting.org>
Mon, 5 Mar 2018 17:45:02 +0000 (18:45 +0100)
committerChristian Franke <chris@opensourcerouting.org>
Sat, 10 Mar 2018 17:38:03 +0000 (18:38 +0100)
Signed-off-by: Christian Franke <chris@opensourcerouting.org>
isisd/isis_circuit.c
isisd/isis_circuit.h
isisd/isis_csm.c
isisd/isis_spf.c

index 4341584a240b6d512e11c3c88821d26964a626d5..c8642b623d637a7f0aae6e0992fb4dcd9f9f3ccd 100644 (file)
@@ -377,7 +377,7 @@ void isis_circuit_del_addr(struct isis_circuit *circuit,
        return;
 }
 
-static uint8_t isis_circuit_id_gen(struct interface *ifp)
+static uint8_t isis_circuit_id_gen(struct isis *isis, struct interface *ifp)
 {
        /* Circuit ids MUST be unique for any broadcast circuits. Otherwise,
         * Pseudo-Node LSPs cannot be generated correctly.
@@ -403,6 +403,7 @@ static uint8_t isis_circuit_id_gen(struct interface *ifp)
                return 0;
        }
 
+       _ISIS_SET_FLAG(isis->circuit_ids_used, id);
        return id;
 }
 
@@ -411,11 +412,7 @@ void isis_circuit_if_add(struct isis_circuit *circuit, struct interface *ifp)
        struct listnode *node, *nnode;
        struct connected *conn;
 
-       circuit->circuit_id = isis_circuit_id_gen(ifp);
-       _ISIS_SET_FLAG(isis->circuit_ids_used, circuit->circuit_id);
-
        isis_circuit_if_bind(circuit, ifp);
-       /*  isis_circuit_update_addrs (circuit, ifp); */
 
        if (if_is_broadcast(ifp)) {
                if (circuit->circ_type_config == CIRCUIT_T_P2P)
@@ -440,8 +437,6 @@ void isis_circuit_if_add(struct isis_circuit *circuit, struct interface *ifp)
 
        for (ALL_LIST_ELEMENTS(ifp->connected, node, nnode, conn))
                isis_circuit_add_addr(circuit, conn);
-
-       return;
 }
 
 void isis_circuit_if_del(struct isis_circuit *circuit, struct interface *ifp)
@@ -471,10 +466,6 @@ void isis_circuit_if_del(struct isis_circuit *circuit, struct interface *ifp)
        }
 
        circuit->circ_type = CIRCUIT_T_UNKNOWN;
-       _ISIS_CLEAR_FLAG(isis->circuit_ids_used, circuit->circuit_id);
-       circuit->circuit_id = 0;
-
-       return;
 }
 
 void isis_circuit_if_bind(struct isis_circuit *circuit, struct interface *ifp)
@@ -588,6 +579,12 @@ int isis_circuit_up(struct isis_circuit *circuit)
        }
 
        if (circuit->circ_type == CIRCUIT_T_BROADCAST) {
+               circuit->circuit_id = isis_circuit_id_gen(isis, circuit->interface);
+               if (!circuit->circuit_id) {
+                       zlog_err("There are already 255 broadcast circuits active!");
+                       return ISIS_ERROR;
+               }
+
                /*
                 * Get the Hardware Address
                 */
@@ -732,6 +729,9 @@ void isis_circuit_down(struct isis_circuit *circuit)
                THREAD_TIMER_OFF(circuit->u.bc.t_refresh_pseudo_lsp[1]);
                circuit->lsp_regenerate_pending[0] = 0;
                circuit->lsp_regenerate_pending[1] = 0;
+
+               _ISIS_CLEAR_FLAG(isis->circuit_ids_used, circuit->circuit_id);
+               circuit->circuit_id = 0;
        } else if (circuit->circ_type == CIRCUIT_T_P2P) {
                isis_delete_adj(circuit->u.p2p.neighbor);
                circuit->u.p2p.neighbor = NULL;
index 367ad51f57810d18e6f52c4cdea0293ad0b60121..de6e7f2d87fd4621c3f2bb847af4db81df727908 100644 (file)
@@ -67,7 +67,7 @@ struct isis_p2p_info {
 
 struct isis_circuit {
        int state;
-       u_char circuit_id;         /* l1/l2 p2p/bcast CircuitID */
+       u_char circuit_id;           /* l1/l2 bcast CircuitID */
        struct isis_area *area;      /* back pointer to the area */
        struct interface *interface; /* interface info from z */
        int fd;                      /* IS-IS l1/2 socket */
index a283260d92aa590d93896f1d8e1d9fc423506afe..10870d5c50210c222d8ea40b9107ab540b28ef9f 100644 (file)
@@ -86,13 +86,6 @@ isis_csm_state_change(int event, struct isis_circuit *circuit, void *arg)
                case IF_UP_FROM_Z:
                        circuit = isis_circuit_new();
                        isis_circuit_if_add(circuit, (struct interface *)arg);
-                       if (!circuit->circuit_id) {
-                               isis_circuit_if_del(circuit,
-                                                   (struct interface *)arg);
-                               isis_circuit_del(circuit);
-                               circuit = NULL;
-                               break;
-                       }
                        listnode_add(isis->init_circ_list, circuit);
                        circuit->state = C_STATE_INIT;
                        break;
@@ -143,8 +136,6 @@ isis_csm_state_change(int event, struct isis_circuit *circuit, void *arg)
                        break;
                case IF_UP_FROM_Z:
                        isis_circuit_if_add(circuit, (struct interface *)arg);
-                       if (!circuit->circuit_id)
-                               break;
                        if (isis_circuit_up(circuit) != ISIS_OK) {
                                zlog_err(
                                        "Could not bring up %s because of invalid config.",
index 0aaa66cdeb49bb2b9de4b945746602459ee5877e..ee447d01f7c64dbe8535e025ae1e22304dec0a73 100644 (file)
@@ -334,12 +334,12 @@ static void remove_excess_adjs(struct list *adjs)
                if (comp < 0)
                        continue;
 
-               if (candidate->circuit->circuit_id > adj->circuit->circuit_id) {
+               if (candidate->circuit->idx > adj->circuit->idx) {
                        excess = node;
                        continue;
                }
 
-               if (candidate->circuit->circuit_id < adj->circuit->circuit_id)
+               if (candidate->circuit->idx < adj->circuit->idx)
                        continue;
 
                comp = memcmp(candidate->snpa, adj->snpa, ETH_ALEN);