]> git.puffer.fish Git - matthieu/frr.git/commitdiff
*: move CLI parent data to cmd_node->parent_node
authorDavid Lamparter <equinox@opensourcerouting.org>
Sat, 8 Sep 2018 21:15:09 +0000 (23:15 +0200)
committerDavid Lamparter <equinox@diac24.net>
Thu, 16 Apr 2020 10:53:00 +0000 (12:53 +0200)
Same as before, instead of shoving this into a big central list we can
just put the parent node in cmd_node.

Signed-off-by: David Lamparter <equinox@diac24.net>
34 files changed:
babeld/babel_interface.c
babeld/babeld.c
bfdd/bfdd_vty.c
bgpd/bgp_bmp.c
bgpd/bgp_rpki.c
bgpd/bgp_vty.c
bgpd/rfapi/bgp_rfapi_cfg.c
eigrpd/eigrp_cli.c
isisd/isis_circuit.c
isisd/isisd.c
ldpd/ldp_vty_conf.c
lib/command.c
lib/command.h
lib/keychain.c
lib/nexthop_group.c
lib/routemap_cli.c
lib/vrf.c
lib/vty.c
nhrpd/nhrp_vty.c
ospf6d/ospf6_interface.c
ospf6d/ospf6_top.c
ospfd/ospf_vty.c
pbrd/pbr_vty.c
pimd/pim_cmd.c
ripd/rip_interface.c
ripd/ripd.c
ripngd/ripng_interface.c
ripngd/ripngd.c
tests/lib/cli/test_commands.c
vrrpd/vrrp_vty.c
vtysh/vtysh.c
zebra/interface.c
zebra/zebra_fpm.c
zebra/zebra_pw.c

index 4360ec8e8862b9303c9b4e4f8596dad0f0e9d68f..072ad7060a9ccea24354f10306df11a542fb0257 100644 (file)
@@ -61,6 +61,7 @@ static vector babel_enable_if;                 /* enable interfaces (by cmd). */
 static int interface_config_write(struct vty *vty);
 static struct cmd_node babel_interface_node = {
     .node = INTERFACE_NODE,
+    .parent_node = CONFIG_NODE,
     .prompt = "%s(config-if)# ",
     .config_write = interface_config_write,
 };
index 2eaa9c9681567c11521dffcbbf7c77626cb302ef..6a83fa102ec1a010f43089edbec878990a8267e5 100644 (file)
@@ -73,6 +73,7 @@ static int babel_config_write (struct vty *vty);
 static struct cmd_node cmd_babel_node =
 {
     .node   = BABEL_NODE,
+    .parent_node = CONFIG_NODE,
     .prompt = "%s(config-router)# ",
     .config_write = babel_config_write,
 };
index 62a0016a137d3de4d085eb924a722f9bd03229dc..5a4ce22b220f709f027c7873422b539e43bfd655 100644 (file)
@@ -888,12 +888,14 @@ DEFUN_NOSH(show_debugging_bfd,
 static int bfdd_write_config(struct vty *vty);
 struct cmd_node bfd_node = {
        .node = BFD_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-bfd)# ",
        .config_write = bfdd_write_config,
 };
 
 struct cmd_node bfd_peer_node = {
        .node = BFD_PEER_NODE,
+       .parent_node = BFD_NODE,
        .prompt = "%s(config-bfd-peer)# ",
 };
 
index 7a97ff19dc52119268106c4bb5f06ff3b6f2d399..0a0271dd199a622bbfd188f3a90d82e0bd1d78d3 100644 (file)
@@ -1774,6 +1774,7 @@ static void bmp_active_setup(struct bmp_active *ba)
 
 static struct cmd_node bmp_node = {
        .node = BMP_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-bgp-bmp)# "
 };
 
index 9bffa65c4ec569494d06c9ca910844e7ab528f03..2d11718b5837c236af673025c88c59bac4e074ae 100644 (file)
@@ -145,6 +145,7 @@ static int rpki_sync_socket_bgpd;
 
 static struct cmd_node rpki_node = {
        .node = RPKI_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-rpki)# ",
        .config_write = config_write,
 };
