]> git.proxmox.com Git - mirror_frr.git/blobdiff - bgpd/bgpd.h
*: track version & "defaults" in configs
[mirror_frr.git] / bgpd / bgpd.h
index 3f1aff846e944943464f58535c2a105ac0632ba1..f1e5d7b0ad894e277b9dbf766344172b1e1bcb1e 100644 (file)
@@ -22,14 +22,21 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 #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;
 
@@ -63,6 +70,9 @@ enum bgp_af_index
   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
 };
 
@@ -84,7 +94,6 @@ struct bgp_master
 
   /* work queues */
   struct work_queue *process_main_queue;
-  struct work_queue *process_rsclient_queue;
   
   /* Listening sockets */
   struct list *listen_sockets;
@@ -105,8 +114,13 @@ struct bgp_master
 #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.  */
@@ -128,6 +142,21 @@ struct bgp_redist
   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 
 {
@@ -136,6 +165,10 @@ 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;
@@ -145,6 +178,7 @@ struct bgp
 
   /* BGP peer. */
   struct list *peer;
+  struct hash *peerhash;
 
   /* BGP peer group.  */
   struct list *group;
@@ -155,9 +189,6 @@ struct bgp
     /* 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];
 
   /*
@@ -181,13 +212,13 @@ struct bgp
 
   /* 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;
@@ -219,7 +250,6 @@ struct bgp
   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];
@@ -253,15 +283,24 @@ struct bgp
 #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];
 
@@ -277,19 +316,14 @@ struct bgp
   /* 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;
@@ -315,10 +349,21 @@ struct bgp
 
   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
@@ -364,6 +409,8 @@ struct bgp_nexthop
 #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
 
@@ -372,11 +419,11 @@ struct bgp_rd
   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
@@ -480,8 +527,7 @@ struct peer
 
   /* 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];
@@ -504,9 +550,6 @@ struct peer
   /* 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;
@@ -538,6 +581,7 @@ struct peer
   /* 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 */
@@ -548,8 +592,9 @@ struct 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;
@@ -620,6 +665,9 @@ struct peer
 #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];
@@ -647,6 +695,11 @@ struct peer
 #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;
@@ -679,12 +732,10 @@ struct peer
 
   /* 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;
@@ -695,7 +746,6 @@ struct peer
   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;
@@ -707,7 +757,6 @@ struct peer
   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;
@@ -741,7 +790,8 @@ struct peer
   /* 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];
@@ -779,6 +829,9 @@ struct peer
   /* 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 */
@@ -805,6 +858,8 @@ struct peer
 #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];
 
@@ -827,6 +882,11 @@ 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)
 
@@ -847,12 +907,6 @@ struct bgp_nlri
   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
 
@@ -900,6 +954,10 @@ struct bgp_nlri
 #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
@@ -995,14 +1053,13 @@ struct bgp_nlri
 #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
@@ -1016,9 +1073,7 @@ struct bgp_nlri
 
 /* 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
@@ -1042,8 +1097,7 @@ enum bgp_clear_type
   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. */
@@ -1052,9 +1106,6 @@ enum bgp_clear_type
 #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
@@ -1063,39 +1114,34 @@ enum bgp_clear_type
 #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.
@@ -1120,11 +1166,10 @@ extern int bgp_nexthop_set (union sockunion *, union sockunion *,
 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 *);
@@ -1152,8 +1197,9 @@ extern struct peer *peer_unlock_with_caller(const char *, struct peer *);
 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 *);
@@ -1165,12 +1211,15 @@ extern void bgp_master_init (void);
 
 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);
@@ -1180,7 +1229,8 @@ extern int bgp_flag_check (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 *);
@@ -1192,7 +1242,7 @@ extern int 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 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);
@@ -1206,7 +1256,6 @@ extern int bgp_listen_limit_unset (struct bgp *);
 
 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);
@@ -1218,11 +1267,11 @@ extern int peer_group_listen_range_add(struct peer_group *, struct prefix *);
 
 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);
@@ -1235,11 +1284,11 @@ extern int peer_ebgp_multihop_set (struct peer *, int);
 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 *);
@@ -1248,10 +1297,10 @@ extern int peer_default_originate_unset (struct peer *, afi_t, safi_t);
 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);
@@ -1266,7 +1315,7 @@ extern void peer_interface_unset (struct peer *);
 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);
@@ -1306,7 +1355,6 @@ extern struct peer_af * peer_af_create (struct peer *, afi_t, safi_t);
 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
@@ -1326,6 +1374,9 @@ afindex (afi_t afi, safi_t safi)
        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;
@@ -1340,6 +1391,12 @@ afindex (afi_t afi, safi_t safi)
        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;
@@ -1351,15 +1408,11 @@ afindex (afi_t afi, safi_t safi)
     }
 }
 
-/* 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;
 }
@@ -1370,7 +1423,8 @@ peer_afi_active_nego (const struct peer *peer, afi_t afi)
 {
   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;
 }
@@ -1384,8 +1438,11 @@ peer_group_af_configured (struct peer_group *group)
   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;
 }
@@ -1428,4 +1485,49 @@ peer_cap_enhe (struct peer *peer)
   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 */