Skip to content

Commit

Permalink
bgpd: Prefer routes over eBGP versus eBGP-OAD
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
ton31337 committed Jan 11, 2024
1 parent 5fbf0cc commit a8474e4
Showing 1 changed file with 20 additions and 10 deletions.
30 changes: 20 additions & 10 deletions bgpd/bgp_route.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit a8474e4

Please sign in to comment.