summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2015-05-19 17:47:24 -0700
committerDonald Sharp <sharpd@cumulusnetworks.com>2015-05-19 17:47:24 -0700
commitb5d58c32bb74cf2fa0aa43a07396b06765d54ac0 (patch)
tree01d019a7c977ddf030f91b6106df54b8c124bf38
parentc01acf98d982ed665ea5bc244c9b6dc7b5dacffa (diff)
Fix aggregation issues found via ANVL
Signed-off-by: Daniel Walton <dwalton@cumulusnetworks.com>
-rw-r--r--bgpd/bgp_aspath.c3
-rw-r--r--bgpd/bgp_attr.c1
-rw-r--r--bgpd/bgp_route.c28
3 files changed, 23 insertions, 9 deletions
diff --git a/bgpd/bgp_aspath.c b/bgpd/bgp_aspath.c
index 996101a279..8fe5280286 100644
--- a/bgpd/bgp_aspath.c
+++ b/bgpd/bgp_aspath.c
@@ -1044,6 +1044,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 f76309640b..b617fe64cb 100644
--- a/bgpd/bgp_attr.c
+++ b/bgpd/bgp_attr.c
@@ -646,6 +646,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 5e8eec3929..b1c792e4f4 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -4800,6 +4800,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,
@@ -4889,11 +4890,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);
@@ -4930,11 +4931,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);
@@ -5055,6 +5056,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)
@@ -5105,13 +5107,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);