index 78cbe250c5861e39d3c28085fe8562a750f72dfe..e44f5151874ee9c1c2d8c2665fd37c894636fd45 100644 (file)
@@ -15336,67 +15336,80 @@ int bgp_config_write(struct vty *vty)
 /* BGP node structure. */
 static struct cmd_node bgp_node = {
        .node = BGP_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-router)# ",
        .config_write = bgp_config_write,
 };
 
 static struct cmd_node bgp_ipv4_unicast_node = {
        .node = BGP_IPV4_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-router-af)# ",
 };
 
 static struct cmd_node bgp_ipv4_multicast_node = {
        .node = BGP_IPV4M_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-router-af)# ",
 };
 
 static struct cmd_node bgp_ipv4_labeled_unicast_node = {
        .node = BGP_IPV4L_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-router-af)# ",
 };
 
 static struct cmd_node bgp_ipv6_unicast_node = {
        .node = BGP_IPV6_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-router-af)# ",
 };
 
 static struct cmd_node bgp_ipv6_multicast_node = {
        .node = BGP_IPV6M_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-router-af)# ",
 };
 
 static struct cmd_node bgp_ipv6_labeled_unicast_node = {
        .node = BGP_IPV6L_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-router-af)# ",
 };
 
 static struct cmd_node bgp_vpnv4_node = {
        .node = BGP_VPNV4_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-router-af)# ",
 };
 
 static struct cmd_node bgp_vpnv6_node = {
        .node = BGP_VPNV6_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-router-af-vpnv6)# ",
 };
 
 static struct cmd_node bgp_evpn_node = {
        .node = BGP_EVPN_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-router-evpn)# ",
 };
 
 static struct cmd_node bgp_evpn_vni_node = {
        .node = BGP_EVPN_VNI_NODE,
+       .parent_node = BGP_EVPN_NODE,
        .prompt = "%s(config-router-af-vni)# ",
 };
 
 static struct cmd_node bgp_flowspecv4_node = {
        .node = BGP_FLOWSPECV4_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-router-af)# ",
 };
 
 static struct cmd_node bgp_flowspecv6_node = {
        .node = BGP_FLOWSPECV6_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-router-af-vpnv6)# ",
 };
 
index 38d4ff9a4f984dab794ebc689039e9b87a862446..929165aa66e5aa0e230ff0e8d7a1863a0456d099 100644 (file)
@@ -2966,11 +2966,13 @@ DEFUN_NOSH (exit_vnc,
 
 static struct cmd_node bgp_vnc_defaults_node = {
        .node = BGP_VNC_DEFAULTS_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-router-vnc-defaults)# ",
 };
 
 static struct cmd_node bgp_vnc_nve_group_node = {
        .node = BGP_VNC_NVE_GROUP_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-router-vnc-nve-group)# ",
 };
 
@@ -3393,6 +3395,7 @@ DEFUN_NOSH (exit_vrf_policy,
 
 static struct cmd_node bgp_vrf_policy_node = {
        .node = BGP_VRF_POLICY_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-router-vrf-policy)# ",
 };
 
@@ -3631,6 +3634,7 @@ DEFUN (vnc_l2_group_rt,
 
 static struct cmd_node bgp_vnc_l2_group_node = {
        .node = BGP_VNC_L2_GROUP_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-router-vnc-l2-group)# ",
 };
 
index 51119528605ecbcaee78bb5ae96690d6dd699f78..502d29ebf92d3c5cc044816625bc3bb1e0bf9816 100644 (file)
@@ -841,6 +841,7 @@ void eigrp_cli_show_keychain(struct vty *vty, struct lyd_node *dnode,
 static int eigrp_config_write(struct vty *vty);
 static struct cmd_node eigrp_node = {
        .node = EIGRP_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-router)# ",
        .config_write = eigrp_config_write,
 };
@@ -862,6 +863,7 @@ static int eigrp_config_write(struct vty *vty)
 static int eigrp_write_interface(struct vty *vty);
 static struct cmd_node eigrp_interface_node = {
        .node = INTERFACE_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-if)# ",
        .config_write = eigrp_write_interface,
 };
index 10874fad31abbda9d62ad11da890bad4ef878c0e..47e91ac1077a46ff018154e9972804c83f372c92 100644 (file)
@@ -1336,6 +1336,7 @@ ferr_r isis_circuit_passwd_hmac_md5_set(struct isis_circuit *circuit,
 
 struct cmd_node interface_node = {
        .node = INTERFACE_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-if)# ",
        .config_write = isis_interface_config_write,
 };
