]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: BGP Graceful Restart Per Neighbor(BGPN), DS & header files.
authorbisdhdh <biswajit.sadhu@gmail.com>
Wed, 23 Oct 2019 05:32:45 +0000 (11:02 +0530)
committerbisdhdh <biswajit.sadhu@gmail.com>
Thu, 23 Jan 2020 04:04:25 +0000 (09:34 +0530)
This pr contains all the header files changes for BGP GR per Neighbour(BGPN)
feature.

Signed-off-by: Biswajit Sadhu <sadhub@vmware.com>
bgpd/bgp_debug.h
bgpd/bgp_fsm.h
bgpd/bgp_vty.h
bgpd/bgpd.h
lib/command.h

index e1072c3df25116c2922ef89ab91f7c8de11e1014..9dff8266fa68647357be60f2b117f4184b76c350 100644 (file)
@@ -76,6 +76,7 @@ extern unsigned long conf_bgp_debug_vpn;
 extern unsigned long conf_bgp_debug_flowspec;
 extern unsigned long conf_bgp_debug_labelpool;
 extern unsigned long conf_bgp_debug_pbr;
+extern unsigned long conf_bgp_debug_graceful_restart;
 
 extern unsigned long term_bgp_debug_as4;
 extern unsigned long term_bgp_debug_neighbor_events;
@@ -91,6 +92,8 @@ extern unsigned long term_bgp_debug_vpn;
 extern unsigned long term_bgp_debug_flowspec;
 extern unsigned long term_bgp_debug_labelpool;
 extern unsigned long term_bgp_debug_pbr;
+extern unsigned long term_bgp_debug_graceful_restart;
+
 
 extern struct list *bgp_debug_neighbor_events_peers;
 extern struct list *bgp_debug_keepalive_peers;
