/* * BFD daemon CLI implementation. * * Copyright (C) 2019 Network Device Education Foundation, Inc. ("NetDEF") * Rafael Zalamena * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA. */ #include "lib/command.h" #include "lib/log.h" #include "lib/northbound_cli.h" #ifndef VTYSH_EXTRACT_PL #include "bfdd/bfdd_cli_clippy.c" #endif /* VTYSH_EXTRACT_PL */ #include "bfd.h" /* * Definitions. */ #define PEER_STR "Configure peer\n" #define INTERFACE_NAME_STR "Configure interface name to use\n" #define PEER_IPV4_STR "IPv4 peer address\n" #define PEER_IPV6_STR "IPv6 peer address\n" #define MHOP_STR "Configure multihop\n" #define LOCAL_STR "Configure local address\n" #define LOCAL_IPV4_STR "IPv4 local address\n" #define LOCAL_IPV6_STR "IPv6 local address\n" #define LOCAL_INTF_STR "Configure local interface name to use\n" #define VRF_STR "Configure VRF\n" #define VRF_NAME_STR "Configure VRF name\n" /* * Prototypes. */ /* * Functions. */ DEFPY_NOSH( bfd_peer_enter, bfd_peer_enter_cmd, "peer [{multihop$multihop|local-address |interface IFNAME$ifname|vrf NAME}]", PEER_STR PEER_IPV4_STR PEER_IPV6_STR MHOP_STR LOCAL_STR LOCAL_IPV4_STR LOCAL_IPV6_STR INTERFACE_STR LOCAL_INTF_STR VRF_STR VRF_NAME_STR) { int ret, slen; char xpath[XPATH_MAXLEN]; char source_str[INET6_ADDRSTRLEN]; if (multihop) snprintf(source_str, sizeof(source_str), "[source-addr='%s']", local_address_str); else source_str[0] = 0; slen = snprintf(xpath, sizeof(xpath), "/frr-bfdd:bfdd/bfd/sessions/%s%s[dest-addr='%s']", multihop ? "multi-hop" : "single-hop", source_str, peer_str); if (ifname) slen += snprintf(xpath + slen, sizeof(xpath) - slen, "[interface='%s']", ifname); else slen += snprintf(xpath + slen, sizeof(xpath) - slen, "[interface='']"); if (vrf) snprintf(xpath + slen, sizeof(xpath) - slen, "[vrf='%s']", vrf); else snprintf(xpath + slen, sizeof(xpath) - slen, "[vrf='%s']", VRF_DEFAULT_NAME); nb_cli_enqueue_change(vty, xpath, NB_OP_CREATE, NULL); /* Apply settings immediatly. */ ret = nb_cli_apply_changes(vty, NULL); if (ret == CMD_SUCCESS) VTY_PUSH_XPATH(BFD_PEER_NODE, xpath); return ret; } DEFPY( bfd_no_peer, bfd_no_peer_cmd, "no peer [{multihop$multihop|local-address |interface IFNAME$ifname|vrf NAME}]", NO_STR PEER_STR PEER_IPV4_STR PEER_IPV6_STR MHOP_STR LOCAL_STR LOCAL_IPV4_STR LOCAL_IPV6_STR INTERFACE_STR LOCAL_INTF_STR VRF_STR VRF_NAME_STR) { int slen; char xpath[XPATH_MAXLEN]; char source_str[INET6_ADDRSTRLEN]; if (multihop) snprintf(source_str, sizeof(source_str), "[source-addr='%s']", local_address_str); else source_str[0] = 0; slen = snprintf(xpath, sizeof(xpath), "/frr-bfdd:bfdd/bfd/sessions/%s%s[dest-addr='%s']", multihop ? "multi-hop" : "single-hop", source_str, peer_str); if (ifname) slen += snprintf(xpath + slen, sizeof(xpath) - slen, "[interface='%s']", ifname); else slen += snprintf(xpath + slen, sizeof(xpath) - slen, "[interface='']"); if (vrf) snprintf(xpath + slen, sizeof(xpath) - slen, "[vrf='%s']", vrf); else snprintf(xpath + slen, sizeof(xpath) - slen, "[vrf='%s']", VRF_DEFAULT_NAME); nb_cli_enqueue_change(vty, xpath, NB_OP_DESTROY, NULL); /* Apply settings immediatly. */ return nb_cli_apply_changes(vty, NULL); } DEFPY( bfd_peer_shutdown, bfd_peer_shutdown_cmd, "[no] shutdown", NO_STR "Disable BFD peer") { nb_cli_enqueue_change(vty, "./administrative-down", NB_OP_MODIFY, no ? "false" : "true"); return nb_cli_apply_changes(vty, NULL); } DEFPY( bfd_peer_mult, bfd_peer_mult_cmd, "detect-multiplier (2-255)$multiplier", "Configure peer detection multiplier\n" "Configure peer detection multiplier value\n") { nb_cli_enqueue_change(vty, "./detection-multiplier", NB_OP_MODIFY, multiplier_str); return nb_cli_apply_changes(vty, NULL); } DEFPY( bfd_peer_rx, bfd_peer_rx_cmd, "receive-interval (10-60000)$interval", "Configure peer receive interval\n" "Configure peer receive interval value in milliseconds\n") { nb_cli_enqueue_change(vty, "./required-receive-interval", NB_OP_MODIFY, interval_str); return nb_cli_apply_changes(vty, NULL); } DEFPY( bfd_peer_tx, bfd_peer_tx_cmd, "transmit-interval (10-60000)$interval", "Configure peer transmit interval\n" "Configure peer transmit interval value in milliseconds\n") { nb_cli_enqueue_change(vty, "./desired-transmission-interval", NB_OP_MODIFY, interval_str); return nb_cli_apply_changes(vty, NULL); } DEFPY( bfd_peer_echo, bfd_peer_echo_cmd, "[no] echo-mode", NO_STR "Configure echo mode\n") { nb_cli_enqueue_change(vty, "./echo-mode", NB_OP_MODIFY, no ? "false" : "true"); return nb_cli_apply_changes(vty, NULL); } DEFPY( bfd_peer_echo_interval, bfd_peer_echo_interval_cmd, "echo-interval (10-60000)$interval", "Configure peer echo interval\n" "Configure peer echo interval value in milliseconds\n") { nb_cli_enqueue_change(vty, "./desired-echo-transmission-interval", NB_OP_MODIFY, interval_str); return nb_cli_apply_changes(vty, NULL); } void bfdd_cli_init(void) { install_element(BFD_NODE, &bfd_peer_enter_cmd); install_element(BFD_NODE, &bfd_no_peer_cmd); install_element(BFD_PEER_NODE, &bfd_peer_shutdown_cmd); install_element(BFD_PEER_NODE, &bfd_peer_mult_cmd); install_element(BFD_PEER_NODE, &bfd_peer_rx_cmd); install_element(BFD_PEER_NODE, &bfd_peer_tx_cmd); install_element(BFD_PEER_NODE, &bfd_peer_echo_cmd); install_element(BFD_PEER_NODE, &bfd_peer_echo_interval_cmd); }