From: Donald Sharp Date: Wed, 20 May 2015 00:47:21 +0000 (-0700) Subject: atomic-aggregate is lost when we aggregate another aggregate that has atomic-aggregate X-Git-Tag: frr-2.0-rc1~1513 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=42f7e184884424f903c589f2c3d34613df558073;p=matthieu%2Ffrr.git atomic-aggregate is lost when we aggregate another aggregate that has atomic-aggregate --- diff --git a/bgpd/bgp_attr.c b/bgpd/bgp_attr.c index 7709ff4a4c..f76309640b 100644 --- a/bgpd/bgp_attr.c +++ b/bgpd/bgp_attr.c @@ -649,7 +649,8 @@ bgp_attr_default_intern (u_char origin) struct attr * bgp_attr_aggregate_intern (struct bgp *bgp, u_char origin, struct aspath *aspath, - struct community *community, int as_set) + struct community *community, int as_set, + u_char atomic_aggregate) { struct attr attr; struct attr *new; @@ -683,7 +684,7 @@ bgp_attr_aggregate_intern (struct bgp *bgp, u_char origin, #ifdef HAVE_IPV6 attre.mp_nexthop_len = IPV6_MAX_BYTELEN; #endif - if (! as_set) + if (! as_set || atomic_aggregate) attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_ATOMIC_AGGREGATE); attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_AGGREGATOR); if (CHECK_FLAG (bgp->config, BGP_CONFIG_CONFEDERATION)) diff --git a/bgpd/bgp_attr.h b/bgpd/bgp_attr.h index 91626f25c6..4285c75522 100644 --- a/bgpd/bgp_attr.h +++ b/bgpd/bgp_attr.h @@ -169,7 +169,7 @@ extern struct attr *bgp_attr_default_set (struct attr *attr, u_char); extern struct attr *bgp_attr_default_intern (u_char); extern struct attr *bgp_attr_aggregate_intern (struct bgp *, u_char, struct aspath *, - struct community *, int as_set); + struct community *, int as_set, u_char); extern bgp_size_t bgp_packet_attribute (struct bgp *bgp, struct peer *, struct stream *, struct attr *, struct prefix *, afi_t, safi_t, diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c index 4638d75129..5e8eec3929 100644 --- a/bgpd/bgp_route.c +++ b/bgpd/bgp_route.c @@ -4819,6 +4819,7 @@ bgp_aggregate_route (struct bgp *bgp, struct prefix *p, struct bgp_info *rinew, struct bgp_info *new; int first = 1; unsigned long match = 0; + u_char atomic_aggregate = 0; /* Record adding route's nexthop and med. */ if (rinew) @@ -4874,6 +4875,9 @@ bgp_aggregate_route (struct bgp *bgp, struct prefix *p, struct bgp_info *rinew, } #endif /* AGGREGATE_NEXTHOP_CHECK */ + if (ri->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ATOMIC_AGGREGATE)) + atomic_aggregate = 1; + if (ri->sub_type != BGP_ROUTE_AGGREGATE) { if (aggregate->summary_only) @@ -4960,7 +4964,8 @@ bgp_aggregate_route (struct bgp *bgp, struct prefix *p, struct bgp_info *rinew, rn = bgp_node_get (table, p); new = info_make(ZEBRA_ROUTE_BGP, BGP_ROUTE_AGGREGATE, bgp->peer_self, bgp_attr_aggregate_intern(bgp, origin, aspath, community, - aggregate->as_set), rn); + aggregate->as_set, + atomic_aggregate), rn); SET_FLAG (new->flags, BGP_INFO_VALID); bgp_info_add (rn, new); @@ -5065,6 +5070,7 @@ bgp_aggregate_add (struct bgp *bgp, struct prefix *p, afi_t afi, safi_t safi, struct aspath *asmerge = NULL; struct community *community = NULL; struct community *commerge = NULL; + u_char atomic_aggregate = 0; table = bgp->rib[afi][safi]; @@ -5086,6 +5092,9 @@ bgp_aggregate_add (struct bgp *bgp, struct prefix *p, afi_t afi, safi_t safi, 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) { /* summary-only aggregate route suppress aggregated @@ -5141,7 +5150,8 @@ bgp_aggregate_add (struct bgp *bgp, struct prefix *p, afi_t afi, safi_t safi, rn = bgp_node_get (table, p); new = info_make(ZEBRA_ROUTE_BGP, BGP_ROUTE_AGGREGATE, bgp->peer_self, bgp_attr_aggregate_intern(bgp, origin, aspath, community, - aggregate->as_set), rn); + aggregate->as_set, + atomic_aggregate), rn); SET_FLAG (new->flags, BGP_INFO_VALID); bgp_info_add (rn, new);