diff options
author | Rafael Zalamena <rzalamena@opensourcerouting.org> | 2019-05-25 16:36:46 +0200 |
---|---|---|
committer | Rafael Zalamena <rzalamena@opensourcerouting.org> | 2019-06-22 15:10:56 +0200 |
commit | 0287a64a6ecf653d0c8be9212d34822ffe3e592e (patch) | |
tree | b693ebfe940f45ee2b139fab8afe7a3ac01f3e5d | |
parent | bfdd: migrate session commands to northbound (diff) | |
download | frr-0287a64a6ecf653d0c8be9212d34822ffe3e592e.tar.xz frr-0287a64a6ecf653d0c8be9212d34822ffe3e592e.zip |
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>
-rw-r--r-- | bfdd/bfd.h | 23 | ||||
-rw-r--r-- | bfdd/bfdd_cli.c | 123 | ||||
-rw-r--r-- | bfdd/bfdd_northbound.c | 14 | ||||
-rw-r--r-- | bfdd/bfdd_vty.c | 93 |
4 files changed, 176 insertions, 77 deletions
diff --git a/bfdd/bfd.h b/bfdd/bfd.h index 7568583f9..78b21a9b6 100644 --- a/bfdd/bfd.h +++ b/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 diff --git a/bfdd/bfdd_cli.c b/bfdd/bfdd_cli.c index 200ae543c..dac1c2521 100644 --- a/bfdd/bfdd_cli.c +++ b/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) { diff --git a/bfdd/bfdd_northbound.c b/bfdd/bfdd_northbound.c index a22430e6b..bbc39fc9c 100644 --- a/bfdd/bfdd_northbound.c +++ b/bfdd/bfdd_northbound.c @@ -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", diff --git a/bfdd/bfdd_vty.c b/bfdd/bfdd_vty.c index befb8b0af..130c11736 100644 --- a/bfdd/bfdd_vty.c +++ b/bfdd/bfdd_vty.c @@ -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(); |