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 %-10s %-15s\n",
7469 "Type", "Id", "routerId", "#PeersVfg",
7470 "#PeersEstb", "Name", "L3-VNI", "Rmac");
7472 peers_cfg
= peers_estb
= 0;
7474 json_vrf
= json_object_new_object();
7477 for (ALL_LIST_ELEMENTS(bgp
->peer
, node2
, nnode2
, peer
)) {
7478 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
7481 if (peer
->status
== Established
)
7485 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
) {
7486 name
= VRF_DEFAULT_NAME
;
7495 int64_t vrf_id_ui
= (bgp
->vrf_id
== VRF_UNKNOWN
)
7497 : (int64_t)bgp
->vrf_id
;
7498 json_object_string_add(json_vrf
, "type", type
);
7499 json_object_int_add(json_vrf
, "vrfId", vrf_id_ui
);
7500 json_object_string_add(json_vrf
, "routerId",
7501 inet_ntoa(bgp
->router_id
));
7502 json_object_int_add(json_vrf
, "numConfiguredPeers",
7504 json_object_int_add(json_vrf
, "numEstablishedPeers",
7507 json_object_int_add(json_vrf
, "l3vni", bgp
->l3vni
);
7508 json_object_string_add(
7510 prefix_mac2str(&bgp
->rmac
, buf
, sizeof(buf
)));
7511 json_object_object_add(json_vrfs
, name
, json_vrf
);
7514 "%4s %-5d %-16s %9u %10u %-37s %-10u %-15s\n",
7516 bgp
->vrf_id
== VRF_UNKNOWN
? -1
7518 inet_ntoa(bgp
->router_id
), peers_cfg
,
7519 peers_estb
, name
, bgp
->l3vni
,
7520 prefix_mac2str(&bgp
->rmac
, buf
, sizeof(buf
)));
7524 json_object_object_add(json
, "vrfs", json_vrfs
);
7526 json_object_int_add(json
, "totalVrfs", count
);
7528 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
7529 json
, JSON_C_TO_STRING_PRETTY
));
7530 json_object_free(json
);
7534 "\nTotal number of VRFs (including default): %d\n",
7541 DEFUN (show_bgp_mac_hash
,
7542 show_bgp_mac_hash_cmd
,
7543 "show bgp mac hash",
7547 "Mac Address database\n")
7549 bgp_mac_dump_table(vty
);
7554 static void show_tip_entry(struct hash_bucket
*bucket
, void *args
)
7556 struct vty
*vty
= (struct vty
*)args
;
7557 struct tip_addr
*tip
= (struct tip_addr
*)bucket
->data
;
7559 vty_out(vty
, "addr: %s, count: %d\n", inet_ntoa(tip
->addr
),
7563 static void bgp_show_martian_nexthops(struct vty
*vty
, struct bgp
*bgp
)
7565 vty_out(vty
, "self nexthop database:\n");
7566 bgp_nexthop_show_address_hash(vty
, bgp
);
7568 vty_out(vty
, "Tunnel-ip database:\n");
7569 hash_iterate(bgp
->tip_hash
,
7570 (void (*)(struct hash_bucket
*, void *))show_tip_entry
,
7574 DEFUN(show_bgp_martian_nexthop_db
, show_bgp_martian_nexthop_db_cmd
,
7575 "show bgp [<view|vrf> VIEWVRFNAME] martian next-hop",
7576 SHOW_STR BGP_STR BGP_INSTANCE_HELP_STR
7577 "martian next-hops\n"
7578 "martian next-hop database\n")
7580 struct bgp
*bgp
= NULL
;
7584 /* [<vrf> VIEWVRFNAME] */
7585 if (argv_find(argv
, argc
, "vrf", &idx
)) {
7586 name
= argv
[idx
+ 1]->arg
;
7587 if (name
&& strmatch(name
, VRF_DEFAULT_NAME
))
7589 } else if (argv_find(argv
, argc
, "view", &idx
))
7590 /* [<view> VIEWVRFNAME] */
7591 name
= argv
[idx
+ 1]->arg
;
7593 bgp
= bgp_lookup_by_name(name
);
7595 bgp
= bgp_get_default();
7598 vty_out(vty
, "%% No BGP process is configured\n");
7601 bgp_show_martian_nexthops(vty
, bgp
);
7606 DEFUN (show_bgp_memory
,
7607 show_bgp_memory_cmd
,
7608 "show [ip] bgp memory",
7612 "Global BGP memory statistics\n")
7614 char memstrbuf
[MTYPE_MEMSTR_LEN
];
7615 unsigned long count
;
7617 /* RIB related usage stats */
7618 count
= mtype_stats_alloc(MTYPE_BGP_NODE
);
7619 vty_out(vty
, "%ld RIB nodes, using %s of memory\n", count
,
7620 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7621 count
* sizeof(struct bgp_node
)));
7623 count
= mtype_stats_alloc(MTYPE_BGP_ROUTE
);
7624 vty_out(vty
, "%ld BGP routes, using %s of memory\n", count
,
7625 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7626 count
* sizeof(struct bgp_path_info
)));
7627 if ((count
= mtype_stats_alloc(MTYPE_BGP_ROUTE_EXTRA
)))
7628 vty_out(vty
, "%ld BGP route ancillaries, using %s of memory\n",
7631 memstrbuf
, sizeof(memstrbuf
),
7632 count
* sizeof(struct bgp_path_info_extra
)));
7634 if ((count
= mtype_stats_alloc(MTYPE_BGP_STATIC
)))
7635 vty_out(vty
, "%ld Static routes, using %s of memory\n", count
,
7636 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7637 count
* sizeof(struct bgp_static
)));
7639 if ((count
= mtype_stats_alloc(MTYPE_BGP_PACKET
)))
7640 vty_out(vty
, "%ld Packets, using %s of memory\n", count
,
7641 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7642 count
* sizeof(struct bpacket
)));
7645 if ((count
= mtype_stats_alloc(MTYPE_BGP_ADJ_IN
)))
7646 vty_out(vty
, "%ld Adj-In entries, using %s of memory\n", count
,
7647 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7648 count
* sizeof(struct bgp_adj_in
)));
7649 if ((count
= mtype_stats_alloc(MTYPE_BGP_ADJ_OUT
)))
7650 vty_out(vty
, "%ld Adj-Out entries, using %s of memory\n", count
,
7651 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7652 count
* sizeof(struct bgp_adj_out
)));
7654 if ((count
= mtype_stats_alloc(MTYPE_BGP_NEXTHOP_CACHE
)))
7655 vty_out(vty
, "%ld Nexthop cache entries, using %s of memory\n",
7657 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7658 count
* sizeof(struct bgp_nexthop_cache
)));
7660 if ((count
= mtype_stats_alloc(MTYPE_BGP_DAMP_INFO
)))
7661 vty_out(vty
, "%ld Dampening entries, using %s of memory\n",
7663 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7664 count
* sizeof(struct bgp_damp_info
)));
7667 count
= attr_count();
7668 vty_out(vty
, "%ld BGP attributes, using %s of memory\n", count
,
7669 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7670 count
* sizeof(struct attr
)));
7672 if ((count
= attr_unknown_count()))
7673 vty_out(vty
, "%ld unknown attributes\n", count
);
7675 /* AS_PATH attributes */
7676 count
= aspath_count();
7677 vty_out(vty
, "%ld BGP AS-PATH entries, using %s of memory\n", count
,
7678 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7679 count
* sizeof(struct aspath
)));
7681 count
= mtype_stats_alloc(MTYPE_AS_SEG
);
7682 vty_out(vty
, "%ld BGP AS-PATH segments, using %s of memory\n", count
,
7683 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7684 count
* sizeof(struct assegment
)));
7686 /* Other attributes */
7687 if ((count
= community_count()))
7688 vty_out(vty
, "%ld BGP community entries, using %s of memory\n",
7689 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7690 count
* sizeof(struct community
)));
7691 if ((count
= mtype_stats_alloc(MTYPE_ECOMMUNITY
)))
7692 vty_out(vty
, "%ld BGP community entries, using %s of memory\n",
7693 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7694 count
* sizeof(struct ecommunity
)));
7695 if ((count
= mtype_stats_alloc(MTYPE_LCOMMUNITY
)))
7697 "%ld BGP large-community entries, using %s of memory\n",
7698 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7699 count
* sizeof(struct lcommunity
)));
7701 if ((count
= mtype_stats_alloc(MTYPE_CLUSTER
)))
7702 vty_out(vty
, "%ld Cluster lists, using %s of memory\n", count
,
7703 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7704 count
* sizeof(struct cluster_list
)));
7706 /* Peer related usage */
7707 count
= mtype_stats_alloc(MTYPE_BGP_PEER
);
7708 vty_out(vty
, "%ld peers, using %s of memory\n", count
,
7709 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7710 count
* sizeof(struct peer
)));
7712 if ((count
= mtype_stats_alloc(MTYPE_PEER_GROUP
)))
7713 vty_out(vty
, "%ld peer groups, using %s of memory\n", count
,
7714 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7715 count
* sizeof(struct peer_group
)));
7718 if ((count
= mtype_stats_alloc(MTYPE_HASH
)))
7719 vty_out(vty
, "%ld hash tables, using %s of memory\n", count
,
7720 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7721 count
* sizeof(struct hash
)));
7722 if ((count
= mtype_stats_alloc(MTYPE_HASH_BACKET
)))
7723 vty_out(vty
, "%ld hash buckets, using %s of memory\n", count
,
7724 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7725 count
* sizeof(struct hash_bucket
)));
7726 if ((count
= mtype_stats_alloc(MTYPE_BGP_REGEXP
)))
7727 vty_out(vty
, "%ld compiled regexes, using %s of memory\n",
7728 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7729 count
* sizeof(regex_t
)));
7733 static void bgp_show_bestpath_json(struct bgp
*bgp
, json_object
*json
)
7735 json_object
*bestpath
= json_object_new_object();
7737 if (bgp_flag_check(bgp
, BGP_FLAG_ASPATH_IGNORE
))
7738 json_object_string_add(bestpath
, "asPath", "ignore");
7740 if (bgp_flag_check(bgp
, BGP_FLAG_ASPATH_CONFED
))
7741 json_object_string_add(bestpath
, "asPath", "confed");
7743 if (bgp_flag_check(bgp
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
)) {
7744 if (bgp_flag_check(bgp
, BGP_FLAG_MULTIPATH_RELAX_AS_SET
))
7745 json_object_string_add(bestpath
, "multiPathRelax",
7748 json_object_string_add(bestpath
, "multiPathRelax",
7751 json_object_string_add(bestpath
, "multiPathRelax", "false");
7753 if (bgp_flag_check(bgp
, BGP_FLAG_COMPARE_ROUTER_ID
))
7754 json_object_string_add(bestpath
, "compareRouterId", "true");
7755 if (bgp_flag_check(bgp
, BGP_FLAG_MED_CONFED
)
7756 || bgp_flag_check(bgp
, BGP_FLAG_MED_MISSING_AS_WORST
)) {
7757 if (bgp_flag_check(bgp
, BGP_FLAG_MED_CONFED
))
7758 json_object_string_add(bestpath
, "med", "confed");
7759 if (bgp_flag_check(bgp
, BGP_FLAG_MED_MISSING_AS_WORST
))
7760 json_object_string_add(bestpath
, "med",
7761 "missing-as-worst");
7763 json_object_string_add(bestpath
, "med", "true");
7766 json_object_object_add(json
, "bestPath", bestpath
);
7769 /* Show BGP peer's summary information. */
7770 static int bgp_show_summary(struct vty
*vty
, struct bgp
*bgp
, int afi
, int safi
,
7771 bool use_json
, json_object
*json
)
7774 struct listnode
*node
, *nnode
;
7775 unsigned int count
= 0, dn_count
= 0;
7776 char timebuf
[BGP_UPTIME_LEN
], dn_flag
[2];
7777 char neighbor_buf
[VTY_BUFSIZ
];
7778 int neighbor_col_default_width
= 16;
7780 int max_neighbor_width
= 0;
7782 json_object
*json_peer
= NULL
;
7783 json_object
*json_peers
= NULL
;
7784 struct peer_af
*paf
;
7786 /* labeled-unicast routes are installed in the unicast table so in order
7788 * display the correct PfxRcd value we must look at SAFI_UNICAST
7790 if (safi
== SAFI_LABELED_UNICAST
)
7791 pfx_rcd_safi
= SAFI_UNICAST
;
7793 pfx_rcd_safi
= safi
;
7797 json
= json_object_new_object();
7799 json_peers
= json_object_new_object();
7801 /* Loop over all neighbors that will be displayed to determine
7803 * characters are needed for the Neighbor column
7805 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
7806 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
7809 if (peer
->afc
[afi
][safi
]) {
7810 memset(dn_flag
, '\0', sizeof(dn_flag
));
7811 if (peer_dynamic_neighbor(peer
))
7815 && bgp_flag_check(bgp
,
7816 BGP_FLAG_SHOW_HOSTNAME
))
7817 sprintf(neighbor_buf
, "%s%s(%s) ",
7818 dn_flag
, peer
->hostname
,
7821 sprintf(neighbor_buf
, "%s%s ", dn_flag
,
7824 len
= strlen(neighbor_buf
);
7826 if (len
> max_neighbor_width
)
7827 max_neighbor_width
= len
;
7831 /* Originally we displayed the Neighbor column as 16
7832 * characters wide so make that the default
7834 if (max_neighbor_width
< neighbor_col_default_width
)
7835 max_neighbor_width
= neighbor_col_default_width
;
7838 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
7839 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
7842 if (!peer
->afc
[afi
][safi
])
7847 char memstrbuf
[MTYPE_MEMSTR_LEN
];
7850 vrf_id_ui
= (bgp
->vrf_id
== VRF_UNKNOWN
)
7852 : (int64_t)bgp
->vrf_id
;
7854 /* Usage summary and header */
7856 json_object_string_add(
7858 inet_ntoa(bgp
->router_id
));
7859 json_object_int_add(json
, "as", bgp
->as
);
7860 json_object_int_add(json
, "vrfId", vrf_id_ui
);
7861 json_object_string_add(
7864 == BGP_INSTANCE_TYPE_DEFAULT
)
7869 "BGP router identifier %s, local AS number %u vrf-id %d",
7870 inet_ntoa(bgp
->router_id
), bgp
->as
,
7871 bgp
->vrf_id
== VRF_UNKNOWN
7873 : (int)bgp
->vrf_id
);
7877 if (bgp_update_delay_configured(bgp
)) {
7879 json_object_int_add(
7880 json
, "updateDelayLimit",
7881 bgp
->v_update_delay
);
7883 if (bgp
->v_update_delay
7884 != bgp
->v_establish_wait
)
7885 json_object_int_add(
7887 "updateDelayEstablishWait",
7888 bgp
->v_establish_wait
);
7890 if (bgp_update_delay_active(bgp
)) {
7891 json_object_string_add(
7893 "updateDelayFirstNeighbor",
7894 bgp
->update_delay_begin_time
);
7895 json_object_boolean_true_add(
7897 "updateDelayInProgress");
7899 if (bgp
->update_delay_over
) {
7900 json_object_string_add(
7902 "updateDelayFirstNeighbor",
7903 bgp
->update_delay_begin_time
);
7904 json_object_string_add(
7906 "updateDelayBestpathResumed",
7907 bgp
->update_delay_end_time
);
7908 json_object_string_add(
7910 "updateDelayZebraUpdateResume",
7911 bgp
->update_delay_zebra_resume_time
);
7912 json_object_string_add(
7914 "updateDelayPeerUpdateResume",
7915 bgp
->update_delay_peers_resume_time
);
7920 "Read-only mode update-delay limit: %d seconds\n",
7921 bgp
->v_update_delay
);
7922 if (bgp
->v_update_delay
7923 != bgp
->v_establish_wait
)
7925 " Establish wait: %d seconds\n",
7926 bgp
->v_establish_wait
);
7928 if (bgp_update_delay_active(bgp
)) {
7930 " First neighbor established: %s\n",
7931 bgp
->update_delay_begin_time
);
7933 " Delay in progress\n");
7935 if (bgp
->update_delay_over
) {
7937 " First neighbor established: %s\n",
7938 bgp
->update_delay_begin_time
);
7940 " Best-paths resumed: %s\n",
7941 bgp
->update_delay_end_time
);
7943 " zebra update resumed: %s\n",
7944 bgp
->update_delay_zebra_resume_time
);
7946 " peers update resumed: %s\n",
7947 bgp
->update_delay_peers_resume_time
);
7954 if (bgp_maxmed_onstartup_configured(bgp
)
7955 && bgp
->maxmed_active
)
7956 json_object_boolean_true_add(
7957 json
, "maxMedOnStartup");
7958 if (bgp
->v_maxmed_admin
)
7959 json_object_boolean_true_add(
7960 json
, "maxMedAdministrative");
7962 json_object_int_add(
7963 json
, "tableVersion",
7964 bgp_table_version(bgp
->rib
[afi
][safi
]));
7966 ents
= bgp_table_count(bgp
->rib
[afi
][safi
]);
7967 json_object_int_add(json
, "ribCount", ents
);
7968 json_object_int_add(
7970 ents
* sizeof(struct bgp_node
));
7972 ents
= bgp
->af_peer_count
[afi
][safi
];
7973 json_object_int_add(json
, "peerCount", ents
);
7974 json_object_int_add(json
, "peerMemory",
7975 ents
* sizeof(struct peer
));
7977 if ((ents
= listcount(bgp
->group
))) {
7978 json_object_int_add(
7979 json
, "peerGroupCount", ents
);
7980 json_object_int_add(
7981 json
, "peerGroupMemory",
7982 ents
* sizeof(struct
7986 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
7987 BGP_CONFIG_DAMPENING
))
7988 json_object_boolean_true_add(
7989 json
, "dampeningEnabled");
7991 if (bgp_maxmed_onstartup_configured(bgp
)
7992 && bgp
->maxmed_active
)
7994 "Max-med on-startup active\n");
7995 if (bgp
->v_maxmed_admin
)
7997 "Max-med administrative active\n");
7999 vty_out(vty
, "BGP table version %" PRIu64
"\n",
8000 bgp_table_version(bgp
->rib
[afi
][safi
]));
8002 ents
= bgp_table_count(bgp
->rib
[afi
][safi
]);
8004 "RIB entries %ld, using %s of memory\n",
8006 mtype_memstr(memstrbuf
,
8008 ents
* sizeof(struct
8011 /* Peer related usage */
8012 ents
= bgp
->af_peer_count
[afi
][safi
];
8013 vty_out(vty
, "Peers %ld, using %s of memory\n",
8016 memstrbuf
, sizeof(memstrbuf
),
8017 ents
* sizeof(struct peer
)));
8019 if ((ents
= listcount(bgp
->group
)))
8021 "Peer groups %ld, using %s of memory\n",
8026 ents
* sizeof(struct
8029 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
8030 BGP_CONFIG_DAMPENING
))
8031 vty_out(vty
, "Dampening enabled.\n");
8034 /* Subtract 8 here because 'Neighbor' is
8036 vty_out(vty
, "Neighbor");
8037 vty_out(vty
, "%*s", max_neighbor_width
- 8,
8040 "V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd\n");
8047 json_peer
= json_object_new_object();
8049 if (peer_dynamic_neighbor(peer
)) {
8051 json_object_boolean_true_add(json_peer
,
8056 json_object_string_add(json_peer
, "hostname",
8059 if (peer
->domainname
)
8060 json_object_string_add(json_peer
, "domainname",
8063 json_object_int_add(json_peer
, "remoteAs", peer
->as
);
8064 json_object_int_add(json_peer
, "version", 4);
8065 json_object_int_add(json_peer
, "msgRcvd",
8066 PEER_TOTAL_RX(peer
));
8067 json_object_int_add(json_peer
, "msgSent",
8068 PEER_TOTAL_TX(peer
));
8070 json_object_int_add(json_peer
, "tableVersion",
8071 peer
->version
[afi
][safi
]);
8072 json_object_int_add(json_peer
, "outq",
8074 json_object_int_add(json_peer
, "inq", 0);
8075 peer_uptime(peer
->uptime
, timebuf
, BGP_UPTIME_LEN
,
8076 use_json
, json_peer
);
8079 * Adding "pfxRcd" field to match with the corresponding
8080 * CLI. "prefixReceivedCount" will be deprecated in
8083 json_object_int_add(json_peer
, "prefixReceivedCount",
8084 peer
->pcount
[afi
][pfx_rcd_safi
]);
8085 json_object_int_add(json_peer
, "pfxRcd",
8086 peer
->pcount
[afi
][pfx_rcd_safi
]);
8088 paf
= peer_af_find(peer
, afi
, pfx_rcd_safi
);
8089 if (paf
&& PAF_SUBGRP(paf
))
8090 json_object_int_add(json_peer
,
8092 (PAF_SUBGRP(paf
))->scount
);
8094 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_SHUTDOWN
))
8095 json_object_string_add(json_peer
, "state",
8097 else if (peer
->afc_recv
[afi
][safi
])
8098 json_object_string_add(
8100 lookup_msg(bgp_status_msg
, peer
->status
,
8102 else if (CHECK_FLAG(peer
->sflags
,
8103 PEER_STATUS_PREFIX_OVERFLOW
))
8104 json_object_string_add(json_peer
, "state",
8107 json_object_string_add(
8109 lookup_msg(bgp_status_msg
, peer
->status
,
8113 json_object_string_add(json_peer
, "idType",
8115 else if (peer
->su
.sa
.sa_family
== AF_INET
)
8116 json_object_string_add(json_peer
, "idType",
8118 else if (peer
->su
.sa
.sa_family
== AF_INET6
)
8119 json_object_string_add(json_peer
, "idType",
8122 json_object_object_add(json_peers
, peer
->host
,
8125 memset(dn_flag
, '\0', sizeof(dn_flag
));
8126 if (peer_dynamic_neighbor(peer
)) {
8132 && bgp_flag_check(bgp
, BGP_FLAG_SHOW_HOSTNAME
))
8133 len
= vty_out(vty
, "%s%s(%s)", dn_flag
,
8134 peer
->hostname
, peer
->host
);
8136 len
= vty_out(vty
, "%s%s", dn_flag
, peer
->host
);
8138 /* pad the neighbor column with spaces */
8139 if (len
< max_neighbor_width
)
8140 vty_out(vty
, "%*s", max_neighbor_width
- len
,
8143 vty_out(vty
, "4 %10u %7u %7u %8" PRIu64
" %4d %4zd %8s",
8144 peer
->as
, PEER_TOTAL_RX(peer
),
8145 PEER_TOTAL_TX(peer
), peer
->version
[afi
][safi
],
8146 0, peer
->obuf
->count
,
8147 peer_uptime(peer
->uptime
, timebuf
,
8148 BGP_UPTIME_LEN
, 0, NULL
));
8150 if (peer
->status
== Established
)
8151 if (peer
->afc_recv
[afi
][safi
])
8152 vty_out(vty
, " %12ld",
8156 vty_out(vty
, " NoNeg");
8158 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_SHUTDOWN
))
8159 vty_out(vty
, " Idle (Admin)");
8160 else if (CHECK_FLAG(
8162 PEER_STATUS_PREFIX_OVERFLOW
))
8163 vty_out(vty
, " Idle (PfxCt)");
8165 vty_out(vty
, " %12s",
8166 lookup_msg(bgp_status_msg
,
8167 peer
->status
, NULL
));
8174 json_object_object_add(json
, "peers", json_peers
);
8176 json_object_int_add(json
, "totalPeers", count
);
8177 json_object_int_add(json
, "dynamicPeers", dn_count
);
8179 bgp_show_bestpath_json(bgp
, json
);
8181 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
8182 json
, JSON_C_TO_STRING_PRETTY
));
8183 json_object_free(json
);
8186 vty_out(vty
, "\nTotal number of neighbors %d\n", count
);
8188 vty_out(vty
, "No %s neighbor is configured\n",
8189 afi_safi_print(afi
, safi
));
8193 vty_out(vty
, "* - dynamic neighbor\n");
8194 vty_out(vty
, "%d dynamic neighbor(s), limit %d\n",
8195 dn_count
, bgp
->dynamic_neighbors_limit
);
8202 static void bgp_show_summary_afi_safi(struct vty
*vty
, struct bgp
*bgp
, int afi
,
8203 int safi
, bool use_json
,
8207 int afi_wildcard
= (afi
== AFI_MAX
);
8208 int safi_wildcard
= (safi
== SAFI_MAX
);
8209 int is_wildcard
= (afi_wildcard
|| safi_wildcard
);
8210 bool nbr_output
= false;
8212 if (use_json
&& is_wildcard
)
8213 vty_out(vty
, "{\n");
8215 afi
= 1; /* AFI_IP */
8216 while (afi
< AFI_MAX
) {
8218 safi
= 1; /* SAFI_UNICAST */
8219 while (safi
< SAFI_MAX
) {
8220 if (bgp_afi_safi_peer_exists(bgp
, afi
, safi
)) {
8224 * So limit output to those afi/safi
8226 * actualy have something interesting in
8230 json
= json_object_new_object();
8233 vty_out(vty
, ",\n");
8237 vty_out(vty
, "\"%s\":",
8241 vty_out(vty
, "\n%s Summary:\n",
8246 bgp_show_summary(vty
, bgp
, afi
, safi
, use_json
,
8258 if (use_json
&& is_wildcard
)
8259 vty_out(vty
, "}\n");
8260 else if (!nbr_output
) {
8262 vty_out(vty
, "{}\n");
8264 vty_out(vty
, "%% No BGP neighbors found\n");
8268 static void bgp_show_all_instances_summary_vty(struct vty
*vty
, afi_t afi
,
8269 safi_t safi
, bool use_json
)
8271 struct listnode
*node
, *nnode
;
8273 json_object
*json
= NULL
;
8275 bool nbr_output
= false;
8278 vty_out(vty
, "{\n");
8280 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
8283 json
= json_object_new_object();
8286 vty_out(vty
, ",\n");
8290 vty_out(vty
, "\"%s\":",
8291 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
8295 vty_out(vty
, "\nInstance %s:\n",
8296 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
8300 bgp_show_summary_afi_safi(vty
, bgp
, afi
, safi
, use_json
, json
);
8304 vty_out(vty
, "}\n");
8305 else if (!nbr_output
)
8306 vty_out(vty
, "%% BGP instance not found\n");
8309 int bgp_show_summary_vty(struct vty
*vty
, const char *name
, afi_t afi
,
8310 safi_t safi
, bool use_json
)
8315 if (strmatch(name
, "all")) {
8316 bgp_show_all_instances_summary_vty(vty
, afi
, safi
,
8320 bgp
= bgp_lookup_by_name(name
);
8324 vty_out(vty
, "{}\n");
8327 "%% BGP instance not found\n");
8331 bgp_show_summary_afi_safi(vty
, bgp
, afi
, safi
, use_json
,
8337 bgp
= bgp_get_default();
8340 bgp_show_summary_afi_safi(vty
, bgp
, afi
, safi
, use_json
, NULL
);
8343 vty_out(vty
, "{}\n");
8345 vty_out(vty
, "%% BGP instance not found\n");
8352 /* `show [ip] bgp summary' commands. */
8353 DEFUN (show_ip_bgp_summary
,
8354 show_ip_bgp_summary_cmd
,
8355 "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR
" ["BGP_SAFI_WITH_LABEL_CMD_STR
"]] summary [json]",
8359 BGP_INSTANCE_HELP_STR
8361 BGP_SAFI_WITH_LABEL_HELP_STR
8362 "Summary of BGP neighbor status\n"
8366 afi_t afi
= AFI_MAX
;
8367 safi_t safi
= SAFI_MAX
;
8372 if (argv_find(argv
, argc
, "ip", &idx
))
8374 /* [<vrf> VIEWVRFNAME] */
8375 if (argv_find(argv
, argc
, "vrf", &idx
)) {
8376 vrf
= argv
[idx
+ 1]->arg
;
8377 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
8379 } else if (argv_find(argv
, argc
, "view", &idx
))
8380 /* [<view> VIEWVRFNAME] */
8381 vrf
= argv
[idx
+ 1]->arg
;
8382 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
8383 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
)) {
8384 argv_find_and_parse_safi(argv
, argc
, &idx
, &safi
);
8387 bool uj
= use_json(argc
, argv
);
8389 return bgp_show_summary_vty(vty
, vrf
, afi
, safi
, uj
);
8392 const char *afi_safi_print(afi_t afi
, safi_t safi
)
8394 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
8395 return "IPv4 Unicast";
8396 else if (afi
== AFI_IP
&& safi
== SAFI_MULTICAST
)
8397 return "IPv4 Multicast";
8398 else if (afi
== AFI_IP
&& safi
== SAFI_LABELED_UNICAST
)
8399 return "IPv4 Labeled Unicast";
8400 else if (afi
== AFI_IP
&& safi
== SAFI_MPLS_VPN
)
8402 else if (afi
== AFI_IP
&& safi
== SAFI_ENCAP
)
8403 return "IPv4 Encap";
8404 else if (afi
== AFI_IP
&& safi
== SAFI_FLOWSPEC
)
8405 return "IPv4 Flowspec";
8406 else if (afi
== AFI_IP6
&& safi
== SAFI_UNICAST
)
8407 return "IPv6 Unicast";
8408 else if (afi
== AFI_IP6
&& safi
== SAFI_MULTICAST
)
8409 return "IPv6 Multicast";
8410 else if (afi
== AFI_IP6
&& safi
== SAFI_LABELED_UNICAST
)
8411 return "IPv6 Labeled Unicast";
8412 else if (afi
== AFI_IP6
&& safi
== SAFI_MPLS_VPN
)
8414 else if (afi
== AFI_IP6
&& safi
== SAFI_ENCAP
)
8415 return "IPv6 Encap";
8416 else if (afi
== AFI_IP6
&& safi
== SAFI_FLOWSPEC
)
8417 return "IPv6 Flowspec";
8418 else if (afi
== AFI_L2VPN
&& safi
== SAFI_EVPN
)
8419 return "L2VPN EVPN";
8425 * Please note that we have intentionally camelCased
8426 * the return strings here. So if you want
8427 * to use this function, please ensure you
8428 * are doing this within json output
8430 const char *afi_safi_json(afi_t afi
, safi_t safi
)
8432 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
8433 return "ipv4Unicast";
8434 else if (afi
== AFI_IP
&& safi
== SAFI_MULTICAST
)
8435 return "ipv4Multicast";
8436 else if (afi
== AFI_IP
&& safi
== SAFI_LABELED_UNICAST
)
8437 return "ipv4LabeledUnicast";
8438 else if (afi
== AFI_IP
&& safi
== SAFI_MPLS_VPN
)
8440 else if (afi
== AFI_IP
&& safi
== SAFI_ENCAP
)
8442 else if (afi
== AFI_IP
&& safi
== SAFI_FLOWSPEC
)
8443 return "ipv4Flowspec";
8444 else if (afi
== AFI_IP6
&& safi
== SAFI_UNICAST
)
8445 return "ipv6Unicast";
8446 else if (afi
== AFI_IP6
&& safi
== SAFI_MULTICAST
)
8447 return "ipv6Multicast";
8448 else if (afi
== AFI_IP6
&& safi
== SAFI_LABELED_UNICAST
)
8449 return "ipv6LabeledUnicast";
8450 else if (afi
== AFI_IP6
&& safi
== SAFI_MPLS_VPN
)
8452 else if (afi
== AFI_IP6
&& safi
== SAFI_ENCAP
)
8454 else if (afi
== AFI_IP6
&& safi
== SAFI_FLOWSPEC
)
8455 return "ipv6Flowspec";
8456 else if (afi
== AFI_L2VPN
&& safi
== SAFI_EVPN
)
8462 /* Show BGP peer's information. */
8463 enum show_type
{ show_all
, show_peer
, show_ipv4_all
, show_ipv6_all
, show_ipv4_peer
, show_ipv6_peer
};
8465 static void bgp_show_peer_afi_orf_cap(struct vty
*vty
, struct peer
*p
,
8466 afi_t afi
, safi_t safi
,
8467 uint16_t adv_smcap
, uint16_t adv_rmcap
,
8468 uint16_t rcv_smcap
, uint16_t rcv_rmcap
,
8469 bool use_json
, json_object
*json_pref
)
8472 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_smcap
)
8473 || CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_smcap
)) {
8475 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_smcap
)
8476 && CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_smcap
))
8477 json_object_string_add(json_pref
, "sendMode",
8478 "advertisedAndReceived");
8479 else if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_smcap
))
8480 json_object_string_add(json_pref
, "sendMode",
8482 else if (CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_smcap
))
8483 json_object_string_add(json_pref
, "sendMode",
8486 vty_out(vty
, " Send-mode: ");
8487 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_smcap
))
8488 vty_out(vty
, "advertised");
8489 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_smcap
))
8490 vty_out(vty
, "%sreceived",
8491 CHECK_FLAG(p
->af_cap
[afi
][safi
],
8500 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_rmcap
)
8501 || CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_rmcap
)) {
8503 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_rmcap
)
8504 && CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_rmcap
))
8505 json_object_string_add(json_pref
, "recvMode",
8506 "advertisedAndReceived");
8507 else if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_rmcap
))
8508 json_object_string_add(json_pref
, "recvMode",
8510 else if (CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_rmcap
))
8511 json_object_string_add(json_pref
, "recvMode",
8514 vty_out(vty
, " Receive-mode: ");
8515 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_rmcap
))
8516 vty_out(vty
, "advertised");
8517 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_rmcap
))
8518 vty_out(vty
, "%sreceived",
8519 CHECK_FLAG(p
->af_cap
[afi
][safi
],
8528 static void bgp_show_peer_afi(struct vty
*vty
, struct peer
*p
, afi_t afi
,
8529 safi_t safi
, bool use_json
,
8530 json_object
*json_neigh
)
8532 struct bgp_filter
*filter
;
8533 struct peer_af
*paf
;
8534 char orf_pfx_name
[BUFSIZ
];
8536 json_object
*json_af
= NULL
;
8537 json_object
*json_prefA
= NULL
;
8538 json_object
*json_prefB
= NULL
;
8539 json_object
*json_addr
= NULL
;
8542 json_addr
= json_object_new_object();
8543 json_af
= json_object_new_object();
8544 filter
= &p
->filter
[afi
][safi
];
8546 if (peer_group_active(p
))
8547 json_object_string_add(json_addr
, "peerGroupMember",
8550 paf
= peer_af_find(p
, afi
, safi
);
8551 if (paf
&& PAF_SUBGRP(paf
)) {
8552 json_object_int_add(json_addr
, "updateGroupId",
8553 PAF_UPDGRP(paf
)->id
);
8554 json_object_int_add(json_addr
, "subGroupId",
8555 PAF_SUBGRP(paf
)->id
);
8556 json_object_int_add(json_addr
, "packetQueueLength",
8557 bpacket_queue_virtual_length(paf
));
8560 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
8561 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8562 PEER_CAP_ORF_PREFIX_SM_RCV
)
8563 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8564 PEER_CAP_ORF_PREFIX_RM_ADV
)
8565 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8566 PEER_CAP_ORF_PREFIX_RM_RCV
)) {
8567 json_object_int_add(json_af
, "orfType",
8569 json_prefA
= json_object_new_object();
8570 bgp_show_peer_afi_orf_cap(vty
, p
, afi
, safi
,
8571 PEER_CAP_ORF_PREFIX_SM_ADV
,
8572 PEER_CAP_ORF_PREFIX_RM_ADV
,
8573 PEER_CAP_ORF_PREFIX_SM_RCV
,
8574 PEER_CAP_ORF_PREFIX_RM_RCV
,
8575 use_json
, json_prefA
);
8576 json_object_object_add(json_af
, "orfPrefixList",
8580 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
8581 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8582 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
8583 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8584 PEER_CAP_ORF_PREFIX_RM_ADV
)
8585 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8586 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
)) {
8587 json_object_int_add(json_af
, "orfOldType",
8588 ORF_TYPE_PREFIX_OLD
);
8589 json_prefB
= json_object_new_object();
8590 bgp_show_peer_afi_orf_cap(
8591 vty
, p
, afi
, safi
, PEER_CAP_ORF_PREFIX_SM_ADV
,
8592 PEER_CAP_ORF_PREFIX_RM_ADV
,
8593 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
,
8594 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
, use_json
,
8596 json_object_object_add(json_af
, "orfOldPrefixList",
8600 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
8601 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8602 PEER_CAP_ORF_PREFIX_SM_RCV
)
8603 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8604 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
8605 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8606 PEER_CAP_ORF_PREFIX_RM_ADV
)
8607 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8608 PEER_CAP_ORF_PREFIX_RM_RCV
)
8609 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8610 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
))
8611 json_object_object_add(json_addr
, "afDependentCap",
8614 json_object_free(json_af
);
8616 sprintf(orf_pfx_name
, "%s.%d.%d", p
->host
, afi
, safi
);
8617 orf_pfx_count
= prefix_bgp_show_prefix_list(
8618 NULL
, afi
, orf_pfx_name
, use_json
);
8620 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
8621 PEER_STATUS_ORF_PREFIX_SEND
)
8623 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
8624 PEER_STATUS_ORF_PREFIX_SEND
))
8625 json_object_boolean_true_add(json_neigh
,
8628 json_object_int_add(json_addr
, "orfRecvCounter",
8631 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
8632 PEER_STATUS_ORF_WAIT_REFRESH
))
8633 json_object_string_add(
8634 json_addr
, "orfFirstUpdate",
8635 "deferredUntilORFOrRouteRefreshRecvd");
8637 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8638 PEER_FLAG_REFLECTOR_CLIENT
))
8639 json_object_boolean_true_add(json_addr
,
8640 "routeReflectorClient");
8641 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8642 PEER_FLAG_RSERVER_CLIENT
))
8643 json_object_boolean_true_add(json_addr
,
8644 "routeServerClient");
8645 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
8646 json_object_boolean_true_add(json_addr
,
8647 "inboundSoftConfigPermit");
8649 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8650 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
))
8651 json_object_boolean_true_add(
8653 "privateAsNumsAllReplacedInUpdatesToNbr");
8654 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8655 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
))
8656 json_object_boolean_true_add(
8658 "privateAsNumsReplacedInUpdatesToNbr");
8659 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8660 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
))
8661 json_object_boolean_true_add(
8663 "privateAsNumsAllRemovedInUpdatesToNbr");
8664 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8665 PEER_FLAG_REMOVE_PRIVATE_AS
))
8666 json_object_boolean_true_add(
8668 "privateAsNumsRemovedInUpdatesToNbr");
8670 if (p
->addpath_type
[afi
][safi
] != BGP_ADDPATH_NONE
)
8671 json_object_boolean_true_add(
8673 bgp_addpath_names(p
->addpath_type
[afi
][safi
])
8676 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_AS_OVERRIDE
))
8677 json_object_string_add(json_addr
,
8678 "overrideASNsInOutboundUpdates",
8679 "ifAspathEqualRemoteAs");
8681 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_SELF
)
8682 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
8683 PEER_FLAG_FORCE_NEXTHOP_SELF
))
8684 json_object_boolean_true_add(json_addr
,
8685 "routerAlwaysNextHop");
8686 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8687 PEER_FLAG_AS_PATH_UNCHANGED
))
8688 json_object_boolean_true_add(
8689 json_addr
, "unchangedAsPathPropogatedToNbr");
8690 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8691 PEER_FLAG_NEXTHOP_UNCHANGED
))
8692 json_object_boolean_true_add(
8693 json_addr
, "unchangedNextHopPropogatedToNbr");
8694 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
8695 json_object_boolean_true_add(
8696 json_addr
, "unchangedMedPropogatedToNbr");
8697 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
)
8698 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
8699 PEER_FLAG_SEND_EXT_COMMUNITY
)) {
8700 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8701 PEER_FLAG_SEND_COMMUNITY
)
8702 && CHECK_FLAG(p
->af_flags
[afi
][safi
],
8703 PEER_FLAG_SEND_EXT_COMMUNITY
))
8704 json_object_string_add(json_addr
,
8705 "commAttriSentToNbr",
8706 "extendedAndStandard");
8707 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8708 PEER_FLAG_SEND_EXT_COMMUNITY
))
8709 json_object_string_add(json_addr
,
8710 "commAttriSentToNbr",
8713 json_object_string_add(json_addr
,
8714 "commAttriSentToNbr",
8717 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8718 PEER_FLAG_DEFAULT_ORIGINATE
)) {
8719 if (p
->default_rmap
[afi
][safi
].name
)
8720 json_object_string_add(
8721 json_addr
, "defaultRouteMap",
8722 p
->default_rmap
[afi
][safi
].name
);
8724 if (paf
&& PAF_SUBGRP(paf
)
8725 && CHECK_FLAG(PAF_SUBGRP(paf
)->sflags
,
8726 SUBGRP_STATUS_DEFAULT_ORIGINATE
))
8727 json_object_boolean_true_add(json_addr
,
8730 json_object_boolean_true_add(json_addr
,
8734 if (afi
== AFI_L2VPN
&& safi
== SAFI_EVPN
) {
8735 if (is_evpn_enabled())
8736 json_object_boolean_true_add(
8737 json_addr
, "advertiseAllVnis");
8740 if (filter
->plist
[FILTER_IN
].name
8741 || filter
->dlist
[FILTER_IN
].name
8742 || filter
->aslist
[FILTER_IN
].name
8743 || filter
->map
[RMAP_IN
].name
)
8744 json_object_boolean_true_add(json_addr
,
8745 "inboundPathPolicyConfig");
8746 if (filter
->plist
[FILTER_OUT
].name
8747 || filter
->dlist
[FILTER_OUT
].name
8748 || filter
->aslist
[FILTER_OUT
].name
8749 || filter
->map
[RMAP_OUT
].name
|| filter
->usmap
.name
)
8750 json_object_boolean_true_add(
8751 json_addr
, "outboundPathPolicyConfig");
8754 if (filter
->plist
[FILTER_IN
].name
)
8755 json_object_string_add(json_addr
,
8756 "incomingUpdatePrefixFilterList",
8757 filter
->plist
[FILTER_IN
].name
);
8758 if (filter
->plist
[FILTER_OUT
].name
)
8759 json_object_string_add(json_addr
,
8760 "outgoingUpdatePrefixFilterList",
8761 filter
->plist
[FILTER_OUT
].name
);
8763 /* distribute-list */
8764 if (filter
->dlist
[FILTER_IN
].name
)
8765 json_object_string_add(
8766 json_addr
, "incomingUpdateNetworkFilterList",
8767 filter
->dlist
[FILTER_IN
].name
);
8768 if (filter
->dlist
[FILTER_OUT
].name
)
8769 json_object_string_add(
8770 json_addr
, "outgoingUpdateNetworkFilterList",
8771 filter
->dlist
[FILTER_OUT
].name
);
8774 if (filter
->aslist
[FILTER_IN
].name
)
8775 json_object_string_add(json_addr
,
8776 "incomingUpdateAsPathFilterList",
8777 filter
->aslist
[FILTER_IN
].name
);
8778 if (filter
->aslist
[FILTER_OUT
].name
)
8779 json_object_string_add(json_addr
,
8780 "outgoingUpdateAsPathFilterList",
8781 filter
->aslist
[FILTER_OUT
].name
);
8784 if (filter
->map
[RMAP_IN
].name
)
8785 json_object_string_add(
8786 json_addr
, "routeMapForIncomingAdvertisements",
8787 filter
->map
[RMAP_IN
].name
);
8788 if (filter
->map
[RMAP_OUT
].name
)
8789 json_object_string_add(
8790 json_addr
, "routeMapForOutgoingAdvertisements",
8791 filter
->map
[RMAP_OUT
].name
);
8793 /* ebgp-requires-policy (inbound) */
8794 if (p
->bgp
->ebgp_requires_policy
== DEFAULT_EBGP_POLICY_ENABLED
8795 && !bgp_inbound_policy_exists(p
, filter
))
8796 json_object_string_add(
8797 json_addr
, "inboundEbgpRequiresPolicy",
8798 "Inbound updates discarded due to missing policy");
8800 /* ebgp-requires-policy (outbound) */
8801 if (p
->bgp
->ebgp_requires_policy
== DEFAULT_EBGP_POLICY_ENABLED
8802 && (!bgp_outbound_policy_exists(p
, filter
)))
8803 json_object_string_add(
8804 json_addr
, "outboundEbgpRequiresPolicy",
8805 "Outbound updates discarded due to missing policy");
8807 /* unsuppress-map */
8808 if (filter
->usmap
.name
)
8809 json_object_string_add(json_addr
,
8810 "selectiveUnsuppressRouteMap",
8811 filter
->usmap
.name
);
8813 /* Receive prefix count */
8814 json_object_int_add(json_addr
, "acceptedPrefixCounter",
8815 p
->pcount
[afi
][safi
]);
8816 if (paf
&& PAF_SUBGRP(paf
))
8817 json_object_int_add(json_addr
, "sentPrefixCounter",
8818 (PAF_SUBGRP(paf
))->scount
);
8820 /* Maximum prefix */
8821 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
)) {
8822 json_object_int_add(json_addr
, "prefixAllowedMax",
8823 p
->pmax
[afi
][safi
]);
8824 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8825 PEER_FLAG_MAX_PREFIX_WARNING
))
8826 json_object_boolean_true_add(
8827 json_addr
, "prefixAllowedMaxWarning");
8828 json_object_int_add(json_addr
,
8829 "prefixAllowedWarningThresh",
8830 p
->pmax_threshold
[afi
][safi
]);
8831 if (p
->pmax_restart
[afi
][safi
])
8832 json_object_int_add(
8834 "prefixAllowedRestartIntervalMsecs",
8835 p
->pmax_restart
[afi
][safi
] * 60000);
8837 json_object_object_add(json_neigh
, afi_safi_print(afi
, safi
),
8841 filter
= &p
->filter
[afi
][safi
];
8843 vty_out(vty
, " For address family: %s\n",
8844 afi_safi_print(afi
, safi
));
8846 if (peer_group_active(p
))
8847 vty_out(vty
, " %s peer-group member\n",
8850 paf
= peer_af_find(p
, afi
, safi
);
8851 if (paf
&& PAF_SUBGRP(paf
)) {
8852 vty_out(vty
, " Update group %" PRIu64
8853 ", subgroup %" PRIu64
"\n",
8854 PAF_UPDGRP(paf
)->id
, PAF_SUBGRP(paf
)->id
);
8855 vty_out(vty
, " Packet Queue length %d\n",
8856 bpacket_queue_virtual_length(paf
));
8858 vty_out(vty
, " Not part of any update group\n");
8860 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
8861 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8862 PEER_CAP_ORF_PREFIX_SM_RCV
)
8863 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8864 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
8865 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8866 PEER_CAP_ORF_PREFIX_RM_ADV
)
8867 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8868 PEER_CAP_ORF_PREFIX_RM_RCV
)
8869 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8870 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
))
8871 vty_out(vty
, " AF-dependant capabilities:\n");
8873 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
8874 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8875 PEER_CAP_ORF_PREFIX_SM_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
)) {
8881 " Outbound Route Filter (ORF) type (%d) Prefix-list:\n",
8883 bgp_show_peer_afi_orf_cap(
8884 vty
, p
, afi
, safi
, PEER_CAP_ORF_PREFIX_SM_ADV
,
8885 PEER_CAP_ORF_PREFIX_RM_ADV
,
8886 PEER_CAP_ORF_PREFIX_SM_RCV
,
8887 PEER_CAP_ORF_PREFIX_RM_RCV
, use_json
, NULL
);
8889 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
8890 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8891 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
8892 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8893 PEER_CAP_ORF_PREFIX_RM_ADV
)
8894 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8895 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
)) {
8897 " Outbound Route Filter (ORF) type (%d) Prefix-list:\n",
8898 ORF_TYPE_PREFIX_OLD
);
8899 bgp_show_peer_afi_orf_cap(
8900 vty
, p
, afi
, safi
, PEER_CAP_ORF_PREFIX_SM_ADV
,
8901 PEER_CAP_ORF_PREFIX_RM_ADV
,
8902 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
,
8903 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
, use_json
, NULL
);
8906 sprintf(orf_pfx_name
, "%s.%d.%d", p
->host
, afi
, safi
);
8907 orf_pfx_count
= prefix_bgp_show_prefix_list(
8908 NULL
, afi
, orf_pfx_name
, use_json
);
8910 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
8911 PEER_STATUS_ORF_PREFIX_SEND
)
8913 vty_out(vty
, " Outbound Route Filter (ORF):");
8914 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
8915 PEER_STATUS_ORF_PREFIX_SEND
))
8916 vty_out(vty
, " sent;");
8918 vty_out(vty
, " received (%d entries)",
8922 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
8923 PEER_STATUS_ORF_WAIT_REFRESH
))
8925 " First update is deferred until ORF or ROUTE-REFRESH is received\n");
8927 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8928 PEER_FLAG_REFLECTOR_CLIENT
))
8929 vty_out(vty
, " Route-Reflector Client\n");
8930 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8931 PEER_FLAG_RSERVER_CLIENT
))
8932 vty_out(vty
, " Route-Server Client\n");
8933 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
8935 " Inbound soft reconfiguration allowed\n");
8937 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8938 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
))
8940 " Private AS numbers (all) replaced in updates to this neighbor\n");
8941 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8942 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
))
8944 " Private AS numbers replaced in updates to this neighbor\n");
8945 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8946 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
))
8948 " Private AS numbers (all) removed in updates to this neighbor\n");
8949 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8950 PEER_FLAG_REMOVE_PRIVATE_AS
))
8952 " Private AS numbers removed in updates to this neighbor\n");
8954 if (p
->addpath_type
[afi
][safi
] != BGP_ADDPATH_NONE
)
8955 vty_out(vty
, " %s\n",
8956 bgp_addpath_names(p
->addpath_type
[afi
][safi
])
8957 ->human_description
);
8959 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_AS_OVERRIDE
))
8961 " Override ASNs in outbound updates if aspath equals remote-as\n");
8963 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_SELF
)
8964 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
8965 PEER_FLAG_FORCE_NEXTHOP_SELF
))
8966 vty_out(vty
, " NEXT_HOP is always this router\n");
8967 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8968 PEER_FLAG_AS_PATH_UNCHANGED
))
8970 " AS_PATH is propagated unchanged to this neighbor\n");
8971 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8972 PEER_FLAG_NEXTHOP_UNCHANGED
))
8974 " NEXT_HOP is propagated unchanged to this neighbor\n");
8975 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
8977 " MED is propagated unchanged to this neighbor\n");
8978 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
)
8979 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
8980 PEER_FLAG_SEND_EXT_COMMUNITY
)
8981 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
8982 PEER_FLAG_SEND_LARGE_COMMUNITY
)) {
8984 " Community attribute sent to this neighbor");
8985 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8986 PEER_FLAG_SEND_COMMUNITY
)
8987 && CHECK_FLAG(p
->af_flags
[afi
][safi
],
8988 PEER_FLAG_SEND_EXT_COMMUNITY
)
8989 && CHECK_FLAG(p
->af_flags
[afi
][safi
],
8990 PEER_FLAG_SEND_LARGE_COMMUNITY
))
8991 vty_out(vty
, "(all)\n");
8992 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8993 PEER_FLAG_SEND_LARGE_COMMUNITY
))
8994 vty_out(vty
, "(large)\n");
8995 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8996 PEER_FLAG_SEND_EXT_COMMUNITY
))
8997 vty_out(vty
, "(extended)\n");
8999 vty_out(vty
, "(standard)\n");
9001 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9002 PEER_FLAG_DEFAULT_ORIGINATE
)) {
9003 vty_out(vty
, " Default information originate,");
9005 if (p
->default_rmap
[afi
][safi
].name
)
9006 vty_out(vty
, " default route-map %s%s,",
9007 p
->default_rmap
[afi
][safi
].map
? "*"
9009 p
->default_rmap
[afi
][safi
].name
);
9010 if (paf
&& PAF_SUBGRP(paf
)
9011 && CHECK_FLAG(PAF_SUBGRP(paf
)->sflags
,
9012 SUBGRP_STATUS_DEFAULT_ORIGINATE
))
9013 vty_out(vty
, " default sent\n");
9015 vty_out(vty
, " default not sent\n");
9018 /* advertise-vni-all */
9019 if (afi
== AFI_L2VPN
&& safi
== SAFI_EVPN
) {
9020 if (is_evpn_enabled())
9021 vty_out(vty
, " advertise-all-vni\n");
9024 if (filter
->plist
[FILTER_IN
].name
9025 || filter
->dlist
[FILTER_IN
].name
9026 || filter
->aslist
[FILTER_IN
].name
9027 || filter
->map
[RMAP_IN
].name
)
9028 vty_out(vty
, " Inbound path policy configured\n");
9029 if (filter
->plist
[FILTER_OUT
].name
9030 || filter
->dlist
[FILTER_OUT
].name
9031 || filter
->aslist
[FILTER_OUT
].name
9032 || filter
->map
[RMAP_OUT
].name
|| filter
->usmap
.name
)
9033 vty_out(vty
, " Outbound path policy configured\n");
9036 if (filter
->plist
[FILTER_IN
].name
)
9038 " Incoming update prefix filter list is %s%s\n",
9039 filter
->plist
[FILTER_IN
].plist
? "*" : "",
9040 filter
->plist
[FILTER_IN
].name
);
9041 if (filter
->plist
[FILTER_OUT
].name
)
9043 " Outgoing update prefix filter list is %s%s\n",
9044 filter
->plist
[FILTER_OUT
].plist
? "*" : "",
9045 filter
->plist
[FILTER_OUT
].name
);
9047 /* distribute-list */
9048 if (filter
->dlist
[FILTER_IN
].name
)
9050 " Incoming update network filter list is %s%s\n",
9051 filter
->dlist
[FILTER_IN
].alist
? "*" : "",
9052 filter
->dlist
[FILTER_IN
].name
);
9053 if (filter
->dlist
[FILTER_OUT
].name
)
9055 " Outgoing update network filter list is %s%s\n",
9056 filter
->dlist
[FILTER_OUT
].alist
? "*" : "",
9057 filter
->dlist
[FILTER_OUT
].name
);
9060 if (filter
->aslist
[FILTER_IN
].name
)
9062 " Incoming update AS path filter list is %s%s\n",
9063 filter
->aslist
[FILTER_IN
].aslist
? "*" : "",
9064 filter
->aslist
[FILTER_IN
].name
);
9065 if (filter
->aslist
[FILTER_OUT
].name
)
9067 " Outgoing update AS path filter list is %s%s\n",
9068 filter
->aslist
[FILTER_OUT
].aslist
? "*" : "",
9069 filter
->aslist
[FILTER_OUT
].name
);
9072 if (filter
->map
[RMAP_IN
].name
)
9074 " Route map for incoming advertisements is %s%s\n",
9075 filter
->map
[RMAP_IN
].map
? "*" : "",
9076 filter
->map
[RMAP_IN
].name
);
9077 if (filter
->map
[RMAP_OUT
].name
)
9079 " Route map for outgoing advertisements is %s%s\n",
9080 filter
->map
[RMAP_OUT
].map
? "*" : "",
9081 filter
->map
[RMAP_OUT
].name
);
9083 /* ebgp-requires-policy (inbound) */
9084 if (p
->bgp
->ebgp_requires_policy
== DEFAULT_EBGP_POLICY_ENABLED
9085 && !bgp_inbound_policy_exists(p
, filter
))
9087 " Inbound updates discarded due to missing policy\n");
9089 /* ebgp-requires-policy (outbound) */
9090 if (p
->bgp
->ebgp_requires_policy
== DEFAULT_EBGP_POLICY_ENABLED
9091 && !bgp_outbound_policy_exists(p
, filter
))
9093 " Outbound updates discarded due to missing policy\n");
9095 /* unsuppress-map */
9096 if (filter
->usmap
.name
)
9098 " Route map for selective unsuppress is %s%s\n",
9099 filter
->usmap
.map
? "*" : "",
9100 filter
->usmap
.name
);
9102 /* Receive prefix count */
9103 vty_out(vty
, " %ld accepted prefixes\n", p
->pcount
[afi
][safi
]);
9105 /* Maximum prefix */
9106 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
)) {
9107 vty_out(vty
, " Maximum prefixes allowed %ld%s\n",
9109 CHECK_FLAG(p
->af_flags
[afi
][safi
],
9110 PEER_FLAG_MAX_PREFIX_WARNING
)
9113 vty_out(vty
, " Threshold for warning message %d%%",
9114 p
->pmax_threshold
[afi
][safi
]);
9115 if (p
->pmax_restart
[afi
][safi
])
9116 vty_out(vty
, ", restart interval %d min",
9117 p
->pmax_restart
[afi
][safi
]);
9125 static void bgp_show_peer(struct vty
*vty
, struct peer
*p
, bool use_json
,
9129 char buf1
[PREFIX2STR_BUFFER
], buf
[SU_ADDRSTRLEN
];
9130 char timebuf
[BGP_UPTIME_LEN
];
9132 const char *subcode_str
;
9133 const char *code_str
;
9138 json_object
*json_neigh
= NULL
;
9144 json_neigh
= json_object_new_object();
9146 memset(dn_flag
, '\0', sizeof(dn_flag
));
9147 if (!p
->conf_if
&& peer_dynamic_neighbor(p
))
9151 if (p
->conf_if
) /* Configured interface name. */
9152 vty_out(vty
, "BGP neighbor on %s: %s, ", p
->conf_if
,
9153 BGP_PEER_SU_UNSPEC(p
)
9155 : sockunion2str(&p
->su
, buf
,
9157 else /* Configured IP address. */
9158 vty_out(vty
, "BGP neighbor is %s%s, ", dn_flag
,
9163 if (p
->conf_if
&& BGP_PEER_SU_UNSPEC(p
))
9164 json_object_string_add(json_neigh
, "bgpNeighborAddr",
9166 else if (p
->conf_if
&& !BGP_PEER_SU_UNSPEC(p
))
9167 json_object_string_add(
9168 json_neigh
, "bgpNeighborAddr",
9169 sockunion2str(&p
->su
, buf
, SU_ADDRSTRLEN
));
9171 json_object_int_add(json_neigh
, "remoteAs", p
->as
);
9173 if (p
->change_local_as
)
9174 json_object_int_add(json_neigh
, "localAs",
9175 p
->change_local_as
);
9177 json_object_int_add(json_neigh
, "localAs", p
->local_as
);
9179 if (CHECK_FLAG(p
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
))
9180 json_object_boolean_true_add(json_neigh
,
9181 "localAsNoPrepend");
9183 if (CHECK_FLAG(p
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
))
9184 json_object_boolean_true_add(json_neigh
,
9185 "localAsReplaceAs");
9187 if ((p
->as_type
== AS_SPECIFIED
) || (p
->as_type
== AS_EXTERNAL
)
9188 || (p
->as_type
== AS_INTERNAL
))
9189 vty_out(vty
, "remote AS %u, ", p
->as
);
9191 vty_out(vty
, "remote AS Unspecified, ");
9192 vty_out(vty
, "local AS %u%s%s, ",
9193 p
->change_local_as
? p
->change_local_as
: p
->local_as
,
9194 CHECK_FLAG(p
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
)
9197 CHECK_FLAG(p
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
)
9201 /* peer type internal or confed-internal */
9202 if ((p
->as
== p
->local_as
) || (p
->as_type
== AS_INTERNAL
)) {
9204 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
))
9205 json_object_boolean_true_add(
9206 json_neigh
, "nbrConfedInternalLink");
9208 json_object_boolean_true_add(json_neigh
,
9211 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
))
9212 vty_out(vty
, "confed-internal link\n");
9214 vty_out(vty
, "internal link\n");
9216 /* peer type external or confed-external */
9217 } else if (p
->as
|| (p
->as_type
== AS_EXTERNAL
)) {
9219 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
))
9220 json_object_boolean_true_add(
9221 json_neigh
, "nbrConfedExternalLink");
9223 json_object_boolean_true_add(json_neigh
,
9226 if (bgp_confederation_peers_check(bgp
, p
->as
))
9227 vty_out(vty
, "confed-external link\n");
9229 vty_out(vty
, "external link\n");
9233 json_object_boolean_true_add(json_neigh
,
9234 "nbrUnspecifiedLink");
9236 vty_out(vty
, "unspecified link\n");
9242 json_object_string_add(json_neigh
, "nbrDesc", p
->desc
);
9244 vty_out(vty
, " Description: %s\n", p
->desc
);
9250 json_object_string_add(json_neigh
, "hostname",
9254 json_object_string_add(json_neigh
, "domainname",
9257 if (p
->domainname
&& (p
->domainname
[0] != '\0'))
9258 vty_out(vty
, "Hostname: %s.%s\n", p
->hostname
,
9261 vty_out(vty
, "Hostname: %s\n", p
->hostname
);
9268 json_object_string_add(json_neigh
, "peerGroup",
9272 struct prefix prefix
, *range
= NULL
;
9274 sockunion2hostprefix(&(p
->su
), &prefix
);
9275 range
= peer_group_lookup_dynamic_neighbor_range(
9279 prefix2str(range
, buf1
, sizeof(buf1
));
9280 json_object_string_add(
9282 "peerSubnetRangeGroup", buf1
);
9287 " Member of peer-group %s for session parameters\n",
9291 struct prefix prefix
, *range
= NULL
;
9293 sockunion2hostprefix(&(p
->su
), &prefix
);
9294 range
= peer_group_lookup_dynamic_neighbor_range(
9298 prefix2str(range
, buf1
, sizeof(buf1
));
9300 " Belongs to the subnet range group: %s\n",
9308 /* Administrative shutdown. */
9309 if (CHECK_FLAG(p
->flags
, PEER_FLAG_SHUTDOWN
))
9310 json_object_boolean_true_add(json_neigh
,
9314 json_object_int_add(json_neigh
, "bgpVersion", 4);
9315 json_object_string_add(
9316 json_neigh
, "remoteRouterId",
9317 inet_ntop(AF_INET
, &p
->remote_id
, buf1
, sizeof(buf1
)));
9318 json_object_string_add(
9319 json_neigh
, "localRouterId",
9320 inet_ntop(AF_INET
, &bgp
->router_id
, buf1
,
9324 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
)
9325 && bgp_confederation_peers_check(bgp
, p
->as
))
9326 json_object_boolean_true_add(json_neigh
,
9330 json_object_string_add(
9331 json_neigh
, "bgpState",
9332 lookup_msg(bgp_status_msg
, p
->status
, NULL
));
9334 if (p
->status
== Established
) {
9337 uptime
= bgp_clock();
9338 uptime
-= p
->uptime
;
9339 epoch_tbuf
= time(NULL
) - uptime
;
9341 #if CONFDATE > 20200101
9343 "bgpTimerUp should be deprecated and can be removed now");
9346 * bgpTimerUp was miliseconds that was accurate
9347 * up to 1 day, then the value returned
9348 * became garbage. So in order to provide
9349 * some level of backwards compatability,
9350 * we still provde the data, but now
9351 * we are returning the correct value
9352 * and also adding a new bgpTimerUpMsec
9353 * which will allow us to deprecate
9356 json_object_int_add(json_neigh
, "bgpTimerUp",
9358 json_object_int_add(json_neigh
, "bgpTimerUpMsec",
9360 json_object_string_add(json_neigh
, "bgpTimerUpString",
9361 peer_uptime(p
->uptime
, timebuf
,
9364 json_object_int_add(json_neigh
,
9365 "bgpTimerUpEstablishedEpoch",
9369 else if (p
->status
== Active
) {
9370 if (CHECK_FLAG(p
->flags
, PEER_FLAG_PASSIVE
))
9371 json_object_string_add(json_neigh
, "bgpStateIs",
9373 else if (CHECK_FLAG(p
->sflags
, PEER_STATUS_NSF_WAIT
))
9374 json_object_string_add(json_neigh
, "bgpStateIs",
9382 uptime
= bgp_clock();
9383 uptime
-= p
->readtime
;
9384 tm
= gmtime(&uptime
);
9385 json_object_int_add(json_neigh
, "bgpTimerLastRead",
9386 (tm
->tm_sec
* 1000) + (tm
->tm_min
* 60000)
9387 + (tm
->tm_hour
* 3600000));
9389 uptime
= bgp_clock();
9390 uptime
-= p
->last_write
;
9391 tm
= gmtime(&uptime
);
9392 json_object_int_add(json_neigh
, "bgpTimerLastWrite",
9393 (tm
->tm_sec
* 1000) + (tm
->tm_min
* 60000)
9394 + (tm
->tm_hour
* 3600000));
9396 uptime
= bgp_clock();
9397 uptime
-= p
->update_time
;
9398 tm
= gmtime(&uptime
);
9399 json_object_int_add(json_neigh
, "bgpInUpdateElapsedTimeMsecs",
9400 (tm
->tm_sec
* 1000) + (tm
->tm_min
* 60000)
9401 + (tm
->tm_hour
* 3600000));
9403 /* Configured timer values. */
9404 json_object_int_add(json_neigh
, "bgpTimerHoldTimeMsecs",
9405 p
->v_holdtime
* 1000);
9406 json_object_int_add(json_neigh
,
9407 "bgpTimerKeepAliveIntervalMsecs",
9408 p
->v_keepalive
* 1000);
9409 if (CHECK_FLAG(p
->flags
, PEER_FLAG_TIMER
)) {
9410 json_object_int_add(json_neigh
,
9411 "bgpTimerConfiguredHoldTimeMsecs",
9412 p
->holdtime
* 1000);
9413 json_object_int_add(
9415 "bgpTimerConfiguredKeepAliveIntervalMsecs",
9416 p
->keepalive
* 1000);
9417 } else if ((bgp
->default_holdtime
!= BGP_DEFAULT_HOLDTIME
)
9418 || (bgp
->default_keepalive
9419 != BGP_DEFAULT_KEEPALIVE
)) {
9420 json_object_int_add(json_neigh
,
9421 "bgpTimerConfiguredHoldTimeMsecs",
9422 bgp
->default_holdtime
);
9423 json_object_int_add(
9425 "bgpTimerConfiguredKeepAliveIntervalMsecs",
9426 bgp
->default_keepalive
);
9429 /* Administrative shutdown. */
9430 if (CHECK_FLAG(p
->flags
, PEER_FLAG_SHUTDOWN
))
9431 vty_out(vty
, " Administratively shut down\n");
9434 vty_out(vty
, " BGP version 4");
9435 vty_out(vty
, ", remote router ID %s",
9436 inet_ntop(AF_INET
, &p
->remote_id
, buf1
, sizeof(buf1
)));
9437 vty_out(vty
, ", local router ID %s\n",
9438 inet_ntop(AF_INET
, &bgp
->router_id
, buf1
,
9442 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
)
9443 && bgp_confederation_peers_check(bgp
, p
->as
))
9445 " Neighbor under common administration\n");
9448 vty_out(vty
, " BGP state = %s",
9449 lookup_msg(bgp_status_msg
, p
->status
, NULL
));
9451 if (p
->status
== Established
)
9452 vty_out(vty
, ", up for %8s",
9453 peer_uptime(p
->uptime
, timebuf
, BGP_UPTIME_LEN
,
9456 else if (p
->status
== Active
) {
9457 if (CHECK_FLAG(p
->flags
, PEER_FLAG_PASSIVE
))
9458 vty_out(vty
, " (passive)");
9459 else if (CHECK_FLAG(p
->sflags
, PEER_STATUS_NSF_WAIT
))
9460 vty_out(vty
, " (NSF passive)");
9465 vty_out(vty
, " Last read %s",
9466 peer_uptime(p
->readtime
, timebuf
, BGP_UPTIME_LEN
, 0,
9468 vty_out(vty
, ", Last write %s\n",
9469 peer_uptime(p
->last_write
, timebuf
, BGP_UPTIME_LEN
, 0,
9472 /* Configured timer values. */
9474 " Hold time is %d, keepalive interval is %d seconds\n",
9475 p
->v_holdtime
, p
->v_keepalive
);
9476 if (CHECK_FLAG(p
->flags
, PEER_FLAG_TIMER
)) {
9477 vty_out(vty
, " Configured hold time is %d",
9479 vty_out(vty
, ", keepalive interval is %d seconds\n",
9481 } else if ((bgp
->default_holdtime
!= BGP_DEFAULT_HOLDTIME
)
9482 || (bgp
->default_keepalive
9483 != BGP_DEFAULT_KEEPALIVE
)) {
9484 vty_out(vty
, " Configured hold time is %d",
9485 bgp
->default_holdtime
);
9486 vty_out(vty
, ", keepalive interval is %d seconds\n",
9487 bgp
->default_keepalive
);
9491 if (p
->status
== Established
) {
9492 if (p
->cap
|| p
->afc_adv
[AFI_IP
][SAFI_UNICAST
]
9493 || p
->afc_recv
[AFI_IP
][SAFI_UNICAST
]
9494 || p
->afc_adv
[AFI_IP
][SAFI_MULTICAST
]
9495 || p
->afc_recv
[AFI_IP
][SAFI_MULTICAST
]
9496 || p
->afc_adv
[AFI_IP6
][SAFI_UNICAST
]
9497 || p
->afc_recv
[AFI_IP6
][SAFI_UNICAST
]
9498 || p
->afc_adv
[AFI_IP6
][SAFI_MULTICAST
]
9499 || p
->afc_recv
[AFI_IP6
][SAFI_MULTICAST
]
9500 || p
->afc_adv
[AFI_IP6
][SAFI_MPLS_VPN
]
9501 || p
->afc_recv
[AFI_IP6
][SAFI_MPLS_VPN
]
9502 || p
->afc_adv
[AFI_IP6
][SAFI_ENCAP
]
9503 || p
->afc_recv
[AFI_IP6
][SAFI_ENCAP
]
9504 || p
->afc_adv
[AFI_IP6
][SAFI_FLOWSPEC
]
9505 || p
->afc_recv
[AFI_IP6
][SAFI_FLOWSPEC
]
9506 || p
->afc_adv
[AFI_IP
][SAFI_ENCAP
]
9507 || p
->afc_recv
[AFI_IP
][SAFI_ENCAP
]
9508 || p
->afc_adv
[AFI_IP
][SAFI_FLOWSPEC
]
9509 || p
->afc_recv
[AFI_IP
][SAFI_FLOWSPEC
]
9510 || p
->afc_adv
[AFI_IP
][SAFI_MPLS_VPN
]
9511 || p
->afc_recv
[AFI_IP
][SAFI_MPLS_VPN
]) {
9513 json_object
*json_cap
= NULL
;
9515 json_cap
= json_object_new_object();
9518 if (CHECK_FLAG(p
->cap
, PEER_CAP_AS4_RCV
)
9519 || CHECK_FLAG(p
->cap
, PEER_CAP_AS4_ADV
)) {
9520 if (CHECK_FLAG(p
->cap
, PEER_CAP_AS4_ADV
)
9521 && CHECK_FLAG(p
->cap
,
9523 json_object_string_add(
9524 json_cap
, "4byteAs",
9525 "advertisedAndReceived");
9526 else if (CHECK_FLAG(p
->cap
,
9528 json_object_string_add(
9529 json_cap
, "4byteAs",
9531 else if (CHECK_FLAG(p
->cap
,
9533 json_object_string_add(
9534 json_cap
, "4byteAs",
9539 if (CHECK_FLAG(p
->cap
, PEER_CAP_ADDPATH_RCV
)
9540 || CHECK_FLAG(p
->cap
,
9541 PEER_CAP_ADDPATH_ADV
)) {
9542 json_object
*json_add
= NULL
;
9543 const char *print_store
;
9545 json_add
= json_object_new_object();
9547 FOREACH_AFI_SAFI (afi
, safi
) {
9548 json_object
*json_sub
= NULL
;
9550 json_object_new_object();
9551 print_store
= afi_safi_print(
9557 PEER_CAP_ADDPATH_AF_TX_ADV
)
9561 PEER_CAP_ADDPATH_AF_TX_RCV
)) {
9566 PEER_CAP_ADDPATH_AF_TX_ADV
)
9571 PEER_CAP_ADDPATH_AF_TX_RCV
))
9572 json_object_boolean_true_add(
9574 "txAdvertisedAndReceived");
9580 PEER_CAP_ADDPATH_AF_TX_ADV
))
9581 json_object_boolean_true_add(
9589 PEER_CAP_ADDPATH_AF_TX_RCV
))
9590 json_object_boolean_true_add(
9598 PEER_CAP_ADDPATH_AF_RX_ADV
)
9602 PEER_CAP_ADDPATH_AF_RX_RCV
)) {
9607 PEER_CAP_ADDPATH_AF_RX_ADV
)
9612 PEER_CAP_ADDPATH_AF_RX_RCV
))
9613 json_object_boolean_true_add(
9615 "rxAdvertisedAndReceived");
9621 PEER_CAP_ADDPATH_AF_RX_ADV
))
9622 json_object_boolean_true_add(
9630 PEER_CAP_ADDPATH_AF_RX_RCV
))
9631 json_object_boolean_true_add(
9639 PEER_CAP_ADDPATH_AF_TX_ADV
)
9643 PEER_CAP_ADDPATH_AF_TX_RCV
)
9647 PEER_CAP_ADDPATH_AF_RX_ADV
)
9651 PEER_CAP_ADDPATH_AF_RX_RCV
))
9652 json_object_object_add(
9661 json_object_object_add(
9662 json_cap
, "addPath", json_add
);
9666 if (CHECK_FLAG(p
->cap
, PEER_CAP_DYNAMIC_RCV
)
9667 || CHECK_FLAG(p
->cap
,
9668 PEER_CAP_DYNAMIC_ADV
)) {
9669 if (CHECK_FLAG(p
->cap
,
9670 PEER_CAP_DYNAMIC_ADV
)
9671 && CHECK_FLAG(p
->cap
,
9672 PEER_CAP_DYNAMIC_RCV
))
9673 json_object_string_add(
9674 json_cap
, "dynamic",
9675 "advertisedAndReceived");
9676 else if (CHECK_FLAG(
9678 PEER_CAP_DYNAMIC_ADV
))
9679 json_object_string_add(
9680 json_cap
, "dynamic",
9682 else if (CHECK_FLAG(
9684 PEER_CAP_DYNAMIC_RCV
))
9685 json_object_string_add(
9686 json_cap
, "dynamic",
9690 /* Extended nexthop */
9691 if (CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_RCV
)
9692 || CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_ADV
)) {
9693 json_object
*json_nxt
= NULL
;
9694 const char *print_store
;
9697 if (CHECK_FLAG(p
->cap
,
9699 && CHECK_FLAG(p
->cap
,
9701 json_object_string_add(
9704 "advertisedAndReceived");
9705 else if (CHECK_FLAG(p
->cap
,
9707 json_object_string_add(
9711 else if (CHECK_FLAG(p
->cap
,
9713 json_object_string_add(
9718 if (CHECK_FLAG(p
->cap
,
9719 PEER_CAP_ENHE_RCV
)) {
9721 json_object_new_object();
9723 for (safi
= SAFI_UNICAST
;
9724 safi
< SAFI_MAX
; safi
++) {
9729 PEER_CAP_ENHE_AF_RCV
)) {
9730 print_store
= afi_safi_print(
9733 json_object_string_add(
9736 "recieved"); /* misspelled for compatibility */
9739 json_object_object_add(
9741 "extendedNexthopFamililesByPeer",
9747 if (CHECK_FLAG(p
->cap
, PEER_CAP_REFRESH_ADV
)
9748 || CHECK_FLAG(p
->cap
,
9749 PEER_CAP_REFRESH_NEW_RCV
)
9750 || CHECK_FLAG(p
->cap
,
9751 PEER_CAP_REFRESH_OLD_RCV
)) {
9752 if (CHECK_FLAG(p
->cap
,
9753 PEER_CAP_REFRESH_ADV
)
9756 PEER_CAP_REFRESH_NEW_RCV
)
9759 PEER_CAP_REFRESH_OLD_RCV
))) {
9762 PEER_CAP_REFRESH_OLD_RCV
)
9765 PEER_CAP_REFRESH_NEW_RCV
))
9766 json_object_string_add(
9769 "advertisedAndReceivedOldNew");
9773 PEER_CAP_REFRESH_OLD_RCV
))
9774 json_object_string_add(
9777 "advertisedAndReceivedOld");
9779 json_object_string_add(
9782 "advertisedAndReceivedNew");
9787 PEER_CAP_REFRESH_ADV
))
9788 json_object_string_add(
9795 PEER_CAP_REFRESH_NEW_RCV
)
9798 PEER_CAP_REFRESH_OLD_RCV
))
9799 json_object_string_add(
9805 /* Multiprotocol Extensions */
9806 json_object
*json_multi
= NULL
;
9807 json_multi
= json_object_new_object();
9809 FOREACH_AFI_SAFI (afi
, safi
) {
9810 if (p
->afc_adv
[afi
][safi
]
9811 || p
->afc_recv
[afi
][safi
]) {
9812 json_object
*json_exten
= NULL
;
9814 json_object_new_object();
9816 if (p
->afc_adv
[afi
][safi
]
9817 && p
->afc_recv
[afi
][safi
])
9818 json_object_boolean_true_add(
9820 "advertisedAndReceived");
9821 else if (p
->afc_adv
[afi
][safi
])
9822 json_object_boolean_true_add(
9825 else if (p
->afc_recv
[afi
][safi
])
9826 json_object_boolean_true_add(
9830 json_object_object_add(
9837 json_object_object_add(
9838 json_cap
, "multiprotocolExtensions",
9841 /* Hostname capabilities */
9842 json_object
*json_hname
= NULL
;
9844 json_hname
= json_object_new_object();
9846 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_ADV
)) {
9847 json_object_string_add(
9848 json_hname
, "advHostName",
9849 bgp
->peer_self
->hostname
9853 json_object_string_add(
9854 json_hname
, "advDomainName",
9855 bgp
->peer_self
->domainname
9862 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_RCV
)) {
9863 json_object_string_add(
9864 json_hname
, "rcvHostName",
9865 p
->hostname
? p
->hostname
9867 json_object_string_add(
9868 json_hname
, "rcvDomainName",
9869 p
->domainname
? p
->domainname
9873 json_object_object_add(json_cap
, "hostName",
9876 /* Gracefull Restart */
9877 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
)
9878 || CHECK_FLAG(p
->cap
,
9879 PEER_CAP_RESTART_ADV
)) {
9880 if (CHECK_FLAG(p
->cap
,
9881 PEER_CAP_RESTART_ADV
)
9882 && CHECK_FLAG(p
->cap
,
9883 PEER_CAP_RESTART_RCV
))
9884 json_object_string_add(
9887 "advertisedAndReceived");
9888 else if (CHECK_FLAG(
9890 PEER_CAP_RESTART_ADV
))
9891 json_object_string_add(
9893 "gracefulRestartCapability",
9895 else if (CHECK_FLAG(
9897 PEER_CAP_RESTART_RCV
))
9898 json_object_string_add(
9900 "gracefulRestartCapability",
9903 if (CHECK_FLAG(p
->cap
,
9904 PEER_CAP_RESTART_RCV
)) {
9905 int restart_af_count
= 0;
9906 json_object
*json_restart
=
9909 json_object_new_object();
9911 json_object_int_add(
9913 "gracefulRestartRemoteTimerMsecs",
9914 p
->v_gr_restart
* 1000);
9916 FOREACH_AFI_SAFI (afi
, safi
) {
9921 PEER_CAP_RESTART_AF_RCV
)) {
9926 json_object_new_object();
9932 PEER_CAP_RESTART_AF_PRESERVE_RCV
))
9933 json_object_boolean_true_add(
9937 json_object_object_add(
9945 if (!restart_af_count
) {
9946 json_object_string_add(
9948 "addressFamiliesByPeer",
9953 json_object_object_add(
9955 "addressFamiliesByPeer",
9959 json_object_object_add(json_neigh
,
9960 "neighborCapabilities",
9963 vty_out(vty
, " Neighbor capabilities:\n");
9966 if (CHECK_FLAG(p
->cap
, PEER_CAP_AS4_RCV
)
9967 || CHECK_FLAG(p
->cap
, PEER_CAP_AS4_ADV
)) {
9968 vty_out(vty
, " 4 Byte AS:");
9969 if (CHECK_FLAG(p
->cap
,
9971 vty_out(vty
, " advertised");
9972 if (CHECK_FLAG(p
->cap
,
9974 vty_out(vty
, " %sreceived",
9984 if (CHECK_FLAG(p
->cap
, PEER_CAP_ADDPATH_RCV
)
9985 || CHECK_FLAG(p
->cap
,
9986 PEER_CAP_ADDPATH_ADV
)) {
9987 vty_out(vty
, " AddPath:\n");
9989 FOREACH_AFI_SAFI (afi
, safi
) {
9993 PEER_CAP_ADDPATH_AF_TX_ADV
)
9997 PEER_CAP_ADDPATH_AF_TX_RCV
)) {
10008 PEER_CAP_ADDPATH_AF_TX_ADV
))
10019 PEER_CAP_ADDPATH_AF_TX_RCV
))
10026 PEER_CAP_ADDPATH_AF_TX_ADV
)
10030 vty_out(vty
, "\n");
10036 PEER_CAP_ADDPATH_AF_RX_ADV
)
10040 PEER_CAP_ADDPATH_AF_RX_RCV
)) {
10051 PEER_CAP_ADDPATH_AF_RX_ADV
))
10062 PEER_CAP_ADDPATH_AF_RX_RCV
))
10069 PEER_CAP_ADDPATH_AF_RX_ADV
)
10073 vty_out(vty
, "\n");
10079 if (CHECK_FLAG(p
->cap
, PEER_CAP_DYNAMIC_RCV
)
10080 || CHECK_FLAG(p
->cap
,
10081 PEER_CAP_DYNAMIC_ADV
)) {
10082 vty_out(vty
, " Dynamic:");
10083 if (CHECK_FLAG(p
->cap
,
10084 PEER_CAP_DYNAMIC_ADV
))
10085 vty_out(vty
, " advertised");
10086 if (CHECK_FLAG(p
->cap
,
10087 PEER_CAP_DYNAMIC_RCV
))
10088 vty_out(vty
, " %sreceived",
10091 PEER_CAP_DYNAMIC_ADV
)
10094 vty_out(vty
, "\n");
10097 /* Extended nexthop */
10098 if (CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_RCV
)
10099 || CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_ADV
)) {
10100 vty_out(vty
, " Extended nexthop:");
10101 if (CHECK_FLAG(p
->cap
,
10102 PEER_CAP_ENHE_ADV
))
10103 vty_out(vty
, " advertised");
10104 if (CHECK_FLAG(p
->cap
,
10105 PEER_CAP_ENHE_RCV
))
10106 vty_out(vty
, " %sreceived",
10112 vty_out(vty
, "\n");
10114 if (CHECK_FLAG(p
->cap
,
10115 PEER_CAP_ENHE_RCV
)) {
10117 " Address families by peer:\n ");
10118 for (safi
= SAFI_UNICAST
;
10119 safi
< SAFI_MAX
; safi
++)
10124 PEER_CAP_ENHE_AF_RCV
))
10133 /* Route Refresh */
10134 if (CHECK_FLAG(p
->cap
, PEER_CAP_REFRESH_ADV
)
10135 || CHECK_FLAG(p
->cap
,
10136 PEER_CAP_REFRESH_NEW_RCV
)
10137 || CHECK_FLAG(p
->cap
,
10138 PEER_CAP_REFRESH_OLD_RCV
)) {
10139 vty_out(vty
, " Route refresh:");
10140 if (CHECK_FLAG(p
->cap
,
10141 PEER_CAP_REFRESH_ADV
))
10142 vty_out(vty
, " advertised");
10143 if (CHECK_FLAG(p
->cap
,
10144 PEER_CAP_REFRESH_NEW_RCV
)
10147 PEER_CAP_REFRESH_OLD_RCV
))
10148 vty_out(vty
, " %sreceived(%s)",
10151 PEER_CAP_REFRESH_ADV
)
10156 PEER_CAP_REFRESH_OLD_RCV
)
10159 PEER_CAP_REFRESH_NEW_RCV
))
10163 PEER_CAP_REFRESH_OLD_RCV
)
10167 vty_out(vty
, "\n");
10170 /* Multiprotocol Extensions */
10171 FOREACH_AFI_SAFI (afi
, safi
)
10172 if (p
->afc_adv
[afi
][safi
]
10173 || p
->afc_recv
[afi
][safi
]) {
10175 " Address Family %s:",
10176 afi_safi_print(afi
,
10178 if (p
->afc_adv
[afi
][safi
])
10181 if (p
->afc_recv
[afi
][safi
])
10188 vty_out(vty
, "\n");
10191 /* Hostname capability */
10192 vty_out(vty
, " Hostname Capability:");
10194 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_ADV
)) {
10196 " advertised (name: %s,domain name: %s)",
10197 bgp
->peer_self
->hostname
10201 bgp
->peer_self
->domainname
10206 vty_out(vty
, " not advertised");
10209 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_RCV
)) {
10211 " received (name: %s,domain name: %s)",
10212 p
->hostname
? p
->hostname
10214 p
->domainname
? p
->domainname
10217 vty_out(vty
, " not received");
10220 vty_out(vty
, "\n");
10222 /* Gracefull Restart */
10223 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
)
10224 || CHECK_FLAG(p
->cap
,
10225 PEER_CAP_RESTART_ADV
)) {
10227 " Graceful Restart Capabilty:");
10228 if (CHECK_FLAG(p
->cap
,
10229 PEER_CAP_RESTART_ADV
))
10230 vty_out(vty
, " advertised");
10231 if (CHECK_FLAG(p
->cap
,
10232 PEER_CAP_RESTART_RCV
))
10233 vty_out(vty
, " %sreceived",
10236 PEER_CAP_RESTART_ADV
)
10239 vty_out(vty
, "\n");
10241 if (CHECK_FLAG(p
->cap
,
10242 PEER_CAP_RESTART_RCV
)) {
10243 int restart_af_count
= 0;
10246 " Remote Restart timer is %d seconds\n",
10249 " Address families by peer:\n ");
10251 FOREACH_AFI_SAFI (afi
, safi
)
10256 PEER_CAP_RESTART_AF_RCV
)) {
10269 PEER_CAP_RESTART_AF_PRESERVE_RCV
)
10271 : "not preserved");
10272 restart_af_count
++;
10274 if (!restart_af_count
)
10275 vty_out(vty
, "none");
10276 vty_out(vty
, "\n");
10283 /* graceful restart information */
10284 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
) || p
->t_gr_restart
10285 || p
->t_gr_stale
) {
10286 json_object
*json_grace
= NULL
;
10287 json_object
*json_grace_send
= NULL
;
10288 json_object
*json_grace_recv
= NULL
;
10289 int eor_send_af_count
= 0;
10290 int eor_receive_af_count
= 0;
10293 json_grace
= json_object_new_object();
10294 json_grace_send
= json_object_new_object();
10295 json_grace_recv
= json_object_new_object();
10297 if (p
->status
== Established
) {
10298 FOREACH_AFI_SAFI (afi
, safi
) {
10299 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
10300 PEER_STATUS_EOR_SEND
)) {
10301 json_object_boolean_true_add(
10303 afi_safi_print(afi
,
10305 eor_send_af_count
++;
10308 FOREACH_AFI_SAFI (afi
, safi
) {
10310 p
->af_sflags
[afi
][safi
],
10311 PEER_STATUS_EOR_RECEIVED
)) {
10312 json_object_boolean_true_add(
10314 afi_safi_print(afi
,
10316 eor_receive_af_count
++;
10321 json_object_object_add(json_grace
, "endOfRibSend",
10323 json_object_object_add(json_grace
, "endOfRibRecv",
10326 if (p
->t_gr_restart
)
10327 json_object_int_add(json_grace
,
10328 "gracefulRestartTimerMsecs",
10329 thread_timer_remain_second(
10334 json_object_int_add(
10336 "gracefulStalepathTimerMsecs",
10337 thread_timer_remain_second(
10341 json_object_object_add(
10342 json_neigh
, "gracefulRestartInfo", json_grace
);
10344 vty_out(vty
, " Graceful restart information:\n");
10345 if (p
->status
== Established
) {
10346 vty_out(vty
, " End-of-RIB send: ");
10347 FOREACH_AFI_SAFI (afi
, safi
) {
10348 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
10349 PEER_STATUS_EOR_SEND
)) {
10350 vty_out(vty
, "%s%s",
10351 eor_send_af_count
? ", "
10353 afi_safi_print(afi
,
10355 eor_send_af_count
++;
10358 vty_out(vty
, "\n");
10359 vty_out(vty
, " End-of-RIB received: ");
10360 FOREACH_AFI_SAFI (afi
, safi
) {
10362 p
->af_sflags
[afi
][safi
],
10363 PEER_STATUS_EOR_RECEIVED
)) {
10364 vty_out(vty
, "%s%s",
10365 eor_receive_af_count
10368 afi_safi_print(afi
,
10370 eor_receive_af_count
++;
10373 vty_out(vty
, "\n");
10376 if (p
->t_gr_restart
)
10378 " The remaining time of restart timer is %ld\n",
10379 thread_timer_remain_second(
10384 " The remaining time of stalepath timer is %ld\n",
10385 thread_timer_remain_second(
10390 json_object
*json_stat
= NULL
;
10391 json_stat
= json_object_new_object();
10392 /* Packet counts. */
10393 json_object_int_add(json_stat
, "depthInq", 0);
10394 json_object_int_add(json_stat
, "depthOutq",
10395 (unsigned long)p
->obuf
->count
);
10396 json_object_int_add(json_stat
, "opensSent",
10397 atomic_load_explicit(&p
->open_out
,
10398 memory_order_relaxed
));
10399 json_object_int_add(json_stat
, "opensRecv",
10400 atomic_load_explicit(&p
->open_in
,
10401 memory_order_relaxed
));
10402 json_object_int_add(json_stat
, "notificationsSent",
10403 atomic_load_explicit(&p
->notify_out
,
10404 memory_order_relaxed
));
10405 json_object_int_add(json_stat
, "notificationsRecv",
10406 atomic_load_explicit(&p
->notify_in
,
10407 memory_order_relaxed
));
10408 json_object_int_add(json_stat
, "updatesSent",
10409 atomic_load_explicit(&p
->update_out
,
10410 memory_order_relaxed
));
10411 json_object_int_add(json_stat
, "updatesRecv",
10412 atomic_load_explicit(&p
->update_in
,
10413 memory_order_relaxed
));
10414 json_object_int_add(json_stat
, "keepalivesSent",
10415 atomic_load_explicit(&p
->keepalive_out
,
10416 memory_order_relaxed
));
10417 json_object_int_add(json_stat
, "keepalivesRecv",
10418 atomic_load_explicit(&p
->keepalive_in
,
10419 memory_order_relaxed
));
10420 json_object_int_add(json_stat
, "routeRefreshSent",
10421 atomic_load_explicit(&p
->refresh_out
,
10422 memory_order_relaxed
));
10423 json_object_int_add(json_stat
, "routeRefreshRecv",
10424 atomic_load_explicit(&p
->refresh_in
,
10425 memory_order_relaxed
));
10426 json_object_int_add(json_stat
, "capabilitySent",
10427 atomic_load_explicit(&p
->dynamic_cap_out
,
10428 memory_order_relaxed
));
10429 json_object_int_add(json_stat
, "capabilityRecv",
10430 atomic_load_explicit(&p
->dynamic_cap_in
,
10431 memory_order_relaxed
));
10432 json_object_int_add(json_stat
, "totalSent", PEER_TOTAL_TX(p
));
10433 json_object_int_add(json_stat
, "totalRecv", PEER_TOTAL_RX(p
));
10434 json_object_object_add(json_neigh
, "messageStats", json_stat
);
10436 /* Packet counts. */
10437 vty_out(vty
, " Message statistics:\n");
10438 vty_out(vty
, " Inq depth is 0\n");
10439 vty_out(vty
, " Outq depth is %lu\n",
10440 (unsigned long)p
->obuf
->count
);
10441 vty_out(vty
, " Sent Rcvd\n");
10442 vty_out(vty
, " Opens: %10d %10d\n",
10443 atomic_load_explicit(&p
->open_out
,
10444 memory_order_relaxed
),
10445 atomic_load_explicit(&p
->open_in
,
10446 memory_order_relaxed
));
10447 vty_out(vty
, " Notifications: %10d %10d\n",
10448 atomic_load_explicit(&p
->notify_out
,
10449 memory_order_relaxed
),
10450 atomic_load_explicit(&p
->notify_in
,
10451 memory_order_relaxed
));
10452 vty_out(vty
, " Updates: %10d %10d\n",
10453 atomic_load_explicit(&p
->update_out
,
10454 memory_order_relaxed
),
10455 atomic_load_explicit(&p
->update_in
,
10456 memory_order_relaxed
));
10457 vty_out(vty
, " Keepalives: %10d %10d\n",
10458 atomic_load_explicit(&p
->keepalive_out
,
10459 memory_order_relaxed
),
10460 atomic_load_explicit(&p
->keepalive_in
,
10461 memory_order_relaxed
));
10462 vty_out(vty
, " Route Refresh: %10d %10d\n",
10463 atomic_load_explicit(&p
->refresh_out
,
10464 memory_order_relaxed
),
10465 atomic_load_explicit(&p
->refresh_in
,
10466 memory_order_relaxed
));
10467 vty_out(vty
, " Capability: %10d %10d\n",
10468 atomic_load_explicit(&p
->dynamic_cap_out
,
10469 memory_order_relaxed
),
10470 atomic_load_explicit(&p
->dynamic_cap_in
,
10471 memory_order_relaxed
));
10472 vty_out(vty
, " Total: %10d %10d\n", PEER_TOTAL_TX(p
),
10477 /* advertisement-interval */
10478 json_object_int_add(json_neigh
,
10479 "minBtwnAdvertisementRunsTimerMsecs",
10480 p
->v_routeadv
* 1000);
10482 /* Update-source. */
10483 if (p
->update_if
|| p
->update_source
) {
10485 json_object_string_add(json_neigh
,
10488 else if (p
->update_source
)
10489 json_object_string_add(
10490 json_neigh
, "updateSource",
10491 sockunion2str(p
->update_source
, buf1
,
10495 /* advertisement-interval */
10497 " Minimum time between advertisement runs is %d seconds\n",
10500 /* Update-source. */
10501 if (p
->update_if
|| p
->update_source
) {
10502 vty_out(vty
, " Update source is ");
10504 vty_out(vty
, "%s", p
->update_if
);
10505 else if (p
->update_source
)
10507 sockunion2str(p
->update_source
, buf1
,
10509 vty_out(vty
, "\n");
10512 vty_out(vty
, "\n");
10515 /* Address Family Information */
10516 json_object
*json_hold
= NULL
;
10519 json_hold
= json_object_new_object();
10521 FOREACH_AFI_SAFI (afi
, safi
)
10522 if (p
->afc
[afi
][safi
])
10523 bgp_show_peer_afi(vty
, p
, afi
, safi
, use_json
,
10527 json_object_object_add(json_neigh
, "addressFamilyInfo",
10529 json_object_int_add(json_neigh
, "connectionsEstablished",
10531 json_object_int_add(json_neigh
, "connectionsDropped",
10534 vty_out(vty
, " Connections established %d; dropped %d\n",
10535 p
->established
, p
->dropped
);
10537 if (!p
->last_reset
) {
10539 json_object_string_add(json_neigh
, "lastReset",
10542 vty_out(vty
, " Last reset never\n");
10548 uptime
= bgp_clock();
10549 uptime
-= p
->resettime
;
10550 tm
= gmtime(&uptime
);
10551 json_object_int_add(json_neigh
, "lastResetTimerMsecs",
10552 (tm
->tm_sec
* 1000)
10553 + (tm
->tm_min
* 60000)
10554 + (tm
->tm_hour
* 3600000));
10555 json_object_string_add(
10556 json_neigh
, "lastResetDueTo",
10557 peer_down_str
[(int)p
->last_reset
]);
10558 if (p
->last_reset
== PEER_DOWN_NOTIFY_SEND
10559 || p
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
) {
10560 char errorcodesubcode_hexstr
[5];
10561 char errorcodesubcode_str
[256];
10563 code_str
= bgp_notify_code_str(p
->notify
.code
);
10564 subcode_str
= bgp_notify_subcode_str(
10565 p
->notify
.code
, p
->notify
.subcode
);
10567 sprintf(errorcodesubcode_hexstr
, "%02X%02X",
10568 p
->notify
.code
, p
->notify
.subcode
);
10569 json_object_string_add(json_neigh
,
10570 "lastErrorCodeSubcode",
10571 errorcodesubcode_hexstr
);
10572 snprintf(errorcodesubcode_str
, 255, "%s%s",
10573 code_str
, subcode_str
);
10574 json_object_string_add(json_neigh
,
10575 "lastNotificationReason",
10576 errorcodesubcode_str
);
10577 if (p
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
10578 && p
->notify
.code
== BGP_NOTIFY_CEASE
10579 && (p
->notify
.subcode
10580 == BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
10581 || p
->notify
.subcode
10582 == BGP_NOTIFY_CEASE_ADMIN_RESET
)
10583 && p
->notify
.length
) {
10585 const char *msg_str
;
10587 msg_str
= bgp_notify_admin_message(
10588 msgbuf
, sizeof(msgbuf
),
10589 (uint8_t *)p
->notify
.data
,
10592 json_object_string_add(
10594 "lastShutdownDescription",
10599 vty_out(vty
, " Last reset %s, ",
10600 peer_uptime(p
->resettime
, timebuf
,
10601 BGP_UPTIME_LEN
, 0, NULL
));
10603 if (p
->last_reset
== PEER_DOWN_NOTIFY_SEND
10604 || p
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
) {
10605 code_str
= bgp_notify_code_str(p
->notify
.code
);
10606 subcode_str
= bgp_notify_subcode_str(
10607 p
->notify
.code
, p
->notify
.subcode
);
10608 vty_out(vty
, "due to NOTIFICATION %s (%s%s)\n",
10609 p
->last_reset
== PEER_DOWN_NOTIFY_SEND
10612 code_str
, subcode_str
);
10613 if (p
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
10614 && p
->notify
.code
== BGP_NOTIFY_CEASE
10615 && (p
->notify
.subcode
10616 == BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
10617 || p
->notify
.subcode
10618 == BGP_NOTIFY_CEASE_ADMIN_RESET
)
10619 && p
->notify
.length
) {
10621 const char *msg_str
;
10623 msg_str
= bgp_notify_admin_message(
10624 msgbuf
, sizeof(msgbuf
),
10625 (uint8_t *)p
->notify
.data
,
10629 " Message: \"%s\"\n",
10633 vty_out(vty
, "due to %s\n",
10634 peer_down_str
[(int)p
->last_reset
]);
10637 if (p
->last_reset_cause_size
) {
10638 msg
= p
->last_reset_cause
;
10640 " Message received that caused BGP to send a NOTIFICATION:\n ");
10641 for (i
= 1; i
<= p
->last_reset_cause_size
;
10643 vty_out(vty
, "%02X", *msg
++);
10645 if (i
!= p
->last_reset_cause_size
) {
10647 vty_out(vty
, "\n ");
10648 } else if (i
% 4 == 0) {
10653 vty_out(vty
, "\n");
10658 if (CHECK_FLAG(p
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
)) {
10660 json_object_boolean_true_add(json_neigh
,
10661 "prefixesConfigExceedMax");
10664 " Peer had exceeded the max. no. of prefixes configured.\n");
10666 if (p
->t_pmax_restart
) {
10668 json_object_boolean_true_add(
10669 json_neigh
, "reducePrefixNumFrom");
10670 json_object_int_add(json_neigh
,
10671 "restartInTimerMsec",
10672 thread_timer_remain_second(
10677 " Reduce the no. of prefix from %s, will restart in %ld seconds\n",
10678 p
->host
, thread_timer_remain_second(
10679 p
->t_pmax_restart
));
10682 json_object_boolean_true_add(
10684 "reducePrefixNumAndClearIpBgp");
10687 " Reduce the no. of prefix and clear ip bgp %s to restore peering\n",
10692 /* EBGP Multihop and GTSM */
10693 if (p
->sort
!= BGP_PEER_IBGP
) {
10695 if (p
->gtsm_hops
> 0)
10696 json_object_int_add(json_neigh
,
10697 "externalBgpNbrMaxHopsAway",
10699 else if (p
->ttl
> 1)
10700 json_object_int_add(json_neigh
,
10701 "externalBgpNbrMaxHopsAway",
10704 if (p
->gtsm_hops
> 0)
10706 " External BGP neighbor may be up to %d hops away.\n",
10708 else if (p
->ttl
> 1)
10710 " External BGP neighbor may be up to %d hops away.\n",
10714 if (p
->gtsm_hops
> 0) {
10716 json_object_int_add(json_neigh
,
10717 "internalBgpNbrMaxHopsAway",
10721 " Internal BGP neighbor may be up to %d hops away.\n",
10726 /* Local address. */
10729 json_object_string_add(json_neigh
, "hostLocal",
10730 sockunion2str(p
->su_local
, buf1
,
10732 json_object_int_add(json_neigh
, "portLocal",
10733 ntohs(p
->su_local
->sin
.sin_port
));
10735 vty_out(vty
, "Local host: %s, Local port: %d\n",
10736 sockunion2str(p
->su_local
, buf1
, SU_ADDRSTRLEN
),
10737 ntohs(p
->su_local
->sin
.sin_port
));
10740 /* Remote address. */
10741 if (p
->su_remote
) {
10743 json_object_string_add(json_neigh
, "hostForeign",
10744 sockunion2str(p
->su_remote
, buf1
,
10746 json_object_int_add(json_neigh
, "portForeign",
10747 ntohs(p
->su_remote
->sin
.sin_port
));
10749 vty_out(vty
, "Foreign host: %s, Foreign port: %d\n",
10750 sockunion2str(p
->su_remote
, buf1
,
10752 ntohs(p
->su_remote
->sin
.sin_port
));
10755 /* Nexthop display. */
10758 json_object_string_add(json_neigh
, "nexthop",
10760 &p
->nexthop
.v4
, buf1
,
10762 json_object_string_add(json_neigh
, "nexthopGlobal",
10763 inet_ntop(AF_INET6
,
10764 &p
->nexthop
.v6_global
,
10765 buf1
, sizeof(buf1
)));
10766 json_object_string_add(json_neigh
, "nexthopLocal",
10767 inet_ntop(AF_INET6
,
10768 &p
->nexthop
.v6_local
,
10769 buf1
, sizeof(buf1
)));
10770 if (p
->shared_network
)
10771 json_object_string_add(json_neigh
,
10775 json_object_string_add(json_neigh
,
10777 "nonSharedNetwork");
10779 vty_out(vty
, "Nexthop: %s\n",
10780 inet_ntop(AF_INET
, &p
->nexthop
.v4
, buf1
,
10782 vty_out(vty
, "Nexthop global: %s\n",
10783 inet_ntop(AF_INET6
, &p
->nexthop
.v6_global
, buf1
,
10785 vty_out(vty
, "Nexthop local: %s\n",
10786 inet_ntop(AF_INET6
, &p
->nexthop
.v6_local
, buf1
,
10788 vty_out(vty
, "BGP connection: %s\n",
10789 p
->shared_network
? "shared network"
10790 : "non shared network");
10794 /* Timer information. */
10796 json_object_int_add(json_neigh
, "connectRetryTimer",
10798 if (p
->status
== Established
&& p
->rtt
)
10799 json_object_int_add(json_neigh
, "estimatedRttInMsecs",
10802 json_object_int_add(
10803 json_neigh
, "nextStartTimerDueInMsecs",
10804 thread_timer_remain_second(p
->t_start
) * 1000);
10806 json_object_int_add(
10807 json_neigh
, "nextConnectTimerDueInMsecs",
10808 thread_timer_remain_second(p
->t_connect
)
10810 if (p
->t_routeadv
) {
10811 json_object_int_add(json_neigh
, "mraiInterval",
10813 json_object_int_add(
10814 json_neigh
, "mraiTimerExpireInMsecs",
10815 thread_timer_remain_second(p
->t_routeadv
)
10819 json_object_int_add(json_neigh
, "authenticationEnabled",
10823 json_object_string_add(json_neigh
, "readThread", "on");
10825 json_object_string_add(json_neigh
, "readThread", "off");
10827 if (CHECK_FLAG(p
->thread_flags
, PEER_THREAD_WRITES_ON
))
10828 json_object_string_add(json_neigh
, "writeThread", "on");
10830 json_object_string_add(json_neigh
, "writeThread",
10833 vty_out(vty
, "BGP Connect Retry Timer in Seconds: %d\n",
10835 if (p
->status
== Established
&& p
->rtt
)
10836 vty_out(vty
, "Estimated round trip time: %d ms\n",
10839 vty_out(vty
, "Next start timer due in %ld seconds\n",
10840 thread_timer_remain_second(p
->t_start
));
10842 vty_out(vty
, "Next connect timer due in %ld seconds\n",
10843 thread_timer_remain_second(p
->t_connect
));
10846 "MRAI (interval %u) timer expires in %ld seconds\n",
10848 thread_timer_remain_second(p
->t_routeadv
));
10850 vty_out(vty
, "Peer Authentication Enabled\n");
10852 vty_out(vty
, "Read thread: %s Write thread: %s FD used: %d\n",
10853 p
->t_read
? "on" : "off",
10854 CHECK_FLAG(p
->thread_flags
, PEER_THREAD_WRITES_ON
)
10859 if (p
->notify
.code
== BGP_NOTIFY_OPEN_ERR
10860 && p
->notify
.subcode
== BGP_NOTIFY_OPEN_UNSUP_CAPBL
)
10861 bgp_capability_vty_out(vty
, p
, use_json
, json_neigh
);
10864 vty_out(vty
, "\n");
10866 /* BFD information. */
10867 bgp_bfd_show_info(vty
, p
, use_json
, json_neigh
);
10870 if (p
->conf_if
) /* Configured interface name. */
10871 json_object_object_add(json
, p
->conf_if
, json_neigh
);
10872 else /* Configured IP address. */
10873 json_object_object_add(json
, p
->host
, json_neigh
);
10877 static int bgp_show_neighbor(struct vty
*vty
, struct bgp
*bgp
,
10878 enum show_type type
, union sockunion
*su
,
10879 const char *conf_if
, bool use_json
,
10882 struct listnode
*node
, *nnode
;
10885 bool nbr_output
= false;
10886 afi_t afi
= AFI_MAX
;
10887 safi_t safi
= SAFI_MAX
;
10889 if (type
== show_ipv4_peer
|| type
== show_ipv4_all
) {
10891 } else if (type
== show_ipv6_peer
|| type
== show_ipv6_all
) {
10895 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
10896 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
10901 bgp_show_peer(vty
, peer
, use_json
, json
);
10907 && !strcmp(peer
->conf_if
, conf_if
))
10909 && !strcmp(peer
->hostname
, conf_if
))) {
10911 bgp_show_peer(vty
, peer
, use_json
,
10915 if (sockunion_same(&peer
->su
, su
)) {
10917 bgp_show_peer(vty
, peer
, use_json
,
10922 case show_ipv4_peer
:
10923 case show_ipv6_peer
:
10924 FOREACH_SAFI (safi
) {
10925 if (peer
->afc
[afi
][safi
]) {
10928 && !strcmp(peer
->conf_if
, conf_if
))
10930 && !strcmp(peer
->hostname
, conf_if
))) {
10932 bgp_show_peer(vty
, peer
, use_json
,
10937 if (sockunion_same(&peer
->su
, su
)) {
10939 bgp_show_peer(vty
, peer
, use_json
,
10947 case show_ipv4_all
:
10948 case show_ipv6_all
:
10949 FOREACH_SAFI (safi
) {
10950 if (peer
->afc
[afi
][safi
]) {
10951 bgp_show_peer(vty
, peer
, use_json
, json
);
10960 if ((type
== show_peer
|| type
== show_ipv4_peer
||
10961 type
== show_ipv6_peer
) && !find
) {
10963 json_object_boolean_true_add(json
, "bgpNoSuchNeighbor");
10965 vty_out(vty
, "%% No such neighbor in this view/vrf\n");
10968 if (type
!= show_peer
&& type
!= show_ipv4_peer
&&
10969 type
!= show_ipv6_peer
&& !nbr_output
&& !use_json
)
10970 vty_out(vty
, "%% No BGP neighbors found\n");
10973 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
10974 json
, JSON_C_TO_STRING_PRETTY
));
10976 vty_out(vty
, "\n");
10979 return CMD_SUCCESS
;
10982 static void bgp_show_all_instances_neighbors_vty(struct vty
*vty
,
10983 enum show_type type
,
10984 const char *ip_str
,
10987 struct listnode
*node
, *nnode
;
10989 union sockunion su
;
10990 json_object
*json
= NULL
;
10991 int ret
, is_first
= 1;
10992 bool nbr_output
= false;
10995 vty_out(vty
, "{\n");
10997 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
11000 if (!(json
= json_object_new_object())) {
11002 EC_BGP_JSON_MEM_ERROR
,
11003 "Unable to allocate memory for JSON object");
11005 "{\"error\": {\"message:\": \"Unable to allocate memory for JSON object\"}}}\n");
11009 json_object_int_add(json
, "vrfId",
11010 (bgp
->vrf_id
== VRF_UNKNOWN
)
11012 : (int64_t)bgp
->vrf_id
);
11013 json_object_string_add(
11015 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
11020 vty_out(vty
, ",\n");
11024 vty_out(vty
, "\"%s\":",
11025 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
11029 vty_out(vty
, "\nInstance %s:\n",
11030 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
11035 if (type
== show_peer
|| type
== show_ipv4_peer
||
11036 type
== show_ipv6_peer
) {
11037 ret
= str2sockunion(ip_str
, &su
);
11039 bgp_show_neighbor(vty
, bgp
, type
, NULL
, ip_str
,
11042 bgp_show_neighbor(vty
, bgp
, type
, &su
, NULL
,
11045 bgp_show_neighbor(vty
, bgp
, type
, NULL
, NULL
,
11048 json_object_free(json
);
11052 vty_out(vty
, "}\n");
11053 json_object_free(json
);
11055 else if (!nbr_output
)
11056 vty_out(vty
, "%% BGP instance not found\n");
11059 static int bgp_show_neighbor_vty(struct vty
*vty
, const char *name
,
11060 enum show_type type
, const char *ip_str
,
11065 union sockunion su
;
11066 json_object
*json
= NULL
;
11069 if (strmatch(name
, "all")) {
11070 bgp_show_all_instances_neighbors_vty(vty
, type
, ip_str
,
11072 return CMD_SUCCESS
;
11074 bgp
= bgp_lookup_by_name(name
);
11077 json
= json_object_new_object();
11078 vty_out(vty
, "%s\n",
11079 json_object_to_json_string_ext(
11081 JSON_C_TO_STRING_PRETTY
));
11082 json_object_free(json
);
11085 "%% BGP instance not found\n");
11087 return CMD_WARNING
;
11091 bgp
= bgp_get_default();
11095 json
= json_object_new_object();
11097 ret
= str2sockunion(ip_str
, &su
);
11099 bgp_show_neighbor(vty
, bgp
, type
, NULL
, ip_str
,
11102 bgp_show_neighbor(vty
, bgp
, type
, &su
, NULL
,
11105 bgp_show_neighbor(vty
, bgp
, type
, NULL
, NULL
, use_json
,
11108 json_object_free(json
);
11111 vty_out(vty
, "{}\n");
11113 vty_out(vty
, "%% BGP instance not found\n");
11116 return CMD_SUCCESS
;
11119 /* "show [ip] bgp neighbors" commands. */
11120 DEFUN (show_ip_bgp_neighbors
,
11121 show_ip_bgp_neighbors_cmd
,
11122 "show [ip] bgp [<view|vrf> VIEWVRFNAME] [<ipv4|ipv6>] neighbors [<A.B.C.D|X:X::X:X|WORD>] [json]",
11126 BGP_INSTANCE_HELP_STR
11129 "Detailed information on TCP and BGP neighbor connections\n"
11130 "Neighbor to display information about\n"
11131 "Neighbor to display information about\n"
11132 "Neighbor on BGP configured interface\n"
11136 char *sh_arg
= NULL
;
11137 enum show_type sh_type
;
11138 afi_t afi
= AFI_MAX
;
11140 bool uj
= use_json(argc
, argv
);
11144 /* [<vrf> VIEWVRFNAME] */
11145 if (argv_find(argv
, argc
, "vrf", &idx
)) {
11146 vrf
= argv
[idx
+ 1]->arg
;
11147 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
11149 } else if (argv_find(argv
, argc
, "view", &idx
))
11150 /* [<view> VIEWVRFNAME] */
11151 vrf
= argv
[idx
+ 1]->arg
;
11155 if (argv_find(argv
, argc
, "ipv4", &idx
)) {
11156 sh_type
= show_ipv4_all
;
11158 } else if (argv_find(argv
, argc
, "ipv6", &idx
)) {
11159 sh_type
= show_ipv6_all
;
11162 sh_type
= show_all
;
11165 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)
11166 || argv_find(argv
, argc
, "X:X::X:X", &idx
)
11167 || argv_find(argv
, argc
, "WORD", &idx
)) {
11168 sh_type
= show_peer
;
11169 sh_arg
= argv
[idx
]->arg
;
11172 if (sh_type
== show_peer
&& afi
== AFI_IP
) {
11173 sh_type
= show_ipv4_peer
;
11174 } else if (sh_type
== show_peer
&& afi
== AFI_IP6
) {
11175 sh_type
= show_ipv6_peer
;
11178 return bgp_show_neighbor_vty(vty
, vrf
, sh_type
, sh_arg
, uj
);
11181 /* Show BGP's AS paths internal data. There are both `show [ip] bgp
11182 paths' and `show ip mbgp paths'. Those functions results are the
11184 DEFUN (show_ip_bgp_paths
,
11185 show_ip_bgp_paths_cmd
,
11186 "show [ip] bgp ["BGP_SAFI_CMD_STR
"] paths",
11191 "Path information\n")
11193 vty_out(vty
, "Address Refcnt Path\n");
11194 aspath_print_all_vty(vty
);
11195 return CMD_SUCCESS
;
11200 static void community_show_all_iterator(struct hash_bucket
*bucket
,
11203 struct community
*com
;
11205 com
= (struct community
*)bucket
->data
;
11206 vty_out(vty
, "[%p] (%ld) %s\n", (void *)com
, com
->refcnt
,
11207 community_str(com
, false));
11210 /* Show BGP's community internal data. */
11211 DEFUN (show_ip_bgp_community_info
,
11212 show_ip_bgp_community_info_cmd
,
11213 "show [ip] bgp community-info",
11217 "List all bgp community information\n")
11219 vty_out(vty
, "Address Refcnt Community\n");
11221 hash_iterate(community_hash(),
11222 (void (*)(struct hash_bucket
*,
11223 void *))community_show_all_iterator
,
11226 return CMD_SUCCESS
;
11229 static void lcommunity_show_all_iterator(struct hash_bucket
*bucket
,
11232 struct lcommunity
*lcom
;
11234 lcom
= (struct lcommunity
*)bucket
->data
;
11235 vty_out(vty
, "[%p] (%ld) %s\n", (void *)lcom
, lcom
->refcnt
,
11236 lcommunity_str(lcom
, false));
11239 /* Show BGP's community internal data. */
11240 DEFUN (show_ip_bgp_lcommunity_info
,
11241 show_ip_bgp_lcommunity_info_cmd
,
11242 "show ip bgp large-community-info",
11246 "List all bgp large-community information\n")
11248 vty_out(vty
, "Address Refcnt Large-community\n");
11250 hash_iterate(lcommunity_hash(),
11251 (void (*)(struct hash_bucket
*,
11252 void *))lcommunity_show_all_iterator
,
11255 return CMD_SUCCESS
;
11259 DEFUN (show_ip_bgp_attr_info
,
11260 show_ip_bgp_attr_info_cmd
,
11261 "show [ip] bgp attribute-info",
11265 "List all bgp attribute information\n")
11267 attr_show_all(vty
);
11268 return CMD_SUCCESS
;
11271 static int bgp_show_route_leak_vty(struct vty
*vty
, const char *name
,
11272 afi_t afi
, safi_t safi
,
11273 bool use_json
, json_object
*json
)
11276 struct listnode
*node
;
11278 char buf1
[INET6_ADDRSTRLEN
];
11280 vpn_policy_direction_t dir
;
11283 json_object
*json_import_vrfs
= NULL
;
11284 json_object
*json_export_vrfs
= NULL
;
11286 bgp
= name
? bgp_lookup_by_name(name
) : bgp_get_default();
11289 vty_out(vty
, "%s\n",
11290 json_object_to_json_string_ext(
11292 JSON_C_TO_STRING_PRETTY
));
11293 json_object_free(json
);
11295 return CMD_WARNING
;
11298 /* Provide context for the block */
11299 json_object_string_add(json
, "vrf", name
? name
: "default");
11300 json_object_string_add(json
, "afiSafi",
11301 afi_safi_print(afi
, safi
));
11303 if (!CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
11304 BGP_CONFIG_VRF_TO_VRF_IMPORT
)) {
11305 json_object_string_add(json
, "importFromVrfs", "none");
11306 json_object_string_add(json
, "importRts", "none");
11308 json_import_vrfs
= json_object_new_array();
11310 for (ALL_LIST_ELEMENTS_RO(
11311 bgp
->vpn_policy
[afi
].import_vrf
,
11313 json_object_array_add(json_import_vrfs
,
11314 json_object_new_string(vname
));
11316 dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
11317 ecom_str
= ecommunity_ecom2str(
11318 bgp
->vpn_policy
[afi
].rtlist
[dir
],
11319 ECOMMUNITY_FORMAT_ROUTE_MAP
, 0);
11320 json_object_object_add(json
, "importFromVrfs",
11322 json_object_string_add(json
, "importRts", ecom_str
);
11324 XFREE(MTYPE_ECOMMUNITY_STR
, ecom_str
);
11327 if (!CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
11328 BGP_CONFIG_VRF_TO_VRF_EXPORT
)) {
11329 json_object_string_add(json
, "exportToVrfs", "none");
11330 json_object_string_add(json
, "routeDistinguisher",
11332 json_object_string_add(json
, "exportRts", "none");
11334 json_export_vrfs
= json_object_new_array();
11336 for (ALL_LIST_ELEMENTS_RO(
11337 bgp
->vpn_policy
[afi
].export_vrf
,
11339 json_object_array_add(json_export_vrfs
,
11340 json_object_new_string(vname
));
11341 json_object_object_add(json
, "exportToVrfs",
11343 json_object_string_add(json
, "routeDistinguisher",
11344 prefix_rd2str(&bgp
->vpn_policy
[afi
].tovpn_rd
,
11345 buf1
, RD_ADDRSTRLEN
));
11347 dir
= BGP_VPN_POLICY_DIR_TOVPN
;
11348 ecom_str
= ecommunity_ecom2str(
11349 bgp
->vpn_policy
[afi
].rtlist
[dir
],
11350 ECOMMUNITY_FORMAT_ROUTE_MAP
, 0);
11351 json_object_string_add(json
, "exportRts", ecom_str
);
11353 XFREE(MTYPE_ECOMMUNITY_STR
, ecom_str
);
11357 vty_out(vty
, "%s\n",
11358 json_object_to_json_string_ext(json
,
11359 JSON_C_TO_STRING_PRETTY
));
11360 json_object_free(json
);
11363 bgp
= name
? bgp_lookup_by_name(name
) : bgp_get_default();
11366 vty_out(vty
, "%% No such BGP instance exist\n");
11367 return CMD_WARNING
;
11370 if (!CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
11371 BGP_CONFIG_VRF_TO_VRF_IMPORT
))
11373 "This VRF is not importing %s routes from any other VRF\n",
11374 afi_safi_print(afi
, safi
));
11377 "This VRF is importing %s routes from the following VRFs:\n",
11378 afi_safi_print(afi
, safi
));
11380 for (ALL_LIST_ELEMENTS_RO(
11381 bgp
->vpn_policy
[afi
].import_vrf
,
11383 vty_out(vty
, " %s\n", vname
);
11385 dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
11386 ecom_str
= ecommunity_ecom2str(
11387 bgp
->vpn_policy
[afi
].rtlist
[dir
],
11388 ECOMMUNITY_FORMAT_ROUTE_MAP
, 0);
11389 vty_out(vty
, "Import RT(s): %s\n", ecom_str
);
11391 XFREE(MTYPE_ECOMMUNITY_STR
, ecom_str
);
11394 if (!CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
11395 BGP_CONFIG_VRF_TO_VRF_EXPORT
))
11397 "This VRF is not exporting %s routes to any other VRF\n",
11398 afi_safi_print(afi
, safi
));
11401 "This VRF is exporting %s routes to the following VRFs:\n",
11402 afi_safi_print(afi
, safi
));
11404 for (ALL_LIST_ELEMENTS_RO(
11405 bgp
->vpn_policy
[afi
].export_vrf
,
11407 vty_out(vty
, " %s\n", vname
);
11409 vty_out(vty
, "RD: %s\n",
11410 prefix_rd2str(&bgp
->vpn_policy
[afi
].tovpn_rd
,
11411 buf1
, RD_ADDRSTRLEN
));
11413 dir
= BGP_VPN_POLICY_DIR_TOVPN
;
11414 ecom_str
= ecommunity_ecom2str(
11415 bgp
->vpn_policy
[afi
].rtlist
[dir
],
11416 ECOMMUNITY_FORMAT_ROUTE_MAP
, 0);
11417 vty_out(vty
, "Export RT: %s\n", ecom_str
);
11418 XFREE(MTYPE_ECOMMUNITY_STR
, ecom_str
);
11422 return CMD_SUCCESS
;
11425 static int bgp_show_all_instance_route_leak_vty(struct vty
*vty
, afi_t afi
,
11426 safi_t safi
, bool use_json
)
11428 struct listnode
*node
, *nnode
;
11430 char *vrf_name
= NULL
;
11431 json_object
*json
= NULL
;
11432 json_object
*json_vrf
= NULL
;
11433 json_object
*json_vrfs
= NULL
;
11436 json
= json_object_new_object();
11437 json_vrfs
= json_object_new_object();
11440 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
11442 if (bgp
->inst_type
!= BGP_INSTANCE_TYPE_DEFAULT
)
11443 vrf_name
= bgp
->name
;
11446 json_vrf
= json_object_new_object();
11448 vty_out(vty
, "\nInstance %s:\n",
11449 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
11450 ? VRF_DEFAULT_NAME
: bgp
->name
);
11452 bgp_show_route_leak_vty(vty
, vrf_name
, afi
, safi
, 0, json_vrf
);
11454 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
11455 json_object_object_add(json_vrfs
,
11456 VRF_DEFAULT_NAME
, json_vrf
);
11458 json_object_object_add(json_vrfs
, vrf_name
,
11464 json_object_object_add(json
, "vrfs", json_vrfs
);
11465 vty_out(vty
, "%s\n", json_object_to_json_string_ext(json
,
11466 JSON_C_TO_STRING_PRETTY
));
11467 json_object_free(json
);
11470 return CMD_SUCCESS
;
11473 /* "show [ip] bgp route-leak" command. */
11474 DEFUN (show_ip_bgp_route_leak
,
11475 show_ip_bgp_route_leak_cmd
,
11476 "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR
" ["BGP_SAFI_CMD_STR
"]] route-leak [json]",
11480 BGP_INSTANCE_HELP_STR
11483 "Route leaking information\n"
11487 afi_t afi
= AFI_MAX
;
11488 safi_t safi
= SAFI_MAX
;
11490 bool uj
= use_json(argc
, argv
);
11492 json_object
*json
= NULL
;
11494 /* show [ip] bgp */
11495 if (argv_find(argv
, argc
, "ip", &idx
)) {
11497 safi
= SAFI_UNICAST
;
11499 /* [vrf VIEWVRFNAME] */
11500 if (argv_find(argv
, argc
, "view", &idx
)) {
11502 "%% This command is not applicable to BGP views\n");
11503 return CMD_WARNING
;
11506 if (argv_find(argv
, argc
, "vrf", &idx
)) {
11507 vrf
= argv
[idx
+ 1]->arg
;
11508 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
11511 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
11512 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
)) {
11513 argv_find_and_parse_safi(argv
, argc
, &idx
, &safi
);
11516 if (!((afi
== AFI_IP
|| afi
== AFI_IP6
) && safi
== SAFI_UNICAST
)) {
11518 "%% This command is applicable only for unicast ipv4|ipv6\n");
11519 return CMD_WARNING
;
11522 if (vrf
&& strmatch(vrf
, "all"))
11523 return bgp_show_all_instance_route_leak_vty(vty
, afi
, safi
, uj
);
11526 json
= json_object_new_object();
11528 return bgp_show_route_leak_vty(vty
, vrf
, afi
, safi
, uj
, json
);
11531 static void bgp_show_all_instances_updgrps_vty(struct vty
*vty
, afi_t afi
,
11534 struct listnode
*node
, *nnode
;
11537 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
11538 vty_out(vty
, "\nInstance %s:\n",
11539 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
11542 update_group_show(bgp
, afi
, safi
, vty
, 0);
11546 static int bgp_show_update_groups(struct vty
*vty
, const char *name
, int afi
,
11547 int safi
, uint64_t subgrp_id
)
11552 if (strmatch(name
, "all")) {
11553 bgp_show_all_instances_updgrps_vty(vty
, afi
, safi
);
11554 return CMD_SUCCESS
;
11556 bgp
= bgp_lookup_by_name(name
);
11559 bgp
= bgp_get_default();
11563 update_group_show(bgp
, afi
, safi
, vty
, subgrp_id
);
11564 return CMD_SUCCESS
;
11567 DEFUN (show_ip_bgp_updgrps
,
11568 show_ip_bgp_updgrps_cmd
,
11569 "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR
" ["BGP_SAFI_WITH_LABEL_CMD_STR
"]] update-groups [SUBGROUP-ID]",
11573 BGP_INSTANCE_HELP_STR
11575 BGP_SAFI_WITH_LABEL_HELP_STR
11576 "Detailed info about dynamic update groups\n"
11577 "Specific subgroup to display detailed info for\n")
11580 afi_t afi
= AFI_IP6
;
11581 safi_t safi
= SAFI_UNICAST
;
11582 uint64_t subgrp_id
= 0;
11586 /* show [ip] bgp */
11587 if (argv_find(argv
, argc
, "ip", &idx
))
11589 /* [<vrf> VIEWVRFNAME] */
11590 if (argv_find(argv
, argc
, "vrf", &idx
)) {
11591 vrf
= argv
[idx
+ 1]->arg
;
11592 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
11594 } else if (argv_find(argv
, argc
, "view", &idx
))
11595 /* [<view> VIEWVRFNAME] */
11596 vrf
= argv
[idx
+ 1]->arg
;
11597 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
11598 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
)) {
11599 argv_find_and_parse_safi(argv
, argc
, &idx
, &safi
);
11602 /* get subgroup id, if provided */
11604 if (argv
[idx
]->type
== VARIABLE_TKN
)
11605 subgrp_id
= strtoull(argv
[idx
]->arg
, NULL
, 10);
11607 return (bgp_show_update_groups(vty
, vrf
, afi
, safi
, subgrp_id
));
11610 DEFUN (show_bgp_instance_all_ipv6_updgrps
,
11611 show_bgp_instance_all_ipv6_updgrps_cmd
,
11612 "show [ip] bgp <view|vrf> all update-groups",
11616 BGP_INSTANCE_ALL_HELP_STR
11617 "Detailed info about dynamic update groups\n")
11619 bgp_show_all_instances_updgrps_vty(vty
, AFI_IP6
, SAFI_UNICAST
);
11620 return CMD_SUCCESS
;
11623 DEFUN (show_bgp_l2vpn_evpn_updgrps
,
11624 show_bgp_l2vpn_evpn_updgrps_cmd
,
11625 "show [ip] bgp l2vpn evpn update-groups",
11629 "l2vpn address family\n"
11630 "evpn sub-address family\n"
11631 "Detailed info about dynamic update groups\n")
11634 uint64_t subgrp_id
= 0;
11636 bgp_show_update_groups(vty
, vrf
, AFI_L2VPN
, SAFI_EVPN
, subgrp_id
);
11637 return CMD_SUCCESS
;
11640 DEFUN (show_bgp_updgrps_stats
,
11641 show_bgp_updgrps_stats_cmd
,
11642 "show [ip] bgp update-groups statistics",
11646 "Detailed info about dynamic update groups\n"
11651 bgp
= bgp_get_default();
11653 update_group_show_stats(bgp
, vty
);
11655 return CMD_SUCCESS
;
11658 DEFUN (show_bgp_instance_updgrps_stats
,
11659 show_bgp_instance_updgrps_stats_cmd
,
11660 "show [ip] bgp <view|vrf> VIEWVRFNAME update-groups statistics",
11664 BGP_INSTANCE_HELP_STR
11665 "Detailed info about dynamic update groups\n"
11671 bgp
= bgp_lookup_by_name(argv
[idx_word
]->arg
);
11673 update_group_show_stats(bgp
, vty
);
11675 return CMD_SUCCESS
;
11678 static void show_bgp_updgrps_adj_info_aux(struct vty
*vty
, const char *name
,
11679 afi_t afi
, safi_t safi
,
11680 const char *what
, uint64_t subgrp_id
)
11685 bgp
= bgp_lookup_by_name(name
);
11687 bgp
= bgp_get_default();
11690 if (!strcmp(what
, "advertise-queue"))
11691 update_group_show_adj_queue(bgp
, afi
, safi
, vty
,
11693 else if (!strcmp(what
, "advertised-routes"))
11694 update_group_show_advertised(bgp
, afi
, safi
, vty
,
11696 else if (!strcmp(what
, "packet-queue"))
11697 update_group_show_packet_queue(bgp
, afi
, safi
, vty
,
11702 DEFPY(show_ip_bgp_instance_updgrps_adj_s
,
11703 show_ip_bgp_instance_updgrps_adj_s_cmd
,
11704 "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",
11705 SHOW_STR IP_STR BGP_STR BGP_INSTANCE_HELP_STR BGP_AFI_HELP_STR
11707 "Detailed info about dynamic update groups\n"
11708 "Specific subgroup to display info for\n"
11709 "Advertisement queue\n"
11710 "Announced routes\n"
11713 uint64_t subgrp_id
= 0;
11717 subgrp_id
= strtoull(sgid
, NULL
, 10);
11722 afiz
= bgp_vty_afi_from_str(afi
);
11726 afiz
= bgp_vty_afi_from_str(afi
);
11727 if (afiz
!= AFI_IP
)
11729 "%% Cannot specify both 'ip' and 'ipv6'\n");
11730 return CMD_WARNING
;
11733 safiz
= safi
? bgp_vty_safi_from_str(safi
) : SAFI_UNICAST
;
11735 show_bgp_updgrps_adj_info_aux(vty
, vrf
, afiz
, safiz
, rtq
, subgrp_id
);
11736 return CMD_SUCCESS
;
11739 static int bgp_show_one_peer_group(struct vty
*vty
, struct peer_group
*group
)
11741 struct listnode
*node
, *nnode
;
11742 struct prefix
*range
;
11745 char buf
[PREFIX2STR_BUFFER
];
11748 const char *peer_status
;
11749 const char *af_str
;
11754 conf
= group
->conf
;
11756 if (conf
->as_type
== AS_SPECIFIED
|| conf
->as_type
== AS_EXTERNAL
) {
11757 vty_out(vty
, "\nBGP peer-group %s, remote AS %" PRIu32
"\n",
11758 group
->name
, conf
->as
);
11759 } else if (conf
->as_type
== AS_INTERNAL
) {
11760 vty_out(vty
, "\nBGP peer-group %s, remote AS %" PRIu32
"\n",
11761 group
->name
, group
->bgp
->as
);
11763 vty_out(vty
, "\nBGP peer-group %s\n", group
->name
);
11766 if ((group
->bgp
->as
== conf
->as
) || (conf
->as_type
== AS_INTERNAL
))
11767 vty_out(vty
, " Peer-group type is internal\n");
11769 vty_out(vty
, " Peer-group type is external\n");
11771 /* Display AFs configured. */
11772 vty_out(vty
, " Configured address-families:");
11773 FOREACH_AFI_SAFI (afi
, safi
) {
11774 if (conf
->afc
[afi
][safi
]) {
11776 vty_out(vty
, " %s;", afi_safi_print(afi
, safi
));
11780 vty_out(vty
, " none\n");
11782 vty_out(vty
, "\n");
11784 /* Display listen ranges (for dynamic neighbors), if any */
11785 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++) {
11788 else if (afi
== AFI_IP6
)
11792 lr_count
= listcount(group
->listen_range
[afi
]);
11794 vty_out(vty
, " %d %s listen range(s)\n", lr_count
,
11798 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], node
,
11800 prefix2str(range
, buf
, sizeof(buf
));
11801 vty_out(vty
, " %s\n", buf
);
11806 /* Display group members and their status */
11807 if (listcount(group
->peer
)) {
11808 vty_out(vty
, " Peer-group members:\n");
11809 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
11810 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_SHUTDOWN
))
11811 peer_status
= "Idle (Admin)";
11812 else if (CHECK_FLAG(peer
->sflags
,
11813 PEER_STATUS_PREFIX_OVERFLOW
))
11814 peer_status
= "Idle (PfxCt)";
11816 peer_status
= lookup_msg(bgp_status_msg
,
11817 peer
->status
, NULL
);
11819 dynamic
= peer_dynamic_neighbor(peer
);
11820 vty_out(vty
, " %s %s %s \n", peer
->host
,
11821 dynamic
? "(dynamic)" : "", peer_status
);
11825 return CMD_SUCCESS
;
11828 static int bgp_show_peer_group_vty(struct vty
*vty
, const char *name
,
11829 const char *group_name
)
11832 struct listnode
*node
, *nnode
;
11833 struct peer_group
*group
;
11834 bool found
= false;
11836 bgp
= name
? bgp_lookup_by_name(name
) : bgp_get_default();
11839 vty_out(vty
, "%% BGP instance not found\n");
11840 return CMD_WARNING
;
11843 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
11845 if (strmatch(group
->name
, group_name
)) {
11846 bgp_show_one_peer_group(vty
, group
);
11851 bgp_show_one_peer_group(vty
, group
);
11855 if (group_name
&& !found
)
11856 vty_out(vty
, "%% No such peer-group\n");
11858 return CMD_SUCCESS
;
11861 DEFUN (show_ip_bgp_peer_groups
,
11862 show_ip_bgp_peer_groups_cmd
,
11863 "show [ip] bgp [<view|vrf> VIEWVRFNAME] peer-group [PGNAME]",
11867 BGP_INSTANCE_HELP_STR
11868 "Detailed information on BGP peer groups\n"
11869 "Peer group name\n")
11874 vrf
= argv_find(argv
, argc
, "VIEWVRFNAME", &idx
) ? argv
[idx
]->arg
11876 pg
= argv_find(argv
, argc
, "PGNAME", &idx
) ? argv
[idx
]->arg
: NULL
;
11878 return bgp_show_peer_group_vty(vty
, vrf
, pg
);
11882 /* Redistribute VTY commands. */
11884 DEFUN (bgp_redistribute_ipv4
,
11885 bgp_redistribute_ipv4_cmd
,
11886 "redistribute " FRR_IP_REDIST_STR_BGPD
,
11887 "Redistribute information from another routing protocol\n"
11888 FRR_IP_REDIST_HELP_STR_BGPD
)
11890 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11891 int idx_protocol
= 1;
11894 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
11896 vty_out(vty
, "%% Invalid route type\n");
11897 return CMD_WARNING_CONFIG_FAILED
;
11900 bgp_redist_add(bgp
, AFI_IP
, type
, 0);
11901 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0, false);
11905 bgp_redistribute_ipv4
, bgp_redistribute_ipv4_hidden_cmd
,
11906 "redistribute " FRR_IP_REDIST_STR_BGPD
,
11907 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
)
11909 DEFUN (bgp_redistribute_ipv4_rmap
,
11910 bgp_redistribute_ipv4_rmap_cmd
,
11911 "redistribute " FRR_IP_REDIST_STR_BGPD
" route-map WORD",
11912 "Redistribute information from another routing protocol\n"
11913 FRR_IP_REDIST_HELP_STR_BGPD
11914 "Route map reference\n"
11915 "Pointer to route-map entries\n")
11917 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11918 int idx_protocol
= 1;
11921 struct bgp_redist
*red
;
11923 struct route_map
*route_map
= route_map_lookup_warn_noexist(
11924 vty
, argv
[idx_word
]->arg
);
11926 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
11928 vty_out(vty
, "%% Invalid route type\n");
11929 return CMD_WARNING_CONFIG_FAILED
;
11932 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
11934 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
11935 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0, changed
);
11939 bgp_redistribute_ipv4_rmap
, bgp_redistribute_ipv4_rmap_hidden_cmd
,
11940 "redistribute " FRR_IP_REDIST_STR_BGPD
" route-map WORD",
11941 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
11942 "Route map reference\n"
11943 "Pointer to route-map entries\n")
11945 DEFUN (bgp_redistribute_ipv4_metric
,
11946 bgp_redistribute_ipv4_metric_cmd
,
11947 "redistribute " FRR_IP_REDIST_STR_BGPD
" metric (0-4294967295)",
11948 "Redistribute information from another routing protocol\n"
11949 FRR_IP_REDIST_HELP_STR_BGPD
11950 "Metric for redistributed routes\n"
11951 "Default metric\n")
11953 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11954 int idx_protocol
= 1;
11955 int idx_number
= 3;
11958 struct bgp_redist
*red
;
11961 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
11963 vty_out(vty
, "%% Invalid route type\n");
11964 return CMD_WARNING_CONFIG_FAILED
;
11966 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
11968 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
11969 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, type
, metric
);
11970 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0, changed
);
11974 bgp_redistribute_ipv4_metric
, bgp_redistribute_ipv4_metric_hidden_cmd
,
11975 "redistribute " FRR_IP_REDIST_STR_BGPD
" metric (0-4294967295)",
11976 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
11977 "Metric for redistributed routes\n"
11978 "Default metric\n")
11980 DEFUN (bgp_redistribute_ipv4_rmap_metric
,
11981 bgp_redistribute_ipv4_rmap_metric_cmd
,
11982 "redistribute " FRR_IP_REDIST_STR_BGPD
" route-map WORD metric (0-4294967295)",
11983 "Redistribute information from another routing protocol\n"
11984 FRR_IP_REDIST_HELP_STR_BGPD
11985 "Route map reference\n"
11986 "Pointer to route-map entries\n"
11987 "Metric for redistributed routes\n"
11988 "Default metric\n")
11990 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11991 int idx_protocol
= 1;
11993 int idx_number
= 5;
11996 struct bgp_redist
*red
;
11998 struct route_map
*route_map
=
11999 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12001 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
12003 vty_out(vty
, "%% Invalid route type\n");
12004 return CMD_WARNING_CONFIG_FAILED
;
12006 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12008 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
12010 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12011 changed
|= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, type
, metric
);
12012 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0, changed
);
12016 bgp_redistribute_ipv4_rmap_metric
,
12017 bgp_redistribute_ipv4_rmap_metric_hidden_cmd
,
12018 "redistribute " FRR_IP_REDIST_STR_BGPD
12019 " route-map WORD metric (0-4294967295)",
12020 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
12021 "Route map reference\n"
12022 "Pointer to route-map entries\n"
12023 "Metric for redistributed routes\n"
12024 "Default metric\n")
12026 DEFUN (bgp_redistribute_ipv4_metric_rmap
,
12027 bgp_redistribute_ipv4_metric_rmap_cmd
,
12028 "redistribute " FRR_IP_REDIST_STR_BGPD
" metric (0-4294967295) route-map WORD",
12029 "Redistribute information from another routing protocol\n"
12030 FRR_IP_REDIST_HELP_STR_BGPD
12031 "Metric for redistributed routes\n"
12033 "Route map reference\n"
12034 "Pointer to route-map entries\n")
12036 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12037 int idx_protocol
= 1;
12038 int idx_number
= 3;
12042 struct bgp_redist
*red
;
12044 struct route_map
*route_map
=
12045 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12047 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
12049 vty_out(vty
, "%% Invalid route type\n");
12050 return CMD_WARNING_CONFIG_FAILED
;
12052 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12054 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
12055 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, type
, metric
);
12057 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12058 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0, changed
);
12062 bgp_redistribute_ipv4_metric_rmap
,
12063 bgp_redistribute_ipv4_metric_rmap_hidden_cmd
,
12064 "redistribute " FRR_IP_REDIST_STR_BGPD
12065 " metric (0-4294967295) route-map WORD",
12066 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
12067 "Metric for redistributed routes\n"
12069 "Route map reference\n"
12070 "Pointer to route-map entries\n")
12072 DEFUN (bgp_redistribute_ipv4_ospf
,
12073 bgp_redistribute_ipv4_ospf_cmd
,
12074 "redistribute <ospf|table> (1-65535)",
12075 "Redistribute information from another routing protocol\n"
12076 "Open Shortest Path First (OSPFv2)\n"
12077 "Non-main Kernel Routing Table\n"
12078 "Instance ID/Table ID\n")
12080 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12081 int idx_ospf_table
= 1;
12082 int idx_number
= 2;
12083 unsigned short instance
;
12084 unsigned short protocol
;
12086 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12088 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
12089 protocol
= ZEBRA_ROUTE_OSPF
;
12091 protocol
= ZEBRA_ROUTE_TABLE
;
12093 bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
12094 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
, false);
12097 ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf
, bgp_redistribute_ipv4_ospf_hidden_cmd
,
12098 "redistribute <ospf|table> (1-65535)",
12099 "Redistribute information from another routing protocol\n"
12100 "Open Shortest Path First (OSPFv2)\n"
12101 "Non-main Kernel Routing Table\n"
12102 "Instance ID/Table ID\n")
12104 DEFUN (bgp_redistribute_ipv4_ospf_rmap
,
12105 bgp_redistribute_ipv4_ospf_rmap_cmd
,
12106 "redistribute <ospf|table> (1-65535) route-map WORD",
12107 "Redistribute information from another routing protocol\n"
12108 "Open Shortest Path First (OSPFv2)\n"
12109 "Non-main Kernel Routing Table\n"
12110 "Instance ID/Table ID\n"
12111 "Route map reference\n"
12112 "Pointer to route-map entries\n")
12114 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12115 int idx_ospf_table
= 1;
12116 int idx_number
= 2;
12118 struct bgp_redist
*red
;
12119 unsigned short instance
;
12122 struct route_map
*route_map
=
12123 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12125 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
12126 protocol
= ZEBRA_ROUTE_OSPF
;
12128 protocol
= ZEBRA_ROUTE_TABLE
;
12130 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12131 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
12133 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12134 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
, changed
);
12137 ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf_rmap
,
12138 bgp_redistribute_ipv4_ospf_rmap_hidden_cmd
,
12139 "redistribute <ospf|table> (1-65535) route-map WORD",
12140 "Redistribute information from another routing protocol\n"
12141 "Open Shortest Path First (OSPFv2)\n"
12142 "Non-main Kernel Routing Table\n"
12143 "Instance ID/Table ID\n"
12144 "Route map reference\n"
12145 "Pointer to route-map entries\n")
12147 DEFUN (bgp_redistribute_ipv4_ospf_metric
,
12148 bgp_redistribute_ipv4_ospf_metric_cmd
,
12149 "redistribute <ospf|table> (1-65535) metric (0-4294967295)",
12150 "Redistribute information from another routing protocol\n"
12151 "Open Shortest Path First (OSPFv2)\n"
12152 "Non-main Kernel Routing Table\n"
12153 "Instance ID/Table ID\n"
12154 "Metric for redistributed routes\n"
12155 "Default metric\n")
12157 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12158 int idx_ospf_table
= 1;
12159 int idx_number
= 2;
12160 int idx_number_2
= 4;
12162 struct bgp_redist
*red
;
12163 unsigned short instance
;
12167 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
12168 protocol
= ZEBRA_ROUTE_OSPF
;
12170 protocol
= ZEBRA_ROUTE_TABLE
;
12172 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12173 metric
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
12175 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
12176 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, protocol
,
12178 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
, changed
);
12181 ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf_metric
,
12182 bgp_redistribute_ipv4_ospf_metric_hidden_cmd
,
12183 "redistribute <ospf|table> (1-65535) metric (0-4294967295)",
12184 "Redistribute information from another routing protocol\n"
12185 "Open Shortest Path First (OSPFv2)\n"
12186 "Non-main Kernel Routing Table\n"
12187 "Instance ID/Table ID\n"
12188 "Metric for redistributed routes\n"
12189 "Default metric\n")
12191 DEFUN (bgp_redistribute_ipv4_ospf_rmap_metric
,
12192 bgp_redistribute_ipv4_ospf_rmap_metric_cmd
,
12193 "redistribute <ospf|table> (1-65535) route-map WORD metric (0-4294967295)",
12194 "Redistribute information from another routing protocol\n"
12195 "Open Shortest Path First (OSPFv2)\n"
12196 "Non-main Kernel Routing Table\n"
12197 "Instance ID/Table ID\n"
12198 "Route map reference\n"
12199 "Pointer to route-map entries\n"
12200 "Metric for redistributed routes\n"
12201 "Default metric\n")
12203 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12204 int idx_ospf_table
= 1;
12205 int idx_number
= 2;
12207 int idx_number_2
= 6;
12209 struct bgp_redist
*red
;
12210 unsigned short instance
;
12213 struct route_map
*route_map
=
12214 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12216 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
12217 protocol
= ZEBRA_ROUTE_OSPF
;
12219 protocol
= ZEBRA_ROUTE_TABLE
;
12221 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12222 metric
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
12224 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
12226 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12227 changed
|= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, protocol
,
12229 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
, changed
);
12233 bgp_redistribute_ipv4_ospf_rmap_metric
,
12234 bgp_redistribute_ipv4_ospf_rmap_metric_hidden_cmd
,
12235 "redistribute <ospf|table> (1-65535) route-map WORD metric (0-4294967295)",
12236 "Redistribute information from another routing protocol\n"
12237 "Open Shortest Path First (OSPFv2)\n"
12238 "Non-main Kernel Routing Table\n"
12239 "Instance ID/Table ID\n"
12240 "Route map reference\n"
12241 "Pointer to route-map entries\n"
12242 "Metric for redistributed routes\n"
12243 "Default metric\n")
12245 DEFUN (bgp_redistribute_ipv4_ospf_metric_rmap
,
12246 bgp_redistribute_ipv4_ospf_metric_rmap_cmd
,
12247 "redistribute <ospf|table> (1-65535) metric (0-4294967295) route-map WORD",
12248 "Redistribute information from another routing protocol\n"
12249 "Open Shortest Path First (OSPFv2)\n"
12250 "Non-main Kernel Routing Table\n"
12251 "Instance ID/Table ID\n"
12252 "Metric for redistributed routes\n"
12254 "Route map reference\n"
12255 "Pointer to route-map entries\n")
12257 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12258 int idx_ospf_table
= 1;
12259 int idx_number
= 2;
12260 int idx_number_2
= 4;
12263 struct bgp_redist
*red
;
12264 unsigned short instance
;
12267 struct route_map
*route_map
=
12268 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12270 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
12271 protocol
= ZEBRA_ROUTE_OSPF
;
12273 protocol
= ZEBRA_ROUTE_TABLE
;
12275 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12276 metric
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
12278 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
12279 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, protocol
,
12282 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12283 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
, changed
);
12287 bgp_redistribute_ipv4_ospf_metric_rmap
,
12288 bgp_redistribute_ipv4_ospf_metric_rmap_hidden_cmd
,
12289 "redistribute <ospf|table> (1-65535) metric (0-4294967295) route-map WORD",
12290 "Redistribute information from another routing protocol\n"
12291 "Open Shortest Path First (OSPFv2)\n"
12292 "Non-main Kernel Routing Table\n"
12293 "Instance ID/Table ID\n"
12294 "Metric for redistributed routes\n"
12296 "Route map reference\n"
12297 "Pointer to route-map entries\n")
12299 DEFUN (no_bgp_redistribute_ipv4_ospf
,
12300 no_bgp_redistribute_ipv4_ospf_cmd
,
12301 "no redistribute <ospf|table> (1-65535) [metric (0-4294967295)] [route-map WORD]",
12303 "Redistribute information from another routing protocol\n"
12304 "Open Shortest Path First (OSPFv2)\n"
12305 "Non-main Kernel Routing Table\n"
12306 "Instance ID/Table ID\n"
12307 "Metric for redistributed routes\n"
12309 "Route map reference\n"
12310 "Pointer to route-map entries\n")
12312 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12313 int idx_ospf_table
= 2;
12314 int idx_number
= 3;
12315 unsigned short instance
;
12318 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
12319 protocol
= ZEBRA_ROUTE_OSPF
;
12321 protocol
= ZEBRA_ROUTE_TABLE
;
12323 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12324 return bgp_redistribute_unset(bgp
, AFI_IP
, protocol
, instance
);
12328 no_bgp_redistribute_ipv4_ospf
, no_bgp_redistribute_ipv4_ospf_hidden_cmd
,
12329 "no redistribute <ospf|table> (1-65535) [metric (0-4294967295)] [route-map WORD]",
12331 "Redistribute information from another routing protocol\n"
12332 "Open Shortest Path First (OSPFv2)\n"
12333 "Non-main Kernel Routing Table\n"
12334 "Instance ID/Table ID\n"
12335 "Metric for redistributed routes\n"
12337 "Route map reference\n"
12338 "Pointer to route-map entries\n")
12340 DEFUN (no_bgp_redistribute_ipv4
,
12341 no_bgp_redistribute_ipv4_cmd
,
12342 "no redistribute " FRR_IP_REDIST_STR_BGPD
" [metric (0-4294967295)] [route-map WORD]",
12344 "Redistribute information from another routing protocol\n"
12345 FRR_IP_REDIST_HELP_STR_BGPD
12346 "Metric for redistributed routes\n"
12348 "Route map reference\n"
12349 "Pointer to route-map entries\n")
12351 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12352 int idx_protocol
= 2;
12355 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
12357 vty_out(vty
, "%% Invalid route type\n");
12358 return CMD_WARNING_CONFIG_FAILED
;
12360 return bgp_redistribute_unset(bgp
, AFI_IP
, type
, 0);
12364 no_bgp_redistribute_ipv4
, no_bgp_redistribute_ipv4_hidden_cmd
,
12365 "no redistribute " FRR_IP_REDIST_STR_BGPD
12366 " [metric (0-4294967295)] [route-map WORD]",
12368 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
12369 "Metric for redistributed routes\n"
12371 "Route map reference\n"
12372 "Pointer to route-map entries\n")
12374 DEFUN (bgp_redistribute_ipv6
,
12375 bgp_redistribute_ipv6_cmd
,
12376 "redistribute " FRR_IP6_REDIST_STR_BGPD
,
12377 "Redistribute information from another routing protocol\n"
12378 FRR_IP6_REDIST_HELP_STR_BGPD
)
12380 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12381 int idx_protocol
= 1;
12384 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
12386 vty_out(vty
, "%% Invalid route type\n");
12387 return CMD_WARNING_CONFIG_FAILED
;
12390 bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
12391 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0, false);
12394 DEFUN (bgp_redistribute_ipv6_rmap
,
12395 bgp_redistribute_ipv6_rmap_cmd
,
12396 "redistribute " FRR_IP6_REDIST_STR_BGPD
" route-map WORD",
12397 "Redistribute information from another routing protocol\n"
12398 FRR_IP6_REDIST_HELP_STR_BGPD
12399 "Route map reference\n"
12400 "Pointer to route-map entries\n")
12402 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12403 int idx_protocol
= 1;
12406 struct bgp_redist
*red
;
12408 struct route_map
*route_map
=
12409 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12411 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
12413 vty_out(vty
, "%% Invalid route type\n");
12414 return CMD_WARNING_CONFIG_FAILED
;
12417 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
12419 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12420 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0, changed
);
12423 DEFUN (bgp_redistribute_ipv6_metric
,
12424 bgp_redistribute_ipv6_metric_cmd
,
12425 "redistribute " FRR_IP6_REDIST_STR_BGPD
" metric (0-4294967295)",
12426 "Redistribute information from another routing protocol\n"
12427 FRR_IP6_REDIST_HELP_STR_BGPD
12428 "Metric for redistributed routes\n"
12429 "Default metric\n")
12431 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12432 int idx_protocol
= 1;
12433 int idx_number
= 3;
12436 struct bgp_redist
*red
;
12439 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
12441 vty_out(vty
, "%% Invalid route type\n");
12442 return CMD_WARNING_CONFIG_FAILED
;
12444 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12446 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
12447 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP6
, type
, metric
);
12448 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0, changed
);
12451 DEFUN (bgp_redistribute_ipv6_rmap_metric
,
12452 bgp_redistribute_ipv6_rmap_metric_cmd
,
12453 "redistribute " FRR_IP6_REDIST_STR_BGPD
" route-map WORD metric (0-4294967295)",
12454 "Redistribute information from another routing protocol\n"
12455 FRR_IP6_REDIST_HELP_STR_BGPD
12456 "Route map reference\n"
12457 "Pointer to route-map entries\n"
12458 "Metric for redistributed routes\n"
12459 "Default metric\n")
12461 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12462 int idx_protocol
= 1;
12464 int idx_number
= 5;
12467 struct bgp_redist
*red
;
12469 struct route_map
*route_map
=
12470 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12472 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
12474 vty_out(vty
, "%% Invalid route type\n");
12475 return CMD_WARNING_CONFIG_FAILED
;
12477 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12479 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
12481 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12482 changed
|= bgp_redistribute_metric_set(bgp
, red
, AFI_IP6
, type
,
12484 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0, changed
);
12487 DEFUN (bgp_redistribute_ipv6_metric_rmap
,
12488 bgp_redistribute_ipv6_metric_rmap_cmd
,
12489 "redistribute " FRR_IP6_REDIST_STR_BGPD
" metric (0-4294967295) route-map WORD",
12490 "Redistribute information from another routing protocol\n"
12491 FRR_IP6_REDIST_HELP_STR_BGPD
12492 "Metric for redistributed routes\n"
12494 "Route map reference\n"
12495 "Pointer to route-map entries\n")
12497 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12498 int idx_protocol
= 1;
12499 int idx_number
= 3;
12503 struct bgp_redist
*red
;
12505 struct route_map
*route_map
=
12506 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12508 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
12510 vty_out(vty
, "%% Invalid route type\n");
12511 return CMD_WARNING_CONFIG_FAILED
;
12513 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12515 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
12516 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP6
, SAFI_UNICAST
,
12519 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12520 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0, changed
);
12523 DEFUN (no_bgp_redistribute_ipv6
,
12524 no_bgp_redistribute_ipv6_cmd
,
12525 "no redistribute " FRR_IP6_REDIST_STR_BGPD
" [metric (0-4294967295)] [route-map WORD]",
12527 "Redistribute information from another routing protocol\n"
12528 FRR_IP6_REDIST_HELP_STR_BGPD
12529 "Metric for redistributed routes\n"
12531 "Route map reference\n"
12532 "Pointer to route-map entries\n")
12534 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12535 int idx_protocol
= 2;
12538 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
12540 vty_out(vty
, "%% Invalid route type\n");
12541 return CMD_WARNING_CONFIG_FAILED
;
12544 return bgp_redistribute_unset(bgp
, AFI_IP6
, type
, 0);
12547 void bgp_config_write_redistribute(struct vty
*vty
, struct bgp
*bgp
, afi_t afi
,
12552 /* Unicast redistribution only. */
12553 if (safi
!= SAFI_UNICAST
)
12556 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++) {
12557 /* Redistribute BGP does not make sense. */
12558 if (i
!= ZEBRA_ROUTE_BGP
) {
12559 struct list
*red_list
;
12560 struct listnode
*node
;
12561 struct bgp_redist
*red
;
12563 red_list
= bgp
->redist
[afi
][i
];
12567 for (ALL_LIST_ELEMENTS_RO(red_list
, node
, red
)) {
12568 /* "redistribute" configuration. */
12569 vty_out(vty
, " redistribute %s",
12570 zebra_route_string(i
));
12572 vty_out(vty
, " %d", red
->instance
);
12573 if (red
->redist_metric_flag
)
12574 vty_out(vty
, " metric %u",
12575 red
->redist_metric
);
12576 if (red
->rmap
.name
)
12577 vty_out(vty
, " route-map %s",
12579 vty_out(vty
, "\n");
12585 /* This is part of the address-family block (unicast only) */
12586 void bgp_vpn_policy_config_write_afi(struct vty
*vty
, struct bgp
*bgp
,
12591 if (bgp
->vpn_policy
[afi
].rmap_name
[BGP_VPN_POLICY_DIR_FROMVPN
]) {
12592 if (listcount(bgp
->vpn_policy
[afi
].import_vrf
))
12593 vty_out(vty
, "%*simport vrf route-map %s\n", indent
, "",
12594 bgp
->vpn_policy
[afi
]
12595 .rmap_name
[BGP_VPN_POLICY_DIR_FROMVPN
]);
12597 vty_out(vty
, "%*sroute-map vpn import %s\n", indent
, "",
12598 bgp
->vpn_policy
[afi
]
12599 .rmap_name
[BGP_VPN_POLICY_DIR_FROMVPN
]);
12601 if (CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
12602 BGP_CONFIG_VRF_TO_VRF_IMPORT
)
12603 || CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
12604 BGP_CONFIG_VRF_TO_VRF_EXPORT
))
12607 if (CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
12608 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
)) {
12610 vty_out(vty
, "%*slabel vpn export %s\n", indent
, "", "auto");
12613 if (bgp
->vpn_policy
[afi
].tovpn_label
!= MPLS_LABEL_NONE
) {
12614 vty_out(vty
, "%*slabel vpn export %u\n", indent
, "",
12615 bgp
->vpn_policy
[afi
].tovpn_label
);
12618 if (CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
12619 BGP_VPN_POLICY_TOVPN_RD_SET
)) {
12620 char buf
[RD_ADDRSTRLEN
];
12621 vty_out(vty
, "%*srd vpn export %s\n", indent
, "",
12622 prefix_rd2str(&bgp
->vpn_policy
[afi
].tovpn_rd
, buf
,
12625 if (CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
12626 BGP_VPN_POLICY_TOVPN_NEXTHOP_SET
)) {
12628 char buf
[PREFIX_STRLEN
];
12629 if (inet_ntop(bgp
->vpn_policy
[afi
].tovpn_nexthop
.family
,
12630 &bgp
->vpn_policy
[afi
].tovpn_nexthop
.u
.prefix
, buf
,
12633 vty_out(vty
, "%*snexthop vpn export %s\n",
12637 if (bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
]
12638 && bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
]
12640 bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
],
12641 bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
])) {
12643 char *b
= ecommunity_ecom2str(
12644 bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
],
12645 ECOMMUNITY_FORMAT_ROUTE_MAP
, ECOMMUNITY_ROUTE_TARGET
);
12646 vty_out(vty
, "%*srt vpn both %s\n", indent
, "", b
);
12647 XFREE(MTYPE_ECOMMUNITY_STR
, b
);
12649 if (bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
]) {
12650 char *b
= ecommunity_ecom2str(
12651 bgp
->vpn_policy
[afi
]
12652 .rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
],
12653 ECOMMUNITY_FORMAT_ROUTE_MAP
,
12654 ECOMMUNITY_ROUTE_TARGET
);
12655 vty_out(vty
, "%*srt vpn import %s\n", indent
, "", b
);
12656 XFREE(MTYPE_ECOMMUNITY_STR
, b
);
12658 if (bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
]) {
12659 char *b
= ecommunity_ecom2str(
12660 bgp
->vpn_policy
[afi
]
12661 .rtlist
[BGP_VPN_POLICY_DIR_TOVPN
],
12662 ECOMMUNITY_FORMAT_ROUTE_MAP
,
12663 ECOMMUNITY_ROUTE_TARGET
);
12664 vty_out(vty
, "%*srt vpn export %s\n", indent
, "", b
);
12665 XFREE(MTYPE_ECOMMUNITY_STR
, b
);
12669 if (bgp
->vpn_policy
[afi
].rmap_name
[BGP_VPN_POLICY_DIR_TOVPN
])
12670 vty_out(vty
, "%*sroute-map vpn export %s\n", indent
, "",
12671 bgp
->vpn_policy
[afi
]
12672 .rmap_name
[BGP_VPN_POLICY_DIR_TOVPN
]);
12674 if (bgp
->vpn_policy
[afi
].import_redirect_rtlist
) {
12675 char *b
= ecommunity_ecom2str(
12676 bgp
->vpn_policy
[afi
]
12677 .import_redirect_rtlist
,
12678 ECOMMUNITY_FORMAT_ROUTE_MAP
,
12679 ECOMMUNITY_ROUTE_TARGET
);
12681 vty_out(vty
, "%*srt redirect import %s\n", indent
, "", b
);
12682 XFREE(MTYPE_ECOMMUNITY_STR
, b
);
12687 /* BGP node structure. */
12688 static struct cmd_node bgp_node
= {
12689 BGP_NODE
, "%s(config-router)# ", 1,
12692 static struct cmd_node bgp_ipv4_unicast_node
= {
12693 BGP_IPV4_NODE
, "%s(config-router-af)# ", 1,
12696 static struct cmd_node bgp_ipv4_multicast_node
= {
12697 BGP_IPV4M_NODE
, "%s(config-router-af)# ", 1,
12700 static struct cmd_node bgp_ipv4_labeled_unicast_node
= {
12701 BGP_IPV4L_NODE
, "%s(config-router-af)# ", 1,
12704 static struct cmd_node bgp_ipv6_unicast_node
= {
12705 BGP_IPV6_NODE
, "%s(config-router-af)# ", 1,
12708 static struct cmd_node bgp_ipv6_multicast_node
= {
12709 BGP_IPV6M_NODE
, "%s(config-router-af)# ", 1,
12712 static struct cmd_node bgp_ipv6_labeled_unicast_node
= {
12713 BGP_IPV6L_NODE
, "%s(config-router-af)# ", 1,
12716 static struct cmd_node bgp_vpnv4_node
= {BGP_VPNV4_NODE
,
12717 "%s(config-router-af)# ", 1};
12719 static struct cmd_node bgp_vpnv6_node
= {BGP_VPNV6_NODE
,
12720 "%s(config-router-af-vpnv6)# ", 1};
12722 static struct cmd_node bgp_evpn_node
= {BGP_EVPN_NODE
,
12723 "%s(config-router-evpn)# ", 1};
12725 static struct cmd_node bgp_evpn_vni_node
= {BGP_EVPN_VNI_NODE
,
12726 "%s(config-router-af-vni)# ", 1};
12728 static struct cmd_node bgp_flowspecv4_node
= {BGP_FLOWSPECV4_NODE
,
12729 "%s(config-router-af)# ", 1};
12731 static struct cmd_node bgp_flowspecv6_node
= {BGP_FLOWSPECV6_NODE
,
12732 "%s(config-router-af-vpnv6)# ", 1};
12734 static void community_list_vty(void);
12736 static void bgp_ac_neighbor(vector comps
, struct cmd_token
*token
)
12740 struct listnode
*lnbgp
, *lnpeer
;
12742 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, lnbgp
, bgp
)) {
12743 for (ALL_LIST_ELEMENTS_RO(bgp
->peer
, lnpeer
, peer
)) {
12744 /* only provide suggestions on the appropriate input
12746 * they'll otherwise show up multiple times */
12747 enum cmd_token_type match_type
;
12748 char *name
= peer
->host
;
12750 if (peer
->conf_if
) {
12751 match_type
= VARIABLE_TKN
;
12752 name
= peer
->conf_if
;
12753 } else if (strchr(peer
->host
, ':'))
12754 match_type
= IPV6_TKN
;
12756 match_type
= IPV4_TKN
;
12758 if (token
->type
!= match_type
)
12761 vector_set(comps
, XSTRDUP(MTYPE_COMPLETION
, name
));
12766 static const struct cmd_variable_handler bgp_var_neighbor
[] = {
12767 {.varname
= "neighbor", .completions
= bgp_ac_neighbor
},
12768 {.varname
= "neighbors", .completions
= bgp_ac_neighbor
},
12769 {.varname
= "peer", .completions
= bgp_ac_neighbor
},
12770 {.completions
= NULL
}};
12772 static void bgp_ac_peergroup(vector comps
, struct cmd_token
*token
)
12775 struct peer_group
*group
;
12776 struct listnode
*lnbgp
, *lnpeer
;
12778 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, lnbgp
, bgp
)) {
12779 for (ALL_LIST_ELEMENTS_RO(bgp
->group
, lnpeer
, group
))
12780 vector_set(comps
, XSTRDUP(MTYPE_COMPLETION
,
12785 static const struct cmd_variable_handler bgp_var_peergroup
[] = {
12786 {.tokenname
= "PGNAME", .completions
= bgp_ac_peergroup
},
12787 {.completions
= NULL
} };
12789 void bgp_vty_init(void)
12791 cmd_variable_handler_register(bgp_var_neighbor
);
12792 cmd_variable_handler_register(bgp_var_peergroup
);
12794 /* Install bgp top node. */
12795 install_node(&bgp_node
, bgp_config_write
);
12796 install_node(&bgp_ipv4_unicast_node
, NULL
);
12797 install_node(&bgp_ipv4_multicast_node
, NULL
);
12798 install_node(&bgp_ipv4_labeled_unicast_node
, NULL
);
12799 install_node(&bgp_ipv6_unicast_node
, NULL
);
12800 install_node(&bgp_ipv6_multicast_node
, NULL
);
12801 install_node(&bgp_ipv6_labeled_unicast_node
, NULL
);
12802 install_node(&bgp_vpnv4_node
, NULL
);
12803 install_node(&bgp_vpnv6_node
, NULL
);
12804 install_node(&bgp_evpn_node
, NULL
);
12805 install_node(&bgp_evpn_vni_node
, NULL
);
12806 install_node(&bgp_flowspecv4_node
, NULL
);
12807 install_node(&bgp_flowspecv6_node
, NULL
);
12809 /* Install default VTY commands to new nodes. */
12810 install_default(BGP_NODE
);
12811 install_default(BGP_IPV4_NODE
);
12812 install_default(BGP_IPV4M_NODE
);
12813 install_default(BGP_IPV4L_NODE
);
12814 install_default(BGP_IPV6_NODE
);
12815 install_default(BGP_IPV6M_NODE
);
12816 install_default(BGP_IPV6L_NODE
);
12817 install_default(BGP_VPNV4_NODE
);
12818 install_default(BGP_VPNV6_NODE
);
12819 install_default(BGP_FLOWSPECV4_NODE
);
12820 install_default(BGP_FLOWSPECV6_NODE
);
12821 install_default(BGP_EVPN_NODE
);
12822 install_default(BGP_EVPN_VNI_NODE
);
12824 /* "bgp local-mac" hidden commands. */
12825 install_element(CONFIG_NODE
, &bgp_local_mac_cmd
);
12826 install_element(CONFIG_NODE
, &no_bgp_local_mac_cmd
);
12828 /* bgp route-map delay-timer commands. */
12829 install_element(CONFIG_NODE
, &bgp_set_route_map_delay_timer_cmd
);
12830 install_element(CONFIG_NODE
, &no_bgp_set_route_map_delay_timer_cmd
);
12832 /* Dummy commands (Currently not supported) */
12833 install_element(BGP_NODE
, &no_synchronization_cmd
);
12834 install_element(BGP_NODE
, &no_auto_summary_cmd
);
12836 /* "router bgp" commands. */
12837 install_element(CONFIG_NODE
, &router_bgp_cmd
);
12839 /* "no router bgp" commands. */
12840 install_element(CONFIG_NODE
, &no_router_bgp_cmd
);
12842 /* "bgp router-id" commands. */
12843 install_element(BGP_NODE
, &bgp_router_id_cmd
);
12844 install_element(BGP_NODE
, &no_bgp_router_id_cmd
);
12846 /* "bgp cluster-id" commands. */
12847 install_element(BGP_NODE
, &bgp_cluster_id_cmd
);
12848 install_element(BGP_NODE
, &no_bgp_cluster_id_cmd
);
12850 /* "bgp confederation" commands. */
12851 install_element(BGP_NODE
, &bgp_confederation_identifier_cmd
);
12852 install_element(BGP_NODE
, &no_bgp_confederation_identifier_cmd
);
12854 /* "bgp confederation peers" commands. */
12855 install_element(BGP_NODE
, &bgp_confederation_peers_cmd
);
12856 install_element(BGP_NODE
, &no_bgp_confederation_peers_cmd
);
12858 /* bgp max-med command */
12859 install_element(BGP_NODE
, &bgp_maxmed_admin_cmd
);
12860 install_element(BGP_NODE
, &no_bgp_maxmed_admin_cmd
);
12861 install_element(BGP_NODE
, &bgp_maxmed_admin_medv_cmd
);
12862 install_element(BGP_NODE
, &bgp_maxmed_onstartup_cmd
);
12863 install_element(BGP_NODE
, &no_bgp_maxmed_onstartup_cmd
);
12865 /* bgp disable-ebgp-connected-nh-check */
12866 install_element(BGP_NODE
, &bgp_disable_connected_route_check_cmd
);
12867 install_element(BGP_NODE
, &no_bgp_disable_connected_route_check_cmd
);
12869 /* bgp update-delay command */
12870 install_element(BGP_NODE
, &bgp_update_delay_cmd
);
12871 install_element(BGP_NODE
, &no_bgp_update_delay_cmd
);
12872 install_element(BGP_NODE
, &bgp_update_delay_establish_wait_cmd
);
12874 install_element(BGP_NODE
, &bgp_wpkt_quanta_cmd
);
12875 install_element(BGP_NODE
, &no_bgp_wpkt_quanta_cmd
);
12876 install_element(BGP_NODE
, &bgp_rpkt_quanta_cmd
);
12877 install_element(BGP_NODE
, &no_bgp_rpkt_quanta_cmd
);
12879 install_element(BGP_NODE
, &bgp_coalesce_time_cmd
);
12880 install_element(BGP_NODE
, &no_bgp_coalesce_time_cmd
);
12882 /* "maximum-paths" commands. */
12883 install_element(BGP_NODE
, &bgp_maxpaths_hidden_cmd
);
12884 install_element(BGP_NODE
, &no_bgp_maxpaths_hidden_cmd
);
12885 install_element(BGP_IPV4_NODE
, &bgp_maxpaths_cmd
);
12886 install_element(BGP_IPV4_NODE
, &no_bgp_maxpaths_cmd
);
12887 install_element(BGP_IPV6_NODE
, &bgp_maxpaths_cmd
);
12888 install_element(BGP_IPV6_NODE
, &no_bgp_maxpaths_cmd
);
12889 install_element(BGP_NODE
, &bgp_maxpaths_ibgp_hidden_cmd
);
12890 install_element(BGP_NODE
, &bgp_maxpaths_ibgp_cluster_hidden_cmd
);
12891 install_element(BGP_NODE
, &no_bgp_maxpaths_ibgp_hidden_cmd
);
12892 install_element(BGP_IPV4_NODE
, &bgp_maxpaths_ibgp_cmd
);
12893 install_element(BGP_IPV4_NODE
, &bgp_maxpaths_ibgp_cluster_cmd
);
12894 install_element(BGP_IPV4_NODE
, &no_bgp_maxpaths_ibgp_cmd
);
12895 install_element(BGP_IPV6_NODE
, &bgp_maxpaths_ibgp_cmd
);
12896 install_element(BGP_IPV6_NODE
, &bgp_maxpaths_ibgp_cluster_cmd
);
12897 install_element(BGP_IPV6_NODE
, &no_bgp_maxpaths_ibgp_cmd
);
12899 install_element(BGP_IPV6L_NODE
, &bgp_maxpaths_cmd
);
12900 install_element(BGP_IPV6L_NODE
, &no_bgp_maxpaths_cmd
);
12901 install_element(BGP_IPV6L_NODE
, &bgp_maxpaths_ibgp_cmd
);
12902 install_element(BGP_IPV6L_NODE
, &bgp_maxpaths_ibgp_cluster_cmd
);
12903 install_element(BGP_IPV6L_NODE
, &no_bgp_maxpaths_ibgp_cmd
);
12905 /* "timers bgp" commands. */
12906 install_element(BGP_NODE
, &bgp_timers_cmd
);
12907 install_element(BGP_NODE
, &no_bgp_timers_cmd
);
12909 /* route-map delay-timer commands - per instance for backwards compat.
12911 install_element(BGP_NODE
, &bgp_set_route_map_delay_timer_cmd
);
12912 install_element(BGP_NODE
, &no_bgp_set_route_map_delay_timer_cmd
);
12914 /* "bgp client-to-client reflection" commands */
12915 install_element(BGP_NODE
, &no_bgp_client_to_client_reflection_cmd
);
12916 install_element(BGP_NODE
, &bgp_client_to_client_reflection_cmd
);
12918 /* "bgp always-compare-med" commands */
12919 install_element(BGP_NODE
, &bgp_always_compare_med_cmd
);
12920 install_element(BGP_NODE
, &no_bgp_always_compare_med_cmd
);
12922 /* bgp ebgp-requires-policy */
12923 install_element(BGP_NODE
, &bgp_ebgp_requires_policy_cmd
);
12924 install_element(BGP_NODE
, &no_bgp_ebgp_requires_policy_cmd
);
12926 /* "bgp deterministic-med" commands */
12927 install_element(BGP_NODE
, &bgp_deterministic_med_cmd
);
12928 install_element(BGP_NODE
, &no_bgp_deterministic_med_cmd
);
12930 /* "bgp graceful-restart" commands */
12931 install_element(BGP_NODE
, &bgp_graceful_restart_cmd
);
12932 install_element(BGP_NODE
, &no_bgp_graceful_restart_cmd
);
12933 install_element(BGP_NODE
, &bgp_graceful_restart_stalepath_time_cmd
);
12934 install_element(BGP_NODE
, &no_bgp_graceful_restart_stalepath_time_cmd
);
12935 install_element(BGP_NODE
, &bgp_graceful_restart_restart_time_cmd
);
12936 install_element(BGP_NODE
, &no_bgp_graceful_restart_restart_time_cmd
);
12938 install_element(BGP_NODE
, &bgp_graceful_restart_preserve_fw_cmd
);
12939 install_element(BGP_NODE
, &no_bgp_graceful_restart_preserve_fw_cmd
);
12941 /* "bgp graceful-shutdown" commands */
12942 install_element(BGP_NODE
, &bgp_graceful_shutdown_cmd
);
12943 install_element(BGP_NODE
, &no_bgp_graceful_shutdown_cmd
);
12945 /* "bgp fast-external-failover" commands */
12946 install_element(BGP_NODE
, &bgp_fast_external_failover_cmd
);
12947 install_element(BGP_NODE
, &no_bgp_fast_external_failover_cmd
);
12949 /* "bgp bestpath compare-routerid" commands */
12950 install_element(BGP_NODE
, &bgp_bestpath_compare_router_id_cmd
);
12951 install_element(BGP_NODE
, &no_bgp_bestpath_compare_router_id_cmd
);
12953 /* "bgp bestpath as-path ignore" commands */
12954 install_element(BGP_NODE
, &bgp_bestpath_aspath_ignore_cmd
);
12955 install_element(BGP_NODE
, &no_bgp_bestpath_aspath_ignore_cmd
);
12957 /* "bgp bestpath as-path confed" commands */
12958 install_element(BGP_NODE
, &bgp_bestpath_aspath_confed_cmd
);
12959 install_element(BGP_NODE
, &no_bgp_bestpath_aspath_confed_cmd
);
12961 /* "bgp bestpath as-path multipath-relax" commands */
12962 install_element(BGP_NODE
, &bgp_bestpath_aspath_multipath_relax_cmd
);
12963 install_element(BGP_NODE
, &no_bgp_bestpath_aspath_multipath_relax_cmd
);
12965 /* "bgp log-neighbor-changes" commands */
12966 install_element(BGP_NODE
, &bgp_log_neighbor_changes_cmd
);
12967 install_element(BGP_NODE
, &no_bgp_log_neighbor_changes_cmd
);
12969 /* "bgp bestpath med" commands */
12970 install_element(BGP_NODE
, &bgp_bestpath_med_cmd
);
12971 install_element(BGP_NODE
, &no_bgp_bestpath_med_cmd
);
12973 /* "no bgp default ipv4-unicast" commands. */
12974 install_element(BGP_NODE
, &no_bgp_default_ipv4_unicast_cmd
);
12975 install_element(BGP_NODE
, &bgp_default_ipv4_unicast_cmd
);
12977 /* "bgp network import-check" commands. */
12978 install_element(BGP_NODE
, &bgp_network_import_check_cmd
);
12979 install_element(BGP_NODE
, &bgp_network_import_check_exact_cmd
);
12980 install_element(BGP_NODE
, &no_bgp_network_import_check_cmd
);
12982 /* "bgp default local-preference" commands. */
12983 install_element(BGP_NODE
, &bgp_default_local_preference_cmd
);
12984 install_element(BGP_NODE
, &no_bgp_default_local_preference_cmd
);
12986 /* bgp default show-hostname */
12987 install_element(BGP_NODE
, &bgp_default_show_hostname_cmd
);
12988 install_element(BGP_NODE
, &no_bgp_default_show_hostname_cmd
);
12990 /* "bgp default subgroup-pkt-queue-max" commands. */
12991 install_element(BGP_NODE
, &bgp_default_subgroup_pkt_queue_max_cmd
);
12992 install_element(BGP_NODE
, &no_bgp_default_subgroup_pkt_queue_max_cmd
);
12994 /* bgp ibgp-allow-policy-mods command */
12995 install_element(BGP_NODE
, &bgp_rr_allow_outbound_policy_cmd
);
12996 install_element(BGP_NODE
, &no_bgp_rr_allow_outbound_policy_cmd
);
12998 /* "bgp listen limit" commands. */
12999 install_element(BGP_NODE
, &bgp_listen_limit_cmd
);
13000 install_element(BGP_NODE
, &no_bgp_listen_limit_cmd
);
13002 /* "bgp listen range" commands. */
13003 install_element(BGP_NODE
, &bgp_listen_range_cmd
);
13004 install_element(BGP_NODE
, &no_bgp_listen_range_cmd
);
13006 /* "bgp default shutdown" command */
13007 install_element(BGP_NODE
, &bgp_default_shutdown_cmd
);
13009 /* "neighbor remote-as" commands. */
13010 install_element(BGP_NODE
, &neighbor_remote_as_cmd
);
13011 install_element(BGP_NODE
, &neighbor_interface_config_cmd
);
13012 install_element(BGP_NODE
, &neighbor_interface_config_v6only_cmd
);
13013 install_element(BGP_NODE
, &neighbor_interface_config_remote_as_cmd
);
13014 install_element(BGP_NODE
,
13015 &neighbor_interface_v6only_config_remote_as_cmd
);
13016 install_element(BGP_NODE
, &no_neighbor_cmd
);
13017 install_element(BGP_NODE
, &no_neighbor_interface_config_cmd
);
13019 /* "neighbor peer-group" commands. */
13020 install_element(BGP_NODE
, &neighbor_peer_group_cmd
);
13021 install_element(BGP_NODE
, &no_neighbor_peer_group_cmd
);
13022 install_element(BGP_NODE
,
13023 &no_neighbor_interface_peer_group_remote_as_cmd
);
13025 /* "neighbor local-as" commands. */
13026 install_element(BGP_NODE
, &neighbor_local_as_cmd
);
13027 install_element(BGP_NODE
, &neighbor_local_as_no_prepend_cmd
);
13028 install_element(BGP_NODE
, &neighbor_local_as_no_prepend_replace_as_cmd
);
13029 install_element(BGP_NODE
, &no_neighbor_local_as_cmd
);
13031 /* "neighbor solo" commands. */
13032 install_element(BGP_NODE
, &neighbor_solo_cmd
);
13033 install_element(BGP_NODE
, &no_neighbor_solo_cmd
);
13035 /* "neighbor password" commands. */
13036 install_element(BGP_NODE
, &neighbor_password_cmd
);
13037 install_element(BGP_NODE
, &no_neighbor_password_cmd
);
13039 /* "neighbor activate" commands. */
13040 install_element(BGP_NODE
, &neighbor_activate_hidden_cmd
);
13041 install_element(BGP_IPV4_NODE
, &neighbor_activate_cmd
);
13042 install_element(BGP_IPV4M_NODE
, &neighbor_activate_cmd
);
13043 install_element(BGP_IPV4L_NODE
, &neighbor_activate_cmd
);
13044 install_element(BGP_IPV6_NODE
, &neighbor_activate_cmd
);
13045 install_element(BGP_IPV6M_NODE
, &neighbor_activate_cmd
);
13046 install_element(BGP_IPV6L_NODE
, &neighbor_activate_cmd
);
13047 install_element(BGP_VPNV4_NODE
, &neighbor_activate_cmd
);
13048 install_element(BGP_VPNV6_NODE
, &neighbor_activate_cmd
);
13049 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_activate_cmd
);
13050 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_activate_cmd
);
13051 install_element(BGP_EVPN_NODE
, &neighbor_activate_cmd
);
13053 /* "no neighbor activate" commands. */
13054 install_element(BGP_NODE
, &no_neighbor_activate_hidden_cmd
);
13055 install_element(BGP_IPV4_NODE
, &no_neighbor_activate_cmd
);
13056 install_element(BGP_IPV4M_NODE
, &no_neighbor_activate_cmd
);
13057 install_element(BGP_IPV4L_NODE
, &no_neighbor_activate_cmd
);
13058 install_element(BGP_IPV6_NODE
, &no_neighbor_activate_cmd
);
13059 install_element(BGP_IPV6M_NODE
, &no_neighbor_activate_cmd
);
13060 install_element(BGP_IPV6L_NODE
, &no_neighbor_activate_cmd
);
13061 install_element(BGP_VPNV4_NODE
, &no_neighbor_activate_cmd
);
13062 install_element(BGP_VPNV6_NODE
, &no_neighbor_activate_cmd
);
13063 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_activate_cmd
);
13064 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_activate_cmd
);
13065 install_element(BGP_EVPN_NODE
, &no_neighbor_activate_cmd
);
13067 /* "neighbor peer-group" set commands. */
13068 install_element(BGP_NODE
, &neighbor_set_peer_group_cmd
);
13069 install_element(BGP_IPV4_NODE
, &neighbor_set_peer_group_hidden_cmd
);
13070 install_element(BGP_IPV4M_NODE
, &neighbor_set_peer_group_hidden_cmd
);
13071 install_element(BGP_IPV6_NODE
, &neighbor_set_peer_group_hidden_cmd
);
13072 install_element(BGP_IPV6M_NODE
, &neighbor_set_peer_group_hidden_cmd
);
13073 install_element(BGP_IPV6L_NODE
, &neighbor_set_peer_group_hidden_cmd
);
13074 install_element(BGP_VPNV4_NODE
, &neighbor_set_peer_group_hidden_cmd
);
13075 install_element(BGP_VPNV6_NODE
, &neighbor_set_peer_group_hidden_cmd
);
13076 install_element(BGP_FLOWSPECV4_NODE
,
13077 &neighbor_set_peer_group_hidden_cmd
);
13078 install_element(BGP_FLOWSPECV6_NODE
,
13079 &neighbor_set_peer_group_hidden_cmd
);
13081 /* "no neighbor peer-group unset" commands. */
13082 install_element(BGP_NODE
, &no_neighbor_set_peer_group_cmd
);
13083 install_element(BGP_IPV4_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
13084 install_element(BGP_IPV4M_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
13085 install_element(BGP_IPV6_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
13086 install_element(BGP_IPV6M_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
13087 install_element(BGP_IPV6L_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
13088 install_element(BGP_VPNV4_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
13089 install_element(BGP_VPNV6_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
13090 install_element(BGP_FLOWSPECV4_NODE
,
13091 &no_neighbor_set_peer_group_hidden_cmd
);
13092 install_element(BGP_FLOWSPECV6_NODE
,
13093 &no_neighbor_set_peer_group_hidden_cmd
);
13095 /* "neighbor softreconfiguration inbound" commands.*/
13096 install_element(BGP_NODE
, &neighbor_soft_reconfiguration_hidden_cmd
);
13097 install_element(BGP_NODE
, &no_neighbor_soft_reconfiguration_hidden_cmd
);
13098 install_element(BGP_IPV4_NODE
, &neighbor_soft_reconfiguration_cmd
);
13099 install_element(BGP_IPV4_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
13100 install_element(BGP_IPV4L_NODE
, &neighbor_soft_reconfiguration_cmd
);
13101 install_element(BGP_IPV4L_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
13102 install_element(BGP_IPV4M_NODE
, &neighbor_soft_reconfiguration_cmd
);
13103 install_element(BGP_IPV4M_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
13104 install_element(BGP_IPV6_NODE
, &neighbor_soft_reconfiguration_cmd
);
13105 install_element(BGP_IPV6_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
13106 install_element(BGP_IPV6M_NODE
, &neighbor_soft_reconfiguration_cmd
);
13107 install_element(BGP_IPV6M_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
13108 install_element(BGP_IPV6L_NODE
, &neighbor_soft_reconfiguration_cmd
);
13109 install_element(BGP_IPV6L_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
13110 install_element(BGP_VPNV4_NODE
, &neighbor_soft_reconfiguration_cmd
);
13111 install_element(BGP_VPNV4_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
13112 install_element(BGP_VPNV6_NODE
, &neighbor_soft_reconfiguration_cmd
);
13113 install_element(BGP_VPNV6_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
13114 install_element(BGP_FLOWSPECV4_NODE
,
13115 &neighbor_soft_reconfiguration_cmd
);
13116 install_element(BGP_FLOWSPECV4_NODE
,
13117 &no_neighbor_soft_reconfiguration_cmd
);
13118 install_element(BGP_FLOWSPECV6_NODE
,
13119 &neighbor_soft_reconfiguration_cmd
);
13120 install_element(BGP_FLOWSPECV6_NODE
,
13121 &no_neighbor_soft_reconfiguration_cmd
);
13122 install_element(BGP_EVPN_NODE
, &neighbor_soft_reconfiguration_cmd
);
13123 install_element(BGP_EVPN_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
13125 /* "neighbor attribute-unchanged" commands. */
13126 install_element(BGP_NODE
, &neighbor_attr_unchanged_hidden_cmd
);
13127 install_element(BGP_NODE
, &no_neighbor_attr_unchanged_hidden_cmd
);
13128 install_element(BGP_IPV4_NODE
, &neighbor_attr_unchanged_cmd
);
13129 install_element(BGP_IPV4_NODE
, &no_neighbor_attr_unchanged_cmd
);
13130 install_element(BGP_IPV4M_NODE
, &neighbor_attr_unchanged_cmd
);
13131 install_element(BGP_IPV4M_NODE
, &no_neighbor_attr_unchanged_cmd
);
13132 install_element(BGP_IPV4L_NODE
, &neighbor_attr_unchanged_cmd
);
13133 install_element(BGP_IPV4L_NODE
, &no_neighbor_attr_unchanged_cmd
);
13134 install_element(BGP_IPV6_NODE
, &neighbor_attr_unchanged_cmd
);
13135 install_element(BGP_IPV6_NODE
, &no_neighbor_attr_unchanged_cmd
);
13136 install_element(BGP_IPV6M_NODE
, &neighbor_attr_unchanged_cmd
);
13137 install_element(BGP_IPV6M_NODE
, &no_neighbor_attr_unchanged_cmd
);
13138 install_element(BGP_IPV6L_NODE
, &neighbor_attr_unchanged_cmd
);
13139 install_element(BGP_IPV6L_NODE
, &no_neighbor_attr_unchanged_cmd
);
13140 install_element(BGP_VPNV4_NODE
, &neighbor_attr_unchanged_cmd
);
13141 install_element(BGP_VPNV4_NODE
, &no_neighbor_attr_unchanged_cmd
);
13142 install_element(BGP_VPNV6_NODE
, &neighbor_attr_unchanged_cmd
);
13143 install_element(BGP_VPNV6_NODE
, &no_neighbor_attr_unchanged_cmd
);
13145 install_element(BGP_EVPN_NODE
, &neighbor_attr_unchanged_cmd
);
13146 install_element(BGP_EVPN_NODE
, &no_neighbor_attr_unchanged_cmd
);
13148 /* "nexthop-local unchanged" commands */
13149 install_element(BGP_IPV6_NODE
, &neighbor_nexthop_local_unchanged_cmd
);
13150 install_element(BGP_IPV6_NODE
,
13151 &no_neighbor_nexthop_local_unchanged_cmd
);
13153 /* "neighbor next-hop-self" commands. */
13154 install_element(BGP_NODE
, &neighbor_nexthop_self_hidden_cmd
);
13155 install_element(BGP_NODE
, &no_neighbor_nexthop_self_hidden_cmd
);
13156 install_element(BGP_IPV4_NODE
, &neighbor_nexthop_self_cmd
);
13157 install_element(BGP_IPV4_NODE
, &no_neighbor_nexthop_self_cmd
);
13158 install_element(BGP_IPV4M_NODE
, &neighbor_nexthop_self_cmd
);
13159 install_element(BGP_IPV4M_NODE
, &no_neighbor_nexthop_self_cmd
);
13160 install_element(BGP_IPV4L_NODE
, &neighbor_nexthop_self_cmd
);
13161 install_element(BGP_IPV4L_NODE
, &no_neighbor_nexthop_self_cmd
);
13162 install_element(BGP_IPV6_NODE
, &neighbor_nexthop_self_cmd
);
13163 install_element(BGP_IPV6_NODE
, &no_neighbor_nexthop_self_cmd
);
13164 install_element(BGP_IPV6M_NODE
, &neighbor_nexthop_self_cmd
);
13165 install_element(BGP_IPV6M_NODE
, &no_neighbor_nexthop_self_cmd
);
13166 install_element(BGP_IPV6L_NODE
, &neighbor_nexthop_self_cmd
);
13167 install_element(BGP_IPV6L_NODE
, &no_neighbor_nexthop_self_cmd
);
13168 install_element(BGP_VPNV4_NODE
, &neighbor_nexthop_self_cmd
);
13169 install_element(BGP_VPNV4_NODE
, &no_neighbor_nexthop_self_cmd
);
13170 install_element(BGP_VPNV6_NODE
, &neighbor_nexthop_self_cmd
);
13171 install_element(BGP_VPNV6_NODE
, &no_neighbor_nexthop_self_cmd
);
13172 install_element(BGP_EVPN_NODE
, &neighbor_nexthop_self_cmd
);
13173 install_element(BGP_EVPN_NODE
, &no_neighbor_nexthop_self_cmd
);
13175 /* "neighbor next-hop-self force" commands. */
13176 install_element(BGP_NODE
, &neighbor_nexthop_self_force_hidden_cmd
);
13177 install_element(BGP_NODE
, &no_neighbor_nexthop_self_force_hidden_cmd
);
13178 install_element(BGP_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
13179 install_element(BGP_NODE
, &no_neighbor_nexthop_self_all_hidden_cmd
);
13180 install_element(BGP_IPV4_NODE
, &neighbor_nexthop_self_force_cmd
);
13181 install_element(BGP_IPV4_NODE
, &no_neighbor_nexthop_self_force_cmd
);
13182 install_element(BGP_IPV4M_NODE
, &neighbor_nexthop_self_force_cmd
);
13183 install_element(BGP_IPV4M_NODE
, &no_neighbor_nexthop_self_force_cmd
);
13184 install_element(BGP_IPV4L_NODE
, &neighbor_nexthop_self_force_cmd
);
13185 install_element(BGP_IPV4L_NODE
, &no_neighbor_nexthop_self_force_cmd
);
13186 install_element(BGP_IPV6_NODE
, &neighbor_nexthop_self_force_cmd
);
13187 install_element(BGP_IPV6_NODE
, &no_neighbor_nexthop_self_force_cmd
);
13188 install_element(BGP_IPV6M_NODE
, &neighbor_nexthop_self_force_cmd
);
13189 install_element(BGP_IPV6M_NODE
, &no_neighbor_nexthop_self_force_cmd
);
13190 install_element(BGP_IPV6L_NODE
, &neighbor_nexthop_self_force_cmd
);
13191 install_element(BGP_IPV6L_NODE
, &no_neighbor_nexthop_self_force_cmd
);
13192 install_element(BGP_VPNV4_NODE
, &neighbor_nexthop_self_force_cmd
);
13193 install_element(BGP_VPNV4_NODE
, &no_neighbor_nexthop_self_force_cmd
);
13194 install_element(BGP_VPNV6_NODE
, &neighbor_nexthop_self_force_cmd
);
13195 install_element(BGP_VPNV6_NODE
, &no_neighbor_nexthop_self_force_cmd
);
13197 /* "neighbor as-override" commands. */
13198 install_element(BGP_NODE
, &neighbor_as_override_hidden_cmd
);
13199 install_element(BGP_NODE
, &no_neighbor_as_override_hidden_cmd
);
13200 install_element(BGP_IPV4_NODE
, &neighbor_as_override_cmd
);
13201 install_element(BGP_IPV4_NODE
, &no_neighbor_as_override_cmd
);
13202 install_element(BGP_IPV4M_NODE
, &neighbor_as_override_cmd
);
13203 install_element(BGP_IPV4M_NODE
, &no_neighbor_as_override_cmd
);
13204 install_element(BGP_IPV4L_NODE
, &neighbor_as_override_cmd
);
13205 install_element(BGP_IPV4L_NODE
, &no_neighbor_as_override_cmd
);
13206 install_element(BGP_IPV6_NODE
, &neighbor_as_override_cmd
);
13207 install_element(BGP_IPV6_NODE
, &no_neighbor_as_override_cmd
);
13208 install_element(BGP_IPV6M_NODE
, &neighbor_as_override_cmd
);
13209 install_element(BGP_IPV6M_NODE
, &no_neighbor_as_override_cmd
);
13210 install_element(BGP_IPV6L_NODE
, &neighbor_as_override_cmd
);
13211 install_element(BGP_IPV6L_NODE
, &no_neighbor_as_override_cmd
);
13212 install_element(BGP_VPNV4_NODE
, &neighbor_as_override_cmd
);
13213 install_element(BGP_VPNV4_NODE
, &no_neighbor_as_override_cmd
);
13214 install_element(BGP_VPNV6_NODE
, &neighbor_as_override_cmd
);
13215 install_element(BGP_VPNV6_NODE
, &no_neighbor_as_override_cmd
);
13217 /* "neighbor remove-private-AS" commands. */
13218 install_element(BGP_NODE
, &neighbor_remove_private_as_hidden_cmd
);
13219 install_element(BGP_NODE
, &no_neighbor_remove_private_as_hidden_cmd
);
13220 install_element(BGP_NODE
, &neighbor_remove_private_as_all_hidden_cmd
);
13221 install_element(BGP_NODE
,
13222 &no_neighbor_remove_private_as_all_hidden_cmd
);
13223 install_element(BGP_NODE
,
13224 &neighbor_remove_private_as_replace_as_hidden_cmd
);
13225 install_element(BGP_NODE
,
13226 &no_neighbor_remove_private_as_replace_as_hidden_cmd
);
13227 install_element(BGP_NODE
,
13228 &neighbor_remove_private_as_all_replace_as_hidden_cmd
);
13231 &no_neighbor_remove_private_as_all_replace_as_hidden_cmd
);
13232 install_element(BGP_IPV4_NODE
, &neighbor_remove_private_as_cmd
);
13233 install_element(BGP_IPV4_NODE
, &no_neighbor_remove_private_as_cmd
);
13234 install_element(BGP_IPV4_NODE
, &neighbor_remove_private_as_all_cmd
);
13235 install_element(BGP_IPV4_NODE
, &no_neighbor_remove_private_as_all_cmd
);
13236 install_element(BGP_IPV4_NODE
,
13237 &neighbor_remove_private_as_replace_as_cmd
);
13238 install_element(BGP_IPV4_NODE
,
13239 &no_neighbor_remove_private_as_replace_as_cmd
);
13240 install_element(BGP_IPV4_NODE
,
13241 &neighbor_remove_private_as_all_replace_as_cmd
);
13242 install_element(BGP_IPV4_NODE
,
13243 &no_neighbor_remove_private_as_all_replace_as_cmd
);
13244 install_element(BGP_IPV4M_NODE
, &neighbor_remove_private_as_cmd
);
13245 install_element(BGP_IPV4M_NODE
, &no_neighbor_remove_private_as_cmd
);
13246 install_element(BGP_IPV4M_NODE
, &neighbor_remove_private_as_all_cmd
);
13247 install_element(BGP_IPV4M_NODE
, &no_neighbor_remove_private_as_all_cmd
);
13248 install_element(BGP_IPV4M_NODE
,
13249 &neighbor_remove_private_as_replace_as_cmd
);
13250 install_element(BGP_IPV4M_NODE
,
13251 &no_neighbor_remove_private_as_replace_as_cmd
);
13252 install_element(BGP_IPV4M_NODE
,
13253 &neighbor_remove_private_as_all_replace_as_cmd
);
13254 install_element(BGP_IPV4M_NODE
,
13255 &no_neighbor_remove_private_as_all_replace_as_cmd
);
13256 install_element(BGP_IPV4L_NODE
, &neighbor_remove_private_as_cmd
);
13257 install_element(BGP_IPV4L_NODE
, &no_neighbor_remove_private_as_cmd
);
13258 install_element(BGP_IPV4L_NODE
, &neighbor_remove_private_as_all_cmd
);
13259 install_element(BGP_IPV4L_NODE
, &no_neighbor_remove_private_as_all_cmd
);
13260 install_element(BGP_IPV4L_NODE
,
13261 &neighbor_remove_private_as_replace_as_cmd
);
13262 install_element(BGP_IPV4L_NODE
,
13263 &no_neighbor_remove_private_as_replace_as_cmd
);
13264 install_element(BGP_IPV4L_NODE
,
13265 &neighbor_remove_private_as_all_replace_as_cmd
);
13266 install_element(BGP_IPV4L_NODE
,
13267 &no_neighbor_remove_private_as_all_replace_as_cmd
);
13268 install_element(BGP_IPV6_NODE
, &neighbor_remove_private_as_cmd
);
13269 install_element(BGP_IPV6_NODE
, &no_neighbor_remove_private_as_cmd
);
13270 install_element(BGP_IPV6_NODE
, &neighbor_remove_private_as_all_cmd
);
13271 install_element(BGP_IPV6_NODE
, &no_neighbor_remove_private_as_all_cmd
);
13272 install_element(BGP_IPV6_NODE
,
13273 &neighbor_remove_private_as_replace_as_cmd
);
13274 install_element(BGP_IPV6_NODE
,
13275 &no_neighbor_remove_private_as_replace_as_cmd
);
13276 install_element(BGP_IPV6_NODE
,
13277 &neighbor_remove_private_as_all_replace_as_cmd
);
13278 install_element(BGP_IPV6_NODE
,
13279 &no_neighbor_remove_private_as_all_replace_as_cmd
);
13280 install_element(BGP_IPV6M_NODE
, &neighbor_remove_private_as_cmd
);
13281 install_element(BGP_IPV6M_NODE
, &no_neighbor_remove_private_as_cmd
);
13282 install_element(BGP_IPV6M_NODE
, &neighbor_remove_private_as_all_cmd
);
13283 install_element(BGP_IPV6M_NODE
, &no_neighbor_remove_private_as_all_cmd
);
13284 install_element(BGP_IPV6M_NODE
,
13285 &neighbor_remove_private_as_replace_as_cmd
);
13286 install_element(BGP_IPV6M_NODE
,
13287 &no_neighbor_remove_private_as_replace_as_cmd
);
13288 install_element(BGP_IPV6M_NODE
,
13289 &neighbor_remove_private_as_all_replace_as_cmd
);
13290 install_element(BGP_IPV6M_NODE
,
13291 &no_neighbor_remove_private_as_all_replace_as_cmd
);
13292 install_element(BGP_IPV6L_NODE
, &neighbor_remove_private_as_cmd
);
13293 install_element(BGP_IPV6L_NODE
, &no_neighbor_remove_private_as_cmd
);
13294 install_element(BGP_IPV6L_NODE
, &neighbor_remove_private_as_all_cmd
);
13295 install_element(BGP_IPV6L_NODE
, &no_neighbor_remove_private_as_all_cmd
);
13296 install_element(BGP_IPV6L_NODE
,
13297 &neighbor_remove_private_as_replace_as_cmd
);
13298 install_element(BGP_IPV6L_NODE
,
13299 &no_neighbor_remove_private_as_replace_as_cmd
);
13300 install_element(BGP_IPV6L_NODE
,
13301 &neighbor_remove_private_as_all_replace_as_cmd
);
13302 install_element(BGP_IPV6L_NODE
,
13303 &no_neighbor_remove_private_as_all_replace_as_cmd
);
13304 install_element(BGP_VPNV4_NODE
, &neighbor_remove_private_as_cmd
);
13305 install_element(BGP_VPNV4_NODE
, &no_neighbor_remove_private_as_cmd
);
13306 install_element(BGP_VPNV4_NODE
, &neighbor_remove_private_as_all_cmd
);
13307 install_element(BGP_VPNV4_NODE
, &no_neighbor_remove_private_as_all_cmd
);
13308 install_element(BGP_VPNV4_NODE
,
13309 &neighbor_remove_private_as_replace_as_cmd
);
13310 install_element(BGP_VPNV4_NODE
,
13311 &no_neighbor_remove_private_as_replace_as_cmd
);
13312 install_element(BGP_VPNV4_NODE
,
13313 &neighbor_remove_private_as_all_replace_as_cmd
);
13314 install_element(BGP_VPNV4_NODE
,
13315 &no_neighbor_remove_private_as_all_replace_as_cmd
);
13316 install_element(BGP_VPNV6_NODE
, &neighbor_remove_private_as_cmd
);
13317 install_element(BGP_VPNV6_NODE
, &no_neighbor_remove_private_as_cmd
);
13318 install_element(BGP_VPNV6_NODE
, &neighbor_remove_private_as_all_cmd
);
13319 install_element(BGP_VPNV6_NODE
, &no_neighbor_remove_private_as_all_cmd
);
13320 install_element(BGP_VPNV6_NODE
,
13321 &neighbor_remove_private_as_replace_as_cmd
);
13322 install_element(BGP_VPNV6_NODE
,
13323 &no_neighbor_remove_private_as_replace_as_cmd
);
13324 install_element(BGP_VPNV6_NODE
,
13325 &neighbor_remove_private_as_all_replace_as_cmd
);
13326 install_element(BGP_VPNV6_NODE
,
13327 &no_neighbor_remove_private_as_all_replace_as_cmd
);
13329 /* "neighbor send-community" commands.*/
13330 install_element(BGP_NODE
, &neighbor_send_community_hidden_cmd
);
13331 install_element(BGP_NODE
, &neighbor_send_community_type_hidden_cmd
);
13332 install_element(BGP_NODE
, &no_neighbor_send_community_hidden_cmd
);
13333 install_element(BGP_NODE
, &no_neighbor_send_community_type_hidden_cmd
);
13334 install_element(BGP_IPV4_NODE
, &neighbor_send_community_cmd
);
13335 install_element(BGP_IPV4_NODE
, &neighbor_send_community_type_cmd
);
13336 install_element(BGP_IPV4_NODE
, &no_neighbor_send_community_cmd
);
13337 install_element(BGP_IPV4_NODE
, &no_neighbor_send_community_type_cmd
);
13338 install_element(BGP_IPV4M_NODE
, &neighbor_send_community_cmd
);
13339 install_element(BGP_IPV4M_NODE
, &neighbor_send_community_type_cmd
);
13340 install_element(BGP_IPV4M_NODE
, &no_neighbor_send_community_cmd
);
13341 install_element(BGP_IPV4M_NODE
, &no_neighbor_send_community_type_cmd
);
13342 install_element(BGP_IPV4L_NODE
, &neighbor_send_community_cmd
);
13343 install_element(BGP_IPV4L_NODE
, &neighbor_send_community_type_cmd
);
13344 install_element(BGP_IPV4L_NODE
, &no_neighbor_send_community_cmd
);
13345 install_element(BGP_IPV4L_NODE
, &no_neighbor_send_community_type_cmd
);
13346 install_element(BGP_IPV6_NODE
, &neighbor_send_community_cmd
);
13347 install_element(BGP_IPV6_NODE
, &neighbor_send_community_type_cmd
);
13348 install_element(BGP_IPV6_NODE
, &no_neighbor_send_community_cmd
);
13349 install_element(BGP_IPV6_NODE
, &no_neighbor_send_community_type_cmd
);
13350 install_element(BGP_IPV6M_NODE
, &neighbor_send_community_cmd
);
13351 install_element(BGP_IPV6M_NODE
, &neighbor_send_community_type_cmd
);
13352 install_element(BGP_IPV6M_NODE
, &no_neighbor_send_community_cmd
);
13353 install_element(BGP_IPV6M_NODE
, &no_neighbor_send_community_type_cmd
);
13354 install_element(BGP_IPV6L_NODE
, &neighbor_send_community_cmd
);
13355 install_element(BGP_IPV6L_NODE
, &neighbor_send_community_type_cmd
);
13356 install_element(BGP_IPV6L_NODE
, &no_neighbor_send_community_cmd
);
13357 install_element(BGP_IPV6L_NODE
, &no_neighbor_send_community_type_cmd
);
13358 install_element(BGP_VPNV4_NODE
, &neighbor_send_community_cmd
);
13359 install_element(BGP_VPNV4_NODE
, &neighbor_send_community_type_cmd
);
13360 install_element(BGP_VPNV4_NODE
, &no_neighbor_send_community_cmd
);
13361 install_element(BGP_VPNV4_NODE
, &no_neighbor_send_community_type_cmd
);
13362 install_element(BGP_VPNV6_NODE
, &neighbor_send_community_cmd
);
13363 install_element(BGP_VPNV6_NODE
, &neighbor_send_community_type_cmd
);
13364 install_element(BGP_VPNV6_NODE
, &no_neighbor_send_community_cmd
);
13365 install_element(BGP_VPNV6_NODE
, &no_neighbor_send_community_type_cmd
);
13367 /* "neighbor route-reflector" commands.*/
13368 install_element(BGP_NODE
, &neighbor_route_reflector_client_hidden_cmd
);
13369 install_element(BGP_NODE
,
13370 &no_neighbor_route_reflector_client_hidden_cmd
);
13371 install_element(BGP_IPV4_NODE
, &neighbor_route_reflector_client_cmd
);
13372 install_element(BGP_IPV4_NODE
, &no_neighbor_route_reflector_client_cmd
);
13373 install_element(BGP_IPV4M_NODE
, &neighbor_route_reflector_client_cmd
);
13374 install_element(BGP_IPV4M_NODE
,
13375 &no_neighbor_route_reflector_client_cmd
);
13376 install_element(BGP_IPV4L_NODE
, &neighbor_route_reflector_client_cmd
);
13377 install_element(BGP_IPV4L_NODE
,
13378 &no_neighbor_route_reflector_client_cmd
);
13379 install_element(BGP_IPV6_NODE
, &neighbor_route_reflector_client_cmd
);
13380 install_element(BGP_IPV6_NODE
, &no_neighbor_route_reflector_client_cmd
);
13381 install_element(BGP_IPV6M_NODE
, &neighbor_route_reflector_client_cmd
);
13382 install_element(BGP_IPV6M_NODE
,
13383 &no_neighbor_route_reflector_client_cmd
);
13384 install_element(BGP_IPV6L_NODE
, &neighbor_route_reflector_client_cmd
);
13385 install_element(BGP_IPV6L_NODE
,
13386 &no_neighbor_route_reflector_client_cmd
);
13387 install_element(BGP_VPNV4_NODE
, &neighbor_route_reflector_client_cmd
);
13388 install_element(BGP_VPNV4_NODE
,
13389 &no_neighbor_route_reflector_client_cmd
);
13390 install_element(BGP_VPNV6_NODE
, &neighbor_route_reflector_client_cmd
);
13391 install_element(BGP_VPNV6_NODE
,
13392 &no_neighbor_route_reflector_client_cmd
);
13393 install_element(BGP_FLOWSPECV4_NODE
,
13394 &neighbor_route_reflector_client_cmd
);
13395 install_element(BGP_FLOWSPECV4_NODE
,
13396 &no_neighbor_route_reflector_client_cmd
);
13397 install_element(BGP_FLOWSPECV6_NODE
,
13398 &neighbor_route_reflector_client_cmd
);
13399 install_element(BGP_FLOWSPECV6_NODE
,
13400 &no_neighbor_route_reflector_client_cmd
);
13401 install_element(BGP_EVPN_NODE
, &neighbor_route_reflector_client_cmd
);
13402 install_element(BGP_EVPN_NODE
, &no_neighbor_route_reflector_client_cmd
);
13404 /* "neighbor route-server" commands.*/
13405 install_element(BGP_NODE
, &neighbor_route_server_client_hidden_cmd
);
13406 install_element(BGP_NODE
, &no_neighbor_route_server_client_hidden_cmd
);
13407 install_element(BGP_IPV4_NODE
, &neighbor_route_server_client_cmd
);
13408 install_element(BGP_IPV4_NODE
, &no_neighbor_route_server_client_cmd
);
13409 install_element(BGP_IPV4M_NODE
, &neighbor_route_server_client_cmd
);
13410 install_element(BGP_IPV4M_NODE
, &no_neighbor_route_server_client_cmd
);
13411 install_element(BGP_IPV4L_NODE
, &neighbor_route_server_client_cmd
);
13412 install_element(BGP_IPV4L_NODE
, &no_neighbor_route_server_client_cmd
);
13413 install_element(BGP_IPV6_NODE
, &neighbor_route_server_client_cmd
);
13414 install_element(BGP_IPV6_NODE
, &no_neighbor_route_server_client_cmd
);
13415 install_element(BGP_IPV6M_NODE
, &neighbor_route_server_client_cmd
);
13416 install_element(BGP_IPV6M_NODE
, &no_neighbor_route_server_client_cmd
);
13417 install_element(BGP_IPV6L_NODE
, &neighbor_route_server_client_cmd
);
13418 install_element(BGP_IPV6L_NODE
, &no_neighbor_route_server_client_cmd
);
13419 install_element(BGP_VPNV4_NODE
, &neighbor_route_server_client_cmd
);
13420 install_element(BGP_VPNV4_NODE
, &no_neighbor_route_server_client_cmd
);
13421 install_element(BGP_VPNV6_NODE
, &neighbor_route_server_client_cmd
);
13422 install_element(BGP_VPNV6_NODE
, &no_neighbor_route_server_client_cmd
);
13423 install_element(BGP_EVPN_NODE
, &neighbor_route_server_client_cmd
);
13424 install_element(BGP_EVPN_NODE
, &no_neighbor_route_server_client_cmd
);
13425 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_route_server_client_cmd
);
13426 install_element(BGP_FLOWSPECV4_NODE
,
13427 &no_neighbor_route_server_client_cmd
);
13428 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_route_server_client_cmd
);
13429 install_element(BGP_FLOWSPECV6_NODE
,
13430 &no_neighbor_route_server_client_cmd
);
13432 /* "neighbor addpath-tx-all-paths" commands.*/
13433 install_element(BGP_NODE
, &neighbor_addpath_tx_all_paths_hidden_cmd
);
13434 install_element(BGP_NODE
, &no_neighbor_addpath_tx_all_paths_hidden_cmd
);
13435 install_element(BGP_IPV4_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
13436 install_element(BGP_IPV4_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
13437 install_element(BGP_IPV4M_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
13438 install_element(BGP_IPV4M_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
13439 install_element(BGP_IPV4L_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
13440 install_element(BGP_IPV4L_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
13441 install_element(BGP_IPV6_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
13442 install_element(BGP_IPV6_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
13443 install_element(BGP_IPV6M_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
13444 install_element(BGP_IPV6M_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
13445 install_element(BGP_IPV6L_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
13446 install_element(BGP_IPV6L_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
13447 install_element(BGP_VPNV4_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
13448 install_element(BGP_VPNV4_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
13449 install_element(BGP_VPNV6_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
13450 install_element(BGP_VPNV6_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
13452 /* "neighbor addpath-tx-bestpath-per-AS" commands.*/
13453 install_element(BGP_NODE
,
13454 &neighbor_addpath_tx_bestpath_per_as_hidden_cmd
);
13455 install_element(BGP_NODE
,
13456 &no_neighbor_addpath_tx_bestpath_per_as_hidden_cmd
);
13457 install_element(BGP_IPV4_NODE
,
13458 &neighbor_addpath_tx_bestpath_per_as_cmd
);
13459 install_element(BGP_IPV4_NODE
,
13460 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
13461 install_element(BGP_IPV4M_NODE
,
13462 &neighbor_addpath_tx_bestpath_per_as_cmd
);
13463 install_element(BGP_IPV4M_NODE
,
13464 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
13465 install_element(BGP_IPV4L_NODE
,
13466 &neighbor_addpath_tx_bestpath_per_as_cmd
);
13467 install_element(BGP_IPV4L_NODE
,
13468 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
13469 install_element(BGP_IPV6_NODE
,
13470 &neighbor_addpath_tx_bestpath_per_as_cmd
);
13471 install_element(BGP_IPV6_NODE
,
13472 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
13473 install_element(BGP_IPV6M_NODE
,
13474 &neighbor_addpath_tx_bestpath_per_as_cmd
);
13475 install_element(BGP_IPV6M_NODE
,
13476 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
13477 install_element(BGP_IPV6L_NODE
,
13478 &neighbor_addpath_tx_bestpath_per_as_cmd
);
13479 install_element(BGP_IPV6L_NODE
,
13480 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
13481 install_element(BGP_VPNV4_NODE
,
13482 &neighbor_addpath_tx_bestpath_per_as_cmd
);
13483 install_element(BGP_VPNV4_NODE
,
13484 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
13485 install_element(BGP_VPNV6_NODE
,
13486 &neighbor_addpath_tx_bestpath_per_as_cmd
);
13487 install_element(BGP_VPNV6_NODE
,
13488 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
13490 /* "neighbor passive" commands. */
13491 install_element(BGP_NODE
, &neighbor_passive_cmd
);
13492 install_element(BGP_NODE
, &no_neighbor_passive_cmd
);
13495 /* "neighbor shutdown" commands. */
13496 install_element(BGP_NODE
, &neighbor_shutdown_cmd
);
13497 install_element(BGP_NODE
, &no_neighbor_shutdown_cmd
);
13498 install_element(BGP_NODE
, &neighbor_shutdown_msg_cmd
);
13499 install_element(BGP_NODE
, &no_neighbor_shutdown_msg_cmd
);
13501 /* "neighbor capability extended-nexthop" commands.*/
13502 install_element(BGP_NODE
, &neighbor_capability_enhe_cmd
);
13503 install_element(BGP_NODE
, &no_neighbor_capability_enhe_cmd
);
13505 /* "neighbor capability orf prefix-list" commands.*/
13506 install_element(BGP_NODE
, &neighbor_capability_orf_prefix_hidden_cmd
);
13507 install_element(BGP_NODE
,
13508 &no_neighbor_capability_orf_prefix_hidden_cmd
);
13509 install_element(BGP_IPV4_NODE
, &neighbor_capability_orf_prefix_cmd
);
13510 install_element(BGP_IPV4_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
13511 install_element(BGP_IPV4M_NODE
, &neighbor_capability_orf_prefix_cmd
);
13512 install_element(BGP_IPV4M_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
13513 install_element(BGP_IPV4L_NODE
, &neighbor_capability_orf_prefix_cmd
);
13514 install_element(BGP_IPV4L_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
13515 install_element(BGP_IPV6_NODE
, &neighbor_capability_orf_prefix_cmd
);
13516 install_element(BGP_IPV6_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
13517 install_element(BGP_IPV6M_NODE
, &neighbor_capability_orf_prefix_cmd
);
13518 install_element(BGP_IPV6M_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
13519 install_element(BGP_IPV6L_NODE
, &neighbor_capability_orf_prefix_cmd
);
13520 install_element(BGP_IPV6L_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
13522 /* "neighbor capability dynamic" commands.*/
13523 install_element(BGP_NODE
, &neighbor_capability_dynamic_cmd
);
13524 install_element(BGP_NODE
, &no_neighbor_capability_dynamic_cmd
);
13526 /* "neighbor dont-capability-negotiate" commands. */
13527 install_element(BGP_NODE
, &neighbor_dont_capability_negotiate_cmd
);
13528 install_element(BGP_NODE
, &no_neighbor_dont_capability_negotiate_cmd
);
13530 /* "neighbor ebgp-multihop" commands. */
13531 install_element(BGP_NODE
, &neighbor_ebgp_multihop_cmd
);
13532 install_element(BGP_NODE
, &neighbor_ebgp_multihop_ttl_cmd
);
13533 install_element(BGP_NODE
, &no_neighbor_ebgp_multihop_cmd
);
13535 /* "neighbor disable-connected-check" commands. */
13536 install_element(BGP_NODE
, &neighbor_disable_connected_check_cmd
);
13537 install_element(BGP_NODE
, &no_neighbor_disable_connected_check_cmd
);
13539 /* "neighbor enforce-first-as" commands. */
13540 install_element(BGP_NODE
, &neighbor_enforce_first_as_cmd
);
13541 install_element(BGP_NODE
, &no_neighbor_enforce_first_as_cmd
);
13543 /* "neighbor description" commands. */
13544 install_element(BGP_NODE
, &neighbor_description_cmd
);
13545 install_element(BGP_NODE
, &no_neighbor_description_cmd
);
13546 install_element(BGP_NODE
, &no_neighbor_description_comment_cmd
);
13548 /* "neighbor update-source" commands. "*/
13549 install_element(BGP_NODE
, &neighbor_update_source_cmd
);
13550 install_element(BGP_NODE
, &no_neighbor_update_source_cmd
);
13552 /* "neighbor default-originate" commands. */
13553 install_element(BGP_NODE
, &neighbor_default_originate_hidden_cmd
);
13554 install_element(BGP_NODE
, &neighbor_default_originate_rmap_hidden_cmd
);
13555 install_element(BGP_NODE
, &no_neighbor_default_originate_hidden_cmd
);
13556 install_element(BGP_IPV4_NODE
, &neighbor_default_originate_cmd
);
13557 install_element(BGP_IPV4_NODE
, &neighbor_default_originate_rmap_cmd
);
13558 install_element(BGP_IPV4_NODE
, &no_neighbor_default_originate_cmd
);
13559 install_element(BGP_IPV4M_NODE
, &neighbor_default_originate_cmd
);
13560 install_element(BGP_IPV4M_NODE
, &neighbor_default_originate_rmap_cmd
);
13561 install_element(BGP_IPV4M_NODE
, &no_neighbor_default_originate_cmd
);
13562 install_element(BGP_IPV4L_NODE
, &neighbor_default_originate_cmd
);
13563 install_element(BGP_IPV4L_NODE
, &neighbor_default_originate_rmap_cmd
);
13564 install_element(BGP_IPV4L_NODE
, &no_neighbor_default_originate_cmd
);
13565 install_element(BGP_IPV6_NODE
, &neighbor_default_originate_cmd
);
13566 install_element(BGP_IPV6_NODE
, &neighbor_default_originate_rmap_cmd
);
13567 install_element(BGP_IPV6_NODE
, &no_neighbor_default_originate_cmd
);
13568 install_element(BGP_IPV6M_NODE
, &neighbor_default_originate_cmd
);
13569 install_element(BGP_IPV6M_NODE
, &neighbor_default_originate_rmap_cmd
);
13570 install_element(BGP_IPV6M_NODE
, &no_neighbor_default_originate_cmd
);
13571 install_element(BGP_IPV6L_NODE
, &neighbor_default_originate_cmd
);
13572 install_element(BGP_IPV6L_NODE
, &neighbor_default_originate_rmap_cmd
);
13573 install_element(BGP_IPV6L_NODE
, &no_neighbor_default_originate_cmd
);
13575 /* "neighbor port" commands. */
13576 install_element(BGP_NODE
, &neighbor_port_cmd
);
13577 install_element(BGP_NODE
, &no_neighbor_port_cmd
);
13579 /* "neighbor weight" commands. */
13580 install_element(BGP_NODE
, &neighbor_weight_hidden_cmd
);
13581 install_element(BGP_NODE
, &no_neighbor_weight_hidden_cmd
);
13583 install_element(BGP_IPV4_NODE
, &neighbor_weight_cmd
);
13584 install_element(BGP_IPV4_NODE
, &no_neighbor_weight_cmd
);
13585 install_element(BGP_IPV4M_NODE
, &neighbor_weight_cmd
);
13586 install_element(BGP_IPV4M_NODE
, &no_neighbor_weight_cmd
);
13587 install_element(BGP_IPV4L_NODE
, &neighbor_weight_cmd
);
13588 install_element(BGP_IPV4L_NODE
, &no_neighbor_weight_cmd
);
13589 install_element(BGP_IPV6_NODE
, &neighbor_weight_cmd
);
13590 install_element(BGP_IPV6_NODE
, &no_neighbor_weight_cmd
);
13591 install_element(BGP_IPV6M_NODE
, &neighbor_weight_cmd
);
13592 install_element(BGP_IPV6M_NODE
, &no_neighbor_weight_cmd
);
13593 install_element(BGP_IPV6L_NODE
, &neighbor_weight_cmd
);
13594 install_element(BGP_IPV6L_NODE
, &no_neighbor_weight_cmd
);
13595 install_element(BGP_VPNV4_NODE
, &neighbor_weight_cmd
);
13596 install_element(BGP_VPNV4_NODE
, &no_neighbor_weight_cmd
);
13597 install_element(BGP_VPNV6_NODE
, &neighbor_weight_cmd
);
13598 install_element(BGP_VPNV6_NODE
, &no_neighbor_weight_cmd
);
13600 /* "neighbor override-capability" commands. */
13601 install_element(BGP_NODE
, &neighbor_override_capability_cmd
);
13602 install_element(BGP_NODE
, &no_neighbor_override_capability_cmd
);
13604 /* "neighbor strict-capability-match" commands. */
13605 install_element(BGP_NODE
, &neighbor_strict_capability_cmd
);
13606 install_element(BGP_NODE
, &no_neighbor_strict_capability_cmd
);
13608 /* "neighbor timers" commands. */
13609 install_element(BGP_NODE
, &neighbor_timers_cmd
);
13610 install_element(BGP_NODE
, &no_neighbor_timers_cmd
);
13612 /* "neighbor timers connect" commands. */
13613 install_element(BGP_NODE
, &neighbor_timers_connect_cmd
);
13614 install_element(BGP_NODE
, &no_neighbor_timers_connect_cmd
);
13616 /* "neighbor advertisement-interval" commands. */
13617 install_element(BGP_NODE
, &neighbor_advertise_interval_cmd
);
13618 install_element(BGP_NODE
, &no_neighbor_advertise_interval_cmd
);
13620 /* "neighbor interface" commands. */
13621 install_element(BGP_NODE
, &neighbor_interface_cmd
);
13622 install_element(BGP_NODE
, &no_neighbor_interface_cmd
);
13624 /* "neighbor distribute" commands. */
13625 install_element(BGP_NODE
, &neighbor_distribute_list_hidden_cmd
);
13626 install_element(BGP_NODE
, &no_neighbor_distribute_list_hidden_cmd
);
13627 install_element(BGP_IPV4_NODE
, &neighbor_distribute_list_cmd
);
13628 install_element(BGP_IPV4_NODE
, &no_neighbor_distribute_list_cmd
);
13629 install_element(BGP_IPV4M_NODE
, &neighbor_distribute_list_cmd
);
13630 install_element(BGP_IPV4M_NODE
, &no_neighbor_distribute_list_cmd
);
13631 install_element(BGP_IPV4L_NODE
, &neighbor_distribute_list_cmd
);
13632 install_element(BGP_IPV4L_NODE
, &no_neighbor_distribute_list_cmd
);
13633 install_element(BGP_IPV6_NODE
, &neighbor_distribute_list_cmd
);
13634 install_element(BGP_IPV6_NODE
, &no_neighbor_distribute_list_cmd
);
13635 install_element(BGP_IPV6M_NODE
, &neighbor_distribute_list_cmd
);
13636 install_element(BGP_IPV6M_NODE
, &no_neighbor_distribute_list_cmd
);
13637 install_element(BGP_IPV6L_NODE
, &neighbor_distribute_list_cmd
);
13638 install_element(BGP_IPV6L_NODE
, &no_neighbor_distribute_list_cmd
);
13639 install_element(BGP_VPNV4_NODE
, &neighbor_distribute_list_cmd
);
13640 install_element(BGP_VPNV4_NODE
, &no_neighbor_distribute_list_cmd
);
13641 install_element(BGP_VPNV6_NODE
, &neighbor_distribute_list_cmd
);
13642 install_element(BGP_VPNV6_NODE
, &no_neighbor_distribute_list_cmd
);
13644 /* "neighbor prefix-list" commands. */
13645 install_element(BGP_NODE
, &neighbor_prefix_list_hidden_cmd
);
13646 install_element(BGP_NODE
, &no_neighbor_prefix_list_hidden_cmd
);
13647 install_element(BGP_IPV4_NODE
, &neighbor_prefix_list_cmd
);
13648 install_element(BGP_IPV4_NODE
, &no_neighbor_prefix_list_cmd
);
13649 install_element(BGP_IPV4M_NODE
, &neighbor_prefix_list_cmd
);
13650 install_element(BGP_IPV4M_NODE
, &no_neighbor_prefix_list_cmd
);
13651 install_element(BGP_IPV4L_NODE
, &neighbor_prefix_list_cmd
);
13652 install_element(BGP_IPV4L_NODE
, &no_neighbor_prefix_list_cmd
);
13653 install_element(BGP_IPV6_NODE
, &neighbor_prefix_list_cmd
);
13654 install_element(BGP_IPV6_NODE
, &no_neighbor_prefix_list_cmd
);
13655 install_element(BGP_IPV6M_NODE
, &neighbor_prefix_list_cmd
);
13656 install_element(BGP_IPV6M_NODE
, &no_neighbor_prefix_list_cmd
);
13657 install_element(BGP_IPV6L_NODE
, &neighbor_prefix_list_cmd
);
13658 install_element(BGP_IPV6L_NODE
, &no_neighbor_prefix_list_cmd
);
13659 install_element(BGP_VPNV4_NODE
, &neighbor_prefix_list_cmd
);
13660 install_element(BGP_VPNV4_NODE
, &no_neighbor_prefix_list_cmd
);
13661 install_element(BGP_VPNV6_NODE
, &neighbor_prefix_list_cmd
);
13662 install_element(BGP_VPNV6_NODE
, &no_neighbor_prefix_list_cmd
);
13663 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_prefix_list_cmd
);
13664 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_prefix_list_cmd
);
13665 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_prefix_list_cmd
);
13666 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_prefix_list_cmd
);
13668 /* "neighbor filter-list" commands. */
13669 install_element(BGP_NODE
, &neighbor_filter_list_hidden_cmd
);
13670 install_element(BGP_NODE
, &no_neighbor_filter_list_hidden_cmd
);
13671 install_element(BGP_IPV4_NODE
, &neighbor_filter_list_cmd
);
13672 install_element(BGP_IPV4_NODE
, &no_neighbor_filter_list_cmd
);
13673 install_element(BGP_IPV4M_NODE
, &neighbor_filter_list_cmd
);
13674 install_element(BGP_IPV4M_NODE
, &no_neighbor_filter_list_cmd
);
13675 install_element(BGP_IPV4L_NODE
, &neighbor_filter_list_cmd
);
13676 install_element(BGP_IPV4L_NODE
, &no_neighbor_filter_list_cmd
);
13677 install_element(BGP_IPV6_NODE
, &neighbor_filter_list_cmd
);
13678 install_element(BGP_IPV6_NODE
, &no_neighbor_filter_list_cmd
);
13679 install_element(BGP_IPV6M_NODE
, &neighbor_filter_list_cmd
);
13680 install_element(BGP_IPV6M_NODE
, &no_neighbor_filter_list_cmd
);
13681 install_element(BGP_IPV6L_NODE
, &neighbor_filter_list_cmd
);
13682 install_element(BGP_IPV6L_NODE
, &no_neighbor_filter_list_cmd
);
13683 install_element(BGP_VPNV4_NODE
, &neighbor_filter_list_cmd
);
13684 install_element(BGP_VPNV4_NODE
, &no_neighbor_filter_list_cmd
);
13685 install_element(BGP_VPNV6_NODE
, &neighbor_filter_list_cmd
);
13686 install_element(BGP_VPNV6_NODE
, &no_neighbor_filter_list_cmd
);
13687 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_filter_list_cmd
);
13688 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_filter_list_cmd
);
13689 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_filter_list_cmd
);
13690 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_filter_list_cmd
);
13692 /* "neighbor route-map" commands. */
13693 install_element(BGP_NODE
, &neighbor_route_map_hidden_cmd
);
13694 install_element(BGP_NODE
, &no_neighbor_route_map_hidden_cmd
);
13695 install_element(BGP_IPV4_NODE
, &neighbor_route_map_cmd
);
13696 install_element(BGP_IPV4_NODE
, &no_neighbor_route_map_cmd
);
13697 install_element(BGP_IPV4M_NODE
, &neighbor_route_map_cmd
);
13698 install_element(BGP_IPV4M_NODE
, &no_neighbor_route_map_cmd
);
13699 install_element(BGP_IPV4L_NODE
, &neighbor_route_map_cmd
);
13700 install_element(BGP_IPV4L_NODE
, &no_neighbor_route_map_cmd
);
13701 install_element(BGP_IPV6_NODE
, &neighbor_route_map_cmd
);
13702 install_element(BGP_IPV6_NODE
, &no_neighbor_route_map_cmd
);
13703 install_element(BGP_IPV6M_NODE
, &neighbor_route_map_cmd
);
13704 install_element(BGP_IPV6M_NODE
, &no_neighbor_route_map_cmd
);
13705 install_element(BGP_IPV6L_NODE
, &neighbor_route_map_cmd
);
13706 install_element(BGP_IPV6L_NODE
, &no_neighbor_route_map_cmd
);
13707 install_element(BGP_VPNV4_NODE
, &neighbor_route_map_cmd
);
13708 install_element(BGP_VPNV4_NODE
, &no_neighbor_route_map_cmd
);
13709 install_element(BGP_VPNV6_NODE
, &neighbor_route_map_cmd
);
13710 install_element(BGP_VPNV6_NODE
, &no_neighbor_route_map_cmd
);
13711 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_route_map_cmd
);
13712 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_route_map_cmd
);
13713 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_route_map_cmd
);
13714 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_route_map_cmd
);
13715 install_element(BGP_EVPN_NODE
, &neighbor_route_map_cmd
);
13716 install_element(BGP_EVPN_NODE
, &no_neighbor_route_map_cmd
);
13718 /* "neighbor unsuppress-map" commands. */
13719 install_element(BGP_NODE
, &neighbor_unsuppress_map_hidden_cmd
);
13720 install_element(BGP_NODE
, &no_neighbor_unsuppress_map_hidden_cmd
);
13721 install_element(BGP_IPV4_NODE
, &neighbor_unsuppress_map_cmd
);
13722 install_element(BGP_IPV4_NODE
, &no_neighbor_unsuppress_map_cmd
);
13723 install_element(BGP_IPV4M_NODE
, &neighbor_unsuppress_map_cmd
);
13724 install_element(BGP_IPV4M_NODE
, &no_neighbor_unsuppress_map_cmd
);
13725 install_element(BGP_IPV4L_NODE
, &neighbor_unsuppress_map_cmd
);
13726 install_element(BGP_IPV4L_NODE
, &no_neighbor_unsuppress_map_cmd
);
13727 install_element(BGP_IPV6_NODE
, &neighbor_unsuppress_map_cmd
);
13728 install_element(BGP_IPV6_NODE
, &no_neighbor_unsuppress_map_cmd
);
13729 install_element(BGP_IPV6M_NODE
, &neighbor_unsuppress_map_cmd
);
13730 install_element(BGP_IPV6M_NODE
, &no_neighbor_unsuppress_map_cmd
);
13731 install_element(BGP_IPV6L_NODE
, &neighbor_unsuppress_map_cmd
);
13732 install_element(BGP_IPV6L_NODE
, &no_neighbor_unsuppress_map_cmd
);
13733 install_element(BGP_VPNV4_NODE
, &neighbor_unsuppress_map_cmd
);
13734 install_element(BGP_VPNV4_NODE
, &no_neighbor_unsuppress_map_cmd
);
13735 install_element(BGP_VPNV6_NODE
, &neighbor_unsuppress_map_cmd
);
13736 install_element(BGP_VPNV6_NODE
, &no_neighbor_unsuppress_map_cmd
);
13738 /* "neighbor maximum-prefix" commands. */
13739 install_element(BGP_NODE
, &neighbor_maximum_prefix_hidden_cmd
);
13740 install_element(BGP_NODE
,
13741 &neighbor_maximum_prefix_threshold_hidden_cmd
);
13742 install_element(BGP_NODE
, &neighbor_maximum_prefix_warning_hidden_cmd
);
13743 install_element(BGP_NODE
,
13744 &neighbor_maximum_prefix_threshold_warning_hidden_cmd
);
13745 install_element(BGP_NODE
, &neighbor_maximum_prefix_restart_hidden_cmd
);
13746 install_element(BGP_NODE
,
13747 &neighbor_maximum_prefix_threshold_restart_hidden_cmd
);
13748 install_element(BGP_NODE
, &no_neighbor_maximum_prefix_hidden_cmd
);
13749 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_cmd
);
13750 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13751 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13752 install_element(BGP_IPV4_NODE
,
13753 &neighbor_maximum_prefix_threshold_warning_cmd
);
13754 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13755 install_element(BGP_IPV4_NODE
,
13756 &neighbor_maximum_prefix_threshold_restart_cmd
);
13757 install_element(BGP_IPV4_NODE
, &no_neighbor_maximum_prefix_cmd
);
13758 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_cmd
);
13759 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13760 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13761 install_element(BGP_IPV4M_NODE
,
13762 &neighbor_maximum_prefix_threshold_warning_cmd
);
13763 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13764 install_element(BGP_IPV4M_NODE
,
13765 &neighbor_maximum_prefix_threshold_restart_cmd
);
13766 install_element(BGP_IPV4M_NODE
, &no_neighbor_maximum_prefix_cmd
);
13767 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_cmd
);
13768 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13769 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13770 install_element(BGP_IPV4L_NODE
,
13771 &neighbor_maximum_prefix_threshold_warning_cmd
);
13772 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13773 install_element(BGP_IPV4L_NODE
,
13774 &neighbor_maximum_prefix_threshold_restart_cmd
);
13775 install_element(BGP_IPV4L_NODE
, &no_neighbor_maximum_prefix_cmd
);
13776 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_cmd
);
13777 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13778 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13779 install_element(BGP_IPV6_NODE
,
13780 &neighbor_maximum_prefix_threshold_warning_cmd
);
13781 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13782 install_element(BGP_IPV6_NODE
,
13783 &neighbor_maximum_prefix_threshold_restart_cmd
);
13784 install_element(BGP_IPV6_NODE
, &no_neighbor_maximum_prefix_cmd
);
13785 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_cmd
);
13786 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13787 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13788 install_element(BGP_IPV6M_NODE
,
13789 &neighbor_maximum_prefix_threshold_warning_cmd
);
13790 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13791 install_element(BGP_IPV6M_NODE
,
13792 &neighbor_maximum_prefix_threshold_restart_cmd
);
13793 install_element(BGP_IPV6M_NODE
, &no_neighbor_maximum_prefix_cmd
);
13794 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_cmd
);
13795 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13796 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13797 install_element(BGP_IPV6L_NODE
,
13798 &neighbor_maximum_prefix_threshold_warning_cmd
);
13799 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13800 install_element(BGP_IPV6L_NODE
,
13801 &neighbor_maximum_prefix_threshold_restart_cmd
);
13802 install_element(BGP_IPV6L_NODE
, &no_neighbor_maximum_prefix_cmd
);
13803 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_cmd
);
13804 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13805 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13806 install_element(BGP_VPNV4_NODE
,
13807 &neighbor_maximum_prefix_threshold_warning_cmd
);
13808 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13809 install_element(BGP_VPNV4_NODE
,
13810 &neighbor_maximum_prefix_threshold_restart_cmd
);
13811 install_element(BGP_VPNV4_NODE
, &no_neighbor_maximum_prefix_cmd
);
13812 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_cmd
);
13813 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13814 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13815 install_element(BGP_VPNV6_NODE
,
13816 &neighbor_maximum_prefix_threshold_warning_cmd
);
13817 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13818 install_element(BGP_VPNV6_NODE
,
13819 &neighbor_maximum_prefix_threshold_restart_cmd
);
13820 install_element(BGP_VPNV6_NODE
, &no_neighbor_maximum_prefix_cmd
);
13822 /* "neighbor allowas-in" */
13823 install_element(BGP_NODE
, &neighbor_allowas_in_hidden_cmd
);
13824 install_element(BGP_NODE
, &no_neighbor_allowas_in_hidden_cmd
);
13825 install_element(BGP_IPV4_NODE
, &neighbor_allowas_in_cmd
);
13826 install_element(BGP_IPV4_NODE
, &no_neighbor_allowas_in_cmd
);
13827 install_element(BGP_IPV4M_NODE
, &neighbor_allowas_in_cmd
);
13828 install_element(BGP_IPV4M_NODE
, &no_neighbor_allowas_in_cmd
);
13829 install_element(BGP_IPV4L_NODE
, &neighbor_allowas_in_cmd
);
13830 install_element(BGP_IPV4L_NODE
, &no_neighbor_allowas_in_cmd
);
13831 install_element(BGP_IPV6_NODE
, &neighbor_allowas_in_cmd
);
13832 install_element(BGP_IPV6_NODE
, &no_neighbor_allowas_in_cmd
);
13833 install_element(BGP_IPV6M_NODE
, &neighbor_allowas_in_cmd
);
13834 install_element(BGP_IPV6M_NODE
, &no_neighbor_allowas_in_cmd
);
13835 install_element(BGP_IPV6L_NODE
, &neighbor_allowas_in_cmd
);
13836 install_element(BGP_IPV6L_NODE
, &no_neighbor_allowas_in_cmd
);
13837 install_element(BGP_VPNV4_NODE
, &neighbor_allowas_in_cmd
);
13838 install_element(BGP_VPNV4_NODE
, &no_neighbor_allowas_in_cmd
);
13839 install_element(BGP_VPNV6_NODE
, &neighbor_allowas_in_cmd
);
13840 install_element(BGP_VPNV6_NODE
, &no_neighbor_allowas_in_cmd
);
13841 install_element(BGP_EVPN_NODE
, &neighbor_allowas_in_cmd
);
13842 install_element(BGP_EVPN_NODE
, &no_neighbor_allowas_in_cmd
);
13844 /* address-family commands. */
13845 install_element(BGP_NODE
, &address_family_ipv4_safi_cmd
);
13846 install_element(BGP_NODE
, &address_family_ipv6_safi_cmd
);
13847 #ifdef KEEP_OLD_VPN_COMMANDS
13848 install_element(BGP_NODE
, &address_family_vpnv4_cmd
);
13849 install_element(BGP_NODE
, &address_family_vpnv6_cmd
);
13850 #endif /* KEEP_OLD_VPN_COMMANDS */
13852 install_element(BGP_NODE
, &address_family_evpn_cmd
);
13854 /* "exit-address-family" command. */
13855 install_element(BGP_IPV4_NODE
, &exit_address_family_cmd
);
13856 install_element(BGP_IPV4M_NODE
, &exit_address_family_cmd
);
13857 install_element(BGP_IPV4L_NODE
, &exit_address_family_cmd
);
13858 install_element(BGP_IPV6_NODE
, &exit_address_family_cmd
);
13859 install_element(BGP_IPV6M_NODE
, &exit_address_family_cmd
);
13860 install_element(BGP_IPV6L_NODE
, &exit_address_family_cmd
);
13861 install_element(BGP_VPNV4_NODE
, &exit_address_family_cmd
);
13862 install_element(BGP_VPNV6_NODE
, &exit_address_family_cmd
);
13863 install_element(BGP_FLOWSPECV4_NODE
, &exit_address_family_cmd
);
13864 install_element(BGP_FLOWSPECV6_NODE
, &exit_address_family_cmd
);
13865 install_element(BGP_EVPN_NODE
, &exit_address_family_cmd
);
13867 /* "clear ip bgp commands" */
13868 install_element(ENABLE_NODE
, &clear_ip_bgp_all_cmd
);
13870 /* clear ip bgp prefix */
13871 install_element(ENABLE_NODE
, &clear_ip_bgp_prefix_cmd
);
13872 install_element(ENABLE_NODE
, &clear_bgp_ipv6_safi_prefix_cmd
);
13873 install_element(ENABLE_NODE
, &clear_bgp_instance_ipv6_safi_prefix_cmd
);
13875 /* "show [ip] bgp summary" commands. */
13876 install_element(VIEW_NODE
, &show_bgp_instance_all_ipv6_updgrps_cmd
);
13877 install_element(VIEW_NODE
, &show_bgp_l2vpn_evpn_updgrps_cmd
);
13878 install_element(VIEW_NODE
, &show_bgp_instance_updgrps_stats_cmd
);
13879 install_element(VIEW_NODE
, &show_bgp_updgrps_stats_cmd
);
13880 install_element(VIEW_NODE
, &show_ip_bgp_instance_updgrps_adj_s_cmd
);
13881 install_element(VIEW_NODE
, &show_ip_bgp_summary_cmd
);
13882 install_element(VIEW_NODE
, &show_ip_bgp_updgrps_cmd
);
13884 /* "show [ip] bgp neighbors" commands. */
13885 install_element(VIEW_NODE
, &show_ip_bgp_neighbors_cmd
);
13887 /* "show [ip] bgp peer-group" commands. */
13888 install_element(VIEW_NODE
, &show_ip_bgp_peer_groups_cmd
);
13890 /* "show [ip] bgp paths" commands. */
13891 install_element(VIEW_NODE
, &show_ip_bgp_paths_cmd
);
13893 /* "show [ip] bgp community" commands. */
13894 install_element(VIEW_NODE
, &show_ip_bgp_community_info_cmd
);
13896 /* "show ip bgp large-community" commands. */
13897 install_element(VIEW_NODE
, &show_ip_bgp_lcommunity_info_cmd
);
13898 /* "show [ip] bgp attribute-info" commands. */
13899 install_element(VIEW_NODE
, &show_ip_bgp_attr_info_cmd
);
13900 /* "show [ip] bgp route-leak" command */
13901 install_element(VIEW_NODE
, &show_ip_bgp_route_leak_cmd
);
13903 /* "redistribute" commands. */
13904 install_element(BGP_NODE
, &bgp_redistribute_ipv4_hidden_cmd
);
13905 install_element(BGP_NODE
, &no_bgp_redistribute_ipv4_hidden_cmd
);
13906 install_element(BGP_NODE
, &bgp_redistribute_ipv4_rmap_hidden_cmd
);
13907 install_element(BGP_NODE
, &bgp_redistribute_ipv4_metric_hidden_cmd
);
13908 install_element(BGP_NODE
,
13909 &bgp_redistribute_ipv4_rmap_metric_hidden_cmd
);
13910 install_element(BGP_NODE
,
13911 &bgp_redistribute_ipv4_metric_rmap_hidden_cmd
);
13912 install_element(BGP_NODE
, &bgp_redistribute_ipv4_ospf_hidden_cmd
);
13913 install_element(BGP_NODE
, &no_bgp_redistribute_ipv4_ospf_hidden_cmd
);
13914 install_element(BGP_NODE
, &bgp_redistribute_ipv4_ospf_rmap_hidden_cmd
);
13915 install_element(BGP_NODE
,
13916 &bgp_redistribute_ipv4_ospf_metric_hidden_cmd
);
13917 install_element(BGP_NODE
,
13918 &bgp_redistribute_ipv4_ospf_rmap_metric_hidden_cmd
);
13919 install_element(BGP_NODE
,
13920 &bgp_redistribute_ipv4_ospf_metric_rmap_hidden_cmd
);
13921 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_cmd
);
13922 install_element(BGP_IPV4_NODE
, &no_bgp_redistribute_ipv4_cmd
);
13923 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_rmap_cmd
);
13924 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_metric_cmd
);
13925 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_rmap_metric_cmd
);
13926 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_metric_rmap_cmd
);
13927 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_ospf_cmd
);
13928 install_element(BGP_IPV4_NODE
, &no_bgp_redistribute_ipv4_ospf_cmd
);
13929 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_ospf_rmap_cmd
);
13930 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_ospf_metric_cmd
);
13931 install_element(BGP_IPV4_NODE
,
13932 &bgp_redistribute_ipv4_ospf_rmap_metric_cmd
);
13933 install_element(BGP_IPV4_NODE
,
13934 &bgp_redistribute_ipv4_ospf_metric_rmap_cmd
);
13935 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_cmd
);
13936 install_element(BGP_IPV6_NODE
, &no_bgp_redistribute_ipv6_cmd
);
13937 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_rmap_cmd
);
13938 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_metric_cmd
);
13939 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_rmap_metric_cmd
);
13940 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_metric_rmap_cmd
);
13942 /* import|export vpn [route-map WORD] */
13943 install_element(BGP_IPV4_NODE
, &bgp_imexport_vpn_cmd
);
13944 install_element(BGP_IPV6_NODE
, &bgp_imexport_vpn_cmd
);
13946 install_element(BGP_IPV4_NODE
, &bgp_imexport_vrf_cmd
);
13947 install_element(BGP_IPV6_NODE
, &bgp_imexport_vrf_cmd
);
13949 /* ttl_security commands */
13950 install_element(BGP_NODE
, &neighbor_ttl_security_cmd
);
13951 install_element(BGP_NODE
, &no_neighbor_ttl_security_cmd
);
13953 /* "show [ip] bgp memory" commands. */
13954 install_element(VIEW_NODE
, &show_bgp_memory_cmd
);
13956 /* "show bgp martian next-hop" */
13957 install_element(VIEW_NODE
, &show_bgp_martian_nexthop_db_cmd
);
13959 install_element(VIEW_NODE
, &show_bgp_mac_hash_cmd
);
13961 /* "show [ip] bgp views" commands. */
13962 install_element(VIEW_NODE
, &show_bgp_views_cmd
);
13964 /* "show [ip] bgp vrfs" commands. */
13965 install_element(VIEW_NODE
, &show_bgp_vrfs_cmd
);
13967 /* Community-list. */
13968 community_list_vty();
13970 /* vpn-policy commands */
13971 install_element(BGP_IPV4_NODE
, &af_rd_vpn_export_cmd
);
13972 install_element(BGP_IPV6_NODE
, &af_rd_vpn_export_cmd
);
13973 install_element(BGP_IPV4_NODE
, &af_label_vpn_export_cmd
);
13974 install_element(BGP_IPV6_NODE
, &af_label_vpn_export_cmd
);
13975 install_element(BGP_IPV4_NODE
, &af_nexthop_vpn_export_cmd
);
13976 install_element(BGP_IPV6_NODE
, &af_nexthop_vpn_export_cmd
);
13977 install_element(BGP_IPV4_NODE
, &af_rt_vpn_imexport_cmd
);
13978 install_element(BGP_IPV6_NODE
, &af_rt_vpn_imexport_cmd
);
13979 install_element(BGP_IPV4_NODE
, &af_route_map_vpn_imexport_cmd
);
13980 install_element(BGP_IPV6_NODE
, &af_route_map_vpn_imexport_cmd
);
13981 install_element(BGP_IPV4_NODE
, &af_import_vrf_route_map_cmd
);
13982 install_element(BGP_IPV6_NODE
, &af_import_vrf_route_map_cmd
);
13984 install_element(BGP_IPV4_NODE
, &af_routetarget_import_cmd
);
13985 install_element(BGP_IPV6_NODE
, &af_routetarget_import_cmd
);
13987 install_element(BGP_IPV4_NODE
, &af_no_rd_vpn_export_cmd
);
13988 install_element(BGP_IPV6_NODE
, &af_no_rd_vpn_export_cmd
);
13989 install_element(BGP_IPV4_NODE
, &af_no_label_vpn_export_cmd
);
13990 install_element(BGP_IPV6_NODE
, &af_no_label_vpn_export_cmd
);
13991 install_element(BGP_IPV4_NODE
, &af_no_nexthop_vpn_export_cmd
);
13992 install_element(BGP_IPV6_NODE
, &af_no_nexthop_vpn_export_cmd
);
13993 install_element(BGP_IPV4_NODE
, &af_no_rt_vpn_imexport_cmd
);
13994 install_element(BGP_IPV6_NODE
, &af_no_rt_vpn_imexport_cmd
);
13995 install_element(BGP_IPV4_NODE
, &af_no_route_map_vpn_imexport_cmd
);
13996 install_element(BGP_IPV6_NODE
, &af_no_route_map_vpn_imexport_cmd
);
13997 install_element(BGP_IPV4_NODE
, &af_no_import_vrf_route_map_cmd
);
13998 install_element(BGP_IPV6_NODE
, &af_no_import_vrf_route_map_cmd
);
14001 #include "memory.h"
14002 #include "bgp_regex.h"
14003 #include "bgp_clist.h"
14004 #include "bgp_ecommunity.h"
14006 /* VTY functions. */
14008 /* Direction value to string conversion. */
14009 static const char *community_direct_str(int direct
)
14012 case COMMUNITY_DENY
:
14014 case COMMUNITY_PERMIT
:
14021 /* Display error string. */
14022 static void community_list_perror(struct vty
*vty
, int ret
)
14025 case COMMUNITY_LIST_ERR_CANT_FIND_LIST
:
14026 vty_out(vty
, "%% Can't find community-list\n");
14028 case COMMUNITY_LIST_ERR_MALFORMED_VAL
:
14029 vty_out(vty
, "%% Malformed community-list value\n");
14031 case COMMUNITY_LIST_ERR_STANDARD_CONFLICT
:
14033 "%% Community name conflict, previously defined as standard community\n");
14035 case COMMUNITY_LIST_ERR_EXPANDED_CONFLICT
:
14037 "%% Community name conflict, previously defined as expanded community\n");
14042 /* "community-list" keyword help string. */
14043 #define COMMUNITY_LIST_STR "Add a community list entry\n"
14045 /*community-list standard */
14046 DEFUN (community_list_standard
,
14047 bgp_community_list_standard_cmd
,
14048 "bgp community-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
14051 "Community list number (standard)\n"
14052 "Add an standard community-list entry\n"
14053 "Community list name\n"
14054 "Specify community to reject\n"
14055 "Specify community to accept\n"
14058 char *cl_name_or_number
= NULL
;
14060 int style
= COMMUNITY_LIST_STANDARD
;
14064 if (argv_find(argv
, argc
, "ip", &idx
)) {
14065 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
14066 vty_out(vty
, "if you are using this please migrate to the below command.\n");
14067 vty_out(vty
, "'bgp community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> AA:NN'\n");
14068 zlog_warn("Deprecated option: 'ip community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> AA:NN' being used");
14071 argv_find(argv
, argc
, "(1-99)", &idx
);
14072 argv_find(argv
, argc
, "WORD", &idx
);
14073 cl_name_or_number
= argv
[idx
]->arg
;
14074 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
14076 argv_find(argv
, argc
, "AA:NN", &idx
);
14077 char *str
= argv_concat(argv
, argc
, idx
);
14079 int ret
= community_list_set(bgp_clist
, cl_name_or_number
, str
, direct
,
14082 XFREE(MTYPE_TMP
, str
);
14085 /* Display error string. */
14086 community_list_perror(vty
, ret
);
14087 return CMD_WARNING_CONFIG_FAILED
;
14090 return CMD_SUCCESS
;
14093 #if CONFDATE > 20191005
14094 CPP_NOTICE("bgpd: remove deprecated 'ip community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> AA:NN' command")
14096 ALIAS (community_list_standard
,
14097 ip_community_list_standard_cmd
,
14098 "ip community-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
14101 "Community list number (standard)\n"
14102 "Add an standard community-list entry\n"
14103 "Community list name\n"
14104 "Specify community to reject\n"
14105 "Specify community to accept\n"
14108 DEFUN (no_community_list_standard_all
,
14109 no_bgp_community_list_standard_all_cmd
,
14110 "no bgp community-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
14114 "Community list number (standard)\n"
14115 "Add an standard community-list entry\n"
14116 "Community list name\n"
14117 "Specify community to reject\n"
14118 "Specify community to accept\n"
14121 char *cl_name_or_number
= NULL
;
14124 int style
= COMMUNITY_LIST_STANDARD
;
14128 if (argv_find(argv
, argc
, "ip", &idx
)) {
14129 vty_out(vty
, "This config option is deprecated, and is scheduled for removal\n");
14130 vty_out(vty
, "if you are using this please migrate to the below command.\n");
14131 vty_out(vty
, "'no bgp community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> AA:NN'\n");
14132 zlog_warn("Deprecated option: 'no ip community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> |AA:NN' being used");
14135 argv_find(argv
, argc
, "permit", &idx
);
14136 argv_find(argv
, argc
, "deny", &idx
);
14139 direct
= argv_find(argv
, argc
, "permit", &idx
)
14144 argv_find(argv
, argc
, "AA:NN", &idx
);
14145 str
= argv_concat(argv
, argc
, idx
);
14149 argv_find(argv
, argc
, "(1-99)", &idx
);
14150 argv_find(argv
, argc
, "WORD", &idx
);
14151 cl_name_or_number
= argv
[idx
]->arg
;
14153 int ret
= community_list_unset(bgp_clist
, cl_name_or_number
, str
,
14156 XFREE(MTYPE_TMP
, str
);
14159 community_list_perror(vty
, ret
);
14160 return CMD_WARNING_CONFIG_FAILED
;
14163 return CMD_SUCCESS
;
14165 ALIAS (no_community_list_standard_all
,
14166 no_ip_community_list_standard_all_cmd
,
14167 "no ip community-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
14171 "Community list number (standard)\n"
14172 "Add an standard community-list entry\n"
14173 "Community list name\n"
14174 "Specify community to reject\n"
14175 "Specify community to accept\n"
14178 ALIAS(no_community_list_standard_all
, no_bgp_community_list_standard_all_list_cmd
,
14179 "no bgp community-list <(1-99)|standard WORD>",
14180 NO_STR BGP_STR COMMUNITY_LIST_STR
14181 "Community list number (standard)\n"
14182 "Add an standard community-list entry\n"
14183 "Community list name\n")
14185 ALIAS(no_community_list_standard_all
, no_ip_community_list_standard_all_list_cmd
,
14186 "no ip community-list <(1-99)|standard WORD>",
14187 NO_STR BGP_STR COMMUNITY_LIST_STR
14188 "Community list number (standard)\n"
14189 "Add an standard community-list entry\n"
14190 "Community list name\n")
14192 /*community-list expanded */
14193 DEFUN (community_list_expanded_all
,
14194 bgp_community_list_expanded_all_cmd
,
14195 "bgp community-list <(100-500)|expanded WORD> <deny|permit> AA:NN...",
14198 "Community list number (expanded)\n"
14199 "Add an expanded community-list entry\n"
14200 "Community list name\n"
14201 "Specify community to reject\n"
14202 "Specify community to accept\n"
14205 char *cl_name_or_number
= NULL
;
14207 int style
= COMMUNITY_LIST_EXPANDED
;
14210 if (argv_find(argv
, argc
, "ip", &idx
)) {
14211 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
14212 vty_out(vty
, "if you are using this please migrate to the below command.\n");
14213 vty_out(vty
, "'bgp community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> AA:NN'\n");
14214 zlog_warn("Deprecated option: 'ip community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> AA:NN' being used");
14216 argv_find(argv
, argc
, "(100-500)", &idx
);
14217 argv_find(argv
, argc
, "WORD", &idx
);
14218 cl_name_or_number
= argv
[idx
]->arg
;
14219 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
14221 argv_find(argv
, argc
, "AA:NN", &idx
);
14222 char *str
= argv_concat(argv
, argc
, idx
);
14224 int ret
= community_list_set(bgp_clist
, cl_name_or_number
, str
, direct
,
14227 XFREE(MTYPE_TMP
, str
);
14230 /* Display error string. */
14231 community_list_perror(vty
, ret
);
14232 return CMD_WARNING_CONFIG_FAILED
;
14235 return CMD_SUCCESS
;
14238 ALIAS (community_list_expanded_all
,
14239 ip_community_list_expanded_all_cmd
,
14240 "ip community-list <(100-500)|expanded WORD> <deny|permit> AA:NN...",
14243 "Community list number (expanded)\n"
14244 "Add an expanded community-list entry\n"
14245 "Community list name\n"
14246 "Specify community to reject\n"
14247 "Specify community to accept\n"
14250 DEFUN (no_community_list_expanded_all
,
14251 no_bgp_community_list_expanded_all_cmd
,
14252 "no bgp community-list <(100-500)|expanded WORD> <deny|permit> AA:NN...",
14256 "Community list number (expanded)\n"
14257 "Add an expanded community-list entry\n"
14258 "Community list name\n"
14259 "Specify community to reject\n"
14260 "Specify community to accept\n"
14263 char *cl_name_or_number
= NULL
;
14266 int style
= COMMUNITY_LIST_EXPANDED
;
14269 if (argv_find(argv
, argc
, "ip", &idx
)) {
14270 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
14271 vty_out(vty
, "if you are using this please migrate to the below command.\n");
14272 vty_out(vty
, "'no bgp community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> AA:NN'\n");
14273 zlog_warn("Deprecated option: 'no ip community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> AA:NN' being used");
14277 argv_find(argv
, argc
, "permit", &idx
);
14278 argv_find(argv
, argc
, "deny", &idx
);
14281 direct
= argv_find(argv
, argc
, "permit", &idx
)
14286 argv_find(argv
, argc
, "AA:NN", &idx
);
14287 str
= argv_concat(argv
, argc
, idx
);
14291 argv_find(argv
, argc
, "(100-500)", &idx
);
14292 argv_find(argv
, argc
, "WORD", &idx
);
14293 cl_name_or_number
= argv
[idx
]->arg
;
14295 int ret
= community_list_unset(bgp_clist
, cl_name_or_number
, str
,
14298 XFREE(MTYPE_TMP
, str
);
14301 community_list_perror(vty
, ret
);
14302 return CMD_WARNING_CONFIG_FAILED
;
14305 return CMD_SUCCESS
;
14308 ALIAS (no_community_list_expanded_all
,
14309 no_ip_community_list_expanded_all_cmd
,
14310 "no ip community-list <(100-500)|expanded WORD> <deny|permit> AA:NN...",
14314 "Community list number (expanded)\n"
14315 "Add an expanded community-list entry\n"
14316 "Community list name\n"
14317 "Specify community to reject\n"
14318 "Specify community to accept\n"
14321 ALIAS(no_community_list_expanded_all
, no_bgp_community_list_expanded_all_list_cmd
,
14322 "no bgp community-list <(100-500)|expanded WORD>",
14323 NO_STR IP_STR COMMUNITY_LIST_STR
14324 "Community list number (expanded)\n"
14325 "Add an expanded community-list entry\n"
14326 "Community list name\n")
14328 ALIAS(no_community_list_expanded_all
, no_ip_community_list_expanded_all_list_cmd
,
14329 "no ip community-list <(100-500)|expanded WORD>",
14330 NO_STR IP_STR COMMUNITY_LIST_STR
14331 "Community list number (expanded)\n"
14332 "Add an expanded community-list entry\n"
14333 "Community list name\n")
14335 /* Return configuration string of community-list entry. */
14336 static const char *community_list_config_str(struct community_entry
*entry
)
14343 if (entry
->style
== COMMUNITY_LIST_STANDARD
)
14344 str
= community_str(entry
->u
.com
, false);
14345 else if (entry
->style
== LARGE_COMMUNITY_LIST_STANDARD
)
14346 str
= lcommunity_str(entry
->u
.lcom
, false);
14348 str
= entry
->config
;
14353 static void community_list_show(struct vty
*vty
, struct community_list
*list
)
14355 struct community_entry
*entry
;
14357 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
14358 if (entry
== list
->head
) {
14359 if (all_digit(list
->name
))
14360 vty_out(vty
, "Community %s list %s\n",
14361 entry
->style
== COMMUNITY_LIST_STANDARD
14363 : "(expanded) access",
14366 vty_out(vty
, "Named Community %s list %s\n",
14367 entry
->style
== COMMUNITY_LIST_STANDARD
14373 vty_out(vty
, " %s\n",
14374 community_direct_str(entry
->direct
));
14376 vty_out(vty
, " %s %s\n",
14377 community_direct_str(entry
->direct
),
14378 community_list_config_str(entry
));
14382 DEFUN (show_community_list
,
14383 show_bgp_community_list_cmd
,
14384 "show bgp community-list",
14387 "List community-list\n")
14389 struct community_list
*list
;
14390 struct community_list_master
*cm
;
14393 if (argv_find(argv
, argc
, "ip", &idx
)) {
14394 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
14395 vty_out(vty
, "if you are using this please migrate to the below command.\n");
14396 vty_out(vty
, "'show bgp community-list <(1-500)|WORD>'\n");
14397 zlog_warn("Deprecated option: 'ip show community-list <(1-500)|WORD>' being used");
14399 cm
= community_list_master_lookup(bgp_clist
, COMMUNITY_LIST_MASTER
);
14401 return CMD_SUCCESS
;
14403 for (list
= cm
->num
.head
; list
; list
= list
->next
)
14404 community_list_show(vty
, list
);
14406 for (list
= cm
->str
.head
; list
; list
= list
->next
)
14407 community_list_show(vty
, list
);
14409 return CMD_SUCCESS
;
14412 ALIAS (show_community_list
,
14413 show_ip_community_list_cmd
,
14414 "show ip community-list",
14417 "List community-list\n")
14419 DEFUN (show_community_list_arg
,
14420 show_bgp_community_list_arg_cmd
,
14421 "show bgp community-list <(1-500)|WORD>",
14424 "List community-list\n"
14425 "Community-list number\n"
14426 "Community-list name\n")
14428 int idx_comm_list
= 3;
14429 struct community_list
*list
;
14432 if (argv_find(argv
, argc
, "ip", &idx
)) {
14433 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
14434 vty_out(vty
, "if you are using this please migrate to the below command.\n");
14435 vty_out(vty
, "'show bgp community-list <(1-500)|WORD>'\n");
14436 zlog_warn("Deprecated option: 'ip show community-list <(1-500)|WORD>' being used");
14438 list
= community_list_lookup(bgp_clist
, argv
[idx_comm_list
]->arg
, 0,
14439 COMMUNITY_LIST_MASTER
);
14441 vty_out(vty
, "%% Can't find community-list\n");
14442 return CMD_WARNING
;
14445 community_list_show(vty
, list
);
14447 return CMD_SUCCESS
;
14450 ALIAS (show_community_list_arg
,
14451 show_ip_community_list_arg_cmd
,
14452 "show ip community-list <(1-500)|WORD>",
14455 "List community-list\n"
14456 "Community-list number\n"
14457 "Community-list name\n")
14460 * Large Community code.
14462 static int lcommunity_list_set_vty(struct vty
*vty
, int argc
,
14463 struct cmd_token
**argv
, int style
,
14464 int reject_all_digit_name
)
14472 if (argv_find(argv
, argc
, "ip", &idx
)) {
14473 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
14474 vty_out(vty
, "if you are using this please migrate to the below command.\n");
14475 vty_out(vty
, "'bgp large-community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:BB:CC>'\n");
14476 zlog_warn("Deprecated option: 'large-community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:BB:CC>' being used");
14478 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
14481 /* All digit name check. */
14483 argv_find(argv
, argc
, "WORD", &idx
);
14484 argv_find(argv
, argc
, "(1-99)", &idx
);
14485 argv_find(argv
, argc
, "(100-500)", &idx
);
14486 cl_name
= argv
[idx
]->arg
;
14487 if (reject_all_digit_name
&& all_digit(cl_name
)) {
14488 vty_out(vty
, "%% Community name cannot have all digits\n");
14489 return CMD_WARNING_CONFIG_FAILED
;
14493 argv_find(argv
, argc
, "AA:BB:CC", &idx
);
14494 argv_find(argv
, argc
, "LINE", &idx
);
14495 /* Concat community string argument. */
14497 str
= argv_concat(argv
, argc
, idx
);
14501 ret
= lcommunity_list_set(bgp_clist
, cl_name
, str
, direct
, style
);
14503 /* Free temporary community list string allocated by
14505 XFREE(MTYPE_TMP
, str
);
14508 community_list_perror(vty
, ret
);
14509 return CMD_WARNING_CONFIG_FAILED
;
14511 return CMD_SUCCESS
;
14514 static int lcommunity_list_unset_vty(struct vty
*vty
, int argc
,
14515 struct cmd_token
**argv
, int style
)
14522 if (argv_find(argv
, argc
, "ip", &idx
)) {
14523 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
14524 vty_out(vty
, "if you are using this please migrate to the below command.\n");
14525 vty_out(vty
, "'no bgp large-community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:BB:CC>'\n");
14526 zlog_warn("Deprecated option: 'no ip large-community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:BB:CC>' being used");
14528 argv_find(argv
, argc
, "permit", &idx
);
14529 argv_find(argv
, argc
, "deny", &idx
);
14532 /* Check the list direct. */
14533 if (strncmp(argv
[idx
]->arg
, "p", 1) == 0)
14534 direct
= COMMUNITY_PERMIT
;
14536 direct
= COMMUNITY_DENY
;
14539 argv_find(argv
, argc
, "LINE", &idx
);
14540 argv_find(argv
, argc
, "AA:AA:NN", &idx
);
14541 /* Concat community string argument. */
14542 str
= argv_concat(argv
, argc
, idx
);
14546 argv_find(argv
, argc
, "(1-99)", &idx
);
14547 argv_find(argv
, argc
, "(100-500)", &idx
);
14548 argv_find(argv
, argc
, "WORD", &idx
);
14550 /* Unset community list. */
14551 ret
= lcommunity_list_unset(bgp_clist
, argv
[idx
]->arg
, str
, direct
,
14554 /* Free temporary community list string allocated by
14556 XFREE(MTYPE_TMP
, str
);
14559 community_list_perror(vty
, ret
);
14560 return CMD_WARNING_CONFIG_FAILED
;
14563 return CMD_SUCCESS
;
14566 /* "large-community-list" keyword help string. */
14567 #define LCOMMUNITY_LIST_STR "Add a large community list entry\n"
14568 #define LCOMMUNITY_VAL_STR "large community in 'aa:bb:cc' format\n"
14570 #if CONFDATE > 20191005
14571 CPP_NOTICE("bgpd: remove deprecated 'ip large-community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:BB:CC>' command")
14573 DEFUN (lcommunity_list_standard
,
14574 bgp_lcommunity_list_standard_cmd
,
14575 "bgp large-community-list (1-99) <deny|permit>",
14577 LCOMMUNITY_LIST_STR
14578 "Large Community list number (standard)\n"
14579 "Specify large community to reject\n"
14580 "Specify large community to accept\n")
14582 return lcommunity_list_set_vty(vty
, argc
, argv
,
14583 LARGE_COMMUNITY_LIST_STANDARD
, 0);
14586 ALIAS (lcommunity_list_standard
,
14587 ip_lcommunity_list_standard_cmd
,
14588 "ip large-community-list (1-99) <deny|permit>",
14590 LCOMMUNITY_LIST_STR
14591 "Large Community list number (standard)\n"
14592 "Specify large community to reject\n"
14593 "Specify large community to accept\n")
14595 DEFUN (lcommunity_list_standard1
,
14596 bgp_lcommunity_list_standard1_cmd
,
14597 "bgp large-community-list (1-99) <deny|permit> AA:BB:CC...",
14599 LCOMMUNITY_LIST_STR
14600 "Large Community list number (standard)\n"
14601 "Specify large community to reject\n"
14602 "Specify large community to accept\n"
14603 LCOMMUNITY_VAL_STR
)
14605 return lcommunity_list_set_vty(vty
, argc
, argv
,
14606 LARGE_COMMUNITY_LIST_STANDARD
, 0);
14609 ALIAS (lcommunity_list_standard1
,
14610 ip_lcommunity_list_standard1_cmd
,
14611 "ip large-community-list (1-99) <deny|permit> AA:BB:CC...",
14613 LCOMMUNITY_LIST_STR
14614 "Large Community list number (standard)\n"
14615 "Specify large community to reject\n"
14616 "Specify large community to accept\n"
14617 LCOMMUNITY_VAL_STR
)
14619 DEFUN (lcommunity_list_expanded
,
14620 bgp_lcommunity_list_expanded_cmd
,
14621 "bgp large-community-list (100-500) <deny|permit> LINE...",
14623 LCOMMUNITY_LIST_STR
14624 "Large Community list number (expanded)\n"
14625 "Specify large community to reject\n"
14626 "Specify large community to accept\n"
14627 "An ordered list as a regular-expression\n")
14629 return lcommunity_list_set_vty(vty
, argc
, argv
,
14630 LARGE_COMMUNITY_LIST_EXPANDED
, 0);
14633 ALIAS (lcommunity_list_expanded
,
14634 ip_lcommunity_list_expanded_cmd
,
14635 "ip large-community-list (100-500) <deny|permit> LINE...",
14637 LCOMMUNITY_LIST_STR
14638 "Large Community list number (expanded)\n"
14639 "Specify large community to reject\n"
14640 "Specify large community to accept\n"
14641 "An ordered list as a regular-expression\n")
14643 DEFUN (lcommunity_list_name_standard
,
14644 bgp_lcommunity_list_name_standard_cmd
,
14645 "bgp large-community-list standard WORD <deny|permit>",
14647 LCOMMUNITY_LIST_STR
14648 "Specify standard large-community-list\n"
14649 "Large Community list name\n"
14650 "Specify large community to reject\n"
14651 "Specify large community to accept\n")
14653 return lcommunity_list_set_vty(vty
, argc
, argv
,
14654 LARGE_COMMUNITY_LIST_STANDARD
, 1);
14657 ALIAS (lcommunity_list_name_standard
,
14658 ip_lcommunity_list_name_standard_cmd
,
14659 "ip large-community-list standard WORD <deny|permit>",
14661 LCOMMUNITY_LIST_STR
14662 "Specify standard large-community-list\n"
14663 "Large Community list name\n"
14664 "Specify large community to reject\n"
14665 "Specify large community to accept\n")
14667 DEFUN (lcommunity_list_name_standard1
,
14668 bgp_lcommunity_list_name_standard1_cmd
,
14669 "bgp large-community-list standard WORD <deny|permit> AA:BB:CC...",
14671 LCOMMUNITY_LIST_STR
14672 "Specify standard large-community-list\n"
14673 "Large Community list name\n"
14674 "Specify large community to reject\n"
14675 "Specify large community to accept\n"
14676 LCOMMUNITY_VAL_STR
)
14678 return lcommunity_list_set_vty(vty
, argc
, argv
,
14679 LARGE_COMMUNITY_LIST_STANDARD
, 1);
14682 ALIAS (lcommunity_list_name_standard1
,
14683 ip_lcommunity_list_name_standard1_cmd
,
14684 "ip large-community-list standard WORD <deny|permit> AA:BB:CC...",
14686 LCOMMUNITY_LIST_STR
14687 "Specify standard large-community-list\n"
14688 "Large Community list name\n"
14689 "Specify large community to reject\n"
14690 "Specify large community to accept\n"
14691 LCOMMUNITY_VAL_STR
)
14693 DEFUN (lcommunity_list_name_expanded
,
14694 bgp_lcommunity_list_name_expanded_cmd
,
14695 "bgp large-community-list expanded WORD <deny|permit> LINE...",
14697 LCOMMUNITY_LIST_STR
14698 "Specify expanded 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 "An ordered list as a regular-expression\n")
14704 return lcommunity_list_set_vty(vty
, argc
, argv
,
14705 LARGE_COMMUNITY_LIST_EXPANDED
, 1);
14708 ALIAS (lcommunity_list_name_expanded
,
14709 ip_lcommunity_list_name_expanded_cmd
,
14710 "ip large-community-list expanded WORD <deny|permit> LINE...",
14712 LCOMMUNITY_LIST_STR
14713 "Specify expanded large-community-list\n"
14714 "Large Community list name\n"
14715 "Specify large community to reject\n"
14716 "Specify large community to accept\n"
14717 "An ordered list as a regular-expression\n")
14719 DEFUN (no_lcommunity_list_standard_all
,
14720 no_bgp_lcommunity_list_standard_all_cmd
,
14721 "no bgp large-community-list <(1-99)|(100-500)|WORD>",
14724 LCOMMUNITY_LIST_STR
14725 "Large Community list number (standard)\n"
14726 "Large Community list number (expanded)\n"
14727 "Large Community list name\n")
14729 return lcommunity_list_unset_vty(vty
, argc
, argv
,
14730 LARGE_COMMUNITY_LIST_STANDARD
);
14733 ALIAS (no_lcommunity_list_standard_all
,
14734 no_ip_lcommunity_list_standard_all_cmd
,
14735 "no ip large-community-list <(1-99)|(100-500)|WORD>",
14738 LCOMMUNITY_LIST_STR
14739 "Large Community list number (standard)\n"
14740 "Large Community list number (expanded)\n"
14741 "Large Community list name\n")
14743 DEFUN (no_lcommunity_list_name_expanded_all
,
14744 no_bgp_lcommunity_list_name_expanded_all_cmd
,
14745 "no bgp large-community-list expanded WORD",
14748 LCOMMUNITY_LIST_STR
14749 "Specify expanded large-community-list\n"
14750 "Large Community list name\n")
14752 return lcommunity_list_unset_vty(vty
, argc
, argv
,
14753 LARGE_COMMUNITY_LIST_EXPANDED
);
14756 ALIAS (no_lcommunity_list_name_expanded_all
,
14757 no_ip_lcommunity_list_name_expanded_all_cmd
,
14758 "no ip large-community-list expanded WORD",
14761 LCOMMUNITY_LIST_STR
14762 "Specify expanded large-community-list\n"
14763 "Large Community list name\n")
14765 DEFUN (no_lcommunity_list_standard
,
14766 no_bgp_lcommunity_list_standard_cmd
,
14767 "no bgp large-community-list (1-99) <deny|permit> AA:AA:NN...",
14770 LCOMMUNITY_LIST_STR
14771 "Large Community list number (standard)\n"
14772 "Specify large community to reject\n"
14773 "Specify large community to accept\n"
14774 LCOMMUNITY_VAL_STR
)
14776 return lcommunity_list_unset_vty(vty
, argc
, argv
,
14777 LARGE_COMMUNITY_LIST_STANDARD
);
14780 ALIAS (no_lcommunity_list_standard
,
14781 no_ip_lcommunity_list_standard_cmd
,
14782 "no ip large-community-list (1-99) <deny|permit> AA:AA:NN...",
14785 LCOMMUNITY_LIST_STR
14786 "Large Community list number (standard)\n"
14787 "Specify large community to reject\n"
14788 "Specify large community to accept\n"
14789 LCOMMUNITY_VAL_STR
)
14791 DEFUN (no_lcommunity_list_expanded
,
14792 no_bgp_lcommunity_list_expanded_cmd
,
14793 "no bgp large-community-list (100-500) <deny|permit> LINE...",
14796 LCOMMUNITY_LIST_STR
14797 "Large Community list number (expanded)\n"
14798 "Specify large community to reject\n"
14799 "Specify large community to accept\n"
14800 "An ordered list as a regular-expression\n")
14802 return lcommunity_list_unset_vty(vty
, argc
, argv
,
14803 LARGE_COMMUNITY_LIST_EXPANDED
);
14806 ALIAS (no_lcommunity_list_expanded
,
14807 no_ip_lcommunity_list_expanded_cmd
,
14808 "no ip large-community-list (100-500) <deny|permit> LINE...",
14811 LCOMMUNITY_LIST_STR
14812 "Large Community list number (expanded)\n"
14813 "Specify large community to reject\n"
14814 "Specify large community to accept\n"
14815 "An ordered list as a regular-expression\n")
14817 DEFUN (no_lcommunity_list_name_standard
,
14818 no_bgp_lcommunity_list_name_standard_cmd
,
14819 "no bgp large-community-list standard WORD <deny|permit> AA:AA:NN...",
14822 LCOMMUNITY_LIST_STR
14823 "Specify standard large-community-list\n"
14824 "Large Community list name\n"
14825 "Specify large community to reject\n"
14826 "Specify large community to accept\n"
14827 LCOMMUNITY_VAL_STR
)
14829 return lcommunity_list_unset_vty(vty
, argc
, argv
,
14830 LARGE_COMMUNITY_LIST_STANDARD
);
14833 ALIAS (no_lcommunity_list_name_standard
,
14834 no_ip_lcommunity_list_name_standard_cmd
,
14835 "no ip large-community-list standard WORD <deny|permit> AA:AA:NN...",
14838 LCOMMUNITY_LIST_STR
14839 "Specify standard large-community-list\n"
14840 "Large Community list name\n"
14841 "Specify large community to reject\n"
14842 "Specify large community to accept\n"
14843 LCOMMUNITY_VAL_STR
)
14845 DEFUN (no_lcommunity_list_name_expanded
,
14846 no_bgp_lcommunity_list_name_expanded_cmd
,
14847 "no bgp large-community-list expanded WORD <deny|permit> LINE...",
14850 LCOMMUNITY_LIST_STR
14851 "Specify expanded large-community-list\n"
14852 "Large community list name\n"
14853 "Specify large community to reject\n"
14854 "Specify large community to accept\n"
14855 "An ordered list as a regular-expression\n")
14857 return lcommunity_list_unset_vty(vty
, argc
, argv
,
14858 LARGE_COMMUNITY_LIST_EXPANDED
);
14861 ALIAS (no_lcommunity_list_name_expanded
,
14862 no_ip_lcommunity_list_name_expanded_cmd
,
14863 "no ip large-community-list expanded WORD <deny|permit> LINE...",
14866 LCOMMUNITY_LIST_STR
14867 "Specify expanded large-community-list\n"
14868 "Large community list name\n"
14869 "Specify large community to reject\n"
14870 "Specify large community to accept\n"
14871 "An ordered list as a regular-expression\n")
14873 static void lcommunity_list_show(struct vty
*vty
, struct community_list
*list
)
14875 struct community_entry
*entry
;
14877 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
14878 if (entry
== list
->head
) {
14879 if (all_digit(list
->name
))
14880 vty_out(vty
, "Large community %s list %s\n",
14882 LARGE_COMMUNITY_LIST_STANDARD
14884 : "(expanded) access",
14888 "Named large community %s list %s\n",
14890 LARGE_COMMUNITY_LIST_STANDARD
14896 vty_out(vty
, " %s\n",
14897 community_direct_str(entry
->direct
));
14899 vty_out(vty
, " %s %s\n",
14900 community_direct_str(entry
->direct
),
14901 community_list_config_str(entry
));
14905 DEFUN (show_lcommunity_list
,
14906 show_bgp_lcommunity_list_cmd
,
14907 "show bgp large-community-list",
14910 "List large-community list\n")
14912 struct community_list
*list
;
14913 struct community_list_master
*cm
;
14916 if (argv_find(argv
, argc
, "ip", &idx
)) {
14917 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
14918 vty_out(vty
, "if you are using this please migrate to the below command.\n");
14919 vty_out(vty
, "'show bgp large-community-list <(1-500)|WORD>'\n");
14920 zlog_warn("Deprecated option: 'ip show large-community-list <(1-500)|WORD>' being used");
14923 cm
= community_list_master_lookup(bgp_clist
,
14924 LARGE_COMMUNITY_LIST_MASTER
);
14926 return CMD_SUCCESS
;
14928 for (list
= cm
->num
.head
; list
; list
= list
->next
)
14929 lcommunity_list_show(vty
, list
);
14931 for (list
= cm
->str
.head
; list
; list
= list
->next
)
14932 lcommunity_list_show(vty
, list
);
14934 return CMD_SUCCESS
;
14937 ALIAS (show_lcommunity_list
,
14938 show_ip_lcommunity_list_cmd
,
14939 "show ip large-community-list",
14942 "List large-community list\n")
14944 DEFUN (show_lcommunity_list_arg
,
14945 show_bgp_lcommunity_list_arg_cmd
,
14946 "show bgp large-community-list <(1-500)|WORD>",
14949 "List large-community list\n"
14950 "large-community-list number\n"
14951 "large-community-list name\n")
14953 struct community_list
*list
;
14956 if (argv_find(argv
, argc
, "ip", &idx
)) {
14957 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
14958 vty_out(vty
, "if you are using this please migrate to the below command.\n");
14959 vty_out(vty
, "'show bgp large-community-list <(1-500)|WORD>'\n");
14960 zlog_warn("Deprecated option: 'ip show large-community-list <(1-500)|WORD>' being used");
14963 list
= community_list_lookup(bgp_clist
, argv
[3]->arg
, 0,
14964 LARGE_COMMUNITY_LIST_MASTER
);
14966 vty_out(vty
, "%% Can't find extcommunity-list\n");
14967 return CMD_WARNING
;
14970 lcommunity_list_show(vty
, list
);
14972 return CMD_SUCCESS
;
14975 ALIAS (show_lcommunity_list_arg
,
14976 show_ip_lcommunity_list_arg_cmd
,
14977 "show ip large-community-list <(1-500)|WORD>",
14980 "List large-community list\n"
14981 "large-community-list number\n"
14982 "large-community-list name\n")
14984 /* "extcommunity-list" keyword help string. */
14985 #define EXTCOMMUNITY_LIST_STR "Add a extended community list entry\n"
14986 #define EXTCOMMUNITY_VAL_STR "Extended community attribute in 'rt aa:nn_or_IPaddr:nn' OR 'soo aa:nn_or_IPaddr:nn' format\n"
14988 DEFUN (extcommunity_list_standard
,
14989 bgp_extcommunity_list_standard_cmd
,
14990 "bgp extcommunity-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
14992 EXTCOMMUNITY_LIST_STR
14993 "Extended Community list number (standard)\n"
14994 "Specify standard extcommunity-list\n"
14995 "Community list name\n"
14996 "Specify community to reject\n"
14997 "Specify community to accept\n"
14998 EXTCOMMUNITY_VAL_STR
)
15000 int style
= EXTCOMMUNITY_LIST_STANDARD
;
15002 char *cl_number_or_name
= NULL
;
15005 if (argv_find(argv
, argc
, "ip", &idx
)) {
15006 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
15007 vty_out(vty
, "if you are using this please migrate to the below command.\n");
15008 vty_out(vty
, "'bgp extcommunity-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:NN>'\n");
15009 zlog_warn("Deprecated option: 'ip extcommunity-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:NN>' being used");
15011 argv_find(argv
, argc
, "(1-99)", &idx
);
15012 argv_find(argv
, argc
, "WORD", &idx
);
15013 cl_number_or_name
= argv
[idx
]->arg
;
15014 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
15016 argv_find(argv
, argc
, "AA:NN", &idx
);
15017 char *str
= argv_concat(argv
, argc
, idx
);
15019 int ret
= extcommunity_list_set(bgp_clist
, cl_number_or_name
, str
,
15022 XFREE(MTYPE_TMP
, str
);
15025 community_list_perror(vty
, ret
);
15026 return CMD_WARNING_CONFIG_FAILED
;
15029 return CMD_SUCCESS
;
15032 #if CONFDATE > 20191005
15033 CPP_NOTICE("bgpd: remove deprecated 'ip extcommunity-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:NN>' command")
15035 ALIAS (extcommunity_list_standard
,
15036 ip_extcommunity_list_standard_cmd
,
15037 "ip extcommunity-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
15039 EXTCOMMUNITY_LIST_STR
15040 "Extended Community list number (standard)\n"
15041 "Specify standard extcommunity-list\n"
15042 "Community list name\n"
15043 "Specify community to reject\n"
15044 "Specify community to accept\n"
15045 EXTCOMMUNITY_VAL_STR
)
15047 DEFUN (extcommunity_list_name_expanded
,
15048 bgp_extcommunity_list_name_expanded_cmd
,
15049 "bgp extcommunity-list <(100-500)|expanded WORD> <deny|permit> LINE...",
15051 EXTCOMMUNITY_LIST_STR
15052 "Extended Community list number (expanded)\n"
15053 "Specify expanded extcommunity-list\n"
15054 "Extended Community list name\n"
15055 "Specify community to reject\n"
15056 "Specify community to accept\n"
15057 "An ordered list as a regular-expression\n")
15059 int style
= EXTCOMMUNITY_LIST_EXPANDED
;
15061 char *cl_number_or_name
= NULL
;
15064 if (argv_find(argv
, argc
, "ip", &idx
)) {
15065 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
15066 vty_out(vty
, "if you are using this please migrate to the below command.\n");
15067 vty_out(vty
, "'extcommunity-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:NN>'\n");
15068 zlog_warn("Deprecated option: ‘ip extcommunity-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:NN>' being used");
15071 argv_find(argv
, argc
, "(100-500)", &idx
);
15072 argv_find(argv
, argc
, "WORD", &idx
);
15073 cl_number_or_name
= argv
[idx
]->arg
;
15074 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
15076 argv_find(argv
, argc
, "LINE", &idx
);
15077 char *str
= argv_concat(argv
, argc
, idx
);
15079 int ret
= extcommunity_list_set(bgp_clist
, cl_number_or_name
, str
,
15082 XFREE(MTYPE_TMP
, str
);
15085 community_list_perror(vty
, ret
);
15086 return CMD_WARNING_CONFIG_FAILED
;
15089 return CMD_SUCCESS
;
15092 ALIAS (extcommunity_list_name_expanded
,
15093 ip_extcommunity_list_name_expanded_cmd
,
15094 "ip extcommunity-list <(100-500)|expanded WORD> <deny|permit> LINE...",
15096 EXTCOMMUNITY_LIST_STR
15097 "Extended Community list number (expanded)\n"
15098 "Specify expanded extcommunity-list\n"
15099 "Extended Community list name\n"
15100 "Specify community to reject\n"
15101 "Specify community to accept\n"
15102 "An ordered list as a regular-expression\n")
15104 DEFUN (no_extcommunity_list_standard_all
,
15105 no_bgp_extcommunity_list_standard_all_cmd
,
15106 "no bgp extcommunity-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
15109 EXTCOMMUNITY_LIST_STR
15110 "Extended Community list number (standard)\n"
15111 "Specify standard extcommunity-list\n"
15112 "Community list name\n"
15113 "Specify community to reject\n"
15114 "Specify community to accept\n"
15115 EXTCOMMUNITY_VAL_STR
)
15117 int style
= EXTCOMMUNITY_LIST_STANDARD
;
15119 char *cl_number_or_name
= NULL
;
15123 if (argv_find(argv
, argc
, "ip", &idx
)) {
15124 vty_out(vty
, "This config option is deprecated, and is scheduled for removal\n");
15125 vty_out(vty
, "if you are using this please migrate to the below command.\n");
15126 vty_out(vty
, "'no bgp extcommunity-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:NN>'\n");
15127 zlog_warn("Deprecated option: ‘no ip extcommunity-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:NN>' being used");
15131 argv_find(argv
, argc
, "permit", &idx
);
15132 argv_find(argv
, argc
, "deny", &idx
);
15135 direct
= argv_find(argv
, argc
, "permit", &idx
)
15140 argv_find(argv
, argc
, "AA:NN", &idx
);
15141 str
= argv_concat(argv
, argc
, idx
);
15145 argv_find(argv
, argc
, "(1-99)", &idx
);
15146 argv_find(argv
, argc
, "WORD", &idx
);
15147 cl_number_or_name
= argv
[idx
]->arg
;
15149 int ret
= extcommunity_list_unset(bgp_clist
, cl_number_or_name
, str
,
15152 XFREE(MTYPE_TMP
, str
);
15155 community_list_perror(vty
, ret
);
15156 return CMD_WARNING_CONFIG_FAILED
;
15159 return CMD_SUCCESS
;
15162 ALIAS (no_extcommunity_list_standard_all
,
15163 no_ip_extcommunity_list_standard_all_cmd
,
15164 "no ip extcommunity-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
15167 EXTCOMMUNITY_LIST_STR
15168 "Extended Community list number (standard)\n"
15169 "Specify standard extcommunity-list\n"
15170 "Community list name\n"
15171 "Specify community to reject\n"
15172 "Specify community to accept\n"
15173 EXTCOMMUNITY_VAL_STR
)
15175 ALIAS(no_extcommunity_list_standard_all
,
15176 no_bgp_extcommunity_list_standard_all_list_cmd
,
15177 "no bgp extcommunity-list <(1-99)|standard WORD>",
15178 NO_STR IP_STR EXTCOMMUNITY_LIST_STR
15179 "Extended Community list number (standard)\n"
15180 "Specify standard extcommunity-list\n"
15181 "Community list name\n")
15183 ALIAS(no_extcommunity_list_standard_all
,
15184 no_ip_extcommunity_list_standard_all_list_cmd
,
15185 "no ip extcommunity-list <(1-99)|standard WORD>",
15186 NO_STR IP_STR EXTCOMMUNITY_LIST_STR
15187 "Extended Community list number (standard)\n"
15188 "Specify standard extcommunity-list\n"
15189 "Community list name\n")
15191 DEFUN (no_extcommunity_list_expanded_all
,
15192 no_bgp_extcommunity_list_expanded_all_cmd
,
15193 "no bgp extcommunity-list <(100-500)|expanded WORD> <deny|permit> LINE...",
15196 EXTCOMMUNITY_LIST_STR
15197 "Extended Community list number (expanded)\n"
15198 "Specify expanded extcommunity-list\n"
15199 "Extended Community list name\n"
15200 "Specify community to reject\n"
15201 "Specify community to accept\n"
15202 "An ordered list as a regular-expression\n")
15204 int style
= EXTCOMMUNITY_LIST_EXPANDED
;
15206 char *cl_number_or_name
= NULL
;
15210 if (argv_find(argv
, argc
, "ip", &idx
)) {
15211 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
15212 vty_out(vty
, "if you are using this please migrate to the below command.\n");
15213 vty_out(vty
, "'no bgp extcommunity-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:NN>'\n");
15214 zlog_warn("Deprecated option: ‘no ip extcommunity-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:NN>' being used");
15218 argv_find(argv
, argc
, "permit", &idx
);
15219 argv_find(argv
, argc
, "deny", &idx
);
15222 direct
= argv_find(argv
, argc
, "permit", &idx
)
15227 argv_find(argv
, argc
, "LINE", &idx
);
15228 str
= argv_concat(argv
, argc
, idx
);
15232 argv_find(argv
, argc
, "(100-500)", &idx
);
15233 argv_find(argv
, argc
, "WORD", &idx
);
15234 cl_number_or_name
= argv
[idx
]->arg
;
15236 int ret
= extcommunity_list_unset(bgp_clist
, cl_number_or_name
, str
,
15239 XFREE(MTYPE_TMP
, str
);
15242 community_list_perror(vty
, ret
);
15243 return CMD_WARNING_CONFIG_FAILED
;
15246 return CMD_SUCCESS
;
15249 ALIAS (no_extcommunity_list_expanded_all
,
15250 no_ip_extcommunity_list_expanded_all_cmd
,
15251 "no ip extcommunity-list <(100-500)|expanded WORD> <deny|permit> LINE...",
15254 EXTCOMMUNITY_LIST_STR
15255 "Extended Community list number (expanded)\n"
15256 "Specify expanded extcommunity-list\n"
15257 "Extended Community list name\n"
15258 "Specify community to reject\n"
15259 "Specify community to accept\n"
15260 "An ordered list as a regular-expression\n")
15262 ALIAS(no_extcommunity_list_expanded_all
,
15263 no_ip_extcommunity_list_expanded_all_list_cmd
,
15264 "no ip extcommunity-list <(100-500)|expanded WORD>",
15265 NO_STR IP_STR EXTCOMMUNITY_LIST_STR
15266 "Extended Community list number (expanded)\n"
15267 "Specify expanded extcommunity-list\n"
15268 "Extended Community list name\n")
15270 ALIAS(no_extcommunity_list_expanded_all
,
15271 no_bgp_extcommunity_list_expanded_all_list_cmd
,
15272 "no bgp extcommunity-list <(100-500)|expanded WORD>",
15273 NO_STR IP_STR EXTCOMMUNITY_LIST_STR
15274 "Extended Community list number (expanded)\n"
15275 "Specify expanded extcommunity-list\n"
15276 "Extended Community list name\n")
15278 static void extcommunity_list_show(struct vty
*vty
, struct community_list
*list
)
15280 struct community_entry
*entry
;
15282 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
15283 if (entry
== list
->head
) {
15284 if (all_digit(list
->name
))
15285 vty_out(vty
, "Extended community %s list %s\n",
15286 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
15288 : "(expanded) access",
15292 "Named extended community %s list %s\n",
15293 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
15299 vty_out(vty
, " %s\n",
15300 community_direct_str(entry
->direct
));
15302 vty_out(vty
, " %s %s\n",
15303 community_direct_str(entry
->direct
),
15304 community_list_config_str(entry
));
15308 DEFUN (show_extcommunity_list
,
15309 show_bgp_extcommunity_list_cmd
,
15310 "show bgp extcommunity-list",
15313 "List extended-community list\n")
15315 struct community_list
*list
;
15316 struct community_list_master
*cm
;
15319 if (argv_find(argv
, argc
, "ip", &idx
)) {
15320 vty_out(vty
, "This config option is deprecated, and is scheduled for removal\n");
15321 vty_out(vty
, "if you are using this please migrate to the below command.\n");
15322 vty_out(vty
, "'show bgp extcommunity-list <(1-500)|WORD>'\n");
15323 zlog_warn("Deprecated option: 'ip show extcommunity-list <(1-500)|WORD>' being used");
15325 cm
= community_list_master_lookup(bgp_clist
, EXTCOMMUNITY_LIST_MASTER
);
15327 return CMD_SUCCESS
;
15329 for (list
= cm
->num
.head
; list
; list
= list
->next
)
15330 extcommunity_list_show(vty
, list
);
15332 for (list
= cm
->str
.head
; list
; list
= list
->next
)
15333 extcommunity_list_show(vty
, list
);
15335 return CMD_SUCCESS
;
15338 ALIAS (show_extcommunity_list
,
15339 show_ip_extcommunity_list_cmd
,
15340 "show ip extcommunity-list",
15343 "List extended-community list\n")
15345 DEFUN (show_extcommunity_list_arg
,
15346 show_bgp_extcommunity_list_arg_cmd
,
15347 "show bgp extcommunity-list <(1-500)|WORD>",
15350 "List extended-community list\n"
15351 "Extcommunity-list number\n"
15352 "Extcommunity-list name\n")
15354 int idx_comm_list
= 3;
15355 struct community_list
*list
;
15358 if (argv_find(argv
, argc
, "ip", &idx
)) {
15359 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
15360 vty_out(vty
, "if you are using this please migrate to the below command.\n");
15361 vty_out(vty
, "'show bgp extcommunity-list <(1-500)|WORD>'\n");
15362 zlog_warn("Deprecated option: 'ip show extcommunity-list <(1-500)|WORD>' being used");
15364 list
= community_list_lookup(bgp_clist
, argv
[idx_comm_list
]->arg
, 0,
15365 EXTCOMMUNITY_LIST_MASTER
);
15367 vty_out(vty
, "%% Can't find extcommunity-list\n");
15368 return CMD_WARNING
;
15371 extcommunity_list_show(vty
, list
);
15373 return CMD_SUCCESS
;
15376 ALIAS (show_extcommunity_list_arg
,
15377 show_ip_extcommunity_list_arg_cmd
,
15378 "show ip extcommunity-list <(1-500)|WORD>",
15381 "List extended-community list\n"
15382 "Extcommunity-list number\n"
15383 "Extcommunity-list name\n")
15385 /* Display community-list and extcommunity-list configuration. */
15386 static int community_list_config_write(struct vty
*vty
)
15388 struct community_list
*list
;
15389 struct community_entry
*entry
;
15390 struct community_list_master
*cm
;
15393 /* Community-list. */
15394 cm
= community_list_master_lookup(bgp_clist
, COMMUNITY_LIST_MASTER
);
15396 for (list
= cm
->num
.head
; list
; list
= list
->next
)
15397 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
15398 vty_out(vty
, "bgp community-list %s %s %s\n", list
->name
,
15399 community_direct_str(entry
->direct
),
15400 community_list_config_str(entry
));
15403 for (list
= cm
->str
.head
; list
; list
= list
->next
)
15404 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
15405 vty_out(vty
, "bgp community-list %s %s %s %s\n",
15406 entry
->style
== COMMUNITY_LIST_STANDARD
15409 list
->name
, community_direct_str(entry
->direct
),
15410 community_list_config_str(entry
));
15414 /* Extcommunity-list. */
15415 cm
= community_list_master_lookup(bgp_clist
, EXTCOMMUNITY_LIST_MASTER
);
15417 for (list
= cm
->num
.head
; list
; list
= list
->next
)
15418 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
15419 vty_out(vty
, "bgp extcommunity-list %s %s %s\n",
15420 list
->name
, community_direct_str(entry
->direct
),
15421 community_list_config_str(entry
));
15424 for (list
= cm
->str
.head
; list
; list
= list
->next
)
15425 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
15426 vty_out(vty
, "bgp extcommunity-list %s %s %s %s\n",
15427 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
15430 list
->name
, community_direct_str(entry
->direct
),
15431 community_list_config_str(entry
));
15436 /* lcommunity-list. */
15437 cm
= community_list_master_lookup(bgp_clist
,
15438 LARGE_COMMUNITY_LIST_MASTER
);
15440 for (list
= cm
->num
.head
; list
; list
= list
->next
)
15441 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
15442 vty_out(vty
, "bgp large-community-list %s %s %s\n",
15443 list
->name
, community_direct_str(entry
->direct
),
15444 community_list_config_str(entry
));
15447 for (list
= cm
->str
.head
; list
; list
= list
->next
)
15448 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
15449 vty_out(vty
, "bgp large-community-list %s %s %s %s\n",
15450 entry
->style
== LARGE_COMMUNITY_LIST_STANDARD
15453 list
->name
, community_direct_str(entry
->direct
),
15454 community_list_config_str(entry
));
15461 static struct cmd_node community_list_node
= {
15462 COMMUNITY_LIST_NODE
, "", 1 /* Export to vtysh. */
15465 static void community_list_vty(void)
15467 install_node(&community_list_node
, community_list_config_write
);
15469 /* Community-list. */
15470 install_element(CONFIG_NODE
, &bgp_community_list_standard_cmd
);
15471 install_element(CONFIG_NODE
, &bgp_community_list_expanded_all_cmd
);
15472 install_element(CONFIG_NODE
, &no_bgp_community_list_standard_all_cmd
);
15473 install_element(CONFIG_NODE
, &no_bgp_community_list_standard_all_list_cmd
);
15474 install_element(CONFIG_NODE
, &no_bgp_community_list_expanded_all_cmd
);
15475 install_element(CONFIG_NODE
, &no_bgp_community_list_expanded_all_list_cmd
);
15476 install_element(VIEW_NODE
, &show_bgp_community_list_cmd
);
15477 install_element(VIEW_NODE
, &show_bgp_community_list_arg_cmd
);
15478 install_element(CONFIG_NODE
, &ip_community_list_standard_cmd
);
15479 install_element(CONFIG_NODE
, &ip_community_list_expanded_all_cmd
);
15480 install_element(CONFIG_NODE
, &no_ip_community_list_standard_all_cmd
);
15481 install_element(CONFIG_NODE
, &no_ip_community_list_standard_all_list_cmd
);
15482 install_element(CONFIG_NODE
, &no_ip_community_list_expanded_all_cmd
);
15483 install_element(CONFIG_NODE
, &no_ip_community_list_expanded_all_list_cmd
);
15484 install_element(VIEW_NODE
, &show_ip_community_list_cmd
);
15485 install_element(VIEW_NODE
, &show_ip_community_list_arg_cmd
);
15487 /* Extcommunity-list. */
15488 install_element(CONFIG_NODE
, &bgp_extcommunity_list_standard_cmd
);
15489 install_element(CONFIG_NODE
, &bgp_extcommunity_list_name_expanded_cmd
);
15490 install_element(CONFIG_NODE
, &no_bgp_extcommunity_list_standard_all_cmd
);
15491 install_element(CONFIG_NODE
,
15492 &no_bgp_extcommunity_list_standard_all_list_cmd
);
15493 install_element(CONFIG_NODE
, &no_bgp_extcommunity_list_expanded_all_cmd
);
15494 install_element(CONFIG_NODE
,
15495 &no_bgp_extcommunity_list_expanded_all_list_cmd
);
15496 install_element(VIEW_NODE
, &show_bgp_extcommunity_list_cmd
);
15497 install_element(VIEW_NODE
, &show_bgp_extcommunity_list_arg_cmd
);
15498 install_element(CONFIG_NODE
, &ip_extcommunity_list_standard_cmd
);
15499 install_element(CONFIG_NODE
, &ip_extcommunity_list_name_expanded_cmd
);
15500 install_element(CONFIG_NODE
, &no_ip_extcommunity_list_standard_all_cmd
);
15501 install_element(CONFIG_NODE
, &no_ip_extcommunity_list_standard_all_list_cmd
);
15502 install_element(CONFIG_NODE
, &no_ip_extcommunity_list_expanded_all_cmd
);
15503 install_element(CONFIG_NODE
, &no_ip_extcommunity_list_expanded_all_list_cmd
);
15504 install_element(VIEW_NODE
, &show_ip_extcommunity_list_cmd
);
15505 install_element(VIEW_NODE
, &show_ip_extcommunity_list_arg_cmd
);
15507 /* Large Community List */
15508 install_element(CONFIG_NODE
, &bgp_lcommunity_list_standard_cmd
);
15509 install_element(CONFIG_NODE
, &bgp_lcommunity_list_standard1_cmd
);
15510 install_element(CONFIG_NODE
, &bgp_lcommunity_list_expanded_cmd
);
15511 install_element(CONFIG_NODE
, &bgp_lcommunity_list_name_standard_cmd
);
15512 install_element(CONFIG_NODE
, &bgp_lcommunity_list_name_standard1_cmd
);
15513 install_element(CONFIG_NODE
, &bgp_lcommunity_list_name_expanded_cmd
);
15514 install_element(CONFIG_NODE
, &no_bgp_lcommunity_list_standard_all_cmd
);
15515 install_element(CONFIG_NODE
,
15516 &no_bgp_lcommunity_list_name_expanded_all_cmd
);
15517 install_element(CONFIG_NODE
, &no_bgp_lcommunity_list_standard_cmd
);
15518 install_element(CONFIG_NODE
, &no_bgp_lcommunity_list_expanded_cmd
);
15519 install_element(CONFIG_NODE
, &no_bgp_lcommunity_list_name_standard_cmd
);
15520 install_element(CONFIG_NODE
, &no_bgp_lcommunity_list_name_expanded_cmd
);
15521 install_element(VIEW_NODE
, &show_bgp_lcommunity_list_cmd
);
15522 install_element(VIEW_NODE
, &show_bgp_lcommunity_list_arg_cmd
);
15523 install_element(CONFIG_NODE
, &ip_lcommunity_list_standard_cmd
);
15524 install_element(CONFIG_NODE
, &ip_lcommunity_list_standard1_cmd
);
15525 install_element(CONFIG_NODE
, &ip_lcommunity_list_expanded_cmd
);
15526 install_element(CONFIG_NODE
, &ip_lcommunity_list_name_standard_cmd
);
15527 install_element(CONFIG_NODE
, &ip_lcommunity_list_name_standard1_cmd
);
15528 install_element(CONFIG_NODE
, &ip_lcommunity_list_name_expanded_cmd
);
15529 install_element(CONFIG_NODE
, &no_ip_lcommunity_list_standard_all_cmd
);
15530 install_element(CONFIG_NODE
,
15531 &no_ip_lcommunity_list_name_expanded_all_cmd
);
15532 install_element(CONFIG_NODE
, &no_ip_lcommunity_list_standard_cmd
);
15533 install_element(CONFIG_NODE
, &no_ip_lcommunity_list_expanded_cmd
);
15534 install_element(CONFIG_NODE
, &no_ip_lcommunity_list_name_standard_cmd
);
15535 install_element(CONFIG_NODE
, &no_ip_lcommunity_list_name_expanded_cmd
);
15536 install_element(VIEW_NODE
, &show_ip_lcommunity_list_cmd
);
15537 install_element(VIEW_NODE
, &show_ip_lcommunity_list_arg_cmd
);