diff options
author | Jorge Boncompte [DTI2] <jorge@dti2.net> | 2012-05-07 16:53:10 +0000 |
---|---|---|
committer | David Lamparter <equinox@opensourcerouting.org> | 2012-05-22 20:35:50 +0200 |
commit | f018db83a0746f9336d04e50dd06f3bbf6565f1c (patch) | |
tree | 4c2ba0e661abd2651ee6fa1bd7be9157c8859411 | |
parent | 343aa82219c0cab0315e29267eb303127215caea (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.c | 22 |
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) |