]> git.puffer.fish Git - mirror/frr.git/commitdiff
ldpd: reorganize json support and fix a few issues 73/head
authorRenato Westphal <renato@opensourcerouting.org>
Tue, 10 Jan 2017 20:27:03 +0000 (18:27 -0200)
committerRenato Westphal <renato@openbsd.org>
Fri, 13 Jan 2017 16:43:44 +0000 (14:43 -0200)
* reorganize code to improve maintainability;
* add json output for the l2vpn show commands as well;
* in "show mpls ldp discovery json", nest the adjacencies inside the
  respective interfaces. Also, fix a segfault when trying to show a
  targeted adjacency;
* in "show mpls ldp neighbor", show the address-family of the adjacencies
  of each neighbor. Also, remove "downstreamUnsolicited":true from
  the output;
* in "show mpls ldp interface json", show all interface/address-family
  combinations;

Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
ldpd/ldp_vty.h
ldpd/ldp_vty.xml
ldpd/ldp_vty_cmds.c [deleted file]
ldpd/ldp_vty_exec.c

index 78b83dc5a9e6f56fa4c3f2b79d65449d05255472..735554badfe57ad1d3e88b349e363a756becbfb8 100644 (file)
@@ -65,10 +65,10 @@ int  ldp_vty_l2vpn_pw_nbr_addr(struct vty *, struct vty_arg *[]);
 int     ldp_vty_l2vpn_pw_nbr_id(struct vty *, struct vty_arg *[]);
 int     ldp_vty_l2vpn_pw_pwid(struct vty *, struct vty_arg *[]);
 int     ldp_vty_l2vpn_pw_pwstatus(struct vty *, struct vty_arg *[]);
-int     ldp_vty_show_binding(struct vty *, struct vty_arg *[], u_char);
-int     ldp_vty_show_discovery(struct vty *, struct vty_arg *[], u_char);
-int     ldp_vty_show_interface(struct vty *, struct vty_arg *[], u_char);
-int     ldp_vty_show_neighbor(struct vty *, struct vty_arg *[], u_char);
+int     ldp_vty_show_binding(struct vty *, struct vty_arg *[]);
+int     ldp_vty_show_discovery(struct vty *, struct vty_arg *[]);
+int     ldp_vty_show_interface(struct vty *, struct vty_arg *[]);
+int     ldp_vty_show_neighbor(struct vty *, struct vty_arg *[]);
 int     ldp_vty_show_atom_binding(struct vty *, struct vty_arg *[]);
 int     ldp_vty_show_atom_vc(struct vty *, struct vty_arg *[]);
 int     ldp_vty_clear_nbr(struct vty *, struct vty_arg *[]);
index ee5c6e4df2d8f42454903b4cd80a002bf7560edc..88e6b718ab5aa198c8375c29318f01332dc99ab8 100644 (file)
 
   <!-- exec mode commands -->
   <subtree name="ldp_show_af">
-    <option name="binding" help="Label Information Base (LIB) information" function="ldp_vty_show_binding"/>
-    <option name="discovery" help="Discovery Hello Information" function="ldp_vty_show_discovery"/>
-    <option name="interface" help="interface information" function="ldp_vty_show_interface"/>
+    <option name="binding" help="Label Information Base (LIB) information">
+      <option name="json" arg="json" optional="true" help="JavaScript Object Notation" function="ldp_vty_show_binding"/>
+    </option>
+    <option name="discovery" help="Discovery Hello Information">
+      <option name="json" arg="json" optional="true" help="JavaScript Object Notation" function="ldp_vty_show_discovery"/>
+    </option>
+    <option name="interface" help="interface information">
+      <option name="json" arg="json" optional="true" help="JavaScript Object Notation" function="ldp_vty_show_interface"/>
+    </option>
   </subtree>
   <tree name="ldp_exec">
     <option name="show" help="Show running system information">
       <option name="mpls" help="MPLS information">
         <option name="ldp" help="Label Distribution Protocol">
-          <option name="neighbor" help="Neighbor information" function="ldp_vty_show_neighbor"/>
+          <option name="neighbor" help="Neighbor information">
+            <option name="json" arg="json" optional="true" help="JavaScript Object Notation" function="ldp_vty_show_neighbor"/>
+          </option>
           <include subtree="ldp_show_af"/>
           <select options="address-family" arg="address-family">
             <include subtree="ldp_show_af"/>
       </option>
       <option name="l2vpn" help="Show information about Layer2 VPN">
         <option name="atom" help="Show Any Transport over MPLS information">
-          <option name="binding" help="Show AToM label binding information" function="ldp_vty_show_atom_binding"/>
-          <option name="vc" help="Show AToM virtual circuit information" function="ldp_vty_show_atom_vc"/>
+          <option name="binding" help="Show AToM label binding information">
+            <option name="json" arg="json" optional="true" help="JavaScript Object Notation" function="ldp_vty_show_atom_binding"/>
+          </option>
+          <option name="vc" help="Show AToM virtual circuit information">
+            <option name="json" arg="json" optional="true" help="JavaScript Object Notation" function="ldp_vty_show_atom_vc"/>
+          </option>
         </option>
       </option>
       <option name="debugging" help="Debugging functions">
