From 3c3f791a65465b6d30b8863f9beb3af377fd5d58 Mon Sep 17 00:00:00 2001 From: Igor Ryzhov Date: Wed, 24 Jan 2024 23:04:23 +0200 Subject: [PATCH] zebra: convert to mgmtd Signed-off-by: Igor Ryzhov --- lib/command.h | 8 + lib/defun_lex.l | 1 + lib/vty.c | 14 +- mgmtd/mgmt_be_adapter.c | 24 +- mgmtd/mgmt_main.c | 24 +- mgmtd/mgmt_vty.c | 2 + mgmtd/subdir.am | 3 + .../result-intf-eth0-only-config.json | 10 +- .../result-intf-eth0-with-config.json | 6 + vtysh/vtysh.c | 12 +- vtysh/vtysh.h | 8 +- zebra/interface.c | 974 ------ zebra/main.c | 2 +- zebra/router-id.c | 197 -- zebra/rtadv.c | 694 ---- zebra/subdir.am | 3 +- zebra/zebra_cli.c | 2933 +++++++++++++++++ zebra/zebra_cli.h | 10 + zebra/zebra_evpn_mh.c | 179 - zebra/zebra_evpn_mh.h | 3 - zebra/zebra_nb.c | 59 - zebra/zebra_nb.h | 168 +- zebra/zebra_ptm.c | 92 - zebra/zebra_ptm.h | 1 - zebra/zebra_routemap.c | 588 +--- zebra/zebra_vrf.c | 57 - zebra/zebra_vrf.h | 3 - zebra/zebra_vty.c | 220 -- 28 files changed, 3010 insertions(+), 3285 deletions(-) create mode 100644 zebra/zebra_cli.c create mode 100644 zebra/zebra_cli.h diff --git a/lib/command.h b/lib/command.h index 4886b4bc473c..04c66adb2688 100644 --- a/lib/command.h +++ b/lib/command.h @@ -291,6 +291,10 @@ struct cmd_node { #define DEFPY_YANG(funcname, cmdname, cmdstr, helpstr) \ DEFPY_ATTR(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_YANG) +#define DEFPY_YANG_HIDDEN(funcname, cmdname, cmdstr, helpstr) \ + DEFPY_ATTR(funcname, cmdname, cmdstr, helpstr, \ + CMD_ATTR_YANG | CMD_ATTR_HIDDEN) + #define DEFPY_YANG_NOSH(funcname, cmdname, cmdstr, helpstr) \ DEFPY_ATTR(funcname, cmdname, cmdstr, helpstr, \ CMD_ATTR_YANG | CMD_ATTR_NOSH) @@ -315,6 +319,10 @@ struct cmd_node { #define DEFUN_NOSH(funcname, cmdname, cmdstr, helpstr) \ DEFUN_ATTR(funcname, cmdname, cmdstr, helpstr, CMD_ATTR_NOSH) +#define DEFUN_YANG_HIDDEN(funcname, cmdname, cmdstr, helpstr) \ + DEFUN_ATTR(funcname, cmdname, cmdstr, helpstr, \ + CMD_ATTR_YANG | CMD_ATTR_HIDDEN) + #define DEFUN_YANG_NOSH(funcname, cmdname, cmdstr, helpstr) \ DEFUN_ATTR(funcname, cmdname, cmdstr, helpstr, \ CMD_ATTR_YANG | CMD_ATTR_NOSH) diff --git a/lib/defun_lex.l b/lib/defun_lex.l index 124f864166f0..3104e48063b5 100644 --- a/lib/defun_lex.l +++ b/lib/defun_lex.l @@ -140,6 +140,7 @@ SPECIAL [(),] "DEFPY_ATTR" value = strdup(yytext); return DEFUNNY; "DEFPY_HIDDEN" value = strdup(yytext); return DEFUNNY; "DEFPY_YANG" value = strdup(yytext); return DEFUNNY; +"DEFPY_YANG_HIDDEN" value = strdup(yytext); return DEFUNNY; "DEFPY_YANG_NOSH" value = strdup(yytext); return DEFUNNY; "ALIAS" value = strdup(yytext); return DEFUNNY; "ALIAS_HIDDEN" value = strdup(yytext); return DEFUNNY; diff --git a/lib/vty.c b/lib/vty.c index a8d90d901be5..e8b3bb565a82 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_RIPD "ripd", #endif @@ -2262,19 +2263,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 f92d6d8d58bd..b7eff0400007 100644 --- a/mgmtd/mgmt_be_adapter.c +++ b/mgmtd/mgmt_be_adapter.c @@ -65,6 +65,22 @@ struct mgmt_be_xpath_map { * above map as well. */ +static const char *const zebra_config_xpaths[] = { + "/frr-affinity-map:lib", + "/frr-filter:lib", + "/frr-route-map:lib", + "/frr-interface:lib", + "/frr-vrf:lib", + NULL, +}; + +static const char *const zebra_oper_xpaths[] = { + "/frr-interface:lib/interface", + "/frr-vrf:lib/vrf/frr-zebra:zebra", + "/frr-zebra:zebra", + NULL, +}; + #if HAVE_RIPD static const char *const ripd_config_xpaths[] = { "/frr-filter:lib", @@ -105,6 +121,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_RIPD [MGMTD_BE_CLIENT_ID_RIPD] = ripd_config_xpaths, #endif @@ -116,13 +133,6 @@ static const char *const *be_client_config_xpaths[MGMTD_BE_CLIENT_ID_MAX] = { #endif }; -static const char *const zebra_oper_xpaths[] = { - "/frr-interface:lib/interface", - "/frr-vrf:lib/vrf/frr-zebra:zebra", - "/frr-zebra:zebra", - NULL, -}; - static const char *const *be_client_oper_xpaths[MGMTD_BE_CLIENT_ID_MAX] = { #ifdef HAVE_RIPD [MGMTD_BE_CLIENT_ID_RIPD] = ripd_oper_xpaths, diff --git a/mgmtd/mgmt_main.c b/mgmtd/mgmt_main.c index 918ed8ba63e6..5ea92f4a813b 100644 --- a/mgmtd/mgmt_main.c +++ b/mgmtd/mgmt_main.c @@ -18,6 +18,7 @@ #include "ripngd/ripng_nb.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[] = { @@ -143,32 +144,11 @@ static struct frr_signal_t mgmt_signals[] = { extern const struct frr_yang_module_info frr_staticd_cli_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, @@ -191,7 +171,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_RIPD diff --git a/mgmtd/mgmt_vty.c b/mgmtd/mgmt_vty.c index d5cfbbf771c4..7135bc55476a 100644 --- a/mgmtd/mgmt_vty.c +++ b/mgmtd/mgmt_vty.c @@ -26,6 +26,7 @@ #include "ripd/rip_nb.h" #include "ripngd/ripng_nb.h" #include "staticd/static_vty.h" +#include "zebra/zebra_cli.h" extern struct frr_daemon_info *mgmt_daemon_info; @@ -579,6 +580,7 @@ void mgmt_vty_init(void) * backend components that are moved to new MGMTD infra * here one by one. */ + zebra_cli_init(); #if HAVE_RIPD rip_cli_init(); #endif diff --git a/mgmtd/subdir.am b/mgmtd/subdir.am index e3008bab8c85..a3955925edd5 100644 --- a/mgmtd/subdir.am +++ b/mgmtd/subdir.am @@ -16,6 +16,7 @@ clippy_scan += \ lib_LTLIBRARIES += mgmtd/libmgmt_be_nb.la mgmtd_libmgmt_be_nb_la_SOURCES = \ + zebra/zebra_cli.c \ # end nodist_mgmtd_libmgmt_be_nb_la_SOURCES = \ lib/affinitymap_cli.c \ @@ -44,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 @@ -52,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 299165e2aa8e..940b63b0e19a 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 4fe30777d834..7758ceaea502 100644 --- a/vtysh/vtysh.h +++ b/vtysh/vtysh.h @@ -53,23 +53,23 @@ extern struct event_loop *master; 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_VRRPD | VTYSH_ZEBRA | VTYSH_MGMTD + VTYSH_VRRPD | VTYSH_MGMTD #define VTYSH_ACL_SHOW \ 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_CONFIG \ - VTYSH_ZEBRA | VTYSH_OSPFD | VTYSH_OSPF6D | VTYSH_BGPD | VTYSH_ISISD | \ + VTYSH_OSPFD | VTYSH_OSPF6D | VTYSH_BGPD | VTYSH_ISISD | \ VTYSH_PIMD | VTYSH_EIGRPD | VTYSH_FABRICD | VTYSH_MGMTD #define VTYSH_RMAP_SHOW \ 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_OSPFD | VTYSH_OSPF6D | \ + VTYSH_OSPFD | VTYSH_OSPF6D | \ VTYSH_ISISD | VTYSH_PIMD | VTYSH_PIM6D | VTYSH_NHRPD | \ VTYSH_EIGRPD | VTYSH_BABELD | VTYSH_PBRD | VTYSH_FABRICD | \ VTYSH_VRRPD | VTYSH_MGMTD 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/main.c b/zebra/main.c index f3e4bf50d594..ac206f975b3a 100644 --- a/zebra/main.c +++ b/zebra/main.c @@ -438,7 +438,7 @@ int main(int argc, char **argv) zebra_vty_init(); mgmt_be_client = mgmt_be_client_create("zebra", NULL, 0, zrouter.master); - access_list_init(); + access_list_init_new(true); prefix_list_init(); rtadv_init(); diff --git a/zebra/router-id.c b/zebra/router-id.c index 7af859685917..2f251a79e584 100644 --- a/zebra/router-id.c +++ b/zebra/router-id.c @@ -23,16 +23,12 @@ #include "table.h" #include "rib.h" #include "vrf.h" -#include "northbound_cli.h" #include "zebra/zebra_router.h" #include "zebra/zapi_msg.h" #include "zebra/zebra_vrf.h" #include "zebra/router-id.h" #include "zebra/redistribute.h" -#include "zebra/zebra_nb.h" - -#include "router-id_clippy.c" static struct connected *router_id_find_node(struct list *l, struct connected *ifc) @@ -245,181 +241,6 @@ void router_id_del_address(struct connected *ifc) zsend_router_id_update(client, afi, &after, zvrf_id(zvrf)); } -DEFPY_YANG (ip_router_id, - ip_router_id_cmd, - "ip router-id A.B.C.D$id vrf NAME", - IP_STR - "Manually set the router-id\n" - "IP address to use for router-id\n" - VRF_CMD_HELP_STR) -{ - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/router-id", NB_OP_MODIFY, - id_str); - return nb_cli_apply_changes(vty, "/frr-vrf:lib/vrf[name='%s']", vrf); -} - -ALIAS_YANG (ip_router_id, - router_id_cmd, - "router-id A.B.C.D$id vrf NAME", - "Manually set the router-id\n" - "IP address to use for router-id\n" - VRF_CMD_HELP_STR); - -DEFPY_YANG (ipv6_router_id, - ipv6_router_id_cmd, - "ipv6 router-id X:X::X:X$id vrf NAME", - IPV6_STR - "Manually set the router-id\n" - "IPv6 address to use for router-id\n" - VRF_CMD_HELP_STR) -{ - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/ipv6-router-id", - NB_OP_MODIFY, id_str); - return nb_cli_apply_changes(vty, "/frr-vrf:lib/vrf[name='%s']", vrf); -} - - -DEFPY_YANG (ip_router_id_in_vrf, - ip_router_id_in_vrf_cmd, - "ip router-id A.B.C.D$id", - IP_STR - "Manually set the router-id\n" - "IP address to use for router-id\n") -{ - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/router-id", NB_OP_MODIFY, - id_str); - - if (vty->node == CONFIG_NODE) - return nb_cli_apply_changes(vty, "/frr-vrf:lib/vrf[name='%s']", - VRF_DEFAULT_NAME); - - return nb_cli_apply_changes(vty, NULL); -} - -ALIAS_YANG (ip_router_id_in_vrf, - router_id_in_vrf_cmd, - "router-id A.B.C.D$id", - "Manually set the router-id\n" - "IP address to use for router-id\n"); - -void lib_vrf_zebra_router_id_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults) -{ - const char *id = yang_dnode_get_string(dnode, NULL); - - zebra_vrf_indent_cli_write(vty, dnode); - - vty_out(vty, "ip router-id %s\n", id); -} - -DEFPY_YANG (ipv6_router_id_in_vrf, - ipv6_router_id_in_vrf_cmd, - "ipv6 router-id X:X::X:X$id", - IP6_STR - "Manually set the IPv6 router-id\n" - "IPV6 address to use for router-id\n") -{ - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/ipv6-router-id", - NB_OP_MODIFY, id_str); - - if (vty->node == CONFIG_NODE) - return nb_cli_apply_changes(vty, "/frr-vrf:lib/vrf[name='%s']", - VRF_DEFAULT_NAME); - - return nb_cli_apply_changes(vty, NULL); -} - -void lib_vrf_zebra_ipv6_router_id_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults) -{ - const char *id = yang_dnode_get_string(dnode, NULL); - - zebra_vrf_indent_cli_write(vty, dnode); - - vty_out(vty, "ipv6 router-id %s\n", id); -} - -DEFPY_YANG (no_ip_router_id, - no_ip_router_id_cmd, - "no ip router-id A.B.C.D vrf NAME", - NO_STR - IP_STR - "Remove the manually configured router-id\n" - "IP address to use for router-id\n" - VRF_CMD_HELP_STR) -{ - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/router-id", NB_OP_DESTROY, - NULL); - return nb_cli_apply_changes(vty, "/frr-vrf:lib/vrf[name='%s']", vrf); -} - -ALIAS_YANG (no_ip_router_id, - no_router_id_cmd, - "no router-id A.B.C.D vrf NAME", - NO_STR - "Remove the manually configured router-id\n" - "IP address to use for router-id\n" - VRF_CMD_HELP_STR); - -DEFPY_YANG (no_ipv6_router_id, - no_ipv6_router_id_cmd, - "no ipv6 router-id X:X::X:X vrf NAME", - NO_STR - IPV6_STR - "Remove the manually configured IPv6 router-id\n" - "IPv6 address to use for router-id\n" - VRF_CMD_HELP_STR) -{ - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/ipv6-router-id", - NB_OP_DESTROY, NULL); - return nb_cli_apply_changes(vty, "/frr-vrf:lib/vrf[name='%s']", vrf); -} - -DEFPY_YANG (no_ip_router_id_in_vrf, - no_ip_router_id_in_vrf_cmd, - "no ip router-id [A.B.C.D]", - NO_STR - IP_STR - "Remove the manually configured router-id\n" - "IP address to use for router-id\n") -{ - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/router-id", NB_OP_DESTROY, - NULL); - - if (vty->node == CONFIG_NODE) - return nb_cli_apply_changes(vty, "/frr-vrf:lib/vrf[name='%s']", - VRF_DEFAULT_NAME); - - return nb_cli_apply_changes(vty, NULL); -} - -ALIAS_YANG (no_ip_router_id_in_vrf, - no_router_id_in_vrf_cmd, - "no router-id [A.B.C.D]", - NO_STR - "Remove the manually configured router-id\n" - "IP address to use for router-id\n"); - -DEFPY_YANG (no_ipv6_router_id_in_vrf, - no_ipv6_router_id_in_vrf_cmd, - "no ipv6 router-id [X:X::X:X]", - NO_STR - IP6_STR - "Remove the manually configured IPv6 router-id\n" - "IPv6 address to use for router-id\n") -{ - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/ipv6-router-id", - NB_OP_DESTROY, NULL); - - if (vty->node == CONFIG_NODE) - return nb_cli_apply_changes(vty, "/frr-vrf:lib/vrf[name='%s']", - VRF_DEFAULT_NAME); - - return nb_cli_apply_changes(vty, NULL); -} - DEFUN (show_ip_router_id, show_ip_router_id_cmd, "show [ip|ipv6] router-id [vrf NAME]", @@ -486,24 +307,6 @@ static int router_id_v6_cmp(void *a, void *b) void router_id_cmd_init(void) { - install_element(CONFIG_NODE, &ip_router_id_cmd); - install_element(CONFIG_NODE, &router_id_cmd); - install_element(CONFIG_NODE, &ipv6_router_id_cmd); - install_element(CONFIG_NODE, &no_ip_router_id_cmd); - install_element(CONFIG_NODE, &no_router_id_cmd); - install_element(CONFIG_NODE, &ip_router_id_in_vrf_cmd); - install_element(VRF_NODE, &ip_router_id_in_vrf_cmd); - install_element(CONFIG_NODE, &router_id_in_vrf_cmd); - install_element(VRF_NODE, &router_id_in_vrf_cmd); - install_element(CONFIG_NODE, &ipv6_router_id_in_vrf_cmd); - install_element(VRF_NODE, &ipv6_router_id_in_vrf_cmd); - install_element(CONFIG_NODE, &no_ipv6_router_id_cmd); - install_element(CONFIG_NODE, &no_ip_router_id_in_vrf_cmd); - install_element(VRF_NODE, &no_ip_router_id_in_vrf_cmd); - install_element(CONFIG_NODE, &no_router_id_in_vrf_cmd); - install_element(VRF_NODE, &no_router_id_in_vrf_cmd); - install_element(CONFIG_NODE, &no_ipv6_router_id_in_vrf_cmd); - install_element(VRF_NODE, &no_ipv6_router_id_in_vrf_cmd); install_element(VIEW_NODE, &show_ip_router_id_cmd); } 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 ad1bcee69544..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,7 +125,7 @@ clippy_scan += \ zebra/zebra_vrf.c \ zebra/dpdk/zebra_dplane_dpdk_vty.c \ zebra/label_manager.c \ - zebra/router-id.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..1e4461e3e76b --- /dev/null +++ b/zebra/zebra_cli.c @@ -0,0 +1,2933 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "command.h" +#include "defaults.h" +#include "northbound_cli.h" +#include "vrf.h" + +#include "zebra_cli.h" +#include "zebra/zebra_cli_clippy.c" + +#define EVPN_MH_VTY_STR "Multihoming\n" + +FRR_CFG_DEFAULT_BOOL(ZEBRA_IP_NHT_RESOLVE_VIA_DEFAULT, + { .val_bool = true, .match_profile = "traditional", }, + { .val_bool = false }, +); + +#if HAVE_BFDD == 0 +DEFPY_YANG (zebra_ptm_enable, + zebra_ptm_enable_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, + no ? "false" : "true"); + return nb_cli_apply_changes(vty, NULL); +} + +static void 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, "ptm-enable\n"); + else if (show_defaults) + vty_out(vty, "no ptm-enable\n"); +} +#endif + +DEFPY_YANG (zebra_route_map_timer, + zebra_route_map_timer_cmd, + "[no] zebra route-map delay-timer ![(0-600)$delay]", + NO_STR + ZEBRA_STR + "Set route-map parameters\n" + "Time to wait before route-map updates are processed\n" + "0 means route-map changes are run immediately instead of delaying\n") +{ + if (!no) + nb_cli_enqueue_change(vty, "/frr-zebra:zebra/route-map-delay", + NB_OP_MODIFY, delay_str); + else + nb_cli_enqueue_change(vty, "/frr-zebra:zebra/route-map-delay", + NB_OP_DESTROY, NULL); + return nb_cli_apply_changes(vty, NULL); +} + +static void zebra_route_map_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, "zebra route-map delay-timer %u\n", delay); +} + +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 */ + +DEFPY_YANG_HIDDEN (multicast, + multicast_cmd, + "[no] multicast", + NO_STR + "Set multicast flag to interface\n") +{ + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/multicast", + NB_OP_CREATE, no ? "false" : "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); +} + +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_YANG_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_YANG_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_YANG_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 */ + +/* + * VRF commands + */ + +static void zebra_vrf_indent_cli_write(struct vty *vty, + const struct lyd_node *dnode) +{ + const struct lyd_node *vrf = yang_dnode_get_parent(dnode, "vrf"); + + if (vrf && strcmp(yang_dnode_get_string(vrf, "name"), VRF_DEFAULT_NAME)) + vty_out(vty, " "); +} + +DEFPY_YANG (ip_router_id, + ip_router_id_cmd, + "[no] ip router-id A.B.C.D$id vrf NAME", + NO_STR + IP_STR + "Manually set the router-id\n" + "IP address to use for router-id\n" + VRF_CMD_HELP_STR) +{ + if (!no) + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/router-id", NB_OP_MODIFY, + id_str); + else + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/router-id", NB_OP_DESTROY, + NULL); + return nb_cli_apply_changes(vty, "/frr-vrf:lib/vrf[name='%s']", vrf); +} + +ALIAS_YANG (ip_router_id, + router_id_cmd, + "[no] router-id A.B.C.D$id vrf NAME", + NO_STR + "Manually set the router-id\n" + "IP address to use for router-id\n" + VRF_CMD_HELP_STR); + +DEFPY_YANG (ipv6_router_id, + ipv6_router_id_cmd, + "[no] ipv6 router-id X:X::X:X$id vrf NAME", + NO_STR + IPV6_STR + "Manually set the router-id\n" + "IPv6 address to use for router-id\n" + VRF_CMD_HELP_STR) +{ + if (!no) + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/ipv6-router-id", + NB_OP_MODIFY, id_str); + else + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/ipv6-router-id", + NB_OP_DESTROY, NULL); + return nb_cli_apply_changes(vty, "/frr-vrf:lib/vrf[name='%s']", vrf); +} + +DEFPY_YANG (ip_router_id_in_vrf, + ip_router_id_in_vrf_cmd, + "[no] ip router-id ![A.B.C.D$id]", + NO_STR + IP_STR + "Manually set the router-id\n" + "IP address to use for router-id\n") +{ + if (!no) + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/router-id", NB_OP_MODIFY, + id_str); + else + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/router-id", NB_OP_DESTROY, + NULL); + + if (vty->node == CONFIG_NODE) + return nb_cli_apply_changes(vty, "/frr-vrf:lib/vrf[name='%s']", + VRF_DEFAULT_NAME); + + return nb_cli_apply_changes(vty, NULL); +} + +ALIAS_YANG (ip_router_id_in_vrf, + router_id_in_vrf_cmd, + "[no] router-id ![A.B.C.D$id]", + NO_STR + "Manually set the router-id\n" + "IP address to use for router-id\n"); + +DEFPY_YANG (ipv6_router_id_in_vrf, + ipv6_router_id_in_vrf_cmd, + "[no] ipv6 router-id ![X:X::X:X$id]", + NO_STR + IP6_STR + "Manually set the IPv6 router-id\n" + "IPV6 address to use for router-id\n") +{ + if (!no) + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/ipv6-router-id", + NB_OP_MODIFY, id_str); + else + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/ipv6-router-id", + NB_OP_DESTROY, NULL); + + if (vty->node == CONFIG_NODE) + return nb_cli_apply_changes(vty, "/frr-vrf:lib/vrf[name='%s']", + VRF_DEFAULT_NAME); + + return nb_cli_apply_changes(vty, NULL); +} + +static void lib_vrf_zebra_router_id_cli_write(struct vty *vty, + const struct lyd_node *dnode, + bool show_defaults) +{ + const char *id = yang_dnode_get_string(dnode, NULL); + + zebra_vrf_indent_cli_write(vty, dnode); + + vty_out(vty, "ip router-id %s\n", id); +} + +static void lib_vrf_zebra_ipv6_router_id_cli_write(struct vty *vty, + const struct lyd_node *dnode, + bool show_defaults) +{ + const char *id = yang_dnode_get_string(dnode, NULL); + + zebra_vrf_indent_cli_write(vty, dnode); + + vty_out(vty, "ipv6 router-id %s\n", id); +} + +DEFPY_YANG (ip_protocol, + ip_protocol_cmd, + "[no] ip protocol " FRR_IP_PROTOCOL_MAP_STR_ZEBRA + " $proto ![route-map ROUTE-MAP$rmap]", + NO_STR + IP_STR + "Filter routing info exchanged between zebra and protocol\n" + FRR_IP_PROTOCOL_MAP_HELP_STR_ZEBRA + "Specify route-map\n" + "Route map name\n") +{ + if (!no) { + nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); + nb_cli_enqueue_change(vty, "./route-map", NB_OP_MODIFY, rmap); + } else { + nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); + } + + if (vty->node == CONFIG_NODE) + return nb_cli_apply_changes( + vty, + "/frr-vrf:lib/vrf[name='%s']/frr-zebra:zebra/filter-protocol[afi-safi='%s'][protocol='%s']", + VRF_DEFAULT_NAME, + yang_afi_safi_value2identity(AFI_IP, SAFI_UNICAST), + proto); + + return nb_cli_apply_changes( + vty, + "./frr-zebra:zebra/filter-protocol[afi-safi='%s'][protocol='%s']", + yang_afi_safi_value2identity(AFI_IP, SAFI_UNICAST), proto); +} + +DEFPY_YANG (ipv6_protocol, + ipv6_protocol_cmd, + "[no] ipv6 protocol " FRR_IP6_PROTOCOL_MAP_STR_ZEBRA + " $proto ![route-map ROUTE-MAP$rmap]", + NO_STR + IP6_STR + "Filter IPv6 routing info exchanged between zebra and protocol\n" + FRR_IP6_PROTOCOL_MAP_HELP_STR_ZEBRA + "Specify route-map\n" + "Route map name\n") +{ + if (!no) { + nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); + nb_cli_enqueue_change(vty, "./route-map", NB_OP_MODIFY, rmap); + } else { + nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); + } + + if (vty->node == CONFIG_NODE) + return nb_cli_apply_changes( + vty, + "/frr-vrf:lib/vrf[name='%s']/frr-zebra:zebra/filter-protocol[afi-safi='%s'][protocol='%s']", + VRF_DEFAULT_NAME, + yang_afi_safi_value2identity(AFI_IP6, SAFI_UNICAST), + proto); + + return nb_cli_apply_changes( + vty, + "./frr-zebra:zebra/filter-protocol[afi-safi='%s'][protocol='%s']", + yang_afi_safi_value2identity(AFI_IP6, SAFI_UNICAST), proto); +} + +static void lib_vrf_zebra_filter_protocol_cli_write(struct vty *vty, + const struct lyd_node *dnode, + bool show_defaults) +{ + const char *afi_safi = yang_dnode_get_string(dnode, "afi-safi"); + const char *proto = yang_dnode_get_string(dnode, "protocol"); + const char *rmap = yang_dnode_get_string(dnode, "route-map"); + afi_t afi; + safi_t safi; + + yang_afi_safi_identity2value(afi_safi, &afi, &safi); + + if (safi != SAFI_UNICAST) + return; + + zebra_vrf_indent_cli_write(vty, dnode); + + if (afi == AFI_IP) + vty_out(vty, "ip protocol %s route-map %s\n", proto, rmap); + else + vty_out(vty, "ipv6 protocol %s route-map %s\n", proto, rmap); +} + +DEFPY_YANG (ip_protocol_nht_rmap, + ip_protocol_nht_rmap_cmd, + "[no] ip nht " FRR_IP_PROTOCOL_MAP_STR_ZEBRA + " $proto ![route-map ROUTE-MAP$rmap]", + NO_STR + IP_STR + "Filter Next Hop tracking route resolution\n" + FRR_IP_PROTOCOL_MAP_HELP_STR_ZEBRA + "Specify route map\n" + "Route map name\n") +{ + if (!no) { + nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); + nb_cli_enqueue_change(vty, "./route-map", NB_OP_MODIFY, rmap); + } else { + nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); + } + + + if (vty->node == CONFIG_NODE) + return nb_cli_apply_changes( + vty, + "/frr-vrf:lib/vrf[name='%s']/frr-zebra:zebra/filter-nht[afi-safi='%s'][protocol='%s']", + VRF_DEFAULT_NAME, + yang_afi_safi_value2identity(AFI_IP, SAFI_UNICAST), + proto); + + return nb_cli_apply_changes( + vty, + "./frr-zebra:zebra/filter-nht[afi-safi='%s'][protocol='%s']", + yang_afi_safi_value2identity(AFI_IP, SAFI_UNICAST), proto); +} + +DEFPY_YANG (ipv6_protocol_nht_rmap, + ipv6_protocol_nht_rmap_cmd, + "[no] ipv6 nht " FRR_IP6_PROTOCOL_MAP_STR_ZEBRA + " $proto ![route-map ROUTE-MAP$rmap]", + NO_STR + IP6_STR + "Filter Next Hop tracking route resolution\n" + FRR_IP6_PROTOCOL_MAP_HELP_STR_ZEBRA + "Specify route map\n" + "Route map name\n") +{ + if (!no) { + nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); + nb_cli_enqueue_change(vty, "./route-map", NB_OP_MODIFY, rmap); + } else { + nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); + } + + if (vty->node == CONFIG_NODE) + return nb_cli_apply_changes( + vty, + "/frr-vrf:lib/vrf[name='%s']/frr-zebra:zebra/filter-nht[afi-safi='%s'][protocol='%s']", + VRF_DEFAULT_NAME, + yang_afi_safi_value2identity(AFI_IP6, SAFI_UNICAST), + proto); + + return nb_cli_apply_changes( + vty, + "./frr-zebra:zebra/filter-nht[afi-safi='%s'][protocol='%s']", + yang_afi_safi_value2identity(AFI_IP6, SAFI_UNICAST), proto); +} + +static void lib_vrf_zebra_filter_nht_cli_write(struct vty *vty, + const struct lyd_node *dnode, + bool show_defaults) +{ + const char *afi_safi = yang_dnode_get_string(dnode, "afi-safi"); + const char *proto = yang_dnode_get_string(dnode, "protocol"); + const char *rmap = yang_dnode_get_string(dnode, "route-map"); + afi_t afi; + safi_t safi; + + yang_afi_safi_identity2value(afi_safi, &afi, &safi); + + if (safi != SAFI_UNICAST) + return; + + zebra_vrf_indent_cli_write(vty, dnode); + + if (afi == AFI_IP) + vty_out(vty, "ip nht %s route-map %s\n", proto, rmap); + else + vty_out(vty, "ipv6 nht %s route-map %s\n", proto, rmap); +} + +DEFPY_YANG (ip_nht_default_route, + ip_nht_default_route_cmd, + "[no] ip nht resolve-via-default", + NO_STR + IP_STR + "Filter Next Hop tracking route resolution\n" + "Resolve via default route\n") +{ + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/resolve-via-default", + NB_OP_MODIFY, no ? "false" : "true"); + + if (vty->node == CONFIG_NODE) + return nb_cli_apply_changes(vty, "/frr-vrf:lib/vrf[name='%s']", + VRF_DEFAULT_NAME); + + return nb_cli_apply_changes(vty, NULL); +} + +static void lib_vrf_zebra_resolve_via_default_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + bool resolve_via_default = yang_dnode_get_bool(dnode, NULL); + + if (resolve_via_default != SAVE_ZEBRA_IP_NHT_RESOLVE_VIA_DEFAULT || + show_defaults) { + zebra_vrf_indent_cli_write(vty, dnode); + + vty_out(vty, "%sip nht resolve-via-default\n", + resolve_via_default ? "" : "no "); + } +} + +DEFPY_YANG (ipv6_nht_default_route, + ipv6_nht_default_route_cmd, + "[no] ipv6 nht resolve-via-default", + NO_STR + IP6_STR + "Filter Next Hop tracking route resolution\n" + "Resolve via default route\n") +{ + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/ipv6-resolve-via-default", + NB_OP_MODIFY, no ? "false" : "true"); + + if (vty->node == CONFIG_NODE) + return nb_cli_apply_changes(vty, "/frr-vrf:lib/vrf[name='%s']", + VRF_DEFAULT_NAME); + + return nb_cli_apply_changes(vty, NULL); +} + +static void lib_vrf_zebra_ipv6_resolve_via_default_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + bool resolve_via_default = yang_dnode_get_bool(dnode, NULL); + + if (resolve_via_default != SAVE_ZEBRA_IP_NHT_RESOLVE_VIA_DEFAULT || + show_defaults) { + zebra_vrf_indent_cli_write(vty, dnode); + + vty_out(vty, "%sipv6 nht resolve-via-default\n", + resolve_via_default ? "" : "no "); + } +} + +DEFPY_YANG (vrf_netns, + vrf_netns_cmd, + "[no] netns ![NAME$netns_name]", + NO_STR + "Attach VRF to a Namespace\n" + "The file name in " NS_RUN_DIR ", or a full pathname\n") +{ + return CMD_SUCCESS; +} + +DEFPY_YANG (ip_table_range, ip_table_range_cmd, + "[no] ip table range ![(1-4294967295)$start (1-4294967295)$end]", + NO_STR IP_STR + "table configuration\n" + "Configure table range\n" + "Start Routing Table\n" + "End Routing Table\n") +{ + if (!no) { + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/netns/table-range", + NB_OP_CREATE, NULL); + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/netns/table-range/start", + NB_OP_MODIFY, start_str); + nb_cli_enqueue_change(vty, + "./frr-zebra:zebra/netns/table-range/end", + NB_OP_MODIFY, end_str); + } else { + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/netns/table-range", + NB_OP_DESTROY, NULL); + } + + if (vty->node == CONFIG_NODE) + return nb_cli_apply_changes(vty, "/frr-vrf:lib/vrf[name='%s']", + VRF_DEFAULT_NAME); + + return nb_cli_apply_changes(vty, NULL); +} + +static void lib_vrf_zebra_netns_table_range_cli_write( + struct vty *vty, const struct lyd_node *dnode, bool show_defaults) +{ + uint32_t start = yang_dnode_get_uint32(dnode, "start"); + uint32_t end = yang_dnode_get_uint32(dnode, "end"); + + zebra_vrf_indent_cli_write(vty, dnode); + + vty_out(vty, "ip table range %u %u\n", start, end); +} + +DEFPY_YANG (vni_mapping, + vni_mapping_cmd, + "[no] vni ![" CMD_VNI_RANGE "[prefix-routes-only$filter]]", + NO_STR + "VNI corresponding to tenant VRF\n" + "VNI-ID\n" + "prefix-routes-only\n") +{ + if (!no) + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/l3vni-id", NB_OP_MODIFY, + vni_str); + else + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/l3vni-id", NB_OP_DESTROY, + NULL); + + if (filter) + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/prefix-only", + NB_OP_MODIFY, "true"); + else + nb_cli_enqueue_change(vty, "./frr-zebra:zebra/prefix-only", + NB_OP_DESTROY, NULL); + + if (vty->node == CONFIG_NODE) + return nb_cli_apply_changes(vty, "/frr-vrf:lib/vrf[name='%s']", + VRF_DEFAULT_NAME); + + return nb_cli_apply_changes(vty, NULL); +} + +static void lib_vrf_zebra_l3vni_id_cli_write(struct vty *vty, + const struct lyd_node *dnode, + bool show_defaults) +{ + vni_t vni = yang_dnode_get_uint32(dnode, NULL); + bool prefix_only = yang_dnode_get_bool(dnode, "../prefix-only"); + + zebra_vrf_indent_cli_write(vty, dnode); + + vty_out(vty, "vni %u", vni); + + if (prefix_only) + vty_out(vty, " prefix-routes-only"); + + vty_out(vty, "\n"); +} + +DEFPY_YANG( + match_ip_address_prefix_len, match_ip_address_prefix_len_cmd, + "match ip address prefix-len (0-32)$length", + MATCH_STR + IP_STR + "Match prefix length of IP address\n" + "Match prefix length of IP address\n" + "Prefix length\n") +{ + const char *xpath = + "./match-condition[condition='frr-zebra-route-map:ipv4-prefix-length']"; + char xpath_value[XPATH_MAXLEN]; + + nb_cli_enqueue_change(vty, xpath, NB_OP_CREATE, NULL); + snprintf( + xpath_value, sizeof(xpath_value), + "%s/rmap-match-condition/frr-zebra-route-map:ipv4-prefix-length", + xpath); + nb_cli_enqueue_change(vty, xpath_value, NB_OP_MODIFY, length_str); + + return nb_cli_apply_changes(vty, NULL); +} + +DEFPY_YANG( + no_match_ip_address_prefix_len, no_match_ip_address_prefix_len_cmd, + "no match ip address prefix-len [(0-32)]", + NO_STR + MATCH_STR + IP_STR + "Match prefix length of IP address\n" + "Match prefix length of IP address\n" + "Prefix length\n") +{ + const char *xpath = + "./match-condition[condition='frr-zebra-route-map:ipv4-prefix-length']"; + + nb_cli_enqueue_change(vty, xpath, NB_OP_DESTROY, NULL); + + return nb_cli_apply_changes(vty, NULL); +} + +DEFPY_YANG( + match_ipv6_address_prefix_len, match_ipv6_address_prefix_len_cmd, + "match ipv6 address prefix-len (0-128)$length", + MATCH_STR + IPV6_STR + "Match prefix length of IPv6 address\n" + "Match prefix length of IPv6 address\n" + "Prefix length\n") +{ + const char *xpath = + "./match-condition[condition='frr-zebra-route-map:ipv6-prefix-length']"; + char xpath_value[XPATH_MAXLEN]; + + nb_cli_enqueue_change(vty, xpath, NB_OP_CREATE, NULL); + snprintf( + xpath_value, sizeof(xpath_value), + "%s/rmap-match-condition/frr-zebra-route-map:ipv6-prefix-length", + xpath); + nb_cli_enqueue_change(vty, xpath_value, NB_OP_MODIFY, length_str); + + return nb_cli_apply_changes(vty, NULL); +} + +DEFPY_YANG( + no_match_ipv6_address_prefix_len, no_match_ipv6_address_prefix_len_cmd, + "no match ipv6 address prefix-len [(0-128)]", + NO_STR + MATCH_STR + IPV6_STR + "Match prefix length of IPv6 address\n" + "Match prefix length of IPv6 address\n" + "Prefix length\n") +{ + const char *xpath = + "./match-condition[condition='frr-zebra-route-map:ipv6-prefix-length']"; + + nb_cli_enqueue_change(vty, xpath, NB_OP_DESTROY, NULL); + + return nb_cli_apply_changes(vty, NULL); +} + +DEFPY_YANG( + match_ip_nexthop_prefix_len, match_ip_nexthop_prefix_len_cmd, + "match ip next-hop prefix-len (0-32)$length", + MATCH_STR + IP_STR + "Match prefixlen of nexthop IP address\n" + "Match prefixlen of given nexthop\n" + "Prefix length\n") +{ + const char *xpath = + "./match-condition[condition='frr-zebra-route-map:ipv4-next-hop-prefix-length']"; + char xpath_value[XPATH_MAXLEN]; + + nb_cli_enqueue_change(vty, xpath, NB_OP_CREATE, NULL); + snprintf( + xpath_value, sizeof(xpath_value), + "%s/rmap-match-condition/frr-zebra-route-map:ipv4-prefix-length", + xpath); + nb_cli_enqueue_change(vty, xpath_value, NB_OP_MODIFY, length_str); + + return nb_cli_apply_changes(vty, NULL); +} + +DEFPY_YANG( + no_match_ip_nexthop_prefix_len, no_match_ip_nexthop_prefix_len_cmd, + "no match ip next-hop prefix-len [(0-32)]", + NO_STR + MATCH_STR + IP_STR + "Match prefixlen of nexthop IP address\n" + "Match prefix length of nexthop\n" + "Prefix length\n") +{ + const char *xpath = + "./match-condition[condition='frr-zebra-route-map:ipv4-next-hop-prefix-length']"; + + nb_cli_enqueue_change(vty, xpath, NB_OP_DESTROY, NULL); + + return nb_cli_apply_changes(vty, NULL); +} + +DEFPY_YANG( + match_source_protocol, match_source_protocol_cmd, + "match source-protocol " FRR_REDIST_STR_ZEBRA "$proto", + MATCH_STR + "Match protocol via which the route was learnt\n" + FRR_REDIST_HELP_STR_ZEBRA) +{ + const char *xpath = + "./match-condition[condition='frr-zebra-route-map:source-protocol']"; + char xpath_value[XPATH_MAXLEN]; + + nb_cli_enqueue_change(vty, xpath, NB_OP_CREATE, NULL); + snprintf(xpath_value, sizeof(xpath_value), + "%s/rmap-match-condition/frr-zebra-route-map:source-protocol", + xpath); + nb_cli_enqueue_change(vty, xpath_value, NB_OP_MODIFY, proto); + + return nb_cli_apply_changes(vty, NULL); +} + +DEFPY_YANG( + no_match_source_protocol, no_match_source_protocol_cmd, + "no match source-protocol [" FRR_REDIST_STR_ZEBRA "]", + NO_STR + MATCH_STR + "Match protocol via which the route was learnt\n" + FRR_REDIST_HELP_STR_ZEBRA) +{ + const char *xpath = + "./match-condition[condition='frr-zebra-route-map:source-protocol']"; + + nb_cli_enqueue_change(vty, xpath, NB_OP_DESTROY, NULL); + + return nb_cli_apply_changes(vty, NULL); +} + +DEFPY_YANG( + match_source_instance, match_source_instance_cmd, + "match source-instance (0-255)$instance", + MATCH_STR + "Match the protocol's instance number\n" + "The instance number\n") +{ + const char *xpath = + "./match-condition[condition='frr-zebra-route-map:source-instance']"; + char xpath_value[XPATH_MAXLEN]; + + nb_cli_enqueue_change(vty, xpath, NB_OP_CREATE, NULL); + snprintf(xpath_value, sizeof(xpath_value), + "%s/rmap-match-condition/frr-zebra-route-map:source-instance", + xpath); + nb_cli_enqueue_change(vty, xpath_value, NB_OP_MODIFY, instance_str); + + return nb_cli_apply_changes(vty, NULL); +} + +DEFPY_YANG( + no_match_source_instance, no_match_source_instance_cmd, + "no match source-instance [(0-255)]", + NO_STR MATCH_STR + "Match the protocol's instance number\n" + "The instance number\n") +{ + const char *xpath = + "./match-condition[condition='frr-zebra-route-map:source-instance']"; + + nb_cli_enqueue_change(vty, xpath, NB_OP_DESTROY, NULL); + + return nb_cli_apply_changes(vty, NULL); +} + +/* set functions */ + +DEFPY_YANG( + set_src, set_src_cmd, + "set src ", + SET_STR + "src address for route\n" + "IPv4 src address\n" + "IPv6 src address\n") +{ + const char *xpath = + "./set-action[action='frr-zebra-route-map:src-address']"; + char xpath_value[XPATH_MAXLEN]; + + nb_cli_enqueue_change(vty, xpath, NB_OP_CREATE, NULL); + if (addrv4_str) { + snprintf( + xpath_value, sizeof(xpath_value), + "%s/rmap-set-action/frr-zebra-route-map:ipv4-src-address", + xpath); + nb_cli_enqueue_change(vty, xpath_value, NB_OP_MODIFY, + addrv4_str); + } else { + snprintf( + xpath_value, sizeof(xpath_value), + "%s/rmap-set-action/frr-zebra-route-map:ipv6-src-address", + xpath); + nb_cli_enqueue_change(vty, xpath_value, NB_OP_MODIFY, + addrv6_str); + } + + return nb_cli_apply_changes(vty, NULL); +} + +DEFPY_YANG( + no_set_src, no_set_src_cmd, + "no set src []", + NO_STR + SET_STR + "Source address for route\n" + "IPv4 address\n" + "IPv6 address\n") +{ + const char *xpath = + "./set-action[action='frr-zebra-route-map:src-address']"; + + nb_cli_enqueue_change(vty, xpath, NB_OP_DESTROY, NULL); + + return nb_cli_apply_changes(vty, NULL); +} + +#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-zebra:zebra/ptm-enable", + .cbs.cli_show = zebra_ptm_enable_cli_write, + }, + { + .xpath = "/frr-zebra:zebra/route-map-delay", + .cbs.cli_show = zebra_route_map_delay_cli_write, + }, + { + .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 = "/frr-vrf:lib/vrf/frr-zebra:zebra/router-id", + .cbs.cli_show = lib_vrf_zebra_router_id_cli_write, + }, + { + .xpath = "/frr-vrf:lib/vrf/frr-zebra:zebra/ipv6-router-id", + .cbs.cli_show = lib_vrf_zebra_ipv6_router_id_cli_write, + }, + { + .xpath = "/frr-vrf:lib/vrf/frr-zebra:zebra/filter-protocol", + .cbs.cli_show = lib_vrf_zebra_filter_protocol_cli_write, + }, + { + .xpath = "/frr-vrf:lib/vrf/frr-zebra:zebra/filter-nht", + .cbs.cli_show = lib_vrf_zebra_filter_nht_cli_write, + }, + { + .xpath = "/frr-vrf:lib/vrf/frr-zebra:zebra/resolve-via-default", + .cbs.cli_show = lib_vrf_zebra_resolve_via_default_cli_write, + }, + { + .xpath = "/frr-vrf:lib/vrf/frr-zebra:zebra/ipv6-resolve-via-default", + .cbs.cli_show = lib_vrf_zebra_ipv6_resolve_via_default_cli_write, + }, + { + .xpath = "/frr-vrf:lib/vrf/frr-zebra:zebra/netns/table-range", + .cbs.cli_show = lib_vrf_zebra_netns_table_range_cli_write, + }, + { + .xpath = "/frr-vrf:lib/vrf/frr-zebra:zebra/l3vni-id", + .cbs.cli_show = lib_vrf_zebra_l3vni_id_cli_write, + }, + { + .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, &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 + + install_element(CONFIG_NODE, &ip_router_id_cmd); + install_element(CONFIG_NODE, &router_id_cmd); + install_element(CONFIG_NODE, &ipv6_router_id_cmd); + install_element(CONFIG_NODE, &ip_router_id_in_vrf_cmd); + install_element(CONFIG_NODE, &router_id_in_vrf_cmd); + install_element(CONFIG_NODE, &ipv6_router_id_in_vrf_cmd); + install_element(VRF_NODE, &ip_router_id_in_vrf_cmd); + install_element(VRF_NODE, &router_id_in_vrf_cmd); + install_element(VRF_NODE, &ipv6_router_id_in_vrf_cmd); + + install_element(CONFIG_NODE, &ip_protocol_cmd); + install_element(VRF_NODE, &ip_protocol_cmd); + install_element(CONFIG_NODE, &ipv6_protocol_cmd); + install_element(VRF_NODE, &ipv6_protocol_cmd); + install_element(CONFIG_NODE, &ip_protocol_nht_rmap_cmd); + install_element(VRF_NODE, &ip_protocol_nht_rmap_cmd); + install_element(CONFIG_NODE, &ipv6_protocol_nht_rmap_cmd); + install_element(VRF_NODE, &ipv6_protocol_nht_rmap_cmd); + install_element(CONFIG_NODE, &zebra_route_map_timer_cmd); + + install_element(CONFIG_NODE, &ip_nht_default_route_cmd); + install_element(CONFIG_NODE, &ipv6_nht_default_route_cmd); + install_element(VRF_NODE, &ip_nht_default_route_cmd); + install_element(VRF_NODE, &ipv6_nht_default_route_cmd); + + install_element(CONFIG_NODE, &vni_mapping_cmd); + install_element(VRF_NODE, &vni_mapping_cmd); + + if (vrf_is_backend_netns()) + install_element(VRF_NODE, &vrf_netns_cmd); + + install_element(CONFIG_NODE, &ip_table_range_cmd); + install_element(VRF_NODE, &ip_table_range_cmd); +#if HAVE_BFDD == 0 + install_element(CONFIG_NODE, &zebra_ptm_enable_cmd); +#endif + install_element(RMAP_NODE, &match_ip_nexthop_prefix_len_cmd); + install_element(RMAP_NODE, &no_match_ip_nexthop_prefix_len_cmd); + install_element(RMAP_NODE, &match_ip_address_prefix_len_cmd); + install_element(RMAP_NODE, &match_ipv6_address_prefix_len_cmd); + install_element(RMAP_NODE, &no_match_ipv6_address_prefix_len_cmd); + install_element(RMAP_NODE, &no_match_ip_address_prefix_len_cmd); + install_element(RMAP_NODE, &match_source_protocol_cmd); + install_element(RMAP_NODE, &no_match_source_protocol_cmd); + install_element(RMAP_NODE, &match_source_instance_cmd); + install_element(RMAP_NODE, &no_match_source_instance_cmd); + + install_element(RMAP_NODE, &set_src_cmd); + install_element(RMAP_NODE, &no_set_src_cmd); +} 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 fec378885e4e..aace4289d33c 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 @@ -107,7 +106,6 @@ const struct frr_yang_module_info frr_zebra_info = { .xpath = "/frr-zebra:zebra/route-map-delay", .cbs = { .modify = zebra_route_map_delay_modify, - .cli_show = zebra_route_map_delay_cli_write, } }, { @@ -324,7 +322,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, } }, @@ -339,7 +336,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, } }, @@ -354,7 +350,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, } }, @@ -362,7 +357,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, } }, @@ -370,14 +364,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, } }, @@ -385,7 +377,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, } }, @@ -393,7 +384,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, } }, @@ -402,15 +392,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, } }, @@ -418,7 +405,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, } }, @@ -426,7 +412,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, } }, @@ -434,7 +419,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, } }, @@ -448,7 +432,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, } }, @@ -456,7 +439,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, } }, @@ -464,7 +446,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, } }, @@ -473,13 +454,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, }, }, { @@ -493,14 +472,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, } }, @@ -520,7 +497,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, } }, @@ -547,7 +523,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, } }, @@ -555,7 +530,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, } }, @@ -563,7 +537,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, } }, @@ -571,7 +544,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, } }, @@ -579,7 +551,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, } }, @@ -587,21 +558,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) @@ -609,63 +577,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, } }, @@ -673,7 +632,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, } }, @@ -681,21 +639,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, } }, @@ -703,7 +658,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, } }, @@ -711,14 +665,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, } }, @@ -726,7 +678,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, } }, @@ -771,7 +722,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, } }, @@ -788,7 +738,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 @@ -845,7 +794,6 @@ const struct frr_yang_module_info frr_zebra_info = { .cbs = { .modify = lib_vrf_zebra_router_id_modify, .destroy = lib_vrf_zebra_router_id_destroy, - .cli_show = lib_vrf_zebra_router_id_cli_write, } }, { @@ -853,7 +801,6 @@ const struct frr_yang_module_info frr_zebra_info = { .cbs = { .modify = lib_vrf_zebra_ipv6_router_id_modify, .destroy = lib_vrf_zebra_ipv6_router_id_destroy, - .cli_show = lib_vrf_zebra_ipv6_router_id_cli_write, } }, { @@ -861,7 +808,6 @@ const struct frr_yang_module_info frr_zebra_info = { .cbs = { .create = lib_vrf_zebra_filter_protocol_create, .destroy = lib_vrf_zebra_filter_protocol_destroy, - .cli_show = lib_vrf_zebra_filter_protocol_cli_write, } }, { @@ -875,7 +821,6 @@ const struct frr_yang_module_info frr_zebra_info = { .cbs = { .create = lib_vrf_zebra_filter_nht_create, .destroy = lib_vrf_zebra_filter_nht_destroy, - .cli_show = lib_vrf_zebra_filter_nht_cli_write, } }, { @@ -889,7 +834,6 @@ const struct frr_yang_module_info frr_zebra_info = { .cbs = { .modify = lib_vrf_zebra_resolve_via_default_modify, .destroy = lib_vrf_zebra_resolve_via_default_destroy, - .cli_show = lib_vrf_zebra_resolve_via_default_cli_write, } }, { @@ -897,7 +841,6 @@ const struct frr_yang_module_info frr_zebra_info = { .cbs = { .modify = lib_vrf_zebra_ipv6_resolve_via_default_modify, .destroy = lib_vrf_zebra_ipv6_resolve_via_default_destroy, - .cli_show = lib_vrf_zebra_ipv6_resolve_via_default_cli_write, } }, { @@ -905,7 +848,6 @@ const struct frr_yang_module_info frr_zebra_info = { .cbs = { .create = lib_vrf_zebra_netns_table_range_create, .destroy = lib_vrf_zebra_netns_table_range_destroy, - .cli_show = lib_vrf_zebra_netns_table_range_cli_write, } }, { @@ -1181,7 +1123,6 @@ const struct frr_yang_module_info frr_zebra_info = { .cbs = { .modify = lib_vrf_zebra_l3vni_id_modify, .destroy = lib_vrf_zebra_l3vni_id_destroy, - .cli_show = lib_vrf_zebra_l3vni_id_cli_write, } }, { diff --git a/zebra/zebra_nb.h b/zebra/zebra_nb.h index 9816afeace0b..2886469e9a5c 100644 --- a/zebra/zebra_nb.h +++ b/zebra/zebra_nb.h @@ -46,13 +46,8 @@ int zebra_allow_external_route_update_destroy(struct nb_cb_destroy_args *args); int zebra_dplane_queue_limit_modify(struct nb_cb_modify_args *args); #if HAVE_BFDD == 0 int zebra_ptm_enable_modify(struct nb_cb_modify_args *args); -void zebra_ptm_enable_cli_write(struct vty *vty, const struct lyd_node *dnode, - bool show_defaults); #endif int zebra_route_map_delay_modify(struct nb_cb_modify_args *args); -void zebra_route_map_delay_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults); int zebra_debugs_debug_events_modify(struct nb_cb_modify_args *args); int zebra_debugs_debug_events_destroy(struct nb_cb_destroy_args *args); int zebra_debugs_debug_zapi_send_modify(struct nb_cb_modify_args *args); @@ -90,77 +85,37 @@ int zebra_debugs_debug_dplane_detail_destroy(struct nb_cb_destroy_args *args); int zebra_debugs_debug_mlag_modify(struct nb_cb_modify_args *args); int zebra_debugs_debug_mlag_destroy(struct nb_cb_destroy_args *args); int lib_interface_zebra_ipv4_addrs_create(struct nb_cb_create_args *args); -void lib_interface_zebra_ipv4_addrs_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults); int lib_interface_zebra_ipv4_addrs_destroy(struct nb_cb_destroy_args *args); int lib_interface_zebra_ipv4_addrs_label_modify(struct nb_cb_modify_args *args); -void lib_interface_zebra_ipv4_addrs_label_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults); int lib_interface_zebra_ipv4_addrs_label_destroy(struct nb_cb_destroy_args *args); int lib_interface_zebra_ipv4_p2p_addrs_create(struct nb_cb_create_args *args); -void lib_interface_zebra_ipv4_p2p_addrs_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults); int lib_interface_zebra_ipv4_p2p_addrs_destroy(struct nb_cb_destroy_args *args); int lib_interface_zebra_ipv4_p2p_addrs_label_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_ipv4_p2p_addrs_label_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_ipv4_p2p_addrs_label_destroy( struct nb_cb_destroy_args *args); int lib_interface_zebra_ipv6_addrs_create(struct nb_cb_create_args *args); -void lib_interface_zebra_ipv6_addrs_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults); int lib_interface_zebra_ipv6_addrs_destroy(struct nb_cb_destroy_args *args); int lib_interface_zebra_multicast_modify(struct nb_cb_modify_args *args); -void lib_interface_zebra_multicast_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults); int lib_interface_zebra_multicast_destroy(struct nb_cb_destroy_args *args); int lib_interface_zebra_link_detect_modify(struct nb_cb_modify_args *args); -void lib_interface_zebra_link_detect_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults); int lib_interface_zebra_enabled_modify(struct nb_cb_modify_args *args); -void lib_interface_zebra_enabled_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults); int lib_interface_zebra_enabled_destroy(struct nb_cb_destroy_args *args); int lib_interface_zebra_bandwidth_modify(struct nb_cb_modify_args *args); int lib_interface_zebra_bandwidth_destroy(struct nb_cb_destroy_args *args); -void lib_interface_zebra_bandwidth_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults); int lib_interface_zebra_mpls_modify(struct nb_cb_modify_args *args); -void lib_interface_zebra_mpls_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults); int lib_interface_zebra_mpls_destroy(struct nb_cb_destroy_args *args); int lib_interface_zebra_link_params_create(struct nb_cb_create_args *args); -void lib_interface_zebra_link_params_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults); -void lib_interface_zebra_link_params_cli_write_end(struct vty *vty, - const struct lyd_node *dnode); int lib_interface_zebra_link_params_destroy(struct nb_cb_destroy_args *args); int lib_interface_zebra_link_params_metric_modify(struct nb_cb_modify_args *args); -void lib_interface_zebra_link_params_metric_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_link_params_metric_destroy( struct nb_cb_destroy_args *args); int lib_interface_zebra_link_params_max_bandwidth_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_link_params_max_bandwidth_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_link_params_max_bandwidth_destroy( struct nb_cb_destroy_args *args); int lib_interface_zebra_link_params_max_reservable_bandwidth_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_link_params_max_reservable_bandwidth_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_link_params_max_reservable_bandwidth_destroy( struct nb_cb_destroy_args *args); int lib_interface_zebra_link_params_unreserved_bandwidths_unreserved_bandwidth_create( @@ -175,234 +130,136 @@ void lib_interface_zebra_link_params_unreserved_bandwidths_unreserved_bandwidth_ struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_link_params_residual_bandwidth_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_link_params_residual_bandwidth_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_link_params_residual_bandwidth_destroy( struct nb_cb_destroy_args *args); int lib_interface_zebra_link_params_available_bandwidth_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_link_params_available_bandwidth_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_link_params_available_bandwidth_destroy( struct nb_cb_destroy_args *args); int lib_interface_zebra_link_params_utilized_bandwidth_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_link_params_utilized_bandwidth_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_link_params_utilized_bandwidth_destroy( struct nb_cb_destroy_args *args); -int lib_interface_zebra_legacy_admin_group_modify( - struct nb_cb_modify_args *args); -void lib_interface_zebra_link_params_legacy_admin_group_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); +int lib_interface_zebra_legacy_admin_group_modify(struct nb_cb_modify_args *args); int lib_interface_zebra_legacy_admin_group_destroy( struct nb_cb_destroy_args *args); int lib_interface_zebra_affinity_create(struct nb_cb_create_args *args); -void lib_interface_zebra_link_params_affinities_affinity_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_affinity_destroy(struct nb_cb_destroy_args *args); int lib_interface_zebra_affinity_mode_modify(struct nb_cb_modify_args *args); -void lib_interface_zebra_link_params_affinity_mode_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_link_params_neighbor_create( struct nb_cb_create_args *args); -void lib_interface_zebra_link_params_neighbor_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_link_params_neighbor_destroy( struct nb_cb_destroy_args *args); int lib_interface_zebra_link_params_neighbor_remote_as_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_link_params_neighbor_remote_as_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_link_params_neighbor_ipv4_remote_id_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_link_params_neighbor_ipv4_remote_id_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_link_params_delay_modify(struct nb_cb_modify_args *args); -void lib_interface_zebra_link_params_delay_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_link_params_delay_destroy( struct nb_cb_destroy_args *args); int lib_interface_zebra_link_params_min_max_delay_create( struct nb_cb_create_args *args); -void lib_interface_zebra_link_params_min_max_delay_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_link_params_min_max_delay_destroy( struct nb_cb_destroy_args *args); int lib_interface_zebra_link_params_min_max_delay_delay_min_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_link_params_min_max_delay_delay_min_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_link_params_min_max_delay_delay_max_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_link_params_min_max_delay_delay_max_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_link_params_delay_variation_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_link_params_delay_variation_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_link_params_delay_variation_destroy( struct nb_cb_destroy_args *args); int lib_interface_zebra_link_params_packet_loss_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_link_params_packet_loss_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_link_params_packet_loss_destroy( struct nb_cb_destroy_args *args); int lib_interface_zebra_evpn_mh_type_0_esi_modify(struct nb_cb_modify_args *args); -void lib_interface_zebra_evpn_mh_type_0_esi_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_evpn_mh_type_0_esi_destroy( struct nb_cb_destroy_args *args); int lib_interface_zebra_evpn_mh_type_3_system_mac_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_evpn_mh_type_3_system_mac_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_evpn_mh_type_3_system_mac_destroy( struct nb_cb_destroy_args *args); int lib_interface_zebra_evpn_mh_type_3_local_discriminator_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_evpn_mh_type_3_local_discriminator_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_evpn_mh_type_3_local_discriminator_destroy( struct nb_cb_destroy_args *args); int lib_interface_zebra_evpn_mh_df_preference_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_evpn_mh_df_preference_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_evpn_mh_bypass_modify(struct nb_cb_modify_args *args); -void lib_interface_zebra_evpn_mh_bypass_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults); int lib_interface_zebra_evpn_mh_uplink_modify(struct nb_cb_modify_args *args); -void lib_interface_zebra_evpn_mh_uplink_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults); #if defined(HAVE_RTADV) int lib_interface_zebra_ipv6_router_advertisements_send_advertisements_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_ipv6_router_advertisements_send_advertisements_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_ipv6_router_advertisements_max_rtr_adv_interval_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_ipv6_router_advertisements_max_rtr_adv_interval_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_ipv6_router_advertisements_managed_flag_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_ipv6_router_advertisements_managed_flag_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_ipv6_router_advertisements_other_config_flag_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_ipv6_router_advertisements_other_config_flag_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_ipv6_router_advertisements_home_agent_flag_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_ipv6_router_advertisements_home_agent_flag_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_ipv6_router_advertisements_link_mtu_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_ipv6_router_advertisements_link_mtu_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_ipv6_router_advertisements_reachable_time_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_ipv6_router_advertisements_reachable_time_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_ipv6_router_advertisements_retrans_timer_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_ipv6_router_advertisements_retrans_timer_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_ipv6_router_advertisements_cur_hop_limit_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_ipv6_router_advertisements_cur_hop_limit_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_ipv6_router_advertisements_cur_hop_limit_destroy( struct nb_cb_destroy_args *args); int lib_interface_zebra_ipv6_router_advertisements_default_lifetime_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_ipv6_router_advertisements_default_lifetime_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_ipv6_router_advertisements_default_lifetime_destroy( struct nb_cb_destroy_args *args); int lib_interface_zebra_ipv6_router_advertisements_fast_retransmit_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_ipv6_router_advertisements_fast_retransmit_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_ipv6_router_advertisements_advertisement_interval_option_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_ipv6_router_advertisements_advertisement_interval_option_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_ipv6_router_advertisements_home_agent_preference_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_ipv6_router_advertisements_home_agent_preference_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_ipv6_router_advertisements_home_agent_preference_destroy( struct nb_cb_destroy_args *args); int lib_interface_zebra_ipv6_router_advertisements_home_agent_lifetime_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_ipv6_router_advertisements_home_agent_lifetime_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_ipv6_router_advertisements_home_agent_lifetime_destroy( struct nb_cb_destroy_args *args); int lib_interface_zebra_ipv6_router_advertisements_default_router_preference_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_ipv6_router_advertisements_default_router_preference_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_ipv6_router_advertisements_prefix_list_prefix_create( struct nb_cb_create_args *args); -void lib_interface_zebra_ipv6_router_advertisements_prefix_list_prefix_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_ipv6_router_advertisements_prefix_list_prefix_destroy( struct nb_cb_destroy_args *args); int lib_interface_zebra_ipv6_router_advertisements_prefix_list_prefix_valid_lifetime_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_ipv6_router_advertisements_prefix_list_prefix_valid_lifetime_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_ipv6_router_advertisements_prefix_list_prefix_on_link_flag_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_ipv6_router_advertisements_prefix_list_prefix_on_link_flag_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_ipv6_router_advertisements_prefix_list_prefix_preferred_lifetime_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_ipv6_router_advertisements_prefix_list_prefix_preferred_lifetime_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_ipv6_router_advertisements_prefix_list_prefix_autonomous_flag_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_ipv6_router_advertisements_prefix_list_prefix_autonomous_flag_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_ipv6_router_advertisements_prefix_list_prefix_router_address_flag_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_ipv6_router_advertisements_prefix_list_prefix_router_address_flag_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_ipv6_router_advertisements_rdnss_rdnss_address_create( struct nb_cb_create_args *args); -void lib_interface_zebra_ipv6_router_advertisements_rdnss_rdnss_address_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_ipv6_router_advertisements_rdnss_rdnss_address_destroy( struct nb_cb_destroy_args *args); int lib_interface_zebra_ipv6_router_advertisements_rdnss_rdnss_address_lifetime_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_ipv6_router_advertisements_rdnss_rdnss_address_lifetime_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_ipv6_router_advertisements_rdnss_rdnss_address_lifetime_destroy( struct nb_cb_destroy_args *args); int lib_interface_zebra_ipv6_router_advertisements_dnssl_dnssl_domain_create( struct nb_cb_create_args *args); -void lib_interface_zebra_ipv6_router_advertisements_dnssl_dnssl_domain_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_ipv6_router_advertisements_dnssl_dnssl_domain_destroy( struct nb_cb_destroy_args *args); int lib_interface_zebra_ipv6_router_advertisements_dnssl_dnssl_domain_lifetime_modify( struct nb_cb_modify_args *args); -void lib_interface_zebra_ipv6_router_advertisements_dnssl_dnssl_domain_lifetime_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_interface_zebra_ipv6_router_advertisements_dnssl_dnssl_domain_lifetime_destroy( struct nb_cb_destroy_args *args); #endif /* defined(HAVE_RTADV) */ #if HAVE_BFDD == 0 int lib_interface_zebra_ptm_enable_modify(struct nb_cb_modify_args *args); -void lib_interface_zebra_ptm_enable_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults); #endif struct yang_data * lib_interface_zebra_state_up_count_get_elem(struct nb_cb_get_elem_args *args); @@ -422,42 +279,22 @@ struct yang_data *lib_interface_zebra_state_mcast_group_get_elem( struct nb_cb_get_elem_args *args); int lib_vrf_zebra_router_id_modify(struct nb_cb_modify_args *args); int lib_vrf_zebra_router_id_destroy(struct nb_cb_destroy_args *args); -void lib_vrf_zebra_router_id_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults); int lib_vrf_zebra_ipv6_router_id_modify(struct nb_cb_modify_args *args); int lib_vrf_zebra_ipv6_router_id_destroy(struct nb_cb_destroy_args *args); -void lib_vrf_zebra_ipv6_router_id_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults); int lib_vrf_zebra_filter_protocol_create(struct nb_cb_create_args *args); int lib_vrf_zebra_filter_protocol_destroy(struct nb_cb_destroy_args *args); -void lib_vrf_zebra_filter_protocol_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults); int lib_vrf_zebra_filter_protocol_route_map_modify( struct nb_cb_modify_args *args); int lib_vrf_zebra_filter_nht_create(struct nb_cb_create_args *args); int lib_vrf_zebra_filter_nht_destroy(struct nb_cb_destroy_args *args); -void lib_vrf_zebra_filter_nht_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults); int lib_vrf_zebra_filter_nht_route_map_modify(struct nb_cb_modify_args *args); int lib_vrf_zebra_resolve_via_default_modify(struct nb_cb_modify_args *args); int lib_vrf_zebra_resolve_via_default_destroy(struct nb_cb_destroy_args *args); -void lib_vrf_zebra_resolve_via_default_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults); int lib_vrf_zebra_ipv6_resolve_via_default_modify(struct nb_cb_modify_args *args); int lib_vrf_zebra_ipv6_resolve_via_default_destroy( struct nb_cb_destroy_args *args); -void lib_vrf_zebra_ipv6_resolve_via_default_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults); int lib_vrf_zebra_netns_table_range_create(struct nb_cb_create_args *args); int lib_vrf_zebra_netns_table_range_destroy(struct nb_cb_destroy_args *args); -void lib_vrf_zebra_netns_table_range_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults); int lib_vrf_zebra_netns_table_range_start_modify(struct nb_cb_modify_args *args); int lib_vrf_zebra_netns_table_range_end_modify(struct nb_cb_modify_args *args); const void *lib_vrf_zebra_ribs_rib_get_next(struct nb_cb_get_next_args *args); @@ -633,9 +470,6 @@ lib_vrf_zebra_ribs_rib_route_route_entry_nexthop_group_nexthop_weight_get_elem( struct nb_cb_get_elem_args *args); int lib_vrf_zebra_l3vni_id_modify(struct nb_cb_modify_args *args); int lib_vrf_zebra_l3vni_id_destroy(struct nb_cb_destroy_args *args); -void lib_vrf_zebra_l3vni_id_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults); int lib_vrf_zebra_prefix_only_modify(struct nb_cb_modify_args *args); #ifdef __cplusplus diff --git a/zebra/zebra_ptm.c b/zebra/zebra_ptm.c index 78284acc7862..d7d752f01e61 100644 --- a/zebra/zebra_ptm.c +++ b/zebra/zebra_ptm.c @@ -20,7 +20,6 @@ #include "vrf.h" #include "vty.h" #include "lib_errors.h" -#include "northbound_cli.h" #include "zebra/debug.h" #include "zebra/interface.h" @@ -29,7 +28,6 @@ #include "zebra/zebra_ptm_redistribute.h" #include "zebra/zebra_router.h" #include "zebra_vrf.h" -#include "zebra_nb.h" /* * Choose the BFD implementation that we'll use. @@ -88,7 +86,6 @@ struct zebra_ptm_cb ptm_cb; static int zebra_ptm_socket_init(void); void zebra_ptm_sock_read(struct event *thread); -static void zebra_ptm_install_commands(void); static int zebra_ptm_handle_msg_cb(void *arg, void *in_ctxt); void zebra_bfd_peer_replay_req(void); void zebra_ptm_send_status_req(void); @@ -117,7 +114,6 @@ void zebra_ptm_init(void) } ptm_cb.pid = getpid(); - zebra_ptm_install_commands(); snprintf(buf, sizeof(buf), "%s", FRR_PTM_NAME); ptm_hdl = ptm_lib_register(buf, NULL, zebra_ptm_handle_msg_cb, @@ -273,38 +269,6 @@ void zebra_global_ptm_disable(void) zebra_ptm_reset_status(1); } -DEFUN_YANG (zebra_ptm_enable, - zebra_ptm_enable_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, - no_zebra_ptm_enable_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 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, "ptm-enable\n"); - else if (show_defaults) - vty_out(vty, "no ptm-enable\n"); -} - void zebra_if_ptm_enable(struct interface *ifp) { struct zebra_if *if_data; @@ -356,49 +320,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; - - dnode = yang_dnode_get(running_config->dnode, - "/frr-zebra:zebra/ptm-enable"); - if (dnode) - nb_cli_show_dnode_cmds(vty, dnode, false); -} - static int zebra_ptm_socket_init(void) { int ret; @@ -439,14 +360,6 @@ static int zebra_ptm_socket_init(void) return sock; } -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. */ static void if_bfd_session_update(struct interface *ifp, struct prefix *dp, struct prefix *sp, int status, @@ -1572,11 +1485,6 @@ void zebra_ptm_show_status(struct vty *vty __attribute__((__unused__)), /* NOTHING */ } -void zebra_ptm_write(struct vty *vty __attribute__((__unused__))) -{ - /* NOTHING */ -} - void zebra_ptm_if_set_ptm_state(struct interface *i __attribute__((__unused__)), struct zebra_if *zi __attribute__((__unused__))) { diff --git a/zebra/zebra_ptm.h b/zebra/zebra_ptm.h index 2e4afa5cf939..20a53e2fea46 100644 --- a/zebra/zebra_ptm.h +++ b/zebra/zebra_ptm.h @@ -58,7 +58,6 @@ struct zebra_ptm_cb { void zebra_ptm_init(void); void zebra_ptm_finish(void); void zebra_ptm_connect(struct event *t); -void zebra_ptm_write(struct vty *vty); int zebra_ptm_get_enable_state(void); #if HAVE_BFDD == 0 diff --git a/zebra/zebra_routemap.c b/zebra/zebra_routemap.c index 45379a22a891..95da7891083e 100644 --- a/zebra/zebra_routemap.c +++ b/zebra/zebra_routemap.c @@ -14,7 +14,6 @@ #include "filter.h" #include "plist.h" #include "nexthop.h" -#include "northbound_cli.h" #include "lib/route_types.h" #include "vrf.h" #include "frrstr.h" @@ -25,7 +24,6 @@ #include "zebra/zebra_rnh.h" #include "zebra/zebra_routemap.h" #include "zebra/zebra_vrf.h" -#include "zebra/zebra_nb.h" #include "zebra/zebra_routemap_clippy.c" @@ -389,342 +387,7 @@ int ip_nht_rm_del(struct zebra_vrf *zvrf, const char *rmap, int rtype, int afi) return CMD_SUCCESS; } -DEFPY_YANG( - match_ip_address_prefix_len, match_ip_address_prefix_len_cmd, - "match ip address prefix-len (0-32)$length", - MATCH_STR - IP_STR - "Match prefix length of IP address\n" - "Match prefix length of IP address\n" - "Prefix length\n") -{ - const char *xpath = - "./match-condition[condition='frr-zebra-route-map:ipv4-prefix-length']"; - char xpath_value[XPATH_MAXLEN]; - - nb_cli_enqueue_change(vty, xpath, NB_OP_CREATE, NULL); - snprintf( - xpath_value, sizeof(xpath_value), - "%s/rmap-match-condition/frr-zebra-route-map:ipv4-prefix-length", - xpath); - nb_cli_enqueue_change(vty, xpath_value, NB_OP_MODIFY, length_str); - - return nb_cli_apply_changes(vty, NULL); -} - -DEFPY_YANG( - no_match_ip_address_prefix_len, no_match_ip_address_prefix_len_cmd, - "no match ip address prefix-len [(0-32)]", - NO_STR - MATCH_STR - IP_STR - "Match prefix length of IP address\n" - "Match prefix length of IP address\n" - "Prefix length\n") -{ - const char *xpath = - "./match-condition[condition='frr-zebra-route-map:ipv4-prefix-length']"; - - nb_cli_enqueue_change(vty, xpath, NB_OP_DESTROY, NULL); - - return nb_cli_apply_changes(vty, NULL); -} - -DEFPY_YANG( - match_ipv6_address_prefix_len, match_ipv6_address_prefix_len_cmd, - "match ipv6 address prefix-len (0-128)$length", - MATCH_STR - IPV6_STR - "Match prefix length of IPv6 address\n" - "Match prefix length of IPv6 address\n" - "Prefix length\n") -{ - const char *xpath = - "./match-condition[condition='frr-zebra-route-map:ipv6-prefix-length']"; - char xpath_value[XPATH_MAXLEN]; - - nb_cli_enqueue_change(vty, xpath, NB_OP_CREATE, NULL); - snprintf( - xpath_value, sizeof(xpath_value), - "%s/rmap-match-condition/frr-zebra-route-map:ipv6-prefix-length", - xpath); - nb_cli_enqueue_change(vty, xpath_value, NB_OP_MODIFY, length_str); - - return nb_cli_apply_changes(vty, NULL); -} - -DEFPY_YANG( - no_match_ipv6_address_prefix_len, no_match_ipv6_address_prefix_len_cmd, - "no match ipv6 address prefix-len [(0-128)]", - NO_STR - MATCH_STR - IPV6_STR - "Match prefix length of IPv6 address\n" - "Match prefix length of IPv6 address\n" - "Prefix length\n") -{ - const char *xpath = - "./match-condition[condition='frr-zebra-route-map:ipv6-prefix-length']"; - - nb_cli_enqueue_change(vty, xpath, NB_OP_DESTROY, NULL); - - return nb_cli_apply_changes(vty, NULL); -} - -DEFPY_YANG( - match_ip_nexthop_prefix_len, match_ip_nexthop_prefix_len_cmd, - "match ip next-hop prefix-len (0-32)$length", - MATCH_STR - IP_STR - "Match prefixlen of nexthop IP address\n" - "Match prefixlen of given nexthop\n" - "Prefix length\n") -{ - const char *xpath = - "./match-condition[condition='frr-zebra-route-map:ipv4-next-hop-prefix-length']"; - char xpath_value[XPATH_MAXLEN]; - - nb_cli_enqueue_change(vty, xpath, NB_OP_CREATE, NULL); - snprintf( - xpath_value, sizeof(xpath_value), - "%s/rmap-match-condition/frr-zebra-route-map:ipv4-prefix-length", - xpath); - nb_cli_enqueue_change(vty, xpath_value, NB_OP_MODIFY, length_str); - - return nb_cli_apply_changes(vty, NULL); -} - -DEFPY_YANG( - no_match_ip_nexthop_prefix_len, no_match_ip_nexthop_prefix_len_cmd, - "no match ip next-hop prefix-len [(0-32)]", - NO_STR - MATCH_STR - IP_STR - "Match prefixlen of nexthop IP address\n" - "Match prefix length of nexthop\n" - "Prefix length\n") -{ - const char *xpath = - "./match-condition[condition='frr-zebra-route-map:ipv4-next-hop-prefix-length']"; - - nb_cli_enqueue_change(vty, xpath, NB_OP_DESTROY, NULL); - - return nb_cli_apply_changes(vty, NULL); -} - -DEFPY_YANG( - match_source_protocol, match_source_protocol_cmd, - "match source-protocol " FRR_REDIST_STR_ZEBRA "$proto", - MATCH_STR - "Match protocol via which the route was learnt\n" - FRR_REDIST_HELP_STR_ZEBRA) -{ - const char *xpath = - "./match-condition[condition='frr-zebra-route-map:source-protocol']"; - char xpath_value[XPATH_MAXLEN]; - - nb_cli_enqueue_change(vty, xpath, NB_OP_CREATE, NULL); - snprintf(xpath_value, sizeof(xpath_value), - "%s/rmap-match-condition/frr-zebra-route-map:source-protocol", - xpath); - nb_cli_enqueue_change(vty, xpath_value, NB_OP_MODIFY, proto); - - return nb_cli_apply_changes(vty, NULL); -} - -DEFPY_YANG( - no_match_source_protocol, no_match_source_protocol_cmd, - "no match source-protocol [" FRR_REDIST_STR_ZEBRA "]", - NO_STR - MATCH_STR - "Match protocol via which the route was learnt\n" - FRR_REDIST_HELP_STR_ZEBRA) -{ - const char *xpath = - "./match-condition[condition='frr-zebra-route-map:source-protocol']"; - - nb_cli_enqueue_change(vty, xpath, NB_OP_DESTROY, NULL); - - return nb_cli_apply_changes(vty, NULL); -} - -DEFPY_YANG( - match_source_instance, match_source_instance_cmd, - "match source-instance (0-255)$instance", - MATCH_STR - "Match the protocol's instance number\n" - "The instance number\n") -{ - const char *xpath = - "./match-condition[condition='frr-zebra-route-map:source-instance']"; - char xpath_value[XPATH_MAXLEN]; - - nb_cli_enqueue_change(vty, xpath, NB_OP_CREATE, NULL); - snprintf(xpath_value, sizeof(xpath_value), - "%s/rmap-match-condition/frr-zebra-route-map:source-instance", - xpath); - nb_cli_enqueue_change(vty, xpath_value, NB_OP_MODIFY, instance_str); - - return nb_cli_apply_changes(vty, NULL); -} - -DEFPY_YANG( - no_match_source_instance, no_match_source_instance_cmd, - "no match source-instance [(0-255)]", - NO_STR MATCH_STR - "Match the protocol's instance number\n" - "The instance number\n") -{ - const char *xpath = - "./match-condition[condition='frr-zebra-route-map:source-instance']"; - - nb_cli_enqueue_change(vty, xpath, NB_OP_DESTROY, NULL); - - return nb_cli_apply_changes(vty, NULL); -} - -/* set functions */ - -DEFPY_YANG( - set_src, set_src_cmd, - "set src ", - SET_STR - "src address for route\n" - "IPv4 src address\n" - "IPv6 src address\n") -{ - const char *xpath = - "./set-action[action='frr-zebra-route-map:src-address']"; - char xpath_value[XPATH_MAXLEN]; - - nb_cli_enqueue_change(vty, xpath, NB_OP_CREATE, NULL); - if (addrv4_str) { - snprintf( - xpath_value, sizeof(xpath_value), - "%s/rmap-set-action/frr-zebra-route-map:ipv4-src-address", - xpath); - nb_cli_enqueue_change(vty, xpath_value, NB_OP_MODIFY, - addrv4_str); - } else { - snprintf( - xpath_value, sizeof(xpath_value), - "%s/rmap-set-action/frr-zebra-route-map:ipv6-src-address", - xpath); - nb_cli_enqueue_change(vty, xpath_value, NB_OP_MODIFY, - addrv6_str); - } - - return nb_cli_apply_changes(vty, NULL); -} - -DEFPY_YANG( - no_set_src, no_set_src_cmd, - "no set src []", - NO_STR - SET_STR - "Source address for route\n" - "IPv4 address\n" - "IPv6 address\n") -{ - const char *xpath = - "./set-action[action='frr-zebra-route-map:src-address']"; - - nb_cli_enqueue_change(vty, xpath, NB_OP_DESTROY, NULL); - - return nb_cli_apply_changes(vty, NULL); -} - -DEFPY_YANG (zebra_route_map_timer, - zebra_route_map_timer_cmd, - "zebra route-map delay-timer (0-600)$delay", - ZEBRA_STR - "Set route-map parameters\n" - "Time to wait before route-map updates are processed\n" - "0 means route-map changes are run immediately instead of delaying\n") -{ - nb_cli_enqueue_change(vty, "/frr-zebra:zebra/route-map-delay", - NB_OP_MODIFY, delay_str); - return nb_cli_apply_changes(vty, NULL); -} - -DEFPY_YANG (no_zebra_route_map_timer, - no_zebra_route_map_timer_cmd, - "no zebra route-map delay-timer [(0-600)]", - NO_STR - ZEBRA_STR - "Set route-map parameters\n" - "Reset delay-timer to default value, 30 secs\n" - "0 means route-map changes are run immediately instead of delaying\n") -{ - nb_cli_enqueue_change(vty, "/frr-zebra:zebra/route-map-delay", - NB_OP_DESTROY, NULL); - return nb_cli_apply_changes(vty, NULL); -} - -void zebra_route_map_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, "zebra route-map delay-timer %u\n", delay); -} - -DEFPY_YANG (ip_protocol, - ip_protocol_cmd, - "ip protocol " FRR_IP_PROTOCOL_MAP_STR_ZEBRA - " $proto route-map ROUTE-MAP$rmap", - IP_STR - "Filter routing info exchanged between zebra and protocol\n" - FRR_IP_PROTOCOL_MAP_HELP_STR_ZEBRA - "Specify route-map\n" - "Route map name\n") -{ - nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); - nb_cli_enqueue_change(vty, "./route-map", NB_OP_MODIFY, rmap); - - if (vty->node == CONFIG_NODE) - return nb_cli_apply_changes( - vty, - "/frr-vrf:lib/vrf[name='%s']/frr-zebra:zebra/filter-protocol[afi-safi='%s'][protocol='%s']", - VRF_DEFAULT_NAME, - yang_afi_safi_value2identity(AFI_IP, SAFI_UNICAST), - proto); - - return nb_cli_apply_changes( - vty, - "./frr-zebra:zebra/filter-protocol[afi-safi='%s'][protocol='%s']", - yang_afi_safi_value2identity(AFI_IP, SAFI_UNICAST), proto); -} - -DEFPY_YANG (no_ip_protocol, - no_ip_protocol_cmd, - "no ip protocol " FRR_IP_PROTOCOL_MAP_STR_ZEBRA - " $proto [route-map ROUTE-MAP$rmap]", - NO_STR - IP_STR - "Stop filtering routing info between zebra and protocol\n" - FRR_IP_PROTOCOL_MAP_HELP_STR_ZEBRA - "Specify route-map\n" - "Route map name\n") -{ - nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); - - if (vty->node == CONFIG_NODE) - return nb_cli_apply_changes( - vty, - "/frr-vrf:lib/vrf[name='%s']/frr-zebra:zebra/filter-protocol[afi-safi='%s'][protocol='%s']", - VRF_DEFAULT_NAME, - yang_afi_safi_value2identity(AFI_IP, SAFI_UNICAST), - proto); - - return nb_cli_apply_changes( - vty, - "./frr-zebra:zebra/filter-protocol[afi-safi='%s'][protocol='%s']", - yang_afi_safi_value2identity(AFI_IP, SAFI_UNICAST), proto); -} - -DEFPY_YANG (show_ip_protocol, +DEFPY (show_ip_protocol, show_ip_protocol_cmd, "show ip protocol [vrf ]", SHOW_STR @@ -737,61 +400,7 @@ DEFPY_YANG (show_ip_protocol, return ret; } -DEFPY_YANG (ipv6_protocol, - ipv6_protocol_cmd, - "ipv6 protocol " FRR_IP6_PROTOCOL_MAP_STR_ZEBRA - " $proto route-map ROUTE-MAP$rmap", - IP6_STR - "Filter IPv6 routing info exchanged between zebra and protocol\n" - FRR_IP6_PROTOCOL_MAP_HELP_STR_ZEBRA - "Specify route-map\n" - "Route map name\n") -{ - nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); - nb_cli_enqueue_change(vty, "./route-map", NB_OP_MODIFY, rmap); - - if (vty->node == CONFIG_NODE) - return nb_cli_apply_changes( - vty, - "/frr-vrf:lib/vrf[name='%s']/frr-zebra:zebra/filter-protocol[afi-safi='%s'][protocol='%s']", - VRF_DEFAULT_NAME, - yang_afi_safi_value2identity(AFI_IP6, SAFI_UNICAST), - proto); - - return nb_cli_apply_changes( - vty, - "./frr-zebra:zebra/filter-protocol[afi-safi='%s'][protocol='%s']", - yang_afi_safi_value2identity(AFI_IP6, SAFI_UNICAST), proto); -} - -DEFPY_YANG (no_ipv6_protocol, - no_ipv6_protocol_cmd, - "no ipv6 protocol " FRR_IP6_PROTOCOL_MAP_STR_ZEBRA - " $proto [route-map ROUTE-MAP$rmap]", - NO_STR - IP6_STR - "Stop filtering IPv6 routing info between zebra and protocol\n" - FRR_IP6_PROTOCOL_MAP_HELP_STR_ZEBRA - "Specify route-map\n" - "Route map name\n") -{ - nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); - - if (vty->node == CONFIG_NODE) - return nb_cli_apply_changes( - vty, - "/frr-vrf:lib/vrf[name='%s']/frr-zebra:zebra/filter-protocol[afi-safi='%s'][protocol='%s']", - VRF_DEFAULT_NAME, - yang_afi_safi_value2identity(AFI_IP6, SAFI_UNICAST), - proto); - - return nb_cli_apply_changes( - vty, - "./frr-zebra:zebra/filter-protocol[afi-safi='%s'][protocol='%s']", - yang_afi_safi_value2identity(AFI_IP6, SAFI_UNICAST), proto); -} - -DEFPY_YANG (show_ipv6_protocol, +DEFPY (show_ipv6_protocol, show_ipv6_protocol_cmd, "show ipv6 protocol [vrf ]", SHOW_STR @@ -804,84 +413,7 @@ DEFPY_YANG (show_ipv6_protocol, return ret; } -void lib_vrf_zebra_filter_protocol_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults) -{ - const char *afi_safi = yang_dnode_get_string(dnode, "afi-safi"); - const char *proto = yang_dnode_get_string(dnode, "protocol"); - const char *rmap = yang_dnode_get_string(dnode, "route-map"); - afi_t afi; - safi_t safi; - - yang_afi_safi_identity2value(afi_safi, &afi, &safi); - - if (safi != SAFI_UNICAST) - return; - - zebra_vrf_indent_cli_write(vty, dnode); - - if (afi == AFI_IP) - vty_out(vty, "ip protocol %s route-map %s\n", proto, rmap); - else - vty_out(vty, "ipv6 protocol %s route-map %s\n", proto, rmap); -} - -DEFPY_YANG (ip_protocol_nht_rmap, - ip_protocol_nht_rmap_cmd, - "ip nht " FRR_IP_PROTOCOL_MAP_STR_ZEBRA - " $proto route-map ROUTE-MAP$rmap", - IP_STR - "Filter Next Hop tracking route resolution\n" - FRR_IP_PROTOCOL_MAP_HELP_STR_ZEBRA - "Specify route map\n" - "Route map name\n") -{ - nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); - nb_cli_enqueue_change(vty, "./route-map", NB_OP_MODIFY, rmap); - - if (vty->node == CONFIG_NODE) - return nb_cli_apply_changes( - vty, - "/frr-vrf:lib/vrf[name='%s']/frr-zebra:zebra/filter-nht[afi-safi='%s'][protocol='%s']", - VRF_DEFAULT_NAME, - yang_afi_safi_value2identity(AFI_IP, SAFI_UNICAST), - proto); - - return nb_cli_apply_changes( - vty, - "./frr-zebra:zebra/filter-nht[afi-safi='%s'][protocol='%s']", - yang_afi_safi_value2identity(AFI_IP, SAFI_UNICAST), proto); -} - -DEFPY_YANG (no_ip_protocol_nht_rmap, - no_ip_protocol_nht_rmap_cmd, - "no ip nht " FRR_IP_PROTOCOL_MAP_STR_ZEBRA - " $proto [route-map ROUTE-MAP$rmap]", - NO_STR - IP_STR - "Filter Next Hop tracking route resolution\n" - FRR_IP_PROTOCOL_MAP_HELP_STR_ZEBRA - "Specify route map\n" - "Route map name\n") -{ - nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); - - if (vty->node == CONFIG_NODE) - return nb_cli_apply_changes( - vty, - "/frr-vrf:lib/vrf[name='%s']/frr-zebra:zebra/filter-nht[afi-safi='%s'][protocol='%s']", - VRF_DEFAULT_NAME, - yang_afi_safi_value2identity(AFI_IP, SAFI_UNICAST), - proto); - - return nb_cli_apply_changes( - vty, - "./frr-zebra:zebra/filter-nht[afi-safi='%s'][protocol='%s']", - yang_afi_safi_value2identity(AFI_IP, SAFI_UNICAST), proto); -} - -DEFPY_YANG (show_ip_protocol_nht, +DEFPY (show_ip_protocol_nht, show_ip_protocol_nht_cmd, "show ip nht route-map [vrf ] [json]", SHOW_STR @@ -900,61 +432,7 @@ DEFPY_YANG (show_ip_protocol_nht, return ret; } -DEFPY_YANG (ipv6_protocol_nht_rmap, - ipv6_protocol_nht_rmap_cmd, - "ipv6 nht " FRR_IP6_PROTOCOL_MAP_STR_ZEBRA - " $proto route-map ROUTE-MAP$rmap", - IP6_STR - "Filter Next Hop tracking route resolution\n" - FRR_IP6_PROTOCOL_MAP_HELP_STR_ZEBRA - "Specify route map\n" - "Route map name\n") -{ - nb_cli_enqueue_change(vty, ".", NB_OP_CREATE, NULL); - nb_cli_enqueue_change(vty, "./route-map", NB_OP_MODIFY, rmap); - - if (vty->node == CONFIG_NODE) - return nb_cli_apply_changes( - vty, - "/frr-vrf:lib/vrf[name='%s']/frr-zebra:zebra/filter-nht[afi-safi='%s'][protocol='%s']", - VRF_DEFAULT_NAME, - yang_afi_safi_value2identity(AFI_IP6, SAFI_UNICAST), - proto); - - return nb_cli_apply_changes( - vty, - "./frr-zebra:zebra/filter-nht[afi-safi='%s'][protocol='%s']", - yang_afi_safi_value2identity(AFI_IP6, SAFI_UNICAST), proto); -} - -DEFPY_YANG (no_ipv6_protocol_nht_rmap, - no_ipv6_protocol_nht_rmap_cmd, - "no ipv6 nht " FRR_IP6_PROTOCOL_MAP_STR_ZEBRA - " $proto [route-map ROUTE-MAP$rmap]", - NO_STR - IP6_STR - "Filter Next Hop tracking route resolution\n" - FRR_IP6_PROTOCOL_MAP_HELP_STR_ZEBRA - "Specify route map\n" - "Route map name\n") -{ - nb_cli_enqueue_change(vty, ".", NB_OP_DESTROY, NULL); - - if (vty->node == CONFIG_NODE) - return nb_cli_apply_changes( - vty, - "/frr-vrf:lib/vrf[name='%s']/frr-zebra:zebra/filter-nht[afi-safi='%s'][protocol='%s']", - VRF_DEFAULT_NAME, - yang_afi_safi_value2identity(AFI_IP6, SAFI_UNICAST), - proto); - - return nb_cli_apply_changes( - vty, - "./frr-zebra:zebra/filter-nht[afi-safi='%s'][protocol='%s']", - yang_afi_safi_value2identity(AFI_IP6, SAFI_UNICAST), proto); -} - -DEFPY_YANG (show_ipv6_protocol_nht, +DEFPY (show_ipv6_protocol_nht, show_ipv6_protocol_nht_cmd, "show ipv6 nht route-map [vrf ] [json]", SHOW_STR @@ -973,29 +451,6 @@ DEFPY_YANG (show_ipv6_protocol_nht, return ret; } -void lib_vrf_zebra_filter_nht_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults) -{ - const char *afi_safi = yang_dnode_get_string(dnode, "afi-safi"); - const char *proto = yang_dnode_get_string(dnode, "protocol"); - const char *rmap = yang_dnode_get_string(dnode, "route-map"); - afi_t afi; - safi_t safi; - - yang_afi_safi_identity2value(afi_safi, &afi, &safi); - - if (safi != SAFI_UNICAST) - return; - - zebra_vrf_indent_cli_write(vty, dnode); - - if (afi == AFI_IP) - vty_out(vty, "ip nht %s route-map %s\n", proto, rmap); - else - vty_out(vty, "ipv6 nht %s route-map %s\n", proto, rmap); -} - /*XXXXXXXXXXXXXXXXXXXXXXXXXXXX*/ /* `match ip next-hop IP_ACCESS_LIST' */ @@ -1897,30 +1352,12 @@ void zebra_routemap_vrf_delete(struct zebra_vrf *zvrf) void zebra_route_map_init(void) { - install_element(CONFIG_NODE, &ip_protocol_cmd); - install_element(CONFIG_NODE, &no_ip_protocol_cmd); - install_element(VRF_NODE, &ip_protocol_cmd); - install_element(VRF_NODE, &no_ip_protocol_cmd); install_element(VIEW_NODE, &show_ip_protocol_cmd); - install_element(CONFIG_NODE, &ipv6_protocol_cmd); - install_element(CONFIG_NODE, &no_ipv6_protocol_cmd); - install_element(VRF_NODE, &ipv6_protocol_cmd); - install_element(VRF_NODE, &no_ipv6_protocol_cmd); install_element(VIEW_NODE, &show_ipv6_protocol_cmd); - install_element(CONFIG_NODE, &ip_protocol_nht_rmap_cmd); - install_element(CONFIG_NODE, &no_ip_protocol_nht_rmap_cmd); - install_element(VRF_NODE, &ip_protocol_nht_rmap_cmd); - install_element(VRF_NODE, &no_ip_protocol_nht_rmap_cmd); install_element(VIEW_NODE, &show_ip_protocol_nht_cmd); - install_element(CONFIG_NODE, &ipv6_protocol_nht_rmap_cmd); - install_element(CONFIG_NODE, &no_ipv6_protocol_nht_rmap_cmd); - install_element(VRF_NODE, &ipv6_protocol_nht_rmap_cmd); - install_element(VRF_NODE, &no_ipv6_protocol_nht_rmap_cmd); install_element(VIEW_NODE, &show_ipv6_protocol_nht_cmd); - install_element(CONFIG_NODE, &zebra_route_map_timer_cmd); - install_element(CONFIG_NODE, &no_zebra_route_map_timer_cmd); - route_map_init(); + route_map_init_new(true); route_map_add_hook(zebra_route_map_add); route_map_delete_hook(zebra_route_map_delete); @@ -1974,19 +1411,4 @@ void zebra_route_map_init(void) /* */ route_map_install_set(&route_set_src_cmd); - /* */ - install_element(RMAP_NODE, &match_ip_nexthop_prefix_len_cmd); - install_element(RMAP_NODE, &no_match_ip_nexthop_prefix_len_cmd); - install_element(RMAP_NODE, &match_ip_address_prefix_len_cmd); - install_element(RMAP_NODE, &match_ipv6_address_prefix_len_cmd); - install_element(RMAP_NODE, &no_match_ipv6_address_prefix_len_cmd); - install_element(RMAP_NODE, &no_match_ip_address_prefix_len_cmd); - install_element(RMAP_NODE, &match_source_protocol_cmd); - install_element(RMAP_NODE, &no_match_source_protocol_cmd); - install_element(RMAP_NODE, &match_source_instance_cmd); - install_element(RMAP_NODE, &no_match_source_instance_cmd); - - /* */ - install_element(RMAP_NODE, &set_src_cmd); - install_element(RMAP_NODE, &no_set_src_cmd); } diff --git a/zebra/zebra_vrf.c b/zebra/zebra_vrf.c index e4bf6bad2c04..e464e47b1f0c 100644 --- a/zebra/zebra_vrf.c +++ b/zebra/zebra_vrf.c @@ -17,7 +17,6 @@ #include "srcdest_table.h" #include "vrf.h" #include "vty.h" -#include "northbound_cli.h" #include "zebra/zebra_router.h" #include "zebra/rtadv.h" @@ -34,7 +33,6 @@ #include "zebra/zebra_routemap.h" #include "zebra/zebra_vrf_clippy.c" #include "zebra/table_manager.h" -#include "zebra/zebra_nb.h" static void zebra_vrf_table_create(struct zebra_vrf *zvrf, afi_t afi, safi_t safi); @@ -452,53 +450,6 @@ struct route_table *zebra_vrf_table(afi_t afi, safi_t safi, vrf_id_t vrf_id) return zvrf->table[afi][safi]; } -void zebra_vrf_indent_cli_write(struct vty *vty, const struct lyd_node *dnode) -{ - const struct lyd_node *vrf = yang_dnode_get_parent(dnode, "vrf"); - - if (vrf && strcmp(yang_dnode_get_string(vrf, "name"), VRF_DEFAULT_NAME)) - vty_out(vty, " "); -} - -static int vrf_config_write_single(const struct lyd_node *dnode, void *arg) -{ - nb_cli_show_dnode_cmds(arg, dnode, false); - - return YANG_ITER_CONTINUE; -} - -static int vrf_config_write(struct vty *vty) -{ - const struct lyd_node *dnode; - - yang_dnode_iterate(vrf_config_write_single, vty, running_config->dnode, - "/frr-vrf:lib/vrf"); - dnode = yang_dnode_get(running_config->dnode, "/frr-zebra:zebra"); - if (dnode) - nb_cli_show_dnode_cmds(vty, dnode, false); - - return 1; -} - -DEFPY (vrf_netns, - vrf_netns_cmd, - "netns NAME$netns_name", - "Attach VRF to a Namespace\n" - "The file name in " NS_RUN_DIR ", or a full pathname\n") -{ - return CMD_SUCCESS; -} - -DEFUN (no_vrf_netns, - no_vrf_netns_cmd, - "no netns [NAME]", - NO_STR - "Detach VRF from a Namespace\n" - "The file name in " NS_RUN_DIR ", or a full pathname\n") -{ - return CMD_SUCCESS; -} - /* if ns_id is different and not VRF_UNKNOWN, * then update vrf identifier, and enable VRF */ @@ -597,12 +548,4 @@ void zebra_vrf_init(void) zebra_vrf_delete); hook_register(zserv_client_close, release_daemon_table_chunks); - - vrf_cmd_init(vrf_config_write); - - if (vrf_is_backend_netns() && ns_have_netns()) { - /* Install NS commands. */ - install_element(VRF_NODE, &vrf_netns_cmd); - install_element(VRF_NODE, &no_vrf_netns_cmd); - } } diff --git a/zebra/zebra_vrf.h b/zebra/zebra_vrf.h index cf9cbbe7b4f6..5cbfab1ddc0f 100644 --- a/zebra/zebra_vrf.h +++ b/zebra/zebra_vrf.h @@ -260,9 +260,6 @@ extern void zebra_vrf_init(void); extern void zebra_rtable_node_cleanup(struct route_table *table, struct route_node *node); -extern void zebra_vrf_indent_cli_write(struct vty *vty, - const struct lyd_node *dnode); - #ifdef __cplusplus } #endif diff --git a/zebra/zebra_vty.c b/zebra/zebra_vty.c index 2dbf9f5cad6b..70b71fe7070c 100644 --- a/zebra/zebra_vty.c +++ b/zebra/zebra_vty.c @@ -1164,23 +1164,6 @@ DEFPY (show_ip_nht, return CMD_SUCCESS; } -DEFUN (ip_nht_default_route, - ip_nht_default_route_cmd, - "ip nht resolve-via-default", - IP_STR - "Filter Next Hop tracking route resolution\n" - "Resolve via default route\n") -{ - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/resolve-via-default", - NB_OP_MODIFY, "true"); - - if (vty->node == CONFIG_NODE) - return nb_cli_apply_changes(vty, "/frr-vrf:lib/vrf[name='%s']", - VRF_DEFAULT_NAME); - - return nb_cli_apply_changes(vty, NULL); -} - static void show_nexthop_group_out(struct vty *vty, struct nhg_hash_entry *nhe, json_object *json_nhe_hdr) { @@ -1679,88 +1662,6 @@ DEFPY_HIDDEN(backup_nexthop_recursive_use_enable, return CMD_SUCCESS; } -DEFUN (no_ip_nht_default_route, - no_ip_nht_default_route_cmd, - "no ip nht resolve-via-default", - NO_STR - IP_STR - "Filter Next Hop tracking route resolution\n" - "Resolve via default route\n") -{ - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/resolve-via-default", - NB_OP_MODIFY, "false"); - - if (vty->node == CONFIG_NODE) - return nb_cli_apply_changes(vty, "/frr-vrf:lib/vrf[name='%s']", - VRF_DEFAULT_NAME); - - return nb_cli_apply_changes(vty, NULL); -} - -void lib_vrf_zebra_resolve_via_default_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults) -{ - bool resolve_via_default = yang_dnode_get_bool(dnode, NULL); - - if (resolve_via_default != SAVE_ZEBRA_IP_NHT_RESOLVE_VIA_DEFAULT || - show_defaults) { - zebra_vrf_indent_cli_write(vty, dnode); - - vty_out(vty, "%sip nht resolve-via-default\n", - resolve_via_default ? "" : "no "); - } -} - -DEFUN (ipv6_nht_default_route, - ipv6_nht_default_route_cmd, - "ipv6 nht resolve-via-default", - IP6_STR - "Filter Next Hop tracking route resolution\n" - "Resolve via default route\n") -{ - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/ipv6-resolve-via-default", - NB_OP_MODIFY, "true"); - - if (vty->node == CONFIG_NODE) - return nb_cli_apply_changes(vty, "/frr-vrf:lib/vrf[name='%s']", - VRF_DEFAULT_NAME); - - return nb_cli_apply_changes(vty, NULL); -} - -DEFUN (no_ipv6_nht_default_route, - no_ipv6_nht_default_route_cmd, - "no ipv6 nht resolve-via-default", - NO_STR - IP6_STR - "Filter Next Hop tracking route resolution\n" - "Resolve via default route\n") -{ - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/ipv6-resolve-via-default", - NB_OP_MODIFY, "false"); - - if (vty->node == CONFIG_NODE) - return nb_cli_apply_changes(vty, "/frr-vrf:lib/vrf[name='%s']", - VRF_DEFAULT_NAME); - - return nb_cli_apply_changes(vty, NULL); -} - -void lib_vrf_zebra_ipv6_resolve_via_default_cli_write( - struct vty *vty, const struct lyd_node *dnode, bool show_defaults) -{ - bool resolve_via_default = yang_dnode_get_bool(dnode, NULL); - - if (resolve_via_default != SAVE_ZEBRA_IP_NHT_RESOLVE_VIA_DEFAULT || - show_defaults) { - zebra_vrf_indent_cli_write(vty, dnode); - - vty_out(vty, "%sipv6 nht resolve-via-default\n", - resolve_via_default ? "" : "no "); - } -} - DEFPY_HIDDEN(rnh_hide_backups, rnh_hide_backups_cmd, "[no] ip nht hide-backup-events", NO_STR @@ -2744,69 +2645,6 @@ DEFPY(evpn_mh_redirect_off, evpn_mh_redirect_off_cmd, return zebra_evpn_mh_redirect_off(vty, redirect_off); } -DEFPY_YANG (vni_mapping, - vni_mapping_cmd, - "vni " CMD_VNI_RANGE "[prefix-routes-only$filter]", - "VNI corresponding to tenant VRF\n" - "VNI-ID\n" - "prefix-routes-only\n") -{ - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/l3vni-id", NB_OP_MODIFY, - vni_str); - - if (filter) - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/prefix-only", - NB_OP_MODIFY, "true"); - else - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/prefix-only", - NB_OP_DESTROY, NULL); - - if (vty->node == CONFIG_NODE) - return nb_cli_apply_changes(vty, "/frr-vrf:lib/vrf[name='%s']", - VRF_DEFAULT_NAME); - - return nb_cli_apply_changes(vty, NULL); -} - -DEFPY_YANG (no_vni_mapping, - no_vni_mapping_cmd, - "no vni [" CMD_VNI_RANGE "[prefix-routes-only$filter]]", - NO_STR - "VNI corresponding to tenant VRF\n" - "VNI-ID\n" - "prefix-routes-only\n") -{ - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/l3vni-id", NB_OP_DESTROY, - NULL); - - if (filter) - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/prefix-only", - NB_OP_DESTROY, NULL); - - if (vty->node == CONFIG_NODE) - return nb_cli_apply_changes(vty, "/frr-vrf:lib/vrf[name='%s']", - VRF_DEFAULT_NAME); - - return nb_cli_apply_changes(vty, NULL); -} - -void lib_vrf_zebra_l3vni_id_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults) -{ - vni_t vni = yang_dnode_get_uint32(dnode, NULL); - bool prefix_only = yang_dnode_get_bool(dnode, "../prefix-only"); - - zebra_vrf_indent_cli_write(vty, dnode); - - vty_out(vty, "vni %u", vni); - - if (prefix_only) - vty_out(vty, " prefix-routes-only"); - - vty_out(vty, "\n"); -} - /* show vrf */ DEFPY (show_vrf_vni, show_vrf_vni_cmd, @@ -3911,8 +3749,6 @@ DEFPY (zebra_nexthop_group_keep, static int config_write_protocol(struct vty *vty) { - zebra_ptm_write(vty); - if (zrouter.allow_delete) vty_out(vty, "allow-external-route-update\n"); @@ -4440,47 +4276,6 @@ DEFPY (no_zebra_protodown_bit, #endif /* HAVE_NETLINK */ -DEFPY_YANG (ip_table_range, ip_table_range_cmd, - "[no] ip table range ![(1-4294967295)$start (1-4294967295)$end]", - NO_STR IP_STR - "table configuration\n" - "Configure table range\n" - "Start Routing Table\n" - "End Routing Table\n") -{ - if (!no) { - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/netns/table-range", - NB_OP_CREATE, NULL); - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/netns/table-range/start", - NB_OP_MODIFY, start_str); - nb_cli_enqueue_change(vty, - "./frr-zebra:zebra/netns/table-range/end", - NB_OP_MODIFY, end_str); - } else { - nb_cli_enqueue_change(vty, "./frr-zebra:zebra/netns/table-range", - NB_OP_DESTROY, NULL); - } - - if (vty->node == CONFIG_NODE) - return nb_cli_apply_changes(vty, "/frr-vrf:lib/vrf[name='%s']", - VRF_DEFAULT_NAME); - - return nb_cli_apply_changes(vty, NULL); -} - -void lib_vrf_zebra_netns_table_range_cli_write(struct vty *vty, - const struct lyd_node *dnode, - bool show_defaults) -{ - uint32_t start = yang_dnode_get_uint32(dnode, "start"); - uint32_t end = yang_dnode_get_uint32(dnode, "end"); - - zebra_vrf_indent_cli_write(vty, dnode); - - vty_out(vty, "ip table range %u %u\n", start, end); -} - #ifdef HAVE_SCRIPTING DEFUN(zebra_on_rib_process_script, zebra_on_rib_process_script_cmd, @@ -4592,14 +4387,6 @@ void zebra_vty_init(void) install_element(VIEW_NODE, &show_ip_rpf_addr_cmd); install_element(VIEW_NODE, &show_ipv6_rpf_addr_cmd); - install_element(CONFIG_NODE, &ip_nht_default_route_cmd); - install_element(CONFIG_NODE, &no_ip_nht_default_route_cmd); - install_element(CONFIG_NODE, &ipv6_nht_default_route_cmd); - install_element(CONFIG_NODE, &no_ipv6_nht_default_route_cmd); - install_element(VRF_NODE, &ip_nht_default_route_cmd); - install_element(VRF_NODE, &no_ip_nht_default_route_cmd); - install_element(VRF_NODE, &ipv6_nht_default_route_cmd); - install_element(VRF_NODE, &no_ipv6_nht_default_route_cmd); install_element(CONFIG_NODE, &rnh_hide_backups_cmd); install_element(VIEW_NODE, &show_frr_cmd); @@ -4651,19 +4438,12 @@ void zebra_vty_init(void) install_element(CONFIG_NODE, &evpn_mh_neigh_holdtime_cmd); install_element(CONFIG_NODE, &evpn_mh_startup_delay_cmd); install_element(CONFIG_NODE, &evpn_mh_redirect_off_cmd); - install_element(CONFIG_NODE, &vni_mapping_cmd); - install_element(CONFIG_NODE, &no_vni_mapping_cmd); - install_element(VRF_NODE, &vni_mapping_cmd); - install_element(VRF_NODE, &no_vni_mapping_cmd); install_element(VIEW_NODE, &show_dataplane_cmd); install_element(VIEW_NODE, &show_dataplane_providers_cmd); install_element(CONFIG_NODE, &zebra_dplane_queue_limit_cmd); install_element(CONFIG_NODE, &no_zebra_dplane_queue_limit_cmd); - install_element(CONFIG_NODE, &ip_table_range_cmd); - install_element(VRF_NODE, &ip_table_range_cmd); - #ifdef HAVE_NETLINK install_element(CONFIG_NODE, &zebra_kernel_netlink_batch_tx_buf_cmd); install_element(CONFIG_NODE, &no_zebra_kernel_netlink_batch_tx_buf_cmd);