From: Enke Chen Date: Tue, 15 Oct 2024 01:42:15 +0000 (-0700) Subject: bgpd: fix route selection with AIGP X-Git-Tag: docker/9.0.5~19^2~1 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=35a1c94c22dce5b2e1458a49024feaac2c7ba748;p=matthieu%2Ffrr.git bgpd: fix route selection with AIGP The nexthop metric should be added to AIGP when calculating the bestpath in bgp_path_info_cmp(). Signed-off-by: Enke Chen (cherry picked from commit 081422e8e71085d3a3d4d2ff0bc1e1abaff0d52e) --- diff --git a/bgpd/bgp_attr.c b/bgpd/bgp_attr.c index 889902efcb..47273b4f9f 100644 --- a/bgpd/bgp_attr.c +++ b/bgpd/bgp_attr.c @@ -469,16 +469,6 @@ static bool bgp_attr_aigp_get_tlv_metric(uint8_t *pnt, int length, return false; } -static uint64_t bgp_aigp_metric_total(struct bgp_path_info *bpi) -{ - uint64_t aigp = bgp_attr_get_aigp_metric(bpi->attr); - - if (bpi->nexthop) - return aigp + bpi->nexthop->metric; - else - return aigp; -} - static void stream_put_bgp_aigp_tlv_metric(struct stream *s, struct bgp_path_info *bpi) { diff --git a/bgpd/bgp_attr.h b/bgpd/bgp_attr.h index c3e661a8c8..b5ea45971f 100644 --- a/bgpd/bgp_attr.h +++ b/bgpd/bgp_attr.h @@ -595,6 +595,16 @@ static inline void bgp_attr_set_aigp_metric(struct attr *attr, uint64_t aigp) attr->flag |= ATTR_FLAG_BIT(BGP_ATTR_AIGP); } +static inline uint64_t bgp_aigp_metric_total(struct bgp_path_info *bpi) +{ + uint64_t aigp = bgp_attr_get_aigp_metric(bpi->attr); + + if (bpi->nexthop) + return aigp + bpi->nexthop->metric; + else + return aigp; +} + static inline struct cluster_list *bgp_attr_get_cluster(const struct attr *attr) { return attr->cluster1; diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 39009146f7..6c71c87580 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -927,8 +927,8 @@ static int bgp_path_info_cmp(struct bgp *bgp, struct bgp_path_info *new, 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)) { - uint64_t new_aigp = bgp_attr_get_aigp_metric(newattr); - uint64_t exist_aigp = bgp_attr_get_aigp_metric(existattr); + uint64_t new_aigp = bgp_aigp_metric_total(new); + uint64_t exist_aigp = bgp_aigp_metric_total(exist); if (new_aigp < exist_aigp) { *reason = bgp_path_selection_aigp;