listnode_add(circuit->ip_addrs, ipv4);
/* Update Local IP address parameter if MPLS TE is enable */
- if (circuit->ext && IS_MPLS_TE(circuit->ext)) {
+ if (circuit->ext && circuit->area
+ && IS_MPLS_TE(circuit->area->mta)) {
circuit->ext->local_addr.s_addr = ipv4->prefix.s_addr;
SET_SUBTLV(circuit->ext, EXT_LOCAL_ADDR);
}
circuit->is_passive = 1;
} else {
/* It's normal in case of loopback etc. */
- if (isis->debugs & DEBUG_EVENTS)
+ if (IS_DEBUG_EVENTS)
zlog_debug("isis_circuit_if_add: unsupported media");
circuit->circ_type = CIRCUIT_T_UNKNOWN;
}
isis_notif_if_state_change(circuit, true);
#endif /* ifndef FABRICD */
+ /* log adjacency changes if configured to do so */
+ if (circuit->area->log_adj_changes) {
+ struct isis_adjacency *adj = NULL;
+ if (circuit->circ_type == CIRCUIT_T_P2P) {
+ adj = circuit->u.p2p.neighbor;
+ if (adj)
+ isis_log_adj_change(
+ adj, adj->adj_state, ISIS_ADJ_DOWN,
+ "circuit is being brought down");
+ } else if (circuit->circ_type == CIRCUIT_T_BROADCAST) {
+ struct list *adj_list;
+ struct listnode *node;
+ if (circuit->u.bc.adjdb[0]) {
+ adj_list = list_new();
+ isis_adj_build_up_list(circuit->u.bc.adjdb[0],
+ adj_list);
+ for (ALL_LIST_ELEMENTS_RO(adj_list, node, adj))
+ isis_log_adj_change(
+ adj, adj->adj_state,
+ ISIS_ADJ_DOWN,
+ "circuit is being brought down");
+ list_delete(&adj_list);
+ }
+ if (circuit->u.bc.adjdb[1]) {
+ adj_list = list_new();
+ isis_adj_build_up_list(circuit->u.bc.adjdb[1],
+ adj_list);
+ for (ALL_LIST_ELEMENTS_RO(adj_list, node, adj))
+ isis_log_adj_change(
+ adj, adj->adj_state,
+ ISIS_ADJ_DOWN,
+ "circuit is being brought down");
+ list_delete(&adj_list);
+ }
+ }
+ }
+
/* Clear the flags for all the lsps of the circuit. */
isis_circuit_update_all_srmflags(circuit, 0);
vty_out(vty, ", Active neighbors: %u\n",
circuit->upadjcount[0]);
vty_out(vty,
- " Hello interval: %u, "
- "Holddown count: %u %s\n",
+ " Hello interval: %u, Holddown count: %u %s\n",
circuit->hello_interval[0],
circuit->hello_multiplier[0],
(circuit->pad_hellos ? "(pad)"
: "(no-pad)"));
vty_out(vty,
- " CNSP interval: %u, "
- "PSNP interval: %u\n",
+ " CNSP interval: %u, PSNP interval: %u\n",
circuit->csnp_interval[0],
circuit->psnp_interval[0]);
if (circuit->circ_type == CIRCUIT_T_BROADCAST)
vty_out(vty, ", Active neighbors: %u\n",
circuit->upadjcount[1]);
vty_out(vty,
- " Hello interval: %u, "
- "Holddown count: %u %s\n",
+ " Hello interval: %u, Holddown count: %u %s\n",
circuit->hello_interval[1],
circuit->hello_multiplier[1],
(circuit->pad_hellos ? "(pad)"
: "(no-pad)"));
vty_out(vty,
- " CNSP interval: %u, "
- "PSNP interval: %u\n",
+ " CNSP interval: %u, PSNP interval: %u\n",
circuit->csnp_interval[1],
circuit->psnp_interval[1]);
if (circuit->circ_type == CIRCUIT_T_BROADCAST)
if (circuit->state != C_STATE_CONF && circuit->state != C_STATE_UP)
return circuit;
isis_circuit_if_bind(circuit, ifp);
+ if (circuit->area->mta && circuit->area->mta->status)
+ isis_link_params_update(circuit, ifp);
return circuit;
}
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)