diff options
-rw-r--r-- | bgpd/bgp_peer.c | 23 | ||||
-rw-r--r-- | bgpd/bgp_route.c | 5 | ||||
-rw-r--r-- | bgpd/bgpd.c | 14 |
3 files changed, 26 insertions, 16 deletions
diff --git a/bgpd/bgp_peer.c b/bgpd/bgp_peer.c index 31deb57f..659dcac3 100644 --- a/bgpd/bgp_peer.c +++ b/bgpd/bgp_peer.c @@ -325,13 +325,11 @@ bgp_session_has_disabled(bgp_peer peer) /* Immediately discard any other messages for this session. */ mqueue_revoke(routing_nexus->queue, session) ; - /* does the session need to be re-enabled? */ - if ((session->defer_enable || peer->state == bgp_peer_sIdle) - && !CHECK_FLAG (peer->flags, PEER_FLAG_SHUTDOWN) - && !CHECK_FLAG (peer->sflags, PEER_STATUS_PREFIX_OVERFLOW)) + /* does the peer need to be re-enabled? */ + if (session->defer_enable || peer->state == bgp_peer_sIdle) { session->defer_enable = 0; - bgp_session_enable(peer); + bgp_peer_enable(peer); } else if (peer->state == bgp_peer_sEstablished) { @@ -1002,8 +1000,19 @@ peer_nsf_stop (struct peer *peer) void bgp_peer_enable(bgp_peer peer) { - /* enable the session */ - bgp_session_enable(peer); + /* Don't enable the session if: + * 1) Peer not idle, means we're not ready yet, clearing, deleting or waiting + * for disable. + * 2) In shutdown, never want to enable ever again + * 3) Dealing with prefix overflow, its timer will enable peer when ready + */ + if ((peer->state == bgp_peer_sIdle) + && !CHECK_FLAG (peer->flags, PEER_FLAG_SHUTDOWN) + && !CHECK_FLAG (peer->sflags, PEER_STATUS_PREFIX_OVERFLOW)) + { + /* enable the session */ + bgp_session_enable(peer); + } } /* disable the peer diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 3e2b54a3..7d3ad901 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -2730,11 +2730,8 @@ bgp_clear_node_complete (struct work_queue *wq) if (peer->state == bgp_peer_sClearing) { peer_change_status (peer, bgp_peer_sIdle); - /* enable peer if required */ - if (!CHECK_FLAG (peer->flags, PEER_FLAG_SHUTDOWN) && - !CHECK_FLAG (peer->sflags, PEER_STATUS_PREFIX_OVERFLOW)) - bgp_peer_enable(peer); + bgp_peer_enable(peer); } peer_unlock (peer); /* bgp_clear_route */ diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c index a3b73d74..1a3d2e34 100644 --- a/bgpd/bgpd.c +++ b/bgpd/bgpd.c @@ -2008,8 +2008,8 @@ peer_flag_modify_action (struct peer *peer, u_int32_t flag) if (CHECK_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT)) peer_nsf_stop (peer); - bgp_notify_send_with_data(peer, BGP_NOTIFY_CEASE, - BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN, NULL, 0); + bgp_notify_send(peer, BGP_NOTIFY_CEASE, + BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN); } else { @@ -3844,8 +3844,7 @@ peer_clear (struct peer *peer) /* Beware we may still be clearing, if so the end of * clearing will enable the peer */ - if (peer->state == bgp_peer_sIdle) - bgp_peer_enable(peer); + bgp_peer_enable(peer); return 0; } @@ -4716,7 +4715,12 @@ bgp_terminate (int terminating, int retain_mode) if (retain_mode) bgp_peer_disable(peer, NULL); else if (terminating) - peer_flag_set(peer, PEER_FLAG_SHUTDOWN); + { + peer_flag_set(peer, PEER_FLAG_SHUTDOWN); + /* Belt and braces, probably redundant */ + bgp_notify_send(peer, BGP_NOTIFY_CEASE, + BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN); + } else bgp_notify_send(peer, BGP_NOTIFY_CEASE, BGP_NOTIFY_CEASE_ADMIN_RESET); |