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)