diff options
| -rw-r--r-- | bgpd/bgp_fsm.c | 101 | ||||
| -rw-r--r-- | bgpd/bgp_fsm.h | 2 | ||||
| -rw-r--r-- | bgpd/bgp_packet.c | 2 | ||||
| -rw-r--r-- | bgpd/bgpd.c | 12 | 
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. */  | 
