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"
38 #include "bgpd/bgpd.h"
39 #include "bgpd/bgp_advertise.h"
40 #include "bgpd/bgp_attr.h"
41 #include "bgpd/bgp_aspath.h"
42 #include "bgpd/bgp_community.h"
43 #include "bgpd/bgp_ecommunity.h"
44 #include "bgpd/bgp_lcommunity.h"
45 #include "bgpd/bgp_damp.h"
46 #include "bgpd/bgp_debug.h"
47 #include "bgpd/bgp_fsm.h"
48 #include "bgpd/bgp_nexthop.h"
49 #include "bgpd/bgp_open.h"
50 #include "bgpd/bgp_regex.h"
51 #include "bgpd/bgp_route.h"
52 #include "bgpd/bgp_mplsvpn.h"
53 #include "bgpd/bgp_zebra.h"
54 #include "bgpd/bgp_table.h"
55 #include "bgpd/bgp_vty.h"
56 #include "bgpd/bgp_mpath.h"
57 #include "bgpd/bgp_packet.h"
58 #include "bgpd/bgp_updgrp.h"
59 #include "bgpd/bgp_bfd.h"
60 #include "bgpd/bgp_io.h"
61 #include "bgpd/bgp_evpn.h"
63 static struct peer_group
*listen_range_exists(struct bgp
*bgp
,
64 struct prefix
*range
, int exact
);
66 static enum node_type
bgp_node_type(afi_t afi
, safi_t safi
)
75 return BGP_IPV4M_NODE
;
77 case SAFI_LABELED_UNICAST
:
78 return BGP_IPV4L_NODE
;
81 return BGP_VPNV4_NODE
;
84 return BGP_FLOWSPECV4_NODE
;
97 return BGP_IPV6M_NODE
;
99 case SAFI_LABELED_UNICAST
:
100 return BGP_IPV6L_NODE
;
103 return BGP_VPNV6_NODE
;
106 return BGP_FLOWSPECV6_NODE
;
109 return BGP_IPV4_NODE
;
114 return BGP_EVPN_NODE
;
117 // We should never be here but to clarify the switch statement..
118 return BGP_IPV4_NODE
;
122 // Impossible to happen
123 return BGP_IPV4_NODE
;
126 /* Utility function to get address family from current node. */
127 afi_t
bgp_node_afi(struct vty
*vty
)
135 case BGP_FLOWSPECV6_NODE
:
148 /* Utility function to get subsequent address family from current
150 safi_t
bgp_node_safi(struct vty
*vty
)
156 safi
= SAFI_MPLS_VPN
;
160 safi
= SAFI_MULTICAST
;
167 safi
= SAFI_LABELED_UNICAST
;
169 case BGP_FLOWSPECV4_NODE
:
170 case BGP_FLOWSPECV6_NODE
:
171 safi
= SAFI_FLOWSPEC
;
181 * Converts an AFI in string form to afi_t
183 * @param afi string, one of
186 * @return the corresponding afi_t
188 afi_t
bgp_vty_afi_from_str(const char *afi_str
)
190 afi_t afi
= AFI_MAX
; /* unknown */
191 if (strmatch(afi_str
, "ipv4"))
193 else if (strmatch(afi_str
, "ipv6"))
198 int argv_find_and_parse_afi(struct cmd_token
**argv
, int argc
, int *index
,
202 if (argv_find(argv
, argc
, "ipv4", index
)) {
206 } else if (argv_find(argv
, argc
, "ipv6", index
)) {
214 /* supports <unicast|multicast|vpn|labeled-unicast> */
215 safi_t
bgp_vty_safi_from_str(const char *safi_str
)
217 safi_t safi
= SAFI_MAX
; /* unknown */
218 if (strmatch(safi_str
, "multicast"))
219 safi
= SAFI_MULTICAST
;
220 else if (strmatch(safi_str
, "unicast"))
222 else if (strmatch(safi_str
, "vpn"))
223 safi
= SAFI_MPLS_VPN
;
224 else if (strmatch(safi_str
, "labeled-unicast"))
225 safi
= SAFI_LABELED_UNICAST
;
226 else if (strmatch(safi_str
, "flowspec"))
227 safi
= SAFI_FLOWSPEC
;
231 int argv_find_and_parse_safi(struct cmd_token
**argv
, int argc
, int *index
,
235 if (argv_find(argv
, argc
, "unicast", index
)) {
238 *safi
= SAFI_UNICAST
;
239 } else if (argv_find(argv
, argc
, "multicast", index
)) {
242 *safi
= SAFI_MULTICAST
;
243 } else if (argv_find(argv
, argc
, "labeled-unicast", index
)) {
246 *safi
= SAFI_LABELED_UNICAST
;
247 } else if (argv_find(argv
, argc
, "vpn", index
)) {
250 *safi
= SAFI_MPLS_VPN
;
251 } else if (argv_find(argv
, argc
, "flowspec", index
)) {
254 *safi
= SAFI_FLOWSPEC
;
260 * bgp_vty_find_and_parse_afi_safi_bgp
262 * For a given 'show ...' command, correctly parse the afi/safi/bgp out from it
263 * This function *assumes* that the calling function pre-sets the afi/safi/bgp
264 * to appropriate values for the calling function. This is to allow the
265 * calling function to make decisions appropriate for the show command
266 * that is being parsed.
268 * The show commands are generally of the form:
269 * "show [ip] bgp [<view|vrf> VIEWVRFNAME] [<ipv4|ipv6>
270 * [<unicast|multicast|vpn|labeled-unicast>]] ..."
272 * Since we use argv_find if the show command in particular doesn't have:
274 * [<view|vrf> VIEWVRFNAME]
275 * [<ipv4|ipv6> [<unicast|multicast|vpn|labeled-unicast>]]
276 * The command parsing should still be ok.
278 * vty -> The vty for the command so we can output some useful data in
279 * the event of a parse error in the vrf.
280 * argv -> The command tokens
281 * argc -> How many command tokens we have
282 * idx -> The current place in the command, generally should be 0 for this
284 * afi -> The parsed afi if it was included in the show command, returned here
285 * safi -> The parsed safi if it was included in the show command, returned here
286 * bgp -> Pointer to the bgp data structure we need to fill in.
288 * The function returns the correct location in the parse tree for the
291 * Returns 0 for failure to parse correctly, else the idx position of where
292 * it found the last token.
294 int bgp_vty_find_and_parse_afi_safi_bgp(struct vty
*vty
,
295 struct cmd_token
**argv
, int argc
,
296 int *idx
, afi_t
*afi
, safi_t
*safi
,
299 char *vrf_name
= NULL
;
305 if (argv_find(argv
, argc
, "ip", idx
))
308 if (argv_find(argv
, argc
, "view", idx
)
309 || argv_find(argv
, argc
, "vrf", idx
)) {
310 vrf_name
= argv
[*idx
+ 1]->arg
;
312 if (strmatch(vrf_name
, "all"))
315 *bgp
= bgp_lookup_by_name(vrf_name
);
318 "View/Vrf specified is unknown: %s\n",
325 *bgp
= bgp_get_default();
327 vty_out(vty
, "Unable to find default BGP instance\n");
333 if (argv_find_and_parse_afi(argv
, argc
, idx
, afi
))
334 argv_find_and_parse_safi(argv
, argc
, idx
, safi
);
340 static int peer_address_self_check(struct bgp
*bgp
, union sockunion
*su
)
342 struct interface
*ifp
= NULL
;
344 if (su
->sa
.sa_family
== AF_INET
)
345 ifp
= if_lookup_by_ipv4_exact(&su
->sin
.sin_addr
, bgp
->vrf_id
);
346 else if (su
->sa
.sa_family
== AF_INET6
)
347 ifp
= if_lookup_by_ipv6_exact(&su
->sin6
.sin6_addr
,
348 su
->sin6
.sin6_scope_id
,
357 /* Utility function for looking up peer from VTY. */
358 /* This is used only for configuration, so disallow if attempted on
359 * a dynamic neighbor.
361 static struct peer
*peer_lookup_vty(struct vty
*vty
, const char *ip_str
)
363 struct bgp
*bgp
= VTY_GET_CONTEXT(bgp
);
372 ret
= str2sockunion(ip_str
, &su
);
374 peer
= peer_lookup_by_conf_if(bgp
, ip_str
);
376 if ((peer
= peer_lookup_by_hostname(bgp
, ip_str
))
379 "%% Malformed address or name: %s\n",
385 peer
= peer_lookup(bgp
, &su
);
388 "%% Specify remote-as or peer-group commands first\n");
391 if (peer_dynamic_neighbor(peer
)) {
393 "%% Operation not allowed on a dynamic neighbor\n");
400 /* Utility function for looking up peer or peer group. */
401 /* This is used only for configuration, so disallow if attempted on
402 * a dynamic neighbor.
404 struct peer
*peer_and_group_lookup_vty(struct vty
*vty
, const char *peer_str
)
406 struct bgp
*bgp
= VTY_GET_CONTEXT(bgp
);
409 struct peer
*peer
= NULL
;
410 struct peer_group
*group
= NULL
;
416 ret
= str2sockunion(peer_str
, &su
);
418 /* IP address, locate peer. */
419 peer
= peer_lookup(bgp
, &su
);
421 /* Not IP, could match either peer configured on interface or a
423 peer
= peer_lookup_by_conf_if(bgp
, peer_str
);
425 group
= peer_group_lookup(bgp
, peer_str
);
429 if (peer_dynamic_neighbor(peer
)) {
431 "%% Operation not allowed on a dynamic neighbor\n");
441 vty_out(vty
, "%% Specify remote-as or peer-group commands first\n");
446 int bgp_vty_return(struct vty
*vty
, int ret
)
448 const char *str
= NULL
;
451 case BGP_ERR_INVALID_VALUE
:
452 str
= "Invalid value";
454 case BGP_ERR_INVALID_FLAG
:
455 str
= "Invalid flag";
457 case BGP_ERR_PEER_GROUP_SHUTDOWN
:
458 str
= "Peer-group has been shutdown. Activate the peer-group first";
460 case BGP_ERR_PEER_FLAG_CONFLICT
:
461 str
= "Can't set override-capability and strict-capability-match at the same time";
463 case BGP_ERR_PEER_GROUP_NO_REMOTE_AS
:
464 str
= "Specify remote-as or peer-group remote AS first";
466 case BGP_ERR_PEER_GROUP_CANT_CHANGE
:
467 str
= "Cannot change the peer-group. Deconfigure first";
469 case BGP_ERR_PEER_GROUP_MISMATCH
:
470 str
= "Peer is not a member of this peer-group";
472 case BGP_ERR_PEER_FILTER_CONFLICT
:
473 str
= "Prefix/distribute list can not co-exist";
475 case BGP_ERR_NOT_INTERNAL_PEER
:
476 str
= "Invalid command. Not an internal neighbor";
478 case BGP_ERR_REMOVE_PRIVATE_AS
:
479 str
= "remove-private-AS cannot be configured for IBGP peers";
481 case BGP_ERR_LOCAL_AS_ALLOWED_ONLY_FOR_EBGP
:
482 str
= "Local-AS allowed only for EBGP peers";
484 case BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS
:
485 str
= "Cannot have local-as same as BGP AS number";
487 case BGP_ERR_TCPSIG_FAILED
:
488 str
= "Error while applying TCP-Sig to session(s)";
490 case BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
:
491 str
= "ebgp-multihop and ttl-security cannot be configured together";
493 case BGP_ERR_NO_IBGP_WITH_TTLHACK
:
494 str
= "ttl-security only allowed for EBGP peers";
496 case BGP_ERR_AS_OVERRIDE
:
497 str
= "as-override cannot be configured for IBGP peers";
499 case BGP_ERR_INVALID_DYNAMIC_NEIGHBORS_LIMIT
:
500 str
= "Invalid limit for number of dynamic neighbors";
502 case BGP_ERR_DYNAMIC_NEIGHBORS_RANGE_EXISTS
:
503 str
= "Dynamic neighbor listen range already exists";
505 case BGP_ERR_INVALID_FOR_DYNAMIC_PEER
:
506 str
= "Operation not allowed on a dynamic neighbor";
508 case BGP_ERR_INVALID_FOR_DIRECT_PEER
:
509 str
= "Operation not allowed on a directly connected neighbor";
511 case BGP_ERR_PEER_SAFI_CONFLICT
:
512 str
= "Cannot activate peer for both 'ipv4 unicast' and 'ipv4 labeled-unicast'";
516 vty_out(vty
, "%% %s\n", str
);
517 return CMD_WARNING_CONFIG_FAILED
;
522 /* BGP clear sort. */
531 static void bgp_clear_vty_error(struct vty
*vty
, struct peer
*peer
, afi_t afi
,
532 safi_t safi
, int error
)
535 case BGP_ERR_AF_UNCONFIGURED
:
537 "%%BGP: Enable %s address family for the neighbor %s\n",
538 afi_safi_print(afi
, safi
), peer
->host
);
540 case BGP_ERR_SOFT_RECONFIG_UNCONFIGURED
:
542 "%%BGP: Inbound soft reconfig for %s not possible as it\n has neither refresh capability, nor inbound soft reconfig\n",
550 /* `clear ip bgp' functions. */
551 static int bgp_clear(struct vty
*vty
, struct bgp
*bgp
, afi_t afi
, safi_t safi
,
552 enum clear_sort sort
, enum bgp_clear_type stype
,
558 struct listnode
*node
, *nnode
;
560 /* Clear all neighbors. */
562 * Pass along pointer to next node to peer_clear() when walking all
563 * nodes on the BGP instance as that may get freed if it is a
566 if (sort
== clear_all
) {
567 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
568 if (!peer
->afc
[afi
][safi
])
571 if (stype
== BGP_CLEAR_SOFT_NONE
)
572 ret
= peer_clear(peer
, &nnode
);
574 ret
= peer_clear_soft(peer
, afi
, safi
, stype
);
577 bgp_clear_vty_error(vty
, peer
, afi
, safi
, ret
);
582 /* This is to apply read-only mode on this clear. */
583 if (stype
== BGP_CLEAR_SOFT_NONE
)
584 bgp
->update_delay_over
= 0;
587 vty_out(vty
, "%%BGP: No %s peer configured",
588 afi_safi_print(afi
, safi
));
593 /* Clear specified neighbor. */
594 if (sort
== clear_peer
) {
597 /* Make sockunion for lookup. */
598 ret
= str2sockunion(arg
, &su
);
600 peer
= peer_lookup_by_conf_if(bgp
, arg
);
602 peer
= peer_lookup_by_hostname(bgp
, arg
);
605 "Malformed address or name: %s\n",
611 peer
= peer_lookup(bgp
, &su
);
614 "%%BGP: Unknown neighbor - \"%s\"\n",
620 if (!peer
->afc
[afi
][safi
])
621 ret
= BGP_ERR_AF_UNCONFIGURED
;
622 else if (stype
== BGP_CLEAR_SOFT_NONE
)
623 ret
= peer_clear(peer
, NULL
);
625 ret
= peer_clear_soft(peer
, afi
, safi
, stype
);
628 bgp_clear_vty_error(vty
, peer
, afi
, safi
, ret
);
633 /* Clear all neighbors belonging to a specific peer-group. */
634 if (sort
== clear_group
) {
635 struct peer_group
*group
;
637 group
= peer_group_lookup(bgp
, arg
);
639 vty_out(vty
, "%%BGP: No such peer-group %s\n", arg
);
643 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
644 if (!peer
->afc
[afi
][safi
])
647 if (stype
== BGP_CLEAR_SOFT_NONE
)
648 ret
= peer_clear(peer
, NULL
);
650 ret
= peer_clear_soft(peer
, afi
, safi
, stype
);
653 bgp_clear_vty_error(vty
, peer
, afi
, safi
, ret
);
660 "%%BGP: No %s peer belonging to peer-group %s is configured\n",
661 afi_safi_print(afi
, safi
), arg
);
666 /* Clear all external (eBGP) neighbors. */
667 if (sort
== clear_external
) {
668 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
669 if (peer
->sort
== BGP_PEER_IBGP
)
672 if (!peer
->afc
[afi
][safi
])
675 if (stype
== BGP_CLEAR_SOFT_NONE
)
676 ret
= peer_clear(peer
, &nnode
);
678 ret
= peer_clear_soft(peer
, afi
, safi
, stype
);
681 bgp_clear_vty_error(vty
, peer
, afi
, safi
, ret
);
688 "%%BGP: No external %s peer is configured\n",
689 afi_safi_print(afi
, safi
));
694 /* Clear all neighbors belonging to a specific AS. */
695 if (sort
== clear_as
) {
696 as_t as
= strtoul(arg
, NULL
, 10);
698 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
702 if (!peer
->afc
[afi
][safi
])
703 ret
= BGP_ERR_AF_UNCONFIGURED
;
704 else if (stype
== BGP_CLEAR_SOFT_NONE
)
705 ret
= peer_clear(peer
, &nnode
);
707 ret
= peer_clear_soft(peer
, afi
, safi
, stype
);
710 bgp_clear_vty_error(vty
, peer
, afi
, safi
, ret
);
717 "%%BGP: No %s peer is configured with AS %s\n",
718 afi_safi_print(afi
, safi
), arg
);
726 static int bgp_clear_vty(struct vty
*vty
, const char *name
, afi_t afi
,
727 safi_t safi
, enum clear_sort sort
,
728 enum bgp_clear_type stype
, const char *arg
)
732 /* BGP structure lookup. */
734 bgp
= bgp_lookup_by_name(name
);
736 vty_out(vty
, "Can't find BGP instance %s\n", name
);
740 bgp
= bgp_get_default();
742 vty_out(vty
, "No BGP process is configured\n");
747 return bgp_clear(vty
, bgp
, afi
, safi
, sort
, stype
, arg
);
750 /* clear soft inbound */
751 static void bgp_clear_star_soft_in(struct vty
*vty
, const char *name
)
753 bgp_clear_vty(vty
, name
, AFI_IP
, SAFI_UNICAST
, clear_all
,
754 BGP_CLEAR_SOFT_IN
, NULL
);
755 bgp_clear_vty(vty
, name
, AFI_IP6
, SAFI_UNICAST
, clear_all
,
756 BGP_CLEAR_SOFT_IN
, NULL
);
759 /* clear soft outbound */
760 static void bgp_clear_star_soft_out(struct vty
*vty
, const char *name
)
762 bgp_clear_vty(vty
, name
, AFI_IP
, SAFI_UNICAST
, clear_all
,
763 BGP_CLEAR_SOFT_OUT
, NULL
);
764 bgp_clear_vty(vty
, name
, AFI_IP6
, SAFI_UNICAST
, clear_all
,
765 BGP_CLEAR_SOFT_OUT
, NULL
);
769 #ifndef VTYSH_EXTRACT_PL
770 #include "bgpd/bgp_vty_clippy.c"
773 /* BGP global configuration. */
775 DEFUN (bgp_multiple_instance_func
,
776 bgp_multiple_instance_cmd
,
777 "bgp multiple-instance",
779 "Enable bgp multiple instance\n")
781 bgp_option_set(BGP_OPT_MULTIPLE_INSTANCE
);
785 DEFUN (no_bgp_multiple_instance
,
786 no_bgp_multiple_instance_cmd
,
787 "no bgp multiple-instance",
790 "BGP multiple instance\n")
794 ret
= bgp_option_unset(BGP_OPT_MULTIPLE_INSTANCE
);
796 vty_out(vty
, "%% There are more than two BGP instances\n");
797 return CMD_WARNING_CONFIG_FAILED
;
802 DEFUN (bgp_config_type
,
804 "bgp config-type <cisco|zebra>",
806 "Configuration type\n"
811 if (argv_find(argv
, argc
, "cisco", &idx
))
812 bgp_option_set(BGP_OPT_CONFIG_CISCO
);
814 bgp_option_unset(BGP_OPT_CONFIG_CISCO
);
819 DEFUN (no_bgp_config_type
,
820 no_bgp_config_type_cmd
,
821 "no bgp config-type [<cisco|zebra>]",
824 "Display configuration type\n"
828 bgp_option_unset(BGP_OPT_CONFIG_CISCO
);
833 DEFUN (no_synchronization
,
834 no_synchronization_cmd
,
835 "no synchronization",
837 "Perform IGP synchronization\n")
842 DEFUN (no_auto_summary
,
846 "Enable automatic network number summarization\n")
851 /* "router bgp" commands. */
852 DEFUN_NOSH (router_bgp
,
854 "router bgp [(1-4294967295) [<view|vrf> VIEWVRFNAME]]",
858 BGP_INSTANCE_HELP_STR
)
861 int idx_view_vrf
= 3;
866 const char *name
= NULL
;
867 enum bgp_instance_type inst_type
;
869 // "router bgp" without an ASN
871 // Pending: Make VRF option available for ASN less config
872 bgp
= bgp_get_default();
875 vty_out(vty
, "%% No BGP process is configured\n");
876 return CMD_WARNING_CONFIG_FAILED
;
879 if (listcount(bm
->bgp
) > 1) {
880 vty_out(vty
, "%% Please specify ASN and VRF\n");
881 return CMD_WARNING_CONFIG_FAILED
;
887 as
= strtoul(argv
[idx_asn
]->arg
, NULL
, 10);
889 inst_type
= BGP_INSTANCE_TYPE_DEFAULT
;
891 name
= argv
[idx_vrf
]->arg
;
893 if (!strcmp(argv
[idx_view_vrf
]->text
, "vrf"))
894 inst_type
= BGP_INSTANCE_TYPE_VRF
;
895 else if (!strcmp(argv
[idx_view_vrf
]->text
, "view"))
896 inst_type
= BGP_INSTANCE_TYPE_VIEW
;
899 ret
= bgp_get(&bgp
, &as
, name
, inst_type
);
901 case BGP_ERR_MULTIPLE_INSTANCE_NOT_SET
:
903 "Please specify 'bgp multiple-instance' first\n");
904 return CMD_WARNING_CONFIG_FAILED
;
905 case BGP_ERR_AS_MISMATCH
:
906 vty_out(vty
, "BGP is already running; AS is %u\n", as
);
907 return CMD_WARNING_CONFIG_FAILED
;
908 case BGP_ERR_INSTANCE_MISMATCH
:
910 "BGP instance name and AS number mismatch\n");
912 "BGP instance is already running; AS is %u\n",
914 return CMD_WARNING_CONFIG_FAILED
;
917 /* Pending: handle when user tries to change a view to vrf n vv.
921 /* unset the auto created flag as the user config is now present */
922 UNSET_FLAG(bgp
->vrf_flags
, BGP_VRF_AUTO
);
923 VTY_PUSH_CONTEXT(BGP_NODE
, bgp
);
928 /* "no router bgp" commands. */
929 DEFUN (no_router_bgp
,
931 "no router bgp [(1-4294967295) [<view|vrf> VIEWVRFNAME]]",
936 BGP_INSTANCE_HELP_STR
)
942 const char *name
= NULL
;
944 // "no router bgp" without an ASN
946 // Pending: Make VRF option available for ASN less config
947 bgp
= bgp_get_default();
950 vty_out(vty
, "%% No BGP process is configured\n");
951 return CMD_WARNING_CONFIG_FAILED
;
954 if (listcount(bm
->bgp
) > 1) {
955 vty_out(vty
, "%% Please specify ASN and VRF\n");
956 return CMD_WARNING_CONFIG_FAILED
;
960 vty_out(vty
, "%% Please unconfigure l3vni %u",
962 return CMD_WARNING_CONFIG_FAILED
;
965 as
= strtoul(argv
[idx_asn
]->arg
, NULL
, 10);
968 name
= argv
[idx_vrf
]->arg
;
970 /* Lookup bgp structure. */
971 bgp
= bgp_lookup(as
, name
);
973 vty_out(vty
, "%% Can't find BGP instance\n");
974 return CMD_WARNING_CONFIG_FAILED
;
978 vty_out(vty
, "%% Please unconfigure l3vni %u",
980 return CMD_WARNING_CONFIG_FAILED
;
992 DEFPY (bgp_router_id
,
994 "bgp router-id A.B.C.D",
996 "Override configured router identifier\n"
997 "Manually configured router identifier\n")
999 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1000 bgp_router_id_static_set(bgp
, router_id
);
1004 DEFPY (no_bgp_router_id
,
1005 no_bgp_router_id_cmd
,
1006 "no bgp router-id [A.B.C.D]",
1009 "Override configured router identifier\n"
1010 "Manually configured router identifier\n")
1012 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1014 if (router_id_str
) {
1015 if (!IPV4_ADDR_SAME(&bgp
->router_id_static
, &router_id
)) {
1016 vty_out(vty
, "%% BGP router-id doesn't match\n");
1017 return CMD_WARNING_CONFIG_FAILED
;
1021 router_id
.s_addr
= 0;
1022 bgp_router_id_static_set(bgp
, router_id
);
1028 /* BGP Cluster ID. */
1029 DEFUN (bgp_cluster_id
,
1031 "bgp cluster-id <A.B.C.D|(1-4294967295)>",
1033 "Configure Route-Reflector Cluster-id\n"
1034 "Route-Reflector Cluster-id in IP address format\n"
1035 "Route-Reflector Cluster-id as 32 bit quantity\n")
1037 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1040 struct in_addr cluster
;
1042 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &cluster
);
1044 vty_out(vty
, "%% Malformed bgp cluster identifier\n");
1045 return CMD_WARNING_CONFIG_FAILED
;
1048 bgp_cluster_id_set(bgp
, &cluster
);
1049 bgp_clear_star_soft_out(vty
, bgp
->name
);
1054 DEFUN (no_bgp_cluster_id
,
1055 no_bgp_cluster_id_cmd
,
1056 "no bgp cluster-id [<A.B.C.D|(1-4294967295)>]",
1059 "Configure Route-Reflector Cluster-id\n"
1060 "Route-Reflector Cluster-id in IP address format\n"
1061 "Route-Reflector Cluster-id as 32 bit quantity\n")
1063 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1064 bgp_cluster_id_unset(bgp
);
1065 bgp_clear_star_soft_out(vty
, bgp
->name
);
1070 DEFUN (bgp_confederation_identifier
,
1071 bgp_confederation_identifier_cmd
,
1072 "bgp confederation identifier (1-4294967295)",
1073 "BGP specific commands\n"
1074 "AS confederation parameters\n"
1076 "Set routing domain confederation AS\n")
1078 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1082 as
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1084 bgp_confederation_id_set(bgp
, as
);
1089 DEFUN (no_bgp_confederation_identifier
,
1090 no_bgp_confederation_identifier_cmd
,
1091 "no bgp confederation identifier [(1-4294967295)]",
1093 "BGP specific commands\n"
1094 "AS confederation parameters\n"
1096 "Set routing domain confederation AS\n")
1098 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1099 bgp_confederation_id_unset(bgp
);
1104 DEFUN (bgp_confederation_peers
,
1105 bgp_confederation_peers_cmd
,
1106 "bgp confederation peers (1-4294967295)...",
1107 "BGP specific commands\n"
1108 "AS confederation parameters\n"
1109 "Peer ASs in BGP confederation\n"
1112 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1117 for (i
= idx_asn
; i
< argc
; i
++) {
1118 as
= strtoul(argv
[i
]->arg
, NULL
, 10);
1120 if (bgp
->as
== as
) {
1122 "%% Local member-AS not allowed in confed peer list\n");
1126 bgp_confederation_peers_add(bgp
, as
);
1131 DEFUN (no_bgp_confederation_peers
,
1132 no_bgp_confederation_peers_cmd
,
1133 "no bgp confederation peers (1-4294967295)...",
1135 "BGP specific commands\n"
1136 "AS confederation parameters\n"
1137 "Peer ASs in BGP confederation\n"
1140 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1145 for (i
= idx_asn
; i
< argc
; i
++) {
1146 as
= strtoul(argv
[i
]->arg
, NULL
, 10);
1148 bgp_confederation_peers_remove(bgp
, as
);
1154 * Central routine for maximum-paths configuration.
1155 * @peer_type: BGP_PEER_EBGP or BGP_PEER_IBGP
1156 * @set: 1 for setting values, 0 for removing the max-paths config.
1158 static int bgp_maxpaths_config_vty(struct vty
*vty
, int peer_type
,
1159 const char *mpaths
, uint16_t options
,
1162 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1163 uint16_t maxpaths
= 0;
1168 afi
= bgp_node_afi(vty
);
1169 safi
= bgp_node_safi(vty
);
1172 maxpaths
= strtol(mpaths
, NULL
, 10);
1173 if (maxpaths
> multipath_num
) {
1175 "%% Maxpaths Specified: %d is > than multipath num specified on bgp command line %d",
1176 maxpaths
, multipath_num
);
1177 return CMD_WARNING_CONFIG_FAILED
;
1179 ret
= bgp_maximum_paths_set(bgp
, afi
, safi
, peer_type
, maxpaths
,
1182 ret
= bgp_maximum_paths_unset(bgp
, afi
, safi
, peer_type
);
1186 "%% Failed to %sset maximum-paths %s %u for afi %u, safi %u\n",
1187 (set
== 1) ? "" : "un",
1188 (peer_type
== BGP_PEER_EBGP
) ? "ebgp" : "ibgp",
1189 maxpaths
, afi
, safi
);
1190 return CMD_WARNING_CONFIG_FAILED
;
1193 bgp_recalculate_all_bestpaths(bgp
);
1198 DEFUN (bgp_maxmed_admin
,
1199 bgp_maxmed_admin_cmd
,
1200 "bgp max-med administrative ",
1202 "Advertise routes with max-med\n"
1203 "Administratively applied, for an indefinite period\n")
1205 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1207 bgp
->v_maxmed_admin
= 1;
1208 bgp
->maxmed_admin_value
= BGP_MAXMED_VALUE_DEFAULT
;
1210 bgp_maxmed_update(bgp
);
1215 DEFUN (bgp_maxmed_admin_medv
,
1216 bgp_maxmed_admin_medv_cmd
,
1217 "bgp max-med administrative (0-4294967295)",
1219 "Advertise routes with max-med\n"
1220 "Administratively applied, for an indefinite period\n"
1221 "Max MED value to be used\n")
1223 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1226 bgp
->v_maxmed_admin
= 1;
1227 bgp
->maxmed_admin_value
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1229 bgp_maxmed_update(bgp
);
1234 DEFUN (no_bgp_maxmed_admin
,
1235 no_bgp_maxmed_admin_cmd
,
1236 "no bgp max-med administrative [(0-4294967295)]",
1239 "Advertise routes with max-med\n"
1240 "Administratively applied, for an indefinite period\n"
1241 "Max MED value to be used\n")
1243 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1244 bgp
->v_maxmed_admin
= BGP_MAXMED_ADMIN_UNCONFIGURED
;
1245 bgp
->maxmed_admin_value
= BGP_MAXMED_VALUE_DEFAULT
;
1246 bgp_maxmed_update(bgp
);
1251 DEFUN (bgp_maxmed_onstartup
,
1252 bgp_maxmed_onstartup_cmd
,
1253 "bgp max-med on-startup (5-86400) [(0-4294967295)]",
1255 "Advertise routes with max-med\n"
1256 "Effective on a startup\n"
1257 "Time (seconds) period for max-med\n"
1258 "Max MED value to be used\n")
1260 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1263 argv_find(argv
, argc
, "(5-86400)", &idx
);
1264 bgp
->v_maxmed_onstartup
= strtoul(argv
[idx
]->arg
, NULL
, 10);
1265 if (argv_find(argv
, argc
, "(0-4294967295)", &idx
))
1266 bgp
->maxmed_onstartup_value
= strtoul(argv
[idx
]->arg
, NULL
, 10);
1268 bgp
->maxmed_onstartup_value
= BGP_MAXMED_VALUE_DEFAULT
;
1270 bgp_maxmed_update(bgp
);
1275 DEFUN (no_bgp_maxmed_onstartup
,
1276 no_bgp_maxmed_onstartup_cmd
,
1277 "no bgp max-med on-startup [(5-86400) [(0-4294967295)]]",
1280 "Advertise routes with max-med\n"
1281 "Effective on a startup\n"
1282 "Time (seconds) period for max-med\n"
1283 "Max MED value to be used\n")
1285 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1287 /* Cancel max-med onstartup if its on */
1288 if (bgp
->t_maxmed_onstartup
) {
1289 THREAD_TIMER_OFF(bgp
->t_maxmed_onstartup
);
1290 bgp
->maxmed_onstartup_over
= 1;
1293 bgp
->v_maxmed_onstartup
= BGP_MAXMED_ONSTARTUP_UNCONFIGURED
;
1294 bgp
->maxmed_onstartup_value
= BGP_MAXMED_VALUE_DEFAULT
;
1296 bgp_maxmed_update(bgp
);
1301 static int bgp_update_delay_config_vty(struct vty
*vty
, const char *delay
,
1304 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1305 uint16_t update_delay
;
1306 uint16_t establish_wait
;
1308 update_delay
= strtoul(delay
, NULL
, 10);
1310 if (!wait
) /* update-delay <delay> */
1312 bgp
->v_update_delay
= update_delay
;
1313 bgp
->v_establish_wait
= bgp
->v_update_delay
;
1317 /* update-delay <delay> <establish-wait> */
1318 establish_wait
= atoi(wait
);
1319 if (update_delay
< establish_wait
) {
1321 "%%Failed: update-delay less than the establish-wait!\n");
1322 return CMD_WARNING_CONFIG_FAILED
;
1325 bgp
->v_update_delay
= update_delay
;
1326 bgp
->v_establish_wait
= establish_wait
;
1331 static int bgp_update_delay_deconfig_vty(struct vty
*vty
)
1333 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1335 bgp
->v_update_delay
= BGP_UPDATE_DELAY_DEF
;
1336 bgp
->v_establish_wait
= bgp
->v_update_delay
;
1341 void bgp_config_write_update_delay(struct vty
*vty
, struct bgp
*bgp
)
1343 if (bgp
->v_update_delay
!= BGP_UPDATE_DELAY_DEF
) {
1344 vty_out(vty
, " update-delay %d", bgp
->v_update_delay
);
1345 if (bgp
->v_update_delay
!= bgp
->v_establish_wait
)
1346 vty_out(vty
, " %d", bgp
->v_establish_wait
);
1352 /* Update-delay configuration */
1353 DEFUN (bgp_update_delay
,
1354 bgp_update_delay_cmd
,
1355 "update-delay (0-3600)",
1356 "Force initial delay for best-path and updates\n"
1360 return bgp_update_delay_config_vty(vty
, argv
[idx_number
]->arg
, NULL
);
1363 DEFUN (bgp_update_delay_establish_wait
,
1364 bgp_update_delay_establish_wait_cmd
,
1365 "update-delay (0-3600) (1-3600)",
1366 "Force initial delay for best-path and updates\n"
1371 int idx_number_2
= 2;
1372 return bgp_update_delay_config_vty(vty
, argv
[idx_number
]->arg
,
1373 argv
[idx_number_2
]->arg
);
1376 /* Update-delay deconfiguration */
1377 DEFUN (no_bgp_update_delay
,
1378 no_bgp_update_delay_cmd
,
1379 "no update-delay [(0-3600) [(1-3600)]]",
1381 "Force initial delay for best-path and updates\n"
1385 return bgp_update_delay_deconfig_vty(vty
);
1389 static int bgp_wpkt_quanta_config_vty(struct vty
*vty
, const char *num
,
1392 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1395 uint32_t quanta
= strtoul(num
, NULL
, 10);
1396 atomic_store_explicit(&bgp
->wpkt_quanta
, quanta
,
1397 memory_order_relaxed
);
1399 atomic_store_explicit(&bgp
->wpkt_quanta
, BGP_WRITE_PACKET_MAX
,
1400 memory_order_relaxed
);
1406 static int bgp_rpkt_quanta_config_vty(struct vty
*vty
, const char *num
,
1409 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1412 uint32_t quanta
= strtoul(num
, NULL
, 10);
1413 atomic_store_explicit(&bgp
->rpkt_quanta
, quanta
,
1414 memory_order_relaxed
);
1416 atomic_store_explicit(&bgp
->rpkt_quanta
, BGP_READ_PACKET_MAX
,
1417 memory_order_relaxed
);
1423 void bgp_config_write_wpkt_quanta(struct vty
*vty
, struct bgp
*bgp
)
1426 atomic_load_explicit(&bgp
->wpkt_quanta
, memory_order_relaxed
);
1427 if (quanta
!= BGP_WRITE_PACKET_MAX
)
1428 vty_out(vty
, " write-quanta %d\n", quanta
);
1431 void bgp_config_write_rpkt_quanta(struct vty
*vty
, struct bgp
*bgp
)
1434 atomic_load_explicit(&bgp
->rpkt_quanta
, memory_order_relaxed
);
1435 if (quanta
!= BGP_READ_PACKET_MAX
)
1436 vty_out(vty
, " read-quanta %d\n", quanta
);
1439 /* Packet quanta configuration */
1440 DEFUN (bgp_wpkt_quanta
,
1441 bgp_wpkt_quanta_cmd
,
1442 "write-quanta (1-10)",
1443 "How many packets to write to peer socket per run\n"
1444 "Number of packets\n")
1447 return bgp_wpkt_quanta_config_vty(vty
, argv
[idx_number
]->arg
, 1);
1450 DEFUN (no_bgp_wpkt_quanta
,
1451 no_bgp_wpkt_quanta_cmd
,
1452 "no write-quanta (1-10)",
1454 "How many packets to write to peer socket per I/O cycle\n"
1455 "Number of packets\n")
1458 return bgp_wpkt_quanta_config_vty(vty
, argv
[idx_number
]->arg
, 0);
1461 DEFUN (bgp_rpkt_quanta
,
1462 bgp_rpkt_quanta_cmd
,
1463 "read-quanta (1-10)",
1464 "How many packets to read from peer socket per I/O cycle\n"
1465 "Number of packets\n")
1468 return bgp_rpkt_quanta_config_vty(vty
, argv
[idx_number
]->arg
, 1);
1471 DEFUN (no_bgp_rpkt_quanta
,
1472 no_bgp_rpkt_quanta_cmd
,
1473 "no read-quanta (1-10)",
1475 "How many packets to read from peer socket per I/O cycle\n"
1476 "Number of packets\n")
1479 return bgp_rpkt_quanta_config_vty(vty
, argv
[idx_number
]->arg
, 0);
1482 void bgp_config_write_coalesce_time(struct vty
*vty
, struct bgp
*bgp
)
1484 if (!bgp
->heuristic_coalesce
)
1485 vty_out(vty
, " coalesce-time %u\n", bgp
->coalesce_time
);
1489 DEFUN (bgp_coalesce_time
,
1490 bgp_coalesce_time_cmd
,
1491 "coalesce-time (0-4294967295)",
1492 "Subgroup coalesce timer\n"
1493 "Subgroup coalesce timer value (in ms)\n")
1495 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1498 argv_find(argv
, argc
, "(0-4294967295)", &idx
);
1499 bgp
->heuristic_coalesce
= false;
1500 bgp
->coalesce_time
= strtoul(argv
[idx
]->arg
, NULL
, 10);
1504 DEFUN (no_bgp_coalesce_time
,
1505 no_bgp_coalesce_time_cmd
,
1506 "no coalesce-time (0-4294967295)",
1508 "Subgroup coalesce timer\n"
1509 "Subgroup coalesce timer value (in ms)\n")
1511 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1513 bgp
->heuristic_coalesce
= true;
1514 bgp
->coalesce_time
= BGP_DEFAULT_SUBGROUP_COALESCE_TIME
;
1518 /* Maximum-paths configuration */
1519 DEFUN (bgp_maxpaths
,
1521 "maximum-paths " CMD_RANGE_STR(1, MULTIPATH_NUM
),
1522 "Forward packets over multiple paths\n"
1523 "Number of paths\n")
1526 return bgp_maxpaths_config_vty(vty
, BGP_PEER_EBGP
,
1527 argv
[idx_number
]->arg
, 0, 1);
1530 ALIAS_HIDDEN(bgp_maxpaths
, bgp_maxpaths_hidden_cmd
,
1531 "maximum-paths " CMD_RANGE_STR(1, MULTIPATH_NUM
),
1532 "Forward packets over multiple paths\n"
1533 "Number of paths\n")
1535 DEFUN (bgp_maxpaths_ibgp
,
1536 bgp_maxpaths_ibgp_cmd
,
1537 "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM
),
1538 "Forward packets over multiple paths\n"
1540 "Number of paths\n")
1543 return bgp_maxpaths_config_vty(vty
, BGP_PEER_IBGP
,
1544 argv
[idx_number
]->arg
, 0, 1);
1547 ALIAS_HIDDEN(bgp_maxpaths_ibgp
, bgp_maxpaths_ibgp_hidden_cmd
,
1548 "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM
),
1549 "Forward packets over multiple paths\n"
1551 "Number of paths\n")
1553 DEFUN (bgp_maxpaths_ibgp_cluster
,
1554 bgp_maxpaths_ibgp_cluster_cmd
,
1555 "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM
) " equal-cluster-length",
1556 "Forward packets over multiple paths\n"
1559 "Match the cluster length\n")
1562 return bgp_maxpaths_config_vty(
1563 vty
, BGP_PEER_IBGP
, argv
[idx_number
]->arg
,
1564 BGP_FLAG_IBGP_MULTIPATH_SAME_CLUSTERLEN
, 1);
1567 ALIAS_HIDDEN(bgp_maxpaths_ibgp_cluster
, bgp_maxpaths_ibgp_cluster_hidden_cmd
,
1568 "maximum-paths ibgp " CMD_RANGE_STR(
1569 1, MULTIPATH_NUM
) " equal-cluster-length",
1570 "Forward packets over multiple paths\n"
1573 "Match the cluster length\n")
1575 DEFUN (no_bgp_maxpaths
,
1576 no_bgp_maxpaths_cmd
,
1577 "no maximum-paths [" CMD_RANGE_STR(1, MULTIPATH_NUM
) "]",
1579 "Forward packets over multiple paths\n"
1580 "Number of paths\n")
1582 return bgp_maxpaths_config_vty(vty
, BGP_PEER_EBGP
, NULL
, 0, 0);
1585 ALIAS_HIDDEN(no_bgp_maxpaths
, no_bgp_maxpaths_hidden_cmd
,
1586 "no maximum-paths [" CMD_RANGE_STR(1, MULTIPATH_NUM
) "]", NO_STR
1587 "Forward packets over multiple paths\n"
1588 "Number of paths\n")
1590 DEFUN (no_bgp_maxpaths_ibgp
,
1591 no_bgp_maxpaths_ibgp_cmd
,
1592 "no maximum-paths ibgp [" CMD_RANGE_STR(1, MULTIPATH_NUM
) " [equal-cluster-length]]",
1594 "Forward packets over multiple paths\n"
1597 "Match the cluster length\n")
1599 return bgp_maxpaths_config_vty(vty
, BGP_PEER_IBGP
, NULL
, 0, 0);
1602 ALIAS_HIDDEN(no_bgp_maxpaths_ibgp
, no_bgp_maxpaths_ibgp_hidden_cmd
,
1603 "no maximum-paths ibgp [" CMD_RANGE_STR(
1604 1, MULTIPATH_NUM
) " [equal-cluster-length]]",
1606 "Forward packets over multiple paths\n"
1609 "Match the cluster length\n")
1611 void bgp_config_write_maxpaths(struct vty
*vty
, struct bgp
*bgp
, afi_t afi
,
1614 if (bgp
->maxpaths
[afi
][safi
].maxpaths_ebgp
!= MULTIPATH_NUM
) {
1615 vty_out(vty
, " maximum-paths %d\n",
1616 bgp
->maxpaths
[afi
][safi
].maxpaths_ebgp
);
1619 if (bgp
->maxpaths
[afi
][safi
].maxpaths_ibgp
!= MULTIPATH_NUM
) {
1620 vty_out(vty
, " maximum-paths ibgp %d",
1621 bgp
->maxpaths
[afi
][safi
].maxpaths_ibgp
);
1622 if (CHECK_FLAG(bgp
->maxpaths
[afi
][safi
].ibgp_flags
,
1623 BGP_FLAG_IBGP_MULTIPATH_SAME_CLUSTERLEN
))
1624 vty_out(vty
, " equal-cluster-length");
1633 "timers bgp (0-65535) (0-65535)",
1634 "Adjust routing timers\n"
1636 "Keepalive interval\n"
1639 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1641 int idx_number_2
= 3;
1642 unsigned long keepalive
= 0;
1643 unsigned long holdtime
= 0;
1645 keepalive
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1646 holdtime
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
1648 /* Holdtime value check. */
1649 if (holdtime
< 3 && holdtime
!= 0) {
1651 "%% hold time value must be either 0 or greater than 3\n");
1652 return CMD_WARNING_CONFIG_FAILED
;
1655 bgp_timers_set(bgp
, keepalive
, holdtime
);
1660 DEFUN (no_bgp_timers
,
1662 "no timers bgp [(0-65535) (0-65535)]",
1664 "Adjust routing timers\n"
1666 "Keepalive interval\n"
1669 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1670 bgp_timers_unset(bgp
);
1676 DEFUN (bgp_client_to_client_reflection
,
1677 bgp_client_to_client_reflection_cmd
,
1678 "bgp client-to-client reflection",
1679 "BGP specific commands\n"
1680 "Configure client to client route reflection\n"
1681 "reflection of routes allowed\n")
1683 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1684 bgp_flag_unset(bgp
, BGP_FLAG_NO_CLIENT_TO_CLIENT
);
1685 bgp_clear_star_soft_out(vty
, bgp
->name
);
1690 DEFUN (no_bgp_client_to_client_reflection
,
1691 no_bgp_client_to_client_reflection_cmd
,
1692 "no bgp client-to-client reflection",
1694 "BGP specific commands\n"
1695 "Configure client to client route reflection\n"
1696 "reflection of routes allowed\n")
1698 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1699 bgp_flag_set(bgp
, BGP_FLAG_NO_CLIENT_TO_CLIENT
);
1700 bgp_clear_star_soft_out(vty
, bgp
->name
);
1705 /* "bgp always-compare-med" configuration. */
1706 DEFUN (bgp_always_compare_med
,
1707 bgp_always_compare_med_cmd
,
1708 "bgp always-compare-med",
1709 "BGP specific commands\n"
1710 "Allow comparing MED from different neighbors\n")
1712 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1713 bgp_flag_set(bgp
, BGP_FLAG_ALWAYS_COMPARE_MED
);
1714 bgp_recalculate_all_bestpaths(bgp
);
1719 DEFUN (no_bgp_always_compare_med
,
1720 no_bgp_always_compare_med_cmd
,
1721 "no 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_unset(bgp
, BGP_FLAG_ALWAYS_COMPARE_MED
);
1728 bgp_recalculate_all_bestpaths(bgp
);
1733 /* "bgp deterministic-med" configuration. */
1734 DEFUN (bgp_deterministic_med
,
1735 bgp_deterministic_med_cmd
,
1736 "bgp deterministic-med",
1737 "BGP specific commands\n"
1738 "Pick the best-MED path among paths advertised from the neighboring AS\n")
1740 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1742 if (!bgp_flag_check(bgp
, BGP_FLAG_DETERMINISTIC_MED
)) {
1743 bgp_flag_set(bgp
, BGP_FLAG_DETERMINISTIC_MED
);
1744 bgp_recalculate_all_bestpaths(bgp
);
1750 DEFUN (no_bgp_deterministic_med
,
1751 no_bgp_deterministic_med_cmd
,
1752 "no bgp deterministic-med",
1754 "BGP specific commands\n"
1755 "Pick the best-MED path among paths advertised from the neighboring AS\n")
1757 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1758 int bestpath_per_as_used
;
1762 struct listnode
*node
, *nnode
;
1764 if (bgp_flag_check(bgp
, BGP_FLAG_DETERMINISTIC_MED
)) {
1765 bestpath_per_as_used
= 0;
1767 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
1768 FOREACH_AFI_SAFI (afi
, safi
)
1770 peer
->af_flags
[afi
][safi
],
1771 PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS
)) {
1772 bestpath_per_as_used
= 1;
1776 if (bestpath_per_as_used
)
1780 if (bestpath_per_as_used
) {
1782 "bgp deterministic-med cannot be disabled while addpath-tx-bestpath-per-AS is in use\n");
1783 return CMD_WARNING_CONFIG_FAILED
;
1785 bgp_flag_unset(bgp
, BGP_FLAG_DETERMINISTIC_MED
);
1786 bgp_recalculate_all_bestpaths(bgp
);
1793 /* "bgp graceful-restart" configuration. */
1794 DEFUN (bgp_graceful_restart
,
1795 bgp_graceful_restart_cmd
,
1796 "bgp graceful-restart",
1797 "BGP specific commands\n"
1798 "Graceful restart capability parameters\n")
1800 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1801 bgp_flag_set(bgp
, BGP_FLAG_GRACEFUL_RESTART
);
1805 DEFUN (no_bgp_graceful_restart
,
1806 no_bgp_graceful_restart_cmd
,
1807 "no bgp graceful-restart",
1809 "BGP specific commands\n"
1810 "Graceful restart capability parameters\n")
1812 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1813 bgp_flag_unset(bgp
, BGP_FLAG_GRACEFUL_RESTART
);
1817 DEFUN (bgp_graceful_restart_stalepath_time
,
1818 bgp_graceful_restart_stalepath_time_cmd
,
1819 "bgp graceful-restart stalepath-time (1-3600)",
1820 "BGP specific commands\n"
1821 "Graceful restart capability parameters\n"
1822 "Set the max time to hold onto restarting peer's stale paths\n"
1823 "Delay value (seconds)\n")
1825 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1829 stalepath
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1830 bgp
->stalepath_time
= stalepath
;
1834 DEFUN (bgp_graceful_restart_restart_time
,
1835 bgp_graceful_restart_restart_time_cmd
,
1836 "bgp graceful-restart restart-time (1-3600)",
1837 "BGP specific commands\n"
1838 "Graceful restart capability parameters\n"
1839 "Set the time to wait to delete stale routes before a BGP open message is received\n"
1840 "Delay value (seconds)\n")
1842 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1846 restart
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1847 bgp
->restart_time
= restart
;
1851 DEFUN (no_bgp_graceful_restart_stalepath_time
,
1852 no_bgp_graceful_restart_stalepath_time_cmd
,
1853 "no bgp graceful-restart stalepath-time [(1-3600)]",
1855 "BGP specific commands\n"
1856 "Graceful restart capability parameters\n"
1857 "Set the max time to hold onto restarting peer's stale paths\n"
1858 "Delay value (seconds)\n")
1860 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1862 bgp
->stalepath_time
= BGP_DEFAULT_STALEPATH_TIME
;
1866 DEFUN (no_bgp_graceful_restart_restart_time
,
1867 no_bgp_graceful_restart_restart_time_cmd
,
1868 "no bgp graceful-restart restart-time [(1-3600)]",
1870 "BGP specific commands\n"
1871 "Graceful restart capability parameters\n"
1872 "Set the time to wait to delete stale routes before a BGP open message is received\n"
1873 "Delay value (seconds)\n")
1875 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1877 bgp
->restart_time
= BGP_DEFAULT_RESTART_TIME
;
1881 DEFUN (bgp_graceful_restart_preserve_fw
,
1882 bgp_graceful_restart_preserve_fw_cmd
,
1883 "bgp graceful-restart preserve-fw-state",
1884 "BGP specific commands\n"
1885 "Graceful restart capability parameters\n"
1886 "Sets F-bit indication that fib is preserved while doing Graceful Restart\n")
1888 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1889 bgp_flag_set(bgp
, BGP_FLAG_GR_PRESERVE_FWD
);
1893 DEFUN (no_bgp_graceful_restart_preserve_fw
,
1894 no_bgp_graceful_restart_preserve_fw_cmd
,
1895 "no bgp graceful-restart preserve-fw-state",
1897 "BGP specific commands\n"
1898 "Graceful restart capability parameters\n"
1899 "Unsets F-bit indication that fib is preserved while doing Graceful Restart\n")
1901 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1902 bgp_flag_unset(bgp
, BGP_FLAG_GR_PRESERVE_FWD
);
1906 static void bgp_redistribute_redo(struct bgp
*bgp
)
1910 struct list
*red_list
;
1911 struct listnode
*node
;
1912 struct bgp_redist
*red
;
1914 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++) {
1915 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++) {
1917 red_list
= bgp
->redist
[afi
][i
];
1921 for (ALL_LIST_ELEMENTS_RO(red_list
, node
, red
)) {
1922 bgp_redistribute_resend(bgp
, afi
, i
,
1929 /* "bgp graceful-shutdown" configuration */
1930 DEFUN (bgp_graceful_shutdown
,
1931 bgp_graceful_shutdown_cmd
,
1932 "bgp graceful-shutdown",
1934 "Graceful shutdown parameters\n")
1936 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1938 if (!bgp_flag_check(bgp
, BGP_FLAG_GRACEFUL_SHUTDOWN
)) {
1939 bgp_flag_set(bgp
, BGP_FLAG_GRACEFUL_SHUTDOWN
);
1940 bgp_static_redo_import_check(bgp
);
1941 bgp_redistribute_redo(bgp
);
1942 bgp_clear_star_soft_out(vty
, bgp
->name
);
1943 bgp_clear_star_soft_in(vty
, bgp
->name
);
1949 DEFUN (no_bgp_graceful_shutdown
,
1950 no_bgp_graceful_shutdown_cmd
,
1951 "no bgp graceful-shutdown",
1954 "Graceful shutdown parameters\n")
1956 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1958 if (bgp_flag_check(bgp
, BGP_FLAG_GRACEFUL_SHUTDOWN
)) {
1959 bgp_flag_unset(bgp
, BGP_FLAG_GRACEFUL_SHUTDOWN
);
1960 bgp_static_redo_import_check(bgp
);
1961 bgp_redistribute_redo(bgp
);
1962 bgp_clear_star_soft_out(vty
, bgp
->name
);
1963 bgp_clear_star_soft_in(vty
, bgp
->name
);
1969 /* "bgp fast-external-failover" configuration. */
1970 DEFUN (bgp_fast_external_failover
,
1971 bgp_fast_external_failover_cmd
,
1972 "bgp fast-external-failover",
1974 "Immediately reset session if a link to a directly connected external peer goes down\n")
1976 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1977 bgp_flag_unset(bgp
, BGP_FLAG_NO_FAST_EXT_FAILOVER
);
1981 DEFUN (no_bgp_fast_external_failover
,
1982 no_bgp_fast_external_failover_cmd
,
1983 "no bgp fast-external-failover",
1986 "Immediately reset session if a link to a directly connected external peer goes down\n")
1988 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1989 bgp_flag_set(bgp
, BGP_FLAG_NO_FAST_EXT_FAILOVER
);
1993 /* "bgp enforce-first-as" configuration. */
1994 DEFUN (bgp_enforce_first_as
,
1995 bgp_enforce_first_as_cmd
,
1996 "bgp enforce-first-as",
1998 "Enforce the first AS for EBGP routes\n")
2000 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2001 bgp_flag_set(bgp
, BGP_FLAG_ENFORCE_FIRST_AS
);
2002 bgp_clear_star_soft_in(vty
, bgp
->name
);
2007 DEFUN (no_bgp_enforce_first_as
,
2008 no_bgp_enforce_first_as_cmd
,
2009 "no bgp enforce-first-as",
2012 "Enforce the first AS for EBGP routes\n")
2014 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2015 bgp_flag_unset(bgp
, BGP_FLAG_ENFORCE_FIRST_AS
);
2016 bgp_clear_star_soft_in(vty
, bgp
->name
);
2021 /* "bgp bestpath compare-routerid" configuration. */
2022 DEFUN (bgp_bestpath_compare_router_id
,
2023 bgp_bestpath_compare_router_id_cmd
,
2024 "bgp bestpath compare-routerid",
2025 "BGP specific commands\n"
2026 "Change the default bestpath selection\n"
2027 "Compare router-id for identical EBGP paths\n")
2029 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2030 bgp_flag_set(bgp
, BGP_FLAG_COMPARE_ROUTER_ID
);
2031 bgp_recalculate_all_bestpaths(bgp
);
2036 DEFUN (no_bgp_bestpath_compare_router_id
,
2037 no_bgp_bestpath_compare_router_id_cmd
,
2038 "no bgp bestpath compare-routerid",
2040 "BGP specific commands\n"
2041 "Change the default bestpath selection\n"
2042 "Compare router-id for identical EBGP paths\n")
2044 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2045 bgp_flag_unset(bgp
, BGP_FLAG_COMPARE_ROUTER_ID
);
2046 bgp_recalculate_all_bestpaths(bgp
);
2051 /* "bgp bestpath as-path ignore" configuration. */
2052 DEFUN (bgp_bestpath_aspath_ignore
,
2053 bgp_bestpath_aspath_ignore_cmd
,
2054 "bgp bestpath as-path ignore",
2055 "BGP specific commands\n"
2056 "Change the default bestpath selection\n"
2057 "AS-path attribute\n"
2058 "Ignore as-path length in selecting a route\n")
2060 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2061 bgp_flag_set(bgp
, BGP_FLAG_ASPATH_IGNORE
);
2062 bgp_recalculate_all_bestpaths(bgp
);
2067 DEFUN (no_bgp_bestpath_aspath_ignore
,
2068 no_bgp_bestpath_aspath_ignore_cmd
,
2069 "no bgp bestpath as-path ignore",
2071 "BGP specific commands\n"
2072 "Change the default bestpath selection\n"
2073 "AS-path attribute\n"
2074 "Ignore as-path length in selecting a route\n")
2076 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2077 bgp_flag_unset(bgp
, BGP_FLAG_ASPATH_IGNORE
);
2078 bgp_recalculate_all_bestpaths(bgp
);
2083 /* "bgp bestpath as-path confed" configuration. */
2084 DEFUN (bgp_bestpath_aspath_confed
,
2085 bgp_bestpath_aspath_confed_cmd
,
2086 "bgp bestpath as-path confed",
2087 "BGP specific commands\n"
2088 "Change the default bestpath selection\n"
2089 "AS-path attribute\n"
2090 "Compare path lengths including confederation sets & sequences in selecting a route\n")
2092 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2093 bgp_flag_set(bgp
, BGP_FLAG_ASPATH_CONFED
);
2094 bgp_recalculate_all_bestpaths(bgp
);
2099 DEFUN (no_bgp_bestpath_aspath_confed
,
2100 no_bgp_bestpath_aspath_confed_cmd
,
2101 "no bgp bestpath as-path confed",
2103 "BGP specific commands\n"
2104 "Change the default bestpath selection\n"
2105 "AS-path attribute\n"
2106 "Compare path lengths including confederation sets & sequences in selecting a route\n")
2108 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2109 bgp_flag_unset(bgp
, BGP_FLAG_ASPATH_CONFED
);
2110 bgp_recalculate_all_bestpaths(bgp
);
2115 /* "bgp bestpath as-path multipath-relax" configuration. */
2116 DEFUN (bgp_bestpath_aspath_multipath_relax
,
2117 bgp_bestpath_aspath_multipath_relax_cmd
,
2118 "bgp bestpath as-path multipath-relax [<as-set|no-as-set>]",
2119 "BGP specific commands\n"
2120 "Change the default bestpath selection\n"
2121 "AS-path attribute\n"
2122 "Allow load sharing across routes that have different AS paths (but same length)\n"
2123 "Generate an AS_SET\n"
2124 "Do not generate an AS_SET\n")
2126 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2128 bgp_flag_set(bgp
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
);
2130 /* no-as-set is now the default behavior so we can silently
2132 if (argv_find(argv
, argc
, "as-set", &idx
))
2133 bgp_flag_set(bgp
, BGP_FLAG_MULTIPATH_RELAX_AS_SET
);
2135 bgp_flag_unset(bgp
, BGP_FLAG_MULTIPATH_RELAX_AS_SET
);
2137 bgp_recalculate_all_bestpaths(bgp
);
2142 DEFUN (no_bgp_bestpath_aspath_multipath_relax
,
2143 no_bgp_bestpath_aspath_multipath_relax_cmd
,
2144 "no bgp bestpath as-path multipath-relax [<as-set|no-as-set>]",
2146 "BGP specific commands\n"
2147 "Change the default bestpath selection\n"
2148 "AS-path attribute\n"
2149 "Allow load sharing across routes that have different AS paths (but same length)\n"
2150 "Generate an AS_SET\n"
2151 "Do not generate an AS_SET\n")
2153 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2154 bgp_flag_unset(bgp
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
);
2155 bgp_flag_unset(bgp
, BGP_FLAG_MULTIPATH_RELAX_AS_SET
);
2156 bgp_recalculate_all_bestpaths(bgp
);
2161 /* "bgp log-neighbor-changes" configuration. */
2162 DEFUN (bgp_log_neighbor_changes
,
2163 bgp_log_neighbor_changes_cmd
,
2164 "bgp log-neighbor-changes",
2165 "BGP specific commands\n"
2166 "Log neighbor up/down and reset reason\n")
2168 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2169 bgp_flag_set(bgp
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
);
2173 DEFUN (no_bgp_log_neighbor_changes
,
2174 no_bgp_log_neighbor_changes_cmd
,
2175 "no bgp log-neighbor-changes",
2177 "BGP specific commands\n"
2178 "Log neighbor up/down and reset reason\n")
2180 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2181 bgp_flag_unset(bgp
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
);
2185 /* "bgp bestpath med" configuration. */
2186 DEFUN (bgp_bestpath_med
,
2187 bgp_bestpath_med_cmd
,
2188 "bgp bestpath med <confed [missing-as-worst]|missing-as-worst [confed]>",
2189 "BGP specific commands\n"
2190 "Change the default bestpath selection\n"
2192 "Compare MED among confederation paths\n"
2193 "Treat missing MED as the least preferred one\n"
2194 "Treat missing MED as the least preferred one\n"
2195 "Compare MED among confederation paths\n")
2197 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2200 if (argv_find(argv
, argc
, "confed", &idx
))
2201 bgp_flag_set(bgp
, BGP_FLAG_MED_CONFED
);
2203 if (argv_find(argv
, argc
, "missing-as-worst", &idx
))
2204 bgp_flag_set(bgp
, BGP_FLAG_MED_MISSING_AS_WORST
);
2206 bgp_recalculate_all_bestpaths(bgp
);
2211 DEFUN (no_bgp_bestpath_med
,
2212 no_bgp_bestpath_med_cmd
,
2213 "no bgp bestpath med <confed [missing-as-worst]|missing-as-worst [confed]>",
2215 "BGP specific commands\n"
2216 "Change the default bestpath selection\n"
2218 "Compare MED among confederation paths\n"
2219 "Treat missing MED as the least preferred one\n"
2220 "Treat missing MED as the least preferred one\n"
2221 "Compare MED among confederation paths\n")
2223 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2226 if (argv_find(argv
, argc
, "confed", &idx
))
2227 bgp_flag_unset(bgp
, BGP_FLAG_MED_CONFED
);
2229 if (argv_find(argv
, argc
, "missing-as-worst", &idx
))
2230 bgp_flag_unset(bgp
, BGP_FLAG_MED_MISSING_AS_WORST
);
2232 bgp_recalculate_all_bestpaths(bgp
);
2237 /* "no bgp default ipv4-unicast". */
2238 DEFUN (no_bgp_default_ipv4_unicast
,
2239 no_bgp_default_ipv4_unicast_cmd
,
2240 "no bgp default ipv4-unicast",
2242 "BGP specific commands\n"
2243 "Configure BGP defaults\n"
2244 "Activate ipv4-unicast for a peer by default\n")
2246 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2247 bgp_flag_set(bgp
, BGP_FLAG_NO_DEFAULT_IPV4
);
2251 DEFUN (bgp_default_ipv4_unicast
,
2252 bgp_default_ipv4_unicast_cmd
,
2253 "bgp default ipv4-unicast",
2254 "BGP specific commands\n"
2255 "Configure BGP defaults\n"
2256 "Activate ipv4-unicast for a peer by default\n")
2258 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2259 bgp_flag_unset(bgp
, BGP_FLAG_NO_DEFAULT_IPV4
);
2263 /* Display hostname in certain command outputs */
2264 DEFUN (bgp_default_show_hostname
,
2265 bgp_default_show_hostname_cmd
,
2266 "bgp default show-hostname",
2267 "BGP specific commands\n"
2268 "Configure BGP defaults\n"
2269 "Show hostname in certain command ouputs\n")
2271 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2272 bgp_flag_set(bgp
, BGP_FLAG_SHOW_HOSTNAME
);
2276 DEFUN (no_bgp_default_show_hostname
,
2277 no_bgp_default_show_hostname_cmd
,
2278 "no bgp default show-hostname",
2280 "BGP specific commands\n"
2281 "Configure BGP defaults\n"
2282 "Show hostname in certain command ouputs\n")
2284 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2285 bgp_flag_unset(bgp
, BGP_FLAG_SHOW_HOSTNAME
);
2289 /* "bgp network import-check" configuration. */
2290 DEFUN (bgp_network_import_check
,
2291 bgp_network_import_check_cmd
,
2292 "bgp network import-check",
2293 "BGP specific commands\n"
2294 "BGP network command\n"
2295 "Check BGP network route exists in IGP\n")
2297 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2298 if (!bgp_flag_check(bgp
, BGP_FLAG_IMPORT_CHECK
)) {
2299 bgp_flag_set(bgp
, BGP_FLAG_IMPORT_CHECK
);
2300 bgp_static_redo_import_check(bgp
);
2306 ALIAS_HIDDEN(bgp_network_import_check
, bgp_network_import_check_exact_cmd
,
2307 "bgp network import-check exact",
2308 "BGP specific commands\n"
2309 "BGP network command\n"
2310 "Check BGP network route exists in IGP\n"
2311 "Match route precisely\n")
2313 DEFUN (no_bgp_network_import_check
,
2314 no_bgp_network_import_check_cmd
,
2315 "no bgp network import-check",
2317 "BGP specific commands\n"
2318 "BGP network command\n"
2319 "Check BGP network route exists in IGP\n")
2321 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2322 if (bgp_flag_check(bgp
, BGP_FLAG_IMPORT_CHECK
)) {
2323 bgp_flag_unset(bgp
, BGP_FLAG_IMPORT_CHECK
);
2324 bgp_static_redo_import_check(bgp
);
2330 DEFUN (bgp_default_local_preference
,
2331 bgp_default_local_preference_cmd
,
2332 "bgp default local-preference (0-4294967295)",
2333 "BGP specific commands\n"
2334 "Configure BGP defaults\n"
2335 "local preference (higher=more preferred)\n"
2336 "Configure default local preference value\n")
2338 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2340 uint32_t local_pref
;
2342 local_pref
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2344 bgp_default_local_preference_set(bgp
, local_pref
);
2345 bgp_clear_star_soft_in(vty
, bgp
->name
);
2350 DEFUN (no_bgp_default_local_preference
,
2351 no_bgp_default_local_preference_cmd
,
2352 "no bgp default local-preference [(0-4294967295)]",
2354 "BGP specific commands\n"
2355 "Configure BGP defaults\n"
2356 "local preference (higher=more preferred)\n"
2357 "Configure default local preference value\n")
2359 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2360 bgp_default_local_preference_unset(bgp
);
2361 bgp_clear_star_soft_in(vty
, bgp
->name
);
2367 DEFUN (bgp_default_subgroup_pkt_queue_max
,
2368 bgp_default_subgroup_pkt_queue_max_cmd
,
2369 "bgp default subgroup-pkt-queue-max (20-100)",
2370 "BGP specific commands\n"
2371 "Configure BGP defaults\n"
2372 "subgroup-pkt-queue-max\n"
2373 "Configure subgroup packet queue max\n")
2375 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2379 max_size
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2381 bgp_default_subgroup_pkt_queue_max_set(bgp
, max_size
);
2386 DEFUN (no_bgp_default_subgroup_pkt_queue_max
,
2387 no_bgp_default_subgroup_pkt_queue_max_cmd
,
2388 "no bgp default subgroup-pkt-queue-max [(20-100)]",
2390 "BGP specific commands\n"
2391 "Configure BGP defaults\n"
2392 "subgroup-pkt-queue-max\n"
2393 "Configure subgroup packet queue max\n")
2395 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2396 bgp_default_subgroup_pkt_queue_max_unset(bgp
);
2401 DEFUN (bgp_rr_allow_outbound_policy
,
2402 bgp_rr_allow_outbound_policy_cmd
,
2403 "bgp route-reflector allow-outbound-policy",
2404 "BGP specific commands\n"
2405 "Allow modifications made by out route-map\n"
2406 "on ibgp neighbors\n")
2408 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2410 if (!bgp_flag_check(bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
)) {
2411 bgp_flag_set(bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
);
2412 update_group_announce_rrclients(bgp
);
2413 bgp_clear_star_soft_out(vty
, bgp
->name
);
2419 DEFUN (no_bgp_rr_allow_outbound_policy
,
2420 no_bgp_rr_allow_outbound_policy_cmd
,
2421 "no bgp route-reflector allow-outbound-policy",
2423 "BGP specific commands\n"
2424 "Allow modifications made by out route-map\n"
2425 "on ibgp neighbors\n")
2427 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2429 if (bgp_flag_check(bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
)) {
2430 bgp_flag_unset(bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
);
2431 update_group_announce_rrclients(bgp
);
2432 bgp_clear_star_soft_out(vty
, bgp
->name
);
2438 DEFUN (bgp_listen_limit
,
2439 bgp_listen_limit_cmd
,
2440 "bgp listen limit (1-5000)",
2441 "BGP specific commands\n"
2442 "Configure BGP defaults\n"
2443 "maximum number of BGP Dynamic Neighbors that can be created\n"
2444 "Configure Dynamic Neighbors listen limit value\n")
2446 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2450 listen_limit
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2452 bgp_listen_limit_set(bgp
, listen_limit
);
2457 DEFUN (no_bgp_listen_limit
,
2458 no_bgp_listen_limit_cmd
,
2459 "no bgp listen limit [(1-5000)]",
2460 "BGP specific commands\n"
2461 "Configure BGP defaults\n"
2462 "unset maximum number of BGP Dynamic Neighbors that can be created\n"
2463 "Configure Dynamic Neighbors listen limit value to default\n"
2464 "Configure Dynamic Neighbors listen limit value\n")
2466 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2467 bgp_listen_limit_unset(bgp
);
2473 * Check if this listen range is already configured. Check for exact
2474 * match or overlap based on input.
2476 static struct peer_group
*listen_range_exists(struct bgp
*bgp
,
2477 struct prefix
*range
, int exact
)
2479 struct listnode
*node
, *nnode
;
2480 struct listnode
*node1
, *nnode1
;
2481 struct peer_group
*group
;
2486 afi
= family2afi(range
->family
);
2487 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
2488 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], node1
, nnode1
,
2491 match
= prefix_same(range
, lr
);
2493 match
= (prefix_match(range
, lr
)
2494 || prefix_match(lr
, range
));
2503 DEFUN (bgp_listen_range
,
2504 bgp_listen_range_cmd
,
2505 "bgp listen range <A.B.C.D/M|X:X::X:X/M> peer-group WORD",
2506 "BGP specific commands\n"
2507 "Configure BGP dynamic neighbors listen range\n"
2508 "Configure BGP dynamic neighbors listen range\n"
2510 "Member of the peer-group\n"
2511 "Peer-group name\n")
2513 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2514 struct prefix range
;
2515 struct peer_group
*group
, *existing_group
;
2520 argv_find(argv
, argc
, "A.B.C.D/M", &idx
);
2521 argv_find(argv
, argc
, "X:X::X:X/M", &idx
);
2522 char *prefix
= argv
[idx
]->arg
;
2523 argv_find(argv
, argc
, "WORD", &idx
);
2524 char *peergroup
= argv
[idx
]->arg
;
2526 /* Convert IP prefix string to struct prefix. */
2527 ret
= str2prefix(prefix
, &range
);
2529 vty_out(vty
, "%% Malformed listen range\n");
2530 return CMD_WARNING_CONFIG_FAILED
;
2533 afi
= family2afi(range
.family
);
2535 if (afi
== AFI_IP6
&& IN6_IS_ADDR_LINKLOCAL(&range
.u
.prefix6
)) {
2537 "%% Malformed listen range (link-local address)\n");
2538 return CMD_WARNING_CONFIG_FAILED
;
2543 /* Check if same listen range is already configured. */
2544 existing_group
= listen_range_exists(bgp
, &range
, 1);
2545 if (existing_group
) {
2546 if (strcmp(existing_group
->name
, peergroup
) == 0)
2550 "%% Same listen range is attached to peer-group %s\n",
2551 existing_group
->name
);
2552 return CMD_WARNING_CONFIG_FAILED
;
2556 /* Check if an overlapping listen range exists. */
2557 if (listen_range_exists(bgp
, &range
, 0)) {
2559 "%% Listen range overlaps with existing listen range\n");
2560 return CMD_WARNING_CONFIG_FAILED
;
2563 group
= peer_group_lookup(bgp
, peergroup
);
2565 vty_out(vty
, "%% Configure the peer-group first\n");
2566 return CMD_WARNING_CONFIG_FAILED
;
2569 ret
= peer_group_listen_range_add(group
, &range
);
2570 return bgp_vty_return(vty
, ret
);
2573 DEFUN (no_bgp_listen_range
,
2574 no_bgp_listen_range_cmd
,
2575 "no bgp listen range <A.B.C.D/M|X:X::X:X/M> peer-group WORD",
2577 "BGP specific commands\n"
2578 "Unconfigure BGP dynamic neighbors listen range\n"
2579 "Unconfigure BGP dynamic neighbors listen range\n"
2581 "Member of the peer-group\n"
2582 "Peer-group name\n")
2584 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2585 struct prefix range
;
2586 struct peer_group
*group
;
2591 argv_find(argv
, argc
, "A.B.C.D/M", &idx
);
2592 argv_find(argv
, argc
, "X:X::X:X/M", &idx
);
2593 char *prefix
= argv
[idx
]->arg
;
2594 argv_find(argv
, argc
, "WORD", &idx
);
2595 char *peergroup
= argv
[idx
]->arg
;
2597 /* Convert IP prefix string to struct prefix. */
2598 ret
= str2prefix(prefix
, &range
);
2600 vty_out(vty
, "%% Malformed listen range\n");
2601 return CMD_WARNING_CONFIG_FAILED
;
2604 afi
= family2afi(range
.family
);
2606 if (afi
== AFI_IP6
&& IN6_IS_ADDR_LINKLOCAL(&range
.u
.prefix6
)) {
2608 "%% Malformed listen range (link-local address)\n");
2609 return CMD_WARNING_CONFIG_FAILED
;
2614 group
= peer_group_lookup(bgp
, peergroup
);
2616 vty_out(vty
, "%% Peer-group does not exist\n");
2617 return CMD_WARNING_CONFIG_FAILED
;
2620 ret
= peer_group_listen_range_del(group
, &range
);
2621 return bgp_vty_return(vty
, ret
);
2624 void bgp_config_write_listen(struct vty
*vty
, struct bgp
*bgp
)
2626 struct peer_group
*group
;
2627 struct listnode
*node
, *nnode
, *rnode
, *nrnode
;
2628 struct prefix
*range
;
2630 char buf
[PREFIX2STR_BUFFER
];
2632 if (bgp
->dynamic_neighbors_limit
!= BGP_DYNAMIC_NEIGHBORS_LIMIT_DEFAULT
)
2633 vty_out(vty
, " bgp listen limit %d\n",
2634 bgp
->dynamic_neighbors_limit
);
2636 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
2637 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++) {
2638 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], rnode
,
2640 prefix2str(range
, buf
, sizeof(buf
));
2642 " bgp listen range %s peer-group %s\n",
2650 DEFUN (bgp_disable_connected_route_check
,
2651 bgp_disable_connected_route_check_cmd
,
2652 "bgp disable-ebgp-connected-route-check",
2653 "BGP specific commands\n"
2654 "Disable checking if nexthop is connected on ebgp sessions\n")
2656 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2657 bgp_flag_set(bgp
, BGP_FLAG_DISABLE_NH_CONNECTED_CHK
);
2658 bgp_clear_star_soft_in(vty
, bgp
->name
);
2663 DEFUN (no_bgp_disable_connected_route_check
,
2664 no_bgp_disable_connected_route_check_cmd
,
2665 "no bgp disable-ebgp-connected-route-check",
2667 "BGP specific commands\n"
2668 "Disable checking if nexthop is connected on ebgp sessions\n")
2670 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2671 bgp_flag_unset(bgp
, BGP_FLAG_DISABLE_NH_CONNECTED_CHK
);
2672 bgp_clear_star_soft_in(vty
, bgp
->name
);
2678 static int peer_remote_as_vty(struct vty
*vty
, const char *peer_str
,
2679 const char *as_str
, afi_t afi
, safi_t safi
)
2681 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2684 int as_type
= AS_SPECIFIED
;
2687 if (as_str
[0] == 'i') {
2689 as_type
= AS_INTERNAL
;
2690 } else if (as_str
[0] == 'e') {
2692 as_type
= AS_EXTERNAL
;
2694 /* Get AS number. */
2695 as
= strtoul(as_str
, NULL
, 10);
2698 /* If peer is peer group, call proper function. */
2699 ret
= str2sockunion(peer_str
, &su
);
2701 /* Check for peer by interface */
2702 ret
= peer_remote_as(bgp
, NULL
, peer_str
, &as
, as_type
, afi
,
2705 ret
= peer_group_remote_as(bgp
, peer_str
, &as
, as_type
);
2708 "%% Create the peer-group or interface first\n");
2709 return CMD_WARNING_CONFIG_FAILED
;
2714 if (peer_address_self_check(bgp
, &su
)) {
2716 "%% Can not configure the local system as neighbor\n");
2717 return CMD_WARNING_CONFIG_FAILED
;
2719 ret
= peer_remote_as(bgp
, &su
, NULL
, &as
, as_type
, afi
, safi
);
2722 /* This peer belongs to peer group. */
2724 case BGP_ERR_PEER_GROUP_MEMBER
:
2726 "%% Peer-group AS %u. Cannot configure remote-as for member\n",
2728 return CMD_WARNING_CONFIG_FAILED
;
2729 case BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
:
2731 "%% The AS# can not be changed from %u to %s, peer-group members must be all internal or all external\n",
2733 return CMD_WARNING_CONFIG_FAILED
;
2735 return bgp_vty_return(vty
, ret
);
2738 DEFUN (bgp_default_shutdown
,
2739 bgp_default_shutdown_cmd
,
2740 "[no] bgp default shutdown",
2743 "Configure BGP defaults\n"
2744 "Apply administrative shutdown to newly configured peers\n")
2746 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2747 bgp
->autoshutdown
= !strmatch(argv
[0]->text
, "no");
2751 DEFUN (neighbor_remote_as
,
2752 neighbor_remote_as_cmd
,
2753 "neighbor <A.B.C.D|X:X::X:X|WORD> remote-as <(1-4294967295)|internal|external>",
2756 "Specify a BGP neighbor\n"
2758 "Internal BGP peer\n"
2759 "External BGP peer\n")
2762 int idx_remote_as
= 3;
2763 return peer_remote_as_vty(vty
, argv
[idx_peer
]->arg
,
2764 argv
[idx_remote_as
]->arg
, AFI_IP
,
2768 static int peer_conf_interface_get(struct vty
*vty
, const char *conf_if
,
2769 afi_t afi
, safi_t safi
, int v6only
,
2770 const char *peer_group_name
,
2773 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2775 int as_type
= AS_UNSPECIFIED
;
2777 struct peer_group
*group
;
2781 group
= peer_group_lookup(bgp
, conf_if
);
2784 vty_out(vty
, "%% Name conflict with peer-group \n");
2785 return CMD_WARNING_CONFIG_FAILED
;
2789 if (as_str
[0] == 'i') {
2790 as_type
= AS_INTERNAL
;
2791 } else if (as_str
[0] == 'e') {
2792 as_type
= AS_EXTERNAL
;
2794 /* Get AS number. */
2795 as
= strtoul(as_str
, NULL
, 10);
2796 as_type
= AS_SPECIFIED
;
2800 peer
= peer_lookup_by_conf_if(bgp
, conf_if
);
2803 ret
= peer_remote_as(bgp
, &su
, conf_if
, &as
, as_type
,
2806 if (bgp_flag_check(bgp
, BGP_FLAG_NO_DEFAULT_IPV4
)
2807 && afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
2808 peer
= peer_create(NULL
, conf_if
, bgp
, bgp
->as
, as
,
2809 as_type
, 0, 0, NULL
);
2811 peer
= peer_create(NULL
, conf_if
, bgp
, bgp
->as
, as
,
2812 as_type
, afi
, safi
, NULL
);
2815 vty_out(vty
, "%% BGP failed to create peer\n");
2816 return CMD_WARNING_CONFIG_FAILED
;
2820 SET_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
);
2822 /* Request zebra to initiate IPv6 RAs on this interface. We do
2824 * any unnumbered peer in order to not worry about run-time
2826 * (e.g., peering is initially IPv4, but the IPv4 /30 or /31
2828 * gets deleted later etc.)
2831 bgp_zebra_initiate_radv(bgp
, peer
);
2834 if ((v6only
&& !CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
))
2835 || (!v6only
&& CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
))) {
2837 SET_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
);
2839 UNSET_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
);
2841 /* v6only flag changed. Reset bgp seesion */
2842 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
2843 peer
->last_reset
= PEER_DOWN_V6ONLY_CHANGE
;
2844 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
2845 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2847 bgp_session_reset(peer
);
2850 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CAPABILITY_ENHE
))
2851 peer_flag_set(peer
, PEER_FLAG_CAPABILITY_ENHE
);
2853 if (peer_group_name
) {
2854 group
= peer_group_lookup(bgp
, peer_group_name
);
2856 vty_out(vty
, "%% Configure the peer-group first\n");
2857 return CMD_WARNING_CONFIG_FAILED
;
2860 ret
= peer_group_bind(bgp
, &su
, peer
, group
, &as
);
2863 return bgp_vty_return(vty
, ret
);
2866 DEFUN (neighbor_interface_config
,
2867 neighbor_interface_config_cmd
,
2868 "neighbor WORD interface [peer-group WORD]",
2870 "Interface name or neighbor tag\n"
2871 "Enable BGP on interface\n"
2872 "Member of the peer-group\n"
2873 "Peer-group name\n")
2876 int idx_peer_group_word
= 4;
2878 if (argc
> idx_peer_group_word
)
2879 return peer_conf_interface_get(
2880 vty
, argv
[idx_word
]->arg
, AFI_IP
, SAFI_UNICAST
, 0,
2881 argv
[idx_peer_group_word
]->arg
, NULL
);
2883 return peer_conf_interface_get(vty
, argv
[idx_word
]->arg
, AFI_IP
,
2884 SAFI_UNICAST
, 0, NULL
, NULL
);
2887 DEFUN (neighbor_interface_config_v6only
,
2888 neighbor_interface_config_v6only_cmd
,
2889 "neighbor WORD interface v6only [peer-group WORD]",
2891 "Interface name or neighbor tag\n"
2892 "Enable BGP on interface\n"
2893 "Enable BGP with v6 link-local only\n"
2894 "Member of the peer-group\n"
2895 "Peer-group name\n")
2898 int idx_peer_group_word
= 5;
2900 if (argc
> idx_peer_group_word
)
2901 return peer_conf_interface_get(
2902 vty
, argv
[idx_word
]->arg
, AFI_IP
, SAFI_UNICAST
, 1,
2903 argv
[idx_peer_group_word
]->arg
, NULL
);
2905 return peer_conf_interface_get(vty
, argv
[idx_word
]->arg
, AFI_IP
,
2906 SAFI_UNICAST
, 1, NULL
, NULL
);
2910 DEFUN (neighbor_interface_config_remote_as
,
2911 neighbor_interface_config_remote_as_cmd
,
2912 "neighbor WORD interface remote-as <(1-4294967295)|internal|external>",
2914 "Interface name or neighbor tag\n"
2915 "Enable BGP on interface\n"
2916 "Specify a BGP neighbor\n"
2918 "Internal BGP peer\n"
2919 "External BGP peer\n")
2922 int idx_remote_as
= 4;
2923 return peer_conf_interface_get(vty
, argv
[idx_word
]->arg
, AFI_IP
,
2924 SAFI_UNICAST
, 0, NULL
,
2925 argv
[idx_remote_as
]->arg
);
2928 DEFUN (neighbor_interface_v6only_config_remote_as
,
2929 neighbor_interface_v6only_config_remote_as_cmd
,
2930 "neighbor WORD interface v6only remote-as <(1-4294967295)|internal|external>",
2932 "Interface name or neighbor tag\n"
2933 "Enable BGP with v6 link-local only\n"
2934 "Enable BGP on interface\n"
2935 "Specify a BGP neighbor\n"
2937 "Internal BGP peer\n"
2938 "External BGP peer\n")
2941 int idx_remote_as
= 5;
2942 return peer_conf_interface_get(vty
, argv
[idx_word
]->arg
, AFI_IP
,
2943 SAFI_UNICAST
, 1, NULL
,
2944 argv
[idx_remote_as
]->arg
);
2947 DEFUN (neighbor_peer_group
,
2948 neighbor_peer_group_cmd
,
2949 "neighbor WORD peer-group",
2951 "Interface name or neighbor tag\n"
2952 "Configure peer-group\n")
2954 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2957 struct peer_group
*group
;
2959 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_word
]->arg
);
2961 vty_out(vty
, "%% Name conflict with interface: \n");
2962 return CMD_WARNING_CONFIG_FAILED
;
2965 group
= peer_group_get(bgp
, argv
[idx_word
]->arg
);
2967 vty_out(vty
, "%% BGP failed to find or create peer-group\n");
2968 return CMD_WARNING_CONFIG_FAILED
;
2976 "no neighbor <WORD|<A.B.C.D|X:X::X:X> [remote-as <(1-4294967295)|internal|external>]>",
2980 "Specify a BGP neighbor\n"
2982 "Internal BGP peer\n"
2983 "External BGP peer\n")
2985 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2989 struct peer_group
*group
;
2993 ret
= str2sockunion(argv
[idx_peer
]->arg
, &su
);
2995 /* look up for neighbor by interface name config. */
2996 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_peer
]->arg
);
2998 /* Request zebra to terminate IPv6 RAs on this
3001 bgp_zebra_terminate_radv(peer
->bgp
, peer
);
3006 group
= peer_group_lookup(bgp
, argv
[idx_peer
]->arg
);
3008 peer_group_delete(group
);
3010 vty_out(vty
, "%% Create the peer-group first\n");
3011 return CMD_WARNING_CONFIG_FAILED
;
3014 peer
= peer_lookup(bgp
, &su
);
3016 if (peer_dynamic_neighbor(peer
)) {
3018 "%% Operation not allowed on a dynamic neighbor\n");
3019 return CMD_WARNING_CONFIG_FAILED
;
3022 other
= peer
->doppelganger
;
3024 if (other
&& other
->status
!= Deleted
)
3032 DEFUN (no_neighbor_interface_config
,
3033 no_neighbor_interface_config_cmd
,
3034 "no neighbor WORD interface [v6only] [peer-group WORD] [remote-as <(1-4294967295)|internal|external>]",
3038 "Configure BGP on interface\n"
3039 "Enable BGP with v6 link-local only\n"
3040 "Member of the peer-group\n"
3042 "Specify a BGP neighbor\n"
3044 "Internal BGP peer\n"
3045 "External BGP peer\n")
3047 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3051 /* look up for neighbor by interface name config. */
3052 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_word
]->arg
);
3054 /* Request zebra to terminate IPv6 RAs on this interface. */
3056 bgp_zebra_terminate_radv(peer
->bgp
, peer
);
3059 vty_out(vty
, "%% Create the bgp interface first\n");
3060 return CMD_WARNING_CONFIG_FAILED
;
3065 DEFUN (no_neighbor_peer_group
,
3066 no_neighbor_peer_group_cmd
,
3067 "no neighbor WORD peer-group",
3071 "Configure peer-group\n")
3073 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3075 struct peer_group
*group
;
3077 group
= peer_group_lookup(bgp
, argv
[idx_word
]->arg
);
3079 peer_group_delete(group
);
3081 vty_out(vty
, "%% Create the peer-group first\n");
3082 return CMD_WARNING_CONFIG_FAILED
;
3087 DEFUN (no_neighbor_interface_peer_group_remote_as
,
3088 no_neighbor_interface_peer_group_remote_as_cmd
,
3089 "no neighbor WORD remote-as <(1-4294967295)|internal|external>",
3092 "Interface name or neighbor tag\n"
3093 "Specify a BGP neighbor\n"
3095 "Internal BGP peer\n"
3096 "External BGP peer\n")
3098 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3100 struct peer_group
*group
;
3103 /* look up for neighbor by interface name config. */
3104 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_word
]->arg
);
3106 peer_as_change(peer
, 0, AS_SPECIFIED
);
3110 group
= peer_group_lookup(bgp
, argv
[idx_word
]->arg
);
3112 peer_group_remote_as_delete(group
);
3114 vty_out(vty
, "%% Create the peer-group or interface first\n");
3115 return CMD_WARNING_CONFIG_FAILED
;
3120 DEFUN (neighbor_local_as
,
3121 neighbor_local_as_cmd
,
3122 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295)",
3125 "Specify a local-as number\n"
3126 "AS number used as local AS\n")
3134 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3136 return CMD_WARNING_CONFIG_FAILED
;
3138 as
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
3139 ret
= peer_local_as_set(peer
, as
, 0, 0);
3140 return bgp_vty_return(vty
, ret
);
3143 DEFUN (neighbor_local_as_no_prepend
,
3144 neighbor_local_as_no_prepend_cmd
,
3145 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295) no-prepend",
3148 "Specify a local-as number\n"
3149 "AS number used as local AS\n"
3150 "Do not prepend local-as to updates from ebgp peers\n")
3158 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3160 return CMD_WARNING_CONFIG_FAILED
;
3162 as
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
3163 ret
= peer_local_as_set(peer
, as
, 1, 0);
3164 return bgp_vty_return(vty
, ret
);
3167 DEFUN (neighbor_local_as_no_prepend_replace_as
,
3168 neighbor_local_as_no_prepend_replace_as_cmd
,
3169 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295) no-prepend replace-as",
3172 "Specify a local-as number\n"
3173 "AS number used as local AS\n"
3174 "Do not prepend local-as to updates from ebgp peers\n"
3175 "Do not prepend local-as to updates from ibgp peers\n")
3183 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3185 return CMD_WARNING_CONFIG_FAILED
;
3187 as
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
3188 ret
= peer_local_as_set(peer
, as
, 1, 1);
3189 return bgp_vty_return(vty
, ret
);
3192 DEFUN (no_neighbor_local_as
,
3193 no_neighbor_local_as_cmd
,
3194 "no neighbor <A.B.C.D|X:X::X:X|WORD> local-as [(1-4294967295) [no-prepend [replace-as]]]",
3198 "Specify a local-as number\n"
3199 "AS number used as local AS\n"
3200 "Do not prepend local-as to updates from ebgp peers\n"
3201 "Do not prepend local-as to updates from ibgp peers\n")
3207 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3209 return CMD_WARNING_CONFIG_FAILED
;
3211 ret
= peer_local_as_unset(peer
);
3212 return bgp_vty_return(vty
, ret
);
3216 DEFUN (neighbor_solo
,
3218 "neighbor <A.B.C.D|X:X::X:X|WORD> solo",
3221 "Solo peer - part of its own update group\n")
3227 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3229 return CMD_WARNING_CONFIG_FAILED
;
3231 ret
= update_group_adjust_soloness(peer
, 1);
3232 return bgp_vty_return(vty
, ret
);
3235 DEFUN (no_neighbor_solo
,
3236 no_neighbor_solo_cmd
,
3237 "no neighbor <A.B.C.D|X:X::X:X|WORD> solo",
3241 "Solo peer - part of its own update group\n")
3247 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3249 return CMD_WARNING_CONFIG_FAILED
;
3251 ret
= update_group_adjust_soloness(peer
, 0);
3252 return bgp_vty_return(vty
, ret
);
3255 DEFUN (neighbor_password
,
3256 neighbor_password_cmd
,
3257 "neighbor <A.B.C.D|X:X::X:X|WORD> password LINE",
3268 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3270 return CMD_WARNING_CONFIG_FAILED
;
3272 ret
= peer_password_set(peer
, argv
[idx_line
]->arg
);
3273 return bgp_vty_return(vty
, ret
);
3276 DEFUN (no_neighbor_password
,
3277 no_neighbor_password_cmd
,
3278 "no neighbor <A.B.C.D|X:X::X:X|WORD> password [LINE]",
3289 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3291 return CMD_WARNING_CONFIG_FAILED
;
3293 ret
= peer_password_unset(peer
);
3294 return bgp_vty_return(vty
, ret
);
3297 DEFUN (neighbor_activate
,
3298 neighbor_activate_cmd
,
3299 "neighbor <A.B.C.D|X:X::X:X|WORD> activate",
3302 "Enable the Address Family for this Neighbor\n")
3308 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3310 return CMD_WARNING_CONFIG_FAILED
;
3312 ret
= peer_activate(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
));
3313 return bgp_vty_return(vty
, ret
);
3316 ALIAS_HIDDEN(neighbor_activate
, neighbor_activate_hidden_cmd
,
3317 "neighbor <A.B.C.D|X:X::X:X|WORD> activate",
3318 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3319 "Enable the Address Family for this Neighbor\n")
3321 DEFUN (no_neighbor_activate
,
3322 no_neighbor_activate_cmd
,
3323 "no neighbor <A.B.C.D|X:X::X:X|WORD> activate",
3327 "Enable the Address Family for this Neighbor\n")
3334 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3336 return CMD_WARNING_CONFIG_FAILED
;
3338 ret
= peer_deactivate(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
));
3339 return bgp_vty_return(vty
, ret
);
3342 ALIAS_HIDDEN(no_neighbor_activate
, no_neighbor_activate_hidden_cmd
,
3343 "no neighbor <A.B.C.D|X:X::X:X|WORD> activate",
3344 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3345 "Enable the Address Family for this Neighbor\n")
3347 DEFUN (neighbor_set_peer_group
,
3348 neighbor_set_peer_group_cmd
,
3349 "neighbor <A.B.C.D|X:X::X:X|WORD> peer-group WORD",
3352 "Member of the peer-group\n"
3353 "Peer-group name\n")
3355 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3362 struct peer_group
*group
;
3366 ret
= str2sockunion(argv
[idx_peer
]->arg
, &su
);
3368 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_peer
]->arg
);
3370 vty_out(vty
, "%% Malformed address or name: %s\n",
3371 argv
[idx_peer
]->arg
);
3372 return CMD_WARNING_CONFIG_FAILED
;
3375 if (peer_address_self_check(bgp
, &su
)) {
3377 "%% Can not configure the local system as neighbor\n");
3378 return CMD_WARNING_CONFIG_FAILED
;
3381 /* Disallow for dynamic neighbor. */
3382 peer
= peer_lookup(bgp
, &su
);
3383 if (peer
&& peer_dynamic_neighbor(peer
)) {
3385 "%% Operation not allowed on a dynamic neighbor\n");
3386 return CMD_WARNING_CONFIG_FAILED
;
3390 group
= peer_group_lookup(bgp
, argv
[idx_word
]->arg
);
3392 vty_out(vty
, "%% Configure the peer-group first\n");
3393 return CMD_WARNING_CONFIG_FAILED
;
3396 ret
= peer_group_bind(bgp
, &su
, peer
, group
, &as
);
3398 if (ret
== BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
) {
3400 "%% Peer with AS %u cannot be in this peer-group, members must be all internal or all external\n",
3402 return CMD_WARNING_CONFIG_FAILED
;
3405 return bgp_vty_return(vty
, ret
);
3408 ALIAS_HIDDEN(neighbor_set_peer_group
, neighbor_set_peer_group_hidden_cmd
,
3409 "neighbor <A.B.C.D|X:X::X:X|WORD> peer-group WORD",
3410 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3411 "Member of the peer-group\n"
3412 "Peer-group name\n")
3414 DEFUN (no_neighbor_set_peer_group
,
3415 no_neighbor_set_peer_group_cmd
,
3416 "no neighbor <A.B.C.D|X:X::X:X|WORD> peer-group WORD",
3420 "Member of the peer-group\n"
3421 "Peer-group name\n")
3423 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3428 struct peer_group
*group
;
3430 peer
= peer_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3432 return CMD_WARNING_CONFIG_FAILED
;
3434 group
= peer_group_lookup(bgp
, argv
[idx_word
]->arg
);
3436 vty_out(vty
, "%% Configure the peer-group first\n");
3437 return CMD_WARNING_CONFIG_FAILED
;
3440 ret
= peer_delete(peer
);
3442 return bgp_vty_return(vty
, ret
);
3445 ALIAS_HIDDEN(no_neighbor_set_peer_group
, no_neighbor_set_peer_group_hidden_cmd
,
3446 "no neighbor <A.B.C.D|X:X::X:X|WORD> peer-group WORD",
3447 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3448 "Member of the peer-group\n"
3449 "Peer-group name\n")
3451 static int peer_flag_modify_vty(struct vty
*vty
, const char *ip_str
,
3452 uint16_t flag
, int set
)
3457 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
3459 return CMD_WARNING_CONFIG_FAILED
;
3462 * If 'neighbor <interface>', then this is for directly connected peers,
3463 * we should not accept disable-connected-check.
3465 if (peer
->conf_if
&& (flag
== PEER_FLAG_DISABLE_CONNECTED_CHECK
)) {
3467 "%s is directly connected peer, cannot accept disable-"
3468 "connected-check\n",
3470 return CMD_WARNING_CONFIG_FAILED
;
3473 if (!set
&& flag
== PEER_FLAG_SHUTDOWN
)
3474 peer_tx_shutdown_message_unset(peer
);
3477 ret
= peer_flag_set(peer
, flag
);
3479 ret
= peer_flag_unset(peer
, flag
);
3481 return bgp_vty_return(vty
, ret
);
3484 static int peer_flag_set_vty(struct vty
*vty
, const char *ip_str
, uint16_t flag
)
3486 return peer_flag_modify_vty(vty
, ip_str
, flag
, 1);
3489 static int peer_flag_unset_vty(struct vty
*vty
, const char *ip_str
,
3492 return peer_flag_modify_vty(vty
, ip_str
, flag
, 0);
3495 /* neighbor passive. */
3496 DEFUN (neighbor_passive
,
3497 neighbor_passive_cmd
,
3498 "neighbor <A.B.C.D|X:X::X:X|WORD> passive",
3501 "Don't send open messages to this neighbor\n")
3504 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
, PEER_FLAG_PASSIVE
);
3507 DEFUN (no_neighbor_passive
,
3508 no_neighbor_passive_cmd
,
3509 "no neighbor <A.B.C.D|X:X::X:X|WORD> passive",
3513 "Don't send open messages to this neighbor\n")
3516 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
, PEER_FLAG_PASSIVE
);
3519 /* neighbor shutdown. */
3520 DEFUN (neighbor_shutdown_msg
,
3521 neighbor_shutdown_msg_cmd
,
3522 "neighbor <A.B.C.D|X:X::X:X|WORD> shutdown message MSG...",
3525 "Administratively shut down this neighbor\n"
3526 "Add a shutdown message (draft-ietf-idr-shutdown-06)\n"
3527 "Shutdown message\n")
3533 peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3537 return CMD_WARNING_CONFIG_FAILED
;
3538 message
= argv_concat(argv
, argc
, 4);
3539 peer_tx_shutdown_message_set(peer
, message
);
3540 XFREE(MTYPE_TMP
, message
);
3543 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
, PEER_FLAG_SHUTDOWN
);
3546 ALIAS(neighbor_shutdown_msg
, neighbor_shutdown_cmd
,
3547 "neighbor <A.B.C.D|X:X::X:X|WORD> shutdown",
3548 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3549 "Administratively shut down this neighbor\n")
3551 DEFUN (no_neighbor_shutdown_msg
,
3552 no_neighbor_shutdown_msg_cmd
,
3553 "no neighbor <A.B.C.D|X:X::X:X|WORD> shutdown message MSG...",
3557 "Administratively shut down this neighbor\n"
3558 "Remove a shutdown message (draft-ietf-idr-shutdown-06)\n"
3559 "Shutdown message\n")
3563 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3564 PEER_FLAG_SHUTDOWN
);
3567 ALIAS(no_neighbor_shutdown_msg
, no_neighbor_shutdown_cmd
,
3568 "no neighbor <A.B.C.D|X:X::X:X|WORD> shutdown",
3569 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3570 "Administratively shut down this neighbor\n")
3572 /* neighbor capability dynamic. */
3573 DEFUN (neighbor_capability_dynamic
,
3574 neighbor_capability_dynamic_cmd
,
3575 "neighbor <A.B.C.D|X:X::X:X|WORD> capability dynamic",
3578 "Advertise capability to the peer\n"
3579 "Advertise dynamic capability to this neighbor\n")
3582 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
3583 PEER_FLAG_DYNAMIC_CAPABILITY
);
3586 DEFUN (no_neighbor_capability_dynamic
,
3587 no_neighbor_capability_dynamic_cmd
,
3588 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability dynamic",
3592 "Advertise capability to the peer\n"
3593 "Advertise dynamic capability to this neighbor\n")
3596 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3597 PEER_FLAG_DYNAMIC_CAPABILITY
);
3600 /* neighbor dont-capability-negotiate */
3601 DEFUN (neighbor_dont_capability_negotiate
,
3602 neighbor_dont_capability_negotiate_cmd
,
3603 "neighbor <A.B.C.D|X:X::X:X|WORD> dont-capability-negotiate",
3606 "Do not perform capability negotiation\n")
3609 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
3610 PEER_FLAG_DONT_CAPABILITY
);
3613 DEFUN (no_neighbor_dont_capability_negotiate
,
3614 no_neighbor_dont_capability_negotiate_cmd
,
3615 "no neighbor <A.B.C.D|X:X::X:X|WORD> dont-capability-negotiate",
3619 "Do not perform capability negotiation\n")
3622 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3623 PEER_FLAG_DONT_CAPABILITY
);
3626 /* neighbor capability extended next hop encoding */
3627 DEFUN (neighbor_capability_enhe
,
3628 neighbor_capability_enhe_cmd
,
3629 "neighbor <A.B.C.D|X:X::X:X|WORD> capability extended-nexthop",
3632 "Advertise capability to the peer\n"
3633 "Advertise extended next-hop capability to the peer\n")
3636 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
3637 PEER_FLAG_CAPABILITY_ENHE
);
3640 DEFUN (no_neighbor_capability_enhe
,
3641 no_neighbor_capability_enhe_cmd
,
3642 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability extended-nexthop",
3646 "Advertise capability to the peer\n"
3647 "Advertise extended next-hop capability to the peer\n")
3650 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3651 PEER_FLAG_CAPABILITY_ENHE
);
3654 static int peer_af_flag_modify_vty(struct vty
*vty
, const char *peer_str
,
3655 afi_t afi
, safi_t safi
, uint32_t flag
,
3661 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
3663 return CMD_WARNING_CONFIG_FAILED
;
3666 ret
= peer_af_flag_set(peer
, afi
, safi
, flag
);
3668 ret
= peer_af_flag_unset(peer
, afi
, safi
, flag
);
3670 return bgp_vty_return(vty
, ret
);
3673 static int peer_af_flag_set_vty(struct vty
*vty
, const char *peer_str
,
3674 afi_t afi
, safi_t safi
, uint32_t flag
)
3676 return peer_af_flag_modify_vty(vty
, peer_str
, afi
, safi
, flag
, 1);
3679 static int peer_af_flag_unset_vty(struct vty
*vty
, const char *peer_str
,
3680 afi_t afi
, safi_t safi
, uint32_t flag
)
3682 return peer_af_flag_modify_vty(vty
, peer_str
, afi
, safi
, flag
, 0);
3685 /* neighbor capability orf prefix-list. */
3686 DEFUN (neighbor_capability_orf_prefix
,
3687 neighbor_capability_orf_prefix_cmd
,
3688 "neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
3691 "Advertise capability to the peer\n"
3692 "Advertise ORF capability to the peer\n"
3693 "Advertise prefixlist ORF capability to this neighbor\n"
3694 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
3695 "Capability to RECEIVE the ORF from this neighbor\n"
3696 "Capability to SEND the ORF to this neighbor\n")
3699 int idx_send_recv
= 5;
3702 if (strmatch(argv
[idx_send_recv
]->text
, "send"))
3703 flag
= PEER_FLAG_ORF_PREFIX_SM
;
3704 else if (strmatch(argv
[idx_send_recv
]->text
, "receive"))
3705 flag
= PEER_FLAG_ORF_PREFIX_RM
;
3706 else if (strmatch(argv
[idx_send_recv
]->text
, "both"))
3707 flag
= PEER_FLAG_ORF_PREFIX_SM
| PEER_FLAG_ORF_PREFIX_RM
;
3709 vty_out(vty
, "%% BGP invalid orf prefix-list option\n");
3710 return CMD_WARNING_CONFIG_FAILED
;
3713 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
3714 bgp_node_safi(vty
), flag
);
3718 neighbor_capability_orf_prefix
,
3719 neighbor_capability_orf_prefix_hidden_cmd
,
3720 "neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
3721 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3722 "Advertise capability to the peer\n"
3723 "Advertise ORF capability to the peer\n"
3724 "Advertise prefixlist ORF capability to this neighbor\n"
3725 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
3726 "Capability to RECEIVE the ORF from this neighbor\n"
3727 "Capability to SEND the ORF to this neighbor\n")
3729 DEFUN (no_neighbor_capability_orf_prefix
,
3730 no_neighbor_capability_orf_prefix_cmd
,
3731 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
3735 "Advertise capability to the peer\n"
3736 "Advertise ORF capability to the peer\n"
3737 "Advertise prefixlist ORF capability to this neighbor\n"
3738 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
3739 "Capability to RECEIVE the ORF from this neighbor\n"
3740 "Capability to SEND the ORF to this neighbor\n")
3743 int idx_send_recv
= 6;
3746 if (strmatch(argv
[idx_send_recv
]->text
, "send"))
3747 flag
= PEER_FLAG_ORF_PREFIX_SM
;
3748 else if (strmatch(argv
[idx_send_recv
]->text
, "receive"))
3749 flag
= PEER_FLAG_ORF_PREFIX_RM
;
3750 else if (strmatch(argv
[idx_send_recv
]->text
, "both"))
3751 flag
= PEER_FLAG_ORF_PREFIX_SM
| PEER_FLAG_ORF_PREFIX_RM
;
3753 vty_out(vty
, "%% BGP invalid orf prefix-list option\n");
3754 return CMD_WARNING_CONFIG_FAILED
;
3757 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3758 bgp_node_afi(vty
), bgp_node_safi(vty
),
3763 no_neighbor_capability_orf_prefix
,
3764 no_neighbor_capability_orf_prefix_hidden_cmd
,
3765 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
3766 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3767 "Advertise capability to the peer\n"
3768 "Advertise ORF capability to the peer\n"
3769 "Advertise prefixlist ORF capability to this neighbor\n"
3770 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
3771 "Capability to RECEIVE the ORF from this neighbor\n"
3772 "Capability to SEND the ORF to this neighbor\n")
3774 /* neighbor next-hop-self. */
3775 DEFUN (neighbor_nexthop_self
,
3776 neighbor_nexthop_self_cmd
,
3777 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
3780 "Disable the next hop calculation for this neighbor\n")
3783 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
3784 bgp_node_safi(vty
), PEER_FLAG_NEXTHOP_SELF
);
3787 ALIAS_HIDDEN(neighbor_nexthop_self
, neighbor_nexthop_self_hidden_cmd
,
3788 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
3789 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3790 "Disable the next hop calculation for this neighbor\n")
3792 /* neighbor next-hop-self. */
3793 DEFUN (neighbor_nexthop_self_force
,
3794 neighbor_nexthop_self_force_cmd
,
3795 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
3798 "Disable the next hop calculation for this neighbor\n"
3799 "Set the next hop to self for reflected routes\n")
3802 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
3804 PEER_FLAG_FORCE_NEXTHOP_SELF
);
3807 ALIAS_HIDDEN(neighbor_nexthop_self_force
,
3808 neighbor_nexthop_self_force_hidden_cmd
,
3809 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
3810 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3811 "Disable the next hop calculation for this neighbor\n"
3812 "Set the next hop to self for reflected routes\n")
3814 DEFUN (no_neighbor_nexthop_self
,
3815 no_neighbor_nexthop_self_cmd
,
3816 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
3820 "Disable the next hop calculation for this neighbor\n")
3823 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3824 bgp_node_afi(vty
), bgp_node_safi(vty
),
3825 PEER_FLAG_NEXTHOP_SELF
);
3828 ALIAS_HIDDEN(no_neighbor_nexthop_self
, no_neighbor_nexthop_self_hidden_cmd
,
3829 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
3830 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3831 "Disable the next hop calculation for this neighbor\n")
3833 DEFUN (no_neighbor_nexthop_self_force
,
3834 no_neighbor_nexthop_self_force_cmd
,
3835 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
3839 "Disable the next hop calculation for this neighbor\n"
3840 "Set the next hop to self for reflected routes\n")
3843 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3844 bgp_node_afi(vty
), bgp_node_safi(vty
),
3845 PEER_FLAG_FORCE_NEXTHOP_SELF
);
3848 ALIAS_HIDDEN(no_neighbor_nexthop_self_force
,
3849 no_neighbor_nexthop_self_force_hidden_cmd
,
3850 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
3851 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3852 "Disable the next hop calculation for this neighbor\n"
3853 "Set the next hop to self for reflected routes\n")
3855 /* neighbor as-override */
3856 DEFUN (neighbor_as_override
,
3857 neighbor_as_override_cmd
,
3858 "neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
3861 "Override ASNs in outbound updates if aspath equals remote-as\n")
3864 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
3865 bgp_node_safi(vty
), PEER_FLAG_AS_OVERRIDE
);
3868 ALIAS_HIDDEN(neighbor_as_override
, neighbor_as_override_hidden_cmd
,
3869 "neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
3870 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3871 "Override ASNs in outbound updates if aspath equals remote-as\n")
3873 DEFUN (no_neighbor_as_override
,
3874 no_neighbor_as_override_cmd
,
3875 "no neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
3879 "Override ASNs in outbound updates if aspath equals remote-as\n")
3882 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3883 bgp_node_afi(vty
), bgp_node_safi(vty
),
3884 PEER_FLAG_AS_OVERRIDE
);
3887 ALIAS_HIDDEN(no_neighbor_as_override
, no_neighbor_as_override_hidden_cmd
,
3888 "no neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
3889 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3890 "Override ASNs in outbound updates if aspath equals remote-as\n")
3892 /* neighbor remove-private-AS. */
3893 DEFUN (neighbor_remove_private_as
,
3894 neighbor_remove_private_as_cmd
,
3895 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
3898 "Remove private ASNs in outbound updates\n")
3901 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
3903 PEER_FLAG_REMOVE_PRIVATE_AS
);
3906 ALIAS_HIDDEN(neighbor_remove_private_as
, neighbor_remove_private_as_hidden_cmd
,
3907 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
3908 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3909 "Remove private ASNs in outbound updates\n")
3911 DEFUN (neighbor_remove_private_as_all
,
3912 neighbor_remove_private_as_all_cmd
,
3913 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
3916 "Remove private ASNs in outbound updates\n"
3917 "Apply to all AS numbers\n")
3920 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
3922 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
);
3925 ALIAS_HIDDEN(neighbor_remove_private_as_all
,
3926 neighbor_remove_private_as_all_hidden_cmd
,
3927 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
3928 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3929 "Remove private ASNs in outbound updates\n"
3930 "Apply to all AS numbers")
3932 DEFUN (neighbor_remove_private_as_replace_as
,
3933 neighbor_remove_private_as_replace_as_cmd
,
3934 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
3937 "Remove private ASNs in outbound updates\n"
3938 "Replace private ASNs with our ASN in outbound updates\n")
3941 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
3943 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
);
3946 ALIAS_HIDDEN(neighbor_remove_private_as_replace_as
,
3947 neighbor_remove_private_as_replace_as_hidden_cmd
,
3948 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
3949 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3950 "Remove private ASNs in outbound updates\n"
3951 "Replace private ASNs with our ASN in outbound updates\n")
3953 DEFUN (neighbor_remove_private_as_all_replace_as
,
3954 neighbor_remove_private_as_all_replace_as_cmd
,
3955 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
3958 "Remove private ASNs in outbound updates\n"
3959 "Apply to all AS numbers\n"
3960 "Replace private ASNs with our ASN in outbound updates\n")
3963 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
3965 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
);
3969 neighbor_remove_private_as_all_replace_as
,
3970 neighbor_remove_private_as_all_replace_as_hidden_cmd
,
3971 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
3972 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3973 "Remove private ASNs in outbound updates\n"
3974 "Apply to all AS numbers\n"
3975 "Replace private ASNs with our ASN in outbound updates\n")
3977 DEFUN (no_neighbor_remove_private_as
,
3978 no_neighbor_remove_private_as_cmd
,
3979 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
3983 "Remove private ASNs in outbound updates\n")
3986 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3987 bgp_node_afi(vty
), bgp_node_safi(vty
),
3988 PEER_FLAG_REMOVE_PRIVATE_AS
);
3991 ALIAS_HIDDEN(no_neighbor_remove_private_as
,
3992 no_neighbor_remove_private_as_hidden_cmd
,
3993 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
3994 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3995 "Remove private ASNs in outbound updates\n")
3997 DEFUN (no_neighbor_remove_private_as_all
,
3998 no_neighbor_remove_private_as_all_cmd
,
3999 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
4003 "Remove private ASNs in outbound updates\n"
4004 "Apply to all AS numbers\n")
4007 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4008 bgp_node_afi(vty
), bgp_node_safi(vty
),
4009 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
);
4012 ALIAS_HIDDEN(no_neighbor_remove_private_as_all
,
4013 no_neighbor_remove_private_as_all_hidden_cmd
,
4014 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
4015 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4016 "Remove private ASNs in outbound updates\n"
4017 "Apply to all AS numbers\n")
4019 DEFUN (no_neighbor_remove_private_as_replace_as
,
4020 no_neighbor_remove_private_as_replace_as_cmd
,
4021 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
4025 "Remove private ASNs in outbound updates\n"
4026 "Replace private ASNs with our ASN in outbound updates\n")
4029 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4030 bgp_node_afi(vty
), bgp_node_safi(vty
),
4031 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
);
4034 ALIAS_HIDDEN(no_neighbor_remove_private_as_replace_as
,
4035 no_neighbor_remove_private_as_replace_as_hidden_cmd
,
4036 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
4037 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4038 "Remove private ASNs in outbound updates\n"
4039 "Replace private ASNs with our ASN in outbound updates\n")
4041 DEFUN (no_neighbor_remove_private_as_all_replace_as
,
4042 no_neighbor_remove_private_as_all_replace_as_cmd
,
4043 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
4047 "Remove private ASNs in outbound updates\n"
4048 "Apply to all AS numbers\n"
4049 "Replace private ASNs with our ASN in outbound updates\n")
4052 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4053 bgp_node_afi(vty
), bgp_node_safi(vty
),
4054 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
);
4058 no_neighbor_remove_private_as_all_replace_as
,
4059 no_neighbor_remove_private_as_all_replace_as_hidden_cmd
,
4060 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
4061 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4062 "Remove private ASNs in outbound updates\n"
4063 "Apply to all AS numbers\n"
4064 "Replace private ASNs with our ASN in outbound updates\n")
4067 /* neighbor send-community. */
4068 DEFUN (neighbor_send_community
,
4069 neighbor_send_community_cmd
,
4070 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
4073 "Send Community attribute to this neighbor\n")
4076 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4078 PEER_FLAG_SEND_COMMUNITY
);
4081 ALIAS_HIDDEN(neighbor_send_community
, neighbor_send_community_hidden_cmd
,
4082 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
4083 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4084 "Send Community attribute to this neighbor\n")
4086 DEFUN (no_neighbor_send_community
,
4087 no_neighbor_send_community_cmd
,
4088 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
4092 "Send Community attribute to this neighbor\n")
4095 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4096 bgp_node_afi(vty
), bgp_node_safi(vty
),
4097 PEER_FLAG_SEND_COMMUNITY
);
4100 ALIAS_HIDDEN(no_neighbor_send_community
, no_neighbor_send_community_hidden_cmd
,
4101 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
4102 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4103 "Send Community attribute to this neighbor\n")
4105 /* neighbor send-community extended. */
4106 DEFUN (neighbor_send_community_type
,
4107 neighbor_send_community_type_cmd
,
4108 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
4111 "Send Community attribute to this neighbor\n"
4112 "Send Standard and Extended Community attributes\n"
4113 "Send Standard, Large and Extended Community attributes\n"
4114 "Send Extended Community attributes\n"
4115 "Send Standard Community attributes\n"
4116 "Send Large Community attributes\n")
4121 char *peer
= argv
[1]->arg
;
4123 if (argv_find(argv
, argc
, "standard", &idx
))
4124 SET_FLAG(flag
, PEER_FLAG_SEND_COMMUNITY
);
4125 else if (argv_find(argv
, argc
, "extended", &idx
))
4126 SET_FLAG(flag
, PEER_FLAG_SEND_EXT_COMMUNITY
);
4127 else if (argv_find(argv
, argc
, "large", &idx
))
4128 SET_FLAG(flag
, PEER_FLAG_SEND_LARGE_COMMUNITY
);
4129 else if (argv_find(argv
, argc
, "both", &idx
)) {
4130 SET_FLAG(flag
, PEER_FLAG_SEND_COMMUNITY
);
4131 SET_FLAG(flag
, PEER_FLAG_SEND_EXT_COMMUNITY
);
4133 SET_FLAG(flag
, PEER_FLAG_SEND_COMMUNITY
);
4134 SET_FLAG(flag
, PEER_FLAG_SEND_EXT_COMMUNITY
);
4135 SET_FLAG(flag
, PEER_FLAG_SEND_LARGE_COMMUNITY
);
4138 return peer_af_flag_set_vty(vty
, peer
, bgp_node_afi(vty
),
4139 bgp_node_safi(vty
), flag
);
4143 neighbor_send_community_type
, neighbor_send_community_type_hidden_cmd
,
4144 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
4145 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4146 "Send Community attribute to this neighbor\n"
4147 "Send Standard and Extended Community attributes\n"
4148 "Send Standard, Large and Extended Community attributes\n"
4149 "Send Extended Community attributes\n"
4150 "Send Standard Community attributes\n"
4151 "Send Large Community attributes\n")
4153 DEFUN (no_neighbor_send_community_type
,
4154 no_neighbor_send_community_type_cmd
,
4155 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
4159 "Send Community attribute to this neighbor\n"
4160 "Send Standard and Extended Community attributes\n"
4161 "Send Standard, Large and Extended Community attributes\n"
4162 "Send Extended Community attributes\n"
4163 "Send Standard Community attributes\n"
4164 "Send Large Community attributes\n")
4168 const char *type
= argv
[argc
- 1]->text
;
4170 if (strmatch(type
, "standard"))
4171 return peer_af_flag_unset_vty(
4172 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4173 bgp_node_safi(vty
), PEER_FLAG_SEND_COMMUNITY
);
4174 if (strmatch(type
, "extended"))
4175 return peer_af_flag_unset_vty(
4176 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4177 bgp_node_safi(vty
), PEER_FLAG_SEND_EXT_COMMUNITY
);
4178 if (strmatch(type
, "large"))
4179 return peer_af_flag_unset_vty(
4180 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4181 bgp_node_safi(vty
), PEER_FLAG_SEND_LARGE_COMMUNITY
);
4182 if (strmatch(type
, "both"))
4183 return peer_af_flag_unset_vty(
4184 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4186 PEER_FLAG_SEND_COMMUNITY
4187 | PEER_FLAG_SEND_EXT_COMMUNITY
);
4189 /* if (strmatch (type, "all")) */
4190 return peer_af_flag_unset_vty(
4191 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
4192 (PEER_FLAG_SEND_COMMUNITY
| PEER_FLAG_SEND_EXT_COMMUNITY
4193 | PEER_FLAG_SEND_LARGE_COMMUNITY
));
4197 no_neighbor_send_community_type
,
4198 no_neighbor_send_community_type_hidden_cmd
,
4199 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
4200 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4201 "Send Community attribute to this neighbor\n"
4202 "Send Standard and Extended Community attributes\n"
4203 "Send Standard, Large and Extended Community attributes\n"
4204 "Send Extended Community attributes\n"
4205 "Send Standard Community attributes\n"
4206 "Send Large Community attributes\n")
4208 /* neighbor soft-reconfig. */
4209 DEFUN (neighbor_soft_reconfiguration
,
4210 neighbor_soft_reconfiguration_cmd
,
4211 "neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
4214 "Per neighbor soft reconfiguration\n"
4215 "Allow inbound soft reconfiguration for this neighbor\n")
4218 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4220 PEER_FLAG_SOFT_RECONFIG
);
4223 ALIAS_HIDDEN(neighbor_soft_reconfiguration
,
4224 neighbor_soft_reconfiguration_hidden_cmd
,
4225 "neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
4226 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4227 "Per neighbor soft reconfiguration\n"
4228 "Allow inbound soft reconfiguration for this neighbor\n")
4230 DEFUN (no_neighbor_soft_reconfiguration
,
4231 no_neighbor_soft_reconfiguration_cmd
,
4232 "no neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
4236 "Per neighbor soft reconfiguration\n"
4237 "Allow inbound soft reconfiguration for this neighbor\n")
4240 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4241 bgp_node_afi(vty
), bgp_node_safi(vty
),
4242 PEER_FLAG_SOFT_RECONFIG
);
4245 ALIAS_HIDDEN(no_neighbor_soft_reconfiguration
,
4246 no_neighbor_soft_reconfiguration_hidden_cmd
,
4247 "no neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
4248 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4249 "Per neighbor soft reconfiguration\n"
4250 "Allow inbound soft reconfiguration for this neighbor\n")
4252 DEFUN (neighbor_route_reflector_client
,
4253 neighbor_route_reflector_client_cmd
,
4254 "neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
4257 "Configure a neighbor as Route Reflector client\n")
4263 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
4265 return CMD_WARNING_CONFIG_FAILED
;
4267 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4269 PEER_FLAG_REFLECTOR_CLIENT
);
4272 ALIAS_HIDDEN(neighbor_route_reflector_client
,
4273 neighbor_route_reflector_client_hidden_cmd
,
4274 "neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
4275 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4276 "Configure a neighbor as Route Reflector client\n")
4278 DEFUN (no_neighbor_route_reflector_client
,
4279 no_neighbor_route_reflector_client_cmd
,
4280 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
4284 "Configure a neighbor as Route Reflector client\n")
4287 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4288 bgp_node_afi(vty
), bgp_node_safi(vty
),
4289 PEER_FLAG_REFLECTOR_CLIENT
);
4292 ALIAS_HIDDEN(no_neighbor_route_reflector_client
,
4293 no_neighbor_route_reflector_client_hidden_cmd
,
4294 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
4295 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4296 "Configure a neighbor as Route Reflector client\n")
4298 /* neighbor route-server-client. */
4299 DEFUN (neighbor_route_server_client
,
4300 neighbor_route_server_client_cmd
,
4301 "neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
4304 "Configure a neighbor as Route Server client\n")
4309 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
4311 return CMD_WARNING_CONFIG_FAILED
;
4312 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4314 PEER_FLAG_RSERVER_CLIENT
);
4317 ALIAS_HIDDEN(neighbor_route_server_client
,
4318 neighbor_route_server_client_hidden_cmd
,
4319 "neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
4320 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4321 "Configure a neighbor as Route Server client\n")
4323 DEFUN (no_neighbor_route_server_client
,
4324 no_neighbor_route_server_client_cmd
,
4325 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
4329 "Configure a neighbor as Route Server client\n")
4332 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4333 bgp_node_afi(vty
), bgp_node_safi(vty
),
4334 PEER_FLAG_RSERVER_CLIENT
);
4337 ALIAS_HIDDEN(no_neighbor_route_server_client
,
4338 no_neighbor_route_server_client_hidden_cmd
,
4339 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
4340 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4341 "Configure a neighbor as Route Server client\n")
4343 DEFUN (neighbor_nexthop_local_unchanged
,
4344 neighbor_nexthop_local_unchanged_cmd
,
4345 "neighbor <A.B.C.D|X:X::X:X|WORD> nexthop-local unchanged",
4348 "Configure treatment of outgoing link-local nexthop attribute\n"
4349 "Leave link-local nexthop unchanged for this peer\n")
4352 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4354 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
);
4357 DEFUN (no_neighbor_nexthop_local_unchanged
,
4358 no_neighbor_nexthop_local_unchanged_cmd
,
4359 "no neighbor <A.B.C.D|X:X::X:X|WORD> nexthop-local unchanged",
4363 "Configure treatment of outgoing link-local-nexthop attribute\n"
4364 "Leave link-local nexthop unchanged for this peer\n")
4367 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4368 bgp_node_afi(vty
), bgp_node_safi(vty
),
4369 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
);
4372 DEFUN (neighbor_attr_unchanged
,
4373 neighbor_attr_unchanged_cmd
,
4374 "neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
4377 "BGP attribute is propagated unchanged to this neighbor\n"
4378 "As-path attribute\n"
4379 "Nexthop attribute\n"
4383 char *peer_str
= argv
[1]->arg
;
4386 afi_t afi
= bgp_node_afi(vty
);
4387 safi_t safi
= bgp_node_safi(vty
);
4389 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
4391 return CMD_WARNING_CONFIG_FAILED
;
4393 if (argv_find(argv
, argc
, "as-path", &idx
))
4394 SET_FLAG(flags
, PEER_FLAG_AS_PATH_UNCHANGED
);
4396 if (argv_find(argv
, argc
, "next-hop", &idx
))
4397 SET_FLAG(flags
, PEER_FLAG_NEXTHOP_UNCHANGED
);
4399 if (argv_find(argv
, argc
, "med", &idx
))
4400 SET_FLAG(flags
, PEER_FLAG_MED_UNCHANGED
);
4402 /* no flags means all of them! */
4404 SET_FLAG(flags
, PEER_FLAG_AS_PATH_UNCHANGED
);
4405 SET_FLAG(flags
, PEER_FLAG_NEXTHOP_UNCHANGED
);
4406 SET_FLAG(flags
, PEER_FLAG_MED_UNCHANGED
);
4408 if (!CHECK_FLAG(flags
, PEER_FLAG_AS_PATH_UNCHANGED
)
4409 && peer_af_flag_check(peer
, afi
, safi
,
4410 PEER_FLAG_AS_PATH_UNCHANGED
)) {
4411 peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
4412 PEER_FLAG_AS_PATH_UNCHANGED
);
4415 if (!CHECK_FLAG(flags
, PEER_FLAG_NEXTHOP_UNCHANGED
)
4416 && peer_af_flag_check(peer
, afi
, safi
,
4417 PEER_FLAG_NEXTHOP_UNCHANGED
)) {
4418 peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
4419 PEER_FLAG_NEXTHOP_UNCHANGED
);
4422 if (!CHECK_FLAG(flags
, PEER_FLAG_MED_UNCHANGED
)
4423 && peer_af_flag_check(peer
, afi
, safi
,
4424 PEER_FLAG_MED_UNCHANGED
)) {
4425 peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
4426 PEER_FLAG_MED_UNCHANGED
);
4430 return peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
, flags
);
4434 neighbor_attr_unchanged
, neighbor_attr_unchanged_hidden_cmd
,
4435 "neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
4436 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4437 "BGP attribute is propagated unchanged to this neighbor\n"
4438 "As-path attribute\n"
4439 "Nexthop attribute\n"
4442 DEFUN (no_neighbor_attr_unchanged
,
4443 no_neighbor_attr_unchanged_cmd
,
4444 "no neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
4448 "BGP attribute is propagated unchanged to this neighbor\n"
4449 "As-path attribute\n"
4450 "Nexthop attribute\n"
4454 char *peer
= argv
[2]->arg
;
4457 if (argv_find(argv
, argc
, "as-path", &idx
))
4458 SET_FLAG(flags
, PEER_FLAG_AS_PATH_UNCHANGED
);
4460 if (argv_find(argv
, argc
, "next-hop", &idx
))
4461 SET_FLAG(flags
, PEER_FLAG_NEXTHOP_UNCHANGED
);
4463 if (argv_find(argv
, argc
, "med", &idx
))
4464 SET_FLAG(flags
, PEER_FLAG_MED_UNCHANGED
);
4466 if (!flags
) // no flags means all of them!
4468 SET_FLAG(flags
, PEER_FLAG_AS_PATH_UNCHANGED
);
4469 SET_FLAG(flags
, PEER_FLAG_NEXTHOP_UNCHANGED
);
4470 SET_FLAG(flags
, PEER_FLAG_MED_UNCHANGED
);
4473 return peer_af_flag_unset_vty(vty
, peer
, bgp_node_afi(vty
),
4474 bgp_node_safi(vty
), flags
);
4478 no_neighbor_attr_unchanged
, no_neighbor_attr_unchanged_hidden_cmd
,
4479 "no neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
4480 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4481 "BGP attribute is propagated unchanged to this neighbor\n"
4482 "As-path attribute\n"
4483 "Nexthop attribute\n"
4486 /* EBGP multihop configuration. */
4487 static int peer_ebgp_multihop_set_vty(struct vty
*vty
, const char *ip_str
,
4488 const char *ttl_str
)
4493 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
4495 return CMD_WARNING_CONFIG_FAILED
;
4498 return bgp_vty_return(vty
, BGP_ERR_INVALID_FOR_DIRECT_PEER
);
4503 ttl
= strtoul(ttl_str
, NULL
, 10);
4505 return bgp_vty_return(vty
, peer_ebgp_multihop_set(peer
, ttl
));
4508 static int peer_ebgp_multihop_unset_vty(struct vty
*vty
, const char *ip_str
)
4512 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
4514 return CMD_WARNING_CONFIG_FAILED
;
4516 return bgp_vty_return(vty
, peer_ebgp_multihop_unset(peer
));
4519 /* neighbor ebgp-multihop. */
4520 DEFUN (neighbor_ebgp_multihop
,
4521 neighbor_ebgp_multihop_cmd
,
4522 "neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop",
4525 "Allow EBGP neighbors not on directly connected networks\n")
4528 return peer_ebgp_multihop_set_vty(vty
, argv
[idx_peer
]->arg
, NULL
);
4531 DEFUN (neighbor_ebgp_multihop_ttl
,
4532 neighbor_ebgp_multihop_ttl_cmd
,
4533 "neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop (1-255)",
4536 "Allow EBGP neighbors not on directly connected networks\n"
4537 "maximum hop count\n")
4541 return peer_ebgp_multihop_set_vty(vty
, argv
[idx_peer
]->arg
,
4542 argv
[idx_number
]->arg
);
4545 DEFUN (no_neighbor_ebgp_multihop
,
4546 no_neighbor_ebgp_multihop_cmd
,
4547 "no neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop [(1-255)]",
4551 "Allow EBGP neighbors not on directly connected networks\n"
4552 "maximum hop count\n")
4555 return peer_ebgp_multihop_unset_vty(vty
, argv
[idx_peer
]->arg
);
4559 /* disable-connected-check */
4560 DEFUN (neighbor_disable_connected_check
,
4561 neighbor_disable_connected_check_cmd
,
4562 "neighbor <A.B.C.D|X:X::X:X|WORD> <disable-connected-check|enforce-multihop>",
4565 "one-hop away EBGP peer using loopback address\n"
4566 "Enforce EBGP neighbors perform multihop\n")
4569 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
4570 PEER_FLAG_DISABLE_CONNECTED_CHECK
);
4573 DEFUN (no_neighbor_disable_connected_check
,
4574 no_neighbor_disable_connected_check_cmd
,
4575 "no neighbor <A.B.C.D|X:X::X:X|WORD> <disable-connected-check|enforce-multihop>",
4579 "one-hop away EBGP peer using loopback address\n"
4580 "Enforce EBGP neighbors perform multihop\n")
4583 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4584 PEER_FLAG_DISABLE_CONNECTED_CHECK
);
4587 DEFUN (neighbor_description
,
4588 neighbor_description_cmd
,
4589 "neighbor <A.B.C.D|X:X::X:X|WORD> description LINE...",
4592 "Neighbor specific description\n"
4593 "Up to 80 characters describing this neighbor\n")
4600 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
4602 return CMD_WARNING_CONFIG_FAILED
;
4604 str
= argv_concat(argv
, argc
, idx_line
);
4606 peer_description_set(peer
, str
);
4608 XFREE(MTYPE_TMP
, str
);
4613 DEFUN (no_neighbor_description
,
4614 no_neighbor_description_cmd
,
4615 "no neighbor <A.B.C.D|X:X::X:X|WORD> description [LINE]",
4619 "Neighbor specific description\n"
4620 "Up to 80 characters describing this neighbor\n")
4625 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
4627 return CMD_WARNING_CONFIG_FAILED
;
4629 peer_description_unset(peer
);
4635 /* Neighbor update-source. */
4636 static int peer_update_source_vty(struct vty
*vty
, const char *peer_str
,
4637 const char *source_str
)
4642 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
4644 return CMD_WARNING_CONFIG_FAILED
;
4651 int ret
= str2sockunion(source_str
, &su
);
4654 peer_update_source_addr_set(peer
, &su
);
4656 if (str2prefix(source_str
, &p
)) {
4658 "%% Invalid update-source, remove prefix length \n");
4659 return CMD_WARNING_CONFIG_FAILED
;
4661 peer_update_source_if_set(peer
, source_str
);
4664 peer_update_source_unset(peer
);
4669 #define BGP_UPDATE_SOURCE_HELP_STR \
4672 "Interface name (requires zebra to be running)\n"
4674 DEFUN (neighbor_update_source
,
4675 neighbor_update_source_cmd
,
4676 "neighbor <A.B.C.D|X:X::X:X|WORD> update-source <A.B.C.D|X:X::X:X|WORD>",
4679 "Source of routing updates\n"
4680 BGP_UPDATE_SOURCE_HELP_STR
)
4684 return peer_update_source_vty(vty
, argv
[idx_peer
]->arg
,
4685 argv
[idx_peer_2
]->arg
);
4688 DEFUN (no_neighbor_update_source
,
4689 no_neighbor_update_source_cmd
,
4690 "no neighbor <A.B.C.D|X:X::X:X|WORD> update-source [<A.B.C.D|X:X::X:X|WORD>]",
4694 "Source of routing updates\n"
4695 BGP_UPDATE_SOURCE_HELP_STR
)
4698 return peer_update_source_vty(vty
, argv
[idx_peer
]->arg
, NULL
);
4701 static int peer_default_originate_set_vty(struct vty
*vty
, const char *peer_str
,
4702 afi_t afi
, safi_t safi
,
4703 const char *rmap
, int set
)
4708 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
4710 return CMD_WARNING_CONFIG_FAILED
;
4713 ret
= peer_default_originate_set(peer
, afi
, safi
, rmap
);
4715 ret
= peer_default_originate_unset(peer
, afi
, safi
);
4717 return bgp_vty_return(vty
, ret
);
4720 /* neighbor default-originate. */
4721 DEFUN (neighbor_default_originate
,
4722 neighbor_default_originate_cmd
,
4723 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate",
4726 "Originate default route to this neighbor\n")
4729 return peer_default_originate_set_vty(vty
, argv
[idx_peer
]->arg
,
4731 bgp_node_safi(vty
), NULL
, 1);
4734 ALIAS_HIDDEN(neighbor_default_originate
, neighbor_default_originate_hidden_cmd
,
4735 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate",
4736 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4737 "Originate default route to this neighbor\n")
4739 DEFUN (neighbor_default_originate_rmap
,
4740 neighbor_default_originate_rmap_cmd
,
4741 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate route-map WORD",
4744 "Originate default route to this neighbor\n"
4745 "Route-map to specify criteria to originate default\n"
4750 return peer_default_originate_set_vty(
4751 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
4752 argv
[idx_word
]->arg
, 1);
4756 neighbor_default_originate_rmap
,
4757 neighbor_default_originate_rmap_hidden_cmd
,
4758 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate route-map WORD",
4759 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4760 "Originate default route to this neighbor\n"
4761 "Route-map to specify criteria to originate default\n"
4764 DEFUN (no_neighbor_default_originate
,
4765 no_neighbor_default_originate_cmd
,
4766 "no neighbor <A.B.C.D|X:X::X:X|WORD> default-originate [route-map WORD]",
4770 "Originate default route to this neighbor\n"
4771 "Route-map to specify criteria to originate default\n"
4775 return peer_default_originate_set_vty(vty
, argv
[idx_peer
]->arg
,
4777 bgp_node_safi(vty
), NULL
, 0);
4781 no_neighbor_default_originate
, no_neighbor_default_originate_hidden_cmd
,
4782 "no neighbor <A.B.C.D|X:X::X:X|WORD> default-originate [route-map WORD]",
4783 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4784 "Originate default route to this neighbor\n"
4785 "Route-map to specify criteria to originate default\n"
4789 /* Set neighbor's BGP port. */
4790 static int peer_port_vty(struct vty
*vty
, const char *ip_str
, int afi
,
4791 const char *port_str
)
4797 peer
= peer_lookup_vty(vty
, ip_str
);
4799 return CMD_WARNING_CONFIG_FAILED
;
4802 sp
= getservbyname("bgp", "tcp");
4803 port
= (sp
== NULL
) ? BGP_PORT_DEFAULT
: ntohs(sp
->s_port
);
4805 port
= strtoul(port_str
, NULL
, 10);
4808 peer_port_set(peer
, port
);
4813 /* Set specified peer's BGP port. */
4814 DEFUN (neighbor_port
,
4816 "neighbor <A.B.C.D|X:X::X:X> port (0-65535)",
4819 "Neighbor's BGP port\n"
4820 "TCP port number\n")
4824 return peer_port_vty(vty
, argv
[idx_ip
]->arg
, AFI_IP
,
4825 argv
[idx_number
]->arg
);
4828 DEFUN (no_neighbor_port
,
4829 no_neighbor_port_cmd
,
4830 "no neighbor <A.B.C.D|X:X::X:X> port [(0-65535)]",
4834 "Neighbor's BGP port\n"
4835 "TCP port number\n")
4838 return peer_port_vty(vty
, argv
[idx_ip
]->arg
, AFI_IP
, NULL
);
4842 /* neighbor weight. */
4843 static int peer_weight_set_vty(struct vty
*vty
, const char *ip_str
, afi_t afi
,
4844 safi_t safi
, const char *weight_str
)
4848 unsigned long weight
;
4850 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
4852 return CMD_WARNING_CONFIG_FAILED
;
4854 weight
= strtoul(weight_str
, NULL
, 10);
4856 ret
= peer_weight_set(peer
, afi
, safi
, weight
);
4857 return bgp_vty_return(vty
, ret
);
4860 static int peer_weight_unset_vty(struct vty
*vty
, const char *ip_str
, afi_t afi
,
4866 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
4868 return CMD_WARNING_CONFIG_FAILED
;
4870 ret
= peer_weight_unset(peer
, afi
, safi
);
4871 return bgp_vty_return(vty
, ret
);
4874 DEFUN (neighbor_weight
,
4875 neighbor_weight_cmd
,
4876 "neighbor <A.B.C.D|X:X::X:X|WORD> weight (0-65535)",
4879 "Set default weight for routes from this neighbor\n"
4884 return peer_weight_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4885 bgp_node_safi(vty
), argv
[idx_number
]->arg
);
4888 ALIAS_HIDDEN(neighbor_weight
, neighbor_weight_hidden_cmd
,
4889 "neighbor <A.B.C.D|X:X::X:X|WORD> weight (0-65535)",
4890 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4891 "Set default weight for routes from this neighbor\n"
4894 DEFUN (no_neighbor_weight
,
4895 no_neighbor_weight_cmd
,
4896 "no neighbor <A.B.C.D|X:X::X:X|WORD> weight [(0-65535)]",
4900 "Set default weight for routes from this neighbor\n"
4904 return peer_weight_unset_vty(vty
, argv
[idx_peer
]->arg
,
4905 bgp_node_afi(vty
), bgp_node_safi(vty
));
4908 ALIAS_HIDDEN(no_neighbor_weight
, no_neighbor_weight_hidden_cmd
,
4909 "no neighbor <A.B.C.D|X:X::X:X|WORD> weight [(0-65535)]",
4910 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4911 "Set default weight for routes from this neighbor\n"
4915 /* Override capability negotiation. */
4916 DEFUN (neighbor_override_capability
,
4917 neighbor_override_capability_cmd
,
4918 "neighbor <A.B.C.D|X:X::X:X|WORD> override-capability",
4921 "Override capability negotiation result\n")
4924 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
4925 PEER_FLAG_OVERRIDE_CAPABILITY
);
4928 DEFUN (no_neighbor_override_capability
,
4929 no_neighbor_override_capability_cmd
,
4930 "no neighbor <A.B.C.D|X:X::X:X|WORD> override-capability",
4934 "Override capability negotiation result\n")
4937 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4938 PEER_FLAG_OVERRIDE_CAPABILITY
);
4941 DEFUN (neighbor_strict_capability
,
4942 neighbor_strict_capability_cmd
,
4943 "neighbor <A.B.C.D|X:X::X:X> strict-capability-match",
4946 "Strict capability negotiation match\n")
4949 return peer_flag_set_vty(vty
, argv
[idx_ip
]->arg
,
4950 PEER_FLAG_STRICT_CAP_MATCH
);
4953 DEFUN (no_neighbor_strict_capability
,
4954 no_neighbor_strict_capability_cmd
,
4955 "no neighbor <A.B.C.D|X:X::X:X> strict-capability-match",
4959 "Strict capability negotiation match\n")
4962 return peer_flag_unset_vty(vty
, argv
[idx_ip
]->arg
,
4963 PEER_FLAG_STRICT_CAP_MATCH
);
4966 static int peer_timers_set_vty(struct vty
*vty
, const char *ip_str
,
4967 const char *keep_str
, const char *hold_str
)
4974 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
4976 return CMD_WARNING_CONFIG_FAILED
;
4978 keepalive
= strtoul(keep_str
, NULL
, 10);
4979 holdtime
= strtoul(hold_str
, NULL
, 10);
4981 ret
= peer_timers_set(peer
, keepalive
, holdtime
);
4983 return bgp_vty_return(vty
, ret
);
4986 static int peer_timers_unset_vty(struct vty
*vty
, const char *ip_str
)
4991 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
4993 return CMD_WARNING_CONFIG_FAILED
;
4995 ret
= peer_timers_unset(peer
);
4997 return bgp_vty_return(vty
, ret
);
5000 DEFUN (neighbor_timers
,
5001 neighbor_timers_cmd
,
5002 "neighbor <A.B.C.D|X:X::X:X|WORD> timers (0-65535) (0-65535)",
5005 "BGP per neighbor timers\n"
5006 "Keepalive interval\n"
5011 int idx_number_2
= 4;
5012 return peer_timers_set_vty(vty
, argv
[idx_peer
]->arg
,
5013 argv
[idx_number
]->arg
,
5014 argv
[idx_number_2
]->arg
);
5017 DEFUN (no_neighbor_timers
,
5018 no_neighbor_timers_cmd
,
5019 "no neighbor <A.B.C.D|X:X::X:X|WORD> timers [(0-65535) (0-65535)]",
5023 "BGP per neighbor timers\n"
5024 "Keepalive interval\n"
5028 return peer_timers_unset_vty(vty
, argv
[idx_peer
]->arg
);
5032 static int peer_timers_connect_set_vty(struct vty
*vty
, const char *ip_str
,
5033 const char *time_str
)
5039 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5041 return CMD_WARNING_CONFIG_FAILED
;
5043 connect
= strtoul(time_str
, NULL
, 10);
5045 ret
= peer_timers_connect_set(peer
, connect
);
5047 return bgp_vty_return(vty
, ret
);
5050 static int peer_timers_connect_unset_vty(struct vty
*vty
, const char *ip_str
)
5055 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5057 return CMD_WARNING_CONFIG_FAILED
;
5059 ret
= peer_timers_connect_unset(peer
);
5061 return bgp_vty_return(vty
, ret
);
5064 DEFUN (neighbor_timers_connect
,
5065 neighbor_timers_connect_cmd
,
5066 "neighbor <A.B.C.D|X:X::X:X|WORD> timers connect (1-65535)",
5069 "BGP per neighbor timers\n"
5070 "BGP connect timer\n"
5075 return peer_timers_connect_set_vty(vty
, argv
[idx_peer
]->arg
,
5076 argv
[idx_number
]->arg
);
5079 DEFUN (no_neighbor_timers_connect
,
5080 no_neighbor_timers_connect_cmd
,
5081 "no neighbor <A.B.C.D|X:X::X:X|WORD> timers connect [(1-65535)]",
5085 "BGP per neighbor timers\n"
5086 "BGP connect timer\n"
5090 return peer_timers_connect_unset_vty(vty
, argv
[idx_peer
]->arg
);
5094 static int peer_advertise_interval_vty(struct vty
*vty
, const char *ip_str
,
5095 const char *time_str
, int set
)
5099 uint32_t routeadv
= 0;
5101 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5103 return CMD_WARNING_CONFIG_FAILED
;
5106 routeadv
= strtoul(time_str
, NULL
, 10);
5109 ret
= peer_advertise_interval_set(peer
, routeadv
);
5111 ret
= peer_advertise_interval_unset(peer
);
5113 return bgp_vty_return(vty
, ret
);
5116 DEFUN (neighbor_advertise_interval
,
5117 neighbor_advertise_interval_cmd
,
5118 "neighbor <A.B.C.D|X:X::X:X|WORD> advertisement-interval (0-600)",
5121 "Minimum interval between sending BGP routing updates\n"
5122 "time in seconds\n")
5126 return peer_advertise_interval_vty(vty
, argv
[idx_peer
]->arg
,
5127 argv
[idx_number
]->arg
, 1);
5130 DEFUN (no_neighbor_advertise_interval
,
5131 no_neighbor_advertise_interval_cmd
,
5132 "no neighbor <A.B.C.D|X:X::X:X|WORD> advertisement-interval [(0-600)]",
5136 "Minimum interval between sending BGP routing updates\n"
5137 "time in seconds\n")
5140 return peer_advertise_interval_vty(vty
, argv
[idx_peer
]->arg
, NULL
, 0);
5144 /* Time to wait before processing route-map updates */
5145 DEFUN (bgp_set_route_map_delay_timer
,
5146 bgp_set_route_map_delay_timer_cmd
,
5147 "bgp route-map delay-timer (0-600)",
5149 "BGP route-map delay timer\n"
5150 "Time in secs to wait before processing route-map changes\n"
5151 "0 disables the timer, no route updates happen when route-maps change\n")
5154 uint32_t rmap_delay_timer
;
5156 if (argv
[idx_number
]->arg
) {
5157 rmap_delay_timer
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
5158 bm
->rmap_update_timer
= rmap_delay_timer
;
5160 /* if the dynamic update handling is being disabled, and a timer
5162 * running, stop the timer and act as if the timer has already
5165 if (!rmap_delay_timer
&& bm
->t_rmap_update
) {
5166 BGP_TIMER_OFF(bm
->t_rmap_update
);
5167 thread_execute(bm
->master
, bgp_route_map_update_timer
,
5172 vty_out(vty
, "%% BGP invalid route-map delay-timer\n");
5173 return CMD_WARNING_CONFIG_FAILED
;
5177 DEFUN (no_bgp_set_route_map_delay_timer
,
5178 no_bgp_set_route_map_delay_timer_cmd
,
5179 "no bgp route-map delay-timer [(0-600)]",
5182 "Default BGP route-map delay timer\n"
5183 "Reset to default time to wait for processing route-map changes\n"
5184 "0 disables the timer, no route updates happen when route-maps change\n")
5187 bm
->rmap_update_timer
= RMAP_DEFAULT_UPDATE_TIMER
;
5193 /* neighbor interface */
5194 static int peer_interface_vty(struct vty
*vty
, const char *ip_str
,
5199 peer
= peer_lookup_vty(vty
, ip_str
);
5200 if (!peer
|| peer
->conf_if
) {
5201 vty_out(vty
, "%% BGP invalid peer %s\n", ip_str
);
5202 return CMD_WARNING_CONFIG_FAILED
;
5206 peer_interface_set(peer
, str
);
5208 peer_interface_unset(peer
);
5213 DEFUN (neighbor_interface
,
5214 neighbor_interface_cmd
,
5215 "neighbor <A.B.C.D|X:X::X:X> interface WORD",
5223 return peer_interface_vty(vty
, argv
[idx_ip
]->arg
, argv
[idx_word
]->arg
);
5226 DEFUN (no_neighbor_interface
,
5227 no_neighbor_interface_cmd
,
5228 "no neighbor <A.B.C.D|X:X::X:X|WORD> interface WORD",
5236 return peer_interface_vty(vty
, argv
[idx_peer
]->arg
, NULL
);
5239 DEFUN (neighbor_distribute_list
,
5240 neighbor_distribute_list_cmd
,
5241 "neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list <(1-199)|(1300-2699)|WORD> <in|out>",
5244 "Filter updates to/from this neighbor\n"
5245 "IP access-list number\n"
5246 "IP access-list number (expanded range)\n"
5247 "IP Access-list name\n"
5248 "Filter incoming updates\n"
5249 "Filter outgoing updates\n")
5256 const char *pstr
= argv
[idx_peer
]->arg
;
5257 const char *acl
= argv
[idx_acl
]->arg
;
5258 const char *inout
= argv
[argc
- 1]->text
;
5260 peer
= peer_and_group_lookup_vty(vty
, pstr
);
5262 return CMD_WARNING_CONFIG_FAILED
;
5264 /* Check filter direction. */
5265 direct
= strmatch(inout
, "in") ? FILTER_IN
: FILTER_OUT
;
5266 ret
= peer_distribute_set(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5269 return bgp_vty_return(vty
, ret
);
5273 neighbor_distribute_list
, neighbor_distribute_list_hidden_cmd
,
5274 "neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list <(1-199)|(1300-2699)|WORD> <in|out>",
5275 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5276 "Filter updates to/from this neighbor\n"
5277 "IP access-list number\n"
5278 "IP access-list number (expanded range)\n"
5279 "IP Access-list name\n"
5280 "Filter incoming updates\n"
5281 "Filter outgoing updates\n")
5283 DEFUN (no_neighbor_distribute_list
,
5284 no_neighbor_distribute_list_cmd
,
5285 "no neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list <(1-199)|(1300-2699)|WORD> <in|out>",
5289 "Filter updates to/from this neighbor\n"
5290 "IP access-list number\n"
5291 "IP access-list number (expanded range)\n"
5292 "IP Access-list name\n"
5293 "Filter incoming updates\n"
5294 "Filter outgoing updates\n")
5300 const char *pstr
= argv
[idx_peer
]->arg
;
5301 const char *inout
= argv
[argc
- 1]->text
;
5303 peer
= peer_and_group_lookup_vty(vty
, pstr
);
5305 return CMD_WARNING_CONFIG_FAILED
;
5307 /* Check filter direction. */
5308 direct
= strmatch(inout
, "in") ? FILTER_IN
: FILTER_OUT
;
5309 ret
= peer_distribute_unset(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5312 return bgp_vty_return(vty
, ret
);
5316 no_neighbor_distribute_list
, no_neighbor_distribute_list_hidden_cmd
,
5317 "no neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list <(1-199)|(1300-2699)|WORD> <in|out>",
5318 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5319 "Filter updates to/from this neighbor\n"
5320 "IP access-list number\n"
5321 "IP access-list number (expanded range)\n"
5322 "IP Access-list name\n"
5323 "Filter incoming updates\n"
5324 "Filter outgoing updates\n")
5326 /* Set prefix list to the peer. */
5327 static int peer_prefix_list_set_vty(struct vty
*vty
, const char *ip_str
,
5328 afi_t afi
, safi_t safi
,
5329 const char *name_str
,
5330 const char *direct_str
)
5334 int direct
= FILTER_IN
;
5336 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5338 return CMD_WARNING_CONFIG_FAILED
;
5340 /* Check filter direction. */
5341 if (strncmp(direct_str
, "i", 1) == 0)
5343 else if (strncmp(direct_str
, "o", 1) == 0)
5344 direct
= FILTER_OUT
;
5346 ret
= peer_prefix_list_set(peer
, afi
, safi
, direct
, name_str
);
5348 return bgp_vty_return(vty
, ret
);
5351 static int peer_prefix_list_unset_vty(struct vty
*vty
, const char *ip_str
,
5352 afi_t afi
, safi_t safi
,
5353 const char *direct_str
)
5357 int direct
= FILTER_IN
;
5359 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5361 return CMD_WARNING_CONFIG_FAILED
;
5363 /* Check filter direction. */
5364 if (strncmp(direct_str
, "i", 1) == 0)
5366 else if (strncmp(direct_str
, "o", 1) == 0)
5367 direct
= FILTER_OUT
;
5369 ret
= peer_prefix_list_unset(peer
, afi
, safi
, direct
);
5371 return bgp_vty_return(vty
, ret
);
5374 DEFUN (neighbor_prefix_list
,
5375 neighbor_prefix_list_cmd
,
5376 "neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
5379 "Filter updates to/from this neighbor\n"
5380 "Name of a prefix list\n"
5381 "Filter incoming updates\n"
5382 "Filter outgoing updates\n")
5387 return peer_prefix_list_set_vty(
5388 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5389 argv
[idx_word
]->arg
, argv
[idx_in_out
]->arg
);
5392 ALIAS_HIDDEN(neighbor_prefix_list
, neighbor_prefix_list_hidden_cmd
,
5393 "neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
5394 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5395 "Filter updates to/from this neighbor\n"
5396 "Name of a prefix list\n"
5397 "Filter incoming updates\n"
5398 "Filter outgoing updates\n")
5400 DEFUN (no_neighbor_prefix_list
,
5401 no_neighbor_prefix_list_cmd
,
5402 "no neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
5406 "Filter updates to/from this neighbor\n"
5407 "Name of a prefix list\n"
5408 "Filter incoming updates\n"
5409 "Filter outgoing updates\n")
5413 return peer_prefix_list_unset_vty(vty
, argv
[idx_peer
]->arg
,
5414 bgp_node_afi(vty
), bgp_node_safi(vty
),
5415 argv
[idx_in_out
]->arg
);
5418 ALIAS_HIDDEN(no_neighbor_prefix_list
, no_neighbor_prefix_list_hidden_cmd
,
5419 "no neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
5420 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5421 "Filter updates to/from this neighbor\n"
5422 "Name of a prefix list\n"
5423 "Filter incoming updates\n"
5424 "Filter outgoing updates\n")
5426 static int peer_aslist_set_vty(struct vty
*vty
, const char *ip_str
, afi_t afi
,
5427 safi_t safi
, const char *name_str
,
5428 const char *direct_str
)
5432 int direct
= FILTER_IN
;
5434 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5436 return CMD_WARNING_CONFIG_FAILED
;
5438 /* Check filter direction. */
5439 if (strncmp(direct_str
, "i", 1) == 0)
5441 else if (strncmp(direct_str
, "o", 1) == 0)
5442 direct
= FILTER_OUT
;
5444 ret
= peer_aslist_set(peer
, afi
, safi
, direct
, name_str
);
5446 return bgp_vty_return(vty
, ret
);
5449 static int peer_aslist_unset_vty(struct vty
*vty
, const char *ip_str
, afi_t afi
,
5450 safi_t safi
, const char *direct_str
)
5454 int direct
= FILTER_IN
;
5456 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5458 return CMD_WARNING_CONFIG_FAILED
;
5460 /* Check filter direction. */
5461 if (strncmp(direct_str
, "i", 1) == 0)
5463 else if (strncmp(direct_str
, "o", 1) == 0)
5464 direct
= FILTER_OUT
;
5466 ret
= peer_aslist_unset(peer
, afi
, safi
, direct
);
5468 return bgp_vty_return(vty
, ret
);
5471 DEFUN (neighbor_filter_list
,
5472 neighbor_filter_list_cmd
,
5473 "neighbor <A.B.C.D|X:X::X:X|WORD> filter-list WORD <in|out>",
5476 "Establish BGP filters\n"
5477 "AS path access-list name\n"
5478 "Filter incoming routes\n"
5479 "Filter outgoing routes\n")
5484 return peer_aslist_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
5485 bgp_node_safi(vty
), argv
[idx_word
]->arg
,
5486 argv
[idx_in_out
]->arg
);
5489 ALIAS_HIDDEN(neighbor_filter_list
, neighbor_filter_list_hidden_cmd
,
5490 "neighbor <A.B.C.D|X:X::X:X|WORD> filter-list WORD <in|out>",
5491 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5492 "Establish BGP filters\n"
5493 "AS path access-list name\n"
5494 "Filter incoming routes\n"
5495 "Filter outgoing routes\n")
5497 DEFUN (no_neighbor_filter_list
,
5498 no_neighbor_filter_list_cmd
,
5499 "no neighbor <A.B.C.D|X:X::X:X|WORD> filter-list WORD <in|out>",
5503 "Establish BGP filters\n"
5504 "AS path access-list name\n"
5505 "Filter incoming routes\n"
5506 "Filter outgoing routes\n")
5510 return peer_aslist_unset_vty(vty
, argv
[idx_peer
]->arg
,
5511 bgp_node_afi(vty
), bgp_node_safi(vty
),
5512 argv
[idx_in_out
]->arg
);
5515 ALIAS_HIDDEN(no_neighbor_filter_list
, no_neighbor_filter_list_hidden_cmd
,
5516 "no neighbor <A.B.C.D|X:X::X:X|WORD> filter-list WORD <in|out>",
5517 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5518 "Establish BGP filters\n"
5519 "AS path access-list name\n"
5520 "Filter incoming routes\n"
5521 "Filter outgoing routes\n")
5523 /* Set route-map to the peer. */
5524 static int peer_route_map_set_vty(struct vty
*vty
, const char *ip_str
,
5525 afi_t afi
, safi_t safi
, const char *name_str
,
5526 const char *direct_str
)
5530 int direct
= RMAP_IN
;
5532 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5534 return CMD_WARNING_CONFIG_FAILED
;
5536 /* Check filter direction. */
5537 if (strncmp(direct_str
, "in", 2) == 0)
5539 else if (strncmp(direct_str
, "o", 1) == 0)
5542 ret
= peer_route_map_set(peer
, afi
, safi
, direct
, name_str
);
5544 return bgp_vty_return(vty
, ret
);
5547 static int peer_route_map_unset_vty(struct vty
*vty
, const char *ip_str
,
5548 afi_t afi
, safi_t safi
,
5549 const char *direct_str
)
5553 int direct
= RMAP_IN
;
5555 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5557 return CMD_WARNING_CONFIG_FAILED
;
5559 /* Check filter direction. */
5560 if (strncmp(direct_str
, "in", 2) == 0)
5562 else if (strncmp(direct_str
, "o", 1) == 0)
5565 ret
= peer_route_map_unset(peer
, afi
, safi
, direct
);
5567 return bgp_vty_return(vty
, ret
);
5570 DEFUN (neighbor_route_map
,
5571 neighbor_route_map_cmd
,
5572 "neighbor <A.B.C.D|X:X::X:X|WORD> route-map WORD <in|out>",
5575 "Apply route map to neighbor\n"
5576 "Name of route map\n"
5577 "Apply map to incoming routes\n"
5578 "Apply map to outbound routes\n")
5583 return peer_route_map_set_vty(
5584 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5585 argv
[idx_word
]->arg
, argv
[idx_in_out
]->arg
);
5588 ALIAS_HIDDEN(neighbor_route_map
, neighbor_route_map_hidden_cmd
,
5589 "neighbor <A.B.C.D|X:X::X:X|WORD> route-map WORD <in|out>",
5590 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5591 "Apply route map to neighbor\n"
5592 "Name of route map\n"
5593 "Apply map to incoming routes\n"
5594 "Apply map to outbound routes\n")
5596 DEFUN (no_neighbor_route_map
,
5597 no_neighbor_route_map_cmd
,
5598 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-map WORD <in|out>",
5602 "Apply route map to neighbor\n"
5603 "Name of route map\n"
5604 "Apply map to incoming routes\n"
5605 "Apply map to outbound routes\n")
5609 return peer_route_map_unset_vty(vty
, argv
[idx_peer
]->arg
,
5610 bgp_node_afi(vty
), bgp_node_safi(vty
),
5611 argv
[idx_in_out
]->arg
);
5614 ALIAS_HIDDEN(no_neighbor_route_map
, no_neighbor_route_map_hidden_cmd
,
5615 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-map WORD <in|out>",
5616 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5617 "Apply route map to neighbor\n"
5618 "Name of route map\n"
5619 "Apply map to incoming routes\n"
5620 "Apply map to outbound routes\n")
5622 /* Set unsuppress-map to the peer. */
5623 static int peer_unsuppress_map_set_vty(struct vty
*vty
, const char *ip_str
,
5624 afi_t afi
, safi_t safi
,
5625 const char *name_str
)
5630 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5632 return CMD_WARNING_CONFIG_FAILED
;
5634 ret
= peer_unsuppress_map_set(peer
, afi
, safi
, name_str
);
5636 return bgp_vty_return(vty
, ret
);
5639 /* Unset route-map from the peer. */
5640 static int peer_unsuppress_map_unset_vty(struct vty
*vty
, const char *ip_str
,
5641 afi_t afi
, safi_t safi
)
5646 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5648 return CMD_WARNING_CONFIG_FAILED
;
5650 ret
= peer_unsuppress_map_unset(peer
, afi
, safi
);
5652 return bgp_vty_return(vty
, ret
);
5655 DEFUN (neighbor_unsuppress_map
,
5656 neighbor_unsuppress_map_cmd
,
5657 "neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
5660 "Route-map to selectively unsuppress suppressed routes\n"
5661 "Name of route map\n")
5665 return peer_unsuppress_map_set_vty(
5666 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5667 argv
[idx_word
]->arg
);
5670 ALIAS_HIDDEN(neighbor_unsuppress_map
, neighbor_unsuppress_map_hidden_cmd
,
5671 "neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
5672 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5673 "Route-map to selectively unsuppress suppressed routes\n"
5674 "Name of route map\n")
5676 DEFUN (no_neighbor_unsuppress_map
,
5677 no_neighbor_unsuppress_map_cmd
,
5678 "no neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
5682 "Route-map to selectively unsuppress suppressed routes\n"
5683 "Name of route map\n")
5686 return peer_unsuppress_map_unset_vty(vty
, argv
[idx_peer
]->arg
,
5688 bgp_node_safi(vty
));
5691 ALIAS_HIDDEN(no_neighbor_unsuppress_map
, no_neighbor_unsuppress_map_hidden_cmd
,
5692 "no neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
5693 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5694 "Route-map to selectively unsuppress suppressed routes\n"
5695 "Name of route map\n")
5697 static int peer_maximum_prefix_set_vty(struct vty
*vty
, const char *ip_str
,
5698 afi_t afi
, safi_t safi
,
5699 const char *num_str
,
5700 const char *threshold_str
, int warning
,
5701 const char *restart_str
)
5709 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5711 return CMD_WARNING_CONFIG_FAILED
;
5713 max
= strtoul(num_str
, NULL
, 10);
5715 threshold
= atoi(threshold_str
);
5717 threshold
= MAXIMUM_PREFIX_THRESHOLD_DEFAULT
;
5720 restart
= atoi(restart_str
);
5724 ret
= peer_maximum_prefix_set(peer
, afi
, safi
, max
, threshold
, warning
,
5727 return bgp_vty_return(vty
, ret
);
5730 static int peer_maximum_prefix_unset_vty(struct vty
*vty
, const char *ip_str
,
5731 afi_t afi
, safi_t safi
)
5736 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5738 return CMD_WARNING_CONFIG_FAILED
;
5740 ret
= peer_maximum_prefix_unset(peer
, afi
, safi
);
5742 return bgp_vty_return(vty
, ret
);
5745 /* Maximum number of prefix configuration. prefix count is different
5746 for each peer configuration. So this configuration can be set for
5747 each peer configuration. */
5748 DEFUN (neighbor_maximum_prefix
,
5749 neighbor_maximum_prefix_cmd
,
5750 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295)",
5753 "Maximum number of prefix accept from this peer\n"
5754 "maximum no. of prefix limit\n")
5758 return peer_maximum_prefix_set_vty(
5759 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5760 argv
[idx_number
]->arg
, NULL
, 0, NULL
);
5763 ALIAS_HIDDEN(neighbor_maximum_prefix
, neighbor_maximum_prefix_hidden_cmd
,
5764 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295)",
5765 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5766 "Maximum number of prefix accept from this peer\n"
5767 "maximum no. of prefix limit\n")
5769 DEFUN (neighbor_maximum_prefix_threshold
,
5770 neighbor_maximum_prefix_threshold_cmd
,
5771 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100)",
5774 "Maximum number of prefix accept from this peer\n"
5775 "maximum no. of prefix limit\n"
5776 "Threshold value (%) at which to generate a warning msg\n")
5780 int idx_number_2
= 4;
5781 return peer_maximum_prefix_set_vty(
5782 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5783 argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
, 0, NULL
);
5787 neighbor_maximum_prefix_threshold
,
5788 neighbor_maximum_prefix_threshold_hidden_cmd
,
5789 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100)",
5790 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5791 "Maximum number of prefix accept from this peer\n"
5792 "maximum no. of prefix limit\n"
5793 "Threshold value (%) at which to generate a warning msg\n")
5795 DEFUN (neighbor_maximum_prefix_warning
,
5796 neighbor_maximum_prefix_warning_cmd
,
5797 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) warning-only",
5800 "Maximum number of prefix accept from this peer\n"
5801 "maximum no. of prefix limit\n"
5802 "Only give warning message when limit is exceeded\n")
5806 return peer_maximum_prefix_set_vty(
5807 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5808 argv
[idx_number
]->arg
, NULL
, 1, NULL
);
5812 neighbor_maximum_prefix_warning
,
5813 neighbor_maximum_prefix_warning_hidden_cmd
,
5814 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) warning-only",
5815 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5816 "Maximum number of prefix accept from this peer\n"
5817 "maximum no. of prefix limit\n"
5818 "Only give warning message when limit is exceeded\n")
5820 DEFUN (neighbor_maximum_prefix_threshold_warning
,
5821 neighbor_maximum_prefix_threshold_warning_cmd
,
5822 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) warning-only",
5825 "Maximum number of prefix accept from this peer\n"
5826 "maximum no. of prefix limit\n"
5827 "Threshold value (%) at which to generate a warning msg\n"
5828 "Only give warning message when limit is exceeded\n")
5832 int idx_number_2
= 4;
5833 return peer_maximum_prefix_set_vty(
5834 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5835 argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
, 1, NULL
);
5839 neighbor_maximum_prefix_threshold_warning
,
5840 neighbor_maximum_prefix_threshold_warning_hidden_cmd
,
5841 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) warning-only",
5842 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5843 "Maximum number of prefix accept from this peer\n"
5844 "maximum no. of prefix limit\n"
5845 "Threshold value (%) at which to generate a warning msg\n"
5846 "Only give warning message when limit is exceeded\n")
5848 DEFUN (neighbor_maximum_prefix_restart
,
5849 neighbor_maximum_prefix_restart_cmd
,
5850 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) restart (1-65535)",
5853 "Maximum number of prefix accept from this peer\n"
5854 "maximum no. of prefix limit\n"
5855 "Restart bgp connection after limit is exceeded\n"
5856 "Restart interval in minutes\n")
5860 int idx_number_2
= 5;
5861 return peer_maximum_prefix_set_vty(
5862 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5863 argv
[idx_number
]->arg
, NULL
, 0, argv
[idx_number_2
]->arg
);
5867 neighbor_maximum_prefix_restart
,
5868 neighbor_maximum_prefix_restart_hidden_cmd
,
5869 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) restart (1-65535)",
5870 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5871 "Maximum number of prefix accept from this peer\n"
5872 "maximum no. of prefix limit\n"
5873 "Restart bgp connection after limit is exceeded\n"
5874 "Restart interval in minutes\n")
5876 DEFUN (neighbor_maximum_prefix_threshold_restart
,
5877 neighbor_maximum_prefix_threshold_restart_cmd
,
5878 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) restart (1-65535)",
5881 "Maximum number of prefixes to accept from this peer\n"
5882 "maximum no. of prefix limit\n"
5883 "Threshold value (%) at which to generate a warning msg\n"
5884 "Restart bgp connection after limit is exceeded\n"
5885 "Restart interval in minutes\n")
5889 int idx_number_2
= 4;
5890 int idx_number_3
= 6;
5891 return peer_maximum_prefix_set_vty(
5892 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5893 argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
, 0,
5894 argv
[idx_number_3
]->arg
);
5898 neighbor_maximum_prefix_threshold_restart
,
5899 neighbor_maximum_prefix_threshold_restart_hidden_cmd
,
5900 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) restart (1-65535)",
5901 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5902 "Maximum number of prefixes to accept from this peer\n"
5903 "maximum no. of prefix limit\n"
5904 "Threshold value (%) at which to generate a warning msg\n"
5905 "Restart bgp connection after limit is exceeded\n"
5906 "Restart interval in minutes\n")
5908 DEFUN (no_neighbor_maximum_prefix
,
5909 no_neighbor_maximum_prefix_cmd
,
5910 "no neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix [(1-4294967295) [(1-100)] [restart (1-65535)] [warning-only]]",
5914 "Maximum number of prefixes to accept from this peer\n"
5915 "maximum no. of prefix limit\n"
5916 "Threshold value (%) at which to generate a warning msg\n"
5917 "Restart bgp connection after limit is exceeded\n"
5918 "Restart interval in minutes\n"
5919 "Only give warning message when limit is exceeded\n")
5922 return peer_maximum_prefix_unset_vty(vty
, argv
[idx_peer
]->arg
,
5924 bgp_node_safi(vty
));
5928 no_neighbor_maximum_prefix
, no_neighbor_maximum_prefix_hidden_cmd
,
5929 "no neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix [(1-4294967295) [(1-100)] [restart (1-65535)] [warning-only]]",
5930 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5931 "Maximum number of prefixes to accept from this peer\n"
5932 "maximum no. of prefix limit\n"
5933 "Threshold value (%) at which to generate a warning msg\n"
5934 "Restart bgp connection after limit is exceeded\n"
5935 "Restart interval in minutes\n"
5936 "Only give warning message when limit is exceeded\n")
5939 /* "neighbor allowas-in" */
5940 DEFUN (neighbor_allowas_in
,
5941 neighbor_allowas_in_cmd
,
5942 "neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
5945 "Accept as-path with my AS present in it\n"
5946 "Number of occurances of AS number\n"
5947 "Only accept my AS in the as-path if the route was originated in my AS\n")
5950 int idx_number_origin
= 3;
5956 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
5958 return CMD_WARNING_CONFIG_FAILED
;
5960 if (argc
<= idx_number_origin
)
5963 if (argv
[idx_number_origin
]->type
== WORD_TKN
)
5966 allow_num
= atoi(argv
[idx_number_origin
]->arg
);
5969 ret
= peer_allowas_in_set(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5972 return bgp_vty_return(vty
, ret
);
5976 neighbor_allowas_in
, neighbor_allowas_in_hidden_cmd
,
5977 "neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
5978 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5979 "Accept as-path with my AS present in it\n"
5980 "Number of occurances of AS number\n"
5981 "Only accept my AS in the as-path if the route was originated in my AS\n")
5983 DEFUN (no_neighbor_allowas_in
,
5984 no_neighbor_allowas_in_cmd
,
5985 "no neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
5989 "allow local ASN appears in aspath attribute\n"
5990 "Number of occurances of AS number\n"
5991 "Only accept my AS in the as-path if the route was originated in my AS\n")
5997 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
5999 return CMD_WARNING_CONFIG_FAILED
;
6001 ret
= peer_allowas_in_unset(peer
, bgp_node_afi(vty
),
6002 bgp_node_safi(vty
));
6004 return bgp_vty_return(vty
, ret
);
6008 no_neighbor_allowas_in
, no_neighbor_allowas_in_hidden_cmd
,
6009 "no neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
6010 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6011 "allow local ASN appears in aspath attribute\n"
6012 "Number of occurances of AS number\n"
6013 "Only accept my AS in the as-path if the route was originated in my AS\n")
6015 DEFUN (neighbor_ttl_security
,
6016 neighbor_ttl_security_cmd
,
6017 "neighbor <A.B.C.D|X:X::X:X|WORD> ttl-security hops (1-254)",
6020 "BGP ttl-security parameters\n"
6021 "Specify the maximum number of hops to the BGP peer\n"
6022 "Number of hops to BGP peer\n")
6029 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6031 return CMD_WARNING_CONFIG_FAILED
;
6033 gtsm_hops
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
6036 * If 'neighbor swpX', then this is for directly connected peers,
6037 * we should not accept a ttl-security hops value greater than 1.
6039 if (peer
->conf_if
&& (gtsm_hops
> 1)) {
6041 "%s is directly connected peer, hops cannot exceed 1\n",
6042 argv
[idx_peer
]->arg
);
6043 return CMD_WARNING_CONFIG_FAILED
;
6046 return bgp_vty_return(vty
, peer_ttl_security_hops_set(peer
, gtsm_hops
));
6049 DEFUN (no_neighbor_ttl_security
,
6050 no_neighbor_ttl_security_cmd
,
6051 "no neighbor <A.B.C.D|X:X::X:X|WORD> ttl-security hops (1-254)",
6055 "BGP ttl-security parameters\n"
6056 "Specify the maximum number of hops to the BGP peer\n"
6057 "Number of hops to BGP peer\n")
6062 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6064 return CMD_WARNING_CONFIG_FAILED
;
6066 return bgp_vty_return(vty
, peer_ttl_security_hops_unset(peer
));
6069 DEFUN (neighbor_addpath_tx_all_paths
,
6070 neighbor_addpath_tx_all_paths_cmd
,
6071 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
6074 "Use addpath to advertise all paths to a neighbor\n")
6079 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6081 return CMD_WARNING_CONFIG_FAILED
;
6083 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
6085 PEER_FLAG_ADDPATH_TX_ALL_PATHS
);
6088 ALIAS_HIDDEN(neighbor_addpath_tx_all_paths
,
6089 neighbor_addpath_tx_all_paths_hidden_cmd
,
6090 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
6091 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6092 "Use addpath to advertise all paths to a neighbor\n")
6094 DEFUN (no_neighbor_addpath_tx_all_paths
,
6095 no_neighbor_addpath_tx_all_paths_cmd
,
6096 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
6100 "Use addpath to advertise all paths to a neighbor\n")
6103 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
6104 bgp_node_afi(vty
), bgp_node_safi(vty
),
6105 PEER_FLAG_ADDPATH_TX_ALL_PATHS
);
6108 ALIAS_HIDDEN(no_neighbor_addpath_tx_all_paths
,
6109 no_neighbor_addpath_tx_all_paths_hidden_cmd
,
6110 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
6111 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6112 "Use addpath to advertise all paths to a neighbor\n")
6114 DEFUN (neighbor_addpath_tx_bestpath_per_as
,
6115 neighbor_addpath_tx_bestpath_per_as_cmd
,
6116 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
6119 "Use addpath to advertise the bestpath per each neighboring AS\n")
6124 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6126 return CMD_WARNING_CONFIG_FAILED
;
6128 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
6130 PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS
);
6133 ALIAS_HIDDEN(neighbor_addpath_tx_bestpath_per_as
,
6134 neighbor_addpath_tx_bestpath_per_as_hidden_cmd
,
6135 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
6136 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6137 "Use addpath to advertise the bestpath per each neighboring AS\n")
6139 DEFUN (no_neighbor_addpath_tx_bestpath_per_as
,
6140 no_neighbor_addpath_tx_bestpath_per_as_cmd
,
6141 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
6145 "Use addpath to advertise the bestpath per each neighboring AS\n")
6148 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
6149 bgp_node_afi(vty
), bgp_node_safi(vty
),
6150 PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS
);
6153 ALIAS_HIDDEN(no_neighbor_addpath_tx_bestpath_per_as
,
6154 no_neighbor_addpath_tx_bestpath_per_as_hidden_cmd
,
6155 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
6156 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6157 "Use addpath to advertise the bestpath per each neighboring AS\n")
6159 static int set_ecom_list(struct vty
*vty
, int argc
, struct cmd_token
**argv
,
6160 struct ecommunity
**list
)
6162 struct ecommunity
*ecom
= NULL
;
6163 struct ecommunity
*ecomadd
;
6165 for (; argc
; --argc
, ++argv
) {
6167 ecomadd
= ecommunity_str2com(argv
[0]->arg
,
6168 ECOMMUNITY_ROUTE_TARGET
, 0);
6170 vty_out(vty
, "Malformed community-list value\n");
6172 ecommunity_free(&ecom
);
6173 return CMD_WARNING_CONFIG_FAILED
;
6177 ecommunity_merge(ecom
, ecomadd
);
6178 ecommunity_free(&ecomadd
);
6185 ecommunity_free(&*list
);
6193 * v2vimport is true if we are handling a `import vrf ...` command
6195 static afi_t
vpn_policy_getafi(struct vty
*vty
, struct bgp
*bgp
, bool v2vimport
)
6199 switch (vty
->node
) {
6208 "%% context error: valid only in address-family <ipv4|ipv6> unicast block\n");
6213 if (CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
6214 BGP_CONFIG_VRF_TO_VRF_IMPORT
)
6215 || CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
6216 BGP_CONFIG_VRF_TO_VRF_EXPORT
)) {
6218 "%% error: Please unconfigure import vrf commands before using vpn commands\n");
6222 if (CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
6223 BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT
)
6224 || CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
6225 BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT
)) {
6227 "%% error: Please unconfigure vpn to vrf commands before using import vrf commands\n");
6234 DEFPY (af_rd_vpn_export
,
6235 af_rd_vpn_export_cmd
,
6236 "[no] rd vpn export ASN:NN_OR_IP-ADDRESS:NN$rd_str",
6238 "Specify route distinguisher\n"
6239 "Between current address-family and vpn\n"
6240 "For routes leaked from current address-family to vpn\n"
6241 "Route Distinguisher (<as-number>:<number> | <ip-address>:<number>)\n")
6243 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6244 struct prefix_rd prd
;
6250 if (argv_find(argv
, argc
, "no", &idx
))
6254 ret
= str2prefix_rd(rd_str
, &prd
);
6256 vty_out(vty
, "%% Malformed rd\n");
6257 return CMD_WARNING_CONFIG_FAILED
;
6261 afi
= vpn_policy_getafi(vty
, bgp
, false);
6263 return CMD_WARNING_CONFIG_FAILED
;
6266 * pre-change: un-export vpn routes (vpn->vrf routes unaffected)
6268 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6269 bgp_get_default(), bgp
);
6272 bgp
->vpn_policy
[afi
].tovpn_rd
= prd
;
6273 SET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6274 BGP_VPN_POLICY_TOVPN_RD_SET
);
6276 UNSET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6277 BGP_VPN_POLICY_TOVPN_RD_SET
);
6280 /* post-change: re-export vpn routes */
6281 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6282 bgp_get_default(), bgp
);
6287 ALIAS (af_rd_vpn_export
,
6288 af_no_rd_vpn_export_cmd
,
6291 "Specify route distinguisher\n"
6292 "Between current address-family and vpn\n"
6293 "For routes leaked from current address-family to vpn\n")
6295 DEFPY (af_label_vpn_export
,
6296 af_label_vpn_export_cmd
,
6297 "[no] label vpn export <(0-1048575)$label_val|auto$label_auto>",
6299 "label value for VRF\n"
6300 "Between current address-family and vpn\n"
6301 "For routes leaked from current address-family to vpn\n"
6302 "Label Value <0-1048575>\n"
6303 "Automatically assign a label\n")
6305 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6306 mpls_label_t label
= MPLS_LABEL_NONE
;
6311 if (argv_find(argv
, argc
, "no", &idx
))
6314 /* If "no ...", squash trailing parameter */
6320 label
= label_val
; /* parser should force unsigned */
6323 afi
= vpn_policy_getafi(vty
, bgp
, false);
6325 return CMD_WARNING_CONFIG_FAILED
;
6328 if (label_auto
&& CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
6329 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
))
6334 * pre-change: un-export vpn routes (vpn->vrf routes unaffected)
6336 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6337 bgp_get_default(), bgp
);
6339 if (!label_auto
&& CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
6340 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
)) {
6342 if (bgp
->vpn_policy
[afi
].tovpn_label
!= MPLS_LABEL_NONE
) {
6345 * label has previously been automatically
6346 * assigned by labelpool: release it
6348 * NB if tovpn_label == MPLS_LABEL_NONE it
6349 * means the automatic assignment is in flight
6350 * and therefore the labelpool callback must
6351 * detect that the auto label is not needed.
6354 bgp_lp_release(LP_TYPE_VRF
,
6355 &bgp
->vpn_policy
[afi
],
6356 bgp
->vpn_policy
[afi
].tovpn_label
);
6358 UNSET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6359 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
);
6362 bgp
->vpn_policy
[afi
].tovpn_label
= label
;
6364 SET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6365 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
);
6366 bgp_lp_get(LP_TYPE_VRF
, &bgp
->vpn_policy
[afi
],
6367 vpn_leak_label_callback
);
6370 /* post-change: re-export vpn routes */
6371 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6372 bgp_get_default(), bgp
);
6377 ALIAS (af_label_vpn_export
,
6378 af_no_label_vpn_export_cmd
,
6379 "no label vpn export",
6381 "label value for VRF\n"
6382 "Between current address-family and vpn\n"
6383 "For routes leaked from current address-family to vpn\n")
6385 DEFPY (af_nexthop_vpn_export
,
6386 af_nexthop_vpn_export_cmd
,
6387 "[no] nexthop vpn export <A.B.C.D|X:X::X:X>$nexthop_str",
6389 "Specify next hop to use for VRF advertised prefixes\n"
6390 "Between current address-family and vpn\n"
6391 "For routes leaked from current address-family to vpn\n"
6395 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6401 if (argv_find(argv
, argc
, "no", &idx
))
6405 if (!sockunion2hostprefix(nexthop_str
, &p
))
6406 return CMD_WARNING_CONFIG_FAILED
;
6409 afi
= vpn_policy_getafi(vty
, bgp
, false);
6411 return CMD_WARNING_CONFIG_FAILED
;
6414 * pre-change: un-export vpn routes (vpn->vrf routes unaffected)
6416 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6417 bgp_get_default(), bgp
);
6420 bgp
->vpn_policy
[afi
].tovpn_nexthop
= p
;
6421 SET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6422 BGP_VPN_POLICY_TOVPN_NEXTHOP_SET
);
6424 UNSET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6425 BGP_VPN_POLICY_TOVPN_NEXTHOP_SET
);
6428 /* post-change: re-export vpn routes */
6429 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6430 bgp_get_default(), bgp
);
6435 ALIAS (af_nexthop_vpn_export
,
6436 af_no_nexthop_vpn_export_cmd
,
6437 "no nexthop vpn export",
6439 "Specify next hop to use for VRF advertised prefixes\n"
6440 "Between current address-family and vpn\n"
6441 "For routes leaked from current address-family to vpn\n")
6443 static int vpn_policy_getdirs(struct vty
*vty
, const char *dstr
, int *dodir
)
6445 if (!strcmp(dstr
, "import")) {
6446 dodir
[BGP_VPN_POLICY_DIR_FROMVPN
] = 1;
6447 } else if (!strcmp(dstr
, "export")) {
6448 dodir
[BGP_VPN_POLICY_DIR_TOVPN
] = 1;
6449 } else if (!strcmp(dstr
, "both")) {
6450 dodir
[BGP_VPN_POLICY_DIR_FROMVPN
] = 1;
6451 dodir
[BGP_VPN_POLICY_DIR_TOVPN
] = 1;
6453 vty_out(vty
, "%% direction parse error\n");
6454 return CMD_WARNING_CONFIG_FAILED
;
6459 DEFPY (af_rt_vpn_imexport
,
6460 af_rt_vpn_imexport_cmd
,
6461 "[no] <rt|route-target> vpn <import|export|both>$direction_str RTLIST...",
6463 "Specify route target list\n"
6464 "Specify route target list\n"
6465 "Between current address-family and vpn\n"
6466 "For routes leaked from vpn to current address-family: match any\n"
6467 "For routes leaked from current address-family to vpn: set\n"
6468 "both import: match any and export: set\n"
6469 "Space separated route target list (A.B.C.D:MN|EF:OPQR|GHJK:MN)\n")
6471 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6473 struct ecommunity
*ecom
= NULL
;
6474 int dodir
[BGP_VPN_POLICY_DIR_MAX
] = {0};
6475 vpn_policy_direction_t dir
;
6480 if (argv_find(argv
, argc
, "no", &idx
))
6483 afi
= vpn_policy_getafi(vty
, bgp
, false);
6485 return CMD_WARNING_CONFIG_FAILED
;
6487 ret
= vpn_policy_getdirs(vty
, direction_str
, dodir
);
6488 if (ret
!= CMD_SUCCESS
)
6492 if (!argv_find(argv
, argc
, "RTLIST", &idx
)) {
6493 vty_out(vty
, "%% Missing RTLIST\n");
6494 return CMD_WARNING_CONFIG_FAILED
;
6496 ret
= set_ecom_list(vty
, argc
- idx
, argv
+ idx
, &ecom
);
6497 if (ret
!= CMD_SUCCESS
) {
6502 for (dir
= 0; dir
< BGP_VPN_POLICY_DIR_MAX
; ++dir
) {
6506 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
6509 if (bgp
->vpn_policy
[afi
].rtlist
[dir
])
6511 &bgp
->vpn_policy
[afi
].rtlist
[dir
]);
6512 bgp
->vpn_policy
[afi
].rtlist
[dir
] =
6513 ecommunity_dup(ecom
);
6515 if (bgp
->vpn_policy
[afi
].rtlist
[dir
])
6517 &bgp
->vpn_policy
[afi
].rtlist
[dir
]);
6518 bgp
->vpn_policy
[afi
].rtlist
[dir
] = NULL
;
6521 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
6525 ecommunity_free(&ecom
);
6530 ALIAS (af_rt_vpn_imexport
,
6531 af_no_rt_vpn_imexport_cmd
,
6532 "no <rt|route-target> vpn <import|export|both>$direction_str",
6534 "Specify route target list\n"
6535 "Specify route target list\n"
6536 "Between current address-family and vpn\n"
6537 "For routes leaked from vpn to current address-family\n"
6538 "For routes leaked from current address-family to vpn\n"
6539 "both import and export\n")
6541 DEFPY (af_route_map_vpn_imexport
,
6542 af_route_map_vpn_imexport_cmd
,
6543 /* future: "route-map <vpn|evpn|vrf NAME> <import|export> RMAP" */
6544 "[no] route-map vpn <import|export>$direction_str RMAP$rmap_str",
6546 "Specify route map\n"
6547 "Between current address-family and vpn\n"
6548 "For routes leaked from vpn to current address-family\n"
6549 "For routes leaked from current address-family to vpn\n"
6550 "name of route-map\n")
6552 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6554 int dodir
[BGP_VPN_POLICY_DIR_MAX
] = {0};
6555 vpn_policy_direction_t dir
;
6560 if (argv_find(argv
, argc
, "no", &idx
))
6563 afi
= vpn_policy_getafi(vty
, bgp
, false);
6565 return CMD_WARNING_CONFIG_FAILED
;
6567 ret
= vpn_policy_getdirs(vty
, direction_str
, dodir
);
6568 if (ret
!= CMD_SUCCESS
)
6571 for (dir
= 0; dir
< BGP_VPN_POLICY_DIR_MAX
; ++dir
) {
6575 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
6578 if (bgp
->vpn_policy
[afi
].rmap_name
[dir
])
6579 XFREE(MTYPE_ROUTE_MAP_NAME
,
6580 bgp
->vpn_policy
[afi
].rmap_name
[dir
]);
6581 bgp
->vpn_policy
[afi
].rmap_name
[dir
] = XSTRDUP(
6582 MTYPE_ROUTE_MAP_NAME
, rmap_str
);
6583 bgp
->vpn_policy
[afi
].rmap
[dir
] =
6584 route_map_lookup_by_name(rmap_str
);
6585 if (!bgp
->vpn_policy
[afi
].rmap
[dir
])
6588 if (bgp
->vpn_policy
[afi
].rmap_name
[dir
])
6589 XFREE(MTYPE_ROUTE_MAP_NAME
,
6590 bgp
->vpn_policy
[afi
].rmap_name
[dir
]);
6591 bgp
->vpn_policy
[afi
].rmap_name
[dir
] = NULL
;
6592 bgp
->vpn_policy
[afi
].rmap
[dir
] = NULL
;
6595 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
6601 ALIAS (af_route_map_vpn_imexport
,
6602 af_no_route_map_vpn_imexport_cmd
,
6603 "no route-map vpn <import|export>$direction_str",
6605 "Specify route map\n"
6606 "Between current address-family and vpn\n"
6607 "For routes leaked from vpn to current address-family\n"
6608 "For routes leaked from current address-family to vpn\n")
6610 DEFPY(af_import_vrf_route_map
, af_import_vrf_route_map_cmd
,
6611 "[no] import vrf route-map RMAP$rmap_str",
6613 "Import routes from another VRF\n"
6614 "Vrf routes being filtered\n"
6615 "Specify route map\n"
6616 "name of route-map\n")
6618 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6619 vpn_policy_direction_t dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
6623 struct bgp
*bgp_default
;
6625 if (argv_find(argv
, argc
, "no", &idx
))
6628 afi
= vpn_policy_getafi(vty
, bgp
, true);
6630 return CMD_WARNING_CONFIG_FAILED
;
6632 bgp_default
= bgp_get_default();
6637 /* Auto-create assuming the same AS */
6638 ret
= bgp_get(&bgp_default
, &as
, NULL
,
6639 BGP_INSTANCE_TYPE_DEFAULT
);
6643 "VRF default is not configured as a bgp instance\n");
6648 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
6651 if (bgp
->vpn_policy
[afi
].rmap_name
[dir
])
6652 XFREE(MTYPE_ROUTE_MAP_NAME
,
6653 bgp
->vpn_policy
[afi
].rmap_name
[dir
]);
6654 bgp
->vpn_policy
[afi
].rmap_name
[dir
] =
6655 XSTRDUP(MTYPE_ROUTE_MAP_NAME
, rmap_str
);
6656 bgp
->vpn_policy
[afi
].rmap
[dir
] =
6657 route_map_lookup_by_name(rmap_str
);
6658 if (!bgp
->vpn_policy
[afi
].rmap
[dir
])
6661 if (bgp
->vpn_policy
[afi
].rmap_name
[dir
])
6662 XFREE(MTYPE_ROUTE_MAP_NAME
,
6663 bgp
->vpn_policy
[afi
].rmap_name
[dir
]);
6664 bgp
->vpn_policy
[afi
].rmap_name
[dir
] = NULL
;
6665 bgp
->vpn_policy
[afi
].rmap
[dir
] = NULL
;
6668 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
6673 ALIAS(af_import_vrf_route_map
, af_no_import_vrf_route_map_cmd
,
6674 "no import vrf route-map",
6676 "Import routes from another VRF\n"
6677 "Vrf routes being filtered\n"
6678 "Specify route map\n")
6680 DEFPY (bgp_imexport_vrf
,
6681 bgp_imexport_vrf_cmd
,
6682 "[no] import vrf NAME$import_name",
6684 "Import routes from another VRF\n"
6685 "VRF to import from\n"
6686 "The name of the VRF\n")
6688 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6689 struct listnode
*node
;
6690 struct bgp
*vrf_bgp
, *bgp_default
;
6693 bool remove
= false;
6696 enum bgp_instance_type bgp_type
= BGP_INSTANCE_TYPE_VRF
;
6700 if (argv_find(argv
, argc
, "no", &idx
))
6703 afi
= vpn_policy_getafi(vty
, bgp
, true);
6705 return CMD_WARNING_CONFIG_FAILED
;
6707 safi
= bgp_node_safi(vty
);
6709 if (((BGP_INSTANCE_TYPE_DEFAULT
== bgp
->inst_type
)
6710 && (strcmp(import_name
, BGP_DEFAULT_NAME
) == 0))
6711 || (bgp
->name
&& (strcmp(import_name
, bgp
->name
) == 0))) {
6712 vty_out(vty
, "%% Cannot %s vrf %s into itself\n",
6713 remove
? "unimport" : "import", import_name
);
6717 bgp_default
= bgp_get_default();
6719 /* Auto-create assuming the same AS */
6720 ret
= bgp_get(&bgp_default
, &as
, NULL
,
6721 BGP_INSTANCE_TYPE_DEFAULT
);
6725 "VRF default is not configured as a bgp instance\n");
6730 vrf_bgp
= bgp_lookup_by_name(import_name
);
6732 if (strcmp(import_name
, BGP_DEFAULT_NAME
) == 0)
6733 vrf_bgp
= bgp_default
;
6735 /* Auto-create assuming the same AS */
6736 ret
= bgp_get(&vrf_bgp
, &as
, import_name
, bgp_type
);
6740 "VRF %s is not configured as a bgp instance\n",
6747 vrf_unimport_from_vrf(bgp
, vrf_bgp
, afi
, safi
);
6749 /* Already importing from "import_vrf"? */
6750 for (ALL_LIST_ELEMENTS_RO(bgp
->vpn_policy
[afi
].import_vrf
, node
,
6752 if (strcmp(vname
, import_name
) == 0)
6756 vrf_import_from_vrf(bgp
, vrf_bgp
, afi
, safi
);
6762 /* This command is valid only in a bgp vrf instance or the default instance */
6763 DEFPY (bgp_imexport_vpn
,
6764 bgp_imexport_vpn_cmd
,
6765 "[no] <import|export>$direction_str vpn",
6767 "Import routes to this address-family\n"
6768 "Export routes from this address-family\n"
6769 "to/from default instance VPN RIB\n")
6771 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6778 vpn_policy_direction_t dir
;
6780 if (argv_find(argv
, argc
, "no", &idx
))
6783 if (BGP_INSTANCE_TYPE_VRF
!= bgp
->inst_type
&&
6784 BGP_INSTANCE_TYPE_DEFAULT
!= bgp
->inst_type
) {
6786 vty_out(vty
, "%% import|export vpn valid only for bgp vrf or default instance\n");
6787 return CMD_WARNING_CONFIG_FAILED
;
6790 afi
= bgp_node_afi(vty
);
6791 safi
= bgp_node_safi(vty
);
6792 if ((SAFI_UNICAST
!= safi
) || ((AFI_IP
!= afi
) && (AFI_IP6
!= afi
))) {
6793 vty_out(vty
, "%% import|export vpn valid only for unicast ipv4|ipv6\n");
6794 return CMD_WARNING_CONFIG_FAILED
;
6797 if (!strcmp(direction_str
, "import")) {
6798 flag
= BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT
;
6799 dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
6800 } else if (!strcmp(direction_str
, "export")) {
6801 flag
= BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT
;
6802 dir
= BGP_VPN_POLICY_DIR_TOVPN
;
6804 vty_out(vty
, "%% unknown direction %s\n", direction_str
);
6805 return CMD_WARNING_CONFIG_FAILED
;
6808 previous_state
= CHECK_FLAG(bgp
->af_flags
[afi
][safi
], flag
);
6811 SET_FLAG(bgp
->af_flags
[afi
][safi
], flag
);
6812 if (!previous_state
) {
6813 /* trigger export current vrf */
6814 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
6817 if (previous_state
) {
6818 /* trigger un-export current vrf */
6819 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
6821 UNSET_FLAG(bgp
->af_flags
[afi
][safi
], flag
);
6827 DEFPY (af_routetarget_import
,
6828 af_routetarget_import_cmd
,
6829 "[no] <rt|route-target> redirect import RTLIST...",
6831 "Specify route target list\n"
6832 "Specify route target list\n"
6833 "Flow-spec redirect type route target\n"
6834 "Import routes to this address-family\n"
6835 "Space separated route target list (A.B.C.D:MN|EF:OPQR|GHJK:MN)\n")
6837 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6839 struct ecommunity
*ecom
= NULL
;
6844 if (argv_find(argv
, argc
, "no", &idx
))
6847 afi
= vpn_policy_getafi(vty
, bgp
, false);
6849 return CMD_WARNING_CONFIG_FAILED
;
6852 if (!argv_find(argv
, argc
, "RTLIST", &idx
)) {
6853 vty_out(vty
, "%% Missing RTLIST\n");
6854 return CMD_WARNING_CONFIG_FAILED
;
6856 ret
= set_ecom_list(vty
, argc
- idx
, argv
+ idx
, &ecom
);
6857 if (ret
!= CMD_SUCCESS
)
6862 if (bgp
->vpn_policy
[afi
].import_redirect_rtlist
)
6863 ecommunity_free(&bgp
->vpn_policy
[afi
]
6864 .import_redirect_rtlist
);
6865 bgp
->vpn_policy
[afi
].import_redirect_rtlist
=
6866 ecommunity_dup(ecom
);
6868 if (bgp
->vpn_policy
[afi
].import_redirect_rtlist
)
6869 ecommunity_free(&bgp
->vpn_policy
[afi
]
6870 .import_redirect_rtlist
);
6871 bgp
->vpn_policy
[afi
].import_redirect_rtlist
= NULL
;
6875 ecommunity_free(&ecom
);
6880 DEFUN_NOSH (address_family_ipv4_safi
,
6881 address_family_ipv4_safi_cmd
,
6882 "address-family ipv4 [<unicast|multicast|vpn|labeled-unicast|flowspec>]",
6883 "Enter Address Family command mode\n"
6885 BGP_SAFI_WITH_LABEL_HELP_STR
)
6889 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6890 safi_t safi
= bgp_vty_safi_from_str(argv
[2]->text
);
6891 if (bgp
->inst_type
!= BGP_INSTANCE_TYPE_DEFAULT
6892 && safi
!= SAFI_UNICAST
&& safi
!= SAFI_MULTICAST
6893 && safi
!= SAFI_EVPN
) {
6895 "Only Unicast/Multicast/EVPN SAFIs supported in non-core instances.\n");
6896 return CMD_WARNING_CONFIG_FAILED
;
6898 vty
->node
= bgp_node_type(AFI_IP
, safi
);
6900 vty
->node
= BGP_IPV4_NODE
;
6905 DEFUN_NOSH (address_family_ipv6_safi
,
6906 address_family_ipv6_safi_cmd
,
6907 "address-family ipv6 [<unicast|multicast|vpn|labeled-unicast|flowspec>]",
6908 "Enter Address Family command mode\n"
6910 BGP_SAFI_WITH_LABEL_HELP_STR
)
6913 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6914 safi_t safi
= bgp_vty_safi_from_str(argv
[2]->text
);
6915 if (bgp
->inst_type
!= BGP_INSTANCE_TYPE_DEFAULT
6916 && safi
!= SAFI_UNICAST
&& safi
!= SAFI_MULTICAST
6917 && safi
!= SAFI_EVPN
) {
6919 "Only Unicast/Multicast/EVPN SAFIs supported in non-core instances.\n");
6920 return CMD_WARNING_CONFIG_FAILED
;
6922 vty
->node
= bgp_node_type(AFI_IP6
, safi
);
6924 vty
->node
= BGP_IPV6_NODE
;
6929 #ifdef KEEP_OLD_VPN_COMMANDS
6930 DEFUN_NOSH (address_family_vpnv4
,
6931 address_family_vpnv4_cmd
,
6932 "address-family vpnv4 [unicast]",
6933 "Enter Address Family command mode\n"
6935 "Address Family modifier\n")
6937 vty
->node
= BGP_VPNV4_NODE
;
6941 DEFUN_NOSH (address_family_vpnv6
,
6942 address_family_vpnv6_cmd
,
6943 "address-family vpnv6 [unicast]",
6944 "Enter Address Family command mode\n"
6946 "Address Family modifier\n")
6948 vty
->node
= BGP_VPNV6_NODE
;
6953 DEFUN_NOSH (address_family_evpn
,
6954 address_family_evpn_cmd
,
6955 "address-family l2vpn evpn",
6956 "Enter Address Family command mode\n"
6958 "Address Family modifier\n")
6960 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6961 vty
->node
= BGP_EVPN_NODE
;
6965 DEFUN_NOSH (exit_address_family
,
6966 exit_address_family_cmd
,
6967 "exit-address-family",
6968 "Exit from Address Family configuration mode\n")
6970 if (vty
->node
== BGP_IPV4_NODE
|| vty
->node
== BGP_IPV4M_NODE
6971 || vty
->node
== BGP_IPV4L_NODE
|| vty
->node
== BGP_VPNV4_NODE
6972 || vty
->node
== BGP_IPV6_NODE
|| vty
->node
== BGP_IPV6M_NODE
6973 || vty
->node
== BGP_IPV6L_NODE
|| vty
->node
== BGP_VPNV6_NODE
6974 || vty
->node
== BGP_EVPN_NODE
6975 || vty
->node
== BGP_FLOWSPECV4_NODE
6976 || vty
->node
== BGP_FLOWSPECV6_NODE
)
6977 vty
->node
= BGP_NODE
;
6981 /* Recalculate bestpath and re-advertise a prefix */
6982 static int bgp_clear_prefix(struct vty
*vty
, const char *view_name
,
6983 const char *ip_str
, afi_t afi
, safi_t safi
,
6984 struct prefix_rd
*prd
)
6987 struct prefix match
;
6988 struct bgp_node
*rn
;
6989 struct bgp_node
*rm
;
6991 struct bgp_table
*table
;
6992 struct bgp_table
*rib
;
6994 /* BGP structure lookup. */
6996 bgp
= bgp_lookup_by_name(view_name
);
6998 vty_out(vty
, "%% Can't find BGP instance %s\n",
7003 bgp
= bgp_get_default();
7005 vty_out(vty
, "%% No BGP process is configured\n");
7010 /* Check IP address argument. */
7011 ret
= str2prefix(ip_str
, &match
);
7013 vty_out(vty
, "%% address is malformed\n");
7017 match
.family
= afi2family(afi
);
7018 rib
= bgp
->rib
[afi
][safi
];
7020 if (safi
== SAFI_MPLS_VPN
) {
7021 for (rn
= bgp_table_top(rib
); rn
; rn
= bgp_route_next(rn
)) {
7022 if (prd
&& memcmp(rn
->p
.u
.val
, prd
->val
, 8) != 0)
7025 if ((table
= rn
->info
) != NULL
) {
7026 if ((rm
= bgp_node_match(table
, &match
))
7029 == match
.prefixlen
) {
7031 BGP_NODE_USER_CLEAR
);
7032 bgp_process(bgp
, rm
, afi
, safi
);
7034 bgp_unlock_node(rm
);
7039 if ((rn
= bgp_node_match(rib
, &match
)) != NULL
) {
7040 if (rn
->p
.prefixlen
== match
.prefixlen
) {
7041 SET_FLAG(rn
->flags
, BGP_NODE_USER_CLEAR
);
7042 bgp_process(bgp
, rn
, afi
, safi
);
7044 bgp_unlock_node(rn
);
7051 /* one clear bgp command to rule them all */
7052 DEFUN (clear_ip_bgp_all
,
7053 clear_ip_bgp_all_cmd
,
7054 "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>]",
7058 BGP_INSTANCE_HELP_STR
7060 BGP_SAFI_WITH_LABEL_HELP_STR
7062 "BGP neighbor address to clear\n"
7063 "BGP IPv6 neighbor to clear\n"
7064 "BGP neighbor on interface to clear\n"
7065 "Clear peers with the AS number\n"
7066 "Clear all external peers\n"
7067 "Clear all members of peer-group\n"
7068 "BGP peer-group name\n"
7073 "Push out prefix-list ORF and do inbound soft reconfig\n"
7078 afi_t afi
= AFI_IP6
;
7079 safi_t safi
= SAFI_UNICAST
;
7080 enum clear_sort clr_sort
= clear_peer
;
7081 enum bgp_clear_type clr_type
;
7082 char *clr_arg
= NULL
;
7086 /* clear [ip] bgp */
7087 if (argv_find(argv
, argc
, "ip", &idx
))
7090 /* [<view|vrf> VIEWVRFNAME] */
7091 if (argv_find(argv
, argc
, "view", &idx
)
7092 || argv_find(argv
, argc
, "vrf", &idx
)) {
7093 vrf
= argv
[idx
+ 1]->arg
;
7097 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
7098 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
))
7099 argv_find_and_parse_safi(argv
, argc
, &idx
, &safi
);
7101 /* <*|A.B.C.D|X:X::X:X|WORD|(1-4294967295)|external|peer-group WORD> */
7102 if (argv_find(argv
, argc
, "*", &idx
)) {
7103 clr_sort
= clear_all
;
7104 } else if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7105 clr_sort
= clear_peer
;
7106 clr_arg
= argv
[idx
]->arg
;
7107 } else if (argv_find(argv
, argc
, "X:X::X:X", &idx
)) {
7108 clr_sort
= clear_peer
;
7109 clr_arg
= argv
[idx
]->arg
;
7110 } else if (argv_find(argv
, argc
, "peer-group", &idx
)) {
7111 clr_sort
= clear_group
;
7113 clr_arg
= argv
[idx
]->arg
;
7114 } else if (argv_find(argv
, argc
, "WORD", &idx
)) {
7115 clr_sort
= clear_peer
;
7116 clr_arg
= argv
[idx
]->arg
;
7117 } else if (argv_find(argv
, argc
, "(1-4294967295)", &idx
)) {
7118 clr_sort
= clear_as
;
7119 clr_arg
= argv
[idx
]->arg
;
7120 } else if (argv_find(argv
, argc
, "external", &idx
)) {
7121 clr_sort
= clear_external
;
7124 /* [<soft [<in|out>]|in [prefix-filter]|out>] */
7125 if (argv_find(argv
, argc
, "soft", &idx
)) {
7126 if (argv_find(argv
, argc
, "in", &idx
)
7127 || argv_find(argv
, argc
, "out", &idx
))
7128 clr_type
= strmatch(argv
[idx
]->text
, "in")
7130 : BGP_CLEAR_SOFT_OUT
;
7132 clr_type
= BGP_CLEAR_SOFT_BOTH
;
7133 } else if (argv_find(argv
, argc
, "in", &idx
)) {
7134 clr_type
= argv_find(argv
, argc
, "prefix-filter", &idx
)
7135 ? BGP_CLEAR_SOFT_IN_ORF_PREFIX
7136 : BGP_CLEAR_SOFT_IN
;
7137 } else if (argv_find(argv
, argc
, "out", &idx
)) {
7138 clr_type
= BGP_CLEAR_SOFT_OUT
;
7140 clr_type
= BGP_CLEAR_SOFT_NONE
;
7142 return bgp_clear_vty(vty
, vrf
, afi
, safi
, clr_sort
, clr_type
, clr_arg
);
7145 DEFUN (clear_ip_bgp_prefix
,
7146 clear_ip_bgp_prefix_cmd
,
7147 "clear [ip] bgp [<view|vrf> VIEWVRFNAME] prefix A.B.C.D/M",
7151 BGP_INSTANCE_HELP_STR
7152 "Clear bestpath and re-advertise\n"
7156 char *prefix
= NULL
;
7160 /* [<view|vrf> VIEWVRFNAME] */
7161 if (argv_find(argv
, argc
, "VIEWVRFNAME", &idx
))
7162 vrf
= argv
[idx
]->arg
;
7164 prefix
= argv
[argc
- 1]->arg
;
7166 return bgp_clear_prefix(vty
, vrf
, prefix
, AFI_IP
, SAFI_UNICAST
, NULL
);
7169 DEFUN (clear_bgp_ipv6_safi_prefix
,
7170 clear_bgp_ipv6_safi_prefix_cmd
,
7171 "clear [ip] bgp ipv6 "BGP_SAFI_CMD_STR
" prefix X:X::X:X/M",
7177 "Clear bestpath and re-advertise\n"
7181 int idx_ipv6_prefix
= 0;
7182 safi_t safi
= SAFI_UNICAST
;
7183 char *prefix
= argv_find(argv
, argc
, "X:X::X:X/M", &idx_ipv6_prefix
) ?
7184 argv
[idx_ipv6_prefix
]->arg
: NULL
;
7186 argv_find_and_parse_safi(argv
, argc
, &idx_safi
, &safi
);
7187 return bgp_clear_prefix(
7188 vty
, NULL
, prefix
, AFI_IP6
,
7192 DEFUN (clear_bgp_instance_ipv6_safi_prefix
,
7193 clear_bgp_instance_ipv6_safi_prefix_cmd
,
7194 "clear [ip] bgp <view|vrf> VIEWVRFNAME ipv6 "BGP_SAFI_CMD_STR
" prefix X:X::X:X/M",
7198 BGP_INSTANCE_HELP_STR
7201 "Clear bestpath and re-advertise\n"
7206 int idx_ipv6_prefix
= 0;
7207 safi_t safi
= SAFI_UNICAST
;
7208 char *prefix
= argv_find(argv
, argc
, "X:X::X:X/M", &idx_ipv6_prefix
) ?
7209 argv
[idx_ipv6_prefix
]->arg
: NULL
;
7210 /* [<view|vrf> VIEWVRFNAME] */
7211 char *vrfview
= argv_find(argv
, argc
, "VIEWVRFNAME", &idx_word
) ?
7212 argv
[idx_word
]->arg
: NULL
;
7214 argv_find_and_parse_safi(argv
, argc
, &idx_safi
, &safi
);
7216 return bgp_clear_prefix(
7217 vty
, vrfview
, prefix
,
7218 AFI_IP6
, safi
, NULL
);
7221 DEFUN (show_bgp_views
,
7223 "show [ip] bgp views",
7227 "Show the defined BGP views\n")
7229 struct list
*inst
= bm
->bgp
;
7230 struct listnode
*node
;
7233 if (!bgp_option_check(BGP_OPT_MULTIPLE_INSTANCE
)) {
7234 vty_out(vty
, "BGP Multiple Instance is not enabled\n");
7238 vty_out(vty
, "Defined BGP views:\n");
7239 for (ALL_LIST_ELEMENTS_RO(inst
, node
, bgp
)) {
7241 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_VRF
)
7243 vty_out(vty
, "\t%s (AS%u)\n", bgp
->name
? bgp
->name
: "(null)",
7250 DEFUN (show_bgp_vrfs
,
7252 "show [ip] bgp vrfs [json]",
7259 char buf
[ETHER_ADDR_STRLEN
];
7260 struct list
*inst
= bm
->bgp
;
7261 struct listnode
*node
;
7263 uint8_t uj
= use_json(argc
, argv
);
7264 json_object
*json
= NULL
;
7265 json_object
*json_vrfs
= NULL
;
7268 if (!bgp_option_check(BGP_OPT_MULTIPLE_INSTANCE
)) {
7269 vty_out(vty
, "BGP Multiple Instance is not enabled\n");
7274 json
= json_object_new_object();
7275 json_vrfs
= json_object_new_object();
7278 for (ALL_LIST_ELEMENTS_RO(inst
, node
, bgp
)) {
7279 const char *name
, *type
;
7281 struct listnode
*node
, *nnode
;
7282 int peers_cfg
, peers_estb
;
7283 json_object
*json_vrf
= NULL
;
7286 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_VIEW
)
7290 if (!uj
&& count
== 1)
7292 "%4s %-5s %-16s %9s %10s %-37s %-10s %-15s\n",
7293 "Type", "Id", "routerId", "#PeersVfg",
7294 "#PeersEstb", "Name", "L3-VNI", "Rmac");
7296 peers_cfg
= peers_estb
= 0;
7298 json_vrf
= json_object_new_object();
7301 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
7302 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
7305 if (peer
->status
== Established
)
7309 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
) {
7319 int64_t vrf_id_ui
= (bgp
->vrf_id
== VRF_UNKNOWN
)
7321 : (int64_t)bgp
->vrf_id
;
7322 json_object_string_add(json_vrf
, "type", type
);
7323 json_object_int_add(json_vrf
, "vrfId", vrf_id_ui
);
7324 json_object_string_add(json_vrf
, "routerId",
7325 inet_ntoa(bgp
->router_id
));
7326 json_object_int_add(json_vrf
, "numConfiguredPeers",
7328 json_object_int_add(json_vrf
, "numEstablishedPeers",
7331 json_object_int_add(json_vrf
, "l3vni", bgp
->l3vni
);
7332 json_object_string_add(
7334 prefix_mac2str(&bgp
->rmac
, buf
, sizeof(buf
)));
7335 json_object_object_add(json_vrfs
, name
, json_vrf
);
7338 "%4s %-5d %-16s %9u %10u %-37s %-10u %-15s\n",
7340 bgp
->vrf_id
== VRF_UNKNOWN
? -1
7342 inet_ntoa(bgp
->router_id
), peers_cfg
,
7343 peers_estb
, name
, bgp
->l3vni
,
7344 prefix_mac2str(&bgp
->rmac
, buf
, sizeof(buf
)));
7348 json_object_object_add(json
, "vrfs", json_vrfs
);
7350 json_object_int_add(json
, "totalVrfs", count
);
7352 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
7353 json
, JSON_C_TO_STRING_PRETTY
));
7354 json_object_free(json
);
7358 "\nTotal number of VRFs (including default): %d\n",
7365 static void show_address_entry(struct hash_backet
*backet
, void *args
)
7367 struct vty
*vty
= (struct vty
*)args
;
7368 struct bgp_addr
*addr
= (struct bgp_addr
*)backet
->data
;
7370 vty_out(vty
, "addr: %s, count: %d\n", inet_ntoa(addr
->addr
),
7374 static void show_tip_entry(struct hash_backet
*backet
, void *args
)
7376 struct vty
*vty
= (struct vty
*)args
;
7377 struct tip_addr
*tip
= (struct tip_addr
*)backet
->data
;
7379 vty_out(vty
, "addr: %s, count: %d\n", inet_ntoa(tip
->addr
),
7383 static void bgp_show_martian_nexthops(struct vty
*vty
, struct bgp
*bgp
)
7385 vty_out(vty
, "self nexthop database:\n");
7386 hash_iterate(bgp
->address_hash
,
7387 (void (*)(struct hash_backet
*, void *))show_address_entry
,
7390 vty_out(vty
, "Tunnel-ip database:\n");
7391 hash_iterate(bgp
->tip_hash
,
7392 (void (*)(struct hash_backet
*, void *))show_tip_entry
,
7396 DEFUN(show_bgp_martian_nexthop_db
, show_bgp_martian_nexthop_db_cmd
,
7397 "show bgp [<view|vrf> VIEWVRFNAME] martian next-hop",
7398 SHOW_STR BGP_STR BGP_INSTANCE_HELP_STR
7399 "martian next-hops\n"
7400 "martian next-hop database\n")
7402 struct bgp
*bgp
= NULL
;
7405 if (argv_find(argv
, argc
, "view", &idx
)
7406 || argv_find(argv
, argc
, "vrf", &idx
))
7407 bgp
= bgp_lookup_by_name(argv
[idx
+ 1]->arg
);
7409 bgp
= bgp_get_default();
7412 vty_out(vty
, "%% No BGP process is configured\n");
7415 bgp_show_martian_nexthops(vty
, bgp
);
7420 DEFUN (show_bgp_memory
,
7421 show_bgp_memory_cmd
,
7422 "show [ip] bgp memory",
7426 "Global BGP memory statistics\n")
7428 char memstrbuf
[MTYPE_MEMSTR_LEN
];
7429 unsigned long count
;
7431 /* RIB related usage stats */
7432 count
= mtype_stats_alloc(MTYPE_BGP_NODE
);
7433 vty_out(vty
, "%ld RIB nodes, using %s of memory\n", count
,
7434 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7435 count
* sizeof(struct bgp_node
)));
7437 count
= mtype_stats_alloc(MTYPE_BGP_ROUTE
);
7438 vty_out(vty
, "%ld BGP routes, using %s of memory\n", count
,
7439 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7440 count
* sizeof(struct bgp_info
)));
7441 if ((count
= mtype_stats_alloc(MTYPE_BGP_ROUTE_EXTRA
)))
7442 vty_out(vty
, "%ld BGP route ancillaries, using %s of memory\n",
7444 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7445 count
* sizeof(struct bgp_info_extra
)));
7447 if ((count
= mtype_stats_alloc(MTYPE_BGP_STATIC
)))
7448 vty_out(vty
, "%ld Static routes, using %s of memory\n", count
,
7449 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7450 count
* sizeof(struct bgp_static
)));
7452 if ((count
= mtype_stats_alloc(MTYPE_BGP_PACKET
)))
7453 vty_out(vty
, "%ld Packets, using %s of memory\n", count
,
7454 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7455 count
* sizeof(struct bpacket
)));
7458 if ((count
= mtype_stats_alloc(MTYPE_BGP_ADJ_IN
)))
7459 vty_out(vty
, "%ld Adj-In entries, using %s of memory\n", count
,
7460 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7461 count
* sizeof(struct bgp_adj_in
)));
7462 if ((count
= mtype_stats_alloc(MTYPE_BGP_ADJ_OUT
)))
7463 vty_out(vty
, "%ld Adj-Out entries, using %s of memory\n", count
,
7464 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7465 count
* sizeof(struct bgp_adj_out
)));
7467 if ((count
= mtype_stats_alloc(MTYPE_BGP_NEXTHOP_CACHE
)))
7468 vty_out(vty
, "%ld Nexthop cache entries, using %s of memory\n",
7470 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7471 count
* sizeof(struct bgp_nexthop_cache
)));
7473 if ((count
= mtype_stats_alloc(MTYPE_BGP_DAMP_INFO
)))
7474 vty_out(vty
, "%ld Dampening entries, using %s of memory\n",
7476 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7477 count
* sizeof(struct bgp_damp_info
)));
7480 count
= attr_count();
7481 vty_out(vty
, "%ld BGP attributes, using %s of memory\n", count
,
7482 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7483 count
* sizeof(struct attr
)));
7485 if ((count
= attr_unknown_count()))
7486 vty_out(vty
, "%ld unknown attributes\n", count
);
7488 /* AS_PATH attributes */
7489 count
= aspath_count();
7490 vty_out(vty
, "%ld BGP AS-PATH entries, using %s of memory\n", count
,
7491 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7492 count
* sizeof(struct aspath
)));
7494 count
= mtype_stats_alloc(MTYPE_AS_SEG
);
7495 vty_out(vty
, "%ld BGP AS-PATH segments, using %s of memory\n", count
,
7496 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7497 count
* sizeof(struct assegment
)));
7499 /* Other attributes */
7500 if ((count
= community_count()))
7501 vty_out(vty
, "%ld BGP community entries, using %s of memory\n",
7502 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7503 count
* sizeof(struct community
)));
7504 if ((count
= mtype_stats_alloc(MTYPE_ECOMMUNITY
)))
7505 vty_out(vty
, "%ld BGP community entries, using %s of memory\n",
7506 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7507 count
* sizeof(struct ecommunity
)));
7508 if ((count
= mtype_stats_alloc(MTYPE_LCOMMUNITY
)))
7510 "%ld BGP large-community entries, using %s of memory\n",
7511 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7512 count
* sizeof(struct lcommunity
)));
7514 if ((count
= mtype_stats_alloc(MTYPE_CLUSTER
)))
7515 vty_out(vty
, "%ld Cluster lists, using %s of memory\n", count
,
7516 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7517 count
* sizeof(struct cluster_list
)));
7519 /* Peer related usage */
7520 count
= mtype_stats_alloc(MTYPE_BGP_PEER
);
7521 vty_out(vty
, "%ld peers, using %s of memory\n", count
,
7522 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7523 count
* sizeof(struct peer
)));
7525 if ((count
= mtype_stats_alloc(MTYPE_PEER_GROUP
)))
7526 vty_out(vty
, "%ld peer groups, using %s of memory\n", count
,
7527 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7528 count
* sizeof(struct peer_group
)));
7531 if ((count
= mtype_stats_alloc(MTYPE_HASH
)))
7532 vty_out(vty
, "%ld hash tables, using %s of memory\n", count
,
7533 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7534 count
* sizeof(struct hash
)));
7535 if ((count
= mtype_stats_alloc(MTYPE_HASH_BACKET
)))
7536 vty_out(vty
, "%ld hash buckets, using %s of memory\n", count
,
7537 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7538 count
* sizeof(struct hash_backet
)));
7539 if ((count
= mtype_stats_alloc(MTYPE_BGP_REGEXP
)))
7540 vty_out(vty
, "%ld compiled regexes, using %s of memory\n",
7541 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7542 count
* sizeof(regex_t
)));
7546 static void bgp_show_bestpath_json(struct bgp
*bgp
, json_object
*json
)
7548 json_object
*bestpath
= json_object_new_object();
7550 if (bgp_flag_check(bgp
, BGP_FLAG_ASPATH_IGNORE
))
7551 json_object_string_add(bestpath
, "asPath", "ignore");
7553 if (bgp_flag_check(bgp
, BGP_FLAG_ASPATH_CONFED
))
7554 json_object_string_add(bestpath
, "asPath", "confed");
7556 if (bgp_flag_check(bgp
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
)) {
7557 if (bgp_flag_check(bgp
, BGP_FLAG_MULTIPATH_RELAX_AS_SET
))
7558 json_object_string_add(bestpath
, "multiPathRelax",
7561 json_object_string_add(bestpath
, "multiPathRelax",
7564 json_object_string_add(bestpath
, "multiPathRelax", "false");
7566 if (bgp_flag_check(bgp
, BGP_FLAG_COMPARE_ROUTER_ID
))
7567 json_object_string_add(bestpath
, "compareRouterId", "true");
7568 if (bgp_flag_check(bgp
, BGP_FLAG_MED_CONFED
)
7569 || bgp_flag_check(bgp
, BGP_FLAG_MED_MISSING_AS_WORST
)) {
7570 if (bgp_flag_check(bgp
, BGP_FLAG_MED_CONFED
))
7571 json_object_string_add(bestpath
, "med", "confed");
7572 if (bgp_flag_check(bgp
, BGP_FLAG_MED_MISSING_AS_WORST
))
7573 json_object_string_add(bestpath
, "med",
7574 "missing-as-worst");
7576 json_object_string_add(bestpath
, "med", "true");
7579 json_object_object_add(json
, "bestPath", bestpath
);
7582 /* Show BGP peer's summary information. */
7583 static int bgp_show_summary(struct vty
*vty
, struct bgp
*bgp
, int afi
, int safi
,
7584 uint8_t use_json
, json_object
*json
)
7587 struct listnode
*node
, *nnode
;
7588 unsigned int count
= 0, dn_count
= 0;
7589 char timebuf
[BGP_UPTIME_LEN
], dn_flag
[2];
7590 char neighbor_buf
[VTY_BUFSIZ
];
7591 int neighbor_col_default_width
= 16;
7593 int max_neighbor_width
= 0;
7595 json_object
*json_peer
= NULL
;
7596 json_object
*json_peers
= NULL
;
7598 /* labeled-unicast routes are installed in the unicast table so in order
7600 * display the correct PfxRcd value we must look at SAFI_UNICAST
7602 if (safi
== SAFI_LABELED_UNICAST
)
7603 pfx_rcd_safi
= SAFI_UNICAST
;
7605 pfx_rcd_safi
= safi
;
7609 json
= json_object_new_object();
7611 json_peers
= json_object_new_object();
7613 /* Loop over all neighbors that will be displayed to determine
7615 * characters are needed for the Neighbor column
7617 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
7618 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
7621 if (peer
->afc
[afi
][safi
]) {
7622 memset(dn_flag
, '\0', sizeof(dn_flag
));
7623 if (peer_dynamic_neighbor(peer
))
7627 && bgp_flag_check(bgp
,
7628 BGP_FLAG_SHOW_HOSTNAME
))
7629 sprintf(neighbor_buf
, "%s%s(%s) ",
7630 dn_flag
, peer
->hostname
,
7633 sprintf(neighbor_buf
, "%s%s ", dn_flag
,
7636 len
= strlen(neighbor_buf
);
7638 if (len
> max_neighbor_width
)
7639 max_neighbor_width
= len
;
7643 /* Originally we displayed the Neighbor column as 16
7644 * characters wide so make that the default
7646 if (max_neighbor_width
< neighbor_col_default_width
)
7647 max_neighbor_width
= neighbor_col_default_width
;
7650 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
7651 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
7654 if (!peer
->afc
[afi
][safi
])
7659 char memstrbuf
[MTYPE_MEMSTR_LEN
];
7662 vrf_id_ui
= (bgp
->vrf_id
== VRF_UNKNOWN
)
7664 : (int64_t)bgp
->vrf_id
;
7666 /* Usage summary and header */
7668 json_object_string_add(
7670 inet_ntoa(bgp
->router_id
));
7671 json_object_int_add(json
, "as", bgp
->as
);
7672 json_object_int_add(json
, "vrfId", vrf_id_ui
);
7673 json_object_string_add(
7676 == BGP_INSTANCE_TYPE_DEFAULT
)
7681 "BGP router identifier %s, local AS number %u vrf-id %d",
7682 inet_ntoa(bgp
->router_id
), bgp
->as
,
7683 bgp
->vrf_id
== VRF_UNKNOWN
7685 : (int)bgp
->vrf_id
);
7689 if (bgp_update_delay_configured(bgp
)) {
7691 json_object_int_add(
7692 json
, "updateDelayLimit",
7693 bgp
->v_update_delay
);
7695 if (bgp
->v_update_delay
7696 != bgp
->v_establish_wait
)
7697 json_object_int_add(
7699 "updateDelayEstablishWait",
7700 bgp
->v_establish_wait
);
7702 if (bgp_update_delay_active(bgp
)) {
7703 json_object_string_add(
7705 "updateDelayFirstNeighbor",
7706 bgp
->update_delay_begin_time
);
7707 json_object_boolean_true_add(
7709 "updateDelayInProgress");
7711 if (bgp
->update_delay_over
) {
7712 json_object_string_add(
7714 "updateDelayFirstNeighbor",
7715 bgp
->update_delay_begin_time
);
7716 json_object_string_add(
7718 "updateDelayBestpathResumed",
7719 bgp
->update_delay_end_time
);
7720 json_object_string_add(
7722 "updateDelayZebraUpdateResume",
7723 bgp
->update_delay_zebra_resume_time
);
7724 json_object_string_add(
7726 "updateDelayPeerUpdateResume",
7727 bgp
->update_delay_peers_resume_time
);
7732 "Read-only mode update-delay limit: %d seconds\n",
7733 bgp
->v_update_delay
);
7734 if (bgp
->v_update_delay
7735 != bgp
->v_establish_wait
)
7737 " Establish wait: %d seconds\n",
7738 bgp
->v_establish_wait
);
7740 if (bgp_update_delay_active(bgp
)) {
7742 " First neighbor established: %s\n",
7743 bgp
->update_delay_begin_time
);
7745 " Delay in progress\n");
7747 if (bgp
->update_delay_over
) {
7749 " First neighbor established: %s\n",
7750 bgp
->update_delay_begin_time
);
7752 " Best-paths resumed: %s\n",
7753 bgp
->update_delay_end_time
);
7755 " zebra update resumed: %s\n",
7756 bgp
->update_delay_zebra_resume_time
);
7758 " peers update resumed: %s\n",
7759 bgp
->update_delay_peers_resume_time
);
7766 if (bgp_maxmed_onstartup_configured(bgp
)
7767 && bgp
->maxmed_active
)
7768 json_object_boolean_true_add(
7769 json
, "maxMedOnStartup");
7770 if (bgp
->v_maxmed_admin
)
7771 json_object_boolean_true_add(
7772 json
, "maxMedAdministrative");
7774 json_object_int_add(
7775 json
, "tableVersion",
7776 bgp_table_version(bgp
->rib
[afi
][safi
]));
7778 ents
= bgp_table_count(bgp
->rib
[afi
][safi
]);
7779 json_object_int_add(json
, "ribCount", ents
);
7780 json_object_int_add(
7782 ents
* sizeof(struct bgp_node
));
7784 ents
= listcount(bgp
->peer
);
7785 json_object_int_add(json
, "peerCount", ents
);
7786 json_object_int_add(json
, "peerMemory",
7787 ents
* sizeof(struct peer
));
7789 if ((ents
= listcount(bgp
->group
))) {
7790 json_object_int_add(
7791 json
, "peerGroupCount", ents
);
7792 json_object_int_add(
7793 json
, "peerGroupMemory",
7794 ents
* sizeof(struct
7798 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
7799 BGP_CONFIG_DAMPENING
))
7800 json_object_boolean_true_add(
7801 json
, "dampeningEnabled");
7803 if (bgp_maxmed_onstartup_configured(bgp
)
7804 && bgp
->maxmed_active
)
7806 "Max-med on-startup active\n");
7807 if (bgp
->v_maxmed_admin
)
7809 "Max-med administrative active\n");
7811 vty_out(vty
, "BGP table version %" PRIu64
"\n",
7812 bgp_table_version(bgp
->rib
[afi
][safi
]));
7814 ents
= bgp_table_count(bgp
->rib
[afi
][safi
]);
7816 "RIB entries %ld, using %s of memory\n",
7818 mtype_memstr(memstrbuf
,
7820 ents
* sizeof(struct
7823 /* Peer related usage */
7824 ents
= listcount(bgp
->peer
);
7825 vty_out(vty
, "Peers %ld, using %s of memory\n",
7828 memstrbuf
, sizeof(memstrbuf
),
7829 ents
* sizeof(struct peer
)));
7831 if ((ents
= listcount(bgp
->group
)))
7833 "Peer groups %ld, using %s of memory\n",
7838 ents
* sizeof(struct
7841 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
7842 BGP_CONFIG_DAMPENING
))
7843 vty_out(vty
, "Dampening enabled.\n");
7846 /* Subtract 8 here because 'Neighbor' is
7848 vty_out(vty
, "Neighbor");
7849 vty_out(vty
, "%*s", max_neighbor_width
- 8,
7852 "V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd\n");
7859 json_peer
= json_object_new_object();
7861 if (peer_dynamic_neighbor(peer
))
7862 json_object_boolean_true_add(json_peer
,
7866 json_object_string_add(json_peer
, "hostname",
7869 if (peer
->domainname
)
7870 json_object_string_add(json_peer
, "domainname",
7873 json_object_int_add(json_peer
, "remoteAs", peer
->as
);
7874 json_object_int_add(json_peer
, "version", 4);
7875 json_object_int_add(json_peer
, "msgRcvd",
7876 PEER_TOTAL_RX(peer
));
7877 json_object_int_add(json_peer
, "msgSent",
7878 PEER_TOTAL_TX(peer
));
7880 json_object_int_add(json_peer
, "tableVersion",
7881 peer
->version
[afi
][safi
]);
7882 json_object_int_add(json_peer
, "outq",
7884 json_object_int_add(json_peer
, "inq", 0);
7885 peer_uptime(peer
->uptime
, timebuf
, BGP_UPTIME_LEN
,
7886 use_json
, json_peer
);
7887 json_object_int_add(json_peer
, "prefixReceivedCount",
7888 peer
->pcount
[afi
][pfx_rcd_safi
]);
7890 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_SHUTDOWN
))
7891 json_object_string_add(json_peer
, "state",
7893 else if (CHECK_FLAG(peer
->sflags
,
7894 PEER_STATUS_PREFIX_OVERFLOW
))
7895 json_object_string_add(json_peer
, "state",
7898 json_object_string_add(
7900 lookup_msg(bgp_status_msg
, peer
->status
,
7904 json_object_string_add(json_peer
, "idType",
7906 else if (peer
->su
.sa
.sa_family
== AF_INET
)
7907 json_object_string_add(json_peer
, "idType",
7909 else if (peer
->su
.sa
.sa_family
== AF_INET6
)
7910 json_object_string_add(json_peer
, "idType",
7913 json_object_object_add(json_peers
, peer
->host
,
7916 memset(dn_flag
, '\0', sizeof(dn_flag
));
7917 if (peer_dynamic_neighbor(peer
)) {
7923 && bgp_flag_check(bgp
, BGP_FLAG_SHOW_HOSTNAME
))
7924 len
= vty_out(vty
, "%s%s(%s)", dn_flag
,
7925 peer
->hostname
, peer
->host
);
7927 len
= vty_out(vty
, "%s%s", dn_flag
, peer
->host
);
7929 /* pad the neighbor column with spaces */
7930 if (len
< max_neighbor_width
)
7931 vty_out(vty
, "%*s", max_neighbor_width
- len
,
7934 vty_out(vty
, "4 %10u %7u %7u %8" PRIu64
" %4d %4zd %8s",
7935 peer
->as
, PEER_TOTAL_RX(peer
),
7936 PEER_TOTAL_TX(peer
), peer
->version
[afi
][safi
],
7937 0, peer
->obuf
->count
,
7938 peer_uptime(peer
->uptime
, timebuf
,
7939 BGP_UPTIME_LEN
, 0, NULL
));
7941 if (peer
->status
== Established
)
7942 if (peer
->afc_recv
[afi
][pfx_rcd_safi
])
7943 vty_out(vty
, " %12ld",
7947 vty_out(vty
, " NoNeg");
7949 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_SHUTDOWN
))
7950 vty_out(vty
, " Idle (Admin)");
7951 else if (CHECK_FLAG(
7953 PEER_STATUS_PREFIX_OVERFLOW
))
7954 vty_out(vty
, " Idle (PfxCt)");
7956 vty_out(vty
, " %12s",
7957 lookup_msg(bgp_status_msg
,
7958 peer
->status
, NULL
));
7965 json_object_object_add(json
, "peers", json_peers
);
7967 json_object_int_add(json
, "totalPeers", count
);
7968 json_object_int_add(json
, "dynamicPeers", dn_count
);
7970 bgp_show_bestpath_json(bgp
, json
);
7972 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
7973 json
, JSON_C_TO_STRING_PRETTY
));
7974 json_object_free(json
);
7977 vty_out(vty
, "\nTotal number of neighbors %d\n", count
);
7981 "{\"error\": {\"message\": \"No %s neighbor configured\"}}\n",
7982 afi_safi_print(afi
, safi
));
7984 vty_out(vty
, "No %s neighbor is configured\n",
7985 afi_safi_print(afi
, safi
));
7988 if (dn_count
&& !use_json
) {
7989 vty_out(vty
, "* - dynamic neighbor\n");
7990 vty_out(vty
, "%d dynamic neighbor(s), limit %d\n",
7991 dn_count
, bgp
->dynamic_neighbors_limit
);
7998 static void bgp_show_summary_afi_safi(struct vty
*vty
, struct bgp
*bgp
, int afi
,
7999 int safi
, uint8_t use_json
,
8003 int afi_wildcard
= (afi
== AFI_MAX
);
8004 int safi_wildcard
= (safi
== SAFI_MAX
);
8005 int is_wildcard
= (afi_wildcard
|| safi_wildcard
);
8006 bool json_output
= false;
8008 if (use_json
&& is_wildcard
)
8009 vty_out(vty
, "{\n");
8011 afi
= 1; /* AFI_IP */
8012 while (afi
< AFI_MAX
) {
8014 safi
= 1; /* SAFI_UNICAST */
8015 while (safi
< SAFI_MAX
) {
8016 if (bgp_afi_safi_peer_exists(bgp
, afi
, safi
)) {
8020 * So limit output to those afi/safi
8022 * actualy have something interesting in
8026 json
= json_object_new_object();
8029 vty_out(vty
, ",\n");
8033 vty_out(vty
, "\"%s\":",
8037 vty_out(vty
, "\n%s Summary:\n",
8042 bgp_show_summary(vty
, bgp
, afi
, safi
, use_json
,
8054 if (use_json
&& is_wildcard
)
8055 vty_out(vty
, "}\n");
8056 else if (use_json
&& !json_output
)
8057 vty_out(vty
, "{}\n");
8060 static void bgp_show_all_instances_summary_vty(struct vty
*vty
, afi_t afi
,
8061 safi_t safi
, uint8_t use_json
)
8063 struct listnode
*node
, *nnode
;
8065 json_object
*json
= NULL
;
8069 vty_out(vty
, "{\n");
8071 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
8073 json
= json_object_new_object();
8076 vty_out(vty
, ",\n");
8080 vty_out(vty
, "\"%s\":",
8081 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
8085 vty_out(vty
, "\nInstance %s:\n",
8086 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
8090 bgp_show_summary_afi_safi(vty
, bgp
, afi
, safi
, use_json
, json
);
8094 vty_out(vty
, "}\n");
8097 int bgp_show_summary_vty(struct vty
*vty
, const char *name
, afi_t afi
,
8098 safi_t safi
, uint8_t use_json
)
8103 if (strmatch(name
, "all")) {
8104 bgp_show_all_instances_summary_vty(vty
, afi
, safi
,
8108 bgp
= bgp_lookup_by_name(name
);
8112 vty_out(vty
, "{}\n");
8115 "%% No such BGP instance exist\n");
8119 bgp_show_summary_afi_safi(vty
, bgp
, afi
, safi
, use_json
,
8125 bgp
= bgp_get_default();
8128 bgp_show_summary_afi_safi(vty
, bgp
, afi
, safi
, use_json
, NULL
);
8133 /* `show [ip] bgp summary' commands. */
8134 DEFUN (show_ip_bgp_summary
,
8135 show_ip_bgp_summary_cmd
,
8136 "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR
" ["BGP_SAFI_WITH_LABEL_CMD_STR
"]] summary [json]",
8140 BGP_INSTANCE_HELP_STR
8142 BGP_SAFI_WITH_LABEL_HELP_STR
8143 "Summary of BGP neighbor status\n"
8147 afi_t afi
= AFI_MAX
;
8148 safi_t safi
= SAFI_MAX
;
8153 if (argv_find(argv
, argc
, "ip", &idx
))
8155 /* [<view|vrf> VIEWVRFNAME] */
8156 if (argv_find(argv
, argc
, "view", &idx
)
8157 || argv_find(argv
, argc
, "vrf", &idx
))
8158 vrf
= argv
[++idx
]->arg
;
8159 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
8160 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
)) {
8161 argv_find_and_parse_safi(argv
, argc
, &idx
, &safi
);
8164 int uj
= use_json(argc
, argv
);
8166 return bgp_show_summary_vty(vty
, vrf
, afi
, safi
, uj
);
8169 const char *afi_safi_print(afi_t afi
, safi_t safi
)
8171 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
8172 return "IPv4 Unicast";
8173 else if (afi
== AFI_IP
&& safi
== SAFI_MULTICAST
)
8174 return "IPv4 Multicast";
8175 else if (afi
== AFI_IP
&& safi
== SAFI_LABELED_UNICAST
)
8176 return "IPv4 Labeled Unicast";
8177 else if (afi
== AFI_IP
&& safi
== SAFI_MPLS_VPN
)
8179 else if (afi
== AFI_IP
&& safi
== SAFI_ENCAP
)
8180 return "IPv4 Encap";
8181 else if (afi
== AFI_IP
&& safi
== SAFI_FLOWSPEC
)
8182 return "IPv4 Flowspec";
8183 else if (afi
== AFI_IP6
&& safi
== SAFI_UNICAST
)
8184 return "IPv6 Unicast";
8185 else if (afi
== AFI_IP6
&& safi
== SAFI_MULTICAST
)
8186 return "IPv6 Multicast";
8187 else if (afi
== AFI_IP6
&& safi
== SAFI_LABELED_UNICAST
)
8188 return "IPv6 Labeled Unicast";
8189 else if (afi
== AFI_IP6
&& safi
== SAFI_MPLS_VPN
)
8191 else if (afi
== AFI_IP6
&& safi
== SAFI_ENCAP
)
8192 return "IPv6 Encap";
8193 else if (afi
== AFI_IP6
&& safi
== SAFI_FLOWSPEC
)
8194 return "IPv6 Flowspec";
8195 else if (afi
== AFI_L2VPN
&& safi
== SAFI_EVPN
)
8196 return "L2VPN EVPN";
8202 * Please note that we have intentionally camelCased
8203 * the return strings here. So if you want
8204 * to use this function, please ensure you
8205 * are doing this within json output
8207 const char *afi_safi_json(afi_t afi
, safi_t safi
)
8209 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
8210 return "ipv4Unicast";
8211 else if (afi
== AFI_IP
&& safi
== SAFI_MULTICAST
)
8212 return "ipv4Multicast";
8213 else if (afi
== AFI_IP
&& safi
== SAFI_LABELED_UNICAST
)
8214 return "ipv4LabeledUnicast";
8215 else if (afi
== AFI_IP
&& safi
== SAFI_MPLS_VPN
)
8217 else if (afi
== AFI_IP
&& safi
== SAFI_ENCAP
)
8219 else if (afi
== AFI_IP
&& safi
== SAFI_FLOWSPEC
)
8220 return "ipv4Flowspec";
8221 else if (afi
== AFI_IP6
&& safi
== SAFI_UNICAST
)
8222 return "ipv6Unicast";
8223 else if (afi
== AFI_IP6
&& safi
== SAFI_MULTICAST
)
8224 return "ipv6Multicast";
8225 else if (afi
== AFI_IP6
&& safi
== SAFI_LABELED_UNICAST
)
8226 return "ipv6LabeledUnicast";
8227 else if (afi
== AFI_IP6
&& safi
== SAFI_MPLS_VPN
)
8229 else if (afi
== AFI_IP6
&& safi
== SAFI_ENCAP
)
8231 else if (afi
== AFI_IP6
&& safi
== SAFI_FLOWSPEC
)
8232 return "ipv6Flowspec";
8233 else if (afi
== AFI_L2VPN
&& safi
== SAFI_EVPN
)
8239 /* Show BGP peer's information. */
8240 enum show_type
{ show_all
, show_peer
};
8242 static void bgp_show_peer_afi_orf_cap(struct vty
*vty
, struct peer
*p
,
8243 afi_t afi
, safi_t safi
,
8244 uint16_t adv_smcap
, uint16_t adv_rmcap
,
8245 uint16_t rcv_smcap
, uint16_t rcv_rmcap
,
8246 uint8_t use_json
, json_object
*json_pref
)
8249 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_smcap
)
8250 || CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_smcap
)) {
8252 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_smcap
)
8253 && CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_smcap
))
8254 json_object_string_add(json_pref
, "sendMode",
8255 "advertisedAndReceived");
8256 else if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_smcap
))
8257 json_object_string_add(json_pref
, "sendMode",
8259 else if (CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_smcap
))
8260 json_object_string_add(json_pref
, "sendMode",
8263 vty_out(vty
, " Send-mode: ");
8264 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_smcap
))
8265 vty_out(vty
, "advertised");
8266 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_smcap
))
8267 vty_out(vty
, "%sreceived",
8268 CHECK_FLAG(p
->af_cap
[afi
][safi
],
8277 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_rmcap
)
8278 || CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_rmcap
)) {
8280 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_rmcap
)
8281 && CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_rmcap
))
8282 json_object_string_add(json_pref
, "recvMode",
8283 "advertisedAndReceived");
8284 else if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_rmcap
))
8285 json_object_string_add(json_pref
, "recvMode",
8287 else if (CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_rmcap
))
8288 json_object_string_add(json_pref
, "recvMode",
8291 vty_out(vty
, " Receive-mode: ");
8292 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_rmcap
))
8293 vty_out(vty
, "advertised");
8294 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_rmcap
))
8295 vty_out(vty
, "%sreceived",
8296 CHECK_FLAG(p
->af_cap
[afi
][safi
],
8305 static void bgp_show_peer_afi(struct vty
*vty
, struct peer
*p
, afi_t afi
,
8306 safi_t safi
, uint8_t use_json
,
8307 json_object
*json_neigh
)
8309 struct bgp_filter
*filter
;
8310 struct peer_af
*paf
;
8311 char orf_pfx_name
[BUFSIZ
];
8313 json_object
*json_af
= NULL
;
8314 json_object
*json_prefA
= NULL
;
8315 json_object
*json_prefB
= NULL
;
8316 json_object
*json_addr
= NULL
;
8319 json_addr
= json_object_new_object();
8320 json_af
= json_object_new_object();
8321 filter
= &p
->filter
[afi
][safi
];
8323 if (peer_group_active(p
))
8324 json_object_string_add(json_addr
, "peerGroupMember",
8327 paf
= peer_af_find(p
, afi
, safi
);
8328 if (paf
&& PAF_SUBGRP(paf
)) {
8329 json_object_int_add(json_addr
, "updateGroupId",
8330 PAF_UPDGRP(paf
)->id
);
8331 json_object_int_add(json_addr
, "subGroupId",
8332 PAF_SUBGRP(paf
)->id
);
8333 json_object_int_add(json_addr
, "packetQueueLength",
8334 bpacket_queue_virtual_length(paf
));
8337 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
8338 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8339 PEER_CAP_ORF_PREFIX_SM_RCV
)
8340 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8341 PEER_CAP_ORF_PREFIX_RM_ADV
)
8342 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8343 PEER_CAP_ORF_PREFIX_RM_RCV
)) {
8344 json_object_int_add(json_af
, "orfType",
8346 json_prefA
= json_object_new_object();
8347 bgp_show_peer_afi_orf_cap(vty
, p
, afi
, safi
,
8348 PEER_CAP_ORF_PREFIX_SM_ADV
,
8349 PEER_CAP_ORF_PREFIX_RM_ADV
,
8350 PEER_CAP_ORF_PREFIX_SM_RCV
,
8351 PEER_CAP_ORF_PREFIX_RM_RCV
,
8352 use_json
, json_prefA
);
8353 json_object_object_add(json_af
, "orfPrefixList",
8357 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
8358 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8359 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
8360 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8361 PEER_CAP_ORF_PREFIX_RM_ADV
)
8362 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8363 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
)) {
8364 json_object_int_add(json_af
, "orfOldType",
8365 ORF_TYPE_PREFIX_OLD
);
8366 json_prefB
= json_object_new_object();
8367 bgp_show_peer_afi_orf_cap(
8368 vty
, p
, afi
, safi
, PEER_CAP_ORF_PREFIX_SM_ADV
,
8369 PEER_CAP_ORF_PREFIX_RM_ADV
,
8370 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
,
8371 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
, use_json
,
8373 json_object_object_add(json_af
, "orfOldPrefixList",
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_SM_OLD_RCV
)
8382 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8383 PEER_CAP_ORF_PREFIX_RM_ADV
)
8384 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8385 PEER_CAP_ORF_PREFIX_RM_RCV
)
8386 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8387 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
))
8388 json_object_object_add(json_addr
, "afDependentCap",
8391 json_object_free(json_af
);
8393 sprintf(orf_pfx_name
, "%s.%d.%d", p
->host
, afi
, safi
);
8394 orf_pfx_count
= prefix_bgp_show_prefix_list(
8395 NULL
, afi
, orf_pfx_name
, use_json
);
8397 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
8398 PEER_STATUS_ORF_PREFIX_SEND
)
8400 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
8401 PEER_STATUS_ORF_PREFIX_SEND
))
8402 json_object_boolean_true_add(json_neigh
,
8405 json_object_int_add(json_addr
, "orfRecvCounter",
8408 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
8409 PEER_STATUS_ORF_WAIT_REFRESH
))
8410 json_object_string_add(
8411 json_addr
, "orfFirstUpdate",
8412 "deferredUntilORFOrRouteRefreshRecvd");
8414 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8415 PEER_FLAG_REFLECTOR_CLIENT
))
8416 json_object_boolean_true_add(json_addr
,
8417 "routeReflectorClient");
8418 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8419 PEER_FLAG_RSERVER_CLIENT
))
8420 json_object_boolean_true_add(json_addr
,
8421 "routeServerClient");
8422 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
8423 json_object_boolean_true_add(json_addr
,
8424 "inboundSoftConfigPermit");
8426 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8427 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
))
8428 json_object_boolean_true_add(
8430 "privateAsNumsAllReplacedInUpdatesToNbr");
8431 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8432 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
))
8433 json_object_boolean_true_add(
8435 "privateAsNumsReplacedInUpdatesToNbr");
8436 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8437 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
))
8438 json_object_boolean_true_add(
8440 "privateAsNumsAllRemovedInUpdatesToNbr");
8441 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8442 PEER_FLAG_REMOVE_PRIVATE_AS
))
8443 json_object_boolean_true_add(
8445 "privateAsNumsRemovedInUpdatesToNbr");
8447 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8448 PEER_FLAG_ADDPATH_TX_ALL_PATHS
))
8449 json_object_boolean_true_add(json_addr
,
8450 "addpathTxAllPaths");
8452 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8453 PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS
))
8454 json_object_boolean_true_add(json_addr
,
8455 "addpathTxBestpathPerAS");
8457 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_AS_OVERRIDE
))
8458 json_object_string_add(json_addr
,
8459 "overrideASNsInOutboundUpdates",
8460 "ifAspathEqualRemoteAs");
8462 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_SELF
)
8463 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
8464 PEER_FLAG_FORCE_NEXTHOP_SELF
))
8465 json_object_boolean_true_add(json_addr
,
8466 "routerAlwaysNextHop");
8467 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8468 PEER_FLAG_AS_PATH_UNCHANGED
))
8469 json_object_boolean_true_add(
8470 json_addr
, "unchangedAsPathPropogatedToNbr");
8471 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8472 PEER_FLAG_NEXTHOP_UNCHANGED
))
8473 json_object_boolean_true_add(
8474 json_addr
, "unchangedNextHopPropogatedToNbr");
8475 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
8476 json_object_boolean_true_add(
8477 json_addr
, "unchangedMedPropogatedToNbr");
8478 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
)
8479 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
8480 PEER_FLAG_SEND_EXT_COMMUNITY
)) {
8481 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8482 PEER_FLAG_SEND_COMMUNITY
)
8483 && CHECK_FLAG(p
->af_flags
[afi
][safi
],
8484 PEER_FLAG_SEND_EXT_COMMUNITY
))
8485 json_object_string_add(json_addr
,
8486 "commAttriSentToNbr",
8487 "extendedAndStandard");
8488 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8489 PEER_FLAG_SEND_EXT_COMMUNITY
))
8490 json_object_string_add(json_addr
,
8491 "commAttriSentToNbr",
8494 json_object_string_add(json_addr
,
8495 "commAttriSentToNbr",
8498 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8499 PEER_FLAG_DEFAULT_ORIGINATE
)) {
8500 if (p
->default_rmap
[afi
][safi
].name
)
8501 json_object_string_add(
8502 json_addr
, "defaultRouteMap",
8503 p
->default_rmap
[afi
][safi
].name
);
8505 if (paf
&& PAF_SUBGRP(paf
)
8506 && CHECK_FLAG(PAF_SUBGRP(paf
)->sflags
,
8507 SUBGRP_STATUS_DEFAULT_ORIGINATE
))
8508 json_object_boolean_true_add(json_addr
,
8511 json_object_boolean_true_add(json_addr
,
8515 if (afi
== AFI_L2VPN
&& safi
== SAFI_EVPN
) {
8516 if (is_evpn_enabled())
8517 json_object_boolean_true_add(
8518 json_addr
, "advertiseAllVnis");
8521 if (filter
->plist
[FILTER_IN
].name
8522 || filter
->dlist
[FILTER_IN
].name
8523 || filter
->aslist
[FILTER_IN
].name
8524 || filter
->map
[RMAP_IN
].name
)
8525 json_object_boolean_true_add(json_addr
,
8526 "inboundPathPolicyConfig");
8527 if (filter
->plist
[FILTER_OUT
].name
8528 || filter
->dlist
[FILTER_OUT
].name
8529 || filter
->aslist
[FILTER_OUT
].name
8530 || filter
->map
[RMAP_OUT
].name
|| filter
->usmap
.name
)
8531 json_object_boolean_true_add(
8532 json_addr
, "outboundPathPolicyConfig");
8535 if (filter
->plist
[FILTER_IN
].name
)
8536 json_object_string_add(json_addr
,
8537 "incomingUpdatePrefixFilterList",
8538 filter
->plist
[FILTER_IN
].name
);
8539 if (filter
->plist
[FILTER_OUT
].name
)
8540 json_object_string_add(json_addr
,
8541 "outgoingUpdatePrefixFilterList",
8542 filter
->plist
[FILTER_OUT
].name
);
8544 /* distribute-list */
8545 if (filter
->dlist
[FILTER_IN
].name
)
8546 json_object_string_add(
8547 json_addr
, "incomingUpdateNetworkFilterList",
8548 filter
->dlist
[FILTER_IN
].name
);
8549 if (filter
->dlist
[FILTER_OUT
].name
)
8550 json_object_string_add(
8551 json_addr
, "outgoingUpdateNetworkFilterList",
8552 filter
->dlist
[FILTER_OUT
].name
);
8555 if (filter
->aslist
[FILTER_IN
].name
)
8556 json_object_string_add(json_addr
,
8557 "incomingUpdateAsPathFilterList",
8558 filter
->aslist
[FILTER_IN
].name
);
8559 if (filter
->aslist
[FILTER_OUT
].name
)
8560 json_object_string_add(json_addr
,
8561 "outgoingUpdateAsPathFilterList",
8562 filter
->aslist
[FILTER_OUT
].name
);
8565 if (filter
->map
[RMAP_IN
].name
)
8566 json_object_string_add(
8567 json_addr
, "routeMapForIncomingAdvertisements",
8568 filter
->map
[RMAP_IN
].name
);
8569 if (filter
->map
[RMAP_OUT
].name
)
8570 json_object_string_add(
8571 json_addr
, "routeMapForOutgoingAdvertisements",
8572 filter
->map
[RMAP_OUT
].name
);
8574 /* unsuppress-map */
8575 if (filter
->usmap
.name
)
8576 json_object_string_add(json_addr
,
8577 "selectiveUnsuppressRouteMap",
8578 filter
->usmap
.name
);
8580 /* Receive prefix count */
8581 json_object_int_add(json_addr
, "acceptedPrefixCounter",
8582 p
->pcount
[afi
][safi
]);
8584 /* Maximum prefix */
8585 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
)) {
8586 json_object_int_add(json_addr
, "prefixAllowedMax",
8587 p
->pmax
[afi
][safi
]);
8588 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8589 PEER_FLAG_MAX_PREFIX_WARNING
))
8590 json_object_boolean_true_add(
8591 json_addr
, "prefixAllowedMaxWarning");
8592 json_object_int_add(json_addr
,
8593 "prefixAllowedWarningThresh",
8594 p
->pmax_threshold
[afi
][safi
]);
8595 if (p
->pmax_restart
[afi
][safi
])
8596 json_object_int_add(
8598 "prefixAllowedRestartIntervalMsecs",
8599 p
->pmax_restart
[afi
][safi
] * 60000);
8601 json_object_object_add(json_neigh
, afi_safi_print(afi
, safi
),
8605 filter
= &p
->filter
[afi
][safi
];
8607 vty_out(vty
, " For address family: %s\n",
8608 afi_safi_print(afi
, safi
));
8610 if (peer_group_active(p
))
8611 vty_out(vty
, " %s peer-group member\n",
8614 paf
= peer_af_find(p
, afi
, safi
);
8615 if (paf
&& PAF_SUBGRP(paf
)) {
8616 vty_out(vty
, " Update group %" PRIu64
8617 ", subgroup %" PRIu64
"\n",
8618 PAF_UPDGRP(paf
)->id
, PAF_SUBGRP(paf
)->id
);
8619 vty_out(vty
, " Packet Queue length %d\n",
8620 bpacket_queue_virtual_length(paf
));
8622 vty_out(vty
, " Not part of any update group\n");
8624 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
8625 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8626 PEER_CAP_ORF_PREFIX_SM_RCV
)
8627 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8628 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
8629 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8630 PEER_CAP_ORF_PREFIX_RM_ADV
)
8631 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8632 PEER_CAP_ORF_PREFIX_RM_RCV
)
8633 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8634 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
))
8635 vty_out(vty
, " AF-dependant capabilities:\n");
8637 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
8638 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8639 PEER_CAP_ORF_PREFIX_SM_RCV
)
8640 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8641 PEER_CAP_ORF_PREFIX_RM_ADV
)
8642 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8643 PEER_CAP_ORF_PREFIX_RM_RCV
)) {
8645 " Outbound Route Filter (ORF) type (%d) Prefix-list:\n",
8647 bgp_show_peer_afi_orf_cap(
8648 vty
, p
, afi
, safi
, PEER_CAP_ORF_PREFIX_SM_ADV
,
8649 PEER_CAP_ORF_PREFIX_RM_ADV
,
8650 PEER_CAP_ORF_PREFIX_SM_RCV
,
8651 PEER_CAP_ORF_PREFIX_RM_RCV
, use_json
, NULL
);
8653 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
8654 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8655 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
8656 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8657 PEER_CAP_ORF_PREFIX_RM_ADV
)
8658 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8659 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
)) {
8661 " Outbound Route Filter (ORF) type (%d) Prefix-list:\n",
8662 ORF_TYPE_PREFIX_OLD
);
8663 bgp_show_peer_afi_orf_cap(
8664 vty
, p
, afi
, safi
, PEER_CAP_ORF_PREFIX_SM_ADV
,
8665 PEER_CAP_ORF_PREFIX_RM_ADV
,
8666 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
,
8667 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
, use_json
, NULL
);
8670 sprintf(orf_pfx_name
, "%s.%d.%d", p
->host
, afi
, safi
);
8671 orf_pfx_count
= prefix_bgp_show_prefix_list(
8672 NULL
, afi
, orf_pfx_name
, use_json
);
8674 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
8675 PEER_STATUS_ORF_PREFIX_SEND
)
8677 vty_out(vty
, " Outbound Route Filter (ORF):");
8678 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
8679 PEER_STATUS_ORF_PREFIX_SEND
))
8680 vty_out(vty
, " sent;");
8682 vty_out(vty
, " received (%d entries)",
8686 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
8687 PEER_STATUS_ORF_WAIT_REFRESH
))
8689 " First update is deferred until ORF or ROUTE-REFRESH is received\n");
8691 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8692 PEER_FLAG_REFLECTOR_CLIENT
))
8693 vty_out(vty
, " Route-Reflector Client\n");
8694 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8695 PEER_FLAG_RSERVER_CLIENT
))
8696 vty_out(vty
, " Route-Server Client\n");
8697 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
8699 " Inbound soft reconfiguration allowed\n");
8701 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8702 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
))
8704 " Private AS numbers (all) replaced in updates to this neighbor\n");
8705 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8706 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
))
8708 " Private AS numbers replaced in updates to this neighbor\n");
8709 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8710 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
))
8712 " Private AS numbers (all) removed in updates to this neighbor\n");
8713 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8714 PEER_FLAG_REMOVE_PRIVATE_AS
))
8716 " Private AS numbers removed in updates to this neighbor\n");
8718 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8719 PEER_FLAG_ADDPATH_TX_ALL_PATHS
))
8720 vty_out(vty
, " Advertise all paths via addpath\n");
8722 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8723 PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS
))
8725 " Advertise bestpath per AS via addpath\n");
8727 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_AS_OVERRIDE
))
8729 " Override ASNs in outbound updates if aspath equals remote-as\n");
8731 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_SELF
)
8732 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
8733 PEER_FLAG_FORCE_NEXTHOP_SELF
))
8734 vty_out(vty
, " NEXT_HOP is always this router\n");
8735 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8736 PEER_FLAG_AS_PATH_UNCHANGED
))
8738 " AS_PATH is propagated unchanged to this neighbor\n");
8739 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8740 PEER_FLAG_NEXTHOP_UNCHANGED
))
8742 " NEXT_HOP is propagated unchanged to this neighbor\n");
8743 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
8745 " MED is propagated unchanged to this neighbor\n");
8746 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
)
8747 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
8748 PEER_FLAG_SEND_EXT_COMMUNITY
)
8749 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
8750 PEER_FLAG_SEND_LARGE_COMMUNITY
)) {
8752 " Community attribute sent to this neighbor");
8753 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8754 PEER_FLAG_SEND_COMMUNITY
)
8755 && CHECK_FLAG(p
->af_flags
[afi
][safi
],
8756 PEER_FLAG_SEND_EXT_COMMUNITY
)
8757 && CHECK_FLAG(p
->af_flags
[afi
][safi
],
8758 PEER_FLAG_SEND_LARGE_COMMUNITY
))
8759 vty_out(vty
, "(all)\n");
8760 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8761 PEER_FLAG_SEND_LARGE_COMMUNITY
))
8762 vty_out(vty
, "(large)\n");
8763 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8764 PEER_FLAG_SEND_EXT_COMMUNITY
))
8765 vty_out(vty
, "(extended)\n");
8767 vty_out(vty
, "(standard)\n");
8769 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8770 PEER_FLAG_DEFAULT_ORIGINATE
)) {
8771 vty_out(vty
, " Default information originate,");
8773 if (p
->default_rmap
[afi
][safi
].name
)
8774 vty_out(vty
, " default route-map %s%s,",
8775 p
->default_rmap
[afi
][safi
].map
? "*"
8777 p
->default_rmap
[afi
][safi
].name
);
8778 if (paf
&& PAF_SUBGRP(paf
)
8779 && CHECK_FLAG(PAF_SUBGRP(paf
)->sflags
,
8780 SUBGRP_STATUS_DEFAULT_ORIGINATE
))
8781 vty_out(vty
, " default sent\n");
8783 vty_out(vty
, " default not sent\n");
8786 /* advertise-vni-all */
8787 if (afi
== AFI_L2VPN
&& safi
== SAFI_EVPN
) {
8788 if (is_evpn_enabled())
8789 vty_out(vty
, " advertise-all-vni\n");
8792 if (filter
->plist
[FILTER_IN
].name
8793 || filter
->dlist
[FILTER_IN
].name
8794 || filter
->aslist
[FILTER_IN
].name
8795 || filter
->map
[RMAP_IN
].name
)
8796 vty_out(vty
, " Inbound path policy configured\n");
8797 if (filter
->plist
[FILTER_OUT
].name
8798 || filter
->dlist
[FILTER_OUT
].name
8799 || filter
->aslist
[FILTER_OUT
].name
8800 || filter
->map
[RMAP_OUT
].name
|| filter
->usmap
.name
)
8801 vty_out(vty
, " Outbound path policy configured\n");
8804 if (filter
->plist
[FILTER_IN
].name
)
8806 " Incoming update prefix filter list is %s%s\n",
8807 filter
->plist
[FILTER_IN
].plist
? "*" : "",
8808 filter
->plist
[FILTER_IN
].name
);
8809 if (filter
->plist
[FILTER_OUT
].name
)
8811 " Outgoing update prefix filter list is %s%s\n",
8812 filter
->plist
[FILTER_OUT
].plist
? "*" : "",
8813 filter
->plist
[FILTER_OUT
].name
);
8815 /* distribute-list */
8816 if (filter
->dlist
[FILTER_IN
].name
)
8818 " Incoming update network filter list is %s%s\n",
8819 filter
->dlist
[FILTER_IN
].alist
? "*" : "",
8820 filter
->dlist
[FILTER_IN
].name
);
8821 if (filter
->dlist
[FILTER_OUT
].name
)
8823 " Outgoing update network filter list is %s%s\n",
8824 filter
->dlist
[FILTER_OUT
].alist
? "*" : "",
8825 filter
->dlist
[FILTER_OUT
].name
);
8828 if (filter
->aslist
[FILTER_IN
].name
)
8830 " Incoming update AS path filter list is %s%s\n",
8831 filter
->aslist
[FILTER_IN
].aslist
? "*" : "",
8832 filter
->aslist
[FILTER_IN
].name
);
8833 if (filter
->aslist
[FILTER_OUT
].name
)
8835 " Outgoing update AS path filter list is %s%s\n",
8836 filter
->aslist
[FILTER_OUT
].aslist
? "*" : "",
8837 filter
->aslist
[FILTER_OUT
].name
);
8840 if (filter
->map
[RMAP_IN
].name
)
8842 " Route map for incoming advertisements is %s%s\n",
8843 filter
->map
[RMAP_IN
].map
? "*" : "",
8844 filter
->map
[RMAP_IN
].name
);
8845 if (filter
->map
[RMAP_OUT
].name
)
8847 " Route map for outgoing advertisements is %s%s\n",
8848 filter
->map
[RMAP_OUT
].map
? "*" : "",
8849 filter
->map
[RMAP_OUT
].name
);
8851 /* unsuppress-map */
8852 if (filter
->usmap
.name
)
8854 " Route map for selective unsuppress is %s%s\n",
8855 filter
->usmap
.map
? "*" : "",
8856 filter
->usmap
.name
);
8858 /* Receive prefix count */
8859 vty_out(vty
, " %ld accepted prefixes\n", p
->pcount
[afi
][safi
]);
8861 /* Maximum prefix */
8862 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
)) {
8863 vty_out(vty
, " Maximum prefixes allowed %ld%s\n",
8865 CHECK_FLAG(p
->af_flags
[afi
][safi
],
8866 PEER_FLAG_MAX_PREFIX_WARNING
)
8869 vty_out(vty
, " Threshold for warning message %d%%",
8870 p
->pmax_threshold
[afi
][safi
]);
8871 if (p
->pmax_restart
[afi
][safi
])
8872 vty_out(vty
, ", restart interval %d min",
8873 p
->pmax_restart
[afi
][safi
]);
8881 static void bgp_show_peer(struct vty
*vty
, struct peer
*p
, uint8_t use_json
,
8885 char buf1
[PREFIX2STR_BUFFER
], buf
[SU_ADDRSTRLEN
];
8886 char timebuf
[BGP_UPTIME_LEN
];
8888 const char *subcode_str
;
8889 const char *code_str
;
8894 json_object
*json_neigh
= NULL
;
8900 json_neigh
= json_object_new_object();
8902 memset(dn_flag
, '\0', sizeof(dn_flag
));
8903 if (!p
->conf_if
&& peer_dynamic_neighbor(p
))
8907 if (p
->conf_if
) /* Configured interface name. */
8908 vty_out(vty
, "BGP neighbor on %s: %s, ", p
->conf_if
,
8909 BGP_PEER_SU_UNSPEC(p
)
8911 : sockunion2str(&p
->su
, buf
,
8913 else /* Configured IP address. */
8914 vty_out(vty
, "BGP neighbor is %s%s, ", dn_flag
,
8919 if (p
->conf_if
&& BGP_PEER_SU_UNSPEC(p
))
8920 json_object_string_add(json_neigh
, "bgpNeighborAddr",
8922 else if (p
->conf_if
&& !BGP_PEER_SU_UNSPEC(p
))
8923 json_object_string_add(
8924 json_neigh
, "bgpNeighborAddr",
8925 sockunion2str(&p
->su
, buf
, SU_ADDRSTRLEN
));
8927 json_object_int_add(json_neigh
, "remoteAs", p
->as
);
8929 if (p
->change_local_as
)
8930 json_object_int_add(json_neigh
, "localAs",
8931 p
->change_local_as
);
8933 json_object_int_add(json_neigh
, "localAs", p
->local_as
);
8935 if (CHECK_FLAG(p
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
))
8936 json_object_boolean_true_add(json_neigh
,
8937 "localAsNoPrepend");
8939 if (CHECK_FLAG(p
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
))
8940 json_object_boolean_true_add(json_neigh
,
8941 "localAsReplaceAs");
8943 if ((p
->as_type
== AS_SPECIFIED
) || (p
->as_type
== AS_EXTERNAL
)
8944 || (p
->as_type
== AS_INTERNAL
))
8945 vty_out(vty
, "remote AS %u, ", p
->as
);
8947 vty_out(vty
, "remote AS Unspecified, ");
8948 vty_out(vty
, "local AS %u%s%s, ",
8949 p
->change_local_as
? p
->change_local_as
: p
->local_as
,
8950 CHECK_FLAG(p
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
)
8953 CHECK_FLAG(p
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
)
8957 /* peer type internal, external, confed-internal or confed-external */
8958 if (p
->as
== p
->local_as
) {
8960 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
))
8961 json_object_boolean_true_add(
8962 json_neigh
, "nbrConfedInternalLink");
8964 json_object_boolean_true_add(json_neigh
,
8967 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
))
8968 vty_out(vty
, "confed-internal link\n");
8970 vty_out(vty
, "internal link\n");
8974 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
))
8975 json_object_boolean_true_add(
8976 json_neigh
, "nbrConfedExternalLink");
8978 json_object_boolean_true_add(json_neigh
,
8981 if (bgp_confederation_peers_check(bgp
, p
->as
))
8982 vty_out(vty
, "confed-external link\n");
8984 vty_out(vty
, "external link\n");
8991 json_object_string_add(json_neigh
, "nbrDesc", p
->desc
);
8993 vty_out(vty
, " Description: %s\n", p
->desc
);
8999 json_object_string_add(json_neigh
, "hostname",
9003 json_object_string_add(json_neigh
, "domainname",
9006 if (p
->domainname
&& (p
->domainname
[0] != '\0'))
9007 vty_out(vty
, "Hostname: %s.%s\n", p
->hostname
,
9010 vty_out(vty
, "Hostname: %s\n", p
->hostname
);
9017 json_object_string_add(json_neigh
, "peerGroup",
9021 struct prefix prefix
, *range
= NULL
;
9023 sockunion2hostprefix(&(p
->su
), &prefix
);
9024 range
= peer_group_lookup_dynamic_neighbor_range(
9028 prefix2str(range
, buf1
, sizeof(buf1
));
9029 json_object_string_add(
9031 "peerSubnetRangeGroup", buf1
);
9036 " Member of peer-group %s for session parameters\n",
9040 struct prefix prefix
, *range
= NULL
;
9042 sockunion2hostprefix(&(p
->su
), &prefix
);
9043 range
= peer_group_lookup_dynamic_neighbor_range(
9047 prefix2str(range
, buf1
, sizeof(buf1
));
9049 " Belongs to the subnet range group: %s\n",
9057 /* Administrative shutdown. */
9058 if (CHECK_FLAG(p
->flags
, PEER_FLAG_SHUTDOWN
))
9059 json_object_boolean_true_add(json_neigh
,
9063 json_object_int_add(json_neigh
, "bgpVersion", 4);
9064 json_object_string_add(
9065 json_neigh
, "remoteRouterId",
9066 inet_ntop(AF_INET
, &p
->remote_id
, buf1
, sizeof(buf1
)));
9069 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
)
9070 && bgp_confederation_peers_check(bgp
, p
->as
))
9071 json_object_boolean_true_add(json_neigh
,
9075 json_object_string_add(
9076 json_neigh
, "bgpState",
9077 lookup_msg(bgp_status_msg
, p
->status
, NULL
));
9079 if (p
->status
== Established
) {
9082 uptime
= bgp_clock();
9083 uptime
-= p
->uptime
;
9084 epoch_tbuf
= time(NULL
) - uptime
;
9086 #if defined(VERSION_TYPE_DEV) && CONFDATE > 20200101
9088 "bgpTimerUp should be deprecated and can be removed now");
9091 * bgpTimerUp was miliseconds that was accurate
9092 * up to 1 day, then the value returned
9093 * became garbage. So in order to provide
9094 * some level of backwards compatability,
9095 * we still provde the data, but now
9096 * we are returning the correct value
9097 * and also adding a new bgpTimerUpMsec
9098 * which will allow us to deprecate
9101 json_object_int_add(json_neigh
, "bgpTimerUp",
9103 json_object_int_add(json_neigh
, "bgpTimerUpMsec",
9105 json_object_string_add(json_neigh
, "bgpTimerUpString",
9106 peer_uptime(p
->uptime
, timebuf
,
9109 json_object_int_add(json_neigh
,
9110 "bgpTimerUpEstablishedEpoch",
9114 else if (p
->status
== Active
) {
9115 if (CHECK_FLAG(p
->flags
, PEER_FLAG_PASSIVE
))
9116 json_object_string_add(json_neigh
, "bgpStateIs",
9118 else if (CHECK_FLAG(p
->sflags
, PEER_STATUS_NSF_WAIT
))
9119 json_object_string_add(json_neigh
, "bgpStateIs",
9127 uptime
= bgp_clock();
9128 uptime
-= p
->readtime
;
9129 tm
= gmtime(&uptime
);
9130 json_object_int_add(json_neigh
, "bgpTimerLastRead",
9131 (tm
->tm_sec
* 1000) + (tm
->tm_min
* 60000)
9132 + (tm
->tm_hour
* 3600000));
9134 uptime
= bgp_clock();
9135 uptime
-= p
->last_write
;
9136 tm
= gmtime(&uptime
);
9137 json_object_int_add(json_neigh
, "bgpTimerLastWrite",
9138 (tm
->tm_sec
* 1000) + (tm
->tm_min
* 60000)
9139 + (tm
->tm_hour
* 3600000));
9141 uptime
= bgp_clock();
9142 uptime
-= p
->update_time
;
9143 tm
= gmtime(&uptime
);
9144 json_object_int_add(json_neigh
, "bgpInUpdateElapsedTimeMsecs",
9145 (tm
->tm_sec
* 1000) + (tm
->tm_min
* 60000)
9146 + (tm
->tm_hour
* 3600000));
9148 /* Configured timer values. */
9149 json_object_int_add(json_neigh
, "bgpTimerHoldTimeMsecs",
9150 p
->v_holdtime
* 1000);
9151 json_object_int_add(json_neigh
,
9152 "bgpTimerKeepAliveIntervalMsecs",
9153 p
->v_keepalive
* 1000);
9155 if (PEER_OR_GROUP_TIMER_SET(p
)) {
9156 json_object_int_add(json_neigh
,
9157 "bgpTimerConfiguredHoldTimeMsecs",
9158 p
->holdtime
* 1000);
9159 json_object_int_add(
9161 "bgpTimerConfiguredKeepAliveIntervalMsecs",
9162 p
->keepalive
* 1000);
9163 } else if ((bgp
->default_holdtime
!= BGP_DEFAULT_HOLDTIME
)
9164 || (bgp
->default_keepalive
9165 != BGP_DEFAULT_KEEPALIVE
)) {
9166 json_object_int_add(json_neigh
,
9167 "bgpTimerConfiguredHoldTimeMsecs",
9168 bgp
->default_holdtime
);
9169 json_object_int_add(
9171 "bgpTimerConfiguredKeepAliveIntervalMsecs",
9172 bgp
->default_keepalive
);
9175 /* Administrative shutdown. */
9176 if (CHECK_FLAG(p
->flags
, PEER_FLAG_SHUTDOWN
))
9177 vty_out(vty
, " Administratively shut down\n");
9180 vty_out(vty
, " BGP version 4");
9181 vty_out(vty
, ", remote router ID %s\n",
9182 inet_ntop(AF_INET
, &p
->remote_id
, buf1
, sizeof(buf1
)));
9185 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
)
9186 && bgp_confederation_peers_check(bgp
, p
->as
))
9188 " Neighbor under common administration\n");
9191 vty_out(vty
, " BGP state = %s",
9192 lookup_msg(bgp_status_msg
, p
->status
, NULL
));
9194 if (p
->status
== Established
)
9195 vty_out(vty
, ", up for %8s",
9196 peer_uptime(p
->uptime
, timebuf
, BGP_UPTIME_LEN
,
9199 else if (p
->status
== Active
) {
9200 if (CHECK_FLAG(p
->flags
, PEER_FLAG_PASSIVE
))
9201 vty_out(vty
, " (passive)");
9202 else if (CHECK_FLAG(p
->sflags
, PEER_STATUS_NSF_WAIT
))
9203 vty_out(vty
, " (NSF passive)");
9208 vty_out(vty
, " Last read %s",
9209 peer_uptime(p
->readtime
, timebuf
, BGP_UPTIME_LEN
, 0,
9211 vty_out(vty
, ", Last write %s\n",
9212 peer_uptime(p
->last_write
, timebuf
, BGP_UPTIME_LEN
, 0,
9215 /* Configured timer values. */
9217 " Hold time is %d, keepalive interval is %d seconds\n",
9218 p
->v_holdtime
, p
->v_keepalive
);
9219 if (PEER_OR_GROUP_TIMER_SET(p
)) {
9220 vty_out(vty
, " Configured hold time is %d",
9222 vty_out(vty
, ", keepalive interval is %d seconds\n",
9224 } else if ((bgp
->default_holdtime
!= BGP_DEFAULT_HOLDTIME
)
9225 || (bgp
->default_keepalive
9226 != BGP_DEFAULT_KEEPALIVE
)) {
9227 vty_out(vty
, " Configured hold time is %d",
9228 bgp
->default_holdtime
);
9229 vty_out(vty
, ", keepalive interval is %d seconds\n",
9230 bgp
->default_keepalive
);
9234 if (p
->status
== Established
) {
9235 if (p
->cap
|| p
->afc_adv
[AFI_IP
][SAFI_UNICAST
]
9236 || p
->afc_recv
[AFI_IP
][SAFI_UNICAST
]
9237 || p
->afc_adv
[AFI_IP
][SAFI_MULTICAST
]
9238 || p
->afc_recv
[AFI_IP
][SAFI_MULTICAST
]
9239 || p
->afc_adv
[AFI_IP6
][SAFI_UNICAST
]
9240 || p
->afc_recv
[AFI_IP6
][SAFI_UNICAST
]
9241 || p
->afc_adv
[AFI_IP6
][SAFI_MULTICAST
]
9242 || p
->afc_recv
[AFI_IP6
][SAFI_MULTICAST
]
9243 || p
->afc_adv
[AFI_IP6
][SAFI_MPLS_VPN
]
9244 || p
->afc_recv
[AFI_IP6
][SAFI_MPLS_VPN
]
9245 || p
->afc_adv
[AFI_IP6
][SAFI_ENCAP
]
9246 || p
->afc_recv
[AFI_IP6
][SAFI_ENCAP
]
9247 || p
->afc_adv
[AFI_IP6
][SAFI_FLOWSPEC
]
9248 || p
->afc_recv
[AFI_IP6
][SAFI_FLOWSPEC
]
9249 || p
->afc_adv
[AFI_IP
][SAFI_ENCAP
]
9250 || p
->afc_recv
[AFI_IP
][SAFI_ENCAP
]
9251 || p
->afc_adv
[AFI_IP
][SAFI_FLOWSPEC
]
9252 || p
->afc_recv
[AFI_IP
][SAFI_FLOWSPEC
]
9253 || p
->afc_adv
[AFI_IP
][SAFI_MPLS_VPN
]
9254 || p
->afc_recv
[AFI_IP
][SAFI_MPLS_VPN
]) {
9256 json_object
*json_cap
= NULL
;
9258 json_cap
= json_object_new_object();
9261 if (CHECK_FLAG(p
->cap
, PEER_CAP_AS4_RCV
)
9262 || CHECK_FLAG(p
->cap
, PEER_CAP_AS4_ADV
)) {
9263 if (CHECK_FLAG(p
->cap
, PEER_CAP_AS4_ADV
)
9264 && CHECK_FLAG(p
->cap
,
9266 json_object_string_add(
9267 json_cap
, "4byteAs",
9268 "advertisedAndReceived");
9269 else if (CHECK_FLAG(p
->cap
,
9271 json_object_string_add(
9272 json_cap
, "4byteAs",
9274 else if (CHECK_FLAG(p
->cap
,
9276 json_object_string_add(
9277 json_cap
, "4byteAs",
9282 if (CHECK_FLAG(p
->cap
, PEER_CAP_ADDPATH_RCV
)
9283 || CHECK_FLAG(p
->cap
,
9284 PEER_CAP_ADDPATH_ADV
)) {
9285 json_object
*json_add
= NULL
;
9286 const char *print_store
;
9288 json_add
= json_object_new_object();
9290 FOREACH_AFI_SAFI (afi
, safi
) {
9291 json_object
*json_sub
= NULL
;
9293 json_object_new_object();
9294 print_store
= afi_safi_print(
9300 PEER_CAP_ADDPATH_AF_TX_ADV
)
9304 PEER_CAP_ADDPATH_AF_TX_RCV
)) {
9309 PEER_CAP_ADDPATH_AF_TX_ADV
)
9314 PEER_CAP_ADDPATH_AF_TX_RCV
))
9315 json_object_boolean_true_add(
9317 "txAdvertisedAndReceived");
9323 PEER_CAP_ADDPATH_AF_TX_ADV
))
9324 json_object_boolean_true_add(
9332 PEER_CAP_ADDPATH_AF_TX_RCV
))
9333 json_object_boolean_true_add(
9341 PEER_CAP_ADDPATH_AF_RX_ADV
)
9345 PEER_CAP_ADDPATH_AF_RX_RCV
)) {
9350 PEER_CAP_ADDPATH_AF_RX_ADV
)
9355 PEER_CAP_ADDPATH_AF_RX_RCV
))
9356 json_object_boolean_true_add(
9358 "rxAdvertisedAndReceived");
9364 PEER_CAP_ADDPATH_AF_RX_ADV
))
9365 json_object_boolean_true_add(
9373 PEER_CAP_ADDPATH_AF_RX_RCV
))
9374 json_object_boolean_true_add(
9382 PEER_CAP_ADDPATH_AF_TX_ADV
)
9386 PEER_CAP_ADDPATH_AF_TX_RCV
)
9390 PEER_CAP_ADDPATH_AF_RX_ADV
)
9394 PEER_CAP_ADDPATH_AF_RX_RCV
))
9395 json_object_object_add(
9404 json_object_object_add(
9405 json_cap
, "addPath", json_add
);
9409 if (CHECK_FLAG(p
->cap
, PEER_CAP_DYNAMIC_RCV
)
9410 || CHECK_FLAG(p
->cap
,
9411 PEER_CAP_DYNAMIC_ADV
)) {
9412 if (CHECK_FLAG(p
->cap
,
9413 PEER_CAP_DYNAMIC_ADV
)
9414 && CHECK_FLAG(p
->cap
,
9415 PEER_CAP_DYNAMIC_RCV
))
9416 json_object_string_add(
9417 json_cap
, "dynamic",
9418 "advertisedAndReceived");
9419 else if (CHECK_FLAG(
9421 PEER_CAP_DYNAMIC_ADV
))
9422 json_object_string_add(
9423 json_cap
, "dynamic",
9425 else if (CHECK_FLAG(
9427 PEER_CAP_DYNAMIC_RCV
))
9428 json_object_string_add(
9429 json_cap
, "dynamic",
9433 /* Extended nexthop */
9434 if (CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_RCV
)
9435 || CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_ADV
)) {
9436 json_object
*json_nxt
= NULL
;
9437 const char *print_store
;
9440 if (CHECK_FLAG(p
->cap
,
9442 && CHECK_FLAG(p
->cap
,
9444 json_object_string_add(
9447 "advertisedAndReceived");
9448 else if (CHECK_FLAG(p
->cap
,
9450 json_object_string_add(
9454 else if (CHECK_FLAG(p
->cap
,
9456 json_object_string_add(
9461 if (CHECK_FLAG(p
->cap
,
9462 PEER_CAP_ENHE_RCV
)) {
9464 json_object_new_object();
9466 for (safi
= SAFI_UNICAST
;
9467 safi
< SAFI_MAX
; safi
++) {
9472 PEER_CAP_ENHE_AF_RCV
)) {
9473 print_store
= afi_safi_print(
9476 json_object_string_add(
9482 json_object_object_add(
9484 "extendedNexthopFamililesByPeer",
9490 if (CHECK_FLAG(p
->cap
, PEER_CAP_REFRESH_ADV
)
9491 || CHECK_FLAG(p
->cap
,
9492 PEER_CAP_REFRESH_NEW_RCV
)
9493 || CHECK_FLAG(p
->cap
,
9494 PEER_CAP_REFRESH_OLD_RCV
)) {
9495 if (CHECK_FLAG(p
->cap
,
9496 PEER_CAP_REFRESH_ADV
)
9499 PEER_CAP_REFRESH_NEW_RCV
)
9502 PEER_CAP_REFRESH_OLD_RCV
))) {
9505 PEER_CAP_REFRESH_OLD_RCV
)
9508 PEER_CAP_REFRESH_NEW_RCV
))
9509 json_object_string_add(
9512 "advertisedAndReceivedOldNew");
9516 PEER_CAP_REFRESH_OLD_RCV
))
9517 json_object_string_add(
9520 "advertisedAndReceivedOld");
9522 json_object_string_add(
9525 "advertisedAndReceivedNew");
9530 PEER_CAP_REFRESH_ADV
))
9531 json_object_string_add(
9538 PEER_CAP_REFRESH_NEW_RCV
)
9541 PEER_CAP_REFRESH_OLD_RCV
))
9542 json_object_string_add(
9548 /* Multiprotocol Extensions */
9549 json_object
*json_multi
= NULL
;
9550 json_multi
= json_object_new_object();
9552 FOREACH_AFI_SAFI (afi
, safi
) {
9553 if (p
->afc_adv
[afi
][safi
]
9554 || p
->afc_recv
[afi
][safi
]) {
9555 json_object
*json_exten
= NULL
;
9557 json_object_new_object();
9559 if (p
->afc_adv
[afi
][safi
]
9560 && p
->afc_recv
[afi
][safi
])
9561 json_object_boolean_true_add(
9563 "advertisedAndReceived");
9564 else if (p
->afc_adv
[afi
][safi
])
9565 json_object_boolean_true_add(
9568 else if (p
->afc_recv
[afi
][safi
])
9569 json_object_boolean_true_add(
9573 json_object_object_add(
9580 json_object_object_add(
9581 json_cap
, "multiprotocolExtensions",
9584 /* Hostname capabilities */
9585 json_object
*json_hname
= NULL
;
9587 json_hname
= json_object_new_object();
9589 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_ADV
)) {
9590 json_object_string_add(
9591 json_hname
, "advHostName",
9592 bgp
->peer_self
->hostname
9596 json_object_string_add(
9597 json_hname
, "advDomainName",
9598 bgp
->peer_self
->domainname
9605 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_RCV
)) {
9606 json_object_string_add(
9607 json_hname
, "rcvHostName",
9608 p
->hostname
? p
->hostname
9610 json_object_string_add(
9611 json_hname
, "rcvDomainName",
9612 p
->domainname
? p
->domainname
9616 json_object_object_add(json_cap
, "hostName",
9619 /* Gracefull Restart */
9620 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
)
9621 || CHECK_FLAG(p
->cap
,
9622 PEER_CAP_RESTART_ADV
)) {
9623 if (CHECK_FLAG(p
->cap
,
9624 PEER_CAP_RESTART_ADV
)
9625 && CHECK_FLAG(p
->cap
,
9626 PEER_CAP_RESTART_RCV
))
9627 json_object_string_add(
9630 "advertisedAndReceived");
9631 else if (CHECK_FLAG(
9633 PEER_CAP_RESTART_ADV
))
9634 json_object_string_add(
9636 "gracefulRestartCapability",
9638 else if (CHECK_FLAG(
9640 PEER_CAP_RESTART_RCV
))
9641 json_object_string_add(
9643 "gracefulRestartCapability",
9646 if (CHECK_FLAG(p
->cap
,
9647 PEER_CAP_RESTART_RCV
)) {
9648 int restart_af_count
= 0;
9649 json_object
*json_restart
=
9652 json_object_new_object();
9654 json_object_int_add(
9656 "gracefulRestartRemoteTimerMsecs",
9657 p
->v_gr_restart
* 1000);
9659 FOREACH_AFI_SAFI (afi
, safi
) {
9664 PEER_CAP_RESTART_AF_RCV
)) {
9669 json_object_new_object();
9675 PEER_CAP_RESTART_AF_PRESERVE_RCV
))
9676 json_object_boolean_true_add(
9680 json_object_object_add(
9688 if (!restart_af_count
) {
9689 json_object_string_add(
9691 "addressFamiliesByPeer",
9696 json_object_object_add(
9698 "addressFamiliesByPeer",
9702 json_object_object_add(json_neigh
,
9703 "neighborCapabilities",
9706 vty_out(vty
, " Neighbor capabilities:\n");
9709 if (CHECK_FLAG(p
->cap
, PEER_CAP_AS4_RCV
)
9710 || CHECK_FLAG(p
->cap
, PEER_CAP_AS4_ADV
)) {
9711 vty_out(vty
, " 4 Byte AS:");
9712 if (CHECK_FLAG(p
->cap
,
9714 vty_out(vty
, " advertised");
9715 if (CHECK_FLAG(p
->cap
,
9717 vty_out(vty
, " %sreceived",
9727 if (CHECK_FLAG(p
->cap
, PEER_CAP_ADDPATH_RCV
)
9728 || CHECK_FLAG(p
->cap
,
9729 PEER_CAP_ADDPATH_ADV
)) {
9730 vty_out(vty
, " AddPath:\n");
9732 FOREACH_AFI_SAFI (afi
, safi
) {
9736 PEER_CAP_ADDPATH_AF_TX_ADV
)
9740 PEER_CAP_ADDPATH_AF_TX_RCV
)) {
9751 PEER_CAP_ADDPATH_AF_TX_ADV
))
9762 PEER_CAP_ADDPATH_AF_TX_RCV
))
9769 PEER_CAP_ADDPATH_AF_TX_ADV
)
9779 PEER_CAP_ADDPATH_AF_RX_ADV
)
9783 PEER_CAP_ADDPATH_AF_RX_RCV
)) {
9794 PEER_CAP_ADDPATH_AF_RX_ADV
))
9805 PEER_CAP_ADDPATH_AF_RX_RCV
))
9812 PEER_CAP_ADDPATH_AF_RX_ADV
)
9822 if (CHECK_FLAG(p
->cap
, PEER_CAP_DYNAMIC_RCV
)
9823 || CHECK_FLAG(p
->cap
,
9824 PEER_CAP_DYNAMIC_ADV
)) {
9825 vty_out(vty
, " Dynamic:");
9826 if (CHECK_FLAG(p
->cap
,
9827 PEER_CAP_DYNAMIC_ADV
))
9828 vty_out(vty
, " advertised");
9829 if (CHECK_FLAG(p
->cap
,
9830 PEER_CAP_DYNAMIC_RCV
))
9831 vty_out(vty
, " %sreceived",
9834 PEER_CAP_DYNAMIC_ADV
)
9840 /* Extended nexthop */
9841 if (CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_RCV
)
9842 || CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_ADV
)) {
9843 vty_out(vty
, " Extended nexthop:");
9844 if (CHECK_FLAG(p
->cap
,
9846 vty_out(vty
, " advertised");
9847 if (CHECK_FLAG(p
->cap
,
9849 vty_out(vty
, " %sreceived",
9857 if (CHECK_FLAG(p
->cap
,
9858 PEER_CAP_ENHE_RCV
)) {
9860 " Address families by peer:\n ");
9861 for (safi
= SAFI_UNICAST
;
9862 safi
< SAFI_MAX
; safi
++)
9867 PEER_CAP_ENHE_AF_RCV
))
9877 if (CHECK_FLAG(p
->cap
, PEER_CAP_REFRESH_ADV
)
9878 || CHECK_FLAG(p
->cap
,
9879 PEER_CAP_REFRESH_NEW_RCV
)
9880 || CHECK_FLAG(p
->cap
,
9881 PEER_CAP_REFRESH_OLD_RCV
)) {
9882 vty_out(vty
, " Route refresh:");
9883 if (CHECK_FLAG(p
->cap
,
9884 PEER_CAP_REFRESH_ADV
))
9885 vty_out(vty
, " advertised");
9886 if (CHECK_FLAG(p
->cap
,
9887 PEER_CAP_REFRESH_NEW_RCV
)
9890 PEER_CAP_REFRESH_OLD_RCV
))
9891 vty_out(vty
, " %sreceived(%s)",
9894 PEER_CAP_REFRESH_ADV
)
9899 PEER_CAP_REFRESH_OLD_RCV
)
9902 PEER_CAP_REFRESH_NEW_RCV
))
9906 PEER_CAP_REFRESH_OLD_RCV
)
9913 /* Multiprotocol Extensions */
9914 FOREACH_AFI_SAFI (afi
, safi
)
9915 if (p
->afc_adv
[afi
][safi
]
9916 || p
->afc_recv
[afi
][safi
]) {
9918 " Address Family %s:",
9921 if (p
->afc_adv
[afi
][safi
])
9924 if (p
->afc_recv
[afi
][safi
])
9934 /* Hostname capability */
9935 vty_out(vty
, " Hostname Capability:");
9937 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_ADV
)) {
9939 " advertised (name: %s,domain name: %s)",
9940 bgp
->peer_self
->hostname
9944 bgp
->peer_self
->domainname
9949 vty_out(vty
, " not advertised");
9952 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_RCV
)) {
9954 " received (name: %s,domain name: %s)",
9955 p
->hostname
? p
->hostname
9957 p
->domainname
? p
->domainname
9960 vty_out(vty
, " not received");
9965 /* Gracefull Restart */
9966 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
)
9967 || CHECK_FLAG(p
->cap
,
9968 PEER_CAP_RESTART_ADV
)) {
9970 " Graceful Restart Capabilty:");
9971 if (CHECK_FLAG(p
->cap
,
9972 PEER_CAP_RESTART_ADV
))
9973 vty_out(vty
, " advertised");
9974 if (CHECK_FLAG(p
->cap
,
9975 PEER_CAP_RESTART_RCV
))
9976 vty_out(vty
, " %sreceived",
9979 PEER_CAP_RESTART_ADV
)
9984 if (CHECK_FLAG(p
->cap
,
9985 PEER_CAP_RESTART_RCV
)) {
9986 int restart_af_count
= 0;
9989 " Remote Restart timer is %d seconds\n",
9992 " Address families by peer:\n ");
9994 FOREACH_AFI_SAFI (afi
, safi
)
9999 PEER_CAP_RESTART_AF_RCV
)) {
10012 PEER_CAP_RESTART_AF_PRESERVE_RCV
)
10014 : "not preserved");
10015 restart_af_count
++;
10017 if (!restart_af_count
)
10018 vty_out(vty
, "none");
10019 vty_out(vty
, "\n");
10026 /* graceful restart information */
10027 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
) || p
->t_gr_restart
10028 || p
->t_gr_stale
) {
10029 json_object
*json_grace
= NULL
;
10030 json_object
*json_grace_send
= NULL
;
10031 json_object
*json_grace_recv
= NULL
;
10032 int eor_send_af_count
= 0;
10033 int eor_receive_af_count
= 0;
10036 json_grace
= json_object_new_object();
10037 json_grace_send
= json_object_new_object();
10038 json_grace_recv
= json_object_new_object();
10040 if (p
->status
== Established
) {
10041 FOREACH_AFI_SAFI (afi
, safi
) {
10042 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
10043 PEER_STATUS_EOR_SEND
)) {
10044 json_object_boolean_true_add(
10046 afi_safi_print(afi
,
10048 eor_send_af_count
++;
10051 FOREACH_AFI_SAFI (afi
, safi
) {
10053 p
->af_sflags
[afi
][safi
],
10054 PEER_STATUS_EOR_RECEIVED
)) {
10055 json_object_boolean_true_add(
10057 afi_safi_print(afi
,
10059 eor_receive_af_count
++;
10064 json_object_object_add(json_grace
, "endOfRibSend",
10066 json_object_object_add(json_grace
, "endOfRibRecv",
10069 if (p
->t_gr_restart
)
10070 json_object_int_add(json_grace
,
10071 "gracefulRestartTimerMsecs",
10072 thread_timer_remain_second(
10077 json_object_int_add(
10079 "gracefulStalepathTimerMsecs",
10080 thread_timer_remain_second(
10084 json_object_object_add(
10085 json_neigh
, "gracefulRestartInfo", json_grace
);
10087 vty_out(vty
, " Graceful restart informations:\n");
10088 if (p
->status
== Established
) {
10089 vty_out(vty
, " End-of-RIB send: ");
10090 FOREACH_AFI_SAFI (afi
, safi
) {
10091 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
10092 PEER_STATUS_EOR_SEND
)) {
10093 vty_out(vty
, "%s%s",
10094 eor_send_af_count
? ", "
10096 afi_safi_print(afi
,
10098 eor_send_af_count
++;
10101 vty_out(vty
, "\n");
10102 vty_out(vty
, " End-of-RIB received: ");
10103 FOREACH_AFI_SAFI (afi
, safi
) {
10105 p
->af_sflags
[afi
][safi
],
10106 PEER_STATUS_EOR_RECEIVED
)) {
10107 vty_out(vty
, "%s%s",
10108 eor_receive_af_count
10111 afi_safi_print(afi
,
10113 eor_receive_af_count
++;
10116 vty_out(vty
, "\n");
10119 if (p
->t_gr_restart
)
10121 " The remaining time of restart timer is %ld\n",
10122 thread_timer_remain_second(
10127 " The remaining time of stalepath timer is %ld\n",
10128 thread_timer_remain_second(
10133 json_object
*json_stat
= NULL
;
10134 json_stat
= json_object_new_object();
10135 /* Packet counts. */
10136 json_object_int_add(json_stat
, "depthInq", 0);
10137 json_object_int_add(json_stat
, "depthOutq",
10138 (unsigned long)p
->obuf
->count
);
10139 json_object_int_add(json_stat
, "opensSent",
10140 atomic_load_explicit(&p
->open_out
,
10141 memory_order_relaxed
));
10142 json_object_int_add(json_stat
, "opensRecv",
10143 atomic_load_explicit(&p
->open_in
,
10144 memory_order_relaxed
));
10145 json_object_int_add(json_stat
, "notificationsSent",
10146 atomic_load_explicit(&p
->notify_out
,
10147 memory_order_relaxed
));
10148 json_object_int_add(json_stat
, "notificationsRecv",
10149 atomic_load_explicit(&p
->notify_in
,
10150 memory_order_relaxed
));
10151 json_object_int_add(json_stat
, "updatesSent",
10152 atomic_load_explicit(&p
->update_out
,
10153 memory_order_relaxed
));
10154 json_object_int_add(json_stat
, "updatesRecv",
10155 atomic_load_explicit(&p
->update_in
,
10156 memory_order_relaxed
));
10157 json_object_int_add(json_stat
, "keepalivesSent",
10158 atomic_load_explicit(&p
->keepalive_out
,
10159 memory_order_relaxed
));
10160 json_object_int_add(json_stat
, "keepalivesRecv",
10161 atomic_load_explicit(&p
->keepalive_in
,
10162 memory_order_relaxed
));
10163 json_object_int_add(json_stat
, "routeRefreshSent",
10164 atomic_load_explicit(&p
->refresh_out
,
10165 memory_order_relaxed
));
10166 json_object_int_add(json_stat
, "routeRefreshRecv",
10167 atomic_load_explicit(&p
->refresh_in
,
10168 memory_order_relaxed
));
10169 json_object_int_add(json_stat
, "capabilitySent",
10170 atomic_load_explicit(&p
->dynamic_cap_out
,
10171 memory_order_relaxed
));
10172 json_object_int_add(json_stat
, "capabilityRecv",
10173 atomic_load_explicit(&p
->dynamic_cap_in
,
10174 memory_order_relaxed
));
10175 json_object_int_add(json_stat
, "totalSent", PEER_TOTAL_TX(p
));
10176 json_object_int_add(json_stat
, "totalRecv", PEER_TOTAL_RX(p
));
10177 json_object_object_add(json_neigh
, "messageStats", json_stat
);
10179 /* Packet counts. */
10180 vty_out(vty
, " Message statistics:\n");
10181 vty_out(vty
, " Inq depth is 0\n");
10182 vty_out(vty
, " Outq depth is %lu\n",
10183 (unsigned long)p
->obuf
->count
);
10184 vty_out(vty
, " Sent Rcvd\n");
10185 vty_out(vty
, " Opens: %10d %10d\n",
10186 atomic_load_explicit(&p
->open_out
,
10187 memory_order_relaxed
),
10188 atomic_load_explicit(&p
->open_in
,
10189 memory_order_relaxed
));
10190 vty_out(vty
, " Notifications: %10d %10d\n",
10191 atomic_load_explicit(&p
->notify_out
,
10192 memory_order_relaxed
),
10193 atomic_load_explicit(&p
->notify_in
,
10194 memory_order_relaxed
));
10195 vty_out(vty
, " Updates: %10d %10d\n",
10196 atomic_load_explicit(&p
->update_out
,
10197 memory_order_relaxed
),
10198 atomic_load_explicit(&p
->update_in
,
10199 memory_order_relaxed
));
10200 vty_out(vty
, " Keepalives: %10d %10d\n",
10201 atomic_load_explicit(&p
->keepalive_out
,
10202 memory_order_relaxed
),
10203 atomic_load_explicit(&p
->keepalive_in
,
10204 memory_order_relaxed
));
10205 vty_out(vty
, " Route Refresh: %10d %10d\n",
10206 atomic_load_explicit(&p
->refresh_out
,
10207 memory_order_relaxed
),
10208 atomic_load_explicit(&p
->refresh_in
,
10209 memory_order_relaxed
));
10210 vty_out(vty
, " Capability: %10d %10d\n",
10211 atomic_load_explicit(&p
->dynamic_cap_out
,
10212 memory_order_relaxed
),
10213 atomic_load_explicit(&p
->dynamic_cap_in
,
10214 memory_order_relaxed
));
10215 vty_out(vty
, " Total: %10d %10d\n", PEER_TOTAL_TX(p
),
10220 /* advertisement-interval */
10221 json_object_int_add(json_neigh
,
10222 "minBtwnAdvertisementRunsTimerMsecs",
10223 p
->v_routeadv
* 1000);
10225 /* Update-source. */
10226 if (p
->update_if
|| p
->update_source
) {
10228 json_object_string_add(json_neigh
,
10231 else if (p
->update_source
)
10232 json_object_string_add(
10233 json_neigh
, "updateSource",
10234 sockunion2str(p
->update_source
, buf1
,
10238 /* advertisement-interval */
10240 " Minimum time between advertisement runs is %d seconds\n",
10243 /* Update-source. */
10244 if (p
->update_if
|| p
->update_source
) {
10245 vty_out(vty
, " Update source is ");
10247 vty_out(vty
, "%s", p
->update_if
);
10248 else if (p
->update_source
)
10250 sockunion2str(p
->update_source
, buf1
,
10252 vty_out(vty
, "\n");
10255 vty_out(vty
, "\n");
10258 /* Address Family Information */
10259 json_object
*json_hold
= NULL
;
10262 json_hold
= json_object_new_object();
10264 FOREACH_AFI_SAFI (afi
, safi
)
10265 if (p
->afc
[afi
][safi
])
10266 bgp_show_peer_afi(vty
, p
, afi
, safi
, use_json
,
10270 json_object_object_add(json_neigh
, "addressFamilyInfo",
10272 json_object_int_add(json_neigh
, "connectionsEstablished",
10274 json_object_int_add(json_neigh
, "connectionsDropped",
10277 vty_out(vty
, " Connections established %d; dropped %d\n",
10278 p
->established
, p
->dropped
);
10280 if (!p
->last_reset
) {
10282 json_object_string_add(json_neigh
, "lastReset",
10285 vty_out(vty
, " Last reset never\n");
10291 uptime
= bgp_clock();
10292 uptime
-= p
->resettime
;
10293 tm
= gmtime(&uptime
);
10294 json_object_int_add(json_neigh
, "lastResetTimerMsecs",
10295 (tm
->tm_sec
* 1000)
10296 + (tm
->tm_min
* 60000)
10297 + (tm
->tm_hour
* 3600000));
10298 json_object_string_add(
10299 json_neigh
, "lastResetDueTo",
10300 peer_down_str
[(int)p
->last_reset
]);
10301 if (p
->last_reset
== PEER_DOWN_NOTIFY_SEND
10302 || p
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
) {
10303 char errorcodesubcode_hexstr
[5];
10304 char errorcodesubcode_str
[256];
10306 code_str
= bgp_notify_code_str(p
->notify
.code
);
10307 subcode_str
= bgp_notify_subcode_str(
10308 p
->notify
.code
, p
->notify
.subcode
);
10310 sprintf(errorcodesubcode_hexstr
, "%02X%02X",
10311 p
->notify
.code
, p
->notify
.subcode
);
10312 json_object_string_add(json_neigh
,
10313 "lastErrorCodeSubcode",
10314 errorcodesubcode_hexstr
);
10315 snprintf(errorcodesubcode_str
, 255, "%s%s",
10316 code_str
, subcode_str
);
10317 json_object_string_add(json_neigh
,
10318 "lastNotificationReason",
10319 errorcodesubcode_str
);
10320 if (p
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
10321 && p
->notify
.code
== BGP_NOTIFY_CEASE
10322 && (p
->notify
.subcode
10323 == BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
10324 || p
->notify
.subcode
10325 == BGP_NOTIFY_CEASE_ADMIN_RESET
)
10326 && p
->notify
.length
) {
10328 const char *msg_str
;
10330 msg_str
= bgp_notify_admin_message(
10331 msgbuf
, sizeof(msgbuf
),
10332 (uint8_t *)p
->notify
.data
,
10335 json_object_string_add(
10337 "lastShutdownDescription",
10342 vty_out(vty
, " Last reset %s, ",
10343 peer_uptime(p
->resettime
, timebuf
,
10344 BGP_UPTIME_LEN
, 0, NULL
));
10346 if (p
->last_reset
== PEER_DOWN_NOTIFY_SEND
10347 || p
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
) {
10348 code_str
= bgp_notify_code_str(p
->notify
.code
);
10349 subcode_str
= bgp_notify_subcode_str(
10350 p
->notify
.code
, p
->notify
.subcode
);
10351 vty_out(vty
, "due to NOTIFICATION %s (%s%s)\n",
10352 p
->last_reset
== PEER_DOWN_NOTIFY_SEND
10355 code_str
, subcode_str
);
10356 if (p
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
10357 && p
->notify
.code
== BGP_NOTIFY_CEASE
10358 && (p
->notify
.subcode
10359 == BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
10360 || p
->notify
.subcode
10361 == BGP_NOTIFY_CEASE_ADMIN_RESET
)
10362 && p
->notify
.length
) {
10364 const char *msg_str
;
10366 msg_str
= bgp_notify_admin_message(
10367 msgbuf
, sizeof(msgbuf
),
10368 (uint8_t *)p
->notify
.data
,
10372 " Message: \"%s\"\n",
10376 vty_out(vty
, "due to %s\n",
10377 peer_down_str
[(int)p
->last_reset
]);
10380 if (p
->last_reset_cause_size
) {
10381 msg
= p
->last_reset_cause
;
10383 " Message received that caused BGP to send a NOTIFICATION:\n ");
10384 for (i
= 1; i
<= p
->last_reset_cause_size
;
10386 vty_out(vty
, "%02X", *msg
++);
10388 if (i
!= p
->last_reset_cause_size
) {
10390 vty_out(vty
, "\n ");
10391 } else if (i
% 4 == 0) {
10396 vty_out(vty
, "\n");
10401 if (CHECK_FLAG(p
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
)) {
10403 json_object_boolean_true_add(json_neigh
,
10404 "prefixesConfigExceedMax");
10407 " Peer had exceeded the max. no. of prefixes configured.\n");
10409 if (p
->t_pmax_restart
) {
10411 json_object_boolean_true_add(
10412 json_neigh
, "reducePrefixNumFrom");
10413 json_object_int_add(json_neigh
,
10414 "restartInTimerMsec",
10415 thread_timer_remain_second(
10420 " Reduce the no. of prefix from %s, will restart in %ld seconds\n",
10421 p
->host
, thread_timer_remain_second(
10422 p
->t_pmax_restart
));
10425 json_object_boolean_true_add(
10427 "reducePrefixNumAndClearIpBgp");
10430 " Reduce the no. of prefix and clear ip bgp %s to restore peering\n",
10435 /* EBGP Multihop and GTSM */
10436 if (p
->sort
!= BGP_PEER_IBGP
) {
10438 if (p
->gtsm_hops
> 0)
10439 json_object_int_add(json_neigh
,
10440 "externalBgpNbrMaxHopsAway",
10442 else if (p
->ttl
> 1)
10443 json_object_int_add(json_neigh
,
10444 "externalBgpNbrMaxHopsAway",
10447 if (p
->gtsm_hops
> 0)
10449 " External BGP neighbor may be up to %d hops away.\n",
10451 else if (p
->ttl
> 1)
10453 " External BGP neighbor may be up to %d hops away.\n",
10457 if (p
->gtsm_hops
> 0) {
10459 json_object_int_add(json_neigh
,
10460 "internalBgpNbrMaxHopsAway",
10464 " Internal BGP neighbor may be up to %d hops away.\n",
10469 /* Local address. */
10472 json_object_string_add(json_neigh
, "hostLocal",
10473 sockunion2str(p
->su_local
, buf1
,
10475 json_object_int_add(json_neigh
, "portLocal",
10476 ntohs(p
->su_local
->sin
.sin_port
));
10478 vty_out(vty
, "Local host: %s, Local port: %d\n",
10479 sockunion2str(p
->su_local
, buf1
, SU_ADDRSTRLEN
),
10480 ntohs(p
->su_local
->sin
.sin_port
));
10483 /* Remote address. */
10484 if (p
->su_remote
) {
10486 json_object_string_add(json_neigh
, "hostForeign",
10487 sockunion2str(p
->su_remote
, buf1
,
10489 json_object_int_add(json_neigh
, "portForeign",
10490 ntohs(p
->su_remote
->sin
.sin_port
));
10492 vty_out(vty
, "Foreign host: %s, Foreign port: %d\n",
10493 sockunion2str(p
->su_remote
, buf1
,
10495 ntohs(p
->su_remote
->sin
.sin_port
));
10498 /* Nexthop display. */
10501 json_object_string_add(json_neigh
, "nexthop",
10503 &p
->nexthop
.v4
, buf1
,
10505 json_object_string_add(json_neigh
, "nexthopGlobal",
10506 inet_ntop(AF_INET6
,
10507 &p
->nexthop
.v6_global
,
10508 buf1
, sizeof(buf1
)));
10509 json_object_string_add(json_neigh
, "nexthopLocal",
10510 inet_ntop(AF_INET6
,
10511 &p
->nexthop
.v6_local
,
10512 buf1
, sizeof(buf1
)));
10513 if (p
->shared_network
)
10514 json_object_string_add(json_neigh
,
10518 json_object_string_add(json_neigh
,
10520 "nonSharedNetwork");
10522 vty_out(vty
, "Nexthop: %s\n",
10523 inet_ntop(AF_INET
, &p
->nexthop
.v4
, buf1
,
10525 vty_out(vty
, "Nexthop global: %s\n",
10526 inet_ntop(AF_INET6
, &p
->nexthop
.v6_global
, buf1
,
10528 vty_out(vty
, "Nexthop local: %s\n",
10529 inet_ntop(AF_INET6
, &p
->nexthop
.v6_local
, buf1
,
10531 vty_out(vty
, "BGP connection: %s\n",
10532 p
->shared_network
? "shared network"
10533 : "non shared network");
10537 /* Timer information. */
10539 json_object_int_add(json_neigh
, "connectRetryTimer",
10541 if (p
->status
== Established
&& p
->rtt
)
10542 json_object_int_add(json_neigh
, "estimatedRttInMsecs",
10545 json_object_int_add(
10546 json_neigh
, "nextStartTimerDueInMsecs",
10547 thread_timer_remain_second(p
->t_start
) * 1000);
10549 json_object_int_add(
10550 json_neigh
, "nextConnectTimerDueInMsecs",
10551 thread_timer_remain_second(p
->t_connect
)
10553 if (p
->t_routeadv
) {
10554 json_object_int_add(json_neigh
, "mraiInterval",
10556 json_object_int_add(
10557 json_neigh
, "mraiTimerExpireInMsecs",
10558 thread_timer_remain_second(p
->t_routeadv
)
10562 json_object_int_add(json_neigh
, "authenticationEnabled",
10566 json_object_string_add(json_neigh
, "readThread", "on");
10568 json_object_string_add(json_neigh
, "readThread", "off");
10570 if (CHECK_FLAG(p
->thread_flags
, PEER_THREAD_WRITES_ON
))
10571 json_object_string_add(json_neigh
, "writeThread", "on");
10573 json_object_string_add(json_neigh
, "writeThread",
10576 vty_out(vty
, "BGP Connect Retry Timer in Seconds: %d\n",
10578 if (p
->status
== Established
&& p
->rtt
)
10579 vty_out(vty
, "Estimated round trip time: %d ms\n",
10582 vty_out(vty
, "Next start timer due in %ld seconds\n",
10583 thread_timer_remain_second(p
->t_start
));
10585 vty_out(vty
, "Next connect timer due in %ld seconds\n",
10586 thread_timer_remain_second(p
->t_connect
));
10589 "MRAI (interval %u) timer expires in %ld seconds\n",
10591 thread_timer_remain_second(p
->t_routeadv
));
10593 vty_out(vty
, "Peer Authentication Enabled\n");
10595 vty_out(vty
, "Read thread: %s Write thread: %s\n",
10596 p
->t_read
? "on" : "off",
10597 CHECK_FLAG(p
->thread_flags
, PEER_THREAD_WRITES_ON
)
10602 if (p
->notify
.code
== BGP_NOTIFY_OPEN_ERR
10603 && p
->notify
.subcode
== BGP_NOTIFY_OPEN_UNSUP_CAPBL
)
10604 bgp_capability_vty_out(vty
, p
, use_json
, json_neigh
);
10607 vty_out(vty
, "\n");
10609 /* BFD information. */
10610 bgp_bfd_show_info(vty
, p
, use_json
, json_neigh
);
10613 if (p
->conf_if
) /* Configured interface name. */
10614 json_object_object_add(json
, p
->conf_if
, json_neigh
);
10615 else /* Configured IP address. */
10616 json_object_object_add(json
, p
->host
, json_neigh
);
10620 static int bgp_show_neighbor(struct vty
*vty
, struct bgp
*bgp
,
10621 enum show_type type
, union sockunion
*su
,
10622 const char *conf_if
, uint8_t use_json
,
10625 struct listnode
*node
, *nnode
;
10629 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
10630 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
10635 bgp_show_peer(vty
, peer
, use_json
, json
);
10640 && !strcmp(peer
->conf_if
, conf_if
))
10642 && !strcmp(peer
->hostname
, conf_if
))) {
10644 bgp_show_peer(vty
, peer
, use_json
,
10648 if (sockunion_same(&peer
->su
, su
)) {
10650 bgp_show_peer(vty
, peer
, use_json
,
10658 if (type
== show_peer
&& !find
) {
10660 json_object_boolean_true_add(json
, "bgpNoSuchNeighbor");
10662 vty_out(vty
, "%% No such neighbor in this view/vrf\n");
10666 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
10667 json
, JSON_C_TO_STRING_PRETTY
));
10668 json_object_free(json
);
10670 vty_out(vty
, "\n");
10673 return CMD_SUCCESS
;
10676 static void bgp_show_all_instances_neighbors_vty(struct vty
*vty
,
10677 enum show_type type
,
10678 const char *ip_str
,
10681 struct listnode
*node
, *nnode
;
10683 union sockunion su
;
10684 json_object
*json
= NULL
;
10685 int ret
, is_first
= 1;
10688 vty_out(vty
, "{\n");
10690 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
10692 if (!(json
= json_object_new_object())) {
10694 "Unable to allocate memory for JSON object");
10696 "{\"error\": {\"message:\": \"Unable to allocate memory for JSON object\"}}}\n");
10700 json_object_int_add(json
, "vrfId",
10701 (bgp
->vrf_id
== VRF_UNKNOWN
)
10703 : (int64_t)bgp
->vrf_id
);
10704 json_object_string_add(
10706 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
10711 vty_out(vty
, ",\n");
10715 vty_out(vty
, "\"%s\":",
10716 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
10720 vty_out(vty
, "\nInstance %s:\n",
10721 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
10726 if (type
== show_peer
) {
10727 ret
= str2sockunion(ip_str
, &su
);
10729 bgp_show_neighbor(vty
, bgp
, type
, NULL
, ip_str
,
10732 bgp_show_neighbor(vty
, bgp
, type
, &su
, NULL
,
10735 bgp_show_neighbor(vty
, bgp
, show_all
, NULL
, NULL
,
10741 vty_out(vty
, "}\n");
10744 static int bgp_show_neighbor_vty(struct vty
*vty
, const char *name
,
10745 enum show_type type
, const char *ip_str
,
10750 union sockunion su
;
10751 json_object
*json
= NULL
;
10754 if (strmatch(name
, "all")) {
10755 bgp_show_all_instances_neighbors_vty(vty
, type
, ip_str
,
10757 return CMD_SUCCESS
;
10759 bgp
= bgp_lookup_by_name(name
);
10762 json
= json_object_new_object();
10763 json_object_boolean_true_add(
10764 json
, "bgpNoSuchInstance");
10765 vty_out(vty
, "%s\n",
10766 json_object_to_json_string_ext(
10768 JSON_C_TO_STRING_PRETTY
));
10769 json_object_free(json
);
10772 "%% No such BGP instance exist\n");
10774 return CMD_WARNING
;
10778 bgp
= bgp_get_default();
10782 json
= json_object_new_object();
10784 ret
= str2sockunion(ip_str
, &su
);
10786 bgp_show_neighbor(vty
, bgp
, type
, NULL
, ip_str
,
10789 bgp_show_neighbor(vty
, bgp
, type
, &su
, NULL
,
10792 bgp_show_neighbor(vty
, bgp
, type
, NULL
, NULL
, use_json
,
10795 json_object_free(json
);
10798 return CMD_SUCCESS
;
10801 /* "show [ip] bgp neighbors" commands. */
10802 DEFUN (show_ip_bgp_neighbors
,
10803 show_ip_bgp_neighbors_cmd
,
10804 "show [ip] bgp [<view|vrf> VIEWVRFNAME] [<ipv4|ipv6>] neighbors [<A.B.C.D|X:X::X:X|WORD>] [json]",
10808 BGP_INSTANCE_HELP_STR
10811 "Detailed information on TCP and BGP neighbor connections\n"
10812 "Neighbor to display information about\n"
10813 "Neighbor to display information about\n"
10814 "Neighbor on BGP configured interface\n"
10818 char *sh_arg
= NULL
;
10819 enum show_type sh_type
;
10821 uint8_t uj
= use_json(argc
, argv
);
10825 if (argv_find(argv
, argc
, "view", &idx
)
10826 || argv_find(argv
, argc
, "vrf", &idx
))
10827 vrf
= argv
[idx
+ 1]->arg
;
10830 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)
10831 || argv_find(argv
, argc
, "X:X::X:X", &idx
)
10832 || argv_find(argv
, argc
, "WORD", &idx
)) {
10833 sh_type
= show_peer
;
10834 sh_arg
= argv
[idx
]->arg
;
10836 sh_type
= show_all
;
10838 return bgp_show_neighbor_vty(vty
, vrf
, sh_type
, sh_arg
, uj
);
10841 /* Show BGP's AS paths internal data. There are both `show [ip] bgp
10842 paths' and `show ip mbgp paths'. Those functions results are the
10844 DEFUN (show_ip_bgp_paths
,
10845 show_ip_bgp_paths_cmd
,
10846 "show [ip] bgp ["BGP_SAFI_CMD_STR
"] paths",
10851 "Path information\n")
10853 vty_out(vty
, "Address Refcnt Path\n");
10854 aspath_print_all_vty(vty
);
10855 return CMD_SUCCESS
;
10860 static void community_show_all_iterator(struct hash_backet
*backet
,
10863 struct community
*com
;
10865 com
= (struct community
*)backet
->data
;
10866 vty_out(vty
, "[%p] (%ld) %s\n", (void *)com
, com
->refcnt
,
10867 community_str(com
, false));
10870 /* Show BGP's community internal data. */
10871 DEFUN (show_ip_bgp_community_info
,
10872 show_ip_bgp_community_info_cmd
,
10873 "show [ip] bgp community-info",
10877 "List all bgp community information\n")
10879 vty_out(vty
, "Address Refcnt Community\n");
10881 hash_iterate(community_hash(),
10882 (void (*)(struct hash_backet
*,
10883 void *))community_show_all_iterator
,
10886 return CMD_SUCCESS
;
10889 static void lcommunity_show_all_iterator(struct hash_backet
*backet
,
10892 struct lcommunity
*lcom
;
10894 lcom
= (struct lcommunity
*)backet
->data
;
10895 vty_out(vty
, "[%p] (%ld) %s\n", (void *)lcom
, lcom
->refcnt
,
10896 lcommunity_str(lcom
, false));
10899 /* Show BGP's community internal data. */
10900 DEFUN (show_ip_bgp_lcommunity_info
,
10901 show_ip_bgp_lcommunity_info_cmd
,
10902 "show ip bgp large-community-info",
10906 "List all bgp large-community information\n")
10908 vty_out(vty
, "Address Refcnt Large-community\n");
10910 hash_iterate(lcommunity_hash(),
10911 (void (*)(struct hash_backet
*,
10912 void *))lcommunity_show_all_iterator
,
10915 return CMD_SUCCESS
;
10919 DEFUN (show_ip_bgp_attr_info
,
10920 show_ip_bgp_attr_info_cmd
,
10921 "show [ip] bgp attribute-info",
10925 "List all bgp attribute information\n")
10927 attr_show_all(vty
);
10928 return CMD_SUCCESS
;
10931 static int bgp_show_route_leak_vty(struct vty
*vty
, const char *name
,
10932 afi_t afi
, safi_t safi
)
10935 struct listnode
*node
;
10937 char buf1
[INET6_ADDRSTRLEN
];
10939 vpn_policy_direction_t dir
;
10942 bgp
= bgp_lookup_by_name(name
);
10944 vty_out(vty
, "%% No such BGP instance exist\n");
10945 return CMD_WARNING
;
10948 bgp
= bgp_get_default();
10951 "%% Default BGP instance does not exist\n");
10952 return CMD_WARNING
;
10956 if (!CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
10957 BGP_CONFIG_VRF_TO_VRF_IMPORT
)) {
10959 "This VRF is not importing %s routes from any other VRF\n",
10960 afi_safi_print(afi
, safi
));
10963 "This VRF is importing %s routes from the following VRFs:\n",
10964 afi_safi_print(afi
, safi
));
10965 for (ALL_LIST_ELEMENTS_RO(bgp
->vpn_policy
[afi
].import_vrf
, node
,
10967 vty_out(vty
, " %s\n", vname
);
10969 dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
10970 ecom_str
= ecommunity_ecom2str(
10971 bgp
->vpn_policy
[afi
].rtlist
[dir
],
10972 ECOMMUNITY_FORMAT_ROUTE_MAP
, 0);
10973 vty_out(vty
, "Import RT(s): %s\n", ecom_str
);
10974 XFREE(MTYPE_ECOMMUNITY_STR
, ecom_str
);
10977 if (!CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
10978 BGP_CONFIG_VRF_TO_VRF_EXPORT
)) {
10980 "This VRF is not exporting %s routes to any other VRF\n",
10981 afi_safi_print(afi
, safi
));
10984 "This VRF is exporting %s routes to the following VRFs:\n",
10985 afi_safi_print(afi
, safi
));
10986 for (ALL_LIST_ELEMENTS_RO(bgp
->vpn_policy
[afi
].export_vrf
, node
,
10988 vty_out(vty
, " %s\n", vname
);
10990 vty_out(vty
, "RD: %s\n",
10991 prefix_rd2str(&bgp
->vpn_policy
[afi
].tovpn_rd
,
10992 buf1
, RD_ADDRSTRLEN
));
10993 dir
= BGP_VPN_POLICY_DIR_TOVPN
;
10994 ecom_str
= ecommunity_ecom2str(
10995 bgp
->vpn_policy
[afi
].rtlist
[dir
],
10996 ECOMMUNITY_FORMAT_ROUTE_MAP
, 0);
10997 vty_out(vty
, "Emport RT: %s\n", ecom_str
);
10998 XFREE(MTYPE_ECOMMUNITY_STR
, ecom_str
);
11001 return CMD_SUCCESS
;
11004 /* "show [ip] bgp route-leak" command. */
11005 DEFUN (show_ip_bgp_route_leak
,
11006 show_ip_bgp_route_leak_cmd
,
11007 "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR
" ["BGP_SAFI_CMD_STR
"]] route-leak",
11011 BGP_INSTANCE_HELP_STR
11014 "Route leaking information\n")
11017 afi_t afi
= AFI_MAX
;
11018 safi_t safi
= SAFI_MAX
;
11022 /* show [ip] bgp */
11023 if (argv_find(argv
, argc
, "ip", &idx
)) {
11025 safi
= SAFI_UNICAST
;
11027 /* [vrf VIEWVRFNAME] */
11028 if (argv_find(argv
, argc
, "view", &idx
)) {
11030 "%% This command is not applicable to BGP views\n");
11031 return CMD_WARNING
;
11034 if (argv_find(argv
, argc
, "vrf", &idx
))
11035 vrf
= argv
[++idx
]->arg
;
11036 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
11037 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
)) {
11038 argv_find_and_parse_safi(argv
, argc
, &idx
, &safi
);
11041 if (!((afi
== AFI_IP
|| afi
== AFI_IP6
) && safi
== SAFI_UNICAST
)) {
11043 "%% This command is applicable only for unicast ipv4|ipv6\n");
11044 return CMD_WARNING
;
11047 return bgp_show_route_leak_vty(vty
, vrf
, afi
, safi
);
11050 static void bgp_show_all_instances_updgrps_vty(struct vty
*vty
, afi_t afi
,
11053 struct listnode
*node
, *nnode
;
11056 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
11057 vty_out(vty
, "\nInstance %s:\n",
11058 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
11061 update_group_show(bgp
, afi
, safi
, vty
, 0);
11065 static int bgp_show_update_groups(struct vty
*vty
, const char *name
, int afi
,
11066 int safi
, uint64_t subgrp_id
)
11071 if (strmatch(name
, "all")) {
11072 bgp_show_all_instances_updgrps_vty(vty
, afi
, safi
);
11073 return CMD_SUCCESS
;
11075 bgp
= bgp_lookup_by_name(name
);
11078 bgp
= bgp_get_default();
11082 update_group_show(bgp
, afi
, safi
, vty
, subgrp_id
);
11083 return CMD_SUCCESS
;
11086 DEFUN (show_ip_bgp_updgrps
,
11087 show_ip_bgp_updgrps_cmd
,
11088 "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR
" ["BGP_SAFI_WITH_LABEL_CMD_STR
"]] update-groups [SUBGROUP-ID]",
11092 BGP_INSTANCE_HELP_STR
11094 BGP_SAFI_WITH_LABEL_HELP_STR
11095 "Detailed info about dynamic update groups\n"
11096 "Specific subgroup to display detailed info for\n")
11099 afi_t afi
= AFI_IP6
;
11100 safi_t safi
= SAFI_UNICAST
;
11101 uint64_t subgrp_id
= 0;
11105 /* show [ip] bgp */
11106 if (argv_find(argv
, argc
, "ip", &idx
))
11108 /* [<view|vrf> VIEWVRFNAME] */
11109 if (argv_find(argv
, argc
, "view", &idx
)
11110 || argv_find(argv
, argc
, "vrf", &idx
))
11111 vrf
= argv
[++idx
]->arg
;
11112 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
11113 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
)) {
11114 argv_find_and_parse_safi(argv
, argc
, &idx
, &safi
);
11117 /* get subgroup id, if provided */
11119 if (argv
[idx
]->type
== VARIABLE_TKN
)
11120 subgrp_id
= strtoull(argv
[idx
]->arg
, NULL
, 10);
11122 return (bgp_show_update_groups(vty
, vrf
, afi
, safi
, subgrp_id
));
11125 DEFUN (show_bgp_instance_all_ipv6_updgrps
,
11126 show_bgp_instance_all_ipv6_updgrps_cmd
,
11127 "show [ip] bgp <view|vrf> all update-groups",
11131 BGP_INSTANCE_ALL_HELP_STR
11132 "Detailed info about dynamic update groups\n")
11134 bgp_show_all_instances_updgrps_vty(vty
, AFI_IP6
, SAFI_UNICAST
);
11135 return CMD_SUCCESS
;
11138 DEFUN (show_bgp_updgrps_stats
,
11139 show_bgp_updgrps_stats_cmd
,
11140 "show [ip] bgp update-groups statistics",
11144 "Detailed info about dynamic update groups\n"
11149 bgp
= bgp_get_default();
11151 update_group_show_stats(bgp
, vty
);
11153 return CMD_SUCCESS
;
11156 DEFUN (show_bgp_instance_updgrps_stats
,
11157 show_bgp_instance_updgrps_stats_cmd
,
11158 "show [ip] bgp <view|vrf> VIEWVRFNAME update-groups statistics",
11162 BGP_INSTANCE_HELP_STR
11163 "Detailed info about dynamic update groups\n"
11169 bgp
= bgp_lookup_by_name(argv
[idx_word
]->arg
);
11171 update_group_show_stats(bgp
, vty
);
11173 return CMD_SUCCESS
;
11176 static void show_bgp_updgrps_adj_info_aux(struct vty
*vty
, const char *name
,
11177 afi_t afi
, safi_t safi
,
11178 const char *what
, uint64_t subgrp_id
)
11183 bgp
= bgp_lookup_by_name(name
);
11185 bgp
= bgp_get_default();
11188 if (!strcmp(what
, "advertise-queue"))
11189 update_group_show_adj_queue(bgp
, afi
, safi
, vty
,
11191 else if (!strcmp(what
, "advertised-routes"))
11192 update_group_show_advertised(bgp
, afi
, safi
, vty
,
11194 else if (!strcmp(what
, "packet-queue"))
11195 update_group_show_packet_queue(bgp
, afi
, safi
, vty
,
11200 DEFPY(show_ip_bgp_instance_updgrps_adj_s
,
11201 show_ip_bgp_instance_updgrps_adj_s_cmd
,
11202 "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",
11203 SHOW_STR IP_STR BGP_STR BGP_INSTANCE_HELP_STR BGP_AFI_HELP_STR
11205 "Detailed info about dynamic update groups\n"
11206 "Specific subgroup to display info for\n"
11207 "Advertisement queue\n"
11208 "Announced routes\n"
11211 uint64_t subgrp_id
= 0;
11215 subgrp_id
= strtoull(sgid
, NULL
, 10);
11220 afiz
= bgp_vty_afi_from_str(afi
);
11224 afiz
= bgp_vty_afi_from_str(afi
);
11225 if (afiz
!= AFI_IP
)
11227 "%% Cannot specify both 'ip' and 'ipv6'\n");
11228 return CMD_WARNING
;
11231 safiz
= safi
? bgp_vty_safi_from_str(safi
) : SAFI_UNICAST
;
11233 show_bgp_updgrps_adj_info_aux(vty
, vrf
, afiz
, safiz
, rtq
, subgrp_id
);
11234 return CMD_SUCCESS
;
11237 static int bgp_show_one_peer_group(struct vty
*vty
, struct peer_group
*group
)
11239 struct listnode
*node
, *nnode
;
11240 struct prefix
*range
;
11243 char buf
[PREFIX2STR_BUFFER
];
11246 const char *peer_status
;
11247 const char *af_str
;
11252 conf
= group
->conf
;
11254 if (conf
->as_type
== AS_SPECIFIED
|| conf
->as_type
== AS_EXTERNAL
) {
11255 vty_out(vty
, "\nBGP peer-group %s, remote AS %d\n", group
->name
,
11257 } else if (conf
->as_type
== AS_INTERNAL
) {
11258 vty_out(vty
, "\nBGP peer-group %s, remote AS %d\n", group
->name
,
11261 vty_out(vty
, "\nBGP peer-group %s\n", group
->name
);
11264 if ((group
->bgp
->as
== conf
->as
) || (conf
->as_type
== AS_INTERNAL
))
11265 vty_out(vty
, " Peer-group type is internal\n");
11267 vty_out(vty
, " Peer-group type is external\n");
11269 /* Display AFs configured. */
11270 vty_out(vty
, " Configured address-families:");
11271 FOREACH_AFI_SAFI (afi
, safi
) {
11272 if (conf
->afc
[afi
][safi
]) {
11274 vty_out(vty
, " %s;", afi_safi_print(afi
, safi
));
11278 vty_out(vty
, " none\n");
11280 vty_out(vty
, "\n");
11282 /* Display listen ranges (for dynamic neighbors), if any */
11283 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++) {
11286 else if (afi
== AFI_IP6
)
11290 lr_count
= listcount(group
->listen_range
[afi
]);
11292 vty_out(vty
, " %d %s listen range(s)\n", lr_count
,
11296 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], node
,
11298 prefix2str(range
, buf
, sizeof(buf
));
11299 vty_out(vty
, " %s\n", buf
);
11304 /* Display group members and their status */
11305 if (listcount(group
->peer
)) {
11306 vty_out(vty
, " Peer-group members:\n");
11307 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
11308 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_SHUTDOWN
))
11309 peer_status
= "Idle (Admin)";
11310 else if (CHECK_FLAG(peer
->sflags
,
11311 PEER_STATUS_PREFIX_OVERFLOW
))
11312 peer_status
= "Idle (PfxCt)";
11314 peer_status
= lookup_msg(bgp_status_msg
,
11315 peer
->status
, NULL
);
11317 dynamic
= peer_dynamic_neighbor(peer
);
11318 vty_out(vty
, " %s %s %s \n", peer
->host
,
11319 dynamic
? "(dynamic)" : "", peer_status
);
11323 return CMD_SUCCESS
;
11326 static int bgp_show_peer_group_vty(struct vty
*vty
, const char *name
,
11327 const char *group_name
)
11330 struct listnode
*node
, *nnode
;
11331 struct peer_group
*group
;
11332 bool found
= false;
11334 bgp
= name
? bgp_lookup_by_name(name
) : bgp_get_default();
11337 vty_out(vty
, "%% No such BGP instance exists\n");
11338 return CMD_WARNING
;
11341 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
11343 if (strmatch(group
->name
, group_name
)) {
11344 bgp_show_one_peer_group(vty
, group
);
11349 bgp_show_one_peer_group(vty
, group
);
11353 if (group_name
&& !found
)
11354 vty_out(vty
, "%% No such peer-group\n");
11356 return CMD_SUCCESS
;
11359 DEFUN (show_ip_bgp_peer_groups
,
11360 show_ip_bgp_peer_groups_cmd
,
11361 "show [ip] bgp [<view|vrf> VIEWVRFNAME] peer-group [PGNAME]",
11365 BGP_INSTANCE_HELP_STR
11366 "Detailed information on BGP peer groups\n"
11367 "Peer group name\n")
11373 vrf
= argv_find(argv
, argc
, "VIEWVRFNAME", &idx
) ? argv
[idx
]->arg
11375 pg
= argv_find(argv
, argc
, "PGNAME", &idx
) ? argv
[idx
]->arg
: NULL
;
11377 return bgp_show_peer_group_vty(vty
, vrf
, pg
);
11381 /* Redistribute VTY commands. */
11383 DEFUN (bgp_redistribute_ipv4
,
11384 bgp_redistribute_ipv4_cmd
,
11385 "redistribute " FRR_IP_REDIST_STR_BGPD
,
11386 "Redistribute information from another routing protocol\n"
11387 FRR_IP_REDIST_HELP_STR_BGPD
)
11389 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11390 int idx_protocol
= 1;
11393 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
11395 vty_out(vty
, "%% Invalid route type\n");
11396 return CMD_WARNING_CONFIG_FAILED
;
11399 bgp_redist_add(bgp
, AFI_IP
, type
, 0);
11400 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0);
11404 bgp_redistribute_ipv4
, bgp_redistribute_ipv4_hidden_cmd
,
11405 "redistribute " FRR_IP_REDIST_STR_BGPD
,
11406 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
)
11408 DEFUN (bgp_redistribute_ipv4_rmap
,
11409 bgp_redistribute_ipv4_rmap_cmd
,
11410 "redistribute " FRR_IP_REDIST_STR_BGPD
" route-map WORD",
11411 "Redistribute information from another routing protocol\n"
11412 FRR_IP_REDIST_HELP_STR_BGPD
11413 "Route map reference\n"
11414 "Pointer to route-map entries\n")
11416 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11417 int idx_protocol
= 1;
11420 struct bgp_redist
*red
;
11422 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
11424 vty_out(vty
, "%% Invalid route type\n");
11425 return CMD_WARNING_CONFIG_FAILED
;
11428 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
11429 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
);
11430 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0);
11434 bgp_redistribute_ipv4_rmap
, bgp_redistribute_ipv4_rmap_hidden_cmd
,
11435 "redistribute " FRR_IP_REDIST_STR_BGPD
" route-map WORD",
11436 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
11437 "Route map reference\n"
11438 "Pointer to route-map entries\n")
11440 DEFUN (bgp_redistribute_ipv4_metric
,
11441 bgp_redistribute_ipv4_metric_cmd
,
11442 "redistribute " FRR_IP_REDIST_STR_BGPD
" metric (0-4294967295)",
11443 "Redistribute information from another routing protocol\n"
11444 FRR_IP_REDIST_HELP_STR_BGPD
11445 "Metric for redistributed routes\n"
11446 "Default metric\n")
11448 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11449 int idx_protocol
= 1;
11450 int idx_number
= 3;
11453 struct bgp_redist
*red
;
11455 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
11457 vty_out(vty
, "%% Invalid route type\n");
11458 return CMD_WARNING_CONFIG_FAILED
;
11460 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
11462 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
11463 bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, type
, metric
);
11464 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0);
11468 bgp_redistribute_ipv4_metric
, bgp_redistribute_ipv4_metric_hidden_cmd
,
11469 "redistribute " FRR_IP_REDIST_STR_BGPD
" metric (0-4294967295)",
11470 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
11471 "Metric for redistributed routes\n"
11472 "Default metric\n")
11474 DEFUN (bgp_redistribute_ipv4_rmap_metric
,
11475 bgp_redistribute_ipv4_rmap_metric_cmd
,
11476 "redistribute " FRR_IP_REDIST_STR_BGPD
" route-map WORD metric (0-4294967295)",
11477 "Redistribute information from another routing protocol\n"
11478 FRR_IP_REDIST_HELP_STR_BGPD
11479 "Route map reference\n"
11480 "Pointer to route-map entries\n"
11481 "Metric for redistributed routes\n"
11482 "Default metric\n")
11484 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11485 int idx_protocol
= 1;
11487 int idx_number
= 5;
11490 struct bgp_redist
*red
;
11492 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
11494 vty_out(vty
, "%% Invalid route type\n");
11495 return CMD_WARNING_CONFIG_FAILED
;
11497 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
11499 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
11500 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
);
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_rmap_metric
,
11507 bgp_redistribute_ipv4_rmap_metric_hidden_cmd
,
11508 "redistribute " FRR_IP_REDIST_STR_BGPD
11509 " route-map WORD metric (0-4294967295)",
11510 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
11511 "Route map reference\n"
11512 "Pointer to route-map entries\n"
11513 "Metric for redistributed routes\n"
11514 "Default metric\n")
11516 DEFUN (bgp_redistribute_ipv4_metric_rmap
,
11517 bgp_redistribute_ipv4_metric_rmap_cmd
,
11518 "redistribute " FRR_IP_REDIST_STR_BGPD
" metric (0-4294967295) route-map WORD",
11519 "Redistribute information from another routing protocol\n"
11520 FRR_IP_REDIST_HELP_STR_BGPD
11521 "Metric for redistributed routes\n"
11523 "Route map reference\n"
11524 "Pointer to route-map entries\n")
11526 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11527 int idx_protocol
= 1;
11528 int idx_number
= 3;
11532 struct bgp_redist
*red
;
11534 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
11536 vty_out(vty
, "%% Invalid route type\n");
11537 return CMD_WARNING_CONFIG_FAILED
;
11539 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
11541 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
11542 bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, type
, metric
);
11543 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
);
11544 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0);
11548 bgp_redistribute_ipv4_metric_rmap
,
11549 bgp_redistribute_ipv4_metric_rmap_hidden_cmd
,
11550 "redistribute " FRR_IP_REDIST_STR_BGPD
11551 " metric (0-4294967295) route-map WORD",
11552 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
11553 "Metric for redistributed routes\n"
11555 "Route map reference\n"
11556 "Pointer to route-map entries\n")
11558 DEFUN (bgp_redistribute_ipv4_ospf
,
11559 bgp_redistribute_ipv4_ospf_cmd
,
11560 "redistribute <ospf|table> (1-65535)",
11561 "Redistribute information from another routing protocol\n"
11562 "Open Shortest Path First (OSPFv2)\n"
11563 "Non-main Kernel Routing Table\n"
11564 "Instance ID/Table ID\n")
11566 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11567 int idx_ospf_table
= 1;
11568 int idx_number
= 2;
11569 unsigned short instance
;
11570 unsigned short protocol
;
11572 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
11574 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
11575 protocol
= ZEBRA_ROUTE_OSPF
;
11577 protocol
= ZEBRA_ROUTE_TABLE
;
11579 bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
11580 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
);
11583 ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf
, bgp_redistribute_ipv4_ospf_hidden_cmd
,
11584 "redistribute <ospf|table> (1-65535)",
11585 "Redistribute information from another routing protocol\n"
11586 "Open Shortest Path First (OSPFv2)\n"
11587 "Non-main Kernel Routing Table\n"
11588 "Instance ID/Table ID\n")
11590 DEFUN (bgp_redistribute_ipv4_ospf_rmap
,
11591 bgp_redistribute_ipv4_ospf_rmap_cmd
,
11592 "redistribute <ospf|table> (1-65535) route-map WORD",
11593 "Redistribute information from another routing protocol\n"
11594 "Open Shortest Path First (OSPFv2)\n"
11595 "Non-main Kernel Routing Table\n"
11596 "Instance ID/Table ID\n"
11597 "Route map reference\n"
11598 "Pointer to route-map entries\n")
11600 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11601 int idx_ospf_table
= 1;
11602 int idx_number
= 2;
11604 struct bgp_redist
*red
;
11605 unsigned short instance
;
11608 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
11609 protocol
= ZEBRA_ROUTE_OSPF
;
11611 protocol
= ZEBRA_ROUTE_TABLE
;
11613 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
11614 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
11615 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
);
11616 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
);
11619 ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf_rmap
,
11620 bgp_redistribute_ipv4_ospf_rmap_hidden_cmd
,
11621 "redistribute <ospf|table> (1-65535) route-map WORD",
11622 "Redistribute information from another routing protocol\n"
11623 "Open Shortest Path First (OSPFv2)\n"
11624 "Non-main Kernel Routing Table\n"
11625 "Instance ID/Table ID\n"
11626 "Route map reference\n"
11627 "Pointer to route-map entries\n")
11629 DEFUN (bgp_redistribute_ipv4_ospf_metric
,
11630 bgp_redistribute_ipv4_ospf_metric_cmd
,
11631 "redistribute <ospf|table> (1-65535) metric (0-4294967295)",
11632 "Redistribute information from another routing protocol\n"
11633 "Open Shortest Path First (OSPFv2)\n"
11634 "Non-main Kernel Routing Table\n"
11635 "Instance ID/Table ID\n"
11636 "Metric for redistributed routes\n"
11637 "Default metric\n")
11639 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11640 int idx_ospf_table
= 1;
11641 int idx_number
= 2;
11642 int idx_number_2
= 4;
11644 struct bgp_redist
*red
;
11645 unsigned short instance
;
11648 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
11649 protocol
= ZEBRA_ROUTE_OSPF
;
11651 protocol
= ZEBRA_ROUTE_TABLE
;
11653 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
11654 metric
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
11656 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
11657 bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, protocol
, metric
);
11658 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
);
11661 ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf_metric
,
11662 bgp_redistribute_ipv4_ospf_metric_hidden_cmd
,
11663 "redistribute <ospf|table> (1-65535) metric (0-4294967295)",
11664 "Redistribute information from another routing protocol\n"
11665 "Open Shortest Path First (OSPFv2)\n"
11666 "Non-main Kernel Routing Table\n"
11667 "Instance ID/Table ID\n"
11668 "Metric for redistributed routes\n"
11669 "Default metric\n")
11671 DEFUN (bgp_redistribute_ipv4_ospf_rmap_metric
,
11672 bgp_redistribute_ipv4_ospf_rmap_metric_cmd
,
11673 "redistribute <ospf|table> (1-65535) route-map WORD metric (0-4294967295)",
11674 "Redistribute information from another routing protocol\n"
11675 "Open Shortest Path First (OSPFv2)\n"
11676 "Non-main Kernel Routing Table\n"
11677 "Instance ID/Table ID\n"
11678 "Route map reference\n"
11679 "Pointer to route-map entries\n"
11680 "Metric for redistributed routes\n"
11681 "Default metric\n")
11683 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11684 int idx_ospf_table
= 1;
11685 int idx_number
= 2;
11687 int idx_number_2
= 6;
11689 struct bgp_redist
*red
;
11690 unsigned short instance
;
11693 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
11694 protocol
= ZEBRA_ROUTE_OSPF
;
11696 protocol
= ZEBRA_ROUTE_TABLE
;
11698 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
11699 metric
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
11701 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
11702 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
);
11703 bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, protocol
, metric
);
11704 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
);
11708 bgp_redistribute_ipv4_ospf_rmap_metric
,
11709 bgp_redistribute_ipv4_ospf_rmap_metric_hidden_cmd
,
11710 "redistribute <ospf|table> (1-65535) route-map WORD metric (0-4294967295)",
11711 "Redistribute information from another routing protocol\n"
11712 "Open Shortest Path First (OSPFv2)\n"
11713 "Non-main Kernel Routing Table\n"
11714 "Instance ID/Table ID\n"
11715 "Route map reference\n"
11716 "Pointer to route-map entries\n"
11717 "Metric for redistributed routes\n"
11718 "Default metric\n")
11720 DEFUN (bgp_redistribute_ipv4_ospf_metric_rmap
,
11721 bgp_redistribute_ipv4_ospf_metric_rmap_cmd
,
11722 "redistribute <ospf|table> (1-65535) metric (0-4294967295) route-map WORD",
11723 "Redistribute information from another routing protocol\n"
11724 "Open Shortest Path First (OSPFv2)\n"
11725 "Non-main Kernel Routing Table\n"
11726 "Instance ID/Table ID\n"
11727 "Metric for redistributed routes\n"
11729 "Route map reference\n"
11730 "Pointer to route-map entries\n")
11732 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11733 int idx_ospf_table
= 1;
11734 int idx_number
= 2;
11735 int idx_number_2
= 4;
11738 struct bgp_redist
*red
;
11739 unsigned short instance
;
11742 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
11743 protocol
= ZEBRA_ROUTE_OSPF
;
11745 protocol
= ZEBRA_ROUTE_TABLE
;
11747 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
11748 metric
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
11750 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
11751 bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, protocol
, metric
);
11752 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
);
11753 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
);
11757 bgp_redistribute_ipv4_ospf_metric_rmap
,
11758 bgp_redistribute_ipv4_ospf_metric_rmap_hidden_cmd
,
11759 "redistribute <ospf|table> (1-65535) metric (0-4294967295) route-map WORD",
11760 "Redistribute information from another routing protocol\n"
11761 "Open Shortest Path First (OSPFv2)\n"
11762 "Non-main Kernel Routing Table\n"
11763 "Instance ID/Table ID\n"
11764 "Metric for redistributed routes\n"
11766 "Route map reference\n"
11767 "Pointer to route-map entries\n")
11769 DEFUN (no_bgp_redistribute_ipv4_ospf
,
11770 no_bgp_redistribute_ipv4_ospf_cmd
,
11771 "no redistribute <ospf|table> (1-65535) [metric (0-4294967295)] [route-map WORD]",
11773 "Redistribute information from another routing protocol\n"
11774 "Open Shortest Path First (OSPFv2)\n"
11775 "Non-main Kernel Routing Table\n"
11776 "Instance ID/Table ID\n"
11777 "Metric for redistributed routes\n"
11779 "Route map reference\n"
11780 "Pointer to route-map entries\n")
11782 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11783 int idx_ospf_table
= 2;
11784 int idx_number
= 3;
11785 unsigned short instance
;
11788 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
11789 protocol
= ZEBRA_ROUTE_OSPF
;
11791 protocol
= ZEBRA_ROUTE_TABLE
;
11793 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
11794 return bgp_redistribute_unset(bgp
, AFI_IP
, protocol
, instance
);
11798 no_bgp_redistribute_ipv4_ospf
, no_bgp_redistribute_ipv4_ospf_hidden_cmd
,
11799 "no redistribute <ospf|table> (1-65535) [metric (0-4294967295)] [route-map WORD]",
11801 "Redistribute information from another routing protocol\n"
11802 "Open Shortest Path First (OSPFv2)\n"
11803 "Non-main Kernel Routing Table\n"
11804 "Instance ID/Table ID\n"
11805 "Metric for redistributed routes\n"
11807 "Route map reference\n"
11808 "Pointer to route-map entries\n")
11810 DEFUN (no_bgp_redistribute_ipv4
,
11811 no_bgp_redistribute_ipv4_cmd
,
11812 "no redistribute " FRR_IP_REDIST_STR_BGPD
" [metric (0-4294967295)] [route-map WORD]",
11814 "Redistribute information from another routing protocol\n"
11815 FRR_IP_REDIST_HELP_STR_BGPD
11816 "Metric for redistributed routes\n"
11818 "Route map reference\n"
11819 "Pointer to route-map entries\n")
11821 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11822 int idx_protocol
= 2;
11825 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
11827 vty_out(vty
, "%% Invalid route type\n");
11828 return CMD_WARNING_CONFIG_FAILED
;
11830 return bgp_redistribute_unset(bgp
, AFI_IP
, type
, 0);
11834 no_bgp_redistribute_ipv4
, no_bgp_redistribute_ipv4_hidden_cmd
,
11835 "no redistribute " FRR_IP_REDIST_STR_BGPD
11836 " [metric (0-4294967295)] [route-map WORD]",
11838 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
11839 "Metric for redistributed routes\n"
11841 "Route map reference\n"
11842 "Pointer to route-map entries\n")
11844 DEFUN (bgp_redistribute_ipv6
,
11845 bgp_redistribute_ipv6_cmd
,
11846 "redistribute " FRR_IP6_REDIST_STR_BGPD
,
11847 "Redistribute information from another routing protocol\n"
11848 FRR_IP6_REDIST_HELP_STR_BGPD
)
11850 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11851 int idx_protocol
= 1;
11854 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
11856 vty_out(vty
, "%% Invalid route type\n");
11857 return CMD_WARNING_CONFIG_FAILED
;
11860 bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
11861 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0);
11864 DEFUN (bgp_redistribute_ipv6_rmap
,
11865 bgp_redistribute_ipv6_rmap_cmd
,
11866 "redistribute " FRR_IP6_REDIST_STR_BGPD
" route-map WORD",
11867 "Redistribute information from another routing protocol\n"
11868 FRR_IP6_REDIST_HELP_STR_BGPD
11869 "Route map reference\n"
11870 "Pointer to route-map entries\n")
11872 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11873 int idx_protocol
= 1;
11876 struct bgp_redist
*red
;
11878 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
11880 vty_out(vty
, "%% Invalid route type\n");
11881 return CMD_WARNING_CONFIG_FAILED
;
11884 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
11885 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
);
11886 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0);
11889 DEFUN (bgp_redistribute_ipv6_metric
,
11890 bgp_redistribute_ipv6_metric_cmd
,
11891 "redistribute " FRR_IP6_REDIST_STR_BGPD
" metric (0-4294967295)",
11892 "Redistribute information from another routing protocol\n"
11893 FRR_IP6_REDIST_HELP_STR_BGPD
11894 "Metric for redistributed routes\n"
11895 "Default metric\n")
11897 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11898 int idx_protocol
= 1;
11899 int idx_number
= 3;
11902 struct bgp_redist
*red
;
11904 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
11906 vty_out(vty
, "%% Invalid route type\n");
11907 return CMD_WARNING_CONFIG_FAILED
;
11909 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
11911 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
11912 bgp_redistribute_metric_set(bgp
, red
, AFI_IP6
, type
, metric
);
11913 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0);
11916 DEFUN (bgp_redistribute_ipv6_rmap_metric
,
11917 bgp_redistribute_ipv6_rmap_metric_cmd
,
11918 "redistribute " FRR_IP6_REDIST_STR_BGPD
" route-map WORD metric (0-4294967295)",
11919 "Redistribute information from another routing protocol\n"
11920 FRR_IP6_REDIST_HELP_STR_BGPD
11921 "Route map reference\n"
11922 "Pointer to route-map entries\n"
11923 "Metric for redistributed routes\n"
11924 "Default metric\n")
11926 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11927 int idx_protocol
= 1;
11929 int idx_number
= 5;
11932 struct bgp_redist
*red
;
11934 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
11936 vty_out(vty
, "%% Invalid route type\n");
11937 return CMD_WARNING_CONFIG_FAILED
;
11939 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
11941 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
11942 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
);
11943 bgp_redistribute_metric_set(bgp
, red
, AFI_IP6
, type
, metric
);
11944 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0);
11947 DEFUN (bgp_redistribute_ipv6_metric_rmap
,
11948 bgp_redistribute_ipv6_metric_rmap_cmd
,
11949 "redistribute " FRR_IP6_REDIST_STR_BGPD
" metric (0-4294967295) route-map WORD",
11950 "Redistribute information from another routing protocol\n"
11951 FRR_IP6_REDIST_HELP_STR_BGPD
11952 "Metric for redistributed routes\n"
11954 "Route map reference\n"
11955 "Pointer to route-map entries\n")
11957 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11958 int idx_protocol
= 1;
11959 int idx_number
= 3;
11963 struct bgp_redist
*red
;
11965 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
11967 vty_out(vty
, "%% Invalid route type\n");
11968 return CMD_WARNING_CONFIG_FAILED
;
11970 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
11972 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
11973 bgp_redistribute_metric_set(bgp
, red
, AFI_IP6
, SAFI_UNICAST
, metric
);
11974 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
);
11975 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0);
11978 DEFUN (no_bgp_redistribute_ipv6
,
11979 no_bgp_redistribute_ipv6_cmd
,
11980 "no redistribute " FRR_IP6_REDIST_STR_BGPD
" [metric (0-4294967295)] [route-map WORD]",
11982 "Redistribute information from another routing protocol\n"
11983 FRR_IP6_REDIST_HELP_STR_BGPD
11984 "Metric for redistributed routes\n"
11986 "Route map reference\n"
11987 "Pointer to route-map entries\n")
11989 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11990 int idx_protocol
= 2;
11993 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
11995 vty_out(vty
, "%% Invalid route type\n");
11996 return CMD_WARNING_CONFIG_FAILED
;
11999 return bgp_redistribute_unset(bgp
, AFI_IP6
, type
, 0);
12002 void bgp_config_write_redistribute(struct vty
*vty
, struct bgp
*bgp
, afi_t afi
,
12007 /* Unicast redistribution only. */
12008 if (safi
!= SAFI_UNICAST
)
12011 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++) {
12012 /* Redistribute BGP does not make sense. */
12013 if (i
!= ZEBRA_ROUTE_BGP
) {
12014 struct list
*red_list
;
12015 struct listnode
*node
;
12016 struct bgp_redist
*red
;
12018 red_list
= bgp
->redist
[afi
][i
];
12022 for (ALL_LIST_ELEMENTS_RO(red_list
, node
, red
)) {
12023 /* "redistribute" configuration. */
12024 vty_out(vty
, " redistribute %s",
12025 zebra_route_string(i
));
12027 vty_out(vty
, " %d", red
->instance
);
12028 if (red
->redist_metric_flag
)
12029 vty_out(vty
, " metric %u",
12030 red
->redist_metric
);
12031 if (red
->rmap
.name
)
12032 vty_out(vty
, " route-map %s",
12034 vty_out(vty
, "\n");
12040 /* This is part of the address-family block (unicast only) */
12041 void bgp_vpn_policy_config_write_afi(struct vty
*vty
, struct bgp
*bgp
,
12046 if (bgp
->vpn_policy
[afi
].rmap_name
[BGP_VPN_POLICY_DIR_FROMVPN
])
12047 vty_out(vty
, "%*simport vrf route-map %s\n", indent
, "",
12048 bgp
->vpn_policy
[afi
]
12049 .rmap_name
[BGP_VPN_POLICY_DIR_FROMVPN
]);
12051 if (CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
12052 BGP_CONFIG_VRF_TO_VRF_IMPORT
)
12053 || CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
12054 BGP_CONFIG_VRF_TO_VRF_EXPORT
))
12057 if (CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
12058 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
)) {
12060 vty_out(vty
, "%*slabel vpn export %s\n", indent
, "", "auto");
12063 if (bgp
->vpn_policy
[afi
].tovpn_label
!= MPLS_LABEL_NONE
) {
12064 vty_out(vty
, "%*slabel vpn export %u\n", indent
, "",
12065 bgp
->vpn_policy
[afi
].tovpn_label
);
12068 if (CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
12069 BGP_VPN_POLICY_TOVPN_RD_SET
)) {
12070 char buf
[RD_ADDRSTRLEN
];
12071 vty_out(vty
, "%*srd vpn export %s\n", indent
, "",
12072 prefix_rd2str(&bgp
->vpn_policy
[afi
].tovpn_rd
, buf
,
12075 if (CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
12076 BGP_VPN_POLICY_TOVPN_NEXTHOP_SET
)) {
12078 char buf
[PREFIX_STRLEN
];
12079 if (inet_ntop(bgp
->vpn_policy
[afi
].tovpn_nexthop
.family
,
12080 &bgp
->vpn_policy
[afi
].tovpn_nexthop
.u
.prefix
, buf
,
12083 vty_out(vty
, "%*snexthop vpn export %s\n",
12087 if (bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
]
12088 && bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
]
12090 bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
],
12091 bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
])) {
12093 char *b
= ecommunity_ecom2str(
12094 bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
],
12095 ECOMMUNITY_FORMAT_ROUTE_MAP
, ECOMMUNITY_ROUTE_TARGET
);
12096 vty_out(vty
, "%*srt vpn both %s\n", indent
, "", b
);
12097 XFREE(MTYPE_ECOMMUNITY_STR
, b
);
12099 if (bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
]) {
12100 char *b
= ecommunity_ecom2str(
12101 bgp
->vpn_policy
[afi
]
12102 .rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
],
12103 ECOMMUNITY_FORMAT_ROUTE_MAP
,
12104 ECOMMUNITY_ROUTE_TARGET
);
12105 vty_out(vty
, "%*srt vpn import %s\n", indent
, "", b
);
12106 XFREE(MTYPE_ECOMMUNITY_STR
, b
);
12108 if (bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
]) {
12109 char *b
= ecommunity_ecom2str(
12110 bgp
->vpn_policy
[afi
]
12111 .rtlist
[BGP_VPN_POLICY_DIR_TOVPN
],
12112 ECOMMUNITY_FORMAT_ROUTE_MAP
,
12113 ECOMMUNITY_ROUTE_TARGET
);
12114 vty_out(vty
, "%*srt vpn export %s\n", indent
, "", b
);
12115 XFREE(MTYPE_ECOMMUNITY_STR
, b
);
12119 if (bgp
->vpn_policy
[afi
].rmap_name
[BGP_VPN_POLICY_DIR_TOVPN
])
12120 vty_out(vty
, "%*sroute-map vpn export %s\n", indent
, "",
12121 bgp
->vpn_policy
[afi
]
12122 .rmap_name
[BGP_VPN_POLICY_DIR_TOVPN
]);
12124 if (bgp
->vpn_policy
[afi
].import_redirect_rtlist
) {
12125 char *b
= ecommunity_ecom2str(
12126 bgp
->vpn_policy
[afi
]
12127 .import_redirect_rtlist
,
12128 ECOMMUNITY_FORMAT_ROUTE_MAP
,
12129 ECOMMUNITY_ROUTE_TARGET
);
12131 vty_out(vty
, "%*srt redirect import %s\n", indent
, "", b
);
12132 XFREE(MTYPE_ECOMMUNITY_STR
, b
);
12137 /* BGP node structure. */
12138 static struct cmd_node bgp_node
= {
12139 BGP_NODE
, "%s(config-router)# ", 1,
12142 static struct cmd_node bgp_ipv4_unicast_node
= {
12143 BGP_IPV4_NODE
, "%s(config-router-af)# ", 1,
12146 static struct cmd_node bgp_ipv4_multicast_node
= {
12147 BGP_IPV4M_NODE
, "%s(config-router-af)# ", 1,
12150 static struct cmd_node bgp_ipv4_labeled_unicast_node
= {
12151 BGP_IPV4L_NODE
, "%s(config-router-af)# ", 1,
12154 static struct cmd_node bgp_ipv6_unicast_node
= {
12155 BGP_IPV6_NODE
, "%s(config-router-af)# ", 1,
12158 static struct cmd_node bgp_ipv6_multicast_node
= {
12159 BGP_IPV6M_NODE
, "%s(config-router-af)# ", 1,
12162 static struct cmd_node bgp_ipv6_labeled_unicast_node
= {
12163 BGP_IPV6L_NODE
, "%s(config-router-af)# ", 1,
12166 static struct cmd_node bgp_vpnv4_node
= {BGP_VPNV4_NODE
,
12167 "%s(config-router-af)# ", 1};
12169 static struct cmd_node bgp_vpnv6_node
= {BGP_VPNV6_NODE
,
12170 "%s(config-router-af-vpnv6)# ", 1};
12172 static struct cmd_node bgp_evpn_node
= {BGP_EVPN_NODE
,
12173 "%s(config-router-evpn)# ", 1};
12175 static struct cmd_node bgp_evpn_vni_node
= {BGP_EVPN_VNI_NODE
,
12176 "%s(config-router-af-vni)# ", 1};
12178 static struct cmd_node bgp_flowspecv4_node
= {BGP_FLOWSPECV4_NODE
,
12179 "%s(config-router-af)# ", 1};
12181 static struct cmd_node bgp_flowspecv6_node
= {BGP_FLOWSPECV6_NODE
,
12182 "%s(config-router-af-vpnv6)# ", 1};
12184 static void community_list_vty(void);
12186 static void bgp_ac_neighbor(vector comps
, struct cmd_token
*token
)
12190 struct listnode
*lnbgp
, *lnpeer
;
12192 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, lnbgp
, bgp
)) {
12193 for (ALL_LIST_ELEMENTS_RO(bgp
->peer
, lnpeer
, peer
)) {
12194 /* only provide suggestions on the appropriate input
12196 * they'll otherwise show up multiple times */
12197 enum cmd_token_type match_type
;
12198 char *name
= peer
->host
;
12200 if (peer
->conf_if
) {
12201 match_type
= VARIABLE_TKN
;
12202 name
= peer
->conf_if
;
12203 } else if (strchr(peer
->host
, ':'))
12204 match_type
= IPV6_TKN
;
12206 match_type
= IPV4_TKN
;
12208 if (token
->type
!= match_type
)
12211 vector_set(comps
, XSTRDUP(MTYPE_COMPLETION
, name
));
12216 static const struct cmd_variable_handler bgp_var_neighbor
[] = {
12217 {.varname
= "neighbor", .completions
= bgp_ac_neighbor
},
12218 {.varname
= "neighbors", .completions
= bgp_ac_neighbor
},
12219 {.varname
= "peer", .completions
= bgp_ac_neighbor
},
12220 {.completions
= NULL
}};
12222 static void bgp_ac_peergroup(vector comps
, struct cmd_token
*token
)
12225 struct peer_group
*group
;
12226 struct listnode
*lnbgp
, *lnpeer
;
12228 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, lnbgp
, bgp
)) {
12229 for (ALL_LIST_ELEMENTS_RO(bgp
->group
, lnpeer
, group
))
12230 vector_set(comps
, XSTRDUP(MTYPE_COMPLETION
,
12235 static const struct cmd_variable_handler bgp_var_peergroup
[] = {
12236 {.tokenname
= "PGNAME", .completions
= bgp_ac_peergroup
},
12237 {.completions
= NULL
} };
12239 void bgp_vty_init(void)
12241 cmd_variable_handler_register(bgp_var_neighbor
);
12242 cmd_variable_handler_register(bgp_var_peergroup
);
12244 /* Install bgp top node. */
12245 install_node(&bgp_node
, bgp_config_write
);
12246 install_node(&bgp_ipv4_unicast_node
, NULL
);
12247 install_node(&bgp_ipv4_multicast_node
, NULL
);
12248 install_node(&bgp_ipv4_labeled_unicast_node
, NULL
);
12249 install_node(&bgp_ipv6_unicast_node
, NULL
);
12250 install_node(&bgp_ipv6_multicast_node
, NULL
);
12251 install_node(&bgp_ipv6_labeled_unicast_node
, NULL
);
12252 install_node(&bgp_vpnv4_node
, NULL
);
12253 install_node(&bgp_vpnv6_node
, NULL
);
12254 install_node(&bgp_evpn_node
, NULL
);
12255 install_node(&bgp_evpn_vni_node
, NULL
);
12256 install_node(&bgp_flowspecv4_node
, NULL
);
12257 install_node(&bgp_flowspecv6_node
, NULL
);
12259 /* Install default VTY commands to new nodes. */
12260 install_default(BGP_NODE
);
12261 install_default(BGP_IPV4_NODE
);
12262 install_default(BGP_IPV4M_NODE
);
12263 install_default(BGP_IPV4L_NODE
);
12264 install_default(BGP_IPV6_NODE
);
12265 install_default(BGP_IPV6M_NODE
);
12266 install_default(BGP_IPV6L_NODE
);
12267 install_default(BGP_VPNV4_NODE
);
12268 install_default(BGP_VPNV6_NODE
);
12269 install_default(BGP_FLOWSPECV4_NODE
);
12270 install_default(BGP_FLOWSPECV6_NODE
);
12271 install_default(BGP_EVPN_NODE
);
12272 install_default(BGP_EVPN_VNI_NODE
);
12274 /* "bgp multiple-instance" commands. */
12275 install_element(CONFIG_NODE
, &bgp_multiple_instance_cmd
);
12276 install_element(CONFIG_NODE
, &no_bgp_multiple_instance_cmd
);
12278 /* "bgp config-type" commands. */
12279 install_element(CONFIG_NODE
, &bgp_config_type_cmd
);
12280 install_element(CONFIG_NODE
, &no_bgp_config_type_cmd
);
12282 /* bgp route-map delay-timer commands. */
12283 install_element(CONFIG_NODE
, &bgp_set_route_map_delay_timer_cmd
);
12284 install_element(CONFIG_NODE
, &no_bgp_set_route_map_delay_timer_cmd
);
12286 /* Dummy commands (Currently not supported) */
12287 install_element(BGP_NODE
, &no_synchronization_cmd
);
12288 install_element(BGP_NODE
, &no_auto_summary_cmd
);
12290 /* "router bgp" commands. */
12291 install_element(CONFIG_NODE
, &router_bgp_cmd
);
12293 /* "no router bgp" commands. */
12294 install_element(CONFIG_NODE
, &no_router_bgp_cmd
);
12296 /* "bgp router-id" commands. */
12297 install_element(BGP_NODE
, &bgp_router_id_cmd
);
12298 install_element(BGP_NODE
, &no_bgp_router_id_cmd
);
12300 /* "bgp cluster-id" commands. */
12301 install_element(BGP_NODE
, &bgp_cluster_id_cmd
);
12302 install_element(BGP_NODE
, &no_bgp_cluster_id_cmd
);
12304 /* "bgp confederation" commands. */
12305 install_element(BGP_NODE
, &bgp_confederation_identifier_cmd
);
12306 install_element(BGP_NODE
, &no_bgp_confederation_identifier_cmd
);
12308 /* "bgp confederation peers" commands. */
12309 install_element(BGP_NODE
, &bgp_confederation_peers_cmd
);
12310 install_element(BGP_NODE
, &no_bgp_confederation_peers_cmd
);
12312 /* bgp max-med command */
12313 install_element(BGP_NODE
, &bgp_maxmed_admin_cmd
);
12314 install_element(BGP_NODE
, &no_bgp_maxmed_admin_cmd
);
12315 install_element(BGP_NODE
, &bgp_maxmed_admin_medv_cmd
);
12316 install_element(BGP_NODE
, &bgp_maxmed_onstartup_cmd
);
12317 install_element(BGP_NODE
, &no_bgp_maxmed_onstartup_cmd
);
12319 /* bgp disable-ebgp-connected-nh-check */
12320 install_element(BGP_NODE
, &bgp_disable_connected_route_check_cmd
);
12321 install_element(BGP_NODE
, &no_bgp_disable_connected_route_check_cmd
);
12323 /* bgp update-delay command */
12324 install_element(BGP_NODE
, &bgp_update_delay_cmd
);
12325 install_element(BGP_NODE
, &no_bgp_update_delay_cmd
);
12326 install_element(BGP_NODE
, &bgp_update_delay_establish_wait_cmd
);
12328 install_element(BGP_NODE
, &bgp_wpkt_quanta_cmd
);
12329 install_element(BGP_NODE
, &no_bgp_wpkt_quanta_cmd
);
12330 install_element(BGP_NODE
, &bgp_rpkt_quanta_cmd
);
12331 install_element(BGP_NODE
, &no_bgp_rpkt_quanta_cmd
);
12333 install_element(BGP_NODE
, &bgp_coalesce_time_cmd
);
12334 install_element(BGP_NODE
, &no_bgp_coalesce_time_cmd
);
12336 /* "maximum-paths" commands. */
12337 install_element(BGP_NODE
, &bgp_maxpaths_hidden_cmd
);
12338 install_element(BGP_NODE
, &no_bgp_maxpaths_hidden_cmd
);
12339 install_element(BGP_IPV4_NODE
, &bgp_maxpaths_cmd
);
12340 install_element(BGP_IPV4_NODE
, &no_bgp_maxpaths_cmd
);
12341 install_element(BGP_IPV6_NODE
, &bgp_maxpaths_cmd
);
12342 install_element(BGP_IPV6_NODE
, &no_bgp_maxpaths_cmd
);
12343 install_element(BGP_NODE
, &bgp_maxpaths_ibgp_hidden_cmd
);
12344 install_element(BGP_NODE
, &bgp_maxpaths_ibgp_cluster_hidden_cmd
);
12345 install_element(BGP_NODE
, &no_bgp_maxpaths_ibgp_hidden_cmd
);
12346 install_element(BGP_IPV4_NODE
, &bgp_maxpaths_ibgp_cmd
);
12347 install_element(BGP_IPV4_NODE
, &bgp_maxpaths_ibgp_cluster_cmd
);
12348 install_element(BGP_IPV4_NODE
, &no_bgp_maxpaths_ibgp_cmd
);
12349 install_element(BGP_IPV6_NODE
, &bgp_maxpaths_ibgp_cmd
);
12350 install_element(BGP_IPV6_NODE
, &bgp_maxpaths_ibgp_cluster_cmd
);
12351 install_element(BGP_IPV6_NODE
, &no_bgp_maxpaths_ibgp_cmd
);
12353 install_element(BGP_IPV6L_NODE
, &bgp_maxpaths_cmd
);
12354 install_element(BGP_IPV6L_NODE
, &no_bgp_maxpaths_cmd
);
12355 install_element(BGP_IPV6L_NODE
, &bgp_maxpaths_ibgp_cmd
);
12356 install_element(BGP_IPV6L_NODE
, &bgp_maxpaths_ibgp_cluster_cmd
);
12357 install_element(BGP_IPV6L_NODE
, &no_bgp_maxpaths_ibgp_cmd
);
12359 /* "timers bgp" commands. */
12360 install_element(BGP_NODE
, &bgp_timers_cmd
);
12361 install_element(BGP_NODE
, &no_bgp_timers_cmd
);
12363 /* route-map delay-timer commands - per instance for backwards compat.
12365 install_element(BGP_NODE
, &bgp_set_route_map_delay_timer_cmd
);
12366 install_element(BGP_NODE
, &no_bgp_set_route_map_delay_timer_cmd
);
12368 /* "bgp client-to-client reflection" commands */
12369 install_element(BGP_NODE
, &no_bgp_client_to_client_reflection_cmd
);
12370 install_element(BGP_NODE
, &bgp_client_to_client_reflection_cmd
);
12372 /* "bgp always-compare-med" commands */
12373 install_element(BGP_NODE
, &bgp_always_compare_med_cmd
);
12374 install_element(BGP_NODE
, &no_bgp_always_compare_med_cmd
);
12376 /* "bgp deterministic-med" commands */
12377 install_element(BGP_NODE
, &bgp_deterministic_med_cmd
);
12378 install_element(BGP_NODE
, &no_bgp_deterministic_med_cmd
);
12380 /* "bgp graceful-restart" commands */
12381 install_element(BGP_NODE
, &bgp_graceful_restart_cmd
);
12382 install_element(BGP_NODE
, &no_bgp_graceful_restart_cmd
);
12383 install_element(BGP_NODE
, &bgp_graceful_restart_stalepath_time_cmd
);
12384 install_element(BGP_NODE
, &no_bgp_graceful_restart_stalepath_time_cmd
);
12385 install_element(BGP_NODE
, &bgp_graceful_restart_restart_time_cmd
);
12386 install_element(BGP_NODE
, &no_bgp_graceful_restart_restart_time_cmd
);
12388 install_element(BGP_NODE
, &bgp_graceful_restart_preserve_fw_cmd
);
12389 install_element(BGP_NODE
, &no_bgp_graceful_restart_preserve_fw_cmd
);
12391 /* "bgp graceful-shutdown" commands */
12392 install_element(BGP_NODE
, &bgp_graceful_shutdown_cmd
);
12393 install_element(BGP_NODE
, &no_bgp_graceful_shutdown_cmd
);
12395 /* "bgp fast-external-failover" commands */
12396 install_element(BGP_NODE
, &bgp_fast_external_failover_cmd
);
12397 install_element(BGP_NODE
, &no_bgp_fast_external_failover_cmd
);
12399 /* "bgp enforce-first-as" commands */
12400 install_element(BGP_NODE
, &bgp_enforce_first_as_cmd
);
12401 install_element(BGP_NODE
, &no_bgp_enforce_first_as_cmd
);
12403 /* "bgp bestpath compare-routerid" commands */
12404 install_element(BGP_NODE
, &bgp_bestpath_compare_router_id_cmd
);
12405 install_element(BGP_NODE
, &no_bgp_bestpath_compare_router_id_cmd
);
12407 /* "bgp bestpath as-path ignore" commands */
12408 install_element(BGP_NODE
, &bgp_bestpath_aspath_ignore_cmd
);
12409 install_element(BGP_NODE
, &no_bgp_bestpath_aspath_ignore_cmd
);
12411 /* "bgp bestpath as-path confed" commands */
12412 install_element(BGP_NODE
, &bgp_bestpath_aspath_confed_cmd
);
12413 install_element(BGP_NODE
, &no_bgp_bestpath_aspath_confed_cmd
);
12415 /* "bgp bestpath as-path multipath-relax" commands */
12416 install_element(BGP_NODE
, &bgp_bestpath_aspath_multipath_relax_cmd
);
12417 install_element(BGP_NODE
, &no_bgp_bestpath_aspath_multipath_relax_cmd
);
12419 /* "bgp log-neighbor-changes" commands */
12420 install_element(BGP_NODE
, &bgp_log_neighbor_changes_cmd
);
12421 install_element(BGP_NODE
, &no_bgp_log_neighbor_changes_cmd
);
12423 /* "bgp bestpath med" commands */
12424 install_element(BGP_NODE
, &bgp_bestpath_med_cmd
);
12425 install_element(BGP_NODE
, &no_bgp_bestpath_med_cmd
);
12427 /* "no bgp default ipv4-unicast" commands. */
12428 install_element(BGP_NODE
, &no_bgp_default_ipv4_unicast_cmd
);
12429 install_element(BGP_NODE
, &bgp_default_ipv4_unicast_cmd
);
12431 /* "bgp network import-check" commands. */
12432 install_element(BGP_NODE
, &bgp_network_import_check_cmd
);
12433 install_element(BGP_NODE
, &bgp_network_import_check_exact_cmd
);
12434 install_element(BGP_NODE
, &no_bgp_network_import_check_cmd
);
12436 /* "bgp default local-preference" commands. */
12437 install_element(BGP_NODE
, &bgp_default_local_preference_cmd
);
12438 install_element(BGP_NODE
, &no_bgp_default_local_preference_cmd
);
12440 /* bgp default show-hostname */
12441 install_element(BGP_NODE
, &bgp_default_show_hostname_cmd
);
12442 install_element(BGP_NODE
, &no_bgp_default_show_hostname_cmd
);
12444 /* "bgp default subgroup-pkt-queue-max" commands. */
12445 install_element(BGP_NODE
, &bgp_default_subgroup_pkt_queue_max_cmd
);
12446 install_element(BGP_NODE
, &no_bgp_default_subgroup_pkt_queue_max_cmd
);
12448 /* bgp ibgp-allow-policy-mods command */
12449 install_element(BGP_NODE
, &bgp_rr_allow_outbound_policy_cmd
);
12450 install_element(BGP_NODE
, &no_bgp_rr_allow_outbound_policy_cmd
);
12452 /* "bgp listen limit" commands. */
12453 install_element(BGP_NODE
, &bgp_listen_limit_cmd
);
12454 install_element(BGP_NODE
, &no_bgp_listen_limit_cmd
);
12456 /* "bgp listen range" commands. */
12457 install_element(BGP_NODE
, &bgp_listen_range_cmd
);
12458 install_element(BGP_NODE
, &no_bgp_listen_range_cmd
);
12460 /* "bgp default shutdown" command */
12461 install_element(BGP_NODE
, &bgp_default_shutdown_cmd
);
12463 /* "neighbor remote-as" commands. */
12464 install_element(BGP_NODE
, &neighbor_remote_as_cmd
);
12465 install_element(BGP_NODE
, &neighbor_interface_config_cmd
);
12466 install_element(BGP_NODE
, &neighbor_interface_config_v6only_cmd
);
12467 install_element(BGP_NODE
, &neighbor_interface_config_remote_as_cmd
);
12468 install_element(BGP_NODE
,
12469 &neighbor_interface_v6only_config_remote_as_cmd
);
12470 install_element(BGP_NODE
, &no_neighbor_cmd
);
12471 install_element(BGP_NODE
, &no_neighbor_interface_config_cmd
);
12473 /* "neighbor peer-group" commands. */
12474 install_element(BGP_NODE
, &neighbor_peer_group_cmd
);
12475 install_element(BGP_NODE
, &no_neighbor_peer_group_cmd
);
12476 install_element(BGP_NODE
,
12477 &no_neighbor_interface_peer_group_remote_as_cmd
);
12479 /* "neighbor local-as" commands. */
12480 install_element(BGP_NODE
, &neighbor_local_as_cmd
);
12481 install_element(BGP_NODE
, &neighbor_local_as_no_prepend_cmd
);
12482 install_element(BGP_NODE
, &neighbor_local_as_no_prepend_replace_as_cmd
);
12483 install_element(BGP_NODE
, &no_neighbor_local_as_cmd
);
12485 /* "neighbor solo" commands. */
12486 install_element(BGP_NODE
, &neighbor_solo_cmd
);
12487 install_element(BGP_NODE
, &no_neighbor_solo_cmd
);
12489 /* "neighbor password" commands. */
12490 install_element(BGP_NODE
, &neighbor_password_cmd
);
12491 install_element(BGP_NODE
, &no_neighbor_password_cmd
);
12493 /* "neighbor activate" commands. */
12494 install_element(BGP_NODE
, &neighbor_activate_hidden_cmd
);
12495 install_element(BGP_IPV4_NODE
, &neighbor_activate_cmd
);
12496 install_element(BGP_IPV4M_NODE
, &neighbor_activate_cmd
);
12497 install_element(BGP_IPV4L_NODE
, &neighbor_activate_cmd
);
12498 install_element(BGP_IPV6_NODE
, &neighbor_activate_cmd
);
12499 install_element(BGP_IPV6M_NODE
, &neighbor_activate_cmd
);
12500 install_element(BGP_IPV6L_NODE
, &neighbor_activate_cmd
);
12501 install_element(BGP_VPNV4_NODE
, &neighbor_activate_cmd
);
12502 install_element(BGP_VPNV6_NODE
, &neighbor_activate_cmd
);
12503 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_activate_cmd
);
12504 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_activate_cmd
);
12505 install_element(BGP_EVPN_NODE
, &neighbor_activate_cmd
);
12507 /* "no neighbor activate" commands. */
12508 install_element(BGP_NODE
, &no_neighbor_activate_hidden_cmd
);
12509 install_element(BGP_IPV4_NODE
, &no_neighbor_activate_cmd
);
12510 install_element(BGP_IPV4M_NODE
, &no_neighbor_activate_cmd
);
12511 install_element(BGP_IPV4L_NODE
, &no_neighbor_activate_cmd
);
12512 install_element(BGP_IPV6_NODE
, &no_neighbor_activate_cmd
);
12513 install_element(BGP_IPV6M_NODE
, &no_neighbor_activate_cmd
);
12514 install_element(BGP_IPV6L_NODE
, &no_neighbor_activate_cmd
);
12515 install_element(BGP_VPNV4_NODE
, &no_neighbor_activate_cmd
);
12516 install_element(BGP_VPNV6_NODE
, &no_neighbor_activate_cmd
);
12517 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_activate_cmd
);
12518 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_activate_cmd
);
12519 install_element(BGP_EVPN_NODE
, &no_neighbor_activate_cmd
);
12521 /* "neighbor peer-group" set commands. */
12522 install_element(BGP_NODE
, &neighbor_set_peer_group_cmd
);
12523 install_element(BGP_IPV4_NODE
, &neighbor_set_peer_group_hidden_cmd
);
12524 install_element(BGP_IPV4M_NODE
, &neighbor_set_peer_group_hidden_cmd
);
12525 install_element(BGP_IPV6_NODE
, &neighbor_set_peer_group_hidden_cmd
);
12526 install_element(BGP_IPV6M_NODE
, &neighbor_set_peer_group_hidden_cmd
);
12527 install_element(BGP_IPV6L_NODE
, &neighbor_set_peer_group_hidden_cmd
);
12528 install_element(BGP_VPNV4_NODE
, &neighbor_set_peer_group_hidden_cmd
);
12529 install_element(BGP_VPNV6_NODE
, &neighbor_set_peer_group_hidden_cmd
);
12530 install_element(BGP_FLOWSPECV4_NODE
,
12531 &neighbor_set_peer_group_hidden_cmd
);
12532 install_element(BGP_FLOWSPECV6_NODE
,
12533 &neighbor_set_peer_group_hidden_cmd
);
12535 /* "no neighbor peer-group unset" commands. */
12536 install_element(BGP_NODE
, &no_neighbor_set_peer_group_cmd
);
12537 install_element(BGP_IPV4_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
12538 install_element(BGP_IPV4M_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
12539 install_element(BGP_IPV6_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
12540 install_element(BGP_IPV6M_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
12541 install_element(BGP_IPV6L_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
12542 install_element(BGP_VPNV4_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
12543 install_element(BGP_VPNV6_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
12544 install_element(BGP_FLOWSPECV4_NODE
,
12545 &no_neighbor_set_peer_group_hidden_cmd
);
12546 install_element(BGP_FLOWSPECV6_NODE
,
12547 &no_neighbor_set_peer_group_hidden_cmd
);
12549 /* "neighbor softreconfiguration inbound" commands.*/
12550 install_element(BGP_NODE
, &neighbor_soft_reconfiguration_hidden_cmd
);
12551 install_element(BGP_NODE
, &no_neighbor_soft_reconfiguration_hidden_cmd
);
12552 install_element(BGP_IPV4_NODE
, &neighbor_soft_reconfiguration_cmd
);
12553 install_element(BGP_IPV4_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
12554 install_element(BGP_IPV4L_NODE
, &neighbor_soft_reconfiguration_cmd
);
12555 install_element(BGP_IPV4L_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
12556 install_element(BGP_IPV4M_NODE
, &neighbor_soft_reconfiguration_cmd
);
12557 install_element(BGP_IPV4M_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
12558 install_element(BGP_IPV6_NODE
, &neighbor_soft_reconfiguration_cmd
);
12559 install_element(BGP_IPV6_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
12560 install_element(BGP_IPV6M_NODE
, &neighbor_soft_reconfiguration_cmd
);
12561 install_element(BGP_IPV6M_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
12562 install_element(BGP_IPV6L_NODE
, &neighbor_soft_reconfiguration_cmd
);
12563 install_element(BGP_IPV6L_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
12564 install_element(BGP_VPNV4_NODE
, &neighbor_soft_reconfiguration_cmd
);
12565 install_element(BGP_VPNV4_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
12566 install_element(BGP_VPNV6_NODE
, &neighbor_soft_reconfiguration_cmd
);
12567 install_element(BGP_VPNV6_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
12568 install_element(BGP_FLOWSPECV4_NODE
,
12569 &neighbor_soft_reconfiguration_cmd
);
12570 install_element(BGP_FLOWSPECV4_NODE
,
12571 &no_neighbor_soft_reconfiguration_cmd
);
12572 install_element(BGP_FLOWSPECV6_NODE
,
12573 &neighbor_soft_reconfiguration_cmd
);
12574 install_element(BGP_FLOWSPECV6_NODE
,
12575 &no_neighbor_soft_reconfiguration_cmd
);
12577 /* "neighbor attribute-unchanged" commands. */
12578 install_element(BGP_NODE
, &neighbor_attr_unchanged_hidden_cmd
);
12579 install_element(BGP_NODE
, &no_neighbor_attr_unchanged_hidden_cmd
);
12580 install_element(BGP_IPV4_NODE
, &neighbor_attr_unchanged_cmd
);
12581 install_element(BGP_IPV4_NODE
, &no_neighbor_attr_unchanged_cmd
);
12582 install_element(BGP_IPV4M_NODE
, &neighbor_attr_unchanged_cmd
);
12583 install_element(BGP_IPV4M_NODE
, &no_neighbor_attr_unchanged_cmd
);
12584 install_element(BGP_IPV4L_NODE
, &neighbor_attr_unchanged_cmd
);
12585 install_element(BGP_IPV4L_NODE
, &no_neighbor_attr_unchanged_cmd
);
12586 install_element(BGP_IPV6_NODE
, &neighbor_attr_unchanged_cmd
);
12587 install_element(BGP_IPV6_NODE
, &no_neighbor_attr_unchanged_cmd
);
12588 install_element(BGP_IPV6M_NODE
, &neighbor_attr_unchanged_cmd
);
12589 install_element(BGP_IPV6M_NODE
, &no_neighbor_attr_unchanged_cmd
);
12590 install_element(BGP_IPV6L_NODE
, &neighbor_attr_unchanged_cmd
);
12591 install_element(BGP_IPV6L_NODE
, &no_neighbor_attr_unchanged_cmd
);
12592 install_element(BGP_VPNV4_NODE
, &neighbor_attr_unchanged_cmd
);
12593 install_element(BGP_VPNV4_NODE
, &no_neighbor_attr_unchanged_cmd
);
12594 install_element(BGP_VPNV6_NODE
, &neighbor_attr_unchanged_cmd
);
12595 install_element(BGP_VPNV6_NODE
, &no_neighbor_attr_unchanged_cmd
);
12597 install_element(BGP_EVPN_NODE
, &neighbor_attr_unchanged_cmd
);
12598 install_element(BGP_EVPN_NODE
, &no_neighbor_attr_unchanged_cmd
);
12600 /* "nexthop-local unchanged" commands */
12601 install_element(BGP_IPV6_NODE
, &neighbor_nexthop_local_unchanged_cmd
);
12602 install_element(BGP_IPV6_NODE
,
12603 &no_neighbor_nexthop_local_unchanged_cmd
);
12605 /* "neighbor next-hop-self" commands. */
12606 install_element(BGP_NODE
, &neighbor_nexthop_self_hidden_cmd
);
12607 install_element(BGP_NODE
, &no_neighbor_nexthop_self_hidden_cmd
);
12608 install_element(BGP_IPV4_NODE
, &neighbor_nexthop_self_cmd
);
12609 install_element(BGP_IPV4_NODE
, &no_neighbor_nexthop_self_cmd
);
12610 install_element(BGP_IPV4M_NODE
, &neighbor_nexthop_self_cmd
);
12611 install_element(BGP_IPV4M_NODE
, &no_neighbor_nexthop_self_cmd
);
12612 install_element(BGP_IPV4L_NODE
, &neighbor_nexthop_self_cmd
);
12613 install_element(BGP_IPV4L_NODE
, &no_neighbor_nexthop_self_cmd
);
12614 install_element(BGP_IPV6_NODE
, &neighbor_nexthop_self_cmd
);
12615 install_element(BGP_IPV6_NODE
, &no_neighbor_nexthop_self_cmd
);
12616 install_element(BGP_IPV6M_NODE
, &neighbor_nexthop_self_cmd
);
12617 install_element(BGP_IPV6M_NODE
, &no_neighbor_nexthop_self_cmd
);
12618 install_element(BGP_IPV6L_NODE
, &neighbor_nexthop_self_cmd
);
12619 install_element(BGP_IPV6L_NODE
, &no_neighbor_nexthop_self_cmd
);
12620 install_element(BGP_VPNV4_NODE
, &neighbor_nexthop_self_cmd
);
12621 install_element(BGP_VPNV4_NODE
, &no_neighbor_nexthop_self_cmd
);
12622 install_element(BGP_VPNV6_NODE
, &neighbor_nexthop_self_cmd
);
12623 install_element(BGP_VPNV6_NODE
, &no_neighbor_nexthop_self_cmd
);
12624 install_element(BGP_EVPN_NODE
, &neighbor_nexthop_self_cmd
);
12625 install_element(BGP_EVPN_NODE
, &no_neighbor_nexthop_self_cmd
);
12627 /* "neighbor next-hop-self force" commands. */
12628 install_element(BGP_NODE
, &neighbor_nexthop_self_force_hidden_cmd
);
12629 install_element(BGP_NODE
, &no_neighbor_nexthop_self_force_hidden_cmd
);
12630 install_element(BGP_IPV4_NODE
, &neighbor_nexthop_self_force_cmd
);
12631 install_element(BGP_IPV4_NODE
, &no_neighbor_nexthop_self_force_cmd
);
12632 install_element(BGP_IPV4M_NODE
, &neighbor_nexthop_self_force_cmd
);
12633 install_element(BGP_IPV4M_NODE
, &no_neighbor_nexthop_self_force_cmd
);
12634 install_element(BGP_IPV4L_NODE
, &neighbor_nexthop_self_force_cmd
);
12635 install_element(BGP_IPV4L_NODE
, &no_neighbor_nexthop_self_force_cmd
);
12636 install_element(BGP_IPV6_NODE
, &neighbor_nexthop_self_force_cmd
);
12637 install_element(BGP_IPV6_NODE
, &no_neighbor_nexthop_self_force_cmd
);
12638 install_element(BGP_IPV6M_NODE
, &neighbor_nexthop_self_force_cmd
);
12639 install_element(BGP_IPV6M_NODE
, &no_neighbor_nexthop_self_force_cmd
);
12640 install_element(BGP_IPV6L_NODE
, &neighbor_nexthop_self_force_cmd
);
12641 install_element(BGP_IPV6L_NODE
, &no_neighbor_nexthop_self_force_cmd
);
12642 install_element(BGP_VPNV4_NODE
, &neighbor_nexthop_self_force_cmd
);
12643 install_element(BGP_VPNV4_NODE
, &no_neighbor_nexthop_self_force_cmd
);
12644 install_element(BGP_VPNV6_NODE
, &neighbor_nexthop_self_force_cmd
);
12645 install_element(BGP_VPNV6_NODE
, &no_neighbor_nexthop_self_force_cmd
);
12647 /* "neighbor as-override" commands. */
12648 install_element(BGP_NODE
, &neighbor_as_override_hidden_cmd
);
12649 install_element(BGP_NODE
, &no_neighbor_as_override_hidden_cmd
);
12650 install_element(BGP_IPV4_NODE
, &neighbor_as_override_cmd
);
12651 install_element(BGP_IPV4_NODE
, &no_neighbor_as_override_cmd
);
12652 install_element(BGP_IPV4M_NODE
, &neighbor_as_override_cmd
);
12653 install_element(BGP_IPV4M_NODE
, &no_neighbor_as_override_cmd
);
12654 install_element(BGP_IPV4L_NODE
, &neighbor_as_override_cmd
);
12655 install_element(BGP_IPV4L_NODE
, &no_neighbor_as_override_cmd
);
12656 install_element(BGP_IPV6_NODE
, &neighbor_as_override_cmd
);
12657 install_element(BGP_IPV6_NODE
, &no_neighbor_as_override_cmd
);
12658 install_element(BGP_IPV6M_NODE
, &neighbor_as_override_cmd
);
12659 install_element(BGP_IPV6M_NODE
, &no_neighbor_as_override_cmd
);
12660 install_element(BGP_IPV6L_NODE
, &neighbor_as_override_cmd
);
12661 install_element(BGP_IPV6L_NODE
, &no_neighbor_as_override_cmd
);
12662 install_element(BGP_VPNV4_NODE
, &neighbor_as_override_cmd
);
12663 install_element(BGP_VPNV4_NODE
, &no_neighbor_as_override_cmd
);
12664 install_element(BGP_VPNV6_NODE
, &neighbor_as_override_cmd
);
12665 install_element(BGP_VPNV6_NODE
, &no_neighbor_as_override_cmd
);
12667 /* "neighbor remove-private-AS" commands. */
12668 install_element(BGP_NODE
, &neighbor_remove_private_as_hidden_cmd
);
12669 install_element(BGP_NODE
, &no_neighbor_remove_private_as_hidden_cmd
);
12670 install_element(BGP_NODE
, &neighbor_remove_private_as_all_hidden_cmd
);
12671 install_element(BGP_NODE
,
12672 &no_neighbor_remove_private_as_all_hidden_cmd
);
12673 install_element(BGP_NODE
,
12674 &neighbor_remove_private_as_replace_as_hidden_cmd
);
12675 install_element(BGP_NODE
,
12676 &no_neighbor_remove_private_as_replace_as_hidden_cmd
);
12677 install_element(BGP_NODE
,
12678 &neighbor_remove_private_as_all_replace_as_hidden_cmd
);
12681 &no_neighbor_remove_private_as_all_replace_as_hidden_cmd
);
12682 install_element(BGP_IPV4_NODE
, &neighbor_remove_private_as_cmd
);
12683 install_element(BGP_IPV4_NODE
, &no_neighbor_remove_private_as_cmd
);
12684 install_element(BGP_IPV4_NODE
, &neighbor_remove_private_as_all_cmd
);
12685 install_element(BGP_IPV4_NODE
, &no_neighbor_remove_private_as_all_cmd
);
12686 install_element(BGP_IPV4_NODE
,
12687 &neighbor_remove_private_as_replace_as_cmd
);
12688 install_element(BGP_IPV4_NODE
,
12689 &no_neighbor_remove_private_as_replace_as_cmd
);
12690 install_element(BGP_IPV4_NODE
,
12691 &neighbor_remove_private_as_all_replace_as_cmd
);
12692 install_element(BGP_IPV4_NODE
,
12693 &no_neighbor_remove_private_as_all_replace_as_cmd
);
12694 install_element(BGP_IPV4M_NODE
, &neighbor_remove_private_as_cmd
);
12695 install_element(BGP_IPV4M_NODE
, &no_neighbor_remove_private_as_cmd
);
12696 install_element(BGP_IPV4M_NODE
, &neighbor_remove_private_as_all_cmd
);
12697 install_element(BGP_IPV4M_NODE
, &no_neighbor_remove_private_as_all_cmd
);
12698 install_element(BGP_IPV4M_NODE
,
12699 &neighbor_remove_private_as_replace_as_cmd
);
12700 install_element(BGP_IPV4M_NODE
,
12701 &no_neighbor_remove_private_as_replace_as_cmd
);
12702 install_element(BGP_IPV4M_NODE
,
12703 &neighbor_remove_private_as_all_replace_as_cmd
);
12704 install_element(BGP_IPV4M_NODE
,
12705 &no_neighbor_remove_private_as_all_replace_as_cmd
);
12706 install_element(BGP_IPV4L_NODE
, &neighbor_remove_private_as_cmd
);
12707 install_element(BGP_IPV4L_NODE
, &no_neighbor_remove_private_as_cmd
);
12708 install_element(BGP_IPV4L_NODE
, &neighbor_remove_private_as_all_cmd
);
12709 install_element(BGP_IPV4L_NODE
, &no_neighbor_remove_private_as_all_cmd
);
12710 install_element(BGP_IPV4L_NODE
,
12711 &neighbor_remove_private_as_replace_as_cmd
);
12712 install_element(BGP_IPV4L_NODE
,
12713 &no_neighbor_remove_private_as_replace_as_cmd
);
12714 install_element(BGP_IPV4L_NODE
,
12715 &neighbor_remove_private_as_all_replace_as_cmd
);
12716 install_element(BGP_IPV4L_NODE
,
12717 &no_neighbor_remove_private_as_all_replace_as_cmd
);
12718 install_element(BGP_IPV6_NODE
, &neighbor_remove_private_as_cmd
);
12719 install_element(BGP_IPV6_NODE
, &no_neighbor_remove_private_as_cmd
);
12720 install_element(BGP_IPV6_NODE
, &neighbor_remove_private_as_all_cmd
);
12721 install_element(BGP_IPV6_NODE
, &no_neighbor_remove_private_as_all_cmd
);
12722 install_element(BGP_IPV6_NODE
,
12723 &neighbor_remove_private_as_replace_as_cmd
);
12724 install_element(BGP_IPV6_NODE
,
12725 &no_neighbor_remove_private_as_replace_as_cmd
);
12726 install_element(BGP_IPV6_NODE
,
12727 &neighbor_remove_private_as_all_replace_as_cmd
);
12728 install_element(BGP_IPV6_NODE
,
12729 &no_neighbor_remove_private_as_all_replace_as_cmd
);
12730 install_element(BGP_IPV6M_NODE
, &neighbor_remove_private_as_cmd
);
12731 install_element(BGP_IPV6M_NODE
, &no_neighbor_remove_private_as_cmd
);
12732 install_element(BGP_IPV6M_NODE
, &neighbor_remove_private_as_all_cmd
);
12733 install_element(BGP_IPV6M_NODE
, &no_neighbor_remove_private_as_all_cmd
);
12734 install_element(BGP_IPV6M_NODE
,
12735 &neighbor_remove_private_as_replace_as_cmd
);
12736 install_element(BGP_IPV6M_NODE
,
12737 &no_neighbor_remove_private_as_replace_as_cmd
);
12738 install_element(BGP_IPV6M_NODE
,
12739 &neighbor_remove_private_as_all_replace_as_cmd
);
12740 install_element(BGP_IPV6M_NODE
,
12741 &no_neighbor_remove_private_as_all_replace_as_cmd
);
12742 install_element(BGP_IPV6L_NODE
, &neighbor_remove_private_as_cmd
);
12743 install_element(BGP_IPV6L_NODE
, &no_neighbor_remove_private_as_cmd
);
12744 install_element(BGP_IPV6L_NODE
, &neighbor_remove_private_as_all_cmd
);
12745 install_element(BGP_IPV6L_NODE
, &no_neighbor_remove_private_as_all_cmd
);
12746 install_element(BGP_IPV6L_NODE
,
12747 &neighbor_remove_private_as_replace_as_cmd
);
12748 install_element(BGP_IPV6L_NODE
,
12749 &no_neighbor_remove_private_as_replace_as_cmd
);
12750 install_element(BGP_IPV6L_NODE
,
12751 &neighbor_remove_private_as_all_replace_as_cmd
);
12752 install_element(BGP_IPV6L_NODE
,
12753 &no_neighbor_remove_private_as_all_replace_as_cmd
);
12754 install_element(BGP_VPNV4_NODE
, &neighbor_remove_private_as_cmd
);
12755 install_element(BGP_VPNV4_NODE
, &no_neighbor_remove_private_as_cmd
);
12756 install_element(BGP_VPNV4_NODE
, &neighbor_remove_private_as_all_cmd
);
12757 install_element(BGP_VPNV4_NODE
, &no_neighbor_remove_private_as_all_cmd
);
12758 install_element(BGP_VPNV4_NODE
,
12759 &neighbor_remove_private_as_replace_as_cmd
);
12760 install_element(BGP_VPNV4_NODE
,
12761 &no_neighbor_remove_private_as_replace_as_cmd
);
12762 install_element(BGP_VPNV4_NODE
,
12763 &neighbor_remove_private_as_all_replace_as_cmd
);
12764 install_element(BGP_VPNV4_NODE
,
12765 &no_neighbor_remove_private_as_all_replace_as_cmd
);
12766 install_element(BGP_VPNV6_NODE
, &neighbor_remove_private_as_cmd
);
12767 install_element(BGP_VPNV6_NODE
, &no_neighbor_remove_private_as_cmd
);
12768 install_element(BGP_VPNV6_NODE
, &neighbor_remove_private_as_all_cmd
);
12769 install_element(BGP_VPNV6_NODE
, &no_neighbor_remove_private_as_all_cmd
);
12770 install_element(BGP_VPNV6_NODE
,
12771 &neighbor_remove_private_as_replace_as_cmd
);
12772 install_element(BGP_VPNV6_NODE
,
12773 &no_neighbor_remove_private_as_replace_as_cmd
);
12774 install_element(BGP_VPNV6_NODE
,
12775 &neighbor_remove_private_as_all_replace_as_cmd
);
12776 install_element(BGP_VPNV6_NODE
,
12777 &no_neighbor_remove_private_as_all_replace_as_cmd
);
12779 /* "neighbor send-community" commands.*/
12780 install_element(BGP_NODE
, &neighbor_send_community_hidden_cmd
);
12781 install_element(BGP_NODE
, &neighbor_send_community_type_hidden_cmd
);
12782 install_element(BGP_NODE
, &no_neighbor_send_community_hidden_cmd
);
12783 install_element(BGP_NODE
, &no_neighbor_send_community_type_hidden_cmd
);
12784 install_element(BGP_IPV4_NODE
, &neighbor_send_community_cmd
);
12785 install_element(BGP_IPV4_NODE
, &neighbor_send_community_type_cmd
);
12786 install_element(BGP_IPV4_NODE
, &no_neighbor_send_community_cmd
);
12787 install_element(BGP_IPV4_NODE
, &no_neighbor_send_community_type_cmd
);
12788 install_element(BGP_IPV4M_NODE
, &neighbor_send_community_cmd
);
12789 install_element(BGP_IPV4M_NODE
, &neighbor_send_community_type_cmd
);
12790 install_element(BGP_IPV4M_NODE
, &no_neighbor_send_community_cmd
);
12791 install_element(BGP_IPV4M_NODE
, &no_neighbor_send_community_type_cmd
);
12792 install_element(BGP_IPV4L_NODE
, &neighbor_send_community_cmd
);
12793 install_element(BGP_IPV4L_NODE
, &neighbor_send_community_type_cmd
);
12794 install_element(BGP_IPV4L_NODE
, &no_neighbor_send_community_cmd
);
12795 install_element(BGP_IPV4L_NODE
, &no_neighbor_send_community_type_cmd
);
12796 install_element(BGP_IPV6_NODE
, &neighbor_send_community_cmd
);
12797 install_element(BGP_IPV6_NODE
, &neighbor_send_community_type_cmd
);
12798 install_element(BGP_IPV6_NODE
, &no_neighbor_send_community_cmd
);
12799 install_element(BGP_IPV6_NODE
, &no_neighbor_send_community_type_cmd
);
12800 install_element(BGP_IPV6M_NODE
, &neighbor_send_community_cmd
);
12801 install_element(BGP_IPV6M_NODE
, &neighbor_send_community_type_cmd
);
12802 install_element(BGP_IPV6M_NODE
, &no_neighbor_send_community_cmd
);
12803 install_element(BGP_IPV6M_NODE
, &no_neighbor_send_community_type_cmd
);
12804 install_element(BGP_IPV6L_NODE
, &neighbor_send_community_cmd
);
12805 install_element(BGP_IPV6L_NODE
, &neighbor_send_community_type_cmd
);
12806 install_element(BGP_IPV6L_NODE
, &no_neighbor_send_community_cmd
);
12807 install_element(BGP_IPV6L_NODE
, &no_neighbor_send_community_type_cmd
);
12808 install_element(BGP_VPNV4_NODE
, &neighbor_send_community_cmd
);
12809 install_element(BGP_VPNV4_NODE
, &neighbor_send_community_type_cmd
);
12810 install_element(BGP_VPNV4_NODE
, &no_neighbor_send_community_cmd
);
12811 install_element(BGP_VPNV4_NODE
, &no_neighbor_send_community_type_cmd
);
12812 install_element(BGP_VPNV6_NODE
, &neighbor_send_community_cmd
);
12813 install_element(BGP_VPNV6_NODE
, &neighbor_send_community_type_cmd
);
12814 install_element(BGP_VPNV6_NODE
, &no_neighbor_send_community_cmd
);
12815 install_element(BGP_VPNV6_NODE
, &no_neighbor_send_community_type_cmd
);
12817 /* "neighbor route-reflector" commands.*/
12818 install_element(BGP_NODE
, &neighbor_route_reflector_client_hidden_cmd
);
12819 install_element(BGP_NODE
,
12820 &no_neighbor_route_reflector_client_hidden_cmd
);
12821 install_element(BGP_IPV4_NODE
, &neighbor_route_reflector_client_cmd
);
12822 install_element(BGP_IPV4_NODE
, &no_neighbor_route_reflector_client_cmd
);
12823 install_element(BGP_IPV4M_NODE
, &neighbor_route_reflector_client_cmd
);
12824 install_element(BGP_IPV4M_NODE
,
12825 &no_neighbor_route_reflector_client_cmd
);
12826 install_element(BGP_IPV4L_NODE
, &neighbor_route_reflector_client_cmd
);
12827 install_element(BGP_IPV4L_NODE
,
12828 &no_neighbor_route_reflector_client_cmd
);
12829 install_element(BGP_IPV6_NODE
, &neighbor_route_reflector_client_cmd
);
12830 install_element(BGP_IPV6_NODE
, &no_neighbor_route_reflector_client_cmd
);
12831 install_element(BGP_IPV6M_NODE
, &neighbor_route_reflector_client_cmd
);
12832 install_element(BGP_IPV6M_NODE
,
12833 &no_neighbor_route_reflector_client_cmd
);
12834 install_element(BGP_IPV6L_NODE
, &neighbor_route_reflector_client_cmd
);
12835 install_element(BGP_IPV6L_NODE
,
12836 &no_neighbor_route_reflector_client_cmd
);
12837 install_element(BGP_VPNV4_NODE
, &neighbor_route_reflector_client_cmd
);
12838 install_element(BGP_VPNV4_NODE
,
12839 &no_neighbor_route_reflector_client_cmd
);
12840 install_element(BGP_VPNV6_NODE
, &neighbor_route_reflector_client_cmd
);
12841 install_element(BGP_VPNV6_NODE
,
12842 &no_neighbor_route_reflector_client_cmd
);
12843 install_element(BGP_FLOWSPECV4_NODE
,
12844 &neighbor_route_reflector_client_cmd
);
12845 install_element(BGP_FLOWSPECV4_NODE
,
12846 &no_neighbor_route_reflector_client_cmd
);
12847 install_element(BGP_FLOWSPECV6_NODE
,
12848 &neighbor_route_reflector_client_cmd
);
12849 install_element(BGP_FLOWSPECV6_NODE
,
12850 &no_neighbor_route_reflector_client_cmd
);
12851 install_element(BGP_EVPN_NODE
, &neighbor_route_reflector_client_cmd
);
12852 install_element(BGP_EVPN_NODE
, &no_neighbor_route_reflector_client_cmd
);
12854 /* "neighbor route-server" commands.*/
12855 install_element(BGP_NODE
, &neighbor_route_server_client_hidden_cmd
);
12856 install_element(BGP_NODE
, &no_neighbor_route_server_client_hidden_cmd
);
12857 install_element(BGP_IPV4_NODE
, &neighbor_route_server_client_cmd
);
12858 install_element(BGP_IPV4_NODE
, &no_neighbor_route_server_client_cmd
);
12859 install_element(BGP_IPV4M_NODE
, &neighbor_route_server_client_cmd
);
12860 install_element(BGP_IPV4M_NODE
, &no_neighbor_route_server_client_cmd
);
12861 install_element(BGP_IPV4L_NODE
, &neighbor_route_server_client_cmd
);
12862 install_element(BGP_IPV4L_NODE
, &no_neighbor_route_server_client_cmd
);
12863 install_element(BGP_IPV6_NODE
, &neighbor_route_server_client_cmd
);
12864 install_element(BGP_IPV6_NODE
, &no_neighbor_route_server_client_cmd
);
12865 install_element(BGP_IPV6M_NODE
, &neighbor_route_server_client_cmd
);
12866 install_element(BGP_IPV6M_NODE
, &no_neighbor_route_server_client_cmd
);
12867 install_element(BGP_IPV6L_NODE
, &neighbor_route_server_client_cmd
);
12868 install_element(BGP_IPV6L_NODE
, &no_neighbor_route_server_client_cmd
);
12869 install_element(BGP_VPNV4_NODE
, &neighbor_route_server_client_cmd
);
12870 install_element(BGP_VPNV4_NODE
, &no_neighbor_route_server_client_cmd
);
12871 install_element(BGP_VPNV6_NODE
, &neighbor_route_server_client_cmd
);
12872 install_element(BGP_VPNV6_NODE
, &no_neighbor_route_server_client_cmd
);
12873 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_route_server_client_cmd
);
12874 install_element(BGP_FLOWSPECV4_NODE
,
12875 &no_neighbor_route_server_client_cmd
);
12876 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_route_server_client_cmd
);
12877 install_element(BGP_FLOWSPECV6_NODE
,
12878 &no_neighbor_route_server_client_cmd
);
12880 /* "neighbor addpath-tx-all-paths" commands.*/
12881 install_element(BGP_NODE
, &neighbor_addpath_tx_all_paths_hidden_cmd
);
12882 install_element(BGP_NODE
, &no_neighbor_addpath_tx_all_paths_hidden_cmd
);
12883 install_element(BGP_IPV4_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
12884 install_element(BGP_IPV4_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
12885 install_element(BGP_IPV4M_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
12886 install_element(BGP_IPV4M_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
12887 install_element(BGP_IPV4L_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
12888 install_element(BGP_IPV4L_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
12889 install_element(BGP_IPV6_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
12890 install_element(BGP_IPV6_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
12891 install_element(BGP_IPV6M_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
12892 install_element(BGP_IPV6M_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
12893 install_element(BGP_IPV6L_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
12894 install_element(BGP_IPV6L_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
12895 install_element(BGP_VPNV4_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
12896 install_element(BGP_VPNV4_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
12897 install_element(BGP_VPNV6_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
12898 install_element(BGP_VPNV6_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
12900 /* "neighbor addpath-tx-bestpath-per-AS" commands.*/
12901 install_element(BGP_NODE
,
12902 &neighbor_addpath_tx_bestpath_per_as_hidden_cmd
);
12903 install_element(BGP_NODE
,
12904 &no_neighbor_addpath_tx_bestpath_per_as_hidden_cmd
);
12905 install_element(BGP_IPV4_NODE
,
12906 &neighbor_addpath_tx_bestpath_per_as_cmd
);
12907 install_element(BGP_IPV4_NODE
,
12908 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
12909 install_element(BGP_IPV4M_NODE
,
12910 &neighbor_addpath_tx_bestpath_per_as_cmd
);
12911 install_element(BGP_IPV4M_NODE
,
12912 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
12913 install_element(BGP_IPV4L_NODE
,
12914 &neighbor_addpath_tx_bestpath_per_as_cmd
);
12915 install_element(BGP_IPV4L_NODE
,
12916 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
12917 install_element(BGP_IPV6_NODE
,
12918 &neighbor_addpath_tx_bestpath_per_as_cmd
);
12919 install_element(BGP_IPV6_NODE
,
12920 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
12921 install_element(BGP_IPV6M_NODE
,
12922 &neighbor_addpath_tx_bestpath_per_as_cmd
);
12923 install_element(BGP_IPV6M_NODE
,
12924 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
12925 install_element(BGP_IPV6L_NODE
,
12926 &neighbor_addpath_tx_bestpath_per_as_cmd
);
12927 install_element(BGP_IPV6L_NODE
,
12928 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
12929 install_element(BGP_VPNV4_NODE
,
12930 &neighbor_addpath_tx_bestpath_per_as_cmd
);
12931 install_element(BGP_VPNV4_NODE
,
12932 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
12933 install_element(BGP_VPNV6_NODE
,
12934 &neighbor_addpath_tx_bestpath_per_as_cmd
);
12935 install_element(BGP_VPNV6_NODE
,
12936 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
12938 /* "neighbor passive" commands. */
12939 install_element(BGP_NODE
, &neighbor_passive_cmd
);
12940 install_element(BGP_NODE
, &no_neighbor_passive_cmd
);
12943 /* "neighbor shutdown" commands. */
12944 install_element(BGP_NODE
, &neighbor_shutdown_cmd
);
12945 install_element(BGP_NODE
, &no_neighbor_shutdown_cmd
);
12946 install_element(BGP_NODE
, &neighbor_shutdown_msg_cmd
);
12947 install_element(BGP_NODE
, &no_neighbor_shutdown_msg_cmd
);
12949 /* "neighbor capability extended-nexthop" commands.*/
12950 install_element(BGP_NODE
, &neighbor_capability_enhe_cmd
);
12951 install_element(BGP_NODE
, &no_neighbor_capability_enhe_cmd
);
12953 /* "neighbor capability orf prefix-list" commands.*/
12954 install_element(BGP_NODE
, &neighbor_capability_orf_prefix_hidden_cmd
);
12955 install_element(BGP_NODE
,
12956 &no_neighbor_capability_orf_prefix_hidden_cmd
);
12957 install_element(BGP_IPV4_NODE
, &neighbor_capability_orf_prefix_cmd
);
12958 install_element(BGP_IPV4_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
12959 install_element(BGP_IPV4M_NODE
, &neighbor_capability_orf_prefix_cmd
);
12960 install_element(BGP_IPV4M_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
12961 install_element(BGP_IPV4L_NODE
, &neighbor_capability_orf_prefix_cmd
);
12962 install_element(BGP_IPV4L_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
12963 install_element(BGP_IPV6_NODE
, &neighbor_capability_orf_prefix_cmd
);
12964 install_element(BGP_IPV6_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
12965 install_element(BGP_IPV6M_NODE
, &neighbor_capability_orf_prefix_cmd
);
12966 install_element(BGP_IPV6M_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
12967 install_element(BGP_IPV6L_NODE
, &neighbor_capability_orf_prefix_cmd
);
12968 install_element(BGP_IPV6L_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
12970 /* "neighbor capability dynamic" commands.*/
12971 install_element(BGP_NODE
, &neighbor_capability_dynamic_cmd
);
12972 install_element(BGP_NODE
, &no_neighbor_capability_dynamic_cmd
);
12974 /* "neighbor dont-capability-negotiate" commands. */
12975 install_element(BGP_NODE
, &neighbor_dont_capability_negotiate_cmd
);
12976 install_element(BGP_NODE
, &no_neighbor_dont_capability_negotiate_cmd
);
12978 /* "neighbor ebgp-multihop" commands. */
12979 install_element(BGP_NODE
, &neighbor_ebgp_multihop_cmd
);
12980 install_element(BGP_NODE
, &neighbor_ebgp_multihop_ttl_cmd
);
12981 install_element(BGP_NODE
, &no_neighbor_ebgp_multihop_cmd
);
12983 /* "neighbor disable-connected-check" commands. */
12984 install_element(BGP_NODE
, &neighbor_disable_connected_check_cmd
);
12985 install_element(BGP_NODE
, &no_neighbor_disable_connected_check_cmd
);
12987 /* "neighbor description" commands. */
12988 install_element(BGP_NODE
, &neighbor_description_cmd
);
12989 install_element(BGP_NODE
, &no_neighbor_description_cmd
);
12991 /* "neighbor update-source" commands. "*/
12992 install_element(BGP_NODE
, &neighbor_update_source_cmd
);
12993 install_element(BGP_NODE
, &no_neighbor_update_source_cmd
);
12995 /* "neighbor default-originate" commands. */
12996 install_element(BGP_NODE
, &neighbor_default_originate_hidden_cmd
);
12997 install_element(BGP_NODE
, &neighbor_default_originate_rmap_hidden_cmd
);
12998 install_element(BGP_NODE
, &no_neighbor_default_originate_hidden_cmd
);
12999 install_element(BGP_IPV4_NODE
, &neighbor_default_originate_cmd
);
13000 install_element(BGP_IPV4_NODE
, &neighbor_default_originate_rmap_cmd
);
13001 install_element(BGP_IPV4_NODE
, &no_neighbor_default_originate_cmd
);
13002 install_element(BGP_IPV4M_NODE
, &neighbor_default_originate_cmd
);
13003 install_element(BGP_IPV4M_NODE
, &neighbor_default_originate_rmap_cmd
);
13004 install_element(BGP_IPV4M_NODE
, &no_neighbor_default_originate_cmd
);
13005 install_element(BGP_IPV4L_NODE
, &neighbor_default_originate_cmd
);
13006 install_element(BGP_IPV4L_NODE
, &neighbor_default_originate_rmap_cmd
);
13007 install_element(BGP_IPV4L_NODE
, &no_neighbor_default_originate_cmd
);
13008 install_element(BGP_IPV6_NODE
, &neighbor_default_originate_cmd
);
13009 install_element(BGP_IPV6_NODE
, &neighbor_default_originate_rmap_cmd
);
13010 install_element(BGP_IPV6_NODE
, &no_neighbor_default_originate_cmd
);
13011 install_element(BGP_IPV6M_NODE
, &neighbor_default_originate_cmd
);
13012 install_element(BGP_IPV6M_NODE
, &neighbor_default_originate_rmap_cmd
);
13013 install_element(BGP_IPV6M_NODE
, &no_neighbor_default_originate_cmd
);
13014 install_element(BGP_IPV6L_NODE
, &neighbor_default_originate_cmd
);
13015 install_element(BGP_IPV6L_NODE
, &neighbor_default_originate_rmap_cmd
);
13016 install_element(BGP_IPV6L_NODE
, &no_neighbor_default_originate_cmd
);
13018 /* "neighbor port" commands. */
13019 install_element(BGP_NODE
, &neighbor_port_cmd
);
13020 install_element(BGP_NODE
, &no_neighbor_port_cmd
);
13022 /* "neighbor weight" commands. */
13023 install_element(BGP_NODE
, &neighbor_weight_hidden_cmd
);
13024 install_element(BGP_NODE
, &no_neighbor_weight_hidden_cmd
);
13026 install_element(BGP_IPV4_NODE
, &neighbor_weight_cmd
);
13027 install_element(BGP_IPV4_NODE
, &no_neighbor_weight_cmd
);
13028 install_element(BGP_IPV4M_NODE
, &neighbor_weight_cmd
);
13029 install_element(BGP_IPV4M_NODE
, &no_neighbor_weight_cmd
);
13030 install_element(BGP_IPV4L_NODE
, &neighbor_weight_cmd
);
13031 install_element(BGP_IPV4L_NODE
, &no_neighbor_weight_cmd
);
13032 install_element(BGP_IPV6_NODE
, &neighbor_weight_cmd
);
13033 install_element(BGP_IPV6_NODE
, &no_neighbor_weight_cmd
);
13034 install_element(BGP_IPV6M_NODE
, &neighbor_weight_cmd
);
13035 install_element(BGP_IPV6M_NODE
, &no_neighbor_weight_cmd
);
13036 install_element(BGP_IPV6L_NODE
, &neighbor_weight_cmd
);
13037 install_element(BGP_IPV6L_NODE
, &no_neighbor_weight_cmd
);
13038 install_element(BGP_VPNV4_NODE
, &neighbor_weight_cmd
);
13039 install_element(BGP_VPNV4_NODE
, &no_neighbor_weight_cmd
);
13040 install_element(BGP_VPNV6_NODE
, &neighbor_weight_cmd
);
13041 install_element(BGP_VPNV6_NODE
, &no_neighbor_weight_cmd
);
13043 /* "neighbor override-capability" commands. */
13044 install_element(BGP_NODE
, &neighbor_override_capability_cmd
);
13045 install_element(BGP_NODE
, &no_neighbor_override_capability_cmd
);
13047 /* "neighbor strict-capability-match" commands. */
13048 install_element(BGP_NODE
, &neighbor_strict_capability_cmd
);
13049 install_element(BGP_NODE
, &no_neighbor_strict_capability_cmd
);
13051 /* "neighbor timers" commands. */
13052 install_element(BGP_NODE
, &neighbor_timers_cmd
);
13053 install_element(BGP_NODE
, &no_neighbor_timers_cmd
);
13055 /* "neighbor timers connect" commands. */
13056 install_element(BGP_NODE
, &neighbor_timers_connect_cmd
);
13057 install_element(BGP_NODE
, &no_neighbor_timers_connect_cmd
);
13059 /* "neighbor advertisement-interval" commands. */
13060 install_element(BGP_NODE
, &neighbor_advertise_interval_cmd
);
13061 install_element(BGP_NODE
, &no_neighbor_advertise_interval_cmd
);
13063 /* "neighbor interface" commands. */
13064 install_element(BGP_NODE
, &neighbor_interface_cmd
);
13065 install_element(BGP_NODE
, &no_neighbor_interface_cmd
);
13067 /* "neighbor distribute" commands. */
13068 install_element(BGP_NODE
, &neighbor_distribute_list_hidden_cmd
);
13069 install_element(BGP_NODE
, &no_neighbor_distribute_list_hidden_cmd
);
13070 install_element(BGP_IPV4_NODE
, &neighbor_distribute_list_cmd
);
13071 install_element(BGP_IPV4_NODE
, &no_neighbor_distribute_list_cmd
);
13072 install_element(BGP_IPV4M_NODE
, &neighbor_distribute_list_cmd
);
13073 install_element(BGP_IPV4M_NODE
, &no_neighbor_distribute_list_cmd
);
13074 install_element(BGP_IPV4L_NODE
, &neighbor_distribute_list_cmd
);
13075 install_element(BGP_IPV4L_NODE
, &no_neighbor_distribute_list_cmd
);
13076 install_element(BGP_IPV6_NODE
, &neighbor_distribute_list_cmd
);
13077 install_element(BGP_IPV6_NODE
, &no_neighbor_distribute_list_cmd
);
13078 install_element(BGP_IPV6M_NODE
, &neighbor_distribute_list_cmd
);
13079 install_element(BGP_IPV6M_NODE
, &no_neighbor_distribute_list_cmd
);
13080 install_element(BGP_IPV6L_NODE
, &neighbor_distribute_list_cmd
);
13081 install_element(BGP_IPV6L_NODE
, &no_neighbor_distribute_list_cmd
);
13082 install_element(BGP_VPNV4_NODE
, &neighbor_distribute_list_cmd
);
13083 install_element(BGP_VPNV4_NODE
, &no_neighbor_distribute_list_cmd
);
13084 install_element(BGP_VPNV6_NODE
, &neighbor_distribute_list_cmd
);
13085 install_element(BGP_VPNV6_NODE
, &no_neighbor_distribute_list_cmd
);
13087 /* "neighbor prefix-list" commands. */
13088 install_element(BGP_NODE
, &neighbor_prefix_list_hidden_cmd
);
13089 install_element(BGP_NODE
, &no_neighbor_prefix_list_hidden_cmd
);
13090 install_element(BGP_IPV4_NODE
, &neighbor_prefix_list_cmd
);
13091 install_element(BGP_IPV4_NODE
, &no_neighbor_prefix_list_cmd
);
13092 install_element(BGP_IPV4M_NODE
, &neighbor_prefix_list_cmd
);
13093 install_element(BGP_IPV4M_NODE
, &no_neighbor_prefix_list_cmd
);
13094 install_element(BGP_IPV4L_NODE
, &neighbor_prefix_list_cmd
);
13095 install_element(BGP_IPV4L_NODE
, &no_neighbor_prefix_list_cmd
);
13096 install_element(BGP_IPV6_NODE
, &neighbor_prefix_list_cmd
);
13097 install_element(BGP_IPV6_NODE
, &no_neighbor_prefix_list_cmd
);
13098 install_element(BGP_IPV6M_NODE
, &neighbor_prefix_list_cmd
);
13099 install_element(BGP_IPV6M_NODE
, &no_neighbor_prefix_list_cmd
);
13100 install_element(BGP_IPV6L_NODE
, &neighbor_prefix_list_cmd
);
13101 install_element(BGP_IPV6L_NODE
, &no_neighbor_prefix_list_cmd
);
13102 install_element(BGP_VPNV4_NODE
, &neighbor_prefix_list_cmd
);
13103 install_element(BGP_VPNV4_NODE
, &no_neighbor_prefix_list_cmd
);
13104 install_element(BGP_VPNV6_NODE
, &neighbor_prefix_list_cmd
);
13105 install_element(BGP_VPNV6_NODE
, &no_neighbor_prefix_list_cmd
);
13106 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_prefix_list_cmd
);
13107 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_prefix_list_cmd
);
13108 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_prefix_list_cmd
);
13109 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_prefix_list_cmd
);
13111 /* "neighbor filter-list" commands. */
13112 install_element(BGP_NODE
, &neighbor_filter_list_hidden_cmd
);
13113 install_element(BGP_NODE
, &no_neighbor_filter_list_hidden_cmd
);
13114 install_element(BGP_IPV4_NODE
, &neighbor_filter_list_cmd
);
13115 install_element(BGP_IPV4_NODE
, &no_neighbor_filter_list_cmd
);
13116 install_element(BGP_IPV4M_NODE
, &neighbor_filter_list_cmd
);
13117 install_element(BGP_IPV4M_NODE
, &no_neighbor_filter_list_cmd
);
13118 install_element(BGP_IPV4L_NODE
, &neighbor_filter_list_cmd
);
13119 install_element(BGP_IPV4L_NODE
, &no_neighbor_filter_list_cmd
);
13120 install_element(BGP_IPV6_NODE
, &neighbor_filter_list_cmd
);
13121 install_element(BGP_IPV6_NODE
, &no_neighbor_filter_list_cmd
);
13122 install_element(BGP_IPV6M_NODE
, &neighbor_filter_list_cmd
);
13123 install_element(BGP_IPV6M_NODE
, &no_neighbor_filter_list_cmd
);
13124 install_element(BGP_IPV6L_NODE
, &neighbor_filter_list_cmd
);
13125 install_element(BGP_IPV6L_NODE
, &no_neighbor_filter_list_cmd
);
13126 install_element(BGP_VPNV4_NODE
, &neighbor_filter_list_cmd
);
13127 install_element(BGP_VPNV4_NODE
, &no_neighbor_filter_list_cmd
);
13128 install_element(BGP_VPNV6_NODE
, &neighbor_filter_list_cmd
);
13129 install_element(BGP_VPNV6_NODE
, &no_neighbor_filter_list_cmd
);
13130 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_filter_list_cmd
);
13131 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_filter_list_cmd
);
13132 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_filter_list_cmd
);
13133 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_filter_list_cmd
);
13135 /* "neighbor route-map" commands. */
13136 install_element(BGP_NODE
, &neighbor_route_map_hidden_cmd
);
13137 install_element(BGP_NODE
, &no_neighbor_route_map_hidden_cmd
);
13138 install_element(BGP_IPV4_NODE
, &neighbor_route_map_cmd
);
13139 install_element(BGP_IPV4_NODE
, &no_neighbor_route_map_cmd
);
13140 install_element(BGP_IPV4M_NODE
, &neighbor_route_map_cmd
);
13141 install_element(BGP_IPV4M_NODE
, &no_neighbor_route_map_cmd
);
13142 install_element(BGP_IPV4L_NODE
, &neighbor_route_map_cmd
);
13143 install_element(BGP_IPV4L_NODE
, &no_neighbor_route_map_cmd
);
13144 install_element(BGP_IPV6_NODE
, &neighbor_route_map_cmd
);
13145 install_element(BGP_IPV6_NODE
, &no_neighbor_route_map_cmd
);
13146 install_element(BGP_IPV6M_NODE
, &neighbor_route_map_cmd
);
13147 install_element(BGP_IPV6M_NODE
, &no_neighbor_route_map_cmd
);
13148 install_element(BGP_IPV6L_NODE
, &neighbor_route_map_cmd
);
13149 install_element(BGP_IPV6L_NODE
, &no_neighbor_route_map_cmd
);
13150 install_element(BGP_VPNV4_NODE
, &neighbor_route_map_cmd
);
13151 install_element(BGP_VPNV4_NODE
, &no_neighbor_route_map_cmd
);
13152 install_element(BGP_VPNV6_NODE
, &neighbor_route_map_cmd
);
13153 install_element(BGP_VPNV6_NODE
, &no_neighbor_route_map_cmd
);
13154 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_route_map_cmd
);
13155 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_route_map_cmd
);
13156 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_route_map_cmd
);
13157 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_route_map_cmd
);
13158 install_element(BGP_EVPN_NODE
, &neighbor_route_map_cmd
);
13159 install_element(BGP_EVPN_NODE
, &no_neighbor_route_map_cmd
);
13161 /* "neighbor unsuppress-map" commands. */
13162 install_element(BGP_NODE
, &neighbor_unsuppress_map_hidden_cmd
);
13163 install_element(BGP_NODE
, &no_neighbor_unsuppress_map_hidden_cmd
);
13164 install_element(BGP_IPV4_NODE
, &neighbor_unsuppress_map_cmd
);
13165 install_element(BGP_IPV4_NODE
, &no_neighbor_unsuppress_map_cmd
);
13166 install_element(BGP_IPV4M_NODE
, &neighbor_unsuppress_map_cmd
);
13167 install_element(BGP_IPV4M_NODE
, &no_neighbor_unsuppress_map_cmd
);
13168 install_element(BGP_IPV4L_NODE
, &neighbor_unsuppress_map_cmd
);
13169 install_element(BGP_IPV4L_NODE
, &no_neighbor_unsuppress_map_cmd
);
13170 install_element(BGP_IPV6_NODE
, &neighbor_unsuppress_map_cmd
);
13171 install_element(BGP_IPV6_NODE
, &no_neighbor_unsuppress_map_cmd
);
13172 install_element(BGP_IPV6M_NODE
, &neighbor_unsuppress_map_cmd
);
13173 install_element(BGP_IPV6M_NODE
, &no_neighbor_unsuppress_map_cmd
);
13174 install_element(BGP_IPV6L_NODE
, &neighbor_unsuppress_map_cmd
);
13175 install_element(BGP_IPV6L_NODE
, &no_neighbor_unsuppress_map_cmd
);
13176 install_element(BGP_VPNV4_NODE
, &neighbor_unsuppress_map_cmd
);
13177 install_element(BGP_VPNV4_NODE
, &no_neighbor_unsuppress_map_cmd
);
13178 install_element(BGP_VPNV6_NODE
, &neighbor_unsuppress_map_cmd
);
13179 install_element(BGP_VPNV6_NODE
, &no_neighbor_unsuppress_map_cmd
);
13181 /* "neighbor maximum-prefix" commands. */
13182 install_element(BGP_NODE
, &neighbor_maximum_prefix_hidden_cmd
);
13183 install_element(BGP_NODE
,
13184 &neighbor_maximum_prefix_threshold_hidden_cmd
);
13185 install_element(BGP_NODE
, &neighbor_maximum_prefix_warning_hidden_cmd
);
13186 install_element(BGP_NODE
,
13187 &neighbor_maximum_prefix_threshold_warning_hidden_cmd
);
13188 install_element(BGP_NODE
, &neighbor_maximum_prefix_restart_hidden_cmd
);
13189 install_element(BGP_NODE
,
13190 &neighbor_maximum_prefix_threshold_restart_hidden_cmd
);
13191 install_element(BGP_NODE
, &no_neighbor_maximum_prefix_hidden_cmd
);
13192 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_cmd
);
13193 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13194 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13195 install_element(BGP_IPV4_NODE
,
13196 &neighbor_maximum_prefix_threshold_warning_cmd
);
13197 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13198 install_element(BGP_IPV4_NODE
,
13199 &neighbor_maximum_prefix_threshold_restart_cmd
);
13200 install_element(BGP_IPV4_NODE
, &no_neighbor_maximum_prefix_cmd
);
13201 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_cmd
);
13202 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13203 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13204 install_element(BGP_IPV4M_NODE
,
13205 &neighbor_maximum_prefix_threshold_warning_cmd
);
13206 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13207 install_element(BGP_IPV4M_NODE
,
13208 &neighbor_maximum_prefix_threshold_restart_cmd
);
13209 install_element(BGP_IPV4M_NODE
, &no_neighbor_maximum_prefix_cmd
);
13210 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_cmd
);
13211 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13212 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13213 install_element(BGP_IPV4L_NODE
,
13214 &neighbor_maximum_prefix_threshold_warning_cmd
);
13215 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13216 install_element(BGP_IPV4L_NODE
,
13217 &neighbor_maximum_prefix_threshold_restart_cmd
);
13218 install_element(BGP_IPV4L_NODE
, &no_neighbor_maximum_prefix_cmd
);
13219 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_cmd
);
13220 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13221 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13222 install_element(BGP_IPV6_NODE
,
13223 &neighbor_maximum_prefix_threshold_warning_cmd
);
13224 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13225 install_element(BGP_IPV6_NODE
,
13226 &neighbor_maximum_prefix_threshold_restart_cmd
);
13227 install_element(BGP_IPV6_NODE
, &no_neighbor_maximum_prefix_cmd
);
13228 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_cmd
);
13229 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13230 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13231 install_element(BGP_IPV6M_NODE
,
13232 &neighbor_maximum_prefix_threshold_warning_cmd
);
13233 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13234 install_element(BGP_IPV6M_NODE
,
13235 &neighbor_maximum_prefix_threshold_restart_cmd
);
13236 install_element(BGP_IPV6M_NODE
, &no_neighbor_maximum_prefix_cmd
);
13237 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_cmd
);
13238 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13239 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13240 install_element(BGP_IPV6L_NODE
,
13241 &neighbor_maximum_prefix_threshold_warning_cmd
);
13242 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13243 install_element(BGP_IPV6L_NODE
,
13244 &neighbor_maximum_prefix_threshold_restart_cmd
);
13245 install_element(BGP_IPV6L_NODE
, &no_neighbor_maximum_prefix_cmd
);
13246 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_cmd
);
13247 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13248 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13249 install_element(BGP_VPNV4_NODE
,
13250 &neighbor_maximum_prefix_threshold_warning_cmd
);
13251 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13252 install_element(BGP_VPNV4_NODE
,
13253 &neighbor_maximum_prefix_threshold_restart_cmd
);
13254 install_element(BGP_VPNV4_NODE
, &no_neighbor_maximum_prefix_cmd
);
13255 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_cmd
);
13256 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13257 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13258 install_element(BGP_VPNV6_NODE
,
13259 &neighbor_maximum_prefix_threshold_warning_cmd
);
13260 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13261 install_element(BGP_VPNV6_NODE
,
13262 &neighbor_maximum_prefix_threshold_restart_cmd
);
13263 install_element(BGP_VPNV6_NODE
, &no_neighbor_maximum_prefix_cmd
);
13265 /* "neighbor allowas-in" */
13266 install_element(BGP_NODE
, &neighbor_allowas_in_hidden_cmd
);
13267 install_element(BGP_NODE
, &no_neighbor_allowas_in_hidden_cmd
);
13268 install_element(BGP_IPV4_NODE
, &neighbor_allowas_in_cmd
);
13269 install_element(BGP_IPV4_NODE
, &no_neighbor_allowas_in_cmd
);
13270 install_element(BGP_IPV4M_NODE
, &neighbor_allowas_in_cmd
);
13271 install_element(BGP_IPV4M_NODE
, &no_neighbor_allowas_in_cmd
);
13272 install_element(BGP_IPV4L_NODE
, &neighbor_allowas_in_cmd
);
13273 install_element(BGP_IPV4L_NODE
, &no_neighbor_allowas_in_cmd
);
13274 install_element(BGP_IPV6_NODE
, &neighbor_allowas_in_cmd
);
13275 install_element(BGP_IPV6_NODE
, &no_neighbor_allowas_in_cmd
);
13276 install_element(BGP_IPV6M_NODE
, &neighbor_allowas_in_cmd
);
13277 install_element(BGP_IPV6M_NODE
, &no_neighbor_allowas_in_cmd
);
13278 install_element(BGP_IPV6L_NODE
, &neighbor_allowas_in_cmd
);
13279 install_element(BGP_IPV6L_NODE
, &no_neighbor_allowas_in_cmd
);
13280 install_element(BGP_VPNV4_NODE
, &neighbor_allowas_in_cmd
);
13281 install_element(BGP_VPNV4_NODE
, &no_neighbor_allowas_in_cmd
);
13282 install_element(BGP_VPNV6_NODE
, &neighbor_allowas_in_cmd
);
13283 install_element(BGP_VPNV6_NODE
, &no_neighbor_allowas_in_cmd
);
13284 install_element(BGP_EVPN_NODE
, &neighbor_allowas_in_cmd
);
13285 install_element(BGP_EVPN_NODE
, &no_neighbor_allowas_in_cmd
);
13287 /* address-family commands. */
13288 install_element(BGP_NODE
, &address_family_ipv4_safi_cmd
);
13289 install_element(BGP_NODE
, &address_family_ipv6_safi_cmd
);
13290 #ifdef KEEP_OLD_VPN_COMMANDS
13291 install_element(BGP_NODE
, &address_family_vpnv4_cmd
);
13292 install_element(BGP_NODE
, &address_family_vpnv6_cmd
);
13293 #endif /* KEEP_OLD_VPN_COMMANDS */
13295 install_element(BGP_NODE
, &address_family_evpn_cmd
);
13297 /* "exit-address-family" command. */
13298 install_element(BGP_IPV4_NODE
, &exit_address_family_cmd
);
13299 install_element(BGP_IPV4M_NODE
, &exit_address_family_cmd
);
13300 install_element(BGP_IPV4L_NODE
, &exit_address_family_cmd
);
13301 install_element(BGP_IPV6_NODE
, &exit_address_family_cmd
);
13302 install_element(BGP_IPV6M_NODE
, &exit_address_family_cmd
);
13303 install_element(BGP_IPV6L_NODE
, &exit_address_family_cmd
);
13304 install_element(BGP_VPNV4_NODE
, &exit_address_family_cmd
);
13305 install_element(BGP_VPNV6_NODE
, &exit_address_family_cmd
);
13306 install_element(BGP_FLOWSPECV4_NODE
, &exit_address_family_cmd
);
13307 install_element(BGP_FLOWSPECV6_NODE
, &exit_address_family_cmd
);
13308 install_element(BGP_EVPN_NODE
, &exit_address_family_cmd
);
13310 /* "clear ip bgp commands" */
13311 install_element(ENABLE_NODE
, &clear_ip_bgp_all_cmd
);
13313 /* clear ip bgp prefix */
13314 install_element(ENABLE_NODE
, &clear_ip_bgp_prefix_cmd
);
13315 install_element(ENABLE_NODE
, &clear_bgp_ipv6_safi_prefix_cmd
);
13316 install_element(ENABLE_NODE
, &clear_bgp_instance_ipv6_safi_prefix_cmd
);
13318 /* "show [ip] bgp summary" commands. */
13319 install_element(VIEW_NODE
, &show_bgp_instance_all_ipv6_updgrps_cmd
);
13320 install_element(VIEW_NODE
, &show_bgp_instance_updgrps_stats_cmd
);
13321 install_element(VIEW_NODE
, &show_bgp_updgrps_stats_cmd
);
13322 install_element(VIEW_NODE
, &show_ip_bgp_instance_updgrps_adj_s_cmd
);
13323 install_element(VIEW_NODE
, &show_ip_bgp_summary_cmd
);
13324 install_element(VIEW_NODE
, &show_ip_bgp_updgrps_cmd
);
13326 /* "show [ip] bgp neighbors" commands. */
13327 install_element(VIEW_NODE
, &show_ip_bgp_neighbors_cmd
);
13329 /* "show [ip] bgp peer-group" commands. */
13330 install_element(VIEW_NODE
, &show_ip_bgp_peer_groups_cmd
);
13332 /* "show [ip] bgp paths" commands. */
13333 install_element(VIEW_NODE
, &show_ip_bgp_paths_cmd
);
13335 /* "show [ip] bgp community" commands. */
13336 install_element(VIEW_NODE
, &show_ip_bgp_community_info_cmd
);
13338 /* "show ip bgp large-community" commands. */
13339 install_element(VIEW_NODE
, &show_ip_bgp_lcommunity_info_cmd
);
13340 /* "show [ip] bgp attribute-info" commands. */
13341 install_element(VIEW_NODE
, &show_ip_bgp_attr_info_cmd
);
13342 /* "show [ip] bgp route-leak" command */
13343 install_element(VIEW_NODE
, &show_ip_bgp_route_leak_cmd
);
13345 /* "redistribute" commands. */
13346 install_element(BGP_NODE
, &bgp_redistribute_ipv4_hidden_cmd
);
13347 install_element(BGP_NODE
, &no_bgp_redistribute_ipv4_hidden_cmd
);
13348 install_element(BGP_NODE
, &bgp_redistribute_ipv4_rmap_hidden_cmd
);
13349 install_element(BGP_NODE
, &bgp_redistribute_ipv4_metric_hidden_cmd
);
13350 install_element(BGP_NODE
,
13351 &bgp_redistribute_ipv4_rmap_metric_hidden_cmd
);
13352 install_element(BGP_NODE
,
13353 &bgp_redistribute_ipv4_metric_rmap_hidden_cmd
);
13354 install_element(BGP_NODE
, &bgp_redistribute_ipv4_ospf_hidden_cmd
);
13355 install_element(BGP_NODE
, &no_bgp_redistribute_ipv4_ospf_hidden_cmd
);
13356 install_element(BGP_NODE
, &bgp_redistribute_ipv4_ospf_rmap_hidden_cmd
);
13357 install_element(BGP_NODE
,
13358 &bgp_redistribute_ipv4_ospf_metric_hidden_cmd
);
13359 install_element(BGP_NODE
,
13360 &bgp_redistribute_ipv4_ospf_rmap_metric_hidden_cmd
);
13361 install_element(BGP_NODE
,
13362 &bgp_redistribute_ipv4_ospf_metric_rmap_hidden_cmd
);
13363 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_cmd
);
13364 install_element(BGP_IPV4_NODE
, &no_bgp_redistribute_ipv4_cmd
);
13365 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_rmap_cmd
);
13366 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_metric_cmd
);
13367 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_rmap_metric_cmd
);
13368 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_metric_rmap_cmd
);
13369 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_ospf_cmd
);
13370 install_element(BGP_IPV4_NODE
, &no_bgp_redistribute_ipv4_ospf_cmd
);
13371 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_ospf_rmap_cmd
);
13372 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_ospf_metric_cmd
);
13373 install_element(BGP_IPV4_NODE
,
13374 &bgp_redistribute_ipv4_ospf_rmap_metric_cmd
);
13375 install_element(BGP_IPV4_NODE
,
13376 &bgp_redistribute_ipv4_ospf_metric_rmap_cmd
);
13377 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_cmd
);
13378 install_element(BGP_IPV6_NODE
, &no_bgp_redistribute_ipv6_cmd
);
13379 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_rmap_cmd
);
13380 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_metric_cmd
);
13381 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_rmap_metric_cmd
);
13382 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_metric_rmap_cmd
);
13384 /* import|export vpn [route-map WORD] */
13385 install_element(BGP_IPV4_NODE
, &bgp_imexport_vpn_cmd
);
13386 install_element(BGP_IPV6_NODE
, &bgp_imexport_vpn_cmd
);
13388 install_element(BGP_IPV4_NODE
, &bgp_imexport_vrf_cmd
);
13389 install_element(BGP_IPV6_NODE
, &bgp_imexport_vrf_cmd
);
13391 /* ttl_security commands */
13392 install_element(BGP_NODE
, &neighbor_ttl_security_cmd
);
13393 install_element(BGP_NODE
, &no_neighbor_ttl_security_cmd
);
13395 /* "show [ip] bgp memory" commands. */
13396 install_element(VIEW_NODE
, &show_bgp_memory_cmd
);
13398 /* "show bgp martian next-hop" */
13399 install_element(VIEW_NODE
, &show_bgp_martian_nexthop_db_cmd
);
13401 /* "show [ip] bgp views" commands. */
13402 install_element(VIEW_NODE
, &show_bgp_views_cmd
);
13404 /* "show [ip] bgp vrfs" commands. */
13405 install_element(VIEW_NODE
, &show_bgp_vrfs_cmd
);
13407 /* Community-list. */
13408 community_list_vty();
13410 /* vpn-policy commands */
13411 install_element(BGP_IPV4_NODE
, &af_rd_vpn_export_cmd
);
13412 install_element(BGP_IPV6_NODE
, &af_rd_vpn_export_cmd
);
13413 install_element(BGP_IPV4_NODE
, &af_label_vpn_export_cmd
);
13414 install_element(BGP_IPV6_NODE
, &af_label_vpn_export_cmd
);
13415 install_element(BGP_IPV4_NODE
, &af_nexthop_vpn_export_cmd
);
13416 install_element(BGP_IPV6_NODE
, &af_nexthop_vpn_export_cmd
);
13417 install_element(BGP_IPV4_NODE
, &af_rt_vpn_imexport_cmd
);
13418 install_element(BGP_IPV6_NODE
, &af_rt_vpn_imexport_cmd
);
13419 install_element(BGP_IPV4_NODE
, &af_route_map_vpn_imexport_cmd
);
13420 install_element(BGP_IPV6_NODE
, &af_route_map_vpn_imexport_cmd
);
13421 install_element(BGP_IPV4_NODE
, &af_import_vrf_route_map_cmd
);
13422 install_element(BGP_IPV6_NODE
, &af_import_vrf_route_map_cmd
);
13424 install_element(BGP_IPV4_NODE
, &af_routetarget_import_cmd
);
13425 install_element(BGP_IPV6_NODE
, &af_routetarget_import_cmd
);
13427 install_element(BGP_IPV4_NODE
, &af_no_rd_vpn_export_cmd
);
13428 install_element(BGP_IPV6_NODE
, &af_no_rd_vpn_export_cmd
);
13429 install_element(BGP_IPV4_NODE
, &af_no_label_vpn_export_cmd
);
13430 install_element(BGP_IPV6_NODE
, &af_no_label_vpn_export_cmd
);
13431 install_element(BGP_IPV4_NODE
, &af_no_nexthop_vpn_export_cmd
);
13432 install_element(BGP_IPV6_NODE
, &af_no_nexthop_vpn_export_cmd
);
13433 install_element(BGP_IPV4_NODE
, &af_no_rt_vpn_imexport_cmd
);
13434 install_element(BGP_IPV6_NODE
, &af_no_rt_vpn_imexport_cmd
);
13435 install_element(BGP_IPV4_NODE
, &af_no_route_map_vpn_imexport_cmd
);
13436 install_element(BGP_IPV6_NODE
, &af_no_route_map_vpn_imexport_cmd
);
13437 install_element(BGP_IPV4_NODE
, &af_no_import_vrf_route_map_cmd
);
13438 install_element(BGP_IPV6_NODE
, &af_no_import_vrf_route_map_cmd
);
13441 #include "memory.h"
13442 #include "bgp_regex.h"
13443 #include "bgp_clist.h"
13444 #include "bgp_ecommunity.h"
13446 /* VTY functions. */
13448 /* Direction value to string conversion. */
13449 static const char *community_direct_str(int direct
)
13452 case COMMUNITY_DENY
:
13454 case COMMUNITY_PERMIT
:
13461 /* Display error string. */
13462 static void community_list_perror(struct vty
*vty
, int ret
)
13465 case COMMUNITY_LIST_ERR_CANT_FIND_LIST
:
13466 vty_out(vty
, "%% Can't find community-list\n");
13468 case COMMUNITY_LIST_ERR_MALFORMED_VAL
:
13469 vty_out(vty
, "%% Malformed community-list value\n");
13471 case COMMUNITY_LIST_ERR_STANDARD_CONFLICT
:
13473 "%% Community name conflict, previously defined as standard community\n");
13475 case COMMUNITY_LIST_ERR_EXPANDED_CONFLICT
:
13477 "%% Community name conflict, previously defined as expanded community\n");
13482 /* "community-list" keyword help string. */
13483 #define COMMUNITY_LIST_STR "Add a community list entry\n"
13485 /* ip community-list standard */
13486 DEFUN (ip_community_list_standard
,
13487 ip_community_list_standard_cmd
,
13488 "ip community-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
13491 "Community list number (standard)\n"
13492 "Add an standard community-list entry\n"
13493 "Community list name\n"
13494 "Specify community to reject\n"
13495 "Specify community to accept\n"
13498 char *cl_name_or_number
= NULL
;
13500 int style
= COMMUNITY_LIST_STANDARD
;
13503 argv_find(argv
, argc
, "(1-99)", &idx
);
13504 argv_find(argv
, argc
, "WORD", &idx
);
13505 cl_name_or_number
= argv
[idx
]->arg
;
13506 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
13508 argv_find(argv
, argc
, "AA:NN", &idx
);
13509 char *str
= argv_concat(argv
, argc
, idx
);
13511 int ret
= community_list_set(bgp_clist
, cl_name_or_number
, str
, direct
,
13514 XFREE(MTYPE_TMP
, str
);
13517 /* Display error string. */
13518 community_list_perror(vty
, ret
);
13519 return CMD_WARNING_CONFIG_FAILED
;
13522 return CMD_SUCCESS
;
13525 DEFUN (no_ip_community_list_standard_all
,
13526 no_ip_community_list_standard_all_cmd
,
13527 "no ip community-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
13531 "Community list number (standard)\n"
13532 "Add an standard community-list entry\n"
13533 "Community list name\n"
13534 "Specify community to reject\n"
13535 "Specify community to accept\n"
13538 char *cl_name_or_number
= NULL
;
13540 int style
= COMMUNITY_LIST_STANDARD
;
13543 argv_find(argv
, argc
, "(1-99)", &idx
);
13544 argv_find(argv
, argc
, "WORD", &idx
);
13545 cl_name_or_number
= argv
[idx
]->arg
;
13546 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
13548 argv_find(argv
, argc
, "AA:NN", &idx
);
13549 char *str
= argv_concat(argv
, argc
, idx
);
13551 int ret
= community_list_unset(bgp_clist
, cl_name_or_number
, str
,
13554 XFREE(MTYPE_TMP
, str
);
13557 community_list_perror(vty
, ret
);
13558 return CMD_WARNING_CONFIG_FAILED
;
13561 return CMD_SUCCESS
;
13564 /* ip community-list expanded */
13565 DEFUN (ip_community_list_expanded_all
,
13566 ip_community_list_expanded_all_cmd
,
13567 "ip community-list <(100-500)|expanded WORD> <deny|permit> AA:NN...",
13570 "Community list number (expanded)\n"
13571 "Add an expanded community-list entry\n"
13572 "Community list name\n"
13573 "Specify community to reject\n"
13574 "Specify community to accept\n"
13577 char *cl_name_or_number
= NULL
;
13579 int style
= COMMUNITY_LIST_EXPANDED
;
13582 argv_find(argv
, argc
, "(100-500)", &idx
);
13583 argv_find(argv
, argc
, "WORD", &idx
);
13584 cl_name_or_number
= argv
[idx
]->arg
;
13585 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
13587 argv_find(argv
, argc
, "AA:NN", &idx
);
13588 char *str
= argv_concat(argv
, argc
, idx
);
13590 int ret
= community_list_set(bgp_clist
, cl_name_or_number
, str
, direct
,
13593 XFREE(MTYPE_TMP
, str
);
13596 /* Display error string. */
13597 community_list_perror(vty
, ret
);
13598 return CMD_WARNING_CONFIG_FAILED
;
13601 return CMD_SUCCESS
;
13604 DEFUN (no_ip_community_list_expanded_all
,
13605 no_ip_community_list_expanded_all_cmd
,
13606 "no ip community-list <(100-500)|expanded WORD> <deny|permit> AA:NN...",
13610 "Community list number (expanded)\n"
13611 "Add an expanded community-list entry\n"
13612 "Community list name\n"
13613 "Specify community to reject\n"
13614 "Specify community to accept\n"
13617 char *cl_name_or_number
= NULL
;
13619 int style
= COMMUNITY_LIST_EXPANDED
;
13622 argv_find(argv
, argc
, "(100-500)", &idx
);
13623 argv_find(argv
, argc
, "WORD", &idx
);
13624 cl_name_or_number
= argv
[idx
]->arg
;
13625 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
13627 argv_find(argv
, argc
, "AA:NN", &idx
);
13628 char *str
= argv_concat(argv
, argc
, idx
);
13630 int ret
= community_list_unset(bgp_clist
, cl_name_or_number
, str
,
13633 XFREE(MTYPE_TMP
, str
);
13636 community_list_perror(vty
, ret
);
13637 return CMD_WARNING_CONFIG_FAILED
;
13640 return CMD_SUCCESS
;
13643 /* Return configuration string of community-list entry. */
13644 static const char *community_list_config_str(struct community_entry
*entry
)
13651 if (entry
->style
== COMMUNITY_LIST_STANDARD
)
13652 str
= community_str(entry
->u
.com
, false);
13653 else if (entry
->style
== LARGE_COMMUNITY_LIST_STANDARD
)
13654 str
= lcommunity_str(entry
->u
.lcom
, false);
13656 str
= entry
->config
;
13661 static void community_list_show(struct vty
*vty
, struct community_list
*list
)
13663 struct community_entry
*entry
;
13665 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
13666 if (entry
== list
->head
) {
13667 if (all_digit(list
->name
))
13668 vty_out(vty
, "Community %s list %s\n",
13669 entry
->style
== COMMUNITY_LIST_STANDARD
13671 : "(expanded) access",
13674 vty_out(vty
, "Named Community %s list %s\n",
13675 entry
->style
== COMMUNITY_LIST_STANDARD
13681 vty_out(vty
, " %s\n",
13682 community_direct_str(entry
->direct
));
13684 vty_out(vty
, " %s %s\n",
13685 community_direct_str(entry
->direct
),
13686 community_list_config_str(entry
));
13690 DEFUN (show_ip_community_list
,
13691 show_ip_community_list_cmd
,
13692 "show ip community-list",
13695 "List community-list\n")
13697 struct community_list
*list
;
13698 struct community_list_master
*cm
;
13700 cm
= community_list_master_lookup(bgp_clist
, COMMUNITY_LIST_MASTER
);
13702 return CMD_SUCCESS
;
13704 for (list
= cm
->num
.head
; list
; list
= list
->next
)
13705 community_list_show(vty
, list
);
13707 for (list
= cm
->str
.head
; list
; list
= list
->next
)
13708 community_list_show(vty
, list
);
13710 return CMD_SUCCESS
;
13713 DEFUN (show_ip_community_list_arg
,
13714 show_ip_community_list_arg_cmd
,
13715 "show ip community-list <(1-500)|WORD>",
13718 "List community-list\n"
13719 "Community-list number\n"
13720 "Community-list name\n")
13722 int idx_comm_list
= 3;
13723 struct community_list
*list
;
13725 list
= community_list_lookup(bgp_clist
, argv
[idx_comm_list
]->arg
,
13726 COMMUNITY_LIST_MASTER
);
13728 vty_out(vty
, "%% Can't find community-list\n");
13729 return CMD_WARNING
;
13732 community_list_show(vty
, list
);
13734 return CMD_SUCCESS
;
13738 * Large Community code.
13740 static int lcommunity_list_set_vty(struct vty
*vty
, int argc
,
13741 struct cmd_token
**argv
, int style
,
13742 int reject_all_digit_name
)
13750 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
13753 /* All digit name check. */
13755 argv_find(argv
, argc
, "WORD", &idx
);
13756 argv_find(argv
, argc
, "(1-99)", &idx
);
13757 argv_find(argv
, argc
, "(100-500)", &idx
);
13758 cl_name
= argv
[idx
]->arg
;
13759 if (reject_all_digit_name
&& all_digit(cl_name
)) {
13760 vty_out(vty
, "%% Community name cannot have all digits\n");
13761 return CMD_WARNING_CONFIG_FAILED
;
13765 argv_find(argv
, argc
, "AA:BB:CC", &idx
);
13766 argv_find(argv
, argc
, "LINE", &idx
);
13767 /* Concat community string argument. */
13769 str
= argv_concat(argv
, argc
, idx
);
13773 ret
= lcommunity_list_set(bgp_clist
, cl_name
, str
, direct
, style
);
13775 /* Free temporary community list string allocated by
13778 XFREE(MTYPE_TMP
, str
);
13781 community_list_perror(vty
, ret
);
13782 return CMD_WARNING_CONFIG_FAILED
;
13784 return CMD_SUCCESS
;
13787 static int lcommunity_list_unset_vty(struct vty
*vty
, int argc
,
13788 struct cmd_token
**argv
, int style
)
13795 argv_find(argv
, argc
, "permit", &idx
);
13796 argv_find(argv
, argc
, "deny", &idx
);
13799 /* Check the list direct. */
13800 if (strncmp(argv
[idx
]->arg
, "p", 1) == 0)
13801 direct
= COMMUNITY_PERMIT
;
13803 direct
= COMMUNITY_DENY
;
13806 argv_find(argv
, argc
, "LINE", &idx
);
13807 argv_find(argv
, argc
, "AA:AA:NN", &idx
);
13808 /* Concat community string argument. */
13809 str
= argv_concat(argv
, argc
, idx
);
13813 argv_find(argv
, argc
, "(1-99)", &idx
);
13814 argv_find(argv
, argc
, "(100-500)", &idx
);
13815 argv_find(argv
, argc
, "WORD", &idx
);
13817 /* Unset community list. */
13818 ret
= lcommunity_list_unset(bgp_clist
, argv
[idx
]->arg
, str
, direct
,
13821 /* Free temporary community list string allocated by
13824 XFREE(MTYPE_TMP
, str
);
13827 community_list_perror(vty
, ret
);
13828 return CMD_WARNING_CONFIG_FAILED
;
13831 return CMD_SUCCESS
;
13834 /* "large-community-list" keyword help string. */
13835 #define LCOMMUNITY_LIST_STR "Add a large community list entry\n"
13836 #define LCOMMUNITY_VAL_STR "large community in 'aa:bb:cc' format\n"
13838 DEFUN (ip_lcommunity_list_standard
,
13839 ip_lcommunity_list_standard_cmd
,
13840 "ip large-community-list (1-99) <deny|permit>",
13842 LCOMMUNITY_LIST_STR
13843 "Large Community list number (standard)\n"
13844 "Specify large community to reject\n"
13845 "Specify large community to accept\n")
13847 return lcommunity_list_set_vty(vty
, argc
, argv
,
13848 LARGE_COMMUNITY_LIST_STANDARD
, 0);
13851 DEFUN (ip_lcommunity_list_standard1
,
13852 ip_lcommunity_list_standard1_cmd
,
13853 "ip large-community-list (1-99) <deny|permit> AA:BB:CC...",
13855 LCOMMUNITY_LIST_STR
13856 "Large Community list number (standard)\n"
13857 "Specify large community to reject\n"
13858 "Specify large community to accept\n"
13859 LCOMMUNITY_VAL_STR
)
13861 return lcommunity_list_set_vty(vty
, argc
, argv
,
13862 LARGE_COMMUNITY_LIST_STANDARD
, 0);
13865 DEFUN (ip_lcommunity_list_expanded
,
13866 ip_lcommunity_list_expanded_cmd
,
13867 "ip large-community-list (100-500) <deny|permit> LINE...",
13869 LCOMMUNITY_LIST_STR
13870 "Large Community list number (expanded)\n"
13871 "Specify large community to reject\n"
13872 "Specify large community to accept\n"
13873 "An ordered list as a regular-expression\n")
13875 return lcommunity_list_set_vty(vty
, argc
, argv
,
13876 LARGE_COMMUNITY_LIST_EXPANDED
, 0);
13879 DEFUN (ip_lcommunity_list_name_standard
,
13880 ip_lcommunity_list_name_standard_cmd
,
13881 "ip large-community-list standard WORD <deny|permit>",
13883 LCOMMUNITY_LIST_STR
13884 "Specify standard large-community-list\n"
13885 "Large Community list name\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
, 1);
13893 DEFUN (ip_lcommunity_list_name_standard1
,
13894 ip_lcommunity_list_name_standard1_cmd
,
13895 "ip large-community-list standard WORD <deny|permit> AA:BB:CC...",
13897 LCOMMUNITY_LIST_STR
13898 "Specify standard large-community-list\n"
13899 "Large Community list name\n"
13900 "Specify large community to reject\n"
13901 "Specify large community to accept\n"
13902 LCOMMUNITY_VAL_STR
)
13904 return lcommunity_list_set_vty(vty
, argc
, argv
,
13905 LARGE_COMMUNITY_LIST_STANDARD
, 1);
13908 DEFUN (ip_lcommunity_list_name_expanded
,
13909 ip_lcommunity_list_name_expanded_cmd
,
13910 "ip large-community-list expanded WORD <deny|permit> LINE...",
13912 LCOMMUNITY_LIST_STR
13913 "Specify expanded large-community-list\n"
13914 "Large Community list name\n"
13915 "Specify large community to reject\n"
13916 "Specify large community to accept\n"
13917 "An ordered list as a regular-expression\n")
13919 return lcommunity_list_set_vty(vty
, argc
, argv
,
13920 LARGE_COMMUNITY_LIST_EXPANDED
, 1);
13923 DEFUN (no_ip_lcommunity_list_standard_all
,
13924 no_ip_lcommunity_list_standard_all_cmd
,
13925 "no ip large-community-list <(1-99)|(100-500)|WORD>",
13928 LCOMMUNITY_LIST_STR
13929 "Large Community list number (standard)\n"
13930 "Large Community list number (expanded)\n"
13931 "Large Community list name\n")
13933 return lcommunity_list_unset_vty(vty
, argc
, argv
,
13934 LARGE_COMMUNITY_LIST_STANDARD
);
13937 DEFUN (no_ip_lcommunity_list_name_expanded_all
,
13938 no_ip_lcommunity_list_name_expanded_all_cmd
,
13939 "no ip large-community-list expanded WORD",
13942 LCOMMUNITY_LIST_STR
13943 "Specify expanded large-community-list\n"
13944 "Large Community list name\n")
13946 return lcommunity_list_unset_vty(vty
, argc
, argv
,
13947 LARGE_COMMUNITY_LIST_EXPANDED
);
13950 DEFUN (no_ip_lcommunity_list_standard
,
13951 no_ip_lcommunity_list_standard_cmd
,
13952 "no ip large-community-list (1-99) <deny|permit> AA:AA:NN...",
13955 LCOMMUNITY_LIST_STR
13956 "Large Community list number (standard)\n"
13957 "Specify large community to reject\n"
13958 "Specify large community to accept\n"
13959 LCOMMUNITY_VAL_STR
)
13961 return lcommunity_list_unset_vty(vty
, argc
, argv
,
13962 LARGE_COMMUNITY_LIST_STANDARD
);
13965 DEFUN (no_ip_lcommunity_list_expanded
,
13966 no_ip_lcommunity_list_expanded_cmd
,
13967 "no ip large-community-list (100-500) <deny|permit> LINE...",
13970 LCOMMUNITY_LIST_STR
13971 "Large Community list number (expanded)\n"
13972 "Specify large community to reject\n"
13973 "Specify large community to accept\n"
13974 "An ordered list as a regular-expression\n")
13976 return lcommunity_list_unset_vty(vty
, argc
, argv
,
13977 LARGE_COMMUNITY_LIST_EXPANDED
);
13980 DEFUN (no_ip_lcommunity_list_name_standard
,
13981 no_ip_lcommunity_list_name_standard_cmd
,
13982 "no ip large-community-list standard WORD <deny|permit> AA:AA:NN...",
13985 LCOMMUNITY_LIST_STR
13986 "Specify standard large-community-list\n"
13987 "Large Community list name\n"
13988 "Specify large community to reject\n"
13989 "Specify large community to accept\n"
13990 LCOMMUNITY_VAL_STR
)
13992 return lcommunity_list_unset_vty(vty
, argc
, argv
,
13993 LARGE_COMMUNITY_LIST_STANDARD
);
13996 DEFUN (no_ip_lcommunity_list_name_expanded
,
13997 no_ip_lcommunity_list_name_expanded_cmd
,
13998 "no ip large-community-list expanded WORD <deny|permit> LINE...",
14001 LCOMMUNITY_LIST_STR
14002 "Specify expanded large-community-list\n"
14003 "Large community list name\n"
14004 "Specify large community to reject\n"
14005 "Specify large community to accept\n"
14006 "An ordered list as a regular-expression\n")
14008 return lcommunity_list_unset_vty(vty
, argc
, argv
,
14009 LARGE_COMMUNITY_LIST_EXPANDED
);
14012 static void lcommunity_list_show(struct vty
*vty
, struct community_list
*list
)
14014 struct community_entry
*entry
;
14016 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
14017 if (entry
== list
->head
) {
14018 if (all_digit(list
->name
))
14019 vty_out(vty
, "Large community %s list %s\n",
14020 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
14022 : "(expanded) access",
14026 "Named large community %s list %s\n",
14027 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
14033 vty_out(vty
, " %s\n",
14034 community_direct_str(entry
->direct
));
14036 vty_out(vty
, " %s %s\n",
14037 community_direct_str(entry
->direct
),
14038 community_list_config_str(entry
));
14042 DEFUN (show_ip_lcommunity_list
,
14043 show_ip_lcommunity_list_cmd
,
14044 "show ip large-community-list",
14047 "List large-community list\n")
14049 struct community_list
*list
;
14050 struct community_list_master
*cm
;
14052 cm
= community_list_master_lookup(bgp_clist
,
14053 LARGE_COMMUNITY_LIST_MASTER
);
14055 return CMD_SUCCESS
;
14057 for (list
= cm
->num
.head
; list
; list
= list
->next
)
14058 lcommunity_list_show(vty
, list
);
14060 for (list
= cm
->str
.head
; list
; list
= list
->next
)
14061 lcommunity_list_show(vty
, list
);
14063 return CMD_SUCCESS
;
14066 DEFUN (show_ip_lcommunity_list_arg
,
14067 show_ip_lcommunity_list_arg_cmd
,
14068 "show ip large-community-list <(1-500)|WORD>",
14071 "List large-community list\n"
14072 "large-community-list number\n"
14073 "large-community-list name\n")
14075 struct community_list
*list
;
14077 list
= community_list_lookup(bgp_clist
, argv
[3]->arg
,
14078 LARGE_COMMUNITY_LIST_MASTER
);
14080 vty_out(vty
, "%% Can't find extcommunity-list\n");
14081 return CMD_WARNING
;
14084 lcommunity_list_show(vty
, list
);
14086 return CMD_SUCCESS
;
14089 /* "extcommunity-list" keyword help string. */
14090 #define EXTCOMMUNITY_LIST_STR "Add a extended community list entry\n"
14091 #define EXTCOMMUNITY_VAL_STR "Extended community attribute in 'rt aa:nn_or_IPaddr:nn' OR 'soo aa:nn_or_IPaddr:nn' format\n"
14093 DEFUN (ip_extcommunity_list_standard
,
14094 ip_extcommunity_list_standard_cmd
,
14095 "ip extcommunity-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
14097 EXTCOMMUNITY_LIST_STR
14098 "Extended Community list number (standard)\n"
14099 "Specify standard extcommunity-list\n"
14100 "Community list name\n"
14101 "Specify community to reject\n"
14102 "Specify community to accept\n"
14103 EXTCOMMUNITY_VAL_STR
)
14105 int style
= EXTCOMMUNITY_LIST_STANDARD
;
14107 char *cl_number_or_name
= NULL
;
14110 argv_find(argv
, argc
, "(1-99)", &idx
);
14111 argv_find(argv
, argc
, "WORD", &idx
);
14112 cl_number_or_name
= argv
[idx
]->arg
;
14113 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
14115 argv_find(argv
, argc
, "AA:NN", &idx
);
14116 char *str
= argv_concat(argv
, argc
, idx
);
14118 int ret
= extcommunity_list_set(bgp_clist
, cl_number_or_name
, str
,
14121 XFREE(MTYPE_TMP
, str
);
14124 community_list_perror(vty
, ret
);
14125 return CMD_WARNING_CONFIG_FAILED
;
14128 return CMD_SUCCESS
;
14131 DEFUN (ip_extcommunity_list_name_expanded
,
14132 ip_extcommunity_list_name_expanded_cmd
,
14133 "ip extcommunity-list <(100-500)|expanded WORD> <deny|permit> LINE...",
14135 EXTCOMMUNITY_LIST_STR
14136 "Extended Community list number (expanded)\n"
14137 "Specify expanded extcommunity-list\n"
14138 "Extended Community list name\n"
14139 "Specify community to reject\n"
14140 "Specify community to accept\n"
14141 "An ordered list as a regular-expression\n")
14143 int style
= EXTCOMMUNITY_LIST_EXPANDED
;
14145 char *cl_number_or_name
= NULL
;
14148 argv_find(argv
, argc
, "(100-500)", &idx
);
14149 argv_find(argv
, argc
, "WORD", &idx
);
14150 cl_number_or_name
= argv
[idx
]->arg
;
14151 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
14153 argv_find(argv
, argc
, "LINE", &idx
);
14154 char *str
= argv_concat(argv
, argc
, idx
);
14156 int ret
= extcommunity_list_set(bgp_clist
, cl_number_or_name
, str
,
14159 XFREE(MTYPE_TMP
, str
);
14162 community_list_perror(vty
, ret
);
14163 return CMD_WARNING_CONFIG_FAILED
;
14166 return CMD_SUCCESS
;
14169 DEFUN (no_ip_extcommunity_list_standard_all
,
14170 no_ip_extcommunity_list_standard_all_cmd
,
14171 "no ip extcommunity-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
14174 EXTCOMMUNITY_LIST_STR
14175 "Extended Community list number (standard)\n"
14176 "Specify standard extcommunity-list\n"
14177 "Community list name\n"
14178 "Specify community to reject\n"
14179 "Specify community to accept\n"
14180 EXTCOMMUNITY_VAL_STR
)
14182 int style
= EXTCOMMUNITY_LIST_STANDARD
;
14184 char *cl_number_or_name
= NULL
;
14187 argv_find(argv
, argc
, "(1-99)", &idx
);
14188 argv_find(argv
, argc
, "WORD", &idx
);
14189 cl_number_or_name
= argv
[idx
]->arg
;
14190 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
14192 argv_find(argv
, argc
, "AA:NN", &idx
);
14193 char *str
= argv_concat(argv
, argc
, idx
);
14195 int ret
= extcommunity_list_unset(bgp_clist
, cl_number_or_name
, str
,
14198 XFREE(MTYPE_TMP
, str
);
14201 community_list_perror(vty
, ret
);
14202 return CMD_WARNING_CONFIG_FAILED
;
14205 return CMD_SUCCESS
;
14208 DEFUN (no_ip_extcommunity_list_expanded_all
,
14209 no_ip_extcommunity_list_expanded_all_cmd
,
14210 "no ip extcommunity-list <(100-500)|expanded WORD> <deny|permit> LINE...",
14213 EXTCOMMUNITY_LIST_STR
14214 "Extended Community list number (expanded)\n"
14215 "Specify expanded extcommunity-list\n"
14216 "Extended Community list name\n"
14217 "Specify community to reject\n"
14218 "Specify community to accept\n"
14219 "An ordered list as a regular-expression\n")
14221 int style
= EXTCOMMUNITY_LIST_EXPANDED
;
14223 char *cl_number_or_name
= NULL
;
14226 argv_find(argv
, argc
, "(100-500)", &idx
);
14227 argv_find(argv
, argc
, "WORD", &idx
);
14228 cl_number_or_name
= argv
[idx
]->arg
;
14229 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
14231 argv_find(argv
, argc
, "LINE", &idx
);
14232 char *str
= argv_concat(argv
, argc
, idx
);
14234 int ret
= extcommunity_list_unset(bgp_clist
, cl_number_or_name
, str
,
14237 XFREE(MTYPE_TMP
, str
);
14240 community_list_perror(vty
, ret
);
14241 return CMD_WARNING_CONFIG_FAILED
;
14244 return CMD_SUCCESS
;
14247 static void extcommunity_list_show(struct vty
*vty
, struct community_list
*list
)
14249 struct community_entry
*entry
;
14251 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
14252 if (entry
== list
->head
) {
14253 if (all_digit(list
->name
))
14254 vty_out(vty
, "Extended community %s list %s\n",
14255 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
14257 : "(expanded) access",
14261 "Named extended community %s list %s\n",
14262 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
14268 vty_out(vty
, " %s\n",
14269 community_direct_str(entry
->direct
));
14271 vty_out(vty
, " %s %s\n",
14272 community_direct_str(entry
->direct
),
14273 community_list_config_str(entry
));
14277 DEFUN (show_ip_extcommunity_list
,
14278 show_ip_extcommunity_list_cmd
,
14279 "show ip extcommunity-list",
14282 "List extended-community list\n")
14284 struct community_list
*list
;
14285 struct community_list_master
*cm
;
14287 cm
= community_list_master_lookup(bgp_clist
, EXTCOMMUNITY_LIST_MASTER
);
14289 return CMD_SUCCESS
;
14291 for (list
= cm
->num
.head
; list
; list
= list
->next
)
14292 extcommunity_list_show(vty
, list
);
14294 for (list
= cm
->str
.head
; list
; list
= list
->next
)
14295 extcommunity_list_show(vty
, list
);
14297 return CMD_SUCCESS
;
14300 DEFUN (show_ip_extcommunity_list_arg
,
14301 show_ip_extcommunity_list_arg_cmd
,
14302 "show ip extcommunity-list <(1-500)|WORD>",
14305 "List extended-community list\n"
14306 "Extcommunity-list number\n"
14307 "Extcommunity-list name\n")
14309 int idx_comm_list
= 3;
14310 struct community_list
*list
;
14312 list
= community_list_lookup(bgp_clist
, argv
[idx_comm_list
]->arg
,
14313 EXTCOMMUNITY_LIST_MASTER
);
14315 vty_out(vty
, "%% Can't find extcommunity-list\n");
14316 return CMD_WARNING
;
14319 extcommunity_list_show(vty
, list
);
14321 return CMD_SUCCESS
;
14324 /* Display community-list and extcommunity-list configuration. */
14325 static int community_list_config_write(struct vty
*vty
)
14327 struct community_list
*list
;
14328 struct community_entry
*entry
;
14329 struct community_list_master
*cm
;
14332 /* Community-list. */
14333 cm
= community_list_master_lookup(bgp_clist
, COMMUNITY_LIST_MASTER
);
14335 for (list
= cm
->num
.head
; list
; list
= list
->next
)
14336 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
14337 vty_out(vty
, "ip community-list %s %s %s\n", list
->name
,
14338 community_direct_str(entry
->direct
),
14339 community_list_config_str(entry
));
14342 for (list
= cm
->str
.head
; list
; list
= list
->next
)
14343 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
14344 vty_out(vty
, "ip community-list %s %s %s %s\n",
14345 entry
->style
== COMMUNITY_LIST_STANDARD
14348 list
->name
, community_direct_str(entry
->direct
),
14349 community_list_config_str(entry
));
14353 /* Extcommunity-list. */
14354 cm
= community_list_master_lookup(bgp_clist
, EXTCOMMUNITY_LIST_MASTER
);
14356 for (list
= cm
->num
.head
; list
; list
= list
->next
)
14357 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
14358 vty_out(vty
, "ip extcommunity-list %s %s %s\n",
14359 list
->name
, community_direct_str(entry
->direct
),
14360 community_list_config_str(entry
));
14363 for (list
= cm
->str
.head
; list
; list
= list
->next
)
14364 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
14365 vty_out(vty
, "ip extcommunity-list %s %s %s %s\n",
14366 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
14369 list
->name
, community_direct_str(entry
->direct
),
14370 community_list_config_str(entry
));
14375 /* lcommunity-list. */
14376 cm
= community_list_master_lookup(bgp_clist
,
14377 LARGE_COMMUNITY_LIST_MASTER
);
14379 for (list
= cm
->num
.head
; list
; list
= list
->next
)
14380 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
14381 vty_out(vty
, "ip large-community-list %s %s %s\n",
14382 list
->name
, community_direct_str(entry
->direct
),
14383 community_list_config_str(entry
));
14386 for (list
= cm
->str
.head
; list
; list
= list
->next
)
14387 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
14388 vty_out(vty
, "ip large-community-list %s %s %s %s\n",
14389 entry
->style
== LARGE_COMMUNITY_LIST_STANDARD
14392 list
->name
, community_direct_str(entry
->direct
),
14393 community_list_config_str(entry
));
14400 static struct cmd_node community_list_node
= {
14401 COMMUNITY_LIST_NODE
, "", 1 /* Export to vtysh. */
14404 static void community_list_vty(void)
14406 install_node(&community_list_node
, community_list_config_write
);
14408 /* Community-list. */
14409 install_element(CONFIG_NODE
, &ip_community_list_standard_cmd
);
14410 install_element(CONFIG_NODE
, &ip_community_list_expanded_all_cmd
);
14411 install_element(CONFIG_NODE
, &no_ip_community_list_standard_all_cmd
);
14412 install_element(CONFIG_NODE
, &no_ip_community_list_expanded_all_cmd
);
14413 install_element(VIEW_NODE
, &show_ip_community_list_cmd
);
14414 install_element(VIEW_NODE
, &show_ip_community_list_arg_cmd
);
14416 /* Extcommunity-list. */
14417 install_element(CONFIG_NODE
, &ip_extcommunity_list_standard_cmd
);
14418 install_element(CONFIG_NODE
, &ip_extcommunity_list_name_expanded_cmd
);
14419 install_element(CONFIG_NODE
, &no_ip_extcommunity_list_standard_all_cmd
);
14420 install_element(CONFIG_NODE
, &no_ip_extcommunity_list_expanded_all_cmd
);
14421 install_element(VIEW_NODE
, &show_ip_extcommunity_list_cmd
);
14422 install_element(VIEW_NODE
, &show_ip_extcommunity_list_arg_cmd
);
14424 /* Large Community List */
14425 install_element(CONFIG_NODE
, &ip_lcommunity_list_standard_cmd
);
14426 install_element(CONFIG_NODE
, &ip_lcommunity_list_standard1_cmd
);
14427 install_element(CONFIG_NODE
, &ip_lcommunity_list_expanded_cmd
);
14428 install_element(CONFIG_NODE
, &ip_lcommunity_list_name_standard_cmd
);
14429 install_element(CONFIG_NODE
, &ip_lcommunity_list_name_standard1_cmd
);
14430 install_element(CONFIG_NODE
, &ip_lcommunity_list_name_expanded_cmd
);
14431 install_element(CONFIG_NODE
, &no_ip_lcommunity_list_standard_all_cmd
);
14432 install_element(CONFIG_NODE
,
14433 &no_ip_lcommunity_list_name_expanded_all_cmd
);
14434 install_element(CONFIG_NODE
, &no_ip_lcommunity_list_standard_cmd
);
14435 install_element(CONFIG_NODE
, &no_ip_lcommunity_list_expanded_cmd
);
14436 install_element(CONFIG_NODE
, &no_ip_lcommunity_list_name_standard_cmd
);
14437 install_element(CONFIG_NODE
, &no_ip_lcommunity_list_name_expanded_cmd
);
14438 install_element(VIEW_NODE
, &show_ip_lcommunity_list_cmd
);
14439 install_element(VIEW_NODE
, &show_ip_lcommunity_list_arg_cmd
);