]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: fix route selection with AIGP
authorEnke Chen <enchen@paloaltonetworks.com>
Tue, 15 Oct 2024 01:42:15 +0000 (18:42 -0700)
committerEnke Chen <enchen@paloaltonetworks.com>
Tue, 15 Oct 2024 01:45:06 +0000 (18:45 -0700)
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>
bgpd/bgp_attr.c
bgpd/bgp_attr.h
bgpd/bgp_route.c

index 7cdf98cba706ef914e8c64f322abe08206b5f776..7aa9bbbb91b875058821a81917e26759ecae003a 100644 (file)
@@ -480,16 +480,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)
 {
index a8ca8c1fa638dba6edbf4e1e7f43b53d7e05d0ce..02ddf88b624282a09ed3b276d4b6ac747027e573 100644 (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));
 }
 
+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;
index 9cefec0706ee694fa9c3cca27eb4480ea2fc807a..0f196157c80c17b264a59a608e5d56f656cd0ed1 100644 (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)) &&
            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;