From b1f6c439f55233338a5f7cca5070c70618fe7f1d Mon Sep 17 00:00:00 2001 From: "Ondrej Zajicek (work)" Date: Wed, 1 Aug 2018 17:41:29 +0200 Subject: [PATCH] BGP: Fix BFD/GR interaction The old code does not cause GR if BFD failed when GR is running, session is re-established but not yet synchronized. --- proto/bgp/bgp.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/proto/bgp/bgp.c b/proto/bgp/bgp.c index 369d78f5..a4b37691 100644 --- a/proto/bgp/bgp.c +++ b/proto/bgp/bgp.c @@ -1054,22 +1054,23 @@ bgp_bfd_notify(struct bfd_request *req) if (req->down && ((ps == PS_START) || (ps == PS_UP))) { BGP_TRACE(D_EVENTS, "BFD session down"); + bgp_store_error(p, NULL, BE_MISC, BEM_BFD_DOWN); - /* Ignore if already in GR */ - if (p->gr_active && (p->cf->bfd == BGP_BFD_GRACEFUL)) - return; - - if (p->conn && (p->conn->state == BS_ESTABLISHED) && - p->gr_ready && (p->cf->bfd == BGP_BFD_GRACEFUL)) + if (p->cf->bfd == BGP_BFD_GRACEFUL) { /* Trigger graceful restart */ - bgp_handle_graceful_restart(p); - bgp_conn_enter_idle_state(p->conn); + if (p->conn && (p->conn->state == BS_ESTABLISHED) && p->gr_ready) + bgp_handle_graceful_restart(p); + + if (p->incoming_conn.state > BS_IDLE) + bgp_conn_enter_idle_state(&p->incoming_conn); + + if (p->outgoing_conn.state > BS_IDLE) + bgp_conn_enter_idle_state(&p->outgoing_conn); } else { /* Trigger session down */ - bgp_store_error(p, NULL, BE_MISC, BEM_BFD_DOWN); if (ps == PS_UP) bgp_update_startup_delay(p); bgp_stop(p, 0, NULL, 0);