#define _QUAGGA_BGPD_H
#include "lib/json.h"
+#include "vrf.h"
+
/* For union sockunion. */
#include "queue.h"
#include "sockunion.h"
#include "routemap.h"
#include "linklist.h"
+#include "defaults.h"
+#include "bgp_memory.h"
#define BGP_MAX_HOSTNAME 64 /* Linux max, is larger than most other sys */
+/* Default interval for IPv6 RAs when triggered by BGP unnumbered neighbor. */
+#define BGP_UNNUM_DEFAULT_RA_INTERVAL 10
+
struct update_subgroup;
struct bpacket;
BGP_AF_IPV4_VPN,
BGP_AF_IPV6_UNICAST,
BGP_AF_IPV6_MULTICAST,
+ BGP_AF_IPV6_VPN,
+ BGP_AF_IPV4_ENCAP,
+ BGP_AF_IPV6_ENCAP,
BGP_AF_MAX
};
/* work queues */
struct work_queue *process_main_queue;
- struct work_queue *process_rsclient_queue;
/* Listening sockets */
struct list *listen_sockets;
#define BGP_OPT_CONFIG_CISCO (1 << 2)
#define BGP_OPT_NO_LISTEN (1 << 3)
- u_int64_t updgrp_idspace;
- u_int64_t subgrp_idspace;
+ uint64_t updgrp_idspace;
+ uint64_t subgrp_idspace;
+
+ /* timer to dampen route map changes */
+ struct thread *t_rmap_update; /* Handle route map updates */
+ u_int32_t rmap_update_timer; /* Route map update timer */
+#define RMAP_DEFAULT_UPDATE_TIMER 5 /* disabled by default */
};
/* BGP route-map structure. */
struct bgp_rmap rmap;
};
+/*
+ * Type of 'struct bgp'.
+ * - Default: The default instance
+ * - VRF: A specific (non-default) VRF
+ * - View: An instance used for route exchange
+ * The "default" instance is treated separately to simplify the code. Note
+ * that if deployed in a Multi-VRF environment, it may not exist.
+ */
+enum bgp_instance_type
+{
+ BGP_INSTANCE_TYPE_DEFAULT,
+ BGP_INSTANCE_TYPE_VRF,
+ BGP_INSTANCE_TYPE_VIEW
+};
+
/* BGP instance structure. */
struct bgp
{
/* Name of this BGP instance. */
char *name;
+
+ /* Type of instance and VRF id. */
+ enum bgp_instance_type inst_type;
+ vrf_id_t vrf_id;
/* Reference count to allow peer_delete to finish after bgp_delete */
int lock;
/* BGP peer. */
struct list *peer;
+ struct hash *peerhash;
/* BGP peer group. */
struct list *group;
/* The current number of BGP dynamic neighbors */
int dynamic_neighbors_count;
- /* BGP route-server-clients. */
- struct list *rsclient;
-
struct hash *update_groups[BGP_AF_MAX];
/*
/* BGP configuration. */
u_int16_t config;
-#define BGP_CONFIG_ROUTER_ID (1 << 0)
-#define BGP_CONFIG_CLUSTER_ID (1 << 1)
-#define BGP_CONFIG_CONFEDERATION (1 << 2)
+#define BGP_CONFIG_CLUSTER_ID (1 << 0)
+#define BGP_CONFIG_CONFEDERATION (1 << 1)
/* BGP router identifier. */
struct in_addr router_id;
struct in_addr router_id_static;
+ struct in_addr router_id_zebra;
/* BGP route reflector cluster ID. */
struct in_addr cluster_id;
u_char update_delay_over;
u_char main_zebra_update_hold;
u_char main_peers_update_hold;
- u_char rsclient_peers_update_hold;
u_int16_t v_update_delay;
u_int16_t v_establish_wait;
char update_delay_begin_time[64];
#define BGP_FLAG_ASPATH_MULTIPATH_RELAX (1 << 14)
#define BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY (1 << 15)
#define BGP_FLAG_DISABLE_NH_CONNECTED_CHK (1 << 16)
-#define BGP_FLAG_MULTIPATH_RELAX_NO_AS_SET (1 << 17)
+#define BGP_FLAG_MULTIPATH_RELAX_AS_SET (1 << 17)
#define BGP_FLAG_FORCE_STATIC_PROCESS (1 << 18)
-#define BGP_FLAG_IMPORT_CHECK_EXACT_MATCH (1 << 19)
-#define BGP_FLAG_SHOW_HOSTNAME (1 << 20)
+#define BGP_FLAG_SHOW_HOSTNAME (1 << 19)
/* BGP Per AF flags */
u_int16_t af_flags[AFI_MAX][SAFI_MAX];
#define BGP_CONFIG_DAMPENING (1 << 0)
+ /* Route table for next-hop lookup cache. */
+ struct bgp_table *nexthop_cache_table[AFI_MAX];
+
+ /* Route table for import-check */
+ struct bgp_table *import_check_table[AFI_MAX];
+
+ struct bgp_table *connected_table[AFI_MAX];
+
+ struct hash *address_hash;
+
/* Static route configuration. */
struct bgp_table *route[AFI_MAX][SAFI_MAX];
/* BGP redistribute configuration. */
struct list *redist[AFI_MAX][ZEBRA_ROUTE_MAX];
- /* timer to dampen route map changes */
- struct thread *t_rmap_update; /* Handle route map updates */
- u_int32_t rmap_update_timer; /* Route map update timer */
-#define RMAP_DEFAULT_UPDATE_TIMER 5 /* disabled by default */
-
/* timer to re-evaluate neighbor default-originate route-maps */
struct thread *t_rmap_def_originate_eval;
#define RMAP_DEFAULT_ORIGINATE_EVAL_TIMER 5
/* BGP distance configuration. */
- u_char distance_ebgp;
- u_char distance_ibgp;
- u_char distance_local;
+ u_char distance_ebgp[AFI_MAX][SAFI_MAX];
+ u_char distance_ibgp[AFI_MAX][SAFI_MAX];
+ u_char distance_local[AFI_MAX][SAFI_MAX];
/* BGP default local-preference. */
u_int32_t default_local_pref;
u_int32_t wpkt_quanta; /* per peer packet quanta to write */
u_int32_t coalesce_time;
+
+ u_int32_t addpath_tx_id;
+ int addpath_tx_used[AFI_MAX][SAFI_MAX];
+
+#if ENABLE_BGP_VNC
+ struct rfapi_cfg *rfapi_cfg;
+ struct rfapi *rfapi;
+#endif
};
-#define BGP_ROUTE_ADV_HOLD(bgp) \
- (bgp->main_peers_update_hold || bgp->rsclient_peers_update_hold)
+#define BGP_ROUTE_ADV_HOLD(bgp) (bgp->main_peers_update_hold)
+
+#define IS_BGP_INST_KNOWN_TO_ZEBRA(bgp) \
+ (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT || \
+ (bgp->inst_type == BGP_INSTANCE_TYPE_VRF && bgp->vrf_id != VRF_UNKNOWN))
/* BGP peer-group support. */
struct peer_group
#define BGP_ADDPATH_TX 2
#define BGP_ADDPATH_ID_LEN 4
+#define BGP_ADDPATH_TX_ID_FOR_DEFAULT_ORIGINATE 1
+
/* BGP router distinguisher value. */
#define BGP_RD_SIZE 8
u_char val[BGP_RD_SIZE];
};
-#define RMAP_IN 0
-#define RMAP_OUT 1
-#define RMAP_IMPORT 2
-#define RMAP_EXPORT 3
-#define RMAP_MAX 4
+#define RMAP_IN 0
+#define RMAP_OUT 1
+#define RMAP_MAX 2
+
+#include "filter.h"
/* BGP filter structure. */
struct bgp_filter
/* BGP peer group. */
struct peer_group *group;
- u_char af_group[AFI_MAX][SAFI_MAX];
- u_int64_t version[AFI_MAX][SAFI_MAX];
+ uint64_t version[AFI_MAX][SAFI_MAX];
/* BGP peer_af structures, per configured AF on this peer */
struct peer_af *peer_af_array[BGP_AF_MAX];
/* Local router ID. */
struct in_addr local_id;
- /* Peer specific RIB when configured as route-server-client. */
- struct bgp_table *rib[AFI_MAX][SAFI_MAX];
-
/* Packet receive and send buffer. */
struct stream *ibuf;
struct stream_fifo *obuf;
/* Peer information */
int fd; /* File descriptor */
int ttl; /* TTL of TCP connection to the peer. */
+ int rtt; /* Estimated round-trip-time from TCP_INFO */
int gtsm_hops; /* minimum hopcount to peer */
char *desc; /* Description of the peer. */
unsigned short port; /* Destination port for peer */
time_t readtime; /* Last read time */
time_t resettime; /* Last reset time */
- unsigned int ifindex; /* ifindex of the BGP connection. */
+ ifindex_t ifindex; /* ifindex of the BGP connection. */
char *conf_if; /* neighbor interface config name. */
+ struct interface *ifp; /* corresponding interface */
char *ifname; /* bind interface name. */
char *update_if;
union sockunion *update_source;
#define PEER_FLAG_DYNAMIC_NEIGHBOR (1 << 12) /* dynamic neighbor */
#define PEER_FLAG_CAPABILITY_ENHE (1 << 13) /* Extended next-hop (rfc 5549)*/
#define PEER_FLAG_IFPEER_V6ONLY (1 << 14) /* if-based peer is v6 only */
+#if ENABLE_BGP_VNC
+#define PEER_FLAG_IS_RFAPI_HD (1 << 15) /* attached to rfapi HD */
+#endif
/* NSF mode (graceful restart) */
u_char nsf[AFI_MAX][SAFI_MAX];
#define PEER_FLAG_REMOVE_PRIVATE_AS_ALL (1 << 18) /* remove-private-as all */
#define PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE (1 << 19) /* remove-private-as replace-as */
#define PEER_FLAG_AS_OVERRIDE (1 << 20) /* as-override */
+#define PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE (1 << 21) /* remove-private-as all replace-as */
+#define PEER_FLAG_ADDPATH_TX_ALL_PATHS (1 << 22) /* addpath-tx-all-paths */
+#define PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS (1 << 23) /* addpath-tx-bestpath-per-AS */
+#define PEER_FLAG_WEIGHT (1 << 24) /* weight */
+#define PEER_FLAG_ALLOWAS_IN_ORIGIN (1 << 25) /* allowas-in origin */
/* MD5 password */
char *password;
/* Default attribute value for the peer. */
u_int32_t config;
-#define PEER_CONFIG_WEIGHT (1 << 0) /* Default weight. */
-#define PEER_CONFIG_TIMER (1 << 1) /* keepalive & holdtime */
-#define PEER_CONFIG_CONNECT (1 << 2) /* connect */
-#define PEER_CONFIG_ROUTEADV (1 << 3) /* route advertise */
+#define PEER_CONFIG_TIMER (1 << 0) /* keepalive & holdtime */
+#define PEER_CONFIG_CONNECT (1 << 1) /* connect */
+#define PEER_CONFIG_ROUTEADV (1 << 2) /* route advertise */
- u_int32_t weight;
u_int32_t holdtime;
u_int32_t keepalive;
u_int32_t connect;
u_int32_t v_connect;
u_int32_t v_holdtime;
u_int32_t v_keepalive;
- u_int32_t v_asorig;
u_int32_t v_routeadv;
u_int32_t v_pmax_restart;
u_int32_t v_gr_restart;
struct thread *t_connect;
struct thread *t_holdtime;
struct thread *t_keepalive;
- struct thread *t_asorig;
struct thread *t_routeadv;
struct thread *t_pmax_restart;
struct thread *t_gr_restart;
/* Syncronization list and time. */
struct bgp_synchronize *sync[AFI_MAX][SAFI_MAX];
time_t synctime;
- time_t last_write; /* timestamp when the last UPDATE msg was written */
+ time_t last_write; /* timestamp when the last msg was written */
+ time_t last_update; /* timestamp when the last UPDATE msg was written */
/* Send prefix count. */
unsigned long scount[AFI_MAX][SAFI_MAX];
/* allowas-in. */
char allowas_in[AFI_MAX][SAFI_MAX];
+ /* weight */
+ unsigned long weight[AFI_MAX][SAFI_MAX];
+
/* peer reset cause */
char last_reset;
#define PEER_DOWN_RID_CHANGE 1 /* bgp router-id command */
#define PEER_DOWN_NSF_CLOSE_SESSION 22 /* NSF tcp session close */
#define PEER_DOWN_V6ONLY_CHANGE 23 /* if-based peering v6only toggled */
#define PEER_DOWN_BFD_DOWN 24 /* BFD down */
+#define PEER_DOWN_IF_DOWN 25 /* Interface down */
+#define PEER_DOWN_NBR_ADDR_DEL 26 /* Peer address lost */
unsigned long last_reset_cause_size;
u_char last_reset_cause[BGP_MAX_PACKET_SIZE];
char *domainname;
};
+/* Check if suppress start/restart of sessions to peer. */
+#define BGP_PEER_START_SUPPRESSED(P) \
+ (CHECK_FLAG ((P)->flags, PEER_FLAG_SHUTDOWN) \
+ || CHECK_FLAG ((P)->sflags, PEER_STATUS_PREFIX_OVERFLOW))
+
#define PEER_PASSWORD_MINLEN (1)
#define PEER_PASSWORD_MAXLEN (80)
bgp_size_t length;
};
-#define PEERAF_FOREACH(peer, paf, afi) \
- for ((afi) = BGP_AF_START, (paf) = (peer)->peer_af_array[(afi)]; \
- (afi) < BGP_AF_MAX; \
- (afi)++, (paf) = (peer)->peer_af_array[(afi)]) \
- if ((paf) != NULL) \
-
/* BGP versions. */
#define BGP_VERSION_4 4
#define BGP_ATTR_AS4_PATH 17
#define BGP_ATTR_AS4_AGGREGATOR 18
#define BGP_ATTR_AS_PATHLIMIT 21
+#define BGP_ATTR_ENCAP 23
+#if ENABLE_BGP_VNC
+#define BGP_ATTR_VNC 255
+#endif
/* BGP update origin. */
#define BGP_ORIGIN_IGP 0
#define BGP_EVENTS_MAX 15
/* BGP timers default value. */
+/* note: the DFLT_ ones depend on compile-time "defaults" selection */
#define BGP_INIT_START_TIMER 1
-#define BGP_ERROR_START_TIMER 30
-#define BGP_DEFAULT_HOLDTIME 180
-#define BGP_DEFAULT_KEEPALIVE 60
-#define BGP_DEFAULT_ASORIGINATE 15
+#define BGP_DEFAULT_HOLDTIME DFLT_BGP_HOLDTIME
+#define BGP_DEFAULT_KEEPALIVE DFLT_BGP_KEEPALIVE
#define BGP_DEFAULT_EBGP_ROUTEADV 0
#define BGP_DEFAULT_IBGP_ROUTEADV 0
-#define BGP_DEFAULT_CONNECT_RETRY 120
+#define BGP_DEFAULT_CONNECT_RETRY DFLT_BGP_TIMERS_CONNECT
/* BGP default local preference. */
#define BGP_DEFAULT_LOCAL_PREF 100
/* RFC4364 */
#define SAFI_MPLS_LABELED_VPN 128
-
-/* Max TTL value. */
-#define TTL_MAX 255
+#define BGP_SAFI_VPN 128
/* BGP uptime string length. */
#define BGP_UPTIME_LEN 25
BGP_CLEAR_SOFT_OUT,
BGP_CLEAR_SOFT_IN,
BGP_CLEAR_SOFT_BOTH,
- BGP_CLEAR_SOFT_IN_ORF_PREFIX,
- BGP_CLEAR_SOFT_RSCLIENT
+ BGP_CLEAR_SOFT_IN_ORF_PREFIX
};
/* Macros. */
#define BGP_IS_VALID_STATE_FOR_NOTIF(S)\
(((S) == OpenSent) || ((S) == OpenConfirm) || ((S) == Established))
-/* Count prefix size from mask length */
-#define PSIZE(a) (((a) + 7) / (8))
-
/* BGP error codes. */
#define BGP_SUCCESS 0
#define BGP_ERR_INVALID_VALUE -1
#define BGP_ERR_INVALID_BGP -4
#define BGP_ERR_PEER_GROUP_MEMBER -5
#define BGP_ERR_MULTIPLE_INSTANCE_USED -6
-#define BGP_ERR_PEER_GROUP_MEMBER_EXISTS -7
-#define BGP_ERR_PEER_BELONGS_TO_GROUP -8
-#define BGP_ERR_PEER_GROUP_AF_UNCONFIGURED -9
-#define BGP_ERR_PEER_GROUP_NO_REMOTE_AS -10
-#define BGP_ERR_PEER_GROUP_CANT_CHANGE -11
-#define BGP_ERR_PEER_GROUP_MISMATCH -12
-#define BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT -13
-#define BGP_ERR_MULTIPLE_INSTANCE_NOT_SET -14
-#define BGP_ERR_AS_MISMATCH -15
-#define BGP_ERR_PEER_INACTIVE -16
-#define BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER -17
-#define BGP_ERR_PEER_GROUP_HAS_THE_FLAG -18
-#define BGP_ERR_PEER_FLAG_CONFLICT -19
-#define BGP_ERR_PEER_GROUP_SHUTDOWN -20
-#define BGP_ERR_PEER_FILTER_CONFLICT -21
-#define BGP_ERR_NOT_INTERNAL_PEER -22
-#define BGP_ERR_REMOVE_PRIVATE_AS -23
-#define BGP_ERR_AF_UNCONFIGURED -24
-#define BGP_ERR_SOFT_RECONFIG_UNCONFIGURED -25
-#define BGP_ERR_INSTANCE_MISMATCH -26
-#define BGP_ERR_LOCAL_AS_ALLOWED_ONLY_FOR_EBGP -27
-#define BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS -28
-#define BGP_ERR_TCPSIG_FAILED -29
-#define BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK -30
-#define BGP_ERR_NO_IBGP_WITH_TTLHACK -31
-#define BGP_ERR_NO_INTERFACE_CONFIG -32
-#define BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS_REMOTE_AS -33
-#define BGP_ERR_AS_OVERRIDE -34
-#define BGP_ERR_INVALID_DYNAMIC_NEIGHBORS_LIMIT -35
-#define BGP_ERR_DYNAMIC_NEIGHBORS_RANGE_EXISTS -36
-#define BGP_ERR_DYNAMIC_NEIGHBORS_RANGE_NOT_FOUND -37
-#define BGP_ERR_INVALID_FOR_DYNAMIC_PEER -38
-#define BGP_ERR_MAX -39
+#define BGP_ERR_PEER_GROUP_NO_REMOTE_AS -7
+#define BGP_ERR_PEER_GROUP_CANT_CHANGE -8
+#define BGP_ERR_PEER_GROUP_MISMATCH -9
+#define BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT -10
+#define BGP_ERR_MULTIPLE_INSTANCE_NOT_SET -11
+#define BGP_ERR_AS_MISMATCH -12
+#define BGP_ERR_PEER_FLAG_CONFLICT -13
+#define BGP_ERR_PEER_GROUP_SHUTDOWN -14
+#define BGP_ERR_PEER_FILTER_CONFLICT -15
+#define BGP_ERR_NOT_INTERNAL_PEER -16
+#define BGP_ERR_REMOVE_PRIVATE_AS -17
+#define BGP_ERR_AF_UNCONFIGURED -18
+#define BGP_ERR_SOFT_RECONFIG_UNCONFIGURED -19
+#define BGP_ERR_INSTANCE_MISMATCH -20
+#define BGP_ERR_LOCAL_AS_ALLOWED_ONLY_FOR_EBGP -21
+#define BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS -22
+#define BGP_ERR_TCPSIG_FAILED -23
+#define BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK -24
+#define BGP_ERR_NO_IBGP_WITH_TTLHACK -25
+#define BGP_ERR_NO_INTERFACE_CONFIG -26
+#define BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS_REMOTE_AS -27
+#define BGP_ERR_AS_OVERRIDE -28
+#define BGP_ERR_INVALID_DYNAMIC_NEIGHBORS_LIMIT -29
+#define BGP_ERR_DYNAMIC_NEIGHBORS_RANGE_EXISTS -30
+#define BGP_ERR_DYNAMIC_NEIGHBORS_RANGE_NOT_FOUND -31
+#define BGP_ERR_INVALID_FOR_DYNAMIC_PEER -32
+#define BGP_ERR_MAX -33
+#define BGP_ERR_INVALID_FOR_DIRECT_PEER -34
/*
* Enumeration of different policy kinds a peer can be configured with.
extern struct bgp *bgp_get_default (void);
extern struct bgp *bgp_lookup (as_t, const char *);
extern struct bgp *bgp_lookup_by_name (const char *);
+extern struct bgp *bgp_lookup_by_vrf_id (vrf_id_t);
extern struct peer *peer_lookup (struct bgp *, union sockunion *);
extern struct peer *peer_lookup_by_conf_if (struct bgp *, const char *);
extern struct peer *peer_lookup_by_hostname(struct bgp *, const char *);
-extern struct peer *peer_conf_interface_get(struct bgp *, const char *, afi_t,
- safi_t, int v6only);
extern void bgp_peer_conf_if_to_su_update (struct peer *);
extern int peer_group_listen_range_del(struct peer_group *, struct prefix *);
extern struct peer_group *peer_group_lookup (struct bgp *, const char *);
extern bgp_peer_sort_t peer_sort (struct peer *peer);
extern int peer_active (struct peer *);
extern int peer_active_nego (struct peer *);
+extern void bgp_recalculate_all_bestpaths (struct bgp *bgp);
extern struct peer *peer_create(union sockunion *, const char *, struct bgp *,
- as_t, as_t, int, afi_t, safi_t);
+ as_t, as_t, int, afi_t, safi_t, struct peer_group *);
extern struct peer *peer_create_accept (struct bgp *);
extern void peer_xfer_config (struct peer *dst, struct peer *src);
extern char *peer_uptime (time_t, char *, size_t, u_char, json_object *);
extern void bgp_init (void);
extern void bgp_route_map_init (void);
+extern void bgp_session_reset (struct peer *);
extern int bgp_option_set (int);
extern int bgp_option_unset (int);
extern int bgp_option_check (int);
-extern int bgp_get (struct bgp **, as_t *, const char *);
+extern int bgp_get (struct bgp **, as_t *, const char *, enum bgp_instance_type);
+extern void bgp_instance_up (struct bgp *);
+extern void bgp_instance_down (struct bgp *);
extern int bgp_delete (struct bgp *);
extern int bgp_flag_set (struct bgp *, int);
extern void bgp_lock (struct bgp *);
extern void bgp_unlock (struct bgp *);
-extern int bgp_router_id_set (struct bgp *, struct in_addr *);
+extern void bgp_router_id_zebra_bump (vrf_id_t, const struct prefix*);
+extern int bgp_router_id_static_set (struct bgp *, struct in_addr);
extern int bgp_cluster_id_set (struct bgp *, struct in_addr *);
extern int bgp_cluster_id_unset (struct bgp *);
extern int bgp_confederation_peers_add (struct bgp *, as_t);
extern int bgp_confederation_peers_remove (struct bgp *, as_t);
-extern int bgp_timers_set (struct bgp *, u_int32_t, u_int32_t);
+extern int bgp_timers_set (struct bgp *, u_int32_t keepalive, u_int32_t holdtime);
extern int bgp_timers_unset (struct bgp *);
extern int bgp_default_local_preference_set (struct bgp *, u_int32_t);
extern int bgp_update_delay_active (struct bgp *);
extern int bgp_update_delay_configured (struct bgp *);
-extern int peer_rsclient_active (struct peer *);
extern void peer_as_change (struct peer *, as_t, int);
extern int peer_remote_as (struct bgp *, union sockunion *,const char *, as_t *,
int, afi_t, safi_t);
extern int peer_activate (struct peer *, afi_t, safi_t);
extern int peer_deactivate (struct peer *, afi_t, safi_t);
+extern int peer_afc_set (struct peer *, afi_t, safi_t, int);
extern int peer_group_bind (struct bgp *, union sockunion *, struct peer *,
- struct peer_group *, afi_t, safi_t, as_t *);
-extern int peer_group_unbind (struct bgp *, struct peer *, struct peer_group *,
- afi_t, safi_t);
+ struct peer_group *, as_t *);
+extern int peer_group_unbind (struct bgp *, struct peer *, struct peer_group *);
extern int peer_flag_set (struct peer *, u_int32_t);
extern int peer_flag_unset (struct peer *, u_int32_t);
extern int peer_ebgp_multihop_unset (struct peer *);
extern int is_ebgp_multihop_configured (struct peer *peer);
-extern int peer_description_set (struct peer *, char *);
+extern int peer_description_set (struct peer *, const char *);
extern int peer_description_unset (struct peer *);
extern int peer_update_source_if_set (struct peer *, const char *);
-extern int peer_update_source_addr_set (struct peer *, union sockunion *);
+extern int peer_update_source_addr_set (struct peer *, const union sockunion *);
extern int peer_update_source_unset (struct peer *);
extern int peer_default_originate_set (struct peer *, afi_t, safi_t, const char *);
extern int peer_port_set (struct peer *, u_int16_t);
extern int peer_port_unset (struct peer *);
-extern void peer_weight_set (struct peer *, u_int16_t);
-extern void peer_weight_unset (struct peer *);
+extern int peer_weight_set (struct peer *, afi_t, safi_t, u_int16_t);
+extern int peer_weight_unset (struct peer *, afi_t, safi_t);
-extern int peer_timers_set (struct peer *, u_int32_t, u_int32_t);
+extern int peer_timers_set (struct peer *, u_int32_t keepalive, u_int32_t holdtime);
extern int peer_timers_unset (struct peer *);
extern int peer_timers_connect_set (struct peer *, u_int32_t);
extern int peer_distribute_set (struct peer *, afi_t, safi_t, int, const char *);
extern int peer_distribute_unset (struct peer *, afi_t, safi_t, int);
-extern int peer_allowas_in_set (struct peer *, afi_t, safi_t, int);
+extern int peer_allowas_in_set (struct peer *, afi_t, safi_t, int, int);
extern int peer_allowas_in_unset (struct peer *, afi_t, safi_t);
extern int peer_local_as_set (struct peer *, as_t, int, int);
extern struct peer_af * peer_af_find (struct peer *, afi_t, safi_t);
extern int peer_af_delete (struct peer *, afi_t, safi_t);
-extern void bgp_scan_finish(void);
extern void bgp_close(void);
static inline int
case SAFI_MPLS_VPN:
return BGP_AF_IPV4_VPN;
break;
+ case SAFI_ENCAP:
+ return BGP_AF_IPV4_ENCAP;
+ break;
default:
return BGP_AF_MAX;
break;
case SAFI_MULTICAST:
return BGP_AF_IPV6_MULTICAST;
break;
+ case SAFI_MPLS_VPN:
+ return BGP_AF_IPV6_VPN;
+ break;
+ case SAFI_ENCAP:
+ return BGP_AF_IPV6_ENCAP;
+ break;
default:
return BGP_AF_MAX;
break;
}
}
-/* If peer is configured at least one address family return 1. */
+/* If the peer is not a peer-group but is bound to a peer-group return 1 */
static inline int
peer_group_active (struct peer *peer)
{
- if (peer->af_group[AFI_IP][SAFI_UNICAST]
- || peer->af_group[AFI_IP][SAFI_MULTICAST]
- || peer->af_group[AFI_IP][SAFI_MPLS_VPN]
- || peer->af_group[AFI_IP6][SAFI_UNICAST]
- || peer->af_group[AFI_IP6][SAFI_MULTICAST])
+ if (!CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP) && peer->group)
return 1;
return 0;
}
{
if (peer->afc_nego[afi][SAFI_UNICAST]
|| peer->afc_nego[afi][SAFI_MULTICAST]
- || peer->afc_nego[afi][SAFI_MPLS_VPN])
+ || peer->afc_nego[afi][SAFI_MPLS_VPN]
+ || peer->afc_nego[afi][SAFI_ENCAP])
return 1;
return 0;
}
if (peer->afc[AFI_IP][SAFI_UNICAST]
|| peer->afc[AFI_IP][SAFI_MULTICAST]
|| peer->afc[AFI_IP][SAFI_MPLS_VPN]
+ || peer->afc[AFI_IP][SAFI_ENCAP]
|| peer->afc[AFI_IP6][SAFI_UNICAST]
- || peer->afc[AFI_IP6][SAFI_MULTICAST])
+ || peer->afc[AFI_IP6][SAFI_MULTICAST]
+ || peer->afc[AFI_IP6][SAFI_MPLS_VPN]
+ || peer->afc[AFI_IP6][SAFI_ENCAP])
return 1;
return 0;
}
return (CHECK_FLAG(peer->af_cap[AFI_IP][SAFI_UNICAST], PEER_CAP_ENHE_AF_NEGO));
}
+/* Lookup VRF for BGP instance based on its type. */
+static inline struct vrf *
+bgp_vrf_lookup_by_instance_type (struct bgp *bgp)
+{
+ struct vrf *vrf;
+
+ if (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)
+ vrf = vrf_lookup_by_id (VRF_DEFAULT);
+ else if (bgp->inst_type == BGP_INSTANCE_TYPE_VRF)
+ vrf = vrf_lookup_by_name (bgp->name);
+ else
+ vrf = NULL;
+
+ return vrf;
+}
+
+/* Link BGP instance to VRF. */
+static inline void
+bgp_vrf_link (struct bgp *bgp, struct vrf *vrf)
+{
+ bgp->vrf_id = vrf->vrf_id;
+ if (vrf->info != (void *)bgp)
+ {
+ bgp_lock (bgp);
+ vrf->info = (void *)bgp;
+ }
+}
+
+/* Unlink BGP instance from VRF. */
+static inline void
+bgp_vrf_unlink (struct bgp *bgp, struct vrf *vrf)
+{
+ if (vrf->info == (void *)bgp)
+ {
+ vrf->info = NULL;
+ bgp_unlock (bgp);
+ }
+ bgp->vrf_id = VRF_UNKNOWN;
+}
+
+extern void bgp_update_redist_vrf_bitmaps (struct bgp*, vrf_id_t);
+
+/* For benefit of rfapi */
+extern struct peer * peer_new (struct bgp *bgp);
+
#endif /* _QUAGGA_BGPD_H */