summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--isisd/isis_circuit.c22
-rw-r--r--isisd/isis_circuit.h2
-rw-r--r--isisd/isis_csm.c9
-rw-r--r--isisd/isis_spf.c4
4 files changed, 14 insertions, 23 deletions
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);