summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEnke Chen <enchen@paloaltonetworks.com>2024-10-24 19:50:37 +0200
committerEnke Chen <enchen@paloaltonetworks.com>2024-10-24 19:50:37 +0200
commit6a7049aaacc32e6a473a4d56ca61444d1e1eb45d (patch)
tree71885ff820009f2122cc69674a4033185d93b9e2
parenttests: add a new BGP AIGP topotest (diff)
downloadfrr-6a7049aaacc32e6a473a4d56ca61444d1e1eb45d.tar.xz
frr-6a7049aaacc32e6a473a4d56ca61444d1e1eb45d.zip
bgpd: compare aigp after local route check in bgp_path_info_cmp()
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>
-rw-r--r--bgpd/bgp_route.c55
-rw-r--r--doc/user/bgp.rst8
2 files changed, 30 insertions, 33 deletions
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index 70da39ee8..ef9c313c9 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -1064,7 +1064,32 @@ 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)) {
@@ -1094,34 +1119,6 @@ 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.
*/
diff --git a/doc/user/bgp.rst b/doc/user/bgp.rst
index 6a46128d7..f2005c18d 100644
--- a/doc/user/bgp.rst
+++ b/doc/user/bgp.rst
@@ -160,16 +160,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.