From: Christian Franke Date: Fri, 28 Sep 2018 13:20:28 +0000 (+0200) Subject: isisd: Add BFD configuration commands X-Git-Tag: frr-7.1-dev~278^2~9 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=215eccb0b8e7e19e6796cb945fba7c5f27bbee47;p=mirror%2Ffrr.git isisd: Add BFD configuration commands Signed-off-by: Christian Franke --- diff --git a/isisd/isis_bfd.c b/isisd/isis_bfd.c index 3abf80a2db..8a7947b2a2 100644 --- a/isisd/isis_bfd.c +++ b/isisd/isis_bfd.c @@ -26,6 +26,11 @@ #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(); diff --git a/isisd/isis_bfd.h b/isisd/isis_bfd.h index e9bf436254..b1cb8e18b7 100644 --- a/isisd/isis_bfd.h +++ b/isisd/isis_bfd.h @@ -22,6 +22,12 @@ #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 diff --git a/isisd/isis_circuit.h b/isisd/isis_circuit.h index ea68767fe0..02abbb49ad 100644 --- a/isisd/isis_circuit.h +++ b/isisd/isis_circuit.h @@ -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 */ diff --git a/isisd/isis_vty_common.c b/isisd/isis_vty_common.c index 2b98a88b34..fd2ed4a2de 100644 --- a/isisd/isis_vty_common.c +++ b/isisd/isis_vty_common.c @@ -28,12 +28,14 @@ #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);