mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-11-02 23:34:11 +00:00
bgpd: Collapse bgp_aggregate_add into bgp_aggregate_route
These two functions are functionally the same, except bgp_aggregate_route is meant to handle the addition and deletion of routes, while aggregate_add is meant for all of them. Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
parent
eaaf8adb7c
commit
f273fef13f
123
bgpd/bgp_route.c
123
bgpd/bgp_route.c
@ -5574,6 +5574,10 @@ static void bgp_aggregate_route(struct bgp *bgp, struct prefix *p,
|
||||
if (ri->sub_type == BGP_ROUTE_AGGREGATE)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* summary-only aggregate route suppress
|
||||
* aggregated route announcements.
|
||||
*/
|
||||
if (aggregate->summary_only) {
|
||||
(bgp_info_extra_get(ri))->suppress++;
|
||||
bgp_info_set_flag(rn, ri,
|
||||
@ -5583,12 +5587,26 @@ static void bgp_aggregate_route(struct bgp *bgp, struct prefix *p,
|
||||
|
||||
aggregate->count++;
|
||||
|
||||
/*
|
||||
* If at least one route among routes that are
|
||||
* aggregated has ORIGIN with the value INCOMPLETE,
|
||||
* then the aggregated route MUST have the ORIGIN
|
||||
* attribute with the value INCOMPLETE. Otherwise, if
|
||||
* at least one route among routes that are aggregated
|
||||
* has ORIGIN with the value EGP, then the aggregated
|
||||
* route MUST have the ORIGIN attribute with the value
|
||||
* EGP.
|
||||
*/
|
||||
if (origin < ri->attr->origin)
|
||||
origin = ri->attr->origin;
|
||||
|
||||
if (!aggregate->as_set)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* as-set aggregate route generate origin, as path,
|
||||
* and community aggregation.
|
||||
*/
|
||||
if (aspath) {
|
||||
asmerge = aspath_aggregate(aspath,
|
||||
ri->attr->aspath);
|
||||
@ -5765,109 +5783,6 @@ void bgp_aggregate_decrement(struct bgp *bgp, struct prefix *p,
|
||||
bgp_unlock_node(child);
|
||||
}
|
||||
|
||||
/* Called via bgp_aggregate_set when the user configures aggregate-address */
|
||||
static void bgp_aggregate_add(struct bgp *bgp, struct prefix *p, afi_t afi,
|
||||
safi_t safi, struct bgp_aggregate *aggregate)
|
||||
{
|
||||
struct bgp_table *table;
|
||||
struct bgp_node *top;
|
||||
struct bgp_node *rn;
|
||||
struct bgp_info *ri;
|
||||
unsigned long match;
|
||||
uint8_t origin = BGP_ORIGIN_IGP;
|
||||
struct aspath *aspath = NULL;
|
||||
struct aspath *asmerge = NULL;
|
||||
struct community *community = NULL;
|
||||
struct community *commerge = NULL;
|
||||
uint8_t atomic_aggregate = 0;
|
||||
|
||||
table = bgp->rib[afi][safi];
|
||||
|
||||
/* If routes exists below this node, generate aggregate routes. */
|
||||
top = bgp_node_get(table, p);
|
||||
for (rn = bgp_node_get(table, p); rn;
|
||||
rn = bgp_route_next_until(rn, top)) {
|
||||
if (rn->p.prefixlen <= p->prefixlen)
|
||||
continue;
|
||||
|
||||
match = 0;
|
||||
|
||||
for (ri = rn->info; ri; ri = ri->next) {
|
||||
if (BGP_INFO_HOLDDOWN(ri))
|
||||
continue;
|
||||
|
||||
if (ri->attr->flag
|
||||
& ATTR_FLAG_BIT(BGP_ATTR_ATOMIC_AGGREGATE))
|
||||
atomic_aggregate = 1;
|
||||
|
||||
if (ri->sub_type == BGP_ROUTE_AGGREGATE)
|
||||
continue;
|
||||
|
||||
/* summary-only aggregate route suppress
|
||||
* aggregated route announcement. */
|
||||
if (aggregate->summary_only) {
|
||||
(bgp_info_extra_get(ri))->suppress++;
|
||||
bgp_info_set_flag(rn, ri,
|
||||
BGP_INFO_ATTR_CHANGED);
|
||||
match++;
|
||||
}
|
||||
|
||||
/* If at least one route among routes that are
|
||||
* aggregated has ORIGIN with the value INCOMPLETE,
|
||||
* then the aggregated route MUST have the ORIGIN
|
||||
* attribute with the value INCOMPLETE. Otherwise, if
|
||||
* at least one route among routes that are aggregated
|
||||
* has ORIGIN with the value EGP, then the aggregated
|
||||
* route MUST have the ORIGIN attribute with the value
|
||||
* EGP.
|
||||
*/
|
||||
if (origin < ri->attr->origin)
|
||||
origin = ri->attr->origin;
|
||||
|
||||
/* as-set aggregate route generate origin, as path,
|
||||
* community aggregation. */
|
||||
if (aggregate->as_set) {
|
||||
if (aspath) {
|
||||
asmerge = aspath_aggregate(
|
||||
aspath, ri->attr->aspath);
|
||||
aspath_free(aspath);
|
||||
aspath = asmerge;
|
||||
} else
|
||||
aspath = aspath_dup(ri->attr->aspath);
|
||||
|
||||
if (ri->attr->community) {
|
||||
if (community) {
|
||||
commerge = community_merge(
|
||||
community,
|
||||
ri->attr->community);
|
||||
community = community_uniq_sort(
|
||||
commerge);
|
||||
community_free(commerge);
|
||||
} else
|
||||
community = community_dup(
|
||||
ri->attr->community);
|
||||
}
|
||||
}
|
||||
aggregate->count++;
|
||||
}
|
||||
|
||||
/* If this node is suppressed, process the change. */
|
||||
if (match)
|
||||
bgp_process(bgp, rn, afi, safi);
|
||||
}
|
||||
bgp_unlock_node(top);
|
||||
|
||||
bgp_aggregate_install(bgp, afi, safi, p, origin, aspath,
|
||||
community, atomic_aggregate, aggregate);
|
||||
/* Add aggregate route to BGP table. */
|
||||
if (aggregate->count == 0) {
|
||||
if (aspath)
|
||||
aspath_free(aspath);
|
||||
if (community)
|
||||
community_free(community);
|
||||
}
|
||||
}
|
||||
|
||||
/* Aggregate route attribute. */
|
||||
#define AGGREGATE_SUMMARY_ONLY 1
|
||||
#define AGGREGATE_AS_SET 1
|
||||
@ -5956,7 +5871,7 @@ static int bgp_aggregate_set(struct vty *vty, const char *prefix_str, afi_t afi,
|
||||
rn->info = aggregate;
|
||||
|
||||
/* Aggregate address insert into BGP routing table. */
|
||||
bgp_aggregate_add(bgp, &p, afi, safi, aggregate);
|
||||
bgp_aggregate_route(bgp, &p, NULL, afi, safi, NULL, aggregate);
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user