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_errors.h"
26 #include "lib/zclient.h"
41 #include "bgpd/bgpd.h"
42 #include "bgpd/bgp_attr_evpn.h"
43 #include "bgpd/bgp_advertise.h"
44 #include "bgpd/bgp_attr.h"
45 #include "bgpd/bgp_aspath.h"
46 #include "bgpd/bgp_community.h"
47 #include "bgpd/bgp_ecommunity.h"
48 #include "bgpd/bgp_lcommunity.h"
49 #include "bgpd/bgp_damp.h"
50 #include "bgpd/bgp_debug.h"
51 #include "bgpd/bgp_errors.h"
52 #include "bgpd/bgp_fsm.h"
53 #include "bgpd/bgp_nexthop.h"
54 #include "bgpd/bgp_open.h"
55 #include "bgpd/bgp_regex.h"
56 #include "bgpd/bgp_route.h"
57 #include "bgpd/bgp_mplsvpn.h"
58 #include "bgpd/bgp_zebra.h"
59 #include "bgpd/bgp_table.h"
60 #include "bgpd/bgp_vty.h"
61 #include "bgpd/bgp_mpath.h"
62 #include "bgpd/bgp_packet.h"
63 #include "bgpd/bgp_updgrp.h"
64 #include "bgpd/bgp_bfd.h"
65 #include "bgpd/bgp_io.h"
66 #include "bgpd/bgp_evpn.h"
67 #include "bgpd/bgp_evpn_vty.h"
68 #include "bgpd/bgp_addpath.h"
69 #include "bgpd/bgp_mac.h"
70 #include "bgpd/bgp_flowspec.h"
72 #include "bgpd/rfapi/bgp_rfapi_cfg.h"
75 FRR_CFG_DEFAULT_BOOL(BGP_IMPORT_CHECK
,
76 { .val_long
= true, .match_profile
= "datacenter", },
77 { .val_long
= false },
79 FRR_CFG_DEFAULT_BOOL(BGP_SHOW_HOSTNAME
,
80 { .val_long
= true, .match_profile
= "datacenter", },
81 { .val_long
= false },
83 FRR_CFG_DEFAULT_BOOL(BGP_LOG_NEIGHBOR_CHANGES
,
84 { .val_long
= true, .match_profile
= "datacenter", },
85 { .val_long
= false },
87 FRR_CFG_DEFAULT_BOOL(BGP_DETERMINISTIC_MED
,
88 { .val_long
= true, .match_profile
= "datacenter", },
89 { .val_long
= false },
91 FRR_CFG_DEFAULT_ULONG(BGP_CONNECT_RETRY
,
92 { .val_ulong
= 10, .match_profile
= "datacenter", },
95 FRR_CFG_DEFAULT_ULONG(BGP_HOLDTIME
,
96 { .val_ulong
= 9, .match_profile
= "datacenter", },
99 FRR_CFG_DEFAULT_ULONG(BGP_KEEPALIVE
,
100 { .val_ulong
= 3, .match_profile
= "datacenter", },
104 DEFINE_HOOK(bgp_inst_config_write
,
105 (struct bgp
*bgp
, struct vty
*vty
),
108 static struct peer_group
*listen_range_exists(struct bgp
*bgp
,
109 struct prefix
*range
, int exact
);
111 static enum node_type
bgp_node_type(afi_t afi
, safi_t safi
)
117 return BGP_IPV4_NODE
;
120 return BGP_IPV4M_NODE
;
122 case SAFI_LABELED_UNICAST
:
123 return BGP_IPV4L_NODE
;
126 return BGP_VPNV4_NODE
;
129 return BGP_FLOWSPECV4_NODE
;
132 return BGP_IPV4_NODE
;
139 return BGP_IPV6_NODE
;
142 return BGP_IPV6M_NODE
;
144 case SAFI_LABELED_UNICAST
:
145 return BGP_IPV6L_NODE
;
148 return BGP_VPNV6_NODE
;
151 return BGP_FLOWSPECV6_NODE
;
154 return BGP_IPV4_NODE
;
159 return BGP_EVPN_NODE
;
163 // We should never be here but to clarify the switch statement..
164 return BGP_IPV4_NODE
;
168 // Impossible to happen
169 return BGP_IPV4_NODE
;
172 static const char *get_afi_safi_vty_str(afi_t afi
, safi_t safi
)
174 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
175 return "IPv4 Unicast";
176 else if (afi
== AFI_IP
&& safi
== SAFI_MULTICAST
)
177 return "IPv4 Multicast";
178 else if (afi
== AFI_IP
&& safi
== SAFI_LABELED_UNICAST
)
179 return "IPv4 Labeled Unicast";
180 else if (afi
== AFI_IP
&& safi
== SAFI_MPLS_VPN
)
182 else if (afi
== AFI_IP
&& safi
== SAFI_ENCAP
)
184 else if (afi
== AFI_IP
&& safi
== SAFI_FLOWSPEC
)
185 return "IPv4 Flowspec";
186 else if (afi
== AFI_IP6
&& safi
== SAFI_UNICAST
)
187 return "IPv6 Unicast";
188 else if (afi
== AFI_IP6
&& safi
== SAFI_MULTICAST
)
189 return "IPv6 Multicast";
190 else if (afi
== AFI_IP6
&& safi
== SAFI_LABELED_UNICAST
)
191 return "IPv6 Labeled Unicast";
192 else if (afi
== AFI_IP6
&& safi
== SAFI_MPLS_VPN
)
194 else if (afi
== AFI_IP6
&& safi
== SAFI_ENCAP
)
196 else if (afi
== AFI_IP6
&& safi
== SAFI_FLOWSPEC
)
197 return "IPv6 Flowspec";
198 else if (afi
== AFI_L2VPN
&& safi
== SAFI_EVPN
)
205 * Please note that we have intentionally camelCased
206 * the return strings here. So if you want
207 * to use this function, please ensure you
208 * are doing this within json output
210 static const char *get_afi_safi_json_str(afi_t afi
, safi_t safi
)
212 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
213 return "ipv4Unicast";
214 else if (afi
== AFI_IP
&& safi
== SAFI_MULTICAST
)
215 return "ipv4Multicast";
216 else if (afi
== AFI_IP
&& safi
== SAFI_LABELED_UNICAST
)
217 return "ipv4LabeledUnicast";
218 else if (afi
== AFI_IP
&& safi
== SAFI_MPLS_VPN
)
220 else if (afi
== AFI_IP
&& safi
== SAFI_ENCAP
)
222 else if (afi
== AFI_IP
&& safi
== SAFI_FLOWSPEC
)
223 return "ipv4Flowspec";
224 else if (afi
== AFI_IP6
&& safi
== SAFI_UNICAST
)
225 return "ipv6Unicast";
226 else if (afi
== AFI_IP6
&& safi
== SAFI_MULTICAST
)
227 return "ipv6Multicast";
228 else if (afi
== AFI_IP6
&& safi
== SAFI_LABELED_UNICAST
)
229 return "ipv6LabeledUnicast";
230 else if (afi
== AFI_IP6
&& safi
== SAFI_MPLS_VPN
)
232 else if (afi
== AFI_IP6
&& safi
== SAFI_ENCAP
)
234 else if (afi
== AFI_IP6
&& safi
== SAFI_FLOWSPEC
)
235 return "ipv6Flowspec";
236 else if (afi
== AFI_L2VPN
&& safi
== SAFI_EVPN
)
242 /* Utility function to get address family from current node. */
243 afi_t
bgp_node_afi(struct vty
*vty
)
251 case BGP_FLOWSPECV6_NODE
:
264 /* Utility function to get subsequent address family from current
266 safi_t
bgp_node_safi(struct vty
*vty
)
272 safi
= SAFI_MPLS_VPN
;
276 safi
= SAFI_MULTICAST
;
283 safi
= SAFI_LABELED_UNICAST
;
285 case BGP_FLOWSPECV4_NODE
:
286 case BGP_FLOWSPECV6_NODE
:
287 safi
= SAFI_FLOWSPEC
;
297 * Converts an AFI in string form to afi_t
299 * @param afi string, one of
303 * @return the corresponding afi_t
305 afi_t
bgp_vty_afi_from_str(const char *afi_str
)
307 afi_t afi
= AFI_MAX
; /* unknown */
308 if (strmatch(afi_str
, "ipv4"))
310 else if (strmatch(afi_str
, "ipv6"))
312 else if (strmatch(afi_str
, "l2vpn"))
317 int argv_find_and_parse_afi(struct cmd_token
**argv
, int argc
, int *index
,
321 if (argv_find(argv
, argc
, "ipv4", index
)) {
325 } else if (argv_find(argv
, argc
, "ipv6", index
)) {
329 } else if (argv_find(argv
, argc
, "l2vpn", index
)) {
337 /* supports <unicast|multicast|vpn|labeled-unicast> */
338 safi_t
bgp_vty_safi_from_str(const char *safi_str
)
340 safi_t safi
= SAFI_MAX
; /* unknown */
341 if (strmatch(safi_str
, "multicast"))
342 safi
= SAFI_MULTICAST
;
343 else if (strmatch(safi_str
, "unicast"))
345 else if (strmatch(safi_str
, "vpn"))
346 safi
= SAFI_MPLS_VPN
;
347 else if (strmatch(safi_str
, "evpn"))
349 else if (strmatch(safi_str
, "labeled-unicast"))
350 safi
= SAFI_LABELED_UNICAST
;
351 else if (strmatch(safi_str
, "flowspec"))
352 safi
= SAFI_FLOWSPEC
;
356 int argv_find_and_parse_safi(struct cmd_token
**argv
, int argc
, int *index
,
360 if (argv_find(argv
, argc
, "unicast", index
)) {
363 *safi
= SAFI_UNICAST
;
364 } else if (argv_find(argv
, argc
, "multicast", index
)) {
367 *safi
= SAFI_MULTICAST
;
368 } else if (argv_find(argv
, argc
, "labeled-unicast", index
)) {
371 *safi
= SAFI_LABELED_UNICAST
;
372 } else if (argv_find(argv
, argc
, "vpn", index
)) {
375 *safi
= SAFI_MPLS_VPN
;
376 } else if (argv_find(argv
, argc
, "evpn", index
)) {
380 } else if (argv_find(argv
, argc
, "flowspec", index
)) {
383 *safi
= SAFI_FLOWSPEC
;
388 int bgp_get_vty(struct bgp
**bgp
, as_t
*as
, const char *name
,
389 enum bgp_instance_type inst_type
)
391 int ret
= bgp_get(bgp
, as
, name
, inst_type
);
393 if (ret
== BGP_CREATED
) {
394 bgp_timers_set(*bgp
, DFLT_BGP_KEEPALIVE
, DFLT_BGP_HOLDTIME
,
395 DFLT_BGP_CONNECT_RETRY
);
397 if (DFLT_BGP_IMPORT_CHECK
)
398 bgp_flag_set(*bgp
, BGP_FLAG_IMPORT_CHECK
);
399 if (DFLT_BGP_SHOW_HOSTNAME
)
400 bgp_flag_set(*bgp
, BGP_FLAG_SHOW_HOSTNAME
);
401 if (DFLT_BGP_LOG_NEIGHBOR_CHANGES
)
402 bgp_flag_set(*bgp
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
);
403 if (DFLT_BGP_DETERMINISTIC_MED
)
404 bgp_flag_set(*bgp
, BGP_FLAG_DETERMINISTIC_MED
);
412 * bgp_vty_find_and_parse_afi_safi_bgp
414 * For a given 'show ...' command, correctly parse the afi/safi/bgp out from it
415 * This function *assumes* that the calling function pre-sets the afi/safi/bgp
416 * to appropriate values for the calling function. This is to allow the
417 * calling function to make decisions appropriate for the show command
418 * that is being parsed.
420 * The show commands are generally of the form:
421 * "show [ip] bgp [<view|vrf> VIEWVRFNAME] [<ipv4|ipv6>
422 * [<unicast|multicast|vpn|labeled-unicast>]] ..."
424 * Since we use argv_find if the show command in particular doesn't have:
426 * [<view|vrf> VIEWVRFNAME]
427 * [<ipv4|ipv6> [<unicast|multicast|vpn|labeled-unicast>]]
428 * The command parsing should still be ok.
430 * vty -> The vty for the command so we can output some useful data in
431 * the event of a parse error in the vrf.
432 * argv -> The command tokens
433 * argc -> How many command tokens we have
434 * idx -> The current place in the command, generally should be 0 for this
436 * afi -> The parsed afi if it was included in the show command, returned here
437 * safi -> The parsed safi if it was included in the show command, returned here
438 * bgp -> Pointer to the bgp data structure we need to fill in.
439 * use_json -> json is configured or not
441 * The function returns the correct location in the parse tree for the
444 * Returns 0 for failure to parse correctly, else the idx position of where
445 * it found the last token.
447 int bgp_vty_find_and_parse_afi_safi_bgp(struct vty
*vty
,
448 struct cmd_token
**argv
, int argc
,
449 int *idx
, afi_t
*afi
, safi_t
*safi
,
450 struct bgp
**bgp
, bool use_json
)
452 char *vrf_name
= NULL
;
458 if (argv_find(argv
, argc
, "ip", idx
))
461 if (argv_find(argv
, argc
, "view", idx
))
462 vrf_name
= argv
[*idx
+ 1]->arg
;
463 else if (argv_find(argv
, argc
, "vrf", idx
)) {
464 vrf_name
= argv
[*idx
+ 1]->arg
;
465 if (strmatch(vrf_name
, VRF_DEFAULT_NAME
))
469 if (strmatch(vrf_name
, "all"))
472 *bgp
= bgp_lookup_by_name(vrf_name
);
475 json_object
*json
= NULL
;
476 json
= json_object_new_object();
477 json_object_string_add(
479 "View/Vrf is unknown");
481 json_object_to_json_string_ext(json
,
482 JSON_C_TO_STRING_PRETTY
));
483 json_object_free(json
);
486 vty_out(vty
, "View/Vrf %s is unknown\n",
493 *bgp
= bgp_get_default();
496 json_object
*json
= NULL
;
497 json
= json_object_new_object();
498 json_object_string_add(
500 "Default BGP instance not found");
502 json_object_to_json_string_ext(json
,
503 JSON_C_TO_STRING_PRETTY
));
504 json_object_free(json
);
508 "Default BGP instance not found\n");
514 if (argv_find_and_parse_afi(argv
, argc
, idx
, afi
))
515 argv_find_and_parse_safi(argv
, argc
, idx
, safi
);
521 static int peer_address_self_check(struct bgp
*bgp
, union sockunion
*su
)
523 struct interface
*ifp
= NULL
;
525 if (su
->sa
.sa_family
== AF_INET
)
526 ifp
= if_lookup_by_ipv4_exact(&su
->sin
.sin_addr
, bgp
->vrf_id
);
527 else if (su
->sa
.sa_family
== AF_INET6
)
528 ifp
= if_lookup_by_ipv6_exact(&su
->sin6
.sin6_addr
,
529 su
->sin6
.sin6_scope_id
,
538 /* Utility function for looking up peer from VTY. */
539 /* This is used only for configuration, so disallow if attempted on
540 * a dynamic neighbor.
542 static struct peer
*peer_lookup_vty(struct vty
*vty
, const char *ip_str
)
544 struct bgp
*bgp
= VTY_GET_CONTEXT(bgp
);
553 ret
= str2sockunion(ip_str
, &su
);
555 peer
= peer_lookup_by_conf_if(bgp
, ip_str
);
557 if ((peer
= peer_lookup_by_hostname(bgp
, ip_str
))
560 "%% Malformed address or name: %s\n",
566 peer
= peer_lookup(bgp
, &su
);
569 "%% Specify remote-as or peer-group commands first\n");
572 if (peer_dynamic_neighbor(peer
)) {
574 "%% Operation not allowed on a dynamic neighbor\n");
581 /* Utility function for looking up peer or peer group. */
582 /* This is used only for configuration, so disallow if attempted on
583 * a dynamic neighbor.
585 struct peer
*peer_and_group_lookup_vty(struct vty
*vty
, const char *peer_str
)
587 struct bgp
*bgp
= VTY_GET_CONTEXT(bgp
);
590 struct peer
*peer
= NULL
;
591 struct peer_group
*group
= NULL
;
597 ret
= str2sockunion(peer_str
, &su
);
599 /* IP address, locate peer. */
600 peer
= peer_lookup(bgp
, &su
);
602 /* Not IP, could match either peer configured on interface or a
604 peer
= peer_lookup_by_conf_if(bgp
, peer_str
);
606 group
= peer_group_lookup(bgp
, peer_str
);
610 if (peer_dynamic_neighbor(peer
)) {
612 "%% Operation not allowed on a dynamic neighbor\n");
622 vty_out(vty
, "%% Specify remote-as or peer-group commands first\n");
627 int bgp_vty_return(struct vty
*vty
, int ret
)
629 const char *str
= NULL
;
632 case BGP_ERR_INVALID_VALUE
:
633 str
= "Invalid value";
635 case BGP_ERR_INVALID_FLAG
:
636 str
= "Invalid flag";
638 case BGP_ERR_PEER_GROUP_SHUTDOWN
:
639 str
= "Peer-group has been shutdown. Activate the peer-group first";
641 case BGP_ERR_PEER_FLAG_CONFLICT
:
642 str
= "Can't set override-capability and strict-capability-match at the same time";
644 case BGP_ERR_PEER_GROUP_NO_REMOTE_AS
:
645 str
= "Specify remote-as or peer-group remote AS first";
647 case BGP_ERR_PEER_GROUP_CANT_CHANGE
:
648 str
= "Cannot change the peer-group. Deconfigure first";
650 case BGP_ERR_PEER_GROUP_MISMATCH
:
651 str
= "Peer is not a member of this peer-group";
653 case BGP_ERR_PEER_FILTER_CONFLICT
:
654 str
= "Prefix/distribute list can not co-exist";
656 case BGP_ERR_NOT_INTERNAL_PEER
:
657 str
= "Invalid command. Not an internal neighbor";
659 case BGP_ERR_REMOVE_PRIVATE_AS
:
660 str
= "remove-private-AS cannot be configured for IBGP peers";
662 case BGP_ERR_LOCAL_AS_ALLOWED_ONLY_FOR_EBGP
:
663 str
= "Local-AS allowed only for EBGP peers";
665 case BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS
:
666 str
= "Cannot have local-as same as BGP AS number";
668 case BGP_ERR_TCPSIG_FAILED
:
669 str
= "Error while applying TCP-Sig to session(s)";
671 case BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
:
672 str
= "ebgp-multihop and ttl-security cannot be configured together";
674 case BGP_ERR_NO_IBGP_WITH_TTLHACK
:
675 str
= "ttl-security only allowed for EBGP peers";
677 case BGP_ERR_AS_OVERRIDE
:
678 str
= "as-override cannot be configured for IBGP peers";
680 case BGP_ERR_INVALID_DYNAMIC_NEIGHBORS_LIMIT
:
681 str
= "Invalid limit for number of dynamic neighbors";
683 case BGP_ERR_DYNAMIC_NEIGHBORS_RANGE_EXISTS
:
684 str
= "Dynamic neighbor listen range already exists";
686 case BGP_ERR_INVALID_FOR_DYNAMIC_PEER
:
687 str
= "Operation not allowed on a dynamic neighbor";
689 case BGP_ERR_INVALID_FOR_DIRECT_PEER
:
690 str
= "Operation not allowed on a directly connected neighbor";
692 case BGP_ERR_PEER_SAFI_CONFLICT
:
693 str
= "Cannot activate peer for both 'ipv4 unicast' and 'ipv4 labeled-unicast'";
697 vty_out(vty
, "%% %s\n", str
);
698 return CMD_WARNING_CONFIG_FAILED
;
703 /* BGP clear sort. */
712 static void bgp_clear_vty_error(struct vty
*vty
, struct peer
*peer
, afi_t afi
,
713 safi_t safi
, int error
)
716 case BGP_ERR_AF_UNCONFIGURED
:
718 "%%BGP: Enable %s address family for the neighbor %s\n",
719 get_afi_safi_str(afi
, safi
, false), peer
->host
);
721 case BGP_ERR_SOFT_RECONFIG_UNCONFIGURED
:
723 "%%BGP: Inbound soft reconfig for %s not possible as it\n has neither refresh capability, nor inbound soft reconfig\n",
731 static int bgp_peer_clear(struct peer
*peer
, afi_t afi
, safi_t safi
,
732 struct listnode
*nnode
, enum bgp_clear_type stype
)
736 /* if afi/.safi not specified, spin thru all of them */
737 if ((afi
== AFI_UNSPEC
) && (safi
== SAFI_UNSPEC
)) {
741 FOREACH_AFI_SAFI (tmp_afi
, tmp_safi
) {
742 if (!peer
->afc
[tmp_afi
][tmp_safi
])
745 if (stype
== BGP_CLEAR_SOFT_NONE
)
746 ret
= peer_clear(peer
, &nnode
);
748 ret
= peer_clear_soft(peer
, tmp_afi
, tmp_safi
,
751 /* if afi specified and safi not, spin thru safis on this afi */
752 } else if (safi
== SAFI_UNSPEC
) {
755 for (tmp_safi
= SAFI_UNICAST
;
756 tmp_safi
< SAFI_MAX
; tmp_safi
++) {
757 if (!peer
->afc
[afi
][tmp_safi
])
760 if (stype
== BGP_CLEAR_SOFT_NONE
)
761 ret
= peer_clear(peer
, &nnode
);
763 ret
= peer_clear_soft(peer
, afi
,
766 /* both afi/safi specified, let the caller know if not defined */
768 if (!peer
->afc
[afi
][safi
])
771 if (stype
== BGP_CLEAR_SOFT_NONE
)
772 ret
= peer_clear(peer
, &nnode
);
774 ret
= peer_clear_soft(peer
, afi
, safi
, stype
);
780 /* `clear ip bgp' functions. */
781 static int bgp_clear(struct vty
*vty
, struct bgp
*bgp
, afi_t afi
, safi_t safi
,
782 enum clear_sort sort
, enum bgp_clear_type stype
,
788 struct listnode
*node
, *nnode
;
790 /* Clear all neighbors. */
792 * Pass along pointer to next node to peer_clear() when walking all
793 * nodes on the BGP instance as that may get freed if it is a
796 if (sort
== clear_all
) {
797 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
798 ret
= bgp_peer_clear(peer
, afi
, safi
, nnode
,
802 bgp_clear_vty_error(vty
, peer
, afi
, safi
, ret
);
805 /* This is to apply read-only mode on this clear. */
806 if (stype
== BGP_CLEAR_SOFT_NONE
)
807 bgp
->update_delay_over
= 0;
812 /* Clear specified neighbor. */
813 if (sort
== clear_peer
) {
816 /* Make sockunion for lookup. */
817 ret
= str2sockunion(arg
, &su
);
819 peer
= peer_lookup_by_conf_if(bgp
, arg
);
821 peer
= peer_lookup_by_hostname(bgp
, arg
);
824 "Malformed address or name: %s\n",
830 peer
= peer_lookup(bgp
, &su
);
833 "%%BGP: Unknown neighbor - \"%s\"\n",
839 ret
= bgp_peer_clear(peer
, afi
, safi
, NULL
, stype
);
841 /* if afi/safi not defined for this peer, let caller know */
843 ret
= BGP_ERR_AF_UNCONFIGURED
;
846 bgp_clear_vty_error(vty
, peer
, afi
, safi
, ret
);
851 /* Clear all neighbors belonging to a specific peer-group. */
852 if (sort
== clear_group
) {
853 struct peer_group
*group
;
855 group
= peer_group_lookup(bgp
, arg
);
857 vty_out(vty
, "%%BGP: No such peer-group %s\n", arg
);
861 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
862 ret
= bgp_peer_clear(peer
, afi
, safi
, nnode
, stype
);
865 bgp_clear_vty_error(vty
, peer
, afi
, safi
, ret
);
872 "%%BGP: No %s peer belonging to peer-group %s is configured\n",
873 get_afi_safi_str(afi
, safi
, false), arg
);
878 /* Clear all external (eBGP) neighbors. */
879 if (sort
== clear_external
) {
880 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
881 if (peer
->sort
== BGP_PEER_IBGP
)
884 ret
= bgp_peer_clear(peer
, afi
, safi
, nnode
, stype
);
887 bgp_clear_vty_error(vty
, peer
, afi
, safi
, ret
);
894 "%%BGP: No external %s peer is configured\n",
895 get_afi_safi_str(afi
, safi
, false));
900 /* Clear all neighbors belonging to a specific AS. */
901 if (sort
== clear_as
) {
902 as_t as
= strtoul(arg
, NULL
, 10);
904 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
908 ret
= bgp_peer_clear(peer
, afi
, safi
, nnode
, stype
);
911 bgp_clear_vty_error(vty
, peer
, afi
, safi
, ret
);
918 "%%BGP: No %s peer is configured with AS %s\n",
919 get_afi_safi_str(afi
, safi
, false), arg
);
927 static int bgp_clear_vty(struct vty
*vty
, const char *name
, afi_t afi
,
928 safi_t safi
, enum clear_sort sort
,
929 enum bgp_clear_type stype
, const char *arg
)
933 /* BGP structure lookup. */
935 bgp
= bgp_lookup_by_name(name
);
937 vty_out(vty
, "Can't find BGP instance %s\n", name
);
941 bgp
= bgp_get_default();
943 vty_out(vty
, "No BGP process is configured\n");
948 return bgp_clear(vty
, bgp
, afi
, safi
, sort
, stype
, arg
);
951 /* clear soft inbound */
952 static void bgp_clear_star_soft_in(struct vty
*vty
, const char *name
)
957 FOREACH_AFI_SAFI (afi
, safi
)
958 bgp_clear_vty(vty
, name
, afi
, safi
, clear_all
,
959 BGP_CLEAR_SOFT_IN
, NULL
);
962 /* clear soft outbound */
963 static void bgp_clear_star_soft_out(struct vty
*vty
, const char *name
)
968 FOREACH_AFI_SAFI (afi
, safi
)
969 bgp_clear_vty(vty
, name
, afi
, safi
, clear_all
,
970 BGP_CLEAR_SOFT_OUT
, NULL
);
974 #ifndef VTYSH_EXTRACT_PL
975 #include "bgpd/bgp_vty_clippy.c"
978 DEFUN_HIDDEN (bgp_local_mac
,
980 "bgp local-mac vni " CMD_VNI_RANGE
" mac WORD seq (0-4294967295)",
983 "VxLAN Network Identifier\n"
987 "mac-mobility sequence\n"
997 vni
= strtoul(argv
[3]->arg
, NULL
, 10);
998 if (!prefix_str2mac(argv
[5]->arg
, &mac
)) {
999 vty_out(vty
, "%% Malformed MAC address\n");
1002 memset(&ip
, 0, sizeof(ip
));
1003 seq
= strtoul(argv
[7]->arg
, NULL
, 10);
1005 bgp
= bgp_get_default();
1007 vty_out(vty
, "Default BGP instance is not there\n");
1011 rv
= bgp_evpn_local_macip_add(bgp
, vni
, &mac
, &ip
, 0 /* flags */, seq
);
1013 vty_out(vty
, "Internal error\n");
1020 DEFUN_HIDDEN (no_bgp_local_mac
,
1021 no_bgp_local_mac_cmd
,
1022 "no bgp local-mac vni " CMD_VNI_RANGE
" mac WORD",
1025 "Local MAC config\n"
1026 "VxLAN Network Identifier\n"
1037 vni
= strtoul(argv
[4]->arg
, NULL
, 10);
1038 if (!prefix_str2mac(argv
[6]->arg
, &mac
)) {
1039 vty_out(vty
, "%% Malformed MAC address\n");
1042 memset(&ip
, 0, sizeof(ip
));
1044 bgp
= bgp_get_default();
1046 vty_out(vty
, "Default BGP instance is not there\n");
1050 rv
= bgp_evpn_local_macip_del(bgp
, vni
, &mac
, &ip
, ZEBRA_NEIGH_ACTIVE
);
1052 vty_out(vty
, "Internal error\n");
1059 DEFUN (no_synchronization
,
1060 no_synchronization_cmd
,
1061 "no synchronization",
1063 "Perform IGP synchronization\n")
1068 DEFUN (no_auto_summary
,
1069 no_auto_summary_cmd
,
1072 "Enable automatic network number summarization\n")
1077 /* "router bgp" commands. */
1078 DEFUN_NOSH (router_bgp
,
1080 "router bgp [(1-4294967295)$instasn [<view|vrf> VIEWVRFNAME]]",
1084 BGP_INSTANCE_HELP_STR
)
1087 int idx_view_vrf
= 3;
1093 const char *name
= NULL
;
1094 enum bgp_instance_type inst_type
;
1096 // "router bgp" without an ASN
1098 // Pending: Make VRF option available for ASN less config
1099 bgp
= bgp_get_default();
1102 vty_out(vty
, "%% No BGP process is configured\n");
1103 return CMD_WARNING_CONFIG_FAILED
;
1106 if (listcount(bm
->bgp
) > 1) {
1107 vty_out(vty
, "%% Please specify ASN and VRF\n");
1108 return CMD_WARNING_CONFIG_FAILED
;
1114 as
= strtoul(argv
[idx_asn
]->arg
, NULL
, 10);
1116 inst_type
= BGP_INSTANCE_TYPE_DEFAULT
;
1118 name
= argv
[idx_vrf
]->arg
;
1120 if (!strcmp(argv
[idx_view_vrf
]->text
, "vrf")) {
1121 if (strmatch(name
, VRF_DEFAULT_NAME
))
1124 inst_type
= BGP_INSTANCE_TYPE_VRF
;
1125 } else if (!strcmp(argv
[idx_view_vrf
]->text
, "view"))
1126 inst_type
= BGP_INSTANCE_TYPE_VIEW
;
1129 if (inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
1130 is_new_bgp
= (bgp_lookup(as
, name
) == NULL
);
1132 ret
= bgp_get_vty(&bgp
, &as
, name
, inst_type
);
1134 case BGP_ERR_AS_MISMATCH
:
1135 vty_out(vty
, "BGP is already running; AS is %u\n", as
);
1136 return CMD_WARNING_CONFIG_FAILED
;
1137 case BGP_ERR_INSTANCE_MISMATCH
:
1139 "BGP instance name and AS number mismatch\n");
1141 "BGP instance is already running; AS is %u\n",
1143 return CMD_WARNING_CONFIG_FAILED
;
1147 * If we just instantiated the default instance, complete
1148 * any pending VRF-VPN leaking that was configured via
1149 * earlier "router bgp X vrf FOO" blocks.
1151 if (is_new_bgp
&& inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
1152 vpn_leak_postchange_all();
1154 if (inst_type
== BGP_INSTANCE_TYPE_VRF
)
1155 bgp_vpn_leak_export(bgp
);
1156 /* Pending: handle when user tries to change a view to vrf n vv.
1160 /* unset the auto created flag as the user config is now present */
1161 UNSET_FLAG(bgp
->vrf_flags
, BGP_VRF_AUTO
);
1162 VTY_PUSH_CONTEXT(BGP_NODE
, bgp
);
1167 /* "no router bgp" commands. */
1168 DEFUN (no_router_bgp
,
1170 "no router bgp [(1-4294967295)$instasn [<view|vrf> VIEWVRFNAME]]",
1175 BGP_INSTANCE_HELP_STR
)
1181 const char *name
= NULL
;
1183 // "no router bgp" without an ASN
1185 // Pending: Make VRF option available for ASN less config
1186 bgp
= bgp_get_default();
1189 vty_out(vty
, "%% No BGP process is configured\n");
1190 return CMD_WARNING_CONFIG_FAILED
;
1193 if (listcount(bm
->bgp
) > 1) {
1194 vty_out(vty
, "%% Please specify ASN and VRF\n");
1195 return CMD_WARNING_CONFIG_FAILED
;
1199 vty_out(vty
, "%% Please unconfigure l3vni %u",
1201 return CMD_WARNING_CONFIG_FAILED
;
1204 as
= strtoul(argv
[idx_asn
]->arg
, NULL
, 10);
1207 name
= argv
[idx_vrf
]->arg
;
1209 /* Lookup bgp structure. */
1210 bgp
= bgp_lookup(as
, name
);
1212 vty_out(vty
, "%% Can't find BGP instance\n");
1213 return CMD_WARNING_CONFIG_FAILED
;
1217 vty_out(vty
, "%% Please unconfigure l3vni %u\n",
1219 return CMD_WARNING_CONFIG_FAILED
;
1222 /* Cannot delete default instance if vrf instances exist */
1223 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
) {
1224 struct listnode
*node
;
1225 struct bgp
*tmp_bgp
;
1227 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, node
, tmp_bgp
)) {
1228 if (tmp_bgp
->inst_type
1229 == BGP_INSTANCE_TYPE_VRF
) {
1231 "%% Cannot delete default BGP instance. Dependent VRF instances exist\n");
1232 return CMD_WARNING_CONFIG_FAILED
;
1238 if (bgp_vpn_leak_unimport(bgp
, vty
))
1239 return CMD_WARNING_CONFIG_FAILED
;
1247 /* BGP router-id. */
1249 DEFPY (bgp_router_id
,
1251 "bgp router-id A.B.C.D",
1253 "Override configured router identifier\n"
1254 "Manually configured router identifier\n")
1256 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1257 bgp_router_id_static_set(bgp
, router_id
);
1261 DEFPY (no_bgp_router_id
,
1262 no_bgp_router_id_cmd
,
1263 "no bgp router-id [A.B.C.D]",
1266 "Override configured router identifier\n"
1267 "Manually configured router identifier\n")
1269 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1271 if (router_id_str
) {
1272 if (!IPV4_ADDR_SAME(&bgp
->router_id_static
, &router_id
)) {
1273 vty_out(vty
, "%% BGP router-id doesn't match\n");
1274 return CMD_WARNING_CONFIG_FAILED
;
1278 router_id
.s_addr
= 0;
1279 bgp_router_id_static_set(bgp
, router_id
);
1285 /* BGP Cluster ID. */
1286 DEFUN (bgp_cluster_id
,
1288 "bgp cluster-id <A.B.C.D|(1-4294967295)>",
1290 "Configure Route-Reflector Cluster-id\n"
1291 "Route-Reflector Cluster-id in IP address format\n"
1292 "Route-Reflector Cluster-id as 32 bit quantity\n")
1294 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1297 struct in_addr cluster
;
1299 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &cluster
);
1301 vty_out(vty
, "%% Malformed bgp cluster identifier\n");
1302 return CMD_WARNING_CONFIG_FAILED
;
1305 bgp_cluster_id_set(bgp
, &cluster
);
1306 bgp_clear_star_soft_out(vty
, bgp
->name
);
1311 DEFUN (no_bgp_cluster_id
,
1312 no_bgp_cluster_id_cmd
,
1313 "no bgp cluster-id [<A.B.C.D|(1-4294967295)>]",
1316 "Configure Route-Reflector Cluster-id\n"
1317 "Route-Reflector Cluster-id in IP address format\n"
1318 "Route-Reflector Cluster-id as 32 bit quantity\n")
1320 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1321 bgp_cluster_id_unset(bgp
);
1322 bgp_clear_star_soft_out(vty
, bgp
->name
);
1327 DEFUN (bgp_confederation_identifier
,
1328 bgp_confederation_identifier_cmd
,
1329 "bgp confederation identifier (1-4294967295)",
1330 "BGP specific commands\n"
1331 "AS confederation parameters\n"
1333 "Set routing domain confederation AS\n")
1335 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1339 as
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1341 bgp_confederation_id_set(bgp
, as
);
1346 DEFUN (no_bgp_confederation_identifier
,
1347 no_bgp_confederation_identifier_cmd
,
1348 "no bgp confederation identifier [(1-4294967295)]",
1350 "BGP specific commands\n"
1351 "AS confederation parameters\n"
1353 "Set routing domain confederation AS\n")
1355 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1356 bgp_confederation_id_unset(bgp
);
1361 DEFUN (bgp_confederation_peers
,
1362 bgp_confederation_peers_cmd
,
1363 "bgp confederation peers (1-4294967295)...",
1364 "BGP specific commands\n"
1365 "AS confederation parameters\n"
1366 "Peer ASs in BGP confederation\n"
1369 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1374 for (i
= idx_asn
; i
< argc
; i
++) {
1375 as
= strtoul(argv
[i
]->arg
, NULL
, 10);
1377 if (bgp
->as
== as
) {
1379 "%% Local member-AS not allowed in confed peer list\n");
1383 bgp_confederation_peers_add(bgp
, as
);
1388 DEFUN (no_bgp_confederation_peers
,
1389 no_bgp_confederation_peers_cmd
,
1390 "no bgp confederation peers (1-4294967295)...",
1392 "BGP specific commands\n"
1393 "AS confederation parameters\n"
1394 "Peer ASs in BGP confederation\n"
1397 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1402 for (i
= idx_asn
; i
< argc
; i
++) {
1403 as
= strtoul(argv
[i
]->arg
, NULL
, 10);
1405 bgp_confederation_peers_remove(bgp
, as
);
1411 * Central routine for maximum-paths configuration.
1412 * @peer_type: BGP_PEER_EBGP or BGP_PEER_IBGP
1413 * @set: 1 for setting values, 0 for removing the max-paths config.
1415 static int bgp_maxpaths_config_vty(struct vty
*vty
, int peer_type
,
1416 const char *mpaths
, uint16_t options
,
1419 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1420 uint16_t maxpaths
= 0;
1425 afi
= bgp_node_afi(vty
);
1426 safi
= bgp_node_safi(vty
);
1429 maxpaths
= strtol(mpaths
, NULL
, 10);
1430 if (maxpaths
> multipath_num
) {
1432 "%% Maxpaths Specified: %d is > than multipath num specified on bgp command line %d",
1433 maxpaths
, multipath_num
);
1434 return CMD_WARNING_CONFIG_FAILED
;
1436 ret
= bgp_maximum_paths_set(bgp
, afi
, safi
, peer_type
, maxpaths
,
1439 ret
= bgp_maximum_paths_unset(bgp
, afi
, safi
, peer_type
);
1443 "%% Failed to %sset maximum-paths %s %u for afi %u, safi %u\n",
1444 (set
== 1) ? "" : "un",
1445 (peer_type
== BGP_PEER_EBGP
) ? "ebgp" : "ibgp",
1446 maxpaths
, afi
, safi
);
1447 return CMD_WARNING_CONFIG_FAILED
;
1450 bgp_recalculate_all_bestpaths(bgp
);
1455 DEFUN (bgp_maxmed_admin
,
1456 bgp_maxmed_admin_cmd
,
1457 "bgp max-med administrative ",
1459 "Advertise routes with max-med\n"
1460 "Administratively applied, for an indefinite period\n")
1462 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1464 bgp
->v_maxmed_admin
= 1;
1465 bgp
->maxmed_admin_value
= BGP_MAXMED_VALUE_DEFAULT
;
1467 bgp_maxmed_update(bgp
);
1472 DEFUN (bgp_maxmed_admin_medv
,
1473 bgp_maxmed_admin_medv_cmd
,
1474 "bgp max-med administrative (0-4294967295)",
1476 "Advertise routes with max-med\n"
1477 "Administratively applied, for an indefinite period\n"
1478 "Max MED value to be used\n")
1480 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1483 bgp
->v_maxmed_admin
= 1;
1484 bgp
->maxmed_admin_value
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1486 bgp_maxmed_update(bgp
);
1491 DEFUN (no_bgp_maxmed_admin
,
1492 no_bgp_maxmed_admin_cmd
,
1493 "no bgp max-med administrative [(0-4294967295)]",
1496 "Advertise routes with max-med\n"
1497 "Administratively applied, for an indefinite period\n"
1498 "Max MED value to be used\n")
1500 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1501 bgp
->v_maxmed_admin
= BGP_MAXMED_ADMIN_UNCONFIGURED
;
1502 bgp
->maxmed_admin_value
= BGP_MAXMED_VALUE_DEFAULT
;
1503 bgp_maxmed_update(bgp
);
1508 DEFUN (bgp_maxmed_onstartup
,
1509 bgp_maxmed_onstartup_cmd
,
1510 "bgp max-med on-startup (5-86400) [(0-4294967295)]",
1512 "Advertise routes with max-med\n"
1513 "Effective on a startup\n"
1514 "Time (seconds) period for max-med\n"
1515 "Max MED value to be used\n")
1517 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1520 argv_find(argv
, argc
, "(5-86400)", &idx
);
1521 bgp
->v_maxmed_onstartup
= strtoul(argv
[idx
]->arg
, NULL
, 10);
1522 if (argv_find(argv
, argc
, "(0-4294967295)", &idx
))
1523 bgp
->maxmed_onstartup_value
= strtoul(argv
[idx
]->arg
, NULL
, 10);
1525 bgp
->maxmed_onstartup_value
= BGP_MAXMED_VALUE_DEFAULT
;
1527 bgp_maxmed_update(bgp
);
1532 DEFUN (no_bgp_maxmed_onstartup
,
1533 no_bgp_maxmed_onstartup_cmd
,
1534 "no bgp max-med on-startup [(5-86400) [(0-4294967295)]]",
1537 "Advertise routes with max-med\n"
1538 "Effective on a startup\n"
1539 "Time (seconds) period for max-med\n"
1540 "Max MED value to be used\n")
1542 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1544 /* Cancel max-med onstartup if its on */
1545 if (bgp
->t_maxmed_onstartup
) {
1546 THREAD_TIMER_OFF(bgp
->t_maxmed_onstartup
);
1547 bgp
->maxmed_onstartup_over
= 1;
1550 bgp
->v_maxmed_onstartup
= BGP_MAXMED_ONSTARTUP_UNCONFIGURED
;
1551 bgp
->maxmed_onstartup_value
= BGP_MAXMED_VALUE_DEFAULT
;
1553 bgp_maxmed_update(bgp
);
1558 static int bgp_update_delay_config_vty(struct vty
*vty
, const char *delay
,
1561 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1562 uint16_t update_delay
;
1563 uint16_t establish_wait
;
1565 update_delay
= strtoul(delay
, NULL
, 10);
1567 if (!wait
) /* update-delay <delay> */
1569 bgp
->v_update_delay
= update_delay
;
1570 bgp
->v_establish_wait
= bgp
->v_update_delay
;
1574 /* update-delay <delay> <establish-wait> */
1575 establish_wait
= atoi(wait
);
1576 if (update_delay
< establish_wait
) {
1578 "%%Failed: update-delay less than the establish-wait!\n");
1579 return CMD_WARNING_CONFIG_FAILED
;
1582 bgp
->v_update_delay
= update_delay
;
1583 bgp
->v_establish_wait
= establish_wait
;
1588 static int bgp_update_delay_deconfig_vty(struct vty
*vty
)
1590 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1592 bgp
->v_update_delay
= BGP_UPDATE_DELAY_DEF
;
1593 bgp
->v_establish_wait
= bgp
->v_update_delay
;
1598 void bgp_config_write_update_delay(struct vty
*vty
, struct bgp
*bgp
)
1600 if (bgp
->v_update_delay
!= BGP_UPDATE_DELAY_DEF
) {
1601 vty_out(vty
, " update-delay %d", bgp
->v_update_delay
);
1602 if (bgp
->v_update_delay
!= bgp
->v_establish_wait
)
1603 vty_out(vty
, " %d", bgp
->v_establish_wait
);
1609 /* Update-delay configuration */
1610 DEFUN (bgp_update_delay
,
1611 bgp_update_delay_cmd
,
1612 "update-delay (0-3600)",
1613 "Force initial delay for best-path and updates\n"
1617 return bgp_update_delay_config_vty(vty
, argv
[idx_number
]->arg
, NULL
);
1620 DEFUN (bgp_update_delay_establish_wait
,
1621 bgp_update_delay_establish_wait_cmd
,
1622 "update-delay (0-3600) (1-3600)",
1623 "Force initial delay for best-path and updates\n"
1628 int idx_number_2
= 2;
1629 return bgp_update_delay_config_vty(vty
, argv
[idx_number
]->arg
,
1630 argv
[idx_number_2
]->arg
);
1633 /* Update-delay deconfiguration */
1634 DEFUN (no_bgp_update_delay
,
1635 no_bgp_update_delay_cmd
,
1636 "no update-delay [(0-3600) [(1-3600)]]",
1638 "Force initial delay for best-path and updates\n"
1642 return bgp_update_delay_deconfig_vty(vty
);
1646 static int bgp_wpkt_quanta_config_vty(struct vty
*vty
, uint32_t quanta
,
1649 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1651 quanta
= set
? quanta
: BGP_WRITE_PACKET_MAX
;
1652 atomic_store_explicit(&bgp
->wpkt_quanta
, quanta
, memory_order_relaxed
);
1657 static int bgp_rpkt_quanta_config_vty(struct vty
*vty
, uint32_t quanta
,
1660 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1662 quanta
= set
? quanta
: BGP_READ_PACKET_MAX
;
1663 atomic_store_explicit(&bgp
->rpkt_quanta
, quanta
, memory_order_relaxed
);
1668 void bgp_config_write_wpkt_quanta(struct vty
*vty
, struct bgp
*bgp
)
1671 atomic_load_explicit(&bgp
->wpkt_quanta
, memory_order_relaxed
);
1672 if (quanta
!= BGP_WRITE_PACKET_MAX
)
1673 vty_out(vty
, " write-quanta %d\n", quanta
);
1676 void bgp_config_write_rpkt_quanta(struct vty
*vty
, struct bgp
*bgp
)
1679 atomic_load_explicit(&bgp
->rpkt_quanta
, memory_order_relaxed
);
1680 if (quanta
!= BGP_READ_PACKET_MAX
)
1681 vty_out(vty
, " read-quanta %d\n", quanta
);
1684 /* Packet quanta configuration
1686 * XXX: The value set here controls the size of a stack buffer in the IO
1687 * thread. When changing these limits be careful to prevent stack overflow.
1689 * Furthermore, the maximums used here should correspond to
1690 * BGP_WRITE_PACKET_MAX and BGP_READ_PACKET_MAX.
1692 DEFPY (bgp_wpkt_quanta
,
1693 bgp_wpkt_quanta_cmd
,
1694 "[no] write-quanta (1-64)$quanta",
1696 "How many packets to write to peer socket per run\n"
1697 "Number of packets\n")
1699 return bgp_wpkt_quanta_config_vty(vty
, quanta
, !no
);
1702 DEFPY (bgp_rpkt_quanta
,
1703 bgp_rpkt_quanta_cmd
,
1704 "[no] read-quanta (1-10)$quanta",
1706 "How many packets to read from peer socket per I/O cycle\n"
1707 "Number of packets\n")
1709 return bgp_rpkt_quanta_config_vty(vty
, quanta
, !no
);
1712 void bgp_config_write_coalesce_time(struct vty
*vty
, struct bgp
*bgp
)
1714 if (!bgp
->heuristic_coalesce
)
1715 vty_out(vty
, " coalesce-time %u\n", bgp
->coalesce_time
);
1719 DEFUN (bgp_coalesce_time
,
1720 bgp_coalesce_time_cmd
,
1721 "coalesce-time (0-4294967295)",
1722 "Subgroup coalesce timer\n"
1723 "Subgroup coalesce timer value (in ms)\n")
1725 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1728 argv_find(argv
, argc
, "(0-4294967295)", &idx
);
1729 bgp
->heuristic_coalesce
= false;
1730 bgp
->coalesce_time
= strtoul(argv
[idx
]->arg
, NULL
, 10);
1734 DEFUN (no_bgp_coalesce_time
,
1735 no_bgp_coalesce_time_cmd
,
1736 "no coalesce-time (0-4294967295)",
1738 "Subgroup coalesce timer\n"
1739 "Subgroup coalesce timer value (in ms)\n")
1741 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1743 bgp
->heuristic_coalesce
= true;
1744 bgp
->coalesce_time
= BGP_DEFAULT_SUBGROUP_COALESCE_TIME
;
1748 /* Maximum-paths configuration */
1749 DEFUN (bgp_maxpaths
,
1751 "maximum-paths " CMD_RANGE_STR(1, MULTIPATH_NUM
),
1752 "Forward packets over multiple paths\n"
1753 "Number of paths\n")
1756 return bgp_maxpaths_config_vty(vty
, BGP_PEER_EBGP
,
1757 argv
[idx_number
]->arg
, 0, 1);
1760 ALIAS_HIDDEN(bgp_maxpaths
, bgp_maxpaths_hidden_cmd
,
1761 "maximum-paths " CMD_RANGE_STR(1, MULTIPATH_NUM
),
1762 "Forward packets over multiple paths\n"
1763 "Number of paths\n")
1765 DEFUN (bgp_maxpaths_ibgp
,
1766 bgp_maxpaths_ibgp_cmd
,
1767 "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM
),
1768 "Forward packets over multiple paths\n"
1770 "Number of paths\n")
1773 return bgp_maxpaths_config_vty(vty
, BGP_PEER_IBGP
,
1774 argv
[idx_number
]->arg
, 0, 1);
1777 ALIAS_HIDDEN(bgp_maxpaths_ibgp
, bgp_maxpaths_ibgp_hidden_cmd
,
1778 "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM
),
1779 "Forward packets over multiple paths\n"
1781 "Number of paths\n")
1783 DEFUN (bgp_maxpaths_ibgp_cluster
,
1784 bgp_maxpaths_ibgp_cluster_cmd
,
1785 "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM
) " equal-cluster-length",
1786 "Forward packets over multiple paths\n"
1789 "Match the cluster length\n")
1792 return bgp_maxpaths_config_vty(
1793 vty
, BGP_PEER_IBGP
, argv
[idx_number
]->arg
,
1794 BGP_FLAG_IBGP_MULTIPATH_SAME_CLUSTERLEN
, 1);
1797 ALIAS_HIDDEN(bgp_maxpaths_ibgp_cluster
, bgp_maxpaths_ibgp_cluster_hidden_cmd
,
1798 "maximum-paths ibgp " CMD_RANGE_STR(
1799 1, MULTIPATH_NUM
) " equal-cluster-length",
1800 "Forward packets over multiple paths\n"
1803 "Match the cluster length\n")
1805 DEFUN (no_bgp_maxpaths
,
1806 no_bgp_maxpaths_cmd
,
1807 "no maximum-paths [" CMD_RANGE_STR(1, MULTIPATH_NUM
) "]",
1809 "Forward packets over multiple paths\n"
1810 "Number of paths\n")
1812 return bgp_maxpaths_config_vty(vty
, BGP_PEER_EBGP
, NULL
, 0, 0);
1815 ALIAS_HIDDEN(no_bgp_maxpaths
, no_bgp_maxpaths_hidden_cmd
,
1816 "no maximum-paths [" CMD_RANGE_STR(1, MULTIPATH_NUM
) "]", NO_STR
1817 "Forward packets over multiple paths\n"
1818 "Number of paths\n")
1820 DEFUN (no_bgp_maxpaths_ibgp
,
1821 no_bgp_maxpaths_ibgp_cmd
,
1822 "no maximum-paths ibgp [" CMD_RANGE_STR(1, MULTIPATH_NUM
) " [equal-cluster-length]]",
1824 "Forward packets over multiple paths\n"
1827 "Match the cluster length\n")
1829 return bgp_maxpaths_config_vty(vty
, BGP_PEER_IBGP
, NULL
, 0, 0);
1832 ALIAS_HIDDEN(no_bgp_maxpaths_ibgp
, no_bgp_maxpaths_ibgp_hidden_cmd
,
1833 "no maximum-paths ibgp [" CMD_RANGE_STR(
1834 1, MULTIPATH_NUM
) " [equal-cluster-length]]",
1836 "Forward packets over multiple paths\n"
1839 "Match the cluster length\n")
1841 static void bgp_config_write_maxpaths(struct vty
*vty
, struct bgp
*bgp
,
1842 afi_t afi
, safi_t safi
)
1844 if (bgp
->maxpaths
[afi
][safi
].maxpaths_ebgp
!= MULTIPATH_NUM
) {
1845 vty_out(vty
, " maximum-paths %d\n",
1846 bgp
->maxpaths
[afi
][safi
].maxpaths_ebgp
);
1849 if (bgp
->maxpaths
[afi
][safi
].maxpaths_ibgp
!= MULTIPATH_NUM
) {
1850 vty_out(vty
, " maximum-paths ibgp %d",
1851 bgp
->maxpaths
[afi
][safi
].maxpaths_ibgp
);
1852 if (CHECK_FLAG(bgp
->maxpaths
[afi
][safi
].ibgp_flags
,
1853 BGP_FLAG_IBGP_MULTIPATH_SAME_CLUSTERLEN
))
1854 vty_out(vty
, " equal-cluster-length");
1863 "timers bgp (0-65535) (0-65535)",
1864 "Adjust routing timers\n"
1866 "Keepalive interval\n"
1869 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1871 int idx_number_2
= 3;
1872 unsigned long keepalive
= 0;
1873 unsigned long holdtime
= 0;
1875 keepalive
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1876 holdtime
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
1878 /* Holdtime value check. */
1879 if (holdtime
< 3 && holdtime
!= 0) {
1881 "%% hold time value must be either 0 or greater than 3\n");
1882 return CMD_WARNING_CONFIG_FAILED
;
1885 bgp_timers_set(bgp
, keepalive
, holdtime
, DFLT_BGP_CONNECT_RETRY
);
1890 DEFUN (no_bgp_timers
,
1892 "no timers bgp [(0-65535) (0-65535)]",
1894 "Adjust routing timers\n"
1896 "Keepalive interval\n"
1899 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1900 bgp_timers_set(bgp
, DFLT_BGP_KEEPALIVE
, DFLT_BGP_HOLDTIME
,
1901 DFLT_BGP_CONNECT_RETRY
);
1907 DEFUN (bgp_client_to_client_reflection
,
1908 bgp_client_to_client_reflection_cmd
,
1909 "bgp client-to-client reflection",
1910 "BGP specific commands\n"
1911 "Configure client to client route reflection\n"
1912 "reflection of routes allowed\n")
1914 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1915 bgp_flag_unset(bgp
, BGP_FLAG_NO_CLIENT_TO_CLIENT
);
1916 bgp_clear_star_soft_out(vty
, bgp
->name
);
1921 DEFUN (no_bgp_client_to_client_reflection
,
1922 no_bgp_client_to_client_reflection_cmd
,
1923 "no bgp client-to-client reflection",
1925 "BGP specific commands\n"
1926 "Configure client to client route reflection\n"
1927 "reflection of routes allowed\n")
1929 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1930 bgp_flag_set(bgp
, BGP_FLAG_NO_CLIENT_TO_CLIENT
);
1931 bgp_clear_star_soft_out(vty
, bgp
->name
);
1936 /* "bgp always-compare-med" configuration. */
1937 DEFUN (bgp_always_compare_med
,
1938 bgp_always_compare_med_cmd
,
1939 "bgp always-compare-med",
1940 "BGP specific commands\n"
1941 "Allow comparing MED from different neighbors\n")
1943 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1944 bgp_flag_set(bgp
, BGP_FLAG_ALWAYS_COMPARE_MED
);
1945 bgp_recalculate_all_bestpaths(bgp
);
1950 DEFUN (no_bgp_always_compare_med
,
1951 no_bgp_always_compare_med_cmd
,
1952 "no bgp always-compare-med",
1954 "BGP specific commands\n"
1955 "Allow comparing MED from different neighbors\n")
1957 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1958 bgp_flag_unset(bgp
, BGP_FLAG_ALWAYS_COMPARE_MED
);
1959 bgp_recalculate_all_bestpaths(bgp
);
1965 DEFUN(bgp_ebgp_requires_policy
, bgp_ebgp_requires_policy_cmd
,
1966 "bgp ebgp-requires-policy",
1967 "BGP specific commands\n"
1968 "Require in and out policy for eBGP peers (RFC8212)\n")
1970 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1971 bgp
->ebgp_requires_policy
= DEFAULT_EBGP_POLICY_ENABLED
;
1975 DEFUN(no_bgp_ebgp_requires_policy
, no_bgp_ebgp_requires_policy_cmd
,
1976 "no bgp ebgp-requires-policy",
1978 "BGP specific commands\n"
1979 "Require in and out policy for eBGP peers (RFC8212)\n")
1981 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1982 bgp
->ebgp_requires_policy
= DEFAULT_EBGP_POLICY_DISABLED
;
1986 DEFUN(bgp_reject_as_sets
, bgp_reject_as_sets_cmd
,
1987 "bgp reject-as-sets",
1988 "BGP specific commands\n"
1989 "Reject routes with AS_SET or AS_CONFED_SET flag\n")
1991 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1992 struct listnode
*node
, *nnode
;
1995 bgp
->reject_as_sets
= BGP_REJECT_AS_SETS_ENABLED
;
1997 /* Reset existing BGP sessions to reject routes
1998 * with aspath containing AS_SET or AS_CONFED_SET.
2000 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
2001 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
2002 peer
->last_reset
= PEER_DOWN_AS_SETS_REJECT
;
2003 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
2004 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2011 DEFUN(no_bgp_reject_as_sets
, no_bgp_reject_as_sets_cmd
,
2012 "no bgp reject-as-sets",
2014 "BGP specific commands\n"
2015 "Reject routes with AS_SET or AS_CONFED_SET flag\n")
2017 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2018 struct listnode
*node
, *nnode
;
2021 bgp
->reject_as_sets
= BGP_REJECT_AS_SETS_DISABLED
;
2023 /* Reset existing BGP sessions to reject routes
2024 * with aspath containing AS_SET or AS_CONFED_SET.
2026 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
2027 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
2028 peer
->last_reset
= PEER_DOWN_AS_SETS_REJECT
;
2029 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
2030 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2037 /* "bgp deterministic-med" configuration. */
2038 DEFUN (bgp_deterministic_med
,
2039 bgp_deterministic_med_cmd
,
2040 "bgp deterministic-med",
2041 "BGP specific commands\n"
2042 "Pick the best-MED path among paths advertised from the neighboring AS\n")
2044 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2046 if (!bgp_flag_check(bgp
, BGP_FLAG_DETERMINISTIC_MED
)) {
2047 bgp_flag_set(bgp
, BGP_FLAG_DETERMINISTIC_MED
);
2048 bgp_recalculate_all_bestpaths(bgp
);
2054 DEFUN (no_bgp_deterministic_med
,
2055 no_bgp_deterministic_med_cmd
,
2056 "no bgp deterministic-med",
2058 "BGP specific commands\n"
2059 "Pick the best-MED path among paths advertised from the neighboring AS\n")
2061 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2062 int bestpath_per_as_used
;
2066 struct listnode
*node
, *nnode
;
2068 if (bgp_flag_check(bgp
, BGP_FLAG_DETERMINISTIC_MED
)) {
2069 bestpath_per_as_used
= 0;
2071 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
2072 FOREACH_AFI_SAFI (afi
, safi
)
2073 if (bgp_addpath_dmed_required(
2074 peer
->addpath_type
[afi
][safi
])) {
2075 bestpath_per_as_used
= 1;
2079 if (bestpath_per_as_used
)
2083 if (bestpath_per_as_used
) {
2085 "bgp deterministic-med cannot be disabled while addpath-tx-bestpath-per-AS is in use\n");
2086 return CMD_WARNING_CONFIG_FAILED
;
2088 bgp_flag_unset(bgp
, BGP_FLAG_DETERMINISTIC_MED
);
2089 bgp_recalculate_all_bestpaths(bgp
);
2096 /* "bgp graceful-restart" configuration. */
2097 DEFUN (bgp_graceful_restart
,
2098 bgp_graceful_restart_cmd
,
2099 "bgp graceful-restart",
2100 "BGP specific commands\n"
2101 "Graceful restart capability parameters\n")
2103 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2104 bgp_flag_set(bgp
, BGP_FLAG_GRACEFUL_RESTART
);
2108 DEFUN (no_bgp_graceful_restart
,
2109 no_bgp_graceful_restart_cmd
,
2110 "no bgp graceful-restart",
2112 "BGP specific commands\n"
2113 "Graceful restart capability parameters\n")
2115 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2116 bgp_flag_unset(bgp
, BGP_FLAG_GRACEFUL_RESTART
);
2120 DEFUN (bgp_graceful_restart_stalepath_time
,
2121 bgp_graceful_restart_stalepath_time_cmd
,
2122 "bgp graceful-restart stalepath-time (1-4095)",
2123 "BGP specific commands\n"
2124 "Graceful restart capability parameters\n"
2125 "Set the max time to hold onto restarting peer's stale paths\n"
2126 "Delay value (seconds)\n")
2128 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2132 stalepath
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2133 bgp
->stalepath_time
= stalepath
;
2137 DEFUN (bgp_graceful_restart_restart_time
,
2138 bgp_graceful_restart_restart_time_cmd
,
2139 "bgp graceful-restart restart-time (1-4095)",
2140 "BGP specific commands\n"
2141 "Graceful restart capability parameters\n"
2142 "Set the time to wait to delete stale routes before a BGP open message is received\n"
2143 "Delay value (seconds)\n")
2145 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2149 restart
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2150 bgp
->restart_time
= restart
;
2154 DEFUN (no_bgp_graceful_restart_stalepath_time
,
2155 no_bgp_graceful_restart_stalepath_time_cmd
,
2156 "no bgp graceful-restart stalepath-time [(1-4095)]",
2158 "BGP specific commands\n"
2159 "Graceful restart capability parameters\n"
2160 "Set the max time to hold onto restarting peer's stale paths\n"
2161 "Delay value (seconds)\n")
2163 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2165 bgp
->stalepath_time
= BGP_DEFAULT_STALEPATH_TIME
;
2169 DEFUN (no_bgp_graceful_restart_restart_time
,
2170 no_bgp_graceful_restart_restart_time_cmd
,
2171 "no bgp graceful-restart restart-time [(1-4095)]",
2173 "BGP specific commands\n"
2174 "Graceful restart capability parameters\n"
2175 "Set the time to wait to delete stale routes before a BGP open message is received\n"
2176 "Delay value (seconds)\n")
2178 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2180 bgp
->restart_time
= BGP_DEFAULT_RESTART_TIME
;
2184 DEFUN (bgp_graceful_restart_preserve_fw
,
2185 bgp_graceful_restart_preserve_fw_cmd
,
2186 "bgp graceful-restart preserve-fw-state",
2187 "BGP specific commands\n"
2188 "Graceful restart capability parameters\n"
2189 "Sets F-bit indication that fib is preserved while doing Graceful Restart\n")
2191 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2192 bgp_flag_set(bgp
, BGP_FLAG_GR_PRESERVE_FWD
);
2196 DEFUN (no_bgp_graceful_restart_preserve_fw
,
2197 no_bgp_graceful_restart_preserve_fw_cmd
,
2198 "no bgp graceful-restart preserve-fw-state",
2200 "BGP specific commands\n"
2201 "Graceful restart capability parameters\n"
2202 "Unsets F-bit indication that fib is preserved while doing Graceful Restart\n")
2204 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2205 bgp_flag_unset(bgp
, BGP_FLAG_GR_PRESERVE_FWD
);
2209 /* "bgp graceful-shutdown" configuration */
2210 DEFUN (bgp_graceful_shutdown
,
2211 bgp_graceful_shutdown_cmd
,
2212 "bgp graceful-shutdown",
2214 "Graceful shutdown parameters\n")
2216 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2218 if (!bgp_flag_check(bgp
, BGP_FLAG_GRACEFUL_SHUTDOWN
)) {
2219 bgp_flag_set(bgp
, BGP_FLAG_GRACEFUL_SHUTDOWN
);
2220 bgp_static_redo_import_check(bgp
);
2221 bgp_redistribute_redo(bgp
);
2222 bgp_clear_star_soft_out(vty
, bgp
->name
);
2223 bgp_clear_star_soft_in(vty
, bgp
->name
);
2229 DEFUN (no_bgp_graceful_shutdown
,
2230 no_bgp_graceful_shutdown_cmd
,
2231 "no bgp graceful-shutdown",
2234 "Graceful shutdown parameters\n")
2236 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2238 if (bgp_flag_check(bgp
, BGP_FLAG_GRACEFUL_SHUTDOWN
)) {
2239 bgp_flag_unset(bgp
, BGP_FLAG_GRACEFUL_SHUTDOWN
);
2240 bgp_static_redo_import_check(bgp
);
2241 bgp_redistribute_redo(bgp
);
2242 bgp_clear_star_soft_out(vty
, bgp
->name
);
2243 bgp_clear_star_soft_in(vty
, bgp
->name
);
2249 /* "bgp fast-external-failover" configuration. */
2250 DEFUN (bgp_fast_external_failover
,
2251 bgp_fast_external_failover_cmd
,
2252 "bgp fast-external-failover",
2254 "Immediately reset session if a link to a directly connected external peer goes down\n")
2256 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2257 bgp_flag_unset(bgp
, BGP_FLAG_NO_FAST_EXT_FAILOVER
);
2261 DEFUN (no_bgp_fast_external_failover
,
2262 no_bgp_fast_external_failover_cmd
,
2263 "no bgp fast-external-failover",
2266 "Immediately reset session if a link to a directly connected external peer goes down\n")
2268 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2269 bgp_flag_set(bgp
, BGP_FLAG_NO_FAST_EXT_FAILOVER
);
2273 /* "bgp bestpath compare-routerid" configuration. */
2274 DEFUN (bgp_bestpath_compare_router_id
,
2275 bgp_bestpath_compare_router_id_cmd
,
2276 "bgp bestpath compare-routerid",
2277 "BGP specific commands\n"
2278 "Change the default bestpath selection\n"
2279 "Compare router-id for identical EBGP paths\n")
2281 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2282 bgp_flag_set(bgp
, BGP_FLAG_COMPARE_ROUTER_ID
);
2283 bgp_recalculate_all_bestpaths(bgp
);
2288 DEFUN (no_bgp_bestpath_compare_router_id
,
2289 no_bgp_bestpath_compare_router_id_cmd
,
2290 "no bgp bestpath compare-routerid",
2292 "BGP specific commands\n"
2293 "Change the default bestpath selection\n"
2294 "Compare router-id for identical EBGP paths\n")
2296 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2297 bgp_flag_unset(bgp
, BGP_FLAG_COMPARE_ROUTER_ID
);
2298 bgp_recalculate_all_bestpaths(bgp
);
2303 /* "bgp bestpath as-path ignore" configuration. */
2304 DEFUN (bgp_bestpath_aspath_ignore
,
2305 bgp_bestpath_aspath_ignore_cmd
,
2306 "bgp bestpath as-path ignore",
2307 "BGP specific commands\n"
2308 "Change the default bestpath selection\n"
2309 "AS-path attribute\n"
2310 "Ignore as-path length in selecting a route\n")
2312 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2313 bgp_flag_set(bgp
, BGP_FLAG_ASPATH_IGNORE
);
2314 bgp_recalculate_all_bestpaths(bgp
);
2319 DEFUN (no_bgp_bestpath_aspath_ignore
,
2320 no_bgp_bestpath_aspath_ignore_cmd
,
2321 "no bgp bestpath as-path ignore",
2323 "BGP specific commands\n"
2324 "Change the default bestpath selection\n"
2325 "AS-path attribute\n"
2326 "Ignore as-path length in selecting a route\n")
2328 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2329 bgp_flag_unset(bgp
, BGP_FLAG_ASPATH_IGNORE
);
2330 bgp_recalculate_all_bestpaths(bgp
);
2335 /* "bgp bestpath as-path confed" configuration. */
2336 DEFUN (bgp_bestpath_aspath_confed
,
2337 bgp_bestpath_aspath_confed_cmd
,
2338 "bgp bestpath as-path confed",
2339 "BGP specific commands\n"
2340 "Change the default bestpath selection\n"
2341 "AS-path attribute\n"
2342 "Compare path lengths including confederation sets & sequences in selecting a route\n")
2344 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2345 bgp_flag_set(bgp
, BGP_FLAG_ASPATH_CONFED
);
2346 bgp_recalculate_all_bestpaths(bgp
);
2351 DEFUN (no_bgp_bestpath_aspath_confed
,
2352 no_bgp_bestpath_aspath_confed_cmd
,
2353 "no bgp bestpath as-path confed",
2355 "BGP specific commands\n"
2356 "Change the default bestpath selection\n"
2357 "AS-path attribute\n"
2358 "Compare path lengths including confederation sets & sequences in selecting a route\n")
2360 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2361 bgp_flag_unset(bgp
, BGP_FLAG_ASPATH_CONFED
);
2362 bgp_recalculate_all_bestpaths(bgp
);
2367 /* "bgp bestpath as-path multipath-relax" configuration. */
2368 DEFUN (bgp_bestpath_aspath_multipath_relax
,
2369 bgp_bestpath_aspath_multipath_relax_cmd
,
2370 "bgp bestpath as-path multipath-relax [<as-set|no-as-set>]",
2371 "BGP specific commands\n"
2372 "Change the default bestpath selection\n"
2373 "AS-path attribute\n"
2374 "Allow load sharing across routes that have different AS paths (but same length)\n"
2375 "Generate an AS_SET\n"
2376 "Do not generate an AS_SET\n")
2378 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2380 bgp_flag_set(bgp
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
);
2382 /* no-as-set is now the default behavior so we can silently
2384 if (argv_find(argv
, argc
, "as-set", &idx
))
2385 bgp_flag_set(bgp
, BGP_FLAG_MULTIPATH_RELAX_AS_SET
);
2387 bgp_flag_unset(bgp
, BGP_FLAG_MULTIPATH_RELAX_AS_SET
);
2389 bgp_recalculate_all_bestpaths(bgp
);
2394 DEFUN (no_bgp_bestpath_aspath_multipath_relax
,
2395 no_bgp_bestpath_aspath_multipath_relax_cmd
,
2396 "no bgp bestpath as-path multipath-relax [<as-set|no-as-set>]",
2398 "BGP specific commands\n"
2399 "Change the default bestpath selection\n"
2400 "AS-path attribute\n"
2401 "Allow load sharing across routes that have different AS paths (but same length)\n"
2402 "Generate an AS_SET\n"
2403 "Do not generate an AS_SET\n")
2405 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2406 bgp_flag_unset(bgp
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
);
2407 bgp_flag_unset(bgp
, BGP_FLAG_MULTIPATH_RELAX_AS_SET
);
2408 bgp_recalculate_all_bestpaths(bgp
);
2413 /* "bgp log-neighbor-changes" configuration. */
2414 DEFUN (bgp_log_neighbor_changes
,
2415 bgp_log_neighbor_changes_cmd
,
2416 "bgp log-neighbor-changes",
2417 "BGP specific commands\n"
2418 "Log neighbor up/down and reset reason\n")
2420 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2421 bgp_flag_set(bgp
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
);
2425 DEFUN (no_bgp_log_neighbor_changes
,
2426 no_bgp_log_neighbor_changes_cmd
,
2427 "no bgp log-neighbor-changes",
2429 "BGP specific commands\n"
2430 "Log neighbor up/down and reset reason\n")
2432 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2433 bgp_flag_unset(bgp
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
);
2437 /* "bgp bestpath med" configuration. */
2438 DEFUN (bgp_bestpath_med
,
2439 bgp_bestpath_med_cmd
,
2440 "bgp bestpath med <confed [missing-as-worst]|missing-as-worst [confed]>",
2441 "BGP specific commands\n"
2442 "Change the default bestpath selection\n"
2444 "Compare MED among confederation paths\n"
2445 "Treat missing MED as the least preferred one\n"
2446 "Treat missing MED as the least preferred one\n"
2447 "Compare MED among confederation paths\n")
2449 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2452 if (argv_find(argv
, argc
, "confed", &idx
))
2453 bgp_flag_set(bgp
, BGP_FLAG_MED_CONFED
);
2455 if (argv_find(argv
, argc
, "missing-as-worst", &idx
))
2456 bgp_flag_set(bgp
, BGP_FLAG_MED_MISSING_AS_WORST
);
2458 bgp_recalculate_all_bestpaths(bgp
);
2463 DEFUN (no_bgp_bestpath_med
,
2464 no_bgp_bestpath_med_cmd
,
2465 "no bgp bestpath med <confed [missing-as-worst]|missing-as-worst [confed]>",
2467 "BGP specific commands\n"
2468 "Change the default bestpath selection\n"
2470 "Compare MED among confederation paths\n"
2471 "Treat missing MED as the least preferred one\n"
2472 "Treat missing MED as the least preferred one\n"
2473 "Compare MED among confederation paths\n")
2475 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2478 if (argv_find(argv
, argc
, "confed", &idx
))
2479 bgp_flag_unset(bgp
, BGP_FLAG_MED_CONFED
);
2481 if (argv_find(argv
, argc
, "missing-as-worst", &idx
))
2482 bgp_flag_unset(bgp
, BGP_FLAG_MED_MISSING_AS_WORST
);
2484 bgp_recalculate_all_bestpaths(bgp
);
2489 /* "no bgp default ipv4-unicast". */
2490 DEFUN (no_bgp_default_ipv4_unicast
,
2491 no_bgp_default_ipv4_unicast_cmd
,
2492 "no bgp default ipv4-unicast",
2494 "BGP specific commands\n"
2495 "Configure BGP defaults\n"
2496 "Activate ipv4-unicast for a peer by default\n")
2498 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2499 bgp_flag_set(bgp
, BGP_FLAG_NO_DEFAULT_IPV4
);
2503 DEFUN (bgp_default_ipv4_unicast
,
2504 bgp_default_ipv4_unicast_cmd
,
2505 "bgp default ipv4-unicast",
2506 "BGP specific commands\n"
2507 "Configure BGP defaults\n"
2508 "Activate ipv4-unicast for a peer by default\n")
2510 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2511 bgp_flag_unset(bgp
, BGP_FLAG_NO_DEFAULT_IPV4
);
2515 /* Display hostname in certain command outputs */
2516 DEFUN (bgp_default_show_hostname
,
2517 bgp_default_show_hostname_cmd
,
2518 "bgp default show-hostname",
2519 "BGP specific commands\n"
2520 "Configure BGP defaults\n"
2521 "Show hostname in certain command outputs\n")
2523 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2524 bgp_flag_set(bgp
, BGP_FLAG_SHOW_HOSTNAME
);
2528 DEFUN (no_bgp_default_show_hostname
,
2529 no_bgp_default_show_hostname_cmd
,
2530 "no bgp default show-hostname",
2532 "BGP specific commands\n"
2533 "Configure BGP defaults\n"
2534 "Show hostname in certain command outputs\n")
2536 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2537 bgp_flag_unset(bgp
, BGP_FLAG_SHOW_HOSTNAME
);
2541 /* "bgp network import-check" configuration. */
2542 DEFUN (bgp_network_import_check
,
2543 bgp_network_import_check_cmd
,
2544 "bgp network import-check",
2545 "BGP specific commands\n"
2546 "BGP network command\n"
2547 "Check BGP network route exists in IGP\n")
2549 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2550 if (!bgp_flag_check(bgp
, BGP_FLAG_IMPORT_CHECK
)) {
2551 bgp_flag_set(bgp
, BGP_FLAG_IMPORT_CHECK
);
2552 bgp_static_redo_import_check(bgp
);
2558 ALIAS_HIDDEN(bgp_network_import_check
, bgp_network_import_check_exact_cmd
,
2559 "bgp network import-check exact",
2560 "BGP specific commands\n"
2561 "BGP network command\n"
2562 "Check BGP network route exists in IGP\n"
2563 "Match route precisely\n")
2565 DEFUN (no_bgp_network_import_check
,
2566 no_bgp_network_import_check_cmd
,
2567 "no bgp network import-check",
2569 "BGP specific commands\n"
2570 "BGP network command\n"
2571 "Check BGP network route exists in IGP\n")
2573 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2574 if (bgp_flag_check(bgp
, BGP_FLAG_IMPORT_CHECK
)) {
2575 bgp_flag_unset(bgp
, BGP_FLAG_IMPORT_CHECK
);
2576 bgp_static_redo_import_check(bgp
);
2582 DEFUN (bgp_default_local_preference
,
2583 bgp_default_local_preference_cmd
,
2584 "bgp default local-preference (0-4294967295)",
2585 "BGP specific commands\n"
2586 "Configure BGP defaults\n"
2587 "local preference (higher=more preferred)\n"
2588 "Configure default local preference value\n")
2590 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2592 uint32_t local_pref
;
2594 local_pref
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2596 bgp_default_local_preference_set(bgp
, local_pref
);
2597 bgp_clear_star_soft_in(vty
, bgp
->name
);
2602 DEFUN (no_bgp_default_local_preference
,
2603 no_bgp_default_local_preference_cmd
,
2604 "no bgp default local-preference [(0-4294967295)]",
2606 "BGP specific commands\n"
2607 "Configure BGP defaults\n"
2608 "local preference (higher=more preferred)\n"
2609 "Configure default local preference value\n")
2611 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2612 bgp_default_local_preference_unset(bgp
);
2613 bgp_clear_star_soft_in(vty
, bgp
->name
);
2619 DEFUN (bgp_default_subgroup_pkt_queue_max
,
2620 bgp_default_subgroup_pkt_queue_max_cmd
,
2621 "bgp default subgroup-pkt-queue-max (20-100)",
2622 "BGP specific commands\n"
2623 "Configure BGP defaults\n"
2624 "subgroup-pkt-queue-max\n"
2625 "Configure subgroup packet queue max\n")
2627 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2631 max_size
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2633 bgp_default_subgroup_pkt_queue_max_set(bgp
, max_size
);
2638 DEFUN (no_bgp_default_subgroup_pkt_queue_max
,
2639 no_bgp_default_subgroup_pkt_queue_max_cmd
,
2640 "no bgp default subgroup-pkt-queue-max [(20-100)]",
2642 "BGP specific commands\n"
2643 "Configure BGP defaults\n"
2644 "subgroup-pkt-queue-max\n"
2645 "Configure subgroup packet queue max\n")
2647 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2648 bgp_default_subgroup_pkt_queue_max_unset(bgp
);
2653 DEFUN (bgp_rr_allow_outbound_policy
,
2654 bgp_rr_allow_outbound_policy_cmd
,
2655 "bgp route-reflector allow-outbound-policy",
2656 "BGP specific commands\n"
2657 "Allow modifications made by out route-map\n"
2658 "on ibgp neighbors\n")
2660 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2662 if (!bgp_flag_check(bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
)) {
2663 bgp_flag_set(bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
);
2664 update_group_announce_rrclients(bgp
);
2665 bgp_clear_star_soft_out(vty
, bgp
->name
);
2671 DEFUN (no_bgp_rr_allow_outbound_policy
,
2672 no_bgp_rr_allow_outbound_policy_cmd
,
2673 "no bgp route-reflector allow-outbound-policy",
2675 "BGP specific commands\n"
2676 "Allow modifications made by out route-map\n"
2677 "on ibgp neighbors\n")
2679 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2681 if (bgp_flag_check(bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
)) {
2682 bgp_flag_unset(bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
);
2683 update_group_announce_rrclients(bgp
);
2684 bgp_clear_star_soft_out(vty
, bgp
->name
);
2690 DEFUN (bgp_listen_limit
,
2691 bgp_listen_limit_cmd
,
2692 "bgp listen limit (1-5000)",
2693 "BGP specific commands\n"
2694 "BGP Dynamic Neighbors listen commands\n"
2695 "Maximum number of BGP Dynamic Neighbors that can be created\n"
2696 "Configure Dynamic Neighbors listen limit value\n")
2698 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2702 listen_limit
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2704 bgp_listen_limit_set(bgp
, listen_limit
);
2709 DEFUN (no_bgp_listen_limit
,
2710 no_bgp_listen_limit_cmd
,
2711 "no bgp listen limit [(1-5000)]",
2713 "BGP specific commands\n"
2714 "BGP Dynamic Neighbors listen commands\n"
2715 "Maximum number of BGP Dynamic Neighbors that can be created\n"
2716 "Configure Dynamic Neighbors listen limit value\n")
2718 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2719 bgp_listen_limit_unset(bgp
);
2725 * Check if this listen range is already configured. Check for exact
2726 * match or overlap based on input.
2728 static struct peer_group
*listen_range_exists(struct bgp
*bgp
,
2729 struct prefix
*range
, int exact
)
2731 struct listnode
*node
, *nnode
;
2732 struct listnode
*node1
, *nnode1
;
2733 struct peer_group
*group
;
2738 afi
= family2afi(range
->family
);
2739 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
2740 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], node1
, nnode1
,
2743 match
= prefix_same(range
, lr
);
2745 match
= (prefix_match(range
, lr
)
2746 || prefix_match(lr
, range
));
2755 DEFUN (bgp_listen_range
,
2756 bgp_listen_range_cmd
,
2757 "bgp listen range <A.B.C.D/M|X:X::X:X/M> peer-group PGNAME",
2758 "BGP specific commands\n"
2759 "Configure BGP dynamic neighbors listen range\n"
2760 "Configure BGP dynamic neighbors listen range\n"
2762 "Member of the peer-group\n"
2763 "Peer-group name\n")
2765 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2766 struct prefix range
;
2767 struct peer_group
*group
, *existing_group
;
2772 argv_find(argv
, argc
, "A.B.C.D/M", &idx
);
2773 argv_find(argv
, argc
, "X:X::X:X/M", &idx
);
2774 char *prefix
= argv
[idx
]->arg
;
2775 argv_find(argv
, argc
, "PGNAME", &idx
);
2776 char *peergroup
= argv
[idx
]->arg
;
2778 /* Convert IP prefix string to struct prefix. */
2779 ret
= str2prefix(prefix
, &range
);
2781 vty_out(vty
, "%% Malformed listen range\n");
2782 return CMD_WARNING_CONFIG_FAILED
;
2785 afi
= family2afi(range
.family
);
2787 if (afi
== AFI_IP6
&& IN6_IS_ADDR_LINKLOCAL(&range
.u
.prefix6
)) {
2789 "%% Malformed listen range (link-local address)\n");
2790 return CMD_WARNING_CONFIG_FAILED
;
2795 /* Check if same listen range is already configured. */
2796 existing_group
= listen_range_exists(bgp
, &range
, 1);
2797 if (existing_group
) {
2798 if (strcmp(existing_group
->name
, peergroup
) == 0)
2802 "%% Same listen range is attached to peer-group %s\n",
2803 existing_group
->name
);
2804 return CMD_WARNING_CONFIG_FAILED
;
2808 /* Check if an overlapping listen range exists. */
2809 if (listen_range_exists(bgp
, &range
, 0)) {
2811 "%% Listen range overlaps with existing listen range\n");
2812 return CMD_WARNING_CONFIG_FAILED
;
2815 group
= peer_group_lookup(bgp
, peergroup
);
2817 vty_out(vty
, "%% Configure the peer-group first\n");
2818 return CMD_WARNING_CONFIG_FAILED
;
2821 ret
= peer_group_listen_range_add(group
, &range
);
2822 return bgp_vty_return(vty
, ret
);
2825 DEFUN (no_bgp_listen_range
,
2826 no_bgp_listen_range_cmd
,
2827 "no bgp listen range <A.B.C.D/M|X:X::X:X/M> peer-group PGNAME",
2829 "BGP specific commands\n"
2830 "Unconfigure BGP dynamic neighbors listen range\n"
2831 "Unconfigure BGP dynamic neighbors listen range\n"
2833 "Member of the peer-group\n"
2834 "Peer-group name\n")
2836 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2837 struct prefix range
;
2838 struct peer_group
*group
;
2843 argv_find(argv
, argc
, "A.B.C.D/M", &idx
);
2844 argv_find(argv
, argc
, "X:X::X:X/M", &idx
);
2845 char *prefix
= argv
[idx
]->arg
;
2846 argv_find(argv
, argc
, "PGNAME", &idx
);
2847 char *peergroup
= argv
[idx
]->arg
;
2849 /* Convert IP prefix string to struct prefix. */
2850 ret
= str2prefix(prefix
, &range
);
2852 vty_out(vty
, "%% Malformed listen range\n");
2853 return CMD_WARNING_CONFIG_FAILED
;
2856 afi
= family2afi(range
.family
);
2858 if (afi
== AFI_IP6
&& IN6_IS_ADDR_LINKLOCAL(&range
.u
.prefix6
)) {
2860 "%% Malformed listen range (link-local address)\n");
2861 return CMD_WARNING_CONFIG_FAILED
;
2866 group
= peer_group_lookup(bgp
, peergroup
);
2868 vty_out(vty
, "%% Peer-group does not exist\n");
2869 return CMD_WARNING_CONFIG_FAILED
;
2872 ret
= peer_group_listen_range_del(group
, &range
);
2873 return bgp_vty_return(vty
, ret
);
2876 void bgp_config_write_listen(struct vty
*vty
, struct bgp
*bgp
)
2878 struct peer_group
*group
;
2879 struct listnode
*node
, *nnode
, *rnode
, *nrnode
;
2880 struct prefix
*range
;
2882 char buf
[PREFIX2STR_BUFFER
];
2884 if (bgp
->dynamic_neighbors_limit
!= BGP_DYNAMIC_NEIGHBORS_LIMIT_DEFAULT
)
2885 vty_out(vty
, " bgp listen limit %d\n",
2886 bgp
->dynamic_neighbors_limit
);
2888 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
2889 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++) {
2890 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], rnode
,
2892 prefix2str(range
, buf
, sizeof(buf
));
2894 " bgp listen range %s peer-group %s\n",
2902 DEFUN (bgp_disable_connected_route_check
,
2903 bgp_disable_connected_route_check_cmd
,
2904 "bgp disable-ebgp-connected-route-check",
2905 "BGP specific commands\n"
2906 "Disable checking if nexthop is connected on ebgp sessions\n")
2908 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2909 bgp_flag_set(bgp
, BGP_FLAG_DISABLE_NH_CONNECTED_CHK
);
2910 bgp_clear_star_soft_in(vty
, bgp
->name
);
2915 DEFUN (no_bgp_disable_connected_route_check
,
2916 no_bgp_disable_connected_route_check_cmd
,
2917 "no bgp disable-ebgp-connected-route-check",
2919 "BGP specific commands\n"
2920 "Disable checking if nexthop is connected on ebgp sessions\n")
2922 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2923 bgp_flag_unset(bgp
, BGP_FLAG_DISABLE_NH_CONNECTED_CHK
);
2924 bgp_clear_star_soft_in(vty
, bgp
->name
);
2930 static int peer_remote_as_vty(struct vty
*vty
, const char *peer_str
,
2931 const char *as_str
, afi_t afi
, safi_t safi
)
2933 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2936 int as_type
= AS_SPECIFIED
;
2939 if (as_str
[0] == 'i') {
2941 as_type
= AS_INTERNAL
;
2942 } else if (as_str
[0] == 'e') {
2944 as_type
= AS_EXTERNAL
;
2946 /* Get AS number. */
2947 as
= strtoul(as_str
, NULL
, 10);
2950 /* If peer is peer group or interface peer, call proper function. */
2951 ret
= str2sockunion(peer_str
, &su
);
2955 /* Check if existing interface peer */
2956 peer
= peer_lookup_by_conf_if(bgp
, peer_str
);
2958 ret
= peer_remote_as(bgp
, NULL
, peer_str
, &as
, as_type
, afi
,
2961 /* if not interface peer, check peer-group settings */
2962 if (ret
< 0 && !peer
) {
2963 ret
= peer_group_remote_as(bgp
, peer_str
, &as
, as_type
);
2966 "%% Create the peer-group or interface first\n");
2967 return CMD_WARNING_CONFIG_FAILED
;
2972 if (peer_address_self_check(bgp
, &su
)) {
2974 "%% Can not configure the local system as neighbor\n");
2975 return CMD_WARNING_CONFIG_FAILED
;
2977 ret
= peer_remote_as(bgp
, &su
, NULL
, &as
, as_type
, afi
, safi
);
2980 /* This peer belongs to peer group. */
2982 case BGP_ERR_PEER_GROUP_MEMBER
:
2984 "%% Peer-group member cannot override remote-as of peer-group\n");
2985 return CMD_WARNING_CONFIG_FAILED
;
2986 case BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
:
2988 "%% Peer-group members must be all internal or all external\n");
2989 return CMD_WARNING_CONFIG_FAILED
;
2991 return bgp_vty_return(vty
, ret
);
2994 DEFUN (bgp_default_shutdown
,
2995 bgp_default_shutdown_cmd
,
2996 "[no] bgp default shutdown",
2999 "Configure BGP defaults\n"
3000 "Apply administrative shutdown to newly configured peers\n")
3002 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3003 bgp
->autoshutdown
= !strmatch(argv
[0]->text
, "no");
3007 DEFUN (neighbor_remote_as
,
3008 neighbor_remote_as_cmd
,
3009 "neighbor <A.B.C.D|X:X::X:X|WORD> remote-as <(1-4294967295)|internal|external>",
3012 "Specify a BGP neighbor\n"
3014 "Internal BGP peer\n"
3015 "External BGP peer\n")
3018 int idx_remote_as
= 3;
3019 return peer_remote_as_vty(vty
, argv
[idx_peer
]->arg
,
3020 argv
[idx_remote_as
]->arg
, AFI_IP
,
3024 static int peer_conf_interface_get(struct vty
*vty
, const char *conf_if
,
3025 afi_t afi
, safi_t safi
, int v6only
,
3026 const char *peer_group_name
,
3029 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3031 int as_type
= AS_UNSPECIFIED
;
3033 struct peer_group
*group
;
3037 group
= peer_group_lookup(bgp
, conf_if
);
3040 vty_out(vty
, "%% Name conflict with peer-group \n");
3041 return CMD_WARNING_CONFIG_FAILED
;
3045 if (as_str
[0] == 'i') {
3046 as_type
= AS_INTERNAL
;
3047 } else if (as_str
[0] == 'e') {
3048 as_type
= AS_EXTERNAL
;
3050 /* Get AS number. */
3051 as
= strtoul(as_str
, NULL
, 10);
3052 as_type
= AS_SPECIFIED
;
3056 peer
= peer_lookup_by_conf_if(bgp
, conf_if
);
3059 ret
= peer_remote_as(bgp
, NULL
, conf_if
, &as
, as_type
,
3062 if (bgp_flag_check(bgp
, BGP_FLAG_NO_DEFAULT_IPV4
)
3063 && afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
3064 peer
= peer_create(NULL
, conf_if
, bgp
, bgp
->as
, as
,
3065 as_type
, 0, 0, NULL
);
3067 peer
= peer_create(NULL
, conf_if
, bgp
, bgp
->as
, as
,
3068 as_type
, afi
, safi
, NULL
);
3071 vty_out(vty
, "%% BGP failed to create peer\n");
3072 return CMD_WARNING_CONFIG_FAILED
;
3076 peer_flag_set(peer
, PEER_FLAG_IFPEER_V6ONLY
);
3078 /* Request zebra to initiate IPv6 RAs on this interface. We do
3080 * any unnumbered peer in order to not worry about run-time
3082 * (e.g., peering is initially IPv4, but the IPv4 /30 or /31
3084 * gets deleted later etc.)
3087 bgp_zebra_initiate_radv(bgp
, peer
);
3090 if ((v6only
&& !CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
))
3091 || (!v6only
&& CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
))) {
3093 peer_flag_set(peer
, PEER_FLAG_IFPEER_V6ONLY
);
3095 peer_flag_unset(peer
, PEER_FLAG_IFPEER_V6ONLY
);
3097 /* v6only flag changed. Reset bgp seesion */
3098 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
3099 peer
->last_reset
= PEER_DOWN_V6ONLY_CHANGE
;
3100 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
3101 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
3103 bgp_session_reset(peer
);
3106 if (!CHECK_FLAG(peer
->flags_invert
, PEER_FLAG_CAPABILITY_ENHE
)) {
3107 SET_FLAG(peer
->flags
, PEER_FLAG_CAPABILITY_ENHE
);
3108 SET_FLAG(peer
->flags_invert
, PEER_FLAG_CAPABILITY_ENHE
);
3109 SET_FLAG(peer
->flags_override
, PEER_FLAG_CAPABILITY_ENHE
);
3112 if (peer_group_name
) {
3113 group
= peer_group_lookup(bgp
, peer_group_name
);
3115 vty_out(vty
, "%% Configure the peer-group first\n");
3116 return CMD_WARNING_CONFIG_FAILED
;
3119 ret
= peer_group_bind(bgp
, &su
, peer
, group
, &as
);
3122 return bgp_vty_return(vty
, ret
);
3125 DEFUN (neighbor_interface_config
,
3126 neighbor_interface_config_cmd
,
3127 "neighbor WORD interface [peer-group PGNAME]",
3129 "Interface name or neighbor tag\n"
3130 "Enable BGP on interface\n"
3131 "Member of the peer-group\n"
3132 "Peer-group name\n")
3135 int idx_peer_group_word
= 4;
3137 if (argc
> idx_peer_group_word
)
3138 return peer_conf_interface_get(
3139 vty
, argv
[idx_word
]->arg
, AFI_IP
, SAFI_UNICAST
, 0,
3140 argv
[idx_peer_group_word
]->arg
, NULL
);
3142 return peer_conf_interface_get(vty
, argv
[idx_word
]->arg
, AFI_IP
,
3143 SAFI_UNICAST
, 0, NULL
, NULL
);
3146 DEFUN (neighbor_interface_config_v6only
,
3147 neighbor_interface_config_v6only_cmd
,
3148 "neighbor WORD interface v6only [peer-group PGNAME]",
3150 "Interface name or neighbor tag\n"
3151 "Enable BGP on interface\n"
3152 "Enable BGP with v6 link-local only\n"
3153 "Member of the peer-group\n"
3154 "Peer-group name\n")
3157 int idx_peer_group_word
= 5;
3159 if (argc
> idx_peer_group_word
)
3160 return peer_conf_interface_get(
3161 vty
, argv
[idx_word
]->arg
, AFI_IP
, SAFI_UNICAST
, 1,
3162 argv
[idx_peer_group_word
]->arg
, NULL
);
3164 return peer_conf_interface_get(vty
, argv
[idx_word
]->arg
, AFI_IP
,
3165 SAFI_UNICAST
, 1, NULL
, NULL
);
3169 DEFUN (neighbor_interface_config_remote_as
,
3170 neighbor_interface_config_remote_as_cmd
,
3171 "neighbor WORD interface remote-as <(1-4294967295)|internal|external>",
3173 "Interface name or neighbor tag\n"
3174 "Enable BGP on interface\n"
3175 "Specify a BGP neighbor\n"
3177 "Internal BGP peer\n"
3178 "External BGP peer\n")
3181 int idx_remote_as
= 4;
3182 return peer_conf_interface_get(vty
, argv
[idx_word
]->arg
, AFI_IP
,
3183 SAFI_UNICAST
, 0, NULL
,
3184 argv
[idx_remote_as
]->arg
);
3187 DEFUN (neighbor_interface_v6only_config_remote_as
,
3188 neighbor_interface_v6only_config_remote_as_cmd
,
3189 "neighbor WORD interface v6only remote-as <(1-4294967295)|internal|external>",
3191 "Interface name or neighbor tag\n"
3192 "Enable BGP with v6 link-local only\n"
3193 "Enable BGP on interface\n"
3194 "Specify a BGP neighbor\n"
3196 "Internal BGP peer\n"
3197 "External BGP peer\n")
3200 int idx_remote_as
= 5;
3201 return peer_conf_interface_get(vty
, argv
[idx_word
]->arg
, AFI_IP
,
3202 SAFI_UNICAST
, 1, NULL
,
3203 argv
[idx_remote_as
]->arg
);
3206 DEFUN (neighbor_peer_group
,
3207 neighbor_peer_group_cmd
,
3208 "neighbor WORD peer-group",
3210 "Interface name or neighbor tag\n"
3211 "Configure peer-group\n")
3213 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3216 struct peer_group
*group
;
3218 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_word
]->arg
);
3220 vty_out(vty
, "%% Name conflict with interface: \n");
3221 return CMD_WARNING_CONFIG_FAILED
;
3224 group
= peer_group_get(bgp
, argv
[idx_word
]->arg
);
3226 vty_out(vty
, "%% BGP failed to find or create peer-group\n");
3227 return CMD_WARNING_CONFIG_FAILED
;
3235 "no neighbor <WORD|<A.B.C.D|X:X::X:X> [remote-as <(1-4294967295)|internal|external>]>",
3239 "Specify a BGP neighbor\n"
3241 "Internal BGP peer\n"
3242 "External BGP peer\n")
3244 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3248 struct peer_group
*group
;
3252 ret
= str2sockunion(argv
[idx_peer
]->arg
, &su
);
3254 /* look up for neighbor by interface name config. */
3255 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_peer
]->arg
);
3257 /* Request zebra to terminate IPv6 RAs on this
3260 bgp_zebra_terminate_radv(peer
->bgp
, peer
);
3261 peer_notify_unconfig(peer
);
3266 group
= peer_group_lookup(bgp
, argv
[idx_peer
]->arg
);
3268 peer_group_notify_unconfig(group
);
3269 peer_group_delete(group
);
3271 vty_out(vty
, "%% Create the peer-group first\n");
3272 return CMD_WARNING_CONFIG_FAILED
;
3275 peer
= peer_lookup(bgp
, &su
);
3277 if (peer_dynamic_neighbor(peer
)) {
3279 "%% Operation not allowed on a dynamic neighbor\n");
3280 return CMD_WARNING_CONFIG_FAILED
;
3283 other
= peer
->doppelganger
;
3284 peer_notify_unconfig(peer
);
3286 if (other
&& other
->status
!= Deleted
) {
3287 peer_notify_unconfig(other
);
3296 DEFUN (no_neighbor_interface_config
,
3297 no_neighbor_interface_config_cmd
,
3298 "no neighbor WORD interface [v6only] [peer-group PGNAME] [remote-as <(1-4294967295)|internal|external>]",
3302 "Configure BGP on interface\n"
3303 "Enable BGP with v6 link-local only\n"
3304 "Member of the peer-group\n"
3306 "Specify a BGP neighbor\n"
3308 "Internal BGP peer\n"
3309 "External BGP peer\n")
3311 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3315 /* look up for neighbor by interface name config. */
3316 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_word
]->arg
);
3318 /* Request zebra to terminate IPv6 RAs on this interface. */
3320 bgp_zebra_terminate_radv(peer
->bgp
, peer
);
3321 peer_notify_unconfig(peer
);
3324 vty_out(vty
, "%% Create the bgp interface first\n");
3325 return CMD_WARNING_CONFIG_FAILED
;
3330 DEFUN (no_neighbor_peer_group
,
3331 no_neighbor_peer_group_cmd
,
3332 "no neighbor WORD peer-group",
3336 "Configure peer-group\n")
3338 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3340 struct peer_group
*group
;
3342 group
= peer_group_lookup(bgp
, argv
[idx_word
]->arg
);
3344 peer_group_notify_unconfig(group
);
3345 peer_group_delete(group
);
3347 vty_out(vty
, "%% Create the peer-group first\n");
3348 return CMD_WARNING_CONFIG_FAILED
;
3353 DEFUN (no_neighbor_interface_peer_group_remote_as
,
3354 no_neighbor_interface_peer_group_remote_as_cmd
,
3355 "no neighbor WORD remote-as <(1-4294967295)|internal|external>",
3358 "Interface name or neighbor tag\n"
3359 "Specify a BGP neighbor\n"
3361 "Internal BGP peer\n"
3362 "External BGP peer\n")
3364 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3366 struct peer_group
*group
;
3369 /* look up for neighbor by interface name config. */
3370 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_word
]->arg
);
3372 peer_as_change(peer
, 0, AS_UNSPECIFIED
);
3376 group
= peer_group_lookup(bgp
, argv
[idx_word
]->arg
);
3378 peer_group_remote_as_delete(group
);
3380 vty_out(vty
, "%% Create the peer-group or interface first\n");
3381 return CMD_WARNING_CONFIG_FAILED
;
3386 DEFUN (neighbor_local_as
,
3387 neighbor_local_as_cmd
,
3388 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295)",
3391 "Specify a local-as number\n"
3392 "AS number used as local AS\n")
3400 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3402 return CMD_WARNING_CONFIG_FAILED
;
3404 as
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
3405 ret
= peer_local_as_set(peer
, as
, 0, 0);
3406 return bgp_vty_return(vty
, ret
);
3409 DEFUN (neighbor_local_as_no_prepend
,
3410 neighbor_local_as_no_prepend_cmd
,
3411 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295) no-prepend",
3414 "Specify a local-as number\n"
3415 "AS number used as local AS\n"
3416 "Do not prepend local-as to updates from ebgp peers\n")
3424 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3426 return CMD_WARNING_CONFIG_FAILED
;
3428 as
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
3429 ret
= peer_local_as_set(peer
, as
, 1, 0);
3430 return bgp_vty_return(vty
, ret
);
3433 DEFUN (neighbor_local_as_no_prepend_replace_as
,
3434 neighbor_local_as_no_prepend_replace_as_cmd
,
3435 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295) no-prepend replace-as",
3438 "Specify a local-as number\n"
3439 "AS number used as local AS\n"
3440 "Do not prepend local-as to updates from ebgp peers\n"
3441 "Do not prepend local-as to updates from ibgp peers\n")
3449 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3451 return CMD_WARNING_CONFIG_FAILED
;
3453 as
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
3454 ret
= peer_local_as_set(peer
, as
, 1, 1);
3455 return bgp_vty_return(vty
, ret
);
3458 DEFUN (no_neighbor_local_as
,
3459 no_neighbor_local_as_cmd
,
3460 "no neighbor <A.B.C.D|X:X::X:X|WORD> local-as [(1-4294967295) [no-prepend [replace-as]]]",
3464 "Specify a local-as number\n"
3465 "AS number used as local AS\n"
3466 "Do not prepend local-as to updates from ebgp peers\n"
3467 "Do not prepend local-as to updates from ibgp peers\n")
3473 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3475 return CMD_WARNING_CONFIG_FAILED
;
3477 ret
= peer_local_as_unset(peer
);
3478 return bgp_vty_return(vty
, ret
);
3482 DEFUN (neighbor_solo
,
3484 "neighbor <A.B.C.D|X:X::X:X|WORD> solo",
3487 "Solo peer - part of its own update group\n")
3493 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3495 return CMD_WARNING_CONFIG_FAILED
;
3497 ret
= update_group_adjust_soloness(peer
, 1);
3498 return bgp_vty_return(vty
, ret
);
3501 DEFUN (no_neighbor_solo
,
3502 no_neighbor_solo_cmd
,
3503 "no neighbor <A.B.C.D|X:X::X:X|WORD> solo",
3507 "Solo peer - part of its own update group\n")
3513 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3515 return CMD_WARNING_CONFIG_FAILED
;
3517 ret
= update_group_adjust_soloness(peer
, 0);
3518 return bgp_vty_return(vty
, ret
);
3521 DEFUN (neighbor_password
,
3522 neighbor_password_cmd
,
3523 "neighbor <A.B.C.D|X:X::X:X|WORD> password LINE",
3534 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3536 return CMD_WARNING_CONFIG_FAILED
;
3538 ret
= peer_password_set(peer
, argv
[idx_line
]->arg
);
3539 return bgp_vty_return(vty
, ret
);
3542 DEFUN (no_neighbor_password
,
3543 no_neighbor_password_cmd
,
3544 "no neighbor <A.B.C.D|X:X::X:X|WORD> password [LINE]",
3555 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3557 return CMD_WARNING_CONFIG_FAILED
;
3559 ret
= peer_password_unset(peer
);
3560 return bgp_vty_return(vty
, ret
);
3563 DEFUN (neighbor_activate
,
3564 neighbor_activate_cmd
,
3565 "neighbor <A.B.C.D|X:X::X:X|WORD> activate",
3568 "Enable the Address Family for this Neighbor\n")
3574 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3576 return CMD_WARNING_CONFIG_FAILED
;
3578 ret
= peer_activate(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
));
3579 return bgp_vty_return(vty
, ret
);
3582 ALIAS_HIDDEN(neighbor_activate
, neighbor_activate_hidden_cmd
,
3583 "neighbor <A.B.C.D|X:X::X:X|WORD> activate",
3584 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3585 "Enable the Address Family for this Neighbor\n")
3587 DEFUN (no_neighbor_activate
,
3588 no_neighbor_activate_cmd
,
3589 "no neighbor <A.B.C.D|X:X::X:X|WORD> activate",
3593 "Enable the Address Family for this Neighbor\n")
3600 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3602 return CMD_WARNING_CONFIG_FAILED
;
3604 ret
= peer_deactivate(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
));
3605 return bgp_vty_return(vty
, ret
);
3608 ALIAS_HIDDEN(no_neighbor_activate
, no_neighbor_activate_hidden_cmd
,
3609 "no neighbor <A.B.C.D|X:X::X:X|WORD> activate",
3610 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3611 "Enable the Address Family for this Neighbor\n")
3613 DEFUN (neighbor_set_peer_group
,
3614 neighbor_set_peer_group_cmd
,
3615 "neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
3618 "Member of the peer-group\n"
3619 "Peer-group name\n")
3621 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3628 struct peer_group
*group
;
3630 ret
= str2sockunion(argv
[idx_peer
]->arg
, &su
);
3632 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_peer
]->arg
);
3634 vty_out(vty
, "%% Malformed address or name: %s\n",
3635 argv
[idx_peer
]->arg
);
3636 return CMD_WARNING_CONFIG_FAILED
;
3639 if (peer_address_self_check(bgp
, &su
)) {
3641 "%% Can not configure the local system as neighbor\n");
3642 return CMD_WARNING_CONFIG_FAILED
;
3645 /* Disallow for dynamic neighbor. */
3646 peer
= peer_lookup(bgp
, &su
);
3647 if (peer
&& peer_dynamic_neighbor(peer
)) {
3649 "%% Operation not allowed on a dynamic neighbor\n");
3650 return CMD_WARNING_CONFIG_FAILED
;
3654 group
= peer_group_lookup(bgp
, argv
[idx_word
]->arg
);
3656 vty_out(vty
, "%% Configure the peer-group first\n");
3657 return CMD_WARNING_CONFIG_FAILED
;
3660 ret
= peer_group_bind(bgp
, &su
, peer
, group
, &as
);
3662 if (ret
== BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
) {
3664 "%% Peer with AS %u cannot be in this peer-group, members must be all internal or all external\n",
3666 return CMD_WARNING_CONFIG_FAILED
;
3669 return bgp_vty_return(vty
, ret
);
3672 ALIAS_HIDDEN(neighbor_set_peer_group
, neighbor_set_peer_group_hidden_cmd
,
3673 "neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
3674 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3675 "Member of the peer-group\n"
3676 "Peer-group name\n")
3678 DEFUN (no_neighbor_set_peer_group
,
3679 no_neighbor_set_peer_group_cmd
,
3680 "no neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
3684 "Member of the peer-group\n"
3685 "Peer-group name\n")
3687 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3692 struct peer_group
*group
;
3694 peer
= peer_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3696 return CMD_WARNING_CONFIG_FAILED
;
3698 group
= peer_group_lookup(bgp
, argv
[idx_word
]->arg
);
3700 vty_out(vty
, "%% Configure the peer-group first\n");
3701 return CMD_WARNING_CONFIG_FAILED
;
3704 peer_notify_unconfig(peer
);
3705 ret
= peer_delete(peer
);
3707 return bgp_vty_return(vty
, ret
);
3710 ALIAS_HIDDEN(no_neighbor_set_peer_group
, no_neighbor_set_peer_group_hidden_cmd
,
3711 "no neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
3712 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3713 "Member of the peer-group\n"
3714 "Peer-group name\n")
3716 static int peer_flag_modify_vty(struct vty
*vty
, const char *ip_str
,
3717 uint32_t flag
, int set
)
3722 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
3724 return CMD_WARNING_CONFIG_FAILED
;
3727 * If 'neighbor <interface>', then this is for directly connected peers,
3728 * we should not accept disable-connected-check.
3730 if (peer
->conf_if
&& (flag
== PEER_FLAG_DISABLE_CONNECTED_CHECK
)) {
3732 "%s is directly connected peer, cannot accept disable-"
3733 "connected-check\n",
3735 return CMD_WARNING_CONFIG_FAILED
;
3738 if (!set
&& flag
== PEER_FLAG_SHUTDOWN
)
3739 peer_tx_shutdown_message_unset(peer
);
3742 ret
= peer_flag_set(peer
, flag
);
3744 ret
= peer_flag_unset(peer
, flag
);
3746 return bgp_vty_return(vty
, ret
);
3749 static int peer_flag_set_vty(struct vty
*vty
, const char *ip_str
, uint32_t flag
)
3751 return peer_flag_modify_vty(vty
, ip_str
, flag
, 1);
3754 static int peer_flag_unset_vty(struct vty
*vty
, const char *ip_str
,
3757 return peer_flag_modify_vty(vty
, ip_str
, flag
, 0);
3760 /* neighbor passive. */
3761 DEFUN (neighbor_passive
,
3762 neighbor_passive_cmd
,
3763 "neighbor <A.B.C.D|X:X::X:X|WORD> passive",
3766 "Don't send open messages to this neighbor\n")
3769 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
, PEER_FLAG_PASSIVE
);
3772 DEFUN (no_neighbor_passive
,
3773 no_neighbor_passive_cmd
,
3774 "no neighbor <A.B.C.D|X:X::X:X|WORD> passive",
3778 "Don't send open messages to this neighbor\n")
3781 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
, PEER_FLAG_PASSIVE
);
3784 /* neighbor shutdown. */
3785 DEFUN (neighbor_shutdown_msg
,
3786 neighbor_shutdown_msg_cmd
,
3787 "neighbor <A.B.C.D|X:X::X:X|WORD> shutdown message MSG...",
3790 "Administratively shut down this neighbor\n"
3791 "Add a shutdown message (draft-ietf-idr-shutdown-06)\n"
3792 "Shutdown message\n")
3798 peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3802 return CMD_WARNING_CONFIG_FAILED
;
3803 message
= argv_concat(argv
, argc
, 4);
3804 peer_tx_shutdown_message_set(peer
, message
);
3805 XFREE(MTYPE_TMP
, message
);
3808 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
, PEER_FLAG_SHUTDOWN
);
3811 ALIAS(neighbor_shutdown_msg
, neighbor_shutdown_cmd
,
3812 "neighbor <A.B.C.D|X:X::X:X|WORD> shutdown",
3813 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3814 "Administratively shut down this neighbor\n")
3816 DEFUN (no_neighbor_shutdown_msg
,
3817 no_neighbor_shutdown_msg_cmd
,
3818 "no neighbor <A.B.C.D|X:X::X:X|WORD> shutdown message MSG...",
3822 "Administratively shut down this neighbor\n"
3823 "Remove a shutdown message (draft-ietf-idr-shutdown-06)\n"
3824 "Shutdown message\n")
3828 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3829 PEER_FLAG_SHUTDOWN
);
3832 ALIAS(no_neighbor_shutdown_msg
, no_neighbor_shutdown_cmd
,
3833 "no neighbor <A.B.C.D|X:X::X:X|WORD> shutdown",
3834 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3835 "Administratively shut down this neighbor\n")
3837 /* neighbor capability dynamic. */
3838 DEFUN (neighbor_capability_dynamic
,
3839 neighbor_capability_dynamic_cmd
,
3840 "neighbor <A.B.C.D|X:X::X:X|WORD> capability dynamic",
3843 "Advertise capability to the peer\n"
3844 "Advertise dynamic capability to this neighbor\n")
3847 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
3848 PEER_FLAG_DYNAMIC_CAPABILITY
);
3851 DEFUN (no_neighbor_capability_dynamic
,
3852 no_neighbor_capability_dynamic_cmd
,
3853 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability dynamic",
3857 "Advertise capability to the peer\n"
3858 "Advertise dynamic capability to this neighbor\n")
3861 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3862 PEER_FLAG_DYNAMIC_CAPABILITY
);
3865 /* neighbor dont-capability-negotiate */
3866 DEFUN (neighbor_dont_capability_negotiate
,
3867 neighbor_dont_capability_negotiate_cmd
,
3868 "neighbor <A.B.C.D|X:X::X:X|WORD> dont-capability-negotiate",
3871 "Do not perform capability negotiation\n")
3874 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
3875 PEER_FLAG_DONT_CAPABILITY
);
3878 DEFUN (no_neighbor_dont_capability_negotiate
,
3879 no_neighbor_dont_capability_negotiate_cmd
,
3880 "no neighbor <A.B.C.D|X:X::X:X|WORD> dont-capability-negotiate",
3884 "Do not perform capability negotiation\n")
3887 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3888 PEER_FLAG_DONT_CAPABILITY
);
3891 /* neighbor capability extended next hop encoding */
3892 DEFUN (neighbor_capability_enhe
,
3893 neighbor_capability_enhe_cmd
,
3894 "neighbor <A.B.C.D|X:X::X:X|WORD> capability extended-nexthop",
3897 "Advertise capability to the peer\n"
3898 "Advertise extended next-hop capability to the peer\n")
3901 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
3902 PEER_FLAG_CAPABILITY_ENHE
);
3905 DEFUN (no_neighbor_capability_enhe
,
3906 no_neighbor_capability_enhe_cmd
,
3907 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability extended-nexthop",
3911 "Advertise capability to the peer\n"
3912 "Advertise extended next-hop capability to the peer\n")
3915 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3916 PEER_FLAG_CAPABILITY_ENHE
);
3919 static int peer_af_flag_modify_vty(struct vty
*vty
, const char *peer_str
,
3920 afi_t afi
, safi_t safi
, uint32_t flag
,
3926 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
3928 return CMD_WARNING_CONFIG_FAILED
;
3931 ret
= peer_af_flag_set(peer
, afi
, safi
, flag
);
3933 ret
= peer_af_flag_unset(peer
, afi
, safi
, flag
);
3935 return bgp_vty_return(vty
, ret
);
3938 static int peer_af_flag_set_vty(struct vty
*vty
, const char *peer_str
,
3939 afi_t afi
, safi_t safi
, uint32_t flag
)
3941 return peer_af_flag_modify_vty(vty
, peer_str
, afi
, safi
, flag
, 1);
3944 static int peer_af_flag_unset_vty(struct vty
*vty
, const char *peer_str
,
3945 afi_t afi
, safi_t safi
, uint32_t flag
)
3947 return peer_af_flag_modify_vty(vty
, peer_str
, afi
, safi
, flag
, 0);
3950 /* neighbor capability orf prefix-list. */
3951 DEFUN (neighbor_capability_orf_prefix
,
3952 neighbor_capability_orf_prefix_cmd
,
3953 "neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
3956 "Advertise capability to the peer\n"
3957 "Advertise ORF capability to the peer\n"
3958 "Advertise prefixlist ORF capability to this neighbor\n"
3959 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
3960 "Capability to RECEIVE the ORF from this neighbor\n"
3961 "Capability to SEND the ORF to this neighbor\n")
3964 int idx_send_recv
= 5;
3967 if (strmatch(argv
[idx_send_recv
]->text
, "send"))
3968 flag
= PEER_FLAG_ORF_PREFIX_SM
;
3969 else if (strmatch(argv
[idx_send_recv
]->text
, "receive"))
3970 flag
= PEER_FLAG_ORF_PREFIX_RM
;
3971 else if (strmatch(argv
[idx_send_recv
]->text
, "both"))
3972 flag
= PEER_FLAG_ORF_PREFIX_SM
| PEER_FLAG_ORF_PREFIX_RM
;
3974 vty_out(vty
, "%% BGP invalid orf prefix-list option\n");
3975 return CMD_WARNING_CONFIG_FAILED
;
3978 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
3979 bgp_node_safi(vty
), flag
);
3983 neighbor_capability_orf_prefix
,
3984 neighbor_capability_orf_prefix_hidden_cmd
,
3985 "neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
3986 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3987 "Advertise capability to the peer\n"
3988 "Advertise ORF capability to the peer\n"
3989 "Advertise prefixlist ORF capability to this neighbor\n"
3990 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
3991 "Capability to RECEIVE the ORF from this neighbor\n"
3992 "Capability to SEND the ORF to this neighbor\n")
3994 DEFUN (no_neighbor_capability_orf_prefix
,
3995 no_neighbor_capability_orf_prefix_cmd
,
3996 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
4000 "Advertise capability to the peer\n"
4001 "Advertise ORF capability to the peer\n"
4002 "Advertise prefixlist ORF capability to this neighbor\n"
4003 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
4004 "Capability to RECEIVE the ORF from this neighbor\n"
4005 "Capability to SEND the ORF to this neighbor\n")
4008 int idx_send_recv
= 6;
4011 if (strmatch(argv
[idx_send_recv
]->text
, "send"))
4012 flag
= PEER_FLAG_ORF_PREFIX_SM
;
4013 else if (strmatch(argv
[idx_send_recv
]->text
, "receive"))
4014 flag
= PEER_FLAG_ORF_PREFIX_RM
;
4015 else if (strmatch(argv
[idx_send_recv
]->text
, "both"))
4016 flag
= PEER_FLAG_ORF_PREFIX_SM
| PEER_FLAG_ORF_PREFIX_RM
;
4018 vty_out(vty
, "%% BGP invalid orf prefix-list option\n");
4019 return CMD_WARNING_CONFIG_FAILED
;
4022 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4023 bgp_node_afi(vty
), bgp_node_safi(vty
),
4028 no_neighbor_capability_orf_prefix
,
4029 no_neighbor_capability_orf_prefix_hidden_cmd
,
4030 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
4031 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4032 "Advertise capability to the peer\n"
4033 "Advertise ORF capability to the peer\n"
4034 "Advertise prefixlist ORF capability to this neighbor\n"
4035 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
4036 "Capability to RECEIVE the ORF from this neighbor\n"
4037 "Capability to SEND the ORF to this neighbor\n")
4039 /* neighbor next-hop-self. */
4040 DEFUN (neighbor_nexthop_self
,
4041 neighbor_nexthop_self_cmd
,
4042 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
4045 "Disable the next hop calculation for this neighbor\n")
4048 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4049 bgp_node_safi(vty
), PEER_FLAG_NEXTHOP_SELF
);
4052 ALIAS_HIDDEN(neighbor_nexthop_self
, neighbor_nexthop_self_hidden_cmd
,
4053 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
4054 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4055 "Disable the next hop calculation for this neighbor\n")
4057 /* neighbor next-hop-self. */
4058 DEFUN (neighbor_nexthop_self_force
,
4059 neighbor_nexthop_self_force_cmd
,
4060 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
4063 "Disable the next hop calculation for this neighbor\n"
4064 "Set the next hop to self for reflected routes\n")
4067 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4069 PEER_FLAG_FORCE_NEXTHOP_SELF
);
4072 ALIAS_HIDDEN(neighbor_nexthop_self_force
,
4073 neighbor_nexthop_self_force_hidden_cmd
,
4074 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
4075 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4076 "Disable the next hop calculation for this neighbor\n"
4077 "Set the next hop to self for reflected routes\n")
4079 ALIAS_HIDDEN(neighbor_nexthop_self_force
,
4080 neighbor_nexthop_self_all_hidden_cmd
,
4081 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self all",
4082 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4083 "Disable the next hop calculation for this neighbor\n"
4084 "Set the next hop to self for reflected routes\n")
4086 DEFUN (no_neighbor_nexthop_self
,
4087 no_neighbor_nexthop_self_cmd
,
4088 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
4092 "Disable the next hop calculation for this neighbor\n")
4095 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4096 bgp_node_afi(vty
), bgp_node_safi(vty
),
4097 PEER_FLAG_NEXTHOP_SELF
);
4100 ALIAS_HIDDEN(no_neighbor_nexthop_self
, no_neighbor_nexthop_self_hidden_cmd
,
4101 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
4102 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4103 "Disable the next hop calculation for this neighbor\n")
4105 DEFUN (no_neighbor_nexthop_self_force
,
4106 no_neighbor_nexthop_self_force_cmd
,
4107 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
4111 "Disable the next hop calculation for this neighbor\n"
4112 "Set the next hop to self for reflected routes\n")
4115 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4116 bgp_node_afi(vty
), bgp_node_safi(vty
),
4117 PEER_FLAG_FORCE_NEXTHOP_SELF
);
4120 ALIAS_HIDDEN(no_neighbor_nexthop_self_force
,
4121 no_neighbor_nexthop_self_force_hidden_cmd
,
4122 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
4123 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4124 "Disable the next hop calculation for this neighbor\n"
4125 "Set the next hop to self for reflected routes\n")
4127 ALIAS_HIDDEN(no_neighbor_nexthop_self_force
,
4128 no_neighbor_nexthop_self_all_hidden_cmd
,
4129 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self all",
4130 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4131 "Disable the next hop calculation for this neighbor\n"
4132 "Set the next hop to self for reflected routes\n")
4134 /* neighbor as-override */
4135 DEFUN (neighbor_as_override
,
4136 neighbor_as_override_cmd
,
4137 "neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
4140 "Override ASNs in outbound updates if aspath equals remote-as\n")
4143 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4144 bgp_node_safi(vty
), PEER_FLAG_AS_OVERRIDE
);
4147 ALIAS_HIDDEN(neighbor_as_override
, neighbor_as_override_hidden_cmd
,
4148 "neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
4149 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4150 "Override ASNs in outbound updates if aspath equals remote-as\n")
4152 DEFUN (no_neighbor_as_override
,
4153 no_neighbor_as_override_cmd
,
4154 "no neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
4158 "Override ASNs in outbound updates if aspath equals remote-as\n")
4161 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4162 bgp_node_afi(vty
), bgp_node_safi(vty
),
4163 PEER_FLAG_AS_OVERRIDE
);
4166 ALIAS_HIDDEN(no_neighbor_as_override
, no_neighbor_as_override_hidden_cmd
,
4167 "no neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
4168 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4169 "Override ASNs in outbound updates if aspath equals remote-as\n")
4171 /* neighbor remove-private-AS. */
4172 DEFUN (neighbor_remove_private_as
,
4173 neighbor_remove_private_as_cmd
,
4174 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
4177 "Remove private ASNs in outbound updates\n")
4180 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4182 PEER_FLAG_REMOVE_PRIVATE_AS
);
4185 ALIAS_HIDDEN(neighbor_remove_private_as
, neighbor_remove_private_as_hidden_cmd
,
4186 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
4187 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4188 "Remove private ASNs in outbound updates\n")
4190 DEFUN (neighbor_remove_private_as_all
,
4191 neighbor_remove_private_as_all_cmd
,
4192 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
4195 "Remove private ASNs in outbound updates\n"
4196 "Apply to all AS numbers\n")
4199 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4201 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
);
4204 ALIAS_HIDDEN(neighbor_remove_private_as_all
,
4205 neighbor_remove_private_as_all_hidden_cmd
,
4206 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
4207 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4208 "Remove private ASNs in outbound updates\n"
4209 "Apply to all AS numbers")
4211 DEFUN (neighbor_remove_private_as_replace_as
,
4212 neighbor_remove_private_as_replace_as_cmd
,
4213 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
4216 "Remove private ASNs in outbound updates\n"
4217 "Replace private ASNs with our ASN in outbound updates\n")
4220 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4222 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
);
4225 ALIAS_HIDDEN(neighbor_remove_private_as_replace_as
,
4226 neighbor_remove_private_as_replace_as_hidden_cmd
,
4227 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
4228 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4229 "Remove private ASNs in outbound updates\n"
4230 "Replace private ASNs with our ASN in outbound updates\n")
4232 DEFUN (neighbor_remove_private_as_all_replace_as
,
4233 neighbor_remove_private_as_all_replace_as_cmd
,
4234 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
4237 "Remove private ASNs in outbound updates\n"
4238 "Apply to all AS numbers\n"
4239 "Replace private ASNs with our ASN in outbound updates\n")
4242 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4244 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
);
4248 neighbor_remove_private_as_all_replace_as
,
4249 neighbor_remove_private_as_all_replace_as_hidden_cmd
,
4250 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
4251 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4252 "Remove private ASNs in outbound updates\n"
4253 "Apply to all AS numbers\n"
4254 "Replace private ASNs with our ASN in outbound updates\n")
4256 DEFUN (no_neighbor_remove_private_as
,
4257 no_neighbor_remove_private_as_cmd
,
4258 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
4262 "Remove private ASNs in outbound updates\n")
4265 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4266 bgp_node_afi(vty
), bgp_node_safi(vty
),
4267 PEER_FLAG_REMOVE_PRIVATE_AS
);
4270 ALIAS_HIDDEN(no_neighbor_remove_private_as
,
4271 no_neighbor_remove_private_as_hidden_cmd
,
4272 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
4273 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4274 "Remove private ASNs in outbound updates\n")
4276 DEFUN (no_neighbor_remove_private_as_all
,
4277 no_neighbor_remove_private_as_all_cmd
,
4278 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
4282 "Remove private ASNs in outbound updates\n"
4283 "Apply to all AS numbers\n")
4286 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4287 bgp_node_afi(vty
), bgp_node_safi(vty
),
4288 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
);
4291 ALIAS_HIDDEN(no_neighbor_remove_private_as_all
,
4292 no_neighbor_remove_private_as_all_hidden_cmd
,
4293 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
4294 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4295 "Remove private ASNs in outbound updates\n"
4296 "Apply to all AS numbers\n")
4298 DEFUN (no_neighbor_remove_private_as_replace_as
,
4299 no_neighbor_remove_private_as_replace_as_cmd
,
4300 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
4304 "Remove private ASNs in outbound updates\n"
4305 "Replace private ASNs with our ASN in outbound updates\n")
4308 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4309 bgp_node_afi(vty
), bgp_node_safi(vty
),
4310 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
);
4313 ALIAS_HIDDEN(no_neighbor_remove_private_as_replace_as
,
4314 no_neighbor_remove_private_as_replace_as_hidden_cmd
,
4315 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
4316 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4317 "Remove private ASNs in outbound updates\n"
4318 "Replace private ASNs with our ASN in outbound updates\n")
4320 DEFUN (no_neighbor_remove_private_as_all_replace_as
,
4321 no_neighbor_remove_private_as_all_replace_as_cmd
,
4322 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
4326 "Remove private ASNs in outbound updates\n"
4327 "Apply to all AS numbers\n"
4328 "Replace private ASNs with our ASN in outbound updates\n")
4331 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4332 bgp_node_afi(vty
), bgp_node_safi(vty
),
4333 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
);
4337 no_neighbor_remove_private_as_all_replace_as
,
4338 no_neighbor_remove_private_as_all_replace_as_hidden_cmd
,
4339 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
4340 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4341 "Remove private ASNs in outbound updates\n"
4342 "Apply to all AS numbers\n"
4343 "Replace private ASNs with our ASN in outbound updates\n")
4346 /* neighbor send-community. */
4347 DEFUN (neighbor_send_community
,
4348 neighbor_send_community_cmd
,
4349 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
4352 "Send Community attribute to this neighbor\n")
4356 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4358 PEER_FLAG_SEND_COMMUNITY
);
4361 ALIAS_HIDDEN(neighbor_send_community
, neighbor_send_community_hidden_cmd
,
4362 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
4363 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4364 "Send Community attribute to this neighbor\n")
4366 DEFUN (no_neighbor_send_community
,
4367 no_neighbor_send_community_cmd
,
4368 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
4372 "Send Community attribute to this neighbor\n")
4376 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4377 bgp_node_afi(vty
), bgp_node_safi(vty
),
4378 PEER_FLAG_SEND_COMMUNITY
);
4381 ALIAS_HIDDEN(no_neighbor_send_community
, no_neighbor_send_community_hidden_cmd
,
4382 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
4383 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4384 "Send Community attribute to this neighbor\n")
4386 /* neighbor send-community extended. */
4387 DEFUN (neighbor_send_community_type
,
4388 neighbor_send_community_type_cmd
,
4389 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
4392 "Send Community attribute to this neighbor\n"
4393 "Send Standard and Extended Community attributes\n"
4394 "Send Standard, Large and Extended Community attributes\n"
4395 "Send Extended Community attributes\n"
4396 "Send Standard Community attributes\n"
4397 "Send Large Community attributes\n")
4401 const char *type
= argv
[argc
- 1]->text
;
4403 if (strmatch(type
, "standard")) {
4404 SET_FLAG(flag
, PEER_FLAG_SEND_COMMUNITY
);
4405 } else if (strmatch(type
, "extended")) {
4406 SET_FLAG(flag
, PEER_FLAG_SEND_EXT_COMMUNITY
);
4407 } else if (strmatch(type
, "large")) {
4408 SET_FLAG(flag
, PEER_FLAG_SEND_LARGE_COMMUNITY
);
4409 } else if (strmatch(type
, "both")) {
4410 SET_FLAG(flag
, PEER_FLAG_SEND_COMMUNITY
);
4411 SET_FLAG(flag
, PEER_FLAG_SEND_EXT_COMMUNITY
);
4412 } else { /* if (strmatch(type, "all")) */
4413 SET_FLAG(flag
, PEER_FLAG_SEND_COMMUNITY
);
4414 SET_FLAG(flag
, PEER_FLAG_SEND_EXT_COMMUNITY
);
4415 SET_FLAG(flag
, PEER_FLAG_SEND_LARGE_COMMUNITY
);
4418 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4419 bgp_node_safi(vty
), flag
);
4423 neighbor_send_community_type
, neighbor_send_community_type_hidden_cmd
,
4424 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
4425 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4426 "Send Community attribute to this neighbor\n"
4427 "Send Standard and Extended Community attributes\n"
4428 "Send Standard, Large and Extended Community attributes\n"
4429 "Send Extended Community attributes\n"
4430 "Send Standard Community attributes\n"
4431 "Send Large Community attributes\n")
4433 DEFUN (no_neighbor_send_community_type
,
4434 no_neighbor_send_community_type_cmd
,
4435 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
4439 "Send Community attribute to this neighbor\n"
4440 "Send Standard and Extended Community attributes\n"
4441 "Send Standard, Large and Extended Community attributes\n"
4442 "Send Extended Community attributes\n"
4443 "Send Standard Community attributes\n"
4444 "Send Large Community attributes\n")
4448 const char *type
= argv
[argc
- 1]->text
;
4450 if (strmatch(type
, "standard")) {
4451 SET_FLAG(flag
, PEER_FLAG_SEND_COMMUNITY
);
4452 } else if (strmatch(type
, "extended")) {
4453 SET_FLAG(flag
, PEER_FLAG_SEND_EXT_COMMUNITY
);
4454 } else if (strmatch(type
, "large")) {
4455 SET_FLAG(flag
, PEER_FLAG_SEND_LARGE_COMMUNITY
);
4456 } else if (strmatch(type
, "both")) {
4457 SET_FLAG(flag
, PEER_FLAG_SEND_COMMUNITY
);
4458 SET_FLAG(flag
, PEER_FLAG_SEND_EXT_COMMUNITY
);
4459 } else { /* if (strmatch(type, "all")) */
4460 SET_FLAG(flag
, PEER_FLAG_SEND_COMMUNITY
);
4461 SET_FLAG(flag
, PEER_FLAG_SEND_EXT_COMMUNITY
);
4462 SET_FLAG(flag
, PEER_FLAG_SEND_LARGE_COMMUNITY
);
4465 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4466 bgp_node_afi(vty
), bgp_node_safi(vty
),
4471 no_neighbor_send_community_type
,
4472 no_neighbor_send_community_type_hidden_cmd
,
4473 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
4474 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4475 "Send Community attribute to this neighbor\n"
4476 "Send Standard and Extended Community attributes\n"
4477 "Send Standard, Large and Extended Community attributes\n"
4478 "Send Extended Community attributes\n"
4479 "Send Standard Community attributes\n"
4480 "Send Large Community attributes\n")
4482 /* neighbor soft-reconfig. */
4483 DEFUN (neighbor_soft_reconfiguration
,
4484 neighbor_soft_reconfiguration_cmd
,
4485 "neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
4488 "Per neighbor soft reconfiguration\n"
4489 "Allow inbound soft reconfiguration for this neighbor\n")
4492 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4494 PEER_FLAG_SOFT_RECONFIG
);
4497 ALIAS_HIDDEN(neighbor_soft_reconfiguration
,
4498 neighbor_soft_reconfiguration_hidden_cmd
,
4499 "neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
4500 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4501 "Per neighbor soft reconfiguration\n"
4502 "Allow inbound soft reconfiguration for this neighbor\n")
4504 DEFUN (no_neighbor_soft_reconfiguration
,
4505 no_neighbor_soft_reconfiguration_cmd
,
4506 "no neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
4510 "Per neighbor soft reconfiguration\n"
4511 "Allow inbound soft reconfiguration for this neighbor\n")
4514 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4515 bgp_node_afi(vty
), bgp_node_safi(vty
),
4516 PEER_FLAG_SOFT_RECONFIG
);
4519 ALIAS_HIDDEN(no_neighbor_soft_reconfiguration
,
4520 no_neighbor_soft_reconfiguration_hidden_cmd
,
4521 "no neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
4522 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4523 "Per neighbor soft reconfiguration\n"
4524 "Allow inbound soft reconfiguration for this neighbor\n")
4526 DEFUN (neighbor_route_reflector_client
,
4527 neighbor_route_reflector_client_cmd
,
4528 "neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
4531 "Configure a neighbor as Route Reflector client\n")
4537 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
4539 return CMD_WARNING_CONFIG_FAILED
;
4541 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4543 PEER_FLAG_REFLECTOR_CLIENT
);
4546 ALIAS_HIDDEN(neighbor_route_reflector_client
,
4547 neighbor_route_reflector_client_hidden_cmd
,
4548 "neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
4549 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4550 "Configure a neighbor as Route Reflector client\n")
4552 DEFUN (no_neighbor_route_reflector_client
,
4553 no_neighbor_route_reflector_client_cmd
,
4554 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
4558 "Configure a neighbor as Route Reflector client\n")
4561 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4562 bgp_node_afi(vty
), bgp_node_safi(vty
),
4563 PEER_FLAG_REFLECTOR_CLIENT
);
4566 ALIAS_HIDDEN(no_neighbor_route_reflector_client
,
4567 no_neighbor_route_reflector_client_hidden_cmd
,
4568 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
4569 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4570 "Configure a neighbor as Route Reflector client\n")
4572 /* neighbor route-server-client. */
4573 DEFUN (neighbor_route_server_client
,
4574 neighbor_route_server_client_cmd
,
4575 "neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
4578 "Configure a neighbor as Route Server client\n")
4583 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
4585 return CMD_WARNING_CONFIG_FAILED
;
4586 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4588 PEER_FLAG_RSERVER_CLIENT
);
4591 ALIAS_HIDDEN(neighbor_route_server_client
,
4592 neighbor_route_server_client_hidden_cmd
,
4593 "neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
4594 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4595 "Configure a neighbor as Route Server client\n")
4597 DEFUN (no_neighbor_route_server_client
,
4598 no_neighbor_route_server_client_cmd
,
4599 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
4603 "Configure a neighbor as Route Server client\n")
4606 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4607 bgp_node_afi(vty
), bgp_node_safi(vty
),
4608 PEER_FLAG_RSERVER_CLIENT
);
4611 ALIAS_HIDDEN(no_neighbor_route_server_client
,
4612 no_neighbor_route_server_client_hidden_cmd
,
4613 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
4614 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4615 "Configure a neighbor as Route Server client\n")
4617 DEFUN (neighbor_nexthop_local_unchanged
,
4618 neighbor_nexthop_local_unchanged_cmd
,
4619 "neighbor <A.B.C.D|X:X::X:X|WORD> nexthop-local unchanged",
4622 "Configure treatment of outgoing link-local nexthop attribute\n"
4623 "Leave link-local nexthop unchanged for this peer\n")
4626 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4628 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
);
4631 DEFUN (no_neighbor_nexthop_local_unchanged
,
4632 no_neighbor_nexthop_local_unchanged_cmd
,
4633 "no neighbor <A.B.C.D|X:X::X:X|WORD> nexthop-local unchanged",
4637 "Configure treatment of outgoing link-local-nexthop attribute\n"
4638 "Leave link-local nexthop unchanged for this peer\n")
4641 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4642 bgp_node_afi(vty
), bgp_node_safi(vty
),
4643 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
);
4646 DEFUN (neighbor_attr_unchanged
,
4647 neighbor_attr_unchanged_cmd
,
4648 "neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
4651 "BGP attribute is propagated unchanged to this neighbor\n"
4652 "As-path attribute\n"
4653 "Nexthop attribute\n"
4657 char *peer_str
= argv
[1]->arg
;
4660 afi_t afi
= bgp_node_afi(vty
);
4661 safi_t safi
= bgp_node_safi(vty
);
4663 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
4665 return CMD_WARNING_CONFIG_FAILED
;
4667 if (argv_find(argv
, argc
, "as-path", &idx
))
4668 SET_FLAG(flags
, PEER_FLAG_AS_PATH_UNCHANGED
);
4670 if (argv_find(argv
, argc
, "next-hop", &idx
))
4671 SET_FLAG(flags
, PEER_FLAG_NEXTHOP_UNCHANGED
);
4673 if (argv_find(argv
, argc
, "med", &idx
))
4674 SET_FLAG(flags
, PEER_FLAG_MED_UNCHANGED
);
4676 /* no flags means all of them! */
4678 SET_FLAG(flags
, PEER_FLAG_AS_PATH_UNCHANGED
);
4679 SET_FLAG(flags
, PEER_FLAG_NEXTHOP_UNCHANGED
);
4680 SET_FLAG(flags
, PEER_FLAG_MED_UNCHANGED
);
4682 if (!CHECK_FLAG(flags
, PEER_FLAG_AS_PATH_UNCHANGED
)
4683 && peer_af_flag_check(peer
, afi
, safi
,
4684 PEER_FLAG_AS_PATH_UNCHANGED
)) {
4685 peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
4686 PEER_FLAG_AS_PATH_UNCHANGED
);
4689 if (!CHECK_FLAG(flags
, PEER_FLAG_NEXTHOP_UNCHANGED
)
4690 && peer_af_flag_check(peer
, afi
, safi
,
4691 PEER_FLAG_NEXTHOP_UNCHANGED
)) {
4692 peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
4693 PEER_FLAG_NEXTHOP_UNCHANGED
);
4696 if (!CHECK_FLAG(flags
, PEER_FLAG_MED_UNCHANGED
)
4697 && peer_af_flag_check(peer
, afi
, safi
,
4698 PEER_FLAG_MED_UNCHANGED
)) {
4699 peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
4700 PEER_FLAG_MED_UNCHANGED
);
4704 return peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
, flags
);
4708 neighbor_attr_unchanged
, neighbor_attr_unchanged_hidden_cmd
,
4709 "neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
4710 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4711 "BGP attribute is propagated unchanged to this neighbor\n"
4712 "As-path attribute\n"
4713 "Nexthop attribute\n"
4716 DEFUN (no_neighbor_attr_unchanged
,
4717 no_neighbor_attr_unchanged_cmd
,
4718 "no neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
4722 "BGP attribute is propagated unchanged to this neighbor\n"
4723 "As-path attribute\n"
4724 "Nexthop attribute\n"
4728 char *peer
= argv
[2]->arg
;
4731 if (argv_find(argv
, argc
, "as-path", &idx
))
4732 SET_FLAG(flags
, PEER_FLAG_AS_PATH_UNCHANGED
);
4734 if (argv_find(argv
, argc
, "next-hop", &idx
))
4735 SET_FLAG(flags
, PEER_FLAG_NEXTHOP_UNCHANGED
);
4737 if (argv_find(argv
, argc
, "med", &idx
))
4738 SET_FLAG(flags
, PEER_FLAG_MED_UNCHANGED
);
4740 if (!flags
) // no flags means all of them!
4742 SET_FLAG(flags
, PEER_FLAG_AS_PATH_UNCHANGED
);
4743 SET_FLAG(flags
, PEER_FLAG_NEXTHOP_UNCHANGED
);
4744 SET_FLAG(flags
, PEER_FLAG_MED_UNCHANGED
);
4747 return peer_af_flag_unset_vty(vty
, peer
, bgp_node_afi(vty
),
4748 bgp_node_safi(vty
), flags
);
4752 no_neighbor_attr_unchanged
, no_neighbor_attr_unchanged_hidden_cmd
,
4753 "no neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
4754 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4755 "BGP attribute is propagated unchanged to this neighbor\n"
4756 "As-path attribute\n"
4757 "Nexthop attribute\n"
4760 /* EBGP multihop configuration. */
4761 static int peer_ebgp_multihop_set_vty(struct vty
*vty
, const char *ip_str
,
4762 const char *ttl_str
)
4767 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
4769 return CMD_WARNING_CONFIG_FAILED
;
4772 return bgp_vty_return(vty
, BGP_ERR_INVALID_FOR_DIRECT_PEER
);
4777 ttl
= strtoul(ttl_str
, NULL
, 10);
4779 return bgp_vty_return(vty
, peer_ebgp_multihop_set(peer
, ttl
));
4782 static int peer_ebgp_multihop_unset_vty(struct vty
*vty
, const char *ip_str
)
4786 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
4788 return CMD_WARNING_CONFIG_FAILED
;
4790 return bgp_vty_return(vty
, peer_ebgp_multihop_unset(peer
));
4793 /* neighbor ebgp-multihop. */
4794 DEFUN (neighbor_ebgp_multihop
,
4795 neighbor_ebgp_multihop_cmd
,
4796 "neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop",
4799 "Allow EBGP neighbors not on directly connected networks\n")
4802 return peer_ebgp_multihop_set_vty(vty
, argv
[idx_peer
]->arg
, NULL
);
4805 DEFUN (neighbor_ebgp_multihop_ttl
,
4806 neighbor_ebgp_multihop_ttl_cmd
,
4807 "neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop (1-255)",
4810 "Allow EBGP neighbors not on directly connected networks\n"
4811 "maximum hop count\n")
4815 return peer_ebgp_multihop_set_vty(vty
, argv
[idx_peer
]->arg
,
4816 argv
[idx_number
]->arg
);
4819 DEFUN (no_neighbor_ebgp_multihop
,
4820 no_neighbor_ebgp_multihop_cmd
,
4821 "no neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop [(1-255)]",
4825 "Allow EBGP neighbors not on directly connected networks\n"
4826 "maximum hop count\n")
4829 return peer_ebgp_multihop_unset_vty(vty
, argv
[idx_peer
]->arg
);
4833 /* disable-connected-check */
4834 DEFUN (neighbor_disable_connected_check
,
4835 neighbor_disable_connected_check_cmd
,
4836 "neighbor <A.B.C.D|X:X::X:X|WORD> <disable-connected-check|enforce-multihop>",
4839 "one-hop away EBGP peer using loopback address\n"
4840 "Enforce EBGP neighbors perform multihop\n")
4843 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
4844 PEER_FLAG_DISABLE_CONNECTED_CHECK
);
4847 DEFUN (no_neighbor_disable_connected_check
,
4848 no_neighbor_disable_connected_check_cmd
,
4849 "no neighbor <A.B.C.D|X:X::X:X|WORD> <disable-connected-check|enforce-multihop>",
4853 "one-hop away EBGP peer using loopback address\n"
4854 "Enforce EBGP neighbors perform multihop\n")
4857 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4858 PEER_FLAG_DISABLE_CONNECTED_CHECK
);
4862 /* enforce-first-as */
4863 DEFUN (neighbor_enforce_first_as
,
4864 neighbor_enforce_first_as_cmd
,
4865 "neighbor <A.B.C.D|X:X::X:X|WORD> enforce-first-as",
4868 "Enforce the first AS for EBGP routes\n")
4872 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
4873 PEER_FLAG_ENFORCE_FIRST_AS
);
4876 DEFUN (no_neighbor_enforce_first_as
,
4877 no_neighbor_enforce_first_as_cmd
,
4878 "no neighbor <A.B.C.D|X:X::X:X|WORD> enforce-first-as",
4882 "Enforce the first AS for EBGP routes\n")
4886 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4887 PEER_FLAG_ENFORCE_FIRST_AS
);
4891 DEFUN (neighbor_description
,
4892 neighbor_description_cmd
,
4893 "neighbor <A.B.C.D|X:X::X:X|WORD> description LINE...",
4896 "Neighbor specific description\n"
4897 "Up to 80 characters describing this neighbor\n")
4904 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
4906 return CMD_WARNING_CONFIG_FAILED
;
4908 str
= argv_concat(argv
, argc
, idx_line
);
4910 peer_description_set(peer
, str
);
4912 XFREE(MTYPE_TMP
, str
);
4917 DEFUN (no_neighbor_description
,
4918 no_neighbor_description_cmd
,
4919 "no neighbor <A.B.C.D|X:X::X:X|WORD> description",
4923 "Neighbor specific description\n")
4928 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
4930 return CMD_WARNING_CONFIG_FAILED
;
4932 peer_description_unset(peer
);
4937 ALIAS(no_neighbor_description
, no_neighbor_description_comment_cmd
,
4938 "no neighbor <A.B.C.D|X:X::X:X|WORD> description LINE...",
4939 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4940 "Neighbor specific description\n"
4941 "Up to 80 characters describing this neighbor\n")
4943 /* Neighbor update-source. */
4944 static int peer_update_source_vty(struct vty
*vty
, const char *peer_str
,
4945 const char *source_str
)
4951 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
4953 return CMD_WARNING_CONFIG_FAILED
;
4959 if (str2sockunion(source_str
, &su
) == 0)
4960 peer_update_source_addr_set(peer
, &su
);
4962 if (str2prefix(source_str
, &p
)) {
4964 "%% Invalid update-source, remove prefix length \n");
4965 return CMD_WARNING_CONFIG_FAILED
;
4967 peer_update_source_if_set(peer
, source_str
);
4970 peer_update_source_unset(peer
);
4975 #define BGP_UPDATE_SOURCE_HELP_STR \
4978 "Interface name (requires zebra to be running)\n"
4980 DEFUN (neighbor_update_source
,
4981 neighbor_update_source_cmd
,
4982 "neighbor <A.B.C.D|X:X::X:X|WORD> update-source <A.B.C.D|X:X::X:X|WORD>",
4985 "Source of routing updates\n"
4986 BGP_UPDATE_SOURCE_HELP_STR
)
4990 return peer_update_source_vty(vty
, argv
[idx_peer
]->arg
,
4991 argv
[idx_peer_2
]->arg
);
4994 DEFUN (no_neighbor_update_source
,
4995 no_neighbor_update_source_cmd
,
4996 "no neighbor <A.B.C.D|X:X::X:X|WORD> update-source [<A.B.C.D|X:X::X:X|WORD>]",
5000 "Source of routing updates\n"
5001 BGP_UPDATE_SOURCE_HELP_STR
)
5004 return peer_update_source_vty(vty
, argv
[idx_peer
]->arg
, NULL
);
5007 static int peer_default_originate_set_vty(struct vty
*vty
, const char *peer_str
,
5008 afi_t afi
, safi_t safi
,
5009 const char *rmap
, int set
)
5013 struct route_map
*route_map
= NULL
;
5015 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
5017 return CMD_WARNING_CONFIG_FAILED
;
5021 route_map
= route_map_lookup_warn_noexist(vty
, rmap
);
5022 ret
= peer_default_originate_set(peer
, afi
, safi
,
5025 ret
= peer_default_originate_unset(peer
, afi
, safi
);
5027 return bgp_vty_return(vty
, ret
);
5030 /* neighbor default-originate. */
5031 DEFUN (neighbor_default_originate
,
5032 neighbor_default_originate_cmd
,
5033 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate",
5036 "Originate default route to this neighbor\n")
5039 return peer_default_originate_set_vty(vty
, argv
[idx_peer
]->arg
,
5041 bgp_node_safi(vty
), NULL
, 1);
5044 ALIAS_HIDDEN(neighbor_default_originate
, neighbor_default_originate_hidden_cmd
,
5045 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate",
5046 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5047 "Originate default route to this neighbor\n")
5049 DEFUN (neighbor_default_originate_rmap
,
5050 neighbor_default_originate_rmap_cmd
,
5051 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate route-map WORD",
5054 "Originate default route to this neighbor\n"
5055 "Route-map to specify criteria to originate default\n"
5060 return peer_default_originate_set_vty(
5061 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5062 argv
[idx_word
]->arg
, 1);
5066 neighbor_default_originate_rmap
,
5067 neighbor_default_originate_rmap_hidden_cmd
,
5068 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate route-map WORD",
5069 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5070 "Originate default route to this neighbor\n"
5071 "Route-map to specify criteria to originate default\n"
5074 DEFUN (no_neighbor_default_originate
,
5075 no_neighbor_default_originate_cmd
,
5076 "no neighbor <A.B.C.D|X:X::X:X|WORD> default-originate [route-map WORD]",
5080 "Originate default route to this neighbor\n"
5081 "Route-map to specify criteria to originate default\n"
5085 return peer_default_originate_set_vty(vty
, argv
[idx_peer
]->arg
,
5087 bgp_node_safi(vty
), NULL
, 0);
5091 no_neighbor_default_originate
, no_neighbor_default_originate_hidden_cmd
,
5092 "no neighbor <A.B.C.D|X:X::X:X|WORD> default-originate [route-map WORD]",
5093 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5094 "Originate default route to this neighbor\n"
5095 "Route-map to specify criteria to originate default\n"
5099 /* Set neighbor's BGP port. */
5100 static int peer_port_vty(struct vty
*vty
, const char *ip_str
, int afi
,
5101 const char *port_str
)
5107 peer
= peer_lookup_vty(vty
, ip_str
);
5109 return CMD_WARNING_CONFIG_FAILED
;
5112 sp
= getservbyname("bgp", "tcp");
5113 port
= (sp
== NULL
) ? BGP_PORT_DEFAULT
: ntohs(sp
->s_port
);
5115 port
= strtoul(port_str
, NULL
, 10);
5118 peer_port_set(peer
, port
);
5123 /* Set specified peer's BGP port. */
5124 DEFUN (neighbor_port
,
5126 "neighbor <A.B.C.D|X:X::X:X> port (0-65535)",
5129 "Neighbor's BGP port\n"
5130 "TCP port number\n")
5134 return peer_port_vty(vty
, argv
[idx_ip
]->arg
, AFI_IP
,
5135 argv
[idx_number
]->arg
);
5138 DEFUN (no_neighbor_port
,
5139 no_neighbor_port_cmd
,
5140 "no neighbor <A.B.C.D|X:X::X:X> port [(0-65535)]",
5144 "Neighbor's BGP port\n"
5145 "TCP port number\n")
5148 return peer_port_vty(vty
, argv
[idx_ip
]->arg
, AFI_IP
, NULL
);
5152 /* neighbor weight. */
5153 static int peer_weight_set_vty(struct vty
*vty
, const char *ip_str
, afi_t afi
,
5154 safi_t safi
, const char *weight_str
)
5158 unsigned long weight
;
5160 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5162 return CMD_WARNING_CONFIG_FAILED
;
5164 weight
= strtoul(weight_str
, NULL
, 10);
5166 ret
= peer_weight_set(peer
, afi
, safi
, weight
);
5167 return bgp_vty_return(vty
, ret
);
5170 static int peer_weight_unset_vty(struct vty
*vty
, const char *ip_str
, afi_t afi
,
5176 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5178 return CMD_WARNING_CONFIG_FAILED
;
5180 ret
= peer_weight_unset(peer
, afi
, safi
);
5181 return bgp_vty_return(vty
, ret
);
5184 DEFUN (neighbor_weight
,
5185 neighbor_weight_cmd
,
5186 "neighbor <A.B.C.D|X:X::X:X|WORD> weight (0-65535)",
5189 "Set default weight for routes from this neighbor\n"
5194 return peer_weight_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
5195 bgp_node_safi(vty
), argv
[idx_number
]->arg
);
5198 ALIAS_HIDDEN(neighbor_weight
, neighbor_weight_hidden_cmd
,
5199 "neighbor <A.B.C.D|X:X::X:X|WORD> weight (0-65535)",
5200 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5201 "Set default weight for routes from this neighbor\n"
5204 DEFUN (no_neighbor_weight
,
5205 no_neighbor_weight_cmd
,
5206 "no neighbor <A.B.C.D|X:X::X:X|WORD> weight [(0-65535)]",
5210 "Set default weight for routes from this neighbor\n"
5214 return peer_weight_unset_vty(vty
, argv
[idx_peer
]->arg
,
5215 bgp_node_afi(vty
), bgp_node_safi(vty
));
5218 ALIAS_HIDDEN(no_neighbor_weight
, no_neighbor_weight_hidden_cmd
,
5219 "no neighbor <A.B.C.D|X:X::X:X|WORD> weight [(0-65535)]",
5220 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5221 "Set default weight for routes from this neighbor\n"
5225 /* Override capability negotiation. */
5226 DEFUN (neighbor_override_capability
,
5227 neighbor_override_capability_cmd
,
5228 "neighbor <A.B.C.D|X:X::X:X|WORD> override-capability",
5231 "Override capability negotiation result\n")
5234 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
5235 PEER_FLAG_OVERRIDE_CAPABILITY
);
5238 DEFUN (no_neighbor_override_capability
,
5239 no_neighbor_override_capability_cmd
,
5240 "no neighbor <A.B.C.D|X:X::X:X|WORD> override-capability",
5244 "Override capability negotiation result\n")
5247 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
5248 PEER_FLAG_OVERRIDE_CAPABILITY
);
5251 DEFUN (neighbor_strict_capability
,
5252 neighbor_strict_capability_cmd
,
5253 "neighbor <A.B.C.D|X:X::X:X|WORD> strict-capability-match",
5256 "Strict capability negotiation match\n")
5260 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
5261 PEER_FLAG_STRICT_CAP_MATCH
);
5264 DEFUN (no_neighbor_strict_capability
,
5265 no_neighbor_strict_capability_cmd
,
5266 "no neighbor <A.B.C.D|X:X::X:X|WORD> strict-capability-match",
5270 "Strict capability negotiation match\n")
5274 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
5275 PEER_FLAG_STRICT_CAP_MATCH
);
5278 static int peer_timers_set_vty(struct vty
*vty
, const char *ip_str
,
5279 const char *keep_str
, const char *hold_str
)
5286 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5288 return CMD_WARNING_CONFIG_FAILED
;
5290 keepalive
= strtoul(keep_str
, NULL
, 10);
5291 holdtime
= strtoul(hold_str
, NULL
, 10);
5293 ret
= peer_timers_set(peer
, keepalive
, holdtime
);
5295 return bgp_vty_return(vty
, ret
);
5298 static int peer_timers_unset_vty(struct vty
*vty
, const char *ip_str
)
5303 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5305 return CMD_WARNING_CONFIG_FAILED
;
5307 ret
= peer_timers_unset(peer
);
5309 return bgp_vty_return(vty
, ret
);
5312 DEFUN (neighbor_timers
,
5313 neighbor_timers_cmd
,
5314 "neighbor <A.B.C.D|X:X::X:X|WORD> timers (0-65535) (0-65535)",
5317 "BGP per neighbor timers\n"
5318 "Keepalive interval\n"
5323 int idx_number_2
= 4;
5324 return peer_timers_set_vty(vty
, argv
[idx_peer
]->arg
,
5325 argv
[idx_number
]->arg
,
5326 argv
[idx_number_2
]->arg
);
5329 DEFUN (no_neighbor_timers
,
5330 no_neighbor_timers_cmd
,
5331 "no neighbor <A.B.C.D|X:X::X:X|WORD> timers [(0-65535) (0-65535)]",
5335 "BGP per neighbor timers\n"
5336 "Keepalive interval\n"
5340 return peer_timers_unset_vty(vty
, argv
[idx_peer
]->arg
);
5344 static int peer_timers_connect_set_vty(struct vty
*vty
, const char *ip_str
,
5345 const char *time_str
)
5351 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5353 return CMD_WARNING_CONFIG_FAILED
;
5355 connect
= strtoul(time_str
, NULL
, 10);
5357 ret
= peer_timers_connect_set(peer
, connect
);
5359 return bgp_vty_return(vty
, ret
);
5362 static int peer_timers_connect_unset_vty(struct vty
*vty
, const char *ip_str
)
5367 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5369 return CMD_WARNING_CONFIG_FAILED
;
5371 ret
= peer_timers_connect_unset(peer
);
5373 return bgp_vty_return(vty
, ret
);
5376 DEFUN (neighbor_timers_connect
,
5377 neighbor_timers_connect_cmd
,
5378 "neighbor <A.B.C.D|X:X::X:X|WORD> timers connect (1-65535)",
5381 "BGP per neighbor timers\n"
5382 "BGP connect timer\n"
5387 return peer_timers_connect_set_vty(vty
, argv
[idx_peer
]->arg
,
5388 argv
[idx_number
]->arg
);
5391 DEFUN (no_neighbor_timers_connect
,
5392 no_neighbor_timers_connect_cmd
,
5393 "no neighbor <A.B.C.D|X:X::X:X|WORD> timers connect [(1-65535)]",
5397 "BGP per neighbor timers\n"
5398 "BGP connect timer\n"
5402 return peer_timers_connect_unset_vty(vty
, argv
[idx_peer
]->arg
);
5406 static int peer_advertise_interval_vty(struct vty
*vty
, const char *ip_str
,
5407 const char *time_str
, int set
)
5411 uint32_t routeadv
= 0;
5413 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5415 return CMD_WARNING_CONFIG_FAILED
;
5418 routeadv
= strtoul(time_str
, NULL
, 10);
5421 ret
= peer_advertise_interval_set(peer
, routeadv
);
5423 ret
= peer_advertise_interval_unset(peer
);
5425 return bgp_vty_return(vty
, ret
);
5428 DEFUN (neighbor_advertise_interval
,
5429 neighbor_advertise_interval_cmd
,
5430 "neighbor <A.B.C.D|X:X::X:X|WORD> advertisement-interval (0-600)",
5433 "Minimum interval between sending BGP routing updates\n"
5434 "time in seconds\n")
5438 return peer_advertise_interval_vty(vty
, argv
[idx_peer
]->arg
,
5439 argv
[idx_number
]->arg
, 1);
5442 DEFUN (no_neighbor_advertise_interval
,
5443 no_neighbor_advertise_interval_cmd
,
5444 "no neighbor <A.B.C.D|X:X::X:X|WORD> advertisement-interval [(0-600)]",
5448 "Minimum interval between sending BGP routing updates\n"
5449 "time in seconds\n")
5452 return peer_advertise_interval_vty(vty
, argv
[idx_peer
]->arg
, NULL
, 0);
5456 /* Time to wait before processing route-map updates */
5457 DEFUN (bgp_set_route_map_delay_timer
,
5458 bgp_set_route_map_delay_timer_cmd
,
5459 "bgp route-map delay-timer (0-600)",
5461 "BGP route-map delay timer\n"
5462 "Time in secs to wait before processing route-map changes\n"
5463 "0 disables the timer, no route updates happen when route-maps change\n")
5466 uint32_t rmap_delay_timer
;
5468 if (argv
[idx_number
]->arg
) {
5469 rmap_delay_timer
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
5470 bm
->rmap_update_timer
= rmap_delay_timer
;
5472 /* if the dynamic update handling is being disabled, and a timer
5474 * running, stop the timer and act as if the timer has already
5477 if (!rmap_delay_timer
&& bm
->t_rmap_update
) {
5478 BGP_TIMER_OFF(bm
->t_rmap_update
);
5479 thread_execute(bm
->master
, bgp_route_map_update_timer
,
5484 vty_out(vty
, "%% BGP invalid route-map delay-timer\n");
5485 return CMD_WARNING_CONFIG_FAILED
;
5489 DEFUN (no_bgp_set_route_map_delay_timer
,
5490 no_bgp_set_route_map_delay_timer_cmd
,
5491 "no bgp route-map delay-timer [(0-600)]",
5494 "Default BGP route-map delay timer\n"
5495 "Reset to default time to wait for processing route-map changes\n"
5496 "0 disables the timer, no route updates happen when route-maps change\n")
5499 bm
->rmap_update_timer
= RMAP_DEFAULT_UPDATE_TIMER
;
5505 /* neighbor interface */
5506 static int peer_interface_vty(struct vty
*vty
, const char *ip_str
,
5511 peer
= peer_lookup_vty(vty
, ip_str
);
5512 if (!peer
|| peer
->conf_if
) {
5513 vty_out(vty
, "%% BGP invalid peer %s\n", ip_str
);
5514 return CMD_WARNING_CONFIG_FAILED
;
5518 peer_interface_set(peer
, str
);
5520 peer_interface_unset(peer
);
5525 DEFUN (neighbor_interface
,
5526 neighbor_interface_cmd
,
5527 "neighbor <A.B.C.D|X:X::X:X> interface WORD",
5535 return peer_interface_vty(vty
, argv
[idx_ip
]->arg
, argv
[idx_word
]->arg
);
5538 DEFUN (no_neighbor_interface
,
5539 no_neighbor_interface_cmd
,
5540 "no neighbor <A.B.C.D|X:X::X:X|WORD> interface WORD",
5548 return peer_interface_vty(vty
, argv
[idx_peer
]->arg
, NULL
);
5551 DEFUN (neighbor_distribute_list
,
5552 neighbor_distribute_list_cmd
,
5553 "neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list <(1-199)|(1300-2699)|WORD> <in|out>",
5556 "Filter updates to/from this neighbor\n"
5557 "IP access-list number\n"
5558 "IP access-list number (expanded range)\n"
5559 "IP Access-list name\n"
5560 "Filter incoming updates\n"
5561 "Filter outgoing updates\n")
5568 const char *pstr
= argv
[idx_peer
]->arg
;
5569 const char *acl
= argv
[idx_acl
]->arg
;
5570 const char *inout
= argv
[argc
- 1]->text
;
5572 peer
= peer_and_group_lookup_vty(vty
, pstr
);
5574 return CMD_WARNING_CONFIG_FAILED
;
5576 /* Check filter direction. */
5577 direct
= strmatch(inout
, "in") ? FILTER_IN
: FILTER_OUT
;
5578 ret
= peer_distribute_set(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5581 return bgp_vty_return(vty
, ret
);
5585 neighbor_distribute_list
, neighbor_distribute_list_hidden_cmd
,
5586 "neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list <(1-199)|(1300-2699)|WORD> <in|out>",
5587 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5588 "Filter updates to/from this neighbor\n"
5589 "IP access-list number\n"
5590 "IP access-list number (expanded range)\n"
5591 "IP Access-list name\n"
5592 "Filter incoming updates\n"
5593 "Filter outgoing updates\n")
5595 DEFUN (no_neighbor_distribute_list
,
5596 no_neighbor_distribute_list_cmd
,
5597 "no neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list <(1-199)|(1300-2699)|WORD> <in|out>",
5601 "Filter updates to/from this neighbor\n"
5602 "IP access-list number\n"
5603 "IP access-list number (expanded range)\n"
5604 "IP Access-list name\n"
5605 "Filter incoming updates\n"
5606 "Filter outgoing updates\n")
5612 const char *pstr
= argv
[idx_peer
]->arg
;
5613 const char *inout
= argv
[argc
- 1]->text
;
5615 peer
= peer_and_group_lookup_vty(vty
, pstr
);
5617 return CMD_WARNING_CONFIG_FAILED
;
5619 /* Check filter direction. */
5620 direct
= strmatch(inout
, "in") ? FILTER_IN
: FILTER_OUT
;
5621 ret
= peer_distribute_unset(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5624 return bgp_vty_return(vty
, ret
);
5628 no_neighbor_distribute_list
, no_neighbor_distribute_list_hidden_cmd
,
5629 "no neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list <(1-199)|(1300-2699)|WORD> <in|out>",
5630 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5631 "Filter updates to/from this neighbor\n"
5632 "IP access-list number\n"
5633 "IP access-list number (expanded range)\n"
5634 "IP Access-list name\n"
5635 "Filter incoming updates\n"
5636 "Filter outgoing updates\n")
5638 /* Set prefix list to the peer. */
5639 static int peer_prefix_list_set_vty(struct vty
*vty
, const char *ip_str
,
5640 afi_t afi
, safi_t safi
,
5641 const char *name_str
,
5642 const char *direct_str
)
5645 int direct
= FILTER_IN
;
5648 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5650 return CMD_WARNING_CONFIG_FAILED
;
5652 /* Check filter direction. */
5653 if (strncmp(direct_str
, "i", 1) == 0)
5655 else if (strncmp(direct_str
, "o", 1) == 0)
5656 direct
= FILTER_OUT
;
5658 ret
= peer_prefix_list_set(peer
, afi
, safi
, direct
, name_str
);
5660 return bgp_vty_return(vty
, ret
);
5663 static int peer_prefix_list_unset_vty(struct vty
*vty
, const char *ip_str
,
5664 afi_t afi
, safi_t safi
,
5665 const char *direct_str
)
5669 int direct
= FILTER_IN
;
5671 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5673 return CMD_WARNING_CONFIG_FAILED
;
5675 /* Check filter direction. */
5676 if (strncmp(direct_str
, "i", 1) == 0)
5678 else if (strncmp(direct_str
, "o", 1) == 0)
5679 direct
= FILTER_OUT
;
5681 ret
= peer_prefix_list_unset(peer
, afi
, safi
, direct
);
5683 return bgp_vty_return(vty
, ret
);
5686 DEFUN (neighbor_prefix_list
,
5687 neighbor_prefix_list_cmd
,
5688 "neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
5691 "Filter updates to/from this neighbor\n"
5692 "Name of a prefix list\n"
5693 "Filter incoming updates\n"
5694 "Filter outgoing updates\n")
5699 return peer_prefix_list_set_vty(
5700 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5701 argv
[idx_word
]->arg
, argv
[idx_in_out
]->arg
);
5704 ALIAS_HIDDEN(neighbor_prefix_list
, neighbor_prefix_list_hidden_cmd
,
5705 "neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
5706 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5707 "Filter updates to/from this neighbor\n"
5708 "Name of a prefix list\n"
5709 "Filter incoming updates\n"
5710 "Filter outgoing updates\n")
5712 DEFUN (no_neighbor_prefix_list
,
5713 no_neighbor_prefix_list_cmd
,
5714 "no neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
5718 "Filter updates to/from this neighbor\n"
5719 "Name of a prefix list\n"
5720 "Filter incoming updates\n"
5721 "Filter outgoing updates\n")
5725 return peer_prefix_list_unset_vty(vty
, argv
[idx_peer
]->arg
,
5726 bgp_node_afi(vty
), bgp_node_safi(vty
),
5727 argv
[idx_in_out
]->arg
);
5730 ALIAS_HIDDEN(no_neighbor_prefix_list
, no_neighbor_prefix_list_hidden_cmd
,
5731 "no neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
5732 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5733 "Filter updates to/from this neighbor\n"
5734 "Name of a prefix list\n"
5735 "Filter incoming updates\n"
5736 "Filter outgoing updates\n")
5738 static int peer_aslist_set_vty(struct vty
*vty
, const char *ip_str
, afi_t afi
,
5739 safi_t safi
, const char *name_str
,
5740 const char *direct_str
)
5744 int direct
= FILTER_IN
;
5746 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5748 return CMD_WARNING_CONFIG_FAILED
;
5750 /* Check filter direction. */
5751 if (strncmp(direct_str
, "i", 1) == 0)
5753 else if (strncmp(direct_str
, "o", 1) == 0)
5754 direct
= FILTER_OUT
;
5756 ret
= peer_aslist_set(peer
, afi
, safi
, direct
, name_str
);
5758 return bgp_vty_return(vty
, ret
);
5761 static int peer_aslist_unset_vty(struct vty
*vty
, const char *ip_str
, afi_t afi
,
5762 safi_t safi
, const char *direct_str
)
5766 int direct
= FILTER_IN
;
5768 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5770 return CMD_WARNING_CONFIG_FAILED
;
5772 /* Check filter direction. */
5773 if (strncmp(direct_str
, "i", 1) == 0)
5775 else if (strncmp(direct_str
, "o", 1) == 0)
5776 direct
= FILTER_OUT
;
5778 ret
= peer_aslist_unset(peer
, afi
, safi
, direct
);
5780 return bgp_vty_return(vty
, ret
);
5783 DEFUN (neighbor_filter_list
,
5784 neighbor_filter_list_cmd
,
5785 "neighbor <A.B.C.D|X:X::X:X|WORD> filter-list WORD <in|out>",
5788 "Establish BGP filters\n"
5789 "AS path access-list name\n"
5790 "Filter incoming routes\n"
5791 "Filter outgoing routes\n")
5796 return peer_aslist_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
5797 bgp_node_safi(vty
), argv
[idx_word
]->arg
,
5798 argv
[idx_in_out
]->arg
);
5801 ALIAS_HIDDEN(neighbor_filter_list
, neighbor_filter_list_hidden_cmd
,
5802 "neighbor <A.B.C.D|X:X::X:X|WORD> filter-list WORD <in|out>",
5803 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5804 "Establish BGP filters\n"
5805 "AS path access-list name\n"
5806 "Filter incoming routes\n"
5807 "Filter outgoing routes\n")
5809 DEFUN (no_neighbor_filter_list
,
5810 no_neighbor_filter_list_cmd
,
5811 "no neighbor <A.B.C.D|X:X::X:X|WORD> filter-list WORD <in|out>",
5815 "Establish BGP filters\n"
5816 "AS path access-list name\n"
5817 "Filter incoming routes\n"
5818 "Filter outgoing routes\n")
5822 return peer_aslist_unset_vty(vty
, argv
[idx_peer
]->arg
,
5823 bgp_node_afi(vty
), bgp_node_safi(vty
),
5824 argv
[idx_in_out
]->arg
);
5827 ALIAS_HIDDEN(no_neighbor_filter_list
, no_neighbor_filter_list_hidden_cmd
,
5828 "no neighbor <A.B.C.D|X:X::X:X|WORD> filter-list WORD <in|out>",
5829 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5830 "Establish BGP filters\n"
5831 "AS path access-list name\n"
5832 "Filter incoming routes\n"
5833 "Filter outgoing routes\n")
5835 /* Set route-map to the peer. */
5836 static int peer_route_map_set_vty(struct vty
*vty
, const char *ip_str
,
5837 afi_t afi
, safi_t safi
, const char *name_str
,
5838 const char *direct_str
)
5842 int direct
= RMAP_IN
;
5843 struct route_map
*route_map
;
5845 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5847 return CMD_WARNING_CONFIG_FAILED
;
5849 /* Check filter direction. */
5850 if (strncmp(direct_str
, "in", 2) == 0)
5852 else if (strncmp(direct_str
, "o", 1) == 0)
5855 route_map
= route_map_lookup_warn_noexist(vty
, name_str
);
5856 ret
= peer_route_map_set(peer
, afi
, safi
, direct
, name_str
, route_map
);
5858 return bgp_vty_return(vty
, ret
);
5861 static int peer_route_map_unset_vty(struct vty
*vty
, const char *ip_str
,
5862 afi_t afi
, safi_t safi
,
5863 const char *direct_str
)
5867 int direct
= RMAP_IN
;
5869 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5871 return CMD_WARNING_CONFIG_FAILED
;
5873 /* Check filter direction. */
5874 if (strncmp(direct_str
, "in", 2) == 0)
5876 else if (strncmp(direct_str
, "o", 1) == 0)
5879 ret
= peer_route_map_unset(peer
, afi
, safi
, direct
);
5881 return bgp_vty_return(vty
, ret
);
5884 DEFUN (neighbor_route_map
,
5885 neighbor_route_map_cmd
,
5886 "neighbor <A.B.C.D|X:X::X:X|WORD> route-map WORD <in|out>",
5889 "Apply route map to neighbor\n"
5890 "Name of route map\n"
5891 "Apply map to incoming routes\n"
5892 "Apply map to outbound routes\n")
5897 return peer_route_map_set_vty(
5898 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5899 argv
[idx_word
]->arg
, argv
[idx_in_out
]->arg
);
5902 ALIAS_HIDDEN(neighbor_route_map
, neighbor_route_map_hidden_cmd
,
5903 "neighbor <A.B.C.D|X:X::X:X|WORD> route-map WORD <in|out>",
5904 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5905 "Apply route map to neighbor\n"
5906 "Name of route map\n"
5907 "Apply map to incoming routes\n"
5908 "Apply map to outbound routes\n")
5910 DEFUN (no_neighbor_route_map
,
5911 no_neighbor_route_map_cmd
,
5912 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-map WORD <in|out>",
5916 "Apply route map to neighbor\n"
5917 "Name of route map\n"
5918 "Apply map to incoming routes\n"
5919 "Apply map to outbound routes\n")
5923 return peer_route_map_unset_vty(vty
, argv
[idx_peer
]->arg
,
5924 bgp_node_afi(vty
), bgp_node_safi(vty
),
5925 argv
[idx_in_out
]->arg
);
5928 ALIAS_HIDDEN(no_neighbor_route_map
, no_neighbor_route_map_hidden_cmd
,
5929 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-map WORD <in|out>",
5930 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5931 "Apply route map to neighbor\n"
5932 "Name of route map\n"
5933 "Apply map to incoming routes\n"
5934 "Apply map to outbound routes\n")
5936 /* Set unsuppress-map to the peer. */
5937 static int peer_unsuppress_map_set_vty(struct vty
*vty
, const char *ip_str
,
5938 afi_t afi
, safi_t safi
,
5939 const char *name_str
)
5943 struct route_map
*route_map
;
5945 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5947 return CMD_WARNING_CONFIG_FAILED
;
5949 route_map
= route_map_lookup_warn_noexist(vty
, name_str
);
5950 ret
= peer_unsuppress_map_set(peer
, afi
, safi
, name_str
, route_map
);
5952 return bgp_vty_return(vty
, ret
);
5955 /* Unset route-map from the peer. */
5956 static int peer_unsuppress_map_unset_vty(struct vty
*vty
, const char *ip_str
,
5957 afi_t afi
, safi_t safi
)
5962 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5964 return CMD_WARNING_CONFIG_FAILED
;
5966 ret
= peer_unsuppress_map_unset(peer
, afi
, safi
);
5968 return bgp_vty_return(vty
, ret
);
5971 DEFUN (neighbor_unsuppress_map
,
5972 neighbor_unsuppress_map_cmd
,
5973 "neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
5976 "Route-map to selectively unsuppress suppressed routes\n"
5977 "Name of route map\n")
5981 return peer_unsuppress_map_set_vty(
5982 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5983 argv
[idx_word
]->arg
);
5986 ALIAS_HIDDEN(neighbor_unsuppress_map
, neighbor_unsuppress_map_hidden_cmd
,
5987 "neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
5988 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5989 "Route-map to selectively unsuppress suppressed routes\n"
5990 "Name of route map\n")
5992 DEFUN (no_neighbor_unsuppress_map
,
5993 no_neighbor_unsuppress_map_cmd
,
5994 "no neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
5998 "Route-map to selectively unsuppress suppressed routes\n"
5999 "Name of route map\n")
6002 return peer_unsuppress_map_unset_vty(vty
, argv
[idx_peer
]->arg
,
6004 bgp_node_safi(vty
));
6007 ALIAS_HIDDEN(no_neighbor_unsuppress_map
, no_neighbor_unsuppress_map_hidden_cmd
,
6008 "no neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
6009 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6010 "Route-map to selectively unsuppress suppressed routes\n"
6011 "Name of route map\n")
6013 static int peer_maximum_prefix_set_vty(struct vty
*vty
, const char *ip_str
,
6014 afi_t afi
, safi_t safi
,
6015 const char *num_str
,
6016 const char *threshold_str
, int warning
,
6017 const char *restart_str
)
6025 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
6027 return CMD_WARNING_CONFIG_FAILED
;
6029 max
= strtoul(num_str
, NULL
, 10);
6031 threshold
= atoi(threshold_str
);
6033 threshold
= MAXIMUM_PREFIX_THRESHOLD_DEFAULT
;
6036 restart
= atoi(restart_str
);
6040 ret
= peer_maximum_prefix_set(peer
, afi
, safi
, max
, threshold
, warning
,
6043 return bgp_vty_return(vty
, ret
);
6046 static int peer_maximum_prefix_unset_vty(struct vty
*vty
, const char *ip_str
,
6047 afi_t afi
, safi_t safi
)
6052 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
6054 return CMD_WARNING_CONFIG_FAILED
;
6056 ret
= peer_maximum_prefix_unset(peer
, afi
, safi
);
6058 return bgp_vty_return(vty
, ret
);
6061 /* Maximum number of prefix configuration. prefix count is different
6062 for each peer configuration. So this configuration can be set for
6063 each peer configuration. */
6064 DEFUN (neighbor_maximum_prefix
,
6065 neighbor_maximum_prefix_cmd
,
6066 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295)",
6069 "Maximum number of prefix accept from this peer\n"
6070 "maximum no. of prefix limit\n")
6074 return peer_maximum_prefix_set_vty(
6075 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6076 argv
[idx_number
]->arg
, NULL
, 0, NULL
);
6079 ALIAS_HIDDEN(neighbor_maximum_prefix
, neighbor_maximum_prefix_hidden_cmd
,
6080 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295)",
6081 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6082 "Maximum number of prefix accept from this peer\n"
6083 "maximum no. of prefix limit\n")
6085 DEFUN (neighbor_maximum_prefix_threshold
,
6086 neighbor_maximum_prefix_threshold_cmd
,
6087 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100)",
6090 "Maximum number of prefix accept from this peer\n"
6091 "maximum no. of prefix limit\n"
6092 "Threshold value (%) at which to generate a warning msg\n")
6096 int idx_number_2
= 4;
6097 return peer_maximum_prefix_set_vty(
6098 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6099 argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
, 0, NULL
);
6103 neighbor_maximum_prefix_threshold
,
6104 neighbor_maximum_prefix_threshold_hidden_cmd
,
6105 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100)",
6106 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6107 "Maximum number of prefix accept from this peer\n"
6108 "maximum no. of prefix limit\n"
6109 "Threshold value (%) at which to generate a warning msg\n")
6111 DEFUN (neighbor_maximum_prefix_warning
,
6112 neighbor_maximum_prefix_warning_cmd
,
6113 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) warning-only",
6116 "Maximum number of prefix accept from this peer\n"
6117 "maximum no. of prefix limit\n"
6118 "Only give warning message when limit is exceeded\n")
6122 return peer_maximum_prefix_set_vty(
6123 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6124 argv
[idx_number
]->arg
, NULL
, 1, NULL
);
6128 neighbor_maximum_prefix_warning
,
6129 neighbor_maximum_prefix_warning_hidden_cmd
,
6130 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) warning-only",
6131 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6132 "Maximum number of prefix accept from this peer\n"
6133 "maximum no. of prefix limit\n"
6134 "Only give warning message when limit is exceeded\n")
6136 DEFUN (neighbor_maximum_prefix_threshold_warning
,
6137 neighbor_maximum_prefix_threshold_warning_cmd
,
6138 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) warning-only",
6141 "Maximum number of prefix accept from this peer\n"
6142 "maximum no. of prefix limit\n"
6143 "Threshold value (%) at which to generate a warning msg\n"
6144 "Only give warning message when limit is exceeded\n")
6148 int idx_number_2
= 4;
6149 return peer_maximum_prefix_set_vty(
6150 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6151 argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
, 1, NULL
);
6155 neighbor_maximum_prefix_threshold_warning
,
6156 neighbor_maximum_prefix_threshold_warning_hidden_cmd
,
6157 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) warning-only",
6158 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6159 "Maximum number of prefix accept from this peer\n"
6160 "maximum no. of prefix limit\n"
6161 "Threshold value (%) at which to generate a warning msg\n"
6162 "Only give warning message when limit is exceeded\n")
6164 DEFUN (neighbor_maximum_prefix_restart
,
6165 neighbor_maximum_prefix_restart_cmd
,
6166 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) restart (1-65535)",
6169 "Maximum number of prefix accept from this peer\n"
6170 "maximum no. of prefix limit\n"
6171 "Restart bgp connection after limit is exceeded\n"
6172 "Restart interval in minutes\n")
6176 int idx_number_2
= 5;
6177 return peer_maximum_prefix_set_vty(
6178 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6179 argv
[idx_number
]->arg
, NULL
, 0, argv
[idx_number_2
]->arg
);
6183 neighbor_maximum_prefix_restart
,
6184 neighbor_maximum_prefix_restart_hidden_cmd
,
6185 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) restart (1-65535)",
6186 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6187 "Maximum number of prefix accept from this peer\n"
6188 "maximum no. of prefix limit\n"
6189 "Restart bgp connection after limit is exceeded\n"
6190 "Restart interval in minutes\n")
6192 DEFUN (neighbor_maximum_prefix_threshold_restart
,
6193 neighbor_maximum_prefix_threshold_restart_cmd
,
6194 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) restart (1-65535)",
6197 "Maximum number of prefixes to accept from this peer\n"
6198 "maximum no. of prefix limit\n"
6199 "Threshold value (%) at which to generate a warning msg\n"
6200 "Restart bgp connection after limit is exceeded\n"
6201 "Restart interval in minutes\n")
6205 int idx_number_2
= 4;
6206 int idx_number_3
= 6;
6207 return peer_maximum_prefix_set_vty(
6208 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6209 argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
, 0,
6210 argv
[idx_number_3
]->arg
);
6214 neighbor_maximum_prefix_threshold_restart
,
6215 neighbor_maximum_prefix_threshold_restart_hidden_cmd
,
6216 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) restart (1-65535)",
6217 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6218 "Maximum number of prefixes to accept from this peer\n"
6219 "maximum no. of prefix limit\n"
6220 "Threshold value (%) at which to generate a warning msg\n"
6221 "Restart bgp connection after limit is exceeded\n"
6222 "Restart interval in minutes\n")
6224 DEFUN (no_neighbor_maximum_prefix
,
6225 no_neighbor_maximum_prefix_cmd
,
6226 "no neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix [(1-4294967295) [(1-100)] [restart (1-65535)] [warning-only]]",
6230 "Maximum number of prefixes to accept from this peer\n"
6231 "maximum no. of prefix limit\n"
6232 "Threshold value (%) at which to generate a warning msg\n"
6233 "Restart bgp connection after limit is exceeded\n"
6234 "Restart interval in minutes\n"
6235 "Only give warning message when limit is exceeded\n")
6238 return peer_maximum_prefix_unset_vty(vty
, argv
[idx_peer
]->arg
,
6240 bgp_node_safi(vty
));
6244 no_neighbor_maximum_prefix
, no_neighbor_maximum_prefix_hidden_cmd
,
6245 "no neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix [(1-4294967295) [(1-100)] [restart (1-65535)] [warning-only]]",
6246 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6247 "Maximum number of prefixes to accept from this peer\n"
6248 "maximum no. of prefix limit\n"
6249 "Threshold value (%) at which to generate a warning msg\n"
6250 "Restart bgp connection after limit is exceeded\n"
6251 "Restart interval in minutes\n"
6252 "Only give warning message when limit is exceeded\n")
6255 /* "neighbor allowas-in" */
6256 DEFUN (neighbor_allowas_in
,
6257 neighbor_allowas_in_cmd
,
6258 "neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
6261 "Accept as-path with my AS present in it\n"
6262 "Number of occurrences of AS number\n"
6263 "Only accept my AS in the as-path if the route was originated in my AS\n")
6266 int idx_number_origin
= 3;
6272 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6274 return CMD_WARNING_CONFIG_FAILED
;
6276 if (argc
<= idx_number_origin
)
6279 if (argv
[idx_number_origin
]->type
== WORD_TKN
)
6282 allow_num
= atoi(argv
[idx_number_origin
]->arg
);
6285 ret
= peer_allowas_in_set(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6288 return bgp_vty_return(vty
, ret
);
6292 neighbor_allowas_in
, neighbor_allowas_in_hidden_cmd
,
6293 "neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
6294 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6295 "Accept as-path with my AS present in it\n"
6296 "Number of occurrences of AS number\n"
6297 "Only accept my AS in the as-path if the route was originated in my AS\n")
6299 DEFUN (no_neighbor_allowas_in
,
6300 no_neighbor_allowas_in_cmd
,
6301 "no neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
6305 "allow local ASN appears in aspath attribute\n"
6306 "Number of occurrences of AS number\n"
6307 "Only accept my AS in the as-path if the route was originated in my AS\n")
6313 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6315 return CMD_WARNING_CONFIG_FAILED
;
6317 ret
= peer_allowas_in_unset(peer
, bgp_node_afi(vty
),
6318 bgp_node_safi(vty
));
6320 return bgp_vty_return(vty
, ret
);
6324 no_neighbor_allowas_in
, no_neighbor_allowas_in_hidden_cmd
,
6325 "no neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
6326 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6327 "allow local ASN appears in aspath attribute\n"
6328 "Number of occurrences of AS number\n"
6329 "Only accept my AS in the as-path if the route was originated in my AS\n")
6331 DEFUN (neighbor_ttl_security
,
6332 neighbor_ttl_security_cmd
,
6333 "neighbor <A.B.C.D|X:X::X:X|WORD> ttl-security hops (1-254)",
6336 "BGP ttl-security parameters\n"
6337 "Specify the maximum number of hops to the BGP peer\n"
6338 "Number of hops to BGP peer\n")
6345 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6347 return CMD_WARNING_CONFIG_FAILED
;
6349 gtsm_hops
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
6352 * If 'neighbor swpX', then this is for directly connected peers,
6353 * we should not accept a ttl-security hops value greater than 1.
6355 if (peer
->conf_if
&& (gtsm_hops
> 1)) {
6357 "%s is directly connected peer, hops cannot exceed 1\n",
6358 argv
[idx_peer
]->arg
);
6359 return CMD_WARNING_CONFIG_FAILED
;
6362 return bgp_vty_return(vty
, peer_ttl_security_hops_set(peer
, gtsm_hops
));
6365 DEFUN (no_neighbor_ttl_security
,
6366 no_neighbor_ttl_security_cmd
,
6367 "no neighbor <A.B.C.D|X:X::X:X|WORD> ttl-security hops (1-254)",
6371 "BGP ttl-security parameters\n"
6372 "Specify the maximum number of hops to the BGP peer\n"
6373 "Number of hops to BGP peer\n")
6378 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6380 return CMD_WARNING_CONFIG_FAILED
;
6382 return bgp_vty_return(vty
, peer_ttl_security_hops_unset(peer
));
6385 DEFUN (neighbor_addpath_tx_all_paths
,
6386 neighbor_addpath_tx_all_paths_cmd
,
6387 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
6390 "Use addpath to advertise all paths to a neighbor\n")
6395 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6397 return CMD_WARNING_CONFIG_FAILED
;
6399 bgp_addpath_set_peer_type(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6404 ALIAS_HIDDEN(neighbor_addpath_tx_all_paths
,
6405 neighbor_addpath_tx_all_paths_hidden_cmd
,
6406 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
6407 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6408 "Use addpath to advertise all paths to a neighbor\n")
6410 DEFUN (no_neighbor_addpath_tx_all_paths
,
6411 no_neighbor_addpath_tx_all_paths_cmd
,
6412 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
6416 "Use addpath to advertise all paths to a neighbor\n")
6421 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6423 return CMD_WARNING_CONFIG_FAILED
;
6425 if (peer
->addpath_type
[bgp_node_afi(vty
)][bgp_node_safi(vty
)]
6426 != BGP_ADDPATH_ALL
) {
6428 "%% Peer not currently configured to transmit all paths.");
6429 return CMD_WARNING_CONFIG_FAILED
;
6432 bgp_addpath_set_peer_type(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6438 ALIAS_HIDDEN(no_neighbor_addpath_tx_all_paths
,
6439 no_neighbor_addpath_tx_all_paths_hidden_cmd
,
6440 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
6441 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6442 "Use addpath to advertise all paths to a neighbor\n")
6444 DEFUN (neighbor_addpath_tx_bestpath_per_as
,
6445 neighbor_addpath_tx_bestpath_per_as_cmd
,
6446 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
6449 "Use addpath to advertise the bestpath per each neighboring AS\n")
6454 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6456 return CMD_WARNING_CONFIG_FAILED
;
6458 bgp_addpath_set_peer_type(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6459 BGP_ADDPATH_BEST_PER_AS
);
6464 ALIAS_HIDDEN(neighbor_addpath_tx_bestpath_per_as
,
6465 neighbor_addpath_tx_bestpath_per_as_hidden_cmd
,
6466 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
6467 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6468 "Use addpath to advertise the bestpath per each neighboring AS\n")
6470 DEFUN (no_neighbor_addpath_tx_bestpath_per_as
,
6471 no_neighbor_addpath_tx_bestpath_per_as_cmd
,
6472 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
6476 "Use addpath to advertise the bestpath per each neighboring AS\n")
6481 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6483 return CMD_WARNING_CONFIG_FAILED
;
6485 if (peer
->addpath_type
[bgp_node_afi(vty
)][bgp_node_safi(vty
)]
6486 != BGP_ADDPATH_BEST_PER_AS
) {
6488 "%% Peer not currently configured to transmit all best path per as.");
6489 return CMD_WARNING_CONFIG_FAILED
;
6492 bgp_addpath_set_peer_type(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6498 ALIAS_HIDDEN(no_neighbor_addpath_tx_bestpath_per_as
,
6499 no_neighbor_addpath_tx_bestpath_per_as_hidden_cmd
,
6500 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
6501 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6502 "Use addpath to advertise the bestpath per each neighboring AS\n")
6505 neighbor_aspath_loop_detection
, neighbor_aspath_loop_detection_cmd
,
6506 "neighbor <A.B.C.D|X:X::X:X|WORD>$neighbor sender-as-path-loop-detection",
6509 "Detect AS loops before sending to neighbor\n")
6513 peer
= peer_and_group_lookup_vty(vty
, neighbor
);
6515 return CMD_WARNING_CONFIG_FAILED
;
6517 peer
->as_path_loop_detection
= true;
6523 no_neighbor_aspath_loop_detection
,
6524 no_neighbor_aspath_loop_detection_cmd
,
6525 "no neighbor <A.B.C.D|X:X::X:X|WORD>$neighbor sender-as-path-loop-detection",
6529 "Detect AS loops before sending to neighbor\n")
6533 peer
= peer_and_group_lookup_vty(vty
, neighbor
);
6535 return CMD_WARNING_CONFIG_FAILED
;
6537 peer
->as_path_loop_detection
= false;
6542 static int set_ecom_list(struct vty
*vty
, int argc
, struct cmd_token
**argv
,
6543 struct ecommunity
**list
)
6545 struct ecommunity
*ecom
= NULL
;
6546 struct ecommunity
*ecomadd
;
6548 for (; argc
; --argc
, ++argv
) {
6550 ecomadd
= ecommunity_str2com(argv
[0]->arg
,
6551 ECOMMUNITY_ROUTE_TARGET
, 0);
6553 vty_out(vty
, "Malformed community-list value\n");
6555 ecommunity_free(&ecom
);
6556 return CMD_WARNING_CONFIG_FAILED
;
6560 ecommunity_merge(ecom
, ecomadd
);
6561 ecommunity_free(&ecomadd
);
6568 ecommunity_free(&*list
);
6576 * v2vimport is true if we are handling a `import vrf ...` command
6578 static afi_t
vpn_policy_getafi(struct vty
*vty
, struct bgp
*bgp
, bool v2vimport
)
6582 switch (vty
->node
) {
6591 "%% context error: valid only in address-family <ipv4|ipv6> unicast block\n");
6596 if (CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
6597 BGP_CONFIG_VRF_TO_VRF_IMPORT
)
6598 || CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
6599 BGP_CONFIG_VRF_TO_VRF_EXPORT
)) {
6601 "%% error: Please unconfigure import vrf commands before using vpn commands\n");
6605 if (CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
6606 BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT
)
6607 || CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
6608 BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT
)) {
6610 "%% error: Please unconfigure vpn to vrf commands before using import vrf commands\n");
6617 DEFPY (af_rd_vpn_export
,
6618 af_rd_vpn_export_cmd
,
6619 "[no] rd vpn export ASN:NN_OR_IP-ADDRESS:NN$rd_str",
6621 "Specify route distinguisher\n"
6622 "Between current address-family and vpn\n"
6623 "For routes leaked from current address-family to vpn\n"
6624 "Route Distinguisher (<as-number>:<number> | <ip-address>:<number>)\n")
6626 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6627 struct prefix_rd prd
;
6633 if (argv_find(argv
, argc
, "no", &idx
))
6637 ret
= str2prefix_rd(rd_str
, &prd
);
6639 vty_out(vty
, "%% Malformed rd\n");
6640 return CMD_WARNING_CONFIG_FAILED
;
6644 afi
= vpn_policy_getafi(vty
, bgp
, false);
6646 return CMD_WARNING_CONFIG_FAILED
;
6649 * pre-change: un-export vpn routes (vpn->vrf routes unaffected)
6651 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6652 bgp_get_default(), bgp
);
6655 bgp
->vpn_policy
[afi
].tovpn_rd
= prd
;
6656 SET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6657 BGP_VPN_POLICY_TOVPN_RD_SET
);
6659 UNSET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6660 BGP_VPN_POLICY_TOVPN_RD_SET
);
6663 /* post-change: re-export vpn routes */
6664 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6665 bgp_get_default(), bgp
);
6670 ALIAS (af_rd_vpn_export
,
6671 af_no_rd_vpn_export_cmd
,
6674 "Specify route distinguisher\n"
6675 "Between current address-family and vpn\n"
6676 "For routes leaked from current address-family to vpn\n")
6678 DEFPY (af_label_vpn_export
,
6679 af_label_vpn_export_cmd
,
6680 "[no] label vpn export <(0-1048575)$label_val|auto$label_auto>",
6682 "label value for VRF\n"
6683 "Between current address-family and vpn\n"
6684 "For routes leaked from current address-family to vpn\n"
6685 "Label Value <0-1048575>\n"
6686 "Automatically assign a label\n")
6688 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6689 mpls_label_t label
= MPLS_LABEL_NONE
;
6694 if (argv_find(argv
, argc
, "no", &idx
))
6697 /* If "no ...", squash trailing parameter */
6703 label
= label_val
; /* parser should force unsigned */
6706 afi
= vpn_policy_getafi(vty
, bgp
, false);
6708 return CMD_WARNING_CONFIG_FAILED
;
6711 if (label_auto
&& CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
6712 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
))
6717 * pre-change: un-export vpn routes (vpn->vrf routes unaffected)
6719 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6720 bgp_get_default(), bgp
);
6722 if (!label_auto
&& CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
6723 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
)) {
6725 if (bgp
->vpn_policy
[afi
].tovpn_label
!= MPLS_LABEL_NONE
) {
6728 * label has previously been automatically
6729 * assigned by labelpool: release it
6731 * NB if tovpn_label == MPLS_LABEL_NONE it
6732 * means the automatic assignment is in flight
6733 * and therefore the labelpool callback must
6734 * detect that the auto label is not needed.
6737 bgp_lp_release(LP_TYPE_VRF
,
6738 &bgp
->vpn_policy
[afi
],
6739 bgp
->vpn_policy
[afi
].tovpn_label
);
6741 UNSET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6742 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
);
6745 bgp
->vpn_policy
[afi
].tovpn_label
= label
;
6747 SET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6748 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
);
6749 bgp_lp_get(LP_TYPE_VRF
, &bgp
->vpn_policy
[afi
],
6750 vpn_leak_label_callback
);
6753 /* post-change: re-export vpn routes */
6754 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6755 bgp_get_default(), bgp
);
6760 ALIAS (af_label_vpn_export
,
6761 af_no_label_vpn_export_cmd
,
6762 "no label vpn export",
6764 "label value for VRF\n"
6765 "Between current address-family and vpn\n"
6766 "For routes leaked from current address-family to vpn\n")
6768 DEFPY (af_nexthop_vpn_export
,
6769 af_nexthop_vpn_export_cmd
,
6770 "[no] nexthop vpn export <A.B.C.D|X:X::X:X>$nexthop_str",
6772 "Specify next hop to use for VRF advertised prefixes\n"
6773 "Between current address-family and vpn\n"
6774 "For routes leaked from current address-family to vpn\n"
6778 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6784 if (argv_find(argv
, argc
, "no", &idx
))
6788 if (!sockunion2hostprefix(nexthop_str
, &p
))
6789 return CMD_WARNING_CONFIG_FAILED
;
6792 afi
= vpn_policy_getafi(vty
, bgp
, false);
6794 return CMD_WARNING_CONFIG_FAILED
;
6797 * pre-change: un-export vpn routes (vpn->vrf routes unaffected)
6799 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6800 bgp_get_default(), bgp
);
6803 bgp
->vpn_policy
[afi
].tovpn_nexthop
= p
;
6804 SET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6805 BGP_VPN_POLICY_TOVPN_NEXTHOP_SET
);
6807 UNSET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6808 BGP_VPN_POLICY_TOVPN_NEXTHOP_SET
);
6811 /* post-change: re-export vpn routes */
6812 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6813 bgp_get_default(), bgp
);
6818 ALIAS (af_nexthop_vpn_export
,
6819 af_no_nexthop_vpn_export_cmd
,
6820 "no nexthop vpn export",
6822 "Specify next hop to use for VRF advertised prefixes\n"
6823 "Between current address-family and vpn\n"
6824 "For routes leaked from current address-family to vpn\n")
6826 static int vpn_policy_getdirs(struct vty
*vty
, const char *dstr
, int *dodir
)
6828 if (!strcmp(dstr
, "import")) {
6829 dodir
[BGP_VPN_POLICY_DIR_FROMVPN
] = 1;
6830 } else if (!strcmp(dstr
, "export")) {
6831 dodir
[BGP_VPN_POLICY_DIR_TOVPN
] = 1;
6832 } else if (!strcmp(dstr
, "both")) {
6833 dodir
[BGP_VPN_POLICY_DIR_FROMVPN
] = 1;
6834 dodir
[BGP_VPN_POLICY_DIR_TOVPN
] = 1;
6836 vty_out(vty
, "%% direction parse error\n");
6837 return CMD_WARNING_CONFIG_FAILED
;
6842 DEFPY (af_rt_vpn_imexport
,
6843 af_rt_vpn_imexport_cmd
,
6844 "[no] <rt|route-target> vpn <import|export|both>$direction_str RTLIST...",
6846 "Specify route target list\n"
6847 "Specify route target list\n"
6848 "Between current address-family and vpn\n"
6849 "For routes leaked from vpn to current address-family: match any\n"
6850 "For routes leaked from current address-family to vpn: set\n"
6851 "both import: match any and export: set\n"
6852 "Space separated route target list (A.B.C.D:MN|EF:OPQR|GHJK:MN)\n")
6854 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6856 struct ecommunity
*ecom
= NULL
;
6857 int dodir
[BGP_VPN_POLICY_DIR_MAX
] = {0};
6858 vpn_policy_direction_t dir
;
6863 if (argv_find(argv
, argc
, "no", &idx
))
6866 afi
= vpn_policy_getafi(vty
, bgp
, false);
6868 return CMD_WARNING_CONFIG_FAILED
;
6870 ret
= vpn_policy_getdirs(vty
, direction_str
, dodir
);
6871 if (ret
!= CMD_SUCCESS
)
6875 if (!argv_find(argv
, argc
, "RTLIST", &idx
)) {
6876 vty_out(vty
, "%% Missing RTLIST\n");
6877 return CMD_WARNING_CONFIG_FAILED
;
6879 ret
= set_ecom_list(vty
, argc
- idx
, argv
+ idx
, &ecom
);
6880 if (ret
!= CMD_SUCCESS
) {
6885 for (dir
= 0; dir
< BGP_VPN_POLICY_DIR_MAX
; ++dir
) {
6889 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
6892 if (bgp
->vpn_policy
[afi
].rtlist
[dir
])
6894 &bgp
->vpn_policy
[afi
].rtlist
[dir
]);
6895 bgp
->vpn_policy
[afi
].rtlist
[dir
] =
6896 ecommunity_dup(ecom
);
6898 if (bgp
->vpn_policy
[afi
].rtlist
[dir
])
6900 &bgp
->vpn_policy
[afi
].rtlist
[dir
]);
6901 bgp
->vpn_policy
[afi
].rtlist
[dir
] = NULL
;
6904 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
6908 ecommunity_free(&ecom
);
6913 ALIAS (af_rt_vpn_imexport
,
6914 af_no_rt_vpn_imexport_cmd
,
6915 "no <rt|route-target> vpn <import|export|both>$direction_str",
6917 "Specify route target list\n"
6918 "Specify route target list\n"
6919 "Between current address-family and vpn\n"
6920 "For routes leaked from vpn to current address-family\n"
6921 "For routes leaked from current address-family to vpn\n"
6922 "both import and export\n")
6924 DEFPY (af_route_map_vpn_imexport
,
6925 af_route_map_vpn_imexport_cmd
,
6926 /* future: "route-map <vpn|evpn|vrf NAME> <import|export> RMAP" */
6927 "[no] route-map vpn <import|export>$direction_str RMAP$rmap_str",
6929 "Specify route map\n"
6930 "Between current address-family and vpn\n"
6931 "For routes leaked from vpn to current address-family\n"
6932 "For routes leaked from current address-family to vpn\n"
6933 "name of route-map\n")
6935 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6937 int dodir
[BGP_VPN_POLICY_DIR_MAX
] = {0};
6938 vpn_policy_direction_t dir
;
6943 if (argv_find(argv
, argc
, "no", &idx
))
6946 afi
= vpn_policy_getafi(vty
, bgp
, false);
6948 return CMD_WARNING_CONFIG_FAILED
;
6950 ret
= vpn_policy_getdirs(vty
, direction_str
, dodir
);
6951 if (ret
!= CMD_SUCCESS
)
6954 for (dir
= 0; dir
< BGP_VPN_POLICY_DIR_MAX
; ++dir
) {
6958 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
6961 if (bgp
->vpn_policy
[afi
].rmap_name
[dir
])
6962 XFREE(MTYPE_ROUTE_MAP_NAME
,
6963 bgp
->vpn_policy
[afi
].rmap_name
[dir
]);
6964 bgp
->vpn_policy
[afi
].rmap_name
[dir
] = XSTRDUP(
6965 MTYPE_ROUTE_MAP_NAME
, rmap_str
);
6966 bgp
->vpn_policy
[afi
].rmap
[dir
] =
6967 route_map_lookup_warn_noexist(vty
, rmap_str
);
6968 if (!bgp
->vpn_policy
[afi
].rmap
[dir
])
6971 if (bgp
->vpn_policy
[afi
].rmap_name
[dir
])
6972 XFREE(MTYPE_ROUTE_MAP_NAME
,
6973 bgp
->vpn_policy
[afi
].rmap_name
[dir
]);
6974 bgp
->vpn_policy
[afi
].rmap_name
[dir
] = NULL
;
6975 bgp
->vpn_policy
[afi
].rmap
[dir
] = NULL
;
6978 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
6984 ALIAS (af_route_map_vpn_imexport
,
6985 af_no_route_map_vpn_imexport_cmd
,
6986 "no route-map vpn <import|export>$direction_str",
6988 "Specify route map\n"
6989 "Between current address-family and vpn\n"
6990 "For routes leaked from vpn to current address-family\n"
6991 "For routes leaked from current address-family to vpn\n")
6993 DEFPY(af_import_vrf_route_map
, af_import_vrf_route_map_cmd
,
6994 "[no] import vrf route-map RMAP$rmap_str",
6996 "Import routes from another VRF\n"
6997 "Vrf routes being filtered\n"
6998 "Specify route map\n"
6999 "name of route-map\n")
7001 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
7002 vpn_policy_direction_t dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
7006 struct bgp
*bgp_default
;
7008 if (argv_find(argv
, argc
, "no", &idx
))
7011 afi
= vpn_policy_getafi(vty
, bgp
, true);
7013 return CMD_WARNING_CONFIG_FAILED
;
7015 bgp_default
= bgp_get_default();
7020 /* Auto-create assuming the same AS */
7021 ret
= bgp_get_vty(&bgp_default
, &as
, NULL
,
7022 BGP_INSTANCE_TYPE_DEFAULT
);
7026 "VRF default is not configured as a bgp instance\n");
7031 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
7034 if (bgp
->vpn_policy
[afi
].rmap_name
[dir
])
7035 XFREE(MTYPE_ROUTE_MAP_NAME
,
7036 bgp
->vpn_policy
[afi
].rmap_name
[dir
]);
7037 bgp
->vpn_policy
[afi
].rmap_name
[dir
] =
7038 XSTRDUP(MTYPE_ROUTE_MAP_NAME
, rmap_str
);
7039 bgp
->vpn_policy
[afi
].rmap
[dir
] =
7040 route_map_lookup_warn_noexist(vty
, rmap_str
);
7041 if (!bgp
->vpn_policy
[afi
].rmap
[dir
])
7044 if (bgp
->vpn_policy
[afi
].rmap_name
[dir
])
7045 XFREE(MTYPE_ROUTE_MAP_NAME
,
7046 bgp
->vpn_policy
[afi
].rmap_name
[dir
]);
7047 bgp
->vpn_policy
[afi
].rmap_name
[dir
] = NULL
;
7048 bgp
->vpn_policy
[afi
].rmap
[dir
] = NULL
;
7051 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
7056 ALIAS(af_import_vrf_route_map
, af_no_import_vrf_route_map_cmd
,
7057 "no import vrf route-map",
7059 "Import routes from another VRF\n"
7060 "Vrf routes being filtered\n"
7061 "Specify route map\n")
7063 DEFPY(bgp_imexport_vrf
, bgp_imexport_vrf_cmd
,
7064 "[no] import vrf VIEWVRFNAME$import_name",
7066 "Import routes from another VRF\n"
7067 "VRF to import from\n"
7068 "The name of the VRF\n")
7070 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
7071 struct listnode
*node
;
7072 struct bgp
*vrf_bgp
, *bgp_default
;
7075 bool remove
= false;
7078 enum bgp_instance_type bgp_type
= BGP_INSTANCE_TYPE_VRF
;
7082 if (import_name
== NULL
) {
7083 vty_out(vty
, "%% Missing import name\n");
7087 if (argv_find(argv
, argc
, "no", &idx
))
7090 afi
= vpn_policy_getafi(vty
, bgp
, true);
7092 return CMD_WARNING_CONFIG_FAILED
;
7094 safi
= bgp_node_safi(vty
);
7096 if (((BGP_INSTANCE_TYPE_DEFAULT
== bgp
->inst_type
)
7097 && (strcmp(import_name
, VRF_DEFAULT_NAME
) == 0))
7098 || (bgp
->name
&& (strcmp(import_name
, bgp
->name
) == 0))) {
7099 vty_out(vty
, "%% Cannot %s vrf %s into itself\n",
7100 remove
? "unimport" : "import", import_name
);
7104 bgp_default
= bgp_get_default();
7106 /* Auto-create assuming the same AS */
7107 ret
= bgp_get_vty(&bgp_default
, &as
, NULL
,
7108 BGP_INSTANCE_TYPE_DEFAULT
);
7112 "VRF default is not configured as a bgp instance\n");
7117 vrf_bgp
= bgp_lookup_by_name(import_name
);
7119 if (strcmp(import_name
, VRF_DEFAULT_NAME
) == 0)
7120 vrf_bgp
= bgp_default
;
7122 /* Auto-create assuming the same AS */
7123 ret
= bgp_get_vty(&vrf_bgp
, &as
, import_name
, bgp_type
);
7127 "VRF %s is not configured as a bgp instance\n",
7134 vrf_unimport_from_vrf(bgp
, vrf_bgp
, afi
, safi
);
7136 /* Already importing from "import_vrf"? */
7137 for (ALL_LIST_ELEMENTS_RO(bgp
->vpn_policy
[afi
].import_vrf
, node
,
7139 if (strcmp(vname
, import_name
) == 0)
7143 vrf_import_from_vrf(bgp
, vrf_bgp
, afi
, safi
);
7149 /* This command is valid only in a bgp vrf instance or the default instance */
7150 DEFPY (bgp_imexport_vpn
,
7151 bgp_imexport_vpn_cmd
,
7152 "[no] <import|export>$direction_str vpn",
7154 "Import routes to this address-family\n"
7155 "Export routes from this address-family\n"
7156 "to/from default instance VPN RIB\n")
7158 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
7165 vpn_policy_direction_t dir
;
7167 if (argv_find(argv
, argc
, "no", &idx
))
7170 if (BGP_INSTANCE_TYPE_VRF
!= bgp
->inst_type
&&
7171 BGP_INSTANCE_TYPE_DEFAULT
!= bgp
->inst_type
) {
7173 vty_out(vty
, "%% import|export vpn valid only for bgp vrf or default instance\n");
7174 return CMD_WARNING_CONFIG_FAILED
;
7177 afi
= bgp_node_afi(vty
);
7178 safi
= bgp_node_safi(vty
);
7179 if ((SAFI_UNICAST
!= safi
) || ((AFI_IP
!= afi
) && (AFI_IP6
!= afi
))) {
7180 vty_out(vty
, "%% import|export vpn valid only for unicast ipv4|ipv6\n");
7181 return CMD_WARNING_CONFIG_FAILED
;
7184 if (!strcmp(direction_str
, "import")) {
7185 flag
= BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT
;
7186 dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
7187 } else if (!strcmp(direction_str
, "export")) {
7188 flag
= BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT
;
7189 dir
= BGP_VPN_POLICY_DIR_TOVPN
;
7191 vty_out(vty
, "%% unknown direction %s\n", direction_str
);
7192 return CMD_WARNING_CONFIG_FAILED
;
7195 previous_state
= CHECK_FLAG(bgp
->af_flags
[afi
][safi
], flag
);
7198 SET_FLAG(bgp
->af_flags
[afi
][safi
], flag
);
7199 if (!previous_state
) {
7200 /* trigger export current vrf */
7201 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
7204 if (previous_state
) {
7205 /* trigger un-export current vrf */
7206 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
7208 UNSET_FLAG(bgp
->af_flags
[afi
][safi
], flag
);
7214 DEFPY (af_routetarget_import
,
7215 af_routetarget_import_cmd
,
7216 "[no] <rt|route-target> redirect import RTLIST...",
7218 "Specify route target list\n"
7219 "Specify route target list\n"
7220 "Flow-spec redirect type route target\n"
7221 "Import routes to this address-family\n"
7222 "Space separated route target list (A.B.C.D:MN|EF:OPQR|GHJK:MN)\n")
7224 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
7226 struct ecommunity
*ecom
= NULL
;
7231 if (argv_find(argv
, argc
, "no", &idx
))
7234 afi
= vpn_policy_getafi(vty
, bgp
, false);
7236 return CMD_WARNING_CONFIG_FAILED
;
7239 if (!argv_find(argv
, argc
, "RTLIST", &idx
)) {
7240 vty_out(vty
, "%% Missing RTLIST\n");
7241 return CMD_WARNING_CONFIG_FAILED
;
7243 ret
= set_ecom_list(vty
, argc
- idx
, argv
+ idx
, &ecom
);
7244 if (ret
!= CMD_SUCCESS
)
7249 if (bgp
->vpn_policy
[afi
].import_redirect_rtlist
)
7250 ecommunity_free(&bgp
->vpn_policy
[afi
]
7251 .import_redirect_rtlist
);
7252 bgp
->vpn_policy
[afi
].import_redirect_rtlist
=
7253 ecommunity_dup(ecom
);
7255 if (bgp
->vpn_policy
[afi
].import_redirect_rtlist
)
7256 ecommunity_free(&bgp
->vpn_policy
[afi
]
7257 .import_redirect_rtlist
);
7258 bgp
->vpn_policy
[afi
].import_redirect_rtlist
= NULL
;
7262 ecommunity_free(&ecom
);
7267 DEFUN_NOSH (address_family_ipv4_safi
,
7268 address_family_ipv4_safi_cmd
,
7269 "address-family ipv4 [<unicast|multicast|vpn|labeled-unicast|flowspec>]",
7270 "Enter Address Family command mode\n"
7272 BGP_SAFI_WITH_LABEL_HELP_STR
)
7276 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
7277 safi_t safi
= bgp_vty_safi_from_str(argv
[2]->text
);
7278 if (bgp
->inst_type
!= BGP_INSTANCE_TYPE_DEFAULT
7279 && safi
!= SAFI_UNICAST
&& safi
!= SAFI_MULTICAST
7280 && safi
!= SAFI_EVPN
) {
7282 "Only Unicast/Multicast/EVPN SAFIs supported in non-core instances.\n");
7283 return CMD_WARNING_CONFIG_FAILED
;
7285 vty
->node
= bgp_node_type(AFI_IP
, safi
);
7287 vty
->node
= BGP_IPV4_NODE
;
7292 DEFUN_NOSH (address_family_ipv6_safi
,
7293 address_family_ipv6_safi_cmd
,
7294 "address-family ipv6 [<unicast|multicast|vpn|labeled-unicast|flowspec>]",
7295 "Enter Address Family command mode\n"
7297 BGP_SAFI_WITH_LABEL_HELP_STR
)
7300 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
7301 safi_t safi
= bgp_vty_safi_from_str(argv
[2]->text
);
7302 if (bgp
->inst_type
!= BGP_INSTANCE_TYPE_DEFAULT
7303 && safi
!= SAFI_UNICAST
&& safi
!= SAFI_MULTICAST
7304 && safi
!= SAFI_EVPN
) {
7306 "Only Unicast/Multicast/EVPN SAFIs supported in non-core instances.\n");
7307 return CMD_WARNING_CONFIG_FAILED
;
7309 vty
->node
= bgp_node_type(AFI_IP6
, safi
);
7311 vty
->node
= BGP_IPV6_NODE
;
7316 #ifdef KEEP_OLD_VPN_COMMANDS
7317 DEFUN_NOSH (address_family_vpnv4
,
7318 address_family_vpnv4_cmd
,
7319 "address-family vpnv4 [unicast]",
7320 "Enter Address Family command mode\n"
7322 "Address Family modifier\n")
7324 vty
->node
= BGP_VPNV4_NODE
;
7328 DEFUN_NOSH (address_family_vpnv6
,
7329 address_family_vpnv6_cmd
,
7330 "address-family vpnv6 [unicast]",
7331 "Enter Address Family command mode\n"
7333 "Address Family modifier\n")
7335 vty
->node
= BGP_VPNV6_NODE
;
7338 #endif /* KEEP_OLD_VPN_COMMANDS */
7340 DEFUN_NOSH (address_family_evpn
,
7341 address_family_evpn_cmd
,
7342 "address-family l2vpn evpn",
7343 "Enter Address Family command mode\n"
7345 "Address Family modifier\n")
7347 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
7348 vty
->node
= BGP_EVPN_NODE
;
7352 DEFUN_NOSH (exit_address_family
,
7353 exit_address_family_cmd
,
7354 "exit-address-family",
7355 "Exit from Address Family configuration mode\n")
7357 if (vty
->node
== BGP_IPV4_NODE
|| vty
->node
== BGP_IPV4M_NODE
7358 || vty
->node
== BGP_IPV4L_NODE
|| vty
->node
== BGP_VPNV4_NODE
7359 || vty
->node
== BGP_IPV6_NODE
|| vty
->node
== BGP_IPV6M_NODE
7360 || vty
->node
== BGP_IPV6L_NODE
|| vty
->node
== BGP_VPNV6_NODE
7361 || vty
->node
== BGP_EVPN_NODE
7362 || vty
->node
== BGP_FLOWSPECV4_NODE
7363 || vty
->node
== BGP_FLOWSPECV6_NODE
)
7364 vty
->node
= BGP_NODE
;
7368 /* Recalculate bestpath and re-advertise a prefix */
7369 static int bgp_clear_prefix(struct vty
*vty
, const char *view_name
,
7370 const char *ip_str
, afi_t afi
, safi_t safi
,
7371 struct prefix_rd
*prd
)
7374 struct prefix match
;
7375 struct bgp_node
*rn
;
7376 struct bgp_node
*rm
;
7378 struct bgp_table
*table
;
7379 struct bgp_table
*rib
;
7381 /* BGP structure lookup. */
7383 bgp
= bgp_lookup_by_name(view_name
);
7385 vty_out(vty
, "%% Can't find BGP instance %s\n",
7390 bgp
= bgp_get_default();
7392 vty_out(vty
, "%% No BGP process is configured\n");
7397 /* Check IP address argument. */
7398 ret
= str2prefix(ip_str
, &match
);
7400 vty_out(vty
, "%% address is malformed\n");
7404 match
.family
= afi2family(afi
);
7405 rib
= bgp
->rib
[afi
][safi
];
7407 if (safi
== SAFI_MPLS_VPN
) {
7408 for (rn
= bgp_table_top(rib
); rn
; rn
= bgp_route_next(rn
)) {
7409 if (prd
&& memcmp(rn
->p
.u
.val
, prd
->val
, 8) != 0)
7412 table
= bgp_node_get_bgp_table_info(rn
);
7413 if (table
!= NULL
) {
7415 if ((rm
= bgp_node_match(table
, &match
))
7418 == match
.prefixlen
) {
7420 BGP_NODE_USER_CLEAR
);
7421 bgp_process(bgp
, rm
, afi
, safi
);
7423 bgp_unlock_node(rm
);
7428 if ((rn
= bgp_node_match(rib
, &match
)) != NULL
) {
7429 if (rn
->p
.prefixlen
== match
.prefixlen
) {
7430 SET_FLAG(rn
->flags
, BGP_NODE_USER_CLEAR
);
7431 bgp_process(bgp
, rn
, afi
, safi
);
7433 bgp_unlock_node(rn
);
7440 /* one clear bgp command to rule them all */
7441 DEFUN (clear_ip_bgp_all
,
7442 clear_ip_bgp_all_cmd
,
7443 "clear [ip] bgp [<view|vrf> VIEWVRFNAME] [<ipv4|ipv6|l2vpn> [<unicast|multicast|vpn|labeled-unicast|flowspec|evpn>]] <*|A.B.C.D$neighbor|X:X::X:X$neighbor|WORD$neighbor|(1-4294967295)|external|peer-group PGNAME> [<soft [<in|out>]|in [prefix-filter]|out>]",
7447 BGP_INSTANCE_HELP_STR
7450 BGP_SAFI_WITH_LABEL_HELP_STR
7451 "Address Family modifier\n"
7453 "BGP IPv4 neighbor to clear\n"
7454 "BGP IPv6 neighbor to clear\n"
7455 "BGP neighbor on interface to clear\n"
7456 "Clear peers with the AS number\n"
7457 "Clear all external peers\n"
7458 "Clear all members of peer-group\n"
7459 "BGP peer-group name\n"
7464 "Push out prefix-list ORF and do inbound soft reconfig\n"
7469 afi_t afi
= AFI_UNSPEC
;
7470 safi_t safi
= SAFI_UNSPEC
;
7471 enum clear_sort clr_sort
= clear_peer
;
7472 enum bgp_clear_type clr_type
;
7473 char *clr_arg
= NULL
;
7477 /* clear [ip] bgp */
7478 if (argv_find(argv
, argc
, "ip", &idx
))
7481 /* [<vrf> VIEWVRFNAME] */
7482 if (argv_find(argv
, argc
, "vrf", &idx
)) {
7483 vrf
= argv
[idx
+ 1]->arg
;
7485 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
7487 } else if (argv_find(argv
, argc
, "view", &idx
)) {
7488 /* [<view> VIEWVRFNAME] */
7489 vrf
= argv
[idx
+ 1]->arg
;
7492 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
7493 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
))
7494 argv_find_and_parse_safi(argv
, argc
, &idx
, &safi
);
7496 /* <*|A.B.C.D|X:X::X:X|WORD|(1-4294967295)|external|peer-group PGNAME> */
7497 if (argv_find(argv
, argc
, "*", &idx
)) {
7498 clr_sort
= clear_all
;
7499 } else if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7500 clr_sort
= clear_peer
;
7501 clr_arg
= argv
[idx
]->arg
;
7502 } else if (argv_find(argv
, argc
, "X:X::X:X", &idx
)) {
7503 clr_sort
= clear_peer
;
7504 clr_arg
= argv
[idx
]->arg
;
7505 } else if (argv_find(argv
, argc
, "peer-group", &idx
)) {
7506 clr_sort
= clear_group
;
7508 clr_arg
= argv
[idx
]->arg
;
7509 } else if (argv_find(argv
, argc
, "PGNAME", &idx
)) {
7510 clr_sort
= clear_peer
;
7511 clr_arg
= argv
[idx
]->arg
;
7512 } else if (argv_find(argv
, argc
, "WORD", &idx
)) {
7513 clr_sort
= clear_peer
;
7514 clr_arg
= argv
[idx
]->arg
;
7515 } else if (argv_find(argv
, argc
, "(1-4294967295)", &idx
)) {
7516 clr_sort
= clear_as
;
7517 clr_arg
= argv
[idx
]->arg
;
7518 } else if (argv_find(argv
, argc
, "external", &idx
)) {
7519 clr_sort
= clear_external
;
7522 /* [<soft [<in|out>]|in [prefix-filter]|out>] */
7523 if (argv_find(argv
, argc
, "soft", &idx
)) {
7524 if (argv_find(argv
, argc
, "in", &idx
)
7525 || argv_find(argv
, argc
, "out", &idx
))
7526 clr_type
= strmatch(argv
[idx
]->text
, "in")
7528 : BGP_CLEAR_SOFT_OUT
;
7530 clr_type
= BGP_CLEAR_SOFT_BOTH
;
7531 } else if (argv_find(argv
, argc
, "in", &idx
)) {
7532 clr_type
= argv_find(argv
, argc
, "prefix-filter", &idx
)
7533 ? BGP_CLEAR_SOFT_IN_ORF_PREFIX
7534 : BGP_CLEAR_SOFT_IN
;
7535 } else if (argv_find(argv
, argc
, "out", &idx
)) {
7536 clr_type
= BGP_CLEAR_SOFT_OUT
;
7538 clr_type
= BGP_CLEAR_SOFT_NONE
;
7540 return bgp_clear_vty(vty
, vrf
, afi
, safi
, clr_sort
, clr_type
, clr_arg
);
7543 DEFUN (clear_ip_bgp_prefix
,
7544 clear_ip_bgp_prefix_cmd
,
7545 "clear [ip] bgp [<view|vrf> VIEWVRFNAME] prefix A.B.C.D/M",
7549 BGP_INSTANCE_HELP_STR
7550 "Clear bestpath and re-advertise\n"
7554 char *prefix
= NULL
;
7558 /* [<view|vrf> VIEWVRFNAME] */
7559 if (argv_find(argv
, argc
, "vrf", &idx
)) {
7560 vrf
= argv
[idx
+ 1]->arg
;
7562 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
7564 } else if (argv_find(argv
, argc
, "view", &idx
)) {
7565 /* [<view> VIEWVRFNAME] */
7566 vrf
= argv
[idx
+ 1]->arg
;
7570 prefix
= argv
[argc
- 1]->arg
;
7572 return bgp_clear_prefix(vty
, vrf
, prefix
, AFI_IP
, SAFI_UNICAST
, NULL
);
7575 DEFUN (clear_bgp_ipv6_safi_prefix
,
7576 clear_bgp_ipv6_safi_prefix_cmd
,
7577 "clear [ip] bgp ipv6 "BGP_SAFI_CMD_STR
" prefix X:X::X:X/M",
7583 "Clear bestpath and re-advertise\n"
7587 int idx_ipv6_prefix
= 0;
7588 safi_t safi
= SAFI_UNICAST
;
7589 char *prefix
= argv_find(argv
, argc
, "X:X::X:X/M", &idx_ipv6_prefix
) ?
7590 argv
[idx_ipv6_prefix
]->arg
: NULL
;
7592 argv_find_and_parse_safi(argv
, argc
, &idx_safi
, &safi
);
7593 return bgp_clear_prefix(
7594 vty
, NULL
, prefix
, AFI_IP6
,
7598 DEFUN (clear_bgp_instance_ipv6_safi_prefix
,
7599 clear_bgp_instance_ipv6_safi_prefix_cmd
,
7600 "clear [ip] bgp <view|vrf> VIEWVRFNAME ipv6 "BGP_SAFI_CMD_STR
" prefix X:X::X:X/M",
7604 BGP_INSTANCE_HELP_STR
7607 "Clear bestpath and re-advertise\n"
7611 int idx_vrfview
= 0;
7612 int idx_ipv6_prefix
= 0;
7613 safi_t safi
= SAFI_UNICAST
;
7614 char *prefix
= argv_find(argv
, argc
, "X:X::X:X/M", &idx_ipv6_prefix
) ?
7615 argv
[idx_ipv6_prefix
]->arg
: NULL
;
7616 char *vrfview
= NULL
;
7618 /* [<view|vrf> VIEWVRFNAME] */
7619 if (argv_find(argv
, argc
, "vrf", &idx_vrfview
)) {
7620 vrfview
= argv
[idx_vrfview
+ 1]->arg
;
7621 if (vrfview
&& strmatch(vrfview
, VRF_DEFAULT_NAME
))
7623 } else if (argv_find(argv
, argc
, "view", &idx_vrfview
)) {
7624 /* [<view> VIEWVRFNAME] */
7625 vrfview
= argv
[idx_vrfview
+ 1]->arg
;
7627 argv_find_and_parse_safi(argv
, argc
, &idx_safi
, &safi
);
7629 return bgp_clear_prefix(
7630 vty
, vrfview
, prefix
,
7631 AFI_IP6
, safi
, NULL
);
7634 DEFUN (show_bgp_views
,
7636 "show [ip] bgp views",
7640 "Show the defined BGP views\n")
7642 struct list
*inst
= bm
->bgp
;
7643 struct listnode
*node
;
7646 vty_out(vty
, "Defined BGP views:\n");
7647 for (ALL_LIST_ELEMENTS_RO(inst
, node
, bgp
)) {
7649 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_VRF
)
7651 vty_out(vty
, "\t%s (AS%u)\n", bgp
->name
? bgp
->name
: "(null)",
7658 DEFUN (show_bgp_vrfs
,
7660 "show [ip] bgp vrfs [json]",
7667 char buf
[ETHER_ADDR_STRLEN
];
7668 struct list
*inst
= bm
->bgp
;
7669 struct listnode
*node
;
7671 bool uj
= use_json(argc
, argv
);
7672 json_object
*json
= NULL
;
7673 json_object
*json_vrfs
= NULL
;
7677 json
= json_object_new_object();
7678 json_vrfs
= json_object_new_object();
7681 for (ALL_LIST_ELEMENTS_RO(inst
, node
, bgp
)) {
7682 const char *name
, *type
;
7684 struct listnode
*node2
, *nnode2
;
7685 int peers_cfg
, peers_estb
;
7686 json_object
*json_vrf
= NULL
;
7689 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_VIEW
)
7693 if (!uj
&& count
== 1) {
7695 "%4s %-5s %-16s %9s %10s %-37s\n",
7696 "Type", "Id", "routerId", "#PeersCfg",
7697 "#PeersEstb", "Name");
7698 vty_out(vty
, "%11s %-16s %-21s %-6s\n", " ",
7699 "L3-VNI", "RouterMAC", "Interface");
7702 peers_cfg
= peers_estb
= 0;
7704 json_vrf
= json_object_new_object();
7707 for (ALL_LIST_ELEMENTS(bgp
->peer
, node2
, nnode2
, peer
)) {
7708 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
7711 if (peer
->status
== Established
)
7715 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
) {
7716 name
= VRF_DEFAULT_NAME
;
7725 int64_t vrf_id_ui
= (bgp
->vrf_id
== VRF_UNKNOWN
)
7727 : (int64_t)bgp
->vrf_id
;
7728 json_object_string_add(json_vrf
, "type", type
);
7729 json_object_int_add(json_vrf
, "vrfId", vrf_id_ui
);
7730 json_object_string_add(json_vrf
, "routerId",
7731 inet_ntoa(bgp
->router_id
));
7732 json_object_int_add(json_vrf
, "numConfiguredPeers",
7734 json_object_int_add(json_vrf
, "numEstablishedPeers",
7737 json_object_int_add(json_vrf
, "l3vni", bgp
->l3vni
);
7738 json_object_string_add(
7740 prefix_mac2str(&bgp
->rmac
, buf
, sizeof(buf
)));
7741 json_object_string_add(json_vrf
, "interface",
7742 ifindex2ifname(bgp
->l3vni_svi_ifindex
,
7744 json_object_object_add(json_vrfs
, name
, json_vrf
);
7747 "%4s %-5d %-16s %-9u %-10u %-37s\n",
7749 bgp
->vrf_id
== VRF_UNKNOWN
? -1
7751 inet_ntoa(bgp
->router_id
), peers_cfg
,
7753 vty_out(vty
,"%11s %-16u %-21s %-20s\n", " ",
7755 prefix_mac2str(&bgp
->rmac
, buf
, sizeof(buf
)),
7756 ifindex2ifname(bgp
->l3vni_svi_ifindex
,
7762 json_object_object_add(json
, "vrfs", json_vrfs
);
7764 json_object_int_add(json
, "totalVrfs", count
);
7766 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
7767 json
, JSON_C_TO_STRING_PRETTY
));
7768 json_object_free(json
);
7772 "\nTotal number of VRFs (including default): %d\n",
7779 DEFUN (show_bgp_mac_hash
,
7780 show_bgp_mac_hash_cmd
,
7781 "show bgp mac hash",
7785 "Mac Address database\n")
7787 bgp_mac_dump_table(vty
);
7792 static void show_tip_entry(struct hash_bucket
*bucket
, void *args
)
7794 struct vty
*vty
= (struct vty
*)args
;
7795 struct tip_addr
*tip
= (struct tip_addr
*)bucket
->data
;
7797 vty_out(vty
, "addr: %s, count: %d\n", inet_ntoa(tip
->addr
),
7801 static void bgp_show_martian_nexthops(struct vty
*vty
, struct bgp
*bgp
)
7803 vty_out(vty
, "self nexthop database:\n");
7804 bgp_nexthop_show_address_hash(vty
, bgp
);
7806 vty_out(vty
, "Tunnel-ip database:\n");
7807 hash_iterate(bgp
->tip_hash
,
7808 (void (*)(struct hash_bucket
*, void *))show_tip_entry
,
7812 DEFUN(show_bgp_martian_nexthop_db
, show_bgp_martian_nexthop_db_cmd
,
7813 "show bgp [<view|vrf> VIEWVRFNAME] martian next-hop",
7814 SHOW_STR BGP_STR BGP_INSTANCE_HELP_STR
7815 "martian next-hops\n"
7816 "martian next-hop database\n")
7818 struct bgp
*bgp
= NULL
;
7822 /* [<vrf> VIEWVRFNAME] */
7823 if (argv_find(argv
, argc
, "vrf", &idx
)) {
7824 name
= argv
[idx
+ 1]->arg
;
7825 if (name
&& strmatch(name
, VRF_DEFAULT_NAME
))
7827 } else if (argv_find(argv
, argc
, "view", &idx
))
7828 /* [<view> VIEWVRFNAME] */
7829 name
= argv
[idx
+ 1]->arg
;
7831 bgp
= bgp_lookup_by_name(name
);
7833 bgp
= bgp_get_default();
7836 vty_out(vty
, "%% No BGP process is configured\n");
7839 bgp_show_martian_nexthops(vty
, bgp
);
7844 DEFUN (show_bgp_memory
,
7845 show_bgp_memory_cmd
,
7846 "show [ip] bgp memory",
7850 "Global BGP memory statistics\n")
7852 char memstrbuf
[MTYPE_MEMSTR_LEN
];
7853 unsigned long count
;
7855 /* RIB related usage stats */
7856 count
= mtype_stats_alloc(MTYPE_BGP_NODE
);
7857 vty_out(vty
, "%ld RIB nodes, using %s of memory\n", count
,
7858 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7859 count
* sizeof(struct bgp_node
)));
7861 count
= mtype_stats_alloc(MTYPE_BGP_ROUTE
);
7862 vty_out(vty
, "%ld BGP routes, using %s of memory\n", count
,
7863 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7864 count
* sizeof(struct bgp_path_info
)));
7865 if ((count
= mtype_stats_alloc(MTYPE_BGP_ROUTE_EXTRA
)))
7866 vty_out(vty
, "%ld BGP route ancillaries, using %s of memory\n",
7869 memstrbuf
, sizeof(memstrbuf
),
7870 count
* sizeof(struct bgp_path_info_extra
)));
7872 if ((count
= mtype_stats_alloc(MTYPE_BGP_STATIC
)))
7873 vty_out(vty
, "%ld Static routes, using %s of memory\n", count
,
7874 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7875 count
* sizeof(struct bgp_static
)));
7877 if ((count
= mtype_stats_alloc(MTYPE_BGP_PACKET
)))
7878 vty_out(vty
, "%ld Packets, using %s of memory\n", count
,
7879 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7880 count
* sizeof(struct bpacket
)));
7883 if ((count
= mtype_stats_alloc(MTYPE_BGP_ADJ_IN
)))
7884 vty_out(vty
, "%ld Adj-In entries, using %s of memory\n", count
,
7885 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7886 count
* sizeof(struct bgp_adj_in
)));
7887 if ((count
= mtype_stats_alloc(MTYPE_BGP_ADJ_OUT
)))
7888 vty_out(vty
, "%ld Adj-Out entries, using %s of memory\n", count
,
7889 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7890 count
* sizeof(struct bgp_adj_out
)));
7892 if ((count
= mtype_stats_alloc(MTYPE_BGP_NEXTHOP_CACHE
)))
7893 vty_out(vty
, "%ld Nexthop cache entries, using %s of memory\n",
7895 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7896 count
* sizeof(struct bgp_nexthop_cache
)));
7898 if ((count
= mtype_stats_alloc(MTYPE_BGP_DAMP_INFO
)))
7899 vty_out(vty
, "%ld Dampening entries, using %s of memory\n",
7901 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7902 count
* sizeof(struct bgp_damp_info
)));
7905 count
= attr_count();
7906 vty_out(vty
, "%ld BGP attributes, using %s of memory\n", count
,
7907 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7908 count
* sizeof(struct attr
)));
7910 if ((count
= attr_unknown_count()))
7911 vty_out(vty
, "%ld unknown attributes\n", count
);
7913 /* AS_PATH attributes */
7914 count
= aspath_count();
7915 vty_out(vty
, "%ld BGP AS-PATH entries, using %s of memory\n", count
,
7916 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7917 count
* sizeof(struct aspath
)));
7919 count
= mtype_stats_alloc(MTYPE_AS_SEG
);
7920 vty_out(vty
, "%ld BGP AS-PATH segments, using %s of memory\n", count
,
7921 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7922 count
* sizeof(struct assegment
)));
7924 /* Other attributes */
7925 if ((count
= community_count()))
7926 vty_out(vty
, "%ld BGP community entries, using %s of memory\n",
7927 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7928 count
* sizeof(struct community
)));
7929 if ((count
= mtype_stats_alloc(MTYPE_ECOMMUNITY
)))
7930 vty_out(vty
, "%ld BGP community entries, using %s of memory\n",
7931 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7932 count
* sizeof(struct ecommunity
)));
7933 if ((count
= mtype_stats_alloc(MTYPE_LCOMMUNITY
)))
7935 "%ld BGP large-community entries, using %s of memory\n",
7936 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7937 count
* sizeof(struct lcommunity
)));
7939 if ((count
= mtype_stats_alloc(MTYPE_CLUSTER
)))
7940 vty_out(vty
, "%ld Cluster lists, using %s of memory\n", count
,
7941 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7942 count
* sizeof(struct cluster_list
)));
7944 /* Peer related usage */
7945 count
= mtype_stats_alloc(MTYPE_BGP_PEER
);
7946 vty_out(vty
, "%ld peers, using %s of memory\n", count
,
7947 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7948 count
* sizeof(struct peer
)));
7950 if ((count
= mtype_stats_alloc(MTYPE_PEER_GROUP
)))
7951 vty_out(vty
, "%ld peer groups, using %s of memory\n", count
,
7952 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7953 count
* sizeof(struct peer_group
)));
7956 if ((count
= mtype_stats_alloc(MTYPE_BGP_REGEXP
)))
7957 vty_out(vty
, "%ld compiled regexes, using %s of memory\n",
7958 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7959 count
* sizeof(regex_t
)));
7963 static void bgp_show_bestpath_json(struct bgp
*bgp
, json_object
*json
)
7965 json_object
*bestpath
= json_object_new_object();
7967 if (bgp_flag_check(bgp
, BGP_FLAG_ASPATH_IGNORE
))
7968 json_object_string_add(bestpath
, "asPath", "ignore");
7970 if (bgp_flag_check(bgp
, BGP_FLAG_ASPATH_CONFED
))
7971 json_object_string_add(bestpath
, "asPath", "confed");
7973 if (bgp_flag_check(bgp
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
)) {
7974 if (bgp_flag_check(bgp
, BGP_FLAG_MULTIPATH_RELAX_AS_SET
))
7975 json_object_string_add(bestpath
, "multiPathRelax",
7978 json_object_string_add(bestpath
, "multiPathRelax",
7981 json_object_string_add(bestpath
, "multiPathRelax", "false");
7983 if (bgp_flag_check(bgp
, BGP_FLAG_COMPARE_ROUTER_ID
))
7984 json_object_string_add(bestpath
, "compareRouterId", "true");
7985 if (bgp_flag_check(bgp
, BGP_FLAG_MED_CONFED
)
7986 || bgp_flag_check(bgp
, BGP_FLAG_MED_MISSING_AS_WORST
)) {
7987 if (bgp_flag_check(bgp
, BGP_FLAG_MED_CONFED
))
7988 json_object_string_add(bestpath
, "med", "confed");
7989 if (bgp_flag_check(bgp
, BGP_FLAG_MED_MISSING_AS_WORST
))
7990 json_object_string_add(bestpath
, "med",
7991 "missing-as-worst");
7993 json_object_string_add(bestpath
, "med", "true");
7996 json_object_object_add(json
, "bestPath", bestpath
);
7999 /* Print the error code/subcode for why the peer is down */
8000 static void bgp_show_peer_reset(struct vty
* vty
, struct peer
*peer
,
8001 json_object
*json_peer
, bool use_json
)
8003 const char *code_str
;
8004 const char *subcode_str
;
8007 if (peer
->last_reset
== PEER_DOWN_NOTIFY_SEND
8008 || peer
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
) {
8009 char errorcodesubcode_hexstr
[5];
8010 char errorcodesubcode_str
[256];
8012 code_str
= bgp_notify_code_str(peer
->notify
.code
);
8013 subcode_str
= bgp_notify_subcode_str(
8015 peer
->notify
.subcode
);
8017 sprintf(errorcodesubcode_hexstr
, "%02X%02X",
8018 peer
->notify
.code
, peer
->notify
.subcode
);
8019 json_object_string_add(json_peer
,
8020 "lastErrorCodeSubcode",
8021 errorcodesubcode_hexstr
);
8022 snprintf(errorcodesubcode_str
, 255, "%s%s",
8023 code_str
, subcode_str
);
8024 json_object_string_add(json_peer
,
8025 "lastNotificationReason",
8026 errorcodesubcode_str
);
8027 if (peer
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
8028 && peer
->notify
.code
== BGP_NOTIFY_CEASE
8029 && (peer
->notify
.subcode
8030 == BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
8031 || peer
->notify
.subcode
8032 == BGP_NOTIFY_CEASE_ADMIN_RESET
)
8033 && peer
->notify
.length
) {
8035 const char *msg_str
;
8037 msg_str
= bgp_notify_admin_message(
8038 msgbuf
, sizeof(msgbuf
),
8039 (uint8_t *)peer
->notify
.data
,
8040 peer
->notify
.length
);
8042 json_object_string_add(
8044 "lastShutdownDescription",
8049 json_object_string_add(json_peer
, "lastResetDueTo",
8050 peer_down_str
[(int)peer
->last_reset
]);
8051 json_object_int_add(json_peer
, "lastResetCode",
8054 if (peer
->last_reset
== PEER_DOWN_NOTIFY_SEND
8055 || peer
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
) {
8056 code_str
= bgp_notify_code_str(peer
->notify
.code
);
8058 bgp_notify_subcode_str(peer
->notify
.code
,
8059 peer
->notify
.subcode
);
8060 vty_out(vty
, " Notification %s (%s%s)\n",
8061 peer
->last_reset
== PEER_DOWN_NOTIFY_SEND
8064 code_str
, subcode_str
);
8066 vty_out(vty
, " %s\n",
8067 peer_down_str
[(int)peer
->last_reset
]);
8072 static inline bool bgp_has_peer_failed(struct peer
*peer
, afi_t afi
,
8075 return ((peer
->status
!= Established
) ||
8076 !peer
->afc_recv
[afi
][safi
]);
8079 static void bgp_show_failed_summary(struct vty
*vty
, struct bgp
*bgp
,
8080 struct peer
*peer
, json_object
*json_peer
,
8081 int max_neighbor_width
, bool use_json
)
8083 char timebuf
[BGP_UPTIME_LEN
], dn_flag
[2];
8087 if (peer_dynamic_neighbor(peer
))
8088 json_object_boolean_true_add(json_peer
,
8091 json_object_string_add(json_peer
, "hostname",
8094 if (peer
->domainname
)
8095 json_object_string_add(json_peer
, "domainname",
8097 json_object_int_add(json_peer
, "connectionsEstablished",
8099 json_object_int_add(json_peer
, "connectionsDropped",
8101 peer_uptime(peer
->uptime
, timebuf
, BGP_UPTIME_LEN
,
8102 use_json
, json_peer
);
8103 if (peer
->status
== Established
)
8104 json_object_string_add(json_peer
, "lastResetDueTo",
8105 "AFI/SAFI Not Negotiated");
8107 bgp_show_peer_reset(NULL
, peer
, json_peer
, true);
8110 dn_flag
[0] = peer_dynamic_neighbor(peer
) ? '*' : '\0';
8112 && bgp_flag_check(bgp
, BGP_FLAG_SHOW_HOSTNAME
))
8113 len
= vty_out(vty
, "%s%s(%s)", dn_flag
,
8114 peer
->hostname
, peer
->host
);
8116 len
= vty_out(vty
, "%s%s", dn_flag
, peer
->host
);
8118 /* pad the neighbor column with spaces */
8119 if (len
< max_neighbor_width
)
8120 vty_out(vty
, "%*s", max_neighbor_width
- len
,
8122 vty_out(vty
, "%7d %7d %8s", peer
->established
,
8124 peer_uptime(peer
->uptime
, timebuf
,
8125 BGP_UPTIME_LEN
, 0, NULL
));
8126 if (peer
->status
== Established
)
8127 vty_out(vty
, " AFI/SAFI Not Negotiated\n");
8129 bgp_show_peer_reset(vty
, peer
, NULL
,
8135 /* Show BGP peer's summary information. */
8136 static int bgp_show_summary(struct vty
*vty
, struct bgp
*bgp
, int afi
, int safi
,
8137 bool show_failed
, bool use_json
)
8140 struct listnode
*node
, *nnode
;
8141 unsigned int count
= 0, dn_count
= 0;
8142 char timebuf
[BGP_UPTIME_LEN
], dn_flag
[2];
8143 char neighbor_buf
[VTY_BUFSIZ
];
8144 int neighbor_col_default_width
= 16;
8145 int len
, failed_count
= 0;
8146 int max_neighbor_width
= 0;
8148 json_object
*json
= NULL
;
8149 json_object
*json_peer
= NULL
;
8150 json_object
*json_peers
= NULL
;
8151 struct peer_af
*paf
;
8153 /* labeled-unicast routes are installed in the unicast table so in order
8155 * display the correct PfxRcd value we must look at SAFI_UNICAST
8158 if (safi
== SAFI_LABELED_UNICAST
)
8159 pfx_rcd_safi
= SAFI_UNICAST
;
8161 pfx_rcd_safi
= safi
;
8164 json
= json_object_new_object();
8165 json_peers
= json_object_new_object();
8166 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
8167 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
8170 if (peer
->afc
[afi
][safi
]) {
8171 /* See if we have at least a single failed peer */
8172 if (bgp_has_peer_failed(peer
, afi
, safi
))
8176 if (peer_dynamic_neighbor(peer
))
8181 /* Loop over all neighbors that will be displayed to determine
8183 * characters are needed for the Neighbor column
8185 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
8186 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
8189 if (peer
->afc
[afi
][safi
]) {
8190 memset(dn_flag
, '\0', sizeof(dn_flag
));
8191 if (peer_dynamic_neighbor(peer
))
8195 && bgp_flag_check(bgp
,
8196 BGP_FLAG_SHOW_HOSTNAME
))
8197 sprintf(neighbor_buf
, "%s%s(%s) ",
8198 dn_flag
, peer
->hostname
,
8201 sprintf(neighbor_buf
, "%s%s ", dn_flag
,
8204 len
= strlen(neighbor_buf
);
8206 if (len
> max_neighbor_width
)
8207 max_neighbor_width
= len
;
8209 /* See if we have at least a single failed peer */
8210 if (bgp_has_peer_failed(peer
, afi
, safi
))
8216 /* Originally we displayed the Neighbor column as 16
8217 * characters wide so make that the default
8219 if (max_neighbor_width
< neighbor_col_default_width
)
8220 max_neighbor_width
= neighbor_col_default_width
;
8223 if (show_failed
&& !failed_count
) {
8225 json_object_int_add(json
, "failedPeersCount", 0);
8226 json_object_int_add(json
, "dynamicPeers", dn_count
);
8227 json_object_int_add(json
, "totalPeers", count
);
8229 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
8230 json
, JSON_C_TO_STRING_PRETTY
));
8231 json_object_free(json
);
8233 vty_out(vty
, "%% No failed BGP neighbors found\n");
8234 vty_out(vty
, "\nTotal number of neighbors %d\n", count
);
8239 count
= 0; /* Reset the value as its used again */
8240 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
8241 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
8244 if (!peer
->afc
[afi
][safi
])
8249 char memstrbuf
[MTYPE_MEMSTR_LEN
];
8252 vrf_id_ui
= (bgp
->vrf_id
== VRF_UNKNOWN
)
8254 : (int64_t)bgp
->vrf_id
;
8256 /* Usage summary and header */
8258 json_object_string_add(
8260 inet_ntoa(bgp
->router_id
));
8261 json_object_int_add(json
, "as", bgp
->as
);
8262 json_object_int_add(json
, "vrfId", vrf_id_ui
);
8263 json_object_string_add(
8266 == BGP_INSTANCE_TYPE_DEFAULT
)
8271 "BGP router identifier %s, local AS number %u vrf-id %d",
8272 inet_ntoa(bgp
->router_id
), bgp
->as
,
8273 bgp
->vrf_id
== VRF_UNKNOWN
8275 : (int)bgp
->vrf_id
);
8279 if (bgp_update_delay_configured(bgp
)) {
8281 json_object_int_add(
8282 json
, "updateDelayLimit",
8283 bgp
->v_update_delay
);
8285 if (bgp
->v_update_delay
8286 != bgp
->v_establish_wait
)
8287 json_object_int_add(
8289 "updateDelayEstablishWait",
8290 bgp
->v_establish_wait
);
8292 if (bgp_update_delay_active(bgp
)) {
8293 json_object_string_add(
8295 "updateDelayFirstNeighbor",
8296 bgp
->update_delay_begin_time
);
8297 json_object_boolean_true_add(
8299 "updateDelayInProgress");
8301 if (bgp
->update_delay_over
) {
8302 json_object_string_add(
8304 "updateDelayFirstNeighbor",
8305 bgp
->update_delay_begin_time
);
8306 json_object_string_add(
8308 "updateDelayBestpathResumed",
8309 bgp
->update_delay_end_time
);
8310 json_object_string_add(
8312 "updateDelayZebraUpdateResume",
8313 bgp
->update_delay_zebra_resume_time
);
8314 json_object_string_add(
8316 "updateDelayPeerUpdateResume",
8317 bgp
->update_delay_peers_resume_time
);
8322 "Read-only mode update-delay limit: %d seconds\n",
8323 bgp
->v_update_delay
);
8324 if (bgp
->v_update_delay
8325 != bgp
->v_establish_wait
)
8327 " Establish wait: %d seconds\n",
8328 bgp
->v_establish_wait
);
8330 if (bgp_update_delay_active(bgp
)) {
8332 " First neighbor established: %s\n",
8333 bgp
->update_delay_begin_time
);
8335 " Delay in progress\n");
8337 if (bgp
->update_delay_over
) {
8339 " First neighbor established: %s\n",
8340 bgp
->update_delay_begin_time
);
8342 " Best-paths resumed: %s\n",
8343 bgp
->update_delay_end_time
);
8345 " zebra update resumed: %s\n",
8346 bgp
->update_delay_zebra_resume_time
);
8348 " peers update resumed: %s\n",
8349 bgp
->update_delay_peers_resume_time
);
8356 if (bgp_maxmed_onstartup_configured(bgp
)
8357 && bgp
->maxmed_active
)
8358 json_object_boolean_true_add(
8359 json
, "maxMedOnStartup");
8360 if (bgp
->v_maxmed_admin
)
8361 json_object_boolean_true_add(
8362 json
, "maxMedAdministrative");
8364 json_object_int_add(
8365 json
, "tableVersion",
8366 bgp_table_version(bgp
->rib
[afi
][safi
]));
8368 ents
= bgp_table_count(bgp
->rib
[afi
][safi
]);
8369 json_object_int_add(json
, "ribCount", ents
);
8370 json_object_int_add(
8372 ents
* sizeof(struct bgp_node
));
8374 ents
= bgp
->af_peer_count
[afi
][safi
];
8375 json_object_int_add(json
, "peerCount", ents
);
8376 json_object_int_add(json
, "peerMemory",
8377 ents
* sizeof(struct peer
));
8379 if ((ents
= listcount(bgp
->group
))) {
8380 json_object_int_add(
8381 json
, "peerGroupCount", ents
);
8382 json_object_int_add(
8383 json
, "peerGroupMemory",
8384 ents
* sizeof(struct
8388 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
8389 BGP_CONFIG_DAMPENING
))
8390 json_object_boolean_true_add(
8391 json
, "dampeningEnabled");
8393 if (bgp_maxmed_onstartup_configured(bgp
)
8394 && bgp
->maxmed_active
)
8396 "Max-med on-startup active\n");
8397 if (bgp
->v_maxmed_admin
)
8399 "Max-med administrative active\n");
8401 vty_out(vty
, "BGP table version %" PRIu64
"\n",
8402 bgp_table_version(bgp
->rib
[afi
][safi
]));
8404 ents
= bgp_table_count(bgp
->rib
[afi
][safi
]);
8406 "RIB entries %ld, using %s of memory\n",
8408 mtype_memstr(memstrbuf
,
8410 ents
* sizeof(struct
8413 /* Peer related usage */
8414 ents
= bgp
->af_peer_count
[afi
][safi
];
8415 vty_out(vty
, "Peers %ld, using %s of memory\n",
8418 memstrbuf
, sizeof(memstrbuf
),
8419 ents
* sizeof(struct peer
)));
8421 if ((ents
= listcount(bgp
->group
)))
8423 "Peer groups %ld, using %s of memory\n",
8428 ents
* sizeof(struct
8431 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
8432 BGP_CONFIG_DAMPENING
))
8433 vty_out(vty
, "Dampening enabled.\n");
8436 /* Subtract 8 here because 'Neighbor' is
8438 vty_out(vty
, "Neighbor");
8439 vty_out(vty
, "%*s", max_neighbor_width
- 8,
8442 vty_out(vty
, "EstdCnt DropCnt ResetTime Reason\n");
8445 "V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd\n");
8450 /* Works for both failed & successful cases */
8451 if (peer_dynamic_neighbor(peer
))
8458 bgp_has_peer_failed(peer
, afi
, safi
)) {
8459 json_peer
= json_object_new_object();
8460 bgp_show_failed_summary(vty
, bgp
, peer
,
8461 json_peer
, 0, use_json
);
8462 } else if (!show_failed
) {
8463 json_peer
= json_object_new_object();
8464 if (peer_dynamic_neighbor(peer
)) {
8465 json_object_boolean_true_add(json_peer
,
8470 json_object_string_add(json_peer
, "hostname",
8473 if (peer
->domainname
)
8474 json_object_string_add(json_peer
, "domainname",
8477 json_object_int_add(json_peer
, "remoteAs", peer
->as
);
8478 json_object_int_add(json_peer
, "version", 4);
8479 json_object_int_add(json_peer
, "msgRcvd",
8480 PEER_TOTAL_RX(peer
));
8481 json_object_int_add(json_peer
, "msgSent",
8482 PEER_TOTAL_TX(peer
));
8484 json_object_int_add(json_peer
, "tableVersion",
8485 peer
->version
[afi
][safi
]);
8486 json_object_int_add(json_peer
, "outq",
8488 json_object_int_add(json_peer
, "inq", 0);
8489 peer_uptime(peer
->uptime
, timebuf
, BGP_UPTIME_LEN
,
8490 use_json
, json_peer
);
8493 * Adding "pfxRcd" field to match with the corresponding
8494 * CLI. "prefixReceivedCount" will be deprecated in
8497 json_object_int_add(json_peer
, "prefixReceivedCount",
8498 peer
->pcount
[afi
][pfx_rcd_safi
]);
8499 json_object_int_add(json_peer
, "pfxRcd",
8500 peer
->pcount
[afi
][pfx_rcd_safi
]);
8502 paf
= peer_af_find(peer
, afi
, pfx_rcd_safi
);
8503 if (paf
&& PAF_SUBGRP(paf
))
8504 json_object_int_add(json_peer
,
8506 (PAF_SUBGRP(paf
))->scount
);
8507 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_SHUTDOWN
))
8508 json_object_string_add(json_peer
, "state",
8510 else if (peer
->afc_recv
[afi
][safi
])
8511 json_object_string_add(
8513 lookup_msg(bgp_status_msg
, peer
->status
,
8515 else if (CHECK_FLAG(peer
->sflags
,
8516 PEER_STATUS_PREFIX_OVERFLOW
))
8517 json_object_string_add(json_peer
, "state",
8520 json_object_string_add(
8522 lookup_msg(bgp_status_msg
, peer
->status
,
8524 json_object_int_add(json_peer
, "connectionsEstablished",
8526 json_object_int_add(json_peer
, "connectionsDropped",
8529 /* Avoid creating empty peer dicts in JSON */
8530 if (json_peer
== NULL
)
8534 json_object_string_add(json_peer
, "idType",
8536 else if (peer
->su
.sa
.sa_family
== AF_INET
)
8537 json_object_string_add(json_peer
, "idType",
8539 else if (peer
->su
.sa
.sa_family
== AF_INET6
)
8540 json_object_string_add(json_peer
, "idType",
8542 json_object_object_add(json_peers
, peer
->host
,
8546 bgp_has_peer_failed(peer
, afi
, safi
)) {
8547 bgp_show_failed_summary(vty
, bgp
, peer
, NULL
,
8550 } else if (!show_failed
) {
8551 memset(dn_flag
, '\0', sizeof(dn_flag
));
8552 if (peer_dynamic_neighbor(peer
)) {
8557 && bgp_flag_check(bgp
, BGP_FLAG_SHOW_HOSTNAME
))
8558 len
= vty_out(vty
, "%s%s(%s)", dn_flag
,
8559 peer
->hostname
, peer
->host
);
8561 len
= vty_out(vty
, "%s%s", dn_flag
, peer
->host
);
8563 /* pad the neighbor column with spaces */
8564 if (len
< max_neighbor_width
)
8565 vty_out(vty
, "%*s", max_neighbor_width
- len
,
8568 vty_out(vty
, "4 %10u %7u %7u %8" PRIu64
" %4d %4zd %8s",
8569 peer
->as
, PEER_TOTAL_RX(peer
),
8570 PEER_TOTAL_TX(peer
), peer
->version
[afi
][safi
],
8571 0, peer
->obuf
->count
,
8572 peer_uptime(peer
->uptime
, timebuf
,
8573 BGP_UPTIME_LEN
, 0, NULL
));
8575 if (peer
->status
== Established
)
8576 if (peer
->afc_recv
[afi
][safi
])
8577 vty_out(vty
, " %12" PRIu32
,
8582 vty_out(vty
, " NoNeg");
8584 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_SHUTDOWN
))
8585 vty_out(vty
, " Idle (Admin)");
8586 else if (CHECK_FLAG(
8588 PEER_STATUS_PREFIX_OVERFLOW
))
8589 vty_out(vty
, " Idle (PfxCt)");
8591 vty_out(vty
, " %12s",
8592 lookup_msg(bgp_status_msg
,
8593 peer
->status
, NULL
));
8602 json_object_object_add(json
, "peers", json_peers
);
8603 json_object_int_add(json
, "failedPeers", failed_count
);
8604 json_object_int_add(json
, "totalPeers", count
);
8605 json_object_int_add(json
, "dynamicPeers", dn_count
);
8608 bgp_show_bestpath_json(bgp
, json
);
8610 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
8611 json
, JSON_C_TO_STRING_PRETTY
));
8612 json_object_free(json
);
8615 vty_out(vty
, "\nTotal number of neighbors %d\n", count
);
8617 vty_out(vty
, "No %s neighbor is configured\n",
8618 get_afi_safi_str(afi
, safi
, false));
8622 vty_out(vty
, "* - dynamic neighbor\n");
8623 vty_out(vty
, "%d dynamic neighbor(s), limit %d\n",
8624 dn_count
, bgp
->dynamic_neighbors_limit
);
8631 static void bgp_show_summary_afi_safi(struct vty
*vty
, struct bgp
*bgp
, int afi
,
8632 int safi
, bool show_failed
, bool use_json
)
8635 int afi_wildcard
= (afi
== AFI_MAX
);
8636 int safi_wildcard
= (safi
== SAFI_MAX
);
8637 int is_wildcard
= (afi_wildcard
|| safi_wildcard
);
8638 bool nbr_output
= false;
8640 if (use_json
&& is_wildcard
)
8641 vty_out(vty
, "{\n");
8643 afi
= 1; /* AFI_IP */
8644 while (afi
< AFI_MAX
) {
8646 safi
= 1; /* SAFI_UNICAST */
8647 while (safi
< SAFI_MAX
) {
8648 if (bgp_afi_safi_peer_exists(bgp
, afi
, safi
)) {
8653 * So limit output to those afi/safi
8655 * actualy have something interesting in
8660 vty_out(vty
, ",\n");
8664 vty_out(vty
, "\"%s\":",
8665 get_afi_safi_str(afi
,
8669 vty_out(vty
, "\n%s Summary:\n",
8670 get_afi_safi_str(afi
,
8675 bgp_show_summary(vty
, bgp
, afi
, safi
, show_failed
,
8687 if (use_json
&& is_wildcard
)
8688 vty_out(vty
, "}\n");
8689 else if (!nbr_output
) {
8691 vty_out(vty
, "{}\n");
8693 vty_out(vty
, "%% No BGP neighbors found\n");
8697 static void bgp_show_all_instances_summary_vty(struct vty
*vty
, afi_t afi
,
8698 safi_t safi
, bool show_failed
,
8701 struct listnode
*node
, *nnode
;
8704 bool nbr_output
= false;
8707 vty_out(vty
, "{\n");
8709 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
8713 vty_out(vty
, ",\n");
8717 vty_out(vty
, "\"%s\":",
8718 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
8722 vty_out(vty
, "\nInstance %s:\n",
8723 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
8727 bgp_show_summary_afi_safi(vty
, bgp
, afi
, safi
, show_failed
,
8732 vty_out(vty
, "}\n");
8733 else if (!nbr_output
)
8734 vty_out(vty
, "%% BGP instance not found\n");
8737 int bgp_show_summary_vty(struct vty
*vty
, const char *name
, afi_t afi
,
8738 safi_t safi
, bool show_failed
, bool use_json
)
8743 if (strmatch(name
, "all")) {
8744 bgp_show_all_instances_summary_vty(vty
, afi
, safi
,
8749 bgp
= bgp_lookup_by_name(name
);
8753 vty_out(vty
, "{}\n");
8756 "%% BGP instance not found\n");
8760 bgp_show_summary_afi_safi(vty
, bgp
, afi
, safi
,
8761 show_failed
, use_json
);
8766 bgp
= bgp_get_default();
8769 bgp_show_summary_afi_safi(vty
, bgp
, afi
, safi
, show_failed
,
8773 vty_out(vty
, "{}\n");
8775 vty_out(vty
, "%% BGP instance not found\n");
8782 /* `show [ip] bgp summary' commands. */
8783 DEFUN (show_ip_bgp_summary
,
8784 show_ip_bgp_summary_cmd
,
8785 "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR
" ["BGP_SAFI_WITH_LABEL_CMD_STR
"]] summary [failed] [json]",
8789 BGP_INSTANCE_HELP_STR
8791 BGP_SAFI_WITH_LABEL_HELP_STR
8792 "Summary of BGP neighbor status\n"
8793 "Show only sessions not in Established state\n"
8797 afi_t afi
= AFI_MAX
;
8798 safi_t safi
= SAFI_MAX
;
8799 bool show_failed
= false;
8804 if (argv_find(argv
, argc
, "ip", &idx
))
8806 /* [<vrf> VIEWVRFNAME] */
8807 if (argv_find(argv
, argc
, "vrf", &idx
)) {
8808 vrf
= argv
[idx
+ 1]->arg
;
8809 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
8811 } else if (argv_find(argv
, argc
, "view", &idx
))
8812 /* [<view> VIEWVRFNAME] */
8813 vrf
= argv
[idx
+ 1]->arg
;
8814 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
8815 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
)) {
8816 argv_find_and_parse_safi(argv
, argc
, &idx
, &safi
);
8819 if (argv_find(argv
, argc
, "failed", &idx
))
8822 bool uj
= use_json(argc
, argv
);
8824 return bgp_show_summary_vty(vty
, vrf
, afi
, safi
, show_failed
, uj
);
8827 const char *get_afi_safi_str(afi_t afi
, safi_t safi
, bool for_json
)
8830 return get_afi_safi_json_str(afi
, safi
);
8832 return get_afi_safi_vty_str(afi
, safi
);
8835 /* Show BGP peer's information. */
8836 enum show_type
{ show_all
, show_peer
, show_ipv4_all
, show_ipv6_all
, show_ipv4_peer
, show_ipv6_peer
};
8838 static void bgp_show_peer_afi_orf_cap(struct vty
*vty
, struct peer
*p
,
8839 afi_t afi
, safi_t safi
,
8840 uint16_t adv_smcap
, uint16_t adv_rmcap
,
8841 uint16_t rcv_smcap
, uint16_t rcv_rmcap
,
8842 bool use_json
, json_object
*json_pref
)
8845 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_smcap
)
8846 || CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_smcap
)) {
8848 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_smcap
)
8849 && CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_smcap
))
8850 json_object_string_add(json_pref
, "sendMode",
8851 "advertisedAndReceived");
8852 else if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_smcap
))
8853 json_object_string_add(json_pref
, "sendMode",
8855 else if (CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_smcap
))
8856 json_object_string_add(json_pref
, "sendMode",
8859 vty_out(vty
, " Send-mode: ");
8860 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_smcap
))
8861 vty_out(vty
, "advertised");
8862 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_smcap
))
8863 vty_out(vty
, "%sreceived",
8864 CHECK_FLAG(p
->af_cap
[afi
][safi
],
8873 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_rmcap
)
8874 || CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_rmcap
)) {
8876 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_rmcap
)
8877 && CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_rmcap
))
8878 json_object_string_add(json_pref
, "recvMode",
8879 "advertisedAndReceived");
8880 else if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_rmcap
))
8881 json_object_string_add(json_pref
, "recvMode",
8883 else if (CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_rmcap
))
8884 json_object_string_add(json_pref
, "recvMode",
8887 vty_out(vty
, " Receive-mode: ");
8888 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_rmcap
))
8889 vty_out(vty
, "advertised");
8890 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_rmcap
))
8891 vty_out(vty
, "%sreceived",
8892 CHECK_FLAG(p
->af_cap
[afi
][safi
],
8901 static void bgp_show_peer_afi(struct vty
*vty
, struct peer
*p
, afi_t afi
,
8902 safi_t safi
, bool use_json
,
8903 json_object
*json_neigh
)
8905 struct bgp_filter
*filter
;
8906 struct peer_af
*paf
;
8907 char orf_pfx_name
[BUFSIZ
];
8909 json_object
*json_af
= NULL
;
8910 json_object
*json_prefA
= NULL
;
8911 json_object
*json_prefB
= NULL
;
8912 json_object
*json_addr
= NULL
;
8915 json_addr
= json_object_new_object();
8916 json_af
= json_object_new_object();
8917 filter
= &p
->filter
[afi
][safi
];
8919 if (peer_group_active(p
))
8920 json_object_string_add(json_addr
, "peerGroupMember",
8923 paf
= peer_af_find(p
, afi
, safi
);
8924 if (paf
&& PAF_SUBGRP(paf
)) {
8925 json_object_int_add(json_addr
, "updateGroupId",
8926 PAF_UPDGRP(paf
)->id
);
8927 json_object_int_add(json_addr
, "subGroupId",
8928 PAF_SUBGRP(paf
)->id
);
8929 json_object_int_add(json_addr
, "packetQueueLength",
8930 bpacket_queue_virtual_length(paf
));
8933 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
8934 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8935 PEER_CAP_ORF_PREFIX_SM_RCV
)
8936 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8937 PEER_CAP_ORF_PREFIX_RM_ADV
)
8938 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8939 PEER_CAP_ORF_PREFIX_RM_RCV
)) {
8940 json_object_int_add(json_af
, "orfType",
8942 json_prefA
= json_object_new_object();
8943 bgp_show_peer_afi_orf_cap(vty
, p
, afi
, safi
,
8944 PEER_CAP_ORF_PREFIX_SM_ADV
,
8945 PEER_CAP_ORF_PREFIX_RM_ADV
,
8946 PEER_CAP_ORF_PREFIX_SM_RCV
,
8947 PEER_CAP_ORF_PREFIX_RM_RCV
,
8948 use_json
, json_prefA
);
8949 json_object_object_add(json_af
, "orfPrefixList",
8953 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
8954 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8955 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
8956 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8957 PEER_CAP_ORF_PREFIX_RM_ADV
)
8958 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8959 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
)) {
8960 json_object_int_add(json_af
, "orfOldType",
8961 ORF_TYPE_PREFIX_OLD
);
8962 json_prefB
= json_object_new_object();
8963 bgp_show_peer_afi_orf_cap(
8964 vty
, p
, afi
, safi
, PEER_CAP_ORF_PREFIX_SM_ADV
,
8965 PEER_CAP_ORF_PREFIX_RM_ADV
,
8966 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
,
8967 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
, use_json
,
8969 json_object_object_add(json_af
, "orfOldPrefixList",
8973 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
8974 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8975 PEER_CAP_ORF_PREFIX_SM_RCV
)
8976 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8977 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
8978 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8979 PEER_CAP_ORF_PREFIX_RM_ADV
)
8980 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8981 PEER_CAP_ORF_PREFIX_RM_RCV
)
8982 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8983 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
))
8984 json_object_object_add(json_addr
, "afDependentCap",
8987 json_object_free(json_af
);
8989 sprintf(orf_pfx_name
, "%s.%d.%d", p
->host
, afi
, safi
);
8990 orf_pfx_count
= prefix_bgp_show_prefix_list(
8991 NULL
, afi
, orf_pfx_name
, use_json
);
8993 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
8994 PEER_STATUS_ORF_PREFIX_SEND
)
8996 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
8997 PEER_STATUS_ORF_PREFIX_SEND
))
8998 json_object_boolean_true_add(json_neigh
,
9001 json_object_int_add(json_addr
, "orfRecvCounter",
9004 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
9005 PEER_STATUS_ORF_WAIT_REFRESH
))
9006 json_object_string_add(
9007 json_addr
, "orfFirstUpdate",
9008 "deferredUntilORFOrRouteRefreshRecvd");
9010 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9011 PEER_FLAG_REFLECTOR_CLIENT
))
9012 json_object_boolean_true_add(json_addr
,
9013 "routeReflectorClient");
9014 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9015 PEER_FLAG_RSERVER_CLIENT
))
9016 json_object_boolean_true_add(json_addr
,
9017 "routeServerClient");
9018 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
9019 json_object_boolean_true_add(json_addr
,
9020 "inboundSoftConfigPermit");
9022 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9023 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
))
9024 json_object_boolean_true_add(
9026 "privateAsNumsAllReplacedInUpdatesToNbr");
9027 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9028 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
))
9029 json_object_boolean_true_add(
9031 "privateAsNumsReplacedInUpdatesToNbr");
9032 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9033 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
))
9034 json_object_boolean_true_add(
9036 "privateAsNumsAllRemovedInUpdatesToNbr");
9037 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9038 PEER_FLAG_REMOVE_PRIVATE_AS
))
9039 json_object_boolean_true_add(
9041 "privateAsNumsRemovedInUpdatesToNbr");
9043 if (p
->addpath_type
[afi
][safi
] != BGP_ADDPATH_NONE
)
9044 json_object_boolean_true_add(
9046 bgp_addpath_names(p
->addpath_type
[afi
][safi
])
9049 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_AS_OVERRIDE
))
9050 json_object_string_add(json_addr
,
9051 "overrideASNsInOutboundUpdates",
9052 "ifAspathEqualRemoteAs");
9054 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_SELF
)
9055 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
9056 PEER_FLAG_FORCE_NEXTHOP_SELF
))
9057 json_object_boolean_true_add(json_addr
,
9058 "routerAlwaysNextHop");
9059 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9060 PEER_FLAG_AS_PATH_UNCHANGED
))
9061 json_object_boolean_true_add(
9062 json_addr
, "unchangedAsPathPropogatedToNbr");
9063 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9064 PEER_FLAG_NEXTHOP_UNCHANGED
))
9065 json_object_boolean_true_add(
9066 json_addr
, "unchangedNextHopPropogatedToNbr");
9067 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
9068 json_object_boolean_true_add(
9069 json_addr
, "unchangedMedPropogatedToNbr");
9070 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
)
9071 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
9072 PEER_FLAG_SEND_EXT_COMMUNITY
)) {
9073 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9074 PEER_FLAG_SEND_COMMUNITY
)
9075 && CHECK_FLAG(p
->af_flags
[afi
][safi
],
9076 PEER_FLAG_SEND_EXT_COMMUNITY
))
9077 json_object_string_add(json_addr
,
9078 "commAttriSentToNbr",
9079 "extendedAndStandard");
9080 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9081 PEER_FLAG_SEND_EXT_COMMUNITY
))
9082 json_object_string_add(json_addr
,
9083 "commAttriSentToNbr",
9086 json_object_string_add(json_addr
,
9087 "commAttriSentToNbr",
9090 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9091 PEER_FLAG_DEFAULT_ORIGINATE
)) {
9092 if (p
->default_rmap
[afi
][safi
].name
)
9093 json_object_string_add(
9094 json_addr
, "defaultRouteMap",
9095 p
->default_rmap
[afi
][safi
].name
);
9097 if (paf
&& PAF_SUBGRP(paf
)
9098 && CHECK_FLAG(PAF_SUBGRP(paf
)->sflags
,
9099 SUBGRP_STATUS_DEFAULT_ORIGINATE
))
9100 json_object_boolean_true_add(json_addr
,
9103 json_object_boolean_true_add(json_addr
,
9107 if (afi
== AFI_L2VPN
&& safi
== SAFI_EVPN
) {
9108 if (is_evpn_enabled())
9109 json_object_boolean_true_add(
9110 json_addr
, "advertiseAllVnis");
9113 if (filter
->plist
[FILTER_IN
].name
9114 || filter
->dlist
[FILTER_IN
].name
9115 || filter
->aslist
[FILTER_IN
].name
9116 || filter
->map
[RMAP_IN
].name
)
9117 json_object_boolean_true_add(json_addr
,
9118 "inboundPathPolicyConfig");
9119 if (filter
->plist
[FILTER_OUT
].name
9120 || filter
->dlist
[FILTER_OUT
].name
9121 || filter
->aslist
[FILTER_OUT
].name
9122 || filter
->map
[RMAP_OUT
].name
|| filter
->usmap
.name
)
9123 json_object_boolean_true_add(
9124 json_addr
, "outboundPathPolicyConfig");
9127 if (filter
->plist
[FILTER_IN
].name
)
9128 json_object_string_add(json_addr
,
9129 "incomingUpdatePrefixFilterList",
9130 filter
->plist
[FILTER_IN
].name
);
9131 if (filter
->plist
[FILTER_OUT
].name
)
9132 json_object_string_add(json_addr
,
9133 "outgoingUpdatePrefixFilterList",
9134 filter
->plist
[FILTER_OUT
].name
);
9136 /* distribute-list */
9137 if (filter
->dlist
[FILTER_IN
].name
)
9138 json_object_string_add(
9139 json_addr
, "incomingUpdateNetworkFilterList",
9140 filter
->dlist
[FILTER_IN
].name
);
9141 if (filter
->dlist
[FILTER_OUT
].name
)
9142 json_object_string_add(
9143 json_addr
, "outgoingUpdateNetworkFilterList",
9144 filter
->dlist
[FILTER_OUT
].name
);
9147 if (filter
->aslist
[FILTER_IN
].name
)
9148 json_object_string_add(json_addr
,
9149 "incomingUpdateAsPathFilterList",
9150 filter
->aslist
[FILTER_IN
].name
);
9151 if (filter
->aslist
[FILTER_OUT
].name
)
9152 json_object_string_add(json_addr
,
9153 "outgoingUpdateAsPathFilterList",
9154 filter
->aslist
[FILTER_OUT
].name
);
9157 if (filter
->map
[RMAP_IN
].name
)
9158 json_object_string_add(
9159 json_addr
, "routeMapForIncomingAdvertisements",
9160 filter
->map
[RMAP_IN
].name
);
9161 if (filter
->map
[RMAP_OUT
].name
)
9162 json_object_string_add(
9163 json_addr
, "routeMapForOutgoingAdvertisements",
9164 filter
->map
[RMAP_OUT
].name
);
9166 /* ebgp-requires-policy (inbound) */
9167 if (p
->bgp
->ebgp_requires_policy
== DEFAULT_EBGP_POLICY_ENABLED
9168 && !bgp_inbound_policy_exists(p
, filter
))
9169 json_object_string_add(
9170 json_addr
, "inboundEbgpRequiresPolicy",
9171 "Inbound updates discarded due to missing policy");
9173 /* ebgp-requires-policy (outbound) */
9174 if (p
->bgp
->ebgp_requires_policy
== DEFAULT_EBGP_POLICY_ENABLED
9175 && (!bgp_outbound_policy_exists(p
, filter
)))
9176 json_object_string_add(
9177 json_addr
, "outboundEbgpRequiresPolicy",
9178 "Outbound updates discarded due to missing policy");
9180 /* unsuppress-map */
9181 if (filter
->usmap
.name
)
9182 json_object_string_add(json_addr
,
9183 "selectiveUnsuppressRouteMap",
9184 filter
->usmap
.name
);
9186 /* Receive prefix count */
9187 json_object_int_add(json_addr
, "acceptedPrefixCounter",
9188 p
->pcount
[afi
][safi
]);
9189 if (paf
&& PAF_SUBGRP(paf
))
9190 json_object_int_add(json_addr
, "sentPrefixCounter",
9191 (PAF_SUBGRP(paf
))->scount
);
9193 /* Maximum prefix */
9194 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
)) {
9195 json_object_int_add(json_addr
, "prefixAllowedMax",
9196 p
->pmax
[afi
][safi
]);
9197 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9198 PEER_FLAG_MAX_PREFIX_WARNING
))
9199 json_object_boolean_true_add(
9200 json_addr
, "prefixAllowedMaxWarning");
9201 json_object_int_add(json_addr
,
9202 "prefixAllowedWarningThresh",
9203 p
->pmax_threshold
[afi
][safi
]);
9204 if (p
->pmax_restart
[afi
][safi
])
9205 json_object_int_add(
9207 "prefixAllowedRestartIntervalMsecs",
9208 p
->pmax_restart
[afi
][safi
] * 60000);
9210 json_object_object_add(json_neigh
, get_afi_safi_str(afi
, safi
, true),
9214 filter
= &p
->filter
[afi
][safi
];
9216 vty_out(vty
, " For address family: %s\n",
9217 get_afi_safi_str(afi
, safi
, false));
9219 if (peer_group_active(p
))
9220 vty_out(vty
, " %s peer-group member\n",
9223 paf
= peer_af_find(p
, afi
, safi
);
9224 if (paf
&& PAF_SUBGRP(paf
)) {
9225 vty_out(vty
, " Update group %" PRIu64
9226 ", subgroup %" PRIu64
"\n",
9227 PAF_UPDGRP(paf
)->id
, PAF_SUBGRP(paf
)->id
);
9228 vty_out(vty
, " Packet Queue length %d\n",
9229 bpacket_queue_virtual_length(paf
));
9231 vty_out(vty
, " Not part of any update group\n");
9233 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
9234 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
9235 PEER_CAP_ORF_PREFIX_SM_RCV
)
9236 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
9237 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
9238 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
9239 PEER_CAP_ORF_PREFIX_RM_ADV
)
9240 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
9241 PEER_CAP_ORF_PREFIX_RM_RCV
)
9242 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
9243 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
))
9244 vty_out(vty
, " AF-dependant capabilities:\n");
9246 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
9247 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
9248 PEER_CAP_ORF_PREFIX_SM_RCV
)
9249 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
9250 PEER_CAP_ORF_PREFIX_RM_ADV
)
9251 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
9252 PEER_CAP_ORF_PREFIX_RM_RCV
)) {
9254 " Outbound Route Filter (ORF) type (%d) Prefix-list:\n",
9256 bgp_show_peer_afi_orf_cap(
9257 vty
, p
, afi
, safi
, PEER_CAP_ORF_PREFIX_SM_ADV
,
9258 PEER_CAP_ORF_PREFIX_RM_ADV
,
9259 PEER_CAP_ORF_PREFIX_SM_RCV
,
9260 PEER_CAP_ORF_PREFIX_RM_RCV
, use_json
, NULL
);
9262 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
9263 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
9264 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
9265 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
9266 PEER_CAP_ORF_PREFIX_RM_ADV
)
9267 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
9268 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
)) {
9270 " Outbound Route Filter (ORF) type (%d) Prefix-list:\n",
9271 ORF_TYPE_PREFIX_OLD
);
9272 bgp_show_peer_afi_orf_cap(
9273 vty
, p
, afi
, safi
, PEER_CAP_ORF_PREFIX_SM_ADV
,
9274 PEER_CAP_ORF_PREFIX_RM_ADV
,
9275 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
,
9276 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
, use_json
, NULL
);
9279 sprintf(orf_pfx_name
, "%s.%d.%d", p
->host
, afi
, safi
);
9280 orf_pfx_count
= prefix_bgp_show_prefix_list(
9281 NULL
, afi
, orf_pfx_name
, use_json
);
9283 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
9284 PEER_STATUS_ORF_PREFIX_SEND
)
9286 vty_out(vty
, " Outbound Route Filter (ORF):");
9287 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
9288 PEER_STATUS_ORF_PREFIX_SEND
))
9289 vty_out(vty
, " sent;");
9291 vty_out(vty
, " received (%d entries)",
9295 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
9296 PEER_STATUS_ORF_WAIT_REFRESH
))
9298 " First update is deferred until ORF or ROUTE-REFRESH is received\n");
9300 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9301 PEER_FLAG_REFLECTOR_CLIENT
))
9302 vty_out(vty
, " Route-Reflector Client\n");
9303 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9304 PEER_FLAG_RSERVER_CLIENT
))
9305 vty_out(vty
, " Route-Server Client\n");
9306 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
9308 " Inbound soft reconfiguration allowed\n");
9310 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9311 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
))
9313 " Private AS numbers (all) replaced in updates to this neighbor\n");
9314 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9315 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
))
9317 " Private AS numbers replaced in updates to this neighbor\n");
9318 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9319 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
))
9321 " Private AS numbers (all) removed in updates to this neighbor\n");
9322 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9323 PEER_FLAG_REMOVE_PRIVATE_AS
))
9325 " Private AS numbers removed in updates to this neighbor\n");
9327 if (p
->addpath_type
[afi
][safi
] != BGP_ADDPATH_NONE
)
9328 vty_out(vty
, " %s\n",
9329 bgp_addpath_names(p
->addpath_type
[afi
][safi
])
9330 ->human_description
);
9332 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_AS_OVERRIDE
))
9334 " Override ASNs in outbound updates if aspath equals remote-as\n");
9336 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_SELF
)
9337 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
9338 PEER_FLAG_FORCE_NEXTHOP_SELF
))
9339 vty_out(vty
, " NEXT_HOP is always this router\n");
9340 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9341 PEER_FLAG_AS_PATH_UNCHANGED
))
9343 " AS_PATH is propagated unchanged to this neighbor\n");
9344 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9345 PEER_FLAG_NEXTHOP_UNCHANGED
))
9347 " NEXT_HOP is propagated unchanged to this neighbor\n");
9348 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
9350 " MED is propagated unchanged to this neighbor\n");
9351 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
)
9352 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
9353 PEER_FLAG_SEND_EXT_COMMUNITY
)
9354 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
9355 PEER_FLAG_SEND_LARGE_COMMUNITY
)) {
9357 " Community attribute sent to this neighbor");
9358 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9359 PEER_FLAG_SEND_COMMUNITY
)
9360 && CHECK_FLAG(p
->af_flags
[afi
][safi
],
9361 PEER_FLAG_SEND_EXT_COMMUNITY
)
9362 && CHECK_FLAG(p
->af_flags
[afi
][safi
],
9363 PEER_FLAG_SEND_LARGE_COMMUNITY
))
9364 vty_out(vty
, "(all)\n");
9365 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9366 PEER_FLAG_SEND_LARGE_COMMUNITY
))
9367 vty_out(vty
, "(large)\n");
9368 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9369 PEER_FLAG_SEND_EXT_COMMUNITY
))
9370 vty_out(vty
, "(extended)\n");
9372 vty_out(vty
, "(standard)\n");
9374 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9375 PEER_FLAG_DEFAULT_ORIGINATE
)) {
9376 vty_out(vty
, " Default information originate,");
9378 if (p
->default_rmap
[afi
][safi
].name
)
9379 vty_out(vty
, " default route-map %s%s,",
9380 p
->default_rmap
[afi
][safi
].map
? "*"
9382 p
->default_rmap
[afi
][safi
].name
);
9383 if (paf
&& PAF_SUBGRP(paf
)
9384 && CHECK_FLAG(PAF_SUBGRP(paf
)->sflags
,
9385 SUBGRP_STATUS_DEFAULT_ORIGINATE
))
9386 vty_out(vty
, " default sent\n");
9388 vty_out(vty
, " default not sent\n");
9391 /* advertise-vni-all */
9392 if (afi
== AFI_L2VPN
&& safi
== SAFI_EVPN
) {
9393 if (is_evpn_enabled())
9394 vty_out(vty
, " advertise-all-vni\n");
9397 if (filter
->plist
[FILTER_IN
].name
9398 || filter
->dlist
[FILTER_IN
].name
9399 || filter
->aslist
[FILTER_IN
].name
9400 || filter
->map
[RMAP_IN
].name
)
9401 vty_out(vty
, " Inbound path policy configured\n");
9402 if (filter
->plist
[FILTER_OUT
].name
9403 || filter
->dlist
[FILTER_OUT
].name
9404 || filter
->aslist
[FILTER_OUT
].name
9405 || filter
->map
[RMAP_OUT
].name
|| filter
->usmap
.name
)
9406 vty_out(vty
, " Outbound path policy configured\n");
9409 if (filter
->plist
[FILTER_IN
].name
)
9411 " Incoming update prefix filter list is %s%s\n",
9412 filter
->plist
[FILTER_IN
].plist
? "*" : "",
9413 filter
->plist
[FILTER_IN
].name
);
9414 if (filter
->plist
[FILTER_OUT
].name
)
9416 " Outgoing update prefix filter list is %s%s\n",
9417 filter
->plist
[FILTER_OUT
].plist
? "*" : "",
9418 filter
->plist
[FILTER_OUT
].name
);
9420 /* distribute-list */
9421 if (filter
->dlist
[FILTER_IN
].name
)
9423 " Incoming update network filter list is %s%s\n",
9424 filter
->dlist
[FILTER_IN
].alist
? "*" : "",
9425 filter
->dlist
[FILTER_IN
].name
);
9426 if (filter
->dlist
[FILTER_OUT
].name
)
9428 " Outgoing update network filter list is %s%s\n",
9429 filter
->dlist
[FILTER_OUT
].alist
? "*" : "",
9430 filter
->dlist
[FILTER_OUT
].name
);
9433 if (filter
->aslist
[FILTER_IN
].name
)
9435 " Incoming update AS path filter list is %s%s\n",
9436 filter
->aslist
[FILTER_IN
].aslist
? "*" : "",
9437 filter
->aslist
[FILTER_IN
].name
);
9438 if (filter
->aslist
[FILTER_OUT
].name
)
9440 " Outgoing update AS path filter list is %s%s\n",
9441 filter
->aslist
[FILTER_OUT
].aslist
? "*" : "",
9442 filter
->aslist
[FILTER_OUT
].name
);
9445 if (filter
->map
[RMAP_IN
].name
)
9447 " Route map for incoming advertisements is %s%s\n",
9448 filter
->map
[RMAP_IN
].map
? "*" : "",
9449 filter
->map
[RMAP_IN
].name
);
9450 if (filter
->map
[RMAP_OUT
].name
)
9452 " Route map for outgoing advertisements is %s%s\n",
9453 filter
->map
[RMAP_OUT
].map
? "*" : "",
9454 filter
->map
[RMAP_OUT
].name
);
9456 /* ebgp-requires-policy (inbound) */
9457 if (p
->bgp
->ebgp_requires_policy
== DEFAULT_EBGP_POLICY_ENABLED
9458 && !bgp_inbound_policy_exists(p
, filter
))
9460 " Inbound updates discarded due to missing policy\n");
9462 /* ebgp-requires-policy (outbound) */
9463 if (p
->bgp
->ebgp_requires_policy
== DEFAULT_EBGP_POLICY_ENABLED
9464 && !bgp_outbound_policy_exists(p
, filter
))
9466 " Outbound updates discarded due to missing policy\n");
9468 /* unsuppress-map */
9469 if (filter
->usmap
.name
)
9471 " Route map for selective unsuppress is %s%s\n",
9472 filter
->usmap
.map
? "*" : "",
9473 filter
->usmap
.name
);
9475 /* Receive prefix count */
9476 vty_out(vty
, " %" PRIu32
" accepted prefixes\n",
9477 p
->pcount
[afi
][safi
]);
9479 /* Maximum prefix */
9480 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
)) {
9482 " Maximum prefixes allowed %" PRIu32
"%s\n",
9484 CHECK_FLAG(p
->af_flags
[afi
][safi
],
9485 PEER_FLAG_MAX_PREFIX_WARNING
)
9488 vty_out(vty
, " Threshold for warning message %d%%",
9489 p
->pmax_threshold
[afi
][safi
]);
9490 if (p
->pmax_restart
[afi
][safi
])
9491 vty_out(vty
, ", restart interval %d min",
9492 p
->pmax_restart
[afi
][safi
]);
9500 static void bgp_show_peer(struct vty
*vty
, struct peer
*p
, bool use_json
,
9504 char buf1
[PREFIX2STR_BUFFER
], buf
[SU_ADDRSTRLEN
];
9505 char timebuf
[BGP_UPTIME_LEN
];
9511 json_object
*json_neigh
= NULL
;
9517 json_neigh
= json_object_new_object();
9519 memset(dn_flag
, '\0', sizeof(dn_flag
));
9520 if (!p
->conf_if
&& peer_dynamic_neighbor(p
))
9524 if (p
->conf_if
) /* Configured interface name. */
9525 vty_out(vty
, "BGP neighbor on %s: %s, ", p
->conf_if
,
9526 BGP_PEER_SU_UNSPEC(p
)
9528 : sockunion2str(&p
->su
, buf
,
9530 else /* Configured IP address. */
9531 vty_out(vty
, "BGP neighbor is %s%s, ", dn_flag
,
9536 if (p
->conf_if
&& BGP_PEER_SU_UNSPEC(p
))
9537 json_object_string_add(json_neigh
, "bgpNeighborAddr",
9539 else if (p
->conf_if
&& !BGP_PEER_SU_UNSPEC(p
))
9540 json_object_string_add(
9541 json_neigh
, "bgpNeighborAddr",
9542 sockunion2str(&p
->su
, buf
, SU_ADDRSTRLEN
));
9544 json_object_int_add(json_neigh
, "remoteAs", p
->as
);
9546 if (p
->change_local_as
)
9547 json_object_int_add(json_neigh
, "localAs",
9548 p
->change_local_as
);
9550 json_object_int_add(json_neigh
, "localAs", p
->local_as
);
9552 if (CHECK_FLAG(p
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
))
9553 json_object_boolean_true_add(json_neigh
,
9554 "localAsNoPrepend");
9556 if (CHECK_FLAG(p
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
))
9557 json_object_boolean_true_add(json_neigh
,
9558 "localAsReplaceAs");
9560 if ((p
->as_type
== AS_SPECIFIED
) || (p
->as_type
== AS_EXTERNAL
)
9561 || (p
->as_type
== AS_INTERNAL
))
9562 vty_out(vty
, "remote AS %u, ", p
->as
);
9564 vty_out(vty
, "remote AS Unspecified, ");
9565 vty_out(vty
, "local AS %u%s%s, ",
9566 p
->change_local_as
? p
->change_local_as
: p
->local_as
,
9567 CHECK_FLAG(p
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
)
9570 CHECK_FLAG(p
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
)
9574 /* peer type internal or confed-internal */
9575 if ((p
->as
== p
->local_as
) || (p
->as_type
== AS_INTERNAL
)) {
9577 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
))
9578 json_object_boolean_true_add(
9579 json_neigh
, "nbrConfedInternalLink");
9581 json_object_boolean_true_add(json_neigh
,
9584 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
))
9585 vty_out(vty
, "confed-internal link\n");
9587 vty_out(vty
, "internal link\n");
9589 /* peer type external or confed-external */
9590 } else if (p
->as
|| (p
->as_type
== AS_EXTERNAL
)) {
9592 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
))
9593 json_object_boolean_true_add(
9594 json_neigh
, "nbrConfedExternalLink");
9596 json_object_boolean_true_add(json_neigh
,
9599 if (bgp_confederation_peers_check(bgp
, p
->as
))
9600 vty_out(vty
, "confed-external link\n");
9602 vty_out(vty
, "external link\n");
9606 json_object_boolean_true_add(json_neigh
,
9607 "nbrUnspecifiedLink");
9609 vty_out(vty
, "unspecified link\n");
9615 json_object_string_add(json_neigh
, "nbrDesc", p
->desc
);
9617 vty_out(vty
, " Description: %s\n", p
->desc
);
9623 json_object_string_add(json_neigh
, "hostname",
9627 json_object_string_add(json_neigh
, "domainname",
9630 if (p
->domainname
&& (p
->domainname
[0] != '\0'))
9631 vty_out(vty
, "Hostname: %s.%s\n", p
->hostname
,
9634 vty_out(vty
, "Hostname: %s\n", p
->hostname
);
9641 json_object_string_add(json_neigh
, "peerGroup",
9645 struct prefix prefix
, *range
= NULL
;
9647 sockunion2hostprefix(&(p
->su
), &prefix
);
9648 range
= peer_group_lookup_dynamic_neighbor_range(
9652 prefix2str(range
, buf1
, sizeof(buf1
));
9653 json_object_string_add(
9655 "peerSubnetRangeGroup", buf1
);
9660 " Member of peer-group %s for session parameters\n",
9664 struct prefix prefix
, *range
= NULL
;
9666 sockunion2hostprefix(&(p
->su
), &prefix
);
9667 range
= peer_group_lookup_dynamic_neighbor_range(
9671 prefix2str(range
, buf1
, sizeof(buf1
));
9673 " Belongs to the subnet range group: %s\n",
9681 /* Administrative shutdown. */
9682 if (CHECK_FLAG(p
->flags
, PEER_FLAG_SHUTDOWN
))
9683 json_object_boolean_true_add(json_neigh
,
9687 json_object_int_add(json_neigh
, "bgpVersion", 4);
9688 json_object_string_add(
9689 json_neigh
, "remoteRouterId",
9690 inet_ntop(AF_INET
, &p
->remote_id
, buf1
, sizeof(buf1
)));
9691 json_object_string_add(
9692 json_neigh
, "localRouterId",
9693 inet_ntop(AF_INET
, &bgp
->router_id
, buf1
,
9697 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
)
9698 && bgp_confederation_peers_check(bgp
, p
->as
))
9699 json_object_boolean_true_add(json_neigh
,
9703 json_object_string_add(
9704 json_neigh
, "bgpState",
9705 lookup_msg(bgp_status_msg
, p
->status
, NULL
));
9707 if (p
->status
== Established
) {
9710 uptime
= bgp_clock();
9711 uptime
-= p
->uptime
;
9712 epoch_tbuf
= time(NULL
) - uptime
;
9714 json_object_int_add(json_neigh
, "bgpTimerUpMsec",
9716 json_object_string_add(json_neigh
, "bgpTimerUpString",
9717 peer_uptime(p
->uptime
, timebuf
,
9720 json_object_int_add(json_neigh
,
9721 "bgpTimerUpEstablishedEpoch",
9725 else if (p
->status
== Active
) {
9726 if (CHECK_FLAG(p
->flags
, PEER_FLAG_PASSIVE
))
9727 json_object_string_add(json_neigh
, "bgpStateIs",
9729 else if (CHECK_FLAG(p
->sflags
, PEER_STATUS_NSF_WAIT
))
9730 json_object_string_add(json_neigh
, "bgpStateIs",
9738 uptime
= bgp_clock();
9739 uptime
-= p
->readtime
;
9740 tm
= gmtime(&uptime
);
9741 json_object_int_add(json_neigh
, "bgpTimerLastRead",
9742 (tm
->tm_sec
* 1000) + (tm
->tm_min
* 60000)
9743 + (tm
->tm_hour
* 3600000));
9745 uptime
= bgp_clock();
9746 uptime
-= p
->last_write
;
9747 tm
= gmtime(&uptime
);
9748 json_object_int_add(json_neigh
, "bgpTimerLastWrite",
9749 (tm
->tm_sec
* 1000) + (tm
->tm_min
* 60000)
9750 + (tm
->tm_hour
* 3600000));
9752 uptime
= bgp_clock();
9753 uptime
-= p
->update_time
;
9754 tm
= gmtime(&uptime
);
9755 json_object_int_add(json_neigh
, "bgpInUpdateElapsedTimeMsecs",
9756 (tm
->tm_sec
* 1000) + (tm
->tm_min
* 60000)
9757 + (tm
->tm_hour
* 3600000));
9759 /* Configured timer values. */
9760 json_object_int_add(json_neigh
, "bgpTimerHoldTimeMsecs",
9761 p
->v_holdtime
* 1000);
9762 json_object_int_add(json_neigh
,
9763 "bgpTimerKeepAliveIntervalMsecs",
9764 p
->v_keepalive
* 1000);
9765 if (CHECK_FLAG(p
->flags
, PEER_FLAG_TIMER
)) {
9766 json_object_int_add(json_neigh
,
9767 "bgpTimerConfiguredHoldTimeMsecs",
9768 p
->holdtime
* 1000);
9769 json_object_int_add(
9771 "bgpTimerConfiguredKeepAliveIntervalMsecs",
9772 p
->keepalive
* 1000);
9773 } else if ((bgp
->default_holdtime
!= SAVE_BGP_HOLDTIME
)
9774 || (bgp
->default_keepalive
!= SAVE_BGP_KEEPALIVE
)) {
9775 json_object_int_add(json_neigh
,
9776 "bgpTimerConfiguredHoldTimeMsecs",
9777 bgp
->default_holdtime
);
9778 json_object_int_add(
9780 "bgpTimerConfiguredKeepAliveIntervalMsecs",
9781 bgp
->default_keepalive
);
9784 /* Administrative shutdown. */
9785 if (CHECK_FLAG(p
->flags
, PEER_FLAG_SHUTDOWN
))
9786 vty_out(vty
, " Administratively shut down\n");
9789 vty_out(vty
, " BGP version 4");
9790 vty_out(vty
, ", remote router ID %s",
9791 inet_ntop(AF_INET
, &p
->remote_id
, buf1
, sizeof(buf1
)));
9792 vty_out(vty
, ", local router ID %s\n",
9793 inet_ntop(AF_INET
, &bgp
->router_id
, buf1
,
9797 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
)
9798 && bgp_confederation_peers_check(bgp
, p
->as
))
9800 " Neighbor under common administration\n");
9803 vty_out(vty
, " BGP state = %s",
9804 lookup_msg(bgp_status_msg
, p
->status
, NULL
));
9806 if (p
->status
== Established
)
9807 vty_out(vty
, ", up for %8s",
9808 peer_uptime(p
->uptime
, timebuf
, BGP_UPTIME_LEN
,
9811 else if (p
->status
== Active
) {
9812 if (CHECK_FLAG(p
->flags
, PEER_FLAG_PASSIVE
))
9813 vty_out(vty
, " (passive)");
9814 else if (CHECK_FLAG(p
->sflags
, PEER_STATUS_NSF_WAIT
))
9815 vty_out(vty
, " (NSF passive)");
9820 vty_out(vty
, " Last read %s",
9821 peer_uptime(p
->readtime
, timebuf
, BGP_UPTIME_LEN
, 0,
9823 vty_out(vty
, ", Last write %s\n",
9824 peer_uptime(p
->last_write
, timebuf
, BGP_UPTIME_LEN
, 0,
9827 /* Configured timer values. */
9829 " Hold time is %d, keepalive interval is %d seconds\n",
9830 p
->v_holdtime
, p
->v_keepalive
);
9831 if (CHECK_FLAG(p
->flags
, PEER_FLAG_TIMER
)) {
9832 vty_out(vty
, " Configured hold time is %d",
9834 vty_out(vty
, ", keepalive interval is %d seconds\n",
9836 } else if ((bgp
->default_holdtime
!= SAVE_BGP_HOLDTIME
)
9837 || (bgp
->default_keepalive
!= SAVE_BGP_KEEPALIVE
)) {
9838 vty_out(vty
, " Configured hold time is %d",
9839 bgp
->default_holdtime
);
9840 vty_out(vty
, ", keepalive interval is %d seconds\n",
9841 bgp
->default_keepalive
);
9845 if (p
->status
== Established
) {
9846 if (p
->cap
|| p
->afc_adv
[AFI_IP
][SAFI_UNICAST
]
9847 || p
->afc_recv
[AFI_IP
][SAFI_UNICAST
]
9848 || p
->afc_adv
[AFI_IP
][SAFI_MULTICAST
]
9849 || p
->afc_recv
[AFI_IP
][SAFI_MULTICAST
]
9850 || p
->afc_adv
[AFI_IP6
][SAFI_UNICAST
]
9851 || p
->afc_recv
[AFI_IP6
][SAFI_UNICAST
]
9852 || p
->afc_adv
[AFI_IP6
][SAFI_MULTICAST
]
9853 || p
->afc_recv
[AFI_IP6
][SAFI_MULTICAST
]
9854 || p
->afc_adv
[AFI_IP6
][SAFI_MPLS_VPN
]
9855 || p
->afc_recv
[AFI_IP6
][SAFI_MPLS_VPN
]
9856 || p
->afc_adv
[AFI_IP6
][SAFI_ENCAP
]
9857 || p
->afc_recv
[AFI_IP6
][SAFI_ENCAP
]
9858 || p
->afc_adv
[AFI_IP6
][SAFI_FLOWSPEC
]
9859 || p
->afc_recv
[AFI_IP6
][SAFI_FLOWSPEC
]
9860 || p
->afc_adv
[AFI_IP
][SAFI_ENCAP
]
9861 || p
->afc_recv
[AFI_IP
][SAFI_ENCAP
]
9862 || p
->afc_adv
[AFI_IP
][SAFI_FLOWSPEC
]
9863 || p
->afc_recv
[AFI_IP
][SAFI_FLOWSPEC
]
9864 || p
->afc_adv
[AFI_IP
][SAFI_MPLS_VPN
]
9865 || p
->afc_recv
[AFI_IP
][SAFI_MPLS_VPN
]) {
9867 json_object
*json_cap
= NULL
;
9869 json_cap
= json_object_new_object();
9872 if (CHECK_FLAG(p
->cap
, PEER_CAP_AS4_RCV
)
9873 || CHECK_FLAG(p
->cap
, PEER_CAP_AS4_ADV
)) {
9874 if (CHECK_FLAG(p
->cap
, PEER_CAP_AS4_ADV
)
9875 && CHECK_FLAG(p
->cap
,
9877 json_object_string_add(
9878 json_cap
, "4byteAs",
9879 "advertisedAndReceived");
9880 else if (CHECK_FLAG(p
->cap
,
9882 json_object_string_add(
9883 json_cap
, "4byteAs",
9885 else if (CHECK_FLAG(p
->cap
,
9887 json_object_string_add(
9888 json_cap
, "4byteAs",
9893 if (CHECK_FLAG(p
->cap
, PEER_CAP_ADDPATH_RCV
)
9894 || CHECK_FLAG(p
->cap
,
9895 PEER_CAP_ADDPATH_ADV
)) {
9896 json_object
*json_add
= NULL
;
9897 const char *print_store
;
9899 json_add
= json_object_new_object();
9901 FOREACH_AFI_SAFI (afi
, safi
) {
9902 json_object
*json_sub
= NULL
;
9904 json_object_new_object();
9905 print_store
= get_afi_safi_str(
9911 PEER_CAP_ADDPATH_AF_TX_ADV
)
9915 PEER_CAP_ADDPATH_AF_TX_RCV
)) {
9920 PEER_CAP_ADDPATH_AF_TX_ADV
)
9925 PEER_CAP_ADDPATH_AF_TX_RCV
))
9926 json_object_boolean_true_add(
9928 "txAdvertisedAndReceived");
9934 PEER_CAP_ADDPATH_AF_TX_ADV
))
9935 json_object_boolean_true_add(
9943 PEER_CAP_ADDPATH_AF_TX_RCV
))
9944 json_object_boolean_true_add(
9952 PEER_CAP_ADDPATH_AF_RX_ADV
)
9956 PEER_CAP_ADDPATH_AF_RX_RCV
)) {
9961 PEER_CAP_ADDPATH_AF_RX_ADV
)
9966 PEER_CAP_ADDPATH_AF_RX_RCV
))
9967 json_object_boolean_true_add(
9969 "rxAdvertisedAndReceived");
9975 PEER_CAP_ADDPATH_AF_RX_ADV
))
9976 json_object_boolean_true_add(
9984 PEER_CAP_ADDPATH_AF_RX_RCV
))
9985 json_object_boolean_true_add(
9993 PEER_CAP_ADDPATH_AF_TX_ADV
)
9997 PEER_CAP_ADDPATH_AF_TX_RCV
)
10001 PEER_CAP_ADDPATH_AF_RX_ADV
)
10005 PEER_CAP_ADDPATH_AF_RX_RCV
))
10006 json_object_object_add(
10015 json_object_object_add(
10016 json_cap
, "addPath", json_add
);
10020 if (CHECK_FLAG(p
->cap
, PEER_CAP_DYNAMIC_RCV
)
10021 || CHECK_FLAG(p
->cap
,
10022 PEER_CAP_DYNAMIC_ADV
)) {
10023 if (CHECK_FLAG(p
->cap
,
10024 PEER_CAP_DYNAMIC_ADV
)
10025 && CHECK_FLAG(p
->cap
,
10026 PEER_CAP_DYNAMIC_RCV
))
10027 json_object_string_add(
10028 json_cap
, "dynamic",
10029 "advertisedAndReceived");
10030 else if (CHECK_FLAG(
10032 PEER_CAP_DYNAMIC_ADV
))
10033 json_object_string_add(
10034 json_cap
, "dynamic",
10036 else if (CHECK_FLAG(
10038 PEER_CAP_DYNAMIC_RCV
))
10039 json_object_string_add(
10040 json_cap
, "dynamic",
10044 /* Extended nexthop */
10045 if (CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_RCV
)
10046 || CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_ADV
)) {
10047 json_object
*json_nxt
= NULL
;
10048 const char *print_store
;
10051 if (CHECK_FLAG(p
->cap
,
10053 && CHECK_FLAG(p
->cap
,
10054 PEER_CAP_ENHE_RCV
))
10055 json_object_string_add(
10058 "advertisedAndReceived");
10059 else if (CHECK_FLAG(p
->cap
,
10060 PEER_CAP_ENHE_ADV
))
10061 json_object_string_add(
10065 else if (CHECK_FLAG(p
->cap
,
10066 PEER_CAP_ENHE_RCV
))
10067 json_object_string_add(
10072 if (CHECK_FLAG(p
->cap
,
10073 PEER_CAP_ENHE_RCV
)) {
10075 json_object_new_object();
10077 for (safi
= SAFI_UNICAST
;
10078 safi
< SAFI_MAX
; safi
++) {
10083 PEER_CAP_ENHE_AF_RCV
)) {
10084 print_store
= get_afi_safi_str(
10087 json_object_string_add(
10090 "recieved"); /* misspelled for compatibility */
10093 json_object_object_add(
10095 "extendedNexthopFamililesByPeer",
10100 /* Route Refresh */
10101 if (CHECK_FLAG(p
->cap
, PEER_CAP_REFRESH_ADV
)
10102 || CHECK_FLAG(p
->cap
,
10103 PEER_CAP_REFRESH_NEW_RCV
)
10104 || CHECK_FLAG(p
->cap
,
10105 PEER_CAP_REFRESH_OLD_RCV
)) {
10106 if (CHECK_FLAG(p
->cap
,
10107 PEER_CAP_REFRESH_ADV
)
10110 PEER_CAP_REFRESH_NEW_RCV
)
10113 PEER_CAP_REFRESH_OLD_RCV
))) {
10116 PEER_CAP_REFRESH_OLD_RCV
)
10119 PEER_CAP_REFRESH_NEW_RCV
))
10120 json_object_string_add(
10123 "advertisedAndReceivedOldNew");
10127 PEER_CAP_REFRESH_OLD_RCV
))
10128 json_object_string_add(
10131 "advertisedAndReceivedOld");
10133 json_object_string_add(
10136 "advertisedAndReceivedNew");
10141 PEER_CAP_REFRESH_ADV
))
10142 json_object_string_add(
10149 PEER_CAP_REFRESH_NEW_RCV
)
10152 PEER_CAP_REFRESH_OLD_RCV
))
10153 json_object_string_add(
10159 /* Multiprotocol Extensions */
10160 json_object
*json_multi
= NULL
;
10161 json_multi
= json_object_new_object();
10163 FOREACH_AFI_SAFI (afi
, safi
) {
10164 if (p
->afc_adv
[afi
][safi
]
10165 || p
->afc_recv
[afi
][safi
]) {
10166 json_object
*json_exten
= NULL
;
10168 json_object_new_object();
10170 if (p
->afc_adv
[afi
][safi
]
10171 && p
->afc_recv
[afi
][safi
])
10172 json_object_boolean_true_add(
10174 "advertisedAndReceived");
10175 else if (p
->afc_adv
[afi
][safi
])
10176 json_object_boolean_true_add(
10179 else if (p
->afc_recv
[afi
][safi
])
10180 json_object_boolean_true_add(
10184 json_object_object_add(
10186 get_afi_safi_str(afi
,
10192 json_object_object_add(
10193 json_cap
, "multiprotocolExtensions",
10196 /* Hostname capabilities */
10197 json_object
*json_hname
= NULL
;
10199 json_hname
= json_object_new_object();
10201 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_ADV
)) {
10202 json_object_string_add(
10203 json_hname
, "advHostName",
10204 bgp
->peer_self
->hostname
10208 json_object_string_add(
10209 json_hname
, "advDomainName",
10210 bgp
->peer_self
->domainname
10217 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_RCV
)) {
10218 json_object_string_add(
10219 json_hname
, "rcvHostName",
10220 p
->hostname
? p
->hostname
10222 json_object_string_add(
10223 json_hname
, "rcvDomainName",
10224 p
->domainname
? p
->domainname
10228 json_object_object_add(json_cap
, "hostName",
10231 /* Gracefull Restart */
10232 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
)
10233 || CHECK_FLAG(p
->cap
,
10234 PEER_CAP_RESTART_ADV
)) {
10235 if (CHECK_FLAG(p
->cap
,
10236 PEER_CAP_RESTART_ADV
)
10237 && CHECK_FLAG(p
->cap
,
10238 PEER_CAP_RESTART_RCV
))
10239 json_object_string_add(
10242 "advertisedAndReceived");
10243 else if (CHECK_FLAG(
10245 PEER_CAP_RESTART_ADV
))
10246 json_object_string_add(
10248 "gracefulRestartCapability",
10250 else if (CHECK_FLAG(
10252 PEER_CAP_RESTART_RCV
))
10253 json_object_string_add(
10255 "gracefulRestartCapability",
10258 if (CHECK_FLAG(p
->cap
,
10259 PEER_CAP_RESTART_RCV
)) {
10260 int restart_af_count
= 0;
10261 json_object
*json_restart
=
10264 json_object_new_object();
10266 json_object_int_add(
10268 "gracefulRestartRemoteTimerMsecs",
10269 p
->v_gr_restart
* 1000);
10271 FOREACH_AFI_SAFI (afi
, safi
) {
10276 PEER_CAP_RESTART_AF_RCV
)) {
10281 json_object_new_object();
10287 PEER_CAP_RESTART_AF_PRESERVE_RCV
))
10288 json_object_boolean_true_add(
10291 restart_af_count
++;
10292 json_object_object_add(
10301 if (!restart_af_count
) {
10302 json_object_string_add(
10304 "addressFamiliesByPeer",
10309 json_object_object_add(
10311 "addressFamiliesByPeer",
10315 json_object_object_add(json_neigh
,
10316 "neighborCapabilities",
10319 vty_out(vty
, " Neighbor capabilities:\n");
10322 if (CHECK_FLAG(p
->cap
, PEER_CAP_AS4_RCV
)
10323 || CHECK_FLAG(p
->cap
, PEER_CAP_AS4_ADV
)) {
10324 vty_out(vty
, " 4 Byte AS:");
10325 if (CHECK_FLAG(p
->cap
,
10327 vty_out(vty
, " advertised");
10328 if (CHECK_FLAG(p
->cap
,
10330 vty_out(vty
, " %sreceived",
10336 vty_out(vty
, "\n");
10340 if (CHECK_FLAG(p
->cap
, PEER_CAP_ADDPATH_RCV
)
10341 || CHECK_FLAG(p
->cap
,
10342 PEER_CAP_ADDPATH_ADV
)) {
10343 vty_out(vty
, " AddPath:\n");
10345 FOREACH_AFI_SAFI (afi
, safi
) {
10349 PEER_CAP_ADDPATH_AF_TX_ADV
)
10353 PEER_CAP_ADDPATH_AF_TX_RCV
)) {
10365 PEER_CAP_ADDPATH_AF_TX_ADV
))
10377 PEER_CAP_ADDPATH_AF_TX_RCV
))
10384 PEER_CAP_ADDPATH_AF_TX_ADV
)
10388 vty_out(vty
, "\n");
10394 PEER_CAP_ADDPATH_AF_RX_ADV
)
10398 PEER_CAP_ADDPATH_AF_RX_RCV
)) {
10410 PEER_CAP_ADDPATH_AF_RX_ADV
))
10422 PEER_CAP_ADDPATH_AF_RX_RCV
))
10429 PEER_CAP_ADDPATH_AF_RX_ADV
)
10433 vty_out(vty
, "\n");
10439 if (CHECK_FLAG(p
->cap
, PEER_CAP_DYNAMIC_RCV
)
10440 || CHECK_FLAG(p
->cap
,
10441 PEER_CAP_DYNAMIC_ADV
)) {
10442 vty_out(vty
, " Dynamic:");
10443 if (CHECK_FLAG(p
->cap
,
10444 PEER_CAP_DYNAMIC_ADV
))
10445 vty_out(vty
, " advertised");
10446 if (CHECK_FLAG(p
->cap
,
10447 PEER_CAP_DYNAMIC_RCV
))
10448 vty_out(vty
, " %sreceived",
10451 PEER_CAP_DYNAMIC_ADV
)
10454 vty_out(vty
, "\n");
10457 /* Extended nexthop */
10458 if (CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_RCV
)
10459 || CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_ADV
)) {
10460 vty_out(vty
, " Extended nexthop:");
10461 if (CHECK_FLAG(p
->cap
,
10462 PEER_CAP_ENHE_ADV
))
10463 vty_out(vty
, " advertised");
10464 if (CHECK_FLAG(p
->cap
,
10465 PEER_CAP_ENHE_RCV
))
10466 vty_out(vty
, " %sreceived",
10472 vty_out(vty
, "\n");
10474 if (CHECK_FLAG(p
->cap
,
10475 PEER_CAP_ENHE_RCV
)) {
10477 " Address families by peer:\n ");
10478 for (safi
= SAFI_UNICAST
;
10479 safi
< SAFI_MAX
; safi
++)
10484 PEER_CAP_ENHE_AF_RCV
))
10494 /* Route Refresh */
10495 if (CHECK_FLAG(p
->cap
, PEER_CAP_REFRESH_ADV
)
10496 || CHECK_FLAG(p
->cap
,
10497 PEER_CAP_REFRESH_NEW_RCV
)
10498 || CHECK_FLAG(p
->cap
,
10499 PEER_CAP_REFRESH_OLD_RCV
)) {
10500 vty_out(vty
, " Route refresh:");
10501 if (CHECK_FLAG(p
->cap
,
10502 PEER_CAP_REFRESH_ADV
))
10503 vty_out(vty
, " advertised");
10504 if (CHECK_FLAG(p
->cap
,
10505 PEER_CAP_REFRESH_NEW_RCV
)
10508 PEER_CAP_REFRESH_OLD_RCV
))
10509 vty_out(vty
, " %sreceived(%s)",
10512 PEER_CAP_REFRESH_ADV
)
10517 PEER_CAP_REFRESH_OLD_RCV
)
10520 PEER_CAP_REFRESH_NEW_RCV
))
10524 PEER_CAP_REFRESH_OLD_RCV
)
10528 vty_out(vty
, "\n");
10531 /* Multiprotocol Extensions */
10532 FOREACH_AFI_SAFI (afi
, safi
)
10533 if (p
->afc_adv
[afi
][safi
]
10534 || p
->afc_recv
[afi
][safi
]) {
10536 " Address Family %s:",
10541 if (p
->afc_adv
[afi
][safi
])
10544 if (p
->afc_recv
[afi
][safi
])
10551 vty_out(vty
, "\n");
10554 /* Hostname capability */
10555 vty_out(vty
, " Hostname Capability:");
10557 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_ADV
)) {
10559 " advertised (name: %s,domain name: %s)",
10560 bgp
->peer_self
->hostname
10564 bgp
->peer_self
->domainname
10569 vty_out(vty
, " not advertised");
10572 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_RCV
)) {
10574 " received (name: %s,domain name: %s)",
10575 p
->hostname
? p
->hostname
10577 p
->domainname
? p
->domainname
10580 vty_out(vty
, " not received");
10583 vty_out(vty
, "\n");
10585 /* Gracefull Restart */
10586 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
)
10587 || CHECK_FLAG(p
->cap
,
10588 PEER_CAP_RESTART_ADV
)) {
10590 " Graceful Restart Capabilty:");
10591 if (CHECK_FLAG(p
->cap
,
10592 PEER_CAP_RESTART_ADV
))
10593 vty_out(vty
, " advertised");
10594 if (CHECK_FLAG(p
->cap
,
10595 PEER_CAP_RESTART_RCV
))
10596 vty_out(vty
, " %sreceived",
10599 PEER_CAP_RESTART_ADV
)
10602 vty_out(vty
, "\n");
10604 if (CHECK_FLAG(p
->cap
,
10605 PEER_CAP_RESTART_RCV
)) {
10606 int restart_af_count
= 0;
10609 " Remote Restart timer is %d seconds\n",
10612 " Address families by peer:\n ");
10614 FOREACH_AFI_SAFI (afi
, safi
)
10619 PEER_CAP_RESTART_AF_RCV
)) {
10633 PEER_CAP_RESTART_AF_PRESERVE_RCV
)
10635 : "not preserved");
10636 restart_af_count
++;
10638 if (!restart_af_count
)
10639 vty_out(vty
, "none");
10640 vty_out(vty
, "\n");
10647 /* graceful restart information */
10648 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
) || p
->t_gr_restart
10649 || p
->t_gr_stale
) {
10650 json_object
*json_grace
= NULL
;
10651 json_object
*json_grace_send
= NULL
;
10652 json_object
*json_grace_recv
= NULL
;
10653 int eor_send_af_count
= 0;
10654 int eor_receive_af_count
= 0;
10657 json_grace
= json_object_new_object();
10658 json_grace_send
= json_object_new_object();
10659 json_grace_recv
= json_object_new_object();
10661 if (p
->status
== Established
) {
10662 FOREACH_AFI_SAFI (afi
, safi
) {
10663 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
10664 PEER_STATUS_EOR_SEND
)) {
10665 json_object_boolean_true_add(
10667 get_afi_safi_str(afi
,
10670 eor_send_af_count
++;
10673 FOREACH_AFI_SAFI (afi
, safi
) {
10675 p
->af_sflags
[afi
][safi
],
10676 PEER_STATUS_EOR_RECEIVED
)) {
10677 json_object_boolean_true_add(
10679 get_afi_safi_str(afi
,
10682 eor_receive_af_count
++;
10687 json_object_object_add(json_grace
, "endOfRibSend",
10689 json_object_object_add(json_grace
, "endOfRibRecv",
10692 if (p
->t_gr_restart
)
10693 json_object_int_add(json_grace
,
10694 "gracefulRestartTimerMsecs",
10695 thread_timer_remain_second(
10700 json_object_int_add(
10702 "gracefulStalepathTimerMsecs",
10703 thread_timer_remain_second(
10707 json_object_object_add(
10708 json_neigh
, "gracefulRestartInfo", json_grace
);
10710 vty_out(vty
, " Graceful restart information:\n");
10711 if (p
->status
== Established
) {
10712 vty_out(vty
, " End-of-RIB send: ");
10713 FOREACH_AFI_SAFI (afi
, safi
) {
10714 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
10715 PEER_STATUS_EOR_SEND
)) {
10716 vty_out(vty
, "%s%s",
10717 eor_send_af_count
? ", "
10719 get_afi_safi_str(afi
,
10722 eor_send_af_count
++;
10725 vty_out(vty
, "\n");
10726 vty_out(vty
, " End-of-RIB received: ");
10727 FOREACH_AFI_SAFI (afi
, safi
) {
10729 p
->af_sflags
[afi
][safi
],
10730 PEER_STATUS_EOR_RECEIVED
)) {
10731 vty_out(vty
, "%s%s",
10732 eor_receive_af_count
10735 get_afi_safi_str(afi
,
10738 eor_receive_af_count
++;
10741 vty_out(vty
, "\n");
10744 if (p
->t_gr_restart
)
10746 " The remaining time of restart timer is %ld\n",
10747 thread_timer_remain_second(
10752 " The remaining time of stalepath timer is %ld\n",
10753 thread_timer_remain_second(
10758 json_object
*json_stat
= NULL
;
10759 json_stat
= json_object_new_object();
10760 /* Packet counts. */
10761 json_object_int_add(json_stat
, "depthInq", 0);
10762 json_object_int_add(json_stat
, "depthOutq",
10763 (unsigned long)p
->obuf
->count
);
10764 json_object_int_add(json_stat
, "opensSent",
10765 atomic_load_explicit(&p
->open_out
,
10766 memory_order_relaxed
));
10767 json_object_int_add(json_stat
, "opensRecv",
10768 atomic_load_explicit(&p
->open_in
,
10769 memory_order_relaxed
));
10770 json_object_int_add(json_stat
, "notificationsSent",
10771 atomic_load_explicit(&p
->notify_out
,
10772 memory_order_relaxed
));
10773 json_object_int_add(json_stat
, "notificationsRecv",
10774 atomic_load_explicit(&p
->notify_in
,
10775 memory_order_relaxed
));
10776 json_object_int_add(json_stat
, "updatesSent",
10777 atomic_load_explicit(&p
->update_out
,
10778 memory_order_relaxed
));
10779 json_object_int_add(json_stat
, "updatesRecv",
10780 atomic_load_explicit(&p
->update_in
,
10781 memory_order_relaxed
));
10782 json_object_int_add(json_stat
, "keepalivesSent",
10783 atomic_load_explicit(&p
->keepalive_out
,
10784 memory_order_relaxed
));
10785 json_object_int_add(json_stat
, "keepalivesRecv",
10786 atomic_load_explicit(&p
->keepalive_in
,
10787 memory_order_relaxed
));
10788 json_object_int_add(json_stat
, "routeRefreshSent",
10789 atomic_load_explicit(&p
->refresh_out
,
10790 memory_order_relaxed
));
10791 json_object_int_add(json_stat
, "routeRefreshRecv",
10792 atomic_load_explicit(&p
->refresh_in
,
10793 memory_order_relaxed
));
10794 json_object_int_add(json_stat
, "capabilitySent",
10795 atomic_load_explicit(&p
->dynamic_cap_out
,
10796 memory_order_relaxed
));
10797 json_object_int_add(json_stat
, "capabilityRecv",
10798 atomic_load_explicit(&p
->dynamic_cap_in
,
10799 memory_order_relaxed
));
10800 json_object_int_add(json_stat
, "totalSent", PEER_TOTAL_TX(p
));
10801 json_object_int_add(json_stat
, "totalRecv", PEER_TOTAL_RX(p
));
10802 json_object_object_add(json_neigh
, "messageStats", json_stat
);
10804 /* Packet counts. */
10805 vty_out(vty
, " Message statistics:\n");
10806 vty_out(vty
, " Inq depth is 0\n");
10807 vty_out(vty
, " Outq depth is %lu\n",
10808 (unsigned long)p
->obuf
->count
);
10809 vty_out(vty
, " Sent Rcvd\n");
10810 vty_out(vty
, " Opens: %10d %10d\n",
10811 atomic_load_explicit(&p
->open_out
,
10812 memory_order_relaxed
),
10813 atomic_load_explicit(&p
->open_in
,
10814 memory_order_relaxed
));
10815 vty_out(vty
, " Notifications: %10d %10d\n",
10816 atomic_load_explicit(&p
->notify_out
,
10817 memory_order_relaxed
),
10818 atomic_load_explicit(&p
->notify_in
,
10819 memory_order_relaxed
));
10820 vty_out(vty
, " Updates: %10d %10d\n",
10821 atomic_load_explicit(&p
->update_out
,
10822 memory_order_relaxed
),
10823 atomic_load_explicit(&p
->update_in
,
10824 memory_order_relaxed
));
10825 vty_out(vty
, " Keepalives: %10d %10d\n",
10826 atomic_load_explicit(&p
->keepalive_out
,
10827 memory_order_relaxed
),
10828 atomic_load_explicit(&p
->keepalive_in
,
10829 memory_order_relaxed
));
10830 vty_out(vty
, " Route Refresh: %10d %10d\n",
10831 atomic_load_explicit(&p
->refresh_out
,
10832 memory_order_relaxed
),
10833 atomic_load_explicit(&p
->refresh_in
,
10834 memory_order_relaxed
));
10835 vty_out(vty
, " Capability: %10d %10d\n",
10836 atomic_load_explicit(&p
->dynamic_cap_out
,
10837 memory_order_relaxed
),
10838 atomic_load_explicit(&p
->dynamic_cap_in
,
10839 memory_order_relaxed
));
10840 vty_out(vty
, " Total: %10d %10d\n", PEER_TOTAL_TX(p
),
10845 /* advertisement-interval */
10846 json_object_int_add(json_neigh
,
10847 "minBtwnAdvertisementRunsTimerMsecs",
10848 p
->v_routeadv
* 1000);
10850 /* Update-source. */
10851 if (p
->update_if
|| p
->update_source
) {
10853 json_object_string_add(json_neigh
,
10856 else if (p
->update_source
)
10857 json_object_string_add(
10858 json_neigh
, "updateSource",
10859 sockunion2str(p
->update_source
, buf1
,
10863 /* advertisement-interval */
10865 " Minimum time between advertisement runs is %d seconds\n",
10868 /* Update-source. */
10869 if (p
->update_if
|| p
->update_source
) {
10870 vty_out(vty
, " Update source is ");
10872 vty_out(vty
, "%s", p
->update_if
);
10873 else if (p
->update_source
)
10875 sockunion2str(p
->update_source
, buf1
,
10877 vty_out(vty
, "\n");
10880 vty_out(vty
, "\n");
10883 /* Address Family Information */
10884 json_object
*json_hold
= NULL
;
10887 json_hold
= json_object_new_object();
10889 FOREACH_AFI_SAFI (afi
, safi
)
10890 if (p
->afc
[afi
][safi
])
10891 bgp_show_peer_afi(vty
, p
, afi
, safi
, use_json
,
10895 json_object_object_add(json_neigh
, "addressFamilyInfo",
10897 json_object_int_add(json_neigh
, "connectionsEstablished",
10899 json_object_int_add(json_neigh
, "connectionsDropped",
10902 vty_out(vty
, " Connections established %d; dropped %d\n",
10903 p
->established
, p
->dropped
);
10905 if (!p
->last_reset
) {
10907 json_object_string_add(json_neigh
, "lastReset",
10910 vty_out(vty
, " Last reset never\n");
10916 uptime
= bgp_clock();
10917 uptime
-= p
->resettime
;
10918 tm
= gmtime(&uptime
);
10919 json_object_int_add(json_neigh
, "lastResetTimerMsecs",
10920 (tm
->tm_sec
* 1000)
10921 + (tm
->tm_min
* 60000)
10922 + (tm
->tm_hour
* 3600000));
10923 bgp_show_peer_reset(NULL
, p
, json_neigh
, true);
10925 vty_out(vty
, " Last reset %s, ",
10926 peer_uptime(p
->resettime
, timebuf
,
10927 BGP_UPTIME_LEN
, 0, NULL
));
10929 bgp_show_peer_reset(vty
, p
, NULL
, false);
10930 if (p
->last_reset_cause_size
) {
10931 msg
= p
->last_reset_cause
;
10933 " Message received that caused BGP to send a NOTIFICATION:\n ");
10934 for (i
= 1; i
<= p
->last_reset_cause_size
;
10936 vty_out(vty
, "%02X", *msg
++);
10938 if (i
!= p
->last_reset_cause_size
) {
10940 vty_out(vty
, "\n ");
10941 } else if (i
% 4 == 0) {
10946 vty_out(vty
, "\n");
10951 if (CHECK_FLAG(p
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
)) {
10953 json_object_boolean_true_add(json_neigh
,
10954 "prefixesConfigExceedMax");
10957 " Peer had exceeded the max. no. of prefixes configured.\n");
10959 if (p
->t_pmax_restart
) {
10961 json_object_boolean_true_add(
10962 json_neigh
, "reducePrefixNumFrom");
10963 json_object_int_add(json_neigh
,
10964 "restartInTimerMsec",
10965 thread_timer_remain_second(
10970 " Reduce the no. of prefix from %s, will restart in %ld seconds\n",
10971 p
->host
, thread_timer_remain_second(
10972 p
->t_pmax_restart
));
10975 json_object_boolean_true_add(
10977 "reducePrefixNumAndClearIpBgp");
10980 " Reduce the no. of prefix and clear ip bgp %s to restore peering\n",
10985 /* EBGP Multihop and GTSM */
10986 if (p
->sort
!= BGP_PEER_IBGP
) {
10988 if (p
->gtsm_hops
> 0)
10989 json_object_int_add(json_neigh
,
10990 "externalBgpNbrMaxHopsAway",
10992 else if (p
->ttl
> BGP_DEFAULT_TTL
)
10993 json_object_int_add(json_neigh
,
10994 "externalBgpNbrMaxHopsAway",
10997 if (p
->gtsm_hops
> 0)
10999 " External BGP neighbor may be up to %d hops away.\n",
11001 else if (p
->ttl
> BGP_DEFAULT_TTL
)
11003 " External BGP neighbor may be up to %d hops away.\n",
11007 if (p
->gtsm_hops
> 0) {
11009 json_object_int_add(json_neigh
,
11010 "internalBgpNbrMaxHopsAway",
11014 " Internal BGP neighbor may be up to %d hops away.\n",
11019 /* Local address. */
11022 json_object_string_add(json_neigh
, "hostLocal",
11023 sockunion2str(p
->su_local
, buf1
,
11025 json_object_int_add(json_neigh
, "portLocal",
11026 ntohs(p
->su_local
->sin
.sin_port
));
11028 vty_out(vty
, "Local host: %s, Local port: %d\n",
11029 sockunion2str(p
->su_local
, buf1
, SU_ADDRSTRLEN
),
11030 ntohs(p
->su_local
->sin
.sin_port
));
11033 /* Remote address. */
11034 if (p
->su_remote
) {
11036 json_object_string_add(json_neigh
, "hostForeign",
11037 sockunion2str(p
->su_remote
, buf1
,
11039 json_object_int_add(json_neigh
, "portForeign",
11040 ntohs(p
->su_remote
->sin
.sin_port
));
11042 vty_out(vty
, "Foreign host: %s, Foreign port: %d\n",
11043 sockunion2str(p
->su_remote
, buf1
,
11045 ntohs(p
->su_remote
->sin
.sin_port
));
11048 /* Nexthop display. */
11051 json_object_string_add(json_neigh
, "nexthop",
11053 &p
->nexthop
.v4
, buf1
,
11055 json_object_string_add(json_neigh
, "nexthopGlobal",
11056 inet_ntop(AF_INET6
,
11057 &p
->nexthop
.v6_global
,
11058 buf1
, sizeof(buf1
)));
11059 json_object_string_add(json_neigh
, "nexthopLocal",
11060 inet_ntop(AF_INET6
,
11061 &p
->nexthop
.v6_local
,
11062 buf1
, sizeof(buf1
)));
11063 if (p
->shared_network
)
11064 json_object_string_add(json_neigh
,
11068 json_object_string_add(json_neigh
,
11070 "nonSharedNetwork");
11072 vty_out(vty
, "Nexthop: %s\n",
11073 inet_ntop(AF_INET
, &p
->nexthop
.v4
, buf1
,
11075 vty_out(vty
, "Nexthop global: %s\n",
11076 inet_ntop(AF_INET6
, &p
->nexthop
.v6_global
, buf1
,
11078 vty_out(vty
, "Nexthop local: %s\n",
11079 inet_ntop(AF_INET6
, &p
->nexthop
.v6_local
, buf1
,
11081 vty_out(vty
, "BGP connection: %s\n",
11082 p
->shared_network
? "shared network"
11083 : "non shared network");
11087 /* Timer information. */
11089 json_object_int_add(json_neigh
, "connectRetryTimer",
11091 if (p
->status
== Established
&& p
->rtt
)
11092 json_object_int_add(json_neigh
, "estimatedRttInMsecs",
11095 json_object_int_add(
11096 json_neigh
, "nextStartTimerDueInMsecs",
11097 thread_timer_remain_second(p
->t_start
) * 1000);
11099 json_object_int_add(
11100 json_neigh
, "nextConnectTimerDueInMsecs",
11101 thread_timer_remain_second(p
->t_connect
)
11103 if (p
->t_routeadv
) {
11104 json_object_int_add(json_neigh
, "mraiInterval",
11106 json_object_int_add(
11107 json_neigh
, "mraiTimerExpireInMsecs",
11108 thread_timer_remain_second(p
->t_routeadv
)
11112 json_object_int_add(json_neigh
, "authenticationEnabled",
11116 json_object_string_add(json_neigh
, "readThread", "on");
11118 json_object_string_add(json_neigh
, "readThread", "off");
11120 if (CHECK_FLAG(p
->thread_flags
, PEER_THREAD_WRITES_ON
))
11121 json_object_string_add(json_neigh
, "writeThread", "on");
11123 json_object_string_add(json_neigh
, "writeThread",
11126 vty_out(vty
, "BGP Connect Retry Timer in Seconds: %d\n",
11128 if (p
->status
== Established
&& p
->rtt
)
11129 vty_out(vty
, "Estimated round trip time: %d ms\n",
11132 vty_out(vty
, "Next start timer due in %ld seconds\n",
11133 thread_timer_remain_second(p
->t_start
));
11135 vty_out(vty
, "Next connect timer due in %ld seconds\n",
11136 thread_timer_remain_second(p
->t_connect
));
11139 "MRAI (interval %u) timer expires in %ld seconds\n",
11141 thread_timer_remain_second(p
->t_routeadv
));
11143 vty_out(vty
, "Peer Authentication Enabled\n");
11145 vty_out(vty
, "Read thread: %s Write thread: %s FD used: %d\n",
11146 p
->t_read
? "on" : "off",
11147 CHECK_FLAG(p
->thread_flags
, PEER_THREAD_WRITES_ON
)
11152 if (p
->notify
.code
== BGP_NOTIFY_OPEN_ERR
11153 && p
->notify
.subcode
== BGP_NOTIFY_OPEN_UNSUP_CAPBL
)
11154 bgp_capability_vty_out(vty
, p
, use_json
, json_neigh
);
11157 vty_out(vty
, "\n");
11159 /* BFD information. */
11160 bgp_bfd_show_info(vty
, p
, use_json
, json_neigh
);
11163 if (p
->conf_if
) /* Configured interface name. */
11164 json_object_object_add(json
, p
->conf_if
, json_neigh
);
11165 else /* Configured IP address. */
11166 json_object_object_add(json
, p
->host
, json_neigh
);
11170 static int bgp_show_neighbor(struct vty
*vty
, struct bgp
*bgp
,
11171 enum show_type type
, union sockunion
*su
,
11172 const char *conf_if
, bool use_json
,
11175 struct listnode
*node
, *nnode
;
11178 bool nbr_output
= false;
11179 afi_t afi
= AFI_MAX
;
11180 safi_t safi
= SAFI_MAX
;
11182 if (type
== show_ipv4_peer
|| type
== show_ipv4_all
) {
11184 } else if (type
== show_ipv6_peer
|| type
== show_ipv6_all
) {
11188 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
11189 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
11194 bgp_show_peer(vty
, peer
, use_json
, json
);
11200 && !strcmp(peer
->conf_if
, conf_if
))
11202 && !strcmp(peer
->hostname
, conf_if
))) {
11204 bgp_show_peer(vty
, peer
, use_json
,
11208 if (sockunion_same(&peer
->su
, su
)) {
11210 bgp_show_peer(vty
, peer
, use_json
,
11215 case show_ipv4_peer
:
11216 case show_ipv6_peer
:
11217 FOREACH_SAFI (safi
) {
11218 if (peer
->afc
[afi
][safi
]) {
11221 && !strcmp(peer
->conf_if
, conf_if
))
11223 && !strcmp(peer
->hostname
, conf_if
))) {
11225 bgp_show_peer(vty
, peer
, use_json
,
11230 if (sockunion_same(&peer
->su
, su
)) {
11232 bgp_show_peer(vty
, peer
, use_json
,
11240 case show_ipv4_all
:
11241 case show_ipv6_all
:
11242 FOREACH_SAFI (safi
) {
11243 if (peer
->afc
[afi
][safi
]) {
11244 bgp_show_peer(vty
, peer
, use_json
, json
);
11253 if ((type
== show_peer
|| type
== show_ipv4_peer
||
11254 type
== show_ipv6_peer
) && !find
) {
11256 json_object_boolean_true_add(json
, "bgpNoSuchNeighbor");
11258 vty_out(vty
, "%% No such neighbor in this view/vrf\n");
11261 if (type
!= show_peer
&& type
!= show_ipv4_peer
&&
11262 type
!= show_ipv6_peer
&& !nbr_output
&& !use_json
)
11263 vty_out(vty
, "%% No BGP neighbors found\n");
11266 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
11267 json
, JSON_C_TO_STRING_PRETTY
));
11269 vty_out(vty
, "\n");
11272 return CMD_SUCCESS
;
11275 static void bgp_show_all_instances_neighbors_vty(struct vty
*vty
,
11276 enum show_type type
,
11277 const char *ip_str
,
11280 struct listnode
*node
, *nnode
;
11282 union sockunion su
;
11283 json_object
*json
= NULL
;
11284 int ret
, is_first
= 1;
11285 bool nbr_output
= false;
11288 vty_out(vty
, "{\n");
11290 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
11293 if (!(json
= json_object_new_object())) {
11295 EC_BGP_JSON_MEM_ERROR
,
11296 "Unable to allocate memory for JSON object");
11298 "{\"error\": {\"message:\": \"Unable to allocate memory for JSON object\"}}}\n");
11302 json_object_int_add(json
, "vrfId",
11303 (bgp
->vrf_id
== VRF_UNKNOWN
)
11305 : (int64_t)bgp
->vrf_id
);
11306 json_object_string_add(
11308 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
11313 vty_out(vty
, ",\n");
11317 vty_out(vty
, "\"%s\":",
11318 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
11322 vty_out(vty
, "\nInstance %s:\n",
11323 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
11328 if (type
== show_peer
|| type
== show_ipv4_peer
||
11329 type
== show_ipv6_peer
) {
11330 ret
= str2sockunion(ip_str
, &su
);
11332 bgp_show_neighbor(vty
, bgp
, type
, NULL
, ip_str
,
11335 bgp_show_neighbor(vty
, bgp
, type
, &su
, NULL
,
11338 bgp_show_neighbor(vty
, bgp
, type
, NULL
, NULL
,
11341 json_object_free(json
);
11345 vty_out(vty
, "}\n");
11346 json_object_free(json
);
11348 else if (!nbr_output
)
11349 vty_out(vty
, "%% BGP instance not found\n");
11352 static int bgp_show_neighbor_vty(struct vty
*vty
, const char *name
,
11353 enum show_type type
, const char *ip_str
,
11358 union sockunion su
;
11359 json_object
*json
= NULL
;
11362 if (strmatch(name
, "all")) {
11363 bgp_show_all_instances_neighbors_vty(vty
, type
, ip_str
,
11365 return CMD_SUCCESS
;
11367 bgp
= bgp_lookup_by_name(name
);
11370 json
= json_object_new_object();
11371 vty_out(vty
, "%s\n",
11372 json_object_to_json_string_ext(
11374 JSON_C_TO_STRING_PRETTY
));
11375 json_object_free(json
);
11378 "%% BGP instance not found\n");
11380 return CMD_WARNING
;
11384 bgp
= bgp_get_default();
11388 json
= json_object_new_object();
11390 ret
= str2sockunion(ip_str
, &su
);
11392 bgp_show_neighbor(vty
, bgp
, type
, NULL
, ip_str
,
11395 bgp_show_neighbor(vty
, bgp
, type
, &su
, NULL
,
11398 bgp_show_neighbor(vty
, bgp
, type
, NULL
, NULL
, use_json
,
11401 json_object_free(json
);
11404 vty_out(vty
, "{}\n");
11406 vty_out(vty
, "%% BGP instance not found\n");
11409 return CMD_SUCCESS
;
11412 /* "show [ip] bgp neighbors" commands. */
11413 DEFUN (show_ip_bgp_neighbors
,
11414 show_ip_bgp_neighbors_cmd
,
11415 "show [ip] bgp [<view|vrf> VIEWVRFNAME] [<ipv4|ipv6>] neighbors [<A.B.C.D|X:X::X:X|WORD>] [json]",
11419 BGP_INSTANCE_HELP_STR
11422 "Detailed information on TCP and BGP neighbor connections\n"
11423 "Neighbor to display information about\n"
11424 "Neighbor to display information about\n"
11425 "Neighbor on BGP configured interface\n"
11429 char *sh_arg
= NULL
;
11430 enum show_type sh_type
;
11431 afi_t afi
= AFI_MAX
;
11433 bool uj
= use_json(argc
, argv
);
11437 /* [<vrf> VIEWVRFNAME] */
11438 if (argv_find(argv
, argc
, "vrf", &idx
)) {
11439 vrf
= argv
[idx
+ 1]->arg
;
11440 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
11442 } else if (argv_find(argv
, argc
, "view", &idx
))
11443 /* [<view> VIEWVRFNAME] */
11444 vrf
= argv
[idx
+ 1]->arg
;
11448 if (argv_find(argv
, argc
, "ipv4", &idx
)) {
11449 sh_type
= show_ipv4_all
;
11451 } else if (argv_find(argv
, argc
, "ipv6", &idx
)) {
11452 sh_type
= show_ipv6_all
;
11455 sh_type
= show_all
;
11458 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)
11459 || argv_find(argv
, argc
, "X:X::X:X", &idx
)
11460 || argv_find(argv
, argc
, "WORD", &idx
)) {
11461 sh_type
= show_peer
;
11462 sh_arg
= argv
[idx
]->arg
;
11465 if (sh_type
== show_peer
&& afi
== AFI_IP
) {
11466 sh_type
= show_ipv4_peer
;
11467 } else if (sh_type
== show_peer
&& afi
== AFI_IP6
) {
11468 sh_type
= show_ipv6_peer
;
11471 return bgp_show_neighbor_vty(vty
, vrf
, sh_type
, sh_arg
, uj
);
11474 /* Show BGP's AS paths internal data. There are both `show [ip] bgp
11475 paths' and `show ip mbgp paths'. Those functions results are the
11477 DEFUN (show_ip_bgp_paths
,
11478 show_ip_bgp_paths_cmd
,
11479 "show [ip] bgp ["BGP_SAFI_CMD_STR
"] paths",
11484 "Path information\n")
11486 vty_out(vty
, "Address Refcnt Path\n");
11487 aspath_print_all_vty(vty
);
11488 return CMD_SUCCESS
;
11493 static void community_show_all_iterator(struct hash_bucket
*bucket
,
11496 struct community
*com
;
11498 com
= (struct community
*)bucket
->data
;
11499 vty_out(vty
, "[%p] (%ld) %s\n", (void *)com
, com
->refcnt
,
11500 community_str(com
, false));
11503 /* Show BGP's community internal data. */
11504 DEFUN (show_ip_bgp_community_info
,
11505 show_ip_bgp_community_info_cmd
,
11506 "show [ip] bgp community-info",
11510 "List all bgp community information\n")
11512 vty_out(vty
, "Address Refcnt Community\n");
11514 hash_iterate(community_hash(),
11515 (void (*)(struct hash_bucket
*,
11516 void *))community_show_all_iterator
,
11519 return CMD_SUCCESS
;
11522 static void lcommunity_show_all_iterator(struct hash_bucket
*bucket
,
11525 struct lcommunity
*lcom
;
11527 lcom
= (struct lcommunity
*)bucket
->data
;
11528 vty_out(vty
, "[%p] (%ld) %s\n", (void *)lcom
, lcom
->refcnt
,
11529 lcommunity_str(lcom
, false));
11532 /* Show BGP's community internal data. */
11533 DEFUN (show_ip_bgp_lcommunity_info
,
11534 show_ip_bgp_lcommunity_info_cmd
,
11535 "show ip bgp large-community-info",
11539 "List all bgp large-community information\n")
11541 vty_out(vty
, "Address Refcnt Large-community\n");
11543 hash_iterate(lcommunity_hash(),
11544 (void (*)(struct hash_bucket
*,
11545 void *))lcommunity_show_all_iterator
,
11548 return CMD_SUCCESS
;
11552 DEFUN (show_ip_bgp_attr_info
,
11553 show_ip_bgp_attr_info_cmd
,
11554 "show [ip] bgp attribute-info",
11558 "List all bgp attribute information\n")
11560 attr_show_all(vty
);
11561 return CMD_SUCCESS
;
11564 static int bgp_show_route_leak_vty(struct vty
*vty
, const char *name
,
11565 afi_t afi
, safi_t safi
,
11566 bool use_json
, json_object
*json
)
11569 struct listnode
*node
;
11571 char buf1
[INET6_ADDRSTRLEN
];
11573 vpn_policy_direction_t dir
;
11576 json_object
*json_import_vrfs
= NULL
;
11577 json_object
*json_export_vrfs
= NULL
;
11579 bgp
= name
? bgp_lookup_by_name(name
) : bgp_get_default();
11582 vty_out(vty
, "%s\n",
11583 json_object_to_json_string_ext(
11585 JSON_C_TO_STRING_PRETTY
));
11586 json_object_free(json
);
11588 return CMD_WARNING
;
11591 /* Provide context for the block */
11592 json_object_string_add(json
, "vrf", name
? name
: "default");
11593 json_object_string_add(json
, "afiSafi",
11594 get_afi_safi_str(afi
, safi
, true));
11596 if (!CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
11597 BGP_CONFIG_VRF_TO_VRF_IMPORT
)) {
11598 json_object_string_add(json
, "importFromVrfs", "none");
11599 json_object_string_add(json
, "importRts", "none");
11601 json_import_vrfs
= json_object_new_array();
11603 for (ALL_LIST_ELEMENTS_RO(
11604 bgp
->vpn_policy
[afi
].import_vrf
,
11606 json_object_array_add(json_import_vrfs
,
11607 json_object_new_string(vname
));
11609 json_object_object_add(json
, "importFromVrfs",
11611 dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
11612 if (bgp
->vpn_policy
[afi
].rtlist
[dir
]) {
11613 ecom_str
= ecommunity_ecom2str(
11614 bgp
->vpn_policy
[afi
].rtlist
[dir
],
11615 ECOMMUNITY_FORMAT_ROUTE_MAP
, 0);
11616 json_object_string_add(json
, "importRts",
11618 XFREE(MTYPE_ECOMMUNITY_STR
, ecom_str
);
11620 json_object_string_add(json
, "importRts",
11624 if (!CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
11625 BGP_CONFIG_VRF_TO_VRF_EXPORT
)) {
11626 json_object_string_add(json
, "exportToVrfs", "none");
11627 json_object_string_add(json
, "routeDistinguisher",
11629 json_object_string_add(json
, "exportRts", "none");
11631 json_export_vrfs
= json_object_new_array();
11633 for (ALL_LIST_ELEMENTS_RO(
11634 bgp
->vpn_policy
[afi
].export_vrf
,
11636 json_object_array_add(json_export_vrfs
,
11637 json_object_new_string(vname
));
11638 json_object_object_add(json
, "exportToVrfs",
11640 json_object_string_add(json
, "routeDistinguisher",
11641 prefix_rd2str(&bgp
->vpn_policy
[afi
].tovpn_rd
,
11642 buf1
, RD_ADDRSTRLEN
));
11644 dir
= BGP_VPN_POLICY_DIR_TOVPN
;
11645 if (bgp
->vpn_policy
[afi
].rtlist
[dir
]) {
11646 ecom_str
= ecommunity_ecom2str(
11647 bgp
->vpn_policy
[afi
].rtlist
[dir
],
11648 ECOMMUNITY_FORMAT_ROUTE_MAP
, 0);
11649 json_object_string_add(json
, "exportRts",
11651 XFREE(MTYPE_ECOMMUNITY_STR
, ecom_str
);
11653 json_object_string_add(json
, "exportRts",
11658 vty_out(vty
, "%s\n",
11659 json_object_to_json_string_ext(json
,
11660 JSON_C_TO_STRING_PRETTY
));
11661 json_object_free(json
);
11664 bgp
= name
? bgp_lookup_by_name(name
) : bgp_get_default();
11667 vty_out(vty
, "%% No such BGP instance exist\n");
11668 return CMD_WARNING
;
11671 if (!CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
11672 BGP_CONFIG_VRF_TO_VRF_IMPORT
))
11674 "This VRF is not importing %s routes from any other VRF\n",
11675 get_afi_safi_str(afi
, safi
, false));
11678 "This VRF is importing %s routes from the following VRFs:\n",
11679 get_afi_safi_str(afi
, safi
, false));
11681 for (ALL_LIST_ELEMENTS_RO(
11682 bgp
->vpn_policy
[afi
].import_vrf
,
11684 vty_out(vty
, " %s\n", vname
);
11686 dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
11688 if (bgp
->vpn_policy
[afi
].rtlist
[dir
]) {
11689 ecom_str
= ecommunity_ecom2str(
11690 bgp
->vpn_policy
[afi
].rtlist
[dir
],
11691 ECOMMUNITY_FORMAT_ROUTE_MAP
, 0);
11692 vty_out(vty
, "Import RT(s): %s\n", ecom_str
);
11694 XFREE(MTYPE_ECOMMUNITY_STR
, ecom_str
);
11696 vty_out(vty
, "Import RT(s):\n");
11699 if (!CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
11700 BGP_CONFIG_VRF_TO_VRF_EXPORT
))
11702 "This VRF is not exporting %s routes to any other VRF\n",
11703 get_afi_safi_str(afi
, safi
, false));
11706 "This VRF is exporting %s routes to the following VRFs:\n",
11707 get_afi_safi_str(afi
, safi
, false));
11709 for (ALL_LIST_ELEMENTS_RO(
11710 bgp
->vpn_policy
[afi
].export_vrf
,
11712 vty_out(vty
, " %s\n", vname
);
11714 vty_out(vty
, "RD: %s\n",
11715 prefix_rd2str(&bgp
->vpn_policy
[afi
].tovpn_rd
,
11716 buf1
, RD_ADDRSTRLEN
));
11718 dir
= BGP_VPN_POLICY_DIR_TOVPN
;
11719 if (bgp
->vpn_policy
[afi
].rtlist
[dir
]) {
11720 ecom_str
= ecommunity_ecom2str(
11721 bgp
->vpn_policy
[afi
].rtlist
[dir
],
11722 ECOMMUNITY_FORMAT_ROUTE_MAP
, 0);
11723 vty_out(vty
, "Export RT: %s\n", ecom_str
);
11724 XFREE(MTYPE_ECOMMUNITY_STR
, ecom_str
);
11726 vty_out(vty
, "Import RT(s):\n");
11730 return CMD_SUCCESS
;
11733 static int bgp_show_all_instance_route_leak_vty(struct vty
*vty
, afi_t afi
,
11734 safi_t safi
, bool use_json
)
11736 struct listnode
*node
, *nnode
;
11738 char *vrf_name
= NULL
;
11739 json_object
*json
= NULL
;
11740 json_object
*json_vrf
= NULL
;
11741 json_object
*json_vrfs
= NULL
;
11744 json
= json_object_new_object();
11745 json_vrfs
= json_object_new_object();
11748 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
11750 if (bgp
->inst_type
!= BGP_INSTANCE_TYPE_DEFAULT
)
11751 vrf_name
= bgp
->name
;
11754 json_vrf
= json_object_new_object();
11756 vty_out(vty
, "\nInstance %s:\n",
11757 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
11758 ? VRF_DEFAULT_NAME
: bgp
->name
);
11760 bgp_show_route_leak_vty(vty
, vrf_name
, afi
, safi
, 0, json_vrf
);
11762 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
11763 json_object_object_add(json_vrfs
,
11764 VRF_DEFAULT_NAME
, json_vrf
);
11766 json_object_object_add(json_vrfs
, vrf_name
,
11772 json_object_object_add(json
, "vrfs", json_vrfs
);
11773 vty_out(vty
, "%s\n", json_object_to_json_string_ext(json
,
11774 JSON_C_TO_STRING_PRETTY
));
11775 json_object_free(json
);
11778 return CMD_SUCCESS
;
11781 /* "show [ip] bgp route-leak" command. */
11782 DEFUN (show_ip_bgp_route_leak
,
11783 show_ip_bgp_route_leak_cmd
,
11784 "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR
" ["BGP_SAFI_CMD_STR
"]] route-leak [json]",
11788 BGP_INSTANCE_HELP_STR
11791 "Route leaking information\n"
11795 afi_t afi
= AFI_MAX
;
11796 safi_t safi
= SAFI_MAX
;
11798 bool uj
= use_json(argc
, argv
);
11800 json_object
*json
= NULL
;
11802 /* show [ip] bgp */
11803 if (argv_find(argv
, argc
, "ip", &idx
)) {
11805 safi
= SAFI_UNICAST
;
11807 /* [vrf VIEWVRFNAME] */
11808 if (argv_find(argv
, argc
, "view", &idx
)) {
11810 "%% This command is not applicable to BGP views\n");
11811 return CMD_WARNING
;
11814 if (argv_find(argv
, argc
, "vrf", &idx
)) {
11815 vrf
= argv
[idx
+ 1]->arg
;
11816 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
11819 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
11820 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
)) {
11821 argv_find_and_parse_safi(argv
, argc
, &idx
, &safi
);
11824 if (!((afi
== AFI_IP
|| afi
== AFI_IP6
) && safi
== SAFI_UNICAST
)) {
11826 "%% This command is applicable only for unicast ipv4|ipv6\n");
11827 return CMD_WARNING
;
11830 if (vrf
&& strmatch(vrf
, "all"))
11831 return bgp_show_all_instance_route_leak_vty(vty
, afi
, safi
, uj
);
11834 json
= json_object_new_object();
11836 return bgp_show_route_leak_vty(vty
, vrf
, afi
, safi
, uj
, json
);
11839 static void bgp_show_all_instances_updgrps_vty(struct vty
*vty
, afi_t afi
,
11842 struct listnode
*node
, *nnode
;
11845 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
11846 vty_out(vty
, "\nInstance %s:\n",
11847 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
11850 update_group_show(bgp
, afi
, safi
, vty
, 0);
11854 static int bgp_show_update_groups(struct vty
*vty
, const char *name
, int afi
,
11855 int safi
, uint64_t subgrp_id
)
11860 if (strmatch(name
, "all")) {
11861 bgp_show_all_instances_updgrps_vty(vty
, afi
, safi
);
11862 return CMD_SUCCESS
;
11864 bgp
= bgp_lookup_by_name(name
);
11867 bgp
= bgp_get_default();
11871 update_group_show(bgp
, afi
, safi
, vty
, subgrp_id
);
11872 return CMD_SUCCESS
;
11875 DEFUN (show_ip_bgp_updgrps
,
11876 show_ip_bgp_updgrps_cmd
,
11877 "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR
" ["BGP_SAFI_WITH_LABEL_CMD_STR
"]] update-groups [SUBGROUP-ID]",
11881 BGP_INSTANCE_HELP_STR
11883 BGP_SAFI_WITH_LABEL_HELP_STR
11884 "Detailed info about dynamic update groups\n"
11885 "Specific subgroup to display detailed info for\n")
11888 afi_t afi
= AFI_IP6
;
11889 safi_t safi
= SAFI_UNICAST
;
11890 uint64_t subgrp_id
= 0;
11894 /* show [ip] bgp */
11895 if (argv_find(argv
, argc
, "ip", &idx
))
11897 /* [<vrf> VIEWVRFNAME] */
11898 if (argv_find(argv
, argc
, "vrf", &idx
)) {
11899 vrf
= argv
[idx
+ 1]->arg
;
11900 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
11902 } else if (argv_find(argv
, argc
, "view", &idx
))
11903 /* [<view> VIEWVRFNAME] */
11904 vrf
= argv
[idx
+ 1]->arg
;
11905 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
11906 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
)) {
11907 argv_find_and_parse_safi(argv
, argc
, &idx
, &safi
);
11910 /* get subgroup id, if provided */
11912 if (argv
[idx
]->type
== VARIABLE_TKN
)
11913 subgrp_id
= strtoull(argv
[idx
]->arg
, NULL
, 10);
11915 return (bgp_show_update_groups(vty
, vrf
, afi
, safi
, subgrp_id
));
11918 DEFUN (show_bgp_instance_all_ipv6_updgrps
,
11919 show_bgp_instance_all_ipv6_updgrps_cmd
,
11920 "show [ip] bgp <view|vrf> all update-groups",
11924 BGP_INSTANCE_ALL_HELP_STR
11925 "Detailed info about dynamic update groups\n")
11927 bgp_show_all_instances_updgrps_vty(vty
, AFI_IP6
, SAFI_UNICAST
);
11928 return CMD_SUCCESS
;
11931 DEFUN (show_bgp_l2vpn_evpn_updgrps
,
11932 show_bgp_l2vpn_evpn_updgrps_cmd
,
11933 "show [ip] bgp l2vpn evpn update-groups",
11937 "l2vpn address family\n"
11938 "evpn sub-address family\n"
11939 "Detailed info about dynamic update groups\n")
11942 uint64_t subgrp_id
= 0;
11944 bgp_show_update_groups(vty
, vrf
, AFI_L2VPN
, SAFI_EVPN
, subgrp_id
);
11945 return CMD_SUCCESS
;
11948 DEFUN (show_bgp_updgrps_stats
,
11949 show_bgp_updgrps_stats_cmd
,
11950 "show [ip] bgp update-groups statistics",
11954 "Detailed info about dynamic update groups\n"
11959 bgp
= bgp_get_default();
11961 update_group_show_stats(bgp
, vty
);
11963 return CMD_SUCCESS
;
11966 DEFUN (show_bgp_instance_updgrps_stats
,
11967 show_bgp_instance_updgrps_stats_cmd
,
11968 "show [ip] bgp <view|vrf> VIEWVRFNAME update-groups statistics",
11972 BGP_INSTANCE_HELP_STR
11973 "Detailed info about dynamic update groups\n"
11979 bgp
= bgp_lookup_by_name(argv
[idx_word
]->arg
);
11981 update_group_show_stats(bgp
, vty
);
11983 return CMD_SUCCESS
;
11986 static void show_bgp_updgrps_adj_info_aux(struct vty
*vty
, const char *name
,
11987 afi_t afi
, safi_t safi
,
11988 const char *what
, uint64_t subgrp_id
)
11993 bgp
= bgp_lookup_by_name(name
);
11995 bgp
= bgp_get_default();
11998 if (!strcmp(what
, "advertise-queue"))
11999 update_group_show_adj_queue(bgp
, afi
, safi
, vty
,
12001 else if (!strcmp(what
, "advertised-routes"))
12002 update_group_show_advertised(bgp
, afi
, safi
, vty
,
12004 else if (!strcmp(what
, "packet-queue"))
12005 update_group_show_packet_queue(bgp
, afi
, safi
, vty
,
12010 DEFPY(show_ip_bgp_instance_updgrps_adj_s
,
12011 show_ip_bgp_instance_updgrps_adj_s_cmd
,
12012 "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",
12013 SHOW_STR IP_STR BGP_STR BGP_INSTANCE_HELP_STR BGP_AFI_HELP_STR
12015 "Detailed info about dynamic update groups\n"
12016 "Specific subgroup to display info for\n"
12017 "Advertisement queue\n"
12018 "Announced routes\n"
12021 uint64_t subgrp_id
= 0;
12025 subgrp_id
= strtoull(sgid
, NULL
, 10);
12030 afiz
= bgp_vty_afi_from_str(afi
);
12034 afiz
= bgp_vty_afi_from_str(afi
);
12035 if (afiz
!= AFI_IP
)
12037 "%% Cannot specify both 'ip' and 'ipv6'\n");
12038 return CMD_WARNING
;
12041 safiz
= safi
? bgp_vty_safi_from_str(safi
) : SAFI_UNICAST
;
12043 show_bgp_updgrps_adj_info_aux(vty
, vrf
, afiz
, safiz
, rtq
, subgrp_id
);
12044 return CMD_SUCCESS
;
12047 static int bgp_show_one_peer_group(struct vty
*vty
, struct peer_group
*group
)
12049 struct listnode
*node
, *nnode
;
12050 struct prefix
*range
;
12053 char buf
[PREFIX2STR_BUFFER
];
12056 const char *peer_status
;
12057 const char *af_str
;
12062 conf
= group
->conf
;
12064 if (conf
->as_type
== AS_SPECIFIED
|| conf
->as_type
== AS_EXTERNAL
) {
12065 vty_out(vty
, "\nBGP peer-group %s, remote AS %" PRIu32
"\n",
12066 group
->name
, conf
->as
);
12067 } else if (conf
->as_type
== AS_INTERNAL
) {
12068 vty_out(vty
, "\nBGP peer-group %s, remote AS %" PRIu32
"\n",
12069 group
->name
, group
->bgp
->as
);
12071 vty_out(vty
, "\nBGP peer-group %s\n", group
->name
);
12074 if ((group
->bgp
->as
== conf
->as
) || (conf
->as_type
== AS_INTERNAL
))
12075 vty_out(vty
, " Peer-group type is internal\n");
12077 vty_out(vty
, " Peer-group type is external\n");
12079 /* Display AFs configured. */
12080 vty_out(vty
, " Configured address-families:");
12081 FOREACH_AFI_SAFI (afi
, safi
) {
12082 if (conf
->afc
[afi
][safi
]) {
12084 vty_out(vty
, " %s;", get_afi_safi_str(afi
, safi
, false));
12088 vty_out(vty
, " none\n");
12090 vty_out(vty
, "\n");
12092 /* Display listen ranges (for dynamic neighbors), if any */
12093 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++) {
12096 else if (afi
== AFI_IP6
)
12100 lr_count
= listcount(group
->listen_range
[afi
]);
12102 vty_out(vty
, " %d %s listen range(s)\n", lr_count
,
12106 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], node
,
12108 prefix2str(range
, buf
, sizeof(buf
));
12109 vty_out(vty
, " %s\n", buf
);
12114 /* Display group members and their status */
12115 if (listcount(group
->peer
)) {
12116 vty_out(vty
, " Peer-group members:\n");
12117 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
12118 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_SHUTDOWN
))
12119 peer_status
= "Idle (Admin)";
12120 else if (CHECK_FLAG(peer
->sflags
,
12121 PEER_STATUS_PREFIX_OVERFLOW
))
12122 peer_status
= "Idle (PfxCt)";
12124 peer_status
= lookup_msg(bgp_status_msg
,
12125 peer
->status
, NULL
);
12127 dynamic
= peer_dynamic_neighbor(peer
);
12128 vty_out(vty
, " %s %s %s \n", peer
->host
,
12129 dynamic
? "(dynamic)" : "", peer_status
);
12133 return CMD_SUCCESS
;
12136 static int bgp_show_peer_group_vty(struct vty
*vty
, const char *name
,
12137 const char *group_name
)
12140 struct listnode
*node
, *nnode
;
12141 struct peer_group
*group
;
12142 bool found
= false;
12144 bgp
= name
? bgp_lookup_by_name(name
) : bgp_get_default();
12147 vty_out(vty
, "%% BGP instance not found\n");
12148 return CMD_WARNING
;
12151 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
12153 if (strmatch(group
->name
, group_name
)) {
12154 bgp_show_one_peer_group(vty
, group
);
12159 bgp_show_one_peer_group(vty
, group
);
12163 if (group_name
&& !found
)
12164 vty_out(vty
, "%% No such peer-group\n");
12166 return CMD_SUCCESS
;
12169 DEFUN (show_ip_bgp_peer_groups
,
12170 show_ip_bgp_peer_groups_cmd
,
12171 "show [ip] bgp [<view|vrf> VIEWVRFNAME] peer-group [PGNAME]",
12175 BGP_INSTANCE_HELP_STR
12176 "Detailed information on BGP peer groups\n"
12177 "Peer group name\n")
12182 vrf
= argv_find(argv
, argc
, "VIEWVRFNAME", &idx
) ? argv
[idx
]->arg
12184 pg
= argv_find(argv
, argc
, "PGNAME", &idx
) ? argv
[idx
]->arg
: NULL
;
12186 return bgp_show_peer_group_vty(vty
, vrf
, pg
);
12190 /* Redistribute VTY commands. */
12192 DEFUN (bgp_redistribute_ipv4
,
12193 bgp_redistribute_ipv4_cmd
,
12194 "redistribute " FRR_IP_REDIST_STR_BGPD
,
12195 "Redistribute information from another routing protocol\n"
12196 FRR_IP_REDIST_HELP_STR_BGPD
)
12198 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12199 int idx_protocol
= 1;
12202 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
12204 vty_out(vty
, "%% Invalid route type\n");
12205 return CMD_WARNING_CONFIG_FAILED
;
12208 bgp_redist_add(bgp
, AFI_IP
, type
, 0);
12209 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0, false);
12213 bgp_redistribute_ipv4
, bgp_redistribute_ipv4_hidden_cmd
,
12214 "redistribute " FRR_IP_REDIST_STR_BGPD
,
12215 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
)
12217 DEFUN (bgp_redistribute_ipv4_rmap
,
12218 bgp_redistribute_ipv4_rmap_cmd
,
12219 "redistribute " FRR_IP_REDIST_STR_BGPD
" route-map WORD",
12220 "Redistribute information from another routing protocol\n"
12221 FRR_IP_REDIST_HELP_STR_BGPD
12222 "Route map reference\n"
12223 "Pointer to route-map entries\n")
12225 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12226 int idx_protocol
= 1;
12229 struct bgp_redist
*red
;
12231 struct route_map
*route_map
= route_map_lookup_warn_noexist(
12232 vty
, argv
[idx_word
]->arg
);
12234 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
12236 vty_out(vty
, "%% Invalid route type\n");
12237 return CMD_WARNING_CONFIG_FAILED
;
12240 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
12242 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12243 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0, changed
);
12247 bgp_redistribute_ipv4_rmap
, bgp_redistribute_ipv4_rmap_hidden_cmd
,
12248 "redistribute " FRR_IP_REDIST_STR_BGPD
" route-map WORD",
12249 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
12250 "Route map reference\n"
12251 "Pointer to route-map entries\n")
12253 DEFUN (bgp_redistribute_ipv4_metric
,
12254 bgp_redistribute_ipv4_metric_cmd
,
12255 "redistribute " FRR_IP_REDIST_STR_BGPD
" metric (0-4294967295)",
12256 "Redistribute information from another routing protocol\n"
12257 FRR_IP_REDIST_HELP_STR_BGPD
12258 "Metric for redistributed routes\n"
12259 "Default metric\n")
12261 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12262 int idx_protocol
= 1;
12263 int idx_number
= 3;
12266 struct bgp_redist
*red
;
12269 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
12271 vty_out(vty
, "%% Invalid route type\n");
12272 return CMD_WARNING_CONFIG_FAILED
;
12274 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12276 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
12277 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, type
, metric
);
12278 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0, changed
);
12282 bgp_redistribute_ipv4_metric
, bgp_redistribute_ipv4_metric_hidden_cmd
,
12283 "redistribute " FRR_IP_REDIST_STR_BGPD
" metric (0-4294967295)",
12284 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
12285 "Metric for redistributed routes\n"
12286 "Default metric\n")
12288 DEFUN (bgp_redistribute_ipv4_rmap_metric
,
12289 bgp_redistribute_ipv4_rmap_metric_cmd
,
12290 "redistribute " FRR_IP_REDIST_STR_BGPD
" route-map WORD metric (0-4294967295)",
12291 "Redistribute information from another routing protocol\n"
12292 FRR_IP_REDIST_HELP_STR_BGPD
12293 "Route map reference\n"
12294 "Pointer to route-map entries\n"
12295 "Metric for redistributed routes\n"
12296 "Default metric\n")
12298 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12299 int idx_protocol
= 1;
12301 int idx_number
= 5;
12304 struct bgp_redist
*red
;
12306 struct route_map
*route_map
=
12307 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12309 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
12311 vty_out(vty
, "%% Invalid route type\n");
12312 return CMD_WARNING_CONFIG_FAILED
;
12314 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12316 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
12318 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12319 changed
|= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, type
, metric
);
12320 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0, changed
);
12324 bgp_redistribute_ipv4_rmap_metric
,
12325 bgp_redistribute_ipv4_rmap_metric_hidden_cmd
,
12326 "redistribute " FRR_IP_REDIST_STR_BGPD
12327 " route-map WORD metric (0-4294967295)",
12328 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
12329 "Route map reference\n"
12330 "Pointer to route-map entries\n"
12331 "Metric for redistributed routes\n"
12332 "Default metric\n")
12334 DEFUN (bgp_redistribute_ipv4_metric_rmap
,
12335 bgp_redistribute_ipv4_metric_rmap_cmd
,
12336 "redistribute " FRR_IP_REDIST_STR_BGPD
" metric (0-4294967295) route-map WORD",
12337 "Redistribute information from another routing protocol\n"
12338 FRR_IP_REDIST_HELP_STR_BGPD
12339 "Metric for redistributed routes\n"
12341 "Route map reference\n"
12342 "Pointer to route-map entries\n")
12344 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12345 int idx_protocol
= 1;
12346 int idx_number
= 3;
12350 struct bgp_redist
*red
;
12352 struct route_map
*route_map
=
12353 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
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 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12362 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
12363 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, type
, metric
);
12365 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12366 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0, changed
);
12370 bgp_redistribute_ipv4_metric_rmap
,
12371 bgp_redistribute_ipv4_metric_rmap_hidden_cmd
,
12372 "redistribute " FRR_IP_REDIST_STR_BGPD
12373 " metric (0-4294967295) route-map WORD",
12374 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
12375 "Metric for redistributed routes\n"
12377 "Route map reference\n"
12378 "Pointer to route-map entries\n")
12380 DEFUN (bgp_redistribute_ipv4_ospf
,
12381 bgp_redistribute_ipv4_ospf_cmd
,
12382 "redistribute <ospf|table> (1-65535)",
12383 "Redistribute information from another routing protocol\n"
12384 "Open Shortest Path First (OSPFv2)\n"
12385 "Non-main Kernel Routing Table\n"
12386 "Instance ID/Table ID\n")
12388 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12389 int idx_ospf_table
= 1;
12390 int idx_number
= 2;
12391 unsigned short instance
;
12392 unsigned short protocol
;
12394 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12396 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
12397 protocol
= ZEBRA_ROUTE_OSPF
;
12399 protocol
= ZEBRA_ROUTE_TABLE
;
12401 bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
12402 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
, false);
12405 ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf
, bgp_redistribute_ipv4_ospf_hidden_cmd
,
12406 "redistribute <ospf|table> (1-65535)",
12407 "Redistribute information from another routing protocol\n"
12408 "Open Shortest Path First (OSPFv2)\n"
12409 "Non-main Kernel Routing Table\n"
12410 "Instance ID/Table ID\n")
12412 DEFUN (bgp_redistribute_ipv4_ospf_rmap
,
12413 bgp_redistribute_ipv4_ospf_rmap_cmd
,
12414 "redistribute <ospf|table> (1-65535) route-map WORD",
12415 "Redistribute information from another routing protocol\n"
12416 "Open Shortest Path First (OSPFv2)\n"
12417 "Non-main Kernel Routing Table\n"
12418 "Instance ID/Table ID\n"
12419 "Route map reference\n"
12420 "Pointer to route-map entries\n")
12422 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12423 int idx_ospf_table
= 1;
12424 int idx_number
= 2;
12426 struct bgp_redist
*red
;
12427 unsigned short instance
;
12430 struct route_map
*route_map
=
12431 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12433 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
12434 protocol
= ZEBRA_ROUTE_OSPF
;
12436 protocol
= ZEBRA_ROUTE_TABLE
;
12438 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12439 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
12441 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12442 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
, changed
);
12445 ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf_rmap
,
12446 bgp_redistribute_ipv4_ospf_rmap_hidden_cmd
,
12447 "redistribute <ospf|table> (1-65535) route-map WORD",
12448 "Redistribute information from another routing protocol\n"
12449 "Open Shortest Path First (OSPFv2)\n"
12450 "Non-main Kernel Routing Table\n"
12451 "Instance ID/Table ID\n"
12452 "Route map reference\n"
12453 "Pointer to route-map entries\n")
12455 DEFUN (bgp_redistribute_ipv4_ospf_metric
,
12456 bgp_redistribute_ipv4_ospf_metric_cmd
,
12457 "redistribute <ospf|table> (1-65535) metric (0-4294967295)",
12458 "Redistribute information from another routing protocol\n"
12459 "Open Shortest Path First (OSPFv2)\n"
12460 "Non-main Kernel Routing Table\n"
12461 "Instance ID/Table ID\n"
12462 "Metric for redistributed routes\n"
12463 "Default metric\n")
12465 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12466 int idx_ospf_table
= 1;
12467 int idx_number
= 2;
12468 int idx_number_2
= 4;
12470 struct bgp_redist
*red
;
12471 unsigned short instance
;
12475 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
12476 protocol
= ZEBRA_ROUTE_OSPF
;
12478 protocol
= ZEBRA_ROUTE_TABLE
;
12480 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12481 metric
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
12483 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
12484 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, protocol
,
12486 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
, changed
);
12489 ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf_metric
,
12490 bgp_redistribute_ipv4_ospf_metric_hidden_cmd
,
12491 "redistribute <ospf|table> (1-65535) metric (0-4294967295)",
12492 "Redistribute information from another routing protocol\n"
12493 "Open Shortest Path First (OSPFv2)\n"
12494 "Non-main Kernel Routing Table\n"
12495 "Instance ID/Table ID\n"
12496 "Metric for redistributed routes\n"
12497 "Default metric\n")
12499 DEFUN (bgp_redistribute_ipv4_ospf_rmap_metric
,
12500 bgp_redistribute_ipv4_ospf_rmap_metric_cmd
,
12501 "redistribute <ospf|table> (1-65535) route-map WORD metric (0-4294967295)",
12502 "Redistribute information from another routing protocol\n"
12503 "Open Shortest Path First (OSPFv2)\n"
12504 "Non-main Kernel Routing Table\n"
12505 "Instance ID/Table ID\n"
12506 "Route map reference\n"
12507 "Pointer to route-map entries\n"
12508 "Metric for redistributed routes\n"
12509 "Default metric\n")
12511 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12512 int idx_ospf_table
= 1;
12513 int idx_number
= 2;
12515 int idx_number_2
= 6;
12517 struct bgp_redist
*red
;
12518 unsigned short instance
;
12521 struct route_map
*route_map
=
12522 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12524 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
12525 protocol
= ZEBRA_ROUTE_OSPF
;
12527 protocol
= ZEBRA_ROUTE_TABLE
;
12529 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12530 metric
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
12532 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
12534 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12535 changed
|= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, protocol
,
12537 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
, changed
);
12541 bgp_redistribute_ipv4_ospf_rmap_metric
,
12542 bgp_redistribute_ipv4_ospf_rmap_metric_hidden_cmd
,
12543 "redistribute <ospf|table> (1-65535) route-map WORD metric (0-4294967295)",
12544 "Redistribute information from another routing protocol\n"
12545 "Open Shortest Path First (OSPFv2)\n"
12546 "Non-main Kernel Routing Table\n"
12547 "Instance ID/Table ID\n"
12548 "Route map reference\n"
12549 "Pointer to route-map entries\n"
12550 "Metric for redistributed routes\n"
12551 "Default metric\n")
12553 DEFUN (bgp_redistribute_ipv4_ospf_metric_rmap
,
12554 bgp_redistribute_ipv4_ospf_metric_rmap_cmd
,
12555 "redistribute <ospf|table> (1-65535) metric (0-4294967295) route-map WORD",
12556 "Redistribute information from another routing protocol\n"
12557 "Open Shortest Path First (OSPFv2)\n"
12558 "Non-main Kernel Routing Table\n"
12559 "Instance ID/Table ID\n"
12560 "Metric for redistributed routes\n"
12562 "Route map reference\n"
12563 "Pointer to route-map entries\n")
12565 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12566 int idx_ospf_table
= 1;
12567 int idx_number
= 2;
12568 int idx_number_2
= 4;
12571 struct bgp_redist
*red
;
12572 unsigned short instance
;
12575 struct route_map
*route_map
=
12576 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12578 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
12579 protocol
= ZEBRA_ROUTE_OSPF
;
12581 protocol
= ZEBRA_ROUTE_TABLE
;
12583 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12584 metric
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
12586 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
12587 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, protocol
,
12590 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12591 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
, changed
);
12595 bgp_redistribute_ipv4_ospf_metric_rmap
,
12596 bgp_redistribute_ipv4_ospf_metric_rmap_hidden_cmd
,
12597 "redistribute <ospf|table> (1-65535) metric (0-4294967295) route-map WORD",
12598 "Redistribute information from another routing protocol\n"
12599 "Open Shortest Path First (OSPFv2)\n"
12600 "Non-main Kernel Routing Table\n"
12601 "Instance ID/Table ID\n"
12602 "Metric for redistributed routes\n"
12604 "Route map reference\n"
12605 "Pointer to route-map entries\n")
12607 DEFUN (no_bgp_redistribute_ipv4_ospf
,
12608 no_bgp_redistribute_ipv4_ospf_cmd
,
12609 "no redistribute <ospf|table> (1-65535) [{metric (0-4294967295)|route-map WORD}]",
12611 "Redistribute information from another routing protocol\n"
12612 "Open Shortest Path First (OSPFv2)\n"
12613 "Non-main Kernel Routing Table\n"
12614 "Instance ID/Table ID\n"
12615 "Metric for redistributed routes\n"
12617 "Route map reference\n"
12618 "Pointer to route-map entries\n")
12620 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12621 int idx_ospf_table
= 2;
12622 int idx_number
= 3;
12623 unsigned short instance
;
12626 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
12627 protocol
= ZEBRA_ROUTE_OSPF
;
12629 protocol
= ZEBRA_ROUTE_TABLE
;
12631 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12632 return bgp_redistribute_unset(bgp
, AFI_IP
, protocol
, instance
);
12636 no_bgp_redistribute_ipv4_ospf
, no_bgp_redistribute_ipv4_ospf_hidden_cmd
,
12637 "no redistribute <ospf|table> (1-65535) [{metric (0-4294967295)|route-map WORD}]",
12639 "Redistribute information from another routing protocol\n"
12640 "Open Shortest Path First (OSPFv2)\n"
12641 "Non-main Kernel Routing Table\n"
12642 "Instance ID/Table ID\n"
12643 "Metric for redistributed routes\n"
12645 "Route map reference\n"
12646 "Pointer to route-map entries\n")
12648 DEFUN (no_bgp_redistribute_ipv4
,
12649 no_bgp_redistribute_ipv4_cmd
,
12650 "no redistribute " FRR_IP_REDIST_STR_BGPD
" [{metric (0-4294967295)|route-map WORD}]",
12652 "Redistribute information from another routing protocol\n"
12653 FRR_IP_REDIST_HELP_STR_BGPD
12654 "Metric for redistributed routes\n"
12656 "Route map reference\n"
12657 "Pointer to route-map entries\n")
12659 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12660 int idx_protocol
= 2;
12663 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
12665 vty_out(vty
, "%% Invalid route type\n");
12666 return CMD_WARNING_CONFIG_FAILED
;
12668 return bgp_redistribute_unset(bgp
, AFI_IP
, type
, 0);
12672 no_bgp_redistribute_ipv4
, no_bgp_redistribute_ipv4_hidden_cmd
,
12673 "no redistribute " FRR_IP_REDIST_STR_BGPD
12674 " [{metric (0-4294967295)|route-map WORD}]",
12676 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
12677 "Metric for redistributed routes\n"
12679 "Route map reference\n"
12680 "Pointer to route-map entries\n")
12682 DEFUN (bgp_redistribute_ipv6
,
12683 bgp_redistribute_ipv6_cmd
,
12684 "redistribute " FRR_IP6_REDIST_STR_BGPD
,
12685 "Redistribute information from another routing protocol\n"
12686 FRR_IP6_REDIST_HELP_STR_BGPD
)
12688 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12689 int idx_protocol
= 1;
12692 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
12694 vty_out(vty
, "%% Invalid route type\n");
12695 return CMD_WARNING_CONFIG_FAILED
;
12698 bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
12699 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0, false);
12702 DEFUN (bgp_redistribute_ipv6_rmap
,
12703 bgp_redistribute_ipv6_rmap_cmd
,
12704 "redistribute " FRR_IP6_REDIST_STR_BGPD
" route-map WORD",
12705 "Redistribute information from another routing protocol\n"
12706 FRR_IP6_REDIST_HELP_STR_BGPD
12707 "Route map reference\n"
12708 "Pointer to route-map entries\n")
12710 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12711 int idx_protocol
= 1;
12714 struct bgp_redist
*red
;
12716 struct route_map
*route_map
=
12717 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12719 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
12721 vty_out(vty
, "%% Invalid route type\n");
12722 return CMD_WARNING_CONFIG_FAILED
;
12725 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
12727 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12728 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0, changed
);
12731 DEFUN (bgp_redistribute_ipv6_metric
,
12732 bgp_redistribute_ipv6_metric_cmd
,
12733 "redistribute " FRR_IP6_REDIST_STR_BGPD
" metric (0-4294967295)",
12734 "Redistribute information from another routing protocol\n"
12735 FRR_IP6_REDIST_HELP_STR_BGPD
12736 "Metric for redistributed routes\n"
12737 "Default metric\n")
12739 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12740 int idx_protocol
= 1;
12741 int idx_number
= 3;
12744 struct bgp_redist
*red
;
12747 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
12749 vty_out(vty
, "%% Invalid route type\n");
12750 return CMD_WARNING_CONFIG_FAILED
;
12752 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12754 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
12755 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP6
, type
, metric
);
12756 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0, changed
);
12759 DEFUN (bgp_redistribute_ipv6_rmap_metric
,
12760 bgp_redistribute_ipv6_rmap_metric_cmd
,
12761 "redistribute " FRR_IP6_REDIST_STR_BGPD
" route-map WORD metric (0-4294967295)",
12762 "Redistribute information from another routing protocol\n"
12763 FRR_IP6_REDIST_HELP_STR_BGPD
12764 "Route map reference\n"
12765 "Pointer to route-map entries\n"
12766 "Metric for redistributed routes\n"
12767 "Default metric\n")
12769 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12770 int idx_protocol
= 1;
12772 int idx_number
= 5;
12775 struct bgp_redist
*red
;
12777 struct route_map
*route_map
=
12778 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12780 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
12782 vty_out(vty
, "%% Invalid route type\n");
12783 return CMD_WARNING_CONFIG_FAILED
;
12785 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12787 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
12789 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12790 changed
|= bgp_redistribute_metric_set(bgp
, red
, AFI_IP6
, type
,
12792 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0, changed
);
12795 DEFUN (bgp_redistribute_ipv6_metric_rmap
,
12796 bgp_redistribute_ipv6_metric_rmap_cmd
,
12797 "redistribute " FRR_IP6_REDIST_STR_BGPD
" metric (0-4294967295) route-map WORD",
12798 "Redistribute information from another routing protocol\n"
12799 FRR_IP6_REDIST_HELP_STR_BGPD
12800 "Metric for redistributed routes\n"
12802 "Route map reference\n"
12803 "Pointer to route-map entries\n")
12805 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12806 int idx_protocol
= 1;
12807 int idx_number
= 3;
12811 struct bgp_redist
*red
;
12813 struct route_map
*route_map
=
12814 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12816 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
12818 vty_out(vty
, "%% Invalid route type\n");
12819 return CMD_WARNING_CONFIG_FAILED
;
12821 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12823 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
12824 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP6
, SAFI_UNICAST
,
12827 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12828 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0, changed
);
12831 DEFUN (no_bgp_redistribute_ipv6
,
12832 no_bgp_redistribute_ipv6_cmd
,
12833 "no redistribute " FRR_IP6_REDIST_STR_BGPD
" [{metric (0-4294967295)|route-map WORD}]",
12835 "Redistribute information from another routing protocol\n"
12836 FRR_IP6_REDIST_HELP_STR_BGPD
12837 "Metric for redistributed routes\n"
12839 "Route map reference\n"
12840 "Pointer to route-map entries\n")
12842 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12843 int idx_protocol
= 2;
12846 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
12848 vty_out(vty
, "%% Invalid route type\n");
12849 return CMD_WARNING_CONFIG_FAILED
;
12852 return bgp_redistribute_unset(bgp
, AFI_IP6
, type
, 0);
12855 static void bgp_config_write_redistribute(struct vty
*vty
, struct bgp
*bgp
,
12856 afi_t afi
, safi_t safi
)
12860 /* Unicast redistribution only. */
12861 if (safi
!= SAFI_UNICAST
)
12864 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++) {
12865 /* Redistribute BGP does not make sense. */
12866 if (i
!= ZEBRA_ROUTE_BGP
) {
12867 struct list
*red_list
;
12868 struct listnode
*node
;
12869 struct bgp_redist
*red
;
12871 red_list
= bgp
->redist
[afi
][i
];
12875 for (ALL_LIST_ELEMENTS_RO(red_list
, node
, red
)) {
12876 /* "redistribute" configuration. */
12877 vty_out(vty
, " redistribute %s",
12878 zebra_route_string(i
));
12880 vty_out(vty
, " %d", red
->instance
);
12881 if (red
->redist_metric_flag
)
12882 vty_out(vty
, " metric %u",
12883 red
->redist_metric
);
12884 if (red
->rmap
.name
)
12885 vty_out(vty
, " route-map %s",
12887 vty_out(vty
, "\n");
12893 /* peer-group helpers for config-write */
12895 static bool peergroup_flag_check(struct peer
*peer
, uint32_t flag
)
12897 if (!peer_group_active(peer
)) {
12898 if (CHECK_FLAG(peer
->flags_invert
, flag
))
12899 return !CHECK_FLAG(peer
->flags
, flag
);
12901 return !!CHECK_FLAG(peer
->flags
, flag
);
12904 return !!CHECK_FLAG(peer
->flags_override
, flag
);
12907 static bool peergroup_af_flag_check(struct peer
*peer
, afi_t afi
, safi_t safi
,
12910 if (!peer_group_active(peer
)) {
12911 if (CHECK_FLAG(peer
->af_flags_invert
[afi
][safi
], flag
))
12912 return !peer_af_flag_check(peer
, afi
, safi
, flag
);
12914 return !!peer_af_flag_check(peer
, afi
, safi
, flag
);
12917 return !!CHECK_FLAG(peer
->af_flags_override
[afi
][safi
], flag
);
12920 static bool peergroup_filter_check(struct peer
*peer
, afi_t afi
, safi_t safi
,
12921 uint8_t type
, int direct
)
12923 struct bgp_filter
*filter
;
12925 if (peer_group_active(peer
))
12926 return !!CHECK_FLAG(peer
->filter_override
[afi
][safi
][direct
],
12929 filter
= &peer
->filter
[afi
][safi
];
12931 case PEER_FT_DISTRIBUTE_LIST
:
12932 return !!(filter
->dlist
[direct
].name
);
12933 case PEER_FT_FILTER_LIST
:
12934 return !!(filter
->aslist
[direct
].name
);
12935 case PEER_FT_PREFIX_LIST
:
12936 return !!(filter
->plist
[direct
].name
);
12937 case PEER_FT_ROUTE_MAP
:
12938 return !!(filter
->map
[direct
].name
);
12939 case PEER_FT_UNSUPPRESS_MAP
:
12940 return !!(filter
->usmap
.name
);
12946 /* Return true if the addpath type is set for peer and different from
12949 static int peergroup_af_addpath_check(struct peer
*peer
, afi_t afi
, safi_t safi
)
12951 enum bgp_addpath_strat type
, g_type
;
12953 type
= peer
->addpath_type
[afi
][safi
];
12955 if (type
!= BGP_ADDPATH_NONE
) {
12956 if (peer_group_active(peer
)) {
12957 g_type
= peer
->group
->conf
->addpath_type
[afi
][safi
];
12959 if (type
!= g_type
)
12971 /* This is part of the address-family block (unicast only) */
12972 static void bgp_vpn_policy_config_write_afi(struct vty
*vty
, struct bgp
*bgp
,
12977 if (bgp
->vpn_policy
[afi
].rmap_name
[BGP_VPN_POLICY_DIR_FROMVPN
]) {
12978 if (listcount(bgp
->vpn_policy
[afi
].import_vrf
))
12979 vty_out(vty
, "%*simport vrf route-map %s\n", indent
, "",
12980 bgp
->vpn_policy
[afi
]
12981 .rmap_name
[BGP_VPN_POLICY_DIR_FROMVPN
]);
12983 vty_out(vty
, "%*sroute-map vpn import %s\n", indent
, "",
12984 bgp
->vpn_policy
[afi
]
12985 .rmap_name
[BGP_VPN_POLICY_DIR_FROMVPN
]);
12987 if (CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
12988 BGP_CONFIG_VRF_TO_VRF_IMPORT
)
12989 || CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
12990 BGP_CONFIG_VRF_TO_VRF_EXPORT
))
12993 if (CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
12994 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
)) {
12996 vty_out(vty
, "%*slabel vpn export %s\n", indent
, "", "auto");
12999 if (bgp
->vpn_policy
[afi
].tovpn_label
!= MPLS_LABEL_NONE
) {
13000 vty_out(vty
, "%*slabel vpn export %u\n", indent
, "",
13001 bgp
->vpn_policy
[afi
].tovpn_label
);
13004 if (CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
13005 BGP_VPN_POLICY_TOVPN_RD_SET
)) {
13006 char buf
[RD_ADDRSTRLEN
];
13007 vty_out(vty
, "%*srd vpn export %s\n", indent
, "",
13008 prefix_rd2str(&bgp
->vpn_policy
[afi
].tovpn_rd
, buf
,
13011 if (CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
13012 BGP_VPN_POLICY_TOVPN_NEXTHOP_SET
)) {
13014 char buf
[PREFIX_STRLEN
];
13015 if (inet_ntop(bgp
->vpn_policy
[afi
].tovpn_nexthop
.family
,
13016 &bgp
->vpn_policy
[afi
].tovpn_nexthop
.u
.prefix
, buf
,
13019 vty_out(vty
, "%*snexthop vpn export %s\n",
13023 if (bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
]
13024 && bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
]
13026 bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
],
13027 bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
])) {
13029 char *b
= ecommunity_ecom2str(
13030 bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
],
13031 ECOMMUNITY_FORMAT_ROUTE_MAP
, ECOMMUNITY_ROUTE_TARGET
);
13032 vty_out(vty
, "%*srt vpn both %s\n", indent
, "", b
);
13033 XFREE(MTYPE_ECOMMUNITY_STR
, b
);
13035 if (bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
]) {
13036 char *b
= ecommunity_ecom2str(
13037 bgp
->vpn_policy
[afi
]
13038 .rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
],
13039 ECOMMUNITY_FORMAT_ROUTE_MAP
,
13040 ECOMMUNITY_ROUTE_TARGET
);
13041 vty_out(vty
, "%*srt vpn import %s\n", indent
, "", b
);
13042 XFREE(MTYPE_ECOMMUNITY_STR
, b
);
13044 if (bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
]) {
13045 char *b
= ecommunity_ecom2str(
13046 bgp
->vpn_policy
[afi
]
13047 .rtlist
[BGP_VPN_POLICY_DIR_TOVPN
],
13048 ECOMMUNITY_FORMAT_ROUTE_MAP
,
13049 ECOMMUNITY_ROUTE_TARGET
);
13050 vty_out(vty
, "%*srt vpn export %s\n", indent
, "", b
);
13051 XFREE(MTYPE_ECOMMUNITY_STR
, b
);
13055 if (bgp
->vpn_policy
[afi
].rmap_name
[BGP_VPN_POLICY_DIR_TOVPN
])
13056 vty_out(vty
, "%*sroute-map vpn export %s\n", indent
, "",
13057 bgp
->vpn_policy
[afi
]
13058 .rmap_name
[BGP_VPN_POLICY_DIR_TOVPN
]);
13060 if (bgp
->vpn_policy
[afi
].import_redirect_rtlist
) {
13061 char *b
= ecommunity_ecom2str(
13062 bgp
->vpn_policy
[afi
]
13063 .import_redirect_rtlist
,
13064 ECOMMUNITY_FORMAT_ROUTE_MAP
,
13065 ECOMMUNITY_ROUTE_TARGET
);
13067 vty_out(vty
, "%*srt redirect import %s\n", indent
, "", b
);
13068 XFREE(MTYPE_ECOMMUNITY_STR
, b
);
13072 static void bgp_config_write_filter(struct vty
*vty
, struct peer
*peer
,
13073 afi_t afi
, safi_t safi
)
13075 struct bgp_filter
*filter
;
13079 filter
= &peer
->filter
[afi
][safi
];
13081 /* distribute-list. */
13082 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_DISTRIBUTE_LIST
,
13084 vty_out(vty
, " neighbor %s distribute-list %s in\n", addr
,
13085 filter
->dlist
[FILTER_IN
].name
);
13087 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_DISTRIBUTE_LIST
,
13089 vty_out(vty
, " neighbor %s distribute-list %s out\n", addr
,
13090 filter
->dlist
[FILTER_OUT
].name
);
13093 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_PREFIX_LIST
,
13095 vty_out(vty
, " neighbor %s prefix-list %s in\n", addr
,
13096 filter
->plist
[FILTER_IN
].name
);
13098 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_PREFIX_LIST
,
13100 vty_out(vty
, " neighbor %s prefix-list %s out\n", addr
,
13101 filter
->plist
[FILTER_OUT
].name
);
13104 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_ROUTE_MAP
, RMAP_IN
))
13105 vty_out(vty
, " neighbor %s route-map %s in\n", addr
,
13106 filter
->map
[RMAP_IN
].name
);
13108 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_ROUTE_MAP
,
13110 vty_out(vty
, " neighbor %s route-map %s out\n", addr
,
13111 filter
->map
[RMAP_OUT
].name
);
13113 /* unsuppress-map */
13114 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_UNSUPPRESS_MAP
, 0))
13115 vty_out(vty
, " neighbor %s unsuppress-map %s\n", addr
,
13116 filter
->usmap
.name
);
13119 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_FILTER_LIST
,
13121 vty_out(vty
, " neighbor %s filter-list %s in\n", addr
,
13122 filter
->aslist
[FILTER_IN
].name
);
13124 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_FILTER_LIST
,
13126 vty_out(vty
, " neighbor %s filter-list %s out\n", addr
,
13127 filter
->aslist
[FILTER_OUT
].name
);
13130 /* BGP peer configuration display function. */
13131 static void bgp_config_write_peer_global(struct vty
*vty
, struct bgp
*bgp
,
13134 struct peer
*g_peer
= NULL
;
13135 char buf
[SU_ADDRSTRLEN
];
13137 int if_pg_printed
= false;
13138 int if_ras_printed
= false;
13140 /* Skip dynamic neighbors. */
13141 if (peer_dynamic_neighbor(peer
))
13145 addr
= peer
->conf_if
;
13149 /************************************
13150 ****** Global to the neighbor ******
13151 ************************************/
13152 if (peer
->conf_if
) {
13153 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
))
13154 vty_out(vty
, " neighbor %s interface v6only", addr
);
13156 vty_out(vty
, " neighbor %s interface", addr
);
13158 if (peer_group_active(peer
)) {
13159 vty_out(vty
, " peer-group %s", peer
->group
->name
);
13160 if_pg_printed
= true;
13161 } else if (peer
->as_type
== AS_SPECIFIED
) {
13162 vty_out(vty
, " remote-as %u", peer
->as
);
13163 if_ras_printed
= true;
13164 } else if (peer
->as_type
== AS_INTERNAL
) {
13165 vty_out(vty
, " remote-as internal");
13166 if_ras_printed
= true;
13167 } else if (peer
->as_type
== AS_EXTERNAL
) {
13168 vty_out(vty
, " remote-as external");
13169 if_ras_printed
= true;
13172 vty_out(vty
, "\n");
13175 /* remote-as and peer-group */
13176 /* peer is a member of a peer-group */
13177 if (peer_group_active(peer
)) {
13178 g_peer
= peer
->group
->conf
;
13180 if (g_peer
->as_type
== AS_UNSPECIFIED
&& !if_ras_printed
) {
13181 if (peer
->as_type
== AS_SPECIFIED
) {
13182 vty_out(vty
, " neighbor %s remote-as %u\n",
13184 } else if (peer
->as_type
== AS_INTERNAL
) {
13186 " neighbor %s remote-as internal\n",
13188 } else if (peer
->as_type
== AS_EXTERNAL
) {
13190 " neighbor %s remote-as external\n",
13195 /* For swpX peers we displayed the peer-group
13196 * via 'neighbor swpX interface peer-group PGNAME' */
13197 if (!if_pg_printed
)
13198 vty_out(vty
, " neighbor %s peer-group %s\n", addr
,
13199 peer
->group
->name
);
13202 /* peer is NOT a member of a peer-group */
13204 /* peer is a peer-group, declare the peer-group */
13205 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
13206 vty_out(vty
, " neighbor %s peer-group\n", addr
);
13209 if (!if_ras_printed
) {
13210 if (peer
->as_type
== AS_SPECIFIED
) {
13211 vty_out(vty
, " neighbor %s remote-as %u\n",
13213 } else if (peer
->as_type
== AS_INTERNAL
) {
13215 " neighbor %s remote-as internal\n",
13217 } else if (peer
->as_type
== AS_EXTERNAL
) {
13219 " neighbor %s remote-as external\n",
13226 if (peergroup_flag_check(peer
, PEER_FLAG_LOCAL_AS
)) {
13227 vty_out(vty
, " neighbor %s local-as %u", addr
,
13228 peer
->change_local_as
);
13229 if (peergroup_flag_check(peer
, PEER_FLAG_LOCAL_AS_NO_PREPEND
))
13230 vty_out(vty
, " no-prepend");
13231 if (peergroup_flag_check(peer
, PEER_FLAG_LOCAL_AS_REPLACE_AS
))
13232 vty_out(vty
, " replace-as");
13233 vty_out(vty
, "\n");
13238 vty_out(vty
, " neighbor %s description %s\n", addr
, peer
->desc
);
13242 if (peergroup_flag_check(peer
, PEER_FLAG_SHUTDOWN
)) {
13243 if (peer
->tx_shutdown_message
)
13244 vty_out(vty
, " neighbor %s shutdown message %s\n", addr
,
13245 peer
->tx_shutdown_message
);
13247 vty_out(vty
, " neighbor %s shutdown\n", addr
);
13251 if (peer
->bfd_info
) {
13252 if (!peer_group_active(peer
) || !g_peer
->bfd_info
) {
13253 bgp_bfd_peer_config_write(vty
, peer
, addr
);
13258 if (peergroup_flag_check(peer
, PEER_FLAG_PASSWORD
))
13259 vty_out(vty
, " neighbor %s password %s\n", addr
,
13262 /* neighbor solo */
13263 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_LONESOUL
)) {
13264 if (!peer_group_active(peer
)) {
13265 vty_out(vty
, " neighbor %s solo\n", addr
);
13270 if (peer
->port
!= BGP_PORT_DEFAULT
) {
13271 vty_out(vty
, " neighbor %s port %d\n", addr
, peer
->port
);
13274 /* Local interface name */
13275 if (peer
->ifname
) {
13276 vty_out(vty
, " neighbor %s interface %s\n", addr
, peer
->ifname
);
13280 if (peergroup_flag_check(peer
, PEER_FLAG_PASSIVE
))
13281 vty_out(vty
, " neighbor %s passive\n", addr
);
13283 /* ebgp-multihop */
13284 if (peer
->sort
!= BGP_PEER_IBGP
&& peer
->ttl
!= BGP_DEFAULT_TTL
13285 && !(peer
->gtsm_hops
!= 0 && peer
->ttl
== MAXTTL
)) {
13286 if (!peer_group_active(peer
) || g_peer
->ttl
!= peer
->ttl
) {
13287 vty_out(vty
, " neighbor %s ebgp-multihop %d\n", addr
,
13292 /* ttl-security hops */
13293 if (peer
->gtsm_hops
!= 0) {
13294 if (!peer_group_active(peer
)
13295 || g_peer
->gtsm_hops
!= peer
->gtsm_hops
) {
13296 vty_out(vty
, " neighbor %s ttl-security hops %d\n",
13297 addr
, peer
->gtsm_hops
);
13301 /* disable-connected-check */
13302 if (peergroup_flag_check(peer
, PEER_FLAG_DISABLE_CONNECTED_CHECK
))
13303 vty_out(vty
, " neighbor %s disable-connected-check\n", addr
);
13305 /* enforce-first-as */
13306 if (peergroup_flag_check(peer
, PEER_FLAG_ENFORCE_FIRST_AS
))
13307 vty_out(vty
, " neighbor %s enforce-first-as\n", addr
);
13309 /* update-source */
13310 if (peergroup_flag_check(peer
, PEER_FLAG_UPDATE_SOURCE
)) {
13311 if (peer
->update_source
)
13312 vty_out(vty
, " neighbor %s update-source %s\n", addr
,
13313 sockunion2str(peer
->update_source
, buf
,
13315 else if (peer
->update_if
)
13316 vty_out(vty
, " neighbor %s update-source %s\n", addr
,
13320 /* advertisement-interval */
13321 if (peergroup_flag_check(peer
, PEER_FLAG_ROUTEADV
))
13322 vty_out(vty
, " neighbor %s advertisement-interval %u\n", addr
,
13326 if (peergroup_flag_check(peer
, PEER_FLAG_TIMER
))
13327 vty_out(vty
, " neighbor %s timers %u %u\n", addr
,
13328 peer
->keepalive
, peer
->holdtime
);
13330 /* timers connect */
13331 if (peergroup_flag_check(peer
, PEER_FLAG_TIMER_CONNECT
))
13332 vty_out(vty
, " neighbor %s timers connect %u\n", addr
,
13334 /* need special-case handling for changed default values due to
13335 * config profile / version (because there is no "timers bgp connect"
13336 * command, we need to save this per-peer :/)
13338 else if (!peer_group_active(peer
) && !peer
->connect
&&
13339 peer
->bgp
->default_connect_retry
!= SAVE_BGP_CONNECT_RETRY
)
13340 vty_out(vty
, " neighbor %s timers connect %u\n", addr
,
13341 peer
->bgp
->default_connect_retry
);
13343 /* capability dynamic */
13344 if (peergroup_flag_check(peer
, PEER_FLAG_DYNAMIC_CAPABILITY
))
13345 vty_out(vty
, " neighbor %s capability dynamic\n", addr
);
13347 /* capability extended-nexthop */
13348 if (peergroup_flag_check(peer
, PEER_FLAG_CAPABILITY_ENHE
)) {
13349 if (!peer
->conf_if
) {
13350 if (CHECK_FLAG(peer
->flags_invert
,
13351 PEER_FLAG_CAPABILITY_ENHE
))
13353 " no neighbor %s capability extended-nexthop\n",
13357 " neighbor %s capability extended-nexthop\n",
13362 /* dont-capability-negotiation */
13363 if (peergroup_flag_check(peer
, PEER_FLAG_DONT_CAPABILITY
))
13364 vty_out(vty
, " neighbor %s dont-capability-negotiate\n", addr
);
13366 /* override-capability */
13367 if (peergroup_flag_check(peer
, PEER_FLAG_OVERRIDE_CAPABILITY
))
13368 vty_out(vty
, " neighbor %s override-capability\n", addr
);
13370 /* strict-capability-match */
13371 if (peergroup_flag_check(peer
, PEER_FLAG_STRICT_CAP_MATCH
))
13372 vty_out(vty
, " neighbor %s strict-capability-match\n", addr
);
13374 /* Sender side AS path loop detection. */
13375 if (peer
->as_path_loop_detection
)
13376 vty_out(vty
, " neighbor %s sender-as-path-loop-detection\n",
13380 /* BGP peer configuration display function. */
13381 static void bgp_config_write_peer_af(struct vty
*vty
, struct bgp
*bgp
,
13382 struct peer
*peer
, afi_t afi
, safi_t safi
)
13384 struct peer
*g_peer
= NULL
;
13386 bool flag_scomm
, flag_secomm
, flag_slcomm
;
13388 /* Skip dynamic neighbors. */
13389 if (peer_dynamic_neighbor(peer
))
13393 addr
= peer
->conf_if
;
13397 /************************************
13398 ****** Per AF to the neighbor ******
13399 ************************************/
13400 if (peer_group_active(peer
)) {
13401 g_peer
= peer
->group
->conf
;
13403 /* If the peer-group is active but peer is not, print a 'no
13405 if (g_peer
->afc
[afi
][safi
] && !peer
->afc
[afi
][safi
]) {
13406 vty_out(vty
, " no neighbor %s activate\n", addr
);
13409 /* If the peer-group is not active but peer is, print an
13411 else if (!g_peer
->afc
[afi
][safi
] && peer
->afc
[afi
][safi
]) {
13412 vty_out(vty
, " neighbor %s activate\n", addr
);
13415 if (peer
->afc
[afi
][safi
]) {
13416 if ((afi
== AFI_IP
) && (safi
== SAFI_UNICAST
)) {
13417 if (bgp_flag_check(bgp
,
13418 BGP_FLAG_NO_DEFAULT_IPV4
)) {
13419 vty_out(vty
, " neighbor %s activate\n",
13423 vty_out(vty
, " neighbor %s activate\n", addr
);
13425 if ((afi
== AFI_IP
) && (safi
== SAFI_UNICAST
)) {
13426 if (!bgp_flag_check(bgp
,
13427 BGP_FLAG_NO_DEFAULT_IPV4
)) {
13429 " no neighbor %s activate\n",
13436 /* addpath TX knobs */
13437 if (peergroup_af_addpath_check(peer
, afi
, safi
)) {
13438 switch (peer
->addpath_type
[afi
][safi
]) {
13439 case BGP_ADDPATH_ALL
:
13440 vty_out(vty
, " neighbor %s addpath-tx-all-paths\n",
13443 case BGP_ADDPATH_BEST_PER_AS
:
13445 " neighbor %s addpath-tx-bestpath-per-AS\n",
13448 case BGP_ADDPATH_MAX
:
13449 case BGP_ADDPATH_NONE
:
13454 /* ORF capability. */
13455 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_ORF_PREFIX_SM
)
13456 || peergroup_af_flag_check(peer
, afi
, safi
,
13457 PEER_FLAG_ORF_PREFIX_RM
)) {
13458 vty_out(vty
, " neighbor %s capability orf prefix-list", addr
);
13460 if (peergroup_af_flag_check(peer
, afi
, safi
,
13461 PEER_FLAG_ORF_PREFIX_SM
)
13462 && peergroup_af_flag_check(peer
, afi
, safi
,
13463 PEER_FLAG_ORF_PREFIX_RM
))
13464 vty_out(vty
, " both");
13465 else if (peergroup_af_flag_check(peer
, afi
, safi
,
13466 PEER_FLAG_ORF_PREFIX_SM
))
13467 vty_out(vty
, " send");
13469 vty_out(vty
, " receive");
13470 vty_out(vty
, "\n");
13473 /* BGP flag dampening. */
13474 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
13475 BGP_CONFIG_DAMPENING
))
13476 bgp_config_write_damp(vty
, afi
, safi
);
13478 /* Route reflector client. */
13479 if (peergroup_af_flag_check(peer
, afi
, safi
,
13480 PEER_FLAG_REFLECTOR_CLIENT
)) {
13481 vty_out(vty
, " neighbor %s route-reflector-client\n", addr
);
13484 /* next-hop-self force */
13485 if (peergroup_af_flag_check(peer
, afi
, safi
,
13486 PEER_FLAG_FORCE_NEXTHOP_SELF
)) {
13487 vty_out(vty
, " neighbor %s next-hop-self force\n", addr
);
13490 /* next-hop-self */
13491 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_NEXTHOP_SELF
)) {
13492 vty_out(vty
, " neighbor %s next-hop-self\n", addr
);
13495 /* remove-private-AS */
13496 if (peergroup_af_flag_check(peer
, afi
, safi
,
13497 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
)) {
13498 vty_out(vty
, " neighbor %s remove-private-AS all replace-AS\n",
13502 else if (peergroup_af_flag_check(peer
, afi
, safi
,
13503 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
)) {
13504 vty_out(vty
, " neighbor %s remove-private-AS replace-AS\n",
13508 else if (peergroup_af_flag_check(peer
, afi
, safi
,
13509 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
)) {
13510 vty_out(vty
, " neighbor %s remove-private-AS all\n", addr
);
13513 else if (peergroup_af_flag_check(peer
, afi
, safi
,
13514 PEER_FLAG_REMOVE_PRIVATE_AS
)) {
13515 vty_out(vty
, " neighbor %s remove-private-AS\n", addr
);
13519 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_AS_OVERRIDE
)) {
13520 vty_out(vty
, " neighbor %s as-override\n", addr
);
13523 /* send-community print. */
13524 flag_scomm
= peergroup_af_flag_check(peer
, afi
, safi
,
13525 PEER_FLAG_SEND_COMMUNITY
);
13526 flag_secomm
= peergroup_af_flag_check(peer
, afi
, safi
,
13527 PEER_FLAG_SEND_EXT_COMMUNITY
);
13528 flag_slcomm
= peergroup_af_flag_check(peer
, afi
, safi
,
13529 PEER_FLAG_SEND_LARGE_COMMUNITY
);
13531 if (flag_scomm
&& flag_secomm
&& flag_slcomm
) {
13532 vty_out(vty
, " no neighbor %s send-community all\n", addr
);
13535 vty_out(vty
, " no neighbor %s send-community\n", addr
);
13538 " no neighbor %s send-community extended\n",
13542 vty_out(vty
, " no neighbor %s send-community large\n",
13546 /* Default information */
13547 if (peergroup_af_flag_check(peer
, afi
, safi
,
13548 PEER_FLAG_DEFAULT_ORIGINATE
)) {
13549 vty_out(vty
, " neighbor %s default-originate", addr
);
13551 if (peer
->default_rmap
[afi
][safi
].name
)
13552 vty_out(vty
, " route-map %s",
13553 peer
->default_rmap
[afi
][safi
].name
);
13555 vty_out(vty
, "\n");
13558 /* Soft reconfiguration inbound. */
13559 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_SOFT_RECONFIG
)) {
13560 vty_out(vty
, " neighbor %s soft-reconfiguration inbound\n",
13564 /* maximum-prefix. */
13565 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX
)) {
13566 vty_out(vty
, " neighbor %s maximum-prefix %" PRIu32
, addr
,
13567 peer
->pmax
[afi
][safi
]);
13569 if (peer
->pmax_threshold
[afi
][safi
]
13570 != MAXIMUM_PREFIX_THRESHOLD_DEFAULT
)
13571 vty_out(vty
, " %u", peer
->pmax_threshold
[afi
][safi
]);
13572 if (peer_af_flag_check(peer
, afi
, safi
,
13573 PEER_FLAG_MAX_PREFIX_WARNING
))
13574 vty_out(vty
, " warning-only");
13575 if (peer
->pmax_restart
[afi
][safi
])
13576 vty_out(vty
, " restart %u",
13577 peer
->pmax_restart
[afi
][safi
]);
13579 vty_out(vty
, "\n");
13582 /* Route server client. */
13583 if (peergroup_af_flag_check(peer
, afi
, safi
,
13584 PEER_FLAG_RSERVER_CLIENT
)) {
13585 vty_out(vty
, " neighbor %s route-server-client\n", addr
);
13588 /* Nexthop-local unchanged. */
13589 if (peergroup_af_flag_check(peer
, afi
, safi
,
13590 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
)) {
13591 vty_out(vty
, " neighbor %s nexthop-local unchanged\n", addr
);
13594 /* allowas-in <1-10> */
13595 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
)) {
13596 if (peer_af_flag_check(peer
, afi
, safi
,
13597 PEER_FLAG_ALLOWAS_IN_ORIGIN
)) {
13598 vty_out(vty
, " neighbor %s allowas-in origin\n", addr
);
13599 } else if (peer
->allowas_in
[afi
][safi
] == 3) {
13600 vty_out(vty
, " neighbor %s allowas-in\n", addr
);
13602 vty_out(vty
, " neighbor %s allowas-in %d\n", addr
,
13603 peer
->allowas_in
[afi
][safi
]);
13608 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_WEIGHT
))
13609 vty_out(vty
, " neighbor %s weight %lu\n", addr
,
13610 peer
->weight
[afi
][safi
]);
13613 bgp_config_write_filter(vty
, peer
, afi
, safi
);
13615 /* atribute-unchanged. */
13616 if (peer_af_flag_check(peer
, afi
, safi
, PEER_FLAG_AS_PATH_UNCHANGED
)
13617 || (safi
!= SAFI_EVPN
13618 && peer_af_flag_check(peer
, afi
, safi
,
13619 PEER_FLAG_NEXTHOP_UNCHANGED
))
13620 || peer_af_flag_check(peer
, afi
, safi
, PEER_FLAG_MED_UNCHANGED
)) {
13622 if (!peer_group_active(peer
)
13623 || peergroup_af_flag_check(peer
, afi
, safi
,
13624 PEER_FLAG_AS_PATH_UNCHANGED
)
13625 || peergroup_af_flag_check(peer
, afi
, safi
,
13626 PEER_FLAG_NEXTHOP_UNCHANGED
)
13627 || peergroup_af_flag_check(peer
, afi
, safi
,
13628 PEER_FLAG_MED_UNCHANGED
)) {
13631 " neighbor %s attribute-unchanged%s%s%s\n",
13633 peer_af_flag_check(peer
, afi
, safi
,
13634 PEER_FLAG_AS_PATH_UNCHANGED
)
13637 peer_af_flag_check(peer
, afi
, safi
,
13638 PEER_FLAG_NEXTHOP_UNCHANGED
)
13641 peer_af_flag_check(peer
, afi
, safi
,
13642 PEER_FLAG_MED_UNCHANGED
)
13649 /* Address family based peer configuration display. */
13650 static void bgp_config_write_family(struct vty
*vty
, struct bgp
*bgp
, afi_t afi
,
13654 struct peer_group
*group
;
13655 struct listnode
*node
, *nnode
;
13658 vty_frame(vty
, " !\n address-family ");
13659 if (afi
== AFI_IP
) {
13660 if (safi
== SAFI_UNICAST
)
13661 vty_frame(vty
, "ipv4 unicast");
13662 else if (safi
== SAFI_LABELED_UNICAST
)
13663 vty_frame(vty
, "ipv4 labeled-unicast");
13664 else if (safi
== SAFI_MULTICAST
)
13665 vty_frame(vty
, "ipv4 multicast");
13666 else if (safi
== SAFI_MPLS_VPN
)
13667 vty_frame(vty
, "ipv4 vpn");
13668 else if (safi
== SAFI_ENCAP
)
13669 vty_frame(vty
, "ipv4 encap");
13670 else if (safi
== SAFI_FLOWSPEC
)
13671 vty_frame(vty
, "ipv4 flowspec");
13672 } else if (afi
== AFI_IP6
) {
13673 if (safi
== SAFI_UNICAST
)
13674 vty_frame(vty
, "ipv6 unicast");
13675 else if (safi
== SAFI_LABELED_UNICAST
)
13676 vty_frame(vty
, "ipv6 labeled-unicast");
13677 else if (safi
== SAFI_MULTICAST
)
13678 vty_frame(vty
, "ipv6 multicast");
13679 else if (safi
== SAFI_MPLS_VPN
)
13680 vty_frame(vty
, "ipv6 vpn");
13681 else if (safi
== SAFI_ENCAP
)
13682 vty_frame(vty
, "ipv6 encap");
13683 else if (safi
== SAFI_FLOWSPEC
)
13684 vty_frame(vty
, "ipv6 flowspec");
13685 } else if (afi
== AFI_L2VPN
) {
13686 if (safi
== SAFI_EVPN
)
13687 vty_frame(vty
, "l2vpn evpn");
13689 vty_frame(vty
, "\n");
13691 bgp_config_write_distance(vty
, bgp
, afi
, safi
);
13693 bgp_config_write_network(vty
, bgp
, afi
, safi
);
13695 bgp_config_write_redistribute(vty
, bgp
, afi
, safi
);
13697 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
))
13698 bgp_config_write_peer_af(vty
, bgp
, group
->conf
, afi
, safi
);
13700 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
13701 /* Skip dynamic neighbors. */
13702 if (peer_dynamic_neighbor(peer
))
13705 /* Do not display doppelganger peers */
13706 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
13707 bgp_config_write_peer_af(vty
, bgp
, peer
, afi
, safi
);
13710 bgp_config_write_maxpaths(vty
, bgp
, afi
, safi
);
13711 bgp_config_write_table_map(vty
, bgp
, afi
, safi
);
13713 if (safi
== SAFI_EVPN
)
13714 bgp_config_write_evpn_info(vty
, bgp
, afi
, safi
);
13716 if (safi
== SAFI_FLOWSPEC
)
13717 bgp_fs_config_write_pbr(vty
, bgp
, afi
, safi
);
13719 if (safi
== SAFI_UNICAST
) {
13720 bgp_vpn_policy_config_write_afi(vty
, bgp
, afi
);
13721 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
13722 BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT
)) {
13724 vty_out(vty
, " export vpn\n");
13726 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
13727 BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT
)) {
13729 vty_out(vty
, " import vpn\n");
13731 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
13732 BGP_CONFIG_VRF_TO_VRF_IMPORT
)) {
13735 for (ALL_LIST_ELEMENTS_RO(
13736 bgp
->vpn_policy
[afi
].import_vrf
, node
,
13738 vty_out(vty
, " import vrf %s\n", name
);
13742 vty_endframe(vty
, " exit-address-family\n");
13745 int bgp_config_write(struct vty
*vty
)
13748 struct peer_group
*group
;
13750 struct listnode
*node
, *nnode
;
13751 struct listnode
*mnode
, *mnnode
;
13753 if (bm
->rmap_update_timer
!= RMAP_DEFAULT_UPDATE_TIMER
)
13754 vty_out(vty
, "bgp route-map delay-timer %u\n",
13755 bm
->rmap_update_timer
);
13757 /* BGP configuration. */
13758 for (ALL_LIST_ELEMENTS(bm
->bgp
, mnode
, mnnode
, bgp
)) {
13760 /* skip all auto created vrf as they dont have user config */
13761 if (CHECK_FLAG(bgp
->vrf_flags
, BGP_VRF_AUTO
))
13764 /* Router bgp ASN */
13765 vty_out(vty
, "router bgp %u", bgp
->as
);
13768 vty_out(vty
, " %s %s",
13769 (bgp
->inst_type
== BGP_INSTANCE_TYPE_VIEW
)
13770 ? "view" : "vrf", bgp
->name
);
13771 vty_out(vty
, "\n");
13773 /* BGP fast-external-failover. */
13774 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_NO_FAST_EXT_FAILOVER
))
13775 vty_out(vty
, " no bgp fast-external-failover\n");
13777 /* BGP router ID. */
13778 if (bgp
->router_id_static
.s_addr
!= 0)
13779 vty_out(vty
, " bgp router-id %s\n",
13780 inet_ntoa(bgp
->router_id_static
));
13782 /* BGP log-neighbor-changes. */
13783 if (!!bgp_flag_check(bgp
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
)
13784 != SAVE_BGP_LOG_NEIGHBOR_CHANGES
)
13785 vty_out(vty
, " %sbgp log-neighbor-changes\n",
13786 bgp_flag_check(bgp
,
13787 BGP_FLAG_LOG_NEIGHBOR_CHANGES
)
13791 /* BGP configuration. */
13792 if (bgp_flag_check(bgp
, BGP_FLAG_ALWAYS_COMPARE_MED
))
13793 vty_out(vty
, " bgp always-compare-med\n");
13795 /* RFC8212 default eBGP policy. */
13796 if (bgp
->ebgp_requires_policy
13797 == DEFAULT_EBGP_POLICY_ENABLED
)
13798 vty_out(vty
, " bgp ebgp-requires-policy\n");
13800 /* draft-ietf-idr-deprecate-as-set-confed-set */
13801 if (bgp
->reject_as_sets
== BGP_REJECT_AS_SETS_ENABLED
)
13802 vty_out(vty
, " bgp reject-as-sets\n");
13804 /* BGP default ipv4-unicast. */
13805 if (bgp_flag_check(bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
13806 vty_out(vty
, " no bgp default ipv4-unicast\n");
13808 /* BGP default local-preference. */
13809 if (bgp
->default_local_pref
!= BGP_DEFAULT_LOCAL_PREF
)
13810 vty_out(vty
, " bgp default local-preference %u\n",
13811 bgp
->default_local_pref
);
13813 /* BGP default show-hostname */
13814 if (!!bgp_flag_check(bgp
, BGP_FLAG_SHOW_HOSTNAME
)
13815 != SAVE_BGP_SHOW_HOSTNAME
)
13816 vty_out(vty
, " %sbgp default show-hostname\n",
13817 bgp_flag_check(bgp
, BGP_FLAG_SHOW_HOSTNAME
)
13821 /* BGP default subgroup-pkt-queue-max. */
13822 if (bgp
->default_subgroup_pkt_queue_max
13823 != BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX
)
13824 vty_out(vty
, " bgp default subgroup-pkt-queue-max %u\n",
13825 bgp
->default_subgroup_pkt_queue_max
);
13827 /* BGP client-to-client reflection. */
13828 if (bgp_flag_check(bgp
, BGP_FLAG_NO_CLIENT_TO_CLIENT
))
13829 vty_out(vty
, " no bgp client-to-client reflection\n");
13831 /* BGP cluster ID. */
13832 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CLUSTER_ID
))
13833 vty_out(vty
, " bgp cluster-id %s\n",
13834 inet_ntoa(bgp
->cluster_id
));
13836 /* Disable ebgp connected nexthop check */
13837 if (bgp_flag_check(bgp
, BGP_FLAG_DISABLE_NH_CONNECTED_CHK
))
13839 " bgp disable-ebgp-connected-route-check\n");
13841 /* Confederation identifier*/
13842 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
))
13843 vty_out(vty
, " bgp confederation identifier %u\n",
13846 /* Confederation peer */
13847 if (bgp
->confed_peers_cnt
> 0) {
13850 vty_out(vty
, " bgp confederation peers");
13852 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
13853 vty_out(vty
, " %u", bgp
->confed_peers
[i
]);
13855 vty_out(vty
, "\n");
13858 /* BGP deterministic-med. */
13859 if (!!bgp_flag_check(bgp
, BGP_FLAG_DETERMINISTIC_MED
)
13860 != SAVE_BGP_DETERMINISTIC_MED
)
13861 vty_out(vty
, " %sbgp deterministic-med\n",
13862 bgp_flag_check(bgp
, BGP_FLAG_DETERMINISTIC_MED
)
13866 /* BGP update-delay. */
13867 bgp_config_write_update_delay(vty
, bgp
);
13869 if (bgp
->v_maxmed_onstartup
13870 != BGP_MAXMED_ONSTARTUP_UNCONFIGURED
) {
13871 vty_out(vty
, " bgp max-med on-startup %u",
13872 bgp
->v_maxmed_onstartup
);
13873 if (bgp
->maxmed_onstartup_value
13874 != BGP_MAXMED_VALUE_DEFAULT
)
13875 vty_out(vty
, " %u",
13876 bgp
->maxmed_onstartup_value
);
13877 vty_out(vty
, "\n");
13879 if (bgp
->v_maxmed_admin
!= BGP_MAXMED_ADMIN_UNCONFIGURED
) {
13880 vty_out(vty
, " bgp max-med administrative");
13881 if (bgp
->maxmed_admin_value
!= BGP_MAXMED_VALUE_DEFAULT
)
13882 vty_out(vty
, " %u", bgp
->maxmed_admin_value
);
13883 vty_out(vty
, "\n");
13887 bgp_config_write_wpkt_quanta(vty
, bgp
);
13889 bgp_config_write_rpkt_quanta(vty
, bgp
);
13891 /* coalesce time */
13892 bgp_config_write_coalesce_time(vty
, bgp
);
13894 /* BGP graceful-restart. */
13895 if (bgp
->stalepath_time
!= BGP_DEFAULT_STALEPATH_TIME
)
13897 " bgp graceful-restart stalepath-time %u\n",
13898 bgp
->stalepath_time
);
13899 if (bgp
->restart_time
!= BGP_DEFAULT_RESTART_TIME
)
13900 vty_out(vty
, " bgp graceful-restart restart-time %u\n",
13901 bgp
->restart_time
);
13902 if (bgp_flag_check(bgp
, BGP_FLAG_GRACEFUL_RESTART
))
13903 vty_out(vty
, " bgp graceful-restart\n");
13905 /* BGP graceful-shutdown */
13906 if (bgp_flag_check(bgp
, BGP_FLAG_GRACEFUL_SHUTDOWN
))
13907 vty_out(vty
, " bgp graceful-shutdown\n");
13909 /* BGP graceful-restart Preserve State F bit. */
13910 if (bgp_flag_check(bgp
, BGP_FLAG_GR_PRESERVE_FWD
))
13912 " bgp graceful-restart preserve-fw-state\n");
13914 /* BGP bestpath method. */
13915 if (bgp_flag_check(bgp
, BGP_FLAG_ASPATH_IGNORE
))
13916 vty_out(vty
, " bgp bestpath as-path ignore\n");
13917 if (bgp_flag_check(bgp
, BGP_FLAG_ASPATH_CONFED
))
13918 vty_out(vty
, " bgp bestpath as-path confed\n");
13920 if (bgp_flag_check(bgp
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
)) {
13921 if (bgp_flag_check(bgp
,
13922 BGP_FLAG_MULTIPATH_RELAX_AS_SET
)) {
13924 " bgp bestpath as-path multipath-relax as-set\n");
13927 " bgp bestpath as-path multipath-relax\n");
13931 if (bgp_flag_check(bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
)) {
13933 " bgp route-reflector allow-outbound-policy\n");
13935 if (bgp_flag_check(bgp
, BGP_FLAG_COMPARE_ROUTER_ID
))
13936 vty_out(vty
, " bgp bestpath compare-routerid\n");
13937 if (bgp_flag_check(bgp
, BGP_FLAG_MED_CONFED
)
13938 || bgp_flag_check(bgp
, BGP_FLAG_MED_MISSING_AS_WORST
)) {
13939 vty_out(vty
, " bgp bestpath med");
13940 if (bgp_flag_check(bgp
, BGP_FLAG_MED_CONFED
))
13941 vty_out(vty
, " confed");
13942 if (bgp_flag_check(bgp
, BGP_FLAG_MED_MISSING_AS_WORST
))
13943 vty_out(vty
, " missing-as-worst");
13944 vty_out(vty
, "\n");
13947 /* BGP network import check. */
13948 if (!!bgp_flag_check(bgp
, BGP_FLAG_IMPORT_CHECK
)
13949 != SAVE_BGP_IMPORT_CHECK
)
13950 vty_out(vty
, " %sbgp network import-check\n",
13951 bgp_flag_check(bgp
, BGP_FLAG_IMPORT_CHECK
)
13955 /* BGP timers configuration. */
13956 if (bgp
->default_keepalive
!= SAVE_BGP_KEEPALIVE
13957 && bgp
->default_holdtime
!= SAVE_BGP_HOLDTIME
)
13958 vty_out(vty
, " timers bgp %u %u\n",
13959 bgp
->default_keepalive
, bgp
->default_holdtime
);
13962 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
13963 bgp_config_write_peer_global(vty
, bgp
, group
->conf
);
13966 /* Normal neighbor configuration. */
13967 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
13968 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
13969 bgp_config_write_peer_global(vty
, bgp
, peer
);
13972 /* listen range and limit for dynamic BGP neighbors */
13973 bgp_config_write_listen(vty
, bgp
);
13976 * BGP default autoshutdown neighbors
13978 * This must be placed after any peer and peer-group
13979 * configuration, to avoid setting all peers to shutdown after
13980 * a daemon restart, which is undesired behavior. (see #2286)
13982 if (bgp
->autoshutdown
)
13983 vty_out(vty
, " bgp default shutdown\n");
13985 /* IPv4 unicast configuration. */
13986 bgp_config_write_family(vty
, bgp
, AFI_IP
, SAFI_UNICAST
);
13988 /* IPv4 multicast configuration. */
13989 bgp_config_write_family(vty
, bgp
, AFI_IP
, SAFI_MULTICAST
);
13991 /* IPv4 labeled-unicast configuration. */
13992 bgp_config_write_family(vty
, bgp
, AFI_IP
, SAFI_LABELED_UNICAST
);
13994 /* IPv4 VPN configuration. */
13995 bgp_config_write_family(vty
, bgp
, AFI_IP
, SAFI_MPLS_VPN
);
13997 /* ENCAPv4 configuration. */
13998 bgp_config_write_family(vty
, bgp
, AFI_IP
, SAFI_ENCAP
);
14000 /* FLOWSPEC v4 configuration. */
14001 bgp_config_write_family(vty
, bgp
, AFI_IP
, SAFI_FLOWSPEC
);
14003 /* IPv6 unicast configuration. */
14004 bgp_config_write_family(vty
, bgp
, AFI_IP6
, SAFI_UNICAST
);
14006 /* IPv6 multicast configuration. */
14007 bgp_config_write_family(vty
, bgp
, AFI_IP6
, SAFI_MULTICAST
);
14009 /* IPv6 labeled-unicast configuration. */
14010 bgp_config_write_family(vty
, bgp
, AFI_IP6
,
14011 SAFI_LABELED_UNICAST
);
14013 /* IPv6 VPN configuration. */
14014 bgp_config_write_family(vty
, bgp
, AFI_IP6
, SAFI_MPLS_VPN
);
14016 /* ENCAPv6 configuration. */
14017 bgp_config_write_family(vty
, bgp
, AFI_IP6
, SAFI_ENCAP
);
14019 /* FLOWSPEC v6 configuration. */
14020 bgp_config_write_family(vty
, bgp
, AFI_IP6
, SAFI_FLOWSPEC
);
14022 /* EVPN configuration. */
14023 bgp_config_write_family(vty
, bgp
, AFI_L2VPN
, SAFI_EVPN
);
14025 hook_call(bgp_inst_config_write
, bgp
, vty
);
14028 bgp_rfapi_cfg_write(vty
, bgp
);
14031 vty_out(vty
, "!\n");
14037 /* BGP node structure. */
14038 static struct cmd_node bgp_node
= {
14039 BGP_NODE
, "%s(config-router)# ", 1,
14042 static struct cmd_node bgp_ipv4_unicast_node
= {
14043 BGP_IPV4_NODE
, "%s(config-router-af)# ", 1,
14046 static struct cmd_node bgp_ipv4_multicast_node
= {
14047 BGP_IPV4M_NODE
, "%s(config-router-af)# ", 1,
14050 static struct cmd_node bgp_ipv4_labeled_unicast_node
= {
14051 BGP_IPV4L_NODE
, "%s(config-router-af)# ", 1,
14054 static struct cmd_node bgp_ipv6_unicast_node
= {
14055 BGP_IPV6_NODE
, "%s(config-router-af)# ", 1,
14058 static struct cmd_node bgp_ipv6_multicast_node
= {
14059 BGP_IPV6M_NODE
, "%s(config-router-af)# ", 1,
14062 static struct cmd_node bgp_ipv6_labeled_unicast_node
= {
14063 BGP_IPV6L_NODE
, "%s(config-router-af)# ", 1,
14066 static struct cmd_node bgp_vpnv4_node
= {BGP_VPNV4_NODE
,
14067 "%s(config-router-af)# ", 1};
14069 static struct cmd_node bgp_vpnv6_node
= {BGP_VPNV6_NODE
,
14070 "%s(config-router-af-vpnv6)# ", 1};
14072 static struct cmd_node bgp_evpn_node
= {BGP_EVPN_NODE
,
14073 "%s(config-router-evpn)# ", 1};
14075 static struct cmd_node bgp_evpn_vni_node
= {BGP_EVPN_VNI_NODE
,
14076 "%s(config-router-af-vni)# ", 1};
14078 static struct cmd_node bgp_flowspecv4_node
= {BGP_FLOWSPECV4_NODE
,
14079 "%s(config-router-af)# ", 1};
14081 static struct cmd_node bgp_flowspecv6_node
= {BGP_FLOWSPECV6_NODE
,
14082 "%s(config-router-af-vpnv6)# ", 1};
14084 static void community_list_vty(void);
14086 static void bgp_ac_neighbor(vector comps
, struct cmd_token
*token
)
14090 struct listnode
*lnbgp
, *lnpeer
;
14092 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, lnbgp
, bgp
)) {
14093 for (ALL_LIST_ELEMENTS_RO(bgp
->peer
, lnpeer
, peer
)) {
14094 /* only provide suggestions on the appropriate input
14096 * they'll otherwise show up multiple times */
14097 enum cmd_token_type match_type
;
14098 char *name
= peer
->host
;
14100 if (peer
->conf_if
) {
14101 match_type
= VARIABLE_TKN
;
14102 name
= peer
->conf_if
;
14103 } else if (strchr(peer
->host
, ':'))
14104 match_type
= IPV6_TKN
;
14106 match_type
= IPV4_TKN
;
14108 if (token
->type
!= match_type
)
14111 vector_set(comps
, XSTRDUP(MTYPE_COMPLETION
, name
));
14116 static const struct cmd_variable_handler bgp_var_neighbor
[] = {
14117 {.varname
= "neighbor", .completions
= bgp_ac_neighbor
},
14118 {.varname
= "neighbors", .completions
= bgp_ac_neighbor
},
14119 {.varname
= "peer", .completions
= bgp_ac_neighbor
},
14120 {.completions
= NULL
}};
14122 static void bgp_ac_peergroup(vector comps
, struct cmd_token
*token
)
14125 struct peer_group
*group
;
14126 struct listnode
*lnbgp
, *lnpeer
;
14128 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, lnbgp
, bgp
)) {
14129 for (ALL_LIST_ELEMENTS_RO(bgp
->group
, lnpeer
, group
))
14130 vector_set(comps
, XSTRDUP(MTYPE_COMPLETION
,
14135 static const struct cmd_variable_handler bgp_var_peergroup
[] = {
14136 {.tokenname
= "PGNAME", .completions
= bgp_ac_peergroup
},
14137 {.completions
= NULL
} };
14139 void bgp_vty_init(void)
14141 cmd_variable_handler_register(bgp_var_neighbor
);
14142 cmd_variable_handler_register(bgp_var_peergroup
);
14144 /* Install bgp top node. */
14145 install_node(&bgp_node
, bgp_config_write
);
14146 install_node(&bgp_ipv4_unicast_node
, NULL
);
14147 install_node(&bgp_ipv4_multicast_node
, NULL
);
14148 install_node(&bgp_ipv4_labeled_unicast_node
, NULL
);
14149 install_node(&bgp_ipv6_unicast_node
, NULL
);
14150 install_node(&bgp_ipv6_multicast_node
, NULL
);
14151 install_node(&bgp_ipv6_labeled_unicast_node
, NULL
);
14152 install_node(&bgp_vpnv4_node
, NULL
);
14153 install_node(&bgp_vpnv6_node
, NULL
);
14154 install_node(&bgp_evpn_node
, NULL
);
14155 install_node(&bgp_evpn_vni_node
, NULL
);
14156 install_node(&bgp_flowspecv4_node
, NULL
);
14157 install_node(&bgp_flowspecv6_node
, NULL
);
14159 /* Install default VTY commands to new nodes. */
14160 install_default(BGP_NODE
);
14161 install_default(BGP_IPV4_NODE
);
14162 install_default(BGP_IPV4M_NODE
);
14163 install_default(BGP_IPV4L_NODE
);
14164 install_default(BGP_IPV6_NODE
);
14165 install_default(BGP_IPV6M_NODE
);
14166 install_default(BGP_IPV6L_NODE
);
14167 install_default(BGP_VPNV4_NODE
);
14168 install_default(BGP_VPNV6_NODE
);
14169 install_default(BGP_FLOWSPECV4_NODE
);
14170 install_default(BGP_FLOWSPECV6_NODE
);
14171 install_default(BGP_EVPN_NODE
);
14172 install_default(BGP_EVPN_VNI_NODE
);
14174 /* "bgp local-mac" hidden commands. */
14175 install_element(CONFIG_NODE
, &bgp_local_mac_cmd
);
14176 install_element(CONFIG_NODE
, &no_bgp_local_mac_cmd
);
14178 /* bgp route-map delay-timer commands. */
14179 install_element(CONFIG_NODE
, &bgp_set_route_map_delay_timer_cmd
);
14180 install_element(CONFIG_NODE
, &no_bgp_set_route_map_delay_timer_cmd
);
14182 /* Dummy commands (Currently not supported) */
14183 install_element(BGP_NODE
, &no_synchronization_cmd
);
14184 install_element(BGP_NODE
, &no_auto_summary_cmd
);
14186 /* "router bgp" commands. */
14187 install_element(CONFIG_NODE
, &router_bgp_cmd
);
14189 /* "no router bgp" commands. */
14190 install_element(CONFIG_NODE
, &no_router_bgp_cmd
);
14192 /* "bgp router-id" commands. */
14193 install_element(BGP_NODE
, &bgp_router_id_cmd
);
14194 install_element(BGP_NODE
, &no_bgp_router_id_cmd
);
14196 /* "bgp cluster-id" commands. */
14197 install_element(BGP_NODE
, &bgp_cluster_id_cmd
);
14198 install_element(BGP_NODE
, &no_bgp_cluster_id_cmd
);
14200 /* "bgp confederation" commands. */
14201 install_element(BGP_NODE
, &bgp_confederation_identifier_cmd
);
14202 install_element(BGP_NODE
, &no_bgp_confederation_identifier_cmd
);
14204 /* "bgp confederation peers" commands. */
14205 install_element(BGP_NODE
, &bgp_confederation_peers_cmd
);
14206 install_element(BGP_NODE
, &no_bgp_confederation_peers_cmd
);
14208 /* bgp max-med command */
14209 install_element(BGP_NODE
, &bgp_maxmed_admin_cmd
);
14210 install_element(BGP_NODE
, &no_bgp_maxmed_admin_cmd
);
14211 install_element(BGP_NODE
, &bgp_maxmed_admin_medv_cmd
);
14212 install_element(BGP_NODE
, &bgp_maxmed_onstartup_cmd
);
14213 install_element(BGP_NODE
, &no_bgp_maxmed_onstartup_cmd
);
14215 /* bgp disable-ebgp-connected-nh-check */
14216 install_element(BGP_NODE
, &bgp_disable_connected_route_check_cmd
);
14217 install_element(BGP_NODE
, &no_bgp_disable_connected_route_check_cmd
);
14219 /* bgp update-delay command */
14220 install_element(BGP_NODE
, &bgp_update_delay_cmd
);
14221 install_element(BGP_NODE
, &no_bgp_update_delay_cmd
);
14222 install_element(BGP_NODE
, &bgp_update_delay_establish_wait_cmd
);
14224 install_element(BGP_NODE
, &bgp_wpkt_quanta_cmd
);
14225 install_element(BGP_NODE
, &bgp_rpkt_quanta_cmd
);
14227 install_element(BGP_NODE
, &bgp_coalesce_time_cmd
);
14228 install_element(BGP_NODE
, &no_bgp_coalesce_time_cmd
);
14230 /* "maximum-paths" commands. */
14231 install_element(BGP_NODE
, &bgp_maxpaths_hidden_cmd
);
14232 install_element(BGP_NODE
, &no_bgp_maxpaths_hidden_cmd
);
14233 install_element(BGP_IPV4_NODE
, &bgp_maxpaths_cmd
);
14234 install_element(BGP_IPV4_NODE
, &no_bgp_maxpaths_cmd
);
14235 install_element(BGP_IPV6_NODE
, &bgp_maxpaths_cmd
);
14236 install_element(BGP_IPV6_NODE
, &no_bgp_maxpaths_cmd
);
14237 install_element(BGP_NODE
, &bgp_maxpaths_ibgp_hidden_cmd
);
14238 install_element(BGP_NODE
, &bgp_maxpaths_ibgp_cluster_hidden_cmd
);
14239 install_element(BGP_NODE
, &no_bgp_maxpaths_ibgp_hidden_cmd
);
14240 install_element(BGP_IPV4_NODE
, &bgp_maxpaths_ibgp_cmd
);
14241 install_element(BGP_IPV4_NODE
, &bgp_maxpaths_ibgp_cluster_cmd
);
14242 install_element(BGP_IPV4_NODE
, &no_bgp_maxpaths_ibgp_cmd
);
14243 install_element(BGP_IPV6_NODE
, &bgp_maxpaths_ibgp_cmd
);
14244 install_element(BGP_IPV6_NODE
, &bgp_maxpaths_ibgp_cluster_cmd
);
14245 install_element(BGP_IPV6_NODE
, &no_bgp_maxpaths_ibgp_cmd
);
14247 install_element(BGP_IPV6L_NODE
, &bgp_maxpaths_cmd
);
14248 install_element(BGP_IPV6L_NODE
, &no_bgp_maxpaths_cmd
);
14249 install_element(BGP_IPV6L_NODE
, &bgp_maxpaths_ibgp_cmd
);
14250 install_element(BGP_IPV6L_NODE
, &bgp_maxpaths_ibgp_cluster_cmd
);
14251 install_element(BGP_IPV6L_NODE
, &no_bgp_maxpaths_ibgp_cmd
);
14253 /* "timers bgp" commands. */
14254 install_element(BGP_NODE
, &bgp_timers_cmd
);
14255 install_element(BGP_NODE
, &no_bgp_timers_cmd
);
14257 /* route-map delay-timer commands - per instance for backwards compat.
14259 install_element(BGP_NODE
, &bgp_set_route_map_delay_timer_cmd
);
14260 install_element(BGP_NODE
, &no_bgp_set_route_map_delay_timer_cmd
);
14262 /* "bgp client-to-client reflection" commands */
14263 install_element(BGP_NODE
, &no_bgp_client_to_client_reflection_cmd
);
14264 install_element(BGP_NODE
, &bgp_client_to_client_reflection_cmd
);
14266 /* "bgp always-compare-med" commands */
14267 install_element(BGP_NODE
, &bgp_always_compare_med_cmd
);
14268 install_element(BGP_NODE
, &no_bgp_always_compare_med_cmd
);
14270 /* bgp ebgp-requires-policy */
14271 install_element(BGP_NODE
, &bgp_ebgp_requires_policy_cmd
);
14272 install_element(BGP_NODE
, &no_bgp_ebgp_requires_policy_cmd
);
14274 /* bgp reject-as-sets */
14275 install_element(BGP_NODE
, &bgp_reject_as_sets_cmd
);
14276 install_element(BGP_NODE
, &no_bgp_reject_as_sets_cmd
);
14278 /* "bgp deterministic-med" commands */
14279 install_element(BGP_NODE
, &bgp_deterministic_med_cmd
);
14280 install_element(BGP_NODE
, &no_bgp_deterministic_med_cmd
);
14282 /* "bgp graceful-restart" commands */
14283 install_element(BGP_NODE
, &bgp_graceful_restart_cmd
);
14284 install_element(BGP_NODE
, &no_bgp_graceful_restart_cmd
);
14285 install_element(BGP_NODE
, &bgp_graceful_restart_stalepath_time_cmd
);
14286 install_element(BGP_NODE
, &no_bgp_graceful_restart_stalepath_time_cmd
);
14287 install_element(BGP_NODE
, &bgp_graceful_restart_restart_time_cmd
);
14288 install_element(BGP_NODE
, &no_bgp_graceful_restart_restart_time_cmd
);
14290 install_element(BGP_NODE
, &bgp_graceful_restart_preserve_fw_cmd
);
14291 install_element(BGP_NODE
, &no_bgp_graceful_restart_preserve_fw_cmd
);
14293 /* "bgp graceful-shutdown" commands */
14294 install_element(BGP_NODE
, &bgp_graceful_shutdown_cmd
);
14295 install_element(BGP_NODE
, &no_bgp_graceful_shutdown_cmd
);
14297 /* "bgp fast-external-failover" commands */
14298 install_element(BGP_NODE
, &bgp_fast_external_failover_cmd
);
14299 install_element(BGP_NODE
, &no_bgp_fast_external_failover_cmd
);
14301 /* "bgp bestpath compare-routerid" commands */
14302 install_element(BGP_NODE
, &bgp_bestpath_compare_router_id_cmd
);
14303 install_element(BGP_NODE
, &no_bgp_bestpath_compare_router_id_cmd
);
14305 /* "bgp bestpath as-path ignore" commands */
14306 install_element(BGP_NODE
, &bgp_bestpath_aspath_ignore_cmd
);
14307 install_element(BGP_NODE
, &no_bgp_bestpath_aspath_ignore_cmd
);
14309 /* "bgp bestpath as-path confed" commands */
14310 install_element(BGP_NODE
, &bgp_bestpath_aspath_confed_cmd
);
14311 install_element(BGP_NODE
, &no_bgp_bestpath_aspath_confed_cmd
);
14313 /* "bgp bestpath as-path multipath-relax" commands */
14314 install_element(BGP_NODE
, &bgp_bestpath_aspath_multipath_relax_cmd
);
14315 install_element(BGP_NODE
, &no_bgp_bestpath_aspath_multipath_relax_cmd
);
14317 /* "bgp log-neighbor-changes" commands */
14318 install_element(BGP_NODE
, &bgp_log_neighbor_changes_cmd
);
14319 install_element(BGP_NODE
, &no_bgp_log_neighbor_changes_cmd
);
14321 /* "bgp bestpath med" commands */
14322 install_element(BGP_NODE
, &bgp_bestpath_med_cmd
);
14323 install_element(BGP_NODE
, &no_bgp_bestpath_med_cmd
);
14325 /* "no bgp default ipv4-unicast" commands. */
14326 install_element(BGP_NODE
, &no_bgp_default_ipv4_unicast_cmd
);
14327 install_element(BGP_NODE
, &bgp_default_ipv4_unicast_cmd
);
14329 /* "bgp network import-check" commands. */
14330 install_element(BGP_NODE
, &bgp_network_import_check_cmd
);
14331 install_element(BGP_NODE
, &bgp_network_import_check_exact_cmd
);
14332 install_element(BGP_NODE
, &no_bgp_network_import_check_cmd
);
14334 /* "bgp default local-preference" commands. */
14335 install_element(BGP_NODE
, &bgp_default_local_preference_cmd
);
14336 install_element(BGP_NODE
, &no_bgp_default_local_preference_cmd
);
14338 /* bgp default show-hostname */
14339 install_element(BGP_NODE
, &bgp_default_show_hostname_cmd
);
14340 install_element(BGP_NODE
, &no_bgp_default_show_hostname_cmd
);
14342 /* "bgp default subgroup-pkt-queue-max" commands. */
14343 install_element(BGP_NODE
, &bgp_default_subgroup_pkt_queue_max_cmd
);
14344 install_element(BGP_NODE
, &no_bgp_default_subgroup_pkt_queue_max_cmd
);
14346 /* bgp ibgp-allow-policy-mods command */
14347 install_element(BGP_NODE
, &bgp_rr_allow_outbound_policy_cmd
);
14348 install_element(BGP_NODE
, &no_bgp_rr_allow_outbound_policy_cmd
);
14350 /* "bgp listen limit" commands. */
14351 install_element(BGP_NODE
, &bgp_listen_limit_cmd
);
14352 install_element(BGP_NODE
, &no_bgp_listen_limit_cmd
);
14354 /* "bgp listen range" commands. */
14355 install_element(BGP_NODE
, &bgp_listen_range_cmd
);
14356 install_element(BGP_NODE
, &no_bgp_listen_range_cmd
);
14358 /* "bgp default shutdown" command */
14359 install_element(BGP_NODE
, &bgp_default_shutdown_cmd
);
14361 /* "neighbor remote-as" commands. */
14362 install_element(BGP_NODE
, &neighbor_remote_as_cmd
);
14363 install_element(BGP_NODE
, &neighbor_interface_config_cmd
);
14364 install_element(BGP_NODE
, &neighbor_interface_config_v6only_cmd
);
14365 install_element(BGP_NODE
, &neighbor_interface_config_remote_as_cmd
);
14366 install_element(BGP_NODE
,
14367 &neighbor_interface_v6only_config_remote_as_cmd
);
14368 install_element(BGP_NODE
, &no_neighbor_cmd
);
14369 install_element(BGP_NODE
, &no_neighbor_interface_config_cmd
);
14371 /* "neighbor peer-group" commands. */
14372 install_element(BGP_NODE
, &neighbor_peer_group_cmd
);
14373 install_element(BGP_NODE
, &no_neighbor_peer_group_cmd
);
14374 install_element(BGP_NODE
,
14375 &no_neighbor_interface_peer_group_remote_as_cmd
);
14377 /* "neighbor local-as" commands. */
14378 install_element(BGP_NODE
, &neighbor_local_as_cmd
);
14379 install_element(BGP_NODE
, &neighbor_local_as_no_prepend_cmd
);
14380 install_element(BGP_NODE
, &neighbor_local_as_no_prepend_replace_as_cmd
);
14381 install_element(BGP_NODE
, &no_neighbor_local_as_cmd
);
14383 /* "neighbor solo" commands. */
14384 install_element(BGP_NODE
, &neighbor_solo_cmd
);
14385 install_element(BGP_NODE
, &no_neighbor_solo_cmd
);
14387 /* "neighbor password" commands. */
14388 install_element(BGP_NODE
, &neighbor_password_cmd
);
14389 install_element(BGP_NODE
, &no_neighbor_password_cmd
);
14391 /* "neighbor activate" commands. */
14392 install_element(BGP_NODE
, &neighbor_activate_hidden_cmd
);
14393 install_element(BGP_IPV4_NODE
, &neighbor_activate_cmd
);
14394 install_element(BGP_IPV4M_NODE
, &neighbor_activate_cmd
);
14395 install_element(BGP_IPV4L_NODE
, &neighbor_activate_cmd
);
14396 install_element(BGP_IPV6_NODE
, &neighbor_activate_cmd
);
14397 install_element(BGP_IPV6M_NODE
, &neighbor_activate_cmd
);
14398 install_element(BGP_IPV6L_NODE
, &neighbor_activate_cmd
);
14399 install_element(BGP_VPNV4_NODE
, &neighbor_activate_cmd
);
14400 install_element(BGP_VPNV6_NODE
, &neighbor_activate_cmd
);
14401 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_activate_cmd
);
14402 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_activate_cmd
);
14403 install_element(BGP_EVPN_NODE
, &neighbor_activate_cmd
);
14405 /* "no neighbor activate" commands. */
14406 install_element(BGP_NODE
, &no_neighbor_activate_hidden_cmd
);
14407 install_element(BGP_IPV4_NODE
, &no_neighbor_activate_cmd
);
14408 install_element(BGP_IPV4M_NODE
, &no_neighbor_activate_cmd
);
14409 install_element(BGP_IPV4L_NODE
, &no_neighbor_activate_cmd
);
14410 install_element(BGP_IPV6_NODE
, &no_neighbor_activate_cmd
);
14411 install_element(BGP_IPV6M_NODE
, &no_neighbor_activate_cmd
);
14412 install_element(BGP_IPV6L_NODE
, &no_neighbor_activate_cmd
);
14413 install_element(BGP_VPNV4_NODE
, &no_neighbor_activate_cmd
);
14414 install_element(BGP_VPNV6_NODE
, &no_neighbor_activate_cmd
);
14415 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_activate_cmd
);
14416 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_activate_cmd
);
14417 install_element(BGP_EVPN_NODE
, &no_neighbor_activate_cmd
);
14419 /* "neighbor peer-group" set commands. */
14420 install_element(BGP_NODE
, &neighbor_set_peer_group_cmd
);
14421 install_element(BGP_IPV4_NODE
, &neighbor_set_peer_group_hidden_cmd
);
14422 install_element(BGP_IPV4M_NODE
, &neighbor_set_peer_group_hidden_cmd
);
14423 install_element(BGP_IPV6_NODE
, &neighbor_set_peer_group_hidden_cmd
);
14424 install_element(BGP_IPV6M_NODE
, &neighbor_set_peer_group_hidden_cmd
);
14425 install_element(BGP_IPV6L_NODE
, &neighbor_set_peer_group_hidden_cmd
);
14426 install_element(BGP_VPNV4_NODE
, &neighbor_set_peer_group_hidden_cmd
);
14427 install_element(BGP_VPNV6_NODE
, &neighbor_set_peer_group_hidden_cmd
);
14428 install_element(BGP_FLOWSPECV4_NODE
,
14429 &neighbor_set_peer_group_hidden_cmd
);
14430 install_element(BGP_FLOWSPECV6_NODE
,
14431 &neighbor_set_peer_group_hidden_cmd
);
14433 /* "no neighbor peer-group unset" commands. */
14434 install_element(BGP_NODE
, &no_neighbor_set_peer_group_cmd
);
14435 install_element(BGP_IPV4_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
14436 install_element(BGP_IPV4M_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
14437 install_element(BGP_IPV6_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
14438 install_element(BGP_IPV6M_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
14439 install_element(BGP_IPV6L_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
14440 install_element(BGP_VPNV4_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
14441 install_element(BGP_VPNV6_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
14442 install_element(BGP_FLOWSPECV4_NODE
,
14443 &no_neighbor_set_peer_group_hidden_cmd
);
14444 install_element(BGP_FLOWSPECV6_NODE
,
14445 &no_neighbor_set_peer_group_hidden_cmd
);
14447 /* "neighbor softreconfiguration inbound" commands.*/
14448 install_element(BGP_NODE
, &neighbor_soft_reconfiguration_hidden_cmd
);
14449 install_element(BGP_NODE
, &no_neighbor_soft_reconfiguration_hidden_cmd
);
14450 install_element(BGP_IPV4_NODE
, &neighbor_soft_reconfiguration_cmd
);
14451 install_element(BGP_IPV4_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
14452 install_element(BGP_IPV4L_NODE
, &neighbor_soft_reconfiguration_cmd
);
14453 install_element(BGP_IPV4L_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
14454 install_element(BGP_IPV4M_NODE
, &neighbor_soft_reconfiguration_cmd
);
14455 install_element(BGP_IPV4M_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
14456 install_element(BGP_IPV6_NODE
, &neighbor_soft_reconfiguration_cmd
);
14457 install_element(BGP_IPV6_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
14458 install_element(BGP_IPV6M_NODE
, &neighbor_soft_reconfiguration_cmd
);
14459 install_element(BGP_IPV6M_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
14460 install_element(BGP_IPV6L_NODE
, &neighbor_soft_reconfiguration_cmd
);
14461 install_element(BGP_IPV6L_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
14462 install_element(BGP_VPNV4_NODE
, &neighbor_soft_reconfiguration_cmd
);
14463 install_element(BGP_VPNV4_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
14464 install_element(BGP_VPNV6_NODE
, &neighbor_soft_reconfiguration_cmd
);
14465 install_element(BGP_VPNV6_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
14466 install_element(BGP_FLOWSPECV4_NODE
,
14467 &neighbor_soft_reconfiguration_cmd
);
14468 install_element(BGP_FLOWSPECV4_NODE
,
14469 &no_neighbor_soft_reconfiguration_cmd
);
14470 install_element(BGP_FLOWSPECV6_NODE
,
14471 &neighbor_soft_reconfiguration_cmd
);
14472 install_element(BGP_FLOWSPECV6_NODE
,
14473 &no_neighbor_soft_reconfiguration_cmd
);
14474 install_element(BGP_EVPN_NODE
, &neighbor_soft_reconfiguration_cmd
);
14475 install_element(BGP_EVPN_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
14477 /* "neighbor attribute-unchanged" commands. */
14478 install_element(BGP_NODE
, &neighbor_attr_unchanged_hidden_cmd
);
14479 install_element(BGP_NODE
, &no_neighbor_attr_unchanged_hidden_cmd
);
14480 install_element(BGP_IPV4_NODE
, &neighbor_attr_unchanged_cmd
);
14481 install_element(BGP_IPV4_NODE
, &no_neighbor_attr_unchanged_cmd
);
14482 install_element(BGP_IPV4M_NODE
, &neighbor_attr_unchanged_cmd
);
14483 install_element(BGP_IPV4M_NODE
, &no_neighbor_attr_unchanged_cmd
);
14484 install_element(BGP_IPV4L_NODE
, &neighbor_attr_unchanged_cmd
);
14485 install_element(BGP_IPV4L_NODE
, &no_neighbor_attr_unchanged_cmd
);
14486 install_element(BGP_IPV6_NODE
, &neighbor_attr_unchanged_cmd
);
14487 install_element(BGP_IPV6_NODE
, &no_neighbor_attr_unchanged_cmd
);
14488 install_element(BGP_IPV6M_NODE
, &neighbor_attr_unchanged_cmd
);
14489 install_element(BGP_IPV6M_NODE
, &no_neighbor_attr_unchanged_cmd
);
14490 install_element(BGP_IPV6L_NODE
, &neighbor_attr_unchanged_cmd
);
14491 install_element(BGP_IPV6L_NODE
, &no_neighbor_attr_unchanged_cmd
);
14492 install_element(BGP_VPNV4_NODE
, &neighbor_attr_unchanged_cmd
);
14493 install_element(BGP_VPNV4_NODE
, &no_neighbor_attr_unchanged_cmd
);
14494 install_element(BGP_VPNV6_NODE
, &neighbor_attr_unchanged_cmd
);
14495 install_element(BGP_VPNV6_NODE
, &no_neighbor_attr_unchanged_cmd
);
14497 install_element(BGP_EVPN_NODE
, &neighbor_attr_unchanged_cmd
);
14498 install_element(BGP_EVPN_NODE
, &no_neighbor_attr_unchanged_cmd
);
14500 /* "nexthop-local unchanged" commands */
14501 install_element(BGP_IPV6_NODE
, &neighbor_nexthop_local_unchanged_cmd
);
14502 install_element(BGP_IPV6_NODE
,
14503 &no_neighbor_nexthop_local_unchanged_cmd
);
14505 /* "neighbor next-hop-self" commands. */
14506 install_element(BGP_NODE
, &neighbor_nexthop_self_hidden_cmd
);
14507 install_element(BGP_NODE
, &no_neighbor_nexthop_self_hidden_cmd
);
14508 install_element(BGP_IPV4_NODE
, &neighbor_nexthop_self_cmd
);
14509 install_element(BGP_IPV4_NODE
, &no_neighbor_nexthop_self_cmd
);
14510 install_element(BGP_IPV4M_NODE
, &neighbor_nexthop_self_cmd
);
14511 install_element(BGP_IPV4M_NODE
, &no_neighbor_nexthop_self_cmd
);
14512 install_element(BGP_IPV4L_NODE
, &neighbor_nexthop_self_cmd
);
14513 install_element(BGP_IPV4L_NODE
, &no_neighbor_nexthop_self_cmd
);
14514 install_element(BGP_IPV6_NODE
, &neighbor_nexthop_self_cmd
);
14515 install_element(BGP_IPV6_NODE
, &no_neighbor_nexthop_self_cmd
);
14516 install_element(BGP_IPV6M_NODE
, &neighbor_nexthop_self_cmd
);
14517 install_element(BGP_IPV6M_NODE
, &no_neighbor_nexthop_self_cmd
);
14518 install_element(BGP_IPV6L_NODE
, &neighbor_nexthop_self_cmd
);
14519 install_element(BGP_IPV6L_NODE
, &no_neighbor_nexthop_self_cmd
);
14520 install_element(BGP_VPNV4_NODE
, &neighbor_nexthop_self_cmd
);
14521 install_element(BGP_VPNV4_NODE
, &no_neighbor_nexthop_self_cmd
);
14522 install_element(BGP_VPNV6_NODE
, &neighbor_nexthop_self_cmd
);
14523 install_element(BGP_VPNV6_NODE
, &no_neighbor_nexthop_self_cmd
);
14524 install_element(BGP_EVPN_NODE
, &neighbor_nexthop_self_cmd
);
14525 install_element(BGP_EVPN_NODE
, &no_neighbor_nexthop_self_cmd
);
14527 /* "neighbor next-hop-self force" commands. */
14528 install_element(BGP_NODE
, &neighbor_nexthop_self_force_hidden_cmd
);
14529 install_element(BGP_NODE
, &no_neighbor_nexthop_self_force_hidden_cmd
);
14530 install_element(BGP_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
14531 install_element(BGP_NODE
, &no_neighbor_nexthop_self_all_hidden_cmd
);
14532 install_element(BGP_IPV4_NODE
, &neighbor_nexthop_self_force_cmd
);
14533 install_element(BGP_IPV4_NODE
, &no_neighbor_nexthop_self_force_cmd
);
14534 install_element(BGP_IPV4_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
14535 install_element(BGP_IPV4_NODE
,
14536 &no_neighbor_nexthop_self_all_hidden_cmd
);
14537 install_element(BGP_IPV4M_NODE
, &neighbor_nexthop_self_force_cmd
);
14538 install_element(BGP_IPV4M_NODE
, &no_neighbor_nexthop_self_force_cmd
);
14539 install_element(BGP_IPV4M_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
14540 install_element(BGP_IPV4M_NODE
,
14541 &no_neighbor_nexthop_self_all_hidden_cmd
);
14542 install_element(BGP_IPV4L_NODE
, &neighbor_nexthop_self_force_cmd
);
14543 install_element(BGP_IPV4L_NODE
, &no_neighbor_nexthop_self_force_cmd
);
14544 install_element(BGP_IPV4L_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
14545 install_element(BGP_IPV4L_NODE
,
14546 &no_neighbor_nexthop_self_all_hidden_cmd
);
14547 install_element(BGP_IPV6_NODE
, &neighbor_nexthop_self_force_cmd
);
14548 install_element(BGP_IPV6_NODE
, &no_neighbor_nexthop_self_force_cmd
);
14549 install_element(BGP_IPV6_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
14550 install_element(BGP_IPV6_NODE
,
14551 &no_neighbor_nexthop_self_all_hidden_cmd
);
14552 install_element(BGP_IPV6M_NODE
, &neighbor_nexthop_self_force_cmd
);
14553 install_element(BGP_IPV6M_NODE
, &no_neighbor_nexthop_self_force_cmd
);
14554 install_element(BGP_IPV6M_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
14555 install_element(BGP_IPV6M_NODE
,
14556 &no_neighbor_nexthop_self_all_hidden_cmd
);
14557 install_element(BGP_IPV6L_NODE
, &neighbor_nexthop_self_force_cmd
);
14558 install_element(BGP_IPV6L_NODE
, &no_neighbor_nexthop_self_force_cmd
);
14559 install_element(BGP_IPV6L_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
14560 install_element(BGP_IPV6L_NODE
,
14561 &no_neighbor_nexthop_self_all_hidden_cmd
);
14562 install_element(BGP_VPNV4_NODE
, &neighbor_nexthop_self_force_cmd
);
14563 install_element(BGP_VPNV4_NODE
, &no_neighbor_nexthop_self_force_cmd
);
14564 install_element(BGP_VPNV4_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
14565 install_element(BGP_VPNV4_NODE
,
14566 &no_neighbor_nexthop_self_all_hidden_cmd
);
14567 install_element(BGP_VPNV6_NODE
, &neighbor_nexthop_self_force_cmd
);
14568 install_element(BGP_VPNV6_NODE
, &no_neighbor_nexthop_self_force_cmd
);
14569 install_element(BGP_VPNV6_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
14570 install_element(BGP_VPNV6_NODE
,
14571 &no_neighbor_nexthop_self_all_hidden_cmd
);
14573 /* "neighbor as-override" commands. */
14574 install_element(BGP_NODE
, &neighbor_as_override_hidden_cmd
);
14575 install_element(BGP_NODE
, &no_neighbor_as_override_hidden_cmd
);
14576 install_element(BGP_IPV4_NODE
, &neighbor_as_override_cmd
);
14577 install_element(BGP_IPV4_NODE
, &no_neighbor_as_override_cmd
);
14578 install_element(BGP_IPV4M_NODE
, &neighbor_as_override_cmd
);
14579 install_element(BGP_IPV4M_NODE
, &no_neighbor_as_override_cmd
);
14580 install_element(BGP_IPV4L_NODE
, &neighbor_as_override_cmd
);
14581 install_element(BGP_IPV4L_NODE
, &no_neighbor_as_override_cmd
);
14582 install_element(BGP_IPV6_NODE
, &neighbor_as_override_cmd
);
14583 install_element(BGP_IPV6_NODE
, &no_neighbor_as_override_cmd
);
14584 install_element(BGP_IPV6M_NODE
, &neighbor_as_override_cmd
);
14585 install_element(BGP_IPV6M_NODE
, &no_neighbor_as_override_cmd
);
14586 install_element(BGP_IPV6L_NODE
, &neighbor_as_override_cmd
);
14587 install_element(BGP_IPV6L_NODE
, &no_neighbor_as_override_cmd
);
14588 install_element(BGP_VPNV4_NODE
, &neighbor_as_override_cmd
);
14589 install_element(BGP_VPNV4_NODE
, &no_neighbor_as_override_cmd
);
14590 install_element(BGP_VPNV6_NODE
, &neighbor_as_override_cmd
);
14591 install_element(BGP_VPNV6_NODE
, &no_neighbor_as_override_cmd
);
14593 /* "neighbor remove-private-AS" commands. */
14594 install_element(BGP_NODE
, &neighbor_remove_private_as_hidden_cmd
);
14595 install_element(BGP_NODE
, &no_neighbor_remove_private_as_hidden_cmd
);
14596 install_element(BGP_NODE
, &neighbor_remove_private_as_all_hidden_cmd
);
14597 install_element(BGP_NODE
,
14598 &no_neighbor_remove_private_as_all_hidden_cmd
);
14599 install_element(BGP_NODE
,
14600 &neighbor_remove_private_as_replace_as_hidden_cmd
);
14601 install_element(BGP_NODE
,
14602 &no_neighbor_remove_private_as_replace_as_hidden_cmd
);
14603 install_element(BGP_NODE
,
14604 &neighbor_remove_private_as_all_replace_as_hidden_cmd
);
14607 &no_neighbor_remove_private_as_all_replace_as_hidden_cmd
);
14608 install_element(BGP_IPV4_NODE
, &neighbor_remove_private_as_cmd
);
14609 install_element(BGP_IPV4_NODE
, &no_neighbor_remove_private_as_cmd
);
14610 install_element(BGP_IPV4_NODE
, &neighbor_remove_private_as_all_cmd
);
14611 install_element(BGP_IPV4_NODE
, &no_neighbor_remove_private_as_all_cmd
);
14612 install_element(BGP_IPV4_NODE
,
14613 &neighbor_remove_private_as_replace_as_cmd
);
14614 install_element(BGP_IPV4_NODE
,
14615 &no_neighbor_remove_private_as_replace_as_cmd
);
14616 install_element(BGP_IPV4_NODE
,
14617 &neighbor_remove_private_as_all_replace_as_cmd
);
14618 install_element(BGP_IPV4_NODE
,
14619 &no_neighbor_remove_private_as_all_replace_as_cmd
);
14620 install_element(BGP_IPV4M_NODE
, &neighbor_remove_private_as_cmd
);
14621 install_element(BGP_IPV4M_NODE
, &no_neighbor_remove_private_as_cmd
);
14622 install_element(BGP_IPV4M_NODE
, &neighbor_remove_private_as_all_cmd
);
14623 install_element(BGP_IPV4M_NODE
, &no_neighbor_remove_private_as_all_cmd
);
14624 install_element(BGP_IPV4M_NODE
,
14625 &neighbor_remove_private_as_replace_as_cmd
);
14626 install_element(BGP_IPV4M_NODE
,
14627 &no_neighbor_remove_private_as_replace_as_cmd
);
14628 install_element(BGP_IPV4M_NODE
,
14629 &neighbor_remove_private_as_all_replace_as_cmd
);
14630 install_element(BGP_IPV4M_NODE
,
14631 &no_neighbor_remove_private_as_all_replace_as_cmd
);
14632 install_element(BGP_IPV4L_NODE
, &neighbor_remove_private_as_cmd
);
14633 install_element(BGP_IPV4L_NODE
, &no_neighbor_remove_private_as_cmd
);
14634 install_element(BGP_IPV4L_NODE
, &neighbor_remove_private_as_all_cmd
);
14635 install_element(BGP_IPV4L_NODE
, &no_neighbor_remove_private_as_all_cmd
);
14636 install_element(BGP_IPV4L_NODE
,
14637 &neighbor_remove_private_as_replace_as_cmd
);
14638 install_element(BGP_IPV4L_NODE
,
14639 &no_neighbor_remove_private_as_replace_as_cmd
);
14640 install_element(BGP_IPV4L_NODE
,
14641 &neighbor_remove_private_as_all_replace_as_cmd
);
14642 install_element(BGP_IPV4L_NODE
,
14643 &no_neighbor_remove_private_as_all_replace_as_cmd
);
14644 install_element(BGP_IPV6_NODE
, &neighbor_remove_private_as_cmd
);
14645 install_element(BGP_IPV6_NODE
, &no_neighbor_remove_private_as_cmd
);
14646 install_element(BGP_IPV6_NODE
, &neighbor_remove_private_as_all_cmd
);
14647 install_element(BGP_IPV6_NODE
, &no_neighbor_remove_private_as_all_cmd
);
14648 install_element(BGP_IPV6_NODE
,
14649 &neighbor_remove_private_as_replace_as_cmd
);
14650 install_element(BGP_IPV6_NODE
,
14651 &no_neighbor_remove_private_as_replace_as_cmd
);
14652 install_element(BGP_IPV6_NODE
,
14653 &neighbor_remove_private_as_all_replace_as_cmd
);
14654 install_element(BGP_IPV6_NODE
,
14655 &no_neighbor_remove_private_as_all_replace_as_cmd
);
14656 install_element(BGP_IPV6M_NODE
, &neighbor_remove_private_as_cmd
);
14657 install_element(BGP_IPV6M_NODE
, &no_neighbor_remove_private_as_cmd
);
14658 install_element(BGP_IPV6M_NODE
, &neighbor_remove_private_as_all_cmd
);
14659 install_element(BGP_IPV6M_NODE
, &no_neighbor_remove_private_as_all_cmd
);
14660 install_element(BGP_IPV6M_NODE
,
14661 &neighbor_remove_private_as_replace_as_cmd
);
14662 install_element(BGP_IPV6M_NODE
,
14663 &no_neighbor_remove_private_as_replace_as_cmd
);
14664 install_element(BGP_IPV6M_NODE
,
14665 &neighbor_remove_private_as_all_replace_as_cmd
);
14666 install_element(BGP_IPV6M_NODE
,
14667 &no_neighbor_remove_private_as_all_replace_as_cmd
);
14668 install_element(BGP_IPV6L_NODE
, &neighbor_remove_private_as_cmd
);
14669 install_element(BGP_IPV6L_NODE
, &no_neighbor_remove_private_as_cmd
);
14670 install_element(BGP_IPV6L_NODE
, &neighbor_remove_private_as_all_cmd
);
14671 install_element(BGP_IPV6L_NODE
, &no_neighbor_remove_private_as_all_cmd
);
14672 install_element(BGP_IPV6L_NODE
,
14673 &neighbor_remove_private_as_replace_as_cmd
);
14674 install_element(BGP_IPV6L_NODE
,
14675 &no_neighbor_remove_private_as_replace_as_cmd
);
14676 install_element(BGP_IPV6L_NODE
,
14677 &neighbor_remove_private_as_all_replace_as_cmd
);
14678 install_element(BGP_IPV6L_NODE
,
14679 &no_neighbor_remove_private_as_all_replace_as_cmd
);
14680 install_element(BGP_VPNV4_NODE
, &neighbor_remove_private_as_cmd
);
14681 install_element(BGP_VPNV4_NODE
, &no_neighbor_remove_private_as_cmd
);
14682 install_element(BGP_VPNV4_NODE
, &neighbor_remove_private_as_all_cmd
);
14683 install_element(BGP_VPNV4_NODE
, &no_neighbor_remove_private_as_all_cmd
);
14684 install_element(BGP_VPNV4_NODE
,
14685 &neighbor_remove_private_as_replace_as_cmd
);
14686 install_element(BGP_VPNV4_NODE
,
14687 &no_neighbor_remove_private_as_replace_as_cmd
);
14688 install_element(BGP_VPNV4_NODE
,
14689 &neighbor_remove_private_as_all_replace_as_cmd
);
14690 install_element(BGP_VPNV4_NODE
,
14691 &no_neighbor_remove_private_as_all_replace_as_cmd
);
14692 install_element(BGP_VPNV6_NODE
, &neighbor_remove_private_as_cmd
);
14693 install_element(BGP_VPNV6_NODE
, &no_neighbor_remove_private_as_cmd
);
14694 install_element(BGP_VPNV6_NODE
, &neighbor_remove_private_as_all_cmd
);
14695 install_element(BGP_VPNV6_NODE
, &no_neighbor_remove_private_as_all_cmd
);
14696 install_element(BGP_VPNV6_NODE
,
14697 &neighbor_remove_private_as_replace_as_cmd
);
14698 install_element(BGP_VPNV6_NODE
,
14699 &no_neighbor_remove_private_as_replace_as_cmd
);
14700 install_element(BGP_VPNV6_NODE
,
14701 &neighbor_remove_private_as_all_replace_as_cmd
);
14702 install_element(BGP_VPNV6_NODE
,
14703 &no_neighbor_remove_private_as_all_replace_as_cmd
);
14705 /* "neighbor send-community" commands.*/
14706 install_element(BGP_NODE
, &neighbor_send_community_hidden_cmd
);
14707 install_element(BGP_NODE
, &neighbor_send_community_type_hidden_cmd
);
14708 install_element(BGP_NODE
, &no_neighbor_send_community_hidden_cmd
);
14709 install_element(BGP_NODE
, &no_neighbor_send_community_type_hidden_cmd
);
14710 install_element(BGP_IPV4_NODE
, &neighbor_send_community_cmd
);
14711 install_element(BGP_IPV4_NODE
, &neighbor_send_community_type_cmd
);
14712 install_element(BGP_IPV4_NODE
, &no_neighbor_send_community_cmd
);
14713 install_element(BGP_IPV4_NODE
, &no_neighbor_send_community_type_cmd
);
14714 install_element(BGP_IPV4M_NODE
, &neighbor_send_community_cmd
);
14715 install_element(BGP_IPV4M_NODE
, &neighbor_send_community_type_cmd
);
14716 install_element(BGP_IPV4M_NODE
, &no_neighbor_send_community_cmd
);
14717 install_element(BGP_IPV4M_NODE
, &no_neighbor_send_community_type_cmd
);
14718 install_element(BGP_IPV4L_NODE
, &neighbor_send_community_cmd
);
14719 install_element(BGP_IPV4L_NODE
, &neighbor_send_community_type_cmd
);
14720 install_element(BGP_IPV4L_NODE
, &no_neighbor_send_community_cmd
);
14721 install_element(BGP_IPV4L_NODE
, &no_neighbor_send_community_type_cmd
);
14722 install_element(BGP_IPV6_NODE
, &neighbor_send_community_cmd
);
14723 install_element(BGP_IPV6_NODE
, &neighbor_send_community_type_cmd
);
14724 install_element(BGP_IPV6_NODE
, &no_neighbor_send_community_cmd
);
14725 install_element(BGP_IPV6_NODE
, &no_neighbor_send_community_type_cmd
);
14726 install_element(BGP_IPV6M_NODE
, &neighbor_send_community_cmd
);
14727 install_element(BGP_IPV6M_NODE
, &neighbor_send_community_type_cmd
);
14728 install_element(BGP_IPV6M_NODE
, &no_neighbor_send_community_cmd
);
14729 install_element(BGP_IPV6M_NODE
, &no_neighbor_send_community_type_cmd
);
14730 install_element(BGP_IPV6L_NODE
, &neighbor_send_community_cmd
);
14731 install_element(BGP_IPV6L_NODE
, &neighbor_send_community_type_cmd
);
14732 install_element(BGP_IPV6L_NODE
, &no_neighbor_send_community_cmd
);
14733 install_element(BGP_IPV6L_NODE
, &no_neighbor_send_community_type_cmd
);
14734 install_element(BGP_VPNV4_NODE
, &neighbor_send_community_cmd
);
14735 install_element(BGP_VPNV4_NODE
, &neighbor_send_community_type_cmd
);
14736 install_element(BGP_VPNV4_NODE
, &no_neighbor_send_community_cmd
);
14737 install_element(BGP_VPNV4_NODE
, &no_neighbor_send_community_type_cmd
);
14738 install_element(BGP_VPNV6_NODE
, &neighbor_send_community_cmd
);
14739 install_element(BGP_VPNV6_NODE
, &neighbor_send_community_type_cmd
);
14740 install_element(BGP_VPNV6_NODE
, &no_neighbor_send_community_cmd
);
14741 install_element(BGP_VPNV6_NODE
, &no_neighbor_send_community_type_cmd
);
14743 /* "neighbor route-reflector" commands.*/
14744 install_element(BGP_NODE
, &neighbor_route_reflector_client_hidden_cmd
);
14745 install_element(BGP_NODE
,
14746 &no_neighbor_route_reflector_client_hidden_cmd
);
14747 install_element(BGP_IPV4_NODE
, &neighbor_route_reflector_client_cmd
);
14748 install_element(BGP_IPV4_NODE
, &no_neighbor_route_reflector_client_cmd
);
14749 install_element(BGP_IPV4M_NODE
, &neighbor_route_reflector_client_cmd
);
14750 install_element(BGP_IPV4M_NODE
,
14751 &no_neighbor_route_reflector_client_cmd
);
14752 install_element(BGP_IPV4L_NODE
, &neighbor_route_reflector_client_cmd
);
14753 install_element(BGP_IPV4L_NODE
,
14754 &no_neighbor_route_reflector_client_cmd
);
14755 install_element(BGP_IPV6_NODE
, &neighbor_route_reflector_client_cmd
);
14756 install_element(BGP_IPV6_NODE
, &no_neighbor_route_reflector_client_cmd
);
14757 install_element(BGP_IPV6M_NODE
, &neighbor_route_reflector_client_cmd
);
14758 install_element(BGP_IPV6M_NODE
,
14759 &no_neighbor_route_reflector_client_cmd
);
14760 install_element(BGP_IPV6L_NODE
, &neighbor_route_reflector_client_cmd
);
14761 install_element(BGP_IPV6L_NODE
,
14762 &no_neighbor_route_reflector_client_cmd
);
14763 install_element(BGP_VPNV4_NODE
, &neighbor_route_reflector_client_cmd
);
14764 install_element(BGP_VPNV4_NODE
,
14765 &no_neighbor_route_reflector_client_cmd
);
14766 install_element(BGP_VPNV6_NODE
, &neighbor_route_reflector_client_cmd
);
14767 install_element(BGP_VPNV6_NODE
,
14768 &no_neighbor_route_reflector_client_cmd
);
14769 install_element(BGP_FLOWSPECV4_NODE
,
14770 &neighbor_route_reflector_client_cmd
);
14771 install_element(BGP_FLOWSPECV4_NODE
,
14772 &no_neighbor_route_reflector_client_cmd
);
14773 install_element(BGP_FLOWSPECV6_NODE
,
14774 &neighbor_route_reflector_client_cmd
);
14775 install_element(BGP_FLOWSPECV6_NODE
,
14776 &no_neighbor_route_reflector_client_cmd
);
14777 install_element(BGP_EVPN_NODE
, &neighbor_route_reflector_client_cmd
);
14778 install_element(BGP_EVPN_NODE
, &no_neighbor_route_reflector_client_cmd
);
14780 /* "neighbor route-server" commands.*/
14781 install_element(BGP_NODE
, &neighbor_route_server_client_hidden_cmd
);
14782 install_element(BGP_NODE
, &no_neighbor_route_server_client_hidden_cmd
);
14783 install_element(BGP_IPV4_NODE
, &neighbor_route_server_client_cmd
);
14784 install_element(BGP_IPV4_NODE
, &no_neighbor_route_server_client_cmd
);
14785 install_element(BGP_IPV4M_NODE
, &neighbor_route_server_client_cmd
);
14786 install_element(BGP_IPV4M_NODE
, &no_neighbor_route_server_client_cmd
);
14787 install_element(BGP_IPV4L_NODE
, &neighbor_route_server_client_cmd
);
14788 install_element(BGP_IPV4L_NODE
, &no_neighbor_route_server_client_cmd
);
14789 install_element(BGP_IPV6_NODE
, &neighbor_route_server_client_cmd
);
14790 install_element(BGP_IPV6_NODE
, &no_neighbor_route_server_client_cmd
);
14791 install_element(BGP_IPV6M_NODE
, &neighbor_route_server_client_cmd
);
14792 install_element(BGP_IPV6M_NODE
, &no_neighbor_route_server_client_cmd
);
14793 install_element(BGP_IPV6L_NODE
, &neighbor_route_server_client_cmd
);
14794 install_element(BGP_IPV6L_NODE
, &no_neighbor_route_server_client_cmd
);
14795 install_element(BGP_VPNV4_NODE
, &neighbor_route_server_client_cmd
);
14796 install_element(BGP_VPNV4_NODE
, &no_neighbor_route_server_client_cmd
);
14797 install_element(BGP_VPNV6_NODE
, &neighbor_route_server_client_cmd
);
14798 install_element(BGP_VPNV6_NODE
, &no_neighbor_route_server_client_cmd
);
14799 install_element(BGP_EVPN_NODE
, &neighbor_route_server_client_cmd
);
14800 install_element(BGP_EVPN_NODE
, &no_neighbor_route_server_client_cmd
);
14801 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_route_server_client_cmd
);
14802 install_element(BGP_FLOWSPECV4_NODE
,
14803 &no_neighbor_route_server_client_cmd
);
14804 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_route_server_client_cmd
);
14805 install_element(BGP_FLOWSPECV6_NODE
,
14806 &no_neighbor_route_server_client_cmd
);
14808 /* "neighbor addpath-tx-all-paths" commands.*/
14809 install_element(BGP_NODE
, &neighbor_addpath_tx_all_paths_hidden_cmd
);
14810 install_element(BGP_NODE
, &no_neighbor_addpath_tx_all_paths_hidden_cmd
);
14811 install_element(BGP_IPV4_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
14812 install_element(BGP_IPV4_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
14813 install_element(BGP_IPV4M_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
14814 install_element(BGP_IPV4M_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
14815 install_element(BGP_IPV4L_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
14816 install_element(BGP_IPV4L_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
14817 install_element(BGP_IPV6_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
14818 install_element(BGP_IPV6_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
14819 install_element(BGP_IPV6M_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
14820 install_element(BGP_IPV6M_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
14821 install_element(BGP_IPV6L_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
14822 install_element(BGP_IPV6L_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
14823 install_element(BGP_VPNV4_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
14824 install_element(BGP_VPNV4_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
14825 install_element(BGP_VPNV6_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
14826 install_element(BGP_VPNV6_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
14828 /* "neighbor addpath-tx-bestpath-per-AS" commands.*/
14829 install_element(BGP_NODE
,
14830 &neighbor_addpath_tx_bestpath_per_as_hidden_cmd
);
14831 install_element(BGP_NODE
,
14832 &no_neighbor_addpath_tx_bestpath_per_as_hidden_cmd
);
14833 install_element(BGP_IPV4_NODE
,
14834 &neighbor_addpath_tx_bestpath_per_as_cmd
);
14835 install_element(BGP_IPV4_NODE
,
14836 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
14837 install_element(BGP_IPV4M_NODE
,
14838 &neighbor_addpath_tx_bestpath_per_as_cmd
);
14839 install_element(BGP_IPV4M_NODE
,
14840 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
14841 install_element(BGP_IPV4L_NODE
,
14842 &neighbor_addpath_tx_bestpath_per_as_cmd
);
14843 install_element(BGP_IPV4L_NODE
,
14844 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
14845 install_element(BGP_IPV6_NODE
,
14846 &neighbor_addpath_tx_bestpath_per_as_cmd
);
14847 install_element(BGP_IPV6_NODE
,
14848 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
14849 install_element(BGP_IPV6M_NODE
,
14850 &neighbor_addpath_tx_bestpath_per_as_cmd
);
14851 install_element(BGP_IPV6M_NODE
,
14852 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
14853 install_element(BGP_IPV6L_NODE
,
14854 &neighbor_addpath_tx_bestpath_per_as_cmd
);
14855 install_element(BGP_IPV6L_NODE
,
14856 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
14857 install_element(BGP_VPNV4_NODE
,
14858 &neighbor_addpath_tx_bestpath_per_as_cmd
);
14859 install_element(BGP_VPNV4_NODE
,
14860 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
14861 install_element(BGP_VPNV6_NODE
,
14862 &neighbor_addpath_tx_bestpath_per_as_cmd
);
14863 install_element(BGP_VPNV6_NODE
,
14864 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
14866 /* "neighbor sender-as-path-loop-detection" commands. */
14867 install_element(BGP_NODE
, &neighbor_aspath_loop_detection_cmd
);
14868 install_element(BGP_NODE
, &no_neighbor_aspath_loop_detection_cmd
);
14870 /* "neighbor passive" commands. */
14871 install_element(BGP_NODE
, &neighbor_passive_cmd
);
14872 install_element(BGP_NODE
, &no_neighbor_passive_cmd
);
14875 /* "neighbor shutdown" commands. */
14876 install_element(BGP_NODE
, &neighbor_shutdown_cmd
);
14877 install_element(BGP_NODE
, &no_neighbor_shutdown_cmd
);
14878 install_element(BGP_NODE
, &neighbor_shutdown_msg_cmd
);
14879 install_element(BGP_NODE
, &no_neighbor_shutdown_msg_cmd
);
14881 /* "neighbor capability extended-nexthop" commands.*/
14882 install_element(BGP_NODE
, &neighbor_capability_enhe_cmd
);
14883 install_element(BGP_NODE
, &no_neighbor_capability_enhe_cmd
);
14885 /* "neighbor capability orf prefix-list" commands.*/
14886 install_element(BGP_NODE
, &neighbor_capability_orf_prefix_hidden_cmd
);
14887 install_element(BGP_NODE
,
14888 &no_neighbor_capability_orf_prefix_hidden_cmd
);
14889 install_element(BGP_IPV4_NODE
, &neighbor_capability_orf_prefix_cmd
);
14890 install_element(BGP_IPV4_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
14891 install_element(BGP_IPV4M_NODE
, &neighbor_capability_orf_prefix_cmd
);
14892 install_element(BGP_IPV4M_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
14893 install_element(BGP_IPV4L_NODE
, &neighbor_capability_orf_prefix_cmd
);
14894 install_element(BGP_IPV4L_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
14895 install_element(BGP_IPV6_NODE
, &neighbor_capability_orf_prefix_cmd
);
14896 install_element(BGP_IPV6_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
14897 install_element(BGP_IPV6M_NODE
, &neighbor_capability_orf_prefix_cmd
);
14898 install_element(BGP_IPV6M_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
14899 install_element(BGP_IPV6L_NODE
, &neighbor_capability_orf_prefix_cmd
);
14900 install_element(BGP_IPV6L_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
14902 /* "neighbor capability dynamic" commands.*/
14903 install_element(BGP_NODE
, &neighbor_capability_dynamic_cmd
);
14904 install_element(BGP_NODE
, &no_neighbor_capability_dynamic_cmd
);
14906 /* "neighbor dont-capability-negotiate" commands. */
14907 install_element(BGP_NODE
, &neighbor_dont_capability_negotiate_cmd
);
14908 install_element(BGP_NODE
, &no_neighbor_dont_capability_negotiate_cmd
);
14910 /* "neighbor ebgp-multihop" commands. */
14911 install_element(BGP_NODE
, &neighbor_ebgp_multihop_cmd
);
14912 install_element(BGP_NODE
, &neighbor_ebgp_multihop_ttl_cmd
);
14913 install_element(BGP_NODE
, &no_neighbor_ebgp_multihop_cmd
);
14915 /* "neighbor disable-connected-check" commands. */
14916 install_element(BGP_NODE
, &neighbor_disable_connected_check_cmd
);
14917 install_element(BGP_NODE
, &no_neighbor_disable_connected_check_cmd
);
14919 /* "neighbor enforce-first-as" commands. */
14920 install_element(BGP_NODE
, &neighbor_enforce_first_as_cmd
);
14921 install_element(BGP_NODE
, &no_neighbor_enforce_first_as_cmd
);
14923 /* "neighbor description" commands. */
14924 install_element(BGP_NODE
, &neighbor_description_cmd
);
14925 install_element(BGP_NODE
, &no_neighbor_description_cmd
);
14926 install_element(BGP_NODE
, &no_neighbor_description_comment_cmd
);
14928 /* "neighbor update-source" commands. "*/
14929 install_element(BGP_NODE
, &neighbor_update_source_cmd
);
14930 install_element(BGP_NODE
, &no_neighbor_update_source_cmd
);
14932 /* "neighbor default-originate" commands. */
14933 install_element(BGP_NODE
, &neighbor_default_originate_hidden_cmd
);
14934 install_element(BGP_NODE
, &neighbor_default_originate_rmap_hidden_cmd
);
14935 install_element(BGP_NODE
, &no_neighbor_default_originate_hidden_cmd
);
14936 install_element(BGP_IPV4_NODE
, &neighbor_default_originate_cmd
);
14937 install_element(BGP_IPV4_NODE
, &neighbor_default_originate_rmap_cmd
);
14938 install_element(BGP_IPV4_NODE
, &no_neighbor_default_originate_cmd
);
14939 install_element(BGP_IPV4M_NODE
, &neighbor_default_originate_cmd
);
14940 install_element(BGP_IPV4M_NODE
, &neighbor_default_originate_rmap_cmd
);
14941 install_element(BGP_IPV4M_NODE
, &no_neighbor_default_originate_cmd
);
14942 install_element(BGP_IPV4L_NODE
, &neighbor_default_originate_cmd
);
14943 install_element(BGP_IPV4L_NODE
, &neighbor_default_originate_rmap_cmd
);
14944 install_element(BGP_IPV4L_NODE
, &no_neighbor_default_originate_cmd
);
14945 install_element(BGP_IPV6_NODE
, &neighbor_default_originate_cmd
);
14946 install_element(BGP_IPV6_NODE
, &neighbor_default_originate_rmap_cmd
);
14947 install_element(BGP_IPV6_NODE
, &no_neighbor_default_originate_cmd
);
14948 install_element(BGP_IPV6M_NODE
, &neighbor_default_originate_cmd
);
14949 install_element(BGP_IPV6M_NODE
, &neighbor_default_originate_rmap_cmd
);
14950 install_element(BGP_IPV6M_NODE
, &no_neighbor_default_originate_cmd
);
14951 install_element(BGP_IPV6L_NODE
, &neighbor_default_originate_cmd
);
14952 install_element(BGP_IPV6L_NODE
, &neighbor_default_originate_rmap_cmd
);
14953 install_element(BGP_IPV6L_NODE
, &no_neighbor_default_originate_cmd
);
14955 /* "neighbor port" commands. */
14956 install_element(BGP_NODE
, &neighbor_port_cmd
);
14957 install_element(BGP_NODE
, &no_neighbor_port_cmd
);
14959 /* "neighbor weight" commands. */
14960 install_element(BGP_NODE
, &neighbor_weight_hidden_cmd
);
14961 install_element(BGP_NODE
, &no_neighbor_weight_hidden_cmd
);
14963 install_element(BGP_IPV4_NODE
, &neighbor_weight_cmd
);
14964 install_element(BGP_IPV4_NODE
, &no_neighbor_weight_cmd
);
14965 install_element(BGP_IPV4M_NODE
, &neighbor_weight_cmd
);
14966 install_element(BGP_IPV4M_NODE
, &no_neighbor_weight_cmd
);
14967 install_element(BGP_IPV4L_NODE
, &neighbor_weight_cmd
);
14968 install_element(BGP_IPV4L_NODE
, &no_neighbor_weight_cmd
);
14969 install_element(BGP_IPV6_NODE
, &neighbor_weight_cmd
);
14970 install_element(BGP_IPV6_NODE
, &no_neighbor_weight_cmd
);
14971 install_element(BGP_IPV6M_NODE
, &neighbor_weight_cmd
);
14972 install_element(BGP_IPV6M_NODE
, &no_neighbor_weight_cmd
);
14973 install_element(BGP_IPV6L_NODE
, &neighbor_weight_cmd
);
14974 install_element(BGP_IPV6L_NODE
, &no_neighbor_weight_cmd
);
14975 install_element(BGP_VPNV4_NODE
, &neighbor_weight_cmd
);
14976 install_element(BGP_VPNV4_NODE
, &no_neighbor_weight_cmd
);
14977 install_element(BGP_VPNV6_NODE
, &neighbor_weight_cmd
);
14978 install_element(BGP_VPNV6_NODE
, &no_neighbor_weight_cmd
);
14980 /* "neighbor override-capability" commands. */
14981 install_element(BGP_NODE
, &neighbor_override_capability_cmd
);
14982 install_element(BGP_NODE
, &no_neighbor_override_capability_cmd
);
14984 /* "neighbor strict-capability-match" commands. */
14985 install_element(BGP_NODE
, &neighbor_strict_capability_cmd
);
14986 install_element(BGP_NODE
, &no_neighbor_strict_capability_cmd
);
14988 /* "neighbor timers" commands. */
14989 install_element(BGP_NODE
, &neighbor_timers_cmd
);
14990 install_element(BGP_NODE
, &no_neighbor_timers_cmd
);
14992 /* "neighbor timers connect" commands. */
14993 install_element(BGP_NODE
, &neighbor_timers_connect_cmd
);
14994 install_element(BGP_NODE
, &no_neighbor_timers_connect_cmd
);
14996 /* "neighbor advertisement-interval" commands. */
14997 install_element(BGP_NODE
, &neighbor_advertise_interval_cmd
);
14998 install_element(BGP_NODE
, &no_neighbor_advertise_interval_cmd
);
15000 /* "neighbor interface" commands. */
15001 install_element(BGP_NODE
, &neighbor_interface_cmd
);
15002 install_element(BGP_NODE
, &no_neighbor_interface_cmd
);
15004 /* "neighbor distribute" commands. */
15005 install_element(BGP_NODE
, &neighbor_distribute_list_hidden_cmd
);
15006 install_element(BGP_NODE
, &no_neighbor_distribute_list_hidden_cmd
);
15007 install_element(BGP_IPV4_NODE
, &neighbor_distribute_list_cmd
);
15008 install_element(BGP_IPV4_NODE
, &no_neighbor_distribute_list_cmd
);
15009 install_element(BGP_IPV4M_NODE
, &neighbor_distribute_list_cmd
);
15010 install_element(BGP_IPV4M_NODE
, &no_neighbor_distribute_list_cmd
);
15011 install_element(BGP_IPV4L_NODE
, &neighbor_distribute_list_cmd
);
15012 install_element(BGP_IPV4L_NODE
, &no_neighbor_distribute_list_cmd
);
15013 install_element(BGP_IPV6_NODE
, &neighbor_distribute_list_cmd
);
15014 install_element(BGP_IPV6_NODE
, &no_neighbor_distribute_list_cmd
);
15015 install_element(BGP_IPV6M_NODE
, &neighbor_distribute_list_cmd
);
15016 install_element(BGP_IPV6M_NODE
, &no_neighbor_distribute_list_cmd
);
15017 install_element(BGP_IPV6L_NODE
, &neighbor_distribute_list_cmd
);
15018 install_element(BGP_IPV6L_NODE
, &no_neighbor_distribute_list_cmd
);
15019 install_element(BGP_VPNV4_NODE
, &neighbor_distribute_list_cmd
);
15020 install_element(BGP_VPNV4_NODE
, &no_neighbor_distribute_list_cmd
);
15021 install_element(BGP_VPNV6_NODE
, &neighbor_distribute_list_cmd
);
15022 install_element(BGP_VPNV6_NODE
, &no_neighbor_distribute_list_cmd
);
15024 /* "neighbor prefix-list" commands. */
15025 install_element(BGP_NODE
, &neighbor_prefix_list_hidden_cmd
);
15026 install_element(BGP_NODE
, &no_neighbor_prefix_list_hidden_cmd
);
15027 install_element(BGP_IPV4_NODE
, &neighbor_prefix_list_cmd
);
15028 install_element(BGP_IPV4_NODE
, &no_neighbor_prefix_list_cmd
);
15029 install_element(BGP_IPV4M_NODE
, &neighbor_prefix_list_cmd
);
15030 install_element(BGP_IPV4M_NODE
, &no_neighbor_prefix_list_cmd
);
15031 install_element(BGP_IPV4L_NODE
, &neighbor_prefix_list_cmd
);
15032 install_element(BGP_IPV4L_NODE
, &no_neighbor_prefix_list_cmd
);
15033 install_element(BGP_IPV6_NODE
, &neighbor_prefix_list_cmd
);
15034 install_element(BGP_IPV6_NODE
, &no_neighbor_prefix_list_cmd
);
15035 install_element(BGP_IPV6M_NODE
, &neighbor_prefix_list_cmd
);
15036 install_element(BGP_IPV6M_NODE
, &no_neighbor_prefix_list_cmd
);
15037 install_element(BGP_IPV6L_NODE
, &neighbor_prefix_list_cmd
);
15038 install_element(BGP_IPV6L_NODE
, &no_neighbor_prefix_list_cmd
);
15039 install_element(BGP_VPNV4_NODE
, &neighbor_prefix_list_cmd
);
15040 install_element(BGP_VPNV4_NODE
, &no_neighbor_prefix_list_cmd
);
15041 install_element(BGP_VPNV6_NODE
, &neighbor_prefix_list_cmd
);
15042 install_element(BGP_VPNV6_NODE
, &no_neighbor_prefix_list_cmd
);
15043 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_prefix_list_cmd
);
15044 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_prefix_list_cmd
);
15045 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_prefix_list_cmd
);
15046 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_prefix_list_cmd
);
15048 /* "neighbor filter-list" commands. */
15049 install_element(BGP_NODE
, &neighbor_filter_list_hidden_cmd
);
15050 install_element(BGP_NODE
, &no_neighbor_filter_list_hidden_cmd
);
15051 install_element(BGP_IPV4_NODE
, &neighbor_filter_list_cmd
);
15052 install_element(BGP_IPV4_NODE
, &no_neighbor_filter_list_cmd
);
15053 install_element(BGP_IPV4M_NODE
, &neighbor_filter_list_cmd
);
15054 install_element(BGP_IPV4M_NODE
, &no_neighbor_filter_list_cmd
);
15055 install_element(BGP_IPV4L_NODE
, &neighbor_filter_list_cmd
);
15056 install_element(BGP_IPV4L_NODE
, &no_neighbor_filter_list_cmd
);
15057 install_element(BGP_IPV6_NODE
, &neighbor_filter_list_cmd
);
15058 install_element(BGP_IPV6_NODE
, &no_neighbor_filter_list_cmd
);
15059 install_element(BGP_IPV6M_NODE
, &neighbor_filter_list_cmd
);
15060 install_element(BGP_IPV6M_NODE
, &no_neighbor_filter_list_cmd
);
15061 install_element(BGP_IPV6L_NODE
, &neighbor_filter_list_cmd
);
15062 install_element(BGP_IPV6L_NODE
, &no_neighbor_filter_list_cmd
);
15063 install_element(BGP_VPNV4_NODE
, &neighbor_filter_list_cmd
);
15064 install_element(BGP_VPNV4_NODE
, &no_neighbor_filter_list_cmd
);
15065 install_element(BGP_VPNV6_NODE
, &neighbor_filter_list_cmd
);
15066 install_element(BGP_VPNV6_NODE
, &no_neighbor_filter_list_cmd
);
15067 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_filter_list_cmd
);
15068 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_filter_list_cmd
);
15069 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_filter_list_cmd
);
15070 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_filter_list_cmd
);
15072 /* "neighbor route-map" commands. */
15073 install_element(BGP_NODE
, &neighbor_route_map_hidden_cmd
);
15074 install_element(BGP_NODE
, &no_neighbor_route_map_hidden_cmd
);
15075 install_element(BGP_IPV4_NODE
, &neighbor_route_map_cmd
);
15076 install_element(BGP_IPV4_NODE
, &no_neighbor_route_map_cmd
);
15077 install_element(BGP_IPV4M_NODE
, &neighbor_route_map_cmd
);
15078 install_element(BGP_IPV4M_NODE
, &no_neighbor_route_map_cmd
);
15079 install_element(BGP_IPV4L_NODE
, &neighbor_route_map_cmd
);
15080 install_element(BGP_IPV4L_NODE
, &no_neighbor_route_map_cmd
);
15081 install_element(BGP_IPV6_NODE
, &neighbor_route_map_cmd
);
15082 install_element(BGP_IPV6_NODE
, &no_neighbor_route_map_cmd
);
15083 install_element(BGP_IPV6M_NODE
, &neighbor_route_map_cmd
);
15084 install_element(BGP_IPV6M_NODE
, &no_neighbor_route_map_cmd
);
15085 install_element(BGP_IPV6L_NODE
, &neighbor_route_map_cmd
);
15086 install_element(BGP_IPV6L_NODE
, &no_neighbor_route_map_cmd
);
15087 install_element(BGP_VPNV4_NODE
, &neighbor_route_map_cmd
);
15088 install_element(BGP_VPNV4_NODE
, &no_neighbor_route_map_cmd
);
15089 install_element(BGP_VPNV6_NODE
, &neighbor_route_map_cmd
);
15090 install_element(BGP_VPNV6_NODE
, &no_neighbor_route_map_cmd
);
15091 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_route_map_cmd
);
15092 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_route_map_cmd
);
15093 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_route_map_cmd
);
15094 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_route_map_cmd
);
15095 install_element(BGP_EVPN_NODE
, &neighbor_route_map_cmd
);
15096 install_element(BGP_EVPN_NODE
, &no_neighbor_route_map_cmd
);
15098 /* "neighbor unsuppress-map" commands. */
15099 install_element(BGP_NODE
, &neighbor_unsuppress_map_hidden_cmd
);
15100 install_element(BGP_NODE
, &no_neighbor_unsuppress_map_hidden_cmd
);
15101 install_element(BGP_IPV4_NODE
, &neighbor_unsuppress_map_cmd
);
15102 install_element(BGP_IPV4_NODE
, &no_neighbor_unsuppress_map_cmd
);
15103 install_element(BGP_IPV4M_NODE
, &neighbor_unsuppress_map_cmd
);
15104 install_element(BGP_IPV4M_NODE
, &no_neighbor_unsuppress_map_cmd
);
15105 install_element(BGP_IPV4L_NODE
, &neighbor_unsuppress_map_cmd
);
15106 install_element(BGP_IPV4L_NODE
, &no_neighbor_unsuppress_map_cmd
);
15107 install_element(BGP_IPV6_NODE
, &neighbor_unsuppress_map_cmd
);
15108 install_element(BGP_IPV6_NODE
, &no_neighbor_unsuppress_map_cmd
);
15109 install_element(BGP_IPV6M_NODE
, &neighbor_unsuppress_map_cmd
);
15110 install_element(BGP_IPV6M_NODE
, &no_neighbor_unsuppress_map_cmd
);
15111 install_element(BGP_IPV6L_NODE
, &neighbor_unsuppress_map_cmd
);
15112 install_element(BGP_IPV6L_NODE
, &no_neighbor_unsuppress_map_cmd
);
15113 install_element(BGP_VPNV4_NODE
, &neighbor_unsuppress_map_cmd
);
15114 install_element(BGP_VPNV4_NODE
, &no_neighbor_unsuppress_map_cmd
);
15115 install_element(BGP_VPNV6_NODE
, &neighbor_unsuppress_map_cmd
);
15116 install_element(BGP_VPNV6_NODE
, &no_neighbor_unsuppress_map_cmd
);
15118 /* "neighbor maximum-prefix" commands. */
15119 install_element(BGP_NODE
, &neighbor_maximum_prefix_hidden_cmd
);
15120 install_element(BGP_NODE
,
15121 &neighbor_maximum_prefix_threshold_hidden_cmd
);
15122 install_element(BGP_NODE
, &neighbor_maximum_prefix_warning_hidden_cmd
);
15123 install_element(BGP_NODE
,
15124 &neighbor_maximum_prefix_threshold_warning_hidden_cmd
);
15125 install_element(BGP_NODE
, &neighbor_maximum_prefix_restart_hidden_cmd
);
15126 install_element(BGP_NODE
,
15127 &neighbor_maximum_prefix_threshold_restart_hidden_cmd
);
15128 install_element(BGP_NODE
, &no_neighbor_maximum_prefix_hidden_cmd
);
15129 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_cmd
);
15130 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
15131 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_warning_cmd
);
15132 install_element(BGP_IPV4_NODE
,
15133 &neighbor_maximum_prefix_threshold_warning_cmd
);
15134 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_restart_cmd
);
15135 install_element(BGP_IPV4_NODE
,
15136 &neighbor_maximum_prefix_threshold_restart_cmd
);
15137 install_element(BGP_IPV4_NODE
, &no_neighbor_maximum_prefix_cmd
);
15138 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_cmd
);
15139 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
15140 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_warning_cmd
);
15141 install_element(BGP_IPV4M_NODE
,
15142 &neighbor_maximum_prefix_threshold_warning_cmd
);
15143 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_restart_cmd
);
15144 install_element(BGP_IPV4M_NODE
,
15145 &neighbor_maximum_prefix_threshold_restart_cmd
);
15146 install_element(BGP_IPV4M_NODE
, &no_neighbor_maximum_prefix_cmd
);
15147 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_cmd
);
15148 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
15149 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_warning_cmd
);
15150 install_element(BGP_IPV4L_NODE
,
15151 &neighbor_maximum_prefix_threshold_warning_cmd
);
15152 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_restart_cmd
);
15153 install_element(BGP_IPV4L_NODE
,
15154 &neighbor_maximum_prefix_threshold_restart_cmd
);
15155 install_element(BGP_IPV4L_NODE
, &no_neighbor_maximum_prefix_cmd
);
15156 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_cmd
);
15157 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
15158 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_warning_cmd
);
15159 install_element(BGP_IPV6_NODE
,
15160 &neighbor_maximum_prefix_threshold_warning_cmd
);
15161 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_restart_cmd
);
15162 install_element(BGP_IPV6_NODE
,
15163 &neighbor_maximum_prefix_threshold_restart_cmd
);
15164 install_element(BGP_IPV6_NODE
, &no_neighbor_maximum_prefix_cmd
);
15165 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_cmd
);
15166 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
15167 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_warning_cmd
);
15168 install_element(BGP_IPV6M_NODE
,
15169 &neighbor_maximum_prefix_threshold_warning_cmd
);
15170 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_restart_cmd
);
15171 install_element(BGP_IPV6M_NODE
,
15172 &neighbor_maximum_prefix_threshold_restart_cmd
);
15173 install_element(BGP_IPV6M_NODE
, &no_neighbor_maximum_prefix_cmd
);
15174 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_cmd
);
15175 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
15176 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_warning_cmd
);
15177 install_element(BGP_IPV6L_NODE
,
15178 &neighbor_maximum_prefix_threshold_warning_cmd
);
15179 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_restart_cmd
);
15180 install_element(BGP_IPV6L_NODE
,
15181 &neighbor_maximum_prefix_threshold_restart_cmd
);
15182 install_element(BGP_IPV6L_NODE
, &no_neighbor_maximum_prefix_cmd
);
15183 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_cmd
);
15184 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
15185 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_warning_cmd
);
15186 install_element(BGP_VPNV4_NODE
,
15187 &neighbor_maximum_prefix_threshold_warning_cmd
);
15188 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_restart_cmd
);
15189 install_element(BGP_VPNV4_NODE
,
15190 &neighbor_maximum_prefix_threshold_restart_cmd
);
15191 install_element(BGP_VPNV4_NODE
, &no_neighbor_maximum_prefix_cmd
);
15192 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_cmd
);
15193 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
15194 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_warning_cmd
);
15195 install_element(BGP_VPNV6_NODE
,
15196 &neighbor_maximum_prefix_threshold_warning_cmd
);
15197 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_restart_cmd
);
15198 install_element(BGP_VPNV6_NODE
,
15199 &neighbor_maximum_prefix_threshold_restart_cmd
);
15200 install_element(BGP_VPNV6_NODE
, &no_neighbor_maximum_prefix_cmd
);
15202 /* "neighbor allowas-in" */
15203 install_element(BGP_NODE
, &neighbor_allowas_in_hidden_cmd
);
15204 install_element(BGP_NODE
, &no_neighbor_allowas_in_hidden_cmd
);
15205 install_element(BGP_IPV4_NODE
, &neighbor_allowas_in_cmd
);
15206 install_element(BGP_IPV4_NODE
, &no_neighbor_allowas_in_cmd
);
15207 install_element(BGP_IPV4M_NODE
, &neighbor_allowas_in_cmd
);
15208 install_element(BGP_IPV4M_NODE
, &no_neighbor_allowas_in_cmd
);
15209 install_element(BGP_IPV4L_NODE
, &neighbor_allowas_in_cmd
);
15210 install_element(BGP_IPV4L_NODE
, &no_neighbor_allowas_in_cmd
);
15211 install_element(BGP_IPV6_NODE
, &neighbor_allowas_in_cmd
);
15212 install_element(BGP_IPV6_NODE
, &no_neighbor_allowas_in_cmd
);
15213 install_element(BGP_IPV6M_NODE
, &neighbor_allowas_in_cmd
);
15214 install_element(BGP_IPV6M_NODE
, &no_neighbor_allowas_in_cmd
);
15215 install_element(BGP_IPV6L_NODE
, &neighbor_allowas_in_cmd
);
15216 install_element(BGP_IPV6L_NODE
, &no_neighbor_allowas_in_cmd
);
15217 install_element(BGP_VPNV4_NODE
, &neighbor_allowas_in_cmd
);
15218 install_element(BGP_VPNV4_NODE
, &no_neighbor_allowas_in_cmd
);
15219 install_element(BGP_VPNV6_NODE
, &neighbor_allowas_in_cmd
);
15220 install_element(BGP_VPNV6_NODE
, &no_neighbor_allowas_in_cmd
);
15221 install_element(BGP_EVPN_NODE
, &neighbor_allowas_in_cmd
);
15222 install_element(BGP_EVPN_NODE
, &no_neighbor_allowas_in_cmd
);
15224 /* address-family commands. */
15225 install_element(BGP_NODE
, &address_family_ipv4_safi_cmd
);
15226 install_element(BGP_NODE
, &address_family_ipv6_safi_cmd
);
15227 #ifdef KEEP_OLD_VPN_COMMANDS
15228 install_element(BGP_NODE
, &address_family_vpnv4_cmd
);
15229 install_element(BGP_NODE
, &address_family_vpnv6_cmd
);
15230 #endif /* KEEP_OLD_VPN_COMMANDS */
15232 install_element(BGP_NODE
, &address_family_evpn_cmd
);
15234 /* "exit-address-family" command. */
15235 install_element(BGP_IPV4_NODE
, &exit_address_family_cmd
);
15236 install_element(BGP_IPV4M_NODE
, &exit_address_family_cmd
);
15237 install_element(BGP_IPV4L_NODE
, &exit_address_family_cmd
);
15238 install_element(BGP_IPV6_NODE
, &exit_address_family_cmd
);
15239 install_element(BGP_IPV6M_NODE
, &exit_address_family_cmd
);
15240 install_element(BGP_IPV6L_NODE
, &exit_address_family_cmd
);
15241 install_element(BGP_VPNV4_NODE
, &exit_address_family_cmd
);
15242 install_element(BGP_VPNV6_NODE
, &exit_address_family_cmd
);
15243 install_element(BGP_FLOWSPECV4_NODE
, &exit_address_family_cmd
);
15244 install_element(BGP_FLOWSPECV6_NODE
, &exit_address_family_cmd
);
15245 install_element(BGP_EVPN_NODE
, &exit_address_family_cmd
);
15247 /* "clear ip bgp commands" */
15248 install_element(ENABLE_NODE
, &clear_ip_bgp_all_cmd
);
15250 /* clear ip bgp prefix */
15251 install_element(ENABLE_NODE
, &clear_ip_bgp_prefix_cmd
);
15252 install_element(ENABLE_NODE
, &clear_bgp_ipv6_safi_prefix_cmd
);
15253 install_element(ENABLE_NODE
, &clear_bgp_instance_ipv6_safi_prefix_cmd
);
15255 /* "show [ip] bgp summary" commands. */
15256 install_element(VIEW_NODE
, &show_bgp_instance_all_ipv6_updgrps_cmd
);
15257 install_element(VIEW_NODE
, &show_bgp_l2vpn_evpn_updgrps_cmd
);
15258 install_element(VIEW_NODE
, &show_bgp_instance_updgrps_stats_cmd
);
15259 install_element(VIEW_NODE
, &show_bgp_updgrps_stats_cmd
);
15260 install_element(VIEW_NODE
, &show_ip_bgp_instance_updgrps_adj_s_cmd
);
15261 install_element(VIEW_NODE
, &show_ip_bgp_summary_cmd
);
15262 install_element(VIEW_NODE
, &show_ip_bgp_updgrps_cmd
);
15264 /* "show [ip] bgp neighbors" commands. */
15265 install_element(VIEW_NODE
, &show_ip_bgp_neighbors_cmd
);
15267 /* "show [ip] bgp peer-group" commands. */
15268 install_element(VIEW_NODE
, &show_ip_bgp_peer_groups_cmd
);
15270 /* "show [ip] bgp paths" commands. */
15271 install_element(VIEW_NODE
, &show_ip_bgp_paths_cmd
);
15273 /* "show [ip] bgp community" commands. */
15274 install_element(VIEW_NODE
, &show_ip_bgp_community_info_cmd
);
15276 /* "show ip bgp large-community" commands. */
15277 install_element(VIEW_NODE
, &show_ip_bgp_lcommunity_info_cmd
);
15278 /* "show [ip] bgp attribute-info" commands. */
15279 install_element(VIEW_NODE
, &show_ip_bgp_attr_info_cmd
);
15280 /* "show [ip] bgp route-leak" command */
15281 install_element(VIEW_NODE
, &show_ip_bgp_route_leak_cmd
);
15283 /* "redistribute" commands. */
15284 install_element(BGP_NODE
, &bgp_redistribute_ipv4_hidden_cmd
);
15285 install_element(BGP_NODE
, &no_bgp_redistribute_ipv4_hidden_cmd
);
15286 install_element(BGP_NODE
, &bgp_redistribute_ipv4_rmap_hidden_cmd
);
15287 install_element(BGP_NODE
, &bgp_redistribute_ipv4_metric_hidden_cmd
);
15288 install_element(BGP_NODE
,
15289 &bgp_redistribute_ipv4_rmap_metric_hidden_cmd
);
15290 install_element(BGP_NODE
,
15291 &bgp_redistribute_ipv4_metric_rmap_hidden_cmd
);
15292 install_element(BGP_NODE
, &bgp_redistribute_ipv4_ospf_hidden_cmd
);
15293 install_element(BGP_NODE
, &no_bgp_redistribute_ipv4_ospf_hidden_cmd
);
15294 install_element(BGP_NODE
, &bgp_redistribute_ipv4_ospf_rmap_hidden_cmd
);
15295 install_element(BGP_NODE
,
15296 &bgp_redistribute_ipv4_ospf_metric_hidden_cmd
);
15297 install_element(BGP_NODE
,
15298 &bgp_redistribute_ipv4_ospf_rmap_metric_hidden_cmd
);
15299 install_element(BGP_NODE
,
15300 &bgp_redistribute_ipv4_ospf_metric_rmap_hidden_cmd
);
15301 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_cmd
);
15302 install_element(BGP_IPV4_NODE
, &no_bgp_redistribute_ipv4_cmd
);
15303 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_rmap_cmd
);
15304 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_metric_cmd
);
15305 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_rmap_metric_cmd
);
15306 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_metric_rmap_cmd
);
15307 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_ospf_cmd
);
15308 install_element(BGP_IPV4_NODE
, &no_bgp_redistribute_ipv4_ospf_cmd
);
15309 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_ospf_rmap_cmd
);
15310 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_ospf_metric_cmd
);
15311 install_element(BGP_IPV4_NODE
,
15312 &bgp_redistribute_ipv4_ospf_rmap_metric_cmd
);
15313 install_element(BGP_IPV4_NODE
,
15314 &bgp_redistribute_ipv4_ospf_metric_rmap_cmd
);
15315 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_cmd
);
15316 install_element(BGP_IPV6_NODE
, &no_bgp_redistribute_ipv6_cmd
);
15317 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_rmap_cmd
);
15318 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_metric_cmd
);
15319 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_rmap_metric_cmd
);
15320 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_metric_rmap_cmd
);
15322 /* import|export vpn [route-map WORD] */
15323 install_element(BGP_IPV4_NODE
, &bgp_imexport_vpn_cmd
);
15324 install_element(BGP_IPV6_NODE
, &bgp_imexport_vpn_cmd
);
15326 install_element(BGP_IPV4_NODE
, &bgp_imexport_vrf_cmd
);
15327 install_element(BGP_IPV6_NODE
, &bgp_imexport_vrf_cmd
);
15329 /* ttl_security commands */
15330 install_element(BGP_NODE
, &neighbor_ttl_security_cmd
);
15331 install_element(BGP_NODE
, &no_neighbor_ttl_security_cmd
);
15333 /* "show [ip] bgp memory" commands. */
15334 install_element(VIEW_NODE
, &show_bgp_memory_cmd
);
15336 /* "show bgp martian next-hop" */
15337 install_element(VIEW_NODE
, &show_bgp_martian_nexthop_db_cmd
);
15339 install_element(VIEW_NODE
, &show_bgp_mac_hash_cmd
);
15341 /* "show [ip] bgp views" commands. */
15342 install_element(VIEW_NODE
, &show_bgp_views_cmd
);
15344 /* "show [ip] bgp vrfs" commands. */
15345 install_element(VIEW_NODE
, &show_bgp_vrfs_cmd
);
15347 /* Community-list. */
15348 community_list_vty();
15350 /* vpn-policy commands */
15351 install_element(BGP_IPV4_NODE
, &af_rd_vpn_export_cmd
);
15352 install_element(BGP_IPV6_NODE
, &af_rd_vpn_export_cmd
);
15353 install_element(BGP_IPV4_NODE
, &af_label_vpn_export_cmd
);
15354 install_element(BGP_IPV6_NODE
, &af_label_vpn_export_cmd
);
15355 install_element(BGP_IPV4_NODE
, &af_nexthop_vpn_export_cmd
);
15356 install_element(BGP_IPV6_NODE
, &af_nexthop_vpn_export_cmd
);
15357 install_element(BGP_IPV4_NODE
, &af_rt_vpn_imexport_cmd
);
15358 install_element(BGP_IPV6_NODE
, &af_rt_vpn_imexport_cmd
);
15359 install_element(BGP_IPV4_NODE
, &af_route_map_vpn_imexport_cmd
);
15360 install_element(BGP_IPV6_NODE
, &af_route_map_vpn_imexport_cmd
);
15361 install_element(BGP_IPV4_NODE
, &af_import_vrf_route_map_cmd
);
15362 install_element(BGP_IPV6_NODE
, &af_import_vrf_route_map_cmd
);
15364 install_element(BGP_IPV4_NODE
, &af_routetarget_import_cmd
);
15365 install_element(BGP_IPV6_NODE
, &af_routetarget_import_cmd
);
15367 install_element(BGP_IPV4_NODE
, &af_no_rd_vpn_export_cmd
);
15368 install_element(BGP_IPV6_NODE
, &af_no_rd_vpn_export_cmd
);
15369 install_element(BGP_IPV4_NODE
, &af_no_label_vpn_export_cmd
);
15370 install_element(BGP_IPV6_NODE
, &af_no_label_vpn_export_cmd
);
15371 install_element(BGP_IPV4_NODE
, &af_no_nexthop_vpn_export_cmd
);
15372 install_element(BGP_IPV6_NODE
, &af_no_nexthop_vpn_export_cmd
);
15373 install_element(BGP_IPV4_NODE
, &af_no_rt_vpn_imexport_cmd
);
15374 install_element(BGP_IPV6_NODE
, &af_no_rt_vpn_imexport_cmd
);
15375 install_element(BGP_IPV4_NODE
, &af_no_route_map_vpn_imexport_cmd
);
15376 install_element(BGP_IPV6_NODE
, &af_no_route_map_vpn_imexport_cmd
);
15377 install_element(BGP_IPV4_NODE
, &af_no_import_vrf_route_map_cmd
);
15378 install_element(BGP_IPV6_NODE
, &af_no_import_vrf_route_map_cmd
);
15381 #include "memory.h"
15382 #include "bgp_regex.h"
15383 #include "bgp_clist.h"
15384 #include "bgp_ecommunity.h"
15386 /* VTY functions. */
15388 /* Direction value to string conversion. */
15389 static const char *community_direct_str(int direct
)
15392 case COMMUNITY_DENY
:
15394 case COMMUNITY_PERMIT
:
15401 /* Display error string. */
15402 static void community_list_perror(struct vty
*vty
, int ret
)
15405 case COMMUNITY_LIST_ERR_CANT_FIND_LIST
:
15406 vty_out(vty
, "%% Can't find community-list\n");
15408 case COMMUNITY_LIST_ERR_MALFORMED_VAL
:
15409 vty_out(vty
, "%% Malformed community-list value\n");
15411 case COMMUNITY_LIST_ERR_STANDARD_CONFLICT
:
15413 "%% Community name conflict, previously defined as standard community\n");
15415 case COMMUNITY_LIST_ERR_EXPANDED_CONFLICT
:
15417 "%% Community name conflict, previously defined as expanded community\n");
15422 /* "community-list" keyword help string. */
15423 #define COMMUNITY_LIST_STR "Add a community list entry\n"
15425 /*community-list standard */
15426 DEFUN (community_list_standard
,
15427 bgp_community_list_standard_cmd
,
15428 "bgp community-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
15431 "Community list number (standard)\n"
15432 "Add an standard community-list entry\n"
15433 "Community list name\n"
15434 "Specify community to reject\n"
15435 "Specify community to accept\n"
15438 char *cl_name_or_number
= NULL
;
15440 int style
= COMMUNITY_LIST_STANDARD
;
15443 argv_find(argv
, argc
, "(1-99)", &idx
);
15444 argv_find(argv
, argc
, "WORD", &idx
);
15445 cl_name_or_number
= argv
[idx
]->arg
;
15446 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
15448 argv_find(argv
, argc
, "AA:NN", &idx
);
15449 char *str
= argv_concat(argv
, argc
, idx
);
15451 int ret
= community_list_set(bgp_clist
, cl_name_or_number
, str
, direct
,
15454 XFREE(MTYPE_TMP
, str
);
15457 /* Display error string. */
15458 community_list_perror(vty
, ret
);
15459 return CMD_WARNING_CONFIG_FAILED
;
15462 return CMD_SUCCESS
;
15465 DEFUN (no_community_list_standard_all
,
15466 no_bgp_community_list_standard_all_cmd
,
15467 "no bgp community-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
15471 "Community list number (standard)\n"
15472 "Add an standard community-list entry\n"
15473 "Community list name\n"
15474 "Specify community to reject\n"
15475 "Specify community to accept\n"
15478 char *cl_name_or_number
= NULL
;
15481 int style
= COMMUNITY_LIST_STANDARD
;
15485 argv_find(argv
, argc
, "permit", &idx
);
15486 argv_find(argv
, argc
, "deny", &idx
);
15489 direct
= argv_find(argv
, argc
, "permit", &idx
)
15494 argv_find(argv
, argc
, "AA:NN", &idx
);
15495 str
= argv_concat(argv
, argc
, idx
);
15499 argv_find(argv
, argc
, "(1-99)", &idx
);
15500 argv_find(argv
, argc
, "WORD", &idx
);
15501 cl_name_or_number
= argv
[idx
]->arg
;
15503 int ret
= community_list_unset(bgp_clist
, cl_name_or_number
, str
,
15506 XFREE(MTYPE_TMP
, str
);
15509 community_list_perror(vty
, ret
);
15510 return CMD_WARNING_CONFIG_FAILED
;
15513 return CMD_SUCCESS
;
15516 ALIAS(no_community_list_standard_all
, no_bgp_community_list_standard_all_list_cmd
,
15517 "no bgp community-list <(1-99)|standard WORD>",
15518 NO_STR BGP_STR COMMUNITY_LIST_STR
15519 "Community list number (standard)\n"
15520 "Add an standard community-list entry\n"
15521 "Community list name\n")
15523 /*community-list expanded */
15524 DEFUN (community_list_expanded_all
,
15525 bgp_community_list_expanded_all_cmd
,
15526 "bgp community-list <(100-500)|expanded WORD> <deny|permit> AA:NN...",
15529 "Community list number (expanded)\n"
15530 "Add an expanded community-list entry\n"
15531 "Community list name\n"
15532 "Specify community to reject\n"
15533 "Specify community to accept\n"
15536 char *cl_name_or_number
= NULL
;
15538 int style
= COMMUNITY_LIST_EXPANDED
;
15542 argv_find(argv
, argc
, "(100-500)", &idx
);
15543 argv_find(argv
, argc
, "WORD", &idx
);
15544 cl_name_or_number
= argv
[idx
]->arg
;
15545 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
15547 argv_find(argv
, argc
, "AA:NN", &idx
);
15548 char *str
= argv_concat(argv
, argc
, idx
);
15550 int ret
= community_list_set(bgp_clist
, cl_name_or_number
, str
, direct
,
15553 XFREE(MTYPE_TMP
, str
);
15556 /* Display error string. */
15557 community_list_perror(vty
, ret
);
15558 return CMD_WARNING_CONFIG_FAILED
;
15561 return CMD_SUCCESS
;
15564 DEFUN (no_community_list_expanded_all
,
15565 no_bgp_community_list_expanded_all_cmd
,
15566 "no bgp community-list <(100-500)|expanded WORD> <deny|permit> AA:NN...",
15570 "Community list number (expanded)\n"
15571 "Add an expanded community-list entry\n"
15572 "Community list name\n"
15573 "Specify community to reject\n"
15574 "Specify community to accept\n"
15577 char *cl_name_or_number
= NULL
;
15580 int style
= COMMUNITY_LIST_EXPANDED
;
15584 argv_find(argv
, argc
, "permit", &idx
);
15585 argv_find(argv
, argc
, "deny", &idx
);
15588 direct
= argv_find(argv
, argc
, "permit", &idx
)
15593 argv_find(argv
, argc
, "AA:NN", &idx
);
15594 str
= argv_concat(argv
, argc
, idx
);
15598 argv_find(argv
, argc
, "(100-500)", &idx
);
15599 argv_find(argv
, argc
, "WORD", &idx
);
15600 cl_name_or_number
= argv
[idx
]->arg
;
15602 int ret
= community_list_unset(bgp_clist
, cl_name_or_number
, str
,
15605 XFREE(MTYPE_TMP
, str
);
15608 community_list_perror(vty
, ret
);
15609 return CMD_WARNING_CONFIG_FAILED
;
15612 return CMD_SUCCESS
;
15615 ALIAS(no_community_list_expanded_all
, no_bgp_community_list_expanded_all_list_cmd
,
15616 "no bgp community-list <(100-500)|expanded WORD>",
15617 NO_STR IP_STR COMMUNITY_LIST_STR
15618 "Community list number (expanded)\n"
15619 "Add an expanded community-list entry\n"
15620 "Community list name\n")
15622 /* Return configuration string of community-list entry. */
15623 static const char *community_list_config_str(struct community_entry
*entry
)
15630 if (entry
->style
== COMMUNITY_LIST_STANDARD
)
15631 str
= community_str(entry
->u
.com
, false);
15632 else if (entry
->style
== LARGE_COMMUNITY_LIST_STANDARD
)
15633 str
= lcommunity_str(entry
->u
.lcom
, false);
15635 str
= entry
->config
;
15640 static void community_list_show(struct vty
*vty
, struct community_list
*list
)
15642 struct community_entry
*entry
;
15644 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
15645 if (entry
== list
->head
) {
15646 if (all_digit(list
->name
))
15647 vty_out(vty
, "Community %s list %s\n",
15648 entry
->style
== COMMUNITY_LIST_STANDARD
15650 : "(expanded) access",
15653 vty_out(vty
, "Named Community %s list %s\n",
15654 entry
->style
== COMMUNITY_LIST_STANDARD
15660 vty_out(vty
, " %s\n",
15661 community_direct_str(entry
->direct
));
15663 vty_out(vty
, " %s %s\n",
15664 community_direct_str(entry
->direct
),
15665 community_list_config_str(entry
));
15669 DEFUN (show_community_list
,
15670 show_bgp_community_list_cmd
,
15671 "show bgp community-list",
15674 "List community-list\n")
15676 struct community_list
*list
;
15677 struct community_list_master
*cm
;
15679 cm
= community_list_master_lookup(bgp_clist
, COMMUNITY_LIST_MASTER
);
15681 return CMD_SUCCESS
;
15683 for (list
= cm
->num
.head
; list
; list
= list
->next
)
15684 community_list_show(vty
, list
);
15686 for (list
= cm
->str
.head
; list
; list
= list
->next
)
15687 community_list_show(vty
, list
);
15689 return CMD_SUCCESS
;
15692 DEFUN (show_community_list_arg
,
15693 show_bgp_community_list_arg_cmd
,
15694 "show bgp community-list <(1-500)|WORD> detail",
15697 "List community-list\n"
15698 "Community-list number\n"
15699 "Community-list name\n"
15700 "Detailed information on community-list\n")
15702 int idx_comm_list
= 3;
15703 struct community_list
*list
;
15705 list
= community_list_lookup(bgp_clist
, argv
[idx_comm_list
]->arg
, 0,
15706 COMMUNITY_LIST_MASTER
);
15708 vty_out(vty
, "%% Can't find community-list\n");
15709 return CMD_WARNING
;
15712 community_list_show(vty
, list
);
15714 return CMD_SUCCESS
;
15718 * Large Community code.
15720 static int lcommunity_list_set_vty(struct vty
*vty
, int argc
,
15721 struct cmd_token
**argv
, int style
,
15722 int reject_all_digit_name
)
15730 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
15733 /* All digit name check. */
15735 argv_find(argv
, argc
, "WORD", &idx
);
15736 argv_find(argv
, argc
, "(1-99)", &idx
);
15737 argv_find(argv
, argc
, "(100-500)", &idx
);
15738 cl_name
= argv
[idx
]->arg
;
15739 if (reject_all_digit_name
&& all_digit(cl_name
)) {
15740 vty_out(vty
, "%% Community name cannot have all digits\n");
15741 return CMD_WARNING_CONFIG_FAILED
;
15745 argv_find(argv
, argc
, "AA:BB:CC", &idx
);
15746 argv_find(argv
, argc
, "LINE", &idx
);
15747 /* Concat community string argument. */
15749 str
= argv_concat(argv
, argc
, idx
);
15753 ret
= lcommunity_list_set(bgp_clist
, cl_name
, str
, direct
, style
);
15755 /* Free temporary community list string allocated by
15757 XFREE(MTYPE_TMP
, str
);
15760 community_list_perror(vty
, ret
);
15761 return CMD_WARNING_CONFIG_FAILED
;
15763 return CMD_SUCCESS
;
15766 static int lcommunity_list_unset_vty(struct vty
*vty
, int argc
,
15767 struct cmd_token
**argv
, int style
)
15774 argv_find(argv
, argc
, "permit", &idx
);
15775 argv_find(argv
, argc
, "deny", &idx
);
15778 /* Check the list direct. */
15779 if (strncmp(argv
[idx
]->arg
, "p", 1) == 0)
15780 direct
= COMMUNITY_PERMIT
;
15782 direct
= COMMUNITY_DENY
;
15785 argv_find(argv
, argc
, "LINE", &idx
);
15786 argv_find(argv
, argc
, "AA:AA:NN", &idx
);
15787 /* Concat community string argument. */
15788 str
= argv_concat(argv
, argc
, idx
);
15792 argv_find(argv
, argc
, "(1-99)", &idx
);
15793 argv_find(argv
, argc
, "(100-500)", &idx
);
15794 argv_find(argv
, argc
, "WORD", &idx
);
15796 /* Unset community list. */
15797 ret
= lcommunity_list_unset(bgp_clist
, argv
[idx
]->arg
, str
, direct
,
15800 /* Free temporary community list string allocated by
15802 XFREE(MTYPE_TMP
, str
);
15805 community_list_perror(vty
, ret
);
15806 return CMD_WARNING_CONFIG_FAILED
;
15809 return CMD_SUCCESS
;
15812 /* "large-community-list" keyword help string. */
15813 #define LCOMMUNITY_LIST_STR "Add a large community list entry\n"
15814 #define LCOMMUNITY_VAL_STR "large community in 'aa:bb:cc' format\n"
15816 DEFUN (lcommunity_list_standard
,
15817 bgp_lcommunity_list_standard_cmd
,
15818 "bgp large-community-list (1-99) <deny|permit> AA:BB:CC...",
15820 LCOMMUNITY_LIST_STR
15821 "Large Community list number (standard)\n"
15822 "Specify large community to reject\n"
15823 "Specify large community to accept\n"
15824 LCOMMUNITY_VAL_STR
)
15826 return lcommunity_list_set_vty(vty
, argc
, argv
,
15827 LARGE_COMMUNITY_LIST_STANDARD
, 0);
15830 DEFUN (lcommunity_list_expanded
,
15831 bgp_lcommunity_list_expanded_cmd
,
15832 "bgp large-community-list (100-500) <deny|permit> LINE...",
15834 LCOMMUNITY_LIST_STR
15835 "Large Community list number (expanded)\n"
15836 "Specify large community to reject\n"
15837 "Specify large community to accept\n"
15838 "An ordered list as a regular-expression\n")
15840 return lcommunity_list_set_vty(vty
, argc
, argv
,
15841 LARGE_COMMUNITY_LIST_EXPANDED
, 0);
15844 DEFUN (lcommunity_list_name_standard
,
15845 bgp_lcommunity_list_name_standard_cmd
,
15846 "bgp large-community-list standard WORD <deny|permit> AA:BB:CC...",
15848 LCOMMUNITY_LIST_STR
15849 "Specify standard large-community-list\n"
15850 "Large Community list name\n"
15851 "Specify large community to reject\n"
15852 "Specify large community to accept\n"
15853 LCOMMUNITY_VAL_STR
)
15855 return lcommunity_list_set_vty(vty
, argc
, argv
,
15856 LARGE_COMMUNITY_LIST_STANDARD
, 1);
15859 DEFUN (lcommunity_list_name_expanded
,
15860 bgp_lcommunity_list_name_expanded_cmd
,
15861 "bgp large-community-list expanded WORD <deny|permit> LINE...",
15863 LCOMMUNITY_LIST_STR
15864 "Specify expanded large-community-list\n"
15865 "Large Community list name\n"
15866 "Specify large community to reject\n"
15867 "Specify large community to accept\n"
15868 "An ordered list as a regular-expression\n")
15870 return lcommunity_list_set_vty(vty
, argc
, argv
,
15871 LARGE_COMMUNITY_LIST_EXPANDED
, 1);
15874 DEFUN (no_lcommunity_list_standard_all
,
15875 no_bgp_lcommunity_list_standard_all_cmd
,
15876 "no bgp large-community-list <(1-99)|(100-500)|WORD>",
15879 LCOMMUNITY_LIST_STR
15880 "Large Community list number (standard)\n"
15881 "Large Community list number (expanded)\n"
15882 "Large Community list name\n")
15884 return lcommunity_list_unset_vty(vty
, argc
, argv
,
15885 LARGE_COMMUNITY_LIST_STANDARD
);
15888 DEFUN (no_lcommunity_list_name_expanded_all
,
15889 no_bgp_lcommunity_list_name_expanded_all_cmd
,
15890 "no bgp large-community-list expanded WORD",
15893 LCOMMUNITY_LIST_STR
15894 "Specify expanded large-community-list\n"
15895 "Large Community list name\n")
15897 return lcommunity_list_unset_vty(vty
, argc
, argv
,
15898 LARGE_COMMUNITY_LIST_EXPANDED
);
15901 DEFUN (no_lcommunity_list_standard
,
15902 no_bgp_lcommunity_list_standard_cmd
,
15903 "no bgp large-community-list (1-99) <deny|permit> AA:AA:NN...",
15906 LCOMMUNITY_LIST_STR
15907 "Large Community list number (standard)\n"
15908 "Specify large community to reject\n"
15909 "Specify large community to accept\n"
15910 LCOMMUNITY_VAL_STR
)
15912 return lcommunity_list_unset_vty(vty
, argc
, argv
,
15913 LARGE_COMMUNITY_LIST_STANDARD
);
15916 DEFUN (no_lcommunity_list_expanded
,
15917 no_bgp_lcommunity_list_expanded_cmd
,
15918 "no bgp large-community-list (100-500) <deny|permit> LINE...",
15921 LCOMMUNITY_LIST_STR
15922 "Large Community list number (expanded)\n"
15923 "Specify large community to reject\n"
15924 "Specify large community to accept\n"
15925 "An ordered list as a regular-expression\n")
15927 return lcommunity_list_unset_vty(vty
, argc
, argv
,
15928 LARGE_COMMUNITY_LIST_EXPANDED
);
15931 DEFUN (no_lcommunity_list_name_standard
,
15932 no_bgp_lcommunity_list_name_standard_cmd
,
15933 "no bgp large-community-list standard WORD <deny|permit> AA:AA:NN...",
15936 LCOMMUNITY_LIST_STR
15937 "Specify standard large-community-list\n"
15938 "Large Community list name\n"
15939 "Specify large community to reject\n"
15940 "Specify large community to accept\n"
15941 LCOMMUNITY_VAL_STR
)
15943 return lcommunity_list_unset_vty(vty
, argc
, argv
,
15944 LARGE_COMMUNITY_LIST_STANDARD
);
15947 DEFUN (no_lcommunity_list_name_expanded
,
15948 no_bgp_lcommunity_list_name_expanded_cmd
,
15949 "no bgp large-community-list expanded WORD <deny|permit> LINE...",
15952 LCOMMUNITY_LIST_STR
15953 "Specify expanded large-community-list\n"
15954 "Large community list name\n"
15955 "Specify large community to reject\n"
15956 "Specify large community to accept\n"
15957 "An ordered list as a regular-expression\n")
15959 return lcommunity_list_unset_vty(vty
, argc
, argv
,
15960 LARGE_COMMUNITY_LIST_EXPANDED
);
15963 static void lcommunity_list_show(struct vty
*vty
, struct community_list
*list
)
15965 struct community_entry
*entry
;
15967 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
15968 if (entry
== list
->head
) {
15969 if (all_digit(list
->name
))
15970 vty_out(vty
, "Large community %s list %s\n",
15972 LARGE_COMMUNITY_LIST_STANDARD
15974 : "(expanded) access",
15978 "Named large community %s list %s\n",
15980 LARGE_COMMUNITY_LIST_STANDARD
15986 vty_out(vty
, " %s\n",
15987 community_direct_str(entry
->direct
));
15989 vty_out(vty
, " %s %s\n",
15990 community_direct_str(entry
->direct
),
15991 community_list_config_str(entry
));
15995 DEFUN (show_lcommunity_list
,
15996 show_bgp_lcommunity_list_cmd
,
15997 "show bgp large-community-list",
16000 "List large-community list\n")
16002 struct community_list
*list
;
16003 struct community_list_master
*cm
;
16005 cm
= community_list_master_lookup(bgp_clist
,
16006 LARGE_COMMUNITY_LIST_MASTER
);
16008 return CMD_SUCCESS
;
16010 for (list
= cm
->num
.head
; list
; list
= list
->next
)
16011 lcommunity_list_show(vty
, list
);
16013 for (list
= cm
->str
.head
; list
; list
= list
->next
)
16014 lcommunity_list_show(vty
, list
);
16016 return CMD_SUCCESS
;
16019 DEFUN (show_lcommunity_list_arg
,
16020 show_bgp_lcommunity_list_arg_cmd
,
16021 "show bgp large-community-list <(1-500)|WORD> detail",
16024 "List large-community list\n"
16025 "Large-community-list number\n"
16026 "Large-community-list name\n"
16027 "Detailed information on large-community-list\n")
16029 struct community_list
*list
;
16031 list
= community_list_lookup(bgp_clist
, argv
[3]->arg
, 0,
16032 LARGE_COMMUNITY_LIST_MASTER
);
16034 vty_out(vty
, "%% Can't find large-community-list\n");
16035 return CMD_WARNING
;
16038 lcommunity_list_show(vty
, list
);
16040 return CMD_SUCCESS
;
16043 /* "extcommunity-list" keyword help string. */
16044 #define EXTCOMMUNITY_LIST_STR "Add a extended community list entry\n"
16045 #define EXTCOMMUNITY_VAL_STR "Extended community attribute in 'rt aa:nn_or_IPaddr:nn' OR 'soo aa:nn_or_IPaddr:nn' format\n"
16047 DEFUN (extcommunity_list_standard
,
16048 bgp_extcommunity_list_standard_cmd
,
16049 "bgp extcommunity-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
16051 EXTCOMMUNITY_LIST_STR
16052 "Extended Community list number (standard)\n"
16053 "Specify standard extcommunity-list\n"
16054 "Community list name\n"
16055 "Specify community to reject\n"
16056 "Specify community to accept\n"
16057 EXTCOMMUNITY_VAL_STR
)
16059 int style
= EXTCOMMUNITY_LIST_STANDARD
;
16061 char *cl_number_or_name
= NULL
;
16065 argv_find(argv
, argc
, "(1-99)", &idx
);
16066 argv_find(argv
, argc
, "WORD", &idx
);
16067 cl_number_or_name
= argv
[idx
]->arg
;
16068 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
16070 argv_find(argv
, argc
, "AA:NN", &idx
);
16071 char *str
= argv_concat(argv
, argc
, idx
);
16073 int ret
= extcommunity_list_set(bgp_clist
, cl_number_or_name
, str
,
16076 XFREE(MTYPE_TMP
, str
);
16079 community_list_perror(vty
, ret
);
16080 return CMD_WARNING_CONFIG_FAILED
;
16083 return CMD_SUCCESS
;
16086 DEFUN (extcommunity_list_name_expanded
,
16087 bgp_extcommunity_list_name_expanded_cmd
,
16088 "bgp extcommunity-list <(100-500)|expanded WORD> <deny|permit> LINE...",
16090 EXTCOMMUNITY_LIST_STR
16091 "Extended Community list number (expanded)\n"
16092 "Specify expanded extcommunity-list\n"
16093 "Extended Community list name\n"
16094 "Specify community to reject\n"
16095 "Specify community to accept\n"
16096 "An ordered list as a regular-expression\n")
16098 int style
= EXTCOMMUNITY_LIST_EXPANDED
;
16100 char *cl_number_or_name
= NULL
;
16103 argv_find(argv
, argc
, "(100-500)", &idx
);
16104 argv_find(argv
, argc
, "WORD", &idx
);
16105 cl_number_or_name
= argv
[idx
]->arg
;
16106 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
16108 argv_find(argv
, argc
, "LINE", &idx
);
16109 char *str
= argv_concat(argv
, argc
, idx
);
16111 int ret
= extcommunity_list_set(bgp_clist
, cl_number_or_name
, str
,
16114 XFREE(MTYPE_TMP
, str
);
16117 community_list_perror(vty
, ret
);
16118 return CMD_WARNING_CONFIG_FAILED
;
16121 return CMD_SUCCESS
;
16124 DEFUN (no_extcommunity_list_standard_all
,
16125 no_bgp_extcommunity_list_standard_all_cmd
,
16126 "no bgp extcommunity-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
16129 EXTCOMMUNITY_LIST_STR
16130 "Extended Community list number (standard)\n"
16131 "Specify standard extcommunity-list\n"
16132 "Community list name\n"
16133 "Specify community to reject\n"
16134 "Specify community to accept\n"
16135 EXTCOMMUNITY_VAL_STR
)
16137 int style
= EXTCOMMUNITY_LIST_STANDARD
;
16139 char *cl_number_or_name
= NULL
;
16143 argv_find(argv
, argc
, "permit", &idx
);
16144 argv_find(argv
, argc
, "deny", &idx
);
16147 direct
= argv_find(argv
, argc
, "permit", &idx
)
16152 argv_find(argv
, argc
, "AA:NN", &idx
);
16153 str
= argv_concat(argv
, argc
, idx
);
16157 argv_find(argv
, argc
, "(1-99)", &idx
);
16158 argv_find(argv
, argc
, "WORD", &idx
);
16159 cl_number_or_name
= argv
[idx
]->arg
;
16161 int ret
= extcommunity_list_unset(bgp_clist
, cl_number_or_name
, str
,
16164 XFREE(MTYPE_TMP
, str
);
16167 community_list_perror(vty
, ret
);
16168 return CMD_WARNING_CONFIG_FAILED
;
16171 return CMD_SUCCESS
;
16174 ALIAS(no_extcommunity_list_standard_all
,
16175 no_bgp_extcommunity_list_standard_all_list_cmd
,
16176 "no bgp extcommunity-list <(1-99)|standard WORD>",
16177 NO_STR IP_STR EXTCOMMUNITY_LIST_STR
16178 "Extended Community list number (standard)\n"
16179 "Specify standard extcommunity-list\n"
16180 "Community list name\n")
16182 DEFUN (no_extcommunity_list_expanded_all
,
16183 no_bgp_extcommunity_list_expanded_all_cmd
,
16184 "no bgp extcommunity-list <(100-500)|expanded WORD> <deny|permit> LINE...",
16187 EXTCOMMUNITY_LIST_STR
16188 "Extended Community list number (expanded)\n"
16189 "Specify expanded extcommunity-list\n"
16190 "Extended Community list name\n"
16191 "Specify community to reject\n"
16192 "Specify community to accept\n"
16193 "An ordered list as a regular-expression\n")
16195 int style
= EXTCOMMUNITY_LIST_EXPANDED
;
16197 char *cl_number_or_name
= NULL
;
16201 argv_find(argv
, argc
, "permit", &idx
);
16202 argv_find(argv
, argc
, "deny", &idx
);
16205 direct
= argv_find(argv
, argc
, "permit", &idx
)
16210 argv_find(argv
, argc
, "LINE", &idx
);
16211 str
= argv_concat(argv
, argc
, idx
);
16215 argv_find(argv
, argc
, "(100-500)", &idx
);
16216 argv_find(argv
, argc
, "WORD", &idx
);
16217 cl_number_or_name
= argv
[idx
]->arg
;
16219 int ret
= extcommunity_list_unset(bgp_clist
, cl_number_or_name
, str
,
16222 XFREE(MTYPE_TMP
, str
);
16225 community_list_perror(vty
, ret
);
16226 return CMD_WARNING_CONFIG_FAILED
;
16229 return CMD_SUCCESS
;
16232 ALIAS(no_extcommunity_list_expanded_all
,
16233 no_bgp_extcommunity_list_expanded_all_list_cmd
,
16234 "no bgp extcommunity-list <(100-500)|expanded WORD>",
16235 NO_STR IP_STR EXTCOMMUNITY_LIST_STR
16236 "Extended Community list number (expanded)\n"
16237 "Specify expanded extcommunity-list\n"
16238 "Extended Community list name\n")
16240 static void extcommunity_list_show(struct vty
*vty
, struct community_list
*list
)
16242 struct community_entry
*entry
;
16244 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
16245 if (entry
== list
->head
) {
16246 if (all_digit(list
->name
))
16247 vty_out(vty
, "Extended community %s list %s\n",
16248 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
16250 : "(expanded) access",
16254 "Named extended community %s list %s\n",
16255 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
16261 vty_out(vty
, " %s\n",
16262 community_direct_str(entry
->direct
));
16264 vty_out(vty
, " %s %s\n",
16265 community_direct_str(entry
->direct
),
16266 community_list_config_str(entry
));
16270 DEFUN (show_extcommunity_list
,
16271 show_bgp_extcommunity_list_cmd
,
16272 "show bgp extcommunity-list",
16275 "List extended-community list\n")
16277 struct community_list
*list
;
16278 struct community_list_master
*cm
;
16280 cm
= community_list_master_lookup(bgp_clist
, EXTCOMMUNITY_LIST_MASTER
);
16282 return CMD_SUCCESS
;
16284 for (list
= cm
->num
.head
; list
; list
= list
->next
)
16285 extcommunity_list_show(vty
, list
);
16287 for (list
= cm
->str
.head
; list
; list
= list
->next
)
16288 extcommunity_list_show(vty
, list
);
16290 return CMD_SUCCESS
;
16293 DEFUN (show_extcommunity_list_arg
,
16294 show_bgp_extcommunity_list_arg_cmd
,
16295 "show bgp extcommunity-list <(1-500)|WORD> detail",
16298 "List extended-community list\n"
16299 "Extcommunity-list number\n"
16300 "Extcommunity-list name\n"
16301 "Detailed information on extcommunity-list\n")
16303 int idx_comm_list
= 3;
16304 struct community_list
*list
;
16306 list
= community_list_lookup(bgp_clist
, argv
[idx_comm_list
]->arg
, 0,
16307 EXTCOMMUNITY_LIST_MASTER
);
16309 vty_out(vty
, "%% Can't find extcommunity-list\n");
16310 return CMD_WARNING
;
16313 extcommunity_list_show(vty
, list
);
16315 return CMD_SUCCESS
;
16318 /* Display community-list and extcommunity-list configuration. */
16319 static int community_list_config_write(struct vty
*vty
)
16321 struct community_list
*list
;
16322 struct community_entry
*entry
;
16323 struct community_list_master
*cm
;
16326 /* Community-list. */
16327 cm
= community_list_master_lookup(bgp_clist
, COMMUNITY_LIST_MASTER
);
16329 for (list
= cm
->num
.head
; list
; list
= list
->next
)
16330 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
16331 vty_out(vty
, "bgp community-list %s %s %s\n", list
->name
,
16332 community_direct_str(entry
->direct
),
16333 community_list_config_str(entry
));
16336 for (list
= cm
->str
.head
; list
; list
= list
->next
)
16337 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
16338 vty_out(vty
, "bgp community-list %s %s %s %s\n",
16339 entry
->style
== COMMUNITY_LIST_STANDARD
16342 list
->name
, community_direct_str(entry
->direct
),
16343 community_list_config_str(entry
));
16347 /* Extcommunity-list. */
16348 cm
= community_list_master_lookup(bgp_clist
, EXTCOMMUNITY_LIST_MASTER
);
16350 for (list
= cm
->num
.head
; list
; list
= list
->next
)
16351 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
16352 vty_out(vty
, "bgp extcommunity-list %s %s %s\n",
16353 list
->name
, community_direct_str(entry
->direct
),
16354 community_list_config_str(entry
));
16357 for (list
= cm
->str
.head
; list
; list
= list
->next
)
16358 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
16359 vty_out(vty
, "bgp extcommunity-list %s %s %s %s\n",
16360 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
16363 list
->name
, community_direct_str(entry
->direct
),
16364 community_list_config_str(entry
));
16369 /* lcommunity-list. */
16370 cm
= community_list_master_lookup(bgp_clist
,
16371 LARGE_COMMUNITY_LIST_MASTER
);
16373 for (list
= cm
->num
.head
; list
; list
= list
->next
)
16374 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
16375 vty_out(vty
, "bgp large-community-list %s %s %s\n",
16376 list
->name
, community_direct_str(entry
->direct
),
16377 community_list_config_str(entry
));
16380 for (list
= cm
->str
.head
; list
; list
= list
->next
)
16381 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
16382 vty_out(vty
, "bgp large-community-list %s %s %s %s\n",
16383 entry
->style
== LARGE_COMMUNITY_LIST_STANDARD
16386 list
->name
, community_direct_str(entry
->direct
),
16387 community_list_config_str(entry
));
16394 static struct cmd_node community_list_node
= {
16395 COMMUNITY_LIST_NODE
, "", 1 /* Export to vtysh. */
16398 static void community_list_vty(void)
16400 install_node(&community_list_node
, community_list_config_write
);
16402 /* Community-list. */
16403 install_element(CONFIG_NODE
, &bgp_community_list_standard_cmd
);
16404 install_element(CONFIG_NODE
, &bgp_community_list_expanded_all_cmd
);
16405 install_element(CONFIG_NODE
, &no_bgp_community_list_standard_all_cmd
);
16406 install_element(CONFIG_NODE
, &no_bgp_community_list_standard_all_list_cmd
);
16407 install_element(CONFIG_NODE
, &no_bgp_community_list_expanded_all_cmd
);
16408 install_element(CONFIG_NODE
, &no_bgp_community_list_expanded_all_list_cmd
);
16409 install_element(VIEW_NODE
, &show_bgp_community_list_cmd
);
16410 install_element(VIEW_NODE
, &show_bgp_community_list_arg_cmd
);
16412 /* Extcommunity-list. */
16413 install_element(CONFIG_NODE
, &bgp_extcommunity_list_standard_cmd
);
16414 install_element(CONFIG_NODE
, &bgp_extcommunity_list_name_expanded_cmd
);
16415 install_element(CONFIG_NODE
, &no_bgp_extcommunity_list_standard_all_cmd
);
16416 install_element(CONFIG_NODE
,
16417 &no_bgp_extcommunity_list_standard_all_list_cmd
);
16418 install_element(CONFIG_NODE
, &no_bgp_extcommunity_list_expanded_all_cmd
);
16419 install_element(CONFIG_NODE
,
16420 &no_bgp_extcommunity_list_expanded_all_list_cmd
);
16421 install_element(VIEW_NODE
, &show_bgp_extcommunity_list_cmd
);
16422 install_element(VIEW_NODE
, &show_bgp_extcommunity_list_arg_cmd
);
16424 /* Large Community List */
16425 install_element(CONFIG_NODE
, &bgp_lcommunity_list_standard_cmd
);
16426 install_element(CONFIG_NODE
, &bgp_lcommunity_list_expanded_cmd
);
16427 install_element(CONFIG_NODE
, &bgp_lcommunity_list_name_standard_cmd
);
16428 install_element(CONFIG_NODE
, &bgp_lcommunity_list_name_expanded_cmd
);
16429 install_element(CONFIG_NODE
, &no_bgp_lcommunity_list_standard_all_cmd
);
16430 install_element(CONFIG_NODE
,
16431 &no_bgp_lcommunity_list_name_expanded_all_cmd
);
16432 install_element(CONFIG_NODE
, &no_bgp_lcommunity_list_standard_cmd
);
16433 install_element(CONFIG_NODE
, &no_bgp_lcommunity_list_expanded_cmd
);
16434 install_element(CONFIG_NODE
, &no_bgp_lcommunity_list_name_standard_cmd
);
16435 install_element(CONFIG_NODE
, &no_bgp_lcommunity_list_name_expanded_cmd
);
16436 install_element(VIEW_NODE
, &show_bgp_lcommunity_list_cmd
);
16437 install_element(VIEW_NODE
, &show_bgp_lcommunity_list_arg_cmd
);