struct peer *peer;
afi_t afi;
safi_t safi;
- int fd;
- enum bgp_fsm_status status, pstatus;
enum bgp_fsm_events last_evt, last_maj_evt;
+ struct peer_connection *keeper, *going_away;
assert(from_peer != NULL);
+ /*
+ * Keeper is the connection that is staying around
+ */
+ keeper = from_peer->connection;
peer = from_peer->doppelganger;
if (!peer || !CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE))
return from_peer;
+ /*
+ * from_peer is pointing at the non config node and
+ * at this point peer is pointing at the CONFIG node
+ * peer ( non incoming connection ). The going_away pointer
+ * is the connection that is being placed on to
+ * the non Config node for deletion.
+ */
+ going_away = peer->connection;
+
/*
* Let's check that we are not going to loose known configuration
* state based upon doppelganger rules.
from_peer->host, from_peer, from_peer->connection->fd,
peer, peer->connection->fd);
- bgp_writes_off(peer->connection);
- bgp_reads_off(peer->connection);
- bgp_writes_off(from_peer->connection);
- bgp_reads_off(from_peer->connection);
+ bgp_writes_off(going_away);
+ bgp_reads_off(going_away);
+ bgp_writes_off(keeper);
+ bgp_reads_off(keeper);
/*
* Before exchanging FD remove doppelganger from
* fd is set to -1. If blocked on lock then keepalive
* thread can access peer pointer with fd -1.
*/
- bgp_keepalives_off(from_peer->connection);
-
- EVENT_OFF(peer->connection->t_routeadv);
- EVENT_OFF(peer->connection->t_connect);
- EVENT_OFF(peer->connection->t_delayopen);
- EVENT_OFF(peer->connection->t_connect_check_r);
- EVENT_OFF(peer->connection->t_connect_check_w);
- EVENT_OFF(from_peer->connection->t_routeadv);
- EVENT_OFF(from_peer->connection->t_connect);
- EVENT_OFF(from_peer->connection->t_delayopen);
- EVENT_OFF(from_peer->connection->t_connect_check_r);
- EVENT_OFF(from_peer->connection->t_connect_check_w);
- EVENT_OFF(from_peer->connection->t_process_packet);
+ bgp_keepalives_off(keeper);
+
+ EVENT_OFF(going_away->t_routeadv);
+ EVENT_OFF(going_away->t_connect);
+ EVENT_OFF(going_away->t_delayopen);
+ EVENT_OFF(going_away->t_connect_check_r);
+ EVENT_OFF(going_away->t_connect_check_w);
+ EVENT_OFF(keeper->t_routeadv);
+ EVENT_OFF(keeper->t_connect);
+ EVENT_OFF(keeper->t_delayopen);
+ EVENT_OFF(keeper->t_connect_check_r);
+ EVENT_OFF(keeper->t_connect_check_w);
+ EVENT_OFF(keeper->t_process_packet);
/*
* At this point in time, it is possible that there are packets pending
* on various buffers. Those need to be transferred or dropped,
* otherwise we'll get spurious failures during session establishment.
*/
- frr_with_mutex (&peer->connection->io_mtx,
- &from_peer->connection->io_mtx) {
- fd = peer->connection->fd;
- peer->connection->fd = from_peer->connection->fd;
- from_peer->connection->fd = fd;
-
- stream_fifo_clean(peer->connection->ibuf);
- stream_fifo_clean(peer->connection->obuf);
-
- /*
- * this should never happen, since bgp_process_packet() is the
- * only task that sets and unsets the current packet and it
- * runs in our pthread.
- */
- if (peer->curr) {
- flog_err(
- EC_BGP_PKT_PROCESS,
- "[%s] Dropping pending packet on connection transfer:",
- peer->host);
- /* there used to be a bgp_packet_dump call here, but
- * that's extremely confusing since there's no way to
- * identify the packet in MRT dumps or BMP as dropped
- * due to connection transfer.
- */
- stream_free(peer->curr);
- peer->curr = NULL;
- }
-
- // copy each packet from old peer's output queue to new peer
- while (from_peer->connection->obuf->head)
- stream_fifo_push(peer->connection->obuf,
- stream_fifo_pop(
- from_peer->connection->obuf));
-
- // copy each packet from old peer's input queue to new peer
- while (from_peer->connection->ibuf->head)
- stream_fifo_push(peer->connection->ibuf,
- stream_fifo_pop(
- from_peer->connection->ibuf));
-
- ringbuf_wipe(peer->connection->ibuf_work);
- ringbuf_copy(peer->connection->ibuf_work,
- from_peer->connection->ibuf_work,
- ringbuf_remain(from_peer->connection->ibuf_work));
- }
+ peer->connection = keeper;
+ keeper->peer = peer;
+ from_peer->connection = going_away;
+ going_away->peer = from_peer;
peer->as = from_peer->as;
peer->v_holdtime = from_peer->v_holdtime;
peer->v_gr_restart = from_peer->v_gr_restart;
peer->cap = from_peer->cap;
peer->remote_role = from_peer->remote_role;
- status = peer->connection->status;
- pstatus = peer->connection->ostatus;
last_evt = peer->last_event;
last_maj_evt = peer->last_major_event;
- peer->connection->status = from_peer->connection->status;
- peer->connection->ostatus = from_peer->connection->ostatus;
peer->last_event = from_peer->last_event;
peer->last_major_event = from_peer->last_major_event;
- from_peer->connection->status = status;
- from_peer->connection->ostatus = pstatus;
from_peer->last_event = last_evt;
from_peer->last_major_event = last_maj_evt;
peer->remote_id = from_peer->remote_id;
(CHECK_FLAG(peer->sflags, PEER_STATUS_ACCEPT_PEER)
? "accept"
: ""),
- peer->host, peer->connection->fd,
- from_peer->connection->fd);
- BGP_EVENT_ADD(peer, BGP_Stop);
- BGP_EVENT_ADD(from_peer, BGP_Stop);
+ peer->host, going_away->fd, keeper->fd);
+ BGP_EVENT_ADD(going_away, BGP_Stop);
+ BGP_EVENT_ADD(keeper, BGP_Stop);
return NULL;
}
- if (from_peer->connection->status > Active) {
+ if (going_away->status > Active) {
if (bgp_getsockname(from_peer) < 0) {
flog_err(EC_LIB_SOCKET,
"%%bgp_getsockname() failed for %s from_peer %s fd %d (peer fd %d)",
PEER_STATUS_ACCEPT_PEER)
? "accept"
: ""),
- from_peer->host, from_peer->connection->fd,
- peer->connection->fd);
- bgp_stop(from_peer->connection);
+ from_peer->host, going_away->fd, keeper->fd);
+ bgp_stop(going_away);
from_peer = NULL;
}
}
if (from_peer)
bgp_replace_nexthop_by_peer(from_peer, peer);
- bgp_reads_on(peer->connection);
- bgp_writes_on(peer->connection);
- event_add_event(bm->master, bgp_process_packet, peer->connection, 0,
- &peer->connection->t_process_packet);
+ bgp_reads_on(keeper);
+ bgp_writes_on(keeper);
+ event_add_event(bm->master, bgp_process_packet, keeper, 0,
+ &keeper->t_process_packet);
return (peer);
}
and process event. */
static void bgp_start_timer(struct event *thread)
{
- struct peer *peer;
-
- peer = EVENT_ARG(thread);
+ struct peer_connection *connection = EVENT_ARG(thread);
+ struct peer *peer = connection->peer;
if (bgp_debug_neighbor_events(peer))
zlog_debug("%s [FSM] Timer (start timer expire).", peer->host);
/* BGP connect retry timer. */
static void bgp_connect_timer(struct event *thread)
{
- struct peer *peer;
-
- peer = EVENT_ARG(thread);
+ struct peer_connection *connection = EVENT_ARG(thread);
+ struct peer *peer = connection->peer;
/* stop the DelayOpenTimer if it is running */
- EVENT_OFF(peer->connection->t_delayopen);
+ EVENT_OFF(connection->t_delayopen);
- assert(!peer->connection->t_write);
- assert(!peer->connection->t_read);
+ assert(!connection->t_write);
+ assert(!connection->t_read);
if (bgp_debug_neighbor_events(peer))
zlog_debug("%s [FSM] Timer (connect timer expire)", peer->host);
if (CHECK_FLAG(peer->sflags, PEER_STATUS_ACCEPT_PEER))
- bgp_stop(peer->connection);
+ bgp_stop(connection);
else {
EVENT_VAL(thread) = ConnectRetry_timer_expired;
bgp_event(thread); /* bgp_event unlocks peer */
static void bgp_holdtime_timer(struct event *thread)
{
atomic_size_t inq_count;
- struct peer *peer;
-
- peer = EVENT_ARG(thread);
+ struct peer_connection *connection = EVENT_ARG(thread);
+ struct peer *peer = connection->peer;
if (bgp_debug_neighbor_events(peer))
zlog_debug("%s [FSM] Timer (holdtime timer expire)",
* for systems where we are heavily loaded for one
* reason or another.
*/
- inq_count = atomic_load_explicit(&peer->connection->ibuf->count,
+ inq_count = atomic_load_explicit(&connection->ibuf->count,
memory_order_relaxed);
if (inq_count)
- BGP_TIMER_ON(peer->connection->t_holdtime, bgp_holdtime_timer,
+ BGP_TIMER_ON(connection->t_holdtime, bgp_holdtime_timer,
peer->v_holdtime);
EVENT_VAL(thread) = Hold_Timer_expired;
void bgp_routeadv_timer(struct event *thread)
{
- struct peer *peer;
-
- peer = EVENT_ARG(thread);
+ struct peer_connection *connection = EVENT_ARG(thread);
+ struct peer *peer = connection->peer;
if (bgp_debug_neighbor_events(peer))
- zlog_debug("%s [FSM] Timer (routeadv timer expire)",
- peer->host);
+ zlog_debug("%s [FSM] Timer (routeadv timer expire)", peer->host);
peer->synctime = monotime(NULL);
- event_add_timer_msec(bm->master, bgp_generate_updgrp_packets, peer, 0,
- &peer->connection->t_generate_updgrp_packets);
+ event_add_timer_msec(bm->master, bgp_generate_updgrp_packets, connection,
+ 0, &connection->t_generate_updgrp_packets);
/* MRAI timer will be started again when FIFO is built, no need to
* do it here.
/* RFC 4271 DelayOpenTimer */
void bgp_delayopen_timer(struct event *thread)
{
- struct peer *peer;
-
- peer = EVENT_ARG(thread);
+ struct peer_connection *connection = EVENT_ARG(thread);
+ struct peer *peer = connection->peer;
if (bgp_debug_neighbor_events(peer))
zlog_debug("%s [FSM] Timer (DelayOpentimer expire)",
"Socket Error",
"Admin. shutdown (RTT)"};
-static void bgp_graceful_restart_timer_off(struct peer *peer)
+static void bgp_graceful_restart_timer_off(struct peer_connection *connection,
+ struct peer *peer)
{
afi_t afi;
safi_t safi;
return;
UNSET_FLAG(peer->sflags, PEER_STATUS_NSF_WAIT);
- EVENT_OFF(peer->connection->t_gr_stale);
+ EVENT_OFF(connection->t_gr_stale);
if (peer_dynamic_neighbor(peer) &&
!(CHECK_FLAG(peer->flags, PEER_FLAG_DELETE))) {
peer_delete(peer);
}
- bgp_timer_set(peer->connection);
+ bgp_timer_set(connection);
}
static void bgp_llgr_stale_timer_expire(struct event *thread)
bgp_clear_stale_route(peer, afi, safi);
- bgp_graceful_restart_timer_off(peer);
+ bgp_graceful_restart_timer_off(peer->connection, peer);
}
static void bgp_set_llgr_stale(struct peer *peer, afi_t afi, safi_t safi)
static void bgp_graceful_restart_timer_expire(struct event *thread)
{
- struct peer *peer, *tmp_peer;
+ struct peer_connection *connection = EVENT_ARG(thread);
+ struct peer *peer = connection->peer;
+ struct peer *tmp_peer;
struct listnode *node, *nnode;
struct peer_af *paf;
afi_t afi;
safi_t safi;
- peer = EVENT_ARG(thread);
-
if (bgp_debug_neighbor_events(peer)) {
zlog_debug("%pBP graceful restart timer expired", peer);
zlog_debug("%pBP graceful restart stalepath timer stopped",
}
}
- bgp_graceful_restart_timer_off(peer);
+ bgp_graceful_restart_timer_off(connection, peer);
}
static void bgp_graceful_stale_timer_expire(struct event *thread)
{
- struct peer *peer;
+ struct peer_connection *connection = EVENT_ARG(thread);
+ struct peer *peer = connection->peer;
afi_t afi;
safi_t safi;
- peer = EVENT_ARG(thread);
-
if (bgp_debug_neighbor_events(peer))
zlog_debug("%pBP graceful restart stalepath timer expired",
peer);
if (!peer_established(connection))
continue;
- EVENT_OFF(peer->connection->t_routeadv);
- BGP_TIMER_ON(peer->connection->t_routeadv, bgp_routeadv_timer,
- 0);
+
+ EVENT_OFF(connection->t_routeadv);
+ BGP_TIMER_ON(connection->t_routeadv, bgp_routeadv_timer, 0);
}
}
time_t nowtime = monotime(NULL);
double diff;
unsigned long remain;
+ struct peer_connection *connection = peer->connection;
/* Bypass checks for special case of MRAI being 0 */
if (peer->v_routeadv == 0) {
* different
* duration and schedule write thread immediately.
*/
- EVENT_OFF(peer->connection->t_routeadv);
+ EVENT_OFF(connection->t_routeadv);
peer->synctime = monotime(NULL);
/* If suppress fib pending is enabled, route is advertised to
* is added to update group packet generate which will allow
* more routes to be sent in the update message
*/
- BGP_UPDATE_GROUP_TIMER_ON(&peer->connection
- ->t_generate_updgrp_packets,
+ BGP_UPDATE_GROUP_TIMER_ON(&connection->t_generate_updgrp_packets,
bgp_generate_updgrp_packets);
return;
}
*/
diff = difftime(nowtime, peer->last_update);
if (diff > (double)peer->v_routeadv) {
- EVENT_OFF(peer->connection->t_routeadv);
- BGP_TIMER_ON(peer->connection->t_routeadv, bgp_routeadv_timer,
- 0);
+ EVENT_OFF(connection->t_routeadv);
+ BGP_TIMER_ON(connection->t_routeadv, bgp_routeadv_timer, 0);
return;
}
*
* (MRAI - m) < r
*/
- if (peer->connection->t_routeadv)
- remain = event_timer_remain_second(peer->connection->t_routeadv);
+ if (connection->t_routeadv)
+ remain = event_timer_remain_second(connection->t_routeadv);
else
remain = peer->v_routeadv;
diff = peer->v_routeadv - diff;
if (diff <= (double)remain) {
- EVENT_OFF(peer->connection->t_routeadv);
- BGP_TIMER_ON(peer->connection->t_routeadv, bgp_routeadv_timer,
- diff);
+ EVENT_OFF(connection->t_routeadv);
+ BGP_TIMER_ON(connection->t_routeadv, bgp_routeadv_timer, diff);
}
}
/* Called after event occurred, this function change status and reset
read/write and timer thread. */
-void bgp_fsm_change_status(struct peer *peer, enum bgp_fsm_status status)
+void bgp_fsm_change_status(struct peer_connection *connection,
+ enum bgp_fsm_status status)
{
- struct bgp *bgp;
+ struct peer *peer = connection->peer;
+ struct bgp *bgp = peer->bgp;
uint32_t peer_count;
- bgp = peer->bgp;
peer_count = bgp->established_peers;
if (status == Established)
bgp->established_peers++;
- else if ((peer_established(peer->connection)) && (status != Established))
+ else if ((peer_established(connection)) && (status != Established))
bgp->established_peers--;
if (bgp_debug_neighbor_events(peer)) {
*/
if (!work_queue_is_scheduled(peer->clear_node_queue) &&
status != Deleted)
- BGP_EVENT_ADD(peer, Clearing_Completed);
+ BGP_EVENT_ADD(connection, Clearing_Completed);
}
/* Preserve old status and change into new status. */
- peer->connection->ostatus = peer->connection->status;
- peer->connection->status = status;
+ connection->ostatus = connection->status;
+ connection->status = status;
/* Reset received keepalives counter on every FSM change */
peer->rtt_keepalive_rcv = 0;
/* Fire backward transition hook if that's the case */
- if (peer->connection->ostatus == Established &&
- peer->connection->status != Established)
+ if (connection->ostatus == Established &&
+ connection->status != Established)
hook_call(peer_backward_transition, peer);
/* Save event that caused status change. */
if (bgp_debug_neighbor_events(peer))
zlog_debug("%s fd %d went from %s to %s", peer->host,
- peer->connection->fd,
- lookup_msg(bgp_status_msg, peer->connection->ostatus,
- NULL),
- lookup_msg(bgp_status_msg, peer->connection->status,
- NULL));
+ connection->fd,
+ lookup_msg(bgp_status_msg, connection->ostatus, NULL),
+ lookup_msg(bgp_status_msg, connection->status, NULL));
}
/* Flush the event queue and ensure the peer is shut down */
static enum bgp_fsm_state_progress
bgp_clearing_completed(struct peer_connection *connection)
{
- struct peer *peer = connection->peer;
-
enum bgp_fsm_state_progress rc = bgp_stop(connection);
if (rc >= BGP_FSM_SUCCESS)
- event_cancel_event_ready(bm->master, peer);
+ event_cancel_event_ready(bm->master, connection);
return rc;
}
/* Can't do this in Clearing; events are used for state transitions */
if (connection->status != Clearing) {
/* Delete all existing events of the peer */
- event_cancel_event_ready(bm->master, peer);
+ event_cancel_event_ready(bm->master, connection);
}
/* Increment Dropped count. */
if (ret < 0) {
zlog_err("can't get sockopt for nonblocking connect: %d(%s)",
errno, safe_strerror(errno));
- BGP_EVENT_ADD(peer, TCP_fatal_error);
+ BGP_EVENT_ADD(peer->connection, TCP_fatal_error);
return;
}
/* When status is 0 then TCP connection is established. */
if (status == 0) {
if (CHECK_FLAG(peer->flags, PEER_FLAG_TIMER_DELAYOPEN))
- BGP_EVENT_ADD(peer, TCP_connection_open_w_delay);
+ BGP_EVENT_ADD(peer->connection,
+ TCP_connection_open_w_delay);
else
- BGP_EVENT_ADD(peer, TCP_connection_open);
+ BGP_EVENT_ADD(peer->connection, TCP_connection_open);
return;
} else {
if (bgp_debug_neighbor_events(peer))
zlog_debug("%s [Event] Connect failed %d(%s)",
peer->host, status, safe_strerror(status));
- BGP_EVENT_ADD(peer, TCP_connection_open_failed);
+ BGP_EVENT_ADD(peer->connection, TCP_connection_open_failed);
return;
}
}
/* If the peer is passive mode, force to move to Active mode. */
if (CHECK_FLAG(peer->flags, PEER_FLAG_PASSIVE)) {
- BGP_EVENT_ADD(peer, TCP_connection_open_failed);
+ BGP_EVENT_ADD(connection, TCP_connection_open_failed);
return BGP_FSM_SUCCESS;
}
"%s [FSM] Waiting for NHT, no path to neighbor present",
peer->host);
peer->last_reset = PEER_DOWN_WAITING_NHT;
- BGP_EVENT_ADD(peer, TCP_connection_open_failed);
+ BGP_EVENT_ADD(connection, TCP_connection_open_failed);
return BGP_FSM_SUCCESS;
}
}
case connect_error:
if (bgp_debug_neighbor_events(peer))
zlog_debug("%s [FSM] Connect error", peer->host);
- BGP_EVENT_ADD(peer, TCP_connection_open_failed);
+ BGP_EVENT_ADD(connection, TCP_connection_open_failed);
break;
case connect_success:
if (bgp_debug_neighbor_events(peer))
zlog_debug("%s [FSM] Connect immediately success, fd %d",
peer->host, connection->fd);
- BGP_EVENT_ADD(peer, TCP_connection_open);
+ BGP_EVENT_ADD(connection, TCP_connection_open);
break;
case connect_in_progress:
/* To check nonblocking connect, we wait until socket is
hash_alloc_intern);
return BGP_FSM_FAILURE;
}
+ /*
+ * At this point the connections have been possibly swapped
+ * let's reset it.
+ */
+ connection = peer->connection;
if (other == peer)
ret = BGP_FSM_SUCCESS_STATE_TRANSFER;
/* Increment established count. */
peer->established++;
- bgp_fsm_change_status(peer, Established);
+ bgp_fsm_change_status(connection, Established);
/* bgp log-neighbor-changes of neighbor Up */
if (CHECK_FLAG(peer->bgp->flags, BGP_FLAG_LOG_NEIGHBOR_CHANGES)) {
switch (peer->connection->status) {
case Idle:
if (has_valid_nexthops)
- BGP_EVENT_ADD(peer, BGP_Start);
+ BGP_EVENT_ADD(peer->connection, BGP_Start);
break;
case Connect:
if (!has_valid_nexthops) {
EVENT_OFF(peer->connection->t_connect);
- BGP_EVENT_ADD(peer, TCP_fatal_error);
+ BGP_EVENT_ADD(peer->connection, TCP_fatal_error);
}
break;
case Active:
if (has_valid_nexthops) {
EVENT_OFF(peer->connection->t_connect);
- BGP_EVENT_ADD(peer, ConnectRetry_timer_expired);
+ BGP_EVENT_ADD(peer->connection,
+ ConnectRetry_timer_expired);
}
break;
case OpenSent:
if (!has_valid_nexthops
&& (peer->gtsm_hops == BGP_GTSM_HOPS_CONNECTED
|| peer->bgp->fast_convergence))
- BGP_EVENT_ADD(peer, TCP_fatal_error);
+ BGP_EVENT_ADD(peer->connection, TCP_fatal_error);
case Clearing:
case Deleted:
case BGP_STATUS_MAX:
/* Execute event process. */
void bgp_event(struct event *thread)
{
+ struct peer_connection *connection = EVENT_ARG(thread);
enum bgp_fsm_events event;
- struct peer *peer;
+ struct peer *peer = connection->peer;
- peer = EVENT_ARG(thread);
event = EVENT_VAL(thread);
peer_lock(peer);
- bgp_event_update(peer, event);
+ bgp_event_update(connection, event);
peer_unlock(peer);
}
-int bgp_event_update(struct peer *peer, enum bgp_fsm_events event)
+int bgp_event_update(struct peer_connection *connection,
+ enum bgp_fsm_events event)
{
enum bgp_fsm_status next;
enum bgp_fsm_state_progress ret = 0;
int fsm_result = FSM_PEER_NOOP;
int passive_conn = 0;
int dyn_nbr;
- struct peer_connection *connection = peer->connection;
+ struct peer *peer = connection->peer;
passive_conn =
(CHECK_FLAG(peer->sflags, PEER_STATUS_ACCEPT_PEER)) ? 1 : 0;
dyn_nbr = peer_dynamic_neighbor(peer);
/* Logging this event. */
- next = FSM[peer->connection->status - 1][event - 1].next_state;
+ next = FSM[connection->status - 1][event - 1].next_state;
- if (bgp_debug_neighbor_events(peer) && peer->connection->status != next)
+ if (bgp_debug_neighbor_events(peer) && connection->status != next)
zlog_debug("%s [FSM] %s (%s->%s), fd %d", peer->host,
bgp_event_str[event],
- lookup_msg(bgp_status_msg, peer->connection->status,
- NULL),
+ lookup_msg(bgp_status_msg, connection->status, NULL),
lookup_msg(bgp_status_msg, next, NULL),
- peer->connection->fd);
+ connection->fd);
peer->last_event = peer->cur_event;
peer->cur_event = event;
/* Call function. */
- if (FSM[peer->connection->status - 1][event - 1].func)
- ret = (*(FSM[peer->connection->status - 1][event - 1].func))(
- peer->connection);
+ if (FSM[connection->status - 1][event - 1].func)
+ ret = (*(FSM[connection->status - 1][event - 1].func))(
+ connection);
switch (ret) {
case BGP_FSM_SUCCESS:
}
/* If status is changed. */
- if (next != peer->connection->status) {
- bgp_fsm_change_status(peer, next);
+ if (next != connection->status) {
+ bgp_fsm_change_status(connection, next);
/*
* If we're going to ESTABLISHED then we executed a
connection->fd,
peer_down_str[peer->last_reset]);
bgp_stop(connection);
- bgp_fsm_change_status(peer, Idle);
+ bgp_fsm_change_status(connection, Idle);
bgp_timer_set(connection);
}
fsm_result = FSM_PEER_STOPPED;
!(CHECK_FLAG(peer->doppelganger->flags, PEER_FLAG_CONFIG_NODE)))
peer_delete(peer->doppelganger);
- BGP_EVENT_ADD(peer, BGP_Stop);
+ BGP_EVENT_ADD(peer->connection, BGP_Stop);
}
/*
peer_delete(peer->doppelganger);
}
- BGP_EVENT_ADD(peer, BGP_Stop);
+ BGP_EVENT_ADD(peer->connection, BGP_Stop);
}
/* BGP global flag manipulation. */
bgp_timer_set(peer->connection);
bgp_reads_off(peer->connection);
bgp_writes_off(peer->connection);
- event_cancel_event_ready(bm->master, peer);
+ event_cancel_event_ready(bm->master, peer->connection);
FOREACH_AFI_SAFI (afi, safi)
EVENT_OFF(peer->t_revalidate_all[afi][safi]);
assert(!peer->connection->t_write);
assert(!peer->connection->t_read);
- event_cancel_event_ready(bm->master, peer);
+ event_cancel_event_ready(bm->master, peer->connection);
/* Free connected nexthop, if present */
if (CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE)
bgp_keepalives_off(peer->connection);
bgp_reads_off(peer->connection);
bgp_writes_off(peer->connection);
- event_cancel_event_ready(bm->master, peer);
+ event_cancel_event_ready(bm->master, peer->connection);
FOREACH_AFI_SAFI (afi, safi)
EVENT_OFF(peer->t_revalidate_all[afi][safi]);
assert(!CHECK_FLAG(peer->connection->thread_flags,
}
UNSET_FLAG(peer->sflags, PEER_STATUS_ACCEPT_PEER);
- bgp_fsm_change_status(peer, Deleted);
+ bgp_fsm_change_status(peer->connection, Deleted);
/* Remove from NHT */
if (CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE))
/* Kick off any peers that may have been configured. */
for (ALL_LIST_ELEMENTS(bgp->peer, node, next, peer)) {
if (!BGP_PEER_START_SUPPRESSED(peer))
- BGP_EVENT_ADD(peer, BGP_Start);
+ BGP_EVENT_ADD(peer->connection, BGP_Start);
}
/* Process any networks that have been configured. */
bgp_session_reset(peer);
} else {
peer->v_start = BGP_INIT_START_TIMER;
- BGP_EVENT_ADD(peer, BGP_Stop);
+ BGP_EVENT_ADD(peer->connection, BGP_Stop);
}
} else if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection->status)) {
if (flag == PEER_FLAG_DYNAMIC_CAPABILITY)
peer->v_start = BGP_INIT_START_TIMER;
/* trigger a RFC 4271 ManualStop event */
- BGP_EVENT_ADD(peer, BGP_Stop);
+ BGP_EVENT_ADD(peer->connection, BGP_Stop);
}
/* set the BGP instances shutdown flag */
if (!CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
if (!peer_established(peer->connection)) {
if (peer_active(peer))
- BGP_EVENT_ADD(peer, BGP_Stop);
- BGP_EVENT_ADD(peer, BGP_Start);
+ BGP_EVENT_ADD(peer->connection, BGP_Stop);
+ BGP_EVENT_ADD(peer->connection, BGP_Start);
}
return 0;
}
if (!peer_established(member->connection)) {
if (peer_active(member))
- BGP_EVENT_ADD(member, BGP_Stop);
- BGP_EVENT_ADD(member, BGP_Start);
+ BGP_EVENT_ADD(member->connection, BGP_Stop);
+ BGP_EVENT_ADD(member->connection, BGP_Start);
}
}
if (!CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
if (!peer_established(peer->connection)) {
if (peer_active(peer))
- BGP_EVENT_ADD(peer, BGP_Stop);
- BGP_EVENT_ADD(peer, BGP_Start);
+ BGP_EVENT_ADD(peer->connection, BGP_Stop);
+ BGP_EVENT_ADD(peer->connection, BGP_Start);
}
return 0;
}
if (!peer_established(member->connection)) {
if (peer_active(member))
- BGP_EVENT_ADD(member, BGP_Stop);
- BGP_EVENT_ADD(member, BGP_Start);
+ BGP_EVENT_ADD(member->connection, BGP_Stop);
+ BGP_EVENT_ADD(member->connection, BGP_Start);
}
}
bgp_notify_send(peer->connection, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
} else
- BGP_EVENT_ADD(peer, BGP_Stop);
+ BGP_EVENT_ADD(peer->connection, BGP_Stop);
/* Skip peer-group mechanics for regular peers. */
return 0;
"%pBP Maximum-prefix restart timer cancelled",
peer);
}
- BGP_EVENT_ADD(peer, BGP_Start);
+ BGP_EVENT_ADD(peer->connection, BGP_Start);
return true;
}
if (peer_active(peer) &&
peer->connection->status != Established) {
if (peer->connection->status != Idle)
- BGP_EVENT_ADD(peer, BGP_Stop);
- BGP_EVENT_ADD(peer, BGP_Start);
+ BGP_EVENT_ADD(peer->connection, BGP_Stop);
+ BGP_EVENT_ADD(peer->connection, BGP_Start);
}
}