diff options
| -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 { |
