setsockopt_so_recvbuf(fd, bm->socket_buffer);
}
+static const char *bgp_peer_active2str(enum bgp_peer_active active)
+{
+ switch (active) {
+ case BGP_PEER_ACTIVE:
+ return "active";
+ case BGP_PEER_CONNECTION_UNSPECIFIED:
+ return "unspecified connection";
+ case BGP_PEER_BFD_DOWN:
+ return "BFD down";
+ case BGP_PEER_AF_UNCONFIGURED:
+ return "no AF activated";
+ }
+
+ assert(!"We should never get here this is a dev escape");
+ return "ERROR";
+}
+
/* Accept bgp connection. */
static void bgp_accept(struct event *thread)
{
struct peer_connection *connection, *incoming;
char buf[SU_ADDRSTRLEN];
struct bgp *bgp = NULL;
+ enum bgp_peer_active active;
sockunion_init(&su);
bgp_fsm_change_status(incoming, Active);
EVENT_OFF(incoming->t_start);
- if (peer_active(incoming)) {
+ if (peer_active(incoming) == BGP_PEER_ACTIVE) {
if (CHECK_FLAG(dynamic_peer->flags, PEER_FLAG_TIMER_DELAYOPEN))
BGP_EVENT_ADD(incoming, TCP_connection_open_w_delay);
else
}
/* Check that at least one AF is activated for the peer. */
- if (!peer_active(connection)) {
+ active = peer_active(connection);
+ if (active != BGP_PEER_ACTIVE) {
if (bgp_debug_neighbor_events(peer))
- zlog_debug("%s - incoming conn rejected - no AF activated for peer",
- peer->host);
+ zlog_debug("%s - incoming conn rejected - %s", peer->host,
+ bgp_peer_active2str(active));
close(bgp_sock);
return;
}
bgp_event_update(connection, TCP_connection_closed);
}
- if (peer_active(incoming)) {
+ if (peer_active(incoming) == BGP_PEER_ACTIVE) {
if (CHECK_FLAG(doppelganger->flags, PEER_FLAG_TIMER_DELAYOPEN))
BGP_EVENT_ADD(incoming, TCP_connection_open_w_delay);
else
enum peer_asn_type as_type, struct peer_group *group,
bool config_node, const char *as_str)
{
- int active;
+ enum bgp_peer_active active;
struct peer *peer;
char buf[SU_ADDRSTRLEN];
afi_t afi;
}
active = peer_active(peer->connection);
- if (!active) {
+ if (active != BGP_PEER_ACTIVE) {
if (peer->connection->su.sa.sa_family == AF_UNSPEC)
peer->last_reset = PEER_DOWN_NBR_ADDR;
else
if (bgp->autoshutdown)
peer_flag_set(peer, PEER_FLAG_SHUTDOWN);
/* Set up peer's events and timers. */
- else if (!active && peer_active(peer->connection)) {
+ else if (active != BGP_PEER_ACTIVE && peer_active(peer->connection) == BGP_PEER_ACTIVE) {
if (peer->last_reset == PEER_DOWN_NOAFI_ACTIVATED)
peer->last_reset = 0;
bgp_timer_set(peer->connection);
static int peer_activate_af(struct peer *peer, afi_t afi, safi_t safi)
{
- int active;
+ enum bgp_peer_active active;
struct peer *other;
if (CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
if (peer->group)
peer_group2peer_config_copy_af(peer->group, peer, afi, safi);
- if (!active && peer_active(peer->connection)) {
+ if (active != BGP_PEER_ACTIVE && peer_active(peer->connection) == BGP_PEER_ACTIVE) {
bgp_timer_set(peer->connection);
} else {
peer->last_reset = PEER_DOWN_AF_ACTIVATE;
}
/* Set up peer's events and timers. */
- if (peer_active(peer->connection))
+ if (peer_active(peer->connection) == BGP_PEER_ACTIVE)
bgp_timer_set(peer->connection);
}
}
/* If peer is configured at least one address family return 1. */
-bool peer_active(struct peer_connection *connection)
+enum bgp_peer_active peer_active(struct peer_connection *connection)
{
struct peer *peer = connection->peer;
if (BGP_CONNECTION_SU_UNSPEC(connection))
- return false;
+ return BGP_PEER_CONNECTION_UNSPECIFIED;
if (peer->bfd_config) {
if (bfd_session_is_down(peer->bfd_config->session))
- return false;
+ return BGP_PEER_BFD_DOWN;
}
if (peer->afc[AFI_IP][SAFI_UNICAST] || peer->afc[AFI_IP][SAFI_MULTICAST]
|| peer->afc[AFI_IP6][SAFI_ENCAP]
|| peer->afc[AFI_IP6][SAFI_FLOWSPEC]
|| peer->afc[AFI_L2VPN][SAFI_EVPN])
- return true;
- return false;
+ return BGP_PEER_ACTIVE;
+
+ return BGP_PEER_AF_UNCONFIGURED;
}
/* If peer is negotiated at least one address family return 1. */
/* Skip peer-group mechanics for regular peers. */
if (!CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
if (!peer_established(peer->connection)) {
- if (peer_active(peer->connection))
+ if (peer_active(peer->connection) == BGP_PEER_ACTIVE)
BGP_EVENT_ADD(peer->connection, BGP_Stop);
BGP_EVENT_ADD(peer->connection, BGP_Start);
}
member->v_connect = connect;
if (!peer_established(member->connection)) {
- if (peer_active(member->connection))
+ if (peer_active(member->connection) == BGP_PEER_ACTIVE)
BGP_EVENT_ADD(member->connection, BGP_Stop);
BGP_EVENT_ADD(member->connection, BGP_Start);
}
/* Skip peer-group mechanics for regular peers. */
if (!CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
if (!peer_established(peer->connection)) {
- if (peer_active(peer->connection))
+ if (peer_active(peer->connection) == BGP_PEER_ACTIVE)
BGP_EVENT_ADD(peer->connection, BGP_Stop);
BGP_EVENT_ADD(peer->connection, BGP_Start);
}
member->v_connect = peer->bgp->default_connect_retry;
if (!peer_established(member->connection)) {
- if (peer_active(member->connection))
+ if (peer_active(member->connection) == BGP_PEER_ACTIVE)
BGP_EVENT_ADD(member->connection, BGP_Stop);
BGP_EVENT_ADD(member->connection, BGP_Start);
}
peer->host);
peer->shut_during_cfg = false;
- if (peer_active(peer->connection) && peer->connection->status != Established) {
+ if (peer_active(peer->connection) == BGP_PEER_ACTIVE &&
+ peer->connection->status != Established) {
if (peer->connection->status != Idle)
BGP_EVENT_ADD(peer->connection, BGP_Stop);
BGP_EVENT_ADD(peer->connection, BGP_Start);