From: Daniel Walton <[email protected]>
Signed-off-by: Daniel Walton <[email protected]>
---
bgpd/bgp_attr.c | 5 +++--
bgpd/bgp_attr.h | 2 +-
bgpd/bgp_route.c | 14 ++++++++++++--
3 files changed, 16 insertions(+), 5 deletions(-)
diff --git a/bgpd/bgp_attr.c b/bgpd/bgp_attr.c
index c4c6cc8..f12f757 100644
--- a/bgpd/bgp_attr.c
+++ b/bgpd/bgp_attr.c
@@ -662,7 +662,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;
@@ -696,7 +697,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 95d9594..ecfb328 100644
--- a/bgpd/bgp_attr.h
+++ b/bgpd/bgp_attr.h
@@ -168,7 +168,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 e581f4a..f6a8f61 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -4850,6 +4850,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;
/* ORIGIN attribute: If at least one route among routes that are
aggregated has ORIGIN with the value INCOMPLETE, then the
@@ -4894,6 +4895,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)
@@ -4980,7 +4984,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);
@@ -5086,6 +5091,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];
@@ -5107,6 +5113,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
@@ -5170,7 +5179,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);
--
1.9.1
_______________________________________________
Quagga-dev mailing list
[email protected]
https://lists.quagga.net/mailman/listinfo/quagga-dev