]> git.puffer.fish Git - mirror/frr.git/commitdiff
isisd: Add BFD configuration commands
authorChristian Franke <chris@opensourcerouting.org>
Fri, 28 Sep 2018 13:20:28 +0000 (15:20 +0200)
committerChristian Franke <chris@opensourcerouting.org>
Fri, 5 Oct 2018 12:05:30 +0000 (14:05 +0200)
Signed-off-by: Christian Franke <chris@opensourcerouting.org>
isisd/isis_bfd.c
isisd/isis_bfd.h
isisd/isis_circuit.h
isisd/isis_vty_common.c

index 3abf80a2dbe66af032f9b841b35d2ff54e3df9bc..8a7947b2a23694d3efd9068ab52f43b7eeada0b8 100644 (file)
 
 #include "isisd/isis_bfd.h"
 #include "isisd/isis_zebra.h"
+#include "isisd/isis_common.h"
+#include "isisd/isis_constants.h"
+#include "isisd/isis_adjacency.h"
+#include "isisd/isis_circuit.h"
+#include "isisd/fabricd.h"
 
 static int isis_bfd_interface_dest_update(int command, struct zclient *zclient,
                                          zebra_size_t length, vrf_id_t vrf_id)
@@ -49,6 +54,24 @@ static void isis_bfd_zebra_connected(struct zclient *zclient)
        bfd_client_sendmsg(zclient, ZEBRA_BFD_CLIENT_REGISTER);
 }
 
