diff options
Diffstat (limited to 'bgpd/bgp_peer.c')
-rw-r--r-- | bgpd/bgp_peer.c | 52 |
1 files changed, 19 insertions, 33 deletions
diff --git a/bgpd/bgp_peer.c b/bgpd/bgp_peer.c index eeb39912..fc5ea7bf 100644 --- a/bgpd/bgp_peer.c +++ b/bgpd/bgp_peer.c @@ -301,7 +301,7 @@ bgp_session_has_stopped(bgp_peer peer) bgp_session session = peer->session ; assert(bgp_session_is_active(session)) ; - bgp_peer_reenable(peer, NULL); + bgp_peer_disable(peer, NULL); /* TODO: needs to deal with NOTIFICATION, if any ?? */ return 0; @@ -325,11 +325,18 @@ bgp_session_has_disabled(bgp_peer peer) mqueue_revoke(routing_nexus->queue, session) ; /* does the session need to be re-enabled? */ - if (session->defer_enable) + if (session->defer_enable || peer->state == bgp_peer_sIdle) { session->defer_enable = 0; bgp_session_enable(peer); } + else if (peer->state == bgp_peer_sEstablished) + { + /* disable the peer */ + bgp_peer_stop(peer); + bgp_clear_route_all(peer); + peer_change_status(peer, bgp_peer_sClearing); + } /* if the program is terminating then see if this was the last session * and if so ... die .... @@ -818,6 +825,7 @@ peer_delete (struct peer *peer) */ peer->last_reset = PEER_DOWN_NEIGHBOR_DELETE; bgp_peer_stop (peer); + bgp_clear_route_all (peer); peer_change_status (peer, bgp_peer_sDeleted); /* Password configuration */ @@ -985,22 +993,7 @@ peer_nsf_stop (struct peer *peer) bgp_clear_route_all (peer); } - -/* Disable then enable the peer. Sends notification. */ -void -bgp_peer_reenable(bgp_peer peer, bgp_notify notification) -{ - if (bgp_session_is_active(peer->session)) - { - bgp_peer_disable(peer, notification); - bgp_peer_enable(peer); /* may defer if still stopping */ - } - else - bgp_notify_free(notification) ; -} - /* enable the peer */ - void bgp_peer_enable(bgp_peer peer) { @@ -1009,33 +1002,26 @@ bgp_peer_enable(bgp_peer peer) } /* disable the peer - * sent notification, disable session, stop the peer + * sent notification, disable session */ void bgp_peer_disable(bgp_peer peer, bgp_notify notification) { - /* disable the session */ - bgp_session_disable(peer, notification); - - /* and the peer */ - bgp_peer_stop(peer); - if (peer->state == bgp_peer_sEstablished) - peer_change_status (peer, bgp_peer_sClearing); + if (bgp_session_is_active(peer->session)) + bgp_session_disable(peer, notification); + else + { + bgp_notify_free(notification) ; + bgp_peer_stop(peer); + } } -/* Called after event occurred, this function change status and reset - read/write and timer thread. */ +/* Called after event occurred, this function changes status */ void peer_change_status (bgp_peer peer, int status) { bgp_dump_state (peer, peer->state, status); - /* Transition into Clearing or Deleted must /always/ clear all routes.. - * (and must do so before actually changing into Deleted.. - */ - if (status >= bgp_peer_sClearing) - bgp_clear_route_all (peer); - /* Preserve old status and change into new status. */ peer->ostate = peer->state; peer->state = status; |