diff --git a/isisd/isis_adjacency.c b/isisd/isis_adjacency.c index 7be61fdf28..66de11e6f7 100644 --- a/isisd/isis_adjacency.c +++ b/isisd/isis_adjacency.c @@ -207,6 +207,22 @@ static const char *adj_state2string(int state) return NULL; /* not reached */ } +static const char *adj_level2string(int level) +{ + switch (level) { + case IS_LEVEL_1: + return "level-1"; + case IS_LEVEL_2: + return "level-2"; + case IS_LEVEL_1_AND_2: + return "level-1-2"; + default: + return "unknown"; + } + + return NULL; /* not reached */ +} + void isis_adj_process_threeway(struct isis_adjacency *adj, struct isis_threeway_adj *tw_adj, enum isis_adj_usage adj_usage) @@ -259,7 +275,25 @@ void isis_adj_process_threeway(struct isis_adjacency *adj, adj->threeway_state = next_tw_state; } +void isis_log_adj_change(struct isis_adjacency *adj, + enum isis_adj_state old_state, + enum isis_adj_state new_state, const char *reason) +{ + const char *adj_name; + struct isis_dynhn *dyn; + dyn = dynhn_find_by_id(adj->sysid); + if (dyn) + adj_name = dyn->hostname; + else + adj_name = sysid_print(adj->sysid); + + zlog_info( + "%%ADJCHANGE: Adjacency to %s (%s) for %s changed from %s to %s, %s", + adj_name, adj->circuit->interface->name, + adj_level2string(adj->level), adj_state2string(old_state), + adj_state2string(new_state), reason ? reason : "unspecified"); +} void isis_adj_state_change(struct isis_adjacency **padj, enum isis_adj_state new_state, const char *reason) { @@ -280,23 +314,8 @@ void isis_adj_state_change(struct isis_adjacency **padj, reason ? reason : "unspecified"); } - if (circuit->area->log_adj_changes) { - const char *adj_name; - struct isis_dynhn *dyn; - - dyn = dynhn_find_by_id(adj->sysid); - if (dyn) - adj_name = dyn->hostname; - else - adj_name = sysid_print(adj->sysid); - - zlog_info( - "%%ADJCHANGE: Adjacency to %s (%s) changed from %s to %s, %s", - adj_name, adj->circuit->interface->name, - adj_state2string(old_state), - adj_state2string(new_state), - reason ? reason : "unspecified"); - } + if (circuit->area->log_adj_changes) + isis_log_adj_change(adj, old_state, new_state, reason); circuit->adj_state_changes++; #ifndef FABRICD diff --git a/isisd/isis_adjacency.h b/isisd/isis_adjacency.h index ec17446ade..d61fbbd751 100644 --- a/isisd/isis_adjacency.h +++ b/isisd/isis_adjacency.h @@ -126,6 +126,9 @@ DECLARE_HOOK(isis_adj_ip_enabled_hook, (struct isis_adjacency *adj, int family), (adj, family)) DECLARE_HOOK(isis_adj_ip_disabled_hook, (struct isis_adjacency *adj, int family), (adj, family)) +void isis_log_adj_change(struct isis_adjacency *adj, + enum isis_adj_state old_state, + enum isis_adj_state new_state, const char *reason); void isis_adj_state_change(struct isis_adjacency **adj, enum isis_adj_state state, const char *reason); void isis_adj_print(struct isis_adjacency *adj); diff --git a/isisd/isis_circuit.c b/isisd/isis_circuit.c index 9804841d6d..03d7b3d07b 100644 --- a/isisd/isis_circuit.c +++ b/isisd/isis_circuit.c @@ -720,6 +720,43 @@ void isis_circuit_down(struct isis_circuit *circuit) isis_notif_if_state_change(circuit, true); #endif /* ifndef FABRICD */ + /* log adjacency changes if configured to do so */ + if (circuit->area && 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);