summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpaulo <paul@bayleaf.org.uk>2010-02-05 10:15:52 +0000
committerpaulo <paul@bayleaf.org.uk>2010-02-05 10:15:52 +0000
commitc751ea18005633ceac54cf7415147e04adb19cb5 (patch)
tree4b66e1c8b44680e10652790e3eb2fbd718d2940f
parent4b2c10c2f5c483c7e6f9a8007a6f09acb7fcaf6b (diff)
downloadquagga-c751ea18005633ceac54cf7415147e04adb19cb5.tar.bz2
quagga-c751ea18005633ceac54cf7415147e04adb19cb5.tar.xz
Fixed shutdown. Centralized the testing of whether the session can be
enabled in bgp_peer_enable. Added belt and braces notify in bgp_terminate after setting the SHUTDOWN flag, which should send the notify itself.
-rw-r--r--bgpd/bgp_peer.c23
-rw-r--r--bgpd/bgp_route.c5
-rw-r--r--bgpd/bgpd.c14
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);