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:
Donatas Abraitis 2024-01-11 10:36:41 +02:00
parent 5fbf0cc00d
commit a8474e4a46

View File

@ -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;