]> git.proxmox.com Git - mirror_frr.git/blobdiff - bgpd/bgpd.h
bgpd: Adding BGP GR Global & Per Neighbour FSM changes
[mirror_frr.git] / bgpd / bgpd.h
index 9b0346da12b325a8523977d566df0aaf91d66df2..028f1179cfe37c284a531ae4499983da1488037f 100644 (file)
@@ -156,6 +156,9 @@ struct bgp_master {
        /* BGP-EVPN VRF ID. Defaults to default VRF (if any) */
        struct bgp* bgp_evpn;
 
+       /* How big should we set the socket buffer size */
+       uint32_t socket_buffer;
+
        bool terminating;       /* global flag that sigint terminate seen */
        QOBJ_FIELDS
 };
@@ -229,6 +232,43 @@ enum bgp_instance_type {
        BGP_INSTANCE_TYPE_VIEW
 };
 
+
+/* BGP GR Global ds */
+
+#define GLOBAL_MODE 4
+#define EVENT_CMD 4
+
+/* Graceful restart selection deferral timer info */
+struct graceful_restart_info {
+       /* Count of EOR message expected */
+       uint32_t eor_required;
+       /* Count of EOR received */
+       uint32_t eor_received;
+       /* Deferral Timer */
+       struct thread *t_select_deferral;
+       /* Route list */
+       struct list *route_list;
+       /* Best route select */
+       struct thread *t_route_select;
+};
+
+enum global_mode {
+       GLOBAL_HELPER = 0, /* This is the default mode */
+       GLOBAL_GR,
+       GLOBAL_DISABLE,
+       GLOBAL_INVALID
+};
+
+enum global_gr_command {
+       GLOBAL_GR_CMD = 0,
+       NO_GLOBAL_GR_CMD,
+       GLOBAL_DISABLE_CMD,
+       NO_GLOBAL_DISABLE_CMD
+};
+
+#define BGP_GR_SUCCESS 0
+#define BGP_GR_FAILURE 1
+
 /* BGP instance structure.  */
 struct bgp {
        /* AS number of this BGP instance.  */
@@ -353,7 +393,10 @@ struct bgp {
 #define BGP_FLAG_IMPORT_CHECK             (1 << 9)
 #define BGP_FLAG_NO_FAST_EXT_FAILOVER     (1 << 10)
 #define BGP_FLAG_LOG_NEIGHBOR_CHANGES     (1 << 11)
+
+/* This flag is set when we have full BGP Graceful-Restart mode enable */
 #define BGP_FLAG_GRACEFUL_RESTART         (1 << 12)
+
 #define BGP_FLAG_ASPATH_CONFED            (1 << 13)
 #define BGP_FLAG_ASPATH_MULTIPATH_RELAX   (1 << 14)
 #define BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY (1 << 15)
@@ -365,6 +408,10 @@ struct bgp {
 #define BGP_FLAG_GRACEFUL_SHUTDOWN        (1 << 21)
 #define BGP_FLAG_DELETE_IN_PROGRESS       (1 << 22)
 
+
+       enum global_mode GLOBAL_GR_FSM[GLOBAL_MODE][EVENT_CMD];
+       enum global_mode global_gr_present_state;
+
        /* BGP Per AF flags */
        uint16_t af_flags[AFI_MAX][SAFI_MAX];
 #define BGP_CONFIG_DAMPENING                           (1 << 0)
@@ -454,10 +501,13 @@ struct bgp {
        /* BGP default timer.  */
        uint32_t default_holdtime;
        uint32_t default_keepalive;
+       uint32_t default_connect_retry;
 
        /* BGP graceful restart */
        uint32_t restart_time;
        uint32_t stalepath_time;
+       uint32_t select_defer_time;
+       struct graceful_restart_info gr_info[AFI_MAX][SAFI_MAX];
 
        /* Maximum-paths configuration */
        struct bgp_maxpaths_cfg {
@@ -501,6 +551,13 @@ struct bgp {
 #define DEFAULT_EBGP_POLICY_DISABLED 0
 #define DEFAULT_EBGP_POLICY_ENABLED 1
 
+       /* draft-ietf-idr-deprecate-as-set-confed-set
+        * Reject aspaths with AS_SET and/or AS_CONFED_SET.
+        */
+       bool reject_as_sets;
+#define BGP_REJECT_AS_SETS_DISABLED 0
+#define BGP_REJECT_AS_SETS_ENABLED 1
+
        struct bgp_evpn_info *evpn_info;
 
        /* EVPN - use RFC 8365 to auto-derive RT */
@@ -632,6 +689,8 @@ struct bgp_nexthop {
 #define RMAP_OUT 1
 #define RMAP_MAX 2
 
+#define BGP_DEFAULT_TTL 1
+
 #include "filter.h"
 
 /* BGP filter structure. */
@@ -713,6 +772,36 @@ struct peer_af {
        safi_t safi;
        int afid;
 };
+/* BGP GR per peer ds */
+
+#define PEER_MODE 5
+#define PEER_EVENT_CMD 6
+
+enum peer_mode {
+       PEER_HELPER = 0,
+       PEER_GR,
+       PEER_DISABLE,
+       PEER_INVALID,
+       PEER_GLOBAL_INHERIT /* This is the default mode */
+
+};
+
+enum peer_gr_command {
+       PEER_GR_CMD = 0,
+       NO_PEER_GR_CMD,
+       PEER_DISABLE_cmd,
+       NO_PEER_DISABLE_CMD,
+       PEER_HELPER_CMD,
+       NO_PEER_HELPER_CMD
+};
+
+typedef unsigned int  (*bgp_peer_gr_action_ptr)(struct peer *, int, int);
+
+struct bgp_peer_gr {
+       enum peer_mode next_state;
+       bgp_peer_gr_action_ptr action_fun;
+};
+
 
 /* BGP neighbor structure. */
 struct peer {
@@ -934,6 +1023,27 @@ struct peer {
 #define PEER_FLAG_LOCAL_AS                  (1 << 21) /* local-as */
 #define PEER_FLAG_UPDATE_SOURCE             (1 << 22) /* update-source */
 
+       /* BGP-GR Peer related  flags */
+#define PEER_FLAG_GRACEFUL_RESTART_HELPER   (1 << 23) /* Helper */
+#define PEER_FLAG_GRACEFUL_RESTART          (1 << 24) /* Graceful Restart */
+#define PEER_FLAG_GRACEFUL_RESTART_GLOBAL_INHERIT (1 << 25) /* Global-Inherit */
+
+       /*
+        *GR-Disabled mode means unset PEER_FLAG_GRACEFUL_RESTART
+        *& PEER_FLAG_GRACEFUL_RESTART_HELPER
+        *and PEER_FLAG_GRACEFUL_RESTART_GLOBAL_INHERIT
+        */
+
+       struct bgp_peer_gr PEER_GR_FSM[PEER_MODE][PEER_EVENT_CMD];
+       enum peer_mode peer_gr_present_state;
+       /* Non stop forwarding afi-safi count for BGP gr feature*/
+       uint8_t nsf_af_count;
+
+       uint8_t peer_gr_new_status_flag;
+#define PEER_GRACEFUL_RESTART_NEW_STATE_HELPER   (1 << 0)
+#define PEER_GRACEFUL_RESTART_NEW_STATE_RESTART  (1 << 1)
+#define PEER_GRACEFUL_RESTART_NEW_STATE_INHERIT  (1 << 2)
+
        /* outgoing message sent in CEASE_ADMIN_SHUTDOWN notify */
        char *tx_shutdown_message;
 
@@ -975,6 +1085,7 @@ struct peer {
 #define PEER_FLAG_WEIGHT                    (1 << 24) /* weight */
 #define PEER_FLAG_ALLOWAS_IN_ORIGIN         (1 << 25) /* allowas-in origin */
 #define PEER_FLAG_SEND_LARGE_COMMUNITY      (1 << 26) /* Send large Communities */
+#define PEER_FLAG_MAX_PREFIX_OUT            (1 << 27) /* outgoing maximum prefix */
 
        enum bgp_addpath_strat addpath_type[AFI_MAX][SAFI_MAX];
 
@@ -1107,9 +1218,6 @@ struct peer {
        /* timestamp when the last msg was written */
        _Atomic time_t last_update;
 
-       /* Send prefix count. */
-       unsigned long scount[AFI_MAX][SAFI_MAX];
-
        /* Notify data. */
        struct bgp_notify notify;
 
@@ -1160,6 +1268,9 @@ struct peer {
        uint16_t pmax_restart[AFI_MAX][SAFI_MAX];
 #define MAXIMUM_PREFIX_THRESHOLD_DEFAULT 75
 
+       /* Send prefix count. */
+       uint32_t pmax_out[AFI_MAX][SAFI_MAX];
+
        /* allowas-in. */
        char allowas_in[AFI_MAX][SAFI_MAX];
 
@@ -1198,6 +1309,7 @@ struct peer {
 #define PEER_DOWN_NBR_ADDR              28 /* Waiting for peer IPv6 IP Addr */
 #define PEER_DOWN_VRF_UNINIT            29 /* Associated VRF is not init yet */
 #define PEER_DOWN_NOAFI_ACTIVATED       30 /* No AFI/SAFI activated for peer */
+#define PEER_DOWN_AS_SETS_REJECT        31 /* Reject routes with AS_SET */
        size_t last_reset_cause_size;
        uint8_t last_reset_cause[BGP_MAX_PACKET_SIZE];
 
@@ -1220,6 +1332,9 @@ struct peer {
        char *hostname;
        char *domainname;
 
+       /* Sender side AS path loop detection. */
+       bool as_path_loop_detection;
+
        QOBJ_FIELDS
 };
 DECLARE_QOBJ_TYPE(peer)
@@ -1413,13 +1528,17 @@ 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_DEFAULT_HOLDTIME                      DFLT_BGP_HOLDTIME
-#define BGP_DEFAULT_KEEPALIVE                     DFLT_BGP_KEEPALIVE
+/* The following 3 are RFC defaults that are overridden in bgp_vty.c with
+ * version-/profile-specific values.  The values here do not matter, they only
+ * exist to provide a clear layering separation between core and CLI.
+ */
+#define BGP_DEFAULT_HOLDTIME                   180
+#define BGP_DEFAULT_KEEPALIVE                   60
+#define BGP_DEFAULT_CONNECT_RETRY              120
+
 #define BGP_DEFAULT_EBGP_ROUTEADV                0
 #define BGP_DEFAULT_IBGP_ROUTEADV                0
-#define BGP_DEFAULT_CONNECT_RETRY                 DFLT_BGP_TIMERS_CONNECT
 
 /* BGP default local preference.  */
 #define BGP_DEFAULT_LOCAL_PREF                 100
@@ -1442,9 +1561,6 @@ struct bgp_nlri {
 #define BGP_VTY_PORT                          2605
 #define BGP_DEFAULT_CONFIG             "bgpd.conf"
 
-/* Check AS path loop when we send NLRI.  */
-/* #define BGP_SEND_ASPATH_CHECK */
-
 /* BGP Dynamic Neighbors feature */
 #define BGP_DYNAMIC_NEIGHBORS_LIMIT_DEFAULT    100
 #define BGP_DYNAMIC_NEIGHBORS_LIMIT_MIN          1
@@ -1467,6 +1583,7 @@ enum bgp_clear_type {
 
 /* BGP error codes.  */
 #define BGP_SUCCESS                               0
+#define BGP_CREATED                               1
 #define BGP_ERR_INVALID_VALUE                    -1
 #define BGP_ERR_INVALID_FLAG                     -2
 #define BGP_ERR_INVALID_AS                       -3
@@ -1501,6 +1618,11 @@ enum bgp_clear_type {
 #define BGP_ERR_INVALID_FOR_DIRECT_PEER         -34
 #define BGP_ERR_PEER_SAFI_CONFLICT              -35
 
+/* BGP GR ERRORS */
+#define BGP_ERR_GR_INVALID_CMD                  -36
+#define BGP_ERR_GR_OPERATION_FAILED             -37
+#define BGP_GR_NO_OPERATION                     -38
+
 /*
  * Enumeration of different policy kinds a peer can be configured with.
  */
@@ -1575,7 +1697,8 @@ extern char *peer_uptime(time_t uptime2, char *buf, size_t len, bool use_json,
 
 extern int bgp_config_write(struct vty *);
 
-extern void bgp_master_init(struct thread_master *master);
+extern void bgp_master_init(struct thread_master *master,
+                           const int buffer_size);
 
 extern void bgp_init(unsigned short instance);
 extern void bgp_pthreads_run(void);
@@ -1612,7 +1735,8 @@ 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 *, uint32_t keepalive, uint32_t holdtime);
+extern int bgp_timers_set(struct bgp *, uint32_t keepalive, uint32_t holdtime,
+                         uint32_t connect_retry);
 extern int bgp_timers_unset(struct bgp *);
 
 extern int bgp_default_local_preference_set(struct bgp *, uint32_t);
@@ -1632,9 +1756,11 @@ extern int peer_remote_as(struct bgp *, union sockunion *, const char *, as_t *,
                          int, afi_t, safi_t);
 extern int peer_group_remote_as(struct bgp *, const char *, as_t *, int);
 extern int peer_delete(struct peer *peer);
+extern int peer_notify_unconfig(struct peer *peer);
 extern int peer_group_delete(struct peer_group *);
 extern int peer_group_remote_as_delete(struct peer_group *);
 extern int peer_group_listen_range_add(struct peer_group *, struct prefix *);
+extern int peer_group_notify_unconfig(struct peer_group *group);
 
 extern int peer_activate(struct peer *, afi_t, safi_t);
 extern int peer_deactivate(struct peer *, afi_t, safi_t);
@@ -1749,6 +1875,14 @@ extern int peer_af_delete(struct peer *, afi_t, safi_t);
 
 extern void bgp_close(void);
 extern void bgp_free(struct bgp *);
+void bgp_gr_apply_running_config(void);
+
+/* BGP GR */
+void bgp_peer_flag_set(struct peer *peer, int flag_bit);
+void bgp_peer_flag_unset(struct peer *peer, int flag_bit);
+int bgp_peer_flag_check(struct peer *peer, int flag_bit);
+int bgp_global_gr_init(struct bgp *bgp);
+int bgp_peer_gr_init(struct peer *peer);
 
 static inline struct bgp *bgp_lock(struct bgp *bgp)
 {