diff --git a/configure.ac b/configure.ac index 65ba26d5f8..43e1625b90 100755 --- a/configure.ac +++ b/configure.ac @@ -1284,14 +1284,6 @@ AM_CONDITIONAL(OSPFD, test "x$OSPFD" = "xospfd") if test "${enable_ldpd}" = "no";then LDPD="" else - AX_PROG_PERL_MODULES(XML::LibXML, , [ - if test -f "${srcdir}/ldpd/ldp_vty_cmds.c"; then - AC_MSG_WARN([XML::LibXML perl module not found, using pregenerated ldp_vty_cmds.c]) - else - AC_MSG_ERROR([XML::LibXML perl module not found and pregenerated ldp_vty_cmds.c missing]) - fi - ]) - LDPD="ldpd" AC_DEFINE(HAVE_LDPD, 1, ldpd) fi diff --git a/doc/Building_FRR_on_Fedora24.md b/doc/Building_FRR_on_Fedora24.md index 1f5f12b9cc..bb5b52c62b 100644 --- a/doc/Building_FRR_on_Fedora24.md +++ b/doc/Building_FRR_on_Fedora24.md @@ -8,8 +8,7 @@ Add packages: sudo dnf install git autoconf automake libtool make gawk \ readline-devel texinfo net-snmp-devel groff pkgconfig \ - json-c-devel pam-devel perl-XML-LibXML c-ares-devel \ - python3-devel + json-c-devel pam-devel c-ares-devel python3-devel Get FRR, compile it and install it (from Git) --------------------------------------------- diff --git a/doc/Building_FRR_on_NetBSD6.md b/doc/Building_FRR_on_NetBSD6.md index 542a7f489e..2e453da66c 100644 --- a/doc/Building_FRR_on_NetBSD6.md +++ b/doc/Building_FRR_on_NetBSD6.md @@ -18,7 +18,7 @@ Configure Package location: Add packages: sudo pkg_add git autoconf automake libtool gmake gawk openssl \ - pkg-config json-c p5-XML-LibXML python27 py27-test python35 + pkg-config json-c python27 py27-test python35 Install SSL Root Certificates (for git https access): diff --git a/doc/Building_FRR_on_NetBSD7.md b/doc/Building_FRR_on_NetBSD7.md index 821a6109f2..f5f99d9ba0 100644 --- a/doc/Building_FRR_on_NetBSD7.md +++ b/doc/Building_FRR_on_NetBSD7.md @@ -12,7 +12,7 @@ Install required packages ------------------------- sudo pkgin install git autoconf automake libtool gmake gawk openssl \ - pkg-config json-c p5-XML-LibXML python27 py27-test python35 + pkg-config json-c python27 py27-test python35 Install SSL Root Certificates (for git https access): diff --git a/doc/Building_FRR_on_OmniOS.md b/doc/Building_FRR_on_OmniOS.md index 2e9871467b..7e75bda9e9 100644 --- a/doc/Building_FRR_on_OmniOS.md +++ b/doc/Building_FRR_on_OmniOS.md @@ -47,12 +47,6 @@ Add libjson to Solaris equivalent of ld.so.conf crle -l /opt/csw/lib -u -Add Perl packages: - - cpan - cpan[1]> install XML::LibXML - cpan[2]> exit - Add pytest: pip install pytest diff --git a/doc/Building_FRR_on_OpenBSD6.md b/doc/Building_FRR_on_OpenBSD6.md index 1c07b41ad5..e9e1030515 100644 --- a/doc/Building_FRR_on_OpenBSD6.md +++ b/doc/Building_FRR_on_OpenBSD6.md @@ -11,7 +11,7 @@ Configure PKG_PATH Add packages: pkg_add git autoconf-2.69p2 automake-1.15p0 libtool bison - pkg_add gmake gawk dejagnu openssl json-c p5-XML-LibXML py-test + pkg_add gmake gawk dejagnu openssl json-c py-test Select Python2.7 as default (required for pytest) diff --git a/doc/Building_FRR_on_Ubuntu1204.md b/doc/Building_FRR_on_Ubuntu1204.md index e79614a57e..033e05bcdb 100644 --- a/doc/Building_FRR_on_Ubuntu1204.md +++ b/doc/Building_FRR_on_Ubuntu1204.md @@ -13,7 +13,7 @@ Add packages: apt-get install git autoconf automake libtool make gawk libreadline-dev \ texinfo libpam0g-dev dejagnu libjson0-dev pkg-config libpam0g-dev \ - libjson0-dev flex python-pip libc-ares-dev python3-dev libxml2 libxml2-dev + libjson0-dev flex python-pip libc-ares-dev python3-dev Install newer bison from 14.04 package source (Ubuntu 12.04 package source is too old) @@ -51,11 +51,6 @@ Install newer version of autoconf and automake: sudo make install cd .. -Install XML::LibXML - - sudo cpan - install XML::LibXML - Install pytest: pip install pytest diff --git a/ldpd/.gitignore b/ldpd/.gitignore index e4ee82587a..35f7740d11 100644 --- a/ldpd/.gitignore +++ b/ldpd/.gitignore @@ -15,4 +15,3 @@ TAGS .arch-ids *~ *.loT -ldp_vty_cmds.c diff --git a/ldpd/Makefile.am b/ldpd/Makefile.am index b760b44573..6074b53a33 100644 --- a/ldpd/Makefile.am +++ b/ldpd/Makefile.am @@ -3,16 +3,12 @@ AM_CPPFLAGS = -I.. -I$(top_srcdir) -I$(top_srcdir)/lib -I$(top_builddir)/lib DEFS = @DEFS@ -DSYSCONFDIR=\"$(sysconfdir)/\" INSTALL_SDATA=@INSTALL@ -m 600 -EXTRA_DIST= AM_CFLAGS = $(WERROR) noinst_LIBRARIES = libldp.a sbin_PROGRAMS = ldpd -BUILT_SOURCES = ldp_vty_cmds.c -EXTRA_DIST += ldp_vty.xml - libldp_a_SOURCES = \ accept.c address.c adjacency.c control.c hello.c init.c interface.c \ keepalive.c l2vpn.c labelmapping.c lde.c lde_lib.c ldpd.c \ @@ -23,11 +19,6 @@ libldp_a_SOURCES = \ noinst_HEADERS = \ control.h lde.h ldpd.h ldpe.h ldp.h log.h ldp_debug.h ldp_vty.h -ldp_vty_cmds.c: $(srcdir)/ldp_vty.xml $(srcdir)/../tools/xml2cli.pl - @PERL@ $(srcdir)/../tools/xml2cli.pl $(srcdir)/ldp_vty.xml | \ - sed -e 's%DEFUN \((ldp_\(interface_\|mpls_ldp\|address_family\|l2vpn_word\|member_pseudo\)\)%DEFUN_NOSH \1%' \ - > $@ - ldpd_SOURCES = ldpd.c ldpd_LDADD = libldp.a ../lib/libfrr.la @LIBCAP@ diff --git a/ldpd/ldp_debug.c b/ldpd/ldp_debug.c index 4419f853b4..7915fb709d 100644 --- a/ldpd/ldp_debug.c +++ b/ldpd/ldp_debug.c @@ -1,21 +1,20 @@ /* * Copyright (C) 2016 by Open Source Routing. * - * This file is part of GNU Zebra. + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * - * GNU Zebra is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2, or (at your option) any - * later version. - * - * GNU Zebra is distributed in the hope that it will be useful, but + * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * - * You should have received a copy of the GNU General Public License along - * with this program; see the file COPYING; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA */ #include @@ -39,16 +38,10 @@ struct cmd_node ldp_debug_node = }; int -ldp_vty_debug(struct vty *vty, struct vty_arg *args[]) +ldp_vty_debug(struct vty *vty, int disable, const char *type_str, + const char *dir_str, int all) { - const char *type_str, *dir_str; - int disable, all; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - type_str = vty_get_arg_value(args, "type"); - if (strcmp(type_str, "discovery") == 0) { - dir_str = vty_get_arg_value(args, "dir"); if (dir_str == NULL) return (CMD_WARNING); @@ -74,8 +67,6 @@ ldp_vty_debug(struct vty *vty, struct vty_arg *args[]) else DEBUG_ON(event, EVENT); } else if (strcmp(type_str, "messages") == 0) { - all = (vty_get_arg_value(args, "all")) ? 1 : 0; - dir_str = vty_get_arg_value(args, "dir"); if (dir_str == NULL) return (CMD_WARNING); @@ -112,7 +103,7 @@ ldp_vty_debug(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_show_debugging(struct vty *vty, struct vty_arg *args[]) +ldp_vty_show_debugging(struct vty *vty) { vty_out(vty, "LDP debugging status:%s", VTY_NEWLINE); diff --git a/ldpd/ldp_debug.h b/ldpd/ldp_debug.h index 6366d3f6ac..4b91656851 100644 --- a/ldpd/ldp_debug.h +++ b/ldpd/ldp_debug.h @@ -1,21 +1,20 @@ /* * Copyright (C) 2016 by Open Source Routing. * - * This file is part of GNU Zebra. + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * - * GNU Zebra is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2, or (at your option) any - * later version. - * - * GNU Zebra is distributed in the hope that it will be useful, but + * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * - * You should have received a copy of the GNU General Public License along - * with this program; see the file COPYING; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA */ #ifndef _LDP_DEBUG_H_ diff --git a/ldpd/ldp_vty.h b/ldpd/ldp_vty.h index 21a486ff65..93713166f4 100644 --- a/ldpd/ldp_vty.h +++ b/ldpd/ldp_vty.h @@ -1,21 +1,20 @@ /* * Copyright (C) 2016 by Open Source Routing. * - * This file is part of GNU Zebra. + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * - * GNU Zebra is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2, or (at your option) any - * later version. - * - * GNU Zebra is distributed in the hope that it will be useful, but + * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * - * You should have received a copy of the GNU General Public License along - * with this program; see the file COPYING; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA */ #ifndef _LDP_VTY_H_ @@ -37,46 +36,47 @@ int ldp_get_address(const char *, int *, union ldpd_addr *); int ldp_config_write(struct vty *); int ldp_l2vpn_config_write(struct vty *); int ldp_debug_config_write(struct vty *); -int ldp_vty_mpls_ldp (struct vty *, struct vty_arg *[]); -int ldp_vty_address_family (struct vty *, struct vty_arg *[]); -int ldp_vty_disc_holdtime(struct vty *, struct vty_arg *[]); -int ldp_vty_disc_interval(struct vty *, struct vty_arg *[]); -int ldp_vty_targeted_hello_accept(struct vty *, struct vty_arg *[]); -int ldp_vty_session_holdtime(struct vty *, struct vty_arg *[]); -int ldp_vty_interface(struct vty *, struct vty_arg *[]); -int ldp_vty_trans_addr(struct vty *, struct vty_arg *[]); -int ldp_vty_neighbor_targeted(struct vty *, struct vty_arg *[]); -int ldp_vty_label_advertise(struct vty *, struct vty_arg *[]); -int ldp_vty_label_allocate(struct vty *, struct vty_arg *[]); -int ldp_vty_label_expnull(struct vty *, struct vty_arg *[]); -int ldp_vty_label_accept(struct vty *, struct vty_arg *[]); -int ldp_vty_ttl_security(struct vty *, struct vty_arg *[]); -int ldp_vty_router_id(struct vty *, struct vty_arg *[]); -int ldp_vty_ds_cisco_interop(struct vty *, struct vty_arg *[]); -int ldp_vty_trans_pref_ipv4(struct vty *, struct vty_arg *[]); -int ldp_vty_neighbor_password(struct vty *, struct vty_arg *[]); -int ldp_vty_neighbor_ttl_security(struct vty *, struct vty_arg *[]); -int ldp_vty_l2vpn(struct vty *, struct vty_arg *[]); -int ldp_vty_l2vpn_bridge(struct vty *, struct vty_arg *[]); -int ldp_vty_l2vpn_mtu(struct vty *, struct vty_arg *[]); -int ldp_vty_l2vpn_pwtype(struct vty *, struct vty_arg *[]); -int ldp_vty_l2vpn_interface(struct vty *, struct vty_arg *[]); -int ldp_vty_l2vpn_pseudowire(struct vty *, struct vty_arg *[]); -int ldp_vty_l2vpn_pw_cword(struct vty *, struct vty_arg *[]); -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_capabilities(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 *[]); -int ldp_vty_debug(struct vty *, struct vty_arg *[]); -int ldp_vty_show_debugging(struct vty *, struct vty_arg *[]); +int ldp_vty_mpls_ldp (struct vty *, int); +int ldp_vty_address_family (struct vty *, int, const char *); +int ldp_vty_disc_holdtime(struct vty *, int, const char *, const char *); +int ldp_vty_disc_interval(struct vty *, int, const char *, const char *); +int ldp_vty_targeted_hello_accept(struct vty *, int, const char *); +int ldp_vty_nbr_session_holdtime(struct vty *, int, const char *, const char *); +int ldp_vty_af_session_holdtime(struct vty *, int, const char *); +int ldp_vty_interface(struct vty *, int, const char *); +int ldp_vty_trans_addr(struct vty *, int, const char *); +int ldp_vty_neighbor_targeted(struct vty *, int, const char *); +int ldp_vty_label_advertise(struct vty *, int, const char *, const char *); +int ldp_vty_label_allocate(struct vty *, int, int, const char *); +int ldp_vty_label_expnull(struct vty *, int, const char *); +int ldp_vty_label_accept(struct vty *, int, const char *, const char *); +int ldp_vty_ttl_security(struct vty *, int); +int ldp_vty_router_id(struct vty *, int, const char *); +int ldp_vty_ds_cisco_interop(struct vty *, int); +int ldp_vty_trans_pref_ipv4(struct vty *, int); +int ldp_vty_neighbor_password(struct vty *, int, const char *, const char *); +int ldp_vty_neighbor_ttl_security(struct vty *, int, const char *, const char *); +int ldp_vty_l2vpn(struct vty *, int, const char *); +int ldp_vty_l2vpn_bridge(struct vty *, int, const char *); +int ldp_vty_l2vpn_mtu(struct vty *, int, const char *); +int ldp_vty_l2vpn_pwtype(struct vty *, int, const char *); +int ldp_vty_l2vpn_interface(struct vty *, int, const char *); +int ldp_vty_l2vpn_pseudowire(struct vty *, int, const char *); +int ldp_vty_l2vpn_pw_cword(struct vty *, int, const char *); +int ldp_vty_l2vpn_pw_nbr_addr(struct vty *, int, const char *); +int ldp_vty_l2vpn_pw_nbr_id(struct vty *, int, const char *); +int ldp_vty_l2vpn_pw_pwid(struct vty *, int, const char *); +int ldp_vty_l2vpn_pw_pwstatus(struct vty *, int); +int ldp_vty_clear_nbr(struct vty *, const char *); +int ldp_vty_debug(struct vty *, int, const char *, const char *, int); +int ldp_vty_show_binding(struct vty *, const char *, int, int); +int ldp_vty_show_discovery(struct vty *, const char *, int, int); +int ldp_vty_show_interface(struct vty *, const char *, int); +int ldp_vty_show_capabilities(struct vty *, int); +int ldp_vty_show_neighbor(struct vty *, int, int, int); +int ldp_vty_show_atom_binding(struct vty *, int); +int ldp_vty_show_atom_vc(struct vty *, int); +int ldp_vty_show_debugging(struct vty *); void ldp_vty_init(void); diff --git a/ldpd/ldp_vty.xml b/ldpd/ldp_vty.xml deleted file mode 100644 index cd5c92c7b1..0000000000 --- a/ldpd/ldp_vty.xml +++ /dev/null @@ -1,466 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ldpd/ldp_vty_cmds.c b/ldpd/ldp_vty_cmds.c new file mode 100644 index 0000000000..d28424cbb7 --- /dev/null +++ b/ldpd/ldp_vty_cmds.c @@ -0,0 +1,1132 @@ +/* + * Copyright (C) 2016 by Open Source Routing. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA + */ + +#include + +#include "command.h" +#include "vty.h" +#include "ldpd/ldp_vty.h" + +DEFUN_NOSH(ldp_mpls_ldp, + ldp_mpls_ldp_cmd, + "[no] mpls ldp", + "Negate a command or set its defaults\n" + "Global MPLS configuration subcommands\n" + "Label Distribution Protocol\n") +{ + int idx = 0; + int negate = 0; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + + return (ldp_vty_mpls_ldp(vty, negate)); +} + +DEFUN_NOSH(ldp_l2vpn, + ldp_l2vpn_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") +{ + int idx = 0; + int negate = 0; + const char *name; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "WORD", &idx); + name = argv[idx]->arg; + + return (ldp_vty_l2vpn(vty, negate, name)); +} + +DEFUN_NOSH(ldp_address_family, + ldp_address_family_cmd, + "[no] address-family ", + "Negate a command or set its defaults\n" + "Configure Address Family and its parameters\n" + "IPv4\n" + "IPv6\n") +{ + int idx = 0; + int negate = 0; + const char *af; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "address-family", &idx); + af = argv[idx + 1]->text; + + return (ldp_vty_address_family(vty, negate, af)); +} + +DEFUN (ldp_discovery_holdtime, + ldp_discovery_holdtime_cmd, + "[no] discovery holdtime (1-65535)", + "Negate a command or set its defaults\n" + "Configure discovery parameters\n" + "LDP Link Hellos\n" + "LDP Targeted Hellos\n" + "Hello holdtime\n" + "Time (seconds) - 65535 implies infinite\n") +{ + int idx = 0; + int negate = 0; + const char *hello_type; + const char *holdtime; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "discovery", &idx); + hello_type = argv[idx + 1]->text; + argv_find(argv, argc, "(1-65535)", &idx); + holdtime = argv[idx]->arg; + + return (ldp_vty_disc_holdtime(vty, negate, hello_type, holdtime)); +} + +DEFUN (ldp_discovery_interval, + ldp_discovery_interval_cmd, + "[no] discovery interval (1-65535)", + "Negate a command or set its defaults\n" + "Configure discovery parameters\n" + "LDP Link Hellos\n" + "LDP Targeted Hellos\n" + "Hello interval\n" + "Time (seconds)\n") +{ + int idx = 0; + int negate = 0; + const char *hello_type; + const char *interval; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "discovery", &idx); + hello_type = argv[idx + 1]->text; + argv_find(argv, argc, "(1-65535)", &idx); + interval = argv[idx]->arg; + + return (ldp_vty_disc_interval(vty, negate, hello_type, interval)); +} + +DEFUN (ldp_dual_stack_transport_connection_prefer_ipv4, + ldp_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") +{ + int idx = 0; + int negate = 0; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + + return (ldp_vty_trans_pref_ipv4(vty, negate)); +} + +DEFUN (ldp_dual_stack_cisco_interop, + ldp_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") +{ + int idx = 0; + int negate = 0; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + + return (ldp_vty_ds_cisco_interop(vty, negate)); +} + +DEFUN (ldp_neighbor_password, + ldp_neighbor_password_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") +{ + int idx = 0; + int negate = 0; + const char *neighbor; + const char *password; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "A.B.C.D", &idx); + neighbor = argv[idx]->arg; + argv_find(argv, argc, "WORD", &idx); + password = argv[idx]->arg; + + return (ldp_vty_neighbor_password(vty, negate, neighbor, password)); +} + +DEFUN (ldp_neighbor_session_holdtime, + ldp_neighbor_session_holdtime_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") +{ + int idx = 0; + int negate = 0; + const char *neighbor; + const char *holdtime; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "A.B.C.D", &idx); + neighbor = argv[idx]->arg; + argv_find(argv, argc, "(15-65535)", &idx); + holdtime = argv[idx]->arg; + + return (ldp_vty_nbr_session_holdtime(vty, negate, neighbor, holdtime)); +} + +DEFUN (ldp_neighbor_ttl_security, + ldp_neighbor_ttl_security_cmd, + "[no] neighbor A.B.C.D ttl-security ", + "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" + "IP hops\n" + "maximum number of hops\n") +{ + int idx = 0; + int negate = 0; + const char *neighbor; + const char *hops = NULL; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "A.B.C.D", &idx); + neighbor = argv[idx]->arg; + if (argv_find(argv, argc, "(1-254)", &idx)) + hops = argv[idx]->arg; + + return (ldp_vty_neighbor_ttl_security(vty, negate, neighbor, hops)); +} + +DEFUN (ldp_router_id, + ldp_router_id_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") +{ + int idx = 0; + int negate = 0; + const char *address; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "A.B.C.D", &idx); + address = argv[idx]->arg; + + return (ldp_vty_router_id(vty, negate, address)); +} + +DEFUN (ldp_discovery_targeted_hello_accept, + ldp_discovery_targeted_hello_accept_cmd, + "[no] discovery targeted-hello accept [from <(1-199)|(1300-2699)|WORD>]", + "Negate a command or set its defaults\n" + "Configure discovery parameters\n" + "LDP Targeted Hellos\n" + "Accept and respond to targeted hellos\n" + "Access list to specify acceptable targeted hello source\n" + "IP access-list number\n" + "IP access-list number (expanded range)\n" + "IP access-list name\n") +{ + int idx = 0; + int negate = 0; + const char *from_acl = NULL; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + if (argv_find(argv, argc, "from", &idx)) + from_acl = argv[idx + 1]->arg; + + return (ldp_vty_targeted_hello_accept(vty, negate, from_acl)); +} + +DEFUN (ldp_discovery_transport_address_ipv4, + ldp_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") +{ + int idx = 0; + int negate = 0; + const char *address; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "A.B.C.D", &idx); + address = argv[idx]->arg; + + return (ldp_vty_trans_addr(vty, negate, address)); +} + +DEFUN (ldp_discovery_transport_address_ipv6, + ldp_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") +{ + int idx = 0; + int negate = 0; + const char *address; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "X:X::X:X", &idx); + address = argv[idx]->arg; + + return (ldp_vty_trans_addr(vty, negate, address)); +} + +DEFUN (ldp_label_local_advertise, + ldp_label_local_advertise_cmd, + "[no] label local advertise [{to <(1-199)|(1300-2699)|WORD>|for <(1-199)|(1300-2699)|WORD>}]", + "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" + "IP Access-list specifying controls on LDP Peers\n" + "IP access-list number\n" + "IP access-list number (expanded range)\n" + "IP access-list name\n" + "IP access-list for destination prefixes\n" + "IP access-list number\n" + "IP access-list number (expanded range)\n" + "IP access-list name\n") +{ + int idx = 0; + int negate = 0; + const char *to_acl = NULL; + const char *for_acl = NULL; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + + /* arguments within curly braces may be provided in any order */ + if (argv_find(argv, argc, "to", &idx)) + to_acl = argv[idx + 1]->arg; + idx = 0; + if (argv_find(argv, argc, "for", &idx)) + for_acl = argv[idx + 1]->arg; + + return (ldp_vty_label_advertise(vty, negate, to_acl, for_acl)); +} + +DEFUN (ldp_label_local_advertise_explicit_null, + ldp_label_local_advertise_explicit_null_cmd, + "[no] label local advertise explicit-null [for <(1-199)|(1300-2699)|WORD>]", + "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" + "IP access-list for destination prefixes\n" + "IP access-list number\n" + "IP access-list number (expanded range)\n" + "IP access-list name\n") +{ + int idx = 0; + int negate = 0; + const char *for_acl = NULL; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + if (argv_find(argv, argc, "for", &idx)) + for_acl = argv[idx + 1]->arg; + + return (ldp_vty_label_expnull(vty, negate, for_acl)); +} + +DEFUN (ldp_label_local_allocate, + ldp_label_local_allocate_cmd, + "[no] label local allocate >", + "Negate a command or set its defaults\n" + "Configure label control and policies\n" + "Configure local label control and policies\n" + "Configure label allocation control\n" + "allocate local label for host routes only\n" + "IP access-list\n" + "IP access-list number\n" + "IP access-list number (expanded range)\n" + "IP access-list name\n") +{ + int idx = 0; + int negate = 0; + int host_routes = 0; + const char *for_acl = NULL; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + + /* arguments within curly braces may be provided in any order */ + if (argv_find(argv, argc, "host-routes", &idx)) + host_routes = 1; + idx = 0; + if (argv_find(argv, argc, "for", &idx)) + for_acl = argv[idx + 1]->arg; + + return (ldp_vty_label_allocate(vty, negate, host_routes, for_acl)); +} + +DEFUN (ldp_label_remote_accept, + ldp_label_remote_accept_cmd, + "[no] label remote accept {from <(1-199)|(1300-2699)|WORD>|for <(1-199)|(1300-2699)|WORD>}", + "Negate a command or set its defaults\n" + "Configure label control and policies\n" + "Configure remote/peer label control and policies\n" + "Configure inbound label acceptance control\n" + "Neighbor from whom to accept label advertisement\n" + "IP access-list number\n" + "IP access-list number (expanded range)\n" + "IP access-list name\n" + "IP access-list for destination prefixes\n" + "IP access-list number\n" + "IP access-list number (expanded range)\n" + "IP access-list name\n") +{ + int idx = 0; + int negate = 0; + const char *from_acl = NULL; + const char *for_acl = NULL; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + + /* arguments within curly braces may be provided in any order */ + if (argv_find(argv, argc, "from", &idx)) + from_acl = argv[idx + 1]->arg; + idx = 0; + if (argv_find(argv, argc, "for", &idx)) + for_acl = argv[idx + 1]->arg; + + return (ldp_vty_label_accept(vty, negate, from_acl, for_acl)); +} + +DEFUN (ldp_ttl_security_disable, + ldp_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") +{ + int idx = 0; + int negate = 0; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + + return (ldp_vty_ttl_security(vty, negate)); +} + +DEFUN (ldp_session_holdtime, + ldp_session_holdtime_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") +{ + int idx = 0; + int negate = 0; + const char *holdtime; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "(15-65535)", &idx); + holdtime = argv[idx]->arg; + + return (ldp_vty_af_session_holdtime(vty, negate, holdtime)); +} + +DEFUN_NOSH(ldp_interface, + ldp_interface_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") +{ + int idx = 0; + int negate = 0; + const char *ifname; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "IFNAME", &idx); + ifname = argv[idx]->arg; + + return (ldp_vty_interface(vty, negate, ifname)); +} + +DEFUN (ldp_neighbor_ipv4_targeted, + ldp_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") +{ + int idx = 0; + int negate = 0; + const char *address; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "A.B.C.D", &idx); + address = argv[idx]->arg; + + return (ldp_vty_neighbor_targeted(vty, negate, address)); +} + +DEFUN (ldp_neighbor_ipv6_targeted, + ldp_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") +{ + int idx = 0; + int negate = 0; + const char *address; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "X:X::X:X", &idx); + address = argv[idx]->arg; + + return (ldp_vty_neighbor_targeted(vty, negate, address)); +} + +DEFUN (ldp_bridge, + ldp_bridge_cmd, + "[no] bridge IFNAME", + "Negate a command or set its defaults\n" + "Bridge interface\n" + "Interface's name\n") +{ + int idx = 0; + int negate = 0; + const char *ifname; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "IFNAME", &idx); + ifname = argv[idx]->arg; + + return (ldp_vty_l2vpn_bridge(vty, negate, ifname)); +} + +DEFUN (ldp_mtu, + ldp_mtu_cmd, + "[no] mtu (1500-9180)", + "Negate a command or set its defaults\n" + "Set Maximum Transmission Unit\n" + "Maximum Transmission Unit value\n") +{ + int idx = 0; + int negate = 0; + const char *mtu; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "(1500-9180)", &idx); + mtu = argv[idx]->arg; + + return (ldp_vty_l2vpn_mtu(vty, negate, mtu)); +} + +DEFUN (ldp_member_interface, + ldp_member_interface_cmd, + "[no] member interface IFNAME", + "Negate a command or set its defaults\n" + "L2VPN member configuration\n" + "Local interface\n" + "Interface's name\n") +{ + int idx = 0; + int negate = 0; + const char *ifname; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "IFNAME", &idx); + ifname = argv[idx]->arg; + + return (ldp_vty_l2vpn_interface(vty, negate, ifname)); +} + +DEFUN_NOSH(ldp_member_pseudowire, + ldp_member_pseudowire_cmd, + "[no] member pseudowire IFNAME", + "Negate a command or set its defaults\n" + "L2VPN member configuration\n" + "Pseudowire interface\n" + "Interface's name\n") +{ + int idx = 0; + int negate = 0; + const char *ifname; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "IFNAME", &idx); + ifname = argv[idx]->arg; + + return (ldp_vty_l2vpn_pseudowire(vty, negate, ifname)); +} + +DEFUN (ldp_vc_type, + ldp_vc_type_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") +{ + int idx = 0; + int negate = 0; + const char *vc_type; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "type", &idx); + vc_type = argv[idx + 1]->text; + + return (ldp_vty_l2vpn_pwtype(vty, negate, vc_type)); +} + +DEFUN (ldp_control_word, + ldp_control_word_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") +{ + int idx = 0; + int negate = 0; + const char *preference; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "control-word", &idx); + preference = argv[idx + 1]->text; + + return (ldp_vty_l2vpn_pw_cword(vty, negate, preference)); +} + +DEFUN (ldp_neighbor_address, + ldp_neighbor_address_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") +{ + int idx = 0; + int negate = 0; + const char *address; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "address", &idx); + address = argv[idx + 1]->arg; + + return (ldp_vty_l2vpn_pw_nbr_addr(vty, negate, address)); +} + +DEFUN (ldp_neighbor_lsr_id, + ldp_neighbor_lsr_id_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") +{ + int idx = 0; + int negate = 0; + const char *address; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "A.B.C.D", &idx); + address = argv[idx]->arg; + + return (ldp_vty_l2vpn_pw_nbr_id(vty, negate, address)); +} + +DEFUN (ldp_pw_id, + ldp_pw_id_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") +{ + int idx = 0; + int negate = 0; + const char *pwid; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "(1-4294967295)", &idx); + pwid = argv[idx]->arg; + + return (ldp_vty_l2vpn_pw_pwid(vty, negate, pwid)); +} + +DEFUN (ldp_pw_status_disable, + ldp_pw_status_disable_cmd, + "[no] pw-status disable", + "Negate a command or set its defaults\n" + "Configure PW status\n" + "Disable PW status\n") +{ + int idx = 0; + int negate = 0; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + + return (ldp_vty_l2vpn_pw_pwstatus(vty, negate)); +} + +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" + "IPv4 address\n" + "IPv6 address\n") +{ + int idx = 0; + const char *address = NULL; + + if (argv_find(argv, argc, "neighbor", &idx)) + address = argv[idx + 1]->arg; + + return (ldp_vty_clear_nbr(vty, address)); +} + +DEFUN (ldp_debug_mpls_ldp_discovery_hello, + ldp_debug_mpls_ldp_discovery_hello_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") +{ + int idx = 0; + int negate = 0; + const char *dir; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "hello", &idx); + dir = argv[idx + 1]->text; + + return (ldp_vty_debug(vty, negate, "discovery", dir, 0)); +} + +DEFUN (ldp_debug_mpls_ldp_type, + ldp_debug_mpls_ldp_type_cmd, + "[no] debug mpls ldp ", + "Negate a command or set its defaults\n" + "Debugging functions\n" + "MPLS information\n" + "Label Distribution Protocol\n" + "Errors\n" + "LDP event information\n" + "LDP zebra information\n") +{ + int idx = 0; + int negate = 0; + const char *type; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + argv_find(argv, argc, "ldp", &idx); + type = argv[idx + 1]->text; + + return (ldp_vty_debug(vty, negate, type, NULL, 0)); +} + +DEFUN (ldp_debug_mpls_ldp_messages_recv, + ldp_debug_mpls_ldp_messages_recv_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") +{ + int idx = 0; + int negate = 0; + int all = 0; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + if (argv_find(argv, argc, "all", &idx)) + all = 1; + + return (ldp_vty_debug(vty, negate, "messages", "recv", all)); +} + +DEFUN (ldp_debug_mpls_ldp_messages_sent, + ldp_debug_mpls_ldp_messages_sent_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") +{ + int idx = 0; + int negate = 0; + int all = 0; + + if (argv_find(argv, argc, "no", &idx)) + negate = 1; + if (argv_find(argv, argc, "all", &idx)) + all = 1; + + return (ldp_vty_debug(vty, negate, "messages", "sent", all)); +} + +DEFUN (ldp_show_mpls_ldp_binding, + ldp_show_mpls_ldp_binding_cmd, + "show mpls ldp [] binding [detail] [json]", + "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" + "Show detailed information\n" + "JavaScript Object Notation\n") +{ + int idx = 0; + const char *af = NULL; + int detail = 0; + int json = 0; + + if (argv_find(argv, argc, "ipv4", &idx) || + argv_find(argv, argc, "ipv6", &idx)) + af = argv[idx]->text; + if (argv_find(argv, argc, "detail", &idx)) + detail = 1; + if (argv_find(argv, argc, "json", &idx)) + json = 1; + + return (ldp_vty_show_binding(vty, af, detail, json)); +} + +DEFUN (ldp_show_mpls_ldp_discovery, + ldp_show_mpls_ldp_discovery_cmd, + "show mpls ldp [] discovery [detail] [json]", + "Show running system information\n" + "MPLS information\n" + "Label Distribution Protocol\n" + "IPv4 Address Family\n" + "IPv6 Address Family\n" + "Discovery Hello Information\n" + "Show detailed information\n" + "JavaScript Object Notation\n") +{ + int idx = 0; + const char *af = NULL; + int detail = 0; + int json = 0; + + if (argv_find(argv, argc, "ipv4", &idx) || + argv_find(argv, argc, "ipv6", &idx)) + af = argv[idx]->text; + if (argv_find(argv, argc, "detail", &idx)) + detail = 1; + if (argv_find(argv, argc, "json", &idx)) + json = 1; + + return (ldp_vty_show_discovery(vty, af, detail, json)); +} + +DEFUN (ldp_show_mpls_ldp_interface, + ldp_show_mpls_ldp_interface_cmd, + "show mpls ldp [] interface [json]", + "Show running system information\n" + "MPLS information\n" + "Label Distribution Protocol\n" + "IPv4 Address Family\n" + "IPv6 Address Family\n" + "interface information\n" + "JavaScript Object Notation\n") +{ + int idx = 0; + const char *af = NULL; + int json = 0; + + if (argv_find(argv, argc, "ipv4", &idx) || + argv_find(argv, argc, "ipv6", &idx)) + af = argv[idx]->text; + if (argv_find(argv, argc, "json", &idx)) + json = 1; + + return (ldp_vty_show_interface(vty, af, json)); +} + +DEFUN (ldp_show_mpls_ldp_capabilities, + ldp_show_mpls_ldp_capabilities_cmd, + "show mpls ldp capabilities [json]", + "Show running system information\n" + "MPLS information\n" + "Label Distribution Protocol\n" + "Display LDP Capabilities information\n" + "JavaScript Object Notation\n") +{ + int idx = 0; + int json = 0; + + if (argv_find(argv, argc, "json", &idx)) + json = 1; + + return (ldp_vty_show_capabilities(vty, json)); +} + +DEFUN (ldp_show_mpls_ldp_neighbor, + ldp_show_mpls_ldp_neighbor_cmd, + "show mpls ldp neighbor [detail] [json]", + "Show running system information\n" + "MPLS information\n" + "Label Distribution Protocol\n" + "Neighbor information\n" + "Show detailed information\n" + "JavaScript Object Notation\n") +{ + int idx = 0; + int detail = 0; + int json = 0; + + if (argv_find(argv, argc, "detail", &idx)) + detail = 1; + if (argv_find(argv, argc, "json", &idx)) + json = 1; + + return (ldp_vty_show_neighbor(vty, 0, detail, json)); +} + +DEFUN (ldp_show_mpls_ldp_neighbor_capabilities, + ldp_show_mpls_ldp_neighbor_capabilities_cmd, + "show mpls ldp neighbor capabilities [json]", + "Show running system information\n" + "MPLS information\n" + "Label Distribution Protocol\n" + "Neighbor information\n" + "Display neighbor capability information\n" + "JavaScript Object Notation\n") +{ + int idx = 0; + int json = 0; + + if (argv_find(argv, argc, "json", &idx)) + json = 1; + + return (ldp_vty_show_neighbor(vty, 1, 0, json)); +} + +DEFUN (ldp_show_l2vpn_atom_binding, + ldp_show_l2vpn_atom_binding_cmd, + "show l2vpn atom binding [json]", + "Show running system information\n" + "Show information about Layer2 VPN\n" + "Show Any Transport over MPLS information\n" + "Show AToM label binding information\n" + "JavaScript Object Notation\n") +{ + int idx = 0; + int json = 0; + + if (argv_find(argv, argc, "json", &idx)) + json = 1; + + return (ldp_vty_show_atom_binding(vty, json)); +} + +DEFUN (ldp_show_l2vpn_atom_vc, + ldp_show_l2vpn_atom_vc_cmd, + "show l2vpn atom vc [json]", + "Show running system information\n" + "Show information about Layer2 VPN\n" + "Show Any Transport over MPLS information\n" + "Show AToM virtual circuit information\n" + "JavaScript Object Notation\n") +{ + int idx = 0; + int json = 0; + + if (argv_find(argv, argc, "json", &idx)) + json = 1; + + return (ldp_vty_show_atom_vc(vty, json)); +} + +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") +{ + return (ldp_vty_show_debugging(vty)); +} + +void +ldp_vty_init (void) +{ + install_node(&ldp_node, ldp_config_write); + install_node(&ldp_ipv4_node, NULL); + install_node(&ldp_ipv6_node, NULL); + install_node(&ldp_ipv4_iface_node, NULL); + install_node(&ldp_ipv6_iface_node, NULL); + install_node(&ldp_l2vpn_node, ldp_l2vpn_config_write); + install_node(&ldp_pseudowire_node, NULL); + install_node(&ldp_debug_node, ldp_debug_config_write); + install_default(LDP_NODE); + install_default(LDP_IPV4_NODE); + install_default(LDP_IPV6_NODE); + install_default(LDP_IPV4_IFACE_NODE); + install_default(LDP_IPV6_IFACE_NODE); + install_default(LDP_L2VPN_NODE); + install_default(LDP_PSEUDOWIRE_NODE); + + install_element(CONFIG_NODE, &ldp_mpls_ldp_cmd); + install_element(CONFIG_NODE, &ldp_l2vpn_cmd); + install_element(CONFIG_NODE, &ldp_debug_mpls_ldp_discovery_hello_cmd); + install_element(CONFIG_NODE, &ldp_debug_mpls_ldp_type_cmd); + install_element(CONFIG_NODE, &ldp_debug_mpls_ldp_messages_recv_cmd); + install_element(CONFIG_NODE, &ldp_debug_mpls_ldp_messages_sent_cmd); + + install_element(LDP_NODE, &ldp_address_family_cmd); + install_element(LDP_NODE, &ldp_discovery_holdtime_cmd); + install_element(LDP_NODE, &ldp_discovery_interval_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_password_cmd); + install_element(LDP_NODE, &ldp_neighbor_session_holdtime_cmd); + install_element(LDP_NODE, &ldp_neighbor_ttl_security_cmd); + install_element(LDP_NODE, &ldp_router_id_cmd); + + install_element(LDP_IPV4_NODE, &ldp_discovery_holdtime_cmd); + install_element(LDP_IPV4_NODE, &ldp_discovery_interval_cmd); + install_element(LDP_IPV4_NODE, &ldp_discovery_targeted_hello_accept_cmd); + install_element(LDP_IPV4_NODE, &ldp_discovery_transport_address_ipv4_cmd); + install_element(LDP_IPV4_NODE, &ldp_label_local_advertise_cmd); + install_element(LDP_IPV4_NODE, &ldp_label_local_advertise_explicit_null_cmd); + install_element(LDP_IPV4_NODE, &ldp_label_local_allocate_cmd); + install_element(LDP_IPV4_NODE, &ldp_label_remote_accept_cmd); + install_element(LDP_IPV4_NODE, &ldp_ttl_security_disable_cmd); + install_element(LDP_IPV4_NODE, &ldp_interface_cmd); + install_element(LDP_IPV4_NODE, &ldp_session_holdtime_cmd); + install_element(LDP_IPV4_NODE, &ldp_neighbor_ipv4_targeted_cmd); + + install_element(LDP_IPV6_NODE, &ldp_discovery_holdtime_cmd); + install_element(LDP_IPV6_NODE, &ldp_discovery_interval_cmd); + install_element(LDP_IPV6_NODE, &ldp_discovery_targeted_hello_accept_cmd); + install_element(LDP_IPV6_NODE, &ldp_discovery_transport_address_ipv6_cmd); + install_element(LDP_IPV6_NODE, &ldp_label_local_advertise_cmd); + install_element(LDP_IPV6_NODE, &ldp_label_local_advertise_explicit_null_cmd); + install_element(LDP_IPV6_NODE, &ldp_label_local_allocate_cmd); + install_element(LDP_IPV6_NODE, &ldp_label_remote_accept_cmd); + install_element(LDP_IPV6_NODE, &ldp_ttl_security_disable_cmd); + install_element(LDP_IPV6_NODE, &ldp_interface_cmd); + install_element(LDP_IPV6_NODE, &ldp_session_holdtime_cmd); + install_element(LDP_IPV6_NODE, &ldp_neighbor_ipv6_targeted_cmd); + + install_element(LDP_IPV4_IFACE_NODE, &ldp_discovery_holdtime_cmd); + install_element(LDP_IPV4_IFACE_NODE, &ldp_discovery_interval_cmd); + + install_element(LDP_IPV6_IFACE_NODE, &ldp_discovery_holdtime_cmd); + install_element(LDP_IPV6_IFACE_NODE, &ldp_discovery_interval_cmd); + + install_element(LDP_L2VPN_NODE, &ldp_bridge_cmd); + install_element(LDP_L2VPN_NODE, &ldp_mtu_cmd); + install_element(LDP_L2VPN_NODE, &ldp_member_interface_cmd); + install_element(LDP_L2VPN_NODE, &ldp_member_pseudowire_cmd); + install_element(LDP_L2VPN_NODE, &ldp_vc_type_cmd); + + install_element(LDP_PSEUDOWIRE_NODE, &ldp_control_word_cmd); + install_element(LDP_PSEUDOWIRE_NODE, &ldp_neighbor_address_cmd); + install_element(LDP_PSEUDOWIRE_NODE, &ldp_neighbor_lsr_id_cmd); + install_element(LDP_PSEUDOWIRE_NODE, &ldp_pw_id_cmd); + install_element(LDP_PSEUDOWIRE_NODE, &ldp_pw_status_disable_cmd); + + install_element(ENABLE_NODE, &ldp_clear_mpls_ldp_neighbor_cmd); + install_element(ENABLE_NODE, &ldp_debug_mpls_ldp_discovery_hello_cmd); + install_element(ENABLE_NODE, &ldp_debug_mpls_ldp_type_cmd); + install_element(ENABLE_NODE, &ldp_debug_mpls_ldp_messages_recv_cmd); + install_element(ENABLE_NODE, &ldp_debug_mpls_ldp_messages_sent_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_capabilities_cmd); + install_element(VIEW_NODE, &ldp_show_mpls_ldp_neighbor_cmd); + install_element(VIEW_NODE, &ldp_show_mpls_ldp_neighbor_capabilities_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); +} diff --git a/ldpd/ldp_vty_conf.c b/ldpd/ldp_vty_conf.c index 8394907142..c96e69a6c5 100644 --- a/ldpd/ldp_vty_conf.c +++ b/ldpd/ldp_vty_conf.c @@ -1,21 +1,20 @@ /* * Copyright (C) 2016 by Open Source Routing. * - * This file is part of GNU Zebra. + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * - * GNU Zebra is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2, or (at your option) any - * later version. - * - * GNU Zebra is distributed in the hope that it will be useful, but + * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * - * You should have received a copy of the GNU General Public License along - * with this program; see the file COPYING; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA */ #include @@ -37,8 +36,6 @@ static void ldp_af_config_write(struct vty *, int, struct ldpd_conf *, static void ldp_l2vpn_pw_config_write(struct vty *, struct l2vpn_pw *); static int ldp_vty_get_af(struct vty *); static int ldp_iface_is_configured(struct ldpd_conf *, const char *); -static int ldp_vty_nbr_session_holdtime(struct vty *, struct vty_arg *[]); -static int ldp_vty_af_session_holdtime(struct vty *, struct vty_arg *[]); struct cmd_node ldp_node = { @@ -418,12 +415,8 @@ ldp_iface_is_configured(struct ldpd_conf *xconf, const char *ifname) } int -ldp_vty_mpls_ldp(struct vty *vty, struct vty_arg *args[]) +ldp_vty_mpls_ldp(struct vty *vty, int disable) { - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - if (disable) vty_conf->flags &= ~F_LDPD_ENABLED; else { @@ -437,15 +430,10 @@ ldp_vty_mpls_ldp(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_address_family(struct vty *vty, struct vty_arg *args[]) +ldp_vty_address_family(struct vty *vty, int disable, const char *af_str) { struct ldpd_af_conf *af_conf; int af; - const char *af_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - af_str = vty_get_arg_value(args, "address-family"); if (strcmp(af_str, "ipv4") == 0) { af = AF_INET; @@ -480,7 +468,8 @@ ldp_vty_address_family(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_disc_holdtime(struct vty *vty, struct vty_arg *args[]) +ldp_vty_disc_holdtime(struct vty *vty, int disable, const char *hello_type_str, + const char *seconds_str) { struct ldpd_af_conf *af_conf; struct iface *iface; @@ -489,13 +478,6 @@ ldp_vty_disc_holdtime(struct vty *vty, struct vty_arg *args[]) char *ep; long int secs; enum hello_type hello_type; - const char *seconds_str; - const char *hello_type_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - seconds_str = vty_get_arg_value(args, "seconds"); - hello_type_str = vty_get_arg_value(args, "hello_type"); secs = strtol(seconds_str, &ep, 10); if (*ep != '\0' || secs < MIN_HOLDTIME || secs > MAX_HOLDTIME) { @@ -580,7 +562,8 @@ ldp_vty_disc_holdtime(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_disc_interval(struct vty *vty, struct vty_arg *args[]) +ldp_vty_disc_interval(struct vty *vty, int disable, const char *hello_type_str, + const char *seconds_str) { struct ldpd_af_conf *af_conf; struct iface *iface; @@ -589,13 +572,6 @@ ldp_vty_disc_interval(struct vty *vty, struct vty_arg *args[]) char *ep; long int secs; enum hello_type hello_type; - const char *seconds_str; - const char *hello_type_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - seconds_str = vty_get_arg_value(args, "seconds"); - hello_type_str = vty_get_arg_value(args, "hello_type"); secs = strtol(seconds_str, &ep, 10); if (*ep != '\0' || secs < MIN_HELLO_INTERVAL || @@ -681,15 +657,11 @@ ldp_vty_disc_interval(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_targeted_hello_accept(struct vty *vty, struct vty_arg *args[]) +ldp_vty_targeted_hello_accept(struct vty *vty, int disable, + const char *acl_from_str) { struct ldpd_af_conf *af_conf; int af; - const char *acl_from_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - acl_from_str = vty_get_arg_value(args, "from_acl"); af = ldp_vty_get_af(vty); af_conf = ldp_af_conf_get(vty_conf, af); @@ -711,20 +683,14 @@ ldp_vty_targeted_hello_accept(struct vty *vty, struct vty_arg *args[]) return (CMD_SUCCESS); } -static int -ldp_vty_nbr_session_holdtime(struct vty *vty, struct vty_arg *args[]) +int +ldp_vty_nbr_session_holdtime(struct vty *vty, int disable, + const char *lsr_id_str, const char *seconds_str) { char *ep; long int secs; struct in_addr lsr_id; struct nbr_params *nbrp; - const char *seconds_str; - const char *lsr_id_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - seconds_str = vty_get_arg_value(args, "seconds"); - lsr_id_str = vty_get_arg_value(args, "lsr_id"); if (inet_pton(AF_INET, lsr_id_str, &lsr_id) != 1 || bad_addr_v4(lsr_id)) { @@ -763,18 +729,14 @@ ldp_vty_nbr_session_holdtime(struct vty *vty, struct vty_arg *args[]) return (CMD_SUCCESS); } -static int -ldp_vty_af_session_holdtime(struct vty *vty, struct vty_arg *args[]) +int +ldp_vty_af_session_holdtime(struct vty *vty, int disable, + const char *seconds_str) { struct ldpd_af_conf *af_conf; int af; char *ep; long int secs; - const char *seconds_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - seconds_str = vty_get_arg_value(args, "seconds"); secs = strtol(seconds_str, &ep, 10); if (*ep != '\0' || secs < MIN_KEEPALIVE || secs > MAX_KEEPALIVE) { @@ -796,30 +758,11 @@ ldp_vty_af_session_holdtime(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_session_holdtime(struct vty *vty, struct vty_arg *args[]) -{ - switch (vty->node) { - case LDP_NODE: - return (ldp_vty_nbr_session_holdtime(vty, args)); - case LDP_IPV4_NODE: - case LDP_IPV6_NODE: - return (ldp_vty_af_session_holdtime(vty, args)); - default: - fatalx("ldp_vty_session_holdtime: unexpected node"); - } -} - -int -ldp_vty_interface(struct vty *vty, struct vty_arg *args[]) +ldp_vty_interface(struct vty *vty, int disable, const char *ifname) { int af; struct iface *iface; struct iface_af *ia; - const char *ifname; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - ifname = vty_get_arg_value(args, "ifname"); af = ldp_vty_get_af(vty); iface = if_lookup_name(vty_conf, ifname); @@ -878,15 +821,10 @@ ldp_vty_interface(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_trans_addr(struct vty *vty, struct vty_arg *args[]) +ldp_vty_trans_addr(struct vty *vty, int disable, const char *addr_str) { struct ldpd_af_conf *af_conf; int af; - const char *addr_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - addr_str = vty_get_arg_value(args, "addr"); af = ldp_vty_get_af(vty); af_conf = ldp_af_conf_get(vty_conf, af); @@ -907,16 +845,11 @@ ldp_vty_trans_addr(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_neighbor_targeted(struct vty *vty, struct vty_arg *args[]) +ldp_vty_neighbor_targeted(struct vty *vty, int disable, const char *addr_str) { int af; union ldpd_addr addr; struct tnbr *tnbr; - const char *addr_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - addr_str = vty_get_arg_value(args, "addr"); af = ldp_vty_get_af(vty); @@ -959,17 +892,11 @@ ldp_vty_neighbor_targeted(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_label_advertise(struct vty *vty, struct vty_arg *args[]) +ldp_vty_label_advertise(struct vty *vty, int disable, const char *acl_to_str, + const char *acl_for_str) { struct ldpd_af_conf *af_conf; int af; - const char *acl_to_str; - const char *acl_for_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - acl_to_str = vty_get_arg_value(args, "to_acl"); - acl_for_str = vty_get_arg_value(args, "for_acl"); af = ldp_vty_get_af(vty); af_conf = ldp_af_conf_get(vty_conf, af); @@ -996,17 +923,11 @@ ldp_vty_label_advertise(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_label_allocate(struct vty *vty, struct vty_arg *args[]) +ldp_vty_label_allocate(struct vty *vty, int disable, int host_routes, + const char *acl_for_str) { struct ldpd_af_conf *af_conf; int af; - const char *acl_for_str; - const char *host_routes_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - acl_for_str = vty_get_arg_value(args, "for_acl"); - host_routes_str = vty_get_arg_value(args, "host-routes"); af = ldp_vty_get_af(vty); af_conf = ldp_af_conf_get(vty_conf, af); @@ -1014,7 +935,7 @@ ldp_vty_label_allocate(struct vty *vty, struct vty_arg *args[]) af_conf->flags &= ~F_LDPD_AF_ALLOCHOSTONLY; af_conf->acl_label_allocate_for[0] = '\0'; if (!disable) { - if (host_routes_str) + if (host_routes) af_conf->flags |= F_LDPD_AF_ALLOCHOSTONLY; else strlcpy(af_conf->acl_label_allocate_for, acl_for_str, @@ -1027,15 +948,10 @@ ldp_vty_label_allocate(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_label_expnull(struct vty *vty, struct vty_arg *args[]) +ldp_vty_label_expnull(struct vty *vty, int disable, const char *acl_for_str) { struct ldpd_af_conf *af_conf; int af; - const char *acl_for_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - acl_for_str = vty_get_arg_value(args, "for_acl"); af = ldp_vty_get_af(vty); af_conf = ldp_af_conf_get(vty_conf, af); @@ -1058,17 +974,11 @@ ldp_vty_label_expnull(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_label_accept(struct vty *vty, struct vty_arg *args[]) +ldp_vty_label_accept(struct vty *vty, int disable, const char *acl_from_str, + const char *acl_for_str) { struct ldpd_af_conf *af_conf; int af; - const char *acl_from_str; - const char *acl_for_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - acl_from_str = vty_get_arg_value(args, "from_acl"); - acl_for_str = vty_get_arg_value(args, "for_acl"); af = ldp_vty_get_af(vty); af_conf = ldp_af_conf_get(vty_conf, af); @@ -1095,13 +1005,10 @@ ldp_vty_label_accept(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_ttl_security(struct vty *vty, struct vty_arg *args[]) +ldp_vty_ttl_security(struct vty *vty, int disable) { struct ldpd_af_conf *af_conf; int af; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; af = ldp_vty_get_af(vty); af_conf = ldp_af_conf_get(vty_conf, af); @@ -1117,14 +1024,8 @@ ldp_vty_ttl_security(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_router_id(struct vty *vty, struct vty_arg *args[]) +ldp_vty_router_id(struct vty *vty, int disable, const char *addr_str) { - const char *addr_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - addr_str = vty_get_arg_value(args, "addr"); - if (disable) vty_conf->rtr_id.s_addr = INADDR_ANY; else { @@ -1141,12 +1042,8 @@ ldp_vty_router_id(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_ds_cisco_interop(struct vty *vty, struct vty_arg *args[]) +ldp_vty_ds_cisco_interop(struct vty *vty, int disable) { - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - if (disable) vty_conf->flags &= ~F_LDPD_DS_CISCO_INTEROP; else @@ -1158,12 +1055,8 @@ ldp_vty_ds_cisco_interop(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_trans_pref_ipv4(struct vty *vty, struct vty_arg *args[]) +ldp_vty_trans_pref_ipv4(struct vty *vty, int disable) { - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - if (disable) vty_conf->trans_pref = DUAL_STACK_LDPOV6; else @@ -1175,18 +1068,12 @@ ldp_vty_trans_pref_ipv4(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_neighbor_password(struct vty *vty, struct vty_arg *args[]) +ldp_vty_neighbor_password(struct vty *vty, int disable, const char *lsr_id_str, + const char *password_str) { struct in_addr lsr_id; size_t password_len; struct nbr_params *nbrp; - const char *lsr_id_str; - const char *password_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - lsr_id_str = vty_get_arg_value(args, "lsr_id"); - password_str = vty_get_arg_value(args, "password"); if (inet_pton(AF_INET, lsr_id_str, &lsr_id) != 1 || bad_addr_v4(lsr_id)) { @@ -1226,19 +1113,13 @@ ldp_vty_neighbor_password(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_neighbor_ttl_security(struct vty *vty, struct vty_arg *args[]) +ldp_vty_neighbor_ttl_security(struct vty *vty, int disable, + const char *lsr_id_str, const char *hops_str) { struct in_addr lsr_id; struct nbr_params *nbrp; long int hops = 0; char *ep; - const char *lsr_id_str; - const char *hops_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - lsr_id_str = vty_get_arg_value(args, "lsr_id"); - hops_str = vty_get_arg_value(args, "hops"); if (inet_pton(AF_INET, lsr_id_str, &lsr_id) != 1 || bad_addr_v4(lsr_id)) { @@ -1286,16 +1167,11 @@ ldp_vty_neighbor_ttl_security(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_l2vpn(struct vty *vty, struct vty_arg *args[]) +ldp_vty_l2vpn(struct vty *vty, int disable, const char *name_str) { struct l2vpn *l2vpn; struct l2vpn_if *lif; struct l2vpn_pw *pw; - const char *name_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - name_str = vty_get_arg_value(args, "name"); l2vpn = l2vpn_find(vty_conf, name_str); @@ -1336,14 +1212,9 @@ ldp_vty_l2vpn(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_l2vpn_bridge(struct vty *vty, struct vty_arg *args[]) +ldp_vty_l2vpn_bridge(struct vty *vty, int disable, const char *ifname) { VTY_DECLVAR_CONTEXT(l2vpn, l2vpn); - const char *ifname; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - ifname = vty_get_arg_value(args, "ifname"); if (disable) memset(l2vpn->br_ifname, 0, sizeof(l2vpn->br_ifname)); @@ -1356,16 +1227,11 @@ ldp_vty_l2vpn_bridge(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_l2vpn_mtu(struct vty *vty, struct vty_arg *args[]) +ldp_vty_l2vpn_mtu(struct vty *vty, int disable, const char *mtu_str) { VTY_DECLVAR_CONTEXT(l2vpn, l2vpn); char *ep; int mtu; - const char *mtu_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - mtu_str = vty_get_arg_value(args, "mtu"); mtu = strtol(mtu_str, &ep, 10); if (*ep != '\0' || mtu < MIN_L2VPN_MTU || mtu > MAX_L2VPN_MTU) { @@ -1384,15 +1250,10 @@ ldp_vty_l2vpn_mtu(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_l2vpn_pwtype(struct vty *vty, struct vty_arg *args[]) +ldp_vty_l2vpn_pwtype(struct vty *vty, int disable, const char *type_str) { VTY_DECLVAR_CONTEXT(l2vpn, l2vpn); int pw_type; - const char *type_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - type_str = vty_get_arg_value(args, "type"); if (strcmp(type_str, "ethernet") == 0) pw_type = PW_TYPE_ETHERNET; @@ -1410,15 +1271,10 @@ ldp_vty_l2vpn_pwtype(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_l2vpn_interface(struct vty *vty, struct vty_arg *args[]) +ldp_vty_l2vpn_interface(struct vty *vty, int disable, const char *ifname) { VTY_DECLVAR_CONTEXT(l2vpn, l2vpn); struct l2vpn_if *lif; - const char *ifname; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - ifname = vty_get_arg_value(args, "ifname"); lif = l2vpn_if_find(l2vpn, ifname); @@ -1453,15 +1309,10 @@ ldp_vty_l2vpn_interface(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_l2vpn_pseudowire(struct vty *vty, struct vty_arg *args[]) +ldp_vty_l2vpn_pseudowire(struct vty *vty, int disable, const char *ifname) { VTY_DECLVAR_CONTEXT(l2vpn, l2vpn); struct l2vpn_pw *pw; - const char *ifname; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - ifname = vty_get_arg_value(args, "ifname"); pw = l2vpn_pw_find(l2vpn, ifname); @@ -1504,14 +1355,9 @@ ldp_vty_l2vpn_pseudowire(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_l2vpn_pw_cword(struct vty *vty, struct vty_arg *args[]) +ldp_vty_l2vpn_pw_cword(struct vty *vty, int disable, const char *preference_str) { VTY_DECLVAR_CONTEXT_SUB(l2vpn_pw, pw); - const char *preference_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - preference_str = vty_get_arg_value(args, "preference"); if (disable) pw->flags |= F_PW_CWORD_CONF; @@ -1528,16 +1374,11 @@ ldp_vty_l2vpn_pw_cword(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_l2vpn_pw_nbr_addr(struct vty *vty, struct vty_arg *args[]) +ldp_vty_l2vpn_pw_nbr_addr(struct vty *vty, int disable, const char *addr_str) { VTY_DECLVAR_CONTEXT_SUB(l2vpn_pw, pw); int af; union ldpd_addr addr; - const char *addr_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - addr_str = vty_get_arg_value(args, "addr"); if (ldp_get_address(addr_str, &af, &addr) == -1 || bad_addr(af, &addr)) { @@ -1561,15 +1402,10 @@ ldp_vty_l2vpn_pw_nbr_addr(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_l2vpn_pw_nbr_id(struct vty *vty, struct vty_arg *args[]) +ldp_vty_l2vpn_pw_nbr_id(struct vty *vty, int disable, const char *lsr_id_str) { VTY_DECLVAR_CONTEXT_SUB(l2vpn_pw, pw); struct in_addr lsr_id; - const char *lsr_id_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - lsr_id_str = vty_get_arg_value(args, "lsr-id"); if (inet_pton(AF_INET, lsr_id_str, &lsr_id) != 1 || bad_addr_v4(lsr_id)) { @@ -1588,16 +1424,11 @@ ldp_vty_l2vpn_pw_nbr_id(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_l2vpn_pw_pwid(struct vty *vty, struct vty_arg *args[]) +ldp_vty_l2vpn_pw_pwid(struct vty *vty, int disable, const char *pwid_str) { VTY_DECLVAR_CONTEXT_SUB(l2vpn_pw, pw); char *ep; uint32_t pwid; - const char *pwid_str; - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; - pwid_str = vty_get_arg_value(args, "pwid"); pwid = strtol(pwid_str, &ep, 10); if (*ep != '\0' || pwid < MIN_PWID_ID || pwid > MAX_PWID_ID) { @@ -1616,12 +1447,9 @@ ldp_vty_l2vpn_pw_pwid(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_l2vpn_pw_pwstatus(struct vty *vty, struct vty_arg *args[]) +ldp_vty_l2vpn_pw_pwstatus(struct vty *vty, int disable) { VTY_DECLVAR_CONTEXT_SUB(l2vpn_pw, pw); - int disable; - - disable = (vty_get_arg_value(args, "no")) ? 1 : 0; if (disable) pw->flags |= F_PW_STATUSTLV_CONF; diff --git a/ldpd/ldp_vty_exec.c b/ldpd/ldp_vty_exec.c index 3463fb6c63..252abd17fd 100644 --- a/ldpd/ldp_vty_exec.c +++ b/ldpd/ldp_vty_exec.c @@ -1,21 +1,20 @@ /* * Copyright (C) 2016 by Open Source Routing. * - * This file is part of GNU Zebra. + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * - * GNU Zebra is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2, or (at your option) any - * later version. - * - * GNU Zebra is distributed in the hope that it will be useful, but + * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * - * You should have received a copy of the GNU General Public License along - * with this program; see the file COPYING; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA */ #include @@ -1582,24 +1581,22 @@ 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, const char *af_str, int detail, int json) { struct imsgbuf ibuf; struct show_params params; - const char *af_str; int af; if (ldp_vty_connect(&ibuf) < 0) return (CMD_WARNING); - af_str = vty_get_arg_value(args, "address-family"); if (ldp_vty_get_af(af_str, &af) < 0) return (CMD_ERR_NO_MATCH); memset(¶ms, 0, sizeof(params)); params.family = af; - params.detail = vty_get_arg_value(args, "detail") ? 1 : 0; - params.json = vty_get_arg_value(args, "json") ? 1 : 0; + params.detail = detail; + params.json = json; if (!params.detail && !params.json) vty_out(vty, "%-4s %-20s %-15s %-11s %-13s %6s%s", "AF", @@ -1611,24 +1608,23 @@ ldp_vty_show_binding(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_show_discovery(struct vty *vty, struct vty_arg *args[]) +ldp_vty_show_discovery(struct vty *vty, const char *af_str, int detail, + int json) { struct imsgbuf ibuf; struct show_params params; - const char *af_str; int af; if (ldp_vty_connect(&ibuf) < 0) return (CMD_WARNING); - af_str = vty_get_arg_value(args, "address-family"); if (ldp_vty_get_af(af_str, &af) < 0) return (CMD_ERR_NO_MATCH); memset(¶ms, 0, sizeof(params)); params.family = af; - params.detail = vty_get_arg_value(args, "detail") ? 1 : 0; - params.json = vty_get_arg_value(args, "json") ? 1 : 0; + params.detail = detail; + params.json = json; if (!params.detail && !params.json) vty_out(vty, "%-4s %-15s %-8s %-15s %9s%s", @@ -1643,24 +1639,22 @@ ldp_vty_show_discovery(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_show_interface(struct vty *vty, struct vty_arg *args[]) +ldp_vty_show_interface(struct vty *vty, const char *af_str, int json) { struct imsgbuf ibuf; struct show_params params; unsigned int ifidx = 0; - const char *af_str; int af; if (ldp_vty_connect(&ibuf) < 0) return (CMD_WARNING); - af_str = vty_get_arg_value(args, "address-family"); if (ldp_vty_get_af(af_str, &af) < 0) return (CMD_ERR_NO_MATCH); memset(¶ms, 0, sizeof(params)); params.family = af; - params.json = vty_get_arg_value(args, "json") ? 1 : 0; + params.json = json; /* header */ if (!params.json) { @@ -1675,9 +1669,9 @@ ldp_vty_show_interface(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_show_capabilities(struct vty *vty, struct vty_arg *args[]) +ldp_vty_show_capabilities(struct vty *vty, int json) { - if (vty_get_arg_value(args, "json")) { + if (json) { json_object *json; json_object *json_array; json_object *json_cap; @@ -1727,7 +1721,7 @@ ldp_vty_show_capabilities(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_show_neighbor(struct vty *vty, struct vty_arg *args[]) +ldp_vty_show_neighbor(struct vty *vty, int capabilities, int detail, int json) { struct imsgbuf ibuf; struct show_params params; @@ -1736,9 +1730,9 @@ ldp_vty_show_neighbor(struct vty *vty, struct vty_arg *args[]) return (CMD_WARNING); memset(¶ms, 0, sizeof(params)); - params.capabilities = vty_get_arg_value(args, "capabilities") ? 1 : 0; - params.detail = vty_get_arg_value(args, "detail") ? 1 : 0; - params.json = vty_get_arg_value(args, "json") ? 1 : 0; + params.capabilities = capabilities; + params.detail = detail; + params.json = json; if (params.capabilities) params.detail = 1; @@ -1753,7 +1747,7 @@ ldp_vty_show_neighbor(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_show_atom_binding(struct vty *vty, struct vty_arg *args[]) +ldp_vty_show_atom_binding(struct vty *vty, int json) { struct imsgbuf ibuf; struct show_params params; @@ -1762,14 +1756,14 @@ ldp_vty_show_atom_binding(struct vty *vty, struct vty_arg *args[]) return (CMD_WARNING); memset(¶ms, 0, sizeof(params)); - params.json = vty_get_arg_value(args, "json") ? 1 : 0; + params.json = json; imsg_compose(&ibuf, IMSG_CTL_SHOW_L2VPN_BINDING, 0, 0, -1, NULL, 0); return (ldp_vty_dispatch(vty, &ibuf, SHOW_L2VPN_BINDING, ¶ms)); } int -ldp_vty_show_atom_vc(struct vty *vty, struct vty_arg *args[]) +ldp_vty_show_atom_vc(struct vty *vty, int json) { struct imsgbuf ibuf; struct show_params params; @@ -1778,7 +1772,7 @@ ldp_vty_show_atom_vc(struct vty *vty, struct vty_arg *args[]) return (CMD_WARNING); memset(¶ms, 0, sizeof(params)); - params.json = vty_get_arg_value(args, "json") ? 1 : 0; + params.json = json; if (!params.json) { /* header */ @@ -1795,14 +1789,11 @@ ldp_vty_show_atom_vc(struct vty *vty, struct vty_arg *args[]) } int -ldp_vty_clear_nbr(struct vty *vty, struct vty_arg *args[]) +ldp_vty_clear_nbr(struct vty *vty, const char *addr_str) { struct imsgbuf ibuf; - const char *addr_str; struct ctl_nbr nbr; - addr_str = vty_get_arg_value(args, "addr"); - memset(&nbr, 0, sizeof(nbr)); if (addr_str && (ldp_get_address(addr_str, &nbr.af, &nbr.raddr) == -1 || diff --git a/ldpd/ldp_zebra.c b/ldpd/ldp_zebra.c index 1a93f5a86f..79fff01c4c 100644 --- a/ldpd/ldp_zebra.c +++ b/ldpd/ldp_zebra.c @@ -1,21 +1,20 @@ /* * Copyright (C) 2016 by Open Source Routing. * - * This file is part of GNU Zebra. + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * - * GNU Zebra is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2, or (at your option) any - * later version. - * - * GNU Zebra is distributed in the hope that it will be useful, but + * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * - * You should have received a copy of the GNU General Public License along - * with this program; see the file COPYING; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, + * MA 02110-1301 USA */ #include diff --git a/lib/vty.c b/lib/vty.c index c500a45194..19f9223d37 100644 --- a/lib/vty.c +++ b/lib/vty.c @@ -3151,29 +3151,3 @@ vty_terminate (void) Vvty_serv_thread = NULL; } } - -/* Utility functions to get arguments from commands generated - by the xml2cli.pl script. */ -const char * -vty_get_arg_value (struct vty_arg *args[], const char *arg) -{ - while (*args) - { - if (strcmp ((*args)->name, arg) == 0) - return (*args)->value; - args++; - } - return NULL; -} - -struct vty_arg * -vty_get_arg (struct vty_arg *args[], const char *arg) -{ - while (*args) - { - if (strcmp ((*args)->name, arg) == 0) - return *args; - args++; - } - return NULL; -} diff --git a/lib/vty.h b/lib/vty.h index 77edc7173a..7dc9e339f1 100644 --- a/lib/vty.h +++ b/lib/vty.h @@ -342,7 +342,4 @@ extern void vty_hello (struct vty *); an async-signal-safe function. */ extern void vty_log_fixed (char *buf, size_t len); -extern const char *vty_get_arg_value (struct vty_arg **, const char *); -extern struct vty_arg *vty_get_arg (struct vty_arg **, const char *); - #endif /* _ZEBRA_VTY_H */ diff --git a/tools/Makefile.am b/tools/Makefile.am index de81919cdd..dd32d0dab0 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -13,6 +13,4 @@ sbin_SCRIPTS = frr-reload.py frr EXTRA_DIST += frr.service frr-reload.py frr -EXTRA_DIST += xml2cli.pl - ssd_SOURCES = start-stop-daemon.c diff --git a/tools/xml2cli.pl b/tools/xml2cli.pl deleted file mode 100755 index 40f905bcde..0000000000 --- a/tools/xml2cli.pl +++ /dev/null @@ -1,446 +0,0 @@ -#!/usr/bin/perl -## -## Parse a XML file containing a tree-like representation of Quagga CLI -## commands and generate a file with: -## -## - a DEFUN function for each command; -## - an initialization function. -## -## -## Copyright (C) 2012 Renato Westphal -## This file is part of GNU Zebra. -## -## GNU Zebra is free software; you can redistribute it and/or modify it -## under the terms of the GNU General Public License as published by the -## Free Software Foundation; either version 2, or (at your option) any -## later version. -## -## GNU Zebra is distributed in the hope that it will be useful, but -## WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -## General Public License for more details. -## -## You should have received a copy of the GNU General Public License -## along with GNU Zebra; see the file COPYING. If not, write to the Free -## Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -## 02111-1307, USA. -## - -use strict; -use warnings; -use Getopt::Std; -use vars qw($opt_d); -use File::Basename qw(fileparse); -use XML::LibXML; - -%::input_strs = ( - "ifname" => "IFNAME", - "word" => "WORD", - "line" => ".LINE", - "ipv4" => "A.B.C.D", - "ipv4m" => "A.B.C.D/M", - "ipv6" => "X:X::X:X", - "ipv6m" => "X:X::X:X/M", - "mtu" => "(1500-9180)", - "acl_range" => "(1-199)", - "acl_expanded_range" => "(1300-2699)", - # BGP specific - "rd" => "ASN:nn_or_IP-address:nn", - "asn" => "(1-4294967295)", - "community" => "AA:NN", - "clist" => "(1-500)", - # LDP specific - "disc_time" => "(1-65535)", - "session_time" => "(15-65535)", - "pwid" => "(1-4294967295)", - "hops" => "(1-254)" - ); - -# parse options node and store the corresponding information -# into a global hash of hashes -sub parse_options { - my $xml_node = $_[0]; - my @cmdstr; - - my $options_name = $xml_node->findvalue('./@name'); - if (not $options_name) { - die('error: "options" node without "name" attribute'); - } - - # initialize hash - $::options{$options_name}{'cmdstr'} = ""; - $::options{$options_name}{'help'} = ""; - - my @children = $xml_node->getChildnodes(); - foreach my $child(@children) { - # skip comments, random text, etc - if ($child->getType() != XML_ELEMENT_NODE) { - next; - } - - # check for error/special conditions - if ($child->getName() ne "option") { - die('error: invalid node type: "' . $child->getName() . '"'); - } - - my $name = $child->findvalue('./@name'); - my $input = $child->findvalue('./@input'); - my $help = $child->findvalue('./@help'); - if ($input) { - $name = $::input_strs{$input}; - } - - push (@cmdstr, $name); - $::options{$options_name}{'help'} .= "\n \"" . $help . "\\n\""; - } - $::options{$options_name}{'cmdstr'} = "<" . join('|', @cmdstr) . ">"; -} - -# given a subtree, replace all the corresponding include nodes by -# this subtree -sub subtree_replace_includes { - my $subtree = $_[0]; - - my $subtree_name = $subtree->findvalue('./@name'); - if (not $subtree_name) { - die("subtree without \"name\" attribute"); - } - - my $query = "//include[\@subtree='$subtree_name']"; - foreach my $include_node($::xml->findnodes($query)) { - my @children = $subtree->getChildnodes(); - foreach my $child(reverse @children) { - my $include_node_parent = $include_node->getParentNode(); - $include_node_parent->insertAfter($child->cloneNode(1), - $include_node); - } - $include_node->unbindNode(); - } - $subtree->unbindNode(); -} - -# generate arguments for a given command -sub generate_arguments { - my @nodes = @_; - my $arguments; - my $no_args = 1; - my $argc = -1; - - $arguments .= " struct vty_arg *args[] =\n"; - $arguments .= " {\n"; - for (my $i = 0; $i < @nodes; $i++) { - my %node = %{$nodes[$i]}; - my $arg_value; - - $argc++; - if (not $node{'arg'}) { - next; - } - $no_args = 0; - - # for input and select nodes, the value of the argument is an - # argv[] element. for the other types of nodes, the value of the - # argument is the name of the node - if ($node{'input'} or $node{'type'} eq "select") { - $arg_value = "argv[" . $argc . "]->arg"; - } elsif ($node{'optional'}) { - $arg_value = "(argc > " . $argc . " ? argv[" . $argc. "]->arg : NULL)"; - } else { - $arg_value = '"' . $node{'name'} . '"'; - } - - if ($node{'input'} and $node{'input'} eq "line") { - # arguments of the type 'line' may have multiple spaces (i.e - # they don't fit into a single argv[] element). to properly - # handle these arguments, we need to provide direct access - # to the argv[] array and the argc variable. - my $argc_str = "argc" . (($argc > 1) ? " - " . ($argc - 1) : ""); - my $argv_str = "argv" . (($argc > 1) ? " + " . ($argc - 1) : ""); - $arguments .= " &(struct vty_arg) { " - . ".name = \"" . $node{'arg'} . "\", " - . ".argc = $argc_str, " - . ".argv = $argv_str },\n"; - } else { - # common case - each argument has a name and a single value - $arguments .= " &(struct vty_arg) { " - . ".name = \"" . $node{'arg'} . "\", " - . ".value = " . $arg_value . " },\n"; - } - } - $arguments .= " NULL\n"; - $arguments .= " };\n"; - - # handle special case - if ($no_args) { - return " struct vty_arg *args[] = { NULL };\n"; - } - - return $arguments; -} - -# generate C code -sub generate_code { - my @nodes = @_; - my $funcname = ''; - my $cmdstr = ''; - my $cmdname = ''; - my $helpstr = ''; - my $function = ''; - - for (my $i = 0; $i < @nodes; $i++) { - my %node = %{$nodes[$i]}; - if ($node{'input'}) { - $funcname .= $node{'input'} . " "; - $cmdstr .= $::input_strs{$node{'input'}} . " "; - $helpstr .= "\n \"" . $node{'help'} . "\\n\""; - } elsif ($node{'type'} eq "select") { - my $options_name = $node{'options'}; - $funcname .= $options_name . " "; - $cmdstr .= $::options{$options_name}{'cmdstr'} . " "; - $helpstr .= $::options{$options_name}{'help'}; - } else { - $funcname .= $node{'name'} . " "; - if ($node{'optional'}) { - $cmdstr .= "[" . $node{'name'} . "] "; - } else { - $cmdstr .= $node{'name'} . " "; - } - $helpstr .= "\n \"" . $node{'help'} . "\\n\""; - } - - # update the command string - if ($node{'function'} ne "inherited" and $node{'function'}) { - $function = $node{'function'}; - } - } - - # rtrim - $funcname =~ s/\s+$//; - $cmdstr =~ s/\s+$//; - # lowercase - $funcname = lc($funcname); - # replace " " by "_" - $funcname =~ tr/ /_/; - # replace "-" by "_" - $funcname =~ tr/-/_/; - # add prefix - $funcname = $::cmdprefix . '_' . $funcname; - - # generate DEFUN - $cmdname = $funcname . "_cmd"; - - # don't generate same command more than once - if ($::commands{$cmdname}) { - return $cmdname; - } - $::commands{$cmdname} = "1"; - - print STDOUT "DEFUN (" . $funcname . ",\n" - . " " . $cmdname . ",\n" - . " \"" . $cmdstr . "\"," - . $helpstr . ")\n" - . "{\n" - . generate_arguments(@nodes) - . " return " . $function . " (vty, args);\n" - . "}\n\n"; - - return $cmdname; -} - -# parse tree node (recursive function) -sub parse_tree { - # get args - my $xml_node = $_[0]; - my @nodes = @{$_[1]}; - my $tree_name = $_[2]; - - # hash containing all the node attributes - my %node; - $node{'type'} = $xml_node->getName(); - - # check for error/special conditions - if ($node{'type'} eq "tree") { - goto end; - } - if ($node{'type'} eq "include") { - die('error: can not include "' - . $xml_node->findvalue('./@subtree') . '"'); - } - if (not $node{'type'} ~~ [qw(option select)]) { - die('error: invalid node type: "' . $node{'type'} . '"'); - } - if ($node{'type'} eq "select") { - my $options_name = $xml_node->findvalue('./@options'); - if (not $options_name) { - die('error: "select" node without "name" attribute'); - } - if (not $::options{$options_name}) { - die('error: can not find options'); - } - $node{'options'} = $options_name; - } - - # get node attributes - $node{'name'} = $xml_node->findvalue('./@name'); - $node{'input'} = $xml_node->findvalue('./@input'); - $node{'arg'} = $xml_node->findvalue('./@arg'); - $node{'help'} = $xml_node->findvalue('./@help'); - $node{'function'} = $xml_node->findvalue('./@function'); - $node{'ifdef'} = $xml_node->findvalue('./@ifdef'); - $node{'optional'} = $xml_node->findvalue('./@optional'); - - # push node to stack - push (@nodes, \%node); - - # generate C code - if ($node{'function'}) { - my $cmdname = generate_code(@nodes); - push (@{$::trees{$tree_name}}, [0, $cmdname, 0]); - } - - if ($node{'ifdef'}) { - push (@{$::trees{$tree_name}}, [$node{'ifdef'}, 0, 0]); - } - -end: - # recursively process child nodes - my @children = $xml_node->getChildnodes(); - foreach my $child(@children) { - # skip comments, random text, etc - if ($child->getType() != XML_ELEMENT_NODE) { - next; - } - parse_tree($child, \@nodes, $tree_name); - } - - if ($node{'ifdef'}) { - push (@{$::trees{$tree_name}}, [0, 0, $node{'ifdef'}]); - } -} - -sub parse_node { - # get args - my $xml_node = $_[0]; - - my $node_name = $xml_node->findvalue('./@name'); - if (not $node_name) { - die('missing the "name" attribute'); - } - - my $install = $xml_node->findvalue('./@install'); - my $config_write = $xml_node->findvalue('./@config_write'); - if ($install and $install eq "1") { - print " install_node (&" .lc( $node_name) . "_node, " . $config_write . ");\n"; - } - - my $install_default = $xml_node->findvalue('./@install_default'); - if ($install_default and $install_default eq "1") { - print " install_default (" . $node_name . "_NODE);\n"; - } - - my @children = $xml_node->getChildnodes(); - foreach my $child(@children) { - # skip comments, random text, etc - if ($child->getType() != XML_ELEMENT_NODE) { - next; - } - - if ($child->getName() ne "include") { - die('error: invalid node type: "' . $child->getName() . '"'); - } - my $tree_name = $child->findvalue('./@tree'); - if (not $tree_name) { - die('missing the "tree" attribute'); - } - - foreach my $entry (@{$::trees{$tree_name}}) { - my ($ifdef, $cmdname, $endif) = @{$entry}; - - if ($ifdef) { - print ("#ifdef " . $ifdef . "\n"); - } - - if ($cmdname) { - print " install_element (" . $node_name . "_NODE, &" . $cmdname . ");\n"; - } - - if ($endif) { - print ("#endif /* " . $endif . " */\n"); - } - } - } -} - -# parse command-line arguments -if (not getopts('d')) { - die("Usage: xml2cli.pl [-d] FILE\n"); -} -my $file = shift; - -# initialize the XML parser -my $parser = new XML::LibXML; -$parser->keep_blanks(0); - -# parse XML file -$::xml = $parser->parse_file($file); -my $xmlroot = $::xml->getDocumentElement(); -if ($xmlroot->getName() ne "file") { - die('XML root element name must be "file"'); -} - -# read file attributes -my $init_function = $xmlroot->findvalue('./@init'); -if (not $init_function) { - die('missing the "init" attribute in the "file" node'); -} -$::cmdprefix = $xmlroot->findvalue('./@cmdprefix'); -if (not $::cmdprefix) { - die('missing the "cmdprefix" attribute in the "file" node'); -} -my $header = $xmlroot->findvalue('./@header'); -if (not $header) { - die('missing the "header" attribute in the "file" node'); -} - -# generate source header -print STDOUT "/* Auto-generated from " . fileparse($file) . ". */\n" - . "/* Do not edit! */\n\n" - . "#include \n\n" - . "#include \"command.h\"\n" - . "#include \"vty.h\"\n" - . "#include \"$header\"\n\n"; - -# Parse options -foreach my $options($::xml->findnodes("/file/options")) { - parse_options($options); -} - -# replace include nodes by the corresponding subtrees -foreach my $subtree(reverse $::xml->findnodes("/file/subtree")) { - subtree_replace_includes($subtree); -} - -# Parse trees -foreach my $tree($::xml->findnodes("/file/tree")) { - my @nodes = (); - my $tree_name = $tree->findvalue('./@name'); - parse_tree($tree, \@nodes, $tree_name); -} - -# install function header -print STDOUT "void\n" - . $init_function . " (void)\n" - . "{\n"; - -# Parse nodes -foreach my $node($::xml->findnodes("/file/node")) { - parse_node($node); -} - -# closing braces for the install function -print STDOUT "}"; - -# print to stderr the expanded XML file if the debug flag (-d) is given -if ($opt_d) { - print STDERR $::xml->toString(1); -} diff --git a/vtysh/Makefile.am b/vtysh/Makefile.am index 587f72c809..8b66ba2564 100644 --- a/vtysh/Makefile.am +++ b/vtysh/Makefile.am @@ -108,6 +108,10 @@ vtysh_scan += $(top_srcdir)/ripngd/ripng_zebra.c vtysh_scan += $(top_srcdir)/ripngd/ripngd.c endif +if LDPD +vtysh_scan += $(top_srcdir)/ldpd/ldp_vty_cmds.c +endif + if NHRPD vtysh_scan += $(top_srcdir)/nhrpd/nhrp_vty.c endif @@ -146,22 +150,5 @@ vtysh_cmd_FILES = $(vtysh_scan) \ $(top_srcdir)/watchfrr/watchfrr_vty.c \ $(BGP_VNC_RFAPI_SRC) $(BGP_VNC_RFP_SRC) -# this is slightly iffy... ldp_vty_cmds.c can be located in either -# $srcdir or $builddir depending on whether it's coming pre-built from a -# dist tarball or being built. automake uses VPATH to find it, but that -# doesn't work here... -# so after running "make ldp_vty_cmds.c", the file can be in either of the -# two directories. we need to do some magic to find out which. -vtysh_cmd_DEPS = $(vtysh_cmd_FILES) -if LDPD -$(top_builddir)/ldpd/ldp_vty_cmds.c: - make -C "$(top_builddir)/ldpd" ldp_vty_cmds.c -vtysh_cmd_DEPS += $(top_builddir)/ldpd/ldp_vty_cmds.c -endif - -vtysh_cmd.c: $(vtysh_cmd_DEPS) extract.pl - if test -n "${LDPD}"; then \ - ldpcmds="$(top_srcdir)/ldpd/ldp_vty_cmds.c"; \ - test -f "$(top_builddir)/ldpd/ldp_vty_cmds.c" && ldpcmds="$(top_builddir)/ldpd/ldp_vty_cmds.c"; \ - fi; \ - ./extract.pl $(vtysh_cmd_FILES) $${ldpcmds} > vtysh_cmd.c +vtysh_cmd.c: $(vtysh_cmd_FILES) extract.pl + ./extract.pl $(vtysh_cmd_FILES) > vtysh_cmd.c