/* vrf-route leaking flags */
#define BGP_CONFIG_VRF_TO_VRF_IMPORT (1 << 9)
#define BGP_CONFIG_VRF_TO_VRF_EXPORT (1 << 10)
+/* vpnvx retain flag */
+#define BGP_VPNVX_RETAIN_ROUTE_TARGET_ALL (1 << 11)
/* BGP per AF peer count */
uint32_t af_peer_count[AFI_MAX][SAFI_MAX];
struct timeval ebgprequirespolicywarning;
#define FIFTEENMINUTE2USEC (int64_t)15 * 60 * 1000000
+ bool allow_martian;
+
QOBJ_FIELDS;
};
DECLARE_QOBJ_TYPE(bgp);
+struct bgp_interface {
+#define BGP_INTERFACE_MPLS_BGP_FORWARDING (1 << 0)
+ uint32_t flags;
+};
+
DECLARE_HOOK(bgp_inst_delete, (struct bgp *bgp), (bgp));
DECLARE_HOOK(bgp_inst_config_write,
(struct bgp *bgp, struct vty *vty),
#define CONDITION_NON_EXIST false
#define CONDITION_EXIST true
-enum update_type { WITHDRAW, ADVERTISE };
+enum update_type { UPDATE_TYPE_WITHDRAW, UPDATE_TYPE_ADVERTISE };
#include "filter.h"
int shared_network; /* Is this peer shared same network. */
struct bgp_nexthop nexthop; /* Nexthop */
+ /* Roles in bgp session */
+ uint8_t local_role;
+ uint8_t remote_role;
+#define ROLE_PROVIDER 0
+#define ROLE_RS_SERVER 1
+#define ROLE_RS_CLIENT 2
+#define ROLE_CUSTOMER 3
+#define ROLE_PEER 4
+#define ROLE_UNDEFINED 255
+
+#define ROLE_NAME_MAX_LEN 20
+
/* Peer address family configuration. */
uint8_t afc[AFI_MAX][SAFI_MAX];
uint8_t afc_nego[AFI_MAX][SAFI_MAX];
#define PEER_CAP_GRACEFUL_RESTART_N_BIT_ADV (1U << 23)
/* received graceful-restart notification (N) bit */
#define PEER_CAP_GRACEFUL_RESTART_N_BIT_RCV (1U << 24)
+#define PEER_CAP_ROLE_ADV (1U << 25) /* role advertised */
+#define PEER_CAP_ROLE_RCV (1U << 26) /* role received */
/* Capability flags (reset in bgp_stop) */
uint32_t af_cap[AFI_MAX][SAFI_MAX];
* flags_invert) must be respected.
*/
uint64_t flags;
-#define PEER_FLAG_PASSIVE (1U << 0) /* passive mode */
-#define PEER_FLAG_SHUTDOWN (1U << 1) /* shutdown */
-#define PEER_FLAG_DONT_CAPABILITY (1U << 2) /* dont-capability */
-#define PEER_FLAG_OVERRIDE_CAPABILITY (1U << 3) /* override-capability */
-#define PEER_FLAG_STRICT_CAP_MATCH (1U << 4) /* strict-match */
-#define PEER_FLAG_DYNAMIC_CAPABILITY (1U << 5) /* dynamic capability */
-#define PEER_FLAG_DISABLE_CONNECTED_CHECK (1U << 6) /* disable-connected-check */
-#define PEER_FLAG_LOCAL_AS_NO_PREPEND (1U << 7) /* local-as no-prepend */
-#define PEER_FLAG_LOCAL_AS_REPLACE_AS (1U << 8) /* local-as no-prepend replace-as */
-#define PEER_FLAG_DELETE (1U << 9) /* mark the peer for deleting */
-#define PEER_FLAG_CONFIG_NODE (1U << 10) /* the node to update configs on */
-#define PEER_FLAG_LONESOUL (1U << 11)
-#define PEER_FLAG_DYNAMIC_NEIGHBOR (1U << 12) /* dynamic neighbor */
-#define PEER_FLAG_CAPABILITY_ENHE (1U << 13) /* Extended next-hop (rfc 5549)*/
-#define PEER_FLAG_IFPEER_V6ONLY (1U << 14) /* if-based peer is v6 only */
-#define PEER_FLAG_IS_RFAPI_HD (1U << 15) /* attached to rfapi HD */
-#define PEER_FLAG_ENFORCE_FIRST_AS (1U << 16) /* enforce-first-as */
-#define PEER_FLAG_ROUTEADV (1U << 17) /* route advertise */
-#define PEER_FLAG_TIMER (1U << 18) /* keepalive & holdtime */
-#define PEER_FLAG_TIMER_CONNECT (1U << 19) /* connect timer */
-#define PEER_FLAG_PASSWORD (1U << 20) /* password */
-#define PEER_FLAG_LOCAL_AS (1U << 21) /* local-as */
-#define PEER_FLAG_UPDATE_SOURCE (1U << 22) /* update-source */
+#define PEER_FLAG_PASSIVE (1ULL << 0) /* passive mode */
+#define PEER_FLAG_SHUTDOWN (1ULL << 1) /* shutdown */
+#define PEER_FLAG_DONT_CAPABILITY (1ULL << 2) /* dont-capability */
+#define PEER_FLAG_OVERRIDE_CAPABILITY (1ULL << 3) /* override-capability */
+#define PEER_FLAG_STRICT_CAP_MATCH (1ULL << 4) /* strict-match */
+#define PEER_FLAG_DYNAMIC_CAPABILITY (1ULL << 5) /* dynamic capability */
+#define PEER_FLAG_DISABLE_CONNECTED_CHECK (1ULL << 6) /* disable-connected-check */
+#define PEER_FLAG_LOCAL_AS_NO_PREPEND (1ULL << 7) /* local-as no-prepend */
+#define PEER_FLAG_LOCAL_AS_REPLACE_AS (1ULL << 8) /* local-as no-prepend replace-as */
+#define PEER_FLAG_DELETE (1ULL << 9) /* mark the peer for deleting */
+#define PEER_FLAG_CONFIG_NODE (1ULL << 10) /* the node to update configs on */
+#define PEER_FLAG_LONESOUL (1ULL << 11)
+#define PEER_FLAG_DYNAMIC_NEIGHBOR (1ULL << 12) /* dynamic neighbor */
+#define PEER_FLAG_CAPABILITY_ENHE (1ULL << 13) /* Extended next-hop (rfc 5549)*/
+#define PEER_FLAG_IFPEER_V6ONLY (1ULL << 14) /* if-based peer is v6 only */
+#define PEER_FLAG_IS_RFAPI_HD (1ULL << 15) /* attached to rfapi HD */
+#define PEER_FLAG_ENFORCE_FIRST_AS (1ULL << 16) /* enforce-first-as */
+#define PEER_FLAG_ROUTEADV (1ULL << 17) /* route advertise */
+#define PEER_FLAG_TIMER (1ULL << 18) /* keepalive & holdtime */
+#define PEER_FLAG_TIMER_CONNECT (1ULL << 19) /* connect timer */
+#define PEER_FLAG_PASSWORD (1ULL << 20) /* password */
+#define PEER_FLAG_LOCAL_AS (1ULL << 21) /* local-as */
+#define PEER_FLAG_UPDATE_SOURCE (1ULL << 22) /* update-source */
/* BGP-GR Peer related flags */
-#define PEER_FLAG_GRACEFUL_RESTART_HELPER (1U << 23) /* Helper */
-#define PEER_FLAG_GRACEFUL_RESTART (1U << 24) /* Graceful Restart */
-#define PEER_FLAG_GRACEFUL_RESTART_GLOBAL_INHERIT (1U << 25) /* Global-Inherit */
-#define PEER_FLAG_RTT_SHUTDOWN (1U << 26) /* shutdown rtt */
-#define PEER_FLAG_TIMER_DELAYOPEN (1U << 27) /* delayopen timer */
-#define PEER_FLAG_TCP_MSS (1U << 28) /* tcp-mss */
+#define PEER_FLAG_GRACEFUL_RESTART_HELPER (1ULL << 23) /* Helper */
+#define PEER_FLAG_GRACEFUL_RESTART (1ULL << 24) /* Graceful Restart */
+#define PEER_FLAG_GRACEFUL_RESTART_GLOBAL_INHERIT (1ULL << 25) /* Global-Inherit */
+#define PEER_FLAG_RTT_SHUTDOWN (1ULL << 26) /* shutdown rtt */
+#define PEER_FLAG_TIMER_DELAYOPEN (1ULL << 27) /* delayopen timer */
+#define PEER_FLAG_TCP_MSS (1ULL << 28) /* tcp-mss */
/* Disable IEEE floating-point link bandwidth encoding in
* extended communities.
*/
-#define PEER_FLAG_DISABLE_LINK_BW_ENCODING_IEEE (1U << 29)
+#define PEER_FLAG_DISABLE_LINK_BW_ENCODING_IEEE (1ULL << 29)
/* force the extended format for Optional Parameters in OPEN message */
-#define PEER_FLAG_EXTENDED_OPT_PARAMS (1U << 30)
+#define PEER_FLAG_EXTENDED_OPT_PARAMS (1ULL << 30)
+
+ /* BGP Open Policy flags.
+ * Enforce using roles on both sides:
+ * `local-role ROLE strict-mode` configured.
+ */
+#define PEER_FLAG_ROLE_STRICT_MODE (1ULL << 31)
+ /* `local-role` configured */
+#define PEER_FLAG_ROLE (1ULL << 32)
+#define PEER_FLAG_PORT (1ULL << 33)
/*
*GR-Disabled mode means unset PEER_FLAG_GRACEFUL_RESTART
* specific attributes are being treated the exact same way as global
* peer attributes.
*/
- uint32_t af_flags_override[AFI_MAX][SAFI_MAX];
- uint32_t af_flags_invert[AFI_MAX][SAFI_MAX];
- uint32_t af_flags[AFI_MAX][SAFI_MAX];
-#define PEER_FLAG_SEND_COMMUNITY (1U << 0) /* send-community */
-#define PEER_FLAG_SEND_EXT_COMMUNITY (1U << 1) /* send-community ext. */
-#define PEER_FLAG_NEXTHOP_SELF (1U << 2) /* next-hop-self */
-#define PEER_FLAG_REFLECTOR_CLIENT (1U << 3) /* reflector-client */
-#define PEER_FLAG_RSERVER_CLIENT (1U << 4) /* route-server-client */
-#define PEER_FLAG_SOFT_RECONFIG (1U << 5) /* soft-reconfiguration */
-#define PEER_FLAG_AS_PATH_UNCHANGED (1U << 6) /* transparent-as */
-#define PEER_FLAG_NEXTHOP_UNCHANGED (1U << 7) /* transparent-next-hop */
-#define PEER_FLAG_MED_UNCHANGED (1U << 8) /* transparent-next-hop */
-#define PEER_FLAG_DEFAULT_ORIGINATE (1U << 9) /* default-originate */
-#define PEER_FLAG_REMOVE_PRIVATE_AS (1U << 10) /* remove-private-as */
-#define PEER_FLAG_ALLOWAS_IN (1U << 11) /* set allowas-in */
-#define PEER_FLAG_ORF_PREFIX_SM (1U << 12) /* orf capability send-mode */
-#define PEER_FLAG_ORF_PREFIX_RM (1U << 13) /* orf capability receive-mode */
-#define PEER_FLAG_MAX_PREFIX (1U << 14) /* maximum prefix */
-#define PEER_FLAG_MAX_PREFIX_WARNING (1U << 15) /* maximum prefix warning-only */
-#define PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED (1U << 16) /* leave link-local nexthop unchanged */
-#define PEER_FLAG_FORCE_NEXTHOP_SELF (1U << 17) /* next-hop-self force */
-#define PEER_FLAG_REMOVE_PRIVATE_AS_ALL (1U << 18) /* remove-private-as all */
-#define PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE (1U << 19) /* remove-private-as replace-as */
-#define PEER_FLAG_AS_OVERRIDE (1U << 20) /* as-override */
-#define PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE (1U << 21) /* remove-private-as all replace-as */
-#define PEER_FLAG_WEIGHT (1U << 24) /* weight */
-#define PEER_FLAG_ALLOWAS_IN_ORIGIN (1U << 25) /* allowas-in origin */
-#define PEER_FLAG_SEND_LARGE_COMMUNITY (1U << 26) /* Send large Communities */
-#define PEER_FLAG_MAX_PREFIX_OUT (1U << 27) /* outgoing maximum prefix */
-#define PEER_FLAG_MAX_PREFIX_FORCE (1U << 28) /* maximum-prefix <num> force */
-#define PEER_FLAG_DISABLE_ADDPATH_RX (1U << 29) /* disable-addpath-rx */
+ uint64_t af_flags_override[AFI_MAX][SAFI_MAX];
+ uint64_t af_flags_invert[AFI_MAX][SAFI_MAX];
+ uint64_t af_flags[AFI_MAX][SAFI_MAX];
+#define PEER_FLAG_SEND_COMMUNITY (1ULL << 0)
+#define PEER_FLAG_SEND_EXT_COMMUNITY (1ULL << 1)
+#define PEER_FLAG_NEXTHOP_SELF (1ULL << 2)
+#define PEER_FLAG_REFLECTOR_CLIENT (1ULL << 3)
+#define PEER_FLAG_RSERVER_CLIENT (1ULL << 4)
+#define PEER_FLAG_SOFT_RECONFIG (1ULL << 5)
+#define PEER_FLAG_AS_PATH_UNCHANGED (1ULL << 6)
+#define PEER_FLAG_NEXTHOP_UNCHANGED (1ULL << 7)
+#define PEER_FLAG_MED_UNCHANGED (1ULL << 8)
+#define PEER_FLAG_DEFAULT_ORIGINATE (1ULL << 9)
+#define PEER_FLAG_REMOVE_PRIVATE_AS (1ULL << 10)
+#define PEER_FLAG_ALLOWAS_IN (1ULL << 11)
+#define PEER_FLAG_ORF_PREFIX_SM (1ULL << 12)
+#define PEER_FLAG_ORF_PREFIX_RM (1ULL << 13)
+#define PEER_FLAG_MAX_PREFIX (1ULL << 14)
+#define PEER_FLAG_MAX_PREFIX_WARNING (1ULL << 15)
+#define PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED (1ULL << 16)
+#define PEER_FLAG_FORCE_NEXTHOP_SELF (1ULL << 17)
+#define PEER_FLAG_REMOVE_PRIVATE_AS_ALL (1ULL << 18)
+#define PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE (1ULL << 19)
+#define PEER_FLAG_AS_OVERRIDE (1ULL << 20)
+#define PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE (1ULL << 21)
+#define PEER_FLAG_WEIGHT (1ULL << 24)
+#define PEER_FLAG_ALLOWAS_IN_ORIGIN (1ULL << 25)
+#define PEER_FLAG_SEND_LARGE_COMMUNITY (1ULL << 26)
+#define PEER_FLAG_MAX_PREFIX_OUT (1ULL << 27)
+#define PEER_FLAG_MAX_PREFIX_FORCE (1ULL << 28)
+#define PEER_FLAG_DISABLE_ADDPATH_RX (1ULL << 29)
+#define PEER_FLAG_SOO (1ULL << 30)
enum bgp_addpath_strat addpath_type[AFI_MAX][SAFI_MAX];
/* allowas-in. */
char allowas_in[AFI_MAX][SAFI_MAX];
+ /* soo */
+ struct ecommunity *soo[AFI_MAX][SAFI_MAX];
+
/* weight */
unsigned long weight[AFI_MAX][SAFI_MAX];
#define BGP_ATTR_ENCAP 23
#define BGP_ATTR_IPV6_EXT_COMMUNITIES 25
#define BGP_ATTR_LARGE_COMMUNITIES 32
+#define BGP_ATTR_OTC 35
#define BGP_ATTR_PREFIX_SID 40
#define BGP_ATTR_SRTE_COLOR 51
#ifdef ENABLE_BGP_VNC_ATTR
#define BGP_NOTIFY_OPEN_AUTH_FAILURE 5
#define BGP_NOTIFY_OPEN_UNACEP_HOLDTIME 6
#define BGP_NOTIFY_OPEN_UNSUP_CAPBL 7
+#define BGP_NOTIFY_OPEN_ROLE_MISMATCH 11
/* BGP_NOTIFY_UPDATE_ERR sub codes. */
#define BGP_NOTIFY_UPDATE_MAL_ATTR 1
BGP_ERR_GR_INVALID_CMD = -32,
BGP_ERR_GR_OPERATION_FAILED = -33,
BGP_GR_NO_OPERATION = -34,
+
+ /*BGP Open Policy ERRORS */
+ BGP_ERR_INVALID_ROLE_NAME = -35,
+ BGP_ERR_INVALID_INTERNAL_ROLE = -36
};
/*
/* Prototypes. */
extern void bgp_terminate(void);
extern void bgp_reset(void);
-extern time_t bgp_clock(void);
extern void bgp_zclient_reset(void);
extern struct bgp *bgp_get_default(void);
extern struct bgp *bgp_lookup(as_t, const char *);
extern void bm_wait_for_fib_set(bool set);
extern void bgp_suppress_fib_pending_set(struct bgp *bgp, bool set);
-extern int bgp_cluster_id_set(struct bgp *, struct in_addr *);
-extern int bgp_cluster_id_unset(struct bgp *);
+extern void bgp_cluster_id_set(struct bgp *bgp, struct in_addr *cluster_id);
+extern void bgp_cluster_id_unset(struct bgp *bgp);
-extern void bgp_confederation_id_set(struct bgp *, as_t);
-extern int bgp_confederation_id_unset(struct bgp *);
+extern void bgp_confederation_id_set(struct bgp *bgp, as_t as);
+extern void bgp_confederation_id_unset(struct bgp *bgp);
extern bool bgp_confederation_peers_check(struct bgp *, as_t);
-extern int bgp_confederation_peers_add(struct bgp *, as_t);
-extern int bgp_confederation_peers_remove(struct bgp *, as_t);
+extern void bgp_confederation_peers_add(struct bgp *bgp, as_t as);
+extern void bgp_confederation_peers_remove(struct bgp *bgp, as_t as);
extern void bgp_timers_set(struct bgp *, uint32_t keepalive, uint32_t holdtime,
uint32_t connect_retry, uint32_t delayopen);
extern void bgp_timers_unset(struct bgp *);
-extern int bgp_default_local_preference_set(struct bgp *, uint32_t);
-extern int bgp_default_local_preference_unset(struct bgp *);
+extern void bgp_default_local_preference_set(struct bgp *bgp,
+ uint32_t local_pref);
+extern void bgp_default_local_preference_unset(struct bgp *bgp);
-extern int bgp_default_subgroup_pkt_queue_max_set(struct bgp *bgp, uint32_t);
-extern int bgp_default_subgroup_pkt_queue_max_unset(struct bgp *bgp);
+extern void bgp_default_subgroup_pkt_queue_max_set(struct bgp *bgp,
+ uint32_t queue_size);
+extern void bgp_default_subgroup_pkt_queue_max_unset(struct bgp *bgp);
-extern int bgp_listen_limit_set(struct bgp *, int);
-extern int bgp_listen_limit_unset(struct bgp *);
+extern void bgp_listen_limit_set(struct bgp *bgp, int listen_limit);
+extern void bgp_listen_limit_unset(struct bgp *bgp);
extern bool bgp_update_delay_active(struct bgp *);
extern bool bgp_update_delay_configured(struct bgp *);
-extern int bgp_afi_safi_peer_exists(struct bgp *bgp, afi_t afi, safi_t safi);
+extern bool bgp_afi_safi_peer_exists(struct bgp *bgp, afi_t afi, safi_t safi);
extern void peer_as_change(struct peer *, as_t, int);
extern int peer_remote_as(struct bgp *, union sockunion *, const char *, as_t *,
int);
extern int peer_group_bind(struct bgp *, union sockunion *, struct peer *,
struct peer_group *, as_t *);
-extern int peer_flag_set(struct peer *, uint32_t);
-extern int peer_flag_unset(struct peer *, uint32_t);
-extern void peer_flag_inherit(struct peer *peer, uint32_t flag);
+extern int peer_flag_set(struct peer *peer, uint64_t flag);
+extern int peer_flag_unset(struct peer *peer, uint64_t flag);
+extern void peer_flag_inherit(struct peer *peer, uint64_t flag);
-extern int peer_af_flag_set(struct peer *, afi_t, safi_t, uint32_t);
-extern int peer_af_flag_unset(struct peer *, afi_t, safi_t, uint32_t);
+extern int peer_af_flag_set(struct peer *peer, afi_t afi, safi_t safi,
+ uint64_t flag);
+extern int peer_af_flag_unset(struct peer *peer, afi_t afi, safi_t safi,
+ uint64_t flag);
extern int peer_af_flag_check(struct peer *, afi_t, safi_t, uint32_t);
extern void peer_af_flag_inherit(struct peer *peer, afi_t afi, safi_t safi,
- uint32_t flag);
+ uint64_t flag);
extern void peer_change_action(struct peer *peer, afi_t afi, safi_t safi,
enum peer_change_type type);
extern int peer_ebgp_multihop_unset(struct peer *);
extern int is_ebgp_multihop_configured(struct peer *peer);
+extern int peer_role_set(struct peer *peer, uint8_t role, bool strict_mode);
+extern int peer_role_unset(struct peer *peer);
+
extern void peer_description_set(struct peer *, const char *);
extern void 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 *, const union sockunion *);
-extern int peer_update_source_unset(struct peer *);
+extern void peer_update_source_addr_set(struct peer *peer,
+ const union sockunion *su);
+extern void peer_update_source_unset(struct peer *peer);
extern int peer_default_originate_set(struct peer *peer, afi_t afi, safi_t safi,
const char *rmap,
extern void peer_tx_shutdown_message_unset(struct peer *);
extern void bgp_route_map_update_timer(struct thread *thread);
+extern const char *bgp_get_name_by_role(uint8_t role);
+
extern void bgp_route_map_terminate(void);
extern int peer_cmp(struct peer *p1, struct peer *p2);
static inline char *timestamp_string(time_t ts)
{
time_t tbuf;
- tbuf = time(NULL) - (bgp_clock() - ts);
+ tbuf = time(NULL) - (monotime(NULL) - ts);
return ctime(&tbuf);
}