Initial revision
diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c
new file mode 100644
index 0000000..c1bae93
--- /dev/null
+++ b/bgpd/bgp_vty.c
@@ -0,0 +1,9416 @@
+/* BGP VTY interface.
+ Copyright (C) 1996, 97, 98, 99, 2000 Kunihiro Ishiguro
+
+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. */
+
+#include <zebra.h>
+
+#include "command.h"
+#include "prefix.h"
+#include "plist.h"
+#include "buffer.h"
+#include "linklist.h"
+#include "stream.h"
+#include "thread.h"
+#include "log.h"
+
+#include "bgpd/bgpd.h"
+#include "bgpd/bgp_attr.h"
+#include "bgpd/bgp_aspath.h"
+#include "bgpd/bgp_community.h"
+#include "bgpd/bgp_debug.h"
+#include "bgpd/bgp_mplsvpn.h"
+#include "bgpd/bgp_open.h"
+#include "bgpd/bgp_route.h"
+#include "bgpd/bgp_zebra.h"
+
+/* Utility function to get address family from current node. */
+afi_t
+bgp_node_afi (struct vty *vty)
+{
+ if (vty->node == BGP_IPV6_NODE)
+ return AFI_IP6;
+ return AFI_IP;
+}
+
+/* Utility function to get subsequent address family from current
+ node. */
+safi_t
+bgp_node_safi (struct vty *vty)
+{
+ if (vty->node == BGP_VPNV4_NODE)
+ return SAFI_MPLS_VPN;
+ if (vty->node == BGP_IPV4M_NODE)
+ return SAFI_MULTICAST;
+ return SAFI_UNICAST;
+}
+
+int
+peer_address_self_check (union sockunion *su)
+{
+ struct interface *ifp = NULL;
+
+ if (su->sa.sa_family == AF_INET)
+ ifp = if_lookup_by_ipv4_exact (&su->sin.sin_addr);
+#ifdef HAVE_IPV6
+ else if (su->sa.sa_family == AF_INET6)
+ ifp = if_lookup_by_ipv6_exact (&su->sin6.sin6_addr);
+#endif /* HAVE IPV6 */
+
+ if (ifp)
+ return 1;
+
+ return 0;
+}
+
+/* Utility function for looking up peer from VTY. */
+struct peer *
+peer_lookup_vty (struct vty *vty, char *ip_str)
+{
+ int ret;
+ struct bgp *bgp;
+ union sockunion su;
+ struct peer *peer;
+
+ bgp = vty->index;
+
+ ret = str2sockunion (ip_str, &su);
+ if (ret < 0)
+ {
+ vty_out (vty, "%% Malformed address: %s%s", ip_str, VTY_NEWLINE);
+ return NULL;
+ }
+
+ peer = peer_lookup (bgp, &su);
+ if (! peer)
+ {
+ vty_out (vty, "%% Specify remote-as or peer-group commands first%s", VTY_NEWLINE);
+ return NULL;
+ }
+ return peer;
+}
+
+/* Utility function for looking up peer or peer group. */
+struct peer *
+peer_and_group_lookup_vty (struct vty *vty, char *peer_str)
+{
+ int ret;
+ struct bgp *bgp;
+ union sockunion su;
+ struct peer *peer;
+ struct peer_group *group;
+
+ bgp = vty->index;
+
+ ret = str2sockunion (peer_str, &su);
+ if (ret == 0)
+ {
+ peer = peer_lookup (bgp, &su);
+ if (peer)
+ return peer;
+ }
+ else
+ {
+ group = peer_group_lookup (bgp, peer_str);
+ if (group)
+ return group->conf;
+ }
+
+ vty_out (vty, "%% Specify remote-as or peer-group commands first%s",
+ VTY_NEWLINE);
+
+ return NULL;
+}
+
+int
+bgp_vty_return (struct vty *vty, int ret)
+{
+ char *str = NULL;
+
+ switch (ret)
+ {
+ case BGP_ERR_INVALID_VALUE:
+ str = "Invalid value";
+ break;
+ case BGP_ERR_INVALID_FLAG:
+ str = "Invalid flag";
+ break;
+ case BGP_ERR_PEER_INACTIVE:
+ str = "Activate the neighbor for the address family first";
+ break;
+ case BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER:
+ str = "Invalid command for a peer-group member";
+ break;
+ case BGP_ERR_PEER_GROUP_SHUTDOWN:
+ str = "Peer-group has been shutdown. Activate the peer-group first";
+ break;
+ case BGP_ERR_PEER_GROUP_HAS_THE_FLAG:
+ str = "This peer is a peer-group member. Please change peer-group configuration";
+ break;
+ case BGP_ERR_PEER_FLAG_CONFLICT:
+ str = "Can't set override-capability and strict-capability-match at the same time";
+ break;
+ case BGP_ERR_PEER_GROUP_MEMBER_EXISTS:
+ str = "No activate for peergroup can be given only if peer-group has no members";
+ break;
+ case BGP_ERR_PEER_BELONGS_TO_GROUP:
+ str = "No activate for an individual peer-group member is invalid";
+ break;
+ case BGP_ERR_PEER_GROUP_AF_UNCONFIGURED:
+ str = "Activate the peer-group for the address family first";
+ break;
+ case BGP_ERR_PEER_GROUP_NO_REMOTE_AS:
+ str = "Specify remote-as or peer-group remote AS first";
+ break;
+ case BGP_ERR_PEER_GROUP_CANT_CHANGE:
+ str = "Cannot change the peer-group. Deconfigure first";
+ break;
+ case BGP_ERR_PEER_GROUP_MISMATCH:
+ str = "Cannot have different peer-group for the neighbor";
+ break;
+ case BGP_ERR_PEER_FILTER_CONFLICT:
+ str = "Prefix/distribute list can not co-exist";
+ break;
+ case BGP_ERR_NOT_INTERNAL_PEER:
+ str = "Invalid command. Not an internal neighbor";
+ break;
+ case BGP_ERR_REMOVE_PRIVATE_AS:
+ str = "Private AS cannot be removed for IBGP peers";
+ break;
+ case BGP_ERR_LOCAL_AS_ALLOWED_ONLY_FOR_EBGP:
+ str = "Local-AS allowed only for EBGP peers";
+ break;
+ case BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS:
+ str = "Cannot have local-as same as BGP AS number";
+ break;
+ }
+ if (str)
+ {
+ vty_out (vty, "%% %s%s", str, VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+ return CMD_SUCCESS;
+}
+
+/* BGP global configuration. */
+
+DEFUN (bgp_multiple_instance_func,
+ bgp_multiple_instance_cmd,
+ "bgp multiple-instance",
+ BGP_STR
+ "Enable bgp multiple instance\n")
+{
+ bgp_option_set (BGP_OPT_MULTIPLE_INSTANCE);
+ return CMD_SUCCESS;
+}
+
+DEFUN (no_bgp_multiple_instance,
+ no_bgp_multiple_instance_cmd,
+ "no bgp multiple-instance",
+ NO_STR
+ BGP_STR
+ "BGP multiple instance\n")
+{
+ int ret;
+
+ ret = bgp_option_unset (BGP_OPT_MULTIPLE_INSTANCE);
+ if (ret < 0)
+ {
+ vty_out (vty, "%% There are more than two BGP instances%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+ return CMD_SUCCESS;
+}
+
+DEFUN (bgp_config_type,
+ bgp_config_type_cmd,
+ "bgp config-type (cisco|zebra)",
+ BGP_STR
+ "Configuration type\n"
+ "cisco\n"
+ "zebra\n")
+{
+ if (strncmp (argv[0], "c", 1) == 0)
+ bgp_option_set (BGP_OPT_CONFIG_CISCO);
+ else
+ bgp_option_unset (BGP_OPT_CONFIG_CISCO);
+
+ return CMD_SUCCESS;
+}
+
+DEFUN (no_bgp_config_type,
+ no_bgp_config_type_cmd,
+ "no bgp config-type",
+ NO_STR
+ BGP_STR
+ "Display configuration type\n")
+{
+ bgp_option_unset (BGP_OPT_CONFIG_CISCO);
+ return CMD_SUCCESS;
+}
+
+DEFUN (no_synchronization,
+ no_synchronization_cmd,
+ "no synchronization",
+ NO_STR
+ "Perform IGP synchronization\n")
+{
+ return CMD_SUCCESS;
+}
+
+DEFUN (no_auto_summary,
+ no_auto_summary_cmd,
+ "no auto-summary",
+ NO_STR
+ "Enable automatic network number summarization\n")
+{
+ return CMD_SUCCESS;
+}
+
+/* "router bgp" commands. */
+DEFUN (router_bgp,
+ router_bgp_cmd,
+ "router bgp <1-65535>",
+ ROUTER_STR
+ BGP_STR
+ AS_STR)
+{
+ int ret;
+ as_t as;
+ struct bgp *bgp;
+ char *name = NULL;
+
+ VTY_GET_INTEGER_RANGE ("AS", as, argv[0], 1, 65535);
+
+ if (argc == 2)
+ name = argv[1];
+
+ ret = bgp_get (&bgp, &as, name);
+ switch (ret)
+ {
+ case BGP_ERR_MULTIPLE_INSTANCE_NOT_SET:
+ vty_out (vty, "Please specify 'bgp multiple-instance' first%s",
+ VTY_NEWLINE);
+ return CMD_WARNING;
+ break;
+ case BGP_ERR_AS_MISMATCH:
+ vty_out (vty, "BGP is already running; AS is %d%s", as, VTY_NEWLINE);
+ return CMD_WARNING;
+ break;
+ case BGP_ERR_INSTANCE_MISMATCH:
+ vty_out (vty, "BGP view name and AS number mismatch%s", VTY_NEWLINE);
+ vty_out (vty, "BGP instance is already running; AS is %d%s",
+ as, VTY_NEWLINE);
+ return CMD_WARNING;
+ break;
+ }
+
+ vty->node = BGP_NODE;
+ vty->index = bgp;
+
+ return CMD_SUCCESS;
+}
+
+ALIAS (router_bgp,
+ router_bgp_view_cmd,
+ "router bgp <1-65535> view WORD",
+ ROUTER_STR
+ BGP_STR
+ AS_STR
+ "BGP view\n"
+ "view name\n")
+
+/* "no router bgp" commands. */
+DEFUN (no_router_bgp,
+ no_router_bgp_cmd,
+ "no router bgp <1-65535>",
+ NO_STR
+ ROUTER_STR
+ BGP_STR
+ AS_STR)
+{
+ as_t as;
+ struct bgp *bgp;
+ char *name = NULL;
+
+ VTY_GET_INTEGER_RANGE ("AS", as, argv[0], 1, 65535);
+
+ if (argc == 2)
+ name = argv[1];
+
+ /* Lookup bgp structure. */
+ bgp = bgp_lookup (as, name);
+ if (! bgp)
+ {
+ vty_out (vty, "%% Can't find BGP instance%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ bgp_delete (bgp);
+
+ return CMD_SUCCESS;
+}
+
+ALIAS (no_router_bgp,
+ no_router_bgp_view_cmd,
+ "no router bgp <1-65535> view WORD",
+ NO_STR
+ ROUTER_STR
+ BGP_STR
+ AS_STR
+ "BGP view\n"
+ "view name\n")
+
+/* BGP router-id. */
+
+DEFUN (bgp_router_id,
+ bgp_router_id_cmd,
+ "bgp router-id A.B.C.D",
+ BGP_STR
+ "Override configured router identifier\n"
+ "Manually configured router identifier\n")
+{
+ int ret;
+ struct in_addr id;
+ struct bgp *bgp;
+
+ bgp = vty->index;
+
+ ret = inet_aton (argv[0], &id);
+ if (! ret)
+ {
+ vty_out (vty, "%% Malformed bgp router identifier%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ bgp_router_id_set (bgp, &id);
+
+ return CMD_SUCCESS;
+}
+
+DEFUN (no_bgp_router_id,
+ no_bgp_router_id_cmd,
+ "no bgp router-id",
+ NO_STR
+ BGP_STR
+ "Override configured router identifier\n")
+{
+ int ret;
+ struct in_addr id;
+ struct bgp *bgp;
+
+ bgp = vty->index;
+
+ if (argc == 1)
+ {
+ ret = inet_aton (argv[0], &id);
+ if (! ret)
+ {
+ vty_out (vty, "%% Malformed BGP router identifier%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ if (! IPV4_ADDR_SAME (&bgp->router_id, &id))
+ {
+ vty_out (vty, "%% BGP router-id doesn't match%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+ }
+
+ bgp_router_id_unset (bgp);
+
+ return CMD_SUCCESS;
+}
+
+ALIAS (no_bgp_router_id,
+ no_bgp_router_id_val_cmd,
+ "no bgp router-id A.B.C.D",
+ NO_STR
+ BGP_STR
+ "Override configured router identifier\n"
+ "Manually configured router identifier\n")
+
+/* BGP Cluster ID. */
+
+DEFUN (bgp_cluster_id,
+ bgp_cluster_id_cmd,
+ "bgp cluster-id A.B.C.D",
+ BGP_STR
+ "Configure Route-Reflector Cluster-id\n"
+ "Route-Reflector Cluster-id in IP address format\n")
+{
+ int ret;
+ struct bgp *bgp;
+ struct in_addr cluster;
+
+ bgp = vty->index;
+
+ ret = inet_aton (argv[0], &cluster);
+ if (! ret)
+ {
+ vty_out (vty, "%% Malformed bgp cluster identifier%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ bgp_cluster_id_set (bgp, &cluster);
+
+ return CMD_SUCCESS;
+}
+
+ALIAS (bgp_cluster_id,
+ bgp_cluster_id32_cmd,
+ "bgp cluster-id <1-4294967295>",
+ BGP_STR
+ "Configure Route-Reflector Cluster-id\n"
+ "Route-Reflector Cluster-id as 32 bit quantity\n")
+
+DEFUN (no_bgp_cluster_id,
+ no_bgp_cluster_id_cmd,
+ "no bgp cluster-id",
+ NO_STR
+ BGP_STR
+ "Configure Route-Reflector Cluster-id\n")
+{
+ int ret;
+ struct bgp *bgp;
+ struct in_addr cluster;
+
+ bgp = vty->index;
+
+ if (argc == 1)
+ {
+ ret = inet_aton (argv[0], &cluster);
+ if (! ret)
+ {
+ vty_out (vty, "%% Malformed bgp cluster identifier%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+ }
+
+ bgp_cluster_id_unset (bgp);
+
+ return CMD_SUCCESS;
+}
+
+ALIAS (no_bgp_cluster_id,
+ no_bgp_cluster_id_arg_cmd,
+ "no bgp cluster-id A.B.C.D",
+ NO_STR
+ BGP_STR
+ "Configure Route-Reflector Cluster-id\n"
+ "Route-Reflector Cluster-id in IP address format\n")
+
+DEFUN (bgp_confederation_identifier,
+ bgp_confederation_identifier_cmd,
+ "bgp confederation identifier <1-65535>",
+ "BGP specific commands\n"
+ "AS confederation parameters\n"
+ "AS number\n"
+ "Set routing domain confederation AS\n")
+{
+ struct bgp *bgp;
+ as_t as;
+
+ bgp = vty->index;
+
+ VTY_GET_INTEGER ("AS", as, argv[0]);
+
+ bgp_confederation_id_set (bgp, as);
+
+ return CMD_SUCCESS;
+}
+
+DEFUN (no_bgp_confederation_identifier,
+ no_bgp_confederation_identifier_cmd,
+ "no bgp confederation identifier",
+ NO_STR
+ "BGP specific commands\n"
+ "AS confederation parameters\n"
+ "AS number\n")
+{
+ struct bgp *bgp;
+ as_t as;
+
+ bgp = vty->index;
+
+ if (argc == 1)
+ VTY_GET_INTEGER ("AS", as, argv[0]);
+
+ bgp_confederation_id_unset (bgp);
+
+ return CMD_SUCCESS;
+}
+
+ALIAS (no_bgp_confederation_identifier,
+ no_bgp_confederation_identifier_arg_cmd,
+ "no bgp confederation identifier <1-65535>",
+ NO_STR
+ "BGP specific commands\n"
+ "AS confederation parameters\n"
+ "AS number\n"
+ "Set routing domain confederation AS\n")
+
+DEFUN (bgp_confederation_peers,
+ bgp_confederation_peers_cmd,
+ "bgp confederation peers .<1-65535>",
+ "BGP specific commands\n"
+ "AS confederation parameters\n"
+ "Peer ASs in BGP confederation\n"
+ AS_STR)
+{
+ struct bgp *bgp;
+ as_t as;
+ int i;
+
+ bgp = vty->index;
+
+ for (i = 0; i < argc; i++)
+ {
+ VTY_GET_INTEGER_RANGE ("AS", as, argv[i], 1, 65535);
+
+ if (bgp->as == as)
+ {
+ vty_out (vty, "%% Local member-AS not allowed in confed peer list%s",
+ VTY_NEWLINE);
+ continue;
+ }
+
+ bgp_confederation_peers_add (bgp, as);
+ }
+ return CMD_SUCCESS;
+}
+
+DEFUN (no_bgp_confederation_peers,
+ no_bgp_confederation_peers_cmd,
+ "no bgp confederation peers .<1-65535>",
+ NO_STR
+ "BGP specific commands\n"
+ "AS confederation parameters\n"
+ "Peer ASs in BGP confederation\n"
+ AS_STR)
+{
+ struct bgp *bgp;
+ as_t as;
+ int i;
+
+ bgp = vty->index;
+
+ for (i = 0; i < argc; i++)
+ {
+ VTY_GET_INTEGER_RANGE ("AS", as, argv[i], 1, 65535);
+
+ bgp_confederation_peers_remove (bgp, as);
+ }
+ return CMD_SUCCESS;
+}
+
+/* BGP timers. */
+
+DEFUN (bgp_timers,
+ bgp_timers_cmd,
+ "timers bgp <0-65535> <0-65535>",
+ "Adjust routing timers\n"
+ "BGP timers\n"
+ "Keepalive interval\n"
+ "Holdtime\n")
+{
+ struct bgp *bgp;
+ unsigned long keepalive = 0;
+ unsigned long holdtime = 0;
+
+ bgp = vty->index;
+
+ VTY_GET_INTEGER ("keepalive", keepalive, argv[0]);
+ VTY_GET_INTEGER ("holdtime", holdtime, argv[1]);
+
+ /* Holdtime value check. */
+ if (holdtime < 3 && holdtime != 0)
+ {
+ vty_out (vty, "%% hold time value must be either 0 or greater than 3%s",
+ VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ bgp_timers_set (bgp, keepalive, holdtime);
+
+ return CMD_SUCCESS;
+}
+
+DEFUN (no_bgp_timers,
+ no_bgp_timers_cmd,
+ "no timers bgp",
+ NO_STR
+ "Adjust routing timers\n"
+ "BGP timers\n")
+{
+ struct bgp *bgp;
+
+ bgp = vty->index;
+ bgp_timers_unset (bgp);
+
+ return CMD_SUCCESS;
+}
+
+ALIAS (no_bgp_timers,
+ no_bgp_timers_arg_cmd,
+ "no timers bgp <0-65535> <0-65535>",
+ NO_STR
+ "Adjust routing timers\n"
+ "BGP timers\n"
+ "Keepalive interval\n"
+ "Holdtime\n")
+
+DEFUN (bgp_client_to_client_reflection,
+ bgp_client_to_client_reflection_cmd,
+ "bgp client-to-client reflection",
+ "BGP specific commands\n"
+ "Configure client to client route reflection\n"
+ "reflection of routes allowed\n")
+{
+ struct bgp *bgp;
+
+ bgp = vty->index;
+ bgp_flag_unset (bgp, BGP_FLAG_NO_CLIENT_TO_CLIENT);
+ return CMD_SUCCESS;
+}
+
+DEFUN (no_bgp_client_to_client_reflection,
+ no_bgp_client_to_client_reflection_cmd,
+ "no bgp client-to-client reflection",
+ NO_STR
+ "BGP specific commands\n"
+ "Configure client to client route reflection\n"
+ "reflection of routes allowed\n")
+{
+ struct bgp *bgp;
+
+ bgp = vty->index;
+ bgp_flag_set (bgp, BGP_FLAG_NO_CLIENT_TO_CLIENT);
+ return CMD_SUCCESS;
+}
+
+/* "bgp always-compare-med" configuration. */
+DEFUN (bgp_always_compare_med,
+ bgp_always_compare_med_cmd,
+ "bgp always-compare-med",
+ "BGP specific commands\n"
+ "Allow comparing MED from different neighbors\n")
+{
+ struct bgp *bgp;
+
+ bgp = vty->index;
+ bgp_flag_set (bgp, BGP_FLAG_ALWAYS_COMPARE_MED);
+ return CMD_SUCCESS;
+}
+
+DEFUN (no_bgp_always_compare_med,
+ no_bgp_always_compare_med_cmd,
+ "no bgp always-compare-med",
+ NO_STR
+ "BGP specific commands\n"
+ "Allow comparing MED from different neighbors\n")
+{
+ struct bgp *bgp;
+
+ bgp = vty->index;
+ bgp_flag_unset (bgp, BGP_FLAG_ALWAYS_COMPARE_MED);
+ return CMD_SUCCESS;
+}
+
+/* "bgp deterministic-med" configuration. */
+DEFUN (bgp_deterministic_med,
+ bgp_deterministic_med_cmd,
+ "bgp deterministic-med",
+ "BGP specific commands\n"
+ "Pick the best-MED path among paths advertised from the neighboring AS\n")
+{
+ struct bgp *bgp;
+
+ bgp = vty->index;
+ bgp_flag_set (bgp, BGP_FLAG_DETERMINISTIC_MED);
+ return CMD_SUCCESS;
+}
+
+DEFUN (no_bgp_deterministic_med,
+ no_bgp_deterministic_med_cmd,
+ "no bgp deterministic-med",
+ NO_STR
+ "BGP specific commands\n"
+ "Pick the best-MED path among paths advertised from the neighboring AS\n")
+{
+ struct bgp *bgp;
+
+ bgp = vty->index;
+ bgp_flag_unset (bgp, BGP_FLAG_DETERMINISTIC_MED);
+ return CMD_SUCCESS;
+}
+
+/* "bgp fast-external-failover" configuration. */
+DEFUN (bgp_fast_external_failover,
+ bgp_fast_external_failover_cmd,
+ "bgp fast-external-failover",
+ BGP_STR
+ "Immediately reset session if a link to a directly connected external peer goes down\n")
+{
+ struct bgp *bgp;
+
+ bgp = vty->index;
+ bgp_flag_unset (bgp, BGP_FLAG_NO_FAST_EXT_FAILOVER);
+ return CMD_SUCCESS;
+}
+
+DEFUN (no_bgp_fast_external_failover,
+ no_bgp_fast_external_failover_cmd,
+ "no bgp fast-external-failover",
+ NO_STR
+ BGP_STR
+ "Immediately reset session if a link to a directly connected external peer goes down\n")
+{
+ struct bgp *bgp;
+
+ bgp = vty->index;
+ bgp_flag_set (bgp, BGP_FLAG_NO_FAST_EXT_FAILOVER);
+ return CMD_SUCCESS;
+}
+
+/* "bgp enforce-first-as" configuration. */
+DEFUN (bgp_enforce_first_as,
+ bgp_enforce_first_as_cmd,
+ "bgp enforce-first-as",
+ BGP_STR
+ "Enforce the first AS for EBGP routes\n")
+{
+ struct bgp *bgp;
+
+ bgp = vty->index;
+ bgp_flag_set (bgp, BGP_FLAG_ENFORCE_FIRST_AS);
+ return CMD_SUCCESS;
+}
+
+DEFUN (no_bgp_enforce_first_as,
+ no_bgp_enforce_first_as_cmd,
+ "no bgp enforce-first-as",
+ NO_STR
+ BGP_STR
+ "Enforce the first AS for EBGP routes\n")
+{
+ struct bgp *bgp;
+
+ bgp = vty->index;
+ bgp_flag_unset (bgp, BGP_FLAG_ENFORCE_FIRST_AS);
+ return CMD_SUCCESS;
+}
+
+/* "bgp bestpath compare-routerid" configuration. */
+DEFUN (bgp_bestpath_compare_router_id,
+ bgp_bestpath_compare_router_id_cmd,
+ "bgp bestpath compare-routerid",
+ "BGP specific commands\n"
+ "Change the default bestpath selection\n"
+ "Compare router-id for identical EBGP paths\n")
+{
+ struct bgp *bgp;
+
+ bgp = vty->index;
+ bgp_flag_set (bgp, BGP_FLAG_COMPARE_ROUTER_ID);
+ return CMD_SUCCESS;
+}
+
+DEFUN (no_bgp_bestpath_compare_router_id,
+ no_bgp_bestpath_compare_router_id_cmd,
+ "no bgp bestpath compare-routerid",
+ NO_STR
+ "BGP specific commands\n"
+ "Change the default bestpath selection\n"
+ "Compare router-id for identical EBGP paths\n")
+{
+ struct bgp *bgp;
+
+ bgp = vty->index;
+ bgp_flag_unset (bgp, BGP_FLAG_COMPARE_ROUTER_ID);
+ return CMD_SUCCESS;
+}
+
+/* "bgp bestpath as-path ignore" configuration. */
+DEFUN (bgp_bestpath_aspath_ignore,
+ bgp_bestpath_aspath_ignore_cmd,
+ "bgp bestpath as-path ignore",
+ "BGP specific commands\n"
+ "Change the default bestpath selection\n"
+ "AS-path attribute\n"
+ "Ignore as-path length in selecting a route\n")
+{
+ struct bgp *bgp;
+
+ bgp = vty->index;
+ bgp_flag_set (bgp, BGP_FLAG_ASPATH_IGNORE);
+ return CMD_SUCCESS;
+}
+
+DEFUN (no_bgp_bestpath_aspath_ignore,
+ no_bgp_bestpath_aspath_ignore_cmd,
+ "no bgp bestpath as-path ignore",
+ NO_STR
+ "BGP specific commands\n"
+ "Change the default bestpath selection\n"
+ "AS-path attribute\n"
+ "Ignore as-path length in selecting a route\n")
+{
+ struct bgp *bgp;
+
+ bgp = vty->index;
+ bgp_flag_unset (bgp, BGP_FLAG_ASPATH_IGNORE);
+ return CMD_SUCCESS;
+}
+
+/* "bgp bestpath med" configuration. */
+DEFUN (bgp_bestpath_med,
+ bgp_bestpath_med_cmd,
+ "bgp bestpath med (confed|missing-as-worst)",
+ "BGP specific commands\n"
+ "Change the default bestpath selection\n"
+ "MED attribute\n"
+ "Compare MED among confederation paths\n"
+ "Treat missing MED as the least preferred one\n")
+{
+ struct bgp *bgp;
+
+ bgp = vty->index;
+
+ if (strncmp (argv[0], "confed", 1) == 0)
+ bgp_flag_set (bgp, BGP_FLAG_MED_CONFED);
+ else
+ bgp_flag_set (bgp, BGP_FLAG_MED_MISSING_AS_WORST);
+
+ return CMD_SUCCESS;
+}
+
+DEFUN (bgp_bestpath_med2,
+ bgp_bestpath_med2_cmd,
+ "bgp bestpath med confed missing-as-worst",
+ "BGP specific commands\n"
+ "Change the default bestpath selection\n"
+ "MED attribute\n"
+ "Compare MED among confederation paths\n"
+ "Treat missing MED as the least preferred one\n")
+{
+ struct bgp *bgp;
+
+ bgp = vty->index;
+ bgp_flag_set (bgp, BGP_FLAG_MED_CONFED);
+ bgp_flag_set (bgp, BGP_FLAG_MED_MISSING_AS_WORST);
+ return CMD_SUCCESS;
+}
+
+ALIAS (bgp_bestpath_med2,
+ bgp_bestpath_med3_cmd,
+ "bgp bestpath med missing-as-worst confed",
+ "BGP specific commands\n"
+ "Change the default bestpath selection\n"
+ "MED attribute\n"
+ "Treat missing MED as the least preferred one\n"
+ "Compare MED among confederation paths\n")
+
+DEFUN (no_bgp_bestpath_med,
+ no_bgp_bestpath_med_cmd,
+ "no bgp bestpath med (confed|missing-as-worst)",
+ NO_STR
+ "BGP specific commands\n"
+ "Change the default bestpath selection\n"
+ "MED attribute\n"
+ "Compare MED among confederation paths\n"
+ "Treat missing MED as the least preferred one\n")
+{
+ struct bgp *bgp;
+
+ bgp = vty->index;
+
+ if (strncmp (argv[0], "confed", 1) == 0)
+ bgp_flag_unset (bgp, BGP_FLAG_MED_CONFED);
+ else
+ bgp_flag_unset (bgp, BGP_FLAG_MED_MISSING_AS_WORST);
+
+ return CMD_SUCCESS;
+}
+
+DEFUN (no_bgp_bestpath_med2,
+ no_bgp_bestpath_med2_cmd,
+ "no bgp bestpath med confed missing-as-worst",
+ NO_STR
+ "BGP specific commands\n"
+ "Change the default bestpath selection\n"
+ "MED attribute\n"
+ "Compare MED among confederation paths\n"
+ "Treat missing MED as the least preferred one\n")
+{
+ struct bgp *bgp;
+
+ bgp = vty->index;
+ bgp_flag_unset (bgp, BGP_FLAG_MED_CONFED);
+ bgp_flag_unset (bgp, BGP_FLAG_MED_MISSING_AS_WORST);
+ return CMD_SUCCESS;
+}
+
+ALIAS (no_bgp_bestpath_med2,
+ no_bgp_bestpath_med3_cmd,
+ "no bgp bestpath med missing-as-worst confed",
+ NO_STR
+ "BGP specific commands\n"
+ "Change the default bestpath selection\n"
+ "MED attribute\n"
+ "Treat missing MED as the least preferred one\n"
+ "Compare MED among confederation paths\n")
+
+/* "no bgp default ipv4-unicast". */
+DEFUN (no_bgp_default_ipv4_unicast,
+ no_bgp_default_ipv4_unicast_cmd,
+ "no bgp default ipv4-unicast",
+ NO_STR
+ "BGP specific commands\n"
+ "Configure BGP defaults\n"
+ "Activate ipv4-unicast for a peer by default\n")
+{
+ struct bgp *bgp;
+
+ bgp = vty->index;
+ bgp_flag_set (bgp, BGP_FLAG_NO_DEFAULT_IPV4);
+ return CMD_SUCCESS;
+}
+
+DEFUN (bgp_default_ipv4_unicast,
+ bgp_default_ipv4_unicast_cmd,
+ "bgp default ipv4-unicast",
+ "BGP specific commands\n"
+ "Configure BGP defaults\n"
+ "Activate ipv4-unicast for a peer by default\n")
+{
+ struct bgp *bgp;
+
+ bgp = vty->index;
+ bgp_flag_unset (bgp, BGP_FLAG_NO_DEFAULT_IPV4);
+ return CMD_SUCCESS;
+}
+
+/* "bgp import-check" configuration. */
+DEFUN (bgp_network_import_check,
+ bgp_network_import_check_cmd,
+ "bgp network import-check",
+ "BGP specific commands\n"
+ "BGP network command\n"
+ "Check BGP network route exists in IGP\n")
+{
+ struct bgp *bgp;
+
+ bgp = vty->index;
+ bgp_flag_set (bgp, BGP_FLAG_IMPORT_CHECK);
+ return CMD_SUCCESS;
+}
+
+DEFUN (no_bgp_network_import_check,
+ no_bgp_network_import_check_cmd,
+ "no bgp network import-check",
+ NO_STR
+ "BGP specific commands\n"
+ "BGP network command\n"
+ "Check BGP network route exists in IGP\n")
+{
+ struct bgp *bgp;
+
+ bgp = vty->index;
+ bgp_flag_unset (bgp, BGP_FLAG_IMPORT_CHECK);
+ return CMD_SUCCESS;
+}
+
+DEFUN (bgp_default_local_preference,
+ bgp_default_local_preference_cmd,
+ "bgp default local-preference <0-4294967295>",
+ "BGP specific commands\n"
+ "Configure BGP defaults\n"
+ "local preference (higher=more preferred)\n"
+ "Configure default local preference value\n")
+{
+ struct bgp *bgp;
+ u_int32_t local_pref;
+
+ bgp = vty->index;
+
+ VTY_GET_INTEGER ("local preference", local_pref, argv[0]);
+
+ bgp_default_local_preference_set (bgp, local_pref);
+
+ return CMD_SUCCESS;
+}
+
+DEFUN (no_bgp_default_local_preference,
+ no_bgp_default_local_preference_cmd,
+ "no bgp default local-preference",
+ NO_STR
+ "BGP specific commands\n"
+ "Configure BGP defaults\n"
+ "local preference (higher=more preferred)\n")
+{
+ struct bgp *bgp;
+
+ bgp = vty->index;
+ bgp_default_local_preference_unset (bgp);
+ return CMD_SUCCESS;
+}
+
+ALIAS (no_bgp_default_local_preference,
+ no_bgp_default_local_preference_val_cmd,
+ "no bgp default local-preference <0-4294967295>",
+ NO_STR
+ "BGP specific commands\n"
+ "Configure BGP defaults\n"
+ "local preference (higher=more preferred)\n"
+ "Configure default local preference value\n")
+
+static int
+peer_remote_as_vty (struct vty *vty, char *peer_str, char *as_str, afi_t afi,
+ safi_t safi)
+{
+ int ret;
+ struct bgp *bgp;
+ as_t as;
+ union sockunion su;
+
+ bgp = vty->index;
+
+ /* Get AS number. */
+ VTY_GET_INTEGER_RANGE ("AS", as, as_str, 1, 65535);
+
+ /* If peer is peer group, call proper function. */
+ ret = str2sockunion (peer_str, &su);
+ if (ret < 0)
+ {
+ ret = peer_group_remote_as (bgp, peer_str, &as);
+ if (ret < 0)
+ {
+ vty_out (vty, "%% Create the peer-group first%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+ return CMD_SUCCESS;
+ }
+
+ if (peer_address_self_check (&su))
+ {
+ vty_out (vty, "%% Can not configure the local system as neighbor%s",
+ VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ ret = peer_remote_as (bgp, &su, &as, afi, safi);
+
+ /* This peer belongs to peer group. */
+ switch (ret)
+ {
+ case BGP_ERR_PEER_GROUP_MEMBER:
+ vty_out (vty, "%% Peer-group AS %d. Cannot configure remote-as for member%s", as, VTY_NEWLINE);
+ return CMD_WARNING;
+ break;
+ case BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT:
+ vty_out (vty, "%% The AS# can not be changed from %d to %s, peer-group members must be all internal or all external%s", as, as_str, VTY_NEWLINE);
+ return CMD_WARNING;
+ break;
+ }
+ return bgp_vty_return (vty, ret);
+}
+
+DEFUN (neighbor_remote_as,
+ neighbor_remote_as_cmd,
+ NEIGHBOR_CMD2 "remote-as <1-65535>",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Specify a BGP neighbor\n"
+ AS_STR)
+{
+ return peer_remote_as_vty (vty, argv[0], argv[1], AFI_IP, SAFI_UNICAST);
+}
+
+DEFUN (neighbor_peer_group,
+ neighbor_peer_group_cmd,
+ "neighbor WORD peer-group",
+ NEIGHBOR_STR
+ "Neighbor tag\n"
+ "Configure peer-group\n")
+{
+ struct bgp *bgp;
+ struct peer_group *group;
+
+ bgp = vty->index;
+
+ group = peer_group_get (bgp, argv[0]);
+ if (! group)
+ return CMD_WARNING;
+
+ return CMD_SUCCESS;
+}
+
+DEFUN (no_neighbor,
+ no_neighbor_cmd,
+ NO_NEIGHBOR_CMD2,
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2)
+{
+ int ret;
+ union sockunion su;
+ struct peer_group *group;
+ struct peer *peer;
+
+ ret = str2sockunion (argv[0], &su);
+ if (ret < 0)
+ {
+ group = peer_group_lookup (vty->index, argv[0]);
+ if (group)
+ peer_group_delete (group);
+ else
+ {
+ vty_out (vty, "%% Create the peer-group first%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+ }
+ else
+ {
+ peer = peer_lookup (vty->index, &su);
+ if (peer)
+ peer_delete (peer);
+ }
+
+ return CMD_SUCCESS;
+}
+
+ALIAS (no_neighbor,
+ no_neighbor_remote_as_cmd,
+ NO_NEIGHBOR_CMD "remote-as <1-65535>",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR
+ "Specify a BGP neighbor\n"
+ AS_STR)
+
+DEFUN (no_neighbor_peer_group,
+ no_neighbor_peer_group_cmd,
+ "no neighbor WORD peer-group",
+ NO_STR
+ NEIGHBOR_STR
+ "Neighbor tag\n"
+ "Configure peer-group\n")
+{
+ struct peer_group *group;
+
+ group = peer_group_lookup (vty->index, argv[0]);
+ if (group)
+ peer_group_delete (group);
+ else
+ {
+ vty_out (vty, "%% Create the peer-group first%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+ return CMD_SUCCESS;
+}
+
+DEFUN (no_neighbor_peer_group_remote_as,
+ no_neighbor_peer_group_remote_as_cmd,
+ "no neighbor WORD remote-as <1-65535>",
+ NO_STR
+ NEIGHBOR_STR
+ "Neighbor tag\n"
+ "Specify a BGP neighbor\n"
+ AS_STR)
+{
+ struct peer_group *group;
+
+ group = peer_group_lookup (vty->index, argv[0]);
+ if (group)
+ peer_group_remote_as_delete (group);
+ else
+ {
+ vty_out (vty, "%% Create the peer-group first%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+ return CMD_SUCCESS;
+}
+
+DEFUN (neighbor_local_as,
+ neighbor_local_as_cmd,
+ NEIGHBOR_CMD2 "local-as <1-65535>",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Specify a local-as number\n"
+ "AS number used as local AS\n")
+{
+ struct peer *peer;
+ int ret;
+
+ peer = peer_and_group_lookup_vty (vty, argv[0]);
+ if (! peer)
+ return CMD_WARNING;
+
+ ret = peer_local_as_set (peer, atoi (argv[1]), 0);
+ return bgp_vty_return (vty, ret);
+}
+
+DEFUN (neighbor_local_as_no_prepend,
+ neighbor_local_as_no_prepend_cmd,
+ NEIGHBOR_CMD2 "local-as <1-65535> no-prepend",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Specify a local-as number\n"
+ "AS number used as local AS\n"
+ "Do not prepend local-as to updates from ebgp peers\n")
+{
+ struct peer *peer;
+ int ret;
+
+ peer = peer_and_group_lookup_vty (vty, argv[0]);
+ if (! peer)
+ return CMD_WARNING;
+
+ ret = peer_local_as_set (peer, atoi (argv[1]), 1);
+ return bgp_vty_return (vty, ret);
+}
+
+DEFUN (no_neighbor_local_as,
+ no_neighbor_local_as_cmd,
+ NO_NEIGHBOR_CMD2 "local-as",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Specify a local-as number\n")
+{
+ struct peer *peer;
+ int ret;
+
+ peer = peer_and_group_lookup_vty (vty, argv[0]);
+ if (! peer)
+ return CMD_WARNING;
+
+ ret = peer_local_as_unset (peer);
+ return bgp_vty_return (vty, ret);
+}
+
+ALIAS (no_neighbor_local_as,
+ no_neighbor_local_as_val_cmd,
+ NO_NEIGHBOR_CMD2 "local-as <1-65535>",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Specify a local-as number\n"
+ "AS number used as local AS\n")
+
+ALIAS (no_neighbor_local_as,
+ no_neighbor_local_as_val2_cmd,
+ NO_NEIGHBOR_CMD2 "local-as <1-65535> no-prepend",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Specify a local-as number\n"
+ "AS number used as local AS\n"
+ "Do not prepend local-as to updates from ebgp peers\n")
+
+DEFUN (neighbor_activate,
+ neighbor_activate_cmd,
+ NEIGHBOR_CMD2 "activate",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Enable the Address Family for this Neighbor\n")
+{
+ struct peer *peer;
+
+ peer = peer_and_group_lookup_vty (vty, argv[0]);
+ if (! peer)
+ return CMD_WARNING;
+
+ peer_activate (peer, bgp_node_afi (vty), bgp_node_safi (vty));
+
+ return CMD_SUCCESS;
+}
+
+DEFUN (no_neighbor_activate,
+ no_neighbor_activate_cmd,
+ NO_NEIGHBOR_CMD2 "activate",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Enable the Address Family for this Neighbor\n")
+{
+ int ret;
+ struct peer *peer;
+
+ /* Lookup peer. */
+ peer = peer_and_group_lookup_vty (vty, argv[0]);
+ if (! peer)
+ return CMD_WARNING;
+
+ ret = peer_deactivate (peer, bgp_node_afi (vty), bgp_node_safi (vty));
+
+ return bgp_vty_return (vty, ret);
+}
+
+DEFUN (neighbor_set_peer_group,
+ neighbor_set_peer_group_cmd,
+ NEIGHBOR_CMD "peer-group WORD",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR
+ "Member of the peer-group\n"
+ "peer-group name\n")
+{
+ int ret;
+ as_t as;
+ union sockunion su;
+ struct bgp *bgp;
+ struct peer_group *group;
+
+ bgp = vty->index;
+
+ ret = str2sockunion (argv[0], &su);
+ if (ret < 0)
+ {
+ vty_out (vty, "%% Malformed address: %s%s", argv[0], VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ group = peer_group_lookup (bgp, argv[1]);
+ if (! group)
+ {
+ vty_out (vty, "%% Configure the peer-group first%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ if (peer_address_self_check (&su))
+ {
+ vty_out (vty, "%% Can not configure the local system as neighbor%s",
+ VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ ret = peer_group_bind (bgp, &su, group, bgp_node_afi (vty),
+ bgp_node_safi (vty), &as);
+
+ if (ret == BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT)
+ {
+ vty_out (vty, "%% Peer with AS %d cannot be in this peer-group, members must be all internal or all external%s", as, VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ return bgp_vty_return (vty, ret);
+}
+
+DEFUN (no_neighbor_set_peer_group,
+ no_neighbor_set_peer_group_cmd,
+ NO_NEIGHBOR_CMD "peer-group WORD",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR
+ "Member of the peer-group\n"
+ "peer-group name\n")
+{
+ int ret;
+ struct bgp *bgp;
+ struct peer *peer;
+ struct peer_group *group;
+
+ bgp = vty->index;
+
+ peer = peer_lookup_vty (vty, argv[0]);
+ if (! peer)
+ return CMD_WARNING;
+
+ group = peer_group_lookup (bgp, argv[1]);
+ if (! group)
+ {
+ vty_out (vty, "%% Configure the peer-group first%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ ret = peer_group_unbind (bgp, peer, group, bgp_node_afi (vty),
+ bgp_node_safi (vty));
+
+ return bgp_vty_return (vty, ret);
+}
+
+int
+peer_flag_modify_vty (struct vty *vty, char *ip_str, u_int16_t flag, int set)
+{
+ int ret;
+ struct peer *peer;
+
+ peer = peer_and_group_lookup_vty (vty, ip_str);
+ if (! peer)
+ return CMD_WARNING;
+
+ if (set)
+ ret = peer_flag_set (peer, flag);
+ else
+ ret = peer_flag_unset (peer, flag);
+
+ return bgp_vty_return (vty, ret);
+}
+
+int
+peer_flag_set_vty (struct vty *vty, char *ip_str, u_int16_t flag)
+{
+ return peer_flag_modify_vty (vty, ip_str, flag, 1);
+}
+
+int
+peer_flag_unset_vty (struct vty *vty, char *ip_str, u_int16_t flag)
+{
+ return peer_flag_modify_vty (vty, ip_str, flag, 0);
+}
+
+/* neighbor passive. */
+DEFUN (neighbor_passive,
+ neighbor_passive_cmd,
+ NEIGHBOR_CMD2 "passive",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Don't send open messages to this neighbor\n")
+{
+ return peer_flag_set_vty (vty, argv[0], PEER_FLAG_PASSIVE);
+}
+
+DEFUN (no_neighbor_passive,
+ no_neighbor_passive_cmd,
+ NO_NEIGHBOR_CMD2 "passive",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Don't send open messages to this neighbor\n")
+{
+ return peer_flag_unset_vty (vty, argv[0], PEER_FLAG_PASSIVE);
+}
+
+/* neighbor shutdown. */
+DEFUN (neighbor_shutdown,
+ neighbor_shutdown_cmd,
+ NEIGHBOR_CMD2 "shutdown",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Administratively shut down this neighbor\n")
+{
+ return peer_flag_set_vty (vty, argv[0], PEER_FLAG_SHUTDOWN);
+}
+
+DEFUN (no_neighbor_shutdown,
+ no_neighbor_shutdown_cmd,
+ NO_NEIGHBOR_CMD2 "shutdown",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Administratively shut down this neighbor\n")
+{
+ return peer_flag_unset_vty (vty, argv[0], PEER_FLAG_SHUTDOWN);
+}
+
+/* neighbor capability route-refresh. */
+DEFUN (neighbor_capability_route_refresh,
+ neighbor_capability_route_refresh_cmd,
+ NEIGHBOR_CMD2 "capability route-refresh",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Advertise capability to the peer\n"
+ "Advertise route-refresh capability to this neighbor\n")
+{
+ return peer_flag_unset_vty (vty, argv[0], PEER_FLAG_NO_ROUTE_REFRESH_CAP);
+}
+
+DEFUN (no_neighbor_capability_route_refresh,
+ no_neighbor_capability_route_refresh_cmd,
+ NO_NEIGHBOR_CMD2 "capability route-refresh",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Advertise capability to the peer\n"
+ "Advertise route-refresh capability to this neighbor\n")
+{
+ return peer_flag_set_vty (vty, argv[0], PEER_FLAG_NO_ROUTE_REFRESH_CAP);
+}
+
+/* neighbor capability dynamic. */
+DEFUN (neighbor_capability_dynamic,
+ neighbor_capability_dynamic_cmd,
+ NEIGHBOR_CMD2 "capability dynamic",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Advertise capability to the peer\n"
+ "Advertise dynamic capability to this neighbor\n")
+{
+ return peer_flag_set_vty (vty, argv[0], PEER_FLAG_DYNAMIC_CAPABILITY);
+}
+
+DEFUN (no_neighbor_capability_dynamic,
+ no_neighbor_capability_dynamic_cmd,
+ NO_NEIGHBOR_CMD2 "capability dynamic",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Advertise capability to the peer\n"
+ "Advertise dynamic capability to this neighbor\n")
+{
+ return peer_flag_unset_vty (vty, argv[0], PEER_FLAG_DYNAMIC_CAPABILITY);
+}
+
+/* neighbor dont-capability-negotiate */
+DEFUN (neighbor_dont_capability_negotiate,
+ neighbor_dont_capability_negotiate_cmd,
+ NEIGHBOR_CMD2 "dont-capability-negotiate",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Do not perform capability negotiation\n")
+{
+ return peer_flag_set_vty (vty, argv[0], PEER_FLAG_DONT_CAPABILITY);
+}
+
+DEFUN (no_neighbor_dont_capability_negotiate,
+ no_neighbor_dont_capability_negotiate_cmd,
+ NO_NEIGHBOR_CMD2 "dont-capability-negotiate",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Do not perform capability negotiation\n")
+{
+ return peer_flag_unset_vty (vty, argv[0], PEER_FLAG_DONT_CAPABILITY);
+}
+
+int
+peer_af_flag_modify_vty (struct vty *vty, char *peer_str, afi_t afi,
+ safi_t safi, u_int16_t flag, int set)
+{
+ int ret;
+ struct peer *peer;
+
+ peer = peer_and_group_lookup_vty (vty, peer_str);
+ if (! peer)
+ return CMD_WARNING;
+
+ if (set)
+ ret = peer_af_flag_set (peer, afi, safi, flag);
+ else
+ ret = peer_af_flag_unset (peer, afi, safi, flag);
+
+ return bgp_vty_return (vty, ret);
+}
+
+int
+peer_af_flag_set_vty (struct vty *vty, char *peer_str, afi_t afi,
+ safi_t safi, u_int16_t flag)
+{
+ return peer_af_flag_modify_vty (vty, peer_str, afi, safi, flag, 1);
+}
+
+int
+peer_af_flag_unset_vty (struct vty *vty, char *peer_str, afi_t afi,
+ safi_t safi, u_int16_t flag)
+{
+ return peer_af_flag_modify_vty (vty, peer_str, afi, safi, flag, 0);
+}
+
+/* neighbor capability orf prefix-list. */
+DEFUN (neighbor_capability_orf_prefix,
+ neighbor_capability_orf_prefix_cmd,
+ NEIGHBOR_CMD2 "capability orf prefix-list (both|send|receive)",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Advertise capability to the peer\n"
+ "Advertise ORF capability to the peer\n"
+ "Advertise prefixlist ORF capability to this neighbor\n"
+ "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
+ "Capability to RECEIVE the ORF from this neighbor\n"
+ "Capability to SEND the ORF to this neighbor\n")
+{
+ u_int16_t flag = 0;
+
+ if (strncmp (argv[1], "s", 1) == 0)
+ flag = PEER_FLAG_ORF_PREFIX_SM;
+ else if (strncmp (argv[1], "r", 1) == 0)
+ flag = PEER_FLAG_ORF_PREFIX_RM;
+ else if (strncmp (argv[1], "b", 1) == 0)
+ flag = PEER_FLAG_ORF_PREFIX_SM|PEER_FLAG_ORF_PREFIX_RM;
+ else
+ return CMD_WARNING;
+
+ return peer_af_flag_set_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty), flag);
+}
+
+DEFUN (no_neighbor_capability_orf_prefix,
+ no_neighbor_capability_orf_prefix_cmd,
+ NO_NEIGHBOR_CMD2 "capability orf prefix-list (both|send|receive)",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Advertise capability to the peer\n"
+ "Advertise ORF capability to the peer\n"
+ "Advertise prefixlist ORF capability to this neighbor\n"
+ "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
+ "Capability to RECEIVE the ORF from this neighbor\n"
+ "Capability to SEND the ORF to this neighbor\n")
+{
+ u_int16_t flag = 0;
+
+ if (strncmp (argv[1], "s", 1) == 0)
+ flag = PEER_FLAG_ORF_PREFIX_SM;
+ else if (strncmp (argv[1], "r", 1) == 0)
+ flag = PEER_FLAG_ORF_PREFIX_RM;
+ else if (strncmp (argv[1], "b", 1) == 0)
+ flag = PEER_FLAG_ORF_PREFIX_SM|PEER_FLAG_ORF_PREFIX_RM;
+ else
+ return CMD_WARNING;
+
+ return peer_af_flag_unset_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty), flag);
+}
+
+/* neighbor next-hop-self. */
+DEFUN (neighbor_nexthop_self,
+ neighbor_nexthop_self_cmd,
+ NEIGHBOR_CMD2 "next-hop-self",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Disable the next hop calculation for this neighbor\n")
+{
+ return peer_af_flag_set_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty), PEER_FLAG_NEXTHOP_SELF);
+}
+
+DEFUN (no_neighbor_nexthop_self,
+ no_neighbor_nexthop_self_cmd,
+ NO_NEIGHBOR_CMD2 "next-hop-self",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Disable the next hop calculation for this neighbor\n")
+{
+ return peer_af_flag_unset_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty), PEER_FLAG_NEXTHOP_SELF);
+}
+
+/* neighbor remove-private-AS. */
+DEFUN (neighbor_remove_private_as,
+ neighbor_remove_private_as_cmd,
+ NEIGHBOR_CMD2 "remove-private-AS",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Remove private AS number from outbound updates\n")
+{
+ return peer_af_flag_set_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty),
+ PEER_FLAG_REMOVE_PRIVATE_AS);
+}
+
+DEFUN (no_neighbor_remove_private_as,
+ no_neighbor_remove_private_as_cmd,
+ NO_NEIGHBOR_CMD2 "remove-private-AS",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Remove private AS number from outbound updates\n")
+{
+ return peer_af_flag_unset_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty),
+ PEER_FLAG_REMOVE_PRIVATE_AS);
+}
+
+/* neighbor send-community. */
+DEFUN (neighbor_send_community,
+ neighbor_send_community_cmd,
+ NEIGHBOR_CMD2 "send-community",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Send Community attribute to this neighbor\n")
+{
+ return peer_af_flag_set_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty),
+ PEER_FLAG_SEND_COMMUNITY);
+}
+
+DEFUN (no_neighbor_send_community,
+ no_neighbor_send_community_cmd,
+ NO_NEIGHBOR_CMD2 "send-community",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Send Community attribute to this neighbor\n")
+{
+ return peer_af_flag_unset_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty),
+ PEER_FLAG_SEND_COMMUNITY);
+}
+
+/* neighbor send-community extended. */
+DEFUN (neighbor_send_community_type,
+ neighbor_send_community_type_cmd,
+ NEIGHBOR_CMD2 "send-community (both|extended|standard)",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Send Community attribute to this neighbor\n"
+ "Send Standard and Extended Community attributes\n"
+ "Send Extended Community attributes\n"
+ "Send Standard Community attributes\n")
+{
+ if (strncmp (argv[1], "s", 1) == 0)
+ return peer_af_flag_set_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty),
+ PEER_FLAG_SEND_COMMUNITY);
+ if (strncmp (argv[1], "e", 1) == 0)
+ return peer_af_flag_set_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty),
+ PEER_FLAG_SEND_EXT_COMMUNITY);
+
+ return peer_af_flag_set_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty),
+ (PEER_FLAG_SEND_COMMUNITY|
+ PEER_FLAG_SEND_EXT_COMMUNITY));
+}
+
+DEFUN (no_neighbor_send_community_type,
+ no_neighbor_send_community_type_cmd,
+ NO_NEIGHBOR_CMD2 "send-community (both|extended|standard)",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Send Community attribute to this neighbor\n"
+ "Send Standard and Extended Community attributes\n"
+ "Send Extended Community attributes\n"
+ "Send Standard Community attributes\n")
+{
+ if (strncmp (argv[1], "s", 1) == 0)
+ return peer_af_flag_unset_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty),
+ PEER_FLAG_SEND_COMMUNITY);
+ if (strncmp (argv[1], "e", 1) == 0)
+ return peer_af_flag_unset_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty),
+ PEER_FLAG_SEND_EXT_COMMUNITY);
+
+ return peer_af_flag_unset_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty),
+ (PEER_FLAG_SEND_COMMUNITY |
+ PEER_FLAG_SEND_EXT_COMMUNITY));
+}
+
+/* neighbor soft-reconfig. */
+DEFUN (neighbor_soft_reconfiguration,
+ neighbor_soft_reconfiguration_cmd,
+ NEIGHBOR_CMD2 "soft-reconfiguration inbound",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Per neighbor soft reconfiguration\n"
+ "Allow inbound soft reconfiguration for this neighbor\n")
+{
+ return peer_af_flag_set_vty (vty, argv[0],
+ bgp_node_afi (vty), bgp_node_safi (vty),
+ PEER_FLAG_SOFT_RECONFIG);
+}
+
+DEFUN (no_neighbor_soft_reconfiguration,
+ no_neighbor_soft_reconfiguration_cmd,
+ NO_NEIGHBOR_CMD2 "soft-reconfiguration inbound",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Per neighbor soft reconfiguration\n"
+ "Allow inbound soft reconfiguration for this neighbor\n")
+{
+ return peer_af_flag_unset_vty (vty, argv[0],
+ bgp_node_afi (vty), bgp_node_safi (vty),
+ PEER_FLAG_SOFT_RECONFIG);
+}
+
+DEFUN (neighbor_route_reflector_client,
+ neighbor_route_reflector_client_cmd,
+ NEIGHBOR_CMD2 "route-reflector-client",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Configure a neighbor as Route Reflector client\n")
+{
+ struct peer *peer;
+
+
+ peer = peer_and_group_lookup_vty (vty, argv[0]);
+ if (! peer)
+ return CMD_WARNING;
+
+ return peer_af_flag_set_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty),
+ PEER_FLAG_REFLECTOR_CLIENT);
+}
+
+DEFUN (no_neighbor_route_reflector_client,
+ no_neighbor_route_reflector_client_cmd,
+ NO_NEIGHBOR_CMD2 "route-reflector-client",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Configure a neighbor as Route Reflector client\n")
+{
+ return peer_af_flag_unset_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty),
+ PEER_FLAG_REFLECTOR_CLIENT);
+}
+
+/* neighbor route-server-client. */
+DEFUN (neighbor_route_server_client,
+ neighbor_route_server_client_cmd,
+ NEIGHBOR_CMD2 "route-server-client",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Configure a neighbor as Route Server client\n")
+{
+ return peer_af_flag_set_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty),
+ PEER_FLAG_RSERVER_CLIENT);
+}
+
+DEFUN (no_neighbor_route_server_client,
+ no_neighbor_route_server_client_cmd,
+ NO_NEIGHBOR_CMD2 "route-server-client",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Configure a neighbor as Route Server client\n")
+{
+ return peer_af_flag_unset_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty),
+ PEER_FLAG_RSERVER_CLIENT);
+}
+
+DEFUN (neighbor_attr_unchanged,
+ neighbor_attr_unchanged_cmd,
+ NEIGHBOR_CMD2 "attribute-unchanged",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "BGP attribute is propagated unchanged to this neighbor\n")
+{
+ return peer_af_flag_set_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty),
+ (PEER_FLAG_AS_PATH_UNCHANGED |
+ PEER_FLAG_NEXTHOP_UNCHANGED |
+ PEER_FLAG_MED_UNCHANGED));
+}
+
+DEFUN (neighbor_attr_unchanged1,
+ neighbor_attr_unchanged1_cmd,
+ NEIGHBOR_CMD2 "attribute-unchanged (as-path|next-hop|med)",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "BGP attribute is propagated unchanged to this neighbor\n"
+ "As-path attribute\n"
+ "Nexthop attribute\n"
+ "Med attribute\n")
+{
+ u_int16_t flags = 0;
+
+ if (strncmp (argv[1], "as-path", 1) == 0)
+ SET_FLAG (flags, PEER_FLAG_AS_PATH_UNCHANGED);
+ else if (strncmp (argv[1], "next-hop", 1) == 0)
+ SET_FLAG (flags, PEER_FLAG_NEXTHOP_UNCHANGED);
+ else if (strncmp (argv[1], "med", 1) == 0)
+ SET_FLAG (flags, PEER_FLAG_MED_UNCHANGED);
+
+ return peer_af_flag_set_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty), flags);
+}
+
+DEFUN (neighbor_attr_unchanged2,
+ neighbor_attr_unchanged2_cmd,
+ NEIGHBOR_CMD2 "attribute-unchanged as-path (next-hop|med)",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "BGP attribute is propagated unchanged to this neighbor\n"
+ "As-path attribute\n"
+ "Nexthop attribute\n"
+ "Med attribute\n")
+{
+ u_int16_t flags = PEER_FLAG_AS_PATH_UNCHANGED;
+
+ if (strncmp (argv[1], "next-hop", 1) == 0)
+ SET_FLAG (flags, PEER_FLAG_NEXTHOP_UNCHANGED);
+ else if (strncmp (argv[1], "med", 1) == 0)
+ SET_FLAG (flags, PEER_FLAG_MED_UNCHANGED);
+
+ return peer_af_flag_set_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty), flags);
+
+}
+
+DEFUN (neighbor_attr_unchanged3,
+ neighbor_attr_unchanged3_cmd,
+ NEIGHBOR_CMD2 "attribute-unchanged next-hop (as-path|med)",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "BGP attribute is propagated unchanged to this neighbor\n"
+ "Nexthop attribute\n"
+ "As-path attribute\n"
+ "Med attribute\n")
+{
+ u_int16_t flags = PEER_FLAG_NEXTHOP_UNCHANGED;
+
+ if (strncmp (argv[1], "as-path", 1) == 0)
+ SET_FLAG (flags, PEER_FLAG_AS_PATH_UNCHANGED);
+ else if (strncmp (argv[1], "med", 1) == 0)
+ SET_FLAG (flags, PEER_FLAG_MED_UNCHANGED);
+
+ return peer_af_flag_set_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty), flags);
+}
+
+DEFUN (neighbor_attr_unchanged4,
+ neighbor_attr_unchanged4_cmd,
+ NEIGHBOR_CMD2 "attribute-unchanged med (as-path|next-hop)",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "BGP attribute is propagated unchanged to this neighbor\n"
+ "Med attribute\n"
+ "As-path attribute\n"
+ "Nexthop attribute\n")
+{
+ u_int16_t flags = PEER_FLAG_MED_UNCHANGED;
+
+ if (strncmp (argv[1], "as-path", 1) == 0)
+ SET_FLAG (flags, PEER_FLAG_AS_PATH_UNCHANGED);
+ else if (strncmp (argv[1], "next-hop", 1) == 0)
+ SET_FLAG (flags, PEER_FLAG_NEXTHOP_UNCHANGED);
+
+ return peer_af_flag_set_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty), flags);
+}
+
+ALIAS (neighbor_attr_unchanged,
+ neighbor_attr_unchanged5_cmd,
+ NEIGHBOR_CMD2 "attribute-unchanged as-path next-hop med",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "BGP attribute is propagated unchanged to this neighbor\n"
+ "As-path attribute\n"
+ "Nexthop attribute\n"
+ "Med attribute\n")
+
+ALIAS (neighbor_attr_unchanged,
+ neighbor_attr_unchanged6_cmd,
+ NEIGHBOR_CMD2 "attribute-unchanged as-path med next-hop",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "BGP attribute is propagated unchanged to this neighbor\n"
+ "As-path attribute\n"
+ "Med attribute\n"
+ "Nexthop attribute\n")
+
+ALIAS (neighbor_attr_unchanged,
+ neighbor_attr_unchanged7_cmd,
+ NEIGHBOR_CMD2 "attribute-unchanged next-hop med as-path",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "BGP attribute is propagated unchanged to this neighbor\n"
+ "Nexthop attribute\n"
+ "Med attribute\n"
+ "As-path attribute\n")
+
+ALIAS (neighbor_attr_unchanged,
+ neighbor_attr_unchanged8_cmd,
+ NEIGHBOR_CMD2 "attribute-unchanged next-hop as-path med",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "BGP attribute is propagated unchanged to this neighbor\n"
+ "Nexthop attribute\n"
+ "As-path attribute\n"
+ "Med attribute\n")
+
+ALIAS (neighbor_attr_unchanged,
+ neighbor_attr_unchanged9_cmd,
+ NEIGHBOR_CMD2 "attribute-unchanged med next-hop as-path",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "BGP attribute is propagated unchanged to this neighbor\n"
+ "Med attribute\n"
+ "Nexthop attribute\n"
+ "As-path attribute\n")
+
+ALIAS (neighbor_attr_unchanged,
+ neighbor_attr_unchanged10_cmd,
+ NEIGHBOR_CMD2 "attribute-unchanged med as-path next-hop",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "BGP attribute is propagated unchanged to this neighbor\n"
+ "Med attribute\n"
+ "As-path attribute\n"
+ "Nexthop attribute\n")
+
+DEFUN (no_neighbor_attr_unchanged,
+ no_neighbor_attr_unchanged_cmd,
+ NO_NEIGHBOR_CMD2 "attribute-unchanged",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "BGP attribute is propagated unchanged to this neighbor\n")
+{
+ return peer_af_flag_unset_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty),
+ (PEER_FLAG_AS_PATH_UNCHANGED |
+ PEER_FLAG_NEXTHOP_UNCHANGED |
+ PEER_FLAG_MED_UNCHANGED));
+}
+
+DEFUN (no_neighbor_attr_unchanged1,
+ no_neighbor_attr_unchanged1_cmd,
+ NO_NEIGHBOR_CMD2 "attribute-unchanged (as-path|next-hop|med)",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "BGP attribute is propagated unchanged to this neighbor\n"
+ "As-path attribute\n"
+ "Nexthop attribute\n"
+ "Med attribute\n")
+{
+ u_int16_t flags = 0;
+
+ if (strncmp (argv[1], "as-path", 1) == 0)
+ SET_FLAG (flags, PEER_FLAG_AS_PATH_UNCHANGED);
+ else if (strncmp (argv[1], "next-hop", 1) == 0)
+ SET_FLAG (flags, PEER_FLAG_NEXTHOP_UNCHANGED);
+ else if (strncmp (argv[1], "med", 1) == 0)
+ SET_FLAG (flags, PEER_FLAG_MED_UNCHANGED);
+
+ return peer_af_flag_unset_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty), flags);
+}
+
+DEFUN (no_neighbor_attr_unchanged2,
+ no_neighbor_attr_unchanged2_cmd,
+ NO_NEIGHBOR_CMD2 "attribute-unchanged as-path (next-hop|med)",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "BGP attribute is propagated unchanged to this neighbor\n"
+ "As-path attribute\n"
+ "Nexthop attribute\n"
+ "Med attribute\n")
+{
+ u_int16_t flags = PEER_FLAG_AS_PATH_UNCHANGED;
+
+ if (strncmp (argv[1], "next-hop", 1) == 0)
+ SET_FLAG (flags, PEER_FLAG_NEXTHOP_UNCHANGED);
+ else if (strncmp (argv[1], "med", 1) == 0)
+ SET_FLAG (flags, PEER_FLAG_MED_UNCHANGED);
+
+ return peer_af_flag_unset_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty), flags);
+}
+
+DEFUN (no_neighbor_attr_unchanged3,
+ no_neighbor_attr_unchanged3_cmd,
+ NO_NEIGHBOR_CMD2 "attribute-unchanged next-hop (as-path|med)",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "BGP attribute is propagated unchanged to this neighbor\n"
+ "Nexthop attribute\n"
+ "As-path attribute\n"
+ "Med attribute\n")
+{
+ u_int16_t flags = PEER_FLAG_NEXTHOP_UNCHANGED;
+
+ if (strncmp (argv[1], "as-path", 1) == 0)
+ SET_FLAG (flags, PEER_FLAG_AS_PATH_UNCHANGED);
+ else if (strncmp (argv[1], "med", 1) == 0)
+ SET_FLAG (flags, PEER_FLAG_MED_UNCHANGED);
+
+ return peer_af_flag_unset_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty), flags);
+}
+
+DEFUN (no_neighbor_attr_unchanged4,
+ no_neighbor_attr_unchanged4_cmd,
+ NO_NEIGHBOR_CMD2 "attribute-unchanged med (as-path|next-hop)",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "BGP attribute is propagated unchanged to this neighbor\n"
+ "Med attribute\n"
+ "As-path attribute\n"
+ "Nexthop attribute\n")
+{
+ u_int16_t flags = PEER_FLAG_MED_UNCHANGED;
+
+ if (strncmp (argv[1], "as-path", 1) == 0)
+ SET_FLAG (flags, PEER_FLAG_AS_PATH_UNCHANGED);
+ else if (strncmp (argv[1], "next-hop", 1) == 0)
+ SET_FLAG (flags, PEER_FLAG_NEXTHOP_UNCHANGED);
+
+ return peer_af_flag_unset_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty), flags);
+}
+
+ALIAS (no_neighbor_attr_unchanged,
+ no_neighbor_attr_unchanged5_cmd,
+ NO_NEIGHBOR_CMD2 "attribute-unchanged as-path next-hop med",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "BGP attribute is propagated unchanged to this neighbor\n"
+ "As-path attribute\n"
+ "Nexthop attribute\n"
+ "Med attribute\n")
+
+ALIAS (no_neighbor_attr_unchanged,
+ no_neighbor_attr_unchanged6_cmd,
+ NO_NEIGHBOR_CMD2 "attribute-unchanged as-path med next-hop",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "BGP attribute is propagated unchanged to this neighbor\n"
+ "As-path attribute\n"
+ "Med attribute\n"
+ "Nexthop attribute\n")
+
+ALIAS (no_neighbor_attr_unchanged,
+ no_neighbor_attr_unchanged7_cmd,
+ NO_NEIGHBOR_CMD2 "attribute-unchanged next-hop med as-path",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "BGP attribute is propagated unchanged to this neighbor\n"
+ "Nexthop attribute\n"
+ "Med attribute\n"
+ "As-path attribute\n")
+
+ALIAS (no_neighbor_attr_unchanged,
+ no_neighbor_attr_unchanged8_cmd,
+ NO_NEIGHBOR_CMD2 "attribute-unchanged next-hop as-path med",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "BGP attribute is propagated unchanged to this neighbor\n"
+ "Nexthop attribute\n"
+ "As-path attribute\n"
+ "Med attribute\n")
+
+ALIAS (no_neighbor_attr_unchanged,
+ no_neighbor_attr_unchanged9_cmd,
+ NO_NEIGHBOR_CMD2 "attribute-unchanged med next-hop as-path",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "BGP attribute is propagated unchanged to this neighbor\n"
+ "Med attribute\n"
+ "Nexthop attribute\n"
+ "As-path attribute\n")
+
+ALIAS (no_neighbor_attr_unchanged,
+ no_neighbor_attr_unchanged10_cmd,
+ NO_NEIGHBOR_CMD2 "attribute-unchanged med as-path next-hop",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "BGP attribute is propagated unchanged to this neighbor\n"
+ "Med attribute\n"
+ "As-path attribute\n"
+ "Nexthop attribute\n")
+
+/* For old version Zebra compatibility. */
+DEFUN (neighbor_transparent_as,
+ neighbor_transparent_as_cmd,
+ NEIGHBOR_CMD "transparent-as",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR
+ "Do not append my AS number even peer is EBGP peer\n")
+{
+ return peer_af_flag_set_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty),
+ PEER_FLAG_AS_PATH_UNCHANGED);
+}
+
+DEFUN (neighbor_transparent_nexthop,
+ neighbor_transparent_nexthop_cmd,
+ NEIGHBOR_CMD "transparent-nexthop",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR
+ "Do not change nexthop even peer is EBGP peer\n")
+{
+ return peer_af_flag_set_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty),
+ PEER_FLAG_NEXTHOP_UNCHANGED);
+}
+
+/* EBGP multihop configuration. */
+int
+peer_ebgp_multihop_set_vty (struct vty *vty, char *ip_str, char *ttl_str)
+{
+ struct peer *peer;
+ int ttl;
+
+ peer = peer_and_group_lookup_vty (vty, ip_str);
+ if (! peer)
+ return CMD_WARNING;
+
+ if (! ttl_str)
+ ttl = TTL_MAX;
+ else
+ VTY_GET_INTEGER_RANGE ("TTL", ttl, ttl_str, 1, 255);
+
+ peer_ebgp_multihop_set (peer, ttl);
+
+ return CMD_SUCCESS;
+}
+
+int
+peer_ebgp_multihop_unset_vty (struct vty *vty, char *ip_str)
+{
+ struct peer *peer;
+
+ peer = peer_and_group_lookup_vty (vty, ip_str);
+ if (! peer)
+ return CMD_WARNING;
+
+ peer_ebgp_multihop_unset (peer);
+
+ return CMD_SUCCESS;
+}
+
+/* neighbor ebgp-multihop. */
+DEFUN (neighbor_ebgp_multihop,
+ neighbor_ebgp_multihop_cmd,
+ NEIGHBOR_CMD2 "ebgp-multihop",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Allow EBGP neighbors not on directly connected networks\n")
+{
+ return peer_ebgp_multihop_set_vty (vty, argv[0], NULL);
+}
+
+DEFUN (neighbor_ebgp_multihop_ttl,
+ neighbor_ebgp_multihop_ttl_cmd,
+ NEIGHBOR_CMD2 "ebgp-multihop <1-255>",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Allow EBGP neighbors not on directly connected networks\n"
+ "maximum hop count\n")
+{
+ return peer_ebgp_multihop_set_vty (vty, argv[0], argv[1]);
+}
+
+DEFUN (no_neighbor_ebgp_multihop,
+ no_neighbor_ebgp_multihop_cmd,
+ NO_NEIGHBOR_CMD2 "ebgp-multihop",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Allow EBGP neighbors not on directly connected networks\n")
+{
+ return peer_ebgp_multihop_unset_vty (vty, argv[0]);
+}
+
+ALIAS (no_neighbor_ebgp_multihop,
+ no_neighbor_ebgp_multihop_ttl_cmd,
+ NO_NEIGHBOR_CMD2 "ebgp-multihop <1-255>",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Allow EBGP neighbors not on directly connected networks\n"
+ "maximum hop count\n")
+
+/* Enforce multihop. */
+DEFUN (neighbor_enforce_multihop,
+ neighbor_enforce_multihop_cmd,
+ NEIGHBOR_CMD2 "enforce-multihop",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Enforce EBGP neighbors perform multihop\n")
+{
+ return peer_flag_set_vty (vty, argv[0], PEER_FLAG_ENFORCE_MULTIHOP);
+}
+
+DEFUN (no_neighbor_enforce_multihop,
+ no_neighbor_enforce_multihop_cmd,
+ NO_NEIGHBOR_CMD2 "enforce-multihop",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Enforce EBGP neighbors perform multihop\n")
+{
+ return peer_flag_unset_vty (vty, argv[0], PEER_FLAG_ENFORCE_MULTIHOP);
+}
+
+DEFUN (neighbor_description,
+ neighbor_description_cmd,
+ NEIGHBOR_CMD2 "description .LINE",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Neighbor specific description\n"
+ "Up to 80 characters describing this neighbor\n")
+{
+ struct peer *peer;
+ struct buffer *b;
+ char *str;
+ int i;
+
+ peer = peer_and_group_lookup_vty (vty, argv[0]);
+ if (! peer)
+ return CMD_WARNING;
+
+ if (argc == 1)
+ return CMD_SUCCESS;
+
+ /* Make string from buffer. This function should be provided by
+ buffer.c. */
+ b = buffer_new (1024);
+ for (i = 1; i < argc; i++)
+ {
+ buffer_putstr (b, (u_char *)argv[i]);
+ buffer_putc (b, ' ');
+ }
+ buffer_putc (b, '\0');
+ str = buffer_getstr (b);
+ buffer_free (b);
+
+ peer_description_set (peer, str);
+
+ free (str);
+
+ return CMD_SUCCESS;
+}
+
+DEFUN (no_neighbor_description,
+ no_neighbor_description_cmd,
+ NO_NEIGHBOR_CMD2 "description",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Neighbor specific description\n")
+{
+ struct peer *peer;
+
+ peer = peer_and_group_lookup_vty (vty, argv[0]);
+ if (! peer)
+ return CMD_WARNING;
+
+ peer_description_unset (peer);
+
+ return CMD_SUCCESS;
+}
+
+ALIAS (no_neighbor_description,
+ no_neighbor_description_val_cmd,
+ NO_NEIGHBOR_CMD2 "description .LINE",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Neighbor specific description\n"
+ "Up to 80 characters describing this neighbor\n")
+
+/* Neighbor update-source. */
+int
+peer_update_source_vty (struct vty *vty, char *peer_str, char *source_str)
+{
+ struct peer *peer;
+ union sockunion *su;
+
+ peer = peer_and_group_lookup_vty (vty, peer_str);
+ if (! peer)
+ return CMD_WARNING;
+
+ if (source_str)
+ {
+ su = sockunion_str2su (source_str);
+ if (su)
+ {
+ peer_update_source_addr_set (peer, su);
+ sockunion_free (su);
+ }
+ else
+ peer_update_source_if_set (peer, source_str);
+ }
+ else
+ peer_update_source_unset (peer);
+
+ return CMD_SUCCESS;
+}
+
+DEFUN (neighbor_update_source,
+ neighbor_update_source_cmd,
+ NEIGHBOR_CMD2 "update-source WORD",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Source of routing updates\n"
+ "Interface name\n")
+{
+ return peer_update_source_vty (vty, argv[0], argv[1]);
+}
+
+DEFUN (no_neighbor_update_source,
+ no_neighbor_update_source_cmd,
+ NO_NEIGHBOR_CMD2 "update-source",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Source of routing updates\n"
+ "Interface name\n")
+{
+ return peer_update_source_vty (vty, argv[0], NULL);
+}
+
+int
+peer_default_originate_set_vty (struct vty *vty, char *peer_str, afi_t afi,
+ safi_t safi, char *rmap, int set)
+{
+ int ret;
+ struct peer *peer;
+
+ peer = peer_and_group_lookup_vty (vty, peer_str);
+ if (! peer)
+ return CMD_WARNING;
+
+ if (set)
+ ret = peer_default_originate_set (peer, afi, safi, rmap);
+ else
+ ret = peer_default_originate_unset (peer, afi, safi);
+
+ return bgp_vty_return (vty, ret);
+}
+
+/* neighbor default-originate. */
+DEFUN (neighbor_default_originate,
+ neighbor_default_originate_cmd,
+ NEIGHBOR_CMD2 "default-originate",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Originate default route to this neighbor\n")
+{
+ return peer_default_originate_set_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty), NULL, 1);
+}
+
+DEFUN (neighbor_default_originate_rmap,
+ neighbor_default_originate_rmap_cmd,
+ NEIGHBOR_CMD2 "default-originate route-map WORD",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Originate default route to this neighbor\n"
+ "Route-map to specify criteria to originate default\n"
+ "route-map name\n")
+{
+ return peer_default_originate_set_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty), argv[1], 1);
+}
+
+DEFUN (no_neighbor_default_originate,
+ no_neighbor_default_originate_cmd,
+ NO_NEIGHBOR_CMD2 "default-originate",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Originate default route to this neighbor\n")
+{
+ return peer_default_originate_set_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty), NULL, 0);
+}
+
+ALIAS (no_neighbor_default_originate,
+ no_neighbor_default_originate_rmap_cmd,
+ NO_NEIGHBOR_CMD2 "default-originate route-map WORD",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Originate default route to this neighbor\n"
+ "Route-map to specify criteria to originate default\n"
+ "route-map name\n")
+
+/* Set neighbor's BGP port. */
+int
+peer_port_vty (struct vty *vty, char *ip_str, int afi, char *port_str)
+{
+ struct peer *peer;
+ u_int16_t port;
+ struct servent *sp;
+
+ peer = peer_lookup_vty (vty, ip_str);
+ if (! peer)
+ return CMD_WARNING;
+
+ if (! port_str)
+ {
+ sp = getservbyname ("bgp", "tcp");
+ port = (sp == NULL) ? BGP_PORT_DEFAULT : ntohs (sp->s_port);
+ }
+ else
+ {
+ VTY_GET_INTEGER("port", port, port_str);
+ }
+
+ peer_port_set (peer, port);
+
+ return CMD_SUCCESS;
+}
+
+/* Set specified peer's BGP version. */
+DEFUN (neighbor_port,
+ neighbor_port_cmd,
+ NEIGHBOR_CMD "port <0-65535>",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR
+ "Neighbor's BGP port\n"
+ "TCP port number\n")
+{
+ return peer_port_vty (vty, argv[0], AFI_IP, argv[1]);
+}
+
+DEFUN (no_neighbor_port,
+ no_neighbor_port_cmd,
+ NO_NEIGHBOR_CMD "port",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR
+ "Neighbor's BGP port\n")
+{
+ return peer_port_vty (vty, argv[0], AFI_IP, NULL);
+}
+
+ALIAS (no_neighbor_port,
+ no_neighbor_port_val_cmd,
+ NO_NEIGHBOR_CMD "port <0-65535>",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR
+ "Neighbor's BGP port\n"
+ "TCP port number\n")
+
+/* neighbor weight. */
+int
+peer_weight_set_vty (struct vty *vty, char *ip_str, char *weight_str)
+{
+ int ret;
+ struct peer *peer;
+ unsigned long weight;
+
+ peer = peer_and_group_lookup_vty (vty, ip_str);
+ if (! peer)
+ return CMD_WARNING;
+
+ VTY_GET_INTEGER_RANGE("weight", weight, weight_str, 0, 65535);
+
+ ret = peer_weight_set (peer, weight);
+
+ return CMD_SUCCESS;
+}
+
+int
+peer_weight_unset_vty (struct vty *vty, char *ip_str)
+{
+ struct peer *peer;
+
+ peer = peer_and_group_lookup_vty (vty, ip_str);
+ if (! peer)
+ return CMD_WARNING;
+
+ peer_weight_unset (peer);
+
+ return CMD_SUCCESS;
+}
+
+DEFUN (neighbor_weight,
+ neighbor_weight_cmd,
+ NEIGHBOR_CMD2 "weight <0-65535>",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Set default weight for routes from this neighbor\n"
+ "default weight\n")
+{
+ return peer_weight_set_vty (vty, argv[0], argv[1]);
+}
+
+DEFUN (no_neighbor_weight,
+ no_neighbor_weight_cmd,
+ NO_NEIGHBOR_CMD2 "weight",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Set default weight for routes from this neighbor\n")
+{
+ return peer_weight_unset_vty (vty, argv[0]);
+}
+
+ALIAS (no_neighbor_weight,
+ no_neighbor_weight_val_cmd,
+ NO_NEIGHBOR_CMD2 "weight <0-65535>",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Set default weight for routes from this neighbor\n"
+ "default weight\n")
+
+/* Override capability negotiation. */
+DEFUN (neighbor_override_capability,
+ neighbor_override_capability_cmd,
+ NEIGHBOR_CMD2 "override-capability",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Override capability negotiation result\n")
+{
+ return peer_flag_set_vty (vty, argv[0], PEER_FLAG_OVERRIDE_CAPABILITY);
+}
+
+DEFUN (no_neighbor_override_capability,
+ no_neighbor_override_capability_cmd,
+ NO_NEIGHBOR_CMD2 "override-capability",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Override capability negotiation result\n")
+{
+ return peer_flag_unset_vty (vty, argv[0], PEER_FLAG_OVERRIDE_CAPABILITY);
+}
+
+DEFUN (neighbor_strict_capability,
+ neighbor_strict_capability_cmd,
+ NEIGHBOR_CMD "strict-capability-match",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR
+ "Strict capability negotiation match\n")
+{
+ return peer_flag_set_vty (vty, argv[0], PEER_FLAG_STRICT_CAP_MATCH);
+}
+
+DEFUN (no_neighbor_strict_capability,
+ no_neighbor_strict_capability_cmd,
+ NO_NEIGHBOR_CMD "strict-capability-match",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR
+ "Strict capability negotiation match\n")
+{
+ return peer_flag_unset_vty (vty, argv[0], PEER_FLAG_STRICT_CAP_MATCH);
+}
+
+int
+peer_timers_set_vty (struct vty *vty, char *ip_str, char *keep_str,
+ char *hold_str)
+{
+ int ret;
+ struct peer *peer;
+ u_int32_t keepalive;
+ u_int32_t holdtime;
+
+ peer = peer_and_group_lookup_vty (vty, ip_str);
+ if (! peer)
+ return CMD_WARNING;
+
+ VTY_GET_INTEGER_RANGE ("Keepalive", keepalive, keep_str, 0, 65535);
+ VTY_GET_INTEGER_RANGE ("Holdtime", holdtime, hold_str, 0, 65535);
+
+ ret = peer_timers_set (peer, keepalive, holdtime);
+
+ return bgp_vty_return (vty, ret);
+}
+
+int
+peer_timers_unset_vty (struct vty *vty, char *ip_str)
+{
+ int ret;
+ struct peer *peer;
+
+ peer = peer_lookup_vty (vty, ip_str);
+ if (! peer)
+ return CMD_WARNING;
+
+ ret = peer_timers_unset (peer);
+
+ return bgp_vty_return (vty, ret);
+}
+
+DEFUN (neighbor_timers,
+ neighbor_timers_cmd,
+ NEIGHBOR_CMD2 "timers <0-65535> <0-65535>",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "BGP per neighbor timers\n"
+ "Keepalive interval\n"
+ "Holdtime\n")
+{
+ return peer_timers_set_vty (vty, argv[0], argv[1], argv[2]);
+}
+
+DEFUN (no_neighbor_timers,
+ no_neighbor_timers_cmd,
+ NO_NEIGHBOR_CMD2 "timers",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "BGP per neighbor timers\n")
+{
+ return peer_timers_unset_vty (vty, argv[0]);
+}
+
+int
+peer_timers_connect_set_vty (struct vty *vty, char *ip_str, char *time_str)
+{
+ int ret;
+ struct peer *peer;
+ u_int32_t connect;
+
+ peer = peer_lookup_vty (vty, ip_str);
+ if (! peer)
+ return CMD_WARNING;
+
+ VTY_GET_INTEGER_RANGE ("Connect time", connect, time_str, 0, 65535);
+
+ ret = peer_timers_connect_set (peer, connect);
+
+ return CMD_SUCCESS;
+}
+
+int
+peer_timers_connect_unset_vty (struct vty *vty, char *ip_str)
+{
+ int ret;
+ struct peer *peer;
+
+ peer = peer_and_group_lookup_vty (vty, ip_str);
+ if (! peer)
+ return CMD_WARNING;
+
+ ret = peer_timers_connect_unset (peer);
+
+ return CMD_SUCCESS;
+}
+
+DEFUN (neighbor_timers_connect,
+ neighbor_timers_connect_cmd,
+ NEIGHBOR_CMD "timers connect <0-65535>",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR
+ "BGP per neighbor timers\n"
+ "BGP connect timer\n"
+ "Connect timer\n")
+{
+ return peer_timers_connect_set_vty (vty, argv[0], argv[1]);
+}
+
+DEFUN (no_neighbor_timers_connect,
+ no_neighbor_timers_connect_cmd,
+ NO_NEIGHBOR_CMD "timers connect",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR
+ "BGP per neighbor timers\n"
+ "BGP connect timer\n")
+{
+ return peer_timers_connect_unset_vty (vty, argv[0]);
+}
+
+ALIAS (no_neighbor_timers_connect,
+ no_neighbor_timers_connect_val_cmd,
+ NO_NEIGHBOR_CMD "timers connect <0-65535>",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR
+ "BGP per neighbor timers\n"
+ "BGP connect timer\n"
+ "Connect timer\n")
+
+int
+peer_advertise_interval_vty (struct vty *vty, char *ip_str, char *time_str,
+ int set)
+{
+ int ret;
+ struct peer *peer;
+ u_int32_t routeadv = 0;
+
+ peer = peer_lookup_vty (vty, ip_str);
+ if (! peer)
+ return CMD_WARNING;
+
+ if (time_str)
+ VTY_GET_INTEGER_RANGE ("advertise interval", routeadv, time_str, 0, 600);
+
+ if (set)
+ ret = peer_advertise_interval_set (peer, routeadv);
+ else
+ ret = peer_advertise_interval_unset (peer);
+
+ return CMD_SUCCESS;
+}
+
+DEFUN (neighbor_advertise_interval,
+ neighbor_advertise_interval_cmd,
+ NEIGHBOR_CMD "advertisement-interval <0-600>",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR
+ "Minimum interval between sending BGP routing updates\n"
+ "time in seconds\n")
+{
+ return peer_advertise_interval_vty (vty, argv[0], argv[1], 1);
+}
+
+DEFUN (no_neighbor_advertise_interval,
+ no_neighbor_advertise_interval_cmd,
+ NO_NEIGHBOR_CMD "advertisement-interval",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR
+ "Minimum interval between sending BGP routing updates\n")
+{
+ return peer_advertise_interval_vty (vty, argv[0], NULL, 0);
+}
+
+ALIAS (no_neighbor_advertise_interval,
+ no_neighbor_advertise_interval_val_cmd,
+ NO_NEIGHBOR_CMD "advertisement-interval <0-600>",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR
+ "Minimum interval between sending BGP routing updates\n"
+ "time in seconds\n")
+
+int
+peer_version_vty (struct vty *vty, char *ip_str, char *str)
+{
+ int ret;
+ struct peer *peer;
+ int version = BGP_VERSION_4;
+
+ peer = peer_lookup_vty (vty, ip_str);
+ if (! peer)
+ return CMD_WARNING;
+
+ /* BGP version string check. */
+ if (str)
+ {
+ if (strcmp (str, "4") == 0)
+ version = BGP_VERSION_4;
+ else if (strcmp (str, "4-") == 0)
+ version = BGP_VERSION_MP_4_DRAFT_00;
+
+ ret = peer_version_set (peer, version);
+ }
+ else
+ ret = peer_version_unset (peer);
+
+ return CMD_SUCCESS;
+}
+
+DEFUN (neighbor_version,
+ neighbor_version_cmd,
+ NEIGHBOR_CMD "version (4|4-)",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR
+ "Neighbor's BGP version\n"
+ "Border Gateway Protocol 4\n"
+ "Multiprotocol Extensions for BGP-4(Old Draft)\n")
+{
+ return peer_version_vty (vty, argv[0], argv[1]);
+}
+
+DEFUN (no_neighbor_version,
+ no_neighbor_version_cmd,
+ NO_NEIGHBOR_CMD "version",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR
+ "Neighbor's BGP version\n")
+{
+ return peer_version_vty (vty, argv[0], NULL);
+}
+
+/* neighbor interface */
+int
+peer_interface_vty (struct vty *vty, char *ip_str, char *str)
+{
+ int ret;
+ struct peer *peer;
+
+ peer = peer_lookup_vty (vty, ip_str);
+ if (! peer)
+ return CMD_WARNING;
+
+ if (str)
+ ret = peer_interface_set (peer, str);
+ else
+ ret = peer_interface_unset (peer);
+
+ return CMD_SUCCESS;
+}
+
+DEFUN (neighbor_interface,
+ neighbor_interface_cmd,
+ NEIGHBOR_CMD "interface WORD",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR
+ "Interface\n"
+ "Interface name\n")
+{
+ return peer_interface_vty (vty, argv[0], argv[1]);
+}
+
+DEFUN (no_neighbor_interface,
+ no_neighbor_interface_cmd,
+ NO_NEIGHBOR_CMD "interface WORD",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR
+ "Interface\n"
+ "Interface name\n")
+{
+ return peer_interface_vty (vty, argv[0], NULL);
+}
+
+/* Set distribute list to the peer. */
+int
+peer_distribute_set_vty (struct vty *vty, char *ip_str, afi_t afi, safi_t safi,
+ char *name_str, char *direct_str)
+{
+ int ret;
+ struct peer *peer;
+ int direct = FILTER_IN;
+
+ peer = peer_and_group_lookup_vty (vty, ip_str);
+ if (! peer)
+ return CMD_WARNING;
+
+ /* Check filter direction. */
+ if (strncmp (direct_str, "i", 1) == 0)
+ direct = FILTER_IN;
+ else if (strncmp (direct_str, "o", 1) == 0)
+ direct = FILTER_OUT;
+
+ ret = peer_distribute_set (peer, afi, safi, direct, name_str);
+
+ return bgp_vty_return (vty, ret);
+}
+
+int
+peer_distribute_unset_vty (struct vty *vty, char *ip_str, afi_t afi,
+ safi_t safi, char *direct_str)
+{
+ int ret;
+ struct peer *peer;
+ int direct = FILTER_IN;
+
+ peer = peer_and_group_lookup_vty (vty, ip_str);
+ if (! peer)
+ return CMD_WARNING;
+
+ /* Check filter direction. */
+ if (strncmp (direct_str, "i", 1) == 0)
+ direct = FILTER_IN;
+ else if (strncmp (direct_str, "o", 1) == 0)
+ direct = FILTER_OUT;
+
+ ret = peer_distribute_unset (peer, afi, safi, direct);
+
+ return bgp_vty_return (vty, ret);
+}
+
+DEFUN (neighbor_distribute_list,
+ neighbor_distribute_list_cmd,
+ NEIGHBOR_CMD2 "distribute-list (<1-199>|<1300-2699>|WORD) (in|out)",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Filter updates to/from this neighbor\n"
+ "IP access-list number\n"
+ "IP access-list number (expanded range)\n"
+ "IP Access-list name\n"
+ "Filter incoming updates\n"
+ "Filter outgoing updates\n")
+{
+ return peer_distribute_set_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty), argv[1], argv[2]);
+}
+
+DEFUN (no_neighbor_distribute_list,
+ no_neighbor_distribute_list_cmd,
+ NO_NEIGHBOR_CMD2 "distribute-list (<1-199>|<1300-2699>|WORD) (in|out)",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Filter updates to/from this neighbor\n"
+ "IP access-list number\n"
+ "IP access-list number (expanded range)\n"
+ "IP Access-list name\n"
+ "Filter incoming updates\n"
+ "Filter outgoing updates\n")
+{
+ return peer_distribute_unset_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty), argv[2]);
+}
+
+/* Set prefix list to the peer. */
+int
+peer_prefix_list_set_vty (struct vty *vty, char *ip_str, afi_t afi,
+ safi_t safi, char *name_str, char *direct_str)
+{
+ int ret;
+ struct peer *peer;
+ int direct = FILTER_IN;
+
+ peer = peer_and_group_lookup_vty (vty, ip_str);
+ if (! peer)
+ return CMD_WARNING;
+
+ /* Check filter direction. */
+ if (strncmp (direct_str, "i", 1) == 0)
+ direct = FILTER_IN;
+ else if (strncmp (direct_str, "o", 1) == 0)
+ direct = FILTER_OUT;
+
+ ret = peer_prefix_list_set (peer, afi, safi, direct, name_str);
+
+ return bgp_vty_return (vty, ret);
+}
+
+int
+peer_prefix_list_unset_vty (struct vty *vty, char *ip_str, afi_t afi,
+ safi_t safi, char *direct_str)
+{
+ int ret;
+ struct peer *peer;
+ int direct = FILTER_IN;
+
+ peer = peer_and_group_lookup_vty (vty, ip_str);
+ if (! peer)
+ return CMD_WARNING;
+
+ /* Check filter direction. */
+ if (strncmp (direct_str, "i", 1) == 0)
+ direct = FILTER_IN;
+ else if (strncmp (direct_str, "o", 1) == 0)
+ direct = FILTER_OUT;
+
+ ret = peer_prefix_list_unset (peer, afi, safi, direct);
+
+ return bgp_vty_return (vty, ret);
+}
+
+DEFUN (neighbor_prefix_list,
+ neighbor_prefix_list_cmd,
+ NEIGHBOR_CMD2 "prefix-list WORD (in|out)",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Filter updates to/from this neighbor\n"
+ "Name of a prefix list\n"
+ "Filter incoming updates\n"
+ "Filter outgoing updates\n")
+{
+ return peer_prefix_list_set_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty), argv[1], argv[2]);
+}
+
+DEFUN (no_neighbor_prefix_list,
+ no_neighbor_prefix_list_cmd,
+ NO_NEIGHBOR_CMD2 "prefix-list WORD (in|out)",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Filter updates to/from this neighbor\n"
+ "Name of a prefix list\n"
+ "Filter incoming updates\n"
+ "Filter outgoing updates\n")
+{
+ return peer_prefix_list_unset_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty), argv[2]);
+}
+
+int
+peer_aslist_set_vty (struct vty *vty, char *ip_str, afi_t afi, safi_t safi,
+ char *name_str, char *direct_str)
+{
+ int ret;
+ struct peer *peer;
+ int direct = FILTER_IN;
+
+ peer = peer_and_group_lookup_vty (vty, ip_str);
+ if (! peer)
+ return CMD_WARNING;
+
+ /* Check filter direction. */
+ if (strncmp (direct_str, "i", 1) == 0)
+ direct = FILTER_IN;
+ else if (strncmp (direct_str, "o", 1) == 0)
+ direct = FILTER_OUT;
+
+ ret = peer_aslist_set (peer, afi, safi, direct, name_str);
+
+ return bgp_vty_return (vty, ret);
+}
+
+int
+peer_aslist_unset_vty (struct vty *vty, char *ip_str, afi_t afi, safi_t safi,
+ char *direct_str)
+{
+ int ret;
+ struct peer *peer;
+ int direct = FILTER_IN;
+
+ peer = peer_and_group_lookup_vty (vty, ip_str);
+ if (! peer)
+ return CMD_WARNING;
+
+ /* Check filter direction. */
+ if (strncmp (direct_str, "i", 1) == 0)
+ direct = FILTER_IN;
+ else if (strncmp (direct_str, "o", 1) == 0)
+ direct = FILTER_OUT;
+
+ ret = peer_aslist_unset (peer, afi, safi, direct);
+
+ return bgp_vty_return (vty, ret);
+}
+
+DEFUN (neighbor_filter_list,
+ neighbor_filter_list_cmd,
+ NEIGHBOR_CMD2 "filter-list WORD (in|out)",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Establish BGP filters\n"
+ "AS path access-list name\n"
+ "Filter incoming routes\n"
+ "Filter outgoing routes\n")
+{
+ return peer_aslist_set_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty), argv[1], argv[2]);
+}
+
+DEFUN (no_neighbor_filter_list,
+ no_neighbor_filter_list_cmd,
+ NO_NEIGHBOR_CMD2 "filter-list WORD (in|out)",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Establish BGP filters\n"
+ "AS path access-list name\n"
+ "Filter incoming routes\n"
+ "Filter outgoing routes\n")
+{
+ return peer_aslist_unset_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty), argv[2]);
+}
+
+/* Set route-map to the peer. */
+int
+peer_route_map_set_vty (struct vty *vty, char *ip_str, afi_t afi, safi_t safi,
+ char *name_str, char *direct_str)
+{
+ int ret;
+ struct peer *peer;
+ int direct = FILTER_IN;
+
+ peer = peer_and_group_lookup_vty (vty, ip_str);
+ if (! peer)
+ return CMD_WARNING;
+
+ /* Check filter direction. */
+ if (strncmp (direct_str, "i", 1) == 0)
+ direct = FILTER_IN;
+ else if (strncmp (direct_str, "o", 1) == 0)
+ direct = FILTER_OUT;
+
+ ret = peer_route_map_set (peer, afi, safi, direct, name_str);
+
+ return bgp_vty_return (vty, ret);
+}
+
+int
+peer_route_map_unset_vty (struct vty *vty, char *ip_str, afi_t afi,
+ safi_t safi, char *direct_str)
+{
+ int ret;
+ struct peer *peer;
+ int direct = FILTER_IN;
+
+ peer = peer_and_group_lookup_vty (vty, ip_str);
+ if (! peer)
+ return CMD_WARNING;
+
+ /* Check filter direction. */
+ if (strncmp (direct_str, "i", 1) == 0)
+ direct = FILTER_IN;
+ else if (strncmp (direct_str, "o", 1) == 0)
+
+ direct = FILTER_OUT;
+
+ ret = peer_route_map_unset (peer, afi, safi, direct);
+
+ return bgp_vty_return (vty, ret);
+}
+
+DEFUN (neighbor_route_map,
+ neighbor_route_map_cmd,
+ NEIGHBOR_CMD2 "route-map WORD (in|out)",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Apply route map to neighbor\n"
+ "Name of route map\n"
+ "Apply map to incoming routes\n"
+ "Apply map to outbound routes\n")
+{
+ return peer_route_map_set_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty), argv[1], argv[2]);
+}
+
+DEFUN (no_neighbor_route_map,
+ no_neighbor_route_map_cmd,
+ NO_NEIGHBOR_CMD2 "route-map WORD (in|out)",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Apply route map to neighbor\n"
+ "Name of route map\n"
+ "Apply map to incoming routes\n"
+ "Apply map to outbound routes\n")
+{
+ return peer_route_map_unset_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty), argv[2]);
+}
+
+/* Set unsuppress-map to the peer. */
+int
+peer_unsuppress_map_set_vty (struct vty *vty, char *ip_str, afi_t afi,
+ safi_t safi, char *name_str)
+{
+ int ret;
+ struct peer *peer;
+
+ peer = peer_and_group_lookup_vty (vty, ip_str);
+ if (! peer)
+ return CMD_WARNING;
+
+ ret = peer_unsuppress_map_set (peer, afi, safi, name_str);
+
+ return bgp_vty_return (vty, ret);
+}
+
+/* Unset route-map from the peer. */
+int
+peer_unsuppress_map_unset_vty (struct vty *vty, char *ip_str, afi_t afi,
+ safi_t safi)
+{
+ int ret;
+ struct peer *peer;
+
+ peer = peer_and_group_lookup_vty (vty, ip_str);
+ if (! peer)
+ return CMD_WARNING;
+
+ ret = peer_unsuppress_map_unset (peer, afi, safi);
+
+ return bgp_vty_return (vty, ret);
+}
+
+DEFUN (neighbor_unsuppress_map,
+ neighbor_unsuppress_map_cmd,
+ NEIGHBOR_CMD2 "unsuppress-map WORD",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Route-map to selectively unsuppress suppressed routes\n"
+ "Name of route map\n")
+{
+ return peer_unsuppress_map_set_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty), argv[1]);
+}
+
+DEFUN (no_neighbor_unsuppress_map,
+ no_neighbor_unsuppress_map_cmd,
+ NO_NEIGHBOR_CMD2 "unsuppress-map WORD",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Route-map to selectively unsuppress suppressed routes\n"
+ "Name of route map\n")
+{
+ return peer_unsuppress_map_unset_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty));
+}
+
+int
+peer_maximum_prefix_set_vty (struct vty *vty, char *ip_str, afi_t afi,
+ safi_t safi, char *num_str, int warning)
+{
+ int ret;
+ struct peer *peer;
+ u_int32_t max;
+
+ peer = peer_and_group_lookup_vty (vty, ip_str);
+ if (! peer)
+ return CMD_WARNING;
+
+ VTY_GET_INTEGER ("maxmum number", max, num_str);
+
+ ret = peer_maximum_prefix_set (peer, afi, safi, max, warning);
+
+ return bgp_vty_return (vty, ret);
+}
+
+int
+peer_maximum_prefix_unset_vty (struct vty *vty, char *ip_str, afi_t afi,
+ safi_t safi)
+{
+ int ret;
+ struct peer *peer;
+
+ peer = peer_and_group_lookup_vty (vty, ip_str);
+ if (! peer)
+ return CMD_WARNING;
+
+ ret = peer_maximum_prefix_unset (peer, afi, safi);
+
+ return bgp_vty_return (vty, ret);
+}
+
+/* Maximum number of prefix configuration. prefix count is different
+ for each peer configuration. So this configuration can be set for
+ each peer configuration. */
+DEFUN (neighbor_maximum_prefix,
+ neighbor_maximum_prefix_cmd,
+ NEIGHBOR_CMD2 "maximum-prefix <1-4294967295>",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Maximum number of prefix accept from this peer\n"
+ "maximum no. of prefix limit\n")
+{
+ return peer_maximum_prefix_set_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty), argv[1], 0);
+}
+
+DEFUN (neighbor_maximum_prefix_warning,
+ neighbor_maximum_prefix_warning_cmd,
+ NEIGHBOR_CMD2 "maximum-prefix <1-4294967295> warning-only",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Maximum number of prefix accept from this peer\n"
+ "maximum no. of prefix limit\n"
+ "Only give warning message when limit is exceeded\n")
+{
+ return peer_maximum_prefix_set_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty), argv[1], 1);
+}
+
+DEFUN (no_neighbor_maximum_prefix,
+ no_neighbor_maximum_prefix_cmd,
+ NO_NEIGHBOR_CMD2 "maximum-prefix",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Maximum number of prefix accept from this peer\n")
+{
+ return peer_maximum_prefix_unset_vty (vty, argv[0], bgp_node_afi (vty),
+ bgp_node_safi (vty));
+}
+
+ALIAS (no_neighbor_maximum_prefix,
+ no_neighbor_maximum_prefix_val_cmd,
+ NO_NEIGHBOR_CMD2 "maximum-prefix <1-4294967295>",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Maximum number of prefix accept from this peer\n"
+ "maximum no. of prefix limit\n")
+
+ALIAS (no_neighbor_maximum_prefix,
+ no_neighbor_maximum_prefix_val2_cmd,
+ NO_NEIGHBOR_CMD2 "maximum-prefix <1-4294967295> warning-only",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Maximum number of prefix accept from this peer\n"
+ "maximum no. of prefix limit\n"
+ "Only give warning message when limit is exceeded\n")
+
+/* "neighbor allowas-in" */
+DEFUN (neighbor_allowas_in,
+ neighbor_allowas_in_cmd,
+ NEIGHBOR_CMD2 "allowas-in",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Accept as-path with my AS present in it\n")
+{
+ int ret;
+ struct peer *peer;
+ int allow_num;
+
+ peer = peer_and_group_lookup_vty (vty, argv[0]);
+ if (! peer)
+ return CMD_WARNING;
+
+ if (argc == 1)
+ allow_num = 3;
+ else
+ VTY_GET_INTEGER_RANGE ("AS number", allow_num, argv[1], 1, 10);
+
+ ret = peer_allowas_in_set (peer, bgp_node_afi (vty), bgp_node_safi (vty),
+ allow_num);
+
+ return bgp_vty_return (vty, ret);
+}
+
+ALIAS (neighbor_allowas_in,
+ neighbor_allowas_in_arg_cmd,
+ NEIGHBOR_CMD2 "allowas-in <1-10>",
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "Accept as-path with my AS present in it\n"
+ "Number of occurances of AS number\n")
+
+DEFUN (no_neighbor_allowas_in,
+ no_neighbor_allowas_in_cmd,
+ NO_NEIGHBOR_CMD2 "allowas-in",
+ NO_STR
+ NEIGHBOR_STR
+ NEIGHBOR_ADDR_STR2
+ "allow local ASN appears in aspath attribute\n")
+{
+ int ret;
+ struct peer *peer;
+
+ peer = peer_and_group_lookup_vty (vty, argv[0]);
+ if (! peer)
+ return CMD_WARNING;
+
+ ret = peer_allowas_in_unset (peer, bgp_node_afi (vty), bgp_node_safi (vty));
+
+ return bgp_vty_return (vty, ret);
+}
+
+/* Address family configuration. */
+DEFUN (address_family_ipv4,
+ address_family_ipv4_cmd,
+ "address-family ipv4",
+ "Enter Address Family command mode\n"
+ "Address family\n")
+{
+ vty->node = BGP_IPV4_NODE;
+ return CMD_SUCCESS;
+}
+
+DEFUN (address_family_ipv4_safi,
+ address_family_ipv4_safi_cmd,
+ "address-family ipv4 (unicast|multicast)",
+ "Enter Address Family command mode\n"
+ "Address family\n"
+ "Address Family modifier\n"
+ "Address Family modifier\n")
+{
+ if (strncmp (argv[0], "m", 1) == 0)
+ vty->node = BGP_IPV4M_NODE;
+ else
+ vty->node = BGP_IPV4_NODE;
+
+ return CMD_SUCCESS;
+}
+
+DEFUN (address_family_ipv6_unicast,
+ address_family_ipv6_unicast_cmd,
+ "address-family ipv6 unicast",
+ "Enter Address Family command mode\n"
+ "Address family\n"
+ "unicast\n")
+{
+ vty->node = BGP_IPV6_NODE;
+ return CMD_SUCCESS;
+}
+
+ALIAS (address_family_ipv6_unicast,
+ address_family_ipv6_cmd,
+ "address-family ipv6",
+ "Enter Address Family command mode\n"
+ "Address family\n")
+
+DEFUN (address_family_vpnv4,
+ address_family_vpnv4_cmd,
+ "address-family vpnv4",
+ "Enter Address Family command mode\n"
+ "Address family\n")
+{
+ vty->node = BGP_VPNV4_NODE;
+ return CMD_SUCCESS;
+}
+
+ALIAS (address_family_vpnv4,
+ address_family_vpnv4_unicast_cmd,
+ "address-family vpnv4 unicast",
+ "Enter Address Family command mode\n"
+ "Address family\n"
+ "Address Family Modifier\n")
+
+DEFUN (exit_address_family,
+ exit_address_family_cmd,
+ "exit-address-family",
+ "Exit from Address Family configuration mode\n")
+{
+ if (vty->node == BGP_IPV4M_NODE
+ || vty->node == BGP_VPNV4_NODE
+ || vty->node == BGP_IPV6_NODE)
+ vty->node = BGP_NODE;
+ return CMD_SUCCESS;
+}
+
+/* BGP clear sort. */
+enum clear_sort
+{
+ clear_all,
+ clear_peer,
+ clear_group,
+ clear_external,
+ clear_as
+};
+
+void
+bgp_clear_vty_error (struct vty *vty, struct peer *peer, afi_t afi,
+ safi_t safi, int error)
+{
+ switch (error)
+ {
+ case BGP_ERR_AF_UNCONFIGURED:
+ vty_out (vty,
+ "%%BGP: Enable %s %s address family for the neighbor %s%s",
+ afi == AFI_IP6 ? "IPv6" : safi == SAFI_MPLS_VPN ? "VPNv4" : "IPv4",
+ safi == SAFI_MULTICAST ? "Multicast" : "Unicast",
+ peer->host, VTY_NEWLINE);
+ break;
+ case BGP_ERR_SOFT_RECONFIG_UNCONFIGURED:
+ vty_out (vty, "%%BGP: Inbound soft reconfig for %s not possible as it%s has neither refresh capability, nor inbound soft reconfig%s", peer->host, VTY_NEWLINE, VTY_NEWLINE);
+ break;
+ default:
+ break;
+ }
+}
+
+/* `clear ip bgp' functions. */
+int
+bgp_clear (struct vty *vty, struct bgp *bgp, afi_t afi, safi_t safi,
+ enum clear_sort sort,enum bgp_clear_type stype, char *arg)
+{
+ int ret;
+ struct peer *peer;
+ struct listnode *nn;
+
+ /* Clear all neighbors. */
+ if (sort == clear_all)
+ {
+ LIST_LOOP (bgp->peer, peer, nn)
+ {
+ if (stype == BGP_CLEAR_SOFT_NONE)
+ ret = peer_clear (peer);
+ else
+ ret = peer_clear_soft (peer, afi, safi, stype);
+
+ if (ret < 0)
+ bgp_clear_vty_error (vty, peer, afi, safi, ret);
+ }
+ return 0;
+ }
+
+ /* Clear specified neighbors. */
+ if (sort == clear_peer)
+ {
+ union sockunion su;
+ int ret;
+
+ /* Make sockunion for lookup. */
+ ret = str2sockunion (arg, &su);
+ if (ret < 0)
+ {
+ vty_out (vty, "Malformed address: %s%s", arg, VTY_NEWLINE);
+ return -1;
+ }
+ peer = peer_lookup (bgp, &su);
+ if (! peer)
+ {
+ vty_out (vty, "%%BGP: Unknown neighbor - \"%s\"%s", arg, VTY_NEWLINE);
+ return -1;
+ }
+
+ if (stype == BGP_CLEAR_SOFT_NONE)
+ ret = peer_clear (peer);
+ else
+ ret = peer_clear_soft (peer, afi, safi, stype);
+
+ if (ret < 0)
+ bgp_clear_vty_error (vty, peer, afi, safi, ret);
+
+ return 0;
+ }
+
+ /* Clear all peer-group members. */
+ if (sort == clear_group)
+ {
+ struct peer_group *group;
+
+ group = peer_group_lookup (bgp, arg);
+ if (! group)
+ {
+ vty_out (vty, "%%BGP: No such peer-group %s%s", arg, VTY_NEWLINE);
+ return -1;
+ }
+
+ LIST_LOOP (group->peer, peer, nn)
+ {
+ if (stype == BGP_CLEAR_SOFT_NONE)
+ {
+ ret = peer_clear (peer);
+ continue;
+ }
+
+ if (! peer->af_group[afi][safi])
+ continue;
+
+ ret = peer_clear_soft (peer, afi, safi, stype);
+
+ if (ret < 0)
+ bgp_clear_vty_error (vty, peer, afi, safi, ret);
+ }
+ return 0;
+ }
+
+ if (sort == clear_external)
+ {
+ LIST_LOOP (bgp->peer, peer, nn)
+ {
+ if (peer_sort (peer) == BGP_PEER_IBGP)
+ continue;
+
+ if (stype == BGP_CLEAR_SOFT_NONE)
+ ret = peer_clear (peer);
+ else
+ ret = peer_clear_soft (peer, afi, safi, stype);
+
+ if (ret < 0)
+ bgp_clear_vty_error (vty, peer, afi, safi, ret);
+ }
+ return 0;
+ }
+
+ if (sort == clear_as)
+ {
+ as_t as;
+ unsigned long as_ul;
+ char *endptr = NULL;
+ int find = 0;
+
+ as_ul = strtoul(arg, &endptr, 10);
+
+ if ((as_ul == ULONG_MAX) || (*endptr != '\0') || (as_ul > USHRT_MAX))
+ {
+ vty_out (vty, "Invalid AS number%s", VTY_NEWLINE);
+ return -1;
+ }
+ as = (as_t) as_ul;
+
+ LIST_LOOP (bgp->peer, peer, nn)
+ {
+ if (peer->as != as)
+ continue;
+
+ find = 1;
+ if (stype == BGP_CLEAR_SOFT_NONE)
+ ret = peer_clear (peer);
+ else
+ ret = peer_clear_soft (peer, afi, safi, stype);
+
+ if (ret < 0)
+ bgp_clear_vty_error (vty, peer, afi, safi, ret);
+ }
+ if (! find)
+ vty_out (vty, "%%BGP: No peer is configured with AS %s%s", arg,
+ VTY_NEWLINE);
+ return 0;
+ }
+
+ return 0;
+}
+
+int
+bgp_clear_vty (struct vty *vty, char *name, afi_t afi, safi_t safi,
+ enum clear_sort sort, enum bgp_clear_type stype, char *arg)
+{
+ int ret;
+ struct bgp *bgp;
+
+ /* BGP structure lookup. */
+ if (name)
+ {
+ bgp = bgp_lookup_by_name (name);
+ if (bgp == NULL)
+ {
+ vty_out (vty, "Can't find BGP view %s%s", name, VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+ }
+ else
+ {
+ bgp = bgp_get_default ();
+ if (bgp == NULL)
+ {
+ vty_out (vty, "No BGP process is configured%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+ }
+
+ ret = bgp_clear (vty, bgp, afi, safi, sort, stype, arg);
+ if (ret < 0)
+ return CMD_WARNING;
+
+ return CMD_SUCCESS;
+}
+
+DEFUN (clear_ip_bgp_all,
+ clear_ip_bgp_all_cmd,
+ "clear ip bgp *",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all peers\n")
+{
+ if (argc == 1)
+ return bgp_clear_vty (vty, argv[0], 0, 0, clear_all, BGP_CLEAR_SOFT_NONE, NULL);
+
+ return bgp_clear_vty (vty, NULL, 0, 0, clear_all, BGP_CLEAR_SOFT_NONE, NULL);
+}
+
+ALIAS (clear_ip_bgp_all,
+ clear_bgp_all_cmd,
+ "clear bgp *",
+ CLEAR_STR
+ BGP_STR
+ "Clear all peers\n")
+
+ALIAS (clear_ip_bgp_all,
+ clear_bgp_ipv6_all_cmd,
+ "clear bgp ipv6 *",
+ CLEAR_STR
+ BGP_STR
+ "Address family\n"
+ "Clear all peers\n")
+
+ALIAS (clear_ip_bgp_all,
+ clear_ip_bgp_instance_all_cmd,
+ "clear ip bgp view WORD *",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "BGP view\n"
+ "view name\n"
+ "Clear all peers\n")
+
+ALIAS (clear_ip_bgp_all,
+ clear_bgp_instance_all_cmd,
+ "clear bgp view WORD *",
+ CLEAR_STR
+ BGP_STR
+ "BGP view\n"
+ "view name\n"
+ "Clear all peers\n")
+
+DEFUN (clear_ip_bgp_peer,
+ clear_ip_bgp_peer_cmd,
+ "clear ip bgp (A.B.C.D|X:X::X:X)",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "BGP neighbor IP address to clear\n"
+ "BGP IPv6 neighbor to clear\n")
+{
+ return bgp_clear_vty (vty, NULL, 0, 0, clear_peer, BGP_CLEAR_SOFT_NONE, argv[0]);
+}
+
+ALIAS (clear_ip_bgp_peer,
+ clear_bgp_peer_cmd,
+ "clear bgp (A.B.C.D|X:X::X:X)",
+ CLEAR_STR
+ BGP_STR
+ "BGP neighbor address to clear\n"
+ "BGP IPv6 neighbor to clear\n")
+
+ALIAS (clear_ip_bgp_peer,
+ clear_bgp_ipv6_peer_cmd,
+ "clear bgp ipv6 (A.B.C.D|X:X::X:X)",
+ CLEAR_STR
+ BGP_STR
+ "Address family\n"
+ "BGP neighbor address to clear\n"
+ "BGP IPv6 neighbor to clear\n")
+
+DEFUN (clear_ip_bgp_peer_group,
+ clear_ip_bgp_peer_group_cmd,
+ "clear ip bgp peer-group WORD",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all members of peer-group\n"
+ "BGP peer-group name\n")
+{
+ return bgp_clear_vty (vty, NULL, 0, 0, clear_group, BGP_CLEAR_SOFT_NONE, argv[0]);
+}
+
+ALIAS (clear_ip_bgp_peer_group,
+ clear_bgp_peer_group_cmd,
+ "clear bgp peer-group WORD",
+ CLEAR_STR
+ BGP_STR
+ "Clear all members of peer-group\n"
+ "BGP peer-group name\n")
+
+ALIAS (clear_ip_bgp_peer_group,
+ clear_bgp_ipv6_peer_group_cmd,
+ "clear bgp ipv6 peer-group WORD",
+ CLEAR_STR
+ BGP_STR
+ "Address family\n"
+ "Clear all members of peer-group\n"
+ "BGP peer-group name\n")
+
+DEFUN (clear_ip_bgp_external,
+ clear_ip_bgp_external_cmd,
+ "clear ip bgp external",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all external peers\n")
+{
+ return bgp_clear_vty (vty, NULL, 0, 0, clear_external, BGP_CLEAR_SOFT_NONE, NULL);
+}
+
+ALIAS (clear_ip_bgp_external,
+ clear_bgp_external_cmd,
+ "clear bgp external",
+ CLEAR_STR
+ BGP_STR
+ "Clear all external peers\n")
+
+ALIAS (clear_ip_bgp_external,
+ clear_bgp_ipv6_external_cmd,
+ "clear bgp ipv6 external",
+ CLEAR_STR
+ BGP_STR
+ "Address family\n"
+ "Clear all external peers\n")
+
+DEFUN (clear_ip_bgp_as,
+ clear_ip_bgp_as_cmd,
+ "clear ip bgp <1-65535>",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear peers with the AS number\n")
+{
+ return bgp_clear_vty (vty, NULL, 0, 0, clear_as, BGP_CLEAR_SOFT_NONE, argv[0]);
+}
+
+ALIAS (clear_ip_bgp_as,
+ clear_bgp_as_cmd,
+ "clear bgp <1-65535>",
+ CLEAR_STR
+ BGP_STR
+ "Clear peers with the AS number\n")
+
+ALIAS (clear_ip_bgp_as,
+ clear_bgp_ipv6_as_cmd,
+ "clear bgp ipv6 <1-65535>",
+ CLEAR_STR
+ BGP_STR
+ "Address family\n"
+ "Clear peers with the AS number\n")
+
+/* Outbound soft-reconfiguration */
+DEFUN (clear_ip_bgp_all_soft_out,
+ clear_ip_bgp_all_soft_out_cmd,
+ "clear ip bgp * soft out",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all peers\n"
+ "Soft reconfig\n"
+ "Soft reconfig outbound update\n")
+{
+ if (argc == 1)
+ return bgp_clear_vty (vty, argv[0], AFI_IP, SAFI_UNICAST, clear_all,
+ BGP_CLEAR_SOFT_OUT, NULL);
+
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_all,
+ BGP_CLEAR_SOFT_OUT, NULL);
+}
+
+ALIAS (clear_ip_bgp_all_soft_out,
+ clear_ip_bgp_all_out_cmd,
+ "clear ip bgp * out",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all peers\n"
+ "Soft reconfig outbound update\n")
+
+ALIAS (clear_ip_bgp_all_soft_out,
+ clear_ip_bgp_instance_all_soft_out_cmd,
+ "clear ip bgp view WORD * soft out",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "BGP view\n"
+ "view name\n"
+ "Clear all peers\n"
+ "Soft reconfig\n"
+ "Soft reconfig outbound update\n")
+
+DEFUN (clear_ip_bgp_all_ipv4_soft_out,
+ clear_ip_bgp_all_ipv4_soft_out_cmd,
+ "clear ip bgp * ipv4 (unicast|multicast) soft out",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all peers\n"
+ "Address family\n"
+ "Address Family modifier\n"
+ "Address Family modifier\n"
+ "Soft reconfig\n"
+ "Soft reconfig outbound update\n")
+{
+ if (strncmp (argv[0], "m", 1) == 0)
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_MULTICAST, clear_all,
+ BGP_CLEAR_SOFT_OUT, NULL);
+
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_all,
+ BGP_CLEAR_SOFT_OUT, NULL);
+}
+
+ALIAS (clear_ip_bgp_all_ipv4_soft_out,
+ clear_ip_bgp_all_ipv4_out_cmd,
+ "clear ip bgp * ipv4 (unicast|multicast) out",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all peers\n"
+ "Address family\n"
+ "Address Family modifier\n"
+ "Address Family modifier\n"
+ "Soft reconfig outbound update\n")
+
+DEFUN (clear_ip_bgp_instance_all_ipv4_soft_out,
+ clear_ip_bgp_instance_all_ipv4_soft_out_cmd,
+ "clear ip bgp view WORD * ipv4 (unicast|multicast) soft out",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "BGP view\n"
+ "view name\n"
+ "Clear all peers\n"
+ "Address family\n"
+ "Address Family modifier\n"
+ "Address Family modifier\n"
+ "Soft reconfig outbound update\n")
+{
+ if (strncmp (argv[1], "m", 1) == 0)
+ return bgp_clear_vty (vty, argv[0], AFI_IP, SAFI_MULTICAST, clear_all,
+ BGP_CLEAR_SOFT_OUT, NULL);
+
+ return bgp_clear_vty (vty, argv[0], AFI_IP, SAFI_UNICAST, clear_all,
+ BGP_CLEAR_SOFT_OUT, NULL);
+}
+
+DEFUN (clear_ip_bgp_all_vpnv4_soft_out,
+ clear_ip_bgp_all_vpnv4_soft_out_cmd,
+ "clear ip bgp * vpnv4 unicast soft out",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all peers\n"
+ "Address family\n"
+ "Address Family Modifier\n"
+ "Soft reconfig\n"
+ "Soft reconfig outbound update\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_MPLS_VPN, clear_all,
+ BGP_CLEAR_SOFT_OUT, NULL);
+}
+
+ALIAS (clear_ip_bgp_all_vpnv4_soft_out,
+ clear_ip_bgp_all_vpnv4_out_cmd,
+ "clear ip bgp * vpnv4 unicast out",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all peers\n"
+ "Address family\n"
+ "Address Family Modifier\n"
+ "Soft reconfig outbound update\n")
+
+DEFUN (clear_bgp_all_soft_out,
+ clear_bgp_all_soft_out_cmd,
+ "clear bgp * soft out",
+ CLEAR_STR
+ BGP_STR
+ "Clear all peers\n"
+ "Soft reconfig\n"
+ "Soft reconfig outbound update\n")
+{
+ if (argc == 1)
+ return bgp_clear_vty (vty, argv[0], AFI_IP6, SAFI_UNICAST, clear_all,
+ BGP_CLEAR_SOFT_OUT, NULL);
+
+ return bgp_clear_vty (vty, NULL, AFI_IP6, SAFI_UNICAST, clear_all,
+ BGP_CLEAR_SOFT_OUT, NULL);
+}
+
+ALIAS (clear_bgp_all_soft_out,
+ clear_bgp_instance_all_soft_out_cmd,
+ "clear bgp view WORD * soft out",
+ CLEAR_STR
+ BGP_STR
+ "BGP view\n"
+ "view name\n"
+ "Clear all peers\n"
+ "Soft reconfig\n"
+ "Soft reconfig outbound update\n")
+
+ALIAS (clear_bgp_all_soft_out,
+ clear_bgp_all_out_cmd,
+ "clear bgp * out",
+ CLEAR_STR
+ BGP_STR
+ "Clear all peers\n"
+ "Soft reconfig outbound update\n")
+
+ALIAS (clear_bgp_all_soft_out,
+ clear_bgp_ipv6_all_soft_out_cmd,
+ "clear bgp ipv6 * soft out",
+ CLEAR_STR
+ BGP_STR
+ "Address family\n"
+ "Clear all peers\n"
+ "Soft reconfig\n"
+ "Soft reconfig outbound update\n")
+
+ALIAS (clear_bgp_all_soft_out,
+ clear_bgp_ipv6_all_out_cmd,
+ "clear bgp ipv6 * out",
+ CLEAR_STR
+ BGP_STR
+ "Address family\n"
+ "Clear all peers\n"
+ "Soft reconfig outbound update\n")
+
+DEFUN (clear_ip_bgp_peer_soft_out,
+ clear_ip_bgp_peer_soft_out_cmd,
+ "clear ip bgp A.B.C.D soft out",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "BGP neighbor address to clear\n"
+ "Soft reconfig\n"
+ "Soft reconfig outbound update\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_peer,
+ BGP_CLEAR_SOFT_OUT, argv[0]);
+}
+
+ALIAS (clear_ip_bgp_peer_soft_out,
+ clear_ip_bgp_peer_out_cmd,
+ "clear ip bgp A.B.C.D out",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "BGP neighbor address to clear\n"
+ "Soft reconfig outbound update\n")
+
+DEFUN (clear_ip_bgp_peer_ipv4_soft_out,
+ clear_ip_bgp_peer_ipv4_soft_out_cmd,
+ "clear ip bgp A.B.C.D ipv4 (unicast|multicast) soft out",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "BGP neighbor address to clear\n"
+ "Address family\n"
+ "Address Family modifier\n"
+ "Address Family modifier\n"
+ "Soft reconfig\n"
+ "Soft reconfig outbound update\n")
+{
+ if (strncmp (argv[1], "m", 1) == 0)
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_MULTICAST, clear_peer,
+ BGP_CLEAR_SOFT_OUT, argv[0]);
+
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_peer,
+ BGP_CLEAR_SOFT_OUT, argv[0]);
+}
+
+ALIAS (clear_ip_bgp_peer_ipv4_soft_out,
+ clear_ip_bgp_peer_ipv4_out_cmd,
+ "clear ip bgp A.B.C.D ipv4 (unicast|multicast) out",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "BGP neighbor address to clear\n"
+ "Address family\n"
+ "Address Family modifier\n"
+ "Address Family modifier\n"
+ "Soft reconfig outbound update\n")
+
+DEFUN (clear_ip_bgp_peer_vpnv4_soft_out,
+ clear_ip_bgp_peer_vpnv4_soft_out_cmd,
+ "clear ip bgp A.B.C.D vpnv4 unicast soft out",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "BGP neighbor address to clear\n"
+ "Address family\n"
+ "Address Family Modifier\n"
+ "Soft reconfig\n"
+ "Soft reconfig outbound update\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_MPLS_VPN, clear_peer,
+ BGP_CLEAR_SOFT_OUT, argv[0]);
+}
+
+ALIAS (clear_ip_bgp_peer_vpnv4_soft_out,
+ clear_ip_bgp_peer_vpnv4_out_cmd,
+ "clear ip bgp A.B.C.D vpnv4 unicast out",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "BGP neighbor address to clear\n"
+ "Address family\n"
+ "Address Family Modifier\n"
+ "Soft reconfig outbound update\n")
+
+DEFUN (clear_bgp_peer_soft_out,
+ clear_bgp_peer_soft_out_cmd,
+ "clear bgp (A.B.C.D|X:X::X:X) soft out",
+ CLEAR_STR
+ BGP_STR
+ "BGP neighbor address to clear\n"
+ "BGP IPv6 neighbor to clear\n"
+ "Soft reconfig\n"
+ "Soft reconfig outbound update\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP6, SAFI_UNICAST, clear_peer,
+ BGP_CLEAR_SOFT_OUT, argv[0]);
+}
+
+ALIAS (clear_bgp_peer_soft_out,
+ clear_bgp_ipv6_peer_soft_out_cmd,
+ "clear bgp ipv6 (A.B.C.D|X:X::X:X) soft out",
+ CLEAR_STR
+ BGP_STR
+ "Address family\n"
+ "BGP neighbor address to clear\n"
+ "BGP IPv6 neighbor to clear\n"
+ "Soft reconfig\n"
+ "Soft reconfig outbound update\n")
+
+ALIAS (clear_bgp_peer_soft_out,
+ clear_bgp_peer_out_cmd,
+ "clear bgp (A.B.C.D|X:X::X:X) out",
+ CLEAR_STR
+ BGP_STR
+ "BGP neighbor address to clear\n"
+ "BGP IPv6 neighbor to clear\n"
+ "Soft reconfig outbound update\n")
+
+ALIAS (clear_bgp_peer_soft_out,
+ clear_bgp_ipv6_peer_out_cmd,
+ "clear bgp ipv6 (A.B.C.D|X:X::X:X) out",
+ CLEAR_STR
+ BGP_STR
+ "Address family\n"
+ "BGP neighbor address to clear\n"
+ "BGP IPv6 neighbor to clear\n"
+ "Soft reconfig outbound update\n")
+
+DEFUN (clear_ip_bgp_peer_group_soft_out,
+ clear_ip_bgp_peer_group_soft_out_cmd,
+ "clear ip bgp peer-group WORD soft out",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all members of peer-group\n"
+ "BGP peer-group name\n"
+ "Soft reconfig\n"
+ "Soft reconfig outbound update\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_group,
+ BGP_CLEAR_SOFT_OUT, argv[0]);
+}
+
+ALIAS (clear_ip_bgp_peer_group_soft_out,
+ clear_ip_bgp_peer_group_out_cmd,
+ "clear ip bgp peer-group WORD out",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all members of peer-group\n"
+ "BGP peer-group name\n"
+ "Soft reconfig outbound update\n")
+
+DEFUN (clear_ip_bgp_peer_group_ipv4_soft_out,
+ clear_ip_bgp_peer_group_ipv4_soft_out_cmd,
+ "clear ip bgp peer-group WORD ipv4 (unicast|multicast) soft out",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all members of peer-group\n"
+ "BGP peer-group name\n"
+ "Address family\n"
+ "Address Family modifier\n"
+ "Address Family modifier\n"
+ "Soft reconfig\n"
+ "Soft reconfig outbound update\n")
+{
+ if (strncmp (argv[1], "m", 1) == 0)
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_MULTICAST, clear_group,
+ BGP_CLEAR_SOFT_OUT, argv[0]);
+
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_group,
+ BGP_CLEAR_SOFT_OUT, argv[0]);
+}
+
+ALIAS (clear_ip_bgp_peer_group_ipv4_soft_out,
+ clear_ip_bgp_peer_group_ipv4_out_cmd,
+ "clear ip bgp peer-group WORD ipv4 (unicast|multicast) out",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all members of peer-group\n"
+ "BGP peer-group name\n"
+ "Address family\n"
+ "Address Family modifier\n"
+ "Address Family modifier\n"
+ "Soft reconfig outbound update\n")
+
+DEFUN (clear_bgp_peer_group_soft_out,
+ clear_bgp_peer_group_soft_out_cmd,
+ "clear bgp peer-group WORD soft out",
+ CLEAR_STR
+ BGP_STR
+ "Clear all members of peer-group\n"
+ "BGP peer-group name\n"
+ "Soft reconfig\n"
+ "Soft reconfig outbound update\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP6, SAFI_UNICAST, clear_group,
+ BGP_CLEAR_SOFT_OUT, argv[0]);
+}
+
+ALIAS (clear_bgp_peer_group_soft_out,
+ clear_bgp_ipv6_peer_group_soft_out_cmd,
+ "clear bgp ipv6 peer-group WORD soft out",
+ CLEAR_STR
+ BGP_STR
+ "Address family\n"
+ "Clear all members of peer-group\n"
+ "BGP peer-group name\n"
+ "Soft reconfig\n"
+ "Soft reconfig outbound update\n")
+
+ALIAS (clear_bgp_peer_group_soft_out,
+ clear_bgp_peer_group_out_cmd,
+ "clear bgp peer-group WORD out",
+ CLEAR_STR
+ BGP_STR
+ "Clear all members of peer-group\n"
+ "BGP peer-group name\n"
+ "Soft reconfig outbound update\n")
+
+ALIAS (clear_bgp_peer_group_soft_out,
+ clear_bgp_ipv6_peer_group_out_cmd,
+ "clear bgp ipv6 peer-group WORD out",
+ CLEAR_STR
+ BGP_STR
+ "Address family\n"
+ "Clear all members of peer-group\n"
+ "BGP peer-group name\n"
+ "Soft reconfig outbound update\n")
+
+DEFUN (clear_ip_bgp_external_soft_out,
+ clear_ip_bgp_external_soft_out_cmd,
+ "clear ip bgp external soft out",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all external peers\n"
+ "Soft reconfig\n"
+ "Soft reconfig outbound update\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_external,
+ BGP_CLEAR_SOFT_OUT, NULL);
+}
+
+ALIAS (clear_ip_bgp_external_soft_out,
+ clear_ip_bgp_external_out_cmd,
+ "clear ip bgp external out",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all external peers\n"
+ "Soft reconfig outbound update\n")
+
+DEFUN (clear_ip_bgp_external_ipv4_soft_out,
+ clear_ip_bgp_external_ipv4_soft_out_cmd,
+ "clear ip bgp external ipv4 (unicast|multicast) soft out",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all external peers\n"
+ "Address family\n"
+ "Address Family modifier\n"
+ "Address Family modifier\n"
+ "Soft reconfig\n"
+ "Soft reconfig outbound update\n")
+{
+ if (strncmp (argv[0], "m", 1) == 0)
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_MULTICAST, clear_external,
+ BGP_CLEAR_SOFT_OUT, NULL);
+
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_external,
+ BGP_CLEAR_SOFT_OUT, NULL);
+}
+
+ALIAS (clear_ip_bgp_external_ipv4_soft_out,
+ clear_ip_bgp_external_ipv4_out_cmd,
+ "clear ip bgp external ipv4 (unicast|multicast) out",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all external peers\n"
+ "Address family\n"
+ "Address Family modifier\n"
+ "Address Family modifier\n"
+ "Soft reconfig outbound update\n")
+
+DEFUN (clear_bgp_external_soft_out,
+ clear_bgp_external_soft_out_cmd,
+ "clear bgp external soft out",
+ CLEAR_STR
+ BGP_STR
+ "Clear all external peers\n"
+ "Soft reconfig\n"
+ "Soft reconfig outbound update\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP6, SAFI_UNICAST, clear_external,
+ BGP_CLEAR_SOFT_OUT, NULL);
+}
+
+ALIAS (clear_bgp_external_soft_out,
+ clear_bgp_ipv6_external_soft_out_cmd,
+ "clear bgp ipv6 external soft out",
+ CLEAR_STR
+ BGP_STR
+ "Address family\n"
+ "Clear all external peers\n"
+ "Soft reconfig\n"
+ "Soft reconfig outbound update\n")
+
+ALIAS (clear_bgp_external_soft_out,
+ clear_bgp_external_out_cmd,
+ "clear bgp external out",
+ CLEAR_STR
+ BGP_STR
+ "Clear all external peers\n"
+ "Soft reconfig outbound update\n")
+
+ALIAS (clear_bgp_external_soft_out,
+ clear_bgp_ipv6_external_out_cmd,
+ "clear bgp ipv6 external WORD out",
+ CLEAR_STR
+ BGP_STR
+ "Address family\n"
+ "Clear all external peers\n"
+ "Soft reconfig outbound update\n")
+
+DEFUN (clear_ip_bgp_as_soft_out,
+ clear_ip_bgp_as_soft_out_cmd,
+ "clear ip bgp <1-65535> soft out",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear peers with the AS number\n"
+ "Soft reconfig\n"
+ "Soft reconfig outbound update\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_as,
+ BGP_CLEAR_SOFT_OUT, argv[0]);
+}
+
+ALIAS (clear_ip_bgp_as_soft_out,
+ clear_ip_bgp_as_out_cmd,
+ "clear ip bgp <1-65535> out",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear peers with the AS number\n"
+ "Soft reconfig outbound update\n")
+
+DEFUN (clear_ip_bgp_as_ipv4_soft_out,
+ clear_ip_bgp_as_ipv4_soft_out_cmd,
+ "clear ip bgp <1-65535> ipv4 (unicast|multicast) soft out",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear peers with the AS number\n"
+ "Address family\n"
+ "Address Family modifier\n"
+ "Address Family modifier\n"
+ "Soft reconfig\n"
+ "Soft reconfig outbound update\n")
+{
+ if (strncmp (argv[1], "m", 1) == 0)
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_MULTICAST, clear_as,
+ BGP_CLEAR_SOFT_OUT, argv[0]);
+
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_as,
+ BGP_CLEAR_SOFT_OUT, argv[0]);
+}
+
+ALIAS (clear_ip_bgp_as_ipv4_soft_out,
+ clear_ip_bgp_as_ipv4_out_cmd,
+ "clear ip bgp <1-65535> ipv4 (unicast|multicast) out",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear peers with the AS number\n"
+ "Address family\n"
+ "Address Family modifier\n"
+ "Address Family modifier\n"
+ "Soft reconfig outbound update\n")
+
+DEFUN (clear_ip_bgp_as_vpnv4_soft_out,
+ clear_ip_bgp_as_vpnv4_soft_out_cmd,
+ "clear ip bgp <1-65535> vpnv4 unicast soft out",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear peers with the AS number\n"
+ "Address family\n"
+ "Address Family modifier\n"
+ "Soft reconfig\n"
+ "Soft reconfig outbound update\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_MPLS_VPN, clear_as,
+ BGP_CLEAR_SOFT_OUT, argv[0]);
+}
+
+ALIAS (clear_ip_bgp_as_vpnv4_soft_out,
+ clear_ip_bgp_as_vpnv4_out_cmd,
+ "clear ip bgp <1-65535> vpnv4 unicast out",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear peers with the AS number\n"
+ "Address family\n"
+ "Address Family modifier\n"
+ "Soft reconfig outbound update\n")
+
+DEFUN (clear_bgp_as_soft_out,
+ clear_bgp_as_soft_out_cmd,
+ "clear bgp <1-65535> soft out",
+ CLEAR_STR
+ BGP_STR
+ "Clear peers with the AS number\n"
+ "Soft reconfig\n"
+ "Soft reconfig outbound update\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP6, SAFI_UNICAST, clear_as,
+ BGP_CLEAR_SOFT_OUT, argv[0]);
+}
+
+ALIAS (clear_bgp_as_soft_out,
+ clear_bgp_ipv6_as_soft_out_cmd,
+ "clear bgp ipv6 <1-65535> soft out",
+ CLEAR_STR
+ BGP_STR
+ "Address family\n"
+ "Clear peers with the AS number\n"
+ "Soft reconfig\n"
+ "Soft reconfig outbound update\n")
+
+ALIAS (clear_bgp_as_soft_out,
+ clear_bgp_as_out_cmd,
+ "clear bgp <1-65535> out",
+ CLEAR_STR
+ BGP_STR
+ "Clear peers with the AS number\n"
+ "Soft reconfig outbound update\n")
+
+ALIAS (clear_bgp_as_soft_out,
+ clear_bgp_ipv6_as_out_cmd,
+ "clear bgp ipv6 <1-65535> out",
+ CLEAR_STR
+ BGP_STR
+ "Address family\n"
+ "Clear peers with the AS number\n"
+ "Soft reconfig outbound update\n")
+
+/* Inbound soft-reconfiguration */
+DEFUN (clear_ip_bgp_all_soft_in,
+ clear_ip_bgp_all_soft_in_cmd,
+ "clear ip bgp * soft in",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all peers\n"
+ "Soft reconfig\n"
+ "Soft reconfig inbound update\n")
+{
+ if (argc == 1)
+ return bgp_clear_vty (vty, argv[0], AFI_IP, SAFI_UNICAST, clear_all,
+ BGP_CLEAR_SOFT_IN, NULL);
+
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_all,
+ BGP_CLEAR_SOFT_IN, NULL);
+}
+
+ALIAS (clear_ip_bgp_all_soft_in,
+ clear_ip_bgp_instance_all_soft_in_cmd,
+ "clear ip bgp view WORD * soft in",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "BGP view\n"
+ "view name\n"
+ "Clear all peers\n"
+ "Soft reconfig\n"
+ "Soft reconfig inbound update\n")
+
+ALIAS (clear_ip_bgp_all_soft_in,
+ clear_ip_bgp_all_in_cmd,
+ "clear ip bgp * in",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all peers\n"
+ "Soft reconfig inbound update\n")
+
+DEFUN (clear_ip_bgp_all_in_prefix_filter,
+ clear_ip_bgp_all_in_prefix_filter_cmd,
+ "clear ip bgp * in prefix-filter",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all peers\n"
+ "Soft reconfig inbound update\n"
+ "Push out prefix-list ORF and do inbound soft reconfig\n")
+{
+ if (argc== 1)
+ return bgp_clear_vty (vty, argv[0], AFI_IP, SAFI_UNICAST, clear_all,
+ BGP_CLEAR_SOFT_IN_ORF_PREFIX, NULL);
+
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_all,
+ BGP_CLEAR_SOFT_IN_ORF_PREFIX, NULL);
+}
+
+ALIAS (clear_ip_bgp_all_in_prefix_filter,
+ clear_ip_bgp_instance_all_in_prefix_filter_cmd,
+ "clear ip bgp view WORD * in prefix-filter",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "BGP view\n"
+ "view name\n"
+ "Clear all peers\n"
+ "Soft reconfig inbound update\n"
+ "Push out prefix-list ORF and do inbound soft reconfig\n")
+
+
+DEFUN (clear_ip_bgp_all_ipv4_soft_in,
+ clear_ip_bgp_all_ipv4_soft_in_cmd,
+ "clear ip bgp * ipv4 (unicast|multicast) soft in",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all peers\n"
+ "Address family\n"
+ "Address Family modifier\n"
+ "Address Family modifier\n"
+ "Soft reconfig\n"
+ "Soft reconfig inbound update\n")
+{
+ if (strncmp (argv[0], "m", 1) == 0)
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_MULTICAST, clear_all,
+ BGP_CLEAR_SOFT_IN, NULL);
+
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_all,
+ BGP_CLEAR_SOFT_IN, NULL);
+}
+
+ALIAS (clear_ip_bgp_all_ipv4_soft_in,
+ clear_ip_bgp_all_ipv4_in_cmd,
+ "clear ip bgp * ipv4 (unicast|multicast) in",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all peers\n"
+ "Address family\n"
+ "Address Family modifier\n"
+ "Address Family modifier\n"
+ "Soft reconfig inbound update\n")
+
+DEFUN (clear_ip_bgp_instance_all_ipv4_soft_in,
+ clear_ip_bgp_instance_all_ipv4_soft_in_cmd,
+ "clear ip bgp view WORD * ipv4 (unicast|multicast) soft in",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "BGP view\n"
+ "view name\n"
+ "Clear all peers\n"
+ "Address family\n"
+ "Address Family modifier\n"
+ "Address Family modifier\n"
+ "Soft reconfig\n"
+ "Soft reconfig inbound update\n")
+{
+ if (strncmp (argv[1], "m", 1) == 0)
+ return bgp_clear_vty (vty, argv[0], AFI_IP, SAFI_MULTICAST, clear_all,
+ BGP_CLEAR_SOFT_IN, NULL);
+
+ return bgp_clear_vty (vty, argv[0], AFI_IP, SAFI_UNICAST, clear_all,
+ BGP_CLEAR_SOFT_IN, NULL);
+}
+
+DEFUN (clear_ip_bgp_all_ipv4_in_prefix_filter,
+ clear_ip_bgp_all_ipv4_in_prefix_filter_cmd,
+ "clear ip bgp * ipv4 (unicast|multicast) in prefix-filter",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all peers\n"
+ "Address family\n"
+ "Address Family modifier\n"
+ "Address Family modifier\n"
+ "Soft reconfig inbound update\n"
+ "Push out prefix-list ORF and do inbound soft reconfig\n")
+{
+ if (strncmp (argv[0], "m", 1) == 0)
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_MULTICAST, clear_all,
+ BGP_CLEAR_SOFT_IN_ORF_PREFIX, NULL);
+
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_all,
+ BGP_CLEAR_SOFT_IN_ORF_PREFIX, NULL);
+}
+
+DEFUN (clear_ip_bgp_instance_all_ipv4_in_prefix_filter,
+ clear_ip_bgp_instance_all_ipv4_in_prefix_filter_cmd,
+ "clear ip bgp view WORD * ipv4 (unicast|multicast) in prefix-filter",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all peers\n"
+ "Address family\n"
+ "Address Family modifier\n"
+ "Address Family modifier\n"
+ "Soft reconfig inbound update\n"
+ "Push out prefix-list ORF and do inbound soft reconfig\n")
+{
+ if (strncmp (argv[1], "m", 1) == 0)
+ return bgp_clear_vty (vty, argv[0], AFI_IP, SAFI_MULTICAST, clear_all,
+ BGP_CLEAR_SOFT_IN_ORF_PREFIX, NULL);
+
+ return bgp_clear_vty (vty, argv[0], AFI_IP, SAFI_UNICAST, clear_all,
+ BGP_CLEAR_SOFT_IN_ORF_PREFIX, NULL);
+}
+
+DEFUN (clear_ip_bgp_all_vpnv4_soft_in,
+ clear_ip_bgp_all_vpnv4_soft_in_cmd,
+ "clear ip bgp * vpnv4 unicast soft in",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all peers\n"
+ "Address family\n"
+ "Address Family Modifier\n"
+ "Soft reconfig\n"
+ "Soft reconfig inbound update\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_MPLS_VPN, clear_all,
+ BGP_CLEAR_SOFT_IN, NULL);
+}
+
+ALIAS (clear_ip_bgp_all_vpnv4_soft_in,
+ clear_ip_bgp_all_vpnv4_in_cmd,
+ "clear ip bgp * vpnv4 unicast in",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all peers\n"
+ "Address family\n"
+ "Address Family Modifier\n"
+ "Soft reconfig inbound update\n")
+
+DEFUN (clear_bgp_all_soft_in,
+ clear_bgp_all_soft_in_cmd,
+ "clear bgp * soft in",
+ CLEAR_STR
+ BGP_STR
+ "Clear all peers\n"
+ "Soft reconfig\n"
+ "Soft reconfig inbound update\n")
+{
+ if (argc == 1)
+ return bgp_clear_vty (vty, argv[0], AFI_IP6, SAFI_UNICAST, clear_all,
+ BGP_CLEAR_SOFT_IN, NULL);
+
+ return bgp_clear_vty (vty, NULL, AFI_IP6, SAFI_UNICAST, clear_all,
+ BGP_CLEAR_SOFT_IN, NULL);
+}
+
+ALIAS (clear_bgp_all_soft_in,
+ clear_bgp_instance_all_soft_in_cmd,
+ "clear bgp view WORD * soft in",
+ CLEAR_STR
+ BGP_STR
+ "BGP view\n"
+ "view name\n"
+ "Clear all peers\n"
+ "Soft reconfig\n"
+ "Soft reconfig inbound update\n")
+
+ALIAS (clear_bgp_all_soft_in,
+ clear_bgp_ipv6_all_soft_in_cmd,
+ "clear bgp ipv6 * soft in",
+ CLEAR_STR
+ BGP_STR
+ "Address family\n"
+ "Clear all peers\n"
+ "Soft reconfig\n"
+ "Soft reconfig inbound update\n")
+
+ALIAS (clear_bgp_all_soft_in,
+ clear_bgp_all_in_cmd,
+ "clear bgp * in",
+ CLEAR_STR
+ BGP_STR
+ "Clear all peers\n"
+ "Soft reconfig inbound update\n")
+
+ALIAS (clear_bgp_all_soft_in,
+ clear_bgp_ipv6_all_in_cmd,
+ "clear bgp ipv6 * in",
+ CLEAR_STR
+ BGP_STR
+ "Address family\n"
+ "Clear all peers\n"
+ "Soft reconfig inbound update\n")
+
+DEFUN (clear_bgp_all_in_prefix_filter,
+ clear_bgp_all_in_prefix_filter_cmd,
+ "clear bgp * in prefix-filter",
+ CLEAR_STR
+ BGP_STR
+ "Clear all peers\n"
+ "Soft reconfig inbound update\n"
+ "Push out prefix-list ORF and do inbound soft reconfig\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP6, SAFI_UNICAST, clear_all,
+ BGP_CLEAR_SOFT_IN_ORF_PREFIX, NULL);
+}
+
+ALIAS (clear_bgp_all_in_prefix_filter,
+ clear_bgp_ipv6_all_in_prefix_filter_cmd,
+ "clear bgp ipv6 * in prefix-filter",
+ CLEAR_STR
+ BGP_STR
+ "Address family\n"
+ "Clear all peers\n"
+ "Soft reconfig inbound update\n"
+ "Push out prefix-list ORF and do inbound soft reconfig\n")
+
+DEFUN (clear_ip_bgp_peer_soft_in,
+ clear_ip_bgp_peer_soft_in_cmd,
+ "clear ip bgp A.B.C.D soft in",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "BGP neighbor address to clear\n"
+ "Soft reconfig\n"
+ "Soft reconfig inbound update\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_peer,
+ BGP_CLEAR_SOFT_IN, argv[0]);
+}
+
+ALIAS (clear_ip_bgp_peer_soft_in,
+ clear_ip_bgp_peer_in_cmd,
+ "clear ip bgp A.B.C.D in",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "BGP neighbor address to clear\n"
+ "Soft reconfig inbound update\n")
+
+DEFUN (clear_ip_bgp_peer_in_prefix_filter,
+ clear_ip_bgp_peer_in_prefix_filter_cmd,
+ "clear ip bgp A.B.C.D in prefix-filter",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "BGP neighbor address to clear\n"
+ "Soft reconfig inbound update\n"
+ "Push out the existing ORF prefix-list\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_peer,
+ BGP_CLEAR_SOFT_IN_ORF_PREFIX, argv[0]);
+}
+
+DEFUN (clear_ip_bgp_peer_ipv4_soft_in,
+ clear_ip_bgp_peer_ipv4_soft_in_cmd,
+ "clear ip bgp A.B.C.D ipv4 (unicast|multicast) soft in",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "BGP neighbor address to clear\n"
+ "Address family\n"
+ "Address Family modifier\n"
+ "Address Family modifier\n"
+ "Soft reconfig\n"
+ "Soft reconfig inbound update\n")
+{
+ if (strncmp (argv[1], "m", 1) == 0)
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_MULTICAST, clear_peer,
+ BGP_CLEAR_SOFT_IN, argv[0]);
+
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_peer,
+ BGP_CLEAR_SOFT_IN, argv[0]);
+}
+
+ALIAS (clear_ip_bgp_peer_ipv4_soft_in,
+ clear_ip_bgp_peer_ipv4_in_cmd,
+ "clear ip bgp A.B.C.D ipv4 (unicast|multicast) in",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "BGP neighbor address to clear\n"
+ "Address family\n"
+ "Address Family modifier\n"
+ "Address Family modifier\n"
+ "Soft reconfig inbound update\n")
+
+DEFUN (clear_ip_bgp_peer_ipv4_in_prefix_filter,
+ clear_ip_bgp_peer_ipv4_in_prefix_filter_cmd,
+ "clear ip bgp A.B.C.D ipv4 (unicast|multicast) in prefix-filter",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "BGP neighbor address to clear\n"
+ "Address family\n"
+ "Address Family modifier\n"
+ "Address Family modifier\n"
+ "Soft reconfig inbound update\n"
+ "Push out the existing ORF prefix-list\n")
+{
+ if (strncmp (argv[1], "m", 1) == 0)
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_MULTICAST, clear_peer,
+ BGP_CLEAR_SOFT_IN_ORF_PREFIX, argv[0]);
+
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_peer,
+ BGP_CLEAR_SOFT_IN_ORF_PREFIX, argv[0]);
+}
+
+DEFUN (clear_ip_bgp_peer_vpnv4_soft_in,
+ clear_ip_bgp_peer_vpnv4_soft_in_cmd,
+ "clear ip bgp A.B.C.D vpnv4 unicast soft in",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "BGP neighbor address to clear\n"
+ "Address family\n"
+ "Address Family Modifier\n"
+ "Soft reconfig\n"
+ "Soft reconfig inbound update\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_MPLS_VPN, clear_peer,
+ BGP_CLEAR_SOFT_IN, argv[0]);
+}
+
+ALIAS (clear_ip_bgp_peer_vpnv4_soft_in,
+ clear_ip_bgp_peer_vpnv4_in_cmd,
+ "clear ip bgp A.B.C.D vpnv4 unicast in",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "BGP neighbor address to clear\n"
+ "Address family\n"
+ "Address Family Modifier\n"
+ "Soft reconfig inbound update\n")
+
+DEFUN (clear_bgp_peer_soft_in,
+ clear_bgp_peer_soft_in_cmd,
+ "clear bgp (A.B.C.D|X:X::X:X) soft in",
+ CLEAR_STR
+ BGP_STR
+ "BGP neighbor address to clear\n"
+ "BGP IPv6 neighbor to clear\n"
+ "Soft reconfig\n"
+ "Soft reconfig inbound update\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP6, SAFI_UNICAST, clear_peer,
+ BGP_CLEAR_SOFT_IN, argv[0]);
+}
+
+ALIAS (clear_bgp_peer_soft_in,
+ clear_bgp_ipv6_peer_soft_in_cmd,
+ "clear bgp ipv6 (A.B.C.D|X:X::X:X) soft in",
+ CLEAR_STR
+ BGP_STR
+ "Address family\n"
+ "BGP neighbor address to clear\n"
+ "BGP IPv6 neighbor to clear\n"
+ "Soft reconfig\n"
+ "Soft reconfig inbound update\n")
+
+ALIAS (clear_bgp_peer_soft_in,
+ clear_bgp_peer_in_cmd,
+ "clear bgp (A.B.C.D|X:X::X:X) in",
+ CLEAR_STR
+ BGP_STR
+ "BGP neighbor address to clear\n"
+ "BGP IPv6 neighbor to clear\n"
+ "Soft reconfig inbound update\n")
+
+ALIAS (clear_bgp_peer_soft_in,
+ clear_bgp_ipv6_peer_in_cmd,
+ "clear bgp ipv6 (A.B.C.D|X:X::X:X) in",
+ CLEAR_STR
+ BGP_STR
+ "Address family\n"
+ "BGP neighbor address to clear\n"
+ "BGP IPv6 neighbor to clear\n"
+ "Soft reconfig inbound update\n")
+
+DEFUN (clear_bgp_peer_in_prefix_filter,
+ clear_bgp_peer_in_prefix_filter_cmd,
+ "clear bgp (A.B.C.D|X:X::X:X) in prefix-filter",
+ CLEAR_STR
+ BGP_STR
+ "BGP neighbor address to clear\n"
+ "BGP IPv6 neighbor to clear\n"
+ "Soft reconfig inbound update\n"
+ "Push out the existing ORF prefix-list\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP6, SAFI_UNICAST, clear_peer,
+ BGP_CLEAR_SOFT_IN_ORF_PREFIX, argv[0]);
+}
+
+ALIAS (clear_bgp_peer_in_prefix_filter,
+ clear_bgp_ipv6_peer_in_prefix_filter_cmd,
+ "clear bgp ipv6 (A.B.C.D|X:X::X:X) in prefix-filter",
+ CLEAR_STR
+ BGP_STR
+ "Address family\n"
+ "BGP neighbor address to clear\n"
+ "BGP IPv6 neighbor to clear\n"
+ "Soft reconfig inbound update\n"
+ "Push out the existing ORF prefix-list\n")
+
+DEFUN (clear_ip_bgp_peer_group_soft_in,
+ clear_ip_bgp_peer_group_soft_in_cmd,
+ "clear ip bgp peer-group WORD soft in",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all members of peer-group\n"
+ "BGP peer-group name\n"
+ "Soft reconfig\n"
+ "Soft reconfig inbound update\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_group,
+ BGP_CLEAR_SOFT_IN, argv[0]);
+}
+
+ALIAS (clear_ip_bgp_peer_group_soft_in,
+ clear_ip_bgp_peer_group_in_cmd,
+ "clear ip bgp peer-group WORD in",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all members of peer-group\n"
+ "BGP peer-group name\n"
+ "Soft reconfig inbound update\n")
+
+DEFUN (clear_ip_bgp_peer_group_in_prefix_filter,
+ clear_ip_bgp_peer_group_in_prefix_filter_cmd,
+ "clear ip bgp peer-group WORD in prefix-filter",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all members of peer-group\n"
+ "BGP peer-group name\n"
+ "Soft reconfig inbound update\n"
+ "Push out prefix-list ORF and do inbound soft reconfig\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_group,
+ BGP_CLEAR_SOFT_IN_ORF_PREFIX, argv[0]);
+}
+
+DEFUN (clear_ip_bgp_peer_group_ipv4_soft_in,
+ clear_ip_bgp_peer_group_ipv4_soft_in_cmd,
+ "clear ip bgp peer-group WORD ipv4 (unicast|multicast) soft in",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all members of peer-group\n"
+ "BGP peer-group name\n"
+ "Address family\n"
+ "Address Family modifier\n"
+ "Address Family modifier\n"
+ "Soft reconfig\n"
+ "Soft reconfig inbound update\n")
+{
+ if (strncmp (argv[1], "m", 1) == 0)
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_MULTICAST, clear_group,
+ BGP_CLEAR_SOFT_IN, argv[0]);
+
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_group,
+ BGP_CLEAR_SOFT_IN, argv[0]);
+}
+
+ALIAS (clear_ip_bgp_peer_group_ipv4_soft_in,
+ clear_ip_bgp_peer_group_ipv4_in_cmd,
+ "clear ip bgp peer-group WORD ipv4 (unicast|multicast) in",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all members of peer-group\n"
+ "BGP peer-group name\n"
+ "Address family\n"
+ "Address Family modifier\n"
+ "Address Family modifier\n"
+ "Soft reconfig inbound update\n")
+
+DEFUN (clear_ip_bgp_peer_group_ipv4_in_prefix_filter,
+ clear_ip_bgp_peer_group_ipv4_in_prefix_filter_cmd,
+ "clear ip bgp peer-group WORD ipv4 (unicast|multicast) in prefix-filter",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all members of peer-group\n"
+ "BGP peer-group name\n"
+ "Address family\n"
+ "Address Family modifier\n"
+ "Address Family modifier\n"
+ "Soft reconfig inbound update\n"
+ "Push out prefix-list ORF and do inbound soft reconfig\n")
+{
+ if (strncmp (argv[1], "m", 1) == 0)
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_MULTICAST, clear_group,
+ BGP_CLEAR_SOFT_IN_ORF_PREFIX, argv[0]);
+
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_group,
+ BGP_CLEAR_SOFT_IN_ORF_PREFIX, argv[0]);
+}
+
+DEFUN (clear_bgp_peer_group_soft_in,
+ clear_bgp_peer_group_soft_in_cmd,
+ "clear bgp peer-group WORD soft in",
+ CLEAR_STR
+ BGP_STR
+ "Clear all members of peer-group\n"
+ "BGP peer-group name\n"
+ "Soft reconfig\n"
+ "Soft reconfig inbound update\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP6, SAFI_UNICAST, clear_group,
+ BGP_CLEAR_SOFT_IN, argv[0]);
+}
+
+ALIAS (clear_bgp_peer_group_soft_in,
+ clear_bgp_ipv6_peer_group_soft_in_cmd,
+ "clear bgp ipv6 peer-group WORD soft in",
+ CLEAR_STR
+ BGP_STR
+ "Address family\n"
+ "Clear all members of peer-group\n"
+ "BGP peer-group name\n"
+ "Soft reconfig\n"
+ "Soft reconfig inbound update\n")
+
+ALIAS (clear_bgp_peer_group_soft_in,
+ clear_bgp_peer_group_in_cmd,
+ "clear bgp peer-group WORD in",
+ CLEAR_STR
+ BGP_STR
+ "Clear all members of peer-group\n"
+ "BGP peer-group name\n"
+ "Soft reconfig inbound update\n")
+
+ALIAS (clear_bgp_peer_group_soft_in,
+ clear_bgp_ipv6_peer_group_in_cmd,
+ "clear bgp ipv6 peer-group WORD in",
+ CLEAR_STR
+ BGP_STR
+ "Address family\n"
+ "Clear all members of peer-group\n"
+ "BGP peer-group name\n"
+ "Soft reconfig inbound update\n")
+
+DEFUN (clear_bgp_peer_group_in_prefix_filter,
+ clear_bgp_peer_group_in_prefix_filter_cmd,
+ "clear bgp peer-group WORD in prefix-filter",
+ CLEAR_STR
+ BGP_STR
+ "Clear all members of peer-group\n"
+ "BGP peer-group name\n"
+ "Soft reconfig inbound update\n"
+ "Push out prefix-list ORF and do inbound soft reconfig\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP6, SAFI_UNICAST, clear_group,
+ BGP_CLEAR_SOFT_IN_ORF_PREFIX, argv[0]);
+}
+
+ALIAS (clear_bgp_peer_group_in_prefix_filter,
+ clear_bgp_ipv6_peer_group_in_prefix_filter_cmd,
+ "clear bgp ipv6 peer-group WORD in prefix-filter",
+ CLEAR_STR
+ BGP_STR
+ "Address family\n"
+ "Clear all members of peer-group\n"
+ "BGP peer-group name\n"
+ "Soft reconfig inbound update\n"
+ "Push out prefix-list ORF and do inbound soft reconfig\n")
+
+DEFUN (clear_ip_bgp_external_soft_in,
+ clear_ip_bgp_external_soft_in_cmd,
+ "clear ip bgp external soft in",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all external peers\n"
+ "Soft reconfig\n"
+ "Soft reconfig inbound update\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_external,
+ BGP_CLEAR_SOFT_IN, NULL);
+}
+
+ALIAS (clear_ip_bgp_external_soft_in,
+ clear_ip_bgp_external_in_cmd,
+ "clear ip bgp external in",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all external peers\n"
+ "Soft reconfig inbound update\n")
+
+DEFUN (clear_ip_bgp_external_in_prefix_filter,
+ clear_ip_bgp_external_in_prefix_filter_cmd,
+ "clear ip bgp external in prefix-filter",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all external peers\n"
+ "Soft reconfig inbound update\n"
+ "Push out prefix-list ORF and do inbound soft reconfig\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_external,
+ BGP_CLEAR_SOFT_IN_ORF_PREFIX, NULL);
+}
+
+DEFUN (clear_ip_bgp_external_ipv4_soft_in,
+ clear_ip_bgp_external_ipv4_soft_in_cmd,
+ "clear ip bgp external ipv4 (unicast|multicast) soft in",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all external peers\n"
+ "Address family\n"
+ "Address Family modifier\n"
+ "Address Family modifier\n"
+ "Soft reconfig\n"
+ "Soft reconfig inbound update\n")
+{
+ if (strncmp (argv[0], "m", 1) == 0)
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_MULTICAST, clear_external,
+ BGP_CLEAR_SOFT_IN, NULL);
+
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_external,
+ BGP_CLEAR_SOFT_IN, NULL);
+}
+
+ALIAS (clear_ip_bgp_external_ipv4_soft_in,
+ clear_ip_bgp_external_ipv4_in_cmd,
+ "clear ip bgp external ipv4 (unicast|multicast) in",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all external peers\n"
+ "Address family\n"
+ "Address Family modifier\n"
+ "Address Family modifier\n"
+ "Soft reconfig inbound update\n")
+
+DEFUN (clear_ip_bgp_external_ipv4_in_prefix_filter,
+ clear_ip_bgp_external_ipv4_in_prefix_filter_cmd,
+ "clear ip bgp external ipv4 (unicast|multicast) in prefix-filter",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all external peers\n"
+ "Address family\n"
+ "Address Family modifier\n"
+ "Address Family modifier\n"
+ "Soft reconfig inbound update\n"
+ "Push out prefix-list ORF and do inbound soft reconfig\n")
+{
+ if (strncmp (argv[0], "m", 1) == 0)
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_MULTICAST, clear_external,
+ BGP_CLEAR_SOFT_IN_ORF_PREFIX, NULL);
+
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_external,
+ BGP_CLEAR_SOFT_IN_ORF_PREFIX, NULL);
+}
+
+DEFUN (clear_bgp_external_soft_in,
+ clear_bgp_external_soft_in_cmd,
+ "clear bgp external soft in",
+ CLEAR_STR
+ BGP_STR
+ "Clear all external peers\n"
+ "Soft reconfig\n"
+ "Soft reconfig inbound update\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP6, SAFI_UNICAST, clear_external,
+ BGP_CLEAR_SOFT_IN, NULL);
+}
+
+ALIAS (clear_bgp_external_soft_in,
+ clear_bgp_ipv6_external_soft_in_cmd,
+ "clear bgp ipv6 external soft in",
+ CLEAR_STR
+ BGP_STR
+ "Address family\n"
+ "Clear all external peers\n"
+ "Soft reconfig\n"
+ "Soft reconfig inbound update\n")
+
+ALIAS (clear_bgp_external_soft_in,
+ clear_bgp_external_in_cmd,
+ "clear bgp external in",
+ CLEAR_STR
+ BGP_STR
+ "Clear all external peers\n"
+ "Soft reconfig inbound update\n")
+
+ALIAS (clear_bgp_external_soft_in,
+ clear_bgp_ipv6_external_in_cmd,
+ "clear bgp ipv6 external WORD in",
+ CLEAR_STR
+ BGP_STR
+ "Address family\n"
+ "Clear all external peers\n"
+ "Soft reconfig inbound update\n")
+
+DEFUN (clear_bgp_external_in_prefix_filter,
+ clear_bgp_external_in_prefix_filter_cmd,
+ "clear bgp external in prefix-filter",
+ CLEAR_STR
+ BGP_STR
+ "Clear all external peers\n"
+ "Soft reconfig inbound update\n"
+ "Push out prefix-list ORF and do inbound soft reconfig\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP6, SAFI_UNICAST, clear_external,
+ BGP_CLEAR_SOFT_IN_ORF_PREFIX, NULL);
+}
+
+ALIAS (clear_bgp_external_in_prefix_filter,
+ clear_bgp_ipv6_external_in_prefix_filter_cmd,
+ "clear bgp ipv6 external in prefix-filter",
+ CLEAR_STR
+ BGP_STR
+ "Address family\n"
+ "Clear all external peers\n"
+ "Soft reconfig inbound update\n"
+ "Push out prefix-list ORF and do inbound soft reconfig\n")
+
+DEFUN (clear_ip_bgp_as_soft_in,
+ clear_ip_bgp_as_soft_in_cmd,
+ "clear ip bgp <1-65535> soft in",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear peers with the AS number\n"
+ "Soft reconfig\n"
+ "Soft reconfig inbound update\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_as,
+ BGP_CLEAR_SOFT_IN, argv[0]);
+}
+
+ALIAS (clear_ip_bgp_as_soft_in,
+ clear_ip_bgp_as_in_cmd,
+ "clear ip bgp <1-65535> in",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear peers with the AS number\n"
+ "Soft reconfig inbound update\n")
+
+DEFUN (clear_ip_bgp_as_in_prefix_filter,
+ clear_ip_bgp_as_in_prefix_filter_cmd,
+ "clear ip bgp <1-65535> in prefix-filter",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear peers with the AS number\n"
+ "Soft reconfig inbound update\n"
+ "Push out prefix-list ORF and do inbound soft reconfig\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_as,
+ BGP_CLEAR_SOFT_IN_ORF_PREFIX, argv[0]);
+}
+
+DEFUN (clear_ip_bgp_as_ipv4_soft_in,
+ clear_ip_bgp_as_ipv4_soft_in_cmd,
+ "clear ip bgp <1-65535> ipv4 (unicast|multicast) soft in",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear peers with the AS number\n"
+ "Address family\n"
+ "Address Family modifier\n"
+ "Address Family modifier\n"
+ "Soft reconfig\n"
+ "Soft reconfig inbound update\n")
+{
+ if (strncmp (argv[1], "m", 1) == 0)
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_MULTICAST, clear_as,
+ BGP_CLEAR_SOFT_IN, argv[0]);
+
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_as,
+ BGP_CLEAR_SOFT_IN, argv[0]);
+}
+
+ALIAS (clear_ip_bgp_as_ipv4_soft_in,
+ clear_ip_bgp_as_ipv4_in_cmd,
+ "clear ip bgp <1-65535> ipv4 (unicast|multicast) in",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear peers with the AS number\n"
+ "Address family\n"
+ "Address Family modifier\n"
+ "Address Family modifier\n"
+ "Soft reconfig inbound update\n")
+
+DEFUN (clear_ip_bgp_as_ipv4_in_prefix_filter,
+ clear_ip_bgp_as_ipv4_in_prefix_filter_cmd,
+ "clear ip bgp <1-65535> ipv4 (unicast|multicast) in prefix-filter",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear peers with the AS number\n"
+ "Address family\n"
+ "Address Family modifier\n"
+ "Address Family modifier\n"
+ "Soft reconfig inbound update\n"
+ "Push out prefix-list ORF and do inbound soft reconfig\n")
+{
+ if (strncmp (argv[1], "m", 1) == 0)
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_MULTICAST, clear_as,
+ BGP_CLEAR_SOFT_IN_ORF_PREFIX, argv[0]);
+
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_as,
+ BGP_CLEAR_SOFT_IN_ORF_PREFIX, argv[0]);
+}
+
+DEFUN (clear_ip_bgp_as_vpnv4_soft_in,
+ clear_ip_bgp_as_vpnv4_soft_in_cmd,
+ "clear ip bgp <1-65535> vpnv4 unicast soft in",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear peers with the AS number\n"
+ "Address family\n"
+ "Address Family modifier\n"
+ "Soft reconfig\n"
+ "Soft reconfig inbound update\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_MPLS_VPN, clear_as,
+ BGP_CLEAR_SOFT_IN, argv[0]);
+}
+
+ALIAS (clear_ip_bgp_as_vpnv4_soft_in,
+ clear_ip_bgp_as_vpnv4_in_cmd,
+ "clear ip bgp <1-65535> vpnv4 unicast in",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear peers with the AS number\n"
+ "Address family\n"
+ "Address Family modifier\n"
+ "Soft reconfig inbound update\n")
+
+DEFUN (clear_bgp_as_soft_in,
+ clear_bgp_as_soft_in_cmd,
+ "clear bgp <1-65535> soft in",
+ CLEAR_STR
+ BGP_STR
+ "Clear peers with the AS number\n"
+ "Soft reconfig\n"
+ "Soft reconfig inbound update\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP6, SAFI_UNICAST, clear_as,
+ BGP_CLEAR_SOFT_IN, argv[0]);
+}
+
+ALIAS (clear_bgp_as_soft_in,
+ clear_bgp_ipv6_as_soft_in_cmd,
+ "clear bgp ipv6 <1-65535> soft in",
+ CLEAR_STR
+ BGP_STR
+ "Address family\n"
+ "Clear peers with the AS number\n"
+ "Soft reconfig\n"
+ "Soft reconfig inbound update\n")
+
+ALIAS (clear_bgp_as_soft_in,
+ clear_bgp_as_in_cmd,
+ "clear bgp <1-65535> in",
+ CLEAR_STR
+ BGP_STR
+ "Clear peers with the AS number\n"
+ "Soft reconfig inbound update\n")
+
+ALIAS (clear_bgp_as_soft_in,
+ clear_bgp_ipv6_as_in_cmd,
+ "clear bgp ipv6 <1-65535> in",
+ CLEAR_STR
+ BGP_STR
+ "Address family\n"
+ "Clear peers with the AS number\n"
+ "Soft reconfig inbound update\n")
+
+DEFUN (clear_bgp_as_in_prefix_filter,
+ clear_bgp_as_in_prefix_filter_cmd,
+ "clear bgp <1-65535> in prefix-filter",
+ CLEAR_STR
+ BGP_STR
+ "Clear peers with the AS number\n"
+ "Soft reconfig inbound update\n"
+ "Push out prefix-list ORF and do inbound soft reconfig\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP6, SAFI_UNICAST, clear_as,
+ BGP_CLEAR_SOFT_IN_ORF_PREFIX, argv[0]);
+}
+
+ALIAS (clear_bgp_as_in_prefix_filter,
+ clear_bgp_ipv6_as_in_prefix_filter_cmd,
+ "clear bgp ipv6 <1-65535> in prefix-filter",
+ CLEAR_STR
+ BGP_STR
+ "Address family\n"
+ "Clear peers with the AS number\n"
+ "Soft reconfig inbound update\n"
+ "Push out prefix-list ORF and do inbound soft reconfig\n")
+
+/* Both soft-reconfiguration */
+DEFUN (clear_ip_bgp_all_soft,
+ clear_ip_bgp_all_soft_cmd,
+ "clear ip bgp * soft",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all peers\n"
+ "Soft reconfig\n")
+{
+ if (argc == 1)
+ return bgp_clear_vty (vty, argv[0], AFI_IP, SAFI_UNICAST, clear_all,
+ BGP_CLEAR_SOFT_BOTH, NULL);
+
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_all,
+ BGP_CLEAR_SOFT_BOTH, NULL);
+}
+
+ALIAS (clear_ip_bgp_all_soft,
+ clear_ip_bgp_instance_all_soft_cmd,
+ "clear ip bgp view WORD * soft",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "BGP view\n"
+ "view name\n"
+ "Clear all peers\n"
+ "Soft reconfig\n")
+
+
+DEFUN (clear_ip_bgp_all_ipv4_soft,
+ clear_ip_bgp_all_ipv4_soft_cmd,
+ "clear ip bgp * ipv4 (unicast|multicast) soft",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all peers\n"
+ "Address family\n"
+ "Address Family Modifier\n"
+ "Address Family Modifier\n"
+ "Soft reconfig\n")
+{
+ if (strncmp (argv[0], "m", 1) == 0)
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_MULTICAST, clear_all,
+ BGP_CLEAR_SOFT_BOTH, NULL);
+
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_all,
+ BGP_CLEAR_SOFT_BOTH, NULL);
+}
+
+DEFUN (clear_ip_bgp_instance_all_ipv4_soft,
+ clear_ip_bgp_instance_all_ipv4_soft_cmd,
+ "clear ip bgp view WORD * ipv4 (unicast|multicast) soft",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "BGP view\n"
+ "view name\n"
+ "Clear all peers\n"
+ "Address family\n"
+ "Address Family Modifier\n"
+ "Address Family Modifier\n"
+ "Soft reconfig\n")
+{
+ if (strncmp (argv[1], "m", 1) == 0)
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_MULTICAST, clear_all,
+ BGP_CLEAR_SOFT_BOTH, NULL);
+
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_all,
+ BGP_CLEAR_SOFT_BOTH, NULL);
+}
+
+DEFUN (clear_ip_bgp_all_vpnv4_soft,
+ clear_ip_bgp_all_vpnv4_soft_cmd,
+ "clear ip bgp * vpnv4 unicast soft",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all peers\n"
+ "Address family\n"
+ "Address Family Modifier\n"
+ "Soft reconfig\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_MPLS_VPN, clear_all,
+ BGP_CLEAR_SOFT_BOTH, argv[0]);
+}
+
+DEFUN (clear_bgp_all_soft,
+ clear_bgp_all_soft_cmd,
+ "clear bgp * soft",
+ CLEAR_STR
+ BGP_STR
+ "Clear all peers\n"
+ "Soft reconfig\n")
+{
+ if (argc == 1)
+ return bgp_clear_vty (vty, argv[0], AFI_IP6, SAFI_UNICAST, clear_all,
+ BGP_CLEAR_SOFT_BOTH, argv[0]);
+
+ return bgp_clear_vty (vty, NULL, AFI_IP6, SAFI_UNICAST, clear_all,
+ BGP_CLEAR_SOFT_BOTH, argv[0]);
+}
+
+ALIAS (clear_bgp_all_soft,
+ clear_bgp_instance_all_soft_cmd,
+ "clear bgp view WORD * soft",
+ CLEAR_STR
+ BGP_STR
+ "BGP view\n"
+ "view name\n"
+ "Clear all peers\n"
+ "Soft reconfig\n")
+
+ALIAS (clear_bgp_all_soft,
+ clear_bgp_ipv6_all_soft_cmd,
+ "clear bgp ipv6 * soft",
+ CLEAR_STR
+ BGP_STR
+ "Address family\n"
+ "Clear all peers\n"
+ "Soft reconfig\n")
+
+DEFUN (clear_ip_bgp_peer_soft,
+ clear_ip_bgp_peer_soft_cmd,
+ "clear ip bgp A.B.C.D soft",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "BGP neighbor address to clear\n"
+ "Soft reconfig\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_peer,
+ BGP_CLEAR_SOFT_BOTH, argv[0]);
+}
+
+DEFUN (clear_ip_bgp_peer_ipv4_soft,
+ clear_ip_bgp_peer_ipv4_soft_cmd,
+ "clear ip bgp A.B.C.D ipv4 (unicast|multicast) soft",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "BGP neighbor address to clear\n"
+ "Address family\n"
+ "Address Family Modifier\n"
+ "Address Family Modifier\n"
+ "Soft reconfig\n")
+{
+ if (strncmp (argv[1], "m", 1) == 0)
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_MULTICAST, clear_peer,
+ BGP_CLEAR_SOFT_BOTH, argv[0]);
+
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_peer,
+ BGP_CLEAR_SOFT_BOTH, argv[0]);
+}
+
+DEFUN (clear_ip_bgp_peer_vpnv4_soft,
+ clear_ip_bgp_peer_vpnv4_soft_cmd,
+ "clear ip bgp A.B.C.D vpnv4 unicast soft",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "BGP neighbor address to clear\n"
+ "Address family\n"
+ "Address Family Modifier\n"
+ "Soft reconfig\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_MPLS_VPN, clear_peer,
+ BGP_CLEAR_SOFT_BOTH, argv[0]);
+}
+
+DEFUN (clear_bgp_peer_soft,
+ clear_bgp_peer_soft_cmd,
+ "clear bgp (A.B.C.D|X:X::X:X) soft",
+ CLEAR_STR
+ BGP_STR
+ "BGP neighbor address to clear\n"
+ "BGP IPv6 neighbor to clear\n"
+ "Soft reconfig\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP6, SAFI_UNICAST, clear_peer,
+ BGP_CLEAR_SOFT_BOTH, argv[0]);
+}
+
+ALIAS (clear_bgp_peer_soft,
+ clear_bgp_ipv6_peer_soft_cmd,
+ "clear bgp ipv6 (A.B.C.D|X:X::X:X) soft",
+ CLEAR_STR
+ BGP_STR
+ "Address family\n"
+ "BGP neighbor address to clear\n"
+ "BGP IPv6 neighbor to clear\n"
+ "Soft reconfig\n")
+
+DEFUN (clear_ip_bgp_peer_group_soft,
+ clear_ip_bgp_peer_group_soft_cmd,
+ "clear ip bgp peer-group WORD soft",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all members of peer-group\n"
+ "BGP peer-group name\n"
+ "Soft reconfig\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_group,
+ BGP_CLEAR_SOFT_BOTH, argv[0]);
+}
+
+DEFUN (clear_ip_bgp_peer_group_ipv4_soft,
+ clear_ip_bgp_peer_group_ipv4_soft_cmd,
+ "clear ip bgp peer-group WORD ipv4 (unicast|multicast) soft",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all members of peer-group\n"
+ "BGP peer-group name\n"
+ "Address family\n"
+ "Address Family modifier\n"
+ "Address Family modifier\n"
+ "Soft reconfig\n")
+{
+ if (strncmp (argv[1], "m", 1) == 0)
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_MULTICAST, clear_group,
+ BGP_CLEAR_SOFT_BOTH, argv[0]);
+
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_group,
+ BGP_CLEAR_SOFT_BOTH, argv[0]);
+}
+
+DEFUN (clear_bgp_peer_group_soft,
+ clear_bgp_peer_group_soft_cmd,
+ "clear bgp peer-group WORD soft",
+ CLEAR_STR
+ BGP_STR
+ "Clear all members of peer-group\n"
+ "BGP peer-group name\n"
+ "Soft reconfig\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP6, SAFI_UNICAST, clear_group,
+ BGP_CLEAR_SOFT_BOTH, argv[0]);
+}
+
+ALIAS (clear_bgp_peer_group_soft,
+ clear_bgp_ipv6_peer_group_soft_cmd,
+ "clear bgp ipv6 peer-group WORD soft",
+ CLEAR_STR
+ BGP_STR
+ "Address family\n"
+ "Clear all members of peer-group\n"
+ "BGP peer-group name\n"
+ "Soft reconfig\n")
+
+DEFUN (clear_ip_bgp_external_soft,
+ clear_ip_bgp_external_soft_cmd,
+ "clear ip bgp external soft",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all external peers\n"
+ "Soft reconfig\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_external,
+ BGP_CLEAR_SOFT_BOTH, NULL);
+}
+
+DEFUN (clear_ip_bgp_external_ipv4_soft,
+ clear_ip_bgp_external_ipv4_soft_cmd,
+ "clear ip bgp external ipv4 (unicast|multicast) soft",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear all external peers\n"
+ "Address family\n"
+ "Address Family modifier\n"
+ "Address Family modifier\n"
+ "Soft reconfig\n")
+{
+ if (strncmp (argv[0], "m", 1) == 0)
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_MULTICAST, clear_external,
+ BGP_CLEAR_SOFT_BOTH, NULL);
+
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_external,
+ BGP_CLEAR_SOFT_BOTH, NULL);
+}
+
+DEFUN (clear_bgp_external_soft,
+ clear_bgp_external_soft_cmd,
+ "clear bgp external soft",
+ CLEAR_STR
+ BGP_STR
+ "Clear all external peers\n"
+ "Soft reconfig\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP6, SAFI_UNICAST, clear_external,
+ BGP_CLEAR_SOFT_BOTH, NULL);
+}
+
+ALIAS (clear_bgp_external_soft,
+ clear_bgp_ipv6_external_soft_cmd,
+ "clear bgp ipv6 external soft",
+ CLEAR_STR
+ BGP_STR
+ "Address family\n"
+ "Clear all external peers\n"
+ "Soft reconfig\n")
+
+DEFUN (clear_ip_bgp_as_soft,
+ clear_ip_bgp_as_soft_cmd,
+ "clear ip bgp <1-65535> soft",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear peers with the AS number\n"
+ "Soft reconfig\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_as,
+ BGP_CLEAR_SOFT_BOTH, argv[0]);
+}
+
+DEFUN (clear_ip_bgp_as_ipv4_soft,
+ clear_ip_bgp_as_ipv4_soft_cmd,
+ "clear ip bgp <1-65535> ipv4 (unicast|multicast) soft",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear peers with the AS number\n"
+ "Address family\n"
+ "Address Family Modifier\n"
+ "Address Family Modifier\n"
+ "Soft reconfig\n")
+{
+ if (strncmp (argv[1], "m", 1) == 0)
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_MULTICAST, clear_as,
+ BGP_CLEAR_SOFT_BOTH, argv[0]);
+
+ return bgp_clear_vty (vty, NULL,AFI_IP, SAFI_UNICAST, clear_as,
+ BGP_CLEAR_SOFT_BOTH, argv[0]);
+}
+
+DEFUN (clear_ip_bgp_as_vpnv4_soft,
+ clear_ip_bgp_as_vpnv4_soft_cmd,
+ "clear ip bgp <1-65535> vpnv4 unicast soft",
+ CLEAR_STR
+ IP_STR
+ BGP_STR
+ "Clear peers with the AS number\n"
+ "Address family\n"
+ "Address Family Modifier\n"
+ "Soft reconfig\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_MPLS_VPN, clear_as,
+ BGP_CLEAR_SOFT_BOTH, argv[0]);
+}
+
+DEFUN (clear_bgp_as_soft,
+ clear_bgp_as_soft_cmd,
+ "clear bgp <1-65535> soft",
+ CLEAR_STR
+ BGP_STR
+ "Clear peers with the AS number\n"
+ "Soft reconfig\n")
+{
+ return bgp_clear_vty (vty, NULL, AFI_IP6, SAFI_UNICAST, clear_as,
+ BGP_CLEAR_SOFT_BOTH, argv[0]);
+}
+
+ALIAS (clear_bgp_as_soft,
+ clear_bgp_ipv6_as_soft_cmd,
+ "clear bgp ipv6 <1-65535> soft",
+ CLEAR_STR
+ BGP_STR
+ "Address family\n"
+ "Clear peers with the AS number\n"
+ "Soft reconfig\n")
+
+/* Show BGP peer's summary information. */
+int
+bgp_show_summary (struct vty *vty, struct bgp *bgp, int afi, int safi)
+{
+ struct peer *peer;
+ struct listnode *nn;
+ int count = 0;
+ char timebuf[BGP_UPTIME_LEN];
+ int len;
+
+ /* Header string for each address family. */
+ static char header[] = "Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd";
+
+ LIST_LOOP (bgp->peer, peer, nn)
+ {
+ if (peer->afc[afi][safi])
+ {
+ if (! count)
+ {
+ vty_out (vty,
+ "BGP router identifier %s, local AS number %d%s",
+ inet_ntoa (bgp->router_id), bgp->as, VTY_NEWLINE);
+ vty_out (vty,
+ "%ld BGP AS-PATH entries%s", aspath_count (),
+ VTY_NEWLINE);
+ vty_out (vty,
+ "%ld BGP community entries%s", community_count (),
+ VTY_NEWLINE);
+
+ if (CHECK_FLAG(bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING))
+ vty_out (vty, "Dampening enabled.%s", VTY_NEWLINE);
+ vty_out (vty, "%s", VTY_NEWLINE);
+ vty_out (vty, "%s%s", header, VTY_NEWLINE);
+ }
+ count++;
+
+ len = vty_out (vty, "%s", peer->host);
+ len = 16 - len;
+ if (len < 1)
+ vty_out (vty, "%s%*s", VTY_NEWLINE, 16, " ");
+ else
+ vty_out (vty, "%*s", len, " ");
+
+ switch (peer->version)
+ {
+ case BGP_VERSION_4:
+ vty_out (vty, "4 ");
+ break;
+ case BGP_VERSION_MP_4_DRAFT_00:
+ vty_out (vty, "4-");
+ break;
+ }
+
+ vty_out (vty, "%5d %7d %7d %8d %4d %4ld ",
+ peer->as,
+ peer->open_in + peer->update_in + peer->keepalive_in
+ + peer->notify_in + peer->refresh_in + peer->dynamic_cap_in,
+ peer->open_out + peer->update_out + peer->keepalive_out
+ + peer->notify_out + peer->refresh_out
+ + peer->dynamic_cap_out,
+ 0, 0, peer->obuf->count);
+
+ vty_out (vty, "%8s",
+ peer_uptime (peer->uptime, timebuf, BGP_UPTIME_LEN));
+
+ if (peer->status == Established)
+ {
+ vty_out (vty, " %8ld", peer->pcount[afi][safi]);
+ }
+ else
+ {
+ if (CHECK_FLAG (peer->flags, PEER_FLAG_SHUTDOWN))
+ vty_out (vty, " Idle (Admin)");
+ else if (CHECK_FLAG (peer->sflags, PEER_STATUS_PREFIX_OVERFLOW))
+ vty_out (vty, " Idle (PfxCt)");
+ else
+ vty_out (vty, " %-11s", LOOKUP(bgp_status_msg, peer->status));
+ }
+
+ vty_out (vty, "%s", VTY_NEWLINE);
+ }
+ }
+
+ if (count)
+ vty_out (vty, "%sTotal number of neighbors %d%s", VTY_NEWLINE,
+ count, VTY_NEWLINE);
+ else
+ vty_out (vty, "No %s neighbor is configured%s",
+ afi == AFI_IP ? "IPv4" : "IPv6", VTY_NEWLINE);
+ return CMD_SUCCESS;
+}
+
+int
+bgp_show_summary_vty (struct vty *vty, char *name, afi_t afi, safi_t safi)
+{
+ struct bgp *bgp;
+
+ if (name)
+ {
+ bgp = bgp_lookup_by_name (name);
+
+ if (! bgp)
+ {
+ vty_out (vty, "%% No such BGP instance exist%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ bgp_show_summary (vty, bgp, afi, safi);
+ return CMD_SUCCESS;
+ }
+
+ bgp = bgp_get_default ();
+
+ if (bgp)
+ bgp_show_summary (vty, bgp, afi, safi);
+
+ return CMD_SUCCESS;
+}
+
+/* `show ip bgp summary' commands. */
+DEFUN (show_ip_bgp_summary,
+ show_ip_bgp_summary_cmd,
+ "show ip bgp summary",
+ SHOW_STR
+ IP_STR
+ BGP_STR
+ "Summary of BGP neighbor status\n")
+{
+ return bgp_show_summary_vty (vty, NULL, AFI_IP, SAFI_UNICAST);
+}
+
+DEFUN (show_ip_bgp_instance_summary,
+ show_ip_bgp_instance_summary_cmd,
+ "show ip bgp view WORD summary",
+ SHOW_STR
+ IP_STR
+ BGP_STR
+ "BGP view\n"
+ "View name\n"
+ "Summary of BGP neighbor status\n")
+{
+ return bgp_show_summary_vty (vty, argv[0], AFI_IP, SAFI_UNICAST);
+}
+
+DEFUN (show_ip_bgp_ipv4_summary,
+ show_ip_bgp_ipv4_summary_cmd,
+ "show ip bgp ipv4 (unicast|multicast) summary",
+ SHOW_STR
+ IP_STR
+ BGP_STR
+ "Address family\n"
+ "Address Family modifier\n"
+ "Address Family modifier\n"
+ "Summary of BGP neighbor status\n")
+{
+ if (strncmp (argv[0], "m", 1) == 0)
+ return bgp_show_summary_vty (vty, NULL, AFI_IP, SAFI_MULTICAST);
+
+ return bgp_show_summary_vty (vty, NULL, AFI_IP, SAFI_UNICAST);
+}
+
+DEFUN (show_ip_bgp_instance_ipv4_summary,
+ show_ip_bgp_instance_ipv4_summary_cmd,
+ "show ip bgp view WORD ipv4 (unicast|multicast) summary",
+ SHOW_STR
+ IP_STR
+ BGP_STR
+ "BGP view\n"
+ "View name\n"
+ "Address family\n"
+ "Address Family modifier\n"
+ "Address Family modifier\n"
+ "Summary of BGP neighbor status\n")
+{
+ if (strncmp (argv[1], "m", 1) == 0)
+ return bgp_show_summary_vty (vty, argv[0], AFI_IP, SAFI_MULTICAST);
+ else
+ return bgp_show_summary_vty (vty, argv[0], AFI_IP, SAFI_UNICAST);
+}
+
+DEFUN (show_ip_bgp_vpnv4_all_summary,
+ show_ip_bgp_vpnv4_all_summary_cmd,
+ "show ip bgp vpnv4 all summary",
+ SHOW_STR
+ IP_STR
+ BGP_STR
+ "Display VPNv4 NLRI specific information\n"
+ "Display information about all VPNv4 NLRIs\n"
+ "Summary of BGP neighbor status\n")
+{
+ return bgp_show_summary_vty (vty, NULL, AFI_IP, SAFI_MPLS_VPN);
+}
+
+DEFUN (show_ip_bgp_vpnv4_rd_summary,
+ show_ip_bgp_vpnv4_rd_summary_cmd,
+ "show ip bgp vpnv4 rd ASN:nn_or_IP-address:nn summary",
+ SHOW_STR
+ IP_STR
+ BGP_STR
+ "Display VPNv4 NLRI specific information\n"
+ "Display information for a route distinguisher\n"
+ "VPN Route Distinguisher\n"
+ "Summary of BGP neighbor status\n")
+{
+ int ret;
+ struct prefix_rd prd;
+
+ ret = str2prefix_rd (argv[0], &prd);
+ if (! ret)
+ {
+ vty_out (vty, "%% Malformed Route Distinguisher%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ return bgp_show_summary_vty (vty, NULL, AFI_IP, SAFI_MPLS_VPN);
+}
+
+#ifdef HAVE_IPV6
+DEFUN (show_bgp_summary,
+ show_bgp_summary_cmd,
+ "show bgp summary",
+ SHOW_STR
+ BGP_STR
+ "Summary of BGP neighbor status\n")
+{
+ return bgp_show_summary_vty (vty, NULL, AFI_IP6, SAFI_UNICAST);
+}
+
+DEFUN (show_bgp_instance_summary,
+ show_bgp_instance_summary_cmd,
+ "show bgp view WORD summary",
+ SHOW_STR
+ BGP_STR
+ "BGP view\n"
+ "View name\n"
+ "Summary of BGP neighbor status\n")
+{
+ return bgp_show_summary_vty (vty, argv[0], AFI_IP6, SAFI_UNICAST);
+}
+
+ALIAS (show_bgp_summary,
+ show_bgp_ipv6_summary_cmd,
+ "show bgp ipv6 summary",
+ SHOW_STR
+ BGP_STR
+ "Address family\n"
+ "Summary of BGP neighbor status\n")
+
+ALIAS (show_bgp_instance_summary,
+ show_bgp_instance_ipv6_summary_cmd,
+ "show bgp view WORD ipv6 summary",
+ SHOW_STR
+ BGP_STR
+ "BGP view\n"
+ "View name\n"
+ "Address family\n"
+ "Summary of BGP neighbor status\n")
+
+/* old command */
+DEFUN (show_ipv6_bgp_summary,
+ show_ipv6_bgp_summary_cmd,
+ "show ipv6 bgp summary",
+ SHOW_STR
+ IPV6_STR
+ BGP_STR
+ "Summary of BGP neighbor status\n")
+{
+ return bgp_show_summary_vty (vty, NULL, AFI_IP6, SAFI_UNICAST);
+}
+
+/* old command */
+DEFUN (show_ipv6_mbgp_summary,
+ show_ipv6_mbgp_summary_cmd,
+ "show ipv6 mbgp summary",
+ SHOW_STR
+ IPV6_STR
+ MBGP_STR
+ "Summary of BGP neighbor status\n")
+{
+ return bgp_show_summary_vty (vty, NULL, AFI_IP6, SAFI_MULTICAST);
+}
+#endif /* HAVE_IPV6 */
+
+/* Show BGP peer's information. */
+enum show_type
+{
+ show_all,
+ show_peer
+};
+
+void
+bgp_show_peer_afi_orf_cap (struct vty *vty, struct peer *p,
+ afi_t afi, safi_t safi,
+ u_int16_t adv_smcap, u_int16_t adv_rmcap,
+ u_int16_t rcv_smcap, u_int16_t rcv_rmcap)
+{
+ /* Send-Mode */
+ if (CHECK_FLAG (p->af_cap[afi][safi], adv_smcap)
+ || CHECK_FLAG (p->af_cap[afi][safi], rcv_smcap))
+ {
+ vty_out (vty, " Send-mode: ");
+ if (CHECK_FLAG (p->af_cap[afi][safi], adv_smcap))
+ vty_out (vty, "advertised");
+ if (CHECK_FLAG (p->af_cap[afi][safi], rcv_smcap))
+ vty_out (vty, "%sreceived",
+ CHECK_FLAG (p->af_cap[afi][safi], adv_smcap) ?
+ ", " : "");
+ vty_out (vty, "%s", VTY_NEWLINE);
+ }
+
+ /* Receive-Mode */
+ if (CHECK_FLAG (p->af_cap[afi][safi], adv_rmcap)
+ || CHECK_FLAG (p->af_cap[afi][safi], rcv_rmcap))
+ {
+ vty_out (vty, " Receive-mode: ");
+ if (CHECK_FLAG (p->af_cap[afi][safi], adv_rmcap))
+ vty_out (vty, "advertised");
+ if (CHECK_FLAG (p->af_cap[afi][safi], rcv_rmcap))
+ vty_out (vty, "%sreceived",
+ CHECK_FLAG (p->af_cap[afi][safi], adv_rmcap) ?
+ ", " : "");
+ vty_out (vty, "%s", VTY_NEWLINE);
+ }
+}
+
+void
+bgp_show_peer_afi (struct vty *vty, struct peer *p, afi_t afi, safi_t safi)
+{
+ struct bgp_filter *filter;
+ char orf_pfx_name[BUFSIZ];
+ int orf_pfx_count;
+
+ filter = &p->filter[afi][safi];
+
+ vty_out (vty, " For address family: %s %s%s",
+ afi == AFI_IP6 ? "IPv6" :
+ safi == SAFI_MPLS_VPN ? "VPNv4" : "IPv4",
+ safi == SAFI_MULTICAST ? "Multicast" : "Unicast",
+ VTY_NEWLINE);
+ if (p->af_group[afi][safi])
+ vty_out (vty, " %s peer-group member%s", p->group->name, VTY_NEWLINE);
+
+ if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
+ || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV)
+ || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_OLD_RCV)
+ || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV)
+ || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_RCV)
+ || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_OLD_RCV))
+ vty_out (vty, " AF-dependant capabilities:%s", VTY_NEWLINE);
+
+ if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
+ || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV)
+ || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV)
+ || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_RCV))
+ {
+ vty_out (vty, " Outbound Route Filter (ORF) type (%d) Prefix-list:%s",
+ ORF_TYPE_PREFIX, VTY_NEWLINE);
+ bgp_show_peer_afi_orf_cap (vty, p, afi, safi,
+ PEER_CAP_ORF_PREFIX_SM_ADV,
+ PEER_CAP_ORF_PREFIX_RM_ADV,
+ PEER_CAP_ORF_PREFIX_SM_RCV,
+ PEER_CAP_ORF_PREFIX_RM_RCV);
+ }
+ if (CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
+ || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_OLD_RCV)
+ || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV)
+ || CHECK_FLAG (p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_OLD_RCV))
+ {
+ vty_out (vty, " Outbound Route Filter (ORF) type (%d) Prefix-list:%s",
+ ORF_TYPE_PREFIX_OLD, VTY_NEWLINE);
+ bgp_show_peer_afi_orf_cap (vty, p, afi, safi,
+ PEER_CAP_ORF_PREFIX_SM_ADV,
+ PEER_CAP_ORF_PREFIX_RM_ADV,
+ PEER_CAP_ORF_PREFIX_SM_OLD_RCV,
+ PEER_CAP_ORF_PREFIX_RM_OLD_RCV);
+ }
+
+ sprintf (orf_pfx_name, "%s.%d.%d", p->host, afi, safi);
+ orf_pfx_count = prefix_bgp_show_prefix_list (NULL, afi, orf_pfx_name);
+
+ if (CHECK_FLAG (p->af_sflags[afi][safi], PEER_STATUS_ORF_PREFIX_SEND)
+ || orf_pfx_count)
+ {
+ vty_out (vty, " Outbound Route Filter (ORF):");
+ if (CHECK_FLAG (p->af_sflags[afi][safi], PEER_STATUS_ORF_PREFIX_SEND))
+ vty_out (vty, " sent;");
+ if (orf_pfx_count)
+ vty_out (vty, " received (%d entries)", orf_pfx_count);
+ vty_out (vty, "%s", VTY_NEWLINE);
+ }
+ if (CHECK_FLAG (p->af_sflags[afi][safi], PEER_STATUS_ORF_WAIT_REFRESH))
+ vty_out (vty, " First update is deferred until ORF or ROUTE-REFRESH is received%s", VTY_NEWLINE);
+
+ if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
+ vty_out (vty, " Route-Reflector Client%s", VTY_NEWLINE);
+ if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
+ vty_out (vty, " Route-Server Client%s", VTY_NEWLINE);
+ if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
+ vty_out (vty, " Inbound soft reconfiguration allowed%s", VTY_NEWLINE);
+ if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_REMOVE_PRIVATE_AS))
+ vty_out (vty, " Private AS number removed from updates to this neighbor%s", VTY_NEWLINE);
+ if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_NEXTHOP_SELF))
+ vty_out (vty, " NEXT_HOP is always this router%s", VTY_NEWLINE);
+ if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_AS_PATH_UNCHANGED))
+ vty_out (vty, " AS_PATH is propagated unchanged to this neighbor%s", VTY_NEWLINE);
+ if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_NEXTHOP_UNCHANGED))
+ vty_out (vty, " NEXT_HOP is propagated unchanged to this neighbor%s", VTY_NEWLINE);
+ if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_MED_UNCHANGED))
+ vty_out (vty, " MED is propagated unchanged to this neighbor%s", VTY_NEWLINE);
+ if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SEND_COMMUNITY)
+ || CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SEND_EXT_COMMUNITY))
+ {
+ vty_out (vty, " Community attribute sent to this neighbor");
+ if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SEND_COMMUNITY)
+ && CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SEND_EXT_COMMUNITY))
+ vty_out (vty, " (both)%s", VTY_NEWLINE);
+ else if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_SEND_EXT_COMMUNITY))
+ vty_out (vty, " (extended)%s", VTY_NEWLINE);
+ else
+ vty_out (vty, " (standard)%s", VTY_NEWLINE);
+ }
+ if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_DEFAULT_ORIGINATE))
+ {
+ vty_out (vty, " Default information originate,");
+
+ if (p->default_rmap[afi][safi].name)
+ vty_out (vty, " default route-map %s%s,",
+ p->default_rmap[afi][safi].map ? "*" : "",
+ p->default_rmap[afi][safi].name);
+ if (CHECK_FLAG (p->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE))
+ vty_out (vty, " default sent%s", VTY_NEWLINE);
+ else
+ vty_out (vty, " default not sent%s", VTY_NEWLINE);
+ }
+
+ if (filter->plist[FILTER_IN].name
+ || filter->dlist[FILTER_IN].name
+ || filter->aslist[FILTER_IN].name
+ || filter->map[FILTER_IN].name)
+ vty_out (vty, " Inbound path policy configured%s", VTY_NEWLINE);
+ if (filter->plist[FILTER_OUT].name
+ || filter->dlist[FILTER_OUT].name
+ || filter->aslist[FILTER_OUT].name
+ || filter->map[FILTER_OUT].name
+ || filter->usmap.name)
+ vty_out (vty, " Outbound path policy configured%s", VTY_NEWLINE);
+
+ /* prefix-list */
+ if (filter->plist[FILTER_IN].name)
+ vty_out (vty, " Incoming update prefix filter list is %s%s%s",
+ filter->plist[FILTER_IN].plist ? "*" : "",
+ filter->plist[FILTER_IN].name,
+ VTY_NEWLINE);
+ if (filter->plist[FILTER_OUT].name)
+ vty_out (vty, " Outgoing update prefix filter list is %s%s%s",
+ filter->plist[FILTER_OUT].plist ? "*" : "",
+ filter->plist[FILTER_OUT].name,
+ VTY_NEWLINE);
+
+ /* distribute-list */
+ if (filter->dlist[FILTER_IN].name)
+ vty_out (vty, " Incoming update network filter list is %s%s%s",
+ filter->dlist[FILTER_IN].alist ? "*" : "",
+ filter->dlist[FILTER_IN].name,
+ VTY_NEWLINE);
+ if (filter->dlist[FILTER_OUT].name)
+ vty_out (vty, " Outgoing update network filter list is %s%s%s",
+ filter->dlist[FILTER_OUT].alist ? "*" : "",
+ filter->dlist[FILTER_OUT].name,
+ VTY_NEWLINE);
+
+ /* filter-list. */
+ if (filter->aslist[FILTER_IN].name)
+ vty_out (vty, " Incoming update AS path filter list is %s%s%s",
+ filter->aslist[FILTER_IN].aslist ? "*" : "",
+ filter->aslist[FILTER_IN].name,
+ VTY_NEWLINE);
+ if (filter->aslist[FILTER_OUT].name)
+ vty_out (vty, " Outgoing update AS path filter list is %s%s%s",
+ filter->aslist[FILTER_OUT].aslist ? "*" : "",
+ filter->aslist[FILTER_OUT].name,
+ VTY_NEWLINE);
+
+ /* route-map. */
+ if (filter->map[FILTER_IN].name)
+ vty_out (vty, " Route map for incoming advertisements is %s%s%s",
+ filter->map[FILTER_IN].map ? "*" : "",
+ filter->map[FILTER_IN].name,
+ VTY_NEWLINE);
+ if (filter->map[FILTER_OUT].name)
+ vty_out (vty, " Route map for outgoing advertisements is %s%s%s",
+ filter->map[FILTER_OUT].map ? "*" : "",
+ filter->map[FILTER_OUT].name,
+ VTY_NEWLINE);
+
+ /* unsuppress-map */
+ if (filter->usmap.name)
+ vty_out (vty, " Route map for selective unsuppress is %s%s%s",
+ filter->usmap.map ? "*" : "",
+ filter->usmap.name, VTY_NEWLINE);
+
+ /* Receive prefix count */
+ vty_out (vty, " %ld accepted prefixes",
+ p->pcount[afi][safi]);
+ /* Maximum prefix */
+ if (CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX))
+ {
+ vty_out (vty, ", maximum limit %ld%s",
+ p->pmax[afi][safi],
+ CHECK_FLAG (p->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING)
+ ? " (warning-only)" : "");
+ }
+ vty_out (vty, "%s", VTY_NEWLINE);
+
+ vty_out (vty, "%s", VTY_NEWLINE);
+}
+
+void
+bgp_show_peer (struct vty *vty, struct peer *p)
+{
+ struct bgp *bgp;
+ char buf1[BUFSIZ];
+ char timebuf[BGP_UPTIME_LEN];
+
+ bgp = p->bgp;
+
+ /* Configured IP address. */
+ vty_out (vty, "BGP neighbor is %s, ", p->host);
+ vty_out (vty, "remote AS %d, ", p->as);
+ vty_out (vty, "local AS %d%s, ",
+ p->change_local_as ? p->change_local_as : p->local_as,
+ CHECK_FLAG (p->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND) ?
+ " no-prepend" : "");
+ vty_out (vty, "%s link%s",
+ p->as == p->local_as ? "internal" : "external",
+ VTY_NEWLINE);
+
+ /* Description. */
+ if (p->desc)
+ vty_out (vty, " Description: %s%s", p->desc, VTY_NEWLINE);
+
+ /* Peer-group */
+ if (p->group)
+ vty_out (vty, " Member of peer-group %s for session parameters%s",
+ p->group->name, VTY_NEWLINE);
+
+ /* Administrative shutdown. */
+ if (CHECK_FLAG (p->flags, PEER_FLAG_SHUTDOWN))
+ vty_out (vty, " Administratively shut down%s", VTY_NEWLINE);
+
+ /* BGP Version. */
+ vty_out (vty, " BGP version 4");
+ if (p->version == BGP_VERSION_MP_4_DRAFT_00)
+ vty_out (vty, "(with draft-00 verion of multiporotocol extension)");
+ vty_out (vty, ", remote router ID %s%s",
+ inet_ntop (AF_INET, &p->remote_id, buf1, BUFSIZ),
+ VTY_NEWLINE);
+
+ /* Confederation */
+ if (bgp_confederation_peers_check (bgp, p->as))
+ vty_out (vty, " Neighbor under common administration%s", VTY_NEWLINE);
+
+ /* Status. */
+ vty_out (vty, " BGP state = %s",
+ LOOKUP (bgp_status_msg, p->status));
+ if (p->status == Established)
+ vty_out (vty, ", up for %8s",
+ peer_uptime (p->uptime, timebuf, BGP_UPTIME_LEN));
+ vty_out (vty, "%s", VTY_NEWLINE);
+
+ /* read timer */
+ vty_out (vty, " Last read %s", peer_uptime (p->readtime, timebuf, BGP_UPTIME_LEN));
+
+ /* Configured timer values. */
+ vty_out (vty, ", hold time is %d, keepalive interval is %d seconds%s",
+ p->v_holdtime, p->v_keepalive, VTY_NEWLINE);
+ if (CHECK_FLAG (p->config, PEER_CONFIG_TIMER))
+ {
+ vty_out (vty, " Configured hold time is %d", p->holdtime);
+ vty_out (vty, ", keepalive interval is %d seconds%s",
+ p->keepalive, VTY_NEWLINE);
+ }
+
+ /* Capability. */
+ if (p->status == Established)
+ {
+ if (CHECK_FLAG (p->cap, PEER_CAP_REFRESH_ADV)
+ || CHECK_FLAG (p->cap, PEER_CAP_REFRESH_NEW_RCV)
+ || CHECK_FLAG (p->cap, PEER_CAP_REFRESH_OLD_RCV)
+ || CHECK_FLAG (p->cap, PEER_CAP_DYNAMIC_ADV)
+ || CHECK_FLAG (p->cap, PEER_CAP_DYNAMIC_RCV)
+ || p->afc_adv[AFI_IP][SAFI_UNICAST]
+ || p->afc_recv[AFI_IP][SAFI_UNICAST]
+ || p->afc_adv[AFI_IP][SAFI_MULTICAST]
+ || p->afc_recv[AFI_IP][SAFI_MULTICAST]
+#ifdef HAVE_IPV6
+ || p->afc_adv[AFI_IP6][SAFI_UNICAST]
+ || p->afc_recv[AFI_IP6][SAFI_UNICAST]
+ || p->afc_adv[AFI_IP6][SAFI_MULTICAST]
+ || p->afc_recv[AFI_IP6][SAFI_MULTICAST]
+#endif /* HAVE_IPV6 */
+ || p->afc_adv[AFI_IP][SAFI_MPLS_VPN]
+ || p->afc_recv[AFI_IP][SAFI_MPLS_VPN])
+ {
+ vty_out (vty, " Neighbor capabilities:%s", VTY_NEWLINE);
+
+ /* Dynamic */
+ if (CHECK_FLAG (p->cap, PEER_CAP_DYNAMIC_RCV)
+ || CHECK_FLAG (p->cap, PEER_CAP_DYNAMIC_ADV))
+ {
+ vty_out (vty, " Dynamic:");
+ if (CHECK_FLAG (p->cap, PEER_CAP_DYNAMIC_ADV))
+ vty_out (vty, " advertised");
+ if (CHECK_FLAG (p->cap, PEER_CAP_DYNAMIC_RCV))
+ {
+ if (CHECK_FLAG (p->cap, PEER_CAP_DYNAMIC_ADV))
+ vty_out (vty, " and");
+ vty_out (vty, " received");
+ }
+ vty_out (vty, "%s", VTY_NEWLINE);
+ }
+
+ /* Route Refresh */
+ if (CHECK_FLAG (p->cap, PEER_CAP_REFRESH_ADV)
+ || CHECK_FLAG (p->cap, PEER_CAP_REFRESH_NEW_RCV)
+ || CHECK_FLAG (p->cap, PEER_CAP_REFRESH_OLD_RCV))
+ {
+ vty_out (vty, " Route refresh:");
+ if (CHECK_FLAG (p->cap, PEER_CAP_REFRESH_ADV))
+ vty_out (vty, " advertised");
+ if (CHECK_FLAG (p->cap, PEER_CAP_REFRESH_NEW_RCV)
+ || CHECK_FLAG (p->cap, PEER_CAP_REFRESH_OLD_RCV))
+ {
+ if (CHECK_FLAG (p->cap, PEER_CAP_REFRESH_ADV))
+ vty_out (vty, " and");
+ vty_out (vty, " received");
+ if (CHECK_FLAG (p->cap, PEER_CAP_REFRESH_NEW_RCV)
+ && CHECK_FLAG (p->cap, PEER_CAP_REFRESH_OLD_RCV))
+ vty_out (vty, " (old and new)");
+ else if (CHECK_FLAG (p->cap, PEER_CAP_REFRESH_OLD_RCV))
+ vty_out (vty, " (old)");
+ else
+ vty_out (vty, " (new)");
+ }
+ vty_out (vty, "%s", VTY_NEWLINE);
+ }
+
+ /* IPv4 */
+ if (p->afc_adv[AFI_IP][SAFI_UNICAST]
+ || p->afc_recv[AFI_IP][SAFI_UNICAST])
+ {
+ vty_out (vty, " Address family IPv4 Unicast:");
+ if (p->afc_adv[AFI_IP][SAFI_UNICAST])
+ vty_out (vty, " advertised");
+ if (p->afc_recv[AFI_IP][SAFI_UNICAST])
+ {
+ if (p->afc_adv[AFI_IP][SAFI_UNICAST])
+ vty_out (vty, " and");
+ vty_out (vty, " received");
+ }
+ vty_out (vty, "%s", VTY_NEWLINE);
+ }
+ if (p->afc_adv[AFI_IP][SAFI_MULTICAST] || p->afc_recv[AFI_IP][SAFI_MULTICAST])
+ {
+ vty_out (vty, " Address family IPv4 Multicast:");
+ if (p->afc_adv[AFI_IP][SAFI_MULTICAST])
+ vty_out (vty, " advertised");
+ if (p->afc_recv[AFI_IP][SAFI_MULTICAST])
+ {
+ if (p->afc_adv[AFI_IP][SAFI_MULTICAST])
+ vty_out (vty, " and");
+ vty_out (vty, " received");
+ }
+ vty_out (vty, "%s", VTY_NEWLINE);
+ }
+ if (p->afc_adv[AFI_IP][SAFI_MPLS_VPN] || p->afc_recv[AFI_IP][SAFI_MPLS_VPN])
+ {
+ vty_out (vty, " Address family VPNv4 Unicast:");
+ if (p->afc_adv[AFI_IP][SAFI_MPLS_VPN])
+ vty_out (vty, " advertised");
+ if (p->afc_recv[AFI_IP][SAFI_MPLS_VPN])
+ {
+ if (p->afc_adv[AFI_IP][SAFI_MPLS_VPN])
+ vty_out (vty, " and");
+ vty_out (vty, " received");
+ }
+ vty_out (vty, "%s", VTY_NEWLINE);
+ }
+ /* IPv6 */
+#ifdef HAVE_IPV6
+ if (p->afc_adv[AFI_IP6][SAFI_UNICAST] || p->afc_recv[AFI_IP6][SAFI_UNICAST])
+ {
+ vty_out (vty, " Address family IPv6 Unicast:");
+ if (p->afc_adv[AFI_IP6][SAFI_UNICAST])
+ vty_out (vty, " advertised");
+ if (p->afc_recv[AFI_IP6][SAFI_UNICAST])
+ {
+ if (p->afc_adv[AFI_IP6][SAFI_UNICAST])
+ vty_out (vty, " and");
+ vty_out (vty, " received");
+ }
+ vty_out (vty, "%s", VTY_NEWLINE);
+ }
+ if (p->afc_adv[AFI_IP6][SAFI_MULTICAST] || p->afc_recv[AFI_IP6][SAFI_MULTICAST])
+ {
+ vty_out (vty, " Address family IPv6 Multicast:");
+ if (p->afc_adv[AFI_IP6][SAFI_MULTICAST])
+ vty_out (vty, " advertised");
+ if (p->afc_recv[AFI_IP6][SAFI_MULTICAST])
+ {
+ if (p->afc_adv[AFI_IP6][SAFI_MULTICAST])
+ vty_out (vty, " and");
+ vty_out (vty, " received");
+ }
+ vty_out (vty, "%s", VTY_NEWLINE);
+ }
+#endif /* HAVE_IPV6 */
+ }
+ }
+
+ /* Packet counts. */
+ vty_out(vty, " Received %d messages, %d notifications, %d in queue%s",
+ p->open_in + p->update_in + p->keepalive_in + p->refresh_in
+ + p->dynamic_cap_in, p->notify_in, 0, VTY_NEWLINE);
+ vty_out(vty, " Sent %d messages, %d notifications, %ld in queue%s",
+ p->open_out + p->update_out + p->keepalive_out + p->refresh_out
+ + p->dynamic_cap_out, p->notify_out, p->obuf->count, VTY_NEWLINE);
+ vty_out(vty, " Route refresh request: received %d, sent %d%s",
+ p->refresh_in, p->refresh_out, VTY_NEWLINE);
+
+ /* advertisement-interval */
+ vty_out (vty, " Minimum time between advertisement runs is %d seconds%s",
+ p->v_routeadv, VTY_NEWLINE);
+
+ /* Update-source. */
+ if (p->update_if || p->update_source)
+ {
+ vty_out (vty, " Update source is ");
+ if (p->update_if)
+ vty_out (vty, "%s", p->update_if);
+ else if (p->update_source)
+ vty_out (vty, "%s",
+ sockunion2str (p->update_source, buf1, SU_ADDRSTRLEN));
+ vty_out (vty, "%s", VTY_NEWLINE);
+ }
+
+ /* Default weight */
+ if (CHECK_FLAG (p->config, PEER_CONFIG_WEIGHT))
+ vty_out (vty, " Default weight %d%s", p->weight,
+ VTY_NEWLINE);
+
+ vty_out (vty, "%s", VTY_NEWLINE);
+
+ /* Address Family Information */
+ if (p->afc[AFI_IP][SAFI_UNICAST])
+ bgp_show_peer_afi (vty, p, AFI_IP, SAFI_UNICAST);
+ if (p->afc[AFI_IP][SAFI_MULTICAST])
+ bgp_show_peer_afi (vty, p, AFI_IP, SAFI_MULTICAST);
+ if (p->afc[AFI_IP][SAFI_MPLS_VPN])
+ bgp_show_peer_afi (vty, p, AFI_IP, SAFI_MPLS_VPN);
+#ifdef HAVE_IPV6
+ if (p->afc[AFI_IP6][SAFI_UNICAST])
+ bgp_show_peer_afi (vty, p, AFI_IP6, SAFI_UNICAST);
+ if (p->afc[AFI_IP6][SAFI_MULTICAST])
+ bgp_show_peer_afi (vty, p, AFI_IP6, SAFI_MULTICAST);
+#endif /* HAVE_IPV6 */
+
+ vty_out (vty, " Connections established %d; dropped %d%s",
+ p->established, p->dropped,
+ VTY_NEWLINE);
+
+ if (CHECK_FLAG (p->sflags, PEER_STATUS_PREFIX_OVERFLOW))
+ {
+ vty_out (vty, " Peer had exceeded the max. no. of prefixes configured.%s", VTY_NEWLINE);
+ vty_out (vty, " Reduce the no. of prefix and clear ip bgp %s to restore peering%s",
+ p->host, VTY_NEWLINE);
+ }
+
+ /* EBGP Multihop */
+ if (peer_sort (p) != BGP_PEER_IBGP && p->ttl > 1)
+ vty_out (vty, " External BGP neighbor may be up to %d hops away.%s",
+ p->ttl, VTY_NEWLINE);
+
+ /* Local address. */
+ if (p->su_local)
+ {
+ vty_out (vty, "Local host: %s, Local port: %d%s%s",
+ sockunion2str (p->su_local, buf1, SU_ADDRSTRLEN),
+ ntohs (p->su_local->sin.sin_port),
+ CHECK_FLAG (p->flags, PEER_FLAG_PASSIVE) ?
+ ", passive-mode" : "",
+ VTY_NEWLINE);
+ }
+
+ /* Remote address. */
+ if (p->su_remote)
+ {
+ vty_out (vty, "Foreign host: %s, Foreign port: %d%s",
+ sockunion2str (p->su_remote, buf1, SU_ADDRSTRLEN),
+ ntohs (p->su_remote->sin.sin_port),
+ VTY_NEWLINE);
+ }
+
+ /* Nexthop display. */
+ if (p->su_local)
+ {
+ vty_out (vty, "Nexthop: %s%s",
+ inet_ntop (AF_INET, &p->nexthop.v4, buf1, BUFSIZ),
+ VTY_NEWLINE);
+#ifdef HAVE_IPV6
+ vty_out (vty, "Nexthop global: %s%s",
+ inet_ntop (AF_INET6, &p->nexthop.v6_global, buf1, BUFSIZ),
+ VTY_NEWLINE);
+ vty_out (vty, "Nexthop local: %s%s",
+ inet_ntop (AF_INET6, &p->nexthop.v6_local, buf1, BUFSIZ),
+ VTY_NEWLINE);
+ vty_out (vty, "BGP connection: %s%s",
+ p->shared_network ? "shared network" : "non shared network",
+ VTY_NEWLINE);
+#endif /* HAVE_IPV6 */
+ }
+
+ /* Timer information. */
+ if (p->t_start)
+ vty_out (vty, "Next start timer due in %ld seconds%s",
+ thread_timer_remain_second (p->t_start), VTY_NEWLINE);
+ if (p->t_connect)
+ vty_out (vty, "Next connect timer due in %ld seconds%s",
+ thread_timer_remain_second (p->t_connect), VTY_NEWLINE);
+
+ vty_out (vty, "Read thread: %s Write thread: %s%s",
+ p->t_read ? "on" : "off",
+ p->t_write ? "on" : "off",
+ VTY_NEWLINE);
+
+ if (p->notify.code == BGP_NOTIFY_OPEN_ERR
+ && p->notify.subcode == BGP_NOTIFY_OPEN_UNSUP_CAPBL)
+ bgp_capability_vty_out (vty, p);
+
+ vty_out (vty, "%s", VTY_NEWLINE);
+}
+
+int
+bgp_show_neighbor (struct vty *vty, struct bgp *bgp,
+ enum show_type type, union sockunion *su)
+{
+ struct listnode *nn;
+ struct peer *peer;
+ int find = 0;
+
+ LIST_LOOP (bgp->peer, peer, nn)
+ {
+ switch (type)
+ {
+ case show_all:
+ bgp_show_peer (vty, peer);
+ break;
+ case show_peer:
+ if (sockunion_same (&peer->su, su))
+ {
+ find = 1;
+ bgp_show_peer (vty, peer);
+ }
+ break;
+ }
+ }
+
+ if (type == show_peer && ! find)
+ vty_out (vty, "%% No such neighbor%s", VTY_NEWLINE);
+
+ return CMD_SUCCESS;
+}
+
+int
+bgp_show_neighbor_vty (struct vty *vty, char *name, enum show_type type,
+ char *ip_str)
+{
+ int ret;
+ struct bgp *bgp;
+ union sockunion su;
+
+ if (ip_str)
+ {
+ ret = str2sockunion (ip_str, &su);
+ if (ret < 0)
+ {
+ vty_out (vty, "%% Malformed address: %s%s", ip_str, VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+ }
+
+ if (name)
+ {
+ bgp = bgp_lookup_by_name (name);
+
+ if (! bgp)
+ {
+ vty_out (vty, "%% No such BGP instance exist%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ bgp_show_neighbor (vty, bgp, type, &su);
+
+ return CMD_SUCCESS;
+ }
+
+ bgp = bgp_get_default ();
+
+ if (bgp)
+ bgp_show_neighbor (vty, bgp, type, &su);
+
+ return CMD_SUCCESS;
+}
+
+/* "show ip bgp neighbors" commands. */
+DEFUN (show_ip_bgp_neighbors,
+ show_ip_bgp_neighbors_cmd,
+ "show ip bgp neighbors",
+ SHOW_STR
+ IP_STR
+ BGP_STR
+ "Detailed information on TCP and BGP neighbor connections\n")
+{
+ return bgp_show_neighbor_vty (vty, NULL, show_all, NULL);
+}
+
+ALIAS (show_ip_bgp_neighbors,
+ show_ip_bgp_ipv4_neighbors_cmd,
+ "show ip bgp ipv4 (unicast|multicast) neighbors",
+ SHOW_STR
+ IP_STR
+ BGP_STR
+ "Address family\n"
+ "Address Family modifier\n"
+ "Address Family modifier\n"
+ "Detailed information on TCP and BGP neighbor connections\n")
+
+ALIAS (show_ip_bgp_neighbors,
+ show_ip_bgp_vpnv4_all_neighbors_cmd,
+ "show ip bgp vpnv4 all neighbors",
+ SHOW_STR
+ IP_STR
+ BGP_STR
+ "Display VPNv4 NLRI specific information\n"
+ "Display information about all VPNv4 NLRIs\n"
+ "Detailed information on TCP and BGP neighbor connections\n")
+
+ALIAS (show_ip_bgp_neighbors,
+ show_ip_bgp_vpnv4_rd_neighbors_cmd,
+ "show ip bgp vpnv4 rd ASN:nn_or_IP-address:nn neighbors",
+ SHOW_STR
+ IP_STR
+ BGP_STR
+ "Display VPNv4 NLRI specific information\n"
+ "Display information for a route distinguisher\n"
+ "VPN Route Distinguisher\n"
+ "Detailed information on TCP and BGP neighbor connections\n")
+
+ALIAS (show_ip_bgp_neighbors,
+ show_bgp_neighbors_cmd,
+ "show bgp neighbors",
+ SHOW_STR
+ BGP_STR
+ "Detailed information on TCP and BGP neighbor connections\n")
+
+ALIAS (show_ip_bgp_neighbors,
+ show_bgp_ipv6_neighbors_cmd,
+ "show bgp ipv6 neighbors",
+ SHOW_STR
+ BGP_STR
+ "Address family\n"
+ "Detailed information on TCP and BGP neighbor connections\n")
+
+DEFUN (show_ip_bgp_neighbors_peer,
+ show_ip_bgp_neighbors_peer_cmd,
+ "show ip bgp neighbors (A.B.C.D|X:X::X:X)",
+ SHOW_STR
+ IP_STR
+ BGP_STR
+ "Detailed information on TCP and BGP neighbor connections\n"
+ "Neighbor to display information about\n"
+ "Neighbor to display information about\n")
+{
+ return bgp_show_neighbor_vty (vty, NULL, show_peer, argv[argc - 1]);
+}
+
+ALIAS (show_ip_bgp_neighbors_peer,
+ show_ip_bgp_ipv4_neighbors_peer_cmd,
+ "show ip bgp ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X)",
+ SHOW_STR
+ IP_STR
+ BGP_STR
+ "Address family\n"
+ "Address Family modifier\n"
+ "Address Family modifier\n"
+ "Detailed information on TCP and BGP neighbor connections\n"
+ "Neighbor to display information about\n"
+ "Neighbor to display information about\n")
+
+ALIAS (show_ip_bgp_neighbors_peer,
+ show_ip_bgp_vpnv4_all_neighbors_peer_cmd,
+ "show ip bgp vpnv4 all neighbors A.B.C.D",
+ SHOW_STR
+ IP_STR
+ BGP_STR
+ "Display VPNv4 NLRI specific information\n"
+ "Display information about all VPNv4 NLRIs\n"
+ "Detailed information on TCP and BGP neighbor connections\n"
+ "Neighbor to display information about\n")
+
+ALIAS (show_ip_bgp_neighbors_peer,
+ show_ip_bgp_vpnv4_rd_neighbors_peer_cmd,
+ "show ip bgp vpnv4 rd ASN:nn_or_IP-address:nn neighbors A.B.C.D",
+ SHOW_STR
+ IP_STR
+ BGP_STR
+ "Display VPNv4 NLRI specific information\n"
+ "Display information about all VPNv4 NLRIs\n"
+ "Detailed information on TCP and BGP neighbor connections\n"
+ "Neighbor to display information about\n")
+
+ALIAS (show_ip_bgp_neighbors_peer,
+ show_bgp_neighbors_peer_cmd,
+ "show bgp neighbors (A.B.C.D|X:X::X:X)",
+ SHOW_STR
+ BGP_STR
+ "Detailed information on TCP and BGP neighbor connections\n"
+ "Neighbor to display information about\n"
+ "Neighbor to display information about\n")
+
+ALIAS (show_ip_bgp_neighbors_peer,
+ show_bgp_ipv6_neighbors_peer_cmd,
+ "show bgp ipv6 neighbors (A.B.C.D|X:X::X:X)",
+ SHOW_STR
+ BGP_STR
+ "Address family\n"
+ "Detailed information on TCP and BGP neighbor connections\n"
+ "Neighbor to display information about\n"
+ "Neighbor to display information about\n")
+
+DEFUN (show_ip_bgp_instance_neighbors,
+ show_ip_bgp_instance_neighbors_cmd,
+ "show ip bgp view WORD neighbors",
+ SHOW_STR
+ IP_STR
+ BGP_STR
+ "BGP view\n"
+ "View name\n"
+ "Detailed information on TCP and BGP neighbor connections\n")
+{
+ return bgp_show_neighbor_vty (vty, argv[0], show_all, NULL);
+}
+
+DEFUN (show_ip_bgp_instance_neighbors_peer,
+ show_ip_bgp_instance_neighbors_peer_cmd,
+ "show ip bgp view WORD neighbors (A.B.C.D|X:X::X:X)",
+ SHOW_STR
+ IP_STR
+ BGP_STR
+ "BGP view\n"
+ "View name\n"
+ "Detailed information on TCP and BGP neighbor connections\n"
+ "Neighbor to display information about\n"
+ "Neighbor to display information about\n")
+{
+ return bgp_show_neighbor_vty (vty, argv[0], show_peer, argv[1]);
+}
+
+/* Show BGP's AS paths internal data. There are both `show ip bgp
+ paths' and `show ip mbgp paths'. Those functions results are the
+ same.*/
+DEFUN (show_ip_bgp_paths,
+ show_ip_bgp_paths_cmd,
+ "show ip bgp paths",
+ SHOW_STR
+ IP_STR
+ BGP_STR
+ "Path information\n")
+{
+ vty_out (vty, "Address Refcnt Path%s", VTY_NEWLINE);
+ aspath_print_all_vty (vty);
+ return CMD_SUCCESS;
+}
+
+DEFUN (show_ip_bgp_ipv4_paths,
+ show_ip_bgp_ipv4_paths_cmd,
+ "show ip bgp ipv4 (unicast|multicast) paths",
+ SHOW_STR
+ IP_STR
+ BGP_STR
+ "Address family\n"
+ "Address Family modifier\n"
+ "Address Family modifier\n"
+ "Path information\n")
+{
+ vty_out (vty, "Address Refcnt Path\r\n");
+ aspath_print_all_vty (vty);
+
+ return CMD_SUCCESS;
+}
+
+#include "hash.h"
+
+void
+community_show_all_iterator (struct hash_backet *backet, struct vty *vty)
+{
+ struct community *com;
+
+ com = (struct community *) backet->data;
+ vty_out (vty, "[%p] (%ld) %s%s", backet, com->refcnt,
+ community_str (com), VTY_NEWLINE);
+}
+
+/* Show BGP's community internal data. */
+DEFUN (show_ip_bgp_community_info,
+ show_ip_bgp_community_info_cmd,
+ "show ip bgp community-info",
+ SHOW_STR
+ IP_STR
+ BGP_STR
+ "List all bgp community information\n")
+{
+ vty_out (vty, "Address Refcnt Community%s", VTY_NEWLINE);
+
+ hash_iterate (community_hash (),
+ (void (*) (struct hash_backet *, void *))
+ community_show_all_iterator,
+ vty);
+
+ return CMD_SUCCESS;
+}
+
+DEFUN (show_ip_bgp_attr_info,
+ show_ip_bgp_attr_info_cmd,
+ "show ip bgp attribute-info",
+ SHOW_STR
+ IP_STR
+ BGP_STR
+ "List all bgp attribute information\n")
+{
+ attr_show_all (vty);
+ return CMD_SUCCESS;
+}
+
+/* Redistribute VTY commands. */
+
+/* Utility function to convert user input route type string to route
+ type. */
+static int
+bgp_str2route_type (int afi, char *str)
+{
+ if (! str)
+ return 0;
+
+ if (afi == AFI_IP)
+ {
+ if (strncmp (str, "k", 1) == 0)
+ return ZEBRA_ROUTE_KERNEL;
+ else if (strncmp (str, "c", 1) == 0)
+ return ZEBRA_ROUTE_CONNECT;
+ else if (strncmp (str, "s", 1) == 0)
+ return ZEBRA_ROUTE_STATIC;
+ else if (strncmp (str, "r", 1) == 0)
+ return ZEBRA_ROUTE_RIP;
+ else if (strncmp (str, "o", 1) == 0)
+ return ZEBRA_ROUTE_OSPF;
+ }
+ if (afi == AFI_IP6)
+ {
+ if (strncmp (str, "k", 1) == 0)
+ return ZEBRA_ROUTE_KERNEL;
+ else if (strncmp (str, "c", 1) == 0)
+ return ZEBRA_ROUTE_CONNECT;
+ else if (strncmp (str, "s", 1) == 0)
+ return ZEBRA_ROUTE_STATIC;
+ else if (strncmp (str, "r", 1) == 0)
+ return ZEBRA_ROUTE_RIPNG;
+ else if (strncmp (str, "o", 1) == 0)
+ return ZEBRA_ROUTE_OSPF6;
+ }
+ return 0;
+}
+
+DEFUN (bgp_redistribute_ipv4,
+ bgp_redistribute_ipv4_cmd,
+ "redistribute (connected|kernel|ospf|rip|static)",
+ "Redistribute information from another routing protocol\n"
+ "Connected\n"
+ "Kernel routes\n"
+ "Open Shurtest Path First (OSPF)\n"
+ "Routing Information Protocol (RIP)\n"
+ "Static routes\n")
+{
+ int type;
+
+ type = bgp_str2route_type (AFI_IP, argv[0]);
+ if (! type)
+ {
+ vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+ return bgp_redistribute_set (vty->index, AFI_IP, type);
+}
+
+DEFUN (bgp_redistribute_ipv4_rmap,
+ bgp_redistribute_ipv4_rmap_cmd,
+ "redistribute (connected|kernel|ospf|rip|static) route-map WORD",
+ "Redistribute information from another routing protocol\n"
+ "Connected\n"
+ "Kernel routes\n"
+ "Open Shurtest Path First (OSPF)\n"
+ "Routing Information Protocol (RIP)\n"
+ "Static routes\n"
+ "Route map reference\n"
+ "Pointer to route-map entries\n")
+{
+ int type;
+
+ type = bgp_str2route_type (AFI_IP, argv[0]);
+ if (! type)
+ {
+ vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ bgp_redistribute_rmap_set (vty->index, AFI_IP, type, argv[1]);
+ return bgp_redistribute_set (vty->index, AFI_IP, type);
+}
+
+DEFUN (bgp_redistribute_ipv4_metric,
+ bgp_redistribute_ipv4_metric_cmd,
+ "redistribute (connected|kernel|ospf|rip|static) metric <0-4294967295>",
+ "Redistribute information from another routing protocol\n"
+ "Connected\n"
+ "Kernel routes\n"
+ "Open Shurtest Path First (OSPF)\n"
+ "Routing Information Protocol (RIP)\n"
+ "Static routes\n"
+ "Metric for redistributed routes\n"
+ "Default metric\n")
+{
+ int type;
+ u_int32_t metric;
+
+ type = bgp_str2route_type (AFI_IP, argv[0]);
+ if (! type)
+ {
+ vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+ VTY_GET_INTEGER ("metric", metric, argv[1]);
+
+ bgp_redistribute_metric_set (vty->index, AFI_IP, type, metric);
+ return bgp_redistribute_set (vty->index, AFI_IP, type);
+}
+
+DEFUN (bgp_redistribute_ipv4_rmap_metric,
+ bgp_redistribute_ipv4_rmap_metric_cmd,
+ "redistribute (connected|kernel|ospf|rip|static) route-map WORD metric <0-4294967295>",
+ "Redistribute information from another routing protocol\n"
+ "Connected\n"
+ "Kernel routes\n"
+ "Open Shurtest Path First (OSPF)\n"
+ "Routing Information Protocol (RIP)\n"
+ "Static routes\n"
+ "Route map reference\n"
+ "Pointer to route-map entries\n"
+ "Metric for redistributed routes\n"
+ "Default metric\n")
+{
+ int type;
+ u_int32_t metric;
+
+ type = bgp_str2route_type (AFI_IP, argv[0]);
+ if (! type)
+ {
+ vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+ VTY_GET_INTEGER ("metric", metric, argv[2]);
+
+ bgp_redistribute_rmap_set (vty->index, AFI_IP, type, argv[1]);
+ bgp_redistribute_metric_set (vty->index, AFI_IP, type, metric);
+ return bgp_redistribute_set (vty->index, AFI_IP, type);
+}
+
+DEFUN (bgp_redistribute_ipv4_metric_rmap,
+ bgp_redistribute_ipv4_metric_rmap_cmd,
+ "redistribute (connected|kernel|ospf|rip|static) metric <0-4294967295> route-map WORD",
+ "Redistribute information from another routing protocol\n"
+ "Connected\n"
+ "Kernel routes\n"
+ "Open Shurtest Path First (OSPF)\n"
+ "Routing Information Protocol (RIP)\n"
+ "Static routes\n"
+ "Metric for redistributed routes\n"
+ "Default metric\n"
+ "Route map reference\n"
+ "Pointer to route-map entries\n")
+{
+ int type;
+ u_int32_t metric;
+
+ type = bgp_str2route_type (AFI_IP, argv[0]);
+ if (! type)
+ {
+ vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+ VTY_GET_INTEGER ("metric", metric, argv[1]);
+
+ bgp_redistribute_metric_set (vty->index, AFI_IP, type, metric);
+ bgp_redistribute_rmap_set (vty->index, AFI_IP, type, argv[2]);
+ return bgp_redistribute_set (vty->index, AFI_IP, type);
+}
+
+DEFUN (no_bgp_redistribute_ipv4,
+ no_bgp_redistribute_ipv4_cmd,
+ "no redistribute (connected|kernel|ospf|rip|static)",
+ NO_STR
+ "Redistribute information from another routing protocol\n"
+ "Connected\n"
+ "Kernel routes\n"
+ "Open Shurtest Path First (OSPF)\n"
+ "Routing Information Protocol (RIP)\n"
+ "Static routes\n")
+{
+ int type;
+
+ type = bgp_str2route_type (AFI_IP, argv[0]);
+ if (! type)
+ {
+ vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ return bgp_redistribute_unset (vty->index, AFI_IP, type);
+}
+
+DEFUN (no_bgp_redistribute_ipv4_rmap,
+ no_bgp_redistribute_ipv4_rmap_cmd,
+ "no redistribute (connected|kernel|ospf|rip|static) route-map WORD",
+ NO_STR
+ "Redistribute information from another routing protocol\n"
+ "Connected\n"
+ "Kernel routes\n"
+ "Open Shurtest Path First (OSPF)\n"
+ "Routing Information Protocol (RIP)\n"
+ "Static routes\n"
+ "Route map reference\n"
+ "Pointer to route-map entries\n")
+{
+ int type;
+
+ type = bgp_str2route_type (AFI_IP, argv[0]);
+ if (! type)
+ {
+ vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ bgp_redistribute_routemap_unset (vty->index, AFI_IP, type);
+ return CMD_SUCCESS;
+}
+
+DEFUN (no_bgp_redistribute_ipv4_metric,
+ no_bgp_redistribute_ipv4_metric_cmd,
+ "no redistribute (connected|kernel|ospf|rip|static) metric <0-4294967295>",
+ NO_STR
+ "Redistribute information from another routing protocol\n"
+ "Connected\n"
+ "Kernel routes\n"
+ "Open Shurtest Path First (OSPF)\n"
+ "Routing Information Protocol (RIP)\n"
+ "Static routes\n"
+ "Metric for redistributed routes\n"
+ "Default metric\n")
+{
+ int type;
+
+ type = bgp_str2route_type (AFI_IP, argv[0]);
+ if (! type)
+ {
+ vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ bgp_redistribute_metric_unset (vty->index, AFI_IP, type);
+ return CMD_SUCCESS;
+}
+
+DEFUN (no_bgp_redistribute_ipv4_rmap_metric,
+ no_bgp_redistribute_ipv4_rmap_metric_cmd,
+ "no redistribute (connected|kernel|ospf|rip|static) route-map WORD metric <0-4294967295>",
+ NO_STR
+ "Redistribute information from another routing protocol\n"
+ "Connected\n"
+ "Kernel routes\n"
+ "Open Shurtest Path First (OSPF)\n"
+ "Routing Information Protocol (RIP)\n"
+ "Static routes\n"
+ "Route map reference\n"
+ "Pointer to route-map entries\n"
+ "Metric for redistributed routes\n"
+ "Default metric\n")
+{
+ int type;
+
+ type = bgp_str2route_type (AFI_IP, argv[0]);
+ if (! type)
+ {
+ vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ bgp_redistribute_metric_unset (vty->index, AFI_IP, type);
+ bgp_redistribute_routemap_unset (vty->index, AFI_IP, type);
+ return CMD_SUCCESS;
+}
+
+ALIAS (no_bgp_redistribute_ipv4_rmap_metric,
+ no_bgp_redistribute_ipv4_metric_rmap_cmd,
+ "no redistribute (connected|kernel|ospf|rip|static) metric <0-4294967295> route-map WORD",
+ NO_STR
+ "Redistribute information from another routing protocol\n"
+ "Connected\n"
+ "Kernel routes\n"
+ "Open Shurtest Path First (OSPF)\n"
+ "Routing Information Protocol (RIP)\n"
+ "Static routes\n"
+ "Metric for redistributed routes\n"
+ "Default metric\n"
+ "Route map reference\n"
+ "Pointer to route-map entries\n")
+
+#ifdef HAVE_IPV6
+DEFUN (bgp_redistribute_ipv6,
+ bgp_redistribute_ipv6_cmd,
+ "redistribute (connected|kernel|ospf6|ripng|static)",
+ "Redistribute information from another routing protocol\n"
+ "Connected\n"
+ "Kernel routes\n"
+ "Open Shurtest Path First (OSPFv3)\n"
+ "Routing Information Protocol (RIPng)\n"
+ "Static routes\n")
+{
+ int type;
+
+ type = bgp_str2route_type (AFI_IP6, argv[0]);
+ if (! type)
+ {
+ vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ return bgp_redistribute_set (vty->index, AFI_IP6, type);
+}
+
+DEFUN (bgp_redistribute_ipv6_rmap,
+ bgp_redistribute_ipv6_rmap_cmd,
+ "redistribute (connected|kernel|ospf6|ripng|static) route-map WORD",
+ "Redistribute information from another routing protocol\n"
+ "Connected\n"
+ "Kernel routes\n"
+ "Open Shurtest Path First (OSPFv3)\n"
+ "Routing Information Protocol (RIPng)\n"
+ "Static routes\n"
+ "Route map reference\n"
+ "Pointer to route-map entries\n")
+{
+ int type;
+
+ type = bgp_str2route_type (AFI_IP6, argv[0]);
+ if (! type)
+ {
+ vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ bgp_redistribute_rmap_set (vty->index, AFI_IP6, type, argv[1]);
+ return bgp_redistribute_set (vty->index, AFI_IP6, type);
+}
+
+DEFUN (bgp_redistribute_ipv6_metric,
+ bgp_redistribute_ipv6_metric_cmd,
+ "redistribute (connected|kernel|ospf6|ripng|static) metric <0-4294967295>",
+ "Redistribute information from another routing protocol\n"
+ "Connected\n"
+ "Kernel routes\n"
+ "Open Shurtest Path First (OSPFv3)\n"
+ "Routing Information Protocol (RIPng)\n"
+ "Static routes\n"
+ "Metric for redistributed routes\n"
+ "Default metric\n")
+{
+ int type;
+ u_int32_t metric;
+
+ type = bgp_str2route_type (AFI_IP6, argv[0]);
+ if (! type)
+ {
+ vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+ VTY_GET_INTEGER ("metric", metric, argv[1]);
+
+ bgp_redistribute_metric_set (vty->index, AFI_IP6, type, metric);
+ return bgp_redistribute_set (vty->index, AFI_IP6, type);
+}
+
+DEFUN (bgp_redistribute_ipv6_rmap_metric,
+ bgp_redistribute_ipv6_rmap_metric_cmd,
+ "redistribute (connected|kernel|ospf6|ripng|static) route-map WORD metric <0-4294967295>",
+ "Redistribute information from another routing protocol\n"
+ "Connected\n"
+ "Kernel routes\n"
+ "Open Shurtest Path First (OSPFv3)\n"
+ "Routing Information Protocol (RIPng)\n"
+ "Static routes\n"
+ "Route map reference\n"
+ "Pointer to route-map entries\n"
+ "Metric for redistributed routes\n"
+ "Default metric\n")
+{
+ int type;
+ u_int32_t metric;
+
+ type = bgp_str2route_type (AFI_IP6, argv[0]);
+ if (! type)
+ {
+ vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+ VTY_GET_INTEGER ("metric", metric, argv[2]);
+
+ bgp_redistribute_rmap_set (vty->index, AFI_IP6, type, argv[1]);
+ bgp_redistribute_metric_set (vty->index, AFI_IP6, type, metric);
+ return bgp_redistribute_set (vty->index, AFI_IP6, type);
+}
+
+DEFUN (bgp_redistribute_ipv6_metric_rmap,
+ bgp_redistribute_ipv6_metric_rmap_cmd,
+ "redistribute (connected|kernel|ospf6|ripng|static) metric <0-4294967295> route-map WORD",
+ "Redistribute information from another routing protocol\n"
+ "Connected\n"
+ "Kernel routes\n"
+ "Open Shurtest Path First (OSPFv3)\n"
+ "Routing Information Protocol (RIPng)\n"
+ "Static routes\n"
+ "Metric for redistributed routes\n"
+ "Default metric\n"
+ "Route map reference\n"
+ "Pointer to route-map entries\n")
+{
+ int type;
+ u_int32_t metric;
+
+ type = bgp_str2route_type (AFI_IP6, argv[0]);
+ if (! type)
+ {
+ vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+ VTY_GET_INTEGER ("metric", metric, argv[1]);
+
+ bgp_redistribute_metric_set (vty->index, AFI_IP6, type, metric);
+ bgp_redistribute_rmap_set (vty->index, AFI_IP6, type, argv[2]);
+ return bgp_redistribute_set (vty->index, AFI_IP6, type);
+}
+
+DEFUN (no_bgp_redistribute_ipv6,
+ no_bgp_redistribute_ipv6_cmd,
+ "no redistribute (connected|kernel|ospf6|ripng|static)",
+ NO_STR
+ "Redistribute information from another routing protocol\n"
+ "Connected\n"
+ "Kernel routes\n"
+ "Open Shurtest Path First (OSPFv3)\n"
+ "Routing Information Protocol (RIPng)\n"
+ "Static routes\n")
+{
+ int type;
+
+ type = bgp_str2route_type (AFI_IP6, argv[0]);
+ if (! type)
+ {
+ vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ return bgp_redistribute_unset (vty->index, AFI_IP6, type);
+}
+
+DEFUN (no_bgp_redistribute_ipv6_rmap,
+ no_bgp_redistribute_ipv6_rmap_cmd,
+ "no redistribute (connected|kernel|ospf6|ripng|static) route-map WORD",
+ NO_STR
+ "Redistribute information from another routing protocol\n"
+ "Connected\n"
+ "Kernel routes\n"
+ "Open Shurtest Path First (OSPFv3)\n"
+ "Routing Information Protocol (RIPng)\n"
+ "Static routes\n"
+ "Route map reference\n"
+ "Pointer to route-map entries\n")
+{
+ int type;
+
+ type = bgp_str2route_type (AFI_IP6, argv[0]);
+ if (! type)
+ {
+ vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ bgp_redistribute_routemap_unset (vty->index, AFI_IP6, type);
+ return CMD_SUCCESS;
+}
+
+DEFUN (no_bgp_redistribute_ipv6_metric,
+ no_bgp_redistribute_ipv6_metric_cmd,
+ "no redistribute (connected|kernel|ospf6|ripng|static) metric <0-4294967295>",
+ NO_STR
+ "Redistribute information from another routing protocol\n"
+ "Connected\n"
+ "Kernel routes\n"
+ "Open Shurtest Path First (OSPFv3)\n"
+ "Routing Information Protocol (RIPng)\n"
+ "Static routes\n"
+ "Metric for redistributed routes\n"
+ "Default metric\n")
+{
+ int type;
+
+ type = bgp_str2route_type (AFI_IP6, argv[0]);
+ if (! type)
+ {
+ vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ bgp_redistribute_metric_unset (vty->index, AFI_IP6, type);
+ return CMD_SUCCESS;
+}
+
+DEFUN (no_bgp_redistribute_ipv6_rmap_metric,
+ no_bgp_redistribute_ipv6_rmap_metric_cmd,
+ "no redistribute (connected|kernel|ospf6|ripng|static) route-map WORD metric <0-4294967295>",
+ NO_STR
+ "Redistribute information from another routing protocol\n"
+ "Connected\n"
+ "Kernel routes\n"
+ "Open Shurtest Path First (OSPFv3)\n"
+ "Routing Information Protocol (RIPng)\n"
+ "Static routes\n"
+ "Route map reference\n"
+ "Pointer to route-map entries\n"
+ "Metric for redistributed routes\n"
+ "Default metric\n")
+{
+ int type;
+
+ type = bgp_str2route_type (AFI_IP6, argv[0]);
+ if (! type)
+ {
+ vty_out (vty, "%% Invalid route type%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ bgp_redistribute_metric_unset (vty->index, AFI_IP6, type);
+ bgp_redistribute_routemap_unset (vty->index, AFI_IP6, type);
+ return CMD_SUCCESS;
+}
+
+ALIAS (no_bgp_redistribute_ipv6_rmap_metric,
+ no_bgp_redistribute_ipv6_metric_rmap_cmd,
+ "no redistribute (connected|kernel|ospf6|ripng|static) metric <0-4294967295> route-map WORD",
+ NO_STR
+ "Redistribute information from another routing protocol\n"
+ "Connected\n"
+ "Kernel routes\n"
+ "Open Shurtest Path First (OSPFv3)\n"
+ "Routing Information Protocol (RIPng)\n"
+ "Static routes\n"
+ "Metric for redistributed routes\n"
+ "Default metric\n"
+ "Route map reference\n"
+ "Pointer to route-map entries\n")
+#endif /* HAVE_IPV6 */
+
+int
+bgp_config_write_redistribute (struct vty *vty, struct bgp *bgp, afi_t afi,
+ safi_t safi, int *write)
+{
+ int i;
+ char *str[] = { "system", "kernel", "connected", "static", "rip",
+ "ripng", "ospf", "ospf6", "bgp"};
+
+ /* Unicast redistribution only. */
+ if (safi != SAFI_UNICAST)
+ return 0;
+
+ for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
+ {
+ /* Redistribute BGP does not make sense. */
+ if (bgp->redist[afi][i] && i != ZEBRA_ROUTE_BGP)
+ {
+ /* Display "address-family" when it is not yet diplayed. */
+ bgp_config_write_family_header (vty, afi, safi, write);
+
+ /* "redistribute" configuration. */
+ vty_out (vty, " redistribute %s", str[i]);
+
+ if (bgp->redist_metric_flag[afi][i])
+ vty_out (vty, " metric %d", bgp->redist_metric[afi][i]);
+
+ if (bgp->rmap[afi][i].name)
+ vty_out (vty, " route-map %s", bgp->rmap[afi][i].name);
+
+ vty_out (vty, "%s", VTY_NEWLINE);
+ }
+ }
+ return *write;
+}
+
+/* BGP node structure. */
+struct cmd_node bgp_node =
+{
+ BGP_NODE,
+ "%s(config-router)# ",
+ 1,
+};
+
+struct cmd_node bgp_ipv4_unicast_node =
+{
+ BGP_IPV4_NODE,
+ "%s(config-router-af)# ",
+ 1,
+};
+
+struct cmd_node bgp_ipv4_multicast_node =
+{
+ BGP_IPV4M_NODE,
+ "%s(config-router-af)# ",
+ 1,
+};
+
+struct cmd_node bgp_ipv6_unicast_node =
+{
+ BGP_IPV6_NODE,
+ "%s(config-router-af)# ",
+ 1,
+};
+
+struct cmd_node bgp_vpnv4_node =
+{
+ BGP_VPNV4_NODE,
+ "%s(config-router-af)# ",
+ 1
+};
+
+void
+bgp_vty_init ()
+{
+ int bgp_config_write (struct vty *);
+ void community_list_vty ();
+
+ /* Install bgp top node. */
+ install_node (&bgp_node, bgp_config_write);
+ install_node (&bgp_ipv4_unicast_node, NULL);
+ install_node (&bgp_ipv4_multicast_node, NULL);
+ install_node (&bgp_ipv6_unicast_node, NULL);
+ install_node (&bgp_vpnv4_node, NULL);
+
+ /* Install default VTY commands to new nodes. */
+ install_default (BGP_NODE);
+ install_default (BGP_IPV4_NODE);
+ install_default (BGP_IPV4M_NODE);
+ install_default (BGP_IPV6_NODE);
+ install_default (BGP_VPNV4_NODE);
+
+ /* "bgp multiple-instance" commands. */
+ install_element (CONFIG_NODE, &bgp_multiple_instance_cmd);
+ install_element (CONFIG_NODE, &no_bgp_multiple_instance_cmd);
+
+ /* "bgp config-type" commands. */
+ install_element (CONFIG_NODE, &bgp_config_type_cmd);
+ install_element (CONFIG_NODE, &no_bgp_config_type_cmd);
+
+ /* Dummy commands (Currently not supported) */
+ install_element (BGP_NODE, &no_synchronization_cmd);
+ install_element (BGP_NODE, &no_auto_summary_cmd);
+
+ /* "router bgp" commands. */
+ install_element (CONFIG_NODE, &router_bgp_cmd);
+ install_element (CONFIG_NODE, &router_bgp_view_cmd);
+
+ /* "no router bgp" commands. */
+ install_element (CONFIG_NODE, &no_router_bgp_cmd);
+ install_element (CONFIG_NODE, &no_router_bgp_view_cmd);
+
+ /* "bgp router-id" commands. */
+ install_element (BGP_NODE, &bgp_router_id_cmd);
+ install_element (BGP_NODE, &no_bgp_router_id_cmd);
+ install_element (BGP_NODE, &no_bgp_router_id_val_cmd);
+
+ /* "bgp cluster-id" commands. */
+ install_element (BGP_NODE, &bgp_cluster_id_cmd);
+ install_element (BGP_NODE, &bgp_cluster_id32_cmd);
+ install_element (BGP_NODE, &no_bgp_cluster_id_cmd);
+ install_element (BGP_NODE, &no_bgp_cluster_id_arg_cmd);
+
+ /* "bgp confederation" commands. */
+ install_element (BGP_NODE, &bgp_confederation_identifier_cmd);
+ install_element (BGP_NODE, &no_bgp_confederation_identifier_cmd);
+ install_element (BGP_NODE, &no_bgp_confederation_identifier_arg_cmd);
+
+ /* "bgp confederation peers" commands. */
+ install_element (BGP_NODE, &bgp_confederation_peers_cmd);
+ install_element (BGP_NODE, &no_bgp_confederation_peers_cmd);
+
+ /* "timers bgp" commands. */
+ install_element (BGP_NODE, &bgp_timers_cmd);
+ install_element (BGP_NODE, &no_bgp_timers_cmd);
+ install_element (BGP_NODE, &no_bgp_timers_arg_cmd);
+
+ /* "bgp client-to-client reflection" commands */
+ install_element (BGP_NODE, &no_bgp_client_to_client_reflection_cmd);
+ install_element (BGP_NODE, &bgp_client_to_client_reflection_cmd);
+
+ /* "bgp always-compare-med" commands */
+ install_element (BGP_NODE, &bgp_always_compare_med_cmd);
+ install_element (BGP_NODE, &no_bgp_always_compare_med_cmd);
+
+ /* "bgp deterministic-med" commands */
+ install_element (BGP_NODE, &bgp_deterministic_med_cmd);
+ install_element (BGP_NODE, &no_bgp_deterministic_med_cmd);
+
+ /* "bgp fast-external-failover" commands */
+ install_element (BGP_NODE, &bgp_fast_external_failover_cmd);
+ install_element (BGP_NODE, &no_bgp_fast_external_failover_cmd);
+
+ /* "bgp enforce-first-as" commands */
+ install_element (BGP_NODE, &bgp_enforce_first_as_cmd);
+ install_element (BGP_NODE, &no_bgp_enforce_first_as_cmd);
+
+ /* "bgp bestpath compare-routerid" commands */
+ install_element (BGP_NODE, &bgp_bestpath_compare_router_id_cmd);
+ install_element (BGP_NODE, &no_bgp_bestpath_compare_router_id_cmd);
+
+ /* "bgp bestpath as-path ignore" commands */
+ install_element (BGP_NODE, &bgp_bestpath_aspath_ignore_cmd);
+ install_element (BGP_NODE, &no_bgp_bestpath_aspath_ignore_cmd);
+
+ /* "bgp bestpath med" commands */
+ install_element (BGP_NODE, &bgp_bestpath_med_cmd);
+ install_element (BGP_NODE, &bgp_bestpath_med2_cmd);
+ install_element (BGP_NODE, &bgp_bestpath_med3_cmd);
+ install_element (BGP_NODE, &no_bgp_bestpath_med_cmd);
+ install_element (BGP_NODE, &no_bgp_bestpath_med2_cmd);
+ install_element (BGP_NODE, &no_bgp_bestpath_med3_cmd);
+
+ /* "no bgp default ipv4-unicast" commands. */
+ install_element (BGP_NODE, &no_bgp_default_ipv4_unicast_cmd);
+ install_element (BGP_NODE, &bgp_default_ipv4_unicast_cmd);
+
+ /* "bgp network import-check" commands. */
+ install_element (BGP_NODE, &bgp_network_import_check_cmd);
+ install_element (BGP_NODE, &no_bgp_network_import_check_cmd);
+
+ /* "bgp default local-preference" commands. */
+ install_element (BGP_NODE, &bgp_default_local_preference_cmd);
+ install_element (BGP_NODE, &no_bgp_default_local_preference_cmd);
+ install_element (BGP_NODE, &no_bgp_default_local_preference_val_cmd);
+
+ /* "neighbor remote-as" commands. */
+ install_element (BGP_NODE, &neighbor_remote_as_cmd);
+ install_element (BGP_NODE, &no_neighbor_cmd);
+ install_element (BGP_NODE, &no_neighbor_remote_as_cmd);
+
+ /* "neighbor peer-group" commands. */
+ install_element (BGP_NODE, &neighbor_peer_group_cmd);
+ install_element (BGP_NODE, &no_neighbor_peer_group_cmd);
+ install_element (BGP_NODE, &no_neighbor_peer_group_remote_as_cmd);
+
+ /* "neighbor local-as" commands. */
+ install_element (BGP_NODE, &neighbor_local_as_cmd);
+ install_element (BGP_NODE, &neighbor_local_as_no_prepend_cmd);
+ install_element (BGP_NODE, &no_neighbor_local_as_cmd);
+ install_element (BGP_NODE, &no_neighbor_local_as_val_cmd);
+ install_element (BGP_NODE, &no_neighbor_local_as_val2_cmd);
+
+ /* "neighbor activate" commands. */
+ install_element (BGP_NODE, &neighbor_activate_cmd);
+ install_element (BGP_IPV4_NODE, &neighbor_activate_cmd);
+ install_element (BGP_IPV4M_NODE, &neighbor_activate_cmd);
+ install_element (BGP_IPV6_NODE, &neighbor_activate_cmd);
+ install_element (BGP_VPNV4_NODE, &neighbor_activate_cmd);
+
+ /* "no neighbor activate" commands. */
+ install_element (BGP_NODE, &no_neighbor_activate_cmd);
+ install_element (BGP_IPV4_NODE, &no_neighbor_activate_cmd);
+ install_element (BGP_IPV4M_NODE, &no_neighbor_activate_cmd);
+ install_element (BGP_IPV6_NODE, &no_neighbor_activate_cmd);
+ install_element (BGP_VPNV4_NODE, &no_neighbor_activate_cmd);
+
+ /* "neighbor peer-group set" commands. */
+ install_element (BGP_NODE, &neighbor_set_peer_group_cmd);
+ install_element (BGP_IPV4_NODE, &neighbor_set_peer_group_cmd);
+ install_element (BGP_IPV4M_NODE, &neighbor_set_peer_group_cmd);
+ install_element (BGP_IPV6_NODE, &neighbor_set_peer_group_cmd);
+
+ /* "no neighbor peer-group unset" commands. */
+ install_element (BGP_NODE, &no_neighbor_set_peer_group_cmd);
+ install_element (BGP_IPV4_NODE, &no_neighbor_set_peer_group_cmd);
+ install_element (BGP_IPV4M_NODE, &no_neighbor_set_peer_group_cmd);
+ install_element (BGP_IPV6_NODE, &no_neighbor_set_peer_group_cmd);
+
+ /* "neighbor softreconfiguration inbound" commands.*/
+ install_element (BGP_NODE, &neighbor_soft_reconfiguration_cmd);
+ install_element (BGP_NODE, &no_neighbor_soft_reconfiguration_cmd);
+ install_element (BGP_IPV4_NODE, &neighbor_soft_reconfiguration_cmd);
+ install_element (BGP_IPV4_NODE, &no_neighbor_soft_reconfiguration_cmd);
+ install_element (BGP_IPV4M_NODE, &neighbor_soft_reconfiguration_cmd);
+ install_element (BGP_IPV4M_NODE, &no_neighbor_soft_reconfiguration_cmd);
+ install_element (BGP_IPV6_NODE, &neighbor_soft_reconfiguration_cmd);
+ install_element (BGP_IPV6_NODE, &no_neighbor_soft_reconfiguration_cmd);
+
+ /* "neighbor attribute-unchanged" commands. */
+ install_element (BGP_NODE, &neighbor_attr_unchanged_cmd);
+ install_element (BGP_NODE, &neighbor_attr_unchanged1_cmd);
+ install_element (BGP_NODE, &neighbor_attr_unchanged2_cmd);
+ install_element (BGP_NODE, &neighbor_attr_unchanged3_cmd);
+ install_element (BGP_NODE, &neighbor_attr_unchanged4_cmd);
+ install_element (BGP_NODE, &neighbor_attr_unchanged5_cmd);
+ install_element (BGP_NODE, &neighbor_attr_unchanged6_cmd);
+ install_element (BGP_NODE, &neighbor_attr_unchanged7_cmd);
+ install_element (BGP_NODE, &neighbor_attr_unchanged8_cmd);
+ install_element (BGP_NODE, &neighbor_attr_unchanged9_cmd);
+ install_element (BGP_NODE, &neighbor_attr_unchanged10_cmd);
+ install_element (BGP_NODE, &no_neighbor_attr_unchanged_cmd);
+ install_element (BGP_NODE, &no_neighbor_attr_unchanged1_cmd);
+ install_element (BGP_NODE, &no_neighbor_attr_unchanged2_cmd);
+ install_element (BGP_NODE, &no_neighbor_attr_unchanged3_cmd);
+ install_element (BGP_NODE, &no_neighbor_attr_unchanged4_cmd);
+ install_element (BGP_NODE, &no_neighbor_attr_unchanged5_cmd);
+ install_element (BGP_NODE, &no_neighbor_attr_unchanged6_cmd);
+ install_element (BGP_NODE, &no_neighbor_attr_unchanged7_cmd);
+ install_element (BGP_NODE, &no_neighbor_attr_unchanged8_cmd);
+ install_element (BGP_NODE, &no_neighbor_attr_unchanged9_cmd);
+ install_element (BGP_NODE, &no_neighbor_attr_unchanged10_cmd);
+ install_element (BGP_IPV4_NODE, &neighbor_attr_unchanged_cmd);
+ install_element (BGP_IPV4_NODE, &neighbor_attr_unchanged1_cmd);
+ install_element (BGP_IPV4_NODE, &neighbor_attr_unchanged2_cmd);
+ install_element (BGP_IPV4_NODE, &neighbor_attr_unchanged3_cmd);
+ install_element (BGP_IPV4_NODE, &neighbor_attr_unchanged4_cmd);
+ install_element (BGP_IPV4_NODE, &neighbor_attr_unchanged5_cmd);
+ install_element (BGP_IPV4_NODE, &neighbor_attr_unchanged6_cmd);
+ install_element (BGP_IPV4_NODE, &neighbor_attr_unchanged7_cmd);
+ install_element (BGP_IPV4_NODE, &neighbor_attr_unchanged8_cmd);
+ install_element (BGP_IPV4_NODE, &neighbor_attr_unchanged9_cmd);
+ install_element (BGP_IPV4_NODE, &neighbor_attr_unchanged10_cmd);
+ install_element (BGP_IPV4_NODE, &no_neighbor_attr_unchanged_cmd);
+ install_element (BGP_IPV4_NODE, &no_neighbor_attr_unchanged1_cmd);
+ install_element (BGP_IPV4_NODE, &no_neighbor_attr_unchanged2_cmd);
+ install_element (BGP_IPV4_NODE, &no_neighbor_attr_unchanged3_cmd);
+ install_element (BGP_IPV4_NODE, &no_neighbor_attr_unchanged4_cmd);
+ install_element (BGP_IPV4_NODE, &no_neighbor_attr_unchanged5_cmd);
+ install_element (BGP_IPV4_NODE, &no_neighbor_attr_unchanged6_cmd);
+ install_element (BGP_IPV4_NODE, &no_neighbor_attr_unchanged7_cmd);
+ install_element (BGP_IPV4_NODE, &no_neighbor_attr_unchanged8_cmd);
+ install_element (BGP_IPV4_NODE, &no_neighbor_attr_unchanged9_cmd);
+ install_element (BGP_IPV4_NODE, &no_neighbor_attr_unchanged10_cmd);
+ install_element (BGP_IPV4M_NODE, &neighbor_attr_unchanged_cmd);
+ install_element (BGP_IPV4M_NODE, &neighbor_attr_unchanged1_cmd);
+ install_element (BGP_IPV4M_NODE, &neighbor_attr_unchanged2_cmd);
+ install_element (BGP_IPV4M_NODE, &neighbor_attr_unchanged3_cmd);
+ install_element (BGP_IPV4M_NODE, &neighbor_attr_unchanged4_cmd);
+ install_element (BGP_IPV4M_NODE, &neighbor_attr_unchanged5_cmd);
+ install_element (BGP_IPV4M_NODE, &neighbor_attr_unchanged6_cmd);
+ install_element (BGP_IPV4M_NODE, &neighbor_attr_unchanged7_cmd);
+ install_element (BGP_IPV4M_NODE, &neighbor_attr_unchanged8_cmd);
+ install_element (BGP_IPV4M_NODE, &neighbor_attr_unchanged9_cmd);
+ install_element (BGP_IPV4M_NODE, &neighbor_attr_unchanged10_cmd);
+ install_element (BGP_IPV4M_NODE, &no_neighbor_attr_unchanged_cmd);
+ install_element (BGP_IPV4M_NODE, &no_neighbor_attr_unchanged1_cmd);
+ install_element (BGP_IPV4M_NODE, &no_neighbor_attr_unchanged2_cmd);
+ install_element (BGP_IPV4M_NODE, &no_neighbor_attr_unchanged3_cmd);
+ install_element (BGP_IPV4M_NODE, &no_neighbor_attr_unchanged4_cmd);
+ install_element (BGP_IPV4M_NODE, &no_neighbor_attr_unchanged5_cmd);
+ install_element (BGP_IPV4M_NODE, &no_neighbor_attr_unchanged6_cmd);
+ install_element (BGP_IPV4M_NODE, &no_neighbor_attr_unchanged7_cmd);
+ install_element (BGP_IPV4M_NODE, &no_neighbor_attr_unchanged8_cmd);
+ install_element (BGP_IPV4M_NODE, &no_neighbor_attr_unchanged9_cmd);
+ install_element (BGP_IPV4M_NODE, &no_neighbor_attr_unchanged10_cmd);
+ install_element (BGP_IPV6_NODE, &neighbor_attr_unchanged_cmd);
+ install_element (BGP_IPV6_NODE, &neighbor_attr_unchanged1_cmd);
+ install_element (BGP_IPV6_NODE, &neighbor_attr_unchanged2_cmd);
+ install_element (BGP_IPV6_NODE, &neighbor_attr_unchanged3_cmd);
+ install_element (BGP_IPV6_NODE, &neighbor_attr_unchanged4_cmd);
+ install_element (BGP_IPV6_NODE, &neighbor_attr_unchanged5_cmd);
+ install_element (BGP_IPV6_NODE, &neighbor_attr_unchanged6_cmd);
+ install_element (BGP_IPV6_NODE, &neighbor_attr_unchanged7_cmd);
+ install_element (BGP_IPV6_NODE, &neighbor_attr_unchanged8_cmd);
+ install_element (BGP_IPV6_NODE, &neighbor_attr_unchanged9_cmd);
+ install_element (BGP_IPV6_NODE, &neighbor_attr_unchanged10_cmd);
+ install_element (BGP_IPV6_NODE, &no_neighbor_attr_unchanged_cmd);
+ install_element (BGP_IPV6_NODE, &no_neighbor_attr_unchanged1_cmd);
+ install_element (BGP_IPV6_NODE, &no_neighbor_attr_unchanged2_cmd);
+ install_element (BGP_IPV6_NODE, &no_neighbor_attr_unchanged3_cmd);
+ install_element (BGP_IPV6_NODE, &no_neighbor_attr_unchanged4_cmd);
+ install_element (BGP_IPV6_NODE, &no_neighbor_attr_unchanged5_cmd);
+ install_element (BGP_IPV6_NODE, &no_neighbor_attr_unchanged6_cmd);
+ install_element (BGP_IPV6_NODE, &no_neighbor_attr_unchanged7_cmd);
+ install_element (BGP_IPV6_NODE, &no_neighbor_attr_unchanged8_cmd);
+ install_element (BGP_IPV6_NODE, &no_neighbor_attr_unchanged9_cmd);
+ install_element (BGP_IPV6_NODE, &no_neighbor_attr_unchanged10_cmd);
+ install_element (BGP_VPNV4_NODE, &neighbor_attr_unchanged_cmd);
+ install_element (BGP_VPNV4_NODE, &neighbor_attr_unchanged1_cmd);
+ install_element (BGP_VPNV4_NODE, &neighbor_attr_unchanged2_cmd);
+ install_element (BGP_VPNV4_NODE, &neighbor_attr_unchanged3_cmd);
+ install_element (BGP_VPNV4_NODE, &neighbor_attr_unchanged4_cmd);
+ install_element (BGP_VPNV4_NODE, &neighbor_attr_unchanged5_cmd);
+ install_element (BGP_VPNV4_NODE, &neighbor_attr_unchanged6_cmd);
+ install_element (BGP_VPNV4_NODE, &neighbor_attr_unchanged7_cmd);
+ install_element (BGP_VPNV4_NODE, &neighbor_attr_unchanged8_cmd);
+ install_element (BGP_VPNV4_NODE, &neighbor_attr_unchanged9_cmd);
+ install_element (BGP_VPNV4_NODE, &neighbor_attr_unchanged10_cmd);
+ install_element (BGP_VPNV4_NODE, &no_neighbor_attr_unchanged_cmd);
+ install_element (BGP_VPNV4_NODE, &no_neighbor_attr_unchanged1_cmd);
+ install_element (BGP_VPNV4_NODE, &no_neighbor_attr_unchanged2_cmd);
+ install_element (BGP_VPNV4_NODE, &no_neighbor_attr_unchanged3_cmd);
+ install_element (BGP_VPNV4_NODE, &no_neighbor_attr_unchanged4_cmd);
+ install_element (BGP_VPNV4_NODE, &no_neighbor_attr_unchanged5_cmd);
+ install_element (BGP_VPNV4_NODE, &no_neighbor_attr_unchanged6_cmd);
+ install_element (BGP_VPNV4_NODE, &no_neighbor_attr_unchanged7_cmd);
+ install_element (BGP_VPNV4_NODE, &no_neighbor_attr_unchanged8_cmd);
+ install_element (BGP_VPNV4_NODE, &no_neighbor_attr_unchanged9_cmd);
+ install_element (BGP_VPNV4_NODE, &no_neighbor_attr_unchanged10_cmd);
+
+ /* "transparent-as" and "transparent-nexthop" for old version
+ compatibility. */
+ install_element (BGP_NODE, &neighbor_transparent_as_cmd);
+ install_element (BGP_NODE, &neighbor_transparent_nexthop_cmd);
+
+ /* "neighbor next-hop-self" commands. */
+ install_element (BGP_NODE, &neighbor_nexthop_self_cmd);
+ install_element (BGP_NODE, &no_neighbor_nexthop_self_cmd);
+ install_element (BGP_IPV4_NODE, &neighbor_nexthop_self_cmd);
+ install_element (BGP_IPV4_NODE, &no_neighbor_nexthop_self_cmd);
+ install_element (BGP_IPV4M_NODE, &neighbor_nexthop_self_cmd);
+ install_element (BGP_IPV4M_NODE, &no_neighbor_nexthop_self_cmd);
+ install_element (BGP_IPV6_NODE, &neighbor_nexthop_self_cmd);
+ install_element (BGP_IPV6_NODE, &no_neighbor_nexthop_self_cmd);
+ install_element (BGP_VPNV4_NODE, &neighbor_nexthop_self_cmd);
+ install_element (BGP_VPNV4_NODE, &no_neighbor_nexthop_self_cmd);
+
+ /* "neighbor remove-private-AS" commands. */
+ install_element (BGP_NODE, &neighbor_remove_private_as_cmd);
+ install_element (BGP_NODE, &no_neighbor_remove_private_as_cmd);
+ install_element (BGP_IPV4_NODE, &neighbor_remove_private_as_cmd);
+ install_element (BGP_IPV4_NODE, &no_neighbor_remove_private_as_cmd);
+ install_element (BGP_IPV4M_NODE, &neighbor_remove_private_as_cmd);
+ install_element (BGP_IPV4M_NODE, &no_neighbor_remove_private_as_cmd);
+ install_element (BGP_IPV6_NODE, &neighbor_remove_private_as_cmd);
+ install_element (BGP_IPV6_NODE, &no_neighbor_remove_private_as_cmd);
+ install_element (BGP_VPNV4_NODE, &neighbor_remove_private_as_cmd);
+ install_element (BGP_VPNV4_NODE, &no_neighbor_remove_private_as_cmd);
+
+ /* "neighbor send-community" commands.*/
+ install_element (BGP_NODE, &neighbor_send_community_cmd);
+ install_element (BGP_NODE, &neighbor_send_community_type_cmd);
+ install_element (BGP_NODE, &no_neighbor_send_community_cmd);
+ install_element (BGP_NODE, &no_neighbor_send_community_type_cmd);
+ install_element (BGP_IPV4_NODE, &neighbor_send_community_cmd);
+ install_element (BGP_IPV4_NODE, &neighbor_send_community_type_cmd);
+ install_element (BGP_IPV4_NODE, &no_neighbor_send_community_cmd);
+ install_element (BGP_IPV4_NODE, &no_neighbor_send_community_type_cmd);
+ install_element (BGP_IPV4M_NODE, &neighbor_send_community_cmd);
+ install_element (BGP_IPV4M_NODE, &neighbor_send_community_type_cmd);
+ install_element (BGP_IPV4M_NODE, &no_neighbor_send_community_cmd);
+ install_element (BGP_IPV4M_NODE, &no_neighbor_send_community_type_cmd);
+ install_element (BGP_IPV6_NODE, &neighbor_send_community_cmd);
+ install_element (BGP_IPV6_NODE, &neighbor_send_community_type_cmd);
+ install_element (BGP_IPV6_NODE, &no_neighbor_send_community_cmd);
+ install_element (BGP_IPV6_NODE, &no_neighbor_send_community_type_cmd);
+ install_element (BGP_VPNV4_NODE, &neighbor_send_community_cmd);
+ install_element (BGP_VPNV4_NODE, &neighbor_send_community_type_cmd);
+ install_element (BGP_VPNV4_NODE, &no_neighbor_send_community_cmd);
+ install_element (BGP_VPNV4_NODE, &no_neighbor_send_community_type_cmd);
+
+ /* "neighbor route-reflector" commands.*/
+ install_element (BGP_NODE, &neighbor_route_reflector_client_cmd);
+ install_element (BGP_NODE, &no_neighbor_route_reflector_client_cmd);
+ install_element (BGP_IPV4_NODE, &neighbor_route_reflector_client_cmd);
+ install_element (BGP_IPV4_NODE, &no_neighbor_route_reflector_client_cmd);
+ install_element (BGP_IPV4M_NODE, &neighbor_route_reflector_client_cmd);
+ install_element (BGP_IPV4M_NODE, &no_neighbor_route_reflector_client_cmd);
+ install_element (BGP_IPV6_NODE, &neighbor_route_reflector_client_cmd);
+ install_element (BGP_IPV6_NODE, &no_neighbor_route_reflector_client_cmd);
+ install_element (BGP_VPNV4_NODE, &neighbor_route_reflector_client_cmd);
+ install_element (BGP_VPNV4_NODE, &no_neighbor_route_reflector_client_cmd);
+
+ /* "neighbor route-server" commands.*/
+ install_element (BGP_NODE, &neighbor_route_server_client_cmd);
+ install_element (BGP_NODE, &no_neighbor_route_server_client_cmd);
+ install_element (BGP_IPV4_NODE, &neighbor_route_server_client_cmd);
+ install_element (BGP_IPV4_NODE, &no_neighbor_route_server_client_cmd);
+ install_element (BGP_IPV4M_NODE, &neighbor_route_server_client_cmd);
+ install_element (BGP_IPV4M_NODE, &no_neighbor_route_server_client_cmd);
+ install_element (BGP_IPV6_NODE, &neighbor_route_server_client_cmd);
+ install_element (BGP_IPV6_NODE, &no_neighbor_route_server_client_cmd);
+ install_element (BGP_VPNV4_NODE, &neighbor_route_server_client_cmd);
+ install_element (BGP_VPNV4_NODE, &no_neighbor_route_server_client_cmd);
+
+ /* "neighbor passive" commands. */
+ install_element (BGP_NODE, &neighbor_passive_cmd);
+ install_element (BGP_NODE, &no_neighbor_passive_cmd);
+
+ /* "neighbor shutdown" commands. */
+ install_element (BGP_NODE, &neighbor_shutdown_cmd);
+ install_element (BGP_NODE, &no_neighbor_shutdown_cmd);
+
+ /* "neighbor capability route-refresh" commands.*/
+ install_element (BGP_NODE, &neighbor_capability_route_refresh_cmd);
+ install_element (BGP_NODE, &no_neighbor_capability_route_refresh_cmd);
+
+ /* "neighbor capability orf prefix-list" commands.*/
+ install_element (BGP_NODE, &neighbor_capability_orf_prefix_cmd);
+ install_element (BGP_NODE, &no_neighbor_capability_orf_prefix_cmd);
+ install_element (BGP_IPV4_NODE, &neighbor_capability_orf_prefix_cmd);
+ install_element (BGP_IPV4_NODE, &no_neighbor_capability_orf_prefix_cmd);
+ install_element (BGP_IPV4M_NODE, &neighbor_capability_orf_prefix_cmd);
+ install_element (BGP_IPV4M_NODE, &no_neighbor_capability_orf_prefix_cmd);
+ install_element (BGP_IPV6_NODE, &neighbor_capability_orf_prefix_cmd);
+ install_element (BGP_IPV6_NODE, &no_neighbor_capability_orf_prefix_cmd);
+
+ /* "neighbor capability dynamic" commands.*/
+ install_element (BGP_NODE, &neighbor_capability_dynamic_cmd);
+ install_element (BGP_NODE, &no_neighbor_capability_dynamic_cmd);
+
+ /* "neighbor dont-capability-negotiate" commands. */
+ install_element (BGP_NODE, &neighbor_dont_capability_negotiate_cmd);
+ install_element (BGP_NODE, &no_neighbor_dont_capability_negotiate_cmd);
+
+ /* "neighbor ebgp-multihop" commands. */
+ install_element (BGP_NODE, &neighbor_ebgp_multihop_cmd);
+ install_element (BGP_NODE, &neighbor_ebgp_multihop_ttl_cmd);
+ install_element (BGP_NODE, &no_neighbor_ebgp_multihop_cmd);
+ install_element (BGP_NODE, &no_neighbor_ebgp_multihop_ttl_cmd);
+
+ /* "neighbor enforce-multihop" commands. */
+ install_element (BGP_NODE, &neighbor_enforce_multihop_cmd);
+ install_element (BGP_NODE, &no_neighbor_enforce_multihop_cmd);
+
+ /* "neighbor description" commands. */
+ install_element (BGP_NODE, &neighbor_description_cmd);
+ install_element (BGP_NODE, &no_neighbor_description_cmd);
+ install_element (BGP_NODE, &no_neighbor_description_val_cmd);
+
+ /* "neighbor update-source" commands. "*/
+ install_element (BGP_NODE, &neighbor_update_source_cmd);
+ install_element (BGP_NODE, &no_neighbor_update_source_cmd);
+
+ /* "neighbor default-originate" commands. */
+ install_element (BGP_NODE, &neighbor_default_originate_cmd);
+ install_element (BGP_NODE, &neighbor_default_originate_rmap_cmd);
+ install_element (BGP_NODE, &no_neighbor_default_originate_cmd);
+ install_element (BGP_NODE, &no_neighbor_default_originate_rmap_cmd);
+ install_element (BGP_IPV4_NODE, &neighbor_default_originate_cmd);
+ install_element (BGP_IPV4_NODE, &neighbor_default_originate_rmap_cmd);
+ install_element (BGP_IPV4_NODE, &no_neighbor_default_originate_cmd);
+ install_element (BGP_IPV4_NODE, &no_neighbor_default_originate_rmap_cmd);
+ install_element (BGP_IPV4M_NODE, &neighbor_default_originate_cmd);
+ install_element (BGP_IPV4M_NODE, &neighbor_default_originate_rmap_cmd);
+ install_element (BGP_IPV4M_NODE, &no_neighbor_default_originate_cmd);
+ install_element (BGP_IPV4M_NODE, &no_neighbor_default_originate_rmap_cmd);
+ install_element (BGP_IPV6_NODE, &neighbor_default_originate_cmd);
+ install_element (BGP_IPV6_NODE, &neighbor_default_originate_rmap_cmd);
+ install_element (BGP_IPV6_NODE, &no_neighbor_default_originate_cmd);
+ install_element (BGP_IPV6_NODE, &no_neighbor_default_originate_rmap_cmd);
+
+ /* "neighbor port" commands. */
+ install_element (BGP_NODE, &neighbor_port_cmd);
+ install_element (BGP_NODE, &no_neighbor_port_cmd);
+ install_element (BGP_NODE, &no_neighbor_port_val_cmd);
+
+ /* "neighbor weight" commands. */
+ install_element (BGP_NODE, &neighbor_weight_cmd);
+ install_element (BGP_NODE, &no_neighbor_weight_cmd);
+ install_element (BGP_NODE, &no_neighbor_weight_val_cmd);
+
+ /* "neighbor override-capability" commands. */
+ install_element (BGP_NODE, &neighbor_override_capability_cmd);
+ install_element (BGP_NODE, &no_neighbor_override_capability_cmd);
+
+ /* "neighbor strict-capability-match" commands. */
+ install_element (BGP_NODE, &neighbor_strict_capability_cmd);
+ install_element (BGP_NODE, &no_neighbor_strict_capability_cmd);
+
+ /* "neighbor timers" commands. */
+ install_element (BGP_NODE, &neighbor_timers_cmd);
+ install_element (BGP_NODE, &no_neighbor_timers_cmd);
+
+ /* "neighbor timers connect" commands. */
+ install_element (BGP_NODE, &neighbor_timers_connect_cmd);
+ install_element (BGP_NODE, &no_neighbor_timers_connect_cmd);
+ install_element (BGP_NODE, &no_neighbor_timers_connect_val_cmd);
+
+ /* "neighbor advertisement-interval" commands. */
+ install_element (BGP_NODE, &neighbor_advertise_interval_cmd);
+ install_element (BGP_NODE, &no_neighbor_advertise_interval_cmd);
+ install_element (BGP_NODE, &no_neighbor_advertise_interval_val_cmd);
+
+ /* "neighbor version" commands. */
+ install_element (BGP_NODE, &neighbor_version_cmd);
+ install_element (BGP_NODE, &no_neighbor_version_cmd);
+
+ /* "neighbor interface" commands. */
+ install_element (BGP_NODE, &neighbor_interface_cmd);
+ install_element (BGP_NODE, &no_neighbor_interface_cmd);
+
+ /* "neighbor distribute" commands. */
+ install_element (BGP_NODE, &neighbor_distribute_list_cmd);
+ install_element (BGP_NODE, &no_neighbor_distribute_list_cmd);
+ install_element (BGP_IPV4_NODE, &neighbor_distribute_list_cmd);
+ install_element (BGP_IPV4_NODE, &no_neighbor_distribute_list_cmd);
+ install_element (BGP_IPV4M_NODE, &neighbor_distribute_list_cmd);
+ install_element (BGP_IPV4M_NODE, &no_neighbor_distribute_list_cmd);
+ install_element (BGP_IPV6_NODE, &neighbor_distribute_list_cmd);
+ install_element (BGP_IPV6_NODE, &no_neighbor_distribute_list_cmd);
+ install_element (BGP_VPNV4_NODE, &neighbor_distribute_list_cmd);
+ install_element (BGP_VPNV4_NODE, &no_neighbor_distribute_list_cmd);
+
+ /* "neighbor prefix-list" commands. */
+ install_element (BGP_NODE, &neighbor_prefix_list_cmd);
+ install_element (BGP_NODE, &no_neighbor_prefix_list_cmd);
+ install_element (BGP_IPV4_NODE, &neighbor_prefix_list_cmd);
+ install_element (BGP_IPV4_NODE, &no_neighbor_prefix_list_cmd);
+ install_element (BGP_IPV4M_NODE, &neighbor_prefix_list_cmd);
+ install_element (BGP_IPV4M_NODE, &no_neighbor_prefix_list_cmd);
+ install_element (BGP_IPV6_NODE, &neighbor_prefix_list_cmd);
+ install_element (BGP_IPV6_NODE, &no_neighbor_prefix_list_cmd);
+ install_element (BGP_VPNV4_NODE, &neighbor_prefix_list_cmd);
+ install_element (BGP_VPNV4_NODE, &no_neighbor_prefix_list_cmd);
+
+ /* "neighbor filter-list" commands. */
+ install_element (BGP_NODE, &neighbor_filter_list_cmd);
+ install_element (BGP_NODE, &no_neighbor_filter_list_cmd);
+ install_element (BGP_IPV4_NODE, &neighbor_filter_list_cmd);
+ install_element (BGP_IPV4_NODE, &no_neighbor_filter_list_cmd);
+ install_element (BGP_IPV4M_NODE, &neighbor_filter_list_cmd);
+ install_element (BGP_IPV4M_NODE, &no_neighbor_filter_list_cmd);
+ install_element (BGP_IPV6_NODE, &neighbor_filter_list_cmd);
+ install_element (BGP_IPV6_NODE, &no_neighbor_filter_list_cmd);
+ install_element (BGP_VPNV4_NODE, &neighbor_filter_list_cmd);
+ install_element (BGP_VPNV4_NODE, &no_neighbor_filter_list_cmd);
+
+ /* "neighbor route-map" commands. */
+ install_element (BGP_NODE, &neighbor_route_map_cmd);
+ install_element (BGP_NODE, &no_neighbor_route_map_cmd);
+ install_element (BGP_IPV4_NODE, &neighbor_route_map_cmd);
+ install_element (BGP_IPV4_NODE, &no_neighbor_route_map_cmd);
+ install_element (BGP_IPV4M_NODE, &neighbor_route_map_cmd);
+ install_element (BGP_IPV4M_NODE, &no_neighbor_route_map_cmd);
+ install_element (BGP_IPV6_NODE, &neighbor_route_map_cmd);
+ install_element (BGP_IPV6_NODE, &no_neighbor_route_map_cmd);
+ install_element (BGP_VPNV4_NODE, &neighbor_route_map_cmd);
+ install_element (BGP_VPNV4_NODE, &no_neighbor_route_map_cmd);
+
+ /* "neighbor unsuppress-map" commands. */
+ install_element (BGP_NODE, &neighbor_unsuppress_map_cmd);
+ install_element (BGP_NODE, &no_neighbor_unsuppress_map_cmd);
+ install_element (BGP_IPV4_NODE, &neighbor_unsuppress_map_cmd);
+ install_element (BGP_IPV4_NODE, &no_neighbor_unsuppress_map_cmd);
+ install_element (BGP_IPV4M_NODE, &neighbor_unsuppress_map_cmd);
+ install_element (BGP_IPV4M_NODE, &no_neighbor_unsuppress_map_cmd);
+ install_element (BGP_IPV6_NODE, &neighbor_unsuppress_map_cmd);
+ install_element (BGP_IPV6_NODE, &no_neighbor_unsuppress_map_cmd);
+
+ /* "neighbor maximum-prefix" commands. */
+ install_element (BGP_NODE, &neighbor_maximum_prefix_cmd);
+ install_element (BGP_NODE, &neighbor_maximum_prefix_warning_cmd);
+ install_element (BGP_NODE, &no_neighbor_maximum_prefix_cmd);
+ install_element (BGP_NODE, &no_neighbor_maximum_prefix_val_cmd);
+ install_element (BGP_NODE, &no_neighbor_maximum_prefix_val2_cmd);
+ install_element (BGP_IPV4_NODE, &neighbor_maximum_prefix_cmd);
+ install_element (BGP_IPV4_NODE, &neighbor_maximum_prefix_warning_cmd);
+ install_element (BGP_IPV4_NODE, &no_neighbor_maximum_prefix_cmd);
+ install_element (BGP_IPV4_NODE, &no_neighbor_maximum_prefix_val_cmd);
+ install_element (BGP_IPV4_NODE, &no_neighbor_maximum_prefix_val2_cmd);
+ install_element (BGP_IPV4M_NODE, &neighbor_maximum_prefix_cmd);
+ install_element (BGP_IPV4M_NODE, &neighbor_maximum_prefix_warning_cmd);
+ install_element (BGP_IPV4M_NODE, &no_neighbor_maximum_prefix_cmd);
+ install_element (BGP_IPV4M_NODE, &no_neighbor_maximum_prefix_val_cmd);
+ install_element (BGP_IPV4M_NODE, &no_neighbor_maximum_prefix_val2_cmd);
+ install_element (BGP_IPV6_NODE, &neighbor_maximum_prefix_cmd);
+ install_element (BGP_IPV6_NODE, &neighbor_maximum_prefix_warning_cmd);
+ install_element (BGP_IPV6_NODE, &no_neighbor_maximum_prefix_cmd);
+ install_element (BGP_IPV6_NODE, &no_neighbor_maximum_prefix_val_cmd);
+ install_element (BGP_IPV6_NODE, &no_neighbor_maximum_prefix_val2_cmd);
+ install_element (BGP_VPNV4_NODE, &neighbor_maximum_prefix_cmd);
+ install_element (BGP_VPNV4_NODE, &neighbor_maximum_prefix_warning_cmd);
+ install_element (BGP_VPNV4_NODE, &no_neighbor_maximum_prefix_cmd);
+ install_element (BGP_VPNV4_NODE, &no_neighbor_maximum_prefix_val_cmd);
+ install_element (BGP_VPNV4_NODE, &no_neighbor_maximum_prefix_val2_cmd);
+
+ /* "neighbor allowas-in" */
+ install_element (BGP_NODE, &neighbor_allowas_in_cmd);
+ install_element (BGP_NODE, &neighbor_allowas_in_arg_cmd);
+ install_element (BGP_NODE, &no_neighbor_allowas_in_cmd);
+ install_element (BGP_IPV4_NODE, &neighbor_allowas_in_cmd);
+ install_element (BGP_IPV4_NODE, &neighbor_allowas_in_arg_cmd);
+ install_element (BGP_IPV4_NODE, &no_neighbor_allowas_in_cmd);
+ install_element (BGP_IPV4M_NODE, &neighbor_allowas_in_cmd);
+ install_element (BGP_IPV4M_NODE, &neighbor_allowas_in_arg_cmd);
+ install_element (BGP_IPV4M_NODE, &no_neighbor_allowas_in_cmd);
+ install_element (BGP_IPV6_NODE, &neighbor_allowas_in_cmd);
+ install_element (BGP_IPV6_NODE, &neighbor_allowas_in_arg_cmd);
+ install_element (BGP_IPV6_NODE, &no_neighbor_allowas_in_cmd);
+ install_element (BGP_VPNV4_NODE, &neighbor_allowas_in_cmd);
+ install_element (BGP_VPNV4_NODE, &neighbor_allowas_in_arg_cmd);
+ install_element (BGP_VPNV4_NODE, &no_neighbor_allowas_in_cmd);
+
+ /* address-family commands. */
+ install_element (BGP_NODE, &address_family_ipv4_cmd);
+ install_element (BGP_NODE, &address_family_ipv4_safi_cmd);
+#ifdef HAVE_IPV6
+ install_element (BGP_NODE, &address_family_ipv6_cmd);
+ install_element (BGP_NODE, &address_family_ipv6_unicast_cmd);
+#endif /* HAVE_IPV6 */
+ install_element (BGP_NODE, &address_family_vpnv4_cmd);
+ install_element (BGP_NODE, &address_family_vpnv4_unicast_cmd);
+
+ /* "exit-address-family" command. */
+ install_element (BGP_IPV4_NODE, &exit_address_family_cmd);
+ install_element (BGP_IPV4M_NODE, &exit_address_family_cmd);
+ install_element (BGP_IPV6_NODE, &exit_address_family_cmd);
+ install_element (BGP_VPNV4_NODE, &exit_address_family_cmd);
+
+ /* "clear ip bgp commands" */
+ install_element (ENABLE_NODE, &clear_ip_bgp_all_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_instance_all_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_as_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_peer_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_peer_group_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_external_cmd);
+#ifdef HAVE_IPV6
+ install_element (ENABLE_NODE, &clear_bgp_all_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_instance_all_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_ipv6_all_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_peer_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_ipv6_peer_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_peer_group_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_ipv6_peer_group_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_external_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_ipv6_external_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_as_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_ipv6_as_cmd);
+#endif /* HAVE_IPV6 */
+
+ /* "clear ip bgp neighbor soft in" */
+ install_element (ENABLE_NODE, &clear_ip_bgp_all_soft_in_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_instance_all_soft_in_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_all_in_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_all_in_prefix_filter_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_instance_all_in_prefix_filter_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_peer_soft_in_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_peer_in_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_peer_in_prefix_filter_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_peer_group_soft_in_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_peer_group_in_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_peer_group_in_prefix_filter_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_external_soft_in_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_external_in_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_external_in_prefix_filter_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_as_soft_in_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_as_in_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_as_in_prefix_filter_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_all_ipv4_soft_in_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_instance_all_ipv4_soft_in_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_all_ipv4_in_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_all_ipv4_in_prefix_filter_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_instance_all_ipv4_in_prefix_filter_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_peer_ipv4_soft_in_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_peer_ipv4_in_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_peer_ipv4_in_prefix_filter_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_peer_group_ipv4_soft_in_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_peer_group_ipv4_in_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_peer_group_ipv4_in_prefix_filter_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_external_ipv4_soft_in_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_external_ipv4_in_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_external_ipv4_in_prefix_filter_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_as_ipv4_soft_in_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_as_ipv4_in_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_as_ipv4_in_prefix_filter_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_all_vpnv4_soft_in_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_all_vpnv4_in_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_peer_vpnv4_soft_in_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_peer_vpnv4_in_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_as_vpnv4_soft_in_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_as_vpnv4_in_cmd);
+#ifdef HAVE_IPV6
+ install_element (ENABLE_NODE, &clear_bgp_all_soft_in_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_instance_all_soft_in_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_all_in_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_all_in_prefix_filter_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_peer_soft_in_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_peer_in_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_peer_in_prefix_filter_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_peer_group_soft_in_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_peer_group_in_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_peer_group_in_prefix_filter_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_external_soft_in_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_external_in_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_external_in_prefix_filter_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_as_soft_in_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_as_in_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_as_in_prefix_filter_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_ipv6_all_soft_in_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_ipv6_all_in_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_ipv6_all_in_prefix_filter_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_ipv6_peer_soft_in_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_ipv6_peer_in_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_ipv6_peer_in_prefix_filter_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_ipv6_peer_group_soft_in_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_ipv6_peer_group_in_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_ipv6_peer_group_in_prefix_filter_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_ipv6_external_soft_in_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_ipv6_external_in_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_ipv6_external_in_prefix_filter_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_ipv6_as_soft_in_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_ipv6_as_in_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_ipv6_as_in_prefix_filter_cmd);
+#endif /* HAVE_IPV6 */
+
+ /* "clear ip bgp neighbor soft out" */
+ install_element (ENABLE_NODE, &clear_ip_bgp_all_soft_out_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_instance_all_soft_out_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_all_out_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_peer_soft_out_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_peer_out_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_peer_group_soft_out_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_peer_group_out_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_external_soft_out_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_external_out_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_as_soft_out_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_as_out_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_all_ipv4_soft_out_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_instance_all_ipv4_soft_out_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_all_ipv4_out_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_peer_ipv4_soft_out_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_peer_ipv4_out_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_peer_group_ipv4_soft_out_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_peer_group_ipv4_out_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_external_ipv4_soft_out_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_external_ipv4_out_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_as_ipv4_soft_out_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_as_ipv4_out_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_all_vpnv4_soft_out_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_all_vpnv4_out_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_peer_vpnv4_soft_out_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_peer_vpnv4_out_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_as_vpnv4_soft_out_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_as_vpnv4_out_cmd);
+#ifdef HAVE_IPV6
+ install_element (ENABLE_NODE, &clear_bgp_all_soft_out_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_instance_all_soft_out_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_all_out_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_peer_soft_out_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_peer_out_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_peer_group_soft_out_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_peer_group_out_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_external_soft_out_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_external_out_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_as_soft_out_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_as_out_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_ipv6_all_soft_out_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_ipv6_all_out_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_ipv6_peer_soft_out_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_ipv6_peer_out_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_ipv6_peer_group_soft_out_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_ipv6_peer_group_out_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_ipv6_external_soft_out_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_ipv6_external_out_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_ipv6_as_soft_out_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_ipv6_as_out_cmd);
+#endif /* HAVE_IPV6 */
+
+ /* "clear ip bgp neighbor soft" */
+ install_element (ENABLE_NODE, &clear_ip_bgp_all_soft_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_instance_all_soft_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_peer_soft_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_peer_group_soft_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_external_soft_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_as_soft_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_all_ipv4_soft_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_instance_all_ipv4_soft_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_peer_ipv4_soft_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_peer_group_ipv4_soft_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_external_ipv4_soft_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_as_ipv4_soft_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_all_vpnv4_soft_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_peer_vpnv4_soft_cmd);
+ install_element (ENABLE_NODE, &clear_ip_bgp_as_vpnv4_soft_cmd);
+#ifdef HAVE_IPV6
+ install_element (ENABLE_NODE, &clear_bgp_all_soft_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_instance_all_soft_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_peer_soft_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_peer_group_soft_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_external_soft_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_as_soft_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_ipv6_all_soft_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_ipv6_peer_soft_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_ipv6_peer_group_soft_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_ipv6_external_soft_cmd);
+ install_element (ENABLE_NODE, &clear_bgp_ipv6_as_soft_cmd);
+#endif /* HAVE_IPV6 */
+
+ /* "show ip bgp summary" commands. */
+ install_element (VIEW_NODE, &show_ip_bgp_summary_cmd);
+ install_element (VIEW_NODE, &show_ip_bgp_instance_summary_cmd);
+ install_element (VIEW_NODE, &show_ip_bgp_ipv4_summary_cmd);
+ install_element (VIEW_NODE, &show_ip_bgp_instance_ipv4_summary_cmd);
+ install_element (VIEW_NODE, &show_ip_bgp_vpnv4_all_summary_cmd);
+ install_element (VIEW_NODE, &show_ip_bgp_vpnv4_rd_summary_cmd);
+#ifdef HAVE_IPV6
+ install_element (VIEW_NODE, &show_bgp_summary_cmd);
+ install_element (VIEW_NODE, &show_bgp_instance_summary_cmd);
+ install_element (VIEW_NODE, &show_bgp_ipv6_summary_cmd);
+ install_element (VIEW_NODE, &show_bgp_instance_ipv6_summary_cmd);
+#endif /* HAVE_IPV6 */
+ install_element (ENABLE_NODE, &show_ip_bgp_summary_cmd);
+ install_element (ENABLE_NODE, &show_ip_bgp_instance_summary_cmd);
+ install_element (ENABLE_NODE, &show_ip_bgp_ipv4_summary_cmd);
+ install_element (ENABLE_NODE, &show_ip_bgp_instance_ipv4_summary_cmd);
+ install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_all_summary_cmd);
+ install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_rd_summary_cmd);
+#ifdef HAVE_IPV6
+ install_element (ENABLE_NODE, &show_bgp_summary_cmd);
+ install_element (ENABLE_NODE, &show_bgp_instance_summary_cmd);
+ install_element (ENABLE_NODE, &show_bgp_ipv6_summary_cmd);
+ install_element (ENABLE_NODE, &show_bgp_instance_ipv6_summary_cmd);
+#endif /* HAVE_IPV6 */
+
+ /* "show ip bgp neighbors" commands. */
+ install_element (VIEW_NODE, &show_ip_bgp_neighbors_cmd);
+ install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbors_cmd);
+ install_element (VIEW_NODE, &show_ip_bgp_neighbors_peer_cmd);
+ install_element (VIEW_NODE, &show_ip_bgp_ipv4_neighbors_peer_cmd);
+ install_element (VIEW_NODE, &show_ip_bgp_vpnv4_all_neighbors_cmd);
+ install_element (VIEW_NODE, &show_ip_bgp_vpnv4_rd_neighbors_cmd);
+ install_element (VIEW_NODE, &show_ip_bgp_vpnv4_all_neighbors_peer_cmd);
+ install_element (VIEW_NODE, &show_ip_bgp_vpnv4_rd_neighbors_peer_cmd);
+ install_element (VIEW_NODE, &show_ip_bgp_instance_neighbors_cmd);
+ install_element (VIEW_NODE, &show_ip_bgp_instance_neighbors_peer_cmd);
+ install_element (ENABLE_NODE, &show_ip_bgp_neighbors_cmd);
+ install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbors_cmd);
+ install_element (ENABLE_NODE, &show_ip_bgp_neighbors_peer_cmd);
+ install_element (ENABLE_NODE, &show_ip_bgp_ipv4_neighbors_peer_cmd);
+ install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_all_neighbors_cmd);
+ install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_rd_neighbors_cmd);
+ install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_all_neighbors_peer_cmd);
+ install_element (ENABLE_NODE, &show_ip_bgp_vpnv4_rd_neighbors_peer_cmd);
+ install_element (ENABLE_NODE, &show_ip_bgp_instance_neighbors_cmd);
+ install_element (ENABLE_NODE, &show_ip_bgp_instance_neighbors_peer_cmd);
+
+#ifdef HAVE_IPV6
+ install_element (VIEW_NODE, &show_bgp_neighbors_cmd);
+ install_element (VIEW_NODE, &show_bgp_ipv6_neighbors_cmd);
+ install_element (VIEW_NODE, &show_bgp_neighbors_peer_cmd);
+ install_element (VIEW_NODE, &show_bgp_ipv6_neighbors_peer_cmd);
+ install_element (ENABLE_NODE, &show_bgp_neighbors_cmd);
+ install_element (ENABLE_NODE, &show_bgp_ipv6_neighbors_cmd);
+ install_element (ENABLE_NODE, &show_bgp_neighbors_peer_cmd);
+ install_element (ENABLE_NODE, &show_bgp_ipv6_neighbors_peer_cmd);
+
+ /* Old commands. */
+ install_element (VIEW_NODE, &show_ipv6_bgp_summary_cmd);
+ install_element (VIEW_NODE, &show_ipv6_mbgp_summary_cmd);
+ install_element (ENABLE_NODE, &show_ipv6_bgp_summary_cmd);
+ install_element (ENABLE_NODE, &show_ipv6_mbgp_summary_cmd);
+#endif /* HAVE_IPV6 */
+
+ /* "show ip bgp paths" commands. */
+ install_element (VIEW_NODE, &show_ip_bgp_paths_cmd);
+ install_element (VIEW_NODE, &show_ip_bgp_ipv4_paths_cmd);
+ install_element (ENABLE_NODE, &show_ip_bgp_paths_cmd);
+ install_element (ENABLE_NODE, &show_ip_bgp_ipv4_paths_cmd);
+
+ /* "show ip bgp community" commands. */
+ install_element (VIEW_NODE, &show_ip_bgp_community_info_cmd);
+ install_element (ENABLE_NODE, &show_ip_bgp_community_info_cmd);
+
+ /* "show ip bgp attribute-info" commands. */
+ install_element (VIEW_NODE, &show_ip_bgp_attr_info_cmd);
+ install_element (ENABLE_NODE, &show_ip_bgp_attr_info_cmd);
+
+ /* "redistribute" commands. */
+ install_element (BGP_NODE, &bgp_redistribute_ipv4_cmd);
+ install_element (BGP_NODE, &no_bgp_redistribute_ipv4_cmd);
+ install_element (BGP_NODE, &bgp_redistribute_ipv4_rmap_cmd);
+ install_element (BGP_NODE, &no_bgp_redistribute_ipv4_rmap_cmd);
+ install_element (BGP_NODE, &bgp_redistribute_ipv4_metric_cmd);
+ install_element (BGP_NODE, &no_bgp_redistribute_ipv4_metric_cmd);
+ install_element (BGP_NODE, &bgp_redistribute_ipv4_rmap_metric_cmd);
+ install_element (BGP_NODE, &bgp_redistribute_ipv4_metric_rmap_cmd);
+ install_element (BGP_NODE, &no_bgp_redistribute_ipv4_rmap_metric_cmd);
+ install_element (BGP_NODE, &no_bgp_redistribute_ipv4_metric_rmap_cmd);
+#ifdef HAVE_IPV6
+ install_element (BGP_IPV6_NODE, &bgp_redistribute_ipv6_cmd);
+ install_element (BGP_IPV6_NODE, &no_bgp_redistribute_ipv6_cmd);
+ install_element (BGP_IPV6_NODE, &bgp_redistribute_ipv6_rmap_cmd);
+ install_element (BGP_IPV6_NODE, &no_bgp_redistribute_ipv6_rmap_cmd);
+ install_element (BGP_IPV6_NODE, &bgp_redistribute_ipv6_metric_cmd);
+ install_element (BGP_IPV6_NODE, &no_bgp_redistribute_ipv6_metric_cmd);
+ install_element (BGP_IPV6_NODE, &bgp_redistribute_ipv6_rmap_metric_cmd);
+ install_element (BGP_IPV6_NODE, &bgp_redistribute_ipv6_metric_rmap_cmd);
+ install_element (BGP_IPV6_NODE, &no_bgp_redistribute_ipv6_rmap_metric_cmd);
+ install_element (BGP_IPV6_NODE, &no_bgp_redistribute_ipv6_metric_rmap_cmd);
+#endif /* HAVE_IPV6 */
+
+ /* Community-list. */
+ community_list_vty ();
+}
+
+#include "memory.h"
+#include "bgp_regex.h"
+#include "bgp_clist.h"
+#include "bgp_ecommunity.h"
+
+/* VTY functions. */
+
+/* Direction value to string conversion. */
+char *
+community_direct_str (int direct)
+{
+ switch (direct)
+ {
+ case COMMUNITY_DENY:
+ return "deny";
+ break;
+ case COMMUNITY_PERMIT:
+ return "permit";
+ break;
+ default:
+ return "unknown";
+ break;
+ }
+}
+
+/* Display error string. */
+void
+community_list_perror (struct vty *vty, int ret)
+{
+ switch (ret)
+ {
+ case COMMUNITY_LIST_ERR_CANT_FIND_LIST:
+ vty_out (vty, "%% Can't find communit-list%s", VTY_NEWLINE);
+ break;
+ case COMMUNITY_LIST_ERR_MALFORMED_VAL:
+ vty_out (vty, "%% Malformed community-list value%s", VTY_NEWLINE);
+ break;
+ case COMMUNITY_LIST_ERR_STANDARD_CONFLICT:
+ vty_out (vty, "%% Community name conflict, previously defined as standard community%s", VTY_NEWLINE);
+ break;
+ case COMMUNITY_LIST_ERR_EXPANDED_CONFLICT:
+ vty_out (vty, "%% Community name conflict, previously defined as expanded community%s", VTY_NEWLINE);
+ break;
+ }
+}
+
+/* VTY interface for community_set() function. */
+int
+community_list_set_vty (struct vty *vty, int argc, char **argv, int style,
+ int reject_all_digit_name)
+{
+ int ret;
+ int direct;
+ char *str;
+
+ /* Check the list type. */
+ if (strncmp (argv[1], "p", 1) == 0)
+ direct = COMMUNITY_PERMIT;
+ else if (strncmp (argv[1], "d", 1) == 0)
+ direct = COMMUNITY_DENY;
+ else
+ {
+ vty_out (vty, "%% Matching condition must be permit or deny%s",
+ VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ /* All digit name check. */
+ if (reject_all_digit_name && all_digit (argv[0]))
+ {
+ vty_out (vty, "%% Community name cannot have all digits%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ /* Concat community string argument. */
+ if (argc > 1)
+ str = argv_concat (argv, argc, 2);
+ else
+ str = NULL;
+
+ /* When community_list_set() return nevetive value, it means
+ malformed community string. */
+ ret = community_list_set (bgp_clist, argv[0], str, direct, style);
+
+ /* Free temporary community list string allocated by
+ argv_concat(). */
+ if (str)
+ XFREE (MTYPE_TMP, str);
+
+ if (ret < 0)
+ {
+ /* Display error string. */
+ community_list_perror (vty, ret);
+ return CMD_WARNING;
+ }
+
+ return CMD_SUCCESS;
+}
+
+/* Community-list delete with name. */
+int
+community_list_unset_all_vty (struct vty *vty, char *name)
+{
+ int ret;
+
+ ret = community_list_unset (bgp_clist, name, NULL, 0, COMMUNITY_LIST_AUTO);
+
+ if (ret < 0)
+ {
+ community_list_perror (vty, ret);
+ return CMD_WARNING;
+ }
+ return CMD_SUCCESS;
+}
+
+/* Communiyt-list entry delete. */
+int
+community_list_unset_vty (struct vty *vty, int argc, char **argv, int style)
+{
+ int ret;
+ int direct;
+ char *str;
+
+ /* Check the list direct. */
+ if (strncmp (argv[1], "p", 1) == 0)
+ direct = COMMUNITY_PERMIT;
+ else if (strncmp (argv[1], "d", 1) == 0)
+ direct = COMMUNITY_DENY;
+ else
+ {
+ vty_out (vty, "%% Matching condition must be permit or deny%s",
+ VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ /* Concat community string argument. */
+ str = argv_concat (argv, argc, 2);
+
+ /* Unset community list. */
+ ret = community_list_unset (bgp_clist, argv[0], str, direct, style);
+
+ /* Free temporary community list string allocated by
+ argv_concat(). */
+ XFREE (MTYPE_TMP, str);
+
+ if (ret < 0)
+ {
+ community_list_perror (vty, ret);
+ return CMD_WARNING;
+ }
+
+ return CMD_SUCCESS;
+}
+
+/* "community-list" keyword help string. */
+#define COMMUNITY_LIST_STR "Add a community list entry\n"
+#define COMMUNITY_VAL_STR "Community number in aa:nn format or internet|local-AS|no-advertise|no-export\n"
+
+DEFUN (ip_community_list,
+ ip_community_list_cmd,
+ "ip community-list WORD (deny|permit) .AA:NN",
+ IP_STR
+ COMMUNITY_LIST_STR
+ "Community list name\n"
+ "Specify community to reject\n"
+ "Specify community to accept\n"
+ COMMUNITY_VAL_STR)
+{
+ return community_list_set_vty (vty, argc, argv, COMMUNITY_LIST_AUTO, 1);
+}
+
+DEFUN (ip_community_list_standard,
+ ip_community_list_standard_cmd,
+ "ip community-list <1-99> (deny|permit) .AA:NN",
+ IP_STR
+ COMMUNITY_LIST_STR
+ "Community list number (standard)\n"
+ "Specify community to reject\n"
+ "Specify community to accept\n"
+ COMMUNITY_VAL_STR)
+{
+ return community_list_set_vty (vty, argc, argv, COMMUNITY_LIST_STANDARD, 0);
+}
+
+ALIAS (ip_community_list_standard,
+ ip_community_list_standard2_cmd,
+ "ip community-list <1-99> (deny|permit)",
+ IP_STR
+ COMMUNITY_LIST_STR
+ "Community list number (standard)\n"
+ "Specify community to reject\n"
+ "Specify community to accept\n")
+
+DEFUN (ip_community_list_expanded,
+ ip_community_list_expanded_cmd,
+ "ip community-list <100-199> (deny|permit) .LINE",
+ IP_STR
+ COMMUNITY_LIST_STR
+ "Community list number (expanded)\n"
+ "Specify community to reject\n"
+ "Specify community to accept\n"
+ "An ordered list as a regular-expression\n")
+{
+ return community_list_set_vty (vty, argc, argv, COMMUNITY_LIST_EXPANDED, 0);
+}
+
+DEFUN (ip_community_list_name_standard,
+ ip_community_list_name_standard_cmd,
+ "ip community-list standard WORD (deny|permit) .AA:NN",
+ IP_STR
+ COMMUNITY_LIST_STR
+ "Add a standard community-list entry\n"
+ "Community list name\n"
+ "Specify community to reject\n"
+ "Specify community to accept\n"
+ COMMUNITY_VAL_STR)
+{
+ return community_list_set_vty (vty, argc, argv, COMMUNITY_LIST_STANDARD, 1);
+}
+
+ALIAS (ip_community_list_name_standard,
+ ip_community_list_name_standard2_cmd,
+ "ip community-list standard WORD (deny|permit)",
+ IP_STR
+ COMMUNITY_LIST_STR
+ "Add a standard community-list entry\n"
+ "Community list name\n"
+ "Specify community to reject\n"
+ "Specify community to accept\n")
+
+DEFUN (ip_community_list_name_expanded,
+ ip_community_list_name_expanded_cmd,
+ "ip community-list expanded WORD (deny|permit) .LINE",
+ IP_STR
+ COMMUNITY_LIST_STR
+ "Add an expanded community-list entry\n"
+ "Community list name\n"
+ "Specify community to reject\n"
+ "Specify community to accept\n"
+ "An ordered list as a regular-expression\n")
+{
+ return community_list_set_vty (vty, argc, argv, COMMUNITY_LIST_EXPANDED, 1);
+}
+
+DEFUN (no_ip_community_list_all,
+ no_ip_community_list_all_cmd,
+ "no ip community-list (WORD|<1-99>|<100-199>)",
+ NO_STR
+ IP_STR
+ COMMUNITY_LIST_STR
+ "Community list name\n"
+ "Community list number (standard)\n"
+ "Community list number (expanded)\n")
+{
+ return community_list_unset_all_vty (vty, argv[0]);
+}
+
+DEFUN (no_ip_community_list_name_all,
+ no_ip_community_list_name_all_cmd,
+ "no ip community-list (standard|expanded) WORD",
+ NO_STR
+ IP_STR
+ COMMUNITY_LIST_STR
+ "Add a standard community-list entry\n"
+ "Add an expanded community-list entry\n"
+ "Community list name\n")
+{
+ return community_list_unset_all_vty (vty, argv[1]);
+}
+
+DEFUN (no_ip_community_list,
+ no_ip_community_list_cmd,
+ "no ip community-list WORD (deny|permit) .AA:NN",
+ NO_STR
+ IP_STR
+ COMMUNITY_LIST_STR
+ "Community list name\n"
+ "Specify community to reject\n"
+ "Specify community to accept\n"
+ COMMUNITY_VAL_STR)
+{
+ return community_list_unset_vty (vty, argc, argv, COMMUNITY_LIST_AUTO);
+}
+
+DEFUN (no_ip_community_list_standard,
+ no_ip_community_list_standard_cmd,
+ "no ip community-list <1-99> (deny|permit) .AA:NN",
+ NO_STR
+ IP_STR
+ COMMUNITY_LIST_STR
+ "Community list number (standard)\n"
+ "Specify community to reject\n"
+ "Specify community to accept\n"
+ COMMUNITY_VAL_STR)
+{
+ return community_list_unset_vty (vty, argc, argv, COMMUNITY_LIST_STANDARD);
+}
+
+DEFUN (no_ip_community_list_expanded,
+ no_ip_community_list_expanded_cmd,
+ "no ip community-list <100-199> (deny|permit) .LINE",
+ NO_STR
+ IP_STR
+ COMMUNITY_LIST_STR
+ "Community list number (expanded)\n"
+ "Specify community to reject\n"
+ "Specify community to accept\n"
+ "An ordered list as a regular-expression\n")
+{
+ return community_list_unset_vty (vty, argc, argv, COMMUNITY_LIST_EXPANDED);
+}
+
+DEFUN (no_ip_community_list_name_standard,
+ no_ip_community_list_name_standard_cmd,
+ "no ip community-list standard WORD (deny|permit) .AA:NN",
+ NO_STR
+ IP_STR
+ COMMUNITY_LIST_STR
+ "Specify a standard community-list\n"
+ "Community list name\n"
+ "Specify community to reject\n"
+ "Specify community to accept\n"
+ COMMUNITY_VAL_STR)
+{
+ return community_list_unset_vty (vty, argc, argv, COMMUNITY_LIST_STANDARD);
+}
+
+DEFUN (no_ip_community_list_name_expanded,
+ no_ip_community_list_name_expanded_cmd,
+ "no ip community-list expanded WORD (deny|permit) .LINE",
+ NO_STR
+ IP_STR
+ COMMUNITY_LIST_STR
+ "Specify an expanded community-list\n"
+ "Community list name\n"
+ "Specify community to reject\n"
+ "Specify community to accept\n"
+ "An ordered list as a regular-expression\n")
+{
+ return community_list_unset_vty (vty, argc, argv, COMMUNITY_LIST_EXPANDED);
+}
+
+void
+community_list_show (struct vty *vty, struct community_list *list)
+{
+ struct community_entry *entry;
+
+ for (entry = list->head; entry; entry = entry->next)
+ {
+ if (entry == list->head)
+ {
+ if (all_digit (list->name))
+ vty_out (vty, "Community %s list %s%s",
+ entry->style == COMMUNITY_LIST_STANDARD ?
+ "standard" : "(expanded) access",
+ list->name, VTY_NEWLINE);
+ else
+ vty_out (vty, "Named Community %s list %s%s",
+ entry->style == COMMUNITY_LIST_STANDARD ?
+ "standard" : "expanded",
+ list->name, VTY_NEWLINE);
+ }
+ if (entry->any)
+ vty_out (vty, " %s%s",
+ community_direct_str (entry->direct), VTY_NEWLINE);
+ else
+ vty_out (vty, " %s %s%s",
+ community_direct_str (entry->direct),
+ entry->style == COMMUNITY_LIST_STANDARD
+ ? community_str (entry->u.com) : entry->config,
+ VTY_NEWLINE);
+ }
+}
+
+DEFUN (show_ip_community_list,
+ show_ip_community_list_cmd,
+ "show ip community-list",
+ SHOW_STR
+ IP_STR
+ "List community-list\n")
+{
+ struct community_list *list;
+ struct community_list_master *cm;
+
+ cm = community_list_master_lookup (bgp_clist, COMMUNITY_LIST_AUTO);
+ if (! cm)
+ return CMD_SUCCESS;
+
+ for (list = cm->num.head; list; list = list->next)
+ community_list_show (vty, list);
+
+ for (list = cm->str.head; list; list = list->next)
+ community_list_show (vty, list);
+
+ return CMD_SUCCESS;
+}
+
+DEFUN (show_ip_community_list_arg,
+ show_ip_community_list_arg_cmd,
+ "show ip community-list (<1-199>|WORD)",
+ SHOW_STR
+ IP_STR
+ "List community-list\n"
+ "Community-list number\n"
+ "Community-list name\n")
+{
+ struct community_list *list;
+
+ list = community_list_lookup (bgp_clist, argv[0], COMMUNITY_LIST_AUTO);
+ if (! list)
+ {
+ vty_out (vty, "%% Can't find communit-list%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ community_list_show (vty, list);
+
+ return CMD_SUCCESS;
+}
+
+int
+extcommunity_list_set_vty (struct vty *vty, int argc, char **argv, int style,
+ int reject_all_digit_name)
+{
+ int ret;
+ int direct;
+ char *str;
+
+ /* Check the list type. */
+ if (strncmp (argv[1], "p", 1) == 0)
+ direct = COMMUNITY_PERMIT;
+ else if (strncmp (argv[1], "d", 1) == 0)
+ direct = COMMUNITY_DENY;
+ else
+ {
+ vty_out (vty, "%% Matching condition must be permit or deny%s",
+ VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ /* All digit name check. */
+ if (reject_all_digit_name && all_digit (argv[0]))
+ {
+ vty_out (vty, "%% Community name cannot have all digits%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ /* Concat community string argument. */
+ if (argc > 1)
+ str = argv_concat (argv, argc, 2);
+ else
+ str = NULL;
+
+ ret = extcommunity_list_set (bgp_clist, argv[0], str, direct, style);
+
+ /* Free temporary community list string allocated by
+ argv_concat(). */
+ if (str)
+ XFREE (MTYPE_TMP, str);
+
+ if (ret < 0)
+ {
+ community_list_perror (vty, ret);
+ return CMD_WARNING;
+ }
+ return CMD_SUCCESS;
+}
+
+int
+extcommunity_list_unset_all_vty (struct vty *vty, char *name)
+{
+ int ret;
+
+ ret = extcommunity_list_unset (bgp_clist, name, NULL, 0, EXTCOMMUNITY_LIST_AUTO);
+
+ if (ret < 0)
+ {
+ community_list_perror (vty, ret);
+ return CMD_WARNING;
+ }
+ return CMD_SUCCESS;
+}
+
+int
+extcommunity_list_unset_vty (struct vty *vty, int argc, char **argv, int style)
+{
+ int ret;
+ int direct;
+ char *str;
+
+ /* Check the list direct. */
+ if (strncmp (argv[1], "p", 1) == 0)
+ direct = COMMUNITY_PERMIT;
+ else if (strncmp (argv[1], "d", 1) == 0)
+ direct = COMMUNITY_DENY;
+ else
+ {
+ vty_out (vty, "%% Matching condition must be permit or deny%s",
+ VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ /* Concat community string argument. */
+ str = argv_concat (argv, argc, 2);
+
+ /* Unset community list. */
+ ret = extcommunity_list_unset (bgp_clist, argv[0], str, direct, style);
+
+ /* Free temporary community list string allocated by
+ argv_concat(). */
+ XFREE (MTYPE_TMP, str);
+
+ if (ret < 0)
+ {
+ community_list_perror (vty, ret);
+ return CMD_WARNING;
+ }
+
+ return CMD_SUCCESS;
+}
+
+/* "extcommunity-list" keyword help string. */
+#define EXTCOMMUNITY_LIST_STR "Add a extended community list entry\n"
+#define EXTCOMMUNITY_VAL_STR "Extended community attribute in 'rt aa:nn_or_IPaddr:nn' OR 'soo aa:nn_or_IPaddr:nn' format\n"
+
+DEFUN (ip_extcommunity_list_standard,
+ ip_extcommunity_list_standard_cmd,
+ "ip extcommunity-list <1-99> (deny|permit) .AA:NN",
+ IP_STR
+ EXTCOMMUNITY_LIST_STR
+ "Extended Community list number (standard)\n"
+ "Specify community to reject\n"
+ "Specify community to accept\n"
+ EXTCOMMUNITY_VAL_STR)
+{
+ return extcommunity_list_set_vty (vty, argc, argv, EXTCOMMUNITY_LIST_STANDARD, 0);
+}
+
+ALIAS (ip_extcommunity_list_standard,
+ ip_extcommunity_list_standard2_cmd,
+ "ip extcommunity-list <1-99> (deny|permit)",
+ IP_STR
+ EXTCOMMUNITY_LIST_STR
+ "Extended Community list number (standard)\n"
+ "Specify community to reject\n"
+ "Specify community to accept\n")
+
+DEFUN (ip_extcommunity_list_expanded,
+ ip_extcommunity_list_expanded_cmd,
+ "ip extcommunity-list <100-199> (deny|permit) .LINE",
+ IP_STR
+ EXTCOMMUNITY_LIST_STR
+ "Extended Community list number (expanded)\n"
+ "Specify community to reject\n"
+ "Specify community to accept\n"
+ "An ordered list as a regular-expression\n")
+{
+ return extcommunity_list_set_vty (vty, argc, argv, EXTCOMMUNITY_LIST_EXPANDED, 0);
+}
+
+DEFUN (ip_extcommunity_list_name_standard,
+ ip_extcommunity_list_name_standard_cmd,
+ "ip extcommunity-list standard WORD (deny|permit) .AA:NN",
+ IP_STR
+ EXTCOMMUNITY_LIST_STR
+ "Specify standard extcommunity-list\n"
+ "Extended Community list name\n"
+ "Specify community to reject\n"
+ "Specify community to accept\n"
+ EXTCOMMUNITY_VAL_STR)
+{
+ return extcommunity_list_set_vty (vty, argc, argv, EXTCOMMUNITY_LIST_STANDARD, 1);
+}
+
+ALIAS (ip_extcommunity_list_name_standard,
+ ip_extcommunity_list_name_standard2_cmd,
+ "ip extcommunity-list standard WORD (deny|permit)",
+ IP_STR
+ EXTCOMMUNITY_LIST_STR
+ "Specify standard extcommunity-list\n"
+ "Extended Community list name\n"
+ "Specify community to reject\n"
+ "Specify community to accept\n")
+
+DEFUN (ip_extcommunity_list_name_expanded,
+ ip_extcommunity_list_name_expanded_cmd,
+ "ip extcommunity-list expanded WORD (deny|permit) .LINE",
+ IP_STR
+ EXTCOMMUNITY_LIST_STR
+ "Specify expanded extcommunity-list\n"
+ "Extended Community list name\n"
+ "Specify community to reject\n"
+ "Specify community to accept\n"
+ "An ordered list as a regular-expression\n")
+{
+ return extcommunity_list_set_vty (vty, argc, argv, EXTCOMMUNITY_LIST_EXPANDED, 1);
+}
+
+DEFUN (no_ip_extcommunity_list_all,
+ no_ip_extcommunity_list_all_cmd,
+ "no ip extcommunity-list (<1-99>|<100-199>)",
+ NO_STR
+ IP_STR
+ EXTCOMMUNITY_LIST_STR
+ "Extended Community list number (standard)\n"
+ "Extended Community list number (expanded)\n")
+{
+ return extcommunity_list_unset_all_vty (vty, argv[0]);
+}
+
+DEFUN (no_ip_extcommunity_list_name_all,
+ no_ip_extcommunity_list_name_all_cmd,
+ "no ip extcommunity-list (standard|expanded) WORD",
+ NO_STR
+ IP_STR
+ EXTCOMMUNITY_LIST_STR
+ "Specify standard extcommunity-list\n"
+ "Specify expanded extcommunity-list\n"
+ "Extended Community list name\n")
+{
+ return extcommunity_list_unset_all_vty (vty, argv[1]);
+}
+
+DEFUN (no_ip_extcommunity_list_standard,
+ no_ip_extcommunity_list_standard_cmd,
+ "no ip extcommunity-list <1-99> (deny|permit) .AA:NN",
+ NO_STR
+ IP_STR
+ EXTCOMMUNITY_LIST_STR
+ "Extended Community list number (standard)\n"
+ "Specify community to reject\n"
+ "Specify community to accept\n"
+ EXTCOMMUNITY_VAL_STR)
+{
+ return extcommunity_list_unset_vty (vty, argc, argv, EXTCOMMUNITY_LIST_STANDARD);
+}
+
+DEFUN (no_ip_extcommunity_list_expanded,
+ no_ip_extcommunity_list_expanded_cmd,
+ "no ip extcommunity-list <100-199> (deny|permit) .LINE",
+ NO_STR
+ IP_STR
+ EXTCOMMUNITY_LIST_STR
+ "Extended Community list number (expanded)\n"
+ "Specify community to reject\n"
+ "Specify community to accept\n"
+ "An ordered list as a regular-expression\n")
+{
+ return extcommunity_list_unset_vty (vty, argc, argv, EXTCOMMUNITY_LIST_EXPANDED);
+}
+
+DEFUN (no_ip_extcommunity_list_name_standard,
+ no_ip_extcommunity_list_name_standard_cmd,
+ "no ip extcommunity-list standard WORD (deny|permit) .AA:NN",
+ NO_STR
+ IP_STR
+ EXTCOMMUNITY_LIST_STR
+ "Specify standard extcommunity-list\n"
+ "Extended Community list name\n"
+ "Specify community to reject\n"
+ "Specify community to accept\n"
+ EXTCOMMUNITY_VAL_STR)
+{
+ return extcommunity_list_unset_vty (vty, argc, argv, EXTCOMMUNITY_LIST_STANDARD);
+}
+
+DEFUN (no_ip_extcommunity_list_name_expanded,
+ no_ip_extcommunity_list_name_expanded_cmd,
+ "no ip extcommunity-list expanded WORD (deny|permit) .LINE",
+ NO_STR
+ IP_STR
+ EXTCOMMUNITY_LIST_STR
+ "Specify expanded extcommunity-list\n"
+ "Community list name\n"
+ "Specify community to reject\n"
+ "Specify community to accept\n"
+ "An ordered list as a regular-expression\n")
+{
+ return extcommunity_list_unset_vty (vty, argc, argv, EXTCOMMUNITY_LIST_EXPANDED);
+}
+
+void
+extcommunity_list_show (struct vty *vty, struct community_list *list)
+{
+ struct community_entry *entry;
+
+ for (entry = list->head; entry; entry = entry->next)
+ {
+ if (entry == list->head)
+ {
+ if (all_digit (list->name))
+ vty_out (vty, "Extended community %s list %s%s",
+ entry->style == EXTCOMMUNITY_LIST_STANDARD ?
+ "standard" : "(expanded) access",
+ list->name, VTY_NEWLINE);
+ else
+ vty_out (vty, "Named extended community %s list %s%s",
+ entry->style == EXTCOMMUNITY_LIST_STANDARD ?
+ "standard" : "expanded",
+ list->name, VTY_NEWLINE);
+ }
+ if (entry->any)
+ vty_out (vty, " %s%s",
+ community_direct_str (entry->direct), VTY_NEWLINE);
+ else
+ vty_out (vty, " %s %s%s",
+ community_direct_str (entry->direct),
+ entry->style == EXTCOMMUNITY_LIST_STANDARD ?
+ entry->u.ecom->str : entry->config,
+ VTY_NEWLINE);
+ }
+}
+
+DEFUN (show_ip_extcommunity_list,
+ show_ip_extcommunity_list_cmd,
+ "show ip extcommunity-list",
+ SHOW_STR
+ IP_STR
+ "List extended-community list\n")
+{
+ struct community_list *list;
+ struct community_list_master *cm;
+
+ cm = community_list_master_lookup (bgp_clist, EXTCOMMUNITY_LIST_AUTO);
+ if (! cm)
+ return CMD_SUCCESS;
+
+ for (list = cm->num.head; list; list = list->next)
+ extcommunity_list_show (vty, list);
+
+ for (list = cm->str.head; list; list = list->next)
+ extcommunity_list_show (vty, list);
+
+ return CMD_SUCCESS;
+}
+
+DEFUN (show_ip_extcommunity_list_arg,
+ show_ip_extcommunity_list_arg_cmd,
+ "show ip extcommunity-list (<1-199>|WORD)",
+ SHOW_STR
+ IP_STR
+ "List extended-community list\n"
+ "Extcommunity-list number\n"
+ "Extcommunity-list name\n")
+{
+ struct community_list *list;
+
+ list = community_list_lookup (bgp_clist, argv[0], EXTCOMMUNITY_LIST_AUTO);
+ if (! list)
+ {
+ vty_out (vty, "%% Can't find extcommunit-list%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ extcommunity_list_show (vty, list);
+
+ return CMD_SUCCESS;
+}
+
+/* Return configuration string of community-list entry. */
+static char *
+community_list_config_str (struct community_entry *entry)
+{
+ char *str;
+
+ if (entry->any)
+ str = "";
+ else
+ {
+ if (entry->style == COMMUNITY_LIST_STANDARD)
+ str = community_str (entry->u.com);
+ else
+ str = entry->config;
+ }
+ return str;
+}
+
+/* Display community-list and extcommunity-list configuration. */
+int
+community_list_config_write (struct vty *vty)
+{
+ struct community_list *list;
+ struct community_entry *entry;
+ struct community_list_master *cm;
+ int write = 0;
+
+ /* Community-list. */
+ cm = community_list_master_lookup (bgp_clist, COMMUNITY_LIST_AUTO);
+
+ for (list = cm->num.head; list; list = list->next)
+ for (entry = list->head; entry; entry = entry->next)
+ {
+ if (atol (list->name) < 200)
+ vty_out (vty, "ip community-list %s %s %s%s",
+ list->name, community_direct_str (entry->direct),
+ community_list_config_str (entry),
+ VTY_NEWLINE);
+ else
+ vty_out (vty, "ip community-list %s %s %s %s%s",
+ entry->style == COMMUNITY_LIST_STANDARD
+ ? "standard" : "expanded",
+ list->name, community_direct_str (entry->direct),
+ community_list_config_str (entry),
+ VTY_NEWLINE);
+ write++;
+ }
+ for (list = cm->str.head; list; list = list->next)
+ for (entry = list->head; entry; entry = entry->next)
+ {
+ vty_out (vty, "ip community-list %s %s %s %s%s",
+ entry->style == COMMUNITY_LIST_STANDARD
+ ? "standard" : "expanded",
+ list->name, community_direct_str (entry->direct),
+ community_list_config_str (entry),
+ VTY_NEWLINE);
+ write++;
+ }
+
+ /* Extcommunity-list. */
+ cm = community_list_master_lookup (bgp_clist, EXTCOMMUNITY_LIST_AUTO);
+
+ for (list = cm->num.head; list; list = list->next)
+ for (entry = list->head; entry; entry = entry->next)
+ {
+ if (atol (list->name) < 200)
+ vty_out (vty, "ip extcommunity-list %s %s %s%s",
+ list->name, community_direct_str (entry->direct),
+ community_list_config_str (entry), VTY_NEWLINE);
+ else
+ vty_out (vty, "ip extcommunity-list %s %s %s %s%s",
+ entry->style == EXTCOMMUNITY_LIST_STANDARD
+ ? "standard" : "expanded",
+ list->name, community_direct_str (entry->direct),
+ community_list_config_str (entry), VTY_NEWLINE);
+ write++;
+ }
+ for (list = cm->str.head; list; list = list->next)
+ for (entry = list->head; entry; entry = entry->next)
+ {
+ vty_out (vty, "ip extcommunity-list %s %s %s %s%s",
+ entry->style == EXTCOMMUNITY_LIST_STANDARD
+ ? "standard" : "expanded",
+ list->name, community_direct_str (entry->direct),
+ community_list_config_str (entry), VTY_NEWLINE);
+ write++;
+ }
+ return write;
+}
+
+struct cmd_node community_list_node =
+{
+ COMMUNITY_LIST_NODE,
+ "",
+ 1 /* Export to vtysh. */
+};
+
+void
+community_list_vty ()
+{
+ install_node (&community_list_node, community_list_config_write);
+
+ /* Community-list. */
+ install_element (CONFIG_NODE, &ip_community_list_cmd);
+ install_element (CONFIG_NODE, &ip_community_list_standard_cmd);
+ install_element (CONFIG_NODE, &ip_community_list_standard2_cmd);
+ install_element (CONFIG_NODE, &ip_community_list_expanded_cmd);
+ install_element (CONFIG_NODE, &ip_community_list_name_standard_cmd);
+ install_element (CONFIG_NODE, &ip_community_list_name_standard2_cmd);
+ install_element (CONFIG_NODE, &ip_community_list_name_expanded_cmd);
+ install_element (CONFIG_NODE, &no_ip_community_list_all_cmd);
+ install_element (CONFIG_NODE, &no_ip_community_list_name_all_cmd);
+ install_element (CONFIG_NODE, &no_ip_community_list_cmd);
+ install_element (CONFIG_NODE, &no_ip_community_list_standard_cmd);
+ install_element (CONFIG_NODE, &no_ip_community_list_expanded_cmd);
+ install_element (CONFIG_NODE, &no_ip_community_list_name_standard_cmd);
+ install_element (CONFIG_NODE, &no_ip_community_list_name_expanded_cmd);
+ install_element (VIEW_NODE, &show_ip_community_list_cmd);
+ install_element (VIEW_NODE, &show_ip_community_list_arg_cmd);
+ install_element (ENABLE_NODE, &show_ip_community_list_cmd);
+ install_element (ENABLE_NODE, &show_ip_community_list_arg_cmd);
+
+ /* Extcommunity-list. */
+ install_element (CONFIG_NODE, &ip_extcommunity_list_standard_cmd);
+ install_element (CONFIG_NODE, &ip_extcommunity_list_standard2_cmd);
+ install_element (CONFIG_NODE, &ip_extcommunity_list_expanded_cmd);
+ install_element (CONFIG_NODE, &ip_extcommunity_list_name_standard_cmd);
+ install_element (CONFIG_NODE, &ip_extcommunity_list_name_standard2_cmd);
+ install_element (CONFIG_NODE, &ip_extcommunity_list_name_expanded_cmd);
+ install_element (CONFIG_NODE, &no_ip_extcommunity_list_all_cmd);
+ install_element (CONFIG_NODE, &no_ip_extcommunity_list_name_all_cmd);
+ install_element (CONFIG_NODE, &no_ip_extcommunity_list_standard_cmd);
+ install_element (CONFIG_NODE, &no_ip_extcommunity_list_expanded_cmd);
+ install_element (CONFIG_NODE, &no_ip_extcommunity_list_name_standard_cmd);
+ install_element (CONFIG_NODE, &no_ip_extcommunity_list_name_expanded_cmd);
+ install_element (VIEW_NODE, &show_ip_extcommunity_list_cmd);
+ install_element (VIEW_NODE, &show_ip_extcommunity_list_arg_cmd);
+ install_element (ENABLE_NODE, &show_ip_extcommunity_list_cmd);
+ install_element (ENABLE_NODE, &show_ip_extcommunity_list_arg_cmd);
+}