summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bgpd/bgp_fsm.c101
-rw-r--r--bgpd/bgp_fsm.h2
-rw-r--r--bgpd/bgp_packet.c2
-rw-r--r--bgpd/bgpd.c12
4 files changed, 57 insertions, 60 deletions
diff --git a/bgpd/bgp_fsm.c b/bgpd/bgp_fsm.c
index 781c8aa1e2..c6e6f08d74 100644
--- a/bgpd/bgp_fsm.c
+++ b/bgpd/bgp_fsm.c
@@ -346,90 +346,90 @@ static struct peer *peer_xfer_conn(struct peer *from_peer)
/* Hook function called after bgp event is occered. And vty's
neighbor command invoke this function after making neighbor
structure. */
-void bgp_timer_set(struct peer *peer)
+void bgp_timer_set(struct peer_connection *connection)
{
afi_t afi;
safi_t safi;
+ struct peer *peer = connection->peer;
- switch (peer->connection->status) {
+ switch (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
inactive. All other timer must be turned off */
if (BGP_PEER_START_SUPPRESSED(peer) || !peer_active(peer)
|| peer->bgp->vrf_id == VRF_UNKNOWN) {
- EVENT_OFF(peer->connection->t_start);
+ EVENT_OFF(connection->t_start);
} else {
- BGP_TIMER_ON(peer->connection->t_start, bgp_start_timer,
+ BGP_TIMER_ON(connection->t_start, bgp_start_timer,
peer->v_start);
}
- EVENT_OFF(peer->connection->t_connect);
- EVENT_OFF(peer->connection->t_holdtime);
+ EVENT_OFF(connection->t_connect);
+ EVENT_OFF(connection->t_holdtime);
bgp_keepalives_off(peer);
- EVENT_OFF(peer->connection->t_routeadv);
- EVENT_OFF(peer->connection->t_delayopen);
+ EVENT_OFF(connection->t_routeadv);
+ EVENT_OFF(connection->t_delayopen);
break;
case Connect:
/* After start timer is expired, the peer moves to Connect
status. Make sure start timer is off and connect timer is
on. */
- EVENT_OFF(peer->connection->t_start);
+ EVENT_OFF(connection->t_start);
if (CHECK_FLAG(peer->flags, PEER_FLAG_TIMER_DELAYOPEN))
- BGP_TIMER_ON(peer->connection->t_connect,
- bgp_connect_timer,
+ BGP_TIMER_ON(connection->t_connect, bgp_connect_timer,
(peer->v_delayopen + peer->v_connect));
else
- BGP_TIMER_ON(peer->connection->t_connect,
- bgp_connect_timer, peer->v_connect);
+ BGP_TIMER_ON(connection->t_connect, bgp_connect_timer,
+ peer->v_connect);
- EVENT_OFF(peer->connection->t_holdtime);
+ EVENT_OFF(connection->t_holdtime);
bgp_keepalives_off(peer);
- EVENT_OFF(peer->connection->t_routeadv);
+ EVENT_OFF(connection->t_routeadv);
break;
case Active:
/* Active is waiting connection from remote peer. And if
connect timer is expired, change status to Connect. */
- EVENT_OFF(peer->connection->t_start);
+ EVENT_OFF(connection->t_start);
/* If peer is passive mode, do not set connect timer. */
if (CHECK_FLAG(peer->flags, PEER_FLAG_PASSIVE)
|| CHECK_FLAG(peer->sflags, PEER_STATUS_NSF_WAIT)) {
- EVENT_OFF(peer->connection->t_connect);
+ EVENT_OFF(connection->t_connect);
} else {
if (CHECK_FLAG(peer->flags, PEER_FLAG_TIMER_DELAYOPEN))
- BGP_TIMER_ON(peer->connection->t_connect,
+ BGP_TIMER_ON(connection->t_connect,
bgp_connect_timer,
(peer->v_delayopen +
peer->v_connect));
else
- BGP_TIMER_ON(peer->connection->t_connect,
+ BGP_TIMER_ON(connection->t_connect,
bgp_connect_timer, peer->v_connect);
}
- EVENT_OFF(peer->connection->t_holdtime);
+ EVENT_OFF(connection->t_holdtime);
bgp_keepalives_off(peer);
- EVENT_OFF(peer->connection->t_routeadv);
+ EVENT_OFF(connection->t_routeadv);
break;
case OpenSent:
/* OpenSent status. */
- EVENT_OFF(peer->connection->t_start);
- EVENT_OFF(peer->connection->t_connect);
+ EVENT_OFF(connection->t_start);
+ EVENT_OFF(connection->t_connect);
if (peer->v_holdtime != 0) {
- BGP_TIMER_ON(peer->connection->t_holdtime,
- bgp_holdtime_timer, peer->v_holdtime);
+ BGP_TIMER_ON(connection->t_holdtime, bgp_holdtime_timer,
+ peer->v_holdtime);
} else {
- EVENT_OFF(peer->connection->t_holdtime);
+ EVENT_OFF(connection->t_holdtime);
}
bgp_keepalives_off(peer);
- EVENT_OFF(peer->connection->t_routeadv);
- EVENT_OFF(peer->connection->t_delayopen);
+ EVENT_OFF(connection->t_routeadv);
+ EVENT_OFF(connection->t_delayopen);
break;
case OpenConfirm:
/* OpenConfirm status. */
- EVENT_OFF(peer->connection->t_start);
- EVENT_OFF(peer->connection->t_connect);
+ EVENT_OFF(connection->t_start);
+ EVENT_OFF(connection->t_connect);
/*
* If the negotiated Hold Time value is zero, then the Hold Time
@@ -437,24 +437,24 @@ void bgp_timer_set(struct peer *peer)
* Additionally if a different hold timer has been negotiated
* than we must stop then start the timer again
*/
- EVENT_OFF(peer->connection->t_holdtime);
+ EVENT_OFF(connection->t_holdtime);
if (peer->v_holdtime == 0)
bgp_keepalives_off(peer);
else {
- BGP_TIMER_ON(peer->connection->t_holdtime,
- bgp_holdtime_timer, peer->v_holdtime);
+ BGP_TIMER_ON(connection->t_holdtime, bgp_holdtime_timer,
+ peer->v_holdtime);
bgp_keepalives_on(peer);
}
- EVENT_OFF(peer->connection->t_routeadv);
- EVENT_OFF(peer->connection->t_delayopen);
+ EVENT_OFF(connection->t_routeadv);
+ EVENT_OFF(connection->t_delayopen);
break;
case Established:
/* In Established status start and connect timer is turned
off. */
- EVENT_OFF(peer->connection->t_start);
- EVENT_OFF(peer->connection->t_connect);
- EVENT_OFF(peer->connection->t_delayopen);
+ EVENT_OFF(connection->t_start);
+ EVENT_OFF(connection->t_connect);
+ EVENT_OFF(connection->t_delayopen);
/*
* Same as OpenConfirm, if holdtime is zero then both holdtime
@@ -462,12 +462,12 @@ void bgp_timer_set(struct peer *peer)
* Additionally if a different hold timer has been negotiated
* then we must stop then start the timer again
*/
- EVENT_OFF(peer->connection->t_holdtime);
+ EVENT_OFF(connection->t_holdtime);
if (peer->v_holdtime == 0)
bgp_keepalives_off(peer);
else {
- BGP_TIMER_ON(peer->connection->t_holdtime,
- bgp_holdtime_timer, peer->v_holdtime);
+ BGP_TIMER_ON(connection->t_holdtime, bgp_holdtime_timer,
+ peer->v_holdtime);
bgp_keepalives_on(peer);
}
break;
@@ -482,12 +482,12 @@ void bgp_timer_set(struct peer *peer)
EVENT_OFF(peer->t_refresh_stalepath);
/* fallthru */
case Clearing:
- EVENT_OFF(peer->connection->t_start);
- EVENT_OFF(peer->connection->t_connect);
- EVENT_OFF(peer->connection->t_holdtime);
+ EVENT_OFF(connection->t_start);
+ EVENT_OFF(connection->t_connect);
+ EVENT_OFF(connection->t_holdtime);
bgp_keepalives_off(peer);
- EVENT_OFF(peer->connection->t_routeadv);
- EVENT_OFF(peer->connection->t_delayopen);
+ EVENT_OFF(connection->t_routeadv);
+ EVENT_OFF(connection->t_delayopen);
break;
case BGP_STATUS_MAX:
flog_err(EC_LIB_DEVELOPMENT,
@@ -661,7 +661,7 @@ static void bgp_graceful_restart_timer_off(struct peer *peer)
peer_delete(peer);
}
- bgp_timer_set(peer);
+ bgp_timer_set(peer->connection);
}
static void bgp_llgr_stale_timer_expire(struct event *thread)
@@ -2637,12 +2637,10 @@ int bgp_event_update(struct peer *peer, enum bgp_fsm_events event)
enum bgp_fsm_status next;
enum bgp_fsm_state_progress ret = 0;
int fsm_result = FSM_PEER_NOOP;
- struct peer *other;
int passive_conn = 0;
int dyn_nbr;
struct peer_connection *connection = peer->connection;
- other = peer->doppelganger;
passive_conn =
(CHECK_FLAG(peer->sflags, PEER_STATUS_ACCEPT_PEER)) ? 1 : 0;
dyn_nbr = peer_dynamic_neighbor(peer);
@@ -2675,7 +2673,6 @@ int bgp_event_update(struct peer *peer, enum bgp_fsm_events event)
bgp_establish.
Update the peer pointer accordingly */
fsm_result = FSM_PEER_TRANSFERRED;
- peer = other;
}
/* If status is changed. */
@@ -2694,7 +2691,7 @@ int bgp_event_update(struct peer *peer, enum bgp_fsm_events event)
}
/* Make sure timer is set. */
- bgp_timer_set(peer);
+ bgp_timer_set(connection);
break;
case BGP_FSM_FAILURE:
/*
@@ -2717,7 +2714,7 @@ int bgp_event_update(struct peer *peer, enum bgp_fsm_events event)
peer_down_str[peer->last_reset]);
bgp_stop(connection);
bgp_fsm_change_status(peer, Idle);
- bgp_timer_set(peer);
+ bgp_timer_set(connection);
}
fsm_result = FSM_PEER_STOPPED;
break;
diff --git a/bgpd/bgp_fsm.h b/bgpd/bgp_fsm.h
index 0a36e0009e..0e2fbb2921 100644
--- a/bgpd/bgp_fsm.h
+++ b/bgpd/bgp_fsm.h
@@ -109,7 +109,7 @@ extern void bgp_fsm_nht_update(struct peer *peer, bool has_valid_nexthops);
extern void bgp_event(struct event *event);
extern int bgp_event_update(struct peer *, enum bgp_fsm_events event);
extern enum bgp_fsm_state_progress bgp_stop(struct peer_connection *connection);
-extern void bgp_timer_set(struct peer *);
+extern void bgp_timer_set(struct peer_connection *connection);
extern void bgp_routeadv_timer(struct event *event);
extern void bgp_fsm_change_status(struct peer *peer,
enum bgp_fsm_status status);
diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c
index e90593356e..00715baf13 100644
--- a/bgpd/bgp_packet.c
+++ b/bgpd/bgp_packet.c
@@ -1952,7 +1952,7 @@ static void bgp_refresh_stalepath_timer_expire(struct event *thread)
"%pBP route-refresh (BoRR) timer expired for afi/safi: %d/%d",
peer, afi, safi);
- bgp_timer_set(peer);
+ bgp_timer_set(peer->connection);
}
/**
diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c
index 1e18b1602c..ec66c5c405 100644
--- a/bgpd/bgpd.c
+++ b/bgpd/bgpd.c
@@ -1205,7 +1205,7 @@ static void peer_free(struct peer *peer)
/* this /ought/ to have been done already through bgp_stop earlier,
* but just to be sure..
*/
- bgp_timer_set(peer);
+ bgp_timer_set(peer->connection);
bgp_reads_off(peer->connection);
bgp_writes_off(peer->connection);
event_cancel_event_ready(bm->master, peer);
@@ -1920,7 +1920,7 @@ struct peer *peer_create(union sockunion *su, const char *conf_if,
peer_flag_set(peer, PEER_FLAG_SHUTDOWN);
/* Set up peer's events and timers. */
else if (!active && peer_active(peer))
- bgp_timer_set(peer);
+ bgp_timer_set(peer->connection);
bgp_peer_gr_flags_update(peer);
BGP_GR_ROUTER_DETECT_AND_SEND_CAPABILITY_TO_ZEBRA(bgp, bgp->peer);
@@ -2322,7 +2322,7 @@ static int peer_activate_af(struct peer *peer, afi_t afi, safi_t safi)
peer_group2peer_config_copy_af(peer->group, peer, afi, safi);
if (!active && peer_active(peer)) {
- bgp_timer_set(peer);
+ bgp_timer_set(peer->connection);
} else {
if (peer_established(peer)) {
if (CHECK_FLAG(peer->cap, PEER_CAP_DYNAMIC_RCV)) {
@@ -2652,7 +2652,7 @@ int peer_delete(struct peer *peer)
bgp_md5_unset(peer);
}
- bgp_timer_set(peer); /* stops all timers for Deleted */
+ bgp_timer_set(peer->connection); /* stops all timers for Deleted */
/* Delete from all peer list. */
if (!CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)
@@ -3242,7 +3242,7 @@ int peer_group_bind(struct bgp *bgp, union sockunion *su, struct peer *peer,
/* Set up peer's events and timers. */
if (peer_active(peer))
- bgp_timer_set(peer);
+ bgp_timer_set(peer->connection);
}
return 0;
@@ -4731,7 +4731,7 @@ void bgp_shutdown_disable(struct bgp *bgp)
UNSET_FLAG(bgp->flags, BGP_FLAG_SHUTDOWN);
for (ALL_LIST_ELEMENTS_RO(bgp->peer, node, peer))
- bgp_timer_set(peer);
+ bgp_timer_set(peer->connection);
}
/* Change specified peer flag. */