]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: compare aigp after local route check in bgp_path_info_cmp()
authorEnke Chen <enchen@paloaltonetworks.com>
Thu, 24 Oct 2024 17:50:37 +0000 (10:50 -0700)
committerDonatas Abraitis <donatas@opensourcerouting.org>
Fri, 25 Oct 2024 10:17:37 +0000 (13:17 +0300)
For consistency between RIB and BGP, the aigp comparison should
be made after the local route check in bgp bestpath selection.

Signed-off-by: Enke Chen <enchen@paloaltonetworks.com>
bgpd/bgp_route.c
doc/user/bgp.rst

index 6c71c87580f0532de78b9163ea82fe3b4657ac29..9005460c4b0d5332e5fa6f5675edb42d263381fa 100644 (file)
@@ -923,7 +923,32 @@ static int bgp_path_info_cmp(struct bgp *bgp, struct bgp_path_info *new,
                }
        }
 
-       /* Tie-breaker - AIGP (Metric TLV) attribute */
+       /* 3. Local route check. We prefer:
+        *  - BGP_ROUTE_STATIC
+        *  - BGP_ROUTE_AGGREGATE
+        *  - BGP_ROUTE_REDISTRIBUTE
+        */
+       new_origin = !(new->sub_type == BGP_ROUTE_NORMAL || new->sub_type == BGP_ROUTE_IMPORTED);
+       exist_origin = !(exist->sub_type == BGP_ROUTE_NORMAL ||
+                        exist->sub_type == BGP_ROUTE_IMPORTED);
+
+       if (new_origin && !exist_origin) {
+               *reason = bgp_path_selection_local_route;
+               if (debug)
+                       zlog_debug("%s: %s wins over %s due to preferred BGP_ROUTE type", pfx_buf,
+                                  new_buf, exist_buf);
+               return 1;
+       }
+
+       if (!new_origin && exist_origin) {
+               *reason = bgp_path_selection_local_route;
+               if (debug)
+                       zlog_debug("%s: %s loses to %s due to preferred BGP_ROUTE type", pfx_buf,
+                                  new_buf, exist_buf);
+               return 0;
+       }
+
+       /* 3.5. Tie-breaker - AIGP (Metric TLV) attribute */
        if (CHECK_FLAG(newattr->flag, ATTR_FLAG_BIT(BGP_ATTR_AIGP)) &&
            CHECK_FLAG(existattr->flag, ATTR_FLAG_BIT(BGP_ATTR_AIGP)) &&
            CHECK_FLAG(bgp->flags, BGP_FLAG_COMPARE_AIGP)) {
@@ -953,34 +978,6 @@ static int bgp_path_info_cmp(struct bgp *bgp, struct bgp_path_info *new,
                }
        }
 
-       /* 3. Local route check. We prefer:
-        *  - BGP_ROUTE_STATIC
-        *  - BGP_ROUTE_AGGREGATE
-        *  - BGP_ROUTE_REDISTRIBUTE
-        */
-       new_origin = !(new->sub_type == BGP_ROUTE_NORMAL ||
-                      new->sub_type == BGP_ROUTE_IMPORTED);
-       exist_origin = !(exist->sub_type == BGP_ROUTE_NORMAL ||
-                        exist->sub_type == BGP_ROUTE_IMPORTED);
-
-       if (new_origin && !exist_origin) {
-               *reason = bgp_path_selection_local_route;
-               if (debug)
-                       zlog_debug(
-                               "%s: %s wins over %s due to preferred BGP_ROUTE type",
-                               pfx_buf, new_buf, exist_buf);
-               return 1;
-       }
-
-       if (!new_origin && exist_origin) {
-               *reason = bgp_path_selection_local_route;
-               if (debug)
-                       zlog_debug(
-                               "%s: %s loses to %s due to preferred BGP_ROUTE type",
-                               pfx_buf, new_buf, exist_buf);
-               return 0;
-       }
-
        /* Here if these are imported routes then get ultimate pi for
         * path compare.
         */
index 2a3a8c5fe509db846516c4b577dd6ed22ae4273c..b70a07c3c5574d74943d35de303c4a3c3ff40071 100644 (file)
@@ -148,16 +148,16 @@ bottom until one of the factors can be used.
 
    Prefer higher local preference routes to lower.
 
+3. **Local route check**
+
+   Prefer local routes (statics, aggregates, redistributed) to received routes.
+
    If ``bgp bestpath aigp`` is enabled, and both paths that are compared have
    AIGP attribute, BGP uses AIGP tie-breaking unless both of the paths have the
    AIGP metric attribute. This means that the AIGP attribute is not evaluated
    during the best path selection process between two paths when one path does
    not have the AIGP attribute.
 
-3. **Local route check**
-
-   Prefer local routes (statics, aggregates, redistributed) to received routes.
-
 4. **AS path length check**
 
    Prefer shortest hop-count AS_PATHs.