From: Christian Franke Date: Mon, 5 Mar 2018 17:45:02 +0000 (+0100) Subject: isisd: allocate circuit_id only for broadcast circuits X-Git-Tag: frr-5.0-dev~162^2~5 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=0849c75e5d75d25b0d330545451295edfe8d23be;p=matthieu%2Ffrr.git isisd: allocate circuit_id only for broadcast circuits Signed-off-by: Christian Franke --- diff --git a/isisd/isis_circuit.c b/isisd/isis_circuit.c index 4341584a24..c8642b623d 100644 --- a/isisd/isis_circuit.c +++ b/isisd/isis_circuit.c @@ -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; diff --git a/isisd/isis_circuit.h b/isisd/isis_circuit.h index 367ad51f57..de6e7f2d87 100644 --- a/isisd/isis_circuit.h +++ b/isisd/isis_circuit.h @@ -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 */ diff --git a/isisd/isis_csm.c b/isisd/isis_csm.c index a283260d92..10870d5c50 100644 --- a/isisd/isis_csm.c +++ b/isisd/isis_csm.c @@ -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.", diff --git a/isisd/isis_spf.c b/isisd/isis_spf.c index 0aaa66cdeb..ee447d01f7 100644 --- a/isisd/isis_spf.c +++ b/isisd/isis_spf.c @@ -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);