index 29d7f914f9685822b1da9bad1012b4440a000019..a776e2da0a61f98b9177112952954166c6dd13aa 100644 (file)
@@ -2147,6 +2147,7 @@ static int isis_config_write(struct vty *vty)
 
 struct cmd_node router_node = {
        .node = ROUTER_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-router)# ",
        .config_write = isis_config_write,
 };
index 69aa3220bccc7ba5a9c1d05dfc0cce930e19fe47..ca82263b7dae6b724fb54bc45ecd195a7797bd76 100644 (file)
@@ -41,38 +41,45 @@ static int   ldp_iface_is_configured(struct ldpd_conf *, const char *);
 
 struct cmd_node ldp_node = {
        .node = LDP_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-ldp)# ",
        .config_write = ldp_config_write,
 };
 
 struct cmd_node ldp_ipv4_node = {
        .node = LDP_IPV4_NODE,
+       .parent_node = LDP_NODE,
        .prompt = "%s(config-ldp-af)# ",
 };
 
 struct cmd_node ldp_ipv6_node = {
        .node = LDP_IPV6_NODE,
+       .parent_node = LDP_NODE,
        .prompt = "%s(config-ldp-af)# ",
 };
 
 struct cmd_node ldp_ipv4_iface_node = {
        .node = LDP_IPV4_IFACE_NODE,
+       .parent_node = LDP_IPV4_NODE,
        .prompt = "%s(config-ldp-af-if)# ",
 };
 
 struct cmd_node ldp_ipv6_iface_node = {
        .node = LDP_IPV6_IFACE_NODE,
+       .parent_node = LDP_IPV6_NODE,
        .prompt = "%s(config-ldp-af-if)# ",
 };
 
 struct cmd_node ldp_l2vpn_node = {
        .node = LDP_L2VPN_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-l2vpn)# ",
        .config_write = ldp_l2vpn_config_write,
 };
 
 struct cmd_node ldp_pseudowire_node = {
        .node = LDP_PSEUDOWIRE_NODE,
+       .parent_node = LDP_L2VPN_NODE,
        .prompt = "%s(config-l2vpn-pw)# ",
 };
 
