2 * Copyright (C) 1996, 97, 98, 99, 2000 Kunihiro Ishiguro
4 * This file is part of GNU Zebra.
6 * GNU Zebra is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2, or (at your option) any
11 * GNU Zebra is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program; see the file COPYING; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
33 #include "memory_vty.h"
39 #include "bgpd/bgpd.h"
40 #include "bgpd/bgp_advertise.h"
41 #include "bgpd/bgp_attr.h"
42 #include "bgpd/bgp_aspath.h"
43 #include "bgpd/bgp_community.h"
44 #include "bgpd/bgp_ecommunity.h"
45 #include "bgpd/bgp_lcommunity.h"
46 #include "bgpd/bgp_damp.h"
47 #include "bgpd/bgp_debug.h"
48 #include "bgpd/bgp_fsm.h"
49 #include "bgpd/bgp_nexthop.h"
50 #include "bgpd/bgp_open.h"
51 #include "bgpd/bgp_regex.h"
52 #include "bgpd/bgp_route.h"
53 #include "bgpd/bgp_mplsvpn.h"
54 #include "bgpd/bgp_zebra.h"
55 #include "bgpd/bgp_table.h"
56 #include "bgpd/bgp_vty.h"
57 #include "bgpd/bgp_mpath.h"
58 #include "bgpd/bgp_packet.h"
59 #include "bgpd/bgp_updgrp.h"
60 #include "bgpd/bgp_bfd.h"
61 #include "bgpd/bgp_io.h"
62 #include "bgpd/bgp_evpn.h"
64 static struct peer_group
*listen_range_exists(struct bgp
*bgp
,
65 struct prefix
*range
, int exact
);
67 static enum node_type
bgp_node_type(afi_t afi
, safi_t safi
)
76 return BGP_IPV4M_NODE
;
78 case SAFI_LABELED_UNICAST
:
79 return BGP_IPV4L_NODE
;
82 return BGP_VPNV4_NODE
;
85 return BGP_FLOWSPECV4_NODE
;
98 return BGP_IPV6M_NODE
;
100 case SAFI_LABELED_UNICAST
:
101 return BGP_IPV6L_NODE
;
104 return BGP_VPNV6_NODE
;
107 return BGP_FLOWSPECV6_NODE
;
110 return BGP_IPV4_NODE
;
115 return BGP_EVPN_NODE
;
118 // We should never be here but to clarify the switch statement..
119 return BGP_IPV4_NODE
;
123 // Impossible to happen
124 return BGP_IPV4_NODE
;
127 /* Utility function to get address family from current node. */
128 afi_t
bgp_node_afi(struct vty
*vty
)
136 case BGP_FLOWSPECV6_NODE
:
149 /* Utility function to get subsequent address family from current
151 safi_t
bgp_node_safi(struct vty
*vty
)
157 safi
= SAFI_MPLS_VPN
;
161 safi
= SAFI_MULTICAST
;
168 safi
= SAFI_LABELED_UNICAST
;
170 case BGP_FLOWSPECV4_NODE
:
171 case BGP_FLOWSPECV6_NODE
:
172 safi
= SAFI_FLOWSPEC
;
182 * Converts an AFI in string form to afi_t
184 * @param afi string, one of
187 * @return the corresponding afi_t
189 afi_t
bgp_vty_afi_from_str(const char *afi_str
)
191 afi_t afi
= AFI_MAX
; /* unknown */
192 if (strmatch(afi_str
, "ipv4"))
194 else if (strmatch(afi_str
, "ipv6"))
199 int argv_find_and_parse_afi(struct cmd_token
**argv
, int argc
, int *index
,
203 if (argv_find(argv
, argc
, "ipv4", index
)) {
207 } else if (argv_find(argv
, argc
, "ipv6", index
)) {
215 /* supports <unicast|multicast|vpn|labeled-unicast> */
216 safi_t
bgp_vty_safi_from_str(const char *safi_str
)
218 safi_t safi
= SAFI_MAX
; /* unknown */
219 if (strmatch(safi_str
, "multicast"))
220 safi
= SAFI_MULTICAST
;
221 else if (strmatch(safi_str
, "unicast"))
223 else if (strmatch(safi_str
, "vpn"))
224 safi
= SAFI_MPLS_VPN
;
225 else if (strmatch(safi_str
, "labeled-unicast"))
226 safi
= SAFI_LABELED_UNICAST
;
227 else if (strmatch(safi_str
, "flowspec"))
228 safi
= SAFI_FLOWSPEC
;
232 int argv_find_and_parse_safi(struct cmd_token
**argv
, int argc
, int *index
,
236 if (argv_find(argv
, argc
, "unicast", index
)) {
239 *safi
= SAFI_UNICAST
;
240 } else if (argv_find(argv
, argc
, "multicast", index
)) {
243 *safi
= SAFI_MULTICAST
;
244 } else if (argv_find(argv
, argc
, "labeled-unicast", index
)) {
247 *safi
= SAFI_LABELED_UNICAST
;
248 } else if (argv_find(argv
, argc
, "vpn", index
)) {
251 *safi
= SAFI_MPLS_VPN
;
252 } else if (argv_find(argv
, argc
, "flowspec", index
)) {
255 *safi
= SAFI_FLOWSPEC
;
261 * bgp_vty_find_and_parse_afi_safi_bgp
263 * For a given 'show ...' command, correctly parse the afi/safi/bgp out from it
264 * This function *assumes* that the calling function pre-sets the afi/safi/bgp
265 * to appropriate values for the calling function. This is to allow the
266 * calling function to make decisions appropriate for the show command
267 * that is being parsed.
269 * The show commands are generally of the form:
270 * "show [ip] bgp [<view|vrf> VIEWVRFNAME] [<ipv4|ipv6>
271 * [<unicast|multicast|vpn|labeled-unicast>]] ..."
273 * Since we use argv_find if the show command in particular doesn't have:
275 * [<view|vrf> VIEWVRFNAME]
276 * [<ipv4|ipv6> [<unicast|multicast|vpn|labeled-unicast>]]
277 * The command parsing should still be ok.
279 * vty -> The vty for the command so we can output some useful data in
280 * the event of a parse error in the vrf.
281 * argv -> The command tokens
282 * argc -> How many command tokens we have
283 * idx -> The current place in the command, generally should be 0 for this
285 * afi -> The parsed afi if it was included in the show command, returned here
286 * safi -> The parsed safi if it was included in the show command, returned here
287 * bgp -> Pointer to the bgp data structure we need to fill in.
289 * The function returns the correct location in the parse tree for the
292 * Returns 0 for failure to parse correctly, else the idx position of where
293 * it found the last token.
295 int bgp_vty_find_and_parse_afi_safi_bgp(struct vty
*vty
,
296 struct cmd_token
**argv
, int argc
,
297 int *idx
, afi_t
*afi
, safi_t
*safi
,
300 char *vrf_name
= NULL
;
306 if (argv_find(argv
, argc
, "ip", idx
))
309 if (argv_find(argv
, argc
, "view", idx
)
310 || argv_find(argv
, argc
, "vrf", idx
)) {
311 vrf_name
= argv
[*idx
+ 1]->arg
;
313 if (strmatch(vrf_name
, "all"))
316 *bgp
= bgp_lookup_by_name(vrf_name
);
319 "View/Vrf specified is unknown: %s\n",
326 *bgp
= bgp_get_default();
328 vty_out(vty
, "Unable to find default BGP instance\n");
334 if (argv_find_and_parse_afi(argv
, argc
, idx
, afi
))
335 argv_find_and_parse_safi(argv
, argc
, idx
, safi
);
341 static int peer_address_self_check(struct bgp
*bgp
, union sockunion
*su
)
343 struct interface
*ifp
= NULL
;
345 if (su
->sa
.sa_family
== AF_INET
)
346 ifp
= if_lookup_by_ipv4_exact(&su
->sin
.sin_addr
, bgp
->vrf_id
);
347 else if (su
->sa
.sa_family
== AF_INET6
)
348 ifp
= if_lookup_by_ipv6_exact(&su
->sin6
.sin6_addr
,
349 su
->sin6
.sin6_scope_id
,
358 /* Utility function for looking up peer from VTY. */
359 /* This is used only for configuration, so disallow if attempted on
360 * a dynamic neighbor.
362 static struct peer
*peer_lookup_vty(struct vty
*vty
, const char *ip_str
)
364 struct bgp
*bgp
= VTY_GET_CONTEXT(bgp
);
373 ret
= str2sockunion(ip_str
, &su
);
375 peer
= peer_lookup_by_conf_if(bgp
, ip_str
);
377 if ((peer
= peer_lookup_by_hostname(bgp
, ip_str
))
380 "%% Malformed address or name: %s\n",
386 peer
= peer_lookup(bgp
, &su
);
389 "%% Specify remote-as or peer-group commands first\n");
392 if (peer_dynamic_neighbor(peer
)) {
394 "%% Operation not allowed on a dynamic neighbor\n");
401 /* Utility function for looking up peer or peer group. */
402 /* This is used only for configuration, so disallow if attempted on
403 * a dynamic neighbor.
405 struct peer
*peer_and_group_lookup_vty(struct vty
*vty
, const char *peer_str
)
407 struct bgp
*bgp
= VTY_GET_CONTEXT(bgp
);
410 struct peer
*peer
= NULL
;
411 struct peer_group
*group
= NULL
;
417 ret
= str2sockunion(peer_str
, &su
);
419 /* IP address, locate peer. */
420 peer
= peer_lookup(bgp
, &su
);
422 /* Not IP, could match either peer configured on interface or a
424 peer
= peer_lookup_by_conf_if(bgp
, peer_str
);
426 group
= peer_group_lookup(bgp
, peer_str
);
430 if (peer_dynamic_neighbor(peer
)) {
432 "%% Operation not allowed on a dynamic neighbor\n");
442 vty_out(vty
, "%% Specify remote-as or peer-group commands first\n");
447 int bgp_vty_return(struct vty
*vty
, int ret
)
449 const char *str
= NULL
;
452 case BGP_ERR_INVALID_VALUE
:
453 str
= "Invalid value";
455 case BGP_ERR_INVALID_FLAG
:
456 str
= "Invalid flag";
458 case BGP_ERR_PEER_GROUP_SHUTDOWN
:
459 str
= "Peer-group has been shutdown. Activate the peer-group first";
461 case BGP_ERR_PEER_FLAG_CONFLICT
:
462 str
= "Can't set override-capability and strict-capability-match at the same time";
464 case BGP_ERR_PEER_GROUP_NO_REMOTE_AS
:
465 str
= "Specify remote-as or peer-group remote AS first";
467 case BGP_ERR_PEER_GROUP_CANT_CHANGE
:
468 str
= "Cannot change the peer-group. Deconfigure first";
470 case BGP_ERR_PEER_GROUP_MISMATCH
:
471 str
= "Peer is not a member of this peer-group";
473 case BGP_ERR_PEER_FILTER_CONFLICT
:
474 str
= "Prefix/distribute list can not co-exist";
476 case BGP_ERR_NOT_INTERNAL_PEER
:
477 str
= "Invalid command. Not an internal neighbor";
479 case BGP_ERR_REMOVE_PRIVATE_AS
:
480 str
= "remove-private-AS cannot be configured for IBGP peers";
482 case BGP_ERR_LOCAL_AS_ALLOWED_ONLY_FOR_EBGP
:
483 str
= "Local-AS allowed only for EBGP peers";
485 case BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS
:
486 str
= "Cannot have local-as same as BGP AS number";
488 case BGP_ERR_TCPSIG_FAILED
:
489 str
= "Error while applying TCP-Sig to session(s)";
491 case BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
:
492 str
= "ebgp-multihop and ttl-security cannot be configured together";
494 case BGP_ERR_NO_IBGP_WITH_TTLHACK
:
495 str
= "ttl-security only allowed for EBGP peers";
497 case BGP_ERR_AS_OVERRIDE
:
498 str
= "as-override cannot be configured for IBGP peers";
500 case BGP_ERR_INVALID_DYNAMIC_NEIGHBORS_LIMIT
:
501 str
= "Invalid limit for number of dynamic neighbors";
503 case BGP_ERR_DYNAMIC_NEIGHBORS_RANGE_EXISTS
:
504 str
= "Dynamic neighbor listen range already exists";
506 case BGP_ERR_INVALID_FOR_DYNAMIC_PEER
:
507 str
= "Operation not allowed on a dynamic neighbor";
509 case BGP_ERR_INVALID_FOR_DIRECT_PEER
:
510 str
= "Operation not allowed on a directly connected neighbor";
512 case BGP_ERR_PEER_SAFI_CONFLICT
:
513 str
= "Cannot activate peer for both 'ipv4 unicast' and 'ipv4 labeled-unicast'";
517 vty_out(vty
, "%% %s\n", str
);
518 return CMD_WARNING_CONFIG_FAILED
;
523 /* BGP clear sort. */
532 static void bgp_clear_vty_error(struct vty
*vty
, struct peer
*peer
, afi_t afi
,
533 safi_t safi
, int error
)
536 case BGP_ERR_AF_UNCONFIGURED
:
538 "%%BGP: Enable %s address family for the neighbor %s\n",
539 afi_safi_print(afi
, safi
), peer
->host
);
541 case BGP_ERR_SOFT_RECONFIG_UNCONFIGURED
:
543 "%%BGP: Inbound soft reconfig for %s not possible as it\n has neither refresh capability, nor inbound soft reconfig\n",
551 /* `clear ip bgp' functions. */
552 static int bgp_clear(struct vty
*vty
, struct bgp
*bgp
, afi_t afi
, safi_t safi
,
553 enum clear_sort sort
, enum bgp_clear_type stype
,
559 struct listnode
*node
, *nnode
;
561 /* Clear all neighbors. */
563 * Pass along pointer to next node to peer_clear() when walking all
564 * nodes on the BGP instance as that may get freed if it is a
567 if (sort
== clear_all
) {
568 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
569 if (!peer
->afc
[afi
][safi
])
572 if (stype
== BGP_CLEAR_SOFT_NONE
)
573 ret
= peer_clear(peer
, &nnode
);
575 ret
= peer_clear_soft(peer
, afi
, safi
, stype
);
578 bgp_clear_vty_error(vty
, peer
, afi
, safi
, ret
);
583 /* This is to apply read-only mode on this clear. */
584 if (stype
== BGP_CLEAR_SOFT_NONE
)
585 bgp
->update_delay_over
= 0;
588 vty_out(vty
, "%%BGP: No %s peer configured",
589 afi_safi_print(afi
, safi
));
594 /* Clear specified neighbor. */
595 if (sort
== clear_peer
) {
598 /* Make sockunion for lookup. */
599 ret
= str2sockunion(arg
, &su
);
601 peer
= peer_lookup_by_conf_if(bgp
, arg
);
603 peer
= peer_lookup_by_hostname(bgp
, arg
);
606 "Malformed address or name: %s\n",
612 peer
= peer_lookup(bgp
, &su
);
615 "%%BGP: Unknown neighbor - \"%s\"\n",
621 if (!peer
->afc
[afi
][safi
])
622 ret
= BGP_ERR_AF_UNCONFIGURED
;
623 else if (stype
== BGP_CLEAR_SOFT_NONE
)
624 ret
= peer_clear(peer
, NULL
);
626 ret
= peer_clear_soft(peer
, afi
, safi
, stype
);
629 bgp_clear_vty_error(vty
, peer
, afi
, safi
, ret
);
634 /* Clear all neighbors belonging to a specific peer-group. */
635 if (sort
== clear_group
) {
636 struct peer_group
*group
;
638 group
= peer_group_lookup(bgp
, arg
);
640 vty_out(vty
, "%%BGP: No such peer-group %s\n", arg
);
644 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
645 if (!peer
->afc
[afi
][safi
])
648 if (stype
== BGP_CLEAR_SOFT_NONE
)
649 ret
= peer_clear(peer
, NULL
);
651 ret
= peer_clear_soft(peer
, afi
, safi
, stype
);
654 bgp_clear_vty_error(vty
, peer
, afi
, safi
, ret
);
661 "%%BGP: No %s peer belonging to peer-group %s is configured\n",
662 afi_safi_print(afi
, safi
), arg
);
667 /* Clear all external (eBGP) neighbors. */
668 if (sort
== clear_external
) {
669 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
670 if (peer
->sort
== BGP_PEER_IBGP
)
673 if (!peer
->afc
[afi
][safi
])
676 if (stype
== BGP_CLEAR_SOFT_NONE
)
677 ret
= peer_clear(peer
, &nnode
);
679 ret
= peer_clear_soft(peer
, afi
, safi
, stype
);
682 bgp_clear_vty_error(vty
, peer
, afi
, safi
, ret
);
689 "%%BGP: No external %s peer is configured\n",
690 afi_safi_print(afi
, safi
));
695 /* Clear all neighbors belonging to a specific AS. */
696 if (sort
== clear_as
) {
697 as_t as
= strtoul(arg
, NULL
, 10);
699 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
703 if (!peer
->afc
[afi
][safi
])
704 ret
= BGP_ERR_AF_UNCONFIGURED
;
705 else if (stype
== BGP_CLEAR_SOFT_NONE
)
706 ret
= peer_clear(peer
, &nnode
);
708 ret
= peer_clear_soft(peer
, afi
, safi
, stype
);
711 bgp_clear_vty_error(vty
, peer
, afi
, safi
, ret
);
718 "%%BGP: No %s peer is configured with AS %s\n",
719 afi_safi_print(afi
, safi
), arg
);
727 static int bgp_clear_vty(struct vty
*vty
, const char *name
, afi_t afi
,
728 safi_t safi
, enum clear_sort sort
,
729 enum bgp_clear_type stype
, const char *arg
)
733 /* BGP structure lookup. */
735 bgp
= bgp_lookup_by_name(name
);
737 vty_out(vty
, "Can't find BGP instance %s\n", name
);
741 bgp
= bgp_get_default();
743 vty_out(vty
, "No BGP process is configured\n");
748 return bgp_clear(vty
, bgp
, afi
, safi
, sort
, stype
, arg
);
751 /* clear soft inbound */
752 static void bgp_clear_star_soft_in(struct vty
*vty
, const char *name
)
754 bgp_clear_vty(vty
, name
, AFI_IP
, SAFI_UNICAST
, clear_all
,
755 BGP_CLEAR_SOFT_IN
, NULL
);
756 bgp_clear_vty(vty
, name
, AFI_IP6
, SAFI_UNICAST
, clear_all
,
757 BGP_CLEAR_SOFT_IN
, NULL
);
760 /* clear soft outbound */
761 static void bgp_clear_star_soft_out(struct vty
*vty
, const char *name
)
763 bgp_clear_vty(vty
, name
, AFI_IP
, SAFI_UNICAST
, clear_all
,
764 BGP_CLEAR_SOFT_OUT
, NULL
);
765 bgp_clear_vty(vty
, name
, AFI_IP6
, SAFI_UNICAST
, clear_all
,
766 BGP_CLEAR_SOFT_OUT
, NULL
);
770 #ifndef VTYSH_EXTRACT_PL
771 #include "bgpd/bgp_vty_clippy.c"
774 /* BGP global configuration. */
775 #if defined(VERSION_TYPE_DEV) && (CONFDATE > 20190601)
776 CPP_NOTICE("bgpd: time to remove deprecated bgp multiple-instance")
777 CPP_NOTICE("This includes BGP_OPT_MULTIPLE_INSTANCE")
779 DEFUN_HIDDEN (bgp_multiple_instance_func
,
780 bgp_multiple_instance_cmd
,
781 "bgp multiple-instance",
783 "Enable bgp multiple instance\n")
785 bgp_option_set(BGP_OPT_MULTIPLE_INSTANCE
);
789 DEFUN_HIDDEN (no_bgp_multiple_instance
,
790 no_bgp_multiple_instance_cmd
,
791 "no bgp multiple-instance",
794 "BGP multiple instance\n")
798 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
799 vty_out(vty
, "if you are using this please let the developers know\n");
800 zlog_warn("Deprecated option: `bgp multiple-instance` being used");
801 ret
= bgp_option_unset(BGP_OPT_MULTIPLE_INSTANCE
);
803 vty_out(vty
, "%% There are more than two BGP instances\n");
804 return CMD_WARNING_CONFIG_FAILED
;
809 #if defined(VERSION_TYPE_DEV) && (CONFDATE > 20190601)
810 CPP_NOTICE("bgpd: time to remove deprecated cli bgp config-type cisco")
811 CPP_NOTICE("This includes BGP_OPT_CISCO_CONFIG")
813 DEFUN_HIDDEN (bgp_config_type
,
815 "bgp config-type <cisco|zebra>",
817 "Configuration type\n"
822 if (argv_find(argv
, argc
, "cisco", &idx
)) {
823 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
824 vty_out(vty
, "if you are using this please let the developers know!\n");
825 zlog_warn("Deprecated option: `bgp config-type cisco` being used");
826 bgp_option_set(BGP_OPT_CONFIG_CISCO
);
828 bgp_option_unset(BGP_OPT_CONFIG_CISCO
);
833 DEFUN_HIDDEN (no_bgp_config_type
,
834 no_bgp_config_type_cmd
,
835 "no bgp config-type [<cisco|zebra>]",
838 "Display configuration type\n"
842 bgp_option_unset(BGP_OPT_CONFIG_CISCO
);
847 DEFUN (no_synchronization
,
848 no_synchronization_cmd
,
849 "no synchronization",
851 "Perform IGP synchronization\n")
856 DEFUN (no_auto_summary
,
860 "Enable automatic network number summarization\n")
865 /* "router bgp" commands. */
866 DEFUN_NOSH (router_bgp
,
868 "router bgp [(1-4294967295) [<view|vrf> VIEWVRFNAME]]",
872 BGP_INSTANCE_HELP_STR
)
875 int idx_view_vrf
= 3;
880 const char *name
= NULL
;
881 enum bgp_instance_type inst_type
;
883 // "router bgp" without an ASN
885 // Pending: Make VRF option available for ASN less config
886 bgp
= bgp_get_default();
889 vty_out(vty
, "%% No BGP process is configured\n");
890 return CMD_WARNING_CONFIG_FAILED
;
893 if (listcount(bm
->bgp
) > 1) {
894 vty_out(vty
, "%% Please specify ASN and VRF\n");
895 return CMD_WARNING_CONFIG_FAILED
;
901 as
= strtoul(argv
[idx_asn
]->arg
, NULL
, 10);
903 inst_type
= BGP_INSTANCE_TYPE_DEFAULT
;
905 name
= argv
[idx_vrf
]->arg
;
907 if (!strcmp(argv
[idx_view_vrf
]->text
, "vrf"))
908 inst_type
= BGP_INSTANCE_TYPE_VRF
;
909 else if (!strcmp(argv
[idx_view_vrf
]->text
, "view"))
910 inst_type
= BGP_INSTANCE_TYPE_VIEW
;
913 ret
= bgp_get(&bgp
, &as
, name
, inst_type
);
915 case BGP_ERR_MULTIPLE_INSTANCE_NOT_SET
:
917 "Please specify 'bgp multiple-instance' first\n");
918 return CMD_WARNING_CONFIG_FAILED
;
919 case BGP_ERR_AS_MISMATCH
:
920 vty_out(vty
, "BGP is already running; AS is %u\n", as
);
921 return CMD_WARNING_CONFIG_FAILED
;
922 case BGP_ERR_INSTANCE_MISMATCH
:
924 "BGP instance name and AS number mismatch\n");
926 "BGP instance is already running; AS is %u\n",
928 return CMD_WARNING_CONFIG_FAILED
;
931 /* Pending: handle when user tries to change a view to vrf n vv.
935 /* unset the auto created flag as the user config is now present */
936 UNSET_FLAG(bgp
->vrf_flags
, BGP_VRF_AUTO
);
937 VTY_PUSH_CONTEXT(BGP_NODE
, bgp
);
942 /* "no router bgp" commands. */
943 DEFUN (no_router_bgp
,
945 "no router bgp [(1-4294967295) [<view|vrf> VIEWVRFNAME]]",
950 BGP_INSTANCE_HELP_STR
)
956 const char *name
= NULL
;
958 // "no router bgp" without an ASN
960 // Pending: Make VRF option available for ASN less config
961 bgp
= bgp_get_default();
964 vty_out(vty
, "%% No BGP process is configured\n");
965 return CMD_WARNING_CONFIG_FAILED
;
968 if (listcount(bm
->bgp
) > 1) {
969 vty_out(vty
, "%% Please specify ASN and VRF\n");
970 return CMD_WARNING_CONFIG_FAILED
;
974 vty_out(vty
, "%% Please unconfigure l3vni %u",
976 return CMD_WARNING_CONFIG_FAILED
;
979 as
= strtoul(argv
[idx_asn
]->arg
, NULL
, 10);
982 name
= argv
[idx_vrf
]->arg
;
984 /* Lookup bgp structure. */
985 bgp
= bgp_lookup(as
, name
);
987 vty_out(vty
, "%% Can't find BGP instance\n");
988 return CMD_WARNING_CONFIG_FAILED
;
992 vty_out(vty
, "%% Please unconfigure l3vni %u",
994 return CMD_WARNING_CONFIG_FAILED
;
1004 /* BGP router-id. */
1006 DEFPY (bgp_router_id
,
1008 "bgp router-id A.B.C.D",
1010 "Override configured router identifier\n"
1011 "Manually configured router identifier\n")
1013 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1014 bgp_router_id_static_set(bgp
, router_id
);
1018 DEFPY (no_bgp_router_id
,
1019 no_bgp_router_id_cmd
,
1020 "no bgp router-id [A.B.C.D]",
1023 "Override configured router identifier\n"
1024 "Manually configured router identifier\n")
1026 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1028 if (router_id_str
) {
1029 if (!IPV4_ADDR_SAME(&bgp
->router_id_static
, &router_id
)) {
1030 vty_out(vty
, "%% BGP router-id doesn't match\n");
1031 return CMD_WARNING_CONFIG_FAILED
;
1035 router_id
.s_addr
= 0;
1036 bgp_router_id_static_set(bgp
, router_id
);
1042 /* BGP Cluster ID. */
1043 DEFUN (bgp_cluster_id
,
1045 "bgp cluster-id <A.B.C.D|(1-4294967295)>",
1047 "Configure Route-Reflector Cluster-id\n"
1048 "Route-Reflector Cluster-id in IP address format\n"
1049 "Route-Reflector Cluster-id as 32 bit quantity\n")
1051 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1054 struct in_addr cluster
;
1056 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &cluster
);
1058 vty_out(vty
, "%% Malformed bgp cluster identifier\n");
1059 return CMD_WARNING_CONFIG_FAILED
;
1062 bgp_cluster_id_set(bgp
, &cluster
);
1063 bgp_clear_star_soft_out(vty
, bgp
->name
);
1068 DEFUN (no_bgp_cluster_id
,
1069 no_bgp_cluster_id_cmd
,
1070 "no bgp cluster-id [<A.B.C.D|(1-4294967295)>]",
1073 "Configure Route-Reflector Cluster-id\n"
1074 "Route-Reflector Cluster-id in IP address format\n"
1075 "Route-Reflector Cluster-id as 32 bit quantity\n")
1077 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1078 bgp_cluster_id_unset(bgp
);
1079 bgp_clear_star_soft_out(vty
, bgp
->name
);
1084 DEFUN (bgp_confederation_identifier
,
1085 bgp_confederation_identifier_cmd
,
1086 "bgp confederation identifier (1-4294967295)",
1087 "BGP specific commands\n"
1088 "AS confederation parameters\n"
1090 "Set routing domain confederation AS\n")
1092 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1096 as
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1098 bgp_confederation_id_set(bgp
, as
);
1103 DEFUN (no_bgp_confederation_identifier
,
1104 no_bgp_confederation_identifier_cmd
,
1105 "no bgp confederation identifier [(1-4294967295)]",
1107 "BGP specific commands\n"
1108 "AS confederation parameters\n"
1110 "Set routing domain confederation AS\n")
1112 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1113 bgp_confederation_id_unset(bgp
);
1118 DEFUN (bgp_confederation_peers
,
1119 bgp_confederation_peers_cmd
,
1120 "bgp confederation peers (1-4294967295)...",
1121 "BGP specific commands\n"
1122 "AS confederation parameters\n"
1123 "Peer ASs in BGP confederation\n"
1126 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1131 for (i
= idx_asn
; i
< argc
; i
++) {
1132 as
= strtoul(argv
[i
]->arg
, NULL
, 10);
1134 if (bgp
->as
== as
) {
1136 "%% Local member-AS not allowed in confed peer list\n");
1140 bgp_confederation_peers_add(bgp
, as
);
1145 DEFUN (no_bgp_confederation_peers
,
1146 no_bgp_confederation_peers_cmd
,
1147 "no bgp confederation peers (1-4294967295)...",
1149 "BGP specific commands\n"
1150 "AS confederation parameters\n"
1151 "Peer ASs in BGP confederation\n"
1154 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1159 for (i
= idx_asn
; i
< argc
; i
++) {
1160 as
= strtoul(argv
[i
]->arg
, NULL
, 10);
1162 bgp_confederation_peers_remove(bgp
, as
);
1168 * Central routine for maximum-paths configuration.
1169 * @peer_type: BGP_PEER_EBGP or BGP_PEER_IBGP
1170 * @set: 1 for setting values, 0 for removing the max-paths config.
1172 static int bgp_maxpaths_config_vty(struct vty
*vty
, int peer_type
,
1173 const char *mpaths
, uint16_t options
,
1176 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1177 uint16_t maxpaths
= 0;
1182 afi
= bgp_node_afi(vty
);
1183 safi
= bgp_node_safi(vty
);
1186 maxpaths
= strtol(mpaths
, NULL
, 10);
1187 if (maxpaths
> multipath_num
) {
1189 "%% Maxpaths Specified: %d is > than multipath num specified on bgp command line %d",
1190 maxpaths
, multipath_num
);
1191 return CMD_WARNING_CONFIG_FAILED
;
1193 ret
= bgp_maximum_paths_set(bgp
, afi
, safi
, peer_type
, maxpaths
,
1196 ret
= bgp_maximum_paths_unset(bgp
, afi
, safi
, peer_type
);
1200 "%% Failed to %sset maximum-paths %s %u for afi %u, safi %u\n",
1201 (set
== 1) ? "" : "un",
1202 (peer_type
== BGP_PEER_EBGP
) ? "ebgp" : "ibgp",
1203 maxpaths
, afi
, safi
);
1204 return CMD_WARNING_CONFIG_FAILED
;
1207 bgp_recalculate_all_bestpaths(bgp
);
1212 DEFUN (bgp_maxmed_admin
,
1213 bgp_maxmed_admin_cmd
,
1214 "bgp max-med administrative ",
1216 "Advertise routes with max-med\n"
1217 "Administratively applied, for an indefinite period\n")
1219 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1221 bgp
->v_maxmed_admin
= 1;
1222 bgp
->maxmed_admin_value
= BGP_MAXMED_VALUE_DEFAULT
;
1224 bgp_maxmed_update(bgp
);
1229 DEFUN (bgp_maxmed_admin_medv
,
1230 bgp_maxmed_admin_medv_cmd
,
1231 "bgp max-med administrative (0-4294967295)",
1233 "Advertise routes with max-med\n"
1234 "Administratively applied, for an indefinite period\n"
1235 "Max MED value to be used\n")
1237 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1240 bgp
->v_maxmed_admin
= 1;
1241 bgp
->maxmed_admin_value
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1243 bgp_maxmed_update(bgp
);
1248 DEFUN (no_bgp_maxmed_admin
,
1249 no_bgp_maxmed_admin_cmd
,
1250 "no bgp max-med administrative [(0-4294967295)]",
1253 "Advertise routes with max-med\n"
1254 "Administratively applied, for an indefinite period\n"
1255 "Max MED value to be used\n")
1257 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1258 bgp
->v_maxmed_admin
= BGP_MAXMED_ADMIN_UNCONFIGURED
;
1259 bgp
->maxmed_admin_value
= BGP_MAXMED_VALUE_DEFAULT
;
1260 bgp_maxmed_update(bgp
);
1265 DEFUN (bgp_maxmed_onstartup
,
1266 bgp_maxmed_onstartup_cmd
,
1267 "bgp max-med on-startup (5-86400) [(0-4294967295)]",
1269 "Advertise routes with max-med\n"
1270 "Effective on a startup\n"
1271 "Time (seconds) period for max-med\n"
1272 "Max MED value to be used\n")
1274 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1277 argv_find(argv
, argc
, "(5-86400)", &idx
);
1278 bgp
->v_maxmed_onstartup
= strtoul(argv
[idx
]->arg
, NULL
, 10);
1279 if (argv_find(argv
, argc
, "(0-4294967295)", &idx
))
1280 bgp
->maxmed_onstartup_value
= strtoul(argv
[idx
]->arg
, NULL
, 10);
1282 bgp
->maxmed_onstartup_value
= BGP_MAXMED_VALUE_DEFAULT
;
1284 bgp_maxmed_update(bgp
);
1289 DEFUN (no_bgp_maxmed_onstartup
,
1290 no_bgp_maxmed_onstartup_cmd
,
1291 "no bgp max-med on-startup [(5-86400) [(0-4294967295)]]",
1294 "Advertise routes with max-med\n"
1295 "Effective on a startup\n"
1296 "Time (seconds) period for max-med\n"
1297 "Max MED value to be used\n")
1299 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1301 /* Cancel max-med onstartup if its on */
1302 if (bgp
->t_maxmed_onstartup
) {
1303 THREAD_TIMER_OFF(bgp
->t_maxmed_onstartup
);
1304 bgp
->maxmed_onstartup_over
= 1;
1307 bgp
->v_maxmed_onstartup
= BGP_MAXMED_ONSTARTUP_UNCONFIGURED
;
1308 bgp
->maxmed_onstartup_value
= BGP_MAXMED_VALUE_DEFAULT
;
1310 bgp_maxmed_update(bgp
);
1315 static int bgp_update_delay_config_vty(struct vty
*vty
, const char *delay
,
1318 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1319 uint16_t update_delay
;
1320 uint16_t establish_wait
;
1322 update_delay
= strtoul(delay
, NULL
, 10);
1324 if (!wait
) /* update-delay <delay> */
1326 bgp
->v_update_delay
= update_delay
;
1327 bgp
->v_establish_wait
= bgp
->v_update_delay
;
1331 /* update-delay <delay> <establish-wait> */
1332 establish_wait
= atoi(wait
);
1333 if (update_delay
< establish_wait
) {
1335 "%%Failed: update-delay less than the establish-wait!\n");
1336 return CMD_WARNING_CONFIG_FAILED
;
1339 bgp
->v_update_delay
= update_delay
;
1340 bgp
->v_establish_wait
= establish_wait
;
1345 static int bgp_update_delay_deconfig_vty(struct vty
*vty
)
1347 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1349 bgp
->v_update_delay
= BGP_UPDATE_DELAY_DEF
;
1350 bgp
->v_establish_wait
= bgp
->v_update_delay
;
1355 void bgp_config_write_update_delay(struct vty
*vty
, struct bgp
*bgp
)
1357 if (bgp
->v_update_delay
!= BGP_UPDATE_DELAY_DEF
) {
1358 vty_out(vty
, " update-delay %d", bgp
->v_update_delay
);
1359 if (bgp
->v_update_delay
!= bgp
->v_establish_wait
)
1360 vty_out(vty
, " %d", bgp
->v_establish_wait
);
1366 /* Update-delay configuration */
1367 DEFUN (bgp_update_delay
,
1368 bgp_update_delay_cmd
,
1369 "update-delay (0-3600)",
1370 "Force initial delay for best-path and updates\n"
1374 return bgp_update_delay_config_vty(vty
, argv
[idx_number
]->arg
, NULL
);
1377 DEFUN (bgp_update_delay_establish_wait
,
1378 bgp_update_delay_establish_wait_cmd
,
1379 "update-delay (0-3600) (1-3600)",
1380 "Force initial delay for best-path and updates\n"
1385 int idx_number_2
= 2;
1386 return bgp_update_delay_config_vty(vty
, argv
[idx_number
]->arg
,
1387 argv
[idx_number_2
]->arg
);
1390 /* Update-delay deconfiguration */
1391 DEFUN (no_bgp_update_delay
,
1392 no_bgp_update_delay_cmd
,
1393 "no update-delay [(0-3600) [(1-3600)]]",
1395 "Force initial delay for best-path and updates\n"
1399 return bgp_update_delay_deconfig_vty(vty
);
1403 static int bgp_wpkt_quanta_config_vty(struct vty
*vty
, const char *num
,
1406 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1409 uint32_t quanta
= strtoul(num
, NULL
, 10);
1410 atomic_store_explicit(&bgp
->wpkt_quanta
, quanta
,
1411 memory_order_relaxed
);
1413 atomic_store_explicit(&bgp
->wpkt_quanta
, BGP_WRITE_PACKET_MAX
,
1414 memory_order_relaxed
);
1420 static int bgp_rpkt_quanta_config_vty(struct vty
*vty
, const char *num
,
1423 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1426 uint32_t quanta
= strtoul(num
, NULL
, 10);
1427 atomic_store_explicit(&bgp
->rpkt_quanta
, quanta
,
1428 memory_order_relaxed
);
1430 atomic_store_explicit(&bgp
->rpkt_quanta
, BGP_READ_PACKET_MAX
,
1431 memory_order_relaxed
);
1437 void bgp_config_write_wpkt_quanta(struct vty
*vty
, struct bgp
*bgp
)
1440 atomic_load_explicit(&bgp
->wpkt_quanta
, memory_order_relaxed
);
1441 if (quanta
!= BGP_WRITE_PACKET_MAX
)
1442 vty_out(vty
, " write-quanta %d\n", quanta
);
1445 void bgp_config_write_rpkt_quanta(struct vty
*vty
, struct bgp
*bgp
)
1448 atomic_load_explicit(&bgp
->rpkt_quanta
, memory_order_relaxed
);
1449 if (quanta
!= BGP_READ_PACKET_MAX
)
1450 vty_out(vty
, " read-quanta %d\n", quanta
);
1453 /* Packet quanta configuration */
1454 DEFUN (bgp_wpkt_quanta
,
1455 bgp_wpkt_quanta_cmd
,
1456 "write-quanta (1-10)",
1457 "How many packets to write to peer socket per run\n"
1458 "Number of packets\n")
1461 return bgp_wpkt_quanta_config_vty(vty
, argv
[idx_number
]->arg
, 1);
1464 DEFUN (no_bgp_wpkt_quanta
,
1465 no_bgp_wpkt_quanta_cmd
,
1466 "no write-quanta (1-10)",
1468 "How many packets to write to peer socket per I/O cycle\n"
1469 "Number of packets\n")
1472 return bgp_wpkt_quanta_config_vty(vty
, argv
[idx_number
]->arg
, 0);
1475 DEFUN (bgp_rpkt_quanta
,
1476 bgp_rpkt_quanta_cmd
,
1477 "read-quanta (1-10)",
1478 "How many packets to read from peer socket per I/O cycle\n"
1479 "Number of packets\n")
1482 return bgp_rpkt_quanta_config_vty(vty
, argv
[idx_number
]->arg
, 1);
1485 DEFUN (no_bgp_rpkt_quanta
,
1486 no_bgp_rpkt_quanta_cmd
,
1487 "no read-quanta (1-10)",
1489 "How many packets to read from peer socket per I/O cycle\n"
1490 "Number of packets\n")
1493 return bgp_rpkt_quanta_config_vty(vty
, argv
[idx_number
]->arg
, 0);
1496 void bgp_config_write_coalesce_time(struct vty
*vty
, struct bgp
*bgp
)
1498 if (!bgp
->heuristic_coalesce
)
1499 vty_out(vty
, " coalesce-time %u\n", bgp
->coalesce_time
);
1503 DEFUN (bgp_coalesce_time
,
1504 bgp_coalesce_time_cmd
,
1505 "coalesce-time (0-4294967295)",
1506 "Subgroup coalesce timer\n"
1507 "Subgroup coalesce timer value (in ms)\n")
1509 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1512 argv_find(argv
, argc
, "(0-4294967295)", &idx
);
1513 bgp
->heuristic_coalesce
= false;
1514 bgp
->coalesce_time
= strtoul(argv
[idx
]->arg
, NULL
, 10);
1518 DEFUN (no_bgp_coalesce_time
,
1519 no_bgp_coalesce_time_cmd
,
1520 "no coalesce-time (0-4294967295)",
1522 "Subgroup coalesce timer\n"
1523 "Subgroup coalesce timer value (in ms)\n")
1525 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1527 bgp
->heuristic_coalesce
= true;
1528 bgp
->coalesce_time
= BGP_DEFAULT_SUBGROUP_COALESCE_TIME
;
1532 /* Maximum-paths configuration */
1533 DEFUN (bgp_maxpaths
,
1535 "maximum-paths " CMD_RANGE_STR(1, MULTIPATH_NUM
),
1536 "Forward packets over multiple paths\n"
1537 "Number of paths\n")
1540 return bgp_maxpaths_config_vty(vty
, BGP_PEER_EBGP
,
1541 argv
[idx_number
]->arg
, 0, 1);
1544 ALIAS_HIDDEN(bgp_maxpaths
, bgp_maxpaths_hidden_cmd
,
1545 "maximum-paths " CMD_RANGE_STR(1, MULTIPATH_NUM
),
1546 "Forward packets over multiple paths\n"
1547 "Number of paths\n")
1549 DEFUN (bgp_maxpaths_ibgp
,
1550 bgp_maxpaths_ibgp_cmd
,
1551 "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM
),
1552 "Forward packets over multiple paths\n"
1554 "Number of paths\n")
1557 return bgp_maxpaths_config_vty(vty
, BGP_PEER_IBGP
,
1558 argv
[idx_number
]->arg
, 0, 1);
1561 ALIAS_HIDDEN(bgp_maxpaths_ibgp
, bgp_maxpaths_ibgp_hidden_cmd
,
1562 "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM
),
1563 "Forward packets over multiple paths\n"
1565 "Number of paths\n")
1567 DEFUN (bgp_maxpaths_ibgp_cluster
,
1568 bgp_maxpaths_ibgp_cluster_cmd
,
1569 "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM
) " equal-cluster-length",
1570 "Forward packets over multiple paths\n"
1573 "Match the cluster length\n")
1576 return bgp_maxpaths_config_vty(
1577 vty
, BGP_PEER_IBGP
, argv
[idx_number
]->arg
,
1578 BGP_FLAG_IBGP_MULTIPATH_SAME_CLUSTERLEN
, 1);
1581 ALIAS_HIDDEN(bgp_maxpaths_ibgp_cluster
, bgp_maxpaths_ibgp_cluster_hidden_cmd
,
1582 "maximum-paths ibgp " CMD_RANGE_STR(
1583 1, MULTIPATH_NUM
) " equal-cluster-length",
1584 "Forward packets over multiple paths\n"
1587 "Match the cluster length\n")
1589 DEFUN (no_bgp_maxpaths
,
1590 no_bgp_maxpaths_cmd
,
1591 "no maximum-paths [" CMD_RANGE_STR(1, MULTIPATH_NUM
) "]",
1593 "Forward packets over multiple paths\n"
1594 "Number of paths\n")
1596 return bgp_maxpaths_config_vty(vty
, BGP_PEER_EBGP
, NULL
, 0, 0);
1599 ALIAS_HIDDEN(no_bgp_maxpaths
, no_bgp_maxpaths_hidden_cmd
,
1600 "no maximum-paths [" CMD_RANGE_STR(1, MULTIPATH_NUM
) "]", NO_STR
1601 "Forward packets over multiple paths\n"
1602 "Number of paths\n")
1604 DEFUN (no_bgp_maxpaths_ibgp
,
1605 no_bgp_maxpaths_ibgp_cmd
,
1606 "no maximum-paths ibgp [" CMD_RANGE_STR(1, MULTIPATH_NUM
) " [equal-cluster-length]]",
1608 "Forward packets over multiple paths\n"
1611 "Match the cluster length\n")
1613 return bgp_maxpaths_config_vty(vty
, BGP_PEER_IBGP
, NULL
, 0, 0);
1616 ALIAS_HIDDEN(no_bgp_maxpaths_ibgp
, no_bgp_maxpaths_ibgp_hidden_cmd
,
1617 "no maximum-paths ibgp [" CMD_RANGE_STR(
1618 1, MULTIPATH_NUM
) " [equal-cluster-length]]",
1620 "Forward packets over multiple paths\n"
1623 "Match the cluster length\n")
1625 void bgp_config_write_maxpaths(struct vty
*vty
, struct bgp
*bgp
, afi_t afi
,
1628 if (bgp
->maxpaths
[afi
][safi
].maxpaths_ebgp
!= MULTIPATH_NUM
) {
1629 vty_out(vty
, " maximum-paths %d\n",
1630 bgp
->maxpaths
[afi
][safi
].maxpaths_ebgp
);
1633 if (bgp
->maxpaths
[afi
][safi
].maxpaths_ibgp
!= MULTIPATH_NUM
) {
1634 vty_out(vty
, " maximum-paths ibgp %d",
1635 bgp
->maxpaths
[afi
][safi
].maxpaths_ibgp
);
1636 if (CHECK_FLAG(bgp
->maxpaths
[afi
][safi
].ibgp_flags
,
1637 BGP_FLAG_IBGP_MULTIPATH_SAME_CLUSTERLEN
))
1638 vty_out(vty
, " equal-cluster-length");
1647 "timers bgp (0-65535) (0-65535)",
1648 "Adjust routing timers\n"
1650 "Keepalive interval\n"
1653 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1655 int idx_number_2
= 3;
1656 unsigned long keepalive
= 0;
1657 unsigned long holdtime
= 0;
1659 keepalive
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1660 holdtime
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
1662 /* Holdtime value check. */
1663 if (holdtime
< 3 && holdtime
!= 0) {
1665 "%% hold time value must be either 0 or greater than 3\n");
1666 return CMD_WARNING_CONFIG_FAILED
;
1669 bgp_timers_set(bgp
, keepalive
, holdtime
);
1674 DEFUN (no_bgp_timers
,
1676 "no timers bgp [(0-65535) (0-65535)]",
1678 "Adjust routing timers\n"
1680 "Keepalive interval\n"
1683 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1684 bgp_timers_unset(bgp
);
1690 DEFUN (bgp_client_to_client_reflection
,
1691 bgp_client_to_client_reflection_cmd
,
1692 "bgp client-to-client reflection",
1693 "BGP specific commands\n"
1694 "Configure client to client route reflection\n"
1695 "reflection of routes allowed\n")
1697 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1698 bgp_flag_unset(bgp
, BGP_FLAG_NO_CLIENT_TO_CLIENT
);
1699 bgp_clear_star_soft_out(vty
, bgp
->name
);
1704 DEFUN (no_bgp_client_to_client_reflection
,
1705 no_bgp_client_to_client_reflection_cmd
,
1706 "no bgp client-to-client reflection",
1708 "BGP specific commands\n"
1709 "Configure client to client route reflection\n"
1710 "reflection of routes allowed\n")
1712 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1713 bgp_flag_set(bgp
, BGP_FLAG_NO_CLIENT_TO_CLIENT
);
1714 bgp_clear_star_soft_out(vty
, bgp
->name
);
1719 /* "bgp always-compare-med" configuration. */
1720 DEFUN (bgp_always_compare_med
,
1721 bgp_always_compare_med_cmd
,
1722 "bgp always-compare-med",
1723 "BGP specific commands\n"
1724 "Allow comparing MED from different neighbors\n")
1726 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1727 bgp_flag_set(bgp
, BGP_FLAG_ALWAYS_COMPARE_MED
);
1728 bgp_recalculate_all_bestpaths(bgp
);
1733 DEFUN (no_bgp_always_compare_med
,
1734 no_bgp_always_compare_med_cmd
,
1735 "no bgp always-compare-med",
1737 "BGP specific commands\n"
1738 "Allow comparing MED from different neighbors\n")
1740 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1741 bgp_flag_unset(bgp
, BGP_FLAG_ALWAYS_COMPARE_MED
);
1742 bgp_recalculate_all_bestpaths(bgp
);
1747 /* "bgp deterministic-med" configuration. */
1748 DEFUN (bgp_deterministic_med
,
1749 bgp_deterministic_med_cmd
,
1750 "bgp deterministic-med",
1751 "BGP specific commands\n"
1752 "Pick the best-MED path among paths advertised from the neighboring AS\n")
1754 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1756 if (!bgp_flag_check(bgp
, BGP_FLAG_DETERMINISTIC_MED
)) {
1757 bgp_flag_set(bgp
, BGP_FLAG_DETERMINISTIC_MED
);
1758 bgp_recalculate_all_bestpaths(bgp
);
1764 DEFUN (no_bgp_deterministic_med
,
1765 no_bgp_deterministic_med_cmd
,
1766 "no bgp deterministic-med",
1768 "BGP specific commands\n"
1769 "Pick the best-MED path among paths advertised from the neighboring AS\n")
1771 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1772 int bestpath_per_as_used
;
1776 struct listnode
*node
, *nnode
;
1778 if (bgp_flag_check(bgp
, BGP_FLAG_DETERMINISTIC_MED
)) {
1779 bestpath_per_as_used
= 0;
1781 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
1782 FOREACH_AFI_SAFI (afi
, safi
)
1784 peer
->af_flags
[afi
][safi
],
1785 PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS
)) {
1786 bestpath_per_as_used
= 1;
1790 if (bestpath_per_as_used
)
1794 if (bestpath_per_as_used
) {
1796 "bgp deterministic-med cannot be disabled while addpath-tx-bestpath-per-AS is in use\n");
1797 return CMD_WARNING_CONFIG_FAILED
;
1799 bgp_flag_unset(bgp
, BGP_FLAG_DETERMINISTIC_MED
);
1800 bgp_recalculate_all_bestpaths(bgp
);
1807 /* "bgp graceful-restart" configuration. */
1808 DEFUN (bgp_graceful_restart
,
1809 bgp_graceful_restart_cmd
,
1810 "bgp graceful-restart",
1811 "BGP specific commands\n"
1812 "Graceful restart capability parameters\n")
1814 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1815 bgp_flag_set(bgp
, BGP_FLAG_GRACEFUL_RESTART
);
1819 DEFUN (no_bgp_graceful_restart
,
1820 no_bgp_graceful_restart_cmd
,
1821 "no bgp graceful-restart",
1823 "BGP specific commands\n"
1824 "Graceful restart capability parameters\n")
1826 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1827 bgp_flag_unset(bgp
, BGP_FLAG_GRACEFUL_RESTART
);
1831 DEFUN (bgp_graceful_restart_stalepath_time
,
1832 bgp_graceful_restart_stalepath_time_cmd
,
1833 "bgp graceful-restart stalepath-time (1-3600)",
1834 "BGP specific commands\n"
1835 "Graceful restart capability parameters\n"
1836 "Set the max time to hold onto restarting peer's stale paths\n"
1837 "Delay value (seconds)\n")
1839 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1843 stalepath
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1844 bgp
->stalepath_time
= stalepath
;
1848 DEFUN (bgp_graceful_restart_restart_time
,
1849 bgp_graceful_restart_restart_time_cmd
,
1850 "bgp graceful-restart restart-time (1-3600)",
1851 "BGP specific commands\n"
1852 "Graceful restart capability parameters\n"
1853 "Set the time to wait to delete stale routes before a BGP open message is received\n"
1854 "Delay value (seconds)\n")
1856 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1860 restart
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1861 bgp
->restart_time
= restart
;
1865 DEFUN (no_bgp_graceful_restart_stalepath_time
,
1866 no_bgp_graceful_restart_stalepath_time_cmd
,
1867 "no bgp graceful-restart stalepath-time [(1-3600)]",
1869 "BGP specific commands\n"
1870 "Graceful restart capability parameters\n"
1871 "Set the max time to hold onto restarting peer's stale paths\n"
1872 "Delay value (seconds)\n")
1874 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1876 bgp
->stalepath_time
= BGP_DEFAULT_STALEPATH_TIME
;
1880 DEFUN (no_bgp_graceful_restart_restart_time
,
1881 no_bgp_graceful_restart_restart_time_cmd
,
1882 "no bgp graceful-restart restart-time [(1-3600)]",
1884 "BGP specific commands\n"
1885 "Graceful restart capability parameters\n"
1886 "Set the time to wait to delete stale routes before a BGP open message is received\n"
1887 "Delay value (seconds)\n")
1889 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1891 bgp
->restart_time
= BGP_DEFAULT_RESTART_TIME
;
1895 DEFUN (bgp_graceful_restart_preserve_fw
,
1896 bgp_graceful_restart_preserve_fw_cmd
,
1897 "bgp graceful-restart preserve-fw-state",
1898 "BGP specific commands\n"
1899 "Graceful restart capability parameters\n"
1900 "Sets F-bit indication that fib is preserved while doing Graceful Restart\n")
1902 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1903 bgp_flag_set(bgp
, BGP_FLAG_GR_PRESERVE_FWD
);
1907 DEFUN (no_bgp_graceful_restart_preserve_fw
,
1908 no_bgp_graceful_restart_preserve_fw_cmd
,
1909 "no bgp graceful-restart preserve-fw-state",
1911 "BGP specific commands\n"
1912 "Graceful restart capability parameters\n"
1913 "Unsets F-bit indication that fib is preserved while doing Graceful Restart\n")
1915 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1916 bgp_flag_unset(bgp
, BGP_FLAG_GR_PRESERVE_FWD
);
1920 static void bgp_redistribute_redo(struct bgp
*bgp
)
1924 struct list
*red_list
;
1925 struct listnode
*node
;
1926 struct bgp_redist
*red
;
1928 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++) {
1929 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++) {
1931 red_list
= bgp
->redist
[afi
][i
];
1935 for (ALL_LIST_ELEMENTS_RO(red_list
, node
, red
)) {
1936 bgp_redistribute_resend(bgp
, afi
, i
,
1943 /* "bgp graceful-shutdown" configuration */
1944 DEFUN (bgp_graceful_shutdown
,
1945 bgp_graceful_shutdown_cmd
,
1946 "bgp graceful-shutdown",
1948 "Graceful shutdown parameters\n")
1950 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1952 if (!bgp_flag_check(bgp
, BGP_FLAG_GRACEFUL_SHUTDOWN
)) {
1953 bgp_flag_set(bgp
, BGP_FLAG_GRACEFUL_SHUTDOWN
);
1954 bgp_static_redo_import_check(bgp
);
1955 bgp_redistribute_redo(bgp
);
1956 bgp_clear_star_soft_out(vty
, bgp
->name
);
1957 bgp_clear_star_soft_in(vty
, bgp
->name
);
1963 DEFUN (no_bgp_graceful_shutdown
,
1964 no_bgp_graceful_shutdown_cmd
,
1965 "no bgp graceful-shutdown",
1968 "Graceful shutdown parameters\n")
1970 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1972 if (bgp_flag_check(bgp
, BGP_FLAG_GRACEFUL_SHUTDOWN
)) {
1973 bgp_flag_unset(bgp
, BGP_FLAG_GRACEFUL_SHUTDOWN
);
1974 bgp_static_redo_import_check(bgp
);
1975 bgp_redistribute_redo(bgp
);
1976 bgp_clear_star_soft_out(vty
, bgp
->name
);
1977 bgp_clear_star_soft_in(vty
, bgp
->name
);
1983 /* "bgp fast-external-failover" configuration. */
1984 DEFUN (bgp_fast_external_failover
,
1985 bgp_fast_external_failover_cmd
,
1986 "bgp fast-external-failover",
1988 "Immediately reset session if a link to a directly connected external peer goes down\n")
1990 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1991 bgp_flag_unset(bgp
, BGP_FLAG_NO_FAST_EXT_FAILOVER
);
1995 DEFUN (no_bgp_fast_external_failover
,
1996 no_bgp_fast_external_failover_cmd
,
1997 "no bgp fast-external-failover",
2000 "Immediately reset session if a link to a directly connected external peer goes down\n")
2002 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2003 bgp_flag_set(bgp
, BGP_FLAG_NO_FAST_EXT_FAILOVER
);
2007 /* "bgp enforce-first-as" configuration. */
2008 #if defined(VERSION_TYPE_DEV) && CONFDATE > 20180517
2009 CPP_NOTICE("bgpd: remove deprecated '[no] bgp enforce-first-as' commands")
2012 DEFUN_HIDDEN (bgp_enforce_first_as
,
2013 bgp_enforce_first_as_cmd
,
2014 "[no] bgp enforce-first-as",
2017 "Enforce the first AS for EBGP routes\n")
2019 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2021 if (strmatch(argv
[0]->text
, "no"))
2022 bgp_flag_unset(bgp
, BGP_FLAG_ENFORCE_FIRST_AS
);
2024 bgp_flag_set(bgp
, BGP_FLAG_ENFORCE_FIRST_AS
);
2029 /* "bgp bestpath compare-routerid" configuration. */
2030 DEFUN (bgp_bestpath_compare_router_id
,
2031 bgp_bestpath_compare_router_id_cmd
,
2032 "bgp bestpath compare-routerid",
2033 "BGP specific commands\n"
2034 "Change the default bestpath selection\n"
2035 "Compare router-id for identical EBGP paths\n")
2037 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2038 bgp_flag_set(bgp
, BGP_FLAG_COMPARE_ROUTER_ID
);
2039 bgp_recalculate_all_bestpaths(bgp
);
2044 DEFUN (no_bgp_bestpath_compare_router_id
,
2045 no_bgp_bestpath_compare_router_id_cmd
,
2046 "no bgp bestpath compare-routerid",
2048 "BGP specific commands\n"
2049 "Change the default bestpath selection\n"
2050 "Compare router-id for identical EBGP paths\n")
2052 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2053 bgp_flag_unset(bgp
, BGP_FLAG_COMPARE_ROUTER_ID
);
2054 bgp_recalculate_all_bestpaths(bgp
);
2059 /* "bgp bestpath as-path ignore" configuration. */
2060 DEFUN (bgp_bestpath_aspath_ignore
,
2061 bgp_bestpath_aspath_ignore_cmd
,
2062 "bgp bestpath as-path ignore",
2063 "BGP specific commands\n"
2064 "Change the default bestpath selection\n"
2065 "AS-path attribute\n"
2066 "Ignore as-path length in selecting a route\n")
2068 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2069 bgp_flag_set(bgp
, BGP_FLAG_ASPATH_IGNORE
);
2070 bgp_recalculate_all_bestpaths(bgp
);
2075 DEFUN (no_bgp_bestpath_aspath_ignore
,
2076 no_bgp_bestpath_aspath_ignore_cmd
,
2077 "no bgp bestpath as-path ignore",
2079 "BGP specific commands\n"
2080 "Change the default bestpath selection\n"
2081 "AS-path attribute\n"
2082 "Ignore as-path length in selecting a route\n")
2084 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2085 bgp_flag_unset(bgp
, BGP_FLAG_ASPATH_IGNORE
);
2086 bgp_recalculate_all_bestpaths(bgp
);
2091 /* "bgp bestpath as-path confed" configuration. */
2092 DEFUN (bgp_bestpath_aspath_confed
,
2093 bgp_bestpath_aspath_confed_cmd
,
2094 "bgp bestpath as-path confed",
2095 "BGP specific commands\n"
2096 "Change the default bestpath selection\n"
2097 "AS-path attribute\n"
2098 "Compare path lengths including confederation sets & sequences in selecting a route\n")
2100 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2101 bgp_flag_set(bgp
, BGP_FLAG_ASPATH_CONFED
);
2102 bgp_recalculate_all_bestpaths(bgp
);
2107 DEFUN (no_bgp_bestpath_aspath_confed
,
2108 no_bgp_bestpath_aspath_confed_cmd
,
2109 "no bgp bestpath as-path confed",
2111 "BGP specific commands\n"
2112 "Change the default bestpath selection\n"
2113 "AS-path attribute\n"
2114 "Compare path lengths including confederation sets & sequences in selecting a route\n")
2116 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2117 bgp_flag_unset(bgp
, BGP_FLAG_ASPATH_CONFED
);
2118 bgp_recalculate_all_bestpaths(bgp
);
2123 /* "bgp bestpath as-path multipath-relax" configuration. */
2124 DEFUN (bgp_bestpath_aspath_multipath_relax
,
2125 bgp_bestpath_aspath_multipath_relax_cmd
,
2126 "bgp bestpath as-path multipath-relax [<as-set|no-as-set>]",
2127 "BGP specific commands\n"
2128 "Change the default bestpath selection\n"
2129 "AS-path attribute\n"
2130 "Allow load sharing across routes that have different AS paths (but same length)\n"
2131 "Generate an AS_SET\n"
2132 "Do not generate an AS_SET\n")
2134 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2136 bgp_flag_set(bgp
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
);
2138 /* no-as-set is now the default behavior so we can silently
2140 if (argv_find(argv
, argc
, "as-set", &idx
))
2141 bgp_flag_set(bgp
, BGP_FLAG_MULTIPATH_RELAX_AS_SET
);
2143 bgp_flag_unset(bgp
, BGP_FLAG_MULTIPATH_RELAX_AS_SET
);
2145 bgp_recalculate_all_bestpaths(bgp
);
2150 DEFUN (no_bgp_bestpath_aspath_multipath_relax
,
2151 no_bgp_bestpath_aspath_multipath_relax_cmd
,
2152 "no bgp bestpath as-path multipath-relax [<as-set|no-as-set>]",
2154 "BGP specific commands\n"
2155 "Change the default bestpath selection\n"
2156 "AS-path attribute\n"
2157 "Allow load sharing across routes that have different AS paths (but same length)\n"
2158 "Generate an AS_SET\n"
2159 "Do not generate an AS_SET\n")
2161 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2162 bgp_flag_unset(bgp
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
);
2163 bgp_flag_unset(bgp
, BGP_FLAG_MULTIPATH_RELAX_AS_SET
);
2164 bgp_recalculate_all_bestpaths(bgp
);
2169 /* "bgp log-neighbor-changes" configuration. */
2170 DEFUN (bgp_log_neighbor_changes
,
2171 bgp_log_neighbor_changes_cmd
,
2172 "bgp log-neighbor-changes",
2173 "BGP specific commands\n"
2174 "Log neighbor up/down and reset reason\n")
2176 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2177 bgp_flag_set(bgp
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
);
2181 DEFUN (no_bgp_log_neighbor_changes
,
2182 no_bgp_log_neighbor_changes_cmd
,
2183 "no bgp log-neighbor-changes",
2185 "BGP specific commands\n"
2186 "Log neighbor up/down and reset reason\n")
2188 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2189 bgp_flag_unset(bgp
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
);
2193 /* "bgp bestpath med" configuration. */
2194 DEFUN (bgp_bestpath_med
,
2195 bgp_bestpath_med_cmd
,
2196 "bgp bestpath med <confed [missing-as-worst]|missing-as-worst [confed]>",
2197 "BGP specific commands\n"
2198 "Change the default bestpath selection\n"
2200 "Compare MED among confederation paths\n"
2201 "Treat missing MED as the least preferred one\n"
2202 "Treat missing MED as the least preferred one\n"
2203 "Compare MED among confederation paths\n")
2205 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2208 if (argv_find(argv
, argc
, "confed", &idx
))
2209 bgp_flag_set(bgp
, BGP_FLAG_MED_CONFED
);
2211 if (argv_find(argv
, argc
, "missing-as-worst", &idx
))
2212 bgp_flag_set(bgp
, BGP_FLAG_MED_MISSING_AS_WORST
);
2214 bgp_recalculate_all_bestpaths(bgp
);
2219 DEFUN (no_bgp_bestpath_med
,
2220 no_bgp_bestpath_med_cmd
,
2221 "no bgp bestpath med <confed [missing-as-worst]|missing-as-worst [confed]>",
2223 "BGP specific commands\n"
2224 "Change the default bestpath selection\n"
2226 "Compare MED among confederation paths\n"
2227 "Treat missing MED as the least preferred one\n"
2228 "Treat missing MED as the least preferred one\n"
2229 "Compare MED among confederation paths\n")
2231 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2234 if (argv_find(argv
, argc
, "confed", &idx
))
2235 bgp_flag_unset(bgp
, BGP_FLAG_MED_CONFED
);
2237 if (argv_find(argv
, argc
, "missing-as-worst", &idx
))
2238 bgp_flag_unset(bgp
, BGP_FLAG_MED_MISSING_AS_WORST
);
2240 bgp_recalculate_all_bestpaths(bgp
);
2245 /* "no bgp default ipv4-unicast". */
2246 DEFUN (no_bgp_default_ipv4_unicast
,
2247 no_bgp_default_ipv4_unicast_cmd
,
2248 "no bgp default ipv4-unicast",
2250 "BGP specific commands\n"
2251 "Configure BGP defaults\n"
2252 "Activate ipv4-unicast for a peer by default\n")
2254 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2255 bgp_flag_set(bgp
, BGP_FLAG_NO_DEFAULT_IPV4
);
2259 DEFUN (bgp_default_ipv4_unicast
,
2260 bgp_default_ipv4_unicast_cmd
,
2261 "bgp default ipv4-unicast",
2262 "BGP specific commands\n"
2263 "Configure BGP defaults\n"
2264 "Activate ipv4-unicast for a peer by default\n")
2266 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2267 bgp_flag_unset(bgp
, BGP_FLAG_NO_DEFAULT_IPV4
);
2271 /* Display hostname in certain command outputs */
2272 DEFUN (bgp_default_show_hostname
,
2273 bgp_default_show_hostname_cmd
,
2274 "bgp default show-hostname",
2275 "BGP specific commands\n"
2276 "Configure BGP defaults\n"
2277 "Show hostname in certain command ouputs\n")
2279 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2280 bgp_flag_set(bgp
, BGP_FLAG_SHOW_HOSTNAME
);
2284 DEFUN (no_bgp_default_show_hostname
,
2285 no_bgp_default_show_hostname_cmd
,
2286 "no bgp default show-hostname",
2288 "BGP specific commands\n"
2289 "Configure BGP defaults\n"
2290 "Show hostname in certain command ouputs\n")
2292 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2293 bgp_flag_unset(bgp
, BGP_FLAG_SHOW_HOSTNAME
);
2297 /* "bgp network import-check" configuration. */
2298 DEFUN (bgp_network_import_check
,
2299 bgp_network_import_check_cmd
,
2300 "bgp network import-check",
2301 "BGP specific commands\n"
2302 "BGP network command\n"
2303 "Check BGP network route exists in IGP\n")
2305 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2306 if (!bgp_flag_check(bgp
, BGP_FLAG_IMPORT_CHECK
)) {
2307 bgp_flag_set(bgp
, BGP_FLAG_IMPORT_CHECK
);
2308 bgp_static_redo_import_check(bgp
);
2314 ALIAS_HIDDEN(bgp_network_import_check
, bgp_network_import_check_exact_cmd
,
2315 "bgp network import-check exact",
2316 "BGP specific commands\n"
2317 "BGP network command\n"
2318 "Check BGP network route exists in IGP\n"
2319 "Match route precisely\n")
2321 DEFUN (no_bgp_network_import_check
,
2322 no_bgp_network_import_check_cmd
,
2323 "no bgp network import-check",
2325 "BGP specific commands\n"
2326 "BGP network command\n"
2327 "Check BGP network route exists in IGP\n")
2329 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2330 if (bgp_flag_check(bgp
, BGP_FLAG_IMPORT_CHECK
)) {
2331 bgp_flag_unset(bgp
, BGP_FLAG_IMPORT_CHECK
);
2332 bgp_static_redo_import_check(bgp
);
2338 DEFUN (bgp_default_local_preference
,
2339 bgp_default_local_preference_cmd
,
2340 "bgp default local-preference (0-4294967295)",
2341 "BGP specific commands\n"
2342 "Configure BGP defaults\n"
2343 "local preference (higher=more preferred)\n"
2344 "Configure default local preference value\n")
2346 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2348 uint32_t local_pref
;
2350 local_pref
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2352 bgp_default_local_preference_set(bgp
, local_pref
);
2353 bgp_clear_star_soft_in(vty
, bgp
->name
);
2358 DEFUN (no_bgp_default_local_preference
,
2359 no_bgp_default_local_preference_cmd
,
2360 "no bgp default local-preference [(0-4294967295)]",
2362 "BGP specific commands\n"
2363 "Configure BGP defaults\n"
2364 "local preference (higher=more preferred)\n"
2365 "Configure default local preference value\n")
2367 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2368 bgp_default_local_preference_unset(bgp
);
2369 bgp_clear_star_soft_in(vty
, bgp
->name
);
2375 DEFUN (bgp_default_subgroup_pkt_queue_max
,
2376 bgp_default_subgroup_pkt_queue_max_cmd
,
2377 "bgp default subgroup-pkt-queue-max (20-100)",
2378 "BGP specific commands\n"
2379 "Configure BGP defaults\n"
2380 "subgroup-pkt-queue-max\n"
2381 "Configure subgroup packet queue max\n")
2383 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2387 max_size
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2389 bgp_default_subgroup_pkt_queue_max_set(bgp
, max_size
);
2394 DEFUN (no_bgp_default_subgroup_pkt_queue_max
,
2395 no_bgp_default_subgroup_pkt_queue_max_cmd
,
2396 "no bgp default subgroup-pkt-queue-max [(20-100)]",
2398 "BGP specific commands\n"
2399 "Configure BGP defaults\n"
2400 "subgroup-pkt-queue-max\n"
2401 "Configure subgroup packet queue max\n")
2403 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2404 bgp_default_subgroup_pkt_queue_max_unset(bgp
);
2409 DEFUN (bgp_rr_allow_outbound_policy
,
2410 bgp_rr_allow_outbound_policy_cmd
,
2411 "bgp route-reflector allow-outbound-policy",
2412 "BGP specific commands\n"
2413 "Allow modifications made by out route-map\n"
2414 "on ibgp neighbors\n")
2416 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2418 if (!bgp_flag_check(bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
)) {
2419 bgp_flag_set(bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
);
2420 update_group_announce_rrclients(bgp
);
2421 bgp_clear_star_soft_out(vty
, bgp
->name
);
2427 DEFUN (no_bgp_rr_allow_outbound_policy
,
2428 no_bgp_rr_allow_outbound_policy_cmd
,
2429 "no bgp route-reflector allow-outbound-policy",
2431 "BGP specific commands\n"
2432 "Allow modifications made by out route-map\n"
2433 "on ibgp neighbors\n")
2435 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2437 if (bgp_flag_check(bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
)) {
2438 bgp_flag_unset(bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
);
2439 update_group_announce_rrclients(bgp
);
2440 bgp_clear_star_soft_out(vty
, bgp
->name
);
2446 DEFUN (bgp_listen_limit
,
2447 bgp_listen_limit_cmd
,
2448 "bgp listen limit (1-5000)",
2449 "BGP specific commands\n"
2450 "Configure BGP defaults\n"
2451 "maximum number of BGP Dynamic Neighbors that can be created\n"
2452 "Configure Dynamic Neighbors listen limit value\n")
2454 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2458 listen_limit
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2460 bgp_listen_limit_set(bgp
, listen_limit
);
2465 DEFUN (no_bgp_listen_limit
,
2466 no_bgp_listen_limit_cmd
,
2467 "no bgp listen limit [(1-5000)]",
2468 "BGP specific commands\n"
2469 "Configure BGP defaults\n"
2470 "unset maximum number of BGP Dynamic Neighbors that can be created\n"
2471 "Configure Dynamic Neighbors listen limit value to default\n"
2472 "Configure Dynamic Neighbors listen limit value\n")
2474 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2475 bgp_listen_limit_unset(bgp
);
2481 * Check if this listen range is already configured. Check for exact
2482 * match or overlap based on input.
2484 static struct peer_group
*listen_range_exists(struct bgp
*bgp
,
2485 struct prefix
*range
, int exact
)
2487 struct listnode
*node
, *nnode
;
2488 struct listnode
*node1
, *nnode1
;
2489 struct peer_group
*group
;
2494 afi
= family2afi(range
->family
);
2495 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
2496 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], node1
, nnode1
,
2499 match
= prefix_same(range
, lr
);
2501 match
= (prefix_match(range
, lr
)
2502 || prefix_match(lr
, range
));
2511 DEFUN (bgp_listen_range
,
2512 bgp_listen_range_cmd
,
2513 "bgp listen range <A.B.C.D/M|X:X::X:X/M> peer-group WORD",
2514 "BGP specific commands\n"
2515 "Configure BGP dynamic neighbors listen range\n"
2516 "Configure BGP dynamic neighbors listen range\n"
2518 "Member of the peer-group\n"
2519 "Peer-group name\n")
2521 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2522 struct prefix range
;
2523 struct peer_group
*group
, *existing_group
;
2528 argv_find(argv
, argc
, "A.B.C.D/M", &idx
);
2529 argv_find(argv
, argc
, "X:X::X:X/M", &idx
);
2530 char *prefix
= argv
[idx
]->arg
;
2531 argv_find(argv
, argc
, "WORD", &idx
);
2532 char *peergroup
= argv
[idx
]->arg
;
2534 /* Convert IP prefix string to struct prefix. */
2535 ret
= str2prefix(prefix
, &range
);
2537 vty_out(vty
, "%% Malformed listen range\n");
2538 return CMD_WARNING_CONFIG_FAILED
;
2541 afi
= family2afi(range
.family
);
2543 if (afi
== AFI_IP6
&& IN6_IS_ADDR_LINKLOCAL(&range
.u
.prefix6
)) {
2545 "%% Malformed listen range (link-local address)\n");
2546 return CMD_WARNING_CONFIG_FAILED
;
2551 /* Check if same listen range is already configured. */
2552 existing_group
= listen_range_exists(bgp
, &range
, 1);
2553 if (existing_group
) {
2554 if (strcmp(existing_group
->name
, peergroup
) == 0)
2558 "%% Same listen range is attached to peer-group %s\n",
2559 existing_group
->name
);
2560 return CMD_WARNING_CONFIG_FAILED
;
2564 /* Check if an overlapping listen range exists. */
2565 if (listen_range_exists(bgp
, &range
, 0)) {
2567 "%% Listen range overlaps with existing listen range\n");
2568 return CMD_WARNING_CONFIG_FAILED
;
2571 group
= peer_group_lookup(bgp
, peergroup
);
2573 vty_out(vty
, "%% Configure the peer-group first\n");
2574 return CMD_WARNING_CONFIG_FAILED
;
2577 ret
= peer_group_listen_range_add(group
, &range
);
2578 return bgp_vty_return(vty
, ret
);
2581 DEFUN (no_bgp_listen_range
,
2582 no_bgp_listen_range_cmd
,
2583 "no bgp listen range <A.B.C.D/M|X:X::X:X/M> peer-group WORD",
2585 "BGP specific commands\n"
2586 "Unconfigure BGP dynamic neighbors listen range\n"
2587 "Unconfigure BGP dynamic neighbors listen range\n"
2589 "Member of the peer-group\n"
2590 "Peer-group name\n")
2592 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2593 struct prefix range
;
2594 struct peer_group
*group
;
2599 argv_find(argv
, argc
, "A.B.C.D/M", &idx
);
2600 argv_find(argv
, argc
, "X:X::X:X/M", &idx
);
2601 char *prefix
= argv
[idx
]->arg
;
2602 argv_find(argv
, argc
, "WORD", &idx
);
2603 char *peergroup
= argv
[idx
]->arg
;
2605 /* Convert IP prefix string to struct prefix. */
2606 ret
= str2prefix(prefix
, &range
);
2608 vty_out(vty
, "%% Malformed listen range\n");
2609 return CMD_WARNING_CONFIG_FAILED
;
2612 afi
= family2afi(range
.family
);
2614 if (afi
== AFI_IP6
&& IN6_IS_ADDR_LINKLOCAL(&range
.u
.prefix6
)) {
2616 "%% Malformed listen range (link-local address)\n");
2617 return CMD_WARNING_CONFIG_FAILED
;
2622 group
= peer_group_lookup(bgp
, peergroup
);
2624 vty_out(vty
, "%% Peer-group does not exist\n");
2625 return CMD_WARNING_CONFIG_FAILED
;
2628 ret
= peer_group_listen_range_del(group
, &range
);
2629 return bgp_vty_return(vty
, ret
);
2632 void bgp_config_write_listen(struct vty
*vty
, struct bgp
*bgp
)
2634 struct peer_group
*group
;
2635 struct listnode
*node
, *nnode
, *rnode
, *nrnode
;
2636 struct prefix
*range
;
2638 char buf
[PREFIX2STR_BUFFER
];
2640 if (bgp
->dynamic_neighbors_limit
!= BGP_DYNAMIC_NEIGHBORS_LIMIT_DEFAULT
)
2641 vty_out(vty
, " bgp listen limit %d\n",
2642 bgp
->dynamic_neighbors_limit
);
2644 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
2645 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++) {
2646 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], rnode
,
2648 prefix2str(range
, buf
, sizeof(buf
));
2650 " bgp listen range %s peer-group %s\n",
2658 DEFUN (bgp_disable_connected_route_check
,
2659 bgp_disable_connected_route_check_cmd
,
2660 "bgp disable-ebgp-connected-route-check",
2661 "BGP specific commands\n"
2662 "Disable checking if nexthop is connected on ebgp sessions\n")
2664 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2665 bgp_flag_set(bgp
, BGP_FLAG_DISABLE_NH_CONNECTED_CHK
);
2666 bgp_clear_star_soft_in(vty
, bgp
->name
);
2671 DEFUN (no_bgp_disable_connected_route_check
,
2672 no_bgp_disable_connected_route_check_cmd
,
2673 "no bgp disable-ebgp-connected-route-check",
2675 "BGP specific commands\n"
2676 "Disable checking if nexthop is connected on ebgp sessions\n")
2678 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2679 bgp_flag_unset(bgp
, BGP_FLAG_DISABLE_NH_CONNECTED_CHK
);
2680 bgp_clear_star_soft_in(vty
, bgp
->name
);
2686 static int peer_remote_as_vty(struct vty
*vty
, const char *peer_str
,
2687 const char *as_str
, afi_t afi
, safi_t safi
)
2689 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2692 int as_type
= AS_SPECIFIED
;
2695 if (as_str
[0] == 'i') {
2697 as_type
= AS_INTERNAL
;
2698 } else if (as_str
[0] == 'e') {
2700 as_type
= AS_EXTERNAL
;
2702 /* Get AS number. */
2703 as
= strtoul(as_str
, NULL
, 10);
2706 /* If peer is peer group, call proper function. */
2707 ret
= str2sockunion(peer_str
, &su
);
2709 /* Check for peer by interface */
2710 ret
= peer_remote_as(bgp
, NULL
, peer_str
, &as
, as_type
, afi
,
2713 ret
= peer_group_remote_as(bgp
, peer_str
, &as
, as_type
);
2716 "%% Create the peer-group or interface first\n");
2717 return CMD_WARNING_CONFIG_FAILED
;
2722 if (peer_address_self_check(bgp
, &su
)) {
2724 "%% Can not configure the local system as neighbor\n");
2725 return CMD_WARNING_CONFIG_FAILED
;
2727 ret
= peer_remote_as(bgp
, &su
, NULL
, &as
, as_type
, afi
, safi
);
2730 /* This peer belongs to peer group. */
2732 case BGP_ERR_PEER_GROUP_MEMBER
:
2734 "%% Peer-group AS %u. Cannot configure remote-as for member\n",
2736 return CMD_WARNING_CONFIG_FAILED
;
2737 case BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
:
2739 "%% The AS# can not be changed from %u to %s, peer-group members must be all internal or all external\n",
2741 return CMD_WARNING_CONFIG_FAILED
;
2743 return bgp_vty_return(vty
, ret
);
2746 DEFUN (bgp_default_shutdown
,
2747 bgp_default_shutdown_cmd
,
2748 "[no] bgp default shutdown",
2751 "Configure BGP defaults\n"
2752 "Apply administrative shutdown to newly configured peers\n")
2754 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2755 bgp
->autoshutdown
= !strmatch(argv
[0]->text
, "no");
2759 DEFUN (neighbor_remote_as
,
2760 neighbor_remote_as_cmd
,
2761 "neighbor <A.B.C.D|X:X::X:X|WORD> remote-as <(1-4294967295)|internal|external>",
2764 "Specify a BGP neighbor\n"
2766 "Internal BGP peer\n"
2767 "External BGP peer\n")
2770 int idx_remote_as
= 3;
2771 return peer_remote_as_vty(vty
, argv
[idx_peer
]->arg
,
2772 argv
[idx_remote_as
]->arg
, AFI_IP
,
2776 static int peer_conf_interface_get(struct vty
*vty
, const char *conf_if
,
2777 afi_t afi
, safi_t safi
, int v6only
,
2778 const char *peer_group_name
,
2781 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2783 int as_type
= AS_UNSPECIFIED
;
2785 struct peer_group
*group
;
2789 group
= peer_group_lookup(bgp
, conf_if
);
2792 vty_out(vty
, "%% Name conflict with peer-group \n");
2793 return CMD_WARNING_CONFIG_FAILED
;
2797 if (as_str
[0] == 'i') {
2798 as_type
= AS_INTERNAL
;
2799 } else if (as_str
[0] == 'e') {
2800 as_type
= AS_EXTERNAL
;
2802 /* Get AS number. */
2803 as
= strtoul(as_str
, NULL
, 10);
2804 as_type
= AS_SPECIFIED
;
2808 peer
= peer_lookup_by_conf_if(bgp
, conf_if
);
2811 ret
= peer_remote_as(bgp
, &su
, conf_if
, &as
, as_type
,
2814 if (bgp_flag_check(bgp
, BGP_FLAG_NO_DEFAULT_IPV4
)
2815 && afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
2816 peer
= peer_create(NULL
, conf_if
, bgp
, bgp
->as
, as
,
2817 as_type
, 0, 0, NULL
);
2819 peer
= peer_create(NULL
, conf_if
, bgp
, bgp
->as
, as
,
2820 as_type
, afi
, safi
, NULL
);
2823 vty_out(vty
, "%% BGP failed to create peer\n");
2824 return CMD_WARNING_CONFIG_FAILED
;
2828 peer_flag_set(peer
, PEER_FLAG_IFPEER_V6ONLY
);
2830 /* Request zebra to initiate IPv6 RAs on this interface. We do
2832 * any unnumbered peer in order to not worry about run-time
2834 * (e.g., peering is initially IPv4, but the IPv4 /30 or /31
2836 * gets deleted later etc.)
2839 bgp_zebra_initiate_radv(bgp
, peer
);
2842 if ((v6only
&& !CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
))
2843 || (!v6only
&& CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
))) {
2845 peer_flag_set(peer
, PEER_FLAG_IFPEER_V6ONLY
);
2847 peer_flag_unset(peer
, PEER_FLAG_IFPEER_V6ONLY
);
2849 /* v6only flag changed. Reset bgp seesion */
2850 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
2851 peer
->last_reset
= PEER_DOWN_V6ONLY_CHANGE
;
2852 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
2853 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2855 bgp_session_reset(peer
);
2858 if (!CHECK_FLAG(peer
->flags_invert
, PEER_FLAG_CAPABILITY_ENHE
)) {
2859 SET_FLAG(peer
->flags
, PEER_FLAG_CAPABILITY_ENHE
);
2860 SET_FLAG(peer
->flags_invert
, PEER_FLAG_CAPABILITY_ENHE
);
2861 UNSET_FLAG(peer
->flags_override
, PEER_FLAG_CAPABILITY_ENHE
);
2864 if (peer_group_name
) {
2865 group
= peer_group_lookup(bgp
, peer_group_name
);
2867 vty_out(vty
, "%% Configure the peer-group first\n");
2868 return CMD_WARNING_CONFIG_FAILED
;
2871 ret
= peer_group_bind(bgp
, &su
, peer
, group
, &as
);
2874 return bgp_vty_return(vty
, ret
);
2877 DEFUN (neighbor_interface_config
,
2878 neighbor_interface_config_cmd
,
2879 "neighbor WORD interface [peer-group WORD]",
2881 "Interface name or neighbor tag\n"
2882 "Enable BGP on interface\n"
2883 "Member of the peer-group\n"
2884 "Peer-group name\n")
2887 int idx_peer_group_word
= 4;
2889 if (argc
> idx_peer_group_word
)
2890 return peer_conf_interface_get(
2891 vty
, argv
[idx_word
]->arg
, AFI_IP
, SAFI_UNICAST
, 0,
2892 argv
[idx_peer_group_word
]->arg
, NULL
);
2894 return peer_conf_interface_get(vty
, argv
[idx_word
]->arg
, AFI_IP
,
2895 SAFI_UNICAST
, 0, NULL
, NULL
);
2898 DEFUN (neighbor_interface_config_v6only
,
2899 neighbor_interface_config_v6only_cmd
,
2900 "neighbor WORD interface v6only [peer-group WORD]",
2902 "Interface name or neighbor tag\n"
2903 "Enable BGP on interface\n"
2904 "Enable BGP with v6 link-local only\n"
2905 "Member of the peer-group\n"
2906 "Peer-group name\n")
2909 int idx_peer_group_word
= 5;
2911 if (argc
> idx_peer_group_word
)
2912 return peer_conf_interface_get(
2913 vty
, argv
[idx_word
]->arg
, AFI_IP
, SAFI_UNICAST
, 1,
2914 argv
[idx_peer_group_word
]->arg
, NULL
);
2916 return peer_conf_interface_get(vty
, argv
[idx_word
]->arg
, AFI_IP
,
2917 SAFI_UNICAST
, 1, NULL
, NULL
);
2921 DEFUN (neighbor_interface_config_remote_as
,
2922 neighbor_interface_config_remote_as_cmd
,
2923 "neighbor WORD interface remote-as <(1-4294967295)|internal|external>",
2925 "Interface name or neighbor tag\n"
2926 "Enable BGP on interface\n"
2927 "Specify a BGP neighbor\n"
2929 "Internal BGP peer\n"
2930 "External BGP peer\n")
2933 int idx_remote_as
= 4;
2934 return peer_conf_interface_get(vty
, argv
[idx_word
]->arg
, AFI_IP
,
2935 SAFI_UNICAST
, 0, NULL
,
2936 argv
[idx_remote_as
]->arg
);
2939 DEFUN (neighbor_interface_v6only_config_remote_as
,
2940 neighbor_interface_v6only_config_remote_as_cmd
,
2941 "neighbor WORD interface v6only remote-as <(1-4294967295)|internal|external>",
2943 "Interface name or neighbor tag\n"
2944 "Enable BGP with v6 link-local only\n"
2945 "Enable BGP on interface\n"
2946 "Specify a BGP neighbor\n"
2948 "Internal BGP peer\n"
2949 "External BGP peer\n")
2952 int idx_remote_as
= 5;
2953 return peer_conf_interface_get(vty
, argv
[idx_word
]->arg
, AFI_IP
,
2954 SAFI_UNICAST
, 1, NULL
,
2955 argv
[idx_remote_as
]->arg
);
2958 DEFUN (neighbor_peer_group
,
2959 neighbor_peer_group_cmd
,
2960 "neighbor WORD peer-group",
2962 "Interface name or neighbor tag\n"
2963 "Configure peer-group\n")
2965 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2968 struct peer_group
*group
;
2970 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_word
]->arg
);
2972 vty_out(vty
, "%% Name conflict with interface: \n");
2973 return CMD_WARNING_CONFIG_FAILED
;
2976 group
= peer_group_get(bgp
, argv
[idx_word
]->arg
);
2978 vty_out(vty
, "%% BGP failed to find or create peer-group\n");
2979 return CMD_WARNING_CONFIG_FAILED
;
2987 "no neighbor <WORD|<A.B.C.D|X:X::X:X> [remote-as <(1-4294967295)|internal|external>]>",
2991 "Specify a BGP neighbor\n"
2993 "Internal BGP peer\n"
2994 "External BGP peer\n")
2996 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3000 struct peer_group
*group
;
3004 ret
= str2sockunion(argv
[idx_peer
]->arg
, &su
);
3006 /* look up for neighbor by interface name config. */
3007 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_peer
]->arg
);
3009 /* Request zebra to terminate IPv6 RAs on this
3012 bgp_zebra_terminate_radv(peer
->bgp
, peer
);
3017 group
= peer_group_lookup(bgp
, argv
[idx_peer
]->arg
);
3019 peer_group_delete(group
);
3021 vty_out(vty
, "%% Create the peer-group first\n");
3022 return CMD_WARNING_CONFIG_FAILED
;
3025 peer
= peer_lookup(bgp
, &su
);
3027 if (peer_dynamic_neighbor(peer
)) {
3029 "%% Operation not allowed on a dynamic neighbor\n");
3030 return CMD_WARNING_CONFIG_FAILED
;
3033 other
= peer
->doppelganger
;
3035 if (other
&& other
->status
!= Deleted
)
3043 DEFUN (no_neighbor_interface_config
,
3044 no_neighbor_interface_config_cmd
,
3045 "no neighbor WORD interface [v6only] [peer-group WORD] [remote-as <(1-4294967295)|internal|external>]",
3049 "Configure BGP on interface\n"
3050 "Enable BGP with v6 link-local only\n"
3051 "Member of the peer-group\n"
3053 "Specify a BGP neighbor\n"
3055 "Internal BGP peer\n"
3056 "External BGP peer\n")
3058 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3062 /* look up for neighbor by interface name config. */
3063 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_word
]->arg
);
3065 /* Request zebra to terminate IPv6 RAs on this interface. */
3067 bgp_zebra_terminate_radv(peer
->bgp
, peer
);
3070 vty_out(vty
, "%% Create the bgp interface first\n");
3071 return CMD_WARNING_CONFIG_FAILED
;
3076 DEFUN (no_neighbor_peer_group
,
3077 no_neighbor_peer_group_cmd
,
3078 "no neighbor WORD peer-group",
3082 "Configure peer-group\n")
3084 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3086 struct peer_group
*group
;
3088 group
= peer_group_lookup(bgp
, argv
[idx_word
]->arg
);
3090 peer_group_delete(group
);
3092 vty_out(vty
, "%% Create the peer-group first\n");
3093 return CMD_WARNING_CONFIG_FAILED
;
3098 DEFUN (no_neighbor_interface_peer_group_remote_as
,
3099 no_neighbor_interface_peer_group_remote_as_cmd
,
3100 "no neighbor WORD remote-as <(1-4294967295)|internal|external>",
3103 "Interface name or neighbor tag\n"
3104 "Specify a BGP neighbor\n"
3106 "Internal BGP peer\n"
3107 "External BGP peer\n")
3109 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3111 struct peer_group
*group
;
3114 /* look up for neighbor by interface name config. */
3115 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_word
]->arg
);
3117 peer_as_change(peer
, 0, AS_SPECIFIED
);
3121 group
= peer_group_lookup(bgp
, argv
[idx_word
]->arg
);
3123 peer_group_remote_as_delete(group
);
3125 vty_out(vty
, "%% Create the peer-group or interface first\n");
3126 return CMD_WARNING_CONFIG_FAILED
;
3131 DEFUN (neighbor_local_as
,
3132 neighbor_local_as_cmd
,
3133 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295)",
3136 "Specify a local-as number\n"
3137 "AS number used as local AS\n")
3145 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3147 return CMD_WARNING_CONFIG_FAILED
;
3149 as
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
3150 ret
= peer_local_as_set(peer
, as
, 0, 0);
3151 return bgp_vty_return(vty
, ret
);
3154 DEFUN (neighbor_local_as_no_prepend
,
3155 neighbor_local_as_no_prepend_cmd
,
3156 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295) no-prepend",
3159 "Specify a local-as number\n"
3160 "AS number used as local AS\n"
3161 "Do not prepend local-as to updates from ebgp peers\n")
3169 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3171 return CMD_WARNING_CONFIG_FAILED
;
3173 as
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
3174 ret
= peer_local_as_set(peer
, as
, 1, 0);
3175 return bgp_vty_return(vty
, ret
);
3178 DEFUN (neighbor_local_as_no_prepend_replace_as
,
3179 neighbor_local_as_no_prepend_replace_as_cmd
,
3180 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295) no-prepend replace-as",
3183 "Specify a local-as number\n"
3184 "AS number used as local AS\n"
3185 "Do not prepend local-as to updates from ebgp peers\n"
3186 "Do not prepend local-as to updates from ibgp peers\n")
3194 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3196 return CMD_WARNING_CONFIG_FAILED
;
3198 as
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
3199 ret
= peer_local_as_set(peer
, as
, 1, 1);
3200 return bgp_vty_return(vty
, ret
);
3203 DEFUN (no_neighbor_local_as
,
3204 no_neighbor_local_as_cmd
,
3205 "no neighbor <A.B.C.D|X:X::X:X|WORD> local-as [(1-4294967295) [no-prepend [replace-as]]]",
3209 "Specify a local-as number\n"
3210 "AS number used as local AS\n"
3211 "Do not prepend local-as to updates from ebgp peers\n"
3212 "Do not prepend local-as to updates from ibgp peers\n")
3218 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3220 return CMD_WARNING_CONFIG_FAILED
;
3222 ret
= peer_local_as_unset(peer
);
3223 return bgp_vty_return(vty
, ret
);
3227 DEFUN (neighbor_solo
,
3229 "neighbor <A.B.C.D|X:X::X:X|WORD> solo",
3232 "Solo peer - part of its own update group\n")
3238 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3240 return CMD_WARNING_CONFIG_FAILED
;
3242 ret
= update_group_adjust_soloness(peer
, 1);
3243 return bgp_vty_return(vty
, ret
);
3246 DEFUN (no_neighbor_solo
,
3247 no_neighbor_solo_cmd
,
3248 "no neighbor <A.B.C.D|X:X::X:X|WORD> solo",
3252 "Solo peer - part of its own update group\n")
3258 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3260 return CMD_WARNING_CONFIG_FAILED
;
3262 ret
= update_group_adjust_soloness(peer
, 0);
3263 return bgp_vty_return(vty
, ret
);
3266 DEFUN (neighbor_password
,
3267 neighbor_password_cmd
,
3268 "neighbor <A.B.C.D|X:X::X:X|WORD> password LINE",
3279 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3281 return CMD_WARNING_CONFIG_FAILED
;
3283 ret
= peer_password_set(peer
, argv
[idx_line
]->arg
);
3284 return bgp_vty_return(vty
, ret
);
3287 DEFUN (no_neighbor_password
,
3288 no_neighbor_password_cmd
,
3289 "no neighbor <A.B.C.D|X:X::X:X|WORD> password [LINE]",
3300 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3302 return CMD_WARNING_CONFIG_FAILED
;
3304 ret
= peer_password_unset(peer
);
3305 return bgp_vty_return(vty
, ret
);
3308 DEFUN (neighbor_activate
,
3309 neighbor_activate_cmd
,
3310 "neighbor <A.B.C.D|X:X::X:X|WORD> activate",
3313 "Enable the Address Family for this Neighbor\n")
3319 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3321 return CMD_WARNING_CONFIG_FAILED
;
3323 ret
= peer_activate(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
));
3324 return bgp_vty_return(vty
, ret
);
3327 ALIAS_HIDDEN(neighbor_activate
, neighbor_activate_hidden_cmd
,
3328 "neighbor <A.B.C.D|X:X::X:X|WORD> activate",
3329 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3330 "Enable the Address Family for this Neighbor\n")
3332 DEFUN (no_neighbor_activate
,
3333 no_neighbor_activate_cmd
,
3334 "no neighbor <A.B.C.D|X:X::X:X|WORD> activate",
3338 "Enable the Address Family for this Neighbor\n")
3345 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3347 return CMD_WARNING_CONFIG_FAILED
;
3349 ret
= peer_deactivate(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
));
3350 return bgp_vty_return(vty
, ret
);
3353 ALIAS_HIDDEN(no_neighbor_activate
, no_neighbor_activate_hidden_cmd
,
3354 "no neighbor <A.B.C.D|X:X::X:X|WORD> activate",
3355 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3356 "Enable the Address Family for this Neighbor\n")
3358 DEFUN (neighbor_set_peer_group
,
3359 neighbor_set_peer_group_cmd
,
3360 "neighbor <A.B.C.D|X:X::X:X|WORD> peer-group WORD",
3363 "Member of the peer-group\n"
3364 "Peer-group name\n")
3366 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3373 struct peer_group
*group
;
3377 ret
= str2sockunion(argv
[idx_peer
]->arg
, &su
);
3379 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_peer
]->arg
);
3381 vty_out(vty
, "%% Malformed address or name: %s\n",
3382 argv
[idx_peer
]->arg
);
3383 return CMD_WARNING_CONFIG_FAILED
;
3386 if (peer_address_self_check(bgp
, &su
)) {
3388 "%% Can not configure the local system as neighbor\n");
3389 return CMD_WARNING_CONFIG_FAILED
;
3392 /* Disallow for dynamic neighbor. */
3393 peer
= peer_lookup(bgp
, &su
);
3394 if (peer
&& peer_dynamic_neighbor(peer
)) {
3396 "%% Operation not allowed on a dynamic neighbor\n");
3397 return CMD_WARNING_CONFIG_FAILED
;
3401 group
= peer_group_lookup(bgp
, argv
[idx_word
]->arg
);
3403 vty_out(vty
, "%% Configure the peer-group first\n");
3404 return CMD_WARNING_CONFIG_FAILED
;
3407 ret
= peer_group_bind(bgp
, &su
, peer
, group
, &as
);
3409 if (ret
== BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
) {
3411 "%% Peer with AS %u cannot be in this peer-group, members must be all internal or all external\n",
3413 return CMD_WARNING_CONFIG_FAILED
;
3416 return bgp_vty_return(vty
, ret
);
3419 ALIAS_HIDDEN(neighbor_set_peer_group
, neighbor_set_peer_group_hidden_cmd
,
3420 "neighbor <A.B.C.D|X:X::X:X|WORD> peer-group WORD",
3421 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3422 "Member of the peer-group\n"
3423 "Peer-group name\n")
3425 DEFUN (no_neighbor_set_peer_group
,
3426 no_neighbor_set_peer_group_cmd
,
3427 "no neighbor <A.B.C.D|X:X::X:X|WORD> peer-group WORD",
3431 "Member of the peer-group\n"
3432 "Peer-group name\n")
3434 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3439 struct peer_group
*group
;
3441 peer
= peer_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3443 return CMD_WARNING_CONFIG_FAILED
;
3445 group
= peer_group_lookup(bgp
, argv
[idx_word
]->arg
);
3447 vty_out(vty
, "%% Configure the peer-group first\n");
3448 return CMD_WARNING_CONFIG_FAILED
;
3451 ret
= peer_delete(peer
);
3453 return bgp_vty_return(vty
, ret
);
3456 ALIAS_HIDDEN(no_neighbor_set_peer_group
, no_neighbor_set_peer_group_hidden_cmd
,
3457 "no neighbor <A.B.C.D|X:X::X:X|WORD> peer-group WORD",
3458 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3459 "Member of the peer-group\n"
3460 "Peer-group name\n")
3462 static int peer_flag_modify_vty(struct vty
*vty
, const char *ip_str
,
3463 uint32_t flag
, int set
)
3468 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
3470 return CMD_WARNING_CONFIG_FAILED
;
3473 * If 'neighbor <interface>', then this is for directly connected peers,
3474 * we should not accept disable-connected-check.
3476 if (peer
->conf_if
&& (flag
== PEER_FLAG_DISABLE_CONNECTED_CHECK
)) {
3478 "%s is directly connected peer, cannot accept disable-"
3479 "connected-check\n",
3481 return CMD_WARNING_CONFIG_FAILED
;
3484 if (!set
&& flag
== PEER_FLAG_SHUTDOWN
)
3485 peer_tx_shutdown_message_unset(peer
);
3488 ret
= peer_flag_set(peer
, flag
);
3490 ret
= peer_flag_unset(peer
, flag
);
3492 return bgp_vty_return(vty
, ret
);
3495 static int peer_flag_set_vty(struct vty
*vty
, const char *ip_str
, uint32_t flag
)
3497 return peer_flag_modify_vty(vty
, ip_str
, flag
, 1);
3500 static int peer_flag_unset_vty(struct vty
*vty
, const char *ip_str
,
3503 return peer_flag_modify_vty(vty
, ip_str
, flag
, 0);
3506 /* neighbor passive. */
3507 DEFUN (neighbor_passive
,
3508 neighbor_passive_cmd
,
3509 "neighbor <A.B.C.D|X:X::X:X|WORD> passive",
3512 "Don't send open messages to this neighbor\n")
3515 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
, PEER_FLAG_PASSIVE
);
3518 DEFUN (no_neighbor_passive
,
3519 no_neighbor_passive_cmd
,
3520 "no neighbor <A.B.C.D|X:X::X:X|WORD> passive",
3524 "Don't send open messages to this neighbor\n")
3527 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
, PEER_FLAG_PASSIVE
);
3530 /* neighbor shutdown. */
3531 DEFUN (neighbor_shutdown_msg
,
3532 neighbor_shutdown_msg_cmd
,
3533 "neighbor <A.B.C.D|X:X::X:X|WORD> shutdown message MSG...",
3536 "Administratively shut down this neighbor\n"
3537 "Add a shutdown message (draft-ietf-idr-shutdown-06)\n"
3538 "Shutdown message\n")
3544 peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3548 return CMD_WARNING_CONFIG_FAILED
;
3549 message
= argv_concat(argv
, argc
, 4);
3550 peer_tx_shutdown_message_set(peer
, message
);
3551 XFREE(MTYPE_TMP
, message
);
3554 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
, PEER_FLAG_SHUTDOWN
);
3557 ALIAS(neighbor_shutdown_msg
, neighbor_shutdown_cmd
,
3558 "neighbor <A.B.C.D|X:X::X:X|WORD> shutdown",
3559 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3560 "Administratively shut down this neighbor\n")
3562 DEFUN (no_neighbor_shutdown_msg
,
3563 no_neighbor_shutdown_msg_cmd
,
3564 "no neighbor <A.B.C.D|X:X::X:X|WORD> shutdown message MSG...",
3568 "Administratively shut down this neighbor\n"
3569 "Remove a shutdown message (draft-ietf-idr-shutdown-06)\n"
3570 "Shutdown message\n")
3574 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3575 PEER_FLAG_SHUTDOWN
);
3578 ALIAS(no_neighbor_shutdown_msg
, no_neighbor_shutdown_cmd
,
3579 "no neighbor <A.B.C.D|X:X::X:X|WORD> shutdown",
3580 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3581 "Administratively shut down this neighbor\n")
3583 /* neighbor capability dynamic. */
3584 DEFUN (neighbor_capability_dynamic
,
3585 neighbor_capability_dynamic_cmd
,
3586 "neighbor <A.B.C.D|X:X::X:X|WORD> capability dynamic",
3589 "Advertise capability to the peer\n"
3590 "Advertise dynamic capability to this neighbor\n")
3593 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
3594 PEER_FLAG_DYNAMIC_CAPABILITY
);
3597 DEFUN (no_neighbor_capability_dynamic
,
3598 no_neighbor_capability_dynamic_cmd
,
3599 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability dynamic",
3603 "Advertise capability to the peer\n"
3604 "Advertise dynamic capability to this neighbor\n")
3607 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3608 PEER_FLAG_DYNAMIC_CAPABILITY
);
3611 /* neighbor dont-capability-negotiate */
3612 DEFUN (neighbor_dont_capability_negotiate
,
3613 neighbor_dont_capability_negotiate_cmd
,
3614 "neighbor <A.B.C.D|X:X::X:X|WORD> dont-capability-negotiate",
3617 "Do not perform capability negotiation\n")
3620 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
3621 PEER_FLAG_DONT_CAPABILITY
);
3624 DEFUN (no_neighbor_dont_capability_negotiate
,
3625 no_neighbor_dont_capability_negotiate_cmd
,
3626 "no neighbor <A.B.C.D|X:X::X:X|WORD> dont-capability-negotiate",
3630 "Do not perform capability negotiation\n")
3633 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3634 PEER_FLAG_DONT_CAPABILITY
);
3637 /* neighbor capability extended next hop encoding */
3638 DEFUN (neighbor_capability_enhe
,
3639 neighbor_capability_enhe_cmd
,
3640 "neighbor <A.B.C.D|X:X::X:X|WORD> capability extended-nexthop",
3643 "Advertise capability to the peer\n"
3644 "Advertise extended next-hop capability to the peer\n")
3647 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
3648 PEER_FLAG_CAPABILITY_ENHE
);
3651 DEFUN (no_neighbor_capability_enhe
,
3652 no_neighbor_capability_enhe_cmd
,
3653 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability extended-nexthop",
3657 "Advertise capability to the peer\n"
3658 "Advertise extended next-hop capability to the peer\n")
3661 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3662 PEER_FLAG_CAPABILITY_ENHE
);
3665 static int peer_af_flag_modify_vty(struct vty
*vty
, const char *peer_str
,
3666 afi_t afi
, safi_t safi
, uint32_t flag
,
3672 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
3674 return CMD_WARNING_CONFIG_FAILED
;
3677 ret
= peer_af_flag_set(peer
, afi
, safi
, flag
);
3679 ret
= peer_af_flag_unset(peer
, afi
, safi
, flag
);
3681 return bgp_vty_return(vty
, ret
);
3684 static int peer_af_flag_set_vty(struct vty
*vty
, const char *peer_str
,
3685 afi_t afi
, safi_t safi
, uint32_t flag
)
3687 return peer_af_flag_modify_vty(vty
, peer_str
, afi
, safi
, flag
, 1);
3690 static int peer_af_flag_unset_vty(struct vty
*vty
, const char *peer_str
,
3691 afi_t afi
, safi_t safi
, uint32_t flag
)
3693 return peer_af_flag_modify_vty(vty
, peer_str
, afi
, safi
, flag
, 0);
3696 /* neighbor capability orf prefix-list. */
3697 DEFUN (neighbor_capability_orf_prefix
,
3698 neighbor_capability_orf_prefix_cmd
,
3699 "neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
3702 "Advertise capability to the peer\n"
3703 "Advertise ORF capability to the peer\n"
3704 "Advertise prefixlist ORF capability to this neighbor\n"
3705 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
3706 "Capability to RECEIVE the ORF from this neighbor\n"
3707 "Capability to SEND the ORF to this neighbor\n")
3710 int idx_send_recv
= 5;
3713 if (strmatch(argv
[idx_send_recv
]->text
, "send"))
3714 flag
= PEER_FLAG_ORF_PREFIX_SM
;
3715 else if (strmatch(argv
[idx_send_recv
]->text
, "receive"))
3716 flag
= PEER_FLAG_ORF_PREFIX_RM
;
3717 else if (strmatch(argv
[idx_send_recv
]->text
, "both"))
3718 flag
= PEER_FLAG_ORF_PREFIX_SM
| PEER_FLAG_ORF_PREFIX_RM
;
3720 vty_out(vty
, "%% BGP invalid orf prefix-list option\n");
3721 return CMD_WARNING_CONFIG_FAILED
;
3724 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
3725 bgp_node_safi(vty
), flag
);
3729 neighbor_capability_orf_prefix
,
3730 neighbor_capability_orf_prefix_hidden_cmd
,
3731 "neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
3732 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3733 "Advertise capability to the peer\n"
3734 "Advertise ORF capability to the peer\n"
3735 "Advertise prefixlist ORF capability to this neighbor\n"
3736 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
3737 "Capability to RECEIVE the ORF from this neighbor\n"
3738 "Capability to SEND the ORF to this neighbor\n")
3740 DEFUN (no_neighbor_capability_orf_prefix
,
3741 no_neighbor_capability_orf_prefix_cmd
,
3742 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
3746 "Advertise capability to the peer\n"
3747 "Advertise ORF capability to the peer\n"
3748 "Advertise prefixlist ORF capability to this neighbor\n"
3749 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
3750 "Capability to RECEIVE the ORF from this neighbor\n"
3751 "Capability to SEND the ORF to this neighbor\n")
3754 int idx_send_recv
= 6;
3757 if (strmatch(argv
[idx_send_recv
]->text
, "send"))
3758 flag
= PEER_FLAG_ORF_PREFIX_SM
;
3759 else if (strmatch(argv
[idx_send_recv
]->text
, "receive"))
3760 flag
= PEER_FLAG_ORF_PREFIX_RM
;
3761 else if (strmatch(argv
[idx_send_recv
]->text
, "both"))
3762 flag
= PEER_FLAG_ORF_PREFIX_SM
| PEER_FLAG_ORF_PREFIX_RM
;
3764 vty_out(vty
, "%% BGP invalid orf prefix-list option\n");
3765 return CMD_WARNING_CONFIG_FAILED
;
3768 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3769 bgp_node_afi(vty
), bgp_node_safi(vty
),
3774 no_neighbor_capability_orf_prefix
,
3775 no_neighbor_capability_orf_prefix_hidden_cmd
,
3776 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
3777 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3778 "Advertise capability to the peer\n"
3779 "Advertise ORF capability to the peer\n"
3780 "Advertise prefixlist ORF capability to this neighbor\n"
3781 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
3782 "Capability to RECEIVE the ORF from this neighbor\n"
3783 "Capability to SEND the ORF to this neighbor\n")
3785 /* neighbor next-hop-self. */
3786 DEFUN (neighbor_nexthop_self
,
3787 neighbor_nexthop_self_cmd
,
3788 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
3791 "Disable the next hop calculation for this neighbor\n")
3794 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
3795 bgp_node_safi(vty
), PEER_FLAG_NEXTHOP_SELF
);
3798 ALIAS_HIDDEN(neighbor_nexthop_self
, neighbor_nexthop_self_hidden_cmd
,
3799 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
3800 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3801 "Disable the next hop calculation for this neighbor\n")
3803 /* neighbor next-hop-self. */
3804 DEFUN (neighbor_nexthop_self_force
,
3805 neighbor_nexthop_self_force_cmd
,
3806 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
3809 "Disable the next hop calculation for this neighbor\n"
3810 "Set the next hop to self for reflected routes\n")
3813 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
3815 PEER_FLAG_FORCE_NEXTHOP_SELF
);
3818 ALIAS_HIDDEN(neighbor_nexthop_self_force
,
3819 neighbor_nexthop_self_force_hidden_cmd
,
3820 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
3821 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3822 "Disable the next hop calculation for this neighbor\n"
3823 "Set the next hop to self for reflected routes\n")
3825 DEFUN (no_neighbor_nexthop_self
,
3826 no_neighbor_nexthop_self_cmd
,
3827 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
3831 "Disable the next hop calculation for this neighbor\n")
3834 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3835 bgp_node_afi(vty
), bgp_node_safi(vty
),
3836 PEER_FLAG_NEXTHOP_SELF
);
3839 ALIAS_HIDDEN(no_neighbor_nexthop_self
, no_neighbor_nexthop_self_hidden_cmd
,
3840 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
3841 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3842 "Disable the next hop calculation for this neighbor\n")
3844 DEFUN (no_neighbor_nexthop_self_force
,
3845 no_neighbor_nexthop_self_force_cmd
,
3846 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
3850 "Disable the next hop calculation for this neighbor\n"
3851 "Set the next hop to self for reflected routes\n")
3854 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3855 bgp_node_afi(vty
), bgp_node_safi(vty
),
3856 PEER_FLAG_FORCE_NEXTHOP_SELF
);
3859 ALIAS_HIDDEN(no_neighbor_nexthop_self_force
,
3860 no_neighbor_nexthop_self_force_hidden_cmd
,
3861 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
3862 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3863 "Disable the next hop calculation for this neighbor\n"
3864 "Set the next hop to self for reflected routes\n")
3866 /* neighbor as-override */
3867 DEFUN (neighbor_as_override
,
3868 neighbor_as_override_cmd
,
3869 "neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
3872 "Override ASNs in outbound updates if aspath equals remote-as\n")
3875 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
3876 bgp_node_safi(vty
), PEER_FLAG_AS_OVERRIDE
);
3879 ALIAS_HIDDEN(neighbor_as_override
, neighbor_as_override_hidden_cmd
,
3880 "neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
3881 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3882 "Override ASNs in outbound updates if aspath equals remote-as\n")
3884 DEFUN (no_neighbor_as_override
,
3885 no_neighbor_as_override_cmd
,
3886 "no neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
3890 "Override ASNs in outbound updates if aspath equals remote-as\n")
3893 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3894 bgp_node_afi(vty
), bgp_node_safi(vty
),
3895 PEER_FLAG_AS_OVERRIDE
);
3898 ALIAS_HIDDEN(no_neighbor_as_override
, no_neighbor_as_override_hidden_cmd
,
3899 "no neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
3900 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3901 "Override ASNs in outbound updates if aspath equals remote-as\n")
3903 /* neighbor remove-private-AS. */
3904 DEFUN (neighbor_remove_private_as
,
3905 neighbor_remove_private_as_cmd
,
3906 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
3909 "Remove private ASNs in outbound updates\n")
3912 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
3914 PEER_FLAG_REMOVE_PRIVATE_AS
);
3917 ALIAS_HIDDEN(neighbor_remove_private_as
, neighbor_remove_private_as_hidden_cmd
,
3918 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
3919 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3920 "Remove private ASNs in outbound updates\n")
3922 DEFUN (neighbor_remove_private_as_all
,
3923 neighbor_remove_private_as_all_cmd
,
3924 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
3927 "Remove private ASNs in outbound updates\n"
3928 "Apply to all AS numbers\n")
3931 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
3933 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
);
3936 ALIAS_HIDDEN(neighbor_remove_private_as_all
,
3937 neighbor_remove_private_as_all_hidden_cmd
,
3938 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
3939 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3940 "Remove private ASNs in outbound updates\n"
3941 "Apply to all AS numbers")
3943 DEFUN (neighbor_remove_private_as_replace_as
,
3944 neighbor_remove_private_as_replace_as_cmd
,
3945 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
3948 "Remove private ASNs in outbound updates\n"
3949 "Replace private ASNs with our ASN in outbound updates\n")
3952 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
3954 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
);
3957 ALIAS_HIDDEN(neighbor_remove_private_as_replace_as
,
3958 neighbor_remove_private_as_replace_as_hidden_cmd
,
3959 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
3960 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3961 "Remove private ASNs in outbound updates\n"
3962 "Replace private ASNs with our ASN in outbound updates\n")
3964 DEFUN (neighbor_remove_private_as_all_replace_as
,
3965 neighbor_remove_private_as_all_replace_as_cmd
,
3966 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
3969 "Remove private ASNs in outbound updates\n"
3970 "Apply to all AS numbers\n"
3971 "Replace private ASNs with our ASN in outbound updates\n")
3974 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
3976 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
);
3980 neighbor_remove_private_as_all_replace_as
,
3981 neighbor_remove_private_as_all_replace_as_hidden_cmd
,
3982 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
3983 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3984 "Remove private ASNs in outbound updates\n"
3985 "Apply to all AS numbers\n"
3986 "Replace private ASNs with our ASN in outbound updates\n")
3988 DEFUN (no_neighbor_remove_private_as
,
3989 no_neighbor_remove_private_as_cmd
,
3990 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
3994 "Remove private ASNs in outbound updates\n")
3997 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3998 bgp_node_afi(vty
), bgp_node_safi(vty
),
3999 PEER_FLAG_REMOVE_PRIVATE_AS
);
4002 ALIAS_HIDDEN(no_neighbor_remove_private_as
,
4003 no_neighbor_remove_private_as_hidden_cmd
,
4004 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
4005 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4006 "Remove private ASNs in outbound updates\n")
4008 DEFUN (no_neighbor_remove_private_as_all
,
4009 no_neighbor_remove_private_as_all_cmd
,
4010 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
4014 "Remove private ASNs in outbound updates\n"
4015 "Apply to all AS numbers\n")
4018 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4019 bgp_node_afi(vty
), bgp_node_safi(vty
),
4020 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
);
4023 ALIAS_HIDDEN(no_neighbor_remove_private_as_all
,
4024 no_neighbor_remove_private_as_all_hidden_cmd
,
4025 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
4026 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4027 "Remove private ASNs in outbound updates\n"
4028 "Apply to all AS numbers\n")
4030 DEFUN (no_neighbor_remove_private_as_replace_as
,
4031 no_neighbor_remove_private_as_replace_as_cmd
,
4032 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
4036 "Remove private ASNs in outbound updates\n"
4037 "Replace private ASNs with our ASN in outbound updates\n")
4040 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4041 bgp_node_afi(vty
), bgp_node_safi(vty
),
4042 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
);
4045 ALIAS_HIDDEN(no_neighbor_remove_private_as_replace_as
,
4046 no_neighbor_remove_private_as_replace_as_hidden_cmd
,
4047 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
4048 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4049 "Remove private ASNs in outbound updates\n"
4050 "Replace private ASNs with our ASN in outbound updates\n")
4052 DEFUN (no_neighbor_remove_private_as_all_replace_as
,
4053 no_neighbor_remove_private_as_all_replace_as_cmd
,
4054 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
4058 "Remove private ASNs in outbound updates\n"
4059 "Apply to all AS numbers\n"
4060 "Replace private ASNs with our ASN in outbound updates\n")
4063 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4064 bgp_node_afi(vty
), bgp_node_safi(vty
),
4065 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
);
4069 no_neighbor_remove_private_as_all_replace_as
,
4070 no_neighbor_remove_private_as_all_replace_as_hidden_cmd
,
4071 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
4072 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4073 "Remove private ASNs in outbound updates\n"
4074 "Apply to all AS numbers\n"
4075 "Replace private ASNs with our ASN in outbound updates\n")
4078 /* neighbor send-community. */
4079 DEFUN (neighbor_send_community
,
4080 neighbor_send_community_cmd
,
4081 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
4084 "Send Community attribute to this neighbor\n")
4088 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4090 PEER_FLAG_SEND_COMMUNITY
);
4093 ALIAS_HIDDEN(neighbor_send_community
, neighbor_send_community_hidden_cmd
,
4094 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
4095 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4096 "Send Community attribute to this neighbor\n")
4098 DEFUN (no_neighbor_send_community
,
4099 no_neighbor_send_community_cmd
,
4100 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
4104 "Send Community attribute to this neighbor\n")
4108 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4109 bgp_node_afi(vty
), bgp_node_safi(vty
),
4110 PEER_FLAG_SEND_COMMUNITY
);
4113 ALIAS_HIDDEN(no_neighbor_send_community
, no_neighbor_send_community_hidden_cmd
,
4114 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
4115 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4116 "Send Community attribute to this neighbor\n")
4118 /* neighbor send-community extended. */
4119 DEFUN (neighbor_send_community_type
,
4120 neighbor_send_community_type_cmd
,
4121 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
4124 "Send Community attribute to this neighbor\n"
4125 "Send Standard and Extended Community attributes\n"
4126 "Send Standard, Large and Extended Community attributes\n"
4127 "Send Extended Community attributes\n"
4128 "Send Standard Community attributes\n"
4129 "Send Large Community attributes\n")
4133 const char *type
= argv
[argc
- 1]->text
;
4135 if (strmatch(type
, "standard")) {
4136 SET_FLAG(flag
, PEER_FLAG_SEND_COMMUNITY
);
4137 } else if (strmatch(type
, "extended")) {
4138 SET_FLAG(flag
, PEER_FLAG_SEND_EXT_COMMUNITY
);
4139 } else if (strmatch(type
, "large")) {
4140 SET_FLAG(flag
, PEER_FLAG_SEND_LARGE_COMMUNITY
);
4141 } else if (strmatch(type
, "both")) {
4142 SET_FLAG(flag
, PEER_FLAG_SEND_COMMUNITY
);
4143 SET_FLAG(flag
, PEER_FLAG_SEND_EXT_COMMUNITY
);
4144 } else { /* if (strmatch(type, "all")) */
4145 SET_FLAG(flag
, PEER_FLAG_SEND_COMMUNITY
);
4146 SET_FLAG(flag
, PEER_FLAG_SEND_EXT_COMMUNITY
);
4147 SET_FLAG(flag
, PEER_FLAG_SEND_LARGE_COMMUNITY
);
4150 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4151 bgp_node_safi(vty
), flag
);
4155 neighbor_send_community_type
, neighbor_send_community_type_hidden_cmd
,
4156 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
4157 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4158 "Send Community attribute to this neighbor\n"
4159 "Send Standard and Extended Community attributes\n"
4160 "Send Standard, Large and Extended Community attributes\n"
4161 "Send Extended Community attributes\n"
4162 "Send Standard Community attributes\n"
4163 "Send Large Community attributes\n")
4165 DEFUN (no_neighbor_send_community_type
,
4166 no_neighbor_send_community_type_cmd
,
4167 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
4171 "Send Community attribute to this neighbor\n"
4172 "Send Standard and Extended Community attributes\n"
4173 "Send Standard, Large and Extended Community attributes\n"
4174 "Send Extended Community attributes\n"
4175 "Send Standard Community attributes\n"
4176 "Send Large Community attributes\n")
4180 const char *type
= argv
[argc
- 1]->text
;
4182 if (strmatch(type
, "standard")) {
4183 SET_FLAG(flag
, PEER_FLAG_SEND_COMMUNITY
);
4184 } else if (strmatch(type
, "extended")) {
4185 SET_FLAG(flag
, PEER_FLAG_SEND_EXT_COMMUNITY
);
4186 } else if (strmatch(type
, "large")) {
4187 SET_FLAG(flag
, PEER_FLAG_SEND_LARGE_COMMUNITY
);
4188 } else if (strmatch(type
, "both")) {
4189 SET_FLAG(flag
, PEER_FLAG_SEND_COMMUNITY
);
4190 SET_FLAG(flag
, PEER_FLAG_SEND_EXT_COMMUNITY
);
4191 } else { /* if (strmatch(type, "all")) */
4192 SET_FLAG(flag
, PEER_FLAG_SEND_COMMUNITY
);
4193 SET_FLAG(flag
, PEER_FLAG_SEND_EXT_COMMUNITY
);
4194 SET_FLAG(flag
, PEER_FLAG_SEND_LARGE_COMMUNITY
);
4197 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4198 bgp_node_afi(vty
), bgp_node_safi(vty
),
4203 no_neighbor_send_community_type
,
4204 no_neighbor_send_community_type_hidden_cmd
,
4205 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
4206 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4207 "Send Community attribute to this neighbor\n"
4208 "Send Standard and Extended Community attributes\n"
4209 "Send Standard, Large and Extended Community attributes\n"
4210 "Send Extended Community attributes\n"
4211 "Send Standard Community attributes\n"
4212 "Send Large Community attributes\n")
4214 /* neighbor soft-reconfig. */
4215 DEFUN (neighbor_soft_reconfiguration
,
4216 neighbor_soft_reconfiguration_cmd
,
4217 "neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
4220 "Per neighbor soft reconfiguration\n"
4221 "Allow inbound soft reconfiguration for this neighbor\n")
4224 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4226 PEER_FLAG_SOFT_RECONFIG
);
4229 ALIAS_HIDDEN(neighbor_soft_reconfiguration
,
4230 neighbor_soft_reconfiguration_hidden_cmd
,
4231 "neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
4232 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4233 "Per neighbor soft reconfiguration\n"
4234 "Allow inbound soft reconfiguration for this neighbor\n")
4236 DEFUN (no_neighbor_soft_reconfiguration
,
4237 no_neighbor_soft_reconfiguration_cmd
,
4238 "no neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
4242 "Per neighbor soft reconfiguration\n"
4243 "Allow inbound soft reconfiguration for this neighbor\n")
4246 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4247 bgp_node_afi(vty
), bgp_node_safi(vty
),
4248 PEER_FLAG_SOFT_RECONFIG
);
4251 ALIAS_HIDDEN(no_neighbor_soft_reconfiguration
,
4252 no_neighbor_soft_reconfiguration_hidden_cmd
,
4253 "no neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
4254 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4255 "Per neighbor soft reconfiguration\n"
4256 "Allow inbound soft reconfiguration for this neighbor\n")
4258 DEFUN (neighbor_route_reflector_client
,
4259 neighbor_route_reflector_client_cmd
,
4260 "neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
4263 "Configure a neighbor as Route Reflector client\n")
4269 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
4271 return CMD_WARNING_CONFIG_FAILED
;
4273 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4275 PEER_FLAG_REFLECTOR_CLIENT
);
4278 ALIAS_HIDDEN(neighbor_route_reflector_client
,
4279 neighbor_route_reflector_client_hidden_cmd
,
4280 "neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
4281 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4282 "Configure a neighbor as Route Reflector client\n")
4284 DEFUN (no_neighbor_route_reflector_client
,
4285 no_neighbor_route_reflector_client_cmd
,
4286 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
4290 "Configure a neighbor as Route Reflector client\n")
4293 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4294 bgp_node_afi(vty
), bgp_node_safi(vty
),
4295 PEER_FLAG_REFLECTOR_CLIENT
);
4298 ALIAS_HIDDEN(no_neighbor_route_reflector_client
,
4299 no_neighbor_route_reflector_client_hidden_cmd
,
4300 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
4301 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4302 "Configure a neighbor as Route Reflector client\n")
4304 /* neighbor route-server-client. */
4305 DEFUN (neighbor_route_server_client
,
4306 neighbor_route_server_client_cmd
,
4307 "neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
4310 "Configure a neighbor as Route Server client\n")
4315 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
4317 return CMD_WARNING_CONFIG_FAILED
;
4318 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4320 PEER_FLAG_RSERVER_CLIENT
);
4323 ALIAS_HIDDEN(neighbor_route_server_client
,
4324 neighbor_route_server_client_hidden_cmd
,
4325 "neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
4326 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4327 "Configure a neighbor as Route Server client\n")
4329 DEFUN (no_neighbor_route_server_client
,
4330 no_neighbor_route_server_client_cmd
,
4331 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
4335 "Configure a neighbor as Route Server client\n")
4338 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4339 bgp_node_afi(vty
), bgp_node_safi(vty
),
4340 PEER_FLAG_RSERVER_CLIENT
);
4343 ALIAS_HIDDEN(no_neighbor_route_server_client
,
4344 no_neighbor_route_server_client_hidden_cmd
,
4345 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
4346 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4347 "Configure a neighbor as Route Server client\n")
4349 DEFUN (neighbor_nexthop_local_unchanged
,
4350 neighbor_nexthop_local_unchanged_cmd
,
4351 "neighbor <A.B.C.D|X:X::X:X|WORD> nexthop-local unchanged",
4354 "Configure treatment of outgoing link-local nexthop attribute\n"
4355 "Leave link-local nexthop unchanged for this peer\n")
4358 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4360 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
);
4363 DEFUN (no_neighbor_nexthop_local_unchanged
,
4364 no_neighbor_nexthop_local_unchanged_cmd
,
4365 "no neighbor <A.B.C.D|X:X::X:X|WORD> nexthop-local unchanged",
4369 "Configure treatment of outgoing link-local-nexthop attribute\n"
4370 "Leave link-local nexthop unchanged for this peer\n")
4373 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4374 bgp_node_afi(vty
), bgp_node_safi(vty
),
4375 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
);
4378 DEFUN (neighbor_attr_unchanged
,
4379 neighbor_attr_unchanged_cmd
,
4380 "neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
4383 "BGP attribute is propagated unchanged to this neighbor\n"
4384 "As-path attribute\n"
4385 "Nexthop attribute\n"
4389 char *peer_str
= argv
[1]->arg
;
4392 afi_t afi
= bgp_node_afi(vty
);
4393 safi_t safi
= bgp_node_safi(vty
);
4395 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
4397 return CMD_WARNING_CONFIG_FAILED
;
4399 if (argv_find(argv
, argc
, "as-path", &idx
))
4400 SET_FLAG(flags
, PEER_FLAG_AS_PATH_UNCHANGED
);
4402 if (argv_find(argv
, argc
, "next-hop", &idx
))
4403 SET_FLAG(flags
, PEER_FLAG_NEXTHOP_UNCHANGED
);
4405 if (argv_find(argv
, argc
, "med", &idx
))
4406 SET_FLAG(flags
, PEER_FLAG_MED_UNCHANGED
);
4408 /* no flags means all of them! */
4410 SET_FLAG(flags
, PEER_FLAG_AS_PATH_UNCHANGED
);
4411 SET_FLAG(flags
, PEER_FLAG_NEXTHOP_UNCHANGED
);
4412 SET_FLAG(flags
, PEER_FLAG_MED_UNCHANGED
);
4414 if (!CHECK_FLAG(flags
, PEER_FLAG_AS_PATH_UNCHANGED
)
4415 && peer_af_flag_check(peer
, afi
, safi
,
4416 PEER_FLAG_AS_PATH_UNCHANGED
)) {
4417 peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
4418 PEER_FLAG_AS_PATH_UNCHANGED
);
4421 if (!CHECK_FLAG(flags
, PEER_FLAG_NEXTHOP_UNCHANGED
)
4422 && peer_af_flag_check(peer
, afi
, safi
,
4423 PEER_FLAG_NEXTHOP_UNCHANGED
)) {
4424 peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
4425 PEER_FLAG_NEXTHOP_UNCHANGED
);
4428 if (!CHECK_FLAG(flags
, PEER_FLAG_MED_UNCHANGED
)
4429 && peer_af_flag_check(peer
, afi
, safi
,
4430 PEER_FLAG_MED_UNCHANGED
)) {
4431 peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
4432 PEER_FLAG_MED_UNCHANGED
);
4436 return peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
, flags
);
4440 neighbor_attr_unchanged
, neighbor_attr_unchanged_hidden_cmd
,
4441 "neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
4442 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4443 "BGP attribute is propagated unchanged to this neighbor\n"
4444 "As-path attribute\n"
4445 "Nexthop attribute\n"
4448 DEFUN (no_neighbor_attr_unchanged
,
4449 no_neighbor_attr_unchanged_cmd
,
4450 "no neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
4454 "BGP attribute is propagated unchanged to this neighbor\n"
4455 "As-path attribute\n"
4456 "Nexthop attribute\n"
4460 char *peer
= argv
[2]->arg
;
4463 if (argv_find(argv
, argc
, "as-path", &idx
))
4464 SET_FLAG(flags
, PEER_FLAG_AS_PATH_UNCHANGED
);
4466 if (argv_find(argv
, argc
, "next-hop", &idx
))
4467 SET_FLAG(flags
, PEER_FLAG_NEXTHOP_UNCHANGED
);
4469 if (argv_find(argv
, argc
, "med", &idx
))
4470 SET_FLAG(flags
, PEER_FLAG_MED_UNCHANGED
);
4472 if (!flags
) // no flags means all of them!
4474 SET_FLAG(flags
, PEER_FLAG_AS_PATH_UNCHANGED
);
4475 SET_FLAG(flags
, PEER_FLAG_NEXTHOP_UNCHANGED
);
4476 SET_FLAG(flags
, PEER_FLAG_MED_UNCHANGED
);
4479 return peer_af_flag_unset_vty(vty
, peer
, bgp_node_afi(vty
),
4480 bgp_node_safi(vty
), flags
);
4484 no_neighbor_attr_unchanged
, no_neighbor_attr_unchanged_hidden_cmd
,
4485 "no neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
4486 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4487 "BGP attribute is propagated unchanged to this neighbor\n"
4488 "As-path attribute\n"
4489 "Nexthop attribute\n"
4492 /* EBGP multihop configuration. */
4493 static int peer_ebgp_multihop_set_vty(struct vty
*vty
, const char *ip_str
,
4494 const char *ttl_str
)
4499 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
4501 return CMD_WARNING_CONFIG_FAILED
;
4504 return bgp_vty_return(vty
, BGP_ERR_INVALID_FOR_DIRECT_PEER
);
4509 ttl
= strtoul(ttl_str
, NULL
, 10);
4511 return bgp_vty_return(vty
, peer_ebgp_multihop_set(peer
, ttl
));
4514 static int peer_ebgp_multihop_unset_vty(struct vty
*vty
, const char *ip_str
)
4518 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
4520 return CMD_WARNING_CONFIG_FAILED
;
4522 return bgp_vty_return(vty
, peer_ebgp_multihop_unset(peer
));
4525 /* neighbor ebgp-multihop. */
4526 DEFUN (neighbor_ebgp_multihop
,
4527 neighbor_ebgp_multihop_cmd
,
4528 "neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop",
4531 "Allow EBGP neighbors not on directly connected networks\n")
4534 return peer_ebgp_multihop_set_vty(vty
, argv
[idx_peer
]->arg
, NULL
);
4537 DEFUN (neighbor_ebgp_multihop_ttl
,
4538 neighbor_ebgp_multihop_ttl_cmd
,
4539 "neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop (1-255)",
4542 "Allow EBGP neighbors not on directly connected networks\n"
4543 "maximum hop count\n")
4547 return peer_ebgp_multihop_set_vty(vty
, argv
[idx_peer
]->arg
,
4548 argv
[idx_number
]->arg
);
4551 DEFUN (no_neighbor_ebgp_multihop
,
4552 no_neighbor_ebgp_multihop_cmd
,
4553 "no neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop [(1-255)]",
4557 "Allow EBGP neighbors not on directly connected networks\n"
4558 "maximum hop count\n")
4561 return peer_ebgp_multihop_unset_vty(vty
, argv
[idx_peer
]->arg
);
4565 /* disable-connected-check */
4566 DEFUN (neighbor_disable_connected_check
,
4567 neighbor_disable_connected_check_cmd
,
4568 "neighbor <A.B.C.D|X:X::X:X|WORD> <disable-connected-check|enforce-multihop>",
4571 "one-hop away EBGP peer using loopback address\n"
4572 "Enforce EBGP neighbors perform multihop\n")
4575 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
4576 PEER_FLAG_DISABLE_CONNECTED_CHECK
);
4579 DEFUN (no_neighbor_disable_connected_check
,
4580 no_neighbor_disable_connected_check_cmd
,
4581 "no neighbor <A.B.C.D|X:X::X:X|WORD> <disable-connected-check|enforce-multihop>",
4585 "one-hop away EBGP peer using loopback address\n"
4586 "Enforce EBGP neighbors perform multihop\n")
4589 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4590 PEER_FLAG_DISABLE_CONNECTED_CHECK
);
4594 /* enforce-first-as */
4595 DEFUN (neighbor_enforce_first_as
,
4596 neighbor_enforce_first_as_cmd
,
4597 "neighbor <A.B.C.D|X:X::X:X|WORD> enforce-first-as",
4600 "Enforce the first AS for EBGP routes\n")
4604 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
4605 PEER_FLAG_ENFORCE_FIRST_AS
);
4608 DEFUN (no_neighbor_enforce_first_as
,
4609 no_neighbor_enforce_first_as_cmd
,
4610 "no neighbor <A.B.C.D|X:X::X:X|WORD> enforce-first-as",
4614 "Enforce the first AS for EBGP routes\n")
4618 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4619 PEER_FLAG_ENFORCE_FIRST_AS
);
4623 DEFUN (neighbor_description
,
4624 neighbor_description_cmd
,
4625 "neighbor <A.B.C.D|X:X::X:X|WORD> description LINE...",
4628 "Neighbor specific description\n"
4629 "Up to 80 characters describing this neighbor\n")
4636 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
4638 return CMD_WARNING_CONFIG_FAILED
;
4640 str
= argv_concat(argv
, argc
, idx_line
);
4642 peer_description_set(peer
, str
);
4644 XFREE(MTYPE_TMP
, str
);
4649 DEFUN (no_neighbor_description
,
4650 no_neighbor_description_cmd
,
4651 "no neighbor <A.B.C.D|X:X::X:X|WORD> description",
4655 "Neighbor specific description\n")
4660 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
4662 return CMD_WARNING_CONFIG_FAILED
;
4664 peer_description_unset(peer
);
4669 ALIAS(no_neighbor_description
, no_neighbor_description_comment_cmd
,
4670 "no neighbor <A.B.C.D|X:X::X:X|WORD> description LINE...",
4671 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4672 "Neighbor specific description\n"
4673 "Up to 80 characters describing this neighbor\n")
4675 /* Neighbor update-source. */
4676 static int peer_update_source_vty(struct vty
*vty
, const char *peer_str
,
4677 const char *source_str
)
4683 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
4685 return CMD_WARNING_CONFIG_FAILED
;
4691 if (str2sockunion(source_str
, &su
) == 0)
4692 peer_update_source_addr_set(peer
, &su
);
4694 if (str2prefix(source_str
, &p
)) {
4696 "%% Invalid update-source, remove prefix length \n");
4697 return CMD_WARNING_CONFIG_FAILED
;
4699 peer_update_source_if_set(peer
, source_str
);
4702 peer_update_source_unset(peer
);
4707 #define BGP_UPDATE_SOURCE_HELP_STR \
4710 "Interface name (requires zebra to be running)\n"
4712 DEFUN (neighbor_update_source
,
4713 neighbor_update_source_cmd
,
4714 "neighbor <A.B.C.D|X:X::X:X|WORD> update-source <A.B.C.D|X:X::X:X|WORD>",
4717 "Source of routing updates\n"
4718 BGP_UPDATE_SOURCE_HELP_STR
)
4722 return peer_update_source_vty(vty
, argv
[idx_peer
]->arg
,
4723 argv
[idx_peer_2
]->arg
);
4726 DEFUN (no_neighbor_update_source
,
4727 no_neighbor_update_source_cmd
,
4728 "no neighbor <A.B.C.D|X:X::X:X|WORD> update-source [<A.B.C.D|X:X::X:X|WORD>]",
4732 "Source of routing updates\n"
4733 BGP_UPDATE_SOURCE_HELP_STR
)
4736 return peer_update_source_vty(vty
, argv
[idx_peer
]->arg
, NULL
);
4739 static int peer_default_originate_set_vty(struct vty
*vty
, const char *peer_str
,
4740 afi_t afi
, safi_t safi
,
4741 const char *rmap
, int set
)
4746 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
4748 return CMD_WARNING_CONFIG_FAILED
;
4751 ret
= peer_default_originate_set(peer
, afi
, safi
, rmap
);
4753 ret
= peer_default_originate_unset(peer
, afi
, safi
);
4755 return bgp_vty_return(vty
, ret
);
4758 /* neighbor default-originate. */
4759 DEFUN (neighbor_default_originate
,
4760 neighbor_default_originate_cmd
,
4761 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate",
4764 "Originate default route to this neighbor\n")
4767 return peer_default_originate_set_vty(vty
, argv
[idx_peer
]->arg
,
4769 bgp_node_safi(vty
), NULL
, 1);
4772 ALIAS_HIDDEN(neighbor_default_originate
, neighbor_default_originate_hidden_cmd
,
4773 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate",
4774 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4775 "Originate default route to this neighbor\n")
4777 DEFUN (neighbor_default_originate_rmap
,
4778 neighbor_default_originate_rmap_cmd
,
4779 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate route-map WORD",
4782 "Originate default route to this neighbor\n"
4783 "Route-map to specify criteria to originate default\n"
4788 return peer_default_originate_set_vty(
4789 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
4790 argv
[idx_word
]->arg
, 1);
4794 neighbor_default_originate_rmap
,
4795 neighbor_default_originate_rmap_hidden_cmd
,
4796 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate route-map WORD",
4797 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4798 "Originate default route to this neighbor\n"
4799 "Route-map to specify criteria to originate default\n"
4802 DEFUN (no_neighbor_default_originate
,
4803 no_neighbor_default_originate_cmd
,
4804 "no neighbor <A.B.C.D|X:X::X:X|WORD> default-originate [route-map WORD]",
4808 "Originate default route to this neighbor\n"
4809 "Route-map to specify criteria to originate default\n"
4813 return peer_default_originate_set_vty(vty
, argv
[idx_peer
]->arg
,
4815 bgp_node_safi(vty
), NULL
, 0);
4819 no_neighbor_default_originate
, no_neighbor_default_originate_hidden_cmd
,
4820 "no neighbor <A.B.C.D|X:X::X:X|WORD> default-originate [route-map WORD]",
4821 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4822 "Originate default route to this neighbor\n"
4823 "Route-map to specify criteria to originate default\n"
4827 /* Set neighbor's BGP port. */
4828 static int peer_port_vty(struct vty
*vty
, const char *ip_str
, int afi
,
4829 const char *port_str
)
4835 peer
= peer_lookup_vty(vty
, ip_str
);
4837 return CMD_WARNING_CONFIG_FAILED
;
4840 sp
= getservbyname("bgp", "tcp");
4841 port
= (sp
== NULL
) ? BGP_PORT_DEFAULT
: ntohs(sp
->s_port
);
4843 port
= strtoul(port_str
, NULL
, 10);
4846 peer_port_set(peer
, port
);
4851 /* Set specified peer's BGP port. */
4852 DEFUN (neighbor_port
,
4854 "neighbor <A.B.C.D|X:X::X:X> port (0-65535)",
4857 "Neighbor's BGP port\n"
4858 "TCP port number\n")
4862 return peer_port_vty(vty
, argv
[idx_ip
]->arg
, AFI_IP
,
4863 argv
[idx_number
]->arg
);
4866 DEFUN (no_neighbor_port
,
4867 no_neighbor_port_cmd
,
4868 "no neighbor <A.B.C.D|X:X::X:X> port [(0-65535)]",
4872 "Neighbor's BGP port\n"
4873 "TCP port number\n")
4876 return peer_port_vty(vty
, argv
[idx_ip
]->arg
, AFI_IP
, NULL
);
4880 /* neighbor weight. */
4881 static int peer_weight_set_vty(struct vty
*vty
, const char *ip_str
, afi_t afi
,
4882 safi_t safi
, const char *weight_str
)
4886 unsigned long weight
;
4888 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
4890 return CMD_WARNING_CONFIG_FAILED
;
4892 weight
= strtoul(weight_str
, NULL
, 10);
4894 ret
= peer_weight_set(peer
, afi
, safi
, weight
);
4895 return bgp_vty_return(vty
, ret
);
4898 static int peer_weight_unset_vty(struct vty
*vty
, const char *ip_str
, afi_t afi
,
4904 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
4906 return CMD_WARNING_CONFIG_FAILED
;
4908 ret
= peer_weight_unset(peer
, afi
, safi
);
4909 return bgp_vty_return(vty
, ret
);
4912 DEFUN (neighbor_weight
,
4913 neighbor_weight_cmd
,
4914 "neighbor <A.B.C.D|X:X::X:X|WORD> weight (0-65535)",
4917 "Set default weight for routes from this neighbor\n"
4922 return peer_weight_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4923 bgp_node_safi(vty
), argv
[idx_number
]->arg
);
4926 ALIAS_HIDDEN(neighbor_weight
, neighbor_weight_hidden_cmd
,
4927 "neighbor <A.B.C.D|X:X::X:X|WORD> weight (0-65535)",
4928 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4929 "Set default weight for routes from this neighbor\n"
4932 DEFUN (no_neighbor_weight
,
4933 no_neighbor_weight_cmd
,
4934 "no neighbor <A.B.C.D|X:X::X:X|WORD> weight [(0-65535)]",
4938 "Set default weight for routes from this neighbor\n"
4942 return peer_weight_unset_vty(vty
, argv
[idx_peer
]->arg
,
4943 bgp_node_afi(vty
), bgp_node_safi(vty
));
4946 ALIAS_HIDDEN(no_neighbor_weight
, no_neighbor_weight_hidden_cmd
,
4947 "no neighbor <A.B.C.D|X:X::X:X|WORD> weight [(0-65535)]",
4948 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4949 "Set default weight for routes from this neighbor\n"
4953 /* Override capability negotiation. */
4954 DEFUN (neighbor_override_capability
,
4955 neighbor_override_capability_cmd
,
4956 "neighbor <A.B.C.D|X:X::X:X|WORD> override-capability",
4959 "Override capability negotiation result\n")
4962 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
4963 PEER_FLAG_OVERRIDE_CAPABILITY
);
4966 DEFUN (no_neighbor_override_capability
,
4967 no_neighbor_override_capability_cmd
,
4968 "no neighbor <A.B.C.D|X:X::X:X|WORD> override-capability",
4972 "Override capability negotiation result\n")
4975 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4976 PEER_FLAG_OVERRIDE_CAPABILITY
);
4979 DEFUN (neighbor_strict_capability
,
4980 neighbor_strict_capability_cmd
,
4981 "neighbor <A.B.C.D|X:X::X:X|WORD> strict-capability-match",
4984 "Strict capability negotiation match\n")
4988 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
4989 PEER_FLAG_STRICT_CAP_MATCH
);
4992 DEFUN (no_neighbor_strict_capability
,
4993 no_neighbor_strict_capability_cmd
,
4994 "no neighbor <A.B.C.D|X:X::X:X|WORD> strict-capability-match",
4998 "Strict capability negotiation match\n")
5002 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
5003 PEER_FLAG_STRICT_CAP_MATCH
);
5006 static int peer_timers_set_vty(struct vty
*vty
, const char *ip_str
,
5007 const char *keep_str
, const char *hold_str
)
5014 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5016 return CMD_WARNING_CONFIG_FAILED
;
5018 keepalive
= strtoul(keep_str
, NULL
, 10);
5019 holdtime
= strtoul(hold_str
, NULL
, 10);
5021 ret
= peer_timers_set(peer
, keepalive
, holdtime
);
5023 return bgp_vty_return(vty
, ret
);
5026 static int peer_timers_unset_vty(struct vty
*vty
, const char *ip_str
)
5031 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5033 return CMD_WARNING_CONFIG_FAILED
;
5035 ret
= peer_timers_unset(peer
);
5037 return bgp_vty_return(vty
, ret
);
5040 DEFUN (neighbor_timers
,
5041 neighbor_timers_cmd
,
5042 "neighbor <A.B.C.D|X:X::X:X|WORD> timers (0-65535) (0-65535)",
5045 "BGP per neighbor timers\n"
5046 "Keepalive interval\n"
5051 int idx_number_2
= 4;
5052 return peer_timers_set_vty(vty
, argv
[idx_peer
]->arg
,
5053 argv
[idx_number
]->arg
,
5054 argv
[idx_number_2
]->arg
);
5057 DEFUN (no_neighbor_timers
,
5058 no_neighbor_timers_cmd
,
5059 "no neighbor <A.B.C.D|X:X::X:X|WORD> timers [(0-65535) (0-65535)]",
5063 "BGP per neighbor timers\n"
5064 "Keepalive interval\n"
5068 return peer_timers_unset_vty(vty
, argv
[idx_peer
]->arg
);
5072 static int peer_timers_connect_set_vty(struct vty
*vty
, const char *ip_str
,
5073 const char *time_str
)
5079 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5081 return CMD_WARNING_CONFIG_FAILED
;
5083 connect
= strtoul(time_str
, NULL
, 10);
5085 ret
= peer_timers_connect_set(peer
, connect
);
5087 return bgp_vty_return(vty
, ret
);
5090 static int peer_timers_connect_unset_vty(struct vty
*vty
, const char *ip_str
)
5095 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5097 return CMD_WARNING_CONFIG_FAILED
;
5099 ret
= peer_timers_connect_unset(peer
);
5101 return bgp_vty_return(vty
, ret
);
5104 DEFUN (neighbor_timers_connect
,
5105 neighbor_timers_connect_cmd
,
5106 "neighbor <A.B.C.D|X:X::X:X|WORD> timers connect (1-65535)",
5109 "BGP per neighbor timers\n"
5110 "BGP connect timer\n"
5115 return peer_timers_connect_set_vty(vty
, argv
[idx_peer
]->arg
,
5116 argv
[idx_number
]->arg
);
5119 DEFUN (no_neighbor_timers_connect
,
5120 no_neighbor_timers_connect_cmd
,
5121 "no neighbor <A.B.C.D|X:X::X:X|WORD> timers connect [(1-65535)]",
5125 "BGP per neighbor timers\n"
5126 "BGP connect timer\n"
5130 return peer_timers_connect_unset_vty(vty
, argv
[idx_peer
]->arg
);
5134 static int peer_advertise_interval_vty(struct vty
*vty
, const char *ip_str
,
5135 const char *time_str
, int set
)
5139 uint32_t routeadv
= 0;
5141 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5143 return CMD_WARNING_CONFIG_FAILED
;
5146 routeadv
= strtoul(time_str
, NULL
, 10);
5149 ret
= peer_advertise_interval_set(peer
, routeadv
);
5151 ret
= peer_advertise_interval_unset(peer
);
5153 return bgp_vty_return(vty
, ret
);
5156 DEFUN (neighbor_advertise_interval
,
5157 neighbor_advertise_interval_cmd
,
5158 "neighbor <A.B.C.D|X:X::X:X|WORD> advertisement-interval (0-600)",
5161 "Minimum interval between sending BGP routing updates\n"
5162 "time in seconds\n")
5166 return peer_advertise_interval_vty(vty
, argv
[idx_peer
]->arg
,
5167 argv
[idx_number
]->arg
, 1);
5170 DEFUN (no_neighbor_advertise_interval
,
5171 no_neighbor_advertise_interval_cmd
,
5172 "no neighbor <A.B.C.D|X:X::X:X|WORD> advertisement-interval [(0-600)]",
5176 "Minimum interval between sending BGP routing updates\n"
5177 "time in seconds\n")
5180 return peer_advertise_interval_vty(vty
, argv
[idx_peer
]->arg
, NULL
, 0);
5184 /* Time to wait before processing route-map updates */
5185 DEFUN (bgp_set_route_map_delay_timer
,
5186 bgp_set_route_map_delay_timer_cmd
,
5187 "bgp route-map delay-timer (0-600)",
5189 "BGP route-map delay timer\n"
5190 "Time in secs to wait before processing route-map changes\n"
5191 "0 disables the timer, no route updates happen when route-maps change\n")
5194 uint32_t rmap_delay_timer
;
5196 if (argv
[idx_number
]->arg
) {
5197 rmap_delay_timer
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
5198 bm
->rmap_update_timer
= rmap_delay_timer
;
5200 /* if the dynamic update handling is being disabled, and a timer
5202 * running, stop the timer and act as if the timer has already
5205 if (!rmap_delay_timer
&& bm
->t_rmap_update
) {
5206 BGP_TIMER_OFF(bm
->t_rmap_update
);
5207 thread_execute(bm
->master
, bgp_route_map_update_timer
,
5212 vty_out(vty
, "%% BGP invalid route-map delay-timer\n");
5213 return CMD_WARNING_CONFIG_FAILED
;
5217 DEFUN (no_bgp_set_route_map_delay_timer
,
5218 no_bgp_set_route_map_delay_timer_cmd
,
5219 "no bgp route-map delay-timer [(0-600)]",
5222 "Default BGP route-map delay timer\n"
5223 "Reset to default time to wait for processing route-map changes\n"
5224 "0 disables the timer, no route updates happen when route-maps change\n")
5227 bm
->rmap_update_timer
= RMAP_DEFAULT_UPDATE_TIMER
;
5233 /* neighbor interface */
5234 static int peer_interface_vty(struct vty
*vty
, const char *ip_str
,
5239 peer
= peer_lookup_vty(vty
, ip_str
);
5240 if (!peer
|| peer
->conf_if
) {
5241 vty_out(vty
, "%% BGP invalid peer %s\n", ip_str
);
5242 return CMD_WARNING_CONFIG_FAILED
;
5246 peer_interface_set(peer
, str
);
5248 peer_interface_unset(peer
);
5253 DEFUN (neighbor_interface
,
5254 neighbor_interface_cmd
,
5255 "neighbor <A.B.C.D|X:X::X:X> interface WORD",
5263 return peer_interface_vty(vty
, argv
[idx_ip
]->arg
, argv
[idx_word
]->arg
);
5266 DEFUN (no_neighbor_interface
,
5267 no_neighbor_interface_cmd
,
5268 "no neighbor <A.B.C.D|X:X::X:X|WORD> interface WORD",
5276 return peer_interface_vty(vty
, argv
[idx_peer
]->arg
, NULL
);
5279 DEFUN (neighbor_distribute_list
,
5280 neighbor_distribute_list_cmd
,
5281 "neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list <(1-199)|(1300-2699)|WORD> <in|out>",
5284 "Filter updates to/from this neighbor\n"
5285 "IP access-list number\n"
5286 "IP access-list number (expanded range)\n"
5287 "IP Access-list name\n"
5288 "Filter incoming updates\n"
5289 "Filter outgoing updates\n")
5296 const char *pstr
= argv
[idx_peer
]->arg
;
5297 const char *acl
= argv
[idx_acl
]->arg
;
5298 const char *inout
= argv
[argc
- 1]->text
;
5300 peer
= peer_and_group_lookup_vty(vty
, pstr
);
5302 return CMD_WARNING_CONFIG_FAILED
;
5304 /* Check filter direction. */
5305 direct
= strmatch(inout
, "in") ? FILTER_IN
: FILTER_OUT
;
5306 ret
= peer_distribute_set(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5309 return bgp_vty_return(vty
, ret
);
5313 neighbor_distribute_list
, neighbor_distribute_list_hidden_cmd
,
5314 "neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list <(1-199)|(1300-2699)|WORD> <in|out>",
5315 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5316 "Filter updates to/from this neighbor\n"
5317 "IP access-list number\n"
5318 "IP access-list number (expanded range)\n"
5319 "IP Access-list name\n"
5320 "Filter incoming updates\n"
5321 "Filter outgoing updates\n")
5323 DEFUN (no_neighbor_distribute_list
,
5324 no_neighbor_distribute_list_cmd
,
5325 "no neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list <(1-199)|(1300-2699)|WORD> <in|out>",
5329 "Filter updates to/from this neighbor\n"
5330 "IP access-list number\n"
5331 "IP access-list number (expanded range)\n"
5332 "IP Access-list name\n"
5333 "Filter incoming updates\n"
5334 "Filter outgoing updates\n")
5340 const char *pstr
= argv
[idx_peer
]->arg
;
5341 const char *inout
= argv
[argc
- 1]->text
;
5343 peer
= peer_and_group_lookup_vty(vty
, pstr
);
5345 return CMD_WARNING_CONFIG_FAILED
;
5347 /* Check filter direction. */
5348 direct
= strmatch(inout
, "in") ? FILTER_IN
: FILTER_OUT
;
5349 ret
= peer_distribute_unset(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5352 return bgp_vty_return(vty
, ret
);
5356 no_neighbor_distribute_list
, no_neighbor_distribute_list_hidden_cmd
,
5357 "no neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list <(1-199)|(1300-2699)|WORD> <in|out>",
5358 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5359 "Filter updates to/from this neighbor\n"
5360 "IP access-list number\n"
5361 "IP access-list number (expanded range)\n"
5362 "IP Access-list name\n"
5363 "Filter incoming updates\n"
5364 "Filter outgoing updates\n")
5366 /* Set prefix list to the peer. */
5367 static int peer_prefix_list_set_vty(struct vty
*vty
, const char *ip_str
,
5368 afi_t afi
, safi_t safi
,
5369 const char *name_str
,
5370 const char *direct_str
)
5373 int direct
= FILTER_IN
;
5376 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5378 return CMD_WARNING_CONFIG_FAILED
;
5380 /* Check filter direction. */
5381 if (strncmp(direct_str
, "i", 1) == 0)
5383 else if (strncmp(direct_str
, "o", 1) == 0)
5384 direct
= FILTER_OUT
;
5386 ret
= peer_prefix_list_set(peer
, afi
, safi
, direct
, name_str
);
5388 return bgp_vty_return(vty
, ret
);
5391 static int peer_prefix_list_unset_vty(struct vty
*vty
, const char *ip_str
,
5392 afi_t afi
, safi_t safi
,
5393 const char *direct_str
)
5397 int direct
= FILTER_IN
;
5399 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5401 return CMD_WARNING_CONFIG_FAILED
;
5403 /* Check filter direction. */
5404 if (strncmp(direct_str
, "i", 1) == 0)
5406 else if (strncmp(direct_str
, "o", 1) == 0)
5407 direct
= FILTER_OUT
;
5409 ret
= peer_prefix_list_unset(peer
, afi
, safi
, direct
);
5411 return bgp_vty_return(vty
, ret
);
5414 DEFUN (neighbor_prefix_list
,
5415 neighbor_prefix_list_cmd
,
5416 "neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
5419 "Filter updates to/from this neighbor\n"
5420 "Name of a prefix list\n"
5421 "Filter incoming updates\n"
5422 "Filter outgoing updates\n")
5427 return peer_prefix_list_set_vty(
5428 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5429 argv
[idx_word
]->arg
, argv
[idx_in_out
]->arg
);
5432 ALIAS_HIDDEN(neighbor_prefix_list
, neighbor_prefix_list_hidden_cmd
,
5433 "neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
5434 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5435 "Filter updates to/from this neighbor\n"
5436 "Name of a prefix list\n"
5437 "Filter incoming updates\n"
5438 "Filter outgoing updates\n")
5440 DEFUN (no_neighbor_prefix_list
,
5441 no_neighbor_prefix_list_cmd
,
5442 "no neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
5446 "Filter updates to/from this neighbor\n"
5447 "Name of a prefix list\n"
5448 "Filter incoming updates\n"
5449 "Filter outgoing updates\n")
5453 return peer_prefix_list_unset_vty(vty
, argv
[idx_peer
]->arg
,
5454 bgp_node_afi(vty
), bgp_node_safi(vty
),
5455 argv
[idx_in_out
]->arg
);
5458 ALIAS_HIDDEN(no_neighbor_prefix_list
, no_neighbor_prefix_list_hidden_cmd
,
5459 "no neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
5460 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5461 "Filter updates to/from this neighbor\n"
5462 "Name of a prefix list\n"
5463 "Filter incoming updates\n"
5464 "Filter outgoing updates\n")
5466 static int peer_aslist_set_vty(struct vty
*vty
, const char *ip_str
, afi_t afi
,
5467 safi_t safi
, const char *name_str
,
5468 const char *direct_str
)
5472 int direct
= FILTER_IN
;
5474 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5476 return CMD_WARNING_CONFIG_FAILED
;
5478 /* Check filter direction. */
5479 if (strncmp(direct_str
, "i", 1) == 0)
5481 else if (strncmp(direct_str
, "o", 1) == 0)
5482 direct
= FILTER_OUT
;
5484 ret
= peer_aslist_set(peer
, afi
, safi
, direct
, name_str
);
5486 return bgp_vty_return(vty
, ret
);
5489 static int peer_aslist_unset_vty(struct vty
*vty
, const char *ip_str
, afi_t afi
,
5490 safi_t safi
, const char *direct_str
)
5494 int direct
= FILTER_IN
;
5496 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5498 return CMD_WARNING_CONFIG_FAILED
;
5500 /* Check filter direction. */
5501 if (strncmp(direct_str
, "i", 1) == 0)
5503 else if (strncmp(direct_str
, "o", 1) == 0)
5504 direct
= FILTER_OUT
;
5506 ret
= peer_aslist_unset(peer
, afi
, safi
, direct
);
5508 return bgp_vty_return(vty
, ret
);
5511 DEFUN (neighbor_filter_list
,
5512 neighbor_filter_list_cmd
,
5513 "neighbor <A.B.C.D|X:X::X:X|WORD> filter-list WORD <in|out>",
5516 "Establish BGP filters\n"
5517 "AS path access-list name\n"
5518 "Filter incoming routes\n"
5519 "Filter outgoing routes\n")
5524 return peer_aslist_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
5525 bgp_node_safi(vty
), argv
[idx_word
]->arg
,
5526 argv
[idx_in_out
]->arg
);
5529 ALIAS_HIDDEN(neighbor_filter_list
, neighbor_filter_list_hidden_cmd
,
5530 "neighbor <A.B.C.D|X:X::X:X|WORD> filter-list WORD <in|out>",
5531 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5532 "Establish BGP filters\n"
5533 "AS path access-list name\n"
5534 "Filter incoming routes\n"
5535 "Filter outgoing routes\n")
5537 DEFUN (no_neighbor_filter_list
,
5538 no_neighbor_filter_list_cmd
,
5539 "no neighbor <A.B.C.D|X:X::X:X|WORD> filter-list WORD <in|out>",
5543 "Establish BGP filters\n"
5544 "AS path access-list name\n"
5545 "Filter incoming routes\n"
5546 "Filter outgoing routes\n")
5550 return peer_aslist_unset_vty(vty
, argv
[idx_peer
]->arg
,
5551 bgp_node_afi(vty
), bgp_node_safi(vty
),
5552 argv
[idx_in_out
]->arg
);
5555 ALIAS_HIDDEN(no_neighbor_filter_list
, no_neighbor_filter_list_hidden_cmd
,
5556 "no neighbor <A.B.C.D|X:X::X:X|WORD> filter-list WORD <in|out>",
5557 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5558 "Establish BGP filters\n"
5559 "AS path access-list name\n"
5560 "Filter incoming routes\n"
5561 "Filter outgoing routes\n")
5563 /* Set route-map to the peer. */
5564 static int peer_route_map_set_vty(struct vty
*vty
, const char *ip_str
,
5565 afi_t afi
, safi_t safi
, const char *name_str
,
5566 const char *direct_str
)
5570 int direct
= RMAP_IN
;
5572 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5574 return CMD_WARNING_CONFIG_FAILED
;
5576 /* Check filter direction. */
5577 if (strncmp(direct_str
, "in", 2) == 0)
5579 else if (strncmp(direct_str
, "o", 1) == 0)
5582 ret
= peer_route_map_set(peer
, afi
, safi
, direct
, name_str
);
5584 return bgp_vty_return(vty
, ret
);
5587 static int peer_route_map_unset_vty(struct vty
*vty
, const char *ip_str
,
5588 afi_t afi
, safi_t safi
,
5589 const char *direct_str
)
5593 int direct
= RMAP_IN
;
5595 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5597 return CMD_WARNING_CONFIG_FAILED
;
5599 /* Check filter direction. */
5600 if (strncmp(direct_str
, "in", 2) == 0)
5602 else if (strncmp(direct_str
, "o", 1) == 0)
5605 ret
= peer_route_map_unset(peer
, afi
, safi
, direct
);
5607 return bgp_vty_return(vty
, ret
);
5610 DEFUN (neighbor_route_map
,
5611 neighbor_route_map_cmd
,
5612 "neighbor <A.B.C.D|X:X::X:X|WORD> route-map WORD <in|out>",
5615 "Apply route map to neighbor\n"
5616 "Name of route map\n"
5617 "Apply map to incoming routes\n"
5618 "Apply map to outbound routes\n")
5623 return peer_route_map_set_vty(
5624 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5625 argv
[idx_word
]->arg
, argv
[idx_in_out
]->arg
);
5628 ALIAS_HIDDEN(neighbor_route_map
, neighbor_route_map_hidden_cmd
,
5629 "neighbor <A.B.C.D|X:X::X:X|WORD> route-map WORD <in|out>",
5630 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5631 "Apply route map to neighbor\n"
5632 "Name of route map\n"
5633 "Apply map to incoming routes\n"
5634 "Apply map to outbound routes\n")
5636 DEFUN (no_neighbor_route_map
,
5637 no_neighbor_route_map_cmd
,
5638 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-map WORD <in|out>",
5642 "Apply route map to neighbor\n"
5643 "Name of route map\n"
5644 "Apply map to incoming routes\n"
5645 "Apply map to outbound routes\n")
5649 return peer_route_map_unset_vty(vty
, argv
[idx_peer
]->arg
,
5650 bgp_node_afi(vty
), bgp_node_safi(vty
),
5651 argv
[idx_in_out
]->arg
);
5654 ALIAS_HIDDEN(no_neighbor_route_map
, no_neighbor_route_map_hidden_cmd
,
5655 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-map WORD <in|out>",
5656 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5657 "Apply route map to neighbor\n"
5658 "Name of route map\n"
5659 "Apply map to incoming routes\n"
5660 "Apply map to outbound routes\n")
5662 /* Set unsuppress-map to the peer. */
5663 static int peer_unsuppress_map_set_vty(struct vty
*vty
, const char *ip_str
,
5664 afi_t afi
, safi_t safi
,
5665 const char *name_str
)
5670 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5672 return CMD_WARNING_CONFIG_FAILED
;
5674 ret
= peer_unsuppress_map_set(peer
, afi
, safi
, name_str
);
5676 return bgp_vty_return(vty
, ret
);
5679 /* Unset route-map from the peer. */
5680 static int peer_unsuppress_map_unset_vty(struct vty
*vty
, const char *ip_str
,
5681 afi_t afi
, safi_t safi
)
5686 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5688 return CMD_WARNING_CONFIG_FAILED
;
5690 ret
= peer_unsuppress_map_unset(peer
, afi
, safi
);
5692 return bgp_vty_return(vty
, ret
);
5695 DEFUN (neighbor_unsuppress_map
,
5696 neighbor_unsuppress_map_cmd
,
5697 "neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
5700 "Route-map to selectively unsuppress suppressed routes\n"
5701 "Name of route map\n")
5705 return peer_unsuppress_map_set_vty(
5706 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5707 argv
[idx_word
]->arg
);
5710 ALIAS_HIDDEN(neighbor_unsuppress_map
, neighbor_unsuppress_map_hidden_cmd
,
5711 "neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
5712 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5713 "Route-map to selectively unsuppress suppressed routes\n"
5714 "Name of route map\n")
5716 DEFUN (no_neighbor_unsuppress_map
,
5717 no_neighbor_unsuppress_map_cmd
,
5718 "no neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
5722 "Route-map to selectively unsuppress suppressed routes\n"
5723 "Name of route map\n")
5726 return peer_unsuppress_map_unset_vty(vty
, argv
[idx_peer
]->arg
,
5728 bgp_node_safi(vty
));
5731 ALIAS_HIDDEN(no_neighbor_unsuppress_map
, no_neighbor_unsuppress_map_hidden_cmd
,
5732 "no neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
5733 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5734 "Route-map to selectively unsuppress suppressed routes\n"
5735 "Name of route map\n")
5737 static int peer_maximum_prefix_set_vty(struct vty
*vty
, const char *ip_str
,
5738 afi_t afi
, safi_t safi
,
5739 const char *num_str
,
5740 const char *threshold_str
, int warning
,
5741 const char *restart_str
)
5749 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5751 return CMD_WARNING_CONFIG_FAILED
;
5753 max
= strtoul(num_str
, NULL
, 10);
5755 threshold
= atoi(threshold_str
);
5757 threshold
= MAXIMUM_PREFIX_THRESHOLD_DEFAULT
;
5760 restart
= atoi(restart_str
);
5764 ret
= peer_maximum_prefix_set(peer
, afi
, safi
, max
, threshold
, warning
,
5767 return bgp_vty_return(vty
, ret
);
5770 static int peer_maximum_prefix_unset_vty(struct vty
*vty
, const char *ip_str
,
5771 afi_t afi
, safi_t safi
)
5776 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5778 return CMD_WARNING_CONFIG_FAILED
;
5780 ret
= peer_maximum_prefix_unset(peer
, afi
, safi
);
5782 return bgp_vty_return(vty
, ret
);
5785 /* Maximum number of prefix configuration. prefix count is different
5786 for each peer configuration. So this configuration can be set for
5787 each peer configuration. */
5788 DEFUN (neighbor_maximum_prefix
,
5789 neighbor_maximum_prefix_cmd
,
5790 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295)",
5793 "Maximum number of prefix accept from this peer\n"
5794 "maximum no. of prefix limit\n")
5798 return peer_maximum_prefix_set_vty(
5799 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5800 argv
[idx_number
]->arg
, NULL
, 0, NULL
);
5803 ALIAS_HIDDEN(neighbor_maximum_prefix
, neighbor_maximum_prefix_hidden_cmd
,
5804 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295)",
5805 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5806 "Maximum number of prefix accept from this peer\n"
5807 "maximum no. of prefix limit\n")
5809 DEFUN (neighbor_maximum_prefix_threshold
,
5810 neighbor_maximum_prefix_threshold_cmd
,
5811 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100)",
5814 "Maximum number of prefix accept from this peer\n"
5815 "maximum no. of prefix limit\n"
5816 "Threshold value (%) at which to generate a warning msg\n")
5820 int idx_number_2
= 4;
5821 return peer_maximum_prefix_set_vty(
5822 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5823 argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
, 0, NULL
);
5827 neighbor_maximum_prefix_threshold
,
5828 neighbor_maximum_prefix_threshold_hidden_cmd
,
5829 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100)",
5830 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5831 "Maximum number of prefix accept from this peer\n"
5832 "maximum no. of prefix limit\n"
5833 "Threshold value (%) at which to generate a warning msg\n")
5835 DEFUN (neighbor_maximum_prefix_warning
,
5836 neighbor_maximum_prefix_warning_cmd
,
5837 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) warning-only",
5840 "Maximum number of prefix accept from this peer\n"
5841 "maximum no. of prefix limit\n"
5842 "Only give warning message when limit is exceeded\n")
5846 return peer_maximum_prefix_set_vty(
5847 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5848 argv
[idx_number
]->arg
, NULL
, 1, NULL
);
5852 neighbor_maximum_prefix_warning
,
5853 neighbor_maximum_prefix_warning_hidden_cmd
,
5854 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) warning-only",
5855 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5856 "Maximum number of prefix accept from this peer\n"
5857 "maximum no. of prefix limit\n"
5858 "Only give warning message when limit is exceeded\n")
5860 DEFUN (neighbor_maximum_prefix_threshold_warning
,
5861 neighbor_maximum_prefix_threshold_warning_cmd
,
5862 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) warning-only",
5865 "Maximum number of prefix accept from this peer\n"
5866 "maximum no. of prefix limit\n"
5867 "Threshold value (%) at which to generate a warning msg\n"
5868 "Only give warning message when limit is exceeded\n")
5872 int idx_number_2
= 4;
5873 return peer_maximum_prefix_set_vty(
5874 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5875 argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
, 1, NULL
);
5879 neighbor_maximum_prefix_threshold_warning
,
5880 neighbor_maximum_prefix_threshold_warning_hidden_cmd
,
5881 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) warning-only",
5882 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5883 "Maximum number of prefix accept from this peer\n"
5884 "maximum no. of prefix limit\n"
5885 "Threshold value (%) at which to generate a warning msg\n"
5886 "Only give warning message when limit is exceeded\n")
5888 DEFUN (neighbor_maximum_prefix_restart
,
5889 neighbor_maximum_prefix_restart_cmd
,
5890 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) restart (1-65535)",
5893 "Maximum number of prefix accept from this peer\n"
5894 "maximum no. of prefix limit\n"
5895 "Restart bgp connection after limit is exceeded\n"
5896 "Restart interval in minutes\n")
5900 int idx_number_2
= 5;
5901 return peer_maximum_prefix_set_vty(
5902 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5903 argv
[idx_number
]->arg
, NULL
, 0, argv
[idx_number_2
]->arg
);
5907 neighbor_maximum_prefix_restart
,
5908 neighbor_maximum_prefix_restart_hidden_cmd
,
5909 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) restart (1-65535)",
5910 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5911 "Maximum number of prefix accept from this peer\n"
5912 "maximum no. of prefix limit\n"
5913 "Restart bgp connection after limit is exceeded\n"
5914 "Restart interval in minutes\n")
5916 DEFUN (neighbor_maximum_prefix_threshold_restart
,
5917 neighbor_maximum_prefix_threshold_restart_cmd
,
5918 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) restart (1-65535)",
5921 "Maximum number of prefixes to accept from this peer\n"
5922 "maximum no. of prefix limit\n"
5923 "Threshold value (%) at which to generate a warning msg\n"
5924 "Restart bgp connection after limit is exceeded\n"
5925 "Restart interval in minutes\n")
5929 int idx_number_2
= 4;
5930 int idx_number_3
= 6;
5931 return peer_maximum_prefix_set_vty(
5932 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5933 argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
, 0,
5934 argv
[idx_number_3
]->arg
);
5938 neighbor_maximum_prefix_threshold_restart
,
5939 neighbor_maximum_prefix_threshold_restart_hidden_cmd
,
5940 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) restart (1-65535)",
5941 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5942 "Maximum number of prefixes to accept from this peer\n"
5943 "maximum no. of prefix limit\n"
5944 "Threshold value (%) at which to generate a warning msg\n"
5945 "Restart bgp connection after limit is exceeded\n"
5946 "Restart interval in minutes\n")
5948 DEFUN (no_neighbor_maximum_prefix
,
5949 no_neighbor_maximum_prefix_cmd
,
5950 "no neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix [(1-4294967295) [(1-100)] [restart (1-65535)] [warning-only]]",
5954 "Maximum number of prefixes to accept from this peer\n"
5955 "maximum no. of prefix limit\n"
5956 "Threshold value (%) at which to generate a warning msg\n"
5957 "Restart bgp connection after limit is exceeded\n"
5958 "Restart interval in minutes\n"
5959 "Only give warning message when limit is exceeded\n")
5962 return peer_maximum_prefix_unset_vty(vty
, argv
[idx_peer
]->arg
,
5964 bgp_node_safi(vty
));
5968 no_neighbor_maximum_prefix
, no_neighbor_maximum_prefix_hidden_cmd
,
5969 "no neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix [(1-4294967295) [(1-100)] [restart (1-65535)] [warning-only]]",
5970 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5971 "Maximum number of prefixes to accept from this peer\n"
5972 "maximum no. of prefix limit\n"
5973 "Threshold value (%) at which to generate a warning msg\n"
5974 "Restart bgp connection after limit is exceeded\n"
5975 "Restart interval in minutes\n"
5976 "Only give warning message when limit is exceeded\n")
5979 /* "neighbor allowas-in" */
5980 DEFUN (neighbor_allowas_in
,
5981 neighbor_allowas_in_cmd
,
5982 "neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
5985 "Accept as-path with my AS present in it\n"
5986 "Number of occurances of AS number\n"
5987 "Only accept my AS in the as-path if the route was originated in my AS\n")
5990 int idx_number_origin
= 3;
5996 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
5998 return CMD_WARNING_CONFIG_FAILED
;
6000 if (argc
<= idx_number_origin
)
6003 if (argv
[idx_number_origin
]->type
== WORD_TKN
)
6006 allow_num
= atoi(argv
[idx_number_origin
]->arg
);
6009 ret
= peer_allowas_in_set(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6012 return bgp_vty_return(vty
, ret
);
6016 neighbor_allowas_in
, neighbor_allowas_in_hidden_cmd
,
6017 "neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
6018 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6019 "Accept as-path with my AS present in it\n"
6020 "Number of occurances of AS number\n"
6021 "Only accept my AS in the as-path if the route was originated in my AS\n")
6023 DEFUN (no_neighbor_allowas_in
,
6024 no_neighbor_allowas_in_cmd
,
6025 "no neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
6029 "allow local ASN appears in aspath attribute\n"
6030 "Number of occurances of AS number\n"
6031 "Only accept my AS in the as-path if the route was originated in my AS\n")
6037 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6039 return CMD_WARNING_CONFIG_FAILED
;
6041 ret
= peer_allowas_in_unset(peer
, bgp_node_afi(vty
),
6042 bgp_node_safi(vty
));
6044 return bgp_vty_return(vty
, ret
);
6048 no_neighbor_allowas_in
, no_neighbor_allowas_in_hidden_cmd
,
6049 "no neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
6050 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6051 "allow local ASN appears in aspath attribute\n"
6052 "Number of occurances of AS number\n"
6053 "Only accept my AS in the as-path if the route was originated in my AS\n")
6055 DEFUN (neighbor_ttl_security
,
6056 neighbor_ttl_security_cmd
,
6057 "neighbor <A.B.C.D|X:X::X:X|WORD> ttl-security hops (1-254)",
6060 "BGP ttl-security parameters\n"
6061 "Specify the maximum number of hops to the BGP peer\n"
6062 "Number of hops to BGP peer\n")
6069 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6071 return CMD_WARNING_CONFIG_FAILED
;
6073 gtsm_hops
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
6076 * If 'neighbor swpX', then this is for directly connected peers,
6077 * we should not accept a ttl-security hops value greater than 1.
6079 if (peer
->conf_if
&& (gtsm_hops
> 1)) {
6081 "%s is directly connected peer, hops cannot exceed 1\n",
6082 argv
[idx_peer
]->arg
);
6083 return CMD_WARNING_CONFIG_FAILED
;
6086 return bgp_vty_return(vty
, peer_ttl_security_hops_set(peer
, gtsm_hops
));
6089 DEFUN (no_neighbor_ttl_security
,
6090 no_neighbor_ttl_security_cmd
,
6091 "no neighbor <A.B.C.D|X:X::X:X|WORD> ttl-security hops (1-254)",
6095 "BGP ttl-security parameters\n"
6096 "Specify the maximum number of hops to the BGP peer\n"
6097 "Number of hops to BGP peer\n")
6102 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6104 return CMD_WARNING_CONFIG_FAILED
;
6106 return bgp_vty_return(vty
, peer_ttl_security_hops_unset(peer
));
6109 DEFUN (neighbor_addpath_tx_all_paths
,
6110 neighbor_addpath_tx_all_paths_cmd
,
6111 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
6114 "Use addpath to advertise all paths to a neighbor\n")
6119 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6121 return CMD_WARNING_CONFIG_FAILED
;
6123 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
6125 PEER_FLAG_ADDPATH_TX_ALL_PATHS
);
6128 ALIAS_HIDDEN(neighbor_addpath_tx_all_paths
,
6129 neighbor_addpath_tx_all_paths_hidden_cmd
,
6130 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
6131 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6132 "Use addpath to advertise all paths to a neighbor\n")
6134 DEFUN (no_neighbor_addpath_tx_all_paths
,
6135 no_neighbor_addpath_tx_all_paths_cmd
,
6136 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
6140 "Use addpath to advertise all paths to a neighbor\n")
6143 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
6144 bgp_node_afi(vty
), bgp_node_safi(vty
),
6145 PEER_FLAG_ADDPATH_TX_ALL_PATHS
);
6148 ALIAS_HIDDEN(no_neighbor_addpath_tx_all_paths
,
6149 no_neighbor_addpath_tx_all_paths_hidden_cmd
,
6150 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
6151 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6152 "Use addpath to advertise all paths to a neighbor\n")
6154 DEFUN (neighbor_addpath_tx_bestpath_per_as
,
6155 neighbor_addpath_tx_bestpath_per_as_cmd
,
6156 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
6159 "Use addpath to advertise the bestpath per each neighboring AS\n")
6164 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6166 return CMD_WARNING_CONFIG_FAILED
;
6168 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
6170 PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS
);
6173 ALIAS_HIDDEN(neighbor_addpath_tx_bestpath_per_as
,
6174 neighbor_addpath_tx_bestpath_per_as_hidden_cmd
,
6175 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
6176 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6177 "Use addpath to advertise the bestpath per each neighboring AS\n")
6179 DEFUN (no_neighbor_addpath_tx_bestpath_per_as
,
6180 no_neighbor_addpath_tx_bestpath_per_as_cmd
,
6181 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
6185 "Use addpath to advertise the bestpath per each neighboring AS\n")
6188 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
6189 bgp_node_afi(vty
), bgp_node_safi(vty
),
6190 PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS
);
6193 ALIAS_HIDDEN(no_neighbor_addpath_tx_bestpath_per_as
,
6194 no_neighbor_addpath_tx_bestpath_per_as_hidden_cmd
,
6195 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
6196 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6197 "Use addpath to advertise the bestpath per each neighboring AS\n")
6199 static int set_ecom_list(struct vty
*vty
, int argc
, struct cmd_token
**argv
,
6200 struct ecommunity
**list
)
6202 struct ecommunity
*ecom
= NULL
;
6203 struct ecommunity
*ecomadd
;
6205 for (; argc
; --argc
, ++argv
) {
6207 ecomadd
= ecommunity_str2com(argv
[0]->arg
,
6208 ECOMMUNITY_ROUTE_TARGET
, 0);
6210 vty_out(vty
, "Malformed community-list value\n");
6212 ecommunity_free(&ecom
);
6213 return CMD_WARNING_CONFIG_FAILED
;
6217 ecommunity_merge(ecom
, ecomadd
);
6218 ecommunity_free(&ecomadd
);
6225 ecommunity_free(&*list
);
6233 * v2vimport is true if we are handling a `import vrf ...` command
6235 static afi_t
vpn_policy_getafi(struct vty
*vty
, struct bgp
*bgp
, bool v2vimport
)
6239 switch (vty
->node
) {
6248 "%% context error: valid only in address-family <ipv4|ipv6> unicast block\n");
6253 if (CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
6254 BGP_CONFIG_VRF_TO_VRF_IMPORT
)
6255 || CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
6256 BGP_CONFIG_VRF_TO_VRF_EXPORT
)) {
6258 "%% error: Please unconfigure import vrf commands before using vpn commands\n");
6262 if (CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
6263 BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT
)
6264 || CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
6265 BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT
)) {
6267 "%% error: Please unconfigure vpn to vrf commands before using import vrf commands\n");
6274 DEFPY (af_rd_vpn_export
,
6275 af_rd_vpn_export_cmd
,
6276 "[no] rd vpn export ASN:NN_OR_IP-ADDRESS:NN$rd_str",
6278 "Specify route distinguisher\n"
6279 "Between current address-family and vpn\n"
6280 "For routes leaked from current address-family to vpn\n"
6281 "Route Distinguisher (<as-number>:<number> | <ip-address>:<number>)\n")
6283 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6284 struct prefix_rd prd
;
6290 if (argv_find(argv
, argc
, "no", &idx
))
6294 ret
= str2prefix_rd(rd_str
, &prd
);
6296 vty_out(vty
, "%% Malformed rd\n");
6297 return CMD_WARNING_CONFIG_FAILED
;
6301 afi
= vpn_policy_getafi(vty
, bgp
, false);
6303 return CMD_WARNING_CONFIG_FAILED
;
6306 * pre-change: un-export vpn routes (vpn->vrf routes unaffected)
6308 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6309 bgp_get_default(), bgp
);
6312 bgp
->vpn_policy
[afi
].tovpn_rd
= prd
;
6313 SET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6314 BGP_VPN_POLICY_TOVPN_RD_SET
);
6316 UNSET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6317 BGP_VPN_POLICY_TOVPN_RD_SET
);
6320 /* post-change: re-export vpn routes */
6321 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6322 bgp_get_default(), bgp
);
6327 ALIAS (af_rd_vpn_export
,
6328 af_no_rd_vpn_export_cmd
,
6331 "Specify route distinguisher\n"
6332 "Between current address-family and vpn\n"
6333 "For routes leaked from current address-family to vpn\n")
6335 DEFPY (af_label_vpn_export
,
6336 af_label_vpn_export_cmd
,
6337 "[no] label vpn export <(0-1048575)$label_val|auto$label_auto>",
6339 "label value for VRF\n"
6340 "Between current address-family and vpn\n"
6341 "For routes leaked from current address-family to vpn\n"
6342 "Label Value <0-1048575>\n"
6343 "Automatically assign a label\n")
6345 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6346 mpls_label_t label
= MPLS_LABEL_NONE
;
6351 if (argv_find(argv
, argc
, "no", &idx
))
6354 /* If "no ...", squash trailing parameter */
6360 label
= label_val
; /* parser should force unsigned */
6363 afi
= vpn_policy_getafi(vty
, bgp
, false);
6365 return CMD_WARNING_CONFIG_FAILED
;
6368 if (label_auto
&& CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
6369 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
))
6374 * pre-change: un-export vpn routes (vpn->vrf routes unaffected)
6376 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6377 bgp_get_default(), bgp
);
6379 if (!label_auto
&& CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
6380 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
)) {
6382 if (bgp
->vpn_policy
[afi
].tovpn_label
!= MPLS_LABEL_NONE
) {
6385 * label has previously been automatically
6386 * assigned by labelpool: release it
6388 * NB if tovpn_label == MPLS_LABEL_NONE it
6389 * means the automatic assignment is in flight
6390 * and therefore the labelpool callback must
6391 * detect that the auto label is not needed.
6394 bgp_lp_release(LP_TYPE_VRF
,
6395 &bgp
->vpn_policy
[afi
],
6396 bgp
->vpn_policy
[afi
].tovpn_label
);
6398 UNSET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6399 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
);
6402 bgp
->vpn_policy
[afi
].tovpn_label
= label
;
6404 SET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6405 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
);
6406 bgp_lp_get(LP_TYPE_VRF
, &bgp
->vpn_policy
[afi
],
6407 vpn_leak_label_callback
);
6410 /* post-change: re-export vpn routes */
6411 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6412 bgp_get_default(), bgp
);
6417 ALIAS (af_label_vpn_export
,
6418 af_no_label_vpn_export_cmd
,
6419 "no label vpn export",
6421 "label value for VRF\n"
6422 "Between current address-family and vpn\n"
6423 "For routes leaked from current address-family to vpn\n")
6425 DEFPY (af_nexthop_vpn_export
,
6426 af_nexthop_vpn_export_cmd
,
6427 "[no] nexthop vpn export <A.B.C.D|X:X::X:X>$nexthop_str",
6429 "Specify next hop to use for VRF advertised prefixes\n"
6430 "Between current address-family and vpn\n"
6431 "For routes leaked from current address-family to vpn\n"
6435 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6441 if (argv_find(argv
, argc
, "no", &idx
))
6445 if (!sockunion2hostprefix(nexthop_str
, &p
))
6446 return CMD_WARNING_CONFIG_FAILED
;
6449 afi
= vpn_policy_getafi(vty
, bgp
, false);
6451 return CMD_WARNING_CONFIG_FAILED
;
6454 * pre-change: un-export vpn routes (vpn->vrf routes unaffected)
6456 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6457 bgp_get_default(), bgp
);
6460 bgp
->vpn_policy
[afi
].tovpn_nexthop
= p
;
6461 SET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6462 BGP_VPN_POLICY_TOVPN_NEXTHOP_SET
);
6464 UNSET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6465 BGP_VPN_POLICY_TOVPN_NEXTHOP_SET
);
6468 /* post-change: re-export vpn routes */
6469 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6470 bgp_get_default(), bgp
);
6475 ALIAS (af_nexthop_vpn_export
,
6476 af_no_nexthop_vpn_export_cmd
,
6477 "no nexthop vpn export",
6479 "Specify next hop to use for VRF advertised prefixes\n"
6480 "Between current address-family and vpn\n"
6481 "For routes leaked from current address-family to vpn\n")
6483 static int vpn_policy_getdirs(struct vty
*vty
, const char *dstr
, int *dodir
)
6485 if (!strcmp(dstr
, "import")) {
6486 dodir
[BGP_VPN_POLICY_DIR_FROMVPN
] = 1;
6487 } else if (!strcmp(dstr
, "export")) {
6488 dodir
[BGP_VPN_POLICY_DIR_TOVPN
] = 1;
6489 } else if (!strcmp(dstr
, "both")) {
6490 dodir
[BGP_VPN_POLICY_DIR_FROMVPN
] = 1;
6491 dodir
[BGP_VPN_POLICY_DIR_TOVPN
] = 1;
6493 vty_out(vty
, "%% direction parse error\n");
6494 return CMD_WARNING_CONFIG_FAILED
;
6499 DEFPY (af_rt_vpn_imexport
,
6500 af_rt_vpn_imexport_cmd
,
6501 "[no] <rt|route-target> vpn <import|export|both>$direction_str RTLIST...",
6503 "Specify route target list\n"
6504 "Specify route target list\n"
6505 "Between current address-family and vpn\n"
6506 "For routes leaked from vpn to current address-family: match any\n"
6507 "For routes leaked from current address-family to vpn: set\n"
6508 "both import: match any and export: set\n"
6509 "Space separated route target list (A.B.C.D:MN|EF:OPQR|GHJK:MN)\n")
6511 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6513 struct ecommunity
*ecom
= NULL
;
6514 int dodir
[BGP_VPN_POLICY_DIR_MAX
] = {0};
6515 vpn_policy_direction_t dir
;
6520 if (argv_find(argv
, argc
, "no", &idx
))
6523 afi
= vpn_policy_getafi(vty
, bgp
, false);
6525 return CMD_WARNING_CONFIG_FAILED
;
6527 ret
= vpn_policy_getdirs(vty
, direction_str
, dodir
);
6528 if (ret
!= CMD_SUCCESS
)
6532 if (!argv_find(argv
, argc
, "RTLIST", &idx
)) {
6533 vty_out(vty
, "%% Missing RTLIST\n");
6534 return CMD_WARNING_CONFIG_FAILED
;
6536 ret
= set_ecom_list(vty
, argc
- idx
, argv
+ idx
, &ecom
);
6537 if (ret
!= CMD_SUCCESS
) {
6542 for (dir
= 0; dir
< BGP_VPN_POLICY_DIR_MAX
; ++dir
) {
6546 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
6549 if (bgp
->vpn_policy
[afi
].rtlist
[dir
])
6551 &bgp
->vpn_policy
[afi
].rtlist
[dir
]);
6552 bgp
->vpn_policy
[afi
].rtlist
[dir
] =
6553 ecommunity_dup(ecom
);
6555 if (bgp
->vpn_policy
[afi
].rtlist
[dir
])
6557 &bgp
->vpn_policy
[afi
].rtlist
[dir
]);
6558 bgp
->vpn_policy
[afi
].rtlist
[dir
] = NULL
;
6561 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
6565 ecommunity_free(&ecom
);
6570 ALIAS (af_rt_vpn_imexport
,
6571 af_no_rt_vpn_imexport_cmd
,
6572 "no <rt|route-target> vpn <import|export|both>$direction_str",
6574 "Specify route target list\n"
6575 "Specify route target list\n"
6576 "Between current address-family and vpn\n"
6577 "For routes leaked from vpn to current address-family\n"
6578 "For routes leaked from current address-family to vpn\n"
6579 "both import and export\n")
6581 DEFPY (af_route_map_vpn_imexport
,
6582 af_route_map_vpn_imexport_cmd
,
6583 /* future: "route-map <vpn|evpn|vrf NAME> <import|export> RMAP" */
6584 "[no] route-map vpn <import|export>$direction_str RMAP$rmap_str",
6586 "Specify route map\n"
6587 "Between current address-family and vpn\n"
6588 "For routes leaked from vpn to current address-family\n"
6589 "For routes leaked from current address-family to vpn\n"
6590 "name of route-map\n")
6592 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6594 int dodir
[BGP_VPN_POLICY_DIR_MAX
] = {0};
6595 vpn_policy_direction_t dir
;
6600 if (argv_find(argv
, argc
, "no", &idx
))
6603 afi
= vpn_policy_getafi(vty
, bgp
, false);
6605 return CMD_WARNING_CONFIG_FAILED
;
6607 ret
= vpn_policy_getdirs(vty
, direction_str
, dodir
);
6608 if (ret
!= CMD_SUCCESS
)
6611 for (dir
= 0; dir
< BGP_VPN_POLICY_DIR_MAX
; ++dir
) {
6615 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
6618 if (bgp
->vpn_policy
[afi
].rmap_name
[dir
])
6619 XFREE(MTYPE_ROUTE_MAP_NAME
,
6620 bgp
->vpn_policy
[afi
].rmap_name
[dir
]);
6621 bgp
->vpn_policy
[afi
].rmap_name
[dir
] = XSTRDUP(
6622 MTYPE_ROUTE_MAP_NAME
, rmap_str
);
6623 bgp
->vpn_policy
[afi
].rmap
[dir
] =
6624 route_map_lookup_by_name(rmap_str
);
6625 if (!bgp
->vpn_policy
[afi
].rmap
[dir
])
6628 if (bgp
->vpn_policy
[afi
].rmap_name
[dir
])
6629 XFREE(MTYPE_ROUTE_MAP_NAME
,
6630 bgp
->vpn_policy
[afi
].rmap_name
[dir
]);
6631 bgp
->vpn_policy
[afi
].rmap_name
[dir
] = NULL
;
6632 bgp
->vpn_policy
[afi
].rmap
[dir
] = NULL
;
6635 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
6641 ALIAS (af_route_map_vpn_imexport
,
6642 af_no_route_map_vpn_imexport_cmd
,
6643 "no route-map vpn <import|export>$direction_str",
6645 "Specify route map\n"
6646 "Between current address-family and vpn\n"
6647 "For routes leaked from vpn to current address-family\n"
6648 "For routes leaked from current address-family to vpn\n")
6650 DEFPY(af_import_vrf_route_map
, af_import_vrf_route_map_cmd
,
6651 "[no] import vrf route-map RMAP$rmap_str",
6653 "Import routes from another VRF\n"
6654 "Vrf routes being filtered\n"
6655 "Specify route map\n"
6656 "name of route-map\n")
6658 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6659 vpn_policy_direction_t dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
6663 struct bgp
*bgp_default
;
6665 if (argv_find(argv
, argc
, "no", &idx
))
6668 afi
= vpn_policy_getafi(vty
, bgp
, true);
6670 return CMD_WARNING_CONFIG_FAILED
;
6672 bgp_default
= bgp_get_default();
6677 /* Auto-create assuming the same AS */
6678 ret
= bgp_get(&bgp_default
, &as
, NULL
,
6679 BGP_INSTANCE_TYPE_DEFAULT
);
6683 "VRF default is not configured as a bgp instance\n");
6688 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
6691 if (bgp
->vpn_policy
[afi
].rmap_name
[dir
])
6692 XFREE(MTYPE_ROUTE_MAP_NAME
,
6693 bgp
->vpn_policy
[afi
].rmap_name
[dir
]);
6694 bgp
->vpn_policy
[afi
].rmap_name
[dir
] =
6695 XSTRDUP(MTYPE_ROUTE_MAP_NAME
, rmap_str
);
6696 bgp
->vpn_policy
[afi
].rmap
[dir
] =
6697 route_map_lookup_by_name(rmap_str
);
6698 if (!bgp
->vpn_policy
[afi
].rmap
[dir
])
6701 if (bgp
->vpn_policy
[afi
].rmap_name
[dir
])
6702 XFREE(MTYPE_ROUTE_MAP_NAME
,
6703 bgp
->vpn_policy
[afi
].rmap_name
[dir
]);
6704 bgp
->vpn_policy
[afi
].rmap_name
[dir
] = NULL
;
6705 bgp
->vpn_policy
[afi
].rmap
[dir
] = NULL
;
6708 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
6713 ALIAS(af_import_vrf_route_map
, af_no_import_vrf_route_map_cmd
,
6714 "no import vrf route-map",
6716 "Import routes from another VRF\n"
6717 "Vrf routes being filtered\n"
6718 "Specify route map\n")
6720 DEFPY (bgp_imexport_vrf
,
6721 bgp_imexport_vrf_cmd
,
6722 "[no] import vrf NAME$import_name",
6724 "Import routes from another VRF\n"
6725 "VRF to import from\n"
6726 "The name of the VRF\n")
6728 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6729 struct listnode
*node
;
6730 struct bgp
*vrf_bgp
, *bgp_default
;
6733 bool remove
= false;
6736 enum bgp_instance_type bgp_type
= BGP_INSTANCE_TYPE_VRF
;
6740 if (import_name
== NULL
) {
6741 vty_out(vty
, "%% Missing import name\n");
6745 if (argv_find(argv
, argc
, "no", &idx
))
6748 afi
= vpn_policy_getafi(vty
, bgp
, true);
6750 return CMD_WARNING_CONFIG_FAILED
;
6752 safi
= bgp_node_safi(vty
);
6754 if (((BGP_INSTANCE_TYPE_DEFAULT
== bgp
->inst_type
)
6755 && (strcmp(import_name
, BGP_DEFAULT_NAME
) == 0))
6756 || (bgp
->name
&& (strcmp(import_name
, bgp
->name
) == 0))) {
6757 vty_out(vty
, "%% Cannot %s vrf %s into itself\n",
6758 remove
? "unimport" : "import", import_name
);
6762 bgp_default
= bgp_get_default();
6764 /* Auto-create assuming the same AS */
6765 ret
= bgp_get(&bgp_default
, &as
, NULL
,
6766 BGP_INSTANCE_TYPE_DEFAULT
);
6770 "VRF default is not configured as a bgp instance\n");
6775 vrf_bgp
= bgp_lookup_by_name(import_name
);
6777 if (strcmp(import_name
, BGP_DEFAULT_NAME
) == 0)
6778 vrf_bgp
= bgp_default
;
6780 /* Auto-create assuming the same AS */
6781 ret
= bgp_get(&vrf_bgp
, &as
, import_name
, bgp_type
);
6785 "VRF %s is not configured as a bgp instance\n",
6792 vrf_unimport_from_vrf(bgp
, vrf_bgp
, afi
, safi
);
6794 /* Already importing from "import_vrf"? */
6795 for (ALL_LIST_ELEMENTS_RO(bgp
->vpn_policy
[afi
].import_vrf
, node
,
6797 if (strcmp(vname
, import_name
) == 0)
6801 vrf_import_from_vrf(bgp
, vrf_bgp
, afi
, safi
);
6807 /* This command is valid only in a bgp vrf instance or the default instance */
6808 DEFPY (bgp_imexport_vpn
,
6809 bgp_imexport_vpn_cmd
,
6810 "[no] <import|export>$direction_str vpn",
6812 "Import routes to this address-family\n"
6813 "Export routes from this address-family\n"
6814 "to/from default instance VPN RIB\n")
6816 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6823 vpn_policy_direction_t dir
;
6825 if (argv_find(argv
, argc
, "no", &idx
))
6828 if (BGP_INSTANCE_TYPE_VRF
!= bgp
->inst_type
&&
6829 BGP_INSTANCE_TYPE_DEFAULT
!= bgp
->inst_type
) {
6831 vty_out(vty
, "%% import|export vpn valid only for bgp vrf or default instance\n");
6832 return CMD_WARNING_CONFIG_FAILED
;
6835 afi
= bgp_node_afi(vty
);
6836 safi
= bgp_node_safi(vty
);
6837 if ((SAFI_UNICAST
!= safi
) || ((AFI_IP
!= afi
) && (AFI_IP6
!= afi
))) {
6838 vty_out(vty
, "%% import|export vpn valid only for unicast ipv4|ipv6\n");
6839 return CMD_WARNING_CONFIG_FAILED
;
6842 if (!strcmp(direction_str
, "import")) {
6843 flag
= BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT
;
6844 dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
6845 } else if (!strcmp(direction_str
, "export")) {
6846 flag
= BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT
;
6847 dir
= BGP_VPN_POLICY_DIR_TOVPN
;
6849 vty_out(vty
, "%% unknown direction %s\n", direction_str
);
6850 return CMD_WARNING_CONFIG_FAILED
;
6853 previous_state
= CHECK_FLAG(bgp
->af_flags
[afi
][safi
], flag
);
6856 SET_FLAG(bgp
->af_flags
[afi
][safi
], flag
);
6857 if (!previous_state
) {
6858 /* trigger export current vrf */
6859 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
6862 if (previous_state
) {
6863 /* trigger un-export current vrf */
6864 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
6866 UNSET_FLAG(bgp
->af_flags
[afi
][safi
], flag
);
6872 DEFPY (af_routetarget_import
,
6873 af_routetarget_import_cmd
,
6874 "[no] <rt|route-target> redirect import RTLIST...",
6876 "Specify route target list\n"
6877 "Specify route target list\n"
6878 "Flow-spec redirect type route target\n"
6879 "Import routes to this address-family\n"
6880 "Space separated route target list (A.B.C.D:MN|EF:OPQR|GHJK:MN)\n")
6882 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6884 struct ecommunity
*ecom
= NULL
;
6889 if (argv_find(argv
, argc
, "no", &idx
))
6892 afi
= vpn_policy_getafi(vty
, bgp
, false);
6894 return CMD_WARNING_CONFIG_FAILED
;
6897 if (!argv_find(argv
, argc
, "RTLIST", &idx
)) {
6898 vty_out(vty
, "%% Missing RTLIST\n");
6899 return CMD_WARNING_CONFIG_FAILED
;
6901 ret
= set_ecom_list(vty
, argc
- idx
, argv
+ idx
, &ecom
);
6902 if (ret
!= CMD_SUCCESS
)
6907 if (bgp
->vpn_policy
[afi
].import_redirect_rtlist
)
6908 ecommunity_free(&bgp
->vpn_policy
[afi
]
6909 .import_redirect_rtlist
);
6910 bgp
->vpn_policy
[afi
].import_redirect_rtlist
=
6911 ecommunity_dup(ecom
);
6913 if (bgp
->vpn_policy
[afi
].import_redirect_rtlist
)
6914 ecommunity_free(&bgp
->vpn_policy
[afi
]
6915 .import_redirect_rtlist
);
6916 bgp
->vpn_policy
[afi
].import_redirect_rtlist
= NULL
;
6920 ecommunity_free(&ecom
);
6925 DEFUN_NOSH (address_family_ipv4_safi
,
6926 address_family_ipv4_safi_cmd
,
6927 "address-family ipv4 [<unicast|multicast|vpn|labeled-unicast|flowspec>]",
6928 "Enter Address Family command mode\n"
6930 BGP_SAFI_WITH_LABEL_HELP_STR
)
6934 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6935 safi_t safi
= bgp_vty_safi_from_str(argv
[2]->text
);
6936 if (bgp
->inst_type
!= BGP_INSTANCE_TYPE_DEFAULT
6937 && safi
!= SAFI_UNICAST
&& safi
!= SAFI_MULTICAST
6938 && safi
!= SAFI_EVPN
) {
6940 "Only Unicast/Multicast/EVPN SAFIs supported in non-core instances.\n");
6941 return CMD_WARNING_CONFIG_FAILED
;
6943 vty
->node
= bgp_node_type(AFI_IP
, safi
);
6945 vty
->node
= BGP_IPV4_NODE
;
6950 DEFUN_NOSH (address_family_ipv6_safi
,
6951 address_family_ipv6_safi_cmd
,
6952 "address-family ipv6 [<unicast|multicast|vpn|labeled-unicast|flowspec>]",
6953 "Enter Address Family command mode\n"
6955 BGP_SAFI_WITH_LABEL_HELP_STR
)
6958 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6959 safi_t safi
= bgp_vty_safi_from_str(argv
[2]->text
);
6960 if (bgp
->inst_type
!= BGP_INSTANCE_TYPE_DEFAULT
6961 && safi
!= SAFI_UNICAST
&& safi
!= SAFI_MULTICAST
6962 && safi
!= SAFI_EVPN
) {
6964 "Only Unicast/Multicast/EVPN SAFIs supported in non-core instances.\n");
6965 return CMD_WARNING_CONFIG_FAILED
;
6967 vty
->node
= bgp_node_type(AFI_IP6
, safi
);
6969 vty
->node
= BGP_IPV6_NODE
;
6974 #ifdef KEEP_OLD_VPN_COMMANDS
6975 DEFUN_NOSH (address_family_vpnv4
,
6976 address_family_vpnv4_cmd
,
6977 "address-family vpnv4 [unicast]",
6978 "Enter Address Family command mode\n"
6980 "Address Family modifier\n")
6982 vty
->node
= BGP_VPNV4_NODE
;
6986 DEFUN_NOSH (address_family_vpnv6
,
6987 address_family_vpnv6_cmd
,
6988 "address-family vpnv6 [unicast]",
6989 "Enter Address Family command mode\n"
6991 "Address Family modifier\n")
6993 vty
->node
= BGP_VPNV6_NODE
;
6998 DEFUN_NOSH (address_family_evpn
,
6999 address_family_evpn_cmd
,
7000 "address-family l2vpn evpn",
7001 "Enter Address Family command mode\n"
7003 "Address Family modifier\n")
7005 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
7006 vty
->node
= BGP_EVPN_NODE
;
7010 DEFUN_NOSH (exit_address_family
,
7011 exit_address_family_cmd
,
7012 "exit-address-family",
7013 "Exit from Address Family configuration mode\n")
7015 if (vty
->node
== BGP_IPV4_NODE
|| vty
->node
== BGP_IPV4M_NODE
7016 || vty
->node
== BGP_IPV4L_NODE
|| vty
->node
== BGP_VPNV4_NODE
7017 || vty
->node
== BGP_IPV6_NODE
|| vty
->node
== BGP_IPV6M_NODE
7018 || vty
->node
== BGP_IPV6L_NODE
|| vty
->node
== BGP_VPNV6_NODE
7019 || vty
->node
== BGP_EVPN_NODE
7020 || vty
->node
== BGP_FLOWSPECV4_NODE
7021 || vty
->node
== BGP_FLOWSPECV6_NODE
)
7022 vty
->node
= BGP_NODE
;
7026 /* Recalculate bestpath and re-advertise a prefix */
7027 static int bgp_clear_prefix(struct vty
*vty
, const char *view_name
,
7028 const char *ip_str
, afi_t afi
, safi_t safi
,
7029 struct prefix_rd
*prd
)
7032 struct prefix match
;
7033 struct bgp_node
*rn
;
7034 struct bgp_node
*rm
;
7036 struct bgp_table
*table
;
7037 struct bgp_table
*rib
;
7039 /* BGP structure lookup. */
7041 bgp
= bgp_lookup_by_name(view_name
);
7043 vty_out(vty
, "%% Can't find BGP instance %s\n",
7048 bgp
= bgp_get_default();
7050 vty_out(vty
, "%% No BGP process is configured\n");
7055 /* Check IP address argument. */
7056 ret
= str2prefix(ip_str
, &match
);
7058 vty_out(vty
, "%% address is malformed\n");
7062 match
.family
= afi2family(afi
);
7063 rib
= bgp
->rib
[afi
][safi
];
7065 if (safi
== SAFI_MPLS_VPN
) {
7066 for (rn
= bgp_table_top(rib
); rn
; rn
= bgp_route_next(rn
)) {
7067 if (prd
&& memcmp(rn
->p
.u
.val
, prd
->val
, 8) != 0)
7070 if ((table
= rn
->info
) != NULL
) {
7071 if ((rm
= bgp_node_match(table
, &match
))
7074 == match
.prefixlen
) {
7076 BGP_NODE_USER_CLEAR
);
7077 bgp_process(bgp
, rm
, afi
, safi
);
7079 bgp_unlock_node(rm
);
7084 if ((rn
= bgp_node_match(rib
, &match
)) != NULL
) {
7085 if (rn
->p
.prefixlen
== match
.prefixlen
) {
7086 SET_FLAG(rn
->flags
, BGP_NODE_USER_CLEAR
);
7087 bgp_process(bgp
, rn
, afi
, safi
);
7089 bgp_unlock_node(rn
);
7096 /* one clear bgp command to rule them all */
7097 DEFUN (clear_ip_bgp_all
,
7098 clear_ip_bgp_all_cmd
,
7099 "clear [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR
" ["BGP_SAFI_WITH_LABEL_CMD_STR
"]] <*|A.B.C.D|X:X::X:X|WORD|(1-4294967295)|external|peer-group WORD> [<soft [<in|out>]|in [prefix-filter]|out>]",
7103 BGP_INSTANCE_HELP_STR
7105 BGP_SAFI_WITH_LABEL_HELP_STR
7107 "BGP neighbor address to clear\n"
7108 "BGP IPv6 neighbor to clear\n"
7109 "BGP neighbor on interface to clear\n"
7110 "Clear peers with the AS number\n"
7111 "Clear all external peers\n"
7112 "Clear all members of peer-group\n"
7113 "BGP peer-group name\n"
7118 "Push out prefix-list ORF and do inbound soft reconfig\n"
7123 afi_t afi
= AFI_IP6
;
7124 safi_t safi
= SAFI_UNICAST
;
7125 enum clear_sort clr_sort
= clear_peer
;
7126 enum bgp_clear_type clr_type
;
7127 char *clr_arg
= NULL
;
7131 /* clear [ip] bgp */
7132 if (argv_find(argv
, argc
, "ip", &idx
))
7135 /* [<view|vrf> VIEWVRFNAME] */
7136 if (argv_find(argv
, argc
, "view", &idx
)
7137 || argv_find(argv
, argc
, "vrf", &idx
)) {
7138 vrf
= argv
[idx
+ 1]->arg
;
7142 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
7143 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
))
7144 argv_find_and_parse_safi(argv
, argc
, &idx
, &safi
);
7146 /* <*|A.B.C.D|X:X::X:X|WORD|(1-4294967295)|external|peer-group WORD> */
7147 if (argv_find(argv
, argc
, "*", &idx
)) {
7148 clr_sort
= clear_all
;
7149 } else if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7150 clr_sort
= clear_peer
;
7151 clr_arg
= argv
[idx
]->arg
;
7152 } else if (argv_find(argv
, argc
, "X:X::X:X", &idx
)) {
7153 clr_sort
= clear_peer
;
7154 clr_arg
= argv
[idx
]->arg
;
7155 } else if (argv_find(argv
, argc
, "peer-group", &idx
)) {
7156 clr_sort
= clear_group
;
7158 clr_arg
= argv
[idx
]->arg
;
7159 } else if (argv_find(argv
, argc
, "WORD", &idx
)) {
7160 clr_sort
= clear_peer
;
7161 clr_arg
= argv
[idx
]->arg
;
7162 } else if (argv_find(argv
, argc
, "(1-4294967295)", &idx
)) {
7163 clr_sort
= clear_as
;
7164 clr_arg
= argv
[idx
]->arg
;
7165 } else if (argv_find(argv
, argc
, "external", &idx
)) {
7166 clr_sort
= clear_external
;
7169 /* [<soft [<in|out>]|in [prefix-filter]|out>] */
7170 if (argv_find(argv
, argc
, "soft", &idx
)) {
7171 if (argv_find(argv
, argc
, "in", &idx
)
7172 || argv_find(argv
, argc
, "out", &idx
))
7173 clr_type
= strmatch(argv
[idx
]->text
, "in")
7175 : BGP_CLEAR_SOFT_OUT
;
7177 clr_type
= BGP_CLEAR_SOFT_BOTH
;
7178 } else if (argv_find(argv
, argc
, "in", &idx
)) {
7179 clr_type
= argv_find(argv
, argc
, "prefix-filter", &idx
)
7180 ? BGP_CLEAR_SOFT_IN_ORF_PREFIX
7181 : BGP_CLEAR_SOFT_IN
;
7182 } else if (argv_find(argv
, argc
, "out", &idx
)) {
7183 clr_type
= BGP_CLEAR_SOFT_OUT
;
7185 clr_type
= BGP_CLEAR_SOFT_NONE
;
7187 return bgp_clear_vty(vty
, vrf
, afi
, safi
, clr_sort
, clr_type
, clr_arg
);
7190 DEFUN (clear_ip_bgp_prefix
,
7191 clear_ip_bgp_prefix_cmd
,
7192 "clear [ip] bgp [<view|vrf> VIEWVRFNAME] prefix A.B.C.D/M",
7196 BGP_INSTANCE_HELP_STR
7197 "Clear bestpath and re-advertise\n"
7201 char *prefix
= NULL
;
7205 /* [<view|vrf> VIEWVRFNAME] */
7206 if (argv_find(argv
, argc
, "VIEWVRFNAME", &idx
))
7207 vrf
= argv
[idx
]->arg
;
7209 prefix
= argv
[argc
- 1]->arg
;
7211 return bgp_clear_prefix(vty
, vrf
, prefix
, AFI_IP
, SAFI_UNICAST
, NULL
);
7214 DEFUN (clear_bgp_ipv6_safi_prefix
,
7215 clear_bgp_ipv6_safi_prefix_cmd
,
7216 "clear [ip] bgp ipv6 "BGP_SAFI_CMD_STR
" prefix X:X::X:X/M",
7222 "Clear bestpath and re-advertise\n"
7226 int idx_ipv6_prefix
= 0;
7227 safi_t safi
= SAFI_UNICAST
;
7228 char *prefix
= argv_find(argv
, argc
, "X:X::X:X/M", &idx_ipv6_prefix
) ?
7229 argv
[idx_ipv6_prefix
]->arg
: NULL
;
7231 argv_find_and_parse_safi(argv
, argc
, &idx_safi
, &safi
);
7232 return bgp_clear_prefix(
7233 vty
, NULL
, prefix
, AFI_IP6
,
7237 DEFUN (clear_bgp_instance_ipv6_safi_prefix
,
7238 clear_bgp_instance_ipv6_safi_prefix_cmd
,
7239 "clear [ip] bgp <view|vrf> VIEWVRFNAME ipv6 "BGP_SAFI_CMD_STR
" prefix X:X::X:X/M",
7243 BGP_INSTANCE_HELP_STR
7246 "Clear bestpath and re-advertise\n"
7251 int idx_ipv6_prefix
= 0;
7252 safi_t safi
= SAFI_UNICAST
;
7253 char *prefix
= argv_find(argv
, argc
, "X:X::X:X/M", &idx_ipv6_prefix
) ?
7254 argv
[idx_ipv6_prefix
]->arg
: NULL
;
7255 /* [<view|vrf> VIEWVRFNAME] */
7256 char *vrfview
= argv_find(argv
, argc
, "VIEWVRFNAME", &idx_word
) ?
7257 argv
[idx_word
]->arg
: NULL
;
7259 argv_find_and_parse_safi(argv
, argc
, &idx_safi
, &safi
);
7261 return bgp_clear_prefix(
7262 vty
, vrfview
, prefix
,
7263 AFI_IP6
, safi
, NULL
);
7266 DEFUN (show_bgp_views
,
7268 "show [ip] bgp views",
7272 "Show the defined BGP views\n")
7274 struct list
*inst
= bm
->bgp
;
7275 struct listnode
*node
;
7278 if (!bgp_option_check(BGP_OPT_MULTIPLE_INSTANCE
)) {
7279 vty_out(vty
, "BGP Multiple Instance is not enabled\n");
7283 vty_out(vty
, "Defined BGP views:\n");
7284 for (ALL_LIST_ELEMENTS_RO(inst
, node
, bgp
)) {
7286 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_VRF
)
7288 vty_out(vty
, "\t%s (AS%u)\n", bgp
->name
? bgp
->name
: "(null)",
7295 DEFUN (show_bgp_vrfs
,
7297 "show [ip] bgp vrfs [json]",
7304 char buf
[ETHER_ADDR_STRLEN
];
7305 struct list
*inst
= bm
->bgp
;
7306 struct listnode
*node
;
7308 uint8_t uj
= use_json(argc
, argv
);
7309 json_object
*json
= NULL
;
7310 json_object
*json_vrfs
= NULL
;
7313 if (!bgp_option_check(BGP_OPT_MULTIPLE_INSTANCE
)) {
7314 vty_out(vty
, "BGP Multiple Instance is not enabled\n");
7319 json
= json_object_new_object();
7320 json_vrfs
= json_object_new_object();
7323 for (ALL_LIST_ELEMENTS_RO(inst
, node
, bgp
)) {
7324 const char *name
, *type
;
7326 struct listnode
*node
, *nnode
;
7327 int peers_cfg
, peers_estb
;
7328 json_object
*json_vrf
= NULL
;
7331 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_VIEW
)
7335 if (!uj
&& count
== 1)
7337 "%4s %-5s %-16s %9s %10s %-37s %-10s %-15s\n",
7338 "Type", "Id", "routerId", "#PeersVfg",
7339 "#PeersEstb", "Name", "L3-VNI", "Rmac");
7341 peers_cfg
= peers_estb
= 0;
7343 json_vrf
= json_object_new_object();
7346 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
7347 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
7350 if (peer
->status
== Established
)
7354 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
) {
7364 int64_t vrf_id_ui
= (bgp
->vrf_id
== VRF_UNKNOWN
)
7366 : (int64_t)bgp
->vrf_id
;
7367 json_object_string_add(json_vrf
, "type", type
);
7368 json_object_int_add(json_vrf
, "vrfId", vrf_id_ui
);
7369 json_object_string_add(json_vrf
, "routerId",
7370 inet_ntoa(bgp
->router_id
));
7371 json_object_int_add(json_vrf
, "numConfiguredPeers",
7373 json_object_int_add(json_vrf
, "numEstablishedPeers",
7376 json_object_int_add(json_vrf
, "l3vni", bgp
->l3vni
);
7377 json_object_string_add(
7379 prefix_mac2str(&bgp
->rmac
, buf
, sizeof(buf
)));
7380 json_object_object_add(json_vrfs
, name
, json_vrf
);
7383 "%4s %-5d %-16s %9u %10u %-37s %-10u %-15s\n",
7385 bgp
->vrf_id
== VRF_UNKNOWN
? -1
7387 inet_ntoa(bgp
->router_id
), peers_cfg
,
7388 peers_estb
, name
, bgp
->l3vni
,
7389 prefix_mac2str(&bgp
->rmac
, buf
, sizeof(buf
)));
7393 json_object_object_add(json
, "vrfs", json_vrfs
);
7395 json_object_int_add(json
, "totalVrfs", count
);
7397 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
7398 json
, JSON_C_TO_STRING_PRETTY
));
7399 json_object_free(json
);
7403 "\nTotal number of VRFs (including default): %d\n",
7410 static void show_address_entry(struct hash_backet
*backet
, void *args
)
7412 struct vty
*vty
= (struct vty
*)args
;
7413 struct bgp_addr
*addr
= (struct bgp_addr
*)backet
->data
;
7415 vty_out(vty
, "addr: %s, count: %d\n", inet_ntoa(addr
->addr
),
7419 static void show_tip_entry(struct hash_backet
*backet
, void *args
)
7421 struct vty
*vty
= (struct vty
*)args
;
7422 struct tip_addr
*tip
= (struct tip_addr
*)backet
->data
;
7424 vty_out(vty
, "addr: %s, count: %d\n", inet_ntoa(tip
->addr
),
7428 static void bgp_show_martian_nexthops(struct vty
*vty
, struct bgp
*bgp
)
7430 vty_out(vty
, "self nexthop database:\n");
7431 hash_iterate(bgp
->address_hash
,
7432 (void (*)(struct hash_backet
*, void *))show_address_entry
,
7435 vty_out(vty
, "Tunnel-ip database:\n");
7436 hash_iterate(bgp
->tip_hash
,
7437 (void (*)(struct hash_backet
*, void *))show_tip_entry
,
7441 DEFUN(show_bgp_martian_nexthop_db
, show_bgp_martian_nexthop_db_cmd
,
7442 "show bgp [<view|vrf> VIEWVRFNAME] martian next-hop",
7443 SHOW_STR BGP_STR BGP_INSTANCE_HELP_STR
7444 "martian next-hops\n"
7445 "martian next-hop database\n")
7447 struct bgp
*bgp
= NULL
;
7450 if (argv_find(argv
, argc
, "view", &idx
)
7451 || argv_find(argv
, argc
, "vrf", &idx
))
7452 bgp
= bgp_lookup_by_name(argv
[idx
+ 1]->arg
);
7454 bgp
= bgp_get_default();
7457 vty_out(vty
, "%% No BGP process is configured\n");
7460 bgp_show_martian_nexthops(vty
, bgp
);
7465 DEFUN (show_bgp_memory
,
7466 show_bgp_memory_cmd
,
7467 "show [ip] bgp memory",
7471 "Global BGP memory statistics\n")
7473 char memstrbuf
[MTYPE_MEMSTR_LEN
];
7474 unsigned long count
;
7476 /* RIB related usage stats */
7477 count
= mtype_stats_alloc(MTYPE_BGP_NODE
);
7478 vty_out(vty
, "%ld RIB nodes, using %s of memory\n", count
,
7479 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7480 count
* sizeof(struct bgp_node
)));
7482 count
= mtype_stats_alloc(MTYPE_BGP_ROUTE
);
7483 vty_out(vty
, "%ld BGP routes, using %s of memory\n", count
,
7484 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7485 count
* sizeof(struct bgp_info
)));
7486 if ((count
= mtype_stats_alloc(MTYPE_BGP_ROUTE_EXTRA
)))
7487 vty_out(vty
, "%ld BGP route ancillaries, using %s of memory\n",
7489 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7490 count
* sizeof(struct bgp_info_extra
)));
7492 if ((count
= mtype_stats_alloc(MTYPE_BGP_STATIC
)))
7493 vty_out(vty
, "%ld Static routes, using %s of memory\n", count
,
7494 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7495 count
* sizeof(struct bgp_static
)));
7497 if ((count
= mtype_stats_alloc(MTYPE_BGP_PACKET
)))
7498 vty_out(vty
, "%ld Packets, using %s of memory\n", count
,
7499 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7500 count
* sizeof(struct bpacket
)));
7503 if ((count
= mtype_stats_alloc(MTYPE_BGP_ADJ_IN
)))
7504 vty_out(vty
, "%ld Adj-In entries, using %s of memory\n", count
,
7505 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7506 count
* sizeof(struct bgp_adj_in
)));
7507 if ((count
= mtype_stats_alloc(MTYPE_BGP_ADJ_OUT
)))
7508 vty_out(vty
, "%ld Adj-Out entries, using %s of memory\n", count
,
7509 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7510 count
* sizeof(struct bgp_adj_out
)));
7512 if ((count
= mtype_stats_alloc(MTYPE_BGP_NEXTHOP_CACHE
)))
7513 vty_out(vty
, "%ld Nexthop cache entries, using %s of memory\n",
7515 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7516 count
* sizeof(struct bgp_nexthop_cache
)));
7518 if ((count
= mtype_stats_alloc(MTYPE_BGP_DAMP_INFO
)))
7519 vty_out(vty
, "%ld Dampening entries, using %s of memory\n",
7521 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7522 count
* sizeof(struct bgp_damp_info
)));
7525 count
= attr_count();
7526 vty_out(vty
, "%ld BGP attributes, using %s of memory\n", count
,
7527 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7528 count
* sizeof(struct attr
)));
7530 if ((count
= attr_unknown_count()))
7531 vty_out(vty
, "%ld unknown attributes\n", count
);
7533 /* AS_PATH attributes */
7534 count
= aspath_count();
7535 vty_out(vty
, "%ld BGP AS-PATH entries, using %s of memory\n", count
,
7536 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7537 count
* sizeof(struct aspath
)));
7539 count
= mtype_stats_alloc(MTYPE_AS_SEG
);
7540 vty_out(vty
, "%ld BGP AS-PATH segments, using %s of memory\n", count
,
7541 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7542 count
* sizeof(struct assegment
)));
7544 /* Other attributes */
7545 if ((count
= community_count()))
7546 vty_out(vty
, "%ld BGP community entries, using %s of memory\n",
7547 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7548 count
* sizeof(struct community
)));
7549 if ((count
= mtype_stats_alloc(MTYPE_ECOMMUNITY
)))
7550 vty_out(vty
, "%ld BGP community entries, using %s of memory\n",
7551 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7552 count
* sizeof(struct ecommunity
)));
7553 if ((count
= mtype_stats_alloc(MTYPE_LCOMMUNITY
)))
7555 "%ld BGP large-community entries, using %s of memory\n",
7556 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7557 count
* sizeof(struct lcommunity
)));
7559 if ((count
= mtype_stats_alloc(MTYPE_CLUSTER
)))
7560 vty_out(vty
, "%ld Cluster lists, using %s of memory\n", count
,
7561 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7562 count
* sizeof(struct cluster_list
)));
7564 /* Peer related usage */
7565 count
= mtype_stats_alloc(MTYPE_BGP_PEER
);
7566 vty_out(vty
, "%ld peers, using %s of memory\n", count
,
7567 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7568 count
* sizeof(struct peer
)));
7570 if ((count
= mtype_stats_alloc(MTYPE_PEER_GROUP
)))
7571 vty_out(vty
, "%ld peer groups, using %s of memory\n", count
,
7572 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7573 count
* sizeof(struct peer_group
)));
7576 if ((count
= mtype_stats_alloc(MTYPE_HASH
)))
7577 vty_out(vty
, "%ld hash tables, using %s of memory\n", count
,
7578 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7579 count
* sizeof(struct hash
)));
7580 if ((count
= mtype_stats_alloc(MTYPE_HASH_BACKET
)))
7581 vty_out(vty
, "%ld hash buckets, using %s of memory\n", count
,
7582 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7583 count
* sizeof(struct hash_backet
)));
7584 if ((count
= mtype_stats_alloc(MTYPE_BGP_REGEXP
)))
7585 vty_out(vty
, "%ld compiled regexes, using %s of memory\n",
7586 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7587 count
* sizeof(regex_t
)));
7591 static void bgp_show_bestpath_json(struct bgp
*bgp
, json_object
*json
)
7593 json_object
*bestpath
= json_object_new_object();
7595 if (bgp_flag_check(bgp
, BGP_FLAG_ASPATH_IGNORE
))
7596 json_object_string_add(bestpath
, "asPath", "ignore");
7598 if (bgp_flag_check(bgp
, BGP_FLAG_ASPATH_CONFED
))
7599 json_object_string_add(bestpath
, "asPath", "confed");
7601 if (bgp_flag_check(bgp
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
)) {
7602 if (bgp_flag_check(bgp
, BGP_FLAG_MULTIPATH_RELAX_AS_SET
))
7603 json_object_string_add(bestpath
, "multiPathRelax",
7606 json_object_string_add(bestpath
, "multiPathRelax",
7609 json_object_string_add(bestpath
, "multiPathRelax", "false");
7611 if (bgp_flag_check(bgp
, BGP_FLAG_COMPARE_ROUTER_ID
))
7612 json_object_string_add(bestpath
, "compareRouterId", "true");
7613 if (bgp_flag_check(bgp
, BGP_FLAG_MED_CONFED
)
7614 || bgp_flag_check(bgp
, BGP_FLAG_MED_MISSING_AS_WORST
)) {
7615 if (bgp_flag_check(bgp
, BGP_FLAG_MED_CONFED
))
7616 json_object_string_add(bestpath
, "med", "confed");
7617 if (bgp_flag_check(bgp
, BGP_FLAG_MED_MISSING_AS_WORST
))
7618 json_object_string_add(bestpath
, "med",
7619 "missing-as-worst");
7621 json_object_string_add(bestpath
, "med", "true");
7624 json_object_object_add(json
, "bestPath", bestpath
);
7627 /* Show BGP peer's summary information. */
7628 static int bgp_show_summary(struct vty
*vty
, struct bgp
*bgp
, int afi
, int safi
,
7629 uint8_t use_json
, json_object
*json
)
7632 struct listnode
*node
, *nnode
;
7633 unsigned int count
= 0, dn_count
= 0;
7634 char timebuf
[BGP_UPTIME_LEN
], dn_flag
[2];
7635 char neighbor_buf
[VTY_BUFSIZ
];
7636 int neighbor_col_default_width
= 16;
7638 int max_neighbor_width
= 0;
7640 json_object
*json_peer
= NULL
;
7641 json_object
*json_peers
= NULL
;
7643 /* labeled-unicast routes are installed in the unicast table so in order
7645 * display the correct PfxRcd value we must look at SAFI_UNICAST
7647 if (safi
== SAFI_LABELED_UNICAST
)
7648 pfx_rcd_safi
= SAFI_UNICAST
;
7650 pfx_rcd_safi
= safi
;
7654 json
= json_object_new_object();
7656 json_peers
= json_object_new_object();
7658 /* Loop over all neighbors that will be displayed to determine
7660 * characters are needed for the Neighbor column
7662 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
7663 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
7666 if (peer
->afc
[afi
][safi
]) {
7667 memset(dn_flag
, '\0', sizeof(dn_flag
));
7668 if (peer_dynamic_neighbor(peer
))
7672 && bgp_flag_check(bgp
,
7673 BGP_FLAG_SHOW_HOSTNAME
))
7674 sprintf(neighbor_buf
, "%s%s(%s) ",
7675 dn_flag
, peer
->hostname
,
7678 sprintf(neighbor_buf
, "%s%s ", dn_flag
,
7681 len
= strlen(neighbor_buf
);
7683 if (len
> max_neighbor_width
)
7684 max_neighbor_width
= len
;
7688 /* Originally we displayed the Neighbor column as 16
7689 * characters wide so make that the default
7691 if (max_neighbor_width
< neighbor_col_default_width
)
7692 max_neighbor_width
= neighbor_col_default_width
;
7695 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
7696 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
7699 if (!peer
->afc
[afi
][safi
])
7704 char memstrbuf
[MTYPE_MEMSTR_LEN
];
7707 vrf_id_ui
= (bgp
->vrf_id
== VRF_UNKNOWN
)
7709 : (int64_t)bgp
->vrf_id
;
7711 /* Usage summary and header */
7713 json_object_string_add(
7715 inet_ntoa(bgp
->router_id
));
7716 json_object_int_add(json
, "as", bgp
->as
);
7717 json_object_int_add(json
, "vrfId", vrf_id_ui
);
7718 json_object_string_add(
7721 == BGP_INSTANCE_TYPE_DEFAULT
)
7726 "BGP router identifier %s, local AS number %u vrf-id %d",
7727 inet_ntoa(bgp
->router_id
), bgp
->as
,
7728 bgp
->vrf_id
== VRF_UNKNOWN
7730 : (int)bgp
->vrf_id
);
7734 if (bgp_update_delay_configured(bgp
)) {
7736 json_object_int_add(
7737 json
, "updateDelayLimit",
7738 bgp
->v_update_delay
);
7740 if (bgp
->v_update_delay
7741 != bgp
->v_establish_wait
)
7742 json_object_int_add(
7744 "updateDelayEstablishWait",
7745 bgp
->v_establish_wait
);
7747 if (bgp_update_delay_active(bgp
)) {
7748 json_object_string_add(
7750 "updateDelayFirstNeighbor",
7751 bgp
->update_delay_begin_time
);
7752 json_object_boolean_true_add(
7754 "updateDelayInProgress");
7756 if (bgp
->update_delay_over
) {
7757 json_object_string_add(
7759 "updateDelayFirstNeighbor",
7760 bgp
->update_delay_begin_time
);
7761 json_object_string_add(
7763 "updateDelayBestpathResumed",
7764 bgp
->update_delay_end_time
);
7765 json_object_string_add(
7767 "updateDelayZebraUpdateResume",
7768 bgp
->update_delay_zebra_resume_time
);
7769 json_object_string_add(
7771 "updateDelayPeerUpdateResume",
7772 bgp
->update_delay_peers_resume_time
);
7777 "Read-only mode update-delay limit: %d seconds\n",
7778 bgp
->v_update_delay
);
7779 if (bgp
->v_update_delay
7780 != bgp
->v_establish_wait
)
7782 " Establish wait: %d seconds\n",
7783 bgp
->v_establish_wait
);
7785 if (bgp_update_delay_active(bgp
)) {
7787 " First neighbor established: %s\n",
7788 bgp
->update_delay_begin_time
);
7790 " Delay in progress\n");
7792 if (bgp
->update_delay_over
) {
7794 " First neighbor established: %s\n",
7795 bgp
->update_delay_begin_time
);
7797 " Best-paths resumed: %s\n",
7798 bgp
->update_delay_end_time
);
7800 " zebra update resumed: %s\n",
7801 bgp
->update_delay_zebra_resume_time
);
7803 " peers update resumed: %s\n",
7804 bgp
->update_delay_peers_resume_time
);
7811 if (bgp_maxmed_onstartup_configured(bgp
)
7812 && bgp
->maxmed_active
)
7813 json_object_boolean_true_add(
7814 json
, "maxMedOnStartup");
7815 if (bgp
->v_maxmed_admin
)
7816 json_object_boolean_true_add(
7817 json
, "maxMedAdministrative");
7819 json_object_int_add(
7820 json
, "tableVersion",
7821 bgp_table_version(bgp
->rib
[afi
][safi
]));
7823 ents
= bgp_table_count(bgp
->rib
[afi
][safi
]);
7824 json_object_int_add(json
, "ribCount", ents
);
7825 json_object_int_add(
7827 ents
* sizeof(struct bgp_node
));
7829 ents
= listcount(bgp
->peer
);
7830 json_object_int_add(json
, "peerCount", ents
);
7831 json_object_int_add(json
, "peerMemory",
7832 ents
* sizeof(struct peer
));
7834 if ((ents
= listcount(bgp
->group
))) {
7835 json_object_int_add(
7836 json
, "peerGroupCount", ents
);
7837 json_object_int_add(
7838 json
, "peerGroupMemory",
7839 ents
* sizeof(struct
7843 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
7844 BGP_CONFIG_DAMPENING
))
7845 json_object_boolean_true_add(
7846 json
, "dampeningEnabled");
7848 if (bgp_maxmed_onstartup_configured(bgp
)
7849 && bgp
->maxmed_active
)
7851 "Max-med on-startup active\n");
7852 if (bgp
->v_maxmed_admin
)
7854 "Max-med administrative active\n");
7856 vty_out(vty
, "BGP table version %" PRIu64
"\n",
7857 bgp_table_version(bgp
->rib
[afi
][safi
]));
7859 ents
= bgp_table_count(bgp
->rib
[afi
][safi
]);
7861 "RIB entries %ld, using %s of memory\n",
7863 mtype_memstr(memstrbuf
,
7865 ents
* sizeof(struct
7868 /* Peer related usage */
7869 ents
= listcount(bgp
->peer
);
7870 vty_out(vty
, "Peers %ld, using %s of memory\n",
7873 memstrbuf
, sizeof(memstrbuf
),
7874 ents
* sizeof(struct peer
)));
7876 if ((ents
= listcount(bgp
->group
)))
7878 "Peer groups %ld, using %s of memory\n",
7883 ents
* sizeof(struct
7886 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
7887 BGP_CONFIG_DAMPENING
))
7888 vty_out(vty
, "Dampening enabled.\n");
7891 /* Subtract 8 here because 'Neighbor' is
7893 vty_out(vty
, "Neighbor");
7894 vty_out(vty
, "%*s", max_neighbor_width
- 8,
7897 "V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd\n");
7904 json_peer
= json_object_new_object();
7906 if (peer_dynamic_neighbor(peer
))
7907 json_object_boolean_true_add(json_peer
,
7911 json_object_string_add(json_peer
, "hostname",
7914 if (peer
->domainname
)
7915 json_object_string_add(json_peer
, "domainname",
7918 json_object_int_add(json_peer
, "remoteAs", peer
->as
);
7919 json_object_int_add(json_peer
, "version", 4);
7920 json_object_int_add(json_peer
, "msgRcvd",
7921 PEER_TOTAL_RX(peer
));
7922 json_object_int_add(json_peer
, "msgSent",
7923 PEER_TOTAL_TX(peer
));
7925 json_object_int_add(json_peer
, "tableVersion",
7926 peer
->version
[afi
][safi
]);
7927 json_object_int_add(json_peer
, "outq",
7929 json_object_int_add(json_peer
, "inq", 0);
7930 peer_uptime(peer
->uptime
, timebuf
, BGP_UPTIME_LEN
,
7931 use_json
, json_peer
);
7932 json_object_int_add(json_peer
, "prefixReceivedCount",
7933 peer
->pcount
[afi
][pfx_rcd_safi
]);
7935 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_SHUTDOWN
))
7936 json_object_string_add(json_peer
, "state",
7938 else if (CHECK_FLAG(peer
->sflags
,
7939 PEER_STATUS_PREFIX_OVERFLOW
))
7940 json_object_string_add(json_peer
, "state",
7943 json_object_string_add(
7945 lookup_msg(bgp_status_msg
, peer
->status
,
7949 json_object_string_add(json_peer
, "idType",
7951 else if (peer
->su
.sa
.sa_family
== AF_INET
)
7952 json_object_string_add(json_peer
, "idType",
7954 else if (peer
->su
.sa
.sa_family
== AF_INET6
)
7955 json_object_string_add(json_peer
, "idType",
7958 json_object_object_add(json_peers
, peer
->host
,
7961 memset(dn_flag
, '\0', sizeof(dn_flag
));
7962 if (peer_dynamic_neighbor(peer
)) {
7968 && bgp_flag_check(bgp
, BGP_FLAG_SHOW_HOSTNAME
))
7969 len
= vty_out(vty
, "%s%s(%s)", dn_flag
,
7970 peer
->hostname
, peer
->host
);
7972 len
= vty_out(vty
, "%s%s", dn_flag
, peer
->host
);
7974 /* pad the neighbor column with spaces */
7975 if (len
< max_neighbor_width
)
7976 vty_out(vty
, "%*s", max_neighbor_width
- len
,
7979 vty_out(vty
, "4 %10u %7u %7u %8" PRIu64
" %4d %4zd %8s",
7980 peer
->as
, PEER_TOTAL_RX(peer
),
7981 PEER_TOTAL_TX(peer
), peer
->version
[afi
][safi
],
7982 0, peer
->obuf
->count
,
7983 peer_uptime(peer
->uptime
, timebuf
,
7984 BGP_UPTIME_LEN
, 0, NULL
));
7986 if (peer
->status
== Established
)
7987 if (peer
->afc_recv
[afi
][safi
])
7988 vty_out(vty
, " %12ld",
7992 vty_out(vty
, " NoNeg");
7994 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_SHUTDOWN
))
7995 vty_out(vty
, " Idle (Admin)");
7996 else if (CHECK_FLAG(
7998 PEER_STATUS_PREFIX_OVERFLOW
))
7999 vty_out(vty
, " Idle (PfxCt)");
8001 vty_out(vty
, " %12s",
8002 lookup_msg(bgp_status_msg
,
8003 peer
->status
, NULL
));
8010 json_object_object_add(json
, "peers", json_peers
);
8012 json_object_int_add(json
, "totalPeers", count
);
8013 json_object_int_add(json
, "dynamicPeers", dn_count
);
8015 bgp_show_bestpath_json(bgp
, json
);
8017 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
8018 json
, JSON_C_TO_STRING_PRETTY
));
8019 json_object_free(json
);
8022 vty_out(vty
, "\nTotal number of neighbors %d\n", count
);
8024 vty_out(vty
, "No %s neighbor is configured\n",
8025 afi_safi_print(afi
, safi
));
8029 vty_out(vty
, "* - dynamic neighbor\n");
8030 vty_out(vty
, "%d dynamic neighbor(s), limit %d\n",
8031 dn_count
, bgp
->dynamic_neighbors_limit
);
8038 static void bgp_show_summary_afi_safi(struct vty
*vty
, struct bgp
*bgp
, int afi
,
8039 int safi
, uint8_t use_json
,
8043 int afi_wildcard
= (afi
== AFI_MAX
);
8044 int safi_wildcard
= (safi
== SAFI_MAX
);
8045 int is_wildcard
= (afi_wildcard
|| safi_wildcard
);
8046 bool json_output
= false;
8048 if (use_json
&& is_wildcard
)
8049 vty_out(vty
, "{\n");
8051 afi
= 1; /* AFI_IP */
8052 while (afi
< AFI_MAX
) {
8054 safi
= 1; /* SAFI_UNICAST */
8055 while (safi
< SAFI_MAX
) {
8056 if (bgp_afi_safi_peer_exists(bgp
, afi
, safi
)) {
8060 * So limit output to those afi/safi
8062 * actualy have something interesting in
8066 json
= json_object_new_object();
8069 vty_out(vty
, ",\n");
8073 vty_out(vty
, "\"%s\":",
8077 vty_out(vty
, "\n%s Summary:\n",
8082 bgp_show_summary(vty
, bgp
, afi
, safi
, use_json
,
8094 if (use_json
&& is_wildcard
)
8095 vty_out(vty
, "}\n");
8096 else if (use_json
&& !json_output
)
8097 vty_out(vty
, "{}\n");
8100 static void bgp_show_all_instances_summary_vty(struct vty
*vty
, afi_t afi
,
8101 safi_t safi
, uint8_t use_json
)
8103 struct listnode
*node
, *nnode
;
8105 json_object
*json
= NULL
;
8109 vty_out(vty
, "{\n");
8111 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
8113 json
= json_object_new_object();
8116 vty_out(vty
, ",\n");
8120 vty_out(vty
, "\"%s\":",
8121 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
8125 vty_out(vty
, "\nInstance %s:\n",
8126 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
8130 bgp_show_summary_afi_safi(vty
, bgp
, afi
, safi
, use_json
, json
);
8134 vty_out(vty
, "}\n");
8137 int bgp_show_summary_vty(struct vty
*vty
, const char *name
, afi_t afi
,
8138 safi_t safi
, uint8_t use_json
)
8143 if (strmatch(name
, "all")) {
8144 bgp_show_all_instances_summary_vty(vty
, afi
, safi
,
8148 bgp
= bgp_lookup_by_name(name
);
8152 vty_out(vty
, "{}\n");
8155 "%% No such BGP instance exist\n");
8159 bgp_show_summary_afi_safi(vty
, bgp
, afi
, safi
, use_json
,
8165 bgp
= bgp_get_default();
8168 bgp_show_summary_afi_safi(vty
, bgp
, afi
, safi
, use_json
, NULL
);
8173 /* `show [ip] bgp summary' commands. */
8174 DEFUN (show_ip_bgp_summary
,
8175 show_ip_bgp_summary_cmd
,
8176 "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR
" ["BGP_SAFI_WITH_LABEL_CMD_STR
"]] summary [json]",
8180 BGP_INSTANCE_HELP_STR
8182 BGP_SAFI_WITH_LABEL_HELP_STR
8183 "Summary of BGP neighbor status\n"
8187 afi_t afi
= AFI_MAX
;
8188 safi_t safi
= SAFI_MAX
;
8193 if (argv_find(argv
, argc
, "ip", &idx
))
8195 /* [<view|vrf> VIEWVRFNAME] */
8196 if (argv_find(argv
, argc
, "view", &idx
)
8197 || argv_find(argv
, argc
, "vrf", &idx
))
8198 vrf
= argv
[++idx
]->arg
;
8199 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
8200 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
)) {
8201 argv_find_and_parse_safi(argv
, argc
, &idx
, &safi
);
8204 int uj
= use_json(argc
, argv
);
8206 return bgp_show_summary_vty(vty
, vrf
, afi
, safi
, uj
);
8209 const char *afi_safi_print(afi_t afi
, safi_t safi
)
8211 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
8212 return "IPv4 Unicast";
8213 else if (afi
== AFI_IP
&& safi
== SAFI_MULTICAST
)
8214 return "IPv4 Multicast";
8215 else if (afi
== AFI_IP
&& safi
== SAFI_LABELED_UNICAST
)
8216 return "IPv4 Labeled Unicast";
8217 else if (afi
== AFI_IP
&& safi
== SAFI_MPLS_VPN
)
8219 else if (afi
== AFI_IP
&& safi
== SAFI_ENCAP
)
8220 return "IPv4 Encap";
8221 else if (afi
== AFI_IP
&& safi
== SAFI_FLOWSPEC
)
8222 return "IPv4 Flowspec";
8223 else if (afi
== AFI_IP6
&& safi
== SAFI_UNICAST
)
8224 return "IPv6 Unicast";
8225 else if (afi
== AFI_IP6
&& safi
== SAFI_MULTICAST
)
8226 return "IPv6 Multicast";
8227 else if (afi
== AFI_IP6
&& safi
== SAFI_LABELED_UNICAST
)
8228 return "IPv6 Labeled Unicast";
8229 else if (afi
== AFI_IP6
&& safi
== SAFI_MPLS_VPN
)
8231 else if (afi
== AFI_IP6
&& safi
== SAFI_ENCAP
)
8232 return "IPv6 Encap";
8233 else if (afi
== AFI_IP6
&& safi
== SAFI_FLOWSPEC
)
8234 return "IPv6 Flowspec";
8235 else if (afi
== AFI_L2VPN
&& safi
== SAFI_EVPN
)
8236 return "L2VPN EVPN";
8242 * Please note that we have intentionally camelCased
8243 * the return strings here. So if you want
8244 * to use this function, please ensure you
8245 * are doing this within json output
8247 const char *afi_safi_json(afi_t afi
, safi_t safi
)
8249 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
8250 return "ipv4Unicast";
8251 else if (afi
== AFI_IP
&& safi
== SAFI_MULTICAST
)
8252 return "ipv4Multicast";
8253 else if (afi
== AFI_IP
&& safi
== SAFI_LABELED_UNICAST
)
8254 return "ipv4LabeledUnicast";
8255 else if (afi
== AFI_IP
&& safi
== SAFI_MPLS_VPN
)
8257 else if (afi
== AFI_IP
&& safi
== SAFI_ENCAP
)
8259 else if (afi
== AFI_IP
&& safi
== SAFI_FLOWSPEC
)
8260 return "ipv4Flowspec";
8261 else if (afi
== AFI_IP6
&& safi
== SAFI_UNICAST
)
8262 return "ipv6Unicast";
8263 else if (afi
== AFI_IP6
&& safi
== SAFI_MULTICAST
)
8264 return "ipv6Multicast";
8265 else if (afi
== AFI_IP6
&& safi
== SAFI_LABELED_UNICAST
)
8266 return "ipv6LabeledUnicast";
8267 else if (afi
== AFI_IP6
&& safi
== SAFI_MPLS_VPN
)
8269 else if (afi
== AFI_IP6
&& safi
== SAFI_ENCAP
)
8271 else if (afi
== AFI_IP6
&& safi
== SAFI_FLOWSPEC
)
8272 return "ipv6Flowspec";
8273 else if (afi
== AFI_L2VPN
&& safi
== SAFI_EVPN
)
8279 /* Show BGP peer's information. */
8280 enum show_type
{ show_all
, show_peer
};
8282 static void bgp_show_peer_afi_orf_cap(struct vty
*vty
, struct peer
*p
,
8283 afi_t afi
, safi_t safi
,
8284 uint16_t adv_smcap
, uint16_t adv_rmcap
,
8285 uint16_t rcv_smcap
, uint16_t rcv_rmcap
,
8286 uint8_t use_json
, json_object
*json_pref
)
8289 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_smcap
)
8290 || CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_smcap
)) {
8292 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_smcap
)
8293 && CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_smcap
))
8294 json_object_string_add(json_pref
, "sendMode",
8295 "advertisedAndReceived");
8296 else if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_smcap
))
8297 json_object_string_add(json_pref
, "sendMode",
8299 else if (CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_smcap
))
8300 json_object_string_add(json_pref
, "sendMode",
8303 vty_out(vty
, " Send-mode: ");
8304 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_smcap
))
8305 vty_out(vty
, "advertised");
8306 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_smcap
))
8307 vty_out(vty
, "%sreceived",
8308 CHECK_FLAG(p
->af_cap
[afi
][safi
],
8317 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_rmcap
)
8318 || CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_rmcap
)) {
8320 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_rmcap
)
8321 && CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_rmcap
))
8322 json_object_string_add(json_pref
, "recvMode",
8323 "advertisedAndReceived");
8324 else if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_rmcap
))
8325 json_object_string_add(json_pref
, "recvMode",
8327 else if (CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_rmcap
))
8328 json_object_string_add(json_pref
, "recvMode",
8331 vty_out(vty
, " Receive-mode: ");
8332 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_rmcap
))
8333 vty_out(vty
, "advertised");
8334 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_rmcap
))
8335 vty_out(vty
, "%sreceived",
8336 CHECK_FLAG(p
->af_cap
[afi
][safi
],
8345 static void bgp_show_peer_afi(struct vty
*vty
, struct peer
*p
, afi_t afi
,
8346 safi_t safi
, uint8_t use_json
,
8347 json_object
*json_neigh
)
8349 struct bgp_filter
*filter
;
8350 struct peer_af
*paf
;
8351 char orf_pfx_name
[BUFSIZ
];
8353 json_object
*json_af
= NULL
;
8354 json_object
*json_prefA
= NULL
;
8355 json_object
*json_prefB
= NULL
;
8356 json_object
*json_addr
= NULL
;
8359 json_addr
= json_object_new_object();
8360 json_af
= json_object_new_object();
8361 filter
= &p
->filter
[afi
][safi
];
8363 if (peer_group_active(p
))
8364 json_object_string_add(json_addr
, "peerGroupMember",
8367 paf
= peer_af_find(p
, afi
, safi
);
8368 if (paf
&& PAF_SUBGRP(paf
)) {
8369 json_object_int_add(json_addr
, "updateGroupId",
8370 PAF_UPDGRP(paf
)->id
);
8371 json_object_int_add(json_addr
, "subGroupId",
8372 PAF_SUBGRP(paf
)->id
);
8373 json_object_int_add(json_addr
, "packetQueueLength",
8374 bpacket_queue_virtual_length(paf
));
8377 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
8378 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8379 PEER_CAP_ORF_PREFIX_SM_RCV
)
8380 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8381 PEER_CAP_ORF_PREFIX_RM_ADV
)
8382 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8383 PEER_CAP_ORF_PREFIX_RM_RCV
)) {
8384 json_object_int_add(json_af
, "orfType",
8386 json_prefA
= json_object_new_object();
8387 bgp_show_peer_afi_orf_cap(vty
, p
, afi
, safi
,
8388 PEER_CAP_ORF_PREFIX_SM_ADV
,
8389 PEER_CAP_ORF_PREFIX_RM_ADV
,
8390 PEER_CAP_ORF_PREFIX_SM_RCV
,
8391 PEER_CAP_ORF_PREFIX_RM_RCV
,
8392 use_json
, json_prefA
);
8393 json_object_object_add(json_af
, "orfPrefixList",
8397 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
8398 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8399 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
8400 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8401 PEER_CAP_ORF_PREFIX_RM_ADV
)
8402 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8403 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
)) {
8404 json_object_int_add(json_af
, "orfOldType",
8405 ORF_TYPE_PREFIX_OLD
);
8406 json_prefB
= json_object_new_object();
8407 bgp_show_peer_afi_orf_cap(
8408 vty
, p
, afi
, safi
, PEER_CAP_ORF_PREFIX_SM_ADV
,
8409 PEER_CAP_ORF_PREFIX_RM_ADV
,
8410 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
,
8411 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
, use_json
,
8413 json_object_object_add(json_af
, "orfOldPrefixList",
8417 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
8418 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8419 PEER_CAP_ORF_PREFIX_SM_RCV
)
8420 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8421 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
8422 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8423 PEER_CAP_ORF_PREFIX_RM_ADV
)
8424 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8425 PEER_CAP_ORF_PREFIX_RM_RCV
)
8426 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8427 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
))
8428 json_object_object_add(json_addr
, "afDependentCap",
8431 json_object_free(json_af
);
8433 sprintf(orf_pfx_name
, "%s.%d.%d", p
->host
, afi
, safi
);
8434 orf_pfx_count
= prefix_bgp_show_prefix_list(
8435 NULL
, afi
, orf_pfx_name
, use_json
);
8437 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
8438 PEER_STATUS_ORF_PREFIX_SEND
)
8440 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
8441 PEER_STATUS_ORF_PREFIX_SEND
))
8442 json_object_boolean_true_add(json_neigh
,
8445 json_object_int_add(json_addr
, "orfRecvCounter",
8448 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
8449 PEER_STATUS_ORF_WAIT_REFRESH
))
8450 json_object_string_add(
8451 json_addr
, "orfFirstUpdate",
8452 "deferredUntilORFOrRouteRefreshRecvd");
8454 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8455 PEER_FLAG_REFLECTOR_CLIENT
))
8456 json_object_boolean_true_add(json_addr
,
8457 "routeReflectorClient");
8458 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8459 PEER_FLAG_RSERVER_CLIENT
))
8460 json_object_boolean_true_add(json_addr
,
8461 "routeServerClient");
8462 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
8463 json_object_boolean_true_add(json_addr
,
8464 "inboundSoftConfigPermit");
8466 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8467 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
))
8468 json_object_boolean_true_add(
8470 "privateAsNumsAllReplacedInUpdatesToNbr");
8471 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8472 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
))
8473 json_object_boolean_true_add(
8475 "privateAsNumsReplacedInUpdatesToNbr");
8476 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8477 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
))
8478 json_object_boolean_true_add(
8480 "privateAsNumsAllRemovedInUpdatesToNbr");
8481 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8482 PEER_FLAG_REMOVE_PRIVATE_AS
))
8483 json_object_boolean_true_add(
8485 "privateAsNumsRemovedInUpdatesToNbr");
8487 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8488 PEER_FLAG_ADDPATH_TX_ALL_PATHS
))
8489 json_object_boolean_true_add(json_addr
,
8490 "addpathTxAllPaths");
8492 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8493 PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS
))
8494 json_object_boolean_true_add(json_addr
,
8495 "addpathTxBestpathPerAS");
8497 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_AS_OVERRIDE
))
8498 json_object_string_add(json_addr
,
8499 "overrideASNsInOutboundUpdates",
8500 "ifAspathEqualRemoteAs");
8502 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_SELF
)
8503 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
8504 PEER_FLAG_FORCE_NEXTHOP_SELF
))
8505 json_object_boolean_true_add(json_addr
,
8506 "routerAlwaysNextHop");
8507 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8508 PEER_FLAG_AS_PATH_UNCHANGED
))
8509 json_object_boolean_true_add(
8510 json_addr
, "unchangedAsPathPropogatedToNbr");
8511 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8512 PEER_FLAG_NEXTHOP_UNCHANGED
))
8513 json_object_boolean_true_add(
8514 json_addr
, "unchangedNextHopPropogatedToNbr");
8515 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
8516 json_object_boolean_true_add(
8517 json_addr
, "unchangedMedPropogatedToNbr");
8518 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
)
8519 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
8520 PEER_FLAG_SEND_EXT_COMMUNITY
)) {
8521 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8522 PEER_FLAG_SEND_COMMUNITY
)
8523 && CHECK_FLAG(p
->af_flags
[afi
][safi
],
8524 PEER_FLAG_SEND_EXT_COMMUNITY
))
8525 json_object_string_add(json_addr
,
8526 "commAttriSentToNbr",
8527 "extendedAndStandard");
8528 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8529 PEER_FLAG_SEND_EXT_COMMUNITY
))
8530 json_object_string_add(json_addr
,
8531 "commAttriSentToNbr",
8534 json_object_string_add(json_addr
,
8535 "commAttriSentToNbr",
8538 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8539 PEER_FLAG_DEFAULT_ORIGINATE
)) {
8540 if (p
->default_rmap
[afi
][safi
].name
)
8541 json_object_string_add(
8542 json_addr
, "defaultRouteMap",
8543 p
->default_rmap
[afi
][safi
].name
);
8545 if (paf
&& PAF_SUBGRP(paf
)
8546 && CHECK_FLAG(PAF_SUBGRP(paf
)->sflags
,
8547 SUBGRP_STATUS_DEFAULT_ORIGINATE
))
8548 json_object_boolean_true_add(json_addr
,
8551 json_object_boolean_true_add(json_addr
,
8555 if (afi
== AFI_L2VPN
&& safi
== SAFI_EVPN
) {
8556 if (is_evpn_enabled())
8557 json_object_boolean_true_add(
8558 json_addr
, "advertiseAllVnis");
8561 if (filter
->plist
[FILTER_IN
].name
8562 || filter
->dlist
[FILTER_IN
].name
8563 || filter
->aslist
[FILTER_IN
].name
8564 || filter
->map
[RMAP_IN
].name
)
8565 json_object_boolean_true_add(json_addr
,
8566 "inboundPathPolicyConfig");
8567 if (filter
->plist
[FILTER_OUT
].name
8568 || filter
->dlist
[FILTER_OUT
].name
8569 || filter
->aslist
[FILTER_OUT
].name
8570 || filter
->map
[RMAP_OUT
].name
|| filter
->usmap
.name
)
8571 json_object_boolean_true_add(
8572 json_addr
, "outboundPathPolicyConfig");
8575 if (filter
->plist
[FILTER_IN
].name
)
8576 json_object_string_add(json_addr
,
8577 "incomingUpdatePrefixFilterList",
8578 filter
->plist
[FILTER_IN
].name
);
8579 if (filter
->plist
[FILTER_OUT
].name
)
8580 json_object_string_add(json_addr
,
8581 "outgoingUpdatePrefixFilterList",
8582 filter
->plist
[FILTER_OUT
].name
);
8584 /* distribute-list */
8585 if (filter
->dlist
[FILTER_IN
].name
)
8586 json_object_string_add(
8587 json_addr
, "incomingUpdateNetworkFilterList",
8588 filter
->dlist
[FILTER_IN
].name
);
8589 if (filter
->dlist
[FILTER_OUT
].name
)
8590 json_object_string_add(
8591 json_addr
, "outgoingUpdateNetworkFilterList",
8592 filter
->dlist
[FILTER_OUT
].name
);
8595 if (filter
->aslist
[FILTER_IN
].name
)
8596 json_object_string_add(json_addr
,
8597 "incomingUpdateAsPathFilterList",
8598 filter
->aslist
[FILTER_IN
].name
);
8599 if (filter
->aslist
[FILTER_OUT
].name
)
8600 json_object_string_add(json_addr
,
8601 "outgoingUpdateAsPathFilterList",
8602 filter
->aslist
[FILTER_OUT
].name
);
8605 if (filter
->map
[RMAP_IN
].name
)
8606 json_object_string_add(
8607 json_addr
, "routeMapForIncomingAdvertisements",
8608 filter
->map
[RMAP_IN
].name
);
8609 if (filter
->map
[RMAP_OUT
].name
)
8610 json_object_string_add(
8611 json_addr
, "routeMapForOutgoingAdvertisements",
8612 filter
->map
[RMAP_OUT
].name
);
8614 /* unsuppress-map */
8615 if (filter
->usmap
.name
)
8616 json_object_string_add(json_addr
,
8617 "selectiveUnsuppressRouteMap",
8618 filter
->usmap
.name
);
8620 /* Receive prefix count */
8621 json_object_int_add(json_addr
, "acceptedPrefixCounter",
8622 p
->pcount
[afi
][safi
]);
8624 /* Maximum prefix */
8625 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
)) {
8626 json_object_int_add(json_addr
, "prefixAllowedMax",
8627 p
->pmax
[afi
][safi
]);
8628 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8629 PEER_FLAG_MAX_PREFIX_WARNING
))
8630 json_object_boolean_true_add(
8631 json_addr
, "prefixAllowedMaxWarning");
8632 json_object_int_add(json_addr
,
8633 "prefixAllowedWarningThresh",
8634 p
->pmax_threshold
[afi
][safi
]);
8635 if (p
->pmax_restart
[afi
][safi
])
8636 json_object_int_add(
8638 "prefixAllowedRestartIntervalMsecs",
8639 p
->pmax_restart
[afi
][safi
] * 60000);
8641 json_object_object_add(json_neigh
, afi_safi_print(afi
, safi
),
8645 filter
= &p
->filter
[afi
][safi
];
8647 vty_out(vty
, " For address family: %s\n",
8648 afi_safi_print(afi
, safi
));
8650 if (peer_group_active(p
))
8651 vty_out(vty
, " %s peer-group member\n",
8654 paf
= peer_af_find(p
, afi
, safi
);
8655 if (paf
&& PAF_SUBGRP(paf
)) {
8656 vty_out(vty
, " Update group %" PRIu64
8657 ", subgroup %" PRIu64
"\n",
8658 PAF_UPDGRP(paf
)->id
, PAF_SUBGRP(paf
)->id
);
8659 vty_out(vty
, " Packet Queue length %d\n",
8660 bpacket_queue_virtual_length(paf
));
8662 vty_out(vty
, " Not part of any update group\n");
8664 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
8665 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8666 PEER_CAP_ORF_PREFIX_SM_RCV
)
8667 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8668 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
8669 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8670 PEER_CAP_ORF_PREFIX_RM_ADV
)
8671 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8672 PEER_CAP_ORF_PREFIX_RM_RCV
)
8673 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8674 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
))
8675 vty_out(vty
, " AF-dependant capabilities:\n");
8677 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
8678 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8679 PEER_CAP_ORF_PREFIX_SM_RCV
)
8680 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8681 PEER_CAP_ORF_PREFIX_RM_ADV
)
8682 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8683 PEER_CAP_ORF_PREFIX_RM_RCV
)) {
8685 " Outbound Route Filter (ORF) type (%d) Prefix-list:\n",
8687 bgp_show_peer_afi_orf_cap(
8688 vty
, p
, afi
, safi
, PEER_CAP_ORF_PREFIX_SM_ADV
,
8689 PEER_CAP_ORF_PREFIX_RM_ADV
,
8690 PEER_CAP_ORF_PREFIX_SM_RCV
,
8691 PEER_CAP_ORF_PREFIX_RM_RCV
, use_json
, NULL
);
8693 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
8694 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8695 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
8696 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8697 PEER_CAP_ORF_PREFIX_RM_ADV
)
8698 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8699 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
)) {
8701 " Outbound Route Filter (ORF) type (%d) Prefix-list:\n",
8702 ORF_TYPE_PREFIX_OLD
);
8703 bgp_show_peer_afi_orf_cap(
8704 vty
, p
, afi
, safi
, PEER_CAP_ORF_PREFIX_SM_ADV
,
8705 PEER_CAP_ORF_PREFIX_RM_ADV
,
8706 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
,
8707 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
, use_json
, NULL
);
8710 sprintf(orf_pfx_name
, "%s.%d.%d", p
->host
, afi
, safi
);
8711 orf_pfx_count
= prefix_bgp_show_prefix_list(
8712 NULL
, afi
, orf_pfx_name
, use_json
);
8714 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
8715 PEER_STATUS_ORF_PREFIX_SEND
)
8717 vty_out(vty
, " Outbound Route Filter (ORF):");
8718 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
8719 PEER_STATUS_ORF_PREFIX_SEND
))
8720 vty_out(vty
, " sent;");
8722 vty_out(vty
, " received (%d entries)",
8726 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
8727 PEER_STATUS_ORF_WAIT_REFRESH
))
8729 " First update is deferred until ORF or ROUTE-REFRESH is received\n");
8731 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8732 PEER_FLAG_REFLECTOR_CLIENT
))
8733 vty_out(vty
, " Route-Reflector Client\n");
8734 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8735 PEER_FLAG_RSERVER_CLIENT
))
8736 vty_out(vty
, " Route-Server Client\n");
8737 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
8739 " Inbound soft reconfiguration allowed\n");
8741 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8742 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
))
8744 " Private AS numbers (all) replaced in updates to this neighbor\n");
8745 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8746 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
))
8748 " Private AS numbers replaced in updates to this neighbor\n");
8749 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8750 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
))
8752 " Private AS numbers (all) removed in updates to this neighbor\n");
8753 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8754 PEER_FLAG_REMOVE_PRIVATE_AS
))
8756 " Private AS numbers removed in updates to this neighbor\n");
8758 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8759 PEER_FLAG_ADDPATH_TX_ALL_PATHS
))
8760 vty_out(vty
, " Advertise all paths via addpath\n");
8762 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8763 PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS
))
8765 " Advertise bestpath per AS via addpath\n");
8767 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_AS_OVERRIDE
))
8769 " Override ASNs in outbound updates if aspath equals remote-as\n");
8771 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_SELF
)
8772 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
8773 PEER_FLAG_FORCE_NEXTHOP_SELF
))
8774 vty_out(vty
, " NEXT_HOP is always this router\n");
8775 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8776 PEER_FLAG_AS_PATH_UNCHANGED
))
8778 " AS_PATH is propagated unchanged to this neighbor\n");
8779 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8780 PEER_FLAG_NEXTHOP_UNCHANGED
))
8782 " NEXT_HOP is propagated unchanged to this neighbor\n");
8783 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
8785 " MED is propagated unchanged to this neighbor\n");
8786 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
)
8787 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
8788 PEER_FLAG_SEND_EXT_COMMUNITY
)
8789 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
8790 PEER_FLAG_SEND_LARGE_COMMUNITY
)) {
8792 " Community attribute sent to this neighbor");
8793 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8794 PEER_FLAG_SEND_COMMUNITY
)
8795 && CHECK_FLAG(p
->af_flags
[afi
][safi
],
8796 PEER_FLAG_SEND_EXT_COMMUNITY
)
8797 && CHECK_FLAG(p
->af_flags
[afi
][safi
],
8798 PEER_FLAG_SEND_LARGE_COMMUNITY
))
8799 vty_out(vty
, "(all)\n");
8800 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8801 PEER_FLAG_SEND_LARGE_COMMUNITY
))
8802 vty_out(vty
, "(large)\n");
8803 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8804 PEER_FLAG_SEND_EXT_COMMUNITY
))
8805 vty_out(vty
, "(extended)\n");
8807 vty_out(vty
, "(standard)\n");
8809 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8810 PEER_FLAG_DEFAULT_ORIGINATE
)) {
8811 vty_out(vty
, " Default information originate,");
8813 if (p
->default_rmap
[afi
][safi
].name
)
8814 vty_out(vty
, " default route-map %s%s,",
8815 p
->default_rmap
[afi
][safi
].map
? "*"
8817 p
->default_rmap
[afi
][safi
].name
);
8818 if (paf
&& PAF_SUBGRP(paf
)
8819 && CHECK_FLAG(PAF_SUBGRP(paf
)->sflags
,
8820 SUBGRP_STATUS_DEFAULT_ORIGINATE
))
8821 vty_out(vty
, " default sent\n");
8823 vty_out(vty
, " default not sent\n");
8826 /* advertise-vni-all */
8827 if (afi
== AFI_L2VPN
&& safi
== SAFI_EVPN
) {
8828 if (is_evpn_enabled())
8829 vty_out(vty
, " advertise-all-vni\n");
8832 if (filter
->plist
[FILTER_IN
].name
8833 || filter
->dlist
[FILTER_IN
].name
8834 || filter
->aslist
[FILTER_IN
].name
8835 || filter
->map
[RMAP_IN
].name
)
8836 vty_out(vty
, " Inbound path policy configured\n");
8837 if (filter
->plist
[FILTER_OUT
].name
8838 || filter
->dlist
[FILTER_OUT
].name
8839 || filter
->aslist
[FILTER_OUT
].name
8840 || filter
->map
[RMAP_OUT
].name
|| filter
->usmap
.name
)
8841 vty_out(vty
, " Outbound path policy configured\n");
8844 if (filter
->plist
[FILTER_IN
].name
)
8846 " Incoming update prefix filter list is %s%s\n",
8847 filter
->plist
[FILTER_IN
].plist
? "*" : "",
8848 filter
->plist
[FILTER_IN
].name
);
8849 if (filter
->plist
[FILTER_OUT
].name
)
8851 " Outgoing update prefix filter list is %s%s\n",
8852 filter
->plist
[FILTER_OUT
].plist
? "*" : "",
8853 filter
->plist
[FILTER_OUT
].name
);
8855 /* distribute-list */
8856 if (filter
->dlist
[FILTER_IN
].name
)
8858 " Incoming update network filter list is %s%s\n",
8859 filter
->dlist
[FILTER_IN
].alist
? "*" : "",
8860 filter
->dlist
[FILTER_IN
].name
);
8861 if (filter
->dlist
[FILTER_OUT
].name
)
8863 " Outgoing update network filter list is %s%s\n",
8864 filter
->dlist
[FILTER_OUT
].alist
? "*" : "",
8865 filter
->dlist
[FILTER_OUT
].name
);
8868 if (filter
->aslist
[FILTER_IN
].name
)
8870 " Incoming update AS path filter list is %s%s\n",
8871 filter
->aslist
[FILTER_IN
].aslist
? "*" : "",
8872 filter
->aslist
[FILTER_IN
].name
);
8873 if (filter
->aslist
[FILTER_OUT
].name
)
8875 " Outgoing update AS path filter list is %s%s\n",
8876 filter
->aslist
[FILTER_OUT
].aslist
? "*" : "",
8877 filter
->aslist
[FILTER_OUT
].name
);
8880 if (filter
->map
[RMAP_IN
].name
)
8882 " Route map for incoming advertisements is %s%s\n",
8883 filter
->map
[RMAP_IN
].map
? "*" : "",
8884 filter
->map
[RMAP_IN
].name
);
8885 if (filter
->map
[RMAP_OUT
].name
)
8887 " Route map for outgoing advertisements is %s%s\n",
8888 filter
->map
[RMAP_OUT
].map
? "*" : "",
8889 filter
->map
[RMAP_OUT
].name
);
8891 /* unsuppress-map */
8892 if (filter
->usmap
.name
)
8894 " Route map for selective unsuppress is %s%s\n",
8895 filter
->usmap
.map
? "*" : "",
8896 filter
->usmap
.name
);
8898 /* Receive prefix count */
8899 vty_out(vty
, " %ld accepted prefixes\n", p
->pcount
[afi
][safi
]);
8901 /* Maximum prefix */
8902 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
)) {
8903 vty_out(vty
, " Maximum prefixes allowed %ld%s\n",
8905 CHECK_FLAG(p
->af_flags
[afi
][safi
],
8906 PEER_FLAG_MAX_PREFIX_WARNING
)
8909 vty_out(vty
, " Threshold for warning message %d%%",
8910 p
->pmax_threshold
[afi
][safi
]);
8911 if (p
->pmax_restart
[afi
][safi
])
8912 vty_out(vty
, ", restart interval %d min",
8913 p
->pmax_restart
[afi
][safi
]);
8921 static void bgp_show_peer(struct vty
*vty
, struct peer
*p
, uint8_t use_json
,
8925 char buf1
[PREFIX2STR_BUFFER
], buf
[SU_ADDRSTRLEN
];
8926 char timebuf
[BGP_UPTIME_LEN
];
8928 const char *subcode_str
;
8929 const char *code_str
;
8934 json_object
*json_neigh
= NULL
;
8940 json_neigh
= json_object_new_object();
8942 memset(dn_flag
, '\0', sizeof(dn_flag
));
8943 if (!p
->conf_if
&& peer_dynamic_neighbor(p
))
8947 if (p
->conf_if
) /* Configured interface name. */
8948 vty_out(vty
, "BGP neighbor on %s: %s, ", p
->conf_if
,
8949 BGP_PEER_SU_UNSPEC(p
)
8951 : sockunion2str(&p
->su
, buf
,
8953 else /* Configured IP address. */
8954 vty_out(vty
, "BGP neighbor is %s%s, ", dn_flag
,
8959 if (p
->conf_if
&& BGP_PEER_SU_UNSPEC(p
))
8960 json_object_string_add(json_neigh
, "bgpNeighborAddr",
8962 else if (p
->conf_if
&& !BGP_PEER_SU_UNSPEC(p
))
8963 json_object_string_add(
8964 json_neigh
, "bgpNeighborAddr",
8965 sockunion2str(&p
->su
, buf
, SU_ADDRSTRLEN
));
8967 json_object_int_add(json_neigh
, "remoteAs", p
->as
);
8969 if (p
->change_local_as
)
8970 json_object_int_add(json_neigh
, "localAs",
8971 p
->change_local_as
);
8973 json_object_int_add(json_neigh
, "localAs", p
->local_as
);
8975 if (CHECK_FLAG(p
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
))
8976 json_object_boolean_true_add(json_neigh
,
8977 "localAsNoPrepend");
8979 if (CHECK_FLAG(p
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
))
8980 json_object_boolean_true_add(json_neigh
,
8981 "localAsReplaceAs");
8983 if ((p
->as_type
== AS_SPECIFIED
) || (p
->as_type
== AS_EXTERNAL
)
8984 || (p
->as_type
== AS_INTERNAL
))
8985 vty_out(vty
, "remote AS %u, ", p
->as
);
8987 vty_out(vty
, "remote AS Unspecified, ");
8988 vty_out(vty
, "local AS %u%s%s, ",
8989 p
->change_local_as
? p
->change_local_as
: p
->local_as
,
8990 CHECK_FLAG(p
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
)
8993 CHECK_FLAG(p
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
)
8997 /* peer type internal, external, confed-internal or confed-external */
8998 if (p
->as
== p
->local_as
) {
9000 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
))
9001 json_object_boolean_true_add(
9002 json_neigh
, "nbrConfedInternalLink");
9004 json_object_boolean_true_add(json_neigh
,
9007 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
))
9008 vty_out(vty
, "confed-internal link\n");
9010 vty_out(vty
, "internal link\n");
9014 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
))
9015 json_object_boolean_true_add(
9016 json_neigh
, "nbrConfedExternalLink");
9018 json_object_boolean_true_add(json_neigh
,
9021 if (bgp_confederation_peers_check(bgp
, p
->as
))
9022 vty_out(vty
, "confed-external link\n");
9024 vty_out(vty
, "external link\n");
9031 json_object_string_add(json_neigh
, "nbrDesc", p
->desc
);
9033 vty_out(vty
, " Description: %s\n", p
->desc
);
9039 json_object_string_add(json_neigh
, "hostname",
9043 json_object_string_add(json_neigh
, "domainname",
9046 if (p
->domainname
&& (p
->domainname
[0] != '\0'))
9047 vty_out(vty
, "Hostname: %s.%s\n", p
->hostname
,
9050 vty_out(vty
, "Hostname: %s\n", p
->hostname
);
9057 json_object_string_add(json_neigh
, "peerGroup",
9061 struct prefix prefix
, *range
= NULL
;
9063 sockunion2hostprefix(&(p
->su
), &prefix
);
9064 range
= peer_group_lookup_dynamic_neighbor_range(
9068 prefix2str(range
, buf1
, sizeof(buf1
));
9069 json_object_string_add(
9071 "peerSubnetRangeGroup", buf1
);
9076 " Member of peer-group %s for session parameters\n",
9080 struct prefix prefix
, *range
= NULL
;
9082 sockunion2hostprefix(&(p
->su
), &prefix
);
9083 range
= peer_group_lookup_dynamic_neighbor_range(
9087 prefix2str(range
, buf1
, sizeof(buf1
));
9089 " Belongs to the subnet range group: %s\n",
9097 /* Administrative shutdown. */
9098 if (CHECK_FLAG(p
->flags
, PEER_FLAG_SHUTDOWN
))
9099 json_object_boolean_true_add(json_neigh
,
9103 json_object_int_add(json_neigh
, "bgpVersion", 4);
9104 json_object_string_add(
9105 json_neigh
, "remoteRouterId",
9106 inet_ntop(AF_INET
, &p
->remote_id
, buf1
, sizeof(buf1
)));
9109 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
)
9110 && bgp_confederation_peers_check(bgp
, p
->as
))
9111 json_object_boolean_true_add(json_neigh
,
9115 json_object_string_add(
9116 json_neigh
, "bgpState",
9117 lookup_msg(bgp_status_msg
, p
->status
, NULL
));
9119 if (p
->status
== Established
) {
9122 uptime
= bgp_clock();
9123 uptime
-= p
->uptime
;
9124 epoch_tbuf
= time(NULL
) - uptime
;
9126 #if defined(VERSION_TYPE_DEV) && CONFDATE > 20200101
9128 "bgpTimerUp should be deprecated and can be removed now");
9131 * bgpTimerUp was miliseconds that was accurate
9132 * up to 1 day, then the value returned
9133 * became garbage. So in order to provide
9134 * some level of backwards compatability,
9135 * we still provde the data, but now
9136 * we are returning the correct value
9137 * and also adding a new bgpTimerUpMsec
9138 * which will allow us to deprecate
9141 json_object_int_add(json_neigh
, "bgpTimerUp",
9143 json_object_int_add(json_neigh
, "bgpTimerUpMsec",
9145 json_object_string_add(json_neigh
, "bgpTimerUpString",
9146 peer_uptime(p
->uptime
, timebuf
,
9149 json_object_int_add(json_neigh
,
9150 "bgpTimerUpEstablishedEpoch",
9154 else if (p
->status
== Active
) {
9155 if (CHECK_FLAG(p
->flags
, PEER_FLAG_PASSIVE
))
9156 json_object_string_add(json_neigh
, "bgpStateIs",
9158 else if (CHECK_FLAG(p
->sflags
, PEER_STATUS_NSF_WAIT
))
9159 json_object_string_add(json_neigh
, "bgpStateIs",
9167 uptime
= bgp_clock();
9168 uptime
-= p
->readtime
;
9169 tm
= gmtime(&uptime
);
9170 json_object_int_add(json_neigh
, "bgpTimerLastRead",
9171 (tm
->tm_sec
* 1000) + (tm
->tm_min
* 60000)
9172 + (tm
->tm_hour
* 3600000));
9174 uptime
= bgp_clock();
9175 uptime
-= p
->last_write
;
9176 tm
= gmtime(&uptime
);
9177 json_object_int_add(json_neigh
, "bgpTimerLastWrite",
9178 (tm
->tm_sec
* 1000) + (tm
->tm_min
* 60000)
9179 + (tm
->tm_hour
* 3600000));
9181 uptime
= bgp_clock();
9182 uptime
-= p
->update_time
;
9183 tm
= gmtime(&uptime
);
9184 json_object_int_add(json_neigh
, "bgpInUpdateElapsedTimeMsecs",
9185 (tm
->tm_sec
* 1000) + (tm
->tm_min
* 60000)
9186 + (tm
->tm_hour
* 3600000));
9188 /* Configured timer values. */
9189 json_object_int_add(json_neigh
, "bgpTimerHoldTimeMsecs",
9190 p
->v_holdtime
* 1000);
9191 json_object_int_add(json_neigh
,
9192 "bgpTimerKeepAliveIntervalMsecs",
9193 p
->v_keepalive
* 1000);
9194 if (CHECK_FLAG(p
->flags
, PEER_FLAG_TIMER
)) {
9195 json_object_int_add(json_neigh
,
9196 "bgpTimerConfiguredHoldTimeMsecs",
9197 p
->holdtime
* 1000);
9198 json_object_int_add(
9200 "bgpTimerConfiguredKeepAliveIntervalMsecs",
9201 p
->keepalive
* 1000);
9202 } else if ((bgp
->default_holdtime
!= BGP_DEFAULT_HOLDTIME
)
9203 || (bgp
->default_keepalive
9204 != BGP_DEFAULT_KEEPALIVE
)) {
9205 json_object_int_add(json_neigh
,
9206 "bgpTimerConfiguredHoldTimeMsecs",
9207 bgp
->default_holdtime
);
9208 json_object_int_add(
9210 "bgpTimerConfiguredKeepAliveIntervalMsecs",
9211 bgp
->default_keepalive
);
9214 /* Administrative shutdown. */
9215 if (CHECK_FLAG(p
->flags
, PEER_FLAG_SHUTDOWN
))
9216 vty_out(vty
, " Administratively shut down\n");
9219 vty_out(vty
, " BGP version 4");
9220 vty_out(vty
, ", remote router ID %s\n",
9221 inet_ntop(AF_INET
, &p
->remote_id
, buf1
, sizeof(buf1
)));
9224 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
)
9225 && bgp_confederation_peers_check(bgp
, p
->as
))
9227 " Neighbor under common administration\n");
9230 vty_out(vty
, " BGP state = %s",
9231 lookup_msg(bgp_status_msg
, p
->status
, NULL
));
9233 if (p
->status
== Established
)
9234 vty_out(vty
, ", up for %8s",
9235 peer_uptime(p
->uptime
, timebuf
, BGP_UPTIME_LEN
,
9238 else if (p
->status
== Active
) {
9239 if (CHECK_FLAG(p
->flags
, PEER_FLAG_PASSIVE
))
9240 vty_out(vty
, " (passive)");
9241 else if (CHECK_FLAG(p
->sflags
, PEER_STATUS_NSF_WAIT
))
9242 vty_out(vty
, " (NSF passive)");
9247 vty_out(vty
, " Last read %s",
9248 peer_uptime(p
->readtime
, timebuf
, BGP_UPTIME_LEN
, 0,
9250 vty_out(vty
, ", Last write %s\n",
9251 peer_uptime(p
->last_write
, timebuf
, BGP_UPTIME_LEN
, 0,
9254 /* Configured timer values. */
9256 " Hold time is %d, keepalive interval is %d seconds\n",
9257 p
->v_holdtime
, p
->v_keepalive
);
9258 if (CHECK_FLAG(p
->flags
, PEER_FLAG_TIMER
)) {
9259 vty_out(vty
, " Configured hold time is %d",
9261 vty_out(vty
, ", keepalive interval is %d seconds\n",
9263 } else if ((bgp
->default_holdtime
!= BGP_DEFAULT_HOLDTIME
)
9264 || (bgp
->default_keepalive
9265 != BGP_DEFAULT_KEEPALIVE
)) {
9266 vty_out(vty
, " Configured hold time is %d",
9267 bgp
->default_holdtime
);
9268 vty_out(vty
, ", keepalive interval is %d seconds\n",
9269 bgp
->default_keepalive
);
9273 if (p
->status
== Established
) {
9274 if (p
->cap
|| p
->afc_adv
[AFI_IP
][SAFI_UNICAST
]
9275 || p
->afc_recv
[AFI_IP
][SAFI_UNICAST
]
9276 || p
->afc_adv
[AFI_IP
][SAFI_MULTICAST
]
9277 || p
->afc_recv
[AFI_IP
][SAFI_MULTICAST
]
9278 || p
->afc_adv
[AFI_IP6
][SAFI_UNICAST
]
9279 || p
->afc_recv
[AFI_IP6
][SAFI_UNICAST
]
9280 || p
->afc_adv
[AFI_IP6
][SAFI_MULTICAST
]
9281 || p
->afc_recv
[AFI_IP6
][SAFI_MULTICAST
]
9282 || p
->afc_adv
[AFI_IP6
][SAFI_MPLS_VPN
]
9283 || p
->afc_recv
[AFI_IP6
][SAFI_MPLS_VPN
]
9284 || p
->afc_adv
[AFI_IP6
][SAFI_ENCAP
]
9285 || p
->afc_recv
[AFI_IP6
][SAFI_ENCAP
]
9286 || p
->afc_adv
[AFI_IP6
][SAFI_FLOWSPEC
]
9287 || p
->afc_recv
[AFI_IP6
][SAFI_FLOWSPEC
]
9288 || p
->afc_adv
[AFI_IP
][SAFI_ENCAP
]
9289 || p
->afc_recv
[AFI_IP
][SAFI_ENCAP
]
9290 || p
->afc_adv
[AFI_IP
][SAFI_FLOWSPEC
]
9291 || p
->afc_recv
[AFI_IP
][SAFI_FLOWSPEC
]
9292 || p
->afc_adv
[AFI_IP
][SAFI_MPLS_VPN
]
9293 || p
->afc_recv
[AFI_IP
][SAFI_MPLS_VPN
]) {
9295 json_object
*json_cap
= NULL
;
9297 json_cap
= json_object_new_object();
9300 if (CHECK_FLAG(p
->cap
, PEER_CAP_AS4_RCV
)
9301 || CHECK_FLAG(p
->cap
, PEER_CAP_AS4_ADV
)) {
9302 if (CHECK_FLAG(p
->cap
, PEER_CAP_AS4_ADV
)
9303 && CHECK_FLAG(p
->cap
,
9305 json_object_string_add(
9306 json_cap
, "4byteAs",
9307 "advertisedAndReceived");
9308 else if (CHECK_FLAG(p
->cap
,
9310 json_object_string_add(
9311 json_cap
, "4byteAs",
9313 else if (CHECK_FLAG(p
->cap
,
9315 json_object_string_add(
9316 json_cap
, "4byteAs",
9321 if (CHECK_FLAG(p
->cap
, PEER_CAP_ADDPATH_RCV
)
9322 || CHECK_FLAG(p
->cap
,
9323 PEER_CAP_ADDPATH_ADV
)) {
9324 json_object
*json_add
= NULL
;
9325 const char *print_store
;
9327 json_add
= json_object_new_object();
9329 FOREACH_AFI_SAFI (afi
, safi
) {
9330 json_object
*json_sub
= NULL
;
9332 json_object_new_object();
9333 print_store
= afi_safi_print(
9339 PEER_CAP_ADDPATH_AF_TX_ADV
)
9343 PEER_CAP_ADDPATH_AF_TX_RCV
)) {
9348 PEER_CAP_ADDPATH_AF_TX_ADV
)
9353 PEER_CAP_ADDPATH_AF_TX_RCV
))
9354 json_object_boolean_true_add(
9356 "txAdvertisedAndReceived");
9362 PEER_CAP_ADDPATH_AF_TX_ADV
))
9363 json_object_boolean_true_add(
9371 PEER_CAP_ADDPATH_AF_TX_RCV
))
9372 json_object_boolean_true_add(
9380 PEER_CAP_ADDPATH_AF_RX_ADV
)
9384 PEER_CAP_ADDPATH_AF_RX_RCV
)) {
9389 PEER_CAP_ADDPATH_AF_RX_ADV
)
9394 PEER_CAP_ADDPATH_AF_RX_RCV
))
9395 json_object_boolean_true_add(
9397 "rxAdvertisedAndReceived");
9403 PEER_CAP_ADDPATH_AF_RX_ADV
))
9404 json_object_boolean_true_add(
9412 PEER_CAP_ADDPATH_AF_RX_RCV
))
9413 json_object_boolean_true_add(
9421 PEER_CAP_ADDPATH_AF_TX_ADV
)
9425 PEER_CAP_ADDPATH_AF_TX_RCV
)
9429 PEER_CAP_ADDPATH_AF_RX_ADV
)
9433 PEER_CAP_ADDPATH_AF_RX_RCV
))
9434 json_object_object_add(
9443 json_object_object_add(
9444 json_cap
, "addPath", json_add
);
9448 if (CHECK_FLAG(p
->cap
, PEER_CAP_DYNAMIC_RCV
)
9449 || CHECK_FLAG(p
->cap
,
9450 PEER_CAP_DYNAMIC_ADV
)) {
9451 if (CHECK_FLAG(p
->cap
,
9452 PEER_CAP_DYNAMIC_ADV
)
9453 && CHECK_FLAG(p
->cap
,
9454 PEER_CAP_DYNAMIC_RCV
))
9455 json_object_string_add(
9456 json_cap
, "dynamic",
9457 "advertisedAndReceived");
9458 else if (CHECK_FLAG(
9460 PEER_CAP_DYNAMIC_ADV
))
9461 json_object_string_add(
9462 json_cap
, "dynamic",
9464 else if (CHECK_FLAG(
9466 PEER_CAP_DYNAMIC_RCV
))
9467 json_object_string_add(
9468 json_cap
, "dynamic",
9472 /* Extended nexthop */
9473 if (CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_RCV
)
9474 || CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_ADV
)) {
9475 json_object
*json_nxt
= NULL
;
9476 const char *print_store
;
9479 if (CHECK_FLAG(p
->cap
,
9481 && CHECK_FLAG(p
->cap
,
9483 json_object_string_add(
9486 "advertisedAndReceived");
9487 else if (CHECK_FLAG(p
->cap
,
9489 json_object_string_add(
9493 else if (CHECK_FLAG(p
->cap
,
9495 json_object_string_add(
9500 if (CHECK_FLAG(p
->cap
,
9501 PEER_CAP_ENHE_RCV
)) {
9503 json_object_new_object();
9505 for (safi
= SAFI_UNICAST
;
9506 safi
< SAFI_MAX
; safi
++) {
9511 PEER_CAP_ENHE_AF_RCV
)) {
9512 print_store
= afi_safi_print(
9515 json_object_string_add(
9521 json_object_object_add(
9523 "extendedNexthopFamililesByPeer",
9529 if (CHECK_FLAG(p
->cap
, PEER_CAP_REFRESH_ADV
)
9530 || CHECK_FLAG(p
->cap
,
9531 PEER_CAP_REFRESH_NEW_RCV
)
9532 || CHECK_FLAG(p
->cap
,
9533 PEER_CAP_REFRESH_OLD_RCV
)) {
9534 if (CHECK_FLAG(p
->cap
,
9535 PEER_CAP_REFRESH_ADV
)
9538 PEER_CAP_REFRESH_NEW_RCV
)
9541 PEER_CAP_REFRESH_OLD_RCV
))) {
9544 PEER_CAP_REFRESH_OLD_RCV
)
9547 PEER_CAP_REFRESH_NEW_RCV
))
9548 json_object_string_add(
9551 "advertisedAndReceivedOldNew");
9555 PEER_CAP_REFRESH_OLD_RCV
))
9556 json_object_string_add(
9559 "advertisedAndReceivedOld");
9561 json_object_string_add(
9564 "advertisedAndReceivedNew");
9569 PEER_CAP_REFRESH_ADV
))
9570 json_object_string_add(
9577 PEER_CAP_REFRESH_NEW_RCV
)
9580 PEER_CAP_REFRESH_OLD_RCV
))
9581 json_object_string_add(
9587 /* Multiprotocol Extensions */
9588 json_object
*json_multi
= NULL
;
9589 json_multi
= json_object_new_object();
9591 FOREACH_AFI_SAFI (afi
, safi
) {
9592 if (p
->afc_adv
[afi
][safi
]
9593 || p
->afc_recv
[afi
][safi
]) {
9594 json_object
*json_exten
= NULL
;
9596 json_object_new_object();
9598 if (p
->afc_adv
[afi
][safi
]
9599 && p
->afc_recv
[afi
][safi
])
9600 json_object_boolean_true_add(
9602 "advertisedAndReceived");
9603 else if (p
->afc_adv
[afi
][safi
])
9604 json_object_boolean_true_add(
9607 else if (p
->afc_recv
[afi
][safi
])
9608 json_object_boolean_true_add(
9612 json_object_object_add(
9619 json_object_object_add(
9620 json_cap
, "multiprotocolExtensions",
9623 /* Hostname capabilities */
9624 json_object
*json_hname
= NULL
;
9626 json_hname
= json_object_new_object();
9628 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_ADV
)) {
9629 json_object_string_add(
9630 json_hname
, "advHostName",
9631 bgp
->peer_self
->hostname
9635 json_object_string_add(
9636 json_hname
, "advDomainName",
9637 bgp
->peer_self
->domainname
9644 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_RCV
)) {
9645 json_object_string_add(
9646 json_hname
, "rcvHostName",
9647 p
->hostname
? p
->hostname
9649 json_object_string_add(
9650 json_hname
, "rcvDomainName",
9651 p
->domainname
? p
->domainname
9655 json_object_object_add(json_cap
, "hostName",
9658 /* Gracefull Restart */
9659 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
)
9660 || CHECK_FLAG(p
->cap
,
9661 PEER_CAP_RESTART_ADV
)) {
9662 if (CHECK_FLAG(p
->cap
,
9663 PEER_CAP_RESTART_ADV
)
9664 && CHECK_FLAG(p
->cap
,
9665 PEER_CAP_RESTART_RCV
))
9666 json_object_string_add(
9669 "advertisedAndReceived");
9670 else if (CHECK_FLAG(
9672 PEER_CAP_RESTART_ADV
))
9673 json_object_string_add(
9675 "gracefulRestartCapability",
9677 else if (CHECK_FLAG(
9679 PEER_CAP_RESTART_RCV
))
9680 json_object_string_add(
9682 "gracefulRestartCapability",
9685 if (CHECK_FLAG(p
->cap
,
9686 PEER_CAP_RESTART_RCV
)) {
9687 int restart_af_count
= 0;
9688 json_object
*json_restart
=
9691 json_object_new_object();
9693 json_object_int_add(
9695 "gracefulRestartRemoteTimerMsecs",
9696 p
->v_gr_restart
* 1000);
9698 FOREACH_AFI_SAFI (afi
, safi
) {
9703 PEER_CAP_RESTART_AF_RCV
)) {
9708 json_object_new_object();
9714 PEER_CAP_RESTART_AF_PRESERVE_RCV
))
9715 json_object_boolean_true_add(
9719 json_object_object_add(
9727 if (!restart_af_count
) {
9728 json_object_string_add(
9730 "addressFamiliesByPeer",
9735 json_object_object_add(
9737 "addressFamiliesByPeer",
9741 json_object_object_add(json_neigh
,
9742 "neighborCapabilities",
9745 vty_out(vty
, " Neighbor capabilities:\n");
9748 if (CHECK_FLAG(p
->cap
, PEER_CAP_AS4_RCV
)
9749 || CHECK_FLAG(p
->cap
, PEER_CAP_AS4_ADV
)) {
9750 vty_out(vty
, " 4 Byte AS:");
9751 if (CHECK_FLAG(p
->cap
,
9753 vty_out(vty
, " advertised");
9754 if (CHECK_FLAG(p
->cap
,
9756 vty_out(vty
, " %sreceived",
9766 if (CHECK_FLAG(p
->cap
, PEER_CAP_ADDPATH_RCV
)
9767 || CHECK_FLAG(p
->cap
,
9768 PEER_CAP_ADDPATH_ADV
)) {
9769 vty_out(vty
, " AddPath:\n");
9771 FOREACH_AFI_SAFI (afi
, safi
) {
9775 PEER_CAP_ADDPATH_AF_TX_ADV
)
9779 PEER_CAP_ADDPATH_AF_TX_RCV
)) {
9790 PEER_CAP_ADDPATH_AF_TX_ADV
))
9801 PEER_CAP_ADDPATH_AF_TX_RCV
))
9808 PEER_CAP_ADDPATH_AF_TX_ADV
)
9818 PEER_CAP_ADDPATH_AF_RX_ADV
)
9822 PEER_CAP_ADDPATH_AF_RX_RCV
)) {
9833 PEER_CAP_ADDPATH_AF_RX_ADV
))
9844 PEER_CAP_ADDPATH_AF_RX_RCV
))
9851 PEER_CAP_ADDPATH_AF_RX_ADV
)
9861 if (CHECK_FLAG(p
->cap
, PEER_CAP_DYNAMIC_RCV
)
9862 || CHECK_FLAG(p
->cap
,
9863 PEER_CAP_DYNAMIC_ADV
)) {
9864 vty_out(vty
, " Dynamic:");
9865 if (CHECK_FLAG(p
->cap
,
9866 PEER_CAP_DYNAMIC_ADV
))
9867 vty_out(vty
, " advertised");
9868 if (CHECK_FLAG(p
->cap
,
9869 PEER_CAP_DYNAMIC_RCV
))
9870 vty_out(vty
, " %sreceived",
9873 PEER_CAP_DYNAMIC_ADV
)
9879 /* Extended nexthop */
9880 if (CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_RCV
)
9881 || CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_ADV
)) {
9882 vty_out(vty
, " Extended nexthop:");
9883 if (CHECK_FLAG(p
->cap
,
9885 vty_out(vty
, " advertised");
9886 if (CHECK_FLAG(p
->cap
,
9888 vty_out(vty
, " %sreceived",
9896 if (CHECK_FLAG(p
->cap
,
9897 PEER_CAP_ENHE_RCV
)) {
9899 " Address families by peer:\n ");
9900 for (safi
= SAFI_UNICAST
;
9901 safi
< SAFI_MAX
; safi
++)
9906 PEER_CAP_ENHE_AF_RCV
))
9916 if (CHECK_FLAG(p
->cap
, PEER_CAP_REFRESH_ADV
)
9917 || CHECK_FLAG(p
->cap
,
9918 PEER_CAP_REFRESH_NEW_RCV
)
9919 || CHECK_FLAG(p
->cap
,
9920 PEER_CAP_REFRESH_OLD_RCV
)) {
9921 vty_out(vty
, " Route refresh:");
9922 if (CHECK_FLAG(p
->cap
,
9923 PEER_CAP_REFRESH_ADV
))
9924 vty_out(vty
, " advertised");
9925 if (CHECK_FLAG(p
->cap
,
9926 PEER_CAP_REFRESH_NEW_RCV
)
9929 PEER_CAP_REFRESH_OLD_RCV
))
9930 vty_out(vty
, " %sreceived(%s)",
9933 PEER_CAP_REFRESH_ADV
)
9938 PEER_CAP_REFRESH_OLD_RCV
)
9941 PEER_CAP_REFRESH_NEW_RCV
))
9945 PEER_CAP_REFRESH_OLD_RCV
)
9952 /* Multiprotocol Extensions */
9953 FOREACH_AFI_SAFI (afi
, safi
)
9954 if (p
->afc_adv
[afi
][safi
]
9955 || p
->afc_recv
[afi
][safi
]) {
9957 " Address Family %s:",
9960 if (p
->afc_adv
[afi
][safi
])
9963 if (p
->afc_recv
[afi
][safi
])
9973 /* Hostname capability */
9974 vty_out(vty
, " Hostname Capability:");
9976 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_ADV
)) {
9978 " advertised (name: %s,domain name: %s)",
9979 bgp
->peer_self
->hostname
9983 bgp
->peer_self
->domainname
9988 vty_out(vty
, " not advertised");
9991 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_RCV
)) {
9993 " received (name: %s,domain name: %s)",
9994 p
->hostname
? p
->hostname
9996 p
->domainname
? p
->domainname
9999 vty_out(vty
, " not received");
10002 vty_out(vty
, "\n");
10004 /* Gracefull Restart */
10005 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
)
10006 || CHECK_FLAG(p
->cap
,
10007 PEER_CAP_RESTART_ADV
)) {
10009 " Graceful Restart Capabilty:");
10010 if (CHECK_FLAG(p
->cap
,
10011 PEER_CAP_RESTART_ADV
))
10012 vty_out(vty
, " advertised");
10013 if (CHECK_FLAG(p
->cap
,
10014 PEER_CAP_RESTART_RCV
))
10015 vty_out(vty
, " %sreceived",
10018 PEER_CAP_RESTART_ADV
)
10021 vty_out(vty
, "\n");
10023 if (CHECK_FLAG(p
->cap
,
10024 PEER_CAP_RESTART_RCV
)) {
10025 int restart_af_count
= 0;
10028 " Remote Restart timer is %d seconds\n",
10031 " Address families by peer:\n ");
10033 FOREACH_AFI_SAFI (afi
, safi
)
10038 PEER_CAP_RESTART_AF_RCV
)) {
10051 PEER_CAP_RESTART_AF_PRESERVE_RCV
)
10053 : "not preserved");
10054 restart_af_count
++;
10056 if (!restart_af_count
)
10057 vty_out(vty
, "none");
10058 vty_out(vty
, "\n");
10065 /* graceful restart information */
10066 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
) || p
->t_gr_restart
10067 || p
->t_gr_stale
) {
10068 json_object
*json_grace
= NULL
;
10069 json_object
*json_grace_send
= NULL
;
10070 json_object
*json_grace_recv
= NULL
;
10071 int eor_send_af_count
= 0;
10072 int eor_receive_af_count
= 0;
10075 json_grace
= json_object_new_object();
10076 json_grace_send
= json_object_new_object();
10077 json_grace_recv
= json_object_new_object();
10079 if (p
->status
== Established
) {
10080 FOREACH_AFI_SAFI (afi
, safi
) {
10081 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
10082 PEER_STATUS_EOR_SEND
)) {
10083 json_object_boolean_true_add(
10085 afi_safi_print(afi
,
10087 eor_send_af_count
++;
10090 FOREACH_AFI_SAFI (afi
, safi
) {
10092 p
->af_sflags
[afi
][safi
],
10093 PEER_STATUS_EOR_RECEIVED
)) {
10094 json_object_boolean_true_add(
10096 afi_safi_print(afi
,
10098 eor_receive_af_count
++;
10103 json_object_object_add(json_grace
, "endOfRibSend",
10105 json_object_object_add(json_grace
, "endOfRibRecv",
10108 if (p
->t_gr_restart
)
10109 json_object_int_add(json_grace
,
10110 "gracefulRestartTimerMsecs",
10111 thread_timer_remain_second(
10116 json_object_int_add(
10118 "gracefulStalepathTimerMsecs",
10119 thread_timer_remain_second(
10123 json_object_object_add(
10124 json_neigh
, "gracefulRestartInfo", json_grace
);
10126 vty_out(vty
, " Graceful restart informations:\n");
10127 if (p
->status
== Established
) {
10128 vty_out(vty
, " End-of-RIB send: ");
10129 FOREACH_AFI_SAFI (afi
, safi
) {
10130 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
10131 PEER_STATUS_EOR_SEND
)) {
10132 vty_out(vty
, "%s%s",
10133 eor_send_af_count
? ", "
10135 afi_safi_print(afi
,
10137 eor_send_af_count
++;
10140 vty_out(vty
, "\n");
10141 vty_out(vty
, " End-of-RIB received: ");
10142 FOREACH_AFI_SAFI (afi
, safi
) {
10144 p
->af_sflags
[afi
][safi
],
10145 PEER_STATUS_EOR_RECEIVED
)) {
10146 vty_out(vty
, "%s%s",
10147 eor_receive_af_count
10150 afi_safi_print(afi
,
10152 eor_receive_af_count
++;
10155 vty_out(vty
, "\n");
10158 if (p
->t_gr_restart
)
10160 " The remaining time of restart timer is %ld\n",
10161 thread_timer_remain_second(
10166 " The remaining time of stalepath timer is %ld\n",
10167 thread_timer_remain_second(
10172 json_object
*json_stat
= NULL
;
10173 json_stat
= json_object_new_object();
10174 /* Packet counts. */
10175 json_object_int_add(json_stat
, "depthInq", 0);
10176 json_object_int_add(json_stat
, "depthOutq",
10177 (unsigned long)p
->obuf
->count
);
10178 json_object_int_add(json_stat
, "opensSent",
10179 atomic_load_explicit(&p
->open_out
,
10180 memory_order_relaxed
));
10181 json_object_int_add(json_stat
, "opensRecv",
10182 atomic_load_explicit(&p
->open_in
,
10183 memory_order_relaxed
));
10184 json_object_int_add(json_stat
, "notificationsSent",
10185 atomic_load_explicit(&p
->notify_out
,
10186 memory_order_relaxed
));
10187 json_object_int_add(json_stat
, "notificationsRecv",
10188 atomic_load_explicit(&p
->notify_in
,
10189 memory_order_relaxed
));
10190 json_object_int_add(json_stat
, "updatesSent",
10191 atomic_load_explicit(&p
->update_out
,
10192 memory_order_relaxed
));
10193 json_object_int_add(json_stat
, "updatesRecv",
10194 atomic_load_explicit(&p
->update_in
,
10195 memory_order_relaxed
));
10196 json_object_int_add(json_stat
, "keepalivesSent",
10197 atomic_load_explicit(&p
->keepalive_out
,
10198 memory_order_relaxed
));
10199 json_object_int_add(json_stat
, "keepalivesRecv",
10200 atomic_load_explicit(&p
->keepalive_in
,
10201 memory_order_relaxed
));
10202 json_object_int_add(json_stat
, "routeRefreshSent",
10203 atomic_load_explicit(&p
->refresh_out
,
10204 memory_order_relaxed
));
10205 json_object_int_add(json_stat
, "routeRefreshRecv",
10206 atomic_load_explicit(&p
->refresh_in
,
10207 memory_order_relaxed
));
10208 json_object_int_add(json_stat
, "capabilitySent",
10209 atomic_load_explicit(&p
->dynamic_cap_out
,
10210 memory_order_relaxed
));
10211 json_object_int_add(json_stat
, "capabilityRecv",
10212 atomic_load_explicit(&p
->dynamic_cap_in
,
10213 memory_order_relaxed
));
10214 json_object_int_add(json_stat
, "totalSent", PEER_TOTAL_TX(p
));
10215 json_object_int_add(json_stat
, "totalRecv", PEER_TOTAL_RX(p
));
10216 json_object_object_add(json_neigh
, "messageStats", json_stat
);
10218 /* Packet counts. */
10219 vty_out(vty
, " Message statistics:\n");
10220 vty_out(vty
, " Inq depth is 0\n");
10221 vty_out(vty
, " Outq depth is %lu\n",
10222 (unsigned long)p
->obuf
->count
);
10223 vty_out(vty
, " Sent Rcvd\n");
10224 vty_out(vty
, " Opens: %10d %10d\n",
10225 atomic_load_explicit(&p
->open_out
,
10226 memory_order_relaxed
),
10227 atomic_load_explicit(&p
->open_in
,
10228 memory_order_relaxed
));
10229 vty_out(vty
, " Notifications: %10d %10d\n",
10230 atomic_load_explicit(&p
->notify_out
,
10231 memory_order_relaxed
),
10232 atomic_load_explicit(&p
->notify_in
,
10233 memory_order_relaxed
));
10234 vty_out(vty
, " Updates: %10d %10d\n",
10235 atomic_load_explicit(&p
->update_out
,
10236 memory_order_relaxed
),
10237 atomic_load_explicit(&p
->update_in
,
10238 memory_order_relaxed
));
10239 vty_out(vty
, " Keepalives: %10d %10d\n",
10240 atomic_load_explicit(&p
->keepalive_out
,
10241 memory_order_relaxed
),
10242 atomic_load_explicit(&p
->keepalive_in
,
10243 memory_order_relaxed
));
10244 vty_out(vty
, " Route Refresh: %10d %10d\n",
10245 atomic_load_explicit(&p
->refresh_out
,
10246 memory_order_relaxed
),
10247 atomic_load_explicit(&p
->refresh_in
,
10248 memory_order_relaxed
));
10249 vty_out(vty
, " Capability: %10d %10d\n",
10250 atomic_load_explicit(&p
->dynamic_cap_out
,
10251 memory_order_relaxed
),
10252 atomic_load_explicit(&p
->dynamic_cap_in
,
10253 memory_order_relaxed
));
10254 vty_out(vty
, " Total: %10d %10d\n", PEER_TOTAL_TX(p
),
10259 /* advertisement-interval */
10260 json_object_int_add(json_neigh
,
10261 "minBtwnAdvertisementRunsTimerMsecs",
10262 p
->v_routeadv
* 1000);
10264 /* Update-source. */
10265 if (p
->update_if
|| p
->update_source
) {
10267 json_object_string_add(json_neigh
,
10270 else if (p
->update_source
)
10271 json_object_string_add(
10272 json_neigh
, "updateSource",
10273 sockunion2str(p
->update_source
, buf1
,
10277 /* advertisement-interval */
10279 " Minimum time between advertisement runs is %d seconds\n",
10282 /* Update-source. */
10283 if (p
->update_if
|| p
->update_source
) {
10284 vty_out(vty
, " Update source is ");
10286 vty_out(vty
, "%s", p
->update_if
);
10287 else if (p
->update_source
)
10289 sockunion2str(p
->update_source
, buf1
,
10291 vty_out(vty
, "\n");
10294 vty_out(vty
, "\n");
10297 /* Address Family Information */
10298 json_object
*json_hold
= NULL
;
10301 json_hold
= json_object_new_object();
10303 FOREACH_AFI_SAFI (afi
, safi
)
10304 if (p
->afc
[afi
][safi
])
10305 bgp_show_peer_afi(vty
, p
, afi
, safi
, use_json
,
10309 json_object_object_add(json_neigh
, "addressFamilyInfo",
10311 json_object_int_add(json_neigh
, "connectionsEstablished",
10313 json_object_int_add(json_neigh
, "connectionsDropped",
10316 vty_out(vty
, " Connections established %d; dropped %d\n",
10317 p
->established
, p
->dropped
);
10319 if (!p
->last_reset
) {
10321 json_object_string_add(json_neigh
, "lastReset",
10324 vty_out(vty
, " Last reset never\n");
10330 uptime
= bgp_clock();
10331 uptime
-= p
->resettime
;
10332 tm
= gmtime(&uptime
);
10333 json_object_int_add(json_neigh
, "lastResetTimerMsecs",
10334 (tm
->tm_sec
* 1000)
10335 + (tm
->tm_min
* 60000)
10336 + (tm
->tm_hour
* 3600000));
10337 json_object_string_add(
10338 json_neigh
, "lastResetDueTo",
10339 peer_down_str
[(int)p
->last_reset
]);
10340 if (p
->last_reset
== PEER_DOWN_NOTIFY_SEND
10341 || p
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
) {
10342 char errorcodesubcode_hexstr
[5];
10343 char errorcodesubcode_str
[256];
10345 code_str
= bgp_notify_code_str(p
->notify
.code
);
10346 subcode_str
= bgp_notify_subcode_str(
10347 p
->notify
.code
, p
->notify
.subcode
);
10349 sprintf(errorcodesubcode_hexstr
, "%02X%02X",
10350 p
->notify
.code
, p
->notify
.subcode
);
10351 json_object_string_add(json_neigh
,
10352 "lastErrorCodeSubcode",
10353 errorcodesubcode_hexstr
);
10354 snprintf(errorcodesubcode_str
, 255, "%s%s",
10355 code_str
, subcode_str
);
10356 json_object_string_add(json_neigh
,
10357 "lastNotificationReason",
10358 errorcodesubcode_str
);
10359 if (p
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
10360 && p
->notify
.code
== BGP_NOTIFY_CEASE
10361 && (p
->notify
.subcode
10362 == BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
10363 || p
->notify
.subcode
10364 == BGP_NOTIFY_CEASE_ADMIN_RESET
)
10365 && p
->notify
.length
) {
10367 const char *msg_str
;
10369 msg_str
= bgp_notify_admin_message(
10370 msgbuf
, sizeof(msgbuf
),
10371 (uint8_t *)p
->notify
.data
,
10374 json_object_string_add(
10376 "lastShutdownDescription",
10381 vty_out(vty
, " Last reset %s, ",
10382 peer_uptime(p
->resettime
, timebuf
,
10383 BGP_UPTIME_LEN
, 0, NULL
));
10385 if (p
->last_reset
== PEER_DOWN_NOTIFY_SEND
10386 || p
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
) {
10387 code_str
= bgp_notify_code_str(p
->notify
.code
);
10388 subcode_str
= bgp_notify_subcode_str(
10389 p
->notify
.code
, p
->notify
.subcode
);
10390 vty_out(vty
, "due to NOTIFICATION %s (%s%s)\n",
10391 p
->last_reset
== PEER_DOWN_NOTIFY_SEND
10394 code_str
, subcode_str
);
10395 if (p
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
10396 && p
->notify
.code
== BGP_NOTIFY_CEASE
10397 && (p
->notify
.subcode
10398 == BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
10399 || p
->notify
.subcode
10400 == BGP_NOTIFY_CEASE_ADMIN_RESET
)
10401 && p
->notify
.length
) {
10403 const char *msg_str
;
10405 msg_str
= bgp_notify_admin_message(
10406 msgbuf
, sizeof(msgbuf
),
10407 (uint8_t *)p
->notify
.data
,
10411 " Message: \"%s\"\n",
10415 vty_out(vty
, "due to %s\n",
10416 peer_down_str
[(int)p
->last_reset
]);
10419 if (p
->last_reset_cause_size
) {
10420 msg
= p
->last_reset_cause
;
10422 " Message received that caused BGP to send a NOTIFICATION:\n ");
10423 for (i
= 1; i
<= p
->last_reset_cause_size
;
10425 vty_out(vty
, "%02X", *msg
++);
10427 if (i
!= p
->last_reset_cause_size
) {
10429 vty_out(vty
, "\n ");
10430 } else if (i
% 4 == 0) {
10435 vty_out(vty
, "\n");
10440 if (CHECK_FLAG(p
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
)) {
10442 json_object_boolean_true_add(json_neigh
,
10443 "prefixesConfigExceedMax");
10446 " Peer had exceeded the max. no. of prefixes configured.\n");
10448 if (p
->t_pmax_restart
) {
10450 json_object_boolean_true_add(
10451 json_neigh
, "reducePrefixNumFrom");
10452 json_object_int_add(json_neigh
,
10453 "restartInTimerMsec",
10454 thread_timer_remain_second(
10459 " Reduce the no. of prefix from %s, will restart in %ld seconds\n",
10460 p
->host
, thread_timer_remain_second(
10461 p
->t_pmax_restart
));
10464 json_object_boolean_true_add(
10466 "reducePrefixNumAndClearIpBgp");
10469 " Reduce the no. of prefix and clear ip bgp %s to restore peering\n",
10474 /* EBGP Multihop and GTSM */
10475 if (p
->sort
!= BGP_PEER_IBGP
) {
10477 if (p
->gtsm_hops
> 0)
10478 json_object_int_add(json_neigh
,
10479 "externalBgpNbrMaxHopsAway",
10481 else if (p
->ttl
> 1)
10482 json_object_int_add(json_neigh
,
10483 "externalBgpNbrMaxHopsAway",
10486 if (p
->gtsm_hops
> 0)
10488 " External BGP neighbor may be up to %d hops away.\n",
10490 else if (p
->ttl
> 1)
10492 " External BGP neighbor may be up to %d hops away.\n",
10496 if (p
->gtsm_hops
> 0) {
10498 json_object_int_add(json_neigh
,
10499 "internalBgpNbrMaxHopsAway",
10503 " Internal BGP neighbor may be up to %d hops away.\n",
10508 /* Local address. */
10511 json_object_string_add(json_neigh
, "hostLocal",
10512 sockunion2str(p
->su_local
, buf1
,
10514 json_object_int_add(json_neigh
, "portLocal",
10515 ntohs(p
->su_local
->sin
.sin_port
));
10517 vty_out(vty
, "Local host: %s, Local port: %d\n",
10518 sockunion2str(p
->su_local
, buf1
, SU_ADDRSTRLEN
),
10519 ntohs(p
->su_local
->sin
.sin_port
));
10522 /* Remote address. */
10523 if (p
->su_remote
) {
10525 json_object_string_add(json_neigh
, "hostForeign",
10526 sockunion2str(p
->su_remote
, buf1
,
10528 json_object_int_add(json_neigh
, "portForeign",
10529 ntohs(p
->su_remote
->sin
.sin_port
));
10531 vty_out(vty
, "Foreign host: %s, Foreign port: %d\n",
10532 sockunion2str(p
->su_remote
, buf1
,
10534 ntohs(p
->su_remote
->sin
.sin_port
));
10537 /* Nexthop display. */
10540 json_object_string_add(json_neigh
, "nexthop",
10542 &p
->nexthop
.v4
, buf1
,
10544 json_object_string_add(json_neigh
, "nexthopGlobal",
10545 inet_ntop(AF_INET6
,
10546 &p
->nexthop
.v6_global
,
10547 buf1
, sizeof(buf1
)));
10548 json_object_string_add(json_neigh
, "nexthopLocal",
10549 inet_ntop(AF_INET6
,
10550 &p
->nexthop
.v6_local
,
10551 buf1
, sizeof(buf1
)));
10552 if (p
->shared_network
)
10553 json_object_string_add(json_neigh
,
10557 json_object_string_add(json_neigh
,
10559 "nonSharedNetwork");
10561 vty_out(vty
, "Nexthop: %s\n",
10562 inet_ntop(AF_INET
, &p
->nexthop
.v4
, buf1
,
10564 vty_out(vty
, "Nexthop global: %s\n",
10565 inet_ntop(AF_INET6
, &p
->nexthop
.v6_global
, buf1
,
10567 vty_out(vty
, "Nexthop local: %s\n",
10568 inet_ntop(AF_INET6
, &p
->nexthop
.v6_local
, buf1
,
10570 vty_out(vty
, "BGP connection: %s\n",
10571 p
->shared_network
? "shared network"
10572 : "non shared network");
10576 /* Timer information. */
10578 json_object_int_add(json_neigh
, "connectRetryTimer",
10580 if (p
->status
== Established
&& p
->rtt
)
10581 json_object_int_add(json_neigh
, "estimatedRttInMsecs",
10584 json_object_int_add(
10585 json_neigh
, "nextStartTimerDueInMsecs",
10586 thread_timer_remain_second(p
->t_start
) * 1000);
10588 json_object_int_add(
10589 json_neigh
, "nextConnectTimerDueInMsecs",
10590 thread_timer_remain_second(p
->t_connect
)
10592 if (p
->t_routeadv
) {
10593 json_object_int_add(json_neigh
, "mraiInterval",
10595 json_object_int_add(
10596 json_neigh
, "mraiTimerExpireInMsecs",
10597 thread_timer_remain_second(p
->t_routeadv
)
10601 json_object_int_add(json_neigh
, "authenticationEnabled",
10605 json_object_string_add(json_neigh
, "readThread", "on");
10607 json_object_string_add(json_neigh
, "readThread", "off");
10609 if (CHECK_FLAG(p
->thread_flags
, PEER_THREAD_WRITES_ON
))
10610 json_object_string_add(json_neigh
, "writeThread", "on");
10612 json_object_string_add(json_neigh
, "writeThread",
10615 vty_out(vty
, "BGP Connect Retry Timer in Seconds: %d\n",
10617 if (p
->status
== Established
&& p
->rtt
)
10618 vty_out(vty
, "Estimated round trip time: %d ms\n",
10621 vty_out(vty
, "Next start timer due in %ld seconds\n",
10622 thread_timer_remain_second(p
->t_start
));
10624 vty_out(vty
, "Next connect timer due in %ld seconds\n",
10625 thread_timer_remain_second(p
->t_connect
));
10628 "MRAI (interval %u) timer expires in %ld seconds\n",
10630 thread_timer_remain_second(p
->t_routeadv
));
10632 vty_out(vty
, "Peer Authentication Enabled\n");
10634 vty_out(vty
, "Read thread: %s Write thread: %s\n",
10635 p
->t_read
? "on" : "off",
10636 CHECK_FLAG(p
->thread_flags
, PEER_THREAD_WRITES_ON
)
10641 if (p
->notify
.code
== BGP_NOTIFY_OPEN_ERR
10642 && p
->notify
.subcode
== BGP_NOTIFY_OPEN_UNSUP_CAPBL
)
10643 bgp_capability_vty_out(vty
, p
, use_json
, json_neigh
);
10646 vty_out(vty
, "\n");
10648 /* BFD information. */
10649 bgp_bfd_show_info(vty
, p
, use_json
, json_neigh
);
10652 if (p
->conf_if
) /* Configured interface name. */
10653 json_object_object_add(json
, p
->conf_if
, json_neigh
);
10654 else /* Configured IP address. */
10655 json_object_object_add(json
, p
->host
, json_neigh
);
10659 static int bgp_show_neighbor(struct vty
*vty
, struct bgp
*bgp
,
10660 enum show_type type
, union sockunion
*su
,
10661 const char *conf_if
, uint8_t use_json
,
10664 struct listnode
*node
, *nnode
;
10668 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
10669 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
10674 bgp_show_peer(vty
, peer
, use_json
, json
);
10679 && !strcmp(peer
->conf_if
, conf_if
))
10681 && !strcmp(peer
->hostname
, conf_if
))) {
10683 bgp_show_peer(vty
, peer
, use_json
,
10687 if (sockunion_same(&peer
->su
, su
)) {
10689 bgp_show_peer(vty
, peer
, use_json
,
10697 if (type
== show_peer
&& !find
) {
10699 json_object_boolean_true_add(json
, "bgpNoSuchNeighbor");
10701 vty_out(vty
, "%% No such neighbor in this view/vrf\n");
10705 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
10706 json
, JSON_C_TO_STRING_PRETTY
));
10707 json_object_free(json
);
10709 vty_out(vty
, "\n");
10712 return CMD_SUCCESS
;
10715 static void bgp_show_all_instances_neighbors_vty(struct vty
*vty
,
10716 enum show_type type
,
10717 const char *ip_str
,
10720 struct listnode
*node
, *nnode
;
10722 union sockunion su
;
10723 json_object
*json
= NULL
;
10724 int ret
, is_first
= 1;
10727 vty_out(vty
, "{\n");
10729 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
10731 if (!(json
= json_object_new_object())) {
10733 "Unable to allocate memory for JSON object");
10735 "{\"error\": {\"message:\": \"Unable to allocate memory for JSON object\"}}}\n");
10739 json_object_int_add(json
, "vrfId",
10740 (bgp
->vrf_id
== VRF_UNKNOWN
)
10742 : (int64_t)bgp
->vrf_id
);
10743 json_object_string_add(
10745 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
10750 vty_out(vty
, ",\n");
10754 vty_out(vty
, "\"%s\":",
10755 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
10759 vty_out(vty
, "\nInstance %s:\n",
10760 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
10765 if (type
== show_peer
) {
10766 ret
= str2sockunion(ip_str
, &su
);
10768 bgp_show_neighbor(vty
, bgp
, type
, NULL
, ip_str
,
10771 bgp_show_neighbor(vty
, bgp
, type
, &su
, NULL
,
10774 bgp_show_neighbor(vty
, bgp
, show_all
, NULL
, NULL
,
10780 vty_out(vty
, "}\n");
10783 static int bgp_show_neighbor_vty(struct vty
*vty
, const char *name
,
10784 enum show_type type
, const char *ip_str
,
10789 union sockunion su
;
10790 json_object
*json
= NULL
;
10793 if (strmatch(name
, "all")) {
10794 bgp_show_all_instances_neighbors_vty(vty
, type
, ip_str
,
10796 return CMD_SUCCESS
;
10798 bgp
= bgp_lookup_by_name(name
);
10801 json
= json_object_new_object();
10802 json_object_boolean_true_add(
10803 json
, "bgpNoSuchInstance");
10804 vty_out(vty
, "%s\n",
10805 json_object_to_json_string_ext(
10807 JSON_C_TO_STRING_PRETTY
));
10808 json_object_free(json
);
10811 "%% No such BGP instance exist\n");
10813 return CMD_WARNING
;
10817 bgp
= bgp_get_default();
10821 json
= json_object_new_object();
10823 ret
= str2sockunion(ip_str
, &su
);
10825 bgp_show_neighbor(vty
, bgp
, type
, NULL
, ip_str
,
10828 bgp_show_neighbor(vty
, bgp
, type
, &su
, NULL
,
10831 bgp_show_neighbor(vty
, bgp
, type
, NULL
, NULL
, use_json
,
10834 json_object_free(json
);
10837 return CMD_SUCCESS
;
10840 /* "show [ip] bgp neighbors" commands. */
10841 DEFUN (show_ip_bgp_neighbors
,
10842 show_ip_bgp_neighbors_cmd
,
10843 "show [ip] bgp [<view|vrf> VIEWVRFNAME] [<ipv4|ipv6>] neighbors [<A.B.C.D|X:X::X:X|WORD>] [json]",
10847 BGP_INSTANCE_HELP_STR
10850 "Detailed information on TCP and BGP neighbor connections\n"
10851 "Neighbor to display information about\n"
10852 "Neighbor to display information about\n"
10853 "Neighbor on BGP configured interface\n"
10857 char *sh_arg
= NULL
;
10858 enum show_type sh_type
;
10860 uint8_t uj
= use_json(argc
, argv
);
10864 if (argv_find(argv
, argc
, "view", &idx
)
10865 || argv_find(argv
, argc
, "vrf", &idx
))
10866 vrf
= argv
[idx
+ 1]->arg
;
10869 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)
10870 || argv_find(argv
, argc
, "X:X::X:X", &idx
)
10871 || argv_find(argv
, argc
, "WORD", &idx
)) {
10872 sh_type
= show_peer
;
10873 sh_arg
= argv
[idx
]->arg
;
10875 sh_type
= show_all
;
10877 return bgp_show_neighbor_vty(vty
, vrf
, sh_type
, sh_arg
, uj
);
10880 /* Show BGP's AS paths internal data. There are both `show [ip] bgp
10881 paths' and `show ip mbgp paths'. Those functions results are the
10883 DEFUN (show_ip_bgp_paths
,
10884 show_ip_bgp_paths_cmd
,
10885 "show [ip] bgp ["BGP_SAFI_CMD_STR
"] paths",
10890 "Path information\n")
10892 vty_out(vty
, "Address Refcnt Path\n");
10893 aspath_print_all_vty(vty
);
10894 return CMD_SUCCESS
;
10899 static void community_show_all_iterator(struct hash_backet
*backet
,
10902 struct community
*com
;
10904 com
= (struct community
*)backet
->data
;
10905 vty_out(vty
, "[%p] (%ld) %s\n", (void *)com
, com
->refcnt
,
10906 community_str(com
, false));
10909 /* Show BGP's community internal data. */
10910 DEFUN (show_ip_bgp_community_info
,
10911 show_ip_bgp_community_info_cmd
,
10912 "show [ip] bgp community-info",
10916 "List all bgp community information\n")
10918 vty_out(vty
, "Address Refcnt Community\n");
10920 hash_iterate(community_hash(),
10921 (void (*)(struct hash_backet
*,
10922 void *))community_show_all_iterator
,
10925 return CMD_SUCCESS
;
10928 static void lcommunity_show_all_iterator(struct hash_backet
*backet
,
10931 struct lcommunity
*lcom
;
10933 lcom
= (struct lcommunity
*)backet
->data
;
10934 vty_out(vty
, "[%p] (%ld) %s\n", (void *)lcom
, lcom
->refcnt
,
10935 lcommunity_str(lcom
, false));
10938 /* Show BGP's community internal data. */
10939 DEFUN (show_ip_bgp_lcommunity_info
,
10940 show_ip_bgp_lcommunity_info_cmd
,
10941 "show ip bgp large-community-info",
10945 "List all bgp large-community information\n")
10947 vty_out(vty
, "Address Refcnt Large-community\n");
10949 hash_iterate(lcommunity_hash(),
10950 (void (*)(struct hash_backet
*,
10951 void *))lcommunity_show_all_iterator
,
10954 return CMD_SUCCESS
;
10958 DEFUN (show_ip_bgp_attr_info
,
10959 show_ip_bgp_attr_info_cmd
,
10960 "show [ip] bgp attribute-info",
10964 "List all bgp attribute information\n")
10966 attr_show_all(vty
);
10967 return CMD_SUCCESS
;
10970 static int bgp_show_route_leak_vty(struct vty
*vty
, const char *name
,
10971 afi_t afi
, safi_t safi
)
10974 struct listnode
*node
;
10976 char buf1
[INET6_ADDRSTRLEN
];
10978 vpn_policy_direction_t dir
;
10981 bgp
= bgp_lookup_by_name(name
);
10983 vty_out(vty
, "%% No such BGP instance exist\n");
10984 return CMD_WARNING
;
10987 bgp
= bgp_get_default();
10990 "%% Default BGP instance does not exist\n");
10991 return CMD_WARNING
;
10995 if (!CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
10996 BGP_CONFIG_VRF_TO_VRF_IMPORT
)) {
10998 "This VRF is not importing %s routes from any other VRF\n",
10999 afi_safi_print(afi
, safi
));
11002 "This VRF is importing %s routes from the following VRFs:\n",
11003 afi_safi_print(afi
, safi
));
11004 for (ALL_LIST_ELEMENTS_RO(bgp
->vpn_policy
[afi
].import_vrf
, node
,
11006 vty_out(vty
, " %s\n", vname
);
11008 dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
11009 ecom_str
= ecommunity_ecom2str(
11010 bgp
->vpn_policy
[afi
].rtlist
[dir
],
11011 ECOMMUNITY_FORMAT_ROUTE_MAP
, 0);
11012 vty_out(vty
, "Import RT(s): %s\n", ecom_str
);
11013 XFREE(MTYPE_ECOMMUNITY_STR
, ecom_str
);
11016 if (!CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
11017 BGP_CONFIG_VRF_TO_VRF_EXPORT
)) {
11019 "This VRF is not exporting %s routes to any other VRF\n",
11020 afi_safi_print(afi
, safi
));
11023 "This VRF is exporting %s routes to the following VRFs:\n",
11024 afi_safi_print(afi
, safi
));
11025 for (ALL_LIST_ELEMENTS_RO(bgp
->vpn_policy
[afi
].export_vrf
, node
,
11027 vty_out(vty
, " %s\n", vname
);
11029 vty_out(vty
, "RD: %s\n",
11030 prefix_rd2str(&bgp
->vpn_policy
[afi
].tovpn_rd
,
11031 buf1
, RD_ADDRSTRLEN
));
11032 dir
= BGP_VPN_POLICY_DIR_TOVPN
;
11033 ecom_str
= ecommunity_ecom2str(
11034 bgp
->vpn_policy
[afi
].rtlist
[dir
],
11035 ECOMMUNITY_FORMAT_ROUTE_MAP
, 0);
11036 vty_out(vty
, "Emport RT: %s\n", ecom_str
);
11037 XFREE(MTYPE_ECOMMUNITY_STR
, ecom_str
);
11040 return CMD_SUCCESS
;
11043 /* "show [ip] bgp route-leak" command. */
11044 DEFUN (show_ip_bgp_route_leak
,
11045 show_ip_bgp_route_leak_cmd
,
11046 "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR
" ["BGP_SAFI_CMD_STR
"]] route-leak",
11050 BGP_INSTANCE_HELP_STR
11053 "Route leaking information\n")
11056 afi_t afi
= AFI_MAX
;
11057 safi_t safi
= SAFI_MAX
;
11061 /* show [ip] bgp */
11062 if (argv_find(argv
, argc
, "ip", &idx
)) {
11064 safi
= SAFI_UNICAST
;
11066 /* [vrf VIEWVRFNAME] */
11067 if (argv_find(argv
, argc
, "view", &idx
)) {
11069 "%% This command is not applicable to BGP views\n");
11070 return CMD_WARNING
;
11073 if (argv_find(argv
, argc
, "vrf", &idx
))
11074 vrf
= argv
[++idx
]->arg
;
11075 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
11076 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
)) {
11077 argv_find_and_parse_safi(argv
, argc
, &idx
, &safi
);
11080 if (!((afi
== AFI_IP
|| afi
== AFI_IP6
) && safi
== SAFI_UNICAST
)) {
11082 "%% This command is applicable only for unicast ipv4|ipv6\n");
11083 return CMD_WARNING
;
11086 return bgp_show_route_leak_vty(vty
, vrf
, afi
, safi
);
11089 static void bgp_show_all_instances_updgrps_vty(struct vty
*vty
, afi_t afi
,
11092 struct listnode
*node
, *nnode
;
11095 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
11096 vty_out(vty
, "\nInstance %s:\n",
11097 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
11100 update_group_show(bgp
, afi
, safi
, vty
, 0);
11104 static int bgp_show_update_groups(struct vty
*vty
, const char *name
, int afi
,
11105 int safi
, uint64_t subgrp_id
)
11110 if (strmatch(name
, "all")) {
11111 bgp_show_all_instances_updgrps_vty(vty
, afi
, safi
);
11112 return CMD_SUCCESS
;
11114 bgp
= bgp_lookup_by_name(name
);
11117 bgp
= bgp_get_default();
11121 update_group_show(bgp
, afi
, safi
, vty
, subgrp_id
);
11122 return CMD_SUCCESS
;
11125 DEFUN (show_ip_bgp_updgrps
,
11126 show_ip_bgp_updgrps_cmd
,
11127 "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR
" ["BGP_SAFI_WITH_LABEL_CMD_STR
"]] update-groups [SUBGROUP-ID]",
11131 BGP_INSTANCE_HELP_STR
11133 BGP_SAFI_WITH_LABEL_HELP_STR
11134 "Detailed info about dynamic update groups\n"
11135 "Specific subgroup to display detailed info for\n")
11138 afi_t afi
= AFI_IP6
;
11139 safi_t safi
= SAFI_UNICAST
;
11140 uint64_t subgrp_id
= 0;
11144 /* show [ip] bgp */
11145 if (argv_find(argv
, argc
, "ip", &idx
))
11147 /* [<view|vrf> VIEWVRFNAME] */
11148 if (argv_find(argv
, argc
, "view", &idx
)
11149 || argv_find(argv
, argc
, "vrf", &idx
))
11150 vrf
= argv
[++idx
]->arg
;
11151 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
11152 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
)) {
11153 argv_find_and_parse_safi(argv
, argc
, &idx
, &safi
);
11156 /* get subgroup id, if provided */
11158 if (argv
[idx
]->type
== VARIABLE_TKN
)
11159 subgrp_id
= strtoull(argv
[idx
]->arg
, NULL
, 10);
11161 return (bgp_show_update_groups(vty
, vrf
, afi
, safi
, subgrp_id
));
11164 DEFUN (show_bgp_instance_all_ipv6_updgrps
,
11165 show_bgp_instance_all_ipv6_updgrps_cmd
,
11166 "show [ip] bgp <view|vrf> all update-groups",
11170 BGP_INSTANCE_ALL_HELP_STR
11171 "Detailed info about dynamic update groups\n")
11173 bgp_show_all_instances_updgrps_vty(vty
, AFI_IP6
, SAFI_UNICAST
);
11174 return CMD_SUCCESS
;
11177 DEFUN (show_bgp_updgrps_stats
,
11178 show_bgp_updgrps_stats_cmd
,
11179 "show [ip] bgp update-groups statistics",
11183 "Detailed info about dynamic update groups\n"
11188 bgp
= bgp_get_default();
11190 update_group_show_stats(bgp
, vty
);
11192 return CMD_SUCCESS
;
11195 DEFUN (show_bgp_instance_updgrps_stats
,
11196 show_bgp_instance_updgrps_stats_cmd
,
11197 "show [ip] bgp <view|vrf> VIEWVRFNAME update-groups statistics",
11201 BGP_INSTANCE_HELP_STR
11202 "Detailed info about dynamic update groups\n"
11208 bgp
= bgp_lookup_by_name(argv
[idx_word
]->arg
);
11210 update_group_show_stats(bgp
, vty
);
11212 return CMD_SUCCESS
;
11215 static void show_bgp_updgrps_adj_info_aux(struct vty
*vty
, const char *name
,
11216 afi_t afi
, safi_t safi
,
11217 const char *what
, uint64_t subgrp_id
)
11222 bgp
= bgp_lookup_by_name(name
);
11224 bgp
= bgp_get_default();
11227 if (!strcmp(what
, "advertise-queue"))
11228 update_group_show_adj_queue(bgp
, afi
, safi
, vty
,
11230 else if (!strcmp(what
, "advertised-routes"))
11231 update_group_show_advertised(bgp
, afi
, safi
, vty
,
11233 else if (!strcmp(what
, "packet-queue"))
11234 update_group_show_packet_queue(bgp
, afi
, safi
, vty
,
11239 DEFPY(show_ip_bgp_instance_updgrps_adj_s
,
11240 show_ip_bgp_instance_updgrps_adj_s_cmd
,
11241 "show [ip]$ip bgp [<view|vrf> VIEWVRFNAME$vrf] [<ipv4|ipv6>$afi <unicast|multicast|vpn>$safi] update-groups [SUBGROUP-ID]$sgid <advertise-queue|advertised-routes|packet-queue>$rtq",
11242 SHOW_STR IP_STR BGP_STR BGP_INSTANCE_HELP_STR BGP_AFI_HELP_STR
11244 "Detailed info about dynamic update groups\n"
11245 "Specific subgroup to display info for\n"
11246 "Advertisement queue\n"
11247 "Announced routes\n"
11250 uint64_t subgrp_id
= 0;
11254 subgrp_id
= strtoull(sgid
, NULL
, 10);
11259 afiz
= bgp_vty_afi_from_str(afi
);
11263 afiz
= bgp_vty_afi_from_str(afi
);
11264 if (afiz
!= AFI_IP
)
11266 "%% Cannot specify both 'ip' and 'ipv6'\n");
11267 return CMD_WARNING
;
11270 safiz
= safi
? bgp_vty_safi_from_str(safi
) : SAFI_UNICAST
;
11272 show_bgp_updgrps_adj_info_aux(vty
, vrf
, afiz
, safiz
, rtq
, subgrp_id
);
11273 return CMD_SUCCESS
;
11276 static int bgp_show_one_peer_group(struct vty
*vty
, struct peer_group
*group
)
11278 struct listnode
*node
, *nnode
;
11279 struct prefix
*range
;
11282 char buf
[PREFIX2STR_BUFFER
];
11285 const char *peer_status
;
11286 const char *af_str
;
11291 conf
= group
->conf
;
11293 if (conf
->as_type
== AS_SPECIFIED
|| conf
->as_type
== AS_EXTERNAL
) {
11294 vty_out(vty
, "\nBGP peer-group %s, remote AS %d\n", group
->name
,
11296 } else if (conf
->as_type
== AS_INTERNAL
) {
11297 vty_out(vty
, "\nBGP peer-group %s, remote AS %d\n", group
->name
,
11300 vty_out(vty
, "\nBGP peer-group %s\n", group
->name
);
11303 if ((group
->bgp
->as
== conf
->as
) || (conf
->as_type
== AS_INTERNAL
))
11304 vty_out(vty
, " Peer-group type is internal\n");
11306 vty_out(vty
, " Peer-group type is external\n");
11308 /* Display AFs configured. */
11309 vty_out(vty
, " Configured address-families:");
11310 FOREACH_AFI_SAFI (afi
, safi
) {
11311 if (conf
->afc
[afi
][safi
]) {
11313 vty_out(vty
, " %s;", afi_safi_print(afi
, safi
));
11317 vty_out(vty
, " none\n");
11319 vty_out(vty
, "\n");
11321 /* Display listen ranges (for dynamic neighbors), if any */
11322 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++) {
11325 else if (afi
== AFI_IP6
)
11329 lr_count
= listcount(group
->listen_range
[afi
]);
11331 vty_out(vty
, " %d %s listen range(s)\n", lr_count
,
11335 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], node
,
11337 prefix2str(range
, buf
, sizeof(buf
));
11338 vty_out(vty
, " %s\n", buf
);
11343 /* Display group members and their status */
11344 if (listcount(group
->peer
)) {
11345 vty_out(vty
, " Peer-group members:\n");
11346 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
11347 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_SHUTDOWN
))
11348 peer_status
= "Idle (Admin)";
11349 else if (CHECK_FLAG(peer
->sflags
,
11350 PEER_STATUS_PREFIX_OVERFLOW
))
11351 peer_status
= "Idle (PfxCt)";
11353 peer_status
= lookup_msg(bgp_status_msg
,
11354 peer
->status
, NULL
);
11356 dynamic
= peer_dynamic_neighbor(peer
);
11357 vty_out(vty
, " %s %s %s \n", peer
->host
,
11358 dynamic
? "(dynamic)" : "", peer_status
);
11362 return CMD_SUCCESS
;
11365 static int bgp_show_peer_group_vty(struct vty
*vty
, const char *name
,
11366 const char *group_name
)
11369 struct listnode
*node
, *nnode
;
11370 struct peer_group
*group
;
11371 bool found
= false;
11373 bgp
= name
? bgp_lookup_by_name(name
) : bgp_get_default();
11376 vty_out(vty
, "%% No such BGP instance exists\n");
11377 return CMD_WARNING
;
11380 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
11382 if (strmatch(group
->name
, group_name
)) {
11383 bgp_show_one_peer_group(vty
, group
);
11388 bgp_show_one_peer_group(vty
, group
);
11392 if (group_name
&& !found
)
11393 vty_out(vty
, "%% No such peer-group\n");
11395 return CMD_SUCCESS
;
11398 DEFUN (show_ip_bgp_peer_groups
,
11399 show_ip_bgp_peer_groups_cmd
,
11400 "show [ip] bgp [<view|vrf> VIEWVRFNAME] peer-group [PGNAME]",
11404 BGP_INSTANCE_HELP_STR
11405 "Detailed information on BGP peer groups\n"
11406 "Peer group name\n")
11411 vrf
= argv_find(argv
, argc
, "VIEWVRFNAME", &idx
) ? argv
[idx
]->arg
11413 pg
= argv_find(argv
, argc
, "PGNAME", &idx
) ? argv
[idx
]->arg
: NULL
;
11415 return bgp_show_peer_group_vty(vty
, vrf
, pg
);
11419 /* Redistribute VTY commands. */
11421 DEFUN (bgp_redistribute_ipv4
,
11422 bgp_redistribute_ipv4_cmd
,
11423 "redistribute " FRR_IP_REDIST_STR_BGPD
,
11424 "Redistribute information from another routing protocol\n"
11425 FRR_IP_REDIST_HELP_STR_BGPD
)
11427 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11428 int idx_protocol
= 1;
11431 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
11433 vty_out(vty
, "%% Invalid route type\n");
11434 return CMD_WARNING_CONFIG_FAILED
;
11437 bgp_redist_add(bgp
, AFI_IP
, type
, 0);
11438 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0);
11442 bgp_redistribute_ipv4
, bgp_redistribute_ipv4_hidden_cmd
,
11443 "redistribute " FRR_IP_REDIST_STR_BGPD
,
11444 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
)
11446 DEFUN (bgp_redistribute_ipv4_rmap
,
11447 bgp_redistribute_ipv4_rmap_cmd
,
11448 "redistribute " FRR_IP_REDIST_STR_BGPD
" route-map WORD",
11449 "Redistribute information from another routing protocol\n"
11450 FRR_IP_REDIST_HELP_STR_BGPD
11451 "Route map reference\n"
11452 "Pointer to route-map entries\n")
11454 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11455 int idx_protocol
= 1;
11458 struct bgp_redist
*red
;
11460 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
11462 vty_out(vty
, "%% Invalid route type\n");
11463 return CMD_WARNING_CONFIG_FAILED
;
11466 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
11467 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
);
11468 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0);
11472 bgp_redistribute_ipv4_rmap
, bgp_redistribute_ipv4_rmap_hidden_cmd
,
11473 "redistribute " FRR_IP_REDIST_STR_BGPD
" route-map WORD",
11474 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
11475 "Route map reference\n"
11476 "Pointer to route-map entries\n")
11478 DEFUN (bgp_redistribute_ipv4_metric
,
11479 bgp_redistribute_ipv4_metric_cmd
,
11480 "redistribute " FRR_IP_REDIST_STR_BGPD
" metric (0-4294967295)",
11481 "Redistribute information from another routing protocol\n"
11482 FRR_IP_REDIST_HELP_STR_BGPD
11483 "Metric for redistributed routes\n"
11484 "Default metric\n")
11486 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11487 int idx_protocol
= 1;
11488 int idx_number
= 3;
11491 struct bgp_redist
*red
;
11493 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
11495 vty_out(vty
, "%% Invalid route type\n");
11496 return CMD_WARNING_CONFIG_FAILED
;
11498 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
11500 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
11501 bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, type
, metric
);
11502 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0);
11506 bgp_redistribute_ipv4_metric
, bgp_redistribute_ipv4_metric_hidden_cmd
,
11507 "redistribute " FRR_IP_REDIST_STR_BGPD
" metric (0-4294967295)",
11508 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
11509 "Metric for redistributed routes\n"
11510 "Default metric\n")
11512 DEFUN (bgp_redistribute_ipv4_rmap_metric
,
11513 bgp_redistribute_ipv4_rmap_metric_cmd
,
11514 "redistribute " FRR_IP_REDIST_STR_BGPD
" route-map WORD metric (0-4294967295)",
11515 "Redistribute information from another routing protocol\n"
11516 FRR_IP_REDIST_HELP_STR_BGPD
11517 "Route map reference\n"
11518 "Pointer to route-map entries\n"
11519 "Metric for redistributed routes\n"
11520 "Default metric\n")
11522 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11523 int idx_protocol
= 1;
11525 int idx_number
= 5;
11528 struct bgp_redist
*red
;
11530 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
11532 vty_out(vty
, "%% Invalid route type\n");
11533 return CMD_WARNING_CONFIG_FAILED
;
11535 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
11537 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
11538 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
);
11539 bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, type
, metric
);
11540 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0);
11544 bgp_redistribute_ipv4_rmap_metric
,
11545 bgp_redistribute_ipv4_rmap_metric_hidden_cmd
,
11546 "redistribute " FRR_IP_REDIST_STR_BGPD
11547 " route-map WORD metric (0-4294967295)",
11548 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
11549 "Route map reference\n"
11550 "Pointer to route-map entries\n"
11551 "Metric for redistributed routes\n"
11552 "Default metric\n")
11554 DEFUN (bgp_redistribute_ipv4_metric_rmap
,
11555 bgp_redistribute_ipv4_metric_rmap_cmd
,
11556 "redistribute " FRR_IP_REDIST_STR_BGPD
" metric (0-4294967295) route-map WORD",
11557 "Redistribute information from another routing protocol\n"
11558 FRR_IP_REDIST_HELP_STR_BGPD
11559 "Metric for redistributed routes\n"
11561 "Route map reference\n"
11562 "Pointer to route-map entries\n")
11564 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11565 int idx_protocol
= 1;
11566 int idx_number
= 3;
11570 struct bgp_redist
*red
;
11572 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
11574 vty_out(vty
, "%% Invalid route type\n");
11575 return CMD_WARNING_CONFIG_FAILED
;
11577 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
11579 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
11580 bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, type
, metric
);
11581 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
);
11582 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0);
11586 bgp_redistribute_ipv4_metric_rmap
,
11587 bgp_redistribute_ipv4_metric_rmap_hidden_cmd
,
11588 "redistribute " FRR_IP_REDIST_STR_BGPD
11589 " metric (0-4294967295) route-map WORD",
11590 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
11591 "Metric for redistributed routes\n"
11593 "Route map reference\n"
11594 "Pointer to route-map entries\n")
11596 DEFUN (bgp_redistribute_ipv4_ospf
,
11597 bgp_redistribute_ipv4_ospf_cmd
,
11598 "redistribute <ospf|table> (1-65535)",
11599 "Redistribute information from another routing protocol\n"
11600 "Open Shortest Path First (OSPFv2)\n"
11601 "Non-main Kernel Routing Table\n"
11602 "Instance ID/Table ID\n")
11604 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11605 int idx_ospf_table
= 1;
11606 int idx_number
= 2;
11607 unsigned short instance
;
11608 unsigned short protocol
;
11610 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
11612 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
11613 protocol
= ZEBRA_ROUTE_OSPF
;
11615 protocol
= ZEBRA_ROUTE_TABLE
;
11617 bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
11618 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
);
11621 ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf
, bgp_redistribute_ipv4_ospf_hidden_cmd
,
11622 "redistribute <ospf|table> (1-65535)",
11623 "Redistribute information from another routing protocol\n"
11624 "Open Shortest Path First (OSPFv2)\n"
11625 "Non-main Kernel Routing Table\n"
11626 "Instance ID/Table ID\n")
11628 DEFUN (bgp_redistribute_ipv4_ospf_rmap
,
11629 bgp_redistribute_ipv4_ospf_rmap_cmd
,
11630 "redistribute <ospf|table> (1-65535) route-map WORD",
11631 "Redistribute information from another routing protocol\n"
11632 "Open Shortest Path First (OSPFv2)\n"
11633 "Non-main Kernel Routing Table\n"
11634 "Instance ID/Table ID\n"
11635 "Route map reference\n"
11636 "Pointer to route-map entries\n")
11638 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11639 int idx_ospf_table
= 1;
11640 int idx_number
= 2;
11642 struct bgp_redist
*red
;
11643 unsigned short instance
;
11646 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
11647 protocol
= ZEBRA_ROUTE_OSPF
;
11649 protocol
= ZEBRA_ROUTE_TABLE
;
11651 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
11652 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
11653 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
);
11654 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
);
11657 ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf_rmap
,
11658 bgp_redistribute_ipv4_ospf_rmap_hidden_cmd
,
11659 "redistribute <ospf|table> (1-65535) route-map WORD",
11660 "Redistribute information from another routing protocol\n"
11661 "Open Shortest Path First (OSPFv2)\n"
11662 "Non-main Kernel Routing Table\n"
11663 "Instance ID/Table ID\n"
11664 "Route map reference\n"
11665 "Pointer to route-map entries\n")
11667 DEFUN (bgp_redistribute_ipv4_ospf_metric
,
11668 bgp_redistribute_ipv4_ospf_metric_cmd
,
11669 "redistribute <ospf|table> (1-65535) metric (0-4294967295)",
11670 "Redistribute information from another routing protocol\n"
11671 "Open Shortest Path First (OSPFv2)\n"
11672 "Non-main Kernel Routing Table\n"
11673 "Instance ID/Table ID\n"
11674 "Metric for redistributed routes\n"
11675 "Default metric\n")
11677 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11678 int idx_ospf_table
= 1;
11679 int idx_number
= 2;
11680 int idx_number_2
= 4;
11682 struct bgp_redist
*red
;
11683 unsigned short instance
;
11686 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
11687 protocol
= ZEBRA_ROUTE_OSPF
;
11689 protocol
= ZEBRA_ROUTE_TABLE
;
11691 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
11692 metric
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
11694 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
11695 bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, protocol
, metric
);
11696 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
);
11699 ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf_metric
,
11700 bgp_redistribute_ipv4_ospf_metric_hidden_cmd
,
11701 "redistribute <ospf|table> (1-65535) metric (0-4294967295)",
11702 "Redistribute information from another routing protocol\n"
11703 "Open Shortest Path First (OSPFv2)\n"
11704 "Non-main Kernel Routing Table\n"
11705 "Instance ID/Table ID\n"
11706 "Metric for redistributed routes\n"
11707 "Default metric\n")
11709 DEFUN (bgp_redistribute_ipv4_ospf_rmap_metric
,
11710 bgp_redistribute_ipv4_ospf_rmap_metric_cmd
,
11711 "redistribute <ospf|table> (1-65535) route-map WORD metric (0-4294967295)",
11712 "Redistribute information from another routing protocol\n"
11713 "Open Shortest Path First (OSPFv2)\n"
11714 "Non-main Kernel Routing Table\n"
11715 "Instance ID/Table ID\n"
11716 "Route map reference\n"
11717 "Pointer to route-map entries\n"
11718 "Metric for redistributed routes\n"
11719 "Default metric\n")
11721 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11722 int idx_ospf_table
= 1;
11723 int idx_number
= 2;
11725 int idx_number_2
= 6;
11727 struct bgp_redist
*red
;
11728 unsigned short instance
;
11731 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
11732 protocol
= ZEBRA_ROUTE_OSPF
;
11734 protocol
= ZEBRA_ROUTE_TABLE
;
11736 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
11737 metric
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
11739 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
11740 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
);
11741 bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, protocol
, metric
);
11742 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
);
11746 bgp_redistribute_ipv4_ospf_rmap_metric
,
11747 bgp_redistribute_ipv4_ospf_rmap_metric_hidden_cmd
,
11748 "redistribute <ospf|table> (1-65535) route-map WORD metric (0-4294967295)",
11749 "Redistribute information from another routing protocol\n"
11750 "Open Shortest Path First (OSPFv2)\n"
11751 "Non-main Kernel Routing Table\n"
11752 "Instance ID/Table ID\n"
11753 "Route map reference\n"
11754 "Pointer to route-map entries\n"
11755 "Metric for redistributed routes\n"
11756 "Default metric\n")
11758 DEFUN (bgp_redistribute_ipv4_ospf_metric_rmap
,
11759 bgp_redistribute_ipv4_ospf_metric_rmap_cmd
,
11760 "redistribute <ospf|table> (1-65535) metric (0-4294967295) route-map WORD",
11761 "Redistribute information from another routing protocol\n"
11762 "Open Shortest Path First (OSPFv2)\n"
11763 "Non-main Kernel Routing Table\n"
11764 "Instance ID/Table ID\n"
11765 "Metric for redistributed routes\n"
11767 "Route map reference\n"
11768 "Pointer to route-map entries\n")
11770 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11771 int idx_ospf_table
= 1;
11772 int idx_number
= 2;
11773 int idx_number_2
= 4;
11776 struct bgp_redist
*red
;
11777 unsigned short instance
;
11780 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
11781 protocol
= ZEBRA_ROUTE_OSPF
;
11783 protocol
= ZEBRA_ROUTE_TABLE
;
11785 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
11786 metric
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
11788 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
11789 bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, protocol
, metric
);
11790 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
);
11791 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
);
11795 bgp_redistribute_ipv4_ospf_metric_rmap
,
11796 bgp_redistribute_ipv4_ospf_metric_rmap_hidden_cmd
,
11797 "redistribute <ospf|table> (1-65535) metric (0-4294967295) route-map WORD",
11798 "Redistribute information from another routing protocol\n"
11799 "Open Shortest Path First (OSPFv2)\n"
11800 "Non-main Kernel Routing Table\n"
11801 "Instance ID/Table ID\n"
11802 "Metric for redistributed routes\n"
11804 "Route map reference\n"
11805 "Pointer to route-map entries\n")
11807 DEFUN (no_bgp_redistribute_ipv4_ospf
,
11808 no_bgp_redistribute_ipv4_ospf_cmd
,
11809 "no redistribute <ospf|table> (1-65535) [metric (0-4294967295)] [route-map WORD]",
11811 "Redistribute information from another routing protocol\n"
11812 "Open Shortest Path First (OSPFv2)\n"
11813 "Non-main Kernel Routing Table\n"
11814 "Instance ID/Table ID\n"
11815 "Metric for redistributed routes\n"
11817 "Route map reference\n"
11818 "Pointer to route-map entries\n")
11820 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11821 int idx_ospf_table
= 2;
11822 int idx_number
= 3;
11823 unsigned short instance
;
11826 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
11827 protocol
= ZEBRA_ROUTE_OSPF
;
11829 protocol
= ZEBRA_ROUTE_TABLE
;
11831 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
11832 return bgp_redistribute_unset(bgp
, AFI_IP
, protocol
, instance
);
11836 no_bgp_redistribute_ipv4_ospf
, no_bgp_redistribute_ipv4_ospf_hidden_cmd
,
11837 "no redistribute <ospf|table> (1-65535) [metric (0-4294967295)] [route-map WORD]",
11839 "Redistribute information from another routing protocol\n"
11840 "Open Shortest Path First (OSPFv2)\n"
11841 "Non-main Kernel Routing Table\n"
11842 "Instance ID/Table ID\n"
11843 "Metric for redistributed routes\n"
11845 "Route map reference\n"
11846 "Pointer to route-map entries\n")
11848 DEFUN (no_bgp_redistribute_ipv4
,
11849 no_bgp_redistribute_ipv4_cmd
,
11850 "no redistribute " FRR_IP_REDIST_STR_BGPD
" [metric (0-4294967295)] [route-map WORD]",
11852 "Redistribute information from another routing protocol\n"
11853 FRR_IP_REDIST_HELP_STR_BGPD
11854 "Metric for redistributed routes\n"
11856 "Route map reference\n"
11857 "Pointer to route-map entries\n")
11859 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11860 int idx_protocol
= 2;
11863 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
11865 vty_out(vty
, "%% Invalid route type\n");
11866 return CMD_WARNING_CONFIG_FAILED
;
11868 return bgp_redistribute_unset(bgp
, AFI_IP
, type
, 0);
11872 no_bgp_redistribute_ipv4
, no_bgp_redistribute_ipv4_hidden_cmd
,
11873 "no redistribute " FRR_IP_REDIST_STR_BGPD
11874 " [metric (0-4294967295)] [route-map WORD]",
11876 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
11877 "Metric for redistributed routes\n"
11879 "Route map reference\n"
11880 "Pointer to route-map entries\n")
11882 DEFUN (bgp_redistribute_ipv6
,
11883 bgp_redistribute_ipv6_cmd
,
11884 "redistribute " FRR_IP6_REDIST_STR_BGPD
,
11885 "Redistribute information from another routing protocol\n"
11886 FRR_IP6_REDIST_HELP_STR_BGPD
)
11888 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11889 int idx_protocol
= 1;
11892 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
11894 vty_out(vty
, "%% Invalid route type\n");
11895 return CMD_WARNING_CONFIG_FAILED
;
11898 bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
11899 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0);
11902 DEFUN (bgp_redistribute_ipv6_rmap
,
11903 bgp_redistribute_ipv6_rmap_cmd
,
11904 "redistribute " FRR_IP6_REDIST_STR_BGPD
" route-map WORD",
11905 "Redistribute information from another routing protocol\n"
11906 FRR_IP6_REDIST_HELP_STR_BGPD
11907 "Route map reference\n"
11908 "Pointer to route-map entries\n")
11910 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11911 int idx_protocol
= 1;
11914 struct bgp_redist
*red
;
11916 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
11918 vty_out(vty
, "%% Invalid route type\n");
11919 return CMD_WARNING_CONFIG_FAILED
;
11922 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
11923 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
);
11924 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0);
11927 DEFUN (bgp_redistribute_ipv6_metric
,
11928 bgp_redistribute_ipv6_metric_cmd
,
11929 "redistribute " FRR_IP6_REDIST_STR_BGPD
" metric (0-4294967295)",
11930 "Redistribute information from another routing protocol\n"
11931 FRR_IP6_REDIST_HELP_STR_BGPD
11932 "Metric for redistributed routes\n"
11933 "Default metric\n")
11935 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11936 int idx_protocol
= 1;
11937 int idx_number
= 3;
11940 struct bgp_redist
*red
;
11942 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
11944 vty_out(vty
, "%% Invalid route type\n");
11945 return CMD_WARNING_CONFIG_FAILED
;
11947 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
11949 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
11950 bgp_redistribute_metric_set(bgp
, red
, AFI_IP6
, type
, metric
);
11951 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0);
11954 DEFUN (bgp_redistribute_ipv6_rmap_metric
,
11955 bgp_redistribute_ipv6_rmap_metric_cmd
,
11956 "redistribute " FRR_IP6_REDIST_STR_BGPD
" route-map WORD metric (0-4294967295)",
11957 "Redistribute information from another routing protocol\n"
11958 FRR_IP6_REDIST_HELP_STR_BGPD
11959 "Route map reference\n"
11960 "Pointer to route-map entries\n"
11961 "Metric for redistributed routes\n"
11962 "Default metric\n")
11964 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11965 int idx_protocol
= 1;
11967 int idx_number
= 5;
11970 struct bgp_redist
*red
;
11972 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
11974 vty_out(vty
, "%% Invalid route type\n");
11975 return CMD_WARNING_CONFIG_FAILED
;
11977 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
11979 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
11980 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
);
11981 bgp_redistribute_metric_set(bgp
, red
, AFI_IP6
, type
, metric
);
11982 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0);
11985 DEFUN (bgp_redistribute_ipv6_metric_rmap
,
11986 bgp_redistribute_ipv6_metric_rmap_cmd
,
11987 "redistribute " FRR_IP6_REDIST_STR_BGPD
" metric (0-4294967295) route-map WORD",
11988 "Redistribute information from another routing protocol\n"
11989 FRR_IP6_REDIST_HELP_STR_BGPD
11990 "Metric for redistributed routes\n"
11992 "Route map reference\n"
11993 "Pointer to route-map entries\n")
11995 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11996 int idx_protocol
= 1;
11997 int idx_number
= 3;
12001 struct bgp_redist
*red
;
12003 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
12005 vty_out(vty
, "%% Invalid route type\n");
12006 return CMD_WARNING_CONFIG_FAILED
;
12008 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12010 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
12011 bgp_redistribute_metric_set(bgp
, red
, AFI_IP6
, SAFI_UNICAST
, metric
);
12012 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
);
12013 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0);
12016 DEFUN (no_bgp_redistribute_ipv6
,
12017 no_bgp_redistribute_ipv6_cmd
,
12018 "no redistribute " FRR_IP6_REDIST_STR_BGPD
" [metric (0-4294967295)] [route-map WORD]",
12020 "Redistribute information from another routing protocol\n"
12021 FRR_IP6_REDIST_HELP_STR_BGPD
12022 "Metric for redistributed routes\n"
12024 "Route map reference\n"
12025 "Pointer to route-map entries\n")
12027 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12028 int idx_protocol
= 2;
12031 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
12033 vty_out(vty
, "%% Invalid route type\n");
12034 return CMD_WARNING_CONFIG_FAILED
;
12037 return bgp_redistribute_unset(bgp
, AFI_IP6
, type
, 0);
12040 void bgp_config_write_redistribute(struct vty
*vty
, struct bgp
*bgp
, afi_t afi
,
12045 /* Unicast redistribution only. */
12046 if (safi
!= SAFI_UNICAST
)
12049 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++) {
12050 /* Redistribute BGP does not make sense. */
12051 if (i
!= ZEBRA_ROUTE_BGP
) {
12052 struct list
*red_list
;
12053 struct listnode
*node
;
12054 struct bgp_redist
*red
;
12056 red_list
= bgp
->redist
[afi
][i
];
12060 for (ALL_LIST_ELEMENTS_RO(red_list
, node
, red
)) {
12061 /* "redistribute" configuration. */
12062 vty_out(vty
, " redistribute %s",
12063 zebra_route_string(i
));
12065 vty_out(vty
, " %d", red
->instance
);
12066 if (red
->redist_metric_flag
)
12067 vty_out(vty
, " metric %u",
12068 red
->redist_metric
);
12069 if (red
->rmap
.name
)
12070 vty_out(vty
, " route-map %s",
12072 vty_out(vty
, "\n");
12078 /* This is part of the address-family block (unicast only) */
12079 void bgp_vpn_policy_config_write_afi(struct vty
*vty
, struct bgp
*bgp
,
12084 if (bgp
->vpn_policy
[afi
].rmap_name
[BGP_VPN_POLICY_DIR_FROMVPN
])
12085 vty_out(vty
, "%*simport vrf route-map %s\n", indent
, "",
12086 bgp
->vpn_policy
[afi
]
12087 .rmap_name
[BGP_VPN_POLICY_DIR_FROMVPN
]);
12089 if (CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
12090 BGP_CONFIG_VRF_TO_VRF_IMPORT
)
12091 || CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
12092 BGP_CONFIG_VRF_TO_VRF_EXPORT
))
12095 if (CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
12096 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
)) {
12098 vty_out(vty
, "%*slabel vpn export %s\n", indent
, "", "auto");
12101 if (bgp
->vpn_policy
[afi
].tovpn_label
!= MPLS_LABEL_NONE
) {
12102 vty_out(vty
, "%*slabel vpn export %u\n", indent
, "",
12103 bgp
->vpn_policy
[afi
].tovpn_label
);
12106 if (CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
12107 BGP_VPN_POLICY_TOVPN_RD_SET
)) {
12108 char buf
[RD_ADDRSTRLEN
];
12109 vty_out(vty
, "%*srd vpn export %s\n", indent
, "",
12110 prefix_rd2str(&bgp
->vpn_policy
[afi
].tovpn_rd
, buf
,
12113 if (CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
12114 BGP_VPN_POLICY_TOVPN_NEXTHOP_SET
)) {
12116 char buf
[PREFIX_STRLEN
];
12117 if (inet_ntop(bgp
->vpn_policy
[afi
].tovpn_nexthop
.family
,
12118 &bgp
->vpn_policy
[afi
].tovpn_nexthop
.u
.prefix
, buf
,
12121 vty_out(vty
, "%*snexthop vpn export %s\n",
12125 if (bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
]
12126 && bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
]
12128 bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
],
12129 bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
])) {
12131 char *b
= ecommunity_ecom2str(
12132 bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
],
12133 ECOMMUNITY_FORMAT_ROUTE_MAP
, ECOMMUNITY_ROUTE_TARGET
);
12134 vty_out(vty
, "%*srt vpn both %s\n", indent
, "", b
);
12135 XFREE(MTYPE_ECOMMUNITY_STR
, b
);
12137 if (bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
]) {
12138 char *b
= ecommunity_ecom2str(
12139 bgp
->vpn_policy
[afi
]
12140 .rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
],
12141 ECOMMUNITY_FORMAT_ROUTE_MAP
,
12142 ECOMMUNITY_ROUTE_TARGET
);
12143 vty_out(vty
, "%*srt vpn import %s\n", indent
, "", b
);
12144 XFREE(MTYPE_ECOMMUNITY_STR
, b
);
12146 if (bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
]) {
12147 char *b
= ecommunity_ecom2str(
12148 bgp
->vpn_policy
[afi
]
12149 .rtlist
[BGP_VPN_POLICY_DIR_TOVPN
],
12150 ECOMMUNITY_FORMAT_ROUTE_MAP
,
12151 ECOMMUNITY_ROUTE_TARGET
);
12152 vty_out(vty
, "%*srt vpn export %s\n", indent
, "", b
);
12153 XFREE(MTYPE_ECOMMUNITY_STR
, b
);
12157 if (bgp
->vpn_policy
[afi
].rmap_name
[BGP_VPN_POLICY_DIR_TOVPN
])
12158 vty_out(vty
, "%*sroute-map vpn export %s\n", indent
, "",
12159 bgp
->vpn_policy
[afi
]
12160 .rmap_name
[BGP_VPN_POLICY_DIR_TOVPN
]);
12162 if (bgp
->vpn_policy
[afi
].import_redirect_rtlist
) {
12163 char *b
= ecommunity_ecom2str(
12164 bgp
->vpn_policy
[afi
]
12165 .import_redirect_rtlist
,
12166 ECOMMUNITY_FORMAT_ROUTE_MAP
,
12167 ECOMMUNITY_ROUTE_TARGET
);
12169 vty_out(vty
, "%*srt redirect import %s\n", indent
, "", b
);
12170 XFREE(MTYPE_ECOMMUNITY_STR
, b
);
12175 /* BGP node structure. */
12176 static struct cmd_node bgp_node
= {
12177 BGP_NODE
, "%s(config-router)# ", 1,
12180 static struct cmd_node bgp_ipv4_unicast_node
= {
12181 BGP_IPV4_NODE
, "%s(config-router-af)# ", 1,
12184 static struct cmd_node bgp_ipv4_multicast_node
= {
12185 BGP_IPV4M_NODE
, "%s(config-router-af)# ", 1,
12188 static struct cmd_node bgp_ipv4_labeled_unicast_node
= {
12189 BGP_IPV4L_NODE
, "%s(config-router-af)# ", 1,
12192 static struct cmd_node bgp_ipv6_unicast_node
= {
12193 BGP_IPV6_NODE
, "%s(config-router-af)# ", 1,
12196 static struct cmd_node bgp_ipv6_multicast_node
= {
12197 BGP_IPV6M_NODE
, "%s(config-router-af)# ", 1,
12200 static struct cmd_node bgp_ipv6_labeled_unicast_node
= {
12201 BGP_IPV6L_NODE
, "%s(config-router-af)# ", 1,
12204 static struct cmd_node bgp_vpnv4_node
= {BGP_VPNV4_NODE
,
12205 "%s(config-router-af)# ", 1};
12207 static struct cmd_node bgp_vpnv6_node
= {BGP_VPNV6_NODE
,
12208 "%s(config-router-af-vpnv6)# ", 1};
12210 static struct cmd_node bgp_evpn_node
= {BGP_EVPN_NODE
,
12211 "%s(config-router-evpn)# ", 1};
12213 static struct cmd_node bgp_evpn_vni_node
= {BGP_EVPN_VNI_NODE
,
12214 "%s(config-router-af-vni)# ", 1};
12216 static struct cmd_node bgp_flowspecv4_node
= {BGP_FLOWSPECV4_NODE
,
12217 "%s(config-router-af)# ", 1};
12219 static struct cmd_node bgp_flowspecv6_node
= {BGP_FLOWSPECV6_NODE
,
12220 "%s(config-router-af-vpnv6)# ", 1};
12222 static void community_list_vty(void);
12224 static void bgp_ac_neighbor(vector comps
, struct cmd_token
*token
)
12228 struct listnode
*lnbgp
, *lnpeer
;
12230 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, lnbgp
, bgp
)) {
12231 for (ALL_LIST_ELEMENTS_RO(bgp
->peer
, lnpeer
, peer
)) {
12232 /* only provide suggestions on the appropriate input
12234 * they'll otherwise show up multiple times */
12235 enum cmd_token_type match_type
;
12236 char *name
= peer
->host
;
12238 if (peer
->conf_if
) {
12239 match_type
= VARIABLE_TKN
;
12240 name
= peer
->conf_if
;
12241 } else if (strchr(peer
->host
, ':'))
12242 match_type
= IPV6_TKN
;
12244 match_type
= IPV4_TKN
;
12246 if (token
->type
!= match_type
)
12249 vector_set(comps
, XSTRDUP(MTYPE_COMPLETION
, name
));
12254 static const struct cmd_variable_handler bgp_var_neighbor
[] = {
12255 {.varname
= "neighbor", .completions
= bgp_ac_neighbor
},
12256 {.varname
= "neighbors", .completions
= bgp_ac_neighbor
},
12257 {.varname
= "peer", .completions
= bgp_ac_neighbor
},
12258 {.completions
= NULL
}};
12260 static void bgp_ac_peergroup(vector comps
, struct cmd_token
*token
)
12263 struct peer_group
*group
;
12264 struct listnode
*lnbgp
, *lnpeer
;
12266 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, lnbgp
, bgp
)) {
12267 for (ALL_LIST_ELEMENTS_RO(bgp
->group
, lnpeer
, group
))
12268 vector_set(comps
, XSTRDUP(MTYPE_COMPLETION
,
12273 static const struct cmd_variable_handler bgp_var_peergroup
[] = {
12274 {.tokenname
= "PGNAME", .completions
= bgp_ac_peergroup
},
12275 {.completions
= NULL
} };
12277 void bgp_vty_init(void)
12279 cmd_variable_handler_register(bgp_var_neighbor
);
12280 cmd_variable_handler_register(bgp_var_peergroup
);
12282 /* Install bgp top node. */
12283 install_node(&bgp_node
, bgp_config_write
);
12284 install_node(&bgp_ipv4_unicast_node
, NULL
);
12285 install_node(&bgp_ipv4_multicast_node
, NULL
);
12286 install_node(&bgp_ipv4_labeled_unicast_node
, NULL
);
12287 install_node(&bgp_ipv6_unicast_node
, NULL
);
12288 install_node(&bgp_ipv6_multicast_node
, NULL
);
12289 install_node(&bgp_ipv6_labeled_unicast_node
, NULL
);
12290 install_node(&bgp_vpnv4_node
, NULL
);
12291 install_node(&bgp_vpnv6_node
, NULL
);
12292 install_node(&bgp_evpn_node
, NULL
);
12293 install_node(&bgp_evpn_vni_node
, NULL
);
12294 install_node(&bgp_flowspecv4_node
, NULL
);
12295 install_node(&bgp_flowspecv6_node
, NULL
);
12297 /* Install default VTY commands to new nodes. */
12298 install_default(BGP_NODE
);
12299 install_default(BGP_IPV4_NODE
);
12300 install_default(BGP_IPV4M_NODE
);
12301 install_default(BGP_IPV4L_NODE
);
12302 install_default(BGP_IPV6_NODE
);
12303 install_default(BGP_IPV6M_NODE
);
12304 install_default(BGP_IPV6L_NODE
);
12305 install_default(BGP_VPNV4_NODE
);
12306 install_default(BGP_VPNV6_NODE
);
12307 install_default(BGP_FLOWSPECV4_NODE
);
12308 install_default(BGP_FLOWSPECV6_NODE
);
12309 install_default(BGP_EVPN_NODE
);
12310 install_default(BGP_EVPN_VNI_NODE
);
12312 /* "bgp multiple-instance" commands. */
12313 install_element(CONFIG_NODE
, &bgp_multiple_instance_cmd
);
12314 install_element(CONFIG_NODE
, &no_bgp_multiple_instance_cmd
);
12316 /* "bgp config-type" commands. */
12317 install_element(CONFIG_NODE
, &bgp_config_type_cmd
);
12318 install_element(CONFIG_NODE
, &no_bgp_config_type_cmd
);
12320 /* bgp route-map delay-timer commands. */
12321 install_element(CONFIG_NODE
, &bgp_set_route_map_delay_timer_cmd
);
12322 install_element(CONFIG_NODE
, &no_bgp_set_route_map_delay_timer_cmd
);
12324 /* Dummy commands (Currently not supported) */
12325 install_element(BGP_NODE
, &no_synchronization_cmd
);
12326 install_element(BGP_NODE
, &no_auto_summary_cmd
);
12328 /* "router bgp" commands. */
12329 install_element(CONFIG_NODE
, &router_bgp_cmd
);
12331 /* "no router bgp" commands. */
12332 install_element(CONFIG_NODE
, &no_router_bgp_cmd
);
12334 /* "bgp router-id" commands. */
12335 install_element(BGP_NODE
, &bgp_router_id_cmd
);
12336 install_element(BGP_NODE
, &no_bgp_router_id_cmd
);
12338 /* "bgp cluster-id" commands. */
12339 install_element(BGP_NODE
, &bgp_cluster_id_cmd
);
12340 install_element(BGP_NODE
, &no_bgp_cluster_id_cmd
);
12342 /* "bgp confederation" commands. */
12343 install_element(BGP_NODE
, &bgp_confederation_identifier_cmd
);
12344 install_element(BGP_NODE
, &no_bgp_confederation_identifier_cmd
);
12346 /* "bgp confederation peers" commands. */
12347 install_element(BGP_NODE
, &bgp_confederation_peers_cmd
);
12348 install_element(BGP_NODE
, &no_bgp_confederation_peers_cmd
);
12350 /* bgp max-med command */
12351 install_element(BGP_NODE
, &bgp_maxmed_admin_cmd
);
12352 install_element(BGP_NODE
, &no_bgp_maxmed_admin_cmd
);
12353 install_element(BGP_NODE
, &bgp_maxmed_admin_medv_cmd
);
12354 install_element(BGP_NODE
, &bgp_maxmed_onstartup_cmd
);
12355 install_element(BGP_NODE
, &no_bgp_maxmed_onstartup_cmd
);
12357 /* bgp disable-ebgp-connected-nh-check */
12358 install_element(BGP_NODE
, &bgp_disable_connected_route_check_cmd
);
12359 install_element(BGP_NODE
, &no_bgp_disable_connected_route_check_cmd
);
12361 /* bgp update-delay command */
12362 install_element(BGP_NODE
, &bgp_update_delay_cmd
);
12363 install_element(BGP_NODE
, &no_bgp_update_delay_cmd
);
12364 install_element(BGP_NODE
, &bgp_update_delay_establish_wait_cmd
);
12366 install_element(BGP_NODE
, &bgp_wpkt_quanta_cmd
);
12367 install_element(BGP_NODE
, &no_bgp_wpkt_quanta_cmd
);
12368 install_element(BGP_NODE
, &bgp_rpkt_quanta_cmd
);
12369 install_element(BGP_NODE
, &no_bgp_rpkt_quanta_cmd
);
12371 install_element(BGP_NODE
, &bgp_coalesce_time_cmd
);
12372 install_element(BGP_NODE
, &no_bgp_coalesce_time_cmd
);
12374 /* "maximum-paths" commands. */
12375 install_element(BGP_NODE
, &bgp_maxpaths_hidden_cmd
);
12376 install_element(BGP_NODE
, &no_bgp_maxpaths_hidden_cmd
);
12377 install_element(BGP_IPV4_NODE
, &bgp_maxpaths_cmd
);
12378 install_element(BGP_IPV4_NODE
, &no_bgp_maxpaths_cmd
);
12379 install_element(BGP_IPV6_NODE
, &bgp_maxpaths_cmd
);
12380 install_element(BGP_IPV6_NODE
, &no_bgp_maxpaths_cmd
);
12381 install_element(BGP_NODE
, &bgp_maxpaths_ibgp_hidden_cmd
);
12382 install_element(BGP_NODE
, &bgp_maxpaths_ibgp_cluster_hidden_cmd
);
12383 install_element(BGP_NODE
, &no_bgp_maxpaths_ibgp_hidden_cmd
);
12384 install_element(BGP_IPV4_NODE
, &bgp_maxpaths_ibgp_cmd
);
12385 install_element(BGP_IPV4_NODE
, &bgp_maxpaths_ibgp_cluster_cmd
);
12386 install_element(BGP_IPV4_NODE
, &no_bgp_maxpaths_ibgp_cmd
);
12387 install_element(BGP_IPV6_NODE
, &bgp_maxpaths_ibgp_cmd
);
12388 install_element(BGP_IPV6_NODE
, &bgp_maxpaths_ibgp_cluster_cmd
);
12389 install_element(BGP_IPV6_NODE
, &no_bgp_maxpaths_ibgp_cmd
);
12391 install_element(BGP_IPV6L_NODE
, &bgp_maxpaths_cmd
);
12392 install_element(BGP_IPV6L_NODE
, &no_bgp_maxpaths_cmd
);
12393 install_element(BGP_IPV6L_NODE
, &bgp_maxpaths_ibgp_cmd
);
12394 install_element(BGP_IPV6L_NODE
, &bgp_maxpaths_ibgp_cluster_cmd
);
12395 install_element(BGP_IPV6L_NODE
, &no_bgp_maxpaths_ibgp_cmd
);
12397 /* "timers bgp" commands. */
12398 install_element(BGP_NODE
, &bgp_timers_cmd
);
12399 install_element(BGP_NODE
, &no_bgp_timers_cmd
);
12401 /* route-map delay-timer commands - per instance for backwards compat.
12403 install_element(BGP_NODE
, &bgp_set_route_map_delay_timer_cmd
);
12404 install_element(BGP_NODE
, &no_bgp_set_route_map_delay_timer_cmd
);
12406 /* "bgp client-to-client reflection" commands */
12407 install_element(BGP_NODE
, &no_bgp_client_to_client_reflection_cmd
);
12408 install_element(BGP_NODE
, &bgp_client_to_client_reflection_cmd
);
12410 /* "bgp always-compare-med" commands */
12411 install_element(BGP_NODE
, &bgp_always_compare_med_cmd
);
12412 install_element(BGP_NODE
, &no_bgp_always_compare_med_cmd
);
12414 /* "bgp deterministic-med" commands */
12415 install_element(BGP_NODE
, &bgp_deterministic_med_cmd
);
12416 install_element(BGP_NODE
, &no_bgp_deterministic_med_cmd
);
12418 /* "bgp graceful-restart" commands */
12419 install_element(BGP_NODE
, &bgp_graceful_restart_cmd
);
12420 install_element(BGP_NODE
, &no_bgp_graceful_restart_cmd
);
12421 install_element(BGP_NODE
, &bgp_graceful_restart_stalepath_time_cmd
);
12422 install_element(BGP_NODE
, &no_bgp_graceful_restart_stalepath_time_cmd
);
12423 install_element(BGP_NODE
, &bgp_graceful_restart_restart_time_cmd
);
12424 install_element(BGP_NODE
, &no_bgp_graceful_restart_restart_time_cmd
);
12426 install_element(BGP_NODE
, &bgp_graceful_restart_preserve_fw_cmd
);
12427 install_element(BGP_NODE
, &no_bgp_graceful_restart_preserve_fw_cmd
);
12429 /* "bgp graceful-shutdown" commands */
12430 install_element(BGP_NODE
, &bgp_graceful_shutdown_cmd
);
12431 install_element(BGP_NODE
, &no_bgp_graceful_shutdown_cmd
);
12433 /* "bgp fast-external-failover" commands */
12434 install_element(BGP_NODE
, &bgp_fast_external_failover_cmd
);
12435 install_element(BGP_NODE
, &no_bgp_fast_external_failover_cmd
);
12437 /* "bgp enforce-first-as" commands */
12438 install_element(BGP_NODE
, &bgp_enforce_first_as_cmd
);
12440 /* "bgp bestpath compare-routerid" commands */
12441 install_element(BGP_NODE
, &bgp_bestpath_compare_router_id_cmd
);
12442 install_element(BGP_NODE
, &no_bgp_bestpath_compare_router_id_cmd
);
12444 /* "bgp bestpath as-path ignore" commands */
12445 install_element(BGP_NODE
, &bgp_bestpath_aspath_ignore_cmd
);
12446 install_element(BGP_NODE
, &no_bgp_bestpath_aspath_ignore_cmd
);
12448 /* "bgp bestpath as-path confed" commands */
12449 install_element(BGP_NODE
, &bgp_bestpath_aspath_confed_cmd
);
12450 install_element(BGP_NODE
, &no_bgp_bestpath_aspath_confed_cmd
);
12452 /* "bgp bestpath as-path multipath-relax" commands */
12453 install_element(BGP_NODE
, &bgp_bestpath_aspath_multipath_relax_cmd
);
12454 install_element(BGP_NODE
, &no_bgp_bestpath_aspath_multipath_relax_cmd
);
12456 /* "bgp log-neighbor-changes" commands */
12457 install_element(BGP_NODE
, &bgp_log_neighbor_changes_cmd
);
12458 install_element(BGP_NODE
, &no_bgp_log_neighbor_changes_cmd
);
12460 /* "bgp bestpath med" commands */
12461 install_element(BGP_NODE
, &bgp_bestpath_med_cmd
);
12462 install_element(BGP_NODE
, &no_bgp_bestpath_med_cmd
);
12464 /* "no bgp default ipv4-unicast" commands. */
12465 install_element(BGP_NODE
, &no_bgp_default_ipv4_unicast_cmd
);
12466 install_element(BGP_NODE
, &bgp_default_ipv4_unicast_cmd
);
12468 /* "bgp network import-check" commands. */
12469 install_element(BGP_NODE
, &bgp_network_import_check_cmd
);
12470 install_element(BGP_NODE
, &bgp_network_import_check_exact_cmd
);
12471 install_element(BGP_NODE
, &no_bgp_network_import_check_cmd
);
12473 /* "bgp default local-preference" commands. */
12474 install_element(BGP_NODE
, &bgp_default_local_preference_cmd
);
12475 install_element(BGP_NODE
, &no_bgp_default_local_preference_cmd
);
12477 /* bgp default show-hostname */
12478 install_element(BGP_NODE
, &bgp_default_show_hostname_cmd
);
12479 install_element(BGP_NODE
, &no_bgp_default_show_hostname_cmd
);
12481 /* "bgp default subgroup-pkt-queue-max" commands. */
12482 install_element(BGP_NODE
, &bgp_default_subgroup_pkt_queue_max_cmd
);
12483 install_element(BGP_NODE
, &no_bgp_default_subgroup_pkt_queue_max_cmd
);
12485 /* bgp ibgp-allow-policy-mods command */
12486 install_element(BGP_NODE
, &bgp_rr_allow_outbound_policy_cmd
);
12487 install_element(BGP_NODE
, &no_bgp_rr_allow_outbound_policy_cmd
);
12489 /* "bgp listen limit" commands. */
12490 install_element(BGP_NODE
, &bgp_listen_limit_cmd
);
12491 install_element(BGP_NODE
, &no_bgp_listen_limit_cmd
);
12493 /* "bgp listen range" commands. */
12494 install_element(BGP_NODE
, &bgp_listen_range_cmd
);
12495 install_element(BGP_NODE
, &no_bgp_listen_range_cmd
);
12497 /* "bgp default shutdown" command */
12498 install_element(BGP_NODE
, &bgp_default_shutdown_cmd
);
12500 /* "neighbor remote-as" commands. */
12501 install_element(BGP_NODE
, &neighbor_remote_as_cmd
);
12502 install_element(BGP_NODE
, &neighbor_interface_config_cmd
);
12503 install_element(BGP_NODE
, &neighbor_interface_config_v6only_cmd
);
12504 install_element(BGP_NODE
, &neighbor_interface_config_remote_as_cmd
);
12505 install_element(BGP_NODE
,
12506 &neighbor_interface_v6only_config_remote_as_cmd
);
12507 install_element(BGP_NODE
, &no_neighbor_cmd
);
12508 install_element(BGP_NODE
, &no_neighbor_interface_config_cmd
);
12510 /* "neighbor peer-group" commands. */
12511 install_element(BGP_NODE
, &neighbor_peer_group_cmd
);
12512 install_element(BGP_NODE
, &no_neighbor_peer_group_cmd
);
12513 install_element(BGP_NODE
,
12514 &no_neighbor_interface_peer_group_remote_as_cmd
);
12516 /* "neighbor local-as" commands. */
12517 install_element(BGP_NODE
, &neighbor_local_as_cmd
);
12518 install_element(BGP_NODE
, &neighbor_local_as_no_prepend_cmd
);
12519 install_element(BGP_NODE
, &neighbor_local_as_no_prepend_replace_as_cmd
);
12520 install_element(BGP_NODE
, &no_neighbor_local_as_cmd
);
12522 /* "neighbor solo" commands. */
12523 install_element(BGP_NODE
, &neighbor_solo_cmd
);
12524 install_element(BGP_NODE
, &no_neighbor_solo_cmd
);
12526 /* "neighbor password" commands. */
12527 install_element(BGP_NODE
, &neighbor_password_cmd
);
12528 install_element(BGP_NODE
, &no_neighbor_password_cmd
);
12530 /* "neighbor activate" commands. */
12531 install_element(BGP_NODE
, &neighbor_activate_hidden_cmd
);
12532 install_element(BGP_IPV4_NODE
, &neighbor_activate_cmd
);
12533 install_element(BGP_IPV4M_NODE
, &neighbor_activate_cmd
);
12534 install_element(BGP_IPV4L_NODE
, &neighbor_activate_cmd
);
12535 install_element(BGP_IPV6_NODE
, &neighbor_activate_cmd
);
12536 install_element(BGP_IPV6M_NODE
, &neighbor_activate_cmd
);
12537 install_element(BGP_IPV6L_NODE
, &neighbor_activate_cmd
);
12538 install_element(BGP_VPNV4_NODE
, &neighbor_activate_cmd
);
12539 install_element(BGP_VPNV6_NODE
, &neighbor_activate_cmd
);
12540 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_activate_cmd
);
12541 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_activate_cmd
);
12542 install_element(BGP_EVPN_NODE
, &neighbor_activate_cmd
);
12544 /* "no neighbor activate" commands. */
12545 install_element(BGP_NODE
, &no_neighbor_activate_hidden_cmd
);
12546 install_element(BGP_IPV4_NODE
, &no_neighbor_activate_cmd
);
12547 install_element(BGP_IPV4M_NODE
, &no_neighbor_activate_cmd
);
12548 install_element(BGP_IPV4L_NODE
, &no_neighbor_activate_cmd
);
12549 install_element(BGP_IPV6_NODE
, &no_neighbor_activate_cmd
);
12550 install_element(BGP_IPV6M_NODE
, &no_neighbor_activate_cmd
);
12551 install_element(BGP_IPV6L_NODE
, &no_neighbor_activate_cmd
);
12552 install_element(BGP_VPNV4_NODE
, &no_neighbor_activate_cmd
);
12553 install_element(BGP_VPNV6_NODE
, &no_neighbor_activate_cmd
);
12554 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_activate_cmd
);
12555 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_activate_cmd
);
12556 install_element(BGP_EVPN_NODE
, &no_neighbor_activate_cmd
);
12558 /* "neighbor peer-group" set commands. */
12559 install_element(BGP_NODE
, &neighbor_set_peer_group_cmd
);
12560 install_element(BGP_IPV4_NODE
, &neighbor_set_peer_group_hidden_cmd
);
12561 install_element(BGP_IPV4M_NODE
, &neighbor_set_peer_group_hidden_cmd
);
12562 install_element(BGP_IPV6_NODE
, &neighbor_set_peer_group_hidden_cmd
);
12563 install_element(BGP_IPV6M_NODE
, &neighbor_set_peer_group_hidden_cmd
);
12564 install_element(BGP_IPV6L_NODE
, &neighbor_set_peer_group_hidden_cmd
);
12565 install_element(BGP_VPNV4_NODE
, &neighbor_set_peer_group_hidden_cmd
);
12566 install_element(BGP_VPNV6_NODE
, &neighbor_set_peer_group_hidden_cmd
);
12567 install_element(BGP_FLOWSPECV4_NODE
,
12568 &neighbor_set_peer_group_hidden_cmd
);
12569 install_element(BGP_FLOWSPECV6_NODE
,
12570 &neighbor_set_peer_group_hidden_cmd
);
12572 /* "no neighbor peer-group unset" commands. */
12573 install_element(BGP_NODE
, &no_neighbor_set_peer_group_cmd
);
12574 install_element(BGP_IPV4_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
12575 install_element(BGP_IPV4M_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
12576 install_element(BGP_IPV6_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
12577 install_element(BGP_IPV6M_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
12578 install_element(BGP_IPV6L_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
12579 install_element(BGP_VPNV4_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
12580 install_element(BGP_VPNV6_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
12581 install_element(BGP_FLOWSPECV4_NODE
,
12582 &no_neighbor_set_peer_group_hidden_cmd
);
12583 install_element(BGP_FLOWSPECV6_NODE
,
12584 &no_neighbor_set_peer_group_hidden_cmd
);
12586 /* "neighbor softreconfiguration inbound" commands.*/
12587 install_element(BGP_NODE
, &neighbor_soft_reconfiguration_hidden_cmd
);
12588 install_element(BGP_NODE
, &no_neighbor_soft_reconfiguration_hidden_cmd
);
12589 install_element(BGP_IPV4_NODE
, &neighbor_soft_reconfiguration_cmd
);
12590 install_element(BGP_IPV4_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
12591 install_element(BGP_IPV4L_NODE
, &neighbor_soft_reconfiguration_cmd
);
12592 install_element(BGP_IPV4L_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
12593 install_element(BGP_IPV4M_NODE
, &neighbor_soft_reconfiguration_cmd
);
12594 install_element(BGP_IPV4M_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
12595 install_element(BGP_IPV6_NODE
, &neighbor_soft_reconfiguration_cmd
);
12596 install_element(BGP_IPV6_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
12597 install_element(BGP_IPV6M_NODE
, &neighbor_soft_reconfiguration_cmd
);
12598 install_element(BGP_IPV6M_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
12599 install_element(BGP_IPV6L_NODE
, &neighbor_soft_reconfiguration_cmd
);
12600 install_element(BGP_IPV6L_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
12601 install_element(BGP_VPNV4_NODE
, &neighbor_soft_reconfiguration_cmd
);
12602 install_element(BGP_VPNV4_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
12603 install_element(BGP_VPNV6_NODE
, &neighbor_soft_reconfiguration_cmd
);
12604 install_element(BGP_VPNV6_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
12605 install_element(BGP_FLOWSPECV4_NODE
,
12606 &neighbor_soft_reconfiguration_cmd
);
12607 install_element(BGP_FLOWSPECV4_NODE
,
12608 &no_neighbor_soft_reconfiguration_cmd
);
12609 install_element(BGP_FLOWSPECV6_NODE
,
12610 &neighbor_soft_reconfiguration_cmd
);
12611 install_element(BGP_FLOWSPECV6_NODE
,
12612 &no_neighbor_soft_reconfiguration_cmd
);
12614 /* "neighbor attribute-unchanged" commands. */
12615 install_element(BGP_NODE
, &neighbor_attr_unchanged_hidden_cmd
);
12616 install_element(BGP_NODE
, &no_neighbor_attr_unchanged_hidden_cmd
);
12617 install_element(BGP_IPV4_NODE
, &neighbor_attr_unchanged_cmd
);
12618 install_element(BGP_IPV4_NODE
, &no_neighbor_attr_unchanged_cmd
);
12619 install_element(BGP_IPV4M_NODE
, &neighbor_attr_unchanged_cmd
);
12620 install_element(BGP_IPV4M_NODE
, &no_neighbor_attr_unchanged_cmd
);
12621 install_element(BGP_IPV4L_NODE
, &neighbor_attr_unchanged_cmd
);
12622 install_element(BGP_IPV4L_NODE
, &no_neighbor_attr_unchanged_cmd
);
12623 install_element(BGP_IPV6_NODE
, &neighbor_attr_unchanged_cmd
);
12624 install_element(BGP_IPV6_NODE
, &no_neighbor_attr_unchanged_cmd
);
12625 install_element(BGP_IPV6M_NODE
, &neighbor_attr_unchanged_cmd
);
12626 install_element(BGP_IPV6M_NODE
, &no_neighbor_attr_unchanged_cmd
);
12627 install_element(BGP_IPV6L_NODE
, &neighbor_attr_unchanged_cmd
);
12628 install_element(BGP_IPV6L_NODE
, &no_neighbor_attr_unchanged_cmd
);
12629 install_element(BGP_VPNV4_NODE
, &neighbor_attr_unchanged_cmd
);
12630 install_element(BGP_VPNV4_NODE
, &no_neighbor_attr_unchanged_cmd
);
12631 install_element(BGP_VPNV6_NODE
, &neighbor_attr_unchanged_cmd
);
12632 install_element(BGP_VPNV6_NODE
, &no_neighbor_attr_unchanged_cmd
);
12634 install_element(BGP_EVPN_NODE
, &neighbor_attr_unchanged_cmd
);
12635 install_element(BGP_EVPN_NODE
, &no_neighbor_attr_unchanged_cmd
);
12637 /* "nexthop-local unchanged" commands */
12638 install_element(BGP_IPV6_NODE
, &neighbor_nexthop_local_unchanged_cmd
);
12639 install_element(BGP_IPV6_NODE
,
12640 &no_neighbor_nexthop_local_unchanged_cmd
);
12642 /* "neighbor next-hop-self" commands. */
12643 install_element(BGP_NODE
, &neighbor_nexthop_self_hidden_cmd
);
12644 install_element(BGP_NODE
, &no_neighbor_nexthop_self_hidden_cmd
);
12645 install_element(BGP_IPV4_NODE
, &neighbor_nexthop_self_cmd
);
12646 install_element(BGP_IPV4_NODE
, &no_neighbor_nexthop_self_cmd
);
12647 install_element(BGP_IPV4M_NODE
, &neighbor_nexthop_self_cmd
);
12648 install_element(BGP_IPV4M_NODE
, &no_neighbor_nexthop_self_cmd
);
12649 install_element(BGP_IPV4L_NODE
, &neighbor_nexthop_self_cmd
);
12650 install_element(BGP_IPV4L_NODE
, &no_neighbor_nexthop_self_cmd
);
12651 install_element(BGP_IPV6_NODE
, &neighbor_nexthop_self_cmd
);
12652 install_element(BGP_IPV6_NODE
, &no_neighbor_nexthop_self_cmd
);
12653 install_element(BGP_IPV6M_NODE
, &neighbor_nexthop_self_cmd
);
12654 install_element(BGP_IPV6M_NODE
, &no_neighbor_nexthop_self_cmd
);
12655 install_element(BGP_IPV6L_NODE
, &neighbor_nexthop_self_cmd
);
12656 install_element(BGP_IPV6L_NODE
, &no_neighbor_nexthop_self_cmd
);
12657 install_element(BGP_VPNV4_NODE
, &neighbor_nexthop_self_cmd
);
12658 install_element(BGP_VPNV4_NODE
, &no_neighbor_nexthop_self_cmd
);
12659 install_element(BGP_VPNV6_NODE
, &neighbor_nexthop_self_cmd
);
12660 install_element(BGP_VPNV6_NODE
, &no_neighbor_nexthop_self_cmd
);
12661 install_element(BGP_EVPN_NODE
, &neighbor_nexthop_self_cmd
);
12662 install_element(BGP_EVPN_NODE
, &no_neighbor_nexthop_self_cmd
);
12664 /* "neighbor next-hop-self force" commands. */
12665 install_element(BGP_NODE
, &neighbor_nexthop_self_force_hidden_cmd
);
12666 install_element(BGP_NODE
, &no_neighbor_nexthop_self_force_hidden_cmd
);
12667 install_element(BGP_IPV4_NODE
, &neighbor_nexthop_self_force_cmd
);
12668 install_element(BGP_IPV4_NODE
, &no_neighbor_nexthop_self_force_cmd
);
12669 install_element(BGP_IPV4M_NODE
, &neighbor_nexthop_self_force_cmd
);
12670 install_element(BGP_IPV4M_NODE
, &no_neighbor_nexthop_self_force_cmd
);
12671 install_element(BGP_IPV4L_NODE
, &neighbor_nexthop_self_force_cmd
);
12672 install_element(BGP_IPV4L_NODE
, &no_neighbor_nexthop_self_force_cmd
);
12673 install_element(BGP_IPV6_NODE
, &neighbor_nexthop_self_force_cmd
);
12674 install_element(BGP_IPV6_NODE
, &no_neighbor_nexthop_self_force_cmd
);
12675 install_element(BGP_IPV6M_NODE
, &neighbor_nexthop_self_force_cmd
);
12676 install_element(BGP_IPV6M_NODE
, &no_neighbor_nexthop_self_force_cmd
);
12677 install_element(BGP_IPV6L_NODE
, &neighbor_nexthop_self_force_cmd
);
12678 install_element(BGP_IPV6L_NODE
, &no_neighbor_nexthop_self_force_cmd
);
12679 install_element(BGP_VPNV4_NODE
, &neighbor_nexthop_self_force_cmd
);
12680 install_element(BGP_VPNV4_NODE
, &no_neighbor_nexthop_self_force_cmd
);
12681 install_element(BGP_VPNV6_NODE
, &neighbor_nexthop_self_force_cmd
);
12682 install_element(BGP_VPNV6_NODE
, &no_neighbor_nexthop_self_force_cmd
);
12684 /* "neighbor as-override" commands. */
12685 install_element(BGP_NODE
, &neighbor_as_override_hidden_cmd
);
12686 install_element(BGP_NODE
, &no_neighbor_as_override_hidden_cmd
);
12687 install_element(BGP_IPV4_NODE
, &neighbor_as_override_cmd
);
12688 install_element(BGP_IPV4_NODE
, &no_neighbor_as_override_cmd
);
12689 install_element(BGP_IPV4M_NODE
, &neighbor_as_override_cmd
);
12690 install_element(BGP_IPV4M_NODE
, &no_neighbor_as_override_cmd
);
12691 install_element(BGP_IPV4L_NODE
, &neighbor_as_override_cmd
);
12692 install_element(BGP_IPV4L_NODE
, &no_neighbor_as_override_cmd
);
12693 install_element(BGP_IPV6_NODE
, &neighbor_as_override_cmd
);
12694 install_element(BGP_IPV6_NODE
, &no_neighbor_as_override_cmd
);
12695 install_element(BGP_IPV6M_NODE
, &neighbor_as_override_cmd
);
12696 install_element(BGP_IPV6M_NODE
, &no_neighbor_as_override_cmd
);
12697 install_element(BGP_IPV6L_NODE
, &neighbor_as_override_cmd
);
12698 install_element(BGP_IPV6L_NODE
, &no_neighbor_as_override_cmd
);
12699 install_element(BGP_VPNV4_NODE
, &neighbor_as_override_cmd
);
12700 install_element(BGP_VPNV4_NODE
, &no_neighbor_as_override_cmd
);
12701 install_element(BGP_VPNV6_NODE
, &neighbor_as_override_cmd
);
12702 install_element(BGP_VPNV6_NODE
, &no_neighbor_as_override_cmd
);
12704 /* "neighbor remove-private-AS" commands. */
12705 install_element(BGP_NODE
, &neighbor_remove_private_as_hidden_cmd
);
12706 install_element(BGP_NODE
, &no_neighbor_remove_private_as_hidden_cmd
);
12707 install_element(BGP_NODE
, &neighbor_remove_private_as_all_hidden_cmd
);
12708 install_element(BGP_NODE
,
12709 &no_neighbor_remove_private_as_all_hidden_cmd
);
12710 install_element(BGP_NODE
,
12711 &neighbor_remove_private_as_replace_as_hidden_cmd
);
12712 install_element(BGP_NODE
,
12713 &no_neighbor_remove_private_as_replace_as_hidden_cmd
);
12714 install_element(BGP_NODE
,
12715 &neighbor_remove_private_as_all_replace_as_hidden_cmd
);
12718 &no_neighbor_remove_private_as_all_replace_as_hidden_cmd
);
12719 install_element(BGP_IPV4_NODE
, &neighbor_remove_private_as_cmd
);
12720 install_element(BGP_IPV4_NODE
, &no_neighbor_remove_private_as_cmd
);
12721 install_element(BGP_IPV4_NODE
, &neighbor_remove_private_as_all_cmd
);
12722 install_element(BGP_IPV4_NODE
, &no_neighbor_remove_private_as_all_cmd
);
12723 install_element(BGP_IPV4_NODE
,
12724 &neighbor_remove_private_as_replace_as_cmd
);
12725 install_element(BGP_IPV4_NODE
,
12726 &no_neighbor_remove_private_as_replace_as_cmd
);
12727 install_element(BGP_IPV4_NODE
,
12728 &neighbor_remove_private_as_all_replace_as_cmd
);
12729 install_element(BGP_IPV4_NODE
,
12730 &no_neighbor_remove_private_as_all_replace_as_cmd
);
12731 install_element(BGP_IPV4M_NODE
, &neighbor_remove_private_as_cmd
);
12732 install_element(BGP_IPV4M_NODE
, &no_neighbor_remove_private_as_cmd
);
12733 install_element(BGP_IPV4M_NODE
, &neighbor_remove_private_as_all_cmd
);
12734 install_element(BGP_IPV4M_NODE
, &no_neighbor_remove_private_as_all_cmd
);
12735 install_element(BGP_IPV4M_NODE
,
12736 &neighbor_remove_private_as_replace_as_cmd
);
12737 install_element(BGP_IPV4M_NODE
,
12738 &no_neighbor_remove_private_as_replace_as_cmd
);
12739 install_element(BGP_IPV4M_NODE
,
12740 &neighbor_remove_private_as_all_replace_as_cmd
);
12741 install_element(BGP_IPV4M_NODE
,
12742 &no_neighbor_remove_private_as_all_replace_as_cmd
);
12743 install_element(BGP_IPV4L_NODE
, &neighbor_remove_private_as_cmd
);
12744 install_element(BGP_IPV4L_NODE
, &no_neighbor_remove_private_as_cmd
);
12745 install_element(BGP_IPV4L_NODE
, &neighbor_remove_private_as_all_cmd
);
12746 install_element(BGP_IPV4L_NODE
, &no_neighbor_remove_private_as_all_cmd
);
12747 install_element(BGP_IPV4L_NODE
,
12748 &neighbor_remove_private_as_replace_as_cmd
);
12749 install_element(BGP_IPV4L_NODE
,
12750 &no_neighbor_remove_private_as_replace_as_cmd
);
12751 install_element(BGP_IPV4L_NODE
,
12752 &neighbor_remove_private_as_all_replace_as_cmd
);
12753 install_element(BGP_IPV4L_NODE
,
12754 &no_neighbor_remove_private_as_all_replace_as_cmd
);
12755 install_element(BGP_IPV6_NODE
, &neighbor_remove_private_as_cmd
);
12756 install_element(BGP_IPV6_NODE
, &no_neighbor_remove_private_as_cmd
);
12757 install_element(BGP_IPV6_NODE
, &neighbor_remove_private_as_all_cmd
);
12758 install_element(BGP_IPV6_NODE
, &no_neighbor_remove_private_as_all_cmd
);
12759 install_element(BGP_IPV6_NODE
,
12760 &neighbor_remove_private_as_replace_as_cmd
);
12761 install_element(BGP_IPV6_NODE
,
12762 &no_neighbor_remove_private_as_replace_as_cmd
);
12763 install_element(BGP_IPV6_NODE
,
12764 &neighbor_remove_private_as_all_replace_as_cmd
);
12765 install_element(BGP_IPV6_NODE
,
12766 &no_neighbor_remove_private_as_all_replace_as_cmd
);
12767 install_element(BGP_IPV6M_NODE
, &neighbor_remove_private_as_cmd
);
12768 install_element(BGP_IPV6M_NODE
, &no_neighbor_remove_private_as_cmd
);
12769 install_element(BGP_IPV6M_NODE
, &neighbor_remove_private_as_all_cmd
);
12770 install_element(BGP_IPV6M_NODE
, &no_neighbor_remove_private_as_all_cmd
);
12771 install_element(BGP_IPV6M_NODE
,
12772 &neighbor_remove_private_as_replace_as_cmd
);
12773 install_element(BGP_IPV6M_NODE
,
12774 &no_neighbor_remove_private_as_replace_as_cmd
);
12775 install_element(BGP_IPV6M_NODE
,
12776 &neighbor_remove_private_as_all_replace_as_cmd
);
12777 install_element(BGP_IPV6M_NODE
,
12778 &no_neighbor_remove_private_as_all_replace_as_cmd
);
12779 install_element(BGP_IPV6L_NODE
, &neighbor_remove_private_as_cmd
);
12780 install_element(BGP_IPV6L_NODE
, &no_neighbor_remove_private_as_cmd
);
12781 install_element(BGP_IPV6L_NODE
, &neighbor_remove_private_as_all_cmd
);
12782 install_element(BGP_IPV6L_NODE
, &no_neighbor_remove_private_as_all_cmd
);
12783 install_element(BGP_IPV6L_NODE
,
12784 &neighbor_remove_private_as_replace_as_cmd
);
12785 install_element(BGP_IPV6L_NODE
,
12786 &no_neighbor_remove_private_as_replace_as_cmd
);
12787 install_element(BGP_IPV6L_NODE
,
12788 &neighbor_remove_private_as_all_replace_as_cmd
);
12789 install_element(BGP_IPV6L_NODE
,
12790 &no_neighbor_remove_private_as_all_replace_as_cmd
);
12791 install_element(BGP_VPNV4_NODE
, &neighbor_remove_private_as_cmd
);
12792 install_element(BGP_VPNV4_NODE
, &no_neighbor_remove_private_as_cmd
);
12793 install_element(BGP_VPNV4_NODE
, &neighbor_remove_private_as_all_cmd
);
12794 install_element(BGP_VPNV4_NODE
, &no_neighbor_remove_private_as_all_cmd
);
12795 install_element(BGP_VPNV4_NODE
,
12796 &neighbor_remove_private_as_replace_as_cmd
);
12797 install_element(BGP_VPNV4_NODE
,
12798 &no_neighbor_remove_private_as_replace_as_cmd
);
12799 install_element(BGP_VPNV4_NODE
,
12800 &neighbor_remove_private_as_all_replace_as_cmd
);
12801 install_element(BGP_VPNV4_NODE
,
12802 &no_neighbor_remove_private_as_all_replace_as_cmd
);
12803 install_element(BGP_VPNV6_NODE
, &neighbor_remove_private_as_cmd
);
12804 install_element(BGP_VPNV6_NODE
, &no_neighbor_remove_private_as_cmd
);
12805 install_element(BGP_VPNV6_NODE
, &neighbor_remove_private_as_all_cmd
);
12806 install_element(BGP_VPNV6_NODE
, &no_neighbor_remove_private_as_all_cmd
);
12807 install_element(BGP_VPNV6_NODE
,
12808 &neighbor_remove_private_as_replace_as_cmd
);
12809 install_element(BGP_VPNV6_NODE
,
12810 &no_neighbor_remove_private_as_replace_as_cmd
);
12811 install_element(BGP_VPNV6_NODE
,
12812 &neighbor_remove_private_as_all_replace_as_cmd
);
12813 install_element(BGP_VPNV6_NODE
,
12814 &no_neighbor_remove_private_as_all_replace_as_cmd
);
12816 /* "neighbor send-community" commands.*/
12817 install_element(BGP_NODE
, &neighbor_send_community_hidden_cmd
);
12818 install_element(BGP_NODE
, &neighbor_send_community_type_hidden_cmd
);
12819 install_element(BGP_NODE
, &no_neighbor_send_community_hidden_cmd
);
12820 install_element(BGP_NODE
, &no_neighbor_send_community_type_hidden_cmd
);
12821 install_element(BGP_IPV4_NODE
, &neighbor_send_community_cmd
);
12822 install_element(BGP_IPV4_NODE
, &neighbor_send_community_type_cmd
);
12823 install_element(BGP_IPV4_NODE
, &no_neighbor_send_community_cmd
);
12824 install_element(BGP_IPV4_NODE
, &no_neighbor_send_community_type_cmd
);
12825 install_element(BGP_IPV4M_NODE
, &neighbor_send_community_cmd
);
12826 install_element(BGP_IPV4M_NODE
, &neighbor_send_community_type_cmd
);
12827 install_element(BGP_IPV4M_NODE
, &no_neighbor_send_community_cmd
);
12828 install_element(BGP_IPV4M_NODE
, &no_neighbor_send_community_type_cmd
);
12829 install_element(BGP_IPV4L_NODE
, &neighbor_send_community_cmd
);
12830 install_element(BGP_IPV4L_NODE
, &neighbor_send_community_type_cmd
);
12831 install_element(BGP_IPV4L_NODE
, &no_neighbor_send_community_cmd
);
12832 install_element(BGP_IPV4L_NODE
, &no_neighbor_send_community_type_cmd
);
12833 install_element(BGP_IPV6_NODE
, &neighbor_send_community_cmd
);
12834 install_element(BGP_IPV6_NODE
, &neighbor_send_community_type_cmd
);
12835 install_element(BGP_IPV6_NODE
, &no_neighbor_send_community_cmd
);
12836 install_element(BGP_IPV6_NODE
, &no_neighbor_send_community_type_cmd
);
12837 install_element(BGP_IPV6M_NODE
, &neighbor_send_community_cmd
);
12838 install_element(BGP_IPV6M_NODE
, &neighbor_send_community_type_cmd
);
12839 install_element(BGP_IPV6M_NODE
, &no_neighbor_send_community_cmd
);
12840 install_element(BGP_IPV6M_NODE
, &no_neighbor_send_community_type_cmd
);
12841 install_element(BGP_IPV6L_NODE
, &neighbor_send_community_cmd
);
12842 install_element(BGP_IPV6L_NODE
, &neighbor_send_community_type_cmd
);
12843 install_element(BGP_IPV6L_NODE
, &no_neighbor_send_community_cmd
);
12844 install_element(BGP_IPV6L_NODE
, &no_neighbor_send_community_type_cmd
);
12845 install_element(BGP_VPNV4_NODE
, &neighbor_send_community_cmd
);
12846 install_element(BGP_VPNV4_NODE
, &neighbor_send_community_type_cmd
);
12847 install_element(BGP_VPNV4_NODE
, &no_neighbor_send_community_cmd
);
12848 install_element(BGP_VPNV4_NODE
, &no_neighbor_send_community_type_cmd
);
12849 install_element(BGP_VPNV6_NODE
, &neighbor_send_community_cmd
);
12850 install_element(BGP_VPNV6_NODE
, &neighbor_send_community_type_cmd
);
12851 install_element(BGP_VPNV6_NODE
, &no_neighbor_send_community_cmd
);
12852 install_element(BGP_VPNV6_NODE
, &no_neighbor_send_community_type_cmd
);
12854 /* "neighbor route-reflector" commands.*/
12855 install_element(BGP_NODE
, &neighbor_route_reflector_client_hidden_cmd
);
12856 install_element(BGP_NODE
,
12857 &no_neighbor_route_reflector_client_hidden_cmd
);
12858 install_element(BGP_IPV4_NODE
, &neighbor_route_reflector_client_cmd
);
12859 install_element(BGP_IPV4_NODE
, &no_neighbor_route_reflector_client_cmd
);
12860 install_element(BGP_IPV4M_NODE
, &neighbor_route_reflector_client_cmd
);
12861 install_element(BGP_IPV4M_NODE
,
12862 &no_neighbor_route_reflector_client_cmd
);
12863 install_element(BGP_IPV4L_NODE
, &neighbor_route_reflector_client_cmd
);
12864 install_element(BGP_IPV4L_NODE
,
12865 &no_neighbor_route_reflector_client_cmd
);
12866 install_element(BGP_IPV6_NODE
, &neighbor_route_reflector_client_cmd
);
12867 install_element(BGP_IPV6_NODE
, &no_neighbor_route_reflector_client_cmd
);
12868 install_element(BGP_IPV6M_NODE
, &neighbor_route_reflector_client_cmd
);
12869 install_element(BGP_IPV6M_NODE
,
12870 &no_neighbor_route_reflector_client_cmd
);
12871 install_element(BGP_IPV6L_NODE
, &neighbor_route_reflector_client_cmd
);
12872 install_element(BGP_IPV6L_NODE
,
12873 &no_neighbor_route_reflector_client_cmd
);
12874 install_element(BGP_VPNV4_NODE
, &neighbor_route_reflector_client_cmd
);
12875 install_element(BGP_VPNV4_NODE
,
12876 &no_neighbor_route_reflector_client_cmd
);
12877 install_element(BGP_VPNV6_NODE
, &neighbor_route_reflector_client_cmd
);
12878 install_element(BGP_VPNV6_NODE
,
12879 &no_neighbor_route_reflector_client_cmd
);
12880 install_element(BGP_FLOWSPECV4_NODE
,
12881 &neighbor_route_reflector_client_cmd
);
12882 install_element(BGP_FLOWSPECV4_NODE
,
12883 &no_neighbor_route_reflector_client_cmd
);
12884 install_element(BGP_FLOWSPECV6_NODE
,
12885 &neighbor_route_reflector_client_cmd
);
12886 install_element(BGP_FLOWSPECV6_NODE
,
12887 &no_neighbor_route_reflector_client_cmd
);
12888 install_element(BGP_EVPN_NODE
, &neighbor_route_reflector_client_cmd
);
12889 install_element(BGP_EVPN_NODE
, &no_neighbor_route_reflector_client_cmd
);
12891 /* "neighbor route-server" commands.*/
12892 install_element(BGP_NODE
, &neighbor_route_server_client_hidden_cmd
);
12893 install_element(BGP_NODE
, &no_neighbor_route_server_client_hidden_cmd
);
12894 install_element(BGP_IPV4_NODE
, &neighbor_route_server_client_cmd
);
12895 install_element(BGP_IPV4_NODE
, &no_neighbor_route_server_client_cmd
);
12896 install_element(BGP_IPV4M_NODE
, &neighbor_route_server_client_cmd
);
12897 install_element(BGP_IPV4M_NODE
, &no_neighbor_route_server_client_cmd
);
12898 install_element(BGP_IPV4L_NODE
, &neighbor_route_server_client_cmd
);
12899 install_element(BGP_IPV4L_NODE
, &no_neighbor_route_server_client_cmd
);
12900 install_element(BGP_IPV6_NODE
, &neighbor_route_server_client_cmd
);
12901 install_element(BGP_IPV6_NODE
, &no_neighbor_route_server_client_cmd
);
12902 install_element(BGP_IPV6M_NODE
, &neighbor_route_server_client_cmd
);
12903 install_element(BGP_IPV6M_NODE
, &no_neighbor_route_server_client_cmd
);
12904 install_element(BGP_IPV6L_NODE
, &neighbor_route_server_client_cmd
);
12905 install_element(BGP_IPV6L_NODE
, &no_neighbor_route_server_client_cmd
);
12906 install_element(BGP_VPNV4_NODE
, &neighbor_route_server_client_cmd
);
12907 install_element(BGP_VPNV4_NODE
, &no_neighbor_route_server_client_cmd
);
12908 install_element(BGP_VPNV6_NODE
, &neighbor_route_server_client_cmd
);
12909 install_element(BGP_VPNV6_NODE
, &no_neighbor_route_server_client_cmd
);
12910 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_route_server_client_cmd
);
12911 install_element(BGP_FLOWSPECV4_NODE
,
12912 &no_neighbor_route_server_client_cmd
);
12913 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_route_server_client_cmd
);
12914 install_element(BGP_FLOWSPECV6_NODE
,
12915 &no_neighbor_route_server_client_cmd
);
12917 /* "neighbor addpath-tx-all-paths" commands.*/
12918 install_element(BGP_NODE
, &neighbor_addpath_tx_all_paths_hidden_cmd
);
12919 install_element(BGP_NODE
, &no_neighbor_addpath_tx_all_paths_hidden_cmd
);
12920 install_element(BGP_IPV4_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
12921 install_element(BGP_IPV4_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
12922 install_element(BGP_IPV4M_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
12923 install_element(BGP_IPV4M_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
12924 install_element(BGP_IPV4L_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
12925 install_element(BGP_IPV4L_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
12926 install_element(BGP_IPV6_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
12927 install_element(BGP_IPV6_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
12928 install_element(BGP_IPV6M_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
12929 install_element(BGP_IPV6M_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
12930 install_element(BGP_IPV6L_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
12931 install_element(BGP_IPV6L_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
12932 install_element(BGP_VPNV4_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
12933 install_element(BGP_VPNV4_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
12934 install_element(BGP_VPNV6_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
12935 install_element(BGP_VPNV6_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
12937 /* "neighbor addpath-tx-bestpath-per-AS" commands.*/
12938 install_element(BGP_NODE
,
12939 &neighbor_addpath_tx_bestpath_per_as_hidden_cmd
);
12940 install_element(BGP_NODE
,
12941 &no_neighbor_addpath_tx_bestpath_per_as_hidden_cmd
);
12942 install_element(BGP_IPV4_NODE
,
12943 &neighbor_addpath_tx_bestpath_per_as_cmd
);
12944 install_element(BGP_IPV4_NODE
,
12945 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
12946 install_element(BGP_IPV4M_NODE
,
12947 &neighbor_addpath_tx_bestpath_per_as_cmd
);
12948 install_element(BGP_IPV4M_NODE
,
12949 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
12950 install_element(BGP_IPV4L_NODE
,
12951 &neighbor_addpath_tx_bestpath_per_as_cmd
);
12952 install_element(BGP_IPV4L_NODE
,
12953 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
12954 install_element(BGP_IPV6_NODE
,
12955 &neighbor_addpath_tx_bestpath_per_as_cmd
);
12956 install_element(BGP_IPV6_NODE
,
12957 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
12958 install_element(BGP_IPV6M_NODE
,
12959 &neighbor_addpath_tx_bestpath_per_as_cmd
);
12960 install_element(BGP_IPV6M_NODE
,
12961 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
12962 install_element(BGP_IPV6L_NODE
,
12963 &neighbor_addpath_tx_bestpath_per_as_cmd
);
12964 install_element(BGP_IPV6L_NODE
,
12965 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
12966 install_element(BGP_VPNV4_NODE
,
12967 &neighbor_addpath_tx_bestpath_per_as_cmd
);
12968 install_element(BGP_VPNV4_NODE
,
12969 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
12970 install_element(BGP_VPNV6_NODE
,
12971 &neighbor_addpath_tx_bestpath_per_as_cmd
);
12972 install_element(BGP_VPNV6_NODE
,
12973 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
12975 /* "neighbor passive" commands. */
12976 install_element(BGP_NODE
, &neighbor_passive_cmd
);
12977 install_element(BGP_NODE
, &no_neighbor_passive_cmd
);
12980 /* "neighbor shutdown" commands. */
12981 install_element(BGP_NODE
, &neighbor_shutdown_cmd
);
12982 install_element(BGP_NODE
, &no_neighbor_shutdown_cmd
);
12983 install_element(BGP_NODE
, &neighbor_shutdown_msg_cmd
);
12984 install_element(BGP_NODE
, &no_neighbor_shutdown_msg_cmd
);
12986 /* "neighbor capability extended-nexthop" commands.*/
12987 install_element(BGP_NODE
, &neighbor_capability_enhe_cmd
);
12988 install_element(BGP_NODE
, &no_neighbor_capability_enhe_cmd
);
12990 /* "neighbor capability orf prefix-list" commands.*/
12991 install_element(BGP_NODE
, &neighbor_capability_orf_prefix_hidden_cmd
);
12992 install_element(BGP_NODE
,
12993 &no_neighbor_capability_orf_prefix_hidden_cmd
);
12994 install_element(BGP_IPV4_NODE
, &neighbor_capability_orf_prefix_cmd
);
12995 install_element(BGP_IPV4_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
12996 install_element(BGP_IPV4M_NODE
, &neighbor_capability_orf_prefix_cmd
);
12997 install_element(BGP_IPV4M_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
12998 install_element(BGP_IPV4L_NODE
, &neighbor_capability_orf_prefix_cmd
);
12999 install_element(BGP_IPV4L_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
13000 install_element(BGP_IPV6_NODE
, &neighbor_capability_orf_prefix_cmd
);
13001 install_element(BGP_IPV6_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
13002 install_element(BGP_IPV6M_NODE
, &neighbor_capability_orf_prefix_cmd
);
13003 install_element(BGP_IPV6M_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
13004 install_element(BGP_IPV6L_NODE
, &neighbor_capability_orf_prefix_cmd
);
13005 install_element(BGP_IPV6L_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
13007 /* "neighbor capability dynamic" commands.*/
13008 install_element(BGP_NODE
, &neighbor_capability_dynamic_cmd
);
13009 install_element(BGP_NODE
, &no_neighbor_capability_dynamic_cmd
);
13011 /* "neighbor dont-capability-negotiate" commands. */
13012 install_element(BGP_NODE
, &neighbor_dont_capability_negotiate_cmd
);
13013 install_element(BGP_NODE
, &no_neighbor_dont_capability_negotiate_cmd
);
13015 /* "neighbor ebgp-multihop" commands. */
13016 install_element(BGP_NODE
, &neighbor_ebgp_multihop_cmd
);
13017 install_element(BGP_NODE
, &neighbor_ebgp_multihop_ttl_cmd
);
13018 install_element(BGP_NODE
, &no_neighbor_ebgp_multihop_cmd
);
13020 /* "neighbor disable-connected-check" commands. */
13021 install_element(BGP_NODE
, &neighbor_disable_connected_check_cmd
);
13022 install_element(BGP_NODE
, &no_neighbor_disable_connected_check_cmd
);
13024 /* "neighbor enforce-first-as" commands. */
13025 install_element(BGP_NODE
, &neighbor_enforce_first_as_cmd
);
13026 install_element(BGP_NODE
, &no_neighbor_enforce_first_as_cmd
);
13028 /* "neighbor description" commands. */
13029 install_element(BGP_NODE
, &neighbor_description_cmd
);
13030 install_element(BGP_NODE
, &no_neighbor_description_cmd
);
13031 install_element(BGP_NODE
, &no_neighbor_description_comment_cmd
);
13033 /* "neighbor update-source" commands. "*/
13034 install_element(BGP_NODE
, &neighbor_update_source_cmd
);
13035 install_element(BGP_NODE
, &no_neighbor_update_source_cmd
);
13037 /* "neighbor default-originate" commands. */
13038 install_element(BGP_NODE
, &neighbor_default_originate_hidden_cmd
);
13039 install_element(BGP_NODE
, &neighbor_default_originate_rmap_hidden_cmd
);
13040 install_element(BGP_NODE
, &no_neighbor_default_originate_hidden_cmd
);
13041 install_element(BGP_IPV4_NODE
, &neighbor_default_originate_cmd
);
13042 install_element(BGP_IPV4_NODE
, &neighbor_default_originate_rmap_cmd
);
13043 install_element(BGP_IPV4_NODE
, &no_neighbor_default_originate_cmd
);
13044 install_element(BGP_IPV4M_NODE
, &neighbor_default_originate_cmd
);
13045 install_element(BGP_IPV4M_NODE
, &neighbor_default_originate_rmap_cmd
);
13046 install_element(BGP_IPV4M_NODE
, &no_neighbor_default_originate_cmd
);
13047 install_element(BGP_IPV4L_NODE
, &neighbor_default_originate_cmd
);
13048 install_element(BGP_IPV4L_NODE
, &neighbor_default_originate_rmap_cmd
);
13049 install_element(BGP_IPV4L_NODE
, &no_neighbor_default_originate_cmd
);
13050 install_element(BGP_IPV6_NODE
, &neighbor_default_originate_cmd
);
13051 install_element(BGP_IPV6_NODE
, &neighbor_default_originate_rmap_cmd
);
13052 install_element(BGP_IPV6_NODE
, &no_neighbor_default_originate_cmd
);
13053 install_element(BGP_IPV6M_NODE
, &neighbor_default_originate_cmd
);
13054 install_element(BGP_IPV6M_NODE
, &neighbor_default_originate_rmap_cmd
);
13055 install_element(BGP_IPV6M_NODE
, &no_neighbor_default_originate_cmd
);
13056 install_element(BGP_IPV6L_NODE
, &neighbor_default_originate_cmd
);
13057 install_element(BGP_IPV6L_NODE
, &neighbor_default_originate_rmap_cmd
);
13058 install_element(BGP_IPV6L_NODE
, &no_neighbor_default_originate_cmd
);
13060 /* "neighbor port" commands. */
13061 install_element(BGP_NODE
, &neighbor_port_cmd
);
13062 install_element(BGP_NODE
, &no_neighbor_port_cmd
);
13064 /* "neighbor weight" commands. */
13065 install_element(BGP_NODE
, &neighbor_weight_hidden_cmd
);
13066 install_element(BGP_NODE
, &no_neighbor_weight_hidden_cmd
);
13068 install_element(BGP_IPV4_NODE
, &neighbor_weight_cmd
);
13069 install_element(BGP_IPV4_NODE
, &no_neighbor_weight_cmd
);
13070 install_element(BGP_IPV4M_NODE
, &neighbor_weight_cmd
);
13071 install_element(BGP_IPV4M_NODE
, &no_neighbor_weight_cmd
);
13072 install_element(BGP_IPV4L_NODE
, &neighbor_weight_cmd
);
13073 install_element(BGP_IPV4L_NODE
, &no_neighbor_weight_cmd
);
13074 install_element(BGP_IPV6_NODE
, &neighbor_weight_cmd
);
13075 install_element(BGP_IPV6_NODE
, &no_neighbor_weight_cmd
);
13076 install_element(BGP_IPV6M_NODE
, &neighbor_weight_cmd
);
13077 install_element(BGP_IPV6M_NODE
, &no_neighbor_weight_cmd
);
13078 install_element(BGP_IPV6L_NODE
, &neighbor_weight_cmd
);
13079 install_element(BGP_IPV6L_NODE
, &no_neighbor_weight_cmd
);
13080 install_element(BGP_VPNV4_NODE
, &neighbor_weight_cmd
);
13081 install_element(BGP_VPNV4_NODE
, &no_neighbor_weight_cmd
);
13082 install_element(BGP_VPNV6_NODE
, &neighbor_weight_cmd
);
13083 install_element(BGP_VPNV6_NODE
, &no_neighbor_weight_cmd
);
13085 /* "neighbor override-capability" commands. */
13086 install_element(BGP_NODE
, &neighbor_override_capability_cmd
);
13087 install_element(BGP_NODE
, &no_neighbor_override_capability_cmd
);
13089 /* "neighbor strict-capability-match" commands. */
13090 install_element(BGP_NODE
, &neighbor_strict_capability_cmd
);
13091 install_element(BGP_NODE
, &no_neighbor_strict_capability_cmd
);
13093 /* "neighbor timers" commands. */
13094 install_element(BGP_NODE
, &neighbor_timers_cmd
);
13095 install_element(BGP_NODE
, &no_neighbor_timers_cmd
);
13097 /* "neighbor timers connect" commands. */
13098 install_element(BGP_NODE
, &neighbor_timers_connect_cmd
);
13099 install_element(BGP_NODE
, &no_neighbor_timers_connect_cmd
);
13101 /* "neighbor advertisement-interval" commands. */
13102 install_element(BGP_NODE
, &neighbor_advertise_interval_cmd
);
13103 install_element(BGP_NODE
, &no_neighbor_advertise_interval_cmd
);
13105 /* "neighbor interface" commands. */
13106 install_element(BGP_NODE
, &neighbor_interface_cmd
);
13107 install_element(BGP_NODE
, &no_neighbor_interface_cmd
);
13109 /* "neighbor distribute" commands. */
13110 install_element(BGP_NODE
, &neighbor_distribute_list_hidden_cmd
);
13111 install_element(BGP_NODE
, &no_neighbor_distribute_list_hidden_cmd
);
13112 install_element(BGP_IPV4_NODE
, &neighbor_distribute_list_cmd
);
13113 install_element(BGP_IPV4_NODE
, &no_neighbor_distribute_list_cmd
);
13114 install_element(BGP_IPV4M_NODE
, &neighbor_distribute_list_cmd
);
13115 install_element(BGP_IPV4M_NODE
, &no_neighbor_distribute_list_cmd
);
13116 install_element(BGP_IPV4L_NODE
, &neighbor_distribute_list_cmd
);
13117 install_element(BGP_IPV4L_NODE
, &no_neighbor_distribute_list_cmd
);
13118 install_element(BGP_IPV6_NODE
, &neighbor_distribute_list_cmd
);
13119 install_element(BGP_IPV6_NODE
, &no_neighbor_distribute_list_cmd
);
13120 install_element(BGP_IPV6M_NODE
, &neighbor_distribute_list_cmd
);
13121 install_element(BGP_IPV6M_NODE
, &no_neighbor_distribute_list_cmd
);
13122 install_element(BGP_IPV6L_NODE
, &neighbor_distribute_list_cmd
);
13123 install_element(BGP_IPV6L_NODE
, &no_neighbor_distribute_list_cmd
);
13124 install_element(BGP_VPNV4_NODE
, &neighbor_distribute_list_cmd
);
13125 install_element(BGP_VPNV4_NODE
, &no_neighbor_distribute_list_cmd
);
13126 install_element(BGP_VPNV6_NODE
, &neighbor_distribute_list_cmd
);
13127 install_element(BGP_VPNV6_NODE
, &no_neighbor_distribute_list_cmd
);
13129 /* "neighbor prefix-list" commands. */
13130 install_element(BGP_NODE
, &neighbor_prefix_list_hidden_cmd
);
13131 install_element(BGP_NODE
, &no_neighbor_prefix_list_hidden_cmd
);
13132 install_element(BGP_IPV4_NODE
, &neighbor_prefix_list_cmd
);
13133 install_element(BGP_IPV4_NODE
, &no_neighbor_prefix_list_cmd
);
13134 install_element(BGP_IPV4M_NODE
, &neighbor_prefix_list_cmd
);
13135 install_element(BGP_IPV4M_NODE
, &no_neighbor_prefix_list_cmd
);
13136 install_element(BGP_IPV4L_NODE
, &neighbor_prefix_list_cmd
);
13137 install_element(BGP_IPV4L_NODE
, &no_neighbor_prefix_list_cmd
);
13138 install_element(BGP_IPV6_NODE
, &neighbor_prefix_list_cmd
);
13139 install_element(BGP_IPV6_NODE
, &no_neighbor_prefix_list_cmd
);
13140 install_element(BGP_IPV6M_NODE
, &neighbor_prefix_list_cmd
);
13141 install_element(BGP_IPV6M_NODE
, &no_neighbor_prefix_list_cmd
);
13142 install_element(BGP_IPV6L_NODE
, &neighbor_prefix_list_cmd
);
13143 install_element(BGP_IPV6L_NODE
, &no_neighbor_prefix_list_cmd
);
13144 install_element(BGP_VPNV4_NODE
, &neighbor_prefix_list_cmd
);
13145 install_element(BGP_VPNV4_NODE
, &no_neighbor_prefix_list_cmd
);
13146 install_element(BGP_VPNV6_NODE
, &neighbor_prefix_list_cmd
);
13147 install_element(BGP_VPNV6_NODE
, &no_neighbor_prefix_list_cmd
);
13148 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_prefix_list_cmd
);
13149 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_prefix_list_cmd
);
13150 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_prefix_list_cmd
);
13151 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_prefix_list_cmd
);
13153 /* "neighbor filter-list" commands. */
13154 install_element(BGP_NODE
, &neighbor_filter_list_hidden_cmd
);
13155 install_element(BGP_NODE
, &no_neighbor_filter_list_hidden_cmd
);
13156 install_element(BGP_IPV4_NODE
, &neighbor_filter_list_cmd
);
13157 install_element(BGP_IPV4_NODE
, &no_neighbor_filter_list_cmd
);
13158 install_element(BGP_IPV4M_NODE
, &neighbor_filter_list_cmd
);
13159 install_element(BGP_IPV4M_NODE
, &no_neighbor_filter_list_cmd
);
13160 install_element(BGP_IPV4L_NODE
, &neighbor_filter_list_cmd
);
13161 install_element(BGP_IPV4L_NODE
, &no_neighbor_filter_list_cmd
);
13162 install_element(BGP_IPV6_NODE
, &neighbor_filter_list_cmd
);
13163 install_element(BGP_IPV6_NODE
, &no_neighbor_filter_list_cmd
);
13164 install_element(BGP_IPV6M_NODE
, &neighbor_filter_list_cmd
);
13165 install_element(BGP_IPV6M_NODE
, &no_neighbor_filter_list_cmd
);
13166 install_element(BGP_IPV6L_NODE
, &neighbor_filter_list_cmd
);
13167 install_element(BGP_IPV6L_NODE
, &no_neighbor_filter_list_cmd
);
13168 install_element(BGP_VPNV4_NODE
, &neighbor_filter_list_cmd
);
13169 install_element(BGP_VPNV4_NODE
, &no_neighbor_filter_list_cmd
);
13170 install_element(BGP_VPNV6_NODE
, &neighbor_filter_list_cmd
);
13171 install_element(BGP_VPNV6_NODE
, &no_neighbor_filter_list_cmd
);
13172 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_filter_list_cmd
);
13173 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_filter_list_cmd
);
13174 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_filter_list_cmd
);
13175 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_filter_list_cmd
);
13177 /* "neighbor route-map" commands. */
13178 install_element(BGP_NODE
, &neighbor_route_map_hidden_cmd
);
13179 install_element(BGP_NODE
, &no_neighbor_route_map_hidden_cmd
);
13180 install_element(BGP_IPV4_NODE
, &neighbor_route_map_cmd
);
13181 install_element(BGP_IPV4_NODE
, &no_neighbor_route_map_cmd
);
13182 install_element(BGP_IPV4M_NODE
, &neighbor_route_map_cmd
);
13183 install_element(BGP_IPV4M_NODE
, &no_neighbor_route_map_cmd
);
13184 install_element(BGP_IPV4L_NODE
, &neighbor_route_map_cmd
);
13185 install_element(BGP_IPV4L_NODE
, &no_neighbor_route_map_cmd
);
13186 install_element(BGP_IPV6_NODE
, &neighbor_route_map_cmd
);
13187 install_element(BGP_IPV6_NODE
, &no_neighbor_route_map_cmd
);
13188 install_element(BGP_IPV6M_NODE
, &neighbor_route_map_cmd
);
13189 install_element(BGP_IPV6M_NODE
, &no_neighbor_route_map_cmd
);
13190 install_element(BGP_IPV6L_NODE
, &neighbor_route_map_cmd
);
13191 install_element(BGP_IPV6L_NODE
, &no_neighbor_route_map_cmd
);
13192 install_element(BGP_VPNV4_NODE
, &neighbor_route_map_cmd
);
13193 install_element(BGP_VPNV4_NODE
, &no_neighbor_route_map_cmd
);
13194 install_element(BGP_VPNV6_NODE
, &neighbor_route_map_cmd
);
13195 install_element(BGP_VPNV6_NODE
, &no_neighbor_route_map_cmd
);
13196 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_route_map_cmd
);
13197 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_route_map_cmd
);
13198 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_route_map_cmd
);
13199 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_route_map_cmd
);
13200 install_element(BGP_EVPN_NODE
, &neighbor_route_map_cmd
);
13201 install_element(BGP_EVPN_NODE
, &no_neighbor_route_map_cmd
);
13203 /* "neighbor unsuppress-map" commands. */
13204 install_element(BGP_NODE
, &neighbor_unsuppress_map_hidden_cmd
);
13205 install_element(BGP_NODE
, &no_neighbor_unsuppress_map_hidden_cmd
);
13206 install_element(BGP_IPV4_NODE
, &neighbor_unsuppress_map_cmd
);
13207 install_element(BGP_IPV4_NODE
, &no_neighbor_unsuppress_map_cmd
);
13208 install_element(BGP_IPV4M_NODE
, &neighbor_unsuppress_map_cmd
);
13209 install_element(BGP_IPV4M_NODE
, &no_neighbor_unsuppress_map_cmd
);
13210 install_element(BGP_IPV4L_NODE
, &neighbor_unsuppress_map_cmd
);
13211 install_element(BGP_IPV4L_NODE
, &no_neighbor_unsuppress_map_cmd
);
13212 install_element(BGP_IPV6_NODE
, &neighbor_unsuppress_map_cmd
);
13213 install_element(BGP_IPV6_NODE
, &no_neighbor_unsuppress_map_cmd
);
13214 install_element(BGP_IPV6M_NODE
, &neighbor_unsuppress_map_cmd
);
13215 install_element(BGP_IPV6M_NODE
, &no_neighbor_unsuppress_map_cmd
);
13216 install_element(BGP_IPV6L_NODE
, &neighbor_unsuppress_map_cmd
);
13217 install_element(BGP_IPV6L_NODE
, &no_neighbor_unsuppress_map_cmd
);
13218 install_element(BGP_VPNV4_NODE
, &neighbor_unsuppress_map_cmd
);
13219 install_element(BGP_VPNV4_NODE
, &no_neighbor_unsuppress_map_cmd
);
13220 install_element(BGP_VPNV6_NODE
, &neighbor_unsuppress_map_cmd
);
13221 install_element(BGP_VPNV6_NODE
, &no_neighbor_unsuppress_map_cmd
);
13223 /* "neighbor maximum-prefix" commands. */
13224 install_element(BGP_NODE
, &neighbor_maximum_prefix_hidden_cmd
);
13225 install_element(BGP_NODE
,
13226 &neighbor_maximum_prefix_threshold_hidden_cmd
);
13227 install_element(BGP_NODE
, &neighbor_maximum_prefix_warning_hidden_cmd
);
13228 install_element(BGP_NODE
,
13229 &neighbor_maximum_prefix_threshold_warning_hidden_cmd
);
13230 install_element(BGP_NODE
, &neighbor_maximum_prefix_restart_hidden_cmd
);
13231 install_element(BGP_NODE
,
13232 &neighbor_maximum_prefix_threshold_restart_hidden_cmd
);
13233 install_element(BGP_NODE
, &no_neighbor_maximum_prefix_hidden_cmd
);
13234 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_cmd
);
13235 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13236 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13237 install_element(BGP_IPV4_NODE
,
13238 &neighbor_maximum_prefix_threshold_warning_cmd
);
13239 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13240 install_element(BGP_IPV4_NODE
,
13241 &neighbor_maximum_prefix_threshold_restart_cmd
);
13242 install_element(BGP_IPV4_NODE
, &no_neighbor_maximum_prefix_cmd
);
13243 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_cmd
);
13244 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13245 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13246 install_element(BGP_IPV4M_NODE
,
13247 &neighbor_maximum_prefix_threshold_warning_cmd
);
13248 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13249 install_element(BGP_IPV4M_NODE
,
13250 &neighbor_maximum_prefix_threshold_restart_cmd
);
13251 install_element(BGP_IPV4M_NODE
, &no_neighbor_maximum_prefix_cmd
);
13252 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_cmd
);
13253 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13254 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13255 install_element(BGP_IPV4L_NODE
,
13256 &neighbor_maximum_prefix_threshold_warning_cmd
);
13257 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13258 install_element(BGP_IPV4L_NODE
,
13259 &neighbor_maximum_prefix_threshold_restart_cmd
);
13260 install_element(BGP_IPV4L_NODE
, &no_neighbor_maximum_prefix_cmd
);
13261 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_cmd
);
13262 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13263 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13264 install_element(BGP_IPV6_NODE
,
13265 &neighbor_maximum_prefix_threshold_warning_cmd
);
13266 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13267 install_element(BGP_IPV6_NODE
,
13268 &neighbor_maximum_prefix_threshold_restart_cmd
);
13269 install_element(BGP_IPV6_NODE
, &no_neighbor_maximum_prefix_cmd
);
13270 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_cmd
);
13271 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13272 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13273 install_element(BGP_IPV6M_NODE
,
13274 &neighbor_maximum_prefix_threshold_warning_cmd
);
13275 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13276 install_element(BGP_IPV6M_NODE
,
13277 &neighbor_maximum_prefix_threshold_restart_cmd
);
13278 install_element(BGP_IPV6M_NODE
, &no_neighbor_maximum_prefix_cmd
);
13279 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_cmd
);
13280 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13281 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13282 install_element(BGP_IPV6L_NODE
,
13283 &neighbor_maximum_prefix_threshold_warning_cmd
);
13284 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13285 install_element(BGP_IPV6L_NODE
,
13286 &neighbor_maximum_prefix_threshold_restart_cmd
);
13287 install_element(BGP_IPV6L_NODE
, &no_neighbor_maximum_prefix_cmd
);
13288 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_cmd
);
13289 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13290 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13291 install_element(BGP_VPNV4_NODE
,
13292 &neighbor_maximum_prefix_threshold_warning_cmd
);
13293 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13294 install_element(BGP_VPNV4_NODE
,
13295 &neighbor_maximum_prefix_threshold_restart_cmd
);
13296 install_element(BGP_VPNV4_NODE
, &no_neighbor_maximum_prefix_cmd
);
13297 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_cmd
);
13298 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13299 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13300 install_element(BGP_VPNV6_NODE
,
13301 &neighbor_maximum_prefix_threshold_warning_cmd
);
13302 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13303 install_element(BGP_VPNV6_NODE
,
13304 &neighbor_maximum_prefix_threshold_restart_cmd
);
13305 install_element(BGP_VPNV6_NODE
, &no_neighbor_maximum_prefix_cmd
);
13307 /* "neighbor allowas-in" */
13308 install_element(BGP_NODE
, &neighbor_allowas_in_hidden_cmd
);
13309 install_element(BGP_NODE
, &no_neighbor_allowas_in_hidden_cmd
);
13310 install_element(BGP_IPV4_NODE
, &neighbor_allowas_in_cmd
);
13311 install_element(BGP_IPV4_NODE
, &no_neighbor_allowas_in_cmd
);
13312 install_element(BGP_IPV4M_NODE
, &neighbor_allowas_in_cmd
);
13313 install_element(BGP_IPV4M_NODE
, &no_neighbor_allowas_in_cmd
);
13314 install_element(BGP_IPV4L_NODE
, &neighbor_allowas_in_cmd
);
13315 install_element(BGP_IPV4L_NODE
, &no_neighbor_allowas_in_cmd
);
13316 install_element(BGP_IPV6_NODE
, &neighbor_allowas_in_cmd
);
13317 install_element(BGP_IPV6_NODE
, &no_neighbor_allowas_in_cmd
);
13318 install_element(BGP_IPV6M_NODE
, &neighbor_allowas_in_cmd
);
13319 install_element(BGP_IPV6M_NODE
, &no_neighbor_allowas_in_cmd
);
13320 install_element(BGP_IPV6L_NODE
, &neighbor_allowas_in_cmd
);
13321 install_element(BGP_IPV6L_NODE
, &no_neighbor_allowas_in_cmd
);
13322 install_element(BGP_VPNV4_NODE
, &neighbor_allowas_in_cmd
);
13323 install_element(BGP_VPNV4_NODE
, &no_neighbor_allowas_in_cmd
);
13324 install_element(BGP_VPNV6_NODE
, &neighbor_allowas_in_cmd
);
13325 install_element(BGP_VPNV6_NODE
, &no_neighbor_allowas_in_cmd
);
13326 install_element(BGP_EVPN_NODE
, &neighbor_allowas_in_cmd
);
13327 install_element(BGP_EVPN_NODE
, &no_neighbor_allowas_in_cmd
);
13329 /* address-family commands. */
13330 install_element(BGP_NODE
, &address_family_ipv4_safi_cmd
);
13331 install_element(BGP_NODE
, &address_family_ipv6_safi_cmd
);
13332 #ifdef KEEP_OLD_VPN_COMMANDS
13333 install_element(BGP_NODE
, &address_family_vpnv4_cmd
);
13334 install_element(BGP_NODE
, &address_family_vpnv6_cmd
);
13335 #endif /* KEEP_OLD_VPN_COMMANDS */
13337 install_element(BGP_NODE
, &address_family_evpn_cmd
);
13339 /* "exit-address-family" command. */
13340 install_element(BGP_IPV4_NODE
, &exit_address_family_cmd
);
13341 install_element(BGP_IPV4M_NODE
, &exit_address_family_cmd
);
13342 install_element(BGP_IPV4L_NODE
, &exit_address_family_cmd
);
13343 install_element(BGP_IPV6_NODE
, &exit_address_family_cmd
);
13344 install_element(BGP_IPV6M_NODE
, &exit_address_family_cmd
);
13345 install_element(BGP_IPV6L_NODE
, &exit_address_family_cmd
);
13346 install_element(BGP_VPNV4_NODE
, &exit_address_family_cmd
);
13347 install_element(BGP_VPNV6_NODE
, &exit_address_family_cmd
);
13348 install_element(BGP_FLOWSPECV4_NODE
, &exit_address_family_cmd
);
13349 install_element(BGP_FLOWSPECV6_NODE
, &exit_address_family_cmd
);
13350 install_element(BGP_EVPN_NODE
, &exit_address_family_cmd
);
13352 /* "clear ip bgp commands" */
13353 install_element(ENABLE_NODE
, &clear_ip_bgp_all_cmd
);
13355 /* clear ip bgp prefix */
13356 install_element(ENABLE_NODE
, &clear_ip_bgp_prefix_cmd
);
13357 install_element(ENABLE_NODE
, &clear_bgp_ipv6_safi_prefix_cmd
);
13358 install_element(ENABLE_NODE
, &clear_bgp_instance_ipv6_safi_prefix_cmd
);
13360 /* "show [ip] bgp summary" commands. */
13361 install_element(VIEW_NODE
, &show_bgp_instance_all_ipv6_updgrps_cmd
);
13362 install_element(VIEW_NODE
, &show_bgp_instance_updgrps_stats_cmd
);
13363 install_element(VIEW_NODE
, &show_bgp_updgrps_stats_cmd
);
13364 install_element(VIEW_NODE
, &show_ip_bgp_instance_updgrps_adj_s_cmd
);
13365 install_element(VIEW_NODE
, &show_ip_bgp_summary_cmd
);
13366 install_element(VIEW_NODE
, &show_ip_bgp_updgrps_cmd
);
13368 /* "show [ip] bgp neighbors" commands. */
13369 install_element(VIEW_NODE
, &show_ip_bgp_neighbors_cmd
);
13371 /* "show [ip] bgp peer-group" commands. */
13372 install_element(VIEW_NODE
, &show_ip_bgp_peer_groups_cmd
);
13374 /* "show [ip] bgp paths" commands. */
13375 install_element(VIEW_NODE
, &show_ip_bgp_paths_cmd
);
13377 /* "show [ip] bgp community" commands. */
13378 install_element(VIEW_NODE
, &show_ip_bgp_community_info_cmd
);
13380 /* "show ip bgp large-community" commands. */
13381 install_element(VIEW_NODE
, &show_ip_bgp_lcommunity_info_cmd
);
13382 /* "show [ip] bgp attribute-info" commands. */
13383 install_element(VIEW_NODE
, &show_ip_bgp_attr_info_cmd
);
13384 /* "show [ip] bgp route-leak" command */
13385 install_element(VIEW_NODE
, &show_ip_bgp_route_leak_cmd
);
13387 /* "redistribute" commands. */
13388 install_element(BGP_NODE
, &bgp_redistribute_ipv4_hidden_cmd
);
13389 install_element(BGP_NODE
, &no_bgp_redistribute_ipv4_hidden_cmd
);
13390 install_element(BGP_NODE
, &bgp_redistribute_ipv4_rmap_hidden_cmd
);
13391 install_element(BGP_NODE
, &bgp_redistribute_ipv4_metric_hidden_cmd
);
13392 install_element(BGP_NODE
,
13393 &bgp_redistribute_ipv4_rmap_metric_hidden_cmd
);
13394 install_element(BGP_NODE
,
13395 &bgp_redistribute_ipv4_metric_rmap_hidden_cmd
);
13396 install_element(BGP_NODE
, &bgp_redistribute_ipv4_ospf_hidden_cmd
);
13397 install_element(BGP_NODE
, &no_bgp_redistribute_ipv4_ospf_hidden_cmd
);
13398 install_element(BGP_NODE
, &bgp_redistribute_ipv4_ospf_rmap_hidden_cmd
);
13399 install_element(BGP_NODE
,
13400 &bgp_redistribute_ipv4_ospf_metric_hidden_cmd
);
13401 install_element(BGP_NODE
,
13402 &bgp_redistribute_ipv4_ospf_rmap_metric_hidden_cmd
);
13403 install_element(BGP_NODE
,
13404 &bgp_redistribute_ipv4_ospf_metric_rmap_hidden_cmd
);
13405 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_cmd
);
13406 install_element(BGP_IPV4_NODE
, &no_bgp_redistribute_ipv4_cmd
);
13407 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_rmap_cmd
);
13408 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_metric_cmd
);
13409 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_rmap_metric_cmd
);
13410 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_metric_rmap_cmd
);
13411 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_ospf_cmd
);
13412 install_element(BGP_IPV4_NODE
, &no_bgp_redistribute_ipv4_ospf_cmd
);
13413 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_ospf_rmap_cmd
);
13414 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_ospf_metric_cmd
);
13415 install_element(BGP_IPV4_NODE
,
13416 &bgp_redistribute_ipv4_ospf_rmap_metric_cmd
);
13417 install_element(BGP_IPV4_NODE
,
13418 &bgp_redistribute_ipv4_ospf_metric_rmap_cmd
);
13419 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_cmd
);
13420 install_element(BGP_IPV6_NODE
, &no_bgp_redistribute_ipv6_cmd
);
13421 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_rmap_cmd
);
13422 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_metric_cmd
);
13423 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_rmap_metric_cmd
);
13424 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_metric_rmap_cmd
);
13426 /* import|export vpn [route-map WORD] */
13427 install_element(BGP_IPV4_NODE
, &bgp_imexport_vpn_cmd
);
13428 install_element(BGP_IPV6_NODE
, &bgp_imexport_vpn_cmd
);
13430 install_element(BGP_IPV4_NODE
, &bgp_imexport_vrf_cmd
);
13431 install_element(BGP_IPV6_NODE
, &bgp_imexport_vrf_cmd
);
13433 /* ttl_security commands */
13434 install_element(BGP_NODE
, &neighbor_ttl_security_cmd
);
13435 install_element(BGP_NODE
, &no_neighbor_ttl_security_cmd
);
13437 /* "show [ip] bgp memory" commands. */
13438 install_element(VIEW_NODE
, &show_bgp_memory_cmd
);
13440 /* "show bgp martian next-hop" */
13441 install_element(VIEW_NODE
, &show_bgp_martian_nexthop_db_cmd
);
13443 /* "show [ip] bgp views" commands. */
13444 install_element(VIEW_NODE
, &show_bgp_views_cmd
);
13446 /* "show [ip] bgp vrfs" commands. */
13447 install_element(VIEW_NODE
, &show_bgp_vrfs_cmd
);
13449 /* Community-list. */
13450 community_list_vty();
13452 /* vpn-policy commands */
13453 install_element(BGP_IPV4_NODE
, &af_rd_vpn_export_cmd
);
13454 install_element(BGP_IPV6_NODE
, &af_rd_vpn_export_cmd
);
13455 install_element(BGP_IPV4_NODE
, &af_label_vpn_export_cmd
);
13456 install_element(BGP_IPV6_NODE
, &af_label_vpn_export_cmd
);
13457 install_element(BGP_IPV4_NODE
, &af_nexthop_vpn_export_cmd
);
13458 install_element(BGP_IPV6_NODE
, &af_nexthop_vpn_export_cmd
);
13459 install_element(BGP_IPV4_NODE
, &af_rt_vpn_imexport_cmd
);
13460 install_element(BGP_IPV6_NODE
, &af_rt_vpn_imexport_cmd
);
13461 install_element(BGP_IPV4_NODE
, &af_route_map_vpn_imexport_cmd
);
13462 install_element(BGP_IPV6_NODE
, &af_route_map_vpn_imexport_cmd
);
13463 install_element(BGP_IPV4_NODE
, &af_import_vrf_route_map_cmd
);
13464 install_element(BGP_IPV6_NODE
, &af_import_vrf_route_map_cmd
);
13466 install_element(BGP_IPV4_NODE
, &af_routetarget_import_cmd
);
13467 install_element(BGP_IPV6_NODE
, &af_routetarget_import_cmd
);
13469 install_element(BGP_IPV4_NODE
, &af_no_rd_vpn_export_cmd
);
13470 install_element(BGP_IPV6_NODE
, &af_no_rd_vpn_export_cmd
);
13471 install_element(BGP_IPV4_NODE
, &af_no_label_vpn_export_cmd
);
13472 install_element(BGP_IPV6_NODE
, &af_no_label_vpn_export_cmd
);
13473 install_element(BGP_IPV4_NODE
, &af_no_nexthop_vpn_export_cmd
);
13474 install_element(BGP_IPV6_NODE
, &af_no_nexthop_vpn_export_cmd
);
13475 install_element(BGP_IPV4_NODE
, &af_no_rt_vpn_imexport_cmd
);
13476 install_element(BGP_IPV6_NODE
, &af_no_rt_vpn_imexport_cmd
);
13477 install_element(BGP_IPV4_NODE
, &af_no_route_map_vpn_imexport_cmd
);
13478 install_element(BGP_IPV6_NODE
, &af_no_route_map_vpn_imexport_cmd
);
13479 install_element(BGP_IPV4_NODE
, &af_no_import_vrf_route_map_cmd
);
13480 install_element(BGP_IPV6_NODE
, &af_no_import_vrf_route_map_cmd
);
13483 #include "memory.h"
13484 #include "bgp_regex.h"
13485 #include "bgp_clist.h"
13486 #include "bgp_ecommunity.h"
13488 /* VTY functions. */
13490 /* Direction value to string conversion. */
13491 static const char *community_direct_str(int direct
)
13494 case COMMUNITY_DENY
:
13496 case COMMUNITY_PERMIT
:
13503 /* Display error string. */
13504 static void community_list_perror(struct vty
*vty
, int ret
)
13507 case COMMUNITY_LIST_ERR_CANT_FIND_LIST
:
13508 vty_out(vty
, "%% Can't find community-list\n");
13510 case COMMUNITY_LIST_ERR_MALFORMED_VAL
:
13511 vty_out(vty
, "%% Malformed community-list value\n");
13513 case COMMUNITY_LIST_ERR_STANDARD_CONFLICT
:
13515 "%% Community name conflict, previously defined as standard community\n");
13517 case COMMUNITY_LIST_ERR_EXPANDED_CONFLICT
:
13519 "%% Community name conflict, previously defined as expanded community\n");
13524 /* "community-list" keyword help string. */
13525 #define COMMUNITY_LIST_STR "Add a community list entry\n"
13527 /* ip community-list standard */
13528 DEFUN (ip_community_list_standard
,
13529 ip_community_list_standard_cmd
,
13530 "ip community-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
13533 "Community list number (standard)\n"
13534 "Add an standard community-list entry\n"
13535 "Community list name\n"
13536 "Specify community to reject\n"
13537 "Specify community to accept\n"
13540 char *cl_name_or_number
= NULL
;
13542 int style
= COMMUNITY_LIST_STANDARD
;
13545 argv_find(argv
, argc
, "(1-99)", &idx
);
13546 argv_find(argv
, argc
, "WORD", &idx
);
13547 cl_name_or_number
= argv
[idx
]->arg
;
13548 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
13550 argv_find(argv
, argc
, "AA:NN", &idx
);
13551 char *str
= argv_concat(argv
, argc
, idx
);
13553 int ret
= community_list_set(bgp_clist
, cl_name_or_number
, str
, direct
,
13556 XFREE(MTYPE_TMP
, str
);
13559 /* Display error string. */
13560 community_list_perror(vty
, ret
);
13561 return CMD_WARNING_CONFIG_FAILED
;
13564 return CMD_SUCCESS
;
13567 DEFUN (no_ip_community_list_standard_all
,
13568 no_ip_community_list_standard_all_cmd
,
13569 "no ip community-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
13573 "Community list number (standard)\n"
13574 "Add an standard community-list entry\n"
13575 "Community list name\n"
13576 "Specify community to reject\n"
13577 "Specify community to accept\n"
13580 char *cl_name_or_number
= NULL
;
13582 int style
= COMMUNITY_LIST_STANDARD
;
13585 argv_find(argv
, argc
, "(1-99)", &idx
);
13586 argv_find(argv
, argc
, "WORD", &idx
);
13587 cl_name_or_number
= argv
[idx
]->arg
;
13588 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
13590 argv_find(argv
, argc
, "AA:NN", &idx
);
13591 char *str
= argv_concat(argv
, argc
, idx
);
13593 int ret
= community_list_unset(bgp_clist
, cl_name_or_number
, str
,
13596 XFREE(MTYPE_TMP
, str
);
13599 community_list_perror(vty
, ret
);
13600 return CMD_WARNING_CONFIG_FAILED
;
13603 return CMD_SUCCESS
;
13606 /* ip community-list expanded */
13607 DEFUN (ip_community_list_expanded_all
,
13608 ip_community_list_expanded_all_cmd
,
13609 "ip community-list <(100-500)|expanded WORD> <deny|permit> AA:NN...",
13612 "Community list number (expanded)\n"
13613 "Add an expanded community-list entry\n"
13614 "Community list name\n"
13615 "Specify community to reject\n"
13616 "Specify community to accept\n"
13619 char *cl_name_or_number
= NULL
;
13621 int style
= COMMUNITY_LIST_EXPANDED
;
13624 argv_find(argv
, argc
, "(100-500)", &idx
);
13625 argv_find(argv
, argc
, "WORD", &idx
);
13626 cl_name_or_number
= argv
[idx
]->arg
;
13627 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
13629 argv_find(argv
, argc
, "AA:NN", &idx
);
13630 char *str
= argv_concat(argv
, argc
, idx
);
13632 int ret
= community_list_set(bgp_clist
, cl_name_or_number
, str
, direct
,
13635 XFREE(MTYPE_TMP
, str
);
13638 /* Display error string. */
13639 community_list_perror(vty
, ret
);
13640 return CMD_WARNING_CONFIG_FAILED
;
13643 return CMD_SUCCESS
;
13646 DEFUN (no_ip_community_list_expanded_all
,
13647 no_ip_community_list_expanded_all_cmd
,
13648 "no ip community-list <(100-500)|expanded WORD> <deny|permit> AA:NN...",
13652 "Community list number (expanded)\n"
13653 "Add an expanded community-list entry\n"
13654 "Community list name\n"
13655 "Specify community to reject\n"
13656 "Specify community to accept\n"
13659 char *cl_name_or_number
= NULL
;
13661 int style
= COMMUNITY_LIST_EXPANDED
;
13664 argv_find(argv
, argc
, "(100-500)", &idx
);
13665 argv_find(argv
, argc
, "WORD", &idx
);
13666 cl_name_or_number
= argv
[idx
]->arg
;
13667 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
13669 argv_find(argv
, argc
, "AA:NN", &idx
);
13670 char *str
= argv_concat(argv
, argc
, idx
);
13672 int ret
= community_list_unset(bgp_clist
, cl_name_or_number
, str
,
13675 XFREE(MTYPE_TMP
, str
);
13678 community_list_perror(vty
, ret
);
13679 return CMD_WARNING_CONFIG_FAILED
;
13682 return CMD_SUCCESS
;
13685 /* Return configuration string of community-list entry. */
13686 static const char *community_list_config_str(struct community_entry
*entry
)
13693 if (entry
->style
== COMMUNITY_LIST_STANDARD
)
13694 str
= community_str(entry
->u
.com
, false);
13695 else if (entry
->style
== LARGE_COMMUNITY_LIST_STANDARD
)
13696 str
= lcommunity_str(entry
->u
.lcom
, false);
13698 str
= entry
->config
;
13703 static void community_list_show(struct vty
*vty
, struct community_list
*list
)
13705 struct community_entry
*entry
;
13707 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
13708 if (entry
== list
->head
) {
13709 if (all_digit(list
->name
))
13710 vty_out(vty
, "Community %s list %s\n",
13711 entry
->style
== COMMUNITY_LIST_STANDARD
13713 : "(expanded) access",
13716 vty_out(vty
, "Named Community %s list %s\n",
13717 entry
->style
== COMMUNITY_LIST_STANDARD
13723 vty_out(vty
, " %s\n",
13724 community_direct_str(entry
->direct
));
13726 vty_out(vty
, " %s %s\n",
13727 community_direct_str(entry
->direct
),
13728 community_list_config_str(entry
));
13732 DEFUN (show_ip_community_list
,
13733 show_ip_community_list_cmd
,
13734 "show ip community-list",
13737 "List community-list\n")
13739 struct community_list
*list
;
13740 struct community_list_master
*cm
;
13742 cm
= community_list_master_lookup(bgp_clist
, COMMUNITY_LIST_MASTER
);
13744 return CMD_SUCCESS
;
13746 for (list
= cm
->num
.head
; list
; list
= list
->next
)
13747 community_list_show(vty
, list
);
13749 for (list
= cm
->str
.head
; list
; list
= list
->next
)
13750 community_list_show(vty
, list
);
13752 return CMD_SUCCESS
;
13755 DEFUN (show_ip_community_list_arg
,
13756 show_ip_community_list_arg_cmd
,
13757 "show ip community-list <(1-500)|WORD>",
13760 "List community-list\n"
13761 "Community-list number\n"
13762 "Community-list name\n")
13764 int idx_comm_list
= 3;
13765 struct community_list
*list
;
13767 list
= community_list_lookup(bgp_clist
, argv
[idx_comm_list
]->arg
,
13768 COMMUNITY_LIST_MASTER
);
13770 vty_out(vty
, "%% Can't find community-list\n");
13771 return CMD_WARNING
;
13774 community_list_show(vty
, list
);
13776 return CMD_SUCCESS
;
13780 * Large Community code.
13782 static int lcommunity_list_set_vty(struct vty
*vty
, int argc
,
13783 struct cmd_token
**argv
, int style
,
13784 int reject_all_digit_name
)
13792 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
13795 /* All digit name check. */
13797 argv_find(argv
, argc
, "WORD", &idx
);
13798 argv_find(argv
, argc
, "(1-99)", &idx
);
13799 argv_find(argv
, argc
, "(100-500)", &idx
);
13800 cl_name
= argv
[idx
]->arg
;
13801 if (reject_all_digit_name
&& all_digit(cl_name
)) {
13802 vty_out(vty
, "%% Community name cannot have all digits\n");
13803 return CMD_WARNING_CONFIG_FAILED
;
13807 argv_find(argv
, argc
, "AA:BB:CC", &idx
);
13808 argv_find(argv
, argc
, "LINE", &idx
);
13809 /* Concat community string argument. */
13811 str
= argv_concat(argv
, argc
, idx
);
13815 ret
= lcommunity_list_set(bgp_clist
, cl_name
, str
, direct
, style
);
13817 /* Free temporary community list string allocated by
13820 XFREE(MTYPE_TMP
, str
);
13823 community_list_perror(vty
, ret
);
13824 return CMD_WARNING_CONFIG_FAILED
;
13826 return CMD_SUCCESS
;
13829 static int lcommunity_list_unset_vty(struct vty
*vty
, int argc
,
13830 struct cmd_token
**argv
, int style
)
13837 argv_find(argv
, argc
, "permit", &idx
);
13838 argv_find(argv
, argc
, "deny", &idx
);
13841 /* Check the list direct. */
13842 if (strncmp(argv
[idx
]->arg
, "p", 1) == 0)
13843 direct
= COMMUNITY_PERMIT
;
13845 direct
= COMMUNITY_DENY
;
13848 argv_find(argv
, argc
, "LINE", &idx
);
13849 argv_find(argv
, argc
, "AA:AA:NN", &idx
);
13850 /* Concat community string argument. */
13851 str
= argv_concat(argv
, argc
, idx
);
13855 argv_find(argv
, argc
, "(1-99)", &idx
);
13856 argv_find(argv
, argc
, "(100-500)", &idx
);
13857 argv_find(argv
, argc
, "WORD", &idx
);
13859 /* Unset community list. */
13860 ret
= lcommunity_list_unset(bgp_clist
, argv
[idx
]->arg
, str
, direct
,
13863 /* Free temporary community list string allocated by
13866 XFREE(MTYPE_TMP
, str
);
13869 community_list_perror(vty
, ret
);
13870 return CMD_WARNING_CONFIG_FAILED
;
13873 return CMD_SUCCESS
;
13876 /* "large-community-list" keyword help string. */
13877 #define LCOMMUNITY_LIST_STR "Add a large community list entry\n"
13878 #define LCOMMUNITY_VAL_STR "large community in 'aa:bb:cc' format\n"
13880 DEFUN (ip_lcommunity_list_standard
,
13881 ip_lcommunity_list_standard_cmd
,
13882 "ip large-community-list (1-99) <deny|permit>",
13884 LCOMMUNITY_LIST_STR
13885 "Large Community list number (standard)\n"
13886 "Specify large community to reject\n"
13887 "Specify large community to accept\n")
13889 return lcommunity_list_set_vty(vty
, argc
, argv
,
13890 LARGE_COMMUNITY_LIST_STANDARD
, 0);
13893 DEFUN (ip_lcommunity_list_standard1
,
13894 ip_lcommunity_list_standard1_cmd
,
13895 "ip large-community-list (1-99) <deny|permit> AA:BB:CC...",
13897 LCOMMUNITY_LIST_STR
13898 "Large Community list number (standard)\n"
13899 "Specify large community to reject\n"
13900 "Specify large community to accept\n"
13901 LCOMMUNITY_VAL_STR
)
13903 return lcommunity_list_set_vty(vty
, argc
, argv
,
13904 LARGE_COMMUNITY_LIST_STANDARD
, 0);
13907 DEFUN (ip_lcommunity_list_expanded
,
13908 ip_lcommunity_list_expanded_cmd
,
13909 "ip large-community-list (100-500) <deny|permit> LINE...",
13911 LCOMMUNITY_LIST_STR
13912 "Large Community list number (expanded)\n"
13913 "Specify large community to reject\n"
13914 "Specify large community to accept\n"
13915 "An ordered list as a regular-expression\n")
13917 return lcommunity_list_set_vty(vty
, argc
, argv
,
13918 LARGE_COMMUNITY_LIST_EXPANDED
, 0);
13921 DEFUN (ip_lcommunity_list_name_standard
,
13922 ip_lcommunity_list_name_standard_cmd
,
13923 "ip large-community-list standard WORD <deny|permit>",
13925 LCOMMUNITY_LIST_STR
13926 "Specify standard large-community-list\n"
13927 "Large Community list name\n"
13928 "Specify large community to reject\n"
13929 "Specify large community to accept\n")
13931 return lcommunity_list_set_vty(vty
, argc
, argv
,
13932 LARGE_COMMUNITY_LIST_STANDARD
, 1);
13935 DEFUN (ip_lcommunity_list_name_standard1
,
13936 ip_lcommunity_list_name_standard1_cmd
,
13937 "ip large-community-list standard WORD <deny|permit> AA:BB:CC...",
13939 LCOMMUNITY_LIST_STR
13940 "Specify standard large-community-list\n"
13941 "Large Community list name\n"
13942 "Specify large community to reject\n"
13943 "Specify large community to accept\n"
13944 LCOMMUNITY_VAL_STR
)
13946 return lcommunity_list_set_vty(vty
, argc
, argv
,
13947 LARGE_COMMUNITY_LIST_STANDARD
, 1);
13950 DEFUN (ip_lcommunity_list_name_expanded
,
13951 ip_lcommunity_list_name_expanded_cmd
,
13952 "ip large-community-list expanded WORD <deny|permit> LINE...",
13954 LCOMMUNITY_LIST_STR
13955 "Specify expanded large-community-list\n"
13956 "Large Community list name\n"
13957 "Specify large community to reject\n"
13958 "Specify large community to accept\n"
13959 "An ordered list as a regular-expression\n")
13961 return lcommunity_list_set_vty(vty
, argc
, argv
,
13962 LARGE_COMMUNITY_LIST_EXPANDED
, 1);
13965 DEFUN (no_ip_lcommunity_list_standard_all
,
13966 no_ip_lcommunity_list_standard_all_cmd
,
13967 "no ip large-community-list <(1-99)|(100-500)|WORD>",
13970 LCOMMUNITY_LIST_STR
13971 "Large Community list number (standard)\n"
13972 "Large Community list number (expanded)\n"
13973 "Large Community list name\n")
13975 return lcommunity_list_unset_vty(vty
, argc
, argv
,
13976 LARGE_COMMUNITY_LIST_STANDARD
);
13979 DEFUN (no_ip_lcommunity_list_name_expanded_all
,
13980 no_ip_lcommunity_list_name_expanded_all_cmd
,
13981 "no ip large-community-list expanded WORD",
13984 LCOMMUNITY_LIST_STR
13985 "Specify expanded large-community-list\n"
13986 "Large Community list name\n")
13988 return lcommunity_list_unset_vty(vty
, argc
, argv
,
13989 LARGE_COMMUNITY_LIST_EXPANDED
);
13992 DEFUN (no_ip_lcommunity_list_standard
,
13993 no_ip_lcommunity_list_standard_cmd
,
13994 "no ip large-community-list (1-99) <deny|permit> AA:AA:NN...",
13997 LCOMMUNITY_LIST_STR
13998 "Large Community list number (standard)\n"
13999 "Specify large community to reject\n"
14000 "Specify large community to accept\n"
14001 LCOMMUNITY_VAL_STR
)
14003 return lcommunity_list_unset_vty(vty
, argc
, argv
,
14004 LARGE_COMMUNITY_LIST_STANDARD
);
14007 DEFUN (no_ip_lcommunity_list_expanded
,
14008 no_ip_lcommunity_list_expanded_cmd
,
14009 "no ip large-community-list (100-500) <deny|permit> LINE...",
14012 LCOMMUNITY_LIST_STR
14013 "Large Community list number (expanded)\n"
14014 "Specify large community to reject\n"
14015 "Specify large community to accept\n"
14016 "An ordered list as a regular-expression\n")
14018 return lcommunity_list_unset_vty(vty
, argc
, argv
,
14019 LARGE_COMMUNITY_LIST_EXPANDED
);
14022 DEFUN (no_ip_lcommunity_list_name_standard
,
14023 no_ip_lcommunity_list_name_standard_cmd
,
14024 "no ip large-community-list standard WORD <deny|permit> AA:AA:NN...",
14027 LCOMMUNITY_LIST_STR
14028 "Specify standard large-community-list\n"
14029 "Large Community list name\n"
14030 "Specify large community to reject\n"
14031 "Specify large community to accept\n"
14032 LCOMMUNITY_VAL_STR
)
14034 return lcommunity_list_unset_vty(vty
, argc
, argv
,
14035 LARGE_COMMUNITY_LIST_STANDARD
);
14038 DEFUN (no_ip_lcommunity_list_name_expanded
,
14039 no_ip_lcommunity_list_name_expanded_cmd
,
14040 "no ip large-community-list expanded WORD <deny|permit> LINE...",
14043 LCOMMUNITY_LIST_STR
14044 "Specify expanded large-community-list\n"
14045 "Large community list name\n"
14046 "Specify large community to reject\n"
14047 "Specify large community to accept\n"
14048 "An ordered list as a regular-expression\n")
14050 return lcommunity_list_unset_vty(vty
, argc
, argv
,
14051 LARGE_COMMUNITY_LIST_EXPANDED
);
14054 static void lcommunity_list_show(struct vty
*vty
, struct community_list
*list
)
14056 struct community_entry
*entry
;
14058 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
14059 if (entry
== list
->head
) {
14060 if (all_digit(list
->name
))
14061 vty_out(vty
, "Large community %s list %s\n",
14062 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
14064 : "(expanded) access",
14068 "Named large community %s list %s\n",
14069 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
14075 vty_out(vty
, " %s\n",
14076 community_direct_str(entry
->direct
));
14078 vty_out(vty
, " %s %s\n",
14079 community_direct_str(entry
->direct
),
14080 community_list_config_str(entry
));
14084 DEFUN (show_ip_lcommunity_list
,
14085 show_ip_lcommunity_list_cmd
,
14086 "show ip large-community-list",
14089 "List large-community list\n")
14091 struct community_list
*list
;
14092 struct community_list_master
*cm
;
14094 cm
= community_list_master_lookup(bgp_clist
,
14095 LARGE_COMMUNITY_LIST_MASTER
);
14097 return CMD_SUCCESS
;
14099 for (list
= cm
->num
.head
; list
; list
= list
->next
)
14100 lcommunity_list_show(vty
, list
);
14102 for (list
= cm
->str
.head
; list
; list
= list
->next
)
14103 lcommunity_list_show(vty
, list
);
14105 return CMD_SUCCESS
;
14108 DEFUN (show_ip_lcommunity_list_arg
,
14109 show_ip_lcommunity_list_arg_cmd
,
14110 "show ip large-community-list <(1-500)|WORD>",
14113 "List large-community list\n"
14114 "large-community-list number\n"
14115 "large-community-list name\n")
14117 struct community_list
*list
;
14119 list
= community_list_lookup(bgp_clist
, argv
[3]->arg
,
14120 LARGE_COMMUNITY_LIST_MASTER
);
14122 vty_out(vty
, "%% Can't find extcommunity-list\n");
14123 return CMD_WARNING
;
14126 lcommunity_list_show(vty
, list
);
14128 return CMD_SUCCESS
;
14131 /* "extcommunity-list" keyword help string. */
14132 #define EXTCOMMUNITY_LIST_STR "Add a extended community list entry\n"
14133 #define EXTCOMMUNITY_VAL_STR "Extended community attribute in 'rt aa:nn_or_IPaddr:nn' OR 'soo aa:nn_or_IPaddr:nn' format\n"
14135 DEFUN (ip_extcommunity_list_standard
,
14136 ip_extcommunity_list_standard_cmd
,
14137 "ip extcommunity-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
14139 EXTCOMMUNITY_LIST_STR
14140 "Extended Community list number (standard)\n"
14141 "Specify standard extcommunity-list\n"
14142 "Community list name\n"
14143 "Specify community to reject\n"
14144 "Specify community to accept\n"
14145 EXTCOMMUNITY_VAL_STR
)
14147 int style
= EXTCOMMUNITY_LIST_STANDARD
;
14149 char *cl_number_or_name
= NULL
;
14152 argv_find(argv
, argc
, "(1-99)", &idx
);
14153 argv_find(argv
, argc
, "WORD", &idx
);
14154 cl_number_or_name
= argv
[idx
]->arg
;
14155 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
14157 argv_find(argv
, argc
, "AA:NN", &idx
);
14158 char *str
= argv_concat(argv
, argc
, idx
);
14160 int ret
= extcommunity_list_set(bgp_clist
, cl_number_or_name
, str
,
14163 XFREE(MTYPE_TMP
, str
);
14166 community_list_perror(vty
, ret
);
14167 return CMD_WARNING_CONFIG_FAILED
;
14170 return CMD_SUCCESS
;
14173 DEFUN (ip_extcommunity_list_name_expanded
,
14174 ip_extcommunity_list_name_expanded_cmd
,
14175 "ip extcommunity-list <(100-500)|expanded WORD> <deny|permit> LINE...",
14177 EXTCOMMUNITY_LIST_STR
14178 "Extended Community list number (expanded)\n"
14179 "Specify expanded extcommunity-list\n"
14180 "Extended Community list name\n"
14181 "Specify community to reject\n"
14182 "Specify community to accept\n"
14183 "An ordered list as a regular-expression\n")
14185 int style
= EXTCOMMUNITY_LIST_EXPANDED
;
14187 char *cl_number_or_name
= NULL
;
14190 argv_find(argv
, argc
, "(100-500)", &idx
);
14191 argv_find(argv
, argc
, "WORD", &idx
);
14192 cl_number_or_name
= argv
[idx
]->arg
;
14193 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
14195 argv_find(argv
, argc
, "LINE", &idx
);
14196 char *str
= argv_concat(argv
, argc
, idx
);
14198 int ret
= extcommunity_list_set(bgp_clist
, cl_number_or_name
, str
,
14201 XFREE(MTYPE_TMP
, str
);
14204 community_list_perror(vty
, ret
);
14205 return CMD_WARNING_CONFIG_FAILED
;
14208 return CMD_SUCCESS
;
14211 DEFUN (no_ip_extcommunity_list_standard_all
,
14212 no_ip_extcommunity_list_standard_all_cmd
,
14213 "no ip extcommunity-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
14216 EXTCOMMUNITY_LIST_STR
14217 "Extended Community list number (standard)\n"
14218 "Specify standard extcommunity-list\n"
14219 "Community list name\n"
14220 "Specify community to reject\n"
14221 "Specify community to accept\n"
14222 EXTCOMMUNITY_VAL_STR
)
14224 int style
= EXTCOMMUNITY_LIST_STANDARD
;
14226 char *cl_number_or_name
= NULL
;
14229 argv_find(argv
, argc
, "(1-99)", &idx
);
14230 argv_find(argv
, argc
, "WORD", &idx
);
14231 cl_number_or_name
= argv
[idx
]->arg
;
14232 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
14234 argv_find(argv
, argc
, "AA:NN", &idx
);
14235 char *str
= argv_concat(argv
, argc
, idx
);
14237 int ret
= extcommunity_list_unset(bgp_clist
, cl_number_or_name
, str
,
14240 XFREE(MTYPE_TMP
, str
);
14243 community_list_perror(vty
, ret
);
14244 return CMD_WARNING_CONFIG_FAILED
;
14247 return CMD_SUCCESS
;
14250 DEFUN (no_ip_extcommunity_list_expanded_all
,
14251 no_ip_extcommunity_list_expanded_all_cmd
,
14252 "no ip extcommunity-list <(100-500)|expanded WORD> <deny|permit> LINE...",
14255 EXTCOMMUNITY_LIST_STR
14256 "Extended Community list number (expanded)\n"
14257 "Specify expanded extcommunity-list\n"
14258 "Extended Community list name\n"
14259 "Specify community to reject\n"
14260 "Specify community to accept\n"
14261 "An ordered list as a regular-expression\n")
14263 int style
= EXTCOMMUNITY_LIST_EXPANDED
;
14265 char *cl_number_or_name
= NULL
;
14268 argv_find(argv
, argc
, "(100-500)", &idx
);
14269 argv_find(argv
, argc
, "WORD", &idx
);
14270 cl_number_or_name
= argv
[idx
]->arg
;
14271 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
14273 argv_find(argv
, argc
, "LINE", &idx
);
14274 char *str
= argv_concat(argv
, argc
, idx
);
14276 int ret
= extcommunity_list_unset(bgp_clist
, cl_number_or_name
, str
,
14279 XFREE(MTYPE_TMP
, str
);
14282 community_list_perror(vty
, ret
);
14283 return CMD_WARNING_CONFIG_FAILED
;
14286 return CMD_SUCCESS
;
14289 static void extcommunity_list_show(struct vty
*vty
, struct community_list
*list
)
14291 struct community_entry
*entry
;
14293 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
14294 if (entry
== list
->head
) {
14295 if (all_digit(list
->name
))
14296 vty_out(vty
, "Extended community %s list %s\n",
14297 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
14299 : "(expanded) access",
14303 "Named extended community %s list %s\n",
14304 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
14310 vty_out(vty
, " %s\n",
14311 community_direct_str(entry
->direct
));
14313 vty_out(vty
, " %s %s\n",
14314 community_direct_str(entry
->direct
),
14315 community_list_config_str(entry
));
14319 DEFUN (show_ip_extcommunity_list
,
14320 show_ip_extcommunity_list_cmd
,
14321 "show ip extcommunity-list",
14324 "List extended-community list\n")
14326 struct community_list
*list
;
14327 struct community_list_master
*cm
;
14329 cm
= community_list_master_lookup(bgp_clist
, EXTCOMMUNITY_LIST_MASTER
);
14331 return CMD_SUCCESS
;
14333 for (list
= cm
->num
.head
; list
; list
= list
->next
)
14334 extcommunity_list_show(vty
, list
);
14336 for (list
= cm
->str
.head
; list
; list
= list
->next
)
14337 extcommunity_list_show(vty
, list
);
14339 return CMD_SUCCESS
;
14342 DEFUN (show_ip_extcommunity_list_arg
,
14343 show_ip_extcommunity_list_arg_cmd
,
14344 "show ip extcommunity-list <(1-500)|WORD>",
14347 "List extended-community list\n"
14348 "Extcommunity-list number\n"
14349 "Extcommunity-list name\n")
14351 int idx_comm_list
= 3;
14352 struct community_list
*list
;
14354 list
= community_list_lookup(bgp_clist
, argv
[idx_comm_list
]->arg
,
14355 EXTCOMMUNITY_LIST_MASTER
);
14357 vty_out(vty
, "%% Can't find extcommunity-list\n");
14358 return CMD_WARNING
;
14361 extcommunity_list_show(vty
, list
);
14363 return CMD_SUCCESS
;
14366 /* Display community-list and extcommunity-list configuration. */
14367 static int community_list_config_write(struct vty
*vty
)
14369 struct community_list
*list
;
14370 struct community_entry
*entry
;
14371 struct community_list_master
*cm
;
14374 /* Community-list. */
14375 cm
= community_list_master_lookup(bgp_clist
, COMMUNITY_LIST_MASTER
);
14377 for (list
= cm
->num
.head
; list
; list
= list
->next
)
14378 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
14379 vty_out(vty
, "ip community-list %s %s %s\n", list
->name
,
14380 community_direct_str(entry
->direct
),
14381 community_list_config_str(entry
));
14384 for (list
= cm
->str
.head
; list
; list
= list
->next
)
14385 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
14386 vty_out(vty
, "ip community-list %s %s %s %s\n",
14387 entry
->style
== COMMUNITY_LIST_STANDARD
14390 list
->name
, community_direct_str(entry
->direct
),
14391 community_list_config_str(entry
));
14395 /* Extcommunity-list. */
14396 cm
= community_list_master_lookup(bgp_clist
, EXTCOMMUNITY_LIST_MASTER
);
14398 for (list
= cm
->num
.head
; list
; list
= list
->next
)
14399 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
14400 vty_out(vty
, "ip extcommunity-list %s %s %s\n",
14401 list
->name
, community_direct_str(entry
->direct
),
14402 community_list_config_str(entry
));
14405 for (list
= cm
->str
.head
; list
; list
= list
->next
)
14406 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
14407 vty_out(vty
, "ip extcommunity-list %s %s %s %s\n",
14408 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
14411 list
->name
, community_direct_str(entry
->direct
),
14412 community_list_config_str(entry
));
14417 /* lcommunity-list. */
14418 cm
= community_list_master_lookup(bgp_clist
,
14419 LARGE_COMMUNITY_LIST_MASTER
);
14421 for (list
= cm
->num
.head
; list
; list
= list
->next
)
14422 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
14423 vty_out(vty
, "ip large-community-list %s %s %s\n",
14424 list
->name
, community_direct_str(entry
->direct
),
14425 community_list_config_str(entry
));
14428 for (list
= cm
->str
.head
; list
; list
= list
->next
)
14429 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
14430 vty_out(vty
, "ip large-community-list %s %s %s %s\n",
14431 entry
->style
== LARGE_COMMUNITY_LIST_STANDARD
14434 list
->name
, community_direct_str(entry
->direct
),
14435 community_list_config_str(entry
));
14442 static struct cmd_node community_list_node
= {
14443 COMMUNITY_LIST_NODE
, "", 1 /* Export to vtysh. */
14446 static void community_list_vty(void)
14448 install_node(&community_list_node
, community_list_config_write
);
14450 /* Community-list. */
14451 install_element(CONFIG_NODE
, &ip_community_list_standard_cmd
);
14452 install_element(CONFIG_NODE
, &ip_community_list_expanded_all_cmd
);
14453 install_element(CONFIG_NODE
, &no_ip_community_list_standard_all_cmd
);
14454 install_element(CONFIG_NODE
, &no_ip_community_list_expanded_all_cmd
);
14455 install_element(VIEW_NODE
, &show_ip_community_list_cmd
);
14456 install_element(VIEW_NODE
, &show_ip_community_list_arg_cmd
);
14458 /* Extcommunity-list. */
14459 install_element(CONFIG_NODE
, &ip_extcommunity_list_standard_cmd
);
14460 install_element(CONFIG_NODE
, &ip_extcommunity_list_name_expanded_cmd
);
14461 install_element(CONFIG_NODE
, &no_ip_extcommunity_list_standard_all_cmd
);
14462 install_element(CONFIG_NODE
, &no_ip_extcommunity_list_expanded_all_cmd
);
14463 install_element(VIEW_NODE
, &show_ip_extcommunity_list_cmd
);
14464 install_element(VIEW_NODE
, &show_ip_extcommunity_list_arg_cmd
);
14466 /* Large Community List */
14467 install_element(CONFIG_NODE
, &ip_lcommunity_list_standard_cmd
);
14468 install_element(CONFIG_NODE
, &ip_lcommunity_list_standard1_cmd
);
14469 install_element(CONFIG_NODE
, &ip_lcommunity_list_expanded_cmd
);
14470 install_element(CONFIG_NODE
, &ip_lcommunity_list_name_standard_cmd
);
14471 install_element(CONFIG_NODE
, &ip_lcommunity_list_name_standard1_cmd
);
14472 install_element(CONFIG_NODE
, &ip_lcommunity_list_name_expanded_cmd
);
14473 install_element(CONFIG_NODE
, &no_ip_lcommunity_list_standard_all_cmd
);
14474 install_element(CONFIG_NODE
,
14475 &no_ip_lcommunity_list_name_expanded_all_cmd
);
14476 install_element(CONFIG_NODE
, &no_ip_lcommunity_list_standard_cmd
);
14477 install_element(CONFIG_NODE
, &no_ip_lcommunity_list_expanded_cmd
);
14478 install_element(CONFIG_NODE
, &no_ip_lcommunity_list_name_standard_cmd
);
14479 install_element(CONFIG_NODE
, &no_ip_lcommunity_list_name_expanded_cmd
);
14480 install_element(VIEW_NODE
, &show_ip_lcommunity_list_cmd
);
14481 install_element(VIEW_NODE
, &show_ip_lcommunity_list_arg_cmd
);