forked from Mirror/frr
bfdd: implement write_config using northbound
Move all the `show running-config` logic to the new northbound implementation. Signed-off-by: Rafael Zalamena <rzalamena@opensourcerouting.org>
This commit is contained in:
parent
adc26455bf
commit
0287a64a6e
23
bfdd/bfd.h
23
bfdd/bfd.h
|
@ -596,6 +596,29 @@ void bfdd_vty_init(void);
|
|||
*/
|
||||
void bfdd_cli_init(void);
|
||||
|
||||
void bfd_cli_show_header(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
void bfd_cli_show_header_end(struct vty *vty, struct lyd_node *dnode);
|
||||
void bfd_cli_show_single_hop_peer(struct vty *vty,
|
||||
struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
void bfd_cli_show_multi_hop_peer(struct vty *vty,
|
||||
struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
void bfd_cli_show_peer_end(struct vty *vty, struct lyd_node *dnode);
|
||||
void bfd_cli_show_mult(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
void bfd_cli_show_tx(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
void bfd_cli_show_rx(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
void bfd_cli_show_shutdown(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
void bfd_cli_show_echo(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
void bfd_cli_show_echo_interval(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
|
||||
|
||||
/*
|
||||
* ptm_adapter.c
|
||||
|
|
123
bfdd/bfdd_cli.c
123
bfdd/bfdd_cli.c
|
@ -52,6 +52,19 @@
|
|||
/*
|
||||
* Functions.
|
||||
*/
|
||||
void bfd_cli_show_header(struct vty *vty,
|
||||
struct lyd_node *dnode __attribute__((__unused__)),
|
||||
bool show_defaults __attribute__((__unused__)))
|
||||
{
|
||||
vty_out(vty, "!\nbfd\n");
|
||||
}
|
||||
|
||||
void bfd_cli_show_header_end(struct vty *vty,
|
||||
struct lyd_node *dnode __attribute__((__unused__)))
|
||||
{
|
||||
vty_out(vty, "!\n");
|
||||
}
|
||||
|
||||
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}]",
|
||||
|
@ -151,6 +164,52 @@ DEFPY(
|
|||
return nb_cli_apply_changes(vty, NULL);
|
||||
}
|
||||
|
||||
static void _bfd_cli_show_peer(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults __attribute__((__unused__)),
|
||||
bool mhop)
|
||||
{
|
||||
const char *vrf = yang_dnode_get_string(dnode, "./vrf");
|
||||
const char *ifname = yang_dnode_get_string(dnode, "./interface");
|
||||
|
||||
vty_out(vty, " peer %s",
|
||||
yang_dnode_get_string(dnode, "./dest-addr"));
|
||||
|
||||
if (mhop)
|
||||
vty_out(vty, " multihop");
|
||||
|
||||
if (yang_dnode_exists(dnode, "./source-addr"))
|
||||
vty_out(vty, " local-address %s",
|
||||
yang_dnode_get_string(dnode, "./source-addr"));
|
||||
|
||||
if (strcmp(vrf, VRF_DEFAULT_NAME))
|
||||
vty_out(vty, " vrf %s", vrf);
|
||||
|
||||
if (ifname[0])
|
||||
vty_out(vty, " interface %s", ifname);
|
||||
|
||||
vty_out(vty, "\n");
|
||||
}
|
||||
|
||||
void bfd_cli_show_single_hop_peer(struct vty *vty,
|
||||
struct lyd_node *dnode,
|
||||
bool show_defaults)
|
||||
{
|
||||
_bfd_cli_show_peer(vty, dnode, show_defaults, false);
|
||||
}
|
||||
|
||||
void bfd_cli_show_multi_hop_peer(struct vty *vty,
|
||||
struct lyd_node *dnode,
|
||||
bool show_defaults)
|
||||
{
|
||||
_bfd_cli_show_peer(vty, dnode, show_defaults, true);
|
||||
}
|
||||
|
||||
void bfd_cli_show_peer_end(struct vty *vty,
|
||||
struct lyd_node *dnode __attribute__((__unused__)))
|
||||
{
|
||||
vty_out(vty, " !\n");
|
||||
}
|
||||
|
||||
DEFPY(
|
||||
bfd_peer_shutdown, bfd_peer_shutdown_cmd,
|
||||
"[no] shutdown",
|
||||
|
@ -162,6 +221,16 @@ DEFPY(
|
|||
return nb_cli_apply_changes(vty, NULL);
|
||||
}
|
||||
|
||||
void bfd_cli_show_shutdown(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults)
|
||||
{
|
||||
if (show_defaults)
|
||||
vty_out(vty, " shutdown\n");
|
||||
else
|
||||
vty_out(vty, " %sshutdown\n",
|
||||
yang_dnode_get_bool(dnode, NULL) ? "" : "no ");
|
||||
}
|
||||
|
||||
DEFPY(
|
||||
bfd_peer_mult, bfd_peer_mult_cmd,
|
||||
"detect-multiplier (2-255)$multiplier",
|
||||
|
@ -173,6 +242,17 @@ DEFPY(
|
|||
return nb_cli_apply_changes(vty, NULL);
|
||||
}
|
||||
|
||||
void bfd_cli_show_mult(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults)
|
||||
{
|
||||
if (show_defaults)
|
||||
vty_out(vty, " detect-multiplier %d\n",
|
||||
BFD_DEFDETECTMULT);
|
||||
else
|
||||
vty_out(vty, " detect-multiplier %s\n",
|
||||
yang_dnode_get_string(dnode, NULL));
|
||||
}
|
||||
|
||||
DEFPY(
|
||||
bfd_peer_rx, bfd_peer_rx_cmd,
|
||||
"receive-interval (10-60000)$interval",
|
||||
|
@ -184,6 +264,17 @@ DEFPY(
|
|||
return nb_cli_apply_changes(vty, NULL);
|
||||
}
|
||||
|
||||
void bfd_cli_show_rx(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults)
|
||||
{
|
||||
if (show_defaults)
|
||||
vty_out(vty, " receive-interval %d\n",
|
||||
BFD_DEFREQUIREDMINRX);
|
||||
else
|
||||
vty_out(vty, " receive-interval %s\n",
|
||||
yang_dnode_get_string(dnode, NULL));
|
||||
}
|
||||
|
||||
DEFPY(
|
||||
bfd_peer_tx, bfd_peer_tx_cmd,
|
||||
"transmit-interval (10-60000)$interval",
|
||||
|
@ -195,6 +286,17 @@ DEFPY(
|
|||
return nb_cli_apply_changes(vty, NULL);
|
||||
}
|
||||
|
||||
void bfd_cli_show_tx(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults)
|
||||
{
|
||||
if (show_defaults)
|
||||
vty_out(vty, " transmit-interval %d\n",
|
||||
BFD_DEFDESIREDMINTX);
|
||||
else
|
||||
vty_out(vty, " transmit-interval %s\n",
|
||||
yang_dnode_get_string(dnode, NULL));
|
||||
}
|
||||
|
||||
DEFPY(
|
||||
bfd_peer_echo, bfd_peer_echo_cmd,
|
||||
"[no] echo-mode",
|
||||
|
@ -206,6 +308,16 @@ DEFPY(
|
|||
return nb_cli_apply_changes(vty, NULL);
|
||||
}
|
||||
|
||||
void bfd_cli_show_echo(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults)
|
||||
{
|
||||
if (show_defaults)
|
||||
vty_out(vty, " no echo-mode\n");
|
||||
else
|
||||
vty_out(vty, " %secho-mode\n",
|
||||
yang_dnode_get_bool(dnode, NULL) ? "" : "no ");
|
||||
}
|
||||
|
||||
DEFPY(
|
||||
bfd_peer_echo_interval, bfd_peer_echo_interval_cmd,
|
||||
"echo-interval (10-60000)$interval",
|
||||
|
@ -217,6 +329,17 @@ DEFPY(
|
|||
return nb_cli_apply_changes(vty, NULL);
|
||||
}
|
||||
|
||||
void bfd_cli_show_echo_interval(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults)
|
||||
{
|
||||
if (show_defaults)
|
||||
vty_out(vty, " echo-interval %d\n",
|
||||
BFD_DEF_REQ_MIN_ECHO);
|
||||
else
|
||||
vty_out(vty, " echo-interval %s\n",
|
||||
yang_dnode_get_string(dnode, NULL));
|
||||
}
|
||||
|
||||
void
|
||||
bfdd_cli_init(void)
|
||||
{
|
||||
|
|
|
@ -839,6 +839,8 @@ const struct frr_yang_module_info frr_bfdd_info = {
|
|||
.cbs.get_next = bfdd_bfd_sessions_single_hop_get_next,
|
||||
.cbs.get_keys = bfdd_bfd_sessions_single_hop_get_keys,
|
||||
.cbs.lookup_entry = bfdd_bfd_sessions_single_hop_lookup_entry,
|
||||
.cbs.cli_show = bfd_cli_show_single_hop_peer,
|
||||
.cbs.cli_show_end = bfd_cli_show_peer_end,
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-bfdd:bfdd/bfd/sessions/single-hop/source-addr",
|
||||
|
@ -848,26 +850,32 @@ const struct frr_yang_module_info frr_bfdd_info = {
|
|||
{
|
||||
.xpath = "/frr-bfdd:bfdd/bfd/sessions/single-hop/detection-multiplier",
|
||||
.cbs.modify = bfdd_bfd_sessions_single_hop_detection_multiplier_modify,
|
||||
.cbs.cli_show = bfd_cli_show_mult,
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-bfdd:bfdd/bfd/sessions/single-hop/desired-transmission-interval",
|
||||
.cbs.modify = bfdd_bfd_sessions_single_hop_desired_transmission_interval_modify,
|
||||
.cbs.cli_show = bfd_cli_show_tx,
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-bfdd:bfdd/bfd/sessions/single-hop/required-receive-interval",
|
||||
.cbs.modify = bfdd_bfd_sessions_single_hop_required_receive_interval_modify,
|
||||
.cbs.cli_show = bfd_cli_show_rx,
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-bfdd:bfdd/bfd/sessions/single-hop/administrative-down",
|
||||
.cbs.modify = bfdd_bfd_sessions_single_hop_administrative_down_modify,
|
||||
.cbs.cli_show = bfd_cli_show_shutdown,
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-bfdd:bfdd/bfd/sessions/single-hop/echo-mode",
|
||||
.cbs.modify = bfdd_bfd_sessions_single_hop_echo_mode_modify,
|
||||
.cbs.cli_show = bfd_cli_show_echo,
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-bfdd:bfdd/bfd/sessions/single-hop/desired-echo-transmission-interval",
|
||||
.cbs.modify = bfdd_bfd_sessions_single_hop_desired_echo_transmission_interval_modify,
|
||||
.cbs.cli_show = bfd_cli_show_echo_interval,
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-bfdd:bfdd/bfd/sessions/single-hop/stats/local-discriminator",
|
||||
|
@ -956,22 +964,28 @@ const struct frr_yang_module_info frr_bfdd_info = {
|
|||
.cbs.get_next = bfdd_bfd_sessions_multi_hop_get_next,
|
||||
.cbs.get_keys = bfdd_bfd_sessions_multi_hop_get_keys,
|
||||
.cbs.lookup_entry = bfdd_bfd_sessions_multi_hop_lookup_entry,
|
||||
.cbs.cli_show = bfd_cli_show_multi_hop_peer,
|
||||
.cbs.cli_show_end = bfd_cli_show_peer_end,
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-bfdd:bfdd/bfd/sessions/multi-hop/detection-multiplier",
|
||||
.cbs.modify = bfdd_bfd_sessions_single_hop_detection_multiplier_modify,
|
||||
.cbs.cli_show = bfd_cli_show_mult,
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-bfdd:bfdd/bfd/sessions/multi-hop/desired-transmission-interval",
|
||||
.cbs.modify = bfdd_bfd_sessions_single_hop_desired_transmission_interval_modify,
|
||||
.cbs.cli_show = bfd_cli_show_tx,
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-bfdd:bfdd/bfd/sessions/multi-hop/required-receive-interval",
|
||||
.cbs.modify = bfdd_bfd_sessions_single_hop_required_receive_interval_modify,
|
||||
.cbs.cli_show = bfd_cli_show_rx,
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-bfdd:bfdd/bfd/sessions/multi-hop/administrative-down",
|
||||
.cbs.modify = bfdd_bfd_sessions_single_hop_administrative_down_modify,
|
||||
.cbs.cli_show = bfd_cli_show_shutdown,
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-bfdd:bfdd/bfd/sessions/multi-hop/stats/local-discriminator",
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include "lib/command.h"
|
||||
#include "lib/json.h"
|
||||
#include "lib/log.h"
|
||||
#include "lib/northbound_cli.h"
|
||||
#include "lib/vty.h"
|
||||
|
||||
#include "bfd.h"
|
||||
|
@ -45,10 +46,6 @@
|
|||
/*
|
||||
* Prototypes
|
||||
*/
|
||||
static int bfdd_write_config(struct vty *vty);
|
||||
static int bfdd_peer_write_config(struct vty *vty);
|
||||
static void _bfdd_peer_write_config(struct vty *vty, struct bfd_session *bs);
|
||||
static void _bfdd_peer_write_config_iter(struct hash_bucket *hb, void *arg);
|
||||
static int bfd_configure_peer(struct bfd_peer_cfg *bpc, bool mhop,
|
||||
const struct sockaddr_any *peer,
|
||||
const struct sockaddr_any *local,
|
||||
|
@ -707,60 +704,6 @@ static int bfd_configure_peer(struct bfd_peer_cfg *bpc, bool mhop,
|
|||
|
||||
return 0;
|
||||
}
|
||||
static int bfdd_write_config(struct vty *vty)
|
||||
{
|
||||
vty_out(vty, "bfd\n");
|
||||
vty_out(vty, "!\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void _bfdd_peer_write_config(struct vty *vty, struct bfd_session *bs)
|
||||
{
|
||||
char addr_buf[INET6_ADDRSTRLEN];
|
||||
|
||||
vty_out(vty, " peer %s",
|
||||
inet_ntop(bs->key.family, &bs->key.peer, addr_buf,
|
||||
sizeof(addr_buf)));
|
||||
|
||||
if (bs->key.mhop)
|
||||
vty_out(vty, " multihop");
|
||||
|
||||
if (memcmp(&bs->key.local, &zero_addr, sizeof(bs->key.local)))
|
||||
vty_out(vty, " local-address %s",
|
||||
inet_ntop(bs->key.family, &bs->key.local, addr_buf,
|
||||
sizeof(addr_buf)));
|
||||
|
||||
if (bs->key.vrfname[0])
|
||||
vty_out(vty, " vrf %s", bs->key.vrfname);
|
||||
if (bs->key.ifname[0])
|
||||
vty_out(vty, " interface %s", bs->key.ifname);
|
||||
vty_out(vty, "\n");
|
||||
|
||||
if (bs->sock == -1)
|
||||
vty_out(vty,
|
||||
" ! vrf, interface or local-address doesn't exist\n");
|
||||
|
||||
if (bs->detect_mult != BPC_DEF_DETECTMULTIPLIER)
|
||||
vty_out(vty, " detect-multiplier %d\n", bs->detect_mult);
|
||||
if (bs->timers.required_min_rx != (BPC_DEF_RECEIVEINTERVAL * 1000))
|
||||
vty_out(vty, " receive-interval %" PRIu32 "\n",
|
||||
bs->timers.required_min_rx / 1000);
|
||||
if (bs->timers.desired_min_tx != (BPC_DEF_TRANSMITINTERVAL * 1000))
|
||||
vty_out(vty, " transmit-interval %" PRIu32 "\n",
|
||||
bs->timers.desired_min_tx / 1000);
|
||||
if (bs->timers.required_min_echo != (BPC_DEF_ECHOINTERVAL * 1000))
|
||||
vty_out(vty, " echo-interval %" PRIu32 "\n",
|
||||
bs->timers.required_min_echo / 1000);
|
||||
if (bs->pl)
|
||||
vty_out(vty, " label %s\n", bs->pl->pl_label);
|
||||
if (BFD_CHECK_FLAG(bs->flags, BFD_SESS_FLAG_ECHO))
|
||||
vty_out(vty, " echo-mode\n");
|
||||
|
||||
vty_out(vty, " %sshutdown\n",
|
||||
BFD_CHECK_FLAG(bs->flags, BFD_SESS_FLAG_SHUTDOWN) ? "" : "no ");
|
||||
|
||||
vty_out(vty, " !\n");
|
||||
}
|
||||
|
||||
DEFUN_NOSH(show_debugging_bfd,
|
||||
show_debugging_bfd_cmd,
|
||||
|
@ -774,24 +717,6 @@ DEFUN_NOSH(show_debugging_bfd,
|
|||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
static void _bfdd_peer_write_config_iter(struct hash_bucket *hb, void *arg)
|
||||
{
|
||||
struct vty *vty = arg;
|
||||
struct bfd_session *bs = hb->data;
|
||||
|
||||
if (!BFD_CHECK_FLAG(bs->flags, BFD_SESS_FLAG_CONFIG))
|
||||
return;
|
||||
|
||||
_bfdd_peer_write_config(vty, bs);
|
||||
}
|
||||
|
||||
static int bfdd_peer_write_config(struct vty *vty)
|
||||
{
|
||||
bfd_id_iterate(_bfdd_peer_write_config_iter, vty);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
struct cmd_node bfd_node = {
|
||||
BFD_NODE,
|
||||
"%s(config-bfd)# ",
|
||||
|
@ -804,6 +729,20 @@ struct cmd_node bfd_peer_node = {
|
|||
1,
|
||||
};
|
||||
|
||||
static int bfdd_write_config(struct vty *vty)
|
||||
{
|
||||
struct lyd_node *dnode;
|
||||
int written = 0;
|
||||
|
||||
dnode = yang_dnode_get(running_config->dnode, "/frr-bfdd:bfdd");
|
||||
if (dnode) {
|
||||
nb_cli_show_dnode_cmds(vty, dnode, false);
|
||||
written = 1;
|
||||
}
|
||||
|
||||
return written;
|
||||
}
|
||||
|
||||
void bfdd_vty_init(void)
|
||||
{
|
||||
install_element(ENABLE_NODE, &bfd_show_peers_counters_cmd);
|
||||
|
@ -818,7 +757,7 @@ void bfdd_vty_init(void)
|
|||
install_default(BFD_NODE);
|
||||
|
||||
/* Install BFD peer node. */
|
||||
install_node(&bfd_peer_node, bfdd_peer_write_config);
|
||||
install_node(&bfd_peer_node, NULL);
|
||||
install_default(BFD_PEER_NODE);
|
||||
|
||||
bfdd_cli_init();
|
||||
|
|
Loading…
Reference in a new issue