diff options
| author | Louis Scalbert <louis.scalbert@6wind.com> | 2022-05-20 15:29:21 +0200 | 
|---|---|---|
| committer | Louis Scalbert <louis.scalbert@6wind.com> | 2022-05-24 10:05:49 +0200 | 
| commit | 08e4960ab48c1c9e4227e40b286d5cbc4ac581f0 (patch) | |
| tree | aeafcaad82ddf15f69d3c080ee02cc869264115c /isisd | |
| parent | 62e458278b3d261f492ffeac7ed70b32272a43dd (diff) | |
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 <louis.scalbert@6wind.com>
Diffstat (limited to 'isisd')
| -rw-r--r-- | isisd/isis_adjacency.c | 3 | ||||
| -rw-r--r-- | isisd/isis_circuit.c | 5 | ||||
| -rw-r--r-- | 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 {  | 
