summaryrefslogtreecommitdiffstats
path: root/bgpd/bgp_route.c
Commit message (Collapse)AuthorAgeFilesLines
* Fix "neighbor xx peer-group" and "show bgp XX::"Chris Hall2010-12-141-1/+1
| | | | | | | | | | | | 1234567890123456789012345678901234567890123456789012345678901234567890 For an unknown reason "neighbor xx peer-group" returned a CMD_WARNING even when everything was fine. Fixed. "show bgp XX::" issued a spurious "address is malformed" error message. Fixed. Small change to AS_PATH handling to clarify the checking of as-segment lengths.
* Introduce "rs-in" route-maproot2010-07-281-324/+700
| | | | | | | | | | | | | | | | | | | | | | | | | | | All peers may be configured with an "rs-in" route-map, whether they are rsclients, or not. All routes from a given peer are passed through the "rs-in" route-map before being considered for inclusion in any rsclients RIBs. Routes pass through the "rs-in" route-map once, irrespective of the number of rsclients. An "rs-in" route-map is intended to be used to ensure that routes from a given peer are kosher, before being passed to rsclients. The "in" route-map and filters may do the same, but for the main RIB. Any route-selection type actions that the "in" route-map may do for the main RIB will probably be done in the "import" route-map for an rsclient RIB. Also: * make zfree() work for NULL items, in lib/memory.c * fix clear ip bgp .... so works when pEstablished Version change to ex03.
* Reworking of peer state handling.Chris Hall2010-07-191-260/+354
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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)
* Adjustments to scheduling of Routing Engine work.Chris Hall2010-05-271-31/+42
| | | | | | | | | | | | | | | | These changes mean that Quagga copes a little better when there are very large numbers of updates/withrawal messages arriving all at once... ...it is not possible to cure the problem of overloading Quagga by throwing too much at it. However, these changes at least mean that when BGP sessions drop, the Routing Engine will notice that in a reasonable time, and can clear up all routes associated with the session (throwing away any updates/withdraws already received, but not yet dealt with.) Amonst these changes are Chris Caputo's patches for bgp_node locking issues -- see quagga-dev 7960 mailing list message.
* Further reduction of warnings under gcc 4.2.1Chris Hall2010-04-161-1/+3
|
* New functions for error numbers and addresses in messages.Chris Hall2010-04-081-1/+1
| | | | | | | | Implemented less onerous ways of including descriptions of errors and IP addresses in logging and other messages. Implemented mapping of error numbers to error names, which is generally more meaningful.
* First beta releaseChris Hall2010-04-061-4/+5
| | | | | | | Various bug fixes and improvements. Running with a fair amount of debug/assert code, which must be removed at some date.
* Major updateChris Hall2010-03-161-229/+519
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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-41/+44
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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
* Fixed shutdown. Centralized the testing of whether the session can bepaulo2010-02-051-4/+1
| | | | | | enabled in bgp_peer_enable. Added belt and braces notify in bgp_terminate after setting the SHUTDOWN flag, which should send the notify itself.
* Thread safe versions of inet_ntoa and strerror.paulo2010-02-041-21/+21
|
* Handling of peering states: Don't disable peer until sessionpaulo2010-02-031-2/+9
| | | | | | acknowledges disable. Explicity re-enable peer after clearing, unless shutdown or prefix overflow. On HUP send send admin reset, not admin shutdown.
* Use session->notification instead of peer's. Fix HUP - race condition.paulo2010-02-011-1/+0
|
* In bgp_route.c bgp_maximum_prefix_overfow arrange for peer to bepaulo2010-02-011-9/+10
| | | | | | disabled then enabled by timer. Replaced calls to bgp_peer_reenable with bgp_send_notify which updates peer->last_reset as well as reenabling peer.
* Testing and fixing round.Chris Hall2010-01-311-1/+1
| | | | | | | | | | | | | | | | | | | | | | | modified: bgpd/bgp_msg_read.c -- fix to accept updates when sEstablished ! modified: bgpd/bgp_packet.c -- modified XON/XOFF handling modified: bgpd/bgp_peer.c -- fix event handling to discard events when sLimping. modified: bgpd/bgp_route.c -- announce routes when sEstablished modified: bgpd/bgp_session.c -- add XOFF test free stream in update_receive when mqb_destroy modified: bgpd/bgp_session.h -- add XOFF threshold & XOFF test modified: bgpd/bgpd.c -- PRO TEM reenable in bgp_clear for max-prefix handling modified: lib/log.c -- fix zlog_backtrace modified: lib/mqueue.c -- dasserts for mqb_free_count
* Fixed some missed peer state name changes.paulo2010-01-271-1/+1
|
* Fixed program shutdown. Added peering engine side of TTL changing.paulo2010-01-271-5/+5
| | | | | Changed names of peer states. Writed in peering engine side of sending route_refresh.
* Reduce peer FSM now that session handled elsewhere. Wire up statuspaulo2010-01-221-3/+5
| | | | changes, Idle, Established, Clearing, Deleted removed other status.
* Minor fixes to get a clean compile so can start debugging.paulo2010-01-191-1/+2
|
* Initial commit for bgp_engine branch -- seeding new files...Chris Hall2010-01-041-0/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | On branch bgp_engine modified: .gitignore modified: bgpd/Makefile.am new file: bgpd/bgp.h new file: bgpd/bgp_common.c new file: bgpd/bgp_common.h new file: bgpd/bgp_connection.c new file: bgpd/bgp_connection.h modified: bgpd/bgp_debug.c new file: bgpd/bgp_engine.c new file: bgpd/bgp_engine.h modified: bgpd/bgp_fsm.c modified: bgpd/bgp_fsm.h modified: bgpd/bgp_network.c modified: bgpd/bgp_network.h new file: bgpd/bgp_notification.c new file: bgpd/bgp_notification.h modified: bgpd/bgp_open.c new file: bgpd/bgp_open_state.c new file: bgpd/bgp_open_state.h modified: bgpd/bgp_packet.c new file: bgpd/bgp_peer.c new file: bgpd/bgp_peer.h modified: bgpd/bgp_route.c new file: bgpd/bgp_session.c new file: bgpd/bgp_session.h modified: bgpd/bgp_vty.c modified: bgpd/bgp_zebra.c modified: bgpd/bgpd.c modified: bgpd/bgpd.h modified: lib/Makefile.am modified: lib/memtypes.c modified: lib/mqueue.c modified: lib/mqueue.h new file: lib/qafi_safi.h modified: lib/qpselect.c modified: lib/qpselect.h modified: lib/qpthreads.c modified: lib/qpthreads.h modified: lib/sockopt.c modified: lib/sockunion.c modified: lib/sockunion.h modified: lib/stream.c modified: lib/stream.h modified: lib/symtab.h modified: lib/zebra.h
* Merge branch 'master' of /git/quagga.euro-ixChris Hall (GMCH)2009-12-101-533/+534
|\
| * Upgrade Prefix-List & BGP Community-List handlingChris Hall (GMCH)2009-11-261-533/+534
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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.
* | bgpd: compile warnings cleanupStephen Hemminger2009-12-101-17/+0
|/ | | | | | | | | | | | * bgpd/bgp_fsm.c * bgp_clearing_completed(): only used in one file, can be static * bgpd/bgp_packet.c * afi2str(): sayonara * safi2str(): sayonara * bgpd/bgp_route.c * bgp_distance_reset(): sayonara * bgpd/bgp_zebra.c * bgp_ifindex_by_nexthop(): sayonara
* [bgp] Fix nexthop reachability check on confederationsVasilis Tsiligiannis2009-07-211-0/+2
| | | | | | * 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.
* [bgpd] fix typo made by paul in previous commitPaul Jakma2009-07-211-2/+2
|
* [bgpd] Small buffer overrun in bgp_clear_node_queue_initNick Hilliard2009-07-211-2/+1
| | | | | * bgp_route.c: (bgp_clear_node_queue_init) fix buffer overrun.
* [bgpd] Stability fixes including bugs 397, 492Chris Caputo2009-07-191-62/+102
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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().
* [bgpd] Log a debug/update warning if filters are configured but don't existPaul Jakma2009-06-261-7/+39
| | | | | | * 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.
* [bgpd] Add 'show ip bgp view WORD neighbors IP (advertised|received)-routes'Tomasz Pala2009-06-241-8/+46
| | | | * bgp_route.c: Was missing these commands.
* Fix "show ip bgp dampened-paths" garbage output.Chris Caputo2009-06-231-4/+3
| | | | | | | | | | | | | | | | | * 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 <ccaputo@alt.net>
* [bgpd] reference count the BGP instanceStephen Hemminger2009-06-181-13/+2
| | | | | | | | | | | | | | | | When a BGP instance is deleted with lots of routes and neighbors it is possible for the peer rsclient queue to run after bgp_delete has been called. This would lead to bgpd crashing, see https://bugzilla.vyatta.com/show_bug.cgi?id=3436 The fix is to add reference counting to the BGP instance and defer actual freeing until all references are gone. This patch also fixes a memory leak where the self-reference peer instance was being created but never freed. The check in bgp_clear_route is no longer valid because it is possible for it to be called when peer is in Deleted state during cleanup.
* [bgpd] Make declarations matchStephen Hemminger2009-06-181-2/+2
| | | | These variables are const.
* [cleanup] functions taking no args should be declared with void argsStephen Hemminger2009-06-121-8/+8
| | | | | Use Ansi-C prototypes rather than old K&R method of declaring function without arguments
* [cleanup] Convert XMALLOC/memset to XCALLOCStephen Hemminger2009-06-121-18/+4
| | | | Simple conversion of XMALLOC/memset to XCALLOC
* [bgpd] AS4 bugfix by Chris Caputo <ccaputo@alt.net>Denis Ovsienko2009-04-301-4/+4
| | | | | | | | | * bgpd/bgp_aspath.c: (aspath_make_str_count) "assert (len < str_size)" was getting hit under certain 4-byte ASN conditions. New realloc strategy. * bgpd/bgp_aspath.c: (aspath_key_make) const warning fix. "%d" -> "%u" 4-byte ASN corrections. Prevent negative number when ASN is above 2^31.
* [bgpd] Fix definition of an rsclient commandMichael Lambert2008-09-241-1/+1
| | | | | | | * bgp_route.c: (show_ip_bgp_view_rsclient_route_cmd) Add the missing "ip" to the command string. Signed-off-by: Paul Jakma <paul@quagga.net>
* [vty] Add support for a 'restricted mode' with anonymous vty connectionsPaul Jakma2008-08-231-0/+65
| | | | | | | | | | | | | | | | | | | | * lib/command.h: Add a RESTRICTED_NODE, intended for use with anonymous, 'no login' vtys, to provide a subset of 'view' mode commands. * lib/command.c: Add RESTRICTED_NODE bits, nothing special, just following VIEW_NODE. * lib/vty.c: (vty_auth) enable authentication should fall back to restricted/view node as appropriate. (vty_create) init vty's to restricted/view node as appropriate, for the 'no login' case. (vty_{no_,}restricted_mode_cmd) config commands to enable 'anonymous restricted' in vty configuration. (vty_config_write) 'anonymous restricted' config. (vty_init) Install some commands to restricted mode, and the 'anonymous restricted' config commands into VTY_NODE. * bgpd/*.c: Install some of the safe(r) BGP commands into 'restricted mode', i.e. lookup commands of non-sensitive data. Useful with looking-glass route-servers.
* [warnings] Fix various SOS warningsPaul Jakma2008-08-221-1/+1
| | | | | | | | | | | | | 2008-08-15 Paul Jakma <paul.jakma@sun.com> * */*: Fix various problems flagged by Sun Studio compiler. - '<qualifier> <storage>' obsolescent in declarations - empty statements (';' after ALIAS definitions) - implicit declarations (e.g printstack in lib/log.c) - "\%" in printf string instead of "%%" - loops that return on the first iteration (legitimately, but compiler can't really know), e.g. bgp_routemap.c - internal declarations which mask prototypes.
* [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] Added new route-map set statement: "as-path ignore"Denis Ovsienko2008-04-101-5/+5
|
* [bgpd] bug #398 Bogus free on out route-map, and assert() with rsclientsPaul Jakma2007-08-301-31/+27
| | | | | | | | | | | | | | | | | | | | | | | 2007-08-27 Paul Jakma <paul.jakma@sun.com> * bgp_route.c: (bgp_announce_check) Fix bug #398, slight modification of Vladimir Ivanov's suggested fix - to keep memory alloc conditional. (bgp_process_announce_selected) Don't take struct attr as argument, none of the callers need it and it needlessly distances allocation from use. Free the extended attr, the attr itself is on the stack. Fix bad indentation. * bgp_attr.c: (bgp_packet_attribute) Remove incorrect assert, and adjust conditional to test attr->extra, diagnosis by Vladimir Ivanov in bug #398. 2007-08-27 Vladimir Ivanov <wawa@yandex-team.ru> * bgp_route.c: (bgp_announce_check_rsclient) copy of ri->attr is no longer deep enough, due to addition of attr->extra. It should use bgp_attr_dup, as bgp_announce_check() does.
* [bgpd] Add support for AS_PATHLIMIT / draft-ietf-idr-as-pathlimitPaul Jakma2007-08-061-25/+393
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 2007-07-31 Paul Jakma <paul.jakma@sun.com> * (general) Support for draft-ietf-idr-as-pathlimit-03. * bgp_attr.h: (struct attr) Add pathlimit struct bgp_attr.c: (attr_str) Add BGP_ATTR_AS_PATHLIMIT string. (attrhash_key_make) tally pathlimit too (attrhash_cmp) cmp pathlimit attr (bgp_attr_aspathlimit) New, parse AS_PATHLIMIT attr. (bgp_attr_parse) ditto (bgp_packet_attribute) Write out AS_PATHLIMIT when set (bgp_dump_routes_attr) ditto * bgp_route.h: (struct bgp_static) Add TTL field * bgp_route.c: (bgp_announce_check) Drop paths that are over their hop-count TTL before sending via EBGP. Mangle ASN in pathlimit for confeds/private as best we can. (bgp_static_update_{rsclient,main}) Add any configure pathlimit information. (bgp_pathlimit_update_parents) New, update atomic-aggr setting for parents of an aspathlimit'ed static. (bgp_static_set) Add TTL argument, for all the 'bgp network' commands. Call previous for TTL changed statics. (bgp_static_unset) Call pathlimit_update_parents. (various bgp network commands) Add 'pathlimit <0-255>' qualifier to all the various forms, bar route-map - which can set ttl itself. * bgp_routemap.c: (general) Add support for 'set pathlimit ttl' and 'match pathlimit as'. * doc/bgpd.texi: Document 'network ... pathlimit <ttl>'
* [bgpd] bug #370, default-originate was broken by a silly thinkoPaul Jakma2007-06-141-1/+1
| | | | | | | | 2007-05-25 Paul Jakma <paul.jakma@sun.com> * bgp_route.c: (bgp_default_originate) Sanity check added previously was broken and always failed, thus this function never could run, bug #370.
* [bgpd] Trim memory usage of BGP routesPaul Jakma2007-05-041-164/+302
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | 2007-05-03 Paul Jakma <paul.jakma@sun.com> * bgp_route.h: (struct info) Move less frequently used fields to a lazily allocated struct info_extra. Export bgp_info_extra_get * bgp_route.c: (bgp_info_extra_new) allocate extra (bgp_info_extra_free) Free damp info and the info_extra. (bgp_info_extra_get) Retrieve the info_extra of a struct info, allocating as required. (generally) adjust to use info->extra * bgp_damp.c: (generally) use bgp_info_extra_get to access dampinfo * bgp_attr.h: Move rarely allocated attributes from struct attr to a struct attr_extra, for a substantial saving in size of struct attr. * bgp_attr.c: (bgp_attr_extra_{new,free}), new, self-explanatory. (bgp_attr_extra_get) Get the attr_extra for a given struct attr, allocating it if needs be. (bgp_attr_dup) Shallow copy the struct attr and its attr_extra. (generally) adjust to know about attr->extra. * bgp_debug.c: (bgp_dump_attr) ditto * bgp_vty.c: (show_bgp_memory) print attr and info extra sizes. * bgp_nexthop.c: (generally) adjust to know about attr->extra and info->extra. * bgp_{packet,routemap,snmp,zebra}.c: ditto * lib/memtypes.c: Add MTYPE_ATTR_EXTRA and MTYPE_BGP_ROUTE_EXTRA
* [bgpd] V. quick route flap gets mistaken for duplicate, route is then ignoredPaul Jakma2007-04-101-3/+20
| | | | | | | | | | | | 2007-04-08 Paul Jakma <paul.jakma@sun.com> * bgp_route.c: (general) Same bug as fixed on 2006-11-28 by ajs for bgp static routes, but for main BGP RIB: Quick 'flap' of routes can cause bgpd to mistake a new route for a duplicate route, due to presence of removed, but not yet processed BGP RIB entry. (bgp_update_rsclient) Ignore REMOVED bgp_info for duplicate, restore route instead. (bgp_update_main) Ditto.
* [bgpd] Peer delete can race with reconfig leading to crashPaul Jakma2007-02-221-25/+67
| | | | | | | | | | | | | | | | | | | 2007-02-22 Paul Jakma <paul.jakma@sun.com> * bgp_fsm.c: (bgp_fsm_change_status) Handle state change into clearing or greater here. Simpler. (bgp_event) Clearing state change work moved to previous * bgp_route.c: (bgp_clear_route_node) Clearing adj-in here is too late, as it leaves a race between a peer being deleted and an identical peer being configured before clearing completes, leading to a crash. Simplest fix is to clean peers Adj-in up-front, rather than queueing such work. (bgp_clear_route_table) Clear peer's Adj-In and Adj-Out up-front here, rather than queueing such work. Extensive comment added on the various bits of indexed data that exist and how they need to be dealt with. (bgp_clear_route) Update comment.
* [bgpd] Fix bug where a deleted route that was quickly re-added was being lostAndrew J. Schorr2006-11-281-5/+27
| | | | | | | | | | | | | 2006-11-28 Andrew J. Schorr <ajschorr@alumni.princeton.edu> * bgp_route.c: (bgp_info_restore) New function that undoes the effects of a previous call to bgp_info_delete. This is used when a route is deleted and quickly re-added before the deletion has been processed. (bgp_static_update_rsclient, bgp_static_update_main, bgp_redistribute_add) Check whether a pre-existing route has the BGP_INFO_REMOVED set, and, if so, we need to call bgp_info_restore to resurrect it.
* [bgpd] trivial: non C99 u_int.._t should be uint.._tPaul Jakma2006-10-271-1/+1
| | | | | | | 2006-10-27 Paul Jakma <paul.jakma@sun.com> * bgp_route.c: (bgp_table_stats) oops, u_intXX_t should be uintXX_t
* [bgpd] struct peer must have bgp field valid (redistribute crash)Paul Jakma2006-10-221-0/+3
| | | | | | | | | | | | 2006-10-19 Paul Jakma <paul.jakma@sun.com> * bgpd.c: (peer_new) bgp element of peer absolutely must be filled in, make peer_new() require it as argument and update all callers. Fixes a crash reported by Jan 'yanek' Bortl and Andrew Schorr where bgpd would crash in bgp_pcount_adjust trying to dereference the bgp member of bgp->peer_self, triggered through redistribution. * bgp_route.c: (bgp_pcount_adjust) assert sanity of arguments.
* [bgpd] CID#73, potential crash in bgp statistics if called for AFI/SAFI with ↵Paul Jakma2006-10-151-1/+2
| | | | | | | | | emtpy table 2006-10-15 Paul Jakma <paul.jakma@sun.com> * bgp_route.c: (bgp_table_stats_walker) NULL deref if table is empty, bgp_table_top may return NULL, Coverity CID#73.