index 7d46202da86a6c8a5f8fc8c9083870ae3a85a567..dad35bfbf86fffb5e705154a84fd514292b6df54 100644 (file)
@@ -203,6 +203,7 @@ static struct cmd_node enable_node = {
 static int config_write_host(struct vty *vty);
 static struct cmd_node config_node = {
        .node = CONFIG_NODE,
+       .parent_node = ENABLE_NODE,
        .prompt = "%s(config)# ",
        .config_write = config_write_host,
 };
@@ -1458,6 +1459,8 @@ DEFUN (config_exit,
 
 void cmd_exit(struct vty *vty)
 {
+       struct cmd_node *cnode = vector_lookup(cmdvec, vty->node);
+
        switch (vty->node) {
        case VIEW_NODE:
        case ENABLE_NODE:
@@ -1470,73 +1473,9 @@ void cmd_exit(struct vty *vty)
                vty->node = ENABLE_NODE;
                vty_config_exit(vty);
                break;
-       case INTERFACE_NODE:
-       case PW_NODE:
-       case VRF_NODE:
-       case NH_GROUP_NODE:
-       case ZEBRA_NODE:
-       case BGP_NODE:
-       case RIP_NODE:
-       case EIGRP_NODE:
-       case BABEL_NODE:
-       case RIPNG_NODE:
-       case OSPF_NODE:
-       case OSPF6_NODE:
-       case LDP_NODE:
-       case LDP_L2VPN_NODE:
-       case ISIS_NODE:
-       case OPENFABRIC_NODE:
-       case KEYCHAIN_NODE:
-       case RMAP_NODE:
-       case PBRMAP_NODE:
-       case VTY_NODE:
-       case BFD_NODE:
-               vty->node = CONFIG_NODE;
-               break;
-       case BGP_IPV4_NODE:
-       case BGP_IPV4M_NODE:
-       case BGP_IPV4L_NODE:
-       case BGP_VPNV4_NODE:
-       case BGP_VPNV6_NODE:
-       case BGP_FLOWSPECV4_NODE:
-       case BGP_FLOWSPECV6_NODE:
-       case BGP_VRF_POLICY_NODE:
-       case BGP_VNC_DEFAULTS_NODE:
-       case BGP_VNC_NVE_GROUP_NODE:
-       case BGP_VNC_L2_GROUP_NODE:
-       case BGP_IPV6_NODE:
-       case BGP_IPV6M_NODE:
-       case BGP_EVPN_NODE:
-       case BGP_IPV6L_NODE:
-       case BMP_NODE:
-               vty->node = BGP_NODE;
-               break;
-       case BGP_EVPN_VNI_NODE:
-               vty->node = BGP_EVPN_NODE;
-               break;
-       case LDP_IPV4_NODE:
-       case LDP_IPV6_NODE:
-               vty->node = LDP_NODE;
-               break;
-       case LDP_IPV4_IFACE_NODE:
-               vty->node = LDP_IPV4_NODE;
-               break;
-       case LDP_IPV6_IFACE_NODE:
-               vty->node = LDP_IPV6_NODE;
-               break;
-       case LDP_PSEUDOWIRE_NODE:
-               vty->node = LDP_L2VPN_NODE;
-               break;
-       case KEYCHAIN_KEY_NODE:
-               vty->node = KEYCHAIN_NODE;
-               break;
-       case LINK_PARAMS_NODE:
-               vty->node = INTERFACE_NODE;
-               break;
-       case BFD_PEER_NODE:
-               vty->node = BFD_NODE;
-               break;
        default:
+               if (cnode->parent_node)
+                       vty->node = cnode->parent_node;
                break;
        }
 
@@ -1564,7 +1503,6 @@ DEFUN (config_end,
                vty_config_exit(vty);
                vty->node = ENABLE_NODE;
        }
-
        return CMD_SUCCESS;
 }
 
index ed7706c3092b205c6bcea5929b802522a87246fa..c1de67e10fd2c471527479f6d9eaa2f635576a9b 100644 (file)
@@ -172,6 +172,7 @@ extern const char *const node_names[];
 struct cmd_node {
        /* Node index. */
        enum node_type node;
+       enum node_type parent_node;
 
        /* Prompt character at vty interface. */
        const char *prompt;
index bbe2070b1d255e3a3ac8c012afd2d726dbad7960..bfeaa7fec237d7b1284757bed86a592b9d68b09e 100644 (file)
@@ -962,12 +962,14 @@ DEFUN (no_send_lifetime,
 static int keychain_config_write(struct vty *vty);
 static struct cmd_node keychain_node = {
        .node = KEYCHAIN_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-keychain)# ",
        .config_write = keychain_config_write,
 };
 
 static struct cmd_node keychain_key_node = {
        .node = KEYCHAIN_KEY_NODE,
+       .parent_node = KEYCHAIN_NODE,
        .prompt = "%s(config-keychain-key)# ",
 };
 
index cce5af1e785d4f5add67647dfffaa7284f5d1fa3..5544605290377963dd555a8f79a2dcdc850e7e04 100644 (file)
@@ -936,6 +936,7 @@ DEFPY(ecmp_nexthops, ecmp_nexthops_cmd,
 static int nexthop_group_write(struct vty *vty);
 static struct cmd_node nexthop_group_node = {
        .node = NH_GROUP_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-nh-group)# ",
        .config_write = nexthop_group_write,
 };
index b97948d5c66a45283a1edfeb9dd6b8482e372391..16ecd119418d584c3c301925c0f6f6b9aeb8f529 100644 (file)
@@ -1067,6 +1067,7 @@ static int route_map_config_write(struct vty *vty)
 static int route_map_config_write(struct vty *vty);
 static struct cmd_node rmap_node = {
        .node = RMAP_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-route-map)# ",
        .config_write = route_map_config_write,
 };
index b825ff03ffaed9b799b0aa1a87e16005181ab722..1fadf5c0c82f680eadd2947db11738f25f9dd143 100644 (file)
--- a/lib/vrf.c
+++ b/lib/vrf.c
@@ -760,6 +760,7 @@ DEFUN (no_vrf,
 
 static struct cmd_node vrf_node = {
        .node = VRF_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-vrf)# ",
 };
 
index 1d94d3d3104360d7884cacc8f6ec1a945f10b7be..24cdfeda42a24876a9bc989cb7e4cd422736128a 100644 (file)
--- a/lib/vty.c
+++ b/lib/vty.c
@@ -2605,6 +2605,24 @@ int vty_config_enter(struct vty *vty, bool private_config, bool exclusive)
 
 void vty_config_exit(struct vty *vty)
 {
+       enum node_type node = vty->node;
+       struct cmd_node *cnode;
+
+       /* unlock and jump up to ENABLE_NODE if -and only if- we're
+        * somewhere below CONFIG_NODE */
+       while (node && node != CONFIG_NODE) {
+               cnode = vector_lookup(cmdvec, node);
+               node = cnode->parent_node;
+       }
+       if (node != CONFIG_NODE) {
+               vty_out(vty,
+                       "WARNING: vty_config_exit() from outside CONFIG_NODE!\n");
+               return;
+       }
+
+       while (vty->node != ENABLE_NODE)
+               cmd_exit(vty);
+
        /* Check if there's a pending confirmed commit. */
        if (vty->t_confirmed_commit_timeout) {
                vty_out(vty,
@@ -2992,6 +3010,7 @@ static int vty_config_write(struct vty *vty)
 static int vty_config_write(struct vty *vty);
 struct cmd_node vty_node = {
        .node = VTY_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-line)# ",
        .config_write = vty_config_write,
 };
index f9ed1e96c0f460c739d80c9ff73377a0e88d30ee..bf29d021818c4e1fdb59d00fcd9b4aa5d1e28189 100644 (file)
@@ -20,6 +20,7 @@
 static int nhrp_config_write(struct vty *vty);
 static struct cmd_node zebra_node = {
        .node = ZEBRA_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-router)# ",
        .config_write = nhrp_config_write,
 };
@@ -27,6 +28,7 @@ static struct cmd_node zebra_node = {
 static int interface_config_write(struct vty *vty);
 static struct cmd_node nhrp_interface_node = {
        .node = INTERFACE_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-if)# ",
        .config_write = interface_config_write,
 };
index 3d1c6f9fa85d95c938313a15081d9238e53ffa9e..8ed9c67974095def304779b9bc9f869ca7fe34be 100644 (file)
@@ -1946,6 +1946,7 @@ static int config_write_ospf6_interface(struct vty *vty)
 static int config_write_ospf6_interface(struct vty *vty);
 static struct cmd_node interface_node = {
        .node = INTERFACE_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-if)# ",
        .config_write = config_write_ospf6_interface,
 };
index 6168656211fd79ffaf3d6ddb170e031833ed2a00..75c0460ecac58fd5d89c4dcf0c201d97e3fdc90b 100644 (file)
@@ -1116,6 +1116,7 @@ static int config_write_ospf6(struct vty *vty);
 /* OSPF6 node structure. */
 static struct cmd_node ospf6_node = {
        .node = OSPF6_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-ospf6)# ",
        .config_write = config_write_ospf6,
 };
index ab12c3818b998b0e09f31cadf2d3c8d97d31c1b0..25bd41001513da53a28b5cbfc6dd83dea6aaa8c7 100644 (file)
@@ -10559,6 +10559,7 @@ static int config_write_interface(struct vty *vty);
 /* ospfd's interface node. */
 static struct cmd_node interface_node = {
        .node = INTERFACE_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-if)# ",
        .config_write = config_write_interface,
 };
