diff options
| -rw-r--r-- | isisd/isis_circuit.c | 26 | ||||
| -rw-r--r-- | isisd/isis_csm.c | 17 |
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; |
