]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: fix several issues in sourcing AIGP attribute
authorEnke Chen <enchen@paloaltonetworks.com>
Wed, 16 Oct 2024 18:15:28 +0000 (11:15 -0700)
committerEnke Chen <enchen@paloaltonetworks.com>
Wed, 16 Oct 2024 18:15:28 +0000 (11:15 -0700)
Fix several issues in sourcing AIGP attribute:

1) AIGP should not be set as default for a redistributed route or a
   static network. It should be set by config instead.

2) AIGP sourced by "set aigp-metric igp-metric" in a route-map does
   not set the correct value for a redistributed route.

3) When redistribute a connected route like loopback, the AGIP (with
   value 0) is sourced by "set aigp-metric igp-metric", but the
   attribute is not propagated as the attribute flag is not set.

Signed-off-by: Enke Chen <enchen@paloaltonetworks.com>
bgpd/bgp_attr.h
bgpd/bgp_route.c
bgpd/bgp_routemap.c

index c10a9dc90a74efeb2fbbde7963b7700938719047..0a43399be6c52b6c86eb6aef5c453a6af570986b 100644 (file)
@@ -593,9 +593,7 @@ static inline uint64_t bgp_attr_get_aigp_metric(const struct attr *attr)
 static inline void bgp_attr_set_aigp_metric(struct attr *attr, uint64_t aigp)
 {
        attr->aigp_metric = aigp;
-
-       if (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)
index 9f44e7913a9b91474bc6842b00e0bfda9efafecc..ed1dbc6b42694dfc1e87c617561dcaf2cfa5005e 100644 (file)
@@ -6754,9 +6754,6 @@ void bgp_static_update(struct bgp *bgp, const struct prefix *p,
        if (afi == AFI_IP)
                attr.mp_nexthop_len = BGP_ATTR_NHLEN_IPV4;
 
-       if (bgp_static->igpmetric)
-               bgp_attr_set_aigp_metric(&attr, bgp_static->igpmetric);
-
        if (bgp_static->atomic)
                attr.flag |= ATTR_FLAG_BIT(BGP_ATTR_ATOMIC_AGGREGATE);
 
@@ -9020,9 +9017,6 @@ void bgp_redistribute_add(struct bgp *bgp, struct prefix *p,
        attr.distance = distance;
        attr.tag = tag;
 
-       if (metric)
-               bgp_attr_set_aigp_metric(&attr, metric);
-
        afi = family2afi(p->family);
 
        red = bgp_redist_lookup(bgp, afi, type, instance);
@@ -9032,10 +9026,8 @@ void bgp_redistribute_add(struct bgp *bgp, struct prefix *p,
                /* Copy attribute for modification. */
                attr_new = attr;
 
-               if (red->redist_metric_flag) {
+               if (red->redist_metric_flag)
                        attr_new.med = red->redist_metric;
-                       bgp_attr_set_aigp_metric(&attr_new, red->redist_metric);
-               }
 
                /* Apply route-map. */
                if (red->rmap.name) {
index e5d6992d1b46f89ee258fd5c88f96afd9b0b4f27..8dd48575e5098b4e6767fc3c7a08adb9908eafe3 100644 (file)
@@ -3524,19 +3524,15 @@ route_set_aigp_metric(void *rule, const struct prefix *pfx, void *object)
 {
        const char *aigp_metric = rule;
        struct bgp_path_info *path = object;
-       uint32_t aigp = 0;
+       uint32_t aigp;
 
-       if (strmatch(aigp_metric, "igp-metric")) {
-               if (!path->nexthop)
-                       return RMAP_NOMATCH;
-
-               bgp_attr_set_aigp_metric(path->attr, path->nexthop->metric);
-       } else {
+       /* Note: the metric is stored as MED for a locally redistributed. */
+       if (strmatch(aigp_metric, "igp-metric"))
+               aigp = path->nexthop ? path->nexthop->metric : path->attr->med;
+       else
                aigp = atoi(aigp_metric);
-               bgp_attr_set_aigp_metric(path->attr, aigp);
-       }
 
-       path->attr->flag |= ATTR_FLAG_BIT(BGP_ATTR_AIGP);
+       bgp_attr_set_aigp_metric(path->attr, aigp);
 
        return RMAP_OKAY;
 }