@@ -10676,6 +10677,7 @@ static void ospf_vty_zebra_init(void)
 static int ospf_config_write(struct vty *vty);
 static struct cmd_node ospf_node = {
        .node = OSPF_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-router)# ",
        .config_write = ospf_config_write,
 };
index 2f5d4dcbcc4ce5465df144109a31513b1b744c7b..35dbb24d1903e0fffeea128113bd4cee88890f49 100644 (file)
@@ -732,6 +732,7 @@ DEFUN_NOSH(show_debugging_pbr,
 static int pbr_interface_config_write(struct vty *vty);
 static struct cmd_node interface_node = {
        .node = INTERFACE_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-if)# ",
        .config_write = pbr_interface_config_write,
 };
@@ -765,6 +766,7 @@ static int pbr_vty_map_config_write(struct vty *vty);
 /* PBR map node structure. */
 static struct cmd_node pbr_map_node = {
        .node = PBRMAP_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-pbr-map)# ",
        .config_write = pbr_vty_map_config_write,
 };
index a386e33d2474ed32004672aaa09f9b155c7e924c..895072a892957eaa7f801d18bcb503fd09ede7c7 100644 (file)
@@ -71,6 +71,7 @@
 
 static struct cmd_node interface_node = {
        .node = INTERFACE_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-if)# ",
        .config_write = pim_interface_config_write,
 };