diff --git a/ldpd/ldp_vty_cmds.c b/ldpd/ldp_vty_cmds.c
deleted file mode 100644 (file)
index 8aa593c..0000000
+++ /dev/null
@@ -1,1726 +0,0 @@
-/* Auto-generated from ldp_vty.xml. */
-/* Do not edit! */
-
-#include <zebra.h>
-
-#include "command.h"
-#include "vty.h"
-#include "ldp_vty.h"
-
-DEFUN (ldp_mpls_ldp,
-       ldp_mpls_ldp_cmd,
-       "mpls ldp",
-       "Global MPLS configuration subcommands\n"
-       "Label Distribution Protocol\n")
-{
-  struct vty_arg *args[] = { NULL };
-  return ldp_vty_mpls_ldp (vty, args);
-}
-
-DEFUN (ldp_l2vpn_word_type_vpls,
-       ldp_l2vpn_word_type_vpls_cmd,
-       "l2vpn WORD type vpls",
-       "Configure l2vpn commands\n"
-       "L2VPN name\n"
-       "L2VPN type\n"
-       "Virtual Private LAN Service\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "name", .value = argv[1]->arg },
-      NULL
-    };
-  return ldp_vty_l2vpn (vty, args);
-}
-
-DEFUN (ldp_no_mpls_ldp,
-       ldp_no_mpls_ldp_cmd,
-       "no mpls ldp",
-       "Negate a command or set its defaults\n"
-       "Global MPLS configuration subcommands\n"
-       "Label Distribution Protocol\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      NULL
-    };
-  return ldp_vty_mpls_ldp (vty, args);
-}
-
-DEFUN (ldp_no_l2vpn_word_type_vpls,
-       ldp_no_l2vpn_word_type_vpls_cmd,
-       "no l2vpn WORD type vpls",
-       "Negate a command or set its defaults\n"
-       "Configure l2vpn commands\n"
-       "L2VPN name\n"
-       "L2VPN type\n"
-       "Virtual Private LAN Service\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      &(struct vty_arg) { .name = "name", .value = argv[2]->arg },
-      NULL
-    };
-  return ldp_vty_l2vpn (vty, args);
-}
-
-DEFUN (ldp_address_family_ipv4,
-       ldp_address_family_ipv4_cmd,
-       "address-family ipv4",
-       "Configure Address Family and its parameters\n"
-       "IPv4\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "address-family", .value = "ipv4" },
-      NULL
-    };
-  return ldp_vty_address_family (vty, args);
-}
-
-DEFUN (ldp_address_family_ipv6,
-       ldp_address_family_ipv6_cmd,
-       "address-family ipv6",
-       "Configure Address Family and its parameters\n"
-       "IPv6\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "address-family", .value = "ipv6" },
-      NULL
-    };
-  return ldp_vty_address_family (vty, args);
-}
-
-DEFUN (ldp_discovery_hello_holdtime_disc_time,
-       ldp_discovery_hello_holdtime_disc_time_cmd,
-       "discovery hello holdtime (1-65535)",
-       "Configure discovery parameters\n"
-       "LDP Link Hellos\n"
-       "Hello holdtime\n"
-       "Time (seconds) - 65535 implies infinite\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "hello_type", .value = "hello" },
-      &(struct vty_arg) { .name = "seconds", .value = argv[3]->arg },
-      NULL
-    };
-  return ldp_vty_disc_holdtime (vty, args);
-}
-
-DEFUN (ldp_discovery_hello_interval_disc_time,
-       ldp_discovery_hello_interval_disc_time_cmd,
-       "discovery hello interval (1-65535)",
-       "Configure discovery parameters\n"
-       "LDP Link Hellos\n"
-       "Hello interval\n"
-       "Time (seconds)\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "hello_type", .value = "hello" },
-      &(struct vty_arg) { .name = "seconds", .value = argv[3]->arg },
-      NULL
-    };
-  return ldp_vty_disc_interval (vty, args);
-}
-
-DEFUN (ldp_discovery_targeted_hello_holdtime_disc_time,
-       ldp_discovery_targeted_hello_holdtime_disc_time_cmd,
-       "discovery targeted-hello holdtime (1-65535)",
-       "Configure discovery parameters\n"
-       "LDP Targeted Hellos\n"
-       "Targeted hello holdtime\n"
-       "Time (seconds) - 65535 implies infinite\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "hello_type", .value = "targeted-hello" },
-      &(struct vty_arg) { .name = "seconds", .value = argv[3]->arg },
-      NULL
-    };
-  return ldp_vty_disc_holdtime (vty, args);
-}
-
-DEFUN (ldp_discovery_targeted_hello_interval_disc_time,
-       ldp_discovery_targeted_hello_interval_disc_time_cmd,
-       "discovery targeted-hello interval (1-65535)",
-       "Configure discovery parameters\n"
-       "LDP Targeted Hellos\n"
-       "Targeted hello interval\n"
-       "Time (seconds)\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "hello_type", .value = "targeted-hello" },
-      &(struct vty_arg) { .name = "seconds", .value = argv[3]->arg },
-      NULL
-    };
-  return ldp_vty_disc_interval (vty, args);
-}
-
-DEFUN (ldp_dual_stack_transport_connection_prefer_ipv4,
-       ldp_dual_stack_transport_connection_prefer_ipv4_cmd,
-       "dual-stack transport-connection prefer ipv4",
-       "Configure dual stack parameters\n"
-       "Configure TCP transport parameters\n"
-       "Configure prefered address family for TCP transport connection with neighbor\n"
-       "IPv4\n")
-{
-  struct vty_arg *args[] = { NULL };
-  return ldp_vty_trans_pref_ipv4 (vty, args);
-}
-
-DEFUN (ldp_dual_stack_cisco_interop,
-       ldp_dual_stack_cisco_interop_cmd,
-       "dual-stack cisco-interop",
-       "Configure dual stack parameters\n"
-       "Use Cisco non-compliant format to send and interpret the Dual-Stack capability TLV\n")
-{
-  struct vty_arg *args[] = { NULL };
-  return ldp_vty_ds_cisco_interop (vty, args);
-}
-
-DEFUN (ldp_neighbor_ipv4_password_word,
-       ldp_neighbor_ipv4_password_word_cmd,
-       "neighbor A.B.C.D password WORD",
-       "Configure neighbor parameters\n"
-       "LDP Id of neighbor\n"
-       "Configure password for MD5 authentication\n"
-       "The password\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "lsr_id", .value = argv[1]->arg },
-      &(struct vty_arg) { .name = "password", .value = argv[3]->arg },
-      NULL
-    };
-  return ldp_vty_neighbor_password (vty, args);
-}
-
-DEFUN (ldp_neighbor_ipv4_session_holdtime_session_time,
-       ldp_neighbor_ipv4_session_holdtime_session_time_cmd,
-       "neighbor A.B.C.D session holdtime (15-65535)",
-       "Configure neighbor parameters\n"
-       "LDP Id of neighbor\n"
-       "Configure session parameters\n"
-       "Configure session holdtime\n"
-       "Time (seconds)\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "lsr_id", .value = argv[1]->arg },
-      &(struct vty_arg) { .name = "seconds", .value = argv[4]->arg },
-      NULL
-    };
-  return ldp_vty_session_holdtime (vty, args);
-}
-
-DEFUN (ldp_neighbor_ipv4_ttl_security_disable,
-       ldp_neighbor_ipv4_ttl_security_disable_cmd,
-       "neighbor A.B.C.D ttl-security disable",
-       "Configure neighbor parameters\n"
-       "LDP Id of neighbor\n"
-       "LDP ttl security check\n"
-       "Disable ttl security\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "lsr_id", .value = argv[1]->arg },
-      NULL
-    };
-  return ldp_vty_neighbor_ttl_security (vty, args);
-}
-
-DEFUN (ldp_neighbor_ipv4_ttl_security_hops_hops,
-       ldp_neighbor_ipv4_ttl_security_hops_hops_cmd,
-       "neighbor A.B.C.D ttl-security hops (1-254)",
-       "Configure neighbor parameters\n"
-       "LDP Id of neighbor\n"
-       "LDP ttl security check\n"
-       "IP hops\n"
-       "maximum number of hops\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "lsr_id", .value = argv[1]->arg },
-      &(struct vty_arg) { .name = "hops", .value = argv[4]->arg },
-      NULL
-    };
-  return ldp_vty_neighbor_ttl_security (vty, args);
-}
-
-DEFUN (ldp_router_id_ipv4,
-       ldp_router_id_ipv4_cmd,
-       "router-id A.B.C.D",
-       "Configure router Id\n"
-       "LSR Id (in form of an IPv4 address)\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "addr", .value = argv[1]->arg },
-      NULL
-    };
-  return ldp_vty_router_id (vty, args);
-}
-
-DEFUN (ldp_no_address_family_ipv4,
-       ldp_no_address_family_ipv4_cmd,
-       "no address-family ipv4",
-       "Negate a command or set its defaults\n"
-       "Configure Address Family and its parameters\n"
-       "IPv4\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      &(struct vty_arg) { .name = "address-family", .value = "ipv4" },
-      NULL
-    };
-  return ldp_vty_address_family (vty, args);
-}
-
-DEFUN (ldp_no_address_family_ipv6,
-       ldp_no_address_family_ipv6_cmd,
-       "no address-family ipv6",
-       "Negate a command or set its defaults\n"
-       "Configure Address Family and its parameters\n"
-       "IPv6\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      &(struct vty_arg) { .name = "address-family", .value = "ipv6" },
-      NULL
-    };
-  return ldp_vty_address_family (vty, args);
-}
-
-DEFUN (ldp_no_discovery_hello_holdtime_disc_time,
-       ldp_no_discovery_hello_holdtime_disc_time_cmd,
-       "no discovery hello holdtime (1-65535)",
-       "Negate a command or set its defaults\n"
-       "Configure discovery parameters\n"
-       "LDP Link Hellos\n"
-       "Hello holdtime\n"
-       "Time (seconds) - 65535 implies infinite\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      &(struct vty_arg) { .name = "hello_type", .value = "hello" },
-      &(struct vty_arg) { .name = "seconds", .value = argv[4]->arg },
-      NULL
-    };
-  return ldp_vty_disc_holdtime (vty, args);
-}
-
-DEFUN (ldp_no_discovery_hello_interval_disc_time,
-       ldp_no_discovery_hello_interval_disc_time_cmd,
-       "no discovery hello interval (1-65535)",
-       "Negate a command or set its defaults\n"
-       "Configure discovery parameters\n"
-       "LDP Link Hellos\n"
-       "Hello interval\n"
-       "Time (seconds)\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      &(struct vty_arg) { .name = "hello_type", .value = "hello" },
-      &(struct vty_arg) { .name = "seconds", .value = argv[4]->arg },
-      NULL
-    };
-  return ldp_vty_disc_interval (vty, args);
-}
-
-DEFUN (ldp_no_discovery_targeted_hello_holdtime_disc_time,
-       ldp_no_discovery_targeted_hello_holdtime_disc_time_cmd,
-       "no discovery targeted-hello holdtime (1-65535)",
-       "Negate a command or set its defaults\n"
-       "Configure discovery parameters\n"
-       "LDP Targeted Hellos\n"
-       "Targeted hello holdtime\n"
-       "Time (seconds) - 65535 implies infinite\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      &(struct vty_arg) { .name = "hello_type", .value = "targeted-hello" },
-      &(struct vty_arg) { .name = "seconds", .value = argv[4]->arg },
-      NULL
-    };
-  return ldp_vty_disc_holdtime (vty, args);
-}
-
-DEFUN (ldp_no_discovery_targeted_hello_interval_disc_time,
-       ldp_no_discovery_targeted_hello_interval_disc_time_cmd,
-       "no discovery targeted-hello interval (1-65535)",
-       "Negate a command or set its defaults\n"
-       "Configure discovery parameters\n"
-       "LDP Targeted Hellos\n"
-       "Targeted hello interval\n"
-       "Time (seconds)\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      &(struct vty_arg) { .name = "hello_type", .value = "targeted-hello" },
-      &(struct vty_arg) { .name = "seconds", .value = argv[4]->arg },
-      NULL
-    };
-  return ldp_vty_disc_interval (vty, args);
-}
-
-DEFUN (ldp_no_dual_stack_transport_connection_prefer_ipv4,
-       ldp_no_dual_stack_transport_connection_prefer_ipv4_cmd,
-       "no dual-stack transport-connection prefer ipv4",
-       "Negate a command or set its defaults\n"
-       "Configure dual stack parameters\n"
-       "Configure TCP transport parameters\n"
-       "Configure prefered address family for TCP transport connection with neighbor\n"
-       "IPv4\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      NULL
-    };
-  return ldp_vty_trans_pref_ipv4 (vty, args);
-}
-
-DEFUN (ldp_no_dual_stack_cisco_interop,
-       ldp_no_dual_stack_cisco_interop_cmd,
-       "no dual-stack cisco-interop",
-       "Negate a command or set its defaults\n"
-       "Configure dual stack parameters\n"
-       "Use Cisco non-compliant format to send and interpret the Dual-Stack capability TLV\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      NULL
-    };
-  return ldp_vty_ds_cisco_interop (vty, args);
-}
-
-DEFUN (ldp_no_neighbor_ipv4_password_word,
-       ldp_no_neighbor_ipv4_password_word_cmd,
-       "no neighbor A.B.C.D password WORD",
-       "Negate a command or set its defaults\n"
-       "Configure neighbor parameters\n"
-       "LDP Id of neighbor\n"
-       "Configure password for MD5 authentication\n"
-       "The password\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      &(struct vty_arg) { .name = "lsr_id", .value = argv[2]->arg },
-      &(struct vty_arg) { .name = "password", .value = argv[4]->arg },
-      NULL
-    };
-  return ldp_vty_neighbor_password (vty, args);
-}
-
-DEFUN (ldp_no_neighbor_ipv4_session_holdtime_session_time,
-       ldp_no_neighbor_ipv4_session_holdtime_session_time_cmd,
-       "no neighbor A.B.C.D session holdtime (15-65535)",
-       "Negate a command or set its defaults\n"
-       "Configure neighbor parameters\n"
-       "LDP Id of neighbor\n"
-       "Configure session parameters\n"
-       "Configure session holdtime\n"
-       "Time (seconds)\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      &(struct vty_arg) { .name = "lsr_id", .value = argv[2]->arg },
-      &(struct vty_arg) { .name = "seconds", .value = argv[5]->arg },
-      NULL
-    };
-  return ldp_vty_session_holdtime (vty, args);
-}
-
-DEFUN (ldp_no_neighbor_ipv4_ttl_security_disable,
-       ldp_no_neighbor_ipv4_ttl_security_disable_cmd,
-       "no neighbor A.B.C.D ttl-security disable",
-       "Negate a command or set its defaults\n"
-       "Configure neighbor parameters\n"
-       "LDP Id of neighbor\n"
-       "LDP ttl security check\n"
-       "Disable ttl security\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      &(struct vty_arg) { .name = "lsr_id", .value = argv[2]->arg },
-      NULL
-    };
-  return ldp_vty_neighbor_ttl_security (vty, args);
-}
-
-DEFUN (ldp_no_neighbor_ipv4_ttl_security_hops_hops,
-       ldp_no_neighbor_ipv4_ttl_security_hops_hops_cmd,
-       "no neighbor A.B.C.D ttl-security hops (1-254)",
-       "Negate a command or set its defaults\n"
-       "Configure neighbor parameters\n"
-       "LDP Id of neighbor\n"
-       "LDP ttl security check\n"
-       "IP hops\n"
-       "maximum number of hops\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      &(struct vty_arg) { .name = "lsr_id", .value = argv[2]->arg },
-      &(struct vty_arg) { .name = "hops", .value = argv[5]->arg },
-      NULL
-    };
-  return ldp_vty_neighbor_ttl_security (vty, args);
-}
-
-DEFUN (ldp_no_router_id_ipv4,
-       ldp_no_router_id_ipv4_cmd,
-       "no router-id A.B.C.D",
-       "Negate a command or set its defaults\n"
-       "Configure router Id\n"
-       "LSR Id (in form of an IPv4 address)\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      &(struct vty_arg) { .name = "addr", .value = argv[2]->arg },
-      NULL
-    };
-  return ldp_vty_router_id (vty, args);
-}
-
-DEFUN (ldp_discovery_targeted_hello_accept,
-       ldp_discovery_targeted_hello_accept_cmd,
-       "discovery targeted-hello accept",
-       "Configure discovery parameters\n"
-       "LDP Targeted Hellos\n"
-       "Accept and respond to targeted hellos\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "hello_type", .value = "targeted-hello" },
-      NULL
-    };
-  return ldp_vty_targeted_hello_accept (vty, args);
-}
-
-DEFUN (ldp_label_local_advertise_explicit_null,
-       ldp_label_local_advertise_explicit_null_cmd,
-       "label local advertise explicit-null",
-       "Configure label control and policies\n"
-       "Configure local label control and policies\n"
-       "Configure outbound label advertisement control\n"
-       "Configure explicit-null advertisement\n")
-{
-  struct vty_arg *args[] = { NULL };
-  return ldp_vty_explicit_null (vty, args);
-}
-
-DEFUN (ldp_ttl_security_disable,
-       ldp_ttl_security_disable_cmd,
-       "ttl-security disable",
-       "LDP ttl security check\n"
-       "Disable ttl security\n")
-{
-  struct vty_arg *args[] = { NULL };
-  return ldp_vty_ttl_security (vty, args);
-}
-
-DEFUN (ldp_session_holdtime_session_time,
-       ldp_session_holdtime_session_time_cmd,
-       "session holdtime (15-65535)",
-       "Configure session parameters\n"
-       "Configure session holdtime\n"
-       "Time (seconds)\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "seconds", .value = argv[2]->arg },
-      NULL
-    };
-  return ldp_vty_session_holdtime (vty, args);
-}
-
-DEFUN (ldp_interface_ifname,
-       ldp_interface_ifname_cmd,
-       "interface IFNAME",
-       "Enable LDP on an interface and enter interface submode\n"
-       "Interface's name\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "ifname", .value = argv[1]->arg },
-      NULL
-    };
-  return ldp_vty_interface (vty, args);
-}
-
-DEFUN (ldp_discovery_transport_address_ipv4,
-       ldp_discovery_transport_address_ipv4_cmd,
-       "discovery transport-address A.B.C.D",
-       "Configure discovery parameters\n"
-       "Specify transport address for TCP connection\n"
-       "IP address to be used as transport address\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "addr", .value = argv[2]->arg },
-      NULL
-    };
-  return ldp_vty_trans_addr (vty, args);
-}
-
-DEFUN (ldp_neighbor_ipv4_targeted,
-       ldp_neighbor_ipv4_targeted_cmd,
-       "neighbor A.B.C.D targeted",
-       "Configure neighbor parameters\n"
-       "IP address of neighbor\n"
-       "Establish targeted session\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "addr", .value = argv[1]->arg },
-      NULL
-    };
-  return ldp_vty_neighbor_targeted (vty, args);
-}
-
-DEFUN (ldp_no_discovery_targeted_hello_accept,
-       ldp_no_discovery_targeted_hello_accept_cmd,
-       "no discovery targeted-hello accept",
-       "Negate a command or set its defaults\n"
-       "Configure discovery parameters\n"
-       "LDP Targeted Hellos\n"
-       "Accept and respond to targeted hellos\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      &(struct vty_arg) { .name = "hello_type", .value = "targeted-hello" },
-      NULL
-    };
-  return ldp_vty_targeted_hello_accept (vty, args);
-}
-
-DEFUN (ldp_no_label_local_advertise_explicit_null,
-       ldp_no_label_local_advertise_explicit_null_cmd,
-       "no label local advertise explicit-null",
-       "Negate a command or set its defaults\n"
-       "Configure label control and policies\n"
-       "Configure local label control and policies\n"
-       "Configure outbound label advertisement control\n"
-       "Configure explicit-null advertisement\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      NULL
-    };
-  return ldp_vty_explicit_null (vty, args);
-}
-
-DEFUN (ldp_no_ttl_security_disable,
-       ldp_no_ttl_security_disable_cmd,
-       "no ttl-security disable",
-       "Negate a command or set its defaults\n"
-       "LDP ttl security check\n"
-       "Disable ttl security\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      NULL
-    };
-  return ldp_vty_ttl_security (vty, args);
-}
-
-DEFUN (ldp_no_session_holdtime_session_time,
-       ldp_no_session_holdtime_session_time_cmd,
-       "no session holdtime (15-65535)",
-       "Negate a command or set its defaults\n"
-       "Configure session parameters\n"
-       "Configure session holdtime\n"
-       "Time (seconds)\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      &(struct vty_arg) { .name = "seconds", .value = argv[3]->arg },
-      NULL
-    };
-  return ldp_vty_session_holdtime (vty, args);
-}
-
-DEFUN (ldp_no_interface_ifname,
-       ldp_no_interface_ifname_cmd,
-       "no interface IFNAME",
-       "Negate a command or set its defaults\n"
-       "Enable LDP on an interface and enter interface submode\n"
-       "Interface's name\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      &(struct vty_arg) { .name = "ifname", .value = argv[2]->arg },
-      NULL
-    };
-  return ldp_vty_interface (vty, args);
-}
-
-DEFUN (ldp_no_discovery_transport_address_ipv4,
-       ldp_no_discovery_transport_address_ipv4_cmd,
-       "no discovery transport-address A.B.C.D",
-       "Negate a command or set its defaults\n"
-       "Configure discovery parameters\n"
-       "Specify transport address for TCP connection\n"
-       "IP address to be used as transport address\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      &(struct vty_arg) { .name = "addr", .value = argv[3]->arg },
-      NULL
-    };
-  return ldp_vty_trans_addr (vty, args);
-}
-
-DEFUN (ldp_no_neighbor_ipv4_targeted,
-       ldp_no_neighbor_ipv4_targeted_cmd,
-       "no neighbor A.B.C.D targeted",
-       "Negate a command or set its defaults\n"
-       "Configure neighbor parameters\n"
-       "IP address of neighbor\n"
-       "Establish targeted session\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      &(struct vty_arg) { .name = "addr", .value = argv[2]->arg },
-      NULL
-    };
-  return ldp_vty_neighbor_targeted (vty, args);
-}
-
-DEFUN (ldp_discovery_transport_address_ipv6,
-       ldp_discovery_transport_address_ipv6_cmd,
-       "discovery transport-address X:X::X:X",
-       "Configure discovery parameters\n"
-       "Specify transport address for TCP connection\n"
-       "IPv6 address to be used as transport address\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "addr", .value = argv[2]->arg },
-      NULL
-    };
-  return ldp_vty_trans_addr (vty, args);
-}
-
-DEFUN (ldp_neighbor_ipv6_targeted,
-       ldp_neighbor_ipv6_targeted_cmd,
-       "neighbor X:X::X:X targeted",
-       "Configure neighbor parameters\n"
-       "IPv6 address of neighbor\n"
-       "Establish targeted session\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "addr", .value = argv[1]->arg },
-      NULL
-    };
-  return ldp_vty_neighbor_targeted (vty, args);
-}
-
-DEFUN (ldp_no_discovery_transport_address_ipv6,
-       ldp_no_discovery_transport_address_ipv6_cmd,
-       "no discovery transport-address X:X::X:X",
-       "Negate a command or set its defaults\n"
-       "Configure discovery parameters\n"
-       "Specify transport address for TCP connection\n"
-       "IPv6 address to be used as transport address\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      &(struct vty_arg) { .name = "addr", .value = argv[3]->arg },
-      NULL
-    };
-  return ldp_vty_trans_addr (vty, args);
-}
-
-DEFUN (ldp_no_neighbor_ipv6_targeted,
-       ldp_no_neighbor_ipv6_targeted_cmd,
-       "no neighbor X:X::X:X targeted",
-       "Negate a command or set its defaults\n"
-       "Configure neighbor parameters\n"
-       "IPv6 address of neighbor\n"
-       "Establish targeted session\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      &(struct vty_arg) { .name = "addr", .value = argv[2]->arg },
-      NULL
-    };
-  return ldp_vty_neighbor_targeted (vty, args);
-}
-
-DEFUN (ldp_bridge_ifname,
-       ldp_bridge_ifname_cmd,
-       "bridge IFNAME",
-       "Bridge interface\n"
-       "Interface's name\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "ifname", .value = argv[1]->arg },
-      NULL
-    };
-  return ldp_vty_l2vpn_bridge (vty, args);
-}
-
-DEFUN (ldp_mtu_mtu,
-       ldp_mtu_mtu_cmd,
-       "mtu (1500-9180)",
-       "set Maximum Transmission Unit\n"
-       "Maximum Transmission Unit value\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "mtu", .value = argv[1]->arg },
-      NULL
-    };
-  return ldp_vty_l2vpn_mtu (vty, args);
-}
-
-DEFUN (ldp_member_interface_ifname,
-       ldp_member_interface_ifname_cmd,
-       "member interface IFNAME",
-       "L2VPN member configuration\n"
-       "Local interface\n"
-       "Interface's name\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "ifname", .value = argv[2]->arg },
-      NULL
-    };
-  return ldp_vty_l2vpn_interface (vty, args);
-}
-
-DEFUN (ldp_member_pseudowire_ifname,
-       ldp_member_pseudowire_ifname_cmd,
-       "member pseudowire IFNAME",
-       "L2VPN member configuration\n"
-       "Pseudowire interface\n"
-       "Interface's name\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "ifname", .value = argv[2]->arg },
-      NULL
-    };
-  return ldp_vty_l2vpn_pseudowire (vty, args);
-}
-
-DEFUN (ldp_vc_type_pwtype,
-       ldp_vc_type_pwtype_cmd,
-       "vc type <ethernet|ethernet-tagged>",
-       "Virtual Circuit options\n"
-       "Virtual Circuit type to use\n"
-       "Ethernet (type 5)\n"
-       "Ethernet-tagged (type 4)\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "type", .value = argv[2]->arg },
-      NULL
-    };
-  return ldp_vty_l2vpn_pwtype (vty, args);
-}
-
-DEFUN (ldp_no_bridge_ifname,
-       ldp_no_bridge_ifname_cmd,
-       "no bridge IFNAME",
-       "Negate a command or set its defaults\n"
-       "Bridge interface\n"
-       "Interface's name\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      &(struct vty_arg) { .name = "ifname", .value = argv[2]->arg },
-      NULL
-    };
-  return ldp_vty_l2vpn_bridge (vty, args);
-}
-
-DEFUN (ldp_no_mtu_mtu,
-       ldp_no_mtu_mtu_cmd,
-       "no mtu (1500-9180)",
-       "Negate a command or set its defaults\n"
-       "set Maximum Transmission Unit\n"
-       "Maximum Transmission Unit value\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      &(struct vty_arg) { .name = "mtu", .value = argv[2]->arg },
-      NULL
-    };
-  return ldp_vty_l2vpn_mtu (vty, args);
-}
-
-DEFUN (ldp_no_member_interface_ifname,
-       ldp_no_member_interface_ifname_cmd,
-       "no member interface IFNAME",
-       "Negate a command or set its defaults\n"
-       "L2VPN member configuration\n"
-       "Local interface\n"
-       "Interface's name\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      &(struct vty_arg) { .name = "ifname", .value = argv[3]->arg },
-      NULL
-    };
-  return ldp_vty_l2vpn_interface (vty, args);
-}
-
-DEFUN (ldp_no_member_pseudowire_ifname,
-       ldp_no_member_pseudowire_ifname_cmd,
-       "no member pseudowire IFNAME",
-       "Negate a command or set its defaults\n"
-       "L2VPN member configuration\n"
-       "Pseudowire interface\n"
-       "Interface's name\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      &(struct vty_arg) { .name = "ifname", .value = argv[3]->arg },
-      NULL
-    };
-  return ldp_vty_l2vpn_pseudowire (vty, args);
-}
-
-DEFUN (ldp_no_vc_type_pwtype,
-       ldp_no_vc_type_pwtype_cmd,
-       "no vc type <ethernet|ethernet-tagged>",
-       "Negate a command or set its defaults\n"
-       "Virtual Circuit options\n"
-       "Virtual Circuit type to use\n"
-       "Ethernet (type 5)\n"
-       "Ethernet-tagged (type 4)\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      &(struct vty_arg) { .name = "type", .value = argv[3]->arg },
-      NULL
-    };
-  return ldp_vty_l2vpn_pwtype (vty, args);
-}
-
-DEFUN (ldp_control_word_cword,
-       ldp_control_word_cword_cmd,
-       "control-word <exclude|include>",
-       "Control-word options\n"
-       "Exclude control-word in pseudowire packets\n"
-       "Include control-word in pseudowire packets\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "preference", .value = argv[1]->arg },
-      NULL
-    };
-  return ldp_vty_l2vpn_pw_cword (vty, args);
-}
-
-DEFUN (ldp_neighbor_address_addr,
-       ldp_neighbor_address_addr_cmd,
-       "neighbor address <A.B.C.D|X:X::X:X>",
-       "Remote endpoint configuration\n"
-       "Specify the IPv4 or IPv6 address of the remote endpoint\n"
-       "IPv4 address\n"
-       "IPv6 address\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "addr", .value = argv[2]->arg },
-      NULL
-    };
-  return ldp_vty_l2vpn_pw_nbr_addr (vty, args);
-}
-
-DEFUN (ldp_neighbor_lsr_id_ipv4,
-       ldp_neighbor_lsr_id_ipv4_cmd,
-       "neighbor lsr-id A.B.C.D",
-       "Remote endpoint configuration\n"
-       "Specify the LSR-ID of the remote endpoint\n"
-       "IPv4 address\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "lsr-id", .value = argv[2]->arg },
-      NULL
-    };
-  return ldp_vty_l2vpn_pw_nbr_id (vty, args);
-}
-
-DEFUN (ldp_pw_id_pwid,
-       ldp_pw_id_pwid_cmd,
-       "pw-id (1-4294967295)",
-       "Set the Virtual Circuit ID\n"
-       "Virtual Circuit ID value\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "pwid", .value = argv[1]->arg },
-      NULL
-    };
-  return ldp_vty_l2vpn_pw_pwid (vty, args);
-}
-
-DEFUN (ldp_pw_status_disable,
-       ldp_pw_status_disable_cmd,
-       "pw-status disable",
-       "Configure PW status\n"
-       "Disable PW status\n")
-{
-  struct vty_arg *args[] = { NULL };
-  return ldp_vty_l2vpn_pw_pwstatus (vty, args);
-}
-
-DEFUN (ldp_no_control_word_cword,
-       ldp_no_control_word_cword_cmd,
-       "no control-word <exclude|include>",
-       "Negate a command or set its defaults\n"
-       "Control-word options\n"
-       "Exclude control-word in pseudowire packets\n"
-       "Include control-word in pseudowire packets\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      &(struct vty_arg) { .name = "preference", .value = argv[2]->arg },
-      NULL
-    };
-  return ldp_vty_l2vpn_pw_cword (vty, args);
-}
-
-DEFUN (ldp_no_neighbor_address_addr,
-       ldp_no_neighbor_address_addr_cmd,
-       "no neighbor address <A.B.C.D|X:X::X:X>",
-       "Negate a command or set its defaults\n"
-       "Remote endpoint configuration\n"
-       "Specify the IPv4 or IPv6 address of the remote endpoint\n"
-       "IPv4 address\n"
-       "IPv6 address\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      &(struct vty_arg) { .name = "addr", .value = argv[3]->arg },
-      NULL
-    };
-  return ldp_vty_l2vpn_pw_nbr_addr (vty, args);
-}
-
-DEFUN (ldp_no_neighbor_lsr_id_ipv4,
-       ldp_no_neighbor_lsr_id_ipv4_cmd,
-       "no neighbor lsr-id A.B.C.D",
-       "Negate a command or set its defaults\n"
-       "Remote endpoint configuration\n"
-       "Specify the LSR-ID of the remote endpoint\n"
-       "IPv4 address\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      &(struct vty_arg) { .name = "lsr-id", .value = argv[3]->arg },
-      NULL
-    };
-  return ldp_vty_l2vpn_pw_nbr_id (vty, args);
-}
-
-DEFUN (ldp_no_pw_id_pwid,
-       ldp_no_pw_id_pwid_cmd,
-       "no pw-id (1-4294967295)",
-       "Negate a command or set its defaults\n"
-       "Set the Virtual Circuit ID\n"
-       "Virtual Circuit ID value\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      &(struct vty_arg) { .name = "pwid", .value = argv[2]->arg },
-      NULL
-    };
-  return ldp_vty_l2vpn_pw_pwid (vty, args);
-}
-
-DEFUN (ldp_no_pw_status_disable,
-       ldp_no_pw_status_disable_cmd,
-       "no pw-status disable",
-       "Negate a command or set its defaults\n"
-       "Configure PW status\n"
-       "Disable PW status\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      NULL
-    };
-  return ldp_vty_l2vpn_pw_pwstatus (vty, args);
-}
-
-DEFUN (ldp_show_mpls_ldp_neighbor,
-       ldp_show_mpls_ldp_neighbor_cmd,
-       "show mpls ldp neighbor",
-       "Show running system information\n"
-       "MPLS information\n"
-       "Label Distribution Protocol\n"
-       "Neighbor information\n")
-{
-  struct vty_arg *args[] = { NULL };
-  return ldp_vty_show_neighbor (vty, args);
-}
-
-DEFUN (ldp_show_mpls_ldp_binding,
-       ldp_show_mpls_ldp_binding_cmd,
-       "show mpls ldp binding",
-       "Show running system information\n"
-       "MPLS information\n"
-       "Label Distribution Protocol\n"
-       "Label Information Base (LIB) information\n")
-{
-  struct vty_arg *args[] = { NULL };
-  return ldp_vty_show_binding (vty, args);
-}
-
-DEFUN (ldp_show_mpls_ldp_discovery,
-       ldp_show_mpls_ldp_discovery_cmd,
-       "show mpls ldp discovery",
-       "Show running system information\n"
-       "MPLS information\n"
-       "Label Distribution Protocol\n"
-       "Discovery Hello Information\n")
-{
-  struct vty_arg *args[] = { NULL };
-  return ldp_vty_show_discovery (vty, args);
-}
-
-DEFUN (ldp_show_mpls_ldp_interface,
-       ldp_show_mpls_ldp_interface_cmd,
-       "show mpls ldp interface",
-       "Show running system information\n"
-       "MPLS information\n"
-       "Label Distribution Protocol\n"
-       "interface information\n")
-{
-  struct vty_arg *args[] = { NULL };
-  return ldp_vty_show_interface (vty, args);
-}
-
-DEFUN (ldp_show_mpls_ldp_address_family_binding,
-       ldp_show_mpls_ldp_address_family_binding_cmd,
-       "show mpls ldp <ipv4|ipv6> binding",
-       "Show running system information\n"
-       "MPLS information\n"
-       "Label Distribution Protocol\n"
-       "IPv4 Address Family\n"
-       "IPv6 Address Family\n"
-       "Label Information Base (LIB) information\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "address-family", .value = argv[3]->arg },
-      NULL
-    };
-  return ldp_vty_show_binding (vty, args);
-}
-
-DEFUN (ldp_show_mpls_ldp_address_family_discovery,
-       ldp_show_mpls_ldp_address_family_discovery_cmd,
-       "show mpls ldp <ipv4|ipv6> discovery",
-       "Show running system information\n"
-       "MPLS information\n"
-       "Label Distribution Protocol\n"
-       "IPv4 Address Family\n"
-       "IPv6 Address Family\n"
-       "Discovery Hello Information\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "address-family", .value = argv[3]->arg },
-      NULL
-    };
-  return ldp_vty_show_discovery (vty, args);
-}
-
-DEFUN (ldp_show_mpls_ldp_address_family_interface,
-       ldp_show_mpls_ldp_address_family_interface_cmd,
-       "show mpls ldp <ipv4|ipv6> interface",
-       "Show running system information\n"
-       "MPLS information\n"
-       "Label Distribution Protocol\n"
-       "IPv4 Address Family\n"
-       "IPv6 Address Family\n"
-       "interface information\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "address-family", .value = argv[3]->arg },
-      NULL
-    };
-  return ldp_vty_show_interface (vty, args);
-}
-
-DEFUN (ldp_show_l2vpn_atom_binding,
-       ldp_show_l2vpn_atom_binding_cmd,
-       "show l2vpn atom binding",
-       "Show running system information\n"
-       "Show information about Layer2 VPN\n"
-       "Show Any Transport over MPLS information\n"
-       "Show AToM label binding information\n")
-{
-  struct vty_arg *args[] = { NULL };
-  return ldp_vty_show_atom_binding (vty, args);
-}
-
-DEFUN (ldp_show_l2vpn_atom_vc,
-       ldp_show_l2vpn_atom_vc_cmd,
-       "show l2vpn atom vc",
-       "Show running system information\n"
-       "Show information about Layer2 VPN\n"
-       "Show Any Transport over MPLS information\n"
-       "Show AToM virtual circuit information\n")
-{
-  struct vty_arg *args[] = { NULL };
-  return ldp_vty_show_atom_vc (vty, args);
-}
-
-DEFUN (ldp_show_debugging_mpls_ldp,
-       ldp_show_debugging_mpls_ldp_cmd,
-       "show debugging mpls ldp",
-       "Show running system information\n"
-       "Debugging functions\n"
-       "MPLS information\n"
-       "Label Distribution Protocol\n")
-{
-  struct vty_arg *args[] = { NULL };
-  return ldp_vty_show_debugging (vty, args);
-}
-
-DEFUN (ldp_clear_mpls_ldp_neighbor,
-       ldp_clear_mpls_ldp_neighbor_cmd,
-       "clear mpls ldp neighbor",
-       "Reset functions\n"
-       "Reset MPLS statistical information\n"
-       "Clear LDP state\n"
-       "Clear LDP neighbor sessions\n")
-{
-  struct vty_arg *args[] = { NULL };
-  return ldp_vty_clear_nbr (vty, args);
-}
-
-DEFUN (ldp_clear_mpls_ldp_neighbor_addr,
-       ldp_clear_mpls_ldp_neighbor_addr_cmd,
-       "clear mpls ldp neighbor <A.B.C.D|X:X::X:X>",
-       "Reset functions\n"
-       "Reset MPLS statistical information\n"
-       "Clear LDP state\n"
-       "Clear LDP neighbor sessions\n"
-       "IPv4 address\n"
-       "IPv6 address\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "addr", .value = argv[4]->arg },
-      NULL
-    };
-  return ldp_vty_clear_nbr (vty, args);
-}
-
-DEFUN (ldp_debug_mpls_ldp_discovery_hello_dir,
-       ldp_debug_mpls_ldp_discovery_hello_dir_cmd,
-       "debug mpls ldp discovery hello <recv|sent>",
-       "Debugging functions\n"
-       "MPLS information\n"
-       "Label Distribution Protocol\n"
-       "Discovery messages\n"
-       "Discovery hello message\n"
-       "Received messages\n"
-       "Sent messages\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "type", .value = "discovery" },
-      &(struct vty_arg) { .name = "dir", .value = argv[5]->arg },
-      NULL
-    };
-  return ldp_vty_debug (vty, args);
-}
-
-DEFUN (ldp_debug_mpls_ldp_errors,
-       ldp_debug_mpls_ldp_errors_cmd,
-       "debug mpls ldp errors",
-       "Debugging functions\n"
-       "MPLS information\n"
-       "Label Distribution Protocol\n"
-       "Errors\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "type", .value = "errors" },
-      NULL
-    };
-  return ldp_vty_debug (vty, args);
-}
-
-DEFUN (ldp_debug_mpls_ldp_event,
-       ldp_debug_mpls_ldp_event_cmd,
-       "debug mpls ldp event",
-       "Debugging functions\n"
-       "MPLS information\n"
-       "Label Distribution Protocol\n"
-       "LDP event information\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "type", .value = "event" },
-      NULL
-    };
-  return ldp_vty_debug (vty, args);
-}
-
-DEFUN (ldp_debug_mpls_ldp_messages_recv,
-       ldp_debug_mpls_ldp_messages_recv_cmd,
-       "debug mpls ldp messages recv",
-       "Debugging functions\n"
-       "MPLS information\n"
-       "Label Distribution Protocol\n"
-       "Messages\n"
-       "Received messages, excluding periodic Keep Alives\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "type", .value = "messages" },
-      &(struct vty_arg) { .name = "dir", .value = "recv" },
-      NULL
-    };
-  return ldp_vty_debug (vty, args);
-}
-
-DEFUN (ldp_debug_mpls_ldp_messages_recv_all,
-       ldp_debug_mpls_ldp_messages_recv_all_cmd,
-       "debug mpls ldp messages recv all",
-       "Debugging functions\n"
-       "MPLS information\n"
-       "Label Distribution Protocol\n"
-       "Messages\n"
-       "Received messages, excluding periodic Keep Alives\n"
-       "Received messages, including periodic Keep Alives\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "type", .value = "messages" },
-      &(struct vty_arg) { .name = "dir", .value = "recv" },
-      &(struct vty_arg) { .name = "all", .value = "all" },
-      NULL
-    };
-  return ldp_vty_debug (vty, args);
-}
-
-DEFUN (ldp_debug_mpls_ldp_messages_sent,
-       ldp_debug_mpls_ldp_messages_sent_cmd,
-       "debug mpls ldp messages sent",
-       "Debugging functions\n"
-       "MPLS information\n"
-       "Label Distribution Protocol\n"
-       "Messages\n"
-       "Sent messages, excluding periodic Keep Alives\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "type", .value = "messages" },
-      &(struct vty_arg) { .name = "dir", .value = "sent" },
-      NULL
-    };
-  return ldp_vty_debug (vty, args);
-}
-
-DEFUN (ldp_debug_mpls_ldp_messages_sent_all,
-       ldp_debug_mpls_ldp_messages_sent_all_cmd,
-       "debug mpls ldp messages sent all",
-       "Debugging functions\n"
-       "MPLS information\n"
-       "Label Distribution Protocol\n"
-       "Messages\n"
-       "Sent messages, excluding periodic Keep Alives\n"
-       "Sent messages, including periodic Keep Alives\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "type", .value = "messages" },
-      &(struct vty_arg) { .name = "dir", .value = "sent" },
-      &(struct vty_arg) { .name = "all", .value = "all" },
-      NULL
-    };
-  return ldp_vty_debug (vty, args);
-}
-
-DEFUN (ldp_debug_mpls_ldp_zebra,
-       ldp_debug_mpls_ldp_zebra_cmd,
-       "debug mpls ldp zebra",
-       "Debugging functions\n"
-       "MPLS information\n"
-       "Label Distribution Protocol\n"
-       "LDP zebra information\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "type", .value = "zebra" },
-      NULL
-    };
-  return ldp_vty_debug (vty, args);
-}
-
-DEFUN (ldp_no_debug_mpls_ldp_discovery_hello_dir,
-       ldp_no_debug_mpls_ldp_discovery_hello_dir_cmd,
-       "no debug mpls ldp discovery hello <recv|sent>",
-       "Negate a command or set its defaults\n"
-       "Debugging functions\n"
-       "MPLS information\n"
-       "Label Distribution Protocol\n"
-       "Discovery messages\n"
-       "Discovery hello message\n"
-       "Received messages\n"
-       "Sent messages\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      &(struct vty_arg) { .name = "type", .value = "discovery" },
-      &(struct vty_arg) { .name = "dir", .value = argv[6]->arg },
-      NULL
-    };
-  return ldp_vty_debug (vty, args);
-}
-
-DEFUN (ldp_no_debug_mpls_ldp_errors,
-       ldp_no_debug_mpls_ldp_errors_cmd,
-       "no debug mpls ldp errors",
-       "Negate a command or set its defaults\n"
-       "Debugging functions\n"
-       "MPLS information\n"
-       "Label Distribution Protocol\n"
-       "Errors\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      &(struct vty_arg) { .name = "type", .value = "errors" },
-      NULL
-    };
-  return ldp_vty_debug (vty, args);
-}
-
-DEFUN (ldp_no_debug_mpls_ldp_event,
-       ldp_no_debug_mpls_ldp_event_cmd,
-       "no debug mpls ldp event",
-       "Negate a command or set its defaults\n"
-       "Debugging functions\n"
-       "MPLS information\n"
-       "Label Distribution Protocol\n"
-       "LDP event information\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      &(struct vty_arg) { .name = "type", .value = "event" },
-      NULL
-    };
-  return ldp_vty_debug (vty, args);
-}
-
-DEFUN (ldp_no_debug_mpls_ldp_messages_recv,
-       ldp_no_debug_mpls_ldp_messages_recv_cmd,
-       "no debug mpls ldp messages recv",
-       "Negate a command or set its defaults\n"
-       "Debugging functions\n"
-       "MPLS information\n"
-       "Label Distribution Protocol\n"
-       "Messages\n"
-       "Received messages, excluding periodic Keep Alives\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      &(struct vty_arg) { .name = "type", .value = "messages" },
-      &(struct vty_arg) { .name = "dir", .value = "recv" },
-      NULL
-    };
-  return ldp_vty_debug (vty, args);
-}
-
-DEFUN (ldp_no_debug_mpls_ldp_messages_recv_all,
-       ldp_no_debug_mpls_ldp_messages_recv_all_cmd,
-       "no debug mpls ldp messages recv all",
-       "Negate a command or set its defaults\n"
-       "Debugging functions\n"
-       "MPLS information\n"
-       "Label Distribution Protocol\n"
-       "Messages\n"
-       "Received messages, excluding periodic Keep Alives\n"
-       "Received messages, including periodic Keep Alives\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      &(struct vty_arg) { .name = "type", .value = "messages" },
-      &(struct vty_arg) { .name = "dir", .value = "recv" },
-      &(struct vty_arg) { .name = "all", .value = "all" },
-      NULL
-    };
-  return ldp_vty_debug (vty, args);
-}
-
-DEFUN (ldp_no_debug_mpls_ldp_messages_sent,
-       ldp_no_debug_mpls_ldp_messages_sent_cmd,
-       "no debug mpls ldp messages sent",
-       "Negate a command or set its defaults\n"
-       "Debugging functions\n"
-       "MPLS information\n"
-       "Label Distribution Protocol\n"
-       "Messages\n"
-       "Sent messages, excluding periodic Keep Alives\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      &(struct vty_arg) { .name = "type", .value = "messages" },
-      &(struct vty_arg) { .name = "dir", .value = "sent" },
-      NULL
-    };
-  return ldp_vty_debug (vty, args);
-}
-
-DEFUN (ldp_no_debug_mpls_ldp_messages_sent_all,
-       ldp_no_debug_mpls_ldp_messages_sent_all_cmd,
-       "no debug mpls ldp messages sent all",
-       "Negate a command or set its defaults\n"
-       "Debugging functions\n"
-       "MPLS information\n"
-       "Label Distribution Protocol\n"
-       "Messages\n"
-       "Sent messages, excluding periodic Keep Alives\n"
-       "Sent messages, including periodic Keep Alives\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      &(struct vty_arg) { .name = "type", .value = "messages" },
-      &(struct vty_arg) { .name = "dir", .value = "sent" },
-      &(struct vty_arg) { .name = "all", .value = "all" },
-      NULL
-    };
-  return ldp_vty_debug (vty, args);
-}
-
-DEFUN (ldp_no_debug_mpls_ldp_zebra,
-       ldp_no_debug_mpls_ldp_zebra_cmd,
-       "no debug mpls ldp zebra",
-       "Negate a command or set its defaults\n"
-       "Debugging functions\n"
-       "MPLS information\n"
-       "Label Distribution Protocol\n"
-       "LDP zebra information\n")
-{
-  struct vty_arg *args[] =
-    {
-      &(struct vty_arg) { .name = "no", .value = "no" },
-      &(struct vty_arg) { .name = "type", .value = "zebra" },
-      NULL
-    };
-  return ldp_vty_debug (vty, args);
-}
-
-void
-ldp_vty_init (void)
-{
-  install_element (CONFIG_NODE, &ldp_mpls_ldp_cmd);
-  install_element (CONFIG_NODE, &ldp_l2vpn_word_type_vpls_cmd);
-  install_element (CONFIG_NODE, &ldp_no_mpls_ldp_cmd);
-  install_element (CONFIG_NODE, &ldp_no_l2vpn_word_type_vpls_cmd);
-  install_element (CONFIG_NODE, &ldp_debug_mpls_ldp_discovery_hello_dir_cmd);
-  install_element (CONFIG_NODE, &ldp_debug_mpls_ldp_errors_cmd);
-  install_element (CONFIG_NODE, &ldp_debug_mpls_ldp_event_cmd);
-  install_element (CONFIG_NODE, &ldp_debug_mpls_ldp_messages_recv_cmd);
-  install_element (CONFIG_NODE, &ldp_debug_mpls_ldp_messages_recv_all_cmd);
-  install_element (CONFIG_NODE, &ldp_debug_mpls_ldp_messages_sent_cmd);
-  install_element (CONFIG_NODE, &ldp_debug_mpls_ldp_messages_sent_all_cmd);
-  install_element (CONFIG_NODE, &ldp_debug_mpls_ldp_zebra_cmd);
-  install_element (CONFIG_NODE, &ldp_no_debug_mpls_ldp_discovery_hello_dir_cmd);
-  install_element (CONFIG_NODE, &ldp_no_debug_mpls_ldp_errors_cmd);
-  install_element (CONFIG_NODE, &ldp_no_debug_mpls_ldp_event_cmd);
-  install_element (CONFIG_NODE, &ldp_no_debug_mpls_ldp_messages_recv_cmd);
-  install_element (CONFIG_NODE, &ldp_no_debug_mpls_ldp_messages_recv_all_cmd);
-  install_element (CONFIG_NODE, &ldp_no_debug_mpls_ldp_messages_sent_cmd);
-  install_element (CONFIG_NODE, &ldp_no_debug_mpls_ldp_messages_sent_all_cmd);
-  install_element (CONFIG_NODE, &ldp_no_debug_mpls_ldp_zebra_cmd);
-  install_node (&ldp_node, ldp_config_write);
-  install_default (LDP_NODE);
-  install_element (LDP_NODE, &ldp_address_family_ipv4_cmd);
-  install_element (LDP_NODE, &ldp_address_family_ipv6_cmd);
-  install_element (LDP_NODE, &ldp_discovery_hello_holdtime_disc_time_cmd);
-  install_element (LDP_NODE, &ldp_discovery_hello_interval_disc_time_cmd);
-  install_element (LDP_NODE, &ldp_discovery_targeted_hello_holdtime_disc_time_cmd);
-  install_element (LDP_NODE, &ldp_discovery_targeted_hello_interval_disc_time_cmd);
-  install_element (LDP_NODE, &ldp_dual_stack_transport_connection_prefer_ipv4_cmd);
-  install_element (LDP_NODE, &ldp_dual_stack_cisco_interop_cmd);
-  install_element (LDP_NODE, &ldp_neighbor_ipv4_password_word_cmd);
-  install_element (LDP_NODE, &ldp_neighbor_ipv4_session_holdtime_session_time_cmd);
-  install_element (LDP_NODE, &ldp_neighbor_ipv4_ttl_security_disable_cmd);
-  install_element (LDP_NODE, &ldp_neighbor_ipv4_ttl_security_hops_hops_cmd);
-  install_element (LDP_NODE, &ldp_router_id_ipv4_cmd);
-  install_element (LDP_NODE, &ldp_no_address_family_ipv4_cmd);
-  install_element (LDP_NODE, &ldp_no_address_family_ipv6_cmd);
-  install_element (LDP_NODE, &ldp_no_discovery_hello_holdtime_disc_time_cmd);
-  install_element (LDP_NODE, &ldp_no_discovery_hello_interval_disc_time_cmd);
-  install_element (LDP_NODE, &ldp_no_discovery_targeted_hello_holdtime_disc_time_cmd);
-  install_element (LDP_NODE, &ldp_no_discovery_targeted_hello_interval_disc_time_cmd);
-  install_element (LDP_NODE, &ldp_no_dual_stack_transport_connection_prefer_ipv4_cmd);
-  install_element (LDP_NODE, &ldp_no_dual_stack_cisco_interop_cmd);
-  install_element (LDP_NODE, &ldp_no_neighbor_ipv4_password_word_cmd);
-  install_element (LDP_NODE, &ldp_no_neighbor_ipv4_session_holdtime_session_time_cmd);
-  install_element (LDP_NODE, &ldp_no_neighbor_ipv4_ttl_security_disable_cmd);
-  install_element (LDP_NODE, &ldp_no_neighbor_ipv4_ttl_security_hops_hops_cmd);
-  install_element (LDP_NODE, &ldp_no_router_id_ipv4_cmd);
-  install_node (&ldp_ipv4_node, NULL);
-  install_default (LDP_IPV4_NODE);
-  install_element (LDP_IPV4_NODE, &ldp_discovery_hello_holdtime_disc_time_cmd);
-  install_element (LDP_IPV4_NODE, &ldp_discovery_hello_interval_disc_time_cmd);
-  install_element (LDP_IPV4_NODE, &ldp_discovery_targeted_hello_holdtime_disc_time_cmd);
-  install_element (LDP_IPV4_NODE, &ldp_discovery_targeted_hello_interval_disc_time_cmd);
-  install_element (LDP_IPV4_NODE, &ldp_discovery_targeted_hello_accept_cmd);
-  install_element (LDP_IPV4_NODE, &ldp_label_local_advertise_explicit_null_cmd);
-  install_element (LDP_IPV4_NODE, &ldp_ttl_security_disable_cmd);
-  install_element (LDP_IPV4_NODE, &ldp_session_holdtime_session_time_cmd);
-  install_element (LDP_IPV4_NODE, &ldp_interface_ifname_cmd);
-  install_element (LDP_IPV4_NODE, &ldp_discovery_transport_address_ipv4_cmd);
-  install_element (LDP_IPV4_NODE, &ldp_neighbor_ipv4_targeted_cmd);
-  install_element (LDP_IPV4_NODE, &ldp_no_discovery_hello_holdtime_disc_time_cmd);
-  install_element (LDP_IPV4_NODE, &ldp_no_discovery_hello_interval_disc_time_cmd);
-  install_element (LDP_IPV4_NODE, &ldp_no_discovery_targeted_hello_holdtime_disc_time_cmd);
-  install_element (LDP_IPV4_NODE, &ldp_no_discovery_targeted_hello_interval_disc_time_cmd);
-  install_element (LDP_IPV4_NODE, &ldp_no_discovery_targeted_hello_accept_cmd);
-  install_element (LDP_IPV4_NODE, &ldp_no_label_local_advertise_explicit_null_cmd);
-  install_element (LDP_IPV4_NODE, &ldp_no_ttl_security_disable_cmd);
-  install_element (LDP_IPV4_NODE, &ldp_no_session_holdtime_session_time_cmd);
-  install_element (LDP_IPV4_NODE, &ldp_no_interface_ifname_cmd);
-  install_element (LDP_IPV4_NODE, &ldp_no_discovery_transport_address_ipv4_cmd);
-  install_element (LDP_IPV4_NODE, &ldp_no_neighbor_ipv4_targeted_cmd);
-  install_node (&ldp_ipv6_node, NULL);
-  install_default (LDP_IPV6_NODE);
-  install_element (LDP_IPV6_NODE, &ldp_discovery_hello_holdtime_disc_time_cmd);
-  install_element (LDP_IPV6_NODE, &ldp_discovery_hello_interval_disc_time_cmd);
-  install_element (LDP_IPV6_NODE, &ldp_discovery_targeted_hello_holdtime_disc_time_cmd);
-  install_element (LDP_IPV6_NODE, &ldp_discovery_targeted_hello_interval_disc_time_cmd);
-  install_element (LDP_IPV6_NODE, &ldp_discovery_targeted_hello_accept_cmd);
-  install_element (LDP_IPV6_NODE, &ldp_label_local_advertise_explicit_null_cmd);
-  install_element (LDP_IPV6_NODE, &ldp_ttl_security_disable_cmd);
-  install_element (LDP_IPV6_NODE, &ldp_session_holdtime_session_time_cmd);
-  install_element (LDP_IPV6_NODE, &ldp_interface_ifname_cmd);
-  install_element (LDP_IPV6_NODE, &ldp_discovery_transport_address_ipv6_cmd);
-  install_element (LDP_IPV6_NODE, &ldp_neighbor_ipv6_targeted_cmd);
-  install_element (LDP_IPV6_NODE, &ldp_no_discovery_hello_holdtime_disc_time_cmd);
-  install_element (LDP_IPV6_NODE, &ldp_no_discovery_hello_interval_disc_time_cmd);
-  install_element (LDP_IPV6_NODE, &ldp_no_discovery_targeted_hello_holdtime_disc_time_cmd);
-  install_element (LDP_IPV6_NODE, &ldp_no_discovery_targeted_hello_interval_disc_time_cmd);
-  install_element (LDP_IPV6_NODE, &ldp_no_discovery_targeted_hello_accept_cmd);
-  install_element (LDP_IPV6_NODE, &ldp_no_label_local_advertise_explicit_null_cmd);
-  install_element (LDP_IPV6_NODE, &ldp_no_ttl_security_disable_cmd);
-  install_element (LDP_IPV6_NODE, &ldp_no_session_holdtime_session_time_cmd);
-  install_element (LDP_IPV6_NODE, &ldp_no_interface_ifname_cmd);
-  install_element (LDP_IPV6_NODE, &ldp_no_discovery_transport_address_ipv6_cmd);
-  install_element (LDP_IPV6_NODE, &ldp_no_neighbor_ipv6_targeted_cmd);
-  install_node (&ldp_ipv4_iface_node, NULL);
-  install_default (LDP_IPV4_IFACE_NODE);
-  install_element (LDP_IPV4_IFACE_NODE, &ldp_discovery_hello_holdtime_disc_time_cmd);
-  install_element (LDP_IPV4_IFACE_NODE, &ldp_discovery_hello_interval_disc_time_cmd);
-  install_element (LDP_IPV4_IFACE_NODE, &ldp_no_discovery_hello_holdtime_disc_time_cmd);
-  install_element (LDP_IPV4_IFACE_NODE, &ldp_no_discovery_hello_interval_disc_time_cmd);
-  install_node (&ldp_ipv6_iface_node, NULL);
-  install_default (LDP_IPV6_IFACE_NODE);
-  install_element (LDP_IPV6_IFACE_NODE, &ldp_discovery_hello_holdtime_disc_time_cmd);
-  install_element (LDP_IPV6_IFACE_NODE, &ldp_discovery_hello_interval_disc_time_cmd);
-  install_element (LDP_IPV6_IFACE_NODE, &ldp_no_discovery_hello_holdtime_disc_time_cmd);
-  install_element (LDP_IPV6_IFACE_NODE, &ldp_no_discovery_hello_interval_disc_time_cmd);
-  install_node (&ldp_l2vpn_node, ldp_l2vpn_config_write);
-  install_default (LDP_L2VPN_NODE);
-  install_element (LDP_L2VPN_NODE, &ldp_bridge_ifname_cmd);
-  install_element (LDP_L2VPN_NODE, &ldp_mtu_mtu_cmd);
-  install_element (LDP_L2VPN_NODE, &ldp_member_interface_ifname_cmd);
-  install_element (LDP_L2VPN_NODE, &ldp_member_pseudowire_ifname_cmd);
-  install_element (LDP_L2VPN_NODE, &ldp_vc_type_pwtype_cmd);
-  install_element (LDP_L2VPN_NODE, &ldp_no_bridge_ifname_cmd);
-  install_element (LDP_L2VPN_NODE, &ldp_no_mtu_mtu_cmd);
-  install_element (LDP_L2VPN_NODE, &ldp_no_member_interface_ifname_cmd);
-  install_element (LDP_L2VPN_NODE, &ldp_no_member_pseudowire_ifname_cmd);
-  install_element (LDP_L2VPN_NODE, &ldp_no_vc_type_pwtype_cmd);
-  install_node (&ldp_pseudowire_node, NULL);
-  install_default (LDP_PSEUDOWIRE_NODE);
-  install_element (LDP_PSEUDOWIRE_NODE, &ldp_control_word_cword_cmd);
-  install_element (LDP_PSEUDOWIRE_NODE, &ldp_neighbor_address_addr_cmd);
-  install_element (LDP_PSEUDOWIRE_NODE, &ldp_neighbor_lsr_id_ipv4_cmd);
-  install_element (LDP_PSEUDOWIRE_NODE, &ldp_pw_id_pwid_cmd);
-  install_element (LDP_PSEUDOWIRE_NODE, &ldp_pw_status_disable_cmd);
-  install_element (LDP_PSEUDOWIRE_NODE, &ldp_no_control_word_cword_cmd);
-  install_element (LDP_PSEUDOWIRE_NODE, &ldp_no_neighbor_address_addr_cmd);
-  install_element (LDP_PSEUDOWIRE_NODE, &ldp_no_neighbor_lsr_id_ipv4_cmd);
-  install_element (LDP_PSEUDOWIRE_NODE, &ldp_no_pw_id_pwid_cmd);
-  install_element (LDP_PSEUDOWIRE_NODE, &ldp_no_pw_status_disable_cmd);
-  install_node (&ldp_debug_node, ldp_debug_config_write);
-  install_element (ENABLE_NODE, &ldp_debug_mpls_ldp_discovery_hello_dir_cmd);
-  install_element (ENABLE_NODE, &ldp_debug_mpls_ldp_errors_cmd);
-  install_element (ENABLE_NODE, &ldp_debug_mpls_ldp_event_cmd);
-  install_element (ENABLE_NODE, &ldp_debug_mpls_ldp_messages_recv_cmd);
-  install_element (ENABLE_NODE, &ldp_debug_mpls_ldp_messages_recv_all_cmd);
-  install_element (ENABLE_NODE, &ldp_debug_mpls_ldp_messages_sent_cmd);
-  install_element (ENABLE_NODE, &ldp_debug_mpls_ldp_messages_sent_all_cmd);
-  install_element (ENABLE_NODE, &ldp_debug_mpls_ldp_zebra_cmd);
-  install_element (ENABLE_NODE, &ldp_no_debug_mpls_ldp_discovery_hello_dir_cmd);
-  install_element (ENABLE_NODE, &ldp_no_debug_mpls_ldp_errors_cmd);
-  install_element (ENABLE_NODE, &ldp_no_debug_mpls_ldp_event_cmd);
-  install_element (ENABLE_NODE, &ldp_no_debug_mpls_ldp_messages_recv_cmd);
-  install_element (ENABLE_NODE, &ldp_no_debug_mpls_ldp_messages_recv_all_cmd);
-  install_element (ENABLE_NODE, &ldp_no_debug_mpls_ldp_messages_sent_cmd);
-  install_element (ENABLE_NODE, &ldp_no_debug_mpls_ldp_messages_sent_all_cmd);
-  install_element (ENABLE_NODE, &ldp_no_debug_mpls_ldp_zebra_cmd);
-  install_element (VIEW_NODE, &ldp_show_mpls_ldp_neighbor_cmd);
-  install_element (VIEW_NODE, &ldp_show_mpls_ldp_binding_cmd);
-  install_element (VIEW_NODE, &ldp_show_mpls_ldp_discovery_cmd);
-  install_element (VIEW_NODE, &ldp_show_mpls_ldp_interface_cmd);
-  install_element (VIEW_NODE, &ldp_show_mpls_ldp_address_family_binding_cmd);
-  install_element (VIEW_NODE, &ldp_show_mpls_ldp_address_family_discovery_cmd);
-  install_element (VIEW_NODE, &ldp_show_mpls_ldp_address_family_interface_cmd);
-  install_element (VIEW_NODE, &ldp_show_l2vpn_atom_binding_cmd);
-  install_element (VIEW_NODE, &ldp_show_l2vpn_atom_vc_cmd);
-  install_element (VIEW_NODE, &ldp_show_debugging_mpls_ldp_cmd);
-  install_element (VIEW_NODE, &ldp_clear_mpls_ldp_neighbor_cmd);
-  install_element (VIEW_NODE, &ldp_clear_mpls_ldp_neighbor_addr_cmd);
-}
\ No newline at end of file
index 061bbeaa5e5af64a2692e3035551f7958ee1106c..afc709ff4943163bffa263db85dcae7cb5c36d03 100644 (file)
@@ -42,67 +42,75 @@ enum show_command {
        SHOW_L2VPN_BINDING
 };
 
