diff --git a/lib/vty.c b/lib/vty.c index 3fc7c380830e..d73b3844d238 100644 --- a/lib/vty.c +++ b/lib/vty.c @@ -124,6 +124,7 @@ bool vty_log_commands; static bool vty_log_commands_perm; char const *const mgmt_daemons[] = { + "zebra", #ifdef HAVE_STATICD "staticd", #endif @@ -2256,19 +2257,6 @@ bool mgmt_vty_read_configs(void) snprintf(path, sizeof(path), "%s/mgmtd.conf", frr_sysconfdir); confp = vty_open_config(path, config_default); - if (!confp) { - char *orig; - - snprintf(path, sizeof(path), "%s/zebra.conf", frr_sysconfdir); - orig = XSTRDUP(MTYPE_TMP, host_config_get()); - - zlog_info("mgmtd: trying backup config file: %s", path); - confp = vty_open_config(path, config_default); - - host_config_set(path); - XFREE(MTYPE_TMP, orig); - } - if (confp) { zlog_info("mgmtd: reading config file: %s", path); diff --git a/mgmtd/mgmt_be_adapter.c b/mgmtd/mgmt_be_adapter.c index 93ce23ae4b04..de3ba3fe0a9b 100644 --- a/mgmtd/mgmt_be_adapter.c +++ b/mgmtd/mgmt_be_adapter.c @@ -54,6 +54,12 @@ struct mgmt_be_xpath_map { uint64_t clients; }; +static const char *const zebra_config_xpaths[] = { + "/frr-affinity-map:lib", + "/frr-interface:lib", + NULL, +}; + /* * Each client gets their own map, but also union all the strings into the * above map as well. @@ -68,6 +74,7 @@ static const char *const staticd_config_xpaths[] = { #endif static const char *const *be_client_config_xpaths[MGMTD_BE_CLIENT_ID_MAX] = { + [MGMTD_BE_CLIENT_ID_ZEBRA] = zebra_config_xpaths, #ifdef HAVE_STATICD [MGMTD_BE_CLIENT_ID_STATICD] = staticd_config_xpaths, #endif diff --git a/mgmtd/mgmt_main.c b/mgmtd/mgmt_main.c index 0ecdaecdd22c..d8c5bf8cc7f5 100644 --- a/mgmtd/mgmt_main.c +++ b/mgmtd/mgmt_main.c @@ -16,6 +16,7 @@ #include "mgmtd/mgmt_ds.h" #include "routing_nb.h" #include "affinitymap.h" +#include "zebra/zebra_cli.h" /* mgmt options, we use GNU getopt library. */ static const struct option longopts[] = { @@ -141,32 +142,11 @@ static struct frr_signal_t mgmt_signals[] = { extern const struct frr_yang_module_info frr_staticd_info; #endif -#if HAVE_BFDD == 0 || defined(HAVE_RTADV) -const char *zebra_features[] = { -#if HAVE_BFDD == 0 - "ptm-bfd", -#endif -#if defined(HAVE_RTADV) - "ipv6-router-advertisements", -#endif - NULL -}; -#endif - /* * These are stub info structs that are used to load the modules used by backend * clients into mgmtd. The modules are used by libyang in order to support * parsing binary data returns from the backend. */ -const struct frr_yang_module_info zebra_info = { - .name = "frr-zebra", -#if HAVE_BFDD == 0 || defined(HAVE_RTADV) - .features = zebra_features, -#endif - .ignore_cfg_cbs = true, - .nodes = { { .xpath = NULL } }, -}; - const struct frr_yang_module_info zebra_route_map_info = { .name = "frr-zebra-route-map", .ignore_cfg_cbs = true, @@ -189,7 +169,7 @@ static const struct frr_yang_module_info *const mgmt_yang_modules[] = { * YANG module info used by backend clients get added here. */ - &zebra_info, + &frr_zebra_cli_info, &zebra_route_map_info, #ifdef HAVE_STATICD diff --git a/mgmtd/mgmt_vty.c b/mgmtd/mgmt_vty.c index 2ffe7c699315..c28631cb336d 100644 --- a/mgmtd/mgmt_vty.c +++ b/mgmtd/mgmt_vty.c @@ -21,6 +21,7 @@ #include "mgmtd/mgmt_history.h" #include "mgmtd/mgmt_vty_clippy.c" +#include "zebra/zebra_cli.h" extern struct frr_daemon_info *mgmt_daemon_info; @@ -569,6 +570,8 @@ void mgmt_vty_init(void) */ affinity_map_init(); + zebra_cli_init(); + #if HAVE_STATICD extern void static_vty_init(void); static_vty_init(); diff --git a/mgmtd/subdir.am b/mgmtd/subdir.am index c081e7309096..871a2087bbee 100644 --- a/mgmtd/subdir.am +++ b/mgmtd/subdir.am @@ -15,8 +15,11 @@ clippy_scan += \ # end lib_LTLIBRARIES += mgmtd/libmgmt_be_nb.la -nodist_mgmtd_libmgmt_be_nb_la_SOURCES = \ +mgmtd_libmgmt_be_nb_la_SOURCES = \ lib/affinitymap_cli.c \ + zebra/zebra_cli.c \ + # end +nodist_mgmtd_libmgmt_be_nb_la_SOURCES = \ # end mgmtd_libmgmt_be_nb_la_CFLAGS = $(AM_CFLAGS) -DINCLUDE_MGMTD_CMDDEFS_ONLY mgmtd_libmgmt_be_nb_la_CPPFLAGS = $(AM_CPPFLAGS) -DINCLUDE_MGMTD_CMDDEFS_ONLY @@ -42,6 +45,7 @@ noinst_HEADERS += \ mgmtd/mgmt_history.h \ mgmtd/mgmt_memory.h \ mgmtd/mgmt_txn.h \ + zebra/zebra_cli.h \ # end sbin_PROGRAMS += mgmtd/mgmtd @@ -50,6 +54,7 @@ mgmtd_mgmtd_SOURCES = \ mgmtd/mgmt_main.c \ # end nodist_mgmtd_mgmtd_SOURCES = \ + yang/frr-zebra.yang.c \ # nothing mgmtd_mgmtd_CFLAGS = $(AM_CFLAGS) -I ./ mgmtd_mgmtd_LDADD = mgmtd/libmgmtd.a lib/libfrr.la $(LIBCAP) $(LIBM) $(LIBYANG_LIBS) $(UST_LIBS) diff --git a/tests/topotests/mgmt_oper/simple-results/result-intf-eth0-only-config.json b/tests/topotests/mgmt_oper/simple-results/result-intf-eth0-only-config.json index adcf99053fca..928975927476 100644 --- a/tests/topotests/mgmt_oper/simple-results/result-intf-eth0-only-config.json +++ b/tests/topotests/mgmt_oper/simple-results/result-intf-eth0-only-config.json @@ -3,7 +3,15 @@ "interface": [ { "name": "r1-eth0", - "description": "r1-eth0-desc" + "description": "r1-eth0-desc", + "frr-zebra:zebra": { + "ipv4-addrs": [ + { + "ip": "1.1.1.1", + "prefix-length": 24 + } + ] + } } ] } diff --git a/tests/topotests/mgmt_oper/simple-results/result-intf-eth0-with-config.json b/tests/topotests/mgmt_oper/simple-results/result-intf-eth0-with-config.json index 47c96862522f..ef9e00561990 100644 --- a/tests/topotests/mgmt_oper/simple-results/result-intf-eth0-with-config.json +++ b/tests/topotests/mgmt_oper/simple-results/result-intf-eth0-with-config.json @@ -14,6 +14,12 @@ "phy-address": "rubout" }, "frr-zebra:zebra": { + "ipv4-addrs": [ + { + "ip": "1.1.1.1", + "prefix-length": 24 + } + ], "state": { "up-count": 0, "down-count": 0 diff --git a/vtysh/vtysh.c b/vtysh/vtysh.c index eed552c5b9cf..4f480ed47bf0 100644 --- a/vtysh/vtysh.c +++ b/vtysh/vtysh.c @@ -3007,22 +3007,22 @@ DEFUN (vtysh_show_work_queues_daemon, return show_one_daemon(vty, argv, argc - 1, argv[argc - 1]->text); } -DEFUNSH(VTYSH_ZEBRA, vtysh_link_params, vtysh_link_params_cmd, "link-params", +DEFUNSH(VTYSH_MGMTD, vtysh_link_params, vtysh_link_params_cmd, "link-params", LINK_PARAMS_STR) { vty->node = LINK_PARAMS_NODE; return CMD_SUCCESS; } -DEFUNSH_HIDDEN(VTYSH_ZEBRA, no_link_params_enable, no_link_params_enable_cmd, - "no enable", NO_STR "Disable link parameters on this interface\n") +DEFUNSH_HIDDEN(VTYSH_MGMTD, no_link_params_enable, no_link_params_enable_cmd, + "no enable", NO_STR "Disable link parameters on this interface\n") { if (vty->node == LINK_PARAMS_NODE) vty->node = INTERFACE_NODE; return CMD_SUCCESS; } -DEFUNSH(VTYSH_ZEBRA, exit_link_params, exit_link_params_cmd, "exit-link-params", +DEFUNSH(VTYSH_MGMTD, exit_link_params, exit_link_params_cmd, "exit-link-params", "Exit from Link Params configuration node\n") { if (vty->node == LINK_PARAMS_NODE) @@ -3030,7 +3030,7 @@ DEFUNSH(VTYSH_ZEBRA, exit_link_params, exit_link_params_cmd, "exit-link-params", return CMD_SUCCESS; } -DEFUNSH(VTYSH_ZEBRA, vtysh_exit_link_params, vtysh_exit_link_params_cmd, "exit", +DEFUNSH(VTYSH_MGMTD, vtysh_exit_link_params, vtysh_exit_link_params_cmd, "exit", "Exit current mode and down to previous mode\n") { if (vty->node == LINK_PARAMS_NODE) @@ -3038,7 +3038,7 @@ DEFUNSH(VTYSH_ZEBRA, vtysh_exit_link_params, vtysh_exit_link_params_cmd, "exit", return CMD_SUCCESS; } -DEFUNSH(VTYSH_ZEBRA, vtysh_quit_link_params, vtysh_quit_link_params_cmd, "quit", +DEFUNSH(VTYSH_MGMTD, vtysh_quit_link_params, vtysh_quit_link_params_cmd, "quit", "Exit current mode and down to previous mode\n") { return vtysh_exit_link_params(self, vty, argc, argv); diff --git a/vtysh/vtysh.h b/vtysh/vtysh.h index c672e2329cc4..b917d9c81c96 100644 --- a/vtysh/vtysh.h +++ b/vtysh/vtysh.h @@ -50,15 +50,15 @@ extern struct event_loop *master; VTYSH_SHARPD | VTYSH_PBRD | VTYSH_STATICD | VTYSH_BFDD | \ VTYSH_FABRICD | VTYSH_VRRPD | VTYSH_PATHD | VTYSH_MGMTD #define VTYSH_ACL VTYSH_BFDD|VTYSH_BABELD|VTYSH_BGPD|VTYSH_EIGRPD|VTYSH_ISISD|VTYSH_FABRICD|VTYSH_LDPD|VTYSH_NHRPD|VTYSH_OSPF6D|VTYSH_OSPFD|VTYSH_PBRD|VTYSH_PIMD|VTYSH_PIM6D|VTYSH_RIPD|VTYSH_RIPNGD|VTYSH_VRRPD|VTYSH_ZEBRA -#define VTYSH_AFFMAP VTYSH_ZEBRA | VTYSH_ISISD | VTYSH_MGMTD +#define VTYSH_AFFMAP VTYSH_ISISD | VTYSH_MGMTD #define VTYSH_RMAP VTYSH_ZEBRA|VTYSH_RIPD|VTYSH_RIPNGD|VTYSH_OSPFD|VTYSH_OSPF6D|VTYSH_BGPD|VTYSH_ISISD|VTYSH_PIMD|VTYSH_EIGRPD|VTYSH_FABRICD #define VTYSH_INTERFACE_SUBSET \ - VTYSH_ZEBRA | VTYSH_RIPD | VTYSH_RIPNGD | VTYSH_OSPFD | VTYSH_OSPF6D | \ - VTYSH_ISISD | VTYSH_PIMD | VTYSH_PIM6D | VTYSH_NHRPD | \ - VTYSH_EIGRPD | VTYSH_BABELD | VTYSH_PBRD | VTYSH_FABRICD | \ - VTYSH_VRRPD | VTYSH_MGMTD + VTYSH_RIPD | VTYSH_RIPNGD | VTYSH_OSPFD | VTYSH_OSPF6D | VTYSH_ISISD | \ + VTYSH_PIMD | VTYSH_PIM6D | VTYSH_NHRPD | VTYSH_EIGRPD | \ + VTYSH_BABELD | VTYSH_PBRD | VTYSH_FABRICD | VTYSH_VRRPD | \ + VTYSH_MGMTD #define VTYSH_INTERFACE VTYSH_INTERFACE_SUBSET | VTYSH_BGPD -#define VTYSH_VRF VTYSH_INTERFACE_SUBSET | VTYSH_BGPD +#define VTYSH_VRF VTYSH_INTERFACE_SUBSET | VTYSH_BGPD | VTYSH_ZEBRA #define VTYSH_KEYS VTYSH_RIPD | VTYSH_EIGRPD | VTYSH_OSPF6D | VTYSH_OSPFD /* Daemons who can process nexthop-group configs */ #define VTYSH_NH_GROUP VTYSH_PBRD|VTYSH_SHARPD diff --git a/zebra/interface.c b/zebra/interface.c index 62ff676f48d2..cba052dff664 100644 --- a/zebra/interface.c +++ b/zebra/interface.c @@ -18,7 +18,6 @@ #include "log.h" #include "zclient.h" #include "vrf.h" -#include "lib/northbound_cli.h" #include "zebra/rtadv.h" #include "zebra_ns.h" @@ -37,7 +36,6 @@ #include "zebra/zebra_vxlan.h" #include "zebra/zebra_errors.h" #include "zebra/zebra_evpn_mh.h" -#include "zebra/zebra_nb.h" DEFINE_MTYPE_STATIC(ZEBRA, ZINFO, "Zebra Interface Information"); @@ -3685,36 +3683,6 @@ void if_arp(struct interface *ifp, bool enable) if_refresh(ifp); } -DEFPY_YANG (multicast_new, - multicast_new_cmd, - "[no] multicast ", - NO_STR - "Control multicast flag on interface\n" - "Set multicast flag on interface\n" - "Unset multicast flag on interface\n") -{ - if (!no) - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/multicast", - NB_OP_CREATE, on ? "true" : "false"); - else - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/multicast", - NB_OP_DESTROY, NULL); - - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_multicast_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults) -{ - bool multicast = yang_dnode_get_bool(dnode, NULL); - - if (multicast) - vty_out(vty, " multicast enable\n"); - else - vty_out(vty, " multicast disable\n"); -} - int if_multicast_set(struct interface *ifp) { struct zebra_if *if_data; @@ -3733,47 +3701,6 @@ int if_multicast_set(struct interface *ifp) return 0; } -DEFUN_HIDDEN (multicast, - multicast_cmd, - "multicast", - "Set multicast flag to interface\n") -{ - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/multicast", - NB_OP_CREATE, "true"); - - return nb_cli_apply_changes(vty, NULL); -} - -DEFPY_YANG (mpls, - mpls_cmd, - "[no] mpls ", - NO_STR - MPLS_STR - "Set mpls to be on for the interface\n" - "Set mpls to be off for the interface\n") -{ - if (!no) - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/mpls", - NB_OP_CREATE, on ? "true" : "false"); - else - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/mpls", - NB_OP_DESTROY, NULL); - - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_mpls_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults) -{ - bool mpls = yang_dnode_get_bool(dnode, NULL); - - if (mpls) - vty_out(vty, " mpls enable\n"); - else - vty_out(vty, " mpls disable\n"); -} - int if_multicast_unset(struct interface *ifp) { struct zebra_if *if_data; @@ -3792,18 +3719,6 @@ int if_multicast_unset(struct interface *ifp) return 0; } -DEFUN_HIDDEN (no_multicast, - no_multicast_cmd, - "no multicast", - NO_STR - "Unset multicast flag to interface\n") -{ - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/multicast", - NB_OP_CREATE, "false"); - - return nb_cli_apply_changes(vty, NULL); -} - int if_linkdetect(struct interface *ifp, bool detect) { int if_was_operative; @@ -3827,30 +3742,6 @@ int if_linkdetect(struct interface *ifp, bool detect) return 0; } -DEFPY_YANG (linkdetect, - linkdetect_cmd, - "[no] link-detect", - NO_STR - "Enable link detection on interface\n") -{ - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/link-detect", - NB_OP_CREATE, no ? "false" : "true"); - - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_link_detect_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults) -{ - bool link_detect = yang_dnode_get_bool(dnode, NULL); - - if (!link_detect) - vty_out(vty, " no link-detect\n"); - else if (show_defaults) - vty_out(vty, " link-detect\n"); -} - int if_shutdown(struct interface *ifp) { struct zebra_if *if_data; @@ -3870,30 +3761,6 @@ int if_shutdown(struct interface *ifp) return 0; } -DEFPY_YANG (shutdown_if, - shutdown_if_cmd, - "[no] shutdown", - NO_STR - "Shutdown the selected interface\n") -{ - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/enabled", - NB_OP_CREATE, no ? "true" : "false"); - - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_enabled_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults) -{ - bool enabled = yang_dnode_get_bool(dnode, NULL); - - if (!enabled) - vty_out(vty, " shutdown\n"); - else if (show_defaults) - vty_out(vty, " no shutdown\n"); -} - int if_no_shutdown(struct interface *ifp) { struct zebra_if *if_data; @@ -3918,39 +3785,6 @@ int if_no_shutdown(struct interface *ifp) return 0; } -DEFPY_YANG (bandwidth_if, - bandwidth_if_cmd, - "[no] bandwidth ![(1-100000)]$bw", - NO_STR - "Set bandwidth informational parameter\n" - "Bandwidth in megabits\n") -{ - if (!no) - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/bandwidth", - NB_OP_CREATE, bw_str); - else - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/bandwidth", - NB_OP_DESTROY, NULL); - - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_bandwidth_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults) -{ - uint32_t bandwidth = yang_dnode_get_uint32(dnode, NULL); - - vty_out(vty, " bandwidth %u\n", bandwidth); -} - -struct cmd_node link_params_node = { - .name = "link-params", - .node = LINK_PARAMS_NODE, - .parent_node = INTERFACE_NODE, - .prompt = "%s(config-link-params)# ", -}; - void link_param_cmd_set_uint32(struct interface *ifp, uint32_t *field, uint32_t type, uint32_t value) { @@ -3995,600 +3829,6 @@ void link_param_cmd_unset(struct interface *ifp, uint32_t type) zebra_interface_parameters_update(ifp); } -DEFUN_YANG_NOSH (link_params, - link_params_cmd, - "link-params", - LINK_PARAMS_STR) -{ - int ret; - - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/link-params", NB_OP_CREATE, NULL); - - ret = nb_cli_apply_changes(vty, NULL); - if (ret == CMD_SUCCESS) { - char xpath[XPATH_MAXLEN]; - snprintf(xpath, sizeof(xpath), "%s/frr-zebra:zebra/link-params", VTY_CURR_XPATH); - VTY_PUSH_XPATH(LINK_PARAMS_NODE, xpath); - } - - return ret; -} - -DEFUN_NOSH (exit_link_params, - exit_link_params_cmd, - "exit-link-params", - "Exit from Link Params configuration mode\n") -{ - cmd_exit(vty); - return CMD_SUCCESS; -} - -void lib_interface_zebra_link_params_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults) -{ - vty_out(vty, " link-params\n"); -} - -void lib_interface_zebra_link_params_cli_write_end(struct vty *vty, - const struct lyd_node *dnode) -{ - vty_out(vty, " exit-link-params\n"); -} - -DEFUN_YANG (no_link_params, - no_link_params_cmd, - "no link-params", - NO_STR - LINK_PARAMS_STR) -{ - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/link-params", NB_OP_DESTROY, NULL); - - return nb_cli_apply_changes(vty, NULL); -} - -/* Specific Traffic Engineering parameters commands */ -DEFUN_HIDDEN (link_params_enable, - link_params_enable_cmd, - "enable", - "Activate link parameters on this interface\n") -{ - vty_out(vty, "This command is deprecated. Link parameters are activated when \"link-params\" node is entered.\n"); - - return CMD_SUCCESS; -} - -DEFUN_NOSH (no_link_params_enable, - no_link_params_enable_cmd, - "no enable", - NO_STR - "Disable link parameters on this interface\n") -{ - int ret; - - vty_out(vty, "This command is deprecated. To disable link parameters use \"no link-params\" in the interface node.\n"); - - nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); - - ret = nb_cli_apply_changes(vty, NULL); - if (ret == CMD_SUCCESS) - cmd_exit(vty); - - return ret; -} - -/* STANDARD TE metrics */ -DEFPY_YANG (link_params_metric, - link_params_metric_cmd, - "[no] metric ![(0-4294967295)]$metric", - NO_STR - "Link metric for MPLS-TE purpose\n" - "Metric value in decimal\n") -{ - if (!no) - nb_cli_enqueue_change(vty, "./metric", NB_OP_MODIFY, metric_str); - else - nb_cli_enqueue_change(vty, "./metric", NB_OP_DESTROY, NULL); - - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_link_params_metric_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults) -{ - uint32_t metric = yang_dnode_get_uint32(dnode, NULL); - - vty_out(vty, " metric %u\n", metric); -} - -DEFPY_YANG (link_params_maxbw, - link_params_maxbw_cmd, - "max-bw BANDWIDTH", - "Maximum bandwidth that can be used\n" - "Bytes/second (IEEE floating point format)\n") -{ - char value[YANG_VALUE_MAXLEN]; - float bw; - - if (sscanf(bandwidth, "%g", &bw) != 1) { - vty_out(vty, "Invalid bandwidth value\n"); - return CMD_WARNING_CONFIG_FAILED; - } - - snprintf(value, sizeof(value), "%a", bw); - - nb_cli_enqueue_change(vty, "./max-bandwidth", NB_OP_MODIFY, value); - - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_link_params_max_bandwidth_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults) -{ - float max_bandwidth = yang_dnode_get_bandwidth_ieee_float32(dnode, NULL); - - vty_out(vty, " max-bw %g\n", max_bandwidth); -} - -DEFPY_YANG (link_params_max_rsv_bw, - link_params_max_rsv_bw_cmd, - "max-rsv-bw BANDWIDTH", - "Maximum bandwidth that may be reserved\n" - "Bytes/second (IEEE floating point format)\n") -{ - char value[YANG_VALUE_MAXLEN]; - float bw; - - if (sscanf(bandwidth, "%g", &bw) != 1) { - vty_out(vty, "Invalid bandwidth value\n"); - return CMD_WARNING_CONFIG_FAILED; - } - - snprintf(value, sizeof(value), "%a", bw); - - nb_cli_enqueue_change(vty, "./max-reservable-bandwidth", NB_OP_MODIFY, - value); - - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_link_params_max_reservable_bandwidth_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults) -{ - float max_reservable_bandwidth = - yang_dnode_get_bandwidth_ieee_float32(dnode, NULL); - - vty_out(vty, " max-rsv-bw %g\n", max_reservable_bandwidth); -} - -DEFPY_YANG (link_params_unrsv_bw, - link_params_unrsv_bw_cmd, - "unrsv-bw (0-7)$priority BANDWIDTH", - "Unreserved bandwidth at each priority level\n" - "Priority\n" - "Bytes/second (IEEE floating point format)\n") -{ - char xpath[XPATH_MAXLEN]; - char value[YANG_VALUE_MAXLEN]; - float bw; - - if (sscanf(bandwidth, "%g", &bw) != 1) { - vty_out(vty, "Invalid bandwidth value\n"); - return CMD_WARNING_CONFIG_FAILED; - } - - snprintf(xpath, sizeof(xpath), - "./unreserved-bandwidths/unreserved-bandwidth[priority='%s']/unreserved-bandwidth", - priority_str); - snprintf(value, sizeof(value), "%a", bw); - - nb_cli_enqueue_change(vty, xpath, NB_OP_MODIFY, value); - - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_link_params_unreserved_bandwidths_unreserved_bandwidth_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults) -{ - uint8_t priority = yang_dnode_get_uint8(dnode, "priority"); - float unreserved_bandwidth = - yang_dnode_get_bandwidth_ieee_float32(dnode, - "unreserved-bandwidth"); - - vty_out(vty, " unrsv-bw %u %g\n", priority, unreserved_bandwidth); -} - -DEFPY_YANG(link_params_admin_grp, link_params_admin_grp_cmd, - "admin-grp BITPATTERN", - "Administrative group membership\n" - "32-bit Hexadecimal value (e.g. 0xa1)\n") -{ - int idx_bitpattern = 1; - unsigned long value; - char value_str[11]; - - if (sscanf(argv[idx_bitpattern]->arg, "0x%lx", &value) != 1) { - vty_out(vty, "link_params_admin_grp: fscanf: %s\n", - safe_strerror(errno)); - return CMD_WARNING_CONFIG_FAILED; - } - - if (value > 0xFFFFFFFF) { - vty_out(vty, "value must be not be superior to 0xFFFFFFFF\n"); - return CMD_WARNING_CONFIG_FAILED; - } - - snprintf(value_str, sizeof(value_str), "%ld", value); - - nb_cli_enqueue_change( - vty, "./legacy-admin-group", - NB_OP_MODIFY, value_str); - - return nb_cli_apply_changes(vty, NULL); -} - -DEFPY_YANG(no_link_params_admin_grp, no_link_params_admin_grp_cmd, - "no admin-grp", - NO_STR "Disable Administrative group membership on this interface\n") -{ - nb_cli_enqueue_change( - vty, "./legacy-admin-group", - NB_OP_DESTROY, NULL); - - return nb_cli_apply_changes(vty, NULL); -} - -/* RFC5392 & RFC5316: INTER-AS */ -DEFPY_YANG (link_params_inter_as, - link_params_inter_as_cmd, - "[no] neighbor ![A.B.C.D$ip as (1-4294967295)$as]", - NO_STR - "Configure remote ASBR information (Neighbor IP address and AS number)\n" - "Remote IP address in dot decimal A.B.C.D\n" - "Remote AS number\n" - "AS number in the range <1-4294967295>\n") -{ - if (!no) { - nb_cli_enqueue_change(vty, "./neighbor", NB_OP_CREATE, NULL); - nb_cli_enqueue_change(vty, "./neighbor/remote-as", NB_OP_MODIFY, - as_str); - nb_cli_enqueue_change(vty, "./neighbor/ipv4-remote-id", - NB_OP_MODIFY, ip_str); - } else { - nb_cli_enqueue_change(vty, "./neighbor", NB_OP_DESTROY, NULL); - } - - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_link_params_neighbor_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults) -{ - uint32_t remote_as = yang_dnode_get_uint32(dnode, "remote-as"); - const char *ipv4_remote_id = yang_dnode_get_string(dnode, - "ipv4-remote-id"); - - vty_out(vty, " neighbor %s as %u\n", ipv4_remote_id, remote_as); -} - -/* RFC7471: OSPF Traffic Engineering (TE) Metric extensions & - * draft-ietf-isis-metric-extensions-07.txt */ -DEFPY_YANG (link_params_delay, - link_params_delay_cmd, - "[no] delay ![(0-16777215)$delay [min (0-16777215)$min max (0-16777215)$max]]", - NO_STR - "Unidirectional Average Link Delay\n" - "Average delay in micro-second as decimal (0...16777215)\n" - "Minimum delay\n" - "Minimum delay in micro-second as decimal (0...16777215)\n" - "Maximum delay\n" - "Maximum delay in micro-second as decimal (0...16777215)\n") -{ - if (!no) { - nb_cli_enqueue_change(vty, "./delay", NB_OP_MODIFY, delay_str); - if (min_str && max_str) { - nb_cli_enqueue_change(vty, "./min-max-delay", - NB_OP_CREATE, NULL); - nb_cli_enqueue_change(vty, "./min-max-delay/delay-min", - NB_OP_MODIFY, min_str); - nb_cli_enqueue_change(vty, "./min-max-delay/delay-max", - NB_OP_MODIFY, max_str); - } else { - nb_cli_enqueue_change(vty, "./min-max-delay", - NB_OP_DESTROY, NULL); - } - } else { - nb_cli_enqueue_change(vty, "./delay", NB_OP_DESTROY, NULL); - nb_cli_enqueue_change(vty, "./min-max-delay", NB_OP_DESTROY, - NULL); - } - - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_link_params_delay_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults) -{ - uint32_t delay = yang_dnode_get_uint32(dnode, NULL); - - vty_out(vty, " delay %u", delay); - - if (yang_dnode_exists(dnode, "../min-max-delay")) { - uint32_t delay_min = - yang_dnode_get_uint32(dnode, - "../min-max-delay/delay-min"); - uint32_t delay_max = - yang_dnode_get_uint32(dnode, - "../min-max-delay/delay-max"); - - vty_out(vty, " min %u max %u", delay_min, delay_max); - } - - vty_out(vty, "\n"); -} - -DEFPY_YANG (link_params_delay_var, - link_params_delay_var_cmd, - "[no] delay-variation ![(0-16777215)$delay_var]", - NO_STR - "Unidirectional Link Delay Variation\n" - "delay variation in micro-second as decimal (0...16777215)\n") -{ - if (!no) - nb_cli_enqueue_change(vty, "./delay-variation", NB_OP_MODIFY, - delay_var_str); - else - nb_cli_enqueue_change(vty, "./delay-variation", NB_OP_DESTROY, - NULL); - - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_link_params_delay_variation_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults) -{ - uint32_t delay_variation = yang_dnode_get_uint32(dnode, NULL); - - vty_out(vty, " delay-variation %u\n", delay_variation); -} - -DEFPY_YANG( - link_params_pkt_loss, link_params_pkt_loss_cmd, - "[no] packet-loss ![PERCENTAGE]", - NO_STR - "Unidirectional Link Packet Loss\n" - "percentage of total traffic by 0.000003% step and less than 50.331642%\n") -{ - if (!no) - nb_cli_enqueue_change(vty, "./packet-loss", NB_OP_MODIFY, - percentage); - else - nb_cli_enqueue_change(vty, "./packet-loss", NB_OP_DESTROY, NULL); - - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_link_params_packet_loss_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults) -{ - double packet_loss = yang_dnode_get_dec64(dnode, NULL); - - vty_out(vty, " packet-loss %lf\n", packet_loss); -} - -DEFPY_YANG (link_params_res_bw, - link_params_res_bw_cmd, - "[no] res-bw ![BANDWIDTH]", - NO_STR - "Unidirectional Residual Bandwidth\n" - "Bytes/second (IEEE floating point format)\n") -{ - char value[YANG_VALUE_MAXLEN]; - float bw; - - if (!no) { - if (sscanf(bandwidth, "%g", &bw) != 1) { - vty_out(vty, "Invalid bandwidth value\n"); - return CMD_WARNING_CONFIG_FAILED; - } - - snprintf(value, sizeof(value), "%a", bw); - - nb_cli_enqueue_change(vty, "./residual-bandwidth", NB_OP_MODIFY, - value); - } else { - nb_cli_enqueue_change(vty, "./residual-bandwidth", - NB_OP_DESTROY, NULL); - } - - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_link_params_residual_bandwidth_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults) -{ - float residual_bandwidth = yang_dnode_get_bandwidth_ieee_float32(dnode, - NULL); - - vty_out(vty, " res-bw %g\n", residual_bandwidth); -} - -DEFPY_YANG (link_params_ava_bw, - link_params_ava_bw_cmd, - "[no] ava-bw ![BANDWIDTH]", - NO_STR - "Unidirectional Available Bandwidth\n" - "Bytes/second (IEEE floating point format)\n") -{ - char value[YANG_VALUE_MAXLEN]; - float bw; - - if (!no) { - if (sscanf(bandwidth, "%g", &bw) != 1) { - vty_out(vty, "Invalid bandwidth value\n"); - return CMD_WARNING_CONFIG_FAILED; - } - - snprintf(value, sizeof(value), "%a", bw); - - nb_cli_enqueue_change(vty, "./available-bandwidth", - NB_OP_MODIFY, value); - } else { - nb_cli_enqueue_change(vty, "./available-bandwidth", - NB_OP_DESTROY, NULL); - } - - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_link_params_available_bandwidth_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults) -{ - float available_bandwidth = yang_dnode_get_bandwidth_ieee_float32(dnode, - NULL); - - vty_out(vty, " ava-bw %g\n", available_bandwidth); -} - -DEFPY_YANG (link_params_use_bw, - link_params_use_bw_cmd, - "[no] use-bw ![BANDWIDTH]", - NO_STR - "Unidirectional Utilised Bandwidth\n" - "Bytes/second (IEEE floating point format)\n") -{ - char value[YANG_VALUE_MAXLEN]; - float bw; - - if (!no) { - if (sscanf(bandwidth, "%g", &bw) != 1) { - vty_out(vty, "Invalid bandwidth value\n"); - return CMD_WARNING_CONFIG_FAILED; - } - - snprintf(value, sizeof(value), "%a", bw); - - nb_cli_enqueue_change(vty, "./utilized-bandwidth", NB_OP_MODIFY, - value); - } else { - nb_cli_enqueue_change(vty, "./utilized-bandwidth", - NB_OP_DESTROY, NULL); - } - - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_link_params_utilized_bandwidth_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults) -{ - float utilized_bandwidth = yang_dnode_get_bandwidth_ieee_float32(dnode, - NULL); - - vty_out(vty, " use-bw %g\n", utilized_bandwidth); -} - -static int ag_change(struct vty *vty, int argc, struct cmd_token **argv, - const char *xpath_base, bool no, int start_idx) -{ - char xpath[XPATH_MAXLEN]; - - for (int i = start_idx; i < argc; i++) { - snprintf(xpath, XPATH_MAXLEN, "%s[.='%s']", xpath_base, - argv[i]->arg); - nb_cli_enqueue_change(vty, xpath, - no ? NB_OP_DESTROY : NB_OP_CREATE, NULL); - } - return nb_cli_apply_changes(vty, NULL); -} - -/* - * XPath: - * /frr-interface:lib/interface/frr-zebra:zebra/link-params/affinities/affinity - */ -DEFPY_YANG(link_params_affinity, link_params_affinity_cmd, - "[no] affinity NAME...", - NO_STR - "Interface affinities\n" - "Affinity names\n") -{ - return ag_change(vty, argc, argv, - "./affinities/affinity", - no, no ? 2 : 1); -} - - -/* - * XPath: - * /frr-interface:lib/interface/frr-zebra:zebra/link-params/affinities/affinity-mode - */ -DEFPY_YANG(link_params_affinity_mode, link_params_affinity_mode_cmd, - "affinity-mode $affmode", - "Interface affinity mode\n" - "Standard Admin-Group only RFC3630,5305,5329\n" - "Extended Admin-Group only RFC7308 (default)\n" - "Standard and extended Admin-Group format\n") -{ - const char *xpath = "./affinity-mode"; - - nb_cli_enqueue_change(vty, xpath, NB_OP_MODIFY, affmode); - - return nb_cli_apply_changes(vty, NULL); -} - -DEFPY_YANG(no_link_params_affinity_mode, no_link_params_affinity_mode_cmd, - "no affinity-mode []", - NO_STR - "Interface affinity mode\n" - "Standard Admin-Group only RFC3630,5305,5329\n" - "Extended Admin-Group only RFC7308 (default)\n" - "Standard and extended Admin-Group format\n") -{ - const char *xpath = "./affinity-mode"; - - nb_cli_enqueue_change(vty, xpath, NB_OP_MODIFY, "extended"); - - return nb_cli_apply_changes(vty, NULL); -} - -static int ag_iter_cb(const struct lyd_node *dnode, void *arg) -{ - struct vty *vty = (struct vty *)arg; - - vty_out(vty, " %s", yang_dnode_get_string(dnode, ".")); - return YANG_ITER_CONTINUE; -} - -void cli_show_legacy_admin_group(struct vty *vty, const struct lyd_node *dnode, - bool show_defaults) -{ - vty_out(vty, " admin-grp 0x%x\n", - yang_dnode_get_uint32(dnode, NULL)); -} - -void cli_show_affinity_mode(struct vty *vty, const struct lyd_node *dnode, - bool show_defaults) -{ - enum affinity_mode affinity_mode = yang_dnode_get_enum(dnode, "."); - - if (affinity_mode == AFFINITY_MODE_STANDARD) - vty_out(vty, " affinity-mode standard\n"); - else if (affinity_mode == AFFINITY_MODE_BOTH) - vty_out(vty, " affinity-mode both\n"); - else if (affinity_mode == AFFINITY_MODE_EXTENDED && show_defaults) - vty_out(vty, " affinity-mode extended\n"); -} - -void cli_show_affinity(struct vty *vty, const struct lyd_node *dnode, - bool show_defaults) -{ - if (!yang_dnode_exists(dnode, "affinity")) - return; - - vty_out(vty, " affinity"); - yang_dnode_iterate(ag_iter_cb, vty, dnode, "affinity"); - vty_out(vty, "\n"); -} - void if_ip_address_install(struct interface *ifp, struct prefix *prefix, const char *label, struct prefix *pp) { @@ -4668,144 +3908,6 @@ void if_ip_address_uninstall(struct interface *ifp, struct prefix *prefix, UNSET_FLAG(ifc->conf, ZEBRA_IFC_QUEUED); } -#ifdef HAVE_NETLINK -DEFPY_YANG (ip_address, - ip_address_cmd, - "[no] ip address A.B.C.D/M [label LINE$label]", - NO_STR - "Interface Internet Protocol config commands\n" - "Set the IP address of an interface\n" - "IP address (e.g. 10.0.0.1/8)\n" - "Label of this address\n" - "Label\n") -#else -DEFPY_YANG (ip_address, - ip_address_cmd, - "[no] ip address A.B.C.D/M", - NO_STR - "Interface Internet Protocol config commands\n" - "Set the IP address of an interface\n" - "IP address (e.g. 10.0.0.1/8)\n") -#endif -{ - char ip[INET_ADDRSTRLEN + 3]; - char *mask; - - if (no) { - nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); - } else { - nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); -#ifdef HAVE_NETLINK - if (label) - nb_cli_enqueue_change(vty, "./label", NB_OP_MODIFY, - label); - else - nb_cli_enqueue_change(vty, "./label", NB_OP_DESTROY, - NULL); -#endif - } - - strlcpy(ip, address_str, sizeof(ip)); - - mask = strchr(ip, '/'); - *mask = 0; - mask++; - - return nb_cli_apply_changes(vty, - "./frr-zebra:zebra/ipv4-addrs[ip='%s'][prefix-length='%s']", - ip, mask); -} - -void lib_interface_zebra_ipv4_addrs_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults) -{ - const char *ip = yang_dnode_get_string(dnode, "ip"); - uint8_t prefix_length = yang_dnode_get_uint8(dnode, "prefix-length"); - - vty_out(vty, " ip address %s/%u", ip, prefix_length); - - if (yang_dnode_exists(dnode, "label")) { - const char *label = yang_dnode_get_string(dnode, "label"); - vty_out(vty, " label %s", label); - } - - vty_out(vty, "\n"); -} - -#ifdef HAVE_NETLINK -DEFPY_YANG (ip_address_peer, - ip_address_peer_cmd, - "[no] ip address A.B.C.D peer A.B.C.D/M [label LINE$label]", - NO_STR - "Interface Internet Protocol config commands\n" - "Set the IP address of an interface\n" - "Local IP (e.g. 10.0.0.1) for P-t-P address\n" - "Specify P-t-P address\n" - "Peer IP address (e.g. 10.0.0.1/8)\n" - "Label of this address\n" - "Label\n") -#else -DEFPY_YANG (ip_address_peer, - ip_address_peer_cmd, - "[no] ip address A.B.C.D peer A.B.C.D/M", - NO_STR - "Interface Internet Protocol config commands\n" - "Set the IP address of an interface\n" - "Local IP (e.g. 10.0.0.1) for P-t-P address\n" - "Specify P-t-P address\n" - "Peer IP address (e.g. 10.0.0.1/8)\n") -#endif -{ - char peer_ip[INET_ADDRSTRLEN + 3]; - char *peer_mask; - - if (no) { - nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); - } else { - nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); -#ifdef HAVE_NETLINK - if (label) - nb_cli_enqueue_change(vty, "./label", NB_OP_MODIFY, - label); - else - nb_cli_enqueue_change(vty, "./label", NB_OP_DESTROY, - NULL); -#endif - } - - strlcpy(peer_ip, peer_str, sizeof(peer_ip)); - - peer_mask = strchr(peer_ip, '/'); - *peer_mask = 0; - peer_mask++; - - return nb_cli_apply_changes( - vty, - "./frr-zebra:zebra/ipv4-p2p-addrs[ip='%s'][peer-ip='%s'][peer-prefix-length='%s']", - address_str, peer_ip, peer_mask); -} - -void lib_interface_zebra_ipv4_p2p_addrs_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults) -{ - const char *ip = yang_dnode_get_string(dnode, "ip"); - const char *peer_ip = yang_dnode_get_string(dnode, "peer-ip"); - uint8_t peer_prefix_length = yang_dnode_get_uint8(dnode, - "peer-prefix-length"); - - vty_out(vty, " ip address %s peer %s/%u", ip, peer_ip, - peer_prefix_length); - - if (yang_dnode_exists(dnode, "label")) { - const char *label = yang_dnode_get_string(dnode, "label"); - vty_out(vty, " label %s", label); - } - - vty_out(vty, "\n"); -} - void if_ipv6_address_install(struct interface *ifp, struct prefix *prefix) { struct zebra_if *if_data; @@ -4872,43 +3974,6 @@ void if_ipv6_address_uninstall(struct interface *ifp, struct prefix *prefix) UNSET_FLAG(ifc->conf, ZEBRA_IFC_QUEUED); } -DEFPY_YANG (ipv6_address, - ipv6_address_cmd, - "[no] ipv6 address X:X::X:X/M", - NO_STR - "Interface IPv6 config commands\n" - "Set the IP address of an interface\n" - "IPv6 address (e.g. 3ffe:506::1/48)\n") -{ - char ip[INET6_ADDRSTRLEN + 4]; - char *mask; - - if (no) - nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); - else - nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); - - strlcpy(ip, address_str, sizeof(ip)); - - mask = strchr(ip, '/'); - *mask = 0; - mask++; - - return nb_cli_apply_changes(vty, - "./frr-zebra:zebra/ipv6-addrs[ip='%s'][prefix-length='%s']", - ip, mask); -} - -void lib_interface_zebra_ipv6_addrs_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults) -{ - const char *ip = yang_dnode_get_string(dnode, "ip"); - uint8_t prefix_length = yang_dnode_get_uint8(dnode, "prefix-length"); - - vty_out(vty, " ipv6 address %s/%u\n", ip, prefix_length); -} - /* Allocate and initialize interface vector. */ void zebra_if_init(void) { @@ -4916,10 +3981,6 @@ void zebra_if_init(void) hook_register_prio(if_add, 0, if_zebra_new_hook); hook_register_prio(if_del, 0, if_zebra_delete_hook); - /* Install configuration write function. */ - if_cmd_init_default(); - install_node(&link_params_node); - install_element(VIEW_NODE, &show_interface_cmd); install_element(VIEW_NODE, &show_interface_vrf_all_cmd); install_element(VIEW_NODE, &show_interface_name_vrf_cmd); @@ -4927,39 +3988,4 @@ void zebra_if_init(void) install_element(ENABLE_NODE, &show_interface_desc_cmd); install_element(ENABLE_NODE, &show_interface_desc_vrf_all_cmd); - install_element(INTERFACE_NODE, &multicast_new_cmd); - install_element(INTERFACE_NODE, &multicast_cmd); - install_element(INTERFACE_NODE, &no_multicast_cmd); - install_element(INTERFACE_NODE, &mpls_cmd); - install_element(INTERFACE_NODE, &linkdetect_cmd); - install_element(INTERFACE_NODE, &shutdown_if_cmd); - install_element(INTERFACE_NODE, &bandwidth_if_cmd); - install_element(INTERFACE_NODE, &ip_address_cmd); - install_element(INTERFACE_NODE, &ip_address_peer_cmd); - install_element(INTERFACE_NODE, &ipv6_address_cmd); - install_element(INTERFACE_NODE, &link_params_cmd); - install_element(INTERFACE_NODE, &no_link_params_cmd); - install_default(LINK_PARAMS_NODE); - install_element(LINK_PARAMS_NODE, &link_params_enable_cmd); - install_element(LINK_PARAMS_NODE, &no_link_params_enable_cmd); - install_element(LINK_PARAMS_NODE, &link_params_metric_cmd); - install_element(LINK_PARAMS_NODE, &link_params_maxbw_cmd); - install_element(LINK_PARAMS_NODE, &link_params_max_rsv_bw_cmd); - install_element(LINK_PARAMS_NODE, &link_params_unrsv_bw_cmd); - install_element(LINK_PARAMS_NODE, &link_params_admin_grp_cmd); - install_element(LINK_PARAMS_NODE, &no_link_params_admin_grp_cmd); - install_element(LINK_PARAMS_NODE, &link_params_inter_as_cmd); - install_element(LINK_PARAMS_NODE, &link_params_delay_cmd); - install_element(LINK_PARAMS_NODE, &link_params_delay_var_cmd); - install_element(LINK_PARAMS_NODE, &link_params_pkt_loss_cmd); - install_element(LINK_PARAMS_NODE, &link_params_ava_bw_cmd); - install_element(LINK_PARAMS_NODE, &link_params_res_bw_cmd); - install_element(LINK_PARAMS_NODE, &link_params_use_bw_cmd); - install_element(LINK_PARAMS_NODE, &link_params_affinity_cmd); - install_element(LINK_PARAMS_NODE, &link_params_affinity_mode_cmd); - install_element(LINK_PARAMS_NODE, &no_link_params_affinity_mode_cmd); - install_element(LINK_PARAMS_NODE, &exit_link_params_cmd); - - /* setup EVPN MH elements */ - zebra_evpn_interface_init(); } diff --git a/zebra/rtadv.c b/zebra/rtadv.c index 2e418afde3cb..6aca643bd8e2 100644 --- a/zebra/rtadv.c +++ b/zebra/rtadv.c @@ -21,7 +21,6 @@ #include "vrf.h" #include "ns.h" #include "lib_errors.h" -#include "northbound_cli.h" #include "zebra/interface.h" #include "zebra/rtadv.h" @@ -31,7 +30,6 @@ #include "zebra/zebra_vrf.h" #include "zebra/zebra_errors.h" #include "zebra/zebra_router.h" -#include "zebra/zebra_nb.h" extern struct zebra_privs_t zserv_privs; @@ -1550,562 +1548,6 @@ DEFPY(show_ipv6_nd_ra_if, show_ipv6_nd_ra_if_cmd, return CMD_SUCCESS; } -DEFPY_YANG (ipv6_nd_ra_fast_retrans, - ipv6_nd_ra_fast_retrans_cmd, - "[no] ipv6 nd ra-fast-retrans", - NO_STR - "Interface IPv6 config commands\n" - "Neighbor discovery\n" - "Fast retransmit of RA packets\n") -{ - if (no) - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/ipv6-router-advertisements/fast-retransmit", - NB_OP_MODIFY, "false"); - else - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/ipv6-router-advertisements/fast-retransmit", - NB_OP_DESTROY, NULL); - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_ipv6_router_advertisements_fast_retransmit_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults) -{ - bool fast_retransmit = yang_dnode_get_bool(dnode, NULL); - - if (!fast_retransmit) - vty_out(vty, " no ipv6 nd ra-fast-retrans\n"); - else if (show_defaults) - vty_out(vty, " ipv6 nd ra-fast-retrans\n"); -} - -DEFPY_YANG (ipv6_nd_ra_hop_limit, - ipv6_nd_ra_hop_limit_cmd, - "[no] ipv6 nd ra-hop-limit ![(0-255)$hopcount]", - NO_STR - "Interface IPv6 config commands\n" - "Neighbor discovery\n" - "Advertisement Hop Limit\n" - "Advertisement Hop Limit in hops (default:64)\n") -{ - if (!no) - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/ipv6-router-advertisements/cur-hop-limit", - NB_OP_MODIFY, hopcount_str); - else - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/ipv6-router-advertisements/cur-hop-limit", - NB_OP_DESTROY, NULL); - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_ipv6_router_advertisements_cur_hop_limit_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults) -{ - uint8_t hop_limit = yang_dnode_get_uint8(dnode, NULL); - - vty_out(vty, " ipv6 nd ra-hop-limit %u\n", hop_limit); -} - -DEFPY_YANG (ipv6_nd_ra_retrans_interval, - ipv6_nd_ra_retrans_interval_cmd, - "[no] ipv6 nd ra-retrans-interval ![(0-4294967295)$interval]", - NO_STR - "Interface IPv6 config commands\n" - "Neighbor discovery\n" - "Advertisement Retransmit Interval\n" - "Advertisement Retransmit Interval in msec\n") -{ - if (!no) - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/ipv6-router-advertisements/retrans-timer", - NB_OP_MODIFY, interval_str); - else - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/ipv6-router-advertisements/retrans-timer", - NB_OP_DESTROY, NULL); - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_ipv6_router_advertisements_retrans_timer_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults) -{ - uint32_t retrans_timer = yang_dnode_get_uint32(dnode, NULL); - - vty_out(vty, " ipv6 nd ra-retrans-interval %u\n", retrans_timer); -} - -DEFPY_YANG (ipv6_nd_suppress_ra, - ipv6_nd_suppress_ra_cmd, - "[no] ipv6 nd suppress-ra", - NO_STR - "Interface IPv6 config commands\n" - "Neighbor discovery\n" - "Suppress Router Advertisement\n") -{ - if (no) - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/ipv6-router-advertisements/send-advertisements", - NB_OP_MODIFY, "true"); - else - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/ipv6-router-advertisements/send-advertisements", - NB_OP_DESTROY, NULL); - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_ipv6_router_advertisements_send_advertisements_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults) -{ - bool send_advertisements = yang_dnode_get_bool(dnode, NULL); - - if (send_advertisements) - vty_out(vty, " no ipv6 nd suppress-ra\n"); - else if (show_defaults) - vty_out(vty, " ipv6 nd suppress-ra\n"); -} - -DEFPY_YANG (ipv6_nd_ra_interval, - ipv6_nd_ra_interval_cmd, - "[no] ipv6 nd ra-interval ![<(1-1800)$sec|msec (70-1800000)$msec>]", - NO_STR - "Interface IPv6 config commands\n" - "Neighbor discovery\n" - "Router Advertisement interval\n" - "Router Advertisement interval in seconds\n" - "Router Advertisement interval in milliseconds\n" - "Router Advertisement interval in milliseconds\n") -{ - char value[YANG_VALUE_MAXLEN]; - - if (!no) { - if (sec) - snprintf(value, sizeof(value), "%lu", sec * 1000); - else - snprintf(value, sizeof(value), "%lu", msec); - - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/ipv6-router-advertisements/max-rtr-adv-interval", - NB_OP_MODIFY, value); - } else { - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/ipv6-router-advertisements/max-rtr-adv-interval", - NB_OP_DESTROY, NULL); - } - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_ipv6_router_advertisements_max_rtr_adv_interval_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults) -{ - uint32_t max_rtr_adv_interval = yang_dnode_get_uint32(dnode, NULL); - - if (max_rtr_adv_interval % 1000) - vty_out(vty, " ipv6 nd ra-interval msec %u\n", - max_rtr_adv_interval); - else - vty_out(vty, " ipv6 nd ra-interval %u\n", - max_rtr_adv_interval / 1000); -} - -DEFPY_YANG (ipv6_nd_ra_lifetime, - ipv6_nd_ra_lifetime_cmd, - "[no] ipv6 nd ra-lifetime ![(0-9000)$lifetime]", - NO_STR - "Interface IPv6 config commands\n" - "Neighbor discovery\n" - "Router lifetime\n" - "Router lifetime in seconds (0 stands for a non-default gw)\n") -{ - if (!no) - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/ipv6-router-advertisements/default-lifetime", - NB_OP_MODIFY, lifetime_str); - else - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/ipv6-router-advertisements/default-lifetime", - NB_OP_DESTROY, NULL); - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_ipv6_router_advertisements_default_lifetime_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults) -{ - uint16_t default_lifetime = yang_dnode_get_uint16(dnode, NULL); - - vty_out(vty, " ipv6 nd ra-lifetime %u\n", default_lifetime); -} - -DEFPY_YANG (ipv6_nd_reachable_time, - ipv6_nd_reachable_time_cmd, - "[no] ipv6 nd reachable-time ![(1-3600000)$msec]", - NO_STR - "Interface IPv6 config commands\n" - "Neighbor discovery\n" - "Reachable time\n" - "Reachable time in milliseconds\n") -{ - if (!no) - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/ipv6-router-advertisements/reachable-time", - NB_OP_MODIFY, msec_str); - else - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/ipv6-router-advertisements/reachable-time", - NB_OP_DESTROY, NULL); - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_ipv6_router_advertisements_reachable_time_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults) -{ - uint32_t reachable_time = yang_dnode_get_uint32(dnode, NULL); - - vty_out(vty, " ipv6 nd reachable-time %u\n", reachable_time); -} - -DEFPY_YANG (ipv6_nd_homeagent_preference, - ipv6_nd_homeagent_preference_cmd, - "[no] ipv6 nd home-agent-preference ![(0-65535)$pref]", - NO_STR - "Interface IPv6 config commands\n" - "Neighbor discovery\n" - "Home Agent preference\n" - "preference value (default is 0, least preferred)\n") -{ - if (!no) - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/ipv6-router-advertisements/home-agent-preference", - NB_OP_MODIFY, pref_str); - else - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/ipv6-router-advertisements/home-agent-preference", - NB_OP_DESTROY, NULL); - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_ipv6_router_advertisements_home_agent_preference_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults) -{ - uint16_t home_agent_preference = yang_dnode_get_uint16(dnode, NULL); - - vty_out(vty, " ipv6 nd home-agent-preference %u\n", - home_agent_preference); -} - -DEFPY_YANG (ipv6_nd_homeagent_lifetime, - ipv6_nd_homeagent_lifetime_cmd, - "[no] ipv6 nd home-agent-lifetime ![(1-65520)$lifetime]", - NO_STR - "Interface IPv6 config commands\n" - "Neighbor discovery\n" - "Home Agent lifetime\n" - "Home Agent lifetime in seconds\n") -{ - if (!no) - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/ipv6-router-advertisements/home-agent-lifetime", - NB_OP_MODIFY, lifetime_str); - else - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/ipv6-router-advertisements/home-agent-lifetime", - NB_OP_DESTROY, NULL); - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_ipv6_router_advertisements_home_agent_lifetime_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults) -{ - uint16_t home_agent_lifetime = yang_dnode_get_uint16(dnode, NULL); - - vty_out(vty, " ipv6 nd home-agent-lifetime %u\n", home_agent_lifetime); -} - -DEFPY_YANG (ipv6_nd_managed_config_flag, - ipv6_nd_managed_config_flag_cmd, - "[no] ipv6 nd managed-config-flag", - NO_STR - "Interface IPv6 config commands\n" - "Neighbor discovery\n" - "Managed address configuration flag\n") -{ - if (!no) - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/ipv6-router-advertisements/managed-flag", - NB_OP_MODIFY, "true"); - else - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/ipv6-router-advertisements/managed-flag", - NB_OP_DESTROY, NULL); - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_ipv6_router_advertisements_managed_flag_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults) -{ - bool managed_flag = yang_dnode_get_bool(dnode, NULL); - - if (managed_flag) - vty_out(vty, " ipv6 nd managed-config-flag\n"); - else if (show_defaults) - vty_out(vty, " no ipv6 nd managed-config-flag\n"); -} - -DEFPY_YANG (ipv6_nd_homeagent_config_flag, - ipv6_nd_homeagent_config_flag_cmd, - "[no] ipv6 nd home-agent-config-flag", - NO_STR - "Interface IPv6 config commands\n" - "Neighbor discovery\n" - "Home Agent configuration flag\n") -{ - if (!no) - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/ipv6-router-advertisements/home-agent-flag", - NB_OP_MODIFY, "true"); - else - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/ipv6-router-advertisements/home-agent-flag", - NB_OP_DESTROY, NULL); - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_ipv6_router_advertisements_home_agent_flag_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults) -{ - bool home_agent_flag = yang_dnode_get_bool(dnode, NULL); - - if (home_agent_flag) - vty_out(vty, " ipv6 nd home-agent-config-flag\n"); - else if (show_defaults) - vty_out(vty, " no ipv6 nd home-agent-config-flag\n"); -} - -DEFPY_YANG (ipv6_nd_adv_interval_config_option, - ipv6_nd_adv_interval_config_option_cmd, - "[no] ipv6 nd adv-interval-option", - NO_STR - "Interface IPv6 config commands\n" - "Neighbor discovery\n" - "Advertisement Interval Option\n") -{ - if (!no) - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/ipv6-router-advertisements/advertisement-interval-option", - NB_OP_MODIFY, "true"); - else - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/ipv6-router-advertisements/advertisement-interval-option", - NB_OP_DESTROY, NULL); - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_ipv6_router_advertisements_advertisement_interval_option_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults) -{ - bool advertisement_interval_option = yang_dnode_get_bool(dnode, NULL); - - if (advertisement_interval_option) - vty_out(vty, " ipv6 nd adv-interval-option\n"); - else if (show_defaults) - vty_out(vty, " no ipv6 nd adv-interval-option\n"); -} - -DEFPY_YANG (ipv6_nd_other_config_flag, - ipv6_nd_other_config_flag_cmd, - "[no] ipv6 nd other-config-flag", - NO_STR - "Interface IPv6 config commands\n" - "Neighbor discovery\n" - "Other statefull configuration flag\n") -{ - if (!no) - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/ipv6-router-advertisements/other-config-flag", - NB_OP_MODIFY, "true"); - else - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/ipv6-router-advertisements/other-config-flag", - NB_OP_DESTROY, NULL); - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_ipv6_router_advertisements_other_config_flag_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults) -{ - bool other_config_flag = yang_dnode_get_bool(dnode, NULL); - - if (other_config_flag) - vty_out(vty, " ipv6 nd other-config-flag\n"); - else if (show_defaults) - vty_out(vty, " no ipv6 nd other-config-flag\n"); -} - -DEFPY_YANG (ipv6_nd_prefix, - ipv6_nd_prefix_cmd, - "[no] ipv6 nd prefix X:X::X:X/M$prefix [<(0-4294967295)|infinite>$valid <(0-4294967295)|infinite>$preferred] [{router-address$routeraddr|off-link$offlink|no-autoconfig$noautoconf}]", - NO_STR - "Interface IPv6 config commands\n" - "Neighbor discovery\n" - "Prefix information\n" - "IPv6 prefix\n" - "Valid lifetime in seconds\n" - "Infinite valid lifetime\n" - "Preferred lifetime in seconds\n" - "Infinite preferred lifetime\n" - "Set Router Address flag\n" - "Do not use prefix for onlink determination\n" - "Do not use prefix for autoconfiguration\n") -{ - if (!no) { - nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); - if (valid) { - if (strmatch(valid, "infinite")) - valid = "4294967295"; - nb_cli_enqueue_change(vty, "./valid-lifetime", - NB_OP_MODIFY, valid); - } else { - nb_cli_enqueue_change(vty, "./valid-lifetime", - NB_OP_DESTROY, NULL); - } - if (preferred) { - if (strmatch(preferred, "infinite")) - preferred = "4294967295"; - nb_cli_enqueue_change(vty, "./preferred-lifetime", - NB_OP_MODIFY, preferred); - } else { - nb_cli_enqueue_change(vty, "./preferred-lifetime", - NB_OP_DESTROY, NULL); - } - if (routeraddr) - nb_cli_enqueue_change(vty, "./router-address-flag", - NB_OP_MODIFY, "true"); - else - nb_cli_enqueue_change(vty, "./router-address-flag", - NB_OP_DESTROY, NULL); - if (offlink) - nb_cli_enqueue_change(vty, "./on-link-flag", - NB_OP_MODIFY, "false"); - else - nb_cli_enqueue_change(vty, "./on-link-flag", - NB_OP_DESTROY, NULL); - if (noautoconf) - nb_cli_enqueue_change(vty, "./autonomous-flag", - NB_OP_MODIFY, "false"); - else - nb_cli_enqueue_change(vty, "./autonomous-flag", - NB_OP_DESTROY, NULL); - } else { - nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); - } - return nb_cli_apply_changes( - vty, - "./frr-zebra:zebra/ipv6-router-advertisements/prefix-list/prefix[prefix-spec='%s']", - prefix_str); -} - -void lib_interface_zebra_ipv6_router_advertisements_prefix_list_prefix_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults) -{ - const char *prefix = yang_dnode_get_string(dnode, "prefix-spec"); - struct lyd_node *valid = yang_dnode_get(dnode, "valid-lifetime"); - struct lyd_node *preferred = yang_dnode_get(dnode, "preferred-lifetime"); - bool router_address_flag = yang_dnode_get_bool(dnode, - "router-address-flag"); - bool on_link_flag = yang_dnode_get_bool(dnode, "on-link-flag"); - bool autonomous_flag = yang_dnode_get_bool(dnode, "autonomous-flag"); - - vty_out(vty, " ipv6 nd prefix %s", prefix); - - if (!yang_dnode_is_default(valid, NULL) || - !yang_dnode_is_default(preferred, NULL) || show_defaults) { - uint32_t valid_lifetime = yang_dnode_get_uint32(valid, NULL); - uint32_t preferred_lifetime = yang_dnode_get_uint32(preferred, - NULL); - - if (valid_lifetime == UINT32_MAX) - vty_out(vty, " infinite"); - else - vty_out(vty, " %u", valid_lifetime); - if (preferred_lifetime == UINT32_MAX) - vty_out(vty, " infinite"); - else - vty_out(vty, " %u", preferred_lifetime); - } - - if (!on_link_flag) - vty_out(vty, " off-link"); - - if (!autonomous_flag) - vty_out(vty, " no-autoconfig"); - - if (router_address_flag) - vty_out(vty, " router-address"); - - vty_out(vty, "\n"); -} - -DEFPY_YANG (ipv6_nd_router_preference, - ipv6_nd_router_preference_cmd, - "[no] ipv6 nd router-preference ![$pref]", - NO_STR - "Interface IPv6 config commands\n" - "Neighbor discovery\n" - "Default router preference\n" - "High default router preference\n" - "Medium default router preference (default)\n" - "Low default router preference\n") -{ - if (!no) - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/ipv6-router-advertisements/default-router-preference", - NB_OP_MODIFY, pref); - else - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/ipv6-router-advertisements/default-router-preference", - NB_OP_DESTROY, NULL); - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_ipv6_router_advertisements_default_router_preference_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults) -{ - const char *default_router_preference = yang_dnode_get_string(dnode, - NULL); - - vty_out(vty, " ipv6 nd router-preference %s\n", - default_router_preference); -} - -DEFPY_YANG (ipv6_nd_mtu, - ipv6_nd_mtu_cmd, - "[no] ipv6 nd mtu ![(1-65535)]", - NO_STR - "Interface IPv6 config commands\n" - "Neighbor discovery\n" - "Advertised MTU\n" - "MTU in bytes\n") -{ - if (!no) - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/ipv6-router-advertisements/link-mtu", - NB_OP_MODIFY, mtu_str); - else - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/ipv6-router-advertisements/link-mtu", - NB_OP_DESTROY, NULL); - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_ipv6_router_advertisements_link_mtu_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults) -{ - uint16_t link_mtu = yang_dnode_get_uint32(dnode, NULL); - - vty_out(vty, " ipv6 nd mtu %u\n", link_mtu); -} - static struct rtadv_rdnss *rtadv_rdnss_new(void) { return XCALLOC(MTYPE_RTADV_RDNSS, sizeof(struct rtadv_rdnss)); @@ -2201,123 +1643,6 @@ int rtadv_dnssl_encode(uint8_t *out, const char *in) return outp; } -DEFPY_YANG (ipv6_nd_rdnss, - ipv6_nd_rdnss_cmd, - "[no] ipv6 nd rdnss X:X::X:X$addr [<(0-4294967295)|infinite>]$lifetime", - NO_STR - "Interface IPv6 config commands\n" - "Neighbor discovery\n" - "Recursive DNS server information\n" - "IPv6 address\n" - "Valid lifetime in seconds\n" - "Infinite valid lifetime\n") -{ - if (!no) { - nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); - if (lifetime) { - if (strmatch(lifetime, "infinite")) - lifetime = "4294967295"; - nb_cli_enqueue_change(vty, "./lifetime", NB_OP_MODIFY, - lifetime); - } else { - nb_cli_enqueue_change(vty, "./lifetime", NB_OP_DESTROY, - NULL); - } - } else { - nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); - } - return nb_cli_apply_changes( - vty, - "./frr-zebra:zebra/ipv6-router-advertisements/rdnss/rdnss-address[address='%s']", - addr_str); -} - -void lib_interface_zebra_ipv6_router_advertisements_rdnss_rdnss_address_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults) -{ - const char *address = yang_dnode_get_string(dnode, "address"); - - vty_out(vty, " ipv6 nd rdnss %s", address); - - if (yang_dnode_exists(dnode, "lifetime")) { - uint32_t lifetime = yang_dnode_get_uint32(dnode, "lifetime"); - - if (lifetime == UINT32_MAX) - vty_out(vty, " infinite"); - else - vty_out(vty, " %u", lifetime); - } - - vty_out(vty, "\n"); -} - -DEFPY_YANG (ipv6_nd_dnssl, - ipv6_nd_dnssl_cmd, - "[no] ipv6 nd dnssl SUFFIX [<(0-4294967295)|infinite>]$lifetime", - NO_STR - "Interface IPv6 config commands\n" - "Neighbor discovery\n" - "DNS search list information\n" - "Domain name suffix\n" - "Valid lifetime in seconds\n" - "Infinite valid lifetime\n") -{ - struct rtadv_dnssl dnssl; - size_t len; - - len = strlcpy(dnssl.name, suffix, sizeof(dnssl.name)); - if (len == 0 || len >= sizeof(dnssl.name)) { - vty_out(vty, "Malformed DNS search domain\n"); - return CMD_WARNING_CONFIG_FAILED; - } - if (dnssl.name[len - 1] == '.') { - /* - * Allow, but don't require, a trailing dot signifying the root - * zone. Canonicalize by cutting it off if present. - */ - dnssl.name[len - 1] = '\0'; - len--; - } - - if (!no) { - nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); - if (lifetime) { - if (strmatch(lifetime, "infinite")) - lifetime = "4294967295"; - nb_cli_enqueue_change(vty, "./lifetime", NB_OP_MODIFY, - lifetime); - } else { - nb_cli_enqueue_change(vty, "./lifetime", NB_OP_DESTROY, - NULL); - } - } else { - nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); - } - return nb_cli_apply_changes( - vty, - "./frr-zebra:zebra/ipv6-router-advertisements/dnssl/dnssl-domain[domain='%s']", - dnssl.name); -} - -void lib_interface_zebra_ipv6_router_advertisements_dnssl_dnssl_domain_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults) -{ - const char *domain = yang_dnode_get_string(dnode, "domain"); - - vty_out(vty, " ipv6 nd dnssl %s", domain); - - if (yang_dnode_exists(dnode, "lifetime")) { - uint32_t lifetime = yang_dnode_get_uint32(dnode, "lifetime"); - - if (lifetime == UINT32_MAX) - vty_out(vty, " infinite"); - else - vty_out(vty, " %u", lifetime); - } - - vty_out(vty, "\n"); -} - /* Dump interface ND information to vty. */ static int nd_dump_vty(struct vty *vty, struct interface *ifp) { @@ -2535,25 +1860,6 @@ void rtadv_cmd_init(void) hook_register(zebra_if_extra_info, nd_dump_vty); install_element(VIEW_NODE, &show_ipv6_nd_ra_if_cmd); - - install_element(INTERFACE_NODE, &ipv6_nd_ra_fast_retrans_cmd); - install_element(INTERFACE_NODE, &ipv6_nd_ra_retrans_interval_cmd); - install_element(INTERFACE_NODE, &ipv6_nd_ra_hop_limit_cmd); - install_element(INTERFACE_NODE, &ipv6_nd_suppress_ra_cmd); - install_element(INTERFACE_NODE, &ipv6_nd_ra_interval_cmd); - install_element(INTERFACE_NODE, &ipv6_nd_ra_lifetime_cmd); - install_element(INTERFACE_NODE, &ipv6_nd_reachable_time_cmd); - install_element(INTERFACE_NODE, &ipv6_nd_managed_config_flag_cmd); - install_element(INTERFACE_NODE, &ipv6_nd_other_config_flag_cmd); - install_element(INTERFACE_NODE, &ipv6_nd_homeagent_config_flag_cmd); - install_element(INTERFACE_NODE, &ipv6_nd_homeagent_preference_cmd); - install_element(INTERFACE_NODE, &ipv6_nd_homeagent_lifetime_cmd); - install_element(INTERFACE_NODE, &ipv6_nd_adv_interval_config_option_cmd); - install_element(INTERFACE_NODE, &ipv6_nd_prefix_cmd); - install_element(INTERFACE_NODE, &ipv6_nd_router_preference_cmd); - install_element(INTERFACE_NODE, &ipv6_nd_mtu_cmd); - install_element(INTERFACE_NODE, &ipv6_nd_rdnss_cmd); - install_element(INTERFACE_NODE, &ipv6_nd_dnssl_cmd); } static int if_join_all_router(int sock, struct interface *ifp) diff --git a/zebra/subdir.am b/zebra/subdir.am index 6d499e97e87d..d9c8d9045e05 100644 --- a/zebra/subdir.am +++ b/zebra/subdir.am @@ -118,7 +118,6 @@ clippy_scan += \ zebra/debug.c \ zebra/interface.c \ zebra/rtadv.c \ - zebra/zebra_evpn_mh.c \ zebra/zebra_mlag_vty.c \ zebra/zebra_routemap.c \ zebra/zebra_vty.c \ @@ -126,6 +125,7 @@ clippy_scan += \ zebra/zebra_vrf.c \ zebra/dpdk/zebra_dplane_dpdk_vty.c \ zebra/label_manager.c \ + zebra/zebra_cli.c \ # end noinst_HEADERS += \ diff --git a/zebra/zebra_cli.c b/zebra/zebra_cli.c new file mode 100644 index 000000000000..c4afdf02f657 --- /dev/null +++ b/zebra/zebra_cli.c @@ -0,0 +1,2086 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "command.h" +#include "northbound_cli.h" +#include "zebra_cli.h" + +#include "zebra/zebra_cli_clippy.c" + +#define EVPN_MH_VTY_STR "Multihoming\n" + +DEFPY_YANG (multicast_new, + multicast_new_cmd, + "[no] multicast ", + NO_STR + "Control multicast flag on interface\n" + "Set multicast flag on interface\n" + "Unset multicast flag on interface\n") +{ + if (!no) + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/multicast", + NB_OP_CREATE, on ? "true" : "false"); + else + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/multicast", + NB_OP_DESTROY, NULL); + + return nb_cli_apply_changes(vty, NULL); +} + +static void lib_interface_zebra_multicast_cli_write(struct vty *vty, + const struct lyd_node *dnode, + bool show_defaults) +{ + bool multicast = yang_dnode_get_bool(dnode, NULL); + + if (multicast) + vty_out(vty, " multicast enable\n"); + else + vty_out(vty, " multicast disable\n"); +} + +/* Deprecated multicast commands */ + +DEFUN_HIDDEN (multicast, + multicast_cmd, + "multicast", + "Set multicast flag to interface\n") +{ + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/multicast", + NB_OP_CREATE, "true"); + + return nb_cli_apply_changes(vty, NULL); +} + +DEFUN_HIDDEN (no_multicast, + no_multicast_cmd, + "no multicast", + NO_STR + "Unset multicast flag to interface\n") +{ + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/multicast", + NB_OP_CREATE, "false"); + + return nb_cli_apply_changes(vty, NULL); +} + +DEFPY_YANG (mpls, + mpls_cmd, + "[no] mpls ", + NO_STR + MPLS_STR + "Set mpls to be on for the interface\n" + "Set mpls to be off for the interface\n") +{ + if (!no) + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/mpls", + NB_OP_CREATE, on ? "true" : "false"); + else + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/mpls", + NB_OP_DESTROY, NULL); + + return nb_cli_apply_changes(vty, NULL); +} + +static void lib_interface_zebra_mpls_cli_write(struct vty *vty, + const struct lyd_node *dnode, + bool show_defaults) +{ + bool mpls = yang_dnode_get_bool(dnode, NULL); + + if (mpls) + vty_out(vty, " mpls enable\n"); + else + vty_out(vty, " mpls disable\n"); +} + +DEFPY_YANG (linkdetect, + linkdetect_cmd, + "[no] link-detect", + NO_STR + "Enable link detection on interface\n") +{ + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/link-detect", + NB_OP_CREATE, no ? "false" : "true"); + + return nb_cli_apply_changes(vty, NULL); +} + +static void lib_interface_zebra_link_detect_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + bool link_detect = yang_dnode_get_bool(dnode, NULL); + + if (!link_detect) + vty_out(vty, " no link-detect\n"); + else if (show_defaults) + vty_out(vty, " link-detect\n"); +} + +DEFPY_YANG (shutdown_if, + shutdown_if_cmd, + "[no] shutdown", + NO_STR + "Shutdown the selected interface\n") +{ + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/enabled", NB_OP_CREATE, + no ? "true" : "false"); + + return nb_cli_apply_changes(vty, NULL); +} + +static void lib_interface_zebra_enabled_cli_write(struct vty *vty, + const struct lyd_node *dnode, + bool show_defaults) +{ + bool enabled = yang_dnode_get_bool(dnode, NULL); + + if (!enabled) + vty_out(vty, " shutdown\n"); + else if (show_defaults) + vty_out(vty, " no shutdown\n"); +} + +DEFPY_YANG (bandwidth_if, + bandwidth_if_cmd, + "[no] bandwidth ![(1-100000)]$bw", + NO_STR + "Set bandwidth informational parameter\n" + "Bandwidth in megabits\n") +{ + if (!no) + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/bandwidth", + NB_OP_CREATE, bw_str); + else + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/bandwidth", + NB_OP_DESTROY, NULL); + + return nb_cli_apply_changes(vty, NULL); +} + +static void lib_interface_zebra_bandwidth_cli_write(struct vty *vty, + const struct lyd_node *dnode, + bool show_defaults) +{ + uint32_t bandwidth = yang_dnode_get_uint32(dnode, NULL); + + vty_out(vty, " bandwidth %u\n", bandwidth); +} + +DEFUN_YANG_NOSH (link_params, + link_params_cmd, + "link-params", + LINK_PARAMS_STR) +{ + int ret; + + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/link-params", + NB_OP_CREATE, NULL); + + ret = nb_cli_apply_changes(vty, NULL); + if (ret == CMD_SUCCESS) { + char xpath[XPATH_MAXLEN]; + + snprintf(xpath, sizeof(xpath), "%s/frr-zebra:zebra/link-params", + VTY_CURR_XPATH); + VTY_PUSH_XPATH(LINK_PARAMS_NODE, xpath); + } + + return ret; +} + +DEFUN_NOSH (exit_link_params, + exit_link_params_cmd, + "exit-link-params", + "Exit from Link Params configuration mode\n") +{ + cmd_exit(vty); + return CMD_SUCCESS; +} + +static void lib_interface_zebra_link_params_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + vty_out(vty, " link-params\n"); +} + +static void +lib_interface_zebra_link_params_cli_write_end(struct vty *vty, + const struct lyd_node *dnode) +{ + vty_out(vty, " exit-link-params\n"); +} + +DEFUN_YANG (no_link_params, + no_link_params_cmd, + "no link-params", + NO_STR + LINK_PARAMS_STR) +{ + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/link-params", NB_OP_DESTROY, NULL); + + return nb_cli_apply_changes(vty, NULL); +} + +/* [no] enable is deprecated, link-params is enabled when entering the node. */ + +DEFUN_HIDDEN (link_params_enable, + link_params_enable_cmd, + "enable", + "Activate link parameters on this interface\n") +{ + vty_out(vty, "This command is deprecated. Link parameters are activated when \"link-params\" node is entered.\n"); + + return CMD_SUCCESS; +} + +DEFUN_NOSH (no_link_params_enable, + no_link_params_enable_cmd, + "no enable", + NO_STR + "Disable link parameters on this interface\n") +{ + int ret; + + vty_out(vty, "This command is deprecated. To disable link parameters use \"no link-params\" in the interface node.\n"); + + nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); + + ret = nb_cli_apply_changes(vty, NULL); + if (ret == CMD_SUCCESS) + cmd_exit(vty); + + return ret; +} + +DEFPY_YANG (link_params_metric, + link_params_metric_cmd, + "[no] metric ![(0-4294967295)]$metric", + NO_STR + "Link metric for MPLS-TE purpose\n" + "Metric value in decimal\n") +{ + if (!no) + nb_cli_enqueue_change(vty, "./metric", NB_OP_MODIFY, metric_str); + else + nb_cli_enqueue_change(vty, "./metric", NB_OP_DESTROY, NULL); + + return nb_cli_apply_changes(vty, NULL); +} + +static void lib_interface_zebra_link_params_metric_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + uint32_t metric = yang_dnode_get_uint32(dnode, NULL); + + vty_out(vty, " metric %u\n", metric); +} + +DEFPY_YANG (link_params_maxbw, + link_params_maxbw_cmd, + "max-bw BANDWIDTH", + "Maximum bandwidth that can be used\n" + "Bytes/second (IEEE floating point format)\n") +{ + char value[YANG_VALUE_MAXLEN]; + float bw; + + if (sscanf(bandwidth, "%g", &bw) != 1) { + vty_out(vty, "Invalid bandwidth value\n"); + return CMD_WARNING_CONFIG_FAILED; + } + + snprintf(value, sizeof(value), "%a", bw); + + nb_cli_enqueue_change(vty, "./max-bandwidth", NB_OP_MODIFY, value); + + return nb_cli_apply_changes(vty, NULL); +} + +static void lib_interface_zebra_link_params_max_bandwidth_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + float max_bandwidth = yang_dnode_get_bandwidth_ieee_float32(dnode, NULL); + + vty_out(vty, " max-bw %g\n", max_bandwidth); +} + +DEFPY_YANG (link_params_max_rsv_bw, + link_params_max_rsv_bw_cmd, + "max-rsv-bw BANDWIDTH", + "Maximum bandwidth that may be reserved\n" + "Bytes/second (IEEE floating point format)\n") +{ + char value[YANG_VALUE_MAXLEN]; + float bw; + + if (sscanf(bandwidth, "%g", &bw) != 1) { + vty_out(vty, "Invalid bandwidth value\n"); + return CMD_WARNING_CONFIG_FAILED; + } + + snprintf(value, sizeof(value), "%a", bw); + + nb_cli_enqueue_change(vty, "./max-reservable-bandwidth", NB_OP_MODIFY, + value); + + return nb_cli_apply_changes(vty, NULL); +} + +static void lib_interface_zebra_link_params_max_reservable_bandwidth_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + float max_reservable_bandwidth = + yang_dnode_get_bandwidth_ieee_float32(dnode, NULL); + + vty_out(vty, " max-rsv-bw %g\n", max_reservable_bandwidth); +} + +DEFPY_YANG (link_params_unrsv_bw, + link_params_unrsv_bw_cmd, + "unrsv-bw (0-7)$priority BANDWIDTH", + "Unreserved bandwidth at each priority level\n" + "Priority\n" + "Bytes/second (IEEE floating point format)\n") +{ + char xpath[XPATH_MAXLEN]; + char value[YANG_VALUE_MAXLEN]; + float bw; + + if (sscanf(bandwidth, "%g", &bw) != 1) { + vty_out(vty, "Invalid bandwidth value\n"); + return CMD_WARNING_CONFIG_FAILED; + } + + snprintf(xpath, sizeof(xpath), + "./unreserved-bandwidths/unreserved-bandwidth[priority='%s']/unreserved-bandwidth", + priority_str); + snprintf(value, sizeof(value), "%a", bw); + + nb_cli_enqueue_change(vty, xpath, NB_OP_MODIFY, value); + + return nb_cli_apply_changes(vty, NULL); +} + +static void +lib_interface_zebra_link_params_unreserved_bandwidths_unreserved_bandwidth_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + uint8_t priority = yang_dnode_get_uint8(dnode, "priority"); + float unreserved_bandwidth = + yang_dnode_get_bandwidth_ieee_float32(dnode, + "unreserved-bandwidth"); + + vty_out(vty, " unrsv-bw %u %g\n", priority, unreserved_bandwidth); +} + +DEFPY_YANG (link_params_admin_grp, + link_params_admin_grp_cmd, + "[no] admin-grp ![BITPATTERN]", + NO_STR + "Administrative group membership\n" + "32-bit Hexadecimal value (e.g. 0xa1)\n") +{ + uint32_t value; + char value_str[YANG_VALUE_MAXLEN]; + + if (!no) { + if (bitpattern[0] != '0' || bitpattern[1] != 'x' || + strlen(bitpattern) > 10) { + vty_out(vty, "Invalid bitpattern value\n"); + return CMD_WARNING_CONFIG_FAILED; + } + + sscanf(bitpattern, "%x", &value); + snprintf(value_str, sizeof(value_str), "%u", value); + + nb_cli_enqueue_change(vty, "./legacy-admin-group", NB_OP_MODIFY, + value_str); + } else { + nb_cli_enqueue_change(vty, "./legacy-admin-group", + NB_OP_DESTROY, NULL); + } + + return nb_cli_apply_changes(vty, NULL); +} + +static void lib_interface_zebra_link_params_legacy_admin_group_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + vty_out(vty, " admin-grp %#x\n", yang_dnode_get_uint32(dnode, NULL)); +} + +/* RFC5392 & RFC5316: INTER-AS */ +DEFPY_YANG (link_params_inter_as, + link_params_inter_as_cmd, + "[no] neighbor ![A.B.C.D$ip as (1-4294967295)$as]", + NO_STR + "Configure remote ASBR information (Neighbor IP address and AS number)\n" + "Remote IP address in dot decimal A.B.C.D\n" + "Remote AS number\n" + "AS number in the range <1-4294967295>\n") +{ + if (!no) { + nb_cli_enqueue_change(vty, "./neighbor", NB_OP_CREATE, NULL); + nb_cli_enqueue_change(vty, "./neighbor/remote-as", NB_OP_MODIFY, + as_str); + nb_cli_enqueue_change(vty, "./neighbor/ipv4-remote-id", + NB_OP_MODIFY, ip_str); + } else { + nb_cli_enqueue_change(vty, "./neighbor", NB_OP_DESTROY, NULL); + } + + return nb_cli_apply_changes(vty, NULL); +} + +static void lib_interface_zebra_link_params_neighbor_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + uint32_t remote_as = yang_dnode_get_uint32(dnode, "remote-as"); + const char *ipv4_remote_id = yang_dnode_get_string(dnode, + "ipv4-remote-id"); + + vty_out(vty, " neighbor %s as %u\n", ipv4_remote_id, remote_as); +} + +/* RFC7471 & RFC8570 */ +DEFPY_YANG (link_params_delay, + link_params_delay_cmd, + "[no] delay ![(0-16777215)$delay [min (0-16777215)$min max (0-16777215)$max]]", + NO_STR + "Unidirectional Average Link Delay\n" + "Average delay in micro-second as decimal (0...16777215)\n" + "Minimum delay\n" + "Minimum delay in micro-second as decimal (0...16777215)\n" + "Maximum delay\n" + "Maximum delay in micro-second as decimal (0...16777215)\n") +{ + if (!no) { + nb_cli_enqueue_change(vty, "./delay", NB_OP_MODIFY, delay_str); + if (min_str && max_str) { + nb_cli_enqueue_change(vty, "./min-max-delay", + NB_OP_CREATE, NULL); + nb_cli_enqueue_change(vty, "./min-max-delay/delay-min", + NB_OP_MODIFY, min_str); + nb_cli_enqueue_change(vty, "./min-max-delay/delay-max", + NB_OP_MODIFY, max_str); + } else { + nb_cli_enqueue_change(vty, "./min-max-delay", + NB_OP_DESTROY, NULL); + } + } else { + nb_cli_enqueue_change(vty, "./delay", NB_OP_DESTROY, NULL); + nb_cli_enqueue_change(vty, "./min-max-delay", NB_OP_DESTROY, + NULL); + } + + return nb_cli_apply_changes(vty, NULL); +} + +static void lib_interface_zebra_link_params_delay_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + uint32_t delay = yang_dnode_get_uint32(dnode, NULL); + + vty_out(vty, " delay %u", delay); + + if (yang_dnode_exists(dnode, "../min-max-delay")) { + uint32_t delay_min = + yang_dnode_get_uint32(dnode, + "../min-max-delay/delay-min"); + uint32_t delay_max = + yang_dnode_get_uint32(dnode, + "../min-max-delay/delay-max"); + + vty_out(vty, " min %u max %u", delay_min, delay_max); + } + + vty_out(vty, "\n"); +} + +DEFPY_YANG (link_params_delay_var, + link_params_delay_var_cmd, + "[no] delay-variation ![(0-16777215)$delay_var]", + NO_STR + "Unidirectional Link Delay Variation\n" + "delay variation in micro-second as decimal (0...16777215)\n") +{ + if (!no) + nb_cli_enqueue_change(vty, "./delay-variation", NB_OP_MODIFY, + delay_var_str); + else + nb_cli_enqueue_change(vty, "./delay-variation", NB_OP_DESTROY, + NULL); + + return nb_cli_apply_changes(vty, NULL); +} + +static void lib_interface_zebra_link_params_delay_variation_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + uint32_t delay_variation = yang_dnode_get_uint32(dnode, NULL); + + vty_out(vty, " delay-variation %u\n", delay_variation); +} + +DEFPY_YANG( + link_params_pkt_loss, link_params_pkt_loss_cmd, + "[no] packet-loss ![PERCENTAGE]", + NO_STR + "Unidirectional Link Packet Loss\n" + "percentage of total traffic by 0.000003% step and less than 50.331642%\n") +{ + if (!no) + nb_cli_enqueue_change(vty, "./packet-loss", NB_OP_MODIFY, + percentage); + else + nb_cli_enqueue_change(vty, "./packet-loss", NB_OP_DESTROY, NULL); + + return nb_cli_apply_changes(vty, NULL); +} + +static void lib_interface_zebra_link_params_packet_loss_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + double packet_loss = yang_dnode_get_dec64(dnode, NULL); + + vty_out(vty, " packet-loss %lf\n", packet_loss); +} + +DEFPY_YANG (link_params_res_bw, + link_params_res_bw_cmd, + "[no] res-bw ![BANDWIDTH]", + NO_STR + "Unidirectional Residual Bandwidth\n" + "Bytes/second (IEEE floating point format)\n") +{ + char value[YANG_VALUE_MAXLEN]; + float bw; + + if (!no) { + if (sscanf(bandwidth, "%g", &bw) != 1) { + vty_out(vty, "Invalid bandwidth value\n"); + return CMD_WARNING_CONFIG_FAILED; + } + + snprintf(value, sizeof(value), "%a", bw); + + nb_cli_enqueue_change(vty, "./residual-bandwidth", NB_OP_MODIFY, + value); + } else { + nb_cli_enqueue_change(vty, "./residual-bandwidth", + NB_OP_DESTROY, NULL); + } + + return nb_cli_apply_changes(vty, NULL); +} + +static void lib_interface_zebra_link_params_residual_bandwidth_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + float residual_bandwidth = yang_dnode_get_bandwidth_ieee_float32(dnode, + NULL); + + vty_out(vty, " res-bw %g\n", residual_bandwidth); +} + +DEFPY_YANG (link_params_ava_bw, + link_params_ava_bw_cmd, + "[no] ava-bw ![BANDWIDTH]", + NO_STR + "Unidirectional Available Bandwidth\n" + "Bytes/second (IEEE floating point format)\n") +{ + char value[YANG_VALUE_MAXLEN]; + float bw; + + if (!no) { + if (sscanf(bandwidth, "%g", &bw) != 1) { + vty_out(vty, "Invalid bandwidth value\n"); + return CMD_WARNING_CONFIG_FAILED; + } + + snprintf(value, sizeof(value), "%a", bw); + + nb_cli_enqueue_change(vty, "./available-bandwidth", + NB_OP_MODIFY, value); + } else { + nb_cli_enqueue_change(vty, "./available-bandwidth", + NB_OP_DESTROY, NULL); + } + + return nb_cli_apply_changes(vty, NULL); +} + +static void lib_interface_zebra_link_params_available_bandwidth_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + float available_bandwidth = yang_dnode_get_bandwidth_ieee_float32(dnode, + NULL); + + vty_out(vty, " ava-bw %g\n", available_bandwidth); +} + +DEFPY_YANG (link_params_use_bw, + link_params_use_bw_cmd, + "[no] use-bw ![BANDWIDTH]", + NO_STR + "Unidirectional Utilised Bandwidth\n" + "Bytes/second (IEEE floating point format)\n") +{ + char value[YANG_VALUE_MAXLEN]; + float bw; + + if (!no) { + if (sscanf(bandwidth, "%g", &bw) != 1) { + vty_out(vty, "Invalid bandwidth value\n"); + return CMD_WARNING_CONFIG_FAILED; + } + + snprintf(value, sizeof(value), "%a", bw); + + nb_cli_enqueue_change(vty, "./utilized-bandwidth", NB_OP_MODIFY, + value); + } else { + nb_cli_enqueue_change(vty, "./utilized-bandwidth", + NB_OP_DESTROY, NULL); + } + + return nb_cli_apply_changes(vty, NULL); +} + +static void lib_interface_zebra_link_params_utilized_bandwidth_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + float utilized_bandwidth = yang_dnode_get_bandwidth_ieee_float32(dnode, + NULL); + + vty_out(vty, " use-bw %g\n", utilized_bandwidth); +} + +DEFPY_YANG (link_params_affinity, + link_params_affinity_cmd, + "[no] affinity NAME...", + NO_STR + "Interface affinities\n" + "Affinity names\n") +{ + char xpath[XPATH_MAXLEN]; + int i; + + for (i = no ? 2 : 1; i < argc; i++) { + snprintf(xpath, XPATH_MAXLEN, "./affinities/affinity[.='%s']", + argv[i]->arg); + nb_cli_enqueue_change(vty, xpath, + no ? NB_OP_DESTROY : NB_OP_CREATE, NULL); + } + + return nb_cli_apply_changes(vty, NULL); +} + +static int ag_iter_cb(const struct lyd_node *dnode, void *arg) +{ + struct vty *vty = arg; + + vty_out(vty, " %s", yang_dnode_get_string(dnode, NULL)); + return YANG_ITER_CONTINUE; +} + +static void lib_interface_zebra_link_params_affinities_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + vty_out(vty, " affinity"); + yang_dnode_iterate(ag_iter_cb, vty, dnode, "affinity"); + vty_out(vty, "\n"); +} + +DEFPY_YANG (link_params_affinity_mode, + link_params_affinity_mode_cmd, + "[no] affinity-mode ![$mode]", + NO_STR + "Interface affinity mode\n" + "Standard Admin-Group only RFC3630,5305,5329\n" + "Extended Admin-Group only RFC7308 (default)\n" + "Standard and extended Admin-Group format\n") +{ + if (!no) + nb_cli_enqueue_change(vty, "./affinity-mode", NB_OP_MODIFY, + mode); + else + nb_cli_enqueue_change(vty, "./affinity-mode", NB_OP_DESTROY, + NULL); + return nb_cli_apply_changes(vty, NULL); +} + +static void lib_interface_zebra_link_params_affinity_mode_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + enum affinity_mode affinity_mode = yang_dnode_get_enum(dnode, NULL); + + if (affinity_mode == AFFINITY_MODE_STANDARD) + vty_out(vty, " affinity-mode standard\n"); + else if (affinity_mode == AFFINITY_MODE_BOTH) + vty_out(vty, " affinity-mode both\n"); + else if (affinity_mode == AFFINITY_MODE_EXTENDED && show_defaults) + vty_out(vty, " affinity-mode extended\n"); +} + +#ifdef HAVE_NETLINK +DEFPY_YANG (ip_address, + ip_address_cmd, + "[no] ip address A.B.C.D/M [label LINE$label]", + NO_STR + "Interface Internet Protocol config commands\n" + "Set the IP address of an interface\n" + "IP address (e.g. 10.0.0.1/8)\n" + "Label of this address\n" + "Label\n") +#else +DEFPY_YANG (ip_address, + ip_address_cmd, + "[no] ip address A.B.C.D/M", + NO_STR + "Interface Internet Protocol config commands\n" + "Set the IP address of an interface\n" + "IP address (e.g. 10.0.0.1/8)\n") +#endif +{ + char ip[INET_ADDRSTRLEN + 3]; + char *mask; + + if (no) { + nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); + } else { + nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); +#ifdef HAVE_NETLINK + if (label) + nb_cli_enqueue_change(vty, "./label", NB_OP_MODIFY, + label); + else + nb_cli_enqueue_change(vty, "./label", NB_OP_DESTROY, + NULL); +#endif + } + + strlcpy(ip, address_str, sizeof(ip)); + + mask = strchr(ip, '/'); + *mask = 0; + mask++; + + return nb_cli_apply_changes(vty, + "./frr-zebra:zebra/ipv4-addrs[ip='%s'][prefix-length='%s']", + ip, mask); +} + +static void lib_interface_zebra_ipv4_addrs_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + const char *ip = yang_dnode_get_string(dnode, "ip"); + uint8_t prefix_length = yang_dnode_get_uint8(dnode, "prefix-length"); + + vty_out(vty, " ip address %s/%u", ip, prefix_length); + + if (yang_dnode_exists(dnode, "label")) { + const char *label = yang_dnode_get_string(dnode, "label"); + + vty_out(vty, " label %s", label); + } + + vty_out(vty, "\n"); +} + +#ifdef HAVE_NETLINK +DEFPY_YANG (ip_address_peer, + ip_address_peer_cmd, + "[no] ip address A.B.C.D peer A.B.C.D/M [label LINE$label]", + NO_STR + "Interface Internet Protocol config commands\n" + "Set the IP address of an interface\n" + "Local IP (e.g. 10.0.0.1) for P-t-P address\n" + "Specify P-t-P address\n" + "Peer IP address (e.g. 10.0.0.1/8)\n" + "Label of this address\n" + "Label\n") +#else +DEFPY_YANG (ip_address_peer, + ip_address_peer_cmd, + "[no] ip address A.B.C.D peer A.B.C.D/M", + NO_STR + "Interface Internet Protocol config commands\n" + "Set the IP address of an interface\n" + "Local IP (e.g. 10.0.0.1) for P-t-P address\n" + "Specify P-t-P address\n" + "Peer IP address (e.g. 10.0.0.1/8)\n") +#endif +{ + char peer_ip[INET_ADDRSTRLEN + 3]; + char *peer_mask; + + if (no) { + nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); + } else { + nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); +#ifdef HAVE_NETLINK + if (label) + nb_cli_enqueue_change(vty, "./label", NB_OP_MODIFY, + label); + else + nb_cli_enqueue_change(vty, "./label", NB_OP_DESTROY, + NULL); +#endif + } + + strlcpy(peer_ip, peer_str, sizeof(peer_ip)); + + peer_mask = strchr(peer_ip, '/'); + *peer_mask = 0; + peer_mask++; + + return nb_cli_apply_changes( + vty, + "./frr-zebra:zebra/ipv4-p2p-addrs[ip='%s'][peer-ip='%s'][peer-prefix-length='%s']", + address_str, peer_ip, peer_mask); +} + +static void lib_interface_zebra_ipv4_p2p_addrs_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + const char *ip = yang_dnode_get_string(dnode, "ip"); + const char *peer_ip = yang_dnode_get_string(dnode, "peer-ip"); + uint8_t peer_prefix_length = yang_dnode_get_uint8(dnode, + "peer-prefix-length"); + + vty_out(vty, " ip address %s peer %s/%u", ip, peer_ip, + peer_prefix_length); + + if (yang_dnode_exists(dnode, "label")) { + const char *label = yang_dnode_get_string(dnode, "label"); + + vty_out(vty, " label %s", label); + } + + vty_out(vty, "\n"); +} + +DEFPY_YANG (ipv6_address, + ipv6_address_cmd, + "[no] ipv6 address X:X::X:X/M", + NO_STR + "Interface IPv6 config commands\n" + "Set the IP address of an interface\n" + "IPv6 address (e.g. 3ffe:506::1/48)\n") +{ + char ip[INET6_ADDRSTRLEN + 4]; + char *mask; + + if (no) + nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); + else + nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); + + strlcpy(ip, address_str, sizeof(ip)); + + mask = strchr(ip, '/'); + *mask = 0; + mask++; + + return nb_cli_apply_changes(vty, + "./frr-zebra:zebra/ipv6-addrs[ip='%s'][prefix-length='%s']", + ip, mask); +} + +static void lib_interface_zebra_ipv6_addrs_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + const char *ip = yang_dnode_get_string(dnode, "ip"); + uint8_t prefix_length = yang_dnode_get_uint8(dnode, "prefix-length"); + + vty_out(vty, " ipv6 address %s/%u\n", ip, prefix_length); +} + +/* CLI for setting an ES in bypass mode */ +DEFPY_HIDDEN (zebra_evpn_es_bypass, + zebra_evpn_es_bypass_cmd, + "[no] evpn mh bypass", + NO_STR + "EVPN\n" + EVPN_MH_VTY_STR + "Set bypass mode\n") +{ + if (!no) + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/evpn-mh/bypass", + NB_OP_MODIFY, "true"); + else + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/evpn-mh/bypass", + NB_OP_DESTROY, NULL); + return nb_cli_apply_changes(vty, NULL); +} + +static void lib_interface_zebra_evpn_mh_bypass_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + bool bypass = yang_dnode_get_bool(dnode, NULL); + + if (bypass) + vty_out(vty, " evpn mh bypass\n"); + else if (show_defaults) + vty_out(vty, " no evpn mh bypass\n"); +} + +/* CLI for configuring DF preference part for an ES */ +DEFPY_YANG (zebra_evpn_es_pref, + zebra_evpn_es_pref_cmd, + "[no$no] evpn mh es-df-pref ![(1-65535)$df_pref]", + NO_STR + "EVPN\n" + EVPN_MH_VTY_STR + "Preference value used for DF election\n" + "Preference\n") +{ + if (!no) + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/evpn-mh/df-preference", + NB_OP_MODIFY, df_pref_str); + else + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/evpn-mh/df-preference", + NB_OP_DESTROY, NULL); + return nb_cli_apply_changes(vty, NULL); +} + +static void lib_interface_zebra_evpn_mh_df_preference_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + uint16_t df_pref = yang_dnode_get_uint16(dnode, NULL); + + vty_out(vty, " evpn mh es-df-pref %u\n", df_pref); +} + +/* CLI for setting up sysmac part of ESI on an access port */ +DEFPY_YANG (zebra_evpn_es_sys_mac, + zebra_evpn_es_sys_mac_cmd, + "[no$no] evpn mh es-sys-mac ![X:X:X:X:X:X$mac]", + NO_STR + "EVPN\n" + EVPN_MH_VTY_STR + "Ethernet segment system MAC\n" + MAC_STR) +{ + if (!no) + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/evpn-mh/type-3/system-mac", + NB_OP_MODIFY, mac_str); + else + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/evpn-mh/type-3/system-mac", + NB_OP_DESTROY, NULL); + return nb_cli_apply_changes(vty, NULL); +} + +static void lib_interface_zebra_evpn_mh_type_3_system_mac_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + char buf[ETHER_ADDR_STRLEN]; + struct ethaddr mac; + + yang_dnode_get_mac(&mac, dnode, NULL); + + vty_out(vty, " evpn mh es-sys-mac %s\n", + prefix_mac2str(&mac, buf, sizeof(buf))); +} + +/* CLI for setting up local-ID part of ESI on an access port */ +DEFPY_YANG (zebra_evpn_es_id, + zebra_evpn_es_id_cmd, + "[no$no] evpn mh es-id ![(1-16777215)$es_lid | NAME$esi_str]", + NO_STR + "EVPN\n" + EVPN_MH_VTY_STR + "Ethernet segment identifier\n" + "local discriminator\n" + "10-byte ID - 00:AA:BB:CC:DD:EE:FF:GG:HH:II\n") +{ + if (no) { + /* We don't know which one is configured, so detroy both types. */ + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/evpn-mh/type-0/esi", + NB_OP_DESTROY, NULL); + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/evpn-mh/type-3/local-discriminator", + NB_OP_DESTROY, NULL); + } else { + if (esi_str) + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/evpn-mh/type-0/esi", + NB_OP_MODIFY, esi_str); + else + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/evpn-mh/type-3/local-discriminator", + NB_OP_MODIFY, es_lid_str); + } + return nb_cli_apply_changes(vty, NULL); +} + +static void lib_interface_zebra_evpn_mh_type_0_esi_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + const char *esi_str = yang_dnode_get_string(dnode, NULL); + + vty_out(vty, " evpn mh es-id %s\n", esi_str); +} + +static void lib_interface_zebra_evpn_mh_type_3_local_discriminator_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + uint32_t es_lid = yang_dnode_get_uint32(dnode, NULL); + + vty_out(vty, " evpn mh es-id %u\n", es_lid); +} + +/* CLI for tagging an interface as an uplink */ +DEFPY_YANG (zebra_evpn_mh_uplink, + zebra_evpn_mh_uplink_cmd, + "[no] evpn mh uplink", + NO_STR + "EVPN\n" + EVPN_MH_VTY_STR + "Uplink to the VxLAN core\n") +{ + if (!no) + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/evpn-mh/uplink", + NB_OP_MODIFY, "true"); + else + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/evpn-mh/uplink", + NB_OP_DESTROY, NULL); + return nb_cli_apply_changes(vty, NULL); +} + +static void lib_interface_zebra_evpn_mh_uplink_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + bool uplink = yang_dnode_get_bool(dnode, NULL); + + if (uplink) + vty_out(vty, " evpn mh uplink\n"); + else if (show_defaults) + vty_out(vty, " no evpn mh uplink\n"); +} + +#if defined(HAVE_RTADV) +DEFPY_YANG (ipv6_nd_ra_fast_retrans, + ipv6_nd_ra_fast_retrans_cmd, + "[no] ipv6 nd ra-fast-retrans", + NO_STR + "Interface IPv6 config commands\n" + "Neighbor discovery\n" + "Fast retransmit of RA packets\n") +{ + if (no) + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/ipv6-router-advertisements/fast-retransmit", + NB_OP_MODIFY, "false"); + else + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/ipv6-router-advertisements/fast-retransmit", + NB_OP_DESTROY, NULL); + return nb_cli_apply_changes(vty, NULL); +} + +static void +lib_interface_zebra_ipv6_router_advertisements_fast_retransmit_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + bool fast_retransmit = yang_dnode_get_bool(dnode, NULL); + + if (!fast_retransmit) + vty_out(vty, " no ipv6 nd ra-fast-retrans\n"); + else if (show_defaults) + vty_out(vty, " ipv6 nd ra-fast-retrans\n"); +} + +DEFPY_YANG (ipv6_nd_ra_hop_limit, + ipv6_nd_ra_hop_limit_cmd, + "[no] ipv6 nd ra-hop-limit ![(0-255)$hopcount]", + NO_STR + "Interface IPv6 config commands\n" + "Neighbor discovery\n" + "Advertisement Hop Limit\n" + "Advertisement Hop Limit in hops (default:64)\n") +{ + if (!no) + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/ipv6-router-advertisements/cur-hop-limit", + NB_OP_MODIFY, hopcount_str); + else + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/ipv6-router-advertisements/cur-hop-limit", + NB_OP_DESTROY, NULL); + return nb_cli_apply_changes(vty, NULL); +} + +static void +lib_interface_zebra_ipv6_router_advertisements_cur_hop_limit_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + uint8_t hop_limit = yang_dnode_get_uint8(dnode, NULL); + + vty_out(vty, " ipv6 nd ra-hop-limit %u\n", hop_limit); +} + +DEFPY_YANG (ipv6_nd_ra_retrans_interval, + ipv6_nd_ra_retrans_interval_cmd, + "[no] ipv6 nd ra-retrans-interval ![(0-4294967295)$interval]", + NO_STR + "Interface IPv6 config commands\n" + "Neighbor discovery\n" + "Advertisement Retransmit Interval\n" + "Advertisement Retransmit Interval in msec\n") +{ + if (!no) + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/ipv6-router-advertisements/retrans-timer", + NB_OP_MODIFY, interval_str); + else + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/ipv6-router-advertisements/retrans-timer", + NB_OP_DESTROY, NULL); + return nb_cli_apply_changes(vty, NULL); +} + +static void +lib_interface_zebra_ipv6_router_advertisements_retrans_timer_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + uint32_t retrans_timer = yang_dnode_get_uint32(dnode, NULL); + + vty_out(vty, " ipv6 nd ra-retrans-interval %u\n", retrans_timer); +} + +DEFPY_YANG (ipv6_nd_suppress_ra, + ipv6_nd_suppress_ra_cmd, + "[no] ipv6 nd suppress-ra", + NO_STR + "Interface IPv6 config commands\n" + "Neighbor discovery\n" + "Suppress Router Advertisement\n") +{ + if (no) + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/ipv6-router-advertisements/send-advertisements", + NB_OP_MODIFY, "true"); + else + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/ipv6-router-advertisements/send-advertisements", + NB_OP_DESTROY, NULL); + return nb_cli_apply_changes(vty, NULL); +} + +static void +lib_interface_zebra_ipv6_router_advertisements_send_advertisements_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + bool send_advertisements = yang_dnode_get_bool(dnode, NULL); + + if (send_advertisements) + vty_out(vty, " no ipv6 nd suppress-ra\n"); + else if (show_defaults) + vty_out(vty, " ipv6 nd suppress-ra\n"); +} + +DEFPY_YANG (ipv6_nd_ra_interval, + ipv6_nd_ra_interval_cmd, + "[no] ipv6 nd ra-interval ![<(1-1800)$sec|msec (70-1800000)$msec>]", + NO_STR + "Interface IPv6 config commands\n" + "Neighbor discovery\n" + "Router Advertisement interval\n" + "Router Advertisement interval in seconds\n" + "Router Advertisement interval in milliseconds\n" + "Router Advertisement interval in milliseconds\n") +{ + char value[YANG_VALUE_MAXLEN]; + + if (!no) { + if (sec) + snprintf(value, sizeof(value), "%lu", sec * 1000); + else + snprintf(value, sizeof(value), "%lu", msec); + + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/ipv6-router-advertisements/max-rtr-adv-interval", + NB_OP_MODIFY, value); + } else { + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/ipv6-router-advertisements/max-rtr-adv-interval", + NB_OP_DESTROY, NULL); + } + return nb_cli_apply_changes(vty, NULL); +} + +static void +lib_interface_zebra_ipv6_router_advertisements_max_rtr_adv_interval_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + uint32_t max_rtr_adv_interval = yang_dnode_get_uint32(dnode, NULL); + + if (max_rtr_adv_interval % 1000) + vty_out(vty, " ipv6 nd ra-interval msec %u\n", + max_rtr_adv_interval); + else + vty_out(vty, " ipv6 nd ra-interval %u\n", + max_rtr_adv_interval / 1000); +} + +DEFPY_YANG (ipv6_nd_ra_lifetime, + ipv6_nd_ra_lifetime_cmd, + "[no] ipv6 nd ra-lifetime ![(0-9000)$lifetime]", + NO_STR + "Interface IPv6 config commands\n" + "Neighbor discovery\n" + "Router lifetime\n" + "Router lifetime in seconds (0 stands for a non-default gw)\n") +{ + if (!no) + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/ipv6-router-advertisements/default-lifetime", + NB_OP_MODIFY, lifetime_str); + else + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/ipv6-router-advertisements/default-lifetime", + NB_OP_DESTROY, NULL); + return nb_cli_apply_changes(vty, NULL); +} + +static void +lib_interface_zebra_ipv6_router_advertisements_default_lifetime_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + uint16_t default_lifetime = yang_dnode_get_uint16(dnode, NULL); + + vty_out(vty, " ipv6 nd ra-lifetime %u\n", default_lifetime); +} + +DEFPY_YANG (ipv6_nd_reachable_time, + ipv6_nd_reachable_time_cmd, + "[no] ipv6 nd reachable-time ![(1-3600000)$msec]", + NO_STR + "Interface IPv6 config commands\n" + "Neighbor discovery\n" + "Reachable time\n" + "Reachable time in milliseconds\n") +{ + if (!no) + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/ipv6-router-advertisements/reachable-time", + NB_OP_MODIFY, msec_str); + else + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/ipv6-router-advertisements/reachable-time", + NB_OP_DESTROY, NULL); + return nb_cli_apply_changes(vty, NULL); +} + +static void +lib_interface_zebra_ipv6_router_advertisements_reachable_time_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + uint32_t reachable_time = yang_dnode_get_uint32(dnode, NULL); + + vty_out(vty, " ipv6 nd reachable-time %u\n", reachable_time); +} + +DEFPY_YANG (ipv6_nd_homeagent_preference, + ipv6_nd_homeagent_preference_cmd, + "[no] ipv6 nd home-agent-preference ![(0-65535)$pref]", + NO_STR + "Interface IPv6 config commands\n" + "Neighbor discovery\n" + "Home Agent preference\n" + "preference value (default is 0, least preferred)\n") +{ + if (!no) + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/ipv6-router-advertisements/home-agent-preference", + NB_OP_MODIFY, pref_str); + else + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/ipv6-router-advertisements/home-agent-preference", + NB_OP_DESTROY, NULL); + return nb_cli_apply_changes(vty, NULL); +} + +static void +lib_interface_zebra_ipv6_router_advertisements_home_agent_preference_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + uint16_t home_agent_preference = yang_dnode_get_uint16(dnode, NULL); + + vty_out(vty, " ipv6 nd home-agent-preference %u\n", + home_agent_preference); +} + +DEFPY_YANG (ipv6_nd_homeagent_lifetime, + ipv6_nd_homeagent_lifetime_cmd, + "[no] ipv6 nd home-agent-lifetime ![(1-65520)$lifetime]", + NO_STR + "Interface IPv6 config commands\n" + "Neighbor discovery\n" + "Home Agent lifetime\n" + "Home Agent lifetime in seconds\n") +{ + if (!no) + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/ipv6-router-advertisements/home-agent-lifetime", + NB_OP_MODIFY, lifetime_str); + else + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/ipv6-router-advertisements/home-agent-lifetime", + NB_OP_DESTROY, NULL); + return nb_cli_apply_changes(vty, NULL); +} + +static void +lib_interface_zebra_ipv6_router_advertisements_home_agent_lifetime_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + uint16_t home_agent_lifetime = yang_dnode_get_uint16(dnode, NULL); + + vty_out(vty, " ipv6 nd home-agent-lifetime %u\n", home_agent_lifetime); +} + +DEFPY_YANG (ipv6_nd_managed_config_flag, + ipv6_nd_managed_config_flag_cmd, + "[no] ipv6 nd managed-config-flag", + NO_STR + "Interface IPv6 config commands\n" + "Neighbor discovery\n" + "Managed address configuration flag\n") +{ + if (!no) + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/ipv6-router-advertisements/managed-flag", + NB_OP_MODIFY, "true"); + else + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/ipv6-router-advertisements/managed-flag", + NB_OP_DESTROY, NULL); + return nb_cli_apply_changes(vty, NULL); +} + +static void lib_interface_zebra_ipv6_router_advertisements_managed_flag_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + bool managed_flag = yang_dnode_get_bool(dnode, NULL); + + if (managed_flag) + vty_out(vty, " ipv6 nd managed-config-flag\n"); + else if (show_defaults) + vty_out(vty, " no ipv6 nd managed-config-flag\n"); +} + +DEFPY_YANG (ipv6_nd_homeagent_config_flag, + ipv6_nd_homeagent_config_flag_cmd, + "[no] ipv6 nd home-agent-config-flag", + NO_STR + "Interface IPv6 config commands\n" + "Neighbor discovery\n" + "Home Agent configuration flag\n") +{ + if (!no) + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/ipv6-router-advertisements/home-agent-flag", + NB_OP_MODIFY, "true"); + else + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/ipv6-router-advertisements/home-agent-flag", + NB_OP_DESTROY, NULL); + return nb_cli_apply_changes(vty, NULL); +} + +static void +lib_interface_zebra_ipv6_router_advertisements_home_agent_flag_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + bool home_agent_flag = yang_dnode_get_bool(dnode, NULL); + + if (home_agent_flag) + vty_out(vty, " ipv6 nd home-agent-config-flag\n"); + else if (show_defaults) + vty_out(vty, " no ipv6 nd home-agent-config-flag\n"); +} + +DEFPY_YANG (ipv6_nd_adv_interval_config_option, + ipv6_nd_adv_interval_config_option_cmd, + "[no] ipv6 nd adv-interval-option", + NO_STR + "Interface IPv6 config commands\n" + "Neighbor discovery\n" + "Advertisement Interval Option\n") +{ + if (!no) + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/ipv6-router-advertisements/advertisement-interval-option", + NB_OP_MODIFY, "true"); + else + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/ipv6-router-advertisements/advertisement-interval-option", + NB_OP_DESTROY, NULL); + return nb_cli_apply_changes(vty, NULL); +} + +static void +lib_interface_zebra_ipv6_router_advertisements_advertisement_interval_option_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + bool advertisement_interval_option = yang_dnode_get_bool(dnode, NULL); + + if (advertisement_interval_option) + vty_out(vty, " ipv6 nd adv-interval-option\n"); + else if (show_defaults) + vty_out(vty, " no ipv6 nd adv-interval-option\n"); +} + +DEFPY_YANG (ipv6_nd_other_config_flag, + ipv6_nd_other_config_flag_cmd, + "[no] ipv6 nd other-config-flag", + NO_STR + "Interface IPv6 config commands\n" + "Neighbor discovery\n" + "Other statefull configuration flag\n") +{ + if (!no) + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/ipv6-router-advertisements/other-config-flag", + NB_OP_MODIFY, "true"); + else + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/ipv6-router-advertisements/other-config-flag", + NB_OP_DESTROY, NULL); + return nb_cli_apply_changes(vty, NULL); +} + +static void +lib_interface_zebra_ipv6_router_advertisements_other_config_flag_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + bool other_config_flag = yang_dnode_get_bool(dnode, NULL); + + if (other_config_flag) + vty_out(vty, " ipv6 nd other-config-flag\n"); + else if (show_defaults) + vty_out(vty, " no ipv6 nd other-config-flag\n"); +} + +DEFPY_YANG (ipv6_nd_prefix, + ipv6_nd_prefix_cmd, + "[no] ipv6 nd prefix X:X::X:X/M$prefix [<(0-4294967295)|infinite>$valid <(0-4294967295)|infinite>$preferred] [{router-address$routeraddr|off-link$offlink|no-autoconfig$noautoconf}]", + NO_STR + "Interface IPv6 config commands\n" + "Neighbor discovery\n" + "Prefix information\n" + "IPv6 prefix\n" + "Valid lifetime in seconds\n" + "Infinite valid lifetime\n" + "Preferred lifetime in seconds\n" + "Infinite preferred lifetime\n" + "Set Router Address flag\n" + "Do not use prefix for onlink determination\n" + "Do not use prefix for autoconfiguration\n") +{ + if (!no) { + nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); + if (valid) { + if (strmatch(valid, "infinite")) + valid = "4294967295"; + nb_cli_enqueue_change(vty, "./valid-lifetime", + NB_OP_MODIFY, valid); + } else { + nb_cli_enqueue_change(vty, "./valid-lifetime", + NB_OP_DESTROY, NULL); + } + if (preferred) { + if (strmatch(preferred, "infinite")) + preferred = "4294967295"; + nb_cli_enqueue_change(vty, "./preferred-lifetime", + NB_OP_MODIFY, preferred); + } else { + nb_cli_enqueue_change(vty, "./preferred-lifetime", + NB_OP_DESTROY, NULL); + } + if (routeraddr) + nb_cli_enqueue_change(vty, "./router-address-flag", + NB_OP_MODIFY, "true"); + else + nb_cli_enqueue_change(vty, "./router-address-flag", + NB_OP_DESTROY, NULL); + if (offlink) + nb_cli_enqueue_change(vty, "./on-link-flag", + NB_OP_MODIFY, "false"); + else + nb_cli_enqueue_change(vty, "./on-link-flag", + NB_OP_DESTROY, NULL); + if (noautoconf) + nb_cli_enqueue_change(vty, "./autonomous-flag", + NB_OP_MODIFY, "false"); + else + nb_cli_enqueue_change(vty, "./autonomous-flag", + NB_OP_DESTROY, NULL); + } else { + nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); + } + return nb_cli_apply_changes( + vty, + "./frr-zebra:zebra/ipv6-router-advertisements/prefix-list/prefix[prefix-spec='%s']", + prefix_str); +} + +static void +lib_interface_zebra_ipv6_router_advertisements_prefix_list_prefix_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + const char *prefix = yang_dnode_get_string(dnode, "prefix-spec"); + struct lyd_node *valid = yang_dnode_get(dnode, "valid-lifetime"); + struct lyd_node *preferred = yang_dnode_get(dnode, "preferred-lifetime"); + bool router_address_flag = yang_dnode_get_bool(dnode, + "router-address-flag"); + bool on_link_flag = yang_dnode_get_bool(dnode, "on-link-flag"); + bool autonomous_flag = yang_dnode_get_bool(dnode, "autonomous-flag"); + + vty_out(vty, " ipv6 nd prefix %s", prefix); + + if (!yang_dnode_is_default(valid, NULL) || + !yang_dnode_is_default(preferred, NULL) || show_defaults) { + uint32_t valid_lifetime = yang_dnode_get_uint32(valid, NULL); + uint32_t preferred_lifetime = yang_dnode_get_uint32(preferred, + NULL); + + if (valid_lifetime == UINT32_MAX) + vty_out(vty, " infinite"); + else + vty_out(vty, " %u", valid_lifetime); + if (preferred_lifetime == UINT32_MAX) + vty_out(vty, " infinite"); + else + vty_out(vty, " %u", preferred_lifetime); + } + + if (!on_link_flag) + vty_out(vty, " off-link"); + + if (!autonomous_flag) + vty_out(vty, " no-autoconfig"); + + if (router_address_flag) + vty_out(vty, " router-address"); + + vty_out(vty, "\n"); +} + +DEFPY_YANG (ipv6_nd_router_preference, + ipv6_nd_router_preference_cmd, + "[no] ipv6 nd router-preference ![$pref]", + NO_STR + "Interface IPv6 config commands\n" + "Neighbor discovery\n" + "Default router preference\n" + "High default router preference\n" + "Medium default router preference (default)\n" + "Low default router preference\n") +{ + if (!no) + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/ipv6-router-advertisements/default-router-preference", + NB_OP_MODIFY, pref); + else + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/ipv6-router-advertisements/default-router-preference", + NB_OP_DESTROY, NULL); + return nb_cli_apply_changes(vty, NULL); +} + +static void +lib_interface_zebra_ipv6_router_advertisements_default_router_preference_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + const char *default_router_preference = yang_dnode_get_string(dnode, + NULL); + + vty_out(vty, " ipv6 nd router-preference %s\n", + default_router_preference); +} + +DEFPY_YANG (ipv6_nd_mtu, + ipv6_nd_mtu_cmd, + "[no] ipv6 nd mtu ![(1-65535)]", + NO_STR + "Interface IPv6 config commands\n" + "Neighbor discovery\n" + "Advertised MTU\n" + "MTU in bytes\n") +{ + if (!no) + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/ipv6-router-advertisements/link-mtu", + NB_OP_MODIFY, mtu_str); + else + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/ipv6-router-advertisements/link-mtu", + NB_OP_DESTROY, NULL); + return nb_cli_apply_changes(vty, NULL); +} + +static void lib_interface_zebra_ipv6_router_advertisements_link_mtu_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + uint16_t link_mtu = yang_dnode_get_uint32(dnode, NULL); + + vty_out(vty, " ipv6 nd mtu %u\n", link_mtu); +} + +DEFPY_YANG (ipv6_nd_rdnss, + ipv6_nd_rdnss_cmd, + "[no] ipv6 nd rdnss X:X::X:X$addr [<(0-4294967295)|infinite>]$lifetime", + NO_STR + "Interface IPv6 config commands\n" + "Neighbor discovery\n" + "Recursive DNS server information\n" + "IPv6 address\n" + "Valid lifetime in seconds\n" + "Infinite valid lifetime\n") +{ + if (!no) { + nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); + if (lifetime) { + if (strmatch(lifetime, "infinite")) + lifetime = "4294967295"; + nb_cli_enqueue_change(vty, "./lifetime", NB_OP_MODIFY, + lifetime); + } else { + nb_cli_enqueue_change(vty, "./lifetime", NB_OP_DESTROY, + NULL); + } + } else { + nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); + } + return nb_cli_apply_changes( + vty, + "./frr-zebra:zebra/ipv6-router-advertisements/rdnss/rdnss-address[address='%s']", + addr_str); +} + +static void +lib_interface_zebra_ipv6_router_advertisements_rdnss_rdnss_address_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + const char *address = yang_dnode_get_string(dnode, "address"); + + vty_out(vty, " ipv6 nd rdnss %s", address); + + if (yang_dnode_exists(dnode, "lifetime")) { + uint32_t lifetime = yang_dnode_get_uint32(dnode, "lifetime"); + + if (lifetime == UINT32_MAX) + vty_out(vty, " infinite"); + else + vty_out(vty, " %u", lifetime); + } + + vty_out(vty, "\n"); +} + +DEFPY_YANG (ipv6_nd_dnssl, + ipv6_nd_dnssl_cmd, + "[no] ipv6 nd dnssl SUFFIX [<(0-4294967295)|infinite>]$lifetime", + NO_STR + "Interface IPv6 config commands\n" + "Neighbor discovery\n" + "DNS search list information\n" + "Domain name suffix\n" + "Valid lifetime in seconds\n" + "Infinite valid lifetime\n") +{ + char domain[254]; + size_t len; + + len = strlcpy(domain, suffix, sizeof(domain)); + if (len == 0 || len >= sizeof(domain)) { + vty_out(vty, "Malformed DNS search domain\n"); + return CMD_WARNING_CONFIG_FAILED; + } + if (domain[len - 1] == '.') { + /* + * Allow, but don't require, a trailing dot signifying the root + * zone. Canonicalize by cutting it off if present. + */ + domain[len - 1] = '\0'; + len--; + } + + if (!no) { + nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); + if (lifetime) { + if (strmatch(lifetime, "infinite")) + lifetime = "4294967295"; + nb_cli_enqueue_change(vty, "./lifetime", NB_OP_MODIFY, + lifetime); + } else { + nb_cli_enqueue_change(vty, "./lifetime", NB_OP_DESTROY, + NULL); + } + } else { + nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); + } + return nb_cli_apply_changes( + vty, + "./frr-zebra:zebra/ipv6-router-advertisements/dnssl/dnssl-domain[domain='%s']", + domain); +} + +static void +lib_interface_zebra_ipv6_router_advertisements_dnssl_dnssl_domain_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + const char *domain = yang_dnode_get_string(dnode, "domain"); + + vty_out(vty, " ipv6 nd dnssl %s", domain); + + if (yang_dnode_exists(dnode, "lifetime")) { + uint32_t lifetime = yang_dnode_get_uint32(dnode, "lifetime"); + + if (lifetime == UINT32_MAX) + vty_out(vty, " infinite"); + else + vty_out(vty, " %u", lifetime); + } + + vty_out(vty, "\n"); +} +#endif /* HAVE_RTADV */ + +#if HAVE_BFDD == 0 +DEFPY_YANG (zebra_ptm_enable_if, + zebra_ptm_enable_if_cmd, + "[no] ptm-enable", + NO_STR + "Enable neighbor check with specified topology\n") +{ + if (no) + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/ptm-enable", + NB_OP_MODIFY, "false"); + else + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/ptm-enable", + NB_OP_DESTROY, NULL); + return nb_cli_apply_changes(vty, NULL); +} + +static void lib_interface_zebra_ptm_enable_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + bool enable = yang_dnode_get_bool(dnode, NULL); + + if (!enable) + vty_out(vty, " no ptm-enable\n"); + else if (show_defaults) + vty_out(vty, " ptm-enable\n"); +} +#endif /* HAVE_BFDD == 0 */ + +#if HAVE_BFDD == 0 || defined(HAVE_RTADV) +const char *features[] = { +#if HAVE_BFDD == 0 + "ptm-bfd", +#endif +#if defined(HAVE_RTADV) + "ipv6-router-advertisements", +#endif + NULL +}; +#endif + +/* clang-format off */ +const struct frr_yang_module_info frr_zebra_cli_info = { + .name = "frr-zebra", + .ignore_cfg_cbs = true, +#if HAVE_BFDD == 0 || defined(HAVE_RTADV) + .features = features, +#endif + .nodes = { + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv4-addrs", + .cbs.cli_show = lib_interface_zebra_ipv4_addrs_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv4-p2p-addrs", + .cbs.cli_show = lib_interface_zebra_ipv4_p2p_addrs_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-addrs", + .cbs.cli_show = lib_interface_zebra_ipv6_addrs_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/multicast", + .cbs.cli_show = lib_interface_zebra_multicast_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/link-detect", + .cbs.cli_show = lib_interface_zebra_link_detect_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/enabled", + .cbs.cli_show = lib_interface_zebra_enabled_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/bandwidth", + .cbs.cli_show = lib_interface_zebra_bandwidth_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/mpls", + .cbs.cli_show = lib_interface_zebra_mpls_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/link-params", + .cbs.cli_show = lib_interface_zebra_link_params_cli_write, + .cbs.cli_show_end = lib_interface_zebra_link_params_cli_write_end, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/link-params/metric", + .cbs.cli_show = lib_interface_zebra_link_params_metric_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/link-params/max-bandwidth", + .cbs.cli_show = lib_interface_zebra_link_params_max_bandwidth_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/link-params/max-reservable-bandwidth", + .cbs.cli_show = lib_interface_zebra_link_params_max_reservable_bandwidth_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/link-params/unreserved-bandwidths/unreserved-bandwidth", + .cbs.cli_show = lib_interface_zebra_link_params_unreserved_bandwidths_unreserved_bandwidth_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/link-params/residual-bandwidth", + .cbs.cli_show = lib_interface_zebra_link_params_residual_bandwidth_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/link-params/available-bandwidth", + .cbs.cli_show = lib_interface_zebra_link_params_available_bandwidth_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/link-params/utilized-bandwidth", + .cbs.cli_show = lib_interface_zebra_link_params_utilized_bandwidth_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/link-params/legacy-admin-group", + .cbs.cli_show = lib_interface_zebra_link_params_legacy_admin_group_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/link-params/affinities", + .cbs.cli_show = lib_interface_zebra_link_params_affinities_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/link-params/affinity-mode", + .cbs.cli_show = lib_interface_zebra_link_params_affinity_mode_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/link-params/neighbor", + .cbs.cli_show = lib_interface_zebra_link_params_neighbor_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/link-params/delay", + .cbs.cli_show = lib_interface_zebra_link_params_delay_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/link-params/delay-variation", + .cbs.cli_show = lib_interface_zebra_link_params_delay_variation_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/link-params/packet-loss", + .cbs.cli_show = lib_interface_zebra_link_params_packet_loss_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/evpn-mh/type-0/esi", + .cbs.cli_show = lib_interface_zebra_evpn_mh_type_0_esi_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/evpn-mh/type-3/system-mac", + .cbs.cli_show = lib_interface_zebra_evpn_mh_type_3_system_mac_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/evpn-mh/type-3/local-discriminator", + .cbs.cli_show = lib_interface_zebra_evpn_mh_type_3_local_discriminator_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/evpn-mh/df-preference", + .cbs.cli_show = lib_interface_zebra_evpn_mh_df_preference_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/evpn-mh/bypass", + .cbs.cli_show = lib_interface_zebra_evpn_mh_bypass_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/evpn-mh/uplink", + .cbs.cli_show = lib_interface_zebra_evpn_mh_uplink_cli_write, + }, +#if defined(HAVE_RTADV) + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/send-advertisements", + .cbs.cli_show = lib_interface_zebra_ipv6_router_advertisements_send_advertisements_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/max-rtr-adv-interval", + .cbs.cli_show = lib_interface_zebra_ipv6_router_advertisements_max_rtr_adv_interval_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/managed-flag", + .cbs.cli_show = lib_interface_zebra_ipv6_router_advertisements_managed_flag_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/other-config-flag", + .cbs.cli_show = lib_interface_zebra_ipv6_router_advertisements_other_config_flag_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/home-agent-flag", + .cbs.cli_show = lib_interface_zebra_ipv6_router_advertisements_home_agent_flag_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/link-mtu", + .cbs.cli_show = lib_interface_zebra_ipv6_router_advertisements_link_mtu_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/reachable-time", + .cbs.cli_show = lib_interface_zebra_ipv6_router_advertisements_reachable_time_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/retrans-timer", + .cbs.cli_show = lib_interface_zebra_ipv6_router_advertisements_retrans_timer_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/cur-hop-limit", + .cbs.cli_show = lib_interface_zebra_ipv6_router_advertisements_cur_hop_limit_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/default-lifetime", + .cbs.cli_show = lib_interface_zebra_ipv6_router_advertisements_default_lifetime_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/fast-retransmit", + .cbs.cli_show = lib_interface_zebra_ipv6_router_advertisements_fast_retransmit_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/advertisement-interval-option", + .cbs.cli_show = lib_interface_zebra_ipv6_router_advertisements_advertisement_interval_option_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/home-agent-preference", + .cbs.cli_show = lib_interface_zebra_ipv6_router_advertisements_home_agent_preference_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/home-agent-lifetime", + .cbs.cli_show = lib_interface_zebra_ipv6_router_advertisements_home_agent_lifetime_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/default-router-preference", + .cbs.cli_show = lib_interface_zebra_ipv6_router_advertisements_default_router_preference_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/prefix-list/prefix", + .cbs.cli_show = lib_interface_zebra_ipv6_router_advertisements_prefix_list_prefix_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/dnssl/dnssl-domain", + .cbs.cli_show = lib_interface_zebra_ipv6_router_advertisements_dnssl_dnssl_domain_cli_write, + }, + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/rdnss/rdnss-address", + .cbs.cli_show = lib_interface_zebra_ipv6_router_advertisements_rdnss_rdnss_address_cli_write, + }, +#endif /* defined(HAVE_RTADV) */ +#if HAVE_BFDD == 0 + { + .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ptm-enable", + .cbs.cli_show = lib_interface_zebra_ptm_enable_cli_write, + }, +#endif + { + .xpath = NULL, + }, + } +}; + +struct cmd_node link_params_node = { + .name = "link-params", + .node = LINK_PARAMS_NODE, + .parent_node = INTERFACE_NODE, + .prompt = "%s(config-link-params)# ", +}; + +void zebra_cli_init(void) +{ + install_node(&link_params_node); + + install_element(INTERFACE_NODE, &multicast_new_cmd); + install_element(INTERFACE_NODE, &multicast_cmd); + install_element(INTERFACE_NODE, &no_multicast_cmd); + install_element(INTERFACE_NODE, &mpls_cmd); + install_element(INTERFACE_NODE, &linkdetect_cmd); + install_element(INTERFACE_NODE, &shutdown_if_cmd); + install_element(INTERFACE_NODE, &bandwidth_if_cmd); + install_element(INTERFACE_NODE, &ip_address_cmd); + install_element(INTERFACE_NODE, &ip_address_peer_cmd); + install_element(INTERFACE_NODE, &ipv6_address_cmd); + install_element(INTERFACE_NODE, &link_params_cmd); + install_element(INTERFACE_NODE, &no_link_params_cmd); + install_default(LINK_PARAMS_NODE); + install_element(LINK_PARAMS_NODE, &link_params_enable_cmd); + install_element(LINK_PARAMS_NODE, &no_link_params_enable_cmd); + install_element(LINK_PARAMS_NODE, &link_params_metric_cmd); + install_element(LINK_PARAMS_NODE, &link_params_maxbw_cmd); + install_element(LINK_PARAMS_NODE, &link_params_max_rsv_bw_cmd); + install_element(LINK_PARAMS_NODE, &link_params_unrsv_bw_cmd); + install_element(LINK_PARAMS_NODE, &link_params_admin_grp_cmd); + install_element(LINK_PARAMS_NODE, &link_params_inter_as_cmd); + install_element(LINK_PARAMS_NODE, &link_params_delay_cmd); + install_element(LINK_PARAMS_NODE, &link_params_delay_var_cmd); + install_element(LINK_PARAMS_NODE, &link_params_pkt_loss_cmd); + install_element(LINK_PARAMS_NODE, &link_params_ava_bw_cmd); + install_element(LINK_PARAMS_NODE, &link_params_res_bw_cmd); + install_element(LINK_PARAMS_NODE, &link_params_use_bw_cmd); + install_element(LINK_PARAMS_NODE, &link_params_affinity_cmd); + install_element(LINK_PARAMS_NODE, &link_params_affinity_mode_cmd); + install_element(LINK_PARAMS_NODE, &exit_link_params_cmd); + + install_element(INTERFACE_NODE, &zebra_evpn_es_id_cmd); + install_element(INTERFACE_NODE, &zebra_evpn_es_sys_mac_cmd); + install_element(INTERFACE_NODE, &zebra_evpn_es_pref_cmd); + install_element(INTERFACE_NODE, &zebra_evpn_es_bypass_cmd); + install_element(INTERFACE_NODE, &zebra_evpn_mh_uplink_cmd); + +#if defined(HAVE_RTADV) + install_element(INTERFACE_NODE, &ipv6_nd_ra_fast_retrans_cmd); + install_element(INTERFACE_NODE, &ipv6_nd_ra_retrans_interval_cmd); + install_element(INTERFACE_NODE, &ipv6_nd_ra_hop_limit_cmd); + install_element(INTERFACE_NODE, &ipv6_nd_suppress_ra_cmd); + install_element(INTERFACE_NODE, &ipv6_nd_ra_interval_cmd); + install_element(INTERFACE_NODE, &ipv6_nd_ra_lifetime_cmd); + install_element(INTERFACE_NODE, &ipv6_nd_reachable_time_cmd); + install_element(INTERFACE_NODE, &ipv6_nd_managed_config_flag_cmd); + install_element(INTERFACE_NODE, &ipv6_nd_other_config_flag_cmd); + install_element(INTERFACE_NODE, &ipv6_nd_homeagent_config_flag_cmd); + install_element(INTERFACE_NODE, &ipv6_nd_homeagent_preference_cmd); + install_element(INTERFACE_NODE, &ipv6_nd_homeagent_lifetime_cmd); + install_element(INTERFACE_NODE, &ipv6_nd_adv_interval_config_option_cmd); + install_element(INTERFACE_NODE, &ipv6_nd_prefix_cmd); + install_element(INTERFACE_NODE, &ipv6_nd_router_preference_cmd); + install_element(INTERFACE_NODE, &ipv6_nd_mtu_cmd); + install_element(INTERFACE_NODE, &ipv6_nd_rdnss_cmd); + install_element(INTERFACE_NODE, &ipv6_nd_dnssl_cmd); +#endif +#if HAVE_BFDD == 0 + install_element(INTERFACE_NODE, &zebra_ptm_enable_if_cmd); +#endif +} diff --git a/zebra/zebra_cli.h b/zebra/zebra_cli.h new file mode 100644 index 000000000000..01931a47ab6b --- /dev/null +++ b/zebra/zebra_cli.h @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#ifndef _ZEBRA_CLI_H +#define _ZEBRA_CLI_H 1 + +extern const struct frr_yang_module_info frr_zebra_cli_info; + +void zebra_cli_init(void); + +#endif diff --git a/zebra/zebra_evpn_mh.c b/zebra/zebra_evpn_mh.c index eb0cb6e0b3cf..35d5027fb8a6 100644 --- a/zebra/zebra_evpn_mh.c +++ b/zebra/zebra_evpn_mh.c @@ -20,7 +20,6 @@ #include "table.h" #include "vlan.h" #include "vxlan.h" -#include "northbound_cli.h" #include "zebra/zebra_router.h" #include "zebra/debug.h" @@ -3305,175 +3304,6 @@ void zebra_evpn_mh_if_init(struct zebra_if *zif) zif->es_info.df_pref = EVPN_MH_DF_PREF_DEFAULT; } -#include "zebra/zebra_evpn_mh_clippy.c" -/* CLI for setting an ES in bypass mode */ -DEFPY_HIDDEN(zebra_evpn_es_bypass, zebra_evpn_es_bypass_cmd, - "[no] evpn mh bypass", - NO_STR "EVPN\n" EVPN_MH_VTY_STR "set bypass mode\n") -{ - if (!no) - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/evpn-mh/bypass", - NB_OP_MODIFY, "true"); - else - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/evpn-mh/bypass", - NB_OP_DESTROY, NULL); - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_evpn_mh_bypass_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults) -{ - bool bypass = yang_dnode_get_bool(dnode, NULL); - - if (bypass) - vty_out(vty, " evpn mh bypass\n"); - else if (show_defaults) - vty_out(vty, " no evpn mh bypass\n"); -} - -/* CLI for configuring DF preference part for an ES */ -DEFPY_YANG (zebra_evpn_es_pref, - zebra_evpn_es_pref_cmd, - "[no$no] evpn mh es-df-pref ![(1-65535)$df_pref]", - NO_STR - "EVPN\n" - EVPN_MH_VTY_STR - "Preference value used for DF election\n" - "Preference\n") -{ - if (!no) - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/evpn-mh/df-preference", - NB_OP_MODIFY, df_pref_str); - else - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/evpn-mh/df-preference", - NB_OP_DESTROY, NULL); - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_evpn_mh_df_preference_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults) -{ - uint16_t df_pref = yang_dnode_get_uint16(dnode, NULL); - - vty_out(vty, " evpn mh es-df-pref %u\n", df_pref); -} - -/* CLI for setting up sysmac part of ESI on an access port */ -DEFPY_YANG (zebra_evpn_es_sys_mac, - zebra_evpn_es_sys_mac_cmd, - "[no$no] evpn mh es-sys-mac ![X:X:X:X:X:X$mac]", - NO_STR - "EVPN\n" - EVPN_MH_VTY_STR - "Ethernet segment system MAC\n" - MAC_STR -) -{ - if (!no) - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/evpn-mh/type-3/system-mac", - NB_OP_MODIFY, mac_str); - else - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/evpn-mh/type-3/system-mac", - NB_OP_DESTROY, NULL); - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_evpn_mh_type_3_system_mac_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults) -{ - char buf[ETHER_ADDR_STRLEN]; - struct ethaddr mac; - - yang_dnode_get_mac(&mac, dnode, NULL); - - vty_out(vty, " evpn mh es-sys-mac %s\n", - prefix_mac2str(&mac, buf, sizeof(buf))); -} - -/* CLI for setting up local-ID part of ESI on an access port */ -DEFPY_YANG (zebra_evpn_es_id, - zebra_evpn_es_id_cmd, - "[no$no] evpn mh es-id ![(1-16777215)$es_lid | NAME$esi_str]", - NO_STR - "EVPN\n" - EVPN_MH_VTY_STR - "Ethernet segment identifier\n" - "local discriminator\n" - "10-byte ID - 00:AA:BB:CC:DD:EE:FF:GG:HH:II\n" -) -{ - if (no) { - /* We don't know which one is configured, so detroy both types. */ - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/evpn-mh/type-0/esi", - NB_OP_DESTROY, NULL); - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/evpn-mh/type-3/local-discriminator", - NB_OP_DESTROY, NULL); - } else { - if (esi_str) - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/evpn-mh/type-0/esi", - NB_OP_MODIFY, esi_str); - else - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/evpn-mh/type-3/local-discriminator", - NB_OP_MODIFY, es_lid_str); - } - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_evpn_mh_type_0_esi_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults) -{ - const char *esi_str = yang_dnode_get_string(dnode, NULL); - - vty_out(vty, " evpn mh es-id %s\n", esi_str); -} - -void lib_interface_zebra_evpn_mh_type_3_local_discriminator_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults) -{ - uint32_t es_lid = yang_dnode_get_uint32(dnode, NULL); - - vty_out(vty, " evpn mh es-id %u\n", es_lid); -} - -/* CLI for tagging an interface as an uplink */ -DEFPY_YANG (zebra_evpn_mh_uplink, - zebra_evpn_mh_uplink_cmd, - "[no] evpn mh uplink", - NO_STR - "EVPN\n" - EVPN_MH_VTY_STR - "Uplink to the VxLAN core\n") -{ - if (!no) - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/evpn-mh/uplink", - NB_OP_MODIFY, "true"); - else - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/evpn-mh/uplink", - NB_OP_DESTROY, NULL); - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_evpn_mh_uplink_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults) -{ - bool uplink = yang_dnode_get_bool(dnode, NULL); - - if (uplink) - vty_out(vty, " evpn mh uplink\n"); - else if (show_defaults) - vty_out(vty, " no evpn mh uplink\n"); -} - void zebra_evpn_mh_json(json_object *json) { json_object *json_array; @@ -4031,15 +3861,6 @@ int zebra_evpn_mh_redirect_off(struct vty *vty, bool redirect_off) return 0; } -void zebra_evpn_interface_init(void) -{ - install_element(INTERFACE_NODE, &zebra_evpn_es_id_cmd); - install_element(INTERFACE_NODE, &zebra_evpn_es_sys_mac_cmd); - install_element(INTERFACE_NODE, &zebra_evpn_es_pref_cmd); - install_element(INTERFACE_NODE, &zebra_evpn_es_bypass_cmd); - install_element(INTERFACE_NODE, &zebra_evpn_mh_uplink_cmd); -} - void zebra_evpn_mh_init(void) { zrouter.mh_info = XCALLOC(MTYPE_ZMH_INFO, sizeof(*zrouter.mh_info)); diff --git a/zebra/zebra_evpn_mh.h b/zebra/zebra_evpn_mh.h index bc8ffd787793..60800489767c 100644 --- a/zebra/zebra_evpn_mh.h +++ b/zebra/zebra_evpn_mh.h @@ -19,8 +19,6 @@ #include "zebra_nhg.h" #include "zebra_nb.h" -#define EVPN_MH_VTY_STR "Multihoming\n" - /* Ethernet Segment entry - * - Local and remote ESs are maintained in a global RB tree, * zmh_info->es_rb_tree using ESI as key @@ -337,7 +335,6 @@ extern bool zebra_evpn_es_mac_ref_entry(struct zebra_mac *mac, struct zebra_evpn_es *es); extern bool zebra_evpn_es_mac_ref(struct zebra_mac *mac, const esi_t *esi); extern struct zebra_evpn_es *zebra_evpn_es_find(const esi_t *esi); -extern void zebra_evpn_interface_init(void); extern void zebra_evpn_acc_vl_show(struct vty *vty, bool uj); extern void zebra_evpn_acc_vl_show_detail(struct vty *vty, bool uj); extern void zebra_evpn_if_es_print(struct vty *vty, json_object *json, diff --git a/zebra/zebra_nb.c b/zebra/zebra_nb.c index b261325f19b9..fc7b4a71f617 100644 --- a/zebra/zebra_nb.c +++ b/zebra/zebra_nb.c @@ -99,7 +99,6 @@ const struct frr_yang_module_info frr_zebra_info = { .xpath = "/frr-zebra:zebra/ptm-enable", .cbs = { .modify = zebra_ptm_enable_modify, - .cli_show = zebra_ptm_enable_cli_write, } }, #endif @@ -317,7 +316,6 @@ const struct frr_yang_module_info frr_zebra_info = { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv4-addrs", .cbs = { .create = lib_interface_zebra_ipv4_addrs_create, - .cli_show = lib_interface_zebra_ipv4_addrs_cli_write, .destroy = lib_interface_zebra_ipv4_addrs_destroy, } }, @@ -332,7 +330,6 @@ const struct frr_yang_module_info frr_zebra_info = { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv4-p2p-addrs", .cbs = { .create = lib_interface_zebra_ipv4_p2p_addrs_create, - .cli_show = lib_interface_zebra_ipv4_p2p_addrs_cli_write, .destroy = lib_interface_zebra_ipv4_p2p_addrs_destroy, } }, @@ -347,7 +344,6 @@ const struct frr_yang_module_info frr_zebra_info = { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-addrs", .cbs = { .create = lib_interface_zebra_ipv6_addrs_create, - .cli_show = lib_interface_zebra_ipv6_addrs_cli_write, .destroy = lib_interface_zebra_ipv6_addrs_destroy, } }, @@ -355,7 +351,6 @@ const struct frr_yang_module_info frr_zebra_info = { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/multicast", .cbs = { .modify = lib_interface_zebra_multicast_modify, - .cli_show = lib_interface_zebra_multicast_cli_write, .destroy = lib_interface_zebra_multicast_destroy, } }, @@ -363,14 +358,12 @@ const struct frr_yang_module_info frr_zebra_info = { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/link-detect", .cbs = { .modify = lib_interface_zebra_link_detect_modify, - .cli_show = lib_interface_zebra_link_detect_cli_write, } }, { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/enabled", .cbs = { .modify = lib_interface_zebra_enabled_modify, - .cli_show = lib_interface_zebra_enabled_cli_write, .destroy = lib_interface_zebra_enabled_destroy, } }, @@ -378,7 +371,6 @@ const struct frr_yang_module_info frr_zebra_info = { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/bandwidth", .cbs = { .modify = lib_interface_zebra_bandwidth_modify, - .cli_show = lib_interface_zebra_bandwidth_cli_write, .destroy = lib_interface_zebra_bandwidth_destroy, } }, @@ -386,7 +378,6 @@ const struct frr_yang_module_info frr_zebra_info = { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/mpls", .cbs = { .modify = lib_interface_zebra_mpls_modify, - .cli_show = lib_interface_zebra_mpls_cli_write, .destroy = lib_interface_zebra_mpls_destroy, } }, @@ -395,15 +386,12 @@ const struct frr_yang_module_info frr_zebra_info = { .cbs = { .create = lib_interface_zebra_link_params_create, .destroy = lib_interface_zebra_link_params_destroy, - .cli_show = lib_interface_zebra_link_params_cli_write, - .cli_show_end = lib_interface_zebra_link_params_cli_write_end, } }, { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/link-params/metric", .cbs = { .modify = lib_interface_zebra_link_params_metric_modify, - .cli_show = lib_interface_zebra_link_params_metric_cli_write, .destroy = lib_interface_zebra_link_params_metric_destroy, } }, @@ -411,7 +399,6 @@ const struct frr_yang_module_info frr_zebra_info = { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/link-params/max-bandwidth", .cbs = { .modify = lib_interface_zebra_link_params_max_bandwidth_modify, - .cli_show = lib_interface_zebra_link_params_max_bandwidth_cli_write, .destroy = lib_interface_zebra_link_params_max_bandwidth_destroy, } }, @@ -419,7 +406,6 @@ const struct frr_yang_module_info frr_zebra_info = { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/link-params/max-reservable-bandwidth", .cbs = { .modify = lib_interface_zebra_link_params_max_reservable_bandwidth_modify, - .cli_show = lib_interface_zebra_link_params_max_reservable_bandwidth_cli_write, .destroy = lib_interface_zebra_link_params_max_reservable_bandwidth_destroy, } }, @@ -427,7 +413,6 @@ const struct frr_yang_module_info frr_zebra_info = { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/link-params/unreserved-bandwidths/unreserved-bandwidth", .cbs = { .create = lib_interface_zebra_link_params_unreserved_bandwidths_unreserved_bandwidth_create, - .cli_show = lib_interface_zebra_link_params_unreserved_bandwidths_unreserved_bandwidth_cli_write, .destroy = lib_interface_zebra_link_params_unreserved_bandwidths_unreserved_bandwidth_destroy, } }, @@ -441,7 +426,6 @@ const struct frr_yang_module_info frr_zebra_info = { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/link-params/residual-bandwidth", .cbs = { .modify = lib_interface_zebra_link_params_residual_bandwidth_modify, - .cli_show = lib_interface_zebra_link_params_residual_bandwidth_cli_write, .destroy = lib_interface_zebra_link_params_residual_bandwidth_destroy, } }, @@ -449,7 +433,6 @@ const struct frr_yang_module_info frr_zebra_info = { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/link-params/available-bandwidth", .cbs = { .modify = lib_interface_zebra_link_params_available_bandwidth_modify, - .cli_show = lib_interface_zebra_link_params_available_bandwidth_cli_write, .destroy = lib_interface_zebra_link_params_available_bandwidth_destroy, } }, @@ -457,7 +440,6 @@ const struct frr_yang_module_info frr_zebra_info = { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/link-params/utilized-bandwidth", .cbs = { .modify = lib_interface_zebra_link_params_utilized_bandwidth_modify, - .cli_show = lib_interface_zebra_link_params_utilized_bandwidth_cli_write, .destroy = lib_interface_zebra_link_params_utilized_bandwidth_destroy, } }, @@ -466,13 +448,11 @@ const struct frr_yang_module_info frr_zebra_info = { .cbs = { .modify = lib_interface_zebra_legacy_admin_group_modify, .destroy = lib_interface_zebra_legacy_admin_group_destroy, - .cli_show = cli_show_legacy_admin_group, }, }, { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/link-params/affinities", .cbs = { - .cli_show = cli_show_affinity, }, }, { @@ -486,14 +466,12 @@ const struct frr_yang_module_info frr_zebra_info = { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/link-params/affinity-mode", .cbs = { .modify = lib_interface_zebra_affinity_mode_modify, - .cli_show = cli_show_affinity_mode, }, }, { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/link-params/neighbor", .cbs = { .create = lib_interface_zebra_link_params_neighbor_create, - .cli_show = lib_interface_zebra_link_params_neighbor_cli_write, .destroy = lib_interface_zebra_link_params_neighbor_destroy, } }, @@ -513,7 +491,6 @@ const struct frr_yang_module_info frr_zebra_info = { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/link-params/delay", .cbs = { .modify = lib_interface_zebra_link_params_delay_modify, - .cli_show = lib_interface_zebra_link_params_delay_cli_write, .destroy = lib_interface_zebra_link_params_delay_destroy, } }, @@ -540,7 +517,6 @@ const struct frr_yang_module_info frr_zebra_info = { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/link-params/delay-variation", .cbs = { .modify = lib_interface_zebra_link_params_delay_variation_modify, - .cli_show = lib_interface_zebra_link_params_delay_variation_cli_write, .destroy = lib_interface_zebra_link_params_delay_variation_destroy, } }, @@ -548,7 +524,6 @@ const struct frr_yang_module_info frr_zebra_info = { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/link-params/packet-loss", .cbs = { .modify = lib_interface_zebra_link_params_packet_loss_modify, - .cli_show = lib_interface_zebra_link_params_packet_loss_cli_write, .destroy = lib_interface_zebra_link_params_packet_loss_destroy, } }, @@ -556,7 +531,6 @@ const struct frr_yang_module_info frr_zebra_info = { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/evpn-mh/type-0/esi", .cbs = { .modify = lib_interface_zebra_evpn_mh_type_0_esi_modify, - .cli_show = lib_interface_zebra_evpn_mh_type_0_esi_cli_write, .destroy = lib_interface_zebra_evpn_mh_type_0_esi_destroy, } }, @@ -564,7 +538,6 @@ const struct frr_yang_module_info frr_zebra_info = { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/evpn-mh/type-3/system-mac", .cbs = { .modify = lib_interface_zebra_evpn_mh_type_3_system_mac_modify, - .cli_show = lib_interface_zebra_evpn_mh_type_3_system_mac_cli_write, .destroy = lib_interface_zebra_evpn_mh_type_3_system_mac_destroy, } }, @@ -572,7 +545,6 @@ const struct frr_yang_module_info frr_zebra_info = { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/evpn-mh/type-3/local-discriminator", .cbs = { .modify = lib_interface_zebra_evpn_mh_type_3_local_discriminator_modify, - .cli_show = lib_interface_zebra_evpn_mh_type_3_local_discriminator_cli_write, .destroy = lib_interface_zebra_evpn_mh_type_3_local_discriminator_destroy, } }, @@ -580,21 +552,18 @@ const struct frr_yang_module_info frr_zebra_info = { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/evpn-mh/df-preference", .cbs = { .modify = lib_interface_zebra_evpn_mh_df_preference_modify, - .cli_show = lib_interface_zebra_evpn_mh_df_preference_cli_write, } }, { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/evpn-mh/bypass", .cbs = { .modify = lib_interface_zebra_evpn_mh_bypass_modify, - .cli_show = lib_interface_zebra_evpn_mh_bypass_cli_write, } }, { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/evpn-mh/uplink", .cbs = { .modify = lib_interface_zebra_evpn_mh_uplink_modify, - .cli_show = lib_interface_zebra_evpn_mh_uplink_cli_write, } }, #if defined(HAVE_RTADV) @@ -602,63 +571,54 @@ const struct frr_yang_module_info frr_zebra_info = { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/send-advertisements", .cbs = { .modify = lib_interface_zebra_ipv6_router_advertisements_send_advertisements_modify, - .cli_show = lib_interface_zebra_ipv6_router_advertisements_send_advertisements_cli_write, } }, { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/max-rtr-adv-interval", .cbs = { .modify = lib_interface_zebra_ipv6_router_advertisements_max_rtr_adv_interval_modify, - .cli_show = lib_interface_zebra_ipv6_router_advertisements_max_rtr_adv_interval_cli_write, } }, { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/managed-flag", .cbs = { .modify = lib_interface_zebra_ipv6_router_advertisements_managed_flag_modify, - .cli_show = lib_interface_zebra_ipv6_router_advertisements_managed_flag_cli_write, } }, { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/other-config-flag", .cbs = { .modify = lib_interface_zebra_ipv6_router_advertisements_other_config_flag_modify, - .cli_show = lib_interface_zebra_ipv6_router_advertisements_other_config_flag_cli_write, } }, { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/home-agent-flag", .cbs = { .modify = lib_interface_zebra_ipv6_router_advertisements_home_agent_flag_modify, - .cli_show = lib_interface_zebra_ipv6_router_advertisements_home_agent_flag_cli_write, } }, { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/link-mtu", .cbs = { .modify = lib_interface_zebra_ipv6_router_advertisements_link_mtu_modify, - .cli_show = lib_interface_zebra_ipv6_router_advertisements_link_mtu_cli_write, } }, { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/reachable-time", .cbs = { .modify = lib_interface_zebra_ipv6_router_advertisements_reachable_time_modify, - .cli_show = lib_interface_zebra_ipv6_router_advertisements_reachable_time_cli_write, } }, { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/retrans-timer", .cbs = { .modify = lib_interface_zebra_ipv6_router_advertisements_retrans_timer_modify, - .cli_show = lib_interface_zebra_ipv6_router_advertisements_retrans_timer_cli_write, } }, { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/cur-hop-limit", .cbs = { .modify = lib_interface_zebra_ipv6_router_advertisements_cur_hop_limit_modify, - .cli_show = lib_interface_zebra_ipv6_router_advertisements_cur_hop_limit_cli_write, .destroy = lib_interface_zebra_ipv6_router_advertisements_cur_hop_limit_destroy, } }, @@ -666,7 +626,6 @@ const struct frr_yang_module_info frr_zebra_info = { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/default-lifetime", .cbs = { .modify = lib_interface_zebra_ipv6_router_advertisements_default_lifetime_modify, - .cli_show = lib_interface_zebra_ipv6_router_advertisements_default_lifetime_cli_write, .destroy = lib_interface_zebra_ipv6_router_advertisements_default_lifetime_destroy, } }, @@ -674,21 +633,18 @@ const struct frr_yang_module_info frr_zebra_info = { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/fast-retransmit", .cbs = { .modify = lib_interface_zebra_ipv6_router_advertisements_fast_retransmit_modify, - .cli_show = lib_interface_zebra_ipv6_router_advertisements_fast_retransmit_cli_write, } }, { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/advertisement-interval-option", .cbs = { .modify = lib_interface_zebra_ipv6_router_advertisements_advertisement_interval_option_modify, - .cli_show = lib_interface_zebra_ipv6_router_advertisements_advertisement_interval_option_cli_write, } }, { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/home-agent-preference", .cbs = { .modify = lib_interface_zebra_ipv6_router_advertisements_home_agent_preference_modify, - .cli_show = lib_interface_zebra_ipv6_router_advertisements_home_agent_preference_cli_write, .destroy = lib_interface_zebra_ipv6_router_advertisements_home_agent_preference_destroy, } }, @@ -696,7 +652,6 @@ const struct frr_yang_module_info frr_zebra_info = { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/home-agent-lifetime", .cbs = { .modify = lib_interface_zebra_ipv6_router_advertisements_home_agent_lifetime_modify, - .cli_show = lib_interface_zebra_ipv6_router_advertisements_home_agent_lifetime_cli_write, .destroy = lib_interface_zebra_ipv6_router_advertisements_home_agent_lifetime_destroy, } }, @@ -704,14 +659,12 @@ const struct frr_yang_module_info frr_zebra_info = { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/default-router-preference", .cbs = { .modify = lib_interface_zebra_ipv6_router_advertisements_default_router_preference_modify, - .cli_show = lib_interface_zebra_ipv6_router_advertisements_default_router_preference_cli_write, } }, { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/prefix-list/prefix", .cbs = { .create = lib_interface_zebra_ipv6_router_advertisements_prefix_list_prefix_create, - .cli_show = lib_interface_zebra_ipv6_router_advertisements_prefix_list_prefix_cli_write, .destroy = lib_interface_zebra_ipv6_router_advertisements_prefix_list_prefix_destroy, } }, @@ -719,7 +672,6 @@ const struct frr_yang_module_info frr_zebra_info = { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/dnssl/dnssl-domain", .cbs = { .create = lib_interface_zebra_ipv6_router_advertisements_dnssl_dnssl_domain_create, - .cli_show = lib_interface_zebra_ipv6_router_advertisements_dnssl_dnssl_domain_cli_write, .destroy = lib_interface_zebra_ipv6_router_advertisements_dnssl_dnssl_domain_destroy, } }, @@ -764,7 +716,6 @@ const struct frr_yang_module_info frr_zebra_info = { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ipv6-router-advertisements/rdnss/rdnss-address", .cbs = { .create = lib_interface_zebra_ipv6_router_advertisements_rdnss_rdnss_address_create, - .cli_show = lib_interface_zebra_ipv6_router_advertisements_rdnss_rdnss_address_cli_write, .destroy = lib_interface_zebra_ipv6_router_advertisements_rdnss_rdnss_address_destroy, } }, @@ -781,7 +732,6 @@ const struct frr_yang_module_info frr_zebra_info = { .xpath = "/frr-interface:lib/interface/frr-zebra:zebra/ptm-enable", .cbs = { .modify = lib_interface_zebra_ptm_enable_modify, - .cli_show = lib_interface_zebra_ptm_enable_cli_write, } }, #endif diff --git a/zebra/zebra_ptm.c b/zebra/zebra_ptm.c index 78284acc7862..1fa20b81d147 100644 --- a/zebra/zebra_ptm.c +++ b/zebra/zebra_ptm.c @@ -356,39 +356,6 @@ void zebra_if_ptm_disable(struct interface *ifp) if_data->ptm_enable = ZEBRA_IF_PTM_ENABLE_OFF; } -DEFUN_YANG (zebra_ptm_enable_if, - zebra_ptm_enable_if_cmd, - "ptm-enable", - "Enable neighbor check with specified topology\n") -{ - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/ptm-enable", NB_OP_MODIFY, - "true"); - return nb_cli_apply_changes(vty, NULL); -} - -DEFUN_YANG (no_zebra_ptm_enable_if, - no_zebra_ptm_enable_if_cmd, - "no ptm-enable", - NO_STR - "Enable neighbor check with specified topology\n") -{ - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/ptm-enable", NB_OP_MODIFY, - "false"); - return nb_cli_apply_changes(vty, NULL); -} - -void lib_interface_zebra_ptm_enable_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults) -{ - bool enable = yang_dnode_get_bool(dnode, NULL); - - if (!enable) - vty_out(vty, " no ptm-enable\n"); - else if (show_defaults) - vty_out(vty, " ptm-enable\n"); -} - void zebra_ptm_write(struct vty *vty) { struct lyd_node *dnode; @@ -443,8 +410,6 @@ static void zebra_ptm_install_commands(void) { install_element(CONFIG_NODE, &zebra_ptm_enable_cmd); install_element(CONFIG_NODE, &no_zebra_ptm_enable_cmd); - install_element(INTERFACE_NODE, &zebra_ptm_enable_if_cmd); - install_element(INTERFACE_NODE, &no_zebra_ptm_enable_if_cmd); } /* BFD session goes down, send message to the protocols. */