index 87899e468d9c5dbf636c7d6aaf51edbe822adc16..924eb8334b081034ef8128ebe0747bdcc5e7a77a 100644 (file)
@@ -1196,6 +1196,7 @@ int rip_show_network_config(struct vty *vty, struct rip *rip)
 static int rip_interface_config_write(struct vty *vty);
 static struct cmd_node interface_node = {
        .node = INTERFACE_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-if)# ",
        .config_write = rip_interface_config_write,
 };
index 71511deb14934167edf43ec8e57d929d1097c127..b6bbfb253d350362e510568fd84b5f6f2cd5e2e2 100644 (file)
@@ -3331,6 +3331,7 @@ static int config_write_rip(struct vty *vty);
 /* RIP node structure. */
 static struct cmd_node rip_node = {
        .node = RIP_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-router)# ",
        .config_write = config_write_rip,
 };
index efaabdb6de1851ca7d0f9b52e7cb2af37f340ecf..e45bbbe2146c6abbfac08a3b89c4a0e78d4b3864 100644 (file)
@@ -958,6 +958,7 @@ static int interface_config_write(struct vty *vty);
 /* ripngd's interface node. */
 static struct cmd_node interface_node = {
        .node = INTERFACE_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-if)# ",
        .config_write = interface_config_write,
 };
index cde8d860e2255a9ee1b4a733c079341ad0ed3b73..47083f9471484f61eaf0af84f5b28a4ca039c5f8 100644 (file)
@@ -2438,6 +2438,7 @@ static int ripng_config_write(struct vty *vty);
 /* RIPng node structure. */
 static struct cmd_node cmd_ripng_node = {
        .node = RIPNG_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-router)# ",
        .config_write = ripng_config_write,
 };
index d269e51beab9995cc629473c29525f23fb8bdc7d..54417f495407cb4e7f5860730f3b1bb0a3b70054 100644 (file)
@@ -50,81 +50,97 @@ static char test_buf[32768];
 
 static struct cmd_node bgp_node = {
        .node = BGP_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-router)# ",
 };
 
 static struct cmd_node rip_node = {
        .node = RIP_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-router)# ",
 };
 
 static struct cmd_node isis_node = {
        .node = ISIS_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-router)# ",
 };
 
 static struct cmd_node interface_node = {
        .node = INTERFACE_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-if)# ",
 };
 
 static struct cmd_node rmap_node = {
        .node = RMAP_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-route-map)# ",
 };
 
 static struct cmd_node zebra_node = {
        .node = ZEBRA_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-router)# ",
 };
 
 static struct cmd_node bgp_vpnv4_node = {
        .node = BGP_VPNV4_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-router-af)# ",
 };
 
 static struct cmd_node bgp_ipv4_node = {
        .node = BGP_IPV4_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-router-af)# ",
 };
 
 static struct cmd_node bgp_ipv4m_node = {
        .node = BGP_IPV4M_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-router-af)# ",
 };
 
 static struct cmd_node bgp_ipv6_node = {
        .node = BGP_IPV6_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-router-af)# ",
 };
 
 static struct cmd_node bgp_ipv6m_node = {
        .node = BGP_IPV6M_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-router-af)# ",
 };
 
 static struct cmd_node ospf_node = {
        .node = OSPF_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-router)# ",
 };
 
 static struct cmd_node ripng_node = {
        .node = RIPNG_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-router)# ",
 };
 
 static struct cmd_node ospf6_node = {
        .node = OSPF6_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-ospf6)# ",
 };
 
 static struct cmd_node keychain_node = {
        .node = KEYCHAIN_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-keychain)# ",
 };
 
 static struct cmd_node keychain_key_node = {
        .node = KEYCHAIN_KEY_NODE,
+       .parent_node = KEYCHAIN_NODE,
        .prompt = "%s(config-keychain-key)# ",
 };
 
index 98ce745936add882b02dd61120119e68fa9640e1..f2048db984346ef9035c13784d0ce187bb20ed32 100644 (file)
@@ -746,6 +746,7 @@ static int vrrp_config_write_interface(struct vty *vty)
 
 static struct cmd_node interface_node = {
        .node = INTERFACE_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-if)# ",
        .config_write = vrrp_config_write_interface,
 };
