* 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);
}
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 */
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);
}
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)
* 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",