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

Reply via email to