peer->last_reset = PEER_DOWN_BFD_DOWN;
/* rfc9384 */
- if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection.status))
bgp_notify_send(peer, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_BFD_DOWN);
if (!bmpbgp)
return 0;
- if (peer->status == Deleted) {
+ if (peer->connection.status == Deleted) {
bbpeer = bmp_bgp_peer_find(peer->qobj_node.nid);
if (bbpeer) {
XFREE(MTYPE_BMP_OPEN, bbpeer->open_rx);
}
/* Check if this peer just went to Established */
- if ((peer->ostatus != OpenConfirm) || !(peer_established(peer)))
+ if ((peer->connection.ostatus != OpenConfirm) ||
+ !(peer_established(peer)))
return 0;
- if (peer->doppelganger && (peer->doppelganger->status != Deleted)) {
+ if (peer->doppelganger &&
+ (peer->doppelganger->connection.status != Deleted)) {
bbpeer = bmp_bgp_peer_get(peer);
bbdopp = bmp_bgp_peer_find(peer->doppelganger->qobj_node.nid);
if (bbdopp) {
bgp_dump_all.type);
bgp_dump_common(obuf, peer, 1); /* force this in as4speak*/
- stream_putw(obuf, peer->ostatus);
- stream_putw(obuf, peer->status);
+ stream_putw(obuf, peer->connection.ostatus);
+ stream_putw(obuf, peer->connection.status);
/* Set length. */
bgp_dump_set_size(obuf, MSG_PROTOCOL_BGP4MP);
if (CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP))
continue;
- if (peer->status != Established)
+ if (peer->connection.status != Established)
continue;
if (CHECK_FLAG(peer->af_flags[afi][safi],
peer->v_gr_restart = from_peer->v_gr_restart;
peer->cap = from_peer->cap;
peer->remote_role = from_peer->remote_role;
- status = peer->status;
- pstatus = peer->ostatus;
+ status = peer->connection.status;
+ pstatus = peer->connection.ostatus;
last_evt = peer->last_event;
last_maj_evt = peer->last_major_event;
- peer->status = from_peer->status;
- peer->ostatus = from_peer->ostatus;
+ 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->status = status;
- from_peer->ostatus = pstatus;
+ 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;
BGP_EVENT_ADD(from_peer, BGP_Stop);
return NULL;
}
- if (from_peer->status > Active) {
+ if (from_peer->connection.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)",
afi_t afi;
safi_t safi;
- switch (peer->status) {
+ switch (peer->connection.status) {
case Idle:
/* First entry point of peer's finite state machine. In Idle
status start timer is on unless peer is shutdown or peer is
if (CHECK_FLAG(peer->cap, PEER_CAP_GRACEFUL_RESTART_R_BIT_RCV))
bgp_update_restarted_peers(peer);
}
- if (peer->ostatus == Established
- && bgp_update_delay_active(peer->bgp)) {
+ if (peer->connection.ostatus == Established &&
+ bgp_update_delay_active(peer->bgp)) {
/* Adjust the update-delay state to account for this flap.
NOTE: Intentionally skipping adjusting implicit_eors or
explicit_eors
}
/* Preserve old status and change into new status. */
- peer->ostatus = peer->status;
- peer->status = status;
+ peer->connection.ostatus = peer->connection.status;
+ peer->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->ostatus == Established && peer->status != Established)
+ if (peer->connection.ostatus == Established &&
+ peer->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->ostatus, NULL),
- lookup_msg(bgp_status_msg, peer->status, NULL));
+ lookup_msg(bgp_status_msg, peer->connection.ostatus,
+ NULL),
+ lookup_msg(bgp_status_msg, peer->connection.status,
+ NULL));
}
/* Flush the event queue and ensure the peer is shut down */
}
/* Can't do this in Clearing; events are used for state transitions */
- if (peer->status != Clearing) {
+ if (peer->connection.status != Clearing) {
/* Delete all existing events of the peer */
BGP_EVENT_FLUSH(peer);
}
/* Received ORF prefix-filter */
peer->orf_plist[afi][safi] = NULL;
- if ((peer->status == OpenConfirm) || (peer_established(peer))) {
+ if ((peer->connection.status == OpenConfirm) ||
+ peer_established(peer)) {
/* ORF received prefix-filter pnt */
snprintf(orf_name, sizeof(orf_name), "%s.%d.%d",
peer->host, afi, safi);
"%s: bgp_getsockname(): failed for peer %s, fd %d",
__func__, peer->host, peer->connection.fd);
bgp_notify_send(peer, BGP_NOTIFY_FSM_ERR,
- bgp_fsm_error_subcode(peer->status));
+ bgp_fsm_error_subcode(peer->connection.status));
bgp_writes_on(&peer->connection);
return BGP_FSM_FAILURE;
}
"%s: bgp_getsockname(): failed for peer %s, fd %d",
__func__, peer->host, peer->connection.fd);
bgp_notify_send(peer, BGP_NOTIFY_FSM_ERR,
- bgp_fsm_error_subcode(peer->status));
+ bgp_fsm_error_subcode(peer->connection.status));
bgp_writes_on(&peer->connection);
return BGP_FSM_FAILURE;
}
static enum bgp_fsm_state_progress bgp_fsm_open(struct peer *peer)
{
/* If DelayOpen is active, we may still need to send an open message */
- if ((peer->status == Connect) || (peer->status == Active))
+ if ((peer->connection.status == Connect) ||
+ (peer->connection.status == Active))
bgp_open_send(peer);
/* Send keepalive and make keepalive timer */
static enum bgp_fsm_state_progress bgp_fsm_event_error(struct peer *peer)
{
flog_err(EC_BGP_FSM, "%s [FSM] unexpected packet received in state %s",
- peer->host, lookup_msg(bgp_status_msg, peer->status, NULL));
+ peer->host,
+ lookup_msg(bgp_status_msg, peer->connection.status, NULL));
return bgp_stop_with_notify(peer, BGP_NOTIFY_FSM_ERR,
- bgp_fsm_error_subcode(peer->status));
+ bgp_fsm_error_subcode(
+ peer->connection.status));
}
/* Hold timer expire. This is error of BGP connection. So cut the
BGP_TIMER_ON(peer->t_routeadv, bgp_routeadv_timer, 0);
}
- if (peer->doppelganger && (peer->doppelganger->status != Deleted)) {
+ if (peer->doppelganger &&
+ (peer->doppelganger->connection.status != Deleted)) {
if (bgp_debug_neighbor_events(peer))
zlog_debug(
"[Event] Deleting stub connection for peer %s",
peer->host);
- if (peer->doppelganger->status > Active)
+ if (peer->doppelganger->connection.status > Active)
bgp_notify_send(peer->doppelganger, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_COLLISION_RESOLUTION);
else
flog_err(EC_BGP_FSM,
"%s [FSM] Ignoring event %s in state %s, prior events %s, %s, fd %d",
peer->host, bgp_event_str[peer->cur_event],
- lookup_msg(bgp_status_msg, peer->status, NULL),
+ lookup_msg(bgp_status_msg, peer->connection.status, NULL),
bgp_event_str[peer->last_event],
bgp_event_str[peer->last_major_event], peer->connection.fd);
return BGP_FSM_SUCCESS;
flog_err(EC_BGP_FSM,
"%s [FSM] Unexpected event %s in state %s, prior events %s, %s, fd %d",
peer->host, bgp_event_str[peer->cur_event],
- lookup_msg(bgp_status_msg, peer->status, NULL),
+ lookup_msg(bgp_status_msg, peer->connection.status, NULL),
bgp_event_str[peer->last_event],
bgp_event_str[peer->last_major_event], peer->connection.fd);
return bgp_stop(peer);
if (!peer)
return;
- switch (peer->status) {
+ switch (peer->connection.status) {
case Idle:
if (has_valid_nexthops)
BGP_EVENT_ADD(peer, BGP_Start);
dyn_nbr = peer_dynamic_neighbor(peer);
/* Logging this event. */
- next = FSM[peer->status - 1][event - 1].next_state;
+ next = FSM[peer->connection.status - 1][event - 1].next_state;
- if (bgp_debug_neighbor_events(peer) && peer->status != next)
+ if (bgp_debug_neighbor_events(peer) && 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->status, NULL),
+ lookup_msg(bgp_status_msg, peer->connection.status,
+ NULL),
lookup_msg(bgp_status_msg, next, NULL),
peer->connection.fd);
peer->cur_event = event;
/* Call function. */
- if (FSM[peer->status - 1][event - 1].func)
- ret = (*(FSM[peer->status - 1][event - 1].func))(peer);
+ if (FSM[peer->connection.status - 1][event - 1].func)
+ ret = (*(FSM[peer->connection.status - 1][event - 1].func))(
+ peer);
if (ret >= BGP_FSM_SUCCESS) {
if (ret == BGP_FSM_SUCCESS_STATE_TRANSFER &&
}
/* If status is changed. */
- if (next != peer->status) {
+ if (next != peer->connection.status) {
bgp_fsm_change_status(peer, next);
/*
flog_err(EC_BGP_FSM,
"%s [FSM] Failure handling event %s in state %s, prior events %s, %s, fd %d, last reset: %s",
peer->host, bgp_event_str[peer->cur_event],
- lookup_msg(bgp_status_msg, peer->status, NULL),
+ lookup_msg(bgp_status_msg,
+ peer->connection.status, NULL),
bgp_event_str[peer->last_event],
bgp_event_str[peer->last_major_event],
peer->connection.fd,
/* Macro for BGP read, write and timer thread. */
#define BGP_TIMER_ON(T, F, V) \
do { \
- if ((peer->status != Deleted)) \
+ if ((peer->connection.status != Deleted)) \
event_add_timer(bm->master, (F), peer, (V), &(T)); \
} while (0)
-#define BGP_EVENT_ADD(P, E) \
- do { \
- if ((P)->status != Deleted) \
- event_add_event(bm->master, bgp_event, (P), (E), \
- NULL); \
+#define BGP_EVENT_ADD(P, E) \
+ do { \
+ if ((P)->connection.status != Deleted) \
+ event_add_event(bm->master, bgp_event, (P), (E), NULL); \
} while (0)
#define BGP_EVENT_FLUSH(P) \
assert(fpt->running);
- assert(peer->status != Deleted);
+ assert(connection->status != Deleted);
assert(connection->obuf);
assert(connection->ibuf);
assert(connection->ibuf_work);
struct frr_pthread *fpt = bgp_pth_io;
assert(fpt->running);
- assert(peer->status != Deleted);
+ assert(connection->status != Deleted);
assert(connection->ibuf);
assert(connection->fd);
assert(connection->ibuf_work);
* Established and then the Clearing_Completed event is generated. Also,
* block incoming connection in Deleted state.
*/
- if (peer1->status == Clearing || peer1->status == Deleted) {
+ if (peer1->connection.status == Clearing ||
+ peer1->connection.status == Deleted) {
if (bgp_debug_neighbor_events(peer1))
- zlog_debug(
- "[Event] Closing incoming conn for %s (%p) state %d",
- peer1->host, peer1, peer1->status);
+ zlog_debug("[Event] Closing incoming conn for %s (%p) state %d",
+ peer1->host, peer1, peer1->connection.status);
close(bgp_sock);
return;
}
if (bgp_debug_neighbor_events(peer1))
zlog_debug("[Event] connection from %s fd %d, active peer status %d fd %d",
- inet_sutop(&su, buf), bgp_sock, peer1->status,
- peer1->connection.fd);
+ inet_sutop(&su, buf), bgp_sock,
+ peer1->connection.status, peer1->connection.fd);
if (peer1->doppelganger) {
/* We have an existing connection. Kill the existing one and run
* states. Note that a peer GR is handled by closing the existing
* connection upon receipt of new one.
*/
- if (peer_established(peer) || peer->status == Clearing) {
+ if (peer_established(peer) || peer->connection.status == Clearing) {
bgp_notify_send(new, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_COLLISION_RESOLUTION);
return -1;
}
- if ((peer->status != OpenConfirm) && (peer->status != OpenSent))
+ if ((peer->connection.status != OpenConfirm) &&
+ (peer->connection.status != OpenSent))
return 0;
/*
* Side effects
* ------------
* - May send NOTIFY messages
- * - May not modify peer->status
+ * - May not modify peer->connection.status
* - May not call bgp_event_update()
*/
flog_err(EC_BGP_INVALID_STATUS,
"%s [FSM] Update packet received under status %s",
peer->host,
- lookup_msg(bgp_status_msg, peer->status, NULL));
+ lookup_msg(bgp_status_msg, peer->connection.status,
+ NULL));
bgp_notify_send(peer, BGP_NOTIFY_FSM_ERR,
- bgp_fsm_error_subcode(peer->status));
+ bgp_fsm_error_subcode(peer->connection.status));
return BGP_Stop;
}
/* Status must be Established. */
if (!peer_established(peer)) {
- flog_err(
- EC_BGP_INVALID_STATUS,
- "%s [Error] Route refresh packet received under status %s",
- peer->host,
- lookup_msg(bgp_status_msg, peer->status, NULL));
+ flog_err(EC_BGP_INVALID_STATUS,
+ "%s [Error] Route refresh packet received under status %s",
+ peer->host,
+ lookup_msg(bgp_status_msg, peer->connection.status,
+ NULL));
bgp_notify_send(peer, BGP_NOTIFY_FSM_ERR,
- bgp_fsm_error_subcode(peer->status));
+ bgp_fsm_error_subcode(peer->connection.status));
return BGP_Stop;
}
/* Status must be Established. */
if (!peer_established(peer)) {
- flog_err(
- EC_BGP_NO_CAP,
- "%s [Error] Dynamic capability packet received under status %s",
- peer->host,
- lookup_msg(bgp_status_msg, peer->status, NULL));
+ flog_err(EC_BGP_NO_CAP,
+ "%s [Error] Dynamic capability packet received under status %s",
+ peer->host,
+ lookup_msg(bgp_status_msg, peer->connection.status,
+ NULL));
bgp_notify_send(peer, BGP_NOTIFY_FSM_ERR,
- bgp_fsm_error_subcode(peer->status));
+ bgp_fsm_error_subcode(peer->connection.status));
return BGP_Stop;
}
fsm_update_result = 0;
/* Guard against scheduled events that occur after peer deletion. */
- if (peer->status == Deleted || peer->status == Clearing)
+ if (peer->connection.status == Deleted ||
+ peer->connection.status == Clearing)
return;
unsigned int processed = 0;
continue;
if (BGP_PATH_HOLDDOWN(pi2))
continue;
- if (pi2->peer != bgp->peer_self
- && !CHECK_FLAG(
- pi2->peer->sflags,
- PEER_STATUS_NSF_WAIT))
- if (pi2->peer->status
- != Established)
- continue;
+ if (pi2->peer != bgp->peer_self &&
+ !CHECK_FLAG(pi2->peer->sflags,
+ PEER_STATUS_NSF_WAIT) &&
+ !peer_established(pi2->peer))
+ continue;
if (!aspath_cmp_left(pi1->attr->aspath,
pi2->attr->aspath)
lua_setfield(L, -2, "remote_id");
lua_pushinaddr(L, &peer->local_id);
lua_setfield(L, -2, "local_id");
- lua_pushstring(L, lookup_msg(bgp_status_msg, peer->status, NULL));
+ lua_pushstring(L, lookup_msg(bgp_status_msg, peer->connection.status,
+ NULL));
lua_setfield(L, -2, "state");
lua_pushstring(L, peer->desc ? peer->desc : "");
lua_setfield(L, -2, "description");
case BGPPEERIDENTIFIER:
return SNMP_IPADDRESS(peer->remote_id);
case BGPPEERSTATE:
- return SNMP_INTEGER(peer->status);
+ return SNMP_INTEGER(peer->connection.status);
case BGPPEERADMINSTATUS:
*write_method = write_bgpPeerTable;
#define BGP_PeerAdmin_stop 1
oid index[sizeof(oid) * IN_ADDR_SIZE];
/* Check if this peer just went to Established */
- if ((peer->ostatus != OpenConfirm) || !(peer_established(peer)))
+ if ((peer->connection.ostatus != OpenConfirm) ||
+ !(peer_established(peer)))
return 0;
ret = inet_aton(peer->host, &addr);
else
return SNMP_INTEGER(BGP_PEER_ADMIN_STATUS_RUNNING);
case BGP4V2_PEER_STATE:
- return SNMP_INTEGER(peer->status);
+ return SNMP_INTEGER(peer->connection.status);
case BGP4V2_PEER_DESCRIPTION:
if (peer->desc)
return SNMP_STRING(peer->desc);
* with aspath containing AS_SET or AS_CONFED_SET.
*/
for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
- if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status)) {
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection.status)) {
peer->last_reset = PEER_DOWN_AS_SETS_REJECT;
bgp_notify_send(peer, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
* with aspath containing AS_SET or AS_CONFED_SET.
*/
for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
- if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status)) {
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection.status)) {
peer->last_reset = PEER_DOWN_AS_SETS_REJECT;
bgp_notify_send(peer, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_flag_unset(peer, PEER_FLAG_IFPEER_V6ONLY);
/* v6only flag changed. Reset bgp seesion */
- if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status)) {
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection.status)) {
peer->last_reset = PEER_DOWN_V6ONLY_CHANGE;
bgp_notify_send(peer, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer_notify_unconfig(peer);
peer_delete(peer);
- if (other && other->status != Deleted) {
+ if (other && other->connection.status != Deleted) {
peer_notify_unconfig(other);
peer_delete(other);
}
json_object_string_add(
json_peer, "state",
lookup_msg(bgp_status_msg,
- peer->status, NULL));
+ peer->connection.status,
+ NULL));
else if (CHECK_FLAG(
peer->sflags,
PEER_STATUS_PREFIX_OVERFLOW))
json_object_string_add(
json_peer, "state",
lookup_msg(bgp_status_msg,
- peer->status, NULL));
+ peer->connection.status,
+ NULL));
/* BGP peer state */
if (CHECK_FLAG(peer->flags, PEER_FLAG_SHUTDOWN)
else
vty_out(vty, " %12s",
lookup_msg(bgp_status_msg,
- peer->status, NULL));
+ peer->connection
+ .status,
+ NULL));
vty_out(vty, " %8u", 0);
}
"nbrCommonAdmin");
/* Status. */
- json_object_string_add(
- json_neigh, "bgpState",
- lookup_msg(bgp_status_msg, p->status, NULL));
+ json_object_string_add(json_neigh, "bgpState",
+ lookup_msg(bgp_status_msg,
+ p->connection.status, NULL));
if (peer_established(p)) {
time_t uptime;
json_object_int_add(json_neigh,
"bgpTimerUpEstablishedEpoch",
epoch_tbuf);
- }
-
- else if (p->status == Active) {
+ } else if (p->connection.status == Active) {
if (CHECK_FLAG(p->flags, PEER_FLAG_PASSIVE))
json_object_string_add(json_neigh, "bgpStateIs",
"passive");
/* Status. */
vty_out(vty, " BGP state = %s",
- lookup_msg(bgp_status_msg, p->status, NULL));
+ lookup_msg(bgp_status_msg, p->connection.status, NULL));
if (peer_established(p))
vty_out(vty, ", up for %8s",
peer_uptime(p->uptime, timebuf, BGP_UPTIME_LEN,
0, NULL));
-
- else if (p->status == Active) {
+ else if (p->connection.status == Active) {
if (CHECK_FLAG(p->flags, PEER_FLAG_PASSIVE))
vty_out(vty, " (passive)");
else if (CHECK_FLAG(p->sflags, PEER_STATUS_NSF_WAIT))
peer_status = "Idle (PfxCt)";
else
peer_status = lookup_msg(bgp_status_msg,
- peer->status, NULL);
+ peer->connection.status,
+ NULL);
dynamic = peer_dynamic_neighbor(peer);
void bgp_session_reset(struct peer *peer)
{
- if (peer->doppelganger && (peer->doppelganger->status != Deleted)
- && !(CHECK_FLAG(peer->doppelganger->flags, PEER_FLAG_CONFIG_NODE)))
+ if (peer->doppelganger &&
+ (peer->doppelganger->connection.status != Deleted) &&
+ !(CHECK_FLAG(peer->doppelganger->flags, PEER_FLAG_CONFIG_NODE)))
peer_delete(peer->doppelganger);
BGP_EVENT_ADD(peer, BGP_Stop);
n = (nnode) ? *nnode : NULL;
npeer = (n) ? listgetdata(n) : NULL;
- if (peer->doppelganger && (peer->doppelganger->status != Deleted)
- && !(CHECK_FLAG(peer->doppelganger->flags,
- PEER_FLAG_CONFIG_NODE))) {
+ if (peer->doppelganger &&
+ (peer->doppelganger->connection.status != Deleted) &&
+ !(CHECK_FLAG(peer->doppelganger->flags, PEER_FLAG_CONFIG_NODE))) {
if (peer->doppelganger == npeer)
/* nnode and *nnode are confirmed to be non-NULL here */
*nnode = (*nnode)->next;
for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
IPV4_ADDR_COPY(&peer->local_id, id);
- if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status)) {
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection.status)) {
peer->last_reset = PEER_DOWN_RID_CHANGE;
bgp_notify_send(peer, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
if (peer->sort != BGP_PEER_IBGP)
continue;
- if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status)) {
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection.status)) {
peer->last_reset = PEER_DOWN_CLID_CHANGE;
bgp_notify_send(peer, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
if (peer->sort != BGP_PEER_IBGP)
continue;
- if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status)) {
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection.status)) {
peer->last_reset = PEER_DOWN_CLID_CHANGE;
bgp_notify_send(peer, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
if (ptype == BGP_PEER_EBGP) {
peer->local_as = as;
if (BGP_IS_VALID_STATE_FOR_NOTIF(
- peer->status)) {
+ peer->connection.status)) {
peer->last_reset =
PEER_DOWN_CONFED_ID_CHANGE;
bgp_notify_send(
if (ptype == BGP_PEER_EBGP)
peer->local_as = as;
if (BGP_IS_VALID_STATE_FOR_NOTIF(
- peer->status)) {
+ peer->connection.status)) {
peer->last_reset =
PEER_DOWN_CONFED_ID_CHANGE;
bgp_notify_send(
/* We're looking for peers who's AS is not local */
if (peer_sort(peer) != BGP_PEER_IBGP) {
peer->local_as = bgp->as;
- if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status)) {
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(
+ peer->connection.status)) {
peer->last_reset = PEER_DOWN_CONFED_ID_CHANGE;
bgp_notify_send(peer, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
peer->local_as = bgp->as;
(void)peer_sort(peer);
if (BGP_IS_VALID_STATE_FOR_NOTIF(
- peer->status)) {
+ peer->connection.status)) {
peer->last_reset =
PEER_DOWN_CONFED_PEER_CHANGE;
bgp_notify_send(
peer->local_as = bgp->confed_id;
(void)peer_sort(peer);
if (BGP_IS_VALID_STATE_FOR_NOTIF(
- peer->status)) {
+ peer->connection.status)) {
peer->last_reset =
PEER_DOWN_CONFED_PEER_CHANGE;
bgp_notify_send(
afi_t afi;
safi_t safi;
- assert(peer->status == Deleted);
+ assert(peer->connection.status == Deleted);
QOBJ_UNREG(peer);
/* Set default value. */
peer->v_start = BGP_INIT_START_TIMER;
peer->v_connect = bgp->default_connect_retry;
- peer->status = Idle;
- peer->ostatus = Idle;
+ peer->connection.status = Idle;
+ peer->connection.ostatus = Idle;
peer->cur_event = peer->last_event = peer->last_major_event = 0;
peer->bgp = bgp_lock(bgp);
peer = peer_lock(peer); /* initial reference */
/* Stop peer. */
if (!CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
- if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status)) {
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection.status)) {
peer->last_reset = PEER_DOWN_REMOTE_AS_CHANGE;
bgp_notify_send(peer, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
}
}
- if (peer->status == OpenSent || peer->status == OpenConfirm) {
+ if (peer->connection.status == OpenSent ||
+ peer->connection.status == OpenConfirm) {
peer->last_reset = PEER_DOWN_AF_ACTIVATE;
bgp_notify_send(peer, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
* activation.
*/
other = peer->doppelganger;
- if (other
- && (other->status == OpenSent
- || other->status == OpenConfirm)) {
+ if (other && (other->connection.status == OpenSent ||
+ other->connection.status == OpenConfirm)) {
other->last_reset = PEER_DOWN_AF_ACTIVATE;
bgp_notify_send(other, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
struct listnode *pn;
int accept_peer;
- assert(peer->status != Deleted);
+ assert(peer->connection.status != Deleted);
bgp = peer->bgp;
accept_peer = CHECK_FLAG(peer->sflags, PEER_STATUS_ACCEPT_PEER);
void peer_notify_unconfig(struct peer *peer)
{
- if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection.status))
bgp_notify_send(peer, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_PEER_UNCONFIG);
}
return;
}
- if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection.status))
bgp_notify_send(peer, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN);
}
for (ALL_LIST_ELEMENTS(group->peer, node, nnode, peer)) {
other = peer->doppelganger;
- if (other && other->status != Deleted) {
+ if (other && other->connection.status != Deleted) {
other->group = NULL;
peer_notify_unconfig(other);
} else
bgp_zebra_terminate_radv(bgp, peer);
peer_delete(peer);
- if (other && other->status != Deleted) {
+ if (other && other->connection.status != Deleted) {
other->group = NULL;
peer_delete(other);
}
peer_delete(peer);
- if (other && other->status != Deleted) {
+ if (other && other->connection.status != Deleted) {
other->group = NULL;
peer_delete(other);
}
SET_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE);
- if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status)) {
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection.status)) {
peer->last_reset = PEER_DOWN_RMAP_BIND;
bgp_notify_send(peer, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
/* Bring down peers, so corresponding routes are purged. */
for (ALL_LIST_ELEMENTS(bgp->peer, node, next, peer)) {
- if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection.status))
bgp_notify_send(peer, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN);
else
if (type == peer_change_reset) {
/* If we're resetting session, we've to delete both peer struct
*/
- if ((peer->doppelganger)
- && (peer->doppelganger->status != Deleted)
- && (!CHECK_FLAG(peer->doppelganger->flags,
- PEER_FLAG_CONFIG_NODE)))
+ if ((peer->doppelganger) &&
+ (peer->doppelganger->connection.status != Deleted) &&
+ (!CHECK_FLAG(peer->doppelganger->flags,
+ PEER_FLAG_CONFIG_NODE)))
peer_delete(peer->doppelganger);
bgp_notify_send(peer, BGP_NOTIFY_CEASE,
bgp_route_refresh_send(peer, afi, safi, 0, 0, 0,
BGP_ROUTE_REFRESH_NORMAL);
else {
- if ((peer->doppelganger)
- && (peer->doppelganger->status != Deleted)
- && (!CHECK_FLAG(peer->doppelganger->flags,
- PEER_FLAG_CONFIG_NODE)))
+ if ((peer->doppelganger) &&
+ (peer->doppelganger->connection.status != Deleted) &&
+ (!CHECK_FLAG(peer->doppelganger->flags,
+ PEER_FLAG_CONFIG_NODE)))
peer_delete(peer->doppelganger);
bgp_notify_send(peer, BGP_NOTIFY_CEASE,
peer);
}
- if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status)) {
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(
+ peer->connection.status)) {
char *msg = peer->tx_shutdown_message;
size_t msglen;
uint8_t msgbuf[BGP_ADMIN_SHUTDOWN_MSG_LEN + 1];
peer->v_start = BGP_INIT_START_TIMER;
BGP_EVENT_ADD(peer, BGP_Stop);
}
- } else if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status)) {
+ } else if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection.status)) {
if (flag == PEER_FLAG_DYNAMIC_CAPABILITY)
peer->last_reset = PEER_DOWN_CAPABILITY_CHANGE;
else if (flag == PEER_FLAG_PASSIVE)
continue;
/* send a RFC 4486 notification message if necessary */
- if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status)) {
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection.status)) {
if (msg) {
size_t datalen = strlen(msg);
if (!CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
if (peer->sort != BGP_PEER_IBGP) {
- if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection.status))
bgp_notify_send(peer, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
else
peer->ttl = group->conf->ttl;
- if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection.status))
bgp_notify_send(peer, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
else
peer->ttl = ttl;
if (!CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
- if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection.status))
bgp_notify_send(peer, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
else
peer->ttl = BGP_DEFAULT_TTL;
if (peer->connection.fd >= 0) {
- if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(
+ peer->connection.status))
bgp_notify_send(
peer, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
/* Check if handling a regular peer. */
if (!CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
/* Send notification or reset peer depending on state. */
- if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status)) {
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection.status)) {
peer->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
bgp_notify_send(peer, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
member->update_source = NULL;
/* Send notification or reset peer depending on state. */
- if (BGP_IS_VALID_STATE_FOR_NOTIF(member->status)) {
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(member->connection.status)) {
member->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
bgp_notify_send(member, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
/* Check if handling a regular peer. */
if (!CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
/* Send notification or reset peer depending on state. */
- if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status)) {
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection.status)) {
peer->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
bgp_notify_send(peer, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
XFREE(MTYPE_PEER_UPDATE_SOURCE, member->update_if);
/* Send notification or reset peer depending on state. */
- if (BGP_IS_VALID_STATE_FOR_NOTIF(member->status)) {
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(member->connection.status)) {
member->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
bgp_notify_send(member, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
/* Check if handling a regular peer. */
if (!CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
/* Send notification or reset peer depending on state. */
- if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status)) {
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection.status)) {
peer->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
bgp_notify_send(peer, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
XFREE(MTYPE_PEER_UPDATE_SOURCE, member->update_if);
/* Send notification or reset peer depending on state. */
- if (BGP_IS_VALID_STATE_FOR_NOTIF(member->status)) {
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(member->connection.status)) {
member->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
bgp_notify_send(member, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
/* Check if handling a regular peer. */
if (!CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
/* Send notification or stop peer depending on state. */
- if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status)) {
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection.status)) {
peer->last_reset = PEER_DOWN_LOCAL_AS_CHANGE;
bgp_notify_send(peer, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
XFREE(MTYPE_BGP, member->change_local_as_pretty);
/* Send notification or stop peer depending on state. */
- if (BGP_IS_VALID_STATE_FOR_NOTIF(member->status)) {
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(member->connection.status)) {
member->last_reset = PEER_DOWN_LOCAL_AS_CHANGE;
bgp_notify_send(member, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
/* Check if handling a regular peer. */
if (!CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
/* Send notification or reset peer depending on state. */
- if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection.status))
bgp_notify_send(peer, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
else
member->password = XSTRDUP(MTYPE_PEER_PASSWORD, password);
/* Send notification or reset peer depending on state. */
- if (BGP_IS_VALID_STATE_FOR_NOTIF(member->status))
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(member->connection.status))
bgp_notify_send(member, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
else
/* Check if handling a regular peer. */
if (!CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
/* Send notification or reset peer depending on state. */
- if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection.status))
bgp_notify_send(peer, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
else
XFREE(MTYPE_PEER_PASSWORD, member->password);
/* Send notification or reset peer depending on state. */
- if (BGP_IS_VALID_STATE_FOR_NOTIF(member->status))
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(member->connection.status))
bgp_notify_send(member, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
else
sockopt_minttl(peer->su.sa.sa_family,
peer->connection.fd,
MAXTTL + 1 - gtsm_hops);
- if ((peer->status < Established) && peer->doppelganger &&
+ if ((peer->connection.status < Established) &&
+ peer->doppelganger &&
(peer->doppelganger->connection.fd >= 0))
sockopt_minttl(peer->su.sa.sa_family,
peer->doppelganger->connection.fd,
gpeer->connection.fd,
MAXTTL + 1 -
gpeer->gtsm_hops);
- if ((gpeer->status < Established) &&
+ if ((gpeer->connection.status < Established) &&
gpeer->doppelganger &&
(gpeer->doppelganger->connection.fd >= 0))
sockopt_minttl(gpeer->su.sa.sa_family,
sockopt_minttl(peer->su.sa.sa_family,
peer->connection.fd, 0);
- if ((peer->status < Established) && peer->doppelganger &&
+ if ((peer->connection.status < Established) &&
+ peer->doppelganger &&
(peer->doppelganger->connection.fd >= 0))
sockopt_minttl(peer->su.sa.sa_family,
peer->doppelganger->connection.fd,
sockopt_minttl(peer->su.sa.sa_family,
peer->connection.fd, 0);
- if ((peer->status < Established) &&
+ if ((peer->connection.status < Established) &&
peer->doppelganger &&
(peer->doppelganger->connection.fd >= 0))
sockopt_minttl(peer->su.sa.sa_family,
return 0;
peer->v_start = BGP_INIT_START_TIMER;
- if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection.status))
bgp_notify_send(peer, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_ADMIN_RESET);
else
peer->host);
peer->shut_during_cfg = false;
- if (peer_active(peer) && peer->status != Established) {
- if (peer->status != Idle)
+ 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);
}
peer);
continue;
}
- if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
+ if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->connection.status))
bgp_notify_send(peer, BGP_NOTIFY_CEASE,
BGP_NOTIFY_CEASE_PEER_UNCONFIG);
}
struct peer_connection {
struct peer *peer;
+ /* Status of the peer connection. */
+ enum bgp_fsm_status status;
+ enum bgp_fsm_status ostatus;
+
int fd;
/* Packet receive and send buffer. */
/* the doppelganger peer structure, due to dual TCP conn setup */
struct peer *doppelganger;
- /* Status of the peer. */
- enum bgp_fsm_status status;
- enum bgp_fsm_status ostatus;
-
/* FSM events, stored for debug purposes.
* Note: uchar used for reduced memory usage.
*/
static inline bool peer_established(struct peer *peer)
{
- return peer->status == Established;
+ return peer->connection.status == Established;
}
static inline bool peer_dynamic_neighbor(struct peer *peer)
* Fill in BGP peer structure
*/
rfd->peer = peer_new(bgp);
- rfd->peer->status = Established; /* keep bgp core happy */
+ rfd->peer->connection.status = Established; /* keep bgp core happy */
bgp_peer_connection_buffers_free(&rfd->peer->connection);
* Same setup as in rfapi_open()
*/
vncHD1VR.peer = peer_new(bgp);
- vncHD1VR.peer->status =
+ vncHD1VR.peer->connection.status =
Established; /* keep bgp core happy */
bgp_peer_connection_buffers_free(
parse_test(peer, &opt_params[i++], OPT_PARAM);
SET_FLAG(peer->cap, PEER_CAP_DYNAMIC_ADV);
- peer->status = Established;
+ peer->connection.status = Established;
i = 0;
while (dynamic_cap_msgs[i].name)
peer = peer_create_accept(bgp);
peer->host = (char *)"foo";
- peer->status = Established;
+ peer->connection.status = Established;
peer->curr = stream_new(BGP_MAX_PACKET_SIZE);
ifp.ifindex = 0;
}
SET_FLAG(peer->cap, PEER_CAP_DYNAMIC_ADV);
- peer->status = Established;
+ peer->connection.status = Established;
peer->connection.fd = open(argv[1], O_RDONLY | O_NONBLOCK);
t.arg = peer;