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
25 #include "lib/zclient.h"
34 #include "memory_vty.h"
40 #include "bgpd/bgpd.h"
41 #include "bgpd/bgp_attr_evpn.h"
42 #include "bgpd/bgp_advertise.h"
43 #include "bgpd/bgp_attr.h"
44 #include "bgpd/bgp_aspath.h"
45 #include "bgpd/bgp_community.h"
46 #include "bgpd/bgp_ecommunity.h"
47 #include "bgpd/bgp_lcommunity.h"
48 #include "bgpd/bgp_damp.h"
49 #include "bgpd/bgp_debug.h"
50 #include "bgpd/bgp_errors.h"
51 #include "bgpd/bgp_fsm.h"
52 #include "bgpd/bgp_nexthop.h"
53 #include "bgpd/bgp_open.h"
54 #include "bgpd/bgp_regex.h"
55 #include "bgpd/bgp_route.h"
56 #include "bgpd/bgp_mplsvpn.h"
57 #include "bgpd/bgp_zebra.h"
58 #include "bgpd/bgp_table.h"
59 #include "bgpd/bgp_vty.h"
60 #include "bgpd/bgp_mpath.h"
61 #include "bgpd/bgp_packet.h"
62 #include "bgpd/bgp_updgrp.h"
63 #include "bgpd/bgp_bfd.h"
64 #include "bgpd/bgp_io.h"
65 #include "bgpd/bgp_evpn.h"
66 #include "bgpd/bgp_addpath.h"
67 #include "bgpd/bgp_mac.h"
69 static struct peer_group
*listen_range_exists(struct bgp
*bgp
,
70 struct prefix
*range
, int exact
);
72 static enum node_type
bgp_node_type(afi_t afi
, safi_t safi
)
81 return BGP_IPV4M_NODE
;
83 case SAFI_LABELED_UNICAST
:
84 return BGP_IPV4L_NODE
;
87 return BGP_VPNV4_NODE
;
90 return BGP_FLOWSPECV4_NODE
;
100 return BGP_IPV6_NODE
;
103 return BGP_IPV6M_NODE
;
105 case SAFI_LABELED_UNICAST
:
106 return BGP_IPV6L_NODE
;
109 return BGP_VPNV6_NODE
;
112 return BGP_FLOWSPECV6_NODE
;
115 return BGP_IPV4_NODE
;
120 return BGP_EVPN_NODE
;
124 // We should never be here but to clarify the switch statement..
125 return BGP_IPV4_NODE
;
129 // Impossible to happen
130 return BGP_IPV4_NODE
;
133 /* Utility function to get address family from current node. */
134 afi_t
bgp_node_afi(struct vty
*vty
)
142 case BGP_FLOWSPECV6_NODE
:
155 /* Utility function to get subsequent address family from current
157 safi_t
bgp_node_safi(struct vty
*vty
)
163 safi
= SAFI_MPLS_VPN
;
167 safi
= SAFI_MULTICAST
;
174 safi
= SAFI_LABELED_UNICAST
;
176 case BGP_FLOWSPECV4_NODE
:
177 case BGP_FLOWSPECV6_NODE
:
178 safi
= SAFI_FLOWSPEC
;
188 * Converts an AFI in string form to afi_t
190 * @param afi string, one of
194 * @return the corresponding afi_t
196 afi_t
bgp_vty_afi_from_str(const char *afi_str
)
198 afi_t afi
= AFI_MAX
; /* unknown */
199 if (strmatch(afi_str
, "ipv4"))
201 else if (strmatch(afi_str
, "ipv6"))
203 else if (strmatch(afi_str
, "l2vpn"))
208 int argv_find_and_parse_afi(struct cmd_token
**argv
, int argc
, int *index
,
212 if (argv_find(argv
, argc
, "ipv4", index
)) {
216 } else if (argv_find(argv
, argc
, "ipv6", index
)) {
220 } else if (argv_find(argv
, argc
, "l2vpn", index
)) {
228 /* supports <unicast|multicast|vpn|labeled-unicast> */
229 safi_t
bgp_vty_safi_from_str(const char *safi_str
)
231 safi_t safi
= SAFI_MAX
; /* unknown */
232 if (strmatch(safi_str
, "multicast"))
233 safi
= SAFI_MULTICAST
;
234 else if (strmatch(safi_str
, "unicast"))
236 else if (strmatch(safi_str
, "vpn"))
237 safi
= SAFI_MPLS_VPN
;
238 else if (strmatch(safi_str
, "evpn"))
240 else if (strmatch(safi_str
, "labeled-unicast"))
241 safi
= SAFI_LABELED_UNICAST
;
242 else if (strmatch(safi_str
, "flowspec"))
243 safi
= SAFI_FLOWSPEC
;
247 int argv_find_and_parse_safi(struct cmd_token
**argv
, int argc
, int *index
,
251 if (argv_find(argv
, argc
, "unicast", index
)) {
254 *safi
= SAFI_UNICAST
;
255 } else if (argv_find(argv
, argc
, "multicast", index
)) {
258 *safi
= SAFI_MULTICAST
;
259 } else if (argv_find(argv
, argc
, "labeled-unicast", index
)) {
262 *safi
= SAFI_LABELED_UNICAST
;
263 } else if (argv_find(argv
, argc
, "vpn", index
)) {
266 *safi
= SAFI_MPLS_VPN
;
267 } else if (argv_find(argv
, argc
, "evpn", index
)) {
271 } else if (argv_find(argv
, argc
, "flowspec", index
)) {
274 *safi
= SAFI_FLOWSPEC
;
280 * bgp_vty_find_and_parse_afi_safi_bgp
282 * For a given 'show ...' command, correctly parse the afi/safi/bgp out from it
283 * This function *assumes* that the calling function pre-sets the afi/safi/bgp
284 * to appropriate values for the calling function. This is to allow the
285 * calling function to make decisions appropriate for the show command
286 * that is being parsed.
288 * The show commands are generally of the form:
289 * "show [ip] bgp [<view|vrf> VIEWVRFNAME] [<ipv4|ipv6>
290 * [<unicast|multicast|vpn|labeled-unicast>]] ..."
292 * Since we use argv_find if the show command in particular doesn't have:
294 * [<view|vrf> VIEWVRFNAME]
295 * [<ipv4|ipv6> [<unicast|multicast|vpn|labeled-unicast>]]
296 * The command parsing should still be ok.
298 * vty -> The vty for the command so we can output some useful data in
299 * the event of a parse error in the vrf.
300 * argv -> The command tokens
301 * argc -> How many command tokens we have
302 * idx -> The current place in the command, generally should be 0 for this
304 * afi -> The parsed afi if it was included in the show command, returned here
305 * safi -> The parsed safi if it was included in the show command, returned here
306 * bgp -> Pointer to the bgp data structure we need to fill in.
307 * use_json -> json is configured or not
309 * The function returns the correct location in the parse tree for the
312 * Returns 0 for failure to parse correctly, else the idx position of where
313 * it found the last token.
315 int bgp_vty_find_and_parse_afi_safi_bgp(struct vty
*vty
,
316 struct cmd_token
**argv
, int argc
,
317 int *idx
, afi_t
*afi
, safi_t
*safi
,
318 struct bgp
**bgp
, bool use_json
)
320 char *vrf_name
= NULL
;
326 if (argv_find(argv
, argc
, "ip", idx
))
329 if (argv_find(argv
, argc
, "view", idx
))
330 vrf_name
= argv
[*idx
+ 1]->arg
;
331 else if (argv_find(argv
, argc
, "vrf", idx
)) {
332 vrf_name
= argv
[*idx
+ 1]->arg
;
333 if (strmatch(vrf_name
, VRF_DEFAULT_NAME
))
337 if (strmatch(vrf_name
, "all"))
340 *bgp
= bgp_lookup_by_name(vrf_name
);
343 json_object
*json
= NULL
;
344 json
= json_object_new_object();
345 json_object_string_add(
347 "View/Vrf is unknown");
349 json_object_to_json_string_ext(json
,
350 JSON_C_TO_STRING_PRETTY
));
351 json_object_free(json
);
354 vty_out(vty
, "View/Vrf %s is unknown\n",
361 *bgp
= bgp_get_default();
364 json_object
*json
= NULL
;
365 json
= json_object_new_object();
366 json_object_string_add(
368 "Default BGP instance not found");
370 json_object_to_json_string_ext(json
,
371 JSON_C_TO_STRING_PRETTY
));
372 json_object_free(json
);
376 "Default BGP instance not found\n");
382 if (argv_find_and_parse_afi(argv
, argc
, idx
, afi
))
383 argv_find_and_parse_safi(argv
, argc
, idx
, safi
);
389 static int peer_address_self_check(struct bgp
*bgp
, union sockunion
*su
)
391 struct interface
*ifp
= NULL
;
393 if (su
->sa
.sa_family
== AF_INET
)
394 ifp
= if_lookup_by_ipv4_exact(&su
->sin
.sin_addr
, bgp
->vrf_id
);
395 else if (su
->sa
.sa_family
== AF_INET6
)
396 ifp
= if_lookup_by_ipv6_exact(&su
->sin6
.sin6_addr
,
397 su
->sin6
.sin6_scope_id
,
406 /* Utility function for looking up peer from VTY. */
407 /* This is used only for configuration, so disallow if attempted on
408 * a dynamic neighbor.
410 static struct peer
*peer_lookup_vty(struct vty
*vty
, const char *ip_str
)
412 struct bgp
*bgp
= VTY_GET_CONTEXT(bgp
);
421 ret
= str2sockunion(ip_str
, &su
);
423 peer
= peer_lookup_by_conf_if(bgp
, ip_str
);
425 if ((peer
= peer_lookup_by_hostname(bgp
, ip_str
))
428 "%% Malformed address or name: %s\n",
434 peer
= peer_lookup(bgp
, &su
);
437 "%% Specify remote-as or peer-group commands first\n");
440 if (peer_dynamic_neighbor(peer
)) {
442 "%% Operation not allowed on a dynamic neighbor\n");
449 /* Utility function for looking up peer or peer group. */
450 /* This is used only for configuration, so disallow if attempted on
451 * a dynamic neighbor.
453 struct peer
*peer_and_group_lookup_vty(struct vty
*vty
, const char *peer_str
)
455 struct bgp
*bgp
= VTY_GET_CONTEXT(bgp
);
458 struct peer
*peer
= NULL
;
459 struct peer_group
*group
= NULL
;
465 ret
= str2sockunion(peer_str
, &su
);
467 /* IP address, locate peer. */
468 peer
= peer_lookup(bgp
, &su
);
470 /* Not IP, could match either peer configured on interface or a
472 peer
= peer_lookup_by_conf_if(bgp
, peer_str
);
474 group
= peer_group_lookup(bgp
, peer_str
);
478 if (peer_dynamic_neighbor(peer
)) {
480 "%% Operation not allowed on a dynamic neighbor\n");
490 vty_out(vty
, "%% Specify remote-as or peer-group commands first\n");
495 int bgp_vty_return(struct vty
*vty
, int ret
)
497 const char *str
= NULL
;
500 case BGP_ERR_INVALID_VALUE
:
501 str
= "Invalid value";
503 case BGP_ERR_INVALID_FLAG
:
504 str
= "Invalid flag";
506 case BGP_ERR_PEER_GROUP_SHUTDOWN
:
507 str
= "Peer-group has been shutdown. Activate the peer-group first";
509 case BGP_ERR_PEER_FLAG_CONFLICT
:
510 str
= "Can't set override-capability and strict-capability-match at the same time";
512 case BGP_ERR_PEER_GROUP_NO_REMOTE_AS
:
513 str
= "Specify remote-as or peer-group remote AS first";
515 case BGP_ERR_PEER_GROUP_CANT_CHANGE
:
516 str
= "Cannot change the peer-group. Deconfigure first";
518 case BGP_ERR_PEER_GROUP_MISMATCH
:
519 str
= "Peer is not a member of this peer-group";
521 case BGP_ERR_PEER_FILTER_CONFLICT
:
522 str
= "Prefix/distribute list can not co-exist";
524 case BGP_ERR_NOT_INTERNAL_PEER
:
525 str
= "Invalid command. Not an internal neighbor";
527 case BGP_ERR_REMOVE_PRIVATE_AS
:
528 str
= "remove-private-AS cannot be configured for IBGP peers";
530 case BGP_ERR_LOCAL_AS_ALLOWED_ONLY_FOR_EBGP
:
531 str
= "Local-AS allowed only for EBGP peers";
533 case BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS
:
534 str
= "Cannot have local-as same as BGP AS number";
536 case BGP_ERR_TCPSIG_FAILED
:
537 str
= "Error while applying TCP-Sig to session(s)";
539 case BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
:
540 str
= "ebgp-multihop and ttl-security cannot be configured together";
542 case BGP_ERR_NO_IBGP_WITH_TTLHACK
:
543 str
= "ttl-security only allowed for EBGP peers";
545 case BGP_ERR_AS_OVERRIDE
:
546 str
= "as-override cannot be configured for IBGP peers";
548 case BGP_ERR_INVALID_DYNAMIC_NEIGHBORS_LIMIT
:
549 str
= "Invalid limit for number of dynamic neighbors";
551 case BGP_ERR_DYNAMIC_NEIGHBORS_RANGE_EXISTS
:
552 str
= "Dynamic neighbor listen range already exists";
554 case BGP_ERR_INVALID_FOR_DYNAMIC_PEER
:
555 str
= "Operation not allowed on a dynamic neighbor";
557 case BGP_ERR_INVALID_FOR_DIRECT_PEER
:
558 str
= "Operation not allowed on a directly connected neighbor";
560 case BGP_ERR_PEER_SAFI_CONFLICT
:
561 str
= "Cannot activate peer for both 'ipv4 unicast' and 'ipv4 labeled-unicast'";
565 vty_out(vty
, "%% %s\n", str
);
566 return CMD_WARNING_CONFIG_FAILED
;
571 /* BGP clear sort. */
580 static void bgp_clear_vty_error(struct vty
*vty
, struct peer
*peer
, afi_t afi
,
581 safi_t safi
, int error
)
584 case BGP_ERR_AF_UNCONFIGURED
:
586 "%%BGP: Enable %s address family for the neighbor %s\n",
587 afi_safi_print(afi
, safi
), peer
->host
);
589 case BGP_ERR_SOFT_RECONFIG_UNCONFIGURED
:
591 "%%BGP: Inbound soft reconfig for %s not possible as it\n has neither refresh capability, nor inbound soft reconfig\n",
599 /* `clear ip bgp' functions. */
600 static int bgp_clear(struct vty
*vty
, struct bgp
*bgp
, afi_t afi
, safi_t safi
,
601 enum clear_sort sort
, enum bgp_clear_type stype
,
607 struct listnode
*node
, *nnode
;
609 /* Clear all neighbors. */
611 * Pass along pointer to next node to peer_clear() when walking all
612 * nodes on the BGP instance as that may get freed if it is a
615 if (sort
== clear_all
) {
616 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
617 if (!peer
->afc
[afi
][safi
])
620 if (stype
== BGP_CLEAR_SOFT_NONE
)
621 ret
= peer_clear(peer
, &nnode
);
623 ret
= peer_clear_soft(peer
, afi
, safi
, stype
);
626 bgp_clear_vty_error(vty
, peer
, afi
, safi
, ret
);
631 /* This is to apply read-only mode on this clear. */
632 if (stype
== BGP_CLEAR_SOFT_NONE
)
633 bgp
->update_delay_over
= 0;
636 vty_out(vty
, "%%BGP: No %s peer configured\n",
637 afi_safi_print(afi
, safi
));
642 /* Clear specified neighbor. */
643 if (sort
== clear_peer
) {
646 /* Make sockunion for lookup. */
647 ret
= str2sockunion(arg
, &su
);
649 peer
= peer_lookup_by_conf_if(bgp
, arg
);
651 peer
= peer_lookup_by_hostname(bgp
, arg
);
654 "Malformed address or name: %s\n",
660 peer
= peer_lookup(bgp
, &su
);
663 "%%BGP: Unknown neighbor - \"%s\"\n",
669 if (!peer
->afc
[afi
][safi
])
670 ret
= BGP_ERR_AF_UNCONFIGURED
;
671 else if (stype
== BGP_CLEAR_SOFT_NONE
)
672 ret
= peer_clear(peer
, NULL
);
674 ret
= peer_clear_soft(peer
, afi
, safi
, stype
);
677 bgp_clear_vty_error(vty
, peer
, afi
, safi
, ret
);
682 /* Clear all neighbors belonging to a specific peer-group. */
683 if (sort
== clear_group
) {
684 struct peer_group
*group
;
686 group
= peer_group_lookup(bgp
, arg
);
688 vty_out(vty
, "%%BGP: No such peer-group %s\n", arg
);
692 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
693 if (!peer
->afc
[afi
][safi
])
696 if (stype
== BGP_CLEAR_SOFT_NONE
)
697 ret
= peer_clear(peer
, NULL
);
699 ret
= peer_clear_soft(peer
, afi
, safi
, stype
);
702 bgp_clear_vty_error(vty
, peer
, afi
, safi
, ret
);
709 "%%BGP: No %s peer belonging to peer-group %s is configured\n",
710 afi_safi_print(afi
, safi
), arg
);
715 /* Clear all external (eBGP) neighbors. */
716 if (sort
== clear_external
) {
717 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
718 if (peer
->sort
== BGP_PEER_IBGP
)
721 if (!peer
->afc
[afi
][safi
])
724 if (stype
== BGP_CLEAR_SOFT_NONE
)
725 ret
= peer_clear(peer
, &nnode
);
727 ret
= peer_clear_soft(peer
, afi
, safi
, stype
);
730 bgp_clear_vty_error(vty
, peer
, afi
, safi
, ret
);
737 "%%BGP: No external %s peer is configured\n",
738 afi_safi_print(afi
, safi
));
743 /* Clear all neighbors belonging to a specific AS. */
744 if (sort
== clear_as
) {
745 as_t as
= strtoul(arg
, NULL
, 10);
747 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
751 if (!peer
->afc
[afi
][safi
])
752 ret
= BGP_ERR_AF_UNCONFIGURED
;
753 else if (stype
== BGP_CLEAR_SOFT_NONE
)
754 ret
= peer_clear(peer
, &nnode
);
756 ret
= peer_clear_soft(peer
, afi
, safi
, stype
);
759 bgp_clear_vty_error(vty
, peer
, afi
, safi
, ret
);
766 "%%BGP: No %s peer is configured with AS %s\n",
767 afi_safi_print(afi
, safi
), arg
);
775 static int bgp_clear_vty(struct vty
*vty
, const char *name
, afi_t afi
,
776 safi_t safi
, enum clear_sort sort
,
777 enum bgp_clear_type stype
, const char *arg
)
781 /* BGP structure lookup. */
783 bgp
= bgp_lookup_by_name(name
);
785 vty_out(vty
, "Can't find BGP instance %s\n", name
);
789 bgp
= bgp_get_default();
791 vty_out(vty
, "No BGP process is configured\n");
796 return bgp_clear(vty
, bgp
, afi
, safi
, sort
, stype
, arg
);
799 /* clear soft inbound */
800 static void bgp_clear_star_soft_in(struct vty
*vty
, const char *name
)
805 FOREACH_AFI_SAFI (afi
, safi
)
806 bgp_clear_vty(vty
, name
, afi
, safi
, clear_all
,
807 BGP_CLEAR_SOFT_IN
, NULL
);
810 /* clear soft outbound */
811 static void bgp_clear_star_soft_out(struct vty
*vty
, const char *name
)
816 FOREACH_AFI_SAFI (afi
, safi
)
817 bgp_clear_vty(vty
, name
, afi
, safi
, clear_all
,
818 BGP_CLEAR_SOFT_OUT
, NULL
);
822 #ifndef VTYSH_EXTRACT_PL
823 #include "bgpd/bgp_vty_clippy.c"
826 DEFUN_HIDDEN (bgp_local_mac
,
828 "bgp local-mac vni " CMD_VNI_RANGE
" mac WORD seq (0-4294967295)",
831 "VxLAN Network Identifier\n"
835 "mac-mobility sequence\n"
845 vni
= strtoul(argv
[3]->arg
, NULL
, 10);
846 if (!prefix_str2mac(argv
[5]->arg
, &mac
)) {
847 vty_out(vty
, "%% Malformed MAC address\n");
850 memset(&ip
, 0, sizeof(ip
));
851 seq
= strtoul(argv
[7]->arg
, NULL
, 10);
853 bgp
= bgp_get_default();
855 vty_out(vty
, "Default BGP instance is not there\n");
859 rv
= bgp_evpn_local_macip_add(bgp
, vni
, &mac
, &ip
, 0 /* flags */, seq
);
861 vty_out(vty
, "Internal error\n");
868 DEFUN_HIDDEN (no_bgp_local_mac
,
869 no_bgp_local_mac_cmd
,
870 "no bgp local-mac vni " CMD_VNI_RANGE
" mac WORD",
874 "VxLAN Network Identifier\n"
885 vni
= strtoul(argv
[4]->arg
, NULL
, 10);
886 if (!prefix_str2mac(argv
[6]->arg
, &mac
)) {
887 vty_out(vty
, "%% Malformed MAC address\n");
890 memset(&ip
, 0, sizeof(ip
));
892 bgp
= bgp_get_default();
894 vty_out(vty
, "Default BGP instance is not there\n");
898 rv
= bgp_evpn_local_macip_del(bgp
, vni
, &mac
, &ip
, ZEBRA_NEIGH_ACTIVE
);
900 vty_out(vty
, "Internal error\n");
907 DEFUN (no_synchronization
,
908 no_synchronization_cmd
,
909 "no synchronization",
911 "Perform IGP synchronization\n")
916 DEFUN (no_auto_summary
,
920 "Enable automatic network number summarization\n")
925 /* "router bgp" commands. */
926 DEFUN_NOSH (router_bgp
,
928 "router bgp [(1-4294967295) [<view|vrf> VIEWVRFNAME]]",
932 BGP_INSTANCE_HELP_STR
)
935 int idx_view_vrf
= 3;
941 const char *name
= NULL
;
942 enum bgp_instance_type inst_type
;
944 // "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
;
962 as
= strtoul(argv
[idx_asn
]->arg
, NULL
, 10);
964 inst_type
= BGP_INSTANCE_TYPE_DEFAULT
;
966 name
= argv
[idx_vrf
]->arg
;
968 if (!strcmp(argv
[idx_view_vrf
]->text
, "vrf")) {
969 if (strmatch(name
, VRF_DEFAULT_NAME
))
972 inst_type
= BGP_INSTANCE_TYPE_VRF
;
973 } else if (!strcmp(argv
[idx_view_vrf
]->text
, "view"))
974 inst_type
= BGP_INSTANCE_TYPE_VIEW
;
977 if (inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
978 is_new_bgp
= (bgp_lookup(as
, name
) == NULL
);
980 ret
= bgp_get(&bgp
, &as
, name
, inst_type
);
982 case BGP_ERR_MULTIPLE_INSTANCE_NOT_SET
:
984 "Please specify 'bgp multiple-instance' first\n");
985 return CMD_WARNING_CONFIG_FAILED
;
986 case BGP_ERR_AS_MISMATCH
:
987 vty_out(vty
, "BGP is already running; AS is %u\n", as
);
988 return CMD_WARNING_CONFIG_FAILED
;
989 case BGP_ERR_INSTANCE_MISMATCH
:
991 "BGP instance name and AS number mismatch\n");
993 "BGP instance is already running; AS is %u\n",
995 return CMD_WARNING_CONFIG_FAILED
;
999 * If we just instantiated the default instance, complete
1000 * any pending VRF-VPN leaking that was configured via
1001 * earlier "router bgp X vrf FOO" blocks.
1003 if (is_new_bgp
&& inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
1004 vpn_leak_postchange_all();
1006 /* Pending: handle when user tries to change a view to vrf n vv.
1010 /* unset the auto created flag as the user config is now present */
1011 UNSET_FLAG(bgp
->vrf_flags
, BGP_VRF_AUTO
);
1012 VTY_PUSH_CONTEXT(BGP_NODE
, bgp
);
1017 /* "no router bgp" commands. */
1018 DEFUN (no_router_bgp
,
1020 "no router bgp [(1-4294967295) [<view|vrf> VIEWVRFNAME]]",
1025 BGP_INSTANCE_HELP_STR
)
1031 const char *name
= NULL
;
1033 // "no router bgp" without an ASN
1035 // Pending: Make VRF option available for ASN less config
1036 bgp
= bgp_get_default();
1039 vty_out(vty
, "%% No BGP process is configured\n");
1040 return CMD_WARNING_CONFIG_FAILED
;
1043 if (listcount(bm
->bgp
) > 1) {
1044 vty_out(vty
, "%% Please specify ASN and VRF\n");
1045 return CMD_WARNING_CONFIG_FAILED
;
1049 vty_out(vty
, "%% Please unconfigure l3vni %u",
1051 return CMD_WARNING_CONFIG_FAILED
;
1054 as
= strtoul(argv
[idx_asn
]->arg
, NULL
, 10);
1057 name
= argv
[idx_vrf
]->arg
;
1059 /* Lookup bgp structure. */
1060 bgp
= bgp_lookup(as
, name
);
1062 vty_out(vty
, "%% Can't find BGP instance\n");
1063 return CMD_WARNING_CONFIG_FAILED
;
1067 vty_out(vty
, "%% Please unconfigure l3vni %u\n",
1069 return CMD_WARNING_CONFIG_FAILED
;
1072 /* Cannot delete default instance if vrf instances exist */
1073 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
) {
1074 struct listnode
*node
;
1075 struct bgp
*tmp_bgp
;
1077 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, node
, tmp_bgp
)) {
1078 if (tmp_bgp
->inst_type
1079 == BGP_INSTANCE_TYPE_VRF
) {
1081 "%% Cannot delete default BGP instance. Dependent VRF instances exist\n");
1082 return CMD_WARNING_CONFIG_FAILED
;
1094 /* BGP router-id. */
1096 DEFPY (bgp_router_id
,
1098 "bgp router-id A.B.C.D",
1100 "Override configured router identifier\n"
1101 "Manually configured router identifier\n")
1103 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1104 bgp_router_id_static_set(bgp
, router_id
);
1108 DEFPY (no_bgp_router_id
,
1109 no_bgp_router_id_cmd
,
1110 "no bgp router-id [A.B.C.D]",
1113 "Override configured router identifier\n"
1114 "Manually configured router identifier\n")
1116 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1118 if (router_id_str
) {
1119 if (!IPV4_ADDR_SAME(&bgp
->router_id_static
, &router_id
)) {
1120 vty_out(vty
, "%% BGP router-id doesn't match\n");
1121 return CMD_WARNING_CONFIG_FAILED
;
1125 router_id
.s_addr
= 0;
1126 bgp_router_id_static_set(bgp
, router_id
);
1132 /* BGP Cluster ID. */
1133 DEFUN (bgp_cluster_id
,
1135 "bgp cluster-id <A.B.C.D|(1-4294967295)>",
1137 "Configure Route-Reflector Cluster-id\n"
1138 "Route-Reflector Cluster-id in IP address format\n"
1139 "Route-Reflector Cluster-id as 32 bit quantity\n")
1141 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1144 struct in_addr cluster
;
1146 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &cluster
);
1148 vty_out(vty
, "%% Malformed bgp cluster identifier\n");
1149 return CMD_WARNING_CONFIG_FAILED
;
1152 bgp_cluster_id_set(bgp
, &cluster
);
1153 bgp_clear_star_soft_out(vty
, bgp
->name
);
1158 DEFUN (no_bgp_cluster_id
,
1159 no_bgp_cluster_id_cmd
,
1160 "no bgp cluster-id [<A.B.C.D|(1-4294967295)>]",
1163 "Configure Route-Reflector Cluster-id\n"
1164 "Route-Reflector Cluster-id in IP address format\n"
1165 "Route-Reflector Cluster-id as 32 bit quantity\n")
1167 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1168 bgp_cluster_id_unset(bgp
);
1169 bgp_clear_star_soft_out(vty
, bgp
->name
);
1174 DEFUN (bgp_confederation_identifier
,
1175 bgp_confederation_identifier_cmd
,
1176 "bgp confederation identifier (1-4294967295)",
1177 "BGP specific commands\n"
1178 "AS confederation parameters\n"
1180 "Set routing domain confederation AS\n")
1182 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1186 as
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1188 bgp_confederation_id_set(bgp
, as
);
1193 DEFUN (no_bgp_confederation_identifier
,
1194 no_bgp_confederation_identifier_cmd
,
1195 "no bgp confederation identifier [(1-4294967295)]",
1197 "BGP specific commands\n"
1198 "AS confederation parameters\n"
1200 "Set routing domain confederation AS\n")
1202 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1203 bgp_confederation_id_unset(bgp
);
1208 DEFUN (bgp_confederation_peers
,
1209 bgp_confederation_peers_cmd
,
1210 "bgp confederation peers (1-4294967295)...",
1211 "BGP specific commands\n"
1212 "AS confederation parameters\n"
1213 "Peer ASs in BGP confederation\n"
1216 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1221 for (i
= idx_asn
; i
< argc
; i
++) {
1222 as
= strtoul(argv
[i
]->arg
, NULL
, 10);
1224 if (bgp
->as
== as
) {
1226 "%% Local member-AS not allowed in confed peer list\n");
1230 bgp_confederation_peers_add(bgp
, as
);
1235 DEFUN (no_bgp_confederation_peers
,
1236 no_bgp_confederation_peers_cmd
,
1237 "no bgp confederation peers (1-4294967295)...",
1239 "BGP specific commands\n"
1240 "AS confederation parameters\n"
1241 "Peer ASs in BGP confederation\n"
1244 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1249 for (i
= idx_asn
; i
< argc
; i
++) {
1250 as
= strtoul(argv
[i
]->arg
, NULL
, 10);
1252 bgp_confederation_peers_remove(bgp
, as
);
1258 * Central routine for maximum-paths configuration.
1259 * @peer_type: BGP_PEER_EBGP or BGP_PEER_IBGP
1260 * @set: 1 for setting values, 0 for removing the max-paths config.
1262 static int bgp_maxpaths_config_vty(struct vty
*vty
, int peer_type
,
1263 const char *mpaths
, uint16_t options
,
1266 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1267 uint16_t maxpaths
= 0;
1272 afi
= bgp_node_afi(vty
);
1273 safi
= bgp_node_safi(vty
);
1276 maxpaths
= strtol(mpaths
, NULL
, 10);
1277 if (maxpaths
> multipath_num
) {
1279 "%% Maxpaths Specified: %d is > than multipath num specified on bgp command line %d",
1280 maxpaths
, multipath_num
);
1281 return CMD_WARNING_CONFIG_FAILED
;
1283 ret
= bgp_maximum_paths_set(bgp
, afi
, safi
, peer_type
, maxpaths
,
1286 ret
= bgp_maximum_paths_unset(bgp
, afi
, safi
, peer_type
);
1290 "%% Failed to %sset maximum-paths %s %u for afi %u, safi %u\n",
1291 (set
== 1) ? "" : "un",
1292 (peer_type
== BGP_PEER_EBGP
) ? "ebgp" : "ibgp",
1293 maxpaths
, afi
, safi
);
1294 return CMD_WARNING_CONFIG_FAILED
;
1297 bgp_recalculate_all_bestpaths(bgp
);
1302 DEFUN (bgp_maxmed_admin
,
1303 bgp_maxmed_admin_cmd
,
1304 "bgp max-med administrative ",
1306 "Advertise routes with max-med\n"
1307 "Administratively applied, for an indefinite period\n")
1309 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1311 bgp
->v_maxmed_admin
= 1;
1312 bgp
->maxmed_admin_value
= BGP_MAXMED_VALUE_DEFAULT
;
1314 bgp_maxmed_update(bgp
);
1319 DEFUN (bgp_maxmed_admin_medv
,
1320 bgp_maxmed_admin_medv_cmd
,
1321 "bgp max-med administrative (0-4294967295)",
1323 "Advertise routes with max-med\n"
1324 "Administratively applied, for an indefinite period\n"
1325 "Max MED value to be used\n")
1327 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1330 bgp
->v_maxmed_admin
= 1;
1331 bgp
->maxmed_admin_value
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1333 bgp_maxmed_update(bgp
);
1338 DEFUN (no_bgp_maxmed_admin
,
1339 no_bgp_maxmed_admin_cmd
,
1340 "no bgp max-med administrative [(0-4294967295)]",
1343 "Advertise routes with max-med\n"
1344 "Administratively applied, for an indefinite period\n"
1345 "Max MED value to be used\n")
1347 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1348 bgp
->v_maxmed_admin
= BGP_MAXMED_ADMIN_UNCONFIGURED
;
1349 bgp
->maxmed_admin_value
= BGP_MAXMED_VALUE_DEFAULT
;
1350 bgp_maxmed_update(bgp
);
1355 DEFUN (bgp_maxmed_onstartup
,
1356 bgp_maxmed_onstartup_cmd
,
1357 "bgp max-med on-startup (5-86400) [(0-4294967295)]",
1359 "Advertise routes with max-med\n"
1360 "Effective on a startup\n"
1361 "Time (seconds) period for max-med\n"
1362 "Max MED value to be used\n")
1364 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1367 argv_find(argv
, argc
, "(5-86400)", &idx
);
1368 bgp
->v_maxmed_onstartup
= strtoul(argv
[idx
]->arg
, NULL
, 10);
1369 if (argv_find(argv
, argc
, "(0-4294967295)", &idx
))
1370 bgp
->maxmed_onstartup_value
= strtoul(argv
[idx
]->arg
, NULL
, 10);
1372 bgp
->maxmed_onstartup_value
= BGP_MAXMED_VALUE_DEFAULT
;
1374 bgp_maxmed_update(bgp
);
1379 DEFUN (no_bgp_maxmed_onstartup
,
1380 no_bgp_maxmed_onstartup_cmd
,
1381 "no bgp max-med on-startup [(5-86400) [(0-4294967295)]]",
1384 "Advertise routes with max-med\n"
1385 "Effective on a startup\n"
1386 "Time (seconds) period for max-med\n"
1387 "Max MED value to be used\n")
1389 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1391 /* Cancel max-med onstartup if its on */
1392 if (bgp
->t_maxmed_onstartup
) {
1393 THREAD_TIMER_OFF(bgp
->t_maxmed_onstartup
);
1394 bgp
->maxmed_onstartup_over
= 1;
1397 bgp
->v_maxmed_onstartup
= BGP_MAXMED_ONSTARTUP_UNCONFIGURED
;
1398 bgp
->maxmed_onstartup_value
= BGP_MAXMED_VALUE_DEFAULT
;
1400 bgp_maxmed_update(bgp
);
1405 static int bgp_update_delay_config_vty(struct vty
*vty
, const char *delay
,
1408 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1409 uint16_t update_delay
;
1410 uint16_t establish_wait
;
1412 update_delay
= strtoul(delay
, NULL
, 10);
1414 if (!wait
) /* update-delay <delay> */
1416 bgp
->v_update_delay
= update_delay
;
1417 bgp
->v_establish_wait
= bgp
->v_update_delay
;
1421 /* update-delay <delay> <establish-wait> */
1422 establish_wait
= atoi(wait
);
1423 if (update_delay
< establish_wait
) {
1425 "%%Failed: update-delay less than the establish-wait!\n");
1426 return CMD_WARNING_CONFIG_FAILED
;
1429 bgp
->v_update_delay
= update_delay
;
1430 bgp
->v_establish_wait
= establish_wait
;
1435 static int bgp_update_delay_deconfig_vty(struct vty
*vty
)
1437 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1439 bgp
->v_update_delay
= BGP_UPDATE_DELAY_DEF
;
1440 bgp
->v_establish_wait
= bgp
->v_update_delay
;
1445 void bgp_config_write_update_delay(struct vty
*vty
, struct bgp
*bgp
)
1447 if (bgp
->v_update_delay
!= BGP_UPDATE_DELAY_DEF
) {
1448 vty_out(vty
, " update-delay %d", bgp
->v_update_delay
);
1449 if (bgp
->v_update_delay
!= bgp
->v_establish_wait
)
1450 vty_out(vty
, " %d", bgp
->v_establish_wait
);
1456 /* Update-delay configuration */
1457 DEFUN (bgp_update_delay
,
1458 bgp_update_delay_cmd
,
1459 "update-delay (0-3600)",
1460 "Force initial delay for best-path and updates\n"
1464 return bgp_update_delay_config_vty(vty
, argv
[idx_number
]->arg
, NULL
);
1467 DEFUN (bgp_update_delay_establish_wait
,
1468 bgp_update_delay_establish_wait_cmd
,
1469 "update-delay (0-3600) (1-3600)",
1470 "Force initial delay for best-path and updates\n"
1475 int idx_number_2
= 2;
1476 return bgp_update_delay_config_vty(vty
, argv
[idx_number
]->arg
,
1477 argv
[idx_number_2
]->arg
);
1480 /* Update-delay deconfiguration */
1481 DEFUN (no_bgp_update_delay
,
1482 no_bgp_update_delay_cmd
,
1483 "no update-delay [(0-3600) [(1-3600)]]",
1485 "Force initial delay for best-path and updates\n"
1489 return bgp_update_delay_deconfig_vty(vty
);
1493 static int bgp_wpkt_quanta_config_vty(struct vty
*vty
, const char *num
,
1496 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1499 uint32_t quanta
= strtoul(num
, NULL
, 10);
1500 atomic_store_explicit(&bgp
->wpkt_quanta
, quanta
,
1501 memory_order_relaxed
);
1503 atomic_store_explicit(&bgp
->wpkt_quanta
, BGP_WRITE_PACKET_MAX
,
1504 memory_order_relaxed
);
1510 static int bgp_rpkt_quanta_config_vty(struct vty
*vty
, const char *num
,
1513 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1516 uint32_t quanta
= strtoul(num
, NULL
, 10);
1517 atomic_store_explicit(&bgp
->rpkt_quanta
, quanta
,
1518 memory_order_relaxed
);
1520 atomic_store_explicit(&bgp
->rpkt_quanta
, BGP_READ_PACKET_MAX
,
1521 memory_order_relaxed
);
1527 void bgp_config_write_wpkt_quanta(struct vty
*vty
, struct bgp
*bgp
)
1530 atomic_load_explicit(&bgp
->wpkt_quanta
, memory_order_relaxed
);
1531 if (quanta
!= BGP_WRITE_PACKET_MAX
)
1532 vty_out(vty
, " write-quanta %d\n", quanta
);
1535 void bgp_config_write_rpkt_quanta(struct vty
*vty
, struct bgp
*bgp
)
1538 atomic_load_explicit(&bgp
->rpkt_quanta
, memory_order_relaxed
);
1539 if (quanta
!= BGP_READ_PACKET_MAX
)
1540 vty_out(vty
, " read-quanta %d\n", quanta
);
1543 /* Packet quanta configuration */
1544 DEFUN (bgp_wpkt_quanta
,
1545 bgp_wpkt_quanta_cmd
,
1546 "write-quanta (1-10)",
1547 "How many packets to write to peer socket per run\n"
1548 "Number of packets\n")
1551 return bgp_wpkt_quanta_config_vty(vty
, argv
[idx_number
]->arg
, 1);
1554 DEFUN (no_bgp_wpkt_quanta
,
1555 no_bgp_wpkt_quanta_cmd
,
1556 "no write-quanta (1-10)",
1558 "How many packets to write to peer socket per I/O cycle\n"
1559 "Number of packets\n")
1562 return bgp_wpkt_quanta_config_vty(vty
, argv
[idx_number
]->arg
, 0);
1565 DEFUN (bgp_rpkt_quanta
,
1566 bgp_rpkt_quanta_cmd
,
1567 "read-quanta (1-10)",
1568 "How many packets to read from peer socket per I/O cycle\n"
1569 "Number of packets\n")
1572 return bgp_rpkt_quanta_config_vty(vty
, argv
[idx_number
]->arg
, 1);
1575 DEFUN (no_bgp_rpkt_quanta
,
1576 no_bgp_rpkt_quanta_cmd
,
1577 "no read-quanta (1-10)",
1579 "How many packets to read from peer socket per I/O cycle\n"
1580 "Number of packets\n")
1583 return bgp_rpkt_quanta_config_vty(vty
, argv
[idx_number
]->arg
, 0);
1586 void bgp_config_write_coalesce_time(struct vty
*vty
, struct bgp
*bgp
)
1588 if (!bgp
->heuristic_coalesce
)
1589 vty_out(vty
, " coalesce-time %u\n", bgp
->coalesce_time
);
1593 DEFUN (bgp_coalesce_time
,
1594 bgp_coalesce_time_cmd
,
1595 "coalesce-time (0-4294967295)",
1596 "Subgroup coalesce timer\n"
1597 "Subgroup coalesce timer value (in ms)\n")
1599 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1602 argv_find(argv
, argc
, "(0-4294967295)", &idx
);
1603 bgp
->heuristic_coalesce
= false;
1604 bgp
->coalesce_time
= strtoul(argv
[idx
]->arg
, NULL
, 10);
1608 DEFUN (no_bgp_coalesce_time
,
1609 no_bgp_coalesce_time_cmd
,
1610 "no coalesce-time (0-4294967295)",
1612 "Subgroup coalesce timer\n"
1613 "Subgroup coalesce timer value (in ms)\n")
1615 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1617 bgp
->heuristic_coalesce
= true;
1618 bgp
->coalesce_time
= BGP_DEFAULT_SUBGROUP_COALESCE_TIME
;
1622 /* Maximum-paths configuration */
1623 DEFUN (bgp_maxpaths
,
1625 "maximum-paths " CMD_RANGE_STR(1, MULTIPATH_NUM
),
1626 "Forward packets over multiple paths\n"
1627 "Number of paths\n")
1630 return bgp_maxpaths_config_vty(vty
, BGP_PEER_EBGP
,
1631 argv
[idx_number
]->arg
, 0, 1);
1634 ALIAS_HIDDEN(bgp_maxpaths
, bgp_maxpaths_hidden_cmd
,
1635 "maximum-paths " CMD_RANGE_STR(1, MULTIPATH_NUM
),
1636 "Forward packets over multiple paths\n"
1637 "Number of paths\n")
1639 DEFUN (bgp_maxpaths_ibgp
,
1640 bgp_maxpaths_ibgp_cmd
,
1641 "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM
),
1642 "Forward packets over multiple paths\n"
1644 "Number of paths\n")
1647 return bgp_maxpaths_config_vty(vty
, BGP_PEER_IBGP
,
1648 argv
[idx_number
]->arg
, 0, 1);
1651 ALIAS_HIDDEN(bgp_maxpaths_ibgp
, bgp_maxpaths_ibgp_hidden_cmd
,
1652 "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM
),
1653 "Forward packets over multiple paths\n"
1655 "Number of paths\n")
1657 DEFUN (bgp_maxpaths_ibgp_cluster
,
1658 bgp_maxpaths_ibgp_cluster_cmd
,
1659 "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM
) " equal-cluster-length",
1660 "Forward packets over multiple paths\n"
1663 "Match the cluster length\n")
1666 return bgp_maxpaths_config_vty(
1667 vty
, BGP_PEER_IBGP
, argv
[idx_number
]->arg
,
1668 BGP_FLAG_IBGP_MULTIPATH_SAME_CLUSTERLEN
, 1);
1671 ALIAS_HIDDEN(bgp_maxpaths_ibgp_cluster
, bgp_maxpaths_ibgp_cluster_hidden_cmd
,
1672 "maximum-paths ibgp " CMD_RANGE_STR(
1673 1, MULTIPATH_NUM
) " equal-cluster-length",
1674 "Forward packets over multiple paths\n"
1677 "Match the cluster length\n")
1679 DEFUN (no_bgp_maxpaths
,
1680 no_bgp_maxpaths_cmd
,
1681 "no maximum-paths [" CMD_RANGE_STR(1, MULTIPATH_NUM
) "]",
1683 "Forward packets over multiple paths\n"
1684 "Number of paths\n")
1686 return bgp_maxpaths_config_vty(vty
, BGP_PEER_EBGP
, NULL
, 0, 0);
1689 ALIAS_HIDDEN(no_bgp_maxpaths
, no_bgp_maxpaths_hidden_cmd
,
1690 "no maximum-paths [" CMD_RANGE_STR(1, MULTIPATH_NUM
) "]", NO_STR
1691 "Forward packets over multiple paths\n"
1692 "Number of paths\n")
1694 DEFUN (no_bgp_maxpaths_ibgp
,
1695 no_bgp_maxpaths_ibgp_cmd
,
1696 "no maximum-paths ibgp [" CMD_RANGE_STR(1, MULTIPATH_NUM
) " [equal-cluster-length]]",
1698 "Forward packets over multiple paths\n"
1701 "Match the cluster length\n")
1703 return bgp_maxpaths_config_vty(vty
, BGP_PEER_IBGP
, NULL
, 0, 0);
1706 ALIAS_HIDDEN(no_bgp_maxpaths_ibgp
, no_bgp_maxpaths_ibgp_hidden_cmd
,
1707 "no maximum-paths ibgp [" CMD_RANGE_STR(
1708 1, MULTIPATH_NUM
) " [equal-cluster-length]]",
1710 "Forward packets over multiple paths\n"
1713 "Match the cluster length\n")
1715 void bgp_config_write_maxpaths(struct vty
*vty
, struct bgp
*bgp
, afi_t afi
,
1718 if (bgp
->maxpaths
[afi
][safi
].maxpaths_ebgp
!= MULTIPATH_NUM
) {
1719 vty_out(vty
, " maximum-paths %d\n",
1720 bgp
->maxpaths
[afi
][safi
].maxpaths_ebgp
);
1723 if (bgp
->maxpaths
[afi
][safi
].maxpaths_ibgp
!= MULTIPATH_NUM
) {
1724 vty_out(vty
, " maximum-paths ibgp %d",
1725 bgp
->maxpaths
[afi
][safi
].maxpaths_ibgp
);
1726 if (CHECK_FLAG(bgp
->maxpaths
[afi
][safi
].ibgp_flags
,
1727 BGP_FLAG_IBGP_MULTIPATH_SAME_CLUSTERLEN
))
1728 vty_out(vty
, " equal-cluster-length");
1737 "timers bgp (0-65535) (0-65535)",
1738 "Adjust routing timers\n"
1740 "Keepalive interval\n"
1743 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1745 int idx_number_2
= 3;
1746 unsigned long keepalive
= 0;
1747 unsigned long holdtime
= 0;
1749 keepalive
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1750 holdtime
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
1752 /* Holdtime value check. */
1753 if (holdtime
< 3 && holdtime
!= 0) {
1755 "%% hold time value must be either 0 or greater than 3\n");
1756 return CMD_WARNING_CONFIG_FAILED
;
1759 bgp_timers_set(bgp
, keepalive
, holdtime
);
1764 DEFUN (no_bgp_timers
,
1766 "no timers bgp [(0-65535) (0-65535)]",
1768 "Adjust routing timers\n"
1770 "Keepalive interval\n"
1773 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1774 bgp_timers_unset(bgp
);
1780 DEFUN (bgp_client_to_client_reflection
,
1781 bgp_client_to_client_reflection_cmd
,
1782 "bgp client-to-client reflection",
1783 "BGP specific commands\n"
1784 "Configure client to client route reflection\n"
1785 "reflection of routes allowed\n")
1787 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1788 bgp_flag_unset(bgp
, BGP_FLAG_NO_CLIENT_TO_CLIENT
);
1789 bgp_clear_star_soft_out(vty
, bgp
->name
);
1794 DEFUN (no_bgp_client_to_client_reflection
,
1795 no_bgp_client_to_client_reflection_cmd
,
1796 "no bgp client-to-client reflection",
1798 "BGP specific commands\n"
1799 "Configure client to client route reflection\n"
1800 "reflection of routes allowed\n")
1802 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1803 bgp_flag_set(bgp
, BGP_FLAG_NO_CLIENT_TO_CLIENT
);
1804 bgp_clear_star_soft_out(vty
, bgp
->name
);
1809 /* "bgp always-compare-med" configuration. */
1810 DEFUN (bgp_always_compare_med
,
1811 bgp_always_compare_med_cmd
,
1812 "bgp always-compare-med",
1813 "BGP specific commands\n"
1814 "Allow comparing MED from different neighbors\n")
1816 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1817 bgp_flag_set(bgp
, BGP_FLAG_ALWAYS_COMPARE_MED
);
1818 bgp_recalculate_all_bestpaths(bgp
);
1823 DEFUN (no_bgp_always_compare_med
,
1824 no_bgp_always_compare_med_cmd
,
1825 "no bgp always-compare-med",
1827 "BGP specific commands\n"
1828 "Allow comparing MED from different neighbors\n")
1830 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1831 bgp_flag_unset(bgp
, BGP_FLAG_ALWAYS_COMPARE_MED
);
1832 bgp_recalculate_all_bestpaths(bgp
);
1838 DEFUN(bgp_ebgp_requires_policy
, bgp_ebgp_requires_policy_cmd
,
1839 "bgp ebgp-requires-policy",
1840 "BGP specific commands\n"
1841 "Require in and out policy for eBGP peers (RFC8212)\n")
1843 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1844 bgp
->ebgp_requires_policy
= DEFAULT_EBGP_POLICY_ENABLED
;
1848 DEFUN(no_bgp_ebgp_requires_policy
, no_bgp_ebgp_requires_policy_cmd
,
1849 "no bgp ebgp-requires-policy",
1851 "BGP specific commands\n"
1852 "Require in and out policy for eBGP peers (RFC8212)\n")
1854 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1855 bgp
->ebgp_requires_policy
= DEFAULT_EBGP_POLICY_DISABLED
;
1860 /* "bgp deterministic-med" configuration. */
1861 DEFUN (bgp_deterministic_med
,
1862 bgp_deterministic_med_cmd
,
1863 "bgp deterministic-med",
1864 "BGP specific commands\n"
1865 "Pick the best-MED path among paths advertised from the neighboring AS\n")
1867 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1869 if (!bgp_flag_check(bgp
, BGP_FLAG_DETERMINISTIC_MED
)) {
1870 bgp_flag_set(bgp
, BGP_FLAG_DETERMINISTIC_MED
);
1871 bgp_recalculate_all_bestpaths(bgp
);
1877 DEFUN (no_bgp_deterministic_med
,
1878 no_bgp_deterministic_med_cmd
,
1879 "no bgp deterministic-med",
1881 "BGP specific commands\n"
1882 "Pick the best-MED path among paths advertised from the neighboring AS\n")
1884 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1885 int bestpath_per_as_used
;
1889 struct listnode
*node
, *nnode
;
1891 if (bgp_flag_check(bgp
, BGP_FLAG_DETERMINISTIC_MED
)) {
1892 bestpath_per_as_used
= 0;
1894 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
1895 FOREACH_AFI_SAFI (afi
, safi
)
1896 if (bgp_addpath_dmed_required(
1897 peer
->addpath_type
[afi
][safi
])) {
1898 bestpath_per_as_used
= 1;
1902 if (bestpath_per_as_used
)
1906 if (bestpath_per_as_used
) {
1908 "bgp deterministic-med cannot be disabled while addpath-tx-bestpath-per-AS is in use\n");
1909 return CMD_WARNING_CONFIG_FAILED
;
1911 bgp_flag_unset(bgp
, BGP_FLAG_DETERMINISTIC_MED
);
1912 bgp_recalculate_all_bestpaths(bgp
);
1919 /* "bgp graceful-restart" configuration. */
1920 DEFUN (bgp_graceful_restart
,
1921 bgp_graceful_restart_cmd
,
1922 "bgp graceful-restart",
1923 "BGP specific commands\n"
1924 "Graceful restart capability parameters\n")
1926 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1927 bgp_flag_set(bgp
, BGP_FLAG_GRACEFUL_RESTART
);
1931 DEFUN (no_bgp_graceful_restart
,
1932 no_bgp_graceful_restart_cmd
,
1933 "no bgp graceful-restart",
1935 "BGP specific commands\n"
1936 "Graceful restart capability parameters\n")
1938 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1939 bgp_flag_unset(bgp
, BGP_FLAG_GRACEFUL_RESTART
);
1943 DEFUN (bgp_graceful_restart_stalepath_time
,
1944 bgp_graceful_restart_stalepath_time_cmd
,
1945 "bgp graceful-restart stalepath-time (1-4095)",
1946 "BGP specific commands\n"
1947 "Graceful restart capability parameters\n"
1948 "Set the max time to hold onto restarting peer's stale paths\n"
1949 "Delay value (seconds)\n")
1951 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1955 stalepath
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1956 bgp
->stalepath_time
= stalepath
;
1960 DEFUN (bgp_graceful_restart_restart_time
,
1961 bgp_graceful_restart_restart_time_cmd
,
1962 "bgp graceful-restart restart-time (1-4095)",
1963 "BGP specific commands\n"
1964 "Graceful restart capability parameters\n"
1965 "Set the time to wait to delete stale routes before a BGP open message is received\n"
1966 "Delay value (seconds)\n")
1968 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1972 restart
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1973 bgp
->restart_time
= restart
;
1977 DEFUN (no_bgp_graceful_restart_stalepath_time
,
1978 no_bgp_graceful_restart_stalepath_time_cmd
,
1979 "no bgp graceful-restart stalepath-time [(1-4095)]",
1981 "BGP specific commands\n"
1982 "Graceful restart capability parameters\n"
1983 "Set the max time to hold onto restarting peer's stale paths\n"
1984 "Delay value (seconds)\n")
1986 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1988 bgp
->stalepath_time
= BGP_DEFAULT_STALEPATH_TIME
;
1992 DEFUN (no_bgp_graceful_restart_restart_time
,
1993 no_bgp_graceful_restart_restart_time_cmd
,
1994 "no bgp graceful-restart restart-time [(1-4095)]",
1996 "BGP specific commands\n"
1997 "Graceful restart capability parameters\n"
1998 "Set the time to wait to delete stale routes before a BGP open message is received\n"
1999 "Delay value (seconds)\n")
2001 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2003 bgp
->restart_time
= BGP_DEFAULT_RESTART_TIME
;
2007 DEFUN (bgp_graceful_restart_preserve_fw
,
2008 bgp_graceful_restart_preserve_fw_cmd
,
2009 "bgp graceful-restart preserve-fw-state",
2010 "BGP specific commands\n"
2011 "Graceful restart capability parameters\n"
2012 "Sets F-bit indication that fib is preserved while doing Graceful Restart\n")
2014 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2015 bgp_flag_set(bgp
, BGP_FLAG_GR_PRESERVE_FWD
);
2019 DEFUN (no_bgp_graceful_restart_preserve_fw
,
2020 no_bgp_graceful_restart_preserve_fw_cmd
,
2021 "no bgp graceful-restart preserve-fw-state",
2023 "BGP specific commands\n"
2024 "Graceful restart capability parameters\n"
2025 "Unsets F-bit indication that fib is preserved while doing Graceful Restart\n")
2027 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2028 bgp_flag_unset(bgp
, BGP_FLAG_GR_PRESERVE_FWD
);
2032 /* "bgp graceful-shutdown" configuration */
2033 DEFUN (bgp_graceful_shutdown
,
2034 bgp_graceful_shutdown_cmd
,
2035 "bgp graceful-shutdown",
2037 "Graceful shutdown parameters\n")
2039 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2041 if (!bgp_flag_check(bgp
, BGP_FLAG_GRACEFUL_SHUTDOWN
)) {
2042 bgp_flag_set(bgp
, BGP_FLAG_GRACEFUL_SHUTDOWN
);
2043 bgp_static_redo_import_check(bgp
);
2044 bgp_redistribute_redo(bgp
);
2045 bgp_clear_star_soft_out(vty
, bgp
->name
);
2046 bgp_clear_star_soft_in(vty
, bgp
->name
);
2052 DEFUN (no_bgp_graceful_shutdown
,
2053 no_bgp_graceful_shutdown_cmd
,
2054 "no bgp graceful-shutdown",
2057 "Graceful shutdown parameters\n")
2059 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2061 if (bgp_flag_check(bgp
, BGP_FLAG_GRACEFUL_SHUTDOWN
)) {
2062 bgp_flag_unset(bgp
, BGP_FLAG_GRACEFUL_SHUTDOWN
);
2063 bgp_static_redo_import_check(bgp
);
2064 bgp_redistribute_redo(bgp
);
2065 bgp_clear_star_soft_out(vty
, bgp
->name
);
2066 bgp_clear_star_soft_in(vty
, bgp
->name
);
2072 /* "bgp fast-external-failover" configuration. */
2073 DEFUN (bgp_fast_external_failover
,
2074 bgp_fast_external_failover_cmd
,
2075 "bgp fast-external-failover",
2077 "Immediately reset session if a link to a directly connected external peer goes down\n")
2079 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2080 bgp_flag_unset(bgp
, BGP_FLAG_NO_FAST_EXT_FAILOVER
);
2084 DEFUN (no_bgp_fast_external_failover
,
2085 no_bgp_fast_external_failover_cmd
,
2086 "no bgp fast-external-failover",
2089 "Immediately reset session if a link to a directly connected external peer goes down\n")
2091 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2092 bgp_flag_set(bgp
, BGP_FLAG_NO_FAST_EXT_FAILOVER
);
2096 /* "bgp bestpath compare-routerid" configuration. */
2097 DEFUN (bgp_bestpath_compare_router_id
,
2098 bgp_bestpath_compare_router_id_cmd
,
2099 "bgp bestpath compare-routerid",
2100 "BGP specific commands\n"
2101 "Change the default bestpath selection\n"
2102 "Compare router-id for identical EBGP paths\n")
2104 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2105 bgp_flag_set(bgp
, BGP_FLAG_COMPARE_ROUTER_ID
);
2106 bgp_recalculate_all_bestpaths(bgp
);
2111 DEFUN (no_bgp_bestpath_compare_router_id
,
2112 no_bgp_bestpath_compare_router_id_cmd
,
2113 "no bgp bestpath compare-routerid",
2115 "BGP specific commands\n"
2116 "Change the default bestpath selection\n"
2117 "Compare router-id for identical EBGP paths\n")
2119 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2120 bgp_flag_unset(bgp
, BGP_FLAG_COMPARE_ROUTER_ID
);
2121 bgp_recalculate_all_bestpaths(bgp
);
2126 /* "bgp bestpath as-path ignore" configuration. */
2127 DEFUN (bgp_bestpath_aspath_ignore
,
2128 bgp_bestpath_aspath_ignore_cmd
,
2129 "bgp bestpath as-path ignore",
2130 "BGP specific commands\n"
2131 "Change the default bestpath selection\n"
2132 "AS-path attribute\n"
2133 "Ignore as-path length in selecting a route\n")
2135 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2136 bgp_flag_set(bgp
, BGP_FLAG_ASPATH_IGNORE
);
2137 bgp_recalculate_all_bestpaths(bgp
);
2142 DEFUN (no_bgp_bestpath_aspath_ignore
,
2143 no_bgp_bestpath_aspath_ignore_cmd
,
2144 "no bgp bestpath as-path ignore",
2146 "BGP specific commands\n"
2147 "Change the default bestpath selection\n"
2148 "AS-path attribute\n"
2149 "Ignore as-path length in selecting a route\n")
2151 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2152 bgp_flag_unset(bgp
, BGP_FLAG_ASPATH_IGNORE
);
2153 bgp_recalculate_all_bestpaths(bgp
);
2158 /* "bgp bestpath as-path confed" configuration. */
2159 DEFUN (bgp_bestpath_aspath_confed
,
2160 bgp_bestpath_aspath_confed_cmd
,
2161 "bgp bestpath as-path confed",
2162 "BGP specific commands\n"
2163 "Change the default bestpath selection\n"
2164 "AS-path attribute\n"
2165 "Compare path lengths including confederation sets & sequences in selecting a route\n")
2167 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2168 bgp_flag_set(bgp
, BGP_FLAG_ASPATH_CONFED
);
2169 bgp_recalculate_all_bestpaths(bgp
);
2174 DEFUN (no_bgp_bestpath_aspath_confed
,
2175 no_bgp_bestpath_aspath_confed_cmd
,
2176 "no bgp bestpath as-path confed",
2178 "BGP specific commands\n"
2179 "Change the default bestpath selection\n"
2180 "AS-path attribute\n"
2181 "Compare path lengths including confederation sets & sequences in selecting a route\n")
2183 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2184 bgp_flag_unset(bgp
, BGP_FLAG_ASPATH_CONFED
);
2185 bgp_recalculate_all_bestpaths(bgp
);
2190 /* "bgp bestpath as-path multipath-relax" configuration. */
2191 DEFUN (bgp_bestpath_aspath_multipath_relax
,
2192 bgp_bestpath_aspath_multipath_relax_cmd
,
2193 "bgp bestpath as-path multipath-relax [<as-set|no-as-set>]",
2194 "BGP specific commands\n"
2195 "Change the default bestpath selection\n"
2196 "AS-path attribute\n"
2197 "Allow load sharing across routes that have different AS paths (but same length)\n"
2198 "Generate an AS_SET\n"
2199 "Do not generate an AS_SET\n")
2201 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2203 bgp_flag_set(bgp
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
);
2205 /* no-as-set is now the default behavior so we can silently
2207 if (argv_find(argv
, argc
, "as-set", &idx
))
2208 bgp_flag_set(bgp
, BGP_FLAG_MULTIPATH_RELAX_AS_SET
);
2210 bgp_flag_unset(bgp
, BGP_FLAG_MULTIPATH_RELAX_AS_SET
);
2212 bgp_recalculate_all_bestpaths(bgp
);
2217 DEFUN (no_bgp_bestpath_aspath_multipath_relax
,
2218 no_bgp_bestpath_aspath_multipath_relax_cmd
,
2219 "no bgp bestpath as-path multipath-relax [<as-set|no-as-set>]",
2221 "BGP specific commands\n"
2222 "Change the default bestpath selection\n"
2223 "AS-path attribute\n"
2224 "Allow load sharing across routes that have different AS paths (but same length)\n"
2225 "Generate an AS_SET\n"
2226 "Do not generate an AS_SET\n")
2228 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2229 bgp_flag_unset(bgp
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
);
2230 bgp_flag_unset(bgp
, BGP_FLAG_MULTIPATH_RELAX_AS_SET
);
2231 bgp_recalculate_all_bestpaths(bgp
);
2236 /* "bgp log-neighbor-changes" configuration. */
2237 DEFUN (bgp_log_neighbor_changes
,
2238 bgp_log_neighbor_changes_cmd
,
2239 "bgp log-neighbor-changes",
2240 "BGP specific commands\n"
2241 "Log neighbor up/down and reset reason\n")
2243 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2244 bgp_flag_set(bgp
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
);
2248 DEFUN (no_bgp_log_neighbor_changes
,
2249 no_bgp_log_neighbor_changes_cmd
,
2250 "no bgp log-neighbor-changes",
2252 "BGP specific commands\n"
2253 "Log neighbor up/down and reset reason\n")
2255 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2256 bgp_flag_unset(bgp
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
);
2260 /* "bgp bestpath med" configuration. */
2261 DEFUN (bgp_bestpath_med
,
2262 bgp_bestpath_med_cmd
,
2263 "bgp bestpath med <confed [missing-as-worst]|missing-as-worst [confed]>",
2264 "BGP specific commands\n"
2265 "Change the default bestpath selection\n"
2267 "Compare MED among confederation paths\n"
2268 "Treat missing MED as the least preferred one\n"
2269 "Treat missing MED as the least preferred one\n"
2270 "Compare MED among confederation paths\n")
2272 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2275 if (argv_find(argv
, argc
, "confed", &idx
))
2276 bgp_flag_set(bgp
, BGP_FLAG_MED_CONFED
);
2278 if (argv_find(argv
, argc
, "missing-as-worst", &idx
))
2279 bgp_flag_set(bgp
, BGP_FLAG_MED_MISSING_AS_WORST
);
2281 bgp_recalculate_all_bestpaths(bgp
);
2286 DEFUN (no_bgp_bestpath_med
,
2287 no_bgp_bestpath_med_cmd
,
2288 "no bgp bestpath med <confed [missing-as-worst]|missing-as-worst [confed]>",
2290 "BGP specific commands\n"
2291 "Change the default bestpath selection\n"
2293 "Compare MED among confederation paths\n"
2294 "Treat missing MED as the least preferred one\n"
2295 "Treat missing MED as the least preferred one\n"
2296 "Compare MED among confederation paths\n")
2298 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2301 if (argv_find(argv
, argc
, "confed", &idx
))
2302 bgp_flag_unset(bgp
, BGP_FLAG_MED_CONFED
);
2304 if (argv_find(argv
, argc
, "missing-as-worst", &idx
))
2305 bgp_flag_unset(bgp
, BGP_FLAG_MED_MISSING_AS_WORST
);
2307 bgp_recalculate_all_bestpaths(bgp
);
2312 /* "no bgp default ipv4-unicast". */
2313 DEFUN (no_bgp_default_ipv4_unicast
,
2314 no_bgp_default_ipv4_unicast_cmd
,
2315 "no bgp default ipv4-unicast",
2317 "BGP specific commands\n"
2318 "Configure BGP defaults\n"
2319 "Activate ipv4-unicast for a peer by default\n")
2321 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2322 bgp_flag_set(bgp
, BGP_FLAG_NO_DEFAULT_IPV4
);
2326 DEFUN (bgp_default_ipv4_unicast
,
2327 bgp_default_ipv4_unicast_cmd
,
2328 "bgp default ipv4-unicast",
2329 "BGP specific commands\n"
2330 "Configure BGP defaults\n"
2331 "Activate ipv4-unicast for a peer by default\n")
2333 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2334 bgp_flag_unset(bgp
, BGP_FLAG_NO_DEFAULT_IPV4
);
2338 /* Display hostname in certain command outputs */
2339 DEFUN (bgp_default_show_hostname
,
2340 bgp_default_show_hostname_cmd
,
2341 "bgp default show-hostname",
2342 "BGP specific commands\n"
2343 "Configure BGP defaults\n"
2344 "Show hostname in certain command outputs\n")
2346 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2347 bgp_flag_set(bgp
, BGP_FLAG_SHOW_HOSTNAME
);
2351 DEFUN (no_bgp_default_show_hostname
,
2352 no_bgp_default_show_hostname_cmd
,
2353 "no bgp default show-hostname",
2355 "BGP specific commands\n"
2356 "Configure BGP defaults\n"
2357 "Show hostname in certain command outputs\n")
2359 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2360 bgp_flag_unset(bgp
, BGP_FLAG_SHOW_HOSTNAME
);
2364 /* "bgp network import-check" configuration. */
2365 DEFUN (bgp_network_import_check
,
2366 bgp_network_import_check_cmd
,
2367 "bgp network import-check",
2368 "BGP specific commands\n"
2369 "BGP network command\n"
2370 "Check BGP network route exists in IGP\n")
2372 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2373 if (!bgp_flag_check(bgp
, BGP_FLAG_IMPORT_CHECK
)) {
2374 bgp_flag_set(bgp
, BGP_FLAG_IMPORT_CHECK
);
2375 bgp_static_redo_import_check(bgp
);
2381 ALIAS_HIDDEN(bgp_network_import_check
, bgp_network_import_check_exact_cmd
,
2382 "bgp network import-check exact",
2383 "BGP specific commands\n"
2384 "BGP network command\n"
2385 "Check BGP network route exists in IGP\n"
2386 "Match route precisely\n")
2388 DEFUN (no_bgp_network_import_check
,
2389 no_bgp_network_import_check_cmd
,
2390 "no bgp network import-check",
2392 "BGP specific commands\n"
2393 "BGP network command\n"
2394 "Check BGP network route exists in IGP\n")
2396 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2397 if (bgp_flag_check(bgp
, BGP_FLAG_IMPORT_CHECK
)) {
2398 bgp_flag_unset(bgp
, BGP_FLAG_IMPORT_CHECK
);
2399 bgp_static_redo_import_check(bgp
);
2405 DEFUN (bgp_default_local_preference
,
2406 bgp_default_local_preference_cmd
,
2407 "bgp default local-preference (0-4294967295)",
2408 "BGP specific commands\n"
2409 "Configure BGP defaults\n"
2410 "local preference (higher=more preferred)\n"
2411 "Configure default local preference value\n")
2413 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2415 uint32_t local_pref
;
2417 local_pref
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2419 bgp_default_local_preference_set(bgp
, local_pref
);
2420 bgp_clear_star_soft_in(vty
, bgp
->name
);
2425 DEFUN (no_bgp_default_local_preference
,
2426 no_bgp_default_local_preference_cmd
,
2427 "no bgp default local-preference [(0-4294967295)]",
2429 "BGP specific commands\n"
2430 "Configure BGP defaults\n"
2431 "local preference (higher=more preferred)\n"
2432 "Configure default local preference value\n")
2434 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2435 bgp_default_local_preference_unset(bgp
);
2436 bgp_clear_star_soft_in(vty
, bgp
->name
);
2442 DEFUN (bgp_default_subgroup_pkt_queue_max
,
2443 bgp_default_subgroup_pkt_queue_max_cmd
,
2444 "bgp default subgroup-pkt-queue-max (20-100)",
2445 "BGP specific commands\n"
2446 "Configure BGP defaults\n"
2447 "subgroup-pkt-queue-max\n"
2448 "Configure subgroup packet queue max\n")
2450 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2454 max_size
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2456 bgp_default_subgroup_pkt_queue_max_set(bgp
, max_size
);
2461 DEFUN (no_bgp_default_subgroup_pkt_queue_max
,
2462 no_bgp_default_subgroup_pkt_queue_max_cmd
,
2463 "no bgp default subgroup-pkt-queue-max [(20-100)]",
2465 "BGP specific commands\n"
2466 "Configure BGP defaults\n"
2467 "subgroup-pkt-queue-max\n"
2468 "Configure subgroup packet queue max\n")
2470 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2471 bgp_default_subgroup_pkt_queue_max_unset(bgp
);
2476 DEFUN (bgp_rr_allow_outbound_policy
,
2477 bgp_rr_allow_outbound_policy_cmd
,
2478 "bgp route-reflector allow-outbound-policy",
2479 "BGP specific commands\n"
2480 "Allow modifications made by out route-map\n"
2481 "on ibgp neighbors\n")
2483 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2485 if (!bgp_flag_check(bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
)) {
2486 bgp_flag_set(bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
);
2487 update_group_announce_rrclients(bgp
);
2488 bgp_clear_star_soft_out(vty
, bgp
->name
);
2494 DEFUN (no_bgp_rr_allow_outbound_policy
,
2495 no_bgp_rr_allow_outbound_policy_cmd
,
2496 "no bgp route-reflector allow-outbound-policy",
2498 "BGP specific commands\n"
2499 "Allow modifications made by out route-map\n"
2500 "on ibgp neighbors\n")
2502 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2504 if (bgp_flag_check(bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
)) {
2505 bgp_flag_unset(bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
);
2506 update_group_announce_rrclients(bgp
);
2507 bgp_clear_star_soft_out(vty
, bgp
->name
);
2513 DEFUN (bgp_listen_limit
,
2514 bgp_listen_limit_cmd
,
2515 "bgp listen limit (1-5000)",
2516 "BGP specific commands\n"
2517 "Configure BGP defaults\n"
2518 "maximum number of BGP Dynamic Neighbors that can be created\n"
2519 "Configure Dynamic Neighbors listen limit value\n")
2521 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2525 listen_limit
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2527 bgp_listen_limit_set(bgp
, listen_limit
);
2532 DEFUN (no_bgp_listen_limit
,
2533 no_bgp_listen_limit_cmd
,
2534 "no bgp listen limit [(1-5000)]",
2535 "BGP specific commands\n"
2536 "Configure BGP defaults\n"
2537 "unset maximum number of BGP Dynamic Neighbors that can be created\n"
2538 "Configure Dynamic Neighbors listen limit value to default\n"
2539 "Configure Dynamic Neighbors listen limit value\n")
2541 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2542 bgp_listen_limit_unset(bgp
);
2548 * Check if this listen range is already configured. Check for exact
2549 * match or overlap based on input.
2551 static struct peer_group
*listen_range_exists(struct bgp
*bgp
,
2552 struct prefix
*range
, int exact
)
2554 struct listnode
*node
, *nnode
;
2555 struct listnode
*node1
, *nnode1
;
2556 struct peer_group
*group
;
2561 afi
= family2afi(range
->family
);
2562 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
2563 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], node1
, nnode1
,
2566 match
= prefix_same(range
, lr
);
2568 match
= (prefix_match(range
, lr
)
2569 || prefix_match(lr
, range
));
2578 DEFUN (bgp_listen_range
,
2579 bgp_listen_range_cmd
,
2580 "bgp listen range <A.B.C.D/M|X:X::X:X/M> peer-group PGNAME",
2581 "BGP specific commands\n"
2582 "Configure BGP dynamic neighbors listen range\n"
2583 "Configure BGP dynamic neighbors listen range\n"
2585 "Member of the peer-group\n"
2586 "Peer-group name\n")
2588 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2589 struct prefix range
;
2590 struct peer_group
*group
, *existing_group
;
2595 argv_find(argv
, argc
, "A.B.C.D/M", &idx
);
2596 argv_find(argv
, argc
, "X:X::X:X/M", &idx
);
2597 char *prefix
= argv
[idx
]->arg
;
2598 argv_find(argv
, argc
, "PGNAME", &idx
);
2599 char *peergroup
= argv
[idx
]->arg
;
2601 /* Convert IP prefix string to struct prefix. */
2602 ret
= str2prefix(prefix
, &range
);
2604 vty_out(vty
, "%% Malformed listen range\n");
2605 return CMD_WARNING_CONFIG_FAILED
;
2608 afi
= family2afi(range
.family
);
2610 if (afi
== AFI_IP6
&& IN6_IS_ADDR_LINKLOCAL(&range
.u
.prefix6
)) {
2612 "%% Malformed listen range (link-local address)\n");
2613 return CMD_WARNING_CONFIG_FAILED
;
2618 /* Check if same listen range is already configured. */
2619 existing_group
= listen_range_exists(bgp
, &range
, 1);
2620 if (existing_group
) {
2621 if (strcmp(existing_group
->name
, peergroup
) == 0)
2625 "%% Same listen range is attached to peer-group %s\n",
2626 existing_group
->name
);
2627 return CMD_WARNING_CONFIG_FAILED
;
2631 /* Check if an overlapping listen range exists. */
2632 if (listen_range_exists(bgp
, &range
, 0)) {
2634 "%% Listen range overlaps with existing listen range\n");
2635 return CMD_WARNING_CONFIG_FAILED
;
2638 group
= peer_group_lookup(bgp
, peergroup
);
2640 vty_out(vty
, "%% Configure the peer-group first\n");
2641 return CMD_WARNING_CONFIG_FAILED
;
2644 ret
= peer_group_listen_range_add(group
, &range
);
2645 return bgp_vty_return(vty
, ret
);
2648 DEFUN (no_bgp_listen_range
,
2649 no_bgp_listen_range_cmd
,
2650 "no bgp listen range <A.B.C.D/M|X:X::X:X/M> peer-group PGNAME",
2652 "BGP specific commands\n"
2653 "Unconfigure BGP dynamic neighbors listen range\n"
2654 "Unconfigure BGP dynamic neighbors listen range\n"
2656 "Member of the peer-group\n"
2657 "Peer-group name\n")
2659 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2660 struct prefix range
;
2661 struct peer_group
*group
;
2666 argv_find(argv
, argc
, "A.B.C.D/M", &idx
);
2667 argv_find(argv
, argc
, "X:X::X:X/M", &idx
);
2668 char *prefix
= argv
[idx
]->arg
;
2669 argv_find(argv
, argc
, "WORD", &idx
);
2670 char *peergroup
= argv
[idx
]->arg
;
2672 /* Convert IP prefix string to struct prefix. */
2673 ret
= str2prefix(prefix
, &range
);
2675 vty_out(vty
, "%% Malformed listen range\n");
2676 return CMD_WARNING_CONFIG_FAILED
;
2679 afi
= family2afi(range
.family
);
2681 if (afi
== AFI_IP6
&& IN6_IS_ADDR_LINKLOCAL(&range
.u
.prefix6
)) {
2683 "%% Malformed listen range (link-local address)\n");
2684 return CMD_WARNING_CONFIG_FAILED
;
2689 group
= peer_group_lookup(bgp
, peergroup
);
2691 vty_out(vty
, "%% Peer-group does not exist\n");
2692 return CMD_WARNING_CONFIG_FAILED
;
2695 ret
= peer_group_listen_range_del(group
, &range
);
2696 return bgp_vty_return(vty
, ret
);
2699 void bgp_config_write_listen(struct vty
*vty
, struct bgp
*bgp
)
2701 struct peer_group
*group
;
2702 struct listnode
*node
, *nnode
, *rnode
, *nrnode
;
2703 struct prefix
*range
;
2705 char buf
[PREFIX2STR_BUFFER
];
2707 if (bgp
->dynamic_neighbors_limit
!= BGP_DYNAMIC_NEIGHBORS_LIMIT_DEFAULT
)
2708 vty_out(vty
, " bgp listen limit %d\n",
2709 bgp
->dynamic_neighbors_limit
);
2711 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
2712 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++) {
2713 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], rnode
,
2715 prefix2str(range
, buf
, sizeof(buf
));
2717 " bgp listen range %s peer-group %s\n",
2725 DEFUN (bgp_disable_connected_route_check
,
2726 bgp_disable_connected_route_check_cmd
,
2727 "bgp disable-ebgp-connected-route-check",
2728 "BGP specific commands\n"
2729 "Disable checking if nexthop is connected on ebgp sessions\n")
2731 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2732 bgp_flag_set(bgp
, BGP_FLAG_DISABLE_NH_CONNECTED_CHK
);
2733 bgp_clear_star_soft_in(vty
, bgp
->name
);
2738 DEFUN (no_bgp_disable_connected_route_check
,
2739 no_bgp_disable_connected_route_check_cmd
,
2740 "no bgp disable-ebgp-connected-route-check",
2742 "BGP specific commands\n"
2743 "Disable checking if nexthop is connected on ebgp sessions\n")
2745 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2746 bgp_flag_unset(bgp
, BGP_FLAG_DISABLE_NH_CONNECTED_CHK
);
2747 bgp_clear_star_soft_in(vty
, bgp
->name
);
2753 static int peer_remote_as_vty(struct vty
*vty
, const char *peer_str
,
2754 const char *as_str
, afi_t afi
, safi_t safi
)
2756 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2759 int as_type
= AS_SPECIFIED
;
2762 if (as_str
[0] == 'i') {
2764 as_type
= AS_INTERNAL
;
2765 } else if (as_str
[0] == 'e') {
2767 as_type
= AS_EXTERNAL
;
2769 /* Get AS number. */
2770 as
= strtoul(as_str
, NULL
, 10);
2773 /* If peer is peer group or interface peer, call proper function. */
2774 ret
= str2sockunion(peer_str
, &su
);
2778 /* Check if existing interface peer */
2779 peer
= peer_lookup_by_conf_if(bgp
, peer_str
);
2781 ret
= peer_remote_as(bgp
, NULL
, peer_str
, &as
, as_type
, afi
,
2784 /* if not interface peer, check peer-group settings */
2785 if (ret
< 0 && !peer
) {
2786 ret
= peer_group_remote_as(bgp
, peer_str
, &as
, as_type
);
2789 "%% Create the peer-group or interface first\n");
2790 return CMD_WARNING_CONFIG_FAILED
;
2795 if (peer_address_self_check(bgp
, &su
)) {
2797 "%% Can not configure the local system as neighbor\n");
2798 return CMD_WARNING_CONFIG_FAILED
;
2800 ret
= peer_remote_as(bgp
, &su
, NULL
, &as
, as_type
, afi
, safi
);
2803 /* This peer belongs to peer group. */
2805 case BGP_ERR_PEER_GROUP_MEMBER
:
2807 "%% Peer-group member cannot override remote-as of peer-group\n");
2808 return CMD_WARNING_CONFIG_FAILED
;
2809 case BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
:
2811 "%% Peer-group members must be all internal or all external\n");
2812 return CMD_WARNING_CONFIG_FAILED
;
2814 return bgp_vty_return(vty
, ret
);
2817 DEFUN (bgp_default_shutdown
,
2818 bgp_default_shutdown_cmd
,
2819 "[no] bgp default shutdown",
2822 "Configure BGP defaults\n"
2823 "Apply administrative shutdown to newly configured peers\n")
2825 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2826 bgp
->autoshutdown
= !strmatch(argv
[0]->text
, "no");
2830 DEFUN (neighbor_remote_as
,
2831 neighbor_remote_as_cmd
,
2832 "neighbor <A.B.C.D|X:X::X:X|WORD> remote-as <(1-4294967295)|internal|external>",
2835 "Specify a BGP neighbor\n"
2837 "Internal BGP peer\n"
2838 "External BGP peer\n")
2841 int idx_remote_as
= 3;
2842 return peer_remote_as_vty(vty
, argv
[idx_peer
]->arg
,
2843 argv
[idx_remote_as
]->arg
, AFI_IP
,
2847 static int peer_conf_interface_get(struct vty
*vty
, const char *conf_if
,
2848 afi_t afi
, safi_t safi
, int v6only
,
2849 const char *peer_group_name
,
2852 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2854 int as_type
= AS_UNSPECIFIED
;
2856 struct peer_group
*group
;
2860 group
= peer_group_lookup(bgp
, conf_if
);
2863 vty_out(vty
, "%% Name conflict with peer-group \n");
2864 return CMD_WARNING_CONFIG_FAILED
;
2868 if (as_str
[0] == 'i') {
2869 as_type
= AS_INTERNAL
;
2870 } else if (as_str
[0] == 'e') {
2871 as_type
= AS_EXTERNAL
;
2873 /* Get AS number. */
2874 as
= strtoul(as_str
, NULL
, 10);
2875 as_type
= AS_SPECIFIED
;
2879 peer
= peer_lookup_by_conf_if(bgp
, conf_if
);
2882 ret
= peer_remote_as(bgp
, NULL
, conf_if
, &as
, as_type
,
2885 if (bgp_flag_check(bgp
, BGP_FLAG_NO_DEFAULT_IPV4
)
2886 && afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
2887 peer
= peer_create(NULL
, conf_if
, bgp
, bgp
->as
, as
,
2888 as_type
, 0, 0, NULL
);
2890 peer
= peer_create(NULL
, conf_if
, bgp
, bgp
->as
, as
,
2891 as_type
, afi
, safi
, NULL
);
2894 vty_out(vty
, "%% BGP failed to create peer\n");
2895 return CMD_WARNING_CONFIG_FAILED
;
2899 peer_flag_set(peer
, PEER_FLAG_IFPEER_V6ONLY
);
2901 /* Request zebra to initiate IPv6 RAs on this interface. We do
2903 * any unnumbered peer in order to not worry about run-time
2905 * (e.g., peering is initially IPv4, but the IPv4 /30 or /31
2907 * gets deleted later etc.)
2910 bgp_zebra_initiate_radv(bgp
, peer
);
2913 if ((v6only
&& !CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
))
2914 || (!v6only
&& CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
))) {
2916 peer_flag_set(peer
, PEER_FLAG_IFPEER_V6ONLY
);
2918 peer_flag_unset(peer
, PEER_FLAG_IFPEER_V6ONLY
);
2920 /* v6only flag changed. Reset bgp seesion */
2921 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
2922 peer
->last_reset
= PEER_DOWN_V6ONLY_CHANGE
;
2923 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
2924 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2926 bgp_session_reset(peer
);
2929 if (!CHECK_FLAG(peer
->flags_invert
, PEER_FLAG_CAPABILITY_ENHE
)) {
2930 SET_FLAG(peer
->flags
, PEER_FLAG_CAPABILITY_ENHE
);
2931 SET_FLAG(peer
->flags_invert
, PEER_FLAG_CAPABILITY_ENHE
);
2932 SET_FLAG(peer
->flags_override
, PEER_FLAG_CAPABILITY_ENHE
);
2935 if (peer_group_name
) {
2936 group
= peer_group_lookup(bgp
, peer_group_name
);
2938 vty_out(vty
, "%% Configure the peer-group first\n");
2939 return CMD_WARNING_CONFIG_FAILED
;
2942 ret
= peer_group_bind(bgp
, &su
, peer
, group
, &as
);
2945 return bgp_vty_return(vty
, ret
);
2948 DEFUN (neighbor_interface_config
,
2949 neighbor_interface_config_cmd
,
2950 "neighbor WORD interface [peer-group PGNAME]",
2952 "Interface name or neighbor tag\n"
2953 "Enable BGP on interface\n"
2954 "Member of the peer-group\n"
2955 "Peer-group name\n")
2958 int idx_peer_group_word
= 4;
2960 if (argc
> idx_peer_group_word
)
2961 return peer_conf_interface_get(
2962 vty
, argv
[idx_word
]->arg
, AFI_IP
, SAFI_UNICAST
, 0,
2963 argv
[idx_peer_group_word
]->arg
, NULL
);
2965 return peer_conf_interface_get(vty
, argv
[idx_word
]->arg
, AFI_IP
,
2966 SAFI_UNICAST
, 0, NULL
, NULL
);
2969 DEFUN (neighbor_interface_config_v6only
,
2970 neighbor_interface_config_v6only_cmd
,
2971 "neighbor WORD interface v6only [peer-group PGNAME]",
2973 "Interface name or neighbor tag\n"
2974 "Enable BGP on interface\n"
2975 "Enable BGP with v6 link-local only\n"
2976 "Member of the peer-group\n"
2977 "Peer-group name\n")
2980 int idx_peer_group_word
= 5;
2982 if (argc
> idx_peer_group_word
)
2983 return peer_conf_interface_get(
2984 vty
, argv
[idx_word
]->arg
, AFI_IP
, SAFI_UNICAST
, 1,
2985 argv
[idx_peer_group_word
]->arg
, NULL
);
2987 return peer_conf_interface_get(vty
, argv
[idx_word
]->arg
, AFI_IP
,
2988 SAFI_UNICAST
, 1, NULL
, NULL
);
2992 DEFUN (neighbor_interface_config_remote_as
,
2993 neighbor_interface_config_remote_as_cmd
,
2994 "neighbor WORD interface remote-as <(1-4294967295)|internal|external>",
2996 "Interface name or neighbor tag\n"
2997 "Enable BGP on interface\n"
2998 "Specify a BGP neighbor\n"
3000 "Internal BGP peer\n"
3001 "External BGP peer\n")
3004 int idx_remote_as
= 4;
3005 return peer_conf_interface_get(vty
, argv
[idx_word
]->arg
, AFI_IP
,
3006 SAFI_UNICAST
, 0, NULL
,
3007 argv
[idx_remote_as
]->arg
);
3010 DEFUN (neighbor_interface_v6only_config_remote_as
,
3011 neighbor_interface_v6only_config_remote_as_cmd
,
3012 "neighbor WORD interface v6only remote-as <(1-4294967295)|internal|external>",
3014 "Interface name or neighbor tag\n"
3015 "Enable BGP with v6 link-local only\n"
3016 "Enable BGP on interface\n"
3017 "Specify a BGP neighbor\n"
3019 "Internal BGP peer\n"
3020 "External BGP peer\n")
3023 int idx_remote_as
= 5;
3024 return peer_conf_interface_get(vty
, argv
[idx_word
]->arg
, AFI_IP
,
3025 SAFI_UNICAST
, 1, NULL
,
3026 argv
[idx_remote_as
]->arg
);
3029 DEFUN (neighbor_peer_group
,
3030 neighbor_peer_group_cmd
,
3031 "neighbor WORD peer-group",
3033 "Interface name or neighbor tag\n"
3034 "Configure peer-group\n")
3036 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3039 struct peer_group
*group
;
3041 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_word
]->arg
);
3043 vty_out(vty
, "%% Name conflict with interface: \n");
3044 return CMD_WARNING_CONFIG_FAILED
;
3047 group
= peer_group_get(bgp
, argv
[idx_word
]->arg
);
3049 vty_out(vty
, "%% BGP failed to find or create peer-group\n");
3050 return CMD_WARNING_CONFIG_FAILED
;
3058 "no neighbor <WORD|<A.B.C.D|X:X::X:X> [remote-as <(1-4294967295)|internal|external>]>",
3062 "Specify a BGP neighbor\n"
3064 "Internal BGP peer\n"
3065 "External BGP peer\n")
3067 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3071 struct peer_group
*group
;
3075 ret
= str2sockunion(argv
[idx_peer
]->arg
, &su
);
3077 /* look up for neighbor by interface name config. */
3078 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_peer
]->arg
);
3080 /* Request zebra to terminate IPv6 RAs on this
3083 bgp_zebra_terminate_radv(peer
->bgp
, peer
);
3088 group
= peer_group_lookup(bgp
, argv
[idx_peer
]->arg
);
3090 peer_group_delete(group
);
3092 vty_out(vty
, "%% Create the peer-group first\n");
3093 return CMD_WARNING_CONFIG_FAILED
;
3096 peer
= peer_lookup(bgp
, &su
);
3098 if (peer_dynamic_neighbor(peer
)) {
3100 "%% Operation not allowed on a dynamic neighbor\n");
3101 return CMD_WARNING_CONFIG_FAILED
;
3104 other
= peer
->doppelganger
;
3106 if (other
&& other
->status
!= Deleted
)
3114 DEFUN (no_neighbor_interface_config
,
3115 no_neighbor_interface_config_cmd
,
3116 "no neighbor WORD interface [v6only] [peer-group PGNAME] [remote-as <(1-4294967295)|internal|external>]",
3120 "Configure BGP on interface\n"
3121 "Enable BGP with v6 link-local only\n"
3122 "Member of the peer-group\n"
3124 "Specify a BGP neighbor\n"
3126 "Internal BGP peer\n"
3127 "External BGP peer\n")
3129 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3133 /* look up for neighbor by interface name config. */
3134 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_word
]->arg
);
3136 /* Request zebra to terminate IPv6 RAs on this interface. */
3138 bgp_zebra_terminate_radv(peer
->bgp
, peer
);
3141 vty_out(vty
, "%% Create the bgp interface first\n");
3142 return CMD_WARNING_CONFIG_FAILED
;
3147 DEFUN (no_neighbor_peer_group
,
3148 no_neighbor_peer_group_cmd
,
3149 "no neighbor WORD peer-group",
3153 "Configure peer-group\n")
3155 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3157 struct peer_group
*group
;
3159 group
= peer_group_lookup(bgp
, argv
[idx_word
]->arg
);
3161 peer_group_delete(group
);
3163 vty_out(vty
, "%% Create the peer-group first\n");
3164 return CMD_WARNING_CONFIG_FAILED
;
3169 DEFUN (no_neighbor_interface_peer_group_remote_as
,
3170 no_neighbor_interface_peer_group_remote_as_cmd
,
3171 "no neighbor WORD remote-as <(1-4294967295)|internal|external>",
3174 "Interface name or neighbor tag\n"
3175 "Specify a BGP neighbor\n"
3177 "Internal BGP peer\n"
3178 "External BGP peer\n")
3180 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3182 struct peer_group
*group
;
3185 /* look up for neighbor by interface name config. */
3186 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_word
]->arg
);
3188 peer_as_change(peer
, 0, AS_UNSPECIFIED
);
3192 group
= peer_group_lookup(bgp
, argv
[idx_word
]->arg
);
3194 peer_group_remote_as_delete(group
);
3196 vty_out(vty
, "%% Create the peer-group or interface first\n");
3197 return CMD_WARNING_CONFIG_FAILED
;
3202 DEFUN (neighbor_local_as
,
3203 neighbor_local_as_cmd
,
3204 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295)",
3207 "Specify a local-as number\n"
3208 "AS number used as local AS\n")
3216 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3218 return CMD_WARNING_CONFIG_FAILED
;
3220 as
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
3221 ret
= peer_local_as_set(peer
, as
, 0, 0);
3222 return bgp_vty_return(vty
, ret
);
3225 DEFUN (neighbor_local_as_no_prepend
,
3226 neighbor_local_as_no_prepend_cmd
,
3227 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295) no-prepend",
3230 "Specify a local-as number\n"
3231 "AS number used as local AS\n"
3232 "Do not prepend local-as to updates from ebgp peers\n")
3240 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3242 return CMD_WARNING_CONFIG_FAILED
;
3244 as
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
3245 ret
= peer_local_as_set(peer
, as
, 1, 0);
3246 return bgp_vty_return(vty
, ret
);
3249 DEFUN (neighbor_local_as_no_prepend_replace_as
,
3250 neighbor_local_as_no_prepend_replace_as_cmd
,
3251 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295) no-prepend replace-as",
3254 "Specify a local-as number\n"
3255 "AS number used as local AS\n"
3256 "Do not prepend local-as to updates from ebgp peers\n"
3257 "Do not prepend local-as to updates from ibgp peers\n")
3265 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3267 return CMD_WARNING_CONFIG_FAILED
;
3269 as
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
3270 ret
= peer_local_as_set(peer
, as
, 1, 1);
3271 return bgp_vty_return(vty
, ret
);
3274 DEFUN (no_neighbor_local_as
,
3275 no_neighbor_local_as_cmd
,
3276 "no neighbor <A.B.C.D|X:X::X:X|WORD> local-as [(1-4294967295) [no-prepend [replace-as]]]",
3280 "Specify a local-as number\n"
3281 "AS number used as local AS\n"
3282 "Do not prepend local-as to updates from ebgp peers\n"
3283 "Do not prepend local-as to updates from ibgp peers\n")
3289 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3291 return CMD_WARNING_CONFIG_FAILED
;
3293 ret
= peer_local_as_unset(peer
);
3294 return bgp_vty_return(vty
, ret
);
3298 DEFUN (neighbor_solo
,
3300 "neighbor <A.B.C.D|X:X::X:X|WORD> solo",
3303 "Solo peer - part of its own update group\n")
3309 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3311 return CMD_WARNING_CONFIG_FAILED
;
3313 ret
= update_group_adjust_soloness(peer
, 1);
3314 return bgp_vty_return(vty
, ret
);
3317 DEFUN (no_neighbor_solo
,
3318 no_neighbor_solo_cmd
,
3319 "no neighbor <A.B.C.D|X:X::X:X|WORD> solo",
3323 "Solo peer - part of its own update group\n")
3329 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3331 return CMD_WARNING_CONFIG_FAILED
;
3333 ret
= update_group_adjust_soloness(peer
, 0);
3334 return bgp_vty_return(vty
, ret
);
3337 DEFUN (neighbor_password
,
3338 neighbor_password_cmd
,
3339 "neighbor <A.B.C.D|X:X::X:X|WORD> password LINE",
3350 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3352 return CMD_WARNING_CONFIG_FAILED
;
3354 ret
= peer_password_set(peer
, argv
[idx_line
]->arg
);
3355 return bgp_vty_return(vty
, ret
);
3358 DEFUN (no_neighbor_password
,
3359 no_neighbor_password_cmd
,
3360 "no neighbor <A.B.C.D|X:X::X:X|WORD> password [LINE]",
3371 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3373 return CMD_WARNING_CONFIG_FAILED
;
3375 ret
= peer_password_unset(peer
);
3376 return bgp_vty_return(vty
, ret
);
3379 DEFUN (neighbor_activate
,
3380 neighbor_activate_cmd
,
3381 "neighbor <A.B.C.D|X:X::X:X|WORD> activate",
3384 "Enable the Address Family for this Neighbor\n")
3390 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3392 return CMD_WARNING_CONFIG_FAILED
;
3394 ret
= peer_activate(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
));
3395 return bgp_vty_return(vty
, ret
);
3398 ALIAS_HIDDEN(neighbor_activate
, neighbor_activate_hidden_cmd
,
3399 "neighbor <A.B.C.D|X:X::X:X|WORD> activate",
3400 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3401 "Enable the Address Family for this Neighbor\n")
3403 DEFUN (no_neighbor_activate
,
3404 no_neighbor_activate_cmd
,
3405 "no neighbor <A.B.C.D|X:X::X:X|WORD> activate",
3409 "Enable the Address Family for this Neighbor\n")
3416 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3418 return CMD_WARNING_CONFIG_FAILED
;
3420 ret
= peer_deactivate(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
));
3421 return bgp_vty_return(vty
, ret
);
3424 ALIAS_HIDDEN(no_neighbor_activate
, no_neighbor_activate_hidden_cmd
,
3425 "no neighbor <A.B.C.D|X:X::X:X|WORD> activate",
3426 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3427 "Enable the Address Family for this Neighbor\n")
3429 DEFUN (neighbor_set_peer_group
,
3430 neighbor_set_peer_group_cmd
,
3431 "neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
3434 "Member of the peer-group\n"
3435 "Peer-group name\n")
3437 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3444 struct peer_group
*group
;
3446 ret
= str2sockunion(argv
[idx_peer
]->arg
, &su
);
3448 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_peer
]->arg
);
3450 vty_out(vty
, "%% Malformed address or name: %s\n",
3451 argv
[idx_peer
]->arg
);
3452 return CMD_WARNING_CONFIG_FAILED
;
3455 if (peer_address_self_check(bgp
, &su
)) {
3457 "%% Can not configure the local system as neighbor\n");
3458 return CMD_WARNING_CONFIG_FAILED
;
3461 /* Disallow for dynamic neighbor. */
3462 peer
= peer_lookup(bgp
, &su
);
3463 if (peer
&& peer_dynamic_neighbor(peer
)) {
3465 "%% Operation not allowed on a dynamic neighbor\n");
3466 return CMD_WARNING_CONFIG_FAILED
;
3470 group
= peer_group_lookup(bgp
, argv
[idx_word
]->arg
);
3472 vty_out(vty
, "%% Configure the peer-group first\n");
3473 return CMD_WARNING_CONFIG_FAILED
;
3476 ret
= peer_group_bind(bgp
, &su
, peer
, group
, &as
);
3478 if (ret
== BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
) {
3480 "%% Peer with AS %u cannot be in this peer-group, members must be all internal or all external\n",
3482 return CMD_WARNING_CONFIG_FAILED
;
3485 return bgp_vty_return(vty
, ret
);
3488 ALIAS_HIDDEN(neighbor_set_peer_group
, neighbor_set_peer_group_hidden_cmd
,
3489 "neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
3490 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3491 "Member of the peer-group\n"
3492 "Peer-group name\n")
3494 DEFUN (no_neighbor_set_peer_group
,
3495 no_neighbor_set_peer_group_cmd
,
3496 "no neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
3500 "Member of the peer-group\n"
3501 "Peer-group name\n")
3503 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3508 struct peer_group
*group
;
3510 peer
= peer_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3512 return CMD_WARNING_CONFIG_FAILED
;
3514 group
= peer_group_lookup(bgp
, argv
[idx_word
]->arg
);
3516 vty_out(vty
, "%% Configure the peer-group first\n");
3517 return CMD_WARNING_CONFIG_FAILED
;
3520 ret
= peer_delete(peer
);
3522 return bgp_vty_return(vty
, ret
);
3525 ALIAS_HIDDEN(no_neighbor_set_peer_group
, no_neighbor_set_peer_group_hidden_cmd
,
3526 "no neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
3527 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3528 "Member of the peer-group\n"
3529 "Peer-group name\n")
3531 static int peer_flag_modify_vty(struct vty
*vty
, const char *ip_str
,
3532 uint32_t flag
, int set
)
3537 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
3539 return CMD_WARNING_CONFIG_FAILED
;
3542 * If 'neighbor <interface>', then this is for directly connected peers,
3543 * we should not accept disable-connected-check.
3545 if (peer
->conf_if
&& (flag
== PEER_FLAG_DISABLE_CONNECTED_CHECK
)) {
3547 "%s is directly connected peer, cannot accept disable-"
3548 "connected-check\n",
3550 return CMD_WARNING_CONFIG_FAILED
;
3553 if (!set
&& flag
== PEER_FLAG_SHUTDOWN
)
3554 peer_tx_shutdown_message_unset(peer
);
3557 ret
= peer_flag_set(peer
, flag
);
3559 ret
= peer_flag_unset(peer
, flag
);
3561 return bgp_vty_return(vty
, ret
);
3564 static int peer_flag_set_vty(struct vty
*vty
, const char *ip_str
, uint32_t flag
)
3566 return peer_flag_modify_vty(vty
, ip_str
, flag
, 1);
3569 static int peer_flag_unset_vty(struct vty
*vty
, const char *ip_str
,
3572 return peer_flag_modify_vty(vty
, ip_str
, flag
, 0);
3575 /* neighbor passive. */
3576 DEFUN (neighbor_passive
,
3577 neighbor_passive_cmd
,
3578 "neighbor <A.B.C.D|X:X::X:X|WORD> passive",
3581 "Don't send open messages to this neighbor\n")
3584 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
, PEER_FLAG_PASSIVE
);
3587 DEFUN (no_neighbor_passive
,
3588 no_neighbor_passive_cmd
,
3589 "no neighbor <A.B.C.D|X:X::X:X|WORD> passive",
3593 "Don't send open messages to this neighbor\n")
3596 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
, PEER_FLAG_PASSIVE
);
3599 /* neighbor shutdown. */
3600 DEFUN (neighbor_shutdown_msg
,
3601 neighbor_shutdown_msg_cmd
,
3602 "neighbor <A.B.C.D|X:X::X:X|WORD> shutdown message MSG...",
3605 "Administratively shut down this neighbor\n"
3606 "Add a shutdown message (draft-ietf-idr-shutdown-06)\n"
3607 "Shutdown message\n")
3613 peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3617 return CMD_WARNING_CONFIG_FAILED
;
3618 message
= argv_concat(argv
, argc
, 4);
3619 peer_tx_shutdown_message_set(peer
, message
);
3620 XFREE(MTYPE_TMP
, message
);
3623 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
, PEER_FLAG_SHUTDOWN
);
3626 ALIAS(neighbor_shutdown_msg
, neighbor_shutdown_cmd
,
3627 "neighbor <A.B.C.D|X:X::X:X|WORD> shutdown",
3628 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3629 "Administratively shut down this neighbor\n")
3631 DEFUN (no_neighbor_shutdown_msg
,
3632 no_neighbor_shutdown_msg_cmd
,
3633 "no neighbor <A.B.C.D|X:X::X:X|WORD> shutdown message MSG...",
3637 "Administratively shut down this neighbor\n"
3638 "Remove a shutdown message (draft-ietf-idr-shutdown-06)\n"
3639 "Shutdown message\n")
3643 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3644 PEER_FLAG_SHUTDOWN
);
3647 ALIAS(no_neighbor_shutdown_msg
, no_neighbor_shutdown_cmd
,
3648 "no neighbor <A.B.C.D|X:X::X:X|WORD> shutdown",
3649 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3650 "Administratively shut down this neighbor\n")
3652 /* neighbor capability dynamic. */
3653 DEFUN (neighbor_capability_dynamic
,
3654 neighbor_capability_dynamic_cmd
,
3655 "neighbor <A.B.C.D|X:X::X:X|WORD> capability dynamic",
3658 "Advertise capability to the peer\n"
3659 "Advertise dynamic capability to this neighbor\n")
3662 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
3663 PEER_FLAG_DYNAMIC_CAPABILITY
);
3666 DEFUN (no_neighbor_capability_dynamic
,
3667 no_neighbor_capability_dynamic_cmd
,
3668 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability dynamic",
3672 "Advertise capability to the peer\n"
3673 "Advertise dynamic capability to this neighbor\n")
3676 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3677 PEER_FLAG_DYNAMIC_CAPABILITY
);
3680 /* neighbor dont-capability-negotiate */
3681 DEFUN (neighbor_dont_capability_negotiate
,
3682 neighbor_dont_capability_negotiate_cmd
,
3683 "neighbor <A.B.C.D|X:X::X:X|WORD> dont-capability-negotiate",
3686 "Do not perform capability negotiation\n")
3689 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
3690 PEER_FLAG_DONT_CAPABILITY
);
3693 DEFUN (no_neighbor_dont_capability_negotiate
,
3694 no_neighbor_dont_capability_negotiate_cmd
,
3695 "no neighbor <A.B.C.D|X:X::X:X|WORD> dont-capability-negotiate",
3699 "Do not perform capability negotiation\n")
3702 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3703 PEER_FLAG_DONT_CAPABILITY
);
3706 /* neighbor capability extended next hop encoding */
3707 DEFUN (neighbor_capability_enhe
,
3708 neighbor_capability_enhe_cmd
,
3709 "neighbor <A.B.C.D|X:X::X:X|WORD> capability extended-nexthop",
3712 "Advertise capability to the peer\n"
3713 "Advertise extended next-hop capability to the peer\n")
3716 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
3717 PEER_FLAG_CAPABILITY_ENHE
);
3720 DEFUN (no_neighbor_capability_enhe
,
3721 no_neighbor_capability_enhe_cmd
,
3722 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability extended-nexthop",
3726 "Advertise capability to the peer\n"
3727 "Advertise extended next-hop capability to the peer\n")
3730 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3731 PEER_FLAG_CAPABILITY_ENHE
);
3734 static int peer_af_flag_modify_vty(struct vty
*vty
, const char *peer_str
,
3735 afi_t afi
, safi_t safi
, uint32_t flag
,
3741 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
3743 return CMD_WARNING_CONFIG_FAILED
;
3746 ret
= peer_af_flag_set(peer
, afi
, safi
, flag
);
3748 ret
= peer_af_flag_unset(peer
, afi
, safi
, flag
);
3750 return bgp_vty_return(vty
, ret
);
3753 static int peer_af_flag_set_vty(struct vty
*vty
, const char *peer_str
,
3754 afi_t afi
, safi_t safi
, uint32_t flag
)
3756 return peer_af_flag_modify_vty(vty
, peer_str
, afi
, safi
, flag
, 1);
3759 static int peer_af_flag_unset_vty(struct vty
*vty
, const char *peer_str
,
3760 afi_t afi
, safi_t safi
, uint32_t flag
)
3762 return peer_af_flag_modify_vty(vty
, peer_str
, afi
, safi
, flag
, 0);
3765 /* neighbor capability orf prefix-list. */
3766 DEFUN (neighbor_capability_orf_prefix
,
3767 neighbor_capability_orf_prefix_cmd
,
3768 "neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
3771 "Advertise capability to the peer\n"
3772 "Advertise ORF capability to the peer\n"
3773 "Advertise prefixlist ORF capability to this neighbor\n"
3774 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
3775 "Capability to RECEIVE the ORF from this neighbor\n"
3776 "Capability to SEND the ORF to this neighbor\n")
3779 int idx_send_recv
= 5;
3782 if (strmatch(argv
[idx_send_recv
]->text
, "send"))
3783 flag
= PEER_FLAG_ORF_PREFIX_SM
;
3784 else if (strmatch(argv
[idx_send_recv
]->text
, "receive"))
3785 flag
= PEER_FLAG_ORF_PREFIX_RM
;
3786 else if (strmatch(argv
[idx_send_recv
]->text
, "both"))
3787 flag
= PEER_FLAG_ORF_PREFIX_SM
| PEER_FLAG_ORF_PREFIX_RM
;
3789 vty_out(vty
, "%% BGP invalid orf prefix-list option\n");
3790 return CMD_WARNING_CONFIG_FAILED
;
3793 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
3794 bgp_node_safi(vty
), flag
);
3798 neighbor_capability_orf_prefix
,
3799 neighbor_capability_orf_prefix_hidden_cmd
,
3800 "neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
3801 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3802 "Advertise capability to the peer\n"
3803 "Advertise ORF capability to the peer\n"
3804 "Advertise prefixlist ORF capability to this neighbor\n"
3805 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
3806 "Capability to RECEIVE the ORF from this neighbor\n"
3807 "Capability to SEND the ORF to this neighbor\n")
3809 DEFUN (no_neighbor_capability_orf_prefix
,
3810 no_neighbor_capability_orf_prefix_cmd
,
3811 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
3815 "Advertise capability to the peer\n"
3816 "Advertise ORF capability to the peer\n"
3817 "Advertise prefixlist ORF capability to this neighbor\n"
3818 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
3819 "Capability to RECEIVE the ORF from this neighbor\n"
3820 "Capability to SEND the ORF to this neighbor\n")
3823 int idx_send_recv
= 6;
3826 if (strmatch(argv
[idx_send_recv
]->text
, "send"))
3827 flag
= PEER_FLAG_ORF_PREFIX_SM
;
3828 else if (strmatch(argv
[idx_send_recv
]->text
, "receive"))
3829 flag
= PEER_FLAG_ORF_PREFIX_RM
;
3830 else if (strmatch(argv
[idx_send_recv
]->text
, "both"))
3831 flag
= PEER_FLAG_ORF_PREFIX_SM
| PEER_FLAG_ORF_PREFIX_RM
;
3833 vty_out(vty
, "%% BGP invalid orf prefix-list option\n");
3834 return CMD_WARNING_CONFIG_FAILED
;
3837 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3838 bgp_node_afi(vty
), bgp_node_safi(vty
),
3843 no_neighbor_capability_orf_prefix
,
3844 no_neighbor_capability_orf_prefix_hidden_cmd
,
3845 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
3846 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3847 "Advertise capability to the peer\n"
3848 "Advertise ORF capability to the peer\n"
3849 "Advertise prefixlist ORF capability to this neighbor\n"
3850 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
3851 "Capability to RECEIVE the ORF from this neighbor\n"
3852 "Capability to SEND the ORF to this neighbor\n")
3854 /* neighbor next-hop-self. */
3855 DEFUN (neighbor_nexthop_self
,
3856 neighbor_nexthop_self_cmd
,
3857 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
3860 "Disable the next hop calculation for this neighbor\n")
3863 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
3864 bgp_node_safi(vty
), PEER_FLAG_NEXTHOP_SELF
);
3867 ALIAS_HIDDEN(neighbor_nexthop_self
, neighbor_nexthop_self_hidden_cmd
,
3868 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
3869 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3870 "Disable the next hop calculation for this neighbor\n")
3872 /* neighbor next-hop-self. */
3873 DEFUN (neighbor_nexthop_self_force
,
3874 neighbor_nexthop_self_force_cmd
,
3875 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
3878 "Disable the next hop calculation for this neighbor\n"
3879 "Set the next hop to self for reflected routes\n")
3882 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
3884 PEER_FLAG_FORCE_NEXTHOP_SELF
);
3887 ALIAS_HIDDEN(neighbor_nexthop_self_force
,
3888 neighbor_nexthop_self_force_hidden_cmd
,
3889 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
3890 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3891 "Disable the next hop calculation for this neighbor\n"
3892 "Set the next hop to self for reflected routes\n")
3894 ALIAS_HIDDEN(neighbor_nexthop_self_force
,
3895 neighbor_nexthop_self_all_hidden_cmd
,
3896 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self all",
3897 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3898 "Disable the next hop calculation for this neighbor\n"
3899 "Set the next hop to self for reflected routes\n")
3901 DEFUN (no_neighbor_nexthop_self
,
3902 no_neighbor_nexthop_self_cmd
,
3903 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
3907 "Disable the next hop calculation for this neighbor\n")
3910 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3911 bgp_node_afi(vty
), bgp_node_safi(vty
),
3912 PEER_FLAG_NEXTHOP_SELF
);
3915 ALIAS_HIDDEN(no_neighbor_nexthop_self
, no_neighbor_nexthop_self_hidden_cmd
,
3916 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
3917 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3918 "Disable the next hop calculation for this neighbor\n")
3920 DEFUN (no_neighbor_nexthop_self_force
,
3921 no_neighbor_nexthop_self_force_cmd
,
3922 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
3926 "Disable the next hop calculation for this neighbor\n"
3927 "Set the next hop to self for reflected routes\n")
3930 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3931 bgp_node_afi(vty
), bgp_node_safi(vty
),
3932 PEER_FLAG_FORCE_NEXTHOP_SELF
);
3935 ALIAS_HIDDEN(no_neighbor_nexthop_self_force
,
3936 no_neighbor_nexthop_self_force_hidden_cmd
,
3937 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
3938 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3939 "Disable the next hop calculation for this neighbor\n"
3940 "Set the next hop to self for reflected routes\n")
3942 ALIAS_HIDDEN(no_neighbor_nexthop_self_force
,
3943 no_neighbor_nexthop_self_all_hidden_cmd
,
3944 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self all",
3945 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3946 "Disable the next hop calculation for this neighbor\n"
3947 "Set the next hop to self for reflected routes\n")
3949 /* neighbor as-override */
3950 DEFUN (neighbor_as_override
,
3951 neighbor_as_override_cmd
,
3952 "neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
3955 "Override ASNs in outbound updates if aspath equals remote-as\n")
3958 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
3959 bgp_node_safi(vty
), PEER_FLAG_AS_OVERRIDE
);
3962 ALIAS_HIDDEN(neighbor_as_override
, neighbor_as_override_hidden_cmd
,
3963 "neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
3964 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3965 "Override ASNs in outbound updates if aspath equals remote-as\n")
3967 DEFUN (no_neighbor_as_override
,
3968 no_neighbor_as_override_cmd
,
3969 "no neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
3973 "Override ASNs in outbound updates if aspath equals remote-as\n")
3976 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3977 bgp_node_afi(vty
), bgp_node_safi(vty
),
3978 PEER_FLAG_AS_OVERRIDE
);
3981 ALIAS_HIDDEN(no_neighbor_as_override
, no_neighbor_as_override_hidden_cmd
,
3982 "no neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
3983 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3984 "Override ASNs in outbound updates if aspath equals remote-as\n")
3986 /* neighbor remove-private-AS. */
3987 DEFUN (neighbor_remove_private_as
,
3988 neighbor_remove_private_as_cmd
,
3989 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
3992 "Remove private ASNs in outbound updates\n")
3995 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
3997 PEER_FLAG_REMOVE_PRIVATE_AS
);
4000 ALIAS_HIDDEN(neighbor_remove_private_as
, neighbor_remove_private_as_hidden_cmd
,
4001 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
4002 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4003 "Remove private ASNs in outbound updates\n")
4005 DEFUN (neighbor_remove_private_as_all
,
4006 neighbor_remove_private_as_all_cmd
,
4007 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
4010 "Remove private ASNs in outbound updates\n"
4011 "Apply to all AS numbers\n")
4014 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4016 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
);
4019 ALIAS_HIDDEN(neighbor_remove_private_as_all
,
4020 neighbor_remove_private_as_all_hidden_cmd
,
4021 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
4022 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4023 "Remove private ASNs in outbound updates\n"
4024 "Apply to all AS numbers")
4026 DEFUN (neighbor_remove_private_as_replace_as
,
4027 neighbor_remove_private_as_replace_as_cmd
,
4028 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
4031 "Remove private ASNs in outbound updates\n"
4032 "Replace private ASNs with our ASN in outbound updates\n")
4035 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4037 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
);
4040 ALIAS_HIDDEN(neighbor_remove_private_as_replace_as
,
4041 neighbor_remove_private_as_replace_as_hidden_cmd
,
4042 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
4043 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4044 "Remove private ASNs in outbound updates\n"
4045 "Replace private ASNs with our ASN in outbound updates\n")
4047 DEFUN (neighbor_remove_private_as_all_replace_as
,
4048 neighbor_remove_private_as_all_replace_as_cmd
,
4049 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
4052 "Remove private ASNs in outbound updates\n"
4053 "Apply to all AS numbers\n"
4054 "Replace private ASNs with our ASN in outbound updates\n")
4057 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4059 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
);
4063 neighbor_remove_private_as_all_replace_as
,
4064 neighbor_remove_private_as_all_replace_as_hidden_cmd
,
4065 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
4066 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4067 "Remove private ASNs in outbound updates\n"
4068 "Apply to all AS numbers\n"
4069 "Replace private ASNs with our ASN in outbound updates\n")
4071 DEFUN (no_neighbor_remove_private_as
,
4072 no_neighbor_remove_private_as_cmd
,
4073 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
4077 "Remove private ASNs in outbound updates\n")
4080 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4081 bgp_node_afi(vty
), bgp_node_safi(vty
),
4082 PEER_FLAG_REMOVE_PRIVATE_AS
);
4085 ALIAS_HIDDEN(no_neighbor_remove_private_as
,
4086 no_neighbor_remove_private_as_hidden_cmd
,
4087 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
4088 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4089 "Remove private ASNs in outbound updates\n")
4091 DEFUN (no_neighbor_remove_private_as_all
,
4092 no_neighbor_remove_private_as_all_cmd
,
4093 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
4097 "Remove private ASNs in outbound updates\n"
4098 "Apply to all AS numbers\n")
4101 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4102 bgp_node_afi(vty
), bgp_node_safi(vty
),
4103 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
);
4106 ALIAS_HIDDEN(no_neighbor_remove_private_as_all
,
4107 no_neighbor_remove_private_as_all_hidden_cmd
,
4108 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
4109 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4110 "Remove private ASNs in outbound updates\n"
4111 "Apply to all AS numbers\n")
4113 DEFUN (no_neighbor_remove_private_as_replace_as
,
4114 no_neighbor_remove_private_as_replace_as_cmd
,
4115 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
4119 "Remove private ASNs in outbound updates\n"
4120 "Replace private ASNs with our ASN in outbound updates\n")
4123 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4124 bgp_node_afi(vty
), bgp_node_safi(vty
),
4125 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
);
4128 ALIAS_HIDDEN(no_neighbor_remove_private_as_replace_as
,
4129 no_neighbor_remove_private_as_replace_as_hidden_cmd
,
4130 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
4131 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4132 "Remove private ASNs in outbound updates\n"
4133 "Replace private ASNs with our ASN in outbound updates\n")
4135 DEFUN (no_neighbor_remove_private_as_all_replace_as
,
4136 no_neighbor_remove_private_as_all_replace_as_cmd
,
4137 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
4141 "Remove private ASNs in outbound updates\n"
4142 "Apply to all AS numbers\n"
4143 "Replace private ASNs with our ASN in outbound updates\n")
4146 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4147 bgp_node_afi(vty
), bgp_node_safi(vty
),
4148 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
);
4152 no_neighbor_remove_private_as_all_replace_as
,
4153 no_neighbor_remove_private_as_all_replace_as_hidden_cmd
,
4154 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
4155 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4156 "Remove private ASNs in outbound updates\n"
4157 "Apply to all AS numbers\n"
4158 "Replace private ASNs with our ASN in outbound updates\n")
4161 /* neighbor send-community. */
4162 DEFUN (neighbor_send_community
,
4163 neighbor_send_community_cmd
,
4164 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
4167 "Send Community attribute to this neighbor\n")
4171 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4173 PEER_FLAG_SEND_COMMUNITY
);
4176 ALIAS_HIDDEN(neighbor_send_community
, neighbor_send_community_hidden_cmd
,
4177 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
4178 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4179 "Send Community attribute to this neighbor\n")
4181 DEFUN (no_neighbor_send_community
,
4182 no_neighbor_send_community_cmd
,
4183 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
4187 "Send Community attribute to this neighbor\n")
4191 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4192 bgp_node_afi(vty
), bgp_node_safi(vty
),
4193 PEER_FLAG_SEND_COMMUNITY
);
4196 ALIAS_HIDDEN(no_neighbor_send_community
, no_neighbor_send_community_hidden_cmd
,
4197 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
4198 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4199 "Send Community attribute to this neighbor\n")
4201 /* neighbor send-community extended. */
4202 DEFUN (neighbor_send_community_type
,
4203 neighbor_send_community_type_cmd
,
4204 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
4207 "Send Community attribute to this neighbor\n"
4208 "Send Standard and Extended Community attributes\n"
4209 "Send Standard, Large and Extended Community attributes\n"
4210 "Send Extended Community attributes\n"
4211 "Send Standard Community attributes\n"
4212 "Send Large Community attributes\n")
4216 const char *type
= argv
[argc
- 1]->text
;
4218 if (strmatch(type
, "standard")) {
4219 SET_FLAG(flag
, PEER_FLAG_SEND_COMMUNITY
);
4220 } else if (strmatch(type
, "extended")) {
4221 SET_FLAG(flag
, PEER_FLAG_SEND_EXT_COMMUNITY
);
4222 } else if (strmatch(type
, "large")) {
4223 SET_FLAG(flag
, PEER_FLAG_SEND_LARGE_COMMUNITY
);
4224 } else if (strmatch(type
, "both")) {
4225 SET_FLAG(flag
, PEER_FLAG_SEND_COMMUNITY
);
4226 SET_FLAG(flag
, PEER_FLAG_SEND_EXT_COMMUNITY
);
4227 } else { /* if (strmatch(type, "all")) */
4228 SET_FLAG(flag
, PEER_FLAG_SEND_COMMUNITY
);
4229 SET_FLAG(flag
, PEER_FLAG_SEND_EXT_COMMUNITY
);
4230 SET_FLAG(flag
, PEER_FLAG_SEND_LARGE_COMMUNITY
);
4233 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4234 bgp_node_safi(vty
), flag
);
4238 neighbor_send_community_type
, neighbor_send_community_type_hidden_cmd
,
4239 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
4240 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4241 "Send Community attribute to this neighbor\n"
4242 "Send Standard and Extended Community attributes\n"
4243 "Send Standard, Large and Extended Community attributes\n"
4244 "Send Extended Community attributes\n"
4245 "Send Standard Community attributes\n"
4246 "Send Large Community attributes\n")
4248 DEFUN (no_neighbor_send_community_type
,
4249 no_neighbor_send_community_type_cmd
,
4250 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
4254 "Send Community attribute to this neighbor\n"
4255 "Send Standard and Extended Community attributes\n"
4256 "Send Standard, Large and Extended Community attributes\n"
4257 "Send Extended Community attributes\n"
4258 "Send Standard Community attributes\n"
4259 "Send Large Community attributes\n")
4263 const char *type
= argv
[argc
- 1]->text
;
4265 if (strmatch(type
, "standard")) {
4266 SET_FLAG(flag
, PEER_FLAG_SEND_COMMUNITY
);
4267 } else if (strmatch(type
, "extended")) {
4268 SET_FLAG(flag
, PEER_FLAG_SEND_EXT_COMMUNITY
);
4269 } else if (strmatch(type
, "large")) {
4270 SET_FLAG(flag
, PEER_FLAG_SEND_LARGE_COMMUNITY
);
4271 } else if (strmatch(type
, "both")) {
4272 SET_FLAG(flag
, PEER_FLAG_SEND_COMMUNITY
);
4273 SET_FLAG(flag
, PEER_FLAG_SEND_EXT_COMMUNITY
);
4274 } else { /* if (strmatch(type, "all")) */
4275 SET_FLAG(flag
, PEER_FLAG_SEND_COMMUNITY
);
4276 SET_FLAG(flag
, PEER_FLAG_SEND_EXT_COMMUNITY
);
4277 SET_FLAG(flag
, PEER_FLAG_SEND_LARGE_COMMUNITY
);
4280 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4281 bgp_node_afi(vty
), bgp_node_safi(vty
),
4286 no_neighbor_send_community_type
,
4287 no_neighbor_send_community_type_hidden_cmd
,
4288 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
4289 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4290 "Send Community attribute to this neighbor\n"
4291 "Send Standard and Extended Community attributes\n"
4292 "Send Standard, Large and Extended Community attributes\n"
4293 "Send Extended Community attributes\n"
4294 "Send Standard Community attributes\n"
4295 "Send Large Community attributes\n")
4297 /* neighbor soft-reconfig. */
4298 DEFUN (neighbor_soft_reconfiguration
,
4299 neighbor_soft_reconfiguration_cmd
,
4300 "neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
4303 "Per neighbor soft reconfiguration\n"
4304 "Allow inbound soft reconfiguration for this neighbor\n")
4307 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4309 PEER_FLAG_SOFT_RECONFIG
);
4312 ALIAS_HIDDEN(neighbor_soft_reconfiguration
,
4313 neighbor_soft_reconfiguration_hidden_cmd
,
4314 "neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
4315 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4316 "Per neighbor soft reconfiguration\n"
4317 "Allow inbound soft reconfiguration for this neighbor\n")
4319 DEFUN (no_neighbor_soft_reconfiguration
,
4320 no_neighbor_soft_reconfiguration_cmd
,
4321 "no neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
4325 "Per neighbor soft reconfiguration\n"
4326 "Allow inbound soft reconfiguration for this neighbor\n")
4329 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4330 bgp_node_afi(vty
), bgp_node_safi(vty
),
4331 PEER_FLAG_SOFT_RECONFIG
);
4334 ALIAS_HIDDEN(no_neighbor_soft_reconfiguration
,
4335 no_neighbor_soft_reconfiguration_hidden_cmd
,
4336 "no neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
4337 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4338 "Per neighbor soft reconfiguration\n"
4339 "Allow inbound soft reconfiguration for this neighbor\n")
4341 DEFUN (neighbor_route_reflector_client
,
4342 neighbor_route_reflector_client_cmd
,
4343 "neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
4346 "Configure a neighbor as Route Reflector client\n")
4352 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
4354 return CMD_WARNING_CONFIG_FAILED
;
4356 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4358 PEER_FLAG_REFLECTOR_CLIENT
);
4361 ALIAS_HIDDEN(neighbor_route_reflector_client
,
4362 neighbor_route_reflector_client_hidden_cmd
,
4363 "neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
4364 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4365 "Configure a neighbor as Route Reflector client\n")
4367 DEFUN (no_neighbor_route_reflector_client
,
4368 no_neighbor_route_reflector_client_cmd
,
4369 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
4373 "Configure a neighbor as Route Reflector client\n")
4376 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4377 bgp_node_afi(vty
), bgp_node_safi(vty
),
4378 PEER_FLAG_REFLECTOR_CLIENT
);
4381 ALIAS_HIDDEN(no_neighbor_route_reflector_client
,
4382 no_neighbor_route_reflector_client_hidden_cmd
,
4383 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
4384 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4385 "Configure a neighbor as Route Reflector client\n")
4387 /* neighbor route-server-client. */
4388 DEFUN (neighbor_route_server_client
,
4389 neighbor_route_server_client_cmd
,
4390 "neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
4393 "Configure a neighbor as Route Server client\n")
4398 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
4400 return CMD_WARNING_CONFIG_FAILED
;
4401 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4403 PEER_FLAG_RSERVER_CLIENT
);
4406 ALIAS_HIDDEN(neighbor_route_server_client
,
4407 neighbor_route_server_client_hidden_cmd
,
4408 "neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
4409 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4410 "Configure a neighbor as Route Server client\n")
4412 DEFUN (no_neighbor_route_server_client
,
4413 no_neighbor_route_server_client_cmd
,
4414 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
4418 "Configure a neighbor as Route Server client\n")
4421 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4422 bgp_node_afi(vty
), bgp_node_safi(vty
),
4423 PEER_FLAG_RSERVER_CLIENT
);
4426 ALIAS_HIDDEN(no_neighbor_route_server_client
,
4427 no_neighbor_route_server_client_hidden_cmd
,
4428 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
4429 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4430 "Configure a neighbor as Route Server client\n")
4432 DEFUN (neighbor_nexthop_local_unchanged
,
4433 neighbor_nexthop_local_unchanged_cmd
,
4434 "neighbor <A.B.C.D|X:X::X:X|WORD> nexthop-local unchanged",
4437 "Configure treatment of outgoing link-local nexthop attribute\n"
4438 "Leave link-local nexthop unchanged for this peer\n")
4441 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4443 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
);
4446 DEFUN (no_neighbor_nexthop_local_unchanged
,
4447 no_neighbor_nexthop_local_unchanged_cmd
,
4448 "no neighbor <A.B.C.D|X:X::X:X|WORD> nexthop-local unchanged",
4452 "Configure treatment of outgoing link-local-nexthop attribute\n"
4453 "Leave link-local nexthop unchanged for this peer\n")
4456 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4457 bgp_node_afi(vty
), bgp_node_safi(vty
),
4458 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
);
4461 DEFUN (neighbor_attr_unchanged
,
4462 neighbor_attr_unchanged_cmd
,
4463 "neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
4466 "BGP attribute is propagated unchanged to this neighbor\n"
4467 "As-path attribute\n"
4468 "Nexthop attribute\n"
4472 char *peer_str
= argv
[1]->arg
;
4475 afi_t afi
= bgp_node_afi(vty
);
4476 safi_t safi
= bgp_node_safi(vty
);
4478 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
4480 return CMD_WARNING_CONFIG_FAILED
;
4482 if (argv_find(argv
, argc
, "as-path", &idx
))
4483 SET_FLAG(flags
, PEER_FLAG_AS_PATH_UNCHANGED
);
4485 if (argv_find(argv
, argc
, "next-hop", &idx
))
4486 SET_FLAG(flags
, PEER_FLAG_NEXTHOP_UNCHANGED
);
4488 if (argv_find(argv
, argc
, "med", &idx
))
4489 SET_FLAG(flags
, PEER_FLAG_MED_UNCHANGED
);
4491 /* no flags means all of them! */
4493 SET_FLAG(flags
, PEER_FLAG_AS_PATH_UNCHANGED
);
4494 SET_FLAG(flags
, PEER_FLAG_NEXTHOP_UNCHANGED
);
4495 SET_FLAG(flags
, PEER_FLAG_MED_UNCHANGED
);
4497 if (!CHECK_FLAG(flags
, PEER_FLAG_AS_PATH_UNCHANGED
)
4498 && peer_af_flag_check(peer
, afi
, safi
,
4499 PEER_FLAG_AS_PATH_UNCHANGED
)) {
4500 peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
4501 PEER_FLAG_AS_PATH_UNCHANGED
);
4504 if (!CHECK_FLAG(flags
, PEER_FLAG_NEXTHOP_UNCHANGED
)
4505 && peer_af_flag_check(peer
, afi
, safi
,
4506 PEER_FLAG_NEXTHOP_UNCHANGED
)) {
4507 peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
4508 PEER_FLAG_NEXTHOP_UNCHANGED
);
4511 if (!CHECK_FLAG(flags
, PEER_FLAG_MED_UNCHANGED
)
4512 && peer_af_flag_check(peer
, afi
, safi
,
4513 PEER_FLAG_MED_UNCHANGED
)) {
4514 peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
4515 PEER_FLAG_MED_UNCHANGED
);
4519 return peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
, flags
);
4523 neighbor_attr_unchanged
, neighbor_attr_unchanged_hidden_cmd
,
4524 "neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
4525 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4526 "BGP attribute is propagated unchanged to this neighbor\n"
4527 "As-path attribute\n"
4528 "Nexthop attribute\n"
4531 DEFUN (no_neighbor_attr_unchanged
,
4532 no_neighbor_attr_unchanged_cmd
,
4533 "no neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
4537 "BGP attribute is propagated unchanged to this neighbor\n"
4538 "As-path attribute\n"
4539 "Nexthop attribute\n"
4543 char *peer
= argv
[2]->arg
;
4546 if (argv_find(argv
, argc
, "as-path", &idx
))
4547 SET_FLAG(flags
, PEER_FLAG_AS_PATH_UNCHANGED
);
4549 if (argv_find(argv
, argc
, "next-hop", &idx
))
4550 SET_FLAG(flags
, PEER_FLAG_NEXTHOP_UNCHANGED
);
4552 if (argv_find(argv
, argc
, "med", &idx
))
4553 SET_FLAG(flags
, PEER_FLAG_MED_UNCHANGED
);
4555 if (!flags
) // no flags means all of them!
4557 SET_FLAG(flags
, PEER_FLAG_AS_PATH_UNCHANGED
);
4558 SET_FLAG(flags
, PEER_FLAG_NEXTHOP_UNCHANGED
);
4559 SET_FLAG(flags
, PEER_FLAG_MED_UNCHANGED
);
4562 return peer_af_flag_unset_vty(vty
, peer
, bgp_node_afi(vty
),
4563 bgp_node_safi(vty
), flags
);
4567 no_neighbor_attr_unchanged
, no_neighbor_attr_unchanged_hidden_cmd
,
4568 "no neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
4569 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4570 "BGP attribute is propagated unchanged to this neighbor\n"
4571 "As-path attribute\n"
4572 "Nexthop attribute\n"
4575 /* EBGP multihop configuration. */
4576 static int peer_ebgp_multihop_set_vty(struct vty
*vty
, const char *ip_str
,
4577 const char *ttl_str
)
4582 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
4584 return CMD_WARNING_CONFIG_FAILED
;
4587 return bgp_vty_return(vty
, BGP_ERR_INVALID_FOR_DIRECT_PEER
);
4592 ttl
= strtoul(ttl_str
, NULL
, 10);
4594 return bgp_vty_return(vty
, peer_ebgp_multihop_set(peer
, ttl
));
4597 static int peer_ebgp_multihop_unset_vty(struct vty
*vty
, const char *ip_str
)
4601 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
4603 return CMD_WARNING_CONFIG_FAILED
;
4605 return bgp_vty_return(vty
, peer_ebgp_multihop_unset(peer
));
4608 /* neighbor ebgp-multihop. */
4609 DEFUN (neighbor_ebgp_multihop
,
4610 neighbor_ebgp_multihop_cmd
,
4611 "neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop",
4614 "Allow EBGP neighbors not on directly connected networks\n")
4617 return peer_ebgp_multihop_set_vty(vty
, argv
[idx_peer
]->arg
, NULL
);
4620 DEFUN (neighbor_ebgp_multihop_ttl
,
4621 neighbor_ebgp_multihop_ttl_cmd
,
4622 "neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop (1-255)",
4625 "Allow EBGP neighbors not on directly connected networks\n"
4626 "maximum hop count\n")
4630 return peer_ebgp_multihop_set_vty(vty
, argv
[idx_peer
]->arg
,
4631 argv
[idx_number
]->arg
);
4634 DEFUN (no_neighbor_ebgp_multihop
,
4635 no_neighbor_ebgp_multihop_cmd
,
4636 "no neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop [(1-255)]",
4640 "Allow EBGP neighbors not on directly connected networks\n"
4641 "maximum hop count\n")
4644 return peer_ebgp_multihop_unset_vty(vty
, argv
[idx_peer
]->arg
);
4648 /* disable-connected-check */
4649 DEFUN (neighbor_disable_connected_check
,
4650 neighbor_disable_connected_check_cmd
,
4651 "neighbor <A.B.C.D|X:X::X:X|WORD> <disable-connected-check|enforce-multihop>",
4654 "one-hop away EBGP peer using loopback address\n"
4655 "Enforce EBGP neighbors perform multihop\n")
4658 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
4659 PEER_FLAG_DISABLE_CONNECTED_CHECK
);
4662 DEFUN (no_neighbor_disable_connected_check
,
4663 no_neighbor_disable_connected_check_cmd
,
4664 "no neighbor <A.B.C.D|X:X::X:X|WORD> <disable-connected-check|enforce-multihop>",
4668 "one-hop away EBGP peer using loopback address\n"
4669 "Enforce EBGP neighbors perform multihop\n")
4672 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4673 PEER_FLAG_DISABLE_CONNECTED_CHECK
);
4677 /* enforce-first-as */
4678 DEFUN (neighbor_enforce_first_as
,
4679 neighbor_enforce_first_as_cmd
,
4680 "neighbor <A.B.C.D|X:X::X:X|WORD> enforce-first-as",
4683 "Enforce the first AS for EBGP routes\n")
4687 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
4688 PEER_FLAG_ENFORCE_FIRST_AS
);
4691 DEFUN (no_neighbor_enforce_first_as
,
4692 no_neighbor_enforce_first_as_cmd
,
4693 "no neighbor <A.B.C.D|X:X::X:X|WORD> enforce-first-as",
4697 "Enforce the first AS for EBGP routes\n")
4701 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4702 PEER_FLAG_ENFORCE_FIRST_AS
);
4706 DEFUN (neighbor_description
,
4707 neighbor_description_cmd
,
4708 "neighbor <A.B.C.D|X:X::X:X|WORD> description LINE...",
4711 "Neighbor specific description\n"
4712 "Up to 80 characters describing this neighbor\n")
4719 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
4721 return CMD_WARNING_CONFIG_FAILED
;
4723 str
= argv_concat(argv
, argc
, idx_line
);
4725 peer_description_set(peer
, str
);
4727 XFREE(MTYPE_TMP
, str
);
4732 DEFUN (no_neighbor_description
,
4733 no_neighbor_description_cmd
,
4734 "no neighbor <A.B.C.D|X:X::X:X|WORD> description",
4738 "Neighbor specific description\n")
4743 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
4745 return CMD_WARNING_CONFIG_FAILED
;
4747 peer_description_unset(peer
);
4752 ALIAS(no_neighbor_description
, no_neighbor_description_comment_cmd
,
4753 "no neighbor <A.B.C.D|X:X::X:X|WORD> description LINE...",
4754 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4755 "Neighbor specific description\n"
4756 "Up to 80 characters describing this neighbor\n")
4758 /* Neighbor update-source. */
4759 static int peer_update_source_vty(struct vty
*vty
, const char *peer_str
,
4760 const char *source_str
)
4766 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
4768 return CMD_WARNING_CONFIG_FAILED
;
4774 if (str2sockunion(source_str
, &su
) == 0)
4775 peer_update_source_addr_set(peer
, &su
);
4777 if (str2prefix(source_str
, &p
)) {
4779 "%% Invalid update-source, remove prefix length \n");
4780 return CMD_WARNING_CONFIG_FAILED
;
4782 peer_update_source_if_set(peer
, source_str
);
4785 peer_update_source_unset(peer
);
4790 #define BGP_UPDATE_SOURCE_HELP_STR \
4793 "Interface name (requires zebra to be running)\n"
4795 DEFUN (neighbor_update_source
,
4796 neighbor_update_source_cmd
,
4797 "neighbor <A.B.C.D|X:X::X:X|WORD> update-source <A.B.C.D|X:X::X:X|WORD>",
4800 "Source of routing updates\n"
4801 BGP_UPDATE_SOURCE_HELP_STR
)
4805 return peer_update_source_vty(vty
, argv
[idx_peer
]->arg
,
4806 argv
[idx_peer_2
]->arg
);
4809 DEFUN (no_neighbor_update_source
,
4810 no_neighbor_update_source_cmd
,
4811 "no neighbor <A.B.C.D|X:X::X:X|WORD> update-source [<A.B.C.D|X:X::X:X|WORD>]",
4815 "Source of routing updates\n"
4816 BGP_UPDATE_SOURCE_HELP_STR
)
4819 return peer_update_source_vty(vty
, argv
[idx_peer
]->arg
, NULL
);
4822 static int peer_default_originate_set_vty(struct vty
*vty
, const char *peer_str
,
4823 afi_t afi
, safi_t safi
,
4824 const char *rmap
, int set
)
4828 struct route_map
*route_map
;
4830 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
4832 return CMD_WARNING_CONFIG_FAILED
;
4835 route_map
= route_map_lookup_warn_noexist(vty
, rmap
);
4836 ret
= peer_default_originate_set(peer
, afi
, safi
,
4839 ret
= peer_default_originate_unset(peer
, afi
, safi
);
4841 return bgp_vty_return(vty
, ret
);
4844 /* neighbor default-originate. */
4845 DEFUN (neighbor_default_originate
,
4846 neighbor_default_originate_cmd
,
4847 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate",
4850 "Originate default route to this neighbor\n")
4853 return peer_default_originate_set_vty(vty
, argv
[idx_peer
]->arg
,
4855 bgp_node_safi(vty
), NULL
, 1);
4858 ALIAS_HIDDEN(neighbor_default_originate
, neighbor_default_originate_hidden_cmd
,
4859 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate",
4860 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4861 "Originate default route to this neighbor\n")
4863 DEFUN (neighbor_default_originate_rmap
,
4864 neighbor_default_originate_rmap_cmd
,
4865 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate route-map WORD",
4868 "Originate default route to this neighbor\n"
4869 "Route-map to specify criteria to originate default\n"
4874 return peer_default_originate_set_vty(
4875 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
4876 argv
[idx_word
]->arg
, 1);
4880 neighbor_default_originate_rmap
,
4881 neighbor_default_originate_rmap_hidden_cmd
,
4882 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate route-map WORD",
4883 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4884 "Originate default route to this neighbor\n"
4885 "Route-map to specify criteria to originate default\n"
4888 DEFUN (no_neighbor_default_originate
,
4889 no_neighbor_default_originate_cmd
,
4890 "no neighbor <A.B.C.D|X:X::X:X|WORD> default-originate [route-map WORD]",
4894 "Originate default route to this neighbor\n"
4895 "Route-map to specify criteria to originate default\n"
4899 return peer_default_originate_set_vty(vty
, argv
[idx_peer
]->arg
,
4901 bgp_node_safi(vty
), NULL
, 0);
4905 no_neighbor_default_originate
, no_neighbor_default_originate_hidden_cmd
,
4906 "no neighbor <A.B.C.D|X:X::X:X|WORD> default-originate [route-map WORD]",
4907 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4908 "Originate default route to this neighbor\n"
4909 "Route-map to specify criteria to originate default\n"
4913 /* Set neighbor's BGP port. */
4914 static int peer_port_vty(struct vty
*vty
, const char *ip_str
, int afi
,
4915 const char *port_str
)
4921 peer
= peer_lookup_vty(vty
, ip_str
);
4923 return CMD_WARNING_CONFIG_FAILED
;
4926 sp
= getservbyname("bgp", "tcp");
4927 port
= (sp
== NULL
) ? BGP_PORT_DEFAULT
: ntohs(sp
->s_port
);
4929 port
= strtoul(port_str
, NULL
, 10);
4932 peer_port_set(peer
, port
);
4937 /* Set specified peer's BGP port. */
4938 DEFUN (neighbor_port
,
4940 "neighbor <A.B.C.D|X:X::X:X> port (0-65535)",
4943 "Neighbor's BGP port\n"
4944 "TCP port number\n")
4948 return peer_port_vty(vty
, argv
[idx_ip
]->arg
, AFI_IP
,
4949 argv
[idx_number
]->arg
);
4952 DEFUN (no_neighbor_port
,
4953 no_neighbor_port_cmd
,
4954 "no neighbor <A.B.C.D|X:X::X:X> port [(0-65535)]",
4958 "Neighbor's BGP port\n"
4959 "TCP port number\n")
4962 return peer_port_vty(vty
, argv
[idx_ip
]->arg
, AFI_IP
, NULL
);
4966 /* neighbor weight. */
4967 static int peer_weight_set_vty(struct vty
*vty
, const char *ip_str
, afi_t afi
,
4968 safi_t safi
, const char *weight_str
)
4972 unsigned long weight
;
4974 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
4976 return CMD_WARNING_CONFIG_FAILED
;
4978 weight
= strtoul(weight_str
, NULL
, 10);
4980 ret
= peer_weight_set(peer
, afi
, safi
, weight
);
4981 return bgp_vty_return(vty
, ret
);
4984 static int peer_weight_unset_vty(struct vty
*vty
, const char *ip_str
, afi_t afi
,
4990 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
4992 return CMD_WARNING_CONFIG_FAILED
;
4994 ret
= peer_weight_unset(peer
, afi
, safi
);
4995 return bgp_vty_return(vty
, ret
);
4998 DEFUN (neighbor_weight
,
4999 neighbor_weight_cmd
,
5000 "neighbor <A.B.C.D|X:X::X:X|WORD> weight (0-65535)",
5003 "Set default weight for routes from this neighbor\n"
5008 return peer_weight_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
5009 bgp_node_safi(vty
), argv
[idx_number
]->arg
);
5012 ALIAS_HIDDEN(neighbor_weight
, neighbor_weight_hidden_cmd
,
5013 "neighbor <A.B.C.D|X:X::X:X|WORD> weight (0-65535)",
5014 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5015 "Set default weight for routes from this neighbor\n"
5018 DEFUN (no_neighbor_weight
,
5019 no_neighbor_weight_cmd
,
5020 "no neighbor <A.B.C.D|X:X::X:X|WORD> weight [(0-65535)]",
5024 "Set default weight for routes from this neighbor\n"
5028 return peer_weight_unset_vty(vty
, argv
[idx_peer
]->arg
,
5029 bgp_node_afi(vty
), bgp_node_safi(vty
));
5032 ALIAS_HIDDEN(no_neighbor_weight
, no_neighbor_weight_hidden_cmd
,
5033 "no neighbor <A.B.C.D|X:X::X:X|WORD> weight [(0-65535)]",
5034 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5035 "Set default weight for routes from this neighbor\n"
5039 /* Override capability negotiation. */
5040 DEFUN (neighbor_override_capability
,
5041 neighbor_override_capability_cmd
,
5042 "neighbor <A.B.C.D|X:X::X:X|WORD> override-capability",
5045 "Override capability negotiation result\n")
5048 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
5049 PEER_FLAG_OVERRIDE_CAPABILITY
);
5052 DEFUN (no_neighbor_override_capability
,
5053 no_neighbor_override_capability_cmd
,
5054 "no neighbor <A.B.C.D|X:X::X:X|WORD> override-capability",
5058 "Override capability negotiation result\n")
5061 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
5062 PEER_FLAG_OVERRIDE_CAPABILITY
);
5065 DEFUN (neighbor_strict_capability
,
5066 neighbor_strict_capability_cmd
,
5067 "neighbor <A.B.C.D|X:X::X:X|WORD> strict-capability-match",
5070 "Strict capability negotiation match\n")
5074 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
5075 PEER_FLAG_STRICT_CAP_MATCH
);
5078 DEFUN (no_neighbor_strict_capability
,
5079 no_neighbor_strict_capability_cmd
,
5080 "no neighbor <A.B.C.D|X:X::X:X|WORD> strict-capability-match",
5084 "Strict capability negotiation match\n")
5088 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
5089 PEER_FLAG_STRICT_CAP_MATCH
);
5092 static int peer_timers_set_vty(struct vty
*vty
, const char *ip_str
,
5093 const char *keep_str
, const char *hold_str
)
5100 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5102 return CMD_WARNING_CONFIG_FAILED
;
5104 keepalive
= strtoul(keep_str
, NULL
, 10);
5105 holdtime
= strtoul(hold_str
, NULL
, 10);
5107 ret
= peer_timers_set(peer
, keepalive
, holdtime
);
5109 return bgp_vty_return(vty
, ret
);
5112 static int peer_timers_unset_vty(struct vty
*vty
, const char *ip_str
)
5117 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5119 return CMD_WARNING_CONFIG_FAILED
;
5121 ret
= peer_timers_unset(peer
);
5123 return bgp_vty_return(vty
, ret
);
5126 DEFUN (neighbor_timers
,
5127 neighbor_timers_cmd
,
5128 "neighbor <A.B.C.D|X:X::X:X|WORD> timers (0-65535) (0-65535)",
5131 "BGP per neighbor timers\n"
5132 "Keepalive interval\n"
5137 int idx_number_2
= 4;
5138 return peer_timers_set_vty(vty
, argv
[idx_peer
]->arg
,
5139 argv
[idx_number
]->arg
,
5140 argv
[idx_number_2
]->arg
);
5143 DEFUN (no_neighbor_timers
,
5144 no_neighbor_timers_cmd
,
5145 "no neighbor <A.B.C.D|X:X::X:X|WORD> timers [(0-65535) (0-65535)]",
5149 "BGP per neighbor timers\n"
5150 "Keepalive interval\n"
5154 return peer_timers_unset_vty(vty
, argv
[idx_peer
]->arg
);
5158 static int peer_timers_connect_set_vty(struct vty
*vty
, const char *ip_str
,
5159 const char *time_str
)
5165 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5167 return CMD_WARNING_CONFIG_FAILED
;
5169 connect
= strtoul(time_str
, NULL
, 10);
5171 ret
= peer_timers_connect_set(peer
, connect
);
5173 return bgp_vty_return(vty
, ret
);
5176 static int peer_timers_connect_unset_vty(struct vty
*vty
, const char *ip_str
)
5181 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5183 return CMD_WARNING_CONFIG_FAILED
;
5185 ret
= peer_timers_connect_unset(peer
);
5187 return bgp_vty_return(vty
, ret
);
5190 DEFUN (neighbor_timers_connect
,
5191 neighbor_timers_connect_cmd
,
5192 "neighbor <A.B.C.D|X:X::X:X|WORD> timers connect (1-65535)",
5195 "BGP per neighbor timers\n"
5196 "BGP connect timer\n"
5201 return peer_timers_connect_set_vty(vty
, argv
[idx_peer
]->arg
,
5202 argv
[idx_number
]->arg
);
5205 DEFUN (no_neighbor_timers_connect
,
5206 no_neighbor_timers_connect_cmd
,
5207 "no neighbor <A.B.C.D|X:X::X:X|WORD> timers connect [(1-65535)]",
5211 "BGP per neighbor timers\n"
5212 "BGP connect timer\n"
5216 return peer_timers_connect_unset_vty(vty
, argv
[idx_peer
]->arg
);
5220 static int peer_advertise_interval_vty(struct vty
*vty
, const char *ip_str
,
5221 const char *time_str
, int set
)
5225 uint32_t routeadv
= 0;
5227 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5229 return CMD_WARNING_CONFIG_FAILED
;
5232 routeadv
= strtoul(time_str
, NULL
, 10);
5235 ret
= peer_advertise_interval_set(peer
, routeadv
);
5237 ret
= peer_advertise_interval_unset(peer
);
5239 return bgp_vty_return(vty
, ret
);
5242 DEFUN (neighbor_advertise_interval
,
5243 neighbor_advertise_interval_cmd
,
5244 "neighbor <A.B.C.D|X:X::X:X|WORD> advertisement-interval (0-600)",
5247 "Minimum interval between sending BGP routing updates\n"
5248 "time in seconds\n")
5252 return peer_advertise_interval_vty(vty
, argv
[idx_peer
]->arg
,
5253 argv
[idx_number
]->arg
, 1);
5256 DEFUN (no_neighbor_advertise_interval
,
5257 no_neighbor_advertise_interval_cmd
,
5258 "no neighbor <A.B.C.D|X:X::X:X|WORD> advertisement-interval [(0-600)]",
5262 "Minimum interval between sending BGP routing updates\n"
5263 "time in seconds\n")
5266 return peer_advertise_interval_vty(vty
, argv
[idx_peer
]->arg
, NULL
, 0);
5270 /* Time to wait before processing route-map updates */
5271 DEFUN (bgp_set_route_map_delay_timer
,
5272 bgp_set_route_map_delay_timer_cmd
,
5273 "bgp route-map delay-timer (0-600)",
5275 "BGP route-map delay timer\n"
5276 "Time in secs to wait before processing route-map changes\n"
5277 "0 disables the timer, no route updates happen when route-maps change\n")
5280 uint32_t rmap_delay_timer
;
5282 if (argv
[idx_number
]->arg
) {
5283 rmap_delay_timer
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
5284 bm
->rmap_update_timer
= rmap_delay_timer
;
5286 /* if the dynamic update handling is being disabled, and a timer
5288 * running, stop the timer and act as if the timer has already
5291 if (!rmap_delay_timer
&& bm
->t_rmap_update
) {
5292 BGP_TIMER_OFF(bm
->t_rmap_update
);
5293 thread_execute(bm
->master
, bgp_route_map_update_timer
,
5298 vty_out(vty
, "%% BGP invalid route-map delay-timer\n");
5299 return CMD_WARNING_CONFIG_FAILED
;
5303 DEFUN (no_bgp_set_route_map_delay_timer
,
5304 no_bgp_set_route_map_delay_timer_cmd
,
5305 "no bgp route-map delay-timer [(0-600)]",
5308 "Default BGP route-map delay timer\n"
5309 "Reset to default time to wait for processing route-map changes\n"
5310 "0 disables the timer, no route updates happen when route-maps change\n")
5313 bm
->rmap_update_timer
= RMAP_DEFAULT_UPDATE_TIMER
;
5319 /* neighbor interface */
5320 static int peer_interface_vty(struct vty
*vty
, const char *ip_str
,
5325 peer
= peer_lookup_vty(vty
, ip_str
);
5326 if (!peer
|| peer
->conf_if
) {
5327 vty_out(vty
, "%% BGP invalid peer %s\n", ip_str
);
5328 return CMD_WARNING_CONFIG_FAILED
;
5332 peer_interface_set(peer
, str
);
5334 peer_interface_unset(peer
);
5339 DEFUN (neighbor_interface
,
5340 neighbor_interface_cmd
,
5341 "neighbor <A.B.C.D|X:X::X:X> interface WORD",
5349 return peer_interface_vty(vty
, argv
[idx_ip
]->arg
, argv
[idx_word
]->arg
);
5352 DEFUN (no_neighbor_interface
,
5353 no_neighbor_interface_cmd
,
5354 "no neighbor <A.B.C.D|X:X::X:X|WORD> interface WORD",
5362 return peer_interface_vty(vty
, argv
[idx_peer
]->arg
, NULL
);
5365 DEFUN (neighbor_distribute_list
,
5366 neighbor_distribute_list_cmd
,
5367 "neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list <(1-199)|(1300-2699)|WORD> <in|out>",
5370 "Filter updates to/from this neighbor\n"
5371 "IP access-list number\n"
5372 "IP access-list number (expanded range)\n"
5373 "IP Access-list name\n"
5374 "Filter incoming updates\n"
5375 "Filter outgoing updates\n")
5382 const char *pstr
= argv
[idx_peer
]->arg
;
5383 const char *acl
= argv
[idx_acl
]->arg
;
5384 const char *inout
= argv
[argc
- 1]->text
;
5386 peer
= peer_and_group_lookup_vty(vty
, pstr
);
5388 return CMD_WARNING_CONFIG_FAILED
;
5390 /* Check filter direction. */
5391 direct
= strmatch(inout
, "in") ? FILTER_IN
: FILTER_OUT
;
5392 ret
= peer_distribute_set(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5395 return bgp_vty_return(vty
, ret
);
5399 neighbor_distribute_list
, neighbor_distribute_list_hidden_cmd
,
5400 "neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list <(1-199)|(1300-2699)|WORD> <in|out>",
5401 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5402 "Filter updates to/from this neighbor\n"
5403 "IP access-list number\n"
5404 "IP access-list number (expanded range)\n"
5405 "IP Access-list name\n"
5406 "Filter incoming updates\n"
5407 "Filter outgoing updates\n")
5409 DEFUN (no_neighbor_distribute_list
,
5410 no_neighbor_distribute_list_cmd
,
5411 "no neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list <(1-199)|(1300-2699)|WORD> <in|out>",
5415 "Filter updates to/from this neighbor\n"
5416 "IP access-list number\n"
5417 "IP access-list number (expanded range)\n"
5418 "IP Access-list name\n"
5419 "Filter incoming updates\n"
5420 "Filter outgoing updates\n")
5426 const char *pstr
= argv
[idx_peer
]->arg
;
5427 const char *inout
= argv
[argc
- 1]->text
;
5429 peer
= peer_and_group_lookup_vty(vty
, pstr
);
5431 return CMD_WARNING_CONFIG_FAILED
;
5433 /* Check filter direction. */
5434 direct
= strmatch(inout
, "in") ? FILTER_IN
: FILTER_OUT
;
5435 ret
= peer_distribute_unset(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5438 return bgp_vty_return(vty
, ret
);
5442 no_neighbor_distribute_list
, no_neighbor_distribute_list_hidden_cmd
,
5443 "no neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list <(1-199)|(1300-2699)|WORD> <in|out>",
5444 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5445 "Filter updates to/from this neighbor\n"
5446 "IP access-list number\n"
5447 "IP access-list number (expanded range)\n"
5448 "IP Access-list name\n"
5449 "Filter incoming updates\n"
5450 "Filter outgoing updates\n")
5452 /* Set prefix list to the peer. */
5453 static int peer_prefix_list_set_vty(struct vty
*vty
, const char *ip_str
,
5454 afi_t afi
, safi_t safi
,
5455 const char *name_str
,
5456 const char *direct_str
)
5459 int direct
= FILTER_IN
;
5462 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5464 return CMD_WARNING_CONFIG_FAILED
;
5466 /* Check filter direction. */
5467 if (strncmp(direct_str
, "i", 1) == 0)
5469 else if (strncmp(direct_str
, "o", 1) == 0)
5470 direct
= FILTER_OUT
;
5472 ret
= peer_prefix_list_set(peer
, afi
, safi
, direct
, name_str
);
5474 return bgp_vty_return(vty
, ret
);
5477 static int peer_prefix_list_unset_vty(struct vty
*vty
, const char *ip_str
,
5478 afi_t afi
, safi_t safi
,
5479 const char *direct_str
)
5483 int direct
= FILTER_IN
;
5485 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5487 return CMD_WARNING_CONFIG_FAILED
;
5489 /* Check filter direction. */
5490 if (strncmp(direct_str
, "i", 1) == 0)
5492 else if (strncmp(direct_str
, "o", 1) == 0)
5493 direct
= FILTER_OUT
;
5495 ret
= peer_prefix_list_unset(peer
, afi
, safi
, direct
);
5497 return bgp_vty_return(vty
, ret
);
5500 DEFUN (neighbor_prefix_list
,
5501 neighbor_prefix_list_cmd
,
5502 "neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
5505 "Filter updates to/from this neighbor\n"
5506 "Name of a prefix list\n"
5507 "Filter incoming updates\n"
5508 "Filter outgoing updates\n")
5513 return peer_prefix_list_set_vty(
5514 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5515 argv
[idx_word
]->arg
, argv
[idx_in_out
]->arg
);
5518 ALIAS_HIDDEN(neighbor_prefix_list
, neighbor_prefix_list_hidden_cmd
,
5519 "neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
5520 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5521 "Filter updates to/from this neighbor\n"
5522 "Name of a prefix list\n"
5523 "Filter incoming updates\n"
5524 "Filter outgoing updates\n")
5526 DEFUN (no_neighbor_prefix_list
,
5527 no_neighbor_prefix_list_cmd
,
5528 "no neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
5532 "Filter updates to/from this neighbor\n"
5533 "Name of a prefix list\n"
5534 "Filter incoming updates\n"
5535 "Filter outgoing updates\n")
5539 return peer_prefix_list_unset_vty(vty
, argv
[idx_peer
]->arg
,
5540 bgp_node_afi(vty
), bgp_node_safi(vty
),
5541 argv
[idx_in_out
]->arg
);
5544 ALIAS_HIDDEN(no_neighbor_prefix_list
, no_neighbor_prefix_list_hidden_cmd
,
5545 "no neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
5546 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5547 "Filter updates to/from this neighbor\n"
5548 "Name of a prefix list\n"
5549 "Filter incoming updates\n"
5550 "Filter outgoing updates\n")
5552 static int peer_aslist_set_vty(struct vty
*vty
, const char *ip_str
, afi_t afi
,
5553 safi_t safi
, const char *name_str
,
5554 const char *direct_str
)
5558 int direct
= FILTER_IN
;
5560 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5562 return CMD_WARNING_CONFIG_FAILED
;
5564 /* Check filter direction. */
5565 if (strncmp(direct_str
, "i", 1) == 0)
5567 else if (strncmp(direct_str
, "o", 1) == 0)
5568 direct
= FILTER_OUT
;
5570 ret
= peer_aslist_set(peer
, afi
, safi
, direct
, name_str
);
5572 return bgp_vty_return(vty
, ret
);
5575 static int peer_aslist_unset_vty(struct vty
*vty
, const char *ip_str
, afi_t afi
,
5576 safi_t safi
, const char *direct_str
)
5580 int direct
= FILTER_IN
;
5582 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5584 return CMD_WARNING_CONFIG_FAILED
;
5586 /* Check filter direction. */
5587 if (strncmp(direct_str
, "i", 1) == 0)
5589 else if (strncmp(direct_str
, "o", 1) == 0)
5590 direct
= FILTER_OUT
;
5592 ret
= peer_aslist_unset(peer
, afi
, safi
, direct
);
5594 return bgp_vty_return(vty
, ret
);
5597 DEFUN (neighbor_filter_list
,
5598 neighbor_filter_list_cmd
,
5599 "neighbor <A.B.C.D|X:X::X:X|WORD> filter-list WORD <in|out>",
5602 "Establish BGP filters\n"
5603 "AS path access-list name\n"
5604 "Filter incoming routes\n"
5605 "Filter outgoing routes\n")
5610 return peer_aslist_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
5611 bgp_node_safi(vty
), argv
[idx_word
]->arg
,
5612 argv
[idx_in_out
]->arg
);
5615 ALIAS_HIDDEN(neighbor_filter_list
, neighbor_filter_list_hidden_cmd
,
5616 "neighbor <A.B.C.D|X:X::X:X|WORD> filter-list WORD <in|out>",
5617 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5618 "Establish BGP filters\n"
5619 "AS path access-list name\n"
5620 "Filter incoming routes\n"
5621 "Filter outgoing routes\n")
5623 DEFUN (no_neighbor_filter_list
,
5624 no_neighbor_filter_list_cmd
,
5625 "no neighbor <A.B.C.D|X:X::X:X|WORD> filter-list WORD <in|out>",
5629 "Establish BGP filters\n"
5630 "AS path access-list name\n"
5631 "Filter incoming routes\n"
5632 "Filter outgoing routes\n")
5636 return peer_aslist_unset_vty(vty
, argv
[idx_peer
]->arg
,
5637 bgp_node_afi(vty
), bgp_node_safi(vty
),
5638 argv
[idx_in_out
]->arg
);
5641 ALIAS_HIDDEN(no_neighbor_filter_list
, no_neighbor_filter_list_hidden_cmd
,
5642 "no neighbor <A.B.C.D|X:X::X:X|WORD> filter-list WORD <in|out>",
5643 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5644 "Establish BGP filters\n"
5645 "AS path access-list name\n"
5646 "Filter incoming routes\n"
5647 "Filter outgoing routes\n")
5649 /* Set route-map to the peer. */
5650 static int peer_route_map_set_vty(struct vty
*vty
, const char *ip_str
,
5651 afi_t afi
, safi_t safi
, const char *name_str
,
5652 const char *direct_str
)
5656 int direct
= RMAP_IN
;
5657 struct route_map
*route_map
;
5659 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5661 return CMD_WARNING_CONFIG_FAILED
;
5663 /* Check filter direction. */
5664 if (strncmp(direct_str
, "in", 2) == 0)
5666 else if (strncmp(direct_str
, "o", 1) == 0)
5669 route_map
= route_map_lookup_warn_noexist(vty
, name_str
);
5670 ret
= peer_route_map_set(peer
, afi
, safi
, direct
, name_str
, route_map
);
5672 return bgp_vty_return(vty
, ret
);
5675 static int peer_route_map_unset_vty(struct vty
*vty
, const char *ip_str
,
5676 afi_t afi
, safi_t safi
,
5677 const char *direct_str
)
5681 int direct
= RMAP_IN
;
5683 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5685 return CMD_WARNING_CONFIG_FAILED
;
5687 /* Check filter direction. */
5688 if (strncmp(direct_str
, "in", 2) == 0)
5690 else if (strncmp(direct_str
, "o", 1) == 0)
5693 ret
= peer_route_map_unset(peer
, afi
, safi
, direct
);
5695 return bgp_vty_return(vty
, ret
);
5698 DEFUN (neighbor_route_map
,
5699 neighbor_route_map_cmd
,
5700 "neighbor <A.B.C.D|X:X::X:X|WORD> route-map WORD <in|out>",
5703 "Apply route map to neighbor\n"
5704 "Name of route map\n"
5705 "Apply map to incoming routes\n"
5706 "Apply map to outbound routes\n")
5711 return peer_route_map_set_vty(
5712 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5713 argv
[idx_word
]->arg
, argv
[idx_in_out
]->arg
);
5716 ALIAS_HIDDEN(neighbor_route_map
, neighbor_route_map_hidden_cmd
,
5717 "neighbor <A.B.C.D|X:X::X:X|WORD> route-map WORD <in|out>",
5718 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5719 "Apply route map to neighbor\n"
5720 "Name of route map\n"
5721 "Apply map to incoming routes\n"
5722 "Apply map to outbound routes\n")
5724 DEFUN (no_neighbor_route_map
,
5725 no_neighbor_route_map_cmd
,
5726 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-map WORD <in|out>",
5730 "Apply route map to neighbor\n"
5731 "Name of route map\n"
5732 "Apply map to incoming routes\n"
5733 "Apply map to outbound routes\n")
5737 return peer_route_map_unset_vty(vty
, argv
[idx_peer
]->arg
,
5738 bgp_node_afi(vty
), bgp_node_safi(vty
),
5739 argv
[idx_in_out
]->arg
);
5742 ALIAS_HIDDEN(no_neighbor_route_map
, no_neighbor_route_map_hidden_cmd
,
5743 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-map WORD <in|out>",
5744 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5745 "Apply route map to neighbor\n"
5746 "Name of route map\n"
5747 "Apply map to incoming routes\n"
5748 "Apply map to outbound routes\n")
5750 /* Set unsuppress-map to the peer. */
5751 static int peer_unsuppress_map_set_vty(struct vty
*vty
, const char *ip_str
,
5752 afi_t afi
, safi_t safi
,
5753 const char *name_str
)
5757 struct route_map
*route_map
;
5759 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5761 return CMD_WARNING_CONFIG_FAILED
;
5763 route_map
= route_map_lookup_warn_noexist(vty
, name_str
);
5764 ret
= peer_unsuppress_map_set(peer
, afi
, safi
, name_str
, route_map
);
5766 return bgp_vty_return(vty
, ret
);
5769 /* Unset route-map from the peer. */
5770 static int peer_unsuppress_map_unset_vty(struct vty
*vty
, const char *ip_str
,
5771 afi_t afi
, safi_t safi
)
5776 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5778 return CMD_WARNING_CONFIG_FAILED
;
5780 ret
= peer_unsuppress_map_unset(peer
, afi
, safi
);
5782 return bgp_vty_return(vty
, ret
);
5785 DEFUN (neighbor_unsuppress_map
,
5786 neighbor_unsuppress_map_cmd
,
5787 "neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
5790 "Route-map to selectively unsuppress suppressed routes\n"
5791 "Name of route map\n")
5795 return peer_unsuppress_map_set_vty(
5796 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5797 argv
[idx_word
]->arg
);
5800 ALIAS_HIDDEN(neighbor_unsuppress_map
, neighbor_unsuppress_map_hidden_cmd
,
5801 "neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
5802 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5803 "Route-map to selectively unsuppress suppressed routes\n"
5804 "Name of route map\n")
5806 DEFUN (no_neighbor_unsuppress_map
,
5807 no_neighbor_unsuppress_map_cmd
,
5808 "no neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
5812 "Route-map to selectively unsuppress suppressed routes\n"
5813 "Name of route map\n")
5816 return peer_unsuppress_map_unset_vty(vty
, argv
[idx_peer
]->arg
,
5818 bgp_node_safi(vty
));
5821 ALIAS_HIDDEN(no_neighbor_unsuppress_map
, no_neighbor_unsuppress_map_hidden_cmd
,
5822 "no neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
5823 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5824 "Route-map to selectively unsuppress suppressed routes\n"
5825 "Name of route map\n")
5827 static int peer_maximum_prefix_set_vty(struct vty
*vty
, const char *ip_str
,
5828 afi_t afi
, safi_t safi
,
5829 const char *num_str
,
5830 const char *threshold_str
, int warning
,
5831 const char *restart_str
)
5839 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5841 return CMD_WARNING_CONFIG_FAILED
;
5843 max
= strtoul(num_str
, NULL
, 10);
5845 threshold
= atoi(threshold_str
);
5847 threshold
= MAXIMUM_PREFIX_THRESHOLD_DEFAULT
;
5850 restart
= atoi(restart_str
);
5854 ret
= peer_maximum_prefix_set(peer
, afi
, safi
, max
, threshold
, warning
,
5857 return bgp_vty_return(vty
, ret
);
5860 static int peer_maximum_prefix_unset_vty(struct vty
*vty
, const char *ip_str
,
5861 afi_t afi
, safi_t safi
)
5866 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5868 return CMD_WARNING_CONFIG_FAILED
;
5870 ret
= peer_maximum_prefix_unset(peer
, afi
, safi
);
5872 return bgp_vty_return(vty
, ret
);
5875 /* Maximum number of prefix configuration. prefix count is different
5876 for each peer configuration. So this configuration can be set for
5877 each peer configuration. */
5878 DEFUN (neighbor_maximum_prefix
,
5879 neighbor_maximum_prefix_cmd
,
5880 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295)",
5883 "Maximum number of prefix accept from this peer\n"
5884 "maximum no. of prefix limit\n")
5888 return peer_maximum_prefix_set_vty(
5889 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5890 argv
[idx_number
]->arg
, NULL
, 0, NULL
);
5893 ALIAS_HIDDEN(neighbor_maximum_prefix
, neighbor_maximum_prefix_hidden_cmd
,
5894 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295)",
5895 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5896 "Maximum number of prefix accept from this peer\n"
5897 "maximum no. of prefix limit\n")
5899 DEFUN (neighbor_maximum_prefix_threshold
,
5900 neighbor_maximum_prefix_threshold_cmd
,
5901 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100)",
5904 "Maximum number of prefix accept from this peer\n"
5905 "maximum no. of prefix limit\n"
5906 "Threshold value (%) at which to generate a warning msg\n")
5910 int idx_number_2
= 4;
5911 return peer_maximum_prefix_set_vty(
5912 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5913 argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
, 0, NULL
);
5917 neighbor_maximum_prefix_threshold
,
5918 neighbor_maximum_prefix_threshold_hidden_cmd
,
5919 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100)",
5920 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5921 "Maximum number of prefix accept from this peer\n"
5922 "maximum no. of prefix limit\n"
5923 "Threshold value (%) at which to generate a warning msg\n")
5925 DEFUN (neighbor_maximum_prefix_warning
,
5926 neighbor_maximum_prefix_warning_cmd
,
5927 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) warning-only",
5930 "Maximum number of prefix accept from this peer\n"
5931 "maximum no. of prefix limit\n"
5932 "Only give warning message when limit is exceeded\n")
5936 return peer_maximum_prefix_set_vty(
5937 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5938 argv
[idx_number
]->arg
, NULL
, 1, NULL
);
5942 neighbor_maximum_prefix_warning
,
5943 neighbor_maximum_prefix_warning_hidden_cmd
,
5944 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) warning-only",
5945 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5946 "Maximum number of prefix accept from this peer\n"
5947 "maximum no. of prefix limit\n"
5948 "Only give warning message when limit is exceeded\n")
5950 DEFUN (neighbor_maximum_prefix_threshold_warning
,
5951 neighbor_maximum_prefix_threshold_warning_cmd
,
5952 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) warning-only",
5955 "Maximum number of prefix accept from this peer\n"
5956 "maximum no. of prefix limit\n"
5957 "Threshold value (%) at which to generate a warning msg\n"
5958 "Only give warning message when limit is exceeded\n")
5962 int idx_number_2
= 4;
5963 return peer_maximum_prefix_set_vty(
5964 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5965 argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
, 1, NULL
);
5969 neighbor_maximum_prefix_threshold_warning
,
5970 neighbor_maximum_prefix_threshold_warning_hidden_cmd
,
5971 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) warning-only",
5972 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5973 "Maximum number of prefix accept from this peer\n"
5974 "maximum no. of prefix limit\n"
5975 "Threshold value (%) at which to generate a warning msg\n"
5976 "Only give warning message when limit is exceeded\n")
5978 DEFUN (neighbor_maximum_prefix_restart
,
5979 neighbor_maximum_prefix_restart_cmd
,
5980 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) restart (1-65535)",
5983 "Maximum number of prefix accept from this peer\n"
5984 "maximum no. of prefix limit\n"
5985 "Restart bgp connection after limit is exceeded\n"
5986 "Restart interval in minutes\n")
5990 int idx_number_2
= 5;
5991 return peer_maximum_prefix_set_vty(
5992 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5993 argv
[idx_number
]->arg
, NULL
, 0, argv
[idx_number_2
]->arg
);
5997 neighbor_maximum_prefix_restart
,
5998 neighbor_maximum_prefix_restart_hidden_cmd
,
5999 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) restart (1-65535)",
6000 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6001 "Maximum number of prefix accept from this peer\n"
6002 "maximum no. of prefix limit\n"
6003 "Restart bgp connection after limit is exceeded\n"
6004 "Restart interval in minutes\n")
6006 DEFUN (neighbor_maximum_prefix_threshold_restart
,
6007 neighbor_maximum_prefix_threshold_restart_cmd
,
6008 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) restart (1-65535)",
6011 "Maximum number of prefixes to accept from this peer\n"
6012 "maximum no. of prefix limit\n"
6013 "Threshold value (%) at which to generate a warning msg\n"
6014 "Restart bgp connection after limit is exceeded\n"
6015 "Restart interval in minutes\n")
6019 int idx_number_2
= 4;
6020 int idx_number_3
= 6;
6021 return peer_maximum_prefix_set_vty(
6022 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6023 argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
, 0,
6024 argv
[idx_number_3
]->arg
);
6028 neighbor_maximum_prefix_threshold_restart
,
6029 neighbor_maximum_prefix_threshold_restart_hidden_cmd
,
6030 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) restart (1-65535)",
6031 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6032 "Maximum number of prefixes to accept from this peer\n"
6033 "maximum no. of prefix limit\n"
6034 "Threshold value (%) at which to generate a warning msg\n"
6035 "Restart bgp connection after limit is exceeded\n"
6036 "Restart interval in minutes\n")
6038 DEFUN (no_neighbor_maximum_prefix
,
6039 no_neighbor_maximum_prefix_cmd
,
6040 "no neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix [(1-4294967295) [(1-100)] [restart (1-65535)] [warning-only]]",
6044 "Maximum number of prefixes to accept from this peer\n"
6045 "maximum no. of prefix limit\n"
6046 "Threshold value (%) at which to generate a warning msg\n"
6047 "Restart bgp connection after limit is exceeded\n"
6048 "Restart interval in minutes\n"
6049 "Only give warning message when limit is exceeded\n")
6052 return peer_maximum_prefix_unset_vty(vty
, argv
[idx_peer
]->arg
,
6054 bgp_node_safi(vty
));
6058 no_neighbor_maximum_prefix
, no_neighbor_maximum_prefix_hidden_cmd
,
6059 "no neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix [(1-4294967295) [(1-100)] [restart (1-65535)] [warning-only]]",
6060 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6061 "Maximum number of prefixes to accept from this peer\n"
6062 "maximum no. of prefix limit\n"
6063 "Threshold value (%) at which to generate a warning msg\n"
6064 "Restart bgp connection after limit is exceeded\n"
6065 "Restart interval in minutes\n"
6066 "Only give warning message when limit is exceeded\n")
6069 /* "neighbor allowas-in" */
6070 DEFUN (neighbor_allowas_in
,
6071 neighbor_allowas_in_cmd
,
6072 "neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
6075 "Accept as-path with my AS present in it\n"
6076 "Number of occurences of AS number\n"
6077 "Only accept my AS in the as-path if the route was originated in my AS\n")
6080 int idx_number_origin
= 3;
6086 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6088 return CMD_WARNING_CONFIG_FAILED
;
6090 if (argc
<= idx_number_origin
)
6093 if (argv
[idx_number_origin
]->type
== WORD_TKN
)
6096 allow_num
= atoi(argv
[idx_number_origin
]->arg
);
6099 ret
= peer_allowas_in_set(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6102 return bgp_vty_return(vty
, ret
);
6106 neighbor_allowas_in
, neighbor_allowas_in_hidden_cmd
,
6107 "neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
6108 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6109 "Accept as-path with my AS present in it\n"
6110 "Number of occurences of AS number\n"
6111 "Only accept my AS in the as-path if the route was originated in my AS\n")
6113 DEFUN (no_neighbor_allowas_in
,
6114 no_neighbor_allowas_in_cmd
,
6115 "no neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
6119 "allow local ASN appears in aspath attribute\n"
6120 "Number of occurences of AS number\n"
6121 "Only accept my AS in the as-path if the route was originated in my AS\n")
6127 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6129 return CMD_WARNING_CONFIG_FAILED
;
6131 ret
= peer_allowas_in_unset(peer
, bgp_node_afi(vty
),
6132 bgp_node_safi(vty
));
6134 return bgp_vty_return(vty
, ret
);
6138 no_neighbor_allowas_in
, no_neighbor_allowas_in_hidden_cmd
,
6139 "no neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
6140 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6141 "allow local ASN appears in aspath attribute\n"
6142 "Number of occurences of AS number\n"
6143 "Only accept my AS in the as-path if the route was originated in my AS\n")
6145 DEFUN (neighbor_ttl_security
,
6146 neighbor_ttl_security_cmd
,
6147 "neighbor <A.B.C.D|X:X::X:X|WORD> ttl-security hops (1-254)",
6150 "BGP ttl-security parameters\n"
6151 "Specify the maximum number of hops to the BGP peer\n"
6152 "Number of hops to BGP peer\n")
6159 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6161 return CMD_WARNING_CONFIG_FAILED
;
6163 gtsm_hops
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
6166 * If 'neighbor swpX', then this is for directly connected peers,
6167 * we should not accept a ttl-security hops value greater than 1.
6169 if (peer
->conf_if
&& (gtsm_hops
> 1)) {
6171 "%s is directly connected peer, hops cannot exceed 1\n",
6172 argv
[idx_peer
]->arg
);
6173 return CMD_WARNING_CONFIG_FAILED
;
6176 return bgp_vty_return(vty
, peer_ttl_security_hops_set(peer
, gtsm_hops
));
6179 DEFUN (no_neighbor_ttl_security
,
6180 no_neighbor_ttl_security_cmd
,
6181 "no neighbor <A.B.C.D|X:X::X:X|WORD> ttl-security hops (1-254)",
6185 "BGP ttl-security parameters\n"
6186 "Specify the maximum number of hops to the BGP peer\n"
6187 "Number of hops to BGP peer\n")
6192 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6194 return CMD_WARNING_CONFIG_FAILED
;
6196 return bgp_vty_return(vty
, peer_ttl_security_hops_unset(peer
));
6199 DEFUN (neighbor_addpath_tx_all_paths
,
6200 neighbor_addpath_tx_all_paths_cmd
,
6201 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
6204 "Use addpath to advertise all paths to a neighbor\n")
6209 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6211 return CMD_WARNING_CONFIG_FAILED
;
6213 bgp_addpath_set_peer_type(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6218 ALIAS_HIDDEN(neighbor_addpath_tx_all_paths
,
6219 neighbor_addpath_tx_all_paths_hidden_cmd
,
6220 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
6221 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6222 "Use addpath to advertise all paths to a neighbor\n")
6224 DEFUN (no_neighbor_addpath_tx_all_paths
,
6225 no_neighbor_addpath_tx_all_paths_cmd
,
6226 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
6230 "Use addpath to advertise all paths to a neighbor\n")
6235 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6237 return CMD_WARNING_CONFIG_FAILED
;
6239 if (peer
->addpath_type
[bgp_node_afi(vty
)][bgp_node_safi(vty
)]
6240 != BGP_ADDPATH_ALL
) {
6242 "%% Peer not currently configured to transmit all paths.");
6243 return CMD_WARNING_CONFIG_FAILED
;
6246 bgp_addpath_set_peer_type(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6252 ALIAS_HIDDEN(no_neighbor_addpath_tx_all_paths
,
6253 no_neighbor_addpath_tx_all_paths_hidden_cmd
,
6254 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
6255 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6256 "Use addpath to advertise all paths to a neighbor\n")
6258 DEFUN (neighbor_addpath_tx_bestpath_per_as
,
6259 neighbor_addpath_tx_bestpath_per_as_cmd
,
6260 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
6263 "Use addpath to advertise the bestpath per each neighboring AS\n")
6268 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6270 return CMD_WARNING_CONFIG_FAILED
;
6272 bgp_addpath_set_peer_type(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6273 BGP_ADDPATH_BEST_PER_AS
);
6278 ALIAS_HIDDEN(neighbor_addpath_tx_bestpath_per_as
,
6279 neighbor_addpath_tx_bestpath_per_as_hidden_cmd
,
6280 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
6281 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6282 "Use addpath to advertise the bestpath per each neighboring AS\n")
6284 DEFUN (no_neighbor_addpath_tx_bestpath_per_as
,
6285 no_neighbor_addpath_tx_bestpath_per_as_cmd
,
6286 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
6290 "Use addpath to advertise the bestpath per each neighboring AS\n")
6295 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6297 return CMD_WARNING_CONFIG_FAILED
;
6299 if (peer
->addpath_type
[bgp_node_afi(vty
)][bgp_node_safi(vty
)]
6300 != BGP_ADDPATH_BEST_PER_AS
) {
6302 "%% Peer not currently configured to transmit all best path per as.");
6303 return CMD_WARNING_CONFIG_FAILED
;
6306 bgp_addpath_set_peer_type(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6312 ALIAS_HIDDEN(no_neighbor_addpath_tx_bestpath_per_as
,
6313 no_neighbor_addpath_tx_bestpath_per_as_hidden_cmd
,
6314 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
6315 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6316 "Use addpath to advertise the bestpath per each neighboring AS\n")
6318 static int set_ecom_list(struct vty
*vty
, int argc
, struct cmd_token
**argv
,
6319 struct ecommunity
**list
)
6321 struct ecommunity
*ecom
= NULL
;
6322 struct ecommunity
*ecomadd
;
6324 for (; argc
; --argc
, ++argv
) {
6326 ecomadd
= ecommunity_str2com(argv
[0]->arg
,
6327 ECOMMUNITY_ROUTE_TARGET
, 0);
6329 vty_out(vty
, "Malformed community-list value\n");
6331 ecommunity_free(&ecom
);
6332 return CMD_WARNING_CONFIG_FAILED
;
6336 ecommunity_merge(ecom
, ecomadd
);
6337 ecommunity_free(&ecomadd
);
6344 ecommunity_free(&*list
);
6352 * v2vimport is true if we are handling a `import vrf ...` command
6354 static afi_t
vpn_policy_getafi(struct vty
*vty
, struct bgp
*bgp
, bool v2vimport
)
6358 switch (vty
->node
) {
6367 "%% context error: valid only in address-family <ipv4|ipv6> unicast block\n");
6372 if (CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
6373 BGP_CONFIG_VRF_TO_VRF_IMPORT
)
6374 || CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
6375 BGP_CONFIG_VRF_TO_VRF_EXPORT
)) {
6377 "%% error: Please unconfigure import vrf commands before using vpn commands\n");
6381 if (CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
6382 BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT
)
6383 || CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
6384 BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT
)) {
6386 "%% error: Please unconfigure vpn to vrf commands before using import vrf commands\n");
6393 DEFPY (af_rd_vpn_export
,
6394 af_rd_vpn_export_cmd
,
6395 "[no] rd vpn export ASN:NN_OR_IP-ADDRESS:NN$rd_str",
6397 "Specify route distinguisher\n"
6398 "Between current address-family and vpn\n"
6399 "For routes leaked from current address-family to vpn\n"
6400 "Route Distinguisher (<as-number>:<number> | <ip-address>:<number>)\n")
6402 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6403 struct prefix_rd prd
;
6409 if (argv_find(argv
, argc
, "no", &idx
))
6413 ret
= str2prefix_rd(rd_str
, &prd
);
6415 vty_out(vty
, "%% Malformed rd\n");
6416 return CMD_WARNING_CONFIG_FAILED
;
6420 afi
= vpn_policy_getafi(vty
, bgp
, false);
6422 return CMD_WARNING_CONFIG_FAILED
;
6425 * pre-change: un-export vpn routes (vpn->vrf routes unaffected)
6427 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6428 bgp_get_default(), bgp
);
6431 bgp
->vpn_policy
[afi
].tovpn_rd
= prd
;
6432 SET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6433 BGP_VPN_POLICY_TOVPN_RD_SET
);
6435 UNSET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6436 BGP_VPN_POLICY_TOVPN_RD_SET
);
6439 /* post-change: re-export vpn routes */
6440 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6441 bgp_get_default(), bgp
);
6446 ALIAS (af_rd_vpn_export
,
6447 af_no_rd_vpn_export_cmd
,
6450 "Specify route distinguisher\n"
6451 "Between current address-family and vpn\n"
6452 "For routes leaked from current address-family to vpn\n")
6454 DEFPY (af_label_vpn_export
,
6455 af_label_vpn_export_cmd
,
6456 "[no] label vpn export <(0-1048575)$label_val|auto$label_auto>",
6458 "label value for VRF\n"
6459 "Between current address-family and vpn\n"
6460 "For routes leaked from current address-family to vpn\n"
6461 "Label Value <0-1048575>\n"
6462 "Automatically assign a label\n")
6464 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6465 mpls_label_t label
= MPLS_LABEL_NONE
;
6470 if (argv_find(argv
, argc
, "no", &idx
))
6473 /* If "no ...", squash trailing parameter */
6479 label
= label_val
; /* parser should force unsigned */
6482 afi
= vpn_policy_getafi(vty
, bgp
, false);
6484 return CMD_WARNING_CONFIG_FAILED
;
6487 if (label_auto
&& CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
6488 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
))
6493 * pre-change: un-export vpn routes (vpn->vrf routes unaffected)
6495 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6496 bgp_get_default(), bgp
);
6498 if (!label_auto
&& CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
6499 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
)) {
6501 if (bgp
->vpn_policy
[afi
].tovpn_label
!= MPLS_LABEL_NONE
) {
6504 * label has previously been automatically
6505 * assigned by labelpool: release it
6507 * NB if tovpn_label == MPLS_LABEL_NONE it
6508 * means the automatic assignment is in flight
6509 * and therefore the labelpool callback must
6510 * detect that the auto label is not needed.
6513 bgp_lp_release(LP_TYPE_VRF
,
6514 &bgp
->vpn_policy
[afi
],
6515 bgp
->vpn_policy
[afi
].tovpn_label
);
6517 UNSET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6518 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
);
6521 bgp
->vpn_policy
[afi
].tovpn_label
= label
;
6523 SET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6524 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
);
6525 bgp_lp_get(LP_TYPE_VRF
, &bgp
->vpn_policy
[afi
],
6526 vpn_leak_label_callback
);
6529 /* post-change: re-export vpn routes */
6530 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6531 bgp_get_default(), bgp
);
6536 ALIAS (af_label_vpn_export
,
6537 af_no_label_vpn_export_cmd
,
6538 "no label vpn export",
6540 "label value for VRF\n"
6541 "Between current address-family and vpn\n"
6542 "For routes leaked from current address-family to vpn\n")
6544 DEFPY (af_nexthop_vpn_export
,
6545 af_nexthop_vpn_export_cmd
,
6546 "[no] nexthop vpn export <A.B.C.D|X:X::X:X>$nexthop_str",
6548 "Specify next hop to use for VRF advertised prefixes\n"
6549 "Between current address-family and vpn\n"
6550 "For routes leaked from current address-family to vpn\n"
6554 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6560 if (argv_find(argv
, argc
, "no", &idx
))
6564 if (!sockunion2hostprefix(nexthop_str
, &p
))
6565 return CMD_WARNING_CONFIG_FAILED
;
6568 afi
= vpn_policy_getafi(vty
, bgp
, false);
6570 return CMD_WARNING_CONFIG_FAILED
;
6573 * pre-change: un-export vpn routes (vpn->vrf routes unaffected)
6575 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6576 bgp_get_default(), bgp
);
6579 bgp
->vpn_policy
[afi
].tovpn_nexthop
= p
;
6580 SET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6581 BGP_VPN_POLICY_TOVPN_NEXTHOP_SET
);
6583 UNSET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6584 BGP_VPN_POLICY_TOVPN_NEXTHOP_SET
);
6587 /* post-change: re-export vpn routes */
6588 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6589 bgp_get_default(), bgp
);
6594 ALIAS (af_nexthop_vpn_export
,
6595 af_no_nexthop_vpn_export_cmd
,
6596 "no nexthop vpn export",
6598 "Specify next hop to use for VRF advertised prefixes\n"
6599 "Between current address-family and vpn\n"
6600 "For routes leaked from current address-family to vpn\n")
6602 static int vpn_policy_getdirs(struct vty
*vty
, const char *dstr
, int *dodir
)
6604 if (!strcmp(dstr
, "import")) {
6605 dodir
[BGP_VPN_POLICY_DIR_FROMVPN
] = 1;
6606 } else if (!strcmp(dstr
, "export")) {
6607 dodir
[BGP_VPN_POLICY_DIR_TOVPN
] = 1;
6608 } else if (!strcmp(dstr
, "both")) {
6609 dodir
[BGP_VPN_POLICY_DIR_FROMVPN
] = 1;
6610 dodir
[BGP_VPN_POLICY_DIR_TOVPN
] = 1;
6612 vty_out(vty
, "%% direction parse error\n");
6613 return CMD_WARNING_CONFIG_FAILED
;
6618 DEFPY (af_rt_vpn_imexport
,
6619 af_rt_vpn_imexport_cmd
,
6620 "[no] <rt|route-target> vpn <import|export|both>$direction_str RTLIST...",
6622 "Specify route target list\n"
6623 "Specify route target list\n"
6624 "Between current address-family and vpn\n"
6625 "For routes leaked from vpn to current address-family: match any\n"
6626 "For routes leaked from current address-family to vpn: set\n"
6627 "both import: match any and export: set\n"
6628 "Space separated route target list (A.B.C.D:MN|EF:OPQR|GHJK:MN)\n")
6630 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6632 struct ecommunity
*ecom
= NULL
;
6633 int dodir
[BGP_VPN_POLICY_DIR_MAX
] = {0};
6634 vpn_policy_direction_t dir
;
6639 if (argv_find(argv
, argc
, "no", &idx
))
6642 afi
= vpn_policy_getafi(vty
, bgp
, false);
6644 return CMD_WARNING_CONFIG_FAILED
;
6646 ret
= vpn_policy_getdirs(vty
, direction_str
, dodir
);
6647 if (ret
!= CMD_SUCCESS
)
6651 if (!argv_find(argv
, argc
, "RTLIST", &idx
)) {
6652 vty_out(vty
, "%% Missing RTLIST\n");
6653 return CMD_WARNING_CONFIG_FAILED
;
6655 ret
= set_ecom_list(vty
, argc
- idx
, argv
+ idx
, &ecom
);
6656 if (ret
!= CMD_SUCCESS
) {
6661 for (dir
= 0; dir
< BGP_VPN_POLICY_DIR_MAX
; ++dir
) {
6665 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
6668 if (bgp
->vpn_policy
[afi
].rtlist
[dir
])
6670 &bgp
->vpn_policy
[afi
].rtlist
[dir
]);
6671 bgp
->vpn_policy
[afi
].rtlist
[dir
] =
6672 ecommunity_dup(ecom
);
6674 if (bgp
->vpn_policy
[afi
].rtlist
[dir
])
6676 &bgp
->vpn_policy
[afi
].rtlist
[dir
]);
6677 bgp
->vpn_policy
[afi
].rtlist
[dir
] = NULL
;
6680 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
6684 ecommunity_free(&ecom
);
6689 ALIAS (af_rt_vpn_imexport
,
6690 af_no_rt_vpn_imexport_cmd
,
6691 "no <rt|route-target> vpn <import|export|both>$direction_str",
6693 "Specify route target list\n"
6694 "Specify route target list\n"
6695 "Between current address-family and vpn\n"
6696 "For routes leaked from vpn to current address-family\n"
6697 "For routes leaked from current address-family to vpn\n"
6698 "both import and export\n")
6700 DEFPY (af_route_map_vpn_imexport
,
6701 af_route_map_vpn_imexport_cmd
,
6702 /* future: "route-map <vpn|evpn|vrf NAME> <import|export> RMAP" */
6703 "[no] route-map vpn <import|export>$direction_str RMAP$rmap_str",
6705 "Specify route map\n"
6706 "Between current address-family and vpn\n"
6707 "For routes leaked from vpn to current address-family\n"
6708 "For routes leaked from current address-family to vpn\n"
6709 "name of route-map\n")
6711 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6713 int dodir
[BGP_VPN_POLICY_DIR_MAX
] = {0};
6714 vpn_policy_direction_t dir
;
6719 if (argv_find(argv
, argc
, "no", &idx
))
6722 afi
= vpn_policy_getafi(vty
, bgp
, false);
6724 return CMD_WARNING_CONFIG_FAILED
;
6726 ret
= vpn_policy_getdirs(vty
, direction_str
, dodir
);
6727 if (ret
!= CMD_SUCCESS
)
6730 for (dir
= 0; dir
< BGP_VPN_POLICY_DIR_MAX
; ++dir
) {
6734 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
6737 if (bgp
->vpn_policy
[afi
].rmap_name
[dir
])
6738 XFREE(MTYPE_ROUTE_MAP_NAME
,
6739 bgp
->vpn_policy
[afi
].rmap_name
[dir
]);
6740 bgp
->vpn_policy
[afi
].rmap_name
[dir
] = XSTRDUP(
6741 MTYPE_ROUTE_MAP_NAME
, rmap_str
);
6742 bgp
->vpn_policy
[afi
].rmap
[dir
] =
6743 route_map_lookup_warn_noexist(vty
, rmap_str
);
6744 if (!bgp
->vpn_policy
[afi
].rmap
[dir
])
6747 if (bgp
->vpn_policy
[afi
].rmap_name
[dir
])
6748 XFREE(MTYPE_ROUTE_MAP_NAME
,
6749 bgp
->vpn_policy
[afi
].rmap_name
[dir
]);
6750 bgp
->vpn_policy
[afi
].rmap_name
[dir
] = NULL
;
6751 bgp
->vpn_policy
[afi
].rmap
[dir
] = NULL
;
6754 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
6760 ALIAS (af_route_map_vpn_imexport
,
6761 af_no_route_map_vpn_imexport_cmd
,
6762 "no route-map vpn <import|export>$direction_str",
6764 "Specify route map\n"
6765 "Between current address-family and vpn\n"
6766 "For routes leaked from vpn to current address-family\n"
6767 "For routes leaked from current address-family to vpn\n")
6769 DEFPY(af_import_vrf_route_map
, af_import_vrf_route_map_cmd
,
6770 "[no] import vrf route-map RMAP$rmap_str",
6772 "Import routes from another VRF\n"
6773 "Vrf routes being filtered\n"
6774 "Specify route map\n"
6775 "name of route-map\n")
6777 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6778 vpn_policy_direction_t dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
6782 struct bgp
*bgp_default
;
6784 if (argv_find(argv
, argc
, "no", &idx
))
6787 afi
= vpn_policy_getafi(vty
, bgp
, true);
6789 return CMD_WARNING_CONFIG_FAILED
;
6791 bgp_default
= bgp_get_default();
6796 /* Auto-create assuming the same AS */
6797 ret
= bgp_get(&bgp_default
, &as
, NULL
,
6798 BGP_INSTANCE_TYPE_DEFAULT
);
6802 "VRF default is not configured as a bgp instance\n");
6807 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
6810 if (bgp
->vpn_policy
[afi
].rmap_name
[dir
])
6811 XFREE(MTYPE_ROUTE_MAP_NAME
,
6812 bgp
->vpn_policy
[afi
].rmap_name
[dir
]);
6813 bgp
->vpn_policy
[afi
].rmap_name
[dir
] =
6814 XSTRDUP(MTYPE_ROUTE_MAP_NAME
, rmap_str
);
6815 bgp
->vpn_policy
[afi
].rmap
[dir
] =
6816 route_map_lookup_warn_noexist(vty
, rmap_str
);
6817 if (!bgp
->vpn_policy
[afi
].rmap
[dir
])
6820 if (bgp
->vpn_policy
[afi
].rmap_name
[dir
])
6821 XFREE(MTYPE_ROUTE_MAP_NAME
,
6822 bgp
->vpn_policy
[afi
].rmap_name
[dir
]);
6823 bgp
->vpn_policy
[afi
].rmap_name
[dir
] = NULL
;
6824 bgp
->vpn_policy
[afi
].rmap
[dir
] = NULL
;
6827 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
6832 ALIAS(af_import_vrf_route_map
, af_no_import_vrf_route_map_cmd
,
6833 "no import vrf route-map",
6835 "Import routes from another VRF\n"
6836 "Vrf routes being filtered\n"
6837 "Specify route map\n")
6839 DEFPY(bgp_imexport_vrf
, bgp_imexport_vrf_cmd
,
6840 "[no] import vrf VIEWVRFNAME$import_name",
6842 "Import routes from another VRF\n"
6843 "VRF to import from\n"
6844 "The name of the VRF\n")
6846 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6847 struct listnode
*node
;
6848 struct bgp
*vrf_bgp
, *bgp_default
;
6851 bool remove
= false;
6854 enum bgp_instance_type bgp_type
= BGP_INSTANCE_TYPE_VRF
;
6858 if (import_name
== NULL
) {
6859 vty_out(vty
, "%% Missing import name\n");
6863 if (argv_find(argv
, argc
, "no", &idx
))
6866 afi
= vpn_policy_getafi(vty
, bgp
, true);
6868 return CMD_WARNING_CONFIG_FAILED
;
6870 safi
= bgp_node_safi(vty
);
6872 if (((BGP_INSTANCE_TYPE_DEFAULT
== bgp
->inst_type
)
6873 && (strcmp(import_name
, VRF_DEFAULT_NAME
) == 0))
6874 || (bgp
->name
&& (strcmp(import_name
, bgp
->name
) == 0))) {
6875 vty_out(vty
, "%% Cannot %s vrf %s into itself\n",
6876 remove
? "unimport" : "import", import_name
);
6880 bgp_default
= bgp_get_default();
6882 /* Auto-create assuming the same AS */
6883 ret
= bgp_get(&bgp_default
, &as
, NULL
,
6884 BGP_INSTANCE_TYPE_DEFAULT
);
6888 "VRF default is not configured as a bgp instance\n");
6893 vrf_bgp
= bgp_lookup_by_name(import_name
);
6895 if (strcmp(import_name
, VRF_DEFAULT_NAME
) == 0)
6896 vrf_bgp
= bgp_default
;
6898 /* Auto-create assuming the same AS */
6899 ret
= bgp_get(&vrf_bgp
, &as
, import_name
, bgp_type
);
6903 "VRF %s is not configured as a bgp instance\n",
6910 vrf_unimport_from_vrf(bgp
, vrf_bgp
, afi
, safi
);
6912 /* Already importing from "import_vrf"? */
6913 for (ALL_LIST_ELEMENTS_RO(bgp
->vpn_policy
[afi
].import_vrf
, node
,
6915 if (strcmp(vname
, import_name
) == 0)
6919 vrf_import_from_vrf(bgp
, vrf_bgp
, afi
, safi
);
6925 /* This command is valid only in a bgp vrf instance or the default instance */
6926 DEFPY (bgp_imexport_vpn
,
6927 bgp_imexport_vpn_cmd
,
6928 "[no] <import|export>$direction_str vpn",
6930 "Import routes to this address-family\n"
6931 "Export routes from this address-family\n"
6932 "to/from default instance VPN RIB\n")
6934 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6941 vpn_policy_direction_t dir
;
6943 if (argv_find(argv
, argc
, "no", &idx
))
6946 if (BGP_INSTANCE_TYPE_VRF
!= bgp
->inst_type
&&
6947 BGP_INSTANCE_TYPE_DEFAULT
!= bgp
->inst_type
) {
6949 vty_out(vty
, "%% import|export vpn valid only for bgp vrf or default instance\n");
6950 return CMD_WARNING_CONFIG_FAILED
;
6953 afi
= bgp_node_afi(vty
);
6954 safi
= bgp_node_safi(vty
);
6955 if ((SAFI_UNICAST
!= safi
) || ((AFI_IP
!= afi
) && (AFI_IP6
!= afi
))) {
6956 vty_out(vty
, "%% import|export vpn valid only for unicast ipv4|ipv6\n");
6957 return CMD_WARNING_CONFIG_FAILED
;
6960 if (!strcmp(direction_str
, "import")) {
6961 flag
= BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT
;
6962 dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
6963 } else if (!strcmp(direction_str
, "export")) {
6964 flag
= BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT
;
6965 dir
= BGP_VPN_POLICY_DIR_TOVPN
;
6967 vty_out(vty
, "%% unknown direction %s\n", direction_str
);
6968 return CMD_WARNING_CONFIG_FAILED
;
6971 previous_state
= CHECK_FLAG(bgp
->af_flags
[afi
][safi
], flag
);
6974 SET_FLAG(bgp
->af_flags
[afi
][safi
], flag
);
6975 if (!previous_state
) {
6976 /* trigger export current vrf */
6977 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
6980 if (previous_state
) {
6981 /* trigger un-export current vrf */
6982 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
6984 UNSET_FLAG(bgp
->af_flags
[afi
][safi
], flag
);
6990 DEFPY (af_routetarget_import
,
6991 af_routetarget_import_cmd
,
6992 "[no] <rt|route-target> redirect import RTLIST...",
6994 "Specify route target list\n"
6995 "Specify route target list\n"
6996 "Flow-spec redirect type route target\n"
6997 "Import routes to this address-family\n"
6998 "Space separated route target list (A.B.C.D:MN|EF:OPQR|GHJK:MN)\n")
7000 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
7002 struct ecommunity
*ecom
= NULL
;
7007 if (argv_find(argv
, argc
, "no", &idx
))
7010 afi
= vpn_policy_getafi(vty
, bgp
, false);
7012 return CMD_WARNING_CONFIG_FAILED
;
7015 if (!argv_find(argv
, argc
, "RTLIST", &idx
)) {
7016 vty_out(vty
, "%% Missing RTLIST\n");
7017 return CMD_WARNING_CONFIG_FAILED
;
7019 ret
= set_ecom_list(vty
, argc
- idx
, argv
+ idx
, &ecom
);
7020 if (ret
!= CMD_SUCCESS
)
7025 if (bgp
->vpn_policy
[afi
].import_redirect_rtlist
)
7026 ecommunity_free(&bgp
->vpn_policy
[afi
]
7027 .import_redirect_rtlist
);
7028 bgp
->vpn_policy
[afi
].import_redirect_rtlist
=
7029 ecommunity_dup(ecom
);
7031 if (bgp
->vpn_policy
[afi
].import_redirect_rtlist
)
7032 ecommunity_free(&bgp
->vpn_policy
[afi
]
7033 .import_redirect_rtlist
);
7034 bgp
->vpn_policy
[afi
].import_redirect_rtlist
= NULL
;
7038 ecommunity_free(&ecom
);
7043 DEFUN_NOSH (address_family_ipv4_safi
,
7044 address_family_ipv4_safi_cmd
,
7045 "address-family ipv4 [<unicast|multicast|vpn|labeled-unicast|flowspec>]",
7046 "Enter Address Family command mode\n"
7048 BGP_SAFI_WITH_LABEL_HELP_STR
)
7052 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
7053 safi_t safi
= bgp_vty_safi_from_str(argv
[2]->text
);
7054 if (bgp
->inst_type
!= BGP_INSTANCE_TYPE_DEFAULT
7055 && safi
!= SAFI_UNICAST
&& safi
!= SAFI_MULTICAST
7056 && safi
!= SAFI_EVPN
) {
7058 "Only Unicast/Multicast/EVPN SAFIs supported in non-core instances.\n");
7059 return CMD_WARNING_CONFIG_FAILED
;
7061 vty
->node
= bgp_node_type(AFI_IP
, safi
);
7063 vty
->node
= BGP_IPV4_NODE
;
7068 DEFUN_NOSH (address_family_ipv6_safi
,
7069 address_family_ipv6_safi_cmd
,
7070 "address-family ipv6 [<unicast|multicast|vpn|labeled-unicast|flowspec>]",
7071 "Enter Address Family command mode\n"
7073 BGP_SAFI_WITH_LABEL_HELP_STR
)
7076 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
7077 safi_t safi
= bgp_vty_safi_from_str(argv
[2]->text
);
7078 if (bgp
->inst_type
!= BGP_INSTANCE_TYPE_DEFAULT
7079 && safi
!= SAFI_UNICAST
&& safi
!= SAFI_MULTICAST
7080 && safi
!= SAFI_EVPN
) {
7082 "Only Unicast/Multicast/EVPN SAFIs supported in non-core instances.\n");
7083 return CMD_WARNING_CONFIG_FAILED
;
7085 vty
->node
= bgp_node_type(AFI_IP6
, safi
);
7087 vty
->node
= BGP_IPV6_NODE
;
7092 #ifdef KEEP_OLD_VPN_COMMANDS
7093 DEFUN_NOSH (address_family_vpnv4
,
7094 address_family_vpnv4_cmd
,
7095 "address-family vpnv4 [unicast]",
7096 "Enter Address Family command mode\n"
7098 "Address Family modifier\n")
7100 vty
->node
= BGP_VPNV4_NODE
;
7104 DEFUN_NOSH (address_family_vpnv6
,
7105 address_family_vpnv6_cmd
,
7106 "address-family vpnv6 [unicast]",
7107 "Enter Address Family command mode\n"
7109 "Address Family modifier\n")
7111 vty
->node
= BGP_VPNV6_NODE
;
7114 #endif /* KEEP_OLD_VPN_COMMANDS */
7116 DEFUN_NOSH (address_family_evpn
,
7117 address_family_evpn_cmd
,
7118 "address-family l2vpn evpn",
7119 "Enter Address Family command mode\n"
7121 "Address Family modifier\n")
7123 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
7124 vty
->node
= BGP_EVPN_NODE
;
7128 DEFUN_NOSH (exit_address_family
,
7129 exit_address_family_cmd
,
7130 "exit-address-family",
7131 "Exit from Address Family configuration mode\n")
7133 if (vty
->node
== BGP_IPV4_NODE
|| vty
->node
== BGP_IPV4M_NODE
7134 || vty
->node
== BGP_IPV4L_NODE
|| vty
->node
== BGP_VPNV4_NODE
7135 || vty
->node
== BGP_IPV6_NODE
|| vty
->node
== BGP_IPV6M_NODE
7136 || vty
->node
== BGP_IPV6L_NODE
|| vty
->node
== BGP_VPNV6_NODE
7137 || vty
->node
== BGP_EVPN_NODE
7138 || vty
->node
== BGP_FLOWSPECV4_NODE
7139 || vty
->node
== BGP_FLOWSPECV6_NODE
)
7140 vty
->node
= BGP_NODE
;
7144 /* Recalculate bestpath and re-advertise a prefix */
7145 static int bgp_clear_prefix(struct vty
*vty
, const char *view_name
,
7146 const char *ip_str
, afi_t afi
, safi_t safi
,
7147 struct prefix_rd
*prd
)
7150 struct prefix match
;
7151 struct bgp_node
*rn
;
7152 struct bgp_node
*rm
;
7154 struct bgp_table
*table
;
7155 struct bgp_table
*rib
;
7157 /* BGP structure lookup. */
7159 bgp
= bgp_lookup_by_name(view_name
);
7161 vty_out(vty
, "%% Can't find BGP instance %s\n",
7166 bgp
= bgp_get_default();
7168 vty_out(vty
, "%% No BGP process is configured\n");
7173 /* Check IP address argument. */
7174 ret
= str2prefix(ip_str
, &match
);
7176 vty_out(vty
, "%% address is malformed\n");
7180 match
.family
= afi2family(afi
);
7181 rib
= bgp
->rib
[afi
][safi
];
7183 if (safi
== SAFI_MPLS_VPN
) {
7184 for (rn
= bgp_table_top(rib
); rn
; rn
= bgp_route_next(rn
)) {
7185 if (prd
&& memcmp(rn
->p
.u
.val
, prd
->val
, 8) != 0)
7188 table
= bgp_node_get_bgp_table_info(rn
);
7189 if (table
!= NULL
) {
7191 if ((rm
= bgp_node_match(table
, &match
))
7194 == match
.prefixlen
) {
7196 BGP_NODE_USER_CLEAR
);
7197 bgp_process(bgp
, rm
, afi
, safi
);
7199 bgp_unlock_node(rm
);
7204 if ((rn
= bgp_node_match(rib
, &match
)) != NULL
) {
7205 if (rn
->p
.prefixlen
== match
.prefixlen
) {
7206 SET_FLAG(rn
->flags
, BGP_NODE_USER_CLEAR
);
7207 bgp_process(bgp
, rn
, afi
, safi
);
7209 bgp_unlock_node(rn
);
7216 /* one clear bgp command to rule them all */
7217 DEFUN (clear_ip_bgp_all
,
7218 clear_ip_bgp_all_cmd
,
7219 "clear [ip] bgp [<view|vrf> VIEWVRFNAME] [<ipv4|ipv6|l2vpn> [<unicast|multicast|vpn|labeled-unicast|flowspec|evpn>]] <*|A.B.C.D|X:X::X:X|WORD|(1-4294967295)|external|peer-group PGNAME> [<soft [<in|out>]|in [prefix-filter]|out>]",
7223 BGP_INSTANCE_HELP_STR
7226 BGP_SAFI_WITH_LABEL_HELP_STR
7227 "Address Family modifier\n"
7229 "BGP neighbor address to clear\n"
7230 "BGP IPv6 neighbor to clear\n"
7231 "BGP neighbor on interface to clear\n"
7232 "Clear peers with the AS number\n"
7233 "Clear all external peers\n"
7234 "Clear all members of peer-group\n"
7235 "BGP peer-group name\n"
7240 "Push out prefix-list ORF and do inbound soft reconfig\n"
7245 afi_t afi
= AFI_IP6
;
7246 safi_t safi
= SAFI_UNICAST
;
7247 enum clear_sort clr_sort
= clear_peer
;
7248 enum bgp_clear_type clr_type
;
7249 char *clr_arg
= NULL
;
7253 /* clear [ip] bgp */
7254 if (argv_find(argv
, argc
, "ip", &idx
))
7257 /* [<vrf> VIEWVRFNAME] */
7258 if (argv_find(argv
, argc
, "vrf", &idx
)) {
7259 vrf
= argv
[idx
+ 1]->arg
;
7261 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
7263 } else if (argv_find(argv
, argc
, "view", &idx
)) {
7264 /* [<view> VIEWVRFNAME] */
7265 vrf
= argv
[idx
+ 1]->arg
;
7268 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
7269 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
))
7270 argv_find_and_parse_safi(argv
, argc
, &idx
, &safi
);
7272 /* <*|A.B.C.D|X:X::X:X|WORD|(1-4294967295)|external|peer-group PGNAME> */
7273 if (argv_find(argv
, argc
, "*", &idx
)) {
7274 clr_sort
= clear_all
;
7275 } else if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7276 clr_sort
= clear_peer
;
7277 clr_arg
= argv
[idx
]->arg
;
7278 } else if (argv_find(argv
, argc
, "X:X::X:X", &idx
)) {
7279 clr_sort
= clear_peer
;
7280 clr_arg
= argv
[idx
]->arg
;
7281 } else if (argv_find(argv
, argc
, "peer-group", &idx
)) {
7282 clr_sort
= clear_group
;
7284 clr_arg
= argv
[idx
]->arg
;
7285 } else if (argv_find(argv
, argc
, "PGNAME", &idx
)) {
7286 clr_sort
= clear_peer
;
7287 clr_arg
= argv
[idx
]->arg
;
7288 } else if (argv_find(argv
, argc
, "(1-4294967295)", &idx
)) {
7289 clr_sort
= clear_as
;
7290 clr_arg
= argv
[idx
]->arg
;
7291 } else if (argv_find(argv
, argc
, "external", &idx
)) {
7292 clr_sort
= clear_external
;
7295 /* [<soft [<in|out>]|in [prefix-filter]|out>] */
7296 if (argv_find(argv
, argc
, "soft", &idx
)) {
7297 if (argv_find(argv
, argc
, "in", &idx
)
7298 || argv_find(argv
, argc
, "out", &idx
))
7299 clr_type
= strmatch(argv
[idx
]->text
, "in")
7301 : BGP_CLEAR_SOFT_OUT
;
7303 clr_type
= BGP_CLEAR_SOFT_BOTH
;
7304 } else if (argv_find(argv
, argc
, "in", &idx
)) {
7305 clr_type
= argv_find(argv
, argc
, "prefix-filter", &idx
)
7306 ? BGP_CLEAR_SOFT_IN_ORF_PREFIX
7307 : BGP_CLEAR_SOFT_IN
;
7308 } else if (argv_find(argv
, argc
, "out", &idx
)) {
7309 clr_type
= BGP_CLEAR_SOFT_OUT
;
7311 clr_type
= BGP_CLEAR_SOFT_NONE
;
7313 return bgp_clear_vty(vty
, vrf
, afi
, safi
, clr_sort
, clr_type
, clr_arg
);
7316 DEFUN (clear_ip_bgp_prefix
,
7317 clear_ip_bgp_prefix_cmd
,
7318 "clear [ip] bgp [<view|vrf> VIEWVRFNAME] prefix A.B.C.D/M",
7322 BGP_INSTANCE_HELP_STR
7323 "Clear bestpath and re-advertise\n"
7327 char *prefix
= NULL
;
7331 /* [<view|vrf> VIEWVRFNAME] */
7332 if (argv_find(argv
, argc
, "vrf", &idx
)) {
7333 vrf
= argv
[idx
+ 1]->arg
;
7335 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
7337 } else if (argv_find(argv
, argc
, "view", &idx
)) {
7338 /* [<view> VIEWVRFNAME] */
7339 vrf
= argv
[idx
+ 1]->arg
;
7343 prefix
= argv
[argc
- 1]->arg
;
7345 return bgp_clear_prefix(vty
, vrf
, prefix
, AFI_IP
, SAFI_UNICAST
, NULL
);
7348 DEFUN (clear_bgp_ipv6_safi_prefix
,
7349 clear_bgp_ipv6_safi_prefix_cmd
,
7350 "clear [ip] bgp ipv6 "BGP_SAFI_CMD_STR
" prefix X:X::X:X/M",
7356 "Clear bestpath and re-advertise\n"
7360 int idx_ipv6_prefix
= 0;
7361 safi_t safi
= SAFI_UNICAST
;
7362 char *prefix
= argv_find(argv
, argc
, "X:X::X:X/M", &idx_ipv6_prefix
) ?
7363 argv
[idx_ipv6_prefix
]->arg
: NULL
;
7365 argv_find_and_parse_safi(argv
, argc
, &idx_safi
, &safi
);
7366 return bgp_clear_prefix(
7367 vty
, NULL
, prefix
, AFI_IP6
,
7371 DEFUN (clear_bgp_instance_ipv6_safi_prefix
,
7372 clear_bgp_instance_ipv6_safi_prefix_cmd
,
7373 "clear [ip] bgp <view|vrf> VIEWVRFNAME ipv6 "BGP_SAFI_CMD_STR
" prefix X:X::X:X/M",
7377 BGP_INSTANCE_HELP_STR
7380 "Clear bestpath and re-advertise\n"
7384 int idx_vrfview
= 0;
7385 int idx_ipv6_prefix
= 0;
7386 safi_t safi
= SAFI_UNICAST
;
7387 char *prefix
= argv_find(argv
, argc
, "X:X::X:X/M", &idx_ipv6_prefix
) ?
7388 argv
[idx_ipv6_prefix
]->arg
: NULL
;
7389 char *vrfview
= NULL
;
7391 /* [<view|vrf> VIEWVRFNAME] */
7392 if (argv_find(argv
, argc
, "vrf", &idx_vrfview
)) {
7393 vrfview
= argv
[idx_vrfview
+ 1]->arg
;
7394 if (vrfview
&& strmatch(vrfview
, VRF_DEFAULT_NAME
))
7396 } else if (argv_find(argv
, argc
, "view", &idx_vrfview
)) {
7397 /* [<view> VIEWVRFNAME] */
7398 vrfview
= argv
[idx_vrfview
+ 1]->arg
;
7400 argv_find_and_parse_safi(argv
, argc
, &idx_safi
, &safi
);
7402 return bgp_clear_prefix(
7403 vty
, vrfview
, prefix
,
7404 AFI_IP6
, safi
, NULL
);
7407 DEFUN (show_bgp_views
,
7409 "show [ip] bgp views",
7413 "Show the defined BGP views\n")
7415 struct list
*inst
= bm
->bgp
;
7416 struct listnode
*node
;
7419 vty_out(vty
, "Defined BGP views:\n");
7420 for (ALL_LIST_ELEMENTS_RO(inst
, node
, bgp
)) {
7422 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_VRF
)
7424 vty_out(vty
, "\t%s (AS%u)\n", bgp
->name
? bgp
->name
: "(null)",
7431 DEFUN (show_bgp_vrfs
,
7433 "show [ip] bgp vrfs [json]",
7440 char buf
[ETHER_ADDR_STRLEN
];
7441 struct list
*inst
= bm
->bgp
;
7442 struct listnode
*node
;
7444 bool uj
= use_json(argc
, argv
);
7445 json_object
*json
= NULL
;
7446 json_object
*json_vrfs
= NULL
;
7450 json
= json_object_new_object();
7451 json_vrfs
= json_object_new_object();
7454 for (ALL_LIST_ELEMENTS_RO(inst
, node
, bgp
)) {
7455 const char *name
, *type
;
7457 struct listnode
*node2
, *nnode2
;
7458 int peers_cfg
, peers_estb
;
7459 json_object
*json_vrf
= NULL
;
7462 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_VIEW
)
7466 if (!uj
&& count
== 1) {
7468 "%4s %-5s %-16s %9s %10s %-37s\n",
7469 "Type", "Id", "routerId", "#PeersVfg",
7470 "#PeersEstb", "Name");
7471 vty_out(vty
, "%11s %-16s %-21s %-6s\n", " ",
7472 "L3-VNI", "RouterMAC", "Interface");
7475 peers_cfg
= peers_estb
= 0;
7477 json_vrf
= json_object_new_object();
7480 for (ALL_LIST_ELEMENTS(bgp
->peer
, node2
, nnode2
, peer
)) {
7481 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
7484 if (peer
->status
== Established
)
7488 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
) {
7489 name
= VRF_DEFAULT_NAME
;
7498 int64_t vrf_id_ui
= (bgp
->vrf_id
== VRF_UNKNOWN
)
7500 : (int64_t)bgp
->vrf_id
;
7501 json_object_string_add(json_vrf
, "type", type
);
7502 json_object_int_add(json_vrf
, "vrfId", vrf_id_ui
);
7503 json_object_string_add(json_vrf
, "routerId",
7504 inet_ntoa(bgp
->router_id
));
7505 json_object_int_add(json_vrf
, "numConfiguredPeers",
7507 json_object_int_add(json_vrf
, "numEstablishedPeers",
7510 json_object_int_add(json_vrf
, "l3vni", bgp
->l3vni
);
7511 json_object_string_add(
7513 prefix_mac2str(&bgp
->rmac
, buf
, sizeof(buf
)));
7514 json_object_string_add(json_vrf
, "interface",
7515 ifindex2ifname(bgp
->l3vni_svi_ifindex
,
7517 json_object_object_add(json_vrfs
, name
, json_vrf
);
7520 "%4s %-5d %-16s %-9u %-10u %-37s\n",
7522 bgp
->vrf_id
== VRF_UNKNOWN
? -1
7524 inet_ntoa(bgp
->router_id
), peers_cfg
,
7526 vty_out(vty
,"%11s %-16u %-21s %-20s\n", " ",
7528 prefix_mac2str(&bgp
->rmac
, buf
, sizeof(buf
)),
7529 ifindex2ifname(bgp
->l3vni_svi_ifindex
,
7535 json_object_object_add(json
, "vrfs", json_vrfs
);
7537 json_object_int_add(json
, "totalVrfs", count
);
7539 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
7540 json
, JSON_C_TO_STRING_PRETTY
));
7541 json_object_free(json
);
7545 "\nTotal number of VRFs (including default): %d\n",
7552 DEFUN (show_bgp_mac_hash
,
7553 show_bgp_mac_hash_cmd
,
7554 "show bgp mac hash",
7558 "Mac Address database\n")
7560 bgp_mac_dump_table(vty
);
7565 static void show_tip_entry(struct hash_bucket
*bucket
, void *args
)
7567 struct vty
*vty
= (struct vty
*)args
;
7568 struct tip_addr
*tip
= (struct tip_addr
*)bucket
->data
;
7570 vty_out(vty
, "addr: %s, count: %d\n", inet_ntoa(tip
->addr
),
7574 static void bgp_show_martian_nexthops(struct vty
*vty
, struct bgp
*bgp
)
7576 vty_out(vty
, "self nexthop database:\n");
7577 bgp_nexthop_show_address_hash(vty
, bgp
);
7579 vty_out(vty
, "Tunnel-ip database:\n");
7580 hash_iterate(bgp
->tip_hash
,
7581 (void (*)(struct hash_bucket
*, void *))show_tip_entry
,
7585 DEFUN(show_bgp_martian_nexthop_db
, show_bgp_martian_nexthop_db_cmd
,
7586 "show bgp [<view|vrf> VIEWVRFNAME] martian next-hop",
7587 SHOW_STR BGP_STR BGP_INSTANCE_HELP_STR
7588 "martian next-hops\n"
7589 "martian next-hop database\n")
7591 struct bgp
*bgp
= NULL
;
7595 /* [<vrf> VIEWVRFNAME] */
7596 if (argv_find(argv
, argc
, "vrf", &idx
)) {
7597 name
= argv
[idx
+ 1]->arg
;
7598 if (name
&& strmatch(name
, VRF_DEFAULT_NAME
))
7600 } else if (argv_find(argv
, argc
, "view", &idx
))
7601 /* [<view> VIEWVRFNAME] */
7602 name
= argv
[idx
+ 1]->arg
;
7604 bgp
= bgp_lookup_by_name(name
);
7606 bgp
= bgp_get_default();
7609 vty_out(vty
, "%% No BGP process is configured\n");
7612 bgp_show_martian_nexthops(vty
, bgp
);
7617 DEFUN (show_bgp_memory
,
7618 show_bgp_memory_cmd
,
7619 "show [ip] bgp memory",
7623 "Global BGP memory statistics\n")
7625 char memstrbuf
[MTYPE_MEMSTR_LEN
];
7626 unsigned long count
;
7628 /* RIB related usage stats */
7629 count
= mtype_stats_alloc(MTYPE_BGP_NODE
);
7630 vty_out(vty
, "%ld RIB nodes, using %s of memory\n", count
,
7631 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7632 count
* sizeof(struct bgp_node
)));
7634 count
= mtype_stats_alloc(MTYPE_BGP_ROUTE
);
7635 vty_out(vty
, "%ld BGP routes, using %s of memory\n", count
,
7636 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7637 count
* sizeof(struct bgp_path_info
)));
7638 if ((count
= mtype_stats_alloc(MTYPE_BGP_ROUTE_EXTRA
)))
7639 vty_out(vty
, "%ld BGP route ancillaries, using %s of memory\n",
7642 memstrbuf
, sizeof(memstrbuf
),
7643 count
* sizeof(struct bgp_path_info_extra
)));
7645 if ((count
= mtype_stats_alloc(MTYPE_BGP_STATIC
)))
7646 vty_out(vty
, "%ld Static routes, using %s of memory\n", count
,
7647 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7648 count
* sizeof(struct bgp_static
)));
7650 if ((count
= mtype_stats_alloc(MTYPE_BGP_PACKET
)))
7651 vty_out(vty
, "%ld Packets, using %s of memory\n", count
,
7652 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7653 count
* sizeof(struct bpacket
)));
7656 if ((count
= mtype_stats_alloc(MTYPE_BGP_ADJ_IN
)))
7657 vty_out(vty
, "%ld Adj-In entries, using %s of memory\n", count
,
7658 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7659 count
* sizeof(struct bgp_adj_in
)));
7660 if ((count
= mtype_stats_alloc(MTYPE_BGP_ADJ_OUT
)))
7661 vty_out(vty
, "%ld Adj-Out entries, using %s of memory\n", count
,
7662 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7663 count
* sizeof(struct bgp_adj_out
)));
7665 if ((count
= mtype_stats_alloc(MTYPE_BGP_NEXTHOP_CACHE
)))
7666 vty_out(vty
, "%ld Nexthop cache entries, using %s of memory\n",
7668 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7669 count
* sizeof(struct bgp_nexthop_cache
)));
7671 if ((count
= mtype_stats_alloc(MTYPE_BGP_DAMP_INFO
)))
7672 vty_out(vty
, "%ld Dampening entries, using %s of memory\n",
7674 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7675 count
* sizeof(struct bgp_damp_info
)));
7678 count
= attr_count();
7679 vty_out(vty
, "%ld BGP attributes, using %s of memory\n", count
,
7680 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7681 count
* sizeof(struct attr
)));
7683 if ((count
= attr_unknown_count()))
7684 vty_out(vty
, "%ld unknown attributes\n", count
);
7686 /* AS_PATH attributes */
7687 count
= aspath_count();
7688 vty_out(vty
, "%ld BGP AS-PATH entries, using %s of memory\n", count
,
7689 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7690 count
* sizeof(struct aspath
)));
7692 count
= mtype_stats_alloc(MTYPE_AS_SEG
);
7693 vty_out(vty
, "%ld BGP AS-PATH segments, using %s of memory\n", count
,
7694 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7695 count
* sizeof(struct assegment
)));
7697 /* Other attributes */
7698 if ((count
= community_count()))
7699 vty_out(vty
, "%ld BGP community entries, using %s of memory\n",
7700 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7701 count
* sizeof(struct community
)));
7702 if ((count
= mtype_stats_alloc(MTYPE_ECOMMUNITY
)))
7703 vty_out(vty
, "%ld BGP community entries, using %s of memory\n",
7704 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7705 count
* sizeof(struct ecommunity
)));
7706 if ((count
= mtype_stats_alloc(MTYPE_LCOMMUNITY
)))
7708 "%ld BGP large-community entries, using %s of memory\n",
7709 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7710 count
* sizeof(struct lcommunity
)));
7712 if ((count
= mtype_stats_alloc(MTYPE_CLUSTER
)))
7713 vty_out(vty
, "%ld Cluster lists, using %s of memory\n", count
,
7714 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7715 count
* sizeof(struct cluster_list
)));
7717 /* Peer related usage */
7718 count
= mtype_stats_alloc(MTYPE_BGP_PEER
);
7719 vty_out(vty
, "%ld peers, using %s of memory\n", count
,
7720 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7721 count
* sizeof(struct peer
)));
7723 if ((count
= mtype_stats_alloc(MTYPE_PEER_GROUP
)))
7724 vty_out(vty
, "%ld peer groups, using %s of memory\n", count
,
7725 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7726 count
* sizeof(struct peer_group
)));
7729 if ((count
= mtype_stats_alloc(MTYPE_HASH
)))
7730 vty_out(vty
, "%ld hash tables, using %s of memory\n", count
,
7731 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7732 count
* sizeof(struct hash
)));
7733 if ((count
= mtype_stats_alloc(MTYPE_HASH_BACKET
)))
7734 vty_out(vty
, "%ld hash buckets, using %s of memory\n", count
,
7735 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7736 count
* sizeof(struct hash_bucket
)));
7737 if ((count
= mtype_stats_alloc(MTYPE_BGP_REGEXP
)))
7738 vty_out(vty
, "%ld compiled regexes, using %s of memory\n",
7739 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7740 count
* sizeof(regex_t
)));
7744 static void bgp_show_bestpath_json(struct bgp
*bgp
, json_object
*json
)
7746 json_object
*bestpath
= json_object_new_object();
7748 if (bgp_flag_check(bgp
, BGP_FLAG_ASPATH_IGNORE
))
7749 json_object_string_add(bestpath
, "asPath", "ignore");
7751 if (bgp_flag_check(bgp
, BGP_FLAG_ASPATH_CONFED
))
7752 json_object_string_add(bestpath
, "asPath", "confed");
7754 if (bgp_flag_check(bgp
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
)) {
7755 if (bgp_flag_check(bgp
, BGP_FLAG_MULTIPATH_RELAX_AS_SET
))
7756 json_object_string_add(bestpath
, "multiPathRelax",
7759 json_object_string_add(bestpath
, "multiPathRelax",
7762 json_object_string_add(bestpath
, "multiPathRelax", "false");
7764 if (bgp_flag_check(bgp
, BGP_FLAG_COMPARE_ROUTER_ID
))
7765 json_object_string_add(bestpath
, "compareRouterId", "true");
7766 if (bgp_flag_check(bgp
, BGP_FLAG_MED_CONFED
)
7767 || bgp_flag_check(bgp
, BGP_FLAG_MED_MISSING_AS_WORST
)) {
7768 if (bgp_flag_check(bgp
, BGP_FLAG_MED_CONFED
))
7769 json_object_string_add(bestpath
, "med", "confed");
7770 if (bgp_flag_check(bgp
, BGP_FLAG_MED_MISSING_AS_WORST
))
7771 json_object_string_add(bestpath
, "med",
7772 "missing-as-worst");
7774 json_object_string_add(bestpath
, "med", "true");
7777 json_object_object_add(json
, "bestPath", bestpath
);
7780 /* Show BGP peer's summary information. */
7781 static int bgp_show_summary(struct vty
*vty
, struct bgp
*bgp
, int afi
, int safi
,
7782 bool use_json
, json_object
*json
)
7785 struct listnode
*node
, *nnode
;
7786 unsigned int count
= 0, dn_count
= 0;
7787 char timebuf
[BGP_UPTIME_LEN
], dn_flag
[2];
7788 char neighbor_buf
[VTY_BUFSIZ
];
7789 int neighbor_col_default_width
= 16;
7791 int max_neighbor_width
= 0;
7793 json_object
*json_peer
= NULL
;
7794 json_object
*json_peers
= NULL
;
7795 struct peer_af
*paf
;
7797 /* labeled-unicast routes are installed in the unicast table so in order
7799 * display the correct PfxRcd value we must look at SAFI_UNICAST
7801 if (safi
== SAFI_LABELED_UNICAST
)
7802 pfx_rcd_safi
= SAFI_UNICAST
;
7804 pfx_rcd_safi
= safi
;
7808 json
= json_object_new_object();
7810 json_peers
= json_object_new_object();
7812 /* Loop over all neighbors that will be displayed to determine
7814 * characters are needed for the Neighbor column
7816 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
7817 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
7820 if (peer
->afc
[afi
][safi
]) {
7821 memset(dn_flag
, '\0', sizeof(dn_flag
));
7822 if (peer_dynamic_neighbor(peer
))
7826 && bgp_flag_check(bgp
,
7827 BGP_FLAG_SHOW_HOSTNAME
))
7828 sprintf(neighbor_buf
, "%s%s(%s) ",
7829 dn_flag
, peer
->hostname
,
7832 sprintf(neighbor_buf
, "%s%s ", dn_flag
,
7835 len
= strlen(neighbor_buf
);
7837 if (len
> max_neighbor_width
)
7838 max_neighbor_width
= len
;
7842 /* Originally we displayed the Neighbor column as 16
7843 * characters wide so make that the default
7845 if (max_neighbor_width
< neighbor_col_default_width
)
7846 max_neighbor_width
= neighbor_col_default_width
;
7849 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
7850 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
7853 if (!peer
->afc
[afi
][safi
])
7858 char memstrbuf
[MTYPE_MEMSTR_LEN
];
7861 vrf_id_ui
= (bgp
->vrf_id
== VRF_UNKNOWN
)
7863 : (int64_t)bgp
->vrf_id
;
7865 /* Usage summary and header */
7867 json_object_string_add(
7869 inet_ntoa(bgp
->router_id
));
7870 json_object_int_add(json
, "as", bgp
->as
);
7871 json_object_int_add(json
, "vrfId", vrf_id_ui
);
7872 json_object_string_add(
7875 == BGP_INSTANCE_TYPE_DEFAULT
)
7880 "BGP router identifier %s, local AS number %u vrf-id %d",
7881 inet_ntoa(bgp
->router_id
), bgp
->as
,
7882 bgp
->vrf_id
== VRF_UNKNOWN
7884 : (int)bgp
->vrf_id
);
7888 if (bgp_update_delay_configured(bgp
)) {
7890 json_object_int_add(
7891 json
, "updateDelayLimit",
7892 bgp
->v_update_delay
);
7894 if (bgp
->v_update_delay
7895 != bgp
->v_establish_wait
)
7896 json_object_int_add(
7898 "updateDelayEstablishWait",
7899 bgp
->v_establish_wait
);
7901 if (bgp_update_delay_active(bgp
)) {
7902 json_object_string_add(
7904 "updateDelayFirstNeighbor",
7905 bgp
->update_delay_begin_time
);
7906 json_object_boolean_true_add(
7908 "updateDelayInProgress");
7910 if (bgp
->update_delay_over
) {
7911 json_object_string_add(
7913 "updateDelayFirstNeighbor",
7914 bgp
->update_delay_begin_time
);
7915 json_object_string_add(
7917 "updateDelayBestpathResumed",
7918 bgp
->update_delay_end_time
);
7919 json_object_string_add(
7921 "updateDelayZebraUpdateResume",
7922 bgp
->update_delay_zebra_resume_time
);
7923 json_object_string_add(
7925 "updateDelayPeerUpdateResume",
7926 bgp
->update_delay_peers_resume_time
);
7931 "Read-only mode update-delay limit: %d seconds\n",
7932 bgp
->v_update_delay
);
7933 if (bgp
->v_update_delay
7934 != bgp
->v_establish_wait
)
7936 " Establish wait: %d seconds\n",
7937 bgp
->v_establish_wait
);
7939 if (bgp_update_delay_active(bgp
)) {
7941 " First neighbor established: %s\n",
7942 bgp
->update_delay_begin_time
);
7944 " Delay in progress\n");
7946 if (bgp
->update_delay_over
) {
7948 " First neighbor established: %s\n",
7949 bgp
->update_delay_begin_time
);
7951 " Best-paths resumed: %s\n",
7952 bgp
->update_delay_end_time
);
7954 " zebra update resumed: %s\n",
7955 bgp
->update_delay_zebra_resume_time
);
7957 " peers update resumed: %s\n",
7958 bgp
->update_delay_peers_resume_time
);
7965 if (bgp_maxmed_onstartup_configured(bgp
)
7966 && bgp
->maxmed_active
)
7967 json_object_boolean_true_add(
7968 json
, "maxMedOnStartup");
7969 if (bgp
->v_maxmed_admin
)
7970 json_object_boolean_true_add(
7971 json
, "maxMedAdministrative");
7973 json_object_int_add(
7974 json
, "tableVersion",
7975 bgp_table_version(bgp
->rib
[afi
][safi
]));
7977 ents
= bgp_table_count(bgp
->rib
[afi
][safi
]);
7978 json_object_int_add(json
, "ribCount", ents
);
7979 json_object_int_add(
7981 ents
* sizeof(struct bgp_node
));
7983 ents
= bgp
->af_peer_count
[afi
][safi
];
7984 json_object_int_add(json
, "peerCount", ents
);
7985 json_object_int_add(json
, "peerMemory",
7986 ents
* sizeof(struct peer
));
7988 if ((ents
= listcount(bgp
->group
))) {
7989 json_object_int_add(
7990 json
, "peerGroupCount", ents
);
7991 json_object_int_add(
7992 json
, "peerGroupMemory",
7993 ents
* sizeof(struct
7997 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
7998 BGP_CONFIG_DAMPENING
))
7999 json_object_boolean_true_add(
8000 json
, "dampeningEnabled");
8002 if (bgp_maxmed_onstartup_configured(bgp
)
8003 && bgp
->maxmed_active
)
8005 "Max-med on-startup active\n");
8006 if (bgp
->v_maxmed_admin
)
8008 "Max-med administrative active\n");
8010 vty_out(vty
, "BGP table version %" PRIu64
"\n",
8011 bgp_table_version(bgp
->rib
[afi
][safi
]));
8013 ents
= bgp_table_count(bgp
->rib
[afi
][safi
]);
8015 "RIB entries %ld, using %s of memory\n",
8017 mtype_memstr(memstrbuf
,
8019 ents
* sizeof(struct
8022 /* Peer related usage */
8023 ents
= bgp
->af_peer_count
[afi
][safi
];
8024 vty_out(vty
, "Peers %ld, using %s of memory\n",
8027 memstrbuf
, sizeof(memstrbuf
),
8028 ents
* sizeof(struct peer
)));
8030 if ((ents
= listcount(bgp
->group
)))
8032 "Peer groups %ld, using %s of memory\n",
8037 ents
* sizeof(struct
8040 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
8041 BGP_CONFIG_DAMPENING
))
8042 vty_out(vty
, "Dampening enabled.\n");
8045 /* Subtract 8 here because 'Neighbor' is
8047 vty_out(vty
, "Neighbor");
8048 vty_out(vty
, "%*s", max_neighbor_width
- 8,
8051 "V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd\n");
8058 json_peer
= json_object_new_object();
8060 if (peer_dynamic_neighbor(peer
)) {
8062 json_object_boolean_true_add(json_peer
,
8067 json_object_string_add(json_peer
, "hostname",
8070 if (peer
->domainname
)
8071 json_object_string_add(json_peer
, "domainname",
8074 json_object_int_add(json_peer
, "remoteAs", peer
->as
);
8075 json_object_int_add(json_peer
, "version", 4);
8076 json_object_int_add(json_peer
, "msgRcvd",
8077 PEER_TOTAL_RX(peer
));
8078 json_object_int_add(json_peer
, "msgSent",
8079 PEER_TOTAL_TX(peer
));
8081 json_object_int_add(json_peer
, "tableVersion",
8082 peer
->version
[afi
][safi
]);
8083 json_object_int_add(json_peer
, "outq",
8085 json_object_int_add(json_peer
, "inq", 0);
8086 peer_uptime(peer
->uptime
, timebuf
, BGP_UPTIME_LEN
,
8087 use_json
, json_peer
);
8090 * Adding "pfxRcd" field to match with the corresponding
8091 * CLI. "prefixReceivedCount" will be deprecated in
8094 json_object_int_add(json_peer
, "prefixReceivedCount",
8095 peer
->pcount
[afi
][pfx_rcd_safi
]);
8096 json_object_int_add(json_peer
, "pfxRcd",
8097 peer
->pcount
[afi
][pfx_rcd_safi
]);
8099 paf
= peer_af_find(peer
, afi
, pfx_rcd_safi
);
8100 if (paf
&& PAF_SUBGRP(paf
))
8101 json_object_int_add(json_peer
,
8103 (PAF_SUBGRP(paf
))->scount
);
8105 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_SHUTDOWN
))
8106 json_object_string_add(json_peer
, "state",
8108 else if (peer
->afc_recv
[afi
][safi
])
8109 json_object_string_add(
8111 lookup_msg(bgp_status_msg
, peer
->status
,
8113 else if (CHECK_FLAG(peer
->sflags
,
8114 PEER_STATUS_PREFIX_OVERFLOW
))
8115 json_object_string_add(json_peer
, "state",
8118 json_object_string_add(
8120 lookup_msg(bgp_status_msg
, peer
->status
,
8124 json_object_string_add(json_peer
, "idType",
8126 else if (peer
->su
.sa
.sa_family
== AF_INET
)
8127 json_object_string_add(json_peer
, "idType",
8129 else if (peer
->su
.sa
.sa_family
== AF_INET6
)
8130 json_object_string_add(json_peer
, "idType",
8133 json_object_object_add(json_peers
, peer
->host
,
8136 memset(dn_flag
, '\0', sizeof(dn_flag
));
8137 if (peer_dynamic_neighbor(peer
)) {
8143 && bgp_flag_check(bgp
, BGP_FLAG_SHOW_HOSTNAME
))
8144 len
= vty_out(vty
, "%s%s(%s)", dn_flag
,
8145 peer
->hostname
, peer
->host
);
8147 len
= vty_out(vty
, "%s%s", dn_flag
, peer
->host
);
8149 /* pad the neighbor column with spaces */
8150 if (len
< max_neighbor_width
)
8151 vty_out(vty
, "%*s", max_neighbor_width
- len
,
8154 vty_out(vty
, "4 %10u %7u %7u %8" PRIu64
" %4d %4zd %8s",
8155 peer
->as
, PEER_TOTAL_RX(peer
),
8156 PEER_TOTAL_TX(peer
), peer
->version
[afi
][safi
],
8157 0, peer
->obuf
->count
,
8158 peer_uptime(peer
->uptime
, timebuf
,
8159 BGP_UPTIME_LEN
, 0, NULL
));
8161 if (peer
->status
== Established
)
8162 if (peer
->afc_recv
[afi
][safi
])
8163 vty_out(vty
, " %12ld",
8167 vty_out(vty
, " NoNeg");
8169 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_SHUTDOWN
))
8170 vty_out(vty
, " Idle (Admin)");
8171 else if (CHECK_FLAG(
8173 PEER_STATUS_PREFIX_OVERFLOW
))
8174 vty_out(vty
, " Idle (PfxCt)");
8176 vty_out(vty
, " %12s",
8177 lookup_msg(bgp_status_msg
,
8178 peer
->status
, NULL
));
8185 json_object_object_add(json
, "peers", json_peers
);
8187 json_object_int_add(json
, "totalPeers", count
);
8188 json_object_int_add(json
, "dynamicPeers", dn_count
);
8190 bgp_show_bestpath_json(bgp
, json
);
8192 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
8193 json
, JSON_C_TO_STRING_PRETTY
));
8194 json_object_free(json
);
8197 vty_out(vty
, "\nTotal number of neighbors %d\n", count
);
8199 vty_out(vty
, "No %s neighbor is configured\n",
8200 afi_safi_print(afi
, safi
));
8204 vty_out(vty
, "* - dynamic neighbor\n");
8205 vty_out(vty
, "%d dynamic neighbor(s), limit %d\n",
8206 dn_count
, bgp
->dynamic_neighbors_limit
);
8213 static void bgp_show_summary_afi_safi(struct vty
*vty
, struct bgp
*bgp
, int afi
,
8214 int safi
, bool use_json
,
8218 int afi_wildcard
= (afi
== AFI_MAX
);
8219 int safi_wildcard
= (safi
== SAFI_MAX
);
8220 int is_wildcard
= (afi_wildcard
|| safi_wildcard
);
8221 bool nbr_output
= false;
8223 if (use_json
&& is_wildcard
)
8224 vty_out(vty
, "{\n");
8226 afi
= 1; /* AFI_IP */
8227 while (afi
< AFI_MAX
) {
8229 safi
= 1; /* SAFI_UNICAST */
8230 while (safi
< SAFI_MAX
) {
8231 if (bgp_afi_safi_peer_exists(bgp
, afi
, safi
)) {
8235 * So limit output to those afi/safi
8237 * actualy have something interesting in
8241 json
= json_object_new_object();
8244 vty_out(vty
, ",\n");
8248 vty_out(vty
, "\"%s\":",
8252 vty_out(vty
, "\n%s Summary:\n",
8257 bgp_show_summary(vty
, bgp
, afi
, safi
, use_json
,
8269 if (use_json
&& is_wildcard
)
8270 vty_out(vty
, "}\n");
8271 else if (!nbr_output
) {
8273 vty_out(vty
, "{}\n");
8275 vty_out(vty
, "%% No BGP neighbors found\n");
8279 static void bgp_show_all_instances_summary_vty(struct vty
*vty
, afi_t afi
,
8280 safi_t safi
, bool use_json
)
8282 struct listnode
*node
, *nnode
;
8284 json_object
*json
= NULL
;
8286 bool nbr_output
= false;
8289 vty_out(vty
, "{\n");
8291 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
8294 json
= json_object_new_object();
8297 vty_out(vty
, ",\n");
8301 vty_out(vty
, "\"%s\":",
8302 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
8306 vty_out(vty
, "\nInstance %s:\n",
8307 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
8311 bgp_show_summary_afi_safi(vty
, bgp
, afi
, safi
, use_json
, json
);
8315 vty_out(vty
, "}\n");
8316 else if (!nbr_output
)
8317 vty_out(vty
, "%% BGP instance not found\n");
8320 int bgp_show_summary_vty(struct vty
*vty
, const char *name
, afi_t afi
,
8321 safi_t safi
, bool use_json
)
8326 if (strmatch(name
, "all")) {
8327 bgp_show_all_instances_summary_vty(vty
, afi
, safi
,
8331 bgp
= bgp_lookup_by_name(name
);
8335 vty_out(vty
, "{}\n");
8338 "%% BGP instance not found\n");
8342 bgp_show_summary_afi_safi(vty
, bgp
, afi
, safi
, use_json
,
8348 bgp
= bgp_get_default();
8351 bgp_show_summary_afi_safi(vty
, bgp
, afi
, safi
, use_json
, NULL
);
8354 vty_out(vty
, "{}\n");
8356 vty_out(vty
, "%% BGP instance not found\n");
8363 /* `show [ip] bgp summary' commands. */
8364 DEFUN (show_ip_bgp_summary
,
8365 show_ip_bgp_summary_cmd
,
8366 "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR
" ["BGP_SAFI_WITH_LABEL_CMD_STR
"]] summary [json]",
8370 BGP_INSTANCE_HELP_STR
8372 BGP_SAFI_WITH_LABEL_HELP_STR
8373 "Summary of BGP neighbor status\n"
8377 afi_t afi
= AFI_MAX
;
8378 safi_t safi
= SAFI_MAX
;
8383 if (argv_find(argv
, argc
, "ip", &idx
))
8385 /* [<vrf> VIEWVRFNAME] */
8386 if (argv_find(argv
, argc
, "vrf", &idx
)) {
8387 vrf
= argv
[idx
+ 1]->arg
;
8388 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
8390 } else if (argv_find(argv
, argc
, "view", &idx
))
8391 /* [<view> VIEWVRFNAME] */
8392 vrf
= argv
[idx
+ 1]->arg
;
8393 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
8394 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
)) {
8395 argv_find_and_parse_safi(argv
, argc
, &idx
, &safi
);
8398 bool uj
= use_json(argc
, argv
);
8400 return bgp_show_summary_vty(vty
, vrf
, afi
, safi
, uj
);
8403 const char *afi_safi_print(afi_t afi
, safi_t safi
)
8405 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
8406 return "IPv4 Unicast";
8407 else if (afi
== AFI_IP
&& safi
== SAFI_MULTICAST
)
8408 return "IPv4 Multicast";
8409 else if (afi
== AFI_IP
&& safi
== SAFI_LABELED_UNICAST
)
8410 return "IPv4 Labeled Unicast";
8411 else if (afi
== AFI_IP
&& safi
== SAFI_MPLS_VPN
)
8413 else if (afi
== AFI_IP
&& safi
== SAFI_ENCAP
)
8414 return "IPv4 Encap";
8415 else if (afi
== AFI_IP
&& safi
== SAFI_FLOWSPEC
)
8416 return "IPv4 Flowspec";
8417 else if (afi
== AFI_IP6
&& safi
== SAFI_UNICAST
)
8418 return "IPv6 Unicast";
8419 else if (afi
== AFI_IP6
&& safi
== SAFI_MULTICAST
)
8420 return "IPv6 Multicast";
8421 else if (afi
== AFI_IP6
&& safi
== SAFI_LABELED_UNICAST
)
8422 return "IPv6 Labeled Unicast";
8423 else if (afi
== AFI_IP6
&& safi
== SAFI_MPLS_VPN
)
8425 else if (afi
== AFI_IP6
&& safi
== SAFI_ENCAP
)
8426 return "IPv6 Encap";
8427 else if (afi
== AFI_IP6
&& safi
== SAFI_FLOWSPEC
)
8428 return "IPv6 Flowspec";
8429 else if (afi
== AFI_L2VPN
&& safi
== SAFI_EVPN
)
8430 return "L2VPN EVPN";
8436 * Please note that we have intentionally camelCased
8437 * the return strings here. So if you want
8438 * to use this function, please ensure you
8439 * are doing this within json output
8441 const char *afi_safi_json(afi_t afi
, safi_t safi
)
8443 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
8444 return "ipv4Unicast";
8445 else if (afi
== AFI_IP
&& safi
== SAFI_MULTICAST
)
8446 return "ipv4Multicast";
8447 else if (afi
== AFI_IP
&& safi
== SAFI_LABELED_UNICAST
)
8448 return "ipv4LabeledUnicast";
8449 else if (afi
== AFI_IP
&& safi
== SAFI_MPLS_VPN
)
8451 else if (afi
== AFI_IP
&& safi
== SAFI_ENCAP
)
8453 else if (afi
== AFI_IP
&& safi
== SAFI_FLOWSPEC
)
8454 return "ipv4Flowspec";
8455 else if (afi
== AFI_IP6
&& safi
== SAFI_UNICAST
)
8456 return "ipv6Unicast";
8457 else if (afi
== AFI_IP6
&& safi
== SAFI_MULTICAST
)
8458 return "ipv6Multicast";
8459 else if (afi
== AFI_IP6
&& safi
== SAFI_LABELED_UNICAST
)
8460 return "ipv6LabeledUnicast";
8461 else if (afi
== AFI_IP6
&& safi
== SAFI_MPLS_VPN
)
8463 else if (afi
== AFI_IP6
&& safi
== SAFI_ENCAP
)
8465 else if (afi
== AFI_IP6
&& safi
== SAFI_FLOWSPEC
)
8466 return "ipv6Flowspec";
8467 else if (afi
== AFI_L2VPN
&& safi
== SAFI_EVPN
)
8473 /* Show BGP peer's information. */
8474 enum show_type
{ show_all
, show_peer
, show_ipv4_all
, show_ipv6_all
, show_ipv4_peer
, show_ipv6_peer
};
8476 static void bgp_show_peer_afi_orf_cap(struct vty
*vty
, struct peer
*p
,
8477 afi_t afi
, safi_t safi
,
8478 uint16_t adv_smcap
, uint16_t adv_rmcap
,
8479 uint16_t rcv_smcap
, uint16_t rcv_rmcap
,
8480 bool use_json
, json_object
*json_pref
)
8483 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_smcap
)
8484 || CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_smcap
)) {
8486 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_smcap
)
8487 && CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_smcap
))
8488 json_object_string_add(json_pref
, "sendMode",
8489 "advertisedAndReceived");
8490 else if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_smcap
))
8491 json_object_string_add(json_pref
, "sendMode",
8493 else if (CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_smcap
))
8494 json_object_string_add(json_pref
, "sendMode",
8497 vty_out(vty
, " Send-mode: ");
8498 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_smcap
))
8499 vty_out(vty
, "advertised");
8500 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_smcap
))
8501 vty_out(vty
, "%sreceived",
8502 CHECK_FLAG(p
->af_cap
[afi
][safi
],
8511 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_rmcap
)
8512 || CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_rmcap
)) {
8514 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_rmcap
)
8515 && CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_rmcap
))
8516 json_object_string_add(json_pref
, "recvMode",
8517 "advertisedAndReceived");
8518 else if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_rmcap
))
8519 json_object_string_add(json_pref
, "recvMode",
8521 else if (CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_rmcap
))
8522 json_object_string_add(json_pref
, "recvMode",
8525 vty_out(vty
, " Receive-mode: ");
8526 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_rmcap
))
8527 vty_out(vty
, "advertised");
8528 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_rmcap
))
8529 vty_out(vty
, "%sreceived",
8530 CHECK_FLAG(p
->af_cap
[afi
][safi
],
8539 static void bgp_show_peer_afi(struct vty
*vty
, struct peer
*p
, afi_t afi
,
8540 safi_t safi
, bool use_json
,
8541 json_object
*json_neigh
)
8543 struct bgp_filter
*filter
;
8544 struct peer_af
*paf
;
8545 char orf_pfx_name
[BUFSIZ
];
8547 json_object
*json_af
= NULL
;
8548 json_object
*json_prefA
= NULL
;
8549 json_object
*json_prefB
= NULL
;
8550 json_object
*json_addr
= NULL
;
8553 json_addr
= json_object_new_object();
8554 json_af
= json_object_new_object();
8555 filter
= &p
->filter
[afi
][safi
];
8557 if (peer_group_active(p
))
8558 json_object_string_add(json_addr
, "peerGroupMember",
8561 paf
= peer_af_find(p
, afi
, safi
);
8562 if (paf
&& PAF_SUBGRP(paf
)) {
8563 json_object_int_add(json_addr
, "updateGroupId",
8564 PAF_UPDGRP(paf
)->id
);
8565 json_object_int_add(json_addr
, "subGroupId",
8566 PAF_SUBGRP(paf
)->id
);
8567 json_object_int_add(json_addr
, "packetQueueLength",
8568 bpacket_queue_virtual_length(paf
));
8571 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
8572 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8573 PEER_CAP_ORF_PREFIX_SM_RCV
)
8574 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8575 PEER_CAP_ORF_PREFIX_RM_ADV
)
8576 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8577 PEER_CAP_ORF_PREFIX_RM_RCV
)) {
8578 json_object_int_add(json_af
, "orfType",
8580 json_prefA
= json_object_new_object();
8581 bgp_show_peer_afi_orf_cap(vty
, p
, afi
, safi
,
8582 PEER_CAP_ORF_PREFIX_SM_ADV
,
8583 PEER_CAP_ORF_PREFIX_RM_ADV
,
8584 PEER_CAP_ORF_PREFIX_SM_RCV
,
8585 PEER_CAP_ORF_PREFIX_RM_RCV
,
8586 use_json
, json_prefA
);
8587 json_object_object_add(json_af
, "orfPrefixList",
8591 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
8592 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8593 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
8594 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8595 PEER_CAP_ORF_PREFIX_RM_ADV
)
8596 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8597 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
)) {
8598 json_object_int_add(json_af
, "orfOldType",
8599 ORF_TYPE_PREFIX_OLD
);
8600 json_prefB
= json_object_new_object();
8601 bgp_show_peer_afi_orf_cap(
8602 vty
, p
, afi
, safi
, PEER_CAP_ORF_PREFIX_SM_ADV
,
8603 PEER_CAP_ORF_PREFIX_RM_ADV
,
8604 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
,
8605 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
, use_json
,
8607 json_object_object_add(json_af
, "orfOldPrefixList",
8611 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
8612 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8613 PEER_CAP_ORF_PREFIX_SM_RCV
)
8614 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8615 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
8616 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8617 PEER_CAP_ORF_PREFIX_RM_ADV
)
8618 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8619 PEER_CAP_ORF_PREFIX_RM_RCV
)
8620 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8621 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
))
8622 json_object_object_add(json_addr
, "afDependentCap",
8625 json_object_free(json_af
);
8627 sprintf(orf_pfx_name
, "%s.%d.%d", p
->host
, afi
, safi
);
8628 orf_pfx_count
= prefix_bgp_show_prefix_list(
8629 NULL
, afi
, orf_pfx_name
, use_json
);
8631 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
8632 PEER_STATUS_ORF_PREFIX_SEND
)
8634 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
8635 PEER_STATUS_ORF_PREFIX_SEND
))
8636 json_object_boolean_true_add(json_neigh
,
8639 json_object_int_add(json_addr
, "orfRecvCounter",
8642 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
8643 PEER_STATUS_ORF_WAIT_REFRESH
))
8644 json_object_string_add(
8645 json_addr
, "orfFirstUpdate",
8646 "deferredUntilORFOrRouteRefreshRecvd");
8648 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8649 PEER_FLAG_REFLECTOR_CLIENT
))
8650 json_object_boolean_true_add(json_addr
,
8651 "routeReflectorClient");
8652 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8653 PEER_FLAG_RSERVER_CLIENT
))
8654 json_object_boolean_true_add(json_addr
,
8655 "routeServerClient");
8656 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
8657 json_object_boolean_true_add(json_addr
,
8658 "inboundSoftConfigPermit");
8660 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8661 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
))
8662 json_object_boolean_true_add(
8664 "privateAsNumsAllReplacedInUpdatesToNbr");
8665 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8666 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
))
8667 json_object_boolean_true_add(
8669 "privateAsNumsReplacedInUpdatesToNbr");
8670 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8671 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
))
8672 json_object_boolean_true_add(
8674 "privateAsNumsAllRemovedInUpdatesToNbr");
8675 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8676 PEER_FLAG_REMOVE_PRIVATE_AS
))
8677 json_object_boolean_true_add(
8679 "privateAsNumsRemovedInUpdatesToNbr");
8681 if (p
->addpath_type
[afi
][safi
] != BGP_ADDPATH_NONE
)
8682 json_object_boolean_true_add(
8684 bgp_addpath_names(p
->addpath_type
[afi
][safi
])
8687 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_AS_OVERRIDE
))
8688 json_object_string_add(json_addr
,
8689 "overrideASNsInOutboundUpdates",
8690 "ifAspathEqualRemoteAs");
8692 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_SELF
)
8693 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
8694 PEER_FLAG_FORCE_NEXTHOP_SELF
))
8695 json_object_boolean_true_add(json_addr
,
8696 "routerAlwaysNextHop");
8697 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8698 PEER_FLAG_AS_PATH_UNCHANGED
))
8699 json_object_boolean_true_add(
8700 json_addr
, "unchangedAsPathPropogatedToNbr");
8701 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8702 PEER_FLAG_NEXTHOP_UNCHANGED
))
8703 json_object_boolean_true_add(
8704 json_addr
, "unchangedNextHopPropogatedToNbr");
8705 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
8706 json_object_boolean_true_add(
8707 json_addr
, "unchangedMedPropogatedToNbr");
8708 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
)
8709 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
8710 PEER_FLAG_SEND_EXT_COMMUNITY
)) {
8711 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8712 PEER_FLAG_SEND_COMMUNITY
)
8713 && CHECK_FLAG(p
->af_flags
[afi
][safi
],
8714 PEER_FLAG_SEND_EXT_COMMUNITY
))
8715 json_object_string_add(json_addr
,
8716 "commAttriSentToNbr",
8717 "extendedAndStandard");
8718 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8719 PEER_FLAG_SEND_EXT_COMMUNITY
))
8720 json_object_string_add(json_addr
,
8721 "commAttriSentToNbr",
8724 json_object_string_add(json_addr
,
8725 "commAttriSentToNbr",
8728 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8729 PEER_FLAG_DEFAULT_ORIGINATE
)) {
8730 if (p
->default_rmap
[afi
][safi
].name
)
8731 json_object_string_add(
8732 json_addr
, "defaultRouteMap",
8733 p
->default_rmap
[afi
][safi
].name
);
8735 if (paf
&& PAF_SUBGRP(paf
)
8736 && CHECK_FLAG(PAF_SUBGRP(paf
)->sflags
,
8737 SUBGRP_STATUS_DEFAULT_ORIGINATE
))
8738 json_object_boolean_true_add(json_addr
,
8741 json_object_boolean_true_add(json_addr
,
8745 if (afi
== AFI_L2VPN
&& safi
== SAFI_EVPN
) {
8746 if (is_evpn_enabled())
8747 json_object_boolean_true_add(
8748 json_addr
, "advertiseAllVnis");
8751 if (filter
->plist
[FILTER_IN
].name
8752 || filter
->dlist
[FILTER_IN
].name
8753 || filter
->aslist
[FILTER_IN
].name
8754 || filter
->map
[RMAP_IN
].name
)
8755 json_object_boolean_true_add(json_addr
,
8756 "inboundPathPolicyConfig");
8757 if (filter
->plist
[FILTER_OUT
].name
8758 || filter
->dlist
[FILTER_OUT
].name
8759 || filter
->aslist
[FILTER_OUT
].name
8760 || filter
->map
[RMAP_OUT
].name
|| filter
->usmap
.name
)
8761 json_object_boolean_true_add(
8762 json_addr
, "outboundPathPolicyConfig");
8765 if (filter
->plist
[FILTER_IN
].name
)
8766 json_object_string_add(json_addr
,
8767 "incomingUpdatePrefixFilterList",
8768 filter
->plist
[FILTER_IN
].name
);
8769 if (filter
->plist
[FILTER_OUT
].name
)
8770 json_object_string_add(json_addr
,
8771 "outgoingUpdatePrefixFilterList",
8772 filter
->plist
[FILTER_OUT
].name
);
8774 /* distribute-list */
8775 if (filter
->dlist
[FILTER_IN
].name
)
8776 json_object_string_add(
8777 json_addr
, "incomingUpdateNetworkFilterList",
8778 filter
->dlist
[FILTER_IN
].name
);
8779 if (filter
->dlist
[FILTER_OUT
].name
)
8780 json_object_string_add(
8781 json_addr
, "outgoingUpdateNetworkFilterList",
8782 filter
->dlist
[FILTER_OUT
].name
);
8785 if (filter
->aslist
[FILTER_IN
].name
)
8786 json_object_string_add(json_addr
,
8787 "incomingUpdateAsPathFilterList",
8788 filter
->aslist
[FILTER_IN
].name
);
8789 if (filter
->aslist
[FILTER_OUT
].name
)
8790 json_object_string_add(json_addr
,
8791 "outgoingUpdateAsPathFilterList",
8792 filter
->aslist
[FILTER_OUT
].name
);
8795 if (filter
->map
[RMAP_IN
].name
)
8796 json_object_string_add(
8797 json_addr
, "routeMapForIncomingAdvertisements",
8798 filter
->map
[RMAP_IN
].name
);
8799 if (filter
->map
[RMAP_OUT
].name
)
8800 json_object_string_add(
8801 json_addr
, "routeMapForOutgoingAdvertisements",
8802 filter
->map
[RMAP_OUT
].name
);
8804 /* ebgp-requires-policy (inbound) */
8805 if (p
->bgp
->ebgp_requires_policy
== DEFAULT_EBGP_POLICY_ENABLED
8806 && !bgp_inbound_policy_exists(p
, filter
))
8807 json_object_string_add(
8808 json_addr
, "inboundEbgpRequiresPolicy",
8809 "Inbound updates discarded due to missing policy");
8811 /* ebgp-requires-policy (outbound) */
8812 if (p
->bgp
->ebgp_requires_policy
== DEFAULT_EBGP_POLICY_ENABLED
8813 && (!bgp_outbound_policy_exists(p
, filter
)))
8814 json_object_string_add(
8815 json_addr
, "outboundEbgpRequiresPolicy",
8816 "Outbound updates discarded due to missing policy");
8818 /* unsuppress-map */
8819 if (filter
->usmap
.name
)
8820 json_object_string_add(json_addr
,
8821 "selectiveUnsuppressRouteMap",
8822 filter
->usmap
.name
);
8824 /* Receive prefix count */
8825 json_object_int_add(json_addr
, "acceptedPrefixCounter",
8826 p
->pcount
[afi
][safi
]);
8827 if (paf
&& PAF_SUBGRP(paf
))
8828 json_object_int_add(json_addr
, "sentPrefixCounter",
8829 (PAF_SUBGRP(paf
))->scount
);
8831 /* Maximum prefix */
8832 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
)) {
8833 json_object_int_add(json_addr
, "prefixAllowedMax",
8834 p
->pmax
[afi
][safi
]);
8835 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8836 PEER_FLAG_MAX_PREFIX_WARNING
))
8837 json_object_boolean_true_add(
8838 json_addr
, "prefixAllowedMaxWarning");
8839 json_object_int_add(json_addr
,
8840 "prefixAllowedWarningThresh",
8841 p
->pmax_threshold
[afi
][safi
]);
8842 if (p
->pmax_restart
[afi
][safi
])
8843 json_object_int_add(
8845 "prefixAllowedRestartIntervalMsecs",
8846 p
->pmax_restart
[afi
][safi
] * 60000);
8848 json_object_object_add(json_neigh
, afi_safi_print(afi
, safi
),
8852 filter
= &p
->filter
[afi
][safi
];
8854 vty_out(vty
, " For address family: %s\n",
8855 afi_safi_print(afi
, safi
));
8857 if (peer_group_active(p
))
8858 vty_out(vty
, " %s peer-group member\n",
8861 paf
= peer_af_find(p
, afi
, safi
);
8862 if (paf
&& PAF_SUBGRP(paf
)) {
8863 vty_out(vty
, " Update group %" PRIu64
8864 ", subgroup %" PRIu64
"\n",
8865 PAF_UPDGRP(paf
)->id
, PAF_SUBGRP(paf
)->id
);
8866 vty_out(vty
, " Packet Queue length %d\n",
8867 bpacket_queue_virtual_length(paf
));
8869 vty_out(vty
, " Not part of any update group\n");
8871 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
8872 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8873 PEER_CAP_ORF_PREFIX_SM_RCV
)
8874 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8875 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
8876 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8877 PEER_CAP_ORF_PREFIX_RM_ADV
)
8878 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8879 PEER_CAP_ORF_PREFIX_RM_RCV
)
8880 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8881 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
))
8882 vty_out(vty
, " AF-dependant capabilities:\n");
8884 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
8885 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8886 PEER_CAP_ORF_PREFIX_SM_RCV
)
8887 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8888 PEER_CAP_ORF_PREFIX_RM_ADV
)
8889 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8890 PEER_CAP_ORF_PREFIX_RM_RCV
)) {
8892 " Outbound Route Filter (ORF) type (%d) Prefix-list:\n",
8894 bgp_show_peer_afi_orf_cap(
8895 vty
, p
, afi
, safi
, PEER_CAP_ORF_PREFIX_SM_ADV
,
8896 PEER_CAP_ORF_PREFIX_RM_ADV
,
8897 PEER_CAP_ORF_PREFIX_SM_RCV
,
8898 PEER_CAP_ORF_PREFIX_RM_RCV
, use_json
, NULL
);
8900 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
8901 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8902 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
8903 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8904 PEER_CAP_ORF_PREFIX_RM_ADV
)
8905 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8906 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
)) {
8908 " Outbound Route Filter (ORF) type (%d) Prefix-list:\n",
8909 ORF_TYPE_PREFIX_OLD
);
8910 bgp_show_peer_afi_orf_cap(
8911 vty
, p
, afi
, safi
, PEER_CAP_ORF_PREFIX_SM_ADV
,
8912 PEER_CAP_ORF_PREFIX_RM_ADV
,
8913 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
,
8914 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
, use_json
, NULL
);
8917 sprintf(orf_pfx_name
, "%s.%d.%d", p
->host
, afi
, safi
);
8918 orf_pfx_count
= prefix_bgp_show_prefix_list(
8919 NULL
, afi
, orf_pfx_name
, use_json
);
8921 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
8922 PEER_STATUS_ORF_PREFIX_SEND
)
8924 vty_out(vty
, " Outbound Route Filter (ORF):");
8925 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
8926 PEER_STATUS_ORF_PREFIX_SEND
))
8927 vty_out(vty
, " sent;");
8929 vty_out(vty
, " received (%d entries)",
8933 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
8934 PEER_STATUS_ORF_WAIT_REFRESH
))
8936 " First update is deferred until ORF or ROUTE-REFRESH is received\n");
8938 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8939 PEER_FLAG_REFLECTOR_CLIENT
))
8940 vty_out(vty
, " Route-Reflector Client\n");
8941 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8942 PEER_FLAG_RSERVER_CLIENT
))
8943 vty_out(vty
, " Route-Server Client\n");
8944 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
8946 " Inbound soft reconfiguration allowed\n");
8948 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8949 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
))
8951 " Private AS numbers (all) replaced in updates to this neighbor\n");
8952 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8953 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
))
8955 " Private AS numbers replaced in updates to this neighbor\n");
8956 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8957 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
))
8959 " Private AS numbers (all) removed in updates to this neighbor\n");
8960 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8961 PEER_FLAG_REMOVE_PRIVATE_AS
))
8963 " Private AS numbers removed in updates to this neighbor\n");
8965 if (p
->addpath_type
[afi
][safi
] != BGP_ADDPATH_NONE
)
8966 vty_out(vty
, " %s\n",
8967 bgp_addpath_names(p
->addpath_type
[afi
][safi
])
8968 ->human_description
);
8970 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_AS_OVERRIDE
))
8972 " Override ASNs in outbound updates if aspath equals remote-as\n");
8974 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_SELF
)
8975 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
8976 PEER_FLAG_FORCE_NEXTHOP_SELF
))
8977 vty_out(vty
, " NEXT_HOP is always this router\n");
8978 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8979 PEER_FLAG_AS_PATH_UNCHANGED
))
8981 " AS_PATH is propagated unchanged to this neighbor\n");
8982 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8983 PEER_FLAG_NEXTHOP_UNCHANGED
))
8985 " NEXT_HOP is propagated unchanged to this neighbor\n");
8986 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
8988 " MED is propagated unchanged to this neighbor\n");
8989 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
)
8990 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
8991 PEER_FLAG_SEND_EXT_COMMUNITY
)
8992 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
8993 PEER_FLAG_SEND_LARGE_COMMUNITY
)) {
8995 " Community attribute sent to this neighbor");
8996 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8997 PEER_FLAG_SEND_COMMUNITY
)
8998 && CHECK_FLAG(p
->af_flags
[afi
][safi
],
8999 PEER_FLAG_SEND_EXT_COMMUNITY
)
9000 && CHECK_FLAG(p
->af_flags
[afi
][safi
],
9001 PEER_FLAG_SEND_LARGE_COMMUNITY
))
9002 vty_out(vty
, "(all)\n");
9003 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9004 PEER_FLAG_SEND_LARGE_COMMUNITY
))
9005 vty_out(vty
, "(large)\n");
9006 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9007 PEER_FLAG_SEND_EXT_COMMUNITY
))
9008 vty_out(vty
, "(extended)\n");
9010 vty_out(vty
, "(standard)\n");
9012 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9013 PEER_FLAG_DEFAULT_ORIGINATE
)) {
9014 vty_out(vty
, " Default information originate,");
9016 if (p
->default_rmap
[afi
][safi
].name
)
9017 vty_out(vty
, " default route-map %s%s,",
9018 p
->default_rmap
[afi
][safi
].map
? "*"
9020 p
->default_rmap
[afi
][safi
].name
);
9021 if (paf
&& PAF_SUBGRP(paf
)
9022 && CHECK_FLAG(PAF_SUBGRP(paf
)->sflags
,
9023 SUBGRP_STATUS_DEFAULT_ORIGINATE
))
9024 vty_out(vty
, " default sent\n");
9026 vty_out(vty
, " default not sent\n");
9029 /* advertise-vni-all */
9030 if (afi
== AFI_L2VPN
&& safi
== SAFI_EVPN
) {
9031 if (is_evpn_enabled())
9032 vty_out(vty
, " advertise-all-vni\n");
9035 if (filter
->plist
[FILTER_IN
].name
9036 || filter
->dlist
[FILTER_IN
].name
9037 || filter
->aslist
[FILTER_IN
].name
9038 || filter
->map
[RMAP_IN
].name
)
9039 vty_out(vty
, " Inbound path policy configured\n");
9040 if (filter
->plist
[FILTER_OUT
].name
9041 || filter
->dlist
[FILTER_OUT
].name
9042 || filter
->aslist
[FILTER_OUT
].name
9043 || filter
->map
[RMAP_OUT
].name
|| filter
->usmap
.name
)
9044 vty_out(vty
, " Outbound path policy configured\n");
9047 if (filter
->plist
[FILTER_IN
].name
)
9049 " Incoming update prefix filter list is %s%s\n",
9050 filter
->plist
[FILTER_IN
].plist
? "*" : "",
9051 filter
->plist
[FILTER_IN
].name
);
9052 if (filter
->plist
[FILTER_OUT
].name
)
9054 " Outgoing update prefix filter list is %s%s\n",
9055 filter
->plist
[FILTER_OUT
].plist
? "*" : "",
9056 filter
->plist
[FILTER_OUT
].name
);
9058 /* distribute-list */
9059 if (filter
->dlist
[FILTER_IN
].name
)
9061 " Incoming update network filter list is %s%s\n",
9062 filter
->dlist
[FILTER_IN
].alist
? "*" : "",
9063 filter
->dlist
[FILTER_IN
].name
);
9064 if (filter
->dlist
[FILTER_OUT
].name
)
9066 " Outgoing update network filter list is %s%s\n",
9067 filter
->dlist
[FILTER_OUT
].alist
? "*" : "",
9068 filter
->dlist
[FILTER_OUT
].name
);
9071 if (filter
->aslist
[FILTER_IN
].name
)
9073 " Incoming update AS path filter list is %s%s\n",
9074 filter
->aslist
[FILTER_IN
].aslist
? "*" : "",
9075 filter
->aslist
[FILTER_IN
].name
);
9076 if (filter
->aslist
[FILTER_OUT
].name
)
9078 " Outgoing update AS path filter list is %s%s\n",
9079 filter
->aslist
[FILTER_OUT
].aslist
? "*" : "",
9080 filter
->aslist
[FILTER_OUT
].name
);
9083 if (filter
->map
[RMAP_IN
].name
)
9085 " Route map for incoming advertisements is %s%s\n",
9086 filter
->map
[RMAP_IN
].map
? "*" : "",
9087 filter
->map
[RMAP_IN
].name
);
9088 if (filter
->map
[RMAP_OUT
].name
)
9090 " Route map for outgoing advertisements is %s%s\n",
9091 filter
->map
[RMAP_OUT
].map
? "*" : "",
9092 filter
->map
[RMAP_OUT
].name
);
9094 /* ebgp-requires-policy (inbound) */
9095 if (p
->bgp
->ebgp_requires_policy
== DEFAULT_EBGP_POLICY_ENABLED
9096 && !bgp_inbound_policy_exists(p
, filter
))
9098 " Inbound updates discarded due to missing policy\n");
9100 /* ebgp-requires-policy (outbound) */
9101 if (p
->bgp
->ebgp_requires_policy
== DEFAULT_EBGP_POLICY_ENABLED
9102 && !bgp_outbound_policy_exists(p
, filter
))
9104 " Outbound updates discarded due to missing policy\n");
9106 /* unsuppress-map */
9107 if (filter
->usmap
.name
)
9109 " Route map for selective unsuppress is %s%s\n",
9110 filter
->usmap
.map
? "*" : "",
9111 filter
->usmap
.name
);
9113 /* Receive prefix count */
9114 vty_out(vty
, " %ld accepted prefixes\n", p
->pcount
[afi
][safi
]);
9116 /* Maximum prefix */
9117 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
)) {
9118 vty_out(vty
, " Maximum prefixes allowed %ld%s\n",
9120 CHECK_FLAG(p
->af_flags
[afi
][safi
],
9121 PEER_FLAG_MAX_PREFIX_WARNING
)
9124 vty_out(vty
, " Threshold for warning message %d%%",
9125 p
->pmax_threshold
[afi
][safi
]);
9126 if (p
->pmax_restart
[afi
][safi
])
9127 vty_out(vty
, ", restart interval %d min",
9128 p
->pmax_restart
[afi
][safi
]);
9136 static void bgp_show_peer(struct vty
*vty
, struct peer
*p
, bool use_json
,
9140 char buf1
[PREFIX2STR_BUFFER
], buf
[SU_ADDRSTRLEN
];
9141 char timebuf
[BGP_UPTIME_LEN
];
9143 const char *subcode_str
;
9144 const char *code_str
;
9149 json_object
*json_neigh
= NULL
;
9155 json_neigh
= json_object_new_object();
9157 memset(dn_flag
, '\0', sizeof(dn_flag
));
9158 if (!p
->conf_if
&& peer_dynamic_neighbor(p
))
9162 if (p
->conf_if
) /* Configured interface name. */
9163 vty_out(vty
, "BGP neighbor on %s: %s, ", p
->conf_if
,
9164 BGP_PEER_SU_UNSPEC(p
)
9166 : sockunion2str(&p
->su
, buf
,
9168 else /* Configured IP address. */
9169 vty_out(vty
, "BGP neighbor is %s%s, ", dn_flag
,
9174 if (p
->conf_if
&& BGP_PEER_SU_UNSPEC(p
))
9175 json_object_string_add(json_neigh
, "bgpNeighborAddr",
9177 else if (p
->conf_if
&& !BGP_PEER_SU_UNSPEC(p
))
9178 json_object_string_add(
9179 json_neigh
, "bgpNeighborAddr",
9180 sockunion2str(&p
->su
, buf
, SU_ADDRSTRLEN
));
9182 json_object_int_add(json_neigh
, "remoteAs", p
->as
);
9184 if (p
->change_local_as
)
9185 json_object_int_add(json_neigh
, "localAs",
9186 p
->change_local_as
);
9188 json_object_int_add(json_neigh
, "localAs", p
->local_as
);
9190 if (CHECK_FLAG(p
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
))
9191 json_object_boolean_true_add(json_neigh
,
9192 "localAsNoPrepend");
9194 if (CHECK_FLAG(p
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
))
9195 json_object_boolean_true_add(json_neigh
,
9196 "localAsReplaceAs");
9198 if ((p
->as_type
== AS_SPECIFIED
) || (p
->as_type
== AS_EXTERNAL
)
9199 || (p
->as_type
== AS_INTERNAL
))
9200 vty_out(vty
, "remote AS %u, ", p
->as
);
9202 vty_out(vty
, "remote AS Unspecified, ");
9203 vty_out(vty
, "local AS %u%s%s, ",
9204 p
->change_local_as
? p
->change_local_as
: p
->local_as
,
9205 CHECK_FLAG(p
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
)
9208 CHECK_FLAG(p
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
)
9212 /* peer type internal or confed-internal */
9213 if ((p
->as
== p
->local_as
) || (p
->as_type
== AS_INTERNAL
)) {
9215 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
))
9216 json_object_boolean_true_add(
9217 json_neigh
, "nbrConfedInternalLink");
9219 json_object_boolean_true_add(json_neigh
,
9222 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
))
9223 vty_out(vty
, "confed-internal link\n");
9225 vty_out(vty
, "internal link\n");
9227 /* peer type external or confed-external */
9228 } else if (p
->as
|| (p
->as_type
== AS_EXTERNAL
)) {
9230 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
))
9231 json_object_boolean_true_add(
9232 json_neigh
, "nbrConfedExternalLink");
9234 json_object_boolean_true_add(json_neigh
,
9237 if (bgp_confederation_peers_check(bgp
, p
->as
))
9238 vty_out(vty
, "confed-external link\n");
9240 vty_out(vty
, "external link\n");
9244 json_object_boolean_true_add(json_neigh
,
9245 "nbrUnspecifiedLink");
9247 vty_out(vty
, "unspecified link\n");
9253 json_object_string_add(json_neigh
, "nbrDesc", p
->desc
);
9255 vty_out(vty
, " Description: %s\n", p
->desc
);
9261 json_object_string_add(json_neigh
, "hostname",
9265 json_object_string_add(json_neigh
, "domainname",
9268 if (p
->domainname
&& (p
->domainname
[0] != '\0'))
9269 vty_out(vty
, "Hostname: %s.%s\n", p
->hostname
,
9272 vty_out(vty
, "Hostname: %s\n", p
->hostname
);
9279 json_object_string_add(json_neigh
, "peerGroup",
9283 struct prefix prefix
, *range
= NULL
;
9285 sockunion2hostprefix(&(p
->su
), &prefix
);
9286 range
= peer_group_lookup_dynamic_neighbor_range(
9290 prefix2str(range
, buf1
, sizeof(buf1
));
9291 json_object_string_add(
9293 "peerSubnetRangeGroup", buf1
);
9298 " Member of peer-group %s for session parameters\n",
9302 struct prefix prefix
, *range
= NULL
;
9304 sockunion2hostprefix(&(p
->su
), &prefix
);
9305 range
= peer_group_lookup_dynamic_neighbor_range(
9309 prefix2str(range
, buf1
, sizeof(buf1
));
9311 " Belongs to the subnet range group: %s\n",
9319 /* Administrative shutdown. */
9320 if (CHECK_FLAG(p
->flags
, PEER_FLAG_SHUTDOWN
))
9321 json_object_boolean_true_add(json_neigh
,
9325 json_object_int_add(json_neigh
, "bgpVersion", 4);
9326 json_object_string_add(
9327 json_neigh
, "remoteRouterId",
9328 inet_ntop(AF_INET
, &p
->remote_id
, buf1
, sizeof(buf1
)));
9329 json_object_string_add(
9330 json_neigh
, "localRouterId",
9331 inet_ntop(AF_INET
, &bgp
->router_id
, buf1
,
9335 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
)
9336 && bgp_confederation_peers_check(bgp
, p
->as
))
9337 json_object_boolean_true_add(json_neigh
,
9341 json_object_string_add(
9342 json_neigh
, "bgpState",
9343 lookup_msg(bgp_status_msg
, p
->status
, NULL
));
9345 if (p
->status
== Established
) {
9348 uptime
= bgp_clock();
9349 uptime
-= p
->uptime
;
9350 epoch_tbuf
= time(NULL
) - uptime
;
9352 #if CONFDATE > 20200101
9354 "bgpTimerUp should be deprecated and can be removed now");
9357 * bgpTimerUp was miliseconds that was accurate
9358 * up to 1 day, then the value returned
9359 * became garbage. So in order to provide
9360 * some level of backwards compatability,
9361 * we still provde the data, but now
9362 * we are returning the correct value
9363 * and also adding a new bgpTimerUpMsec
9364 * which will allow us to deprecate
9367 json_object_int_add(json_neigh
, "bgpTimerUp",
9369 json_object_int_add(json_neigh
, "bgpTimerUpMsec",
9371 json_object_string_add(json_neigh
, "bgpTimerUpString",
9372 peer_uptime(p
->uptime
, timebuf
,
9375 json_object_int_add(json_neigh
,
9376 "bgpTimerUpEstablishedEpoch",
9380 else if (p
->status
== Active
) {
9381 if (CHECK_FLAG(p
->flags
, PEER_FLAG_PASSIVE
))
9382 json_object_string_add(json_neigh
, "bgpStateIs",
9384 else if (CHECK_FLAG(p
->sflags
, PEER_STATUS_NSF_WAIT
))
9385 json_object_string_add(json_neigh
, "bgpStateIs",
9393 uptime
= bgp_clock();
9394 uptime
-= p
->readtime
;
9395 tm
= gmtime(&uptime
);
9396 json_object_int_add(json_neigh
, "bgpTimerLastRead",
9397 (tm
->tm_sec
* 1000) + (tm
->tm_min
* 60000)
9398 + (tm
->tm_hour
* 3600000));
9400 uptime
= bgp_clock();
9401 uptime
-= p
->last_write
;
9402 tm
= gmtime(&uptime
);
9403 json_object_int_add(json_neigh
, "bgpTimerLastWrite",
9404 (tm
->tm_sec
* 1000) + (tm
->tm_min
* 60000)
9405 + (tm
->tm_hour
* 3600000));
9407 uptime
= bgp_clock();
9408 uptime
-= p
->update_time
;
9409 tm
= gmtime(&uptime
);
9410 json_object_int_add(json_neigh
, "bgpInUpdateElapsedTimeMsecs",
9411 (tm
->tm_sec
* 1000) + (tm
->tm_min
* 60000)
9412 + (tm
->tm_hour
* 3600000));
9414 /* Configured timer values. */
9415 json_object_int_add(json_neigh
, "bgpTimerHoldTimeMsecs",
9416 p
->v_holdtime
* 1000);
9417 json_object_int_add(json_neigh
,
9418 "bgpTimerKeepAliveIntervalMsecs",
9419 p
->v_keepalive
* 1000);
9420 if (CHECK_FLAG(p
->flags
, PEER_FLAG_TIMER
)) {
9421 json_object_int_add(json_neigh
,
9422 "bgpTimerConfiguredHoldTimeMsecs",
9423 p
->holdtime
* 1000);
9424 json_object_int_add(
9426 "bgpTimerConfiguredKeepAliveIntervalMsecs",
9427 p
->keepalive
* 1000);
9428 } else if ((bgp
->default_holdtime
!= BGP_DEFAULT_HOLDTIME
)
9429 || (bgp
->default_keepalive
9430 != BGP_DEFAULT_KEEPALIVE
)) {
9431 json_object_int_add(json_neigh
,
9432 "bgpTimerConfiguredHoldTimeMsecs",
9433 bgp
->default_holdtime
);
9434 json_object_int_add(
9436 "bgpTimerConfiguredKeepAliveIntervalMsecs",
9437 bgp
->default_keepalive
);
9440 /* Administrative shutdown. */
9441 if (CHECK_FLAG(p
->flags
, PEER_FLAG_SHUTDOWN
))
9442 vty_out(vty
, " Administratively shut down\n");
9445 vty_out(vty
, " BGP version 4");
9446 vty_out(vty
, ", remote router ID %s",
9447 inet_ntop(AF_INET
, &p
->remote_id
, buf1
, sizeof(buf1
)));
9448 vty_out(vty
, ", local router ID %s\n",
9449 inet_ntop(AF_INET
, &bgp
->router_id
, buf1
,
9453 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
)
9454 && bgp_confederation_peers_check(bgp
, p
->as
))
9456 " Neighbor under common administration\n");
9459 vty_out(vty
, " BGP state = %s",
9460 lookup_msg(bgp_status_msg
, p
->status
, NULL
));
9462 if (p
->status
== Established
)
9463 vty_out(vty
, ", up for %8s",
9464 peer_uptime(p
->uptime
, timebuf
, BGP_UPTIME_LEN
,
9467 else if (p
->status
== Active
) {
9468 if (CHECK_FLAG(p
->flags
, PEER_FLAG_PASSIVE
))
9469 vty_out(vty
, " (passive)");
9470 else if (CHECK_FLAG(p
->sflags
, PEER_STATUS_NSF_WAIT
))
9471 vty_out(vty
, " (NSF passive)");
9476 vty_out(vty
, " Last read %s",
9477 peer_uptime(p
->readtime
, timebuf
, BGP_UPTIME_LEN
, 0,
9479 vty_out(vty
, ", Last write %s\n",
9480 peer_uptime(p
->last_write
, timebuf
, BGP_UPTIME_LEN
, 0,
9483 /* Configured timer values. */
9485 " Hold time is %d, keepalive interval is %d seconds\n",
9486 p
->v_holdtime
, p
->v_keepalive
);
9487 if (CHECK_FLAG(p
->flags
, PEER_FLAG_TIMER
)) {
9488 vty_out(vty
, " Configured hold time is %d",
9490 vty_out(vty
, ", keepalive interval is %d seconds\n",
9492 } else if ((bgp
->default_holdtime
!= BGP_DEFAULT_HOLDTIME
)
9493 || (bgp
->default_keepalive
9494 != BGP_DEFAULT_KEEPALIVE
)) {
9495 vty_out(vty
, " Configured hold time is %d",
9496 bgp
->default_holdtime
);
9497 vty_out(vty
, ", keepalive interval is %d seconds\n",
9498 bgp
->default_keepalive
);
9502 if (p
->status
== Established
) {
9503 if (p
->cap
|| p
->afc_adv
[AFI_IP
][SAFI_UNICAST
]
9504 || p
->afc_recv
[AFI_IP
][SAFI_UNICAST
]
9505 || p
->afc_adv
[AFI_IP
][SAFI_MULTICAST
]
9506 || p
->afc_recv
[AFI_IP
][SAFI_MULTICAST
]
9507 || p
->afc_adv
[AFI_IP6
][SAFI_UNICAST
]
9508 || p
->afc_recv
[AFI_IP6
][SAFI_UNICAST
]
9509 || p
->afc_adv
[AFI_IP6
][SAFI_MULTICAST
]
9510 || p
->afc_recv
[AFI_IP6
][SAFI_MULTICAST
]
9511 || p
->afc_adv
[AFI_IP6
][SAFI_MPLS_VPN
]
9512 || p
->afc_recv
[AFI_IP6
][SAFI_MPLS_VPN
]
9513 || p
->afc_adv
[AFI_IP6
][SAFI_ENCAP
]
9514 || p
->afc_recv
[AFI_IP6
][SAFI_ENCAP
]
9515 || p
->afc_adv
[AFI_IP6
][SAFI_FLOWSPEC
]
9516 || p
->afc_recv
[AFI_IP6
][SAFI_FLOWSPEC
]
9517 || p
->afc_adv
[AFI_IP
][SAFI_ENCAP
]
9518 || p
->afc_recv
[AFI_IP
][SAFI_ENCAP
]
9519 || p
->afc_adv
[AFI_IP
][SAFI_FLOWSPEC
]
9520 || p
->afc_recv
[AFI_IP
][SAFI_FLOWSPEC
]
9521 || p
->afc_adv
[AFI_IP
][SAFI_MPLS_VPN
]
9522 || p
->afc_recv
[AFI_IP
][SAFI_MPLS_VPN
]) {
9524 json_object
*json_cap
= NULL
;
9526 json_cap
= json_object_new_object();
9529 if (CHECK_FLAG(p
->cap
, PEER_CAP_AS4_RCV
)
9530 || CHECK_FLAG(p
->cap
, PEER_CAP_AS4_ADV
)) {
9531 if (CHECK_FLAG(p
->cap
, PEER_CAP_AS4_ADV
)
9532 && CHECK_FLAG(p
->cap
,
9534 json_object_string_add(
9535 json_cap
, "4byteAs",
9536 "advertisedAndReceived");
9537 else if (CHECK_FLAG(p
->cap
,
9539 json_object_string_add(
9540 json_cap
, "4byteAs",
9542 else if (CHECK_FLAG(p
->cap
,
9544 json_object_string_add(
9545 json_cap
, "4byteAs",
9550 if (CHECK_FLAG(p
->cap
, PEER_CAP_ADDPATH_RCV
)
9551 || CHECK_FLAG(p
->cap
,
9552 PEER_CAP_ADDPATH_ADV
)) {
9553 json_object
*json_add
= NULL
;
9554 const char *print_store
;
9556 json_add
= json_object_new_object();
9558 FOREACH_AFI_SAFI (afi
, safi
) {
9559 json_object
*json_sub
= NULL
;
9561 json_object_new_object();
9562 print_store
= afi_safi_print(
9568 PEER_CAP_ADDPATH_AF_TX_ADV
)
9572 PEER_CAP_ADDPATH_AF_TX_RCV
)) {
9577 PEER_CAP_ADDPATH_AF_TX_ADV
)
9582 PEER_CAP_ADDPATH_AF_TX_RCV
))
9583 json_object_boolean_true_add(
9585 "txAdvertisedAndReceived");
9591 PEER_CAP_ADDPATH_AF_TX_ADV
))
9592 json_object_boolean_true_add(
9600 PEER_CAP_ADDPATH_AF_TX_RCV
))
9601 json_object_boolean_true_add(
9609 PEER_CAP_ADDPATH_AF_RX_ADV
)
9613 PEER_CAP_ADDPATH_AF_RX_RCV
)) {
9618 PEER_CAP_ADDPATH_AF_RX_ADV
)
9623 PEER_CAP_ADDPATH_AF_RX_RCV
))
9624 json_object_boolean_true_add(
9626 "rxAdvertisedAndReceived");
9632 PEER_CAP_ADDPATH_AF_RX_ADV
))
9633 json_object_boolean_true_add(
9641 PEER_CAP_ADDPATH_AF_RX_RCV
))
9642 json_object_boolean_true_add(
9650 PEER_CAP_ADDPATH_AF_TX_ADV
)
9654 PEER_CAP_ADDPATH_AF_TX_RCV
)
9658 PEER_CAP_ADDPATH_AF_RX_ADV
)
9662 PEER_CAP_ADDPATH_AF_RX_RCV
))
9663 json_object_object_add(
9672 json_object_object_add(
9673 json_cap
, "addPath", json_add
);
9677 if (CHECK_FLAG(p
->cap
, PEER_CAP_DYNAMIC_RCV
)
9678 || CHECK_FLAG(p
->cap
,
9679 PEER_CAP_DYNAMIC_ADV
)) {
9680 if (CHECK_FLAG(p
->cap
,
9681 PEER_CAP_DYNAMIC_ADV
)
9682 && CHECK_FLAG(p
->cap
,
9683 PEER_CAP_DYNAMIC_RCV
))
9684 json_object_string_add(
9685 json_cap
, "dynamic",
9686 "advertisedAndReceived");
9687 else if (CHECK_FLAG(
9689 PEER_CAP_DYNAMIC_ADV
))
9690 json_object_string_add(
9691 json_cap
, "dynamic",
9693 else if (CHECK_FLAG(
9695 PEER_CAP_DYNAMIC_RCV
))
9696 json_object_string_add(
9697 json_cap
, "dynamic",
9701 /* Extended nexthop */
9702 if (CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_RCV
)
9703 || CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_ADV
)) {
9704 json_object
*json_nxt
= NULL
;
9705 const char *print_store
;
9708 if (CHECK_FLAG(p
->cap
,
9710 && CHECK_FLAG(p
->cap
,
9712 json_object_string_add(
9715 "advertisedAndReceived");
9716 else if (CHECK_FLAG(p
->cap
,
9718 json_object_string_add(
9722 else if (CHECK_FLAG(p
->cap
,
9724 json_object_string_add(
9729 if (CHECK_FLAG(p
->cap
,
9730 PEER_CAP_ENHE_RCV
)) {
9732 json_object_new_object();
9734 for (safi
= SAFI_UNICAST
;
9735 safi
< SAFI_MAX
; safi
++) {
9740 PEER_CAP_ENHE_AF_RCV
)) {
9741 print_store
= afi_safi_print(
9744 json_object_string_add(
9747 "recieved"); /* misspelled for compatibility */
9750 json_object_object_add(
9752 "extendedNexthopFamililesByPeer",
9758 if (CHECK_FLAG(p
->cap
, PEER_CAP_REFRESH_ADV
)
9759 || CHECK_FLAG(p
->cap
,
9760 PEER_CAP_REFRESH_NEW_RCV
)
9761 || CHECK_FLAG(p
->cap
,
9762 PEER_CAP_REFRESH_OLD_RCV
)) {
9763 if (CHECK_FLAG(p
->cap
,
9764 PEER_CAP_REFRESH_ADV
)
9767 PEER_CAP_REFRESH_NEW_RCV
)
9770 PEER_CAP_REFRESH_OLD_RCV
))) {
9773 PEER_CAP_REFRESH_OLD_RCV
)
9776 PEER_CAP_REFRESH_NEW_RCV
))
9777 json_object_string_add(
9780 "advertisedAndReceivedOldNew");
9784 PEER_CAP_REFRESH_OLD_RCV
))
9785 json_object_string_add(
9788 "advertisedAndReceivedOld");
9790 json_object_string_add(
9793 "advertisedAndReceivedNew");
9798 PEER_CAP_REFRESH_ADV
))
9799 json_object_string_add(
9806 PEER_CAP_REFRESH_NEW_RCV
)
9809 PEER_CAP_REFRESH_OLD_RCV
))
9810 json_object_string_add(
9816 /* Multiprotocol Extensions */
9817 json_object
*json_multi
= NULL
;
9818 json_multi
= json_object_new_object();
9820 FOREACH_AFI_SAFI (afi
, safi
) {
9821 if (p
->afc_adv
[afi
][safi
]
9822 || p
->afc_recv
[afi
][safi
]) {
9823 json_object
*json_exten
= NULL
;
9825 json_object_new_object();
9827 if (p
->afc_adv
[afi
][safi
]
9828 && p
->afc_recv
[afi
][safi
])
9829 json_object_boolean_true_add(
9831 "advertisedAndReceived");
9832 else if (p
->afc_adv
[afi
][safi
])
9833 json_object_boolean_true_add(
9836 else if (p
->afc_recv
[afi
][safi
])
9837 json_object_boolean_true_add(
9841 json_object_object_add(
9848 json_object_object_add(
9849 json_cap
, "multiprotocolExtensions",
9852 /* Hostname capabilities */
9853 json_object
*json_hname
= NULL
;
9855 json_hname
= json_object_new_object();
9857 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_ADV
)) {
9858 json_object_string_add(
9859 json_hname
, "advHostName",
9860 bgp
->peer_self
->hostname
9864 json_object_string_add(
9865 json_hname
, "advDomainName",
9866 bgp
->peer_self
->domainname
9873 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_RCV
)) {
9874 json_object_string_add(
9875 json_hname
, "rcvHostName",
9876 p
->hostname
? p
->hostname
9878 json_object_string_add(
9879 json_hname
, "rcvDomainName",
9880 p
->domainname
? p
->domainname
9884 json_object_object_add(json_cap
, "hostName",
9887 /* Gracefull Restart */
9888 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
)
9889 || CHECK_FLAG(p
->cap
,
9890 PEER_CAP_RESTART_ADV
)) {
9891 if (CHECK_FLAG(p
->cap
,
9892 PEER_CAP_RESTART_ADV
)
9893 && CHECK_FLAG(p
->cap
,
9894 PEER_CAP_RESTART_RCV
))
9895 json_object_string_add(
9898 "advertisedAndReceived");
9899 else if (CHECK_FLAG(
9901 PEER_CAP_RESTART_ADV
))
9902 json_object_string_add(
9904 "gracefulRestartCapability",
9906 else if (CHECK_FLAG(
9908 PEER_CAP_RESTART_RCV
))
9909 json_object_string_add(
9911 "gracefulRestartCapability",
9914 if (CHECK_FLAG(p
->cap
,
9915 PEER_CAP_RESTART_RCV
)) {
9916 int restart_af_count
= 0;
9917 json_object
*json_restart
=
9920 json_object_new_object();
9922 json_object_int_add(
9924 "gracefulRestartRemoteTimerMsecs",
9925 p
->v_gr_restart
* 1000);
9927 FOREACH_AFI_SAFI (afi
, safi
) {
9932 PEER_CAP_RESTART_AF_RCV
)) {
9937 json_object_new_object();
9943 PEER_CAP_RESTART_AF_PRESERVE_RCV
))
9944 json_object_boolean_true_add(
9948 json_object_object_add(
9956 if (!restart_af_count
) {
9957 json_object_string_add(
9959 "addressFamiliesByPeer",
9964 json_object_object_add(
9966 "addressFamiliesByPeer",
9970 json_object_object_add(json_neigh
,
9971 "neighborCapabilities",
9974 vty_out(vty
, " Neighbor capabilities:\n");
9977 if (CHECK_FLAG(p
->cap
, PEER_CAP_AS4_RCV
)
9978 || CHECK_FLAG(p
->cap
, PEER_CAP_AS4_ADV
)) {
9979 vty_out(vty
, " 4 Byte AS:");
9980 if (CHECK_FLAG(p
->cap
,
9982 vty_out(vty
, " advertised");
9983 if (CHECK_FLAG(p
->cap
,
9985 vty_out(vty
, " %sreceived",
9995 if (CHECK_FLAG(p
->cap
, PEER_CAP_ADDPATH_RCV
)
9996 || CHECK_FLAG(p
->cap
,
9997 PEER_CAP_ADDPATH_ADV
)) {
9998 vty_out(vty
, " AddPath:\n");
10000 FOREACH_AFI_SAFI (afi
, safi
) {
10004 PEER_CAP_ADDPATH_AF_TX_ADV
)
10008 PEER_CAP_ADDPATH_AF_TX_RCV
)) {
10019 PEER_CAP_ADDPATH_AF_TX_ADV
))
10030 PEER_CAP_ADDPATH_AF_TX_RCV
))
10037 PEER_CAP_ADDPATH_AF_TX_ADV
)
10041 vty_out(vty
, "\n");
10047 PEER_CAP_ADDPATH_AF_RX_ADV
)
10051 PEER_CAP_ADDPATH_AF_RX_RCV
)) {
10062 PEER_CAP_ADDPATH_AF_RX_ADV
))
10073 PEER_CAP_ADDPATH_AF_RX_RCV
))
10080 PEER_CAP_ADDPATH_AF_RX_ADV
)
10084 vty_out(vty
, "\n");
10090 if (CHECK_FLAG(p
->cap
, PEER_CAP_DYNAMIC_RCV
)
10091 || CHECK_FLAG(p
->cap
,
10092 PEER_CAP_DYNAMIC_ADV
)) {
10093 vty_out(vty
, " Dynamic:");
10094 if (CHECK_FLAG(p
->cap
,
10095 PEER_CAP_DYNAMIC_ADV
))
10096 vty_out(vty
, " advertised");
10097 if (CHECK_FLAG(p
->cap
,
10098 PEER_CAP_DYNAMIC_RCV
))
10099 vty_out(vty
, " %sreceived",
10102 PEER_CAP_DYNAMIC_ADV
)
10105 vty_out(vty
, "\n");
10108 /* Extended nexthop */
10109 if (CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_RCV
)
10110 || CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_ADV
)) {
10111 vty_out(vty
, " Extended nexthop:");
10112 if (CHECK_FLAG(p
->cap
,
10113 PEER_CAP_ENHE_ADV
))
10114 vty_out(vty
, " advertised");
10115 if (CHECK_FLAG(p
->cap
,
10116 PEER_CAP_ENHE_RCV
))
10117 vty_out(vty
, " %sreceived",
10123 vty_out(vty
, "\n");
10125 if (CHECK_FLAG(p
->cap
,
10126 PEER_CAP_ENHE_RCV
)) {
10128 " Address families by peer:\n ");
10129 for (safi
= SAFI_UNICAST
;
10130 safi
< SAFI_MAX
; safi
++)
10135 PEER_CAP_ENHE_AF_RCV
))
10144 /* Route Refresh */
10145 if (CHECK_FLAG(p
->cap
, PEER_CAP_REFRESH_ADV
)
10146 || CHECK_FLAG(p
->cap
,
10147 PEER_CAP_REFRESH_NEW_RCV
)
10148 || CHECK_FLAG(p
->cap
,
10149 PEER_CAP_REFRESH_OLD_RCV
)) {
10150 vty_out(vty
, " Route refresh:");
10151 if (CHECK_FLAG(p
->cap
,
10152 PEER_CAP_REFRESH_ADV
))
10153 vty_out(vty
, " advertised");
10154 if (CHECK_FLAG(p
->cap
,
10155 PEER_CAP_REFRESH_NEW_RCV
)
10158 PEER_CAP_REFRESH_OLD_RCV
))
10159 vty_out(vty
, " %sreceived(%s)",
10162 PEER_CAP_REFRESH_ADV
)
10167 PEER_CAP_REFRESH_OLD_RCV
)
10170 PEER_CAP_REFRESH_NEW_RCV
))
10174 PEER_CAP_REFRESH_OLD_RCV
)
10178 vty_out(vty
, "\n");
10181 /* Multiprotocol Extensions */
10182 FOREACH_AFI_SAFI (afi
, safi
)
10183 if (p
->afc_adv
[afi
][safi
]
10184 || p
->afc_recv
[afi
][safi
]) {
10186 " Address Family %s:",
10187 afi_safi_print(afi
,
10189 if (p
->afc_adv
[afi
][safi
])
10192 if (p
->afc_recv
[afi
][safi
])
10199 vty_out(vty
, "\n");
10202 /* Hostname capability */
10203 vty_out(vty
, " Hostname Capability:");
10205 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_ADV
)) {
10207 " advertised (name: %s,domain name: %s)",
10208 bgp
->peer_self
->hostname
10212 bgp
->peer_self
->domainname
10217 vty_out(vty
, " not advertised");
10220 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_RCV
)) {
10222 " received (name: %s,domain name: %s)",
10223 p
->hostname
? p
->hostname
10225 p
->domainname
? p
->domainname
10228 vty_out(vty
, " not received");
10231 vty_out(vty
, "\n");
10233 /* Gracefull Restart */
10234 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
)
10235 || CHECK_FLAG(p
->cap
,
10236 PEER_CAP_RESTART_ADV
)) {
10238 " Graceful Restart Capabilty:");
10239 if (CHECK_FLAG(p
->cap
,
10240 PEER_CAP_RESTART_ADV
))
10241 vty_out(vty
, " advertised");
10242 if (CHECK_FLAG(p
->cap
,
10243 PEER_CAP_RESTART_RCV
))
10244 vty_out(vty
, " %sreceived",
10247 PEER_CAP_RESTART_ADV
)
10250 vty_out(vty
, "\n");
10252 if (CHECK_FLAG(p
->cap
,
10253 PEER_CAP_RESTART_RCV
)) {
10254 int restart_af_count
= 0;
10257 " Remote Restart timer is %d seconds\n",
10260 " Address families by peer:\n ");
10262 FOREACH_AFI_SAFI (afi
, safi
)
10267 PEER_CAP_RESTART_AF_RCV
)) {
10280 PEER_CAP_RESTART_AF_PRESERVE_RCV
)
10282 : "not preserved");
10283 restart_af_count
++;
10285 if (!restart_af_count
)
10286 vty_out(vty
, "none");
10287 vty_out(vty
, "\n");
10294 /* graceful restart information */
10295 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
) || p
->t_gr_restart
10296 || p
->t_gr_stale
) {
10297 json_object
*json_grace
= NULL
;
10298 json_object
*json_grace_send
= NULL
;
10299 json_object
*json_grace_recv
= NULL
;
10300 int eor_send_af_count
= 0;
10301 int eor_receive_af_count
= 0;
10304 json_grace
= json_object_new_object();
10305 json_grace_send
= json_object_new_object();
10306 json_grace_recv
= json_object_new_object();
10308 if (p
->status
== Established
) {
10309 FOREACH_AFI_SAFI (afi
, safi
) {
10310 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
10311 PEER_STATUS_EOR_SEND
)) {
10312 json_object_boolean_true_add(
10314 afi_safi_print(afi
,
10316 eor_send_af_count
++;
10319 FOREACH_AFI_SAFI (afi
, safi
) {
10321 p
->af_sflags
[afi
][safi
],
10322 PEER_STATUS_EOR_RECEIVED
)) {
10323 json_object_boolean_true_add(
10325 afi_safi_print(afi
,
10327 eor_receive_af_count
++;
10332 json_object_object_add(json_grace
, "endOfRibSend",
10334 json_object_object_add(json_grace
, "endOfRibRecv",
10337 if (p
->t_gr_restart
)
10338 json_object_int_add(json_grace
,
10339 "gracefulRestartTimerMsecs",
10340 thread_timer_remain_second(
10345 json_object_int_add(
10347 "gracefulStalepathTimerMsecs",
10348 thread_timer_remain_second(
10352 json_object_object_add(
10353 json_neigh
, "gracefulRestartInfo", json_grace
);
10355 vty_out(vty
, " Graceful restart information:\n");
10356 if (p
->status
== Established
) {
10357 vty_out(vty
, " End-of-RIB send: ");
10358 FOREACH_AFI_SAFI (afi
, safi
) {
10359 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
10360 PEER_STATUS_EOR_SEND
)) {
10361 vty_out(vty
, "%s%s",
10362 eor_send_af_count
? ", "
10364 afi_safi_print(afi
,
10366 eor_send_af_count
++;
10369 vty_out(vty
, "\n");
10370 vty_out(vty
, " End-of-RIB received: ");
10371 FOREACH_AFI_SAFI (afi
, safi
) {
10373 p
->af_sflags
[afi
][safi
],
10374 PEER_STATUS_EOR_RECEIVED
)) {
10375 vty_out(vty
, "%s%s",
10376 eor_receive_af_count
10379 afi_safi_print(afi
,
10381 eor_receive_af_count
++;
10384 vty_out(vty
, "\n");
10387 if (p
->t_gr_restart
)
10389 " The remaining time of restart timer is %ld\n",
10390 thread_timer_remain_second(
10395 " The remaining time of stalepath timer is %ld\n",
10396 thread_timer_remain_second(
10401 json_object
*json_stat
= NULL
;
10402 json_stat
= json_object_new_object();
10403 /* Packet counts. */
10404 json_object_int_add(json_stat
, "depthInq", 0);
10405 json_object_int_add(json_stat
, "depthOutq",
10406 (unsigned long)p
->obuf
->count
);
10407 json_object_int_add(json_stat
, "opensSent",
10408 atomic_load_explicit(&p
->open_out
,
10409 memory_order_relaxed
));
10410 json_object_int_add(json_stat
, "opensRecv",
10411 atomic_load_explicit(&p
->open_in
,
10412 memory_order_relaxed
));
10413 json_object_int_add(json_stat
, "notificationsSent",
10414 atomic_load_explicit(&p
->notify_out
,
10415 memory_order_relaxed
));
10416 json_object_int_add(json_stat
, "notificationsRecv",
10417 atomic_load_explicit(&p
->notify_in
,
10418 memory_order_relaxed
));
10419 json_object_int_add(json_stat
, "updatesSent",
10420 atomic_load_explicit(&p
->update_out
,
10421 memory_order_relaxed
));
10422 json_object_int_add(json_stat
, "updatesRecv",
10423 atomic_load_explicit(&p
->update_in
,
10424 memory_order_relaxed
));
10425 json_object_int_add(json_stat
, "keepalivesSent",
10426 atomic_load_explicit(&p
->keepalive_out
,
10427 memory_order_relaxed
));
10428 json_object_int_add(json_stat
, "keepalivesRecv",
10429 atomic_load_explicit(&p
->keepalive_in
,
10430 memory_order_relaxed
));
10431 json_object_int_add(json_stat
, "routeRefreshSent",
10432 atomic_load_explicit(&p
->refresh_out
,
10433 memory_order_relaxed
));
10434 json_object_int_add(json_stat
, "routeRefreshRecv",
10435 atomic_load_explicit(&p
->refresh_in
,
10436 memory_order_relaxed
));
10437 json_object_int_add(json_stat
, "capabilitySent",
10438 atomic_load_explicit(&p
->dynamic_cap_out
,
10439 memory_order_relaxed
));
10440 json_object_int_add(json_stat
, "capabilityRecv",
10441 atomic_load_explicit(&p
->dynamic_cap_in
,
10442 memory_order_relaxed
));
10443 json_object_int_add(json_stat
, "totalSent", PEER_TOTAL_TX(p
));
10444 json_object_int_add(json_stat
, "totalRecv", PEER_TOTAL_RX(p
));
10445 json_object_object_add(json_neigh
, "messageStats", json_stat
);
10447 /* Packet counts. */
10448 vty_out(vty
, " Message statistics:\n");
10449 vty_out(vty
, " Inq depth is 0\n");
10450 vty_out(vty
, " Outq depth is %lu\n",
10451 (unsigned long)p
->obuf
->count
);
10452 vty_out(vty
, " Sent Rcvd\n");
10453 vty_out(vty
, " Opens: %10d %10d\n",
10454 atomic_load_explicit(&p
->open_out
,
10455 memory_order_relaxed
),
10456 atomic_load_explicit(&p
->open_in
,
10457 memory_order_relaxed
));
10458 vty_out(vty
, " Notifications: %10d %10d\n",
10459 atomic_load_explicit(&p
->notify_out
,
10460 memory_order_relaxed
),
10461 atomic_load_explicit(&p
->notify_in
,
10462 memory_order_relaxed
));
10463 vty_out(vty
, " Updates: %10d %10d\n",
10464 atomic_load_explicit(&p
->update_out
,
10465 memory_order_relaxed
),
10466 atomic_load_explicit(&p
->update_in
,
10467 memory_order_relaxed
));
10468 vty_out(vty
, " Keepalives: %10d %10d\n",
10469 atomic_load_explicit(&p
->keepalive_out
,
10470 memory_order_relaxed
),
10471 atomic_load_explicit(&p
->keepalive_in
,
10472 memory_order_relaxed
));
10473 vty_out(vty
, " Route Refresh: %10d %10d\n",
10474 atomic_load_explicit(&p
->refresh_out
,
10475 memory_order_relaxed
),
10476 atomic_load_explicit(&p
->refresh_in
,
10477 memory_order_relaxed
));
10478 vty_out(vty
, " Capability: %10d %10d\n",
10479 atomic_load_explicit(&p
->dynamic_cap_out
,
10480 memory_order_relaxed
),
10481 atomic_load_explicit(&p
->dynamic_cap_in
,
10482 memory_order_relaxed
));
10483 vty_out(vty
, " Total: %10d %10d\n", PEER_TOTAL_TX(p
),
10488 /* advertisement-interval */
10489 json_object_int_add(json_neigh
,
10490 "minBtwnAdvertisementRunsTimerMsecs",
10491 p
->v_routeadv
* 1000);
10493 /* Update-source. */
10494 if (p
->update_if
|| p
->update_source
) {
10496 json_object_string_add(json_neigh
,
10499 else if (p
->update_source
)
10500 json_object_string_add(
10501 json_neigh
, "updateSource",
10502 sockunion2str(p
->update_source
, buf1
,
10506 /* advertisement-interval */
10508 " Minimum time between advertisement runs is %d seconds\n",
10511 /* Update-source. */
10512 if (p
->update_if
|| p
->update_source
) {
10513 vty_out(vty
, " Update source is ");
10515 vty_out(vty
, "%s", p
->update_if
);
10516 else if (p
->update_source
)
10518 sockunion2str(p
->update_source
, buf1
,
10520 vty_out(vty
, "\n");
10523 vty_out(vty
, "\n");
10526 /* Address Family Information */
10527 json_object
*json_hold
= NULL
;
10530 json_hold
= json_object_new_object();
10532 FOREACH_AFI_SAFI (afi
, safi
)
10533 if (p
->afc
[afi
][safi
])
10534 bgp_show_peer_afi(vty
, p
, afi
, safi
, use_json
,
10538 json_object_object_add(json_neigh
, "addressFamilyInfo",
10540 json_object_int_add(json_neigh
, "connectionsEstablished",
10542 json_object_int_add(json_neigh
, "connectionsDropped",
10545 vty_out(vty
, " Connections established %d; dropped %d\n",
10546 p
->established
, p
->dropped
);
10548 if (!p
->last_reset
) {
10550 json_object_string_add(json_neigh
, "lastReset",
10553 vty_out(vty
, " Last reset never\n");
10559 uptime
= bgp_clock();
10560 uptime
-= p
->resettime
;
10561 tm
= gmtime(&uptime
);
10562 json_object_int_add(json_neigh
, "lastResetTimerMsecs",
10563 (tm
->tm_sec
* 1000)
10564 + (tm
->tm_min
* 60000)
10565 + (tm
->tm_hour
* 3600000));
10566 json_object_string_add(
10567 json_neigh
, "lastResetDueTo",
10568 peer_down_str
[(int)p
->last_reset
]);
10569 if (p
->last_reset
== PEER_DOWN_NOTIFY_SEND
10570 || p
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
) {
10571 char errorcodesubcode_hexstr
[5];
10572 char errorcodesubcode_str
[256];
10574 code_str
= bgp_notify_code_str(p
->notify
.code
);
10575 subcode_str
= bgp_notify_subcode_str(
10576 p
->notify
.code
, p
->notify
.subcode
);
10578 sprintf(errorcodesubcode_hexstr
, "%02X%02X",
10579 p
->notify
.code
, p
->notify
.subcode
);
10580 json_object_string_add(json_neigh
,
10581 "lastErrorCodeSubcode",
10582 errorcodesubcode_hexstr
);
10583 snprintf(errorcodesubcode_str
, 255, "%s%s",
10584 code_str
, subcode_str
);
10585 json_object_string_add(json_neigh
,
10586 "lastNotificationReason",
10587 errorcodesubcode_str
);
10588 if (p
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
10589 && p
->notify
.code
== BGP_NOTIFY_CEASE
10590 && (p
->notify
.subcode
10591 == BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
10592 || p
->notify
.subcode
10593 == BGP_NOTIFY_CEASE_ADMIN_RESET
)
10594 && p
->notify
.length
) {
10596 const char *msg_str
;
10598 msg_str
= bgp_notify_admin_message(
10599 msgbuf
, sizeof(msgbuf
),
10600 (uint8_t *)p
->notify
.data
,
10603 json_object_string_add(
10605 "lastShutdownDescription",
10610 vty_out(vty
, " Last reset %s, ",
10611 peer_uptime(p
->resettime
, timebuf
,
10612 BGP_UPTIME_LEN
, 0, NULL
));
10614 if (p
->last_reset
== PEER_DOWN_NOTIFY_SEND
10615 || p
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
) {
10616 code_str
= bgp_notify_code_str(p
->notify
.code
);
10617 subcode_str
= bgp_notify_subcode_str(
10618 p
->notify
.code
, p
->notify
.subcode
);
10619 vty_out(vty
, "due to NOTIFICATION %s (%s%s)\n",
10620 p
->last_reset
== PEER_DOWN_NOTIFY_SEND
10623 code_str
, subcode_str
);
10624 if (p
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
10625 && p
->notify
.code
== BGP_NOTIFY_CEASE
10626 && (p
->notify
.subcode
10627 == BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
10628 || p
->notify
.subcode
10629 == BGP_NOTIFY_CEASE_ADMIN_RESET
)
10630 && p
->notify
.length
) {
10632 const char *msg_str
;
10634 msg_str
= bgp_notify_admin_message(
10635 msgbuf
, sizeof(msgbuf
),
10636 (uint8_t *)p
->notify
.data
,
10640 " Message: \"%s\"\n",
10644 vty_out(vty
, "due to %s\n",
10645 peer_down_str
[(int)p
->last_reset
]);
10648 if (p
->last_reset_cause_size
) {
10649 msg
= p
->last_reset_cause
;
10651 " Message received that caused BGP to send a NOTIFICATION:\n ");
10652 for (i
= 1; i
<= p
->last_reset_cause_size
;
10654 vty_out(vty
, "%02X", *msg
++);
10656 if (i
!= p
->last_reset_cause_size
) {
10658 vty_out(vty
, "\n ");
10659 } else if (i
% 4 == 0) {
10664 vty_out(vty
, "\n");
10669 if (CHECK_FLAG(p
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
)) {
10671 json_object_boolean_true_add(json_neigh
,
10672 "prefixesConfigExceedMax");
10675 " Peer had exceeded the max. no. of prefixes configured.\n");
10677 if (p
->t_pmax_restart
) {
10679 json_object_boolean_true_add(
10680 json_neigh
, "reducePrefixNumFrom");
10681 json_object_int_add(json_neigh
,
10682 "restartInTimerMsec",
10683 thread_timer_remain_second(
10688 " Reduce the no. of prefix from %s, will restart in %ld seconds\n",
10689 p
->host
, thread_timer_remain_second(
10690 p
->t_pmax_restart
));
10693 json_object_boolean_true_add(
10695 "reducePrefixNumAndClearIpBgp");
10698 " Reduce the no. of prefix and clear ip bgp %s to restore peering\n",
10703 /* EBGP Multihop and GTSM */
10704 if (p
->sort
!= BGP_PEER_IBGP
) {
10706 if (p
->gtsm_hops
> 0)
10707 json_object_int_add(json_neigh
,
10708 "externalBgpNbrMaxHopsAway",
10710 else if (p
->ttl
> 1)
10711 json_object_int_add(json_neigh
,
10712 "externalBgpNbrMaxHopsAway",
10715 if (p
->gtsm_hops
> 0)
10717 " External BGP neighbor may be up to %d hops away.\n",
10719 else if (p
->ttl
> 1)
10721 " External BGP neighbor may be up to %d hops away.\n",
10725 if (p
->gtsm_hops
> 0) {
10727 json_object_int_add(json_neigh
,
10728 "internalBgpNbrMaxHopsAway",
10732 " Internal BGP neighbor may be up to %d hops away.\n",
10737 /* Local address. */
10740 json_object_string_add(json_neigh
, "hostLocal",
10741 sockunion2str(p
->su_local
, buf1
,
10743 json_object_int_add(json_neigh
, "portLocal",
10744 ntohs(p
->su_local
->sin
.sin_port
));
10746 vty_out(vty
, "Local host: %s, Local port: %d\n",
10747 sockunion2str(p
->su_local
, buf1
, SU_ADDRSTRLEN
),
10748 ntohs(p
->su_local
->sin
.sin_port
));
10751 /* Remote address. */
10752 if (p
->su_remote
) {
10754 json_object_string_add(json_neigh
, "hostForeign",
10755 sockunion2str(p
->su_remote
, buf1
,
10757 json_object_int_add(json_neigh
, "portForeign",
10758 ntohs(p
->su_remote
->sin
.sin_port
));
10760 vty_out(vty
, "Foreign host: %s, Foreign port: %d\n",
10761 sockunion2str(p
->su_remote
, buf1
,
10763 ntohs(p
->su_remote
->sin
.sin_port
));
10766 /* Nexthop display. */
10769 json_object_string_add(json_neigh
, "nexthop",
10771 &p
->nexthop
.v4
, buf1
,
10773 json_object_string_add(json_neigh
, "nexthopGlobal",
10774 inet_ntop(AF_INET6
,
10775 &p
->nexthop
.v6_global
,
10776 buf1
, sizeof(buf1
)));
10777 json_object_string_add(json_neigh
, "nexthopLocal",
10778 inet_ntop(AF_INET6
,
10779 &p
->nexthop
.v6_local
,
10780 buf1
, sizeof(buf1
)));
10781 if (p
->shared_network
)
10782 json_object_string_add(json_neigh
,
10786 json_object_string_add(json_neigh
,
10788 "nonSharedNetwork");
10790 vty_out(vty
, "Nexthop: %s\n",
10791 inet_ntop(AF_INET
, &p
->nexthop
.v4
, buf1
,
10793 vty_out(vty
, "Nexthop global: %s\n",
10794 inet_ntop(AF_INET6
, &p
->nexthop
.v6_global
, buf1
,
10796 vty_out(vty
, "Nexthop local: %s\n",
10797 inet_ntop(AF_INET6
, &p
->nexthop
.v6_local
, buf1
,
10799 vty_out(vty
, "BGP connection: %s\n",
10800 p
->shared_network
? "shared network"
10801 : "non shared network");
10805 /* Timer information. */
10807 json_object_int_add(json_neigh
, "connectRetryTimer",
10809 if (p
->status
== Established
&& p
->rtt
)
10810 json_object_int_add(json_neigh
, "estimatedRttInMsecs",
10813 json_object_int_add(
10814 json_neigh
, "nextStartTimerDueInMsecs",
10815 thread_timer_remain_second(p
->t_start
) * 1000);
10817 json_object_int_add(
10818 json_neigh
, "nextConnectTimerDueInMsecs",
10819 thread_timer_remain_second(p
->t_connect
)
10821 if (p
->t_routeadv
) {
10822 json_object_int_add(json_neigh
, "mraiInterval",
10824 json_object_int_add(
10825 json_neigh
, "mraiTimerExpireInMsecs",
10826 thread_timer_remain_second(p
->t_routeadv
)
10830 json_object_int_add(json_neigh
, "authenticationEnabled",
10834 json_object_string_add(json_neigh
, "readThread", "on");
10836 json_object_string_add(json_neigh
, "readThread", "off");
10838 if (CHECK_FLAG(p
->thread_flags
, PEER_THREAD_WRITES_ON
))
10839 json_object_string_add(json_neigh
, "writeThread", "on");
10841 json_object_string_add(json_neigh
, "writeThread",
10844 vty_out(vty
, "BGP Connect Retry Timer in Seconds: %d\n",
10846 if (p
->status
== Established
&& p
->rtt
)
10847 vty_out(vty
, "Estimated round trip time: %d ms\n",
10850 vty_out(vty
, "Next start timer due in %ld seconds\n",
10851 thread_timer_remain_second(p
->t_start
));
10853 vty_out(vty
, "Next connect timer due in %ld seconds\n",
10854 thread_timer_remain_second(p
->t_connect
));
10857 "MRAI (interval %u) timer expires in %ld seconds\n",
10859 thread_timer_remain_second(p
->t_routeadv
));
10861 vty_out(vty
, "Peer Authentication Enabled\n");
10863 vty_out(vty
, "Read thread: %s Write thread: %s FD used: %d\n",
10864 p
->t_read
? "on" : "off",
10865 CHECK_FLAG(p
->thread_flags
, PEER_THREAD_WRITES_ON
)
10870 if (p
->notify
.code
== BGP_NOTIFY_OPEN_ERR
10871 && p
->notify
.subcode
== BGP_NOTIFY_OPEN_UNSUP_CAPBL
)
10872 bgp_capability_vty_out(vty
, p
, use_json
, json_neigh
);
10875 vty_out(vty
, "\n");
10877 /* BFD information. */
10878 bgp_bfd_show_info(vty
, p
, use_json
, json_neigh
);
10881 if (p
->conf_if
) /* Configured interface name. */
10882 json_object_object_add(json
, p
->conf_if
, json_neigh
);
10883 else /* Configured IP address. */
10884 json_object_object_add(json
, p
->host
, json_neigh
);
10888 static int bgp_show_neighbor(struct vty
*vty
, struct bgp
*bgp
,
10889 enum show_type type
, union sockunion
*su
,
10890 const char *conf_if
, bool use_json
,
10893 struct listnode
*node
, *nnode
;
10896 bool nbr_output
= false;
10897 afi_t afi
= AFI_MAX
;
10898 safi_t safi
= SAFI_MAX
;
10900 if (type
== show_ipv4_peer
|| type
== show_ipv4_all
) {
10902 } else if (type
== show_ipv6_peer
|| type
== show_ipv6_all
) {
10906 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
10907 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
10912 bgp_show_peer(vty
, peer
, use_json
, json
);
10918 && !strcmp(peer
->conf_if
, conf_if
))
10920 && !strcmp(peer
->hostname
, conf_if
))) {
10922 bgp_show_peer(vty
, peer
, use_json
,
10926 if (sockunion_same(&peer
->su
, su
)) {
10928 bgp_show_peer(vty
, peer
, use_json
,
10933 case show_ipv4_peer
:
10934 case show_ipv6_peer
:
10935 FOREACH_SAFI (safi
) {
10936 if (peer
->afc
[afi
][safi
]) {
10939 && !strcmp(peer
->conf_if
, conf_if
))
10941 && !strcmp(peer
->hostname
, conf_if
))) {
10943 bgp_show_peer(vty
, peer
, use_json
,
10948 if (sockunion_same(&peer
->su
, su
)) {
10950 bgp_show_peer(vty
, peer
, use_json
,
10958 case show_ipv4_all
:
10959 case show_ipv6_all
:
10960 FOREACH_SAFI (safi
) {
10961 if (peer
->afc
[afi
][safi
]) {
10962 bgp_show_peer(vty
, peer
, use_json
, json
);
10971 if ((type
== show_peer
|| type
== show_ipv4_peer
||
10972 type
== show_ipv6_peer
) && !find
) {
10974 json_object_boolean_true_add(json
, "bgpNoSuchNeighbor");
10976 vty_out(vty
, "%% No such neighbor in this view/vrf\n");
10979 if (type
!= show_peer
&& type
!= show_ipv4_peer
&&
10980 type
!= show_ipv6_peer
&& !nbr_output
&& !use_json
)
10981 vty_out(vty
, "%% No BGP neighbors found\n");
10984 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
10985 json
, JSON_C_TO_STRING_PRETTY
));
10987 vty_out(vty
, "\n");
10990 return CMD_SUCCESS
;
10993 static void bgp_show_all_instances_neighbors_vty(struct vty
*vty
,
10994 enum show_type type
,
10995 const char *ip_str
,
10998 struct listnode
*node
, *nnode
;
11000 union sockunion su
;
11001 json_object
*json
= NULL
;
11002 int ret
, is_first
= 1;
11003 bool nbr_output
= false;
11006 vty_out(vty
, "{\n");
11008 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
11011 if (!(json
= json_object_new_object())) {
11013 EC_BGP_JSON_MEM_ERROR
,
11014 "Unable to allocate memory for JSON object");
11016 "{\"error\": {\"message:\": \"Unable to allocate memory for JSON object\"}}}\n");
11020 json_object_int_add(json
, "vrfId",
11021 (bgp
->vrf_id
== VRF_UNKNOWN
)
11023 : (int64_t)bgp
->vrf_id
);
11024 json_object_string_add(
11026 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
11031 vty_out(vty
, ",\n");
11035 vty_out(vty
, "\"%s\":",
11036 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
11040 vty_out(vty
, "\nInstance %s:\n",
11041 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
11046 if (type
== show_peer
|| type
== show_ipv4_peer
||
11047 type
== show_ipv6_peer
) {
11048 ret
= str2sockunion(ip_str
, &su
);
11050 bgp_show_neighbor(vty
, bgp
, type
, NULL
, ip_str
,
11053 bgp_show_neighbor(vty
, bgp
, type
, &su
, NULL
,
11056 bgp_show_neighbor(vty
, bgp
, type
, NULL
, NULL
,
11059 json_object_free(json
);
11063 vty_out(vty
, "}\n");
11064 json_object_free(json
);
11066 else if (!nbr_output
)
11067 vty_out(vty
, "%% BGP instance not found\n");
11070 static int bgp_show_neighbor_vty(struct vty
*vty
, const char *name
,
11071 enum show_type type
, const char *ip_str
,
11076 union sockunion su
;
11077 json_object
*json
= NULL
;
11080 if (strmatch(name
, "all")) {
11081 bgp_show_all_instances_neighbors_vty(vty
, type
, ip_str
,
11083 return CMD_SUCCESS
;
11085 bgp
= bgp_lookup_by_name(name
);
11088 json
= json_object_new_object();
11089 vty_out(vty
, "%s\n",
11090 json_object_to_json_string_ext(
11092 JSON_C_TO_STRING_PRETTY
));
11093 json_object_free(json
);
11096 "%% BGP instance not found\n");
11098 return CMD_WARNING
;
11102 bgp
= bgp_get_default();
11106 json
= json_object_new_object();
11108 ret
= str2sockunion(ip_str
, &su
);
11110 bgp_show_neighbor(vty
, bgp
, type
, NULL
, ip_str
,
11113 bgp_show_neighbor(vty
, bgp
, type
, &su
, NULL
,
11116 bgp_show_neighbor(vty
, bgp
, type
, NULL
, NULL
, use_json
,
11119 json_object_free(json
);
11122 vty_out(vty
, "{}\n");
11124 vty_out(vty
, "%% BGP instance not found\n");
11127 return CMD_SUCCESS
;
11130 /* "show [ip] bgp neighbors" commands. */
11131 DEFUN (show_ip_bgp_neighbors
,
11132 show_ip_bgp_neighbors_cmd
,
11133 "show [ip] bgp [<view|vrf> VIEWVRFNAME] [<ipv4|ipv6>] neighbors [<A.B.C.D|X:X::X:X|WORD>] [json]",
11137 BGP_INSTANCE_HELP_STR
11140 "Detailed information on TCP and BGP neighbor connections\n"
11141 "Neighbor to display information about\n"
11142 "Neighbor to display information about\n"
11143 "Neighbor on BGP configured interface\n"
11147 char *sh_arg
= NULL
;
11148 enum show_type sh_type
;
11149 afi_t afi
= AFI_MAX
;
11151 bool uj
= use_json(argc
, argv
);
11155 /* [<vrf> VIEWVRFNAME] */
11156 if (argv_find(argv
, argc
, "vrf", &idx
)) {
11157 vrf
= argv
[idx
+ 1]->arg
;
11158 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
11160 } else if (argv_find(argv
, argc
, "view", &idx
))
11161 /* [<view> VIEWVRFNAME] */
11162 vrf
= argv
[idx
+ 1]->arg
;
11166 if (argv_find(argv
, argc
, "ipv4", &idx
)) {
11167 sh_type
= show_ipv4_all
;
11169 } else if (argv_find(argv
, argc
, "ipv6", &idx
)) {
11170 sh_type
= show_ipv6_all
;
11173 sh_type
= show_all
;
11176 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)
11177 || argv_find(argv
, argc
, "X:X::X:X", &idx
)
11178 || argv_find(argv
, argc
, "WORD", &idx
)) {
11179 sh_type
= show_peer
;
11180 sh_arg
= argv
[idx
]->arg
;
11183 if (sh_type
== show_peer
&& afi
== AFI_IP
) {
11184 sh_type
= show_ipv4_peer
;
11185 } else if (sh_type
== show_peer
&& afi
== AFI_IP6
) {
11186 sh_type
= show_ipv6_peer
;
11189 return bgp_show_neighbor_vty(vty
, vrf
, sh_type
, sh_arg
, uj
);
11192 /* Show BGP's AS paths internal data. There are both `show [ip] bgp
11193 paths' and `show ip mbgp paths'. Those functions results are the
11195 DEFUN (show_ip_bgp_paths
,
11196 show_ip_bgp_paths_cmd
,
11197 "show [ip] bgp ["BGP_SAFI_CMD_STR
"] paths",
11202 "Path information\n")
11204 vty_out(vty
, "Address Refcnt Path\n");
11205 aspath_print_all_vty(vty
);
11206 return CMD_SUCCESS
;
11211 static void community_show_all_iterator(struct hash_bucket
*bucket
,
11214 struct community
*com
;
11216 com
= (struct community
*)bucket
->data
;
11217 vty_out(vty
, "[%p] (%ld) %s\n", (void *)com
, com
->refcnt
,
11218 community_str(com
, false));
11221 /* Show BGP's community internal data. */
11222 DEFUN (show_ip_bgp_community_info
,
11223 show_ip_bgp_community_info_cmd
,
11224 "show [ip] bgp community-info",
11228 "List all bgp community information\n")
11230 vty_out(vty
, "Address Refcnt Community\n");
11232 hash_iterate(community_hash(),
11233 (void (*)(struct hash_bucket
*,
11234 void *))community_show_all_iterator
,
11237 return CMD_SUCCESS
;
11240 static void lcommunity_show_all_iterator(struct hash_bucket
*bucket
,
11243 struct lcommunity
*lcom
;
11245 lcom
= (struct lcommunity
*)bucket
->data
;
11246 vty_out(vty
, "[%p] (%ld) %s\n", (void *)lcom
, lcom
->refcnt
,
11247 lcommunity_str(lcom
, false));
11250 /* Show BGP's community internal data. */
11251 DEFUN (show_ip_bgp_lcommunity_info
,
11252 show_ip_bgp_lcommunity_info_cmd
,
11253 "show ip bgp large-community-info",
11257 "List all bgp large-community information\n")
11259 vty_out(vty
, "Address Refcnt Large-community\n");
11261 hash_iterate(lcommunity_hash(),
11262 (void (*)(struct hash_bucket
*,
11263 void *))lcommunity_show_all_iterator
,
11266 return CMD_SUCCESS
;
11270 DEFUN (show_ip_bgp_attr_info
,
11271 show_ip_bgp_attr_info_cmd
,
11272 "show [ip] bgp attribute-info",
11276 "List all bgp attribute information\n")
11278 attr_show_all(vty
);
11279 return CMD_SUCCESS
;
11282 static int bgp_show_route_leak_vty(struct vty
*vty
, const char *name
,
11283 afi_t afi
, safi_t safi
,
11284 bool use_json
, json_object
*json
)
11287 struct listnode
*node
;
11289 char buf1
[INET6_ADDRSTRLEN
];
11291 vpn_policy_direction_t dir
;
11294 json_object
*json_import_vrfs
= NULL
;
11295 json_object
*json_export_vrfs
= NULL
;
11297 bgp
= name
? bgp_lookup_by_name(name
) : bgp_get_default();
11300 vty_out(vty
, "%s\n",
11301 json_object_to_json_string_ext(
11303 JSON_C_TO_STRING_PRETTY
));
11304 json_object_free(json
);
11306 return CMD_WARNING
;
11309 /* Provide context for the block */
11310 json_object_string_add(json
, "vrf", name
? name
: "default");
11311 json_object_string_add(json
, "afiSafi",
11312 afi_safi_print(afi
, safi
));
11314 if (!CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
11315 BGP_CONFIG_VRF_TO_VRF_IMPORT
)) {
11316 json_object_string_add(json
, "importFromVrfs", "none");
11317 json_object_string_add(json
, "importRts", "none");
11319 json_import_vrfs
= json_object_new_array();
11321 for (ALL_LIST_ELEMENTS_RO(
11322 bgp
->vpn_policy
[afi
].import_vrf
,
11324 json_object_array_add(json_import_vrfs
,
11325 json_object_new_string(vname
));
11327 dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
11328 ecom_str
= ecommunity_ecom2str(
11329 bgp
->vpn_policy
[afi
].rtlist
[dir
],
11330 ECOMMUNITY_FORMAT_ROUTE_MAP
, 0);
11331 json_object_object_add(json
, "importFromVrfs",
11333 json_object_string_add(json
, "importRts", ecom_str
);
11335 XFREE(MTYPE_ECOMMUNITY_STR
, ecom_str
);
11338 if (!CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
11339 BGP_CONFIG_VRF_TO_VRF_EXPORT
)) {
11340 json_object_string_add(json
, "exportToVrfs", "none");
11341 json_object_string_add(json
, "routeDistinguisher",
11343 json_object_string_add(json
, "exportRts", "none");
11345 json_export_vrfs
= json_object_new_array();
11347 for (ALL_LIST_ELEMENTS_RO(
11348 bgp
->vpn_policy
[afi
].export_vrf
,
11350 json_object_array_add(json_export_vrfs
,
11351 json_object_new_string(vname
));
11352 json_object_object_add(json
, "exportToVrfs",
11354 json_object_string_add(json
, "routeDistinguisher",
11355 prefix_rd2str(&bgp
->vpn_policy
[afi
].tovpn_rd
,
11356 buf1
, RD_ADDRSTRLEN
));
11358 dir
= BGP_VPN_POLICY_DIR_TOVPN
;
11359 ecom_str
= ecommunity_ecom2str(
11360 bgp
->vpn_policy
[afi
].rtlist
[dir
],
11361 ECOMMUNITY_FORMAT_ROUTE_MAP
, 0);
11362 json_object_string_add(json
, "exportRts", ecom_str
);
11364 XFREE(MTYPE_ECOMMUNITY_STR
, ecom_str
);
11368 vty_out(vty
, "%s\n",
11369 json_object_to_json_string_ext(json
,
11370 JSON_C_TO_STRING_PRETTY
));
11371 json_object_free(json
);
11374 bgp
= name
? bgp_lookup_by_name(name
) : bgp_get_default();
11377 vty_out(vty
, "%% No such BGP instance exist\n");
11378 return CMD_WARNING
;
11381 if (!CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
11382 BGP_CONFIG_VRF_TO_VRF_IMPORT
))
11384 "This VRF is not importing %s routes from any other VRF\n",
11385 afi_safi_print(afi
, safi
));
11388 "This VRF is importing %s routes from the following VRFs:\n",
11389 afi_safi_print(afi
, safi
));
11391 for (ALL_LIST_ELEMENTS_RO(
11392 bgp
->vpn_policy
[afi
].import_vrf
,
11394 vty_out(vty
, " %s\n", vname
);
11396 dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
11397 ecom_str
= ecommunity_ecom2str(
11398 bgp
->vpn_policy
[afi
].rtlist
[dir
],
11399 ECOMMUNITY_FORMAT_ROUTE_MAP
, 0);
11400 vty_out(vty
, "Import RT(s): %s\n", ecom_str
);
11402 XFREE(MTYPE_ECOMMUNITY_STR
, ecom_str
);
11405 if (!CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
11406 BGP_CONFIG_VRF_TO_VRF_EXPORT
))
11408 "This VRF is not exporting %s routes to any other VRF\n",
11409 afi_safi_print(afi
, safi
));
11412 "This VRF is exporting %s routes to the following VRFs:\n",
11413 afi_safi_print(afi
, safi
));
11415 for (ALL_LIST_ELEMENTS_RO(
11416 bgp
->vpn_policy
[afi
].export_vrf
,
11418 vty_out(vty
, " %s\n", vname
);
11420 vty_out(vty
, "RD: %s\n",
11421 prefix_rd2str(&bgp
->vpn_policy
[afi
].tovpn_rd
,
11422 buf1
, RD_ADDRSTRLEN
));
11424 dir
= BGP_VPN_POLICY_DIR_TOVPN
;
11425 ecom_str
= ecommunity_ecom2str(
11426 bgp
->vpn_policy
[afi
].rtlist
[dir
],
11427 ECOMMUNITY_FORMAT_ROUTE_MAP
, 0);
11428 vty_out(vty
, "Export RT: %s\n", ecom_str
);
11429 XFREE(MTYPE_ECOMMUNITY_STR
, ecom_str
);
11433 return CMD_SUCCESS
;
11436 static int bgp_show_all_instance_route_leak_vty(struct vty
*vty
, afi_t afi
,
11437 safi_t safi
, bool use_json
)
11439 struct listnode
*node
, *nnode
;
11441 char *vrf_name
= NULL
;
11442 json_object
*json
= NULL
;
11443 json_object
*json_vrf
= NULL
;
11444 json_object
*json_vrfs
= NULL
;
11447 json
= json_object_new_object();
11448 json_vrfs
= json_object_new_object();
11451 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
11453 if (bgp
->inst_type
!= BGP_INSTANCE_TYPE_DEFAULT
)
11454 vrf_name
= bgp
->name
;
11457 json_vrf
= json_object_new_object();
11459 vty_out(vty
, "\nInstance %s:\n",
11460 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
11461 ? VRF_DEFAULT_NAME
: bgp
->name
);
11463 bgp_show_route_leak_vty(vty
, vrf_name
, afi
, safi
, 0, json_vrf
);
11465 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
11466 json_object_object_add(json_vrfs
,
11467 VRF_DEFAULT_NAME
, json_vrf
);
11469 json_object_object_add(json_vrfs
, vrf_name
,
11475 json_object_object_add(json
, "vrfs", json_vrfs
);
11476 vty_out(vty
, "%s\n", json_object_to_json_string_ext(json
,
11477 JSON_C_TO_STRING_PRETTY
));
11478 json_object_free(json
);
11481 return CMD_SUCCESS
;
11484 /* "show [ip] bgp route-leak" command. */
11485 DEFUN (show_ip_bgp_route_leak
,
11486 show_ip_bgp_route_leak_cmd
,
11487 "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR
" ["BGP_SAFI_CMD_STR
"]] route-leak [json]",
11491 BGP_INSTANCE_HELP_STR
11494 "Route leaking information\n"
11498 afi_t afi
= AFI_MAX
;
11499 safi_t safi
= SAFI_MAX
;
11501 bool uj
= use_json(argc
, argv
);
11503 json_object
*json
= NULL
;
11505 /* show [ip] bgp */
11506 if (argv_find(argv
, argc
, "ip", &idx
)) {
11508 safi
= SAFI_UNICAST
;
11510 /* [vrf VIEWVRFNAME] */
11511 if (argv_find(argv
, argc
, "view", &idx
)) {
11513 "%% This command is not applicable to BGP views\n");
11514 return CMD_WARNING
;
11517 if (argv_find(argv
, argc
, "vrf", &idx
)) {
11518 vrf
= argv
[idx
+ 1]->arg
;
11519 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
11522 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
11523 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
)) {
11524 argv_find_and_parse_safi(argv
, argc
, &idx
, &safi
);
11527 if (!((afi
== AFI_IP
|| afi
== AFI_IP6
) && safi
== SAFI_UNICAST
)) {
11529 "%% This command is applicable only for unicast ipv4|ipv6\n");
11530 return CMD_WARNING
;
11533 if (vrf
&& strmatch(vrf
, "all"))
11534 return bgp_show_all_instance_route_leak_vty(vty
, afi
, safi
, uj
);
11537 json
= json_object_new_object();
11539 return bgp_show_route_leak_vty(vty
, vrf
, afi
, safi
, uj
, json
);
11542 static void bgp_show_all_instances_updgrps_vty(struct vty
*vty
, afi_t afi
,
11545 struct listnode
*node
, *nnode
;
11548 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
11549 vty_out(vty
, "\nInstance %s:\n",
11550 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
11553 update_group_show(bgp
, afi
, safi
, vty
, 0);
11557 static int bgp_show_update_groups(struct vty
*vty
, const char *name
, int afi
,
11558 int safi
, uint64_t subgrp_id
)
11563 if (strmatch(name
, "all")) {
11564 bgp_show_all_instances_updgrps_vty(vty
, afi
, safi
);
11565 return CMD_SUCCESS
;
11567 bgp
= bgp_lookup_by_name(name
);
11570 bgp
= bgp_get_default();
11574 update_group_show(bgp
, afi
, safi
, vty
, subgrp_id
);
11575 return CMD_SUCCESS
;
11578 DEFUN (show_ip_bgp_updgrps
,
11579 show_ip_bgp_updgrps_cmd
,
11580 "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR
" ["BGP_SAFI_WITH_LABEL_CMD_STR
"]] update-groups [SUBGROUP-ID]",
11584 BGP_INSTANCE_HELP_STR
11586 BGP_SAFI_WITH_LABEL_HELP_STR
11587 "Detailed info about dynamic update groups\n"
11588 "Specific subgroup to display detailed info for\n")
11591 afi_t afi
= AFI_IP6
;
11592 safi_t safi
= SAFI_UNICAST
;
11593 uint64_t subgrp_id
= 0;
11597 /* show [ip] bgp */
11598 if (argv_find(argv
, argc
, "ip", &idx
))
11600 /* [<vrf> VIEWVRFNAME] */
11601 if (argv_find(argv
, argc
, "vrf", &idx
)) {
11602 vrf
= argv
[idx
+ 1]->arg
;
11603 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
11605 } else if (argv_find(argv
, argc
, "view", &idx
))
11606 /* [<view> VIEWVRFNAME] */
11607 vrf
= argv
[idx
+ 1]->arg
;
11608 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
11609 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
)) {
11610 argv_find_and_parse_safi(argv
, argc
, &idx
, &safi
);
11613 /* get subgroup id, if provided */
11615 if (argv
[idx
]->type
== VARIABLE_TKN
)
11616 subgrp_id
= strtoull(argv
[idx
]->arg
, NULL
, 10);
11618 return (bgp_show_update_groups(vty
, vrf
, afi
, safi
, subgrp_id
));
11621 DEFUN (show_bgp_instance_all_ipv6_updgrps
,
11622 show_bgp_instance_all_ipv6_updgrps_cmd
,
11623 "show [ip] bgp <view|vrf> all update-groups",
11627 BGP_INSTANCE_ALL_HELP_STR
11628 "Detailed info about dynamic update groups\n")
11630 bgp_show_all_instances_updgrps_vty(vty
, AFI_IP6
, SAFI_UNICAST
);
11631 return CMD_SUCCESS
;
11634 DEFUN (show_bgp_l2vpn_evpn_updgrps
,
11635 show_bgp_l2vpn_evpn_updgrps_cmd
,
11636 "show [ip] bgp l2vpn evpn update-groups",
11640 "l2vpn address family\n"
11641 "evpn sub-address family\n"
11642 "Detailed info about dynamic update groups\n")
11645 uint64_t subgrp_id
= 0;
11647 bgp_show_update_groups(vty
, vrf
, AFI_L2VPN
, SAFI_EVPN
, subgrp_id
);
11648 return CMD_SUCCESS
;
11651 DEFUN (show_bgp_updgrps_stats
,
11652 show_bgp_updgrps_stats_cmd
,
11653 "show [ip] bgp update-groups statistics",
11657 "Detailed info about dynamic update groups\n"
11662 bgp
= bgp_get_default();
11664 update_group_show_stats(bgp
, vty
);
11666 return CMD_SUCCESS
;
11669 DEFUN (show_bgp_instance_updgrps_stats
,
11670 show_bgp_instance_updgrps_stats_cmd
,
11671 "show [ip] bgp <view|vrf> VIEWVRFNAME update-groups statistics",
11675 BGP_INSTANCE_HELP_STR
11676 "Detailed info about dynamic update groups\n"
11682 bgp
= bgp_lookup_by_name(argv
[idx_word
]->arg
);
11684 update_group_show_stats(bgp
, vty
);
11686 return CMD_SUCCESS
;
11689 static void show_bgp_updgrps_adj_info_aux(struct vty
*vty
, const char *name
,
11690 afi_t afi
, safi_t safi
,
11691 const char *what
, uint64_t subgrp_id
)
11696 bgp
= bgp_lookup_by_name(name
);
11698 bgp
= bgp_get_default();
11701 if (!strcmp(what
, "advertise-queue"))
11702 update_group_show_adj_queue(bgp
, afi
, safi
, vty
,
11704 else if (!strcmp(what
, "advertised-routes"))
11705 update_group_show_advertised(bgp
, afi
, safi
, vty
,
11707 else if (!strcmp(what
, "packet-queue"))
11708 update_group_show_packet_queue(bgp
, afi
, safi
, vty
,
11713 DEFPY(show_ip_bgp_instance_updgrps_adj_s
,
11714 show_ip_bgp_instance_updgrps_adj_s_cmd
,
11715 "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",
11716 SHOW_STR IP_STR BGP_STR BGP_INSTANCE_HELP_STR BGP_AFI_HELP_STR
11718 "Detailed info about dynamic update groups\n"
11719 "Specific subgroup to display info for\n"
11720 "Advertisement queue\n"
11721 "Announced routes\n"
11724 uint64_t subgrp_id
= 0;
11728 subgrp_id
= strtoull(sgid
, NULL
, 10);
11733 afiz
= bgp_vty_afi_from_str(afi
);
11737 afiz
= bgp_vty_afi_from_str(afi
);
11738 if (afiz
!= AFI_IP
)
11740 "%% Cannot specify both 'ip' and 'ipv6'\n");
11741 return CMD_WARNING
;
11744 safiz
= safi
? bgp_vty_safi_from_str(safi
) : SAFI_UNICAST
;
11746 show_bgp_updgrps_adj_info_aux(vty
, vrf
, afiz
, safiz
, rtq
, subgrp_id
);
11747 return CMD_SUCCESS
;
11750 static int bgp_show_one_peer_group(struct vty
*vty
, struct peer_group
*group
)
11752 struct listnode
*node
, *nnode
;
11753 struct prefix
*range
;
11756 char buf
[PREFIX2STR_BUFFER
];
11759 const char *peer_status
;
11760 const char *af_str
;
11765 conf
= group
->conf
;
11767 if (conf
->as_type
== AS_SPECIFIED
|| conf
->as_type
== AS_EXTERNAL
) {
11768 vty_out(vty
, "\nBGP peer-group %s, remote AS %" PRIu32
"\n",
11769 group
->name
, conf
->as
);
11770 } else if (conf
->as_type
== AS_INTERNAL
) {
11771 vty_out(vty
, "\nBGP peer-group %s, remote AS %" PRIu32
"\n",
11772 group
->name
, group
->bgp
->as
);
11774 vty_out(vty
, "\nBGP peer-group %s\n", group
->name
);
11777 if ((group
->bgp
->as
== conf
->as
) || (conf
->as_type
== AS_INTERNAL
))
11778 vty_out(vty
, " Peer-group type is internal\n");
11780 vty_out(vty
, " Peer-group type is external\n");
11782 /* Display AFs configured. */
11783 vty_out(vty
, " Configured address-families:");
11784 FOREACH_AFI_SAFI (afi
, safi
) {
11785 if (conf
->afc
[afi
][safi
]) {
11787 vty_out(vty
, " %s;", afi_safi_print(afi
, safi
));
11791 vty_out(vty
, " none\n");
11793 vty_out(vty
, "\n");
11795 /* Display listen ranges (for dynamic neighbors), if any */
11796 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++) {
11799 else if (afi
== AFI_IP6
)
11803 lr_count
= listcount(group
->listen_range
[afi
]);
11805 vty_out(vty
, " %d %s listen range(s)\n", lr_count
,
11809 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], node
,
11811 prefix2str(range
, buf
, sizeof(buf
));
11812 vty_out(vty
, " %s\n", buf
);
11817 /* Display group members and their status */
11818 if (listcount(group
->peer
)) {
11819 vty_out(vty
, " Peer-group members:\n");
11820 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
11821 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_SHUTDOWN
))
11822 peer_status
= "Idle (Admin)";
11823 else if (CHECK_FLAG(peer
->sflags
,
11824 PEER_STATUS_PREFIX_OVERFLOW
))
11825 peer_status
= "Idle (PfxCt)";
11827 peer_status
= lookup_msg(bgp_status_msg
,
11828 peer
->status
, NULL
);
11830 dynamic
= peer_dynamic_neighbor(peer
);
11831 vty_out(vty
, " %s %s %s \n", peer
->host
,
11832 dynamic
? "(dynamic)" : "", peer_status
);
11836 return CMD_SUCCESS
;
11839 static int bgp_show_peer_group_vty(struct vty
*vty
, const char *name
,
11840 const char *group_name
)
11843 struct listnode
*node
, *nnode
;
11844 struct peer_group
*group
;
11845 bool found
= false;
11847 bgp
= name
? bgp_lookup_by_name(name
) : bgp_get_default();
11850 vty_out(vty
, "%% BGP instance not found\n");
11851 return CMD_WARNING
;
11854 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
11856 if (strmatch(group
->name
, group_name
)) {
11857 bgp_show_one_peer_group(vty
, group
);
11862 bgp_show_one_peer_group(vty
, group
);
11866 if (group_name
&& !found
)
11867 vty_out(vty
, "%% No such peer-group\n");
11869 return CMD_SUCCESS
;
11872 DEFUN (show_ip_bgp_peer_groups
,
11873 show_ip_bgp_peer_groups_cmd
,
11874 "show [ip] bgp [<view|vrf> VIEWVRFNAME] peer-group [PGNAME]",
11878 BGP_INSTANCE_HELP_STR
11879 "Detailed information on BGP peer groups\n"
11880 "Peer group name\n")
11885 vrf
= argv_find(argv
, argc
, "VIEWVRFNAME", &idx
) ? argv
[idx
]->arg
11887 pg
= argv_find(argv
, argc
, "PGNAME", &idx
) ? argv
[idx
]->arg
: NULL
;
11889 return bgp_show_peer_group_vty(vty
, vrf
, pg
);
11893 /* Redistribute VTY commands. */
11895 DEFUN (bgp_redistribute_ipv4
,
11896 bgp_redistribute_ipv4_cmd
,
11897 "redistribute " FRR_IP_REDIST_STR_BGPD
,
11898 "Redistribute information from another routing protocol\n"
11899 FRR_IP_REDIST_HELP_STR_BGPD
)
11901 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11902 int idx_protocol
= 1;
11905 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
11907 vty_out(vty
, "%% Invalid route type\n");
11908 return CMD_WARNING_CONFIG_FAILED
;
11911 bgp_redist_add(bgp
, AFI_IP
, type
, 0);
11912 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0, false);
11916 bgp_redistribute_ipv4
, bgp_redistribute_ipv4_hidden_cmd
,
11917 "redistribute " FRR_IP_REDIST_STR_BGPD
,
11918 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
)
11920 DEFUN (bgp_redistribute_ipv4_rmap
,
11921 bgp_redistribute_ipv4_rmap_cmd
,
11922 "redistribute " FRR_IP_REDIST_STR_BGPD
" route-map WORD",
11923 "Redistribute information from another routing protocol\n"
11924 FRR_IP_REDIST_HELP_STR_BGPD
11925 "Route map reference\n"
11926 "Pointer to route-map entries\n")
11928 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11929 int idx_protocol
= 1;
11932 struct bgp_redist
*red
;
11934 struct route_map
*route_map
= route_map_lookup_warn_noexist(
11935 vty
, argv
[idx_word
]->arg
);
11937 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
11939 vty_out(vty
, "%% Invalid route type\n");
11940 return CMD_WARNING_CONFIG_FAILED
;
11943 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
11945 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
11946 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0, changed
);
11950 bgp_redistribute_ipv4_rmap
, bgp_redistribute_ipv4_rmap_hidden_cmd
,
11951 "redistribute " FRR_IP_REDIST_STR_BGPD
" route-map WORD",
11952 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
11953 "Route map reference\n"
11954 "Pointer to route-map entries\n")
11956 DEFUN (bgp_redistribute_ipv4_metric
,
11957 bgp_redistribute_ipv4_metric_cmd
,
11958 "redistribute " FRR_IP_REDIST_STR_BGPD
" metric (0-4294967295)",
11959 "Redistribute information from another routing protocol\n"
11960 FRR_IP_REDIST_HELP_STR_BGPD
11961 "Metric for redistributed routes\n"
11962 "Default metric\n")
11964 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11965 int idx_protocol
= 1;
11966 int idx_number
= 3;
11969 struct bgp_redist
*red
;
11972 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
11974 vty_out(vty
, "%% Invalid route type\n");
11975 return CMD_WARNING_CONFIG_FAILED
;
11977 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
11979 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
11980 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, type
, metric
);
11981 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0, changed
);
11985 bgp_redistribute_ipv4_metric
, bgp_redistribute_ipv4_metric_hidden_cmd
,
11986 "redistribute " FRR_IP_REDIST_STR_BGPD
" metric (0-4294967295)",
11987 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
11988 "Metric for redistributed routes\n"
11989 "Default metric\n")
11991 DEFUN (bgp_redistribute_ipv4_rmap_metric
,
11992 bgp_redistribute_ipv4_rmap_metric_cmd
,
11993 "redistribute " FRR_IP_REDIST_STR_BGPD
" route-map WORD metric (0-4294967295)",
11994 "Redistribute information from another routing protocol\n"
11995 FRR_IP_REDIST_HELP_STR_BGPD
11996 "Route map reference\n"
11997 "Pointer to route-map entries\n"
11998 "Metric for redistributed routes\n"
11999 "Default metric\n")
12001 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12002 int idx_protocol
= 1;
12004 int idx_number
= 5;
12007 struct bgp_redist
*red
;
12009 struct route_map
*route_map
=
12010 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12012 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
12014 vty_out(vty
, "%% Invalid route type\n");
12015 return CMD_WARNING_CONFIG_FAILED
;
12017 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12019 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
12021 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12022 changed
|= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, type
, metric
);
12023 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0, changed
);
12027 bgp_redistribute_ipv4_rmap_metric
,
12028 bgp_redistribute_ipv4_rmap_metric_hidden_cmd
,
12029 "redistribute " FRR_IP_REDIST_STR_BGPD
12030 " route-map WORD metric (0-4294967295)",
12031 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
12032 "Route map reference\n"
12033 "Pointer to route-map entries\n"
12034 "Metric for redistributed routes\n"
12035 "Default metric\n")
12037 DEFUN (bgp_redistribute_ipv4_metric_rmap
,
12038 bgp_redistribute_ipv4_metric_rmap_cmd
,
12039 "redistribute " FRR_IP_REDIST_STR_BGPD
" metric (0-4294967295) route-map WORD",
12040 "Redistribute information from another routing protocol\n"
12041 FRR_IP_REDIST_HELP_STR_BGPD
12042 "Metric for redistributed routes\n"
12044 "Route map reference\n"
12045 "Pointer to route-map entries\n")
12047 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12048 int idx_protocol
= 1;
12049 int idx_number
= 3;
12053 struct bgp_redist
*red
;
12055 struct route_map
*route_map
=
12056 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12058 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
12060 vty_out(vty
, "%% Invalid route type\n");
12061 return CMD_WARNING_CONFIG_FAILED
;
12063 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12065 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
12066 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, type
, metric
);
12068 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12069 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0, changed
);
12073 bgp_redistribute_ipv4_metric_rmap
,
12074 bgp_redistribute_ipv4_metric_rmap_hidden_cmd
,
12075 "redistribute " FRR_IP_REDIST_STR_BGPD
12076 " metric (0-4294967295) route-map WORD",
12077 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
12078 "Metric for redistributed routes\n"
12080 "Route map reference\n"
12081 "Pointer to route-map entries\n")
12083 DEFUN (bgp_redistribute_ipv4_ospf
,
12084 bgp_redistribute_ipv4_ospf_cmd
,
12085 "redistribute <ospf|table> (1-65535)",
12086 "Redistribute information from another routing protocol\n"
12087 "Open Shortest Path First (OSPFv2)\n"
12088 "Non-main Kernel Routing Table\n"
12089 "Instance ID/Table ID\n")
12091 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12092 int idx_ospf_table
= 1;
12093 int idx_number
= 2;
12094 unsigned short instance
;
12095 unsigned short protocol
;
12097 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12099 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
12100 protocol
= ZEBRA_ROUTE_OSPF
;
12102 protocol
= ZEBRA_ROUTE_TABLE
;
12104 bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
12105 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
, false);
12108 ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf
, bgp_redistribute_ipv4_ospf_hidden_cmd
,
12109 "redistribute <ospf|table> (1-65535)",
12110 "Redistribute information from another routing protocol\n"
12111 "Open Shortest Path First (OSPFv2)\n"
12112 "Non-main Kernel Routing Table\n"
12113 "Instance ID/Table ID\n")
12115 DEFUN (bgp_redistribute_ipv4_ospf_rmap
,
12116 bgp_redistribute_ipv4_ospf_rmap_cmd
,
12117 "redistribute <ospf|table> (1-65535) route-map WORD",
12118 "Redistribute information from another routing protocol\n"
12119 "Open Shortest Path First (OSPFv2)\n"
12120 "Non-main Kernel Routing Table\n"
12121 "Instance ID/Table ID\n"
12122 "Route map reference\n"
12123 "Pointer to route-map entries\n")
12125 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12126 int idx_ospf_table
= 1;
12127 int idx_number
= 2;
12129 struct bgp_redist
*red
;
12130 unsigned short instance
;
12133 struct route_map
*route_map
=
12134 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12136 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
12137 protocol
= ZEBRA_ROUTE_OSPF
;
12139 protocol
= ZEBRA_ROUTE_TABLE
;
12141 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12142 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
12144 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12145 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
, changed
);
12148 ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf_rmap
,
12149 bgp_redistribute_ipv4_ospf_rmap_hidden_cmd
,
12150 "redistribute <ospf|table> (1-65535) route-map WORD",
12151 "Redistribute information from another routing protocol\n"
12152 "Open Shortest Path First (OSPFv2)\n"
12153 "Non-main Kernel Routing Table\n"
12154 "Instance ID/Table ID\n"
12155 "Route map reference\n"
12156 "Pointer to route-map entries\n")
12158 DEFUN (bgp_redistribute_ipv4_ospf_metric
,
12159 bgp_redistribute_ipv4_ospf_metric_cmd
,
12160 "redistribute <ospf|table> (1-65535) metric (0-4294967295)",
12161 "Redistribute information from another routing protocol\n"
12162 "Open Shortest Path First (OSPFv2)\n"
12163 "Non-main Kernel Routing Table\n"
12164 "Instance ID/Table ID\n"
12165 "Metric for redistributed routes\n"
12166 "Default metric\n")
12168 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12169 int idx_ospf_table
= 1;
12170 int idx_number
= 2;
12171 int idx_number_2
= 4;
12173 struct bgp_redist
*red
;
12174 unsigned short instance
;
12178 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
12179 protocol
= ZEBRA_ROUTE_OSPF
;
12181 protocol
= ZEBRA_ROUTE_TABLE
;
12183 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12184 metric
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
12186 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
12187 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, protocol
,
12189 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
, changed
);
12192 ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf_metric
,
12193 bgp_redistribute_ipv4_ospf_metric_hidden_cmd
,
12194 "redistribute <ospf|table> (1-65535) metric (0-4294967295)",
12195 "Redistribute information from another routing protocol\n"
12196 "Open Shortest Path First (OSPFv2)\n"
12197 "Non-main Kernel Routing Table\n"
12198 "Instance ID/Table ID\n"
12199 "Metric for redistributed routes\n"
12200 "Default metric\n")
12202 DEFUN (bgp_redistribute_ipv4_ospf_rmap_metric
,
12203 bgp_redistribute_ipv4_ospf_rmap_metric_cmd
,
12204 "redistribute <ospf|table> (1-65535) route-map WORD metric (0-4294967295)",
12205 "Redistribute information from another routing protocol\n"
12206 "Open Shortest Path First (OSPFv2)\n"
12207 "Non-main Kernel Routing Table\n"
12208 "Instance ID/Table ID\n"
12209 "Route map reference\n"
12210 "Pointer to route-map entries\n"
12211 "Metric for redistributed routes\n"
12212 "Default metric\n")
12214 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12215 int idx_ospf_table
= 1;
12216 int idx_number
= 2;
12218 int idx_number_2
= 6;
12220 struct bgp_redist
*red
;
12221 unsigned short instance
;
12224 struct route_map
*route_map
=
12225 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12227 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
12228 protocol
= ZEBRA_ROUTE_OSPF
;
12230 protocol
= ZEBRA_ROUTE_TABLE
;
12232 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12233 metric
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
12235 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
12237 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12238 changed
|= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, protocol
,
12240 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
, changed
);
12244 bgp_redistribute_ipv4_ospf_rmap_metric
,
12245 bgp_redistribute_ipv4_ospf_rmap_metric_hidden_cmd
,
12246 "redistribute <ospf|table> (1-65535) route-map WORD metric (0-4294967295)",
12247 "Redistribute information from another routing protocol\n"
12248 "Open Shortest Path First (OSPFv2)\n"
12249 "Non-main Kernel Routing Table\n"
12250 "Instance ID/Table ID\n"
12251 "Route map reference\n"
12252 "Pointer to route-map entries\n"
12253 "Metric for redistributed routes\n"
12254 "Default metric\n")
12256 DEFUN (bgp_redistribute_ipv4_ospf_metric_rmap
,
12257 bgp_redistribute_ipv4_ospf_metric_rmap_cmd
,
12258 "redistribute <ospf|table> (1-65535) metric (0-4294967295) route-map WORD",
12259 "Redistribute information from another routing protocol\n"
12260 "Open Shortest Path First (OSPFv2)\n"
12261 "Non-main Kernel Routing Table\n"
12262 "Instance ID/Table ID\n"
12263 "Metric for redistributed routes\n"
12265 "Route map reference\n"
12266 "Pointer to route-map entries\n")
12268 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12269 int idx_ospf_table
= 1;
12270 int idx_number
= 2;
12271 int idx_number_2
= 4;
12274 struct bgp_redist
*red
;
12275 unsigned short instance
;
12278 struct route_map
*route_map
=
12279 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12281 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
12282 protocol
= ZEBRA_ROUTE_OSPF
;
12284 protocol
= ZEBRA_ROUTE_TABLE
;
12286 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12287 metric
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
12289 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
12290 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, protocol
,
12293 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12294 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
, changed
);
12298 bgp_redistribute_ipv4_ospf_metric_rmap
,
12299 bgp_redistribute_ipv4_ospf_metric_rmap_hidden_cmd
,
12300 "redistribute <ospf|table> (1-65535) metric (0-4294967295) route-map WORD",
12301 "Redistribute information from another routing protocol\n"
12302 "Open Shortest Path First (OSPFv2)\n"
12303 "Non-main Kernel Routing Table\n"
12304 "Instance ID/Table ID\n"
12305 "Metric for redistributed routes\n"
12307 "Route map reference\n"
12308 "Pointer to route-map entries\n")
12310 DEFUN (no_bgp_redistribute_ipv4_ospf
,
12311 no_bgp_redistribute_ipv4_ospf_cmd
,
12312 "no redistribute <ospf|table> (1-65535) [metric (0-4294967295)] [route-map WORD]",
12314 "Redistribute information from another routing protocol\n"
12315 "Open Shortest Path First (OSPFv2)\n"
12316 "Non-main Kernel Routing Table\n"
12317 "Instance ID/Table ID\n"
12318 "Metric for redistributed routes\n"
12320 "Route map reference\n"
12321 "Pointer to route-map entries\n")
12323 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12324 int idx_ospf_table
= 2;
12325 int idx_number
= 3;
12326 unsigned short instance
;
12329 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
12330 protocol
= ZEBRA_ROUTE_OSPF
;
12332 protocol
= ZEBRA_ROUTE_TABLE
;
12334 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12335 return bgp_redistribute_unset(bgp
, AFI_IP
, protocol
, instance
);
12339 no_bgp_redistribute_ipv4_ospf
, no_bgp_redistribute_ipv4_ospf_hidden_cmd
,
12340 "no redistribute <ospf|table> (1-65535) [metric (0-4294967295)] [route-map WORD]",
12342 "Redistribute information from another routing protocol\n"
12343 "Open Shortest Path First (OSPFv2)\n"
12344 "Non-main Kernel Routing Table\n"
12345 "Instance ID/Table ID\n"
12346 "Metric for redistributed routes\n"
12348 "Route map reference\n"
12349 "Pointer to route-map entries\n")
12351 DEFUN (no_bgp_redistribute_ipv4
,
12352 no_bgp_redistribute_ipv4_cmd
,
12353 "no redistribute " FRR_IP_REDIST_STR_BGPD
" [metric (0-4294967295)] [route-map WORD]",
12355 "Redistribute information from another routing protocol\n"
12356 FRR_IP_REDIST_HELP_STR_BGPD
12357 "Metric for redistributed routes\n"
12359 "Route map reference\n"
12360 "Pointer to route-map entries\n")
12362 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12363 int idx_protocol
= 2;
12366 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
12368 vty_out(vty
, "%% Invalid route type\n");
12369 return CMD_WARNING_CONFIG_FAILED
;
12371 return bgp_redistribute_unset(bgp
, AFI_IP
, type
, 0);
12375 no_bgp_redistribute_ipv4
, no_bgp_redistribute_ipv4_hidden_cmd
,
12376 "no redistribute " FRR_IP_REDIST_STR_BGPD
12377 " [metric (0-4294967295)] [route-map WORD]",
12379 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
12380 "Metric for redistributed routes\n"
12382 "Route map reference\n"
12383 "Pointer to route-map entries\n")
12385 DEFUN (bgp_redistribute_ipv6
,
12386 bgp_redistribute_ipv6_cmd
,
12387 "redistribute " FRR_IP6_REDIST_STR_BGPD
,
12388 "Redistribute information from another routing protocol\n"
12389 FRR_IP6_REDIST_HELP_STR_BGPD
)
12391 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12392 int idx_protocol
= 1;
12395 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
12397 vty_out(vty
, "%% Invalid route type\n");
12398 return CMD_WARNING_CONFIG_FAILED
;
12401 bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
12402 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0, false);
12405 DEFUN (bgp_redistribute_ipv6_rmap
,
12406 bgp_redistribute_ipv6_rmap_cmd
,
12407 "redistribute " FRR_IP6_REDIST_STR_BGPD
" route-map WORD",
12408 "Redistribute information from another routing protocol\n"
12409 FRR_IP6_REDIST_HELP_STR_BGPD
12410 "Route map reference\n"
12411 "Pointer to route-map entries\n")
12413 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12414 int idx_protocol
= 1;
12417 struct bgp_redist
*red
;
12419 struct route_map
*route_map
=
12420 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12422 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
12424 vty_out(vty
, "%% Invalid route type\n");
12425 return CMD_WARNING_CONFIG_FAILED
;
12428 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
12430 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12431 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0, changed
);
12434 DEFUN (bgp_redistribute_ipv6_metric
,
12435 bgp_redistribute_ipv6_metric_cmd
,
12436 "redistribute " FRR_IP6_REDIST_STR_BGPD
" metric (0-4294967295)",
12437 "Redistribute information from another routing protocol\n"
12438 FRR_IP6_REDIST_HELP_STR_BGPD
12439 "Metric for redistributed routes\n"
12440 "Default metric\n")
12442 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12443 int idx_protocol
= 1;
12444 int idx_number
= 3;
12447 struct bgp_redist
*red
;
12450 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
12452 vty_out(vty
, "%% Invalid route type\n");
12453 return CMD_WARNING_CONFIG_FAILED
;
12455 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12457 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
12458 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP6
, type
, metric
);
12459 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0, changed
);
12462 DEFUN (bgp_redistribute_ipv6_rmap_metric
,
12463 bgp_redistribute_ipv6_rmap_metric_cmd
,
12464 "redistribute " FRR_IP6_REDIST_STR_BGPD
" route-map WORD metric (0-4294967295)",
12465 "Redistribute information from another routing protocol\n"
12466 FRR_IP6_REDIST_HELP_STR_BGPD
12467 "Route map reference\n"
12468 "Pointer to route-map entries\n"
12469 "Metric for redistributed routes\n"
12470 "Default metric\n")
12472 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12473 int idx_protocol
= 1;
12475 int idx_number
= 5;
12478 struct bgp_redist
*red
;
12480 struct route_map
*route_map
=
12481 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12483 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
12485 vty_out(vty
, "%% Invalid route type\n");
12486 return CMD_WARNING_CONFIG_FAILED
;
12488 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12490 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
12492 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12493 changed
|= bgp_redistribute_metric_set(bgp
, red
, AFI_IP6
, type
,
12495 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0, changed
);
12498 DEFUN (bgp_redistribute_ipv6_metric_rmap
,
12499 bgp_redistribute_ipv6_metric_rmap_cmd
,
12500 "redistribute " FRR_IP6_REDIST_STR_BGPD
" metric (0-4294967295) route-map WORD",
12501 "Redistribute information from another routing protocol\n"
12502 FRR_IP6_REDIST_HELP_STR_BGPD
12503 "Metric for redistributed routes\n"
12505 "Route map reference\n"
12506 "Pointer to route-map entries\n")
12508 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12509 int idx_protocol
= 1;
12510 int idx_number
= 3;
12514 struct bgp_redist
*red
;
12516 struct route_map
*route_map
=
12517 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12519 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
12521 vty_out(vty
, "%% Invalid route type\n");
12522 return CMD_WARNING_CONFIG_FAILED
;
12524 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12526 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
12527 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP6
, SAFI_UNICAST
,
12530 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12531 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0, changed
);
12534 DEFUN (no_bgp_redistribute_ipv6
,
12535 no_bgp_redistribute_ipv6_cmd
,
12536 "no redistribute " FRR_IP6_REDIST_STR_BGPD
" [metric (0-4294967295)] [route-map WORD]",
12538 "Redistribute information from another routing protocol\n"
12539 FRR_IP6_REDIST_HELP_STR_BGPD
12540 "Metric for redistributed routes\n"
12542 "Route map reference\n"
12543 "Pointer to route-map entries\n")
12545 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12546 int idx_protocol
= 2;
12549 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
12551 vty_out(vty
, "%% Invalid route type\n");
12552 return CMD_WARNING_CONFIG_FAILED
;
12555 return bgp_redistribute_unset(bgp
, AFI_IP6
, type
, 0);
12558 void bgp_config_write_redistribute(struct vty
*vty
, struct bgp
*bgp
, afi_t afi
,
12563 /* Unicast redistribution only. */
12564 if (safi
!= SAFI_UNICAST
)
12567 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++) {
12568 /* Redistribute BGP does not make sense. */
12569 if (i
!= ZEBRA_ROUTE_BGP
) {
12570 struct list
*red_list
;
12571 struct listnode
*node
;
12572 struct bgp_redist
*red
;
12574 red_list
= bgp
->redist
[afi
][i
];
12578 for (ALL_LIST_ELEMENTS_RO(red_list
, node
, red
)) {
12579 /* "redistribute" configuration. */
12580 vty_out(vty
, " redistribute %s",
12581 zebra_route_string(i
));
12583 vty_out(vty
, " %d", red
->instance
);
12584 if (red
->redist_metric_flag
)
12585 vty_out(vty
, " metric %u",
12586 red
->redist_metric
);
12587 if (red
->rmap
.name
)
12588 vty_out(vty
, " route-map %s",
12590 vty_out(vty
, "\n");
12596 /* This is part of the address-family block (unicast only) */
12597 void bgp_vpn_policy_config_write_afi(struct vty
*vty
, struct bgp
*bgp
,
12602 if (bgp
->vpn_policy
[afi
].rmap_name
[BGP_VPN_POLICY_DIR_FROMVPN
]) {
12603 if (listcount(bgp
->vpn_policy
[afi
].import_vrf
))
12604 vty_out(vty
, "%*simport vrf route-map %s\n", indent
, "",
12605 bgp
->vpn_policy
[afi
]
12606 .rmap_name
[BGP_VPN_POLICY_DIR_FROMVPN
]);
12608 vty_out(vty
, "%*sroute-map vpn import %s\n", indent
, "",
12609 bgp
->vpn_policy
[afi
]
12610 .rmap_name
[BGP_VPN_POLICY_DIR_FROMVPN
]);
12612 if (CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
12613 BGP_CONFIG_VRF_TO_VRF_IMPORT
)
12614 || CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
12615 BGP_CONFIG_VRF_TO_VRF_EXPORT
))
12618 if (CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
12619 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
)) {
12621 vty_out(vty
, "%*slabel vpn export %s\n", indent
, "", "auto");
12624 if (bgp
->vpn_policy
[afi
].tovpn_label
!= MPLS_LABEL_NONE
) {
12625 vty_out(vty
, "%*slabel vpn export %u\n", indent
, "",
12626 bgp
->vpn_policy
[afi
].tovpn_label
);
12629 if (CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
12630 BGP_VPN_POLICY_TOVPN_RD_SET
)) {
12631 char buf
[RD_ADDRSTRLEN
];
12632 vty_out(vty
, "%*srd vpn export %s\n", indent
, "",
12633 prefix_rd2str(&bgp
->vpn_policy
[afi
].tovpn_rd
, buf
,
12636 if (CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
12637 BGP_VPN_POLICY_TOVPN_NEXTHOP_SET
)) {
12639 char buf
[PREFIX_STRLEN
];
12640 if (inet_ntop(bgp
->vpn_policy
[afi
].tovpn_nexthop
.family
,
12641 &bgp
->vpn_policy
[afi
].tovpn_nexthop
.u
.prefix
, buf
,
12644 vty_out(vty
, "%*snexthop vpn export %s\n",
12648 if (bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
]
12649 && bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
]
12651 bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
],
12652 bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
])) {
12654 char *b
= ecommunity_ecom2str(
12655 bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
],
12656 ECOMMUNITY_FORMAT_ROUTE_MAP
, ECOMMUNITY_ROUTE_TARGET
);
12657 vty_out(vty
, "%*srt vpn both %s\n", indent
, "", b
);
12658 XFREE(MTYPE_ECOMMUNITY_STR
, b
);
12660 if (bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
]) {
12661 char *b
= ecommunity_ecom2str(
12662 bgp
->vpn_policy
[afi
]
12663 .rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
],
12664 ECOMMUNITY_FORMAT_ROUTE_MAP
,
12665 ECOMMUNITY_ROUTE_TARGET
);
12666 vty_out(vty
, "%*srt vpn import %s\n", indent
, "", b
);
12667 XFREE(MTYPE_ECOMMUNITY_STR
, b
);
12669 if (bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
]) {
12670 char *b
= ecommunity_ecom2str(
12671 bgp
->vpn_policy
[afi
]
12672 .rtlist
[BGP_VPN_POLICY_DIR_TOVPN
],
12673 ECOMMUNITY_FORMAT_ROUTE_MAP
,
12674 ECOMMUNITY_ROUTE_TARGET
);
12675 vty_out(vty
, "%*srt vpn export %s\n", indent
, "", b
);
12676 XFREE(MTYPE_ECOMMUNITY_STR
, b
);
12680 if (bgp
->vpn_policy
[afi
].rmap_name
[BGP_VPN_POLICY_DIR_TOVPN
])
12681 vty_out(vty
, "%*sroute-map vpn export %s\n", indent
, "",
12682 bgp
->vpn_policy
[afi
]
12683 .rmap_name
[BGP_VPN_POLICY_DIR_TOVPN
]);
12685 if (bgp
->vpn_policy
[afi
].import_redirect_rtlist
) {
12686 char *b
= ecommunity_ecom2str(
12687 bgp
->vpn_policy
[afi
]
12688 .import_redirect_rtlist
,
12689 ECOMMUNITY_FORMAT_ROUTE_MAP
,
12690 ECOMMUNITY_ROUTE_TARGET
);
12692 vty_out(vty
, "%*srt redirect import %s\n", indent
, "", b
);
12693 XFREE(MTYPE_ECOMMUNITY_STR
, b
);
12698 /* BGP node structure. */
12699 static struct cmd_node bgp_node
= {
12700 BGP_NODE
, "%s(config-router)# ", 1,
12703 static struct cmd_node bgp_ipv4_unicast_node
= {
12704 BGP_IPV4_NODE
, "%s(config-router-af)# ", 1,
12707 static struct cmd_node bgp_ipv4_multicast_node
= {
12708 BGP_IPV4M_NODE
, "%s(config-router-af)# ", 1,
12711 static struct cmd_node bgp_ipv4_labeled_unicast_node
= {
12712 BGP_IPV4L_NODE
, "%s(config-router-af)# ", 1,
12715 static struct cmd_node bgp_ipv6_unicast_node
= {
12716 BGP_IPV6_NODE
, "%s(config-router-af)# ", 1,
12719 static struct cmd_node bgp_ipv6_multicast_node
= {
12720 BGP_IPV6M_NODE
, "%s(config-router-af)# ", 1,
12723 static struct cmd_node bgp_ipv6_labeled_unicast_node
= {
12724 BGP_IPV6L_NODE
, "%s(config-router-af)# ", 1,
12727 static struct cmd_node bgp_vpnv4_node
= {BGP_VPNV4_NODE
,
12728 "%s(config-router-af)# ", 1};
12730 static struct cmd_node bgp_vpnv6_node
= {BGP_VPNV6_NODE
,
12731 "%s(config-router-af-vpnv6)# ", 1};
12733 static struct cmd_node bgp_evpn_node
= {BGP_EVPN_NODE
,
12734 "%s(config-router-evpn)# ", 1};
12736 static struct cmd_node bgp_evpn_vni_node
= {BGP_EVPN_VNI_NODE
,
12737 "%s(config-router-af-vni)# ", 1};
12739 static struct cmd_node bgp_flowspecv4_node
= {BGP_FLOWSPECV4_NODE
,
12740 "%s(config-router-af)# ", 1};
12742 static struct cmd_node bgp_flowspecv6_node
= {BGP_FLOWSPECV6_NODE
,
12743 "%s(config-router-af-vpnv6)# ", 1};
12745 static void community_list_vty(void);
12747 static void bgp_ac_neighbor(vector comps
, struct cmd_token
*token
)
12751 struct listnode
*lnbgp
, *lnpeer
;
12753 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, lnbgp
, bgp
)) {
12754 for (ALL_LIST_ELEMENTS_RO(bgp
->peer
, lnpeer
, peer
)) {
12755 /* only provide suggestions on the appropriate input
12757 * they'll otherwise show up multiple times */
12758 enum cmd_token_type match_type
;
12759 char *name
= peer
->host
;
12761 if (peer
->conf_if
) {
12762 match_type
= VARIABLE_TKN
;
12763 name
= peer
->conf_if
;
12764 } else if (strchr(peer
->host
, ':'))
12765 match_type
= IPV6_TKN
;
12767 match_type
= IPV4_TKN
;
12769 if (token
->type
!= match_type
)
12772 vector_set(comps
, XSTRDUP(MTYPE_COMPLETION
, name
));
12777 static const struct cmd_variable_handler bgp_var_neighbor
[] = {
12778 {.varname
= "neighbor", .completions
= bgp_ac_neighbor
},
12779 {.varname
= "neighbors", .completions
= bgp_ac_neighbor
},
12780 {.varname
= "peer", .completions
= bgp_ac_neighbor
},
12781 {.completions
= NULL
}};
12783 static void bgp_ac_peergroup(vector comps
, struct cmd_token
*token
)
12786 struct peer_group
*group
;
12787 struct listnode
*lnbgp
, *lnpeer
;
12789 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, lnbgp
, bgp
)) {
12790 for (ALL_LIST_ELEMENTS_RO(bgp
->group
, lnpeer
, group
))
12791 vector_set(comps
, XSTRDUP(MTYPE_COMPLETION
,
12796 static const struct cmd_variable_handler bgp_var_peergroup
[] = {
12797 {.tokenname
= "PGNAME", .completions
= bgp_ac_peergroup
},
12798 {.completions
= NULL
} };
12800 void bgp_vty_init(void)
12802 cmd_variable_handler_register(bgp_var_neighbor
);
12803 cmd_variable_handler_register(bgp_var_peergroup
);
12805 /* Install bgp top node. */
12806 install_node(&bgp_node
, bgp_config_write
);
12807 install_node(&bgp_ipv4_unicast_node
, NULL
);
12808 install_node(&bgp_ipv4_multicast_node
, NULL
);
12809 install_node(&bgp_ipv4_labeled_unicast_node
, NULL
);
12810 install_node(&bgp_ipv6_unicast_node
, NULL
);
12811 install_node(&bgp_ipv6_multicast_node
, NULL
);
12812 install_node(&bgp_ipv6_labeled_unicast_node
, NULL
);
12813 install_node(&bgp_vpnv4_node
, NULL
);
12814 install_node(&bgp_vpnv6_node
, NULL
);
12815 install_node(&bgp_evpn_node
, NULL
);
12816 install_node(&bgp_evpn_vni_node
, NULL
);
12817 install_node(&bgp_flowspecv4_node
, NULL
);
12818 install_node(&bgp_flowspecv6_node
, NULL
);
12820 /* Install default VTY commands to new nodes. */
12821 install_default(BGP_NODE
);
12822 install_default(BGP_IPV4_NODE
);
12823 install_default(BGP_IPV4M_NODE
);
12824 install_default(BGP_IPV4L_NODE
);
12825 install_default(BGP_IPV6_NODE
);
12826 install_default(BGP_IPV6M_NODE
);
12827 install_default(BGP_IPV6L_NODE
);
12828 install_default(BGP_VPNV4_NODE
);
12829 install_default(BGP_VPNV6_NODE
);
12830 install_default(BGP_FLOWSPECV4_NODE
);
12831 install_default(BGP_FLOWSPECV6_NODE
);
12832 install_default(BGP_EVPN_NODE
);
12833 install_default(BGP_EVPN_VNI_NODE
);
12835 /* "bgp local-mac" hidden commands. */
12836 install_element(CONFIG_NODE
, &bgp_local_mac_cmd
);
12837 install_element(CONFIG_NODE
, &no_bgp_local_mac_cmd
);
12839 /* bgp route-map delay-timer commands. */
12840 install_element(CONFIG_NODE
, &bgp_set_route_map_delay_timer_cmd
);
12841 install_element(CONFIG_NODE
, &no_bgp_set_route_map_delay_timer_cmd
);
12843 /* Dummy commands (Currently not supported) */
12844 install_element(BGP_NODE
, &no_synchronization_cmd
);
12845 install_element(BGP_NODE
, &no_auto_summary_cmd
);
12847 /* "router bgp" commands. */
12848 install_element(CONFIG_NODE
, &router_bgp_cmd
);
12850 /* "no router bgp" commands. */
12851 install_element(CONFIG_NODE
, &no_router_bgp_cmd
);
12853 /* "bgp router-id" commands. */
12854 install_element(BGP_NODE
, &bgp_router_id_cmd
);
12855 install_element(BGP_NODE
, &no_bgp_router_id_cmd
);
12857 /* "bgp cluster-id" commands. */
12858 install_element(BGP_NODE
, &bgp_cluster_id_cmd
);
12859 install_element(BGP_NODE
, &no_bgp_cluster_id_cmd
);
12861 /* "bgp confederation" commands. */
12862 install_element(BGP_NODE
, &bgp_confederation_identifier_cmd
);
12863 install_element(BGP_NODE
, &no_bgp_confederation_identifier_cmd
);
12865 /* "bgp confederation peers" commands. */
12866 install_element(BGP_NODE
, &bgp_confederation_peers_cmd
);
12867 install_element(BGP_NODE
, &no_bgp_confederation_peers_cmd
);
12869 /* bgp max-med command */
12870 install_element(BGP_NODE
, &bgp_maxmed_admin_cmd
);
12871 install_element(BGP_NODE
, &no_bgp_maxmed_admin_cmd
);
12872 install_element(BGP_NODE
, &bgp_maxmed_admin_medv_cmd
);
12873 install_element(BGP_NODE
, &bgp_maxmed_onstartup_cmd
);
12874 install_element(BGP_NODE
, &no_bgp_maxmed_onstartup_cmd
);
12876 /* bgp disable-ebgp-connected-nh-check */
12877 install_element(BGP_NODE
, &bgp_disable_connected_route_check_cmd
);
12878 install_element(BGP_NODE
, &no_bgp_disable_connected_route_check_cmd
);
12880 /* bgp update-delay command */
12881 install_element(BGP_NODE
, &bgp_update_delay_cmd
);
12882 install_element(BGP_NODE
, &no_bgp_update_delay_cmd
);
12883 install_element(BGP_NODE
, &bgp_update_delay_establish_wait_cmd
);
12885 install_element(BGP_NODE
, &bgp_wpkt_quanta_cmd
);
12886 install_element(BGP_NODE
, &no_bgp_wpkt_quanta_cmd
);
12887 install_element(BGP_NODE
, &bgp_rpkt_quanta_cmd
);
12888 install_element(BGP_NODE
, &no_bgp_rpkt_quanta_cmd
);
12890 install_element(BGP_NODE
, &bgp_coalesce_time_cmd
);
12891 install_element(BGP_NODE
, &no_bgp_coalesce_time_cmd
);
12893 /* "maximum-paths" commands. */
12894 install_element(BGP_NODE
, &bgp_maxpaths_hidden_cmd
);
12895 install_element(BGP_NODE
, &no_bgp_maxpaths_hidden_cmd
);
12896 install_element(BGP_IPV4_NODE
, &bgp_maxpaths_cmd
);
12897 install_element(BGP_IPV4_NODE
, &no_bgp_maxpaths_cmd
);
12898 install_element(BGP_IPV6_NODE
, &bgp_maxpaths_cmd
);
12899 install_element(BGP_IPV6_NODE
, &no_bgp_maxpaths_cmd
);
12900 install_element(BGP_NODE
, &bgp_maxpaths_ibgp_hidden_cmd
);
12901 install_element(BGP_NODE
, &bgp_maxpaths_ibgp_cluster_hidden_cmd
);
12902 install_element(BGP_NODE
, &no_bgp_maxpaths_ibgp_hidden_cmd
);
12903 install_element(BGP_IPV4_NODE
, &bgp_maxpaths_ibgp_cmd
);
12904 install_element(BGP_IPV4_NODE
, &bgp_maxpaths_ibgp_cluster_cmd
);
12905 install_element(BGP_IPV4_NODE
, &no_bgp_maxpaths_ibgp_cmd
);
12906 install_element(BGP_IPV6_NODE
, &bgp_maxpaths_ibgp_cmd
);
12907 install_element(BGP_IPV6_NODE
, &bgp_maxpaths_ibgp_cluster_cmd
);
12908 install_element(BGP_IPV6_NODE
, &no_bgp_maxpaths_ibgp_cmd
);
12910 install_element(BGP_IPV6L_NODE
, &bgp_maxpaths_cmd
);
12911 install_element(BGP_IPV6L_NODE
, &no_bgp_maxpaths_cmd
);
12912 install_element(BGP_IPV6L_NODE
, &bgp_maxpaths_ibgp_cmd
);
12913 install_element(BGP_IPV6L_NODE
, &bgp_maxpaths_ibgp_cluster_cmd
);
12914 install_element(BGP_IPV6L_NODE
, &no_bgp_maxpaths_ibgp_cmd
);
12916 /* "timers bgp" commands. */
12917 install_element(BGP_NODE
, &bgp_timers_cmd
);
12918 install_element(BGP_NODE
, &no_bgp_timers_cmd
);
12920 /* route-map delay-timer commands - per instance for backwards compat.
12922 install_element(BGP_NODE
, &bgp_set_route_map_delay_timer_cmd
);
12923 install_element(BGP_NODE
, &no_bgp_set_route_map_delay_timer_cmd
);
12925 /* "bgp client-to-client reflection" commands */
12926 install_element(BGP_NODE
, &no_bgp_client_to_client_reflection_cmd
);
12927 install_element(BGP_NODE
, &bgp_client_to_client_reflection_cmd
);
12929 /* "bgp always-compare-med" commands */
12930 install_element(BGP_NODE
, &bgp_always_compare_med_cmd
);
12931 install_element(BGP_NODE
, &no_bgp_always_compare_med_cmd
);
12933 /* bgp ebgp-requires-policy */
12934 install_element(BGP_NODE
, &bgp_ebgp_requires_policy_cmd
);
12935 install_element(BGP_NODE
, &no_bgp_ebgp_requires_policy_cmd
);
12937 /* "bgp deterministic-med" commands */
12938 install_element(BGP_NODE
, &bgp_deterministic_med_cmd
);
12939 install_element(BGP_NODE
, &no_bgp_deterministic_med_cmd
);
12941 /* "bgp graceful-restart" commands */
12942 install_element(BGP_NODE
, &bgp_graceful_restart_cmd
);
12943 install_element(BGP_NODE
, &no_bgp_graceful_restart_cmd
);
12944 install_element(BGP_NODE
, &bgp_graceful_restart_stalepath_time_cmd
);
12945 install_element(BGP_NODE
, &no_bgp_graceful_restart_stalepath_time_cmd
);
12946 install_element(BGP_NODE
, &bgp_graceful_restart_restart_time_cmd
);
12947 install_element(BGP_NODE
, &no_bgp_graceful_restart_restart_time_cmd
);
12949 install_element(BGP_NODE
, &bgp_graceful_restart_preserve_fw_cmd
);
12950 install_element(BGP_NODE
, &no_bgp_graceful_restart_preserve_fw_cmd
);
12952 /* "bgp graceful-shutdown" commands */
12953 install_element(BGP_NODE
, &bgp_graceful_shutdown_cmd
);
12954 install_element(BGP_NODE
, &no_bgp_graceful_shutdown_cmd
);
12956 /* "bgp fast-external-failover" commands */
12957 install_element(BGP_NODE
, &bgp_fast_external_failover_cmd
);
12958 install_element(BGP_NODE
, &no_bgp_fast_external_failover_cmd
);
12960 /* "bgp bestpath compare-routerid" commands */
12961 install_element(BGP_NODE
, &bgp_bestpath_compare_router_id_cmd
);
12962 install_element(BGP_NODE
, &no_bgp_bestpath_compare_router_id_cmd
);
12964 /* "bgp bestpath as-path ignore" commands */
12965 install_element(BGP_NODE
, &bgp_bestpath_aspath_ignore_cmd
);
12966 install_element(BGP_NODE
, &no_bgp_bestpath_aspath_ignore_cmd
);
12968 /* "bgp bestpath as-path confed" commands */
12969 install_element(BGP_NODE
, &bgp_bestpath_aspath_confed_cmd
);
12970 install_element(BGP_NODE
, &no_bgp_bestpath_aspath_confed_cmd
);
12972 /* "bgp bestpath as-path multipath-relax" commands */
12973 install_element(BGP_NODE
, &bgp_bestpath_aspath_multipath_relax_cmd
);
12974 install_element(BGP_NODE
, &no_bgp_bestpath_aspath_multipath_relax_cmd
);
12976 /* "bgp log-neighbor-changes" commands */
12977 install_element(BGP_NODE
, &bgp_log_neighbor_changes_cmd
);
12978 install_element(BGP_NODE
, &no_bgp_log_neighbor_changes_cmd
);
12980 /* "bgp bestpath med" commands */
12981 install_element(BGP_NODE
, &bgp_bestpath_med_cmd
);
12982 install_element(BGP_NODE
, &no_bgp_bestpath_med_cmd
);
12984 /* "no bgp default ipv4-unicast" commands. */
12985 install_element(BGP_NODE
, &no_bgp_default_ipv4_unicast_cmd
);
12986 install_element(BGP_NODE
, &bgp_default_ipv4_unicast_cmd
);
12988 /* "bgp network import-check" commands. */
12989 install_element(BGP_NODE
, &bgp_network_import_check_cmd
);
12990 install_element(BGP_NODE
, &bgp_network_import_check_exact_cmd
);
12991 install_element(BGP_NODE
, &no_bgp_network_import_check_cmd
);
12993 /* "bgp default local-preference" commands. */
12994 install_element(BGP_NODE
, &bgp_default_local_preference_cmd
);
12995 install_element(BGP_NODE
, &no_bgp_default_local_preference_cmd
);
12997 /* bgp default show-hostname */
12998 install_element(BGP_NODE
, &bgp_default_show_hostname_cmd
);
12999 install_element(BGP_NODE
, &no_bgp_default_show_hostname_cmd
);
13001 /* "bgp default subgroup-pkt-queue-max" commands. */
13002 install_element(BGP_NODE
, &bgp_default_subgroup_pkt_queue_max_cmd
);
13003 install_element(BGP_NODE
, &no_bgp_default_subgroup_pkt_queue_max_cmd
);
13005 /* bgp ibgp-allow-policy-mods command */
13006 install_element(BGP_NODE
, &bgp_rr_allow_outbound_policy_cmd
);
13007 install_element(BGP_NODE
, &no_bgp_rr_allow_outbound_policy_cmd
);
13009 /* "bgp listen limit" commands. */
13010 install_element(BGP_NODE
, &bgp_listen_limit_cmd
);
13011 install_element(BGP_NODE
, &no_bgp_listen_limit_cmd
);
13013 /* "bgp listen range" commands. */
13014 install_element(BGP_NODE
, &bgp_listen_range_cmd
);
13015 install_element(BGP_NODE
, &no_bgp_listen_range_cmd
);
13017 /* "bgp default shutdown" command */
13018 install_element(BGP_NODE
, &bgp_default_shutdown_cmd
);
13020 /* "neighbor remote-as" commands. */
13021 install_element(BGP_NODE
, &neighbor_remote_as_cmd
);
13022 install_element(BGP_NODE
, &neighbor_interface_config_cmd
);
13023 install_element(BGP_NODE
, &neighbor_interface_config_v6only_cmd
);
13024 install_element(BGP_NODE
, &neighbor_interface_config_remote_as_cmd
);
13025 install_element(BGP_NODE
,
13026 &neighbor_interface_v6only_config_remote_as_cmd
);
13027 install_element(BGP_NODE
, &no_neighbor_cmd
);
13028 install_element(BGP_NODE
, &no_neighbor_interface_config_cmd
);
13030 /* "neighbor peer-group" commands. */
13031 install_element(BGP_NODE
, &neighbor_peer_group_cmd
);
13032 install_element(BGP_NODE
, &no_neighbor_peer_group_cmd
);
13033 install_element(BGP_NODE
,
13034 &no_neighbor_interface_peer_group_remote_as_cmd
);
13036 /* "neighbor local-as" commands. */
13037 install_element(BGP_NODE
, &neighbor_local_as_cmd
);
13038 install_element(BGP_NODE
, &neighbor_local_as_no_prepend_cmd
);
13039 install_element(BGP_NODE
, &neighbor_local_as_no_prepend_replace_as_cmd
);
13040 install_element(BGP_NODE
, &no_neighbor_local_as_cmd
);
13042 /* "neighbor solo" commands. */
13043 install_element(BGP_NODE
, &neighbor_solo_cmd
);
13044 install_element(BGP_NODE
, &no_neighbor_solo_cmd
);
13046 /* "neighbor password" commands. */
13047 install_element(BGP_NODE
, &neighbor_password_cmd
);
13048 install_element(BGP_NODE
, &no_neighbor_password_cmd
);
13050 /* "neighbor activate" commands. */
13051 install_element(BGP_NODE
, &neighbor_activate_hidden_cmd
);
13052 install_element(BGP_IPV4_NODE
, &neighbor_activate_cmd
);
13053 install_element(BGP_IPV4M_NODE
, &neighbor_activate_cmd
);
13054 install_element(BGP_IPV4L_NODE
, &neighbor_activate_cmd
);
13055 install_element(BGP_IPV6_NODE
, &neighbor_activate_cmd
);
13056 install_element(BGP_IPV6M_NODE
, &neighbor_activate_cmd
);
13057 install_element(BGP_IPV6L_NODE
, &neighbor_activate_cmd
);
13058 install_element(BGP_VPNV4_NODE
, &neighbor_activate_cmd
);
13059 install_element(BGP_VPNV6_NODE
, &neighbor_activate_cmd
);
13060 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_activate_cmd
);
13061 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_activate_cmd
);
13062 install_element(BGP_EVPN_NODE
, &neighbor_activate_cmd
);
13064 /* "no neighbor activate" commands. */
13065 install_element(BGP_NODE
, &no_neighbor_activate_hidden_cmd
);
13066 install_element(BGP_IPV4_NODE
, &no_neighbor_activate_cmd
);
13067 install_element(BGP_IPV4M_NODE
, &no_neighbor_activate_cmd
);
13068 install_element(BGP_IPV4L_NODE
, &no_neighbor_activate_cmd
);
13069 install_element(BGP_IPV6_NODE
, &no_neighbor_activate_cmd
);
13070 install_element(BGP_IPV6M_NODE
, &no_neighbor_activate_cmd
);
13071 install_element(BGP_IPV6L_NODE
, &no_neighbor_activate_cmd
);
13072 install_element(BGP_VPNV4_NODE
, &no_neighbor_activate_cmd
);
13073 install_element(BGP_VPNV6_NODE
, &no_neighbor_activate_cmd
);
13074 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_activate_cmd
);
13075 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_activate_cmd
);
13076 install_element(BGP_EVPN_NODE
, &no_neighbor_activate_cmd
);
13078 /* "neighbor peer-group" set commands. */
13079 install_element(BGP_NODE
, &neighbor_set_peer_group_cmd
);
13080 install_element(BGP_IPV4_NODE
, &neighbor_set_peer_group_hidden_cmd
);
13081 install_element(BGP_IPV4M_NODE
, &neighbor_set_peer_group_hidden_cmd
);
13082 install_element(BGP_IPV6_NODE
, &neighbor_set_peer_group_hidden_cmd
);
13083 install_element(BGP_IPV6M_NODE
, &neighbor_set_peer_group_hidden_cmd
);
13084 install_element(BGP_IPV6L_NODE
, &neighbor_set_peer_group_hidden_cmd
);
13085 install_element(BGP_VPNV4_NODE
, &neighbor_set_peer_group_hidden_cmd
);
13086 install_element(BGP_VPNV6_NODE
, &neighbor_set_peer_group_hidden_cmd
);
13087 install_element(BGP_FLOWSPECV4_NODE
,
13088 &neighbor_set_peer_group_hidden_cmd
);
13089 install_element(BGP_FLOWSPECV6_NODE
,
13090 &neighbor_set_peer_group_hidden_cmd
);
13092 /* "no neighbor peer-group unset" commands. */
13093 install_element(BGP_NODE
, &no_neighbor_set_peer_group_cmd
);
13094 install_element(BGP_IPV4_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
13095 install_element(BGP_IPV4M_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
13096 install_element(BGP_IPV6_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
13097 install_element(BGP_IPV6M_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
13098 install_element(BGP_IPV6L_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
13099 install_element(BGP_VPNV4_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
13100 install_element(BGP_VPNV6_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
13101 install_element(BGP_FLOWSPECV4_NODE
,
13102 &no_neighbor_set_peer_group_hidden_cmd
);
13103 install_element(BGP_FLOWSPECV6_NODE
,
13104 &no_neighbor_set_peer_group_hidden_cmd
);
13106 /* "neighbor softreconfiguration inbound" commands.*/
13107 install_element(BGP_NODE
, &neighbor_soft_reconfiguration_hidden_cmd
);
13108 install_element(BGP_NODE
, &no_neighbor_soft_reconfiguration_hidden_cmd
);
13109 install_element(BGP_IPV4_NODE
, &neighbor_soft_reconfiguration_cmd
);
13110 install_element(BGP_IPV4_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
13111 install_element(BGP_IPV4L_NODE
, &neighbor_soft_reconfiguration_cmd
);
13112 install_element(BGP_IPV4L_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
13113 install_element(BGP_IPV4M_NODE
, &neighbor_soft_reconfiguration_cmd
);
13114 install_element(BGP_IPV4M_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
13115 install_element(BGP_IPV6_NODE
, &neighbor_soft_reconfiguration_cmd
);
13116 install_element(BGP_IPV6_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
13117 install_element(BGP_IPV6M_NODE
, &neighbor_soft_reconfiguration_cmd
);
13118 install_element(BGP_IPV6M_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
13119 install_element(BGP_IPV6L_NODE
, &neighbor_soft_reconfiguration_cmd
);
13120 install_element(BGP_IPV6L_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
13121 install_element(BGP_VPNV4_NODE
, &neighbor_soft_reconfiguration_cmd
);
13122 install_element(BGP_VPNV4_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
13123 install_element(BGP_VPNV6_NODE
, &neighbor_soft_reconfiguration_cmd
);
13124 install_element(BGP_VPNV6_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
13125 install_element(BGP_FLOWSPECV4_NODE
,
13126 &neighbor_soft_reconfiguration_cmd
);
13127 install_element(BGP_FLOWSPECV4_NODE
,
13128 &no_neighbor_soft_reconfiguration_cmd
);
13129 install_element(BGP_FLOWSPECV6_NODE
,
13130 &neighbor_soft_reconfiguration_cmd
);
13131 install_element(BGP_FLOWSPECV6_NODE
,
13132 &no_neighbor_soft_reconfiguration_cmd
);
13133 install_element(BGP_EVPN_NODE
, &neighbor_soft_reconfiguration_cmd
);
13134 install_element(BGP_EVPN_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
13136 /* "neighbor attribute-unchanged" commands. */
13137 install_element(BGP_NODE
, &neighbor_attr_unchanged_hidden_cmd
);
13138 install_element(BGP_NODE
, &no_neighbor_attr_unchanged_hidden_cmd
);
13139 install_element(BGP_IPV4_NODE
, &neighbor_attr_unchanged_cmd
);
13140 install_element(BGP_IPV4_NODE
, &no_neighbor_attr_unchanged_cmd
);
13141 install_element(BGP_IPV4M_NODE
, &neighbor_attr_unchanged_cmd
);
13142 install_element(BGP_IPV4M_NODE
, &no_neighbor_attr_unchanged_cmd
);
13143 install_element(BGP_IPV4L_NODE
, &neighbor_attr_unchanged_cmd
);
13144 install_element(BGP_IPV4L_NODE
, &no_neighbor_attr_unchanged_cmd
);
13145 install_element(BGP_IPV6_NODE
, &neighbor_attr_unchanged_cmd
);
13146 install_element(BGP_IPV6_NODE
, &no_neighbor_attr_unchanged_cmd
);
13147 install_element(BGP_IPV6M_NODE
, &neighbor_attr_unchanged_cmd
);
13148 install_element(BGP_IPV6M_NODE
, &no_neighbor_attr_unchanged_cmd
);
13149 install_element(BGP_IPV6L_NODE
, &neighbor_attr_unchanged_cmd
);
13150 install_element(BGP_IPV6L_NODE
, &no_neighbor_attr_unchanged_cmd
);
13151 install_element(BGP_VPNV4_NODE
, &neighbor_attr_unchanged_cmd
);
13152 install_element(BGP_VPNV4_NODE
, &no_neighbor_attr_unchanged_cmd
);
13153 install_element(BGP_VPNV6_NODE
, &neighbor_attr_unchanged_cmd
);
13154 install_element(BGP_VPNV6_NODE
, &no_neighbor_attr_unchanged_cmd
);
13156 install_element(BGP_EVPN_NODE
, &neighbor_attr_unchanged_cmd
);
13157 install_element(BGP_EVPN_NODE
, &no_neighbor_attr_unchanged_cmd
);
13159 /* "nexthop-local unchanged" commands */
13160 install_element(BGP_IPV6_NODE
, &neighbor_nexthop_local_unchanged_cmd
);
13161 install_element(BGP_IPV6_NODE
,
13162 &no_neighbor_nexthop_local_unchanged_cmd
);
13164 /* "neighbor next-hop-self" commands. */
13165 install_element(BGP_NODE
, &neighbor_nexthop_self_hidden_cmd
);
13166 install_element(BGP_NODE
, &no_neighbor_nexthop_self_hidden_cmd
);
13167 install_element(BGP_IPV4_NODE
, &neighbor_nexthop_self_cmd
);
13168 install_element(BGP_IPV4_NODE
, &no_neighbor_nexthop_self_cmd
);
13169 install_element(BGP_IPV4M_NODE
, &neighbor_nexthop_self_cmd
);
13170 install_element(BGP_IPV4M_NODE
, &no_neighbor_nexthop_self_cmd
);
13171 install_element(BGP_IPV4L_NODE
, &neighbor_nexthop_self_cmd
);
13172 install_element(BGP_IPV4L_NODE
, &no_neighbor_nexthop_self_cmd
);
13173 install_element(BGP_IPV6_NODE
, &neighbor_nexthop_self_cmd
);
13174 install_element(BGP_IPV6_NODE
, &no_neighbor_nexthop_self_cmd
);
13175 install_element(BGP_IPV6M_NODE
, &neighbor_nexthop_self_cmd
);
13176 install_element(BGP_IPV6M_NODE
, &no_neighbor_nexthop_self_cmd
);
13177 install_element(BGP_IPV6L_NODE
, &neighbor_nexthop_self_cmd
);
13178 install_element(BGP_IPV6L_NODE
, &no_neighbor_nexthop_self_cmd
);
13179 install_element(BGP_VPNV4_NODE
, &neighbor_nexthop_self_cmd
);
13180 install_element(BGP_VPNV4_NODE
, &no_neighbor_nexthop_self_cmd
);
13181 install_element(BGP_VPNV6_NODE
, &neighbor_nexthop_self_cmd
);
13182 install_element(BGP_VPNV6_NODE
, &no_neighbor_nexthop_self_cmd
);
13183 install_element(BGP_EVPN_NODE
, &neighbor_nexthop_self_cmd
);
13184 install_element(BGP_EVPN_NODE
, &no_neighbor_nexthop_self_cmd
);
13186 /* "neighbor next-hop-self force" commands. */
13187 install_element(BGP_NODE
, &neighbor_nexthop_self_force_hidden_cmd
);
13188 install_element(BGP_NODE
, &no_neighbor_nexthop_self_force_hidden_cmd
);
13189 install_element(BGP_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
13190 install_element(BGP_NODE
, &no_neighbor_nexthop_self_all_hidden_cmd
);
13191 install_element(BGP_IPV4_NODE
, &neighbor_nexthop_self_force_cmd
);
13192 install_element(BGP_IPV4_NODE
, &no_neighbor_nexthop_self_force_cmd
);
13193 install_element(BGP_IPV4M_NODE
, &neighbor_nexthop_self_force_cmd
);
13194 install_element(BGP_IPV4M_NODE
, &no_neighbor_nexthop_self_force_cmd
);
13195 install_element(BGP_IPV4L_NODE
, &neighbor_nexthop_self_force_cmd
);
13196 install_element(BGP_IPV4L_NODE
, &no_neighbor_nexthop_self_force_cmd
);
13197 install_element(BGP_IPV6_NODE
, &neighbor_nexthop_self_force_cmd
);
13198 install_element(BGP_IPV6_NODE
, &no_neighbor_nexthop_self_force_cmd
);
13199 install_element(BGP_IPV6M_NODE
, &neighbor_nexthop_self_force_cmd
);
13200 install_element(BGP_IPV6M_NODE
, &no_neighbor_nexthop_self_force_cmd
);
13201 install_element(BGP_IPV6L_NODE
, &neighbor_nexthop_self_force_cmd
);
13202 install_element(BGP_IPV6L_NODE
, &no_neighbor_nexthop_self_force_cmd
);
13203 install_element(BGP_VPNV4_NODE
, &neighbor_nexthop_self_force_cmd
);
13204 install_element(BGP_VPNV4_NODE
, &no_neighbor_nexthop_self_force_cmd
);
13205 install_element(BGP_VPNV6_NODE
, &neighbor_nexthop_self_force_cmd
);
13206 install_element(BGP_VPNV6_NODE
, &no_neighbor_nexthop_self_force_cmd
);
13208 /* "neighbor as-override" commands. */
13209 install_element(BGP_NODE
, &neighbor_as_override_hidden_cmd
);
13210 install_element(BGP_NODE
, &no_neighbor_as_override_hidden_cmd
);
13211 install_element(BGP_IPV4_NODE
, &neighbor_as_override_cmd
);
13212 install_element(BGP_IPV4_NODE
, &no_neighbor_as_override_cmd
);
13213 install_element(BGP_IPV4M_NODE
, &neighbor_as_override_cmd
);
13214 install_element(BGP_IPV4M_NODE
, &no_neighbor_as_override_cmd
);
13215 install_element(BGP_IPV4L_NODE
, &neighbor_as_override_cmd
);
13216 install_element(BGP_IPV4L_NODE
, &no_neighbor_as_override_cmd
);
13217 install_element(BGP_IPV6_NODE
, &neighbor_as_override_cmd
);
13218 install_element(BGP_IPV6_NODE
, &no_neighbor_as_override_cmd
);
13219 install_element(BGP_IPV6M_NODE
, &neighbor_as_override_cmd
);
13220 install_element(BGP_IPV6M_NODE
, &no_neighbor_as_override_cmd
);
13221 install_element(BGP_IPV6L_NODE
, &neighbor_as_override_cmd
);
13222 install_element(BGP_IPV6L_NODE
, &no_neighbor_as_override_cmd
);
13223 install_element(BGP_VPNV4_NODE
, &neighbor_as_override_cmd
);
13224 install_element(BGP_VPNV4_NODE
, &no_neighbor_as_override_cmd
);
13225 install_element(BGP_VPNV6_NODE
, &neighbor_as_override_cmd
);
13226 install_element(BGP_VPNV6_NODE
, &no_neighbor_as_override_cmd
);
13228 /* "neighbor remove-private-AS" commands. */
13229 install_element(BGP_NODE
, &neighbor_remove_private_as_hidden_cmd
);
13230 install_element(BGP_NODE
, &no_neighbor_remove_private_as_hidden_cmd
);
13231 install_element(BGP_NODE
, &neighbor_remove_private_as_all_hidden_cmd
);
13232 install_element(BGP_NODE
,
13233 &no_neighbor_remove_private_as_all_hidden_cmd
);
13234 install_element(BGP_NODE
,
13235 &neighbor_remove_private_as_replace_as_hidden_cmd
);
13236 install_element(BGP_NODE
,
13237 &no_neighbor_remove_private_as_replace_as_hidden_cmd
);
13238 install_element(BGP_NODE
,
13239 &neighbor_remove_private_as_all_replace_as_hidden_cmd
);
13242 &no_neighbor_remove_private_as_all_replace_as_hidden_cmd
);
13243 install_element(BGP_IPV4_NODE
, &neighbor_remove_private_as_cmd
);
13244 install_element(BGP_IPV4_NODE
, &no_neighbor_remove_private_as_cmd
);
13245 install_element(BGP_IPV4_NODE
, &neighbor_remove_private_as_all_cmd
);
13246 install_element(BGP_IPV4_NODE
, &no_neighbor_remove_private_as_all_cmd
);
13247 install_element(BGP_IPV4_NODE
,
13248 &neighbor_remove_private_as_replace_as_cmd
);
13249 install_element(BGP_IPV4_NODE
,
13250 &no_neighbor_remove_private_as_replace_as_cmd
);
13251 install_element(BGP_IPV4_NODE
,
13252 &neighbor_remove_private_as_all_replace_as_cmd
);
13253 install_element(BGP_IPV4_NODE
,
13254 &no_neighbor_remove_private_as_all_replace_as_cmd
);
13255 install_element(BGP_IPV4M_NODE
, &neighbor_remove_private_as_cmd
);
13256 install_element(BGP_IPV4M_NODE
, &no_neighbor_remove_private_as_cmd
);
13257 install_element(BGP_IPV4M_NODE
, &neighbor_remove_private_as_all_cmd
);
13258 install_element(BGP_IPV4M_NODE
, &no_neighbor_remove_private_as_all_cmd
);
13259 install_element(BGP_IPV4M_NODE
,
13260 &neighbor_remove_private_as_replace_as_cmd
);
13261 install_element(BGP_IPV4M_NODE
,
13262 &no_neighbor_remove_private_as_replace_as_cmd
);
13263 install_element(BGP_IPV4M_NODE
,
13264 &neighbor_remove_private_as_all_replace_as_cmd
);
13265 install_element(BGP_IPV4M_NODE
,
13266 &no_neighbor_remove_private_as_all_replace_as_cmd
);
13267 install_element(BGP_IPV4L_NODE
, &neighbor_remove_private_as_cmd
);
13268 install_element(BGP_IPV4L_NODE
, &no_neighbor_remove_private_as_cmd
);
13269 install_element(BGP_IPV4L_NODE
, &neighbor_remove_private_as_all_cmd
);
13270 install_element(BGP_IPV4L_NODE
, &no_neighbor_remove_private_as_all_cmd
);
13271 install_element(BGP_IPV4L_NODE
,
13272 &neighbor_remove_private_as_replace_as_cmd
);
13273 install_element(BGP_IPV4L_NODE
,
13274 &no_neighbor_remove_private_as_replace_as_cmd
);
13275 install_element(BGP_IPV4L_NODE
,
13276 &neighbor_remove_private_as_all_replace_as_cmd
);
13277 install_element(BGP_IPV4L_NODE
,
13278 &no_neighbor_remove_private_as_all_replace_as_cmd
);
13279 install_element(BGP_IPV6_NODE
, &neighbor_remove_private_as_cmd
);
13280 install_element(BGP_IPV6_NODE
, &no_neighbor_remove_private_as_cmd
);
13281 install_element(BGP_IPV6_NODE
, &neighbor_remove_private_as_all_cmd
);
13282 install_element(BGP_IPV6_NODE
, &no_neighbor_remove_private_as_all_cmd
);
13283 install_element(BGP_IPV6_NODE
,
13284 &neighbor_remove_private_as_replace_as_cmd
);
13285 install_element(BGP_IPV6_NODE
,
13286 &no_neighbor_remove_private_as_replace_as_cmd
);
13287 install_element(BGP_IPV6_NODE
,
13288 &neighbor_remove_private_as_all_replace_as_cmd
);
13289 install_element(BGP_IPV6_NODE
,
13290 &no_neighbor_remove_private_as_all_replace_as_cmd
);
13291 install_element(BGP_IPV6M_NODE
, &neighbor_remove_private_as_cmd
);
13292 install_element(BGP_IPV6M_NODE
, &no_neighbor_remove_private_as_cmd
);
13293 install_element(BGP_IPV6M_NODE
, &neighbor_remove_private_as_all_cmd
);
13294 install_element(BGP_IPV6M_NODE
, &no_neighbor_remove_private_as_all_cmd
);
13295 install_element(BGP_IPV6M_NODE
,
13296 &neighbor_remove_private_as_replace_as_cmd
);
13297 install_element(BGP_IPV6M_NODE
,
13298 &no_neighbor_remove_private_as_replace_as_cmd
);
13299 install_element(BGP_IPV6M_NODE
,
13300 &neighbor_remove_private_as_all_replace_as_cmd
);
13301 install_element(BGP_IPV6M_NODE
,
13302 &no_neighbor_remove_private_as_all_replace_as_cmd
);
13303 install_element(BGP_IPV6L_NODE
, &neighbor_remove_private_as_cmd
);
13304 install_element(BGP_IPV6L_NODE
, &no_neighbor_remove_private_as_cmd
);
13305 install_element(BGP_IPV6L_NODE
, &neighbor_remove_private_as_all_cmd
);
13306 install_element(BGP_IPV6L_NODE
, &no_neighbor_remove_private_as_all_cmd
);
13307 install_element(BGP_IPV6L_NODE
,
13308 &neighbor_remove_private_as_replace_as_cmd
);
13309 install_element(BGP_IPV6L_NODE
,
13310 &no_neighbor_remove_private_as_replace_as_cmd
);
13311 install_element(BGP_IPV6L_NODE
,
13312 &neighbor_remove_private_as_all_replace_as_cmd
);
13313 install_element(BGP_IPV6L_NODE
,
13314 &no_neighbor_remove_private_as_all_replace_as_cmd
);
13315 install_element(BGP_VPNV4_NODE
, &neighbor_remove_private_as_cmd
);
13316 install_element(BGP_VPNV4_NODE
, &no_neighbor_remove_private_as_cmd
);
13317 install_element(BGP_VPNV4_NODE
, &neighbor_remove_private_as_all_cmd
);
13318 install_element(BGP_VPNV4_NODE
, &no_neighbor_remove_private_as_all_cmd
);
13319 install_element(BGP_VPNV4_NODE
,
13320 &neighbor_remove_private_as_replace_as_cmd
);
13321 install_element(BGP_VPNV4_NODE
,
13322 &no_neighbor_remove_private_as_replace_as_cmd
);
13323 install_element(BGP_VPNV4_NODE
,
13324 &neighbor_remove_private_as_all_replace_as_cmd
);
13325 install_element(BGP_VPNV4_NODE
,
13326 &no_neighbor_remove_private_as_all_replace_as_cmd
);
13327 install_element(BGP_VPNV6_NODE
, &neighbor_remove_private_as_cmd
);
13328 install_element(BGP_VPNV6_NODE
, &no_neighbor_remove_private_as_cmd
);
13329 install_element(BGP_VPNV6_NODE
, &neighbor_remove_private_as_all_cmd
);
13330 install_element(BGP_VPNV6_NODE
, &no_neighbor_remove_private_as_all_cmd
);
13331 install_element(BGP_VPNV6_NODE
,
13332 &neighbor_remove_private_as_replace_as_cmd
);
13333 install_element(BGP_VPNV6_NODE
,
13334 &no_neighbor_remove_private_as_replace_as_cmd
);
13335 install_element(BGP_VPNV6_NODE
,
13336 &neighbor_remove_private_as_all_replace_as_cmd
);
13337 install_element(BGP_VPNV6_NODE
,
13338 &no_neighbor_remove_private_as_all_replace_as_cmd
);
13340 /* "neighbor send-community" commands.*/
13341 install_element(BGP_NODE
, &neighbor_send_community_hidden_cmd
);
13342 install_element(BGP_NODE
, &neighbor_send_community_type_hidden_cmd
);
13343 install_element(BGP_NODE
, &no_neighbor_send_community_hidden_cmd
);
13344 install_element(BGP_NODE
, &no_neighbor_send_community_type_hidden_cmd
);
13345 install_element(BGP_IPV4_NODE
, &neighbor_send_community_cmd
);
13346 install_element(BGP_IPV4_NODE
, &neighbor_send_community_type_cmd
);
13347 install_element(BGP_IPV4_NODE
, &no_neighbor_send_community_cmd
);
13348 install_element(BGP_IPV4_NODE
, &no_neighbor_send_community_type_cmd
);
13349 install_element(BGP_IPV4M_NODE
, &neighbor_send_community_cmd
);
13350 install_element(BGP_IPV4M_NODE
, &neighbor_send_community_type_cmd
);
13351 install_element(BGP_IPV4M_NODE
, &no_neighbor_send_community_cmd
);
13352 install_element(BGP_IPV4M_NODE
, &no_neighbor_send_community_type_cmd
);
13353 install_element(BGP_IPV4L_NODE
, &neighbor_send_community_cmd
);
13354 install_element(BGP_IPV4L_NODE
, &neighbor_send_community_type_cmd
);
13355 install_element(BGP_IPV4L_NODE
, &no_neighbor_send_community_cmd
);
13356 install_element(BGP_IPV4L_NODE
, &no_neighbor_send_community_type_cmd
);
13357 install_element(BGP_IPV6_NODE
, &neighbor_send_community_cmd
);
13358 install_element(BGP_IPV6_NODE
, &neighbor_send_community_type_cmd
);
13359 install_element(BGP_IPV6_NODE
, &no_neighbor_send_community_cmd
);
13360 install_element(BGP_IPV6_NODE
, &no_neighbor_send_community_type_cmd
);
13361 install_element(BGP_IPV6M_NODE
, &neighbor_send_community_cmd
);
13362 install_element(BGP_IPV6M_NODE
, &neighbor_send_community_type_cmd
);
13363 install_element(BGP_IPV6M_NODE
, &no_neighbor_send_community_cmd
);
13364 install_element(BGP_IPV6M_NODE
, &no_neighbor_send_community_type_cmd
);
13365 install_element(BGP_IPV6L_NODE
, &neighbor_send_community_cmd
);
13366 install_element(BGP_IPV6L_NODE
, &neighbor_send_community_type_cmd
);
13367 install_element(BGP_IPV6L_NODE
, &no_neighbor_send_community_cmd
);
13368 install_element(BGP_IPV6L_NODE
, &no_neighbor_send_community_type_cmd
);
13369 install_element(BGP_VPNV4_NODE
, &neighbor_send_community_cmd
);
13370 install_element(BGP_VPNV4_NODE
, &neighbor_send_community_type_cmd
);
13371 install_element(BGP_VPNV4_NODE
, &no_neighbor_send_community_cmd
);
13372 install_element(BGP_VPNV4_NODE
, &no_neighbor_send_community_type_cmd
);
13373 install_element(BGP_VPNV6_NODE
, &neighbor_send_community_cmd
);
13374 install_element(BGP_VPNV6_NODE
, &neighbor_send_community_type_cmd
);
13375 install_element(BGP_VPNV6_NODE
, &no_neighbor_send_community_cmd
);
13376 install_element(BGP_VPNV6_NODE
, &no_neighbor_send_community_type_cmd
);
13378 /* "neighbor route-reflector" commands.*/
13379 install_element(BGP_NODE
, &neighbor_route_reflector_client_hidden_cmd
);
13380 install_element(BGP_NODE
,
13381 &no_neighbor_route_reflector_client_hidden_cmd
);
13382 install_element(BGP_IPV4_NODE
, &neighbor_route_reflector_client_cmd
);
13383 install_element(BGP_IPV4_NODE
, &no_neighbor_route_reflector_client_cmd
);
13384 install_element(BGP_IPV4M_NODE
, &neighbor_route_reflector_client_cmd
);
13385 install_element(BGP_IPV4M_NODE
,
13386 &no_neighbor_route_reflector_client_cmd
);
13387 install_element(BGP_IPV4L_NODE
, &neighbor_route_reflector_client_cmd
);
13388 install_element(BGP_IPV4L_NODE
,
13389 &no_neighbor_route_reflector_client_cmd
);
13390 install_element(BGP_IPV6_NODE
, &neighbor_route_reflector_client_cmd
);
13391 install_element(BGP_IPV6_NODE
, &no_neighbor_route_reflector_client_cmd
);
13392 install_element(BGP_IPV6M_NODE
, &neighbor_route_reflector_client_cmd
);
13393 install_element(BGP_IPV6M_NODE
,
13394 &no_neighbor_route_reflector_client_cmd
);
13395 install_element(BGP_IPV6L_NODE
, &neighbor_route_reflector_client_cmd
);
13396 install_element(BGP_IPV6L_NODE
,
13397 &no_neighbor_route_reflector_client_cmd
);
13398 install_element(BGP_VPNV4_NODE
, &neighbor_route_reflector_client_cmd
);
13399 install_element(BGP_VPNV4_NODE
,
13400 &no_neighbor_route_reflector_client_cmd
);
13401 install_element(BGP_VPNV6_NODE
, &neighbor_route_reflector_client_cmd
);
13402 install_element(BGP_VPNV6_NODE
,
13403 &no_neighbor_route_reflector_client_cmd
);
13404 install_element(BGP_FLOWSPECV4_NODE
,
13405 &neighbor_route_reflector_client_cmd
);
13406 install_element(BGP_FLOWSPECV4_NODE
,
13407 &no_neighbor_route_reflector_client_cmd
);
13408 install_element(BGP_FLOWSPECV6_NODE
,
13409 &neighbor_route_reflector_client_cmd
);
13410 install_element(BGP_FLOWSPECV6_NODE
,
13411 &no_neighbor_route_reflector_client_cmd
);
13412 install_element(BGP_EVPN_NODE
, &neighbor_route_reflector_client_cmd
);
13413 install_element(BGP_EVPN_NODE
, &no_neighbor_route_reflector_client_cmd
);
13415 /* "neighbor route-server" commands.*/
13416 install_element(BGP_NODE
, &neighbor_route_server_client_hidden_cmd
);
13417 install_element(BGP_NODE
, &no_neighbor_route_server_client_hidden_cmd
);
13418 install_element(BGP_IPV4_NODE
, &neighbor_route_server_client_cmd
);
13419 install_element(BGP_IPV4_NODE
, &no_neighbor_route_server_client_cmd
);
13420 install_element(BGP_IPV4M_NODE
, &neighbor_route_server_client_cmd
);
13421 install_element(BGP_IPV4M_NODE
, &no_neighbor_route_server_client_cmd
);
13422 install_element(BGP_IPV4L_NODE
, &neighbor_route_server_client_cmd
);
13423 install_element(BGP_IPV4L_NODE
, &no_neighbor_route_server_client_cmd
);
13424 install_element(BGP_IPV6_NODE
, &neighbor_route_server_client_cmd
);
13425 install_element(BGP_IPV6_NODE
, &no_neighbor_route_server_client_cmd
);
13426 install_element(BGP_IPV6M_NODE
, &neighbor_route_server_client_cmd
);
13427 install_element(BGP_IPV6M_NODE
, &no_neighbor_route_server_client_cmd
);
13428 install_element(BGP_IPV6L_NODE
, &neighbor_route_server_client_cmd
);
13429 install_element(BGP_IPV6L_NODE
, &no_neighbor_route_server_client_cmd
);
13430 install_element(BGP_VPNV4_NODE
, &neighbor_route_server_client_cmd
);
13431 install_element(BGP_VPNV4_NODE
, &no_neighbor_route_server_client_cmd
);
13432 install_element(BGP_VPNV6_NODE
, &neighbor_route_server_client_cmd
);
13433 install_element(BGP_VPNV6_NODE
, &no_neighbor_route_server_client_cmd
);
13434 install_element(BGP_EVPN_NODE
, &neighbor_route_server_client_cmd
);
13435 install_element(BGP_EVPN_NODE
, &no_neighbor_route_server_client_cmd
);
13436 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_route_server_client_cmd
);
13437 install_element(BGP_FLOWSPECV4_NODE
,
13438 &no_neighbor_route_server_client_cmd
);
13439 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_route_server_client_cmd
);
13440 install_element(BGP_FLOWSPECV6_NODE
,
13441 &no_neighbor_route_server_client_cmd
);
13443 /* "neighbor addpath-tx-all-paths" commands.*/
13444 install_element(BGP_NODE
, &neighbor_addpath_tx_all_paths_hidden_cmd
);
13445 install_element(BGP_NODE
, &no_neighbor_addpath_tx_all_paths_hidden_cmd
);
13446 install_element(BGP_IPV4_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
13447 install_element(BGP_IPV4_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
13448 install_element(BGP_IPV4M_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
13449 install_element(BGP_IPV4M_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
13450 install_element(BGP_IPV4L_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
13451 install_element(BGP_IPV4L_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
13452 install_element(BGP_IPV6_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
13453 install_element(BGP_IPV6_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
13454 install_element(BGP_IPV6M_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
13455 install_element(BGP_IPV6M_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
13456 install_element(BGP_IPV6L_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
13457 install_element(BGP_IPV6L_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
13458 install_element(BGP_VPNV4_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
13459 install_element(BGP_VPNV4_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
13460 install_element(BGP_VPNV6_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
13461 install_element(BGP_VPNV6_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
13463 /* "neighbor addpath-tx-bestpath-per-AS" commands.*/
13464 install_element(BGP_NODE
,
13465 &neighbor_addpath_tx_bestpath_per_as_hidden_cmd
);
13466 install_element(BGP_NODE
,
13467 &no_neighbor_addpath_tx_bestpath_per_as_hidden_cmd
);
13468 install_element(BGP_IPV4_NODE
,
13469 &neighbor_addpath_tx_bestpath_per_as_cmd
);
13470 install_element(BGP_IPV4_NODE
,
13471 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
13472 install_element(BGP_IPV4M_NODE
,
13473 &neighbor_addpath_tx_bestpath_per_as_cmd
);
13474 install_element(BGP_IPV4M_NODE
,
13475 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
13476 install_element(BGP_IPV4L_NODE
,
13477 &neighbor_addpath_tx_bestpath_per_as_cmd
);
13478 install_element(BGP_IPV4L_NODE
,
13479 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
13480 install_element(BGP_IPV6_NODE
,
13481 &neighbor_addpath_tx_bestpath_per_as_cmd
);
13482 install_element(BGP_IPV6_NODE
,
13483 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
13484 install_element(BGP_IPV6M_NODE
,
13485 &neighbor_addpath_tx_bestpath_per_as_cmd
);
13486 install_element(BGP_IPV6M_NODE
,
13487 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
13488 install_element(BGP_IPV6L_NODE
,
13489 &neighbor_addpath_tx_bestpath_per_as_cmd
);
13490 install_element(BGP_IPV6L_NODE
,
13491 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
13492 install_element(BGP_VPNV4_NODE
,
13493 &neighbor_addpath_tx_bestpath_per_as_cmd
);
13494 install_element(BGP_VPNV4_NODE
,
13495 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
13496 install_element(BGP_VPNV6_NODE
,
13497 &neighbor_addpath_tx_bestpath_per_as_cmd
);
13498 install_element(BGP_VPNV6_NODE
,
13499 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
13501 /* "neighbor passive" commands. */
13502 install_element(BGP_NODE
, &neighbor_passive_cmd
);
13503 install_element(BGP_NODE
, &no_neighbor_passive_cmd
);
13506 /* "neighbor shutdown" commands. */
13507 install_element(BGP_NODE
, &neighbor_shutdown_cmd
);
13508 install_element(BGP_NODE
, &no_neighbor_shutdown_cmd
);
13509 install_element(BGP_NODE
, &neighbor_shutdown_msg_cmd
);
13510 install_element(BGP_NODE
, &no_neighbor_shutdown_msg_cmd
);
13512 /* "neighbor capability extended-nexthop" commands.*/
13513 install_element(BGP_NODE
, &neighbor_capability_enhe_cmd
);
13514 install_element(BGP_NODE
, &no_neighbor_capability_enhe_cmd
);
13516 /* "neighbor capability orf prefix-list" commands.*/
13517 install_element(BGP_NODE
, &neighbor_capability_orf_prefix_hidden_cmd
);
13518 install_element(BGP_NODE
,
13519 &no_neighbor_capability_orf_prefix_hidden_cmd
);
13520 install_element(BGP_IPV4_NODE
, &neighbor_capability_orf_prefix_cmd
);
13521 install_element(BGP_IPV4_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
13522 install_element(BGP_IPV4M_NODE
, &neighbor_capability_orf_prefix_cmd
);
13523 install_element(BGP_IPV4M_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
13524 install_element(BGP_IPV4L_NODE
, &neighbor_capability_orf_prefix_cmd
);
13525 install_element(BGP_IPV4L_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
13526 install_element(BGP_IPV6_NODE
, &neighbor_capability_orf_prefix_cmd
);
13527 install_element(BGP_IPV6_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
13528 install_element(BGP_IPV6M_NODE
, &neighbor_capability_orf_prefix_cmd
);
13529 install_element(BGP_IPV6M_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
13530 install_element(BGP_IPV6L_NODE
, &neighbor_capability_orf_prefix_cmd
);
13531 install_element(BGP_IPV6L_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
13533 /* "neighbor capability dynamic" commands.*/
13534 install_element(BGP_NODE
, &neighbor_capability_dynamic_cmd
);
13535 install_element(BGP_NODE
, &no_neighbor_capability_dynamic_cmd
);
13537 /* "neighbor dont-capability-negotiate" commands. */
13538 install_element(BGP_NODE
, &neighbor_dont_capability_negotiate_cmd
);
13539 install_element(BGP_NODE
, &no_neighbor_dont_capability_negotiate_cmd
);
13541 /* "neighbor ebgp-multihop" commands. */
13542 install_element(BGP_NODE
, &neighbor_ebgp_multihop_cmd
);
13543 install_element(BGP_NODE
, &neighbor_ebgp_multihop_ttl_cmd
);
13544 install_element(BGP_NODE
, &no_neighbor_ebgp_multihop_cmd
);
13546 /* "neighbor disable-connected-check" commands. */
13547 install_element(BGP_NODE
, &neighbor_disable_connected_check_cmd
);
13548 install_element(BGP_NODE
, &no_neighbor_disable_connected_check_cmd
);
13550 /* "neighbor enforce-first-as" commands. */
13551 install_element(BGP_NODE
, &neighbor_enforce_first_as_cmd
);
13552 install_element(BGP_NODE
, &no_neighbor_enforce_first_as_cmd
);
13554 /* "neighbor description" commands. */
13555 install_element(BGP_NODE
, &neighbor_description_cmd
);
13556 install_element(BGP_NODE
, &no_neighbor_description_cmd
);
13557 install_element(BGP_NODE
, &no_neighbor_description_comment_cmd
);
13559 /* "neighbor update-source" commands. "*/
13560 install_element(BGP_NODE
, &neighbor_update_source_cmd
);
13561 install_element(BGP_NODE
, &no_neighbor_update_source_cmd
);
13563 /* "neighbor default-originate" commands. */
13564 install_element(BGP_NODE
, &neighbor_default_originate_hidden_cmd
);
13565 install_element(BGP_NODE
, &neighbor_default_originate_rmap_hidden_cmd
);
13566 install_element(BGP_NODE
, &no_neighbor_default_originate_hidden_cmd
);
13567 install_element(BGP_IPV4_NODE
, &neighbor_default_originate_cmd
);
13568 install_element(BGP_IPV4_NODE
, &neighbor_default_originate_rmap_cmd
);
13569 install_element(BGP_IPV4_NODE
, &no_neighbor_default_originate_cmd
);
13570 install_element(BGP_IPV4M_NODE
, &neighbor_default_originate_cmd
);
13571 install_element(BGP_IPV4M_NODE
, &neighbor_default_originate_rmap_cmd
);
13572 install_element(BGP_IPV4M_NODE
, &no_neighbor_default_originate_cmd
);
13573 install_element(BGP_IPV4L_NODE
, &neighbor_default_originate_cmd
);
13574 install_element(BGP_IPV4L_NODE
, &neighbor_default_originate_rmap_cmd
);
13575 install_element(BGP_IPV4L_NODE
, &no_neighbor_default_originate_cmd
);
13576 install_element(BGP_IPV6_NODE
, &neighbor_default_originate_cmd
);
13577 install_element(BGP_IPV6_NODE
, &neighbor_default_originate_rmap_cmd
);
13578 install_element(BGP_IPV6_NODE
, &no_neighbor_default_originate_cmd
);
13579 install_element(BGP_IPV6M_NODE
, &neighbor_default_originate_cmd
);
13580 install_element(BGP_IPV6M_NODE
, &neighbor_default_originate_rmap_cmd
);
13581 install_element(BGP_IPV6M_NODE
, &no_neighbor_default_originate_cmd
);
13582 install_element(BGP_IPV6L_NODE
, &neighbor_default_originate_cmd
);
13583 install_element(BGP_IPV6L_NODE
, &neighbor_default_originate_rmap_cmd
);
13584 install_element(BGP_IPV6L_NODE
, &no_neighbor_default_originate_cmd
);
13586 /* "neighbor port" commands. */
13587 install_element(BGP_NODE
, &neighbor_port_cmd
);
13588 install_element(BGP_NODE
, &no_neighbor_port_cmd
);
13590 /* "neighbor weight" commands. */
13591 install_element(BGP_NODE
, &neighbor_weight_hidden_cmd
);
13592 install_element(BGP_NODE
, &no_neighbor_weight_hidden_cmd
);
13594 install_element(BGP_IPV4_NODE
, &neighbor_weight_cmd
);
13595 install_element(BGP_IPV4_NODE
, &no_neighbor_weight_cmd
);
13596 install_element(BGP_IPV4M_NODE
, &neighbor_weight_cmd
);
13597 install_element(BGP_IPV4M_NODE
, &no_neighbor_weight_cmd
);
13598 install_element(BGP_IPV4L_NODE
, &neighbor_weight_cmd
);
13599 install_element(BGP_IPV4L_NODE
, &no_neighbor_weight_cmd
);
13600 install_element(BGP_IPV6_NODE
, &neighbor_weight_cmd
);
13601 install_element(BGP_IPV6_NODE
, &no_neighbor_weight_cmd
);
13602 install_element(BGP_IPV6M_NODE
, &neighbor_weight_cmd
);
13603 install_element(BGP_IPV6M_NODE
, &no_neighbor_weight_cmd
);
13604 install_element(BGP_IPV6L_NODE
, &neighbor_weight_cmd
);
13605 install_element(BGP_IPV6L_NODE
, &no_neighbor_weight_cmd
);
13606 install_element(BGP_VPNV4_NODE
, &neighbor_weight_cmd
);
13607 install_element(BGP_VPNV4_NODE
, &no_neighbor_weight_cmd
);
13608 install_element(BGP_VPNV6_NODE
, &neighbor_weight_cmd
);
13609 install_element(BGP_VPNV6_NODE
, &no_neighbor_weight_cmd
);
13611 /* "neighbor override-capability" commands. */
13612 install_element(BGP_NODE
, &neighbor_override_capability_cmd
);
13613 install_element(BGP_NODE
, &no_neighbor_override_capability_cmd
);
13615 /* "neighbor strict-capability-match" commands. */
13616 install_element(BGP_NODE
, &neighbor_strict_capability_cmd
);
13617 install_element(BGP_NODE
, &no_neighbor_strict_capability_cmd
);
13619 /* "neighbor timers" commands. */
13620 install_element(BGP_NODE
, &neighbor_timers_cmd
);
13621 install_element(BGP_NODE
, &no_neighbor_timers_cmd
);
13623 /* "neighbor timers connect" commands. */
13624 install_element(BGP_NODE
, &neighbor_timers_connect_cmd
);
13625 install_element(BGP_NODE
, &no_neighbor_timers_connect_cmd
);
13627 /* "neighbor advertisement-interval" commands. */
13628 install_element(BGP_NODE
, &neighbor_advertise_interval_cmd
);
13629 install_element(BGP_NODE
, &no_neighbor_advertise_interval_cmd
);
13631 /* "neighbor interface" commands. */
13632 install_element(BGP_NODE
, &neighbor_interface_cmd
);
13633 install_element(BGP_NODE
, &no_neighbor_interface_cmd
);
13635 /* "neighbor distribute" commands. */
13636 install_element(BGP_NODE
, &neighbor_distribute_list_hidden_cmd
);
13637 install_element(BGP_NODE
, &no_neighbor_distribute_list_hidden_cmd
);
13638 install_element(BGP_IPV4_NODE
, &neighbor_distribute_list_cmd
);
13639 install_element(BGP_IPV4_NODE
, &no_neighbor_distribute_list_cmd
);
13640 install_element(BGP_IPV4M_NODE
, &neighbor_distribute_list_cmd
);
13641 install_element(BGP_IPV4M_NODE
, &no_neighbor_distribute_list_cmd
);
13642 install_element(BGP_IPV4L_NODE
, &neighbor_distribute_list_cmd
);
13643 install_element(BGP_IPV4L_NODE
, &no_neighbor_distribute_list_cmd
);
13644 install_element(BGP_IPV6_NODE
, &neighbor_distribute_list_cmd
);
13645 install_element(BGP_IPV6_NODE
, &no_neighbor_distribute_list_cmd
);
13646 install_element(BGP_IPV6M_NODE
, &neighbor_distribute_list_cmd
);
13647 install_element(BGP_IPV6M_NODE
, &no_neighbor_distribute_list_cmd
);
13648 install_element(BGP_IPV6L_NODE
, &neighbor_distribute_list_cmd
);
13649 install_element(BGP_IPV6L_NODE
, &no_neighbor_distribute_list_cmd
);
13650 install_element(BGP_VPNV4_NODE
, &neighbor_distribute_list_cmd
);
13651 install_element(BGP_VPNV4_NODE
, &no_neighbor_distribute_list_cmd
);
13652 install_element(BGP_VPNV6_NODE
, &neighbor_distribute_list_cmd
);
13653 install_element(BGP_VPNV6_NODE
, &no_neighbor_distribute_list_cmd
);
13655 /* "neighbor prefix-list" commands. */
13656 install_element(BGP_NODE
, &neighbor_prefix_list_hidden_cmd
);
13657 install_element(BGP_NODE
, &no_neighbor_prefix_list_hidden_cmd
);
13658 install_element(BGP_IPV4_NODE
, &neighbor_prefix_list_cmd
);
13659 install_element(BGP_IPV4_NODE
, &no_neighbor_prefix_list_cmd
);
13660 install_element(BGP_IPV4M_NODE
, &neighbor_prefix_list_cmd
);
13661 install_element(BGP_IPV4M_NODE
, &no_neighbor_prefix_list_cmd
);
13662 install_element(BGP_IPV4L_NODE
, &neighbor_prefix_list_cmd
);
13663 install_element(BGP_IPV4L_NODE
, &no_neighbor_prefix_list_cmd
);
13664 install_element(BGP_IPV6_NODE
, &neighbor_prefix_list_cmd
);
13665 install_element(BGP_IPV6_NODE
, &no_neighbor_prefix_list_cmd
);
13666 install_element(BGP_IPV6M_NODE
, &neighbor_prefix_list_cmd
);
13667 install_element(BGP_IPV6M_NODE
, &no_neighbor_prefix_list_cmd
);
13668 install_element(BGP_IPV6L_NODE
, &neighbor_prefix_list_cmd
);
13669 install_element(BGP_IPV6L_NODE
, &no_neighbor_prefix_list_cmd
);
13670 install_element(BGP_VPNV4_NODE
, &neighbor_prefix_list_cmd
);
13671 install_element(BGP_VPNV4_NODE
, &no_neighbor_prefix_list_cmd
);
13672 install_element(BGP_VPNV6_NODE
, &neighbor_prefix_list_cmd
);
13673 install_element(BGP_VPNV6_NODE
, &no_neighbor_prefix_list_cmd
);
13674 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_prefix_list_cmd
);
13675 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_prefix_list_cmd
);
13676 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_prefix_list_cmd
);
13677 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_prefix_list_cmd
);
13679 /* "neighbor filter-list" commands. */
13680 install_element(BGP_NODE
, &neighbor_filter_list_hidden_cmd
);
13681 install_element(BGP_NODE
, &no_neighbor_filter_list_hidden_cmd
);
13682 install_element(BGP_IPV4_NODE
, &neighbor_filter_list_cmd
);
13683 install_element(BGP_IPV4_NODE
, &no_neighbor_filter_list_cmd
);
13684 install_element(BGP_IPV4M_NODE
, &neighbor_filter_list_cmd
);
13685 install_element(BGP_IPV4M_NODE
, &no_neighbor_filter_list_cmd
);
13686 install_element(BGP_IPV4L_NODE
, &neighbor_filter_list_cmd
);
13687 install_element(BGP_IPV4L_NODE
, &no_neighbor_filter_list_cmd
);
13688 install_element(BGP_IPV6_NODE
, &neighbor_filter_list_cmd
);
13689 install_element(BGP_IPV6_NODE
, &no_neighbor_filter_list_cmd
);
13690 install_element(BGP_IPV6M_NODE
, &neighbor_filter_list_cmd
);
13691 install_element(BGP_IPV6M_NODE
, &no_neighbor_filter_list_cmd
);
13692 install_element(BGP_IPV6L_NODE
, &neighbor_filter_list_cmd
);
13693 install_element(BGP_IPV6L_NODE
, &no_neighbor_filter_list_cmd
);
13694 install_element(BGP_VPNV4_NODE
, &neighbor_filter_list_cmd
);
13695 install_element(BGP_VPNV4_NODE
, &no_neighbor_filter_list_cmd
);
13696 install_element(BGP_VPNV6_NODE
, &neighbor_filter_list_cmd
);
13697 install_element(BGP_VPNV6_NODE
, &no_neighbor_filter_list_cmd
);
13698 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_filter_list_cmd
);
13699 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_filter_list_cmd
);
13700 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_filter_list_cmd
);
13701 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_filter_list_cmd
);
13703 /* "neighbor route-map" commands. */
13704 install_element(BGP_NODE
, &neighbor_route_map_hidden_cmd
);
13705 install_element(BGP_NODE
, &no_neighbor_route_map_hidden_cmd
);
13706 install_element(BGP_IPV4_NODE
, &neighbor_route_map_cmd
);
13707 install_element(BGP_IPV4_NODE
, &no_neighbor_route_map_cmd
);
13708 install_element(BGP_IPV4M_NODE
, &neighbor_route_map_cmd
);
13709 install_element(BGP_IPV4M_NODE
, &no_neighbor_route_map_cmd
);
13710 install_element(BGP_IPV4L_NODE
, &neighbor_route_map_cmd
);
13711 install_element(BGP_IPV4L_NODE
, &no_neighbor_route_map_cmd
);
13712 install_element(BGP_IPV6_NODE
, &neighbor_route_map_cmd
);
13713 install_element(BGP_IPV6_NODE
, &no_neighbor_route_map_cmd
);
13714 install_element(BGP_IPV6M_NODE
, &neighbor_route_map_cmd
);
13715 install_element(BGP_IPV6M_NODE
, &no_neighbor_route_map_cmd
);
13716 install_element(BGP_IPV6L_NODE
, &neighbor_route_map_cmd
);
13717 install_element(BGP_IPV6L_NODE
, &no_neighbor_route_map_cmd
);
13718 install_element(BGP_VPNV4_NODE
, &neighbor_route_map_cmd
);
13719 install_element(BGP_VPNV4_NODE
, &no_neighbor_route_map_cmd
);
13720 install_element(BGP_VPNV6_NODE
, &neighbor_route_map_cmd
);
13721 install_element(BGP_VPNV6_NODE
, &no_neighbor_route_map_cmd
);
13722 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_route_map_cmd
);
13723 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_route_map_cmd
);
13724 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_route_map_cmd
);
13725 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_route_map_cmd
);
13726 install_element(BGP_EVPN_NODE
, &neighbor_route_map_cmd
);
13727 install_element(BGP_EVPN_NODE
, &no_neighbor_route_map_cmd
);
13729 /* "neighbor unsuppress-map" commands. */
13730 install_element(BGP_NODE
, &neighbor_unsuppress_map_hidden_cmd
);
13731 install_element(BGP_NODE
, &no_neighbor_unsuppress_map_hidden_cmd
);
13732 install_element(BGP_IPV4_NODE
, &neighbor_unsuppress_map_cmd
);
13733 install_element(BGP_IPV4_NODE
, &no_neighbor_unsuppress_map_cmd
);
13734 install_element(BGP_IPV4M_NODE
, &neighbor_unsuppress_map_cmd
);
13735 install_element(BGP_IPV4M_NODE
, &no_neighbor_unsuppress_map_cmd
);
13736 install_element(BGP_IPV4L_NODE
, &neighbor_unsuppress_map_cmd
);
13737 install_element(BGP_IPV4L_NODE
, &no_neighbor_unsuppress_map_cmd
);
13738 install_element(BGP_IPV6_NODE
, &neighbor_unsuppress_map_cmd
);
13739 install_element(BGP_IPV6_NODE
, &no_neighbor_unsuppress_map_cmd
);
13740 install_element(BGP_IPV6M_NODE
, &neighbor_unsuppress_map_cmd
);
13741 install_element(BGP_IPV6M_NODE
, &no_neighbor_unsuppress_map_cmd
);
13742 install_element(BGP_IPV6L_NODE
, &neighbor_unsuppress_map_cmd
);
13743 install_element(BGP_IPV6L_NODE
, &no_neighbor_unsuppress_map_cmd
);
13744 install_element(BGP_VPNV4_NODE
, &neighbor_unsuppress_map_cmd
);
13745 install_element(BGP_VPNV4_NODE
, &no_neighbor_unsuppress_map_cmd
);
13746 install_element(BGP_VPNV6_NODE
, &neighbor_unsuppress_map_cmd
);
13747 install_element(BGP_VPNV6_NODE
, &no_neighbor_unsuppress_map_cmd
);
13749 /* "neighbor maximum-prefix" commands. */
13750 install_element(BGP_NODE
, &neighbor_maximum_prefix_hidden_cmd
);
13751 install_element(BGP_NODE
,
13752 &neighbor_maximum_prefix_threshold_hidden_cmd
);
13753 install_element(BGP_NODE
, &neighbor_maximum_prefix_warning_hidden_cmd
);
13754 install_element(BGP_NODE
,
13755 &neighbor_maximum_prefix_threshold_warning_hidden_cmd
);
13756 install_element(BGP_NODE
, &neighbor_maximum_prefix_restart_hidden_cmd
);
13757 install_element(BGP_NODE
,
13758 &neighbor_maximum_prefix_threshold_restart_hidden_cmd
);
13759 install_element(BGP_NODE
, &no_neighbor_maximum_prefix_hidden_cmd
);
13760 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_cmd
);
13761 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13762 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13763 install_element(BGP_IPV4_NODE
,
13764 &neighbor_maximum_prefix_threshold_warning_cmd
);
13765 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13766 install_element(BGP_IPV4_NODE
,
13767 &neighbor_maximum_prefix_threshold_restart_cmd
);
13768 install_element(BGP_IPV4_NODE
, &no_neighbor_maximum_prefix_cmd
);
13769 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_cmd
);
13770 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13771 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13772 install_element(BGP_IPV4M_NODE
,
13773 &neighbor_maximum_prefix_threshold_warning_cmd
);
13774 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13775 install_element(BGP_IPV4M_NODE
,
13776 &neighbor_maximum_prefix_threshold_restart_cmd
);
13777 install_element(BGP_IPV4M_NODE
, &no_neighbor_maximum_prefix_cmd
);
13778 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_cmd
);
13779 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13780 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13781 install_element(BGP_IPV4L_NODE
,
13782 &neighbor_maximum_prefix_threshold_warning_cmd
);
13783 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13784 install_element(BGP_IPV4L_NODE
,
13785 &neighbor_maximum_prefix_threshold_restart_cmd
);
13786 install_element(BGP_IPV4L_NODE
, &no_neighbor_maximum_prefix_cmd
);
13787 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_cmd
);
13788 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13789 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13790 install_element(BGP_IPV6_NODE
,
13791 &neighbor_maximum_prefix_threshold_warning_cmd
);
13792 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13793 install_element(BGP_IPV6_NODE
,
13794 &neighbor_maximum_prefix_threshold_restart_cmd
);
13795 install_element(BGP_IPV6_NODE
, &no_neighbor_maximum_prefix_cmd
);
13796 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_cmd
);
13797 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13798 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13799 install_element(BGP_IPV6M_NODE
,
13800 &neighbor_maximum_prefix_threshold_warning_cmd
);
13801 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13802 install_element(BGP_IPV6M_NODE
,
13803 &neighbor_maximum_prefix_threshold_restart_cmd
);
13804 install_element(BGP_IPV6M_NODE
, &no_neighbor_maximum_prefix_cmd
);
13805 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_cmd
);
13806 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13807 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13808 install_element(BGP_IPV6L_NODE
,
13809 &neighbor_maximum_prefix_threshold_warning_cmd
);
13810 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13811 install_element(BGP_IPV6L_NODE
,
13812 &neighbor_maximum_prefix_threshold_restart_cmd
);
13813 install_element(BGP_IPV6L_NODE
, &no_neighbor_maximum_prefix_cmd
);
13814 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_cmd
);
13815 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13816 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13817 install_element(BGP_VPNV4_NODE
,
13818 &neighbor_maximum_prefix_threshold_warning_cmd
);
13819 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13820 install_element(BGP_VPNV4_NODE
,
13821 &neighbor_maximum_prefix_threshold_restart_cmd
);
13822 install_element(BGP_VPNV4_NODE
, &no_neighbor_maximum_prefix_cmd
);
13823 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_cmd
);
13824 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13825 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13826 install_element(BGP_VPNV6_NODE
,
13827 &neighbor_maximum_prefix_threshold_warning_cmd
);
13828 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13829 install_element(BGP_VPNV6_NODE
,
13830 &neighbor_maximum_prefix_threshold_restart_cmd
);
13831 install_element(BGP_VPNV6_NODE
, &no_neighbor_maximum_prefix_cmd
);
13833 /* "neighbor allowas-in" */
13834 install_element(BGP_NODE
, &neighbor_allowas_in_hidden_cmd
);
13835 install_element(BGP_NODE
, &no_neighbor_allowas_in_hidden_cmd
);
13836 install_element(BGP_IPV4_NODE
, &neighbor_allowas_in_cmd
);
13837 install_element(BGP_IPV4_NODE
, &no_neighbor_allowas_in_cmd
);
13838 install_element(BGP_IPV4M_NODE
, &neighbor_allowas_in_cmd
);
13839 install_element(BGP_IPV4M_NODE
, &no_neighbor_allowas_in_cmd
);
13840 install_element(BGP_IPV4L_NODE
, &neighbor_allowas_in_cmd
);
13841 install_element(BGP_IPV4L_NODE
, &no_neighbor_allowas_in_cmd
);
13842 install_element(BGP_IPV6_NODE
, &neighbor_allowas_in_cmd
);
13843 install_element(BGP_IPV6_NODE
, &no_neighbor_allowas_in_cmd
);
13844 install_element(BGP_IPV6M_NODE
, &neighbor_allowas_in_cmd
);
13845 install_element(BGP_IPV6M_NODE
, &no_neighbor_allowas_in_cmd
);
13846 install_element(BGP_IPV6L_NODE
, &neighbor_allowas_in_cmd
);
13847 install_element(BGP_IPV6L_NODE
, &no_neighbor_allowas_in_cmd
);
13848 install_element(BGP_VPNV4_NODE
, &neighbor_allowas_in_cmd
);
13849 install_element(BGP_VPNV4_NODE
, &no_neighbor_allowas_in_cmd
);
13850 install_element(BGP_VPNV6_NODE
, &neighbor_allowas_in_cmd
);
13851 install_element(BGP_VPNV6_NODE
, &no_neighbor_allowas_in_cmd
);
13852 install_element(BGP_EVPN_NODE
, &neighbor_allowas_in_cmd
);
13853 install_element(BGP_EVPN_NODE
, &no_neighbor_allowas_in_cmd
);
13855 /* address-family commands. */
13856 install_element(BGP_NODE
, &address_family_ipv4_safi_cmd
);
13857 install_element(BGP_NODE
, &address_family_ipv6_safi_cmd
);
13858 #ifdef KEEP_OLD_VPN_COMMANDS
13859 install_element(BGP_NODE
, &address_family_vpnv4_cmd
);
13860 install_element(BGP_NODE
, &address_family_vpnv6_cmd
);
13861 #endif /* KEEP_OLD_VPN_COMMANDS */
13863 install_element(BGP_NODE
, &address_family_evpn_cmd
);
13865 /* "exit-address-family" command. */
13866 install_element(BGP_IPV4_NODE
, &exit_address_family_cmd
);
13867 install_element(BGP_IPV4M_NODE
, &exit_address_family_cmd
);
13868 install_element(BGP_IPV4L_NODE
, &exit_address_family_cmd
);
13869 install_element(BGP_IPV6_NODE
, &exit_address_family_cmd
);
13870 install_element(BGP_IPV6M_NODE
, &exit_address_family_cmd
);
13871 install_element(BGP_IPV6L_NODE
, &exit_address_family_cmd
);
13872 install_element(BGP_VPNV4_NODE
, &exit_address_family_cmd
);
13873 install_element(BGP_VPNV6_NODE
, &exit_address_family_cmd
);
13874 install_element(BGP_FLOWSPECV4_NODE
, &exit_address_family_cmd
);
13875 install_element(BGP_FLOWSPECV6_NODE
, &exit_address_family_cmd
);
13876 install_element(BGP_EVPN_NODE
, &exit_address_family_cmd
);
13878 /* "clear ip bgp commands" */
13879 install_element(ENABLE_NODE
, &clear_ip_bgp_all_cmd
);
13881 /* clear ip bgp prefix */
13882 install_element(ENABLE_NODE
, &clear_ip_bgp_prefix_cmd
);
13883 install_element(ENABLE_NODE
, &clear_bgp_ipv6_safi_prefix_cmd
);
13884 install_element(ENABLE_NODE
, &clear_bgp_instance_ipv6_safi_prefix_cmd
);
13886 /* "show [ip] bgp summary" commands. */
13887 install_element(VIEW_NODE
, &show_bgp_instance_all_ipv6_updgrps_cmd
);
13888 install_element(VIEW_NODE
, &show_bgp_l2vpn_evpn_updgrps_cmd
);
13889 install_element(VIEW_NODE
, &show_bgp_instance_updgrps_stats_cmd
);
13890 install_element(VIEW_NODE
, &show_bgp_updgrps_stats_cmd
);
13891 install_element(VIEW_NODE
, &show_ip_bgp_instance_updgrps_adj_s_cmd
);
13892 install_element(VIEW_NODE
, &show_ip_bgp_summary_cmd
);
13893 install_element(VIEW_NODE
, &show_ip_bgp_updgrps_cmd
);
13895 /* "show [ip] bgp neighbors" commands. */
13896 install_element(VIEW_NODE
, &show_ip_bgp_neighbors_cmd
);
13898 /* "show [ip] bgp peer-group" commands. */
13899 install_element(VIEW_NODE
, &show_ip_bgp_peer_groups_cmd
);
13901 /* "show [ip] bgp paths" commands. */
13902 install_element(VIEW_NODE
, &show_ip_bgp_paths_cmd
);
13904 /* "show [ip] bgp community" commands. */
13905 install_element(VIEW_NODE
, &show_ip_bgp_community_info_cmd
);
13907 /* "show ip bgp large-community" commands. */
13908 install_element(VIEW_NODE
, &show_ip_bgp_lcommunity_info_cmd
);
13909 /* "show [ip] bgp attribute-info" commands. */
13910 install_element(VIEW_NODE
, &show_ip_bgp_attr_info_cmd
);
13911 /* "show [ip] bgp route-leak" command */
13912 install_element(VIEW_NODE
, &show_ip_bgp_route_leak_cmd
);
13914 /* "redistribute" commands. */
13915 install_element(BGP_NODE
, &bgp_redistribute_ipv4_hidden_cmd
);
13916 install_element(BGP_NODE
, &no_bgp_redistribute_ipv4_hidden_cmd
);
13917 install_element(BGP_NODE
, &bgp_redistribute_ipv4_rmap_hidden_cmd
);
13918 install_element(BGP_NODE
, &bgp_redistribute_ipv4_metric_hidden_cmd
);
13919 install_element(BGP_NODE
,
13920 &bgp_redistribute_ipv4_rmap_metric_hidden_cmd
);
13921 install_element(BGP_NODE
,
13922 &bgp_redistribute_ipv4_metric_rmap_hidden_cmd
);
13923 install_element(BGP_NODE
, &bgp_redistribute_ipv4_ospf_hidden_cmd
);
13924 install_element(BGP_NODE
, &no_bgp_redistribute_ipv4_ospf_hidden_cmd
);
13925 install_element(BGP_NODE
, &bgp_redistribute_ipv4_ospf_rmap_hidden_cmd
);
13926 install_element(BGP_NODE
,
13927 &bgp_redistribute_ipv4_ospf_metric_hidden_cmd
);
13928 install_element(BGP_NODE
,
13929 &bgp_redistribute_ipv4_ospf_rmap_metric_hidden_cmd
);
13930 install_element(BGP_NODE
,
13931 &bgp_redistribute_ipv4_ospf_metric_rmap_hidden_cmd
);
13932 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_cmd
);
13933 install_element(BGP_IPV4_NODE
, &no_bgp_redistribute_ipv4_cmd
);
13934 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_rmap_cmd
);
13935 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_metric_cmd
);
13936 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_rmap_metric_cmd
);
13937 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_metric_rmap_cmd
);
13938 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_ospf_cmd
);
13939 install_element(BGP_IPV4_NODE
, &no_bgp_redistribute_ipv4_ospf_cmd
);
13940 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_ospf_rmap_cmd
);
13941 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_ospf_metric_cmd
);
13942 install_element(BGP_IPV4_NODE
,
13943 &bgp_redistribute_ipv4_ospf_rmap_metric_cmd
);
13944 install_element(BGP_IPV4_NODE
,
13945 &bgp_redistribute_ipv4_ospf_metric_rmap_cmd
);
13946 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_cmd
);
13947 install_element(BGP_IPV6_NODE
, &no_bgp_redistribute_ipv6_cmd
);
13948 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_rmap_cmd
);
13949 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_metric_cmd
);
13950 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_rmap_metric_cmd
);
13951 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_metric_rmap_cmd
);
13953 /* import|export vpn [route-map WORD] */
13954 install_element(BGP_IPV4_NODE
, &bgp_imexport_vpn_cmd
);
13955 install_element(BGP_IPV6_NODE
, &bgp_imexport_vpn_cmd
);
13957 install_element(BGP_IPV4_NODE
, &bgp_imexport_vrf_cmd
);
13958 install_element(BGP_IPV6_NODE
, &bgp_imexport_vrf_cmd
);
13960 /* ttl_security commands */
13961 install_element(BGP_NODE
, &neighbor_ttl_security_cmd
);
13962 install_element(BGP_NODE
, &no_neighbor_ttl_security_cmd
);
13964 /* "show [ip] bgp memory" commands. */
13965 install_element(VIEW_NODE
, &show_bgp_memory_cmd
);
13967 /* "show bgp martian next-hop" */
13968 install_element(VIEW_NODE
, &show_bgp_martian_nexthop_db_cmd
);
13970 install_element(VIEW_NODE
, &show_bgp_mac_hash_cmd
);
13972 /* "show [ip] bgp views" commands. */
13973 install_element(VIEW_NODE
, &show_bgp_views_cmd
);
13975 /* "show [ip] bgp vrfs" commands. */
13976 install_element(VIEW_NODE
, &show_bgp_vrfs_cmd
);
13978 /* Community-list. */
13979 community_list_vty();
13981 /* vpn-policy commands */
13982 install_element(BGP_IPV4_NODE
, &af_rd_vpn_export_cmd
);
13983 install_element(BGP_IPV6_NODE
, &af_rd_vpn_export_cmd
);
13984 install_element(BGP_IPV4_NODE
, &af_label_vpn_export_cmd
);
13985 install_element(BGP_IPV6_NODE
, &af_label_vpn_export_cmd
);
13986 install_element(BGP_IPV4_NODE
, &af_nexthop_vpn_export_cmd
);
13987 install_element(BGP_IPV6_NODE
, &af_nexthop_vpn_export_cmd
);
13988 install_element(BGP_IPV4_NODE
, &af_rt_vpn_imexport_cmd
);
13989 install_element(BGP_IPV6_NODE
, &af_rt_vpn_imexport_cmd
);
13990 install_element(BGP_IPV4_NODE
, &af_route_map_vpn_imexport_cmd
);
13991 install_element(BGP_IPV6_NODE
, &af_route_map_vpn_imexport_cmd
);
13992 install_element(BGP_IPV4_NODE
, &af_import_vrf_route_map_cmd
);
13993 install_element(BGP_IPV6_NODE
, &af_import_vrf_route_map_cmd
);
13995 install_element(BGP_IPV4_NODE
, &af_routetarget_import_cmd
);
13996 install_element(BGP_IPV6_NODE
, &af_routetarget_import_cmd
);
13998 install_element(BGP_IPV4_NODE
, &af_no_rd_vpn_export_cmd
);
13999 install_element(BGP_IPV6_NODE
, &af_no_rd_vpn_export_cmd
);
14000 install_element(BGP_IPV4_NODE
, &af_no_label_vpn_export_cmd
);
14001 install_element(BGP_IPV6_NODE
, &af_no_label_vpn_export_cmd
);
14002 install_element(BGP_IPV4_NODE
, &af_no_nexthop_vpn_export_cmd
);
14003 install_element(BGP_IPV6_NODE
, &af_no_nexthop_vpn_export_cmd
);
14004 install_element(BGP_IPV4_NODE
, &af_no_rt_vpn_imexport_cmd
);
14005 install_element(BGP_IPV6_NODE
, &af_no_rt_vpn_imexport_cmd
);
14006 install_element(BGP_IPV4_NODE
, &af_no_route_map_vpn_imexport_cmd
);
14007 install_element(BGP_IPV6_NODE
, &af_no_route_map_vpn_imexport_cmd
);
14008 install_element(BGP_IPV4_NODE
, &af_no_import_vrf_route_map_cmd
);
14009 install_element(BGP_IPV6_NODE
, &af_no_import_vrf_route_map_cmd
);
14012 #include "memory.h"
14013 #include "bgp_regex.h"
14014 #include "bgp_clist.h"
14015 #include "bgp_ecommunity.h"
14017 /* VTY functions. */
14019 /* Direction value to string conversion. */
14020 static const char *community_direct_str(int direct
)
14023 case COMMUNITY_DENY
:
14025 case COMMUNITY_PERMIT
:
14032 /* Display error string. */
14033 static void community_list_perror(struct vty
*vty
, int ret
)
14036 case COMMUNITY_LIST_ERR_CANT_FIND_LIST
:
14037 vty_out(vty
, "%% Can't find community-list\n");
14039 case COMMUNITY_LIST_ERR_MALFORMED_VAL
:
14040 vty_out(vty
, "%% Malformed community-list value\n");
14042 case COMMUNITY_LIST_ERR_STANDARD_CONFLICT
:
14044 "%% Community name conflict, previously defined as standard community\n");
14046 case COMMUNITY_LIST_ERR_EXPANDED_CONFLICT
:
14048 "%% Community name conflict, previously defined as expanded community\n");
14053 /* "community-list" keyword help string. */
14054 #define COMMUNITY_LIST_STR "Add a community list entry\n"
14056 /*community-list standard */
14057 DEFUN (community_list_standard
,
14058 bgp_community_list_standard_cmd
,
14059 "bgp community-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
14062 "Community list number (standard)\n"
14063 "Add an standard community-list entry\n"
14064 "Community list name\n"
14065 "Specify community to reject\n"
14066 "Specify community to accept\n"
14069 char *cl_name_or_number
= NULL
;
14071 int style
= COMMUNITY_LIST_STANDARD
;
14075 if (argv_find(argv
, argc
, "ip", &idx
)) {
14076 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
14077 vty_out(vty
, "if you are using this please migrate to the below command.\n");
14078 vty_out(vty
, "'bgp community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> AA:NN'\n");
14079 zlog_warn("Deprecated option: 'ip community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> AA:NN' being used");
14082 argv_find(argv
, argc
, "(1-99)", &idx
);
14083 argv_find(argv
, argc
, "WORD", &idx
);
14084 cl_name_or_number
= argv
[idx
]->arg
;
14085 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
14087 argv_find(argv
, argc
, "AA:NN", &idx
);
14088 char *str
= argv_concat(argv
, argc
, idx
);
14090 int ret
= community_list_set(bgp_clist
, cl_name_or_number
, str
, direct
,
14093 XFREE(MTYPE_TMP
, str
);
14096 /* Display error string. */
14097 community_list_perror(vty
, ret
);
14098 return CMD_WARNING_CONFIG_FAILED
;
14101 return CMD_SUCCESS
;
14104 #if CONFDATE > 20191005
14105 CPP_NOTICE("bgpd: remove deprecated 'ip community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> AA:NN' command")
14107 ALIAS (community_list_standard
,
14108 ip_community_list_standard_cmd
,
14109 "ip community-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
14112 "Community list number (standard)\n"
14113 "Add an standard community-list entry\n"
14114 "Community list name\n"
14115 "Specify community to reject\n"
14116 "Specify community to accept\n"
14119 DEFUN (no_community_list_standard_all
,
14120 no_bgp_community_list_standard_all_cmd
,
14121 "no bgp community-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
14125 "Community list number (standard)\n"
14126 "Add an standard community-list entry\n"
14127 "Community list name\n"
14128 "Specify community to reject\n"
14129 "Specify community to accept\n"
14132 char *cl_name_or_number
= NULL
;
14135 int style
= COMMUNITY_LIST_STANDARD
;
14139 if (argv_find(argv
, argc
, "ip", &idx
)) {
14140 vty_out(vty
, "This config option is deprecated, and is scheduled for removal\n");
14141 vty_out(vty
, "if you are using this please migrate to the below command.\n");
14142 vty_out(vty
, "'no bgp community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> AA:NN'\n");
14143 zlog_warn("Deprecated option: 'no ip community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> |AA:NN' being used");
14146 argv_find(argv
, argc
, "permit", &idx
);
14147 argv_find(argv
, argc
, "deny", &idx
);
14150 direct
= argv_find(argv
, argc
, "permit", &idx
)
14155 argv_find(argv
, argc
, "AA:NN", &idx
);
14156 str
= argv_concat(argv
, argc
, idx
);
14160 argv_find(argv
, argc
, "(1-99)", &idx
);
14161 argv_find(argv
, argc
, "WORD", &idx
);
14162 cl_name_or_number
= argv
[idx
]->arg
;
14164 int ret
= community_list_unset(bgp_clist
, cl_name_or_number
, str
,
14167 XFREE(MTYPE_TMP
, str
);
14170 community_list_perror(vty
, ret
);
14171 return CMD_WARNING_CONFIG_FAILED
;
14174 return CMD_SUCCESS
;
14176 ALIAS (no_community_list_standard_all
,
14177 no_ip_community_list_standard_all_cmd
,
14178 "no ip community-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
14182 "Community list number (standard)\n"
14183 "Add an standard community-list entry\n"
14184 "Community list name\n"
14185 "Specify community to reject\n"
14186 "Specify community to accept\n"
14189 ALIAS(no_community_list_standard_all
, no_bgp_community_list_standard_all_list_cmd
,
14190 "no bgp community-list <(1-99)|standard WORD>",
14191 NO_STR BGP_STR COMMUNITY_LIST_STR
14192 "Community list number (standard)\n"
14193 "Add an standard community-list entry\n"
14194 "Community list name\n")
14196 ALIAS(no_community_list_standard_all
, no_ip_community_list_standard_all_list_cmd
,
14197 "no ip community-list <(1-99)|standard WORD>",
14198 NO_STR BGP_STR COMMUNITY_LIST_STR
14199 "Community list number (standard)\n"
14200 "Add an standard community-list entry\n"
14201 "Community list name\n")
14203 /*community-list expanded */
14204 DEFUN (community_list_expanded_all
,
14205 bgp_community_list_expanded_all_cmd
,
14206 "bgp community-list <(100-500)|expanded WORD> <deny|permit> AA:NN...",
14209 "Community list number (expanded)\n"
14210 "Add an expanded community-list entry\n"
14211 "Community list name\n"
14212 "Specify community to reject\n"
14213 "Specify community to accept\n"
14216 char *cl_name_or_number
= NULL
;
14218 int style
= COMMUNITY_LIST_EXPANDED
;
14221 if (argv_find(argv
, argc
, "ip", &idx
)) {
14222 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
14223 vty_out(vty
, "if you are using this please migrate to the below command.\n");
14224 vty_out(vty
, "'bgp community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> AA:NN'\n");
14225 zlog_warn("Deprecated option: 'ip community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> AA:NN' being used");
14227 argv_find(argv
, argc
, "(100-500)", &idx
);
14228 argv_find(argv
, argc
, "WORD", &idx
);
14229 cl_name_or_number
= argv
[idx
]->arg
;
14230 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
14232 argv_find(argv
, argc
, "AA:NN", &idx
);
14233 char *str
= argv_concat(argv
, argc
, idx
);
14235 int ret
= community_list_set(bgp_clist
, cl_name_or_number
, str
, direct
,
14238 XFREE(MTYPE_TMP
, str
);
14241 /* Display error string. */
14242 community_list_perror(vty
, ret
);
14243 return CMD_WARNING_CONFIG_FAILED
;
14246 return CMD_SUCCESS
;
14249 ALIAS (community_list_expanded_all
,
14250 ip_community_list_expanded_all_cmd
,
14251 "ip community-list <(100-500)|expanded WORD> <deny|permit> AA:NN...",
14254 "Community list number (expanded)\n"
14255 "Add an expanded community-list entry\n"
14256 "Community list name\n"
14257 "Specify community to reject\n"
14258 "Specify community to accept\n"
14261 DEFUN (no_community_list_expanded_all
,
14262 no_bgp_community_list_expanded_all_cmd
,
14263 "no bgp community-list <(100-500)|expanded WORD> <deny|permit> AA:NN...",
14267 "Community list number (expanded)\n"
14268 "Add an expanded community-list entry\n"
14269 "Community list name\n"
14270 "Specify community to reject\n"
14271 "Specify community to accept\n"
14274 char *cl_name_or_number
= NULL
;
14277 int style
= COMMUNITY_LIST_EXPANDED
;
14280 if (argv_find(argv
, argc
, "ip", &idx
)) {
14281 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
14282 vty_out(vty
, "if you are using this please migrate to the below command.\n");
14283 vty_out(vty
, "'no bgp community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> AA:NN'\n");
14284 zlog_warn("Deprecated option: 'no ip community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> AA:NN' being used");
14288 argv_find(argv
, argc
, "permit", &idx
);
14289 argv_find(argv
, argc
, "deny", &idx
);
14292 direct
= argv_find(argv
, argc
, "permit", &idx
)
14297 argv_find(argv
, argc
, "AA:NN", &idx
);
14298 str
= argv_concat(argv
, argc
, idx
);
14302 argv_find(argv
, argc
, "(100-500)", &idx
);
14303 argv_find(argv
, argc
, "WORD", &idx
);
14304 cl_name_or_number
= argv
[idx
]->arg
;
14306 int ret
= community_list_unset(bgp_clist
, cl_name_or_number
, str
,
14309 XFREE(MTYPE_TMP
, str
);
14312 community_list_perror(vty
, ret
);
14313 return CMD_WARNING_CONFIG_FAILED
;
14316 return CMD_SUCCESS
;
14319 ALIAS (no_community_list_expanded_all
,
14320 no_ip_community_list_expanded_all_cmd
,
14321 "no ip community-list <(100-500)|expanded WORD> <deny|permit> AA:NN...",
14325 "Community list number (expanded)\n"
14326 "Add an expanded community-list entry\n"
14327 "Community list name\n"
14328 "Specify community to reject\n"
14329 "Specify community to accept\n"
14332 ALIAS(no_community_list_expanded_all
, no_bgp_community_list_expanded_all_list_cmd
,
14333 "no bgp community-list <(100-500)|expanded WORD>",
14334 NO_STR IP_STR COMMUNITY_LIST_STR
14335 "Community list number (expanded)\n"
14336 "Add an expanded community-list entry\n"
14337 "Community list name\n")
14339 ALIAS(no_community_list_expanded_all
, no_ip_community_list_expanded_all_list_cmd
,
14340 "no ip community-list <(100-500)|expanded WORD>",
14341 NO_STR IP_STR COMMUNITY_LIST_STR
14342 "Community list number (expanded)\n"
14343 "Add an expanded community-list entry\n"
14344 "Community list name\n")
14346 /* Return configuration string of community-list entry. */
14347 static const char *community_list_config_str(struct community_entry
*entry
)
14354 if (entry
->style
== COMMUNITY_LIST_STANDARD
)
14355 str
= community_str(entry
->u
.com
, false);
14356 else if (entry
->style
== LARGE_COMMUNITY_LIST_STANDARD
)
14357 str
= lcommunity_str(entry
->u
.lcom
, false);
14359 str
= entry
->config
;
14364 static void community_list_show(struct vty
*vty
, struct community_list
*list
)
14366 struct community_entry
*entry
;
14368 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
14369 if (entry
== list
->head
) {
14370 if (all_digit(list
->name
))
14371 vty_out(vty
, "Community %s list %s\n",
14372 entry
->style
== COMMUNITY_LIST_STANDARD
14374 : "(expanded) access",
14377 vty_out(vty
, "Named Community %s list %s\n",
14378 entry
->style
== COMMUNITY_LIST_STANDARD
14384 vty_out(vty
, " %s\n",
14385 community_direct_str(entry
->direct
));
14387 vty_out(vty
, " %s %s\n",
14388 community_direct_str(entry
->direct
),
14389 community_list_config_str(entry
));
14393 DEFUN (show_community_list
,
14394 show_bgp_community_list_cmd
,
14395 "show bgp community-list",
14398 "List community-list\n")
14400 struct community_list
*list
;
14401 struct community_list_master
*cm
;
14404 if (argv_find(argv
, argc
, "ip", &idx
)) {
14405 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
14406 vty_out(vty
, "if you are using this please migrate to the below command.\n");
14407 vty_out(vty
, "'show bgp community-list <(1-500)|WORD>'\n");
14408 zlog_warn("Deprecated option: 'ip show community-list <(1-500)|WORD>' being used");
14410 cm
= community_list_master_lookup(bgp_clist
, COMMUNITY_LIST_MASTER
);
14412 return CMD_SUCCESS
;
14414 for (list
= cm
->num
.head
; list
; list
= list
->next
)
14415 community_list_show(vty
, list
);
14417 for (list
= cm
->str
.head
; list
; list
= list
->next
)
14418 community_list_show(vty
, list
);
14420 return CMD_SUCCESS
;
14423 ALIAS (show_community_list
,
14424 show_ip_community_list_cmd
,
14425 "show ip community-list",
14428 "List community-list\n")
14430 DEFUN (show_community_list_arg
,
14431 show_bgp_community_list_arg_cmd
,
14432 "show bgp community-list <(1-500)|WORD>",
14435 "List community-list\n"
14436 "Community-list number\n"
14437 "Community-list name\n")
14439 int idx_comm_list
= 3;
14440 struct community_list
*list
;
14443 if (argv_find(argv
, argc
, "ip", &idx
)) {
14444 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
14445 vty_out(vty
, "if you are using this please migrate to the below command.\n");
14446 vty_out(vty
, "'show bgp community-list <(1-500)|WORD>'\n");
14447 zlog_warn("Deprecated option: 'ip show community-list <(1-500)|WORD>' being used");
14449 list
= community_list_lookup(bgp_clist
, argv
[idx_comm_list
]->arg
, 0,
14450 COMMUNITY_LIST_MASTER
);
14452 vty_out(vty
, "%% Can't find community-list\n");
14453 return CMD_WARNING
;
14456 community_list_show(vty
, list
);
14458 return CMD_SUCCESS
;
14461 ALIAS (show_community_list_arg
,
14462 show_ip_community_list_arg_cmd
,
14463 "show ip community-list <(1-500)|WORD>",
14466 "List community-list\n"
14467 "Community-list number\n"
14468 "Community-list name\n")
14471 * Large Community code.
14473 static int lcommunity_list_set_vty(struct vty
*vty
, int argc
,
14474 struct cmd_token
**argv
, int style
,
14475 int reject_all_digit_name
)
14483 if (argv_find(argv
, argc
, "ip", &idx
)) {
14484 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
14485 vty_out(vty
, "if you are using this please migrate to the below command.\n");
14486 vty_out(vty
, "'bgp large-community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:BB:CC>'\n");
14487 zlog_warn("Deprecated option: 'large-community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:BB:CC>' being used");
14489 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
14492 /* All digit name check. */
14494 argv_find(argv
, argc
, "WORD", &idx
);
14495 argv_find(argv
, argc
, "(1-99)", &idx
);
14496 argv_find(argv
, argc
, "(100-500)", &idx
);
14497 cl_name
= argv
[idx
]->arg
;
14498 if (reject_all_digit_name
&& all_digit(cl_name
)) {
14499 vty_out(vty
, "%% Community name cannot have all digits\n");
14500 return CMD_WARNING_CONFIG_FAILED
;
14504 argv_find(argv
, argc
, "AA:BB:CC", &idx
);
14505 argv_find(argv
, argc
, "LINE", &idx
);
14506 /* Concat community string argument. */
14508 str
= argv_concat(argv
, argc
, idx
);
14512 ret
= lcommunity_list_set(bgp_clist
, cl_name
, str
, direct
, style
);
14514 /* Free temporary community list string allocated by
14516 XFREE(MTYPE_TMP
, str
);
14519 community_list_perror(vty
, ret
);
14520 return CMD_WARNING_CONFIG_FAILED
;
14522 return CMD_SUCCESS
;
14525 static int lcommunity_list_unset_vty(struct vty
*vty
, int argc
,
14526 struct cmd_token
**argv
, int style
)
14533 if (argv_find(argv
, argc
, "ip", &idx
)) {
14534 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
14535 vty_out(vty
, "if you are using this please migrate to the below command.\n");
14536 vty_out(vty
, "'no bgp large-community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:BB:CC>'\n");
14537 zlog_warn("Deprecated option: 'no ip large-community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:BB:CC>' being used");
14539 argv_find(argv
, argc
, "permit", &idx
);
14540 argv_find(argv
, argc
, "deny", &idx
);
14543 /* Check the list direct. */
14544 if (strncmp(argv
[idx
]->arg
, "p", 1) == 0)
14545 direct
= COMMUNITY_PERMIT
;
14547 direct
= COMMUNITY_DENY
;
14550 argv_find(argv
, argc
, "LINE", &idx
);
14551 argv_find(argv
, argc
, "AA:AA:NN", &idx
);
14552 /* Concat community string argument. */
14553 str
= argv_concat(argv
, argc
, idx
);
14557 argv_find(argv
, argc
, "(1-99)", &idx
);
14558 argv_find(argv
, argc
, "(100-500)", &idx
);
14559 argv_find(argv
, argc
, "WORD", &idx
);
14561 /* Unset community list. */
14562 ret
= lcommunity_list_unset(bgp_clist
, argv
[idx
]->arg
, str
, direct
,
14565 /* Free temporary community list string allocated by
14567 XFREE(MTYPE_TMP
, str
);
14570 community_list_perror(vty
, ret
);
14571 return CMD_WARNING_CONFIG_FAILED
;
14574 return CMD_SUCCESS
;
14577 /* "large-community-list" keyword help string. */
14578 #define LCOMMUNITY_LIST_STR "Add a large community list entry\n"
14579 #define LCOMMUNITY_VAL_STR "large community in 'aa:bb:cc' format\n"
14581 #if CONFDATE > 20191005
14582 CPP_NOTICE("bgpd: remove deprecated 'ip large-community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:BB:CC>' command")
14584 DEFUN (lcommunity_list_standard
,
14585 bgp_lcommunity_list_standard_cmd
,
14586 "bgp large-community-list (1-99) <deny|permit>",
14588 LCOMMUNITY_LIST_STR
14589 "Large Community list number (standard)\n"
14590 "Specify large community to reject\n"
14591 "Specify large community to accept\n")
14593 return lcommunity_list_set_vty(vty
, argc
, argv
,
14594 LARGE_COMMUNITY_LIST_STANDARD
, 0);
14597 ALIAS (lcommunity_list_standard
,
14598 ip_lcommunity_list_standard_cmd
,
14599 "ip large-community-list (1-99) <deny|permit>",
14601 LCOMMUNITY_LIST_STR
14602 "Large Community list number (standard)\n"
14603 "Specify large community to reject\n"
14604 "Specify large community to accept\n")
14606 DEFUN (lcommunity_list_standard1
,
14607 bgp_lcommunity_list_standard1_cmd
,
14608 "bgp large-community-list (1-99) <deny|permit> AA:BB:CC...",
14610 LCOMMUNITY_LIST_STR
14611 "Large Community list number (standard)\n"
14612 "Specify large community to reject\n"
14613 "Specify large community to accept\n"
14614 LCOMMUNITY_VAL_STR
)
14616 return lcommunity_list_set_vty(vty
, argc
, argv
,
14617 LARGE_COMMUNITY_LIST_STANDARD
, 0);
14620 ALIAS (lcommunity_list_standard1
,
14621 ip_lcommunity_list_standard1_cmd
,
14622 "ip large-community-list (1-99) <deny|permit> AA:BB:CC...",
14624 LCOMMUNITY_LIST_STR
14625 "Large Community list number (standard)\n"
14626 "Specify large community to reject\n"
14627 "Specify large community to accept\n"
14628 LCOMMUNITY_VAL_STR
)
14630 DEFUN (lcommunity_list_expanded
,
14631 bgp_lcommunity_list_expanded_cmd
,
14632 "bgp large-community-list (100-500) <deny|permit> LINE...",
14634 LCOMMUNITY_LIST_STR
14635 "Large Community list number (expanded)\n"
14636 "Specify large community to reject\n"
14637 "Specify large community to accept\n"
14638 "An ordered list as a regular-expression\n")
14640 return lcommunity_list_set_vty(vty
, argc
, argv
,
14641 LARGE_COMMUNITY_LIST_EXPANDED
, 0);
14644 ALIAS (lcommunity_list_expanded
,
14645 ip_lcommunity_list_expanded_cmd
,
14646 "ip large-community-list (100-500) <deny|permit> LINE...",
14648 LCOMMUNITY_LIST_STR
14649 "Large Community list number (expanded)\n"
14650 "Specify large community to reject\n"
14651 "Specify large community to accept\n"
14652 "An ordered list as a regular-expression\n")
14654 DEFUN (lcommunity_list_name_standard
,
14655 bgp_lcommunity_list_name_standard_cmd
,
14656 "bgp large-community-list standard WORD <deny|permit>",
14658 LCOMMUNITY_LIST_STR
14659 "Specify standard large-community-list\n"
14660 "Large Community list name\n"
14661 "Specify large community to reject\n"
14662 "Specify large community to accept\n")
14664 return lcommunity_list_set_vty(vty
, argc
, argv
,
14665 LARGE_COMMUNITY_LIST_STANDARD
, 1);
14668 ALIAS (lcommunity_list_name_standard
,
14669 ip_lcommunity_list_name_standard_cmd
,
14670 "ip large-community-list standard WORD <deny|permit>",
14672 LCOMMUNITY_LIST_STR
14673 "Specify standard large-community-list\n"
14674 "Large Community list name\n"
14675 "Specify large community to reject\n"
14676 "Specify large community to accept\n")
14678 DEFUN (lcommunity_list_name_standard1
,
14679 bgp_lcommunity_list_name_standard1_cmd
,
14680 "bgp large-community-list standard WORD <deny|permit> AA:BB:CC...",
14682 LCOMMUNITY_LIST_STR
14683 "Specify standard large-community-list\n"
14684 "Large Community list name\n"
14685 "Specify large community to reject\n"
14686 "Specify large community to accept\n"
14687 LCOMMUNITY_VAL_STR
)
14689 return lcommunity_list_set_vty(vty
, argc
, argv
,
14690 LARGE_COMMUNITY_LIST_STANDARD
, 1);
14693 ALIAS (lcommunity_list_name_standard1
,
14694 ip_lcommunity_list_name_standard1_cmd
,
14695 "ip large-community-list standard WORD <deny|permit> AA:BB:CC...",
14697 LCOMMUNITY_LIST_STR
14698 "Specify standard large-community-list\n"
14699 "Large Community list name\n"
14700 "Specify large community to reject\n"
14701 "Specify large community to accept\n"
14702 LCOMMUNITY_VAL_STR
)
14704 DEFUN (lcommunity_list_name_expanded
,
14705 bgp_lcommunity_list_name_expanded_cmd
,
14706 "bgp large-community-list expanded WORD <deny|permit> LINE...",
14708 LCOMMUNITY_LIST_STR
14709 "Specify expanded large-community-list\n"
14710 "Large Community list name\n"
14711 "Specify large community to reject\n"
14712 "Specify large community to accept\n"
14713 "An ordered list as a regular-expression\n")
14715 return lcommunity_list_set_vty(vty
, argc
, argv
,
14716 LARGE_COMMUNITY_LIST_EXPANDED
, 1);
14719 ALIAS (lcommunity_list_name_expanded
,
14720 ip_lcommunity_list_name_expanded_cmd
,
14721 "ip large-community-list expanded WORD <deny|permit> LINE...",
14723 LCOMMUNITY_LIST_STR
14724 "Specify expanded large-community-list\n"
14725 "Large Community list name\n"
14726 "Specify large community to reject\n"
14727 "Specify large community to accept\n"
14728 "An ordered list as a regular-expression\n")
14730 DEFUN (no_lcommunity_list_standard_all
,
14731 no_bgp_lcommunity_list_standard_all_cmd
,
14732 "no bgp large-community-list <(1-99)|(100-500)|WORD>",
14735 LCOMMUNITY_LIST_STR
14736 "Large Community list number (standard)\n"
14737 "Large Community list number (expanded)\n"
14738 "Large Community list name\n")
14740 return lcommunity_list_unset_vty(vty
, argc
, argv
,
14741 LARGE_COMMUNITY_LIST_STANDARD
);
14744 ALIAS (no_lcommunity_list_standard_all
,
14745 no_ip_lcommunity_list_standard_all_cmd
,
14746 "no ip large-community-list <(1-99)|(100-500)|WORD>",
14749 LCOMMUNITY_LIST_STR
14750 "Large Community list number (standard)\n"
14751 "Large Community list number (expanded)\n"
14752 "Large Community list name\n")
14754 DEFUN (no_lcommunity_list_name_expanded_all
,
14755 no_bgp_lcommunity_list_name_expanded_all_cmd
,
14756 "no bgp large-community-list expanded WORD",
14759 LCOMMUNITY_LIST_STR
14760 "Specify expanded large-community-list\n"
14761 "Large Community list name\n")
14763 return lcommunity_list_unset_vty(vty
, argc
, argv
,
14764 LARGE_COMMUNITY_LIST_EXPANDED
);
14767 ALIAS (no_lcommunity_list_name_expanded_all
,
14768 no_ip_lcommunity_list_name_expanded_all_cmd
,
14769 "no ip large-community-list expanded WORD",
14772 LCOMMUNITY_LIST_STR
14773 "Specify expanded large-community-list\n"
14774 "Large Community list name\n")
14776 DEFUN (no_lcommunity_list_standard
,
14777 no_bgp_lcommunity_list_standard_cmd
,
14778 "no bgp large-community-list (1-99) <deny|permit> AA:AA:NN...",
14781 LCOMMUNITY_LIST_STR
14782 "Large Community list number (standard)\n"
14783 "Specify large community to reject\n"
14784 "Specify large community to accept\n"
14785 LCOMMUNITY_VAL_STR
)
14787 return lcommunity_list_unset_vty(vty
, argc
, argv
,
14788 LARGE_COMMUNITY_LIST_STANDARD
);
14791 ALIAS (no_lcommunity_list_standard
,
14792 no_ip_lcommunity_list_standard_cmd
,
14793 "no ip large-community-list (1-99) <deny|permit> AA:AA:NN...",
14796 LCOMMUNITY_LIST_STR
14797 "Large Community list number (standard)\n"
14798 "Specify large community to reject\n"
14799 "Specify large community to accept\n"
14800 LCOMMUNITY_VAL_STR
)
14802 DEFUN (no_lcommunity_list_expanded
,
14803 no_bgp_lcommunity_list_expanded_cmd
,
14804 "no bgp large-community-list (100-500) <deny|permit> LINE...",
14807 LCOMMUNITY_LIST_STR
14808 "Large Community list number (expanded)\n"
14809 "Specify large community to reject\n"
14810 "Specify large community to accept\n"
14811 "An ordered list as a regular-expression\n")
14813 return lcommunity_list_unset_vty(vty
, argc
, argv
,
14814 LARGE_COMMUNITY_LIST_EXPANDED
);
14817 ALIAS (no_lcommunity_list_expanded
,
14818 no_ip_lcommunity_list_expanded_cmd
,
14819 "no ip large-community-list (100-500) <deny|permit> LINE...",
14822 LCOMMUNITY_LIST_STR
14823 "Large Community list number (expanded)\n"
14824 "Specify large community to reject\n"
14825 "Specify large community to accept\n"
14826 "An ordered list as a regular-expression\n")
14828 DEFUN (no_lcommunity_list_name_standard
,
14829 no_bgp_lcommunity_list_name_standard_cmd
,
14830 "no bgp large-community-list standard WORD <deny|permit> AA:AA:NN...",
14833 LCOMMUNITY_LIST_STR
14834 "Specify standard large-community-list\n"
14835 "Large Community list name\n"
14836 "Specify large community to reject\n"
14837 "Specify large community to accept\n"
14838 LCOMMUNITY_VAL_STR
)
14840 return lcommunity_list_unset_vty(vty
, argc
, argv
,
14841 LARGE_COMMUNITY_LIST_STANDARD
);
14844 ALIAS (no_lcommunity_list_name_standard
,
14845 no_ip_lcommunity_list_name_standard_cmd
,
14846 "no ip large-community-list standard WORD <deny|permit> AA:AA:NN...",
14849 LCOMMUNITY_LIST_STR
14850 "Specify standard large-community-list\n"
14851 "Large Community list name\n"
14852 "Specify large community to reject\n"
14853 "Specify large community to accept\n"
14854 LCOMMUNITY_VAL_STR
)
14856 DEFUN (no_lcommunity_list_name_expanded
,
14857 no_bgp_lcommunity_list_name_expanded_cmd
,
14858 "no bgp large-community-list expanded WORD <deny|permit> LINE...",
14861 LCOMMUNITY_LIST_STR
14862 "Specify expanded large-community-list\n"
14863 "Large community list name\n"
14864 "Specify large community to reject\n"
14865 "Specify large community to accept\n"
14866 "An ordered list as a regular-expression\n")
14868 return lcommunity_list_unset_vty(vty
, argc
, argv
,
14869 LARGE_COMMUNITY_LIST_EXPANDED
);
14872 ALIAS (no_lcommunity_list_name_expanded
,
14873 no_ip_lcommunity_list_name_expanded_cmd
,
14874 "no ip large-community-list expanded WORD <deny|permit> LINE...",
14877 LCOMMUNITY_LIST_STR
14878 "Specify expanded large-community-list\n"
14879 "Large community list name\n"
14880 "Specify large community to reject\n"
14881 "Specify large community to accept\n"
14882 "An ordered list as a regular-expression\n")
14884 static void lcommunity_list_show(struct vty
*vty
, struct community_list
*list
)
14886 struct community_entry
*entry
;
14888 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
14889 if (entry
== list
->head
) {
14890 if (all_digit(list
->name
))
14891 vty_out(vty
, "Large community %s list %s\n",
14893 LARGE_COMMUNITY_LIST_STANDARD
14895 : "(expanded) access",
14899 "Named large community %s list %s\n",
14901 LARGE_COMMUNITY_LIST_STANDARD
14907 vty_out(vty
, " %s\n",
14908 community_direct_str(entry
->direct
));
14910 vty_out(vty
, " %s %s\n",
14911 community_direct_str(entry
->direct
),
14912 community_list_config_str(entry
));
14916 DEFUN (show_lcommunity_list
,
14917 show_bgp_lcommunity_list_cmd
,
14918 "show bgp large-community-list",
14921 "List large-community list\n")
14923 struct community_list
*list
;
14924 struct community_list_master
*cm
;
14927 if (argv_find(argv
, argc
, "ip", &idx
)) {
14928 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
14929 vty_out(vty
, "if you are using this please migrate to the below command.\n");
14930 vty_out(vty
, "'show bgp large-community-list <(1-500)|WORD>'\n");
14931 zlog_warn("Deprecated option: 'ip show large-community-list <(1-500)|WORD>' being used");
14934 cm
= community_list_master_lookup(bgp_clist
,
14935 LARGE_COMMUNITY_LIST_MASTER
);
14937 return CMD_SUCCESS
;
14939 for (list
= cm
->num
.head
; list
; list
= list
->next
)
14940 lcommunity_list_show(vty
, list
);
14942 for (list
= cm
->str
.head
; list
; list
= list
->next
)
14943 lcommunity_list_show(vty
, list
);
14945 return CMD_SUCCESS
;
14948 ALIAS (show_lcommunity_list
,
14949 show_ip_lcommunity_list_cmd
,
14950 "show ip large-community-list",
14953 "List large-community list\n")
14955 DEFUN (show_lcommunity_list_arg
,
14956 show_bgp_lcommunity_list_arg_cmd
,
14957 "show bgp large-community-list <(1-500)|WORD>",
14960 "List large-community list\n"
14961 "large-community-list number\n"
14962 "large-community-list name\n")
14964 struct community_list
*list
;
14967 if (argv_find(argv
, argc
, "ip", &idx
)) {
14968 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
14969 vty_out(vty
, "if you are using this please migrate to the below command.\n");
14970 vty_out(vty
, "'show bgp large-community-list <(1-500)|WORD>'\n");
14971 zlog_warn("Deprecated option: 'ip show large-community-list <(1-500)|WORD>' being used");
14974 list
= community_list_lookup(bgp_clist
, argv
[3]->arg
, 0,
14975 LARGE_COMMUNITY_LIST_MASTER
);
14977 vty_out(vty
, "%% Can't find extcommunity-list\n");
14978 return CMD_WARNING
;
14981 lcommunity_list_show(vty
, list
);
14983 return CMD_SUCCESS
;
14986 ALIAS (show_lcommunity_list_arg
,
14987 show_ip_lcommunity_list_arg_cmd
,
14988 "show ip large-community-list <(1-500)|WORD>",
14991 "List large-community list\n"
14992 "large-community-list number\n"
14993 "large-community-list name\n")
14995 /* "extcommunity-list" keyword help string. */
14996 #define EXTCOMMUNITY_LIST_STR "Add a extended community list entry\n"
14997 #define EXTCOMMUNITY_VAL_STR "Extended community attribute in 'rt aa:nn_or_IPaddr:nn' OR 'soo aa:nn_or_IPaddr:nn' format\n"
14999 DEFUN (extcommunity_list_standard
,
15000 bgp_extcommunity_list_standard_cmd
,
15001 "bgp extcommunity-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
15003 EXTCOMMUNITY_LIST_STR
15004 "Extended Community list number (standard)\n"
15005 "Specify standard extcommunity-list\n"
15006 "Community list name\n"
15007 "Specify community to reject\n"
15008 "Specify community to accept\n"
15009 EXTCOMMUNITY_VAL_STR
)
15011 int style
= EXTCOMMUNITY_LIST_STANDARD
;
15013 char *cl_number_or_name
= NULL
;
15016 if (argv_find(argv
, argc
, "ip", &idx
)) {
15017 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
15018 vty_out(vty
, "if you are using this please migrate to the below command.\n");
15019 vty_out(vty
, "'bgp extcommunity-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:NN>'\n");
15020 zlog_warn("Deprecated option: 'ip extcommunity-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:NN>' being used");
15022 argv_find(argv
, argc
, "(1-99)", &idx
);
15023 argv_find(argv
, argc
, "WORD", &idx
);
15024 cl_number_or_name
= argv
[idx
]->arg
;
15025 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
15027 argv_find(argv
, argc
, "AA:NN", &idx
);
15028 char *str
= argv_concat(argv
, argc
, idx
);
15030 int ret
= extcommunity_list_set(bgp_clist
, cl_number_or_name
, str
,
15033 XFREE(MTYPE_TMP
, str
);
15036 community_list_perror(vty
, ret
);
15037 return CMD_WARNING_CONFIG_FAILED
;
15040 return CMD_SUCCESS
;
15043 #if CONFDATE > 20191005
15044 CPP_NOTICE("bgpd: remove deprecated 'ip extcommunity-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:NN>' command")
15046 ALIAS (extcommunity_list_standard
,
15047 ip_extcommunity_list_standard_cmd
,
15048 "ip extcommunity-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
15050 EXTCOMMUNITY_LIST_STR
15051 "Extended Community list number (standard)\n"
15052 "Specify standard extcommunity-list\n"
15053 "Community list name\n"
15054 "Specify community to reject\n"
15055 "Specify community to accept\n"
15056 EXTCOMMUNITY_VAL_STR
)
15058 DEFUN (extcommunity_list_name_expanded
,
15059 bgp_extcommunity_list_name_expanded_cmd
,
15060 "bgp extcommunity-list <(100-500)|expanded WORD> <deny|permit> LINE...",
15062 EXTCOMMUNITY_LIST_STR
15063 "Extended Community list number (expanded)\n"
15064 "Specify expanded extcommunity-list\n"
15065 "Extended Community list name\n"
15066 "Specify community to reject\n"
15067 "Specify community to accept\n"
15068 "An ordered list as a regular-expression\n")
15070 int style
= EXTCOMMUNITY_LIST_EXPANDED
;
15072 char *cl_number_or_name
= NULL
;
15075 if (argv_find(argv
, argc
, "ip", &idx
)) {
15076 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
15077 vty_out(vty
, "if you are using this please migrate to the below command.\n");
15078 vty_out(vty
, "'extcommunity-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:NN>'\n");
15079 zlog_warn("Deprecated option: ‘ip extcommunity-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:NN>' being used");
15082 argv_find(argv
, argc
, "(100-500)", &idx
);
15083 argv_find(argv
, argc
, "WORD", &idx
);
15084 cl_number_or_name
= argv
[idx
]->arg
;
15085 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
15087 argv_find(argv
, argc
, "LINE", &idx
);
15088 char *str
= argv_concat(argv
, argc
, idx
);
15090 int ret
= extcommunity_list_set(bgp_clist
, cl_number_or_name
, str
,
15093 XFREE(MTYPE_TMP
, str
);
15096 community_list_perror(vty
, ret
);
15097 return CMD_WARNING_CONFIG_FAILED
;
15100 return CMD_SUCCESS
;
15103 ALIAS (extcommunity_list_name_expanded
,
15104 ip_extcommunity_list_name_expanded_cmd
,
15105 "ip extcommunity-list <(100-500)|expanded WORD> <deny|permit> LINE...",
15107 EXTCOMMUNITY_LIST_STR
15108 "Extended Community list number (expanded)\n"
15109 "Specify expanded extcommunity-list\n"
15110 "Extended Community list name\n"
15111 "Specify community to reject\n"
15112 "Specify community to accept\n"
15113 "An ordered list as a regular-expression\n")
15115 DEFUN (no_extcommunity_list_standard_all
,
15116 no_bgp_extcommunity_list_standard_all_cmd
,
15117 "no bgp extcommunity-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
15120 EXTCOMMUNITY_LIST_STR
15121 "Extended Community list number (standard)\n"
15122 "Specify standard extcommunity-list\n"
15123 "Community list name\n"
15124 "Specify community to reject\n"
15125 "Specify community to accept\n"
15126 EXTCOMMUNITY_VAL_STR
)
15128 int style
= EXTCOMMUNITY_LIST_STANDARD
;
15130 char *cl_number_or_name
= NULL
;
15134 if (argv_find(argv
, argc
, "ip", &idx
)) {
15135 vty_out(vty
, "This config option is deprecated, and is scheduled for removal\n");
15136 vty_out(vty
, "if you are using this please migrate to the below command.\n");
15137 vty_out(vty
, "'no bgp extcommunity-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:NN>'\n");
15138 zlog_warn("Deprecated option: ‘no ip extcommunity-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:NN>' being used");
15142 argv_find(argv
, argc
, "permit", &idx
);
15143 argv_find(argv
, argc
, "deny", &idx
);
15146 direct
= argv_find(argv
, argc
, "permit", &idx
)
15151 argv_find(argv
, argc
, "AA:NN", &idx
);
15152 str
= argv_concat(argv
, argc
, idx
);
15156 argv_find(argv
, argc
, "(1-99)", &idx
);
15157 argv_find(argv
, argc
, "WORD", &idx
);
15158 cl_number_or_name
= argv
[idx
]->arg
;
15160 int ret
= extcommunity_list_unset(bgp_clist
, cl_number_or_name
, str
,
15163 XFREE(MTYPE_TMP
, str
);
15166 community_list_perror(vty
, ret
);
15167 return CMD_WARNING_CONFIG_FAILED
;
15170 return CMD_SUCCESS
;
15173 ALIAS (no_extcommunity_list_standard_all
,
15174 no_ip_extcommunity_list_standard_all_cmd
,
15175 "no ip extcommunity-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
15178 EXTCOMMUNITY_LIST_STR
15179 "Extended Community list number (standard)\n"
15180 "Specify standard extcommunity-list\n"
15181 "Community list name\n"
15182 "Specify community to reject\n"
15183 "Specify community to accept\n"
15184 EXTCOMMUNITY_VAL_STR
)
15186 ALIAS(no_extcommunity_list_standard_all
,
15187 no_bgp_extcommunity_list_standard_all_list_cmd
,
15188 "no bgp extcommunity-list <(1-99)|standard WORD>",
15189 NO_STR IP_STR EXTCOMMUNITY_LIST_STR
15190 "Extended Community list number (standard)\n"
15191 "Specify standard extcommunity-list\n"
15192 "Community list name\n")
15194 ALIAS(no_extcommunity_list_standard_all
,
15195 no_ip_extcommunity_list_standard_all_list_cmd
,
15196 "no ip extcommunity-list <(1-99)|standard WORD>",
15197 NO_STR IP_STR EXTCOMMUNITY_LIST_STR
15198 "Extended Community list number (standard)\n"
15199 "Specify standard extcommunity-list\n"
15200 "Community list name\n")
15202 DEFUN (no_extcommunity_list_expanded_all
,
15203 no_bgp_extcommunity_list_expanded_all_cmd
,
15204 "no bgp extcommunity-list <(100-500)|expanded WORD> <deny|permit> LINE...",
15207 EXTCOMMUNITY_LIST_STR
15208 "Extended Community list number (expanded)\n"
15209 "Specify expanded extcommunity-list\n"
15210 "Extended Community list name\n"
15211 "Specify community to reject\n"
15212 "Specify community to accept\n"
15213 "An ordered list as a regular-expression\n")
15215 int style
= EXTCOMMUNITY_LIST_EXPANDED
;
15217 char *cl_number_or_name
= NULL
;
15221 if (argv_find(argv
, argc
, "ip", &idx
)) {
15222 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
15223 vty_out(vty
, "if you are using this please migrate to the below command.\n");
15224 vty_out(vty
, "'no bgp extcommunity-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:NN>'\n");
15225 zlog_warn("Deprecated option: ‘no ip extcommunity-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:NN>' being used");
15229 argv_find(argv
, argc
, "permit", &idx
);
15230 argv_find(argv
, argc
, "deny", &idx
);
15233 direct
= argv_find(argv
, argc
, "permit", &idx
)
15238 argv_find(argv
, argc
, "LINE", &idx
);
15239 str
= argv_concat(argv
, argc
, idx
);
15243 argv_find(argv
, argc
, "(100-500)", &idx
);
15244 argv_find(argv
, argc
, "WORD", &idx
);
15245 cl_number_or_name
= argv
[idx
]->arg
;
15247 int ret
= extcommunity_list_unset(bgp_clist
, cl_number_or_name
, str
,
15250 XFREE(MTYPE_TMP
, str
);
15253 community_list_perror(vty
, ret
);
15254 return CMD_WARNING_CONFIG_FAILED
;
15257 return CMD_SUCCESS
;
15260 ALIAS (no_extcommunity_list_expanded_all
,
15261 no_ip_extcommunity_list_expanded_all_cmd
,
15262 "no ip extcommunity-list <(100-500)|expanded WORD> <deny|permit> LINE...",
15265 EXTCOMMUNITY_LIST_STR
15266 "Extended Community list number (expanded)\n"
15267 "Specify expanded extcommunity-list\n"
15268 "Extended Community list name\n"
15269 "Specify community to reject\n"
15270 "Specify community to accept\n"
15271 "An ordered list as a regular-expression\n")
15273 ALIAS(no_extcommunity_list_expanded_all
,
15274 no_ip_extcommunity_list_expanded_all_list_cmd
,
15275 "no ip extcommunity-list <(100-500)|expanded WORD>",
15276 NO_STR IP_STR EXTCOMMUNITY_LIST_STR
15277 "Extended Community list number (expanded)\n"
15278 "Specify expanded extcommunity-list\n"
15279 "Extended Community list name\n")
15281 ALIAS(no_extcommunity_list_expanded_all
,
15282 no_bgp_extcommunity_list_expanded_all_list_cmd
,
15283 "no bgp extcommunity-list <(100-500)|expanded WORD>",
15284 NO_STR IP_STR EXTCOMMUNITY_LIST_STR
15285 "Extended Community list number (expanded)\n"
15286 "Specify expanded extcommunity-list\n"
15287 "Extended Community list name\n")
15289 static void extcommunity_list_show(struct vty
*vty
, struct community_list
*list
)
15291 struct community_entry
*entry
;
15293 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
15294 if (entry
== list
->head
) {
15295 if (all_digit(list
->name
))
15296 vty_out(vty
, "Extended community %s list %s\n",
15297 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
15299 : "(expanded) access",
15303 "Named extended community %s list %s\n",
15304 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
15310 vty_out(vty
, " %s\n",
15311 community_direct_str(entry
->direct
));
15313 vty_out(vty
, " %s %s\n",
15314 community_direct_str(entry
->direct
),
15315 community_list_config_str(entry
));
15319 DEFUN (show_extcommunity_list
,
15320 show_bgp_extcommunity_list_cmd
,
15321 "show bgp extcommunity-list",
15324 "List extended-community list\n")
15326 struct community_list
*list
;
15327 struct community_list_master
*cm
;
15330 if (argv_find(argv
, argc
, "ip", &idx
)) {
15331 vty_out(vty
, "This config option is deprecated, and is scheduled for removal\n");
15332 vty_out(vty
, "if you are using this please migrate to the below command.\n");
15333 vty_out(vty
, "'show bgp extcommunity-list <(1-500)|WORD>'\n");
15334 zlog_warn("Deprecated option: 'ip show extcommunity-list <(1-500)|WORD>' being used");
15336 cm
= community_list_master_lookup(bgp_clist
, EXTCOMMUNITY_LIST_MASTER
);
15338 return CMD_SUCCESS
;
15340 for (list
= cm
->num
.head
; list
; list
= list
->next
)
15341 extcommunity_list_show(vty
, list
);
15343 for (list
= cm
->str
.head
; list
; list
= list
->next
)
15344 extcommunity_list_show(vty
, list
);
15346 return CMD_SUCCESS
;
15349 ALIAS (show_extcommunity_list
,
15350 show_ip_extcommunity_list_cmd
,
15351 "show ip extcommunity-list",
15354 "List extended-community list\n")
15356 DEFUN (show_extcommunity_list_arg
,
15357 show_bgp_extcommunity_list_arg_cmd
,
15358 "show bgp extcommunity-list <(1-500)|WORD>",
15361 "List extended-community list\n"
15362 "Extcommunity-list number\n"
15363 "Extcommunity-list name\n")
15365 int idx_comm_list
= 3;
15366 struct community_list
*list
;
15369 if (argv_find(argv
, argc
, "ip", &idx
)) {
15370 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
15371 vty_out(vty
, "if you are using this please migrate to the below command.\n");
15372 vty_out(vty
, "'show bgp extcommunity-list <(1-500)|WORD>'\n");
15373 zlog_warn("Deprecated option: 'ip show extcommunity-list <(1-500)|WORD>' being used");
15375 list
= community_list_lookup(bgp_clist
, argv
[idx_comm_list
]->arg
, 0,
15376 EXTCOMMUNITY_LIST_MASTER
);
15378 vty_out(vty
, "%% Can't find extcommunity-list\n");
15379 return CMD_WARNING
;
15382 extcommunity_list_show(vty
, list
);
15384 return CMD_SUCCESS
;
15387 ALIAS (show_extcommunity_list_arg
,
15388 show_ip_extcommunity_list_arg_cmd
,
15389 "show ip extcommunity-list <(1-500)|WORD>",
15392 "List extended-community list\n"
15393 "Extcommunity-list number\n"
15394 "Extcommunity-list name\n")
15396 /* Display community-list and extcommunity-list configuration. */
15397 static int community_list_config_write(struct vty
*vty
)
15399 struct community_list
*list
;
15400 struct community_entry
*entry
;
15401 struct community_list_master
*cm
;
15404 /* Community-list. */
15405 cm
= community_list_master_lookup(bgp_clist
, COMMUNITY_LIST_MASTER
);
15407 for (list
= cm
->num
.head
; list
; list
= list
->next
)
15408 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
15409 vty_out(vty
, "bgp community-list %s %s %s\n", list
->name
,
15410 community_direct_str(entry
->direct
),
15411 community_list_config_str(entry
));
15414 for (list
= cm
->str
.head
; list
; list
= list
->next
)
15415 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
15416 vty_out(vty
, "bgp community-list %s %s %s %s\n",
15417 entry
->style
== COMMUNITY_LIST_STANDARD
15420 list
->name
, community_direct_str(entry
->direct
),
15421 community_list_config_str(entry
));
15425 /* Extcommunity-list. */
15426 cm
= community_list_master_lookup(bgp_clist
, EXTCOMMUNITY_LIST_MASTER
);
15428 for (list
= cm
->num
.head
; list
; list
= list
->next
)
15429 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
15430 vty_out(vty
, "bgp extcommunity-list %s %s %s\n",
15431 list
->name
, community_direct_str(entry
->direct
),
15432 community_list_config_str(entry
));
15435 for (list
= cm
->str
.head
; list
; list
= list
->next
)
15436 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
15437 vty_out(vty
, "bgp extcommunity-list %s %s %s %s\n",
15438 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
15441 list
->name
, community_direct_str(entry
->direct
),
15442 community_list_config_str(entry
));
15447 /* lcommunity-list. */
15448 cm
= community_list_master_lookup(bgp_clist
,
15449 LARGE_COMMUNITY_LIST_MASTER
);
15451 for (list
= cm
->num
.head
; list
; list
= list
->next
)
15452 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
15453 vty_out(vty
, "bgp large-community-list %s %s %s\n",
15454 list
->name
, community_direct_str(entry
->direct
),
15455 community_list_config_str(entry
));
15458 for (list
= cm
->str
.head
; list
; list
= list
->next
)
15459 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
15460 vty_out(vty
, "bgp large-community-list %s %s %s %s\n",
15461 entry
->style
== LARGE_COMMUNITY_LIST_STANDARD
15464 list
->name
, community_direct_str(entry
->direct
),
15465 community_list_config_str(entry
));
15472 static struct cmd_node community_list_node
= {
15473 COMMUNITY_LIST_NODE
, "", 1 /* Export to vtysh. */
15476 static void community_list_vty(void)
15478 install_node(&community_list_node
, community_list_config_write
);
15480 /* Community-list. */
15481 install_element(CONFIG_NODE
, &bgp_community_list_standard_cmd
);
15482 install_element(CONFIG_NODE
, &bgp_community_list_expanded_all_cmd
);
15483 install_element(CONFIG_NODE
, &no_bgp_community_list_standard_all_cmd
);
15484 install_element(CONFIG_NODE
, &no_bgp_community_list_standard_all_list_cmd
);
15485 install_element(CONFIG_NODE
, &no_bgp_community_list_expanded_all_cmd
);
15486 install_element(CONFIG_NODE
, &no_bgp_community_list_expanded_all_list_cmd
);
15487 install_element(VIEW_NODE
, &show_bgp_community_list_cmd
);
15488 install_element(VIEW_NODE
, &show_bgp_community_list_arg_cmd
);
15489 install_element(CONFIG_NODE
, &ip_community_list_standard_cmd
);
15490 install_element(CONFIG_NODE
, &ip_community_list_expanded_all_cmd
);
15491 install_element(CONFIG_NODE
, &no_ip_community_list_standard_all_cmd
);
15492 install_element(CONFIG_NODE
, &no_ip_community_list_standard_all_list_cmd
);
15493 install_element(CONFIG_NODE
, &no_ip_community_list_expanded_all_cmd
);
15494 install_element(CONFIG_NODE
, &no_ip_community_list_expanded_all_list_cmd
);
15495 install_element(VIEW_NODE
, &show_ip_community_list_cmd
);
15496 install_element(VIEW_NODE
, &show_ip_community_list_arg_cmd
);
15498 /* Extcommunity-list. */
15499 install_element(CONFIG_NODE
, &bgp_extcommunity_list_standard_cmd
);
15500 install_element(CONFIG_NODE
, &bgp_extcommunity_list_name_expanded_cmd
);
15501 install_element(CONFIG_NODE
, &no_bgp_extcommunity_list_standard_all_cmd
);
15502 install_element(CONFIG_NODE
,
15503 &no_bgp_extcommunity_list_standard_all_list_cmd
);
15504 install_element(CONFIG_NODE
, &no_bgp_extcommunity_list_expanded_all_cmd
);
15505 install_element(CONFIG_NODE
,
15506 &no_bgp_extcommunity_list_expanded_all_list_cmd
);
15507 install_element(VIEW_NODE
, &show_bgp_extcommunity_list_cmd
);
15508 install_element(VIEW_NODE
, &show_bgp_extcommunity_list_arg_cmd
);
15509 install_element(CONFIG_NODE
, &ip_extcommunity_list_standard_cmd
);
15510 install_element(CONFIG_NODE
, &ip_extcommunity_list_name_expanded_cmd
);
15511 install_element(CONFIG_NODE
, &no_ip_extcommunity_list_standard_all_cmd
);
15512 install_element(CONFIG_NODE
, &no_ip_extcommunity_list_standard_all_list_cmd
);
15513 install_element(CONFIG_NODE
, &no_ip_extcommunity_list_expanded_all_cmd
);
15514 install_element(CONFIG_NODE
, &no_ip_extcommunity_list_expanded_all_list_cmd
);
15515 install_element(VIEW_NODE
, &show_ip_extcommunity_list_cmd
);
15516 install_element(VIEW_NODE
, &show_ip_extcommunity_list_arg_cmd
);
15518 /* Large Community List */
15519 install_element(CONFIG_NODE
, &bgp_lcommunity_list_standard_cmd
);
15520 install_element(CONFIG_NODE
, &bgp_lcommunity_list_standard1_cmd
);
15521 install_element(CONFIG_NODE
, &bgp_lcommunity_list_expanded_cmd
);
15522 install_element(CONFIG_NODE
, &bgp_lcommunity_list_name_standard_cmd
);
15523 install_element(CONFIG_NODE
, &bgp_lcommunity_list_name_standard1_cmd
);
15524 install_element(CONFIG_NODE
, &bgp_lcommunity_list_name_expanded_cmd
);
15525 install_element(CONFIG_NODE
, &no_bgp_lcommunity_list_standard_all_cmd
);
15526 install_element(CONFIG_NODE
,
15527 &no_bgp_lcommunity_list_name_expanded_all_cmd
);
15528 install_element(CONFIG_NODE
, &no_bgp_lcommunity_list_standard_cmd
);
15529 install_element(CONFIG_NODE
, &no_bgp_lcommunity_list_expanded_cmd
);
15530 install_element(CONFIG_NODE
, &no_bgp_lcommunity_list_name_standard_cmd
);
15531 install_element(CONFIG_NODE
, &no_bgp_lcommunity_list_name_expanded_cmd
);
15532 install_element(VIEW_NODE
, &show_bgp_lcommunity_list_cmd
);
15533 install_element(VIEW_NODE
, &show_bgp_lcommunity_list_arg_cmd
);
15534 install_element(CONFIG_NODE
, &ip_lcommunity_list_standard_cmd
);
15535 install_element(CONFIG_NODE
, &ip_lcommunity_list_standard1_cmd
);
15536 install_element(CONFIG_NODE
, &ip_lcommunity_list_expanded_cmd
);
15537 install_element(CONFIG_NODE
, &ip_lcommunity_list_name_standard_cmd
);
15538 install_element(CONFIG_NODE
, &ip_lcommunity_list_name_standard1_cmd
);
15539 install_element(CONFIG_NODE
, &ip_lcommunity_list_name_expanded_cmd
);
15540 install_element(CONFIG_NODE
, &no_ip_lcommunity_list_standard_all_cmd
);
15541 install_element(CONFIG_NODE
,
15542 &no_ip_lcommunity_list_name_expanded_all_cmd
);
15543 install_element(CONFIG_NODE
, &no_ip_lcommunity_list_standard_cmd
);
15544 install_element(CONFIG_NODE
, &no_ip_lcommunity_list_expanded_cmd
);
15545 install_element(CONFIG_NODE
, &no_ip_lcommunity_list_name_standard_cmd
);
15546 install_element(CONFIG_NODE
, &no_ip_lcommunity_list_name_expanded_cmd
);
15547 install_element(VIEW_NODE
, &show_ip_lcommunity_list_cmd
);
15548 install_element(VIEW_NODE
, &show_ip_lcommunity_list_arg_cmd
);