]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: Adding BGP GR Per Neighbor config commands.
authorbisdhdh <biswajit.sadhu@gmail.com>
Wed, 23 Oct 2019 08:44:02 +0000 (14:14 +0530)
committerbisdhdh <biswajit.sadhu@gmail.com>
Thu, 23 Jan 2020 04:04:25 +0000 (09:34 +0530)
* 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>
bgpd/bgp_vty.c

index 9dc6549d9c40c8df295bd0dccc37f733d5cdbf5e..57ccee49e9c7bcb23e4d31b9f3eaac50d295a79e 100644 (file)
@@ -105,9 +105,21 @@ DEFINE_HOOK(bgp_inst_config_write,
                (struct bgp *bgp, struct vty *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,
                                              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)
 {
        switch (afi) {
@@ -690,7 +702,16 @@ int bgp_vty_return(struct vty *vty, int ret)
                str = "Operation not allowed on a directly connected neighbor";
                break;
        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;
        }
        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])
                                continue;
 
+                       bgp_peer_gr_flags_update(peer);
+
                        if (stype == BGP_CLEAR_SOFT_NONE)
                                ret = peer_clear(peer, &nnode);
                        else
@@ -2093,37 +2116,57 @@ DEFUN (no_bgp_deterministic_med,
        return CMD_SUCCESS;
 }
 
