summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--isisd/isis_circuit.c26
-rw-r--r--isisd/isis_csm.c17
2 files changed, 19 insertions, 24 deletions
diff --git a/isisd/isis_circuit.c b/isisd/isis_circuit.c
index 003be8d682..e0013e4f1f 100644
--- a/isisd/isis_circuit.c
+++ b/isisd/isis_circuit.c
@@ -1233,23 +1233,35 @@ void isis_circuit_af_set(struct isis_circuit *circuit, bool ip_router,
bool ipv6_router)
{
struct isis_area *area = circuit->area;
- bool change = circuit->ip_router != ip_router
- || circuit->ipv6_router != ipv6_router;
+ int old_ipr = circuit->ip_router;
+ int old_ipv6r = circuit->ipv6_router;
+
+ /* is there something to do? */
+ if (old_ipr == ip_router && old_ipv6r == ipv6_router)
+ return;
- area->ip_circuits += ip_router - circuit->ip_router;
- area->ipv6_circuits += ipv6_router - circuit->ipv6_router;
circuit->ip_router = ip_router;
circuit->ipv6_router = ipv6_router;
+ circuit_update_nlpids(circuit);
- if (!change)
+ /* the area should always be there if we get here, but in the past
+ * there were corner cases where the area was NULL (e.g. because the
+ * circuit was deconfigured following a validation error). Do not
+ * segfault if this happens again.
+ */
+ if (!area) {
+ zlog_err("%s: NULL area for circuit %u", __func__,
+ circuit->circuit_id);
return;
+ }
- circuit_update_nlpids(circuit);
+ area->ip_circuits += ip_router - old_ipr;
+ area->ipv6_circuits += ipv6_router - old_ipv6r;
if (!ip_router && !ipv6_router)
isis_csm_state_change(ISIS_DISABLE, circuit, area);
else
- lsp_regenerate_schedule(circuit->area, circuit->is_type, 0);
+ lsp_regenerate_schedule(area, circuit->is_type, 0);
}
ferr_r isis_circuit_passive_set(struct isis_circuit *circuit, bool passive)
diff --git a/isisd/isis_csm.c b/isisd/isis_csm.c
index 9202ed5a88..9ff5c86fb0 100644
--- a/isisd/isis_csm.c
+++ b/isisd/isis_csm.c
@@ -141,23 +141,6 @@ isis_csm_state_change(int event, struct isis_circuit *circuit, void *arg)
EC_ISIS_CONFIG,
"Could not bring up %s because of invalid config.",
circuit->interface->name);
- flog_err(
- EC_ISIS_CONFIG,
- "Clearing config for %s. Please re-examine it.",
- circuit->interface->name);
- if (circuit->ip_router) {
- circuit->ip_router = 0;
- circuit->area->ip_circuits--;
- }
- if (circuit->ipv6_router) {
- circuit->ipv6_router = 0;
- circuit->area->ipv6_circuits--;
- }
- circuit_update_nlpids(circuit);
- isis_circuit_deconfigure(circuit,
- circuit->area);
- listnode_add(isis->init_circ_list, circuit);
- circuit->state = C_STATE_INIT;
break;
}
circuit->state = C_STATE_UP;