From: Daniel Walton <[email protected]> There were various failures in ANVL's aggregation tests
Signed-off-by: Daniel Walton <[email protected]> --- bgpd/bgp_aspath.c | 3 +++ bgpd/bgp_attr.c | 1 + bgpd/bgp_route.c | 28 +++++++++++++++++++--------- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/bgpd/bgp_aspath.c b/bgpd/bgp_aspath.c index 11823e9..1496340 100644 --- a/bgpd/bgp_aspath.c +++ b/bgpd/bgp_aspath.c @@ -1065,6 +1065,9 @@ aspath_aggregate (struct aspath *as1, struct aspath *as2) if (match != minlen || match != seg1->length || seg1->length != seg2->length) break; + /* We are moving on to the next segment to reset match */ + else + match = 0; seg1 = seg1->next; seg2 = seg2->next; diff --git a/bgpd/bgp_attr.c b/bgpd/bgp_attr.c index 88a0aa9..8f77f55 100644 --- a/bgpd/bgp_attr.c +++ b/bgpd/bgp_attr.c @@ -655,6 +655,7 @@ bgp_attr_default_intern (u_char origin) return new; } +/* Create the attributes for an aggregate */ struct attr * bgp_attr_aggregate_intern (struct bgp *bgp, u_char origin, struct aspath *aspath, diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 69811fb..dcce000 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -4695,6 +4695,7 @@ bgp_aggregate_free (struct bgp_aggregate *aggregate) XFREE (MTYPE_BGP_AGGREGATE, aggregate); } +/* Update an aggregate as routes are added/removed from the BGP table */ static void bgp_aggregate_route (struct bgp *bgp, struct prefix *p, struct bgp_info *rinew, afi_t afi, safi_t safi, struct bgp_info *del, @@ -4767,11 +4768,11 @@ bgp_aggregate_route (struct bgp *bgp, struct prefix *p, struct bgp_info *rinew, aggregate->count++; + if (origin < ri->attr->origin) + origin = ri->attr->origin; + if (aggregate->as_set) { - if (origin < ri->attr->origin) - origin = ri->attr->origin; - if (aspath) { asmerge = aspath_aggregate (aspath, ri->attr->aspath); @@ -4808,11 +4809,11 @@ bgp_aggregate_route (struct bgp *bgp, struct prefix *p, struct bgp_info *rinew, if (aggregate->summary_only) (bgp_info_extra_get (rinew))->suppress++; + if (origin < rinew->attr->origin) + origin = rinew->attr->origin; + if (aggregate->as_set) { - if (origin < rinew->attr->origin) - origin = rinew->attr->origin; - if (aspath) { asmerge = aspath_aggregate (aspath, rinew->attr->aspath); @@ -4932,6 +4933,7 @@ 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) @@ -4978,13 +4980,21 @@ bgp_aggregate_add (struct bgp *bgp, struct prefix *p, afi_t afi, safi_t safi, 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 (origin < ri->attr->origin) - origin = ri->attr->origin; - if (aspath) { asmerge = aspath_aggregate (aspath, ri->attr->aspath); -- 1.9.1 _______________________________________________ Quagga-dev mailing list [email protected] https://lists.quagga.net/mailman/listinfo/quagga-dev
