summaryrefslogtreecommitdiffstats
path: root/lib/heap.c
diff options
context:
space:
mode:
authorChris Hall (GMCH) <chris.hall@highwayman.com>2009-11-26 19:39:35 +0000
committerChris Hall (GMCH) <chris.hall@highwayman.com>2009-11-26 19:39:35 +0000
commit2317760c2dc2348851b68238b83550f38406c307 (patch)
tree83c8a5939e22f03a900c1f664cfccfdd5849cacb /lib/heap.c
parenta7fcfaccece80218c981bdc18837d41e28555305 (diff)
downloadquagga-2317760c2dc2348851b68238b83550f38406c307.tar.bz2
quagga-2317760c2dc2348851b68238b83550f38406c307.tar.xz
Upgrade Prefix-List & BGP Community-List handling
Affects: lib/plist.c & .h and bgpd/bgp_clist.c & .h With very long prefix-lists the repeated scanning of the linked list of prefix_list_entry slowed things down (scaled O(n**2)). For lists of 10,000 or more entries this could consume several *minutes* while reading a configuration file. This is a substantial re-working of the code, making use of new facilities introduced in lib/symtab and lib/vector. The prefix-list names are held in a symbol table. The addition of entries to a prefix-list uses binary-chop searches rather than linear list scans. For bgpd, all references to prefix-lists are replaced by symbol table references. The peer_prefix_list_update function is called every time a prefix-list changes. This used to run through every possible reference to a prefix-list to see if its address needed updating. For other daemons, the old interfaces have been preserved. The prefix match code has been stream-lined a little. The BGP community-list and extcommunity-list handling has also been updated to use a symbol table to hold the names. This improves the processing of route-maps, which look-up the list by name each time it is used. (In the longer term, this should be replaced by the use of symbol references.) Other files affected: bgpd/bgpd.c & .h bgpd/bgp_route.c & .h bgpd/bgp_packet.c bgpd/bgp_vty.c updated to use prefix list references & community list symbols. symtab.c & .h small change to symbol_dec_ref & symbol_zero_ref to return NULL if reference count goes to zero, and the symbol otherwise.
Diffstat (limited to 'lib/heap.c')
0 files changed, 0 insertions, 0 deletions