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_AS_MISMATCH
:
983 vty_out(vty
, "BGP is already running; AS is %u\n", as
);
984 return CMD_WARNING_CONFIG_FAILED
;
985 case BGP_ERR_INSTANCE_MISMATCH
:
987 "BGP instance name and AS number mismatch\n");
989 "BGP instance is already running; AS is %u\n",
991 return CMD_WARNING_CONFIG_FAILED
;
995 * If we just instantiated the default instance, complete
996 * any pending VRF-VPN leaking that was configured via
997 * earlier "router bgp X vrf FOO" blocks.
999 if (is_new_bgp
&& inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
1000 vpn_leak_postchange_all();
1002 /* Pending: handle when user tries to change a view to vrf n vv.
1006 /* unset the auto created flag as the user config is now present */
1007 UNSET_FLAG(bgp
->vrf_flags
, BGP_VRF_AUTO
);
1008 VTY_PUSH_CONTEXT(BGP_NODE
, bgp
);
1013 /* "no router bgp" commands. */
1014 DEFUN (no_router_bgp
,
1016 "no router bgp [(1-4294967295) [<view|vrf> VIEWVRFNAME]]",
1021 BGP_INSTANCE_HELP_STR
)
1027 const char *name
= NULL
;
1029 // "no router bgp" without an ASN
1031 // Pending: Make VRF option available for ASN less config
1032 bgp
= bgp_get_default();
1035 vty_out(vty
, "%% No BGP process is configured\n");
1036 return CMD_WARNING_CONFIG_FAILED
;
1039 if (listcount(bm
->bgp
) > 1) {
1040 vty_out(vty
, "%% Please specify ASN and VRF\n");
1041 return CMD_WARNING_CONFIG_FAILED
;
1045 vty_out(vty
, "%% Please unconfigure l3vni %u",
1047 return CMD_WARNING_CONFIG_FAILED
;
1050 as
= strtoul(argv
[idx_asn
]->arg
, NULL
, 10);
1053 name
= argv
[idx_vrf
]->arg
;
1055 /* Lookup bgp structure. */
1056 bgp
= bgp_lookup(as
, name
);
1058 vty_out(vty
, "%% Can't find BGP instance\n");
1059 return CMD_WARNING_CONFIG_FAILED
;
1063 vty_out(vty
, "%% Please unconfigure l3vni %u\n",
1065 return CMD_WARNING_CONFIG_FAILED
;
1068 /* Cannot delete default instance if vrf instances exist */
1069 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
) {
1070 struct listnode
*node
;
1071 struct bgp
*tmp_bgp
;
1073 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, node
, tmp_bgp
)) {
1074 if (tmp_bgp
->inst_type
1075 == BGP_INSTANCE_TYPE_VRF
) {
1077 "%% Cannot delete default BGP instance. Dependent VRF instances exist\n");
1078 return CMD_WARNING_CONFIG_FAILED
;
1090 /* BGP router-id. */
1092 DEFPY (bgp_router_id
,
1094 "bgp router-id A.B.C.D",
1096 "Override configured router identifier\n"
1097 "Manually configured router identifier\n")
1099 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1100 bgp_router_id_static_set(bgp
, router_id
);
1104 DEFPY (no_bgp_router_id
,
1105 no_bgp_router_id_cmd
,
1106 "no bgp router-id [A.B.C.D]",
1109 "Override configured router identifier\n"
1110 "Manually configured router identifier\n")
1112 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1114 if (router_id_str
) {
1115 if (!IPV4_ADDR_SAME(&bgp
->router_id_static
, &router_id
)) {
1116 vty_out(vty
, "%% BGP router-id doesn't match\n");
1117 return CMD_WARNING_CONFIG_FAILED
;
1121 router_id
.s_addr
= 0;
1122 bgp_router_id_static_set(bgp
, router_id
);
1128 /* BGP Cluster ID. */
1129 DEFUN (bgp_cluster_id
,
1131 "bgp cluster-id <A.B.C.D|(1-4294967295)>",
1133 "Configure Route-Reflector Cluster-id\n"
1134 "Route-Reflector Cluster-id in IP address format\n"
1135 "Route-Reflector Cluster-id as 32 bit quantity\n")
1137 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1140 struct in_addr cluster
;
1142 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &cluster
);
1144 vty_out(vty
, "%% Malformed bgp cluster identifier\n");
1145 return CMD_WARNING_CONFIG_FAILED
;
1148 bgp_cluster_id_set(bgp
, &cluster
);
1149 bgp_clear_star_soft_out(vty
, bgp
->name
);
1154 DEFUN (no_bgp_cluster_id
,
1155 no_bgp_cluster_id_cmd
,
1156 "no bgp cluster-id [<A.B.C.D|(1-4294967295)>]",
1159 "Configure Route-Reflector Cluster-id\n"
1160 "Route-Reflector Cluster-id in IP address format\n"
1161 "Route-Reflector Cluster-id as 32 bit quantity\n")
1163 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1164 bgp_cluster_id_unset(bgp
);
1165 bgp_clear_star_soft_out(vty
, bgp
->name
);
1170 DEFUN (bgp_confederation_identifier
,
1171 bgp_confederation_identifier_cmd
,
1172 "bgp confederation identifier (1-4294967295)",
1173 "BGP specific commands\n"
1174 "AS confederation parameters\n"
1176 "Set routing domain confederation AS\n")
1178 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1182 as
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1184 bgp_confederation_id_set(bgp
, as
);
1189 DEFUN (no_bgp_confederation_identifier
,
1190 no_bgp_confederation_identifier_cmd
,
1191 "no bgp confederation identifier [(1-4294967295)]",
1193 "BGP specific commands\n"
1194 "AS confederation parameters\n"
1196 "Set routing domain confederation AS\n")
1198 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1199 bgp_confederation_id_unset(bgp
);
1204 DEFUN (bgp_confederation_peers
,
1205 bgp_confederation_peers_cmd
,
1206 "bgp confederation peers (1-4294967295)...",
1207 "BGP specific commands\n"
1208 "AS confederation parameters\n"
1209 "Peer ASs in BGP confederation\n"
1212 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1217 for (i
= idx_asn
; i
< argc
; i
++) {
1218 as
= strtoul(argv
[i
]->arg
, NULL
, 10);
1220 if (bgp
->as
== as
) {
1222 "%% Local member-AS not allowed in confed peer list\n");
1226 bgp_confederation_peers_add(bgp
, as
);
1231 DEFUN (no_bgp_confederation_peers
,
1232 no_bgp_confederation_peers_cmd
,
1233 "no bgp confederation peers (1-4294967295)...",
1235 "BGP specific commands\n"
1236 "AS confederation parameters\n"
1237 "Peer ASs in BGP confederation\n"
1240 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1245 for (i
= idx_asn
; i
< argc
; i
++) {
1246 as
= strtoul(argv
[i
]->arg
, NULL
, 10);
1248 bgp_confederation_peers_remove(bgp
, as
);
1254 * Central routine for maximum-paths configuration.
1255 * @peer_type: BGP_PEER_EBGP or BGP_PEER_IBGP
1256 * @set: 1 for setting values, 0 for removing the max-paths config.
1258 static int bgp_maxpaths_config_vty(struct vty
*vty
, int peer_type
,
1259 const char *mpaths
, uint16_t options
,
1262 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1263 uint16_t maxpaths
= 0;
1268 afi
= bgp_node_afi(vty
);
1269 safi
= bgp_node_safi(vty
);
1272 maxpaths
= strtol(mpaths
, NULL
, 10);
1273 if (maxpaths
> multipath_num
) {
1275 "%% Maxpaths Specified: %d is > than multipath num specified on bgp command line %d",
1276 maxpaths
, multipath_num
);
1277 return CMD_WARNING_CONFIG_FAILED
;
1279 ret
= bgp_maximum_paths_set(bgp
, afi
, safi
, peer_type
, maxpaths
,
1282 ret
= bgp_maximum_paths_unset(bgp
, afi
, safi
, peer_type
);
1286 "%% Failed to %sset maximum-paths %s %u for afi %u, safi %u\n",
1287 (set
== 1) ? "" : "un",
1288 (peer_type
== BGP_PEER_EBGP
) ? "ebgp" : "ibgp",
1289 maxpaths
, afi
, safi
);
1290 return CMD_WARNING_CONFIG_FAILED
;
1293 bgp_recalculate_all_bestpaths(bgp
);
1298 DEFUN (bgp_maxmed_admin
,
1299 bgp_maxmed_admin_cmd
,
1300 "bgp max-med administrative ",
1302 "Advertise routes with max-med\n"
1303 "Administratively applied, for an indefinite period\n")
1305 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1307 bgp
->v_maxmed_admin
= 1;
1308 bgp
->maxmed_admin_value
= BGP_MAXMED_VALUE_DEFAULT
;
1310 bgp_maxmed_update(bgp
);
1315 DEFUN (bgp_maxmed_admin_medv
,
1316 bgp_maxmed_admin_medv_cmd
,
1317 "bgp max-med administrative (0-4294967295)",
1319 "Advertise routes with max-med\n"
1320 "Administratively applied, for an indefinite period\n"
1321 "Max MED value to be used\n")
1323 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1326 bgp
->v_maxmed_admin
= 1;
1327 bgp
->maxmed_admin_value
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1329 bgp_maxmed_update(bgp
);
1334 DEFUN (no_bgp_maxmed_admin
,
1335 no_bgp_maxmed_admin_cmd
,
1336 "no bgp max-med administrative [(0-4294967295)]",
1339 "Advertise routes with max-med\n"
1340 "Administratively applied, for an indefinite period\n"
1341 "Max MED value to be used\n")
1343 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1344 bgp
->v_maxmed_admin
= BGP_MAXMED_ADMIN_UNCONFIGURED
;
1345 bgp
->maxmed_admin_value
= BGP_MAXMED_VALUE_DEFAULT
;
1346 bgp_maxmed_update(bgp
);
1351 DEFUN (bgp_maxmed_onstartup
,
1352 bgp_maxmed_onstartup_cmd
,
1353 "bgp max-med on-startup (5-86400) [(0-4294967295)]",
1355 "Advertise routes with max-med\n"
1356 "Effective on a startup\n"
1357 "Time (seconds) period for max-med\n"
1358 "Max MED value to be used\n")
1360 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1363 argv_find(argv
, argc
, "(5-86400)", &idx
);
1364 bgp
->v_maxmed_onstartup
= strtoul(argv
[idx
]->arg
, NULL
, 10);
1365 if (argv_find(argv
, argc
, "(0-4294967295)", &idx
))
1366 bgp
->maxmed_onstartup_value
= strtoul(argv
[idx
]->arg
, NULL
, 10);
1368 bgp
->maxmed_onstartup_value
= BGP_MAXMED_VALUE_DEFAULT
;
1370 bgp_maxmed_update(bgp
);
1375 DEFUN (no_bgp_maxmed_onstartup
,
1376 no_bgp_maxmed_onstartup_cmd
,
1377 "no bgp max-med on-startup [(5-86400) [(0-4294967295)]]",
1380 "Advertise routes with max-med\n"
1381 "Effective on a startup\n"
1382 "Time (seconds) period for max-med\n"
1383 "Max MED value to be used\n")
1385 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1387 /* Cancel max-med onstartup if its on */
1388 if (bgp
->t_maxmed_onstartup
) {
1389 THREAD_TIMER_OFF(bgp
->t_maxmed_onstartup
);
1390 bgp
->maxmed_onstartup_over
= 1;
1393 bgp
->v_maxmed_onstartup
= BGP_MAXMED_ONSTARTUP_UNCONFIGURED
;
1394 bgp
->maxmed_onstartup_value
= BGP_MAXMED_VALUE_DEFAULT
;
1396 bgp_maxmed_update(bgp
);
1401 static int bgp_update_delay_config_vty(struct vty
*vty
, const char *delay
,
1404 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1405 uint16_t update_delay
;
1406 uint16_t establish_wait
;
1408 update_delay
= strtoul(delay
, NULL
, 10);
1410 if (!wait
) /* update-delay <delay> */
1412 bgp
->v_update_delay
= update_delay
;
1413 bgp
->v_establish_wait
= bgp
->v_update_delay
;
1417 /* update-delay <delay> <establish-wait> */
1418 establish_wait
= atoi(wait
);
1419 if (update_delay
< establish_wait
) {
1421 "%%Failed: update-delay less than the establish-wait!\n");
1422 return CMD_WARNING_CONFIG_FAILED
;
1425 bgp
->v_update_delay
= update_delay
;
1426 bgp
->v_establish_wait
= establish_wait
;
1431 static int bgp_update_delay_deconfig_vty(struct vty
*vty
)
1433 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1435 bgp
->v_update_delay
= BGP_UPDATE_DELAY_DEF
;
1436 bgp
->v_establish_wait
= bgp
->v_update_delay
;
1441 void bgp_config_write_update_delay(struct vty
*vty
, struct bgp
*bgp
)
1443 if (bgp
->v_update_delay
!= BGP_UPDATE_DELAY_DEF
) {
1444 vty_out(vty
, " update-delay %d", bgp
->v_update_delay
);
1445 if (bgp
->v_update_delay
!= bgp
->v_establish_wait
)
1446 vty_out(vty
, " %d", bgp
->v_establish_wait
);
1452 /* Update-delay configuration */
1453 DEFUN (bgp_update_delay
,
1454 bgp_update_delay_cmd
,
1455 "update-delay (0-3600)",
1456 "Force initial delay for best-path and updates\n"
1460 return bgp_update_delay_config_vty(vty
, argv
[idx_number
]->arg
, NULL
);
1463 DEFUN (bgp_update_delay_establish_wait
,
1464 bgp_update_delay_establish_wait_cmd
,
1465 "update-delay (0-3600) (1-3600)",
1466 "Force initial delay for best-path and updates\n"
1471 int idx_number_2
= 2;
1472 return bgp_update_delay_config_vty(vty
, argv
[idx_number
]->arg
,
1473 argv
[idx_number_2
]->arg
);
1476 /* Update-delay deconfiguration */
1477 DEFUN (no_bgp_update_delay
,
1478 no_bgp_update_delay_cmd
,
1479 "no update-delay [(0-3600) [(1-3600)]]",
1481 "Force initial delay for best-path and updates\n"
1485 return bgp_update_delay_deconfig_vty(vty
);
1489 static int bgp_wpkt_quanta_config_vty(struct vty
*vty
, const char *num
,
1492 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1495 uint32_t quanta
= strtoul(num
, NULL
, 10);
1496 atomic_store_explicit(&bgp
->wpkt_quanta
, quanta
,
1497 memory_order_relaxed
);
1499 atomic_store_explicit(&bgp
->wpkt_quanta
, BGP_WRITE_PACKET_MAX
,
1500 memory_order_relaxed
);
1506 static int bgp_rpkt_quanta_config_vty(struct vty
*vty
, const char *num
,
1509 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1512 uint32_t quanta
= strtoul(num
, NULL
, 10);
1513 atomic_store_explicit(&bgp
->rpkt_quanta
, quanta
,
1514 memory_order_relaxed
);
1516 atomic_store_explicit(&bgp
->rpkt_quanta
, BGP_READ_PACKET_MAX
,
1517 memory_order_relaxed
);
1523 void bgp_config_write_wpkt_quanta(struct vty
*vty
, struct bgp
*bgp
)
1526 atomic_load_explicit(&bgp
->wpkt_quanta
, memory_order_relaxed
);
1527 if (quanta
!= BGP_WRITE_PACKET_MAX
)
1528 vty_out(vty
, " write-quanta %d\n", quanta
);
1531 void bgp_config_write_rpkt_quanta(struct vty
*vty
, struct bgp
*bgp
)
1534 atomic_load_explicit(&bgp
->rpkt_quanta
, memory_order_relaxed
);
1535 if (quanta
!= BGP_READ_PACKET_MAX
)
1536 vty_out(vty
, " read-quanta %d\n", quanta
);
1539 /* Packet quanta configuration */
1540 DEFUN (bgp_wpkt_quanta
,
1541 bgp_wpkt_quanta_cmd
,
1542 "write-quanta (1-10)",
1543 "How many packets to write to peer socket per run\n"
1544 "Number of packets\n")
1547 return bgp_wpkt_quanta_config_vty(vty
, argv
[idx_number
]->arg
, 1);
1550 DEFUN (no_bgp_wpkt_quanta
,
1551 no_bgp_wpkt_quanta_cmd
,
1552 "no write-quanta (1-10)",
1554 "How many packets to write to peer socket per I/O cycle\n"
1555 "Number of packets\n")
1558 return bgp_wpkt_quanta_config_vty(vty
, argv
[idx_number
]->arg
, 0);
1561 DEFUN (bgp_rpkt_quanta
,
1562 bgp_rpkt_quanta_cmd
,
1563 "read-quanta (1-10)",
1564 "How many packets to read from peer socket per I/O cycle\n"
1565 "Number of packets\n")
1568 return bgp_rpkt_quanta_config_vty(vty
, argv
[idx_number
]->arg
, 1);
1571 DEFUN (no_bgp_rpkt_quanta
,
1572 no_bgp_rpkt_quanta_cmd
,
1573 "no read-quanta (1-10)",
1575 "How many packets to read from peer socket per I/O cycle\n"
1576 "Number of packets\n")
1579 return bgp_rpkt_quanta_config_vty(vty
, argv
[idx_number
]->arg
, 0);
1582 void bgp_config_write_coalesce_time(struct vty
*vty
, struct bgp
*bgp
)
1584 if (!bgp
->heuristic_coalesce
)
1585 vty_out(vty
, " coalesce-time %u\n", bgp
->coalesce_time
);
1589 DEFUN (bgp_coalesce_time
,
1590 bgp_coalesce_time_cmd
,
1591 "coalesce-time (0-4294967295)",
1592 "Subgroup coalesce timer\n"
1593 "Subgroup coalesce timer value (in ms)\n")
1595 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1598 argv_find(argv
, argc
, "(0-4294967295)", &idx
);
1599 bgp
->heuristic_coalesce
= false;
1600 bgp
->coalesce_time
= strtoul(argv
[idx
]->arg
, NULL
, 10);
1604 DEFUN (no_bgp_coalesce_time
,
1605 no_bgp_coalesce_time_cmd
,
1606 "no coalesce-time (0-4294967295)",
1608 "Subgroup coalesce timer\n"
1609 "Subgroup coalesce timer value (in ms)\n")
1611 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1613 bgp
->heuristic_coalesce
= true;
1614 bgp
->coalesce_time
= BGP_DEFAULT_SUBGROUP_COALESCE_TIME
;
1618 /* Maximum-paths configuration */
1619 DEFUN (bgp_maxpaths
,
1621 "maximum-paths " CMD_RANGE_STR(1, MULTIPATH_NUM
),
1622 "Forward packets over multiple paths\n"
1623 "Number of paths\n")
1626 return bgp_maxpaths_config_vty(vty
, BGP_PEER_EBGP
,
1627 argv
[idx_number
]->arg
, 0, 1);
1630 ALIAS_HIDDEN(bgp_maxpaths
, bgp_maxpaths_hidden_cmd
,
1631 "maximum-paths " CMD_RANGE_STR(1, MULTIPATH_NUM
),
1632 "Forward packets over multiple paths\n"
1633 "Number of paths\n")
1635 DEFUN (bgp_maxpaths_ibgp
,
1636 bgp_maxpaths_ibgp_cmd
,
1637 "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM
),
1638 "Forward packets over multiple paths\n"
1640 "Number of paths\n")
1643 return bgp_maxpaths_config_vty(vty
, BGP_PEER_IBGP
,
1644 argv
[idx_number
]->arg
, 0, 1);
1647 ALIAS_HIDDEN(bgp_maxpaths_ibgp
, bgp_maxpaths_ibgp_hidden_cmd
,
1648 "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM
),
1649 "Forward packets over multiple paths\n"
1651 "Number of paths\n")
1653 DEFUN (bgp_maxpaths_ibgp_cluster
,
1654 bgp_maxpaths_ibgp_cluster_cmd
,
1655 "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM
) " equal-cluster-length",
1656 "Forward packets over multiple paths\n"
1659 "Match the cluster length\n")
1662 return bgp_maxpaths_config_vty(
1663 vty
, BGP_PEER_IBGP
, argv
[idx_number
]->arg
,
1664 BGP_FLAG_IBGP_MULTIPATH_SAME_CLUSTERLEN
, 1);
1667 ALIAS_HIDDEN(bgp_maxpaths_ibgp_cluster
, bgp_maxpaths_ibgp_cluster_hidden_cmd
,
1668 "maximum-paths ibgp " CMD_RANGE_STR(
1669 1, MULTIPATH_NUM
) " equal-cluster-length",
1670 "Forward packets over multiple paths\n"
1673 "Match the cluster length\n")
1675 DEFUN (no_bgp_maxpaths
,
1676 no_bgp_maxpaths_cmd
,
1677 "no maximum-paths [" CMD_RANGE_STR(1, MULTIPATH_NUM
) "]",
1679 "Forward packets over multiple paths\n"
1680 "Number of paths\n")
1682 return bgp_maxpaths_config_vty(vty
, BGP_PEER_EBGP
, NULL
, 0, 0);
1685 ALIAS_HIDDEN(no_bgp_maxpaths
, no_bgp_maxpaths_hidden_cmd
,
1686 "no maximum-paths [" CMD_RANGE_STR(1, MULTIPATH_NUM
) "]", NO_STR
1687 "Forward packets over multiple paths\n"
1688 "Number of paths\n")
1690 DEFUN (no_bgp_maxpaths_ibgp
,
1691 no_bgp_maxpaths_ibgp_cmd
,
1692 "no maximum-paths ibgp [" CMD_RANGE_STR(1, MULTIPATH_NUM
) " [equal-cluster-length]]",
1694 "Forward packets over multiple paths\n"
1697 "Match the cluster length\n")
1699 return bgp_maxpaths_config_vty(vty
, BGP_PEER_IBGP
, NULL
, 0, 0);
1702 ALIAS_HIDDEN(no_bgp_maxpaths_ibgp
, no_bgp_maxpaths_ibgp_hidden_cmd
,
1703 "no maximum-paths ibgp [" CMD_RANGE_STR(
1704 1, MULTIPATH_NUM
) " [equal-cluster-length]]",
1706 "Forward packets over multiple paths\n"
1709 "Match the cluster length\n")
1711 void bgp_config_write_maxpaths(struct vty
*vty
, struct bgp
*bgp
, afi_t afi
,
1714 if (bgp
->maxpaths
[afi
][safi
].maxpaths_ebgp
!= MULTIPATH_NUM
) {
1715 vty_out(vty
, " maximum-paths %d\n",
1716 bgp
->maxpaths
[afi
][safi
].maxpaths_ebgp
);
1719 if (bgp
->maxpaths
[afi
][safi
].maxpaths_ibgp
!= MULTIPATH_NUM
) {
1720 vty_out(vty
, " maximum-paths ibgp %d",
1721 bgp
->maxpaths
[afi
][safi
].maxpaths_ibgp
);
1722 if (CHECK_FLAG(bgp
->maxpaths
[afi
][safi
].ibgp_flags
,
1723 BGP_FLAG_IBGP_MULTIPATH_SAME_CLUSTERLEN
))
1724 vty_out(vty
, " equal-cluster-length");
1733 "timers bgp (0-65535) (0-65535)",
1734 "Adjust routing timers\n"
1736 "Keepalive interval\n"
1739 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1741 int idx_number_2
= 3;
1742 unsigned long keepalive
= 0;
1743 unsigned long holdtime
= 0;
1745 keepalive
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1746 holdtime
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
1748 /* Holdtime value check. */
1749 if (holdtime
< 3 && holdtime
!= 0) {
1751 "%% hold time value must be either 0 or greater than 3\n");
1752 return CMD_WARNING_CONFIG_FAILED
;
1755 bgp_timers_set(bgp
, keepalive
, holdtime
);
1760 DEFUN (no_bgp_timers
,
1762 "no timers bgp [(0-65535) (0-65535)]",
1764 "Adjust routing timers\n"
1766 "Keepalive interval\n"
1769 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1770 bgp_timers_unset(bgp
);
1776 DEFUN (bgp_client_to_client_reflection
,
1777 bgp_client_to_client_reflection_cmd
,
1778 "bgp client-to-client reflection",
1779 "BGP specific commands\n"
1780 "Configure client to client route reflection\n"
1781 "reflection of routes allowed\n")
1783 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1784 bgp_flag_unset(bgp
, BGP_FLAG_NO_CLIENT_TO_CLIENT
);
1785 bgp_clear_star_soft_out(vty
, bgp
->name
);
1790 DEFUN (no_bgp_client_to_client_reflection
,
1791 no_bgp_client_to_client_reflection_cmd
,
1792 "no bgp client-to-client reflection",
1794 "BGP specific commands\n"
1795 "Configure client to client route reflection\n"
1796 "reflection of routes allowed\n")
1798 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1799 bgp_flag_set(bgp
, BGP_FLAG_NO_CLIENT_TO_CLIENT
);
1800 bgp_clear_star_soft_out(vty
, bgp
->name
);
1805 /* "bgp always-compare-med" configuration. */
1806 DEFUN (bgp_always_compare_med
,
1807 bgp_always_compare_med_cmd
,
1808 "bgp always-compare-med",
1809 "BGP specific commands\n"
1810 "Allow comparing MED from different neighbors\n")
1812 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1813 bgp_flag_set(bgp
, BGP_FLAG_ALWAYS_COMPARE_MED
);
1814 bgp_recalculate_all_bestpaths(bgp
);
1819 DEFUN (no_bgp_always_compare_med
,
1820 no_bgp_always_compare_med_cmd
,
1821 "no bgp always-compare-med",
1823 "BGP specific commands\n"
1824 "Allow comparing MED from different neighbors\n")
1826 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1827 bgp_flag_unset(bgp
, BGP_FLAG_ALWAYS_COMPARE_MED
);
1828 bgp_recalculate_all_bestpaths(bgp
);
1834 DEFUN(bgp_ebgp_requires_policy
, bgp_ebgp_requires_policy_cmd
,
1835 "bgp ebgp-requires-policy",
1836 "BGP specific commands\n"
1837 "Require in and out policy for eBGP peers (RFC8212)\n")
1839 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1840 bgp
->ebgp_requires_policy
= DEFAULT_EBGP_POLICY_ENABLED
;
1844 DEFUN(no_bgp_ebgp_requires_policy
, no_bgp_ebgp_requires_policy_cmd
,
1845 "no bgp ebgp-requires-policy",
1847 "BGP specific commands\n"
1848 "Require in and out policy for eBGP peers (RFC8212)\n")
1850 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1851 bgp
->ebgp_requires_policy
= DEFAULT_EBGP_POLICY_DISABLED
;
1856 /* "bgp deterministic-med" configuration. */
1857 DEFUN (bgp_deterministic_med
,
1858 bgp_deterministic_med_cmd
,
1859 "bgp deterministic-med",
1860 "BGP specific commands\n"
1861 "Pick the best-MED path among paths advertised from the neighboring AS\n")
1863 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1865 if (!bgp_flag_check(bgp
, BGP_FLAG_DETERMINISTIC_MED
)) {
1866 bgp_flag_set(bgp
, BGP_FLAG_DETERMINISTIC_MED
);
1867 bgp_recalculate_all_bestpaths(bgp
);
1873 DEFUN (no_bgp_deterministic_med
,
1874 no_bgp_deterministic_med_cmd
,
1875 "no bgp deterministic-med",
1877 "BGP specific commands\n"
1878 "Pick the best-MED path among paths advertised from the neighboring AS\n")
1880 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1881 int bestpath_per_as_used
;
1885 struct listnode
*node
, *nnode
;
1887 if (bgp_flag_check(bgp
, BGP_FLAG_DETERMINISTIC_MED
)) {
1888 bestpath_per_as_used
= 0;
1890 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
1891 FOREACH_AFI_SAFI (afi
, safi
)
1892 if (bgp_addpath_dmed_required(
1893 peer
->addpath_type
[afi
][safi
])) {
1894 bestpath_per_as_used
= 1;
1898 if (bestpath_per_as_used
)
1902 if (bestpath_per_as_used
) {
1904 "bgp deterministic-med cannot be disabled while addpath-tx-bestpath-per-AS is in use\n");
1905 return CMD_WARNING_CONFIG_FAILED
;
1907 bgp_flag_unset(bgp
, BGP_FLAG_DETERMINISTIC_MED
);
1908 bgp_recalculate_all_bestpaths(bgp
);
1915 /* "bgp graceful-restart" configuration. */
1916 DEFUN (bgp_graceful_restart
,
1917 bgp_graceful_restart_cmd
,
1918 "bgp graceful-restart",
1919 "BGP specific commands\n"
1920 "Graceful restart capability parameters\n")
1922 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1923 bgp_flag_set(bgp
, BGP_FLAG_GRACEFUL_RESTART
);
1927 DEFUN (no_bgp_graceful_restart
,
1928 no_bgp_graceful_restart_cmd
,
1929 "no bgp graceful-restart",
1931 "BGP specific commands\n"
1932 "Graceful restart capability parameters\n")
1934 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1935 bgp_flag_unset(bgp
, BGP_FLAG_GRACEFUL_RESTART
);
1939 DEFUN (bgp_graceful_restart_stalepath_time
,
1940 bgp_graceful_restart_stalepath_time_cmd
,
1941 "bgp graceful-restart stalepath-time (1-4095)",
1942 "BGP specific commands\n"
1943 "Graceful restart capability parameters\n"
1944 "Set the max time to hold onto restarting peer's stale paths\n"
1945 "Delay value (seconds)\n")
1947 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1951 stalepath
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1952 bgp
->stalepath_time
= stalepath
;
1956 DEFUN (bgp_graceful_restart_restart_time
,
1957 bgp_graceful_restart_restart_time_cmd
,
1958 "bgp graceful-restart restart-time (1-4095)",
1959 "BGP specific commands\n"
1960 "Graceful restart capability parameters\n"
1961 "Set the time to wait to delete stale routes before a BGP open message is received\n"
1962 "Delay value (seconds)\n")
1964 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1968 restart
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1969 bgp
->restart_time
= restart
;
1973 DEFUN (no_bgp_graceful_restart_stalepath_time
,
1974 no_bgp_graceful_restart_stalepath_time_cmd
,
1975 "no bgp graceful-restart stalepath-time [(1-4095)]",
1977 "BGP specific commands\n"
1978 "Graceful restart capability parameters\n"
1979 "Set the max time to hold onto restarting peer's stale paths\n"
1980 "Delay value (seconds)\n")
1982 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1984 bgp
->stalepath_time
= BGP_DEFAULT_STALEPATH_TIME
;
1988 DEFUN (no_bgp_graceful_restart_restart_time
,
1989 no_bgp_graceful_restart_restart_time_cmd
,
1990 "no bgp graceful-restart restart-time [(1-4095)]",
1992 "BGP specific commands\n"
1993 "Graceful restart capability parameters\n"
1994 "Set the time to wait to delete stale routes before a BGP open message is received\n"
1995 "Delay value (seconds)\n")
1997 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1999 bgp
->restart_time
= BGP_DEFAULT_RESTART_TIME
;
2003 DEFUN (bgp_graceful_restart_preserve_fw
,
2004 bgp_graceful_restart_preserve_fw_cmd
,
2005 "bgp graceful-restart preserve-fw-state",
2006 "BGP specific commands\n"
2007 "Graceful restart capability parameters\n"
2008 "Sets F-bit indication that fib is preserved while doing Graceful Restart\n")
2010 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2011 bgp_flag_set(bgp
, BGP_FLAG_GR_PRESERVE_FWD
);
2015 DEFUN (no_bgp_graceful_restart_preserve_fw
,
2016 no_bgp_graceful_restart_preserve_fw_cmd
,
2017 "no bgp graceful-restart preserve-fw-state",
2019 "BGP specific commands\n"
2020 "Graceful restart capability parameters\n"
2021 "Unsets F-bit indication that fib is preserved while doing Graceful Restart\n")
2023 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2024 bgp_flag_unset(bgp
, BGP_FLAG_GR_PRESERVE_FWD
);
2028 /* "bgp graceful-shutdown" configuration */
2029 DEFUN (bgp_graceful_shutdown
,
2030 bgp_graceful_shutdown_cmd
,
2031 "bgp graceful-shutdown",
2033 "Graceful shutdown parameters\n")
2035 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2037 if (!bgp_flag_check(bgp
, BGP_FLAG_GRACEFUL_SHUTDOWN
)) {
2038 bgp_flag_set(bgp
, BGP_FLAG_GRACEFUL_SHUTDOWN
);
2039 bgp_static_redo_import_check(bgp
);
2040 bgp_redistribute_redo(bgp
);
2041 bgp_clear_star_soft_out(vty
, bgp
->name
);
2042 bgp_clear_star_soft_in(vty
, bgp
->name
);
2048 DEFUN (no_bgp_graceful_shutdown
,
2049 no_bgp_graceful_shutdown_cmd
,
2050 "no bgp graceful-shutdown",
2053 "Graceful shutdown parameters\n")
2055 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2057 if (bgp_flag_check(bgp
, BGP_FLAG_GRACEFUL_SHUTDOWN
)) {
2058 bgp_flag_unset(bgp
, BGP_FLAG_GRACEFUL_SHUTDOWN
);
2059 bgp_static_redo_import_check(bgp
);
2060 bgp_redistribute_redo(bgp
);
2061 bgp_clear_star_soft_out(vty
, bgp
->name
);
2062 bgp_clear_star_soft_in(vty
, bgp
->name
);
2068 /* "bgp fast-external-failover" configuration. */
2069 DEFUN (bgp_fast_external_failover
,
2070 bgp_fast_external_failover_cmd
,
2071 "bgp fast-external-failover",
2073 "Immediately reset session if a link to a directly connected external peer goes down\n")
2075 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2076 bgp_flag_unset(bgp
, BGP_FLAG_NO_FAST_EXT_FAILOVER
);
2080 DEFUN (no_bgp_fast_external_failover
,
2081 no_bgp_fast_external_failover_cmd
,
2082 "no bgp fast-external-failover",
2085 "Immediately reset session if a link to a directly connected external peer goes down\n")
2087 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2088 bgp_flag_set(bgp
, BGP_FLAG_NO_FAST_EXT_FAILOVER
);
2092 /* "bgp bestpath compare-routerid" configuration. */
2093 DEFUN (bgp_bestpath_compare_router_id
,
2094 bgp_bestpath_compare_router_id_cmd
,
2095 "bgp bestpath compare-routerid",
2096 "BGP specific commands\n"
2097 "Change the default bestpath selection\n"
2098 "Compare router-id for identical EBGP paths\n")
2100 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2101 bgp_flag_set(bgp
, BGP_FLAG_COMPARE_ROUTER_ID
);
2102 bgp_recalculate_all_bestpaths(bgp
);
2107 DEFUN (no_bgp_bestpath_compare_router_id
,
2108 no_bgp_bestpath_compare_router_id_cmd
,
2109 "no bgp bestpath compare-routerid",
2111 "BGP specific commands\n"
2112 "Change the default bestpath selection\n"
2113 "Compare router-id for identical EBGP paths\n")
2115 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2116 bgp_flag_unset(bgp
, BGP_FLAG_COMPARE_ROUTER_ID
);
2117 bgp_recalculate_all_bestpaths(bgp
);
2122 /* "bgp bestpath as-path ignore" configuration. */
2123 DEFUN (bgp_bestpath_aspath_ignore
,
2124 bgp_bestpath_aspath_ignore_cmd
,
2125 "bgp bestpath as-path ignore",
2126 "BGP specific commands\n"
2127 "Change the default bestpath selection\n"
2128 "AS-path attribute\n"
2129 "Ignore as-path length in selecting a route\n")
2131 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2132 bgp_flag_set(bgp
, BGP_FLAG_ASPATH_IGNORE
);
2133 bgp_recalculate_all_bestpaths(bgp
);
2138 DEFUN (no_bgp_bestpath_aspath_ignore
,
2139 no_bgp_bestpath_aspath_ignore_cmd
,
2140 "no bgp bestpath as-path ignore",
2142 "BGP specific commands\n"
2143 "Change the default bestpath selection\n"
2144 "AS-path attribute\n"
2145 "Ignore as-path length in selecting a route\n")
2147 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2148 bgp_flag_unset(bgp
, BGP_FLAG_ASPATH_IGNORE
);
2149 bgp_recalculate_all_bestpaths(bgp
);
2154 /* "bgp bestpath as-path confed" configuration. */
2155 DEFUN (bgp_bestpath_aspath_confed
,
2156 bgp_bestpath_aspath_confed_cmd
,
2157 "bgp bestpath as-path confed",
2158 "BGP specific commands\n"
2159 "Change the default bestpath selection\n"
2160 "AS-path attribute\n"
2161 "Compare path lengths including confederation sets & sequences in selecting a route\n")
2163 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2164 bgp_flag_set(bgp
, BGP_FLAG_ASPATH_CONFED
);
2165 bgp_recalculate_all_bestpaths(bgp
);
2170 DEFUN (no_bgp_bestpath_aspath_confed
,
2171 no_bgp_bestpath_aspath_confed_cmd
,
2172 "no bgp bestpath as-path confed",
2174 "BGP specific commands\n"
2175 "Change the default bestpath selection\n"
2176 "AS-path attribute\n"
2177 "Compare path lengths including confederation sets & sequences in selecting a route\n")
2179 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2180 bgp_flag_unset(bgp
, BGP_FLAG_ASPATH_CONFED
);
2181 bgp_recalculate_all_bestpaths(bgp
);
2186 /* "bgp bestpath as-path multipath-relax" configuration. */
2187 DEFUN (bgp_bestpath_aspath_multipath_relax
,
2188 bgp_bestpath_aspath_multipath_relax_cmd
,
2189 "bgp bestpath as-path multipath-relax [<as-set|no-as-set>]",
2190 "BGP specific commands\n"
2191 "Change the default bestpath selection\n"
2192 "AS-path attribute\n"
2193 "Allow load sharing across routes that have different AS paths (but same length)\n"
2194 "Generate an AS_SET\n"
2195 "Do not generate an AS_SET\n")
2197 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2199 bgp_flag_set(bgp
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
);
2201 /* no-as-set is now the default behavior so we can silently
2203 if (argv_find(argv
, argc
, "as-set", &idx
))
2204 bgp_flag_set(bgp
, BGP_FLAG_MULTIPATH_RELAX_AS_SET
);
2206 bgp_flag_unset(bgp
, BGP_FLAG_MULTIPATH_RELAX_AS_SET
);
2208 bgp_recalculate_all_bestpaths(bgp
);
2213 DEFUN (no_bgp_bestpath_aspath_multipath_relax
,
2214 no_bgp_bestpath_aspath_multipath_relax_cmd
,
2215 "no bgp bestpath as-path multipath-relax [<as-set|no-as-set>]",
2217 "BGP specific commands\n"
2218 "Change the default bestpath selection\n"
2219 "AS-path attribute\n"
2220 "Allow load sharing across routes that have different AS paths (but same length)\n"
2221 "Generate an AS_SET\n"
2222 "Do not generate an AS_SET\n")
2224 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2225 bgp_flag_unset(bgp
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
);
2226 bgp_flag_unset(bgp
, BGP_FLAG_MULTIPATH_RELAX_AS_SET
);
2227 bgp_recalculate_all_bestpaths(bgp
);
2232 /* "bgp log-neighbor-changes" configuration. */
2233 DEFUN (bgp_log_neighbor_changes
,
2234 bgp_log_neighbor_changes_cmd
,
2235 "bgp log-neighbor-changes",
2236 "BGP specific commands\n"
2237 "Log neighbor up/down and reset reason\n")
2239 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2240 bgp_flag_set(bgp
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
);
2244 DEFUN (no_bgp_log_neighbor_changes
,
2245 no_bgp_log_neighbor_changes_cmd
,
2246 "no bgp log-neighbor-changes",
2248 "BGP specific commands\n"
2249 "Log neighbor up/down and reset reason\n")
2251 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2252 bgp_flag_unset(bgp
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
);
2256 /* "bgp bestpath med" configuration. */
2257 DEFUN (bgp_bestpath_med
,
2258 bgp_bestpath_med_cmd
,
2259 "bgp bestpath med <confed [missing-as-worst]|missing-as-worst [confed]>",
2260 "BGP specific commands\n"
2261 "Change the default bestpath selection\n"
2263 "Compare MED among confederation paths\n"
2264 "Treat missing MED as the least preferred one\n"
2265 "Treat missing MED as the least preferred one\n"
2266 "Compare MED among confederation paths\n")
2268 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2271 if (argv_find(argv
, argc
, "confed", &idx
))
2272 bgp_flag_set(bgp
, BGP_FLAG_MED_CONFED
);
2274 if (argv_find(argv
, argc
, "missing-as-worst", &idx
))
2275 bgp_flag_set(bgp
, BGP_FLAG_MED_MISSING_AS_WORST
);
2277 bgp_recalculate_all_bestpaths(bgp
);
2282 DEFUN (no_bgp_bestpath_med
,
2283 no_bgp_bestpath_med_cmd
,
2284 "no bgp bestpath med <confed [missing-as-worst]|missing-as-worst [confed]>",
2286 "BGP specific commands\n"
2287 "Change the default bestpath selection\n"
2289 "Compare MED among confederation paths\n"
2290 "Treat missing MED as the least preferred one\n"
2291 "Treat missing MED as the least preferred one\n"
2292 "Compare MED among confederation paths\n")
2294 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2297 if (argv_find(argv
, argc
, "confed", &idx
))
2298 bgp_flag_unset(bgp
, BGP_FLAG_MED_CONFED
);
2300 if (argv_find(argv
, argc
, "missing-as-worst", &idx
))
2301 bgp_flag_unset(bgp
, BGP_FLAG_MED_MISSING_AS_WORST
);
2303 bgp_recalculate_all_bestpaths(bgp
);
2308 /* "no bgp default ipv4-unicast". */
2309 DEFUN (no_bgp_default_ipv4_unicast
,
2310 no_bgp_default_ipv4_unicast_cmd
,
2311 "no bgp default ipv4-unicast",
2313 "BGP specific commands\n"
2314 "Configure BGP defaults\n"
2315 "Activate ipv4-unicast for a peer by default\n")
2317 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2318 bgp_flag_set(bgp
, BGP_FLAG_NO_DEFAULT_IPV4
);
2322 DEFUN (bgp_default_ipv4_unicast
,
2323 bgp_default_ipv4_unicast_cmd
,
2324 "bgp default ipv4-unicast",
2325 "BGP specific commands\n"
2326 "Configure BGP defaults\n"
2327 "Activate ipv4-unicast for a peer by default\n")
2329 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2330 bgp_flag_unset(bgp
, BGP_FLAG_NO_DEFAULT_IPV4
);
2334 /* Display hostname in certain command outputs */
2335 DEFUN (bgp_default_show_hostname
,
2336 bgp_default_show_hostname_cmd
,
2337 "bgp default show-hostname",
2338 "BGP specific commands\n"
2339 "Configure BGP defaults\n"
2340 "Show hostname in certain command outputs\n")
2342 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2343 bgp_flag_set(bgp
, BGP_FLAG_SHOW_HOSTNAME
);
2347 DEFUN (no_bgp_default_show_hostname
,
2348 no_bgp_default_show_hostname_cmd
,
2349 "no bgp default show-hostname",
2351 "BGP specific commands\n"
2352 "Configure BGP defaults\n"
2353 "Show hostname in certain command outputs\n")
2355 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2356 bgp_flag_unset(bgp
, BGP_FLAG_SHOW_HOSTNAME
);
2360 /* "bgp network import-check" configuration. */
2361 DEFUN (bgp_network_import_check
,
2362 bgp_network_import_check_cmd
,
2363 "bgp network import-check",
2364 "BGP specific commands\n"
2365 "BGP network command\n"
2366 "Check BGP network route exists in IGP\n")
2368 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2369 if (!bgp_flag_check(bgp
, BGP_FLAG_IMPORT_CHECK
)) {
2370 bgp_flag_set(bgp
, BGP_FLAG_IMPORT_CHECK
);
2371 bgp_static_redo_import_check(bgp
);
2377 ALIAS_HIDDEN(bgp_network_import_check
, bgp_network_import_check_exact_cmd
,
2378 "bgp network import-check exact",
2379 "BGP specific commands\n"
2380 "BGP network command\n"
2381 "Check BGP network route exists in IGP\n"
2382 "Match route precisely\n")
2384 DEFUN (no_bgp_network_import_check
,
2385 no_bgp_network_import_check_cmd
,
2386 "no bgp network import-check",
2388 "BGP specific commands\n"
2389 "BGP network command\n"
2390 "Check BGP network route exists in IGP\n")
2392 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2393 if (bgp_flag_check(bgp
, BGP_FLAG_IMPORT_CHECK
)) {
2394 bgp_flag_unset(bgp
, BGP_FLAG_IMPORT_CHECK
);
2395 bgp_static_redo_import_check(bgp
);
2401 DEFUN (bgp_default_local_preference
,
2402 bgp_default_local_preference_cmd
,
2403 "bgp default local-preference (0-4294967295)",
2404 "BGP specific commands\n"
2405 "Configure BGP defaults\n"
2406 "local preference (higher=more preferred)\n"
2407 "Configure default local preference value\n")
2409 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2411 uint32_t local_pref
;
2413 local_pref
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2415 bgp_default_local_preference_set(bgp
, local_pref
);
2416 bgp_clear_star_soft_in(vty
, bgp
->name
);
2421 DEFUN (no_bgp_default_local_preference
,
2422 no_bgp_default_local_preference_cmd
,
2423 "no bgp default local-preference [(0-4294967295)]",
2425 "BGP specific commands\n"
2426 "Configure BGP defaults\n"
2427 "local preference (higher=more preferred)\n"
2428 "Configure default local preference value\n")
2430 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2431 bgp_default_local_preference_unset(bgp
);
2432 bgp_clear_star_soft_in(vty
, bgp
->name
);
2438 DEFUN (bgp_default_subgroup_pkt_queue_max
,
2439 bgp_default_subgroup_pkt_queue_max_cmd
,
2440 "bgp default subgroup-pkt-queue-max (20-100)",
2441 "BGP specific commands\n"
2442 "Configure BGP defaults\n"
2443 "subgroup-pkt-queue-max\n"
2444 "Configure subgroup packet queue max\n")
2446 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2450 max_size
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2452 bgp_default_subgroup_pkt_queue_max_set(bgp
, max_size
);
2457 DEFUN (no_bgp_default_subgroup_pkt_queue_max
,
2458 no_bgp_default_subgroup_pkt_queue_max_cmd
,
2459 "no bgp default subgroup-pkt-queue-max [(20-100)]",
2461 "BGP specific commands\n"
2462 "Configure BGP defaults\n"
2463 "subgroup-pkt-queue-max\n"
2464 "Configure subgroup packet queue max\n")
2466 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2467 bgp_default_subgroup_pkt_queue_max_unset(bgp
);
2472 DEFUN (bgp_rr_allow_outbound_policy
,
2473 bgp_rr_allow_outbound_policy_cmd
,
2474 "bgp route-reflector allow-outbound-policy",
2475 "BGP specific commands\n"
2476 "Allow modifications made by out route-map\n"
2477 "on ibgp neighbors\n")
2479 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2481 if (!bgp_flag_check(bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
)) {
2482 bgp_flag_set(bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
);
2483 update_group_announce_rrclients(bgp
);
2484 bgp_clear_star_soft_out(vty
, bgp
->name
);
2490 DEFUN (no_bgp_rr_allow_outbound_policy
,
2491 no_bgp_rr_allow_outbound_policy_cmd
,
2492 "no bgp route-reflector allow-outbound-policy",
2494 "BGP specific commands\n"
2495 "Allow modifications made by out route-map\n"
2496 "on ibgp neighbors\n")
2498 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2500 if (bgp_flag_check(bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
)) {
2501 bgp_flag_unset(bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
);
2502 update_group_announce_rrclients(bgp
);
2503 bgp_clear_star_soft_out(vty
, bgp
->name
);
2509 DEFUN (bgp_listen_limit
,
2510 bgp_listen_limit_cmd
,
2511 "bgp listen limit (1-5000)",
2512 "BGP specific commands\n"
2513 "Configure BGP defaults\n"
2514 "maximum number of BGP Dynamic Neighbors that can be created\n"
2515 "Configure Dynamic Neighbors listen limit value\n")
2517 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2521 listen_limit
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2523 bgp_listen_limit_set(bgp
, listen_limit
);
2528 DEFUN (no_bgp_listen_limit
,
2529 no_bgp_listen_limit_cmd
,
2530 "no bgp listen limit [(1-5000)]",
2531 "BGP specific commands\n"
2532 "Configure BGP defaults\n"
2533 "unset maximum number of BGP Dynamic Neighbors that can be created\n"
2534 "Configure Dynamic Neighbors listen limit value to default\n"
2535 "Configure Dynamic Neighbors listen limit value\n")
2537 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2538 bgp_listen_limit_unset(bgp
);
2544 * Check if this listen range is already configured. Check for exact
2545 * match or overlap based on input.
2547 static struct peer_group
*listen_range_exists(struct bgp
*bgp
,
2548 struct prefix
*range
, int exact
)
2550 struct listnode
*node
, *nnode
;
2551 struct listnode
*node1
, *nnode1
;
2552 struct peer_group
*group
;
2557 afi
= family2afi(range
->family
);
2558 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
2559 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], node1
, nnode1
,
2562 match
= prefix_same(range
, lr
);
2564 match
= (prefix_match(range
, lr
)
2565 || prefix_match(lr
, range
));
2574 DEFUN (bgp_listen_range
,
2575 bgp_listen_range_cmd
,
2576 "bgp listen range <A.B.C.D/M|X:X::X:X/M> peer-group PGNAME",
2577 "BGP specific commands\n"
2578 "Configure BGP dynamic neighbors listen range\n"
2579 "Configure BGP dynamic neighbors listen range\n"
2581 "Member of the peer-group\n"
2582 "Peer-group name\n")
2584 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2585 struct prefix range
;
2586 struct peer_group
*group
, *existing_group
;
2591 argv_find(argv
, argc
, "A.B.C.D/M", &idx
);
2592 argv_find(argv
, argc
, "X:X::X:X/M", &idx
);
2593 char *prefix
= argv
[idx
]->arg
;
2594 argv_find(argv
, argc
, "PGNAME", &idx
);
2595 char *peergroup
= argv
[idx
]->arg
;
2597 /* Convert IP prefix string to struct prefix. */
2598 ret
= str2prefix(prefix
, &range
);
2600 vty_out(vty
, "%% Malformed listen range\n");
2601 return CMD_WARNING_CONFIG_FAILED
;
2604 afi
= family2afi(range
.family
);
2606 if (afi
== AFI_IP6
&& IN6_IS_ADDR_LINKLOCAL(&range
.u
.prefix6
)) {
2608 "%% Malformed listen range (link-local address)\n");
2609 return CMD_WARNING_CONFIG_FAILED
;
2614 /* Check if same listen range is already configured. */
2615 existing_group
= listen_range_exists(bgp
, &range
, 1);
2616 if (existing_group
) {
2617 if (strcmp(existing_group
->name
, peergroup
) == 0)
2621 "%% Same listen range is attached to peer-group %s\n",
2622 existing_group
->name
);
2623 return CMD_WARNING_CONFIG_FAILED
;
2627 /* Check if an overlapping listen range exists. */
2628 if (listen_range_exists(bgp
, &range
, 0)) {
2630 "%% Listen range overlaps with existing listen range\n");
2631 return CMD_WARNING_CONFIG_FAILED
;
2634 group
= peer_group_lookup(bgp
, peergroup
);
2636 vty_out(vty
, "%% Configure the peer-group first\n");
2637 return CMD_WARNING_CONFIG_FAILED
;
2640 ret
= peer_group_listen_range_add(group
, &range
);
2641 return bgp_vty_return(vty
, ret
);
2644 DEFUN (no_bgp_listen_range
,
2645 no_bgp_listen_range_cmd
,
2646 "no bgp listen range <A.B.C.D/M|X:X::X:X/M> peer-group PGNAME",
2648 "BGP specific commands\n"
2649 "Unconfigure BGP dynamic neighbors listen range\n"
2650 "Unconfigure BGP dynamic neighbors listen range\n"
2652 "Member of the peer-group\n"
2653 "Peer-group name\n")
2655 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2656 struct prefix range
;
2657 struct peer_group
*group
;
2662 argv_find(argv
, argc
, "A.B.C.D/M", &idx
);
2663 argv_find(argv
, argc
, "X:X::X:X/M", &idx
);
2664 char *prefix
= argv
[idx
]->arg
;
2665 argv_find(argv
, argc
, "WORD", &idx
);
2666 char *peergroup
= argv
[idx
]->arg
;
2668 /* Convert IP prefix string to struct prefix. */
2669 ret
= str2prefix(prefix
, &range
);
2671 vty_out(vty
, "%% Malformed listen range\n");
2672 return CMD_WARNING_CONFIG_FAILED
;
2675 afi
= family2afi(range
.family
);
2677 if (afi
== AFI_IP6
&& IN6_IS_ADDR_LINKLOCAL(&range
.u
.prefix6
)) {
2679 "%% Malformed listen range (link-local address)\n");
2680 return CMD_WARNING_CONFIG_FAILED
;
2685 group
= peer_group_lookup(bgp
, peergroup
);
2687 vty_out(vty
, "%% Peer-group does not exist\n");
2688 return CMD_WARNING_CONFIG_FAILED
;
2691 ret
= peer_group_listen_range_del(group
, &range
);
2692 return bgp_vty_return(vty
, ret
);
2695 void bgp_config_write_listen(struct vty
*vty
, struct bgp
*bgp
)
2697 struct peer_group
*group
;
2698 struct listnode
*node
, *nnode
, *rnode
, *nrnode
;
2699 struct prefix
*range
;
2701 char buf
[PREFIX2STR_BUFFER
];
2703 if (bgp
->dynamic_neighbors_limit
!= BGP_DYNAMIC_NEIGHBORS_LIMIT_DEFAULT
)
2704 vty_out(vty
, " bgp listen limit %d\n",
2705 bgp
->dynamic_neighbors_limit
);
2707 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
2708 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++) {
2709 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], rnode
,
2711 prefix2str(range
, buf
, sizeof(buf
));
2713 " bgp listen range %s peer-group %s\n",
2721 DEFUN (bgp_disable_connected_route_check
,
2722 bgp_disable_connected_route_check_cmd
,
2723 "bgp disable-ebgp-connected-route-check",
2724 "BGP specific commands\n"
2725 "Disable checking if nexthop is connected on ebgp sessions\n")
2727 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2728 bgp_flag_set(bgp
, BGP_FLAG_DISABLE_NH_CONNECTED_CHK
);
2729 bgp_clear_star_soft_in(vty
, bgp
->name
);
2734 DEFUN (no_bgp_disable_connected_route_check
,
2735 no_bgp_disable_connected_route_check_cmd
,
2736 "no bgp disable-ebgp-connected-route-check",
2738 "BGP specific commands\n"
2739 "Disable checking if nexthop is connected on ebgp sessions\n")
2741 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2742 bgp_flag_unset(bgp
, BGP_FLAG_DISABLE_NH_CONNECTED_CHK
);
2743 bgp_clear_star_soft_in(vty
, bgp
->name
);
2749 static int peer_remote_as_vty(struct vty
*vty
, const char *peer_str
,
2750 const char *as_str
, afi_t afi
, safi_t safi
)
2752 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2755 int as_type
= AS_SPECIFIED
;
2758 if (as_str
[0] == 'i') {
2760 as_type
= AS_INTERNAL
;
2761 } else if (as_str
[0] == 'e') {
2763 as_type
= AS_EXTERNAL
;
2765 /* Get AS number. */
2766 as
= strtoul(as_str
, NULL
, 10);
2769 /* If peer is peer group or interface peer, call proper function. */
2770 ret
= str2sockunion(peer_str
, &su
);
2774 /* Check if existing interface peer */
2775 peer
= peer_lookup_by_conf_if(bgp
, peer_str
);
2777 ret
= peer_remote_as(bgp
, NULL
, peer_str
, &as
, as_type
, afi
,
2780 /* if not interface peer, check peer-group settings */
2781 if (ret
< 0 && !peer
) {
2782 ret
= peer_group_remote_as(bgp
, peer_str
, &as
, as_type
);
2785 "%% Create the peer-group or interface first\n");
2786 return CMD_WARNING_CONFIG_FAILED
;
2791 if (peer_address_self_check(bgp
, &su
)) {
2793 "%% Can not configure the local system as neighbor\n");
2794 return CMD_WARNING_CONFIG_FAILED
;
2796 ret
= peer_remote_as(bgp
, &su
, NULL
, &as
, as_type
, afi
, safi
);
2799 /* This peer belongs to peer group. */
2801 case BGP_ERR_PEER_GROUP_MEMBER
:
2803 "%% Peer-group member cannot override remote-as of peer-group\n");
2804 return CMD_WARNING_CONFIG_FAILED
;
2805 case BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
:
2807 "%% Peer-group members must be all internal or all external\n");
2808 return CMD_WARNING_CONFIG_FAILED
;
2810 return bgp_vty_return(vty
, ret
);
2813 DEFUN (bgp_default_shutdown
,
2814 bgp_default_shutdown_cmd
,
2815 "[no] bgp default shutdown",
2818 "Configure BGP defaults\n"
2819 "Apply administrative shutdown to newly configured peers\n")
2821 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2822 bgp
->autoshutdown
= !strmatch(argv
[0]->text
, "no");
2826 DEFUN (neighbor_remote_as
,
2827 neighbor_remote_as_cmd
,
2828 "neighbor <A.B.C.D|X:X::X:X|WORD> remote-as <(1-4294967295)|internal|external>",
2831 "Specify a BGP neighbor\n"
2833 "Internal BGP peer\n"
2834 "External BGP peer\n")
2837 int idx_remote_as
= 3;
2838 return peer_remote_as_vty(vty
, argv
[idx_peer
]->arg
,
2839 argv
[idx_remote_as
]->arg
, AFI_IP
,
2843 static int peer_conf_interface_get(struct vty
*vty
, const char *conf_if
,
2844 afi_t afi
, safi_t safi
, int v6only
,
2845 const char *peer_group_name
,
2848 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2850 int as_type
= AS_UNSPECIFIED
;
2852 struct peer_group
*group
;
2856 group
= peer_group_lookup(bgp
, conf_if
);
2859 vty_out(vty
, "%% Name conflict with peer-group \n");
2860 return CMD_WARNING_CONFIG_FAILED
;
2864 if (as_str
[0] == 'i') {
2865 as_type
= AS_INTERNAL
;
2866 } else if (as_str
[0] == 'e') {
2867 as_type
= AS_EXTERNAL
;
2869 /* Get AS number. */
2870 as
= strtoul(as_str
, NULL
, 10);
2871 as_type
= AS_SPECIFIED
;
2875 peer
= peer_lookup_by_conf_if(bgp
, conf_if
);
2878 ret
= peer_remote_as(bgp
, NULL
, conf_if
, &as
, as_type
,
2881 if (bgp_flag_check(bgp
, BGP_FLAG_NO_DEFAULT_IPV4
)
2882 && afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
2883 peer
= peer_create(NULL
, conf_if
, bgp
, bgp
->as
, as
,
2884 as_type
, 0, 0, NULL
);
2886 peer
= peer_create(NULL
, conf_if
, bgp
, bgp
->as
, as
,
2887 as_type
, afi
, safi
, NULL
);
2890 vty_out(vty
, "%% BGP failed to create peer\n");
2891 return CMD_WARNING_CONFIG_FAILED
;
2895 peer_flag_set(peer
, PEER_FLAG_IFPEER_V6ONLY
);
2897 /* Request zebra to initiate IPv6 RAs on this interface. We do
2899 * any unnumbered peer in order to not worry about run-time
2901 * (e.g., peering is initially IPv4, but the IPv4 /30 or /31
2903 * gets deleted later etc.)
2906 bgp_zebra_initiate_radv(bgp
, peer
);
2909 if ((v6only
&& !CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
))
2910 || (!v6only
&& CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
))) {
2912 peer_flag_set(peer
, PEER_FLAG_IFPEER_V6ONLY
);
2914 peer_flag_unset(peer
, PEER_FLAG_IFPEER_V6ONLY
);
2916 /* v6only flag changed. Reset bgp seesion */
2917 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
2918 peer
->last_reset
= PEER_DOWN_V6ONLY_CHANGE
;
2919 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
2920 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2922 bgp_session_reset(peer
);
2925 if (!CHECK_FLAG(peer
->flags_invert
, PEER_FLAG_CAPABILITY_ENHE
)) {
2926 SET_FLAG(peer
->flags
, PEER_FLAG_CAPABILITY_ENHE
);
2927 SET_FLAG(peer
->flags_invert
, PEER_FLAG_CAPABILITY_ENHE
);
2928 SET_FLAG(peer
->flags_override
, PEER_FLAG_CAPABILITY_ENHE
);
2931 if (peer_group_name
) {
2932 group
= peer_group_lookup(bgp
, peer_group_name
);
2934 vty_out(vty
, "%% Configure the peer-group first\n");
2935 return CMD_WARNING_CONFIG_FAILED
;
2938 ret
= peer_group_bind(bgp
, &su
, peer
, group
, &as
);
2941 return bgp_vty_return(vty
, ret
);
2944 DEFUN (neighbor_interface_config
,
2945 neighbor_interface_config_cmd
,
2946 "neighbor WORD interface [peer-group PGNAME]",
2948 "Interface name or neighbor tag\n"
2949 "Enable BGP on interface\n"
2950 "Member of the peer-group\n"
2951 "Peer-group name\n")
2954 int idx_peer_group_word
= 4;
2956 if (argc
> idx_peer_group_word
)
2957 return peer_conf_interface_get(
2958 vty
, argv
[idx_word
]->arg
, AFI_IP
, SAFI_UNICAST
, 0,
2959 argv
[idx_peer_group_word
]->arg
, NULL
);
2961 return peer_conf_interface_get(vty
, argv
[idx_word
]->arg
, AFI_IP
,
2962 SAFI_UNICAST
, 0, NULL
, NULL
);
2965 DEFUN (neighbor_interface_config_v6only
,
2966 neighbor_interface_config_v6only_cmd
,
2967 "neighbor WORD interface v6only [peer-group PGNAME]",
2969 "Interface name or neighbor tag\n"
2970 "Enable BGP on interface\n"
2971 "Enable BGP with v6 link-local only\n"
2972 "Member of the peer-group\n"
2973 "Peer-group name\n")
2976 int idx_peer_group_word
= 5;
2978 if (argc
> idx_peer_group_word
)
2979 return peer_conf_interface_get(
2980 vty
, argv
[idx_word
]->arg
, AFI_IP
, SAFI_UNICAST
, 1,
2981 argv
[idx_peer_group_word
]->arg
, NULL
);
2983 return peer_conf_interface_get(vty
, argv
[idx_word
]->arg
, AFI_IP
,
2984 SAFI_UNICAST
, 1, NULL
, NULL
);
2988 DEFUN (neighbor_interface_config_remote_as
,
2989 neighbor_interface_config_remote_as_cmd
,
2990 "neighbor WORD interface remote-as <(1-4294967295)|internal|external>",
2992 "Interface name or neighbor tag\n"
2993 "Enable BGP on interface\n"
2994 "Specify a BGP neighbor\n"
2996 "Internal BGP peer\n"
2997 "External BGP peer\n")
3000 int idx_remote_as
= 4;
3001 return peer_conf_interface_get(vty
, argv
[idx_word
]->arg
, AFI_IP
,
3002 SAFI_UNICAST
, 0, NULL
,
3003 argv
[idx_remote_as
]->arg
);
3006 DEFUN (neighbor_interface_v6only_config_remote_as
,
3007 neighbor_interface_v6only_config_remote_as_cmd
,
3008 "neighbor WORD interface v6only remote-as <(1-4294967295)|internal|external>",
3010 "Interface name or neighbor tag\n"
3011 "Enable BGP with v6 link-local only\n"
3012 "Enable BGP on interface\n"
3013 "Specify a BGP neighbor\n"
3015 "Internal BGP peer\n"
3016 "External BGP peer\n")
3019 int idx_remote_as
= 5;
3020 return peer_conf_interface_get(vty
, argv
[idx_word
]->arg
, AFI_IP
,
3021 SAFI_UNICAST
, 1, NULL
,
3022 argv
[idx_remote_as
]->arg
);
3025 DEFUN (neighbor_peer_group
,
3026 neighbor_peer_group_cmd
,
3027 "neighbor WORD peer-group",
3029 "Interface name or neighbor tag\n"
3030 "Configure peer-group\n")
3032 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3035 struct peer_group
*group
;
3037 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_word
]->arg
);
3039 vty_out(vty
, "%% Name conflict with interface: \n");
3040 return CMD_WARNING_CONFIG_FAILED
;
3043 group
= peer_group_get(bgp
, argv
[idx_word
]->arg
);
3045 vty_out(vty
, "%% BGP failed to find or create peer-group\n");
3046 return CMD_WARNING_CONFIG_FAILED
;
3054 "no neighbor <WORD|<A.B.C.D|X:X::X:X> [remote-as <(1-4294967295)|internal|external>]>",
3058 "Specify a BGP neighbor\n"
3060 "Internal BGP peer\n"
3061 "External BGP peer\n")
3063 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3067 struct peer_group
*group
;
3071 ret
= str2sockunion(argv
[idx_peer
]->arg
, &su
);
3073 /* look up for neighbor by interface name config. */
3074 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_peer
]->arg
);
3076 /* Request zebra to terminate IPv6 RAs on this
3079 bgp_zebra_terminate_radv(peer
->bgp
, peer
);
3084 group
= peer_group_lookup(bgp
, argv
[idx_peer
]->arg
);
3086 peer_group_delete(group
);
3088 vty_out(vty
, "%% Create the peer-group first\n");
3089 return CMD_WARNING_CONFIG_FAILED
;
3092 peer
= peer_lookup(bgp
, &su
);
3094 if (peer_dynamic_neighbor(peer
)) {
3096 "%% Operation not allowed on a dynamic neighbor\n");
3097 return CMD_WARNING_CONFIG_FAILED
;
3100 other
= peer
->doppelganger
;
3102 if (other
&& other
->status
!= Deleted
)
3110 DEFUN (no_neighbor_interface_config
,
3111 no_neighbor_interface_config_cmd
,
3112 "no neighbor WORD interface [v6only] [peer-group PGNAME] [remote-as <(1-4294967295)|internal|external>]",
3116 "Configure BGP on interface\n"
3117 "Enable BGP with v6 link-local only\n"
3118 "Member of the peer-group\n"
3120 "Specify a BGP neighbor\n"
3122 "Internal BGP peer\n"
3123 "External BGP peer\n")
3125 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3129 /* look up for neighbor by interface name config. */
3130 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_word
]->arg
);
3132 /* Request zebra to terminate IPv6 RAs on this interface. */
3134 bgp_zebra_terminate_radv(peer
->bgp
, peer
);
3137 vty_out(vty
, "%% Create the bgp interface first\n");
3138 return CMD_WARNING_CONFIG_FAILED
;
3143 DEFUN (no_neighbor_peer_group
,
3144 no_neighbor_peer_group_cmd
,
3145 "no neighbor WORD peer-group",
3149 "Configure peer-group\n")
3151 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3153 struct peer_group
*group
;
3155 group
= peer_group_lookup(bgp
, argv
[idx_word
]->arg
);
3157 peer_group_delete(group
);
3159 vty_out(vty
, "%% Create the peer-group first\n");
3160 return CMD_WARNING_CONFIG_FAILED
;
3165 DEFUN (no_neighbor_interface_peer_group_remote_as
,
3166 no_neighbor_interface_peer_group_remote_as_cmd
,
3167 "no neighbor WORD remote-as <(1-4294967295)|internal|external>",
3170 "Interface name or neighbor tag\n"
3171 "Specify a BGP neighbor\n"
3173 "Internal BGP peer\n"
3174 "External BGP peer\n")
3176 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3178 struct peer_group
*group
;
3181 /* look up for neighbor by interface name config. */
3182 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_word
]->arg
);
3184 peer_as_change(peer
, 0, AS_UNSPECIFIED
);
3188 group
= peer_group_lookup(bgp
, argv
[idx_word
]->arg
);
3190 peer_group_remote_as_delete(group
);
3192 vty_out(vty
, "%% Create the peer-group or interface first\n");
3193 return CMD_WARNING_CONFIG_FAILED
;
3198 DEFUN (neighbor_local_as
,
3199 neighbor_local_as_cmd
,
3200 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295)",
3203 "Specify a local-as number\n"
3204 "AS number used as local AS\n")
3212 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3214 return CMD_WARNING_CONFIG_FAILED
;
3216 as
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
3217 ret
= peer_local_as_set(peer
, as
, 0, 0);
3218 return bgp_vty_return(vty
, ret
);
3221 DEFUN (neighbor_local_as_no_prepend
,
3222 neighbor_local_as_no_prepend_cmd
,
3223 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295) no-prepend",
3226 "Specify a local-as number\n"
3227 "AS number used as local AS\n"
3228 "Do not prepend local-as to updates from ebgp peers\n")
3236 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3238 return CMD_WARNING_CONFIG_FAILED
;
3240 as
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
3241 ret
= peer_local_as_set(peer
, as
, 1, 0);
3242 return bgp_vty_return(vty
, ret
);
3245 DEFUN (neighbor_local_as_no_prepend_replace_as
,
3246 neighbor_local_as_no_prepend_replace_as_cmd
,
3247 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295) no-prepend replace-as",
3250 "Specify a local-as number\n"
3251 "AS number used as local AS\n"
3252 "Do not prepend local-as to updates from ebgp peers\n"
3253 "Do not prepend local-as to updates from ibgp peers\n")
3261 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3263 return CMD_WARNING_CONFIG_FAILED
;
3265 as
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
3266 ret
= peer_local_as_set(peer
, as
, 1, 1);
3267 return bgp_vty_return(vty
, ret
);
3270 DEFUN (no_neighbor_local_as
,
3271 no_neighbor_local_as_cmd
,
3272 "no neighbor <A.B.C.D|X:X::X:X|WORD> local-as [(1-4294967295) [no-prepend [replace-as]]]",
3276 "Specify a local-as number\n"
3277 "AS number used as local AS\n"
3278 "Do not prepend local-as to updates from ebgp peers\n"
3279 "Do not prepend local-as to updates from ibgp peers\n")
3285 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3287 return CMD_WARNING_CONFIG_FAILED
;
3289 ret
= peer_local_as_unset(peer
);
3290 return bgp_vty_return(vty
, ret
);
3294 DEFUN (neighbor_solo
,
3296 "neighbor <A.B.C.D|X:X::X:X|WORD> solo",
3299 "Solo peer - part of its own update group\n")
3305 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3307 return CMD_WARNING_CONFIG_FAILED
;
3309 ret
= update_group_adjust_soloness(peer
, 1);
3310 return bgp_vty_return(vty
, ret
);
3313 DEFUN (no_neighbor_solo
,
3314 no_neighbor_solo_cmd
,
3315 "no neighbor <A.B.C.D|X:X::X:X|WORD> solo",
3319 "Solo peer - part of its own update group\n")
3325 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3327 return CMD_WARNING_CONFIG_FAILED
;
3329 ret
= update_group_adjust_soloness(peer
, 0);
3330 return bgp_vty_return(vty
, ret
);
3333 DEFUN (neighbor_password
,
3334 neighbor_password_cmd
,
3335 "neighbor <A.B.C.D|X:X::X:X|WORD> password LINE",
3346 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3348 return CMD_WARNING_CONFIG_FAILED
;
3350 ret
= peer_password_set(peer
, argv
[idx_line
]->arg
);
3351 return bgp_vty_return(vty
, ret
);
3354 DEFUN (no_neighbor_password
,
3355 no_neighbor_password_cmd
,
3356 "no neighbor <A.B.C.D|X:X::X:X|WORD> password [LINE]",
3367 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3369 return CMD_WARNING_CONFIG_FAILED
;
3371 ret
= peer_password_unset(peer
);
3372 return bgp_vty_return(vty
, ret
);
3375 DEFUN (neighbor_activate
,
3376 neighbor_activate_cmd
,
3377 "neighbor <A.B.C.D|X:X::X:X|WORD> activate",
3380 "Enable the Address Family for this Neighbor\n")
3386 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3388 return CMD_WARNING_CONFIG_FAILED
;
3390 ret
= peer_activate(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
));
3391 return bgp_vty_return(vty
, ret
);
3394 ALIAS_HIDDEN(neighbor_activate
, neighbor_activate_hidden_cmd
,
3395 "neighbor <A.B.C.D|X:X::X:X|WORD> activate",
3396 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3397 "Enable the Address Family for this Neighbor\n")
3399 DEFUN (no_neighbor_activate
,
3400 no_neighbor_activate_cmd
,
3401 "no neighbor <A.B.C.D|X:X::X:X|WORD> activate",
3405 "Enable the Address Family for this Neighbor\n")
3412 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3414 return CMD_WARNING_CONFIG_FAILED
;
3416 ret
= peer_deactivate(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
));
3417 return bgp_vty_return(vty
, ret
);
3420 ALIAS_HIDDEN(no_neighbor_activate
, no_neighbor_activate_hidden_cmd
,
3421 "no neighbor <A.B.C.D|X:X::X:X|WORD> activate",
3422 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3423 "Enable the Address Family for this Neighbor\n")
3425 DEFUN (neighbor_set_peer_group
,
3426 neighbor_set_peer_group_cmd
,
3427 "neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
3430 "Member of the peer-group\n"
3431 "Peer-group name\n")
3433 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3440 struct peer_group
*group
;
3442 ret
= str2sockunion(argv
[idx_peer
]->arg
, &su
);
3444 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_peer
]->arg
);
3446 vty_out(vty
, "%% Malformed address or name: %s\n",
3447 argv
[idx_peer
]->arg
);
3448 return CMD_WARNING_CONFIG_FAILED
;
3451 if (peer_address_self_check(bgp
, &su
)) {
3453 "%% Can not configure the local system as neighbor\n");
3454 return CMD_WARNING_CONFIG_FAILED
;
3457 /* Disallow for dynamic neighbor. */
3458 peer
= peer_lookup(bgp
, &su
);
3459 if (peer
&& peer_dynamic_neighbor(peer
)) {
3461 "%% Operation not allowed on a dynamic neighbor\n");
3462 return CMD_WARNING_CONFIG_FAILED
;
3466 group
= peer_group_lookup(bgp
, argv
[idx_word
]->arg
);
3468 vty_out(vty
, "%% Configure the peer-group first\n");
3469 return CMD_WARNING_CONFIG_FAILED
;
3472 ret
= peer_group_bind(bgp
, &su
, peer
, group
, &as
);
3474 if (ret
== BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
) {
3476 "%% Peer with AS %u cannot be in this peer-group, members must be all internal or all external\n",
3478 return CMD_WARNING_CONFIG_FAILED
;
3481 return bgp_vty_return(vty
, ret
);
3484 ALIAS_HIDDEN(neighbor_set_peer_group
, neighbor_set_peer_group_hidden_cmd
,
3485 "neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
3486 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3487 "Member of the peer-group\n"
3488 "Peer-group name\n")
3490 DEFUN (no_neighbor_set_peer_group
,
3491 no_neighbor_set_peer_group_cmd
,
3492 "no neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
3496 "Member of the peer-group\n"
3497 "Peer-group name\n")
3499 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3504 struct peer_group
*group
;
3506 peer
= peer_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3508 return CMD_WARNING_CONFIG_FAILED
;
3510 group
= peer_group_lookup(bgp
, argv
[idx_word
]->arg
);
3512 vty_out(vty
, "%% Configure the peer-group first\n");
3513 return CMD_WARNING_CONFIG_FAILED
;
3516 ret
= peer_delete(peer
);
3518 return bgp_vty_return(vty
, ret
);
3521 ALIAS_HIDDEN(no_neighbor_set_peer_group
, no_neighbor_set_peer_group_hidden_cmd
,
3522 "no neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
3523 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3524 "Member of the peer-group\n"
3525 "Peer-group name\n")
3527 static int peer_flag_modify_vty(struct vty
*vty
, const char *ip_str
,
3528 uint32_t flag
, int set
)
3533 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
3535 return CMD_WARNING_CONFIG_FAILED
;
3538 * If 'neighbor <interface>', then this is for directly connected peers,
3539 * we should not accept disable-connected-check.
3541 if (peer
->conf_if
&& (flag
== PEER_FLAG_DISABLE_CONNECTED_CHECK
)) {
3543 "%s is directly connected peer, cannot accept disable-"
3544 "connected-check\n",
3546 return CMD_WARNING_CONFIG_FAILED
;
3549 if (!set
&& flag
== PEER_FLAG_SHUTDOWN
)
3550 peer_tx_shutdown_message_unset(peer
);
3553 ret
= peer_flag_set(peer
, flag
);
3555 ret
= peer_flag_unset(peer
, flag
);
3557 return bgp_vty_return(vty
, ret
);
3560 static int peer_flag_set_vty(struct vty
*vty
, const char *ip_str
, uint32_t flag
)
3562 return peer_flag_modify_vty(vty
, ip_str
, flag
, 1);
3565 static int peer_flag_unset_vty(struct vty
*vty
, const char *ip_str
,
3568 return peer_flag_modify_vty(vty
, ip_str
, flag
, 0);
3571 /* neighbor passive. */
3572 DEFUN (neighbor_passive
,
3573 neighbor_passive_cmd
,
3574 "neighbor <A.B.C.D|X:X::X:X|WORD> passive",
3577 "Don't send open messages to this neighbor\n")
3580 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
, PEER_FLAG_PASSIVE
);
3583 DEFUN (no_neighbor_passive
,
3584 no_neighbor_passive_cmd
,
3585 "no neighbor <A.B.C.D|X:X::X:X|WORD> passive",
3589 "Don't send open messages to this neighbor\n")
3592 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
, PEER_FLAG_PASSIVE
);
3595 /* neighbor shutdown. */
3596 DEFUN (neighbor_shutdown_msg
,
3597 neighbor_shutdown_msg_cmd
,
3598 "neighbor <A.B.C.D|X:X::X:X|WORD> shutdown message MSG...",
3601 "Administratively shut down this neighbor\n"
3602 "Add a shutdown message (draft-ietf-idr-shutdown-06)\n"
3603 "Shutdown message\n")
3609 peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3613 return CMD_WARNING_CONFIG_FAILED
;
3614 message
= argv_concat(argv
, argc
, 4);
3615 peer_tx_shutdown_message_set(peer
, message
);
3616 XFREE(MTYPE_TMP
, message
);
3619 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
, PEER_FLAG_SHUTDOWN
);
3622 ALIAS(neighbor_shutdown_msg
, neighbor_shutdown_cmd
,
3623 "neighbor <A.B.C.D|X:X::X:X|WORD> shutdown",
3624 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3625 "Administratively shut down this neighbor\n")
3627 DEFUN (no_neighbor_shutdown_msg
,
3628 no_neighbor_shutdown_msg_cmd
,
3629 "no neighbor <A.B.C.D|X:X::X:X|WORD> shutdown message MSG...",
3633 "Administratively shut down this neighbor\n"
3634 "Remove a shutdown message (draft-ietf-idr-shutdown-06)\n"
3635 "Shutdown message\n")
3639 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3640 PEER_FLAG_SHUTDOWN
);
3643 ALIAS(no_neighbor_shutdown_msg
, no_neighbor_shutdown_cmd
,
3644 "no neighbor <A.B.C.D|X:X::X:X|WORD> shutdown",
3645 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3646 "Administratively shut down this neighbor\n")
3648 /* neighbor capability dynamic. */
3649 DEFUN (neighbor_capability_dynamic
,
3650 neighbor_capability_dynamic_cmd
,
3651 "neighbor <A.B.C.D|X:X::X:X|WORD> capability dynamic",
3654 "Advertise capability to the peer\n"
3655 "Advertise dynamic capability to this neighbor\n")
3658 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
3659 PEER_FLAG_DYNAMIC_CAPABILITY
);
3662 DEFUN (no_neighbor_capability_dynamic
,
3663 no_neighbor_capability_dynamic_cmd
,
3664 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability dynamic",
3668 "Advertise capability to the peer\n"
3669 "Advertise dynamic capability to this neighbor\n")
3672 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3673 PEER_FLAG_DYNAMIC_CAPABILITY
);
3676 /* neighbor dont-capability-negotiate */
3677 DEFUN (neighbor_dont_capability_negotiate
,
3678 neighbor_dont_capability_negotiate_cmd
,
3679 "neighbor <A.B.C.D|X:X::X:X|WORD> dont-capability-negotiate",
3682 "Do not perform capability negotiation\n")
3685 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
3686 PEER_FLAG_DONT_CAPABILITY
);
3689 DEFUN (no_neighbor_dont_capability_negotiate
,
3690 no_neighbor_dont_capability_negotiate_cmd
,
3691 "no neighbor <A.B.C.D|X:X::X:X|WORD> dont-capability-negotiate",
3695 "Do not perform capability negotiation\n")
3698 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3699 PEER_FLAG_DONT_CAPABILITY
);
3702 /* neighbor capability extended next hop encoding */
3703 DEFUN (neighbor_capability_enhe
,
3704 neighbor_capability_enhe_cmd
,
3705 "neighbor <A.B.C.D|X:X::X:X|WORD> capability extended-nexthop",
3708 "Advertise capability to the peer\n"
3709 "Advertise extended next-hop capability to the peer\n")
3712 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
3713 PEER_FLAG_CAPABILITY_ENHE
);
3716 DEFUN (no_neighbor_capability_enhe
,
3717 no_neighbor_capability_enhe_cmd
,
3718 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability extended-nexthop",
3722 "Advertise capability to the peer\n"
3723 "Advertise extended next-hop capability to the peer\n")
3726 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3727 PEER_FLAG_CAPABILITY_ENHE
);
3730 static int peer_af_flag_modify_vty(struct vty
*vty
, const char *peer_str
,
3731 afi_t afi
, safi_t safi
, uint32_t flag
,
3737 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
3739 return CMD_WARNING_CONFIG_FAILED
;
3742 ret
= peer_af_flag_set(peer
, afi
, safi
, flag
);
3744 ret
= peer_af_flag_unset(peer
, afi
, safi
, flag
);
3746 return bgp_vty_return(vty
, ret
);
3749 static int peer_af_flag_set_vty(struct vty
*vty
, const char *peer_str
,
3750 afi_t afi
, safi_t safi
, uint32_t flag
)
3752 return peer_af_flag_modify_vty(vty
, peer_str
, afi
, safi
, flag
, 1);
3755 static int peer_af_flag_unset_vty(struct vty
*vty
, const char *peer_str
,
3756 afi_t afi
, safi_t safi
, uint32_t flag
)
3758 return peer_af_flag_modify_vty(vty
, peer_str
, afi
, safi
, flag
, 0);
3761 /* neighbor capability orf prefix-list. */
3762 DEFUN (neighbor_capability_orf_prefix
,
3763 neighbor_capability_orf_prefix_cmd
,
3764 "neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
3767 "Advertise capability to the peer\n"
3768 "Advertise ORF capability to the peer\n"
3769 "Advertise prefixlist ORF capability to this neighbor\n"
3770 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
3771 "Capability to RECEIVE the ORF from this neighbor\n"
3772 "Capability to SEND the ORF to this neighbor\n")
3775 int idx_send_recv
= 5;
3778 if (strmatch(argv
[idx_send_recv
]->text
, "send"))
3779 flag
= PEER_FLAG_ORF_PREFIX_SM
;
3780 else if (strmatch(argv
[idx_send_recv
]->text
, "receive"))
3781 flag
= PEER_FLAG_ORF_PREFIX_RM
;
3782 else if (strmatch(argv
[idx_send_recv
]->text
, "both"))
3783 flag
= PEER_FLAG_ORF_PREFIX_SM
| PEER_FLAG_ORF_PREFIX_RM
;
3785 vty_out(vty
, "%% BGP invalid orf prefix-list option\n");
3786 return CMD_WARNING_CONFIG_FAILED
;
3789 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
3790 bgp_node_safi(vty
), flag
);
3794 neighbor_capability_orf_prefix
,
3795 neighbor_capability_orf_prefix_hidden_cmd
,
3796 "neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
3797 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3798 "Advertise capability to the peer\n"
3799 "Advertise ORF capability to the peer\n"
3800 "Advertise prefixlist ORF capability to this neighbor\n"
3801 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
3802 "Capability to RECEIVE the ORF from this neighbor\n"
3803 "Capability to SEND the ORF to this neighbor\n")
3805 DEFUN (no_neighbor_capability_orf_prefix
,
3806 no_neighbor_capability_orf_prefix_cmd
,
3807 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
3811 "Advertise capability to the peer\n"
3812 "Advertise ORF capability to the peer\n"
3813 "Advertise prefixlist ORF capability to this neighbor\n"
3814 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
3815 "Capability to RECEIVE the ORF from this neighbor\n"
3816 "Capability to SEND the ORF to this neighbor\n")
3819 int idx_send_recv
= 6;
3822 if (strmatch(argv
[idx_send_recv
]->text
, "send"))
3823 flag
= PEER_FLAG_ORF_PREFIX_SM
;
3824 else if (strmatch(argv
[idx_send_recv
]->text
, "receive"))
3825 flag
= PEER_FLAG_ORF_PREFIX_RM
;
3826 else if (strmatch(argv
[idx_send_recv
]->text
, "both"))
3827 flag
= PEER_FLAG_ORF_PREFIX_SM
| PEER_FLAG_ORF_PREFIX_RM
;
3829 vty_out(vty
, "%% BGP invalid orf prefix-list option\n");
3830 return CMD_WARNING_CONFIG_FAILED
;
3833 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3834 bgp_node_afi(vty
), bgp_node_safi(vty
),
3839 no_neighbor_capability_orf_prefix
,
3840 no_neighbor_capability_orf_prefix_hidden_cmd
,
3841 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
3842 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3843 "Advertise capability to the peer\n"
3844 "Advertise ORF capability to the peer\n"
3845 "Advertise prefixlist ORF capability to this neighbor\n"
3846 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
3847 "Capability to RECEIVE the ORF from this neighbor\n"
3848 "Capability to SEND the ORF to this neighbor\n")
3850 /* neighbor next-hop-self. */
3851 DEFUN (neighbor_nexthop_self
,
3852 neighbor_nexthop_self_cmd
,
3853 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
3856 "Disable the next hop calculation for this neighbor\n")
3859 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
3860 bgp_node_safi(vty
), PEER_FLAG_NEXTHOP_SELF
);
3863 ALIAS_HIDDEN(neighbor_nexthop_self
, neighbor_nexthop_self_hidden_cmd
,
3864 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
3865 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3866 "Disable the next hop calculation for this neighbor\n")
3868 /* neighbor next-hop-self. */
3869 DEFUN (neighbor_nexthop_self_force
,
3870 neighbor_nexthop_self_force_cmd
,
3871 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
3874 "Disable the next hop calculation for this neighbor\n"
3875 "Set the next hop to self for reflected routes\n")
3878 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
3880 PEER_FLAG_FORCE_NEXTHOP_SELF
);
3883 ALIAS_HIDDEN(neighbor_nexthop_self_force
,
3884 neighbor_nexthop_self_force_hidden_cmd
,
3885 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
3886 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3887 "Disable the next hop calculation for this neighbor\n"
3888 "Set the next hop to self for reflected routes\n")
3890 ALIAS_HIDDEN(neighbor_nexthop_self_force
,
3891 neighbor_nexthop_self_all_hidden_cmd
,
3892 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self all",
3893 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3894 "Disable the next hop calculation for this neighbor\n"
3895 "Set the next hop to self for reflected routes\n")
3897 DEFUN (no_neighbor_nexthop_self
,
3898 no_neighbor_nexthop_self_cmd
,
3899 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
3903 "Disable the next hop calculation for this neighbor\n")
3906 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3907 bgp_node_afi(vty
), bgp_node_safi(vty
),
3908 PEER_FLAG_NEXTHOP_SELF
);
3911 ALIAS_HIDDEN(no_neighbor_nexthop_self
, no_neighbor_nexthop_self_hidden_cmd
,
3912 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
3913 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3914 "Disable the next hop calculation for this neighbor\n")
3916 DEFUN (no_neighbor_nexthop_self_force
,
3917 no_neighbor_nexthop_self_force_cmd
,
3918 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
3922 "Disable the next hop calculation for this neighbor\n"
3923 "Set the next hop to self for reflected routes\n")
3926 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3927 bgp_node_afi(vty
), bgp_node_safi(vty
),
3928 PEER_FLAG_FORCE_NEXTHOP_SELF
);
3931 ALIAS_HIDDEN(no_neighbor_nexthop_self_force
,
3932 no_neighbor_nexthop_self_force_hidden_cmd
,
3933 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
3934 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3935 "Disable the next hop calculation for this neighbor\n"
3936 "Set the next hop to self for reflected routes\n")
3938 ALIAS_HIDDEN(no_neighbor_nexthop_self_force
,
3939 no_neighbor_nexthop_self_all_hidden_cmd
,
3940 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self all",
3941 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3942 "Disable the next hop calculation for this neighbor\n"
3943 "Set the next hop to self for reflected routes\n")
3945 /* neighbor as-override */
3946 DEFUN (neighbor_as_override
,
3947 neighbor_as_override_cmd
,
3948 "neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
3951 "Override ASNs in outbound updates if aspath equals remote-as\n")
3954 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
3955 bgp_node_safi(vty
), PEER_FLAG_AS_OVERRIDE
);
3958 ALIAS_HIDDEN(neighbor_as_override
, neighbor_as_override_hidden_cmd
,
3959 "neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
3960 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3961 "Override ASNs in outbound updates if aspath equals remote-as\n")
3963 DEFUN (no_neighbor_as_override
,
3964 no_neighbor_as_override_cmd
,
3965 "no neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
3969 "Override ASNs in outbound updates if aspath equals remote-as\n")
3972 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3973 bgp_node_afi(vty
), bgp_node_safi(vty
),
3974 PEER_FLAG_AS_OVERRIDE
);
3977 ALIAS_HIDDEN(no_neighbor_as_override
, no_neighbor_as_override_hidden_cmd
,
3978 "no neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
3979 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3980 "Override ASNs in outbound updates if aspath equals remote-as\n")
3982 /* neighbor remove-private-AS. */
3983 DEFUN (neighbor_remove_private_as
,
3984 neighbor_remove_private_as_cmd
,
3985 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
3988 "Remove private ASNs in outbound updates\n")
3991 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
3993 PEER_FLAG_REMOVE_PRIVATE_AS
);
3996 ALIAS_HIDDEN(neighbor_remove_private_as
, neighbor_remove_private_as_hidden_cmd
,
3997 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
3998 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3999 "Remove private ASNs in outbound updates\n")
4001 DEFUN (neighbor_remove_private_as_all
,
4002 neighbor_remove_private_as_all_cmd
,
4003 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
4006 "Remove private ASNs in outbound updates\n"
4007 "Apply to all AS numbers\n")
4010 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4012 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
);
4015 ALIAS_HIDDEN(neighbor_remove_private_as_all
,
4016 neighbor_remove_private_as_all_hidden_cmd
,
4017 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
4018 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4019 "Remove private ASNs in outbound updates\n"
4020 "Apply to all AS numbers")
4022 DEFUN (neighbor_remove_private_as_replace_as
,
4023 neighbor_remove_private_as_replace_as_cmd
,
4024 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
4027 "Remove private ASNs in outbound updates\n"
4028 "Replace private ASNs with our ASN in outbound updates\n")
4031 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4033 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
);
4036 ALIAS_HIDDEN(neighbor_remove_private_as_replace_as
,
4037 neighbor_remove_private_as_replace_as_hidden_cmd
,
4038 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
4039 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4040 "Remove private ASNs in outbound updates\n"
4041 "Replace private ASNs with our ASN in outbound updates\n")
4043 DEFUN (neighbor_remove_private_as_all_replace_as
,
4044 neighbor_remove_private_as_all_replace_as_cmd
,
4045 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
4048 "Remove private ASNs in outbound updates\n"
4049 "Apply to all AS numbers\n"
4050 "Replace private ASNs with our ASN in outbound updates\n")
4053 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4055 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
);
4059 neighbor_remove_private_as_all_replace_as
,
4060 neighbor_remove_private_as_all_replace_as_hidden_cmd
,
4061 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
4062 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4063 "Remove private ASNs in outbound updates\n"
4064 "Apply to all AS numbers\n"
4065 "Replace private ASNs with our ASN in outbound updates\n")
4067 DEFUN (no_neighbor_remove_private_as
,
4068 no_neighbor_remove_private_as_cmd
,
4069 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
4073 "Remove private ASNs in outbound updates\n")
4076 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4077 bgp_node_afi(vty
), bgp_node_safi(vty
),
4078 PEER_FLAG_REMOVE_PRIVATE_AS
);
4081 ALIAS_HIDDEN(no_neighbor_remove_private_as
,
4082 no_neighbor_remove_private_as_hidden_cmd
,
4083 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
4084 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4085 "Remove private ASNs in outbound updates\n")
4087 DEFUN (no_neighbor_remove_private_as_all
,
4088 no_neighbor_remove_private_as_all_cmd
,
4089 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
4093 "Remove private ASNs in outbound updates\n"
4094 "Apply to all AS numbers\n")
4097 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4098 bgp_node_afi(vty
), bgp_node_safi(vty
),
4099 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
);
4102 ALIAS_HIDDEN(no_neighbor_remove_private_as_all
,
4103 no_neighbor_remove_private_as_all_hidden_cmd
,
4104 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
4105 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4106 "Remove private ASNs in outbound updates\n"
4107 "Apply to all AS numbers\n")
4109 DEFUN (no_neighbor_remove_private_as_replace_as
,
4110 no_neighbor_remove_private_as_replace_as_cmd
,
4111 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
4115 "Remove private ASNs in outbound updates\n"
4116 "Replace private ASNs with our ASN in outbound updates\n")
4119 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4120 bgp_node_afi(vty
), bgp_node_safi(vty
),
4121 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
);
4124 ALIAS_HIDDEN(no_neighbor_remove_private_as_replace_as
,
4125 no_neighbor_remove_private_as_replace_as_hidden_cmd
,
4126 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
4127 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4128 "Remove private ASNs in outbound updates\n"
4129 "Replace private ASNs with our ASN in outbound updates\n")
4131 DEFUN (no_neighbor_remove_private_as_all_replace_as
,
4132 no_neighbor_remove_private_as_all_replace_as_cmd
,
4133 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
4137 "Remove private ASNs in outbound updates\n"
4138 "Apply to all AS numbers\n"
4139 "Replace private ASNs with our ASN in outbound updates\n")
4142 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4143 bgp_node_afi(vty
), bgp_node_safi(vty
),
4144 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
);
4148 no_neighbor_remove_private_as_all_replace_as
,
4149 no_neighbor_remove_private_as_all_replace_as_hidden_cmd
,
4150 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
4151 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4152 "Remove private ASNs in outbound updates\n"
4153 "Apply to all AS numbers\n"
4154 "Replace private ASNs with our ASN in outbound updates\n")
4157 /* neighbor send-community. */
4158 DEFUN (neighbor_send_community
,
4159 neighbor_send_community_cmd
,
4160 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
4163 "Send Community attribute to this neighbor\n")
4167 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4169 PEER_FLAG_SEND_COMMUNITY
);
4172 ALIAS_HIDDEN(neighbor_send_community
, neighbor_send_community_hidden_cmd
,
4173 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
4174 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4175 "Send Community attribute to this neighbor\n")
4177 DEFUN (no_neighbor_send_community
,
4178 no_neighbor_send_community_cmd
,
4179 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
4183 "Send Community attribute to this neighbor\n")
4187 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4188 bgp_node_afi(vty
), bgp_node_safi(vty
),
4189 PEER_FLAG_SEND_COMMUNITY
);
4192 ALIAS_HIDDEN(no_neighbor_send_community
, no_neighbor_send_community_hidden_cmd
,
4193 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
4194 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4195 "Send Community attribute to this neighbor\n")
4197 /* neighbor send-community extended. */
4198 DEFUN (neighbor_send_community_type
,
4199 neighbor_send_community_type_cmd
,
4200 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
4203 "Send Community attribute to this neighbor\n"
4204 "Send Standard and Extended Community attributes\n"
4205 "Send Standard, Large and Extended Community attributes\n"
4206 "Send Extended Community attributes\n"
4207 "Send Standard Community attributes\n"
4208 "Send Large Community attributes\n")
4212 const char *type
= argv
[argc
- 1]->text
;
4214 if (strmatch(type
, "standard")) {
4215 SET_FLAG(flag
, PEER_FLAG_SEND_COMMUNITY
);
4216 } else if (strmatch(type
, "extended")) {
4217 SET_FLAG(flag
, PEER_FLAG_SEND_EXT_COMMUNITY
);
4218 } else if (strmatch(type
, "large")) {
4219 SET_FLAG(flag
, PEER_FLAG_SEND_LARGE_COMMUNITY
);
4220 } else if (strmatch(type
, "both")) {
4221 SET_FLAG(flag
, PEER_FLAG_SEND_COMMUNITY
);
4222 SET_FLAG(flag
, PEER_FLAG_SEND_EXT_COMMUNITY
);
4223 } else { /* if (strmatch(type, "all")) */
4224 SET_FLAG(flag
, PEER_FLAG_SEND_COMMUNITY
);
4225 SET_FLAG(flag
, PEER_FLAG_SEND_EXT_COMMUNITY
);
4226 SET_FLAG(flag
, PEER_FLAG_SEND_LARGE_COMMUNITY
);
4229 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4230 bgp_node_safi(vty
), flag
);
4234 neighbor_send_community_type
, neighbor_send_community_type_hidden_cmd
,
4235 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
4236 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4237 "Send Community attribute to this neighbor\n"
4238 "Send Standard and Extended Community attributes\n"
4239 "Send Standard, Large and Extended Community attributes\n"
4240 "Send Extended Community attributes\n"
4241 "Send Standard Community attributes\n"
4242 "Send Large Community attributes\n")
4244 DEFUN (no_neighbor_send_community_type
,
4245 no_neighbor_send_community_type_cmd
,
4246 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
4250 "Send Community attribute to this neighbor\n"
4251 "Send Standard and Extended Community attributes\n"
4252 "Send Standard, Large and Extended Community attributes\n"
4253 "Send Extended Community attributes\n"
4254 "Send Standard Community attributes\n"
4255 "Send Large Community attributes\n")
4259 const char *type
= argv
[argc
- 1]->text
;
4261 if (strmatch(type
, "standard")) {
4262 SET_FLAG(flag
, PEER_FLAG_SEND_COMMUNITY
);
4263 } else if (strmatch(type
, "extended")) {
4264 SET_FLAG(flag
, PEER_FLAG_SEND_EXT_COMMUNITY
);
4265 } else if (strmatch(type
, "large")) {
4266 SET_FLAG(flag
, PEER_FLAG_SEND_LARGE_COMMUNITY
);
4267 } else if (strmatch(type
, "both")) {
4268 SET_FLAG(flag
, PEER_FLAG_SEND_COMMUNITY
);
4269 SET_FLAG(flag
, PEER_FLAG_SEND_EXT_COMMUNITY
);
4270 } else { /* if (strmatch(type, "all")) */
4271 SET_FLAG(flag
, PEER_FLAG_SEND_COMMUNITY
);
4272 SET_FLAG(flag
, PEER_FLAG_SEND_EXT_COMMUNITY
);
4273 SET_FLAG(flag
, PEER_FLAG_SEND_LARGE_COMMUNITY
);
4276 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4277 bgp_node_afi(vty
), bgp_node_safi(vty
),
4282 no_neighbor_send_community_type
,
4283 no_neighbor_send_community_type_hidden_cmd
,
4284 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
4285 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4286 "Send Community attribute to this neighbor\n"
4287 "Send Standard and Extended Community attributes\n"
4288 "Send Standard, Large and Extended Community attributes\n"
4289 "Send Extended Community attributes\n"
4290 "Send Standard Community attributes\n"
4291 "Send Large Community attributes\n")
4293 /* neighbor soft-reconfig. */
4294 DEFUN (neighbor_soft_reconfiguration
,
4295 neighbor_soft_reconfiguration_cmd
,
4296 "neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
4299 "Per neighbor soft reconfiguration\n"
4300 "Allow inbound soft reconfiguration for this neighbor\n")
4303 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4305 PEER_FLAG_SOFT_RECONFIG
);
4308 ALIAS_HIDDEN(neighbor_soft_reconfiguration
,
4309 neighbor_soft_reconfiguration_hidden_cmd
,
4310 "neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
4311 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4312 "Per neighbor soft reconfiguration\n"
4313 "Allow inbound soft reconfiguration for this neighbor\n")
4315 DEFUN (no_neighbor_soft_reconfiguration
,
4316 no_neighbor_soft_reconfiguration_cmd
,
4317 "no neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
4321 "Per neighbor soft reconfiguration\n"
4322 "Allow inbound soft reconfiguration for this neighbor\n")
4325 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4326 bgp_node_afi(vty
), bgp_node_safi(vty
),
4327 PEER_FLAG_SOFT_RECONFIG
);
4330 ALIAS_HIDDEN(no_neighbor_soft_reconfiguration
,
4331 no_neighbor_soft_reconfiguration_hidden_cmd
,
4332 "no neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
4333 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4334 "Per neighbor soft reconfiguration\n"
4335 "Allow inbound soft reconfiguration for this neighbor\n")
4337 DEFUN (neighbor_route_reflector_client
,
4338 neighbor_route_reflector_client_cmd
,
4339 "neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
4342 "Configure a neighbor as Route Reflector client\n")
4348 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
4350 return CMD_WARNING_CONFIG_FAILED
;
4352 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4354 PEER_FLAG_REFLECTOR_CLIENT
);
4357 ALIAS_HIDDEN(neighbor_route_reflector_client
,
4358 neighbor_route_reflector_client_hidden_cmd
,
4359 "neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
4360 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4361 "Configure a neighbor as Route Reflector client\n")
4363 DEFUN (no_neighbor_route_reflector_client
,
4364 no_neighbor_route_reflector_client_cmd
,
4365 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
4369 "Configure a neighbor as Route Reflector client\n")
4372 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4373 bgp_node_afi(vty
), bgp_node_safi(vty
),
4374 PEER_FLAG_REFLECTOR_CLIENT
);
4377 ALIAS_HIDDEN(no_neighbor_route_reflector_client
,
4378 no_neighbor_route_reflector_client_hidden_cmd
,
4379 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
4380 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4381 "Configure a neighbor as Route Reflector client\n")
4383 /* neighbor route-server-client. */
4384 DEFUN (neighbor_route_server_client
,
4385 neighbor_route_server_client_cmd
,
4386 "neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
4389 "Configure a neighbor as Route Server client\n")
4394 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
4396 return CMD_WARNING_CONFIG_FAILED
;
4397 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4399 PEER_FLAG_RSERVER_CLIENT
);
4402 ALIAS_HIDDEN(neighbor_route_server_client
,
4403 neighbor_route_server_client_hidden_cmd
,
4404 "neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
4405 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4406 "Configure a neighbor as Route Server client\n")
4408 DEFUN (no_neighbor_route_server_client
,
4409 no_neighbor_route_server_client_cmd
,
4410 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
4414 "Configure a neighbor as Route Server client\n")
4417 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4418 bgp_node_afi(vty
), bgp_node_safi(vty
),
4419 PEER_FLAG_RSERVER_CLIENT
);
4422 ALIAS_HIDDEN(no_neighbor_route_server_client
,
4423 no_neighbor_route_server_client_hidden_cmd
,
4424 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
4425 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4426 "Configure a neighbor as Route Server client\n")
4428 DEFUN (neighbor_nexthop_local_unchanged
,
4429 neighbor_nexthop_local_unchanged_cmd
,
4430 "neighbor <A.B.C.D|X:X::X:X|WORD> nexthop-local unchanged",
4433 "Configure treatment of outgoing link-local nexthop attribute\n"
4434 "Leave link-local nexthop unchanged for this peer\n")
4437 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4439 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
);
4442 DEFUN (no_neighbor_nexthop_local_unchanged
,
4443 no_neighbor_nexthop_local_unchanged_cmd
,
4444 "no neighbor <A.B.C.D|X:X::X:X|WORD> nexthop-local unchanged",
4448 "Configure treatment of outgoing link-local-nexthop attribute\n"
4449 "Leave link-local nexthop unchanged for this peer\n")
4452 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4453 bgp_node_afi(vty
), bgp_node_safi(vty
),
4454 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
);
4457 DEFUN (neighbor_attr_unchanged
,
4458 neighbor_attr_unchanged_cmd
,
4459 "neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
4462 "BGP attribute is propagated unchanged to this neighbor\n"
4463 "As-path attribute\n"
4464 "Nexthop attribute\n"
4468 char *peer_str
= argv
[1]->arg
;
4471 afi_t afi
= bgp_node_afi(vty
);
4472 safi_t safi
= bgp_node_safi(vty
);
4474 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
4476 return CMD_WARNING_CONFIG_FAILED
;
4478 if (argv_find(argv
, argc
, "as-path", &idx
))
4479 SET_FLAG(flags
, PEER_FLAG_AS_PATH_UNCHANGED
);
4481 if (argv_find(argv
, argc
, "next-hop", &idx
))
4482 SET_FLAG(flags
, PEER_FLAG_NEXTHOP_UNCHANGED
);
4484 if (argv_find(argv
, argc
, "med", &idx
))
4485 SET_FLAG(flags
, PEER_FLAG_MED_UNCHANGED
);
4487 /* no flags means all of them! */
4489 SET_FLAG(flags
, PEER_FLAG_AS_PATH_UNCHANGED
);
4490 SET_FLAG(flags
, PEER_FLAG_NEXTHOP_UNCHANGED
);
4491 SET_FLAG(flags
, PEER_FLAG_MED_UNCHANGED
);
4493 if (!CHECK_FLAG(flags
, PEER_FLAG_AS_PATH_UNCHANGED
)
4494 && peer_af_flag_check(peer
, afi
, safi
,
4495 PEER_FLAG_AS_PATH_UNCHANGED
)) {
4496 peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
4497 PEER_FLAG_AS_PATH_UNCHANGED
);
4500 if (!CHECK_FLAG(flags
, PEER_FLAG_NEXTHOP_UNCHANGED
)
4501 && peer_af_flag_check(peer
, afi
, safi
,
4502 PEER_FLAG_NEXTHOP_UNCHANGED
)) {
4503 peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
4504 PEER_FLAG_NEXTHOP_UNCHANGED
);
4507 if (!CHECK_FLAG(flags
, PEER_FLAG_MED_UNCHANGED
)
4508 && peer_af_flag_check(peer
, afi
, safi
,
4509 PEER_FLAG_MED_UNCHANGED
)) {
4510 peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
4511 PEER_FLAG_MED_UNCHANGED
);
4515 return peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
, flags
);
4519 neighbor_attr_unchanged
, neighbor_attr_unchanged_hidden_cmd
,
4520 "neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
4521 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4522 "BGP attribute is propagated unchanged to this neighbor\n"
4523 "As-path attribute\n"
4524 "Nexthop attribute\n"
4527 DEFUN (no_neighbor_attr_unchanged
,
4528 no_neighbor_attr_unchanged_cmd
,
4529 "no neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
4533 "BGP attribute is propagated unchanged to this neighbor\n"
4534 "As-path attribute\n"
4535 "Nexthop attribute\n"
4539 char *peer
= argv
[2]->arg
;
4542 if (argv_find(argv
, argc
, "as-path", &idx
))
4543 SET_FLAG(flags
, PEER_FLAG_AS_PATH_UNCHANGED
);
4545 if (argv_find(argv
, argc
, "next-hop", &idx
))
4546 SET_FLAG(flags
, PEER_FLAG_NEXTHOP_UNCHANGED
);
4548 if (argv_find(argv
, argc
, "med", &idx
))
4549 SET_FLAG(flags
, PEER_FLAG_MED_UNCHANGED
);
4551 if (!flags
) // no flags means all of them!
4553 SET_FLAG(flags
, PEER_FLAG_AS_PATH_UNCHANGED
);
4554 SET_FLAG(flags
, PEER_FLAG_NEXTHOP_UNCHANGED
);
4555 SET_FLAG(flags
, PEER_FLAG_MED_UNCHANGED
);
4558 return peer_af_flag_unset_vty(vty
, peer
, bgp_node_afi(vty
),
4559 bgp_node_safi(vty
), flags
);
4563 no_neighbor_attr_unchanged
, no_neighbor_attr_unchanged_hidden_cmd
,
4564 "no neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
4565 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4566 "BGP attribute is propagated unchanged to this neighbor\n"
4567 "As-path attribute\n"
4568 "Nexthop attribute\n"
4571 /* EBGP multihop configuration. */
4572 static int peer_ebgp_multihop_set_vty(struct vty
*vty
, const char *ip_str
,
4573 const char *ttl_str
)
4578 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
4580 return CMD_WARNING_CONFIG_FAILED
;
4583 return bgp_vty_return(vty
, BGP_ERR_INVALID_FOR_DIRECT_PEER
);
4588 ttl
= strtoul(ttl_str
, NULL
, 10);
4590 return bgp_vty_return(vty
, peer_ebgp_multihop_set(peer
, ttl
));
4593 static int peer_ebgp_multihop_unset_vty(struct vty
*vty
, const char *ip_str
)
4597 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
4599 return CMD_WARNING_CONFIG_FAILED
;
4601 return bgp_vty_return(vty
, peer_ebgp_multihop_unset(peer
));
4604 /* neighbor ebgp-multihop. */
4605 DEFUN (neighbor_ebgp_multihop
,
4606 neighbor_ebgp_multihop_cmd
,
4607 "neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop",
4610 "Allow EBGP neighbors not on directly connected networks\n")
4613 return peer_ebgp_multihop_set_vty(vty
, argv
[idx_peer
]->arg
, NULL
);
4616 DEFUN (neighbor_ebgp_multihop_ttl
,
4617 neighbor_ebgp_multihop_ttl_cmd
,
4618 "neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop (1-255)",
4621 "Allow EBGP neighbors not on directly connected networks\n"
4622 "maximum hop count\n")
4626 return peer_ebgp_multihop_set_vty(vty
, argv
[idx_peer
]->arg
,
4627 argv
[idx_number
]->arg
);
4630 DEFUN (no_neighbor_ebgp_multihop
,
4631 no_neighbor_ebgp_multihop_cmd
,
4632 "no neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop [(1-255)]",
4636 "Allow EBGP neighbors not on directly connected networks\n"
4637 "maximum hop count\n")
4640 return peer_ebgp_multihop_unset_vty(vty
, argv
[idx_peer
]->arg
);
4644 /* disable-connected-check */
4645 DEFUN (neighbor_disable_connected_check
,
4646 neighbor_disable_connected_check_cmd
,
4647 "neighbor <A.B.C.D|X:X::X:X|WORD> <disable-connected-check|enforce-multihop>",
4650 "one-hop away EBGP peer using loopback address\n"
4651 "Enforce EBGP neighbors perform multihop\n")
4654 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
4655 PEER_FLAG_DISABLE_CONNECTED_CHECK
);
4658 DEFUN (no_neighbor_disable_connected_check
,
4659 no_neighbor_disable_connected_check_cmd
,
4660 "no neighbor <A.B.C.D|X:X::X:X|WORD> <disable-connected-check|enforce-multihop>",
4664 "one-hop away EBGP peer using loopback address\n"
4665 "Enforce EBGP neighbors perform multihop\n")
4668 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4669 PEER_FLAG_DISABLE_CONNECTED_CHECK
);
4673 /* enforce-first-as */
4674 DEFUN (neighbor_enforce_first_as
,
4675 neighbor_enforce_first_as_cmd
,
4676 "neighbor <A.B.C.D|X:X::X:X|WORD> enforce-first-as",
4679 "Enforce the first AS for EBGP routes\n")
4683 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
4684 PEER_FLAG_ENFORCE_FIRST_AS
);
4687 DEFUN (no_neighbor_enforce_first_as
,
4688 no_neighbor_enforce_first_as_cmd
,
4689 "no neighbor <A.B.C.D|X:X::X:X|WORD> enforce-first-as",
4693 "Enforce the first AS for EBGP routes\n")
4697 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4698 PEER_FLAG_ENFORCE_FIRST_AS
);
4702 DEFUN (neighbor_description
,
4703 neighbor_description_cmd
,
4704 "neighbor <A.B.C.D|X:X::X:X|WORD> description LINE...",
4707 "Neighbor specific description\n"
4708 "Up to 80 characters describing this neighbor\n")
4715 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
4717 return CMD_WARNING_CONFIG_FAILED
;
4719 str
= argv_concat(argv
, argc
, idx_line
);
4721 peer_description_set(peer
, str
);
4723 XFREE(MTYPE_TMP
, str
);
4728 DEFUN (no_neighbor_description
,
4729 no_neighbor_description_cmd
,
4730 "no neighbor <A.B.C.D|X:X::X:X|WORD> description",
4734 "Neighbor specific description\n")
4739 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
4741 return CMD_WARNING_CONFIG_FAILED
;
4743 peer_description_unset(peer
);
4748 ALIAS(no_neighbor_description
, no_neighbor_description_comment_cmd
,
4749 "no neighbor <A.B.C.D|X:X::X:X|WORD> description LINE...",
4750 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4751 "Neighbor specific description\n"
4752 "Up to 80 characters describing this neighbor\n")
4754 /* Neighbor update-source. */
4755 static int peer_update_source_vty(struct vty
*vty
, const char *peer_str
,
4756 const char *source_str
)
4762 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
4764 return CMD_WARNING_CONFIG_FAILED
;
4770 if (str2sockunion(source_str
, &su
) == 0)
4771 peer_update_source_addr_set(peer
, &su
);
4773 if (str2prefix(source_str
, &p
)) {
4775 "%% Invalid update-source, remove prefix length \n");
4776 return CMD_WARNING_CONFIG_FAILED
;
4778 peer_update_source_if_set(peer
, source_str
);
4781 peer_update_source_unset(peer
);
4786 #define BGP_UPDATE_SOURCE_HELP_STR \
4789 "Interface name (requires zebra to be running)\n"
4791 DEFUN (neighbor_update_source
,
4792 neighbor_update_source_cmd
,
4793 "neighbor <A.B.C.D|X:X::X:X|WORD> update-source <A.B.C.D|X:X::X:X|WORD>",
4796 "Source of routing updates\n"
4797 BGP_UPDATE_SOURCE_HELP_STR
)
4801 return peer_update_source_vty(vty
, argv
[idx_peer
]->arg
,
4802 argv
[idx_peer_2
]->arg
);
4805 DEFUN (no_neighbor_update_source
,
4806 no_neighbor_update_source_cmd
,
4807 "no neighbor <A.B.C.D|X:X::X:X|WORD> update-source [<A.B.C.D|X:X::X:X|WORD>]",
4811 "Source of routing updates\n"
4812 BGP_UPDATE_SOURCE_HELP_STR
)
4815 return peer_update_source_vty(vty
, argv
[idx_peer
]->arg
, NULL
);
4818 static int peer_default_originate_set_vty(struct vty
*vty
, const char *peer_str
,
4819 afi_t afi
, safi_t safi
,
4820 const char *rmap
, int set
)
4824 struct route_map
*route_map
= NULL
;
4826 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
4828 return CMD_WARNING_CONFIG_FAILED
;
4832 route_map
= route_map_lookup_warn_noexist(vty
, rmap
);
4833 ret
= peer_default_originate_set(peer
, afi
, safi
,
4836 ret
= peer_default_originate_unset(peer
, afi
, safi
);
4838 return bgp_vty_return(vty
, ret
);
4841 /* neighbor default-originate. */
4842 DEFUN (neighbor_default_originate
,
4843 neighbor_default_originate_cmd
,
4844 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate",
4847 "Originate default route to this neighbor\n")
4850 return peer_default_originate_set_vty(vty
, argv
[idx_peer
]->arg
,
4852 bgp_node_safi(vty
), NULL
, 1);
4855 ALIAS_HIDDEN(neighbor_default_originate
, neighbor_default_originate_hidden_cmd
,
4856 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate",
4857 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4858 "Originate default route to this neighbor\n")
4860 DEFUN (neighbor_default_originate_rmap
,
4861 neighbor_default_originate_rmap_cmd
,
4862 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate route-map WORD",
4865 "Originate default route to this neighbor\n"
4866 "Route-map to specify criteria to originate default\n"
4871 return peer_default_originate_set_vty(
4872 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
4873 argv
[idx_word
]->arg
, 1);
4877 neighbor_default_originate_rmap
,
4878 neighbor_default_originate_rmap_hidden_cmd
,
4879 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate route-map WORD",
4880 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4881 "Originate default route to this neighbor\n"
4882 "Route-map to specify criteria to originate default\n"
4885 DEFUN (no_neighbor_default_originate
,
4886 no_neighbor_default_originate_cmd
,
4887 "no neighbor <A.B.C.D|X:X::X:X|WORD> default-originate [route-map WORD]",
4891 "Originate default route to this neighbor\n"
4892 "Route-map to specify criteria to originate default\n"
4896 return peer_default_originate_set_vty(vty
, argv
[idx_peer
]->arg
,
4898 bgp_node_safi(vty
), NULL
, 0);
4902 no_neighbor_default_originate
, no_neighbor_default_originate_hidden_cmd
,
4903 "no neighbor <A.B.C.D|X:X::X:X|WORD> default-originate [route-map WORD]",
4904 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4905 "Originate default route to this neighbor\n"
4906 "Route-map to specify criteria to originate default\n"
4910 /* Set neighbor's BGP port. */
4911 static int peer_port_vty(struct vty
*vty
, const char *ip_str
, int afi
,
4912 const char *port_str
)
4918 peer
= peer_lookup_vty(vty
, ip_str
);
4920 return CMD_WARNING_CONFIG_FAILED
;
4923 sp
= getservbyname("bgp", "tcp");
4924 port
= (sp
== NULL
) ? BGP_PORT_DEFAULT
: ntohs(sp
->s_port
);
4926 port
= strtoul(port_str
, NULL
, 10);
4929 peer_port_set(peer
, port
);
4934 /* Set specified peer's BGP port. */
4935 DEFUN (neighbor_port
,
4937 "neighbor <A.B.C.D|X:X::X:X> port (0-65535)",
4940 "Neighbor's BGP port\n"
4941 "TCP port number\n")
4945 return peer_port_vty(vty
, argv
[idx_ip
]->arg
, AFI_IP
,
4946 argv
[idx_number
]->arg
);
4949 DEFUN (no_neighbor_port
,
4950 no_neighbor_port_cmd
,
4951 "no neighbor <A.B.C.D|X:X::X:X> port [(0-65535)]",
4955 "Neighbor's BGP port\n"
4956 "TCP port number\n")
4959 return peer_port_vty(vty
, argv
[idx_ip
]->arg
, AFI_IP
, NULL
);
4963 /* neighbor weight. */
4964 static int peer_weight_set_vty(struct vty
*vty
, const char *ip_str
, afi_t afi
,
4965 safi_t safi
, const char *weight_str
)
4969 unsigned long weight
;
4971 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
4973 return CMD_WARNING_CONFIG_FAILED
;
4975 weight
= strtoul(weight_str
, NULL
, 10);
4977 ret
= peer_weight_set(peer
, afi
, safi
, weight
);
4978 return bgp_vty_return(vty
, ret
);
4981 static int peer_weight_unset_vty(struct vty
*vty
, const char *ip_str
, afi_t afi
,
4987 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
4989 return CMD_WARNING_CONFIG_FAILED
;
4991 ret
= peer_weight_unset(peer
, afi
, safi
);
4992 return bgp_vty_return(vty
, ret
);
4995 DEFUN (neighbor_weight
,
4996 neighbor_weight_cmd
,
4997 "neighbor <A.B.C.D|X:X::X:X|WORD> weight (0-65535)",
5000 "Set default weight for routes from this neighbor\n"
5005 return peer_weight_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
5006 bgp_node_safi(vty
), argv
[idx_number
]->arg
);
5009 ALIAS_HIDDEN(neighbor_weight
, neighbor_weight_hidden_cmd
,
5010 "neighbor <A.B.C.D|X:X::X:X|WORD> weight (0-65535)",
5011 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5012 "Set default weight for routes from this neighbor\n"
5015 DEFUN (no_neighbor_weight
,
5016 no_neighbor_weight_cmd
,
5017 "no neighbor <A.B.C.D|X:X::X:X|WORD> weight [(0-65535)]",
5021 "Set default weight for routes from this neighbor\n"
5025 return peer_weight_unset_vty(vty
, argv
[idx_peer
]->arg
,
5026 bgp_node_afi(vty
), bgp_node_safi(vty
));
5029 ALIAS_HIDDEN(no_neighbor_weight
, no_neighbor_weight_hidden_cmd
,
5030 "no neighbor <A.B.C.D|X:X::X:X|WORD> weight [(0-65535)]",
5031 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5032 "Set default weight for routes from this neighbor\n"
5036 /* Override capability negotiation. */
5037 DEFUN (neighbor_override_capability
,
5038 neighbor_override_capability_cmd
,
5039 "neighbor <A.B.C.D|X:X::X:X|WORD> override-capability",
5042 "Override capability negotiation result\n")
5045 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
5046 PEER_FLAG_OVERRIDE_CAPABILITY
);
5049 DEFUN (no_neighbor_override_capability
,
5050 no_neighbor_override_capability_cmd
,
5051 "no neighbor <A.B.C.D|X:X::X:X|WORD> override-capability",
5055 "Override capability negotiation result\n")
5058 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
5059 PEER_FLAG_OVERRIDE_CAPABILITY
);
5062 DEFUN (neighbor_strict_capability
,
5063 neighbor_strict_capability_cmd
,
5064 "neighbor <A.B.C.D|X:X::X:X|WORD> strict-capability-match",
5067 "Strict capability negotiation match\n")
5071 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
5072 PEER_FLAG_STRICT_CAP_MATCH
);
5075 DEFUN (no_neighbor_strict_capability
,
5076 no_neighbor_strict_capability_cmd
,
5077 "no neighbor <A.B.C.D|X:X::X:X|WORD> strict-capability-match",
5081 "Strict capability negotiation match\n")
5085 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
5086 PEER_FLAG_STRICT_CAP_MATCH
);
5089 static int peer_timers_set_vty(struct vty
*vty
, const char *ip_str
,
5090 const char *keep_str
, const char *hold_str
)
5097 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5099 return CMD_WARNING_CONFIG_FAILED
;
5101 keepalive
= strtoul(keep_str
, NULL
, 10);
5102 holdtime
= strtoul(hold_str
, NULL
, 10);
5104 ret
= peer_timers_set(peer
, keepalive
, holdtime
);
5106 return bgp_vty_return(vty
, ret
);
5109 static int peer_timers_unset_vty(struct vty
*vty
, const char *ip_str
)
5114 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5116 return CMD_WARNING_CONFIG_FAILED
;
5118 ret
= peer_timers_unset(peer
);
5120 return bgp_vty_return(vty
, ret
);
5123 DEFUN (neighbor_timers
,
5124 neighbor_timers_cmd
,
5125 "neighbor <A.B.C.D|X:X::X:X|WORD> timers (0-65535) (0-65535)",
5128 "BGP per neighbor timers\n"
5129 "Keepalive interval\n"
5134 int idx_number_2
= 4;
5135 return peer_timers_set_vty(vty
, argv
[idx_peer
]->arg
,
5136 argv
[idx_number
]->arg
,
5137 argv
[idx_number_2
]->arg
);
5140 DEFUN (no_neighbor_timers
,
5141 no_neighbor_timers_cmd
,
5142 "no neighbor <A.B.C.D|X:X::X:X|WORD> timers [(0-65535) (0-65535)]",
5146 "BGP per neighbor timers\n"
5147 "Keepalive interval\n"
5151 return peer_timers_unset_vty(vty
, argv
[idx_peer
]->arg
);
5155 static int peer_timers_connect_set_vty(struct vty
*vty
, const char *ip_str
,
5156 const char *time_str
)
5162 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5164 return CMD_WARNING_CONFIG_FAILED
;
5166 connect
= strtoul(time_str
, NULL
, 10);
5168 ret
= peer_timers_connect_set(peer
, connect
);
5170 return bgp_vty_return(vty
, ret
);
5173 static int peer_timers_connect_unset_vty(struct vty
*vty
, const char *ip_str
)
5178 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5180 return CMD_WARNING_CONFIG_FAILED
;
5182 ret
= peer_timers_connect_unset(peer
);
5184 return bgp_vty_return(vty
, ret
);
5187 DEFUN (neighbor_timers_connect
,
5188 neighbor_timers_connect_cmd
,
5189 "neighbor <A.B.C.D|X:X::X:X|WORD> timers connect (1-65535)",
5192 "BGP per neighbor timers\n"
5193 "BGP connect timer\n"
5198 return peer_timers_connect_set_vty(vty
, argv
[idx_peer
]->arg
,
5199 argv
[idx_number
]->arg
);
5202 DEFUN (no_neighbor_timers_connect
,
5203 no_neighbor_timers_connect_cmd
,
5204 "no neighbor <A.B.C.D|X:X::X:X|WORD> timers connect [(1-65535)]",
5208 "BGP per neighbor timers\n"
5209 "BGP connect timer\n"
5213 return peer_timers_connect_unset_vty(vty
, argv
[idx_peer
]->arg
);
5217 static int peer_advertise_interval_vty(struct vty
*vty
, const char *ip_str
,
5218 const char *time_str
, int set
)
5222 uint32_t routeadv
= 0;
5224 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5226 return CMD_WARNING_CONFIG_FAILED
;
5229 routeadv
= strtoul(time_str
, NULL
, 10);
5232 ret
= peer_advertise_interval_set(peer
, routeadv
);
5234 ret
= peer_advertise_interval_unset(peer
);
5236 return bgp_vty_return(vty
, ret
);
5239 DEFUN (neighbor_advertise_interval
,
5240 neighbor_advertise_interval_cmd
,
5241 "neighbor <A.B.C.D|X:X::X:X|WORD> advertisement-interval (0-600)",
5244 "Minimum interval between sending BGP routing updates\n"
5245 "time in seconds\n")
5249 return peer_advertise_interval_vty(vty
, argv
[idx_peer
]->arg
,
5250 argv
[idx_number
]->arg
, 1);
5253 DEFUN (no_neighbor_advertise_interval
,
5254 no_neighbor_advertise_interval_cmd
,
5255 "no neighbor <A.B.C.D|X:X::X:X|WORD> advertisement-interval [(0-600)]",
5259 "Minimum interval between sending BGP routing updates\n"
5260 "time in seconds\n")
5263 return peer_advertise_interval_vty(vty
, argv
[idx_peer
]->arg
, NULL
, 0);
5267 /* Time to wait before processing route-map updates */
5268 DEFUN (bgp_set_route_map_delay_timer
,
5269 bgp_set_route_map_delay_timer_cmd
,
5270 "bgp route-map delay-timer (0-600)",
5272 "BGP route-map delay timer\n"
5273 "Time in secs to wait before processing route-map changes\n"
5274 "0 disables the timer, no route updates happen when route-maps change\n")
5277 uint32_t rmap_delay_timer
;
5279 if (argv
[idx_number
]->arg
) {
5280 rmap_delay_timer
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
5281 bm
->rmap_update_timer
= rmap_delay_timer
;
5283 /* if the dynamic update handling is being disabled, and a timer
5285 * running, stop the timer and act as if the timer has already
5288 if (!rmap_delay_timer
&& bm
->t_rmap_update
) {
5289 BGP_TIMER_OFF(bm
->t_rmap_update
);
5290 thread_execute(bm
->master
, bgp_route_map_update_timer
,
5295 vty_out(vty
, "%% BGP invalid route-map delay-timer\n");
5296 return CMD_WARNING_CONFIG_FAILED
;
5300 DEFUN (no_bgp_set_route_map_delay_timer
,
5301 no_bgp_set_route_map_delay_timer_cmd
,
5302 "no bgp route-map delay-timer [(0-600)]",
5305 "Default BGP route-map delay timer\n"
5306 "Reset to default time to wait for processing route-map changes\n"
5307 "0 disables the timer, no route updates happen when route-maps change\n")
5310 bm
->rmap_update_timer
= RMAP_DEFAULT_UPDATE_TIMER
;
5316 /* neighbor interface */
5317 static int peer_interface_vty(struct vty
*vty
, const char *ip_str
,
5322 peer
= peer_lookup_vty(vty
, ip_str
);
5323 if (!peer
|| peer
->conf_if
) {
5324 vty_out(vty
, "%% BGP invalid peer %s\n", ip_str
);
5325 return CMD_WARNING_CONFIG_FAILED
;
5329 peer_interface_set(peer
, str
);
5331 peer_interface_unset(peer
);
5336 DEFUN (neighbor_interface
,
5337 neighbor_interface_cmd
,
5338 "neighbor <A.B.C.D|X:X::X:X> interface WORD",
5346 return peer_interface_vty(vty
, argv
[idx_ip
]->arg
, argv
[idx_word
]->arg
);
5349 DEFUN (no_neighbor_interface
,
5350 no_neighbor_interface_cmd
,
5351 "no neighbor <A.B.C.D|X:X::X:X|WORD> interface WORD",
5359 return peer_interface_vty(vty
, argv
[idx_peer
]->arg
, NULL
);
5362 DEFUN (neighbor_distribute_list
,
5363 neighbor_distribute_list_cmd
,
5364 "neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list <(1-199)|(1300-2699)|WORD> <in|out>",
5367 "Filter updates to/from this neighbor\n"
5368 "IP access-list number\n"
5369 "IP access-list number (expanded range)\n"
5370 "IP Access-list name\n"
5371 "Filter incoming updates\n"
5372 "Filter outgoing updates\n")
5379 const char *pstr
= argv
[idx_peer
]->arg
;
5380 const char *acl
= argv
[idx_acl
]->arg
;
5381 const char *inout
= argv
[argc
- 1]->text
;
5383 peer
= peer_and_group_lookup_vty(vty
, pstr
);
5385 return CMD_WARNING_CONFIG_FAILED
;
5387 /* Check filter direction. */
5388 direct
= strmatch(inout
, "in") ? FILTER_IN
: FILTER_OUT
;
5389 ret
= peer_distribute_set(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5392 return bgp_vty_return(vty
, ret
);
5396 neighbor_distribute_list
, neighbor_distribute_list_hidden_cmd
,
5397 "neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list <(1-199)|(1300-2699)|WORD> <in|out>",
5398 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5399 "Filter updates to/from this neighbor\n"
5400 "IP access-list number\n"
5401 "IP access-list number (expanded range)\n"
5402 "IP Access-list name\n"
5403 "Filter incoming updates\n"
5404 "Filter outgoing updates\n")
5406 DEFUN (no_neighbor_distribute_list
,
5407 no_neighbor_distribute_list_cmd
,
5408 "no neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list <(1-199)|(1300-2699)|WORD> <in|out>",
5412 "Filter updates to/from this neighbor\n"
5413 "IP access-list number\n"
5414 "IP access-list number (expanded range)\n"
5415 "IP Access-list name\n"
5416 "Filter incoming updates\n"
5417 "Filter outgoing updates\n")
5423 const char *pstr
= argv
[idx_peer
]->arg
;
5424 const char *inout
= argv
[argc
- 1]->text
;
5426 peer
= peer_and_group_lookup_vty(vty
, pstr
);
5428 return CMD_WARNING_CONFIG_FAILED
;
5430 /* Check filter direction. */
5431 direct
= strmatch(inout
, "in") ? FILTER_IN
: FILTER_OUT
;
5432 ret
= peer_distribute_unset(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5435 return bgp_vty_return(vty
, ret
);
5439 no_neighbor_distribute_list
, no_neighbor_distribute_list_hidden_cmd
,
5440 "no neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list <(1-199)|(1300-2699)|WORD> <in|out>",
5441 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5442 "Filter updates to/from this neighbor\n"
5443 "IP access-list number\n"
5444 "IP access-list number (expanded range)\n"
5445 "IP Access-list name\n"
5446 "Filter incoming updates\n"
5447 "Filter outgoing updates\n")
5449 /* Set prefix list to the peer. */
5450 static int peer_prefix_list_set_vty(struct vty
*vty
, const char *ip_str
,
5451 afi_t afi
, safi_t safi
,
5452 const char *name_str
,
5453 const char *direct_str
)
5456 int direct
= FILTER_IN
;
5459 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5461 return CMD_WARNING_CONFIG_FAILED
;
5463 /* Check filter direction. */
5464 if (strncmp(direct_str
, "i", 1) == 0)
5466 else if (strncmp(direct_str
, "o", 1) == 0)
5467 direct
= FILTER_OUT
;
5469 ret
= peer_prefix_list_set(peer
, afi
, safi
, direct
, name_str
);
5471 return bgp_vty_return(vty
, ret
);
5474 static int peer_prefix_list_unset_vty(struct vty
*vty
, const char *ip_str
,
5475 afi_t afi
, safi_t safi
,
5476 const char *direct_str
)
5480 int direct
= FILTER_IN
;
5482 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5484 return CMD_WARNING_CONFIG_FAILED
;
5486 /* Check filter direction. */
5487 if (strncmp(direct_str
, "i", 1) == 0)
5489 else if (strncmp(direct_str
, "o", 1) == 0)
5490 direct
= FILTER_OUT
;
5492 ret
= peer_prefix_list_unset(peer
, afi
, safi
, direct
);
5494 return bgp_vty_return(vty
, ret
);
5497 DEFUN (neighbor_prefix_list
,
5498 neighbor_prefix_list_cmd
,
5499 "neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
5502 "Filter updates to/from this neighbor\n"
5503 "Name of a prefix list\n"
5504 "Filter incoming updates\n"
5505 "Filter outgoing updates\n")
5510 return peer_prefix_list_set_vty(
5511 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5512 argv
[idx_word
]->arg
, argv
[idx_in_out
]->arg
);
5515 ALIAS_HIDDEN(neighbor_prefix_list
, neighbor_prefix_list_hidden_cmd
,
5516 "neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
5517 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5518 "Filter updates to/from this neighbor\n"
5519 "Name of a prefix list\n"
5520 "Filter incoming updates\n"
5521 "Filter outgoing updates\n")
5523 DEFUN (no_neighbor_prefix_list
,
5524 no_neighbor_prefix_list_cmd
,
5525 "no neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
5529 "Filter updates to/from this neighbor\n"
5530 "Name of a prefix list\n"
5531 "Filter incoming updates\n"
5532 "Filter outgoing updates\n")
5536 return peer_prefix_list_unset_vty(vty
, argv
[idx_peer
]->arg
,
5537 bgp_node_afi(vty
), bgp_node_safi(vty
),
5538 argv
[idx_in_out
]->arg
);
5541 ALIAS_HIDDEN(no_neighbor_prefix_list
, no_neighbor_prefix_list_hidden_cmd
,
5542 "no neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
5543 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5544 "Filter updates to/from this neighbor\n"
5545 "Name of a prefix list\n"
5546 "Filter incoming updates\n"
5547 "Filter outgoing updates\n")
5549 static int peer_aslist_set_vty(struct vty
*vty
, const char *ip_str
, afi_t afi
,
5550 safi_t safi
, const char *name_str
,
5551 const char *direct_str
)
5555 int direct
= FILTER_IN
;
5557 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5559 return CMD_WARNING_CONFIG_FAILED
;
5561 /* Check filter direction. */
5562 if (strncmp(direct_str
, "i", 1) == 0)
5564 else if (strncmp(direct_str
, "o", 1) == 0)
5565 direct
= FILTER_OUT
;
5567 ret
= peer_aslist_set(peer
, afi
, safi
, direct
, name_str
);
5569 return bgp_vty_return(vty
, ret
);
5572 static int peer_aslist_unset_vty(struct vty
*vty
, const char *ip_str
, afi_t afi
,
5573 safi_t safi
, const char *direct_str
)
5577 int direct
= FILTER_IN
;
5579 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5581 return CMD_WARNING_CONFIG_FAILED
;
5583 /* Check filter direction. */
5584 if (strncmp(direct_str
, "i", 1) == 0)
5586 else if (strncmp(direct_str
, "o", 1) == 0)
5587 direct
= FILTER_OUT
;
5589 ret
= peer_aslist_unset(peer
, afi
, safi
, direct
);
5591 return bgp_vty_return(vty
, ret
);
5594 DEFUN (neighbor_filter_list
,
5595 neighbor_filter_list_cmd
,
5596 "neighbor <A.B.C.D|X:X::X:X|WORD> filter-list WORD <in|out>",
5599 "Establish BGP filters\n"
5600 "AS path access-list name\n"
5601 "Filter incoming routes\n"
5602 "Filter outgoing routes\n")
5607 return peer_aslist_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
5608 bgp_node_safi(vty
), argv
[idx_word
]->arg
,
5609 argv
[idx_in_out
]->arg
);
5612 ALIAS_HIDDEN(neighbor_filter_list
, neighbor_filter_list_hidden_cmd
,
5613 "neighbor <A.B.C.D|X:X::X:X|WORD> filter-list WORD <in|out>",
5614 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5615 "Establish BGP filters\n"
5616 "AS path access-list name\n"
5617 "Filter incoming routes\n"
5618 "Filter outgoing routes\n")
5620 DEFUN (no_neighbor_filter_list
,
5621 no_neighbor_filter_list_cmd
,
5622 "no neighbor <A.B.C.D|X:X::X:X|WORD> filter-list WORD <in|out>",
5626 "Establish BGP filters\n"
5627 "AS path access-list name\n"
5628 "Filter incoming routes\n"
5629 "Filter outgoing routes\n")
5633 return peer_aslist_unset_vty(vty
, argv
[idx_peer
]->arg
,
5634 bgp_node_afi(vty
), bgp_node_safi(vty
),
5635 argv
[idx_in_out
]->arg
);
5638 ALIAS_HIDDEN(no_neighbor_filter_list
, no_neighbor_filter_list_hidden_cmd
,
5639 "no neighbor <A.B.C.D|X:X::X:X|WORD> filter-list WORD <in|out>",
5640 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5641 "Establish BGP filters\n"
5642 "AS path access-list name\n"
5643 "Filter incoming routes\n"
5644 "Filter outgoing routes\n")
5646 /* Set route-map to the peer. */
5647 static int peer_route_map_set_vty(struct vty
*vty
, const char *ip_str
,
5648 afi_t afi
, safi_t safi
, const char *name_str
,
5649 const char *direct_str
)
5653 int direct
= RMAP_IN
;
5654 struct route_map
*route_map
;
5656 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5658 return CMD_WARNING_CONFIG_FAILED
;
5660 /* Check filter direction. */
5661 if (strncmp(direct_str
, "in", 2) == 0)
5663 else if (strncmp(direct_str
, "o", 1) == 0)
5666 route_map
= route_map_lookup_warn_noexist(vty
, name_str
);
5667 ret
= peer_route_map_set(peer
, afi
, safi
, direct
, name_str
, route_map
);
5669 return bgp_vty_return(vty
, ret
);
5672 static int peer_route_map_unset_vty(struct vty
*vty
, const char *ip_str
,
5673 afi_t afi
, safi_t safi
,
5674 const char *direct_str
)
5678 int direct
= RMAP_IN
;
5680 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5682 return CMD_WARNING_CONFIG_FAILED
;
5684 /* Check filter direction. */
5685 if (strncmp(direct_str
, "in", 2) == 0)
5687 else if (strncmp(direct_str
, "o", 1) == 0)
5690 ret
= peer_route_map_unset(peer
, afi
, safi
, direct
);
5692 return bgp_vty_return(vty
, ret
);
5695 DEFUN (neighbor_route_map
,
5696 neighbor_route_map_cmd
,
5697 "neighbor <A.B.C.D|X:X::X:X|WORD> route-map WORD <in|out>",
5700 "Apply route map to neighbor\n"
5701 "Name of route map\n"
5702 "Apply map to incoming routes\n"
5703 "Apply map to outbound routes\n")
5708 return peer_route_map_set_vty(
5709 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5710 argv
[idx_word
]->arg
, argv
[idx_in_out
]->arg
);
5713 ALIAS_HIDDEN(neighbor_route_map
, neighbor_route_map_hidden_cmd
,
5714 "neighbor <A.B.C.D|X:X::X:X|WORD> route-map WORD <in|out>",
5715 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5716 "Apply route map to neighbor\n"
5717 "Name of route map\n"
5718 "Apply map to incoming routes\n"
5719 "Apply map to outbound routes\n")
5721 DEFUN (no_neighbor_route_map
,
5722 no_neighbor_route_map_cmd
,
5723 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-map WORD <in|out>",
5727 "Apply route map to neighbor\n"
5728 "Name of route map\n"
5729 "Apply map to incoming routes\n"
5730 "Apply map to outbound routes\n")
5734 return peer_route_map_unset_vty(vty
, argv
[idx_peer
]->arg
,
5735 bgp_node_afi(vty
), bgp_node_safi(vty
),
5736 argv
[idx_in_out
]->arg
);
5739 ALIAS_HIDDEN(no_neighbor_route_map
, no_neighbor_route_map_hidden_cmd
,
5740 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-map WORD <in|out>",
5741 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5742 "Apply route map to neighbor\n"
5743 "Name of route map\n"
5744 "Apply map to incoming routes\n"
5745 "Apply map to outbound routes\n")
5747 /* Set unsuppress-map to the peer. */
5748 static int peer_unsuppress_map_set_vty(struct vty
*vty
, const char *ip_str
,
5749 afi_t afi
, safi_t safi
,
5750 const char *name_str
)
5754 struct route_map
*route_map
;
5756 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5758 return CMD_WARNING_CONFIG_FAILED
;
5760 route_map
= route_map_lookup_warn_noexist(vty
, name_str
);
5761 ret
= peer_unsuppress_map_set(peer
, afi
, safi
, name_str
, route_map
);
5763 return bgp_vty_return(vty
, ret
);
5766 /* Unset route-map from the peer. */
5767 static int peer_unsuppress_map_unset_vty(struct vty
*vty
, const char *ip_str
,
5768 afi_t afi
, safi_t safi
)
5773 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5775 return CMD_WARNING_CONFIG_FAILED
;
5777 ret
= peer_unsuppress_map_unset(peer
, afi
, safi
);
5779 return bgp_vty_return(vty
, ret
);
5782 DEFUN (neighbor_unsuppress_map
,
5783 neighbor_unsuppress_map_cmd
,
5784 "neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
5787 "Route-map to selectively unsuppress suppressed routes\n"
5788 "Name of route map\n")
5792 return peer_unsuppress_map_set_vty(
5793 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5794 argv
[idx_word
]->arg
);
5797 ALIAS_HIDDEN(neighbor_unsuppress_map
, neighbor_unsuppress_map_hidden_cmd
,
5798 "neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
5799 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5800 "Route-map to selectively unsuppress suppressed routes\n"
5801 "Name of route map\n")
5803 DEFUN (no_neighbor_unsuppress_map
,
5804 no_neighbor_unsuppress_map_cmd
,
5805 "no neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
5809 "Route-map to selectively unsuppress suppressed routes\n"
5810 "Name of route map\n")
5813 return peer_unsuppress_map_unset_vty(vty
, argv
[idx_peer
]->arg
,
5815 bgp_node_safi(vty
));
5818 ALIAS_HIDDEN(no_neighbor_unsuppress_map
, no_neighbor_unsuppress_map_hidden_cmd
,
5819 "no neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
5820 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5821 "Route-map to selectively unsuppress suppressed routes\n"
5822 "Name of route map\n")
5824 static int peer_maximum_prefix_set_vty(struct vty
*vty
, const char *ip_str
,
5825 afi_t afi
, safi_t safi
,
5826 const char *num_str
,
5827 const char *threshold_str
, int warning
,
5828 const char *restart_str
)
5836 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5838 return CMD_WARNING_CONFIG_FAILED
;
5840 max
= strtoul(num_str
, NULL
, 10);
5842 threshold
= atoi(threshold_str
);
5844 threshold
= MAXIMUM_PREFIX_THRESHOLD_DEFAULT
;
5847 restart
= atoi(restart_str
);
5851 ret
= peer_maximum_prefix_set(peer
, afi
, safi
, max
, threshold
, warning
,
5854 return bgp_vty_return(vty
, ret
);
5857 static int peer_maximum_prefix_unset_vty(struct vty
*vty
, const char *ip_str
,
5858 afi_t afi
, safi_t safi
)
5863 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5865 return CMD_WARNING_CONFIG_FAILED
;
5867 ret
= peer_maximum_prefix_unset(peer
, afi
, safi
);
5869 return bgp_vty_return(vty
, ret
);
5872 /* Maximum number of prefix configuration. prefix count is different
5873 for each peer configuration. So this configuration can be set for
5874 each peer configuration. */
5875 DEFUN (neighbor_maximum_prefix
,
5876 neighbor_maximum_prefix_cmd
,
5877 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295)",
5880 "Maximum number of prefix accept from this peer\n"
5881 "maximum no. of prefix limit\n")
5885 return peer_maximum_prefix_set_vty(
5886 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5887 argv
[idx_number
]->arg
, NULL
, 0, NULL
);
5890 ALIAS_HIDDEN(neighbor_maximum_prefix
, neighbor_maximum_prefix_hidden_cmd
,
5891 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295)",
5892 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5893 "Maximum number of prefix accept from this peer\n"
5894 "maximum no. of prefix limit\n")
5896 DEFUN (neighbor_maximum_prefix_threshold
,
5897 neighbor_maximum_prefix_threshold_cmd
,
5898 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100)",
5901 "Maximum number of prefix accept from this peer\n"
5902 "maximum no. of prefix limit\n"
5903 "Threshold value (%) at which to generate a warning msg\n")
5907 int idx_number_2
= 4;
5908 return peer_maximum_prefix_set_vty(
5909 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5910 argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
, 0, NULL
);
5914 neighbor_maximum_prefix_threshold
,
5915 neighbor_maximum_prefix_threshold_hidden_cmd
,
5916 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100)",
5917 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5918 "Maximum number of prefix accept from this peer\n"
5919 "maximum no. of prefix limit\n"
5920 "Threshold value (%) at which to generate a warning msg\n")
5922 DEFUN (neighbor_maximum_prefix_warning
,
5923 neighbor_maximum_prefix_warning_cmd
,
5924 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) warning-only",
5927 "Maximum number of prefix accept from this peer\n"
5928 "maximum no. of prefix limit\n"
5929 "Only give warning message when limit is exceeded\n")
5933 return peer_maximum_prefix_set_vty(
5934 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5935 argv
[idx_number
]->arg
, NULL
, 1, NULL
);
5939 neighbor_maximum_prefix_warning
,
5940 neighbor_maximum_prefix_warning_hidden_cmd
,
5941 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) warning-only",
5942 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5943 "Maximum number of prefix accept from this peer\n"
5944 "maximum no. of prefix limit\n"
5945 "Only give warning message when limit is exceeded\n")
5947 DEFUN (neighbor_maximum_prefix_threshold_warning
,
5948 neighbor_maximum_prefix_threshold_warning_cmd
,
5949 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) warning-only",
5952 "Maximum number of prefix accept from this peer\n"
5953 "maximum no. of prefix limit\n"
5954 "Threshold value (%) at which to generate a warning msg\n"
5955 "Only give warning message when limit is exceeded\n")
5959 int idx_number_2
= 4;
5960 return peer_maximum_prefix_set_vty(
5961 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5962 argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
, 1, NULL
);
5966 neighbor_maximum_prefix_threshold_warning
,
5967 neighbor_maximum_prefix_threshold_warning_hidden_cmd
,
5968 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) warning-only",
5969 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5970 "Maximum number of prefix accept from this peer\n"
5971 "maximum no. of prefix limit\n"
5972 "Threshold value (%) at which to generate a warning msg\n"
5973 "Only give warning message when limit is exceeded\n")
5975 DEFUN (neighbor_maximum_prefix_restart
,
5976 neighbor_maximum_prefix_restart_cmd
,
5977 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) restart (1-65535)",
5980 "Maximum number of prefix accept from this peer\n"
5981 "maximum no. of prefix limit\n"
5982 "Restart bgp connection after limit is exceeded\n"
5983 "Restart interval in minutes\n")
5987 int idx_number_2
= 5;
5988 return peer_maximum_prefix_set_vty(
5989 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5990 argv
[idx_number
]->arg
, NULL
, 0, argv
[idx_number_2
]->arg
);
5994 neighbor_maximum_prefix_restart
,
5995 neighbor_maximum_prefix_restart_hidden_cmd
,
5996 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) restart (1-65535)",
5997 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5998 "Maximum number of prefix accept from this peer\n"
5999 "maximum no. of prefix limit\n"
6000 "Restart bgp connection after limit is exceeded\n"
6001 "Restart interval in minutes\n")
6003 DEFUN (neighbor_maximum_prefix_threshold_restart
,
6004 neighbor_maximum_prefix_threshold_restart_cmd
,
6005 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) restart (1-65535)",
6008 "Maximum number of prefixes to accept from this peer\n"
6009 "maximum no. of prefix limit\n"
6010 "Threshold value (%) at which to generate a warning msg\n"
6011 "Restart bgp connection after limit is exceeded\n"
6012 "Restart interval in minutes\n")
6016 int idx_number_2
= 4;
6017 int idx_number_3
= 6;
6018 return peer_maximum_prefix_set_vty(
6019 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6020 argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
, 0,
6021 argv
[idx_number_3
]->arg
);
6025 neighbor_maximum_prefix_threshold_restart
,
6026 neighbor_maximum_prefix_threshold_restart_hidden_cmd
,
6027 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) restart (1-65535)",
6028 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6029 "Maximum number of prefixes to accept from this peer\n"
6030 "maximum no. of prefix limit\n"
6031 "Threshold value (%) at which to generate a warning msg\n"
6032 "Restart bgp connection after limit is exceeded\n"
6033 "Restart interval in minutes\n")
6035 DEFUN (no_neighbor_maximum_prefix
,
6036 no_neighbor_maximum_prefix_cmd
,
6037 "no neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix [(1-4294967295) [(1-100)] [restart (1-65535)] [warning-only]]",
6041 "Maximum number of prefixes to accept from this peer\n"
6042 "maximum no. of prefix limit\n"
6043 "Threshold value (%) at which to generate a warning msg\n"
6044 "Restart bgp connection after limit is exceeded\n"
6045 "Restart interval in minutes\n"
6046 "Only give warning message when limit is exceeded\n")
6049 return peer_maximum_prefix_unset_vty(vty
, argv
[idx_peer
]->arg
,
6051 bgp_node_safi(vty
));
6055 no_neighbor_maximum_prefix
, no_neighbor_maximum_prefix_hidden_cmd
,
6056 "no neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix [(1-4294967295) [(1-100)] [restart (1-65535)] [warning-only]]",
6057 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6058 "Maximum number of prefixes to accept from this peer\n"
6059 "maximum no. of prefix limit\n"
6060 "Threshold value (%) at which to generate a warning msg\n"
6061 "Restart bgp connection after limit is exceeded\n"
6062 "Restart interval in minutes\n"
6063 "Only give warning message when limit is exceeded\n")
6066 /* "neighbor allowas-in" */
6067 DEFUN (neighbor_allowas_in
,
6068 neighbor_allowas_in_cmd
,
6069 "neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
6072 "Accept as-path with my AS present in it\n"
6073 "Number of occurences of AS number\n"
6074 "Only accept my AS in the as-path if the route was originated in my AS\n")
6077 int idx_number_origin
= 3;
6083 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6085 return CMD_WARNING_CONFIG_FAILED
;
6087 if (argc
<= idx_number_origin
)
6090 if (argv
[idx_number_origin
]->type
== WORD_TKN
)
6093 allow_num
= atoi(argv
[idx_number_origin
]->arg
);
6096 ret
= peer_allowas_in_set(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6099 return bgp_vty_return(vty
, ret
);
6103 neighbor_allowas_in
, neighbor_allowas_in_hidden_cmd
,
6104 "neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
6105 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6106 "Accept as-path with my AS present in it\n"
6107 "Number of occurences of AS number\n"
6108 "Only accept my AS in the as-path if the route was originated in my AS\n")
6110 DEFUN (no_neighbor_allowas_in
,
6111 no_neighbor_allowas_in_cmd
,
6112 "no neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
6116 "allow local ASN appears in aspath attribute\n"
6117 "Number of occurences of AS number\n"
6118 "Only accept my AS in the as-path if the route was originated in my AS\n")
6124 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6126 return CMD_WARNING_CONFIG_FAILED
;
6128 ret
= peer_allowas_in_unset(peer
, bgp_node_afi(vty
),
6129 bgp_node_safi(vty
));
6131 return bgp_vty_return(vty
, ret
);
6135 no_neighbor_allowas_in
, no_neighbor_allowas_in_hidden_cmd
,
6136 "no neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
6137 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6138 "allow local ASN appears in aspath attribute\n"
6139 "Number of occurences of AS number\n"
6140 "Only accept my AS in the as-path if the route was originated in my AS\n")
6142 DEFUN (neighbor_ttl_security
,
6143 neighbor_ttl_security_cmd
,
6144 "neighbor <A.B.C.D|X:X::X:X|WORD> ttl-security hops (1-254)",
6147 "BGP ttl-security parameters\n"
6148 "Specify the maximum number of hops to the BGP peer\n"
6149 "Number of hops to BGP peer\n")
6156 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6158 return CMD_WARNING_CONFIG_FAILED
;
6160 gtsm_hops
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
6163 * If 'neighbor swpX', then this is for directly connected peers,
6164 * we should not accept a ttl-security hops value greater than 1.
6166 if (peer
->conf_if
&& (gtsm_hops
> 1)) {
6168 "%s is directly connected peer, hops cannot exceed 1\n",
6169 argv
[idx_peer
]->arg
);
6170 return CMD_WARNING_CONFIG_FAILED
;
6173 return bgp_vty_return(vty
, peer_ttl_security_hops_set(peer
, gtsm_hops
));
6176 DEFUN (no_neighbor_ttl_security
,
6177 no_neighbor_ttl_security_cmd
,
6178 "no neighbor <A.B.C.D|X:X::X:X|WORD> ttl-security hops (1-254)",
6182 "BGP ttl-security parameters\n"
6183 "Specify the maximum number of hops to the BGP peer\n"
6184 "Number of hops to BGP peer\n")
6189 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6191 return CMD_WARNING_CONFIG_FAILED
;
6193 return bgp_vty_return(vty
, peer_ttl_security_hops_unset(peer
));
6196 DEFUN (neighbor_addpath_tx_all_paths
,
6197 neighbor_addpath_tx_all_paths_cmd
,
6198 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
6201 "Use addpath to advertise all paths to a neighbor\n")
6206 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6208 return CMD_WARNING_CONFIG_FAILED
;
6210 bgp_addpath_set_peer_type(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6215 ALIAS_HIDDEN(neighbor_addpath_tx_all_paths
,
6216 neighbor_addpath_tx_all_paths_hidden_cmd
,
6217 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
6218 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6219 "Use addpath to advertise all paths to a neighbor\n")
6221 DEFUN (no_neighbor_addpath_tx_all_paths
,
6222 no_neighbor_addpath_tx_all_paths_cmd
,
6223 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
6227 "Use addpath to advertise all paths to a neighbor\n")
6232 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6234 return CMD_WARNING_CONFIG_FAILED
;
6236 if (peer
->addpath_type
[bgp_node_afi(vty
)][bgp_node_safi(vty
)]
6237 != BGP_ADDPATH_ALL
) {
6239 "%% Peer not currently configured to transmit all paths.");
6240 return CMD_WARNING_CONFIG_FAILED
;
6243 bgp_addpath_set_peer_type(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6249 ALIAS_HIDDEN(no_neighbor_addpath_tx_all_paths
,
6250 no_neighbor_addpath_tx_all_paths_hidden_cmd
,
6251 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
6252 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6253 "Use addpath to advertise all paths to a neighbor\n")
6255 DEFUN (neighbor_addpath_tx_bestpath_per_as
,
6256 neighbor_addpath_tx_bestpath_per_as_cmd
,
6257 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
6260 "Use addpath to advertise the bestpath per each neighboring AS\n")
6265 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6267 return CMD_WARNING_CONFIG_FAILED
;
6269 bgp_addpath_set_peer_type(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6270 BGP_ADDPATH_BEST_PER_AS
);
6275 ALIAS_HIDDEN(neighbor_addpath_tx_bestpath_per_as
,
6276 neighbor_addpath_tx_bestpath_per_as_hidden_cmd
,
6277 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
6278 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6279 "Use addpath to advertise the bestpath per each neighboring AS\n")
6281 DEFUN (no_neighbor_addpath_tx_bestpath_per_as
,
6282 no_neighbor_addpath_tx_bestpath_per_as_cmd
,
6283 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
6287 "Use addpath to advertise the bestpath per each neighboring AS\n")
6292 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6294 return CMD_WARNING_CONFIG_FAILED
;
6296 if (peer
->addpath_type
[bgp_node_afi(vty
)][bgp_node_safi(vty
)]
6297 != BGP_ADDPATH_BEST_PER_AS
) {
6299 "%% Peer not currently configured to transmit all best path per as.");
6300 return CMD_WARNING_CONFIG_FAILED
;
6303 bgp_addpath_set_peer_type(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6309 ALIAS_HIDDEN(no_neighbor_addpath_tx_bestpath_per_as
,
6310 no_neighbor_addpath_tx_bestpath_per_as_hidden_cmd
,
6311 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
6312 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6313 "Use addpath to advertise the bestpath per each neighboring AS\n")
6315 static int set_ecom_list(struct vty
*vty
, int argc
, struct cmd_token
**argv
,
6316 struct ecommunity
**list
)
6318 struct ecommunity
*ecom
= NULL
;
6319 struct ecommunity
*ecomadd
;
6321 for (; argc
; --argc
, ++argv
) {
6323 ecomadd
= ecommunity_str2com(argv
[0]->arg
,
6324 ECOMMUNITY_ROUTE_TARGET
, 0);
6326 vty_out(vty
, "Malformed community-list value\n");
6328 ecommunity_free(&ecom
);
6329 return CMD_WARNING_CONFIG_FAILED
;
6333 ecommunity_merge(ecom
, ecomadd
);
6334 ecommunity_free(&ecomadd
);
6341 ecommunity_free(&*list
);
6349 * v2vimport is true if we are handling a `import vrf ...` command
6351 static afi_t
vpn_policy_getafi(struct vty
*vty
, struct bgp
*bgp
, bool v2vimport
)
6355 switch (vty
->node
) {
6364 "%% context error: valid only in address-family <ipv4|ipv6> unicast block\n");
6369 if (CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
6370 BGP_CONFIG_VRF_TO_VRF_IMPORT
)
6371 || CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
6372 BGP_CONFIG_VRF_TO_VRF_EXPORT
)) {
6374 "%% error: Please unconfigure import vrf commands before using vpn commands\n");
6378 if (CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
6379 BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT
)
6380 || CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
6381 BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT
)) {
6383 "%% error: Please unconfigure vpn to vrf commands before using import vrf commands\n");
6390 DEFPY (af_rd_vpn_export
,
6391 af_rd_vpn_export_cmd
,
6392 "[no] rd vpn export ASN:NN_OR_IP-ADDRESS:NN$rd_str",
6394 "Specify route distinguisher\n"
6395 "Between current address-family and vpn\n"
6396 "For routes leaked from current address-family to vpn\n"
6397 "Route Distinguisher (<as-number>:<number> | <ip-address>:<number>)\n")
6399 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6400 struct prefix_rd prd
;
6406 if (argv_find(argv
, argc
, "no", &idx
))
6410 ret
= str2prefix_rd(rd_str
, &prd
);
6412 vty_out(vty
, "%% Malformed rd\n");
6413 return CMD_WARNING_CONFIG_FAILED
;
6417 afi
= vpn_policy_getafi(vty
, bgp
, false);
6419 return CMD_WARNING_CONFIG_FAILED
;
6422 * pre-change: un-export vpn routes (vpn->vrf routes unaffected)
6424 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6425 bgp_get_default(), bgp
);
6428 bgp
->vpn_policy
[afi
].tovpn_rd
= prd
;
6429 SET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6430 BGP_VPN_POLICY_TOVPN_RD_SET
);
6432 UNSET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6433 BGP_VPN_POLICY_TOVPN_RD_SET
);
6436 /* post-change: re-export vpn routes */
6437 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6438 bgp_get_default(), bgp
);
6443 ALIAS (af_rd_vpn_export
,
6444 af_no_rd_vpn_export_cmd
,
6447 "Specify route distinguisher\n"
6448 "Between current address-family and vpn\n"
6449 "For routes leaked from current address-family to vpn\n")
6451 DEFPY (af_label_vpn_export
,
6452 af_label_vpn_export_cmd
,
6453 "[no] label vpn export <(0-1048575)$label_val|auto$label_auto>",
6455 "label value for VRF\n"
6456 "Between current address-family and vpn\n"
6457 "For routes leaked from current address-family to vpn\n"
6458 "Label Value <0-1048575>\n"
6459 "Automatically assign a label\n")
6461 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6462 mpls_label_t label
= MPLS_LABEL_NONE
;
6467 if (argv_find(argv
, argc
, "no", &idx
))
6470 /* If "no ...", squash trailing parameter */
6476 label
= label_val
; /* parser should force unsigned */
6479 afi
= vpn_policy_getafi(vty
, bgp
, false);
6481 return CMD_WARNING_CONFIG_FAILED
;
6484 if (label_auto
&& CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
6485 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
))
6490 * pre-change: un-export vpn routes (vpn->vrf routes unaffected)
6492 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6493 bgp_get_default(), bgp
);
6495 if (!label_auto
&& CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
6496 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
)) {
6498 if (bgp
->vpn_policy
[afi
].tovpn_label
!= MPLS_LABEL_NONE
) {
6501 * label has previously been automatically
6502 * assigned by labelpool: release it
6504 * NB if tovpn_label == MPLS_LABEL_NONE it
6505 * means the automatic assignment is in flight
6506 * and therefore the labelpool callback must
6507 * detect that the auto label is not needed.
6510 bgp_lp_release(LP_TYPE_VRF
,
6511 &bgp
->vpn_policy
[afi
],
6512 bgp
->vpn_policy
[afi
].tovpn_label
);
6514 UNSET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6515 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
);
6518 bgp
->vpn_policy
[afi
].tovpn_label
= label
;
6520 SET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6521 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
);
6522 bgp_lp_get(LP_TYPE_VRF
, &bgp
->vpn_policy
[afi
],
6523 vpn_leak_label_callback
);
6526 /* post-change: re-export vpn routes */
6527 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6528 bgp_get_default(), bgp
);
6533 ALIAS (af_label_vpn_export
,
6534 af_no_label_vpn_export_cmd
,
6535 "no label vpn export",
6537 "label value for VRF\n"
6538 "Between current address-family and vpn\n"
6539 "For routes leaked from current address-family to vpn\n")
6541 DEFPY (af_nexthop_vpn_export
,
6542 af_nexthop_vpn_export_cmd
,
6543 "[no] nexthop vpn export <A.B.C.D|X:X::X:X>$nexthop_str",
6545 "Specify next hop to use for VRF advertised prefixes\n"
6546 "Between current address-family and vpn\n"
6547 "For routes leaked from current address-family to vpn\n"
6551 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6557 if (argv_find(argv
, argc
, "no", &idx
))
6561 if (!sockunion2hostprefix(nexthop_str
, &p
))
6562 return CMD_WARNING_CONFIG_FAILED
;
6565 afi
= vpn_policy_getafi(vty
, bgp
, false);
6567 return CMD_WARNING_CONFIG_FAILED
;
6570 * pre-change: un-export vpn routes (vpn->vrf routes unaffected)
6572 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6573 bgp_get_default(), bgp
);
6576 bgp
->vpn_policy
[afi
].tovpn_nexthop
= p
;
6577 SET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6578 BGP_VPN_POLICY_TOVPN_NEXTHOP_SET
);
6580 UNSET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6581 BGP_VPN_POLICY_TOVPN_NEXTHOP_SET
);
6584 /* post-change: re-export vpn routes */
6585 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6586 bgp_get_default(), bgp
);
6591 ALIAS (af_nexthop_vpn_export
,
6592 af_no_nexthop_vpn_export_cmd
,
6593 "no nexthop vpn export",
6595 "Specify next hop to use for VRF advertised prefixes\n"
6596 "Between current address-family and vpn\n"
6597 "For routes leaked from current address-family to vpn\n")
6599 static int vpn_policy_getdirs(struct vty
*vty
, const char *dstr
, int *dodir
)
6601 if (!strcmp(dstr
, "import")) {
6602 dodir
[BGP_VPN_POLICY_DIR_FROMVPN
] = 1;
6603 } else if (!strcmp(dstr
, "export")) {
6604 dodir
[BGP_VPN_POLICY_DIR_TOVPN
] = 1;
6605 } else if (!strcmp(dstr
, "both")) {
6606 dodir
[BGP_VPN_POLICY_DIR_FROMVPN
] = 1;
6607 dodir
[BGP_VPN_POLICY_DIR_TOVPN
] = 1;
6609 vty_out(vty
, "%% direction parse error\n");
6610 return CMD_WARNING_CONFIG_FAILED
;
6615 DEFPY (af_rt_vpn_imexport
,
6616 af_rt_vpn_imexport_cmd
,
6617 "[no] <rt|route-target> vpn <import|export|both>$direction_str RTLIST...",
6619 "Specify route target list\n"
6620 "Specify route target list\n"
6621 "Between current address-family and vpn\n"
6622 "For routes leaked from vpn to current address-family: match any\n"
6623 "For routes leaked from current address-family to vpn: set\n"
6624 "both import: match any and export: set\n"
6625 "Space separated route target list (A.B.C.D:MN|EF:OPQR|GHJK:MN)\n")
6627 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6629 struct ecommunity
*ecom
= NULL
;
6630 int dodir
[BGP_VPN_POLICY_DIR_MAX
] = {0};
6631 vpn_policy_direction_t dir
;
6636 if (argv_find(argv
, argc
, "no", &idx
))
6639 afi
= vpn_policy_getafi(vty
, bgp
, false);
6641 return CMD_WARNING_CONFIG_FAILED
;
6643 ret
= vpn_policy_getdirs(vty
, direction_str
, dodir
);
6644 if (ret
!= CMD_SUCCESS
)
6648 if (!argv_find(argv
, argc
, "RTLIST", &idx
)) {
6649 vty_out(vty
, "%% Missing RTLIST\n");
6650 return CMD_WARNING_CONFIG_FAILED
;
6652 ret
= set_ecom_list(vty
, argc
- idx
, argv
+ idx
, &ecom
);
6653 if (ret
!= CMD_SUCCESS
) {
6658 for (dir
= 0; dir
< BGP_VPN_POLICY_DIR_MAX
; ++dir
) {
6662 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
6665 if (bgp
->vpn_policy
[afi
].rtlist
[dir
])
6667 &bgp
->vpn_policy
[afi
].rtlist
[dir
]);
6668 bgp
->vpn_policy
[afi
].rtlist
[dir
] =
6669 ecommunity_dup(ecom
);
6671 if (bgp
->vpn_policy
[afi
].rtlist
[dir
])
6673 &bgp
->vpn_policy
[afi
].rtlist
[dir
]);
6674 bgp
->vpn_policy
[afi
].rtlist
[dir
] = NULL
;
6677 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
6681 ecommunity_free(&ecom
);
6686 ALIAS (af_rt_vpn_imexport
,
6687 af_no_rt_vpn_imexport_cmd
,
6688 "no <rt|route-target> vpn <import|export|both>$direction_str",
6690 "Specify route target list\n"
6691 "Specify route target list\n"
6692 "Between current address-family and vpn\n"
6693 "For routes leaked from vpn to current address-family\n"
6694 "For routes leaked from current address-family to vpn\n"
6695 "both import and export\n")
6697 DEFPY (af_route_map_vpn_imexport
,
6698 af_route_map_vpn_imexport_cmd
,
6699 /* future: "route-map <vpn|evpn|vrf NAME> <import|export> RMAP" */
6700 "[no] route-map vpn <import|export>$direction_str RMAP$rmap_str",
6702 "Specify route map\n"
6703 "Between current address-family and vpn\n"
6704 "For routes leaked from vpn to current address-family\n"
6705 "For routes leaked from current address-family to vpn\n"
6706 "name of route-map\n")
6708 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6710 int dodir
[BGP_VPN_POLICY_DIR_MAX
] = {0};
6711 vpn_policy_direction_t dir
;
6716 if (argv_find(argv
, argc
, "no", &idx
))
6719 afi
= vpn_policy_getafi(vty
, bgp
, false);
6721 return CMD_WARNING_CONFIG_FAILED
;
6723 ret
= vpn_policy_getdirs(vty
, direction_str
, dodir
);
6724 if (ret
!= CMD_SUCCESS
)
6727 for (dir
= 0; dir
< BGP_VPN_POLICY_DIR_MAX
; ++dir
) {
6731 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
6734 if (bgp
->vpn_policy
[afi
].rmap_name
[dir
])
6735 XFREE(MTYPE_ROUTE_MAP_NAME
,
6736 bgp
->vpn_policy
[afi
].rmap_name
[dir
]);
6737 bgp
->vpn_policy
[afi
].rmap_name
[dir
] = XSTRDUP(
6738 MTYPE_ROUTE_MAP_NAME
, rmap_str
);
6739 bgp
->vpn_policy
[afi
].rmap
[dir
] =
6740 route_map_lookup_warn_noexist(vty
, rmap_str
);
6741 if (!bgp
->vpn_policy
[afi
].rmap
[dir
])
6744 if (bgp
->vpn_policy
[afi
].rmap_name
[dir
])
6745 XFREE(MTYPE_ROUTE_MAP_NAME
,
6746 bgp
->vpn_policy
[afi
].rmap_name
[dir
]);
6747 bgp
->vpn_policy
[afi
].rmap_name
[dir
] = NULL
;
6748 bgp
->vpn_policy
[afi
].rmap
[dir
] = NULL
;
6751 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
6757 ALIAS (af_route_map_vpn_imexport
,
6758 af_no_route_map_vpn_imexport_cmd
,
6759 "no route-map vpn <import|export>$direction_str",
6761 "Specify route map\n"
6762 "Between current address-family and vpn\n"
6763 "For routes leaked from vpn to current address-family\n"
6764 "For routes leaked from current address-family to vpn\n")
6766 DEFPY(af_import_vrf_route_map
, af_import_vrf_route_map_cmd
,
6767 "[no] import vrf route-map RMAP$rmap_str",
6769 "Import routes from another VRF\n"
6770 "Vrf routes being filtered\n"
6771 "Specify route map\n"
6772 "name of route-map\n")
6774 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6775 vpn_policy_direction_t dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
6779 struct bgp
*bgp_default
;
6781 if (argv_find(argv
, argc
, "no", &idx
))
6784 afi
= vpn_policy_getafi(vty
, bgp
, true);
6786 return CMD_WARNING_CONFIG_FAILED
;
6788 bgp_default
= bgp_get_default();
6793 /* Auto-create assuming the same AS */
6794 ret
= bgp_get(&bgp_default
, &as
, NULL
,
6795 BGP_INSTANCE_TYPE_DEFAULT
);
6799 "VRF default is not configured as a bgp instance\n");
6804 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
6807 if (bgp
->vpn_policy
[afi
].rmap_name
[dir
])
6808 XFREE(MTYPE_ROUTE_MAP_NAME
,
6809 bgp
->vpn_policy
[afi
].rmap_name
[dir
]);
6810 bgp
->vpn_policy
[afi
].rmap_name
[dir
] =
6811 XSTRDUP(MTYPE_ROUTE_MAP_NAME
, rmap_str
);
6812 bgp
->vpn_policy
[afi
].rmap
[dir
] =
6813 route_map_lookup_warn_noexist(vty
, rmap_str
);
6814 if (!bgp
->vpn_policy
[afi
].rmap
[dir
])
6817 if (bgp
->vpn_policy
[afi
].rmap_name
[dir
])
6818 XFREE(MTYPE_ROUTE_MAP_NAME
,
6819 bgp
->vpn_policy
[afi
].rmap_name
[dir
]);
6820 bgp
->vpn_policy
[afi
].rmap_name
[dir
] = NULL
;
6821 bgp
->vpn_policy
[afi
].rmap
[dir
] = NULL
;
6824 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
6829 ALIAS(af_import_vrf_route_map
, af_no_import_vrf_route_map_cmd
,
6830 "no import vrf route-map",
6832 "Import routes from another VRF\n"
6833 "Vrf routes being filtered\n"
6834 "Specify route map\n")
6836 DEFPY(bgp_imexport_vrf
, bgp_imexport_vrf_cmd
,
6837 "[no] import vrf VIEWVRFNAME$import_name",
6839 "Import routes from another VRF\n"
6840 "VRF to import from\n"
6841 "The name of the VRF\n")
6843 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6844 struct listnode
*node
;
6845 struct bgp
*vrf_bgp
, *bgp_default
;
6848 bool remove
= false;
6851 enum bgp_instance_type bgp_type
= BGP_INSTANCE_TYPE_VRF
;
6855 if (import_name
== NULL
) {
6856 vty_out(vty
, "%% Missing import name\n");
6860 if (argv_find(argv
, argc
, "no", &idx
))
6863 afi
= vpn_policy_getafi(vty
, bgp
, true);
6865 return CMD_WARNING_CONFIG_FAILED
;
6867 safi
= bgp_node_safi(vty
);
6869 if (((BGP_INSTANCE_TYPE_DEFAULT
== bgp
->inst_type
)
6870 && (strcmp(import_name
, VRF_DEFAULT_NAME
) == 0))
6871 || (bgp
->name
&& (strcmp(import_name
, bgp
->name
) == 0))) {
6872 vty_out(vty
, "%% Cannot %s vrf %s into itself\n",
6873 remove
? "unimport" : "import", import_name
);
6877 bgp_default
= bgp_get_default();
6879 /* Auto-create assuming the same AS */
6880 ret
= bgp_get(&bgp_default
, &as
, NULL
,
6881 BGP_INSTANCE_TYPE_DEFAULT
);
6885 "VRF default is not configured as a bgp instance\n");
6890 vrf_bgp
= bgp_lookup_by_name(import_name
);
6892 if (strcmp(import_name
, VRF_DEFAULT_NAME
) == 0)
6893 vrf_bgp
= bgp_default
;
6895 /* Auto-create assuming the same AS */
6896 ret
= bgp_get(&vrf_bgp
, &as
, import_name
, bgp_type
);
6900 "VRF %s is not configured as a bgp instance\n",
6907 vrf_unimport_from_vrf(bgp
, vrf_bgp
, afi
, safi
);
6909 /* Already importing from "import_vrf"? */
6910 for (ALL_LIST_ELEMENTS_RO(bgp
->vpn_policy
[afi
].import_vrf
, node
,
6912 if (strcmp(vname
, import_name
) == 0)
6916 vrf_import_from_vrf(bgp
, vrf_bgp
, afi
, safi
);
6922 /* This command is valid only in a bgp vrf instance or the default instance */
6923 DEFPY (bgp_imexport_vpn
,
6924 bgp_imexport_vpn_cmd
,
6925 "[no] <import|export>$direction_str vpn",
6927 "Import routes to this address-family\n"
6928 "Export routes from this address-family\n"
6929 "to/from default instance VPN RIB\n")
6931 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6938 vpn_policy_direction_t dir
;
6940 if (argv_find(argv
, argc
, "no", &idx
))
6943 if (BGP_INSTANCE_TYPE_VRF
!= bgp
->inst_type
&&
6944 BGP_INSTANCE_TYPE_DEFAULT
!= bgp
->inst_type
) {
6946 vty_out(vty
, "%% import|export vpn valid only for bgp vrf or default instance\n");
6947 return CMD_WARNING_CONFIG_FAILED
;
6950 afi
= bgp_node_afi(vty
);
6951 safi
= bgp_node_safi(vty
);
6952 if ((SAFI_UNICAST
!= safi
) || ((AFI_IP
!= afi
) && (AFI_IP6
!= afi
))) {
6953 vty_out(vty
, "%% import|export vpn valid only for unicast ipv4|ipv6\n");
6954 return CMD_WARNING_CONFIG_FAILED
;
6957 if (!strcmp(direction_str
, "import")) {
6958 flag
= BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT
;
6959 dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
6960 } else if (!strcmp(direction_str
, "export")) {
6961 flag
= BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT
;
6962 dir
= BGP_VPN_POLICY_DIR_TOVPN
;
6964 vty_out(vty
, "%% unknown direction %s\n", direction_str
);
6965 return CMD_WARNING_CONFIG_FAILED
;
6968 previous_state
= CHECK_FLAG(bgp
->af_flags
[afi
][safi
], flag
);
6971 SET_FLAG(bgp
->af_flags
[afi
][safi
], flag
);
6972 if (!previous_state
) {
6973 /* trigger export current vrf */
6974 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
6977 if (previous_state
) {
6978 /* trigger un-export current vrf */
6979 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
6981 UNSET_FLAG(bgp
->af_flags
[afi
][safi
], flag
);
6987 DEFPY (af_routetarget_import
,
6988 af_routetarget_import_cmd
,
6989 "[no] <rt|route-target> redirect import RTLIST...",
6991 "Specify route target list\n"
6992 "Specify route target list\n"
6993 "Flow-spec redirect type route target\n"
6994 "Import routes to this address-family\n"
6995 "Space separated route target list (A.B.C.D:MN|EF:OPQR|GHJK:MN)\n")
6997 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6999 struct ecommunity
*ecom
= NULL
;
7004 if (argv_find(argv
, argc
, "no", &idx
))
7007 afi
= vpn_policy_getafi(vty
, bgp
, false);
7009 return CMD_WARNING_CONFIG_FAILED
;
7012 if (!argv_find(argv
, argc
, "RTLIST", &idx
)) {
7013 vty_out(vty
, "%% Missing RTLIST\n");
7014 return CMD_WARNING_CONFIG_FAILED
;
7016 ret
= set_ecom_list(vty
, argc
- idx
, argv
+ idx
, &ecom
);
7017 if (ret
!= CMD_SUCCESS
)
7022 if (bgp
->vpn_policy
[afi
].import_redirect_rtlist
)
7023 ecommunity_free(&bgp
->vpn_policy
[afi
]
7024 .import_redirect_rtlist
);
7025 bgp
->vpn_policy
[afi
].import_redirect_rtlist
=
7026 ecommunity_dup(ecom
);
7028 if (bgp
->vpn_policy
[afi
].import_redirect_rtlist
)
7029 ecommunity_free(&bgp
->vpn_policy
[afi
]
7030 .import_redirect_rtlist
);
7031 bgp
->vpn_policy
[afi
].import_redirect_rtlist
= NULL
;
7035 ecommunity_free(&ecom
);
7040 DEFUN_NOSH (address_family_ipv4_safi
,
7041 address_family_ipv4_safi_cmd
,
7042 "address-family ipv4 [<unicast|multicast|vpn|labeled-unicast|flowspec>]",
7043 "Enter Address Family command mode\n"
7045 BGP_SAFI_WITH_LABEL_HELP_STR
)
7049 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
7050 safi_t safi
= bgp_vty_safi_from_str(argv
[2]->text
);
7051 if (bgp
->inst_type
!= BGP_INSTANCE_TYPE_DEFAULT
7052 && safi
!= SAFI_UNICAST
&& safi
!= SAFI_MULTICAST
7053 && safi
!= SAFI_EVPN
) {
7055 "Only Unicast/Multicast/EVPN SAFIs supported in non-core instances.\n");
7056 return CMD_WARNING_CONFIG_FAILED
;
7058 vty
->node
= bgp_node_type(AFI_IP
, safi
);
7060 vty
->node
= BGP_IPV4_NODE
;
7065 DEFUN_NOSH (address_family_ipv6_safi
,
7066 address_family_ipv6_safi_cmd
,
7067 "address-family ipv6 [<unicast|multicast|vpn|labeled-unicast|flowspec>]",
7068 "Enter Address Family command mode\n"
7070 BGP_SAFI_WITH_LABEL_HELP_STR
)
7073 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
7074 safi_t safi
= bgp_vty_safi_from_str(argv
[2]->text
);
7075 if (bgp
->inst_type
!= BGP_INSTANCE_TYPE_DEFAULT
7076 && safi
!= SAFI_UNICAST
&& safi
!= SAFI_MULTICAST
7077 && safi
!= SAFI_EVPN
) {
7079 "Only Unicast/Multicast/EVPN SAFIs supported in non-core instances.\n");
7080 return CMD_WARNING_CONFIG_FAILED
;
7082 vty
->node
= bgp_node_type(AFI_IP6
, safi
);
7084 vty
->node
= BGP_IPV6_NODE
;
7089 #ifdef KEEP_OLD_VPN_COMMANDS
7090 DEFUN_NOSH (address_family_vpnv4
,
7091 address_family_vpnv4_cmd
,
7092 "address-family vpnv4 [unicast]",
7093 "Enter Address Family command mode\n"
7095 "Address Family modifier\n")
7097 vty
->node
= BGP_VPNV4_NODE
;
7101 DEFUN_NOSH (address_family_vpnv6
,
7102 address_family_vpnv6_cmd
,
7103 "address-family vpnv6 [unicast]",
7104 "Enter Address Family command mode\n"
7106 "Address Family modifier\n")
7108 vty
->node
= BGP_VPNV6_NODE
;
7111 #endif /* KEEP_OLD_VPN_COMMANDS */
7113 DEFUN_NOSH (address_family_evpn
,
7114 address_family_evpn_cmd
,
7115 "address-family l2vpn evpn",
7116 "Enter Address Family command mode\n"
7118 "Address Family modifier\n")
7120 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
7121 vty
->node
= BGP_EVPN_NODE
;
7125 DEFUN_NOSH (exit_address_family
,
7126 exit_address_family_cmd
,
7127 "exit-address-family",
7128 "Exit from Address Family configuration mode\n")
7130 if (vty
->node
== BGP_IPV4_NODE
|| vty
->node
== BGP_IPV4M_NODE
7131 || vty
->node
== BGP_IPV4L_NODE
|| vty
->node
== BGP_VPNV4_NODE
7132 || vty
->node
== BGP_IPV6_NODE
|| vty
->node
== BGP_IPV6M_NODE
7133 || vty
->node
== BGP_IPV6L_NODE
|| vty
->node
== BGP_VPNV6_NODE
7134 || vty
->node
== BGP_EVPN_NODE
7135 || vty
->node
== BGP_FLOWSPECV4_NODE
7136 || vty
->node
== BGP_FLOWSPECV6_NODE
)
7137 vty
->node
= BGP_NODE
;
7141 /* Recalculate bestpath and re-advertise a prefix */
7142 static int bgp_clear_prefix(struct vty
*vty
, const char *view_name
,
7143 const char *ip_str
, afi_t afi
, safi_t safi
,
7144 struct prefix_rd
*prd
)
7147 struct prefix match
;
7148 struct bgp_node
*rn
;
7149 struct bgp_node
*rm
;
7151 struct bgp_table
*table
;
7152 struct bgp_table
*rib
;
7154 /* BGP structure lookup. */
7156 bgp
= bgp_lookup_by_name(view_name
);
7158 vty_out(vty
, "%% Can't find BGP instance %s\n",
7163 bgp
= bgp_get_default();
7165 vty_out(vty
, "%% No BGP process is configured\n");
7170 /* Check IP address argument. */
7171 ret
= str2prefix(ip_str
, &match
);
7173 vty_out(vty
, "%% address is malformed\n");
7177 match
.family
= afi2family(afi
);
7178 rib
= bgp
->rib
[afi
][safi
];
7180 if (safi
== SAFI_MPLS_VPN
) {
7181 for (rn
= bgp_table_top(rib
); rn
; rn
= bgp_route_next(rn
)) {
7182 if (prd
&& memcmp(rn
->p
.u
.val
, prd
->val
, 8) != 0)
7185 table
= bgp_node_get_bgp_table_info(rn
);
7186 if (table
!= NULL
) {
7188 if ((rm
= bgp_node_match(table
, &match
))
7191 == match
.prefixlen
) {
7193 BGP_NODE_USER_CLEAR
);
7194 bgp_process(bgp
, rm
, afi
, safi
);
7196 bgp_unlock_node(rm
);
7201 if ((rn
= bgp_node_match(rib
, &match
)) != NULL
) {
7202 if (rn
->p
.prefixlen
== match
.prefixlen
) {
7203 SET_FLAG(rn
->flags
, BGP_NODE_USER_CLEAR
);
7204 bgp_process(bgp
, rn
, afi
, safi
);
7206 bgp_unlock_node(rn
);
7213 /* one clear bgp command to rule them all */
7214 DEFUN (clear_ip_bgp_all
,
7215 clear_ip_bgp_all_cmd
,
7216 "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>]",
7220 BGP_INSTANCE_HELP_STR
7223 BGP_SAFI_WITH_LABEL_HELP_STR
7224 "Address Family modifier\n"
7226 "BGP neighbor address to clear\n"
7227 "BGP IPv6 neighbor to clear\n"
7228 "BGP neighbor on interface to clear\n"
7229 "Clear peers with the AS number\n"
7230 "Clear all external peers\n"
7231 "Clear all members of peer-group\n"
7232 "BGP peer-group name\n"
7237 "Push out prefix-list ORF and do inbound soft reconfig\n"
7242 afi_t afi
= AFI_IP6
;
7243 safi_t safi
= SAFI_UNICAST
;
7244 enum clear_sort clr_sort
= clear_peer
;
7245 enum bgp_clear_type clr_type
;
7246 char *clr_arg
= NULL
;
7250 /* clear [ip] bgp */
7251 if (argv_find(argv
, argc
, "ip", &idx
))
7254 /* [<vrf> VIEWVRFNAME] */
7255 if (argv_find(argv
, argc
, "vrf", &idx
)) {
7256 vrf
= argv
[idx
+ 1]->arg
;
7258 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
7260 } else if (argv_find(argv
, argc
, "view", &idx
)) {
7261 /* [<view> VIEWVRFNAME] */
7262 vrf
= argv
[idx
+ 1]->arg
;
7265 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
7266 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
))
7267 argv_find_and_parse_safi(argv
, argc
, &idx
, &safi
);
7269 /* <*|A.B.C.D|X:X::X:X|WORD|(1-4294967295)|external|peer-group PGNAME> */
7270 if (argv_find(argv
, argc
, "*", &idx
)) {
7271 clr_sort
= clear_all
;
7272 } else if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7273 clr_sort
= clear_peer
;
7274 clr_arg
= argv
[idx
]->arg
;
7275 } else if (argv_find(argv
, argc
, "X:X::X:X", &idx
)) {
7276 clr_sort
= clear_peer
;
7277 clr_arg
= argv
[idx
]->arg
;
7278 } else if (argv_find(argv
, argc
, "peer-group", &idx
)) {
7279 clr_sort
= clear_group
;
7281 clr_arg
= argv
[idx
]->arg
;
7282 } else if (argv_find(argv
, argc
, "PGNAME", &idx
)) {
7283 clr_sort
= clear_peer
;
7284 clr_arg
= argv
[idx
]->arg
;
7285 } else if (argv_find(argv
, argc
, "(1-4294967295)", &idx
)) {
7286 clr_sort
= clear_as
;
7287 clr_arg
= argv
[idx
]->arg
;
7288 } else if (argv_find(argv
, argc
, "external", &idx
)) {
7289 clr_sort
= clear_external
;
7292 /* [<soft [<in|out>]|in [prefix-filter]|out>] */
7293 if (argv_find(argv
, argc
, "soft", &idx
)) {
7294 if (argv_find(argv
, argc
, "in", &idx
)
7295 || argv_find(argv
, argc
, "out", &idx
))
7296 clr_type
= strmatch(argv
[idx
]->text
, "in")
7298 : BGP_CLEAR_SOFT_OUT
;
7300 clr_type
= BGP_CLEAR_SOFT_BOTH
;
7301 } else if (argv_find(argv
, argc
, "in", &idx
)) {
7302 clr_type
= argv_find(argv
, argc
, "prefix-filter", &idx
)
7303 ? BGP_CLEAR_SOFT_IN_ORF_PREFIX
7304 : BGP_CLEAR_SOFT_IN
;
7305 } else if (argv_find(argv
, argc
, "out", &idx
)) {
7306 clr_type
= BGP_CLEAR_SOFT_OUT
;
7308 clr_type
= BGP_CLEAR_SOFT_NONE
;
7310 return bgp_clear_vty(vty
, vrf
, afi
, safi
, clr_sort
, clr_type
, clr_arg
);
7313 DEFUN (clear_ip_bgp_prefix
,
7314 clear_ip_bgp_prefix_cmd
,
7315 "clear [ip] bgp [<view|vrf> VIEWVRFNAME] prefix A.B.C.D/M",
7319 BGP_INSTANCE_HELP_STR
7320 "Clear bestpath and re-advertise\n"
7324 char *prefix
= NULL
;
7328 /* [<view|vrf> VIEWVRFNAME] */
7329 if (argv_find(argv
, argc
, "vrf", &idx
)) {
7330 vrf
= argv
[idx
+ 1]->arg
;
7332 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
7334 } else if (argv_find(argv
, argc
, "view", &idx
)) {
7335 /* [<view> VIEWVRFNAME] */
7336 vrf
= argv
[idx
+ 1]->arg
;
7340 prefix
= argv
[argc
- 1]->arg
;
7342 return bgp_clear_prefix(vty
, vrf
, prefix
, AFI_IP
, SAFI_UNICAST
, NULL
);
7345 DEFUN (clear_bgp_ipv6_safi_prefix
,
7346 clear_bgp_ipv6_safi_prefix_cmd
,
7347 "clear [ip] bgp ipv6 "BGP_SAFI_CMD_STR
" prefix X:X::X:X/M",
7353 "Clear bestpath and re-advertise\n"
7357 int idx_ipv6_prefix
= 0;
7358 safi_t safi
= SAFI_UNICAST
;
7359 char *prefix
= argv_find(argv
, argc
, "X:X::X:X/M", &idx_ipv6_prefix
) ?
7360 argv
[idx_ipv6_prefix
]->arg
: NULL
;
7362 argv_find_and_parse_safi(argv
, argc
, &idx_safi
, &safi
);
7363 return bgp_clear_prefix(
7364 vty
, NULL
, prefix
, AFI_IP6
,
7368 DEFUN (clear_bgp_instance_ipv6_safi_prefix
,
7369 clear_bgp_instance_ipv6_safi_prefix_cmd
,
7370 "clear [ip] bgp <view|vrf> VIEWVRFNAME ipv6 "BGP_SAFI_CMD_STR
" prefix X:X::X:X/M",
7374 BGP_INSTANCE_HELP_STR
7377 "Clear bestpath and re-advertise\n"
7381 int idx_vrfview
= 0;
7382 int idx_ipv6_prefix
= 0;
7383 safi_t safi
= SAFI_UNICAST
;
7384 char *prefix
= argv_find(argv
, argc
, "X:X::X:X/M", &idx_ipv6_prefix
) ?
7385 argv
[idx_ipv6_prefix
]->arg
: NULL
;
7386 char *vrfview
= NULL
;
7388 /* [<view|vrf> VIEWVRFNAME] */
7389 if (argv_find(argv
, argc
, "vrf", &idx_vrfview
)) {
7390 vrfview
= argv
[idx_vrfview
+ 1]->arg
;
7391 if (vrfview
&& strmatch(vrfview
, VRF_DEFAULT_NAME
))
7393 } else if (argv_find(argv
, argc
, "view", &idx_vrfview
)) {
7394 /* [<view> VIEWVRFNAME] */
7395 vrfview
= argv
[idx_vrfview
+ 1]->arg
;
7397 argv_find_and_parse_safi(argv
, argc
, &idx_safi
, &safi
);
7399 return bgp_clear_prefix(
7400 vty
, vrfview
, prefix
,
7401 AFI_IP6
, safi
, NULL
);
7404 DEFUN (show_bgp_views
,
7406 "show [ip] bgp views",
7410 "Show the defined BGP views\n")
7412 struct list
*inst
= bm
->bgp
;
7413 struct listnode
*node
;
7416 vty_out(vty
, "Defined BGP views:\n");
7417 for (ALL_LIST_ELEMENTS_RO(inst
, node
, bgp
)) {
7419 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_VRF
)
7421 vty_out(vty
, "\t%s (AS%u)\n", bgp
->name
? bgp
->name
: "(null)",
7428 DEFUN (show_bgp_vrfs
,
7430 "show [ip] bgp vrfs [json]",
7437 char buf
[ETHER_ADDR_STRLEN
];
7438 struct list
*inst
= bm
->bgp
;
7439 struct listnode
*node
;
7441 bool uj
= use_json(argc
, argv
);
7442 json_object
*json
= NULL
;
7443 json_object
*json_vrfs
= NULL
;
7447 json
= json_object_new_object();
7448 json_vrfs
= json_object_new_object();
7451 for (ALL_LIST_ELEMENTS_RO(inst
, node
, bgp
)) {
7452 const char *name
, *type
;
7454 struct listnode
*node2
, *nnode2
;
7455 int peers_cfg
, peers_estb
;
7456 json_object
*json_vrf
= NULL
;
7459 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_VIEW
)
7463 if (!uj
&& count
== 1) {
7465 "%4s %-5s %-16s %9s %10s %-37s\n",
7466 "Type", "Id", "routerId", "#PeersVfg",
7467 "#PeersEstb", "Name");
7468 vty_out(vty
, "%11s %-16s %-21s %-6s\n", " ",
7469 "L3-VNI", "RouterMAC", "Interface");
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_string_add(json_vrf
, "interface",
7512 ifindex2ifname(bgp
->l3vni_svi_ifindex
,
7514 json_object_object_add(json_vrfs
, name
, json_vrf
);
7517 "%4s %-5d %-16s %-9u %-10u %-37s\n",
7519 bgp
->vrf_id
== VRF_UNKNOWN
? -1
7521 inet_ntoa(bgp
->router_id
), peers_cfg
,
7523 vty_out(vty
,"%11s %-16u %-21s %-20s\n", " ",
7525 prefix_mac2str(&bgp
->rmac
, buf
, sizeof(buf
)),
7526 ifindex2ifname(bgp
->l3vni_svi_ifindex
,
7532 json_object_object_add(json
, "vrfs", json_vrfs
);
7534 json_object_int_add(json
, "totalVrfs", count
);
7536 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
7537 json
, JSON_C_TO_STRING_PRETTY
));
7538 json_object_free(json
);
7542 "\nTotal number of VRFs (including default): %d\n",
7549 DEFUN (show_bgp_mac_hash
,
7550 show_bgp_mac_hash_cmd
,
7551 "show bgp mac hash",
7555 "Mac Address database\n")
7557 bgp_mac_dump_table(vty
);
7562 static void show_tip_entry(struct hash_bucket
*bucket
, void *args
)
7564 struct vty
*vty
= (struct vty
*)args
;
7565 struct tip_addr
*tip
= (struct tip_addr
*)bucket
->data
;
7567 vty_out(vty
, "addr: %s, count: %d\n", inet_ntoa(tip
->addr
),
7571 static void bgp_show_martian_nexthops(struct vty
*vty
, struct bgp
*bgp
)
7573 vty_out(vty
, "self nexthop database:\n");
7574 bgp_nexthop_show_address_hash(vty
, bgp
);
7576 vty_out(vty
, "Tunnel-ip database:\n");
7577 hash_iterate(bgp
->tip_hash
,
7578 (void (*)(struct hash_bucket
*, void *))show_tip_entry
,
7582 DEFUN(show_bgp_martian_nexthop_db
, show_bgp_martian_nexthop_db_cmd
,
7583 "show bgp [<view|vrf> VIEWVRFNAME] martian next-hop",
7584 SHOW_STR BGP_STR BGP_INSTANCE_HELP_STR
7585 "martian next-hops\n"
7586 "martian next-hop database\n")
7588 struct bgp
*bgp
= NULL
;
7592 /* [<vrf> VIEWVRFNAME] */
7593 if (argv_find(argv
, argc
, "vrf", &idx
)) {
7594 name
= argv
[idx
+ 1]->arg
;
7595 if (name
&& strmatch(name
, VRF_DEFAULT_NAME
))
7597 } else if (argv_find(argv
, argc
, "view", &idx
))
7598 /* [<view> VIEWVRFNAME] */
7599 name
= argv
[idx
+ 1]->arg
;
7601 bgp
= bgp_lookup_by_name(name
);
7603 bgp
= bgp_get_default();
7606 vty_out(vty
, "%% No BGP process is configured\n");
7609 bgp_show_martian_nexthops(vty
, bgp
);
7614 DEFUN (show_bgp_memory
,
7615 show_bgp_memory_cmd
,
7616 "show [ip] bgp memory",
7620 "Global BGP memory statistics\n")
7622 char memstrbuf
[MTYPE_MEMSTR_LEN
];
7623 unsigned long count
;
7625 /* RIB related usage stats */
7626 count
= mtype_stats_alloc(MTYPE_BGP_NODE
);
7627 vty_out(vty
, "%ld RIB nodes, using %s of memory\n", count
,
7628 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7629 count
* sizeof(struct bgp_node
)));
7631 count
= mtype_stats_alloc(MTYPE_BGP_ROUTE
);
7632 vty_out(vty
, "%ld BGP routes, using %s of memory\n", count
,
7633 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7634 count
* sizeof(struct bgp_path_info
)));
7635 if ((count
= mtype_stats_alloc(MTYPE_BGP_ROUTE_EXTRA
)))
7636 vty_out(vty
, "%ld BGP route ancillaries, using %s of memory\n",
7639 memstrbuf
, sizeof(memstrbuf
),
7640 count
* sizeof(struct bgp_path_info_extra
)));
7642 if ((count
= mtype_stats_alloc(MTYPE_BGP_STATIC
)))
7643 vty_out(vty
, "%ld Static routes, using %s of memory\n", count
,
7644 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7645 count
* sizeof(struct bgp_static
)));
7647 if ((count
= mtype_stats_alloc(MTYPE_BGP_PACKET
)))
7648 vty_out(vty
, "%ld Packets, using %s of memory\n", count
,
7649 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7650 count
* sizeof(struct bpacket
)));
7653 if ((count
= mtype_stats_alloc(MTYPE_BGP_ADJ_IN
)))
7654 vty_out(vty
, "%ld Adj-In entries, using %s of memory\n", count
,
7655 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7656 count
* sizeof(struct bgp_adj_in
)));
7657 if ((count
= mtype_stats_alloc(MTYPE_BGP_ADJ_OUT
)))
7658 vty_out(vty
, "%ld Adj-Out entries, using %s of memory\n", count
,
7659 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7660 count
* sizeof(struct bgp_adj_out
)));
7662 if ((count
= mtype_stats_alloc(MTYPE_BGP_NEXTHOP_CACHE
)))
7663 vty_out(vty
, "%ld Nexthop cache entries, using %s of memory\n",
7665 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7666 count
* sizeof(struct bgp_nexthop_cache
)));
7668 if ((count
= mtype_stats_alloc(MTYPE_BGP_DAMP_INFO
)))
7669 vty_out(vty
, "%ld Dampening entries, using %s of memory\n",
7671 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7672 count
* sizeof(struct bgp_damp_info
)));
7675 count
= attr_count();
7676 vty_out(vty
, "%ld BGP attributes, using %s of memory\n", count
,
7677 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7678 count
* sizeof(struct attr
)));
7680 if ((count
= attr_unknown_count()))
7681 vty_out(vty
, "%ld unknown attributes\n", count
);
7683 /* AS_PATH attributes */
7684 count
= aspath_count();
7685 vty_out(vty
, "%ld BGP AS-PATH entries, using %s of memory\n", count
,
7686 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7687 count
* sizeof(struct aspath
)));
7689 count
= mtype_stats_alloc(MTYPE_AS_SEG
);
7690 vty_out(vty
, "%ld BGP AS-PATH segments, using %s of memory\n", count
,
7691 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7692 count
* sizeof(struct assegment
)));
7694 /* Other attributes */
7695 if ((count
= community_count()))
7696 vty_out(vty
, "%ld BGP community entries, using %s of memory\n",
7697 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7698 count
* sizeof(struct community
)));
7699 if ((count
= mtype_stats_alloc(MTYPE_ECOMMUNITY
)))
7700 vty_out(vty
, "%ld BGP community entries, using %s of memory\n",
7701 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7702 count
* sizeof(struct ecommunity
)));
7703 if ((count
= mtype_stats_alloc(MTYPE_LCOMMUNITY
)))
7705 "%ld BGP large-community entries, using %s of memory\n",
7706 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7707 count
* sizeof(struct lcommunity
)));
7709 if ((count
= mtype_stats_alloc(MTYPE_CLUSTER
)))
7710 vty_out(vty
, "%ld Cluster lists, using %s of memory\n", count
,
7711 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7712 count
* sizeof(struct cluster_list
)));
7714 /* Peer related usage */
7715 count
= mtype_stats_alloc(MTYPE_BGP_PEER
);
7716 vty_out(vty
, "%ld peers, using %s of memory\n", count
,
7717 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7718 count
* sizeof(struct peer
)));
7720 if ((count
= mtype_stats_alloc(MTYPE_PEER_GROUP
)))
7721 vty_out(vty
, "%ld peer groups, using %s of memory\n", count
,
7722 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7723 count
* sizeof(struct peer_group
)));
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
);