mirror of
				https://git.proxmox.com/git/mirror_frr
				synced 2025-11-03 23:47:16 +00:00 
			
		
		
		
	bgpd: Prefer routes over eBGP versus eBGP-OAD
If at least one of the candidate routes was received via EBGP, remove from consideration all routes that were received via EBGP-OAD and IBGP. Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
This commit is contained in:
		
							parent
							
								
									5fbf0cc00d
								
							
						
					
					
						commit
						a8474e4a46
					
				@ -613,6 +613,8 @@ int bgp_path_info_cmp(struct bgp *bgp, struct bgp_path_info *new,
 | 
			
		||||
	struct attr *newattr, *existattr;
 | 
			
		||||
	enum bgp_peer_sort new_sort;
 | 
			
		||||
	enum bgp_peer_sort exist_sort;
 | 
			
		||||
	enum bgp_peer_sub_sort new_sub_sort;
 | 
			
		||||
	enum bgp_peer_sub_sort exist_sub_sort;
 | 
			
		||||
	uint32_t new_pref;
 | 
			
		||||
	uint32_t exist_pref;
 | 
			
		||||
	uint32_t new_med;
 | 
			
		||||
@ -1147,26 +1149,34 @@ int bgp_path_info_cmp(struct bgp *bgp, struct bgp_path_info *new,
 | 
			
		||||
	/* 7. Peer type check. */
 | 
			
		||||
	new_sort = peer_new->sort;
 | 
			
		||||
	exist_sort = peer_exist->sort;
 | 
			
		||||
	new_sub_sort = peer_new->sub_sort;
 | 
			
		||||
	exist_sub_sort = peer_exist->sub_sort;
 | 
			
		||||
 | 
			
		||||
	if (new_sort == BGP_PEER_EBGP
 | 
			
		||||
	    && (exist_sort == BGP_PEER_IBGP || exist_sort == BGP_PEER_CONFED)) {
 | 
			
		||||
	if (new_sort == BGP_PEER_EBGP &&
 | 
			
		||||
	    (exist_sort == BGP_PEER_IBGP || exist_sort == BGP_PEER_CONFED ||
 | 
			
		||||
	     exist_sub_sort == BGP_PEER_EBGP_OAD)) {
 | 
			
		||||
		*reason = bgp_path_selection_peer;
 | 
			
		||||
		if (debug)
 | 
			
		||||
			zlog_debug(
 | 
			
		||||
				"%s: %s wins over %s due to eBGP peer > iBGP peer",
 | 
			
		||||
				pfx_buf, new_buf, exist_buf);
 | 
			
		||||
			zlog_debug("%s: %s wins over %s due to eBGP peer > %s peer",
 | 
			
		||||
				   pfx_buf, new_buf, exist_buf,
 | 
			
		||||
				   (exist_sub_sort == BGP_PEER_EBGP_OAD)
 | 
			
		||||
					   ? "eBGP-OAD"
 | 
			
		||||
					   : "iBGP");
 | 
			
		||||
		if (!CHECK_FLAG(bgp->flags, BGP_FLAG_PEERTYPE_MULTIPATH_RELAX))
 | 
			
		||||
			return 1;
 | 
			
		||||
		peer_sort_ret = 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (exist_sort == BGP_PEER_EBGP
 | 
			
		||||
	    && (new_sort == BGP_PEER_IBGP || new_sort == BGP_PEER_CONFED)) {
 | 
			
		||||
	if (exist_sort == BGP_PEER_EBGP &&
 | 
			
		||||
	    (new_sort == BGP_PEER_IBGP || new_sort == BGP_PEER_CONFED ||
 | 
			
		||||
	     new_sub_sort == BGP_PEER_EBGP_OAD)) {
 | 
			
		||||
		*reason = bgp_path_selection_peer;
 | 
			
		||||
		if (debug)
 | 
			
		||||
			zlog_debug(
 | 
			
		||||
				"%s: %s loses to %s due to iBGP peer < eBGP peer",
 | 
			
		||||
				pfx_buf, new_buf, exist_buf);
 | 
			
		||||
			zlog_debug("%s: %s loses to %s due to %s peer < eBGP peer",
 | 
			
		||||
				   pfx_buf, new_buf, exist_buf,
 | 
			
		||||
				   (exist_sub_sort == BGP_PEER_EBGP_OAD)
 | 
			
		||||
					   ? "eBGP-OAD"
 | 
			
		||||
					   : "iBGP");
 | 
			
		||||
		if (!CHECK_FLAG(bgp->flags, BGP_FLAG_PEERTYPE_MULTIPATH_RELAX))
 | 
			
		||||
			return 0;
 | 
			
		||||
		peer_sort_ret = 0;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user