bgpd: Adding BGP GR Per Neighbor config commands.

* Added configuration commands for enabling and disabling graceful restart
per neighbour.
Cmd : neighbor A.B.C.D graceful-restart
Cmd : no neighbor A.B.C.D graceful-restart
Cmd : neighbor A.B.C.D graceful-restart-helper
Cmd : no neighbor A.B.C.D graceful-restart-helper
Cmd : neighbor A.B.C.D graceful-restart-disable
Cmd : no neighbor A.B.C.D graceful-restart-disable
* Added configuration commands for disabling graceful restart at the global
Level.
Cmd : bgp graceful-restart disable
Cmd : no  bgp graceful-restart disable

Signed-off-by: Biswajit Sadhu <sadhub@vmware.com>
This commit is contained in:
bisdhdh 2019-10-23 14:14:02 +05:30
parent 034e185dc6
commit 055679e915

View file

@ -105,9 +105,21 @@ DEFINE_HOOK(bgp_inst_config_write,
(struct bgp *bgp, struct vty *vty), (struct bgp *bgp, struct vty *vty),
(bgp, vty)) (bgp, vty))
#define GR_NO_OPER "The Graceful Restart No Operation was executed as cmd same as previous one"
#define GR_INVALID "The Graceful Restart command used is not valid at this moment."
static struct peer_group *listen_range_exists(struct bgp *bgp, static struct peer_group *listen_range_exists(struct bgp *bgp,
struct prefix *range, int exact); struct prefix *range, int exact);
/* Show BGP peer's information. */
enum show_type {
show_all,
show_peer,
show_ipv4_all,
show_ipv6_all,
show_ipv4_peer,
show_ipv6_peer
};
static enum node_type bgp_node_type(afi_t afi, safi_t safi) static enum node_type bgp_node_type(afi_t afi, safi_t safi)
{ {
switch (afi) { switch (afi) {
@ -690,7 +702,16 @@ int bgp_vty_return(struct vty *vty, int ret)
str = "Operation not allowed on a directly connected neighbor"; str = "Operation not allowed on a directly connected neighbor";
break; break;
case BGP_ERR_PEER_SAFI_CONFLICT: case BGP_ERR_PEER_SAFI_CONFLICT:
str = "Cannot activate peer for both 'ipv4 unicast' and 'ipv4 labeled-unicast'"; str = GR_INVALID;
break;
case BGP_ERR_GR_INVALID_CMD:
str = "The Graceful Restart command used is not valid at this moment.";
break;
case BGP_ERR_GR_OPERATION_FAILED:
str = "The Graceful Restart Operation failed due to an err.";
break;
case BGP_GR_NO_OPERATION:
str = GR_NO_OPER;
break; break;
} }
if (str) { if (str) {
@ -742,6 +763,8 @@ static int bgp_peer_clear(struct peer *peer, afi_t afi, safi_t safi,
if (!peer->afc[tmp_afi][tmp_safi]) if (!peer->afc[tmp_afi][tmp_safi])
continue; continue;
bgp_peer_gr_flags_update(peer);
if (stype == BGP_CLEAR_SOFT_NONE) if (stype == BGP_CLEAR_SOFT_NONE)
ret = peer_clear(peer, &nnode); ret = peer_clear(peer, &nnode);
else else
@ -2093,37 +2116,57 @@ DEFUN (no_bgp_deterministic_med,
return CMD_SUCCESS; return CMD_SUCCESS;
} }
/* "bgp graceful-restart" configuration. */ /* "bgp graceful-restart mode" configuration. */
DEFUN (bgp_graceful_restart, DEFUN (bgp_graceful_restart,
bgp_graceful_restart_cmd, bgp_graceful_restart_cmd,
"bgp graceful-restart", "bgp graceful-restart",
"BGP specific commands\n" "BGP specific commands\n"
"Graceful restart capability parameters\n") GR_CMD
)
{ {
int ret = BGP_GR_FAILURE;
if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
zlog_debug("BGP_GR:: bgp_graceful_restart_cmd : START ");
VTY_DECLVAR_CONTEXT(bgp, bgp); VTY_DECLVAR_CONTEXT(bgp, bgp);
bgp_flag_set(bgp, BGP_FLAG_GRACEFUL_RESTART);
return CMD_SUCCESS; ret = bgp_gr_update_all(bgp, GLOBAL_GR_CMD);
if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
zlog_debug("BGP_GR:: bgp_graceful_restart_cmd : END ");
return bgp_vty_return(vty, ret);
} }
DEFUN (no_bgp_graceful_restart, DEFUN (no_bgp_graceful_restart,
no_bgp_graceful_restart_cmd, no_bgp_graceful_restart_cmd,
"no bgp graceful-restart", "no bgp graceful-restart",
NO_STR NO_STR
"BGP specific commands\n" "BGP specific commands\n"
"Graceful restart capability parameters\n") NO_GR_CMD
)
{ {
VTY_DECLVAR_CONTEXT(bgp, bgp); VTY_DECLVAR_CONTEXT(bgp, bgp);
bgp_flag_unset(bgp, BGP_FLAG_GRACEFUL_RESTART);
return CMD_SUCCESS; if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
zlog_debug("BGP_GR:: no_bgp_graceful_restart_cmd : START ");
int ret = BGP_GR_FAILURE;
ret = bgp_gr_update_all(bgp, NO_GLOBAL_GR_CMD);
if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
zlog_debug("BGP_GR:: no_bgp_graceful_restart_cmd : END ");
return bgp_vty_return(vty, ret);
} }
DEFUN (bgp_graceful_restart_stalepath_time, DEFUN (bgp_graceful_restart_stalepath_time,
bgp_graceful_restart_stalepath_time_cmd, bgp_graceful_restart_stalepath_time_cmd,
"bgp graceful-restart stalepath-time (1-4095)", "bgp graceful-restart stalepath-time (1-4095)",
"BGP specific commands\n" "BGP specific commands\n"
"Graceful restart capability parameters\n" "Graceful restart capability parameters\n"
"Set the max time to hold onto restarting peer's stale paths\n" "Set the max time to hold onto restarting peer's stale paths\n"
"Delay value (seconds)\n") "Delay value (seconds)\n")
{ {
VTY_DECLVAR_CONTEXT(bgp, bgp); VTY_DECLVAR_CONTEXT(bgp, bgp);
int idx_number = 3; int idx_number = 3;
@ -2135,12 +2178,12 @@ DEFUN (bgp_graceful_restart_stalepath_time,
} }
DEFUN (bgp_graceful_restart_restart_time, DEFUN (bgp_graceful_restart_restart_time,
bgp_graceful_restart_restart_time_cmd, bgp_graceful_restart_restart_time_cmd,
"bgp graceful-restart restart-time (1-4095)", "bgp graceful-restart restart-time (1-4095)",
"BGP specific commands\n" "BGP specific commands\n"
"Graceful restart capability parameters\n" "Graceful restart capability parameters\n"
"Set the time to wait to delete stale routes before a BGP open message is received\n" "Set the time to wait to delete stale routes before a BGP open message is received\n"
"Delay value (seconds)\n") "Delay value (seconds)\n")
{ {
VTY_DECLVAR_CONTEXT(bgp, bgp); VTY_DECLVAR_CONTEXT(bgp, bgp);
int idx_number = 3; int idx_number = 3;
@ -2152,13 +2195,13 @@ DEFUN (bgp_graceful_restart_restart_time,
} }
DEFUN (no_bgp_graceful_restart_stalepath_time, DEFUN (no_bgp_graceful_restart_stalepath_time,
no_bgp_graceful_restart_stalepath_time_cmd, no_bgp_graceful_restart_stalepath_time_cmd,
"no bgp graceful-restart stalepath-time [(1-4095)]", "no bgp graceful-restart stalepath-time [(1-4095)]",
NO_STR NO_STR
"BGP specific commands\n" "BGP specific commands\n"
"Graceful restart capability parameters\n" "Graceful restart capability parameters\n"
"Set the max time to hold onto restarting peer's stale paths\n" "Set the max time to hold onto restarting peer's stale paths\n"
"Delay value (seconds)\n") "Delay value (seconds)\n")
{ {
VTY_DECLVAR_CONTEXT(bgp, bgp); VTY_DECLVAR_CONTEXT(bgp, bgp);
@ -2167,13 +2210,13 @@ DEFUN (no_bgp_graceful_restart_stalepath_time,
} }
DEFUN (no_bgp_graceful_restart_restart_time, DEFUN (no_bgp_graceful_restart_restart_time,
no_bgp_graceful_restart_restart_time_cmd, no_bgp_graceful_restart_restart_time_cmd,
"no bgp graceful-restart restart-time [(1-4095)]", "no bgp graceful-restart restart-time [(1-4095)]",
NO_STR NO_STR
"BGP specific commands\n" "BGP specific commands\n"
"Graceful restart capability parameters\n" "Graceful restart capability parameters\n"
"Set the time to wait to delete stale routes before a BGP open message is received\n" "Set the time to wait to delete stale routes before a BGP open message is received\n"
"Delay value (seconds)\n") "Delay value (seconds)\n")
{ {
VTY_DECLVAR_CONTEXT(bgp, bgp); VTY_DECLVAR_CONTEXT(bgp, bgp);
@ -2182,11 +2225,11 @@ DEFUN (no_bgp_graceful_restart_restart_time,
} }
DEFUN (bgp_graceful_restart_preserve_fw, DEFUN (bgp_graceful_restart_preserve_fw,
bgp_graceful_restart_preserve_fw_cmd, bgp_graceful_restart_preserve_fw_cmd,
"bgp graceful-restart preserve-fw-state", "bgp graceful-restart preserve-fw-state",
"BGP specific commands\n" "BGP specific commands\n"
"Graceful restart capability parameters\n" "Graceful restart capability parameters\n"
"Sets F-bit indication that fib is preserved while doing Graceful Restart\n") "Sets F-bit indication that fib is preserved while doing Graceful Restart\n")
{ {
VTY_DECLVAR_CONTEXT(bgp, bgp); VTY_DECLVAR_CONTEXT(bgp, bgp);
bgp_flag_set(bgp, BGP_FLAG_GR_PRESERVE_FWD); bgp_flag_set(bgp, BGP_FLAG_GR_PRESERVE_FWD);
@ -2194,18 +2237,261 @@ DEFUN (bgp_graceful_restart_preserve_fw,
} }
DEFUN (no_bgp_graceful_restart_preserve_fw, DEFUN (no_bgp_graceful_restart_preserve_fw,
no_bgp_graceful_restart_preserve_fw_cmd, no_bgp_graceful_restart_preserve_fw_cmd,
"no bgp graceful-restart preserve-fw-state", "no bgp graceful-restart preserve-fw-state",
NO_STR NO_STR
"BGP specific commands\n" "BGP specific commands\n"
"Graceful restart capability parameters\n" "Graceful restart capability parameters\n"
"Unsets F-bit indication that fib is preserved while doing Graceful Restart\n") "Unsets F-bit indication that fib is preserved while doing Graceful Restart\n")
{ {
VTY_DECLVAR_CONTEXT(bgp, bgp); VTY_DECLVAR_CONTEXT(bgp, bgp);
bgp_flag_unset(bgp, BGP_FLAG_GR_PRESERVE_FWD); bgp_flag_unset(bgp, BGP_FLAG_GR_PRESERVE_FWD);
return CMD_SUCCESS; return CMD_SUCCESS;
} }
DEFUN (bgp_graceful_restart_disable,
bgp_graceful_restart_disable_cmd,
"bgp graceful-restart-disable",
"BGP specific commands\n"
GR_DISABLE)
{
int ret = BGP_GR_FAILURE;
if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
zlog_debug(
"BGP_GR:: bgp_graceful_restart_disable_cmd : START ");
VTY_DECLVAR_CONTEXT(bgp, bgp);
ret = bgp_gr_update_all(bgp, GLOBAL_DISABLE_CMD);
if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
zlog_debug(
"BGP_GR:: bgp_graceful_restart_disable_cmd : END ");
return bgp_vty_return(vty, ret);
}
DEFUN (no_bgp_graceful_restart_disable,
no_bgp_graceful_restart_disable_cmd,
"no bgp graceful-restart-disable",
NO_STR
"BGP specific commands\n"
NO_GR_DISABLE
)
{
VTY_DECLVAR_CONTEXT(bgp, bgp);
if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
zlog_debug(
"BGP_GR:: no_bgp_graceful_restart_disable_cmd : START ");
int ret = BGP_GR_FAILURE;
ret = bgp_gr_update_all(bgp, NO_GLOBAL_DISABLE_CMD);
if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
zlog_debug(
"BGP_GR:: no_bgp_graceful_restart_disable_cmd : END ");
return bgp_vty_return(vty, ret);
}
DEFUN (bgp_neighbor_graceful_restart_set,
bgp_neighbor_graceful_restart_set_cmd,
"neighbor <A.B.C.D|X:X::X:X|WORD> graceful-restart",
NEIGHBOR_STR
NEIGHBOR_ADDR_STR2
GR_NEIGHBOR_CMD
)
{
int idx_peer = 1;
struct peer *peer;
int ret = BGP_GR_FAILURE;
if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
zlog_debug(
"BGP_GR:: bgp_neighbor_graceful_restart_set_cmd : START ");
peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
if (!peer)
return CMD_WARNING_CONFIG_FAILED;
ret = bgp_neighbor_graceful_restart(peer, PEER_GR_CMD);
if (peer->bgp->t_startup)
bgp_peer_gr_flags_update(peer);
if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
zlog_debug(
"BGP_GR:: bgp_neighbor_graceful_restart_set_cmd : END ");
return bgp_vty_return(vty, ret);
}
DEFUN (no_bgp_neighbor_graceful_restart,
no_bgp_neighbor_graceful_restart_set_cmd,
"no neighbor <A.B.C.D|X:X::X:X|WORD> graceful-restart",
NO_STR
NEIGHBOR_STR
NEIGHBOR_ADDR_STR2
NO_GR_NEIGHBOR_CMD
)
{
int idx_peer = 2;
int ret = BGP_GR_FAILURE;
struct peer *peer;
peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
if (!peer)
return CMD_WARNING_CONFIG_FAILED;
if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
zlog_debug(
"BGP_GR:: no_bgp_neighbor_graceful_restart_set_cmd : START ");
ret = bgp_neighbor_graceful_restart(peer, NO_PEER_GR_CMD);
if (peer->bgp->t_startup)
bgp_peer_gr_flags_update(peer);
if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
zlog_debug(
"BGP_GR:: no_bgp_neighbor_graceful_restart_set_cmd : END ");
return bgp_vty_return(vty, ret);
}
DEFUN (bgp_neighbor_graceful_restart_helper_set,
bgp_neighbor_graceful_restart_helper_set_cmd,
"neighbor <A.B.C.D|X:X::X:X|WORD> graceful-restart-helper",
NEIGHBOR_STR
NEIGHBOR_ADDR_STR2
GR_NEIGHBOR_HELPER_CMD
)
{
int idx_peer = 1;
struct peer *peer;
int ret = BGP_GR_FAILURE;
if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
zlog_debug(
"BGP_GR:: bgp_neighbor_graceful_restart_set_helper_cmd : START ");
peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
if (peer->bgp->t_startup)
bgp_peer_gr_flags_update(peer);
if (!peer)
return CMD_WARNING_CONFIG_FAILED;
ret = bgp_neighbor_graceful_restart(peer, PEER_HELPER_CMD);
if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
zlog_debug(
"BGP_GR:: bgp_neighbor_graceful_restart_helper_set_cmd : END ");
return bgp_vty_return(vty, ret);
}
DEFUN (no_bgp_neighbor_graceful_restart_helper,
no_bgp_neighbor_graceful_restart_helper_set_cmd,
"no neighbor <A.B.C.D|X:X::X:X|WORD> graceful-restart-helper",
NO_STR
NEIGHBOR_STR
NEIGHBOR_ADDR_STR2
NO_GR_NEIGHBOR_HELPER_CMD
)
{
int idx_peer = 2;
int ret = BGP_GR_FAILURE;
struct peer *peer;
peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
if (!peer)
return CMD_WARNING_CONFIG_FAILED;
if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
zlog_debug(
"BGP_GR:: no_bgp_neighbor_graceful_restart_helper_set_cmd : START ");
ret = bgp_neighbor_graceful_restart(peer,
NO_PEER_HELPER_CMD);
if (peer->bgp->t_startup)
bgp_peer_gr_flags_update(peer);
if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
zlog_debug(
"BGP_GR:: no_bgp_neighbor_graceful_restart_set_cmd : END ");
return bgp_vty_return(vty, ret);
}
DEFUN (bgp_neighbor_graceful_restart_disable_set,
bgp_neighbor_graceful_restart_disable_set_cmd,
"neighbor <A.B.C.D|X:X::X:X|WORD> graceful-restart-disable",
NEIGHBOR_STR
NEIGHBOR_ADDR_STR2
GR_NEIGHBOR_DISABLE_CMD
)
{
int idx_peer = 1;
struct peer *peer;
int ret = BGP_GR_FAILURE;
if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
zlog_debug(
"BGP_GR:: bgp_neighbor_graceful_restart_disable_set_cmd : START ");
peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
if (!peer)
return CMD_WARNING_CONFIG_FAILED;
ret = bgp_neighbor_graceful_restart(peer,
PEER_DISABLE_cmd);
if (peer->bgp->t_startup)
bgp_peer_gr_flags_update(peer);
if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
zlog_debug(
"BGP_GR::bgp_neighbor_graceful_restart_disable_set_cmd : END ");
return bgp_vty_return(vty, ret);
}
DEFUN (no_bgp_neighbor_graceful_restart_disable,
no_bgp_neighbor_graceful_restart_disable_set_cmd,
"no neighbor <A.B.C.D|X:X::X:X|WORD> graceful-restart-disable",
NO_STR
NEIGHBOR_STR
NEIGHBOR_ADDR_STR2
NO_GR_NEIGHBOR_DISABLE_CMD
)
{
int idx_peer = 2;
int ret = BGP_GR_FAILURE;
struct peer *peer;
peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
if (!peer)
return CMD_WARNING_CONFIG_FAILED;
if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
zlog_debug(
"BGP_GR:: no_bgp_neighbor_graceful_restart_disable_set_cmd : START ");
ret = bgp_neighbor_graceful_restart(peer, NO_PEER_DISABLE_CMD);
if (peer->bgp->t_startup)
bgp_peer_gr_flags_update(peer);
if (BGP_DEBUG(graceful_restart, GRACEFUL_RESTART))
zlog_debug(
"BGP_GR:: no_bgp_neighbor_graceful_restart_set_cmd : END ");
return bgp_vty_return(vty, ret);
}
/* "bgp graceful-shutdown" configuration */ /* "bgp graceful-shutdown" configuration */
DEFUN (bgp_graceful_shutdown, DEFUN (bgp_graceful_shutdown,
bgp_graceful_shutdown_cmd, bgp_graceful_shutdown_cmd,
@ -8291,6 +8577,8 @@ static int bgp_show_summary(struct vty *vty, struct bgp *bgp, int afi, int safi,
if (!CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE)) if (!CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE))
continue; continue;
bgp_peer_gr_flags_update(peer);
if (!peer->afc[afi][safi]) if (!peer->afc[afi][safi])
continue; continue;
@ -8882,8 +9170,6 @@ const char *get_afi_safi_str(afi_t afi, safi_t safi, bool for_json)
return get_afi_safi_vty_str(afi, safi); return get_afi_safi_vty_str(afi, safi);
} }
/* Show BGP peer's information. */
enum show_type { show_all, show_peer, show_ipv4_all, show_ipv6_all, show_ipv4_peer, show_ipv6_peer };
static void bgp_show_peer_afi_orf_cap(struct vty *vty, struct peer *p, static void bgp_show_peer_afi_orf_cap(struct vty *vty, struct peer *p,
afi_t afi, safi_t safi, afi_t afi, safi_t safi,
@ -14346,9 +14632,36 @@ void bgp_vty_init(void)
install_element(BGP_NODE, &bgp_deterministic_med_cmd); install_element(BGP_NODE, &bgp_deterministic_med_cmd);
install_element(BGP_NODE, &no_bgp_deterministic_med_cmd); install_element(BGP_NODE, &no_bgp_deterministic_med_cmd);
/* "bgp graceful-restart" commands */ /* "bgp graceful-restart" command */
install_element(BGP_NODE, &bgp_graceful_restart_cmd); install_element(BGP_NODE,
install_element(BGP_NODE, &no_bgp_graceful_restart_cmd); &bgp_graceful_restart_cmd);
install_element(BGP_NODE,
&no_bgp_graceful_restart_cmd);
/* "bgp graceful-restart-disable" command */
install_element(BGP_NODE,
&bgp_graceful_restart_disable_cmd);
install_element(BGP_NODE,
&no_bgp_graceful_restart_disable_cmd);
/* "neighbor a:b:c:d graceful-restart" command */
install_element(BGP_NODE,
&bgp_neighbor_graceful_restart_set_cmd);
install_element(BGP_NODE,
&no_bgp_neighbor_graceful_restart_set_cmd);
/* "neighbor a:b:c:d graceful-restart-disable" command */
install_element(BGP_NODE,
&bgp_neighbor_graceful_restart_disable_set_cmd);
install_element(BGP_NODE,
&no_bgp_neighbor_graceful_restart_disable_set_cmd);
/* "neighbor a:b:c:d graceful-restart-helper" command */
install_element(BGP_NODE,
&bgp_neighbor_graceful_restart_helper_set_cmd);
install_element(BGP_NODE,
&no_bgp_neighbor_graceful_restart_helper_set_cmd);
install_element(BGP_NODE, &bgp_graceful_restart_stalepath_time_cmd); install_element(BGP_NODE, &bgp_graceful_restart_stalepath_time_cmd);
install_element(BGP_NODE, &no_bgp_graceful_restart_stalepath_time_cmd); install_element(BGP_NODE, &no_bgp_graceful_restart_stalepath_time_cmd);
install_element(BGP_NODE, &bgp_graceful_restart_restart_time_cmd); install_element(BGP_NODE, &bgp_graceful_restart_restart_time_cmd);