mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-04 15:30:02 +00:00
Merge pull request #17801 from enkechen-panw/aggr-fix2
bgpd: apply route-map for aggregate before attribute comparison
This commit is contained in:
commit
003869b179
104
bgpd/bgp_route.c
104
bgpd/bgp_route.c
@ -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);
|
||||
}
|
||||
|
||||
|
@ -449,7 +449,6 @@ struct bgp_aggregate {
|
||||
struct {
|
||||
char *name;
|
||||
struct route_map *map;
|
||||
bool changed;
|
||||
} rmap;
|
||||
|
||||
/* Suppress-count. */
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user