From 92de4c7fb6ff4fcff6542346381f89ecdc09bbd7 Mon Sep 17 00:00:00 2001 From: Igor Ryzhov Date: Wed, 21 Jul 2021 17:22:14 +0300 Subject: [PATCH 1/2] vtysh: fix exit from zebra-only nodes When exiting from link-params and pseudowire nodes, we were sending exit command to all VTYSH_INTERFACE daemons. This led to a desynchronized state in vtysh and daemons other then zebra. We must send exit command only to zebra. Signed-off-by: Igor Ryzhov --- vtysh/vtysh.c | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/vtysh/vtysh.c b/vtysh/vtysh.c index dd3f448674..0bc2c6ebd0 100644 --- a/vtysh/vtysh.c +++ b/vtysh/vtysh.c @@ -2803,6 +2803,18 @@ DEFUNSH(VTYSH_INTERFACE, vtysh_quit_interface, vtysh_quit_interface_cmd, "quit", return vtysh_exit_interface(self, vty, argc, argv); } +DEFUNSH(VTYSH_ZEBRA, vtysh_exit_pseudowire, vtysh_exit_pseudowire_cmd, "exit", + "Exit current mode and down to previous mode\n") +{ + return vtysh_exit(vty); +} + +DEFUNSH(VTYSH_ZEBRA, vtysh_quit_pseudowire, vtysh_quit_pseudowire_cmd, "quit", + "Exit current mode and down to previous mode\n") +{ + return vtysh_exit_pseudowire(self, vty, argc, argv); +} + static char *do_prepend(struct vty *vty, struct cmd_token **argv, int argc) { const char *argstr[argc + 1]; @@ -2907,6 +2919,20 @@ 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", + "Exit current mode and down to previous mode\n") +{ + if (vty->node == LINK_PARAMS_NODE) + vty->node = INTERFACE_NODE; + return CMD_SUCCESS; +} + +DEFUNSH(VTYSH_ZEBRA, 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); +} + DEFUNSH_HIDDEN (0x00, vtysh_debug_all, vtysh_debug_all_cmd, @@ -4445,13 +4471,14 @@ void vtysh_init_vty(void) install_element(INTERFACE_NODE, &vtysh_link_params_cmd); install_element(LINK_PARAMS_NODE, &exit_link_params_cmd); install_element(LINK_PARAMS_NODE, &vtysh_end_all_cmd); - install_element(LINK_PARAMS_NODE, &vtysh_exit_interface_cmd); + install_element(LINK_PARAMS_NODE, &vtysh_exit_link_params_cmd); + install_element(LINK_PARAMS_NODE, &vtysh_quit_link_params_cmd); install_node(&pw_node); install_element(CONFIG_NODE, &vtysh_pseudowire_cmd); install_element(PW_NODE, &vtysh_end_all_cmd); - install_element(PW_NODE, &vtysh_exit_interface_cmd); - install_element(PW_NODE, &vtysh_quit_interface_cmd); + install_element(PW_NODE, &vtysh_exit_pseudowire_cmd); + install_element(PW_NODE, &vtysh_quit_pseudowire_cmd); install_node(&vrf_node); install_element(CONFIG_NODE, &vtysh_vrf_cmd); From d9331fc67c3c68302930f64fada992512e18f7d2 Mon Sep 17 00:00:00 2001 From: Igor Ryzhov Date: Wed, 21 Jul 2021 17:23:45 +0300 Subject: [PATCH 2/2] lib, zebra: fix exit from link-params node When exiting from link-params node, we must not decrement xpath_index because it is not incremented when entering the node. Signed-off-by: Igor Ryzhov --- lib/command.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/command.c b/lib/command.c index 9dac60599c..fe17c68a8b 100644 --- a/lib/command.c +++ b/lib/command.c @@ -160,6 +160,9 @@ static bool vty_check_node_for_xpath_decrement(enum node_type target_node, || node == BGP_FLOWSPECV6_NODE)) return false; + if (target_node == INTERFACE_NODE && node == LINK_PARAMS_NODE) + return false; + return true; }