summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJorge Boncompte [DTI2] <jorge@dti2.net>2012-05-07 16:53:10 +0000
committerDavid Lamparter <equinox@opensourcerouting.org>2012-05-22 20:35:50 +0200
commitf018db83a0746f9336d04e50dd06f3bbf6565f1c (patch)
tree4c2ba0e661abd2651ee6fa1bd7be9157c8859411
parent343aa82219c0cab0315e29267eb303127215caea (diff)
bgpd: optimize bgp_aggregate_[increment|decrement]()
If there were no aggregates configured this functions were allocating and freeing a struct bgp_node for every call, and it's called for every prefix received. * bgp_route.c: Bail out early if the there are no aggregates configured. Change from bgp_node_get() to bgp_node_lookup() that does not allocate a new struct bgp_node if not found. Signed-off-by: Jorge Boncompte [DTI2] <jorge@dti2.net> Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
-rw-r--r--bgpd/bgp_route.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index ce0b57b9..cd8f3fea 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -4660,18 +4660,27 @@ bgp_aggregate_increment (struct bgp *bgp, struct prefix *p,
struct bgp_node *child;
struct bgp_node *rn;
struct bgp_aggregate *aggregate;
+ struct bgp_table *table;
/* MPLS-VPN aggregation is not yet supported. */
if (safi == SAFI_MPLS_VPN)
return;
+ table = bgp->aggregate[afi][safi];
+
+ /* No aggregates configured. */
+ if (table->top == NULL)
+ return;
+
if (p->prefixlen == 0)
return;
if (BGP_INFO_HOLDDOWN (ri))
return;
- child = bgp_node_get (bgp->aggregate[afi][safi], p);
+ child = bgp_node_lookup (table, p);
+ if (! child)
+ return;
/* Aggregate address configuration check. */
for (rn = child; rn; rn = rn->parent)
@@ -4690,15 +4699,24 @@ bgp_aggregate_decrement (struct bgp *bgp, struct prefix *p,
struct bgp_node *child;
struct bgp_node *rn;
struct bgp_aggregate *aggregate;
+ struct bgp_table *table;
/* MPLS-VPN aggregation is not yet supported. */
if (safi == SAFI_MPLS_VPN)
return;
+ table = bgp->aggregate[afi][safi];
+
+ /* No aggregates configured. */
+ if (table->top == NULL)
+ return;
+
if (p->prefixlen == 0)
return;
- child = bgp_node_get (bgp->aggregate[afi][safi], p);
+ child = bgp_node_lookup (table, p);
+ if (! child)
+ return;
/* Aggregate address configuration check. */
for (rn = child; rn; rn = rn->parent)