From e189d1ff1b17013bc06060065759552685982ada Mon Sep 17 00:00:00 2001 From: Renato Westphal Date: Thu, 27 Jul 2023 20:35:10 -0300 Subject: [PATCH] isisd: update Node-SID flag dynamically Node-SIDs refer to Prefix-SIDs associated with host prefixes of loopback addresses. As such, whenever an interface address is added or deleted, all configured Prefix-SIDs must be reevaluated to check if the N-flag needs to be set or unset. This change fixes some race conditions in the TI-LFA topotest where specific sequence of events could cause Prefix-SIDs to not have the N-flag set when they should, resulting in various failures. Signed-off-by: Renato Westphal --- isisd/isis_sr.c | 15 ++++----------- isisd/isis_sr.h | 1 + isisd/isis_zebra.c | 4 ++++ 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/isisd/isis_sr.c b/isisd/isis_sr.c index f928185ffb..76cde6d28c 100644 --- a/isisd/isis_sr.c +++ b/isisd/isis_sr.c @@ -923,13 +923,14 @@ static int sr_adj_ip_disabled(struct isis_adjacency *adj, int family, } /** - * Activate local Prefix-SID when loopback interface goes up for IS-IS. + * Update the Node-SID flag of the configured Prefix-SID mappings in response + * to an address addition or removal event. * - * @param ifp Loopback Interface + * @param ifp Interface * * @return 0 */ -static int sr_if_new_hook(struct interface *ifp) +int sr_if_addr_update(struct interface *ifp) { struct sr_prefix_cfg *pcfgs[SR_ALGORITHM_COUNT] = {NULL}; struct isis_circuit *circuit; @@ -947,13 +948,7 @@ static int sr_if_new_hook(struct interface *ifp) if (!area) return 0; - /* - * Update the Node-SID flag of the configured Prefix-SID mappings if - * necessary. This needs to be done here since isisd reads the startup - * configuration before receiving interface information from zebra. - */ FOR_ALL_INTERFACES_ADDRESSES (ifp, connected, node) { - for (int i = 0; i < SR_ALGORITHM_COUNT; i++) { pcfgs[i] = isis_sr_cfg_prefix_find( area, connected->address, i); @@ -1313,7 +1308,6 @@ void isis_sr_init(void) hook_register(isis_adj_state_change_hook, sr_adj_state_change); hook_register(isis_adj_ip_enabled_hook, sr_adj_ip_enabled); hook_register(isis_adj_ip_disabled_hook, sr_adj_ip_disabled); - hook_register(isis_if_new_hook, sr_if_new_hook); } /** @@ -1325,5 +1319,4 @@ void isis_sr_term(void) hook_unregister(isis_adj_state_change_hook, sr_adj_state_change); hook_unregister(isis_adj_ip_enabled_hook, sr_adj_ip_enabled); hook_unregister(isis_adj_ip_disabled_hook, sr_adj_ip_disabled); - hook_unregister(isis_if_new_hook, sr_if_new_hook); } diff --git a/isisd/isis_sr.h b/isisd/isis_sr.h index f5f0adf241..4378760299 100644 --- a/isisd/isis_sr.h +++ b/isisd/isis_sr.h @@ -222,6 +222,7 @@ extern struct sr_adjacency *isis_sr_adj_sid_find(struct isis_adjacency *adj, int family, enum sr_adj_type type); extern void isis_area_delete_backup_adj_sids(struct isis_area *area, int level); +extern int sr_if_addr_update(struct interface *ifp); extern char *sr_op2str(char *buf, size_t size, mpls_label_t label_in, mpls_label_t label_out); extern int isis_sr_start(struct isis_area *area); diff --git a/isisd/isis_zebra.c b/isisd/isis_zebra.c index 43e9865fce..4f3198a9fe 100644 --- a/isisd/isis_zebra.c +++ b/isisd/isis_zebra.c @@ -98,6 +98,8 @@ static int isis_zebra_if_address_add(ZAPI_CALLBACK_ARGS) isis_circuit_add_addr(circuit, c); } + sr_if_addr_update(c->ifp); + return 0; } @@ -125,6 +127,8 @@ static int isis_zebra_if_address_del(ZAPI_CALLBACK_ARGS) isis_circuit_del_addr(circuit, c); } + sr_if_addr_update(c->ifp); + connected_free(&c); return 0; -- 2.39.5