Skip to content

Commit

Permalink
bgpd: fix several issues in sourcing AIGP attribute
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
enkechen-panw committed Oct 16, 2024
1 parent 75e34c0 commit f65356d
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 22 deletions.
4 changes: 1 addition & 3 deletions bgpd/bgp_attr.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
10 changes: 1 addition & 9 deletions bgpd/bgp_route.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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);
Expand All @@ -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) {
Expand Down
16 changes: 6 additions & 10 deletions bgpd/bgp_routemap.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down

0 comments on commit f65356d

Please sign in to comment.