index 028a9c7e0150af52e6b5680225983d7c6ab50849..ddb40a572f4891bd6a846d74f947614bc64c2c66 100644 (file)
@@ -1174,232 +1174,278 @@ static char **new_completion(const char *text, int start, int end)
 /* Vty node structures. */
 static struct cmd_node bgp_node = {
        .node = BGP_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-router)# ",
 };
 
 static struct cmd_node rip_node = {
        .node = RIP_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-router)# ",
 };
 
 static struct cmd_node isis_node = {
        .node = ISIS_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-router)# ",
 };
 
 static struct cmd_node openfabric_node = {
        .node = OPENFABRIC_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-router)# ",
 };
 
 static struct cmd_node interface_node = {
        .node = INTERFACE_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-if)# ",
 };
 
 static struct cmd_node pw_node = {
        .node = PW_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-pw)# ",
 };
 
 static struct cmd_node vrf_node = {
        .node = VRF_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-vrf)# ",
 };
 
 static struct cmd_node nh_group_node = {
        .node = NH_GROUP_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-nh-group)# ",
 };
 
 static struct cmd_node rmap_node = {
        .node = RMAP_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-route-map)# ",
 };
 
 static struct cmd_node pbr_map_node = {
        .node = PBRMAP_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-pbr-map)# ",
 };
 
 static struct cmd_node zebra_node = {
        .node = ZEBRA_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-router)# ",
 };
 
 static struct cmd_node bgp_vpnv4_node = {
        .node = BGP_VPNV4_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-router-af)# ",
 };
 
 static struct cmd_node bgp_vpnv6_node = {
        .node = BGP_VPNV6_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-router-af)# ",
 };
 
 static struct cmd_node bgp_flowspecv4_node = {
        .node = BGP_FLOWSPECV4_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-router-af)# ",
 };
 
 static struct cmd_node bgp_flowspecv6_node = {
        .node = BGP_FLOWSPECV6_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-router-af)# ",
 };
 
 static struct cmd_node bgp_ipv4_node = {
        .node = BGP_IPV4_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-router-af)# ",
 };
 
 static struct cmd_node bgp_ipv4m_node = {
        .node = BGP_IPV4M_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-router-af)# ",
 };
 
 static struct cmd_node bgp_ipv4l_node = {
        .node = BGP_IPV4L_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-router-af)# ",
 };
 
 static struct cmd_node bgp_ipv6_node = {
        .node = BGP_IPV6_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-router-af)# ",
 };
 
 static struct cmd_node bgp_ipv6m_node = {
        .node = BGP_IPV6M_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-router-af)# ",
 };
 
 static struct cmd_node bgp_evpn_node = {
        .node = BGP_EVPN_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-router-af)# ",
 };
 
 static struct cmd_node bgp_evpn_vni_node = {
        .node = BGP_EVPN_VNI_NODE,
+       .parent_node = BGP_EVPN_NODE,
        .prompt = "%s(config-router-af-vni)# ",
 };
 
 static struct cmd_node bgp_ipv6l_node = {
        .node = BGP_IPV6L_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-router-af)# ",
 };
 
 static struct cmd_node bgp_vnc_defaults_node = {
        .node = BGP_VNC_DEFAULTS_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-router-vnc-defaults)# ",
 };
 
 static struct cmd_node bgp_vnc_nve_group_node = {
        .node = BGP_VNC_NVE_GROUP_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-router-vnc-nve-group)# ",
 };
 
 static struct cmd_node bgp_vrf_policy_node = {
        .node = BGP_VRF_POLICY_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-router-vrf-policy)# ",
 };
 
 static struct cmd_node bgp_vnc_l2_group_node = {
        .node = BGP_VNC_L2_GROUP_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-router-vnc-l2-group)# ",
 };
 
 static struct cmd_node bmp_node = {
        .node = BMP_NODE,
+       .parent_node = BGP_NODE,
        .prompt = "%s(config-bgp-bmp)# "
 };
 
 static struct cmd_node ospf_node = {
        .node = OSPF_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-router)# ",
 };
 
 static struct cmd_node eigrp_node = {
        .node = EIGRP_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-router)# ",
 };
 
 static struct cmd_node babel_node = {
        .node = BABEL_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-router)# ",
 };
 
 static struct cmd_node ripng_node = {
        .node = RIPNG_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-router)# ",
 };
 
 static struct cmd_node ospf6_node = {
        .node = OSPF6_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-ospf6)# ",
 };
 
 static struct cmd_node ldp_node = {
        .node = LDP_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-ldp)# ",
 };
 
 static struct cmd_node ldp_ipv4_node = {
        .node = LDP_IPV4_NODE,
+       .parent_node = LDP_NODE,
        .prompt = "%s(config-ldp-af)# ",
 };
 
 static struct cmd_node ldp_ipv6_node = {
        .node = LDP_IPV6_NODE,
+       .parent_node = LDP_NODE,
        .prompt = "%s(config-ldp-af)# ",
 };
 
 static struct cmd_node ldp_ipv4_iface_node = {
        .node = LDP_IPV4_IFACE_NODE,
+       .parent_node = LDP_IPV4_NODE,
        .prompt = "%s(config-ldp-af-if)# ",
 };
 
 static struct cmd_node ldp_ipv6_iface_node = {
        .node = LDP_IPV6_IFACE_NODE,
+       .parent_node = LDP_IPV6_NODE,
        .prompt = "%s(config-ldp-af-if)# ",
 };
 
 static struct cmd_node ldp_l2vpn_node = {
        .node = LDP_L2VPN_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-l2vpn)# ",
 };
 
 static struct cmd_node ldp_pseudowire_node = {
        .node = LDP_PSEUDOWIRE_NODE,
+       .parent_node = LDP_L2VPN_NODE,
        .prompt = "%s(config-l2vpn-pw)# ",
 };
 
 static struct cmd_node keychain_node = {
        .node = KEYCHAIN_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-keychain)# ",
 };
 
 static struct cmd_node keychain_key_node = {
        .node = KEYCHAIN_KEY_NODE,
+       .parent_node = KEYCHAIN_NODE,
        .prompt = "%s(config-keychain-key)# ",
 };
 
 struct cmd_node link_params_node = {
        .node = LINK_PARAMS_NODE,
+       .parent_node = INTERFACE_NODE,
        .prompt = "%s(config-link-params)# ",
 };
 
 static struct cmd_node rpki_node = {
        .node = RPKI_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-rpki)# ",
 };
 
 #if HAVE_BFDD > 0
 static struct cmd_node bfd_node = {
        .node = BFD_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-bfd)# ",
 };
 
 static struct cmd_node bfd_peer_node = {
        .node = BFD_PEER_NODE,
+       .parent_node = BFD_NODE,
        .prompt = "%s(config-bfd-peer)# ",
 };
 #endif /* HAVE_BFDD */
