From 08e4960ab48c1c9e4227e40b286d5cbc4ac581f0 Mon Sep 17 00:00:00 2001 From: Louis Scalbert Date: Fri, 20 May 2022 15:29:21 +0200 Subject: [PATCH] isisd: avoid fast-reroute on down adjacency when the interface is down When an IS-IS interface is coming down, fast-reroute may be triggered twice: a first time after the detection of the interface down event and a second time after the detection of the adjacency down (because of the expiration of the ISIS Hello or BFD timers). Avoid a BFD down event from running fast-reroute another time if the interface was already detected down. Signed-off-by: Louis Scalbert --- isisd/isis_adjacency.c | 3 ++- isisd/isis_circuit.c | 5 ++++- isisd/isis_circuit.h | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/isisd/isis_adjacency.c b/isisd/isis_adjacency.c index 5b32a9e388..1b85299adf 100644 --- a/isisd/isis_adjacency.c +++ b/isisd/isis_adjacency.c @@ -328,7 +328,8 @@ void isis_adj_state_change(struct isis_adjacency **padj, if (new_state == old_state) return; - if (old_state == ISIS_ADJ_UP) { + if (old_state == ISIS_ADJ_UP && + !CHECK_FLAG(adj->circuit->flags, ISIS_CIRCUIT_IF_DOWN_FROM_Z)) { if (IS_DEBUG_EVENTS) zlog_debug( "ISIS-Adj (%s): Starting fast-reroute on state change " diff --git a/isisd/isis_circuit.c b/isisd/isis_circuit.c index 6072d6bf74..4717f1b0e3 100644 --- a/isisd/isis_circuit.c +++ b/isisd/isis_circuit.c @@ -1631,8 +1631,10 @@ static int isis_ifp_up(struct interface *ifp) { struct isis_circuit *circuit = ifp->info; - if (circuit) + if (circuit) { + UNSET_FLAG(circuit->flags, ISIS_CIRCUIT_IF_DOWN_FROM_Z); isis_csm_state_change(IF_UP_FROM_Z, circuit, ifp); + } return 0; } @@ -1643,6 +1645,7 @@ static int isis_ifp_down(struct interface *ifp) struct isis_circuit *circuit = ifp->info; if (circuit) { + SET_FLAG(circuit->flags, ISIS_CIRCUIT_IF_DOWN_FROM_Z); for (afi = AFI_IP; afi <= AFI_IP6; afi++) isis_circuit_switchover_routes( circuit, afi == AFI_IP ? AF_INET : AF_INET6, diff --git a/isisd/isis_circuit.h b/isisd/isis_circuit.h index db8e2f752a..b3ad3f7ffe 100644 --- a/isisd/isis_circuit.h +++ b/isisd/isis_circuit.h @@ -142,6 +142,7 @@ struct isis_circuit { struct list *ipv6_non_link; /* our non-link local IPv6 addresses */ uint16_t upadjcount[ISIS_LEVELS]; #define ISIS_CIRCUIT_FLAPPED_AFTER_SPF 0x01 +#define ISIS_CIRCUIT_IF_DOWN_FROM_Z 0x02 uint8_t flags; bool disable_threeway_adj; struct { -- 2.39.5