summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bgpd/bgp_fsm.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/bgpd/bgp_fsm.c b/bgpd/bgp_fsm.c
index fcb7275c34..db68c918c0 100644
--- a/bgpd/bgp_fsm.c
+++ b/bgpd/bgp_fsm.c
@@ -1293,7 +1293,8 @@ void bgp_fsm_change_status(struct peer *peer, int status)
* Clearing
* (or Deleted).
*/
- if (!work_queue_is_scheduled(peer->clear_node_queue))
+ if (!work_queue_is_scheduled(peer->clear_node_queue) &&
+ status != Deleted)
BGP_EVENT_ADD(peer, Clearing_Completed);
}
@@ -1375,7 +1376,7 @@ int bgp_stop(struct peer *peer)
zlog_debug("%s (dynamic neighbor) deleted (%s)",
peer->host, __func__);
peer_delete(peer);
- return -1;
+ return -2;
}
/* Can't do this in Clearing; events are used for state transitions */
@@ -1584,7 +1585,7 @@ int bgp_stop(struct peer *peer)
if (!CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE)
&& !(CHECK_FLAG(peer->flags, PEER_FLAG_DELETE))) {
peer_delete(peer);
- ret = -1;
+ ret = -2;
} else {
bgp_peer_conf_if_to_su_update(peer);
}
@@ -2571,7 +2572,9 @@ void bgp_event(struct thread *thread)
peer = THREAD_ARG(thread);
event = THREAD_VAL(thread);
+ peer_lock(peer);
bgp_event_update(peer, event);
+ peer_unlock(peer);
}
int bgp_event_update(struct peer *peer, enum bgp_fsm_events event)
@@ -2641,7 +2644,7 @@ int bgp_event_update(struct peer *peer, enum bgp_fsm_events event)
* we need to indicate that the peer was stopped in the return
* code.
*/
- if (!dyn_nbr && !passive_conn && peer->bgp) {
+ if (!dyn_nbr && !passive_conn && peer->bgp && ret != -2) {
flog_err(
EC_BGP_FSM,
"%s [FSM] Failure handling event %s in state %s, prior events %s, %s, fd %d",