-struct show_filter {
+struct show_params {
        int             family;
        union ldpd_addr addr;
        uint8_t         prefixlen;
+       int             json;
 };
 
 #define LDPBUFSIZ      65535
 
 static int              show_interface_msg(struct vty *, struct imsg *,
-                           struct show_filter *, json_object *);
+                           struct show_params *);
+static int              show_interface_msg_json(struct imsg *,
+                           struct show_params *, json_object *);
 static void             show_discovery_adj(struct vty *, char *,
-                           struct ctl_adj *, json_object *);
+                           struct ctl_adj *);
 static int              show_discovery_msg(struct vty *, struct imsg *,
-                           struct show_filter *, json_object *);
-static void             show_nbr_adj(struct vty *, char *, struct ctl_adj *,
-                                      json_object *);
+                           struct show_params *);
+static void             show_discovery_adj_json(json_object *,
+                           struct ctl_adj *);
+static int              show_discovery_msg_json(struct imsg *,
+                           struct show_params *, json_object *);
+static void             show_nbr_adj(struct vty *, char *, struct ctl_adj *);
 static int              show_nbr_msg(struct vty *, struct imsg *,
-                           struct show_filter *, json_object *, struct in_addr *);
+                           struct show_params *);
+static void             show_nbr_adj_json(struct ctl_adj *, json_object *);
+static int              show_nbr_msg_json(struct imsg *, struct show_params *,
+                           json_object *);
 static int              show_lib_msg(struct vty *, struct imsg *,
-                           struct show_filter *, json_object *);
-static int              show_l2vpn_binding_msg(struct vty *, struct imsg *);
-static int              show_l2vpn_pw_msg(struct vty *, struct imsg *);
+                           struct show_params *);
+static int              show_lib_msg_json(struct imsg *, struct show_params *,
+                           json_object *);
+static int              show_l2vpn_binding_msg(struct vty *, struct imsg *,
+                           struct show_params *);
+static int              show_l2vpn_binding_msg_json(struct imsg *,
+                           struct show_params *, json_object *);
+static int              show_l2vpn_pw_msg(struct vty *, struct imsg *,
+                           struct show_params *);
+static int              show_l2vpn_pw_msg_json(struct imsg *,
+                           struct show_params *, json_object *);
 static int              ldp_vty_connect(struct imsgbuf *);
