]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: Prefer routes over eBGP versus eBGP-OAD
authorDonatas Abraitis <donatas@opensourcerouting.org>
Thu, 11 Jan 2024 08:36:41 +0000 (10:36 +0200)
committerDonatas Abraitis <donatas@opensourcerouting.org>
Thu, 11 Jan 2024 08:53:56 +0000 (10:53 +0200)
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>
bgpd/bgp_route.c

index 2899b94d2ffdabb56ec9b38793436165136316be..211eeeaf3f205d0ff0c098b21d9d4822343c5dd6 100644 (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;