index 8d119eac7b779a8f306745a68f5e1bfd9859c8f5..f4b330d8a8adce0e953c4d5223cf13f3d0cab403 100644 (file)
@@ -1667,6 +1667,7 @@ static void interface_update_stats(void)
 static int if_config_write(struct vty *vty);
 struct cmd_node interface_node = {
        .node = INTERFACE_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-if)# ",
        .config_write = if_config_write,
 };
@@ -2080,6 +2081,7 @@ DEFUN (no_bandwidth_if,
 
 struct cmd_node link_params_node = {
        .node = LINK_PARAMS_NODE,
+       .parent_node = INTERFACE_NODE,
        .prompt = "%s(config-link-params)# ",
 };
 
index beb6fcb2ebe4566260c9df3027f3a5550995ef55..462a75b551d630b334cca3c675403414765b7696 100644 (file)
@@ -1942,6 +1942,7 @@ static int fpm_remote_srv_write(struct vty *vty);
 /* Zebra node  */
 static struct cmd_node zebra_node = {
        .node = ZEBRA_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "",
        .config_write = fpm_remote_srv_write,
 };
index 9717805d07d3c18d26fe51bb6545a81f2a2ba5c6..1885401287bae6395ad729e089a9ea67ce11cf52 100644 (file)
@@ -550,6 +550,7 @@ static int zebra_pw_config(struct vty *vty)
 static int zebra_pw_config(struct vty *vty);
 static struct cmd_node pw_node = {
        .node = PW_NODE,
+       .parent_node = CONFIG_NODE,
        .prompt = "%s(config-pw)# ",
        .config_write = zebra_pw_config,
 };