+static int              ldp_vty_dispatch_msg(struct vty *, struct imsg *,
+                           enum show_command, struct show_params *,
+                           json_object *);
 static int              ldp_vty_dispatch(struct vty *, struct imsgbuf *,
-                           enum show_command, struct show_filter *, u_char);
+                           enum show_command, struct show_params *);
 static int              ldp_vty_get_af(const char *, int *);
 
 static int
 show_interface_msg(struct vty *vty, struct imsg *imsg,
-    struct show_filter *filter, json_object *json)
+    struct show_params *params)
 {
        struct ctl_iface        *iface;
        char                     timers[BUFSIZ];
-        json_object *json_iface = NULL;
 
        switch (imsg->hdr.type) {
        case IMSG_CTL_SHOW_INTERFACE:
                iface = imsg->data;
 
-               if (filter->family != AF_UNSPEC && filter->family != iface->af)
+               if (params->family != AF_UNSPEC && params->family != iface->af)
                        break;
 
-                if (json) {
-                        json_iface = json_object_new_object();
-                        json_object_string_add(json_iface, "addressFamily", af_name(iface->af));
-                        json_object_string_add(json_iface, "state", if_state_name(iface->state));
-                        json_object_string_add(json_iface, "uptime", log_time(iface->uptime));
-                        json_object_int_add(json_iface, "helloInterval", iface->hello_interval);
-                        json_object_int_add(json_iface, "holdtime", iface->hello_holdtime);
-                        json_object_int_add(json_iface, "adjacencyCount", iface->adj_cnt);
-                        json_object_object_add(json, iface->name, json_iface);
-                } else {
-                        snprintf(timers, sizeof(timers), "%u/%u",
-                                 iface->hello_interval, iface->hello_holdtime);
-
-                        vty_out(vty, "%-4s %-11s %-6s %-8s %-12s %3u%s",
-                                af_name(iface->af), iface->name,
-                                if_state_name(iface->state), iface->uptime == 0 ?
-                                "00:00:00" : log_time(iface->uptime), timers,
-                                iface->adj_cnt, VTY_NEWLINE);
-                }
+               snprintf(timers, sizeof(timers), "%u/%u",
+                   iface->hello_interval, iface->hello_holdtime);
+
+               vty_out(vty, "%-4s %-11s %-6s %-8s %-12s %3u%s",
+                   af_name(iface->af), iface->name,
+                   if_state_name(iface->state), iface->uptime == 0 ?
+                   "00:00:00" : log_time(iface->uptime), timers,
+                   iface->adj_cnt, VTY_NEWLINE);
                break;
        case IMSG_CTL_END:
                vty_out(vty, "%s", VTY_NEWLINE);
@@ -114,53 +122,65 @@ show_interface_msg(struct vty *vty, struct imsg *imsg,
        return (0);
 }
 
+static int
+show_interface_msg_json(struct imsg *imsg, struct show_params *params,
+    json_object *json)
+{
+       struct ctl_iface        *iface;
+       json_object             *json_iface;
+       char                     key_name[64];
+
+       switch (imsg->hdr.type) {
+       case IMSG_CTL_SHOW_INTERFACE:
+               iface = imsg->data;
+
+               if (params->family != AF_UNSPEC && params->family != iface->af)
+                       break;
+
+               json_iface = json_object_new_object();
+               json_object_string_add(json_iface, "name", iface->name);
+               json_object_string_add(json_iface, "addressFamily",
+                   af_name(iface->af));
+               json_object_string_add(json_iface, "state",
+                   if_state_name(iface->state));
+               json_object_string_add(json_iface, "upTime",
+                   log_time(iface->uptime));
+               json_object_int_add(json_iface, "helloInterval",
+                   iface->hello_interval);
+               json_object_int_add(json_iface, "helloHoldtime",
+                   iface->hello_holdtime);
+               json_object_int_add(json_iface, "adjacencyCount",
+                   iface->adj_cnt);
+
+               sprintf(key_name, "%s: %s", iface->name, af_name(iface->af));
+               json_object_object_add(json, key_name, json_iface);
+               break;
+       case IMSG_CTL_END:
+               return (1);
+       default:
+               break;
+       }
+
+       return (0);
+}
+
 static void
-show_discovery_adj(struct vty *vty, char *buffer, struct ctl_adj *adj, json_object *json)
+show_discovery_adj(struct vty *vty, char *buffer, struct ctl_adj *adj)
 {
        size_t   buflen = strlen(buffer);
-        json_object *json_adj = NULL;
-        json_object *json_array = NULL;
-
-        if (json) {
-                switch(adj->type) {
-                case HELLO_LINK:
-                        json_object_object_get_ex(json, "adjacencyLink", &json_array);
-
-                        if (!json_array) {
-                                json_array = json_object_new_array();
-                                json_object_object_add(json, "adjacencyLink", json_array);
-                        }
-                        break;
-                case HELLO_TARGETED:
-                        json_object_object_get_ex(json, "adjacencyTargeted", &json_array);
-
-                        if (!json_array) {
-                                json_array = json_object_new_array();
-                                json_object_object_add(json, "adjacencyTargeted", json_array);
-                        }
-                        break;
-                }
-
-                json_adj = json_object_new_object();
-                json_object_string_add(json_adj, "id", inet_ntoa(adj->id));
-                json_object_string_add(json_adj, "transportAddress", log_addr(adj->af, &adj->trans_addr));
-                json_object_int_add(json_adj, "holdtime", adj->holdtime);
-                json_object_array_add(json_array, json_adj);
-
-        } else {
-                snprintf(buffer + buflen, LDPBUFSIZ - buflen,
-                         "      LDP Id: %s:0, Transport address: %s%s",
-                         inet_ntoa(adj->id), log_addr(adj->af,
-                         &adj->trans_addr), VTY_NEWLINE);
-                buflen = strlen(buffer);
-                snprintf(buffer + buflen, LDPBUFSIZ - buflen,
-                         "          Hold time: %u sec%s", adj->holdtime, VTY_NEWLINE);
-        }
+
+       snprintf(buffer + buflen, LDPBUFSIZ - buflen,
+           "      LDP Id: %s:0, Transport address: %s%s",
+           inet_ntoa(adj->id), log_addr(adj->af,
+           &adj->trans_addr), VTY_NEWLINE);
+       buflen = strlen(buffer);
+       snprintf(buffer + buflen, LDPBUFSIZ - buflen,
+           "          Hold time: %u sec%s", adj->holdtime, VTY_NEWLINE);
 }
 
 static int
 show_discovery_msg(struct vty *vty, struct imsg *imsg,
-    struct show_filter *filter, json_object *json)
+    struct show_params *params)
 {
        struct ctl_adj          *adj;
        struct ctl_disc_if      *iface;
@@ -170,10 +190,6 @@ show_discovery_msg(struct vty *vty, struct imsg *imsg,
        size_t                   buflen;
        static char              ifaces_buffer[LDPBUFSIZ];
        static char              tnbrs_buffer[LDPBUFSIZ];
-        json_object *json_interface = NULL;
-        json_object *json_interfaces = NULL;
-        json_object *json_target = NULL;
-        json_object *json_targets = NULL;
 
        switch (imsg->hdr.type) {
        case IMSG_CTL_SHOW_DISCOVERY:
@@ -183,97 +199,161 @@ show_discovery_msg(struct vty *vty, struct imsg *imsg,
        case IMSG_CTL_SHOW_DISC_IFACE:
                iface = imsg->data;
 
-               if (filter->family != AF_UNSPEC &&
-                   ((filter->family == AF_INET && !iface->active_v4) ||
-                   (filter->family == AF_INET6 && !iface->active_v6)))
+               if (params->family != AF_UNSPEC &&
+                   ((params->family == AF_INET && !iface->active_v4) ||
+                   (params->family == AF_INET6 && !iface->active_v6)))
                        break;
 
-                if (json) {
-                        json_object_object_get_ex(json, "interfaces", &json_interfaces);
+               buflen = strlen(ifaces_buffer);
+               snprintf(ifaces_buffer + buflen, LDPBUFSIZ - buflen,
+                    "    %s: %s%s", iface->name, (iface->no_adj) ?
+                   "xmit" : "xmit/recv", VTY_NEWLINE);
+               break;
+       case IMSG_CTL_SHOW_DISC_TNBR:
+               tnbr = imsg->data;
 
-                        if (!json_interfaces) {
-                                json_interfaces = json_object_new_object();
-                                json_object_object_add(json, "interfaces", json_interfaces);
-                        }
+               if (params->family != AF_UNSPEC && params->family != tnbr->af)
+                       break;
 
-                        json_interface = json_object_new_object();
-                        json_object_boolean_true_add(json_interface, "transmit");
+               trans_addr = &(ldp_af_conf_get(ldpd_conf,
+                   tnbr->af))->trans_addr;
+               buflen = strlen(tnbrs_buffer);
+               snprintf(tnbrs_buffer + buflen, LDPBUFSIZ - buflen,
+                   "    %s -> %s: %s%s", log_addr(tnbr->af, trans_addr),
+                   log_addr(tnbr->af, &tnbr->addr), (tnbr->no_adj) ? "xmit" :
+                   "xmit/recv", VTY_NEWLINE);
+               break;
+       case IMSG_CTL_SHOW_DISC_ADJ:
+               adj = imsg->data;
 
-                        if (iface->no_adj)
-                                json_object_boolean_true_add(json_interface, "receive");
+               if (params->family != AF_UNSPEC && params->family != adj->af)
+                       break;
 
-                        json_object_object_add(json_interfaces, iface->name, json_interface);
+               switch(adj->type) {
+               case HELLO_LINK:
+                       show_discovery_adj(vty, ifaces_buffer, adj);
+                       break;
+               case HELLO_TARGETED:
+                       show_discovery_adj(vty, tnbrs_buffer, adj);
+                       break;
+               }
+               break;
+       case IMSG_CTL_END:
+               rtr_id.s_addr = ldp_rtr_id_get(ldpd_conf);
+               vty_out(vty, "Local LDP Identifier: %s:0%s", inet_ntoa(rtr_id),
+                   VTY_NEWLINE);
+               vty_out(vty, "Discovery Sources:%s", VTY_NEWLINE);
+               vty_out(vty, "  Interfaces:%s", VTY_NEWLINE);
+               vty_out(vty, "%s", ifaces_buffer);
+               vty_out(vty, "  Targeted Hellos:%s", VTY_NEWLINE);
+               vty_out(vty, "%s", tnbrs_buffer);
+               vty_out(vty, "%s", VTY_NEWLINE);
+               return (1);
+       default:
+               break;
+       }
 
-                } else {
-                        buflen = strlen(ifaces_buffer);
-                        snprintf(ifaces_buffer + buflen, LDPBUFSIZ - buflen,
-                                 "    %s: %s%s", iface->name, (iface->no_adj) ?
-                                 "xmit" : "xmit/recv", VTY_NEWLINE);
-                }
+       return (0);
+}
+
+static void
+show_discovery_adj_json(json_object *json, struct ctl_adj *adj)
+{
+       json_object *json_adj;
+       json_object *json_array;
+
+       json_object_object_get_ex(json, "adjacencies", &json_array);
+       if (!json_array) {
+               json_array = json_object_new_array();
+               json_object_object_add(json, "adjacencies", json_array);
+       }
+
+       json_adj = json_object_new_object();
+       json_object_string_add(json_adj, "id", inet_ntoa(adj->id));
+       json_object_string_add(json_adj, "transportAddress", log_addr(adj->af,
+           &adj->trans_addr));
+       json_object_int_add(json_adj, "holdtime", adj->holdtime);
+       json_object_array_add(json_array, json_adj);
+}
+
+static int
+show_discovery_msg_json(struct imsg *imsg, struct show_params *params,
+    json_object *json)
+{
+       struct ctl_adj          *adj;
+       struct ctl_disc_if      *iface;
+       struct ctl_disc_tnbr    *tnbr;
+       struct in_addr           rtr_id;
+       union ldpd_addr         *trans_addr;
+       json_object             *json_interface;
+       json_object             *json_target;
+       static json_object      *json_interfaces;
+       static json_object      *json_targets;
+       static json_object      *json_container;
+
+       switch (imsg->hdr.type) {
+       case IMSG_CTL_SHOW_DISCOVERY:
+               rtr_id.s_addr = ldp_rtr_id_get(ldpd_conf);
+               json_object_string_add(json, "id", inet_ntoa(rtr_id));
+               json_interfaces = json_object_new_object();
+               json_object_object_add(json, "interfaces", json_interfaces);
+               json_targets = json_object_new_object();
+               json_object_object_add(json, "targetedHellos", json_targets);
+               json_container = NULL;
                break;
-       case IMSG_CTL_SHOW_DISC_TNBR:
-               tnbr = imsg->data;
+       case IMSG_CTL_SHOW_DISC_IFACE:
+               iface = imsg->data;
 
-               if (filter->family != AF_UNSPEC && filter->family != tnbr->af)
+               if (params->family != AF_UNSPEC &&
+                   ((params->family == AF_INET && !iface->active_v4) ||
+                   (params->family == AF_INET6 && !iface->active_v6)))
                        break;
 
-               trans_addr = &(ldp_af_conf_get(ldpd_conf, tnbr->af))->trans_addr;
+               json_interface = json_object_new_object();
+               json_object_boolean_true_add(json_interface, "transmit");
+               if (!iface->no_adj)
+                       json_object_boolean_true_add(json_interface, "receive");
 
-                if (json) {
-                        json_object_object_get_ex(json, "targeted", &json_targets);
+               json_object_object_add(json_interfaces, iface->name,
+                   json_interface);
+               json_container = json_interface;
+               break;
+       case IMSG_CTL_SHOW_DISC_TNBR:
+               tnbr = imsg->data;
 
-                        if (!json_targets) {
-                                json_targets = json_object_new_array();
-                                json_object_object_add(json, "targeted", json_targets);
-                        }
+               if (params->family != AF_UNSPEC && params->family != tnbr->af)
+                       break;
 
-                        json_target = json_object_new_object();
-                        json_object_string_add(json_target, "sourceAddress", log_addr(tnbr->af, trans_addr));
-                        json_object_boolean_true_add(json_target, "transmit");
+               trans_addr = &(ldp_af_conf_get(ldpd_conf, tnbr->af))->trans_addr;
 
-                        if (tnbr->no_adj)
-                                json_object_boolean_true_add(json_target, "receive");
+               json_target = json_object_new_object();
+               json_object_string_add(json_target, "sourceAddress",
+                   log_addr(tnbr->af, trans_addr));
+               json_object_boolean_true_add(json_target, "transmit");
+               if (!tnbr->no_adj)
+                       json_object_boolean_true_add(json_target, "receive");
 
-                        json_object_object_add(json_targets, log_addr(tnbr->af, &tnbr->addr), json_interface);
-                } else {
-                        buflen = strlen(tnbrs_buffer);
-                        snprintf(tnbrs_buffer + buflen, LDPBUFSIZ - buflen,
-                                 "    %s -> %s: %s%s", log_addr(tnbr->af, trans_addr),
-                                 log_addr(tnbr->af, &tnbr->addr), (tnbr->no_adj) ? "xmit" :
-                                 "xmit/recv", VTY_NEWLINE);
-                }
+               json_object_object_add(json_targets, log_addr(tnbr->af,
+                   &tnbr->addr), json_target);
+               json_container = json_target;
                break;
        case IMSG_CTL_SHOW_DISC_ADJ:
                adj = imsg->data;
 
-               if (filter->family != AF_UNSPEC && filter->family != adj->af)
+               if (params->family != AF_UNSPEC && params->family != adj->af)
                        break;
 
                switch(adj->type) {
                case HELLO_LINK:
-                       show_discovery_adj(vty, ifaces_buffer, adj, json);
+                       show_discovery_adj_json(json_container, adj);
                        break;
                case HELLO_TARGETED:
-                       show_discovery_adj(vty, tnbrs_buffer, adj, json);
+                       show_discovery_adj_json(json_container, adj);
                        break;
                }
                break;
        case IMSG_CTL_END:
-               rtr_id.s_addr = ldp_rtr_id_get(ldpd_conf);
-
-                if (json) {
-                        json_object_string_add(json, "id", inet_ntoa(rtr_id));
-                } else {
-                        vty_out(vty, "Local LDP Identifier: %s:0%s", inet_ntoa(rtr_id),
-                                VTY_NEWLINE);
-                        vty_out(vty, "Discovery Sources:%s", VTY_NEWLINE);
-                        vty_out(vty, "  Interfaces:%s", VTY_NEWLINE);
-                        vty_out(vty, "%s", ifaces_buffer);
-                        vty_out(vty, "  Targeted Hellos:%s", VTY_NEWLINE);
-                        vty_out(vty, "%s", tnbrs_buffer);
-                        vty_out(vty, "%s", VTY_NEWLINE);
-                }
-                return (1);
+               return (1);
        default:
                break;
        }
@@ -282,131 +362,168 @@ show_discovery_msg(struct vty *vty, struct imsg *imsg,
 }
 
 static void
-show_nbr_adj(struct vty *vty, char *buffer, struct ctl_adj *adj, json_object *json_nbr)
+show_nbr_adj(struct vty *vty, char *buffer, struct ctl_adj *adj)
 {
        size_t   buflen = strlen(buffer);
-        json_object *json_adj_link = NULL;
-        json_object *json_adj_targeted = NULL;
 
        switch (adj->type) {
        case HELLO_LINK:
-                if (json_nbr) {
-                        json_object_object_get_ex(json_nbr, "adjacencyLink", &json_adj_link);
-
-                        if (!json_adj_link) {
-                                json_adj_link = json_object_new_array();
-                                json_object_object_add(json_nbr, "adjacencyLink", json_adj_link);
-                        }
-
-                        json_object_array_add(json_adj_link, json_object_new_string(adj->ifname));
-                } else {
-                        snprintf(buffer + buflen, LDPBUFSIZ - buflen,
-                                 "      Interface: %s%s", adj->ifname, VTY_NEWLINE);
-                }
+               snprintf(buffer + buflen, LDPBUFSIZ - buflen,
+                   "      Interface: %s%s", adj->ifname, VTY_NEWLINE);
                break;
        case HELLO_TARGETED:
-                if (json_nbr) {
-                        json_object_object_get_ex(json_nbr, "adjacencyTargeted", &json_adj_targeted);
-
-                        if (!json_adj_targeted) {
-                                json_adj_targeted = json_object_new_array();
-                                json_object_object_add(json_nbr, "adjacencyTargeted", json_adj_targeted);
-                        }
-
-                        json_object_array_add(json_adj_targeted,
-                                              json_object_new_string(log_addr(adj->af, &adj->src_addr)));
-                } else {
-                        snprintf(buffer + buflen, LDPBUFSIZ - buflen,
-                                 "      Targeted Hello: %s%s", log_addr(adj->af,
-                                 &adj->src_addr), VTY_NEWLINE);
-                }
+               snprintf(buffer + buflen, LDPBUFSIZ - buflen,
+                   "      Targeted Hello: %s%s", log_addr(adj->af,
+                   &adj->src_addr), VTY_NEWLINE);
                break;
        }
 }
 
 static int
-show_nbr_msg(struct vty *vty, struct imsg *imsg, struct show_filter *filter,
-             json_object *json, struct in_addr *nbr_id)
+show_nbr_msg(struct vty *vty, struct imsg *imsg, struct show_params *params)
 {
-       struct ctl_adj          *adj;
        struct ctl_nbr          *nbr;
+       struct ctl_adj          *adj;
        static char              v4adjs_buffer[LDPBUFSIZ];
        static char              v6adjs_buffer[LDPBUFSIZ];
-        json_object             *json_nbr = NULL;
 
        switch (imsg->hdr.type) {
        case IMSG_CTL_SHOW_NBR:
                nbr = imsg->data;
 
-                if (json) {
-                        /* Remember the nbr->id so when we are in the other
-                         * case statements below we know what nbr we are
-                         * dealing with
-                         */
-                        *nbr_id = nbr->id;
-                        json_nbr = json_object_new_object();
-                        json_object_string_add(json_nbr, "peerId", inet_ntoa(nbr->id));
-                        json_object_string_add(json_nbr, "tcpLocalAddress", log_addr(nbr->af, &nbr->laddr));
-                        json_object_int_add(json_nbr, "tcpLocalPort", ntohs(nbr->lport));
-                        json_object_string_add(json_nbr, "tcpRemoteAddress", log_addr(nbr->af, &nbr->raddr));
-                        json_object_int_add(json_nbr, "tcpRemotePort", ntohs(nbr->rport));
-                        json_object_int_add(json_nbr, "holdtime", nbr->holdtime);
-                        json_object_string_add(json_nbr, "state", nbr_state_name(nbr->nbr_state));
-                        json_object_boolean_true_add(json_nbr, "downstreamUnsolicited");
-                        json_object_string_add(json_nbr, "upTime", log_time(nbr->uptime));
-                        json_object_object_add(json, inet_ntoa(nbr->id), json_nbr);
-
-                } else {
-                        v4adjs_buffer[0] = '\0';
-                        v6adjs_buffer[0] = '\0';
-                        vty_out(vty, "Peer LDP Identifier: %s:0%s", inet_ntoa(nbr->id),
-                            VTY_NEWLINE);
-                        vty_out(vty, "  TCP connection: %s:%u - %s:%u%s",
-                            log_addr(nbr->af, &nbr->laddr), ntohs(nbr->lport),
-                            log_addr(nbr->af, &nbr->raddr), ntohs(nbr->rport),
-                            VTY_NEWLINE);
-                        vty_out(vty, "  Session Holdtime: %u sec%s", nbr->holdtime,
-                            VTY_NEWLINE);
-                        vty_out(vty, "  State: %s; Downstream-Unsolicited%s",
-                            nbr_state_name(nbr->nbr_state), VTY_NEWLINE);
-                        vty_out(vty, "  Up time: %s%s", log_time(nbr->uptime),
-                            VTY_NEWLINE);
-                }
+               v4adjs_buffer[0] = '\0';
+               v6adjs_buffer[0] = '\0';
+               vty_out(vty, "Peer LDP Identifier: %s:0%s", inet_ntoa(nbr->id),
+                   VTY_NEWLINE);
+               vty_out(vty, "  TCP connection: %s:%u - %s:%u%s",
+                   log_addr(nbr->af, &nbr->laddr), ntohs(nbr->lport),
+                   log_addr(nbr->af, &nbr->raddr), ntohs(nbr->rport),
+                   VTY_NEWLINE);
+               vty_out(vty, "  Session Holdtime: %u sec%s", nbr->holdtime,
+                   VTY_NEWLINE);
+               vty_out(vty, "  State: %s; Downstream-Unsolicited%s",
+                   nbr_state_name(nbr->nbr_state), VTY_NEWLINE);
+               vty_out(vty, "  Up time: %s%s", log_time(nbr->uptime),
+                   VTY_NEWLINE);
                break;
        case IMSG_CTL_SHOW_NBR_DISC:
                adj = imsg->data;
 
-                /* get the json_nbr by looking for the nbr_id key */
-                if (json)
-                        json_object_object_get_ex(json, inet_ntoa(*nbr_id), &json_nbr);
-
                switch (adj->af) {
                case AF_INET:
-                       show_nbr_adj(vty, v4adjs_buffer, adj, json_nbr);
+                       show_nbr_adj(vty, v4adjs_buffer, adj);
                        break;
                case AF_INET6:
-                       show_nbr_adj(vty, v6adjs_buffer, adj, json_nbr);
+                       show_nbr_adj(vty, v6adjs_buffer, adj);
                        break;
                default:
                        fatalx("show_nbr_msg: unknown af");
-                }
+               }
+               break;
+       case IMSG_CTL_SHOW_NBR_END:
+               vty_out(vty, "  LDP Discovery Sources:%s", VTY_NEWLINE);
+               if (v4adjs_buffer[0] != '\0') {
+                       vty_out(vty, "    IPv4:%s", VTY_NEWLINE);
+                       vty_out(vty, "%s", v4adjs_buffer);
+               }
+               if (v6adjs_buffer[0] != '\0') {
+                       vty_out(vty, "    IPv6:%s", VTY_NEWLINE);
+                       vty_out(vty, "%s", v6adjs_buffer);
+               }
+               vty_out(vty, "%s", VTY_NEWLINE);
+               break;
+       case IMSG_CTL_END:
+               return (1);
+       default:
+               break;
+       }
+
+       return (0);
+}
+
+static void
+show_nbr_adj_json(struct ctl_adj *adj, json_object *adj_list)
+{
+       char adj_string[128];
+
+       switch (adj->type) {
+       case HELLO_LINK:
+               strlcpy(adj_string, "interface: ", sizeof(adj_string));
+               strlcat(adj_string, adj->ifname, sizeof(adj_string));
+               break;
+       case HELLO_TARGETED:
+               strlcpy(adj_string, "targetedHello: ", sizeof(adj_string));
+               strlcat(adj_string, log_addr(adj->af, &adj->src_addr),
+                   sizeof(adj_string));
+               break;
+       }
+
+       json_object_array_add(adj_list, json_object_new_string(adj_string));
+}
+
+static int
+show_nbr_msg_json(struct imsg *imsg, struct show_params *params,
+    json_object *json)
+{
+       struct ctl_nbr          *nbr;
+       struct ctl_adj          *adj;
+       json_object             *json_nbr;
+       static json_object      *json_nbr_sources;
+       static json_object      *json_v4adjs;
+       static json_object      *json_v6adjs;
+
+       switch (imsg->hdr.type) {
+       case IMSG_CTL_SHOW_NBR:
+               nbr = imsg->data;
+
+               json_nbr = json_object_new_object();
+               json_object_string_add(json_nbr, "peerId", inet_ntoa(nbr->id));
+               json_object_string_add(json_nbr, "tcpLocalAddress",
+                   log_addr(nbr->af, &nbr->laddr));
+               json_object_int_add(json_nbr, "tcpLocalPort",
+                   ntohs(nbr->lport));
+               json_object_string_add(json_nbr, "tcpRemoteAddress",
+                   log_addr(nbr->af, &nbr->raddr));
+               json_object_int_add(json_nbr, "tcpRemotePort",
+                   ntohs(nbr->rport));
+               json_object_int_add(json_nbr, "holdtime", nbr->holdtime);
+               json_object_string_add(json_nbr, "state",
+                   nbr_state_name(nbr->nbr_state));
+               json_object_string_add(json_nbr, "upTime",
+                   log_time(nbr->uptime));
+               json_object_object_add(json, inet_ntoa(nbr->id), json_nbr);
+
+               json_nbr_sources = json_object_new_object();
+               json_object_object_add(json_nbr, "discoverySources",
+                   json_nbr_sources);
+               json_v4adjs = NULL;
+               json_v6adjs = NULL;
+               break;
+       case IMSG_CTL_SHOW_NBR_DISC:
+               adj = imsg->data;
+
+               switch (adj->af) {
+               case AF_INET:
+                       if (!json_v4adjs) {
+                               json_v4adjs = json_object_new_array();
+                               json_object_object_add(json_nbr_sources, "ipv4",
+                                   json_v4adjs);
+                       }
+                       show_nbr_adj_json(adj, json_v4adjs);
+                       break;
+               case AF_INET6:
+                       if (!json_v6adjs) {
+                               json_v6adjs = json_object_new_array();
+                               json_object_object_add(json_nbr_sources, "ipv6",
+                                   json_v6adjs);
+                       }
+                       show_nbr_adj_json(adj, json_v6adjs);
+                       break;
+               default:
+                       fatalx("show_nbr_msg_json: unknown af");
+               }
                break;
        case IMSG_CTL_SHOW_NBR_END:
-                /* For the json scenario the adjacencies were already added
-                 * in show_nbr_adj
-                 */
-                if (!json) {
-                        vty_out(vty, "  LDP Discovery Sources:%s", VTY_NEWLINE);
-                        if (v4adjs_buffer[0] != '\0') {
-                                vty_out(vty, "    IPv4:%s", VTY_NEWLINE);
-                                vty_out(vty, "%s", v4adjs_buffer);
-                        }
-                        if (v6adjs_buffer[0] != '\0') {
-                                vty_out(vty, "    IPv6:%s", VTY_NEWLINE);
-                                vty_out(vty, "%s", v6adjs_buffer);
-                        }
-                        vty_out(vty, "%s", VTY_NEWLINE);
-                }
                break;
        case IMSG_CTL_END:
                return (1);
@@ -418,66 +535,40 @@ show_nbr_msg(struct vty *vty, struct imsg *imsg, struct show_filter *filter,
 }
 
 static int
-show_lib_msg(struct vty *vty, struct imsg *imsg, struct show_filter *filter, json_object *json)
+show_lib_msg(struct vty *vty, struct imsg *imsg, struct show_params *params)
 {
        struct ctl_rt   *rt;
        char             dstnet[BUFSIZ];
-        json_object *json_binding = NULL;
-        json_object *json_remote_label = NULL;
-        json_object *json_remote_labels = NULL;
 
        switch (imsg->hdr.type) {
        case IMSG_CTL_SHOW_LIB:
                rt = imsg->data;
 
-               if (filter->family != AF_UNSPEC && filter->family != rt->af)
+               if (params->family != AF_UNSPEC && params->family != rt->af)
                        break;
 
                snprintf(dstnet, sizeof(dstnet), "%s/%d",
-                        log_addr(rt->af, &rt->prefix), rt->prefixlen);
-
-                if (json) {
-                        if (rt->first) {
-                                json_binding = json_object_new_object();
-                                json_object_string_add(json_binding, "localLabel", log_label(rt->local_label));
-
-                                json_remote_labels = json_object_new_array();
-                                json_object_object_add(json_binding, "remoteLabel", json_remote_labels);
-
-                                json_object_object_add(json, dstnet, json_binding);
-                        } else {
-                                json_object_object_get_ex(json, dstnet, &json_binding);
-                        }
-
-                        if (rt->remote_label != NO_LABEL) {
-                                json_object_object_get_ex(json_binding, "remoteLabel", &json_remote_labels);
-                                json_remote_label = json_object_new_object();
-                                json_object_string_add(json_remote_label, "nexthop", inet_ntoa(rt->nexthop));
-                                json_object_string_add(json_remote_label, "label", log_label(rt->remote_label));
-                                json_object_array_add(json_remote_labels, json_remote_label);
-                        }
-
-                } else {
-                        if (rt->first) {
-                                vty_out(vty, "%s%s", dstnet, VTY_NEWLINE);
-                                vty_out(vty, "%-8sLocal binding: label: %s%s", "",
-                                        log_label(rt->local_label), VTY_NEWLINE);
-
-                                if (rt->remote_label != NO_LABEL) {
-                                        vty_out(vty, "%-8sRemote bindings:%s", "",
-                                                VTY_NEWLINE);
-                                        vty_out(vty, "%-12sPeer                Label%s",
-                                                "", VTY_NEWLINE);
-                                        vty_out(vty, "%-12s-----------------   "
-                                                "---------%s", "", VTY_NEWLINE);
-                                } else
-                                        vty_out(vty, "%-8sNo remote bindings%s", "",
-                                                VTY_NEWLINE);
-                        }
-                        if (rt->remote_label != NO_LABEL)
-                                vty_out(vty, "%12s%-20s%s%s", "", inet_ntoa(rt->nexthop),
-                                        log_label(rt->remote_label), VTY_NEWLINE);
-                }
+                   log_addr(rt->af, &rt->prefix), rt->prefixlen);
+
+               if (rt->first) {
+                       vty_out(vty, "%s%s", dstnet, VTY_NEWLINE);
+                       vty_out(vty, "%-8sLocal binding: label: %s%s", "",
+                           log_label(rt->local_label), VTY_NEWLINE);
+
+                       if (rt->remote_label != NO_LABEL) {
+                               vty_out(vty, "%-8sRemote bindings:%s", "",
+                                   VTY_NEWLINE);
+                               vty_out(vty, "%-12sPeer                Label%s",
+                                   "", VTY_NEWLINE);
+                               vty_out(vty, "%-12s-----------------   "
+                                   "---------%s", "", VTY_NEWLINE);
+                       } else
+                               vty_out(vty, "%-8sNo remote bindings%s", "",
+                                   VTY_NEWLINE);
+               }
+               if (rt->remote_label != NO_LABEL)
+                       vty_out(vty, "%12s%-20s%s%s", "", inet_ntoa(rt->nexthop),
+                           log_label(rt->remote_label), VTY_NEWLINE);
                break;
        case IMSG_CTL_END:
                vty_out(vty, "%s", VTY_NEWLINE);
@@ -490,7 +581,58 @@ show_lib_msg(struct vty *vty, struct imsg *imsg, struct show_filter *filter, jso
 }
 
 static int
-show_l2vpn_binding_msg(struct vty *vty, struct imsg *imsg)
+show_lib_msg_json(struct imsg *imsg, struct show_params *params,
+    json_object *json)
+{
+       struct ctl_rt           *rt;
+       char                     dstnet[BUFSIZ];
+       static json_object      *json_binding;
+       static json_object      *json_remote_labels;
+       json_object             *json_remote_label;
+
+       switch (imsg->hdr.type) {
+       case IMSG_CTL_SHOW_LIB:
+               rt = imsg->data;
+
+               if (params->family != AF_UNSPEC && params->family != rt->af)
+                       break;
+
+               snprintf(dstnet, sizeof(dstnet), "%s/%d",
+                   log_addr(rt->af, &rt->prefix), rt->prefixlen);
+
+               if (rt->first) {
+                       json_binding = json_object_new_object();
+                       json_object_string_add(json_binding, "localLabel",
+                           log_label(rt->local_label));
+
+                       json_remote_labels = json_object_new_array();
+                       json_object_object_add(json_binding, "remoteLabels",
+                           json_remote_labels);
+                       json_object_object_add(json, dstnet, json_binding);
+               }
+
+               if (rt->remote_label != NO_LABEL) {
+                       json_remote_label = json_object_new_object();
+                       json_object_string_add(json_remote_label, "nexthop",
+                           inet_ntoa(rt->nexthop));
+                       json_object_string_add(json_remote_label, "label",
+                           log_label(rt->remote_label));
+                       json_object_array_add(json_remote_labels,
+                           json_remote_label);
+               }
+               break;
+       case IMSG_CTL_END:
+               return (1);
+       default:
+               break;
+       }
+
+       return (0);
+}
+
+static int
+show_l2vpn_binding_msg(struct vty *vty, struct imsg *imsg,
+    struct show_params *params)
 {
        struct ctl_pw   *pw;
 
@@ -540,7 +682,68 @@ show_l2vpn_binding_msg(struct vty *vty, struct imsg *imsg)
 }
 
 static int
-show_l2vpn_pw_msg(struct vty *vty, struct imsg *imsg)
+show_l2vpn_binding_msg_json(struct imsg *imsg, struct show_params *params,
+    json_object *json)
+{
+       struct ctl_pw   *pw;
+       json_object     *json_pw;
+       char             key_name[64];
+
+       switch (imsg->hdr.type) {
+       case IMSG_CTL_SHOW_L2VPN_BINDING:
+               pw = imsg->data;
+
+               json_pw = json_object_new_object();
+               json_object_string_add(json_pw, "destination",
+                   inet_ntoa(pw->lsr_id));
+               json_object_int_add(json_pw, "vcId", pw->pwid);
+
+               /* local binding */
+               if (pw->local_label != NO_LABEL) {
+                       json_object_int_add(json_pw, "localLabel",
+                           pw->local_label);
+                       json_object_int_add(json_pw, "localControlWord",
+                           pw->local_cword);
+                       json_object_string_add(json_pw, "localVcType",
+                           pw_type_name(pw->type));
+                       json_object_int_add(json_pw, "localGroupID",
+                           pw->local_gid);
+                       json_object_int_add(json_pw, "localIfMtu",
+                           pw->local_ifmtu);
+               } else
+                       json_object_string_add(json_pw, "localLabel",
+                           "unassigned");
+
+               /* remote binding */
+               if (pw->remote_label != NO_LABEL) {
+                       json_object_int_add(json_pw, "remoteLabel",
+                           pw->remote_label);
+                       json_object_int_add(json_pw, "remoteControlWord",
+                           pw->remote_cword);
+                       json_object_string_add(json_pw, "remoteVcType",
+                           pw_type_name(pw->type));
+                       json_object_int_add(json_pw, "remoteGroupID",
+                           pw->remote_gid);
+                       json_object_int_add(json_pw, "remoteIfMtu",
+                           pw->remote_ifmtu);
+               } else
+                       json_object_string_add(json_pw, "remoteLabel",
+                           "unassigned");
+
+               sprintf(key_name, "%s: %u", inet_ntoa(pw->lsr_id), pw->pwid);
+               json_object_object_add(json, key_name, json_pw);
+               break;
+       case IMSG_CTL_END:
+               return (1);
+       default:
+               break;
+       }
+
+       return (0);
+}
+
+static int
+show_l2vpn_pw_msg(struct vty *vty, struct imsg *imsg, struct show_params *params)
 {
        struct ctl_pw   *pw;
 
@@ -562,6 +765,36 @@ show_l2vpn_pw_msg(struct vty *vty, struct imsg *imsg)
        return (0);
 }
 
+static int
+show_l2vpn_pw_msg_json(struct imsg *imsg, struct show_params *params,
+    json_object *json)
+{
+       struct ctl_pw   *pw;
+       json_object     *json_pw;
+
+       switch (imsg->hdr.type) {
+       case IMSG_CTL_SHOW_L2VPN_PW:
+               pw = imsg->data;
+
+               json_pw = json_object_new_object();
+               json_object_string_add(json_pw, "peerId", inet_ntoa(pw->lsr_id));
+               json_object_int_add(json_pw, "vcId", pw->pwid);
+               json_object_string_add(json_pw, "VpnName", pw->l2vpn_name);
+               if (pw->status)
+                       json_object_string_add(json_pw, "status", "up");
+               else
+                       json_object_string_add(json_pw, "status", "down");
+               json_object_object_add(json, pw->ifname, json_pw);
+               break;
+       case IMSG_CTL_END:
+               return (1);
+       default:
+               break;
+       }
+
+       return (0);
+}
+
 static int
 ldp_vty_connect(struct imsgbuf *ibuf)
 {
@@ -588,14 +821,47 @@ ldp_vty_connect(struct imsgbuf *ibuf)
        return (0);
 }
 
+static int
+ldp_vty_dispatch_msg(struct vty *vty, struct imsg *imsg, enum show_command cmd,
+    struct show_params *params, json_object *json)
+{
+       switch (cmd) {
+       case SHOW_IFACE:
+               if (json)
+                       return (show_interface_msg_json(imsg, params, json));
+               return (show_interface_msg(vty, imsg, params));
+       case SHOW_DISC:
+               if (json)
+                       return (show_discovery_msg_json(imsg, params, json));
+               return (show_discovery_msg(vty, imsg, params));
+       case SHOW_NBR:
+               if (json)
+                       return (show_nbr_msg_json(imsg, params, json));
+               return (show_nbr_msg(vty, imsg, params));
+       case SHOW_LIB:
+               if (json)
+                       return (show_lib_msg_json(imsg, params, json));
+               return (show_lib_msg(vty, imsg, params));
+       case SHOW_L2VPN_PW:
+               if (json)
+                       return (show_l2vpn_pw_msg_json(imsg, params, json));
+               return (show_l2vpn_pw_msg(vty, imsg, params));
+       case SHOW_L2VPN_BINDING:
+               if (json)
+                       return (show_l2vpn_binding_msg_json(imsg, params, json));
+               return (show_l2vpn_binding_msg(vty, imsg, params));
+       default:
+               return (0);
+       }
+}
+
 static int
 ldp_vty_dispatch(struct vty *vty, struct imsgbuf *ibuf, enum show_command cmd,
-    struct show_filter *filter, u_char uj)
+    struct show_params *params)
 {
        struct imsg              imsg;
-       int                      n, done = 0;
-        struct in_addr           nbr_id;
-        json_object              *json = NULL;
+       int                      n, done = 0, ret = CMD_SUCCESS;
+       json_object             *json = NULL;
 
        while (ibuf->w.queued)
                if (msgbuf_write(&ibuf->w) <= 0 && errno != EAGAIN) {
@@ -604,83 +870,44 @@ ldp_vty_dispatch(struct vty *vty, struct imsgbuf *ibuf, enum show_command cmd,
                        return (CMD_WARNING);
                }
 
-        if (uj)
-                json = json_object_new_object();
+       if (params->json)
+               json = json_object_new_object();
 
        while (!done) {
                if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN) {
                        log_warnx("imsg_read error");
-                       close(ibuf->fd);
-                        if (json) {
-                                vty_out (vty, "%s%s",
-                                         json_object_to_json_string_ext(json, JSON_C_TO_STRING_PRETTY),
-                                         VTY_NEWLINE);
-                                json_object_free(json);
-                        }
-                       return (CMD_WARNING);
+                       ret = CMD_WARNING;
+                       goto done;
                }
                if (n == 0) {
                        log_warnx("pipe closed");
-                       close(ibuf->fd);
-                        if (json) {
-                                vty_out (vty, "%s%s",
-                                         json_object_to_json_string_ext(json, JSON_C_TO_STRING_PRETTY),
-                                         VTY_NEWLINE);
-                                json_object_free(json);
-                        }
-                       return (CMD_WARNING);
+                       ret = CMD_WARNING;
+                       goto done;
                }
 
                while (!done) {
                        if ((n = imsg_get(ibuf, &imsg)) == -1) {
                                log_warnx("imsg_get error");
-                               close(ibuf->fd);
-                                if (json) {
-                                        vty_out (vty, "%s%s",
-                                                 json_object_to_json_string_ext(json, JSON_C_TO_STRING_PRETTY),
-                                                 VTY_NEWLINE);
-                                        json_object_free(json);
-                                }
-                               return (CMD_WARNING);
+                               ret = CMD_WARNING;
+                               goto done;
                        }
                        if (n == 0)
                                break;
-                       switch (cmd) {
-                       case SHOW_IFACE:
-                               done = show_interface_msg(vty, &imsg, filter, json);
-                               break;
-                       case SHOW_DISC:
-                               done = show_discovery_msg(vty, &imsg, filter, json);
-                               break;
-                       case SHOW_NBR:
-                               done = show_nbr_msg(vty, &imsg, filter, json, &nbr_id);
-                               break;
-                       case SHOW_LIB:
-                               done = show_lib_msg(vty, &imsg, filter, json);
-                               break;
-                       case SHOW_L2VPN_PW:
-                               done = show_l2vpn_pw_msg(vty, &imsg);
-                               break;
-                       case SHOW_L2VPN_BINDING:
-                               done = show_l2vpn_binding_msg(vty, &imsg);
-                               break;
-                       default:
-                               break;
-                       }
+                       done = ldp_vty_dispatch_msg(vty, &imsg, cmd, params,
+                           json);
                        imsg_free(&imsg);
                }
        }
 
+ done:
        close(ibuf->fd);
+       if (json) {
+               vty_out(vty, "%s%s", json_object_to_json_string_ext(json,
+                   JSON_C_TO_STRING_PRETTY), VTY_NEWLINE);
+               json_object_free(json);
+       }
 
-        if (json) {
-                vty_out (vty, "%s%s",
-                         json_object_to_json_string_ext(json, JSON_C_TO_STRING_PRETTY),
-                         VTY_NEWLINE);
-                json_object_free(json);
-        }
-
-       return (CMD_SUCCESS);
+       return (ret);
 }
 
 static int
@@ -701,56 +928,56 @@ ldp_vty_get_af(const char *str, int *af)
 }
 
 int
-ldp_vty_show_binding(struct vty *vty, struct vty_arg *args[], u_char uj)
+ldp_vty_show_binding(struct vty *vty, struct vty_arg *args[])
 {
        struct imsgbuf           ibuf;
-       struct show_filter       filter;
+       struct show_params       params;
        const char              *af_str;
        int                      af;
 
        if (ldp_vty_connect(&ibuf) < 0)
                return (CMD_WARNING);
 
-       imsg_compose(&ibuf, IMSG_CTL_SHOW_LIB, 0, 0, -1, NULL, 0);
-
        af_str = vty_get_arg_value(args, "address-family");
        if (ldp_vty_get_af(af_str, &af) < 0)
                return (CMD_ERR_NO_MATCH);
 
-       memset(&filter, 0, sizeof(filter));
-       filter.family = af;
+       memset(&params, 0, sizeof(params));
+       params.family = af;
+       params.json = vty_get_arg_value(args, "json") ? 1 : 0;
 
-       return (ldp_vty_dispatch(vty, &ibuf, SHOW_LIB, &filter, uj));
+       imsg_compose(&ibuf, IMSG_CTL_SHOW_LIB, 0, 0, -1, NULL, 0);
+       return (ldp_vty_dispatch(vty, &ibuf, SHOW_LIB, &params));
 }
 
 int
-ldp_vty_show_discovery(struct vty *vty, struct vty_arg *args[], u_char uj)
+ldp_vty_show_discovery(struct vty *vty, struct vty_arg *args[])
 {
        struct imsgbuf           ibuf;
-       struct show_filter       filter;
+       struct show_params       params;
        const char              *af_str;
        int                      af;
 
        if (ldp_vty_connect(&ibuf) < 0)
                return (CMD_WARNING);
 
-       imsg_compose(&ibuf, IMSG_CTL_SHOW_DISCOVERY, 0, 0, -1, NULL, 0);
-
        af_str = vty_get_arg_value(args, "address-family");
        if (ldp_vty_get_af(af_str, &af) < 0)
                return (CMD_ERR_NO_MATCH);
 
-       memset(&filter, 0, sizeof(filter));
-       filter.family = af;
+       memset(&params, 0, sizeof(params));
+       params.family = af;
+       params.json = vty_get_arg_value(args, "json") ? 1 : 0;
 
-       return (ldp_vty_dispatch(vty, &ibuf, SHOW_DISC, &filter, uj));
+       imsg_compose(&ibuf, IMSG_CTL_SHOW_DISCOVERY, 0, 0, -1, NULL, 0);
+       return (ldp_vty_dispatch(vty, &ibuf, SHOW_DISC, &params));
 }
 
 int
-ldp_vty_show_interface(struct vty *vty, struct vty_arg *args[], u_char uj)
+ldp_vty_show_interface(struct vty *vty, struct vty_arg *args[])
 {
        struct imsgbuf           ibuf;
-       struct show_filter       filter;
+       struct show_params       params;
        unsigned int             ifidx = 0;
        const char              *af_str;
        int                      af;
@@ -758,81 +985,82 @@ ldp_vty_show_interface(struct vty *vty, struct vty_arg *args[], u_char uj)
        if (ldp_vty_connect(&ibuf) < 0)
                return (CMD_WARNING);
 
-       imsg_compose(&ibuf, IMSG_CTL_SHOW_INTERFACE, 0, 0, -1, &ifidx,
-           sizeof(ifidx));
-
        af_str = vty_get_arg_value(args, "address-family");
        if (ldp_vty_get_af(af_str, &af) < 0)
                return (CMD_ERR_NO_MATCH);
 
-       memset(&filter, 0, sizeof(filter));
-       filter.family = af;
+       memset(&params, 0, sizeof(params));
+       params.family = af;
+       params.json = vty_get_arg_value(args, "json") ? 1 : 0;
 
        /* header */
-        if (!uj) {
-               vty_out(vty, "%-4s %-11s %-6s %-8s %-12s %3s%s", "AF",
-                       "Interface", "State", "Uptime", "Hello Timers", "ac", VTY_NEWLINE);
-        }
+       if (!params.json) {
+               vty_out(vty, "%-4s %-11s %-6s %-8s %-12s %3s%s", "AF",
+                   "Interface", "State", "Uptime", "Hello Timers", "ac",
+                   VTY_NEWLINE);
+       }
 
-       return (ldp_vty_dispatch(vty, &ibuf, SHOW_IFACE, &filter, uj));
+       imsg_compose(&ibuf, IMSG_CTL_SHOW_INTERFACE, 0, 0, -1, &ifidx,
+           sizeof(ifidx));
+       return (ldp_vty_dispatch(vty, &ibuf, SHOW_IFACE, &params));
 }
 
 int
-ldp_vty_show_neighbor(struct vty *vty, struct vty_arg *args[], u_char uj)
+ldp_vty_show_neighbor(struct vty *vty, struct vty_arg *args[])
 {
        struct imsgbuf           ibuf;
-       struct show_filter       filter;
+       struct show_params       params;
 
        if (ldp_vty_connect(&ibuf) < 0)
                return (CMD_WARNING);
 
-       imsg_compose(&ibuf, IMSG_CTL_SHOW_NBR, 0, 0, -1, NULL, 0);
-
-       /* not used */
-       memset(&filter, 0, sizeof(filter));
+       memset(&params, 0, sizeof(params));
+       params.json = vty_get_arg_value(args, "json") ? 1 : 0;
 
-       return (ldp_vty_dispatch(vty, &ibuf, SHOW_NBR, &filter, uj));
+       imsg_compose(&ibuf, IMSG_CTL_SHOW_NBR, 0, 0, -1, NULL, 0);
+       return (ldp_vty_dispatch(vty, &ibuf, SHOW_NBR, &params));
 }
 
 int
 ldp_vty_show_atom_binding(struct vty *vty, struct vty_arg *args[])
 {
        struct imsgbuf           ibuf;
-       struct show_filter       filter;
+       struct show_params       params;
 
        if (ldp_vty_connect(&ibuf) < 0)
                return (CMD_WARNING);
 
-       imsg_compose(&ibuf, IMSG_CTL_SHOW_L2VPN_BINDING, 0, 0, -1, NULL, 0);
-
-       /* not used */
-       memset(&filter, 0, sizeof(filter));
+       memset(&params, 0, sizeof(params));
+       params.json = vty_get_arg_value(args, "json") ? 1 : 0;
 
-       return (ldp_vty_dispatch(vty, &ibuf, SHOW_L2VPN_BINDING, &filter, 0));
+       imsg_compose(&ibuf, IMSG_CTL_SHOW_L2VPN_BINDING, 0, 0, -1, NULL, 0);
+       return (ldp_vty_dispatch(vty, &ibuf, SHOW_L2VPN_BINDING, &params));
 }
 
 int
 ldp_vty_show_atom_vc(struct vty *vty, struct vty_arg *args[])
 {
        struct imsgbuf           ibuf;
-       struct show_filter       filter;
+       struct show_params       params;
 
        if (ldp_vty_connect(&ibuf) < 0)
                return (CMD_WARNING);
 
-       imsg_compose(&ibuf, IMSG_CTL_SHOW_L2VPN_PW, 0, 0, -1, NULL, 0);
-
-       /* not used */
-       memset(&filter, 0, sizeof(filter));
-
-       /* header */
-       vty_out(vty, "%-9s %-15s %-10s %-16s %-10s%s",
-           "Interface", "Peer ID", "VC ID", "Name", "Status", VTY_NEWLINE);
-       vty_out(vty, "%-9s %-15s %-10s %-16s %-10s%s",
-           "---------", "---------------", "----------",
-           "----------------", "----------", VTY_NEWLINE);
+       memset(&params, 0, sizeof(params));
+       params.json = vty_get_arg_value(args, "json") ? 1 : 0;
+
+       if (!params.json) {
+               /* header */
+               vty_out(vty, "%-9s %-15s %-10s %-16s %-10s%s",
+                   "Interface", "Peer ID", "VC ID", "Name", "Status",
+                   VTY_NEWLINE);
+               vty_out(vty, "%-9s %-15s %-10s %-16s %-10s%s",
+                   "---------", "---------------", "----------",
+                   "----------------", "----------", VTY_NEWLINE);
+       }
 
-       return (ldp_vty_dispatch(vty, &ibuf, SHOW_L2VPN_PW, &filter, 0));
+       imsg_compose(&ibuf, IMSG_CTL_SHOW_L2VPN_PW, 0, 0, -1, NULL, 0);
+       return (ldp_vty_dispatch(vty, &ibuf, SHOW_L2VPN_PW, &params));
 }
 
 int