mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-07-27 10:04:18 +00:00
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>
This commit is contained in:
parent
4f43c1392b
commit
acc673dd88
@ -966,7 +966,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)) {
|
||||
@ -996,34 +1021,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.
|
||||
*/
|
||||
|
@ -154,16 +154,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.
|
||||
|
Loading…
Reference in New Issue
Block a user