Skip to content

Commit

Permalink
bgpd:BGP Graceful Restart Per Neighbor(BGPN), DS & header files.
Browse files Browse the repository at this point in the history
This pr contains all the header files changes for BGP GR per Neighbor(BGPN)
feature.

Signed-off-by: Biswajit Sadhu <sadhub@vmware.com>
  • Loading branch information
bisdhdh committed Oct 22, 2019
1 parent 3e6fd94 commit 6393644
Show file tree
Hide file tree
Showing 5 changed files with 237 additions and 3 deletions.
5 changes: 5 additions & 0 deletions bgpd/bgp_debug.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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))

Expand Down
69 changes: 68 additions & 1 deletion bgpd/bgp_fsm.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,50 @@
#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 *);
Expand Down Expand Up @@ -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 */
27 changes: 27 additions & 0 deletions bgpd/bgp_vty.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#ifndef _QUAGGA_BGP_VTY_H
#define _QUAGGA_BGP_VTY_H

#include "stream.h"
struct bgp;

#define BGP_INSTANCE_HELP_STR "BGP view\nBGP VRF\nView/VRF name\n"
Expand All @@ -44,6 +45,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 void bgp_config_write_update_delay(struct vty *vty, struct bgp *bgp);
Expand Down
120 changes: 119 additions & 1 deletion bgpd/bgpd.h
Original file line number Diff line number Diff line change
Expand Up @@ -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. */
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand Down Expand Up @@ -461,6 +508,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 {
Expand Down Expand Up @@ -716,6 +765,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 {
Expand Down Expand Up @@ -937,6 +1017,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;

Expand Down Expand Up @@ -965,7 +1066,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 */
Expand Down Expand Up @@ -1223,6 +1325,7 @@ struct peer {
char *hostname;
char *domainname;


QOBJ_FIELDS
};
DECLARE_QOBJ_TYPE(peer)
Expand Down Expand Up @@ -1504,6 +1607,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.
*/
Expand Down Expand Up @@ -1753,6 +1862,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)
{
Expand Down
19 changes: 18 additions & 1 deletion lib/command.h
Original file line number Diff line number Diff line change
Expand Up @@ -418,8 +418,25 @@ struct cmd_node {
#define DAEMONS_LIST \
"<zebra|ripd|ripngd|ospfd|ospf6d|bgpd|isisd|pbrd|fabricd|pimd|staticd|sharpd|vrrpd>"

/* 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, struct cmd_element *);

Expand Down

0 comments on commit 6393644

Please sign in to comment.