@@ -131,6 +134,8 @@ struct bgp_debug_filter {
 #define BGP_DEBUG_PACKET_SEND         0x01
 #define BGP_DEBUG_PACKET_SEND_DETAIL  0x02
 
+#define BGP_DEBUG_GRACEFUL_RESTART     0x01
+
 #define CONF_DEBUG_ON(a, b)    (conf_bgp_debug_ ## a |= (BGP_DEBUG_ ## b))
 #define CONF_DEBUG_OFF(a, b)   (conf_bgp_debug_ ## a &= ~(BGP_DEBUG_ ## b))
 
index 6f955c71beea542eac43142edb34c1d825391bce..da415db64c488c3fd867e1134a2d8aa065c17134 100644 (file)
 #define FSM_PEER_TRANSFERRED    2
 #define FSM_PEER_TRANSITIONED   3
 
+#define BGP_PEER_GR_HELPER_ENABLE(peer)        \
+       do {            \
+               UNSET_FLAG( \
+                       peer->peer_gr_new_status_flag,          \
+                       PEER_GRACEFUL_RESTART_NEW_STATE_RESTART);       \
+               SET_FLAG( \
+                       peer->peer_gr_new_status_flag,  \
+                       PEER_GRACEFUL_RESTART_NEW_STATE_HELPER);\
+       } while (0)
+
+
+
+#define BGP_PEER_GR_ENABLE(peer)\
+       do {                            \
+               SET_FLAG(   \
+                       peer->peer_gr_new_status_flag,  \
+                       PEER_GRACEFUL_RESTART_NEW_STATE_RESTART); \
+               UNSET_FLAG( \
+                       peer->peer_gr_new_status_flag,  \
+                       PEER_GRACEFUL_RESTART_NEW_STATE_HELPER);\
+       } while (0)
+
+
+#define BGP_PEER_GR_DISABLE(peer)\
+       do {                            \
+               UNSET_FLAG( \
+                       peer->peer_gr_new_status_flag,  \
+                       PEER_GRACEFUL_RESTART_NEW_STATE_RESTART);\
+               UNSET_FLAG(\
+                       peer->peer_gr_new_status_flag, \
+                       PEER_GRACEFUL_RESTART_NEW_STATE_HELPER);\
+       } while (0)
+
+
+#define BGP_PEER_GR_GLOBAL_INHERIT_SET(peer) \
+                       SET_FLAG(peer->peer_gr_new_status_flag, \
+                               PEER_GRACEFUL_RESTART_NEW_STATE_INHERIT)
+
+
+#define BGP_PEER_GR_GLOBAL_INHERIT_UNSET(peer) \
+                       UNSET_FLAG(peer->peer_gr_new_status_flag, \
+                               PEER_GRACEFUL_RESTART_NEW_STATE_INHERIT)
+
+
 /* Prototypes. */
 extern void bgp_fsm_event_update(struct peer *peer, int valid);
 extern int bgp_event(struct thread *);
@@ -87,6 +131,29 @@ extern void bgp_start_routeadv(struct bgp *);
 extern void bgp_adjust_routeadv(struct peer *);
 
 #include "hook.h"
-DECLARE_HOOK(peer_backward_transition, (struct peer * peer), (peer))
+DECLARE_HOOK(peer_backward_transition, (struct peer *peer), (peer))
+DECLARE_HOOK(peer_established, (struct peer *peer), (peer))
+
+int bgp_gr_update_all(struct bgp *bgp, int global_GR_Cmd);
+int bgp_neighbor_graceful_restart(struct peer *peer,
+                       int peer_GR_Cmd);
+unsigned int bgp_peer_gr_action(struct peer *peer,
+               int old_peer_state, int new_peer_state);
+void bgp_peer_move_to_gr_mode(struct peer *peer, int new_state);
+unsigned int bgp_peer_gr_helper_enable(struct peer *peer);
+unsigned int bgp_peer_gr_enable(struct peer *peer);
+unsigned int bgp_peer_gr_global_inherit(struct peer *peer);
+unsigned int bgp_peer_gr_disable(struct peer *peer);
+enum peer_mode bgp_peer_gr_mode_get(struct peer *peer);
+enum global_mode bgp_global_gr_mode_get(struct bgp *bgp);
+enum peer_mode bgp_get_peer_gr_mode_from_flags(struct peer *peer);
+unsigned int bgp_peer_gr_global_inherit_unset(struct peer *peer);
+int bgp_gr_lookup_n_update_all_peer(struct bgp *bgp,
+               enum global_mode global_new_state,
+               enum global_mode global_old_state);
+
+void bgp_peer_gr_flags_update(struct peer *peer);
+extern int bgp_peer_flag_unset(struct peer *peer, int flag_bit);
+extern int bgp_peer_flag_set(struct peer *peer, int flag_bit);
 
 #endif /* _QUAGGA_BGP_FSM_H */
index 5f3ce9cd8e54284a68083e53dfbb138a838e9596..e1109841d2b41c1578c7ccfedfa5f1338087f633 100644 (file)
@@ -22,7 +22,7 @@
 #define _QUAGGA_BGP_VTY_H
 
 #include "bgpd/bgpd.h"
-
+#include "stream.h"
 struct bgp;
 
 #define BGP_INSTANCE_HELP_STR "BGP view\nBGP VRF\nView/VRF name\n"
@@ -46,6 +46,32 @@ struct bgp;
        "Address Family modifier\n"                                            \
        "Address Family modifier\n"
 
+
+
+#define SHOW_GR_HEADER \
+       "Codes: GR - Graceful Restart," \
+       " * -  Inheriting Global GR Config,\n" \
+       "       Restart - GR Mode-Restarting," \
+       " Helper - GR Mode-Helper,\n" \
+       "       Disable - GR Mode-Disable.\n\n"
+
+#define BGP_SHOW_PEER_GR_CAPABILITY( \
+                       vty, p, use_json, json) \
+       do {                    \
+               bgp_show_neighbor_graceful_restart_local_mode( \
+                               vty, p, use_json, json);                \
+               bgp_show_neighbor_graceful_restart_remote_mode( \
+                               vty, p, use_json, json); \
+               bgp_show_neighnor_graceful_restart_rbit( \
+                               vty, p, use_json, json);        \
+               bgp_show_neighbor_graceful_restart_time( \
+                               vty, p, use_json, json);        \
+               bgp_show_neighbor_graceful_restart_capability_per_afi_safi(\
+                                               vty, p, use_json, json); \
+       } while (0)
+
+
+
 extern void bgp_vty_init(void);
 extern const char *get_afi_safi_str(afi_t afi, safi_t safi, bool for_json);
 extern int bgp_get_vty(struct bgp **bgp, as_t *as, const char *name,
index 4c4787ed5b9902d0c03ce88733238569c9fecf1b..b0fe7b912a236c7152a6b1e8cd2e507e90bef55e 100644 (file)
@@ -232,6 +232,46 @@ 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.  */
@@ -356,7 +396,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)
@@ -368,6 +411,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)
@@ -462,6 +509,8 @@ struct bgp {
        /* 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 {
@@ -726,6 +775,37 @@ 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 {
@@ -947,6 +1027,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,7 +1076,8 @@ struct peer {
 #define PEER_FLAG_DEFAULT_ORIGINATE         (1 << 9) /* default-originate */
 #define PEER_FLAG_REMOVE_PRIVATE_AS         (1 << 10) /* remove-private-as */
 #define PEER_FLAG_ALLOWAS_IN                (1 << 11) /* set allowas-in */
-#define PEER_FLAG_ORF_PREFIX_SM             (1 << 12) /* orf capability send-mode */
+/* orf capability send-mode */
+#define PEER_FLAG_ORF_PREFIX_SM             (1 << 12)
 #define PEER_FLAG_ORF_PREFIX_RM             (1 << 13) /* orf capability receive-mode */
 #define PEER_FLAG_MAX_PREFIX                (1 << 14) /* maximum prefix */
 #define PEER_FLAG_MAX_PREFIX_WARNING        (1 << 15) /* maximum prefix warning-only */
@@ -1521,6 +1623,12 @@ 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.
  */
@@ -1773,6 +1881,15 @@ 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 */
+
+int bgp_peer_flag_set(struct peer *peer, int flag_bit);
+int 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)
 {
index c8dd04604dd4338ef6f9073301ec4c35f6ccfd6f..ca2ff1d5fb87e7712b1b9ac1a58f002b20e30b61 100644 (file)
@@ -418,8 +418,25 @@ struct cmd_node {
 #define DAEMONS_LIST                                                           \
        "<zebra|ripd|ripngd|ospfd|ospf6d|bgpd|isisd|pbrd|fabricd|pimd|staticd|sharpd|vrrpd|ldpd>"
 
+/* Graceful Restart cli help strings */
+
+#define GR_CMD "Global Graceful Restart command\n"
+#define NO_GR_CMD "Undo Global Graceful Restart command\n"
+#define GR "Global Graceful Restart - GR Mode\n"
+#define GR_DISABLE "Global Graceful Restart - Disable Mode\n"
+#define NO_GR_DISABLE "Undo Global Graceful Restart - Disable Mode\n"
+#define GR_DEBUG "Graceful Restart - Enable Debug Logs\n"
+#define GR_SHOW "Graceful Restart - Show command for Global and all neighbor mode\n"
+#define GR_NEIGHBOR_CMD "Graceful Restart command for a neighbor\n"
+#define NO_GR_NEIGHBOR_CMD "Undo Graceful Restart command for a neighbor\n"
+#define GR_NEIGHBOR_DISABLE_CMD "Graceful Restart Disable command for a neighbor\n"
+#define NO_GR_NEIGHBOR_DISABLE_CMD "Undo Graceful Restart Disable command for a neighbor\n"
+#define GR_NEIGHBOR_HELPER_CMD "Graceful Restart Helper command for a neighbor\n"
+#define NO_GR_NEIGHBOR_HELPER_CMD "Undo Graceful Restart Helper command for a neighbor\n"
+
+
 /* Prototypes. */
-extern void install_node(struct cmd_node *, int (*)(struct vty *));
+extern void install_node(struct cmd_node *node, int (*)(struct vty *));
 extern void install_default(enum node_type);
 extern void install_element(enum node_type, const struct cmd_element *);