+void isis_bfd_circuit_cmd(struct isis_circuit *circuit, int command)
+{
+       return;
+}
+
+void isis_bfd_circuit_param_set(struct isis_circuit *circuit,
+                               uint32_t min_rx, uint32_t min_tx,
+                               uint32_t detect_mult, int defaults)
+{
+       int command = 0;
+
+       bfd_set_param(&circuit->bfd_info, min_rx,
+                     min_tx, detect_mult, defaults, &command);
+
+       if (command)
+               isis_bfd_circuit_cmd(circuit, command);
+}
+
 void isis_bfd_init(void)
 {
        bfd_gbl_init();
index e9bf43625497983c21118f5b4db5c7c15aa10d60..b1cb8e18b7f9dc42ae9bf2f41707b3b0daf62d07 100644 (file)
 #ifndef ISIS_BFD_H
 #define ISIS_BFD_H
 
+struct isis_circuit;
+
+void isis_bfd_circuit_cmd(struct isis_circuit *circuit, int command);
+void isis_bfd_circuit_param_set(struct isis_circuit *circuit,
+                               uint32_t min_rx, uint32_t min_tx,
+                               uint32_t detect_mult, int defaults);
 void isis_bfd_init(void);
 
 #endif
index ea68767fe0fb35c1bfb5b40ff61631df5918a258..02abbb49ad4af3808aefce32b51130b827749d06 100644 (file)
@@ -65,6 +65,8 @@ struct isis_p2p_info {
        struct thread *t_send_p2p_hello; /* send P2P IIHs in this thread  */
 };
 
+struct bfd_info;
+
 struct isis_circuit {
        int state;
        uint8_t circuit_id;       /* l1/l2 bcast CircuitID */
@@ -127,6 +129,7 @@ struct isis_circuit {
 #define ISIS_CIRCUIT_FLAPPED_AFTER_SPF 0x01
        uint8_t flags;
        bool disable_threeway_adj;
+       struct bfd_info *bfd_info;
        /*
         * Counters as in 10589--11.2.5.9
         */
index 2b98a88b342233637799b33412041c61b9df185c..fd2ed4a2defaf6abf34670343068caf5a1a349dc 100644 (file)
 
 #include "command.h"
 #include "spf_backoff.h"
+#include "bfd.h"
 
 #include "isis_circuit.h"
 #include "isis_csm.h"
 #include "isis_misc.h"
 #include "isis_mt.h"
 #include "isisd.h"
+#include "isis_bfd.h"
 #include "isis_vty_common.h"
 
 struct isis_circuit *isis_circuit_lookup(struct vty *vty)
@@ -498,6 +500,88 @@ DEFUN (no_circuit_topology,
        return isis_circuit_mt_enabled_set(circuit, mtid, false);
 }
 
+DEFUN (isis_bfd,
+       isis_bfd_cmd,
+       PROTO_NAME " bfd",
+       PROTO_HELP
+       "Enable BFD support\n")
+{
+       struct isis_circuit *circuit = isis_circuit_lookup(vty);
+       if (!circuit)
+               return CMD_ERR_NO_MATCH;
+
+       if (circuit->bfd_info
+           && CHECK_FLAG(circuit->bfd_info->flags, BFD_FLAG_PARAM_CFG)) {
+               return CMD_SUCCESS;
+       }
+
+       isis_bfd_circuit_param_set(circuit, BFD_DEF_MIN_RX,
+                                  BFD_DEF_MIN_TX, BFD_DEF_DETECT_MULT, true);
+
+       return CMD_SUCCESS;
+}
+
+#if HAVE_BFDD > 0
+DEFUN_HIDDEN (
+#else
+DEFUN (
+#endif
+       isis_bfd_param,
+       isis_bfd_param_cmd,
+       PROTO_NAME " bfd (2-255) (50-60000) (50-60000)",
+       PROTO_HELP
+       "Enable BFD support\n"
+       "Detect Multiplier\n"
+       "Required min receive interval\n"
+       "Desired min transmit interval\n")
+{
+       struct isis_circuit *circuit = isis_circuit_lookup(vty);
+       if (!circuit)
+               return CMD_ERR_NO_MATCH;
+
+       uint32_t rx_val;
+       uint32_t tx_val;
+       uint8_t dm_val;
+       int ret;
+
+       if ((ret = bfd_validate_param(vty, argv[2]->arg, argv[3]->arg,
+                                     argv[4]->arg, &dm_val, &rx_val,
+                                     &tx_val)) != CMD_SUCCESS)
+               return ret;
+
+       isis_bfd_circuit_param_set(circuit, rx_val, tx_val, dm_val, false);
+       return CMD_SUCCESS;
+}
+
+DEFUN (no_isis_bfd,
+       no_isis_bfd_cmd,
+#if HAVE_BFDD > 0
+       "no " PROTO_NAME " bfd",
+#else
+       "no " PROTO_NAME " bfd [(2-255) (50-60000) (50-60000)]",
+#endif
+       NO_STR
+       PROTO_HELP
+       "Disables BFD support\n"
+#if HAVE_BFDD == 0
+       "Detect Multiplier\n"
+       "Required min receive interval\n"
+       "Desired min transmit interval\n"
+#endif
+)
+{
+       struct isis_circuit *circuit = isis_circuit_lookup(vty);
+       if (!circuit)
+               return CMD_ERR_NO_MATCH;
+
+       if (!circuit->bfd_info)
+               return CMD_SUCCESS;
+
+       isis_bfd_circuit_cmd(circuit, ZEBRA_BFD_DEST_DEREGISTER);
+       bfd_info_free(&circuit->bfd_info);
+       return CMD_SUCCESS;
+}
+
 DEFUN (set_overload_bit,
        set_overload_bit_cmd,
        "set-overload-bit",
@@ -930,6 +1014,10 @@ void isis_vty_init(void)
        install_element(INTERFACE_NODE, &circuit_topology_cmd);
        install_element(INTERFACE_NODE, &no_circuit_topology_cmd);
 
+       install_element(INTERFACE_NODE, &isis_bfd_cmd);
+       install_element(INTERFACE_NODE, &isis_bfd_param_cmd);
+       install_element(INTERFACE_NODE, &no_isis_bfd_cmd);
+
        install_element(ROUTER_NODE, &set_overload_bit_cmd);
        install_element(ROUTER_NODE, &no_set_overload_bit_cmd);