diff options
| author | Donald Sharp <donaldsharp72@gmail.com> | 2021-11-06 16:49:24 -0400 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-11-06 16:49:24 -0400 | 
| commit | 3691c9d2d0b22e4fa27d7a49b302f28b1af9ede0 (patch) | |
| tree | eb06c35cdfbab96015be0b3830d57d58a0eb4d80 | |
| parent | 41adf5b4ba8f59bea9ffa31e4b5096fd101e256f (diff) | |
| parent | 3795733e5f0885bef5bae1a2ab7d6afbfe968718 (diff) | |
Merge pull request #9990 from FRRouting/mergify/bp/stable/8.1/pr-9972
bfdd,bgpd: fix some integration bugs (backport #9972)
| -rw-r--r-- | bgpd/bgp_bfd.c | 34 | ||||
| -rw-r--r-- | bgpd/bgpd.c | 40 | ||||
| -rw-r--r-- | lib/bfd.c | 9 | ||||
| -rw-r--r-- | lib/bfd.h | 6 | 
4 files changed, 67 insertions, 22 deletions
diff --git a/bgpd/bgp_bfd.c b/bgpd/bgp_bfd.c index 4995f9a1fd..f23e6b2e9b 100644 --- a/bgpd/bgp_bfd.c +++ b/bgpd/bgp_bfd.c @@ -150,6 +150,7 @@ void bgp_peer_config_apply(struct peer *p, struct peer_group *pg)  void bgp_peer_bfd_update_source(struct peer *p)  {  	struct bfd_session_params *session = p->bfd_config->session; +	const union sockunion *source;  	bool changed = false;  	int family;  	union { @@ -161,44 +162,45 @@ void bgp_peer_bfd_update_source(struct peer *p)  	if (CHECK_FLAG(p->sflags, PEER_STATUS_GROUP))  		return; +	/* Figure out the correct source to use. */ +	if (CHECK_FLAG(p->flags, PEER_FLAG_UPDATE_SOURCE)) +		source = p->update_source; +	else +		source = p->su_local; +  	/* Update peer's source/destination addresses. */  	bfd_sess_addresses(session, &family, &src.v6, &dst.v6);  	if (family == AF_INET) { -		if ((p->su_local -		     && p->su_local->sin.sin_addr.s_addr != src.v4.s_addr) +		if ((source && source->sin.sin_addr.s_addr != src.v4.s_addr)  		    || p->su.sin.sin_addr.s_addr != dst.v4.s_addr) {  			if (BGP_DEBUG(bfd, BFD_LIB))  				zlog_debug(  					"%s: address [%pI4->%pI4] to [%pI4->%pI4]",  					__func__, &src.v4, &dst.v4, -					p->su_local ? &p->su_local->sin.sin_addr -						    : &src.v4, +					source ? &source->sin.sin_addr +					       : &src.v4,  					&p->su.sin.sin_addr);  			bfd_sess_set_ipv4_addrs( -				session, -				p->su_local ? &p->su_local->sin.sin_addr : NULL, +				session, source ? &source->sin.sin_addr : NULL,  				&p->su.sin.sin_addr);  			changed = true;  		}  	} else { -		if ((p->su_local -		     && memcmp(&p->su_local->sin6, &src.v6, sizeof(src.v6))) +		if ((source && memcmp(&source->sin6, &src.v6, sizeof(src.v6)))  		    || memcmp(&p->su.sin6, &dst.v6, sizeof(dst.v6))) {  			if (BGP_DEBUG(bfd, BFD_LIB))  				zlog_debug(  					"%s: address [%pI6->%pI6] to [%pI6->%pI6]",  					__func__, &src.v6, &dst.v6, -					p->su_local -						? &p->su_local->sin6.sin6_addr -						: &src.v6, +					source ? &source->sin6.sin6_addr +					       : &src.v6,  					&p->su.sin6.sin6_addr); -			bfd_sess_set_ipv6_addrs( -				session, -				p->su_local ? &p->su_local->sin6.sin6_addr -					    : NULL, -				&p->su.sin6.sin6_addr); +			bfd_sess_set_ipv6_addrs(session, +						source ? &source->sin6.sin6_addr +						       : NULL, +						&p->su.sin6.sin6_addr);  			changed = true;  		}  	} diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c index a823009179..0416186171 100644 --- a/bgpd/bgpd.c +++ b/bgpd/bgpd.c @@ -4751,6 +4751,10 @@ int peer_ebgp_multihop_set(struct peer *peer, int ttl)  						BGP_NOTIFY_CEASE_CONFIG_CHANGE);  			else  				bgp_session_reset(peer); + +			/* Reconfigure BFD peer with new TTL. */ +			if (peer->bfd_config) +				bgp_peer_bfd_update_source(peer);  		}  	} else {  		group = peer->group; @@ -4765,6 +4769,10 @@ int peer_ebgp_multihop_set(struct peer *peer, int ttl)  						BGP_NOTIFY_CEASE_CONFIG_CHANGE);  			else  				bgp_session_reset(peer); + +			/* Reconfigure BFD peer with new TTL. */ +			if (peer->bfd_config) +				bgp_peer_bfd_update_source(peer);  		}  	}  	return 0; @@ -4798,6 +4806,10 @@ int peer_ebgp_multihop_unset(struct peer *peer)  					BGP_NOTIFY_CEASE_CONFIG_CHANGE);  		else  			bgp_session_reset(peer); + +		/* Reconfigure BFD peer with new TTL. */ +		if (peer->bfd_config) +			bgp_peer_bfd_update_source(peer);  	} else {  		group = peer->group;  		for (ALL_LIST_ELEMENTS(group->peer, node, nnode, peer)) { @@ -4814,6 +4826,10 @@ int peer_ebgp_multihop_unset(struct peer *peer)  				else  					bgp_session_reset(peer);  			} + +			/* Reconfigure BFD peer with new TTL. */ +			if (peer->bfd_config) +				bgp_peer_bfd_update_source(peer);  		}  	}  	return 0; @@ -4859,6 +4875,10 @@ int peer_update_source_if_set(struct peer *peer, const char *ifname)  		} else  			bgp_session_reset(peer); +		/* Apply new source configuration to BFD session. */ +		if (peer->bfd_config) +			bgp_peer_bfd_update_source(peer); +  		/* Skip peer-group mechanics for regular peers. */  		return 0;  	} @@ -4892,6 +4912,10 @@ int peer_update_source_if_set(struct peer *peer, const char *ifname)  					BGP_NOTIFY_CEASE_CONFIG_CHANGE);  		} else  			bgp_session_reset(member); + +		/* Apply new source configuration to BFD session. */ +		if (member->bfd_config) +			bgp_peer_bfd_update_source(member);  	}  	return 0; @@ -4922,6 +4946,10 @@ int peer_update_source_addr_set(struct peer *peer, const union sockunion *su)  		} else  			bgp_session_reset(peer); +		/* Apply new source configuration to BFD session. */ +		if (peer->bfd_config) +			bgp_peer_bfd_update_source(peer); +  		/* Skip peer-group mechanics for regular peers. */  		return 0;  	} @@ -4954,6 +4982,10 @@ int peer_update_source_addr_set(struct peer *peer, const union sockunion *su)  					BGP_NOTIFY_CEASE_CONFIG_CHANGE);  		} else  			bgp_session_reset(member); + +		/* Apply new source configuration to BFD session. */ +		if (member->bfd_config) +			bgp_peer_bfd_update_source(member);  	}  	return 0; @@ -4991,6 +5023,10 @@ int peer_update_source_unset(struct peer *peer)  		} else  			bgp_session_reset(peer); +		/* Apply new source configuration to BFD session. */ +		if (peer->bfd_config) +			bgp_peer_bfd_update_source(peer); +  		/* Skip peer-group mechanics for regular peers. */  		return 0;  	} @@ -5022,6 +5058,10 @@ int peer_update_source_unset(struct peer *peer)  					BGP_NOTIFY_CEASE_CONFIG_CHANGE);  		} else  			bgp_session_reset(member); + +		/* Apply new source configuration to BFD session. */ +		if (member->bfd_config) +			bgp_peer_bfd_update_source(member);  	}  	return 0; @@ -552,7 +552,8 @@ static bool bfd_sess_address_changed(const struct bfd_session_params *bsp,  }  void bfd_sess_set_ipv4_addrs(struct bfd_session_params *bsp, -			     struct in_addr *src, struct in_addr *dst) +			     const struct in_addr *src, +			     const struct in_addr *dst)  {  	if (!bfd_sess_address_changed(bsp, AF_INET, (struct in6_addr *)src,  				      (struct in6_addr *)dst)) @@ -576,10 +577,10 @@ void bfd_sess_set_ipv4_addrs(struct bfd_session_params *bsp,  }  void bfd_sess_set_ipv6_addrs(struct bfd_session_params *bsp, -			     struct in6_addr *src, struct in6_addr *dst) +			     const struct in6_addr *src, +			     const struct in6_addr *dst)  { -	if (!bfd_sess_address_changed(bsp, AF_INET, (struct in6_addr *)src, -				      (struct in6_addr *)dst)) +	if (!bfd_sess_address_changed(bsp, AF_INET6, src, dst))  		return;  	/* If already installed, remove the old setting. */ @@ -124,7 +124,8 @@ void bfd_sess_free(struct bfd_session_params **bsp);   * \param dst remote address (mandatory).   */  void bfd_sess_set_ipv4_addrs(struct bfd_session_params *bsp, -			     struct in_addr *src, struct in_addr *dst); +			     const struct in_addr *src, +			     const struct in_addr *dst);  /**   * Set the local and peer address of the BFD session. @@ -138,7 +139,8 @@ void bfd_sess_set_ipv4_addrs(struct bfd_session_params *bsp,   * \param dst remote address (mandatory).   */  void bfd_sess_set_ipv6_addrs(struct bfd_session_params *bsp, -			     struct in6_addr *src, struct in6_addr *dst); +			     const struct in6_addr *src, +			     const struct in6_addr *dst);  /**   * Configure the BFD session interface.  | 
