bgp_vty.c
上传用户:xiaozhuqw
上传日期:2009-11-15
资源大小:1338k
文件大小:293k
源码类别:

网络

开发平台:

Unix_Linux

  1. /* BGP VTY interface.
  2.    Copyright (C) 1996, 97, 98, 99, 2000 Kunihiro Ishiguro
  3.    This file is part of GNU Zebra.
  4.    GNU Zebra is free software; you can redistribute it and/or modify it
  5.    under the terms of the GNU General Public License as published by the
  6.    Free Software Foundation; either version 2, or (at your option) any
  7.    later version.
  8.    GNU Zebra is distributed in the hope that it will be useful, but
  9.    WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.    General Public License for more details.
  12.    You should have received a copy of the GNU General Public License
  13.    along with GNU Zebra; see the file COPYING.  If not, write to the Free
  14.    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  15.    02111-1307, USA.  */
  16. #include <zebra.h>
  17. #include "command.h"
  18. #include "prefix.h"
  19. #include "plist.h"
  20. #include "buffer.h"
  21. #include "linklist.h"
  22. #include "stream.h"
  23. #include "thread.h"
  24. #include "log.h"
  25. #include "bgpd/bgpd.h"
  26. #include "bgpd/bgp_attr.h"
  27. #include "bgpd/bgp_aspath.h"
  28. #include "bgpd/bgp_community.h"
  29. #include "bgpd/bgp_debug.h"
  30. #include "bgpd/bgp_fsm.h"
  31. #include "bgpd/bgp_mplsvpn.h"
  32. #include "bgpd/bgp_open.h"
  33. #include "bgpd/bgp_route.h"
  34. #include "bgpd/bgp_zebra.h"
  35. /* Utility function to get address family from current node.  */
  36. afi_t
  37. bgp_node_afi (struct vty *vty)
  38. {
  39.   if (vty->node == BGP_IPV6_NODE)
  40.     return AFI_IP6;
  41.   return AFI_IP;
  42. }
  43. /* Utility function to get subsequent address family from current
  44.    node.  */
  45. safi_t
  46. bgp_node_safi (struct vty *vty)
  47. {
  48.   if (vty->node == BGP_VPNV4_NODE)
  49.     return SAFI_MPLS_VPN;
  50.   if (vty->node == BGP_IPV4M_NODE)
  51.     return SAFI_MULTICAST;
  52.   return SAFI_UNICAST;
  53. }
  54. int
  55. peer_address_self_check (union sockunion *su)
  56. {
  57.   struct interface *ifp = NULL;
  58.   if (su->sa.sa_family == AF_INET)
  59.     ifp = if_lookup_by_ipv4_exact (&su->sin.sin_addr);
  60. #ifdef HAVE_IPV6
  61.   else if (su->sa.sa_family == AF_INET6)
  62.     ifp = if_lookup_by_ipv6_exact (&su->sin6.sin6_addr);
  63. #endif /* HAVE IPV6 */
  64.   if (ifp)
  65.     return 1;
  66.   return 0;
  67. }
  68. /* Utility function for looking up peer from VTY.  */
  69. struct peer *
  70. peer_lookup_vty (struct vty *vty, char *ip_str)
  71. {
  72.   int ret;
  73.   struct bgp *bgp;
  74.   union sockunion su;
  75.   struct peer *peer;
  76.   bgp = vty->index;
  77.   ret = str2sockunion (ip_str, &su);
  78.   if (ret < 0)
  79.     {
  80.       vty_out (vty, "%% Malformed address: %s%s", ip_str, VTY_NEWLINE);
  81.       return NULL;
  82.     }
  83.   peer = peer_lookup (bgp, &su);
  84.   if (! peer)
  85.     {
  86.       vty_out (vty, "%% Specify remote-as or peer-group commands first%s", VTY_NEWLINE);
  87.       return NULL;
  88.     }
  89.   return peer;
  90. }
  91. /* Utility function for looking up peer or peer group.  */
  92. struct peer *
  93. peer_and_group_lookup_vty (struct vty *vty, char *peer_str)
  94. {
  95.   int ret;
  96.   struct bgp *bgp;
  97.   union sockunion su;
  98.   struct peer *peer;
  99.   struct peer_group *group;
  100.   bgp = vty->index;
  101.   ret = str2sockunion (peer_str, &su);
  102.   if (ret == 0)
  103.     {
  104.       peer = peer_lookup (bgp, &su);
  105.       if (peer)
  106. return peer;
  107.     }
  108.   else
  109.     {
  110.       group = peer_group_lookup (bgp, peer_str);
  111.       if (group)
  112. return group->conf;
  113.     }
  114.   vty_out (vty, "%% Specify remote-as or peer-group commands first%s",
  115.    VTY_NEWLINE);
  116.   return NULL;
  117. }
  118. int
  119. bgp_vty_return (struct vty *vty, int ret)
  120. {
  121.   char *str = NULL;
  122.   switch (ret)
  123.     {
  124.     case BGP_ERR_INVALID_VALUE:
  125.       str = "Invalid value";
  126.       break;
  127.     case BGP_ERR_INVALID_FLAG:
  128.       str = "Invalid flag";
  129.       break;
  130.     case BGP_ERR_PEER_INACTIVE:
  131.       str = "Activate the neighbor for the address family first";
  132.       break;
  133.     case BGP_ERR_INVALID_FOR_PEER_GROUP_MEMBER:
  134.       str = "Invalid command for a peer-group member";
  135.       break;
  136.     case BGP_ERR_PEER_GROUP_SHUTDOWN:
  137.       str = "Peer-group has been shutdown. Activate the peer-group first";
  138.       break;
  139.     case BGP_ERR_PEER_GROUP_HAS_THE_FLAG:
  140.       str = "This peer is a peer-group member.  Please change peer-group configuration";
  141.       break;
  142.     case BGP_ERR_PEER_FLAG_CONFLICT:
  143.       str = "Can't set override-capability and strict-capability-match at the same time";
  144.       break;
  145.     case BGP_ERR_PEER_GROUP_MEMBER_EXISTS:
  146.       str = "No activate for peergroup can be given only if peer-group has no members";
  147.       break;
  148.     case BGP_ERR_PEER_BELONGS_TO_GROUP:
  149.       str = "No activate for an individual peer-group member is invalid";
  150.       break;
  151.     case BGP_ERR_PEER_GROUP_AF_UNCONFIGURED:
  152.       str = "Activate the peer-group for the address family first";
  153.       break;
  154.     case BGP_ERR_PEER_GROUP_NO_REMOTE_AS:
  155.       str = "Specify remote-as or peer-group remote AS first";
  156.       break;
  157.     case BGP_ERR_PEER_GROUP_CANT_CHANGE:
  158.       str = "Cannot change the peer-group. Deconfigure first";
  159.       break;
  160.     case BGP_ERR_PEER_GROUP_MISMATCH:
  161.       str = "Cannot have different peer-group for the neighbor";
  162.       break;
  163.     case BGP_ERR_PEER_FILTER_CONFLICT:
  164.       str = "Prefix/distribute list can not co-exist";
  165.       break;
  166.     case BGP_ERR_NOT_INTERNAL_PEER:
  167.       str = "Invalid command. Not an internal neighbor";
  168.       break;
  169.     case BGP_ERR_REMOVE_PRIVATE_AS:
  170.       str = "Private AS cannot be removed for IBGP peers";
  171.       break;
  172.     case BGP_ERR_LOCAL_AS_ALLOWED_ONLY_FOR_EBGP:
  173.       str = "Local-AS allowed only for EBGP peers";
  174.       break;
  175.     case BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS:
  176.       str = "Cannot have local-as same as BGP AS number";
  177.       break;
  178.     }
  179.   if (str)
  180.     {
  181.       vty_out (vty, "%% %s%s", str, VTY_NEWLINE);
  182.       return CMD_WARNING;
  183.     }
  184.   return CMD_SUCCESS;
  185. }
  186. /* BGP global configuration.  */
  187. DEFUN (bgp_multiple_instance_func,
  188.        bgp_multiple_instance_cmd,
  189.        "bgp multiple-instance",
  190.        BGP_STR
  191.        "Enable bgp multiple instancen")
  192. {
  193.   bgp_option_set (BGP_OPT_MULTIPLE_INSTANCE);
  194.   return CMD_SUCCESS;
  195. }
  196. DEFUN (no_bgp_multiple_instance,
  197.        no_bgp_multiple_instance_cmd,
  198.        "no bgp multiple-instance",
  199.        NO_STR
  200.        BGP_STR
  201.        "BGP multiple instancen")
  202. {
  203.   int ret;
  204.   ret = bgp_option_unset (BGP_OPT_MULTIPLE_INSTANCE);
  205.   if (ret < 0)
  206.     {
  207.       vty_out (vty, "%% There are more than two BGP instances%s", VTY_NEWLINE);
  208.       return CMD_WARNING;
  209.     }
  210.   return CMD_SUCCESS;
  211. }
  212. DEFUN (bgp_config_type,
  213.        bgp_config_type_cmd,
  214.        "bgp config-type (cisco|zebra)",
  215.        BGP_STR
  216.        "Configuration typen"
  217.        "ciscon"
  218.        "zebran")
  219. {
  220.   if (strncmp (argv[0], "c", 1) == 0)
  221.     bgp_option_set (BGP_OPT_CONFIG_CISCO);
  222.   else
  223.     bgp_option_unset (BGP_OPT_CONFIG_CISCO);
  224.   return CMD_SUCCESS;
  225. }
  226. DEFUN (no_bgp_config_type,
  227.        no_bgp_config_type_cmd,
  228.        "no bgp config-type",
  229.        NO_STR
  230.        BGP_STR
  231.        "Display configuration typen")
  232. {
  233.   bgp_option_unset (BGP_OPT_CONFIG_CISCO);
  234.   return CMD_SUCCESS;
  235. }
  236. DEFUN (no_synchronization,
  237.        no_synchronization_cmd,
  238.        "no synchronization",
  239.        NO_STR
  240.        "Perform IGP synchronizationn")
  241. {
  242.   return CMD_SUCCESS;
  243. }
  244. DEFUN (no_auto_summary,
  245.        no_auto_summary_cmd,
  246.        "no auto-summary",
  247.        NO_STR
  248.        "Enable automatic network number summarizationn")
  249. {
  250.   return CMD_SUCCESS;
  251. }
  252. DEFUN (neighbor_version,
  253.        neighbor_version_cmd,
  254.        NEIGHBOR_CMD "version <4-4>",
  255.        NEIGHBOR_STR
  256.        NEIGHBOR_ADDR_STR
  257.        "Set the BGP version to match a neighborn"
  258.        "Neighbor's BGP versionn")
  259. {
  260.   return CMD_SUCCESS;
  261. }
  262. /* "router bgp" commands. */
  263. DEFUN (router_bgp, 
  264.        router_bgp_cmd, 
  265.        "router bgp <1-65535>",
  266.        ROUTER_STR
  267.        BGP_STR
  268.        AS_STR)
  269. {
  270.   int ret;
  271.   as_t as;
  272.   struct bgp *bgp;
  273.   char *name = NULL;
  274.   VTY_GET_INTEGER_RANGE ("AS", as, argv[0], 1, 65535);
  275.   if (argc == 2)
  276.     name = argv[1];
  277.   ret = bgp_get (&bgp, &as, name);
  278.   switch (ret)
  279.     {
  280.     case BGP_ERR_MULTIPLE_INSTANCE_NOT_SET:
  281.       vty_out (vty, "Please specify 'bgp multiple-instance' first%s", 
  282.        VTY_NEWLINE);
  283.       return CMD_WARNING;
  284.       break;
  285.     case BGP_ERR_AS_MISMATCH:
  286.       vty_out (vty, "BGP is already running; AS is %d%s", as, VTY_NEWLINE);
  287.       return CMD_WARNING;
  288.       break;
  289.     case BGP_ERR_INSTANCE_MISMATCH:
  290.       vty_out (vty, "BGP view name and AS number mismatch%s", VTY_NEWLINE);
  291.       vty_out (vty, "BGP instance is already running; AS is %d%s",
  292.        as, VTY_NEWLINE);
  293.       return CMD_WARNING;
  294.       break;
  295.     }
  296.   vty->node = BGP_NODE;
  297.   vty->index = bgp;
  298.   return CMD_SUCCESS;
  299. }
  300. ALIAS (router_bgp,
  301.        router_bgp_view_cmd,
  302.        "router bgp <1-65535> view WORD",
  303.        ROUTER_STR
  304.        BGP_STR
  305.        AS_STR
  306.        "BGP viewn"
  307.        "view namen");
  308. /* "no router bgp" commands. */
  309. DEFUN (no_router_bgp,
  310.        no_router_bgp_cmd,
  311.        "no router bgp <1-65535>",
  312.        NO_STR
  313.        ROUTER_STR
  314.        BGP_STR
  315.        AS_STR)
  316. {
  317.   as_t as;
  318.   struct bgp *bgp;
  319.   char *name = NULL;
  320.   VTY_GET_INTEGER_RANGE ("AS", as, argv[0], 1, 65535);
  321.   if (argc == 2)
  322.     name = argv[1];
  323.   /* Lookup bgp structure. */
  324.   bgp = bgp_lookup (as, name);
  325.   if (! bgp)
  326.     {
  327.       vty_out (vty, "%% Can't find BGP instance%s", VTY_NEWLINE);
  328.       return CMD_WARNING;
  329.     }
  330.   bgp_delete (bgp);
  331.   return CMD_SUCCESS;
  332. }
  333. ALIAS (no_router_bgp,
  334.        no_router_bgp_view_cmd,
  335.        "no router bgp <1-65535> view WORD",
  336.        NO_STR
  337.        ROUTER_STR
  338.        BGP_STR
  339.        AS_STR
  340.        "BGP viewn"
  341.        "view namen");
  342. /* BGP router-id.  */
  343. DEFUN (bgp_router_id,
  344.        bgp_router_id_cmd,
  345.        "bgp router-id A.B.C.D",
  346.        BGP_STR
  347.        "Override configured router identifiern"
  348.        "Manually configured router identifiern")
  349. {
  350.   int ret;
  351.   struct in_addr id;
  352.   struct bgp *bgp;
  353.   bgp = vty->index;
  354.   ret = inet_aton (argv[0], &id);
  355.   if (! ret)
  356.     {
  357.       vty_out (vty, "%% Malformed bgp router identifier%s", VTY_NEWLINE);
  358.       return CMD_WARNING;
  359.     }
  360.   bgp_router_id_set (bgp, &id);
  361.   return CMD_SUCCESS;
  362. }
  363. DEFUN (no_bgp_router_id,
  364.        no_bgp_router_id_cmd,
  365.        "no bgp router-id",
  366.        NO_STR
  367.        BGP_STR
  368.        "Override configured router identifiern")
  369. {
  370.   int ret;
  371.   struct in_addr id;
  372.   struct bgp *bgp;
  373.   bgp = vty->index;
  374.   if (argc == 1)
  375.     {
  376.       ret = inet_aton (argv[0], &id);
  377.       if (! ret)
  378. {
  379.   vty_out (vty, "%% Malformed BGP router identifier%s", VTY_NEWLINE);
  380.   return CMD_WARNING;
  381. }
  382.       if (! IPV4_ADDR_SAME (&bgp->router_id, &id))
  383. {
  384.   vty_out (vty, "%% BGP router-id doesn't match%s", VTY_NEWLINE);
  385.   return CMD_WARNING;
  386. }
  387.     }
  388.   bgp_router_id_unset (bgp);
  389.   return CMD_SUCCESS;
  390. }
  391. ALIAS (no_bgp_router_id,
  392.        no_bgp_router_id_val_cmd,
  393.        "no bgp router-id A.B.C.D",
  394.        NO_STR
  395.        BGP_STR
  396.        "Override configured router identifiern"
  397.        "Manually configured router identifiern");
  398. /* BGP Cluster ID.  */
  399. DEFUN (bgp_cluster_id,
  400.        bgp_cluster_id_cmd,
  401.        "bgp cluster-id A.B.C.D",
  402.        BGP_STR
  403.        "Configure Route-Reflector Cluster-idn"
  404.        "Route-Reflector Cluster-id in IP address formatn")
  405. {
  406.   int ret;
  407.   struct bgp *bgp;
  408.   struct in_addr cluster;
  409.   bgp = vty->index;
  410.   ret = inet_aton (argv[0], &cluster);
  411.   if (! ret)
  412.     {
  413.       vty_out (vty, "%% Malformed bgp cluster identifier%s", VTY_NEWLINE);
  414.       return CMD_WARNING;
  415.     }
  416.   bgp_cluster_id_set (bgp, &cluster);
  417.   return CMD_SUCCESS;
  418. }
  419. ALIAS (bgp_cluster_id,
  420.        bgp_cluster_id32_cmd,
  421.        "bgp cluster-id <1-4294967295>",
  422.        BGP_STR
  423.        "Configure Route-Reflector Cluster-idn"
  424.        "Route-Reflector Cluster-id as 32 bit quantityn");
  425. DEFUN (no_bgp_cluster_id,
  426.        no_bgp_cluster_id_cmd,
  427.        "no bgp cluster-id",
  428.        NO_STR
  429.        BGP_STR
  430.        "Configure Route-Reflector Cluster-idn")
  431. {
  432.   int ret;
  433.   struct bgp *bgp;
  434.   struct in_addr cluster;
  435.   bgp = vty->index;
  436.   if (argc == 1)
  437.     {
  438.       ret = inet_aton (argv[0], &cluster);
  439.       if (! ret)
  440. {
  441.   vty_out (vty, "%% Malformed bgp cluster identifier%s", VTY_NEWLINE);
  442.   return CMD_WARNING;
  443. }
  444.     }
  445.   bgp_cluster_id_unset (bgp);
  446.   return CMD_SUCCESS;
  447. }
  448. ALIAS (no_bgp_cluster_id,
  449.        no_bgp_cluster_id_arg_cmd,
  450.        "no bgp cluster-id A.B.C.D",
  451.        NO_STR
  452.        BGP_STR
  453.        "Configure Route-Reflector Cluster-idn"
  454.        "Route-Reflector Cluster-id in IP address formatn");
  455. DEFUN (bgp_confederation_identifier,
  456.        bgp_confederation_identifier_cmd,
  457.        "bgp confederation identifier <1-65535>",
  458.        "BGP specific commandsn"
  459.        "AS confederation parametersn"
  460.        "AS numbern"
  461.        "Set routing domain confederation ASn")
  462. {
  463.   struct bgp *bgp;
  464.   as_t as;
  465.   bgp = vty->index;
  466.   VTY_GET_INTEGER ("AS", as, argv[0]);
  467.   bgp_confederation_id_set (bgp, as);
  468.   return CMD_SUCCESS;
  469. }
  470. DEFUN (no_bgp_confederation_identifier,
  471.        no_bgp_confederation_identifier_cmd,
  472.        "no bgp confederation identifier",
  473.        NO_STR
  474.        "BGP specific commandsn"
  475.        "AS confederation parametersn"
  476.        "AS numbern")
  477. {
  478.   struct bgp *bgp;
  479.   as_t as;
  480.   bgp = vty->index;
  481.   if (argc == 1)
  482.     VTY_GET_INTEGER ("AS", as, argv[0]);
  483.   bgp_confederation_id_unset (bgp);
  484.   return CMD_SUCCESS;
  485. }
  486. ALIAS (no_bgp_confederation_identifier,
  487.        no_bgp_confederation_identifier_arg_cmd,
  488.        "no bgp confederation identifier <1-65535>",
  489.        NO_STR
  490.        "BGP specific commandsn"
  491.        "AS confederation parametersn"
  492.        "AS numbern"
  493.        "Set routing domain confederation ASn");
  494. DEFUN (bgp_confederation_peers,
  495.        bgp_confederation_peers_cmd,
  496.        "bgp confederation peers .<1-65535>",
  497.        "BGP specific commandsn"
  498.        "AS confederation parametersn"
  499.        "Peer ASs in BGP confederationn"
  500.        AS_STR)
  501. {
  502.   struct bgp *bgp;
  503.   as_t as;
  504.   int i;
  505.   bgp = vty->index;
  506.   for (i = 0; i < argc; i++)
  507.     {
  508.       VTY_GET_INTEGER_RANGE ("AS", as, argv[i], 1, 65535);
  509.       if (bgp->as == as)
  510. {
  511.   vty_out (vty, "%% Local member-AS not allowed in confed peer list%s",
  512.    VTY_NEWLINE);
  513.   continue;
  514. }
  515.       bgp_confederation_peers_add (bgp, as);
  516.     }
  517.   return CMD_SUCCESS;
  518. }
  519. DEFUN (no_bgp_confederation_peers,
  520.        no_bgp_confederation_peers_cmd,
  521.        "no bgp confederation peers .<1-65535>",
  522.        NO_STR
  523.        "BGP specific commandsn"
  524.        "AS confederation parametersn"
  525.        "Peer ASs in BGP confederationn"
  526.        AS_STR)
  527. {
  528.   struct bgp *bgp;
  529.   as_t as;
  530.   int i;
  531.   bgp = vty->index;
  532.   for (i = 0; i < argc; i++)
  533.     {
  534.       VTY_GET_INTEGER_RANGE ("AS", as, argv[i], 1, 65535);
  535.       
  536.       bgp_confederation_peers_remove (bgp, as);
  537.     }
  538.   return CMD_SUCCESS;
  539. }
  540. /* BGP timers.  */
  541. DEFUN (bgp_timers,
  542.        bgp_timers_cmd,
  543.        "timers bgp <0-65535> <0-65535>",
  544.        "Adjust routing timersn"
  545.        "BGP timersn"
  546.        "Keepalive intervaln"
  547.        "Holdtimen")
  548. {
  549.   struct bgp *bgp;
  550.   unsigned long keepalive = 0;
  551.   unsigned long holdtime = 0;
  552.   bgp = vty->index;
  553.   VTY_GET_INTEGER ("keepalive", keepalive, argv[0]);
  554.   VTY_GET_INTEGER ("holdtime", holdtime, argv[1]);
  555.   /* Holdtime value check. */
  556.   if (holdtime < 3 && holdtime != 0)
  557.     {
  558.       vty_out (vty, "%% hold time value must be either 0 or greater than 3%s",
  559.        VTY_NEWLINE);
  560.       return CMD_WARNING;
  561.     }
  562.   bgp_timers_set (bgp, keepalive, holdtime);
  563.   return CMD_SUCCESS;
  564. }
  565. DEFUN (no_bgp_timers,
  566.        no_bgp_timers_cmd,
  567.        "no timers bgp",
  568.        NO_STR
  569.        "Adjust routing timersn"
  570.        "BGP timersn")
  571. {
  572.   struct bgp *bgp;
  573.   bgp = vty->index;
  574.   bgp_timers_unset (bgp);
  575.   return CMD_SUCCESS;
  576. }
  577. ALIAS (no_bgp_timers,
  578.        no_bgp_timers_arg_cmd,
  579.        "no timers bgp <0-65535> <0-65535>",
  580.        NO_STR
  581.        "Adjust routing timersn"
  582.        "BGP timersn"
  583.        "Keepalive intervaln"
  584.        "Holdtimen");
  585. DEFUN (bgp_client_to_client_reflection,
  586.        bgp_client_to_client_reflection_cmd,
  587.        "bgp client-to-client reflection",
  588.        "BGP specific commandsn"
  589.        "Configure client to client route reflectionn"
  590.        "reflection of routes allowedn")
  591. {
  592.   struct bgp *bgp;
  593.   bgp = vty->index;
  594.   bgp_flag_unset (bgp, BGP_FLAG_NO_CLIENT_TO_CLIENT);
  595.   return CMD_SUCCESS;
  596. }
  597. DEFUN (no_bgp_client_to_client_reflection,
  598.        no_bgp_client_to_client_reflection_cmd,
  599.        "no bgp client-to-client reflection",
  600.        NO_STR
  601.        "BGP specific commandsn"
  602.        "Configure client to client route reflectionn"
  603.        "reflection of routes allowedn")
  604. {
  605.   struct bgp *bgp;
  606.   bgp = vty->index;
  607.   bgp_flag_set (bgp, BGP_FLAG_NO_CLIENT_TO_CLIENT);
  608.   return CMD_SUCCESS;
  609. }
  610. /* "bgp always-compare-med" configuration. */
  611. DEFUN (bgp_always_compare_med,
  612.        bgp_always_compare_med_cmd,
  613.        "bgp always-compare-med",
  614.        "BGP specific commandsn"
  615.        "Allow comparing MED from different neighborsn")
  616. {
  617.   struct bgp *bgp;
  618.   bgp = vty->index;
  619.   bgp_flag_set (bgp, BGP_FLAG_ALWAYS_COMPARE_MED);
  620.   return CMD_SUCCESS;
  621. }
  622. DEFUN (no_bgp_always_compare_med,
  623.        no_bgp_always_compare_med_cmd,
  624.        "no bgp always-compare-med",
  625.        NO_STR
  626.        "BGP specific commandsn"
  627.        "Allow comparing MED from different neighborsn")
  628. {
  629.   struct bgp *bgp;
  630.   bgp = vty->index;
  631.   bgp_flag_unset (bgp, BGP_FLAG_ALWAYS_COMPARE_MED);
  632.   return CMD_SUCCESS;
  633. }
  634. /* "bgp deterministic-med" configuration. */
  635. DEFUN (bgp_deterministic_med,
  636.        bgp_deterministic_med_cmd,
  637.        "bgp deterministic-med",
  638.        "BGP specific commandsn"
  639.        "Pick the best-MED path among paths advertised from the neighboring ASn")
  640. {
  641.   struct bgp *bgp;
  642.   bgp = vty->index;
  643.   bgp_flag_set (bgp, BGP_FLAG_DETERMINISTIC_MED);
  644.   return CMD_SUCCESS;
  645. }
  646. DEFUN (no_bgp_deterministic_med,
  647.        no_bgp_deterministic_med_cmd,
  648.        "no bgp deterministic-med",
  649.        NO_STR
  650.        "BGP specific commandsn"
  651.        "Pick the best-MED path among paths advertised from the neighboring ASn")
  652. {
  653.   struct bgp *bgp;
  654.   bgp = vty->index;
  655.   bgp_flag_unset (bgp, BGP_FLAG_DETERMINISTIC_MED);
  656.   return CMD_SUCCESS;
  657. }
  658. /* "bgp graceful-restart" configuration. */
  659. DEFUN (bgp_graceful_restart,
  660.        bgp_graceful_restart_cmd,
  661.        "bgp graceful-restart",
  662.        "BGP specific commandsn"
  663.        "Graceful restart capability parametersn")
  664. {
  665.   struct bgp *bgp;
  666.   bgp = vty->index;
  667.   bgp_flag_set (bgp, BGP_FLAG_GRACEFUL_RESTART);
  668.   return CMD_SUCCESS;
  669. }
  670. DEFUN (no_bgp_graceful_restart,
  671.        no_bgp_graceful_restart_cmd,
  672.        "no bgp graceful-restart",
  673.        NO_STR
  674.        "BGP specific commandsn"
  675.        "Graceful restart capability parametersn")
  676. {
  677.   struct bgp *bgp;
  678.   bgp = vty->index;
  679.   bgp_flag_unset (bgp, BGP_FLAG_GRACEFUL_RESTART);
  680.   return CMD_SUCCESS;
  681. }
  682. DEFUN (bgp_graceful_restart_stalepath_time,
  683.        bgp_graceful_restart_stalepath_time_cmd,
  684.        "bgp graceful-restart stalepath-time <1-3600>",
  685.        "BGP specific commandsn"
  686.        "Graceful restart capability parametersn"
  687.        "Set the max time to hold onto restarting peer's stale pathsn"
  688.        "Delay value (seconds)n")
  689. {
  690.   struct bgp *bgp;
  691.   u_int32_t stalepath;
  692.   bgp = vty->index;
  693.   if (! bgp)
  694.     return CMD_WARNING;
  695.   VTY_GET_INTEGER_RANGE ("stalepath-time", stalepath, argv[0], 1, 3600);
  696.   bgp->stalepath_time = stalepath; 
  697.   return CMD_SUCCESS;
  698. }
  699. DEFUN (no_bgp_graceful_restart_stalepath_time,
  700.        no_bgp_graceful_restart_stalepath_time_cmd,
  701.        "no bgp graceful-restart stalepath-time",
  702.        NO_STR
  703.        "BGP specific commandsn"
  704.        "Graceful restart capability parametersn"
  705.        "Set the max time to hold onto restarting peer's stale pathsn")
  706. {
  707.   struct bgp *bgp;
  708.   bgp = vty->index;
  709.   if (! bgp)
  710.     return CMD_WARNING;
  711.   bgp->stalepath_time = BGP_DEFAULT_STALEPATH_TIME; 
  712.   return CMD_SUCCESS;
  713. }
  714. ALIAS (no_bgp_graceful_restart_stalepath_time,
  715.        no_bgp_graceful_restart_stalepath_time_val_cmd,
  716.        "no bgp graceful-restart stalepath-time <1-3600>",
  717.        NO_STR
  718.        "BGP specific commandsn"
  719.        "Graceful restart capability parametersn"
  720.        "Set the max time to hold onto restarting peer's stale pathsn"
  721.        "Delay value (seconds)n")
  722. /* "bgp fast-external-failover" configuration. */
  723. DEFUN (bgp_fast_external_failover,
  724.        bgp_fast_external_failover_cmd,
  725.        "bgp fast-external-failover",
  726.        BGP_STR
  727.        "Immediately reset session if a link to a directly connected external peer goes downn")
  728. {
  729.   struct bgp *bgp;
  730.   bgp = vty->index;
  731.   bgp_flag_unset (bgp, BGP_FLAG_NO_FAST_EXT_FAILOVER);
  732.   return CMD_SUCCESS;
  733. }
  734. DEFUN (no_bgp_fast_external_failover,
  735.        no_bgp_fast_external_failover_cmd,
  736.        "no bgp fast-external-failover",
  737.        NO_STR
  738.        BGP_STR
  739.        "Immediately reset session if a link to a directly connected external peer goes downn")
  740. {
  741.   struct bgp *bgp;
  742.   bgp = vty->index;
  743.   bgp_flag_set (bgp, BGP_FLAG_NO_FAST_EXT_FAILOVER);
  744.   return CMD_SUCCESS;
  745. }
  746. /* "bgp enforce-first-as" configuration. */
  747. DEFUN (bgp_enforce_first_as,
  748.        bgp_enforce_first_as_cmd,
  749.        "bgp enforce-first-as",
  750.        BGP_STR
  751.        "Enforce the first AS for EBGP routes(default)n")
  752. {
  753.   struct bgp *bgp;
  754.   bgp = vty->index;
  755.   bgp_flag_unset (bgp, BGP_FLAG_NO_ENFORCE_FIRST_AS);
  756.   return CMD_SUCCESS;
  757. }
  758. DEFUN (no_bgp_enforce_first_as,
  759.        no_bgp_enforce_first_as_cmd,
  760.        "no bgp enforce-first-as",
  761.        NO_STR
  762.        BGP_STR
  763.        "Enforce the first AS for EBGP routes(default)n")
  764. {
  765.   struct bgp *bgp;
  766.   bgp = vty->index;
  767.   bgp_flag_set (bgp, BGP_FLAG_NO_ENFORCE_FIRST_AS);
  768.   return CMD_SUCCESS;
  769. }
  770. /* "bgp bestpath compare-routerid" configuration.  */
  771. DEFUN (bgp_bestpath_compare_router_id,
  772.        bgp_bestpath_compare_router_id_cmd,
  773.        "bgp bestpath compare-routerid",
  774.        "BGP specific commandsn"
  775.        "Change the default bestpath selectionn"
  776.        "Compare router-id for identical EBGP pathsn")
  777. {
  778.   struct bgp *bgp;
  779.   bgp = vty->index;
  780.   bgp_flag_set (bgp, BGP_FLAG_COMPARE_ROUTER_ID);
  781.   return CMD_SUCCESS;
  782. }
  783. DEFUN (no_bgp_bestpath_compare_router_id,
  784.        no_bgp_bestpath_compare_router_id_cmd,
  785.        "no bgp bestpath compare-routerid",
  786.        NO_STR
  787.        "BGP specific commandsn"
  788.        "Change the default bestpath selectionn"
  789.        "Compare router-id for identical EBGP pathsn")
  790. {
  791.   struct bgp *bgp;
  792.   bgp = vty->index;
  793.   bgp_flag_unset (bgp, BGP_FLAG_COMPARE_ROUTER_ID);
  794.   return CMD_SUCCESS;
  795. }
  796. /* "bgp bestpath cost-community ignore" configuration.  */
  797. DEFUN (bgp_bestpath_cost_community_ignore,
  798.        bgp_bestpath_cost_community_ignore_cmd,
  799.        "bgp bestpath cost-community ignore",
  800.        "BGP specific commandsn"
  801.        "Change the default bestpath selectionn"
  802.        "cost communityn"
  803.        "Ignore cost communities in bestpath selectionn")
  804. {
  805.   struct bgp *bgp;
  806.   bgp = vty->index;
  807.   bgp_flag_set (bgp, BGP_FLAG_COST_COMMUNITY_IGNORE);
  808.   return CMD_SUCCESS;
  809. }
  810. DEFUN (no_bgp_bestpath_cost_community_ignore,
  811.        no_bgp_bestpath_cost_community_ignore_cmd,
  812.        "no bgp bestpath cost-community ignore",
  813.        NO_STR
  814.        "BGP specific commandsn"
  815.        "Change the default bestpath selectionn"
  816.        "cost communityn"
  817.        "Ignore cost communities in bestpath selectionn")
  818. {
  819.   struct bgp *bgp;
  820.   bgp = vty->index;
  821.   bgp_flag_unset (bgp, BGP_FLAG_COST_COMMUNITY_IGNORE);
  822.   return CMD_SUCCESS;
  823. }
  824. /* "bgp bestpath as-path ignore" configuration.  */
  825. DEFUN (bgp_bestpath_aspath_ignore,
  826.        bgp_bestpath_aspath_ignore_cmd,
  827.        "bgp bestpath as-path ignore",
  828.        "BGP specific commandsn"
  829.        "Change the default bestpath selectionn"
  830.        "AS-path attributen"
  831.        "Ignore as-path length in selecting a routen")
  832. {
  833.   struct bgp *bgp;
  834.   bgp = vty->index;
  835.   bgp_flag_set (bgp, BGP_FLAG_ASPATH_IGNORE);
  836.   return CMD_SUCCESS;
  837. }
  838. DEFUN (no_bgp_bestpath_aspath_ignore,
  839.        no_bgp_bestpath_aspath_ignore_cmd,
  840.        "no bgp bestpath as-path ignore",
  841.        NO_STR
  842.        "BGP specific commandsn"
  843.        "Change the default bestpath selectionn"
  844.        "AS-path attributen"
  845.        "Ignore as-path length in selecting a routen")
  846. {
  847.   struct bgp *bgp;
  848.   bgp = vty->index;
  849.   bgp_flag_unset (bgp, BGP_FLAG_ASPATH_IGNORE);
  850.   return CMD_SUCCESS;
  851. }
  852. /* "bgp log-neighbor-changes" configuration.  */
  853. DEFUN (bgp_log_neighbor_changes,
  854.        bgp_log_neighbor_changes_cmd,
  855.        "bgp log-neighbor-changes",
  856.        "BGP specific commandsn"
  857.        "Log neighbor up/down and reset reasonn")
  858. {
  859.   struct bgp *bgp;
  860.   bgp = vty->index;
  861.   bgp_flag_set (bgp, BGP_FLAG_LOG_NEIGHBOR_CHANGES);
  862.   return CMD_SUCCESS;
  863. }
  864. DEFUN (no_bgp_log_neighbor_changes,
  865.        no_bgp_log_neighbor_changes_cmd,
  866.        "no bgp log-neighbor-changes",
  867.        NO_STR
  868.        "BGP specific commandsn"
  869.        "Log neighbor up/down and reset reasonn")
  870. {
  871.   struct bgp *bgp;
  872.   bgp = vty->index;
  873.   bgp_flag_unset (bgp, BGP_FLAG_LOG_NEIGHBOR_CHANGES);
  874.   return CMD_SUCCESS;
  875. }
  876. /* "bgp bestpath med" configuration. */
  877. DEFUN (bgp_bestpath_med,
  878.        bgp_bestpath_med_cmd,
  879.        "bgp bestpath med (confed|missing-as-worst)",
  880.        "BGP specific commandsn"
  881.        "Change the default bestpath selectionn"
  882.        "MED attributen"
  883.        "Compare MED among confederation pathsn"
  884.        "Treat missing MED as the least preferred onen")
  885. {
  886.   struct bgp *bgp;
  887.   
  888.   bgp = vty->index;
  889.   if (strncmp (argv[0], "confed", 1) == 0)
  890.     bgp_flag_set (bgp, BGP_FLAG_MED_CONFED);
  891.   else
  892.     bgp_flag_set (bgp, BGP_FLAG_MED_MISSING_AS_WORST);
  893.   return CMD_SUCCESS;
  894. }
  895. DEFUN (bgp_bestpath_med2,
  896.        bgp_bestpath_med2_cmd,
  897.        "bgp bestpath med confed missing-as-worst",
  898.        "BGP specific commandsn"
  899.        "Change the default bestpath selectionn"
  900.        "MED attributen"
  901.        "Compare MED among confederation pathsn"
  902.        "Treat missing MED as the least preferred onen")
  903. {
  904.   struct bgp *bgp;
  905.   
  906.   bgp = vty->index;
  907.   bgp_flag_set (bgp, BGP_FLAG_MED_CONFED);
  908.   bgp_flag_set (bgp, BGP_FLAG_MED_MISSING_AS_WORST);
  909.   return CMD_SUCCESS;
  910. }
  911. ALIAS (bgp_bestpath_med2,
  912.        bgp_bestpath_med3_cmd,
  913.        "bgp bestpath med missing-as-worst confed",
  914.        "BGP specific commandsn"
  915.        "Change the default bestpath selectionn"
  916.        "MED attributen"
  917.        "Treat missing MED as the least preferred onen"
  918.        "Compare MED among confederation pathsn");
  919. DEFUN (no_bgp_bestpath_med,
  920.        no_bgp_bestpath_med_cmd,
  921.        "no bgp bestpath med (confed|missing-as-worst)",
  922.        NO_STR
  923.        "BGP specific commandsn"
  924.        "Change the default bestpath selectionn"
  925.        "MED attributen"
  926.        "Compare MED among confederation pathsn"
  927.        "Treat missing MED as the least preferred onen")
  928. {
  929.   struct bgp *bgp;
  930.   bgp = vty->index;
  931.   
  932.   if (strncmp (argv[0], "confed", 1) == 0)
  933.     bgp_flag_unset (bgp, BGP_FLAG_MED_CONFED);
  934.   else
  935.     bgp_flag_unset (bgp, BGP_FLAG_MED_MISSING_AS_WORST);
  936.   return CMD_SUCCESS;
  937. }
  938. DEFUN (no_bgp_bestpath_med2,
  939.        no_bgp_bestpath_med2_cmd,
  940.        "no bgp bestpath med confed missing-as-worst",
  941.        NO_STR
  942.        "BGP specific commandsn"
  943.        "Change the default bestpath selectionn"
  944.        "MED attributen"
  945.        "Compare MED among confederation pathsn"
  946.        "Treat missing MED as the least preferred onen")
  947. {
  948.   struct bgp *bgp;
  949.   
  950.   bgp = vty->index;
  951.   bgp_flag_unset (bgp, BGP_FLAG_MED_CONFED);
  952.   bgp_flag_unset (bgp, BGP_FLAG_MED_MISSING_AS_WORST);
  953.   return CMD_SUCCESS;
  954. }
  955. ALIAS (no_bgp_bestpath_med2,
  956.        no_bgp_bestpath_med3_cmd,
  957.        "no bgp bestpath med missing-as-worst confed",
  958.        NO_STR
  959.        "BGP specific commandsn"
  960.        "Change the default bestpath selectionn"
  961.        "MED attributen"
  962.        "Treat missing MED as the least preferred onen"
  963.        "Compare MED among confederation pathsn");
  964. /* "no bgp default ipv4-unicast". */
  965. DEFUN (no_bgp_default_ipv4_unicast,
  966.        no_bgp_default_ipv4_unicast_cmd,
  967.        "no bgp default ipv4-unicast",
  968.        NO_STR
  969.        "BGP specific commandsn"
  970.        "Configure BGP defaultsn"
  971.        "Activate ipv4-unicast for a peer by defaultn")
  972. {
  973.   struct bgp *bgp;
  974.   bgp = vty->index;
  975.   bgp_flag_set (bgp, BGP_FLAG_NO_DEFAULT_IPV4);
  976.   return CMD_SUCCESS;
  977. }
  978. DEFUN (bgp_default_ipv4_unicast,
  979.        bgp_default_ipv4_unicast_cmd,
  980.        "bgp default ipv4-unicast",
  981.        "BGP specific commandsn"
  982.        "Configure BGP defaultsn"
  983.        "Activate ipv4-unicast for a peer by defaultn")
  984. {
  985.   struct bgp *bgp;
  986.   bgp = vty->index;
  987.   bgp_flag_unset (bgp, BGP_FLAG_NO_DEFAULT_IPV4);
  988.   return CMD_SUCCESS;
  989. }
  990. /* "bgp import-check" configuration.  */
  991. DEFUN (bgp_network_import_check,
  992.        bgp_network_import_check_cmd,
  993.        "bgp network import-check",
  994.        "BGP specific commandsn"
  995.        "BGP network commandn"
  996.        "Check BGP network route exists in IGPn")
  997. {
  998.   struct bgp *bgp;
  999.   bgp = vty->index;
  1000.   bgp_flag_set (bgp, BGP_FLAG_IMPORT_CHECK);
  1001.   return CMD_SUCCESS;
  1002. }
  1003. DEFUN (no_bgp_network_import_check,
  1004.        no_bgp_network_import_check_cmd,
  1005.        "no bgp network import-check",
  1006.        NO_STR
  1007.        "BGP specific commandsn"
  1008.        "BGP network commandn"
  1009.        "Check BGP network route exists in IGPn")
  1010. {
  1011.   struct bgp *bgp;
  1012.   bgp = vty->index;
  1013.   bgp_flag_unset (bgp, BGP_FLAG_IMPORT_CHECK);
  1014.   return CMD_SUCCESS;
  1015. }
  1016. DEFUN (bgp_default_local_preference,
  1017.        bgp_default_local_preference_cmd,
  1018.        "bgp default local-preference <0-4294967295>",
  1019.        "BGP specific commandsn"
  1020.        "Configure BGP defaultsn"
  1021.        "local preference (higher=more preferred)n"
  1022.        "Configure default local preference valuen")
  1023. {
  1024.   struct bgp *bgp;
  1025.   u_int32_t local_pref;
  1026.   bgp = vty->index;
  1027.   VTY_GET_INTEGER ("local preference", local_pref, argv[0]);
  1028.   bgp_default_local_preference_set (bgp, local_pref);
  1029.   return CMD_SUCCESS;
  1030. }
  1031. DEFUN (no_bgp_default_local_preference,
  1032.        no_bgp_default_local_preference_cmd,
  1033.        "no bgp default local-preference",
  1034.        NO_STR
  1035.        "BGP specific commandsn"
  1036.        "Configure BGP defaultsn"
  1037.        "local preference (higher=more preferred)n")
  1038. {
  1039.   struct bgp *bgp;
  1040.   bgp = vty->index;
  1041.   bgp_default_local_preference_unset (bgp);
  1042.   return CMD_SUCCESS;
  1043. }
  1044. ALIAS (no_bgp_default_local_preference,
  1045.        no_bgp_default_local_preference_val_cmd,
  1046.        "no bgp default local-preference <0-4294967295>",
  1047.        NO_STR
  1048.        "BGP specific commandsn"
  1049.        "Configure BGP defaultsn"
  1050.        "local preference (higher=more preferred)n"
  1051.        "Configure default local preference valuen");
  1052. static int
  1053. peer_remote_as_vty (struct vty *vty, char *peer_str, char *as_str, afi_t afi,
  1054.     safi_t safi)
  1055. {
  1056.   int ret;
  1057.   struct bgp *bgp;
  1058.   as_t as;
  1059.   union sockunion su;
  1060.   bgp = vty->index;
  1061.   /* Get AS number.  */
  1062.   VTY_GET_INTEGER_RANGE ("AS", as, as_str, 1, 65535);
  1063.   /* If peer is peer group, call proper function.  */
  1064.   ret = str2sockunion (peer_str, &su);
  1065.   if (ret < 0)
  1066.     {
  1067.       ret = peer_group_remote_as (bgp, peer_str, &as);
  1068.       if (ret < 0)
  1069. {
  1070.   vty_out (vty, "%% Create the peer-group first%s", VTY_NEWLINE);
  1071.   return CMD_WARNING;
  1072. }
  1073.       return CMD_SUCCESS;
  1074.     }
  1075.   if (peer_address_self_check (&su))
  1076.     {
  1077.       vty_out (vty, "%% Can not configure the local system as neighbor%s",
  1078.        VTY_NEWLINE);
  1079.       return CMD_WARNING;
  1080.     }
  1081.   ret = peer_remote_as (bgp, &su, &as, afi, safi);
  1082.   /* This peer belongs to peer group.  */
  1083.   switch (ret)
  1084.     {
  1085.     case BGP_ERR_PEER_GROUP_MEMBER:
  1086.       vty_out (vty, "%% Peer-group AS %d. Cannot configure remote-as for member%s", as, VTY_NEWLINE);
  1087.       return CMD_WARNING;
  1088.       break;
  1089.     case BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT:
  1090.       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);
  1091.       return CMD_WARNING;
  1092.       break;
  1093.     }
  1094.   return bgp_vty_return (vty, ret);
  1095. }
  1096. DEFUN (neighbor_remote_as,
  1097.        neighbor_remote_as_cmd,
  1098.        NEIGHBOR_CMD2 "remote-as <1-65535>",
  1099.        NEIGHBOR_STR
  1100.        NEIGHBOR_ADDR_STR2
  1101.        "Specify a BGP neighborn"
  1102.        AS_STR)
  1103. {
  1104.   return peer_remote_as_vty (vty, argv[0], argv[1], AFI_IP, SAFI_UNICAST);
  1105. }
  1106. DEFUN (neighbor_peer_group,
  1107.        neighbor_peer_group_cmd,
  1108.        "neighbor WORD peer-group",
  1109.        NEIGHBOR_STR
  1110.        "Neighbor tagn"
  1111.        "Configure peer-groupn")
  1112. {
  1113.   struct bgp *bgp;
  1114.   struct peer_group *group;
  1115.   bgp = vty->index;
  1116.   group = peer_group_get (bgp, argv[0]);
  1117.   if (! group)
  1118.     return CMD_WARNING;
  1119.   return CMD_SUCCESS;
  1120. }
  1121. DEFUN (no_neighbor,
  1122.        no_neighbor_cmd,
  1123.        NO_NEIGHBOR_CMD2,
  1124.        NO_STR
  1125.        NEIGHBOR_STR
  1126.        NEIGHBOR_ADDR_STR2)
  1127. {
  1128.   int ret;
  1129.   union sockunion su;
  1130.   struct peer_group *group;
  1131.   struct peer *peer;
  1132.   ret = str2sockunion (argv[0], &su);
  1133.   if (ret < 0)
  1134.     {
  1135.       group = peer_group_lookup (vty->index, argv[0]);
  1136.       if (group)
  1137. peer_group_delete (group);
  1138.       else
  1139. {
  1140.   vty_out (vty, "%% Create the peer-group first%s", VTY_NEWLINE);
  1141.   return CMD_WARNING;
  1142. }
  1143.     }
  1144.   else
  1145.     {
  1146.       peer = peer_lookup (vty->index, &su);
  1147.       if (peer)
  1148. peer_delete (peer);
  1149.     }
  1150.   return CMD_SUCCESS;
  1151. }
  1152. ALIAS (no_neighbor,
  1153.        no_neighbor_remote_as_cmd,
  1154.        NO_NEIGHBOR_CMD "remote-as <1-65535>",
  1155.        NO_STR
  1156.        NEIGHBOR_STR
  1157.        NEIGHBOR_ADDR_STR
  1158.        "Specify a BGP neighborn"
  1159.        AS_STR);
  1160. DEFUN (no_neighbor_peer_group,
  1161.        no_neighbor_peer_group_cmd,
  1162.        "no neighbor WORD peer-group",
  1163.        NO_STR
  1164.        NEIGHBOR_STR
  1165.        "Neighbor tagn"
  1166.        "Configure peer-groupn")
  1167. {
  1168.   struct peer_group *group;
  1169.   group = peer_group_lookup (vty->index, argv[0]);
  1170.   if (group)
  1171.     peer_group_delete (group);
  1172.   else
  1173.     {
  1174.       vty_out (vty, "%% Create the peer-group first%s", VTY_NEWLINE);
  1175.       return CMD_WARNING;
  1176.     }
  1177.   return CMD_SUCCESS;
  1178. }
  1179. DEFUN (no_neighbor_peer_group_remote_as,
  1180.        no_neighbor_peer_group_remote_as_cmd,
  1181.        "no neighbor WORD remote-as <1-65535>",
  1182.        NO_STR
  1183.        NEIGHBOR_STR
  1184.        "Neighbor tagn"
  1185.        "Specify a BGP neighborn"
  1186.        AS_STR)
  1187. {
  1188.   struct peer_group *group;
  1189.   group = peer_group_lookup (vty->index, argv[0]);
  1190.   if (group)
  1191.     peer_group_remote_as_delete (group);
  1192.   else
  1193.     {
  1194.       vty_out (vty, "%% Create the peer-group first%s", VTY_NEWLINE);
  1195.       return CMD_WARNING;
  1196.     }
  1197.   return CMD_SUCCESS;
  1198. }
  1199. DEFUN (neighbor_local_as,
  1200.        neighbor_local_as_cmd,
  1201.        NEIGHBOR_CMD2 "local-as <1-65535>",
  1202.        NEIGHBOR_STR
  1203.        NEIGHBOR_ADDR_STR2
  1204.        "Specify a local-as numbern"
  1205.        "AS number used as local ASn")
  1206. {
  1207.   struct peer *peer;
  1208.   int ret;
  1209.   peer = peer_and_group_lookup_vty (vty, argv[0]);
  1210.   if (! peer)
  1211.     return CMD_WARNING;
  1212.   ret = peer_local_as_set (peer, atoi (argv[1]), 0);
  1213.   return bgp_vty_return (vty, ret);
  1214. }
  1215. DEFUN (neighbor_local_as_no_prepend,
  1216.        neighbor_local_as_no_prepend_cmd,
  1217.        NEIGHBOR_CMD2 "local-as <1-65535> no-prepend",
  1218.        NEIGHBOR_STR
  1219.        NEIGHBOR_ADDR_STR2
  1220.        "Specify a local-as numbern"
  1221.        "AS number used as local ASn"
  1222.        "Do not prepend local-as to updates from ebgp peersn")
  1223. {
  1224.   struct peer *peer;
  1225.   int ret;
  1226.   peer = peer_and_group_lookup_vty (vty, argv[0]);
  1227.   if (! peer)
  1228.     return CMD_WARNING;
  1229.   ret = peer_local_as_set (peer, atoi (argv[1]), 1);
  1230.   return bgp_vty_return (vty, ret);
  1231. }
  1232. DEFUN (no_neighbor_local_as,
  1233.        no_neighbor_local_as_cmd,
  1234.        NO_NEIGHBOR_CMD2 "local-as",
  1235.        NO_STR
  1236.        NEIGHBOR_STR
  1237.        NEIGHBOR_ADDR_STR2
  1238.        "Specify a local-as numbern")
  1239. {
  1240.   struct peer *peer;
  1241.   int ret;
  1242.   peer = peer_and_group_lookup_vty (vty, argv[0]);
  1243.   if (! peer)
  1244.     return CMD_WARNING;
  1245.   ret = peer_local_as_unset (peer);
  1246.   return bgp_vty_return (vty, ret);
  1247. }
  1248. ALIAS (no_neighbor_local_as,
  1249.        no_neighbor_local_as_val_cmd,
  1250.        NO_NEIGHBOR_CMD2 "local-as <1-65535>",
  1251.        NO_STR
  1252.        NEIGHBOR_STR
  1253.        NEIGHBOR_ADDR_STR2
  1254.        "Specify a local-as numbern"
  1255.        "AS number used as local ASn");
  1256. ALIAS (no_neighbor_local_as,
  1257.        no_neighbor_local_as_val2_cmd,
  1258.        NO_NEIGHBOR_CMD2 "local-as <1-65535> no-prepend",
  1259.        NO_STR
  1260.        NEIGHBOR_STR
  1261.        NEIGHBOR_ADDR_STR2
  1262.        "Specify a local-as numbern"
  1263.        "AS number used as local ASn"
  1264.        "Do not prepend local-as to updates from ebgp peersn");
  1265. #ifdef HAVE_TCP_SIGNATURE
  1266. DEFUN (neighbor_password,
  1267.        neighbor_password_cmd,
  1268.        NEIGHBOR_CMD2 "password LINE",
  1269.        NEIGHBOR_STR
  1270.        NEIGHBOR_ADDR_STR2
  1271.        "Set a passwordn"
  1272.        "The passwordn")
  1273. {
  1274.   struct peer *peer;
  1275.   int ret;
  1276.   peer = peer_and_group_lookup_vty (vty, argv[0]);
  1277.   if (! peer)
  1278.     return CMD_WARNING;
  1279.   ret = peer_password_set (peer, argv[1]);
  1280.   return bgp_vty_return (vty, ret);
  1281. }
  1282. DEFUN (no_neighbor_password,
  1283.        no_neighbor_password_cmd,
  1284.        NO_NEIGHBOR_CMD2 "password",
  1285.        NO_STR
  1286.        NEIGHBOR_STR
  1287.        NEIGHBOR_ADDR_STR2
  1288.        "Set a passwordn")
  1289. {
  1290.   struct peer *peer;
  1291.   int ret;
  1292.   peer = peer_and_group_lookup_vty (vty, argv[0]);
  1293.   if (! peer)
  1294.     return CMD_WARNING;
  1295.   ret = peer_password_unset (peer);
  1296.   return bgp_vty_return (vty, ret);
  1297. }
  1298. #endif /* HAVE_TCP_SIGNATURE */
  1299. DEFUN (neighbor_activate,
  1300.        neighbor_activate_cmd,
  1301.        NEIGHBOR_CMD2 "activate",
  1302.        NEIGHBOR_STR
  1303.        NEIGHBOR_ADDR_STR2
  1304.        "Enable the Address Family for this Neighborn")
  1305. {
  1306.   struct peer *peer;
  1307.   peer = peer_and_group_lookup_vty (vty, argv[0]);
  1308.   if (! peer)
  1309.     return CMD_WARNING;
  1310.   peer_activate (peer, bgp_node_afi (vty), bgp_node_safi (vty));
  1311.   return CMD_SUCCESS;
  1312. }
  1313. DEFUN (no_neighbor_activate,
  1314.        no_neighbor_activate_cmd,
  1315.        NO_NEIGHBOR_CMD2 "activate",
  1316.        NO_STR
  1317.        NEIGHBOR_STR
  1318.        NEIGHBOR_ADDR_STR2
  1319.        "Enable the Address Family for this Neighborn")
  1320. {
  1321.   int ret;
  1322.   struct peer *peer;
  1323.   /* Lookup peer. */
  1324.   peer = peer_and_group_lookup_vty (vty, argv[0]);
  1325.   if (! peer)
  1326.     return CMD_WARNING;
  1327.   ret = peer_deactivate (peer, bgp_node_afi (vty), bgp_node_safi (vty));
  1328.   return bgp_vty_return (vty, ret);
  1329. }
  1330. DEFUN (neighbor_set_peer_group,
  1331.        neighbor_set_peer_group_cmd,
  1332.        NEIGHBOR_CMD "peer-group WORD",
  1333.        NEIGHBOR_STR
  1334.        NEIGHBOR_ADDR_STR
  1335.        "Member of the peer-groupn"
  1336.        "peer-group namen")
  1337. {
  1338.   int ret;
  1339.   as_t as;
  1340.   union sockunion su;
  1341.   struct bgp *bgp;
  1342.   struct peer_group *group;
  1343.   bgp = vty->index;
  1344.   ret = str2sockunion (argv[0], &su);
  1345.   if (ret < 0)
  1346.     {
  1347.       vty_out (vty, "%% Malformed address: %s%s", argv[0], VTY_NEWLINE);
  1348.       return CMD_WARNING;
  1349.     }
  1350.   group = peer_group_lookup (bgp, argv[1]);
  1351.   if (! group)
  1352.     {
  1353.       vty_out (vty, "%% Configure the peer-group first%s", VTY_NEWLINE);
  1354.       return CMD_WARNING;
  1355.     }
  1356.   if (peer_address_self_check (&su))
  1357.     {
  1358.       vty_out (vty, "%% Can not configure the local system as neighbor%s",
  1359.        VTY_NEWLINE);
  1360.       return CMD_WARNING;
  1361.     }
  1362.   ret = peer_group_bind (bgp, &su, group, bgp_node_afi (vty), 
  1363.  bgp_node_safi (vty), &as);
  1364.   if (ret == BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT)
  1365.     {
  1366.       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);
  1367.       return CMD_WARNING;
  1368.     }
  1369.   return bgp_vty_return (vty, ret);
  1370. }
  1371. DEFUN (no_neighbor_set_peer_group,
  1372.        no_neighbor_set_peer_group_cmd,
  1373.        NO_NEIGHBOR_CMD "peer-group WORD",
  1374.        NO_STR
  1375.        NEIGHBOR_STR
  1376.        NEIGHBOR_ADDR_STR
  1377.        "Member of the peer-groupn"
  1378.        "peer-group namen")
  1379. {
  1380.   int ret;
  1381.   struct bgp *bgp;
  1382.   struct peer *peer;
  1383.   struct peer_group *group;
  1384.   bgp = vty->index;
  1385.   peer = peer_lookup_vty (vty, argv[0]);
  1386.   if (! peer)
  1387.     return CMD_WARNING;
  1388.   group = peer_group_lookup (bgp, argv[1]);
  1389.   if (! group)
  1390.     {
  1391.       vty_out (vty, "%% Configure the peer-group first%s", VTY_NEWLINE);
  1392.       return CMD_WARNING;
  1393.     }
  1394.   ret = peer_group_unbind (bgp, peer, group, bgp_node_afi (vty),
  1395.    bgp_node_safi (vty));
  1396.   return bgp_vty_return (vty, ret);
  1397. }
  1398. int
  1399. peer_flag_modify_vty (struct vty *vty, char *ip_str, u_int16_t flag, int set)
  1400. {
  1401.   int ret;
  1402.   struct peer *peer;
  1403.   peer = peer_and_group_lookup_vty (vty, ip_str);
  1404.   if (! peer)
  1405.     return CMD_WARNING;
  1406.   if (set)
  1407.     ret = peer_flag_set (peer, flag);
  1408.   else
  1409.     ret = peer_flag_unset (peer, flag);
  1410.   return bgp_vty_return (vty, ret);
  1411. }
  1412. int
  1413. peer_flag_set_vty (struct vty *vty, char *ip_str, u_int16_t flag)
  1414. {
  1415.   return peer_flag_modify_vty (vty, ip_str, flag, 1);
  1416. }
  1417. int
  1418. peer_flag_unset_vty (struct vty *vty, char *ip_str, u_int16_t flag)
  1419. {
  1420.   return peer_flag_modify_vty (vty, ip_str, flag, 0);
  1421. }
  1422. /* neighbor trasport connection-mode. */
  1423. DEFUN (neighbor_transport_connection_mode,
  1424.        neighbor_transport_connection_mode_cmd,
  1425.        NEIGHBOR_CMD2 "transport connection-mode (active|passive)",
  1426.        NEIGHBOR_STR
  1427.        NEIGHBOR_ADDR_STR2
  1428.        "Transport optionsn"
  1429.        "Specify passive or active connectionn"
  1430.        "Actively establish the TCP sessionn"
  1431.        "Passively establish the TCP sessionn")
  1432. {
  1433.   int ret;
  1434.   if (strncmp (argv[1], "a", 1) == 0)
  1435.     {
  1436.       ret = peer_flag_unset_vty (vty, argv[0], PEER_FLAG_CONNECT_MODE_PASSIVE);
  1437.       if (ret == CMD_SUCCESS)
  1438.         return peer_flag_set_vty (vty, argv[0], PEER_FLAG_CONNECT_MODE_ACTIVE);
  1439.       else
  1440.         return CMD_WARNING;
  1441.     }
  1442.   else if (strncmp (argv[1], "p", 1) == 0)
  1443.     {
  1444.       ret = peer_flag_unset_vty (vty, argv[0], PEER_FLAG_CONNECT_MODE_ACTIVE);
  1445.       if (ret == CMD_SUCCESS)
  1446.         return peer_flag_set_vty (vty, argv[0], PEER_FLAG_CONNECT_MODE_PASSIVE);
  1447.       else
  1448.         return CMD_WARNING;
  1449.     }
  1450.   else
  1451.     return CMD_WARNING;
  1452. }
  1453. DEFUN (no_neighbor_transport_connection_mode,
  1454.        no_neighbor_transport_connection_mode_cmd,
  1455.        NO_NEIGHBOR_CMD2 "transport connection-mode",
  1456.        NO_STR
  1457.        NEIGHBOR_STR
  1458.        NEIGHBOR_ADDR_STR2
  1459.        "Transport optionsn"
  1460.        "Specify passive or active connectionn")
  1461. {
  1462.   int ret;
  1463.   ret = peer_flag_unset_vty (vty, argv[0], PEER_FLAG_CONNECT_MODE_PASSIVE);
  1464.   if (ret == CMD_SUCCESS)
  1465.     return peer_flag_unset_vty (vty, argv[0], PEER_FLAG_CONNECT_MODE_ACTIVE);
  1466.   else
  1467.     return CMD_WARNING;
  1468. }
  1469. ALIAS (no_neighbor_transport_connection_mode,
  1470.        no_neighbor_transport_connection_mode_val_cmd,
  1471.        NO_NEIGHBOR_CMD2 "transport connection-mode (active|passive)",
  1472.        NO_STR
  1473.        NEIGHBOR_STR
  1474.        NEIGHBOR_ADDR_STR2
  1475.        "Transport optionsn"
  1476.        "Specify passive or active connectionn"
  1477.        "Actively establish the TCP sessionn"
  1478.        "Passively establish the TCP sessionn")
  1479. DEFUN (neighbor_passive,
  1480.        neighbor_passive_cmd,
  1481.        NEIGHBOR_CMD2 "passive",
  1482.        NEIGHBOR_STR
  1483.        NEIGHBOR_ADDR_STR2
  1484.        "Don't send open messages to this neighborn")
  1485. {
  1486.   int ret;
  1487.   ret = peer_flag_unset_vty (vty, argv[0], PEER_FLAG_CONNECT_MODE_ACTIVE);
  1488.   if (ret == CMD_SUCCESS)
  1489.     return peer_flag_set_vty (vty, argv[0], PEER_FLAG_CONNECT_MODE_PASSIVE);
  1490.   else
  1491.     return CMD_WARNING;
  1492. }
  1493. /* neighbor shutdown. */
  1494. DEFUN (neighbor_shutdown,
  1495.        neighbor_shutdown_cmd,
  1496.        NEIGHBOR_CMD2 "shutdown",
  1497.        NEIGHBOR_STR
  1498.        NEIGHBOR_ADDR_STR2
  1499.        "Administratively shut down this neighborn")
  1500. {
  1501.   return peer_flag_set_vty (vty, argv[0], PEER_FLAG_SHUTDOWN);
  1502. }
  1503. DEFUN (no_neighbor_shutdown,
  1504.        no_neighbor_shutdown_cmd,
  1505.        NO_NEIGHBOR_CMD2 "shutdown",
  1506.        NO_STR
  1507.        NEIGHBOR_STR
  1508.        NEIGHBOR_ADDR_STR2
  1509.        "Administratively shut down this neighborn")
  1510. {
  1511.   return peer_flag_unset_vty (vty, argv[0], PEER_FLAG_SHUTDOWN);
  1512. }
  1513. /* neighbor capability dynamic. */
  1514. DEFUN (neighbor_capability_dynamic,
  1515.        neighbor_capability_dynamic_cmd,
  1516.        NEIGHBOR_CMD2 "capability dynamic",
  1517.        NEIGHBOR_STR
  1518.        NEIGHBOR_ADDR_STR2
  1519.        "Advertise capability to the peern"
  1520.        "Advertise dynamic capability to this neighborn")
  1521. {
  1522.   return peer_flag_set_vty (vty, argv[0], PEER_FLAG_DYNAMIC_CAPABILITY);
  1523. }
  1524. DEFUN (no_neighbor_capability_dynamic,
  1525.        no_neighbor_capability_dynamic_cmd,
  1526.        NO_NEIGHBOR_CMD2 "capability dynamic",
  1527.        NO_STR
  1528.        NEIGHBOR_STR
  1529.        NEIGHBOR_ADDR_STR2
  1530.        "Advertise capability to the peern"
  1531.        "Advertise dynamic capability to this neighborn")
  1532. {
  1533.   return peer_flag_unset_vty (vty, argv[0], PEER_FLAG_DYNAMIC_CAPABILITY);
  1534. }
  1535. /* neighbor dont-capability-negotiate */
  1536. DEFUN (neighbor_dont_capability_negotiate,
  1537.        neighbor_dont_capability_negotiate_cmd,
  1538.        NEIGHBOR_CMD2 "dont-capability-negotiate",
  1539.        NEIGHBOR_STR
  1540.        NEIGHBOR_ADDR_STR2
  1541.        "Do not perform capability negotiationn")
  1542. {
  1543.   return peer_flag_set_vty (vty, argv[0], PEER_FLAG_DONT_CAPABILITY);
  1544. }
  1545. DEFUN (no_neighbor_dont_capability_negotiate,
  1546.        no_neighbor_dont_capability_negotiate_cmd,
  1547.        NO_NEIGHBOR_CMD2 "dont-capability-negotiate",
  1548.        NO_STR
  1549.        NEIGHBOR_STR
  1550.        NEIGHBOR_ADDR_STR2
  1551.        "Do not perform capability negotiationn")
  1552. {
  1553.   return peer_flag_unset_vty (vty, argv[0], PEER_FLAG_DONT_CAPABILITY);
  1554. }
  1555. int
  1556. peer_af_flag_modify_vty (struct vty *vty, char *peer_str, afi_t afi,
  1557.  safi_t safi, u_int16_t flag, int set)
  1558. {
  1559.   int ret;
  1560.   struct peer *peer;
  1561.   peer = peer_and_group_lookup_vty (vty, peer_str);
  1562.   if (! peer)
  1563.     return CMD_WARNING;
  1564.   if (set)
  1565.     ret = peer_af_flag_set (peer, afi, safi, flag);
  1566.   else
  1567.     ret = peer_af_flag_unset (peer, afi, safi, flag);
  1568.   return bgp_vty_return (vty, ret);
  1569. }
  1570. int
  1571. peer_af_flag_set_vty (struct vty *vty, char *peer_str, afi_t afi,
  1572.       safi_t safi, u_int16_t flag)
  1573. {
  1574.   return peer_af_flag_modify_vty (vty, peer_str, afi, safi, flag, 1);
  1575. }
  1576. int
  1577. peer_af_flag_unset_vty (struct vty *vty, char *peer_str, afi_t afi,
  1578. safi_t safi, u_int16_t flag)
  1579. {
  1580.   return peer_af_flag_modify_vty (vty, peer_str, afi, safi, flag, 0);
  1581. }
  1582. /* neighbor capability orf prefix-list. */
  1583. DEFUN (neighbor_capability_orf_prefix,
  1584.        neighbor_capability_orf_prefix_cmd,
  1585.        NEIGHBOR_CMD2 "capability orf prefix-list (both|send|receive)",
  1586.        NEIGHBOR_STR
  1587.        NEIGHBOR_ADDR_STR2
  1588.        "Advertise capability to the peern"
  1589.        "Advertise ORF capability to the peern"
  1590.        "Advertise prefixlist ORF capability to this neighborn"
  1591.        "Capability to SEND and RECEIVE the ORF to/from this neighborn"
  1592.        "Capability to RECEIVE the ORF from this neighborn"
  1593.        "Capability to SEND the ORF to this neighborn")
  1594. {
  1595.   u_int16_t flag = 0;
  1596.   if (strncmp (argv[1], "s", 1) == 0)
  1597.     flag = PEER_FLAG_ORF_PREFIX_SM;
  1598.   else if (strncmp (argv[1], "r", 1) == 0)
  1599.     flag = PEER_FLAG_ORF_PREFIX_RM;
  1600.   else if (strncmp (argv[1], "b", 1) == 0)
  1601.     flag = PEER_FLAG_ORF_PREFIX_SM|PEER_FLAG_ORF_PREFIX_RM;
  1602.   else
  1603.     return CMD_WARNING;
  1604.   return peer_af_flag_set_vty (vty, argv[0], bgp_node_afi (vty),
  1605.        bgp_node_safi (vty), flag);
  1606. }
  1607. DEFUN (no_neighbor_capability_orf_prefix,
  1608.        no_neighbor_capability_orf_prefix_cmd,
  1609.        NO_NEIGHBOR_CMD2 "capability orf prefix-list (both|send|receive)",
  1610.        NO_STR
  1611.        NEIGHBOR_STR
  1612.        NEIGHBOR_ADDR_STR2
  1613.        "Advertise capability to the peern"
  1614.        "Advertise ORF capability to the peern"
  1615.        "Advertise prefixlist ORF capability to this neighborn"
  1616.        "Capability to SEND and RECEIVE the ORF to/from this neighborn"
  1617.        "Capability to RECEIVE the ORF from this neighborn"
  1618.        "Capability to SEND the ORF to this neighborn")
  1619. {
  1620.   u_int16_t flag = 0;
  1621.   if (strncmp (argv[1], "s", 1) == 0)
  1622.     flag = PEER_FLAG_ORF_PREFIX_SM;
  1623.   else if (strncmp (argv[1], "r", 1) == 0)
  1624.     flag = PEER_FLAG_ORF_PREFIX_RM;
  1625.   else if (strncmp (argv[1], "b", 1) == 0)
  1626.     flag = PEER_FLAG_ORF_PREFIX_SM|PEER_FLAG_ORF_PREFIX_RM;
  1627.   else
  1628.     return CMD_WARNING;
  1629.   return peer_af_flag_unset_vty (vty, argv[0], bgp_node_afi (vty),
  1630.  bgp_node_safi (vty), flag);
  1631. }
  1632. /* neighbor next-hop-self. */
  1633. DEFUN (neighbor_nexthop_self,
  1634.        neighbor_nexthop_self_cmd,
  1635.        NEIGHBOR_CMD2 "next-hop-self",
  1636.        NEIGHBOR_STR
  1637.        NEIGHBOR_ADDR_STR2
  1638.        "Disable the next hop calculation for this neighborn")
  1639. {
  1640.   return peer_af_flag_set_vty (vty, argv[0], bgp_node_afi (vty),
  1641.        bgp_node_safi (vty), PEER_FLAG_NEXTHOP_SELF);
  1642. }
  1643. DEFUN (no_neighbor_nexthop_self,
  1644.        no_neighbor_nexthop_self_cmd,
  1645.        NO_NEIGHBOR_CMD2 "next-hop-self",
  1646.        NO_STR
  1647.        NEIGHBOR_STR
  1648.        NEIGHBOR_ADDR_STR2
  1649.        "Disable the next hop calculation for this neighborn")
  1650. {
  1651.   return peer_af_flag_unset_vty (vty, argv[0], bgp_node_afi (vty),
  1652.  bgp_node_safi (vty), PEER_FLAG_NEXTHOP_SELF);
  1653. }
  1654. /* neighbor remove-private-AS. */
  1655. DEFUN (neighbor_remove_private_as,
  1656.        neighbor_remove_private_as_cmd,
  1657.        NEIGHBOR_CMD2 "remove-private-AS",
  1658.        NEIGHBOR_STR
  1659.        NEIGHBOR_ADDR_STR2
  1660.        "Remove private AS number from outbound updatesn")
  1661. {
  1662.   return peer_af_flag_set_vty (vty, argv[0], bgp_node_afi (vty),
  1663.        bgp_node_safi (vty),
  1664.        PEER_FLAG_REMOVE_PRIVATE_AS);
  1665. }
  1666. DEFUN (no_neighbor_remove_private_as,
  1667.        no_neighbor_remove_private_as_cmd,
  1668.        NO_NEIGHBOR_CMD2 "remove-private-AS",
  1669.        NO_STR
  1670.        NEIGHBOR_STR
  1671.        NEIGHBOR_ADDR_STR2
  1672.        "Remove private AS number from outbound updatesn")
  1673. {
  1674.   return peer_af_flag_unset_vty (vty, argv[0], bgp_node_afi (vty),
  1675.  bgp_node_safi (vty),
  1676.  PEER_FLAG_REMOVE_PRIVATE_AS);
  1677. }
  1678. /* neighbor send-community. */
  1679. DEFUN (neighbor_send_community,
  1680.        neighbor_send_community_cmd,
  1681.        NEIGHBOR_CMD2 "send-community",
  1682.        NEIGHBOR_STR
  1683.        NEIGHBOR_ADDR_STR2
  1684.        "Send Community attribute to this neighborn")
  1685. {
  1686.   return peer_af_flag_set_vty (vty, argv[0], bgp_node_afi (vty),
  1687.        bgp_node_safi (vty),
  1688.        PEER_FLAG_SEND_COMMUNITY);
  1689. }
  1690. DEFUN (no_neighbor_send_community,
  1691.        no_neighbor_send_community_cmd,
  1692.        NO_NEIGHBOR_CMD2 "send-community",
  1693.        NO_STR
  1694.        NEIGHBOR_STR
  1695.        NEIGHBOR_ADDR_STR2
  1696.        "Send Community attribute to this neighborn")
  1697. {
  1698.   return peer_af_flag_unset_vty (vty, argv[0], bgp_node_afi (vty),
  1699.  bgp_node_safi (vty),
  1700.  PEER_FLAG_SEND_COMMUNITY);
  1701. }
  1702. /* neighbor send-community extended. */
  1703. DEFUN (neighbor_send_community_type,
  1704.        neighbor_send_community_type_cmd,
  1705.        NEIGHBOR_CMD2 "send-community (both|extended|standard)",
  1706.        NEIGHBOR_STR
  1707.        NEIGHBOR_ADDR_STR2
  1708.        "Send Community attribute to this neighborn"
  1709.        "Send Standard and Extended Community attributesn"
  1710.        "Send Extended Community attributesn"
  1711.        "Send Standard Community attributesn")
  1712. {
  1713.   if (strncmp (argv[1], "s", 1) == 0)
  1714.     return peer_af_flag_set_vty (vty, argv[0], bgp_node_afi (vty),
  1715.  bgp_node_safi (vty),
  1716.  PEER_FLAG_SEND_COMMUNITY);
  1717.   if (strncmp (argv[1], "e", 1) == 0)
  1718.     return peer_af_flag_set_vty (vty, argv[0], bgp_node_afi (vty),
  1719.  bgp_node_safi (vty),
  1720.  PEER_FLAG_SEND_EXT_COMMUNITY);
  1721.   return peer_af_flag_set_vty (vty, argv[0], bgp_node_afi (vty),
  1722.        bgp_node_safi (vty),
  1723.        (PEER_FLAG_SEND_COMMUNITY|
  1724. PEER_FLAG_SEND_EXT_COMMUNITY));
  1725. }
  1726. DEFUN (no_neighbor_send_community_type,
  1727.        no_neighbor_send_community_type_cmd,
  1728.        NO_NEIGHBOR_CMD2 "send-community (both|extended|standard)",
  1729.        NO_STR
  1730.        NEIGHBOR_STR
  1731.        NEIGHBOR_ADDR_STR2
  1732.        "Send Community attribute to this neighborn"
  1733.        "Send Standard and Extended Community attributesn"
  1734.        "Send Extended Community attributesn"
  1735.        "Send Standard Community attributesn")
  1736. {
  1737.   if (strncmp (argv[1], "s", 1) == 0)
  1738.     return peer_af_flag_unset_vty (vty, argv[0], bgp_node_afi (vty),
  1739.    bgp_node_safi (vty),
  1740.    PEER_FLAG_SEND_COMMUNITY);
  1741.   if (strncmp (argv[1], "e", 1) == 0)
  1742.     return peer_af_flag_unset_vty (vty, argv[0], bgp_node_afi (vty),
  1743.    bgp_node_safi (vty),
  1744.    PEER_FLAG_SEND_EXT_COMMUNITY);
  1745.   return peer_af_flag_unset_vty (vty, argv[0], bgp_node_afi (vty),
  1746.  bgp_node_safi (vty),
  1747.  (PEER_FLAG_SEND_COMMUNITY |
  1748.   PEER_FLAG_SEND_EXT_COMMUNITY));
  1749. }
  1750. /* neighbor soft-reconfig. */
  1751. DEFUN (neighbor_soft_reconfiguration,
  1752.        neighbor_soft_reconfiguration_cmd,
  1753.        NEIGHBOR_CMD2 "soft-reconfiguration inbound",
  1754.        NEIGHBOR_STR
  1755.        NEIGHBOR_ADDR_STR2
  1756.        "Per neighbor soft reconfigurationn"
  1757.        "Allow inbound soft reconfiguration for this neighborn")
  1758. {
  1759.   return peer_af_flag_set_vty (vty, argv[0],
  1760.        bgp_node_afi (vty), bgp_node_safi (vty),
  1761.        PEER_FLAG_SOFT_RECONFIG);
  1762. }
  1763. DEFUN (no_neighbor_soft_reconfiguration,
  1764.        no_neighbor_soft_reconfiguration_cmd,
  1765.        NO_NEIGHBOR_CMD2 "soft-reconfiguration inbound",
  1766.        NO_STR
  1767.        NEIGHBOR_STR
  1768.        NEIGHBOR_ADDR_STR2
  1769.        "Per neighbor soft reconfigurationn"
  1770.        "Allow inbound soft reconfiguration for this neighborn")
  1771. {
  1772.   return peer_af_flag_unset_vty (vty, argv[0],
  1773.  bgp_node_afi (vty), bgp_node_safi (vty),
  1774.  PEER_FLAG_SOFT_RECONFIG);
  1775. }
  1776. DEFUN (neighbor_route_reflector_client,
  1777.        neighbor_route_reflector_client_cmd,
  1778.        NEIGHBOR_CMD2 "route-reflector-client",
  1779.        NEIGHBOR_STR
  1780.        NEIGHBOR_ADDR_STR2
  1781.        "Configure a neighbor as Route Reflector clientn")
  1782. {
  1783.   struct peer *peer;
  1784.   peer = peer_and_group_lookup_vty (vty, argv[0]);
  1785.   if (! peer)
  1786.     return CMD_WARNING;
  1787.   return peer_af_flag_set_vty (vty, argv[0], bgp_node_afi (vty),
  1788.        bgp_node_safi (vty),
  1789.        PEER_FLAG_REFLECTOR_CLIENT);
  1790. }
  1791. DEFUN (no_neighbor_route_reflector_client,
  1792.        no_neighbor_route_reflector_client_cmd,
  1793.        NO_NEIGHBOR_CMD2 "route-reflector-client",
  1794.        NO_STR
  1795.        NEIGHBOR_STR
  1796.        NEIGHBOR_ADDR_STR2
  1797.        "Configure a neighbor as Route Reflector clientn")
  1798. {
  1799.   return peer_af_flag_unset_vty (vty, argv[0], bgp_node_afi (vty),
  1800.  bgp_node_safi (vty),
  1801.  PEER_FLAG_REFLECTOR_CLIENT);
  1802. }
  1803. /* neighbor route-server-client. */
  1804. DEFUN (neighbor_route_server_client,
  1805.        neighbor_route_server_client_cmd,
  1806.        NEIGHBOR_CMD2 "route-server-client",
  1807.        NEIGHBOR_STR
  1808.        NEIGHBOR_ADDR_STR2
  1809.        "Configure a neighbor as Route Server clientn")
  1810. {
  1811.   return peer_af_flag_set_vty (vty, argv[0], bgp_node_afi (vty),
  1812.        bgp_node_safi (vty),
  1813.        PEER_FLAG_RSERVER_CLIENT);
  1814. }
  1815. DEFUN (no_neighbor_route_server_client,
  1816.        no_neighbor_route_server_client_cmd,
  1817.        NO_NEIGHBOR_CMD2 "route-server-client",
  1818.        NO_STR
  1819.        NEIGHBOR_STR
  1820.        NEIGHBOR_ADDR_STR2
  1821.        "Configure a neighbor as Route Server clientn")
  1822. {
  1823.   return peer_af_flag_unset_vty (vty, argv[0], bgp_node_afi (vty),
  1824.  bgp_node_safi (vty),
  1825.  PEER_FLAG_RSERVER_CLIENT);
  1826. }
  1827. DEFUN (neighbor_attr_unchanged,
  1828.        neighbor_attr_unchanged_cmd,
  1829.        NEIGHBOR_CMD2 "attribute-unchanged",
  1830.        NEIGHBOR_STR
  1831.        NEIGHBOR_ADDR_STR2
  1832.        "BGP attribute is propagated unchanged to this neighborn")
  1833. {
  1834.   return peer_af_flag_set_vty (vty, argv[0], bgp_node_afi (vty),
  1835.        bgp_node_safi (vty),
  1836.        (PEER_FLAG_AS_PATH_UNCHANGED |
  1837. PEER_FLAG_NEXTHOP_UNCHANGED |
  1838. PEER_FLAG_MED_UNCHANGED));
  1839. }
  1840. DEFUN (neighbor_attr_unchanged1,
  1841.        neighbor_attr_unchanged1_cmd,
  1842.        NEIGHBOR_CMD2 "attribute-unchanged (as-path|next-hop|med)",
  1843.        NEIGHBOR_STR
  1844.        NEIGHBOR_ADDR_STR2
  1845.        "BGP attribute is propagated unchanged to this neighborn"
  1846.        "As-path attributen"
  1847.        "Nexthop attributen"
  1848.        "Med attributen")
  1849. {
  1850.   u_int16_t flags = 0;
  1851.   if (strncmp (argv[1], "as-path", 1) == 0)
  1852.     SET_FLAG (flags, PEER_FLAG_AS_PATH_UNCHANGED);
  1853.   else if (strncmp (argv[1], "next-hop", 1) == 0)
  1854.     SET_FLAG (flags, PEER_FLAG_NEXTHOP_UNCHANGED);
  1855.   else if (strncmp (argv[1], "med", 1) == 0)
  1856.     SET_FLAG (flags, PEER_FLAG_MED_UNCHANGED);
  1857.   return peer_af_flag_set_vty (vty, argv[0], bgp_node_afi (vty),
  1858.        bgp_node_safi (vty), flags);
  1859. }
  1860. DEFUN (neighbor_attr_unchanged2,
  1861.        neighbor_attr_unchanged2_cmd,
  1862.        NEIGHBOR_CMD2 "attribute-unchanged as-path (next-hop|med)",
  1863.        NEIGHBOR_STR
  1864.        NEIGHBOR_ADDR_STR2
  1865.        "BGP attribute is propagated unchanged to this neighborn"
  1866.        "As-path attributen"
  1867.        "Nexthop attributen"
  1868.        "Med attributen")
  1869. {
  1870.   u_int16_t flags = PEER_FLAG_AS_PATH_UNCHANGED;
  1871.   if (strncmp (argv[1], "next-hop", 1) == 0)
  1872.     SET_FLAG (flags, PEER_FLAG_NEXTHOP_UNCHANGED);
  1873.   else if (strncmp (argv[1], "med", 1) == 0)
  1874.     SET_FLAG (flags, PEER_FLAG_MED_UNCHANGED);
  1875.   return peer_af_flag_set_vty (vty, argv[0], bgp_node_afi (vty),
  1876.        bgp_node_safi (vty), flags);
  1877. }
  1878. DEFUN (neighbor_attr_unchanged3,
  1879.        neighbor_attr_unchanged3_cmd,
  1880.        NEIGHBOR_CMD2 "attribute-unchanged next-hop (as-path|med)",
  1881.        NEIGHBOR_STR
  1882.        NEIGHBOR_ADDR_STR2
  1883.        "BGP attribute is propagated unchanged to this neighborn"
  1884.        "Nexthop attributen"
  1885.        "As-path attributen"
  1886.        "Med attributen")
  1887. {
  1888.   u_int16_t flags = PEER_FLAG_NEXTHOP_UNCHANGED;
  1889.   if (strncmp (argv[1], "as-path", 1) == 0)
  1890.     SET_FLAG (flags, PEER_FLAG_AS_PATH_UNCHANGED);
  1891.   else if (strncmp (argv[1], "med", 1) == 0)
  1892.     SET_FLAG (flags, PEER_FLAG_MED_UNCHANGED);
  1893.   return peer_af_flag_set_vty (vty, argv[0], bgp_node_afi (vty),
  1894.        bgp_node_safi (vty), flags);
  1895. }
  1896. DEFUN (neighbor_attr_unchanged4,
  1897.        neighbor_attr_unchanged4_cmd,
  1898.        NEIGHBOR_CMD2 "attribute-unchanged med (as-path|next-hop)",
  1899.        NEIGHBOR_STR
  1900.        NEIGHBOR_ADDR_STR2
  1901.        "BGP attribute is propagated unchanged to this neighborn"
  1902.        "Med attributen"
  1903.        "As-path attributen"
  1904.        "Nexthop attributen")
  1905. {
  1906.   u_int16_t flags = PEER_FLAG_MED_UNCHANGED;
  1907.   if (strncmp (argv[1], "as-path", 1) == 0)
  1908.     SET_FLAG (flags, PEER_FLAG_AS_PATH_UNCHANGED);
  1909.   else if (strncmp (argv[1], "next-hop", 1) == 0)
  1910.     SET_FLAG (flags, PEER_FLAG_NEXTHOP_UNCHANGED);
  1911.   return peer_af_flag_set_vty (vty, argv[0], bgp_node_afi (vty),
  1912.        bgp_node_safi (vty), flags);
  1913. }
  1914. ALIAS (neighbor_attr_unchanged,
  1915.        neighbor_attr_unchanged5_cmd,
  1916.        NEIGHBOR_CMD2 "attribute-unchanged as-path next-hop med",
  1917.        NEIGHBOR_STR
  1918.        NEIGHBOR_ADDR_STR2
  1919.        "BGP attribute is propagated unchanged to this neighborn"
  1920.        "As-path attributen"
  1921.        "Nexthop attributen"
  1922.        "Med attributen");
  1923. ALIAS (neighbor_attr_unchanged,
  1924.        neighbor_attr_unchanged6_cmd,
  1925.        NEIGHBOR_CMD2 "attribute-unchanged as-path med next-hop",
  1926.        NEIGHBOR_STR
  1927.        NEIGHBOR_ADDR_STR2
  1928.        "BGP attribute is propagated unchanged to this neighborn"
  1929.        "As-path attributen"
  1930.        "Med attributen"
  1931.        "Nexthop attributen");
  1932. ALIAS (neighbor_attr_unchanged,
  1933.        neighbor_attr_unchanged7_cmd,
  1934.        NEIGHBOR_CMD2 "attribute-unchanged next-hop med as-path",
  1935.        NEIGHBOR_STR
  1936.        NEIGHBOR_ADDR_STR2
  1937.        "BGP attribute is propagated unchanged to this neighborn"
  1938.        "Nexthop attributen"
  1939.        "Med attributen"
  1940.        "As-path attributen");
  1941. ALIAS (neighbor_attr_unchanged,
  1942.        neighbor_attr_unchanged8_cmd,
  1943.        NEIGHBOR_CMD2 "attribute-unchanged next-hop as-path med",
  1944.        NEIGHBOR_STR
  1945.        NEIGHBOR_ADDR_STR2
  1946.        "BGP attribute is propagated unchanged to this neighborn"
  1947.        "Nexthop attributen"
  1948.        "As-path attributen"
  1949.        "Med attributen");
  1950. ALIAS (neighbor_attr_unchanged,
  1951.        neighbor_attr_unchanged9_cmd,
  1952.        NEIGHBOR_CMD2 "attribute-unchanged med next-hop as-path",
  1953.        NEIGHBOR_STR
  1954.        NEIGHBOR_ADDR_STR2
  1955.        "BGP attribute is propagated unchanged to this neighborn"
  1956.        "Med attributen"
  1957.        "Nexthop attributen"
  1958.        "As-path attributen");
  1959. ALIAS (neighbor_attr_unchanged,
  1960.        neighbor_attr_unchanged10_cmd,
  1961.        NEIGHBOR_CMD2 "attribute-unchanged med as-path next-hop",
  1962.        NEIGHBOR_STR
  1963.        NEIGHBOR_ADDR_STR2
  1964.        "BGP attribute is propagated unchanged to this neighborn"
  1965.        "Med attributen"
  1966.        "As-path attributen"
  1967.        "Nexthop attributen");
  1968. DEFUN (no_neighbor_attr_unchanged,
  1969.        no_neighbor_attr_unchanged_cmd,
  1970.        NO_NEIGHBOR_CMD2 "attribute-unchanged",
  1971.        NO_STR  
  1972.        NEIGHBOR_STR
  1973.        NEIGHBOR_ADDR_STR2
  1974.        "BGP attribute is propagated unchanged to this neighborn")
  1975. {
  1976.   return peer_af_flag_unset_vty (vty, argv[0], bgp_node_afi (vty),
  1977.  bgp_node_safi (vty),
  1978.  (PEER_FLAG_AS_PATH_UNCHANGED |
  1979.   PEER_FLAG_NEXTHOP_UNCHANGED |
  1980.   PEER_FLAG_MED_UNCHANGED));
  1981. }
  1982. DEFUN (no_neighbor_attr_unchanged1,
  1983.        no_neighbor_attr_unchanged1_cmd,
  1984.        NO_NEIGHBOR_CMD2 "attribute-unchanged (as-path|next-hop|med)",
  1985.        NO_STR
  1986.        NEIGHBOR_STR
  1987.        NEIGHBOR_ADDR_STR2
  1988.        "BGP attribute is propagated unchanged to this neighborn"
  1989.        "As-path attributen"
  1990.        "Nexthop attributen"
  1991.        "Med attributen")
  1992. {
  1993.   u_int16_t flags = 0;
  1994.   if (strncmp (argv[1], "as-path", 1) == 0)
  1995.     SET_FLAG (flags, PEER_FLAG_AS_PATH_UNCHANGED);
  1996.   else if (strncmp (argv[1], "next-hop", 1) == 0)
  1997.     SET_FLAG (flags, PEER_FLAG_NEXTHOP_UNCHANGED);
  1998.   else if (strncmp (argv[1], "med", 1) == 0)
  1999.     SET_FLAG (flags, PEER_FLAG_MED_UNCHANGED);
  2000.   return peer_af_flag_unset_vty (vty, argv[0], bgp_node_afi (vty),
  2001.  bgp_node_safi (vty), flags);
  2002. }
  2003. DEFUN (no_neighbor_attr_unchanged2,
  2004.        no_neighbor_attr_unchanged2_cmd,
  2005.        NO_NEIGHBOR_CMD2 "attribute-unchanged as-path (next-hop|med)",
  2006.        NO_STR
  2007.        NEIGHBOR_STR
  2008.        NEIGHBOR_ADDR_STR2
  2009.        "BGP attribute is propagated unchanged to this neighborn"
  2010.        "As-path attributen"
  2011.        "Nexthop attributen"
  2012.        "Med attributen")
  2013. {
  2014.   u_int16_t flags = PEER_FLAG_AS_PATH_UNCHANGED;
  2015.   if (strncmp (argv[1], "next-hop", 1) == 0)
  2016.     SET_FLAG (flags, PEER_FLAG_NEXTHOP_UNCHANGED);
  2017.   else if (strncmp (argv[1], "med", 1) == 0)
  2018.     SET_FLAG (flags, PEER_FLAG_MED_UNCHANGED);
  2019.   return peer_af_flag_unset_vty (vty, argv[0], bgp_node_afi (vty),
  2020.  bgp_node_safi (vty), flags);
  2021. }
  2022. DEFUN (no_neighbor_attr_unchanged3,
  2023.        no_neighbor_attr_unchanged3_cmd,
  2024.        NO_NEIGHBOR_CMD2 "attribute-unchanged next-hop (as-path|med)",
  2025.        NO_STR
  2026.        NEIGHBOR_STR
  2027.        NEIGHBOR_ADDR_STR2
  2028.        "BGP attribute is propagated unchanged to this neighborn"
  2029.        "Nexthop attributen"
  2030.        "As-path attributen"
  2031.        "Med attributen")
  2032. {
  2033.   u_int16_t flags = PEER_FLAG_NEXTHOP_UNCHANGED;
  2034.   if (strncmp (argv[1], "as-path", 1) == 0)
  2035.     SET_FLAG (flags, PEER_FLAG_AS_PATH_UNCHANGED);
  2036.   else if (strncmp (argv[1], "med", 1) == 0)
  2037.     SET_FLAG (flags, PEER_FLAG_MED_UNCHANGED);
  2038.   return peer_af_flag_unset_vty (vty, argv[0], bgp_node_afi (vty),
  2039.  bgp_node_safi (vty), flags);
  2040. }
  2041. DEFUN (no_neighbor_attr_unchanged4,
  2042.        no_neighbor_attr_unchanged4_cmd,
  2043.        NO_NEIGHBOR_CMD2 "attribute-unchanged med (as-path|next-hop)",
  2044.        NO_STR
  2045.        NEIGHBOR_STR
  2046.        NEIGHBOR_ADDR_STR2
  2047.        "BGP attribute is propagated unchanged to this neighborn"
  2048.        "Med attributen"
  2049.        "As-path attributen"
  2050.        "Nexthop attributen")
  2051. {
  2052.   u_int16_t flags = PEER_FLAG_MED_UNCHANGED;
  2053.   if (strncmp (argv[1], "as-path", 1) == 0)
  2054.     SET_FLAG (flags, PEER_FLAG_AS_PATH_UNCHANGED);
  2055.   else if (strncmp (argv[1], "next-hop", 1) == 0)
  2056.     SET_FLAG (flags, PEER_FLAG_NEXTHOP_UNCHANGED);
  2057.   return peer_af_flag_unset_vty (vty, argv[0], bgp_node_afi (vty),
  2058.  bgp_node_safi (vty), flags);
  2059. }
  2060. ALIAS (no_neighbor_attr_unchanged,
  2061.        no_neighbor_attr_unchanged5_cmd,
  2062.        NO_NEIGHBOR_CMD2 "attribute-unchanged as-path next-hop med",
  2063.        NO_STR
  2064.        NEIGHBOR_STR
  2065.        NEIGHBOR_ADDR_STR2
  2066.        "BGP attribute is propagated unchanged to this neighborn"
  2067.        "As-path attributen"
  2068.        "Nexthop attributen"
  2069.        "Med attributen");
  2070. ALIAS (no_neighbor_attr_unchanged,
  2071.        no_neighbor_attr_unchanged6_cmd,
  2072.        NO_NEIGHBOR_CMD2 "attribute-unchanged as-path med next-hop",
  2073.        NO_STR
  2074.        NEIGHBOR_STR
  2075.        NEIGHBOR_ADDR_STR2
  2076.        "BGP attribute is propagated unchanged to this neighborn"
  2077.        "As-path attributen"
  2078.        "Med attributen"
  2079.        "Nexthop attributen");
  2080. ALIAS (no_neighbor_attr_unchanged,
  2081.        no_neighbor_attr_unchanged7_cmd,
  2082.        NO_NEIGHBOR_CMD2 "attribute-unchanged next-hop med as-path",
  2083.        NO_STR
  2084.        NEIGHBOR_STR
  2085.        NEIGHBOR_ADDR_STR2
  2086.        "BGP attribute is propagated unchanged to this neighborn"
  2087.        "Nexthop attributen"
  2088.        "Med attributen"
  2089.        "As-path attributen");
  2090. ALIAS (no_neighbor_attr_unchanged,
  2091.        no_neighbor_attr_unchanged8_cmd,
  2092.        NO_NEIGHBOR_CMD2 "attribute-unchanged next-hop as-path med",
  2093.        NO_STR
  2094.        NEIGHBOR_STR
  2095.        NEIGHBOR_ADDR_STR2
  2096.        "BGP attribute is propagated unchanged to this neighborn"
  2097.        "Nexthop attributen"
  2098.        "As-path attributen"
  2099.        "Med attributen");
  2100. ALIAS (no_neighbor_attr_unchanged,
  2101.        no_neighbor_attr_unchanged9_cmd,
  2102.        NO_NEIGHBOR_CMD2 "attribute-unchanged med next-hop as-path",
  2103.        NO_STR
  2104.        NEIGHBOR_STR
  2105.        NEIGHBOR_ADDR_STR2
  2106.        "BGP attribute is propagated unchanged to this neighborn"
  2107.        "Med attributen"
  2108.        "Nexthop attributen"
  2109.        "As-path attributen");
  2110. ALIAS (no_neighbor_attr_unchanged,
  2111.        no_neighbor_attr_unchanged10_cmd,
  2112.        NO_NEIGHBOR_CMD2 "attribute-unchanged med as-path next-hop",
  2113.        NO_STR
  2114.        NEIGHBOR_STR
  2115.        NEIGHBOR_ADDR_STR2
  2116.        "BGP attribute is propagated unchanged to this neighborn"
  2117.        "Med attributen"
  2118.        "As-path attributen"
  2119.        "Nexthop attributen");
  2120. /* EBGP multihop configuration. */
  2121. int
  2122. peer_ebgp_multihop_set_vty (struct vty *vty, char *ip_str, char *ttl_str)
  2123. {
  2124.   struct peer *peer;
  2125.   int ttl;
  2126.   peer = peer_and_group_lookup_vty (vty, ip_str);
  2127.   if (! peer)
  2128.     return CMD_WARNING;
  2129.   if (! ttl_str)
  2130.     ttl = TTL_MAX;
  2131.   else
  2132.     VTY_GET_INTEGER_RANGE ("TTL", ttl, ttl_str, 1, 255);
  2133.   peer_ebgp_multihop_set (peer, ttl);
  2134.   return CMD_SUCCESS;
  2135. }
  2136. int
  2137. peer_ebgp_multihop_unset_vty (struct vty *vty, char *ip_str) 
  2138. {
  2139.   struct peer *peer;
  2140.   peer = peer_and_group_lookup_vty (vty, ip_str);
  2141.   if (! peer)
  2142.     return CMD_WARNING;
  2143.   peer_ebgp_multihop_unset (peer);
  2144.   return CMD_SUCCESS;
  2145. }
  2146. /* neighbor ebgp-multihop. */
  2147. DEFUN (neighbor_ebgp_multihop,
  2148.        neighbor_ebgp_multihop_cmd,
  2149.        NEIGHBOR_CMD2 "ebgp-multihop",
  2150.        NEIGHBOR_STR
  2151.        NEIGHBOR_ADDR_STR2
  2152.        "Allow EBGP neighbors not on directly connected networksn")
  2153. {
  2154.   return peer_ebgp_multihop_set_vty (vty, argv[0], NULL);
  2155. }
  2156. DEFUN (neighbor_ebgp_multihop_ttl,
  2157.        neighbor_ebgp_multihop_ttl_cmd,
  2158.        NEIGHBOR_CMD2 "ebgp-multihop <1-255>",
  2159.        NEIGHBOR_STR
  2160.        NEIGHBOR_ADDR_STR2
  2161.        "Allow EBGP neighbors not on directly connected networksn"
  2162.        "maximum hop countn")
  2163. {
  2164.   return peer_ebgp_multihop_set_vty (vty, argv[0], argv[1]);
  2165. }
  2166. DEFUN (no_neighbor_ebgp_multihop,
  2167.        no_neighbor_ebgp_multihop_cmd,
  2168.        NO_NEIGHBOR_CMD2 "ebgp-multihop",
  2169.        NO_STR
  2170.        NEIGHBOR_STR
  2171.        NEIGHBOR_ADDR_STR2
  2172.        "Allow EBGP neighbors not on directly connected networksn")
  2173. {
  2174.   return peer_ebgp_multihop_unset_vty (vty, argv[0]);
  2175. }
  2176. ALIAS (no_neighbor_ebgp_multihop,
  2177.        no_neighbor_ebgp_multihop_ttl_cmd,
  2178.        NO_NEIGHBOR_CMD2 "ebgp-multihop <1-255>",
  2179.        NO_STR
  2180.        NEIGHBOR_STR
  2181.        NEIGHBOR_ADDR_STR2
  2182.        "Allow EBGP neighbors not on directly connected networksn"
  2183.        "maximum hop countn");
  2184. /* disable-connected-check */
  2185. DEFUN (neighbor_disable_connected_check,
  2186.        neighbor_disable_connected_check_cmd,
  2187.        NEIGHBOR_CMD2 "disable-connected-check",
  2188.        NEIGHBOR_STR
  2189.        NEIGHBOR_ADDR_STR2
  2190.        "one-hop away EBGP peer using loopback addressn")
  2191. {
  2192.   return peer_flag_set_vty (vty, argv[0], PEER_FLAG_DISABLE_CONNECTED_CHECK);
  2193. }
  2194. DEFUN (no_neighbor_disable_connected_check,
  2195.        no_neighbor_disable_connected_check_cmd,
  2196.        NO_NEIGHBOR_CMD2 "disable-connected-check",
  2197.        NO_STR
  2198.        NEIGHBOR_STR
  2199.        NEIGHBOR_ADDR_STR2
  2200.        "one-hop away EBGP peer using loopback addressn")
  2201. {
  2202.   return peer_flag_unset_vty (vty, argv[0], PEER_FLAG_DISABLE_CONNECTED_CHECK);
  2203. }
  2204. /* Enforce multihop.  */
  2205. ALIAS (neighbor_disable_connected_check,
  2206.        neighbor_enforce_multihop_cmd,
  2207.        NEIGHBOR_CMD2 "enforce-multihop",
  2208.        NEIGHBOR_STR
  2209.        NEIGHBOR_ADDR_STR2
  2210.        "Enforce EBGP neighbors perform multihopn");
  2211. DEFUN (neighbor_description,
  2212.        neighbor_description_cmd,
  2213.        NEIGHBOR_CMD2 "description .LINE",
  2214.        NEIGHBOR_STR
  2215.        NEIGHBOR_ADDR_STR2
  2216.        "Neighbor specific descriptionn"
  2217.        "Up to 80 characters describing this neighborn")
  2218. {
  2219.   struct peer *peer;
  2220.   struct buffer *b;
  2221.   char *str;
  2222.   int i;
  2223.   peer = peer_and_group_lookup_vty (vty, argv[0]);
  2224.   if (! peer)
  2225.     return CMD_WARNING;
  2226.   if (argc == 1)
  2227.     return CMD_SUCCESS;
  2228.   /* Make string from buffer.  This function should be provided by
  2229.      buffer.c. */
  2230.   b = buffer_new (1024);
  2231.   for (i = 1; i < argc; i++)
  2232.     {
  2233.       buffer_putstr (b, (u_char *)argv[i]);
  2234.       buffer_putc (b, ' ');
  2235.     }
  2236.   buffer_putc (b, '');
  2237.   str = buffer_getstr (b);
  2238.   buffer_free (b);
  2239.   peer_description_set (peer, str);
  2240.   free (str);
  2241.   return CMD_SUCCESS;
  2242. }
  2243. DEFUN (no_neighbor_description,
  2244.        no_neighbor_description_cmd,
  2245.        NO_NEIGHBOR_CMD2 "description",
  2246.        NO_STR
  2247.        NEIGHBOR_STR
  2248.        NEIGHBOR_ADDR_STR2
  2249.        "Neighbor specific descriptionn")
  2250. {
  2251.   struct peer *peer;
  2252.   peer = peer_and_group_lookup_vty (vty, argv[0]);
  2253.   if (! peer)
  2254.     return CMD_WARNING;
  2255.   peer_description_unset (peer);
  2256.   return CMD_SUCCESS;
  2257. }
  2258. ALIAS (no_neighbor_description,
  2259.        no_neighbor_description_val_cmd,
  2260.        NO_NEIGHBOR_CMD2 "description .LINE",
  2261.        NO_STR
  2262.        NEIGHBOR_STR
  2263.        NEIGHBOR_ADDR_STR2
  2264.        "Neighbor specific descriptionn"
  2265.        "Up to 80 characters describing this neighborn");
  2266. /* Neighbor update-source. */
  2267. int
  2268. peer_update_source_vty (struct vty *vty, char *peer_str, char *source_str)
  2269. {
  2270.   struct peer *peer;
  2271.   union sockunion *su;
  2272.   peer = peer_and_group_lookup_vty (vty, peer_str);
  2273.   if (! peer)
  2274.     return CMD_WARNING;
  2275.   if (source_str)
  2276.     {
  2277.       su = sockunion_str2su (source_str);
  2278.       if (su)
  2279. {
  2280.   peer_update_source_addr_set (peer, su);
  2281.   sockunion_free (su);
  2282. }
  2283.       else
  2284. peer_update_source_if_set (peer, source_str);
  2285.     }
  2286.   else
  2287.     peer_update_source_unset (peer);
  2288.   return CMD_SUCCESS;
  2289. }
  2290. DEFUN (neighbor_update_source,
  2291.        neighbor_update_source_cmd,
  2292.        NEIGHBOR_CMD2 "update-source WORD",
  2293.        NEIGHBOR_STR
  2294.        NEIGHBOR_ADDR_STR2
  2295.        "Source of routing updatesn"
  2296.        "Interface namen")
  2297. {
  2298.   return peer_update_source_vty (vty, argv[0], argv[1]);
  2299. }
  2300. DEFUN (no_neighbor_update_source,
  2301.        no_neighbor_update_source_cmd,
  2302.        NO_NEIGHBOR_CMD2 "update-source",
  2303.        NO_STR
  2304.        NEIGHBOR_STR
  2305.        NEIGHBOR_ADDR_STR2
  2306.        "Source of routing updatesn"
  2307.        "Interface namen")
  2308. {
  2309.   return peer_update_source_vty (vty, argv[0], NULL);
  2310. }
  2311. int
  2312. peer_default_originate_set_vty (struct vty *vty, char *peer_str, afi_t afi,
  2313. safi_t safi, char *rmap, int set)
  2314. {
  2315.   int ret;
  2316.   struct peer *peer;
  2317.   peer = peer_and_group_lookup_vty (vty, peer_str);
  2318.   if (! peer)
  2319.     return CMD_WARNING;
  2320.   if (set)
  2321.     ret = peer_default_originate_set (peer, afi, safi, rmap);
  2322.   else
  2323.     ret = peer_default_originate_unset (peer, afi, safi);
  2324.   return bgp_vty_return (vty, ret);
  2325. }
  2326. /* neighbor default-originate. */
  2327. DEFUN (neighbor_default_originate,
  2328.        neighbor_default_originate_cmd,
  2329.        NEIGHBOR_CMD2 "default-originate",
  2330.        NEIGHBOR_STR
  2331.        NEIGHBOR_ADDR_STR2
  2332.        "Originate default route to this neighborn")
  2333. {
  2334.   return peer_default_originate_set_vty (vty, argv[0], bgp_node_afi (vty),
  2335.  bgp_node_safi (vty), NULL, 1);
  2336. }
  2337. DEFUN (neighbor_default_originate_rmap,
  2338.        neighbor_default_originate_rmap_cmd,
  2339.        NEIGHBOR_CMD2 "default-originate route-map WORD",
  2340.        NEIGHBOR_STR
  2341.        NEIGHBOR_ADDR_STR2
  2342.        "Originate default route to this neighborn"
  2343.        "Route-map to specify criteria to originate defaultn"
  2344.        "route-map namen")
  2345. {
  2346.   return peer_default_originate_set_vty (vty, argv[0], bgp_node_afi (vty),
  2347.  bgp_node_safi (vty), argv[1], 1);
  2348. }
  2349. DEFUN (no_neighbor_default_originate,
  2350.        no_neighbor_default_originate_cmd,
  2351.        NO_NEIGHBOR_CMD2 "default-originate",
  2352.        NO_STR
  2353.        NEIGHBOR_STR
  2354.        NEIGHBOR_ADDR_STR2
  2355.        "Originate default route to this neighborn")
  2356. {
  2357.   return peer_default_originate_set_vty (vty, argv[0], bgp_node_afi (vty),
  2358.  bgp_node_safi (vty), NULL, 0);
  2359. }
  2360. ALIAS (no_neighbor_default_originate,
  2361.        no_neighbor_default_originate_rmap_cmd,
  2362.        NO_NEIGHBOR_CMD2 "default-originate route-map WORD",
  2363.        NO_STR
  2364.        NEIGHBOR_STR
  2365.        NEIGHBOR_ADDR_STR2
  2366.        "Originate default route to this neighborn"
  2367.        "Route-map to specify criteria to originate defaultn"
  2368.        "route-map namen");
  2369. /* Set neighbor's BGP port.  */
  2370. int
  2371. peer_port_vty (struct vty *vty, char *ip_str, int afi, char *port_str)
  2372. {
  2373.   struct peer *peer;
  2374.   u_int16_t port;
  2375.   struct servent *sp;
  2376.   peer = peer_lookup_vty (vty, ip_str);
  2377.   if (! peer)
  2378.     return CMD_WARNING;
  2379.   if (! port_str)
  2380.     { 
  2381.       sp = getservbyname ("bgp", "tcp");
  2382.       port = (sp == NULL) ? BGP_PORT_DEFAULT : ntohs (sp->s_port);
  2383.     }
  2384.   else
  2385.     {
  2386.       VTY_GET_INTEGER("port", port, port_str);
  2387.     }
  2388.   peer_port_set (peer, port);
  2389.   return CMD_SUCCESS;
  2390. }
  2391. /* Set specified peer's BGP port.  */
  2392. DEFUN (neighbor_port,
  2393.        neighbor_port_cmd,
  2394.        NEIGHBOR_CMD "port <0-65535>",
  2395.        NEIGHBOR_STR
  2396.        NEIGHBOR_ADDR_STR
  2397.        "Neighbor's BGP portn"
  2398.        "TCP port numbern")
  2399. {
  2400.   return peer_port_vty (vty, argv[0], AFI_IP, argv[1]);
  2401. }
  2402. DEFUN (no_neighbor_port,
  2403.        no_neighbor_port_cmd,
  2404.        NO_NEIGHBOR_CMD "port",
  2405.        NO_STR
  2406.        NEIGHBOR_STR
  2407.        NEIGHBOR_ADDR_STR
  2408.        "Neighbor's BGP portn")
  2409. {
  2410.   return peer_port_vty (vty, argv[0], AFI_IP, NULL);
  2411. }
  2412. ALIAS (no_neighbor_port,
  2413.        no_neighbor_port_val_cmd,
  2414.        NO_NEIGHBOR_CMD "port <0-65535>",
  2415.        NO_STR
  2416.        NEIGHBOR_STR
  2417.        NEIGHBOR_ADDR_STR
  2418.        "Neighbor's BGP portn"
  2419.        "TCP port numbern");
  2420. /* neighbor weight. */
  2421. int
  2422. peer_weight_set_vty (struct vty *vty, char *ip_str, char *weight_str,
  2423.      afi_t afi, safi_t safi)
  2424. {
  2425.   int ret;
  2426.   struct peer *peer;
  2427.   u_int16_t weight;
  2428.   peer = peer_and_group_lookup_vty (vty, ip_str);
  2429.   if (! peer)
  2430.     return CMD_WARNING;
  2431.   VTY_GET_INTEGER_RANGE("weight", weight, weight_str, 0, 65535);
  2432.   ret = peer_weight_set (peer, weight, afi, safi);
  2433.   return CMD_SUCCESS;
  2434. }
  2435. int
  2436. peer_weight_unset_vty (struct vty *vty, char *ip_str, afi_t afi, safi_t safi)
  2437. {
  2438.   struct peer *peer;
  2439.   peer = peer_and_group_lookup_vty (vty, ip_str);
  2440.   if (! peer)
  2441.     return CMD_WARNING;
  2442.   peer_weight_unset (peer, afi, safi);
  2443.   return CMD_SUCCESS;
  2444. }
  2445. DEFUN (neighbor_weight,
  2446.        neighbor_weight_cmd,
  2447.        NEIGHBOR_CMD2 "weight <0-65535>",
  2448.        NEIGHBOR_STR
  2449.        NEIGHBOR_ADDR_STR2
  2450.        "Set default weight for routes from this neighborn"
  2451.        "default weightn")
  2452. {
  2453.   return peer_weight_set_vty (vty, argv[0], argv[1], bgp_node_afi (vty),
  2454.       bgp_node_safi (vty));
  2455. }
  2456. DEFUN (no_neighbor_weight,
  2457.        no_neighbor_weight_cmd,
  2458.        NO_NEIGHBOR_CMD2 "weight",
  2459.        NO_STR
  2460.        NEIGHBOR_STR
  2461.        NEIGHBOR_ADDR_STR2
  2462.        "Set default weight for routes from this neighborn")
  2463. {
  2464.   return peer_weight_unset_vty (vty, argv[0], bgp_node_afi (vty), bgp_node_safi (vty));
  2465. }
  2466. ALIAS (no_neighbor_weight,
  2467.        no_neighbor_weight_val_cmd,
  2468.        NO_NEIGHBOR_CMD2 "weight <0-65535>",
  2469.        NO_STR
  2470.        NEIGHBOR_STR
  2471.        NEIGHBOR_ADDR_STR2
  2472.        "Set default weight for routes from this neighborn"
  2473.        "default weightn");
  2474. /* Override capability negotiation. */
  2475. DEFUN (neighbor_override_capability,
  2476.        neighbor_override_capability_cmd,
  2477.        NEIGHBOR_CMD2 "override-capability",
  2478.        NEIGHBOR_STR
  2479.        NEIGHBOR_ADDR_STR2
  2480.        "Override capability negotiation resultn")
  2481. {
  2482.   return peer_flag_set_vty (vty, argv[0], PEER_FLAG_OVERRIDE_CAPABILITY);
  2483. }
  2484. DEFUN (no_neighbor_override_capability,
  2485.        no_neighbor_override_capability_cmd,
  2486.        NO_NEIGHBOR_CMD2 "override-capability",
  2487.        NO_STR
  2488.        NEIGHBOR_STR
  2489.        NEIGHBOR_ADDR_STR2
  2490.        "Override capability negotiation resultn")
  2491. {
  2492.   return peer_flag_unset_vty (vty, argv[0], PEER_FLAG_OVERRIDE_CAPABILITY);
  2493. }
  2494. DEFUN (neighbor_strict_capability,
  2495.        neighbor_strict_capability_cmd,
  2496.        NEIGHBOR_CMD "strict-capability-match",
  2497.        NEIGHBOR_STR
  2498.        NEIGHBOR_ADDR_STR
  2499.        "Strict capability negotiation matchn")
  2500. {
  2501.   return peer_flag_set_vty (vty, argv[0], PEER_FLAG_STRICT_CAP_MATCH);
  2502. }
  2503. DEFUN (no_neighbor_strict_capability,
  2504.        no_neighbor_strict_capability_cmd,
  2505.        NO_NEIGHBOR_CMD "strict-capability-match",
  2506.        NO_STR
  2507.        NEIGHBOR_STR
  2508.        NEIGHBOR_ADDR_STR
  2509.        "Strict capability negotiation matchn")
  2510. {
  2511.   return peer_flag_unset_vty (vty, argv[0], PEER_FLAG_STRICT_CAP_MATCH);
  2512. }
  2513. int
  2514. peer_timers_set_vty (struct vty *vty, char *ip_str, char *keep_str,
  2515.      char *hold_str)
  2516. {
  2517.   int ret;
  2518.   struct peer *peer;
  2519.   u_int32_t keepalive;
  2520.   u_int32_t holdtime;
  2521.   peer = peer_and_group_lookup_vty (vty, ip_str);
  2522.   if (! peer)
  2523.     return CMD_WARNING;
  2524.   VTY_GET_INTEGER_RANGE ("Keepalive", keepalive, keep_str, 0, 65535);
  2525.   VTY_GET_INTEGER_RANGE ("Holdtime", holdtime, hold_str, 0, 65535);
  2526.   ret = peer_timers_set (peer, keepalive, holdtime);
  2527.   return bgp_vty_return (vty, ret);
  2528. }
  2529. int
  2530. peer_timers_unset_vty (struct vty *vty, char *ip_str)
  2531. {
  2532.   int ret;
  2533.   struct peer *peer;
  2534.   peer = peer_lookup_vty (vty, ip_str);
  2535.   if (! peer)
  2536.     return CMD_WARNING;
  2537.   ret = peer_timers_unset (peer);
  2538.   return bgp_vty_return (vty, ret);
  2539. }
  2540. DEFUN (neighbor_timers,
  2541.        neighbor_timers_cmd,
  2542.        NEIGHBOR_CMD2 "timers <0-65535> <0-65535>",
  2543.        NEIGHBOR_STR
  2544.        NEIGHBOR_ADDR_STR2
  2545.        "BGP per neighbor timersn"
  2546.        "Keepalive intervaln"
  2547.        "Holdtimen")
  2548. {
  2549.   return peer_timers_set_vty (vty, argv[0], argv[1], argv[2]);
  2550. }
  2551. DEFUN (no_neighbor_timers,
  2552.        no_neighbor_timers_cmd,
  2553.        NO_NEIGHBOR_CMD2 "timers",
  2554.        NO_STR
  2555.        NEIGHBOR_STR
  2556.        NEIGHBOR_ADDR_STR2
  2557.        "BGP per neighbor timersn")
  2558. {
  2559.   return peer_timers_unset_vty (vty, argv[0]);
  2560. }
  2561. int
  2562. peer_advertise_interval_vty (struct vty *vty, char *ip_str, char *time_str,
  2563.      int set)  
  2564. {
  2565.   int ret;
  2566.   struct peer *peer;
  2567.   u_int32_t routeadv = 0;
  2568.   peer = peer_lookup_vty (vty, ip_str);
  2569.   if (! peer)
  2570.     return CMD_WARNING;
  2571.   if (time_str)
  2572.     VTY_GET_INTEGER_RANGE ("advertise interval", routeadv, time_str, 0, 600);
  2573.   if (set)
  2574.     ret = peer_advertise_interval_set (peer, routeadv);
  2575.   else
  2576.     ret = peer_advertise_interval_unset (peer);
  2577.   return CMD_SUCCESS;
  2578. }
  2579. DEFUN (neighbor_advertise_interval,
  2580.        neighbor_advertise_interval_cmd,
  2581.        NEIGHBOR_CMD "advertisement-interval <0-600>",
  2582.        NEIGHBOR_STR
  2583.        NEIGHBOR_ADDR_STR
  2584.        "Minimum interval between sending BGP routing updatesn"
  2585.        "time in secondsn")
  2586. {
  2587.   return peer_advertise_interval_vty (vty, argv[0], argv[1], 1);
  2588. }
  2589. DEFUN (no_neighbor_advertise_interval,
  2590.        no_neighbor_advertise_interval_cmd,
  2591.        NO_NEIGHBOR_CMD "advertisement-interval",
  2592.        NO_STR
  2593.        NEIGHBOR_STR
  2594.        NEIGHBOR_ADDR_STR
  2595.        "Minimum interval between sending BGP routing updatesn")
  2596. {
  2597.   return peer_advertise_interval_vty (vty, argv[0], NULL, 0);
  2598. }
  2599. ALIAS (no_neighbor_advertise_interval,
  2600.        no_neighbor_advertise_interval_val_cmd,
  2601.        NO_NEIGHBOR_CMD "advertisement-interval <0-600>",
  2602.        NO_STR
  2603.        NEIGHBOR_STR
  2604.        NEIGHBOR_ADDR_STR
  2605.        "Minimum interval between sending BGP routing updatesn"
  2606.        "time in secondsn");
  2607. /* neighbor interface */
  2608. int
  2609. peer_interface_vty (struct vty *vty, char *ip_str, char *str)
  2610. {
  2611.   int ret;
  2612.   struct peer *peer;
  2613.   peer = peer_lookup_vty (vty, ip_str);
  2614.   if (! peer)
  2615.     return CMD_WARNING;
  2616.   if (str)
  2617.     ret = peer_interface_set (peer, str);
  2618.   else
  2619.     ret = peer_interface_unset (peer);
  2620.   return CMD_SUCCESS;
  2621. }
  2622. DEFUN (neighbor_interface,
  2623.        neighbor_interface_cmd,
  2624.        NEIGHBOR_CMD "interface WORD",
  2625.        NEIGHBOR_STR
  2626.        NEIGHBOR_ADDR_STR
  2627.        "Interfacen"
  2628.        "Interface namen")
  2629. {
  2630.   return peer_interface_vty (vty, argv[0], argv[1]);
  2631. }
  2632. DEFUN (no_neighbor_interface,
  2633.        no_neighbor_interface_cmd,
  2634.        NO_NEIGHBOR_CMD "interface WORD",
  2635.        NO_STR
  2636.        NEIGHBOR_STR
  2637.        NEIGHBOR_ADDR_STR
  2638.        "Interfacen"
  2639.        "Interface namen")
  2640. {
  2641.   return peer_interface_vty (vty, argv[0], NULL);
  2642. }
  2643. /* Set distribute list to the peer. */
  2644. int
  2645. peer_distribute_set_vty (struct vty *vty, char *ip_str, afi_t afi, safi_t safi,
  2646.  char *name_str, char *direct_str)
  2647. {
  2648.   int ret;
  2649.   struct peer *peer;
  2650.   int direct = FILTER_IN;
  2651.   peer = peer_and_group_lookup_vty (vty, ip_str);
  2652.   if (! peer)
  2653.     return CMD_WARNING;
  2654.   /* Check filter direction. */
  2655.   if (strncmp (direct_str, "i", 1) == 0)
  2656.     direct = FILTER_IN;
  2657.   else if (strncmp (direct_str, "o", 1) == 0)
  2658.     direct = FILTER_OUT;
  2659.   ret = peer_distribute_set (peer, afi, safi, direct, name_str);
  2660.   return bgp_vty_return (vty, ret);
  2661. }
  2662. int
  2663. peer_distribute_unset_vty (struct vty *vty, char *ip_str, afi_t afi,
  2664.    safi_t safi, char *direct_str)
  2665. {
  2666.   int ret;
  2667.   struct peer *peer;
  2668.   int direct = FILTER_IN;
  2669.   peer = peer_and_group_lookup_vty (vty, ip_str);
  2670.   if (! peer)
  2671.     return CMD_WARNING;
  2672.   /* Check filter direction. */
  2673.   if (strncmp (direct_str, "i", 1) == 0)
  2674.     direct = FILTER_IN;
  2675.   else if (strncmp (direct_str, "o", 1) == 0)
  2676.     direct = FILTER_OUT;
  2677.   ret = peer_distribute_unset (peer, afi, safi, direct);
  2678.   return bgp_vty_return (vty, ret);
  2679. }
  2680. DEFUN (neighbor_distribute_list,
  2681.        neighbor_distribute_list_cmd,
  2682.        NEIGHBOR_CMD2 "distribute-list (<1-199>|<1300-2699>|WORD) (in|out)",
  2683.        NEIGHBOR_STR
  2684.        NEIGHBOR_ADDR_STR2
  2685.        "Filter updates to/from this neighborn"
  2686.        "IP access-list numbern"
  2687.        "IP access-list number (expanded range)n"
  2688.        "IP Access-list namen"
  2689.        "Filter incoming updatesn"
  2690.        "Filter outgoing updatesn")
  2691. {
  2692.   return peer_distribute_set_vty (vty, argv[0], bgp_node_afi (vty),
  2693.   bgp_node_safi (vty), argv[1], argv[2]);
  2694. }
  2695. DEFUN (no_neighbor_distribute_list,
  2696.        no_neighbor_distribute_list_cmd,
  2697.        NO_NEIGHBOR_CMD2 "distribute-list (<1-199>|<1300-2699>|WORD) (in|out)",
  2698.        NO_STR
  2699.        NEIGHBOR_STR
  2700.        NEIGHBOR_ADDR_STR2
  2701.        "Filter updates to/from this neighborn"
  2702.        "IP access-list numbern"
  2703.        "IP access-list number (expanded range)n"
  2704.        "IP Access-list namen"
  2705.        "Filter incoming updatesn"
  2706.        "Filter outgoing updatesn")
  2707. {
  2708.   return peer_distribute_unset_vty (vty, argv[0], bgp_node_afi (vty),
  2709.     bgp_node_safi (vty), argv[2]);
  2710. }
  2711. /* Set prefix list to the peer. */
  2712. int
  2713. peer_prefix_list_set_vty (struct vty *vty, char *ip_str, afi_t afi,
  2714.   safi_t safi, char *name_str, char *direct_str)
  2715. {
  2716.   int ret;
  2717.   struct peer *peer;
  2718.   int direct = FILTER_IN;
  2719.   peer = peer_and_group_lookup_vty (vty, ip_str);
  2720.   if (! peer)
  2721.     return CMD_WARNING;
  2722.   /* Check filter direction. */
  2723.   if (strncmp (direct_str, "i", 1) == 0)
  2724.     direct = FILTER_IN;
  2725.   else if (strncmp (direct_str, "o", 1) == 0)
  2726.     direct = FILTER_OUT;
  2727.   ret = peer_prefix_list_set (peer, afi, safi, direct, name_str);
  2728.   return bgp_vty_return (vty, ret);
  2729. }
  2730. int
  2731. peer_prefix_list_unset_vty (struct vty *vty, char *ip_str, afi_t afi,
  2732.     safi_t safi, char *direct_str)
  2733. {
  2734.   int ret;
  2735.   struct peer *peer;
  2736.   int direct = FILTER_IN;
  2737.   peer = peer_and_group_lookup_vty (vty, ip_str);
  2738.   if (! peer)
  2739.     return CMD_WARNING;
  2740.   
  2741.   /* Check filter direction. */
  2742.   if (strncmp (direct_str, "i", 1) == 0)
  2743.     direct = FILTER_IN;
  2744.   else if (strncmp (direct_str, "o", 1) == 0)
  2745.     direct = FILTER_OUT;
  2746.   ret = peer_prefix_list_unset (peer, afi, safi, direct);
  2747.   return bgp_vty_return (vty, ret);
  2748. }
  2749. DEFUN (neighbor_prefix_list,
  2750.        neighbor_prefix_list_cmd,
  2751.        NEIGHBOR_CMD2 "prefix-list WORD (in|out)",
  2752.        NEIGHBOR_STR
  2753.        NEIGHBOR_ADDR_STR2
  2754.        "Filter updates to/from this neighborn"
  2755.        "Name of a prefix listn"
  2756.        "Filter incoming updatesn"
  2757.        "Filter outgoing updatesn")
  2758. {
  2759.   return peer_prefix_list_set_vty (vty, argv[0], bgp_node_afi (vty),
  2760.    bgp_node_safi (vty), argv[1], argv[2]);
  2761. }
  2762. DEFUN (no_neighbor_prefix_list,
  2763.        no_neighbor_prefix_list_cmd,
  2764.        NO_NEIGHBOR_CMD2 "prefix-list WORD (in|out)",
  2765.        NO_STR
  2766.        NEIGHBOR_STR
  2767.        NEIGHBOR_ADDR_STR2
  2768.        "Filter updates to/from this neighborn"
  2769.        "Name of a prefix listn"
  2770.        "Filter incoming updatesn"
  2771.        "Filter outgoing updatesn")
  2772. {
  2773.   return peer_prefix_list_unset_vty (vty, argv[0], bgp_node_afi (vty),
  2774.      bgp_node_safi (vty), argv[2]);
  2775. }
  2776. int
  2777. peer_aslist_set_vty (struct vty *vty, char *ip_str, afi_t afi, safi_t safi,
  2778.      char *name_str, char *direct_str)
  2779. {
  2780.   int ret;
  2781.   struct peer *peer;
  2782.   int direct = FILTER_IN;
  2783.   peer = peer_and_group_lookup_vty (vty, ip_str);
  2784.   if (! peer)
  2785.     return CMD_WARNING;
  2786.   /* Check filter direction. */
  2787.   if (strncmp (direct_str, "i", 1) == 0)
  2788.     direct = FILTER_IN;