Merge pull request #17801 from enkechen-panw/aggr-fix2

bgpd: apply route-map for aggregate before attribute comparison
This commit is contained in:
Donatas Abraitis 2025-01-09 23:02:26 +02:00 committed by GitHub
commit 003869b179
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 24 additions and 82 deletions

View File

@ -7934,44 +7934,6 @@ static bool aggr_unsuppress_path(struct bgp_aggregate *aggregate,
return false;
}
static bool bgp_aggregate_info_same(struct bgp_path_info *pi, uint8_t origin,
struct aspath *aspath,
struct community *comm,
struct ecommunity *ecomm,
struct lcommunity *lcomm)
{
static struct aspath *ae = NULL;
enum asnotation_mode asnotation;
asnotation = bgp_get_asnotation(NULL);
if (!aspath)
ae = aspath_empty(asnotation);
if (!pi)
return false;
if (origin != pi->attr->origin)
return false;
if (!aspath_cmp(pi->attr->aspath, (aspath) ? aspath : ae))
return false;
if (!community_cmp(bgp_attr_get_community(pi->attr), comm))
return false;
if (!ecommunity_cmp(bgp_attr_get_ecommunity(pi->attr), ecomm))
return false;
if (!lcommunity_cmp(bgp_attr_get_lcommunity(pi->attr), lcomm))
return false;
if (!CHECK_FLAG(pi->flags, BGP_PATH_VALID))
return false;
return true;
}
static void bgp_aggregate_install(
struct bgp *bgp, afi_t afi, safi_t safi, const struct prefix *p,
uint8_t origin, struct aspath *aspath, struct community *community,
@ -7980,7 +7942,7 @@ static void bgp_aggregate_install(
{
struct bgp_dest *dest;
struct bgp_table *table;
struct bgp_path_info *pi, *orig, *new;
struct bgp_path_info *pi, *new;
struct attr *attr;
bool debug = bgp_debug_aggregate(p);
@ -7991,7 +7953,7 @@ static void bgp_aggregate_install(
dest = bgp_node_get(table, p);
for (orig = pi = bgp_dest_get_bgp_path_info(dest); pi; pi = pi->next)
for (pi = bgp_dest_get_bgp_path_info(dest); pi; pi = pi->next)
if (pi->peer == bgp->peer_self && pi->type == ZEBRA_ROUTE_BGP
&& pi->sub_type == BGP_ROUTE_AGGREGATE)
break;
@ -8008,19 +7970,23 @@ static void bgp_aggregate_install(
* If the aggregate information has not changed
* no need to re-install it again.
*/
if (pi && (!aggregate->rmap.changed &&
bgp_aggregate_info_same(pi, origin, aspath, community,
ecommunity, lcommunity))) {
attr = bgp_attr_aggregate_intern(bgp, origin, aspath, community, ecommunity,
lcommunity, aggregate, atomic_aggregate, p);
if (!attr) {
aspath_free(aspath);
community_free(&community);
ecommunity_free(&ecommunity);
lcommunity_free(&lcommunity);
bgp_dest_unlock_node(dest);
bgp_aggregate_delete(bgp, p, afi, safi, aggregate);
if (debug)
zlog_debug("%s: %pFX null attribute", __func__, p);
return;
}
if (aspath)
aspath_free(aspath);
if (community)
community_free(&community);
if (ecommunity)
ecommunity_free(&ecommunity);
if (lcommunity)
lcommunity_free(&lcommunity);
if (pi && CHECK_FLAG(pi->flags, BGP_PATH_VALID) && attrhash_cmp(pi->attr, attr)) {
bgp_attr_unintern(&attr);
bgp_dest_unlock_node(dest);
if (debug)
zlog_debug(" aggregate %pFX: duplicate", p);
return;
@ -8036,21 +8002,6 @@ static void bgp_aggregate_install(
zlog_debug(" aggregate %pFX: existing, removed", p);
}
attr = bgp_attr_aggregate_intern(
bgp, origin, aspath, community, ecommunity, lcommunity,
aggregate, atomic_aggregate, p);
if (!attr) {
aspath_free(aspath);
community_free(&community);
ecommunity_free(&ecommunity);
lcommunity_free(&lcommunity);
bgp_dest_unlock_node(dest);
bgp_aggregate_delete(bgp, p, afi, safi, aggregate);
if (debug)
zlog_debug("%s: %pFX null attribute", __func__, p);
return;
}
new = info_make(ZEBRA_ROUTE_BGP, BGP_ROUTE_AGGREGATE, 0,
bgp->peer_self, attr, dest);
@ -8063,19 +8014,13 @@ static void bgp_aggregate_install(
zlog_debug(" aggregate %pFX: installed", p);
} else {
uninstall_aggregate_route:
for (pi = orig; pi; pi = pi->next)
if (pi->peer == bgp->peer_self
&& pi->type == ZEBRA_ROUTE_BGP
&& pi->sub_type == BGP_ROUTE_AGGREGATE)
break;
/* Withdraw static BGP route from routing table. */
if (pi) {
bgp_path_info_delete(dest, pi);
bgp_process(bgp, dest, pi, afi, safi);
if (debug)
zlog_debug(" aggregate %pFX: uninstall", p);
}
/* Withdraw the aggregate route from routing table. */
if (pi) {
bgp_path_info_delete(dest, pi);
bgp_process(bgp, dest, pi, afi, safi);
if (debug)
zlog_debug(" aggregate %pFX: uninstall", p);
}
}
bgp_dest_unlock_node(dest);
@ -9010,7 +8955,6 @@ static int bgp_aggregate_set(struct vty *vty, const char *prefix_str, afi_t afi,
aggregate->rmap.name =
XSTRDUP(MTYPE_ROUTE_MAP_NAME, rmap);
aggregate->rmap.map = route_map_lookup_by_name(rmap);
aggregate->rmap.changed = true;
route_map_counter_increment(aggregate->rmap.map);
}

View File

@ -449,7 +449,6 @@ struct bgp_aggregate {
struct {
char *name;
struct route_map *map;
bool changed;
} rmap;
/* Suppress-count. */

View File

@ -4684,7 +4684,6 @@ static void bgp_route_map_process_update(struct bgp *bgp, const char *rmap_name,
route_map_counter_increment(map);
aggregate->rmap.map = map;
aggregate->rmap.changed = true;
matched = true;
}