From e8dbef04205345773a3d7c9be7de0fda26061db0 Mon Sep 17 00:00:00 2001 From: Daniel Walton Date: Sat, 17 Dec 2016 20:55:05 +0000 Subject: [PATCH] ldpd: json support for show commands Signed-off-by: Daniel Walton --- ldpd/ldp_vty.h | 8 +- ldpd/ldp_vty_cmds.c | 1726 +++++++++++++++++++++++++++++++++++++++++++ ldpd/ldp_vty_exec.c | 445 ++++++++--- 3 files changed, 2054 insertions(+), 125 deletions(-) create mode 100644 ldpd/ldp_vty_cmds.c diff --git a/ldpd/ldp_vty.h b/ldpd/ldp_vty.h index 735554badf..78b83dc5a9 100644 --- a/ldpd/ldp_vty.h +++ b/ldpd/ldp_vty.h @@ -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 *[]); -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_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_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 *[]); diff --git a/ldpd/ldp_vty_cmds.c b/ldpd/ldp_vty_cmds.c new file mode 100644 index 0000000000..8aa593cf2c --- /dev/null +++ b/ldpd/ldp_vty_cmds.c @@ -0,0 +1,1726 @@ +/* Auto-generated from ldp_vty.xml. */ +/* Do not edit! */ + +#include + +#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 ", + "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 ", + "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 ", + "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 ", + "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 ", + "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 ", + "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 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 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 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 ", + "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 ", + "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 ", + "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 diff --git a/ldpd/ldp_vty_exec.c b/ldpd/ldp_vty_exec.c index a57cf3c3f6..061bbeaa5e 100644 --- a/ldpd/ldp_vty_exec.c +++ b/ldpd/ldp_vty_exec.c @@ -27,6 +27,7 @@ #include "lde.h" #include "log.h" #include "ldp_vty.h" +#include "lib/json.h" #include "command.h" #include "vty.h" @@ -50,29 +51,31 @@ struct show_filter { #define LDPBUFSIZ 65535 static int show_interface_msg(struct vty *, struct imsg *, - struct show_filter *); + struct show_filter *, json_object *); static void show_discovery_adj(struct vty *, char *, - struct ctl_adj *); + struct ctl_adj *, json_object *); static int show_discovery_msg(struct vty *, struct imsg *, - struct show_filter *); -static void show_nbr_adj(struct vty *, char *, struct ctl_adj *); + struct show_filter *, json_object *); +static void show_nbr_adj(struct vty *, char *, struct ctl_adj *, + json_object *); static int show_nbr_msg(struct vty *, struct imsg *, - struct show_filter *); + struct show_filter *, json_object *, struct in_addr *); static int show_lib_msg(struct vty *, struct imsg *, - struct show_filter *); + 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 *); static int ldp_vty_connect(struct imsgbuf *); static int ldp_vty_dispatch(struct vty *, struct imsgbuf *, - enum show_command, struct show_filter *); + enum show_command, struct show_filter *, u_char); static int ldp_vty_get_af(const char *, int *); static int show_interface_msg(struct vty *vty, struct imsg *imsg, - struct show_filter *filter) + struct show_filter *filter, json_object *json) { struct ctl_iface *iface; char timers[BUFSIZ]; + json_object *json_iface = NULL; switch (imsg->hdr.type) { case IMSG_CTL_SHOW_INTERFACE: @@ -81,14 +84,25 @@ show_interface_msg(struct vty *vty, struct imsg *imsg, if (filter->family != AF_UNSPEC && filter->family != iface->af) break; - 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); + 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); + } break; case IMSG_CTL_END: vty_out(vty, "%s", VTY_NEWLINE); @@ -101,22 +115,52 @@ show_interface_msg(struct vty *vty, struct imsg *imsg, } static void -show_discovery_adj(struct vty *vty, char *buffer, struct ctl_adj *adj) +show_discovery_adj(struct vty *vty, char *buffer, struct ctl_adj *adj, json_object *json) { size_t buflen = strlen(buffer); - - 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); + 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); + } } static int show_discovery_msg(struct vty *vty, struct imsg *imsg, - struct show_filter *filter) + struct show_filter *filter, json_object *json) { struct ctl_adj *adj; struct ctl_disc_if *iface; @@ -126,6 +170,10 @@ 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: @@ -140,10 +188,28 @@ show_discovery_msg(struct vty *vty, struct imsg *imsg, (filter->family == AF_INET6 && !iface->active_v6))) break; - buflen = strlen(ifaces_buffer); - snprintf(ifaces_buffer + buflen, LDPBUFSIZ - buflen, - " %s: %s%s", iface->name, (iface->no_adj) ? - "xmit" : "xmit/recv", VTY_NEWLINE); + if (json) { + json_object_object_get_ex(json, "interfaces", &json_interfaces); + + if (!json_interfaces) { + json_interfaces = json_object_new_object(); + json_object_object_add(json, "interfaces", json_interfaces); + } + + 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"); + + json_object_object_add(json_interfaces, iface->name, json_interface); + + } else { + 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; @@ -151,13 +217,31 @@ show_discovery_msg(struct vty *vty, struct imsg *imsg, if (filter->family != AF_UNSPEC && filter->family != tnbr->af) break; - 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); + trans_addr = &(ldp_af_conf_get(ldpd_conf, tnbr->af))->trans_addr; + + if (json) { + json_object_object_get_ex(json, "targeted", &json_targets); + + if (!json_targets) { + json_targets = json_object_new_array(); + json_object_object_add(json, "targeted", json_targets); + } + + 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); + } break; case IMSG_CTL_SHOW_DISC_ADJ: adj = imsg->data; @@ -167,24 +251,29 @@ show_discovery_msg(struct vty *vty, struct imsg *imsg, switch(adj->type) { case HELLO_LINK: - show_discovery_adj(vty, ifaces_buffer, adj); + show_discovery_adj(vty, ifaces_buffer, adj, json); break; case HELLO_TARGETED: - show_discovery_adj(vty, tnbrs_buffer, adj); + show_discovery_adj(vty, tnbrs_buffer, adj, json); 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); + + 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); default: break; } @@ -193,75 +282,131 @@ show_discovery_msg(struct vty *vty, struct imsg *imsg, } static void -show_nbr_adj(struct vty *vty, char *buffer, struct ctl_adj *adj) +show_nbr_adj(struct vty *vty, char *buffer, struct ctl_adj *adj, json_object *json_nbr) { size_t buflen = strlen(buffer); + json_object *json_adj_link = NULL; + json_object *json_adj_targeted = NULL; switch (adj->type) { case HELLO_LINK: - snprintf(buffer + buflen, LDPBUFSIZ - buflen, - " Interface: %s%s", adj->ifname, VTY_NEWLINE); + 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); + } break; case HELLO_TARGETED: - snprintf(buffer + buflen, LDPBUFSIZ - buflen, - " Targeted Hello: %s%s", log_addr(adj->af, - &adj->src_addr), VTY_NEWLINE); + 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); + } break; } } static int -show_nbr_msg(struct vty *vty, struct imsg *imsg, struct show_filter *filter) +show_nbr_msg(struct vty *vty, struct imsg *imsg, struct show_filter *filter, + json_object *json, struct in_addr *nbr_id) { struct ctl_adj *adj; struct ctl_nbr *nbr; 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; - 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); + 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); + } 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); + show_nbr_adj(vty, v4adjs_buffer, adj, json_nbr); break; case AF_INET6: - show_nbr_adj(vty, v6adjs_buffer, adj); + show_nbr_adj(vty, v6adjs_buffer, adj, json_nbr); 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); + /* 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); @@ -273,10 +418,13 @@ 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) +show_lib_msg(struct vty *vty, struct imsg *imsg, struct show_filter *filter, json_object *json) { 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: @@ -286,27 +434,50 @@ show_lib_msg(struct vty *vty, struct imsg *imsg, struct show_filter *filter) break; snprintf(dstnet, sizeof(dstnet), "%s/%d", - 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); + 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); + } break; case IMSG_CTL_END: vty_out(vty, "%s", VTY_NEWLINE); @@ -419,10 +590,12 @@ ldp_vty_connect(struct imsgbuf *ibuf) static int ldp_vty_dispatch(struct vty *vty, struct imsgbuf *ibuf, enum show_command cmd, - struct show_filter *filter) + struct show_filter *filter, u_char uj) { struct imsg imsg; int n, done = 0; + struct in_addr nbr_id; + json_object *json = NULL; while (ibuf->w.queued) if (msgbuf_write(&ibuf->w) <= 0 && errno != EAGAIN) { @@ -431,15 +604,30 @@ ldp_vty_dispatch(struct vty *vty, struct imsgbuf *ibuf, enum show_command cmd, return (CMD_WARNING); } + if (uj) + 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); } 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); } @@ -447,22 +635,28 @@ ldp_vty_dispatch(struct vty *vty, struct imsgbuf *ibuf, enum show_command cmd, 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); } if (n == 0) break; switch (cmd) { case SHOW_IFACE: - done = show_interface_msg(vty, &imsg, filter); + done = show_interface_msg(vty, &imsg, filter, json); break; case SHOW_DISC: - done = show_discovery_msg(vty, &imsg, filter); + done = show_discovery_msg(vty, &imsg, filter, json); break; case SHOW_NBR: - done = show_nbr_msg(vty, &imsg, filter); + done = show_nbr_msg(vty, &imsg, filter, json, &nbr_id); break; case SHOW_LIB: - done = show_lib_msg(vty, &imsg, filter); + done = show_lib_msg(vty, &imsg, filter, json); break; case SHOW_L2VPN_PW: done = show_l2vpn_pw_msg(vty, &imsg); @@ -479,6 +673,13 @@ ldp_vty_dispatch(struct vty *vty, struct imsgbuf *ibuf, enum show_command cmd, 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_SUCCESS); } @@ -500,7 +701,7 @@ ldp_vty_get_af(const char *str, int *af) } int -ldp_vty_show_binding(struct vty *vty, struct vty_arg *args[]) +ldp_vty_show_binding(struct vty *vty, struct vty_arg *args[], u_char uj) { struct imsgbuf ibuf; struct show_filter filter; @@ -519,11 +720,11 @@ ldp_vty_show_binding(struct vty *vty, struct vty_arg *args[]) memset(&filter, 0, sizeof(filter)); filter.family = af; - return (ldp_vty_dispatch(vty, &ibuf, SHOW_LIB, &filter)); + return (ldp_vty_dispatch(vty, &ibuf, SHOW_LIB, &filter, uj)); } int -ldp_vty_show_discovery(struct vty *vty, struct vty_arg *args[]) +ldp_vty_show_discovery(struct vty *vty, struct vty_arg *args[], u_char uj) { struct imsgbuf ibuf; struct show_filter filter; @@ -542,11 +743,11 @@ ldp_vty_show_discovery(struct vty *vty, struct vty_arg *args[]) memset(&filter, 0, sizeof(filter)); filter.family = af; - return (ldp_vty_dispatch(vty, &ibuf, SHOW_DISC, &filter)); + return (ldp_vty_dispatch(vty, &ibuf, SHOW_DISC, &filter, uj)); } int -ldp_vty_show_interface(struct vty *vty, struct vty_arg *args[]) +ldp_vty_show_interface(struct vty *vty, struct vty_arg *args[], u_char uj) { struct imsgbuf ibuf; struct show_filter filter; @@ -568,14 +769,16 @@ ldp_vty_show_interface(struct vty *vty, struct vty_arg *args[]) filter.family = af; /* header */ - vty_out(vty, "%-4s %-11s %-6s %-8s %-12s %3s%s", "AF", - "Interface", "State", "Uptime", "Hello Timers", "ac", VTY_NEWLINE); + if (!uj) { + 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)); + return (ldp_vty_dispatch(vty, &ibuf, SHOW_IFACE, &filter, uj)); } int -ldp_vty_show_neighbor(struct vty *vty, struct vty_arg *args[]) +ldp_vty_show_neighbor(struct vty *vty, struct vty_arg *args[], u_char uj) { struct imsgbuf ibuf; struct show_filter filter; @@ -588,7 +791,7 @@ ldp_vty_show_neighbor(struct vty *vty, struct vty_arg *args[]) /* not used */ memset(&filter, 0, sizeof(filter)); - return (ldp_vty_dispatch(vty, &ibuf, SHOW_NBR, &filter)); + return (ldp_vty_dispatch(vty, &ibuf, SHOW_NBR, &filter, uj)); } int @@ -605,7 +808,7 @@ ldp_vty_show_atom_binding(struct vty *vty, struct vty_arg *args[]) /* not used */ memset(&filter, 0, sizeof(filter)); - return (ldp_vty_dispatch(vty, &ibuf, SHOW_L2VPN_BINDING, &filter)); + return (ldp_vty_dispatch(vty, &ibuf, SHOW_L2VPN_BINDING, &filter, 0)); } int @@ -629,7 +832,7 @@ ldp_vty_show_atom_vc(struct vty *vty, struct vty_arg *args[]) "---------", "---------------", "----------", "----------------", "----------", VTY_NEWLINE); - return (ldp_vty_dispatch(vty, &ibuf, SHOW_L2VPN_PW, &filter)); + return (ldp_vty_dispatch(vty, &ibuf, SHOW_L2VPN_PW, &filter, 0)); } int -- 2.39.5