summaryrefslogtreecommitdiffstats
path: root/bgpd/bgp_advertise.c
Commit message (Collapse)AuthorAgeFilesLines
* Merge Quagga master branch -- as of 1-Mar-2012 -- into euro_ix_bex21bChris Hall2012-03-171-0/+1
|\ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Version 0.99.20ex21b This brings us up to date with: commit 48f99b0c2bfed8d3880732d188e1d5964f575ee4 Date: Thu Sep 29 16:55:23 2011 +0400 release: 0.99.20 and the subsequent: commit dc00d2bb56aa6a84dd2328133f69db3c3e6d9dc7 Date: Sun Jan 8 14:47:06 2012 +0000 Marker merge for 'RE-0.99.17.6' This marker merge (i.e. an 'ours' strategy merge) is a placeholder to show that all commits in Quagga-RE stable, to its release RE-0.99.17.6 tag, have been reviewed and merged into 'master'. and then further commits (in descending date order) commit b51a3a31500133e3e26f12e7639f297c655bc735 commit ef2d5d100431031c32ea35b3c834b46cff16f511 commit 4c78376f96cd2ca56f1c6476b76fd659654431f5 commit e854095932260b3e6187902aa9a7baa0e96b9428 commit e6b03b77766dce8009ad7b4a2392e14addf4ab0f commit c25eaffdb2190149e768dc4ee4efc913c6d02992 commit d034aa027ef44d0a74805c27ad2a4d8ea20395d1 commit 907fd95e502e10334e5390c73cc57588b88b8171 commit 7fd6cd819ff98f0580b745ba637990df9c20ef0f commit 4c0cf00afc4340a429a9c4830f638b4593d7c3af commit 4afa50b393ff1fb34dd577888a05b81dfdced5af commit 6eb0c5ab1d43bcf9edd4fefd19031f2b96ded728 commit aca43b656623f38dfa6ea835dacbdfec51d03a67 commit 6bb1273e83c29b3aeff9584bc8f6272e773294ad commit d660f698427277ce695a5b756f3143c8304274ea commit 6134b875f39986564aced5e2d7329fcd852f17f4 commit b4e45f67057be22133b6bec88cdf285d5c8214db commit 6eac79a6fed4842e00607c00c445213b51bba377 commit cb32fd690a957819865219a847e3c21a53a0f419 commit 73bfe0bd9adb8e4dfcee7239e56a425c6d58f4e9 commit f768f367bcd1f37a53c563495176a5a134caf234 commit c7ec179a95c1ed4fcd3d3be3f981c8c20dce534a commit cddf391bf6839e9f093cef15508669c1f3f92122 commit 5a616c08ce089e25dc0e8da920727af4d11279bf commit 6ae93c058725991df5a9ae35cefec368919b5fea commit fc98d16ea77372f4ab4231e8904f8467e8d1ef71 A summary of the changes that relate to bppd, zebra and the lib follows. bgpd changes * attribute handling: (a) now checks the flag byte for all attributes and issues suitable log messages and notifications, (b) reports some length issues that previously let slide (local pref). Tighten End-of-RIB detection -- now iff an MP_UNREACH is the *only* attribute and no ordinary update or withdraw. * added --socket/-z option -- sets zebra socket name * sets IPv6 tclass as required * improved next hop handling and added "show ip bgp scan" and "show ip bgpd scan detail" commands. see commits: fc98d16ea77372f4ab4231e8904f8467e8d1ef71 0e8032d69961ae196c11ba6ead856084c7acf7c2 b64bfc1c4a552fc0b4dd024d5f77171ec848a5df 318f0d8a7f5e8e87086bbf2a9e7c4b35638951ac 8e80bdf20f493a71bcf74262ed3aa3a2437f4df6 f04a80a5d209dbb54f6fec5d0149b7c0e489d29e * removed SAFI_UNICAST_MULTICAST * fiddled with SAFI_MPLS_LABELED_VPN -- unsure if this is now complete -- stuff here TODO ! * support for multicast SAFI see commits: 73bfe0bd9adb8e4dfcee7239e56a425c6d58f4e9 5a616c08ce089e25dc0e8da920727af4d11279bf * added "match probability" commands * uses "route_types.txt" more effectively -- which affects the implementation of "redistribute" commands see commit: e0ca5fde7be5b5ce90dae78c2477e8245aecb8e9 * "nexthop-local unchanged" included in configuration. zebra changes * some whitespace change clutter :-( * ZEBRA_HELLO and mopping up routes (BZ#448) * implement route_types.h * support for SAFI_MULTICAST commit f768f367bcd1f37a53c563495176a5a134caf234 IPv6 MP-BGP Routes addition and deletion commit cddf391bf6839e9f093cef15508669c1f3f92122 IPv4 MP-BGP Routes addition and deletion * brought up to date with RFC6275 * add --socket/-z option * add "ipv6 nd mtu <1-65535>" commands lib changes * filter-list handling -- does not free the filter-list before calling the delete_hook(). However, unlike commit 6a2e0f36b103386e57dbe3a6ee4716e809111198 *does* remove the filter-list from the name look-up, before calling the delete_hook() -- which I believe works better. * md5.c now includes RFC 2104 HMAC However fixed to remove compiler warning, by replacing use of caddr_t by unsigned char*. Some phantom whitespace changes elsewhere * prefix.c: commits d171bf58ef12ace43d48565e6870722dece1e6ed 051954f574b9c26458518a7029aeed118f0da620 9663386f16e6285a322747514527fdf1d19788e4 - optimise masklen2ip() and apply_mask_ipv4() -- the version here should work on a Big-Endian machine as well. - optimise ip_masklen() -- the version here should (a) work on a Big-Endian machine, (b) give the same result as before if the netmask is not, in fact, valid, and (c) uses just 256 bytes of table -- not 64K. Version here is probably not quite as fast as the previous patch... but certainly faster that what was there before. * zclient.c: introduced zclient_serv_path, for general zclient and for bgpd zlookup. Added ZEBRA_HELLO to client start. Added safi to ipv4 and ipv6 route add/delete.
* | Merge with main Quagga source as of 29-Jul-2011.ex17Chris Hall2011-08-121-5/+5
|\| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Create euro_ix branch. Update version to: 0.99.18ex17 Of particular note: * includes support for GTSM: neighbor ... ttl-security hops X no neighbor ... ttl-security hops X where X is 1-254. For usual case of immediately connected peer, X == 1. Cannot set ttl-security while ebgp-multihop is set, and vice-versa. If underlying O/S does not support GTSM, then will set ttl as per ebgp-multihop. In passing, have fixed various bugs in the main Quagga branch. * initial support for draft-ietf-idr-optional-transitive Does not yet support "neighbor-complete" flag. * main Quagga now uses TCP_CORK and permanent non-blocking Do not beleive TCP_CORK to be necessary for euro_ix code... which has a different buffering strategy. The euro_ix code already runs sockets permanently non-blocking. * various fixes to attribute intern/unintern Trying to remove memory leaks. Nobody seems convinced that this has been perfected, yet. * fixes for ospfd and ospf6d issues. Up to date with master branch up to: commit 538cb284864c17de66152a5236db4cd80e3e7639 Merge: 036a6e6 8ced4e8 Author: Paul Jakma <paul@quagga.net> Date: Fri Jul 29 18:21:50 2011 +0100
| * bgpd: Try fix extcommunity resource allocation probs, particularly with 'set ↵Paul Jakma2011-03-211-5/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | extcom..' * Extended communities has some kind of resource allocation problem which causes a double-free if the 'set extcommunity ...' command is used. Try fix by properly interning extcommunities. Also, more generally, make unintern functions take a double pointer so they can NULL out callers references - a usefully defensive programming pattern for functions which make refs invalid. Sadly, this patch doesn't fix the problem entirely - crashes still occur on session clear. * bgp_ecommunity.h: (ecommunity_{free,unintern}) take double pointer args. * bgp_community.h: (community_unintern) ditto * bgp_attr.h: (bgp_attr_intern) ditto * bgp_aspath.h: (bgp_aspath.h) ditto * (general) update all callers of above * bgp_routemap.c: (route_set_ecommunity_{rt,soo}) intern the new extcom added to the attr, and unintern any old one. (route_set_ecommunity_{rt,soo}_compile) intern the extcom to be used for the route-map set. (route_set_ecommunity_*_free) unintern to match, instead of free (route_set_ecommunity_soo) Do as _rt does and don't just leak any pre-existing community, add to it (is additive right though?)
* | Reworking of peer state handling.Chris Hall2010-07-191-4/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This fixes a reported assert() in 'no neighbor xxx'. It also fixes other issues found when reviewing and testing that. Also fixed is a reported segfault caused by prefix lists without explicit sequence numbers. Peer State ========== Tightened up the peer state handling, including: * shades of pIdle -- depending on some peer flags and the session, if any * state transitions -- particularly pEstablished -> pIdle or pClearing * handling if deleting peer and associated session * handling of PEER_DOWN_XXX -- why peer was last downed * handling of last NOTIFICATION sent/received RS Client RIBs ============== Cleared up places where RS Client RIBs were not disposed of properly when a peer's afi/safi state changed, in particular: -- when deactivating an afi/safi -- when unsetting the rs client state for an afi/safi -- when binding a peer to a group for an afi/safi In the past these issues were probably invisible, except for a slight leak of memory. With the newer code these issues triggered some asserts when closing down a peer or the entire program. Program Termination =================== Now terminates by deleting all peers -- essentially 'no neighbor' for all peers. Each time a peer is set to be deleted bm->peer_linger_count is incremented, when the peer finally is deleted, the count is decremented. So while in program_terminating state, all nexuses continue to run until the Routing Engine spots that there are no peers left to delete. Then all nexuses are shut down and the program finally terminates. To do this, when termination starts a new Routing Engine foreground task is added, which calls program_terminate_if_all_peers_deleted(). Accept() Status for Session =========================== The accept() code needs to find the session associated with the incoming IP address. Then it needs to see if can accept the incoming connection. It looks up the IP address in the Peer Index (under its Mutex). Previously: the Peer Index entry contained a pointer to the accepting connection (if any), and the session had a pointer to the Peer Index entry so that it could set/clear the accept field in that entry. Now: have removed the accept field in the Peer Index entry, and the pointer from the session to that entry. There is now an "accept" flag in the session structure -- so setting/clearing accept does not have to fiddle with any state to do with the peer. Which seems cleaner. To find the session, the accept() code goes via the Peer Index and then via the peer to find the session. This is done under the Peer Index Mutex. To support that, the Routing Engine only changes the peer->session pointer under the same Mutex. General Changes =============== 1. name changes: peer_lock -> bgp_peer_lock etc. 2. bgp_notify_send -> bgp_peer_down_error bgp_notify_send_with_data -> bgp_peer_down_error_with_data 3. name changes: bgp_peer_sIdle -> bgp_peer_pIdle etc. 4. changing int to bool 5. added "received" flag to bgp_notify structure Files Affected ============== configure.ac -- set version to 0.99.15ex02 bgpd/bgp.h -- format changes only bgpd/bgp_advertise.c -- (1) bgpd/bgp_attr.c -- (2) bgpd/bgp_common.h -- (3) bgpd/bgp_connection.c -- (4) for session->active - adding session->accept flag - removing peer index accept entry - adding bgp_connection_query_accept() bgpd/bgp_connection.h -- adding bgp_connection_query_accept() bgpd/bgp_debug.c -- (3) (5) - changed bgp_notify_print() to remove "sending" parameter and use (5) bgpd/bgp_debug.h -- changed bgp_notify_print() bgpd/bgp_fsm.c -- added TODO for NSF and for CollisionDetectEstablishedState bgpd/bgp_main.c -- (4) for various flags - added static bool program_terminating - used "mqb_priority" name instead of "1" - ignore SIGHUP and SIGTERM messages once is "program_terminating" - added program_terminate_if_all_peers_deleted() - in SIGTERM: set program_terminating and add the foreground hook. bgpd/bgp_mplsvpn.c -- (3) bgpd/bgp_msg_read.c -- (5) set the "received" flag on incoming notifications - update call of bgp_notify_print() bgpd/bgp_msg_write.c -- update call of bgp_notify_print() bgpd/bgp_network.c -- (4) bgpd/bgp_nexthop.c -- (3) bgpd/bgp_notification.c -- add "received" flag to notification structure, which is false by default. bgpd/bgp_notification.h -- add "received" flag to notification structure - add bgp_notify_set_received() - add bgp_notify_get_received() bgpd/bgp_open.c -- (2) bgpd/bgp_open_state.c -- in bgp_peer_open_state_receive(): - copy the session->hold_timer_interval and session->keepalive_timer_interval values (as negotiated by the BGP Engine) into the peer - set PEER_CAP_RESTART_RCV if have - fix typo, use: open_recv->can_preserve not: open_recv->can_g_restart bgpd/bgp_packet.c -- delete bgp_notify_send() and bgp_notify_send_with_data() - (1) (2) (3) - bgp_clear_route_normal() -> bgp_clear_routes() and now returns "completed" state. bgpd/bgp_packet.h -- delete: bgp_keepalive_send() bgp_open_send() bgp_notify_send() bgp_notify_send_with_data() bgpd/bgp_peer.c -- changed: bgp_session_has_established() bgp_session session() bgp_session_has_disabled() to void and to take session, not peer. - removed lock of session structure in bgp_session_do_event() -- was holding the lock for far longer than necessary, particularly when clearing routes ! - in bgp_session_has_established(): - lock session structure where and only where required - tidied up timer handling - in bgp_session_has_stopped(): - extend IdleHoldTime - examine notification etc to see why session came down. - invoke bgp_peer_down_notify(), which will start the process of downing the peer. - in bgp_session_has_disabled(): - removed defer_enable - removed calls to bgp_peer_stop() etc. That is done in bgp_peer_down() et all. - now if session is marked delete_me, then do that; otherwise, can enable again. - removed program_terminate_if_all_disabled(), replaced by new mechanism - in bgp_peer_stop(): - changed to void function and added nsf parameter. - sets pClearing state. - MUST now only be called when pEstablished. - removed some code to bgp_peer_reset_idle(). So... bgp_peer_stop() brings pEstablished peer to halt, while bgp_peer_reset_idle() prepares it for new session. - now passes nsf to bgp_clear_all_routes(), which returns flag to say whether task is complete or whether it continues in background. - clearing of NSF_MODE and flags moved to bgp_peer_reset_idle(). - sets pIdle state if route clearing completed - renamed peer_nsf_stop() -> bgp_peer_nsf_stop() - if is pIdle or pClearing and have NSF routes, then stops timers and clears out all the NSF routes. - added bgp_peer_clear_all_stale_routes() - added bgp_peer_shutdown() -- used when peer is downed for PEER_DOWN_USER_SHUTDOWN ! - added bgp_peer_reset_idle() -- used when peer goes pIdle or is about to enable session. - deleted bgp_peer_timers_stop() -- see bgp_peer_change_status(). - replaced bgp_peer_clearing_completed() - if pClearing, sets pIdle and enables if can - if pDeleting, unlocks peer - replaced bgp_timer_set() by bgp_peer_timers_set() -- deals in new peer states only. - renamed peer_new() -> bgp_peer_new() - renamed peer_create() -> bgp_peer_create() - added setting of PEER_STATUS_REAL_PEER - changed auto activation to reflect what actually happens. - changed bgp_session_init_new() call because it now sets peer->session. - sets timers suitable for pIdle. before any auto enable. - renamed peer_delete() -> bgp_peer_delete() - removed call of peer_nsf_stop() - added bgp_peer_down() with PEER_DOWN_NEIGHBOR_DELETE -- which does all the work of flattening an active peer, and returns it pIdle or pClearing. - if pClearing, lock the peer so that when clearing completes, it can unlock it. - sets pDeleting state, and increments bm->peer_linger_count. - tightened procedure for dealing with various references to peer -- including use of the PEER_STATUS_REAL_PEER flag. - tidied up dealing with rsclient RIBs and shared pointers to group versions of same. - removed call of bgp_timer_set(), now done in bgp_peer_change_status(). - now unregisters the peer immediately, so can register a new one before this one is completely deleted. - deletes session if it can. - moved peer_lock() & peer_unlock() from bgpd.c and renamed bgp_peer_lock() & bgp_peer_unlock() - renamed peer_free() bgp_peer_free() and made static. - peer must be pDeleting -- so have been through bgp_peer_delete() - peer->session must be NULL - decrements bm->peer_linger_count - deleted peer->clear_node_queue handling - deleted bgp_session_free() -- that's done in bgp_peer_delete() or elsewhere. - unlocked bgp at end - assert peer->session == NULL, to be sure - set peer->lock == -54321 - in bgp_peer_enable(): - recast as switch() on peer state - added bgp_peer_reset)idle() before enabling the session. - renamed bgp_peer_disable() -> bgp_peer_down() - takes PEER_DOWN_XXX argument, which drives what notification is sent, and sets the peer->last_reset status. A small number of PEER_DOWN_XXX are special. - removed the IdleHoldTimer stuff. - copies outbound notification to session. - for PEER_DOWN_NSF_CLOSE_SESSION, keep non- stale routes. - for PEER_DOWN_USER_SHUTDOWN, do bgp_peer_shutdown() - after disabling any session and doing any shutdown, proceed as per peer->status: pIdle -- flush stale routes bgp_peer_enable() pEstablished -- bgp_peer_stop() pClearing -- flush stale routes - added bgp_peer_down_notify(). - added bgp_peer_down_error(), which replaces bgp_notify_send(). - added bgp_peer_down_error_with_data(), which replaces bgp_notify_send_with_data() The "down_error" functions calculate the appropriate PEER_DOWN_XXX value, and call bgp_peer_down_notify(). - added bgp_peer_map_peer_down(), to map PEER_DOWN_XXX to a notification message. - added bgp_peer_map_notification, to map notification message to a PEER_DOWN_XXX. - renamed peer_change_status() -> bgp_peer_change_status() - do most things only if state changes. - add call to bgp_peer_reset_idle() as enter pIdle state. - at all times do bgp_peer_timer_set() - renamed peer_timers_set() -> bgp_peer_timers_set() - commoned up code for Graceful Restart and Graceful Restart Stale timers and stale routes. - changed Graceful Restart Stale time to cope if it should expire before Graceful Restart ! bgpd/bgp_peer.h -- added PEER_DOWN_XXX values and tidied up + PEER_DOWN_NULL + PEER_DOWN_UNSPECIFIED + PEER_DOWN_CONFIG_CHANGE + PEER_DOWN_AF_DEACTIVATE + PEER_DOWN_PASSWORD_CHANGE + PEER_DOWN_ALLOWAS_IN_CHANGE + PEER_DOWN_INTERFACE_DOWN + PEER_DOWN_MAX_PREFIX + PEER_DOWN_HEADER_ERROR + PEER_DOWN_OPEN_ERROR + PEER_DOWN_UPDATE_ERROR + PEER_DOWN_HOLD_TIMER + PEER_DOWN_FSM_ERROR + PEER_DOWN_DYN_CAP_ERROR - PEER_DOWN_NOTIFY_SEND (deleted) - added typedef peer_down_t - struct peer: - deleted redundant clear_node_queue - removed PEER_STATUS_ACCEPT_PEER flag - added PEER_STATUS_REAL_PEER flag - (3) - deleted bgp_peer_reenable() -- redundant - deleted bgp_peer_stop() -- now static - replaced bgp_peer_disable() by bgp_peer_down() - added bgp_peer_down_error() - added bgp_peer_down_error_with_data() - deleted peer_change_status() -- now static - renamed peer_new() -> bgp_peer_new() - renamed peer_create() -> bgp_peer_create() - renamed peer_delete() -> bgp_peer_delete() - added bgp_peer_lock() - added bgp_peer_unlock() - deleted peer_free() - deleted peer_nsf_stop() bgpd/bgp_peer_index.c -- removed accept entry from bgp_peer_index_entry structure - added explicit next_free entry to the structure - sets next_free to point at self in entries which are in use -- and checks this. - change bgp_peer_index_seek_accept() to link to session via the peer data structure, and to call bgp_connection_query_accept() under the Peer Index Mutex. - (4) for bgp_peer_index_seek_accept() bgpd/bgp_peer_index.h -- removed accept entry from bgp_peer_index_entry structure - added explicit next_free entry to the structure - (4) for bgp_peer_index_seek_accept() bgpd/bgp_route.c -- (1) (2) (3) - in bgp_process_rsclient(), bgp_process_main(), and bgp_processq_del(): - extra dasserts() - clear rn->wq_next - unlock table *after* unlock node (bug fix) - in bgp_process(), lock bgp before table. - in bgp_maximum_prefix_restart_timer(), replace call of peer_clear() by unset of flag and bgp_peer_enable() -- peer is already down. - added bgp_maximum_prefix_cancel_timer() - deleted bgp_clear_this_route() -- code now inline in only caller. - renamed bgp_clear_route_normal() -> bgp_clear_routes() - takes an "nsf" argument to invoke NSF "clearing", iff nsf set for afi/safi. Sets PEER_STATUS_NSF_WAIT if so. - returns bool "completed" if clearing has completed immediately -- ie no background work left to be done. - renamed bgp_clear_route_all() -> bgp_clear_all_routes() - takes "nsf" argument and returns "completed" as for bgp_clear_routes(). - removed call: bgp_peer_clearing_completed() - renamed bgp_clear_route_rsclient() -> bgp_clear_rsclient_rib() - deleted bgp_cleanup_routes() -- was used during termination, no longer required because termination deletes all peers. bgpd/bgp_route.h -- deleted bgp_cleanup_routes() -- program termination now deletes all peers, which implicitly cleans up all routes. - renamed: bgp_clear_route_normal() -> bgp_clear_routes() - renamed: bgp_clear_route_rsclient() -> bgp_clear_rsclient_rib() - renamed: bgp_clear_route_all() -> bgp_clear_all_routes() - added: bgp_maximum_prefix_cancel_timer() bgpd/bgp_session.c -- (3) - deleted bgp_session_defer_if_limping() - in bgp_session_init_new() - changed to void and removed session argument -- always creates a new session - peer MUST not have a session - removed Peer Index pointer stuff as Peer Index no longer has accept field - sets session->peer and locks peer - sets peer->session under Peer Index Mutex - sets session->delete_me false - sets session->accept flag false - replaced bgp_session_free() by bgp_session_delete() - changed to void function - if session is active, set the delete_me flag so session will be deleted when goes sDisabled. - make sure that session Mutex has been released by the BGP Engine before destroying it... otherwise: tears. - unhook session from peer under Peer Index mutex -- for accept() stuff. - unhook peer from session. - unlock peer. - in bgp_session_enable() - assert that peer is pIdle. - clear delete_me for completeness - clear additional fields - in bgp_session_disable() - clear session->accept - in bgp_session_is_active() - no longer interested in Peer Index stuff - deleted bgp_session_defer_if_limping() bgpd/bgp_session.h -- in bgp_session structure: - removed index_entry pointer to Peer Index - added delete_me flag - removed defer_enable flag - added accept flag - removed session parameter from bgp_session_init_new() - deleted bgp_session_free() - added bgp_session_delete() - bgp_session_is_active() now returns bool bgpd/bgp_table.c -- bgp_node_free() sets lock count = -54321 - in bgp_table_free(): - assert that route node is empty - set lock count = -54321 - bgp_node_delete() asserts that is not on_wq - (1) bgpd/bgp_vty.c -- (1) (3) (4) - change peer_af_flag_modify_vty() to call peer_af_flag_modify() not set or unset. - change name: bgp_clear_route_rsclient() -> bgp_clear_rsclient_rib() - in peer_rsclient_set_vty(): - add peer to bgp->rsclient list after all validation is complete - in peer_rsclient_unset_vty(): - removed code for deleting the rsclient RIB etc to peer_rsclient_unset(). - added peer_rsclient_unset() bgpd/bgp_zebra.c -- bgp_peer_disable() -> bgp_peer_down() and now takes PEER_DOWN_INTERFACE_DOWN argument. bgpd/bgpd.c -- (1) (3) - replaced setting peer->last_reset and call of bgp_notify_send() by call of the new bgp_peer_down(). - bgp_router_id_set() ... PEER_DOWN_RID_CHANGE - bgp_cluster_id_set() ... PEER_DOWN_CLID_CHANGE - bgp_cluster_id_unset() ... PEER_DOWN_CLID_CHANGE - bgp_confederation_id_set() ... PEER_DOWN_CONFED_ID_CHANGE ... PEER_DOWN_CONFED_ID_CHANGE - bgp_confederation_id_unset() ... PEER_DOWN_CONFED_ID_CHANGE - bgp_confederation_peers_add() ... PEER_DOWN_CONFED_PEER_CHANGE - bgp_confederation_peers_remove() ... PEER_DOWN_CONFED_PEER_CHANGE - peer_as_change() ... PEER_DOWN_REMOTE_AS_CHANGE - peer_activate() ... PEER_DOWN_AF_ACTIVATE - peer_deactivate() ... PEER_DOWN_AF_DEACTIVATE - peer_group_bind() ... PEER_DOWN_RMAP_BIND - peer_group_unbind() ... PEER_DOWN_RMAP_UNBIND - peer_change_action() ... why_changed ... why_changed - peer_flag_modify_action() ... action->peer_down - peer_update_source_if_set() ... PEER_DOWN_UPDATE_SOURCE_CHANGE ... PEER_DOWN_UPDATE_SOURCE_CHANGE - peer_update_source_addr_set() ... PEER_DOWN_UPDATE_SOURCE_CHANGE ... PEER_DOWN_UPDATE_SOURCE_CHANGE - peer_update_source_unset() ... PEER_DOWN_UPDATE_SOURCE_CHANGE ... PEER_DOWN_UPDATE_SOURCE_CHANGE - peer_local_as_set() ... PEER_DOWN_LOCAL_AS_CHANGE ... PEER_DOWN_LOCAL_AS_CHANGE - peer_local_as_unset() ... PEER_DOWN_LOCAL_AS_CHANGE ... PEER_DOWN_LOCAL_AS_CHANGE - peer_password_set() ... PEER_DOWN_PASSWORD_CHANGE ... PEER_DOWN_PASSWORD_CHANGE - peer_password_unset() ... PEER_DOWN_PASSWORD_CHANGE ... PEER_DOWN_PASSWORD_CHANGE - peer_clear() ... PEER_DOWN_USER_RESET - bgp_terminate() ... PEER_DOWN_USER_RESET - deleted peer_lock() & peer_unlock(). See bgp_peer_lock() & bgp_peer_unlock() in bgp_peer - in peer_as_change(), move downing of peer to after all config changes have been made. - in peer_remote_as() implicitly activate iff !BGP_FLAG_NO_DEFAULT and is IPv4/Unicast. (but only ever called with IPv4/Unicast or nothing at all.) - in peer_deactivate() - if cannot dynamically reconfigure, then will down the peer PEER_DOWN_AF_DEACTIVATE. - uses new peer_rsclient_unset() to tidy away any rsclient RIB etc. - in peer_change_action(): - added 'why_down' argument - replace if's by switch() - in struct peer_flag_action, updated entry types - in peer_flag_action_list[], added the appropriate PEER_DOWN_XXX values. - in peer_af_flag_action_list[] - added the appropriate PEER_DOWN_XXX values - added multiple flag entries - in peer_flag_action_set(): - changed to return const address of peer_flag_action structure -- or NULL. - table may now contain entries which the given flag must be a subset of. - in peer_flag_modify_action(): - now takes peer_flag_action* and whether flag has been set or not. - allow *only* peer_change_none or peer_change_reset - deal with clearing PEER_FLAG_SHUTDOWN, otherwise bgp_peer_down(). - in peer_group_bind(): - uses new peer_rsclient_unset() to tidy away any rsclient RIB etc. - in peer_flag_modify(): - takes bool set flag - changed to suit peer_flag_action_set() and peer_flag_modify_action() - in peer_flag_set() and peer_flag_unset() changed to bool flag - added peer_af_flag_modify_action(), common code for use in peer_af_flag_modify(). - in peer_af_flag_modify(): - takes bool set flag - changed to suit peer_flag_action_set() and peer_flag_modify_action() - use peer_af_flag_modify_action() - in peer_af_flag_set() and peer_af_flag_unset() changed to bool flag - in peer_clear(): adjust for new bgp_peer_down() mechanics. - in bgp_master_init(): account for peer_linger_count (starting at 0) - in bgp_terminate(): - removed program_terminating -- see flag now in bgp_main.c - implement "retain_mode" by using BGP_OPT_NO_FIB flag to turn off changing the FIB as routes are deleted. - either bgp_peer_delete() if terminating or bgp_peer_down() all peers. - flush process queues. - deleted program_terminate_if_all_disabled() - in peer_lookup(), removed handling of PEER_STATUS_ACCEPT_PEER(). - deleted peer_lookup_with_open(). - in bgp_config_write_family(), removed handling of PEER_STATUS_ACCEPT_PEER(). - in bgp_config_write(), removed handling of PEER_STATUS_ACCEPT_PEER(). bgpd/bgpd.h -- add peer_linger_count entry to the bgp_master structure. - remove: peer_lock(), peer_unlock() and peer_delete() - (4) for peer_af_flag_modify() - added peer_rsclient_unset() lib/plist.c -- fixed handling of prefix lists with no explicit sequence numbers. lib/qpnexus.c -- (4) for main_thread & terminate flags - change qpn_terminate() so does nothing if terminate flag is already set. lib/qpnexus.h -- (4) for main_thread & terminate flags tests/bgp_capability_test.c -- (3)
* | Major updateChris Hall2010-03-161-45/+119
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | bgpd/bgp_advertise.c bgpd/bgp_advertise.h The adj_in and adj_out objects are now put on a list based on the peer to whom the route belongs. The adj_in and adj_out objects also now point to the bgp_node which they are routes for. This substantially reduces the work needed to shut down a peer. bgpd/bgp_damp.c Changes to adj_in and adj_out forced small change to macros used in bgp_damp.c to manage its lists. bgpd/bgp_debug.c Replaced direct access to vty->node by the required vty_get_node(). bgpd/bgp_dump.c Changes to the names of fields in bgp_info structures. bgpd/bgp_engine.h Modified the debug and trace functions. bgpd/bgp_fsm.c Make use of sockunion2str() consistent with common usage. Improved some documentation. bgpd/bgp_main.c Use the newly extended qpn_add_hook_function() facility. bgpd/bgp_mplsvpn.c Changes to the names of fields in bgp_info structures. bgpd/bgp_msg_read.c Bug fix: correct handling of capability code length. Improvement: better casting in calculation of message length. bgpd/bgp_msg_write.c Bug fix: correct byte ordering of bgp_id in open message. bgpd/bgp_network.c Bug fix: correct handling of incoming connections. Takes advantage of improvements in sockunion.c. bgpd/bgp_nexthop.c Changes to the names of fields in bgp_info structures. bgpd/bgp_open_state.c Remove mistaken #include of memtypes.h bgpd/bgp_packet.c Improvements to handling of withdrawing routes for peers. bgpd/bgp_peer.c Tidying up the state of peers as they are enabled and disabled. Improvements to handling of withdrawing routes for peers. bgpd/bgp_peer.h Adding list bases for lists of routes originated by the peer. bgpd/bgp_peer_index.c Bug fix: correct freeing of peer indexes. bgpd/bgp_route.c Implement lists of bgp_info based in the owning peer. Adjust for name changes to bgp_info fields. Reimplemented all the clearing functions to use the lists of items that belong to the peer -- rather than searching route tables for stuff to withdraw. Changed work queue handling for added/changed routes, so that queues run through existing items, rather than having queues of auxiliary items -- lower memory overhead. bgpd/bgp_route.h Added fields to bgp_info to allow all bgp_info originated by each peer to live on lists based in the peer. And changed the name of existing fields to avoid confusion. bgpd/bgp_routemap.c Removing redundant code and fixing a memory leak. bgpd/bgp_table.h Based work queue for added/changed routes directly in the table, rather than having auxiliary structures. bgpd/bgp_vty.c Use vty_get_node() and vty_set_node() rather than direct access to the vty field. bgpd/bgpd.c Implement changes to route clearing. bgpd/bgpd.h Changes to work queue handling. lib/buffer.c Changes to allow embedded buffer structures. lib/buffer.h Moved struct buffer here so that could have embedded buffer structurs. lib/command.c Substantial tidy up and document exercise. Restructured the top level command processing and finding of descriptions and command completion. Removal of unpleasant messing around with the insides of vector structures. Movement of some command actions to vty.c. Uses uty.h to pick up the "private" functions from vty.c et al. lib/command.h Moved the "node" values to node_type.h, so that can use an enum node_type in places where cannot include command.h. lib/command_queue.c Updated to cope with the called command changing the node value. Improved handling of revoked commands, so the the command line handler does not get stuck waiting for a command to complete which has been revoked ! lib/command_queue.h Improved message format. lib/if.c Use vty_set_node(). lib/keychain.c Use vty_set_node(). new lib/keystroke.c new lib/keystroke.h New code to implement a keystroke FIFO. This moves some complexity out of the command handler. The handling of mixtures of escapes and Telnet IACs is tightened up. It would be possible to extend this to, say, UTF-8. Regularises the "stealing" of keystrokes for the "--more--" output handling... which was a bit hit and miss. new lib/list_util.c new lib/list_util.h New code to implement various forms of linked list, where the list pointers are embedded in structures. lib/log.c Changed the handling of log messages, so that all types of log output (except syslog) use the same message buffer scheme, and the message is constructed once and once only. Changes to the handling of VTY_LOCK() etc. Uses uty.h to pick up the "private" functions from vty.c et al. lib/log.h Changes to the buffering of log messages. new lib/mem_tracker.c New code to track memory allocation/deallocation, for debug purposes. lib/memory.c lib/memory.h Updated to allow the use of the mem_tracker. lib/memtypes.awk Made the memtypes into a named enum MTYPE. lib/memtypes.c Various new memory types. lib/mqueue.c lib/mqueue.h Add mqueue_finish function for close-down. lib/network.c lib/network.h Added non-blocking read_nb() and write_nb(). new lib/node_type.h As above. lib/plist.c Remove vty_puts() which wasn't a good idea. lib/qlib_init.c Added qps_init() to first stage and mqueue_finish to finish. lib/qpnexus.c lib/qpnexus.h More flexible hooks for in_thread_init and in_thread_final. lib/qpselect.c lib/qpselect.h Added qps_start_up() to build the required maps once and for all. Added qdebug to control the debug checks and validation. Improved validation and test functions. new lib/qstring.c new lib/qstring.h New code for limited flexible string handling. lib/qtimers.c Added qdebug to control the debug checks and validation. lib/routemap.c Use vty_set_node(). lib/sockunion.c lib/sockunion.h Tidied up and regularised the handling of sin_len and sin6_len. Created common function for setting port into socket. Created common function for initialisation/allocation of new sockunion. Reduced various functions by using common sub-functions. Rationalised some code. Added sockunion_listen() and sockunion_new_sockaddr(). Renamed sockunion_new() to sockunion_new_prefix(). Improved some logging messages. Added documentation. new lib/uty.h Functions etc. used only by vty/command/log/vty_io and vty_cli. lib/vector.c lib/vector.h Added vector_t type. Removed VECTOR_INDEX, vector_only_wrapper_free() and vector_only_index_free() -- following improvement of code in command.c. Added vector_set_min_length(), vector_set_new_min_length() and vector_length() functions. new lib/vio_fifo.c new lib/vio_fifo.h New code to manage simple FIFO of indefinite length. lib/vty.c lib/vty.h Reworked. Broken into vty.c, vty_io.c and vty_cli.c. new lib/vty_cli.c new lib/vty_cli.h CLI handling parts of the vty family. new lib/vty_io.c new lib/vty_io.h I/O parts of the vty family. lib/workqueue.h Introduced tyedefs for the various call-back entries. new tests/test-list_util.c Tests for the list-util stuff. vtysh/vtysh.c Small change to interface for cmd_execute_command()
* | Revised thread/timer handling, work queue and scheduling.Chris Hall2010-02-161-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Updated quagga thread handling to use qtimers when using the new qpnexus -- so all timers are qtimers in the new scheme. Updated work queue handling so that each work queue item is a single malloced structure, not three. (Only bgpd and zebra use the work queue system.) When using qpnexus the background thread queue is no longer a timer queue, but simply a list of pending background threads. When a background thread is waiting on a timer, it is in the qtimer pile, same like any other thread. When using qpnexus, the only remaining quagga thread queues are the event and ready queues. Revised the qpnexus loop so that only when there is nothing else to do will it consider the background threads. Revised write I/O in the BGP Engine so that all writing is via the connection's write buffer. Revised the write I/O in the Routeing Engine, so that it passes groups of updates in a single mqueue message. This all reduces the number of TCP packets sent (because BGP messages are collected together in the connection's write buffer) and reduces the number of mqueue messages involved. (No need for TCP_CORK.) Code and comments review for the new code. modified: bgpd/bgp_advertise.c modified: bgpd/bgp_common.h modified: bgpd/bgp_connection.c modified: bgpd/bgp_connection.h modified: bgpd/bgp_engine.h modified: bgpd/bgp_fsm.c modified: bgpd/bgp_main.c modified: bgpd/bgp_msg_read.c modified: bgpd/bgp_msg_write.c modified: bgpd/bgp_network.c modified: bgpd/bgp_packet.c modified: bgpd/bgp_packet.h modified: bgpd/bgp_peer.c modified: bgpd/bgp_peer_index.h modified: bgpd/bgp_route.c modified: bgpd/bgp_route_refresh.h modified: bgpd/bgp_session.c modified: bgpd/bgp_session.h modified: bgpd/bgpd.c new file: bgpd/bgpd.cx modified: lib/mqueue.h modified: lib/qpnexus.c modified: lib/qpnexus.h modified: lib/qpselect.c modified: lib/qtimers.c modified: lib/qtimers.h modified: lib/sigevent.c modified: lib/stream.c modified: lib/stream.h modified: lib/thread.c modified: lib/thread.h modified: lib/workqueue.c modified: lib/workqueue.h modified: tests/heavy-wq.c modified: zebra/zebra_rib.c
* | Getting BGP Engine to start and removing warnings.Chris Hall2010-01-241-29/+29
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Finish the wiring required to get bgp_msg_read to process OPEN messages into the connection's open_state, and be able to check for correct peer AS, etc. Removed bugs preventing messages from being written. Added BGP Id check to collision detection logic. Removed as many warnings from comilation as possible. Replaced horrible FIFO kludge in the process. (Introduced the even more horrible miyagi kludge.) modified: bgpd/bgp_advertise.c modified: bgpd/bgp_advertise.h modified: bgpd/bgp_connection.c modified: bgpd/bgp_connection.h modified: bgpd/bgp_debug.c modified: bgpd/bgp_fsm.c modified: bgpd/bgp_msg_read.c modified: bgpd/bgp_msg_write.c modified: bgpd/bgp_network.c modified: bgpd/bgp_nexthop.c modified: bgpd/bgp_notification.c modified: bgpd/bgp_open.c modified: bgpd/bgp_packet.c modified: bgpd/bgp_session.c modified: bgpd/bgp_session.h modified: bgpd/bgpd.c modified: lib/Makefile.am modified: lib/distribute.c modified: lib/if_rmap.c new file: lib/miyagi.h modified: lib/prefix.h modified: lib/sockopt.c modified: lib/stream.c modified: lib/thread.c modified: lib/vty.c modified: lib/zebra.h modified: tests/bgp_capability_test.c modified: tests/bgp_mp_attr_test.c modified: tests/ecommunity_test.c modified: tests/heavy-thread.c modified: tests/heavy-wq.c modified: tests/heavy.c modified: tests/main.c modified: tests/test-checksum.c modified: tests/test-sig.c modified: watchquagga/watchquagga.c modified: zebra/if_netlink.c modified: zebra/ioctl.c modified: zebra/rt_netlink.c modified: zebra/rtread_netlink.c
* | Reduce peer FSM now that session handled elsewhere. Wire up statuspaulo2010-01-221-1/+1
|/ | | | changes, Idle, Established, Clearing, Deleted removed other status.
* [cleanup] functions taking no args should be declared with void argsStephen Hemminger2009-06-121-2/+2
| | | | | Use Ansi-C prototypes rather than old K&R method of declaring function without arguments
* [lib] hash compare function arguments ought to be const qualifiedStephen Hemminger2008-08-221-3/+3
| | | | | | | | | | | | 2008-08-14 Stephen Hemminger <stephen.hemminger@vyatta.com> * lib/hash.h: (struct hash) Hash comparator callback really ought to treat storage behind arguments as constant - a compare function with side-effects would be evil. * */*.c: Adjust comparator functions similarly, thus fixing at least a few compiler warnings about const qualifier being dropped. Signed-off-by: Paul Jakma <paul@quagga.net>
* [bgpd] Fix triggerable crash when compiled with --disable-bgp-announcequagga_cvs_finalcvs_headPaul Jakma2008-07-221-6/+4
| | | | | | | | | | | | | | | | 2008-07-22 Paul Jakma <paul.jakma@sun.com> * HACKING: Document preference for compiler conditional code, over cpp conditional. * configure.ac: DISABLE_BGP_ANNOUNCE always should be defined. * bgp_{packet,route,advertise}.c: change to compiler testing of DISABLE_BGP_ANNOUNCE, rather than cpp. 2008-07-22 MIYAJIMA Mitsuharu <miyajima.mitsuharu@anchor.jp> * bgp_packet.c: (bgp_update_packet_eor) Fix crash triggerable if a bgpd was compiled with --disable-bgp-announce and if GR is advertised by peer.
* [bgpd] Fix warnings: hash callbacks should match hash API declarationsPaul Jakma2007-04-291-3/+9
| | | | | | | | | | | | | | | | 2007-04-22 Sebastien Tandel <sebastien@tandel.be> * bgp_advertise.c : (baa_hash_alloc, baa_hash_key, baa_hash_cmp) conforms to quagga hash API. Defines _hash_[alloc|key|cmp] with void * arguments as defined by the API. * bgp_aspath.c,h : (aspath_key_make) conforms to quagga hash API. Defines _hash_[alloc|key|cmp] with void * arguments as defined by the API. * bgp_attr.c,h : (cluster_hash_alloc, cluster_hash_key_make, cluster_hash_cmp, transit_hash_alloc, transit_hash_key_make, transit_hash_cmp, attrhash_key_make, attrhash_cmp, bgp_attr_hash_alloc) conforms to quagga hash API. Defines _hash_[alloc|key|cmp] with void * arguments as defined by the API.
* [bgpd] fix mtype in XFREE and NULL out freed pointerPaul Jakma2006-08-271-1/+2
| | | | | | | 2006-08-27 Paul Jakma <paul.jakma@sun.com> * bgp_advertise.c: (bgp_sync_delete) fix mtype in XFREE. NULL out peer->hash after free, to be sure.
* [bgpd] trivial: use a distinct memtype for struct bgp_synchronizePaul Jakma2006-03-301-1/+2
| | | | | | | | 2006-03-19 Paul Jakma <paul.jakma@sun.com> * memtypes.c: Add MTYPE_BGP_SYNCHRONISE. * bgp_advertise.c: Use a distinct memory type for struct bgp_synchronize.
* 2005-06-28 Paul Jakma <paul.jakma@sun.com>paul2005-06-281-5/+5
| | | | | | | | | | * (global) The great bgpd extern and static'ification. * bgp_routemap.c: remove unused ROUTE_MATCH_ASPATH_OLD code (route_set_metric_compile) fix u_int32_t to ULONG_MAX comparison warnings. * bgp_route.h: (bgp_process, bgp_withdraw, bgp_update) export these used by various files which had their own private declarations, in the case of mplsvpn - incorrect.
* 2005-06-01 Paul Jakma <paul.jakma@sun.com>post_bgp_workqueuspaul2005-06-011-9/+15
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * bgpd/(general) refcount struct peer and bgp_info, hence allowing us add work_queues for bgp_process. * bgpd/bgp_route.h: (struct bgp_info) Add 'lock' field for refcount. Add bgp_info_{lock,unlock} helper functions. Add bgp_info_{add,delete} helpers, to remove need for users managing locking/freeing of bgp_info and bgp_node's. * bgpd/bgp_table.h: (struct bgp_node) Add a flags field, and BGP_NODE_PROCESS_SCHEDULED to merge redundant processing of nodes. * bgpd/bgp_fsm.h: Make the ON/OFF/ADD/REMOVE macros lock and unlock peer reference as appropriate. * bgpd/bgp_damp.c: Remove its internal prototypes for bgp_info_delete/free. Just use bgp_info_delete. * bgpd/bgpd.h: (struct bgp_master) Add work_queue pointers. (struct peer) Add reference count 'lock' (peer_lock,peer_unlock) New helpers to take/release reference on struct peer. * bgpd/bgp_advertise.c: (general) Add peer and bgp_info refcounting and balance how references are taken and released. (bgp_advertise_free) release bgp_info reference, if appropriate (bgp_adj_out_free) unlock peer (bgp_advertise_clean) leave the adv references alone, or else call bgp_advertise_free cant unlock them. (bgp_adj_out_set) lock the peer on new adj's, leave the reference alone otherwise. lock the new bgp_info reference. (bgp_adj_in_set) lock the peer reference (bgp_adj_in_remove) and unlock it here (bgp_sync_delete) make hash_free on peer conditional, just in case. * bgpd/bgp_fsm.c: (general) document that the timers depend on bgp_event to release a peer reference. (bgp_fsm_change_status) moved up the file, unchanged. (bgp_stop) Decrement peer lock as many times as cancel_event canceled - shouldnt be needed but just in case. stream_fifo_clean of obuf made conditional, just in case. (bgp_event) always unlock the peer, regardless of return value of bgp_fsm_change_status. * bgpd/bgp_packet.c: (general) change several bgp_stop's to BGP_EVENT's. (bgp_read) Add a mysterious extra peer_unlock for ACCEPT_PEERs along with a comment on it. * bgpd/bgp_route.c: (general) Add refcounting of bgp_info, cleanup some of the resource management around bgp_info. Refcount peer. Add workqueues for bgp_process and clear_table. (bgp_info_new) make static (bgp_info_free) Ditto, and unlock the peer reference. (bgp_info_lock,bgp_info_unlock) new exported functions (bgp_info_add) Add a bgp_info to a bgp_node in correct fashion, taking care of reference counts. (bgp_info_delete) do the opposite of bgp_info_add. (bgp_process_rsclient) Converted into a work_queue work function. (bgp_process_main) ditto. (bgp_processq_del) process work queue item deconstructor (bgp_process_queue_init) process work queue init (bgp_process) call init function if required, set up queue item and add to queue, rather than calling process functions directly. (bgp_rib_remove) let bgp_info_delete manage bgp_info refcounts (bgp_rib_withdraw) ditto (bgp_update_rsclient) let bgp_info_add manage refcounts (bgp_update_main) ditto (bgp_clear_route_node) clear_node_queue work function, does per-node aspects of what bgp_clear_route_table did previously (bgp_clear_node_queue_del) clear_node_queue item delete function (bgp_clear_node_complete) clear_node_queue completion function, it unplugs the process queues, which have to be blocked while clear_node_queue is being processed to prevent a race. (bgp_clear_node_queue_init) init function for clear_node_queue work queues (bgp_clear_route_table) Sets up items onto a workqueue now, rather than clearing each node directly. Plugs both process queues to avoid potential race. (bgp_static_withdraw_rsclient) let bgp_info_{add,delete} manage bgp_info refcounts. (bgp_static_update_rsclient) ditto (bgp_static_update_main) ditto (bgp_static_update_vpnv4) ditto, remove unneeded cast. (bgp_static_withdraw) see bgp_static_withdraw_rsclient (bgp_static_withdraw_vpnv4) ditto (bgp_aggregate_{route,add,delete}) ditto (bgp_redistribute_{add,delete,withdraw}) ditto * bgpd/bgp_vty.c: (peer_rsclient_set_vty) lock rsclient list peer reference (peer_rsclient_unset_vty) ditto, but unlock same reference * bgpd/bgpd.c: (peer_free) handle frees of info to be kept for lifetime of struct peer. (peer_lock,peer_unlock) peer refcount helpers (peer_new) add initial refcounts (peer_create,peer_create_accept) lock peer as appropriate (peer_delete) unlock as appropriate, move out some free's to peer_free. (peer_group_bind,peer_group_unbind) peer refcounting as appropriate. (bgp_create) check CALLOC return value. (bgp_terminate) free workqueues too. * lib/memtypes.c: Add MTYPE_BGP_PROCESS_QUEUE and MTYPE_BGP_CLEAR_NODE_QUEUE
* 2004-05-01 Paul Jakma <paul@dishone.st>paul2004-05-011-1/+1
| | | | | * Revert the attempted clean-up of the dummy peer hack, reverts patchsets 435 (see 2004-02-17 below) and 456.
* Fix warning.hasso2004-03-191-1/+1
|
* Initial revisionpaul2002-12-131-0/+405