2002-12-13 21:15:29 +01:00
|
|
|
/* BGP-4, BGP-4+ daemon program
|
|
|
|
Copyright (C) 1996, 97, 98, 99, 2000 Kunihiro Ishiguro
|
|
|
|
|
|
|
|
This file is part of GNU Zebra.
|
|
|
|
|
|
|
|
GNU Zebra is free software; you can redistribute it and/or modify it
|
|
|
|
under the terms of the GNU General Public License as published by the
|
|
|
|
Free Software Foundation; either version 2, or (at your option) any
|
|
|
|
later version.
|
|
|
|
|
|
|
|
GNU Zebra is distributed in the hope that it will be useful, but
|
|
|
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with GNU Zebra; see the file COPYING. If not, write to the Free
|
|
|
|
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
|
|
02111-1307, USA. */
|
|
|
|
|
|
|
|
#include <zebra.h>
|
|
|
|
|
|
|
|
#include "prefix.h"
|
|
|
|
#include "thread.h"
|
|
|
|
#include "buffer.h"
|
|
|
|
#include "stream.h"
|
|
|
|
#include "command.h"
|
|
|
|
#include "sockunion.h"
|
|
|
|
#include "network.h"
|
|
|
|
#include "memory.h"
|
|
|
|
#include "filter.h"
|
|
|
|
#include "routemap.h"
|
|
|
|
#include "str.h"
|
|
|
|
#include "log.h"
|
|
|
|
#include "plist.h"
|
|
|
|
#include "linklist.h"
|
2005-06-01 Paul Jakma <paul.jakma@sun.com>
* 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
2005-06-01 13:17:05 +02:00
|
|
|
#include "workqueue.h"
|
2015-05-20 03:03:47 +02:00
|
|
|
#include "queue.h"
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
#include "bgpd/bgpd.h"
|
|
|
|
#include "bgpd/bgp_table.h"
|
|
|
|
#include "bgpd/bgp_aspath.h"
|
|
|
|
#include "bgpd/bgp_route.h"
|
|
|
|
#include "bgpd/bgp_dump.h"
|
|
|
|
#include "bgpd/bgp_debug.h"
|
|
|
|
#include "bgpd/bgp_community.h"
|
|
|
|
#include "bgpd/bgp_attr.h"
|
|
|
|
#include "bgpd/bgp_regex.h"
|
|
|
|
#include "bgpd/bgp_clist.h"
|
|
|
|
#include "bgpd/bgp_fsm.h"
|
|
|
|
#include "bgpd/bgp_packet.h"
|
|
|
|
#include "bgpd/bgp_zebra.h"
|
|
|
|
#include "bgpd/bgp_open.h"
|
|
|
|
#include "bgpd/bgp_filter.h"
|
|
|
|
#include "bgpd/bgp_nexthop.h"
|
|
|
|
#include "bgpd/bgp_damp.h"
|
|
|
|
#include "bgpd/bgp_mplsvpn.h"
|
|
|
|
#include "bgpd/bgp_advertise.h"
|
|
|
|
#include "bgpd/bgp_network.h"
|
|
|
|
#include "bgpd/bgp_vty.h"
|
2011-07-21 05:43:22 +02:00
|
|
|
#include "bgpd/bgp_mpath.h"
|
2015-05-20 02:47:21 +02:00
|
|
|
#include "bgpd/bgp_nht.h"
|
2002-12-13 21:15:29 +01:00
|
|
|
#ifdef HAVE_SNMP
|
|
|
|
#include "bgpd/bgp_snmp.h"
|
|
|
|
#endif /* HAVE_SNMP */
|
2015-05-20 03:03:47 +02:00
|
|
|
#include "bgpd/bgp_updgrp.h"
|
|
|
|
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* BGP process wide configuration. */
|
|
|
|
static struct bgp_master bgp_master;
|
|
|
|
|
2004-10-03 20:18:34 +02:00
|
|
|
extern struct in_addr router_id_zebra;
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* BGP process wide configuration pointer to export. */
|
|
|
|
struct bgp_master *bm;
|
|
|
|
|
|
|
|
/* BGP community-list. */
|
|
|
|
struct community_list_handler *bgp_clist;
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2015-05-20 02:40:37 +02:00
|
|
|
|
|
|
|
static inline void
|
|
|
|
bgp_session_reset(struct peer *peer)
|
|
|
|
{
|
|
|
|
if (peer->doppelganger && (peer->doppelganger->status != Deleted)
|
|
|
|
&& !(CHECK_FLAG(peer->doppelganger->flags, PEER_FLAG_CONFIG_NODE)))
|
|
|
|
peer_delete(peer->doppelganger);
|
|
|
|
|
|
|
|
BGP_EVENT_ADD (peer, BGP_Stop);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* During session reset, we may delete the doppelganger peer, which would
|
|
|
|
* be the next node to the current node. If the session reset was invoked
|
|
|
|
* during walk of peer list, we would end up accessing the freed next
|
|
|
|
* node. This function moves the next node along.
|
|
|
|
*/
|
|
|
|
static inline void
|
|
|
|
bgp_session_reset_safe(struct peer *peer, struct listnode **nnode)
|
|
|
|
{
|
|
|
|
struct listnode *n;
|
|
|
|
struct peer *npeer;
|
|
|
|
|
|
|
|
n = (nnode) ? *nnode : NULL;
|
|
|
|
npeer = (n) ? listgetdata(n) : NULL;
|
|
|
|
|
|
|
|
if (peer->doppelganger && (peer->doppelganger->status != Deleted)
|
|
|
|
&& !(CHECK_FLAG(peer->doppelganger->flags, PEER_FLAG_CONFIG_NODE)))
|
|
|
|
{
|
|
|
|
if (peer->doppelganger == npeer)
|
|
|
|
/* nnode and *nnode are confirmed to be non-NULL here */
|
|
|
|
*nnode = (*nnode)->next;
|
|
|
|
peer_delete(peer->doppelganger);
|
|
|
|
}
|
|
|
|
|
|
|
|
BGP_EVENT_ADD (peer, BGP_Stop);
|
|
|
|
}
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* BGP global flag manipulation. */
|
|
|
|
int
|
|
|
|
bgp_option_set (int flag)
|
|
|
|
{
|
|
|
|
switch (flag)
|
|
|
|
{
|
|
|
|
case BGP_OPT_NO_FIB:
|
|
|
|
case BGP_OPT_MULTIPLE_INSTANCE:
|
|
|
|
case BGP_OPT_CONFIG_CISCO:
|
2012-06-14 11:40:26 +02:00
|
|
|
case BGP_OPT_NO_LISTEN:
|
2002-12-13 21:15:29 +01:00
|
|
|
SET_FLAG (bm->options, flag);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
return BGP_ERR_INVALID_FLAG;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
bgp_option_unset (int flag)
|
|
|
|
{
|
|
|
|
switch (flag)
|
|
|
|
{
|
|
|
|
case BGP_OPT_MULTIPLE_INSTANCE:
|
|
|
|
if (listcount (bm->bgp) > 1)
|
|
|
|
return BGP_ERR_MULTIPLE_INSTANCE_USED;
|
|
|
|
/* Fall through. */
|
|
|
|
case BGP_OPT_NO_FIB:
|
|
|
|
case BGP_OPT_CONFIG_CISCO:
|
|
|
|
UNSET_FLAG (bm->options, flag);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
return BGP_ERR_INVALID_FLAG;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
bgp_option_check (int flag)
|
|
|
|
{
|
|
|
|
return CHECK_FLAG (bm->options, flag);
|
|
|
|
}
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* BGP flag manipulation. */
|
|
|
|
int
|
|
|
|
bgp_flag_set (struct bgp *bgp, int flag)
|
|
|
|
{
|
|
|
|
SET_FLAG (bgp->flags, flag);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
bgp_flag_unset (struct bgp *bgp, int flag)
|
|
|
|
{
|
|
|
|
UNSET_FLAG (bgp->flags, flag);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
bgp_flag_check (struct bgp *bgp, int flag)
|
|
|
|
{
|
|
|
|
return CHECK_FLAG (bgp->flags, flag);
|
|
|
|
}
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* Internal function to set BGP structure configureation flag. */
|
|
|
|
static void
|
|
|
|
bgp_config_set (struct bgp *bgp, int config)
|
|
|
|
{
|
|
|
|
SET_FLAG (bgp->config, config);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
bgp_config_unset (struct bgp *bgp, int config)
|
|
|
|
{
|
|
|
|
UNSET_FLAG (bgp->config, config);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
bgp_config_check (struct bgp *bgp, int config)
|
|
|
|
{
|
|
|
|
return CHECK_FLAG (bgp->config, config);
|
|
|
|
}
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* Set BGP router identifier. */
|
|
|
|
int
|
|
|
|
bgp_router_id_set (struct bgp *bgp, struct in_addr *id)
|
|
|
|
{
|
|
|
|
struct peer *peer;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
if (bgp_config_check (bgp, BGP_CONFIG_ROUTER_ID)
|
|
|
|
&& IPV4_ADDR_SAME (&bgp->router_id, id))
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
IPV4_ADDR_COPY (&bgp->router_id, id);
|
|
|
|
bgp_config_set (bgp, BGP_CONFIG_ROUTER_ID);
|
|
|
|
|
|
|
|
/* Set all peer's local identifier with this value. */
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
IPV4_ADDR_COPY (&peer->local_id, id);
|
|
|
|
|
2013-10-02 12:40:20 +02:00
|
|
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
|
2004-05-20 11:19:34 +02:00
|
|
|
{
|
|
|
|
peer->last_reset = PEER_DOWN_RID_CHANGE;
|
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE,
|
|
|
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* BGP's cluster-id control. */
|
|
|
|
int
|
|
|
|
bgp_cluster_id_set (struct bgp *bgp, struct in_addr *cluster_id)
|
|
|
|
{
|
|
|
|
struct peer *peer;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
if (bgp_config_check (bgp, BGP_CONFIG_CLUSTER_ID)
|
|
|
|
&& IPV4_ADDR_SAME (&bgp->cluster_id, cluster_id))
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
IPV4_ADDR_COPY (&bgp->cluster_id, cluster_id);
|
|
|
|
bgp_config_set (bgp, BGP_CONFIG_CLUSTER_ID);
|
|
|
|
|
|
|
|
/* Clear all IBGP peer. */
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
2012-05-07 18:52:54 +02:00
|
|
|
if (peer->sort != BGP_PEER_IBGP)
|
2002-12-13 21:15:29 +01:00
|
|
|
continue;
|
|
|
|
|
2013-10-02 12:40:20 +02:00
|
|
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
|
2004-05-20 11:19:34 +02:00
|
|
|
{
|
|
|
|
peer->last_reset = PEER_DOWN_CLID_CHANGE;
|
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE,
|
|
|
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
bgp_cluster_id_unset (struct bgp *bgp)
|
|
|
|
{
|
|
|
|
struct peer *peer;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
if (! bgp_config_check (bgp, BGP_CONFIG_CLUSTER_ID))
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
bgp->cluster_id.s_addr = 0;
|
|
|
|
bgp_config_unset (bgp, BGP_CONFIG_CLUSTER_ID);
|
|
|
|
|
|
|
|
/* Clear all IBGP peer. */
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
2012-05-07 18:52:54 +02:00
|
|
|
if (peer->sort != BGP_PEER_IBGP)
|
2002-12-13 21:15:29 +01:00
|
|
|
continue;
|
|
|
|
|
2013-10-02 12:40:20 +02:00
|
|
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
|
2004-05-20 11:19:34 +02:00
|
|
|
{
|
|
|
|
peer->last_reset = PEER_DOWN_CLID_CHANGE;
|
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE,
|
|
|
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2010-01-15 14:22:10 +01:00
|
|
|
/* time_t value that is monotonicly increasing
|
|
|
|
* and uneffected by adjustments to system clock
|
|
|
|
*/
|
|
|
|
time_t bgp_clock (void)
|
|
|
|
{
|
|
|
|
struct timeval tv;
|
|
|
|
|
|
|
|
quagga_gettime(QUAGGA_CLK_MONOTONIC, &tv);
|
|
|
|
return tv.tv_sec;
|
|
|
|
}
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* BGP timer configuration. */
|
|
|
|
int
|
|
|
|
bgp_timers_set (struct bgp *bgp, u_int32_t keepalive, u_int32_t holdtime)
|
|
|
|
{
|
|
|
|
bgp->default_keepalive = (keepalive < holdtime / 3
|
|
|
|
? keepalive : holdtime / 3);
|
|
|
|
bgp->default_holdtime = holdtime;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
bgp_timers_unset (struct bgp *bgp)
|
|
|
|
{
|
|
|
|
bgp->default_keepalive = BGP_DEFAULT_KEEPALIVE;
|
|
|
|
bgp->default_holdtime = BGP_DEFAULT_HOLDTIME;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* BGP confederation configuration. */
|
|
|
|
int
|
|
|
|
bgp_confederation_id_set (struct bgp *bgp, as_t as)
|
|
|
|
{
|
|
|
|
struct peer *peer;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
int already_confed;
|
|
|
|
|
|
|
|
if (as == 0)
|
|
|
|
return BGP_ERR_INVALID_AS;
|
|
|
|
|
|
|
|
/* Remember - were we doing confederation before? */
|
|
|
|
already_confed = bgp_config_check (bgp, BGP_CONFIG_CONFEDERATION);
|
|
|
|
bgp->confed_id = as;
|
|
|
|
bgp_config_set (bgp, BGP_CONFIG_CONFEDERATION);
|
|
|
|
|
|
|
|
/* If we were doing confederation already, this is just an external
|
|
|
|
AS change. Just Reset EBGP sessions, not CONFED sessions. If we
|
|
|
|
were not doing confederation before, reset all EBGP sessions. */
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
/* We're looking for peers who's AS is not local or part of our
|
|
|
|
confederation. */
|
|
|
|
if (already_confed)
|
|
|
|
{
|
|
|
|
if (peer_sort (peer) == BGP_PEER_EBGP)
|
|
|
|
{
|
|
|
|
peer->local_as = as;
|
2013-10-02 12:40:20 +02:00
|
|
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
|
2004-05-20 11:19:34 +02:00
|
|
|
{
|
|
|
|
peer->last_reset = PEER_DOWN_CONFED_ID_CHANGE;
|
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE,
|
|
|
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
else
|
2015-05-20 02:40:37 +02:00
|
|
|
bgp_session_reset_safe(peer, &nnode);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* Not doign confederation before, so reset every non-local
|
|
|
|
session */
|
|
|
|
if (peer_sort (peer) != BGP_PEER_IBGP)
|
|
|
|
{
|
|
|
|
/* Reset the local_as to be our EBGP one */
|
|
|
|
if (peer_sort (peer) == BGP_PEER_EBGP)
|
|
|
|
peer->local_as = as;
|
2013-10-02 12:40:20 +02:00
|
|
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
|
2004-05-20 11:19:34 +02:00
|
|
|
{
|
|
|
|
peer->last_reset = PEER_DOWN_CONFED_ID_CHANGE;
|
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE,
|
|
|
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
else
|
2015-05-20 02:40:37 +02:00
|
|
|
bgp_session_reset_safe(peer, &nnode);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
bgp_confederation_id_unset (struct bgp *bgp)
|
|
|
|
{
|
|
|
|
struct peer *peer;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
bgp->confed_id = 0;
|
|
|
|
bgp_config_unset (bgp, BGP_CONFIG_CONFEDERATION);
|
|
|
|
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
/* We're looking for peers who's AS is not local */
|
|
|
|
if (peer_sort (peer) != BGP_PEER_IBGP)
|
|
|
|
{
|
|
|
|
peer->local_as = bgp->as;
|
2013-10-02 12:40:20 +02:00
|
|
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
|
2004-05-20 11:19:34 +02:00
|
|
|
{
|
|
|
|
peer->last_reset = PEER_DOWN_CONFED_ID_CHANGE;
|
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE,
|
|
|
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
|
|
|
}
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
else
|
2015-05-20 02:40:37 +02:00
|
|
|
bgp_session_reset_safe(peer, &nnode);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Is an AS part of the confed or not? */
|
|
|
|
int
|
|
|
|
bgp_confederation_peers_check (struct bgp *bgp, as_t as)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
if (! bgp)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
for (i = 0; i < bgp->confed_peers_cnt; i++)
|
|
|
|
if (bgp->confed_peers[i] == as)
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Add an AS to the confederation set. */
|
|
|
|
int
|
|
|
|
bgp_confederation_peers_add (struct bgp *bgp, as_t as)
|
|
|
|
{
|
|
|
|
struct peer *peer;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
if (! bgp)
|
|
|
|
return BGP_ERR_INVALID_BGP;
|
|
|
|
|
|
|
|
if (bgp->as == as)
|
|
|
|
return BGP_ERR_INVALID_AS;
|
|
|
|
|
|
|
|
if (bgp_confederation_peers_check (bgp, as))
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
if (bgp->confed_peers)
|
|
|
|
bgp->confed_peers = XREALLOC (MTYPE_BGP_CONFED_LIST,
|
|
|
|
bgp->confed_peers,
|
|
|
|
(bgp->confed_peers_cnt + 1) * sizeof (as_t));
|
|
|
|
else
|
|
|
|
bgp->confed_peers = XMALLOC (MTYPE_BGP_CONFED_LIST,
|
|
|
|
(bgp->confed_peers_cnt + 1) * sizeof (as_t));
|
|
|
|
|
|
|
|
bgp->confed_peers[bgp->confed_peers_cnt] = as;
|
|
|
|
bgp->confed_peers_cnt++;
|
|
|
|
|
|
|
|
if (bgp_config_check (bgp, BGP_CONFIG_CONFEDERATION))
|
|
|
|
{
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
if (peer->as == as)
|
|
|
|
{
|
|
|
|
peer->local_as = bgp->as;
|
2013-10-02 12:40:20 +02:00
|
|
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
|
2004-05-20 11:19:34 +02:00
|
|
|
{
|
|
|
|
peer->last_reset = PEER_DOWN_CONFED_PEER_CHANGE;
|
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE,
|
|
|
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
else
|
2015-05-20 02:40:37 +02:00
|
|
|
bgp_session_reset_safe(peer, &nnode);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Delete an AS from the confederation set. */
|
|
|
|
int
|
|
|
|
bgp_confederation_peers_remove (struct bgp *bgp, as_t as)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
int j;
|
|
|
|
struct peer *peer;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
if (! bgp)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
if (! bgp_confederation_peers_check (bgp, as))
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
for (i = 0; i < bgp->confed_peers_cnt; i++)
|
|
|
|
if (bgp->confed_peers[i] == as)
|
|
|
|
for(j = i + 1; j < bgp->confed_peers_cnt; j++)
|
|
|
|
bgp->confed_peers[j - 1] = bgp->confed_peers[j];
|
|
|
|
|
|
|
|
bgp->confed_peers_cnt--;
|
|
|
|
|
|
|
|
if (bgp->confed_peers_cnt == 0)
|
|
|
|
{
|
|
|
|
if (bgp->confed_peers)
|
|
|
|
XFREE (MTYPE_BGP_CONFED_LIST, bgp->confed_peers);
|
|
|
|
bgp->confed_peers = NULL;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
bgp->confed_peers = XREALLOC (MTYPE_BGP_CONFED_LIST,
|
|
|
|
bgp->confed_peers,
|
|
|
|
bgp->confed_peers_cnt * sizeof (as_t));
|
|
|
|
|
|
|
|
/* Now reset any peer who's remote AS has just been removed from the
|
|
|
|
CONFED */
|
|
|
|
if (bgp_config_check (bgp, BGP_CONFIG_CONFEDERATION))
|
|
|
|
{
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
if (peer->as == as)
|
|
|
|
{
|
|
|
|
peer->local_as = bgp->confed_id;
|
2013-10-02 12:40:20 +02:00
|
|
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
|
2004-05-20 11:19:34 +02:00
|
|
|
{
|
|
|
|
peer->last_reset = PEER_DOWN_CONFED_PEER_CHANGE;
|
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE,
|
|
|
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
else
|
2015-05-20 02:40:37 +02:00
|
|
|
bgp_session_reset_safe(peer, &nnode);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* Local preference configuration. */
|
|
|
|
int
|
|
|
|
bgp_default_local_preference_set (struct bgp *bgp, u_int32_t local_pref)
|
|
|
|
{
|
|
|
|
if (! bgp)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
bgp->default_local_pref = local_pref;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
bgp_default_local_preference_unset (struct bgp *bgp)
|
|
|
|
{
|
|
|
|
if (! bgp)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
bgp->default_local_pref = BGP_DEFAULT_LOCAL_PREF;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2015-05-20 03:03:47 +02:00
|
|
|
/* Local preference configuration. */
|
|
|
|
int
|
|
|
|
bgp_default_subgroup_pkt_queue_max_set (struct bgp *bgp, u_int32_t queue_size)
|
|
|
|
{
|
|
|
|
if (! bgp)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
bgp->default_subgroup_pkt_queue_max = queue_size;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
bgp_default_subgroup_pkt_queue_max_unset (struct bgp *bgp)
|
|
|
|
{
|
|
|
|
if (! bgp)
|
|
|
|
return -1;
|
|
|
|
bgp->default_subgroup_pkt_queue_max = BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2015-05-20 03:03:47 +02:00
|
|
|
/* Listen limit configuration. */
|
|
|
|
int
|
|
|
|
bgp_listen_limit_set (struct bgp *bgp, int listen_limit)
|
|
|
|
{
|
|
|
|
if (! bgp)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
bgp->dynamic_neighbors_limit = listen_limit;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
bgp_listen_limit_unset (struct bgp *bgp)
|
|
|
|
{
|
|
|
|
if (! bgp)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
bgp->dynamic_neighbors_limit = BGP_DYNAMIC_NEIGHBORS_LIMIT_DEFAULT;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2015-05-20 03:03:47 +02:00
|
|
|
struct peer_af *
|
|
|
|
peer_af_create (struct peer *peer, afi_t afi, safi_t safi)
|
|
|
|
{
|
|
|
|
struct peer_af *af;
|
|
|
|
int afid;
|
|
|
|
|
|
|
|
if (!peer)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
afid = afindex(afi, safi);
|
|
|
|
if (afid >= BGP_AF_MAX)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
assert(peer->peer_af_array[afid] == NULL);
|
|
|
|
|
|
|
|
/* Allocate new peer af */
|
|
|
|
af = XCALLOC (MTYPE_BGP_PEER_AF, sizeof (struct peer_af));
|
|
|
|
peer->peer_af_array[afid] = af;
|
|
|
|
af->afi = afi;
|
|
|
|
af->safi = safi;
|
|
|
|
af->afid = afid;
|
|
|
|
af->peer = peer;
|
|
|
|
|
|
|
|
//update_group_adjust_peer(af);
|
|
|
|
return af;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct peer_af *
|
|
|
|
peer_af_find (struct peer *peer, afi_t afi, safi_t safi)
|
|
|
|
{
|
|
|
|
int afid;
|
|
|
|
|
|
|
|
if (!peer)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
afid = afindex(afi, safi);
|
|
|
|
if (afid >= BGP_AF_MAX)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
return peer->peer_af_array[afid];
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
peer_af_delete (struct peer *peer, afi_t afi, safi_t safi)
|
|
|
|
{
|
|
|
|
struct peer_af *af;
|
|
|
|
int afid;
|
|
|
|
|
|
|
|
if (!peer)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
afid = afindex(afi, safi);
|
|
|
|
if (afid >= BGP_AF_MAX)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
af = peer->peer_af_array[afid];
|
|
|
|
if (!af)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
bgp_stop_announce_route_timer (af);
|
|
|
|
|
|
|
|
if (PAF_SUBGRP(af))
|
|
|
|
{
|
|
|
|
if (BGP_DEBUG (update_groups, UPDATE_GROUPS))
|
2015-05-20 03:12:17 +02:00
|
|
|
zlog_debug ("u%" PRIu64 ":s%" PRIu64 " remove peer %s",
|
2015-05-20 03:03:47 +02:00
|
|
|
af->subgroup->update_group->id, af->subgroup->id, peer->host);
|
|
|
|
}
|
|
|
|
|
|
|
|
update_subgroup_remove_peer (af->subgroup, af);
|
|
|
|
|
|
|
|
peer->peer_af_array[afid] = NULL;
|
|
|
|
XFREE(MTYPE_BGP_PEER_AF, af);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2004-09-13 Jose Luis Rubio <jrubio@dit.upm.es>
(at Technical University of Madrid as part of Euro6ix Project)
Enhanced Route Server functionality and Route-Maps:
* bgpd/bgpd.h: Modified 'struct peer' and 'struct bgp_filter' to
support rs-clients. A 'struct bgp_table *rib' has been added to the
first (to mantain a separated RIB for each rs-client) and two new
route-maps have been added to the last (for import/export policies).
Added the following #defines: RMAP_{IN|OUT|IMPORT|EXPORT|MAX},
PEER_RMAP_TYPE_{IMPORT|EXPORT} and BGP_CLEAR_SOFT_RSCLIENT.
* bgpd/bgpd.c: Modified the functions that create/delete/etc peers in
order to consider the new fields included in 'struct peer' for
supporting rs-clients, i.e. the import/export route-maps and the
'struct bgp_table'.
* bgpd/bgp_route.{ch}: Modified several functions related with
receiving/sending announces in order to support the new Route Server
capabilities.
Function 'bgp_process' has been reorganized, creating an auxiliar
function for best path selection ('bgp_best_selection').
Modified 'bgp_show' and 'bgp_show_route' for displaying information
about any RIB (and not only the main bgp RIB).
Added commands for displaying information about RS-clients RIBs:
'show bgp rsclient (A.B.C.D|X:X::X:X)', 'show bgp rsclient
(A.B.C.D|X:X::X:X) X:X::X:X/M', etc
* bgpd/bgp_table.{ch}: The structure 'struct bgp_table' now has two
new fields: type (which can take the values BGP_TABLE_{MAIN|RSCLIENT})
and 'void *owner' which points to 'struct bgp' or 'struct peer' which
owns the table.
When creating a new bgp_table by default 'type=BGP_TABLE_MAIN' is set.
* bgpd/bgp_vty.c: The commands 'neighbor ... route-server-client' and
'no neighbor ... route-server-client' now not only set/unset the flag
PEER_FLAG_RSERVER_CLIENT, but they create/destroy the 'struct
bgp_table' of the peer. Special actions are taken for peer_groups.
Command 'neighbor ... route-map WORD (in|out)' now also supports two
new kinds of route-map: 'import' and 'export'.
Added commands 'clear bgp * rsclient', etc. These commands allow a new
kind of soft_reconfig which affects only the RIB of the specified
RS-client.
Added commands 'show bgp rsclient summary', etc which display a
summary of the rs-clients configured for the corresponding address
family.
* bgpd/bgp_routemap.c: A new match statement is available,
'match peer (A.B.C.D|X:X::X:X)'. This statement can only be used in
import/export route-maps, and it matches when the peer who announces
(when used in an import route-map) or is going to receive (when used
in an export route-map) the route is the same than the one specified
in the statement.
For peer-groups the statement matches if the specified peer is member
of the peer-group.
A special version of the command, 'match peer local', matches with
routes originated by the Route Server (defined with 'network ...',
redistributed routes and default-originate).
* lib/routemap.{ch}: Added a new clause 'call NAME' for use in
route-maps. It jumps into the specified route-map and when it returns
the first route-map ends if the called RM returns DENY_MATCH, or
continues in other case.
2004-09-13 07:12:46 +02:00
|
|
|
/* If peer is RSERVER_CLIENT in at least one address family and is not member
|
|
|
|
of a peer_group for that family, return 1.
|
|
|
|
Used to check wether the peer is included in list bgp->rsclient. */
|
|
|
|
int
|
|
|
|
peer_rsclient_active (struct peer *peer)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
int j;
|
|
|
|
|
|
|
|
for (i=AFI_IP; i < AFI_MAX; i++)
|
|
|
|
for (j=SAFI_UNICAST; j < SAFI_MAX; j++)
|
|
|
|
if (CHECK_FLAG(peer->af_flags[i][j], PEER_FLAG_RSERVER_CLIENT)
|
|
|
|
&& ! peer->af_group[i][j])
|
|
|
|
return 1;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2004-05-01 10:44:08 +02:00
|
|
|
/* Peer comparison function for sorting. */
|
2015-05-20 02:58:12 +02:00
|
|
|
int
|
2002-12-13 21:15:29 +01:00
|
|
|
peer_cmp (struct peer *p1, struct peer *p2)
|
|
|
|
{
|
2004-05-01 10:44:08 +02:00
|
|
|
return sockunion_cmp (&p1->su, &p2->su);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
peer_af_flag_check (struct peer *peer, afi_t afi, safi_t safi, u_int32_t flag)
|
|
|
|
{
|
|
|
|
return CHECK_FLAG (peer->af_flags[afi][safi], flag);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Reset all address family specific configuration. */
|
|
|
|
static void
|
|
|
|
peer_af_flag_reset (struct peer *peer, afi_t afi, safi_t safi)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
struct bgp_filter *filter;
|
|
|
|
char orf_name[BUFSIZ];
|
|
|
|
|
|
|
|
filter = &peer->filter[afi][safi];
|
|
|
|
|
|
|
|
/* Clear neighbor filter and route-map */
|
|
|
|
for (i = FILTER_IN; i < FILTER_MAX; i++)
|
|
|
|
{
|
|
|
|
if (filter->dlist[i].name)
|
|
|
|
{
|
|
|
|
free (filter->dlist[i].name);
|
|
|
|
filter->dlist[i].name = NULL;
|
|
|
|
}
|
|
|
|
if (filter->plist[i].name)
|
|
|
|
{
|
|
|
|
free (filter->plist[i].name);
|
|
|
|
filter->plist[i].name = NULL;
|
|
|
|
}
|
|
|
|
if (filter->aslist[i].name)
|
|
|
|
{
|
|
|
|
free (filter->aslist[i].name);
|
|
|
|
filter->aslist[i].name = NULL;
|
|
|
|
}
|
2004-09-13 Jose Luis Rubio <jrubio@dit.upm.es>
(at Technical University of Madrid as part of Euro6ix Project)
Enhanced Route Server functionality and Route-Maps:
* bgpd/bgpd.h: Modified 'struct peer' and 'struct bgp_filter' to
support rs-clients. A 'struct bgp_table *rib' has been added to the
first (to mantain a separated RIB for each rs-client) and two new
route-maps have been added to the last (for import/export policies).
Added the following #defines: RMAP_{IN|OUT|IMPORT|EXPORT|MAX},
PEER_RMAP_TYPE_{IMPORT|EXPORT} and BGP_CLEAR_SOFT_RSCLIENT.
* bgpd/bgpd.c: Modified the functions that create/delete/etc peers in
order to consider the new fields included in 'struct peer' for
supporting rs-clients, i.e. the import/export route-maps and the
'struct bgp_table'.
* bgpd/bgp_route.{ch}: Modified several functions related with
receiving/sending announces in order to support the new Route Server
capabilities.
Function 'bgp_process' has been reorganized, creating an auxiliar
function for best path selection ('bgp_best_selection').
Modified 'bgp_show' and 'bgp_show_route' for displaying information
about any RIB (and not only the main bgp RIB).
Added commands for displaying information about RS-clients RIBs:
'show bgp rsclient (A.B.C.D|X:X::X:X)', 'show bgp rsclient
(A.B.C.D|X:X::X:X) X:X::X:X/M', etc
* bgpd/bgp_table.{ch}: The structure 'struct bgp_table' now has two
new fields: type (which can take the values BGP_TABLE_{MAIN|RSCLIENT})
and 'void *owner' which points to 'struct bgp' or 'struct peer' which
owns the table.
When creating a new bgp_table by default 'type=BGP_TABLE_MAIN' is set.
* bgpd/bgp_vty.c: The commands 'neighbor ... route-server-client' and
'no neighbor ... route-server-client' now not only set/unset the flag
PEER_FLAG_RSERVER_CLIENT, but they create/destroy the 'struct
bgp_table' of the peer. Special actions are taken for peer_groups.
Command 'neighbor ... route-map WORD (in|out)' now also supports two
new kinds of route-map: 'import' and 'export'.
Added commands 'clear bgp * rsclient', etc. These commands allow a new
kind of soft_reconfig which affects only the RIB of the specified
RS-client.
Added commands 'show bgp rsclient summary', etc which display a
summary of the rs-clients configured for the corresponding address
family.
* bgpd/bgp_routemap.c: A new match statement is available,
'match peer (A.B.C.D|X:X::X:X)'. This statement can only be used in
import/export route-maps, and it matches when the peer who announces
(when used in an import route-map) or is going to receive (when used
in an export route-map) the route is the same than the one specified
in the statement.
For peer-groups the statement matches if the specified peer is member
of the peer-group.
A special version of the command, 'match peer local', matches with
routes originated by the Route Server (defined with 'network ...',
redistributed routes and default-originate).
* lib/routemap.{ch}: Added a new clause 'call NAME' for use in
route-maps. It jumps into the specified route-map and when it returns
the first route-map ends if the called RM returns DENY_MATCH, or
continues in other case.
2004-09-13 07:12:46 +02:00
|
|
|
}
|
|
|
|
for (i = RMAP_IN; i < RMAP_MAX; i++)
|
|
|
|
{
|
2002-12-13 21:15:29 +01:00
|
|
|
if (filter->map[i].name)
|
|
|
|
{
|
|
|
|
free (filter->map[i].name);
|
|
|
|
filter->map[i].name = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Clear unsuppress map. */
|
|
|
|
if (filter->usmap.name)
|
|
|
|
free (filter->usmap.name);
|
|
|
|
filter->usmap.name = NULL;
|
|
|
|
filter->usmap.map = NULL;
|
|
|
|
|
|
|
|
/* Clear neighbor's all address family flags. */
|
|
|
|
peer->af_flags[afi][safi] = 0;
|
|
|
|
|
|
|
|
/* Clear neighbor's all address family sflags. */
|
|
|
|
peer->af_sflags[afi][safi] = 0;
|
|
|
|
|
|
|
|
/* Clear neighbor's all address family capabilities. */
|
|
|
|
peer->af_cap[afi][safi] = 0;
|
|
|
|
|
|
|
|
/* Clear ORF info */
|
|
|
|
peer->orf_plist[afi][safi] = NULL;
|
|
|
|
sprintf (orf_name, "%s.%d.%d", peer->host, afi, safi);
|
|
|
|
prefix_bgp_orf_remove_all (orf_name);
|
|
|
|
|
|
|
|
/* Set default neighbor send-community. */
|
|
|
|
if (! bgp_option_check (BGP_OPT_CONFIG_CISCO))
|
|
|
|
{
|
|
|
|
SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SEND_COMMUNITY);
|
|
|
|
SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SEND_EXT_COMMUNITY);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Clear neighbor default_originate_rmap */
|
|
|
|
if (peer->default_rmap[afi][safi].name)
|
|
|
|
free (peer->default_rmap[afi][safi].name);
|
|
|
|
peer->default_rmap[afi][safi].name = NULL;
|
|
|
|
peer->default_rmap[afi][safi].map = NULL;
|
|
|
|
|
|
|
|
/* Clear neighbor maximum-prefix */
|
|
|
|
peer->pmax[afi][safi] = 0;
|
2004-05-20 11:19:34 +02:00
|
|
|
peer->pmax_threshold[afi][safi] = MAXIMUM_PREFIX_THRESHOLD_DEFAULT;
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/* peer global config reset */
|
2005-06-28 14:44:16 +02:00
|
|
|
static void
|
2002-12-13 21:15:29 +01:00
|
|
|
peer_global_config_reset (struct peer *peer)
|
|
|
|
{
|
|
|
|
peer->weight = 0;
|
|
|
|
peer->change_local_as = 0;
|
|
|
|
peer->ttl = (peer_sort (peer) == BGP_PEER_IBGP ? 255 : 1);
|
|
|
|
if (peer->update_source)
|
|
|
|
{
|
|
|
|
sockunion_free (peer->update_source);
|
|
|
|
peer->update_source = NULL;
|
|
|
|
}
|
|
|
|
if (peer->update_if)
|
|
|
|
{
|
|
|
|
XFREE (MTYPE_PEER_UPDATE_SOURCE, peer->update_if);
|
|
|
|
peer->update_if = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (peer_sort (peer) == BGP_PEER_IBGP)
|
|
|
|
peer->v_routeadv = BGP_DEFAULT_IBGP_ROUTEADV;
|
|
|
|
else
|
|
|
|
peer->v_routeadv = BGP_DEFAULT_EBGP_ROUTEADV;
|
|
|
|
|
|
|
|
peer->flags = 0;
|
|
|
|
peer->config = 0;
|
|
|
|
peer->holdtime = 0;
|
|
|
|
peer->keepalive = 0;
|
|
|
|
peer->connect = 0;
|
|
|
|
peer->v_connect = BGP_DEFAULT_CONNECT_RETRY;
|
2015-05-20 03:04:18 +02:00
|
|
|
|
|
|
|
/* Reset some other configs back to defaults. */
|
|
|
|
peer->v_start = BGP_INIT_START_TIMER;
|
|
|
|
peer->v_asorig = BGP_DEFAULT_ASORIGINATE;
|
|
|
|
peer->password = NULL;
|
|
|
|
peer->local_id = peer->bgp->router_id;
|
|
|
|
peer->v_holdtime = peer->bgp->default_holdtime;
|
|
|
|
peer->v_keepalive = peer->bgp->default_keepalive;
|
|
|
|
|
|
|
|
/* Set back the CONFIG_NODE flag. */
|
|
|
|
SET_FLAG (peer->flags, PEER_FLAG_CONFIG_NODE);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
|
2012-05-07 18:52:54 +02:00
|
|
|
/* Check peer's AS number and determines if this peer is IBGP or EBGP */
|
|
|
|
static bgp_peer_sort_t
|
|
|
|
peer_calc_sort (struct peer *peer)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
struct bgp *bgp;
|
|
|
|
|
|
|
|
bgp = peer->bgp;
|
|
|
|
|
|
|
|
/* Peer-group */
|
|
|
|
if (CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
|
|
|
{
|
2015-05-20 03:04:25 +02:00
|
|
|
if (peer->as_type != AS_SPECIFIED)
|
|
|
|
return (peer->as_type == AS_INTERNAL ? BGP_PEER_IBGP : BGP_PEER_EBGP);
|
|
|
|
else if (peer->as)
|
2002-12-13 21:15:29 +01:00
|
|
|
return (bgp->as == peer->as ? BGP_PEER_IBGP : BGP_PEER_EBGP);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
struct peer *peer1;
|
|
|
|
peer1 = listnode_head (peer->group->peer);
|
|
|
|
if (peer1)
|
|
|
|
return (peer1->local_as == peer1->as
|
|
|
|
? BGP_PEER_IBGP : BGP_PEER_EBGP);
|
|
|
|
}
|
|
|
|
return BGP_PEER_INTERNAL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Normal peer */
|
|
|
|
if (bgp && CHECK_FLAG (bgp->config, BGP_CONFIG_CONFEDERATION))
|
|
|
|
{
|
|
|
|
if (peer->local_as == 0)
|
|
|
|
return BGP_PEER_INTERNAL;
|
|
|
|
|
|
|
|
if (peer->local_as == peer->as)
|
|
|
|
{
|
|
|
|
if (peer->local_as == bgp->confed_id)
|
|
|
|
return BGP_PEER_EBGP;
|
|
|
|
else
|
|
|
|
return BGP_PEER_IBGP;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (bgp_confederation_peers_check (bgp, peer->as))
|
|
|
|
return BGP_PEER_CONFED;
|
|
|
|
|
|
|
|
return BGP_PEER_EBGP;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2015-05-20 03:04:25 +02:00
|
|
|
if (peer->as_type != AS_SPECIFIED)
|
|
|
|
return (peer->as_type == AS_INTERNAL ? BGP_PEER_IBGP : BGP_PEER_EBGP);
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
return (peer->local_as == 0
|
|
|
|
? BGP_PEER_INTERNAL : peer->local_as == peer->as
|
|
|
|
? BGP_PEER_IBGP : BGP_PEER_EBGP);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-05-07 18:52:54 +02:00
|
|
|
/* Calculate and cache the peer "sort" */
|
|
|
|
bgp_peer_sort_t
|
|
|
|
peer_sort (struct peer *peer)
|
|
|
|
{
|
|
|
|
peer->sort = peer_calc_sort (peer);
|
|
|
|
return peer->sort;
|
|
|
|
}
|
|
|
|
|
2011-04-08 13:44:43 +02:00
|
|
|
static void
|
2005-06-01 Paul Jakma <paul.jakma@sun.com>
* 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
2005-06-01 13:17:05 +02:00
|
|
|
peer_free (struct peer *peer)
|
|
|
|
{
|
[bgpd] Fix 0.99 shutdown regression, introduce Clearing and Deleted states
2006-09-14 Paul Jakma <paul.jakma@sun.com>
* (general) Fix some niggly issues around 'shutdown' and clearing
by adding a Clearing FSM wait-state and a hidden 'Deleted'
FSM state, to allow deleted peers to 'cool off' and hit 0
references. This introduces a slow memory leak of struct peer,
however that's more a testament to the fragility of the
reference counting than a bug in this patch, cleanup of
reference counting to fix this is to follow.
* bgpd.h: Add Clearing, Deleted states and Clearing_Completed
and event.
* bgp_debug.c: (bgp_status_msg[]) Add strings for Clearing and
Deleted.
* bgp_fsm.h: Don't allow timer/event threads to set anything
for Deleted peers.
* bgp_fsm.c: (bgp_timer_set) Add Clearing and Deleted. Deleted
needs to stop everything.
(bgp_stop) Remove explicit fsm_change_status call, the
general framework handles the transition.
(bgp_start) Log a warning if a start is attempted on a peer
that should stay down, trying to start a peer.
(struct .. FSM) Add Clearing_Completed
events, has little influence except when in state
Clearing to signal wait-state can end.
Add Clearing and Deleted states, former is a wait-state,
latter is a placeholder state to allow peers to disappear
quietly once refcounts settle.
(bgp_event) Try reduce verbosity of FSM state-change debug,
changes to same state are not interesting (Established->Established)
Allow NULL action functions in FSM.
* bgp_packet.c: (bgp_write) Use FSM events, rather than trying
to twiddle directly with FSM state behind the back of FSM.
(bgp_write_notify) ditto.
(bgp_read) Remove the vague ACCEPT_PEER peer_unlock, or else
this patch crashes, now it leaks instead.
* bgp_route.c: (bgp_clear_node_complete) Clearing_Completed
event, to end clearing.
(bgp_clear_route) See extensive comments.
* bgpd.c: (peer_free) should only be called while in Deleted,
peer refcounting controls when peer_free is called.
bgp_sync_delete should be here, not in peer_delete.
(peer_delete) Initiate delete.
Transition to Deleted state manually.
When removing peer from indices that provide visibility of it,
take great care to be idempotent wrt the reference counting
of struct peer through those indices.
Use bgp_timer_set, rather than replicating.
Call to bgp_sync_delete isn't appropriate here, sync can be
referenced while shutting down and finishing deletion.
(peer_group_bind) Take care to be idempotent wrt list references
indexing peers.
2006-09-14 04:58:49 +02:00
|
|
|
assert (peer->status == Deleted);
|
2009-05-21 17:51:03 +02:00
|
|
|
|
|
|
|
bgp_unlock(peer->bgp);
|
|
|
|
|
[bgpd] Fix 0.99 shutdown regression, introduce Clearing and Deleted states
2006-09-14 Paul Jakma <paul.jakma@sun.com>
* (general) Fix some niggly issues around 'shutdown' and clearing
by adding a Clearing FSM wait-state and a hidden 'Deleted'
FSM state, to allow deleted peers to 'cool off' and hit 0
references. This introduces a slow memory leak of struct peer,
however that's more a testament to the fragility of the
reference counting than a bug in this patch, cleanup of
reference counting to fix this is to follow.
* bgpd.h: Add Clearing, Deleted states and Clearing_Completed
and event.
* bgp_debug.c: (bgp_status_msg[]) Add strings for Clearing and
Deleted.
* bgp_fsm.h: Don't allow timer/event threads to set anything
for Deleted peers.
* bgp_fsm.c: (bgp_timer_set) Add Clearing and Deleted. Deleted
needs to stop everything.
(bgp_stop) Remove explicit fsm_change_status call, the
general framework handles the transition.
(bgp_start) Log a warning if a start is attempted on a peer
that should stay down, trying to start a peer.
(struct .. FSM) Add Clearing_Completed
events, has little influence except when in state
Clearing to signal wait-state can end.
Add Clearing and Deleted states, former is a wait-state,
latter is a placeholder state to allow peers to disappear
quietly once refcounts settle.
(bgp_event) Try reduce verbosity of FSM state-change debug,
changes to same state are not interesting (Established->Established)
Allow NULL action functions in FSM.
* bgp_packet.c: (bgp_write) Use FSM events, rather than trying
to twiddle directly with FSM state behind the back of FSM.
(bgp_write_notify) ditto.
(bgp_read) Remove the vague ACCEPT_PEER peer_unlock, or else
this patch crashes, now it leaks instead.
* bgp_route.c: (bgp_clear_node_complete) Clearing_Completed
event, to end clearing.
(bgp_clear_route) See extensive comments.
* bgpd.c: (peer_free) should only be called while in Deleted,
peer refcounting controls when peer_free is called.
bgp_sync_delete should be here, not in peer_delete.
(peer_delete) Initiate delete.
Transition to Deleted state manually.
When removing peer from indices that provide visibility of it,
take great care to be idempotent wrt the reference counting
of struct peer through those indices.
Use bgp_timer_set, rather than replicating.
Call to bgp_sync_delete isn't appropriate here, sync can be
referenced while shutting down and finishing deletion.
(peer_group_bind) Take care to be idempotent wrt list references
indexing peers.
2006-09-14 04:58:49 +02:00
|
|
|
/* this /ought/ to have been done already through bgp_stop earlier,
|
|
|
|
* but just to be sure..
|
|
|
|
*/
|
|
|
|
bgp_timer_set (peer);
|
|
|
|
BGP_READ_OFF (peer->t_read);
|
|
|
|
BGP_WRITE_OFF (peer->t_write);
|
2006-09-14 05:02:02 +02:00
|
|
|
BGP_EVENT_FLUSH (peer);
|
[bgpd] Fix 0.99 shutdown regression, introduce Clearing and Deleted states
2006-09-14 Paul Jakma <paul.jakma@sun.com>
* (general) Fix some niggly issues around 'shutdown' and clearing
by adding a Clearing FSM wait-state and a hidden 'Deleted'
FSM state, to allow deleted peers to 'cool off' and hit 0
references. This introduces a slow memory leak of struct peer,
however that's more a testament to the fragility of the
reference counting than a bug in this patch, cleanup of
reference counting to fix this is to follow.
* bgpd.h: Add Clearing, Deleted states and Clearing_Completed
and event.
* bgp_debug.c: (bgp_status_msg[]) Add strings for Clearing and
Deleted.
* bgp_fsm.h: Don't allow timer/event threads to set anything
for Deleted peers.
* bgp_fsm.c: (bgp_timer_set) Add Clearing and Deleted. Deleted
needs to stop everything.
(bgp_stop) Remove explicit fsm_change_status call, the
general framework handles the transition.
(bgp_start) Log a warning if a start is attempted on a peer
that should stay down, trying to start a peer.
(struct .. FSM) Add Clearing_Completed
events, has little influence except when in state
Clearing to signal wait-state can end.
Add Clearing and Deleted states, former is a wait-state,
latter is a placeholder state to allow peers to disappear
quietly once refcounts settle.
(bgp_event) Try reduce verbosity of FSM state-change debug,
changes to same state are not interesting (Established->Established)
Allow NULL action functions in FSM.
* bgp_packet.c: (bgp_write) Use FSM events, rather than trying
to twiddle directly with FSM state behind the back of FSM.
(bgp_write_notify) ditto.
(bgp_read) Remove the vague ACCEPT_PEER peer_unlock, or else
this patch crashes, now it leaks instead.
* bgp_route.c: (bgp_clear_node_complete) Clearing_Completed
event, to end clearing.
(bgp_clear_route) See extensive comments.
* bgpd.c: (peer_free) should only be called while in Deleted,
peer refcounting controls when peer_free is called.
bgp_sync_delete should be here, not in peer_delete.
(peer_delete) Initiate delete.
Transition to Deleted state manually.
When removing peer from indices that provide visibility of it,
take great care to be idempotent wrt the reference counting
of struct peer through those indices.
Use bgp_timer_set, rather than replicating.
Call to bgp_sync_delete isn't appropriate here, sync can be
referenced while shutting down and finishing deletion.
(peer_group_bind) Take care to be idempotent wrt list references
indexing peers.
2006-09-14 04:58:49 +02:00
|
|
|
|
2015-05-20 03:03:54 +02:00
|
|
|
/* Free connected nexthop, if present */
|
|
|
|
if (CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE) &&
|
|
|
|
!peer_dynamic_neighbor (peer))
|
|
|
|
bgp_delete_connected_nexthop (family2afi(peer->su.sa.sa_family), peer);
|
|
|
|
|
2005-06-01 Paul Jakma <paul.jakma@sun.com>
* 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
2005-06-01 13:17:05 +02:00
|
|
|
if (peer->desc)
|
|
|
|
XFREE (MTYPE_PEER_DESC, peer->desc);
|
|
|
|
|
|
|
|
/* Free allocated host character. */
|
|
|
|
if (peer->host)
|
|
|
|
XFREE (MTYPE_BGP_PEER_HOST, peer->host);
|
|
|
|
|
|
|
|
/* Update source configuration. */
|
|
|
|
if (peer->update_source)
|
|
|
|
sockunion_free (peer->update_source);
|
|
|
|
|
|
|
|
if (peer->update_if)
|
|
|
|
XFREE (MTYPE_PEER_UPDATE_SOURCE, peer->update_if);
|
2006-03-30 16:12:38 +02:00
|
|
|
|
|
|
|
if (peer->clear_node_queue)
|
|
|
|
work_queue_free (peer->clear_node_queue);
|
|
|
|
|
[bgpd] Fix 0.99 shutdown regression, introduce Clearing and Deleted states
2006-09-14 Paul Jakma <paul.jakma@sun.com>
* (general) Fix some niggly issues around 'shutdown' and clearing
by adding a Clearing FSM wait-state and a hidden 'Deleted'
FSM state, to allow deleted peers to 'cool off' and hit 0
references. This introduces a slow memory leak of struct peer,
however that's more a testament to the fragility of the
reference counting than a bug in this patch, cleanup of
reference counting to fix this is to follow.
* bgpd.h: Add Clearing, Deleted states and Clearing_Completed
and event.
* bgp_debug.c: (bgp_status_msg[]) Add strings for Clearing and
Deleted.
* bgp_fsm.h: Don't allow timer/event threads to set anything
for Deleted peers.
* bgp_fsm.c: (bgp_timer_set) Add Clearing and Deleted. Deleted
needs to stop everything.
(bgp_stop) Remove explicit fsm_change_status call, the
general framework handles the transition.
(bgp_start) Log a warning if a start is attempted on a peer
that should stay down, trying to start a peer.
(struct .. FSM) Add Clearing_Completed
events, has little influence except when in state
Clearing to signal wait-state can end.
Add Clearing and Deleted states, former is a wait-state,
latter is a placeholder state to allow peers to disappear
quietly once refcounts settle.
(bgp_event) Try reduce verbosity of FSM state-change debug,
changes to same state are not interesting (Established->Established)
Allow NULL action functions in FSM.
* bgp_packet.c: (bgp_write) Use FSM events, rather than trying
to twiddle directly with FSM state behind the back of FSM.
(bgp_write_notify) ditto.
(bgp_read) Remove the vague ACCEPT_PEER peer_unlock, or else
this patch crashes, now it leaks instead.
* bgp_route.c: (bgp_clear_node_complete) Clearing_Completed
event, to end clearing.
(bgp_clear_route) See extensive comments.
* bgpd.c: (peer_free) should only be called while in Deleted,
peer refcounting controls when peer_free is called.
bgp_sync_delete should be here, not in peer_delete.
(peer_delete) Initiate delete.
Transition to Deleted state manually.
When removing peer from indices that provide visibility of it,
take great care to be idempotent wrt the reference counting
of struct peer through those indices.
Use bgp_timer_set, rather than replicating.
Call to bgp_sync_delete isn't appropriate here, sync can be
referenced while shutting down and finishing deletion.
(peer_group_bind) Take care to be idempotent wrt list references
indexing peers.
2006-09-14 04:58:49 +02:00
|
|
|
bgp_sync_delete (peer);
|
2015-05-20 02:40:40 +02:00
|
|
|
|
|
|
|
if (peer->conf_if)
|
|
|
|
XFREE (MTYPE_PEER_CONF_IF, peer->conf_if);
|
|
|
|
|
2005-06-01 Paul Jakma <paul.jakma@sun.com>
* 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
2005-06-01 13:17:05 +02:00
|
|
|
memset (peer, 0, sizeof (struct peer));
|
|
|
|
|
|
|
|
XFREE (MTYPE_BGP_PEER, peer);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* increase reference count on a struct peer */
|
|
|
|
struct peer *
|
|
|
|
peer_lock (struct peer *peer)
|
|
|
|
{
|
|
|
|
assert (peer && (peer->lock >= 0));
|
[bgpd] Fix 0.99 shutdown regression, introduce Clearing and Deleted states
2006-09-14 Paul Jakma <paul.jakma@sun.com>
* (general) Fix some niggly issues around 'shutdown' and clearing
by adding a Clearing FSM wait-state and a hidden 'Deleted'
FSM state, to allow deleted peers to 'cool off' and hit 0
references. This introduces a slow memory leak of struct peer,
however that's more a testament to the fragility of the
reference counting than a bug in this patch, cleanup of
reference counting to fix this is to follow.
* bgpd.h: Add Clearing, Deleted states and Clearing_Completed
and event.
* bgp_debug.c: (bgp_status_msg[]) Add strings for Clearing and
Deleted.
* bgp_fsm.h: Don't allow timer/event threads to set anything
for Deleted peers.
* bgp_fsm.c: (bgp_timer_set) Add Clearing and Deleted. Deleted
needs to stop everything.
(bgp_stop) Remove explicit fsm_change_status call, the
general framework handles the transition.
(bgp_start) Log a warning if a start is attempted on a peer
that should stay down, trying to start a peer.
(struct .. FSM) Add Clearing_Completed
events, has little influence except when in state
Clearing to signal wait-state can end.
Add Clearing and Deleted states, former is a wait-state,
latter is a placeholder state to allow peers to disappear
quietly once refcounts settle.
(bgp_event) Try reduce verbosity of FSM state-change debug,
changes to same state are not interesting (Established->Established)
Allow NULL action functions in FSM.
* bgp_packet.c: (bgp_write) Use FSM events, rather than trying
to twiddle directly with FSM state behind the back of FSM.
(bgp_write_notify) ditto.
(bgp_read) Remove the vague ACCEPT_PEER peer_unlock, or else
this patch crashes, now it leaks instead.
* bgp_route.c: (bgp_clear_node_complete) Clearing_Completed
event, to end clearing.
(bgp_clear_route) See extensive comments.
* bgpd.c: (peer_free) should only be called while in Deleted,
peer refcounting controls when peer_free is called.
bgp_sync_delete should be here, not in peer_delete.
(peer_delete) Initiate delete.
Transition to Deleted state manually.
When removing peer from indices that provide visibility of it,
take great care to be idempotent wrt the reference counting
of struct peer through those indices.
Use bgp_timer_set, rather than replicating.
Call to bgp_sync_delete isn't appropriate here, sync can be
referenced while shutting down and finishing deletion.
(peer_group_bind) Take care to be idempotent wrt list references
indexing peers.
2006-09-14 04:58:49 +02:00
|
|
|
|
2005-06-01 Paul Jakma <paul.jakma@sun.com>
* 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
2005-06-01 13:17:05 +02:00
|
|
|
peer->lock++;
|
|
|
|
|
|
|
|
return peer;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* decrease reference count on a struct peer
|
|
|
|
* struct peer is freed and NULL returned if last reference
|
|
|
|
*/
|
|
|
|
struct peer *
|
|
|
|
peer_unlock (struct peer *peer)
|
|
|
|
{
|
|
|
|
assert (peer && (peer->lock > 0));
|
|
|
|
|
|
|
|
peer->lock--;
|
|
|
|
|
|
|
|
if (peer->lock == 0)
|
|
|
|
{
|
|
|
|
#if 0
|
|
|
|
zlog_debug ("unlocked and freeing");
|
|
|
|
zlog_backtrace (LOG_DEBUG);
|
|
|
|
#endif
|
|
|
|
peer_free (peer);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
if (peer->lock == 1)
|
|
|
|
{
|
|
|
|
zlog_debug ("unlocked to 1");
|
|
|
|
zlog_backtrace (LOG_DEBUG);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
return peer;
|
|
|
|
}
|
2015-05-20 02:40:37 +02:00
|
|
|
|
2005-06-01 Paul Jakma <paul.jakma@sun.com>
* 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
2005-06-01 13:17:05 +02:00
|
|
|
/* Allocate new peer object, implicitely locked. */
|
2002-12-13 21:15:29 +01:00
|
|
|
static struct peer *
|
2006-10-22 21:13:07 +02:00
|
|
|
peer_new (struct bgp *bgp)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
afi_t afi;
|
|
|
|
safi_t safi;
|
|
|
|
struct peer *peer;
|
|
|
|
struct servent *sp;
|
2006-10-22 21:13:07 +02:00
|
|
|
|
|
|
|
/* bgp argument is absolutely required */
|
|
|
|
assert (bgp);
|
|
|
|
if (!bgp)
|
|
|
|
return NULL;
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* Allocate new peer. */
|
[bgpd] Fix 0.99 shutdown regression, introduce Clearing and Deleted states
2006-09-14 Paul Jakma <paul.jakma@sun.com>
* (general) Fix some niggly issues around 'shutdown' and clearing
by adding a Clearing FSM wait-state and a hidden 'Deleted'
FSM state, to allow deleted peers to 'cool off' and hit 0
references. This introduces a slow memory leak of struct peer,
however that's more a testament to the fragility of the
reference counting than a bug in this patch, cleanup of
reference counting to fix this is to follow.
* bgpd.h: Add Clearing, Deleted states and Clearing_Completed
and event.
* bgp_debug.c: (bgp_status_msg[]) Add strings for Clearing and
Deleted.
* bgp_fsm.h: Don't allow timer/event threads to set anything
for Deleted peers.
* bgp_fsm.c: (bgp_timer_set) Add Clearing and Deleted. Deleted
needs to stop everything.
(bgp_stop) Remove explicit fsm_change_status call, the
general framework handles the transition.
(bgp_start) Log a warning if a start is attempted on a peer
that should stay down, trying to start a peer.
(struct .. FSM) Add Clearing_Completed
events, has little influence except when in state
Clearing to signal wait-state can end.
Add Clearing and Deleted states, former is a wait-state,
latter is a placeholder state to allow peers to disappear
quietly once refcounts settle.
(bgp_event) Try reduce verbosity of FSM state-change debug,
changes to same state are not interesting (Established->Established)
Allow NULL action functions in FSM.
* bgp_packet.c: (bgp_write) Use FSM events, rather than trying
to twiddle directly with FSM state behind the back of FSM.
(bgp_write_notify) ditto.
(bgp_read) Remove the vague ACCEPT_PEER peer_unlock, or else
this patch crashes, now it leaks instead.
* bgp_route.c: (bgp_clear_node_complete) Clearing_Completed
event, to end clearing.
(bgp_clear_route) See extensive comments.
* bgpd.c: (peer_free) should only be called while in Deleted,
peer refcounting controls when peer_free is called.
bgp_sync_delete should be here, not in peer_delete.
(peer_delete) Initiate delete.
Transition to Deleted state manually.
When removing peer from indices that provide visibility of it,
take great care to be idempotent wrt the reference counting
of struct peer through those indices.
Use bgp_timer_set, rather than replicating.
Call to bgp_sync_delete isn't appropriate here, sync can be
referenced while shutting down and finishing deletion.
(peer_group_bind) Take care to be idempotent wrt list references
indexing peers.
2006-09-14 04:58:49 +02:00
|
|
|
peer = XCALLOC (MTYPE_BGP_PEER, sizeof (struct peer));
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
/* Set default value. */
|
2004-05-01 10:44:08 +02:00
|
|
|
peer->fd = -1;
|
2002-12-13 21:15:29 +01:00
|
|
|
peer->v_start = BGP_INIT_START_TIMER;
|
|
|
|
peer->v_connect = BGP_DEFAULT_CONNECT_RETRY;
|
|
|
|
peer->v_asorig = BGP_DEFAULT_ASORIGINATE;
|
|
|
|
peer->status = Idle;
|
|
|
|
peer->ostatus = Idle;
|
2015-05-20 03:04:12 +02:00
|
|
|
peer->cur_event = peer->last_event = peer->last_major_event = 0;
|
2006-10-22 21:13:07 +02:00
|
|
|
peer->bgp = bgp;
|
[bgpd] Fix 0.99 shutdown regression, introduce Clearing and Deleted states
2006-09-14 Paul Jakma <paul.jakma@sun.com>
* (general) Fix some niggly issues around 'shutdown' and clearing
by adding a Clearing FSM wait-state and a hidden 'Deleted'
FSM state, to allow deleted peers to 'cool off' and hit 0
references. This introduces a slow memory leak of struct peer,
however that's more a testament to the fragility of the
reference counting than a bug in this patch, cleanup of
reference counting to fix this is to follow.
* bgpd.h: Add Clearing, Deleted states and Clearing_Completed
and event.
* bgp_debug.c: (bgp_status_msg[]) Add strings for Clearing and
Deleted.
* bgp_fsm.h: Don't allow timer/event threads to set anything
for Deleted peers.
* bgp_fsm.c: (bgp_timer_set) Add Clearing and Deleted. Deleted
needs to stop everything.
(bgp_stop) Remove explicit fsm_change_status call, the
general framework handles the transition.
(bgp_start) Log a warning if a start is attempted on a peer
that should stay down, trying to start a peer.
(struct .. FSM) Add Clearing_Completed
events, has little influence except when in state
Clearing to signal wait-state can end.
Add Clearing and Deleted states, former is a wait-state,
latter is a placeholder state to allow peers to disappear
quietly once refcounts settle.
(bgp_event) Try reduce verbosity of FSM state-change debug,
changes to same state are not interesting (Established->Established)
Allow NULL action functions in FSM.
* bgp_packet.c: (bgp_write) Use FSM events, rather than trying
to twiddle directly with FSM state behind the back of FSM.
(bgp_write_notify) ditto.
(bgp_read) Remove the vague ACCEPT_PEER peer_unlock, or else
this patch crashes, now it leaks instead.
* bgp_route.c: (bgp_clear_node_complete) Clearing_Completed
event, to end clearing.
(bgp_clear_route) See extensive comments.
* bgpd.c: (peer_free) should only be called while in Deleted,
peer refcounting controls when peer_free is called.
bgp_sync_delete should be here, not in peer_delete.
(peer_delete) Initiate delete.
Transition to Deleted state manually.
When removing peer from indices that provide visibility of it,
take great care to be idempotent wrt the reference counting
of struct peer through those indices.
Use bgp_timer_set, rather than replicating.
Call to bgp_sync_delete isn't appropriate here, sync can be
referenced while shutting down and finishing deletion.
(peer_group_bind) Take care to be idempotent wrt list references
indexing peers.
2006-09-14 04:58:49 +02:00
|
|
|
peer = peer_lock (peer); /* initial reference */
|
2009-05-21 17:51:03 +02:00
|
|
|
bgp_lock (bgp);
|
2015-05-20 02:40:37 +02:00
|
|
|
peer->weight = 0;
|
|
|
|
peer->password = NULL;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
/* Set default flags. */
|
|
|
|
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
|
|
|
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
|
|
|
|
{
|
|
|
|
if (! bgp_option_check (BGP_OPT_CONFIG_CISCO))
|
|
|
|
{
|
|
|
|
SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SEND_COMMUNITY);
|
|
|
|
SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SEND_EXT_COMMUNITY);
|
|
|
|
}
|
|
|
|
peer->orf_plist[afi][safi] = NULL;
|
|
|
|
}
|
|
|
|
SET_FLAG (peer->sflags, PEER_STATUS_CAPABILITY_OPEN);
|
|
|
|
|
|
|
|
/* Create buffers. */
|
|
|
|
peer->ibuf = stream_new (BGP_MAX_PACKET_SIZE);
|
|
|
|
peer->obuf = stream_fifo_new ();
|
2015-05-20 02:58:10 +02:00
|
|
|
|
|
|
|
/* We use a larger buffer for peer->work in the event that:
|
|
|
|
* - We RX a BGP_UPDATE where the attributes alone are just
|
|
|
|
* under BGP_MAX_PACKET_SIZE
|
|
|
|
* - The user configures an outbound route-map that does many as-path
|
|
|
|
* prepends or adds many communities. At most they can have CMD_ARGC_MAX
|
|
|
|
* args in a route-map so there is a finite limit on how large they can
|
|
|
|
* make the attributes.
|
|
|
|
*
|
|
|
|
* Having a buffer with BGP_MAX_PACKET_SIZE_OVERFLOW allows us to avoid bounds
|
|
|
|
* checking for every single attribute as we construct an UPDATE.
|
|
|
|
*/
|
|
|
|
peer->work = stream_new (BGP_MAX_PACKET_SIZE + BGP_MAX_PACKET_SIZE_OVERFLOW);
|
2014-01-15 07:57:57 +01:00
|
|
|
peer->scratch = stream_new (BGP_MAX_PACKET_SIZE);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2015-05-20 02:40:37 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
bgp_sync_init (peer);
|
|
|
|
|
|
|
|
/* Get service port number. */
|
|
|
|
sp = getservbyname ("bgp", "tcp");
|
|
|
|
peer->port = (sp == NULL) ? BGP_PORT_DEFAULT : ntohs (sp->s_port);
|
|
|
|
|
|
|
|
return peer;
|
|
|
|
}
|
|
|
|
|
2015-05-20 02:40:37 +02:00
|
|
|
/*
|
|
|
|
* This function is invoked when a duplicate peer structure associated with
|
|
|
|
* a neighbor is being deleted. If this about-to-be-deleted structure is
|
|
|
|
* the one with all the config, then we have to copy over the info.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
peer_xfer_config (struct peer *peer_dst, struct peer *peer_src)
|
|
|
|
{
|
2015-05-20 03:03:47 +02:00
|
|
|
struct peer_af *paf;
|
2015-05-20 02:40:37 +02:00
|
|
|
afi_t afi;
|
|
|
|
safi_t safi;
|
2015-05-20 03:03:47 +02:00
|
|
|
int afindex;
|
2015-05-20 02:40:37 +02:00
|
|
|
|
|
|
|
assert(peer_src);
|
|
|
|
assert(peer_dst);
|
|
|
|
|
|
|
|
/* The following function is used by both peer group config copy to
|
|
|
|
* individual peer and when we transfer config
|
|
|
|
*/
|
|
|
|
if (peer_src->change_local_as)
|
|
|
|
peer_dst->change_local_as = peer_src->change_local_as;
|
|
|
|
|
|
|
|
/* peer flags apply */
|
|
|
|
peer_dst->flags = peer_src->flags;
|
|
|
|
peer_dst->cap = peer_src->cap;
|
|
|
|
peer_dst->config = peer_src->config;
|
|
|
|
|
|
|
|
peer_dst->local_as = peer_src->local_as;
|
|
|
|
peer_dst->ifindex = peer_src->ifindex;
|
|
|
|
peer_dst->port = peer_src->port;
|
|
|
|
peer_sort(peer_dst);
|
|
|
|
peer_dst->rmap_type = peer_src->rmap_type;
|
|
|
|
|
|
|
|
/* Timers */
|
|
|
|
peer_dst->holdtime = peer_src->holdtime;
|
|
|
|
peer_dst->keepalive = peer_src->keepalive;
|
|
|
|
peer_dst->connect = peer_src->connect;
|
|
|
|
peer_dst->v_holdtime = peer_src->v_holdtime;
|
|
|
|
peer_dst->v_keepalive = peer_src->v_keepalive;
|
|
|
|
peer_dst->v_asorig = peer_src->v_asorig;
|
|
|
|
peer_dst->routeadv = peer_src->routeadv;
|
|
|
|
peer_dst->v_routeadv = peer_src->v_routeadv;
|
|
|
|
|
|
|
|
/* password apply */
|
|
|
|
if (peer_src->password && !peer_dst->password)
|
|
|
|
peer_dst->password = XSTRDUP (MTYPE_PEER_PASSWORD, peer_src->password);
|
|
|
|
|
|
|
|
bgp_md5_set (peer_dst);
|
|
|
|
|
|
|
|
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
|
|
|
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
|
|
|
|
{
|
|
|
|
peer_dst->afc[afi][safi] = peer_src->afc[afi][safi];
|
|
|
|
peer_dst->af_flags[afi][safi] = peer_src->af_flags[afi][safi];
|
|
|
|
peer_dst->allowas_in[afi][safi] = peer_src->allowas_in[afi][safi];
|
|
|
|
}
|
|
|
|
|
2015-05-20 03:03:47 +02:00
|
|
|
PEERAF_FOREACH(peer_src, paf, afindex)
|
|
|
|
peer_af_create(peer_dst, paf->afi, paf->safi);
|
|
|
|
|
2015-05-20 02:40:37 +02:00
|
|
|
/* update-source apply */
|
|
|
|
if (peer_src->update_source)
|
|
|
|
{
|
|
|
|
if (peer_dst->update_source)
|
|
|
|
sockunion_free (peer_dst->update_source);
|
|
|
|
if (peer_dst->update_if)
|
|
|
|
{
|
|
|
|
XFREE (MTYPE_PEER_UPDATE_SOURCE, peer_dst->update_if);
|
|
|
|
peer_dst->update_if = NULL;
|
|
|
|
}
|
|
|
|
peer_dst->update_source = sockunion_dup (peer_src->update_source);
|
|
|
|
}
|
|
|
|
else if (peer_src->update_if)
|
|
|
|
{
|
|
|
|
if (peer_dst->update_if)
|
|
|
|
XFREE (MTYPE_PEER_UPDATE_SOURCE, peer_dst->update_if);
|
|
|
|
if (peer_dst->update_source)
|
|
|
|
{
|
|
|
|
sockunion_free (peer_dst->update_source);
|
|
|
|
peer_dst->update_source = NULL;
|
|
|
|
}
|
|
|
|
peer_dst->update_if = XSTRDUP (MTYPE_PEER_UPDATE_SOURCE, peer_src->update_if);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (peer_src->ifname)
|
|
|
|
{
|
|
|
|
if (peer_dst->ifname)
|
|
|
|
free(peer_dst->ifname);
|
|
|
|
|
|
|
|
peer_dst->ifname = strdup(peer_src->ifname);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-05-20 02:40:40 +02:00
|
|
|
/*
|
|
|
|
* Set or reset the peer address socketunion structure based on the
|
|
|
|
* learnt peer address. Currently via the source address of the
|
|
|
|
* ipv6 ND router-advertisement.
|
|
|
|
*/
|
|
|
|
void
|
|
|
|
bgp_peer_conf_if_to_su_update (struct peer *peer)
|
|
|
|
{
|
|
|
|
struct interface *ifp;
|
|
|
|
struct nbr_connected *ifc;
|
|
|
|
|
|
|
|
if (!peer->conf_if)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if ((ifp = if_lookup_by_name(peer->conf_if)) &&
|
|
|
|
ifp->nbr_connected &&
|
|
|
|
(ifc = listnode_head(ifp->nbr_connected)))
|
|
|
|
{
|
|
|
|
peer->su.sa.sa_family = AF_INET6;
|
|
|
|
memcpy(&peer->su.sin6.sin6_addr, &ifc->address->u.prefix,
|
|
|
|
sizeof (struct in6_addr));
|
|
|
|
#ifdef SIN6_LEN
|
|
|
|
peer->su.sin6.sin6_len = sizeof (struct sockaddr_in6);
|
|
|
|
#endif
|
2015-05-20 03:04:08 +02:00
|
|
|
peer->su.sin6.sin6_scope_id = ifp->ifindex;
|
2015-05-20 02:40:40 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* This works as an indication of unresolved peer address
|
|
|
|
on a BGP interface*/
|
|
|
|
peer->su.sa.sa_family = AF_UNSPEC;
|
|
|
|
memset(&peer->su.sin6.sin6_addr, 0, sizeof (struct in6_addr));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* Create new BGP peer. */
|
2015-05-20 02:40:37 +02:00
|
|
|
struct peer *
|
2015-05-20 02:40:40 +02:00
|
|
|
peer_create (union sockunion *su, const char *conf_if, struct bgp *bgp,
|
2015-05-20 03:04:25 +02:00
|
|
|
as_t local_as, as_t remote_as, int as_type, afi_t afi, safi_t safi)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
int active;
|
|
|
|
struct peer *peer;
|
|
|
|
char buf[SU_ADDRSTRLEN];
|
|
|
|
|
2006-10-22 21:13:07 +02:00
|
|
|
peer = peer_new (bgp);
|
2015-05-20 02:40:40 +02:00
|
|
|
if (conf_if)
|
|
|
|
{
|
|
|
|
peer->conf_if = XSTRDUP (MTYPE_PEER_CONF_IF, conf_if);
|
|
|
|
bgp_peer_conf_if_to_su_update(peer);
|
|
|
|
peer->host = XSTRDUP (MTYPE_BGP_PEER_HOST, conf_if);
|
|
|
|
}
|
|
|
|
else if (su)
|
|
|
|
{
|
|
|
|
peer->su = *su;
|
|
|
|
sockunion2str (su, buf, SU_ADDRSTRLEN);
|
|
|
|
peer->host = XSTRDUP (MTYPE_BGP_PEER_HOST, buf);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
peer->local_as = local_as;
|
|
|
|
peer->as = remote_as;
|
2015-05-20 03:04:25 +02:00
|
|
|
peer->as_type = as_type;
|
2002-12-13 21:15:29 +01:00
|
|
|
peer->local_id = bgp->router_id;
|
|
|
|
peer->v_holdtime = bgp->default_holdtime;
|
|
|
|
peer->v_keepalive = bgp->default_keepalive;
|
|
|
|
if (peer_sort (peer) == BGP_PEER_IBGP)
|
|
|
|
peer->v_routeadv = BGP_DEFAULT_IBGP_ROUTEADV;
|
|
|
|
else
|
|
|
|
peer->v_routeadv = BGP_DEFAULT_EBGP_ROUTEADV;
|
2005-06-01 Paul Jakma <paul.jakma@sun.com>
* 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
2005-06-01 13:17:05 +02:00
|
|
|
|
|
|
|
peer = peer_lock (peer); /* bgp peer list reference */
|
2002-12-13 21:15:29 +01:00
|
|
|
listnode_add_sort (bgp->peer, peer);
|
|
|
|
|
|
|
|
active = peer_active (peer);
|
|
|
|
|
2010-01-15 14:22:10 +01:00
|
|
|
/* Last read and reset time set */
|
|
|
|
peer->readtime = peer->resettime = bgp_clock ();
|
2003-08-13 02:32:49 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* Default TTL set. */
|
2012-05-07 18:52:54 +02:00
|
|
|
peer->ttl = (peer->sort == BGP_PEER_IBGP) ? 255 : 1;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2015-05-20 02:40:37 +02:00
|
|
|
SET_FLAG (peer->flags, PEER_FLAG_CONFIG_NODE);
|
|
|
|
|
2015-05-20 03:03:47 +02:00
|
|
|
if (afi && safi)
|
|
|
|
{
|
|
|
|
peer->afc[afi][safi] = 1;
|
|
|
|
if (peer_af_create(peer, afi, safi) == NULL)
|
|
|
|
{
|
|
|
|
zlog_err("couldn't create af structure for peer %s", peer->host);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* Set up peer's events and timers. */
|
|
|
|
if (! active && peer_active (peer))
|
|
|
|
bgp_timer_set (peer);
|
|
|
|
|
|
|
|
return peer;
|
|
|
|
}
|
|
|
|
|
2015-05-20 02:40:40 +02:00
|
|
|
struct peer *
|
|
|
|
peer_conf_interface_get(struct bgp *bgp, const char *conf_if, afi_t afi,
|
|
|
|
safi_t safi)
|
|
|
|
{
|
|
|
|
struct peer *peer;
|
|
|
|
|
|
|
|
peer = peer_lookup_by_conf_if (bgp, conf_if);
|
|
|
|
if (!peer)
|
|
|
|
{
|
|
|
|
if (bgp_flag_check (bgp, BGP_FLAG_NO_DEFAULT_IPV4)
|
|
|
|
&& afi == AFI_IP && safi == SAFI_UNICAST)
|
2015-05-20 03:04:25 +02:00
|
|
|
peer = peer_create (NULL, conf_if, bgp, bgp->as, AS_SPECIFIED, 0, 0, 0);
|
2015-05-20 02:40:40 +02:00
|
|
|
else
|
2015-05-20 03:04:25 +02:00
|
|
|
peer = peer_create (NULL, conf_if, bgp, bgp->as, AS_SPECIFIED, 0, afi, safi);
|
2015-05-20 02:40:40 +02:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return peer;
|
|
|
|
}
|
|
|
|
|
2004-05-01 10:44:08 +02:00
|
|
|
/* Make accept BGP peer. Called from bgp_accept (). */
|
|
|
|
struct peer *
|
|
|
|
peer_create_accept (struct bgp *bgp)
|
|
|
|
{
|
|
|
|
struct peer *peer;
|
|
|
|
|
2006-10-22 21:13:07 +02:00
|
|
|
peer = peer_new (bgp);
|
2015-05-20 02:40:37 +02:00
|
|
|
|
2005-06-01 Paul Jakma <paul.jakma@sun.com>
* 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
2005-06-01 13:17:05 +02:00
|
|
|
peer = peer_lock (peer); /* bgp peer list reference */
|
2004-05-01 10:44:08 +02:00
|
|
|
listnode_add_sort (bgp->peer, peer);
|
|
|
|
|
|
|
|
return peer;
|
|
|
|
}
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* Change peer's AS number. */
|
2015-05-20 02:40:40 +02:00
|
|
|
void
|
2015-05-20 03:04:25 +02:00
|
|
|
peer_as_change (struct peer *peer, as_t as, int as_specified)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
2012-05-07 18:52:54 +02:00
|
|
|
bgp_peer_sort_t type;
|
2015-05-20 02:40:35 +02:00
|
|
|
struct peer *conf;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
/* Stop peer. */
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
|
|
|
{
|
2013-10-02 12:40:20 +02:00
|
|
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
|
2004-05-20 11:19:34 +02:00
|
|
|
{
|
|
|
|
peer->last_reset = PEER_DOWN_REMOTE_AS_CHANGE;
|
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE,
|
|
|
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
else
|
2015-05-20 02:40:37 +02:00
|
|
|
bgp_session_reset(peer);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
type = peer_sort (peer);
|
|
|
|
peer->as = as;
|
2015-05-20 03:04:25 +02:00
|
|
|
peer->as_type = as_specified;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2003-08-13 02:32:49 +02:00
|
|
|
if (bgp_config_check (peer->bgp, BGP_CONFIG_CONFEDERATION)
|
|
|
|
&& ! bgp_confederation_peers_check (peer->bgp, as)
|
|
|
|
&& peer->bgp->as != as)
|
|
|
|
peer->local_as = peer->bgp->confed_id;
|
|
|
|
else
|
|
|
|
peer->local_as = peer->bgp->as;
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* Advertisement-interval reset */
|
2015-05-20 02:40:35 +02:00
|
|
|
conf = NULL;
|
|
|
|
if (peer->group)
|
|
|
|
conf = peer->group->conf;
|
|
|
|
|
|
|
|
if (conf && CHECK_FLAG (conf->config, PEER_CONFIG_ROUTEADV))
|
2015-05-20 03:12:17 +02:00
|
|
|
{
|
2015-05-20 02:40:35 +02:00
|
|
|
peer->v_routeadv = conf->routeadv;
|
2015-05-20 03:12:17 +02:00
|
|
|
}
|
2015-05-20 03:03:52 +02:00
|
|
|
/* Only go back to the default advertisement-interval if the user had not
|
|
|
|
* already configured it */
|
|
|
|
else if (!CHECK_FLAG (peer->config, PEER_CONFIG_ROUTEADV))
|
2015-05-20 03:12:17 +02:00
|
|
|
{
|
|
|
|
if (peer_sort (peer) == BGP_PEER_IBGP)
|
|
|
|
peer->v_routeadv = BGP_DEFAULT_IBGP_ROUTEADV;
|
|
|
|
else
|
|
|
|
peer->v_routeadv = BGP_DEFAULT_EBGP_ROUTEADV;
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
/* TTL reset */
|
|
|
|
if (peer_sort (peer) == BGP_PEER_IBGP)
|
|
|
|
peer->ttl = 255;
|
|
|
|
else if (type == BGP_PEER_IBGP)
|
|
|
|
peer->ttl = 1;
|
|
|
|
|
|
|
|
/* reflector-client reset */
|
|
|
|
if (peer_sort (peer) != BGP_PEER_IBGP)
|
|
|
|
{
|
|
|
|
UNSET_FLAG (peer->af_flags[AFI_IP][SAFI_UNICAST],
|
|
|
|
PEER_FLAG_REFLECTOR_CLIENT);
|
|
|
|
UNSET_FLAG (peer->af_flags[AFI_IP][SAFI_MULTICAST],
|
|
|
|
PEER_FLAG_REFLECTOR_CLIENT);
|
|
|
|
UNSET_FLAG (peer->af_flags[AFI_IP][SAFI_MPLS_VPN],
|
|
|
|
PEER_FLAG_REFLECTOR_CLIENT);
|
|
|
|
UNSET_FLAG (peer->af_flags[AFI_IP6][SAFI_UNICAST],
|
|
|
|
PEER_FLAG_REFLECTOR_CLIENT);
|
|
|
|
UNSET_FLAG (peer->af_flags[AFI_IP6][SAFI_MULTICAST],
|
|
|
|
PEER_FLAG_REFLECTOR_CLIENT);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* local-as reset */
|
|
|
|
if (peer_sort (peer) != BGP_PEER_EBGP)
|
|
|
|
{
|
|
|
|
peer->change_local_as = 0;
|
|
|
|
UNSET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND);
|
bgpd: add replace-as modifier for BGP neighbor
Added replace-as modifier for BGP neighbors when using
local-as. If the replace-as modifier is specified, only the
replacement AS as specified by the local-as modifier is
prepended to the AS_PATH, not the process's AS.
In bgp_attr.c, I decided that
if (peer->change_local_as) {
/* If replace-as is specified, we only use the change_local_as when
advertising routes. */
if( ! CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS) ) {
aspath = aspath_add_seq (aspath, peer->local_as);
}
aspath = aspath_add_seq (aspath, peer->change_local_as);
} else {
aspath = aspath_add_seq (aspath, peer->local_as);
}
was clearer than the alternative that didn't duplicate the prepending of the
process's AS:
/* First, append the process local AS unless we have an alternate local_as
* and we're replacing it (as opposed to just prepending it). */
if (! (peer->change_local_as
&& CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS) ) ) {
aspath = aspath_add_seq (aspath, peer->local_as);
}
if (peer->change_local_as)
aspath = aspath_add_seq (aspath, peer->change_local_as);
}
But I could be convinced otherwise.
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
2012-11-08 00:50:07 +01:00
|
|
|
UNSET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* If peer does not exist, create new one. If peer already exists,
|
|
|
|
set AS number to the peer. */
|
|
|
|
int
|
2015-05-20 03:04:25 +02:00
|
|
|
peer_remote_as (struct bgp *bgp, union sockunion *su, const char *conf_if,
|
|
|
|
as_t *as, int as_type, afi_t afi, safi_t safi)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
struct peer *peer;
|
|
|
|
as_t local_as;
|
|
|
|
|
2015-05-20 02:40:40 +02:00
|
|
|
if (conf_if)
|
|
|
|
peer = peer_lookup_by_conf_if (bgp, conf_if);
|
|
|
|
else
|
|
|
|
peer = peer_lookup (bgp, su);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
if (peer)
|
|
|
|
{
|
2015-05-20 03:03:47 +02:00
|
|
|
/* Not allowed for a dynamic peer. */
|
|
|
|
if (peer_dynamic_neighbor (peer))
|
|
|
|
{
|
|
|
|
*as = peer->as;
|
|
|
|
return BGP_ERR_INVALID_FOR_DYNAMIC_PEER;
|
|
|
|
}
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* When this peer is a member of peer-group. */
|
|
|
|
if (peer->group)
|
|
|
|
{
|
|
|
|
if (peer->group->conf->as)
|
|
|
|
{
|
|
|
|
/* Return peer group's AS number. */
|
|
|
|
*as = peer->group->conf->as;
|
|
|
|
return BGP_ERR_PEER_GROUP_MEMBER;
|
|
|
|
}
|
|
|
|
if (peer_sort (peer->group->conf) == BGP_PEER_IBGP)
|
|
|
|
{
|
2015-05-20 03:04:25 +02:00
|
|
|
if ((as_type != AS_INTERNAL) && (bgp->as != *as))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
*as = peer->as;
|
|
|
|
return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2015-05-20 03:04:25 +02:00
|
|
|
if ((as_type != AS_EXTERNAL) && (bgp->as == *as))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
*as = peer->as;
|
|
|
|
return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Existing peer's AS number change. */
|
|
|
|
if (peer->as != *as)
|
2015-05-20 03:04:25 +02:00
|
|
|
peer_as_change (peer, *as, as_type);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2015-05-20 02:40:40 +02:00
|
|
|
if (conf_if)
|
|
|
|
return BGP_ERR_NO_INTERFACE_CONFIG;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
/* If the peer is not part of our confederation, and its not an
|
|
|
|
iBGP peer then spoof the source AS */
|
|
|
|
if (bgp_config_check (bgp, BGP_CONFIG_CONFEDERATION)
|
|
|
|
&& ! bgp_confederation_peers_check (bgp, *as)
|
|
|
|
&& bgp->as != *as)
|
|
|
|
local_as = bgp->confed_id;
|
|
|
|
else
|
|
|
|
local_as = bgp->as;
|
|
|
|
|
|
|
|
/* If this is IPv4 unicast configuration and "no bgp default
|
|
|
|
ipv4-unicast" is specified. */
|
|
|
|
|
|
|
|
if (bgp_flag_check (bgp, BGP_FLAG_NO_DEFAULT_IPV4)
|
|
|
|
&& afi == AFI_IP && safi == SAFI_UNICAST)
|
2015-05-20 03:04:25 +02:00
|
|
|
peer = peer_create (su, conf_if, bgp, local_as, *as, as_type, 0, 0);
|
2002-12-13 21:15:29 +01:00
|
|
|
else
|
2015-05-20 03:04:25 +02:00
|
|
|
peer = peer_create (su, conf_if, bgp, local_as, *as, as_type, afi, safi);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Activate the peer or peer group for specified AFI and SAFI. */
|
|
|
|
int
|
|
|
|
peer_activate (struct peer *peer, afi_t afi, safi_t safi)
|
|
|
|
{
|
|
|
|
int active;
|
|
|
|
|
|
|
|
if (peer->afc[afi][safi])
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
/* Activate the address family configuration. */
|
|
|
|
if (CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
|
|
|
peer->afc[afi][safi] = 1;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
active = peer_active (peer);
|
|
|
|
|
|
|
|
peer->afc[afi][safi] = 1;
|
|
|
|
|
2015-05-20 03:03:47 +02:00
|
|
|
if (peer_af_create(peer, afi, safi) == NULL)
|
|
|
|
{
|
|
|
|
zlog_err("couldn't create af structure for peer %s", peer->host);
|
|
|
|
}
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
if (! active && peer_active (peer))
|
|
|
|
bgp_timer_set (peer);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (peer->status == Established)
|
|
|
|
{
|
|
|
|
if (CHECK_FLAG (peer->cap, PEER_CAP_DYNAMIC_RCV))
|
|
|
|
{
|
|
|
|
peer->afc_adv[afi][safi] = 1;
|
|
|
|
bgp_capability_send (peer, afi, safi,
|
|
|
|
CAPABILITY_CODE_MP,
|
|
|
|
CAPABILITY_ACTION_SET);
|
|
|
|
if (peer->afc_recv[afi][safi])
|
|
|
|
{
|
|
|
|
peer->afc_nego[afi][safi] = 1;
|
|
|
|
bgp_announce_route (peer, afi, safi);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
2004-05-20 11:19:34 +02:00
|
|
|
{
|
|
|
|
peer->last_reset = PEER_DOWN_AF_ACTIVATE;
|
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE,
|
|
|
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
peer_deactivate (struct peer *peer, afi_t afi, safi_t safi)
|
|
|
|
{
|
|
|
|
struct peer_group *group;
|
|
|
|
struct peer *peer1;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
if (CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
|
|
|
{
|
|
|
|
group = peer->group;
|
|
|
|
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer1))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
if (peer1->af_group[afi][safi])
|
|
|
|
return BGP_ERR_PEER_GROUP_MEMBER_EXISTS;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (peer->af_group[afi][safi])
|
|
|
|
return BGP_ERR_PEER_BELONGS_TO_GROUP;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (! peer->afc[afi][safi])
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
/* De-activate the address family configuration. */
|
|
|
|
peer->afc[afi][safi] = 0;
|
|
|
|
peer_af_flag_reset (peer, afi, safi);
|
2015-05-20 03:03:47 +02:00
|
|
|
if (peer_af_delete(peer, afi, safi) != 0)
|
|
|
|
{
|
|
|
|
zlog_err("couldn't delete af structure for peer %s", peer->host);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
|
|
|
{
|
|
|
|
if (peer->status == Established)
|
|
|
|
{
|
|
|
|
if (CHECK_FLAG (peer->cap, PEER_CAP_DYNAMIC_RCV))
|
|
|
|
{
|
|
|
|
peer->afc_adv[afi][safi] = 0;
|
|
|
|
peer->afc_nego[afi][safi] = 0;
|
|
|
|
|
|
|
|
if (peer_active_nego (peer))
|
|
|
|
{
|
|
|
|
bgp_capability_send (peer, afi, safi,
|
|
|
|
CAPABILITY_CODE_MP,
|
|
|
|
CAPABILITY_ACTION_UNSET);
|
[bgpd] Stability fixes including bugs 397, 492
I've spent the last several weeks working on stability fixes to bgpd.
These patches fix all of the numerous crashes, assertion failures, memory
leaks and memory stomping I could find. Valgrind was used extensively.
Added new function bgp_exit() to help catch problems. If "debug bgp" is
configured and bgpd exits with status of 0, statistics on remaining
lib/memory.c allocations are printed to stderr. It is my hope that other
developers will use this to stay on top of memory issues.
Example questionable exit:
bgpd: memstats: Current memory utilization in module LIB:
bgpd: memstats: Link List : 6
bgpd: memstats: Link Node : 5
bgpd: memstats: Hash : 8
bgpd: memstats: Hash Bucket : 2
bgpd: memstats: Hash Index : 8
bgpd: memstats: Work queue : 3
bgpd: memstats: Work queue item : 2
bgpd: memstats: Work queue name string : 3
bgpd: memstats: Current memory utilization in module BGP:
bgpd: memstats: BGP instance : 1
bgpd: memstats: BGP peer : 1
bgpd: memstats: BGP peer hostname : 1
bgpd: memstats: BGP attribute : 1
bgpd: memstats: BGP extra attributes : 1
bgpd: memstats: BGP aspath : 1
bgpd: memstats: BGP aspath str : 1
bgpd: memstats: BGP table : 24
bgpd: memstats: BGP node : 1
bgpd: memstats: BGP route : 1
bgpd: memstats: BGP synchronise : 8
bgpd: memstats: BGP Process queue : 1
bgpd: memstats: BGP node clear queue : 1
bgpd: memstats: NOTE: If configuration exists, utilization may be expected.
Example clean exit:
bgpd: memstats: No remaining tracked memory utilization.
This patch fixes bug #397: "Invalid free in bgp_announce_check()".
This patch fixes bug #492: "SIGBUS in bgpd/bgp_route.c:
bgp_clear_route_node()".
My apologies for not separating out these changes into individual patches.
The complexity of doing so boggled what is left of my brain. I hope this
is all still useful to the community.
This code has been production tested, in non-route-server-client mode, on
a linux 32-bit box and a 64-bit box.
Release/reset functions, used by bgp_exit(), added to:
bgpd/bgp_attr.c,h
bgpd/bgp_community.c,h
bgpd/bgp_dump.c,h
bgpd/bgp_ecommunity.c,h
bgpd/bgp_filter.c,h
bgpd/bgp_nexthop.c,h
bgpd/bgp_route.c,h
lib/routemap.c,h
File by file analysis:
* bgpd/bgp_aspath.c: Prevent re-use of ashash after it is released.
* bgpd/bgp_attr.c: #if removed uncalled cluster_dup().
* bgpd/bgp_clist.c,h: Allow community_list_terminate() to be called from
bgp_exit().
* bgpd/bgp_filter.c: Fix aslist->name use without allocation check, and
also fix memory leak.
* bgpd/bgp_main.c: Created bgp_exit() exit routine. This function frees
allocations made as part of bgpd initialization and, to some extent,
configuration. If "debug bgp" is configured, memory stats are printed
as described above.
* bgpd/bgp_nexthop.c: zclient_new() already allocates stream for
ibuf/obuf, so bgp_scan_init() shouldn't do it too. Also, made it so
zlookup is global so bgp_exit() can use it.
* bgpd/bgp_packet.c: bgp_capability_msg_parse() call to bgp_clear_route()
adjusted to use new BGP_CLEAR_ROUTE_NORMAL flag.
* bgpd/bgp_route.h: Correct reference counter "lock" to be signed.
bgp_clear_route() now accepts a bgp_clear_route_type of either
BGP_CLEAR_ROUTE_NORMAL or BGP_CLEAR_ROUTE_MY_RSCLIENT.
* bgpd/bgp_route.c:
- bgp_process_rsclient(): attr was being zero'ed and then
bgp_attr_extra_free() was being called with it, even though it was
never filled with valid data.
- bgp_process_rsclient(): Make sure rsclient->group is not NULL before
use.
- bgp_processq_del(): Add call to bgp_table_unlock().
- bgp_process(): Add call to bgp_table_lock().
- bgp_update_rsclient(): memset clearing of new_attr not needed since
declarationw with "= { 0 }" does it. memset was already commented
out.
- bgp_update_rsclient(): Fix screwed up misleading indentation.
- bgp_withdraw_rsclient(): Fix screwed up misleading indentation.
- bgp_clear_route_node(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT.
- bgp_clear_node_queue_del(): Add call to bgp_table_unlock() and also
free struct bgp_clear_node_queue used for work item.
- bgp_clear_node_complete(): Do peer_unlock() after BGP_EVENT_ADD() in
case peer is released by peer_unlock() call.
- bgp_clear_route_table(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT. Use
struct bgp_clear_node_queue to supply data to worker. Add call to
bgp_table_lock().
- bgp_clear_route(): Add support for BGP_CLEAR_ROUTE_NORMAL or
BGP_CLEAR_ROUTE_MY_RSCLIENT.
- bgp_clear_route_all(): Use BGP_CLEAR_ROUTE_NORMAL.
Bug 397 fixes:
- bgp_default_originate()
- bgp_announce_table()
* bgpd/bgp_table.h:
- struct bgp_table: Added reference count. Changed type of owner to be
"struct peer *" rather than "void *".
- struct bgp_node: Correct reference counter "lock" to be signed.
* bgpd/bgp_table.c:
- Added bgp_table reference counting.
- bgp_table_free(): Fixed cleanup code. Call peer_unlock() on owner if
set.
- bgp_unlock_node(): Added assertion.
- bgp_node_get(): Added call to bgp_lock_node() to code path that it was
missing from.
* bgpd/bgp_vty.c:
- peer_rsclient_set_vty(): Call peer_lock() as part of peer assignment
to owner. Handle failure gracefully.
- peer_rsclient_unset_vty(): Add call to bgp_clear_route() with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
* bgpd/bgp_zebra.c: Made it so zclient is global so bgp_exit() can use it.
* bgpd/bgpd.c:
- peer_lock(): Allow to be called when status is "Deleted".
- peer_deactivate(): Supply BGP_CLEAR_ROUTE_NORMAL purpose to
bgp_clear_route() call.
- peer_delete(): Common variable listnode pn. Fix bug in which rsclient
was only dealt with if not part of a peer group. Call
bgp_clear_route() for rsclient, if appropriate, and do so with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
- peer_group_get(): Use XSTRDUP() instead of strdup() for conf->host.
- peer_group_bind(): Call bgp_clear_route() for rsclient, and do so with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
- bgp_create(): Use XSTRDUP() instead of strdup() for peer_self->host.
- bgp_delete(): Delete peers before groups, rather than after. And then
rather than deleting rsclients, verify that there are none at this
point.
- bgp_unlock(): Add assertion.
- bgp_free(): Call bgp_table_finish() rather than doing XFREE() itself.
* lib/command.c,h: Compiler warning fixes. Add cmd_terminate(). Fixed
massive leak in install_element() in which cmd_make_descvec() was being
called more than once for the same cmd->strvec/string/doc.
* lib/log.c: Make closezlog() check fp before calling fclose().
* lib/memory.c: Catch when alloc count goes negative by using signed
counts. Correct #endif comment. Add log_memstats_stderr().
* lib/memory.h: Add log_memstats_stderr().
* lib/thread.c: thread->funcname was being accessed in thread_call() after
it had been freed. Rearranged things so that thread_call() frees
funcname. Also made it so thread_master_free() cleans up cpu_record.
* lib/vty.c,h: Use global command_cr. Add vty_terminate().
* lib/zclient.c,h: Re-enable zclient_free().
2009-07-18 07:44:03 +02:00
|
|
|
bgp_clear_route (peer, afi, safi, BGP_CLEAR_ROUTE_NORMAL);
|
2002-12-13 21:15:29 +01:00
|
|
|
peer->pcount[afi][safi] = 0;
|
|
|
|
}
|
|
|
|
else
|
2004-05-20 11:19:34 +02:00
|
|
|
{
|
|
|
|
peer->last_reset = PEER_DOWN_NEIGHBOR_DELETE;
|
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE,
|
|
|
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
else
|
2004-05-20 11:19:34 +02:00
|
|
|
{
|
|
|
|
peer->last_reset = PEER_DOWN_NEIGHBOR_DELETE;
|
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE,
|
|
|
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2009-12-17 11:14:28 +01:00
|
|
|
static void
|
2005-02-02 15:40:33 +01:00
|
|
|
peer_nsf_stop (struct peer *peer)
|
|
|
|
{
|
|
|
|
afi_t afi;
|
|
|
|
safi_t safi;
|
|
|
|
|
|
|
|
UNSET_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT);
|
|
|
|
UNSET_FLAG (peer->sflags, PEER_STATUS_NSF_MODE);
|
|
|
|
|
|
|
|
for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
|
2011-07-17 17:33:21 +02:00
|
|
|
for (safi = SAFI_UNICAST ; safi < SAFI_RESERVED_3 ; safi++)
|
2005-02-02 15:40:33 +01:00
|
|
|
peer->nsf[afi][safi] = 0;
|
|
|
|
|
|
|
|
if (peer->t_gr_restart)
|
|
|
|
{
|
|
|
|
BGP_TIMER_OFF (peer->t_gr_restart);
|
2015-05-20 02:58:12 +02:00
|
|
|
if (bgp_debug_neighbor_events(peer))
|
2005-02-02 15:40:33 +01:00
|
|
|
zlog_debug ("%s graceful restart timer stopped", peer->host);
|
|
|
|
}
|
|
|
|
if (peer->t_gr_stale)
|
|
|
|
{
|
|
|
|
BGP_TIMER_OFF (peer->t_gr_stale);
|
2015-05-20 02:58:12 +02:00
|
|
|
if (bgp_debug_neighbor_events(peer))
|
2005-02-02 15:40:33 +01:00
|
|
|
zlog_debug ("%s graceful restart stalepath timer stopped", peer->host);
|
|
|
|
}
|
|
|
|
bgp_clear_route_all (peer);
|
|
|
|
}
|
|
|
|
|
[bgpd] Fix 0.99 shutdown regression, introduce Clearing and Deleted states
2006-09-14 Paul Jakma <paul.jakma@sun.com>
* (general) Fix some niggly issues around 'shutdown' and clearing
by adding a Clearing FSM wait-state and a hidden 'Deleted'
FSM state, to allow deleted peers to 'cool off' and hit 0
references. This introduces a slow memory leak of struct peer,
however that's more a testament to the fragility of the
reference counting than a bug in this patch, cleanup of
reference counting to fix this is to follow.
* bgpd.h: Add Clearing, Deleted states and Clearing_Completed
and event.
* bgp_debug.c: (bgp_status_msg[]) Add strings for Clearing and
Deleted.
* bgp_fsm.h: Don't allow timer/event threads to set anything
for Deleted peers.
* bgp_fsm.c: (bgp_timer_set) Add Clearing and Deleted. Deleted
needs to stop everything.
(bgp_stop) Remove explicit fsm_change_status call, the
general framework handles the transition.
(bgp_start) Log a warning if a start is attempted on a peer
that should stay down, trying to start a peer.
(struct .. FSM) Add Clearing_Completed
events, has little influence except when in state
Clearing to signal wait-state can end.
Add Clearing and Deleted states, former is a wait-state,
latter is a placeholder state to allow peers to disappear
quietly once refcounts settle.
(bgp_event) Try reduce verbosity of FSM state-change debug,
changes to same state are not interesting (Established->Established)
Allow NULL action functions in FSM.
* bgp_packet.c: (bgp_write) Use FSM events, rather than trying
to twiddle directly with FSM state behind the back of FSM.
(bgp_write_notify) ditto.
(bgp_read) Remove the vague ACCEPT_PEER peer_unlock, or else
this patch crashes, now it leaks instead.
* bgp_route.c: (bgp_clear_node_complete) Clearing_Completed
event, to end clearing.
(bgp_clear_route) See extensive comments.
* bgpd.c: (peer_free) should only be called while in Deleted,
peer refcounting controls when peer_free is called.
bgp_sync_delete should be here, not in peer_delete.
(peer_delete) Initiate delete.
Transition to Deleted state manually.
When removing peer from indices that provide visibility of it,
take great care to be idempotent wrt the reference counting
of struct peer through those indices.
Use bgp_timer_set, rather than replicating.
Call to bgp_sync_delete isn't appropriate here, sync can be
referenced while shutting down and finishing deletion.
(peer_group_bind) Take care to be idempotent wrt list references
indexing peers.
2006-09-14 04:58:49 +02:00
|
|
|
/* Delete peer from confguration.
|
|
|
|
*
|
|
|
|
* The peer is moved to a dead-end "Deleted" neighbour-state, to allow
|
|
|
|
* it to "cool off" and refcounts to hit 0, at which state it is freed.
|
|
|
|
*
|
|
|
|
* This function /should/ take care to be idempotent, to guard against
|
|
|
|
* it being called multiple times through stray events that come in
|
|
|
|
* that happen to result in this function being called again. That
|
|
|
|
* said, getting here for a "Deleted" peer is a bug in the neighbour
|
|
|
|
* FSM.
|
|
|
|
*/
|
2002-12-13 21:15:29 +01:00
|
|
|
int
|
|
|
|
peer_delete (struct peer *peer)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
afi_t afi;
|
|
|
|
safi_t safi;
|
|
|
|
struct bgp *bgp;
|
|
|
|
struct bgp_filter *filter;
|
[bgpd] Stability fixes including bugs 397, 492
I've spent the last several weeks working on stability fixes to bgpd.
These patches fix all of the numerous crashes, assertion failures, memory
leaks and memory stomping I could find. Valgrind was used extensively.
Added new function bgp_exit() to help catch problems. If "debug bgp" is
configured and bgpd exits with status of 0, statistics on remaining
lib/memory.c allocations are printed to stderr. It is my hope that other
developers will use this to stay on top of memory issues.
Example questionable exit:
bgpd: memstats: Current memory utilization in module LIB:
bgpd: memstats: Link List : 6
bgpd: memstats: Link Node : 5
bgpd: memstats: Hash : 8
bgpd: memstats: Hash Bucket : 2
bgpd: memstats: Hash Index : 8
bgpd: memstats: Work queue : 3
bgpd: memstats: Work queue item : 2
bgpd: memstats: Work queue name string : 3
bgpd: memstats: Current memory utilization in module BGP:
bgpd: memstats: BGP instance : 1
bgpd: memstats: BGP peer : 1
bgpd: memstats: BGP peer hostname : 1
bgpd: memstats: BGP attribute : 1
bgpd: memstats: BGP extra attributes : 1
bgpd: memstats: BGP aspath : 1
bgpd: memstats: BGP aspath str : 1
bgpd: memstats: BGP table : 24
bgpd: memstats: BGP node : 1
bgpd: memstats: BGP route : 1
bgpd: memstats: BGP synchronise : 8
bgpd: memstats: BGP Process queue : 1
bgpd: memstats: BGP node clear queue : 1
bgpd: memstats: NOTE: If configuration exists, utilization may be expected.
Example clean exit:
bgpd: memstats: No remaining tracked memory utilization.
This patch fixes bug #397: "Invalid free in bgp_announce_check()".
This patch fixes bug #492: "SIGBUS in bgpd/bgp_route.c:
bgp_clear_route_node()".
My apologies for not separating out these changes into individual patches.
The complexity of doing so boggled what is left of my brain. I hope this
is all still useful to the community.
This code has been production tested, in non-route-server-client mode, on
a linux 32-bit box and a 64-bit box.
Release/reset functions, used by bgp_exit(), added to:
bgpd/bgp_attr.c,h
bgpd/bgp_community.c,h
bgpd/bgp_dump.c,h
bgpd/bgp_ecommunity.c,h
bgpd/bgp_filter.c,h
bgpd/bgp_nexthop.c,h
bgpd/bgp_route.c,h
lib/routemap.c,h
File by file analysis:
* bgpd/bgp_aspath.c: Prevent re-use of ashash after it is released.
* bgpd/bgp_attr.c: #if removed uncalled cluster_dup().
* bgpd/bgp_clist.c,h: Allow community_list_terminate() to be called from
bgp_exit().
* bgpd/bgp_filter.c: Fix aslist->name use without allocation check, and
also fix memory leak.
* bgpd/bgp_main.c: Created bgp_exit() exit routine. This function frees
allocations made as part of bgpd initialization and, to some extent,
configuration. If "debug bgp" is configured, memory stats are printed
as described above.
* bgpd/bgp_nexthop.c: zclient_new() already allocates stream for
ibuf/obuf, so bgp_scan_init() shouldn't do it too. Also, made it so
zlookup is global so bgp_exit() can use it.
* bgpd/bgp_packet.c: bgp_capability_msg_parse() call to bgp_clear_route()
adjusted to use new BGP_CLEAR_ROUTE_NORMAL flag.
* bgpd/bgp_route.h: Correct reference counter "lock" to be signed.
bgp_clear_route() now accepts a bgp_clear_route_type of either
BGP_CLEAR_ROUTE_NORMAL or BGP_CLEAR_ROUTE_MY_RSCLIENT.
* bgpd/bgp_route.c:
- bgp_process_rsclient(): attr was being zero'ed and then
bgp_attr_extra_free() was being called with it, even though it was
never filled with valid data.
- bgp_process_rsclient(): Make sure rsclient->group is not NULL before
use.
- bgp_processq_del(): Add call to bgp_table_unlock().
- bgp_process(): Add call to bgp_table_lock().
- bgp_update_rsclient(): memset clearing of new_attr not needed since
declarationw with "= { 0 }" does it. memset was already commented
out.
- bgp_update_rsclient(): Fix screwed up misleading indentation.
- bgp_withdraw_rsclient(): Fix screwed up misleading indentation.
- bgp_clear_route_node(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT.
- bgp_clear_node_queue_del(): Add call to bgp_table_unlock() and also
free struct bgp_clear_node_queue used for work item.
- bgp_clear_node_complete(): Do peer_unlock() after BGP_EVENT_ADD() in
case peer is released by peer_unlock() call.
- bgp_clear_route_table(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT. Use
struct bgp_clear_node_queue to supply data to worker. Add call to
bgp_table_lock().
- bgp_clear_route(): Add support for BGP_CLEAR_ROUTE_NORMAL or
BGP_CLEAR_ROUTE_MY_RSCLIENT.
- bgp_clear_route_all(): Use BGP_CLEAR_ROUTE_NORMAL.
Bug 397 fixes:
- bgp_default_originate()
- bgp_announce_table()
* bgpd/bgp_table.h:
- struct bgp_table: Added reference count. Changed type of owner to be
"struct peer *" rather than "void *".
- struct bgp_node: Correct reference counter "lock" to be signed.
* bgpd/bgp_table.c:
- Added bgp_table reference counting.
- bgp_table_free(): Fixed cleanup code. Call peer_unlock() on owner if
set.
- bgp_unlock_node(): Added assertion.
- bgp_node_get(): Added call to bgp_lock_node() to code path that it was
missing from.
* bgpd/bgp_vty.c:
- peer_rsclient_set_vty(): Call peer_lock() as part of peer assignment
to owner. Handle failure gracefully.
- peer_rsclient_unset_vty(): Add call to bgp_clear_route() with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
* bgpd/bgp_zebra.c: Made it so zclient is global so bgp_exit() can use it.
* bgpd/bgpd.c:
- peer_lock(): Allow to be called when status is "Deleted".
- peer_deactivate(): Supply BGP_CLEAR_ROUTE_NORMAL purpose to
bgp_clear_route() call.
- peer_delete(): Common variable listnode pn. Fix bug in which rsclient
was only dealt with if not part of a peer group. Call
bgp_clear_route() for rsclient, if appropriate, and do so with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
- peer_group_get(): Use XSTRDUP() instead of strdup() for conf->host.
- peer_group_bind(): Call bgp_clear_route() for rsclient, and do so with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
- bgp_create(): Use XSTRDUP() instead of strdup() for peer_self->host.
- bgp_delete(): Delete peers before groups, rather than after. And then
rather than deleting rsclients, verify that there are none at this
point.
- bgp_unlock(): Add assertion.
- bgp_free(): Call bgp_table_finish() rather than doing XFREE() itself.
* lib/command.c,h: Compiler warning fixes. Add cmd_terminate(). Fixed
massive leak in install_element() in which cmd_make_descvec() was being
called more than once for the same cmd->strvec/string/doc.
* lib/log.c: Make closezlog() check fp before calling fclose().
* lib/memory.c: Catch when alloc count goes negative by using signed
counts. Correct #endif comment. Add log_memstats_stderr().
* lib/memory.h: Add log_memstats_stderr().
* lib/thread.c: thread->funcname was being accessed in thread_call() after
it had been freed. Rearranged things so that thread_call() frees
funcname. Also made it so thread_master_free() cleans up cpu_record.
* lib/vty.c,h: Use global command_cr. Add vty_terminate().
* lib/zclient.c,h: Re-enable zclient_free().
2009-07-18 07:44:03 +02:00
|
|
|
struct listnode *pn;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
[bgpd] Fix 0.99 shutdown regression, introduce Clearing and Deleted states
2006-09-14 Paul Jakma <paul.jakma@sun.com>
* (general) Fix some niggly issues around 'shutdown' and clearing
by adding a Clearing FSM wait-state and a hidden 'Deleted'
FSM state, to allow deleted peers to 'cool off' and hit 0
references. This introduces a slow memory leak of struct peer,
however that's more a testament to the fragility of the
reference counting than a bug in this patch, cleanup of
reference counting to fix this is to follow.
* bgpd.h: Add Clearing, Deleted states and Clearing_Completed
and event.
* bgp_debug.c: (bgp_status_msg[]) Add strings for Clearing and
Deleted.
* bgp_fsm.h: Don't allow timer/event threads to set anything
for Deleted peers.
* bgp_fsm.c: (bgp_timer_set) Add Clearing and Deleted. Deleted
needs to stop everything.
(bgp_stop) Remove explicit fsm_change_status call, the
general framework handles the transition.
(bgp_start) Log a warning if a start is attempted on a peer
that should stay down, trying to start a peer.
(struct .. FSM) Add Clearing_Completed
events, has little influence except when in state
Clearing to signal wait-state can end.
Add Clearing and Deleted states, former is a wait-state,
latter is a placeholder state to allow peers to disappear
quietly once refcounts settle.
(bgp_event) Try reduce verbosity of FSM state-change debug,
changes to same state are not interesting (Established->Established)
Allow NULL action functions in FSM.
* bgp_packet.c: (bgp_write) Use FSM events, rather than trying
to twiddle directly with FSM state behind the back of FSM.
(bgp_write_notify) ditto.
(bgp_read) Remove the vague ACCEPT_PEER peer_unlock, or else
this patch crashes, now it leaks instead.
* bgp_route.c: (bgp_clear_node_complete) Clearing_Completed
event, to end clearing.
(bgp_clear_route) See extensive comments.
* bgpd.c: (peer_free) should only be called while in Deleted,
peer refcounting controls when peer_free is called.
bgp_sync_delete should be here, not in peer_delete.
(peer_delete) Initiate delete.
Transition to Deleted state manually.
When removing peer from indices that provide visibility of it,
take great care to be idempotent wrt the reference counting
of struct peer through those indices.
Use bgp_timer_set, rather than replicating.
Call to bgp_sync_delete isn't appropriate here, sync can be
referenced while shutting down and finishing deletion.
(peer_group_bind) Take care to be idempotent wrt list references
indexing peers.
2006-09-14 04:58:49 +02:00
|
|
|
assert (peer->status != Deleted);
|
2015-05-20 02:40:37 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
bgp = peer->bgp;
|
|
|
|
|
2005-02-02 15:40:33 +01:00
|
|
|
if (CHECK_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT))
|
|
|
|
peer_nsf_stop (peer);
|
|
|
|
|
2015-05-20 02:40:37 +02:00
|
|
|
SET_FLAG(peer->flags, PEER_FLAG_DELETE);
|
|
|
|
|
[bgpd] Stability fixes including bugs 397, 492
I've spent the last several weeks working on stability fixes to bgpd.
These patches fix all of the numerous crashes, assertion failures, memory
leaks and memory stomping I could find. Valgrind was used extensively.
Added new function bgp_exit() to help catch problems. If "debug bgp" is
configured and bgpd exits with status of 0, statistics on remaining
lib/memory.c allocations are printed to stderr. It is my hope that other
developers will use this to stay on top of memory issues.
Example questionable exit:
bgpd: memstats: Current memory utilization in module LIB:
bgpd: memstats: Link List : 6
bgpd: memstats: Link Node : 5
bgpd: memstats: Hash : 8
bgpd: memstats: Hash Bucket : 2
bgpd: memstats: Hash Index : 8
bgpd: memstats: Work queue : 3
bgpd: memstats: Work queue item : 2
bgpd: memstats: Work queue name string : 3
bgpd: memstats: Current memory utilization in module BGP:
bgpd: memstats: BGP instance : 1
bgpd: memstats: BGP peer : 1
bgpd: memstats: BGP peer hostname : 1
bgpd: memstats: BGP attribute : 1
bgpd: memstats: BGP extra attributes : 1
bgpd: memstats: BGP aspath : 1
bgpd: memstats: BGP aspath str : 1
bgpd: memstats: BGP table : 24
bgpd: memstats: BGP node : 1
bgpd: memstats: BGP route : 1
bgpd: memstats: BGP synchronise : 8
bgpd: memstats: BGP Process queue : 1
bgpd: memstats: BGP node clear queue : 1
bgpd: memstats: NOTE: If configuration exists, utilization may be expected.
Example clean exit:
bgpd: memstats: No remaining tracked memory utilization.
This patch fixes bug #397: "Invalid free in bgp_announce_check()".
This patch fixes bug #492: "SIGBUS in bgpd/bgp_route.c:
bgp_clear_route_node()".
My apologies for not separating out these changes into individual patches.
The complexity of doing so boggled what is left of my brain. I hope this
is all still useful to the community.
This code has been production tested, in non-route-server-client mode, on
a linux 32-bit box and a 64-bit box.
Release/reset functions, used by bgp_exit(), added to:
bgpd/bgp_attr.c,h
bgpd/bgp_community.c,h
bgpd/bgp_dump.c,h
bgpd/bgp_ecommunity.c,h
bgpd/bgp_filter.c,h
bgpd/bgp_nexthop.c,h
bgpd/bgp_route.c,h
lib/routemap.c,h
File by file analysis:
* bgpd/bgp_aspath.c: Prevent re-use of ashash after it is released.
* bgpd/bgp_attr.c: #if removed uncalled cluster_dup().
* bgpd/bgp_clist.c,h: Allow community_list_terminate() to be called from
bgp_exit().
* bgpd/bgp_filter.c: Fix aslist->name use without allocation check, and
also fix memory leak.
* bgpd/bgp_main.c: Created bgp_exit() exit routine. This function frees
allocations made as part of bgpd initialization and, to some extent,
configuration. If "debug bgp" is configured, memory stats are printed
as described above.
* bgpd/bgp_nexthop.c: zclient_new() already allocates stream for
ibuf/obuf, so bgp_scan_init() shouldn't do it too. Also, made it so
zlookup is global so bgp_exit() can use it.
* bgpd/bgp_packet.c: bgp_capability_msg_parse() call to bgp_clear_route()
adjusted to use new BGP_CLEAR_ROUTE_NORMAL flag.
* bgpd/bgp_route.h: Correct reference counter "lock" to be signed.
bgp_clear_route() now accepts a bgp_clear_route_type of either
BGP_CLEAR_ROUTE_NORMAL or BGP_CLEAR_ROUTE_MY_RSCLIENT.
* bgpd/bgp_route.c:
- bgp_process_rsclient(): attr was being zero'ed and then
bgp_attr_extra_free() was being called with it, even though it was
never filled with valid data.
- bgp_process_rsclient(): Make sure rsclient->group is not NULL before
use.
- bgp_processq_del(): Add call to bgp_table_unlock().
- bgp_process(): Add call to bgp_table_lock().
- bgp_update_rsclient(): memset clearing of new_attr not needed since
declarationw with "= { 0 }" does it. memset was already commented
out.
- bgp_update_rsclient(): Fix screwed up misleading indentation.
- bgp_withdraw_rsclient(): Fix screwed up misleading indentation.
- bgp_clear_route_node(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT.
- bgp_clear_node_queue_del(): Add call to bgp_table_unlock() and also
free struct bgp_clear_node_queue used for work item.
- bgp_clear_node_complete(): Do peer_unlock() after BGP_EVENT_ADD() in
case peer is released by peer_unlock() call.
- bgp_clear_route_table(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT. Use
struct bgp_clear_node_queue to supply data to worker. Add call to
bgp_table_lock().
- bgp_clear_route(): Add support for BGP_CLEAR_ROUTE_NORMAL or
BGP_CLEAR_ROUTE_MY_RSCLIENT.
- bgp_clear_route_all(): Use BGP_CLEAR_ROUTE_NORMAL.
Bug 397 fixes:
- bgp_default_originate()
- bgp_announce_table()
* bgpd/bgp_table.h:
- struct bgp_table: Added reference count. Changed type of owner to be
"struct peer *" rather than "void *".
- struct bgp_node: Correct reference counter "lock" to be signed.
* bgpd/bgp_table.c:
- Added bgp_table reference counting.
- bgp_table_free(): Fixed cleanup code. Call peer_unlock() on owner if
set.
- bgp_unlock_node(): Added assertion.
- bgp_node_get(): Added call to bgp_lock_node() to code path that it was
missing from.
* bgpd/bgp_vty.c:
- peer_rsclient_set_vty(): Call peer_lock() as part of peer assignment
to owner. Handle failure gracefully.
- peer_rsclient_unset_vty(): Add call to bgp_clear_route() with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
* bgpd/bgp_zebra.c: Made it so zclient is global so bgp_exit() can use it.
* bgpd/bgpd.c:
- peer_lock(): Allow to be called when status is "Deleted".
- peer_deactivate(): Supply BGP_CLEAR_ROUTE_NORMAL purpose to
bgp_clear_route() call.
- peer_delete(): Common variable listnode pn. Fix bug in which rsclient
was only dealt with if not part of a peer group. Call
bgp_clear_route() for rsclient, if appropriate, and do so with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
- peer_group_get(): Use XSTRDUP() instead of strdup() for conf->host.
- peer_group_bind(): Call bgp_clear_route() for rsclient, and do so with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
- bgp_create(): Use XSTRDUP() instead of strdup() for peer_self->host.
- bgp_delete(): Delete peers before groups, rather than after. And then
rather than deleting rsclients, verify that there are none at this
point.
- bgp_unlock(): Add assertion.
- bgp_free(): Call bgp_table_finish() rather than doing XFREE() itself.
* lib/command.c,h: Compiler warning fixes. Add cmd_terminate(). Fixed
massive leak in install_element() in which cmd_make_descvec() was being
called more than once for the same cmd->strvec/string/doc.
* lib/log.c: Make closezlog() check fp before calling fclose().
* lib/memory.c: Catch when alloc count goes negative by using signed
counts. Correct #endif comment. Add log_memstats_stderr().
* lib/memory.h: Add log_memstats_stderr().
* lib/thread.c: thread->funcname was being accessed in thread_call() after
it had been freed. Rearranged things so that thread_call() frees
funcname. Also made it so thread_master_free() cleans up cpu_record.
* lib/vty.c,h: Use global command_cr. Add vty_terminate().
* lib/zclient.c,h: Re-enable zclient_free().
2009-07-18 07:44:03 +02:00
|
|
|
/* If this peer belongs to peer group, clear up the
|
2002-12-13 21:15:29 +01:00
|
|
|
relationship. */
|
|
|
|
if (peer->group)
|
|
|
|
{
|
2015-05-20 03:03:47 +02:00
|
|
|
if (peer_dynamic_neighbor(peer))
|
|
|
|
peer_drop_dynamic_neighbor(peer);
|
|
|
|
|
[bgpd] Fix 0.99 shutdown regression, introduce Clearing and Deleted states
2006-09-14 Paul Jakma <paul.jakma@sun.com>
* (general) Fix some niggly issues around 'shutdown' and clearing
by adding a Clearing FSM wait-state and a hidden 'Deleted'
FSM state, to allow deleted peers to 'cool off' and hit 0
references. This introduces a slow memory leak of struct peer,
however that's more a testament to the fragility of the
reference counting than a bug in this patch, cleanup of
reference counting to fix this is to follow.
* bgpd.h: Add Clearing, Deleted states and Clearing_Completed
and event.
* bgp_debug.c: (bgp_status_msg[]) Add strings for Clearing and
Deleted.
* bgp_fsm.h: Don't allow timer/event threads to set anything
for Deleted peers.
* bgp_fsm.c: (bgp_timer_set) Add Clearing and Deleted. Deleted
needs to stop everything.
(bgp_stop) Remove explicit fsm_change_status call, the
general framework handles the transition.
(bgp_start) Log a warning if a start is attempted on a peer
that should stay down, trying to start a peer.
(struct .. FSM) Add Clearing_Completed
events, has little influence except when in state
Clearing to signal wait-state can end.
Add Clearing and Deleted states, former is a wait-state,
latter is a placeholder state to allow peers to disappear
quietly once refcounts settle.
(bgp_event) Try reduce verbosity of FSM state-change debug,
changes to same state are not interesting (Established->Established)
Allow NULL action functions in FSM.
* bgp_packet.c: (bgp_write) Use FSM events, rather than trying
to twiddle directly with FSM state behind the back of FSM.
(bgp_write_notify) ditto.
(bgp_read) Remove the vague ACCEPT_PEER peer_unlock, or else
this patch crashes, now it leaks instead.
* bgp_route.c: (bgp_clear_node_complete) Clearing_Completed
event, to end clearing.
(bgp_clear_route) See extensive comments.
* bgpd.c: (peer_free) should only be called while in Deleted,
peer refcounting controls when peer_free is called.
bgp_sync_delete should be here, not in peer_delete.
(peer_delete) Initiate delete.
Transition to Deleted state manually.
When removing peer from indices that provide visibility of it,
take great care to be idempotent wrt the reference counting
of struct peer through those indices.
Use bgp_timer_set, rather than replicating.
Call to bgp_sync_delete isn't appropriate here, sync can be
referenced while shutting down and finishing deletion.
(peer_group_bind) Take care to be idempotent wrt list references
indexing peers.
2006-09-14 04:58:49 +02:00
|
|
|
if ((pn = listnode_lookup (peer->group->peer, peer)))
|
|
|
|
{
|
|
|
|
peer = peer_unlock (peer); /* group->peer list reference */
|
|
|
|
list_delete_node (peer->group->peer, pn);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
peer->group = NULL;
|
|
|
|
}
|
2005-06-01 Paul Jakma <paul.jakma@sun.com>
* 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
2005-06-01 13:17:05 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* Withdraw all information from routing table. We can not use
|
2005-06-01 Paul Jakma <paul.jakma@sun.com>
* 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
2005-06-01 13:17:05 +02:00
|
|
|
* BGP_EVENT_ADD (peer, BGP_Stop) at here. Because the event is
|
|
|
|
* executed after peer structure is deleted.
|
|
|
|
*/
|
2004-05-20 11:19:34 +02:00
|
|
|
peer->last_reset = PEER_DOWN_NEIGHBOR_DELETE;
|
2002-12-13 21:15:29 +01:00
|
|
|
bgp_stop (peer);
|
2015-05-20 02:40:37 +02:00
|
|
|
UNSET_FLAG(peer->flags, PEER_FLAG_DELETE);
|
|
|
|
|
|
|
|
if (peer->doppelganger)
|
|
|
|
peer->doppelganger->doppelganger = NULL;
|
|
|
|
peer->doppelganger = NULL;
|
|
|
|
|
|
|
|
UNSET_FLAG(peer->sflags, PEER_STATUS_ACCEPT_PEER);
|
[bgpd] Fix 0.99 shutdown regression, introduce Clearing and Deleted states
2006-09-14 Paul Jakma <paul.jakma@sun.com>
* (general) Fix some niggly issues around 'shutdown' and clearing
by adding a Clearing FSM wait-state and a hidden 'Deleted'
FSM state, to allow deleted peers to 'cool off' and hit 0
references. This introduces a slow memory leak of struct peer,
however that's more a testament to the fragility of the
reference counting than a bug in this patch, cleanup of
reference counting to fix this is to follow.
* bgpd.h: Add Clearing, Deleted states and Clearing_Completed
and event.
* bgp_debug.c: (bgp_status_msg[]) Add strings for Clearing and
Deleted.
* bgp_fsm.h: Don't allow timer/event threads to set anything
for Deleted peers.
* bgp_fsm.c: (bgp_timer_set) Add Clearing and Deleted. Deleted
needs to stop everything.
(bgp_stop) Remove explicit fsm_change_status call, the
general framework handles the transition.
(bgp_start) Log a warning if a start is attempted on a peer
that should stay down, trying to start a peer.
(struct .. FSM) Add Clearing_Completed
events, has little influence except when in state
Clearing to signal wait-state can end.
Add Clearing and Deleted states, former is a wait-state,
latter is a placeholder state to allow peers to disappear
quietly once refcounts settle.
(bgp_event) Try reduce verbosity of FSM state-change debug,
changes to same state are not interesting (Established->Established)
Allow NULL action functions in FSM.
* bgp_packet.c: (bgp_write) Use FSM events, rather than trying
to twiddle directly with FSM state behind the back of FSM.
(bgp_write_notify) ditto.
(bgp_read) Remove the vague ACCEPT_PEER peer_unlock, or else
this patch crashes, now it leaks instead.
* bgp_route.c: (bgp_clear_node_complete) Clearing_Completed
event, to end clearing.
(bgp_clear_route) See extensive comments.
* bgpd.c: (peer_free) should only be called while in Deleted,
peer refcounting controls when peer_free is called.
bgp_sync_delete should be here, not in peer_delete.
(peer_delete) Initiate delete.
Transition to Deleted state manually.
When removing peer from indices that provide visibility of it,
take great care to be idempotent wrt the reference counting
of struct peer through those indices.
Use bgp_timer_set, rather than replicating.
Call to bgp_sync_delete isn't appropriate here, sync can be
referenced while shutting down and finishing deletion.
(peer_group_bind) Take care to be idempotent wrt list references
indexing peers.
2006-09-14 04:58:49 +02:00
|
|
|
bgp_fsm_change_status (peer, Deleted);
|
[bgpd] TCP-MD5: password vty configuration and initial Linux support
2008-07-21 Paul Jakma <paul.jakma@sun.com>
* bgp_packet.c: (bgp_open_receive) fix warning in a zlog call
* bgp_vty.c: (bgp_vty_return) add return code
* bgpd.c: (bgp_master_init) setup the socket list.
* bgp_network.c: Remove the dual IPv4/6 socket thing for now, which
was implemented by Michael, until such time as its clear its
required for Linux (see sockopt comments). IPv6 support, including
IPv4 sessions on AF_INET6 sockets, therefore is broken, and the
'-l 0.0.0.0' arguments would need to be given to bgpd to make
things work here.
2008-07-21 Michael H. Warfield <mhw@wittsend.com>
YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Tomohiko Kusuda <kusuda@inetcore.com>
Leigh Brown <leigh@solinno.co.uk>
* bgp_network.c: (bgp_md5_set_one) shim between libzebra tcp-md5
sockopt and bgpd.
(bgp_md5_set_socket) Helper for bgp_connect
(bgp_md5_set) setup TCP-MD5SIG for the given peer.
(bgp_connect) call out to bgp_md5_set_socket for the outgoing
connect socket.
(bgp_socket) save references to the listen sockets, needed if
TCP-MD5SIG is applied later or changed.
* bgp_vty.c: (*neighbor_password_cmd) New 'neighbor ... password'
commands.
* bgpd.c: (peer_{new,delete) manage TCP-MD5 password
(peer_group2peer_config_copy) inherit TCP-MD5 password
(peer_password_{un,}set) orchestrate the whole add/remove of TCP-MD5
passwords: applying checks, stopping peers, and trying to return
errors to UI, etc.
(bgp_config_write_peer) save password.
Fix missing newline in writeout of neighbor ... port.
2008-07-21 Paul Jakma <paul.jakma@sun.com>
* sockunion.c: ifdef out various places that converted
v4mapped sockets to pure v4. Doesn't seem necessary at all,
presumably a workaround for now historical inet_ntop bugs (?)
2008-07-21 Michael H. Warfield <mhw@wittsend.com>
YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
* sockopt.{c,h}: (sockopt_tcp_signature) Add TCP-MD5SIG support.
2008-07-21 23:02:49 +02:00
|
|
|
|
|
|
|
/* Password configuration */
|
|
|
|
if (peer->password)
|
|
|
|
{
|
|
|
|
XFREE (MTYPE_PEER_PASSWORD, peer->password);
|
|
|
|
peer->password = NULL;
|
|
|
|
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
|
|
|
bgp_md5_set (peer);
|
|
|
|
}
|
|
|
|
|
[bgpd] Fix 0.99 shutdown regression, introduce Clearing and Deleted states
2006-09-14 Paul Jakma <paul.jakma@sun.com>
* (general) Fix some niggly issues around 'shutdown' and clearing
by adding a Clearing FSM wait-state and a hidden 'Deleted'
FSM state, to allow deleted peers to 'cool off' and hit 0
references. This introduces a slow memory leak of struct peer,
however that's more a testament to the fragility of the
reference counting than a bug in this patch, cleanup of
reference counting to fix this is to follow.
* bgpd.h: Add Clearing, Deleted states and Clearing_Completed
and event.
* bgp_debug.c: (bgp_status_msg[]) Add strings for Clearing and
Deleted.
* bgp_fsm.h: Don't allow timer/event threads to set anything
for Deleted peers.
* bgp_fsm.c: (bgp_timer_set) Add Clearing and Deleted. Deleted
needs to stop everything.
(bgp_stop) Remove explicit fsm_change_status call, the
general framework handles the transition.
(bgp_start) Log a warning if a start is attempted on a peer
that should stay down, trying to start a peer.
(struct .. FSM) Add Clearing_Completed
events, has little influence except when in state
Clearing to signal wait-state can end.
Add Clearing and Deleted states, former is a wait-state,
latter is a placeholder state to allow peers to disappear
quietly once refcounts settle.
(bgp_event) Try reduce verbosity of FSM state-change debug,
changes to same state are not interesting (Established->Established)
Allow NULL action functions in FSM.
* bgp_packet.c: (bgp_write) Use FSM events, rather than trying
to twiddle directly with FSM state behind the back of FSM.
(bgp_write_notify) ditto.
(bgp_read) Remove the vague ACCEPT_PEER peer_unlock, or else
this patch crashes, now it leaks instead.
* bgp_route.c: (bgp_clear_node_complete) Clearing_Completed
event, to end clearing.
(bgp_clear_route) See extensive comments.
* bgpd.c: (peer_free) should only be called while in Deleted,
peer refcounting controls when peer_free is called.
bgp_sync_delete should be here, not in peer_delete.
(peer_delete) Initiate delete.
Transition to Deleted state manually.
When removing peer from indices that provide visibility of it,
take great care to be idempotent wrt the reference counting
of struct peer through those indices.
Use bgp_timer_set, rather than replicating.
Call to bgp_sync_delete isn't appropriate here, sync can be
referenced while shutting down and finishing deletion.
(peer_group_bind) Take care to be idempotent wrt list references
indexing peers.
2006-09-14 04:58:49 +02:00
|
|
|
bgp_timer_set (peer); /* stops all timers for Deleted */
|
2015-05-20 02:40:37 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* Delete from all peer list. */
|
[bgpd] Stability fixes including bugs 397, 492
I've spent the last several weeks working on stability fixes to bgpd.
These patches fix all of the numerous crashes, assertion failures, memory
leaks and memory stomping I could find. Valgrind was used extensively.
Added new function bgp_exit() to help catch problems. If "debug bgp" is
configured and bgpd exits with status of 0, statistics on remaining
lib/memory.c allocations are printed to stderr. It is my hope that other
developers will use this to stay on top of memory issues.
Example questionable exit:
bgpd: memstats: Current memory utilization in module LIB:
bgpd: memstats: Link List : 6
bgpd: memstats: Link Node : 5
bgpd: memstats: Hash : 8
bgpd: memstats: Hash Bucket : 2
bgpd: memstats: Hash Index : 8
bgpd: memstats: Work queue : 3
bgpd: memstats: Work queue item : 2
bgpd: memstats: Work queue name string : 3
bgpd: memstats: Current memory utilization in module BGP:
bgpd: memstats: BGP instance : 1
bgpd: memstats: BGP peer : 1
bgpd: memstats: BGP peer hostname : 1
bgpd: memstats: BGP attribute : 1
bgpd: memstats: BGP extra attributes : 1
bgpd: memstats: BGP aspath : 1
bgpd: memstats: BGP aspath str : 1
bgpd: memstats: BGP table : 24
bgpd: memstats: BGP node : 1
bgpd: memstats: BGP route : 1
bgpd: memstats: BGP synchronise : 8
bgpd: memstats: BGP Process queue : 1
bgpd: memstats: BGP node clear queue : 1
bgpd: memstats: NOTE: If configuration exists, utilization may be expected.
Example clean exit:
bgpd: memstats: No remaining tracked memory utilization.
This patch fixes bug #397: "Invalid free in bgp_announce_check()".
This patch fixes bug #492: "SIGBUS in bgpd/bgp_route.c:
bgp_clear_route_node()".
My apologies for not separating out these changes into individual patches.
The complexity of doing so boggled what is left of my brain. I hope this
is all still useful to the community.
This code has been production tested, in non-route-server-client mode, on
a linux 32-bit box and a 64-bit box.
Release/reset functions, used by bgp_exit(), added to:
bgpd/bgp_attr.c,h
bgpd/bgp_community.c,h
bgpd/bgp_dump.c,h
bgpd/bgp_ecommunity.c,h
bgpd/bgp_filter.c,h
bgpd/bgp_nexthop.c,h
bgpd/bgp_route.c,h
lib/routemap.c,h
File by file analysis:
* bgpd/bgp_aspath.c: Prevent re-use of ashash after it is released.
* bgpd/bgp_attr.c: #if removed uncalled cluster_dup().
* bgpd/bgp_clist.c,h: Allow community_list_terminate() to be called from
bgp_exit().
* bgpd/bgp_filter.c: Fix aslist->name use without allocation check, and
also fix memory leak.
* bgpd/bgp_main.c: Created bgp_exit() exit routine. This function frees
allocations made as part of bgpd initialization and, to some extent,
configuration. If "debug bgp" is configured, memory stats are printed
as described above.
* bgpd/bgp_nexthop.c: zclient_new() already allocates stream for
ibuf/obuf, so bgp_scan_init() shouldn't do it too. Also, made it so
zlookup is global so bgp_exit() can use it.
* bgpd/bgp_packet.c: bgp_capability_msg_parse() call to bgp_clear_route()
adjusted to use new BGP_CLEAR_ROUTE_NORMAL flag.
* bgpd/bgp_route.h: Correct reference counter "lock" to be signed.
bgp_clear_route() now accepts a bgp_clear_route_type of either
BGP_CLEAR_ROUTE_NORMAL or BGP_CLEAR_ROUTE_MY_RSCLIENT.
* bgpd/bgp_route.c:
- bgp_process_rsclient(): attr was being zero'ed and then
bgp_attr_extra_free() was being called with it, even though it was
never filled with valid data.
- bgp_process_rsclient(): Make sure rsclient->group is not NULL before
use.
- bgp_processq_del(): Add call to bgp_table_unlock().
- bgp_process(): Add call to bgp_table_lock().
- bgp_update_rsclient(): memset clearing of new_attr not needed since
declarationw with "= { 0 }" does it. memset was already commented
out.
- bgp_update_rsclient(): Fix screwed up misleading indentation.
- bgp_withdraw_rsclient(): Fix screwed up misleading indentation.
- bgp_clear_route_node(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT.
- bgp_clear_node_queue_del(): Add call to bgp_table_unlock() and also
free struct bgp_clear_node_queue used for work item.
- bgp_clear_node_complete(): Do peer_unlock() after BGP_EVENT_ADD() in
case peer is released by peer_unlock() call.
- bgp_clear_route_table(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT. Use
struct bgp_clear_node_queue to supply data to worker. Add call to
bgp_table_lock().
- bgp_clear_route(): Add support for BGP_CLEAR_ROUTE_NORMAL or
BGP_CLEAR_ROUTE_MY_RSCLIENT.
- bgp_clear_route_all(): Use BGP_CLEAR_ROUTE_NORMAL.
Bug 397 fixes:
- bgp_default_originate()
- bgp_announce_table()
* bgpd/bgp_table.h:
- struct bgp_table: Added reference count. Changed type of owner to be
"struct peer *" rather than "void *".
- struct bgp_node: Correct reference counter "lock" to be signed.
* bgpd/bgp_table.c:
- Added bgp_table reference counting.
- bgp_table_free(): Fixed cleanup code. Call peer_unlock() on owner if
set.
- bgp_unlock_node(): Added assertion.
- bgp_node_get(): Added call to bgp_lock_node() to code path that it was
missing from.
* bgpd/bgp_vty.c:
- peer_rsclient_set_vty(): Call peer_lock() as part of peer assignment
to owner. Handle failure gracefully.
- peer_rsclient_unset_vty(): Add call to bgp_clear_route() with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
* bgpd/bgp_zebra.c: Made it so zclient is global so bgp_exit() can use it.
* bgpd/bgpd.c:
- peer_lock(): Allow to be called when status is "Deleted".
- peer_deactivate(): Supply BGP_CLEAR_ROUTE_NORMAL purpose to
bgp_clear_route() call.
- peer_delete(): Common variable listnode pn. Fix bug in which rsclient
was only dealt with if not part of a peer group. Call
bgp_clear_route() for rsclient, if appropriate, and do so with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
- peer_group_get(): Use XSTRDUP() instead of strdup() for conf->host.
- peer_group_bind(): Call bgp_clear_route() for rsclient, and do so with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
- bgp_create(): Use XSTRDUP() instead of strdup() for peer_self->host.
- bgp_delete(): Delete peers before groups, rather than after. And then
rather than deleting rsclients, verify that there are none at this
point.
- bgp_unlock(): Add assertion.
- bgp_free(): Call bgp_table_finish() rather than doing XFREE() itself.
* lib/command.c,h: Compiler warning fixes. Add cmd_terminate(). Fixed
massive leak in install_element() in which cmd_make_descvec() was being
called more than once for the same cmd->strvec/string/doc.
* lib/log.c: Make closezlog() check fp before calling fclose().
* lib/memory.c: Catch when alloc count goes negative by using signed
counts. Correct #endif comment. Add log_memstats_stderr().
* lib/memory.h: Add log_memstats_stderr().
* lib/thread.c: thread->funcname was being accessed in thread_call() after
it had been freed. Rearranged things so that thread_call() frees
funcname. Also made it so thread_master_free() cleans up cpu_record.
* lib/vty.c,h: Use global command_cr. Add vty_terminate().
* lib/zclient.c,h: Re-enable zclient_free().
2009-07-18 07:44:03 +02:00
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP)
|
|
|
|
&& (pn = listnode_lookup (bgp->peer, peer)))
|
2004-09-13 Jose Luis Rubio <jrubio@dit.upm.es>
(at Technical University of Madrid as part of Euro6ix Project)
Enhanced Route Server functionality and Route-Maps:
* bgpd/bgpd.h: Modified 'struct peer' and 'struct bgp_filter' to
support rs-clients. A 'struct bgp_table *rib' has been added to the
first (to mantain a separated RIB for each rs-client) and two new
route-maps have been added to the last (for import/export policies).
Added the following #defines: RMAP_{IN|OUT|IMPORT|EXPORT|MAX},
PEER_RMAP_TYPE_{IMPORT|EXPORT} and BGP_CLEAR_SOFT_RSCLIENT.
* bgpd/bgpd.c: Modified the functions that create/delete/etc peers in
order to consider the new fields included in 'struct peer' for
supporting rs-clients, i.e. the import/export route-maps and the
'struct bgp_table'.
* bgpd/bgp_route.{ch}: Modified several functions related with
receiving/sending announces in order to support the new Route Server
capabilities.
Function 'bgp_process' has been reorganized, creating an auxiliar
function for best path selection ('bgp_best_selection').
Modified 'bgp_show' and 'bgp_show_route' for displaying information
about any RIB (and not only the main bgp RIB).
Added commands for displaying information about RS-clients RIBs:
'show bgp rsclient (A.B.C.D|X:X::X:X)', 'show bgp rsclient
(A.B.C.D|X:X::X:X) X:X::X:X/M', etc
* bgpd/bgp_table.{ch}: The structure 'struct bgp_table' now has two
new fields: type (which can take the values BGP_TABLE_{MAIN|RSCLIENT})
and 'void *owner' which points to 'struct bgp' or 'struct peer' which
owns the table.
When creating a new bgp_table by default 'type=BGP_TABLE_MAIN' is set.
* bgpd/bgp_vty.c: The commands 'neighbor ... route-server-client' and
'no neighbor ... route-server-client' now not only set/unset the flag
PEER_FLAG_RSERVER_CLIENT, but they create/destroy the 'struct
bgp_table' of the peer. Special actions are taken for peer_groups.
Command 'neighbor ... route-map WORD (in|out)' now also supports two
new kinds of route-map: 'import' and 'export'.
Added commands 'clear bgp * rsclient', etc. These commands allow a new
kind of soft_reconfig which affects only the RIB of the specified
RS-client.
Added commands 'show bgp rsclient summary', etc which display a
summary of the rs-clients configured for the corresponding address
family.
* bgpd/bgp_routemap.c: A new match statement is available,
'match peer (A.B.C.D|X:X::X:X)'. This statement can only be used in
import/export route-maps, and it matches when the peer who announces
(when used in an import route-map) or is going to receive (when used
in an export route-map) the route is the same than the one specified
in the statement.
For peer-groups the statement matches if the specified peer is member
of the peer-group.
A special version of the command, 'match peer local', matches with
routes originated by the Route Server (defined with 'network ...',
redistributed routes and default-originate).
* lib/routemap.{ch}: Added a new clause 'call NAME' for use in
route-maps. It jumps into the specified route-map and when it returns
the first route-map ends if the called RM returns DENY_MATCH, or
continues in other case.
2004-09-13 07:12:46 +02:00
|
|
|
{
|
[bgpd] Stability fixes including bugs 397, 492
I've spent the last several weeks working on stability fixes to bgpd.
These patches fix all of the numerous crashes, assertion failures, memory
leaks and memory stomping I could find. Valgrind was used extensively.
Added new function bgp_exit() to help catch problems. If "debug bgp" is
configured and bgpd exits with status of 0, statistics on remaining
lib/memory.c allocations are printed to stderr. It is my hope that other
developers will use this to stay on top of memory issues.
Example questionable exit:
bgpd: memstats: Current memory utilization in module LIB:
bgpd: memstats: Link List : 6
bgpd: memstats: Link Node : 5
bgpd: memstats: Hash : 8
bgpd: memstats: Hash Bucket : 2
bgpd: memstats: Hash Index : 8
bgpd: memstats: Work queue : 3
bgpd: memstats: Work queue item : 2
bgpd: memstats: Work queue name string : 3
bgpd: memstats: Current memory utilization in module BGP:
bgpd: memstats: BGP instance : 1
bgpd: memstats: BGP peer : 1
bgpd: memstats: BGP peer hostname : 1
bgpd: memstats: BGP attribute : 1
bgpd: memstats: BGP extra attributes : 1
bgpd: memstats: BGP aspath : 1
bgpd: memstats: BGP aspath str : 1
bgpd: memstats: BGP table : 24
bgpd: memstats: BGP node : 1
bgpd: memstats: BGP route : 1
bgpd: memstats: BGP synchronise : 8
bgpd: memstats: BGP Process queue : 1
bgpd: memstats: BGP node clear queue : 1
bgpd: memstats: NOTE: If configuration exists, utilization may be expected.
Example clean exit:
bgpd: memstats: No remaining tracked memory utilization.
This patch fixes bug #397: "Invalid free in bgp_announce_check()".
This patch fixes bug #492: "SIGBUS in bgpd/bgp_route.c:
bgp_clear_route_node()".
My apologies for not separating out these changes into individual patches.
The complexity of doing so boggled what is left of my brain. I hope this
is all still useful to the community.
This code has been production tested, in non-route-server-client mode, on
a linux 32-bit box and a 64-bit box.
Release/reset functions, used by bgp_exit(), added to:
bgpd/bgp_attr.c,h
bgpd/bgp_community.c,h
bgpd/bgp_dump.c,h
bgpd/bgp_ecommunity.c,h
bgpd/bgp_filter.c,h
bgpd/bgp_nexthop.c,h
bgpd/bgp_route.c,h
lib/routemap.c,h
File by file analysis:
* bgpd/bgp_aspath.c: Prevent re-use of ashash after it is released.
* bgpd/bgp_attr.c: #if removed uncalled cluster_dup().
* bgpd/bgp_clist.c,h: Allow community_list_terminate() to be called from
bgp_exit().
* bgpd/bgp_filter.c: Fix aslist->name use without allocation check, and
also fix memory leak.
* bgpd/bgp_main.c: Created bgp_exit() exit routine. This function frees
allocations made as part of bgpd initialization and, to some extent,
configuration. If "debug bgp" is configured, memory stats are printed
as described above.
* bgpd/bgp_nexthop.c: zclient_new() already allocates stream for
ibuf/obuf, so bgp_scan_init() shouldn't do it too. Also, made it so
zlookup is global so bgp_exit() can use it.
* bgpd/bgp_packet.c: bgp_capability_msg_parse() call to bgp_clear_route()
adjusted to use new BGP_CLEAR_ROUTE_NORMAL flag.
* bgpd/bgp_route.h: Correct reference counter "lock" to be signed.
bgp_clear_route() now accepts a bgp_clear_route_type of either
BGP_CLEAR_ROUTE_NORMAL or BGP_CLEAR_ROUTE_MY_RSCLIENT.
* bgpd/bgp_route.c:
- bgp_process_rsclient(): attr was being zero'ed and then
bgp_attr_extra_free() was being called with it, even though it was
never filled with valid data.
- bgp_process_rsclient(): Make sure rsclient->group is not NULL before
use.
- bgp_processq_del(): Add call to bgp_table_unlock().
- bgp_process(): Add call to bgp_table_lock().
- bgp_update_rsclient(): memset clearing of new_attr not needed since
declarationw with "= { 0 }" does it. memset was already commented
out.
- bgp_update_rsclient(): Fix screwed up misleading indentation.
- bgp_withdraw_rsclient(): Fix screwed up misleading indentation.
- bgp_clear_route_node(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT.
- bgp_clear_node_queue_del(): Add call to bgp_table_unlock() and also
free struct bgp_clear_node_queue used for work item.
- bgp_clear_node_complete(): Do peer_unlock() after BGP_EVENT_ADD() in
case peer is released by peer_unlock() call.
- bgp_clear_route_table(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT. Use
struct bgp_clear_node_queue to supply data to worker. Add call to
bgp_table_lock().
- bgp_clear_route(): Add support for BGP_CLEAR_ROUTE_NORMAL or
BGP_CLEAR_ROUTE_MY_RSCLIENT.
- bgp_clear_route_all(): Use BGP_CLEAR_ROUTE_NORMAL.
Bug 397 fixes:
- bgp_default_originate()
- bgp_announce_table()
* bgpd/bgp_table.h:
- struct bgp_table: Added reference count. Changed type of owner to be
"struct peer *" rather than "void *".
- struct bgp_node: Correct reference counter "lock" to be signed.
* bgpd/bgp_table.c:
- Added bgp_table reference counting.
- bgp_table_free(): Fixed cleanup code. Call peer_unlock() on owner if
set.
- bgp_unlock_node(): Added assertion.
- bgp_node_get(): Added call to bgp_lock_node() to code path that it was
missing from.
* bgpd/bgp_vty.c:
- peer_rsclient_set_vty(): Call peer_lock() as part of peer assignment
to owner. Handle failure gracefully.
- peer_rsclient_unset_vty(): Add call to bgp_clear_route() with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
* bgpd/bgp_zebra.c: Made it so zclient is global so bgp_exit() can use it.
* bgpd/bgpd.c:
- peer_lock(): Allow to be called when status is "Deleted".
- peer_deactivate(): Supply BGP_CLEAR_ROUTE_NORMAL purpose to
bgp_clear_route() call.
- peer_delete(): Common variable listnode pn. Fix bug in which rsclient
was only dealt with if not part of a peer group. Call
bgp_clear_route() for rsclient, if appropriate, and do so with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
- peer_group_get(): Use XSTRDUP() instead of strdup() for conf->host.
- peer_group_bind(): Call bgp_clear_route() for rsclient, and do so with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
- bgp_create(): Use XSTRDUP() instead of strdup() for peer_self->host.
- bgp_delete(): Delete peers before groups, rather than after. And then
rather than deleting rsclients, verify that there are none at this
point.
- bgp_unlock(): Add assertion.
- bgp_free(): Call bgp_table_finish() rather than doing XFREE() itself.
* lib/command.c,h: Compiler warning fixes. Add cmd_terminate(). Fixed
massive leak in install_element() in which cmd_make_descvec() was being
called more than once for the same cmd->strvec/string/doc.
* lib/log.c: Make closezlog() check fp before calling fclose().
* lib/memory.c: Catch when alloc count goes negative by using signed
counts. Correct #endif comment. Add log_memstats_stderr().
* lib/memory.h: Add log_memstats_stderr().
* lib/thread.c: thread->funcname was being accessed in thread_call() after
it had been freed. Rearranged things so that thread_call() frees
funcname. Also made it so thread_master_free() cleans up cpu_record.
* lib/vty.c,h: Use global command_cr. Add vty_terminate().
* lib/zclient.c,h: Re-enable zclient_free().
2009-07-18 07:44:03 +02:00
|
|
|
peer_unlock (peer); /* bgp peer list reference */
|
|
|
|
list_delete_node (bgp->peer, pn);
|
|
|
|
}
|
2005-06-01 Paul Jakma <paul.jakma@sun.com>
* 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
2005-06-01 13:17:05 +02:00
|
|
|
|
[bgpd] Stability fixes including bugs 397, 492
I've spent the last several weeks working on stability fixes to bgpd.
These patches fix all of the numerous crashes, assertion failures, memory
leaks and memory stomping I could find. Valgrind was used extensively.
Added new function bgp_exit() to help catch problems. If "debug bgp" is
configured and bgpd exits with status of 0, statistics on remaining
lib/memory.c allocations are printed to stderr. It is my hope that other
developers will use this to stay on top of memory issues.
Example questionable exit:
bgpd: memstats: Current memory utilization in module LIB:
bgpd: memstats: Link List : 6
bgpd: memstats: Link Node : 5
bgpd: memstats: Hash : 8
bgpd: memstats: Hash Bucket : 2
bgpd: memstats: Hash Index : 8
bgpd: memstats: Work queue : 3
bgpd: memstats: Work queue item : 2
bgpd: memstats: Work queue name string : 3
bgpd: memstats: Current memory utilization in module BGP:
bgpd: memstats: BGP instance : 1
bgpd: memstats: BGP peer : 1
bgpd: memstats: BGP peer hostname : 1
bgpd: memstats: BGP attribute : 1
bgpd: memstats: BGP extra attributes : 1
bgpd: memstats: BGP aspath : 1
bgpd: memstats: BGP aspath str : 1
bgpd: memstats: BGP table : 24
bgpd: memstats: BGP node : 1
bgpd: memstats: BGP route : 1
bgpd: memstats: BGP synchronise : 8
bgpd: memstats: BGP Process queue : 1
bgpd: memstats: BGP node clear queue : 1
bgpd: memstats: NOTE: If configuration exists, utilization may be expected.
Example clean exit:
bgpd: memstats: No remaining tracked memory utilization.
This patch fixes bug #397: "Invalid free in bgp_announce_check()".
This patch fixes bug #492: "SIGBUS in bgpd/bgp_route.c:
bgp_clear_route_node()".
My apologies for not separating out these changes into individual patches.
The complexity of doing so boggled what is left of my brain. I hope this
is all still useful to the community.
This code has been production tested, in non-route-server-client mode, on
a linux 32-bit box and a 64-bit box.
Release/reset functions, used by bgp_exit(), added to:
bgpd/bgp_attr.c,h
bgpd/bgp_community.c,h
bgpd/bgp_dump.c,h
bgpd/bgp_ecommunity.c,h
bgpd/bgp_filter.c,h
bgpd/bgp_nexthop.c,h
bgpd/bgp_route.c,h
lib/routemap.c,h
File by file analysis:
* bgpd/bgp_aspath.c: Prevent re-use of ashash after it is released.
* bgpd/bgp_attr.c: #if removed uncalled cluster_dup().
* bgpd/bgp_clist.c,h: Allow community_list_terminate() to be called from
bgp_exit().
* bgpd/bgp_filter.c: Fix aslist->name use without allocation check, and
also fix memory leak.
* bgpd/bgp_main.c: Created bgp_exit() exit routine. This function frees
allocations made as part of bgpd initialization and, to some extent,
configuration. If "debug bgp" is configured, memory stats are printed
as described above.
* bgpd/bgp_nexthop.c: zclient_new() already allocates stream for
ibuf/obuf, so bgp_scan_init() shouldn't do it too. Also, made it so
zlookup is global so bgp_exit() can use it.
* bgpd/bgp_packet.c: bgp_capability_msg_parse() call to bgp_clear_route()
adjusted to use new BGP_CLEAR_ROUTE_NORMAL flag.
* bgpd/bgp_route.h: Correct reference counter "lock" to be signed.
bgp_clear_route() now accepts a bgp_clear_route_type of either
BGP_CLEAR_ROUTE_NORMAL or BGP_CLEAR_ROUTE_MY_RSCLIENT.
* bgpd/bgp_route.c:
- bgp_process_rsclient(): attr was being zero'ed and then
bgp_attr_extra_free() was being called with it, even though it was
never filled with valid data.
- bgp_process_rsclient(): Make sure rsclient->group is not NULL before
use.
- bgp_processq_del(): Add call to bgp_table_unlock().
- bgp_process(): Add call to bgp_table_lock().
- bgp_update_rsclient(): memset clearing of new_attr not needed since
declarationw with "= { 0 }" does it. memset was already commented
out.
- bgp_update_rsclient(): Fix screwed up misleading indentation.
- bgp_withdraw_rsclient(): Fix screwed up misleading indentation.
- bgp_clear_route_node(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT.
- bgp_clear_node_queue_del(): Add call to bgp_table_unlock() and also
free struct bgp_clear_node_queue used for work item.
- bgp_clear_node_complete(): Do peer_unlock() after BGP_EVENT_ADD() in
case peer is released by peer_unlock() call.
- bgp_clear_route_table(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT. Use
struct bgp_clear_node_queue to supply data to worker. Add call to
bgp_table_lock().
- bgp_clear_route(): Add support for BGP_CLEAR_ROUTE_NORMAL or
BGP_CLEAR_ROUTE_MY_RSCLIENT.
- bgp_clear_route_all(): Use BGP_CLEAR_ROUTE_NORMAL.
Bug 397 fixes:
- bgp_default_originate()
- bgp_announce_table()
* bgpd/bgp_table.h:
- struct bgp_table: Added reference count. Changed type of owner to be
"struct peer *" rather than "void *".
- struct bgp_node: Correct reference counter "lock" to be signed.
* bgpd/bgp_table.c:
- Added bgp_table reference counting.
- bgp_table_free(): Fixed cleanup code. Call peer_unlock() on owner if
set.
- bgp_unlock_node(): Added assertion.
- bgp_node_get(): Added call to bgp_lock_node() to code path that it was
missing from.
* bgpd/bgp_vty.c:
- peer_rsclient_set_vty(): Call peer_lock() as part of peer assignment
to owner. Handle failure gracefully.
- peer_rsclient_unset_vty(): Add call to bgp_clear_route() with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
* bgpd/bgp_zebra.c: Made it so zclient is global so bgp_exit() can use it.
* bgpd/bgpd.c:
- peer_lock(): Allow to be called when status is "Deleted".
- peer_deactivate(): Supply BGP_CLEAR_ROUTE_NORMAL purpose to
bgp_clear_route() call.
- peer_delete(): Common variable listnode pn. Fix bug in which rsclient
was only dealt with if not part of a peer group. Call
bgp_clear_route() for rsclient, if appropriate, and do so with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
- peer_group_get(): Use XSTRDUP() instead of strdup() for conf->host.
- peer_group_bind(): Call bgp_clear_route() for rsclient, and do so with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
- bgp_create(): Use XSTRDUP() instead of strdup() for peer_self->host.
- bgp_delete(): Delete peers before groups, rather than after. And then
rather than deleting rsclients, verify that there are none at this
point.
- bgp_unlock(): Add assertion.
- bgp_free(): Call bgp_table_finish() rather than doing XFREE() itself.
* lib/command.c,h: Compiler warning fixes. Add cmd_terminate(). Fixed
massive leak in install_element() in which cmd_make_descvec() was being
called more than once for the same cmd->strvec/string/doc.
* lib/log.c: Make closezlog() check fp before calling fclose().
* lib/memory.c: Catch when alloc count goes negative by using signed
counts. Correct #endif comment. Add log_memstats_stderr().
* lib/memory.h: Add log_memstats_stderr().
* lib/thread.c: thread->funcname was being accessed in thread_call() after
it had been freed. Rearranged things so that thread_call() frees
funcname. Also made it so thread_master_free() cleans up cpu_record.
* lib/vty.c,h: Use global command_cr. Add vty_terminate().
* lib/zclient.c,h: Re-enable zclient_free().
2009-07-18 07:44:03 +02:00
|
|
|
if (peer_rsclient_active (peer)
|
|
|
|
&& (pn = listnode_lookup (bgp->rsclient, peer)))
|
|
|
|
{
|
|
|
|
peer_unlock (peer); /* rsclient list reference */
|
|
|
|
list_delete_node (bgp->rsclient, pn);
|
|
|
|
|
2015-05-20 02:40:37 +02:00
|
|
|
if (CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE))
|
|
|
|
{
|
|
|
|
/* Clear our own rsclient ribs. */
|
|
|
|
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
|
|
|
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
|
|
|
|
if (CHECK_FLAG(peer->af_flags[afi][safi],
|
|
|
|
PEER_FLAG_RSERVER_CLIENT))
|
|
|
|
bgp_clear_route (peer, afi, safi, BGP_CLEAR_ROUTE_MY_RSCLIENT);
|
|
|
|
}
|
2004-09-13 Jose Luis Rubio <jrubio@dit.upm.es>
(at Technical University of Madrid as part of Euro6ix Project)
Enhanced Route Server functionality and Route-Maps:
* bgpd/bgpd.h: Modified 'struct peer' and 'struct bgp_filter' to
support rs-clients. A 'struct bgp_table *rib' has been added to the
first (to mantain a separated RIB for each rs-client) and two new
route-maps have been added to the last (for import/export policies).
Added the following #defines: RMAP_{IN|OUT|IMPORT|EXPORT|MAX},
PEER_RMAP_TYPE_{IMPORT|EXPORT} and BGP_CLEAR_SOFT_RSCLIENT.
* bgpd/bgpd.c: Modified the functions that create/delete/etc peers in
order to consider the new fields included in 'struct peer' for
supporting rs-clients, i.e. the import/export route-maps and the
'struct bgp_table'.
* bgpd/bgp_route.{ch}: Modified several functions related with
receiving/sending announces in order to support the new Route Server
capabilities.
Function 'bgp_process' has been reorganized, creating an auxiliar
function for best path selection ('bgp_best_selection').
Modified 'bgp_show' and 'bgp_show_route' for displaying information
about any RIB (and not only the main bgp RIB).
Added commands for displaying information about RS-clients RIBs:
'show bgp rsclient (A.B.C.D|X:X::X:X)', 'show bgp rsclient
(A.B.C.D|X:X::X:X) X:X::X:X/M', etc
* bgpd/bgp_table.{ch}: The structure 'struct bgp_table' now has two
new fields: type (which can take the values BGP_TABLE_{MAIN|RSCLIENT})
and 'void *owner' which points to 'struct bgp' or 'struct peer' which
owns the table.
When creating a new bgp_table by default 'type=BGP_TABLE_MAIN' is set.
* bgpd/bgp_vty.c: The commands 'neighbor ... route-server-client' and
'no neighbor ... route-server-client' now not only set/unset the flag
PEER_FLAG_RSERVER_CLIENT, but they create/destroy the 'struct
bgp_table' of the peer. Special actions are taken for peer_groups.
Command 'neighbor ... route-map WORD (in|out)' now also supports two
new kinds of route-map: 'import' and 'export'.
Added commands 'clear bgp * rsclient', etc. These commands allow a new
kind of soft_reconfig which affects only the RIB of the specified
RS-client.
Added commands 'show bgp rsclient summary', etc which display a
summary of the rs-clients configured for the corresponding address
family.
* bgpd/bgp_routemap.c: A new match statement is available,
'match peer (A.B.C.D|X:X::X:X)'. This statement can only be used in
import/export route-maps, and it matches when the peer who announces
(when used in an import route-map) or is going to receive (when used
in an export route-map) the route is the same than the one specified
in the statement.
For peer-groups the statement matches if the specified peer is member
of the peer-group.
A special version of the command, 'match peer local', matches with
routes originated by the Route Server (defined with 'network ...',
redistributed routes and default-originate).
* lib/routemap.{ch}: Added a new clause 'call NAME' for use in
route-maps. It jumps into the specified route-map and when it returns
the first route-map ends if the called RM returns DENY_MATCH, or
continues in other case.
2004-09-13 07:12:46 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Free RIB for any family in which peer is RSERVER_CLIENT, and is not
|
|
|
|
member of a peer_group. */
|
|
|
|
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
|
|
|
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
|
|
|
|
if (peer->rib[afi][safi] && ! peer->af_group[afi][safi])
|
2008-07-02 04:12:07 +02:00
|
|
|
bgp_table_finish (&peer->rib[afi][safi]);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2005-06-01 Paul Jakma <paul.jakma@sun.com>
* 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
2005-06-01 13:17:05 +02:00
|
|
|
/* Buffers. */
|
2002-12-13 21:15:29 +01:00
|
|
|
if (peer->ibuf)
|
|
|
|
stream_free (peer->ibuf);
|
|
|
|
if (peer->obuf)
|
|
|
|
stream_fifo_free (peer->obuf);
|
|
|
|
if (peer->work)
|
|
|
|
stream_free (peer->work);
|
2014-01-15 07:57:57 +01:00
|
|
|
if (peer->scratch)
|
|
|
|
stream_free(peer->scratch);
|
2006-07-27 21:05:12 +02:00
|
|
|
peer->obuf = NULL;
|
2014-01-15 07:57:57 +01:00
|
|
|
peer->work = peer->scratch = peer->ibuf = NULL;
|
2006-07-27 21:05:12 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* Local and remote addresses. */
|
|
|
|
if (peer->su_local)
|
2005-05-19 03:50:11 +02:00
|
|
|
sockunion_free (peer->su_local);
|
2002-12-13 21:15:29 +01:00
|
|
|
if (peer->su_remote)
|
2005-05-19 03:50:11 +02:00
|
|
|
sockunion_free (peer->su_remote);
|
2006-07-27 21:05:12 +02:00
|
|
|
peer->su_local = peer->su_remote = NULL;
|
2005-06-01 Paul Jakma <paul.jakma@sun.com>
* 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
2005-06-01 13:17:05 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* Free filter related memory. */
|
|
|
|
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
|
|
|
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
|
|
|
|
{
|
|
|
|
filter = &peer->filter[afi][safi];
|
|
|
|
|
|
|
|
for (i = FILTER_IN; i < FILTER_MAX; i++)
|
|
|
|
{
|
|
|
|
if (filter->dlist[i].name)
|
|
|
|
free (filter->dlist[i].name);
|
|
|
|
if (filter->plist[i].name)
|
|
|
|
free (filter->plist[i].name);
|
|
|
|
if (filter->aslist[i].name)
|
|
|
|
free (filter->aslist[i].name);
|
2005-06-01 Paul Jakma <paul.jakma@sun.com>
* 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
2005-06-01 13:17:05 +02:00
|
|
|
|
|
|
|
filter->dlist[i].name = NULL;
|
|
|
|
filter->plist[i].name = NULL;
|
|
|
|
filter->aslist[i].name = NULL;
|
|
|
|
}
|
|
|
|
for (i = RMAP_IN; i < RMAP_MAX; i++)
|
|
|
|
{
|
2002-12-13 21:15:29 +01:00
|
|
|
if (filter->map[i].name)
|
|
|
|
free (filter->map[i].name);
|
2005-06-01 Paul Jakma <paul.jakma@sun.com>
* 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
2005-06-01 13:17:05 +02:00
|
|
|
filter->map[i].name = NULL;
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if (filter->usmap.name)
|
|
|
|
free (filter->usmap.name);
|
|
|
|
|
|
|
|
if (peer->default_rmap[afi][safi].name)
|
|
|
|
free (peer->default_rmap[afi][safi].name);
|
2005-06-01 Paul Jakma <paul.jakma@sun.com>
* 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
2005-06-01 13:17:05 +02:00
|
|
|
|
|
|
|
filter->usmap.name = NULL;
|
|
|
|
peer->default_rmap[afi][safi].name = NULL;
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
2015-05-20 03:03:47 +02:00
|
|
|
|
|
|
|
FOREACH_AFI_SAFI (afi, safi)
|
|
|
|
peer_af_delete (peer, afi, safi);
|
2015-05-20 03:29:16 +02:00
|
|
|
|
|
|
|
if (peer->hostname)
|
|
|
|
XFREE(MTYPE_HOST, peer->hostname);
|
|
|
|
if (peer->domainname)
|
|
|
|
XFREE(MTYPE_HOST, peer->domainname);
|
|
|
|
|
2005-06-01 Paul Jakma <paul.jakma@sun.com>
* 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
2005-06-01 13:17:05 +02:00
|
|
|
peer_unlock (peer); /* initial reference */
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2005-06-28 14:44:16 +02:00
|
|
|
static int
|
2002-12-13 21:15:29 +01:00
|
|
|
peer_group_cmp (struct peer_group *g1, struct peer_group *g2)
|
|
|
|
{
|
|
|
|
return strcmp (g1->name, g2->name);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Peer group cofiguration. */
|
|
|
|
static struct peer_group *
|
2009-02-09 19:14:16 +01:00
|
|
|
peer_group_new (void)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
return (struct peer_group *) XCALLOC (MTYPE_PEER_GROUP,
|
|
|
|
sizeof (struct peer_group));
|
|
|
|
}
|
|
|
|
|
2005-06-28 14:44:16 +02:00
|
|
|
static void
|
2002-12-13 21:15:29 +01:00
|
|
|
peer_group_free (struct peer_group *group)
|
|
|
|
{
|
|
|
|
XFREE (MTYPE_PEER_GROUP, group);
|
|
|
|
}
|
|
|
|
|
|
|
|
struct peer_group *
|
2004-10-13 07:06:08 +02:00
|
|
|
peer_group_lookup (struct bgp *bgp, const char *name)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
struct peer_group *group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (bgp->group, node, nnode, group))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
if (strcmp (group->name, name) == 0)
|
|
|
|
return group;
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct peer_group *
|
2004-10-13 07:06:08 +02:00
|
|
|
peer_group_get (struct bgp *bgp, const char *name)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
struct peer_group *group;
|
2015-05-20 03:03:47 +02:00
|
|
|
afi_t afi;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
group = peer_group_lookup (bgp, name);
|
|
|
|
if (group)
|
|
|
|
return group;
|
|
|
|
|
|
|
|
group = peer_group_new ();
|
|
|
|
group->bgp = bgp;
|
|
|
|
group->name = strdup (name);
|
|
|
|
group->peer = list_new ();
|
2015-05-20 03:03:47 +02:00
|
|
|
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
|
|
|
group->listen_range[afi] = list_new ();
|
2006-10-22 21:13:07 +02:00
|
|
|
group->conf = peer_new (bgp);
|
2002-12-13 21:15:29 +01:00
|
|
|
if (! bgp_flag_check (bgp, BGP_FLAG_NO_DEFAULT_IPV4))
|
|
|
|
group->conf->afc[AFI_IP][SAFI_UNICAST] = 1;
|
[bgpd] Stability fixes including bugs 397, 492
I've spent the last several weeks working on stability fixes to bgpd.
These patches fix all of the numerous crashes, assertion failures, memory
leaks and memory stomping I could find. Valgrind was used extensively.
Added new function bgp_exit() to help catch problems. If "debug bgp" is
configured and bgpd exits with status of 0, statistics on remaining
lib/memory.c allocations are printed to stderr. It is my hope that other
developers will use this to stay on top of memory issues.
Example questionable exit:
bgpd: memstats: Current memory utilization in module LIB:
bgpd: memstats: Link List : 6
bgpd: memstats: Link Node : 5
bgpd: memstats: Hash : 8
bgpd: memstats: Hash Bucket : 2
bgpd: memstats: Hash Index : 8
bgpd: memstats: Work queue : 3
bgpd: memstats: Work queue item : 2
bgpd: memstats: Work queue name string : 3
bgpd: memstats: Current memory utilization in module BGP:
bgpd: memstats: BGP instance : 1
bgpd: memstats: BGP peer : 1
bgpd: memstats: BGP peer hostname : 1
bgpd: memstats: BGP attribute : 1
bgpd: memstats: BGP extra attributes : 1
bgpd: memstats: BGP aspath : 1
bgpd: memstats: BGP aspath str : 1
bgpd: memstats: BGP table : 24
bgpd: memstats: BGP node : 1
bgpd: memstats: BGP route : 1
bgpd: memstats: BGP synchronise : 8
bgpd: memstats: BGP Process queue : 1
bgpd: memstats: BGP node clear queue : 1
bgpd: memstats: NOTE: If configuration exists, utilization may be expected.
Example clean exit:
bgpd: memstats: No remaining tracked memory utilization.
This patch fixes bug #397: "Invalid free in bgp_announce_check()".
This patch fixes bug #492: "SIGBUS in bgpd/bgp_route.c:
bgp_clear_route_node()".
My apologies for not separating out these changes into individual patches.
The complexity of doing so boggled what is left of my brain. I hope this
is all still useful to the community.
This code has been production tested, in non-route-server-client mode, on
a linux 32-bit box and a 64-bit box.
Release/reset functions, used by bgp_exit(), added to:
bgpd/bgp_attr.c,h
bgpd/bgp_community.c,h
bgpd/bgp_dump.c,h
bgpd/bgp_ecommunity.c,h
bgpd/bgp_filter.c,h
bgpd/bgp_nexthop.c,h
bgpd/bgp_route.c,h
lib/routemap.c,h
File by file analysis:
* bgpd/bgp_aspath.c: Prevent re-use of ashash after it is released.
* bgpd/bgp_attr.c: #if removed uncalled cluster_dup().
* bgpd/bgp_clist.c,h: Allow community_list_terminate() to be called from
bgp_exit().
* bgpd/bgp_filter.c: Fix aslist->name use without allocation check, and
also fix memory leak.
* bgpd/bgp_main.c: Created bgp_exit() exit routine. This function frees
allocations made as part of bgpd initialization and, to some extent,
configuration. If "debug bgp" is configured, memory stats are printed
as described above.
* bgpd/bgp_nexthop.c: zclient_new() already allocates stream for
ibuf/obuf, so bgp_scan_init() shouldn't do it too. Also, made it so
zlookup is global so bgp_exit() can use it.
* bgpd/bgp_packet.c: bgp_capability_msg_parse() call to bgp_clear_route()
adjusted to use new BGP_CLEAR_ROUTE_NORMAL flag.
* bgpd/bgp_route.h: Correct reference counter "lock" to be signed.
bgp_clear_route() now accepts a bgp_clear_route_type of either
BGP_CLEAR_ROUTE_NORMAL or BGP_CLEAR_ROUTE_MY_RSCLIENT.
* bgpd/bgp_route.c:
- bgp_process_rsclient(): attr was being zero'ed and then
bgp_attr_extra_free() was being called with it, even though it was
never filled with valid data.
- bgp_process_rsclient(): Make sure rsclient->group is not NULL before
use.
- bgp_processq_del(): Add call to bgp_table_unlock().
- bgp_process(): Add call to bgp_table_lock().
- bgp_update_rsclient(): memset clearing of new_attr not needed since
declarationw with "= { 0 }" does it. memset was already commented
out.
- bgp_update_rsclient(): Fix screwed up misleading indentation.
- bgp_withdraw_rsclient(): Fix screwed up misleading indentation.
- bgp_clear_route_node(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT.
- bgp_clear_node_queue_del(): Add call to bgp_table_unlock() and also
free struct bgp_clear_node_queue used for work item.
- bgp_clear_node_complete(): Do peer_unlock() after BGP_EVENT_ADD() in
case peer is released by peer_unlock() call.
- bgp_clear_route_table(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT. Use
struct bgp_clear_node_queue to supply data to worker. Add call to
bgp_table_lock().
- bgp_clear_route(): Add support for BGP_CLEAR_ROUTE_NORMAL or
BGP_CLEAR_ROUTE_MY_RSCLIENT.
- bgp_clear_route_all(): Use BGP_CLEAR_ROUTE_NORMAL.
Bug 397 fixes:
- bgp_default_originate()
- bgp_announce_table()
* bgpd/bgp_table.h:
- struct bgp_table: Added reference count. Changed type of owner to be
"struct peer *" rather than "void *".
- struct bgp_node: Correct reference counter "lock" to be signed.
* bgpd/bgp_table.c:
- Added bgp_table reference counting.
- bgp_table_free(): Fixed cleanup code. Call peer_unlock() on owner if
set.
- bgp_unlock_node(): Added assertion.
- bgp_node_get(): Added call to bgp_lock_node() to code path that it was
missing from.
* bgpd/bgp_vty.c:
- peer_rsclient_set_vty(): Call peer_lock() as part of peer assignment
to owner. Handle failure gracefully.
- peer_rsclient_unset_vty(): Add call to bgp_clear_route() with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
* bgpd/bgp_zebra.c: Made it so zclient is global so bgp_exit() can use it.
* bgpd/bgpd.c:
- peer_lock(): Allow to be called when status is "Deleted".
- peer_deactivate(): Supply BGP_CLEAR_ROUTE_NORMAL purpose to
bgp_clear_route() call.
- peer_delete(): Common variable listnode pn. Fix bug in which rsclient
was only dealt with if not part of a peer group. Call
bgp_clear_route() for rsclient, if appropriate, and do so with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
- peer_group_get(): Use XSTRDUP() instead of strdup() for conf->host.
- peer_group_bind(): Call bgp_clear_route() for rsclient, and do so with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
- bgp_create(): Use XSTRDUP() instead of strdup() for peer_self->host.
- bgp_delete(): Delete peers before groups, rather than after. And then
rather than deleting rsclients, verify that there are none at this
point.
- bgp_unlock(): Add assertion.
- bgp_free(): Call bgp_table_finish() rather than doing XFREE() itself.
* lib/command.c,h: Compiler warning fixes. Add cmd_terminate(). Fixed
massive leak in install_element() in which cmd_make_descvec() was being
called more than once for the same cmd->strvec/string/doc.
* lib/log.c: Make closezlog() check fp before calling fclose().
* lib/memory.c: Catch when alloc count goes negative by using signed
counts. Correct #endif comment. Add log_memstats_stderr().
* lib/memory.h: Add log_memstats_stderr().
* lib/thread.c: thread->funcname was being accessed in thread_call() after
it had been freed. Rearranged things so that thread_call() frees
funcname. Also made it so thread_master_free() cleans up cpu_record.
* lib/vty.c,h: Use global command_cr. Add vty_terminate().
* lib/zclient.c,h: Re-enable zclient_free().
2009-07-18 07:44:03 +02:00
|
|
|
group->conf->host = XSTRDUP (MTYPE_BGP_PEER_HOST, name);
|
2002-12-13 21:15:29 +01:00
|
|
|
group->conf->group = group;
|
|
|
|
group->conf->as = 0;
|
|
|
|
group->conf->ttl = 1;
|
bgpd: RFC 5082 Generalized TTL Security Mechanism support
* bgpd: Add support for RFC 5082 GTSM, which allows the TTL field to be used
to verify that incoming packets have been sent from neighbours no more
than X IP hops away. In other words, this allows packets that were sent from
further away (i.e. not by the neighbour with known distance, and so possibly
a miscreant) to be filtered out.
* lib/sockunion.{c,h}: (sockopt_minttl) new function, to set a minimum TTL
using the IP_MINTTL socket opt.
* bgpd.h: (BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK) define for command
error for minttl.
(struct peer) add a config variable, to store the configured minttl.
(peer_ttl_security_hops_{set,unset}) configuration handlers
* bgpd.c: (peer_group_get) init gtsm_hops
(peer_ebgp_multihop_{un,}set) check for conflicts with GTSM. Multihop and
GTSM can't both be active for a peer at the same time.
(peer_ttl_security_hops_set) set minttl, taking care to avoid conflicts with
ebgp_multihop.
(bgp_config_write_peer) write out minttl as "neighbor .. ttl-security hops X".
* bgp_vty.c: (bgp_vty_return) message for
BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
(peer_ebgp_multihop_{un,}set_vty)
* bgp_network.c: (bgp_accept) set minttl on accepted sockets if appropriate.
(bgp_connect) ditto for outbound.
2011-03-23 16:33:17 +01:00
|
|
|
group->conf->gtsm_hops = 0;
|
2002-12-13 21:15:29 +01:00
|
|
|
group->conf->v_routeadv = BGP_DEFAULT_EBGP_ROUTEADV;
|
|
|
|
UNSET_FLAG (group->conf->config, PEER_CONFIG_TIMER);
|
|
|
|
UNSET_FLAG (group->conf->config, PEER_CONFIG_CONNECT);
|
|
|
|
group->conf->keepalive = 0;
|
|
|
|
group->conf->holdtime = 0;
|
|
|
|
group->conf->connect = 0;
|
|
|
|
SET_FLAG (group->conf->sflags, PEER_STATUS_GROUP);
|
|
|
|
listnode_add_sort (bgp->group, group);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2005-06-28 14:44:16 +02:00
|
|
|
static void
|
2002-12-13 21:15:29 +01:00
|
|
|
peer_group2peer_config_copy (struct peer_group *group, struct peer *peer,
|
|
|
|
afi_t afi, safi_t safi)
|
|
|
|
{
|
|
|
|
int in = FILTER_IN;
|
|
|
|
int out = FILTER_OUT;
|
|
|
|
struct peer *conf;
|
|
|
|
struct bgp_filter *pfilter;
|
|
|
|
struct bgp_filter *gfilter;
|
|
|
|
|
|
|
|
conf = group->conf;
|
|
|
|
pfilter = &peer->filter[afi][safi];
|
|
|
|
gfilter = &conf->filter[afi][safi];
|
|
|
|
|
|
|
|
/* remote-as */
|
|
|
|
if (conf->as)
|
|
|
|
peer->as = conf->as;
|
|
|
|
|
|
|
|
/* remote-as */
|
|
|
|
if (conf->change_local_as)
|
|
|
|
peer->change_local_as = conf->change_local_as;
|
|
|
|
|
|
|
|
/* TTL */
|
|
|
|
peer->ttl = conf->ttl;
|
|
|
|
|
bgpd: RFC 5082 Generalized TTL Security Mechanism support
* bgpd: Add support for RFC 5082 GTSM, which allows the TTL field to be used
to verify that incoming packets have been sent from neighbours no more
than X IP hops away. In other words, this allows packets that were sent from
further away (i.e. not by the neighbour with known distance, and so possibly
a miscreant) to be filtered out.
* lib/sockunion.{c,h}: (sockopt_minttl) new function, to set a minimum TTL
using the IP_MINTTL socket opt.
* bgpd.h: (BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK) define for command
error for minttl.
(struct peer) add a config variable, to store the configured minttl.
(peer_ttl_security_hops_{set,unset}) configuration handlers
* bgpd.c: (peer_group_get) init gtsm_hops
(peer_ebgp_multihop_{un,}set) check for conflicts with GTSM. Multihop and
GTSM can't both be active for a peer at the same time.
(peer_ttl_security_hops_set) set minttl, taking care to avoid conflicts with
ebgp_multihop.
(bgp_config_write_peer) write out minttl as "neighbor .. ttl-security hops X".
* bgp_vty.c: (bgp_vty_return) message for
BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
(peer_ebgp_multihop_{un,}set_vty)
* bgp_network.c: (bgp_accept) set minttl on accepted sockets if appropriate.
(bgp_connect) ditto for outbound.
2011-03-23 16:33:17 +01:00
|
|
|
/* GTSM hops */
|
|
|
|
peer->gtsm_hops = conf->gtsm_hops;
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* Weight */
|
|
|
|
peer->weight = conf->weight;
|
|
|
|
|
|
|
|
/* peer flags apply */
|
|
|
|
peer->flags = conf->flags;
|
|
|
|
/* peer af_flags apply */
|
|
|
|
peer->af_flags[afi][safi] = conf->af_flags[afi][safi];
|
|
|
|
/* peer config apply */
|
|
|
|
peer->config = conf->config;
|
|
|
|
|
|
|
|
/* peer timers apply */
|
|
|
|
peer->holdtime = conf->holdtime;
|
|
|
|
peer->keepalive = conf->keepalive;
|
|
|
|
peer->connect = conf->connect;
|
|
|
|
if (CHECK_FLAG (conf->config, PEER_CONFIG_CONNECT))
|
|
|
|
peer->v_connect = conf->connect;
|
|
|
|
else
|
|
|
|
peer->v_connect = BGP_DEFAULT_CONNECT_RETRY;
|
|
|
|
|
|
|
|
/* advertisement-interval reset */
|
2015-05-20 02:40:35 +02:00
|
|
|
if (CHECK_FLAG (conf->config, PEER_CONFIG_ROUTEADV))
|
|
|
|
peer->v_routeadv = conf->routeadv;
|
2002-12-13 21:15:29 +01:00
|
|
|
else
|
2015-05-20 02:40:35 +02:00
|
|
|
if (peer_sort (peer) == BGP_PEER_IBGP)
|
|
|
|
peer->v_routeadv = BGP_DEFAULT_IBGP_ROUTEADV;
|
|
|
|
else
|
|
|
|
peer->v_routeadv = BGP_DEFAULT_EBGP_ROUTEADV;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
[bgpd] TCP-MD5: password vty configuration and initial Linux support
2008-07-21 Paul Jakma <paul.jakma@sun.com>
* bgp_packet.c: (bgp_open_receive) fix warning in a zlog call
* bgp_vty.c: (bgp_vty_return) add return code
* bgpd.c: (bgp_master_init) setup the socket list.
* bgp_network.c: Remove the dual IPv4/6 socket thing for now, which
was implemented by Michael, until such time as its clear its
required for Linux (see sockopt comments). IPv6 support, including
IPv4 sessions on AF_INET6 sockets, therefore is broken, and the
'-l 0.0.0.0' arguments would need to be given to bgpd to make
things work here.
2008-07-21 Michael H. Warfield <mhw@wittsend.com>
YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Tomohiko Kusuda <kusuda@inetcore.com>
Leigh Brown <leigh@solinno.co.uk>
* bgp_network.c: (bgp_md5_set_one) shim between libzebra tcp-md5
sockopt and bgpd.
(bgp_md5_set_socket) Helper for bgp_connect
(bgp_md5_set) setup TCP-MD5SIG for the given peer.
(bgp_connect) call out to bgp_md5_set_socket for the outgoing
connect socket.
(bgp_socket) save references to the listen sockets, needed if
TCP-MD5SIG is applied later or changed.
* bgp_vty.c: (*neighbor_password_cmd) New 'neighbor ... password'
commands.
* bgpd.c: (peer_{new,delete) manage TCP-MD5 password
(peer_group2peer_config_copy) inherit TCP-MD5 password
(peer_password_{un,}set) orchestrate the whole add/remove of TCP-MD5
passwords: applying checks, stopping peers, and trying to return
errors to UI, etc.
(bgp_config_write_peer) save password.
Fix missing newline in writeout of neighbor ... port.
2008-07-21 Paul Jakma <paul.jakma@sun.com>
* sockunion.c: ifdef out various places that converted
v4mapped sockets to pure v4. Doesn't seem necessary at all,
presumably a workaround for now historical inet_ntop bugs (?)
2008-07-21 Michael H. Warfield <mhw@wittsend.com>
YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
* sockopt.{c,h}: (sockopt_tcp_signature) Add TCP-MD5SIG support.
2008-07-21 23:02:49 +02:00
|
|
|
/* password apply */
|
2013-01-18 13:52:03 +01:00
|
|
|
if (conf->password && !peer->password)
|
[bgpd] TCP-MD5: password vty configuration and initial Linux support
2008-07-21 Paul Jakma <paul.jakma@sun.com>
* bgp_packet.c: (bgp_open_receive) fix warning in a zlog call
* bgp_vty.c: (bgp_vty_return) add return code
* bgpd.c: (bgp_master_init) setup the socket list.
* bgp_network.c: Remove the dual IPv4/6 socket thing for now, which
was implemented by Michael, until such time as its clear its
required for Linux (see sockopt comments). IPv6 support, including
IPv4 sessions on AF_INET6 sockets, therefore is broken, and the
'-l 0.0.0.0' arguments would need to be given to bgpd to make
things work here.
2008-07-21 Michael H. Warfield <mhw@wittsend.com>
YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Tomohiko Kusuda <kusuda@inetcore.com>
Leigh Brown <leigh@solinno.co.uk>
* bgp_network.c: (bgp_md5_set_one) shim between libzebra tcp-md5
sockopt and bgpd.
(bgp_md5_set_socket) Helper for bgp_connect
(bgp_md5_set) setup TCP-MD5SIG for the given peer.
(bgp_connect) call out to bgp_md5_set_socket for the outgoing
connect socket.
(bgp_socket) save references to the listen sockets, needed if
TCP-MD5SIG is applied later or changed.
* bgp_vty.c: (*neighbor_password_cmd) New 'neighbor ... password'
commands.
* bgpd.c: (peer_{new,delete) manage TCP-MD5 password
(peer_group2peer_config_copy) inherit TCP-MD5 password
(peer_password_{un,}set) orchestrate the whole add/remove of TCP-MD5
passwords: applying checks, stopping peers, and trying to return
errors to UI, etc.
(bgp_config_write_peer) save password.
Fix missing newline in writeout of neighbor ... port.
2008-07-21 Paul Jakma <paul.jakma@sun.com>
* sockunion.c: ifdef out various places that converted
v4mapped sockets to pure v4. Doesn't seem necessary at all,
presumably a workaround for now historical inet_ntop bugs (?)
2008-07-21 Michael H. Warfield <mhw@wittsend.com>
YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
* sockopt.{c,h}: (sockopt_tcp_signature) Add TCP-MD5SIG support.
2008-07-21 23:02:49 +02:00
|
|
|
peer->password = XSTRDUP (MTYPE_PEER_PASSWORD, conf->password);
|
|
|
|
|
|
|
|
bgp_md5_set (peer);
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* maximum-prefix */
|
|
|
|
peer->pmax[afi][safi] = conf->pmax[afi][safi];
|
2004-05-20 11:19:34 +02:00
|
|
|
peer->pmax_threshold[afi][safi] = conf->pmax_threshold[afi][safi];
|
2005-02-01 21:57:17 +01:00
|
|
|
peer->pmax_restart[afi][safi] = conf->pmax_restart[afi][safi];
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
/* allowas-in */
|
|
|
|
peer->allowas_in[afi][safi] = conf->allowas_in[afi][safi];
|
|
|
|
|
2004-09-13 Jose Luis Rubio <jrubio@dit.upm.es>
(at Technical University of Madrid as part of Euro6ix Project)
Enhanced Route Server functionality and Route-Maps:
* bgpd/bgpd.h: Modified 'struct peer' and 'struct bgp_filter' to
support rs-clients. A 'struct bgp_table *rib' has been added to the
first (to mantain a separated RIB for each rs-client) and two new
route-maps have been added to the last (for import/export policies).
Added the following #defines: RMAP_{IN|OUT|IMPORT|EXPORT|MAX},
PEER_RMAP_TYPE_{IMPORT|EXPORT} and BGP_CLEAR_SOFT_RSCLIENT.
* bgpd/bgpd.c: Modified the functions that create/delete/etc peers in
order to consider the new fields included in 'struct peer' for
supporting rs-clients, i.e. the import/export route-maps and the
'struct bgp_table'.
* bgpd/bgp_route.{ch}: Modified several functions related with
receiving/sending announces in order to support the new Route Server
capabilities.
Function 'bgp_process' has been reorganized, creating an auxiliar
function for best path selection ('bgp_best_selection').
Modified 'bgp_show' and 'bgp_show_route' for displaying information
about any RIB (and not only the main bgp RIB).
Added commands for displaying information about RS-clients RIBs:
'show bgp rsclient (A.B.C.D|X:X::X:X)', 'show bgp rsclient
(A.B.C.D|X:X::X:X) X:X::X:X/M', etc
* bgpd/bgp_table.{ch}: The structure 'struct bgp_table' now has two
new fields: type (which can take the values BGP_TABLE_{MAIN|RSCLIENT})
and 'void *owner' which points to 'struct bgp' or 'struct peer' which
owns the table.
When creating a new bgp_table by default 'type=BGP_TABLE_MAIN' is set.
* bgpd/bgp_vty.c: The commands 'neighbor ... route-server-client' and
'no neighbor ... route-server-client' now not only set/unset the flag
PEER_FLAG_RSERVER_CLIENT, but they create/destroy the 'struct
bgp_table' of the peer. Special actions are taken for peer_groups.
Command 'neighbor ... route-map WORD (in|out)' now also supports two
new kinds of route-map: 'import' and 'export'.
Added commands 'clear bgp * rsclient', etc. These commands allow a new
kind of soft_reconfig which affects only the RIB of the specified
RS-client.
Added commands 'show bgp rsclient summary', etc which display a
summary of the rs-clients configured for the corresponding address
family.
* bgpd/bgp_routemap.c: A new match statement is available,
'match peer (A.B.C.D|X:X::X:X)'. This statement can only be used in
import/export route-maps, and it matches when the peer who announces
(when used in an import route-map) or is going to receive (when used
in an export route-map) the route is the same than the one specified
in the statement.
For peer-groups the statement matches if the specified peer is member
of the peer-group.
A special version of the command, 'match peer local', matches with
routes originated by the Route Server (defined with 'network ...',
redistributed routes and default-originate).
* lib/routemap.{ch}: Added a new clause 'call NAME' for use in
route-maps. It jumps into the specified route-map and when it returns
the first route-map ends if the called RM returns DENY_MATCH, or
continues in other case.
2004-09-13 07:12:46 +02:00
|
|
|
/* route-server-client */
|
|
|
|
if (CHECK_FLAG(conf->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
|
|
|
|
{
|
|
|
|
/* Make peer's RIB point to group's RIB. */
|
|
|
|
peer->rib[afi][safi] = group->conf->rib[afi][safi];
|
|
|
|
|
|
|
|
/* Import policy. */
|
|
|
|
if (pfilter->map[RMAP_IMPORT].name)
|
|
|
|
free (pfilter->map[RMAP_IMPORT].name);
|
|
|
|
if (gfilter->map[RMAP_IMPORT].name)
|
|
|
|
{
|
|
|
|
pfilter->map[RMAP_IMPORT].name = strdup (gfilter->map[RMAP_IMPORT].name);
|
|
|
|
pfilter->map[RMAP_IMPORT].map = gfilter->map[RMAP_IMPORT].map;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
pfilter->map[RMAP_IMPORT].name = NULL;
|
|
|
|
pfilter->map[RMAP_IMPORT].map = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Export policy. */
|
|
|
|
if (gfilter->map[RMAP_EXPORT].name && ! pfilter->map[RMAP_EXPORT].name)
|
|
|
|
{
|
|
|
|
pfilter->map[RMAP_EXPORT].name = strdup (gfilter->map[RMAP_EXPORT].name);
|
|
|
|
pfilter->map[RMAP_EXPORT].map = gfilter->map[RMAP_EXPORT].map;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* default-originate route-map */
|
|
|
|
if (conf->default_rmap[afi][safi].name)
|
|
|
|
{
|
|
|
|
if (peer->default_rmap[afi][safi].name)
|
|
|
|
free (peer->default_rmap[afi][safi].name);
|
|
|
|
peer->default_rmap[afi][safi].name = strdup (conf->default_rmap[afi][safi].name);
|
|
|
|
peer->default_rmap[afi][safi].map = conf->default_rmap[afi][safi].map;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* update-source apply */
|
|
|
|
if (conf->update_source)
|
|
|
|
{
|
|
|
|
if (peer->update_source)
|
|
|
|
sockunion_free (peer->update_source);
|
|
|
|
if (peer->update_if)
|
|
|
|
{
|
|
|
|
XFREE (MTYPE_PEER_UPDATE_SOURCE, peer->update_if);
|
|
|
|
peer->update_if = NULL;
|
|
|
|
}
|
|
|
|
peer->update_source = sockunion_dup (conf->update_source);
|
|
|
|
}
|
|
|
|
else if (conf->update_if)
|
|
|
|
{
|
|
|
|
if (peer->update_if)
|
|
|
|
XFREE (MTYPE_PEER_UPDATE_SOURCE, peer->update_if);
|
|
|
|
if (peer->update_source)
|
|
|
|
{
|
|
|
|
sockunion_free (peer->update_source);
|
|
|
|
peer->update_source = NULL;
|
|
|
|
}
|
|
|
|
peer->update_if = XSTRDUP (MTYPE_PEER_UPDATE_SOURCE, conf->update_if);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* inbound filter apply */
|
|
|
|
if (gfilter->dlist[in].name && ! pfilter->dlist[in].name)
|
|
|
|
{
|
|
|
|
if (pfilter->dlist[in].name)
|
|
|
|
free (pfilter->dlist[in].name);
|
|
|
|
pfilter->dlist[in].name = strdup (gfilter->dlist[in].name);
|
|
|
|
pfilter->dlist[in].alist = gfilter->dlist[in].alist;
|
|
|
|
}
|
|
|
|
if (gfilter->plist[in].name && ! pfilter->plist[in].name)
|
|
|
|
{
|
|
|
|
if (pfilter->plist[in].name)
|
|
|
|
free (pfilter->plist[in].name);
|
|
|
|
pfilter->plist[in].name = strdup (gfilter->plist[in].name);
|
|
|
|
pfilter->plist[in].plist = gfilter->plist[in].plist;
|
|
|
|
}
|
|
|
|
if (gfilter->aslist[in].name && ! pfilter->aslist[in].name)
|
|
|
|
{
|
|
|
|
if (pfilter->aslist[in].name)
|
|
|
|
free (pfilter->aslist[in].name);
|
|
|
|
pfilter->aslist[in].name = strdup (gfilter->aslist[in].name);
|
|
|
|
pfilter->aslist[in].aslist = gfilter->aslist[in].aslist;
|
|
|
|
}
|
2004-09-13 Jose Luis Rubio <jrubio@dit.upm.es>
(at Technical University of Madrid as part of Euro6ix Project)
Enhanced Route Server functionality and Route-Maps:
* bgpd/bgpd.h: Modified 'struct peer' and 'struct bgp_filter' to
support rs-clients. A 'struct bgp_table *rib' has been added to the
first (to mantain a separated RIB for each rs-client) and two new
route-maps have been added to the last (for import/export policies).
Added the following #defines: RMAP_{IN|OUT|IMPORT|EXPORT|MAX},
PEER_RMAP_TYPE_{IMPORT|EXPORT} and BGP_CLEAR_SOFT_RSCLIENT.
* bgpd/bgpd.c: Modified the functions that create/delete/etc peers in
order to consider the new fields included in 'struct peer' for
supporting rs-clients, i.e. the import/export route-maps and the
'struct bgp_table'.
* bgpd/bgp_route.{ch}: Modified several functions related with
receiving/sending announces in order to support the new Route Server
capabilities.
Function 'bgp_process' has been reorganized, creating an auxiliar
function for best path selection ('bgp_best_selection').
Modified 'bgp_show' and 'bgp_show_route' for displaying information
about any RIB (and not only the main bgp RIB).
Added commands for displaying information about RS-clients RIBs:
'show bgp rsclient (A.B.C.D|X:X::X:X)', 'show bgp rsclient
(A.B.C.D|X:X::X:X) X:X::X:X/M', etc
* bgpd/bgp_table.{ch}: The structure 'struct bgp_table' now has two
new fields: type (which can take the values BGP_TABLE_{MAIN|RSCLIENT})
and 'void *owner' which points to 'struct bgp' or 'struct peer' which
owns the table.
When creating a new bgp_table by default 'type=BGP_TABLE_MAIN' is set.
* bgpd/bgp_vty.c: The commands 'neighbor ... route-server-client' and
'no neighbor ... route-server-client' now not only set/unset the flag
PEER_FLAG_RSERVER_CLIENT, but they create/destroy the 'struct
bgp_table' of the peer. Special actions are taken for peer_groups.
Command 'neighbor ... route-map WORD (in|out)' now also supports two
new kinds of route-map: 'import' and 'export'.
Added commands 'clear bgp * rsclient', etc. These commands allow a new
kind of soft_reconfig which affects only the RIB of the specified
RS-client.
Added commands 'show bgp rsclient summary', etc which display a
summary of the rs-clients configured for the corresponding address
family.
* bgpd/bgp_routemap.c: A new match statement is available,
'match peer (A.B.C.D|X:X::X:X)'. This statement can only be used in
import/export route-maps, and it matches when the peer who announces
(when used in an import route-map) or is going to receive (when used
in an export route-map) the route is the same than the one specified
in the statement.
For peer-groups the statement matches if the specified peer is member
of the peer-group.
A special version of the command, 'match peer local', matches with
routes originated by the Route Server (defined with 'network ...',
redistributed routes and default-originate).
* lib/routemap.{ch}: Added a new clause 'call NAME' for use in
route-maps. It jumps into the specified route-map and when it returns
the first route-map ends if the called RM returns DENY_MATCH, or
continues in other case.
2004-09-13 07:12:46 +02:00
|
|
|
if (gfilter->map[RMAP_IN].name && ! pfilter->map[RMAP_IN].name)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
2004-09-13 Jose Luis Rubio <jrubio@dit.upm.es>
(at Technical University of Madrid as part of Euro6ix Project)
Enhanced Route Server functionality and Route-Maps:
* bgpd/bgpd.h: Modified 'struct peer' and 'struct bgp_filter' to
support rs-clients. A 'struct bgp_table *rib' has been added to the
first (to mantain a separated RIB for each rs-client) and two new
route-maps have been added to the last (for import/export policies).
Added the following #defines: RMAP_{IN|OUT|IMPORT|EXPORT|MAX},
PEER_RMAP_TYPE_{IMPORT|EXPORT} and BGP_CLEAR_SOFT_RSCLIENT.
* bgpd/bgpd.c: Modified the functions that create/delete/etc peers in
order to consider the new fields included in 'struct peer' for
supporting rs-clients, i.e. the import/export route-maps and the
'struct bgp_table'.
* bgpd/bgp_route.{ch}: Modified several functions related with
receiving/sending announces in order to support the new Route Server
capabilities.
Function 'bgp_process' has been reorganized, creating an auxiliar
function for best path selection ('bgp_best_selection').
Modified 'bgp_show' and 'bgp_show_route' for displaying information
about any RIB (and not only the main bgp RIB).
Added commands for displaying information about RS-clients RIBs:
'show bgp rsclient (A.B.C.D|X:X::X:X)', 'show bgp rsclient
(A.B.C.D|X:X::X:X) X:X::X:X/M', etc
* bgpd/bgp_table.{ch}: The structure 'struct bgp_table' now has two
new fields: type (which can take the values BGP_TABLE_{MAIN|RSCLIENT})
and 'void *owner' which points to 'struct bgp' or 'struct peer' which
owns the table.
When creating a new bgp_table by default 'type=BGP_TABLE_MAIN' is set.
* bgpd/bgp_vty.c: The commands 'neighbor ... route-server-client' and
'no neighbor ... route-server-client' now not only set/unset the flag
PEER_FLAG_RSERVER_CLIENT, but they create/destroy the 'struct
bgp_table' of the peer. Special actions are taken for peer_groups.
Command 'neighbor ... route-map WORD (in|out)' now also supports two
new kinds of route-map: 'import' and 'export'.
Added commands 'clear bgp * rsclient', etc. These commands allow a new
kind of soft_reconfig which affects only the RIB of the specified
RS-client.
Added commands 'show bgp rsclient summary', etc which display a
summary of the rs-clients configured for the corresponding address
family.
* bgpd/bgp_routemap.c: A new match statement is available,
'match peer (A.B.C.D|X:X::X:X)'. This statement can only be used in
import/export route-maps, and it matches when the peer who announces
(when used in an import route-map) or is going to receive (when used
in an export route-map) the route is the same than the one specified
in the statement.
For peer-groups the statement matches if the specified peer is member
of the peer-group.
A special version of the command, 'match peer local', matches with
routes originated by the Route Server (defined with 'network ...',
redistributed routes and default-originate).
* lib/routemap.{ch}: Added a new clause 'call NAME' for use in
route-maps. It jumps into the specified route-map and when it returns
the first route-map ends if the called RM returns DENY_MATCH, or
continues in other case.
2004-09-13 07:12:46 +02:00
|
|
|
if (pfilter->map[RMAP_IN].name)
|
|
|
|
free (pfilter->map[RMAP_IN].name);
|
|
|
|
pfilter->map[RMAP_IN].name = strdup (gfilter->map[RMAP_IN].name);
|
|
|
|
pfilter->map[RMAP_IN].map = gfilter->map[RMAP_IN].map;
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/* outbound filter apply */
|
|
|
|
if (gfilter->dlist[out].name)
|
|
|
|
{
|
|
|
|
if (pfilter->dlist[out].name)
|
|
|
|
free (pfilter->dlist[out].name);
|
|
|
|
pfilter->dlist[out].name = strdup (gfilter->dlist[out].name);
|
|
|
|
pfilter->dlist[out].alist = gfilter->dlist[out].alist;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (pfilter->dlist[out].name)
|
|
|
|
free (pfilter->dlist[out].name);
|
|
|
|
pfilter->dlist[out].name = NULL;
|
|
|
|
pfilter->dlist[out].alist = NULL;
|
|
|
|
}
|
|
|
|
if (gfilter->plist[out].name)
|
|
|
|
{
|
|
|
|
if (pfilter->plist[out].name)
|
|
|
|
free (pfilter->plist[out].name);
|
|
|
|
pfilter->plist[out].name = strdup (gfilter->plist[out].name);
|
|
|
|
pfilter->plist[out].plist = gfilter->plist[out].plist;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (pfilter->plist[out].name)
|
|
|
|
free (pfilter->plist[out].name);
|
|
|
|
pfilter->plist[out].name = NULL;
|
|
|
|
pfilter->plist[out].plist = NULL;
|
|
|
|
}
|
|
|
|
if (gfilter->aslist[out].name)
|
|
|
|
{
|
|
|
|
if (pfilter->aslist[out].name)
|
|
|
|
free (pfilter->aslist[out].name);
|
|
|
|
pfilter->aslist[out].name = strdup (gfilter->aslist[out].name);
|
|
|
|
pfilter->aslist[out].aslist = gfilter->aslist[out].aslist;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (pfilter->aslist[out].name)
|
|
|
|
free (pfilter->aslist[out].name);
|
|
|
|
pfilter->aslist[out].name = NULL;
|
|
|
|
pfilter->aslist[out].aslist = NULL;
|
|
|
|
}
|
2004-09-13 Jose Luis Rubio <jrubio@dit.upm.es>
(at Technical University of Madrid as part of Euro6ix Project)
Enhanced Route Server functionality and Route-Maps:
* bgpd/bgpd.h: Modified 'struct peer' and 'struct bgp_filter' to
support rs-clients. A 'struct bgp_table *rib' has been added to the
first (to mantain a separated RIB for each rs-client) and two new
route-maps have been added to the last (for import/export policies).
Added the following #defines: RMAP_{IN|OUT|IMPORT|EXPORT|MAX},
PEER_RMAP_TYPE_{IMPORT|EXPORT} and BGP_CLEAR_SOFT_RSCLIENT.
* bgpd/bgpd.c: Modified the functions that create/delete/etc peers in
order to consider the new fields included in 'struct peer' for
supporting rs-clients, i.e. the import/export route-maps and the
'struct bgp_table'.
* bgpd/bgp_route.{ch}: Modified several functions related with
receiving/sending announces in order to support the new Route Server
capabilities.
Function 'bgp_process' has been reorganized, creating an auxiliar
function for best path selection ('bgp_best_selection').
Modified 'bgp_show' and 'bgp_show_route' for displaying information
about any RIB (and not only the main bgp RIB).
Added commands for displaying information about RS-clients RIBs:
'show bgp rsclient (A.B.C.D|X:X::X:X)', 'show bgp rsclient
(A.B.C.D|X:X::X:X) X:X::X:X/M', etc
* bgpd/bgp_table.{ch}: The structure 'struct bgp_table' now has two
new fields: type (which can take the values BGP_TABLE_{MAIN|RSCLIENT})
and 'void *owner' which points to 'struct bgp' or 'struct peer' which
owns the table.
When creating a new bgp_table by default 'type=BGP_TABLE_MAIN' is set.
* bgpd/bgp_vty.c: The commands 'neighbor ... route-server-client' and
'no neighbor ... route-server-client' now not only set/unset the flag
PEER_FLAG_RSERVER_CLIENT, but they create/destroy the 'struct
bgp_table' of the peer. Special actions are taken for peer_groups.
Command 'neighbor ... route-map WORD (in|out)' now also supports two
new kinds of route-map: 'import' and 'export'.
Added commands 'clear bgp * rsclient', etc. These commands allow a new
kind of soft_reconfig which affects only the RIB of the specified
RS-client.
Added commands 'show bgp rsclient summary', etc which display a
summary of the rs-clients configured for the corresponding address
family.
* bgpd/bgp_routemap.c: A new match statement is available,
'match peer (A.B.C.D|X:X::X:X)'. This statement can only be used in
import/export route-maps, and it matches when the peer who announces
(when used in an import route-map) or is going to receive (when used
in an export route-map) the route is the same than the one specified
in the statement.
For peer-groups the statement matches if the specified peer is member
of the peer-group.
A special version of the command, 'match peer local', matches with
routes originated by the Route Server (defined with 'network ...',
redistributed routes and default-originate).
* lib/routemap.{ch}: Added a new clause 'call NAME' for use in
route-maps. It jumps into the specified route-map and when it returns
the first route-map ends if the called RM returns DENY_MATCH, or
continues in other case.
2004-09-13 07:12:46 +02:00
|
|
|
if (gfilter->map[RMAP_OUT].name)
|
|
|
|
{
|
|
|
|
if (pfilter->map[RMAP_OUT].name)
|
|
|
|
free (pfilter->map[RMAP_OUT].name);
|
|
|
|
pfilter->map[RMAP_OUT].name = strdup (gfilter->map[RMAP_OUT].name);
|
|
|
|
pfilter->map[RMAP_OUT].map = gfilter->map[RMAP_OUT].map;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (pfilter->map[RMAP_OUT].name)
|
|
|
|
free (pfilter->map[RMAP_OUT].name);
|
|
|
|
pfilter->map[RMAP_OUT].name = NULL;
|
|
|
|
pfilter->map[RMAP_OUT].map = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* RS-client's import/export route-maps. */
|
|
|
|
if (gfilter->map[RMAP_IMPORT].name)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
2004-09-13 Jose Luis Rubio <jrubio@dit.upm.es>
(at Technical University of Madrid as part of Euro6ix Project)
Enhanced Route Server functionality and Route-Maps:
* bgpd/bgpd.h: Modified 'struct peer' and 'struct bgp_filter' to
support rs-clients. A 'struct bgp_table *rib' has been added to the
first (to mantain a separated RIB for each rs-client) and two new
route-maps have been added to the last (for import/export policies).
Added the following #defines: RMAP_{IN|OUT|IMPORT|EXPORT|MAX},
PEER_RMAP_TYPE_{IMPORT|EXPORT} and BGP_CLEAR_SOFT_RSCLIENT.
* bgpd/bgpd.c: Modified the functions that create/delete/etc peers in
order to consider the new fields included in 'struct peer' for
supporting rs-clients, i.e. the import/export route-maps and the
'struct bgp_table'.
* bgpd/bgp_route.{ch}: Modified several functions related with
receiving/sending announces in order to support the new Route Server
capabilities.
Function 'bgp_process' has been reorganized, creating an auxiliar
function for best path selection ('bgp_best_selection').
Modified 'bgp_show' and 'bgp_show_route' for displaying information
about any RIB (and not only the main bgp RIB).
Added commands for displaying information about RS-clients RIBs:
'show bgp rsclient (A.B.C.D|X:X::X:X)', 'show bgp rsclient
(A.B.C.D|X:X::X:X) X:X::X:X/M', etc
* bgpd/bgp_table.{ch}: The structure 'struct bgp_table' now has two
new fields: type (which can take the values BGP_TABLE_{MAIN|RSCLIENT})
and 'void *owner' which points to 'struct bgp' or 'struct peer' which
owns the table.
When creating a new bgp_table by default 'type=BGP_TABLE_MAIN' is set.
* bgpd/bgp_vty.c: The commands 'neighbor ... route-server-client' and
'no neighbor ... route-server-client' now not only set/unset the flag
PEER_FLAG_RSERVER_CLIENT, but they create/destroy the 'struct
bgp_table' of the peer. Special actions are taken for peer_groups.
Command 'neighbor ... route-map WORD (in|out)' now also supports two
new kinds of route-map: 'import' and 'export'.
Added commands 'clear bgp * rsclient', etc. These commands allow a new
kind of soft_reconfig which affects only the RIB of the specified
RS-client.
Added commands 'show bgp rsclient summary', etc which display a
summary of the rs-clients configured for the corresponding address
family.
* bgpd/bgp_routemap.c: A new match statement is available,
'match peer (A.B.C.D|X:X::X:X)'. This statement can only be used in
import/export route-maps, and it matches when the peer who announces
(when used in an import route-map) or is going to receive (when used
in an export route-map) the route is the same than the one specified
in the statement.
For peer-groups the statement matches if the specified peer is member
of the peer-group.
A special version of the command, 'match peer local', matches with
routes originated by the Route Server (defined with 'network ...',
redistributed routes and default-originate).
* lib/routemap.{ch}: Added a new clause 'call NAME' for use in
route-maps. It jumps into the specified route-map and when it returns
the first route-map ends if the called RM returns DENY_MATCH, or
continues in other case.
2004-09-13 07:12:46 +02:00
|
|
|
if (pfilter->map[RMAP_IMPORT].name)
|
|
|
|
free (pfilter->map[RMAP_IMPORT].name);
|
|
|
|
pfilter->map[RMAP_IMPORT].name = strdup (gfilter->map[RMAP_IMPORT].name);
|
|
|
|
pfilter->map[RMAP_IMPORT].map = gfilter->map[RMAP_IMPORT].map;
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2004-09-13 Jose Luis Rubio <jrubio@dit.upm.es>
(at Technical University of Madrid as part of Euro6ix Project)
Enhanced Route Server functionality and Route-Maps:
* bgpd/bgpd.h: Modified 'struct peer' and 'struct bgp_filter' to
support rs-clients. A 'struct bgp_table *rib' has been added to the
first (to mantain a separated RIB for each rs-client) and two new
route-maps have been added to the last (for import/export policies).
Added the following #defines: RMAP_{IN|OUT|IMPORT|EXPORT|MAX},
PEER_RMAP_TYPE_{IMPORT|EXPORT} and BGP_CLEAR_SOFT_RSCLIENT.
* bgpd/bgpd.c: Modified the functions that create/delete/etc peers in
order to consider the new fields included in 'struct peer' for
supporting rs-clients, i.e. the import/export route-maps and the
'struct bgp_table'.
* bgpd/bgp_route.{ch}: Modified several functions related with
receiving/sending announces in order to support the new Route Server
capabilities.
Function 'bgp_process' has been reorganized, creating an auxiliar
function for best path selection ('bgp_best_selection').
Modified 'bgp_show' and 'bgp_show_route' for displaying information
about any RIB (and not only the main bgp RIB).
Added commands for displaying information about RS-clients RIBs:
'show bgp rsclient (A.B.C.D|X:X::X:X)', 'show bgp rsclient
(A.B.C.D|X:X::X:X) X:X::X:X/M', etc
* bgpd/bgp_table.{ch}: The structure 'struct bgp_table' now has two
new fields: type (which can take the values BGP_TABLE_{MAIN|RSCLIENT})
and 'void *owner' which points to 'struct bgp' or 'struct peer' which
owns the table.
When creating a new bgp_table by default 'type=BGP_TABLE_MAIN' is set.
* bgpd/bgp_vty.c: The commands 'neighbor ... route-server-client' and
'no neighbor ... route-server-client' now not only set/unset the flag
PEER_FLAG_RSERVER_CLIENT, but they create/destroy the 'struct
bgp_table' of the peer. Special actions are taken for peer_groups.
Command 'neighbor ... route-map WORD (in|out)' now also supports two
new kinds of route-map: 'import' and 'export'.
Added commands 'clear bgp * rsclient', etc. These commands allow a new
kind of soft_reconfig which affects only the RIB of the specified
RS-client.
Added commands 'show bgp rsclient summary', etc which display a
summary of the rs-clients configured for the corresponding address
family.
* bgpd/bgp_routemap.c: A new match statement is available,
'match peer (A.B.C.D|X:X::X:X)'. This statement can only be used in
import/export route-maps, and it matches when the peer who announces
(when used in an import route-map) or is going to receive (when used
in an export route-map) the route is the same than the one specified
in the statement.
For peer-groups the statement matches if the specified peer is member
of the peer-group.
A special version of the command, 'match peer local', matches with
routes originated by the Route Server (defined with 'network ...',
redistributed routes and default-originate).
* lib/routemap.{ch}: Added a new clause 'call NAME' for use in
route-maps. It jumps into the specified route-map and when it returns
the first route-map ends if the called RM returns DENY_MATCH, or
continues in other case.
2004-09-13 07:12:46 +02:00
|
|
|
if (pfilter->map[RMAP_IMPORT].name)
|
|
|
|
free (pfilter->map[RMAP_IMPORT].name);
|
|
|
|
pfilter->map[RMAP_IMPORT].name = NULL;
|
|
|
|
pfilter->map[RMAP_IMPORT].map = NULL;
|
|
|
|
}
|
|
|
|
if (gfilter->map[RMAP_EXPORT].name && ! pfilter->map[RMAP_EXPORT].name)
|
|
|
|
{
|
|
|
|
if (pfilter->map[RMAP_EXPORT].name)
|
|
|
|
free (pfilter->map[RMAP_EXPORT].name);
|
|
|
|
pfilter->map[RMAP_EXPORT].name = strdup (gfilter->map[RMAP_EXPORT].name);
|
|
|
|
pfilter->map[RMAP_EXPORT].map = gfilter->map[RMAP_EXPORT].map;
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if (gfilter->usmap.name)
|
|
|
|
{
|
|
|
|
if (pfilter->usmap.name)
|
|
|
|
free (pfilter->usmap.name);
|
|
|
|
pfilter->usmap.name = strdup (gfilter->usmap.name);
|
|
|
|
pfilter->usmap.map = gfilter->usmap.map;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (pfilter->usmap.name)
|
|
|
|
free (pfilter->usmap.name);
|
|
|
|
pfilter->usmap.name = NULL;
|
|
|
|
pfilter->usmap.map = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Peer group's remote AS configuration. */
|
|
|
|
int
|
2015-05-20 03:04:25 +02:00
|
|
|
peer_group_remote_as (struct bgp *bgp, const char *group_name,
|
|
|
|
as_t *as, int as_type)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
struct peer_group *group;
|
|
|
|
struct peer *peer;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
group = peer_group_lookup (bgp, group_name);
|
|
|
|
if (! group)
|
|
|
|
return -1;
|
|
|
|
|
2015-05-20 03:04:25 +02:00
|
|
|
if ((as_type == group->conf->as_type) && (group->conf->as == *as))
|
2002-12-13 21:15:29 +01:00
|
|
|
return 0;
|
|
|
|
|
2015-05-20 03:04:25 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* When we setup peer-group AS number all peer group member's AS
|
|
|
|
number must be updated to same number. */
|
2015-05-20 03:04:25 +02:00
|
|
|
peer_as_change (group->conf, *as, as_type);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
if (peer->as != *as)
|
2015-05-20 03:04:25 +02:00
|
|
|
peer_as_change (peer, *as, as_type);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
peer_group_delete (struct peer_group *group)
|
|
|
|
{
|
|
|
|
struct bgp *bgp;
|
|
|
|
struct peer *peer;
|
2015-05-20 03:03:47 +02:00
|
|
|
struct prefix *prefix;
|
2015-05-20 02:40:37 +02:00
|
|
|
struct peer *other;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2015-05-20 03:03:47 +02:00
|
|
|
afi_t afi;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
bgp = group->bgp;
|
|
|
|
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
2015-05-20 02:40:37 +02:00
|
|
|
other = peer->doppelganger;
|
2002-12-13 21:15:29 +01:00
|
|
|
peer->group = NULL;
|
|
|
|
peer_delete (peer);
|
2015-05-20 02:40:37 +02:00
|
|
|
if (other && other->status != Deleted)
|
|
|
|
{
|
|
|
|
other->group = NULL;
|
|
|
|
peer_delete(other);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
list_delete (group->peer);
|
|
|
|
|
2015-05-20 03:03:47 +02:00
|
|
|
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
|
|
|
{
|
|
|
|
for (ALL_LIST_ELEMENTS (group->listen_range[afi], node, nnode, prefix))
|
|
|
|
{
|
|
|
|
prefix_free(prefix);
|
|
|
|
}
|
|
|
|
list_delete (group->listen_range[afi]);
|
|
|
|
}
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
free (group->name);
|
|
|
|
group->name = NULL;
|
|
|
|
|
|
|
|
group->conf->group = NULL;
|
|
|
|
peer_delete (group->conf);
|
|
|
|
|
|
|
|
/* Delete from all peer_group list. */
|
|
|
|
listnode_delete (bgp->group, group);
|
|
|
|
|
|
|
|
peer_group_free (group);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
peer_group_remote_as_delete (struct peer_group *group)
|
|
|
|
{
|
2015-05-20 02:40:37 +02:00
|
|
|
struct peer *peer, *other;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2015-05-20 03:04:25 +02:00
|
|
|
if ((group->conf->as_type == AS_UNSPECIFIED) ||
|
|
|
|
((! group->conf->as) && (group->conf->as_type == AS_SPECIFIED)))
|
2002-12-13 21:15:29 +01:00
|
|
|
return 0;
|
|
|
|
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
2015-05-20 02:40:37 +02:00
|
|
|
other = peer->doppelganger;
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
peer->group = NULL;
|
|
|
|
peer_delete (peer);
|
2015-05-20 02:40:37 +02:00
|
|
|
|
|
|
|
if (other && other->status != Deleted)
|
|
|
|
{
|
|
|
|
other->group = NULL;
|
|
|
|
peer_delete(other);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
list_delete_all_node (group->peer);
|
|
|
|
|
|
|
|
group->conf->as = 0;
|
2015-05-20 03:04:25 +02:00
|
|
|
group->conf->as_type = AS_UNSPECIFIED;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2015-05-20 03:03:47 +02:00
|
|
|
int
|
|
|
|
peer_group_listen_range_add (struct peer_group *group, struct prefix *range)
|
|
|
|
{
|
|
|
|
struct prefix *prefix;
|
|
|
|
struct listnode *node, *nnode;
|
|
|
|
afi_t afi;
|
|
|
|
|
|
|
|
afi = family2afi(range->family);
|
|
|
|
|
|
|
|
/* Group needs remote AS configured. */
|
|
|
|
if (! group->conf->as)
|
|
|
|
return BGP_ERR_PEER_GROUP_NO_REMOTE_AS;
|
|
|
|
|
|
|
|
/* Ensure no duplicates. Currently we don't care about overlaps. */
|
|
|
|
for (ALL_LIST_ELEMENTS (group->listen_range[afi], node, nnode, prefix))
|
|
|
|
{
|
|
|
|
if (prefix_same(range, prefix))
|
|
|
|
return BGP_ERR_DYNAMIC_NEIGHBORS_RANGE_EXISTS;
|
|
|
|
}
|
|
|
|
|
|
|
|
prefix = prefix_new();
|
|
|
|
prefix_copy(prefix, range);
|
|
|
|
listnode_add(group->listen_range[afi], prefix);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
peer_group_listen_range_del (struct peer_group *group, struct prefix *range)
|
|
|
|
{
|
|
|
|
struct prefix *prefix, *prefix2;
|
|
|
|
struct listnode *node, *nnode;
|
|
|
|
struct peer *peer;
|
|
|
|
afi_t afi;
|
|
|
|
char buf[SU_ADDRSTRLEN];
|
|
|
|
|
|
|
|
afi = family2afi(range->family);
|
|
|
|
|
|
|
|
/* Identify the listen range. */
|
|
|
|
for (ALL_LIST_ELEMENTS (group->listen_range[afi], node, nnode, prefix))
|
|
|
|
{
|
|
|
|
if (prefix_same(range, prefix))
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!prefix)
|
|
|
|
return BGP_ERR_DYNAMIC_NEIGHBORS_RANGE_NOT_FOUND;
|
|
|
|
|
|
|
|
prefix2str(prefix, buf, sizeof(buf));
|
|
|
|
|
|
|
|
/* Dispose off any dynamic neighbors that exist due to this listen range */
|
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
|
|
|
{
|
|
|
|
if (!peer_dynamic_neighbor (peer))
|
|
|
|
continue;
|
|
|
|
|
|
|
|
prefix2 = sockunion2hostprefix(&peer->su);
|
|
|
|
if (prefix_match(prefix, prefix2))
|
|
|
|
{
|
|
|
|
if (bgp_debug_neighbor_events(peer))
|
|
|
|
zlog_debug ("Deleting dynamic neighbor %s group %s upon "
|
|
|
|
"delete of listen range %s",
|
|
|
|
peer->host, group->name, buf);
|
|
|
|
peer_delete (peer);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Get rid of the listen range */
|
|
|
|
listnode_delete(group->listen_range[afi], prefix);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* Bind specified peer to peer group. */
|
|
|
|
int
|
2015-05-20 02:40:40 +02:00
|
|
|
peer_group_bind (struct bgp *bgp, union sockunion *su, struct peer *peer,
|
2002-12-13 21:15:29 +01:00
|
|
|
struct peer_group *group, afi_t afi, safi_t safi, as_t *as)
|
|
|
|
{
|
|
|
|
int first_member = 0;
|
|
|
|
|
|
|
|
/* Check peer group's address family. */
|
|
|
|
if (! group->conf->afc[afi][safi])
|
|
|
|
return BGP_ERR_PEER_GROUP_AF_UNCONFIGURED;
|
|
|
|
|
|
|
|
/* Lookup the peer. */
|
2015-05-20 02:40:40 +02:00
|
|
|
if (!peer)
|
|
|
|
peer = peer_lookup (bgp, su);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
/* Create a new peer. */
|
|
|
|
if (! peer)
|
|
|
|
{
|
2015-05-20 03:04:25 +02:00
|
|
|
if ((group->conf->as_type == AS_SPECIFIED) && (! group->conf->as)) {
|
2002-12-13 21:15:29 +01:00
|
|
|
return BGP_ERR_PEER_GROUP_NO_REMOTE_AS;
|
2015-05-20 03:04:25 +02:00
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2015-05-20 03:04:25 +02:00
|
|
|
peer = peer_create (su, NULL, bgp, bgp->as, group->conf->as, group->conf->as_type, afi, safi);
|
2002-12-13 21:15:29 +01:00
|
|
|
peer->group = group;
|
|
|
|
peer->af_group[afi][safi] = 1;
|
2005-06-01 Paul Jakma <paul.jakma@sun.com>
* 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
2005-06-01 13:17:05 +02:00
|
|
|
|
[bgpd] Fix 0.99 shutdown regression, introduce Clearing and Deleted states
2006-09-14 Paul Jakma <paul.jakma@sun.com>
* (general) Fix some niggly issues around 'shutdown' and clearing
by adding a Clearing FSM wait-state and a hidden 'Deleted'
FSM state, to allow deleted peers to 'cool off' and hit 0
references. This introduces a slow memory leak of struct peer,
however that's more a testament to the fragility of the
reference counting than a bug in this patch, cleanup of
reference counting to fix this is to follow.
* bgpd.h: Add Clearing, Deleted states and Clearing_Completed
and event.
* bgp_debug.c: (bgp_status_msg[]) Add strings for Clearing and
Deleted.
* bgp_fsm.h: Don't allow timer/event threads to set anything
for Deleted peers.
* bgp_fsm.c: (bgp_timer_set) Add Clearing and Deleted. Deleted
needs to stop everything.
(bgp_stop) Remove explicit fsm_change_status call, the
general framework handles the transition.
(bgp_start) Log a warning if a start is attempted on a peer
that should stay down, trying to start a peer.
(struct .. FSM) Add Clearing_Completed
events, has little influence except when in state
Clearing to signal wait-state can end.
Add Clearing and Deleted states, former is a wait-state,
latter is a placeholder state to allow peers to disappear
quietly once refcounts settle.
(bgp_event) Try reduce verbosity of FSM state-change debug,
changes to same state are not interesting (Established->Established)
Allow NULL action functions in FSM.
* bgp_packet.c: (bgp_write) Use FSM events, rather than trying
to twiddle directly with FSM state behind the back of FSM.
(bgp_write_notify) ditto.
(bgp_read) Remove the vague ACCEPT_PEER peer_unlock, or else
this patch crashes, now it leaks instead.
* bgp_route.c: (bgp_clear_node_complete) Clearing_Completed
event, to end clearing.
(bgp_clear_route) See extensive comments.
* bgpd.c: (peer_free) should only be called while in Deleted,
peer refcounting controls when peer_free is called.
bgp_sync_delete should be here, not in peer_delete.
(peer_delete) Initiate delete.
Transition to Deleted state manually.
When removing peer from indices that provide visibility of it,
take great care to be idempotent wrt the reference counting
of struct peer through those indices.
Use bgp_timer_set, rather than replicating.
Call to bgp_sync_delete isn't appropriate here, sync can be
referenced while shutting down and finishing deletion.
(peer_group_bind) Take care to be idempotent wrt list references
indexing peers.
2006-09-14 04:58:49 +02:00
|
|
|
peer = peer_lock (peer); /* group->peer list reference */
|
2002-12-13 21:15:29 +01:00
|
|
|
listnode_add (group->peer, peer);
|
|
|
|
peer_group2peer_config_copy (group, peer, afi, safi);
|
2015-05-20 02:40:37 +02:00
|
|
|
SET_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* When the peer already belongs to peer group, check the consistency. */
|
|
|
|
if (peer->af_group[afi][safi])
|
|
|
|
{
|
|
|
|
if (strcmp (peer->group->name, group->name) != 0)
|
|
|
|
return BGP_ERR_PEER_GROUP_CANT_CHANGE;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Check current peer group configuration. */
|
|
|
|
if (peer_group_active (peer)
|
|
|
|
&& strcmp (peer->group->name, group->name) != 0)
|
|
|
|
return BGP_ERR_PEER_GROUP_MISMATCH;
|
|
|
|
|
2015-05-20 03:04:25 +02:00
|
|
|
if (peer->as_type == AS_UNSPECIFIED)
|
|
|
|
{
|
|
|
|
peer->as_type = group->conf->as_type;
|
|
|
|
peer->as = group->conf->as;
|
|
|
|
}
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
if (! group->conf->as)
|
|
|
|
{
|
|
|
|
if (peer_sort (group->conf) != BGP_PEER_INTERNAL
|
|
|
|
&& peer_sort (group->conf) != peer_sort (peer))
|
|
|
|
{
|
|
|
|
if (as)
|
|
|
|
*as = peer->as;
|
|
|
|
return BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (peer_sort (group->conf) == BGP_PEER_INTERNAL)
|
|
|
|
first_member = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
peer->af_group[afi][safi] = 1;
|
|
|
|
peer->afc[afi][safi] = 1;
|
2015-05-20 03:03:47 +02:00
|
|
|
if (!peer_af_find(peer, afi, safi) &&
|
|
|
|
peer_af_create(peer, afi, safi) == NULL)
|
|
|
|
{
|
|
|
|
zlog_err("couldn't create af structure for peer %s", peer->host);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
if (! peer->group)
|
|
|
|
{
|
|
|
|
peer->group = group;
|
2005-06-01 Paul Jakma <paul.jakma@sun.com>
* 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
2005-06-01 13:17:05 +02:00
|
|
|
|
[bgpd] Fix 0.99 shutdown regression, introduce Clearing and Deleted states
2006-09-14 Paul Jakma <paul.jakma@sun.com>
* (general) Fix some niggly issues around 'shutdown' and clearing
by adding a Clearing FSM wait-state and a hidden 'Deleted'
FSM state, to allow deleted peers to 'cool off' and hit 0
references. This introduces a slow memory leak of struct peer,
however that's more a testament to the fragility of the
reference counting than a bug in this patch, cleanup of
reference counting to fix this is to follow.
* bgpd.h: Add Clearing, Deleted states and Clearing_Completed
and event.
* bgp_debug.c: (bgp_status_msg[]) Add strings for Clearing and
Deleted.
* bgp_fsm.h: Don't allow timer/event threads to set anything
for Deleted peers.
* bgp_fsm.c: (bgp_timer_set) Add Clearing and Deleted. Deleted
needs to stop everything.
(bgp_stop) Remove explicit fsm_change_status call, the
general framework handles the transition.
(bgp_start) Log a warning if a start is attempted on a peer
that should stay down, trying to start a peer.
(struct .. FSM) Add Clearing_Completed
events, has little influence except when in state
Clearing to signal wait-state can end.
Add Clearing and Deleted states, former is a wait-state,
latter is a placeholder state to allow peers to disappear
quietly once refcounts settle.
(bgp_event) Try reduce verbosity of FSM state-change debug,
changes to same state are not interesting (Established->Established)
Allow NULL action functions in FSM.
* bgp_packet.c: (bgp_write) Use FSM events, rather than trying
to twiddle directly with FSM state behind the back of FSM.
(bgp_write_notify) ditto.
(bgp_read) Remove the vague ACCEPT_PEER peer_unlock, or else
this patch crashes, now it leaks instead.
* bgp_route.c: (bgp_clear_node_complete) Clearing_Completed
event, to end clearing.
(bgp_clear_route) See extensive comments.
* bgpd.c: (peer_free) should only be called while in Deleted,
peer refcounting controls when peer_free is called.
bgp_sync_delete should be here, not in peer_delete.
(peer_delete) Initiate delete.
Transition to Deleted state manually.
When removing peer from indices that provide visibility of it,
take great care to be idempotent wrt the reference counting
of struct peer through those indices.
Use bgp_timer_set, rather than replicating.
Call to bgp_sync_delete isn't appropriate here, sync can be
referenced while shutting down and finishing deletion.
(peer_group_bind) Take care to be idempotent wrt list references
indexing peers.
2006-09-14 04:58:49 +02:00
|
|
|
peer = peer_lock (peer); /* group->peer list reference */
|
2002-12-13 21:15:29 +01:00
|
|
|
listnode_add (group->peer, peer);
|
|
|
|
}
|
[bgpd] Fix 0.99 shutdown regression, introduce Clearing and Deleted states
2006-09-14 Paul Jakma <paul.jakma@sun.com>
* (general) Fix some niggly issues around 'shutdown' and clearing
by adding a Clearing FSM wait-state and a hidden 'Deleted'
FSM state, to allow deleted peers to 'cool off' and hit 0
references. This introduces a slow memory leak of struct peer,
however that's more a testament to the fragility of the
reference counting than a bug in this patch, cleanup of
reference counting to fix this is to follow.
* bgpd.h: Add Clearing, Deleted states and Clearing_Completed
and event.
* bgp_debug.c: (bgp_status_msg[]) Add strings for Clearing and
Deleted.
* bgp_fsm.h: Don't allow timer/event threads to set anything
for Deleted peers.
* bgp_fsm.c: (bgp_timer_set) Add Clearing and Deleted. Deleted
needs to stop everything.
(bgp_stop) Remove explicit fsm_change_status call, the
general framework handles the transition.
(bgp_start) Log a warning if a start is attempted on a peer
that should stay down, trying to start a peer.
(struct .. FSM) Add Clearing_Completed
events, has little influence except when in state
Clearing to signal wait-state can end.
Add Clearing and Deleted states, former is a wait-state,
latter is a placeholder state to allow peers to disappear
quietly once refcounts settle.
(bgp_event) Try reduce verbosity of FSM state-change debug,
changes to same state are not interesting (Established->Established)
Allow NULL action functions in FSM.
* bgp_packet.c: (bgp_write) Use FSM events, rather than trying
to twiddle directly with FSM state behind the back of FSM.
(bgp_write_notify) ditto.
(bgp_read) Remove the vague ACCEPT_PEER peer_unlock, or else
this patch crashes, now it leaks instead.
* bgp_route.c: (bgp_clear_node_complete) Clearing_Completed
event, to end clearing.
(bgp_clear_route) See extensive comments.
* bgpd.c: (peer_free) should only be called while in Deleted,
peer refcounting controls when peer_free is called.
bgp_sync_delete should be here, not in peer_delete.
(peer_delete) Initiate delete.
Transition to Deleted state manually.
When removing peer from indices that provide visibility of it,
take great care to be idempotent wrt the reference counting
of struct peer through those indices.
Use bgp_timer_set, rather than replicating.
Call to bgp_sync_delete isn't appropriate here, sync can be
referenced while shutting down and finishing deletion.
(peer_group_bind) Take care to be idempotent wrt list references
indexing peers.
2006-09-14 04:58:49 +02:00
|
|
|
else
|
|
|
|
assert (group && peer->group == group);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
if (first_member)
|
|
|
|
{
|
|
|
|
/* Advertisement-interval reset */
|
2015-05-20 02:40:35 +02:00
|
|
|
if (! CHECK_FLAG (group->conf->config, PEER_CONFIG_ROUTEADV))
|
2015-05-20 03:12:17 +02:00
|
|
|
{
|
|
|
|
if (peer_sort (group->conf) == BGP_PEER_IBGP)
|
|
|
|
group->conf->v_routeadv = BGP_DEFAULT_IBGP_ROUTEADV;
|
|
|
|
else
|
|
|
|
group->conf->v_routeadv = BGP_DEFAULT_EBGP_ROUTEADV;
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
/* ebgp-multihop reset */
|
|
|
|
if (peer_sort (group->conf) == BGP_PEER_IBGP)
|
|
|
|
group->conf->ttl = 255;
|
|
|
|
|
|
|
|
/* local-as reset */
|
|
|
|
if (peer_sort (group->conf) != BGP_PEER_EBGP)
|
|
|
|
{
|
|
|
|
group->conf->change_local_as = 0;
|
|
|
|
UNSET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND);
|
bgpd: add replace-as modifier for BGP neighbor
Added replace-as modifier for BGP neighbors when using
local-as. If the replace-as modifier is specified, only the
replacement AS as specified by the local-as modifier is
prepended to the AS_PATH, not the process's AS.
In bgp_attr.c, I decided that
if (peer->change_local_as) {
/* If replace-as is specified, we only use the change_local_as when
advertising routes. */
if( ! CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS) ) {
aspath = aspath_add_seq (aspath, peer->local_as);
}
aspath = aspath_add_seq (aspath, peer->change_local_as);
} else {
aspath = aspath_add_seq (aspath, peer->local_as);
}
was clearer than the alternative that didn't duplicate the prepending of the
process's AS:
/* First, append the process local AS unless we have an alternate local_as
* and we're replacing it (as opposed to just prepending it). */
if (! (peer->change_local_as
&& CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS) ) ) {
aspath = aspath_add_seq (aspath, peer->local_as);
}
if (peer->change_local_as)
aspath = aspath_add_seq (aspath, peer->change_local_as);
}
But I could be convinced otherwise.
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
2012-11-08 00:50:07 +01:00
|
|
|
UNSET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
}
|
2004-09-13 Jose Luis Rubio <jrubio@dit.upm.es>
(at Technical University of Madrid as part of Euro6ix Project)
Enhanced Route Server functionality and Route-Maps:
* bgpd/bgpd.h: Modified 'struct peer' and 'struct bgp_filter' to
support rs-clients. A 'struct bgp_table *rib' has been added to the
first (to mantain a separated RIB for each rs-client) and two new
route-maps have been added to the last (for import/export policies).
Added the following #defines: RMAP_{IN|OUT|IMPORT|EXPORT|MAX},
PEER_RMAP_TYPE_{IMPORT|EXPORT} and BGP_CLEAR_SOFT_RSCLIENT.
* bgpd/bgpd.c: Modified the functions that create/delete/etc peers in
order to consider the new fields included in 'struct peer' for
supporting rs-clients, i.e. the import/export route-maps and the
'struct bgp_table'.
* bgpd/bgp_route.{ch}: Modified several functions related with
receiving/sending announces in order to support the new Route Server
capabilities.
Function 'bgp_process' has been reorganized, creating an auxiliar
function for best path selection ('bgp_best_selection').
Modified 'bgp_show' and 'bgp_show_route' for displaying information
about any RIB (and not only the main bgp RIB).
Added commands for displaying information about RS-clients RIBs:
'show bgp rsclient (A.B.C.D|X:X::X:X)', 'show bgp rsclient
(A.B.C.D|X:X::X:X) X:X::X:X/M', etc
* bgpd/bgp_table.{ch}: The structure 'struct bgp_table' now has two
new fields: type (which can take the values BGP_TABLE_{MAIN|RSCLIENT})
and 'void *owner' which points to 'struct bgp' or 'struct peer' which
owns the table.
When creating a new bgp_table by default 'type=BGP_TABLE_MAIN' is set.
* bgpd/bgp_vty.c: The commands 'neighbor ... route-server-client' and
'no neighbor ... route-server-client' now not only set/unset the flag
PEER_FLAG_RSERVER_CLIENT, but they create/destroy the 'struct
bgp_table' of the peer. Special actions are taken for peer_groups.
Command 'neighbor ... route-map WORD (in|out)' now also supports two
new kinds of route-map: 'import' and 'export'.
Added commands 'clear bgp * rsclient', etc. These commands allow a new
kind of soft_reconfig which affects only the RIB of the specified
RS-client.
Added commands 'show bgp rsclient summary', etc which display a
summary of the rs-clients configured for the corresponding address
family.
* bgpd/bgp_routemap.c: A new match statement is available,
'match peer (A.B.C.D|X:X::X:X)'. This statement can only be used in
import/export route-maps, and it matches when the peer who announces
(when used in an import route-map) or is going to receive (when used
in an export route-map) the route is the same than the one specified
in the statement.
For peer-groups the statement matches if the specified peer is member
of the peer-group.
A special version of the command, 'match peer local', matches with
routes originated by the Route Server (defined with 'network ...',
redistributed routes and default-originate).
* lib/routemap.{ch}: Added a new clause 'call NAME' for use in
route-maps. It jumps into the specified route-map and when it returns
the first route-map ends if the called RM returns DENY_MATCH, or
continues in other case.
2004-09-13 07:12:46 +02:00
|
|
|
|
|
|
|
if (CHECK_FLAG(peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
|
|
|
|
{
|
[bgpd] Fix 0.99 shutdown regression, introduce Clearing and Deleted states
2006-09-14 Paul Jakma <paul.jakma@sun.com>
* (general) Fix some niggly issues around 'shutdown' and clearing
by adding a Clearing FSM wait-state and a hidden 'Deleted'
FSM state, to allow deleted peers to 'cool off' and hit 0
references. This introduces a slow memory leak of struct peer,
however that's more a testament to the fragility of the
reference counting than a bug in this patch, cleanup of
reference counting to fix this is to follow.
* bgpd.h: Add Clearing, Deleted states and Clearing_Completed
and event.
* bgp_debug.c: (bgp_status_msg[]) Add strings for Clearing and
Deleted.
* bgp_fsm.h: Don't allow timer/event threads to set anything
for Deleted peers.
* bgp_fsm.c: (bgp_timer_set) Add Clearing and Deleted. Deleted
needs to stop everything.
(bgp_stop) Remove explicit fsm_change_status call, the
general framework handles the transition.
(bgp_start) Log a warning if a start is attempted on a peer
that should stay down, trying to start a peer.
(struct .. FSM) Add Clearing_Completed
events, has little influence except when in state
Clearing to signal wait-state can end.
Add Clearing and Deleted states, former is a wait-state,
latter is a placeholder state to allow peers to disappear
quietly once refcounts settle.
(bgp_event) Try reduce verbosity of FSM state-change debug,
changes to same state are not interesting (Established->Established)
Allow NULL action functions in FSM.
* bgp_packet.c: (bgp_write) Use FSM events, rather than trying
to twiddle directly with FSM state behind the back of FSM.
(bgp_write_notify) ditto.
(bgp_read) Remove the vague ACCEPT_PEER peer_unlock, or else
this patch crashes, now it leaks instead.
* bgp_route.c: (bgp_clear_node_complete) Clearing_Completed
event, to end clearing.
(bgp_clear_route) See extensive comments.
* bgpd.c: (peer_free) should only be called while in Deleted,
peer refcounting controls when peer_free is called.
bgp_sync_delete should be here, not in peer_delete.
(peer_delete) Initiate delete.
Transition to Deleted state manually.
When removing peer from indices that provide visibility of it,
take great care to be idempotent wrt the reference counting
of struct peer through those indices.
Use bgp_timer_set, rather than replicating.
Call to bgp_sync_delete isn't appropriate here, sync can be
referenced while shutting down and finishing deletion.
(peer_group_bind) Take care to be idempotent wrt list references
indexing peers.
2006-09-14 04:58:49 +02:00
|
|
|
struct listnode *pn;
|
|
|
|
|
2004-09-13 Jose Luis Rubio <jrubio@dit.upm.es>
(at Technical University of Madrid as part of Euro6ix Project)
Enhanced Route Server functionality and Route-Maps:
* bgpd/bgpd.h: Modified 'struct peer' and 'struct bgp_filter' to
support rs-clients. A 'struct bgp_table *rib' has been added to the
first (to mantain a separated RIB for each rs-client) and two new
route-maps have been added to the last (for import/export policies).
Added the following #defines: RMAP_{IN|OUT|IMPORT|EXPORT|MAX},
PEER_RMAP_TYPE_{IMPORT|EXPORT} and BGP_CLEAR_SOFT_RSCLIENT.
* bgpd/bgpd.c: Modified the functions that create/delete/etc peers in
order to consider the new fields included in 'struct peer' for
supporting rs-clients, i.e. the import/export route-maps and the
'struct bgp_table'.
* bgpd/bgp_route.{ch}: Modified several functions related with
receiving/sending announces in order to support the new Route Server
capabilities.
Function 'bgp_process' has been reorganized, creating an auxiliar
function for best path selection ('bgp_best_selection').
Modified 'bgp_show' and 'bgp_show_route' for displaying information
about any RIB (and not only the main bgp RIB).
Added commands for displaying information about RS-clients RIBs:
'show bgp rsclient (A.B.C.D|X:X::X:X)', 'show bgp rsclient
(A.B.C.D|X:X::X:X) X:X::X:X/M', etc
* bgpd/bgp_table.{ch}: The structure 'struct bgp_table' now has two
new fields: type (which can take the values BGP_TABLE_{MAIN|RSCLIENT})
and 'void *owner' which points to 'struct bgp' or 'struct peer' which
owns the table.
When creating a new bgp_table by default 'type=BGP_TABLE_MAIN' is set.
* bgpd/bgp_vty.c: The commands 'neighbor ... route-server-client' and
'no neighbor ... route-server-client' now not only set/unset the flag
PEER_FLAG_RSERVER_CLIENT, but they create/destroy the 'struct
bgp_table' of the peer. Special actions are taken for peer_groups.
Command 'neighbor ... route-map WORD (in|out)' now also supports two
new kinds of route-map: 'import' and 'export'.
Added commands 'clear bgp * rsclient', etc. These commands allow a new
kind of soft_reconfig which affects only the RIB of the specified
RS-client.
Added commands 'show bgp rsclient summary', etc which display a
summary of the rs-clients configured for the corresponding address
family.
* bgpd/bgp_routemap.c: A new match statement is available,
'match peer (A.B.C.D|X:X::X:X)'. This statement can only be used in
import/export route-maps, and it matches when the peer who announces
(when used in an import route-map) or is going to receive (when used
in an export route-map) the route is the same than the one specified
in the statement.
For peer-groups the statement matches if the specified peer is member
of the peer-group.
A special version of the command, 'match peer local', matches with
routes originated by the Route Server (defined with 'network ...',
redistributed routes and default-originate).
* lib/routemap.{ch}: Added a new clause 'call NAME' for use in
route-maps. It jumps into the specified route-map and when it returns
the first route-map ends if the called RM returns DENY_MATCH, or
continues in other case.
2004-09-13 07:12:46 +02:00
|
|
|
/* If it's not configured as RSERVER_CLIENT in any other address
|
|
|
|
family, without being member of a peer_group, remove it from
|
|
|
|
list bgp->rsclient.*/
|
[bgpd] Fix 0.99 shutdown regression, introduce Clearing and Deleted states
2006-09-14 Paul Jakma <paul.jakma@sun.com>
* (general) Fix some niggly issues around 'shutdown' and clearing
by adding a Clearing FSM wait-state and a hidden 'Deleted'
FSM state, to allow deleted peers to 'cool off' and hit 0
references. This introduces a slow memory leak of struct peer,
however that's more a testament to the fragility of the
reference counting than a bug in this patch, cleanup of
reference counting to fix this is to follow.
* bgpd.h: Add Clearing, Deleted states and Clearing_Completed
and event.
* bgp_debug.c: (bgp_status_msg[]) Add strings for Clearing and
Deleted.
* bgp_fsm.h: Don't allow timer/event threads to set anything
for Deleted peers.
* bgp_fsm.c: (bgp_timer_set) Add Clearing and Deleted. Deleted
needs to stop everything.
(bgp_stop) Remove explicit fsm_change_status call, the
general framework handles the transition.
(bgp_start) Log a warning if a start is attempted on a peer
that should stay down, trying to start a peer.
(struct .. FSM) Add Clearing_Completed
events, has little influence except when in state
Clearing to signal wait-state can end.
Add Clearing and Deleted states, former is a wait-state,
latter is a placeholder state to allow peers to disappear
quietly once refcounts settle.
(bgp_event) Try reduce verbosity of FSM state-change debug,
changes to same state are not interesting (Established->Established)
Allow NULL action functions in FSM.
* bgp_packet.c: (bgp_write) Use FSM events, rather than trying
to twiddle directly with FSM state behind the back of FSM.
(bgp_write_notify) ditto.
(bgp_read) Remove the vague ACCEPT_PEER peer_unlock, or else
this patch crashes, now it leaks instead.
* bgp_route.c: (bgp_clear_node_complete) Clearing_Completed
event, to end clearing.
(bgp_clear_route) See extensive comments.
* bgpd.c: (peer_free) should only be called while in Deleted,
peer refcounting controls when peer_free is called.
bgp_sync_delete should be here, not in peer_delete.
(peer_delete) Initiate delete.
Transition to Deleted state manually.
When removing peer from indices that provide visibility of it,
take great care to be idempotent wrt the reference counting
of struct peer through those indices.
Use bgp_timer_set, rather than replicating.
Call to bgp_sync_delete isn't appropriate here, sync can be
referenced while shutting down and finishing deletion.
(peer_group_bind) Take care to be idempotent wrt list references
indexing peers.
2006-09-14 04:58:49 +02:00
|
|
|
if (! peer_rsclient_active (peer)
|
|
|
|
&& (pn = listnode_lookup (bgp->rsclient, peer)))
|
2005-06-01 Paul Jakma <paul.jakma@sun.com>
* 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
2005-06-01 13:17:05 +02:00
|
|
|
{
|
|
|
|
peer_unlock (peer); /* peer rsclient reference */
|
[bgpd] Fix 0.99 shutdown regression, introduce Clearing and Deleted states
2006-09-14 Paul Jakma <paul.jakma@sun.com>
* (general) Fix some niggly issues around 'shutdown' and clearing
by adding a Clearing FSM wait-state and a hidden 'Deleted'
FSM state, to allow deleted peers to 'cool off' and hit 0
references. This introduces a slow memory leak of struct peer,
however that's more a testament to the fragility of the
reference counting than a bug in this patch, cleanup of
reference counting to fix this is to follow.
* bgpd.h: Add Clearing, Deleted states and Clearing_Completed
and event.
* bgp_debug.c: (bgp_status_msg[]) Add strings for Clearing and
Deleted.
* bgp_fsm.h: Don't allow timer/event threads to set anything
for Deleted peers.
* bgp_fsm.c: (bgp_timer_set) Add Clearing and Deleted. Deleted
needs to stop everything.
(bgp_stop) Remove explicit fsm_change_status call, the
general framework handles the transition.
(bgp_start) Log a warning if a start is attempted on a peer
that should stay down, trying to start a peer.
(struct .. FSM) Add Clearing_Completed
events, has little influence except when in state
Clearing to signal wait-state can end.
Add Clearing and Deleted states, former is a wait-state,
latter is a placeholder state to allow peers to disappear
quietly once refcounts settle.
(bgp_event) Try reduce verbosity of FSM state-change debug,
changes to same state are not interesting (Established->Established)
Allow NULL action functions in FSM.
* bgp_packet.c: (bgp_write) Use FSM events, rather than trying
to twiddle directly with FSM state behind the back of FSM.
(bgp_write_notify) ditto.
(bgp_read) Remove the vague ACCEPT_PEER peer_unlock, or else
this patch crashes, now it leaks instead.
* bgp_route.c: (bgp_clear_node_complete) Clearing_Completed
event, to end clearing.
(bgp_clear_route) See extensive comments.
* bgpd.c: (peer_free) should only be called while in Deleted,
peer refcounting controls when peer_free is called.
bgp_sync_delete should be here, not in peer_delete.
(peer_delete) Initiate delete.
Transition to Deleted state manually.
When removing peer from indices that provide visibility of it,
take great care to be idempotent wrt the reference counting
of struct peer through those indices.
Use bgp_timer_set, rather than replicating.
Call to bgp_sync_delete isn't appropriate here, sync can be
referenced while shutting down and finishing deletion.
(peer_group_bind) Take care to be idempotent wrt list references
indexing peers.
2006-09-14 04:58:49 +02:00
|
|
|
list_delete_node (bgp->rsclient, pn);
|
[bgpd] Stability fixes including bugs 397, 492
I've spent the last several weeks working on stability fixes to bgpd.
These patches fix all of the numerous crashes, assertion failures, memory
leaks and memory stomping I could find. Valgrind was used extensively.
Added new function bgp_exit() to help catch problems. If "debug bgp" is
configured and bgpd exits with status of 0, statistics on remaining
lib/memory.c allocations are printed to stderr. It is my hope that other
developers will use this to stay on top of memory issues.
Example questionable exit:
bgpd: memstats: Current memory utilization in module LIB:
bgpd: memstats: Link List : 6
bgpd: memstats: Link Node : 5
bgpd: memstats: Hash : 8
bgpd: memstats: Hash Bucket : 2
bgpd: memstats: Hash Index : 8
bgpd: memstats: Work queue : 3
bgpd: memstats: Work queue item : 2
bgpd: memstats: Work queue name string : 3
bgpd: memstats: Current memory utilization in module BGP:
bgpd: memstats: BGP instance : 1
bgpd: memstats: BGP peer : 1
bgpd: memstats: BGP peer hostname : 1
bgpd: memstats: BGP attribute : 1
bgpd: memstats: BGP extra attributes : 1
bgpd: memstats: BGP aspath : 1
bgpd: memstats: BGP aspath str : 1
bgpd: memstats: BGP table : 24
bgpd: memstats: BGP node : 1
bgpd: memstats: BGP route : 1
bgpd: memstats: BGP synchronise : 8
bgpd: memstats: BGP Process queue : 1
bgpd: memstats: BGP node clear queue : 1
bgpd: memstats: NOTE: If configuration exists, utilization may be expected.
Example clean exit:
bgpd: memstats: No remaining tracked memory utilization.
This patch fixes bug #397: "Invalid free in bgp_announce_check()".
This patch fixes bug #492: "SIGBUS in bgpd/bgp_route.c:
bgp_clear_route_node()".
My apologies for not separating out these changes into individual patches.
The complexity of doing so boggled what is left of my brain. I hope this
is all still useful to the community.
This code has been production tested, in non-route-server-client mode, on
a linux 32-bit box and a 64-bit box.
Release/reset functions, used by bgp_exit(), added to:
bgpd/bgp_attr.c,h
bgpd/bgp_community.c,h
bgpd/bgp_dump.c,h
bgpd/bgp_ecommunity.c,h
bgpd/bgp_filter.c,h
bgpd/bgp_nexthop.c,h
bgpd/bgp_route.c,h
lib/routemap.c,h
File by file analysis:
* bgpd/bgp_aspath.c: Prevent re-use of ashash after it is released.
* bgpd/bgp_attr.c: #if removed uncalled cluster_dup().
* bgpd/bgp_clist.c,h: Allow community_list_terminate() to be called from
bgp_exit().
* bgpd/bgp_filter.c: Fix aslist->name use without allocation check, and
also fix memory leak.
* bgpd/bgp_main.c: Created bgp_exit() exit routine. This function frees
allocations made as part of bgpd initialization and, to some extent,
configuration. If "debug bgp" is configured, memory stats are printed
as described above.
* bgpd/bgp_nexthop.c: zclient_new() already allocates stream for
ibuf/obuf, so bgp_scan_init() shouldn't do it too. Also, made it so
zlookup is global so bgp_exit() can use it.
* bgpd/bgp_packet.c: bgp_capability_msg_parse() call to bgp_clear_route()
adjusted to use new BGP_CLEAR_ROUTE_NORMAL flag.
* bgpd/bgp_route.h: Correct reference counter "lock" to be signed.
bgp_clear_route() now accepts a bgp_clear_route_type of either
BGP_CLEAR_ROUTE_NORMAL or BGP_CLEAR_ROUTE_MY_RSCLIENT.
* bgpd/bgp_route.c:
- bgp_process_rsclient(): attr was being zero'ed and then
bgp_attr_extra_free() was being called with it, even though it was
never filled with valid data.
- bgp_process_rsclient(): Make sure rsclient->group is not NULL before
use.
- bgp_processq_del(): Add call to bgp_table_unlock().
- bgp_process(): Add call to bgp_table_lock().
- bgp_update_rsclient(): memset clearing of new_attr not needed since
declarationw with "= { 0 }" does it. memset was already commented
out.
- bgp_update_rsclient(): Fix screwed up misleading indentation.
- bgp_withdraw_rsclient(): Fix screwed up misleading indentation.
- bgp_clear_route_node(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT.
- bgp_clear_node_queue_del(): Add call to bgp_table_unlock() and also
free struct bgp_clear_node_queue used for work item.
- bgp_clear_node_complete(): Do peer_unlock() after BGP_EVENT_ADD() in
case peer is released by peer_unlock() call.
- bgp_clear_route_table(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT. Use
struct bgp_clear_node_queue to supply data to worker. Add call to
bgp_table_lock().
- bgp_clear_route(): Add support for BGP_CLEAR_ROUTE_NORMAL or
BGP_CLEAR_ROUTE_MY_RSCLIENT.
- bgp_clear_route_all(): Use BGP_CLEAR_ROUTE_NORMAL.
Bug 397 fixes:
- bgp_default_originate()
- bgp_announce_table()
* bgpd/bgp_table.h:
- struct bgp_table: Added reference count. Changed type of owner to be
"struct peer *" rather than "void *".
- struct bgp_node: Correct reference counter "lock" to be signed.
* bgpd/bgp_table.c:
- Added bgp_table reference counting.
- bgp_table_free(): Fixed cleanup code. Call peer_unlock() on owner if
set.
- bgp_unlock_node(): Added assertion.
- bgp_node_get(): Added call to bgp_lock_node() to code path that it was
missing from.
* bgpd/bgp_vty.c:
- peer_rsclient_set_vty(): Call peer_lock() as part of peer assignment
to owner. Handle failure gracefully.
- peer_rsclient_unset_vty(): Add call to bgp_clear_route() with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
* bgpd/bgp_zebra.c: Made it so zclient is global so bgp_exit() can use it.
* bgpd/bgpd.c:
- peer_lock(): Allow to be called when status is "Deleted".
- peer_deactivate(): Supply BGP_CLEAR_ROUTE_NORMAL purpose to
bgp_clear_route() call.
- peer_delete(): Common variable listnode pn. Fix bug in which rsclient
was only dealt with if not part of a peer group. Call
bgp_clear_route() for rsclient, if appropriate, and do so with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
- peer_group_get(): Use XSTRDUP() instead of strdup() for conf->host.
- peer_group_bind(): Call bgp_clear_route() for rsclient, and do so with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
- bgp_create(): Use XSTRDUP() instead of strdup() for peer_self->host.
- bgp_delete(): Delete peers before groups, rather than after. And then
rather than deleting rsclients, verify that there are none at this
point.
- bgp_unlock(): Add assertion.
- bgp_free(): Call bgp_table_finish() rather than doing XFREE() itself.
* lib/command.c,h: Compiler warning fixes. Add cmd_terminate(). Fixed
massive leak in install_element() in which cmd_make_descvec() was being
called more than once for the same cmd->strvec/string/doc.
* lib/log.c: Make closezlog() check fp before calling fclose().
* lib/memory.c: Catch when alloc count goes negative by using signed
counts. Correct #endif comment. Add log_memstats_stderr().
* lib/memory.h: Add log_memstats_stderr().
* lib/thread.c: thread->funcname was being accessed in thread_call() after
it had been freed. Rearranged things so that thread_call() frees
funcname. Also made it so thread_master_free() cleans up cpu_record.
* lib/vty.c,h: Use global command_cr. Add vty_terminate().
* lib/zclient.c,h: Re-enable zclient_free().
2009-07-18 07:44:03 +02:00
|
|
|
|
|
|
|
/* Clear our own rsclient rib for this afi/safi. */
|
|
|
|
bgp_clear_route (peer, afi, safi, BGP_CLEAR_ROUTE_MY_RSCLIENT);
|
2005-06-01 Paul Jakma <paul.jakma@sun.com>
* 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
2005-06-01 13:17:05 +02:00
|
|
|
}
|
2004-09-13 Jose Luis Rubio <jrubio@dit.upm.es>
(at Technical University of Madrid as part of Euro6ix Project)
Enhanced Route Server functionality and Route-Maps:
* bgpd/bgpd.h: Modified 'struct peer' and 'struct bgp_filter' to
support rs-clients. A 'struct bgp_table *rib' has been added to the
first (to mantain a separated RIB for each rs-client) and two new
route-maps have been added to the last (for import/export policies).
Added the following #defines: RMAP_{IN|OUT|IMPORT|EXPORT|MAX},
PEER_RMAP_TYPE_{IMPORT|EXPORT} and BGP_CLEAR_SOFT_RSCLIENT.
* bgpd/bgpd.c: Modified the functions that create/delete/etc peers in
order to consider the new fields included in 'struct peer' for
supporting rs-clients, i.e. the import/export route-maps and the
'struct bgp_table'.
* bgpd/bgp_route.{ch}: Modified several functions related with
receiving/sending announces in order to support the new Route Server
capabilities.
Function 'bgp_process' has been reorganized, creating an auxiliar
function for best path selection ('bgp_best_selection').
Modified 'bgp_show' and 'bgp_show_route' for displaying information
about any RIB (and not only the main bgp RIB).
Added commands for displaying information about RS-clients RIBs:
'show bgp rsclient (A.B.C.D|X:X::X:X)', 'show bgp rsclient
(A.B.C.D|X:X::X:X) X:X::X:X/M', etc
* bgpd/bgp_table.{ch}: The structure 'struct bgp_table' now has two
new fields: type (which can take the values BGP_TABLE_{MAIN|RSCLIENT})
and 'void *owner' which points to 'struct bgp' or 'struct peer' which
owns the table.
When creating a new bgp_table by default 'type=BGP_TABLE_MAIN' is set.
* bgpd/bgp_vty.c: The commands 'neighbor ... route-server-client' and
'no neighbor ... route-server-client' now not only set/unset the flag
PEER_FLAG_RSERVER_CLIENT, but they create/destroy the 'struct
bgp_table' of the peer. Special actions are taken for peer_groups.
Command 'neighbor ... route-map WORD (in|out)' now also supports two
new kinds of route-map: 'import' and 'export'.
Added commands 'clear bgp * rsclient', etc. These commands allow a new
kind of soft_reconfig which affects only the RIB of the specified
RS-client.
Added commands 'show bgp rsclient summary', etc which display a
summary of the rs-clients configured for the corresponding address
family.
* bgpd/bgp_routemap.c: A new match statement is available,
'match peer (A.B.C.D|X:X::X:X)'. This statement can only be used in
import/export route-maps, and it matches when the peer who announces
(when used in an import route-map) or is going to receive (when used
in an export route-map) the route is the same than the one specified
in the statement.
For peer-groups the statement matches if the specified peer is member
of the peer-group.
A special version of the command, 'match peer local', matches with
routes originated by the Route Server (defined with 'network ...',
redistributed routes and default-originate).
* lib/routemap.{ch}: Added a new clause 'call NAME' for use in
route-maps. It jumps into the specified route-map and when it returns
the first route-map ends if the called RM returns DENY_MATCH, or
continues in other case.
2004-09-13 07:12:46 +02:00
|
|
|
|
2008-07-02 04:12:07 +02:00
|
|
|
bgp_table_finish (&peer->rib[afi][safi]);
|
2004-09-13 Jose Luis Rubio <jrubio@dit.upm.es>
(at Technical University of Madrid as part of Euro6ix Project)
Enhanced Route Server functionality and Route-Maps:
* bgpd/bgpd.h: Modified 'struct peer' and 'struct bgp_filter' to
support rs-clients. A 'struct bgp_table *rib' has been added to the
first (to mantain a separated RIB for each rs-client) and two new
route-maps have been added to the last (for import/export policies).
Added the following #defines: RMAP_{IN|OUT|IMPORT|EXPORT|MAX},
PEER_RMAP_TYPE_{IMPORT|EXPORT} and BGP_CLEAR_SOFT_RSCLIENT.
* bgpd/bgpd.c: Modified the functions that create/delete/etc peers in
order to consider the new fields included in 'struct peer' for
supporting rs-clients, i.e. the import/export route-maps and the
'struct bgp_table'.
* bgpd/bgp_route.{ch}: Modified several functions related with
receiving/sending announces in order to support the new Route Server
capabilities.
Function 'bgp_process' has been reorganized, creating an auxiliar
function for best path selection ('bgp_best_selection').
Modified 'bgp_show' and 'bgp_show_route' for displaying information
about any RIB (and not only the main bgp RIB).
Added commands for displaying information about RS-clients RIBs:
'show bgp rsclient (A.B.C.D|X:X::X:X)', 'show bgp rsclient
(A.B.C.D|X:X::X:X) X:X::X:X/M', etc
* bgpd/bgp_table.{ch}: The structure 'struct bgp_table' now has two
new fields: type (which can take the values BGP_TABLE_{MAIN|RSCLIENT})
and 'void *owner' which points to 'struct bgp' or 'struct peer' which
owns the table.
When creating a new bgp_table by default 'type=BGP_TABLE_MAIN' is set.
* bgpd/bgp_vty.c: The commands 'neighbor ... route-server-client' and
'no neighbor ... route-server-client' now not only set/unset the flag
PEER_FLAG_RSERVER_CLIENT, but they create/destroy the 'struct
bgp_table' of the peer. Special actions are taken for peer_groups.
Command 'neighbor ... route-map WORD (in|out)' now also supports two
new kinds of route-map: 'import' and 'export'.
Added commands 'clear bgp * rsclient', etc. These commands allow a new
kind of soft_reconfig which affects only the RIB of the specified
RS-client.
Added commands 'show bgp rsclient summary', etc which display a
summary of the rs-clients configured for the corresponding address
family.
* bgpd/bgp_routemap.c: A new match statement is available,
'match peer (A.B.C.D|X:X::X:X)'. This statement can only be used in
import/export route-maps, and it matches when the peer who announces
(when used in an import route-map) or is going to receive (when used
in an export route-map) the route is the same than the one specified
in the statement.
For peer-groups the statement matches if the specified peer is member
of the peer-group.
A special version of the command, 'match peer local', matches with
routes originated by the Route Server (defined with 'network ...',
redistributed routes and default-originate).
* lib/routemap.{ch}: Added a new clause 'call NAME' for use in
route-maps. It jumps into the specified route-map and when it returns
the first route-map ends if the called RM returns DENY_MATCH, or
continues in other case.
2004-09-13 07:12:46 +02:00
|
|
|
|
|
|
|
/* Import policy. */
|
|
|
|
if (peer->filter[afi][safi].map[RMAP_IMPORT].name)
|
|
|
|
{
|
|
|
|
free (peer->filter[afi][safi].map[RMAP_IMPORT].name);
|
|
|
|
peer->filter[afi][safi].map[RMAP_IMPORT].name = NULL;
|
|
|
|
peer->filter[afi][safi].map[RMAP_IMPORT].map = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Export policy. */
|
|
|
|
if (! CHECK_FLAG(group->conf->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT)
|
|
|
|
&& peer->filter[afi][safi].map[RMAP_EXPORT].name)
|
|
|
|
{
|
|
|
|
free (peer->filter[afi][safi].map[RMAP_EXPORT].name);
|
|
|
|
peer->filter[afi][safi].map[RMAP_EXPORT].name = NULL;
|
|
|
|
peer->filter[afi][safi].map[RMAP_EXPORT].map = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
peer_group2peer_config_copy (group, peer, afi, safi);
|
2015-05-20 02:40:37 +02:00
|
|
|
SET_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2013-10-02 12:40:20 +02:00
|
|
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
|
2004-05-20 11:19:34 +02:00
|
|
|
{
|
|
|
|
peer->last_reset = PEER_DOWN_RMAP_BIND;
|
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE,
|
|
|
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
else
|
2015-05-20 02:40:37 +02:00
|
|
|
bgp_session_reset(peer);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
peer_group_unbind (struct bgp *bgp, struct peer *peer,
|
|
|
|
struct peer_group *group, afi_t afi, safi_t safi)
|
|
|
|
{
|
2015-05-20 02:40:37 +02:00
|
|
|
struct peer *other;
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
if (! peer->af_group[afi][safi])
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
if (group != peer->group)
|
|
|
|
return BGP_ERR_PEER_GROUP_MISMATCH;
|
|
|
|
|
|
|
|
peer->af_group[afi][safi] = 0;
|
|
|
|
peer->afc[afi][safi] = 0;
|
|
|
|
peer_af_flag_reset (peer, afi, safi);
|
2015-05-20 03:03:47 +02:00
|
|
|
if (peer_af_delete(peer, afi, safi) != 0)
|
|
|
|
{
|
|
|
|
zlog_err("couldn't delete af structure for peer %s", peer->host);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2004-09-13 Jose Luis Rubio <jrubio@dit.upm.es>
(at Technical University of Madrid as part of Euro6ix Project)
Enhanced Route Server functionality and Route-Maps:
* bgpd/bgpd.h: Modified 'struct peer' and 'struct bgp_filter' to
support rs-clients. A 'struct bgp_table *rib' has been added to the
first (to mantain a separated RIB for each rs-client) and two new
route-maps have been added to the last (for import/export policies).
Added the following #defines: RMAP_{IN|OUT|IMPORT|EXPORT|MAX},
PEER_RMAP_TYPE_{IMPORT|EXPORT} and BGP_CLEAR_SOFT_RSCLIENT.
* bgpd/bgpd.c: Modified the functions that create/delete/etc peers in
order to consider the new fields included in 'struct peer' for
supporting rs-clients, i.e. the import/export route-maps and the
'struct bgp_table'.
* bgpd/bgp_route.{ch}: Modified several functions related with
receiving/sending announces in order to support the new Route Server
capabilities.
Function 'bgp_process' has been reorganized, creating an auxiliar
function for best path selection ('bgp_best_selection').
Modified 'bgp_show' and 'bgp_show_route' for displaying information
about any RIB (and not only the main bgp RIB).
Added commands for displaying information about RS-clients RIBs:
'show bgp rsclient (A.B.C.D|X:X::X:X)', 'show bgp rsclient
(A.B.C.D|X:X::X:X) X:X::X:X/M', etc
* bgpd/bgp_table.{ch}: The structure 'struct bgp_table' now has two
new fields: type (which can take the values BGP_TABLE_{MAIN|RSCLIENT})
and 'void *owner' which points to 'struct bgp' or 'struct peer' which
owns the table.
When creating a new bgp_table by default 'type=BGP_TABLE_MAIN' is set.
* bgpd/bgp_vty.c: The commands 'neighbor ... route-server-client' and
'no neighbor ... route-server-client' now not only set/unset the flag
PEER_FLAG_RSERVER_CLIENT, but they create/destroy the 'struct
bgp_table' of the peer. Special actions are taken for peer_groups.
Command 'neighbor ... route-map WORD (in|out)' now also supports two
new kinds of route-map: 'import' and 'export'.
Added commands 'clear bgp * rsclient', etc. These commands allow a new
kind of soft_reconfig which affects only the RIB of the specified
RS-client.
Added commands 'show bgp rsclient summary', etc which display a
summary of the rs-clients configured for the corresponding address
family.
* bgpd/bgp_routemap.c: A new match statement is available,
'match peer (A.B.C.D|X:X::X:X)'. This statement can only be used in
import/export route-maps, and it matches when the peer who announces
(when used in an import route-map) or is going to receive (when used
in an export route-map) the route is the same than the one specified
in the statement.
For peer-groups the statement matches if the specified peer is member
of the peer-group.
A special version of the command, 'match peer local', matches with
routes originated by the Route Server (defined with 'network ...',
redistributed routes and default-originate).
* lib/routemap.{ch}: Added a new clause 'call NAME' for use in
route-maps. It jumps into the specified route-map and when it returns
the first route-map ends if the called RM returns DENY_MATCH, or
continues in other case.
2004-09-13 07:12:46 +02:00
|
|
|
if (peer->rib[afi][safi])
|
|
|
|
peer->rib[afi][safi] = NULL;
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
if (! peer_group_active (peer))
|
|
|
|
{
|
[bgpd] Fix 0.99 shutdown regression, introduce Clearing and Deleted states
2006-09-14 Paul Jakma <paul.jakma@sun.com>
* (general) Fix some niggly issues around 'shutdown' and clearing
by adding a Clearing FSM wait-state and a hidden 'Deleted'
FSM state, to allow deleted peers to 'cool off' and hit 0
references. This introduces a slow memory leak of struct peer,
however that's more a testament to the fragility of the
reference counting than a bug in this patch, cleanup of
reference counting to fix this is to follow.
* bgpd.h: Add Clearing, Deleted states and Clearing_Completed
and event.
* bgp_debug.c: (bgp_status_msg[]) Add strings for Clearing and
Deleted.
* bgp_fsm.h: Don't allow timer/event threads to set anything
for Deleted peers.
* bgp_fsm.c: (bgp_timer_set) Add Clearing and Deleted. Deleted
needs to stop everything.
(bgp_stop) Remove explicit fsm_change_status call, the
general framework handles the transition.
(bgp_start) Log a warning if a start is attempted on a peer
that should stay down, trying to start a peer.
(struct .. FSM) Add Clearing_Completed
events, has little influence except when in state
Clearing to signal wait-state can end.
Add Clearing and Deleted states, former is a wait-state,
latter is a placeholder state to allow peers to disappear
quietly once refcounts settle.
(bgp_event) Try reduce verbosity of FSM state-change debug,
changes to same state are not interesting (Established->Established)
Allow NULL action functions in FSM.
* bgp_packet.c: (bgp_write) Use FSM events, rather than trying
to twiddle directly with FSM state behind the back of FSM.
(bgp_write_notify) ditto.
(bgp_read) Remove the vague ACCEPT_PEER peer_unlock, or else
this patch crashes, now it leaks instead.
* bgp_route.c: (bgp_clear_node_complete) Clearing_Completed
event, to end clearing.
(bgp_clear_route) See extensive comments.
* bgpd.c: (peer_free) should only be called while in Deleted,
peer refcounting controls when peer_free is called.
bgp_sync_delete should be here, not in peer_delete.
(peer_delete) Initiate delete.
Transition to Deleted state manually.
When removing peer from indices that provide visibility of it,
take great care to be idempotent wrt the reference counting
of struct peer through those indices.
Use bgp_timer_set, rather than replicating.
Call to bgp_sync_delete isn't appropriate here, sync can be
referenced while shutting down and finishing deletion.
(peer_group_bind) Take care to be idempotent wrt list references
indexing peers.
2006-09-14 04:58:49 +02:00
|
|
|
assert (listnode_lookup (group->peer, peer));
|
2005-06-01 Paul Jakma <paul.jakma@sun.com>
* 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
2005-06-01 13:17:05 +02:00
|
|
|
peer_unlock (peer); /* peer group list reference */
|
2002-12-13 21:15:29 +01:00
|
|
|
listnode_delete (group->peer, peer);
|
|
|
|
peer->group = NULL;
|
2015-05-20 02:40:37 +02:00
|
|
|
other = peer->doppelganger;
|
2002-12-13 21:15:29 +01:00
|
|
|
if (group->conf->as)
|
|
|
|
{
|
|
|
|
peer_delete (peer);
|
2015-05-20 02:40:37 +02:00
|
|
|
if (other && other->status != Deleted)
|
|
|
|
{
|
|
|
|
if (other->group)
|
|
|
|
{
|
|
|
|
peer_unlock(other);
|
|
|
|
listnode_delete(group->peer, other);
|
|
|
|
}
|
|
|
|
other->group = NULL;
|
|
|
|
peer_delete(other);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
peer_global_config_reset (peer);
|
|
|
|
}
|
|
|
|
|
2013-10-02 12:40:20 +02:00
|
|
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
|
2004-05-20 11:19:34 +02:00
|
|
|
{
|
|
|
|
peer->last_reset = PEER_DOWN_RMAP_UNBIND;
|
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE,
|
|
|
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
else
|
2015-05-20 02:40:37 +02:00
|
|
|
bgp_session_reset(peer);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2015-05-20 02:40:32 +02:00
|
|
|
static int
|
|
|
|
bgp_startup_timer_expire (struct thread *thread)
|
|
|
|
{
|
|
|
|
struct bgp *bgp;
|
|
|
|
|
|
|
|
bgp = THREAD_ARG (thread);
|
|
|
|
bgp->t_startup = NULL;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* BGP instance creation by `router bgp' commands. */
|
2005-06-28 14:44:16 +02:00
|
|
|
static struct bgp *
|
2004-10-13 07:06:08 +02:00
|
|
|
bgp_create (as_t *as, const char *name)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
struct bgp *bgp;
|
|
|
|
afi_t afi;
|
|
|
|
safi_t safi;
|
|
|
|
|
2005-06-01 Paul Jakma <paul.jakma@sun.com>
* 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
2005-06-01 13:17:05 +02:00
|
|
|
if ( (bgp = XCALLOC (MTYPE_BGP, sizeof (struct bgp))) == NULL)
|
|
|
|
return NULL;
|
|
|
|
|
2009-05-21 17:51:03 +02:00
|
|
|
bgp_lock (bgp);
|
2006-10-22 21:13:07 +02:00
|
|
|
bgp->peer_self = peer_new (bgp);
|
[bgpd] Stability fixes including bugs 397, 492
I've spent the last several weeks working on stability fixes to bgpd.
These patches fix all of the numerous crashes, assertion failures, memory
leaks and memory stomping I could find. Valgrind was used extensively.
Added new function bgp_exit() to help catch problems. If "debug bgp" is
configured and bgpd exits with status of 0, statistics on remaining
lib/memory.c allocations are printed to stderr. It is my hope that other
developers will use this to stay on top of memory issues.
Example questionable exit:
bgpd: memstats: Current memory utilization in module LIB:
bgpd: memstats: Link List : 6
bgpd: memstats: Link Node : 5
bgpd: memstats: Hash : 8
bgpd: memstats: Hash Bucket : 2
bgpd: memstats: Hash Index : 8
bgpd: memstats: Work queue : 3
bgpd: memstats: Work queue item : 2
bgpd: memstats: Work queue name string : 3
bgpd: memstats: Current memory utilization in module BGP:
bgpd: memstats: BGP instance : 1
bgpd: memstats: BGP peer : 1
bgpd: memstats: BGP peer hostname : 1
bgpd: memstats: BGP attribute : 1
bgpd: memstats: BGP extra attributes : 1
bgpd: memstats: BGP aspath : 1
bgpd: memstats: BGP aspath str : 1
bgpd: memstats: BGP table : 24
bgpd: memstats: BGP node : 1
bgpd: memstats: BGP route : 1
bgpd: memstats: BGP synchronise : 8
bgpd: memstats: BGP Process queue : 1
bgpd: memstats: BGP node clear queue : 1
bgpd: memstats: NOTE: If configuration exists, utilization may be expected.
Example clean exit:
bgpd: memstats: No remaining tracked memory utilization.
This patch fixes bug #397: "Invalid free in bgp_announce_check()".
This patch fixes bug #492: "SIGBUS in bgpd/bgp_route.c:
bgp_clear_route_node()".
My apologies for not separating out these changes into individual patches.
The complexity of doing so boggled what is left of my brain. I hope this
is all still useful to the community.
This code has been production tested, in non-route-server-client mode, on
a linux 32-bit box and a 64-bit box.
Release/reset functions, used by bgp_exit(), added to:
bgpd/bgp_attr.c,h
bgpd/bgp_community.c,h
bgpd/bgp_dump.c,h
bgpd/bgp_ecommunity.c,h
bgpd/bgp_filter.c,h
bgpd/bgp_nexthop.c,h
bgpd/bgp_route.c,h
lib/routemap.c,h
File by file analysis:
* bgpd/bgp_aspath.c: Prevent re-use of ashash after it is released.
* bgpd/bgp_attr.c: #if removed uncalled cluster_dup().
* bgpd/bgp_clist.c,h: Allow community_list_terminate() to be called from
bgp_exit().
* bgpd/bgp_filter.c: Fix aslist->name use without allocation check, and
also fix memory leak.
* bgpd/bgp_main.c: Created bgp_exit() exit routine. This function frees
allocations made as part of bgpd initialization and, to some extent,
configuration. If "debug bgp" is configured, memory stats are printed
as described above.
* bgpd/bgp_nexthop.c: zclient_new() already allocates stream for
ibuf/obuf, so bgp_scan_init() shouldn't do it too. Also, made it so
zlookup is global so bgp_exit() can use it.
* bgpd/bgp_packet.c: bgp_capability_msg_parse() call to bgp_clear_route()
adjusted to use new BGP_CLEAR_ROUTE_NORMAL flag.
* bgpd/bgp_route.h: Correct reference counter "lock" to be signed.
bgp_clear_route() now accepts a bgp_clear_route_type of either
BGP_CLEAR_ROUTE_NORMAL or BGP_CLEAR_ROUTE_MY_RSCLIENT.
* bgpd/bgp_route.c:
- bgp_process_rsclient(): attr was being zero'ed and then
bgp_attr_extra_free() was being called with it, even though it was
never filled with valid data.
- bgp_process_rsclient(): Make sure rsclient->group is not NULL before
use.
- bgp_processq_del(): Add call to bgp_table_unlock().
- bgp_process(): Add call to bgp_table_lock().
- bgp_update_rsclient(): memset clearing of new_attr not needed since
declarationw with "= { 0 }" does it. memset was already commented
out.
- bgp_update_rsclient(): Fix screwed up misleading indentation.
- bgp_withdraw_rsclient(): Fix screwed up misleading indentation.
- bgp_clear_route_node(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT.
- bgp_clear_node_queue_del(): Add call to bgp_table_unlock() and also
free struct bgp_clear_node_queue used for work item.
- bgp_clear_node_complete(): Do peer_unlock() after BGP_EVENT_ADD() in
case peer is released by peer_unlock() call.
- bgp_clear_route_table(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT. Use
struct bgp_clear_node_queue to supply data to worker. Add call to
bgp_table_lock().
- bgp_clear_route(): Add support for BGP_CLEAR_ROUTE_NORMAL or
BGP_CLEAR_ROUTE_MY_RSCLIENT.
- bgp_clear_route_all(): Use BGP_CLEAR_ROUTE_NORMAL.
Bug 397 fixes:
- bgp_default_originate()
- bgp_announce_table()
* bgpd/bgp_table.h:
- struct bgp_table: Added reference count. Changed type of owner to be
"struct peer *" rather than "void *".
- struct bgp_node: Correct reference counter "lock" to be signed.
* bgpd/bgp_table.c:
- Added bgp_table reference counting.
- bgp_table_free(): Fixed cleanup code. Call peer_unlock() on owner if
set.
- bgp_unlock_node(): Added assertion.
- bgp_node_get(): Added call to bgp_lock_node() to code path that it was
missing from.
* bgpd/bgp_vty.c:
- peer_rsclient_set_vty(): Call peer_lock() as part of peer assignment
to owner. Handle failure gracefully.
- peer_rsclient_unset_vty(): Add call to bgp_clear_route() with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
* bgpd/bgp_zebra.c: Made it so zclient is global so bgp_exit() can use it.
* bgpd/bgpd.c:
- peer_lock(): Allow to be called when status is "Deleted".
- peer_deactivate(): Supply BGP_CLEAR_ROUTE_NORMAL purpose to
bgp_clear_route() call.
- peer_delete(): Common variable listnode pn. Fix bug in which rsclient
was only dealt with if not part of a peer group. Call
bgp_clear_route() for rsclient, if appropriate, and do so with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
- peer_group_get(): Use XSTRDUP() instead of strdup() for conf->host.
- peer_group_bind(): Call bgp_clear_route() for rsclient, and do so with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
- bgp_create(): Use XSTRDUP() instead of strdup() for peer_self->host.
- bgp_delete(): Delete peers before groups, rather than after. And then
rather than deleting rsclients, verify that there are none at this
point.
- bgp_unlock(): Add assertion.
- bgp_free(): Call bgp_table_finish() rather than doing XFREE() itself.
* lib/command.c,h: Compiler warning fixes. Add cmd_terminate(). Fixed
massive leak in install_element() in which cmd_make_descvec() was being
called more than once for the same cmd->strvec/string/doc.
* lib/log.c: Make closezlog() check fp before calling fclose().
* lib/memory.c: Catch when alloc count goes negative by using signed
counts. Correct #endif comment. Add log_memstats_stderr().
* lib/memory.h: Add log_memstats_stderr().
* lib/thread.c: thread->funcname was being accessed in thread_call() after
it had been freed. Rearranged things so that thread_call() frees
funcname. Also made it so thread_master_free() cleans up cpu_record.
* lib/vty.c,h: Use global command_cr. Add vty_terminate().
* lib/zclient.c,h: Re-enable zclient_free().
2009-07-18 07:44:03 +02:00
|
|
|
bgp->peer_self->host = XSTRDUP (MTYPE_BGP_PEER_HOST, "Static announcement");
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
bgp->peer = list_new ();
|
|
|
|
bgp->peer->cmp = (int (*)(void *, void *)) peer_cmp;
|
|
|
|
|
|
|
|
bgp->group = list_new ();
|
|
|
|
bgp->group->cmp = (int (*)(void *, void *)) peer_group_cmp;
|
|
|
|
|
2004-09-13 Jose Luis Rubio <jrubio@dit.upm.es>
(at Technical University of Madrid as part of Euro6ix Project)
Enhanced Route Server functionality and Route-Maps:
* bgpd/bgpd.h: Modified 'struct peer' and 'struct bgp_filter' to
support rs-clients. A 'struct bgp_table *rib' has been added to the
first (to mantain a separated RIB for each rs-client) and two new
route-maps have been added to the last (for import/export policies).
Added the following #defines: RMAP_{IN|OUT|IMPORT|EXPORT|MAX},
PEER_RMAP_TYPE_{IMPORT|EXPORT} and BGP_CLEAR_SOFT_RSCLIENT.
* bgpd/bgpd.c: Modified the functions that create/delete/etc peers in
order to consider the new fields included in 'struct peer' for
supporting rs-clients, i.e. the import/export route-maps and the
'struct bgp_table'.
* bgpd/bgp_route.{ch}: Modified several functions related with
receiving/sending announces in order to support the new Route Server
capabilities.
Function 'bgp_process' has been reorganized, creating an auxiliar
function for best path selection ('bgp_best_selection').
Modified 'bgp_show' and 'bgp_show_route' for displaying information
about any RIB (and not only the main bgp RIB).
Added commands for displaying information about RS-clients RIBs:
'show bgp rsclient (A.B.C.D|X:X::X:X)', 'show bgp rsclient
(A.B.C.D|X:X::X:X) X:X::X:X/M', etc
* bgpd/bgp_table.{ch}: The structure 'struct bgp_table' now has two
new fields: type (which can take the values BGP_TABLE_{MAIN|RSCLIENT})
and 'void *owner' which points to 'struct bgp' or 'struct peer' which
owns the table.
When creating a new bgp_table by default 'type=BGP_TABLE_MAIN' is set.
* bgpd/bgp_vty.c: The commands 'neighbor ... route-server-client' and
'no neighbor ... route-server-client' now not only set/unset the flag
PEER_FLAG_RSERVER_CLIENT, but they create/destroy the 'struct
bgp_table' of the peer. Special actions are taken for peer_groups.
Command 'neighbor ... route-map WORD (in|out)' now also supports two
new kinds of route-map: 'import' and 'export'.
Added commands 'clear bgp * rsclient', etc. These commands allow a new
kind of soft_reconfig which affects only the RIB of the specified
RS-client.
Added commands 'show bgp rsclient summary', etc which display a
summary of the rs-clients configured for the corresponding address
family.
* bgpd/bgp_routemap.c: A new match statement is available,
'match peer (A.B.C.D|X:X::X:X)'. This statement can only be used in
import/export route-maps, and it matches when the peer who announces
(when used in an import route-map) or is going to receive (when used
in an export route-map) the route is the same than the one specified
in the statement.
For peer-groups the statement matches if the specified peer is member
of the peer-group.
A special version of the command, 'match peer local', matches with
routes originated by the Route Server (defined with 'network ...',
redistributed routes and default-originate).
* lib/routemap.{ch}: Added a new clause 'call NAME' for use in
route-maps. It jumps into the specified route-map and when it returns
the first route-map ends if the called RM returns DENY_MATCH, or
continues in other case.
2004-09-13 07:12:46 +02:00
|
|
|
bgp->rsclient = list_new ();
|
|
|
|
bgp->rsclient->cmp = (int (*)(void*, void*)) peer_cmp;
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
|
|
|
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
|
|
|
|
{
|
2006-02-21 02:09:01 +01:00
|
|
|
bgp->route[afi][safi] = bgp_table_init (afi, safi);
|
|
|
|
bgp->aggregate[afi][safi] = bgp_table_init (afi, safi);
|
|
|
|
bgp->rib[afi][safi] = bgp_table_init (afi, safi);
|
2011-07-21 05:43:22 +02:00
|
|
|
bgp->maxpaths[afi][safi].maxpaths_ebgp = BGP_DEFAULT_MAXPATHS;
|
|
|
|
bgp->maxpaths[afi][safi].maxpaths_ibgp = BGP_DEFAULT_MAXPATHS;
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
|
bgpd: bgpd-update-delay.patch
COMMAND:
'update-delay <max-delay in seconds> [<establish-wait in seconds>]'
DESCRIPTION:
This feature is used to enable read-only mode on BGP process restart or when
BGP process is cleared using 'clear ip bgp *'. When applicable, read-only mode
would begin as soon as the first peer reaches Established state and a timer
for <max-delay> seconds is started.
During this mode BGP doesn't run any best-path or generate any updates to its
peers. This mode continues until:
1. All the configured peers, except the shutdown peers, have sent explicit EOR
(End-Of-RIB) or an implicit-EOR. The first keep-alive after BGP has reached
Established is considered an implicit-EOR.
If the <establish-wait> optional value is given, then BGP will wait for
peers to reach establish from the begining of the update-delay till the
establish-wait period is over, i.e. the minimum set of established peers for
which EOR is expected would be peers established during the establish-wait
window, not necessarily all the configured neighbors.
2. max-delay period is over.
On hitting any of the above two conditions, BGP resumes the decision process
and generates updates to its peers.
Default <max-delay> is 0, i.e. the feature is off by default.
This feature can be useful in reducing CPU/network used as BGP restarts/clears.
Particularly useful in the topologies where BGP learns a prefix from many peers.
Intermediate bestpaths are possible for the same prefix as peers get established
and start receiving updates at different times. This feature should offer a
value-add if the network has a high number of such prefixes.
IMPLEMENTATION OBJECTIVES:
Given this is an optional feature, minimized the code-churn. Used existing
constructs wherever possible (existing queue-plug/unplug were used to achieve
delay and resume of best-paths/update-generation). As a result, no new
data-structure(s) had to be defined and allocated. When the feature is disabled,
the new node is not exercised for the most part.
Signed-off-by: Vipin Kumar <vipin@cumulusnetworks.com>
Reviewed-by: Pradosh Mohapatra <pmohapat@cumulusnetworks.com>
Dinesh Dutt <ddutt@cumulusnetworks.com>
2015-05-20 02:40:33 +02:00
|
|
|
bgp->v_update_delay = BGP_UPDATE_DELAY_DEF;
|
2002-12-13 21:15:29 +01:00
|
|
|
bgp->default_local_pref = BGP_DEFAULT_LOCAL_PREF;
|
2015-05-20 03:03:47 +02:00
|
|
|
bgp->default_subgroup_pkt_queue_max = BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX;
|
2002-12-13 21:15:29 +01:00
|
|
|
bgp->default_holdtime = BGP_DEFAULT_HOLDTIME;
|
|
|
|
bgp->default_keepalive = BGP_DEFAULT_KEEPALIVE;
|
2004-05-21 11:31:30 +02:00
|
|
|
bgp->restart_time = BGP_DEFAULT_RESTART_TIME;
|
|
|
|
bgp->stalepath_time = BGP_DEFAULT_STALEPATH_TIME;
|
2015-05-20 03:03:47 +02:00
|
|
|
bgp->dynamic_neighbors_limit = BGP_DYNAMIC_NEIGHBORS_LIMIT_DEFAULT;
|
|
|
|
bgp->dynamic_neighbors_count = 0;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
bgp->as = *as;
|
|
|
|
|
|
|
|
if (name)
|
|
|
|
bgp->name = strdup (name);
|
|
|
|
|
bgpd: bgpd-mrai.patch
BGP: Event-driven route announcement taking into account min route advertisement interval
ISSUE
BGP starts the routeadv timer (peer->t_routeadv) to expire in 1 sec
when a peer is established. From then on, the timer expires
periodically based on the configured MRAI value (default: 30sec for
EBGP, 5sec for IBGP). At the expiry, the write thread is triggered
that takes the routes from peer's sync FIFO (adj-rib-out) and sends
UPDATEs. This has a few drawbacks:
(1) Delay in new route announcement: Even when the last UPDATE message
was sent a while back, the next route change will necessarily have
to wait for routeadv expiry
(2) CPU usage: The timer is always armed. If the operator chooses to
configure a lower value of MRAI (zero second is a preferred choice
in many deployments) for better convergence, it leads to high CPU
usage for BGP process, even at the times of no network churn.
PATCH
Make the route advertisement event-driven - When routes are added to
peer's sync FIFO, check if the routeadv timer needs to be adjusted (or
started). Conversely, do not arm the routeadv timer unconditionally.
The patch also addresses route announcements during read-only mode
(update-delay). During read-only mode operation, the routeadv timer
is not started. When BGP comes out of read-only mode and all the
routes are processed, the timer is started for all peers with zero
expiry, so that the UPDATEs can be sent all at once. This leads to
(near-)optimal UPDATE packing.
Finally, the patch makes the "max # packets to write to peer socket at
a time" configurable. Currently it is hard-coded to 10. The command is
at the top router-bgp mode and is called "write-quanta <number>". It
is a useful convergence parameter to tweak.
Signed-off-by: Pradosh Mohapatra <pmohapat@cumulusnetworks.com>
Reviewed-by: Daniel Walton <dwalton@cumulusnetworks.com>
2015-05-20 02:40:37 +02:00
|
|
|
bgp->wpkt_quanta = BGP_WRITE_PACKET_MAX;
|
2015-05-20 03:03:47 +02:00
|
|
|
bgp->coalesce_time = BGP_DEFAULT_SUBGROUP_COALESCE_TIME;
|
bgpd: bgpd-mrai.patch
BGP: Event-driven route announcement taking into account min route advertisement interval
ISSUE
BGP starts the routeadv timer (peer->t_routeadv) to expire in 1 sec
when a peer is established. From then on, the timer expires
periodically based on the configured MRAI value (default: 30sec for
EBGP, 5sec for IBGP). At the expiry, the write thread is triggered
that takes the routes from peer's sync FIFO (adj-rib-out) and sends
UPDATEs. This has a few drawbacks:
(1) Delay in new route announcement: Even when the last UPDATE message
was sent a while back, the next route change will necessarily have
to wait for routeadv expiry
(2) CPU usage: The timer is always armed. If the operator chooses to
configure a lower value of MRAI (zero second is a preferred choice
in many deployments) for better convergence, it leads to high CPU
usage for BGP process, even at the times of no network churn.
PATCH
Make the route advertisement event-driven - When routes are added to
peer's sync FIFO, check if the routeadv timer needs to be adjusted (or
started). Conversely, do not arm the routeadv timer unconditionally.
The patch also addresses route announcements during read-only mode
(update-delay). During read-only mode operation, the routeadv timer
is not started. When BGP comes out of read-only mode and all the
routes are processed, the timer is started for all peers with zero
expiry, so that the UPDATEs can be sent all at once. This leads to
(near-)optimal UPDATE packing.
Finally, the patch makes the "max # packets to write to peer socket at
a time" configurable. Currently it is hard-coded to 10. The command is
at the top router-bgp mode and is called "write-quanta <number>". It
is a useful convergence parameter to tweak.
Signed-off-by: Pradosh Mohapatra <pmohapat@cumulusnetworks.com>
Reviewed-by: Daniel Walton <dwalton@cumulusnetworks.com>
2015-05-20 02:40:37 +02:00
|
|
|
|
2015-05-20 02:40:32 +02:00
|
|
|
THREAD_TIMER_ON (master, bgp->t_startup, bgp_startup_timer_expire,
|
|
|
|
bgp, bgp->restart_time);
|
|
|
|
|
2015-05-20 03:29:17 +02:00
|
|
|
update_bgp_group_init(bgp);
|
2002-12-13 21:15:29 +01:00
|
|
|
return bgp;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Return first entry of BGP. */
|
|
|
|
struct bgp *
|
2005-06-28 14:44:16 +02:00
|
|
|
bgp_get_default (void)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
if (bm->bgp->head)
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
return (listgetdata (listhead (bm->bgp)));
|
2002-12-13 21:15:29 +01:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Lookup BGP entry. */
|
|
|
|
struct bgp *
|
2004-10-13 07:06:08 +02:00
|
|
|
bgp_lookup (as_t as, const char *name)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
struct bgp *bgp;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
|
2002-12-13 21:15:29 +01:00
|
|
|
if (bgp->as == as
|
|
|
|
&& ((bgp->name == NULL && name == NULL)
|
|
|
|
|| (bgp->name && name && strcmp (bgp->name, name) == 0)))
|
|
|
|
return bgp;
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Lookup BGP structure by view name. */
|
|
|
|
struct bgp *
|
2004-10-13 07:06:08 +02:00
|
|
|
bgp_lookup_by_name (const char *name)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
struct bgp *bgp;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
|
2002-12-13 21:15:29 +01:00
|
|
|
if ((bgp->name == NULL && name == NULL)
|
|
|
|
|| (bgp->name && name && strcmp (bgp->name, name) == 0))
|
|
|
|
return bgp;
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Called from VTY commands. */
|
|
|
|
int
|
2004-10-13 07:06:08 +02:00
|
|
|
bgp_get (struct bgp **bgp_val, as_t *as, const char *name)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
struct bgp *bgp;
|
|
|
|
|
|
|
|
/* Multiple instance check. */
|
|
|
|
if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE))
|
|
|
|
{
|
|
|
|
if (name)
|
|
|
|
bgp = bgp_lookup_by_name (name);
|
|
|
|
else
|
|
|
|
bgp = bgp_get_default ();
|
|
|
|
|
|
|
|
/* Already exists. */
|
|
|
|
if (bgp)
|
|
|
|
{
|
|
|
|
if (bgp->as != *as)
|
|
|
|
{
|
|
|
|
*as = bgp->as;
|
|
|
|
return BGP_ERR_INSTANCE_MISMATCH;
|
|
|
|
}
|
|
|
|
*bgp_val = bgp;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* BGP instance name can not be specified for single instance. */
|
|
|
|
if (name)
|
|
|
|
return BGP_ERR_MULTIPLE_INSTANCE_NOT_SET;
|
|
|
|
|
|
|
|
/* Get default BGP structure if exists. */
|
|
|
|
bgp = bgp_get_default ();
|
|
|
|
|
|
|
|
if (bgp)
|
|
|
|
{
|
|
|
|
if (bgp->as != *as)
|
|
|
|
{
|
|
|
|
*as = bgp->as;
|
|
|
|
return BGP_ERR_AS_MISMATCH;
|
|
|
|
}
|
|
|
|
*bgp_val = bgp;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-10-27 15:01:11 +02:00
|
|
|
bgp = bgp_create (as, name);
|
|
|
|
bgp_router_id_set(bgp, &router_id_zebra);
|
|
|
|
*bgp_val = bgp;
|
|
|
|
|
2015-05-20 03:04:20 +02:00
|
|
|
bgp->t_rmap_def_originate_eval = NULL;
|
2015-05-20 02:40:45 +02:00
|
|
|
bgp->t_rmap_update = NULL;
|
|
|
|
bgp->rmap_update_timer = RMAP_DEFAULT_UPDATE_TIMER;
|
|
|
|
|
2012-06-13 23:50:07 +02:00
|
|
|
/* Create BGP server socket, if first instance. */
|
2012-06-14 11:40:26 +02:00
|
|
|
if (list_isempty(bm->bgp)
|
|
|
|
&& !bgp_option_check (BGP_OPT_NO_LISTEN))
|
2012-06-13 23:50:07 +02:00
|
|
|
{
|
|
|
|
if (bgp_socket (bm->port, bm->address) < 0)
|
|
|
|
return BGP_ERR_INVALID_VALUE;
|
|
|
|
}
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
listnode_add (bm->bgp, bgp);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Delete BGP instance. */
|
|
|
|
int
|
|
|
|
bgp_delete (struct bgp *bgp)
|
|
|
|
{
|
|
|
|
struct peer *peer;
|
2005-05-26 10:29:07 +02:00
|
|
|
struct peer_group *group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node;
|
2002-12-13 21:15:29 +01:00
|
|
|
struct listnode *next;
|
|
|
|
afi_t afi;
|
|
|
|
int i;
|
|
|
|
|
2015-05-20 03:04:12 +02:00
|
|
|
THREAD_OFF (bgp->t_startup);
|
|
|
|
|
2015-05-20 02:47:26 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (bgp->peer, node, next, peer))
|
|
|
|
{
|
|
|
|
if (peer->status == Established ||
|
|
|
|
peer->status == OpenSent ||
|
|
|
|
peer->status == OpenConfirm)
|
|
|
|
{
|
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE,
|
|
|
|
BGP_NOTIFY_CEASE_PEER_UNCONFIG);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-05-20 02:40:45 +02:00
|
|
|
if (bgp->t_rmap_update)
|
|
|
|
BGP_TIMER_OFF(bgp->t_rmap_update);
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* Delete static route. */
|
|
|
|
bgp_static_delete (bgp);
|
|
|
|
|
|
|
|
/* Unset redistribution. */
|
|
|
|
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
|
|
|
for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
|
|
|
|
if (i != ZEBRA_ROUTE_BGP)
|
Multi-Instance OSPF Summary
——————————————-------------
- etc/init.d/quagga is modified to support creating separate ospf daemon
process for each instance. Each individual instance is monitored by
watchquagga just like any protocol daemons.(requires initd-mi.patch).
- Vtysh is modified to able to connect to multiple daemons of the same
protocol (supported for OSPF only for now).
- ospfd is modified to remember the Instance-ID that its invoked with. For
the entire life of the process it caters to any command request that
matches that instance-ID (unless its a non instance specific command).
Routes/messages to zebra are tagged with instance-ID.
- zebra route/redistribute mechanisms are modified to work with
[protocol type + instance-id]
- bgpd now has ability to have multiple instance specific redistribution
for a protocol (OSPF only supported/tested for now).
- zlog ability to display instance-id besides the protocol/daemon name.
- Changes in other daemons are to because of the needed integration with
some of the modified APIs/routines. (Didn’t prefer replicating too many
separate instance specific APIs.)
- config/show/debug commands are modified to take instance-id argument
as appropriate.
Guidelines to start using multi-instance ospf
---------------------------------------------
The patch is backward compatible, i.e for any previous way of single ospf
deamon(router ospf <cr>) will continue to work as is, including all the
show commands etc.
To enable multiple instances, do the following:
1. service quagga stop
2. Modify /etc/quagga/daemons to add instance-ids of each desired
instance in the following format:
ospfd=“yes"
ospfd_instances="1,2,3"
assuming you want to enable 3 instances with those instance ids.
3. Create corresponding ospfd config files as ospfd-1.conf, ospfd-2.conf
and ospfd-3.conf.
4. service quagga start/restart
5. Verify that the deamons are started as expected. You should see
ospfd started with -n <instance-id> option.
ps –ef | grep quagga
With that /var/run/quagga/ should have ospfd-<instance-id>.pid and
ospfd-<instance-id>/vty to each instance.
6. vtysh to work with instances as you would with any other deamons.
7. Overall most quagga semantics are the same working with the instance
deamon, like it is for any other daemon.
NOTE:
To safeguard against errors leading to too many processes getting invoked,
a hard limit on number of instance-ids is in place, currently its 5.
Allowed instance-id range is <1-65535>
Once daemons are up, show running from vtysh should show the instance-id
of each daemon as 'router ospf <instance-id>’ (without needing explicit
configuration)
Instance-id can not be changed via vtysh, other router ospf configuration
is allowed as before.
Signed-off-by: Vipin Kumar <vipin@cumulusnetworks.com>
Reviewed-by: Daniel Walton <dwalton@cumulusnetworks.com>
Reviewed-by: Dinesh G Dutt <ddutt@cumulusnetworks.com>
2015-05-20 03:03:42 +02:00
|
|
|
bgp_redistribute_unset (bgp, afi, i, 0);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
[bgpd] Stability fixes including bugs 397, 492
I've spent the last several weeks working on stability fixes to bgpd.
These patches fix all of the numerous crashes, assertion failures, memory
leaks and memory stomping I could find. Valgrind was used extensively.
Added new function bgp_exit() to help catch problems. If "debug bgp" is
configured and bgpd exits with status of 0, statistics on remaining
lib/memory.c allocations are printed to stderr. It is my hope that other
developers will use this to stay on top of memory issues.
Example questionable exit:
bgpd: memstats: Current memory utilization in module LIB:
bgpd: memstats: Link List : 6
bgpd: memstats: Link Node : 5
bgpd: memstats: Hash : 8
bgpd: memstats: Hash Bucket : 2
bgpd: memstats: Hash Index : 8
bgpd: memstats: Work queue : 3
bgpd: memstats: Work queue item : 2
bgpd: memstats: Work queue name string : 3
bgpd: memstats: Current memory utilization in module BGP:
bgpd: memstats: BGP instance : 1
bgpd: memstats: BGP peer : 1
bgpd: memstats: BGP peer hostname : 1
bgpd: memstats: BGP attribute : 1
bgpd: memstats: BGP extra attributes : 1
bgpd: memstats: BGP aspath : 1
bgpd: memstats: BGP aspath str : 1
bgpd: memstats: BGP table : 24
bgpd: memstats: BGP node : 1
bgpd: memstats: BGP route : 1
bgpd: memstats: BGP synchronise : 8
bgpd: memstats: BGP Process queue : 1
bgpd: memstats: BGP node clear queue : 1
bgpd: memstats: NOTE: If configuration exists, utilization may be expected.
Example clean exit:
bgpd: memstats: No remaining tracked memory utilization.
This patch fixes bug #397: "Invalid free in bgp_announce_check()".
This patch fixes bug #492: "SIGBUS in bgpd/bgp_route.c:
bgp_clear_route_node()".
My apologies for not separating out these changes into individual patches.
The complexity of doing so boggled what is left of my brain. I hope this
is all still useful to the community.
This code has been production tested, in non-route-server-client mode, on
a linux 32-bit box and a 64-bit box.
Release/reset functions, used by bgp_exit(), added to:
bgpd/bgp_attr.c,h
bgpd/bgp_community.c,h
bgpd/bgp_dump.c,h
bgpd/bgp_ecommunity.c,h
bgpd/bgp_filter.c,h
bgpd/bgp_nexthop.c,h
bgpd/bgp_route.c,h
lib/routemap.c,h
File by file analysis:
* bgpd/bgp_aspath.c: Prevent re-use of ashash after it is released.
* bgpd/bgp_attr.c: #if removed uncalled cluster_dup().
* bgpd/bgp_clist.c,h: Allow community_list_terminate() to be called from
bgp_exit().
* bgpd/bgp_filter.c: Fix aslist->name use without allocation check, and
also fix memory leak.
* bgpd/bgp_main.c: Created bgp_exit() exit routine. This function frees
allocations made as part of bgpd initialization and, to some extent,
configuration. If "debug bgp" is configured, memory stats are printed
as described above.
* bgpd/bgp_nexthop.c: zclient_new() already allocates stream for
ibuf/obuf, so bgp_scan_init() shouldn't do it too. Also, made it so
zlookup is global so bgp_exit() can use it.
* bgpd/bgp_packet.c: bgp_capability_msg_parse() call to bgp_clear_route()
adjusted to use new BGP_CLEAR_ROUTE_NORMAL flag.
* bgpd/bgp_route.h: Correct reference counter "lock" to be signed.
bgp_clear_route() now accepts a bgp_clear_route_type of either
BGP_CLEAR_ROUTE_NORMAL or BGP_CLEAR_ROUTE_MY_RSCLIENT.
* bgpd/bgp_route.c:
- bgp_process_rsclient(): attr was being zero'ed and then
bgp_attr_extra_free() was being called with it, even though it was
never filled with valid data.
- bgp_process_rsclient(): Make sure rsclient->group is not NULL before
use.
- bgp_processq_del(): Add call to bgp_table_unlock().
- bgp_process(): Add call to bgp_table_lock().
- bgp_update_rsclient(): memset clearing of new_attr not needed since
declarationw with "= { 0 }" does it. memset was already commented
out.
- bgp_update_rsclient(): Fix screwed up misleading indentation.
- bgp_withdraw_rsclient(): Fix screwed up misleading indentation.
- bgp_clear_route_node(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT.
- bgp_clear_node_queue_del(): Add call to bgp_table_unlock() and also
free struct bgp_clear_node_queue used for work item.
- bgp_clear_node_complete(): Do peer_unlock() after BGP_EVENT_ADD() in
case peer is released by peer_unlock() call.
- bgp_clear_route_table(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT. Use
struct bgp_clear_node_queue to supply data to worker. Add call to
bgp_table_lock().
- bgp_clear_route(): Add support for BGP_CLEAR_ROUTE_NORMAL or
BGP_CLEAR_ROUTE_MY_RSCLIENT.
- bgp_clear_route_all(): Use BGP_CLEAR_ROUTE_NORMAL.
Bug 397 fixes:
- bgp_default_originate()
- bgp_announce_table()
* bgpd/bgp_table.h:
- struct bgp_table: Added reference count. Changed type of owner to be
"struct peer *" rather than "void *".
- struct bgp_node: Correct reference counter "lock" to be signed.
* bgpd/bgp_table.c:
- Added bgp_table reference counting.
- bgp_table_free(): Fixed cleanup code. Call peer_unlock() on owner if
set.
- bgp_unlock_node(): Added assertion.
- bgp_node_get(): Added call to bgp_lock_node() to code path that it was
missing from.
* bgpd/bgp_vty.c:
- peer_rsclient_set_vty(): Call peer_lock() as part of peer assignment
to owner. Handle failure gracefully.
- peer_rsclient_unset_vty(): Add call to bgp_clear_route() with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
* bgpd/bgp_zebra.c: Made it so zclient is global so bgp_exit() can use it.
* bgpd/bgpd.c:
- peer_lock(): Allow to be called when status is "Deleted".
- peer_deactivate(): Supply BGP_CLEAR_ROUTE_NORMAL purpose to
bgp_clear_route() call.
- peer_delete(): Common variable listnode pn. Fix bug in which rsclient
was only dealt with if not part of a peer group. Call
bgp_clear_route() for rsclient, if appropriate, and do so with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
- peer_group_get(): Use XSTRDUP() instead of strdup() for conf->host.
- peer_group_bind(): Call bgp_clear_route() for rsclient, and do so with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
- bgp_create(): Use XSTRDUP() instead of strdup() for peer_self->host.
- bgp_delete(): Delete peers before groups, rather than after. And then
rather than deleting rsclients, verify that there are none at this
point.
- bgp_unlock(): Add assertion.
- bgp_free(): Call bgp_table_finish() rather than doing XFREE() itself.
* lib/command.c,h: Compiler warning fixes. Add cmd_terminate(). Fixed
massive leak in install_element() in which cmd_make_descvec() was being
called more than once for the same cmd->strvec/string/doc.
* lib/log.c: Make closezlog() check fp before calling fclose().
* lib/memory.c: Catch when alloc count goes negative by using signed
counts. Correct #endif comment. Add log_memstats_stderr().
* lib/memory.h: Add log_memstats_stderr().
* lib/thread.c: thread->funcname was being accessed in thread_call() after
it had been freed. Rearranged things so that thread_call() frees
funcname. Also made it so thread_master_free() cleans up cpu_record.
* lib/vty.c,h: Use global command_cr. Add vty_terminate().
* lib/zclient.c,h: Re-enable zclient_free().
2009-07-18 07:44:03 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (bgp->group, node, next, group))
|
2013-10-02 12:40:20 +02:00
|
|
|
{
|
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, next, peer))
|
|
|
|
{
|
|
|
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
|
|
|
|
{
|
|
|
|
/* Send notify to remote peer. */
|
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE, BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
peer_group_delete (group);
|
|
|
|
}
|
[bgpd] Stability fixes including bugs 397, 492
I've spent the last several weeks working on stability fixes to bgpd.
These patches fix all of the numerous crashes, assertion failures, memory
leaks and memory stomping I could find. Valgrind was used extensively.
Added new function bgp_exit() to help catch problems. If "debug bgp" is
configured and bgpd exits with status of 0, statistics on remaining
lib/memory.c allocations are printed to stderr. It is my hope that other
developers will use this to stay on top of memory issues.
Example questionable exit:
bgpd: memstats: Current memory utilization in module LIB:
bgpd: memstats: Link List : 6
bgpd: memstats: Link Node : 5
bgpd: memstats: Hash : 8
bgpd: memstats: Hash Bucket : 2
bgpd: memstats: Hash Index : 8
bgpd: memstats: Work queue : 3
bgpd: memstats: Work queue item : 2
bgpd: memstats: Work queue name string : 3
bgpd: memstats: Current memory utilization in module BGP:
bgpd: memstats: BGP instance : 1
bgpd: memstats: BGP peer : 1
bgpd: memstats: BGP peer hostname : 1
bgpd: memstats: BGP attribute : 1
bgpd: memstats: BGP extra attributes : 1
bgpd: memstats: BGP aspath : 1
bgpd: memstats: BGP aspath str : 1
bgpd: memstats: BGP table : 24
bgpd: memstats: BGP node : 1
bgpd: memstats: BGP route : 1
bgpd: memstats: BGP synchronise : 8
bgpd: memstats: BGP Process queue : 1
bgpd: memstats: BGP node clear queue : 1
bgpd: memstats: NOTE: If configuration exists, utilization may be expected.
Example clean exit:
bgpd: memstats: No remaining tracked memory utilization.
This patch fixes bug #397: "Invalid free in bgp_announce_check()".
This patch fixes bug #492: "SIGBUS in bgpd/bgp_route.c:
bgp_clear_route_node()".
My apologies for not separating out these changes into individual patches.
The complexity of doing so boggled what is left of my brain. I hope this
is all still useful to the community.
This code has been production tested, in non-route-server-client mode, on
a linux 32-bit box and a 64-bit box.
Release/reset functions, used by bgp_exit(), added to:
bgpd/bgp_attr.c,h
bgpd/bgp_community.c,h
bgpd/bgp_dump.c,h
bgpd/bgp_ecommunity.c,h
bgpd/bgp_filter.c,h
bgpd/bgp_nexthop.c,h
bgpd/bgp_route.c,h
lib/routemap.c,h
File by file analysis:
* bgpd/bgp_aspath.c: Prevent re-use of ashash after it is released.
* bgpd/bgp_attr.c: #if removed uncalled cluster_dup().
* bgpd/bgp_clist.c,h: Allow community_list_terminate() to be called from
bgp_exit().
* bgpd/bgp_filter.c: Fix aslist->name use without allocation check, and
also fix memory leak.
* bgpd/bgp_main.c: Created bgp_exit() exit routine. This function frees
allocations made as part of bgpd initialization and, to some extent,
configuration. If "debug bgp" is configured, memory stats are printed
as described above.
* bgpd/bgp_nexthop.c: zclient_new() already allocates stream for
ibuf/obuf, so bgp_scan_init() shouldn't do it too. Also, made it so
zlookup is global so bgp_exit() can use it.
* bgpd/bgp_packet.c: bgp_capability_msg_parse() call to bgp_clear_route()
adjusted to use new BGP_CLEAR_ROUTE_NORMAL flag.
* bgpd/bgp_route.h: Correct reference counter "lock" to be signed.
bgp_clear_route() now accepts a bgp_clear_route_type of either
BGP_CLEAR_ROUTE_NORMAL or BGP_CLEAR_ROUTE_MY_RSCLIENT.
* bgpd/bgp_route.c:
- bgp_process_rsclient(): attr was being zero'ed and then
bgp_attr_extra_free() was being called with it, even though it was
never filled with valid data.
- bgp_process_rsclient(): Make sure rsclient->group is not NULL before
use.
- bgp_processq_del(): Add call to bgp_table_unlock().
- bgp_process(): Add call to bgp_table_lock().
- bgp_update_rsclient(): memset clearing of new_attr not needed since
declarationw with "= { 0 }" does it. memset was already commented
out.
- bgp_update_rsclient(): Fix screwed up misleading indentation.
- bgp_withdraw_rsclient(): Fix screwed up misleading indentation.
- bgp_clear_route_node(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT.
- bgp_clear_node_queue_del(): Add call to bgp_table_unlock() and also
free struct bgp_clear_node_queue used for work item.
- bgp_clear_node_complete(): Do peer_unlock() after BGP_EVENT_ADD() in
case peer is released by peer_unlock() call.
- bgp_clear_route_table(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT. Use
struct bgp_clear_node_queue to supply data to worker. Add call to
bgp_table_lock().
- bgp_clear_route(): Add support for BGP_CLEAR_ROUTE_NORMAL or
BGP_CLEAR_ROUTE_MY_RSCLIENT.
- bgp_clear_route_all(): Use BGP_CLEAR_ROUTE_NORMAL.
Bug 397 fixes:
- bgp_default_originate()
- bgp_announce_table()
* bgpd/bgp_table.h:
- struct bgp_table: Added reference count. Changed type of owner to be
"struct peer *" rather than "void *".
- struct bgp_node: Correct reference counter "lock" to be signed.
* bgpd/bgp_table.c:
- Added bgp_table reference counting.
- bgp_table_free(): Fixed cleanup code. Call peer_unlock() on owner if
set.
- bgp_unlock_node(): Added assertion.
- bgp_node_get(): Added call to bgp_lock_node() to code path that it was
missing from.
* bgpd/bgp_vty.c:
- peer_rsclient_set_vty(): Call peer_lock() as part of peer assignment
to owner. Handle failure gracefully.
- peer_rsclient_unset_vty(): Add call to bgp_clear_route() with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
* bgpd/bgp_zebra.c: Made it so zclient is global so bgp_exit() can use it.
* bgpd/bgpd.c:
- peer_lock(): Allow to be called when status is "Deleted".
- peer_deactivate(): Supply BGP_CLEAR_ROUTE_NORMAL purpose to
bgp_clear_route() call.
- peer_delete(): Common variable listnode pn. Fix bug in which rsclient
was only dealt with if not part of a peer group. Call
bgp_clear_route() for rsclient, if appropriate, and do so with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
- peer_group_get(): Use XSTRDUP() instead of strdup() for conf->host.
- peer_group_bind(): Call bgp_clear_route() for rsclient, and do so with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
- bgp_create(): Use XSTRDUP() instead of strdup() for peer_self->host.
- bgp_delete(): Delete peers before groups, rather than after. And then
rather than deleting rsclients, verify that there are none at this
point.
- bgp_unlock(): Add assertion.
- bgp_free(): Call bgp_table_finish() rather than doing XFREE() itself.
* lib/command.c,h: Compiler warning fixes. Add cmd_terminate(). Fixed
massive leak in install_element() in which cmd_make_descvec() was being
called more than once for the same cmd->strvec/string/doc.
* lib/log.c: Make closezlog() check fp before calling fclose().
* lib/memory.c: Catch when alloc count goes negative by using signed
counts. Correct #endif comment. Add log_memstats_stderr().
* lib/memory.h: Add log_memstats_stderr().
* lib/thread.c: thread->funcname was being accessed in thread_call() after
it had been freed. Rearranged things so that thread_call() frees
funcname. Also made it so thread_master_free() cleans up cpu_record.
* lib/vty.c,h: Use global command_cr. Add vty_terminate().
* lib/zclient.c,h: Re-enable zclient_free().
2009-07-18 07:44:03 +02:00
|
|
|
|
2015-05-20 02:40:37 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (bgp->peer, node, next, peer))
|
|
|
|
{
|
|
|
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
|
|
|
|
{
|
|
|
|
/* Send notify to remote peer. */
|
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE, BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN);
|
|
|
|
}
|
|
|
|
|
|
|
|
peer_delete (peer);
|
|
|
|
}
|
|
|
|
|
[bgpd] Stability fixes including bugs 397, 492
I've spent the last several weeks working on stability fixes to bgpd.
These patches fix all of the numerous crashes, assertion failures, memory
leaks and memory stomping I could find. Valgrind was used extensively.
Added new function bgp_exit() to help catch problems. If "debug bgp" is
configured and bgpd exits with status of 0, statistics on remaining
lib/memory.c allocations are printed to stderr. It is my hope that other
developers will use this to stay on top of memory issues.
Example questionable exit:
bgpd: memstats: Current memory utilization in module LIB:
bgpd: memstats: Link List : 6
bgpd: memstats: Link Node : 5
bgpd: memstats: Hash : 8
bgpd: memstats: Hash Bucket : 2
bgpd: memstats: Hash Index : 8
bgpd: memstats: Work queue : 3
bgpd: memstats: Work queue item : 2
bgpd: memstats: Work queue name string : 3
bgpd: memstats: Current memory utilization in module BGP:
bgpd: memstats: BGP instance : 1
bgpd: memstats: BGP peer : 1
bgpd: memstats: BGP peer hostname : 1
bgpd: memstats: BGP attribute : 1
bgpd: memstats: BGP extra attributes : 1
bgpd: memstats: BGP aspath : 1
bgpd: memstats: BGP aspath str : 1
bgpd: memstats: BGP table : 24
bgpd: memstats: BGP node : 1
bgpd: memstats: BGP route : 1
bgpd: memstats: BGP synchronise : 8
bgpd: memstats: BGP Process queue : 1
bgpd: memstats: BGP node clear queue : 1
bgpd: memstats: NOTE: If configuration exists, utilization may be expected.
Example clean exit:
bgpd: memstats: No remaining tracked memory utilization.
This patch fixes bug #397: "Invalid free in bgp_announce_check()".
This patch fixes bug #492: "SIGBUS in bgpd/bgp_route.c:
bgp_clear_route_node()".
My apologies for not separating out these changes into individual patches.
The complexity of doing so boggled what is left of my brain. I hope this
is all still useful to the community.
This code has been production tested, in non-route-server-client mode, on
a linux 32-bit box and a 64-bit box.
Release/reset functions, used by bgp_exit(), added to:
bgpd/bgp_attr.c,h
bgpd/bgp_community.c,h
bgpd/bgp_dump.c,h
bgpd/bgp_ecommunity.c,h
bgpd/bgp_filter.c,h
bgpd/bgp_nexthop.c,h
bgpd/bgp_route.c,h
lib/routemap.c,h
File by file analysis:
* bgpd/bgp_aspath.c: Prevent re-use of ashash after it is released.
* bgpd/bgp_attr.c: #if removed uncalled cluster_dup().
* bgpd/bgp_clist.c,h: Allow community_list_terminate() to be called from
bgp_exit().
* bgpd/bgp_filter.c: Fix aslist->name use without allocation check, and
also fix memory leak.
* bgpd/bgp_main.c: Created bgp_exit() exit routine. This function frees
allocations made as part of bgpd initialization and, to some extent,
configuration. If "debug bgp" is configured, memory stats are printed
as described above.
* bgpd/bgp_nexthop.c: zclient_new() already allocates stream for
ibuf/obuf, so bgp_scan_init() shouldn't do it too. Also, made it so
zlookup is global so bgp_exit() can use it.
* bgpd/bgp_packet.c: bgp_capability_msg_parse() call to bgp_clear_route()
adjusted to use new BGP_CLEAR_ROUTE_NORMAL flag.
* bgpd/bgp_route.h: Correct reference counter "lock" to be signed.
bgp_clear_route() now accepts a bgp_clear_route_type of either
BGP_CLEAR_ROUTE_NORMAL or BGP_CLEAR_ROUTE_MY_RSCLIENT.
* bgpd/bgp_route.c:
- bgp_process_rsclient(): attr was being zero'ed and then
bgp_attr_extra_free() was being called with it, even though it was
never filled with valid data.
- bgp_process_rsclient(): Make sure rsclient->group is not NULL before
use.
- bgp_processq_del(): Add call to bgp_table_unlock().
- bgp_process(): Add call to bgp_table_lock().
- bgp_update_rsclient(): memset clearing of new_attr not needed since
declarationw with "= { 0 }" does it. memset was already commented
out.
- bgp_update_rsclient(): Fix screwed up misleading indentation.
- bgp_withdraw_rsclient(): Fix screwed up misleading indentation.
- bgp_clear_route_node(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT.
- bgp_clear_node_queue_del(): Add call to bgp_table_unlock() and also
free struct bgp_clear_node_queue used for work item.
- bgp_clear_node_complete(): Do peer_unlock() after BGP_EVENT_ADD() in
case peer is released by peer_unlock() call.
- bgp_clear_route_table(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT. Use
struct bgp_clear_node_queue to supply data to worker. Add call to
bgp_table_lock().
- bgp_clear_route(): Add support for BGP_CLEAR_ROUTE_NORMAL or
BGP_CLEAR_ROUTE_MY_RSCLIENT.
- bgp_clear_route_all(): Use BGP_CLEAR_ROUTE_NORMAL.
Bug 397 fixes:
- bgp_default_originate()
- bgp_announce_table()
* bgpd/bgp_table.h:
- struct bgp_table: Added reference count. Changed type of owner to be
"struct peer *" rather than "void *".
- struct bgp_node: Correct reference counter "lock" to be signed.
* bgpd/bgp_table.c:
- Added bgp_table reference counting.
- bgp_table_free(): Fixed cleanup code. Call peer_unlock() on owner if
set.
- bgp_unlock_node(): Added assertion.
- bgp_node_get(): Added call to bgp_lock_node() to code path that it was
missing from.
* bgpd/bgp_vty.c:
- peer_rsclient_set_vty(): Call peer_lock() as part of peer assignment
to owner. Handle failure gracefully.
- peer_rsclient_unset_vty(): Add call to bgp_clear_route() with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
* bgpd/bgp_zebra.c: Made it so zclient is global so bgp_exit() can use it.
* bgpd/bgpd.c:
- peer_lock(): Allow to be called when status is "Deleted".
- peer_deactivate(): Supply BGP_CLEAR_ROUTE_NORMAL purpose to
bgp_clear_route() call.
- peer_delete(): Common variable listnode pn. Fix bug in which rsclient
was only dealt with if not part of a peer group. Call
bgp_clear_route() for rsclient, if appropriate, and do so with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
- peer_group_get(): Use XSTRDUP() instead of strdup() for conf->host.
- peer_group_bind(): Call bgp_clear_route() for rsclient, and do so with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
- bgp_create(): Use XSTRDUP() instead of strdup() for peer_self->host.
- bgp_delete(): Delete peers before groups, rather than after. And then
rather than deleting rsclients, verify that there are none at this
point.
- bgp_unlock(): Add assertion.
- bgp_free(): Call bgp_table_finish() rather than doing XFREE() itself.
* lib/command.c,h: Compiler warning fixes. Add cmd_terminate(). Fixed
massive leak in install_element() in which cmd_make_descvec() was being
called more than once for the same cmd->strvec/string/doc.
* lib/log.c: Make closezlog() check fp before calling fclose().
* lib/memory.c: Catch when alloc count goes negative by using signed
counts. Correct #endif comment. Add log_memstats_stderr().
* lib/memory.h: Add log_memstats_stderr().
* lib/thread.c: thread->funcname was being accessed in thread_call() after
it had been freed. Rearranged things so that thread_call() frees
funcname. Also made it so thread_master_free() cleans up cpu_record.
* lib/vty.c,h: Use global command_cr. Add vty_terminate().
* lib/zclient.c,h: Re-enable zclient_free().
2009-07-18 07:44:03 +02:00
|
|
|
assert (listcount (bgp->rsclient) == 0);
|
2009-05-21 17:51:03 +02:00
|
|
|
|
|
|
|
if (bgp->peer_self) {
|
|
|
|
peer_delete(bgp->peer_self);
|
|
|
|
bgp->peer_self = NULL;
|
|
|
|
}
|
2015-05-20 03:04:20 +02:00
|
|
|
|
|
|
|
if (bgp->t_rmap_def_originate_eval)
|
|
|
|
{
|
|
|
|
BGP_TIMER_OFF(bgp->t_rmap_def_originate_eval);
|
|
|
|
bgp_unlock(bgp);
|
|
|
|
}
|
2015-05-20 03:29:17 +02:00
|
|
|
|
|
|
|
update_bgp_group_free (bgp);
|
2009-07-16 20:27:32 +02:00
|
|
|
/* Remove visibility via the master list - there may however still be
|
|
|
|
* routes to be processed still referencing the struct bgp.
|
|
|
|
*/
|
|
|
|
listnode_delete (bm->bgp, bgp);
|
2009-07-22 01:27:21 +02:00
|
|
|
if (list_isempty(bm->bgp))
|
|
|
|
bgp_close ();
|
|
|
|
|
2009-05-21 17:51:03 +02:00
|
|
|
bgp_unlock(bgp); /* initial reference */
|
2015-05-20 03:29:16 +02:00
|
|
|
|
2009-05-21 17:51:03 +02:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void bgp_free (struct bgp *);
|
|
|
|
|
|
|
|
void
|
|
|
|
bgp_lock (struct bgp *bgp)
|
|
|
|
{
|
|
|
|
++bgp->lock;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
bgp_unlock(struct bgp *bgp)
|
|
|
|
{
|
[bgpd] Stability fixes including bugs 397, 492
I've spent the last several weeks working on stability fixes to bgpd.
These patches fix all of the numerous crashes, assertion failures, memory
leaks and memory stomping I could find. Valgrind was used extensively.
Added new function bgp_exit() to help catch problems. If "debug bgp" is
configured and bgpd exits with status of 0, statistics on remaining
lib/memory.c allocations are printed to stderr. It is my hope that other
developers will use this to stay on top of memory issues.
Example questionable exit:
bgpd: memstats: Current memory utilization in module LIB:
bgpd: memstats: Link List : 6
bgpd: memstats: Link Node : 5
bgpd: memstats: Hash : 8
bgpd: memstats: Hash Bucket : 2
bgpd: memstats: Hash Index : 8
bgpd: memstats: Work queue : 3
bgpd: memstats: Work queue item : 2
bgpd: memstats: Work queue name string : 3
bgpd: memstats: Current memory utilization in module BGP:
bgpd: memstats: BGP instance : 1
bgpd: memstats: BGP peer : 1
bgpd: memstats: BGP peer hostname : 1
bgpd: memstats: BGP attribute : 1
bgpd: memstats: BGP extra attributes : 1
bgpd: memstats: BGP aspath : 1
bgpd: memstats: BGP aspath str : 1
bgpd: memstats: BGP table : 24
bgpd: memstats: BGP node : 1
bgpd: memstats: BGP route : 1
bgpd: memstats: BGP synchronise : 8
bgpd: memstats: BGP Process queue : 1
bgpd: memstats: BGP node clear queue : 1
bgpd: memstats: NOTE: If configuration exists, utilization may be expected.
Example clean exit:
bgpd: memstats: No remaining tracked memory utilization.
This patch fixes bug #397: "Invalid free in bgp_announce_check()".
This patch fixes bug #492: "SIGBUS in bgpd/bgp_route.c:
bgp_clear_route_node()".
My apologies for not separating out these changes into individual patches.
The complexity of doing so boggled what is left of my brain. I hope this
is all still useful to the community.
This code has been production tested, in non-route-server-client mode, on
a linux 32-bit box and a 64-bit box.
Release/reset functions, used by bgp_exit(), added to:
bgpd/bgp_attr.c,h
bgpd/bgp_community.c,h
bgpd/bgp_dump.c,h
bgpd/bgp_ecommunity.c,h
bgpd/bgp_filter.c,h
bgpd/bgp_nexthop.c,h
bgpd/bgp_route.c,h
lib/routemap.c,h
File by file analysis:
* bgpd/bgp_aspath.c: Prevent re-use of ashash after it is released.
* bgpd/bgp_attr.c: #if removed uncalled cluster_dup().
* bgpd/bgp_clist.c,h: Allow community_list_terminate() to be called from
bgp_exit().
* bgpd/bgp_filter.c: Fix aslist->name use without allocation check, and
also fix memory leak.
* bgpd/bgp_main.c: Created bgp_exit() exit routine. This function frees
allocations made as part of bgpd initialization and, to some extent,
configuration. If "debug bgp" is configured, memory stats are printed
as described above.
* bgpd/bgp_nexthop.c: zclient_new() already allocates stream for
ibuf/obuf, so bgp_scan_init() shouldn't do it too. Also, made it so
zlookup is global so bgp_exit() can use it.
* bgpd/bgp_packet.c: bgp_capability_msg_parse() call to bgp_clear_route()
adjusted to use new BGP_CLEAR_ROUTE_NORMAL flag.
* bgpd/bgp_route.h: Correct reference counter "lock" to be signed.
bgp_clear_route() now accepts a bgp_clear_route_type of either
BGP_CLEAR_ROUTE_NORMAL or BGP_CLEAR_ROUTE_MY_RSCLIENT.
* bgpd/bgp_route.c:
- bgp_process_rsclient(): attr was being zero'ed and then
bgp_attr_extra_free() was being called with it, even though it was
never filled with valid data.
- bgp_process_rsclient(): Make sure rsclient->group is not NULL before
use.
- bgp_processq_del(): Add call to bgp_table_unlock().
- bgp_process(): Add call to bgp_table_lock().
- bgp_update_rsclient(): memset clearing of new_attr not needed since
declarationw with "= { 0 }" does it. memset was already commented
out.
- bgp_update_rsclient(): Fix screwed up misleading indentation.
- bgp_withdraw_rsclient(): Fix screwed up misleading indentation.
- bgp_clear_route_node(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT.
- bgp_clear_node_queue_del(): Add call to bgp_table_unlock() and also
free struct bgp_clear_node_queue used for work item.
- bgp_clear_node_complete(): Do peer_unlock() after BGP_EVENT_ADD() in
case peer is released by peer_unlock() call.
- bgp_clear_route_table(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT. Use
struct bgp_clear_node_queue to supply data to worker. Add call to
bgp_table_lock().
- bgp_clear_route(): Add support for BGP_CLEAR_ROUTE_NORMAL or
BGP_CLEAR_ROUTE_MY_RSCLIENT.
- bgp_clear_route_all(): Use BGP_CLEAR_ROUTE_NORMAL.
Bug 397 fixes:
- bgp_default_originate()
- bgp_announce_table()
* bgpd/bgp_table.h:
- struct bgp_table: Added reference count. Changed type of owner to be
"struct peer *" rather than "void *".
- struct bgp_node: Correct reference counter "lock" to be signed.
* bgpd/bgp_table.c:
- Added bgp_table reference counting.
- bgp_table_free(): Fixed cleanup code. Call peer_unlock() on owner if
set.
- bgp_unlock_node(): Added assertion.
- bgp_node_get(): Added call to bgp_lock_node() to code path that it was
missing from.
* bgpd/bgp_vty.c:
- peer_rsclient_set_vty(): Call peer_lock() as part of peer assignment
to owner. Handle failure gracefully.
- peer_rsclient_unset_vty(): Add call to bgp_clear_route() with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
* bgpd/bgp_zebra.c: Made it so zclient is global so bgp_exit() can use it.
* bgpd/bgpd.c:
- peer_lock(): Allow to be called when status is "Deleted".
- peer_deactivate(): Supply BGP_CLEAR_ROUTE_NORMAL purpose to
bgp_clear_route() call.
- peer_delete(): Common variable listnode pn. Fix bug in which rsclient
was only dealt with if not part of a peer group. Call
bgp_clear_route() for rsclient, if appropriate, and do so with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
- peer_group_get(): Use XSTRDUP() instead of strdup() for conf->host.
- peer_group_bind(): Call bgp_clear_route() for rsclient, and do so with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
- bgp_create(): Use XSTRDUP() instead of strdup() for peer_self->host.
- bgp_delete(): Delete peers before groups, rather than after. And then
rather than deleting rsclients, verify that there are none at this
point.
- bgp_unlock(): Add assertion.
- bgp_free(): Call bgp_table_finish() rather than doing XFREE() itself.
* lib/command.c,h: Compiler warning fixes. Add cmd_terminate(). Fixed
massive leak in install_element() in which cmd_make_descvec() was being
called more than once for the same cmd->strvec/string/doc.
* lib/log.c: Make closezlog() check fp before calling fclose().
* lib/memory.c: Catch when alloc count goes negative by using signed
counts. Correct #endif comment. Add log_memstats_stderr().
* lib/memory.h: Add log_memstats_stderr().
* lib/thread.c: thread->funcname was being accessed in thread_call() after
it had been freed. Rearranged things so that thread_call() frees
funcname. Also made it so thread_master_free() cleans up cpu_record.
* lib/vty.c,h: Use global command_cr. Add vty_terminate().
* lib/zclient.c,h: Re-enable zclient_free().
2009-07-18 07:44:03 +02:00
|
|
|
assert(bgp->lock > 0);
|
2009-05-21 17:51:03 +02:00
|
|
|
if (--bgp->lock == 0)
|
|
|
|
bgp_free (bgp);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
bgp_free (struct bgp *bgp)
|
|
|
|
{
|
|
|
|
afi_t afi;
|
|
|
|
safi_t safi;
|
|
|
|
|
|
|
|
list_delete (bgp->group);
|
|
|
|
list_delete (bgp->peer);
|
2004-09-13 Jose Luis Rubio <jrubio@dit.upm.es>
(at Technical University of Madrid as part of Euro6ix Project)
Enhanced Route Server functionality and Route-Maps:
* bgpd/bgpd.h: Modified 'struct peer' and 'struct bgp_filter' to
support rs-clients. A 'struct bgp_table *rib' has been added to the
first (to mantain a separated RIB for each rs-client) and two new
route-maps have been added to the last (for import/export policies).
Added the following #defines: RMAP_{IN|OUT|IMPORT|EXPORT|MAX},
PEER_RMAP_TYPE_{IMPORT|EXPORT} and BGP_CLEAR_SOFT_RSCLIENT.
* bgpd/bgpd.c: Modified the functions that create/delete/etc peers in
order to consider the new fields included in 'struct peer' for
supporting rs-clients, i.e. the import/export route-maps and the
'struct bgp_table'.
* bgpd/bgp_route.{ch}: Modified several functions related with
receiving/sending announces in order to support the new Route Server
capabilities.
Function 'bgp_process' has been reorganized, creating an auxiliar
function for best path selection ('bgp_best_selection').
Modified 'bgp_show' and 'bgp_show_route' for displaying information
about any RIB (and not only the main bgp RIB).
Added commands for displaying information about RS-clients RIBs:
'show bgp rsclient (A.B.C.D|X:X::X:X)', 'show bgp rsclient
(A.B.C.D|X:X::X:X) X:X::X:X/M', etc
* bgpd/bgp_table.{ch}: The structure 'struct bgp_table' now has two
new fields: type (which can take the values BGP_TABLE_{MAIN|RSCLIENT})
and 'void *owner' which points to 'struct bgp' or 'struct peer' which
owns the table.
When creating a new bgp_table by default 'type=BGP_TABLE_MAIN' is set.
* bgpd/bgp_vty.c: The commands 'neighbor ... route-server-client' and
'no neighbor ... route-server-client' now not only set/unset the flag
PEER_FLAG_RSERVER_CLIENT, but they create/destroy the 'struct
bgp_table' of the peer. Special actions are taken for peer_groups.
Command 'neighbor ... route-map WORD (in|out)' now also supports two
new kinds of route-map: 'import' and 'export'.
Added commands 'clear bgp * rsclient', etc. These commands allow a new
kind of soft_reconfig which affects only the RIB of the specified
RS-client.
Added commands 'show bgp rsclient summary', etc which display a
summary of the rs-clients configured for the corresponding address
family.
* bgpd/bgp_routemap.c: A new match statement is available,
'match peer (A.B.C.D|X:X::X:X)'. This statement can only be used in
import/export route-maps, and it matches when the peer who announces
(when used in an import route-map) or is going to receive (when used
in an export route-map) the route is the same than the one specified
in the statement.
For peer-groups the statement matches if the specified peer is member
of the peer-group.
A special version of the command, 'match peer local', matches with
routes originated by the Route Server (defined with 'network ...',
redistributed routes and default-originate).
* lib/routemap.{ch}: Added a new clause 'call NAME' for use in
route-maps. It jumps into the specified route-map and when it returns
the first route-map ends if the called RM returns DENY_MATCH, or
continues in other case.
2004-09-13 07:12:46 +02:00
|
|
|
list_delete (bgp->rsclient);
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
if (bgp->name)
|
|
|
|
free (bgp->name);
|
|
|
|
|
|
|
|
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
|
|
|
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
|
|
|
|
{
|
|
|
|
if (bgp->route[afi][safi])
|
[bgpd] Stability fixes including bugs 397, 492
I've spent the last several weeks working on stability fixes to bgpd.
These patches fix all of the numerous crashes, assertion failures, memory
leaks and memory stomping I could find. Valgrind was used extensively.
Added new function bgp_exit() to help catch problems. If "debug bgp" is
configured and bgpd exits with status of 0, statistics on remaining
lib/memory.c allocations are printed to stderr. It is my hope that other
developers will use this to stay on top of memory issues.
Example questionable exit:
bgpd: memstats: Current memory utilization in module LIB:
bgpd: memstats: Link List : 6
bgpd: memstats: Link Node : 5
bgpd: memstats: Hash : 8
bgpd: memstats: Hash Bucket : 2
bgpd: memstats: Hash Index : 8
bgpd: memstats: Work queue : 3
bgpd: memstats: Work queue item : 2
bgpd: memstats: Work queue name string : 3
bgpd: memstats: Current memory utilization in module BGP:
bgpd: memstats: BGP instance : 1
bgpd: memstats: BGP peer : 1
bgpd: memstats: BGP peer hostname : 1
bgpd: memstats: BGP attribute : 1
bgpd: memstats: BGP extra attributes : 1
bgpd: memstats: BGP aspath : 1
bgpd: memstats: BGP aspath str : 1
bgpd: memstats: BGP table : 24
bgpd: memstats: BGP node : 1
bgpd: memstats: BGP route : 1
bgpd: memstats: BGP synchronise : 8
bgpd: memstats: BGP Process queue : 1
bgpd: memstats: BGP node clear queue : 1
bgpd: memstats: NOTE: If configuration exists, utilization may be expected.
Example clean exit:
bgpd: memstats: No remaining tracked memory utilization.
This patch fixes bug #397: "Invalid free in bgp_announce_check()".
This patch fixes bug #492: "SIGBUS in bgpd/bgp_route.c:
bgp_clear_route_node()".
My apologies for not separating out these changes into individual patches.
The complexity of doing so boggled what is left of my brain. I hope this
is all still useful to the community.
This code has been production tested, in non-route-server-client mode, on
a linux 32-bit box and a 64-bit box.
Release/reset functions, used by bgp_exit(), added to:
bgpd/bgp_attr.c,h
bgpd/bgp_community.c,h
bgpd/bgp_dump.c,h
bgpd/bgp_ecommunity.c,h
bgpd/bgp_filter.c,h
bgpd/bgp_nexthop.c,h
bgpd/bgp_route.c,h
lib/routemap.c,h
File by file analysis:
* bgpd/bgp_aspath.c: Prevent re-use of ashash after it is released.
* bgpd/bgp_attr.c: #if removed uncalled cluster_dup().
* bgpd/bgp_clist.c,h: Allow community_list_terminate() to be called from
bgp_exit().
* bgpd/bgp_filter.c: Fix aslist->name use without allocation check, and
also fix memory leak.
* bgpd/bgp_main.c: Created bgp_exit() exit routine. This function frees
allocations made as part of bgpd initialization and, to some extent,
configuration. If "debug bgp" is configured, memory stats are printed
as described above.
* bgpd/bgp_nexthop.c: zclient_new() already allocates stream for
ibuf/obuf, so bgp_scan_init() shouldn't do it too. Also, made it so
zlookup is global so bgp_exit() can use it.
* bgpd/bgp_packet.c: bgp_capability_msg_parse() call to bgp_clear_route()
adjusted to use new BGP_CLEAR_ROUTE_NORMAL flag.
* bgpd/bgp_route.h: Correct reference counter "lock" to be signed.
bgp_clear_route() now accepts a bgp_clear_route_type of either
BGP_CLEAR_ROUTE_NORMAL or BGP_CLEAR_ROUTE_MY_RSCLIENT.
* bgpd/bgp_route.c:
- bgp_process_rsclient(): attr was being zero'ed and then
bgp_attr_extra_free() was being called with it, even though it was
never filled with valid data.
- bgp_process_rsclient(): Make sure rsclient->group is not NULL before
use.
- bgp_processq_del(): Add call to bgp_table_unlock().
- bgp_process(): Add call to bgp_table_lock().
- bgp_update_rsclient(): memset clearing of new_attr not needed since
declarationw with "= { 0 }" does it. memset was already commented
out.
- bgp_update_rsclient(): Fix screwed up misleading indentation.
- bgp_withdraw_rsclient(): Fix screwed up misleading indentation.
- bgp_clear_route_node(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT.
- bgp_clear_node_queue_del(): Add call to bgp_table_unlock() and also
free struct bgp_clear_node_queue used for work item.
- bgp_clear_node_complete(): Do peer_unlock() after BGP_EVENT_ADD() in
case peer is released by peer_unlock() call.
- bgp_clear_route_table(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT. Use
struct bgp_clear_node_queue to supply data to worker. Add call to
bgp_table_lock().
- bgp_clear_route(): Add support for BGP_CLEAR_ROUTE_NORMAL or
BGP_CLEAR_ROUTE_MY_RSCLIENT.
- bgp_clear_route_all(): Use BGP_CLEAR_ROUTE_NORMAL.
Bug 397 fixes:
- bgp_default_originate()
- bgp_announce_table()
* bgpd/bgp_table.h:
- struct bgp_table: Added reference count. Changed type of owner to be
"struct peer *" rather than "void *".
- struct bgp_node: Correct reference counter "lock" to be signed.
* bgpd/bgp_table.c:
- Added bgp_table reference counting.
- bgp_table_free(): Fixed cleanup code. Call peer_unlock() on owner if
set.
- bgp_unlock_node(): Added assertion.
- bgp_node_get(): Added call to bgp_lock_node() to code path that it was
missing from.
* bgpd/bgp_vty.c:
- peer_rsclient_set_vty(): Call peer_lock() as part of peer assignment
to owner. Handle failure gracefully.
- peer_rsclient_unset_vty(): Add call to bgp_clear_route() with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
* bgpd/bgp_zebra.c: Made it so zclient is global so bgp_exit() can use it.
* bgpd/bgpd.c:
- peer_lock(): Allow to be called when status is "Deleted".
- peer_deactivate(): Supply BGP_CLEAR_ROUTE_NORMAL purpose to
bgp_clear_route() call.
- peer_delete(): Common variable listnode pn. Fix bug in which rsclient
was only dealt with if not part of a peer group. Call
bgp_clear_route() for rsclient, if appropriate, and do so with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
- peer_group_get(): Use XSTRDUP() instead of strdup() for conf->host.
- peer_group_bind(): Call bgp_clear_route() for rsclient, and do so with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
- bgp_create(): Use XSTRDUP() instead of strdup() for peer_self->host.
- bgp_delete(): Delete peers before groups, rather than after. And then
rather than deleting rsclients, verify that there are none at this
point.
- bgp_unlock(): Add assertion.
- bgp_free(): Call bgp_table_finish() rather than doing XFREE() itself.
* lib/command.c,h: Compiler warning fixes. Add cmd_terminate(). Fixed
massive leak in install_element() in which cmd_make_descvec() was being
called more than once for the same cmd->strvec/string/doc.
* lib/log.c: Make closezlog() check fp before calling fclose().
* lib/memory.c: Catch when alloc count goes negative by using signed
counts. Correct #endif comment. Add log_memstats_stderr().
* lib/memory.h: Add log_memstats_stderr().
* lib/thread.c: thread->funcname was being accessed in thread_call() after
it had been freed. Rearranged things so that thread_call() frees
funcname. Also made it so thread_master_free() cleans up cpu_record.
* lib/vty.c,h: Use global command_cr. Add vty_terminate().
* lib/zclient.c,h: Re-enable zclient_free().
2009-07-18 07:44:03 +02:00
|
|
|
bgp_table_finish (&bgp->route[afi][safi]);
|
2002-12-13 21:15:29 +01:00
|
|
|
if (bgp->aggregate[afi][safi])
|
[bgpd] Stability fixes including bugs 397, 492
I've spent the last several weeks working on stability fixes to bgpd.
These patches fix all of the numerous crashes, assertion failures, memory
leaks and memory stomping I could find. Valgrind was used extensively.
Added new function bgp_exit() to help catch problems. If "debug bgp" is
configured and bgpd exits with status of 0, statistics on remaining
lib/memory.c allocations are printed to stderr. It is my hope that other
developers will use this to stay on top of memory issues.
Example questionable exit:
bgpd: memstats: Current memory utilization in module LIB:
bgpd: memstats: Link List : 6
bgpd: memstats: Link Node : 5
bgpd: memstats: Hash : 8
bgpd: memstats: Hash Bucket : 2
bgpd: memstats: Hash Index : 8
bgpd: memstats: Work queue : 3
bgpd: memstats: Work queue item : 2
bgpd: memstats: Work queue name string : 3
bgpd: memstats: Current memory utilization in module BGP:
bgpd: memstats: BGP instance : 1
bgpd: memstats: BGP peer : 1
bgpd: memstats: BGP peer hostname : 1
bgpd: memstats: BGP attribute : 1
bgpd: memstats: BGP extra attributes : 1
bgpd: memstats: BGP aspath : 1
bgpd: memstats: BGP aspath str : 1
bgpd: memstats: BGP table : 24
bgpd: memstats: BGP node : 1
bgpd: memstats: BGP route : 1
bgpd: memstats: BGP synchronise : 8
bgpd: memstats: BGP Process queue : 1
bgpd: memstats: BGP node clear queue : 1
bgpd: memstats: NOTE: If configuration exists, utilization may be expected.
Example clean exit:
bgpd: memstats: No remaining tracked memory utilization.
This patch fixes bug #397: "Invalid free in bgp_announce_check()".
This patch fixes bug #492: "SIGBUS in bgpd/bgp_route.c:
bgp_clear_route_node()".
My apologies for not separating out these changes into individual patches.
The complexity of doing so boggled what is left of my brain. I hope this
is all still useful to the community.
This code has been production tested, in non-route-server-client mode, on
a linux 32-bit box and a 64-bit box.
Release/reset functions, used by bgp_exit(), added to:
bgpd/bgp_attr.c,h
bgpd/bgp_community.c,h
bgpd/bgp_dump.c,h
bgpd/bgp_ecommunity.c,h
bgpd/bgp_filter.c,h
bgpd/bgp_nexthop.c,h
bgpd/bgp_route.c,h
lib/routemap.c,h
File by file analysis:
* bgpd/bgp_aspath.c: Prevent re-use of ashash after it is released.
* bgpd/bgp_attr.c: #if removed uncalled cluster_dup().
* bgpd/bgp_clist.c,h: Allow community_list_terminate() to be called from
bgp_exit().
* bgpd/bgp_filter.c: Fix aslist->name use without allocation check, and
also fix memory leak.
* bgpd/bgp_main.c: Created bgp_exit() exit routine. This function frees
allocations made as part of bgpd initialization and, to some extent,
configuration. If "debug bgp" is configured, memory stats are printed
as described above.
* bgpd/bgp_nexthop.c: zclient_new() already allocates stream for
ibuf/obuf, so bgp_scan_init() shouldn't do it too. Also, made it so
zlookup is global so bgp_exit() can use it.
* bgpd/bgp_packet.c: bgp_capability_msg_parse() call to bgp_clear_route()
adjusted to use new BGP_CLEAR_ROUTE_NORMAL flag.
* bgpd/bgp_route.h: Correct reference counter "lock" to be signed.
bgp_clear_route() now accepts a bgp_clear_route_type of either
BGP_CLEAR_ROUTE_NORMAL or BGP_CLEAR_ROUTE_MY_RSCLIENT.
* bgpd/bgp_route.c:
- bgp_process_rsclient(): attr was being zero'ed and then
bgp_attr_extra_free() was being called with it, even though it was
never filled with valid data.
- bgp_process_rsclient(): Make sure rsclient->group is not NULL before
use.
- bgp_processq_del(): Add call to bgp_table_unlock().
- bgp_process(): Add call to bgp_table_lock().
- bgp_update_rsclient(): memset clearing of new_attr not needed since
declarationw with "= { 0 }" does it. memset was already commented
out.
- bgp_update_rsclient(): Fix screwed up misleading indentation.
- bgp_withdraw_rsclient(): Fix screwed up misleading indentation.
- bgp_clear_route_node(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT.
- bgp_clear_node_queue_del(): Add call to bgp_table_unlock() and also
free struct bgp_clear_node_queue used for work item.
- bgp_clear_node_complete(): Do peer_unlock() after BGP_EVENT_ADD() in
case peer is released by peer_unlock() call.
- bgp_clear_route_table(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT. Use
struct bgp_clear_node_queue to supply data to worker. Add call to
bgp_table_lock().
- bgp_clear_route(): Add support for BGP_CLEAR_ROUTE_NORMAL or
BGP_CLEAR_ROUTE_MY_RSCLIENT.
- bgp_clear_route_all(): Use BGP_CLEAR_ROUTE_NORMAL.
Bug 397 fixes:
- bgp_default_originate()
- bgp_announce_table()
* bgpd/bgp_table.h:
- struct bgp_table: Added reference count. Changed type of owner to be
"struct peer *" rather than "void *".
- struct bgp_node: Correct reference counter "lock" to be signed.
* bgpd/bgp_table.c:
- Added bgp_table reference counting.
- bgp_table_free(): Fixed cleanup code. Call peer_unlock() on owner if
set.
- bgp_unlock_node(): Added assertion.
- bgp_node_get(): Added call to bgp_lock_node() to code path that it was
missing from.
* bgpd/bgp_vty.c:
- peer_rsclient_set_vty(): Call peer_lock() as part of peer assignment
to owner. Handle failure gracefully.
- peer_rsclient_unset_vty(): Add call to bgp_clear_route() with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
* bgpd/bgp_zebra.c: Made it so zclient is global so bgp_exit() can use it.
* bgpd/bgpd.c:
- peer_lock(): Allow to be called when status is "Deleted".
- peer_deactivate(): Supply BGP_CLEAR_ROUTE_NORMAL purpose to
bgp_clear_route() call.
- peer_delete(): Common variable listnode pn. Fix bug in which rsclient
was only dealt with if not part of a peer group. Call
bgp_clear_route() for rsclient, if appropriate, and do so with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
- peer_group_get(): Use XSTRDUP() instead of strdup() for conf->host.
- peer_group_bind(): Call bgp_clear_route() for rsclient, and do so with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
- bgp_create(): Use XSTRDUP() instead of strdup() for peer_self->host.
- bgp_delete(): Delete peers before groups, rather than after. And then
rather than deleting rsclients, verify that there are none at this
point.
- bgp_unlock(): Add assertion.
- bgp_free(): Call bgp_table_finish() rather than doing XFREE() itself.
* lib/command.c,h: Compiler warning fixes. Add cmd_terminate(). Fixed
massive leak in install_element() in which cmd_make_descvec() was being
called more than once for the same cmd->strvec/string/doc.
* lib/log.c: Make closezlog() check fp before calling fclose().
* lib/memory.c: Catch when alloc count goes negative by using signed
counts. Correct #endif comment. Add log_memstats_stderr().
* lib/memory.h: Add log_memstats_stderr().
* lib/thread.c: thread->funcname was being accessed in thread_call() after
it had been freed. Rearranged things so that thread_call() frees
funcname. Also made it so thread_master_free() cleans up cpu_record.
* lib/vty.c,h: Use global command_cr. Add vty_terminate().
* lib/zclient.c,h: Re-enable zclient_free().
2009-07-18 07:44:03 +02:00
|
|
|
bgp_table_finish (&bgp->aggregate[afi][safi]) ;
|
2002-12-13 21:15:29 +01:00
|
|
|
if (bgp->rib[afi][safi])
|
[bgpd] Stability fixes including bugs 397, 492
I've spent the last several weeks working on stability fixes to bgpd.
These patches fix all of the numerous crashes, assertion failures, memory
leaks and memory stomping I could find. Valgrind was used extensively.
Added new function bgp_exit() to help catch problems. If "debug bgp" is
configured and bgpd exits with status of 0, statistics on remaining
lib/memory.c allocations are printed to stderr. It is my hope that other
developers will use this to stay on top of memory issues.
Example questionable exit:
bgpd: memstats: Current memory utilization in module LIB:
bgpd: memstats: Link List : 6
bgpd: memstats: Link Node : 5
bgpd: memstats: Hash : 8
bgpd: memstats: Hash Bucket : 2
bgpd: memstats: Hash Index : 8
bgpd: memstats: Work queue : 3
bgpd: memstats: Work queue item : 2
bgpd: memstats: Work queue name string : 3
bgpd: memstats: Current memory utilization in module BGP:
bgpd: memstats: BGP instance : 1
bgpd: memstats: BGP peer : 1
bgpd: memstats: BGP peer hostname : 1
bgpd: memstats: BGP attribute : 1
bgpd: memstats: BGP extra attributes : 1
bgpd: memstats: BGP aspath : 1
bgpd: memstats: BGP aspath str : 1
bgpd: memstats: BGP table : 24
bgpd: memstats: BGP node : 1
bgpd: memstats: BGP route : 1
bgpd: memstats: BGP synchronise : 8
bgpd: memstats: BGP Process queue : 1
bgpd: memstats: BGP node clear queue : 1
bgpd: memstats: NOTE: If configuration exists, utilization may be expected.
Example clean exit:
bgpd: memstats: No remaining tracked memory utilization.
This patch fixes bug #397: "Invalid free in bgp_announce_check()".
This patch fixes bug #492: "SIGBUS in bgpd/bgp_route.c:
bgp_clear_route_node()".
My apologies for not separating out these changes into individual patches.
The complexity of doing so boggled what is left of my brain. I hope this
is all still useful to the community.
This code has been production tested, in non-route-server-client mode, on
a linux 32-bit box and a 64-bit box.
Release/reset functions, used by bgp_exit(), added to:
bgpd/bgp_attr.c,h
bgpd/bgp_community.c,h
bgpd/bgp_dump.c,h
bgpd/bgp_ecommunity.c,h
bgpd/bgp_filter.c,h
bgpd/bgp_nexthop.c,h
bgpd/bgp_route.c,h
lib/routemap.c,h
File by file analysis:
* bgpd/bgp_aspath.c: Prevent re-use of ashash after it is released.
* bgpd/bgp_attr.c: #if removed uncalled cluster_dup().
* bgpd/bgp_clist.c,h: Allow community_list_terminate() to be called from
bgp_exit().
* bgpd/bgp_filter.c: Fix aslist->name use without allocation check, and
also fix memory leak.
* bgpd/bgp_main.c: Created bgp_exit() exit routine. This function frees
allocations made as part of bgpd initialization and, to some extent,
configuration. If "debug bgp" is configured, memory stats are printed
as described above.
* bgpd/bgp_nexthop.c: zclient_new() already allocates stream for
ibuf/obuf, so bgp_scan_init() shouldn't do it too. Also, made it so
zlookup is global so bgp_exit() can use it.
* bgpd/bgp_packet.c: bgp_capability_msg_parse() call to bgp_clear_route()
adjusted to use new BGP_CLEAR_ROUTE_NORMAL flag.
* bgpd/bgp_route.h: Correct reference counter "lock" to be signed.
bgp_clear_route() now accepts a bgp_clear_route_type of either
BGP_CLEAR_ROUTE_NORMAL or BGP_CLEAR_ROUTE_MY_RSCLIENT.
* bgpd/bgp_route.c:
- bgp_process_rsclient(): attr was being zero'ed and then
bgp_attr_extra_free() was being called with it, even though it was
never filled with valid data.
- bgp_process_rsclient(): Make sure rsclient->group is not NULL before
use.
- bgp_processq_del(): Add call to bgp_table_unlock().
- bgp_process(): Add call to bgp_table_lock().
- bgp_update_rsclient(): memset clearing of new_attr not needed since
declarationw with "= { 0 }" does it. memset was already commented
out.
- bgp_update_rsclient(): Fix screwed up misleading indentation.
- bgp_withdraw_rsclient(): Fix screwed up misleading indentation.
- bgp_clear_route_node(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT.
- bgp_clear_node_queue_del(): Add call to bgp_table_unlock() and also
free struct bgp_clear_node_queue used for work item.
- bgp_clear_node_complete(): Do peer_unlock() after BGP_EVENT_ADD() in
case peer is released by peer_unlock() call.
- bgp_clear_route_table(): Support BGP_CLEAR_ROUTE_MY_RSCLIENT. Use
struct bgp_clear_node_queue to supply data to worker. Add call to
bgp_table_lock().
- bgp_clear_route(): Add support for BGP_CLEAR_ROUTE_NORMAL or
BGP_CLEAR_ROUTE_MY_RSCLIENT.
- bgp_clear_route_all(): Use BGP_CLEAR_ROUTE_NORMAL.
Bug 397 fixes:
- bgp_default_originate()
- bgp_announce_table()
* bgpd/bgp_table.h:
- struct bgp_table: Added reference count. Changed type of owner to be
"struct peer *" rather than "void *".
- struct bgp_node: Correct reference counter "lock" to be signed.
* bgpd/bgp_table.c:
- Added bgp_table reference counting.
- bgp_table_free(): Fixed cleanup code. Call peer_unlock() on owner if
set.
- bgp_unlock_node(): Added assertion.
- bgp_node_get(): Added call to bgp_lock_node() to code path that it was
missing from.
* bgpd/bgp_vty.c:
- peer_rsclient_set_vty(): Call peer_lock() as part of peer assignment
to owner. Handle failure gracefully.
- peer_rsclient_unset_vty(): Add call to bgp_clear_route() with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
* bgpd/bgp_zebra.c: Made it so zclient is global so bgp_exit() can use it.
* bgpd/bgpd.c:
- peer_lock(): Allow to be called when status is "Deleted".
- peer_deactivate(): Supply BGP_CLEAR_ROUTE_NORMAL purpose to
bgp_clear_route() call.
- peer_delete(): Common variable listnode pn. Fix bug in which rsclient
was only dealt with if not part of a peer group. Call
bgp_clear_route() for rsclient, if appropriate, and do so with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
- peer_group_get(): Use XSTRDUP() instead of strdup() for conf->host.
- peer_group_bind(): Call bgp_clear_route() for rsclient, and do so with
BGP_CLEAR_ROUTE_MY_RSCLIENT purpose.
- bgp_create(): Use XSTRDUP() instead of strdup() for peer_self->host.
- bgp_delete(): Delete peers before groups, rather than after. And then
rather than deleting rsclients, verify that there are none at this
point.
- bgp_unlock(): Add assertion.
- bgp_free(): Call bgp_table_finish() rather than doing XFREE() itself.
* lib/command.c,h: Compiler warning fixes. Add cmd_terminate(). Fixed
massive leak in install_element() in which cmd_make_descvec() was being
called more than once for the same cmd->strvec/string/doc.
* lib/log.c: Make closezlog() check fp before calling fclose().
* lib/memory.c: Catch when alloc count goes negative by using signed
counts. Correct #endif comment. Add log_memstats_stderr().
* lib/memory.h: Add log_memstats_stderr().
* lib/thread.c: thread->funcname was being accessed in thread_call() after
it had been freed. Rearranged things so that thread_call() frees
funcname. Also made it so thread_master_free() cleans up cpu_record.
* lib/vty.c,h: Use global command_cr. Add vty_terminate().
* lib/zclient.c,h: Re-enable zclient_free().
2009-07-18 07:44:03 +02:00
|
|
|
bgp_table_finish (&bgp->rib[afi][safi]);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
XFREE (MTYPE_BGP, bgp);
|
|
|
|
}
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2015-05-20 02:40:40 +02:00
|
|
|
struct peer *
|
|
|
|
peer_lookup_by_conf_if (struct bgp *bgp, const char *conf_if)
|
|
|
|
{
|
|
|
|
struct peer *peer;
|
|
|
|
struct listnode *node, *nnode;
|
|
|
|
|
|
|
|
if (!conf_if)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
if (bgp != NULL)
|
|
|
|
{
|
|
|
|
for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
|
|
|
|
if (peer->conf_if && !strcmp(peer->conf_if, conf_if)
|
|
|
|
&& ! CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
|
|
|
|
return peer;
|
|
|
|
}
|
|
|
|
else if (bm->bgp != NULL)
|
|
|
|
{
|
|
|
|
struct listnode *bgpnode, *nbgpnode;
|
|
|
|
|
|
|
|
for (ALL_LIST_ELEMENTS (bm->bgp, bgpnode, nbgpnode, bgp))
|
|
|
|
for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
|
|
|
|
if (peer->conf_if && !strcmp(peer->conf_if, conf_if)
|
|
|
|
&& ! CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
|
|
|
|
return peer;
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2015-05-20 03:29:16 +02:00
|
|
|
struct peer *
|
|
|
|
peer_lookup_by_hostname (struct bgp *bgp, const char *hostname)
|
|
|
|
{
|
|
|
|
struct peer *peer;
|
|
|
|
struct listnode *node, *nnode;
|
|
|
|
|
|
|
|
if (!hostname)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
if (bgp != NULL)
|
|
|
|
{
|
|
|
|
for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
|
|
|
|
if (peer->hostname && !strcmp(peer->hostname, hostname)
|
|
|
|
&& ! CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
|
|
|
|
return peer;
|
|
|
|
}
|
|
|
|
else if (bm->bgp != NULL)
|
|
|
|
{
|
|
|
|
struct listnode *bgpnode, *nbgpnode;
|
|
|
|
|
|
|
|
for (ALL_LIST_ELEMENTS (bm->bgp, bgpnode, nbgpnode, bgp))
|
|
|
|
for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
|
|
|
|
if (peer->hostname && !strcmp(peer->hostname, hostname)
|
|
|
|
&& ! CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
|
|
|
|
return peer;
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
struct peer *
|
|
|
|
peer_lookup (struct bgp *bgp, union sockunion *su)
|
|
|
|
{
|
|
|
|
struct peer *peer;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2009-07-28 18:54:35 +02:00
|
|
|
if (bgp != NULL)
|
|
|
|
{
|
2009-07-28 19:10:55 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
|
|
|
|
if (sockunion_same (&peer->su, su)
|
2015-05-20 02:40:37 +02:00
|
|
|
&& (CHECK_FLAG (peer->flags, PEER_FLAG_CONFIG_NODE)))
|
2009-07-28 19:10:55 +02:00
|
|
|
return peer;
|
2009-07-28 18:54:35 +02:00
|
|
|
}
|
|
|
|
else if (bm->bgp != NULL)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
2009-07-28 19:10:55 +02:00
|
|
|
struct listnode *bgpnode, *nbgpnode;
|
|
|
|
|
|
|
|
for (ALL_LIST_ELEMENTS (bm->bgp, bgpnode, nbgpnode, bgp))
|
|
|
|
for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
|
|
|
|
if (sockunion_same (&peer->su, su)
|
2015-05-20 02:40:37 +02:00
|
|
|
&& (CHECK_FLAG (peer->flags, PEER_FLAG_CONFIG_NODE)))
|
2009-07-28 19:10:55 +02:00
|
|
|
return peer;
|
2009-07-28 18:54:35 +02:00
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2015-05-20 03:03:47 +02:00
|
|
|
struct peer *
|
|
|
|
peer_create_bind_dynamic_neighbor (struct bgp *bgp, union sockunion *su,
|
|
|
|
struct peer_group *group)
|
|
|
|
{
|
|
|
|
struct peer *peer;
|
|
|
|
afi_t afi;
|
|
|
|
safi_t safi;
|
|
|
|
|
|
|
|
/* Create peer first; we've already checked group config is valid. */
|
2015-05-20 03:04:25 +02:00
|
|
|
peer = peer_create (su, NULL, bgp, bgp->as, group->conf->as, group->conf->as_type, 0, 0);
|
2015-05-20 03:03:47 +02:00
|
|
|
if (!peer)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
/* Link to group */
|
|
|
|
peer->group = group;
|
|
|
|
peer = peer_lock (peer);
|
|
|
|
listnode_add (group->peer, peer);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Bind peer for all AFs configured for the group. We don't call
|
|
|
|
* peer_group_bind as that is sub-optimal and does some stuff we don't want.
|
|
|
|
*/
|
|
|
|
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
|
|
|
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
|
|
|
|
{
|
|
|
|
if (!group->conf->afc[afi][safi])
|
|
|
|
continue;
|
|
|
|
peer->af_group[afi][safi] = 1;
|
|
|
|
peer->afc[afi][safi] = 1;
|
|
|
|
if (!peer_af_find(peer, afi, safi) &&
|
|
|
|
peer_af_create(peer, afi, safi) == NULL)
|
|
|
|
{
|
|
|
|
zlog_err("couldn't create af structure for peer %s", peer->host);
|
|
|
|
}
|
|
|
|
peer_group2peer_config_copy (group, peer, afi, safi);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Mark as dynamic, but also as a "config node" for other things to work. */
|
|
|
|
SET_FLAG(peer->flags, PEER_FLAG_DYNAMIC_NEIGHBOR);
|
|
|
|
SET_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE);
|
|
|
|
|
|
|
|
return peer;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct prefix *
|
|
|
|
peer_group_lookup_dynamic_neighbor_range (struct peer_group * group,
|
|
|
|
struct prefix * prefix)
|
|
|
|
{
|
|
|
|
struct listnode *node, *nnode;
|
|
|
|
struct prefix *range;
|
|
|
|
afi_t afi;
|
|
|
|
|
|
|
|
afi = family2afi(prefix->family);
|
|
|
|
|
|
|
|
if (group->listen_range[afi])
|
|
|
|
for (ALL_LIST_ELEMENTS (group->listen_range[afi], node, nnode, range))
|
|
|
|
if (prefix_match(range, prefix))
|
|
|
|
return range;
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct peer_group *
|
|
|
|
peer_group_lookup_dynamic_neighbor (struct bgp *bgp, struct prefix *prefix,
|
|
|
|
struct prefix **listen_range)
|
|
|
|
{
|
|
|
|
struct prefix *range = NULL;
|
|
|
|
struct peer_group *group = NULL;
|
|
|
|
struct listnode *node, *nnode;
|
|
|
|
|
|
|
|
*listen_range = NULL;
|
|
|
|
if (bgp != NULL)
|
|
|
|
{
|
|
|
|
for (ALL_LIST_ELEMENTS (bgp->group, node, nnode, group))
|
|
|
|
if ((range = peer_group_lookup_dynamic_neighbor_range(group, prefix)))
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
else if (bm->bgp != NULL)
|
|
|
|
{
|
|
|
|
struct listnode *bgpnode, *nbgpnode;
|
|
|
|
|
|
|
|
for (ALL_LIST_ELEMENTS (bm->bgp, bgpnode, nbgpnode, bgp))
|
|
|
|
for (ALL_LIST_ELEMENTS (bgp->group, node, nnode, group))
|
|
|
|
if ((range = peer_group_lookup_dynamic_neighbor_range(group, prefix)))
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
*listen_range = range;
|
|
|
|
return (group && range) ? group : NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct peer *
|
|
|
|
peer_lookup_dynamic_neighbor (struct bgp *bgp, union sockunion *su)
|
|
|
|
{
|
|
|
|
struct peer_group *group;
|
|
|
|
struct bgp *gbgp;
|
|
|
|
struct peer *peer;
|
|
|
|
struct prefix *prefix;
|
|
|
|
struct prefix *listen_range;
|
|
|
|
int dncount;
|
|
|
|
char buf[SU_ADDRSTRLEN];
|
|
|
|
char buf1[SU_ADDRSTRLEN];
|
|
|
|
|
|
|
|
prefix = sockunion2hostprefix(su);
|
2015-05-20 03:04:25 +02:00
|
|
|
if (!prefix) {
|
2015-05-20 03:03:47 +02:00
|
|
|
return NULL;
|
2015-05-20 03:04:25 +02:00
|
|
|
}
|
2015-05-20 03:03:47 +02:00
|
|
|
|
|
|
|
/* See if incoming connection matches a configured listen range. */
|
|
|
|
group = peer_group_lookup_dynamic_neighbor (bgp, prefix, &listen_range);
|
|
|
|
|
|
|
|
if (! group)
|
|
|
|
return NULL;
|
|
|
|
|
2015-05-20 03:04:25 +02:00
|
|
|
|
2015-05-20 03:03:47 +02:00
|
|
|
gbgp = group->bgp;
|
|
|
|
|
|
|
|
if (! gbgp)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
prefix2str(prefix, buf, sizeof(buf));
|
|
|
|
prefix2str(listen_range, buf1, sizeof(buf1));
|
|
|
|
|
|
|
|
if (bgp_debug_neighbor_events(NULL))
|
|
|
|
zlog_debug ("Dynamic Neighbor %s matches group %s listen range %s",
|
|
|
|
buf, group->name, buf1);
|
|
|
|
|
|
|
|
/* Are we within the listen limit? */
|
|
|
|
dncount = gbgp->dynamic_neighbors_count;
|
|
|
|
|
|
|
|
if (dncount >= gbgp->dynamic_neighbors_limit)
|
|
|
|
{
|
|
|
|
if (bgp_debug_neighbor_events(NULL))
|
|
|
|
zlog_debug ("Dynamic Neighbor %s rejected - at limit %d",
|
|
|
|
inet_sutop (su, buf), gbgp->dynamic_neighbors_limit);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Ensure group is not disabled. */
|
|
|
|
if (CHECK_FLAG (group->conf->flags, PEER_FLAG_SHUTDOWN))
|
|
|
|
{
|
|
|
|
if (bgp_debug_neighbor_events(NULL))
|
|
|
|
zlog_debug ("Dynamic Neighbor %s rejected - group %s disabled",
|
|
|
|
buf, group->name);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Check that at least one AF is activated for the group. */
|
|
|
|
if (!peer_group_af_configured (group))
|
|
|
|
{
|
|
|
|
if (bgp_debug_neighbor_events(NULL))
|
|
|
|
zlog_debug ("Dynamic Neighbor %s rejected - no AF activated for group %s",
|
|
|
|
buf, group->name);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Create dynamic peer and bind to associated group. */
|
|
|
|
peer = peer_create_bind_dynamic_neighbor (gbgp, su, group);
|
|
|
|
assert (peer);
|
|
|
|
|
|
|
|
gbgp->dynamic_neighbors_count = ++dncount;
|
|
|
|
|
|
|
|
if (bgp_debug_neighbor_events(peer))
|
|
|
|
zlog_debug ("%s Dynamic Neighbor added, group %s count %d",
|
|
|
|
peer->host, group->name, dncount);
|
|
|
|
|
|
|
|
return peer;
|
|
|
|
}
|
|
|
|
|
|
|
|
void peer_drop_dynamic_neighbor (struct peer *peer)
|
|
|
|
{
|
|
|
|
int dncount = -1;
|
|
|
|
if (peer->group && peer->group->bgp)
|
|
|
|
{
|
|
|
|
dncount = peer->group->bgp->dynamic_neighbors_count;
|
|
|
|
if (dncount)
|
|
|
|
peer->group->bgp->dynamic_neighbors_count = --dncount;
|
|
|
|
}
|
|
|
|
if (bgp_debug_neighbor_events(peer))
|
|
|
|
zlog_debug ("%s dropped from group %s, count %d",
|
|
|
|
peer->host, peer->group->name, dncount);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* If peer is configured at least one address family return 1. */
|
|
|
|
int
|
|
|
|
peer_active (struct peer *peer)
|
|
|
|
{
|
2015-05-20 02:40:40 +02:00
|
|
|
if (BGP_PEER_SU_UNSPEC(peer))
|
|
|
|
return 0;
|
2002-12-13 21:15:29 +01:00
|
|
|
if (peer->afc[AFI_IP][SAFI_UNICAST]
|
|
|
|
|| peer->afc[AFI_IP][SAFI_MULTICAST]
|
|
|
|
|| peer->afc[AFI_IP][SAFI_MPLS_VPN]
|
|
|
|
|| peer->afc[AFI_IP6][SAFI_UNICAST]
|
|
|
|
|| peer->afc[AFI_IP6][SAFI_MULTICAST])
|
|
|
|
return 1;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* If peer is negotiated at least one address family return 1. */
|
|
|
|
int
|
|
|
|
peer_active_nego (struct peer *peer)
|
|
|
|
{
|
|
|
|
if (peer->afc_nego[AFI_IP][SAFI_UNICAST]
|
|
|
|
|| peer->afc_nego[AFI_IP][SAFI_MULTICAST]
|
|
|
|
|| peer->afc_nego[AFI_IP][SAFI_MPLS_VPN]
|
|
|
|
|| peer->afc_nego[AFI_IP6][SAFI_UNICAST]
|
|
|
|
|| peer->afc_nego[AFI_IP6][SAFI_MULTICAST])
|
|
|
|
return 1;
|
|
|
|
return 0;
|
|
|
|
}
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* peer_flag_change_type. */
|
|
|
|
enum peer_change_type
|
|
|
|
{
|
|
|
|
peer_change_none,
|
|
|
|
peer_change_reset,
|
|
|
|
peer_change_reset_in,
|
|
|
|
peer_change_reset_out,
|
|
|
|
};
|
|
|
|
|
2005-06-28 14:44:16 +02:00
|
|
|
static void
|
2002-12-13 21:15:29 +01:00
|
|
|
peer_change_action (struct peer *peer, afi_t afi, safi_t safi,
|
|
|
|
enum peer_change_type type)
|
|
|
|
{
|
|
|
|
if (CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
|
|
|
return;
|
|
|
|
|
2010-01-13 01:32:39 +01:00
|
|
|
if (peer->status != Established)
|
|
|
|
return;
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
if (type == peer_change_reset)
|
2015-05-20 02:40:37 +02:00
|
|
|
{
|
|
|
|
/* If we're resetting session, we've to delete both peer struct */
|
|
|
|
if ((peer->doppelganger) && (peer->doppelganger->status != Deleted)
|
|
|
|
&& (!CHECK_FLAG(peer->doppelganger->flags,
|
|
|
|
PEER_FLAG_CONFIG_NODE)))
|
|
|
|
peer_delete(peer->doppelganger);
|
|
|
|
|
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE,
|
|
|
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
else if (type == peer_change_reset_in)
|
|
|
|
{
|
|
|
|
if (CHECK_FLAG (peer->cap, PEER_CAP_REFRESH_OLD_RCV)
|
|
|
|
|| CHECK_FLAG (peer->cap, PEER_CAP_REFRESH_NEW_RCV))
|
|
|
|
bgp_route_refresh_send (peer, afi, safi, 0, 0, 0);
|
|
|
|
else
|
2015-05-20 02:40:37 +02:00
|
|
|
{
|
|
|
|
if ((peer->doppelganger) && (peer->doppelganger->status != Deleted)
|
|
|
|
&& (!CHECK_FLAG(peer->doppelganger->flags,
|
|
|
|
PEER_FLAG_CONFIG_NODE)))
|
|
|
|
peer_delete(peer->doppelganger);
|
|
|
|
|
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE,
|
|
|
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
else if (type == peer_change_reset_out)
|
2015-05-20 03:03:47 +02:00
|
|
|
{
|
|
|
|
update_group_adjust_peer(peer_af_find(peer, afi, safi));
|
|
|
|
bgp_announce_route (peer, afi, safi);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
struct peer_flag_action
|
|
|
|
{
|
|
|
|
/* Peer's flag. */
|
|
|
|
u_int32_t flag;
|
|
|
|
|
|
|
|
/* This flag can be set for peer-group member. */
|
|
|
|
u_char not_for_member;
|
|
|
|
|
|
|
|
/* Action when the flag is changed. */
|
|
|
|
enum peer_change_type type;
|
2004-05-20 11:19:34 +02:00
|
|
|
|
|
|
|
/* Peer down cause */
|
|
|
|
u_char peer_down;
|
2002-12-13 21:15:29 +01:00
|
|
|
};
|
|
|
|
|
2009-07-22 01:27:20 +02:00
|
|
|
static const struct peer_flag_action peer_flag_action_list[] =
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
{ PEER_FLAG_PASSIVE, 0, peer_change_reset },
|
|
|
|
{ PEER_FLAG_SHUTDOWN, 0, peer_change_reset },
|
|
|
|
{ PEER_FLAG_DONT_CAPABILITY, 0, peer_change_none },
|
|
|
|
{ PEER_FLAG_OVERRIDE_CAPABILITY, 0, peer_change_none },
|
|
|
|
{ PEER_FLAG_STRICT_CAP_MATCH, 0, peer_change_none },
|
|
|
|
{ PEER_FLAG_DYNAMIC_CAPABILITY, 0, peer_change_reset },
|
2005-02-02 15:50:11 +01:00
|
|
|
{ PEER_FLAG_DISABLE_CONNECTED_CHECK, 0, peer_change_reset },
|
2015-06-11 18:19:12 +02:00
|
|
|
{ PEER_FLAG_CAPABILITY_ENHE, 0, peer_change_reset },
|
2015-05-20 02:47:23 +02:00
|
|
|
{ PEER_FLAG_BFD, 0, peer_change_none },
|
2002-12-13 21:15:29 +01:00
|
|
|
{ 0, 0, 0 }
|
|
|
|
};
|
|
|
|
|
2009-07-22 01:27:20 +02:00
|
|
|
static const struct peer_flag_action peer_af_flag_action_list[] =
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
{ PEER_FLAG_NEXTHOP_SELF, 1, peer_change_reset_out },
|
|
|
|
{ PEER_FLAG_SEND_COMMUNITY, 1, peer_change_reset_out },
|
|
|
|
{ PEER_FLAG_SEND_EXT_COMMUNITY, 1, peer_change_reset_out },
|
|
|
|
{ PEER_FLAG_SOFT_RECONFIG, 0, peer_change_reset_in },
|
|
|
|
{ PEER_FLAG_REFLECTOR_CLIENT, 1, peer_change_reset },
|
|
|
|
{ PEER_FLAG_RSERVER_CLIENT, 1, peer_change_reset },
|
|
|
|
{ PEER_FLAG_AS_PATH_UNCHANGED, 1, peer_change_reset_out },
|
|
|
|
{ PEER_FLAG_NEXTHOP_UNCHANGED, 1, peer_change_reset_out },
|
|
|
|
{ PEER_FLAG_MED_UNCHANGED, 1, peer_change_reset_out },
|
|
|
|
{ PEER_FLAG_REMOVE_PRIVATE_AS, 1, peer_change_reset_out },
|
2015-05-20 02:57:34 +02:00
|
|
|
{ PEER_FLAG_REMOVE_PRIVATE_AS_ALL, 1, peer_change_reset_out },
|
|
|
|
{ PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE,1, peer_change_reset_out },
|
2002-12-13 21:15:29 +01:00
|
|
|
{ PEER_FLAG_ALLOWAS_IN, 0, peer_change_reset_in },
|
|
|
|
{ PEER_FLAG_ORF_PREFIX_SM, 1, peer_change_reset },
|
|
|
|
{ PEER_FLAG_ORF_PREFIX_RM, 1, peer_change_reset },
|
2004-09-13 Jose Luis Rubio <jrubio@dit.upm.es>
(at Technical University of Madrid as part of Euro6ix Project)
Enhanced Route Server functionality and Route-Maps:
* bgpd/bgpd.h: Modified 'struct peer' and 'struct bgp_filter' to
support rs-clients. A 'struct bgp_table *rib' has been added to the
first (to mantain a separated RIB for each rs-client) and two new
route-maps have been added to the last (for import/export policies).
Added the following #defines: RMAP_{IN|OUT|IMPORT|EXPORT|MAX},
PEER_RMAP_TYPE_{IMPORT|EXPORT} and BGP_CLEAR_SOFT_RSCLIENT.
* bgpd/bgpd.c: Modified the functions that create/delete/etc peers in
order to consider the new fields included in 'struct peer' for
supporting rs-clients, i.e. the import/export route-maps and the
'struct bgp_table'.
* bgpd/bgp_route.{ch}: Modified several functions related with
receiving/sending announces in order to support the new Route Server
capabilities.
Function 'bgp_process' has been reorganized, creating an auxiliar
function for best path selection ('bgp_best_selection').
Modified 'bgp_show' and 'bgp_show_route' for displaying information
about any RIB (and not only the main bgp RIB).
Added commands for displaying information about RS-clients RIBs:
'show bgp rsclient (A.B.C.D|X:X::X:X)', 'show bgp rsclient
(A.B.C.D|X:X::X:X) X:X::X:X/M', etc
* bgpd/bgp_table.{ch}: The structure 'struct bgp_table' now has two
new fields: type (which can take the values BGP_TABLE_{MAIN|RSCLIENT})
and 'void *owner' which points to 'struct bgp' or 'struct peer' which
owns the table.
When creating a new bgp_table by default 'type=BGP_TABLE_MAIN' is set.
* bgpd/bgp_vty.c: The commands 'neighbor ... route-server-client' and
'no neighbor ... route-server-client' now not only set/unset the flag
PEER_FLAG_RSERVER_CLIENT, but they create/destroy the 'struct
bgp_table' of the peer. Special actions are taken for peer_groups.
Command 'neighbor ... route-map WORD (in|out)' now also supports two
new kinds of route-map: 'import' and 'export'.
Added commands 'clear bgp * rsclient', etc. These commands allow a new
kind of soft_reconfig which affects only the RIB of the specified
RS-client.
Added commands 'show bgp rsclient summary', etc which display a
summary of the rs-clients configured for the corresponding address
family.
* bgpd/bgp_routemap.c: A new match statement is available,
'match peer (A.B.C.D|X:X::X:X)'. This statement can only be used in
import/export route-maps, and it matches when the peer who announces
(when used in an import route-map) or is going to receive (when used
in an export route-map) the route is the same than the one specified
in the statement.
For peer-groups the statement matches if the specified peer is member
of the peer-group.
A special version of the command, 'match peer local', matches with
routes originated by the Route Server (defined with 'network ...',
redistributed routes and default-originate).
* lib/routemap.{ch}: Added a new clause 'call NAME' for use in
route-maps. It jumps into the specified route-map and when it returns
the first route-map ends if the called RM returns DENY_MATCH, or
continues in other case.
2004-09-13 07:12:46 +02:00
|
|
|
{ PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED, 0, peer_change_reset_out },
|
2014-04-24 09:22:37 +02:00
|
|
|
{ PEER_FLAG_NEXTHOP_SELF_ALL, 1, peer_change_reset_out },
|
2015-05-20 03:03:14 +02:00
|
|
|
{ PEER_FLAG_AS_OVERRIDE, 1, peer_change_reset_out },
|
2002-12-13 21:15:29 +01:00
|
|
|
{ 0, 0, 0 }
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Proper action set. */
|
2005-06-28 14:44:16 +02:00
|
|
|
static int
|
2009-07-22 01:27:20 +02:00
|
|
|
peer_flag_action_set (const struct peer_flag_action *action_list, int size,
|
2002-12-13 21:15:29 +01:00
|
|
|
struct peer_flag_action *action, u_int32_t flag)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
int found = 0;
|
|
|
|
int reset_in = 0;
|
|
|
|
int reset_out = 0;
|
2009-07-22 01:27:20 +02:00
|
|
|
const struct peer_flag_action *match = NULL;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
/* Check peer's frag action. */
|
|
|
|
for (i = 0; i < size; i++)
|
|
|
|
{
|
|
|
|
match = &action_list[i];
|
|
|
|
|
|
|
|
if (match->flag == 0)
|
|
|
|
break;
|
|
|
|
|
|
|
|
if (match->flag & flag)
|
|
|
|
{
|
|
|
|
found = 1;
|
|
|
|
|
|
|
|
if (match->type == peer_change_reset_in)
|
|
|
|
reset_in = 1;
|
|
|
|
if (match->type == peer_change_reset_out)
|
|
|
|
reset_out = 1;
|
|
|
|
if (match->type == peer_change_reset)
|
|
|
|
{
|
|
|
|
reset_in = 1;
|
|
|
|
reset_out = 1;
|
|
|
|
}
|
|
|
|
if (match->not_for_member)
|
|
|
|
action->not_for_member = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Set peer clear type. */
|
|
|
|
if (reset_in && reset_out)
|
|
|
|
action->type = peer_change_reset;
|
|
|
|
else if (reset_in)
|
|
|
|
action->type = peer_change_reset_in;
|
|
|
|
else if (reset_out)
|
|
|
|
action->type = peer_change_reset_out;
|
|
|
|
else
|
|
|
|
action->type = peer_change_none;
|
|
|
|
|
|
|
|
return found;
|
|
|
|
}
|
|
|
|
|
2005-06-28 14:44:16 +02:00
|
|
|
static void
|
2002-12-13 21:15:29 +01:00
|
|
|
peer_flag_modify_action (struct peer *peer, u_int32_t flag)
|
|
|
|
{
|
|
|
|
if (flag == PEER_FLAG_SHUTDOWN)
|
|
|
|
{
|
|
|
|
if (CHECK_FLAG (peer->flags, flag))
|
|
|
|
{
|
2005-02-02 15:40:33 +01:00
|
|
|
if (CHECK_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT))
|
|
|
|
peer_nsf_stop (peer);
|
|
|
|
|
2005-02-01 21:57:17 +01:00
|
|
|
UNSET_FLAG (peer->sflags, PEER_STATUS_PREFIX_OVERFLOW);
|
|
|
|
if (peer->t_pmax_restart)
|
|
|
|
{
|
|
|
|
BGP_TIMER_OFF (peer->t_pmax_restart);
|
2015-05-20 02:58:12 +02:00
|
|
|
if (bgp_debug_neighbor_events(peer))
|
2005-02-01 21:57:17 +01:00
|
|
|
zlog_debug ("%s Maximum-prefix restart timer canceled",
|
|
|
|
peer->host);
|
|
|
|
}
|
|
|
|
|
2015-05-20 02:40:37 +02:00
|
|
|
if (CHECK_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT))
|
|
|
|
peer_nsf_stop (peer);
|
2005-02-02 15:40:33 +01:00
|
|
|
|
2013-10-02 12:40:20 +02:00
|
|
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
|
2002-12-13 21:15:29 +01:00
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE,
|
|
|
|
BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN);
|
|
|
|
else
|
2015-05-20 02:40:37 +02:00
|
|
|
bgp_session_reset(peer);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
peer->v_start = BGP_INIT_START_TIMER;
|
|
|
|
BGP_EVENT_ADD (peer, BGP_Stop);
|
|
|
|
}
|
|
|
|
}
|
2013-10-02 12:40:20 +02:00
|
|
|
else if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
2005-02-01 23:01:48 +01:00
|
|
|
if (flag == PEER_FLAG_DYNAMIC_CAPABILITY)
|
|
|
|
peer->last_reset = PEER_DOWN_CAPABILITY_CHANGE;
|
|
|
|
else if (flag == PEER_FLAG_PASSIVE)
|
|
|
|
peer->last_reset = PEER_DOWN_PASSIVE_CHANGE;
|
2005-02-02 15:50:11 +01:00
|
|
|
else if (flag == PEER_FLAG_DISABLE_CONNECTED_CHECK)
|
2005-02-01 23:01:48 +01:00
|
|
|
peer->last_reset = PEER_DOWN_MULTIHOP_CHANGE;
|
2004-05-20 11:19:34 +02:00
|
|
|
|
2005-02-01 23:01:48 +01:00
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE,
|
|
|
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
else
|
2015-05-20 02:40:37 +02:00
|
|
|
bgp_session_reset(peer);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Change specified peer flag. */
|
2005-06-28 14:44:16 +02:00
|
|
|
static int
|
2002-12-13 21:15:29 +01:00
|
|
|
peer_flag_modify (struct peer *peer, u_int32_t flag, int set)
|
|
|
|
{
|
|
|
|
int found;
|
|
|
|
int size;
|
|
|
|
struct peer_group *group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
struct peer_flag_action action;
|
|
|
|
|
|
|
|
memset (&action, 0, sizeof (struct peer_flag_action));
|
|
|
|
size = sizeof peer_flag_action_list / sizeof (struct peer_flag_action);
|
|
|
|
|
|
|
|
found = peer_flag_action_set (peer_flag_action_list, size, &action, flag);
|
|
|
|
|
|
|
|
/* No flag action is found. */
|
|
|
|
if (! found)
|
|
|
|
return BGP_ERR_INVALID_FLAG;
|
|
|
|
|
|
|
|
/* Not for peer-group member. */
|
|
|
|
if (action.not_for_member && peer_group_active (peer))
|
|
|
|
return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
|
|
|
|
|
|
|
|
/* When unset the peer-group member's flag we have to check
|
|
|
|
peer-group configuration. */
|
|
|
|
if (! set && peer_group_active (peer))
|
|
|
|
if (CHECK_FLAG (peer->group->conf->flags, flag))
|
|
|
|
{
|
|
|
|
if (flag == PEER_FLAG_SHUTDOWN)
|
|
|
|
return BGP_ERR_PEER_GROUP_SHUTDOWN;
|
|
|
|
else
|
|
|
|
return BGP_ERR_PEER_GROUP_HAS_THE_FLAG;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Flag conflict check. */
|
|
|
|
if (set
|
|
|
|
&& CHECK_FLAG (peer->flags | flag, PEER_FLAG_STRICT_CAP_MATCH)
|
|
|
|
&& CHECK_FLAG (peer->flags | flag, PEER_FLAG_OVERRIDE_CAPABILITY))
|
|
|
|
return BGP_ERR_PEER_FLAG_CONFLICT;
|
|
|
|
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
|
|
|
{
|
|
|
|
if (set && CHECK_FLAG (peer->flags, flag) == flag)
|
|
|
|
return 0;
|
|
|
|
if (! set && ! CHECK_FLAG (peer->flags, flag))
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (set)
|
|
|
|
SET_FLAG (peer->flags, flag);
|
|
|
|
else
|
|
|
|
UNSET_FLAG (peer->flags, flag);
|
|
|
|
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
|
|
|
{
|
|
|
|
if (action.type == peer_change_reset)
|
|
|
|
peer_flag_modify_action (peer, flag);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* peer-group member updates. */
|
|
|
|
group = peer->group;
|
|
|
|
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
if (set && CHECK_FLAG (peer->flags, flag) == flag)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (! set && ! CHECK_FLAG (peer->flags, flag))
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (set)
|
|
|
|
SET_FLAG (peer->flags, flag);
|
|
|
|
else
|
|
|
|
UNSET_FLAG (peer->flags, flag);
|
|
|
|
|
|
|
|
if (action.type == peer_change_reset)
|
|
|
|
peer_flag_modify_action (peer, flag);
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
peer_flag_set (struct peer *peer, u_int32_t flag)
|
|
|
|
{
|
|
|
|
return peer_flag_modify (peer, flag, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
peer_flag_unset (struct peer *peer, u_int32_t flag)
|
|
|
|
{
|
|
|
|
return peer_flag_modify (peer, flag, 0);
|
|
|
|
}
|
|
|
|
|
2005-06-28 14:44:16 +02:00
|
|
|
static int
|
2002-12-13 21:15:29 +01:00
|
|
|
peer_is_group_member (struct peer *peer, afi_t afi, safi_t safi)
|
|
|
|
{
|
|
|
|
if (peer->af_group[afi][safi])
|
|
|
|
return 1;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2005-06-28 14:44:16 +02:00
|
|
|
static int
|
2002-12-13 21:15:29 +01:00
|
|
|
peer_af_flag_modify (struct peer *peer, afi_t afi, safi_t safi, u_int32_t flag,
|
|
|
|
int set)
|
|
|
|
{
|
|
|
|
int found;
|
|
|
|
int size;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
struct peer_group *group;
|
|
|
|
struct peer_flag_action action;
|
|
|
|
|
|
|
|
memset (&action, 0, sizeof (struct peer_flag_action));
|
|
|
|
size = sizeof peer_af_flag_action_list / sizeof (struct peer_flag_action);
|
|
|
|
|
|
|
|
found = peer_flag_action_set (peer_af_flag_action_list, size, &action, flag);
|
|
|
|
|
|
|
|
/* No flag action is found. */
|
|
|
|
if (! found)
|
|
|
|
return BGP_ERR_INVALID_FLAG;
|
|
|
|
|
|
|
|
/* Adress family must be activated. */
|
|
|
|
if (! peer->afc[afi][safi])
|
|
|
|
return BGP_ERR_PEER_INACTIVE;
|
|
|
|
|
|
|
|
/* Not for peer-group member. */
|
|
|
|
if (action.not_for_member && peer_is_group_member (peer, afi, safi))
|
|
|
|
return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
|
|
|
|
|
|
|
|
/* Spcecial check for reflector client. */
|
|
|
|
if (flag & PEER_FLAG_REFLECTOR_CLIENT
|
|
|
|
&& peer_sort (peer) != BGP_PEER_IBGP)
|
|
|
|
return BGP_ERR_NOT_INTERNAL_PEER;
|
|
|
|
|
|
|
|
/* Spcecial check for remove-private-AS. */
|
|
|
|
if (flag & PEER_FLAG_REMOVE_PRIVATE_AS
|
|
|
|
&& peer_sort (peer) == BGP_PEER_IBGP)
|
|
|
|
return BGP_ERR_REMOVE_PRIVATE_AS;
|
|
|
|
|
2015-05-20 03:03:14 +02:00
|
|
|
/* as-override is not allowed for IBGP peers */
|
|
|
|
if (flag & PEER_FLAG_AS_OVERRIDE
|
|
|
|
&& peer_sort (peer) == BGP_PEER_IBGP)
|
|
|
|
return BGP_ERR_AS_OVERRIDE;
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* When unset the peer-group member's flag we have to check
|
|
|
|
peer-group configuration. */
|
|
|
|
if (! set && peer->af_group[afi][safi])
|
|
|
|
if (CHECK_FLAG (peer->group->conf->af_flags[afi][safi], flag))
|
|
|
|
return BGP_ERR_PEER_GROUP_HAS_THE_FLAG;
|
|
|
|
|
|
|
|
/* When current flag configuration is same as requested one. */
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
|
|
|
{
|
|
|
|
if (set && CHECK_FLAG (peer->af_flags[afi][safi], flag) == flag)
|
|
|
|
return 0;
|
|
|
|
if (! set && ! CHECK_FLAG (peer->af_flags[afi][safi], flag))
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (set)
|
|
|
|
SET_FLAG (peer->af_flags[afi][safi], flag);
|
|
|
|
else
|
|
|
|
UNSET_FLAG (peer->af_flags[afi][safi], flag);
|
|
|
|
|
|
|
|
/* Execute action when peer is established. */
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP)
|
|
|
|
&& peer->status == Established)
|
|
|
|
{
|
|
|
|
if (! set && flag == PEER_FLAG_SOFT_RECONFIG)
|
|
|
|
bgp_clear_adj_in (peer, afi, safi);
|
|
|
|
else
|
2004-05-20 11:19:34 +02:00
|
|
|
{
|
|
|
|
if (flag == PEER_FLAG_REFLECTOR_CLIENT)
|
|
|
|
peer->last_reset = PEER_DOWN_RR_CLIENT_CHANGE;
|
|
|
|
else if (flag == PEER_FLAG_RSERVER_CLIENT)
|
|
|
|
peer->last_reset = PEER_DOWN_RS_CLIENT_CHANGE;
|
|
|
|
else if (flag == PEER_FLAG_ORF_PREFIX_SM)
|
|
|
|
peer->last_reset = PEER_DOWN_CAPABILITY_CHANGE;
|
|
|
|
else if (flag == PEER_FLAG_ORF_PREFIX_RM)
|
|
|
|
peer->last_reset = PEER_DOWN_CAPABILITY_CHANGE;
|
|
|
|
|
|
|
|
peer_change_action (peer, afi, safi, action.type);
|
|
|
|
}
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Peer group member updates. */
|
|
|
|
if (CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
|
|
|
{
|
|
|
|
group = peer->group;
|
|
|
|
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
if (! peer->af_group[afi][safi])
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (set && CHECK_FLAG (peer->af_flags[afi][safi], flag) == flag)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (! set && ! CHECK_FLAG (peer->af_flags[afi][safi], flag))
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (set)
|
|
|
|
SET_FLAG (peer->af_flags[afi][safi], flag);
|
|
|
|
else
|
|
|
|
UNSET_FLAG (peer->af_flags[afi][safi], flag);
|
|
|
|
|
|
|
|
if (peer->status == Established)
|
|
|
|
{
|
|
|
|
if (! set && flag == PEER_FLAG_SOFT_RECONFIG)
|
|
|
|
bgp_clear_adj_in (peer, afi, safi);
|
|
|
|
else
|
2004-05-20 11:19:34 +02:00
|
|
|
{
|
|
|
|
if (flag == PEER_FLAG_REFLECTOR_CLIENT)
|
|
|
|
peer->last_reset = PEER_DOWN_RR_CLIENT_CHANGE;
|
|
|
|
else if (flag == PEER_FLAG_RSERVER_CLIENT)
|
|
|
|
peer->last_reset = PEER_DOWN_RS_CLIENT_CHANGE;
|
|
|
|
else if (flag == PEER_FLAG_ORF_PREFIX_SM)
|
|
|
|
peer->last_reset = PEER_DOWN_CAPABILITY_CHANGE;
|
|
|
|
else if (flag == PEER_FLAG_ORF_PREFIX_RM)
|
|
|
|
peer->last_reset = PEER_DOWN_CAPABILITY_CHANGE;
|
|
|
|
|
|
|
|
peer_change_action (peer, afi, safi, action.type);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
peer_af_flag_set (struct peer *peer, afi_t afi, safi_t safi, u_int32_t flag)
|
|
|
|
{
|
|
|
|
return peer_af_flag_modify (peer, afi, safi, flag, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
peer_af_flag_unset (struct peer *peer, afi_t afi, safi_t safi, u_int32_t flag)
|
|
|
|
{
|
|
|
|
return peer_af_flag_modify (peer, afi, safi, flag, 0);
|
|
|
|
}
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* EBGP multihop configuration. */
|
|
|
|
int
|
|
|
|
peer_ebgp_multihop_set (struct peer *peer, int ttl)
|
|
|
|
{
|
|
|
|
struct peer_group *group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
bgpd: RFC 5082 Generalized TTL Security Mechanism support
* bgpd: Add support for RFC 5082 GTSM, which allows the TTL field to be used
to verify that incoming packets have been sent from neighbours no more
than X IP hops away. In other words, this allows packets that were sent from
further away (i.e. not by the neighbour with known distance, and so possibly
a miscreant) to be filtered out.
* lib/sockunion.{c,h}: (sockopt_minttl) new function, to set a minimum TTL
using the IP_MINTTL socket opt.
* bgpd.h: (BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK) define for command
error for minttl.
(struct peer) add a config variable, to store the configured minttl.
(peer_ttl_security_hops_{set,unset}) configuration handlers
* bgpd.c: (peer_group_get) init gtsm_hops
(peer_ebgp_multihop_{un,}set) check for conflicts with GTSM. Multihop and
GTSM can't both be active for a peer at the same time.
(peer_ttl_security_hops_set) set minttl, taking care to avoid conflicts with
ebgp_multihop.
(bgp_config_write_peer) write out minttl as "neighbor .. ttl-security hops X".
* bgp_vty.c: (bgp_vty_return) message for
BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
(peer_ebgp_multihop_{un,}set_vty)
* bgp_network.c: (bgp_accept) set minttl on accepted sockets if appropriate.
(bgp_connect) ditto for outbound.
2011-03-23 16:33:17 +01:00
|
|
|
struct peer *peer1;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2015-05-20 02:40:40 +02:00
|
|
|
if (peer->sort == BGP_PEER_IBGP || peer->conf_if)
|
2002-12-13 21:15:29 +01:00
|
|
|
return 0;
|
|
|
|
|
bgpd: RFC 5082 Generalized TTL Security Mechanism support
* bgpd: Add support for RFC 5082 GTSM, which allows the TTL field to be used
to verify that incoming packets have been sent from neighbours no more
than X IP hops away. In other words, this allows packets that were sent from
further away (i.e. not by the neighbour with known distance, and so possibly
a miscreant) to be filtered out.
* lib/sockunion.{c,h}: (sockopt_minttl) new function, to set a minimum TTL
using the IP_MINTTL socket opt.
* bgpd.h: (BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK) define for command
error for minttl.
(struct peer) add a config variable, to store the configured minttl.
(peer_ttl_security_hops_{set,unset}) configuration handlers
* bgpd.c: (peer_group_get) init gtsm_hops
(peer_ebgp_multihop_{un,}set) check for conflicts with GTSM. Multihop and
GTSM can't both be active for a peer at the same time.
(peer_ttl_security_hops_set) set minttl, taking care to avoid conflicts with
ebgp_multihop.
(bgp_config_write_peer) write out minttl as "neighbor .. ttl-security hops X".
* bgp_vty.c: (bgp_vty_return) message for
BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
(peer_ebgp_multihop_{un,}set_vty)
* bgp_network.c: (bgp_accept) set minttl on accepted sockets if appropriate.
(bgp_connect) ditto for outbound.
2011-03-23 16:33:17 +01:00
|
|
|
/* see comment in peer_ttl_security_hops_set() */
|
|
|
|
if (ttl != MAXTTL)
|
|
|
|
{
|
|
|
|
if (CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
|
|
|
{
|
|
|
|
group = peer->group;
|
|
|
|
if (group->conf->gtsm_hops != 0)
|
|
|
|
return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK;
|
|
|
|
|
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer1))
|
|
|
|
{
|
2012-05-07 18:52:54 +02:00
|
|
|
if (peer1->sort == BGP_PEER_IBGP)
|
bgpd: RFC 5082 Generalized TTL Security Mechanism support
* bgpd: Add support for RFC 5082 GTSM, which allows the TTL field to be used
to verify that incoming packets have been sent from neighbours no more
than X IP hops away. In other words, this allows packets that were sent from
further away (i.e. not by the neighbour with known distance, and so possibly
a miscreant) to be filtered out.
* lib/sockunion.{c,h}: (sockopt_minttl) new function, to set a minimum TTL
using the IP_MINTTL socket opt.
* bgpd.h: (BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK) define for command
error for minttl.
(struct peer) add a config variable, to store the configured minttl.
(peer_ttl_security_hops_{set,unset}) configuration handlers
* bgpd.c: (peer_group_get) init gtsm_hops
(peer_ebgp_multihop_{un,}set) check for conflicts with GTSM. Multihop and
GTSM can't both be active for a peer at the same time.
(peer_ttl_security_hops_set) set minttl, taking care to avoid conflicts with
ebgp_multihop.
(bgp_config_write_peer) write out minttl as "neighbor .. ttl-security hops X".
* bgp_vty.c: (bgp_vty_return) message for
BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
(peer_ebgp_multihop_{un,}set_vty)
* bgp_network.c: (bgp_accept) set minttl on accepted sockets if appropriate.
(bgp_connect) ditto for outbound.
2011-03-23 16:33:17 +01:00
|
|
|
continue;
|
|
|
|
|
|
|
|
if (peer1->gtsm_hops != 0)
|
|
|
|
return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (peer->gtsm_hops != 0)
|
|
|
|
return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
peer->ttl = ttl;
|
|
|
|
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
|
|
|
{
|
2012-05-07 18:52:54 +02:00
|
|
|
if (peer->fd >= 0 && peer->sort != BGP_PEER_IBGP)
|
2015-05-20 03:45:53 +02:00
|
|
|
{
|
|
|
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
|
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE,
|
|
|
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
|
|
|
else
|
|
|
|
bgp_session_reset(peer);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
group = peer->group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
2004-05-01 10:44:08 +02:00
|
|
|
{
|
2012-05-07 18:52:54 +02:00
|
|
|
if (peer->sort == BGP_PEER_IBGP)
|
2004-05-01 10:44:08 +02:00
|
|
|
continue;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2004-05-01 10:44:08 +02:00
|
|
|
peer->ttl = group->conf->ttl;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2015-05-20 03:45:53 +02:00
|
|
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
|
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE,
|
|
|
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
|
|
|
else
|
|
|
|
bgp_session_reset(peer);
|
2004-05-01 10:44:08 +02:00
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
peer_ebgp_multihop_unset (struct peer *peer)
|
|
|
|
{
|
|
|
|
struct peer_group *group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2012-05-07 18:52:54 +02:00
|
|
|
if (peer->sort == BGP_PEER_IBGP)
|
2002-12-13 21:15:29 +01:00
|
|
|
return 0;
|
|
|
|
|
bgpd: RFC 5082 Generalized TTL Security Mechanism support
* bgpd: Add support for RFC 5082 GTSM, which allows the TTL field to be used
to verify that incoming packets have been sent from neighbours no more
than X IP hops away. In other words, this allows packets that were sent from
further away (i.e. not by the neighbour with known distance, and so possibly
a miscreant) to be filtered out.
* lib/sockunion.{c,h}: (sockopt_minttl) new function, to set a minimum TTL
using the IP_MINTTL socket opt.
* bgpd.h: (BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK) define for command
error for minttl.
(struct peer) add a config variable, to store the configured minttl.
(peer_ttl_security_hops_{set,unset}) configuration handlers
* bgpd.c: (peer_group_get) init gtsm_hops
(peer_ebgp_multihop_{un,}set) check for conflicts with GTSM. Multihop and
GTSM can't both be active for a peer at the same time.
(peer_ttl_security_hops_set) set minttl, taking care to avoid conflicts with
ebgp_multihop.
(bgp_config_write_peer) write out minttl as "neighbor .. ttl-security hops X".
* bgp_vty.c: (bgp_vty_return) message for
BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
(peer_ebgp_multihop_{un,}set_vty)
* bgp_network.c: (bgp_accept) set minttl on accepted sockets if appropriate.
(bgp_connect) ditto for outbound.
2011-03-23 16:33:17 +01:00
|
|
|
if (peer->gtsm_hops != 0 && peer->ttl != MAXTTL)
|
|
|
|
return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK;
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
if (peer_group_active (peer))
|
|
|
|
peer->ttl = peer->group->conf->ttl;
|
|
|
|
else
|
|
|
|
peer->ttl = 1;
|
|
|
|
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
|
|
|
{
|
2015-05-20 03:45:53 +02:00
|
|
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
|
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE,
|
|
|
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
|
|
|
else
|
|
|
|
bgp_session_reset(peer);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
group = peer->group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
2004-05-01 10:44:08 +02:00
|
|
|
{
|
2012-05-07 18:52:54 +02:00
|
|
|
if (peer->sort == BGP_PEER_IBGP)
|
2004-05-01 10:44:08 +02:00
|
|
|
continue;
|
|
|
|
|
|
|
|
peer->ttl = 1;
|
2015-05-20 03:45:53 +02:00
|
|
|
|
2004-05-01 10:44:08 +02:00
|
|
|
if (peer->fd >= 0)
|
2015-05-20 03:45:53 +02:00
|
|
|
{
|
|
|
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
|
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE,
|
|
|
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
|
|
|
else
|
|
|
|
bgp_session_reset(peer);
|
|
|
|
}
|
2004-05-01 10:44:08 +02:00
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* Neighbor description. */
|
|
|
|
int
|
|
|
|
peer_description_set (struct peer *peer, char *desc)
|
|
|
|
{
|
|
|
|
if (peer->desc)
|
|
|
|
XFREE (MTYPE_PEER_DESC, peer->desc);
|
|
|
|
|
|
|
|
peer->desc = XSTRDUP (MTYPE_PEER_DESC, desc);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
peer_description_unset (struct peer *peer)
|
|
|
|
{
|
|
|
|
if (peer->desc)
|
|
|
|
XFREE (MTYPE_PEER_DESC, peer->desc);
|
|
|
|
|
|
|
|
peer->desc = NULL;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* Neighbor update-source. */
|
|
|
|
int
|
2004-10-13 07:06:08 +02:00
|
|
|
peer_update_source_if_set (struct peer *peer, const char *ifname)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
struct peer_group *group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
if (peer->update_if)
|
|
|
|
{
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP)
|
|
|
|
&& strcmp (peer->update_if, ifname) == 0)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
XFREE (MTYPE_PEER_UPDATE_SOURCE, peer->update_if);
|
|
|
|
peer->update_if = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (peer->update_source)
|
|
|
|
{
|
|
|
|
sockunion_free (peer->update_source);
|
|
|
|
peer->update_source = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
peer->update_if = XSTRDUP (MTYPE_PEER_UPDATE_SOURCE, ifname);
|
|
|
|
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
|
|
|
{
|
2013-10-02 12:40:20 +02:00
|
|
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
|
2004-05-20 11:19:34 +02:00
|
|
|
{
|
|
|
|
peer->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
|
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE,
|
|
|
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
else
|
2015-05-20 02:40:37 +02:00
|
|
|
bgp_session_reset(peer);
|
2002-12-13 21:15:29 +01:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* peer-group member updates. */
|
|
|
|
group = peer->group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
if (peer->update_if)
|
|
|
|
{
|
|
|
|
if (strcmp (peer->update_if, ifname) == 0)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
XFREE (MTYPE_PEER_UPDATE_SOURCE, peer->update_if);
|
|
|
|
peer->update_if = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (peer->update_source)
|
|
|
|
{
|
|
|
|
sockunion_free (peer->update_source);
|
|
|
|
peer->update_source = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
peer->update_if = XSTRDUP (MTYPE_PEER_UPDATE_SOURCE, ifname);
|
|
|
|
|
2013-10-02 12:40:20 +02:00
|
|
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
|
2004-05-20 11:19:34 +02:00
|
|
|
{
|
|
|
|
peer->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
|
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE,
|
|
|
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
else
|
2015-05-20 02:40:37 +02:00
|
|
|
bgp_session_reset(peer);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
peer_update_source_addr_set (struct peer *peer, union sockunion *su)
|
|
|
|
{
|
|
|
|
struct peer_group *group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
if (peer->update_source)
|
|
|
|
{
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP)
|
|
|
|
&& sockunion_cmp (peer->update_source, su) == 0)
|
|
|
|
return 0;
|
|
|
|
sockunion_free (peer->update_source);
|
|
|
|
peer->update_source = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (peer->update_if)
|
|
|
|
{
|
|
|
|
XFREE (MTYPE_PEER_UPDATE_SOURCE, peer->update_if);
|
|
|
|
peer->update_if = NULL;
|
2015-05-20 02:40:37 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
peer->update_source = sockunion_dup (su);
|
|
|
|
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
|
|
|
{
|
2013-10-02 12:40:20 +02:00
|
|
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
|
2004-05-20 11:19:34 +02:00
|
|
|
{
|
|
|
|
peer->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
|
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE,
|
|
|
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
else
|
2015-05-20 02:40:37 +02:00
|
|
|
bgp_session_reset(peer);
|
2002-12-13 21:15:29 +01:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* peer-group member updates. */
|
|
|
|
group = peer->group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
if (peer->update_source)
|
|
|
|
{
|
|
|
|
if (sockunion_cmp (peer->update_source, su) == 0)
|
|
|
|
continue;
|
|
|
|
sockunion_free (peer->update_source);
|
|
|
|
peer->update_source = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (peer->update_if)
|
|
|
|
{
|
|
|
|
XFREE (MTYPE_PEER_UPDATE_SOURCE, peer->update_if);
|
|
|
|
peer->update_if = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
peer->update_source = sockunion_dup (su);
|
|
|
|
|
2013-10-02 12:40:20 +02:00
|
|
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
|
2004-05-20 11:19:34 +02:00
|
|
|
{
|
|
|
|
peer->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
|
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE,
|
|
|
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
else
|
2015-05-20 02:40:37 +02:00
|
|
|
bgp_session_reset(peer);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
peer_update_source_unset (struct peer *peer)
|
|
|
|
{
|
|
|
|
union sockunion *su;
|
|
|
|
struct peer_group *group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP)
|
|
|
|
&& ! peer->update_source
|
|
|
|
&& ! peer->update_if)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
if (peer->update_source)
|
|
|
|
{
|
|
|
|
sockunion_free (peer->update_source);
|
|
|
|
peer->update_source = NULL;
|
|
|
|
}
|
|
|
|
if (peer->update_if)
|
|
|
|
{
|
|
|
|
XFREE (MTYPE_PEER_UPDATE_SOURCE, peer->update_if);
|
|
|
|
peer->update_if = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (peer_group_active (peer))
|
|
|
|
{
|
|
|
|
group = peer->group;
|
|
|
|
|
|
|
|
if (group->conf->update_source)
|
|
|
|
{
|
|
|
|
su = sockunion_dup (group->conf->update_source);
|
|
|
|
peer->update_source = su;
|
|
|
|
}
|
|
|
|
else if (group->conf->update_if)
|
|
|
|
peer->update_if =
|
|
|
|
XSTRDUP (MTYPE_PEER_UPDATE_SOURCE, group->conf->update_if);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
|
|
|
{
|
2013-10-02 12:40:20 +02:00
|
|
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
|
2004-05-20 11:19:34 +02:00
|
|
|
{
|
|
|
|
peer->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
|
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE,
|
|
|
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
else
|
2015-05-20 02:40:37 +02:00
|
|
|
bgp_session_reset(peer);
|
2002-12-13 21:15:29 +01:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* peer-group member updates. */
|
|
|
|
group = peer->group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
if (! peer->update_source && ! peer->update_if)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (peer->update_source)
|
|
|
|
{
|
|
|
|
sockunion_free (peer->update_source);
|
|
|
|
peer->update_source = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (peer->update_if)
|
|
|
|
{
|
|
|
|
XFREE (MTYPE_PEER_UPDATE_SOURCE, peer->update_if);
|
|
|
|
peer->update_if = NULL;
|
|
|
|
}
|
|
|
|
|
2013-10-02 12:40:20 +02:00
|
|
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
|
2004-05-20 11:19:34 +02:00
|
|
|
{
|
|
|
|
peer->last_reset = PEER_DOWN_UPDATE_SOURCE_CHANGE;
|
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE,
|
|
|
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
else
|
2015-05-20 02:40:37 +02:00
|
|
|
bgp_session_reset(peer);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
int
|
|
|
|
peer_default_originate_set (struct peer *peer, afi_t afi, safi_t safi,
|
2004-10-13 07:06:08 +02:00
|
|
|
const char *rmap)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
struct peer_group *group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
/* Adress family must be activated. */
|
|
|
|
if (! peer->afc[afi][safi])
|
|
|
|
return BGP_ERR_PEER_INACTIVE;
|
|
|
|
|
|
|
|
/* Default originate can't be used for peer group memeber. */
|
|
|
|
if (peer_is_group_member (peer, afi, safi))
|
|
|
|
return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
|
|
|
|
|
|
|
|
if (! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_DEFAULT_ORIGINATE)
|
|
|
|
|| (rmap && ! peer->default_rmap[afi][safi].name)
|
|
|
|
|| (rmap && strcmp (rmap, peer->default_rmap[afi][safi].name) != 0))
|
|
|
|
{
|
|
|
|
SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_DEFAULT_ORIGINATE);
|
|
|
|
|
|
|
|
if (rmap)
|
|
|
|
{
|
|
|
|
if (peer->default_rmap[afi][safi].name)
|
|
|
|
free (peer->default_rmap[afi][safi].name);
|
|
|
|
peer->default_rmap[afi][safi].name = strdup (rmap);
|
|
|
|
peer->default_rmap[afi][safi].map = route_map_lookup_by_name (rmap);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
|
|
|
{
|
2015-05-20 03:03:47 +02:00
|
|
|
if (peer->status == Established && peer->afc_nego[afi][safi]) {
|
|
|
|
update_group_adjust_peer(peer_af_find(peer, afi, safi));
|
2002-12-13 21:15:29 +01:00
|
|
|
bgp_default_originate (peer, afi, safi, 0);
|
2015-05-20 03:03:47 +02:00
|
|
|
bgp_announce_route (peer, afi, safi);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* peer-group member updates. */
|
|
|
|
group = peer->group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_DEFAULT_ORIGINATE);
|
|
|
|
|
|
|
|
if (rmap)
|
|
|
|
{
|
|
|
|
if (peer->default_rmap[afi][safi].name)
|
|
|
|
free (peer->default_rmap[afi][safi].name);
|
|
|
|
peer->default_rmap[afi][safi].name = strdup (rmap);
|
|
|
|
peer->default_rmap[afi][safi].map = route_map_lookup_by_name (rmap);
|
|
|
|
}
|
|
|
|
|
2015-05-20 03:03:47 +02:00
|
|
|
if (peer->status == Established && peer->afc_nego[afi][safi]) {
|
|
|
|
update_group_adjust_peer(peer_af_find(peer, afi, safi));
|
2002-12-13 21:15:29 +01:00
|
|
|
bgp_default_originate (peer, afi, safi, 0);
|
2015-05-20 03:03:47 +02:00
|
|
|
bgp_announce_route (peer, afi, safi);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
peer_default_originate_unset (struct peer *peer, afi_t afi, safi_t safi)
|
|
|
|
{
|
|
|
|
struct peer_group *group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
/* Adress family must be activated. */
|
|
|
|
if (! peer->afc[afi][safi])
|
|
|
|
return BGP_ERR_PEER_INACTIVE;
|
|
|
|
|
|
|
|
/* Default originate can't be used for peer group memeber. */
|
|
|
|
if (peer_is_group_member (peer, afi, safi))
|
|
|
|
return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
|
|
|
|
|
|
|
|
if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_DEFAULT_ORIGINATE))
|
|
|
|
{
|
|
|
|
UNSET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_DEFAULT_ORIGINATE);
|
|
|
|
|
|
|
|
if (peer->default_rmap[afi][safi].name)
|
|
|
|
free (peer->default_rmap[afi][safi].name);
|
|
|
|
peer->default_rmap[afi][safi].name = NULL;
|
|
|
|
peer->default_rmap[afi][safi].map = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
|
|
|
{
|
2015-05-20 03:03:47 +02:00
|
|
|
if (peer->status == Established && peer->afc_nego[afi][safi]) {
|
|
|
|
update_group_adjust_peer(peer_af_find(peer, afi, safi));
|
2002-12-13 21:15:29 +01:00
|
|
|
bgp_default_originate (peer, afi, safi, 1);
|
2015-05-20 03:03:47 +02:00
|
|
|
bgp_announce_route (peer, afi, safi);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* peer-group member updates. */
|
|
|
|
group = peer->group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
UNSET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_DEFAULT_ORIGINATE);
|
|
|
|
|
|
|
|
if (peer->default_rmap[afi][safi].name)
|
|
|
|
free (peer->default_rmap[afi][safi].name);
|
|
|
|
peer->default_rmap[afi][safi].name = NULL;
|
|
|
|
peer->default_rmap[afi][safi].map = NULL;
|
|
|
|
|
2015-05-20 03:03:47 +02:00
|
|
|
if (peer->status == Established && peer->afc_nego[afi][safi]) {
|
|
|
|
update_group_adjust_peer(peer_af_find(peer, afi, safi));
|
2002-12-13 21:15:29 +01:00
|
|
|
bgp_default_originate (peer, afi, safi, 1);
|
2015-05-20 03:03:47 +02:00
|
|
|
bgp_announce_route (peer, afi, safi);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
int
|
|
|
|
peer_port_set (struct peer *peer, u_int16_t port)
|
|
|
|
{
|
|
|
|
peer->port = port;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
peer_port_unset (struct peer *peer)
|
|
|
|
{
|
|
|
|
peer->port = BGP_PORT_DEFAULT;
|
|
|
|
return 0;
|
|
|
|
}
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* neighbor weight. */
|
2015-05-20 03:12:17 +02:00
|
|
|
void
|
2002-12-13 21:15:29 +01:00
|
|
|
peer_weight_set (struct peer *peer, u_int16_t weight)
|
|
|
|
{
|
|
|
|
struct peer_group *group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
SET_FLAG (peer->config, PEER_CONFIG_WEIGHT);
|
|
|
|
peer->weight = weight;
|
|
|
|
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
2015-05-20 03:12:17 +02:00
|
|
|
return;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
/* peer-group member updates. */
|
|
|
|
group = peer->group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
peer->weight = group->conf->weight;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-05-20 03:12:17 +02:00
|
|
|
void
|
2002-12-13 21:15:29 +01:00
|
|
|
peer_weight_unset (struct peer *peer)
|
|
|
|
{
|
|
|
|
struct peer_group *group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
/* Set default weight. */
|
|
|
|
if (peer_group_active (peer))
|
|
|
|
peer->weight = peer->group->conf->weight;
|
|
|
|
else
|
|
|
|
peer->weight = 0;
|
|
|
|
|
|
|
|
UNSET_FLAG (peer->config, PEER_CONFIG_WEIGHT);
|
|
|
|
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
2015-05-20 03:12:17 +02:00
|
|
|
return;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
/* peer-group member updates. */
|
|
|
|
group = peer->group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
peer->weight = 0;
|
|
|
|
}
|
2015-05-20 03:12:17 +02:00
|
|
|
return;
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
int
|
|
|
|
peer_timers_set (struct peer *peer, u_int32_t keepalive, u_int32_t holdtime)
|
|
|
|
{
|
|
|
|
struct peer_group *group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
/* Not for peer group memeber. */
|
|
|
|
if (peer_group_active (peer))
|
|
|
|
return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
|
|
|
|
|
|
|
|
/* keepalive value check. */
|
|
|
|
if (keepalive > 65535)
|
|
|
|
return BGP_ERR_INVALID_VALUE;
|
|
|
|
|
|
|
|
/* Holdtime value check. */
|
|
|
|
if (holdtime > 65535)
|
|
|
|
return BGP_ERR_INVALID_VALUE;
|
|
|
|
|
|
|
|
/* Holdtime value must be either 0 or greater than 3. */
|
|
|
|
if (holdtime < 3 && holdtime != 0)
|
|
|
|
return BGP_ERR_INVALID_VALUE;
|
|
|
|
|
|
|
|
/* Set value to the configuration. */
|
|
|
|
SET_FLAG (peer->config, PEER_CONFIG_TIMER);
|
|
|
|
peer->holdtime = holdtime;
|
|
|
|
peer->keepalive = (keepalive < holdtime / 3 ? keepalive : holdtime / 3);
|
|
|
|
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
/* peer-group member updates. */
|
|
|
|
group = peer->group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
SET_FLAG (peer->config, PEER_CONFIG_TIMER);
|
|
|
|
peer->holdtime = group->conf->holdtime;
|
|
|
|
peer->keepalive = group->conf->keepalive;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
peer_timers_unset (struct peer *peer)
|
|
|
|
{
|
|
|
|
struct peer_group *group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
if (peer_group_active (peer))
|
|
|
|
return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
|
|
|
|
|
|
|
|
/* Clear configuration. */
|
|
|
|
UNSET_FLAG (peer->config, PEER_CONFIG_TIMER);
|
|
|
|
peer->keepalive = 0;
|
|
|
|
peer->holdtime = 0;
|
|
|
|
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
/* peer-group member updates. */
|
|
|
|
group = peer->group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
UNSET_FLAG (peer->config, PEER_CONFIG_TIMER);
|
|
|
|
peer->holdtime = 0;
|
|
|
|
peer->keepalive = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
int
|
|
|
|
peer_timers_connect_set (struct peer *peer, u_int32_t connect)
|
|
|
|
{
|
2015-05-20 02:40:35 +02:00
|
|
|
struct peer_group *group;
|
|
|
|
struct listnode *node, *nnode;
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
if (peer_group_active (peer))
|
|
|
|
return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
|
|
|
|
|
|
|
|
if (connect > 65535)
|
|
|
|
return BGP_ERR_INVALID_VALUE;
|
|
|
|
|
|
|
|
/* Set value to the configuration. */
|
|
|
|
SET_FLAG (peer->config, PEER_CONFIG_CONNECT);
|
|
|
|
peer->connect = connect;
|
|
|
|
|
|
|
|
/* Set value to timer setting. */
|
|
|
|
peer->v_connect = connect;
|
|
|
|
|
2015-05-20 02:40:35 +02:00
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
/* peer-group member updates. */
|
|
|
|
group = peer->group;
|
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
|
|
|
{
|
|
|
|
SET_FLAG (peer->config, PEER_CONFIG_CONNECT);
|
|
|
|
peer->connect = connect;
|
|
|
|
peer->v_connect = connect;
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
peer_timers_connect_unset (struct peer *peer)
|
|
|
|
{
|
2015-05-20 02:40:35 +02:00
|
|
|
struct peer_group *group;
|
|
|
|
struct listnode *node, *nnode;
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
if (peer_group_active (peer))
|
|
|
|
return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
|
|
|
|
|
|
|
|
/* Clear configuration. */
|
|
|
|
UNSET_FLAG (peer->config, PEER_CONFIG_CONNECT);
|
|
|
|
peer->connect = 0;
|
|
|
|
|
|
|
|
/* Set timer setting to default value. */
|
|
|
|
peer->v_connect = BGP_DEFAULT_CONNECT_RETRY;
|
|
|
|
|
2015-05-20 02:40:35 +02:00
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
/* peer-group member updates. */
|
|
|
|
group = peer->group;
|
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
|
|
|
{
|
|
|
|
UNSET_FLAG (peer->config, PEER_CONFIG_CONNECT);
|
|
|
|
peer->connect = 0;
|
|
|
|
peer->v_connect = BGP_DEFAULT_CONNECT_RETRY;
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
return 0;
|
|
|
|
}
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
int
|
|
|
|
peer_advertise_interval_set (struct peer *peer, u_int32_t routeadv)
|
|
|
|
{
|
2015-05-20 02:40:35 +02:00
|
|
|
struct peer_group *group;
|
|
|
|
struct listnode *node, *nnode;
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
if (peer_group_active (peer))
|
|
|
|
return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
|
|
|
|
|
|
|
|
if (routeadv > 600)
|
|
|
|
return BGP_ERR_INVALID_VALUE;
|
|
|
|
|
|
|
|
SET_FLAG (peer->config, PEER_CONFIG_ROUTEADV);
|
|
|
|
peer->routeadv = routeadv;
|
|
|
|
peer->v_routeadv = routeadv;
|
|
|
|
|
2015-05-20 03:03:47 +02:00
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP)) {
|
|
|
|
update_group_adjust_peer_afs (peer);
|
|
|
|
if (peer->status == Established)
|
|
|
|
bgp_announce_route_all (peer);
|
2015-05-20 02:40:35 +02:00
|
|
|
return 0;
|
2015-05-20 03:03:47 +02:00
|
|
|
}
|
2015-05-20 02:40:35 +02:00
|
|
|
|
|
|
|
/* peer-group member updates. */
|
|
|
|
group = peer->group;
|
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
|
|
|
{
|
|
|
|
SET_FLAG (peer->config, PEER_CONFIG_ROUTEADV);
|
|
|
|
peer->routeadv = routeadv;
|
|
|
|
peer->v_routeadv = routeadv;
|
2015-05-20 03:03:47 +02:00
|
|
|
update_group_adjust_peer_afs (peer);
|
|
|
|
if (peer->status == Established)
|
|
|
|
bgp_announce_route_all (peer);
|
2015-05-20 02:40:35 +02:00
|
|
|
}
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
peer_advertise_interval_unset (struct peer *peer)
|
|
|
|
{
|
2015-05-20 02:40:35 +02:00
|
|
|
struct peer_group *group;
|
|
|
|
struct listnode *node, *nnode;
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
if (peer_group_active (peer))
|
|
|
|
return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
|
|
|
|
|
|
|
|
UNSET_FLAG (peer->config, PEER_CONFIG_ROUTEADV);
|
|
|
|
peer->routeadv = 0;
|
|
|
|
|
2012-05-07 18:52:54 +02:00
|
|
|
if (peer->sort == BGP_PEER_IBGP)
|
2002-12-13 21:15:29 +01:00
|
|
|
peer->v_routeadv = BGP_DEFAULT_IBGP_ROUTEADV;
|
|
|
|
else
|
|
|
|
peer->v_routeadv = BGP_DEFAULT_EBGP_ROUTEADV;
|
2015-05-20 02:40:35 +02:00
|
|
|
|
2015-05-20 03:03:47 +02:00
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP)) {
|
|
|
|
update_group_adjust_peer_afs (peer);
|
|
|
|
if (peer->status == Established)
|
|
|
|
bgp_announce_route_all (peer);
|
2015-05-20 02:40:35 +02:00
|
|
|
return 0;
|
2015-05-20 03:03:47 +02:00
|
|
|
}
|
2015-05-20 02:40:35 +02:00
|
|
|
|
|
|
|
/* peer-group member updates. */
|
|
|
|
group = peer->group;
|
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
|
|
|
{
|
|
|
|
UNSET_FLAG (peer->config, PEER_CONFIG_ROUTEADV);
|
|
|
|
peer->routeadv = 0;
|
|
|
|
|
|
|
|
if (peer->sort == BGP_PEER_IBGP)
|
|
|
|
peer->v_routeadv = BGP_DEFAULT_IBGP_ROUTEADV;
|
|
|
|
else
|
|
|
|
peer->v_routeadv = BGP_DEFAULT_EBGP_ROUTEADV;
|
2015-05-20 03:03:47 +02:00
|
|
|
|
|
|
|
update_group_adjust_peer_afs (peer);
|
|
|
|
if (peer->status == Established)
|
|
|
|
bgp_announce_route_all (peer);
|
2015-05-20 02:40:35 +02:00
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* neighbor interface */
|
2015-05-20 03:12:17 +02:00
|
|
|
void
|
2004-10-13 07:06:08 +02:00
|
|
|
peer_interface_set (struct peer *peer, const char *str)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
if (peer->ifname)
|
|
|
|
free (peer->ifname);
|
|
|
|
peer->ifname = strdup (str);
|
|
|
|
}
|
|
|
|
|
2015-05-20 03:12:17 +02:00
|
|
|
void
|
2002-12-13 21:15:29 +01:00
|
|
|
peer_interface_unset (struct peer *peer)
|
|
|
|
{
|
|
|
|
if (peer->ifname)
|
|
|
|
free (peer->ifname);
|
|
|
|
peer->ifname = NULL;
|
|
|
|
}
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* Allow-as in. */
|
|
|
|
int
|
|
|
|
peer_allowas_in_set (struct peer *peer, afi_t afi, safi_t safi, int allow_num)
|
|
|
|
{
|
|
|
|
struct peer_group *group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
if (allow_num < 1 || allow_num > 10)
|
|
|
|
return BGP_ERR_INVALID_VALUE;
|
|
|
|
|
|
|
|
if (peer->allowas_in[afi][safi] != allow_num)
|
|
|
|
{
|
|
|
|
peer->allowas_in[afi][safi] = allow_num;
|
|
|
|
SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ALLOWAS_IN);
|
|
|
|
peer_change_action (peer, afi, safi, peer_change_reset_in);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
group = peer->group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
if (peer->allowas_in[afi][safi] != allow_num)
|
|
|
|
{
|
|
|
|
peer->allowas_in[afi][safi] = allow_num;
|
|
|
|
SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ALLOWAS_IN);
|
|
|
|
peer_change_action (peer, afi, safi, peer_change_reset_in);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
peer_allowas_in_unset (struct peer *peer, afi_t afi, safi_t safi)
|
|
|
|
{
|
|
|
|
struct peer_group *group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ALLOWAS_IN))
|
|
|
|
{
|
|
|
|
peer->allowas_in[afi][safi] = 0;
|
|
|
|
peer_af_flag_unset (peer, afi, safi, PEER_FLAG_ALLOWAS_IN);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
group = peer->group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ALLOWAS_IN))
|
|
|
|
{
|
|
|
|
peer->allowas_in[afi][safi] = 0;
|
|
|
|
peer_af_flag_unset (peer, afi, safi, PEER_FLAG_ALLOWAS_IN);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
int
|
bgpd: add replace-as modifier for BGP neighbor
Added replace-as modifier for BGP neighbors when using
local-as. If the replace-as modifier is specified, only the
replacement AS as specified by the local-as modifier is
prepended to the AS_PATH, not the process's AS.
In bgp_attr.c, I decided that
if (peer->change_local_as) {
/* If replace-as is specified, we only use the change_local_as when
advertising routes. */
if( ! CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS) ) {
aspath = aspath_add_seq (aspath, peer->local_as);
}
aspath = aspath_add_seq (aspath, peer->change_local_as);
} else {
aspath = aspath_add_seq (aspath, peer->local_as);
}
was clearer than the alternative that didn't duplicate the prepending of the
process's AS:
/* First, append the process local AS unless we have an alternate local_as
* and we're replacing it (as opposed to just prepending it). */
if (! (peer->change_local_as
&& CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS) ) ) {
aspath = aspath_add_seq (aspath, peer->local_as);
}
if (peer->change_local_as)
aspath = aspath_add_seq (aspath, peer->change_local_as);
}
But I could be convinced otherwise.
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
2012-11-08 00:50:07 +01:00
|
|
|
peer_local_as_set (struct peer *peer, as_t as, int no_prepend, int replace_as)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
struct bgp *bgp = peer->bgp;
|
|
|
|
struct peer_group *group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
if (peer_sort (peer) != BGP_PEER_EBGP
|
|
|
|
&& peer_sort (peer) != BGP_PEER_INTERNAL)
|
|
|
|
return BGP_ERR_LOCAL_AS_ALLOWED_ONLY_FOR_EBGP;
|
|
|
|
|
|
|
|
if (bgp->as == as)
|
|
|
|
return BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS;
|
|
|
|
|
|
|
|
if (peer_group_active (peer))
|
|
|
|
return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
|
|
|
|
|
bgpd: add replace-as modifier for BGP neighbor
Added replace-as modifier for BGP neighbors when using
local-as. If the replace-as modifier is specified, only the
replacement AS as specified by the local-as modifier is
prepended to the AS_PATH, not the process's AS.
In bgp_attr.c, I decided that
if (peer->change_local_as) {
/* If replace-as is specified, we only use the change_local_as when
advertising routes. */
if( ! CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS) ) {
aspath = aspath_add_seq (aspath, peer->local_as);
}
aspath = aspath_add_seq (aspath, peer->change_local_as);
} else {
aspath = aspath_add_seq (aspath, peer->local_as);
}
was clearer than the alternative that didn't duplicate the prepending of the
process's AS:
/* First, append the process local AS unless we have an alternate local_as
* and we're replacing it (as opposed to just prepending it). */
if (! (peer->change_local_as
&& CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS) ) ) {
aspath = aspath_add_seq (aspath, peer->local_as);
}
if (peer->change_local_as)
aspath = aspath_add_seq (aspath, peer->change_local_as);
}
But I could be convinced otherwise.
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
2012-11-08 00:50:07 +01:00
|
|
|
if (peer->as == as)
|
|
|
|
return BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS_REMOTE_AS;
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
if (peer->change_local_as == as &&
|
|
|
|
((CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND) && no_prepend)
|
bgpd: add replace-as modifier for BGP neighbor
Added replace-as modifier for BGP neighbors when using
local-as. If the replace-as modifier is specified, only the
replacement AS as specified by the local-as modifier is
prepended to the AS_PATH, not the process's AS.
In bgp_attr.c, I decided that
if (peer->change_local_as) {
/* If replace-as is specified, we only use the change_local_as when
advertising routes. */
if( ! CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS) ) {
aspath = aspath_add_seq (aspath, peer->local_as);
}
aspath = aspath_add_seq (aspath, peer->change_local_as);
} else {
aspath = aspath_add_seq (aspath, peer->local_as);
}
was clearer than the alternative that didn't duplicate the prepending of the
process's AS:
/* First, append the process local AS unless we have an alternate local_as
* and we're replacing it (as opposed to just prepending it). */
if (! (peer->change_local_as
&& CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS) ) ) {
aspath = aspath_add_seq (aspath, peer->local_as);
}
if (peer->change_local_as)
aspath = aspath_add_seq (aspath, peer->change_local_as);
}
But I could be convinced otherwise.
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
2012-11-08 00:50:07 +01:00
|
|
|
|| (! CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND) && ! no_prepend)) &&
|
|
|
|
((CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS) && replace_as)
|
|
|
|
|| (! CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS) && ! replace_as)))
|
2002-12-13 21:15:29 +01:00
|
|
|
return 0;
|
|
|
|
|
|
|
|
peer->change_local_as = as;
|
|
|
|
if (no_prepend)
|
|
|
|
SET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND);
|
|
|
|
else
|
|
|
|
UNSET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND);
|
|
|
|
|
bgpd: add replace-as modifier for BGP neighbor
Added replace-as modifier for BGP neighbors when using
local-as. If the replace-as modifier is specified, only the
replacement AS as specified by the local-as modifier is
prepended to the AS_PATH, not the process's AS.
In bgp_attr.c, I decided that
if (peer->change_local_as) {
/* If replace-as is specified, we only use the change_local_as when
advertising routes. */
if( ! CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS) ) {
aspath = aspath_add_seq (aspath, peer->local_as);
}
aspath = aspath_add_seq (aspath, peer->change_local_as);
} else {
aspath = aspath_add_seq (aspath, peer->local_as);
}
was clearer than the alternative that didn't duplicate the prepending of the
process's AS:
/* First, append the process local AS unless we have an alternate local_as
* and we're replacing it (as opposed to just prepending it). */
if (! (peer->change_local_as
&& CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS) ) ) {
aspath = aspath_add_seq (aspath, peer->local_as);
}
if (peer->change_local_as)
aspath = aspath_add_seq (aspath, peer->change_local_as);
}
But I could be convinced otherwise.
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
2012-11-08 00:50:07 +01:00
|
|
|
if (replace_as)
|
|
|
|
SET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS);
|
|
|
|
else
|
|
|
|
UNSET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS);
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
|
|
|
{
|
2013-10-02 12:40:20 +02:00
|
|
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
|
2004-05-20 11:19:34 +02:00
|
|
|
{
|
|
|
|
peer->last_reset = PEER_DOWN_LOCAL_AS_CHANGE;
|
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE,
|
|
|
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
else
|
2015-05-20 02:40:37 +02:00
|
|
|
bgp_session_reset(peer);
|
2002-12-13 21:15:29 +01:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
group = peer->group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
peer->change_local_as = as;
|
|
|
|
if (no_prepend)
|
|
|
|
SET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND);
|
|
|
|
else
|
|
|
|
UNSET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND);
|
|
|
|
|
bgpd: add replace-as modifier for BGP neighbor
Added replace-as modifier for BGP neighbors when using
local-as. If the replace-as modifier is specified, only the
replacement AS as specified by the local-as modifier is
prepended to the AS_PATH, not the process's AS.
In bgp_attr.c, I decided that
if (peer->change_local_as) {
/* If replace-as is specified, we only use the change_local_as when
advertising routes. */
if( ! CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS) ) {
aspath = aspath_add_seq (aspath, peer->local_as);
}
aspath = aspath_add_seq (aspath, peer->change_local_as);
} else {
aspath = aspath_add_seq (aspath, peer->local_as);
}
was clearer than the alternative that didn't duplicate the prepending of the
process's AS:
/* First, append the process local AS unless we have an alternate local_as
* and we're replacing it (as opposed to just prepending it). */
if (! (peer->change_local_as
&& CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS) ) ) {
aspath = aspath_add_seq (aspath, peer->local_as);
}
if (peer->change_local_as)
aspath = aspath_add_seq (aspath, peer->change_local_as);
}
But I could be convinced otherwise.
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
2012-11-08 00:50:07 +01:00
|
|
|
if (replace_as)
|
|
|
|
SET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS);
|
|
|
|
else
|
|
|
|
UNSET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS);
|
|
|
|
|
2013-10-02 12:40:20 +02:00
|
|
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
|
2004-05-20 11:19:34 +02:00
|
|
|
{
|
|
|
|
peer->last_reset = PEER_DOWN_LOCAL_AS_CHANGE;
|
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE,
|
|
|
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
else
|
|
|
|
BGP_EVENT_ADD (peer, BGP_Stop);
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
peer_local_as_unset (struct peer *peer)
|
|
|
|
{
|
|
|
|
struct peer_group *group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
if (peer_group_active (peer))
|
|
|
|
return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
|
|
|
|
|
|
|
|
if (! peer->change_local_as)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
peer->change_local_as = 0;
|
|
|
|
UNSET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND);
|
bgpd: add replace-as modifier for BGP neighbor
Added replace-as modifier for BGP neighbors when using
local-as. If the replace-as modifier is specified, only the
replacement AS as specified by the local-as modifier is
prepended to the AS_PATH, not the process's AS.
In bgp_attr.c, I decided that
if (peer->change_local_as) {
/* If replace-as is specified, we only use the change_local_as when
advertising routes. */
if( ! CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS) ) {
aspath = aspath_add_seq (aspath, peer->local_as);
}
aspath = aspath_add_seq (aspath, peer->change_local_as);
} else {
aspath = aspath_add_seq (aspath, peer->local_as);
}
was clearer than the alternative that didn't duplicate the prepending of the
process's AS:
/* First, append the process local AS unless we have an alternate local_as
* and we're replacing it (as opposed to just prepending it). */
if (! (peer->change_local_as
&& CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS) ) ) {
aspath = aspath_add_seq (aspath, peer->local_as);
}
if (peer->change_local_as)
aspath = aspath_add_seq (aspath, peer->change_local_as);
}
But I could be convinced otherwise.
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
2012-11-08 00:50:07 +01:00
|
|
|
UNSET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
|
|
|
{
|
2013-10-02 12:40:20 +02:00
|
|
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
|
2004-05-20 11:19:34 +02:00
|
|
|
{
|
|
|
|
peer->last_reset = PEER_DOWN_LOCAL_AS_CHANGE;
|
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE,
|
|
|
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
else
|
|
|
|
BGP_EVENT_ADD (peer, BGP_Stop);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
group = peer->group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
peer->change_local_as = 0;
|
|
|
|
UNSET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND);
|
bgpd: add replace-as modifier for BGP neighbor
Added replace-as modifier for BGP neighbors when using
local-as. If the replace-as modifier is specified, only the
replacement AS as specified by the local-as modifier is
prepended to the AS_PATH, not the process's AS.
In bgp_attr.c, I decided that
if (peer->change_local_as) {
/* If replace-as is specified, we only use the change_local_as when
advertising routes. */
if( ! CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS) ) {
aspath = aspath_add_seq (aspath, peer->local_as);
}
aspath = aspath_add_seq (aspath, peer->change_local_as);
} else {
aspath = aspath_add_seq (aspath, peer->local_as);
}
was clearer than the alternative that didn't duplicate the prepending of the
process's AS:
/* First, append the process local AS unless we have an alternate local_as
* and we're replacing it (as opposed to just prepending it). */
if (! (peer->change_local_as
&& CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS) ) ) {
aspath = aspath_add_seq (aspath, peer->local_as);
}
if (peer->change_local_as)
aspath = aspath_add_seq (aspath, peer->change_local_as);
}
But I could be convinced otherwise.
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
2012-11-08 00:50:07 +01:00
|
|
|
UNSET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2013-10-02 12:40:20 +02:00
|
|
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
|
2004-05-20 11:19:34 +02:00
|
|
|
{
|
|
|
|
peer->last_reset = PEER_DOWN_LOCAL_AS_CHANGE;
|
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE,
|
|
|
|
BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
else
|
2015-05-20 02:40:37 +02:00
|
|
|
bgp_session_reset(peer);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
2014-06-04 06:53:35 +02:00
|
|
|
|
[bgpd] TCP-MD5: password vty configuration and initial Linux support
2008-07-21 Paul Jakma <paul.jakma@sun.com>
* bgp_packet.c: (bgp_open_receive) fix warning in a zlog call
* bgp_vty.c: (bgp_vty_return) add return code
* bgpd.c: (bgp_master_init) setup the socket list.
* bgp_network.c: Remove the dual IPv4/6 socket thing for now, which
was implemented by Michael, until such time as its clear its
required for Linux (see sockopt comments). IPv6 support, including
IPv4 sessions on AF_INET6 sockets, therefore is broken, and the
'-l 0.0.0.0' arguments would need to be given to bgpd to make
things work here.
2008-07-21 Michael H. Warfield <mhw@wittsend.com>
YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Tomohiko Kusuda <kusuda@inetcore.com>
Leigh Brown <leigh@solinno.co.uk>
* bgp_network.c: (bgp_md5_set_one) shim between libzebra tcp-md5
sockopt and bgpd.
(bgp_md5_set_socket) Helper for bgp_connect
(bgp_md5_set) setup TCP-MD5SIG for the given peer.
(bgp_connect) call out to bgp_md5_set_socket for the outgoing
connect socket.
(bgp_socket) save references to the listen sockets, needed if
TCP-MD5SIG is applied later or changed.
* bgp_vty.c: (*neighbor_password_cmd) New 'neighbor ... password'
commands.
* bgpd.c: (peer_{new,delete) manage TCP-MD5 password
(peer_group2peer_config_copy) inherit TCP-MD5 password
(peer_password_{un,}set) orchestrate the whole add/remove of TCP-MD5
passwords: applying checks, stopping peers, and trying to return
errors to UI, etc.
(bgp_config_write_peer) save password.
Fix missing newline in writeout of neighbor ... port.
2008-07-21 Paul Jakma <paul.jakma@sun.com>
* sockunion.c: ifdef out various places that converted
v4mapped sockets to pure v4. Doesn't seem necessary at all,
presumably a workaround for now historical inet_ntop bugs (?)
2008-07-21 Michael H. Warfield <mhw@wittsend.com>
YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
* sockopt.{c,h}: (sockopt_tcp_signature) Add TCP-MD5SIG support.
2008-07-21 23:02:49 +02:00
|
|
|
/* Set password for authenticating with the peer. */
|
|
|
|
int
|
|
|
|
peer_password_set (struct peer *peer, const char *password)
|
|
|
|
{
|
|
|
|
struct listnode *nn, *nnode;
|
|
|
|
int len = password ? strlen(password) : 0;
|
|
|
|
int ret = BGP_SUCCESS;
|
|
|
|
|
|
|
|
if ((len < PEER_PASSWORD_MINLEN) || (len > PEER_PASSWORD_MAXLEN))
|
|
|
|
return BGP_ERR_INVALID_VALUE;
|
|
|
|
|
|
|
|
if (peer->password && strcmp (peer->password, password) == 0
|
|
|
|
&& ! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
if (peer->password)
|
|
|
|
XFREE (MTYPE_PEER_PASSWORD, peer->password);
|
|
|
|
|
|
|
|
peer->password = XSTRDUP (MTYPE_PEER_PASSWORD, password);
|
|
|
|
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
|
|
|
{
|
2013-10-02 12:40:20 +02:00
|
|
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
|
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE, BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
[bgpd] TCP-MD5: password vty configuration and initial Linux support
2008-07-21 Paul Jakma <paul.jakma@sun.com>
* bgp_packet.c: (bgp_open_receive) fix warning in a zlog call
* bgp_vty.c: (bgp_vty_return) add return code
* bgpd.c: (bgp_master_init) setup the socket list.
* bgp_network.c: Remove the dual IPv4/6 socket thing for now, which
was implemented by Michael, until such time as its clear its
required for Linux (see sockopt comments). IPv6 support, including
IPv4 sessions on AF_INET6 sockets, therefore is broken, and the
'-l 0.0.0.0' arguments would need to be given to bgpd to make
things work here.
2008-07-21 Michael H. Warfield <mhw@wittsend.com>
YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Tomohiko Kusuda <kusuda@inetcore.com>
Leigh Brown <leigh@solinno.co.uk>
* bgp_network.c: (bgp_md5_set_one) shim between libzebra tcp-md5
sockopt and bgpd.
(bgp_md5_set_socket) Helper for bgp_connect
(bgp_md5_set) setup TCP-MD5SIG for the given peer.
(bgp_connect) call out to bgp_md5_set_socket for the outgoing
connect socket.
(bgp_socket) save references to the listen sockets, needed if
TCP-MD5SIG is applied later or changed.
* bgp_vty.c: (*neighbor_password_cmd) New 'neighbor ... password'
commands.
* bgpd.c: (peer_{new,delete) manage TCP-MD5 password
(peer_group2peer_config_copy) inherit TCP-MD5 password
(peer_password_{un,}set) orchestrate the whole add/remove of TCP-MD5
passwords: applying checks, stopping peers, and trying to return
errors to UI, etc.
(bgp_config_write_peer) save password.
Fix missing newline in writeout of neighbor ... port.
2008-07-21 Paul Jakma <paul.jakma@sun.com>
* sockunion.c: ifdef out various places that converted
v4mapped sockets to pure v4. Doesn't seem necessary at all,
presumably a workaround for now historical inet_ntop bugs (?)
2008-07-21 Michael H. Warfield <mhw@wittsend.com>
YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
* sockopt.{c,h}: (sockopt_tcp_signature) Add TCP-MD5SIG support.
2008-07-21 23:02:49 +02:00
|
|
|
else
|
2015-05-20 02:40:37 +02:00
|
|
|
bgp_session_reset(peer);
|
[bgpd] TCP-MD5: password vty configuration and initial Linux support
2008-07-21 Paul Jakma <paul.jakma@sun.com>
* bgp_packet.c: (bgp_open_receive) fix warning in a zlog call
* bgp_vty.c: (bgp_vty_return) add return code
* bgpd.c: (bgp_master_init) setup the socket list.
* bgp_network.c: Remove the dual IPv4/6 socket thing for now, which
was implemented by Michael, until such time as its clear its
required for Linux (see sockopt comments). IPv6 support, including
IPv4 sessions on AF_INET6 sockets, therefore is broken, and the
'-l 0.0.0.0' arguments would need to be given to bgpd to make
things work here.
2008-07-21 Michael H. Warfield <mhw@wittsend.com>
YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Tomohiko Kusuda <kusuda@inetcore.com>
Leigh Brown <leigh@solinno.co.uk>
* bgp_network.c: (bgp_md5_set_one) shim between libzebra tcp-md5
sockopt and bgpd.
(bgp_md5_set_socket) Helper for bgp_connect
(bgp_md5_set) setup TCP-MD5SIG for the given peer.
(bgp_connect) call out to bgp_md5_set_socket for the outgoing
connect socket.
(bgp_socket) save references to the listen sockets, needed if
TCP-MD5SIG is applied later or changed.
* bgp_vty.c: (*neighbor_password_cmd) New 'neighbor ... password'
commands.
* bgpd.c: (peer_{new,delete) manage TCP-MD5 password
(peer_group2peer_config_copy) inherit TCP-MD5 password
(peer_password_{un,}set) orchestrate the whole add/remove of TCP-MD5
passwords: applying checks, stopping peers, and trying to return
errors to UI, etc.
(bgp_config_write_peer) save password.
Fix missing newline in writeout of neighbor ... port.
2008-07-21 Paul Jakma <paul.jakma@sun.com>
* sockunion.c: ifdef out various places that converted
v4mapped sockets to pure v4. Doesn't seem necessary at all,
presumably a workaround for now historical inet_ntop bugs (?)
2008-07-21 Michael H. Warfield <mhw@wittsend.com>
YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
* sockopt.{c,h}: (sockopt_tcp_signature) Add TCP-MD5SIG support.
2008-07-21 23:02:49 +02:00
|
|
|
|
|
|
|
return (bgp_md5_set (peer) >= 0) ? BGP_SUCCESS : BGP_ERR_TCPSIG_FAILED;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (ALL_LIST_ELEMENTS (peer->group->peer, nn, nnode, peer))
|
|
|
|
{
|
|
|
|
if (peer->password && strcmp (peer->password, password) == 0)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (peer->password)
|
|
|
|
XFREE (MTYPE_PEER_PASSWORD, peer->password);
|
|
|
|
|
|
|
|
peer->password = XSTRDUP(MTYPE_PEER_PASSWORD, password);
|
|
|
|
|
2013-10-02 12:40:20 +02:00
|
|
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
|
[bgpd] TCP-MD5: password vty configuration and initial Linux support
2008-07-21 Paul Jakma <paul.jakma@sun.com>
* bgp_packet.c: (bgp_open_receive) fix warning in a zlog call
* bgp_vty.c: (bgp_vty_return) add return code
* bgpd.c: (bgp_master_init) setup the socket list.
* bgp_network.c: Remove the dual IPv4/6 socket thing for now, which
was implemented by Michael, until such time as its clear its
required for Linux (see sockopt comments). IPv6 support, including
IPv4 sessions on AF_INET6 sockets, therefore is broken, and the
'-l 0.0.0.0' arguments would need to be given to bgpd to make
things work here.
2008-07-21 Michael H. Warfield <mhw@wittsend.com>
YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Tomohiko Kusuda <kusuda@inetcore.com>
Leigh Brown <leigh@solinno.co.uk>
* bgp_network.c: (bgp_md5_set_one) shim between libzebra tcp-md5
sockopt and bgpd.
(bgp_md5_set_socket) Helper for bgp_connect
(bgp_md5_set) setup TCP-MD5SIG for the given peer.
(bgp_connect) call out to bgp_md5_set_socket for the outgoing
connect socket.
(bgp_socket) save references to the listen sockets, needed if
TCP-MD5SIG is applied later or changed.
* bgp_vty.c: (*neighbor_password_cmd) New 'neighbor ... password'
commands.
* bgpd.c: (peer_{new,delete) manage TCP-MD5 password
(peer_group2peer_config_copy) inherit TCP-MD5 password
(peer_password_{un,}set) orchestrate the whole add/remove of TCP-MD5
passwords: applying checks, stopping peers, and trying to return
errors to UI, etc.
(bgp_config_write_peer) save password.
Fix missing newline in writeout of neighbor ... port.
2008-07-21 Paul Jakma <paul.jakma@sun.com>
* sockunion.c: ifdef out various places that converted
v4mapped sockets to pure v4. Doesn't seem necessary at all,
presumably a workaround for now historical inet_ntop bugs (?)
2008-07-21 Michael H. Warfield <mhw@wittsend.com>
YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
* sockopt.{c,h}: (sockopt_tcp_signature) Add TCP-MD5SIG support.
2008-07-21 23:02:49 +02:00
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE, BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
|
|
|
else
|
2015-05-20 02:40:37 +02:00
|
|
|
bgp_session_reset(peer);
|
[bgpd] TCP-MD5: password vty configuration and initial Linux support
2008-07-21 Paul Jakma <paul.jakma@sun.com>
* bgp_packet.c: (bgp_open_receive) fix warning in a zlog call
* bgp_vty.c: (bgp_vty_return) add return code
* bgpd.c: (bgp_master_init) setup the socket list.
* bgp_network.c: Remove the dual IPv4/6 socket thing for now, which
was implemented by Michael, until such time as its clear its
required for Linux (see sockopt comments). IPv6 support, including
IPv4 sessions on AF_INET6 sockets, therefore is broken, and the
'-l 0.0.0.0' arguments would need to be given to bgpd to make
things work here.
2008-07-21 Michael H. Warfield <mhw@wittsend.com>
YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Tomohiko Kusuda <kusuda@inetcore.com>
Leigh Brown <leigh@solinno.co.uk>
* bgp_network.c: (bgp_md5_set_one) shim between libzebra tcp-md5
sockopt and bgpd.
(bgp_md5_set_socket) Helper for bgp_connect
(bgp_md5_set) setup TCP-MD5SIG for the given peer.
(bgp_connect) call out to bgp_md5_set_socket for the outgoing
connect socket.
(bgp_socket) save references to the listen sockets, needed if
TCP-MD5SIG is applied later or changed.
* bgp_vty.c: (*neighbor_password_cmd) New 'neighbor ... password'
commands.
* bgpd.c: (peer_{new,delete) manage TCP-MD5 password
(peer_group2peer_config_copy) inherit TCP-MD5 password
(peer_password_{un,}set) orchestrate the whole add/remove of TCP-MD5
passwords: applying checks, stopping peers, and trying to return
errors to UI, etc.
(bgp_config_write_peer) save password.
Fix missing newline in writeout of neighbor ... port.
2008-07-21 Paul Jakma <paul.jakma@sun.com>
* sockunion.c: ifdef out various places that converted
v4mapped sockets to pure v4. Doesn't seem necessary at all,
presumably a workaround for now historical inet_ntop bugs (?)
2008-07-21 Michael H. Warfield <mhw@wittsend.com>
YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
* sockopt.{c,h}: (sockopt_tcp_signature) Add TCP-MD5SIG support.
2008-07-21 23:02:49 +02:00
|
|
|
|
|
|
|
if (bgp_md5_set (peer) < 0)
|
|
|
|
ret = BGP_ERR_TCPSIG_FAILED;
|
|
|
|
}
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
peer_password_unset (struct peer *peer)
|
|
|
|
{
|
|
|
|
struct listnode *nn, *nnode;
|
|
|
|
|
|
|
|
if (!peer->password
|
|
|
|
&& !CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
if (!CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
|
|
|
{
|
|
|
|
if (peer_group_active (peer)
|
|
|
|
&& peer->group->conf->password
|
|
|
|
&& strcmp (peer->group->conf->password, peer->password) == 0)
|
|
|
|
return BGP_ERR_PEER_GROUP_HAS_THE_FLAG;
|
|
|
|
|
2013-10-02 12:40:20 +02:00
|
|
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
|
[bgpd] TCP-MD5: password vty configuration and initial Linux support
2008-07-21 Paul Jakma <paul.jakma@sun.com>
* bgp_packet.c: (bgp_open_receive) fix warning in a zlog call
* bgp_vty.c: (bgp_vty_return) add return code
* bgpd.c: (bgp_master_init) setup the socket list.
* bgp_network.c: Remove the dual IPv4/6 socket thing for now, which
was implemented by Michael, until such time as its clear its
required for Linux (see sockopt comments). IPv6 support, including
IPv4 sessions on AF_INET6 sockets, therefore is broken, and the
'-l 0.0.0.0' arguments would need to be given to bgpd to make
things work here.
2008-07-21 Michael H. Warfield <mhw@wittsend.com>
YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Tomohiko Kusuda <kusuda@inetcore.com>
Leigh Brown <leigh@solinno.co.uk>
* bgp_network.c: (bgp_md5_set_one) shim between libzebra tcp-md5
sockopt and bgpd.
(bgp_md5_set_socket) Helper for bgp_connect
(bgp_md5_set) setup TCP-MD5SIG for the given peer.
(bgp_connect) call out to bgp_md5_set_socket for the outgoing
connect socket.
(bgp_socket) save references to the listen sockets, needed if
TCP-MD5SIG is applied later or changed.
* bgp_vty.c: (*neighbor_password_cmd) New 'neighbor ... password'
commands.
* bgpd.c: (peer_{new,delete) manage TCP-MD5 password
(peer_group2peer_config_copy) inherit TCP-MD5 password
(peer_password_{un,}set) orchestrate the whole add/remove of TCP-MD5
passwords: applying checks, stopping peers, and trying to return
errors to UI, etc.
(bgp_config_write_peer) save password.
Fix missing newline in writeout of neighbor ... port.
2008-07-21 Paul Jakma <paul.jakma@sun.com>
* sockunion.c: ifdef out various places that converted
v4mapped sockets to pure v4. Doesn't seem necessary at all,
presumably a workaround for now historical inet_ntop bugs (?)
2008-07-21 Michael H. Warfield <mhw@wittsend.com>
YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
* sockopt.{c,h}: (sockopt_tcp_signature) Add TCP-MD5SIG support.
2008-07-21 23:02:49 +02:00
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE, BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
|
|
|
else
|
2015-05-20 02:40:37 +02:00
|
|
|
bgp_session_reset(peer);
|
[bgpd] TCP-MD5: password vty configuration and initial Linux support
2008-07-21 Paul Jakma <paul.jakma@sun.com>
* bgp_packet.c: (bgp_open_receive) fix warning in a zlog call
* bgp_vty.c: (bgp_vty_return) add return code
* bgpd.c: (bgp_master_init) setup the socket list.
* bgp_network.c: Remove the dual IPv4/6 socket thing for now, which
was implemented by Michael, until such time as its clear its
required for Linux (see sockopt comments). IPv6 support, including
IPv4 sessions on AF_INET6 sockets, therefore is broken, and the
'-l 0.0.0.0' arguments would need to be given to bgpd to make
things work here.
2008-07-21 Michael H. Warfield <mhw@wittsend.com>
YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Tomohiko Kusuda <kusuda@inetcore.com>
Leigh Brown <leigh@solinno.co.uk>
* bgp_network.c: (bgp_md5_set_one) shim between libzebra tcp-md5
sockopt and bgpd.
(bgp_md5_set_socket) Helper for bgp_connect
(bgp_md5_set) setup TCP-MD5SIG for the given peer.
(bgp_connect) call out to bgp_md5_set_socket for the outgoing
connect socket.
(bgp_socket) save references to the listen sockets, needed if
TCP-MD5SIG is applied later or changed.
* bgp_vty.c: (*neighbor_password_cmd) New 'neighbor ... password'
commands.
* bgpd.c: (peer_{new,delete) manage TCP-MD5 password
(peer_group2peer_config_copy) inherit TCP-MD5 password
(peer_password_{un,}set) orchestrate the whole add/remove of TCP-MD5
passwords: applying checks, stopping peers, and trying to return
errors to UI, etc.
(bgp_config_write_peer) save password.
Fix missing newline in writeout of neighbor ... port.
2008-07-21 Paul Jakma <paul.jakma@sun.com>
* sockunion.c: ifdef out various places that converted
v4mapped sockets to pure v4. Doesn't seem necessary at all,
presumably a workaround for now historical inet_ntop bugs (?)
2008-07-21 Michael H. Warfield <mhw@wittsend.com>
YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
* sockopt.{c,h}: (sockopt_tcp_signature) Add TCP-MD5SIG support.
2008-07-21 23:02:49 +02:00
|
|
|
|
|
|
|
if (peer->password)
|
|
|
|
XFREE (MTYPE_PEER_PASSWORD, peer->password);
|
|
|
|
|
|
|
|
peer->password = NULL;
|
|
|
|
|
|
|
|
bgp_md5_set (peer);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
XFREE (MTYPE_PEER_PASSWORD, peer->password);
|
|
|
|
peer->password = NULL;
|
|
|
|
|
|
|
|
for (ALL_LIST_ELEMENTS (peer->group->peer, nn, nnode, peer))
|
|
|
|
{
|
|
|
|
if (!peer->password)
|
|
|
|
continue;
|
|
|
|
|
2013-10-02 12:40:20 +02:00
|
|
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
|
[bgpd] TCP-MD5: password vty configuration and initial Linux support
2008-07-21 Paul Jakma <paul.jakma@sun.com>
* bgp_packet.c: (bgp_open_receive) fix warning in a zlog call
* bgp_vty.c: (bgp_vty_return) add return code
* bgpd.c: (bgp_master_init) setup the socket list.
* bgp_network.c: Remove the dual IPv4/6 socket thing for now, which
was implemented by Michael, until such time as its clear its
required for Linux (see sockopt comments). IPv6 support, including
IPv4 sessions on AF_INET6 sockets, therefore is broken, and the
'-l 0.0.0.0' arguments would need to be given to bgpd to make
things work here.
2008-07-21 Michael H. Warfield <mhw@wittsend.com>
YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Tomohiko Kusuda <kusuda@inetcore.com>
Leigh Brown <leigh@solinno.co.uk>
* bgp_network.c: (bgp_md5_set_one) shim between libzebra tcp-md5
sockopt and bgpd.
(bgp_md5_set_socket) Helper for bgp_connect
(bgp_md5_set) setup TCP-MD5SIG for the given peer.
(bgp_connect) call out to bgp_md5_set_socket for the outgoing
connect socket.
(bgp_socket) save references to the listen sockets, needed if
TCP-MD5SIG is applied later or changed.
* bgp_vty.c: (*neighbor_password_cmd) New 'neighbor ... password'
commands.
* bgpd.c: (peer_{new,delete) manage TCP-MD5 password
(peer_group2peer_config_copy) inherit TCP-MD5 password
(peer_password_{un,}set) orchestrate the whole add/remove of TCP-MD5
passwords: applying checks, stopping peers, and trying to return
errors to UI, etc.
(bgp_config_write_peer) save password.
Fix missing newline in writeout of neighbor ... port.
2008-07-21 Paul Jakma <paul.jakma@sun.com>
* sockunion.c: ifdef out various places that converted
v4mapped sockets to pure v4. Doesn't seem necessary at all,
presumably a workaround for now historical inet_ntop bugs (?)
2008-07-21 Michael H. Warfield <mhw@wittsend.com>
YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
* sockopt.{c,h}: (sockopt_tcp_signature) Add TCP-MD5SIG support.
2008-07-21 23:02:49 +02:00
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE, BGP_NOTIFY_CEASE_CONFIG_CHANGE);
|
|
|
|
else
|
2015-05-20 02:40:37 +02:00
|
|
|
bgp_session_reset(peer);
|
[bgpd] TCP-MD5: password vty configuration and initial Linux support
2008-07-21 Paul Jakma <paul.jakma@sun.com>
* bgp_packet.c: (bgp_open_receive) fix warning in a zlog call
* bgp_vty.c: (bgp_vty_return) add return code
* bgpd.c: (bgp_master_init) setup the socket list.
* bgp_network.c: Remove the dual IPv4/6 socket thing for now, which
was implemented by Michael, until such time as its clear its
required for Linux (see sockopt comments). IPv6 support, including
IPv4 sessions on AF_INET6 sockets, therefore is broken, and the
'-l 0.0.0.0' arguments would need to be given to bgpd to make
things work here.
2008-07-21 Michael H. Warfield <mhw@wittsend.com>
YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Tomohiko Kusuda <kusuda@inetcore.com>
Leigh Brown <leigh@solinno.co.uk>
* bgp_network.c: (bgp_md5_set_one) shim between libzebra tcp-md5
sockopt and bgpd.
(bgp_md5_set_socket) Helper for bgp_connect
(bgp_md5_set) setup TCP-MD5SIG for the given peer.
(bgp_connect) call out to bgp_md5_set_socket for the outgoing
connect socket.
(bgp_socket) save references to the listen sockets, needed if
TCP-MD5SIG is applied later or changed.
* bgp_vty.c: (*neighbor_password_cmd) New 'neighbor ... password'
commands.
* bgpd.c: (peer_{new,delete) manage TCP-MD5 password
(peer_group2peer_config_copy) inherit TCP-MD5 password
(peer_password_{un,}set) orchestrate the whole add/remove of TCP-MD5
passwords: applying checks, stopping peers, and trying to return
errors to UI, etc.
(bgp_config_write_peer) save password.
Fix missing newline in writeout of neighbor ... port.
2008-07-21 Paul Jakma <paul.jakma@sun.com>
* sockunion.c: ifdef out various places that converted
v4mapped sockets to pure v4. Doesn't seem necessary at all,
presumably a workaround for now historical inet_ntop bugs (?)
2008-07-21 Michael H. Warfield <mhw@wittsend.com>
YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
* sockopt.{c,h}: (sockopt_tcp_signature) Add TCP-MD5SIG support.
2008-07-21 23:02:49 +02:00
|
|
|
|
|
|
|
XFREE (MTYPE_PEER_PASSWORD, peer->password);
|
|
|
|
peer->password = NULL;
|
|
|
|
|
|
|
|
bgp_md5_set (peer);
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2015-05-20 03:03:47 +02:00
|
|
|
/*
|
|
|
|
* Helper function that is called after the name of the policy
|
2015-05-20 03:03:52 +02:00
|
|
|
* being used by a peer has changed (AF specific). Automatically
|
|
|
|
* initiates inbound or outbound processing as needed.
|
2015-05-20 03:03:47 +02:00
|
|
|
*/
|
|
|
|
static void
|
2015-05-20 03:03:52 +02:00
|
|
|
peer_on_policy_change (struct peer *peer, afi_t afi, safi_t safi, int outbound)
|
2015-05-20 03:03:47 +02:00
|
|
|
{
|
2015-05-20 03:03:52 +02:00
|
|
|
if (outbound)
|
2015-05-20 03:03:47 +02:00
|
|
|
{
|
2015-05-20 03:03:52 +02:00
|
|
|
update_group_adjust_peer (peer_af_find (peer, afi, safi));
|
|
|
|
if (peer->status == Established)
|
|
|
|
bgp_announce_route(peer, afi, safi);
|
2015-05-20 03:03:47 +02:00
|
|
|
}
|
|
|
|
else
|
2015-05-20 03:03:52 +02:00
|
|
|
{
|
|
|
|
if (peer->status != Established)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
|
|
|
|
bgp_soft_reconfig_in (peer, afi, safi);
|
|
|
|
else if (CHECK_FLAG (peer->cap, PEER_CAP_REFRESH_OLD_RCV)
|
|
|
|
|| CHECK_FLAG (peer->cap, PEER_CAP_REFRESH_NEW_RCV))
|
|
|
|
bgp_route_refresh_send (peer, afi, safi, 0, 0, 0);
|
|
|
|
}
|
2015-05-20 03:03:47 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* Set distribute list to the peer. */
|
|
|
|
int
|
|
|
|
peer_distribute_set (struct peer *peer, afi_t afi, safi_t safi, int direct,
|
2004-10-13 07:06:08 +02:00
|
|
|
const char *name)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
struct bgp_filter *filter;
|
|
|
|
struct peer_group *group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
if (! peer->afc[afi][safi])
|
|
|
|
return BGP_ERR_PEER_INACTIVE;
|
|
|
|
|
|
|
|
if (direct != FILTER_IN && direct != FILTER_OUT)
|
|
|
|
return BGP_ERR_INVALID_VALUE;
|
|
|
|
|
|
|
|
if (direct == FILTER_OUT && peer_is_group_member (peer, afi, safi))
|
|
|
|
return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
|
|
|
|
|
|
|
|
filter = &peer->filter[afi][safi];
|
|
|
|
|
|
|
|
if (filter->plist[direct].name)
|
|
|
|
return BGP_ERR_PEER_FILTER_CONFLICT;
|
|
|
|
|
|
|
|
if (filter->dlist[direct].name)
|
|
|
|
free (filter->dlist[direct].name);
|
|
|
|
filter->dlist[direct].name = strdup (name);
|
|
|
|
filter->dlist[direct].alist = access_list_lookup (afi, name);
|
|
|
|
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
2015-05-20 03:03:47 +02:00
|
|
|
{
|
2015-05-20 03:03:52 +02:00
|
|
|
peer_on_policy_change(peer, afi, safi,
|
|
|
|
(direct == FILTER_OUT) ? 1 : 0);
|
2015-05-20 03:03:47 +02:00
|
|
|
return 0;
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
group = peer->group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
filter = &peer->filter[afi][safi];
|
|
|
|
|
|
|
|
if (! peer->af_group[afi][safi])
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (filter->dlist[direct].name)
|
|
|
|
free (filter->dlist[direct].name);
|
|
|
|
filter->dlist[direct].name = strdup (name);
|
|
|
|
filter->dlist[direct].alist = access_list_lookup (afi, name);
|
2015-05-20 03:03:52 +02:00
|
|
|
peer_on_policy_change(peer, afi, safi,
|
|
|
|
(direct == FILTER_OUT) ? 1 : 0);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
peer_distribute_unset (struct peer *peer, afi_t afi, safi_t safi, int direct)
|
|
|
|
{
|
|
|
|
struct bgp_filter *filter;
|
|
|
|
struct bgp_filter *gfilter;
|
|
|
|
struct peer_group *group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
if (! peer->afc[afi][safi])
|
|
|
|
return BGP_ERR_PEER_INACTIVE;
|
|
|
|
|
|
|
|
if (direct != FILTER_IN && direct != FILTER_OUT)
|
|
|
|
return BGP_ERR_INVALID_VALUE;
|
|
|
|
|
|
|
|
if (direct == FILTER_OUT && peer_is_group_member (peer, afi, safi))
|
|
|
|
return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
|
|
|
|
|
|
|
|
filter = &peer->filter[afi][safi];
|
|
|
|
|
|
|
|
/* apply peer-group filter */
|
|
|
|
if (peer->af_group[afi][safi])
|
|
|
|
{
|
|
|
|
gfilter = &peer->group->conf->filter[afi][safi];
|
|
|
|
|
|
|
|
if (gfilter->dlist[direct].name)
|
|
|
|
{
|
|
|
|
if (filter->dlist[direct].name)
|
|
|
|
free (filter->dlist[direct].name);
|
|
|
|
filter->dlist[direct].name = strdup (gfilter->dlist[direct].name);
|
|
|
|
filter->dlist[direct].alist = gfilter->dlist[direct].alist;
|
2015-05-20 03:03:52 +02:00
|
|
|
peer_on_policy_change(peer, afi, safi,
|
|
|
|
(direct == FILTER_OUT) ? 1 : 0);
|
2002-12-13 21:15:29 +01:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (filter->dlist[direct].name)
|
|
|
|
free (filter->dlist[direct].name);
|
|
|
|
filter->dlist[direct].name = NULL;
|
|
|
|
filter->dlist[direct].alist = NULL;
|
|
|
|
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
2015-05-20 03:03:47 +02:00
|
|
|
{
|
2015-05-20 03:03:52 +02:00
|
|
|
peer_on_policy_change(peer, afi, safi,
|
|
|
|
(direct == FILTER_OUT) ? 1 : 0);
|
2015-05-20 03:03:47 +02:00
|
|
|
return 0;
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2015-05-20 03:03:52 +02:00
|
|
|
group = peer->group;
|
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
|
|
|
{
|
|
|
|
filter = &peer->filter[afi][safi];
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2015-05-20 03:03:52 +02:00
|
|
|
if (! peer->af_group[afi][safi])
|
|
|
|
continue;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2015-05-20 03:03:52 +02:00
|
|
|
if (filter->dlist[direct].name)
|
|
|
|
free (filter->dlist[direct].name);
|
|
|
|
filter->dlist[direct].name = NULL;
|
|
|
|
filter->dlist[direct].alist = NULL;
|
|
|
|
peer_on_policy_change(peer, afi, safi,
|
|
|
|
(direct == FILTER_OUT) ? 1 : 0);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Update distribute list. */
|
2005-06-28 14:44:16 +02:00
|
|
|
static void
|
2002-12-13 21:15:29 +01:00
|
|
|
peer_distribute_update (struct access_list *access)
|
|
|
|
{
|
|
|
|
afi_t afi;
|
|
|
|
safi_t safi;
|
|
|
|
int direct;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *mnode, *mnnode;
|
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
struct bgp *bgp;
|
|
|
|
struct peer *peer;
|
|
|
|
struct peer_group *group;
|
|
|
|
struct bgp_filter *filter;
|
|
|
|
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (bm->bgp, mnode, mnnode, bgp))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
2015-05-20 03:03:47 +02:00
|
|
|
if (access->name)
|
|
|
|
update_group_policy_update(bgp, BGP_POLICY_FILTER_LIST, access->name,
|
|
|
|
0, 0);
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
|
|
|
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
|
|
|
|
{
|
|
|
|
filter = &peer->filter[afi][safi];
|
|
|
|
|
|
|
|
for (direct = FILTER_IN; direct < FILTER_MAX; direct++)
|
|
|
|
{
|
|
|
|
if (filter->dlist[direct].name)
|
|
|
|
filter->dlist[direct].alist =
|
|
|
|
access_list_lookup (afi, filter->dlist[direct].name);
|
|
|
|
else
|
|
|
|
filter->dlist[direct].alist = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (bgp->group, node, nnode, group))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
|
|
|
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
|
|
|
|
{
|
|
|
|
filter = &group->conf->filter[afi][safi];
|
|
|
|
|
|
|
|
for (direct = FILTER_IN; direct < FILTER_MAX; direct++)
|
|
|
|
{
|
|
|
|
if (filter->dlist[direct].name)
|
|
|
|
filter->dlist[direct].alist =
|
|
|
|
access_list_lookup (afi, filter->dlist[direct].name);
|
|
|
|
else
|
|
|
|
filter->dlist[direct].alist = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* Set prefix list to the peer. */
|
|
|
|
int
|
|
|
|
peer_prefix_list_set (struct peer *peer, afi_t afi, safi_t safi, int direct,
|
2004-10-13 07:06:08 +02:00
|
|
|
const char *name)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
struct bgp_filter *filter;
|
|
|
|
struct peer_group *group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
if (! peer->afc[afi][safi])
|
|
|
|
return BGP_ERR_PEER_INACTIVE;
|
|
|
|
|
|
|
|
if (direct != FILTER_IN && direct != FILTER_OUT)
|
|
|
|
return BGP_ERR_INVALID_VALUE;
|
|
|
|
|
|
|
|
if (direct == FILTER_OUT && peer_is_group_member (peer, afi, safi))
|
|
|
|
return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
|
|
|
|
|
|
|
|
filter = &peer->filter[afi][safi];
|
|
|
|
|
|
|
|
if (filter->dlist[direct].name)
|
|
|
|
return BGP_ERR_PEER_FILTER_CONFLICT;
|
|
|
|
|
|
|
|
if (filter->plist[direct].name)
|
|
|
|
free (filter->plist[direct].name);
|
|
|
|
filter->plist[direct].name = strdup (name);
|
|
|
|
filter->plist[direct].plist = prefix_list_lookup (afi, name);
|
|
|
|
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
2015-05-20 03:03:47 +02:00
|
|
|
{
|
2015-05-20 03:03:52 +02:00
|
|
|
peer_on_policy_change(peer, afi, safi,
|
|
|
|
(direct == FILTER_OUT) ? 1 : 0);
|
2015-05-20 03:03:47 +02:00
|
|
|
return 0;
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
group = peer->group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
filter = &peer->filter[afi][safi];
|
|
|
|
|
|
|
|
if (! peer->af_group[afi][safi])
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (filter->plist[direct].name)
|
|
|
|
free (filter->plist[direct].name);
|
|
|
|
filter->plist[direct].name = strdup (name);
|
|
|
|
filter->plist[direct].plist = prefix_list_lookup (afi, name);
|
2015-05-20 03:03:52 +02:00
|
|
|
peer_on_policy_change(peer, afi, safi,
|
|
|
|
(direct == FILTER_OUT) ? 1 : 0);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
peer_prefix_list_unset (struct peer *peer, afi_t afi, safi_t safi, int direct)
|
|
|
|
{
|
|
|
|
struct bgp_filter *filter;
|
|
|
|
struct bgp_filter *gfilter;
|
|
|
|
struct peer_group *group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
if (! peer->afc[afi][safi])
|
|
|
|
return BGP_ERR_PEER_INACTIVE;
|
|
|
|
|
|
|
|
if (direct != FILTER_IN && direct != FILTER_OUT)
|
|
|
|
return BGP_ERR_INVALID_VALUE;
|
|
|
|
|
|
|
|
if (direct == FILTER_OUT && peer_is_group_member (peer, afi, safi))
|
|
|
|
return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
|
|
|
|
|
|
|
|
filter = &peer->filter[afi][safi];
|
|
|
|
|
|
|
|
/* apply peer-group filter */
|
|
|
|
if (peer->af_group[afi][safi])
|
|
|
|
{
|
|
|
|
gfilter = &peer->group->conf->filter[afi][safi];
|
|
|
|
|
|
|
|
if (gfilter->plist[direct].name)
|
|
|
|
{
|
|
|
|
if (filter->plist[direct].name)
|
|
|
|
free (filter->plist[direct].name);
|
|
|
|
filter->plist[direct].name = strdup (gfilter->plist[direct].name);
|
|
|
|
filter->plist[direct].plist = gfilter->plist[direct].plist;
|
2015-05-20 03:03:52 +02:00
|
|
|
peer_on_policy_change(peer, afi, safi,
|
|
|
|
(direct == FILTER_OUT) ? 1 : 0);
|
2002-12-13 21:15:29 +01:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (filter->plist[direct].name)
|
|
|
|
free (filter->plist[direct].name);
|
|
|
|
filter->plist[direct].name = NULL;
|
|
|
|
filter->plist[direct].plist = NULL;
|
|
|
|
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
2015-05-20 03:03:47 +02:00
|
|
|
{
|
2015-05-20 03:03:52 +02:00
|
|
|
peer_on_policy_change(peer, afi, safi,
|
|
|
|
(direct == FILTER_OUT) ? 1 : 0);
|
2015-05-20 03:03:47 +02:00
|
|
|
return 0;
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
group = peer->group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
filter = &peer->filter[afi][safi];
|
|
|
|
|
|
|
|
if (! peer->af_group[afi][safi])
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (filter->plist[direct].name)
|
|
|
|
free (filter->plist[direct].name);
|
|
|
|
filter->plist[direct].name = NULL;
|
|
|
|
filter->plist[direct].plist = NULL;
|
2015-05-20 03:03:52 +02:00
|
|
|
peer_on_policy_change(peer, afi, safi,
|
|
|
|
(direct == FILTER_OUT) ? 1 : 0);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Update prefix-list list. */
|
2005-06-28 14:44:16 +02:00
|
|
|
static void
|
2002-12-13 21:15:29 +01:00
|
|
|
peer_prefix_list_update (struct prefix_list *plist)
|
|
|
|
{
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *mnode, *mnnode;
|
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
struct bgp *bgp;
|
|
|
|
struct peer *peer;
|
|
|
|
struct peer_group *group;
|
|
|
|
struct bgp_filter *filter;
|
|
|
|
afi_t afi;
|
|
|
|
safi_t safi;
|
|
|
|
int direct;
|
|
|
|
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (bm->bgp, mnode, mnnode, bgp))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
2015-05-20 03:03:47 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Update the prefix-list on update groups.
|
|
|
|
*/
|
|
|
|
update_group_policy_update(bgp, BGP_POLICY_PREFIX_LIST,
|
|
|
|
plist ? plist->name : NULL, 0, 0);
|
|
|
|
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
|
|
|
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
|
|
|
|
{
|
|
|
|
filter = &peer->filter[afi][safi];
|
|
|
|
|
|
|
|
for (direct = FILTER_IN; direct < FILTER_MAX; direct++)
|
|
|
|
{
|
|
|
|
if (filter->plist[direct].name)
|
|
|
|
filter->plist[direct].plist =
|
|
|
|
prefix_list_lookup (afi, filter->plist[direct].name);
|
|
|
|
else
|
|
|
|
filter->plist[direct].plist = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (bgp->group, node, nnode, group))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
|
|
|
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
|
|
|
|
{
|
|
|
|
filter = &group->conf->filter[afi][safi];
|
|
|
|
|
|
|
|
for (direct = FILTER_IN; direct < FILTER_MAX; direct++)
|
|
|
|
{
|
|
|
|
if (filter->plist[direct].name)
|
|
|
|
filter->plist[direct].plist =
|
|
|
|
prefix_list_lookup (afi, filter->plist[direct].name);
|
|
|
|
else
|
|
|
|
filter->plist[direct].plist = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
int
|
|
|
|
peer_aslist_set (struct peer *peer, afi_t afi, safi_t safi, int direct,
|
2004-10-13 07:06:08 +02:00
|
|
|
const char *name)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
struct bgp_filter *filter;
|
|
|
|
struct peer_group *group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
if (! peer->afc[afi][safi])
|
|
|
|
return BGP_ERR_PEER_INACTIVE;
|
|
|
|
|
|
|
|
if (direct != FILTER_IN && direct != FILTER_OUT)
|
|
|
|
return BGP_ERR_INVALID_VALUE;
|
|
|
|
|
|
|
|
if (direct == FILTER_OUT && peer_is_group_member (peer, afi, safi))
|
|
|
|
return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
|
|
|
|
|
|
|
|
filter = &peer->filter[afi][safi];
|
|
|
|
|
|
|
|
if (filter->aslist[direct].name)
|
|
|
|
free (filter->aslist[direct].name);
|
|
|
|
filter->aslist[direct].name = strdup (name);
|
|
|
|
filter->aslist[direct].aslist = as_list_lookup (name);
|
|
|
|
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
2015-05-20 03:03:47 +02:00
|
|
|
{
|
2015-05-20 03:03:52 +02:00
|
|
|
peer_on_policy_change(peer, afi, safi,
|
|
|
|
(direct == FILTER_OUT) ? 1 : 0);
|
2015-05-20 03:03:47 +02:00
|
|
|
return 0;
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
group = peer->group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
filter = &peer->filter[afi][safi];
|
|
|
|
|
|
|
|
if (! peer->af_group[afi][safi])
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (filter->aslist[direct].name)
|
|
|
|
free (filter->aslist[direct].name);
|
|
|
|
filter->aslist[direct].name = strdup (name);
|
|
|
|
filter->aslist[direct].aslist = as_list_lookup (name);
|
2015-05-20 03:03:52 +02:00
|
|
|
peer_on_policy_change(peer, afi, safi,
|
|
|
|
(direct == FILTER_OUT) ? 1 : 0);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
peer_aslist_unset (struct peer *peer,afi_t afi, safi_t safi, int direct)
|
|
|
|
{
|
|
|
|
struct bgp_filter *filter;
|
|
|
|
struct bgp_filter *gfilter;
|
|
|
|
struct peer_group *group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
if (! peer->afc[afi][safi])
|
|
|
|
return BGP_ERR_PEER_INACTIVE;
|
|
|
|
|
2005-05-25 23:00:28 +02:00
|
|
|
if (direct != FILTER_IN && direct != FILTER_OUT)
|
2002-12-13 21:15:29 +01:00
|
|
|
return BGP_ERR_INVALID_VALUE;
|
|
|
|
|
2005-05-25 23:00:28 +02:00
|
|
|
if (direct == FILTER_OUT && peer_is_group_member (peer, afi, safi))
|
2002-12-13 21:15:29 +01:00
|
|
|
return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
|
|
|
|
|
|
|
|
filter = &peer->filter[afi][safi];
|
|
|
|
|
|
|
|
/* apply peer-group filter */
|
|
|
|
if (peer->af_group[afi][safi])
|
|
|
|
{
|
|
|
|
gfilter = &peer->group->conf->filter[afi][safi];
|
|
|
|
|
|
|
|
if (gfilter->aslist[direct].name)
|
|
|
|
{
|
|
|
|
if (filter->aslist[direct].name)
|
|
|
|
free (filter->aslist[direct].name);
|
|
|
|
filter->aslist[direct].name = strdup (gfilter->aslist[direct].name);
|
|
|
|
filter->aslist[direct].aslist = gfilter->aslist[direct].aslist;
|
2015-05-20 03:03:52 +02:00
|
|
|
peer_on_policy_change(peer, afi, safi,
|
|
|
|
(direct == FILTER_OUT) ? 1 : 0);
|
2002-12-13 21:15:29 +01:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (filter->aslist[direct].name)
|
|
|
|
free (filter->aslist[direct].name);
|
|
|
|
filter->aslist[direct].name = NULL;
|
|
|
|
filter->aslist[direct].aslist = NULL;
|
|
|
|
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
2015-05-20 03:03:47 +02:00
|
|
|
{
|
2015-05-20 03:03:52 +02:00
|
|
|
peer_on_policy_change(peer, afi, safi,
|
|
|
|
(direct == FILTER_OUT) ? 1 : 0);
|
2015-05-20 03:03:47 +02:00
|
|
|
return 0;
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
group = peer->group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
filter = &peer->filter[afi][safi];
|
|
|
|
|
|
|
|
if (! peer->af_group[afi][safi])
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (filter->aslist[direct].name)
|
|
|
|
free (filter->aslist[direct].name);
|
|
|
|
filter->aslist[direct].name = NULL;
|
|
|
|
filter->aslist[direct].aslist = NULL;
|
2015-05-20 03:03:52 +02:00
|
|
|
peer_on_policy_change(peer, afi, safi,
|
|
|
|
(direct == FILTER_OUT) ? 1 : 0);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2005-06-28 14:44:16 +02:00
|
|
|
static void
|
2015-05-20 03:12:17 +02:00
|
|
|
peer_aslist_update (const char *aslist_name)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
afi_t afi;
|
|
|
|
safi_t safi;
|
|
|
|
int direct;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *mnode, *mnnode;
|
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
struct bgp *bgp;
|
|
|
|
struct peer *peer;
|
|
|
|
struct peer_group *group;
|
|
|
|
struct bgp_filter *filter;
|
|
|
|
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (bm->bgp, mnode, mnnode, bgp))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
2015-05-20 03:03:47 +02:00
|
|
|
update_group_policy_update(bgp, BGP_POLICY_FILTER_LIST, aslist_name,
|
|
|
|
0, 0);
|
|
|
|
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
|
|
|
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
|
|
|
|
{
|
|
|
|
filter = &peer->filter[afi][safi];
|
|
|
|
|
|
|
|
for (direct = FILTER_IN; direct < FILTER_MAX; direct++)
|
|
|
|
{
|
|
|
|
if (filter->aslist[direct].name)
|
|
|
|
filter->aslist[direct].aslist =
|
|
|
|
as_list_lookup (filter->aslist[direct].name);
|
|
|
|
else
|
|
|
|
filter->aslist[direct].aslist = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (bgp->group, node, nnode, group))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
for (afi = AFI_IP; afi < AFI_MAX; afi++)
|
|
|
|
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
|
|
|
|
{
|
|
|
|
filter = &group->conf->filter[afi][safi];
|
|
|
|
|
|
|
|
for (direct = FILTER_IN; direct < FILTER_MAX; direct++)
|
|
|
|
{
|
|
|
|
if (filter->aslist[direct].name)
|
|
|
|
filter->aslist[direct].aslist =
|
|
|
|
as_list_lookup (filter->aslist[direct].name);
|
|
|
|
else
|
|
|
|
filter->aslist[direct].aslist = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-05-20 03:03:47 +02:00
|
|
|
|
2015-05-20 02:40:45 +02:00
|
|
|
static void
|
|
|
|
peer_aslist_add (char *aslist_name)
|
|
|
|
{
|
|
|
|
peer_aslist_update (aslist_name);
|
|
|
|
route_map_notify_dependencies((char *)aslist_name, RMAP_EVENT_ASLIST_ADDED);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2015-05-20 03:12:17 +02:00
|
|
|
peer_aslist_del (const char *aslist_name)
|
2015-05-20 02:40:45 +02:00
|
|
|
{
|
|
|
|
peer_aslist_update (aslist_name);
|
2015-05-20 03:12:17 +02:00
|
|
|
route_map_notify_dependencies(aslist_name, RMAP_EVENT_ASLIST_DELETED);
|
2015-05-20 02:40:45 +02:00
|
|
|
}
|
|
|
|
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
int
|
|
|
|
peer_route_map_set (struct peer *peer, afi_t afi, safi_t safi, int direct,
|
2004-10-13 07:06:08 +02:00
|
|
|
const char *name)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
struct bgp_filter *filter;
|
|
|
|
struct peer_group *group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
if (! peer->afc[afi][safi])
|
|
|
|
return BGP_ERR_PEER_INACTIVE;
|
|
|
|
|
2004-09-13 Jose Luis Rubio <jrubio@dit.upm.es>
(at Technical University of Madrid as part of Euro6ix Project)
Enhanced Route Server functionality and Route-Maps:
* bgpd/bgpd.h: Modified 'struct peer' and 'struct bgp_filter' to
support rs-clients. A 'struct bgp_table *rib' has been added to the
first (to mantain a separated RIB for each rs-client) and two new
route-maps have been added to the last (for import/export policies).
Added the following #defines: RMAP_{IN|OUT|IMPORT|EXPORT|MAX},
PEER_RMAP_TYPE_{IMPORT|EXPORT} and BGP_CLEAR_SOFT_RSCLIENT.
* bgpd/bgpd.c: Modified the functions that create/delete/etc peers in
order to consider the new fields included in 'struct peer' for
supporting rs-clients, i.e. the import/export route-maps and the
'struct bgp_table'.
* bgpd/bgp_route.{ch}: Modified several functions related with
receiving/sending announces in order to support the new Route Server
capabilities.
Function 'bgp_process' has been reorganized, creating an auxiliar
function for best path selection ('bgp_best_selection').
Modified 'bgp_show' and 'bgp_show_route' for displaying information
about any RIB (and not only the main bgp RIB).
Added commands for displaying information about RS-clients RIBs:
'show bgp rsclient (A.B.C.D|X:X::X:X)', 'show bgp rsclient
(A.B.C.D|X:X::X:X) X:X::X:X/M', etc
* bgpd/bgp_table.{ch}: The structure 'struct bgp_table' now has two
new fields: type (which can take the values BGP_TABLE_{MAIN|RSCLIENT})
and 'void *owner' which points to 'struct bgp' or 'struct peer' which
owns the table.
When creating a new bgp_table by default 'type=BGP_TABLE_MAIN' is set.
* bgpd/bgp_vty.c: The commands 'neighbor ... route-server-client' and
'no neighbor ... route-server-client' now not only set/unset the flag
PEER_FLAG_RSERVER_CLIENT, but they create/destroy the 'struct
bgp_table' of the peer. Special actions are taken for peer_groups.
Command 'neighbor ... route-map WORD (in|out)' now also supports two
new kinds of route-map: 'import' and 'export'.
Added commands 'clear bgp * rsclient', etc. These commands allow a new
kind of soft_reconfig which affects only the RIB of the specified
RS-client.
Added commands 'show bgp rsclient summary', etc which display a
summary of the rs-clients configured for the corresponding address
family.
* bgpd/bgp_routemap.c: A new match statement is available,
'match peer (A.B.C.D|X:X::X:X)'. This statement can only be used in
import/export route-maps, and it matches when the peer who announces
(when used in an import route-map) or is going to receive (when used
in an export route-map) the route is the same than the one specified
in the statement.
For peer-groups the statement matches if the specified peer is member
of the peer-group.
A special version of the command, 'match peer local', matches with
routes originated by the Route Server (defined with 'network ...',
redistributed routes and default-originate).
* lib/routemap.{ch}: Added a new clause 'call NAME' for use in
route-maps. It jumps into the specified route-map and when it returns
the first route-map ends if the called RM returns DENY_MATCH, or
continues in other case.
2004-09-13 07:12:46 +02:00
|
|
|
if (direct != RMAP_IN && direct != RMAP_OUT &&
|
|
|
|
direct != RMAP_IMPORT && direct != RMAP_EXPORT)
|
2002-12-13 21:15:29 +01:00
|
|
|
return BGP_ERR_INVALID_VALUE;
|
|
|
|
|
2004-09-13 Jose Luis Rubio <jrubio@dit.upm.es>
(at Technical University of Madrid as part of Euro6ix Project)
Enhanced Route Server functionality and Route-Maps:
* bgpd/bgpd.h: Modified 'struct peer' and 'struct bgp_filter' to
support rs-clients. A 'struct bgp_table *rib' has been added to the
first (to mantain a separated RIB for each rs-client) and two new
route-maps have been added to the last (for import/export policies).
Added the following #defines: RMAP_{IN|OUT|IMPORT|EXPORT|MAX},
PEER_RMAP_TYPE_{IMPORT|EXPORT} and BGP_CLEAR_SOFT_RSCLIENT.
* bgpd/bgpd.c: Modified the functions that create/delete/etc peers in
order to consider the new fields included in 'struct peer' for
supporting rs-clients, i.e. the import/export route-maps and the
'struct bgp_table'.
* bgpd/bgp_route.{ch}: Modified several functions related with
receiving/sending announces in order to support the new Route Server
capabilities.
Function 'bgp_process' has been reorganized, creating an auxiliar
function for best path selection ('bgp_best_selection').
Modified 'bgp_show' and 'bgp_show_route' for displaying information
about any RIB (and not only the main bgp RIB).
Added commands for displaying information about RS-clients RIBs:
'show bgp rsclient (A.B.C.D|X:X::X:X)', 'show bgp rsclient
(A.B.C.D|X:X::X:X) X:X::X:X/M', etc
* bgpd/bgp_table.{ch}: The structure 'struct bgp_table' now has two
new fields: type (which can take the values BGP_TABLE_{MAIN|RSCLIENT})
and 'void *owner' which points to 'struct bgp' or 'struct peer' which
owns the table.
When creating a new bgp_table by default 'type=BGP_TABLE_MAIN' is set.
* bgpd/bgp_vty.c: The commands 'neighbor ... route-server-client' and
'no neighbor ... route-server-client' now not only set/unset the flag
PEER_FLAG_RSERVER_CLIENT, but they create/destroy the 'struct
bgp_table' of the peer. Special actions are taken for peer_groups.
Command 'neighbor ... route-map WORD (in|out)' now also supports two
new kinds of route-map: 'import' and 'export'.
Added commands 'clear bgp * rsclient', etc. These commands allow a new
kind of soft_reconfig which affects only the RIB of the specified
RS-client.
Added commands 'show bgp rsclient summary', etc which display a
summary of the rs-clients configured for the corresponding address
family.
* bgpd/bgp_routemap.c: A new match statement is available,
'match peer (A.B.C.D|X:X::X:X)'. This statement can only be used in
import/export route-maps, and it matches when the peer who announces
(when used in an import route-map) or is going to receive (when used
in an export route-map) the route is the same than the one specified
in the statement.
For peer-groups the statement matches if the specified peer is member
of the peer-group.
A special version of the command, 'match peer local', matches with
routes originated by the Route Server (defined with 'network ...',
redistributed routes and default-originate).
* lib/routemap.{ch}: Added a new clause 'call NAME' for use in
route-maps. It jumps into the specified route-map and when it returns
the first route-map ends if the called RM returns DENY_MATCH, or
continues in other case.
2004-09-13 07:12:46 +02:00
|
|
|
if ( (direct == RMAP_OUT || direct == RMAP_IMPORT)
|
|
|
|
&& peer_is_group_member (peer, afi, safi))
|
2002-12-13 21:15:29 +01:00
|
|
|
return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
|
|
|
|
|
|
|
|
filter = &peer->filter[afi][safi];
|
|
|
|
|
|
|
|
if (filter->map[direct].name)
|
|
|
|
free (filter->map[direct].name);
|
2015-05-20 02:40:45 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
filter->map[direct].name = strdup (name);
|
|
|
|
filter->map[direct].map = route_map_lookup_by_name (name);
|
|
|
|
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
2015-05-20 02:40:45 +02:00
|
|
|
{
|
2015-05-20 03:03:52 +02:00
|
|
|
peer_on_policy_change(peer, afi, safi,
|
|
|
|
(direct == RMAP_OUT) ? 1 : 0);
|
2015-05-20 02:40:45 +02:00
|
|
|
return 0;
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
group = peer->group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
filter = &peer->filter[afi][safi];
|
|
|
|
|
|
|
|
if (! peer->af_group[afi][safi])
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (filter->map[direct].name)
|
|
|
|
free (filter->map[direct].name);
|
|
|
|
filter->map[direct].name = strdup (name);
|
|
|
|
filter->map[direct].map = route_map_lookup_by_name (name);
|
2015-05-20 03:03:52 +02:00
|
|
|
peer_on_policy_change(peer, afi, safi,
|
|
|
|
(direct == RMAP_OUT) ? 1 : 0);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Unset route-map from the peer. */
|
|
|
|
int
|
|
|
|
peer_route_map_unset (struct peer *peer, afi_t afi, safi_t safi, int direct)
|
|
|
|
{
|
|
|
|
struct bgp_filter *filter;
|
|
|
|
struct bgp_filter *gfilter;
|
|
|
|
struct peer_group *group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
if (! peer->afc[afi][safi])
|
|
|
|
return BGP_ERR_PEER_INACTIVE;
|
|
|
|
|
2005-05-25 23:00:28 +02:00
|
|
|
if (direct != RMAP_IN && direct != RMAP_OUT &&
|
|
|
|
direct != RMAP_IMPORT && direct != RMAP_EXPORT)
|
2002-12-13 21:15:29 +01:00
|
|
|
return BGP_ERR_INVALID_VALUE;
|
|
|
|
|
2005-05-25 23:00:28 +02:00
|
|
|
if ( (direct == RMAP_OUT || direct == RMAP_IMPORT)
|
|
|
|
&& peer_is_group_member (peer, afi, safi))
|
2002-12-13 21:15:29 +01:00
|
|
|
return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
|
|
|
|
|
|
|
|
filter = &peer->filter[afi][safi];
|
|
|
|
|
|
|
|
/* apply peer-group filter */
|
|
|
|
if (peer->af_group[afi][safi])
|
|
|
|
{
|
|
|
|
gfilter = &peer->group->conf->filter[afi][safi];
|
|
|
|
|
|
|
|
if (gfilter->map[direct].name)
|
|
|
|
{
|
|
|
|
if (filter->map[direct].name)
|
|
|
|
free (filter->map[direct].name);
|
|
|
|
filter->map[direct].name = strdup (gfilter->map[direct].name);
|
|
|
|
filter->map[direct].map = gfilter->map[direct].map;
|
2015-05-20 03:03:52 +02:00
|
|
|
peer_on_policy_change(peer, afi, safi,
|
|
|
|
(direct == RMAP_OUT) ? 1 : 0);
|
2002-12-13 21:15:29 +01:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (filter->map[direct].name)
|
|
|
|
free (filter->map[direct].name);
|
|
|
|
filter->map[direct].name = NULL;
|
|
|
|
filter->map[direct].map = NULL;
|
|
|
|
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
2015-05-20 02:40:45 +02:00
|
|
|
{
|
2015-05-20 03:03:52 +02:00
|
|
|
peer_on_policy_change(peer, afi, safi,
|
|
|
|
(direct == RMAP_OUT) ? 1 : 0);
|
2015-05-20 02:40:45 +02:00
|
|
|
return 0;
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
group = peer->group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
filter = &peer->filter[afi][safi];
|
|
|
|
|
|
|
|
if (! peer->af_group[afi][safi])
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (filter->map[direct].name)
|
|
|
|
free (filter->map[direct].name);
|
|
|
|
filter->map[direct].name = NULL;
|
|
|
|
filter->map[direct].map = NULL;
|
2015-05-20 03:03:52 +02:00
|
|
|
peer_on_policy_change(peer, afi, safi,
|
|
|
|
(direct == RMAP_OUT) ? 1 : 0);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* Set unsuppress-map to the peer. */
|
|
|
|
int
|
2004-10-13 07:06:08 +02:00
|
|
|
peer_unsuppress_map_set (struct peer *peer, afi_t afi, safi_t safi,
|
|
|
|
const char *name)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
struct bgp_filter *filter;
|
|
|
|
struct peer_group *group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
if (! peer->afc[afi][safi])
|
|
|
|
return BGP_ERR_PEER_INACTIVE;
|
|
|
|
|
|
|
|
if (peer_is_group_member (peer, afi, safi))
|
|
|
|
return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
|
|
|
|
|
|
|
|
filter = &peer->filter[afi][safi];
|
|
|
|
|
|
|
|
if (filter->usmap.name)
|
|
|
|
free (filter->usmap.name);
|
|
|
|
|
|
|
|
filter->usmap.name = strdup (name);
|
|
|
|
filter->usmap.map = route_map_lookup_by_name (name);
|
|
|
|
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
2015-05-20 02:40:45 +02:00
|
|
|
{
|
2015-05-20 03:03:52 +02:00
|
|
|
peer_on_policy_change(peer, afi, safi, 1);
|
2015-05-20 02:40:45 +02:00
|
|
|
return 0;
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
group = peer->group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
filter = &peer->filter[afi][safi];
|
|
|
|
|
|
|
|
if (! peer->af_group[afi][safi])
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (filter->usmap.name)
|
|
|
|
free (filter->usmap.name);
|
|
|
|
filter->usmap.name = strdup (name);
|
|
|
|
filter->usmap.map = route_map_lookup_by_name (name);
|
2015-05-20 03:03:52 +02:00
|
|
|
peer_on_policy_change(peer, afi, safi, 1);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Unset route-map from the peer. */
|
|
|
|
int
|
|
|
|
peer_unsuppress_map_unset (struct peer *peer, afi_t afi, safi_t safi)
|
|
|
|
{
|
|
|
|
struct bgp_filter *filter;
|
|
|
|
struct peer_group *group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
if (! peer->afc[afi][safi])
|
|
|
|
return BGP_ERR_PEER_INACTIVE;
|
|
|
|
|
|
|
|
if (peer_is_group_member (peer, afi, safi))
|
|
|
|
return BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER;
|
|
|
|
|
|
|
|
filter = &peer->filter[afi][safi];
|
|
|
|
|
|
|
|
if (filter->usmap.name)
|
|
|
|
free (filter->usmap.name);
|
|
|
|
filter->usmap.name = NULL;
|
|
|
|
filter->usmap.map = NULL;
|
|
|
|
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
2015-05-20 02:40:45 +02:00
|
|
|
{
|
2015-05-20 03:03:52 +02:00
|
|
|
peer_on_policy_change(peer, afi, safi, 1);
|
2015-05-20 02:40:45 +02:00
|
|
|
return 0;
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
group = peer->group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
filter = &peer->filter[afi][safi];
|
|
|
|
|
|
|
|
if (! peer->af_group[afi][safi])
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (filter->usmap.name)
|
|
|
|
free (filter->usmap.name);
|
|
|
|
filter->usmap.name = NULL;
|
|
|
|
filter->usmap.map = NULL;
|
2015-05-20 03:03:52 +02:00
|
|
|
peer_on_policy_change(peer, afi, safi, 1);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
int
|
|
|
|
peer_maximum_prefix_set (struct peer *peer, afi_t afi, safi_t safi,
|
2005-02-01 21:57:17 +01:00
|
|
|
u_int32_t max, u_char threshold,
|
|
|
|
int warning, u_int16_t restart)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
struct peer_group *group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
if (! peer->afc[afi][safi])
|
|
|
|
return BGP_ERR_PEER_INACTIVE;
|
|
|
|
|
|
|
|
SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX);
|
|
|
|
peer->pmax[afi][safi] = max;
|
2004-05-20 11:19:34 +02:00
|
|
|
peer->pmax_threshold[afi][safi] = threshold;
|
2005-02-01 21:57:17 +01:00
|
|
|
peer->pmax_restart[afi][safi] = restart;
|
2002-12-13 21:15:29 +01:00
|
|
|
if (warning)
|
|
|
|
SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING);
|
|
|
|
else
|
|
|
|
UNSET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING);
|
|
|
|
|
2015-05-20 02:47:21 +02:00
|
|
|
if (CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
2015-05-20 02:47:21 +02:00
|
|
|
group = peer->group;
|
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
|
|
|
{
|
|
|
|
if (! peer->af_group[afi][safi])
|
|
|
|
continue;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2015-05-20 02:47:21 +02:00
|
|
|
SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX);
|
|
|
|
peer->pmax[afi][safi] = max;
|
|
|
|
peer->pmax_threshold[afi][safi] = threshold;
|
|
|
|
peer->pmax_restart[afi][safi] = restart;
|
|
|
|
if (warning)
|
|
|
|
SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING);
|
|
|
|
else
|
|
|
|
UNSET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING);
|
|
|
|
|
|
|
|
if ((peer->status == Established) && (peer->afc[afi][safi]))
|
|
|
|
bgp_maximum_prefix_overflow (peer, afi, safi, 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ((peer->status == Established) && (peer->afc[afi][safi]))
|
|
|
|
bgp_maximum_prefix_overflow (peer, afi, safi, 1);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
2015-05-20 02:47:21 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
peer_maximum_prefix_unset (struct peer *peer, afi_t afi, safi_t safi)
|
|
|
|
{
|
|
|
|
struct peer_group *group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
if (! peer->afc[afi][safi])
|
|
|
|
return BGP_ERR_PEER_INACTIVE;
|
|
|
|
|
|
|
|
/* apply peer-group config */
|
|
|
|
if (peer->af_group[afi][safi])
|
|
|
|
{
|
|
|
|
if (CHECK_FLAG (peer->group->conf->af_flags[afi][safi],
|
|
|
|
PEER_FLAG_MAX_PREFIX))
|
|
|
|
SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX);
|
|
|
|
else
|
|
|
|
UNSET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX);
|
|
|
|
|
|
|
|
if (CHECK_FLAG (peer->group->conf->af_flags[afi][safi],
|
|
|
|
PEER_FLAG_MAX_PREFIX_WARNING))
|
|
|
|
SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING);
|
|
|
|
else
|
|
|
|
UNSET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING);
|
|
|
|
|
|
|
|
peer->pmax[afi][safi] = peer->group->conf->pmax[afi][safi];
|
2004-05-20 11:19:34 +02:00
|
|
|
peer->pmax_threshold[afi][safi] = peer->group->conf->pmax_threshold[afi][safi];
|
2005-02-01 21:57:17 +01:00
|
|
|
peer->pmax_restart[afi][safi] = peer->group->conf->pmax_restart[afi][safi];
|
2002-12-13 21:15:29 +01:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
UNSET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX);
|
|
|
|
UNSET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING);
|
|
|
|
peer->pmax[afi][safi] = 0;
|
2005-02-01 21:57:17 +01:00
|
|
|
peer->pmax_threshold[afi][safi] = 0;
|
|
|
|
peer->pmax_restart[afi][safi] = 0;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
group = peer->group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
if (! peer->af_group[afi][safi])
|
|
|
|
continue;
|
|
|
|
|
|
|
|
UNSET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX);
|
|
|
|
UNSET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING);
|
|
|
|
peer->pmax[afi][safi] = 0;
|
2005-02-01 21:57:17 +01:00
|
|
|
peer->pmax_threshold[afi][safi] = 0;
|
|
|
|
peer->pmax_restart[afi][safi] = 0;
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
2014-05-19 23:15:02 +02:00
|
|
|
|
|
|
|
static int is_ebgp_multihop_configured (struct peer *peer)
|
|
|
|
{
|
|
|
|
struct peer_group *group;
|
|
|
|
struct listnode *node, *nnode;
|
|
|
|
struct peer *peer1;
|
|
|
|
|
|
|
|
if (CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
|
|
|
{
|
|
|
|
group = peer->group;
|
2013-09-12 05:37:07 +02:00
|
|
|
if ((peer_sort(peer) != BGP_PEER_IBGP) &&
|
|
|
|
(group->conf->ttl != 1))
|
2014-05-19 23:15:02 +02:00
|
|
|
return 1;
|
|
|
|
|
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer1))
|
|
|
|
{
|
2013-09-12 05:37:07 +02:00
|
|
|
if ((peer_sort (peer1) != BGP_PEER_IBGP) &&
|
|
|
|
(peer1->ttl != 1))
|
2014-05-19 23:15:02 +02:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2013-09-12 05:37:07 +02:00
|
|
|
if ((peer_sort(peer) != BGP_PEER_IBGP) &&
|
|
|
|
(peer->ttl != 1))
|
2014-05-19 23:15:02 +02:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
bgpd: RFC 5082 Generalized TTL Security Mechanism support
* bgpd: Add support for RFC 5082 GTSM, which allows the TTL field to be used
to verify that incoming packets have been sent from neighbours no more
than X IP hops away. In other words, this allows packets that were sent from
further away (i.e. not by the neighbour with known distance, and so possibly
a miscreant) to be filtered out.
* lib/sockunion.{c,h}: (sockopt_minttl) new function, to set a minimum TTL
using the IP_MINTTL socket opt.
* bgpd.h: (BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK) define for command
error for minttl.
(struct peer) add a config variable, to store the configured minttl.
(peer_ttl_security_hops_{set,unset}) configuration handlers
* bgpd.c: (peer_group_get) init gtsm_hops
(peer_ebgp_multihop_{un,}set) check for conflicts with GTSM. Multihop and
GTSM can't both be active for a peer at the same time.
(peer_ttl_security_hops_set) set minttl, taking care to avoid conflicts with
ebgp_multihop.
(bgp_config_write_peer) write out minttl as "neighbor .. ttl-security hops X".
* bgp_vty.c: (bgp_vty_return) message for
BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
(peer_ebgp_multihop_{un,}set_vty)
* bgp_network.c: (bgp_accept) set minttl on accepted sockets if appropriate.
(bgp_connect) ditto for outbound.
2011-03-23 16:33:17 +01:00
|
|
|
/* Set # of hops between us and BGP peer. */
|
|
|
|
int
|
|
|
|
peer_ttl_security_hops_set (struct peer *peer, int gtsm_hops)
|
|
|
|
{
|
|
|
|
struct peer_group *group;
|
|
|
|
struct listnode *node, *nnode;
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
zlog_debug ("peer_ttl_security_hops_set: set gtsm_hops to %d for %s", gtsm_hops, peer->host);
|
|
|
|
|
|
|
|
/* We cannot configure ttl-security hops when ebgp-multihop is already
|
|
|
|
set. For non peer-groups, the check is simple. For peer-groups, it's
|
|
|
|
slightly messy, because we need to check both the peer-group structure
|
|
|
|
and all peer-group members for any trace of ebgp-multihop configuration
|
|
|
|
before actually applying the ttl-security rules. Cisco really made a
|
|
|
|
mess of this configuration parameter, and OpenBGPD got it right.
|
|
|
|
*/
|
2015-05-20 03:45:53 +02:00
|
|
|
|
|
|
|
if ((peer->gtsm_hops == 0) && (peer->sort != BGP_PEER_IBGP))
|
2014-05-19 23:15:02 +02:00
|
|
|
{
|
|
|
|
if (is_ebgp_multihop_configured (peer))
|
|
|
|
return BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK;
|
bgpd: RFC 5082 Generalized TTL Security Mechanism support
* bgpd: Add support for RFC 5082 GTSM, which allows the TTL field to be used
to verify that incoming packets have been sent from neighbours no more
than X IP hops away. In other words, this allows packets that were sent from
further away (i.e. not by the neighbour with known distance, and so possibly
a miscreant) to be filtered out.
* lib/sockunion.{c,h}: (sockopt_minttl) new function, to set a minimum TTL
using the IP_MINTTL socket opt.
* bgpd.h: (BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK) define for command
error for minttl.
(struct peer) add a config variable, to store the configured minttl.
(peer_ttl_security_hops_{set,unset}) configuration handlers
* bgpd.c: (peer_group_get) init gtsm_hops
(peer_ebgp_multihop_{un,}set) check for conflicts with GTSM. Multihop and
GTSM can't both be active for a peer at the same time.
(peer_ttl_security_hops_set) set minttl, taking care to avoid conflicts with
ebgp_multihop.
(bgp_config_write_peer) write out minttl as "neighbor .. ttl-security hops X".
* bgp_vty.c: (bgp_vty_return) message for
BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
(peer_ebgp_multihop_{un,}set_vty)
* bgp_network.c: (bgp_accept) set minttl on accepted sockets if appropriate.
(bgp_connect) ditto for outbound.
2011-03-23 16:33:17 +01:00
|
|
|
|
2015-05-20 03:45:53 +02:00
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
|
|
|
{
|
|
|
|
peer->gtsm_hops = gtsm_hops;
|
bgpd: RFC 5082 Generalized TTL Security Mechanism support
* bgpd: Add support for RFC 5082 GTSM, which allows the TTL field to be used
to verify that incoming packets have been sent from neighbours no more
than X IP hops away. In other words, this allows packets that were sent from
further away (i.e. not by the neighbour with known distance, and so possibly
a miscreant) to be filtered out.
* lib/sockunion.{c,h}: (sockopt_minttl) new function, to set a minimum TTL
using the IP_MINTTL socket opt.
* bgpd.h: (BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK) define for command
error for minttl.
(struct peer) add a config variable, to store the configured minttl.
(peer_ttl_security_hops_{set,unset}) configuration handlers
* bgpd.c: (peer_group_get) init gtsm_hops
(peer_ebgp_multihop_{un,}set) check for conflicts with GTSM. Multihop and
GTSM can't both be active for a peer at the same time.
(peer_ttl_security_hops_set) set minttl, taking care to avoid conflicts with
ebgp_multihop.
(bgp_config_write_peer) write out minttl as "neighbor .. ttl-security hops X".
* bgp_vty.c: (bgp_vty_return) message for
BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
(peer_ebgp_multihop_{un,}set_vty)
* bgp_network.c: (bgp_accept) set minttl on accepted sockets if appropriate.
(bgp_connect) ditto for outbound.
2011-03-23 16:33:17 +01:00
|
|
|
|
2015-05-20 03:45:53 +02:00
|
|
|
/* Calling ebgp multihop also resets the session.
|
|
|
|
* On restart, NHT will get setup correctly as will the
|
|
|
|
* min & max ttls on the socket. The return value is
|
|
|
|
* irrelevant.
|
|
|
|
*/
|
|
|
|
ret = peer_ebgp_multihop_set (peer, MAXTTL);
|
|
|
|
|
|
|
|
if (ret != 0)
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
group = peer->group;
|
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
|
|
|
{
|
|
|
|
peer->gtsm_hops = group->conf->gtsm_hops;
|
|
|
|
|
|
|
|
/* Calling ebgp multihop also resets the session.
|
|
|
|
* On restart, NHT will get setup correctly as will the
|
|
|
|
* min & max ttls on the socket. The return value is
|
|
|
|
* irrelevant.
|
|
|
|
*/
|
|
|
|
ret = peer_ebgp_multihop_set (peer, MAXTTL);
|
|
|
|
}
|
|
|
|
}
|
bgpd: RFC 5082 Generalized TTL Security Mechanism support
* bgpd: Add support for RFC 5082 GTSM, which allows the TTL field to be used
to verify that incoming packets have been sent from neighbours no more
than X IP hops away. In other words, this allows packets that were sent from
further away (i.e. not by the neighbour with known distance, and so possibly
a miscreant) to be filtered out.
* lib/sockunion.{c,h}: (sockopt_minttl) new function, to set a minimum TTL
using the IP_MINTTL socket opt.
* bgpd.h: (BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK) define for command
error for minttl.
(struct peer) add a config variable, to store the configured minttl.
(peer_ttl_security_hops_{set,unset}) configuration handlers
* bgpd.c: (peer_group_get) init gtsm_hops
(peer_ebgp_multihop_{un,}set) check for conflicts with GTSM. Multihop and
GTSM can't both be active for a peer at the same time.
(peer_ttl_security_hops_set) set minttl, taking care to avoid conflicts with
ebgp_multihop.
(bgp_config_write_peer) write out minttl as "neighbor .. ttl-security hops X".
* bgp_vty.c: (bgp_vty_return) message for
BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
(peer_ebgp_multihop_{un,}set_vty)
* bgp_network.c: (bgp_accept) set minttl on accepted sockets if appropriate.
(bgp_connect) ditto for outbound.
2011-03-23 16:33:17 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2015-05-20 03:45:53 +02:00
|
|
|
/* Post the first gtsm setup or if its ibgp, maxttl setting isn't
|
|
|
|
* necessary, just set the minttl.
|
|
|
|
*/
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
bgpd: RFC 5082 Generalized TTL Security Mechanism support
* bgpd: Add support for RFC 5082 GTSM, which allows the TTL field to be used
to verify that incoming packets have been sent from neighbours no more
than X IP hops away. In other words, this allows packets that were sent from
further away (i.e. not by the neighbour with known distance, and so possibly
a miscreant) to be filtered out.
* lib/sockunion.{c,h}: (sockopt_minttl) new function, to set a minimum TTL
using the IP_MINTTL socket opt.
* bgpd.h: (BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK) define for command
error for minttl.
(struct peer) add a config variable, to store the configured minttl.
(peer_ttl_security_hops_{set,unset}) configuration handlers
* bgpd.c: (peer_group_get) init gtsm_hops
(peer_ebgp_multihop_{un,}set) check for conflicts with GTSM. Multihop and
GTSM can't both be active for a peer at the same time.
(peer_ttl_security_hops_set) set minttl, taking care to avoid conflicts with
ebgp_multihop.
(bgp_config_write_peer) write out minttl as "neighbor .. ttl-security hops X".
* bgp_vty.c: (bgp_vty_return) message for
BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
(peer_ebgp_multihop_{un,}set_vty)
* bgp_network.c: (bgp_accept) set minttl on accepted sockets if appropriate.
(bgp_connect) ditto for outbound.
2011-03-23 16:33:17 +01:00
|
|
|
{
|
2015-05-20 03:45:53 +02:00
|
|
|
peer->gtsm_hops = gtsm_hops;
|
bgpd: RFC 5082 Generalized TTL Security Mechanism support
* bgpd: Add support for RFC 5082 GTSM, which allows the TTL field to be used
to verify that incoming packets have been sent from neighbours no more
than X IP hops away. In other words, this allows packets that were sent from
further away (i.e. not by the neighbour with known distance, and so possibly
a miscreant) to be filtered out.
* lib/sockunion.{c,h}: (sockopt_minttl) new function, to set a minimum TTL
using the IP_MINTTL socket opt.
* bgpd.h: (BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK) define for command
error for minttl.
(struct peer) add a config variable, to store the configured minttl.
(peer_ttl_security_hops_{set,unset}) configuration handlers
* bgpd.c: (peer_group_get) init gtsm_hops
(peer_ebgp_multihop_{un,}set) check for conflicts with GTSM. Multihop and
GTSM can't both be active for a peer at the same time.
(peer_ttl_security_hops_set) set minttl, taking care to avoid conflicts with
ebgp_multihop.
(bgp_config_write_peer) write out minttl as "neighbor .. ttl-security hops X".
* bgp_vty.c: (bgp_vty_return) message for
BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
(peer_ebgp_multihop_{un,}set_vty)
* bgp_network.c: (bgp_accept) set minttl on accepted sockets if appropriate.
(bgp_connect) ditto for outbound.
2011-03-23 16:33:17 +01:00
|
|
|
|
2015-05-20 03:45:53 +02:00
|
|
|
if (peer->fd >= 0)
|
|
|
|
sockopt_minttl (peer->su.sa.sa_family, peer->fd,
|
|
|
|
MAXTTL + 1 - gtsm_hops);
|
|
|
|
if ((peer->status < Established) && peer->doppelganger &&
|
|
|
|
(peer->doppelganger->fd >= 0))
|
|
|
|
sockopt_minttl (peer->su.sa.sa_family, peer->doppelganger->fd,
|
|
|
|
MAXTTL + 1 - gtsm_hops);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
group = peer->group;
|
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
2011-03-24 18:30:21 +01:00
|
|
|
{
|
2015-05-20 03:45:53 +02:00
|
|
|
peer->gtsm_hops = group->conf->gtsm_hops;
|
|
|
|
|
|
|
|
/* Change setting of existing peer
|
|
|
|
* established then change value (may break connectivity)
|
|
|
|
* not established yet (teardown session and restart)
|
|
|
|
* no session then do nothing (will get handled by next connection)
|
|
|
|
*/
|
2011-03-24 18:30:21 +01:00
|
|
|
if (peer->fd >= 0 && peer->gtsm_hops != 0)
|
|
|
|
sockopt_minttl (peer->su.sa.sa_family, peer->fd,
|
|
|
|
MAXTTL + 1 - peer->gtsm_hops);
|
2015-05-20 03:45:53 +02:00
|
|
|
if ((peer->status < Established) && peer->doppelganger &&
|
|
|
|
(peer->doppelganger->fd >= 0))
|
|
|
|
sockopt_minttl (peer->su.sa.sa_family, peer->doppelganger->fd,
|
|
|
|
MAXTTL + 1 - gtsm_hops);
|
|
|
|
|
2011-03-24 18:30:21 +01:00
|
|
|
}
|
bgpd: RFC 5082 Generalized TTL Security Mechanism support
* bgpd: Add support for RFC 5082 GTSM, which allows the TTL field to be used
to verify that incoming packets have been sent from neighbours no more
than X IP hops away. In other words, this allows packets that were sent from
further away (i.e. not by the neighbour with known distance, and so possibly
a miscreant) to be filtered out.
* lib/sockunion.{c,h}: (sockopt_minttl) new function, to set a minimum TTL
using the IP_MINTTL socket opt.
* bgpd.h: (BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK) define for command
error for minttl.
(struct peer) add a config variable, to store the configured minttl.
(peer_ttl_security_hops_{set,unset}) configuration handlers
* bgpd.c: (peer_group_get) init gtsm_hops
(peer_ebgp_multihop_{un,}set) check for conflicts with GTSM. Multihop and
GTSM can't both be active for a peer at the same time.
(peer_ttl_security_hops_set) set minttl, taking care to avoid conflicts with
ebgp_multihop.
(bgp_config_write_peer) write out minttl as "neighbor .. ttl-security hops X".
* bgp_vty.c: (bgp_vty_return) message for
BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
(peer_ebgp_multihop_{un,}set_vty)
* bgp_network.c: (bgp_accept) set minttl on accepted sockets if appropriate.
(bgp_connect) ditto for outbound.
2011-03-23 16:33:17 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
peer_ttl_security_hops_unset (struct peer *peer)
|
|
|
|
{
|
|
|
|
struct peer_group *group;
|
|
|
|
struct listnode *node, *nnode;
|
2015-05-20 03:45:53 +02:00
|
|
|
int ret = 0;
|
bgpd: RFC 5082 Generalized TTL Security Mechanism support
* bgpd: Add support for RFC 5082 GTSM, which allows the TTL field to be used
to verify that incoming packets have been sent from neighbours no more
than X IP hops away. In other words, this allows packets that were sent from
further away (i.e. not by the neighbour with known distance, and so possibly
a miscreant) to be filtered out.
* lib/sockunion.{c,h}: (sockopt_minttl) new function, to set a minimum TTL
using the IP_MINTTL socket opt.
* bgpd.h: (BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK) define for command
error for minttl.
(struct peer) add a config variable, to store the configured minttl.
(peer_ttl_security_hops_{set,unset}) configuration handlers
* bgpd.c: (peer_group_get) init gtsm_hops
(peer_ebgp_multihop_{un,}set) check for conflicts with GTSM. Multihop and
GTSM can't both be active for a peer at the same time.
(peer_ttl_security_hops_set) set minttl, taking care to avoid conflicts with
ebgp_multihop.
(bgp_config_write_peer) write out minttl as "neighbor .. ttl-security hops X".
* bgp_vty.c: (bgp_vty_return) message for
BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
(peer_ebgp_multihop_{un,}set_vty)
* bgp_network.c: (bgp_accept) set minttl on accepted sockets if appropriate.
(bgp_connect) ditto for outbound.
2011-03-23 16:33:17 +01:00
|
|
|
|
|
|
|
zlog_debug ("peer_ttl_security_hops_unset: set gtsm_hops to zero for %s", peer->host);
|
|
|
|
|
|
|
|
/* if a peer-group member, then reset to peer-group default rather than 0 */
|
|
|
|
if (peer_group_active (peer))
|
|
|
|
peer->gtsm_hops = peer->group->conf->gtsm_hops;
|
|
|
|
else
|
|
|
|
peer->gtsm_hops = 0;
|
|
|
|
|
|
|
|
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
|
|
|
{
|
2015-05-20 03:45:53 +02:00
|
|
|
/* Invoking ebgp_multihop_set will set the TTL back to the original
|
|
|
|
* value as well as restting the NHT and such. The session is reset.
|
|
|
|
*/
|
|
|
|
if (peer->sort == BGP_PEER_EBGP)
|
|
|
|
ret = peer_ebgp_multihop_unset (peer);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (peer->fd >= 0)
|
|
|
|
sockopt_minttl (peer->su.sa.sa_family, peer->fd, 0);
|
2015-05-20 02:40:37 +02:00
|
|
|
|
2015-05-20 03:45:53 +02:00
|
|
|
if ((peer->status < Established) && peer->doppelganger &&
|
|
|
|
(peer->doppelganger->fd >= 0))
|
|
|
|
sockopt_minttl (peer->su.sa.sa_family,
|
|
|
|
peer->doppelganger->fd, 0);
|
|
|
|
}
|
bgpd: RFC 5082 Generalized TTL Security Mechanism support
* bgpd: Add support for RFC 5082 GTSM, which allows the TTL field to be used
to verify that incoming packets have been sent from neighbours no more
than X IP hops away. In other words, this allows packets that were sent from
further away (i.e. not by the neighbour with known distance, and so possibly
a miscreant) to be filtered out.
* lib/sockunion.{c,h}: (sockopt_minttl) new function, to set a minimum TTL
using the IP_MINTTL socket opt.
* bgpd.h: (BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK) define for command
error for minttl.
(struct peer) add a config variable, to store the configured minttl.
(peer_ttl_security_hops_{set,unset}) configuration handlers
* bgpd.c: (peer_group_get) init gtsm_hops
(peer_ebgp_multihop_{un,}set) check for conflicts with GTSM. Multihop and
GTSM can't both be active for a peer at the same time.
(peer_ttl_security_hops_set) set minttl, taking care to avoid conflicts with
ebgp_multihop.
(bgp_config_write_peer) write out minttl as "neighbor .. ttl-security hops X".
* bgp_vty.c: (bgp_vty_return) message for
BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
(peer_ebgp_multihop_{un,}set_vty)
* bgp_network.c: (bgp_accept) set minttl on accepted sockets if appropriate.
(bgp_connect) ditto for outbound.
2011-03-23 16:33:17 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
group = peer->group;
|
|
|
|
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
|
|
|
|
{
|
|
|
|
peer->gtsm_hops = 0;
|
2015-05-20 03:45:53 +02:00
|
|
|
if (peer->sort == BGP_PEER_EBGP)
|
|
|
|
ret = peer_ebgp_multihop_unset (peer);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (peer->fd >= 0)
|
|
|
|
sockopt_minttl (peer->su.sa.sa_family, peer->fd, 0);
|
2015-05-20 02:40:37 +02:00
|
|
|
|
2015-05-20 03:45:53 +02:00
|
|
|
if ((peer->status < Established) && peer->doppelganger &&
|
|
|
|
(peer->doppelganger->fd >= 0))
|
|
|
|
sockopt_minttl (peer->su.sa.sa_family,
|
|
|
|
peer->doppelganger->fd, 0);
|
|
|
|
}
|
bgpd: RFC 5082 Generalized TTL Security Mechanism support
* bgpd: Add support for RFC 5082 GTSM, which allows the TTL field to be used
to verify that incoming packets have been sent from neighbours no more
than X IP hops away. In other words, this allows packets that were sent from
further away (i.e. not by the neighbour with known distance, and so possibly
a miscreant) to be filtered out.
* lib/sockunion.{c,h}: (sockopt_minttl) new function, to set a minimum TTL
using the IP_MINTTL socket opt.
* bgpd.h: (BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK) define for command
error for minttl.
(struct peer) add a config variable, to store the configured minttl.
(peer_ttl_security_hops_{set,unset}) configuration handlers
* bgpd.c: (peer_group_get) init gtsm_hops
(peer_ebgp_multihop_{un,}set) check for conflicts with GTSM. Multihop and
GTSM can't both be active for a peer at the same time.
(peer_ttl_security_hops_set) set minttl, taking care to avoid conflicts with
ebgp_multihop.
(bgp_config_write_peer) write out minttl as "neighbor .. ttl-security hops X".
* bgp_vty.c: (bgp_vty_return) message for
BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
(peer_ebgp_multihop_{un,}set_vty)
* bgp_network.c: (bgp_accept) set minttl on accepted sockets if appropriate.
(bgp_connect) ditto for outbound.
2011-03-23 16:33:17 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-05-20 03:45:53 +02:00
|
|
|
return 0;
|
bgpd: RFC 5082 Generalized TTL Security Mechanism support
* bgpd: Add support for RFC 5082 GTSM, which allows the TTL field to be used
to verify that incoming packets have been sent from neighbours no more
than X IP hops away. In other words, this allows packets that were sent from
further away (i.e. not by the neighbour with known distance, and so possibly
a miscreant) to be filtered out.
* lib/sockunion.{c,h}: (sockopt_minttl) new function, to set a minimum TTL
using the IP_MINTTL socket opt.
* bgpd.h: (BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK) define for command
error for minttl.
(struct peer) add a config variable, to store the configured minttl.
(peer_ttl_security_hops_{set,unset}) configuration handlers
* bgpd.c: (peer_group_get) init gtsm_hops
(peer_ebgp_multihop_{un,}set) check for conflicts with GTSM. Multihop and
GTSM can't both be active for a peer at the same time.
(peer_ttl_security_hops_set) set minttl, taking care to avoid conflicts with
ebgp_multihop.
(bgp_config_write_peer) write out minttl as "neighbor .. ttl-security hops X".
* bgp_vty.c: (bgp_vty_return) message for
BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
(peer_ebgp_multihop_{un,}set_vty)
* bgp_network.c: (bgp_accept) set minttl on accepted sockets if appropriate.
(bgp_connect) ditto for outbound.
2011-03-23 16:33:17 +01:00
|
|
|
}
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2015-05-20 02:40:37 +02:00
|
|
|
/*
|
|
|
|
* If peer clear is invoked in a loop for all peers on the BGP instance,
|
|
|
|
* it may end up freeing the doppelganger, and if this was the next node
|
|
|
|
* to the current node, we would end up accessing the freed next node.
|
|
|
|
* Pass along additional parameter which can be updated if next node
|
|
|
|
* is freed; only required when walking the peer list on BGP instance.
|
|
|
|
*/
|
2002-12-13 21:15:29 +01:00
|
|
|
int
|
2015-05-20 02:40:37 +02:00
|
|
|
peer_clear (struct peer *peer, struct listnode **nnode)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
if (! CHECK_FLAG (peer->flags, PEER_FLAG_SHUTDOWN))
|
|
|
|
{
|
2005-02-01 21:57:17 +01:00
|
|
|
if (CHECK_FLAG (peer->sflags, PEER_STATUS_PREFIX_OVERFLOW))
|
|
|
|
{
|
|
|
|
UNSET_FLAG (peer->sflags, PEER_STATUS_PREFIX_OVERFLOW);
|
|
|
|
if (peer->t_pmax_restart)
|
|
|
|
{
|
|
|
|
BGP_TIMER_OFF (peer->t_pmax_restart);
|
2015-05-20 02:58:12 +02:00
|
|
|
if (bgp_debug_neighbor_events(peer))
|
2005-02-01 21:57:17 +01:00
|
|
|
zlog_debug ("%s Maximum-prefix restart timer canceled",
|
|
|
|
peer->host);
|
|
|
|
}
|
|
|
|
BGP_EVENT_ADD (peer, BGP_Start);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
peer->v_start = BGP_INIT_START_TIMER;
|
2013-10-02 12:40:20 +02:00
|
|
|
if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status))
|
2002-12-13 21:15:29 +01:00
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE,
|
|
|
|
BGP_NOTIFY_CEASE_ADMIN_RESET);
|
|
|
|
else
|
2015-05-20 02:40:37 +02:00
|
|
|
bgp_session_reset_safe(peer, nnode);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
peer_clear_soft (struct peer *peer, afi_t afi, safi_t safi,
|
|
|
|
enum bgp_clear_type stype)
|
|
|
|
{
|
2015-05-20 03:04:23 +02:00
|
|
|
struct peer_af *paf;
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
if (peer->status != Established)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
if (! peer->afc[afi][safi])
|
|
|
|
return BGP_ERR_AF_UNCONFIGURED;
|
|
|
|
|
2004-09-13 Jose Luis Rubio <jrubio@dit.upm.es>
(at Technical University of Madrid as part of Euro6ix Project)
Enhanced Route Server functionality and Route-Maps:
* bgpd/bgpd.h: Modified 'struct peer' and 'struct bgp_filter' to
support rs-clients. A 'struct bgp_table *rib' has been added to the
first (to mantain a separated RIB for each rs-client) and two new
route-maps have been added to the last (for import/export policies).
Added the following #defines: RMAP_{IN|OUT|IMPORT|EXPORT|MAX},
PEER_RMAP_TYPE_{IMPORT|EXPORT} and BGP_CLEAR_SOFT_RSCLIENT.
* bgpd/bgpd.c: Modified the functions that create/delete/etc peers in
order to consider the new fields included in 'struct peer' for
supporting rs-clients, i.e. the import/export route-maps and the
'struct bgp_table'.
* bgpd/bgp_route.{ch}: Modified several functions related with
receiving/sending announces in order to support the new Route Server
capabilities.
Function 'bgp_process' has been reorganized, creating an auxiliar
function for best path selection ('bgp_best_selection').
Modified 'bgp_show' and 'bgp_show_route' for displaying information
about any RIB (and not only the main bgp RIB).
Added commands for displaying information about RS-clients RIBs:
'show bgp rsclient (A.B.C.D|X:X::X:X)', 'show bgp rsclient
(A.B.C.D|X:X::X:X) X:X::X:X/M', etc
* bgpd/bgp_table.{ch}: The structure 'struct bgp_table' now has two
new fields: type (which can take the values BGP_TABLE_{MAIN|RSCLIENT})
and 'void *owner' which points to 'struct bgp' or 'struct peer' which
owns the table.
When creating a new bgp_table by default 'type=BGP_TABLE_MAIN' is set.
* bgpd/bgp_vty.c: The commands 'neighbor ... route-server-client' and
'no neighbor ... route-server-client' now not only set/unset the flag
PEER_FLAG_RSERVER_CLIENT, but they create/destroy the 'struct
bgp_table' of the peer. Special actions are taken for peer_groups.
Command 'neighbor ... route-map WORD (in|out)' now also supports two
new kinds of route-map: 'import' and 'export'.
Added commands 'clear bgp * rsclient', etc. These commands allow a new
kind of soft_reconfig which affects only the RIB of the specified
RS-client.
Added commands 'show bgp rsclient summary', etc which display a
summary of the rs-clients configured for the corresponding address
family.
* bgpd/bgp_routemap.c: A new match statement is available,
'match peer (A.B.C.D|X:X::X:X)'. This statement can only be used in
import/export route-maps, and it matches when the peer who announces
(when used in an import route-map) or is going to receive (when used
in an export route-map) the route is the same than the one specified
in the statement.
For peer-groups the statement matches if the specified peer is member
of the peer-group.
A special version of the command, 'match peer local', matches with
routes originated by the Route Server (defined with 'network ...',
redistributed routes and default-originate).
* lib/routemap.{ch}: Added a new clause 'call NAME' for use in
route-maps. It jumps into the specified route-map and when it returns
the first route-map ends if the called RM returns DENY_MATCH, or
continues in other case.
2004-09-13 07:12:46 +02:00
|
|
|
if (stype == BGP_CLEAR_SOFT_RSCLIENT)
|
|
|
|
{
|
|
|
|
if (! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
|
|
|
|
return 0;
|
|
|
|
bgp_check_local_routes_rsclient (peer, afi, safi);
|
|
|
|
bgp_soft_reconfig_rsclient (peer, afi, safi);
|
|
|
|
}
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
if (stype == BGP_CLEAR_SOFT_OUT || stype == BGP_CLEAR_SOFT_BOTH)
|
2015-05-20 03:04:23 +02:00
|
|
|
{
|
|
|
|
/* Clear the "neighbor x.x.x.x default-originate" flag */
|
|
|
|
paf = peer_af_find (peer, afi, safi);
|
|
|
|
if (paf && paf->subgroup &&
|
|
|
|
CHECK_FLAG (paf->subgroup->sflags, SUBGRP_STATUS_DEFAULT_ORIGINATE))
|
|
|
|
UNSET_FLAG (paf->subgroup->sflags, SUBGRP_STATUS_DEFAULT_ORIGINATE);
|
|
|
|
|
|
|
|
bgp_announce_route (peer, afi, safi);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
if (stype == BGP_CLEAR_SOFT_IN_ORF_PREFIX)
|
|
|
|
{
|
|
|
|
if (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
|
|
|
|
&& (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_RCV)
|
|
|
|
|| CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_OLD_RCV)))
|
|
|
|
{
|
|
|
|
struct bgp_filter *filter = &peer->filter[afi][safi];
|
|
|
|
u_char prefix_type;
|
|
|
|
|
|
|
|
if (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_RCV))
|
|
|
|
prefix_type = ORF_TYPE_PREFIX;
|
|
|
|
else
|
|
|
|
prefix_type = ORF_TYPE_PREFIX_OLD;
|
|
|
|
|
|
|
|
if (filter->plist[FILTER_IN].plist)
|
|
|
|
{
|
|
|
|
if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_ORF_PREFIX_SEND))
|
|
|
|
bgp_route_refresh_send (peer, afi, safi,
|
|
|
|
prefix_type, REFRESH_DEFER, 1);
|
|
|
|
bgp_route_refresh_send (peer, afi, safi, prefix_type,
|
|
|
|
REFRESH_IMMEDIATE, 0);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_ORF_PREFIX_SEND))
|
|
|
|
bgp_route_refresh_send (peer, afi, safi,
|
|
|
|
prefix_type, REFRESH_IMMEDIATE, 1);
|
|
|
|
else
|
|
|
|
bgp_route_refresh_send (peer, afi, safi, 0, 0, 0);
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (stype == BGP_CLEAR_SOFT_IN || stype == BGP_CLEAR_SOFT_BOTH
|
|
|
|
|| stype == BGP_CLEAR_SOFT_IN_ORF_PREFIX)
|
|
|
|
{
|
|
|
|
/* If neighbor has soft reconfiguration inbound flag.
|
|
|
|
Use Adj-RIB-In database. */
|
|
|
|
if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
|
|
|
|
bgp_soft_reconfig_in (peer, afi, safi);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* If neighbor has route refresh capability, send route refresh
|
|
|
|
message to the peer. */
|
|
|
|
if (CHECK_FLAG (peer->cap, PEER_CAP_REFRESH_OLD_RCV)
|
|
|
|
|| CHECK_FLAG (peer->cap, PEER_CAP_REFRESH_NEW_RCV))
|
|
|
|
bgp_route_refresh_send (peer, afi, safi, 0, 0, 0);
|
|
|
|
else
|
|
|
|
return BGP_ERR_SOFT_RECONFIG_UNCONFIGURED;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2004-10-13 07:06:08 +02:00
|
|
|
/* Display peer uptime.*/
|
|
|
|
/* XXX: why does this function return char * when it takes buffer? */
|
2002-12-13 21:15:29 +01:00
|
|
|
char *
|
|
|
|
peer_uptime (time_t uptime2, char *buf, size_t len)
|
|
|
|
{
|
|
|
|
time_t uptime1;
|
|
|
|
struct tm *tm;
|
|
|
|
|
|
|
|
/* Check buffer length. */
|
|
|
|
if (len < BGP_UPTIME_LEN)
|
|
|
|
{
|
2006-09-19 20:51:53 +02:00
|
|
|
zlog_warn ("peer_uptime (): buffer shortage %lu", (u_long)len);
|
2004-10-13 07:06:08 +02:00
|
|
|
/* XXX: should return status instead of buf... */
|
|
|
|
snprintf (buf, len, "<error> ");
|
|
|
|
return buf;
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/* If there is no connection has been done before print `never'. */
|
|
|
|
if (uptime2 == 0)
|
|
|
|
{
|
|
|
|
snprintf (buf, len, "never ");
|
|
|
|
return buf;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Get current time. */
|
2010-01-15 14:22:10 +01:00
|
|
|
uptime1 = bgp_clock ();
|
2002-12-13 21:15:29 +01:00
|
|
|
uptime1 -= uptime2;
|
|
|
|
tm = gmtime (&uptime1);
|
|
|
|
|
|
|
|
/* Making formatted timer strings. */
|
|
|
|
#define ONE_DAY_SECOND 60*60*24
|
|
|
|
#define ONE_WEEK_SECOND 60*60*24*7
|
|
|
|
|
|
|
|
if (uptime1 < ONE_DAY_SECOND)
|
|
|
|
snprintf (buf, len, "%02d:%02d:%02d",
|
|
|
|
tm->tm_hour, tm->tm_min, tm->tm_sec);
|
|
|
|
else if (uptime1 < ONE_WEEK_SECOND)
|
|
|
|
snprintf (buf, len, "%dd%02dh%02dm",
|
|
|
|
tm->tm_yday, tm->tm_hour, tm->tm_min);
|
|
|
|
else
|
|
|
|
snprintf (buf, len, "%02dw%dd%02dh",
|
|
|
|
tm->tm_yday/7, tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour);
|
|
|
|
return buf;
|
|
|
|
}
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2005-06-28 14:44:16 +02:00
|
|
|
static void
|
2002-12-13 21:15:29 +01:00
|
|
|
bgp_config_write_filter (struct vty *vty, struct peer *peer,
|
|
|
|
afi_t afi, safi_t safi)
|
|
|
|
{
|
|
|
|
struct bgp_filter *filter;
|
|
|
|
struct bgp_filter *gfilter = NULL;
|
|
|
|
char *addr;
|
|
|
|
int in = FILTER_IN;
|
|
|
|
int out = FILTER_OUT;
|
|
|
|
|
|
|
|
addr = peer->host;
|
|
|
|
filter = &peer->filter[afi][safi];
|
|
|
|
if (peer->af_group[afi][safi])
|
|
|
|
gfilter = &peer->group->conf->filter[afi][safi];
|
|
|
|
|
|
|
|
/* distribute-list. */
|
|
|
|
if (filter->dlist[in].name)
|
|
|
|
if (! gfilter || ! gfilter->dlist[in].name
|
|
|
|
|| strcmp (filter->dlist[in].name, gfilter->dlist[in].name) != 0)
|
|
|
|
vty_out (vty, " neighbor %s distribute-list %s in%s", addr,
|
|
|
|
filter->dlist[in].name, VTY_NEWLINE);
|
|
|
|
if (filter->dlist[out].name && ! gfilter)
|
|
|
|
vty_out (vty, " neighbor %s distribute-list %s out%s", addr,
|
|
|
|
filter->dlist[out].name, VTY_NEWLINE);
|
|
|
|
|
|
|
|
/* prefix-list. */
|
|
|
|
if (filter->plist[in].name)
|
|
|
|
if (! gfilter || ! gfilter->plist[in].name
|
|
|
|
|| strcmp (filter->plist[in].name, gfilter->plist[in].name) != 0)
|
|
|
|
vty_out (vty, " neighbor %s prefix-list %s in%s", addr,
|
|
|
|
filter->plist[in].name, VTY_NEWLINE);
|
|
|
|
if (filter->plist[out].name && ! gfilter)
|
|
|
|
vty_out (vty, " neighbor %s prefix-list %s out%s", addr,
|
|
|
|
filter->plist[out].name, VTY_NEWLINE);
|
|
|
|
|
|
|
|
/* route-map. */
|
2004-09-13 Jose Luis Rubio <jrubio@dit.upm.es>
(at Technical University of Madrid as part of Euro6ix Project)
Enhanced Route Server functionality and Route-Maps:
* bgpd/bgpd.h: Modified 'struct peer' and 'struct bgp_filter' to
support rs-clients. A 'struct bgp_table *rib' has been added to the
first (to mantain a separated RIB for each rs-client) and two new
route-maps have been added to the last (for import/export policies).
Added the following #defines: RMAP_{IN|OUT|IMPORT|EXPORT|MAX},
PEER_RMAP_TYPE_{IMPORT|EXPORT} and BGP_CLEAR_SOFT_RSCLIENT.
* bgpd/bgpd.c: Modified the functions that create/delete/etc peers in
order to consider the new fields included in 'struct peer' for
supporting rs-clients, i.e. the import/export route-maps and the
'struct bgp_table'.
* bgpd/bgp_route.{ch}: Modified several functions related with
receiving/sending announces in order to support the new Route Server
capabilities.
Function 'bgp_process' has been reorganized, creating an auxiliar
function for best path selection ('bgp_best_selection').
Modified 'bgp_show' and 'bgp_show_route' for displaying information
about any RIB (and not only the main bgp RIB).
Added commands for displaying information about RS-clients RIBs:
'show bgp rsclient (A.B.C.D|X:X::X:X)', 'show bgp rsclient
(A.B.C.D|X:X::X:X) X:X::X:X/M', etc
* bgpd/bgp_table.{ch}: The structure 'struct bgp_table' now has two
new fields: type (which can take the values BGP_TABLE_{MAIN|RSCLIENT})
and 'void *owner' which points to 'struct bgp' or 'struct peer' which
owns the table.
When creating a new bgp_table by default 'type=BGP_TABLE_MAIN' is set.
* bgpd/bgp_vty.c: The commands 'neighbor ... route-server-client' and
'no neighbor ... route-server-client' now not only set/unset the flag
PEER_FLAG_RSERVER_CLIENT, but they create/destroy the 'struct
bgp_table' of the peer. Special actions are taken for peer_groups.
Command 'neighbor ... route-map WORD (in|out)' now also supports two
new kinds of route-map: 'import' and 'export'.
Added commands 'clear bgp * rsclient', etc. These commands allow a new
kind of soft_reconfig which affects only the RIB of the specified
RS-client.
Added commands 'show bgp rsclient summary', etc which display a
summary of the rs-clients configured for the corresponding address
family.
* bgpd/bgp_routemap.c: A new match statement is available,
'match peer (A.B.C.D|X:X::X:X)'. This statement can only be used in
import/export route-maps, and it matches when the peer who announces
(when used in an import route-map) or is going to receive (when used
in an export route-map) the route is the same than the one specified
in the statement.
For peer-groups the statement matches if the specified peer is member
of the peer-group.
A special version of the command, 'match peer local', matches with
routes originated by the Route Server (defined with 'network ...',
redistributed routes and default-originate).
* lib/routemap.{ch}: Added a new clause 'call NAME' for use in
route-maps. It jumps into the specified route-map and when it returns
the first route-map ends if the called RM returns DENY_MATCH, or
continues in other case.
2004-09-13 07:12:46 +02:00
|
|
|
if (filter->map[RMAP_IN].name)
|
|
|
|
if (! gfilter || ! gfilter->map[RMAP_IN].name
|
|
|
|
|| strcmp (filter->map[RMAP_IN].name, gfilter->map[RMAP_IN].name) != 0)
|
2002-12-13 21:15:29 +01:00
|
|
|
vty_out (vty, " neighbor %s route-map %s in%s", addr,
|
2004-09-13 Jose Luis Rubio <jrubio@dit.upm.es>
(at Technical University of Madrid as part of Euro6ix Project)
Enhanced Route Server functionality and Route-Maps:
* bgpd/bgpd.h: Modified 'struct peer' and 'struct bgp_filter' to
support rs-clients. A 'struct bgp_table *rib' has been added to the
first (to mantain a separated RIB for each rs-client) and two new
route-maps have been added to the last (for import/export policies).
Added the following #defines: RMAP_{IN|OUT|IMPORT|EXPORT|MAX},
PEER_RMAP_TYPE_{IMPORT|EXPORT} and BGP_CLEAR_SOFT_RSCLIENT.
* bgpd/bgpd.c: Modified the functions that create/delete/etc peers in
order to consider the new fields included in 'struct peer' for
supporting rs-clients, i.e. the import/export route-maps and the
'struct bgp_table'.
* bgpd/bgp_route.{ch}: Modified several functions related with
receiving/sending announces in order to support the new Route Server
capabilities.
Function 'bgp_process' has been reorganized, creating an auxiliar
function for best path selection ('bgp_best_selection').
Modified 'bgp_show' and 'bgp_show_route' for displaying information
about any RIB (and not only the main bgp RIB).
Added commands for displaying information about RS-clients RIBs:
'show bgp rsclient (A.B.C.D|X:X::X:X)', 'show bgp rsclient
(A.B.C.D|X:X::X:X) X:X::X:X/M', etc
* bgpd/bgp_table.{ch}: The structure 'struct bgp_table' now has two
new fields: type (which can take the values BGP_TABLE_{MAIN|RSCLIENT})
and 'void *owner' which points to 'struct bgp' or 'struct peer' which
owns the table.
When creating a new bgp_table by default 'type=BGP_TABLE_MAIN' is set.
* bgpd/bgp_vty.c: The commands 'neighbor ... route-server-client' and
'no neighbor ... route-server-client' now not only set/unset the flag
PEER_FLAG_RSERVER_CLIENT, but they create/destroy the 'struct
bgp_table' of the peer. Special actions are taken for peer_groups.
Command 'neighbor ... route-map WORD (in|out)' now also supports two
new kinds of route-map: 'import' and 'export'.
Added commands 'clear bgp * rsclient', etc. These commands allow a new
kind of soft_reconfig which affects only the RIB of the specified
RS-client.
Added commands 'show bgp rsclient summary', etc which display a
summary of the rs-clients configured for the corresponding address
family.
* bgpd/bgp_routemap.c: A new match statement is available,
'match peer (A.B.C.D|X:X::X:X)'. This statement can only be used in
import/export route-maps, and it matches when the peer who announces
(when used in an import route-map) or is going to receive (when used
in an export route-map) the route is the same than the one specified
in the statement.
For peer-groups the statement matches if the specified peer is member
of the peer-group.
A special version of the command, 'match peer local', matches with
routes originated by the Route Server (defined with 'network ...',
redistributed routes and default-originate).
* lib/routemap.{ch}: Added a new clause 'call NAME' for use in
route-maps. It jumps into the specified route-map and when it returns
the first route-map ends if the called RM returns DENY_MATCH, or
continues in other case.
2004-09-13 07:12:46 +02:00
|
|
|
filter->map[RMAP_IN].name, VTY_NEWLINE);
|
|
|
|
if (filter->map[RMAP_OUT].name && ! gfilter)
|
2002-12-13 21:15:29 +01:00
|
|
|
vty_out (vty, " neighbor %s route-map %s out%s", addr,
|
2004-09-13 Jose Luis Rubio <jrubio@dit.upm.es>
(at Technical University of Madrid as part of Euro6ix Project)
Enhanced Route Server functionality and Route-Maps:
* bgpd/bgpd.h: Modified 'struct peer' and 'struct bgp_filter' to
support rs-clients. A 'struct bgp_table *rib' has been added to the
first (to mantain a separated RIB for each rs-client) and two new
route-maps have been added to the last (for import/export policies).
Added the following #defines: RMAP_{IN|OUT|IMPORT|EXPORT|MAX},
PEER_RMAP_TYPE_{IMPORT|EXPORT} and BGP_CLEAR_SOFT_RSCLIENT.
* bgpd/bgpd.c: Modified the functions that create/delete/etc peers in
order to consider the new fields included in 'struct peer' for
supporting rs-clients, i.e. the import/export route-maps and the
'struct bgp_table'.
* bgpd/bgp_route.{ch}: Modified several functions related with
receiving/sending announces in order to support the new Route Server
capabilities.
Function 'bgp_process' has been reorganized, creating an auxiliar
function for best path selection ('bgp_best_selection').
Modified 'bgp_show' and 'bgp_show_route' for displaying information
about any RIB (and not only the main bgp RIB).
Added commands for displaying information about RS-clients RIBs:
'show bgp rsclient (A.B.C.D|X:X::X:X)', 'show bgp rsclient
(A.B.C.D|X:X::X:X) X:X::X:X/M', etc
* bgpd/bgp_table.{ch}: The structure 'struct bgp_table' now has two
new fields: type (which can take the values BGP_TABLE_{MAIN|RSCLIENT})
and 'void *owner' which points to 'struct bgp' or 'struct peer' which
owns the table.
When creating a new bgp_table by default 'type=BGP_TABLE_MAIN' is set.
* bgpd/bgp_vty.c: The commands 'neighbor ... route-server-client' and
'no neighbor ... route-server-client' now not only set/unset the flag
PEER_FLAG_RSERVER_CLIENT, but they create/destroy the 'struct
bgp_table' of the peer. Special actions are taken for peer_groups.
Command 'neighbor ... route-map WORD (in|out)' now also supports two
new kinds of route-map: 'import' and 'export'.
Added commands 'clear bgp * rsclient', etc. These commands allow a new
kind of soft_reconfig which affects only the RIB of the specified
RS-client.
Added commands 'show bgp rsclient summary', etc which display a
summary of the rs-clients configured for the corresponding address
family.
* bgpd/bgp_routemap.c: A new match statement is available,
'match peer (A.B.C.D|X:X::X:X)'. This statement can only be used in
import/export route-maps, and it matches when the peer who announces
(when used in an import route-map) or is going to receive (when used
in an export route-map) the route is the same than the one specified
in the statement.
For peer-groups the statement matches if the specified peer is member
of the peer-group.
A special version of the command, 'match peer local', matches with
routes originated by the Route Server (defined with 'network ...',
redistributed routes and default-originate).
* lib/routemap.{ch}: Added a new clause 'call NAME' for use in
route-maps. It jumps into the specified route-map and when it returns
the first route-map ends if the called RM returns DENY_MATCH, or
continues in other case.
2004-09-13 07:12:46 +02:00
|
|
|
filter->map[RMAP_OUT].name, VTY_NEWLINE);
|
|
|
|
if (filter->map[RMAP_IMPORT].name && ! gfilter)
|
|
|
|
vty_out (vty, " neighbor %s route-map %s import%s", addr,
|
|
|
|
filter->map[RMAP_IMPORT].name, VTY_NEWLINE);
|
|
|
|
if (filter->map[RMAP_EXPORT].name)
|
|
|
|
if (! gfilter || ! gfilter->map[RMAP_EXPORT].name
|
|
|
|
|| strcmp (filter->map[RMAP_EXPORT].name,
|
|
|
|
gfilter->map[RMAP_EXPORT].name) != 0)
|
|
|
|
vty_out (vty, " neighbor %s route-map %s export%s", addr,
|
|
|
|
filter->map[RMAP_EXPORT].name, VTY_NEWLINE);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
/* unsuppress-map */
|
|
|
|
if (filter->usmap.name && ! gfilter)
|
|
|
|
vty_out (vty, " neighbor %s unsuppress-map %s%s", addr,
|
|
|
|
filter->usmap.name, VTY_NEWLINE);
|
|
|
|
|
|
|
|
/* filter-list. */
|
|
|
|
if (filter->aslist[in].name)
|
|
|
|
if (! gfilter || ! gfilter->aslist[in].name
|
|
|
|
|| strcmp (filter->aslist[in].name, gfilter->aslist[in].name) != 0)
|
|
|
|
vty_out (vty, " neighbor %s filter-list %s in%s", addr,
|
|
|
|
filter->aslist[in].name, VTY_NEWLINE);
|
|
|
|
if (filter->aslist[out].name && ! gfilter)
|
|
|
|
vty_out (vty, " neighbor %s filter-list %s out%s", addr,
|
|
|
|
filter->aslist[out].name, VTY_NEWLINE);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* BGP peer configuration display function. */
|
2005-06-28 14:44:16 +02:00
|
|
|
static void
|
2002-12-13 21:15:29 +01:00
|
|
|
bgp_config_write_peer (struct vty *vty, struct bgp *bgp,
|
|
|
|
struct peer *peer, afi_t afi, safi_t safi)
|
|
|
|
{
|
|
|
|
struct peer *g_peer = NULL;
|
|
|
|
char buf[SU_ADDRSTRLEN];
|
|
|
|
char *addr;
|
|
|
|
|
2015-05-20 03:03:47 +02:00
|
|
|
/* Skip dynamic neighbors. */
|
|
|
|
if (peer_dynamic_neighbor (peer))
|
|
|
|
return;
|
|
|
|
|
2015-05-20 02:40:40 +02:00
|
|
|
if (peer->conf_if)
|
|
|
|
addr = peer->conf_if;
|
|
|
|
else
|
|
|
|
addr = peer->host;
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
if (peer_group_active (peer))
|
|
|
|
g_peer = peer->group->conf;
|
|
|
|
|
|
|
|
/************************************
|
|
|
|
****** Global to the neighbor ******
|
|
|
|
************************************/
|
|
|
|
if (afi == AFI_IP && safi == SAFI_UNICAST)
|
|
|
|
{
|
2015-05-20 02:40:40 +02:00
|
|
|
if (peer->conf_if)
|
|
|
|
vty_out (vty, " neighbor %s interface%s", addr, VTY_NEWLINE);
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* remote-as. */
|
|
|
|
if (! peer_group_active (peer))
|
|
|
|
{
|
|
|
|
if (CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
|
|
|
|
vty_out (vty, " neighbor %s peer-group%s", addr,
|
|
|
|
VTY_NEWLINE);
|
2015-05-20 03:04:25 +02:00
|
|
|
if (peer->as_type == AS_SPECIFIED)
|
|
|
|
{
|
|
|
|
vty_out (vty, " neighbor %s remote-as %u%s", addr, peer->as,
|
|
|
|
VTY_NEWLINE);
|
|
|
|
}
|
|
|
|
else if (peer->as_type == AS_INTERNAL)
|
|
|
|
{
|
|
|
|
vty_out (vty, " neighbor %s remote-as internal%s", addr, VTY_NEWLINE);
|
|
|
|
}
|
|
|
|
else if (peer->as_type == AS_EXTERNAL)
|
|
|
|
{
|
|
|
|
vty_out (vty, " neighbor %s remote-as external%s", addr, VTY_NEWLINE);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (! g_peer->as)
|
2015-05-20 03:04:25 +02:00
|
|
|
{
|
2015-05-20 03:29:17 +02:00
|
|
|
if (peer->as_type == AS_SPECIFIED)
|
|
|
|
{
|
|
|
|
vty_out (vty, " neighbor %s remote-as %u%s", addr, peer->as,
|
|
|
|
VTY_NEWLINE);
|
|
|
|
}
|
|
|
|
else if (peer->as_type == AS_INTERNAL)
|
|
|
|
{
|
|
|
|
vty_out (vty, " neighbor %s remote-as internal%s", addr, VTY_NEWLINE);
|
|
|
|
}
|
|
|
|
else if (peer->as_type == AS_EXTERNAL)
|
|
|
|
{
|
|
|
|
vty_out (vty, " neighbor %s remote-as external%s", addr, VTY_NEWLINE);
|
|
|
|
}
|
2015-05-20 03:04:25 +02:00
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
if (peer->af_group[AFI_IP][SAFI_UNICAST])
|
|
|
|
vty_out (vty, " neighbor %s peer-group %s%s", addr,
|
|
|
|
peer->group->name, VTY_NEWLINE);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* local-as. */
|
|
|
|
if (peer->change_local_as)
|
|
|
|
if (! peer_group_active (peer))
|
bgpd: add replace-as modifier for BGP neighbor
Added replace-as modifier for BGP neighbors when using
local-as. If the replace-as modifier is specified, only the
replacement AS as specified by the local-as modifier is
prepended to the AS_PATH, not the process's AS.
In bgp_attr.c, I decided that
if (peer->change_local_as) {
/* If replace-as is specified, we only use the change_local_as when
advertising routes. */
if( ! CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS) ) {
aspath = aspath_add_seq (aspath, peer->local_as);
}
aspath = aspath_add_seq (aspath, peer->change_local_as);
} else {
aspath = aspath_add_seq (aspath, peer->local_as);
}
was clearer than the alternative that didn't duplicate the prepending of the
process's AS:
/* First, append the process local AS unless we have an alternate local_as
* and we're replacing it (as opposed to just prepending it). */
if (! (peer->change_local_as
&& CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS) ) ) {
aspath = aspath_add_seq (aspath, peer->local_as);
}
if (peer->change_local_as)
aspath = aspath_add_seq (aspath, peer->change_local_as);
}
But I could be convinced otherwise.
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
2012-11-08 00:50:07 +01:00
|
|
|
vty_out (vty, " neighbor %s local-as %u%s%s%s", addr,
|
2002-12-13 21:15:29 +01:00
|
|
|
peer->change_local_as,
|
|
|
|
CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND) ?
|
bgpd: add replace-as modifier for BGP neighbor
Added replace-as modifier for BGP neighbors when using
local-as. If the replace-as modifier is specified, only the
replacement AS as specified by the local-as modifier is
prepended to the AS_PATH, not the process's AS.
In bgp_attr.c, I decided that
if (peer->change_local_as) {
/* If replace-as is specified, we only use the change_local_as when
advertising routes. */
if( ! CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS) ) {
aspath = aspath_add_seq (aspath, peer->local_as);
}
aspath = aspath_add_seq (aspath, peer->change_local_as);
} else {
aspath = aspath_add_seq (aspath, peer->local_as);
}
was clearer than the alternative that didn't duplicate the prepending of the
process's AS:
/* First, append the process local AS unless we have an alternate local_as
* and we're replacing it (as opposed to just prepending it). */
if (! (peer->change_local_as
&& CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS) ) ) {
aspath = aspath_add_seq (aspath, peer->local_as);
}
if (peer->change_local_as)
aspath = aspath_add_seq (aspath, peer->change_local_as);
}
But I could be convinced otherwise.
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
2012-11-08 00:50:07 +01:00
|
|
|
" no-prepend" : "",
|
|
|
|
CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS) ?
|
|
|
|
" replace-as" : "", VTY_NEWLINE);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
/* Description. */
|
|
|
|
if (peer->desc)
|
|
|
|
vty_out (vty, " neighbor %s description %s%s", addr, peer->desc,
|
|
|
|
VTY_NEWLINE);
|
|
|
|
|
|
|
|
/* Shutdown. */
|
|
|
|
if (CHECK_FLAG (peer->flags, PEER_FLAG_SHUTDOWN))
|
|
|
|
if (! peer_group_active (peer) ||
|
|
|
|
! CHECK_FLAG (g_peer->flags, PEER_FLAG_SHUTDOWN))
|
|
|
|
vty_out (vty, " neighbor %s shutdown%s", addr, VTY_NEWLINE);
|
|
|
|
|
2015-05-20 02:47:23 +02:00
|
|
|
/* bfd. */
|
|
|
|
if (CHECK_FLAG (peer->flags, PEER_FLAG_BFD))
|
|
|
|
if (! peer_group_active (peer) ||
|
|
|
|
! CHECK_FLAG (g_peer->flags, PEER_FLAG_BFD))
|
|
|
|
vty_out (vty, " neighbor %s bfd%s", addr, VTY_NEWLINE);
|
|
|
|
|
[bgpd] TCP-MD5: password vty configuration and initial Linux support
2008-07-21 Paul Jakma <paul.jakma@sun.com>
* bgp_packet.c: (bgp_open_receive) fix warning in a zlog call
* bgp_vty.c: (bgp_vty_return) add return code
* bgpd.c: (bgp_master_init) setup the socket list.
* bgp_network.c: Remove the dual IPv4/6 socket thing for now, which
was implemented by Michael, until such time as its clear its
required for Linux (see sockopt comments). IPv6 support, including
IPv4 sessions on AF_INET6 sockets, therefore is broken, and the
'-l 0.0.0.0' arguments would need to be given to bgpd to make
things work here.
2008-07-21 Michael H. Warfield <mhw@wittsend.com>
YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Tomohiko Kusuda <kusuda@inetcore.com>
Leigh Brown <leigh@solinno.co.uk>
* bgp_network.c: (bgp_md5_set_one) shim between libzebra tcp-md5
sockopt and bgpd.
(bgp_md5_set_socket) Helper for bgp_connect
(bgp_md5_set) setup TCP-MD5SIG for the given peer.
(bgp_connect) call out to bgp_md5_set_socket for the outgoing
connect socket.
(bgp_socket) save references to the listen sockets, needed if
TCP-MD5SIG is applied later or changed.
* bgp_vty.c: (*neighbor_password_cmd) New 'neighbor ... password'
commands.
* bgpd.c: (peer_{new,delete) manage TCP-MD5 password
(peer_group2peer_config_copy) inherit TCP-MD5 password
(peer_password_{un,}set) orchestrate the whole add/remove of TCP-MD5
passwords: applying checks, stopping peers, and trying to return
errors to UI, etc.
(bgp_config_write_peer) save password.
Fix missing newline in writeout of neighbor ... port.
2008-07-21 Paul Jakma <paul.jakma@sun.com>
* sockunion.c: ifdef out various places that converted
v4mapped sockets to pure v4. Doesn't seem necessary at all,
presumably a workaround for now historical inet_ntop bugs (?)
2008-07-21 Michael H. Warfield <mhw@wittsend.com>
YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
* sockopt.{c,h}: (sockopt_tcp_signature) Add TCP-MD5SIG support.
2008-07-21 23:02:49 +02:00
|
|
|
/* Password. */
|
|
|
|
if (peer->password)
|
|
|
|
if (!peer_group_active (peer)
|
|
|
|
|| ! g_peer->password
|
|
|
|
|| strcmp (peer->password, g_peer->password) != 0)
|
|
|
|
vty_out (vty, " neighbor %s password %s%s", addr, peer->password,
|
|
|
|
VTY_NEWLINE);
|
|
|
|
|
2015-05-20 03:03:47 +02:00
|
|
|
/* neighbor solo */
|
|
|
|
if (CHECK_FLAG(peer->flags, PEER_FLAG_LONESOUL))
|
|
|
|
if (!peer_group_active (peer))
|
|
|
|
vty_out (vty, " neighbor %s solo%s", addr, VTY_NEWLINE);
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* BGP port. */
|
|
|
|
if (peer->port != BGP_PORT_DEFAULT)
|
[bgpd] TCP-MD5: password vty configuration and initial Linux support
2008-07-21 Paul Jakma <paul.jakma@sun.com>
* bgp_packet.c: (bgp_open_receive) fix warning in a zlog call
* bgp_vty.c: (bgp_vty_return) add return code
* bgpd.c: (bgp_master_init) setup the socket list.
* bgp_network.c: Remove the dual IPv4/6 socket thing for now, which
was implemented by Michael, until such time as its clear its
required for Linux (see sockopt comments). IPv6 support, including
IPv4 sessions on AF_INET6 sockets, therefore is broken, and the
'-l 0.0.0.0' arguments would need to be given to bgpd to make
things work here.
2008-07-21 Michael H. Warfield <mhw@wittsend.com>
YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Tomohiko Kusuda <kusuda@inetcore.com>
Leigh Brown <leigh@solinno.co.uk>
* bgp_network.c: (bgp_md5_set_one) shim between libzebra tcp-md5
sockopt and bgpd.
(bgp_md5_set_socket) Helper for bgp_connect
(bgp_md5_set) setup TCP-MD5SIG for the given peer.
(bgp_connect) call out to bgp_md5_set_socket for the outgoing
connect socket.
(bgp_socket) save references to the listen sockets, needed if
TCP-MD5SIG is applied later or changed.
* bgp_vty.c: (*neighbor_password_cmd) New 'neighbor ... password'
commands.
* bgpd.c: (peer_{new,delete) manage TCP-MD5 password
(peer_group2peer_config_copy) inherit TCP-MD5 password
(peer_password_{un,}set) orchestrate the whole add/remove of TCP-MD5
passwords: applying checks, stopping peers, and trying to return
errors to UI, etc.
(bgp_config_write_peer) save password.
Fix missing newline in writeout of neighbor ... port.
2008-07-21 Paul Jakma <paul.jakma@sun.com>
* sockunion.c: ifdef out various places that converted
v4mapped sockets to pure v4. Doesn't seem necessary at all,
presumably a workaround for now historical inet_ntop bugs (?)
2008-07-21 Michael H. Warfield <mhw@wittsend.com>
YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
* sockopt.{c,h}: (sockopt_tcp_signature) Add TCP-MD5SIG support.
2008-07-21 23:02:49 +02:00
|
|
|
vty_out (vty, " neighbor %s port %d%s", addr, peer->port,
|
2002-12-13 21:15:29 +01:00
|
|
|
VTY_NEWLINE);
|
|
|
|
|
|
|
|
/* Local interface name. */
|
|
|
|
if (peer->ifname)
|
|
|
|
vty_out (vty, " neighbor %s interface %s%s", addr, peer->ifname,
|
|
|
|
VTY_NEWLINE);
|
|
|
|
|
|
|
|
/* Passive. */
|
|
|
|
if (CHECK_FLAG (peer->flags, PEER_FLAG_PASSIVE))
|
|
|
|
if (! peer_group_active (peer) ||
|
|
|
|
! CHECK_FLAG (g_peer->flags, PEER_FLAG_PASSIVE))
|
|
|
|
vty_out (vty, " neighbor %s passive%s", addr, VTY_NEWLINE);
|
|
|
|
|
|
|
|
/* EBGP multihop. */
|
2012-05-07 18:52:54 +02:00
|
|
|
if (peer->sort != BGP_PEER_IBGP && peer->ttl != 1 &&
|
bgpd: RFC 5082 Generalized TTL Security Mechanism support
* bgpd: Add support for RFC 5082 GTSM, which allows the TTL field to be used
to verify that incoming packets have been sent from neighbours no more
than X IP hops away. In other words, this allows packets that were sent from
further away (i.e. not by the neighbour with known distance, and so possibly
a miscreant) to be filtered out.
* lib/sockunion.{c,h}: (sockopt_minttl) new function, to set a minimum TTL
using the IP_MINTTL socket opt.
* bgpd.h: (BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK) define for command
error for minttl.
(struct peer) add a config variable, to store the configured minttl.
(peer_ttl_security_hops_{set,unset}) configuration handlers
* bgpd.c: (peer_group_get) init gtsm_hops
(peer_ebgp_multihop_{un,}set) check for conflicts with GTSM. Multihop and
GTSM can't both be active for a peer at the same time.
(peer_ttl_security_hops_set) set minttl, taking care to avoid conflicts with
ebgp_multihop.
(bgp_config_write_peer) write out minttl as "neighbor .. ttl-security hops X".
* bgp_vty.c: (bgp_vty_return) message for
BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
(peer_ebgp_multihop_{un,}set_vty)
* bgp_network.c: (bgp_accept) set minttl on accepted sockets if appropriate.
(bgp_connect) ditto for outbound.
2011-03-23 16:33:17 +01:00
|
|
|
!(peer->gtsm_hops != 0 && peer->ttl == MAXTTL))
|
2002-12-13 21:15:29 +01:00
|
|
|
if (! peer_group_active (peer) ||
|
|
|
|
g_peer->ttl != peer->ttl)
|
|
|
|
vty_out (vty, " neighbor %s ebgp-multihop %d%s", addr, peer->ttl,
|
|
|
|
VTY_NEWLINE);
|
|
|
|
|
bgpd: RFC 5082 Generalized TTL Security Mechanism support
* bgpd: Add support for RFC 5082 GTSM, which allows the TTL field to be used
to verify that incoming packets have been sent from neighbours no more
than X IP hops away. In other words, this allows packets that were sent from
further away (i.e. not by the neighbour with known distance, and so possibly
a miscreant) to be filtered out.
* lib/sockunion.{c,h}: (sockopt_minttl) new function, to set a minimum TTL
using the IP_MINTTL socket opt.
* bgpd.h: (BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK) define for command
error for minttl.
(struct peer) add a config variable, to store the configured minttl.
(peer_ttl_security_hops_{set,unset}) configuration handlers
* bgpd.c: (peer_group_get) init gtsm_hops
(peer_ebgp_multihop_{un,}set) check for conflicts with GTSM. Multihop and
GTSM can't both be active for a peer at the same time.
(peer_ttl_security_hops_set) set minttl, taking care to avoid conflicts with
ebgp_multihop.
(bgp_config_write_peer) write out minttl as "neighbor .. ttl-security hops X".
* bgp_vty.c: (bgp_vty_return) message for
BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
(peer_ebgp_multihop_{un,}set_vty)
* bgp_network.c: (bgp_accept) set minttl on accepted sockets if appropriate.
(bgp_connect) ditto for outbound.
2011-03-23 16:33:17 +01:00
|
|
|
/* ttl-security hops */
|
2013-09-12 05:37:07 +02:00
|
|
|
if (peer->gtsm_hops != 0)
|
bgpd: RFC 5082 Generalized TTL Security Mechanism support
* bgpd: Add support for RFC 5082 GTSM, which allows the TTL field to be used
to verify that incoming packets have been sent from neighbours no more
than X IP hops away. In other words, this allows packets that were sent from
further away (i.e. not by the neighbour with known distance, and so possibly
a miscreant) to be filtered out.
* lib/sockunion.{c,h}: (sockopt_minttl) new function, to set a minimum TTL
using the IP_MINTTL socket opt.
* bgpd.h: (BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK) define for command
error for minttl.
(struct peer) add a config variable, to store the configured minttl.
(peer_ttl_security_hops_{set,unset}) configuration handlers
* bgpd.c: (peer_group_get) init gtsm_hops
(peer_ebgp_multihop_{un,}set) check for conflicts with GTSM. Multihop and
GTSM can't both be active for a peer at the same time.
(peer_ttl_security_hops_set) set minttl, taking care to avoid conflicts with
ebgp_multihop.
(bgp_config_write_peer) write out minttl as "neighbor .. ttl-security hops X".
* bgp_vty.c: (bgp_vty_return) message for
BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
(peer_ebgp_multihop_{un,}set_vty)
* bgp_network.c: (bgp_accept) set minttl on accepted sockets if appropriate.
(bgp_connect) ditto for outbound.
2011-03-23 16:33:17 +01:00
|
|
|
if (! peer_group_active (peer) || g_peer->gtsm_hops != peer->gtsm_hops)
|
2011-03-24 11:51:59 +01:00
|
|
|
vty_out (vty, " neighbor %s ttl-security hops %d%s", addr,
|
bgpd: RFC 5082 Generalized TTL Security Mechanism support
* bgpd: Add support for RFC 5082 GTSM, which allows the TTL field to be used
to verify that incoming packets have been sent from neighbours no more
than X IP hops away. In other words, this allows packets that were sent from
further away (i.e. not by the neighbour with known distance, and so possibly
a miscreant) to be filtered out.
* lib/sockunion.{c,h}: (sockopt_minttl) new function, to set a minimum TTL
using the IP_MINTTL socket opt.
* bgpd.h: (BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK) define for command
error for minttl.
(struct peer) add a config variable, to store the configured minttl.
(peer_ttl_security_hops_{set,unset}) configuration handlers
* bgpd.c: (peer_group_get) init gtsm_hops
(peer_ebgp_multihop_{un,}set) check for conflicts with GTSM. Multihop and
GTSM can't both be active for a peer at the same time.
(peer_ttl_security_hops_set) set minttl, taking care to avoid conflicts with
ebgp_multihop.
(bgp_config_write_peer) write out minttl as "neighbor .. ttl-security hops X".
* bgp_vty.c: (bgp_vty_return) message for
BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
(peer_ebgp_multihop_{un,}set_vty)
* bgp_network.c: (bgp_accept) set minttl on accepted sockets if appropriate.
(bgp_connect) ditto for outbound.
2011-03-23 16:33:17 +01:00
|
|
|
peer->gtsm_hops, VTY_NEWLINE);
|
|
|
|
|
2005-02-02 15:50:11 +01:00
|
|
|
/* disable-connected-check. */
|
|
|
|
if (CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK))
|
2002-12-13 21:15:29 +01:00
|
|
|
if (! peer_group_active (peer) ||
|
2005-02-02 15:50:11 +01:00
|
|
|
! CHECK_FLAG (g_peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK))
|
|
|
|
vty_out (vty, " neighbor %s disable-connected-check%s", addr, VTY_NEWLINE);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
/* Update-source. */
|
|
|
|
if (peer->update_if)
|
|
|
|
if (! peer_group_active (peer) || ! g_peer->update_if
|
|
|
|
|| strcmp (g_peer->update_if, peer->update_if) != 0)
|
|
|
|
vty_out (vty, " neighbor %s update-source %s%s", addr,
|
|
|
|
peer->update_if, VTY_NEWLINE);
|
|
|
|
if (peer->update_source)
|
|
|
|
if (! peer_group_active (peer) || ! g_peer->update_source
|
|
|
|
|| sockunion_cmp (g_peer->update_source,
|
|
|
|
peer->update_source) != 0)
|
|
|
|
vty_out (vty, " neighbor %s update-source %s%s", addr,
|
|
|
|
sockunion2str (peer->update_source, buf, SU_ADDRSTRLEN),
|
|
|
|
VTY_NEWLINE);
|
|
|
|
|
|
|
|
/* advertisement-interval */
|
2015-05-20 02:40:35 +02:00
|
|
|
if (CHECK_FLAG (peer->config, PEER_CONFIG_ROUTEADV) &&
|
|
|
|
! peer_group_active (peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
vty_out (vty, " neighbor %s advertisement-interval %d%s",
|
|
|
|
addr, peer->v_routeadv, VTY_NEWLINE);
|
|
|
|
|
|
|
|
/* timers. */
|
|
|
|
if (CHECK_FLAG (peer->config, PEER_CONFIG_TIMER)
|
|
|
|
&& ! peer_group_active (peer))
|
|
|
|
vty_out (vty, " neighbor %s timers %d %d%s", addr,
|
|
|
|
peer->keepalive, peer->holdtime, VTY_NEWLINE);
|
|
|
|
|
2015-05-20 02:40:35 +02:00
|
|
|
if (CHECK_FLAG (peer->config, PEER_CONFIG_CONNECT) &&
|
|
|
|
! peer_group_active (peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
vty_out (vty, " neighbor %s timers connect %d%s", addr,
|
|
|
|
peer->connect, VTY_NEWLINE);
|
|
|
|
|
|
|
|
/* Default weight. */
|
|
|
|
if (CHECK_FLAG (peer->config, PEER_CONFIG_WEIGHT))
|
|
|
|
if (! peer_group_active (peer) ||
|
|
|
|
g_peer->weight != peer->weight)
|
|
|
|
vty_out (vty, " neighbor %s weight %d%s", addr, peer->weight,
|
|
|
|
VTY_NEWLINE);
|
|
|
|
|
|
|
|
/* Dynamic capability. */
|
|
|
|
if (CHECK_FLAG (peer->flags, PEER_FLAG_DYNAMIC_CAPABILITY))
|
|
|
|
if (! peer_group_active (peer) ||
|
|
|
|
! CHECK_FLAG (g_peer->flags, PEER_FLAG_DYNAMIC_CAPABILITY))
|
|
|
|
vty_out (vty, " neighbor %s capability dynamic%s", addr,
|
|
|
|
VTY_NEWLINE);
|
|
|
|
|
2015-06-11 18:19:12 +02:00
|
|
|
/* Extended next-hop capability. */
|
|
|
|
if (CHECK_FLAG (peer->flags, PEER_FLAG_CAPABILITY_ENHE))
|
|
|
|
if (! peer_group_active (peer) ||
|
|
|
|
! CHECK_FLAG (g_peer->flags, PEER_FLAG_CAPABILITY_ENHE))
|
|
|
|
vty_out (vty, " neighbor %s capability extended-nexthop%s", addr,
|
|
|
|
VTY_NEWLINE);
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* dont capability negotiation. */
|
|
|
|
if (CHECK_FLAG (peer->flags, PEER_FLAG_DONT_CAPABILITY))
|
|
|
|
if (! peer_group_active (peer) ||
|
|
|
|
! CHECK_FLAG (g_peer->flags, PEER_FLAG_DONT_CAPABILITY))
|
|
|
|
vty_out (vty, " neighbor %s dont-capability-negotiate%s", addr,
|
|
|
|
VTY_NEWLINE);
|
|
|
|
|
|
|
|
/* override capability negotiation. */
|
|
|
|
if (CHECK_FLAG (peer->flags, PEER_FLAG_OVERRIDE_CAPABILITY))
|
|
|
|
if (! peer_group_active (peer) ||
|
|
|
|
! CHECK_FLAG (g_peer->flags, PEER_FLAG_OVERRIDE_CAPABILITY))
|
|
|
|
vty_out (vty, " neighbor %s override-capability%s", addr,
|
|
|
|
VTY_NEWLINE);
|
|
|
|
|
|
|
|
/* strict capability negotiation. */
|
|
|
|
if (CHECK_FLAG (peer->flags, PEER_FLAG_STRICT_CAP_MATCH))
|
|
|
|
if (! peer_group_active (peer) ||
|
|
|
|
! CHECK_FLAG (g_peer->flags, PEER_FLAG_STRICT_CAP_MATCH))
|
|
|
|
vty_out (vty, " neighbor %s strict-capability-match%s", addr,
|
|
|
|
VTY_NEWLINE);
|
|
|
|
|
2012-11-19 12:17:31 +01:00
|
|
|
if (! peer->af_group[AFI_IP][SAFI_UNICAST])
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
if (bgp_flag_check (bgp, BGP_FLAG_NO_DEFAULT_IPV4))
|
|
|
|
{
|
|
|
|
if (peer->afc[AFI_IP][SAFI_UNICAST])
|
|
|
|
vty_out (vty, " neighbor %s activate%s", addr, VTY_NEWLINE);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (! peer->afc[AFI_IP][SAFI_UNICAST])
|
|
|
|
vty_out (vty, " no neighbor %s activate%s", addr, VTY_NEWLINE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/************************************
|
|
|
|
****** Per AF to the neighbor ******
|
|
|
|
************************************/
|
|
|
|
|
|
|
|
if (! (afi == AFI_IP && safi == SAFI_UNICAST))
|
|
|
|
{
|
|
|
|
if (peer->af_group[afi][safi])
|
|
|
|
vty_out (vty, " neighbor %s peer-group %s%s", addr,
|
|
|
|
peer->group->name, VTY_NEWLINE);
|
|
|
|
else
|
|
|
|
vty_out (vty, " neighbor %s activate%s", addr, VTY_NEWLINE);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* ORF capability. */
|
|
|
|
if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_SM)
|
|
|
|
|| CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_RM))
|
|
|
|
if (! peer->af_group[afi][safi])
|
|
|
|
{
|
|
|
|
vty_out (vty, " neighbor %s capability orf prefix-list", addr);
|
|
|
|
|
|
|
|
if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_SM)
|
|
|
|
&& CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_RM))
|
|
|
|
vty_out (vty, " both");
|
|
|
|
else if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_SM))
|
|
|
|
vty_out (vty, " send");
|
|
|
|
else
|
|
|
|
vty_out (vty, " receive");
|
|
|
|
vty_out (vty, "%s", VTY_NEWLINE);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Route reflector client. */
|
|
|
|
if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_REFLECTOR_CLIENT)
|
|
|
|
&& ! peer->af_group[afi][safi])
|
|
|
|
vty_out (vty, " neighbor %s route-reflector-client%s", addr,
|
|
|
|
VTY_NEWLINE);
|
|
|
|
|
|
|
|
/* Nexthop self. */
|
|
|
|
if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_NEXTHOP_SELF)
|
|
|
|
&& ! peer->af_group[afi][safi])
|
2014-04-24 09:22:37 +02:00
|
|
|
vty_out (vty, " neighbor %s next-hop-self%s%s", addr,
|
|
|
|
peer_af_flag_check (peer, afi, safi, PEER_FLAG_NEXTHOP_SELF_ALL) ?
|
|
|
|
" all" : "", VTY_NEWLINE);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2015-05-20 02:57:34 +02:00
|
|
|
/* remove-private-AS */
|
|
|
|
if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_REMOVE_PRIVATE_AS) && !peer->af_group[afi][safi])
|
|
|
|
{
|
|
|
|
if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_REMOVE_PRIVATE_AS_ALL) &&
|
|
|
|
peer_af_flag_check (peer, afi, safi, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE))
|
|
|
|
vty_out (vty, " neighbor %s remove-private-AS all replace-AS%s", addr, VTY_NEWLINE);
|
|
|
|
|
|
|
|
else if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE))
|
|
|
|
vty_out (vty, " neighbor %s remove-private-AS replace-AS%s", addr, VTY_NEWLINE);
|
|
|
|
|
|
|
|
else if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_REMOVE_PRIVATE_AS_ALL))
|
|
|
|
vty_out (vty, " neighbor %s remove-private-AS all%s", addr, VTY_NEWLINE);
|
|
|
|
|
|
|
|
else
|
|
|
|
vty_out (vty, " neighbor %s remove-private-AS%s", addr, VTY_NEWLINE);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2015-05-20 03:03:14 +02:00
|
|
|
/* as-override */
|
|
|
|
if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_AS_OVERRIDE) &&
|
|
|
|
!peer->af_group[afi][safi])
|
|
|
|
vty_out (vty, " neighbor %s as-override%s", addr, VTY_NEWLINE);
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* send-community print. */
|
|
|
|
if (! peer->af_group[afi][safi])
|
|
|
|
{
|
|
|
|
if (bgp_option_check (BGP_OPT_CONFIG_CISCO))
|
|
|
|
{
|
|
|
|
if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_SEND_COMMUNITY)
|
|
|
|
&& peer_af_flag_check (peer, afi, safi, PEER_FLAG_SEND_EXT_COMMUNITY))
|
|
|
|
vty_out (vty, " neighbor %s send-community both%s", addr, VTY_NEWLINE);
|
|
|
|
else if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_SEND_EXT_COMMUNITY))
|
|
|
|
vty_out (vty, " neighbor %s send-community extended%s",
|
|
|
|
addr, VTY_NEWLINE);
|
|
|
|
else if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_SEND_COMMUNITY))
|
|
|
|
vty_out (vty, " neighbor %s send-community%s", addr, VTY_NEWLINE);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (! peer_af_flag_check (peer, afi, safi, PEER_FLAG_SEND_COMMUNITY)
|
|
|
|
&& ! peer_af_flag_check (peer, afi, safi, PEER_FLAG_SEND_EXT_COMMUNITY))
|
|
|
|
vty_out (vty, " no neighbor %s send-community both%s",
|
|
|
|
addr, VTY_NEWLINE);
|
|
|
|
else if (! peer_af_flag_check (peer, afi, safi, PEER_FLAG_SEND_EXT_COMMUNITY))
|
|
|
|
vty_out (vty, " no neighbor %s send-community extended%s",
|
|
|
|
addr, VTY_NEWLINE);
|
|
|
|
else if (! peer_af_flag_check (peer, afi, safi, PEER_FLAG_SEND_COMMUNITY))
|
|
|
|
vty_out (vty, " no neighbor %s send-community%s",
|
|
|
|
addr, VTY_NEWLINE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Default information */
|
|
|
|
if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_DEFAULT_ORIGINATE)
|
|
|
|
&& ! peer->af_group[afi][safi])
|
|
|
|
{
|
|
|
|
vty_out (vty, " neighbor %s default-originate", addr);
|
|
|
|
if (peer->default_rmap[afi][safi].name)
|
|
|
|
vty_out (vty, " route-map %s", peer->default_rmap[afi][safi].name);
|
|
|
|
vty_out (vty, "%s", VTY_NEWLINE);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Soft reconfiguration inbound. */
|
|
|
|
if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
|
|
|
|
if (! peer->af_group[afi][safi] ||
|
|
|
|
! CHECK_FLAG (g_peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
|
|
|
|
vty_out (vty, " neighbor %s soft-reconfiguration inbound%s", addr,
|
|
|
|
VTY_NEWLINE);
|
|
|
|
|
|
|
|
/* maximum-prefix. */
|
|
|
|
if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX))
|
|
|
|
if (! peer->af_group[afi][safi]
|
|
|
|
|| g_peer->pmax[afi][safi] != peer->pmax[afi][safi]
|
2004-05-20 11:19:34 +02:00
|
|
|
|| g_peer->pmax_threshold[afi][safi] != peer->pmax_threshold[afi][safi]
|
2002-12-13 21:15:29 +01:00
|
|
|
|| CHECK_FLAG (g_peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING)
|
|
|
|
!= CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING))
|
2004-05-20 11:19:34 +02:00
|
|
|
{
|
2005-02-01 21:57:17 +01:00
|
|
|
vty_out (vty, " neighbor %s maximum-prefix %ld", addr, peer->pmax[afi][safi]);
|
|
|
|
if (peer->pmax_threshold[afi][safi] != MAXIMUM_PREFIX_THRESHOLD_DEFAULT)
|
|
|
|
vty_out (vty, " %d", peer->pmax_threshold[afi][safi]);
|
|
|
|
if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING))
|
|
|
|
vty_out (vty, " warning-only");
|
|
|
|
if (peer->pmax_restart[afi][safi])
|
|
|
|
vty_out (vty, " restart %d", peer->pmax_restart[afi][safi]);
|
|
|
|
vty_out (vty, "%s", VTY_NEWLINE);
|
2004-05-20 11:19:34 +02:00
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
/* Route server client. */
|
|
|
|
if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT)
|
|
|
|
&& ! peer->af_group[afi][safi])
|
|
|
|
vty_out (vty, " neighbor %s route-server-client%s", addr, VTY_NEWLINE);
|
|
|
|
|
2011-10-27 13:28:17 +02:00
|
|
|
/* Nexthop-local unchanged. */
|
|
|
|
if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED)
|
|
|
|
&& ! peer->af_group[afi][safi])
|
|
|
|
vty_out (vty, " neighbor %s nexthop-local unchanged%s", addr, VTY_NEWLINE);
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* Allow AS in. */
|
|
|
|
if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_ALLOWAS_IN))
|
|
|
|
if (! peer_group_active (peer)
|
|
|
|
|| ! peer_af_flag_check (g_peer, afi, safi, PEER_FLAG_ALLOWAS_IN)
|
|
|
|
|| peer->allowas_in[afi][safi] != g_peer->allowas_in[afi][safi])
|
|
|
|
{
|
|
|
|
if (peer->allowas_in[afi][safi] == 3)
|
|
|
|
vty_out (vty, " neighbor %s allowas-in%s", addr, VTY_NEWLINE);
|
|
|
|
else
|
|
|
|
vty_out (vty, " neighbor %s allowas-in %d%s", addr,
|
|
|
|
peer->allowas_in[afi][safi], VTY_NEWLINE);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Filter. */
|
|
|
|
bgp_config_write_filter (vty, peer, afi, safi);
|
|
|
|
|
|
|
|
/* atribute-unchanged. */
|
|
|
|
if ((CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_AS_PATH_UNCHANGED)
|
|
|
|
|| CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_NEXTHOP_UNCHANGED)
|
|
|
|
|| CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MED_UNCHANGED))
|
|
|
|
&& ! peer->af_group[afi][safi])
|
|
|
|
{
|
|
|
|
if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_AS_PATH_UNCHANGED)
|
|
|
|
&& CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_NEXTHOP_UNCHANGED)
|
|
|
|
&& CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MED_UNCHANGED))
|
|
|
|
vty_out (vty, " neighbor %s attribute-unchanged%s", addr, VTY_NEWLINE);
|
|
|
|
else
|
|
|
|
vty_out (vty, " neighbor %s attribute-unchanged%s%s%s%s", addr,
|
|
|
|
(CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_AS_PATH_UNCHANGED)) ?
|
|
|
|
" as-path" : "",
|
|
|
|
(CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_NEXTHOP_UNCHANGED)) ?
|
|
|
|
" next-hop" : "",
|
|
|
|
(CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MED_UNCHANGED)) ?
|
|
|
|
" med" : "", VTY_NEWLINE);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Display "address-family" configuration header. */
|
|
|
|
void
|
|
|
|
bgp_config_write_family_header (struct vty *vty, afi_t afi, safi_t safi,
|
|
|
|
int *write)
|
|
|
|
{
|
|
|
|
if (*write)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (afi == AFI_IP && safi == SAFI_UNICAST)
|
|
|
|
return;
|
|
|
|
|
|
|
|
vty_out (vty, "!%s address-family ", VTY_NEWLINE);
|
|
|
|
|
|
|
|
if (afi == AFI_IP)
|
|
|
|
{
|
|
|
|
if (safi == SAFI_MULTICAST)
|
|
|
|
vty_out (vty, "ipv4 multicast");
|
|
|
|
else if (safi == SAFI_MPLS_VPN)
|
|
|
|
vty_out (vty, "vpnv4 unicast");
|
|
|
|
}
|
|
|
|
else if (afi == AFI_IP6)
|
2007-04-10 21:20:29 +02:00
|
|
|
{
|
|
|
|
vty_out (vty, "ipv6");
|
|
|
|
|
|
|
|
if (safi == SAFI_MULTICAST)
|
|
|
|
vty_out (vty, " multicast");
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
vty_out (vty, "%s", VTY_NEWLINE);
|
|
|
|
|
|
|
|
*write = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Address family based peer configuration display. */
|
2005-06-28 14:44:16 +02:00
|
|
|
static int
|
2002-12-13 21:15:29 +01:00
|
|
|
bgp_config_write_family (struct vty *vty, struct bgp *bgp, afi_t afi,
|
|
|
|
safi_t safi)
|
|
|
|
{
|
|
|
|
int write = 0;
|
|
|
|
struct peer *peer;
|
|
|
|
struct peer_group *group;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
bgp_config_write_network (vty, bgp, afi, safi, &write);
|
|
|
|
|
|
|
|
bgp_config_write_redistribute (vty, bgp, afi, safi, &write);
|
|
|
|
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (bgp->group, node, nnode, group))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
if (group->conf->afc[afi][safi])
|
|
|
|
{
|
|
|
|
bgp_config_write_family_header (vty, afi, safi, &write);
|
|
|
|
bgp_config_write_peer (vty, bgp, group->conf, afi, safi);
|
|
|
|
}
|
|
|
|
}
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
2015-05-20 03:03:47 +02:00
|
|
|
/* Skip dynamic neighbors. */
|
|
|
|
if (peer_dynamic_neighbor (peer))
|
|
|
|
continue;
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
if (peer->afc[afi][safi])
|
|
|
|
{
|
2015-05-20 02:40:37 +02:00
|
|
|
if (CHECK_FLAG (peer->flags, PEER_FLAG_CONFIG_NODE))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
bgp_config_write_family_header (vty, afi, safi, &write);
|
|
|
|
bgp_config_write_peer (vty, bgp, peer, afi, safi);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2011-07-21 05:43:22 +02:00
|
|
|
|
|
|
|
bgp_config_write_maxpaths (vty, bgp, afi, safi, &write);
|
bgpd: bgpd-table-map.patch
COMMAND:
table-map <route-map-name>
DESCRIPTION:
This feature is used to apply a route-map on route updates from BGP to Zebra.
All the applicable match operations are allowed, such as match on prefix,
next-hop, communities, etc. Set operations for this attach-point are limited
to metric and next-hop only. Any operation of this feature does not affect
BGPs internal RIB.
Supported for ipv4 and ipv6 address families. It works on multi-paths as well,
however, metric setting is based on the best-path only.
IMPLEMENTATION NOTES:
The route-map application at this point is not supposed to modify any of BGP
route's attributes (anything in bgp_info for that matter). To achieve that,
creating a copy of the bgp_attr was inevitable. Implementation tries to keep
the memory footprint low, code comments do point out the rationale behind a
few choices made.
bgp_zebra_announce() was already a big routine, adding this feature would
extend it further. Patch has created a few smaller routines/macros whereever
possible to keep the size of the routine in check without compromising on the
readability of the code/flow inside this routine.
For updating a partially filtered route (with its nexthops), BGP to Zebra
replacement semantic of the next-hops serves the purpose well. However, with
this patch there could be some redundant withdraws each time BGP announces a
route thats (all the nexthops) gets denied by the route-map application.
Handling of this case could be optimized by keeping state with the prefix and
the nexthops in BGP. The patch doesn't optimizing that case, as even with the
redundant withdraws the total number of updates to zebra are still be capped
by the total number of routes in the table.
Signed-off-by: Vipin Kumar <vipin@cumulusnetworks.com>
Reviewed-by: Pradosh Mohapatra <pmohapat@cumulusnetworks.com>
2015-05-20 02:40:34 +02:00
|
|
|
bgp_config_write_table_map (vty, bgp, afi, safi, &write);
|
2011-07-21 05:43:22 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
if (write)
|
|
|
|
vty_out (vty, " exit-address-family%s", VTY_NEWLINE);
|
|
|
|
|
|
|
|
return write;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
bgp_config_write (struct vty *vty)
|
|
|
|
{
|
|
|
|
int write = 0;
|
|
|
|
struct bgp *bgp;
|
|
|
|
struct peer_group *group;
|
|
|
|
struct peer *peer;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
|
|
|
struct listnode *mnode, *mnnode;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
/* BGP Multiple instance. */
|
|
|
|
if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE))
|
|
|
|
{
|
|
|
|
vty_out (vty, "bgp multiple-instance%s", VTY_NEWLINE);
|
|
|
|
write++;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* BGP Config type. */
|
|
|
|
if (bgp_option_check (BGP_OPT_CONFIG_CISCO))
|
|
|
|
{
|
|
|
|
vty_out (vty, "bgp config-type cisco%s", VTY_NEWLINE);
|
|
|
|
write++;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* BGP configuration. */
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (bm->bgp, mnode, mnnode, bgp))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
if (write)
|
|
|
|
vty_out (vty, "!%s", VTY_NEWLINE);
|
|
|
|
|
|
|
|
/* Router bgp ASN */
|
2009-04-30 15:16:22 +02:00
|
|
|
vty_out (vty, "router bgp %u", bgp->as);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE))
|
|
|
|
{
|
|
|
|
if (bgp->name)
|
|
|
|
vty_out (vty, " view %s", bgp->name);
|
|
|
|
}
|
|
|
|
vty_out (vty, "%s", VTY_NEWLINE);
|
|
|
|
|
|
|
|
/* No Synchronization */
|
|
|
|
if (bgp_option_check (BGP_OPT_CONFIG_CISCO))
|
|
|
|
vty_out (vty, " no synchronization%s", VTY_NEWLINE);
|
|
|
|
|
|
|
|
/* BGP fast-external-failover. */
|
|
|
|
if (CHECK_FLAG (bgp->flags, BGP_FLAG_NO_FAST_EXT_FAILOVER))
|
|
|
|
vty_out (vty, " no bgp fast-external-failover%s", VTY_NEWLINE);
|
|
|
|
|
|
|
|
/* BGP router ID. */
|
|
|
|
if (CHECK_FLAG (bgp->config, BGP_CONFIG_ROUTER_ID))
|
|
|
|
vty_out (vty, " bgp router-id %s%s", inet_ntoa (bgp->router_id),
|
|
|
|
VTY_NEWLINE);
|
|
|
|
|
2003-08-13 02:32:49 +02:00
|
|
|
/* BGP log-neighbor-changes. */
|
|
|
|
if (bgp_flag_check (bgp, BGP_FLAG_LOG_NEIGHBOR_CHANGES))
|
|
|
|
vty_out (vty, " bgp log-neighbor-changes%s", VTY_NEWLINE);
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* BGP configuration. */
|
|
|
|
if (bgp_flag_check (bgp, BGP_FLAG_ALWAYS_COMPARE_MED))
|
|
|
|
vty_out (vty, " bgp always-compare-med%s", VTY_NEWLINE);
|
|
|
|
|
|
|
|
/* BGP default ipv4-unicast. */
|
|
|
|
if (bgp_flag_check (bgp, BGP_FLAG_NO_DEFAULT_IPV4))
|
|
|
|
vty_out (vty, " no bgp default ipv4-unicast%s", VTY_NEWLINE);
|
|
|
|
|
|
|
|
/* BGP default local-preference. */
|
|
|
|
if (bgp->default_local_pref != BGP_DEFAULT_LOCAL_PREF)
|
|
|
|
vty_out (vty, " bgp default local-preference %d%s",
|
|
|
|
bgp->default_local_pref, VTY_NEWLINE);
|
|
|
|
|
2015-05-20 03:29:16 +02:00
|
|
|
/* BGP default show-hostname */
|
|
|
|
if (bgp_flag_check(bgp, BGP_FLAG_SHOW_HOSTNAME))
|
|
|
|
vty_out (vty, " bgp default show-hostname%s", VTY_NEWLINE);
|
|
|
|
|
2015-05-20 03:03:47 +02:00
|
|
|
/* BGP default subgroup-pkt-queue-max. */
|
|
|
|
if (bgp->default_subgroup_pkt_queue_max != BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX)
|
|
|
|
vty_out (vty, " bgp default subgroup-pkt-queue-max %d%s",
|
|
|
|
bgp->default_subgroup_pkt_queue_max, VTY_NEWLINE);
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* BGP client-to-client reflection. */
|
|
|
|
if (bgp_flag_check (bgp, BGP_FLAG_NO_CLIENT_TO_CLIENT))
|
|
|
|
vty_out (vty, " no bgp client-to-client reflection%s", VTY_NEWLINE);
|
|
|
|
|
|
|
|
/* BGP cluster ID. */
|
|
|
|
if (CHECK_FLAG (bgp->config, BGP_CONFIG_CLUSTER_ID))
|
|
|
|
vty_out (vty, " bgp cluster-id %s%s", inet_ntoa (bgp->cluster_id),
|
|
|
|
VTY_NEWLINE);
|
|
|
|
|
2015-05-20 03:03:49 +02:00
|
|
|
/* Disable ebgp connected nexthop check */
|
|
|
|
if (bgp_flag_check (bgp, BGP_FLAG_DISABLE_NH_CONNECTED_CHK))
|
|
|
|
vty_out (vty, " bgp disable-ebgp-connected-route-check%s", VTY_NEWLINE);
|
|
|
|
|
2004-05-20 11:19:34 +02:00
|
|
|
/* Confederation identifier*/
|
2002-12-13 21:15:29 +01:00
|
|
|
if (CHECK_FLAG (bgp->config, BGP_CONFIG_CONFEDERATION))
|
2004-05-20 11:19:34 +02:00
|
|
|
vty_out (vty, " bgp confederation identifier %i%s", bgp->confed_id,
|
|
|
|
VTY_NEWLINE);
|
|
|
|
|
|
|
|
/* Confederation peer */
|
|
|
|
if (bgp->confed_peers_cnt > 0)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
2004-05-20 11:19:34 +02:00
|
|
|
int i;
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2004-05-20 11:19:34 +02:00
|
|
|
vty_out (vty, " bgp confederation peers");
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2004-05-20 11:19:34 +02:00
|
|
|
for (i = 0; i < bgp->confed_peers_cnt; i++)
|
2009-04-30 15:16:22 +02:00
|
|
|
vty_out(vty, " %u", bgp->confed_peers[i]);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
2004-05-20 11:19:34 +02:00
|
|
|
vty_out (vty, "%s", VTY_NEWLINE);
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/* BGP enforce-first-as. */
|
|
|
|
if (bgp_flag_check (bgp, BGP_FLAG_ENFORCE_FIRST_AS))
|
|
|
|
vty_out (vty, " bgp enforce-first-as%s", VTY_NEWLINE);
|
|
|
|
|
|
|
|
/* BGP deterministic-med. */
|
|
|
|
if (bgp_flag_check (bgp, BGP_FLAG_DETERMINISTIC_MED))
|
|
|
|
vty_out (vty, " bgp deterministic-med%s", VTY_NEWLINE);
|
2004-05-21 11:31:30 +02:00
|
|
|
|
bgpd: bgpd-update-delay.patch
COMMAND:
'update-delay <max-delay in seconds> [<establish-wait in seconds>]'
DESCRIPTION:
This feature is used to enable read-only mode on BGP process restart or when
BGP process is cleared using 'clear ip bgp *'. When applicable, read-only mode
would begin as soon as the first peer reaches Established state and a timer
for <max-delay> seconds is started.
During this mode BGP doesn't run any best-path or generate any updates to its
peers. This mode continues until:
1. All the configured peers, except the shutdown peers, have sent explicit EOR
(End-Of-RIB) or an implicit-EOR. The first keep-alive after BGP has reached
Established is considered an implicit-EOR.
If the <establish-wait> optional value is given, then BGP will wait for
peers to reach establish from the begining of the update-delay till the
establish-wait period is over, i.e. the minimum set of established peers for
which EOR is expected would be peers established during the establish-wait
window, not necessarily all the configured neighbors.
2. max-delay period is over.
On hitting any of the above two conditions, BGP resumes the decision process
and generates updates to its peers.
Default <max-delay> is 0, i.e. the feature is off by default.
This feature can be useful in reducing CPU/network used as BGP restarts/clears.
Particularly useful in the topologies where BGP learns a prefix from many peers.
Intermediate bestpaths are possible for the same prefix as peers get established
and start receiving updates at different times. This feature should offer a
value-add if the network has a high number of such prefixes.
IMPLEMENTATION OBJECTIVES:
Given this is an optional feature, minimized the code-churn. Used existing
constructs wherever possible (existing queue-plug/unplug were used to achieve
delay and resume of best-paths/update-generation). As a result, no new
data-structure(s) had to be defined and allocated. When the feature is disabled,
the new node is not exercised for the most part.
Signed-off-by: Vipin Kumar <vipin@cumulusnetworks.com>
Reviewed-by: Pradosh Mohapatra <pmohapat@cumulusnetworks.com>
Dinesh Dutt <ddutt@cumulusnetworks.com>
2015-05-20 02:40:33 +02:00
|
|
|
/* BGP update-delay. */
|
|
|
|
bgp_config_write_update_delay (vty, bgp);
|
|
|
|
|
2015-05-20 02:40:42 +02:00
|
|
|
if (bgp->v_maxmed_onstartup != BGP_MAXMED_ONSTARTUP_UNCONFIGURED)
|
|
|
|
{
|
|
|
|
vty_out (vty, " bgp max-med on-startup %d", bgp->v_maxmed_onstartup);
|
|
|
|
if (bgp->maxmed_onstartup_value != BGP_MAXMED_VALUE_DEFAULT)
|
|
|
|
vty_out (vty, " %d", bgp->maxmed_onstartup_value);
|
|
|
|
vty_out (vty, "%s", VTY_NEWLINE);
|
|
|
|
}
|
|
|
|
if (bgp->v_maxmed_admin != BGP_MAXMED_ADMIN_UNCONFIGURED)
|
|
|
|
{
|
|
|
|
vty_out (vty, " bgp max-med administrative");
|
|
|
|
if (bgp->maxmed_admin_value != BGP_MAXMED_VALUE_DEFAULT)
|
|
|
|
vty_out (vty, " %d", bgp->maxmed_admin_value);
|
|
|
|
vty_out (vty, "%s", VTY_NEWLINE);
|
|
|
|
}
|
|
|
|
|
bgpd: bgpd-mrai.patch
BGP: Event-driven route announcement taking into account min route advertisement interval
ISSUE
BGP starts the routeadv timer (peer->t_routeadv) to expire in 1 sec
when a peer is established. From then on, the timer expires
periodically based on the configured MRAI value (default: 30sec for
EBGP, 5sec for IBGP). At the expiry, the write thread is triggered
that takes the routes from peer's sync FIFO (adj-rib-out) and sends
UPDATEs. This has a few drawbacks:
(1) Delay in new route announcement: Even when the last UPDATE message
was sent a while back, the next route change will necessarily have
to wait for routeadv expiry
(2) CPU usage: The timer is always armed. If the operator chooses to
configure a lower value of MRAI (zero second is a preferred choice
in many deployments) for better convergence, it leads to high CPU
usage for BGP process, even at the times of no network churn.
PATCH
Make the route advertisement event-driven - When routes are added to
peer's sync FIFO, check if the routeadv timer needs to be adjusted (or
started). Conversely, do not arm the routeadv timer unconditionally.
The patch also addresses route announcements during read-only mode
(update-delay). During read-only mode operation, the routeadv timer
is not started. When BGP comes out of read-only mode and all the
routes are processed, the timer is started for all peers with zero
expiry, so that the UPDATEs can be sent all at once. This leads to
(near-)optimal UPDATE packing.
Finally, the patch makes the "max # packets to write to peer socket at
a time" configurable. Currently it is hard-coded to 10. The command is
at the top router-bgp mode and is called "write-quanta <number>". It
is a useful convergence parameter to tweak.
Signed-off-by: Pradosh Mohapatra <pmohapat@cumulusnetworks.com>
Reviewed-by: Daniel Walton <dwalton@cumulusnetworks.com>
2015-05-20 02:40:37 +02:00
|
|
|
/* write quanta */
|
|
|
|
bgp_config_write_wpkt_quanta (vty, bgp);
|
|
|
|
|
2015-05-20 03:03:47 +02:00
|
|
|
/* coalesce time */
|
|
|
|
bgp_config_write_coalesce_time(vty, bgp);
|
|
|
|
|
2004-05-21 11:31:30 +02:00
|
|
|
/* BGP graceful-restart. */
|
2005-02-02 15:40:33 +01:00
|
|
|
if (bgp->stalepath_time != BGP_DEFAULT_STALEPATH_TIME)
|
|
|
|
vty_out (vty, " bgp graceful-restart stalepath-time %d%s",
|
|
|
|
bgp->stalepath_time, VTY_NEWLINE);
|
2004-05-21 11:31:30 +02:00
|
|
|
if (bgp_flag_check (bgp, BGP_FLAG_GRACEFUL_RESTART))
|
|
|
|
vty_out (vty, " bgp graceful-restart%s", VTY_NEWLINE);
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* BGP bestpath method. */
|
|
|
|
if (bgp_flag_check (bgp, BGP_FLAG_ASPATH_IGNORE))
|
|
|
|
vty_out (vty, " bgp bestpath as-path ignore%s", VTY_NEWLINE);
|
2005-04-08 17:40:36 +02:00
|
|
|
if (bgp_flag_check (bgp, BGP_FLAG_ASPATH_CONFED))
|
|
|
|
vty_out (vty, " bgp bestpath as-path confed%s", VTY_NEWLINE);
|
2015-05-20 03:03:58 +02:00
|
|
|
|
2013-09-07 09:02:36 +02:00
|
|
|
if (bgp_flag_check (bgp, BGP_FLAG_ASPATH_MULTIPATH_RELAX)) {
|
2015-05-20 03:03:58 +02:00
|
|
|
if (bgp_flag_check (bgp, BGP_FLAG_MULTIPATH_RELAX_NO_AS_SET)) {
|
|
|
|
vty_out (vty, " bgp bestpath as-path multipath-relax no-as-set%s", VTY_NEWLINE);
|
|
|
|
} else {
|
|
|
|
vty_out (vty, " bgp bestpath as-path multipath-relax%s", VTY_NEWLINE);
|
|
|
|
}
|
2013-09-07 09:02:36 +02:00
|
|
|
}
|
2015-05-20 03:03:58 +02:00
|
|
|
|
2015-05-20 02:40:41 +02:00
|
|
|
if (bgp_flag_check (bgp, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY)) {
|
|
|
|
vty_out (vty, " bgp route-reflector allow-outbound-policy%s",
|
|
|
|
VTY_NEWLINE);
|
|
|
|
}
|
2002-12-13 21:15:29 +01:00
|
|
|
if (bgp_flag_check (bgp, BGP_FLAG_COMPARE_ROUTER_ID))
|
|
|
|
vty_out (vty, " bgp bestpath compare-routerid%s", VTY_NEWLINE);
|
|
|
|
if (bgp_flag_check (bgp, BGP_FLAG_MED_CONFED)
|
|
|
|
|| bgp_flag_check (bgp, BGP_FLAG_MED_MISSING_AS_WORST))
|
|
|
|
{
|
|
|
|
vty_out (vty, " bgp bestpath med");
|
|
|
|
if (bgp_flag_check (bgp, BGP_FLAG_MED_CONFED))
|
|
|
|
vty_out (vty, " confed");
|
|
|
|
if (bgp_flag_check (bgp, BGP_FLAG_MED_MISSING_AS_WORST))
|
|
|
|
vty_out (vty, " missing-as-worst");
|
|
|
|
vty_out (vty, "%s", VTY_NEWLINE);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* BGP network import check. */
|
2015-05-20 03:04:20 +02:00
|
|
|
if (bgp_flag_check (bgp, BGP_FLAG_IMPORT_CHECK_EXACT_MATCH))
|
|
|
|
vty_out (vty, " bgp network import-check exact%s", VTY_NEWLINE);
|
|
|
|
else if (bgp_flag_check (bgp, BGP_FLAG_IMPORT_CHECK))
|
2002-12-13 21:15:29 +01:00
|
|
|
vty_out (vty, " bgp network import-check%s", VTY_NEWLINE);
|
|
|
|
|
|
|
|
/* BGP flag dampening. */
|
|
|
|
if (CHECK_FLAG (bgp->af_flags[AFI_IP][SAFI_UNICAST],
|
|
|
|
BGP_CONFIG_DAMPENING))
|
|
|
|
bgp_config_write_damp (vty);
|
|
|
|
|
|
|
|
/* BGP static route configuration. */
|
|
|
|
bgp_config_write_network (vty, bgp, AFI_IP, SAFI_UNICAST, &write);
|
|
|
|
|
|
|
|
/* BGP redistribute configuration. */
|
|
|
|
bgp_config_write_redistribute (vty, bgp, AFI_IP, SAFI_UNICAST, &write);
|
|
|
|
|
|
|
|
/* BGP timers configuration. */
|
|
|
|
if (bgp->default_keepalive != BGP_DEFAULT_KEEPALIVE
|
|
|
|
&& bgp->default_holdtime != BGP_DEFAULT_HOLDTIME)
|
|
|
|
vty_out (vty, " timers bgp %d %d%s", bgp->default_keepalive,
|
|
|
|
bgp->default_holdtime, VTY_NEWLINE);
|
|
|
|
|
2015-05-20 02:40:45 +02:00
|
|
|
if (bgp->rmap_update_timer != RMAP_DEFAULT_UPDATE_TIMER)
|
|
|
|
vty_out (vty, " bgp route-map delay-timer %d%s", bgp->rmap_update_timer,
|
|
|
|
VTY_NEWLINE);
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* peer-group */
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (bgp->group, node, nnode, group))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
bgp_config_write_peer (vty, bgp, group->conf, AFI_IP, SAFI_UNICAST);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Normal neighbor configuration. */
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
2015-05-20 02:40:37 +02:00
|
|
|
if (CHECK_FLAG (peer->flags, PEER_FLAG_CONFIG_NODE))
|
2002-12-13 21:15:29 +01:00
|
|
|
bgp_config_write_peer (vty, bgp, peer, AFI_IP, SAFI_UNICAST);
|
|
|
|
}
|
|
|
|
|
2011-07-21 05:43:22 +02:00
|
|
|
/* maximum-paths */
|
|
|
|
bgp_config_write_maxpaths (vty, bgp, AFI_IP, SAFI_UNICAST, &write);
|
bgpd: bgpd-table-map.patch
COMMAND:
table-map <route-map-name>
DESCRIPTION:
This feature is used to apply a route-map on route updates from BGP to Zebra.
All the applicable match operations are allowed, such as match on prefix,
next-hop, communities, etc. Set operations for this attach-point are limited
to metric and next-hop only. Any operation of this feature does not affect
BGPs internal RIB.
Supported for ipv4 and ipv6 address families. It works on multi-paths as well,
however, metric setting is based on the best-path only.
IMPLEMENTATION NOTES:
The route-map application at this point is not supposed to modify any of BGP
route's attributes (anything in bgp_info for that matter). To achieve that,
creating a copy of the bgp_attr was inevitable. Implementation tries to keep
the memory footprint low, code comments do point out the rationale behind a
few choices made.
bgp_zebra_announce() was already a big routine, adding this feature would
extend it further. Patch has created a few smaller routines/macros whereever
possible to keep the size of the routine in check without compromising on the
readability of the code/flow inside this routine.
For updating a partially filtered route (with its nexthops), BGP to Zebra
replacement semantic of the next-hops serves the purpose well. However, with
this patch there could be some redundant withdraws each time BGP announces a
route thats (all the nexthops) gets denied by the route-map application.
Handling of this case could be optimized by keeping state with the prefix and
the nexthops in BGP. The patch doesn't optimizing that case, as even with the
redundant withdraws the total number of updates to zebra are still be capped
by the total number of routes in the table.
Signed-off-by: Vipin Kumar <vipin@cumulusnetworks.com>
Reviewed-by: Pradosh Mohapatra <pmohapat@cumulusnetworks.com>
2015-05-20 02:40:34 +02:00
|
|
|
bgp_config_write_table_map (vty, bgp, AFI_IP, SAFI_UNICAST, &write);
|
2011-07-21 05:43:22 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* Distance configuration. */
|
|
|
|
bgp_config_write_distance (vty, bgp);
|
|
|
|
|
2015-05-20 03:03:47 +02:00
|
|
|
/* listen range and limit for dynamic BGP neighbors */
|
|
|
|
bgp_config_write_listen (vty, bgp);
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* No auto-summary */
|
|
|
|
if (bgp_option_check (BGP_OPT_CONFIG_CISCO))
|
|
|
|
vty_out (vty, " no auto-summary%s", VTY_NEWLINE);
|
|
|
|
|
|
|
|
/* IPv4 multicast configuration. */
|
|
|
|
write += bgp_config_write_family (vty, bgp, AFI_IP, SAFI_MULTICAST);
|
|
|
|
|
|
|
|
/* IPv4 VPN configuration. */
|
|
|
|
write += bgp_config_write_family (vty, bgp, AFI_IP, SAFI_MPLS_VPN);
|
|
|
|
|
|
|
|
/* IPv6 unicast configuration. */
|
|
|
|
write += bgp_config_write_family (vty, bgp, AFI_IP6, SAFI_UNICAST);
|
|
|
|
|
2007-04-10 21:20:29 +02:00
|
|
|
/* IPv6 multicast configuration. */
|
|
|
|
write += bgp_config_write_family (vty, bgp, AFI_IP6, SAFI_MULTICAST);
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
write++;
|
|
|
|
}
|
|
|
|
return write;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2005-06-28 14:44:16 +02:00
|
|
|
bgp_master_init (void)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
|
|
|
memset (&bgp_master, 0, sizeof (struct bgp_master));
|
|
|
|
|
|
|
|
bm = &bgp_master;
|
|
|
|
bm->bgp = list_new ();
|
[bgpd] TCP-MD5: password vty configuration and initial Linux support
2008-07-21 Paul Jakma <paul.jakma@sun.com>
* bgp_packet.c: (bgp_open_receive) fix warning in a zlog call
* bgp_vty.c: (bgp_vty_return) add return code
* bgpd.c: (bgp_master_init) setup the socket list.
* bgp_network.c: Remove the dual IPv4/6 socket thing for now, which
was implemented by Michael, until such time as its clear its
required for Linux (see sockopt comments). IPv6 support, including
IPv4 sessions on AF_INET6 sockets, therefore is broken, and the
'-l 0.0.0.0' arguments would need to be given to bgpd to make
things work here.
2008-07-21 Michael H. Warfield <mhw@wittsend.com>
YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Tomohiko Kusuda <kusuda@inetcore.com>
Leigh Brown <leigh@solinno.co.uk>
* bgp_network.c: (bgp_md5_set_one) shim between libzebra tcp-md5
sockopt and bgpd.
(bgp_md5_set_socket) Helper for bgp_connect
(bgp_md5_set) setup TCP-MD5SIG for the given peer.
(bgp_connect) call out to bgp_md5_set_socket for the outgoing
connect socket.
(bgp_socket) save references to the listen sockets, needed if
TCP-MD5SIG is applied later or changed.
* bgp_vty.c: (*neighbor_password_cmd) New 'neighbor ... password'
commands.
* bgpd.c: (peer_{new,delete) manage TCP-MD5 password
(peer_group2peer_config_copy) inherit TCP-MD5 password
(peer_password_{un,}set) orchestrate the whole add/remove of TCP-MD5
passwords: applying checks, stopping peers, and trying to return
errors to UI, etc.
(bgp_config_write_peer) save password.
Fix missing newline in writeout of neighbor ... port.
2008-07-21 Paul Jakma <paul.jakma@sun.com>
* sockunion.c: ifdef out various places that converted
v4mapped sockets to pure v4. Doesn't seem necessary at all,
presumably a workaround for now historical inet_ntop bugs (?)
2008-07-21 Michael H. Warfield <mhw@wittsend.com>
YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
* sockopt.{c,h}: (sockopt_tcp_signature) Add TCP-MD5SIG support.
2008-07-21 23:02:49 +02:00
|
|
|
bm->listen_sockets = list_new ();
|
2002-12-13 21:15:29 +01:00
|
|
|
bm->port = BGP_PORT_DEFAULT;
|
|
|
|
bm->master = thread_master_create ();
|
2010-01-15 14:22:10 +01:00
|
|
|
bm->start_time = bgp_clock ();
|
2002-12-13 21:15:29 +01:00
|
|
|
}
|
2005-06-01 Paul Jakma <paul.jakma@sun.com>
* 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
2005-06-01 13:17:05 +02:00
|
|
|
|
2014-06-04 06:53:35 +02:00
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
void
|
2005-06-28 14:44:16 +02:00
|
|
|
bgp_init (void)
|
2002-12-13 21:15:29 +01:00
|
|
|
{
|
2015-05-20 02:47:21 +02:00
|
|
|
|
|
|
|
/* allocates some vital data structures used by peer commands in vty_init */
|
|
|
|
bgp_scan_init ();
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
/* Init zebra. */
|
|
|
|
bgp_zebra_init ();
|
|
|
|
|
2015-05-20 02:47:21 +02:00
|
|
|
/* BGP VTY commands installation. */
|
|
|
|
bgp_vty_init ();
|
|
|
|
|
2002-12-13 21:15:29 +01:00
|
|
|
/* BGP inits. */
|
|
|
|
bgp_attr_init ();
|
|
|
|
bgp_debug_init ();
|
|
|
|
bgp_dump_init ();
|
|
|
|
bgp_route_init ();
|
|
|
|
bgp_route_map_init ();
|
2012-05-07 18:52:52 +02:00
|
|
|
bgp_address_init ();
|
2015-05-20 02:47:21 +02:00
|
|
|
bgp_scan_vty_init();
|
2002-12-13 21:15:29 +01:00
|
|
|
bgp_mplsvpn_init ();
|
|
|
|
|
|
|
|
/* Access list initialize. */
|
|
|
|
access_list_init ();
|
|
|
|
access_list_add_hook (peer_distribute_update);
|
|
|
|
access_list_delete_hook (peer_distribute_update);
|
|
|
|
|
|
|
|
/* Filter list initialize. */
|
|
|
|
bgp_filter_init ();
|
2015-05-20 02:40:45 +02:00
|
|
|
as_list_add_hook (peer_aslist_add);
|
|
|
|
as_list_delete_hook (peer_aslist_del);
|
2002-12-13 21:15:29 +01:00
|
|
|
|
|
|
|
/* Prefix list initialize.*/
|
|
|
|
prefix_list_init ();
|
|
|
|
prefix_list_add_hook (peer_prefix_list_update);
|
|
|
|
prefix_list_delete_hook (peer_prefix_list_update);
|
|
|
|
|
|
|
|
/* Community list initialize. */
|
|
|
|
bgp_clist = community_list_init ();
|
|
|
|
|
|
|
|
#ifdef HAVE_SNMP
|
|
|
|
bgp_snmp_init ();
|
|
|
|
#endif /* HAVE_SNMP */
|
|
|
|
}
|
2004-04-20 17:13:15 +02:00
|
|
|
|
|
|
|
void
|
2009-02-09 19:14:16 +01:00
|
|
|
bgp_terminate (void)
|
2004-04-20 17:13:15 +02:00
|
|
|
{
|
|
|
|
struct bgp *bgp;
|
|
|
|
struct peer *peer;
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
struct listnode *node, *nnode;
|
|
|
|
struct listnode *mnode, *mnnode;
|
2004-04-20 17:13:15 +02:00
|
|
|
|
2015-05-20 02:40:37 +02:00
|
|
|
/* Close the listener sockets first as this prevents peers from attempting
|
|
|
|
* to reconnect on receiving the peer unconfig message. In the presence
|
|
|
|
* of a large number of peers this will ensure that no peer is left with
|
|
|
|
* a dangling connection
|
|
|
|
*/
|
|
|
|
/* reverse bgp_master_init */
|
|
|
|
bgp_close();
|
|
|
|
if (bm->listen_sockets)
|
|
|
|
list_free(bm->listen_sockets);
|
|
|
|
bm->listen_sockets = NULL;
|
|
|
|
|
2005-04-07 Paul Jakma <paul.jakma@sun.com>
* (global): Fix up list loops to match changes in lib/linklist,
and some basic auditing of usage.
* configure.ac: define QUAGGA_NO_DEPRECATED_INTERFACES
* HACKING: Add notes about deprecating interfaces and commands.
* lib/linklist.h: Add usage comments.
Rename getdata macro to listgetdata.
Rename nextnode to listnextnode and fix its odd behaviour to be
less dangerous.
Make listgetdata macro assert node is not null, NULL list entries
should be bug condition.
ALL_LIST_ELEMENTS, new macro, forward-referencing macro for use
with for loop, Suggested by Jim Carlson of Sun.
Add ALL_LIST_ELEMENTS_RO for cases which obviously do not need the
"safety" of previous macro.
LISTNODE_ADD and DELETE macros renamed to ATTACH, DETACH, to
distinguish from the similarly named functions, and reflect their
effect better.
Add a QUAGGA_NO_DEPRECATED_INTERFACES define guarded section
with the old defines which were modified above,
for backwards compatibility - guarded to prevent Quagga using it..
* lib/linklist.c: fix up for linklist.h changes.
* ospf6d/ospf6_abr.c: (ospf6_abr_examin_brouter) change to a single
scan of the area list, rather than scanning all areas first for
INTER_ROUTER and then again for INTER_NETWORK. According to
16.2, the scan should be area specific anyway, and further
ospf6d does not seem to implement 16.3 anyway.
2005-04-07 09:30:20 +02:00
|
|
|
for (ALL_LIST_ELEMENTS (bm->bgp, mnode, mnnode, bgp))
|
|
|
|
for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
|
2015-05-20 02:40:37 +02:00
|
|
|
if (peer->status == Established ||
|
|
|
|
peer->status == OpenSent ||
|
|
|
|
peer->status == OpenConfirm)
|
2004-04-20 17:13:15 +02:00
|
|
|
bgp_notify_send (peer, BGP_NOTIFY_CEASE,
|
|
|
|
BGP_NOTIFY_CEASE_PEER_UNCONFIG);
|
2015-05-20 02:40:37 +02:00
|
|
|
|
2004-04-20 17:13:15 +02:00
|
|
|
bgp_cleanup_routes ();
|
2009-06-02 15:28:16 +02:00
|
|
|
|
2005-06-15 21:15:35 +02:00
|
|
|
if (bm->process_main_queue)
|
2009-06-02 15:28:16 +02:00
|
|
|
{
|
|
|
|
work_queue_free (bm->process_main_queue);
|
|
|
|
bm->process_main_queue = NULL;
|
|
|
|
}
|
2005-06-15 21:15:35 +02:00
|
|
|
if (bm->process_rsclient_queue)
|
2009-06-02 15:28:16 +02:00
|
|
|
{
|
|
|
|
work_queue_free (bm->process_rsclient_queue);
|
|
|
|
bm->process_rsclient_queue = NULL;
|
|
|
|
}
|
2004-04-20 17:13:15 +02:00
|
|
|
}
|