commit 998274cd7c559bd04d7b7f6e615ad120af915d86 Author: Paul Jakma Date: Tue Jul 21 15:21:20 2009 +0100 [build] Bump release to 0.99.14 commit 638b70ba9893705bb3268aa00c25b8cb0e060b32 Author: Vasilis Tsiligiannis Date: Mon Jul 20 01:25:16 2009 +0300 [bgp] Fix nexthop reachability check on confederations * bgp_route.c: (bgp_update_main) Nexthop reachability should be checked for confederations too in case a prefix is received from more than one confederation peers. commit a294365797da8b72e51507cbf92dbc6940e5103b Author: Paul Jakma Date: Tue Jul 21 14:02:04 2009 +0100 [bgpd] fix typo made by paul in previous commit commit e8eb000e15e2bbe63467d7c056f2b21b72ba7bd6 Author: Timo Teräs Date: Tue Feb 17 12:14:23 2009 +0200 [bgpd] Avoid zombie accepted peer entries Currently, when accepting the connection, it can be left as zombie, when the peer just initiates a connection, but never sends data (and the TCP connection end packets are lost). This happens because for accepted connections a temporary new peer entry is created until OPEN message is exchanged, and this temporary peer entry does not get the hold time parameter set at all. * bgp_network.c: (bgp_accept) Set hold time and keepalive values for ACCEPT peers. commit e7cc3b383e5e9190aa7784554c605a3a661ebe2b Author: Nick Hilliard Date: Tue Mar 17 22:14:25 2009 +0000 [bgpd] Small buffer overrun in bgp_clear_node_queue_init * bgp_route.c: (bgp_clear_node_queue_init) fix buffer overrun. commit 67b9467f6cad5097a3e4c6e49348be4d6c17a5bb Author: Chris Caputo Date: Sat Jul 18 04:02:26 2009 +0000 [zebra] Silence noisy process_subq zebra_rib.c: process_subq(): #ifdef out debug code. commit 228da42898c4f7bd72d9c1ee4135108e8d40d860 Author: Chris Caputo Date: Sat Jul 18 05:44:03 2009 +0000 [bgpd] Stability fixes including bugs 397, 492 I've spent the last several weeks working on stability fixes to bgpd. These patches fix all of the numerous crashes, assertion failures, memory leaks and memory stomping I could find. Valgrind was used extensively. Added new function bgp_exit() to help catch problems. If "debug bgp" is configured and bgpd exits with status of 0, statistics on remaining lib/memory.c allocations are printed to stderr. It is my hope that other developers will use this to stay on top of memory issues. Example questionable exit: bgpd: memstats: Current memory utilization in module LIB: bgpd: memstats: Link List : 6 bgpd: memstats: Link Node : 5 bgpd: memstats: Hash : 8 bgpd: memstats: Hash Bucket : 2 bgpd: memstats: Hash Index : 8 bgpd: memstats: Work queue : 3 bgpd: memstats: Work queue item : 2 bgpd: memstats: Work queue name string : 3 bgpd: memstats: Current memory utilization in module BGP: bgpd: memstats: BGP instance : 1 bgpd: memstats: BGP peer : 1 bgpd: memstats: BGP peer hostname : 1 bgpd: memstats: BGP attribute : 1 bgpd: memstats: BGP extra attributes : 1 bgpd: memstats: BGP aspath : 1 bgpd: memstats: BGP aspath str : 1 bgpd: memstats: BGP table : 24 bgpd: memstats: BGP node : 1 bgpd: memstats: BGP route : 1 bgpd: memstats: BGP synchronise : 8 bgpd: memstats: BGP Process queue : 1 bgpd: memstats: BGP node clear queue : 1 bgpd: memstats: NOTE: If configuration exists, utilization may be expected. Example clean exit: bgpd: memstats: No remaining tracked memory utilization. This patch fixes bug #397: "Invalid free in bgp_announce_check()". This patch fixes bug #492: "SIGBUS in bgpd/bgp_route.c: bgp_clear_route_node()". My apologies for not separating out these changes into individual patches. The complexity of doing so boggled what is left of my brain. I hope this is all still useful to the community. This code has been production tested, in non-route-server-client mode, on a linux 32-bit box and a 64-bit box. Release/reset functions, used by bgp_exit(), added to: bgpd/bgp_attr.c,h bgpd/bgp_community.c,h bgpd/bgp_dump.c,h bgpd/bgp_ecommunity.c,h bgpd/bgp_filter.c,h bgpd/bgp_nexthop.c,h bgpd/bgp_route.c,h lib/routemap.c,h File by file analysis: * bgpd/bgp_aspath.c: Prevent re-use of ashash after it is released. * bgpd/bgp_attr.c: #if removed uncalled cluster_dup(). * bgpd/bgp_clist.c,h: Allow community_list_terminate() to be called from bgp_exit(). * bgpd/bgp_filter.c: Fix aslist->name use without allocation check, and also fix memory leak. * bgpd/bgp_main.c: Created bgp_exit() exit routine. This function frees allocations made as part of bgpd initialization and, to some extent, configuration. If "debug bgp" is configured, memory stats are printed as described above. * bgpd/bgp_nexthop.c: zclient_new() already allocates stream for ibuf/obuf, so bgp_scan_init() shouldn't do it too. Also, made it so zlookup is global so bgp_exit() can use it. * bgpd/bgp_packet.c: bgp_capability_msg_parse() call to bgp_clear_route() adjusted to use new BGP_CLEAR_ROUTE_NORMAL flag. * bgpd/bgp_route.h: Correct reference counter "lock" to be signed. bgp_clear_route() now accepts a bgp_clear_route_type of either BGP_CLEAR_ROUTE_NORMAL or BGP_CLEAR_ROUTE_MY_RSCLIENT. * bgpd/bgp_route.c: - bgp_process_rsclient(): attr was being zero'ed and then bgp_attr_extra_free() was being called with it, even though it was never filled with valid data. - bgp_process_rsclient(): Make sure rsclient->group is not NULL before use. - bgp_processq_del(): Add call to bgp_table_unlock(). - bgp_process(): Add call to bgp_table_lock(). - bgp_update_rsclient(): memset clearing of new_attr not needed since declarationw with "= { 0 }" does it. memset was already commented out. - bgp_update_rsclient(): Fix screwed up misleading indentation. - bgp_withdraw_rsclient(): Fix screwed up misleading indentation. - bgp_clear_route_node(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT. - bgp_clear_node_queue_del(): Add call to bgp_table_unlock() and also free struct bgp_clear_node_queue used for work item. - bgp_clear_node_complete(): Do peer_unlock() after BGP_EVENT_ADD() in case peer is released by peer_unlock() call. - bgp_clear_route_table(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT. Use struct bgp_clear_node_queue to supply data to worker. Add call to bgp_table_lock(). - bgp_clear_route(): Add support for BGP_CLEAR_ROUTE_NORMAL or BGP_CLEAR_ROUTE_MY_RSCLIENT. - bgp_clear_route_all(): Use BGP_CLEAR_ROUTE_NORMAL. Bug 397 fixes: - bgp_default_originate() - bgp_announce_table() * bgpd/bgp_table.h: - struct bgp_table: Added reference count. Changed type of owner to be "struct peer *" rather than "void *". - struct bgp_node: Correct reference counter "lock" to be signed. * bgpd/bgp_table.c: - Added bgp_table reference counting. - bgp_table_free(): Fixed cleanup code. Call peer_unlock() on owner if set. - bgp_unlock_node(): Added assertion. - bgp_node_get(): Added call to bgp_lock_node() to code path that it was missing from. * bgpd/bgp_vty.c: - peer_rsclient_set_vty(): Call peer_lock() as part of peer assignment to owner. Handle failure gracefully. - peer_rsclient_unset_vty(): Add call to bgp_clear_route() with BGP_CLEAR_ROUTE_MY_RSCLIENT purpose. * bgpd/bgp_zebra.c: Made it so zclient is global so bgp_exit() can use it. * bgpd/bgpd.c: - peer_lock(): Allow to be called when status is "Deleted". - peer_deactivate(): Supply BGP_CLEAR_ROUTE_NORMAL purpose to bgp_clear_route() call. - peer_delete(): Common variable listnode pn. Fix bug in which rsclient was only dealt with if not part of a peer group. Call bgp_clear_route() for rsclient, if appropriate, and do so with BGP_CLEAR_ROUTE_MY_RSCLIENT purpose. - peer_group_get(): Use XSTRDUP() instead of strdup() for conf->host. - peer_group_bind(): Call bgp_clear_route() for rsclient, and do so with BGP_CLEAR_ROUTE_MY_RSCLIENT purpose. - bgp_create(): Use XSTRDUP() instead of strdup() for peer_self->host. - bgp_delete(): Delete peers before groups, rather than after. And then rather than deleting rsclients, verify that there are none at this point. - bgp_unlock(): Add assertion. - bgp_free(): Call bgp_table_finish() rather than doing XFREE() itself. * lib/command.c,h: Compiler warning fixes. Add cmd_terminate(). Fixed massive leak in install_element() in which cmd_make_descvec() was being called more than once for the same cmd->strvec/string/doc. * lib/log.c: Make closezlog() check fp before calling fclose(). * lib/memory.c: Catch when alloc count goes negative by using signed counts. Correct #endif comment. Add log_memstats_stderr(). * lib/memory.h: Add log_memstats_stderr(). * lib/thread.c: thread->funcname was being accessed in thread_call() after it had been freed. Rearranged things so that thread_call() frees funcname. Also made it so thread_master_free() cleans up cpu_record. * lib/vty.c,h: Use global command_cr. Add vty_terminate(). * lib/zclient.c,h: Re-enable zclient_free(). commit 54a15182e05ca757db3bb90a4135e9f8fd3c84f2 Author: Chris Caputo Date: Sat Jul 18 05:42:34 2009 +0000 [bgpd] Fix compiler warnings related to MD5 This patch fixes: bgp_network.c: In function 'bgp_md5_set': bgp_network.c:107: warning: cast from pointer to integer of different size bgp_network.c: In function 'bgp_socket': bgp_network.c:447: warning: cast to pointer from integer of different size commit 62c9f504bdd4b09df6cf677e96367f3b31ef9dea Author: Paul Jakma Date: Sun Jul 19 17:33:21 2009 +0100 [build] fix default CFLAGS and squish warning * configure.ac: Move down the AC_SYS_LARGEFILE test - it was setting CFLAGS and so disabling the default CFLAGS setting section. Squish warning by adding AC_CONFIG_MACRO_DIR on the reccommendation of autoreconf. commit fd35b948dbb35674cd9ded431f94b59aeced40cc Author: Paul Jakma Date: Thu Jul 16 19:27:32 2009 +0100 [bgpd] Bug #533: Fix crash with copy/pasted commands, inc 'no bgp ...' * bgpd.c: Removal of (struct bgp *) from the master list was being left to bgp_free time. This meant there was a window of time between bgp_delete and refcounts hitting 0 (e.g. routes to be processed) where bgp_lookup's could return a deleted (struct bgp *). (bgp_delete) This is the logical place where a (struct bgp *) should lose its visibility, so move the deletion from the bgp-master list to here, from bgp_free. Many thanks to Fritz Reichmann for his thorough debugging of the problem and testing of fixes and Chris Caputo for his further analysis. commit 3fa3f957e70f594cc2c1cac03644ddf48554c178 Author: Stephen Hemminger Date: Sat Jul 11 21:27:51 2009 -0700 [lib] Fix IPv6 normalisation * lib/sockunion.c: (sockunion_normalise_mapped) The code to normalize address was not copying port value - probably reason why IPV4 in IPV6 never worked right. commit 9b4ef258a9d9c5f1052afe0e19ebaef9f6740fa2 Author: Tom Henderson Date: Thu Jul 16 17:20:37 2009 +0100 [ospf6d] Fix regression in monotonic time patch - LSA max-aging broke * ospf6_lsa.c: (ospf6_lsa_premature_aging) set age to MAX_AGE - don't rely on 0 magically meaning same. (ospf6_lsa_age_current) handle MAXAGE. commit 41b2373cece77f0cc9a06fba076c99a7be653593 Author: Paul Jakma Date: Tue Jun 30 16:12:49 2009 +0100 [lib/cleanup] Use a typedef for the thread type * lib/thread.{c,h}: As per subject. This will avoid head-scratching for next person who adds a thread-type and gets strange breakage. commit bd2462425205a681d75e04c94a94bf4cea5da58b Author: Joakim Tjernlund Date: Mon Jan 5 17:44:46 2009 +0100 [ospfd] Do not use stale Network/Router LSAs Should a self originated Network/Router LSA with higher LS seq. nr. be received we should flood and install it in the LSDB but we cannot use it for our internal calculations as it is stale. Reorginate an new LSA to replace the stale one as soon as possible. commit 650f76c2e1b0b12e1c46fdd3be22c5f505245d83 Author: Paul Jakma Date: Thu Jun 25 18:06:31 2009 +0100 [bgpd] Log a debug/update warning if filters are configured but don't exist * bgp_route.c: (bgp_{input,output}_filter) Log a debug warning if a route is received or sent and a filter name is configured for a prefix, as or distribute list but none is found - guaranteed configuration mistake. commit 439c52f19007badffc6707673121f5a76784e728 Author: Joakim Tjernlund Date: Mon Dec 1 16:25:06 2008 +0100 Add test for Internet checksum. Add 2 impl. of the Internet Checksum. One new optimized nad one form RFC 1071. Turns out that the current Quagga in_cksum() is buggy. On Big Endian routers it miscalculates odd sized buffers. commit 77a1c4e05ca5a7d7bf07456758f7c934ee867884 Author: Joakim Tjernlund Date: Sun Feb 1 11:12:11 2009 +0100 [ospfd] compare ifIndex too when matching paths ospf_path_lookup(), ospf_route_match_same() and ospf_ase_route_match_same() needs to compare if the interface matches too. commit cbcd9bfc503f08b99f5360b1aae3a5362d25a665 Author: Joakim Tjernlund Date: Mon Feb 16 09:40:39 2009 +0100 [doc] Add "--disable-doc" to configure Configure option "--disable-doc" will prevent building the documents under doc. Saves build time and the need to have document building tools installed. Useful when your build machine is different from your development machine. commit 3d8617b853af511ca5f019b2f51c7902e2689212 Author: Joakim Tjernlund Date: Wed Feb 4 15:05:19 2009 +0100 [ospfd] external LSA route_unlock_node() fixes A few route_unlock_node() calls was missing. commit f65431380428c3cb8eb5c0a0ac93debc30717a3f Author: Joakim Tjernlund Date: Tue Nov 4 13:37:29 2008 +0000 [ospfd] Fix a few LSA performance "bugs" ospf_lsa_install() will calculate LSA checksum so no need to do it before calling ospf_lsa_install(). Set the OSPF_LSA_SELF_CHECKED flag on own LSA's to save ospf_lsa_is_self_originated() some work. Do not memset() memory that is about to overwritten with memcpy(). commit c3a5606302777cdd33d4025fc30bed723fc84d79 Author: Joakim Tjernlund Date: Wed Jun 24 19:15:36 2009 +0200 zebra: Static route does not reach kernel. A static route like below: ip route 172.16.1.0/30 192.168.101.162 11 does not move properly to a new interface when the interface used goes down. Zebra reports that it have moved but kernel isn't informed so the route is lost. * zebra_rib.c: (nexthop_active_update) if ifindex has changed, then the route should be considered to have changed. Signed-off-by: Joakim Tjernlund commit 3f4ab7f9e9ffaee7c448744f45d6e5e2176cce89 Author: Tomasz Pala Date: Wed Jun 24 22:23:11 2009 +0100 [vtysh] Save vtysh history to a file vtsh_main.c: save 1000 last lines of history to $HOME/.history_quagga (the file must be created by hand first, this is intended behaviour) commit 80abd9fe37d8aa5d929686f3d4a717b72bfacb3c Author: Tomasz Pala Date: Wed Jun 24 22:09:46 2009 +0100 [configure] Allow for large-file support, e.g. for log files >2GB commit 3fc1eca92a7022f1c5b567505a7d86aab0d3cbd4 Author: Tomasz Pala Date: Wed Jun 24 21:48:22 2009 +0100 [cleanup] Add log.h includes commit 2a71e9ce89c6f76c099dea67dddbe8da454d9de7 Author: Tomasz Pala Date: Wed Jun 24 21:36:50 2009 +0100 [bgpd] Add 'show ip bgp view WORD neighbors IP (advertised|received)-routes' * bgp_route.c: Was missing these commands. commit c9035ccd13078b6a5d53566979a66c1ac892b47a Author: Dmitry Tejblum Date: Wed Jun 24 20:14:30 2009 +0400 [ospfd] discount IP header size from a new LSA pkt commit 014b670e02cc1f38e8e4e786269fc1787412f9b7 Author: Denis Ovsienko Date: Tue Jun 23 21:10:45 2009 +0400 [bgpd] review 32-bit AS-path hotfix for 0.99.12 The patch by Chris Caputo, which was used to prepare 0.99.12 release, consists of three parts: 1. memory allocation fix itself 2. fix for warnings about constant variables 3. fix for printf format specs (%d was used instead of %u) It was confirmed later, that: a. a much simpler bugfix was available for memory allocation b. committed version of the bugfix wasn't optimal CPU-wise At this point I consider reasonable to revert the allocation portion of that patch and to replace it with the shorter version, which is: -#define ASN_STR_LEN (5 + 1) +#define ASN_STR_LEN (10 + 1) Other two parts of Mr. Caputo's patch remain intact. commit d13c3b4fcf802f904ef47ad82fdc9763fc704fdf Author: Mathieu Goessens Date: Tue Jun 23 15:59:45 2009 +0100 [zebra] linux policy routing support with ipv6 Quagga support linux policy routing (ip route ... table $X) with zebra.conf table $X option. It works fine on ipv4. On ipv6 the parameter is ignored (table 0 is used). * zebra/...: Pass appropriate table arg to rib_{add,delete}_ipv6 commit 3523bea8cbe98c83e3d1bdeb60180c8e59622773 Author: Jingjing Duan Date: Tue Jun 23 17:28:23 2009 +0400 [trivia] work around ksh93 builtin name (#451) ksh93 script cannot have 'stop' functions w/o cancelling existing definition first. Fixed. commit 50aef6f3b0e36b56cfa9f3d374be0c1d25c30c45 Author: Chris Caputo Date: Tue Jun 23 06:06:49 2009 +0000 Fix "show ip bgp dampened-paths" garbage output. * bgpd/bgp_damp.c: Make bgp_damp_reuse_time_vty() accept a buffer and length, rather than returning a local var buffer whose contents can get trounced. Remove duplicate BGP_UPTIME_LEN define. * bgpd/bgp_damp.h: bgp_damp_reuse_time_vty() prototype change. * bgpd/bgp_route.c: Provide bgp_damp_reuse_time_vty() with a buffer and length. Remove duplicate BGP_UPTIME_LEN define. This problem was noticed in 2005... http://hibernia.jakma.org/~paul/patches/quagga-test.diff ...but the fix didn't make it into the code. Signed-off-by: Chris Caputo commit 6e79f8bba438823d84b7464a9acc1e6fc9126a27 Author: Chris Caputo Date: Tue Jun 23 05:55:57 2009 +0000 Fix vtysh based "write term" output. * vtysh/vtysh.c: "end" should be printed at the bottom, not the top. * vtysh/vtysh_config.c: PROTOCOL_NODE was not being handled, and thus was being displayed at the top of a config, rather than in its rightful place near the bottom. Signed-off-by: Chris Caputo commit 2b35ae41c2c5d39801c943fa740c72fc15613141 Author: Chris Caputo Date: Tue Jun 23 05:34:29 2009 +0000 Fixes to RFC2385/MD5 BGP * bgpd/bgp_network.c: Fix MD5 listen in IPv4 version of bgp_socket() by adding listen socket to listen_sockets list so that MD5 passwords can get set. * lib/sockopt.c: (sockopt_tcp_signature) Fix bogus "% Error while applying TCP-Sig to session(s)" / "can't set TCP_MD5SIG option" startup error messages by not returning error when there isn't one. commit 774eb1524c3a1e0a9567e6aff3315b4686ab3e75 Author: Dmitry Tejblum Date: Tue Jun 23 17:16:32 2009 +0400 [ospfd] cancel OSPF timer hack in nsm_change_state This piece of code causes all Quagga routers on a broadcast link to send a HELLO packet simultaneously if they see a new neighbor. It also resets the HELLO timer, so all the quagga routers will continue to send HELLO packets simultaneously in the future. This is not good (especially on networks with a lot of Quagga routers connected), and is explicitly discouraged by the OSPF standard, RFC 2328 (chapter 4.4.Timers). I suggest to remove the code snippet, it does not provide much benefit anyway. commit b60668d092f1778395b6c10b406059b8cbf235b8 Author: Chris Caputo Date: Sun May 3 04:40:57 2009 +0000 RFC 4191 Default Router Preference support for router advertisements Adds "ipv6 nd router-preference (high|medium|low)" and "no ipv6 nd router-preference" interface commands. Files modified: doc/ipv6.texi zebra/interface.c zebra/interface.h zebra/rtadv.c zebra/rtadv.h Signed-off-by: Chris Caputo