From 345528e49b1b410eeb23614af2929e6f5344728d Mon Sep 17 00:00:00 2001 From: Enke Chen Date: Wed, 16 Oct 2024 11:15:28 -0700 Subject: [PATCH] bgpd: fix several issues in sourcing AIGP attribute 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 (cherry picked from commit f65356d8bb9a43b1725fafdbd30aba0de9d214fa) --- bgpd/bgp_attr.h | 4 +--- bgpd/bgp_route.c | 10 +--------- bgpd/bgp_routemap.c | 16 ++++++---------- 3 files changed, 8 insertions(+), 22 deletions(-) diff --git a/bgpd/bgp_attr.h b/bgpd/bgp_attr.h index 38e732a9fe..0282818931 100644 --- a/bgpd/bgp_attr.h +++ b/bgpd/bgp_attr.h @@ -592,9 +592,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) diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 7ceba9a0d5..6dc19a6256 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -6334,9 +6334,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); @@ -8591,9 +8588,6 @@ void bgp_redistribute_add(struct bgp *bgp, struct prefix *p, attr.flag |= ATTR_FLAG_BIT(BGP_ATTR_MULTI_EXIT_DISC); attr.tag = tag; - if (metric) - bgp_attr_set_aigp_metric(&attr, metric); - afi = family2afi(p->family); red = bgp_redist_lookup(bgp, afi, type, instance); @@ -8603,10 +8597,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) { diff --git a/bgpd/bgp_routemap.c b/bgpd/bgp_routemap.c index 4a671db934..34f8c7fdb5 100644 --- a/bgpd/bgp_routemap.c +++ b/bgpd/bgp_routemap.c @@ -3452,19 +3452,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; } -- 2.39.5