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 <enchen@paloaltonetworks.com>
(cherry picked from commit 081422e8e7)
This commit is contained in:
Enke Chen 2024-10-14 18:42:15 -07:00 committed by Mergify
parent 42e33e677c
commit 0527820a18
3 changed files with 12 additions and 12 deletions

View File

@ -480,16 +480,6 @@ static bool bgp_attr_aigp_get_tlv_metric(uint8_t *pnt, int length,
return false; 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, static void stream_put_bgp_aigp_tlv_metric(struct stream *s,
struct bgp_path_info *bpi) struct bgp_path_info *bpi)
{ {

View File

@ -598,6 +598,16 @@ static inline void bgp_attr_set_aigp_metric(struct attr *attr, uint64_t aigp)
SET_FLAG(attr->flag, ATTR_FLAG_BIT(BGP_ATTR_AIGP)); SET_FLAG(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) static inline struct cluster_list *bgp_attr_get_cluster(const struct attr *attr)
{ {
return attr->cluster1; return attr->cluster1;

View File

@ -1068,8 +1068,8 @@ int bgp_path_info_cmp(struct bgp *bgp, struct bgp_path_info *new,
if (CHECK_FLAG(newattr->flag, ATTR_FLAG_BIT(BGP_ATTR_AIGP)) && if (CHECK_FLAG(newattr->flag, ATTR_FLAG_BIT(BGP_ATTR_AIGP)) &&
CHECK_FLAG(existattr->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)) { CHECK_FLAG(bgp->flags, BGP_FLAG_COMPARE_AIGP)) {
uint64_t new_aigp = bgp_attr_get_aigp_metric(newattr); uint64_t new_aigp = bgp_aigp_metric_total(new);
uint64_t exist_aigp = bgp_attr_get_aigp_metric(existattr); uint64_t exist_aigp = bgp_aigp_metric_total(exist);
if (new_aigp < exist_aigp) { if (new_aigp < exist_aigp) {
*reason = bgp_path_selection_aigp; *reason = bgp_path_selection_aigp;