mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-04-30 04:42:58 +00:00

Lets start using the new BFD yang model and translate the BFD session configuration commands to use the northbound. One important change: all sessions will default to use `VRF_DEFAULT_NAME` (usually "default") when no VRF is configured. All places which search for BFD sessions must now take this into account. Signed-off-by: Rafael Zalamena <rzalamena@opensourcerouting.org>
233 lines
6.2 KiB
C
233 lines
6.2 KiB
C
/*
|
|
* 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 <A.B.C.D|X:X::X:X> [{multihop$multihop|local-address <A.B.C.D|X:X::X:X>|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 <A.B.C.D|X:X::X:X> [{multihop$multihop|local-address <A.B.C.D|X:X::X:X>|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);
|
|
}
|