-/* "bgp graceful-restart" configuration. */
+/* "bgp graceful-restart mode" configuration. */
 DEFUN (bgp_graceful_restart,
-       bgp_graceful_restart_cmd,
-       "bgp graceful-restart",
-       "BGP specific commands\n"
-       "Graceful restart capability parameters\n")
+               bgp_graceful_restart_cmd,
+               "bgp graceful-restart",
+               "BGP specific commands\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);
-       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,
-       no_bgp_graceful_restart_cmd,
-       "no bgp graceful-restart",
-       NO_STR
-       "BGP specific commands\n"
-       "Graceful restart capability parameters\n")
+               no_bgp_graceful_restart_cmd,
+               "no bgp graceful-restart",
+               NO_STR
+               "BGP specific commands\n"
+               NO_GR_CMD
+      )
 {
        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,
-       bgp_graceful_restart_stalepath_time_cmd,
-       "bgp graceful-restart stalepath-time (1-4095)",
-       "BGP specific commands\n"
-       "Graceful restart capability parameters\n"
-       "Set the max time to hold onto restarting peer's stale paths\n"
-       "Delay value (seconds)\n")
+               bgp_graceful_restart_stalepath_time_cmd,
+               "bgp graceful-restart stalepath-time (1-4095)",
+               "BGP specific commands\n"
+               "Graceful restart capability parameters\n"
+               "Set the max time to hold onto restarting peer's stale paths\n"
+               "Delay value (seconds)\n")
 {
        VTY_DECLVAR_CONTEXT(bgp, bgp);
        int idx_number = 3;
@@ -2135,12 +2178,12 @@ DEFUN (bgp_graceful_restart_stalepath_time,
 }
 
 DEFUN (bgp_graceful_restart_restart_time,
-       bgp_graceful_restart_restart_time_cmd,
-       "bgp graceful-restart restart-time (1-4095)",
-       "BGP specific commands\n"
-       "Graceful restart capability parameters\n"
-       "Set the time to wait to delete stale routes before a BGP open message is received\n"
-       "Delay value (seconds)\n")
+               bgp_graceful_restart_restart_time_cmd,
+               "bgp graceful-restart restart-time (1-4095)",
+               "BGP specific commands\n"
+               "Graceful restart capability parameters\n"
+               "Set the time to wait to delete stale routes before a BGP open message is received\n"
+               "Delay value (seconds)\n")
 {
        VTY_DECLVAR_CONTEXT(bgp, bgp);
        int idx_number = 3;
@@ -2152,13 +2195,13 @@ DEFUN (bgp_graceful_restart_restart_time,
 }
 
 DEFUN (no_bgp_graceful_restart_stalepath_time,
-       no_bgp_graceful_restart_stalepath_time_cmd,
-       "no bgp graceful-restart stalepath-time [(1-4095)]",
-       NO_STR
-       "BGP specific commands\n"
-       "Graceful restart capability parameters\n"
-       "Set the max time to hold onto restarting peer's stale paths\n"
-       "Delay value (seconds)\n")
+               no_bgp_graceful_restart_stalepath_time_cmd,
+               "no bgp graceful-restart stalepath-time [(1-4095)]",
+               NO_STR
+               "BGP specific commands\n"
+               "Graceful restart capability parameters\n"
+               "Set the max time to hold onto restarting peer's stale paths\n"
+               "Delay value (seconds)\n")
 {
        VTY_DECLVAR_CONTEXT(bgp, bgp);
 
@@ -2167,13 +2210,13 @@ DEFUN (no_bgp_graceful_restart_stalepath_time,
 }
 
 DEFUN (no_bgp_graceful_restart_restart_time,
-       no_bgp_graceful_restart_restart_time_cmd,
-       "no bgp graceful-restart restart-time [(1-4095)]",
-       NO_STR
-       "BGP specific commands\n"
-       "Graceful restart capability parameters\n"
-       "Set the time to wait to delete stale routes before a BGP open message is received\n"
-       "Delay value (seconds)\n")
+               no_bgp_graceful_restart_restart_time_cmd,
+               "no bgp graceful-restart restart-time [(1-4095)]",
+               NO_STR
+               "BGP specific commands\n"
+               "Graceful restart capability parameters\n"
+               "Set the time to wait to delete stale routes before a BGP open message is received\n"
+               "Delay value (seconds)\n")
 {
        VTY_DECLVAR_CONTEXT(bgp, bgp);
 
@@ -2182,11 +2225,11 @@ DEFUN (no_bgp_graceful_restart_restart_time,
 }
 
 DEFUN (bgp_graceful_restart_preserve_fw,
-       bgp_graceful_restart_preserve_fw_cmd,
-       "bgp graceful-restart preserve-fw-state",
-       "BGP specific commands\n"
-       "Graceful restart capability parameters\n"
-       "Sets F-bit indication that fib is preserved while doing Graceful Restart\n")
+               bgp_graceful_restart_preserve_fw_cmd,
+               "bgp graceful-restart preserve-fw-state",
+               "BGP specific commands\n"
+               "Graceful restart capability parameters\n"
+               "Sets F-bit indication that fib is preserved while doing Graceful Restart\n")
 {
        VTY_DECLVAR_CONTEXT(bgp, bgp);
        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,
-       no_bgp_graceful_restart_preserve_fw_cmd,
-       "no bgp graceful-restart preserve-fw-state",
-       NO_STR
-       "BGP specific commands\n"
-       "Graceful restart capability parameters\n"
-       "Unsets F-bit indication that fib is preserved while doing Graceful Restart\n")
+               no_bgp_graceful_restart_preserve_fw_cmd,
+               "no bgp graceful-restart preserve-fw-state",
+               NO_STR
+               "BGP specific commands\n"
+               "Graceful restart capability parameters\n"
+               "Unsets F-bit indication that fib is preserved while doing Graceful Restart\n")
 {
        VTY_DECLVAR_CONTEXT(bgp, bgp);
        bgp_flag_unset(bgp, BGP_FLAG_GR_PRESERVE_FWD);
        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 */
 DEFUN (bgp_graceful_shutdown,
        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))
                        continue;
 
+               bgp_peer_gr_flags_update(peer);
+
                if (!peer->afc[afi][safi])
                        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);
 }
 
-/* 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,
                                      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, &no_bgp_deterministic_med_cmd);
 
-       /* "bgp graceful-restart" commands */
-       install_element(BGP_NODE, &bgp_graceful_restart_cmd);
-       install_element(BGP_NODE, &no_bgp_graceful_restart_cmd);
+       /* "bgp graceful-restart" command */
+       install_element(BGP_NODE,
+                       &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, &no_bgp_graceful_restart_stalepath_time_cmd);
        install_element(BGP_NODE, &bgp_graceful_restart_restart_time_cmd);