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 to be sent to the neighbor. */
6062 DEFUN(neighbor_maximum_prefix_out
,
6063 neighbor_maximum_prefix_out_cmd
,
6064 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix-out (1-4294967295)",
6067 "Maximum number of prefixes to be sent to this peer\n"
6068 "Maximum no. of prefix limit\n")
6074 afi_t afi
= bgp_node_afi(vty
);
6075 safi_t safi
= bgp_node_safi(vty
);
6077 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6079 return CMD_WARNING_CONFIG_FAILED
;
6081 max
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
6083 SET_FLAG(peer
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_OUT
);
6084 peer
->pmax_out
[afi
][safi
] = max
;
6089 DEFUN(no_neighbor_maximum_prefix_out
,
6090 no_neighbor_maximum_prefix_out_cmd
,
6091 "no neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix-out",
6095 "Maximum number of prefixes to be sent to this peer\n")
6099 afi_t afi
= bgp_node_afi(vty
);
6100 safi_t safi
= bgp_node_safi(vty
);
6102 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6104 return CMD_WARNING_CONFIG_FAILED
;
6106 peer
->pmax_out
[afi
][safi
] = 0;
6111 /* Maximum number of prefix configuration. prefix count is different
6112 for each peer configuration. So this configuration can be set for
6113 each peer configuration. */
6114 DEFUN (neighbor_maximum_prefix
,
6115 neighbor_maximum_prefix_cmd
,
6116 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295)",
6119 "Maximum number of prefix accept from this peer\n"
6120 "maximum no. of prefix limit\n")
6124 return peer_maximum_prefix_set_vty(
6125 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6126 argv
[idx_number
]->arg
, NULL
, 0, NULL
);
6129 ALIAS_HIDDEN(neighbor_maximum_prefix
, neighbor_maximum_prefix_hidden_cmd
,
6130 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295)",
6131 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6132 "Maximum number of prefix accept from this peer\n"
6133 "maximum no. of prefix limit\n")
6135 DEFUN (neighbor_maximum_prefix_threshold
,
6136 neighbor_maximum_prefix_threshold_cmd
,
6137 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100)",
6140 "Maximum number of prefix accept from this peer\n"
6141 "maximum no. of prefix limit\n"
6142 "Threshold value (%) at which to generate a warning msg\n")
6146 int idx_number_2
= 4;
6147 return peer_maximum_prefix_set_vty(
6148 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6149 argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
, 0, NULL
);
6153 neighbor_maximum_prefix_threshold
,
6154 neighbor_maximum_prefix_threshold_hidden_cmd
,
6155 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100)",
6156 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6157 "Maximum number of prefix accept from this peer\n"
6158 "maximum no. of prefix limit\n"
6159 "Threshold value (%) at which to generate a warning msg\n")
6161 DEFUN (neighbor_maximum_prefix_warning
,
6162 neighbor_maximum_prefix_warning_cmd
,
6163 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) warning-only",
6166 "Maximum number of prefix accept from this peer\n"
6167 "maximum no. of prefix limit\n"
6168 "Only give warning message when limit is exceeded\n")
6172 return peer_maximum_prefix_set_vty(
6173 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6174 argv
[idx_number
]->arg
, NULL
, 1, NULL
);
6178 neighbor_maximum_prefix_warning
,
6179 neighbor_maximum_prefix_warning_hidden_cmd
,
6180 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) warning-only",
6181 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6182 "Maximum number of prefix accept from this peer\n"
6183 "maximum no. of prefix limit\n"
6184 "Only give warning message when limit is exceeded\n")
6186 DEFUN (neighbor_maximum_prefix_threshold_warning
,
6187 neighbor_maximum_prefix_threshold_warning_cmd
,
6188 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) warning-only",
6191 "Maximum number of prefix accept from this peer\n"
6192 "maximum no. of prefix limit\n"
6193 "Threshold value (%) at which to generate a warning msg\n"
6194 "Only give warning message when limit is exceeded\n")
6198 int idx_number_2
= 4;
6199 return peer_maximum_prefix_set_vty(
6200 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6201 argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
, 1, NULL
);
6205 neighbor_maximum_prefix_threshold_warning
,
6206 neighbor_maximum_prefix_threshold_warning_hidden_cmd
,
6207 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) warning-only",
6208 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6209 "Maximum number of prefix accept from this peer\n"
6210 "maximum no. of prefix limit\n"
6211 "Threshold value (%) at which to generate a warning msg\n"
6212 "Only give warning message when limit is exceeded\n")
6214 DEFUN (neighbor_maximum_prefix_restart
,
6215 neighbor_maximum_prefix_restart_cmd
,
6216 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) restart (1-65535)",
6219 "Maximum number of prefix accept from this peer\n"
6220 "maximum no. of prefix limit\n"
6221 "Restart bgp connection after limit is exceeded\n"
6222 "Restart interval in minutes\n")
6226 int idx_number_2
= 5;
6227 return peer_maximum_prefix_set_vty(
6228 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6229 argv
[idx_number
]->arg
, NULL
, 0, argv
[idx_number_2
]->arg
);
6233 neighbor_maximum_prefix_restart
,
6234 neighbor_maximum_prefix_restart_hidden_cmd
,
6235 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) restart (1-65535)",
6236 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6237 "Maximum number of prefix accept from this peer\n"
6238 "maximum no. of prefix limit\n"
6239 "Restart bgp connection after limit is exceeded\n"
6240 "Restart interval in minutes\n")
6242 DEFUN (neighbor_maximum_prefix_threshold_restart
,
6243 neighbor_maximum_prefix_threshold_restart_cmd
,
6244 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) restart (1-65535)",
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")
6255 int idx_number_2
= 4;
6256 int idx_number_3
= 6;
6257 return peer_maximum_prefix_set_vty(
6258 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6259 argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
, 0,
6260 argv
[idx_number_3
]->arg
);
6264 neighbor_maximum_prefix_threshold_restart
,
6265 neighbor_maximum_prefix_threshold_restart_hidden_cmd
,
6266 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) restart (1-65535)",
6267 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6268 "Maximum number of prefixes to accept from this peer\n"
6269 "maximum no. of prefix limit\n"
6270 "Threshold value (%) at which to generate a warning msg\n"
6271 "Restart bgp connection after limit is exceeded\n"
6272 "Restart interval in minutes\n")
6274 DEFUN (no_neighbor_maximum_prefix
,
6275 no_neighbor_maximum_prefix_cmd
,
6276 "no neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix [(1-4294967295) [(1-100)] [restart (1-65535)] [warning-only]]",
6280 "Maximum number of prefixes to accept from this peer\n"
6281 "maximum no. of prefix limit\n"
6282 "Threshold value (%) at which to generate a warning msg\n"
6283 "Restart bgp connection after limit is exceeded\n"
6284 "Restart interval in minutes\n"
6285 "Only give warning message when limit is exceeded\n")
6288 return peer_maximum_prefix_unset_vty(vty
, argv
[idx_peer
]->arg
,
6290 bgp_node_safi(vty
));
6294 no_neighbor_maximum_prefix
, no_neighbor_maximum_prefix_hidden_cmd
,
6295 "no neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix [(1-4294967295) [(1-100)] [restart (1-65535)] [warning-only]]",
6296 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6297 "Maximum number of prefixes to accept from this peer\n"
6298 "maximum no. of prefix limit\n"
6299 "Threshold value (%) at which to generate a warning msg\n"
6300 "Restart bgp connection after limit is exceeded\n"
6301 "Restart interval in minutes\n"
6302 "Only give warning message when limit is exceeded\n")
6305 /* "neighbor allowas-in" */
6306 DEFUN (neighbor_allowas_in
,
6307 neighbor_allowas_in_cmd
,
6308 "neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
6311 "Accept as-path with my AS present in it\n"
6312 "Number of occurrences of AS number\n"
6313 "Only accept my AS in the as-path if the route was originated in my AS\n")
6316 int idx_number_origin
= 3;
6322 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6324 return CMD_WARNING_CONFIG_FAILED
;
6326 if (argc
<= idx_number_origin
)
6329 if (argv
[idx_number_origin
]->type
== WORD_TKN
)
6332 allow_num
= atoi(argv
[idx_number_origin
]->arg
);
6335 ret
= peer_allowas_in_set(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6338 return bgp_vty_return(vty
, ret
);
6342 neighbor_allowas_in
, neighbor_allowas_in_hidden_cmd
,
6343 "neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
6344 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6345 "Accept as-path with my AS present in it\n"
6346 "Number of occurrences of AS number\n"
6347 "Only accept my AS in the as-path if the route was originated in my AS\n")
6349 DEFUN (no_neighbor_allowas_in
,
6350 no_neighbor_allowas_in_cmd
,
6351 "no neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
6355 "allow local ASN appears in aspath attribute\n"
6356 "Number of occurrences of AS number\n"
6357 "Only accept my AS in the as-path if the route was originated in my AS\n")
6363 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6365 return CMD_WARNING_CONFIG_FAILED
;
6367 ret
= peer_allowas_in_unset(peer
, bgp_node_afi(vty
),
6368 bgp_node_safi(vty
));
6370 return bgp_vty_return(vty
, ret
);
6374 no_neighbor_allowas_in
, no_neighbor_allowas_in_hidden_cmd
,
6375 "no neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
6376 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6377 "allow local ASN appears in aspath attribute\n"
6378 "Number of occurrences of AS number\n"
6379 "Only accept my AS in the as-path if the route was originated in my AS\n")
6381 DEFUN (neighbor_ttl_security
,
6382 neighbor_ttl_security_cmd
,
6383 "neighbor <A.B.C.D|X:X::X:X|WORD> ttl-security hops (1-254)",
6386 "BGP ttl-security parameters\n"
6387 "Specify the maximum number of hops to the BGP peer\n"
6388 "Number of hops to BGP peer\n")
6395 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6397 return CMD_WARNING_CONFIG_FAILED
;
6399 gtsm_hops
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
6402 * If 'neighbor swpX', then this is for directly connected peers,
6403 * we should not accept a ttl-security hops value greater than 1.
6405 if (peer
->conf_if
&& (gtsm_hops
> 1)) {
6407 "%s is directly connected peer, hops cannot exceed 1\n",
6408 argv
[idx_peer
]->arg
);
6409 return CMD_WARNING_CONFIG_FAILED
;
6412 return bgp_vty_return(vty
, peer_ttl_security_hops_set(peer
, gtsm_hops
));
6415 DEFUN (no_neighbor_ttl_security
,
6416 no_neighbor_ttl_security_cmd
,
6417 "no neighbor <A.B.C.D|X:X::X:X|WORD> ttl-security hops (1-254)",
6421 "BGP ttl-security parameters\n"
6422 "Specify the maximum number of hops to the BGP peer\n"
6423 "Number of hops to BGP peer\n")
6428 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6430 return CMD_WARNING_CONFIG_FAILED
;
6432 return bgp_vty_return(vty
, peer_ttl_security_hops_unset(peer
));
6435 DEFUN (neighbor_addpath_tx_all_paths
,
6436 neighbor_addpath_tx_all_paths_cmd
,
6437 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
6440 "Use addpath to advertise all paths to a neighbor\n")
6445 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6447 return CMD_WARNING_CONFIG_FAILED
;
6449 bgp_addpath_set_peer_type(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6454 ALIAS_HIDDEN(neighbor_addpath_tx_all_paths
,
6455 neighbor_addpath_tx_all_paths_hidden_cmd
,
6456 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
6457 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6458 "Use addpath to advertise all paths to a neighbor\n")
6460 DEFUN (no_neighbor_addpath_tx_all_paths
,
6461 no_neighbor_addpath_tx_all_paths_cmd
,
6462 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
6466 "Use addpath to advertise all paths to a neighbor\n")
6471 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6473 return CMD_WARNING_CONFIG_FAILED
;
6475 if (peer
->addpath_type
[bgp_node_afi(vty
)][bgp_node_safi(vty
)]
6476 != BGP_ADDPATH_ALL
) {
6478 "%% Peer not currently configured to transmit all paths.");
6479 return CMD_WARNING_CONFIG_FAILED
;
6482 bgp_addpath_set_peer_type(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6488 ALIAS_HIDDEN(no_neighbor_addpath_tx_all_paths
,
6489 no_neighbor_addpath_tx_all_paths_hidden_cmd
,
6490 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
6491 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6492 "Use addpath to advertise all paths to a neighbor\n")
6494 DEFUN (neighbor_addpath_tx_bestpath_per_as
,
6495 neighbor_addpath_tx_bestpath_per_as_cmd
,
6496 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
6499 "Use addpath to advertise the bestpath per each neighboring AS\n")
6504 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6506 return CMD_WARNING_CONFIG_FAILED
;
6508 bgp_addpath_set_peer_type(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6509 BGP_ADDPATH_BEST_PER_AS
);
6514 ALIAS_HIDDEN(neighbor_addpath_tx_bestpath_per_as
,
6515 neighbor_addpath_tx_bestpath_per_as_hidden_cmd
,
6516 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
6517 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6518 "Use addpath to advertise the bestpath per each neighboring AS\n")
6520 DEFUN (no_neighbor_addpath_tx_bestpath_per_as
,
6521 no_neighbor_addpath_tx_bestpath_per_as_cmd
,
6522 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
6526 "Use addpath to advertise the bestpath per each neighboring AS\n")
6531 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6533 return CMD_WARNING_CONFIG_FAILED
;
6535 if (peer
->addpath_type
[bgp_node_afi(vty
)][bgp_node_safi(vty
)]
6536 != BGP_ADDPATH_BEST_PER_AS
) {
6538 "%% Peer not currently configured to transmit all best path per as.");
6539 return CMD_WARNING_CONFIG_FAILED
;
6542 bgp_addpath_set_peer_type(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6548 ALIAS_HIDDEN(no_neighbor_addpath_tx_bestpath_per_as
,
6549 no_neighbor_addpath_tx_bestpath_per_as_hidden_cmd
,
6550 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
6551 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6552 "Use addpath to advertise the bestpath per each neighboring AS\n")
6555 neighbor_aspath_loop_detection
, neighbor_aspath_loop_detection_cmd
,
6556 "neighbor <A.B.C.D|X:X::X:X|WORD>$neighbor sender-as-path-loop-detection",
6559 "Detect AS loops before sending to neighbor\n")
6563 peer
= peer_and_group_lookup_vty(vty
, neighbor
);
6565 return CMD_WARNING_CONFIG_FAILED
;
6567 peer
->as_path_loop_detection
= true;
6573 no_neighbor_aspath_loop_detection
,
6574 no_neighbor_aspath_loop_detection_cmd
,
6575 "no neighbor <A.B.C.D|X:X::X:X|WORD>$neighbor sender-as-path-loop-detection",
6579 "Detect AS loops before sending to neighbor\n")
6583 peer
= peer_and_group_lookup_vty(vty
, neighbor
);
6585 return CMD_WARNING_CONFIG_FAILED
;
6587 peer
->as_path_loop_detection
= false;
6592 static int set_ecom_list(struct vty
*vty
, int argc
, struct cmd_token
**argv
,
6593 struct ecommunity
**list
)
6595 struct ecommunity
*ecom
= NULL
;
6596 struct ecommunity
*ecomadd
;
6598 for (; argc
; --argc
, ++argv
) {
6600 ecomadd
= ecommunity_str2com(argv
[0]->arg
,
6601 ECOMMUNITY_ROUTE_TARGET
, 0);
6603 vty_out(vty
, "Malformed community-list value\n");
6605 ecommunity_free(&ecom
);
6606 return CMD_WARNING_CONFIG_FAILED
;
6610 ecommunity_merge(ecom
, ecomadd
);
6611 ecommunity_free(&ecomadd
);
6618 ecommunity_free(&*list
);
6626 * v2vimport is true if we are handling a `import vrf ...` command
6628 static afi_t
vpn_policy_getafi(struct vty
*vty
, struct bgp
*bgp
, bool v2vimport
)
6632 switch (vty
->node
) {
6641 "%% context error: valid only in address-family <ipv4|ipv6> unicast block\n");
6646 if (CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
6647 BGP_CONFIG_VRF_TO_VRF_IMPORT
)
6648 || CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
6649 BGP_CONFIG_VRF_TO_VRF_EXPORT
)) {
6651 "%% error: Please unconfigure import vrf commands before using vpn commands\n");
6655 if (CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
6656 BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT
)
6657 || CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
6658 BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT
)) {
6660 "%% error: Please unconfigure vpn to vrf commands before using import vrf commands\n");
6667 DEFPY (af_rd_vpn_export
,
6668 af_rd_vpn_export_cmd
,
6669 "[no] rd vpn export ASN:NN_OR_IP-ADDRESS:NN$rd_str",
6671 "Specify route distinguisher\n"
6672 "Between current address-family and vpn\n"
6673 "For routes leaked from current address-family to vpn\n"
6674 "Route Distinguisher (<as-number>:<number> | <ip-address>:<number>)\n")
6676 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6677 struct prefix_rd prd
;
6683 if (argv_find(argv
, argc
, "no", &idx
))
6687 ret
= str2prefix_rd(rd_str
, &prd
);
6689 vty_out(vty
, "%% Malformed rd\n");
6690 return CMD_WARNING_CONFIG_FAILED
;
6694 afi
= vpn_policy_getafi(vty
, bgp
, false);
6696 return CMD_WARNING_CONFIG_FAILED
;
6699 * pre-change: un-export vpn routes (vpn->vrf routes unaffected)
6701 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6702 bgp_get_default(), bgp
);
6705 bgp
->vpn_policy
[afi
].tovpn_rd
= prd
;
6706 SET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6707 BGP_VPN_POLICY_TOVPN_RD_SET
);
6709 UNSET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6710 BGP_VPN_POLICY_TOVPN_RD_SET
);
6713 /* post-change: re-export vpn routes */
6714 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6715 bgp_get_default(), bgp
);
6720 ALIAS (af_rd_vpn_export
,
6721 af_no_rd_vpn_export_cmd
,
6724 "Specify route distinguisher\n"
6725 "Between current address-family and vpn\n"
6726 "For routes leaked from current address-family to vpn\n")
6728 DEFPY (af_label_vpn_export
,
6729 af_label_vpn_export_cmd
,
6730 "[no] label vpn export <(0-1048575)$label_val|auto$label_auto>",
6732 "label value for VRF\n"
6733 "Between current address-family and vpn\n"
6734 "For routes leaked from current address-family to vpn\n"
6735 "Label Value <0-1048575>\n"
6736 "Automatically assign a label\n")
6738 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6739 mpls_label_t label
= MPLS_LABEL_NONE
;
6744 if (argv_find(argv
, argc
, "no", &idx
))
6747 /* If "no ...", squash trailing parameter */
6753 label
= label_val
; /* parser should force unsigned */
6756 afi
= vpn_policy_getafi(vty
, bgp
, false);
6758 return CMD_WARNING_CONFIG_FAILED
;
6761 if (label_auto
&& CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
6762 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
))
6767 * pre-change: un-export vpn routes (vpn->vrf routes unaffected)
6769 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6770 bgp_get_default(), bgp
);
6772 if (!label_auto
&& CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
6773 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
)) {
6775 if (bgp
->vpn_policy
[afi
].tovpn_label
!= MPLS_LABEL_NONE
) {
6778 * label has previously been automatically
6779 * assigned by labelpool: release it
6781 * NB if tovpn_label == MPLS_LABEL_NONE it
6782 * means the automatic assignment is in flight
6783 * and therefore the labelpool callback must
6784 * detect that the auto label is not needed.
6787 bgp_lp_release(LP_TYPE_VRF
,
6788 &bgp
->vpn_policy
[afi
],
6789 bgp
->vpn_policy
[afi
].tovpn_label
);
6791 UNSET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6792 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
);
6795 bgp
->vpn_policy
[afi
].tovpn_label
= label
;
6797 SET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6798 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
);
6799 bgp_lp_get(LP_TYPE_VRF
, &bgp
->vpn_policy
[afi
],
6800 vpn_leak_label_callback
);
6803 /* post-change: re-export vpn routes */
6804 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6805 bgp_get_default(), bgp
);
6810 ALIAS (af_label_vpn_export
,
6811 af_no_label_vpn_export_cmd
,
6812 "no label vpn export",
6814 "label value for VRF\n"
6815 "Between current address-family and vpn\n"
6816 "For routes leaked from current address-family to vpn\n")
6818 DEFPY (af_nexthop_vpn_export
,
6819 af_nexthop_vpn_export_cmd
,
6820 "[no] nexthop vpn export <A.B.C.D|X:X::X:X>$nexthop_str",
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"
6828 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6834 if (argv_find(argv
, argc
, "no", &idx
))
6838 if (!sockunion2hostprefix(nexthop_str
, &p
))
6839 return CMD_WARNING_CONFIG_FAILED
;
6842 afi
= vpn_policy_getafi(vty
, bgp
, false);
6844 return CMD_WARNING_CONFIG_FAILED
;
6847 * pre-change: un-export vpn routes (vpn->vrf routes unaffected)
6849 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6850 bgp_get_default(), bgp
);
6853 bgp
->vpn_policy
[afi
].tovpn_nexthop
= p
;
6854 SET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6855 BGP_VPN_POLICY_TOVPN_NEXTHOP_SET
);
6857 UNSET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6858 BGP_VPN_POLICY_TOVPN_NEXTHOP_SET
);
6861 /* post-change: re-export vpn routes */
6862 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6863 bgp_get_default(), bgp
);
6868 ALIAS (af_nexthop_vpn_export
,
6869 af_no_nexthop_vpn_export_cmd
,
6870 "no nexthop vpn export",
6872 "Specify next hop to use for VRF advertised prefixes\n"
6873 "Between current address-family and vpn\n"
6874 "For routes leaked from current address-family to vpn\n")
6876 static int vpn_policy_getdirs(struct vty
*vty
, const char *dstr
, int *dodir
)
6878 if (!strcmp(dstr
, "import")) {
6879 dodir
[BGP_VPN_POLICY_DIR_FROMVPN
] = 1;
6880 } else if (!strcmp(dstr
, "export")) {
6881 dodir
[BGP_VPN_POLICY_DIR_TOVPN
] = 1;
6882 } else if (!strcmp(dstr
, "both")) {
6883 dodir
[BGP_VPN_POLICY_DIR_FROMVPN
] = 1;
6884 dodir
[BGP_VPN_POLICY_DIR_TOVPN
] = 1;
6886 vty_out(vty
, "%% direction parse error\n");
6887 return CMD_WARNING_CONFIG_FAILED
;
6892 DEFPY (af_rt_vpn_imexport
,
6893 af_rt_vpn_imexport_cmd
,
6894 "[no] <rt|route-target> vpn <import|export|both>$direction_str RTLIST...",
6896 "Specify route target list\n"
6897 "Specify route target list\n"
6898 "Between current address-family and vpn\n"
6899 "For routes leaked from vpn to current address-family: match any\n"
6900 "For routes leaked from current address-family to vpn: set\n"
6901 "both import: match any and export: set\n"
6902 "Space separated route target list (A.B.C.D:MN|EF:OPQR|GHJK:MN)\n")
6904 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6906 struct ecommunity
*ecom
= NULL
;
6907 int dodir
[BGP_VPN_POLICY_DIR_MAX
] = {0};
6908 vpn_policy_direction_t dir
;
6913 if (argv_find(argv
, argc
, "no", &idx
))
6916 afi
= vpn_policy_getafi(vty
, bgp
, false);
6918 return CMD_WARNING_CONFIG_FAILED
;
6920 ret
= vpn_policy_getdirs(vty
, direction_str
, dodir
);
6921 if (ret
!= CMD_SUCCESS
)
6925 if (!argv_find(argv
, argc
, "RTLIST", &idx
)) {
6926 vty_out(vty
, "%% Missing RTLIST\n");
6927 return CMD_WARNING_CONFIG_FAILED
;
6929 ret
= set_ecom_list(vty
, argc
- idx
, argv
+ idx
, &ecom
);
6930 if (ret
!= CMD_SUCCESS
) {
6935 for (dir
= 0; dir
< BGP_VPN_POLICY_DIR_MAX
; ++dir
) {
6939 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
6942 if (bgp
->vpn_policy
[afi
].rtlist
[dir
])
6944 &bgp
->vpn_policy
[afi
].rtlist
[dir
]);
6945 bgp
->vpn_policy
[afi
].rtlist
[dir
] =
6946 ecommunity_dup(ecom
);
6948 if (bgp
->vpn_policy
[afi
].rtlist
[dir
])
6950 &bgp
->vpn_policy
[afi
].rtlist
[dir
]);
6951 bgp
->vpn_policy
[afi
].rtlist
[dir
] = NULL
;
6954 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
6958 ecommunity_free(&ecom
);
6963 ALIAS (af_rt_vpn_imexport
,
6964 af_no_rt_vpn_imexport_cmd
,
6965 "no <rt|route-target> vpn <import|export|both>$direction_str",
6967 "Specify route target list\n"
6968 "Specify route target list\n"
6969 "Between current address-family and vpn\n"
6970 "For routes leaked from vpn to current address-family\n"
6971 "For routes leaked from current address-family to vpn\n"
6972 "both import and export\n")
6974 DEFPY (af_route_map_vpn_imexport
,
6975 af_route_map_vpn_imexport_cmd
,
6976 /* future: "route-map <vpn|evpn|vrf NAME> <import|export> RMAP" */
6977 "[no] route-map vpn <import|export>$direction_str RMAP$rmap_str",
6979 "Specify route map\n"
6980 "Between current address-family and vpn\n"
6981 "For routes leaked from vpn to current address-family\n"
6982 "For routes leaked from current address-family to vpn\n"
6983 "name of route-map\n")
6985 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6987 int dodir
[BGP_VPN_POLICY_DIR_MAX
] = {0};
6988 vpn_policy_direction_t dir
;
6993 if (argv_find(argv
, argc
, "no", &idx
))
6996 afi
= vpn_policy_getafi(vty
, bgp
, false);
6998 return CMD_WARNING_CONFIG_FAILED
;
7000 ret
= vpn_policy_getdirs(vty
, direction_str
, dodir
);
7001 if (ret
!= CMD_SUCCESS
)
7004 for (dir
= 0; dir
< BGP_VPN_POLICY_DIR_MAX
; ++dir
) {
7008 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
7011 if (bgp
->vpn_policy
[afi
].rmap_name
[dir
])
7012 XFREE(MTYPE_ROUTE_MAP_NAME
,
7013 bgp
->vpn_policy
[afi
].rmap_name
[dir
]);
7014 bgp
->vpn_policy
[afi
].rmap_name
[dir
] = XSTRDUP(
7015 MTYPE_ROUTE_MAP_NAME
, rmap_str
);
7016 bgp
->vpn_policy
[afi
].rmap
[dir
] =
7017 route_map_lookup_warn_noexist(vty
, rmap_str
);
7018 if (!bgp
->vpn_policy
[afi
].rmap
[dir
])
7021 if (bgp
->vpn_policy
[afi
].rmap_name
[dir
])
7022 XFREE(MTYPE_ROUTE_MAP_NAME
,
7023 bgp
->vpn_policy
[afi
].rmap_name
[dir
]);
7024 bgp
->vpn_policy
[afi
].rmap_name
[dir
] = NULL
;
7025 bgp
->vpn_policy
[afi
].rmap
[dir
] = NULL
;
7028 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
7034 ALIAS (af_route_map_vpn_imexport
,
7035 af_no_route_map_vpn_imexport_cmd
,
7036 "no route-map vpn <import|export>$direction_str",
7038 "Specify route map\n"
7039 "Between current address-family and vpn\n"
7040 "For routes leaked from vpn to current address-family\n"
7041 "For routes leaked from current address-family to vpn\n")
7043 DEFPY(af_import_vrf_route_map
, af_import_vrf_route_map_cmd
,
7044 "[no] import vrf route-map RMAP$rmap_str",
7046 "Import routes from another VRF\n"
7047 "Vrf routes being filtered\n"
7048 "Specify route map\n"
7049 "name of route-map\n")
7051 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
7052 vpn_policy_direction_t dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
7056 struct bgp
*bgp_default
;
7058 if (argv_find(argv
, argc
, "no", &idx
))
7061 afi
= vpn_policy_getafi(vty
, bgp
, true);
7063 return CMD_WARNING_CONFIG_FAILED
;
7065 bgp_default
= bgp_get_default();
7070 /* Auto-create assuming the same AS */
7071 ret
= bgp_get_vty(&bgp_default
, &as
, NULL
,
7072 BGP_INSTANCE_TYPE_DEFAULT
);
7076 "VRF default is not configured as a bgp instance\n");
7081 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
7084 if (bgp
->vpn_policy
[afi
].rmap_name
[dir
])
7085 XFREE(MTYPE_ROUTE_MAP_NAME
,
7086 bgp
->vpn_policy
[afi
].rmap_name
[dir
]);
7087 bgp
->vpn_policy
[afi
].rmap_name
[dir
] =
7088 XSTRDUP(MTYPE_ROUTE_MAP_NAME
, rmap_str
);
7089 bgp
->vpn_policy
[afi
].rmap
[dir
] =
7090 route_map_lookup_warn_noexist(vty
, rmap_str
);
7091 if (!bgp
->vpn_policy
[afi
].rmap
[dir
])
7094 if (bgp
->vpn_policy
[afi
].rmap_name
[dir
])
7095 XFREE(MTYPE_ROUTE_MAP_NAME
,
7096 bgp
->vpn_policy
[afi
].rmap_name
[dir
]);
7097 bgp
->vpn_policy
[afi
].rmap_name
[dir
] = NULL
;
7098 bgp
->vpn_policy
[afi
].rmap
[dir
] = NULL
;
7101 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
7106 ALIAS(af_import_vrf_route_map
, af_no_import_vrf_route_map_cmd
,
7107 "no import vrf route-map",
7109 "Import routes from another VRF\n"
7110 "Vrf routes being filtered\n"
7111 "Specify route map\n")
7113 DEFPY(bgp_imexport_vrf
, bgp_imexport_vrf_cmd
,
7114 "[no] import vrf VIEWVRFNAME$import_name",
7116 "Import routes from another VRF\n"
7117 "VRF to import from\n"
7118 "The name of the VRF\n")
7120 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
7121 struct listnode
*node
;
7122 struct bgp
*vrf_bgp
, *bgp_default
;
7125 bool remove
= false;
7128 enum bgp_instance_type bgp_type
= BGP_INSTANCE_TYPE_VRF
;
7132 if (import_name
== NULL
) {
7133 vty_out(vty
, "%% Missing import name\n");
7137 if (argv_find(argv
, argc
, "no", &idx
))
7140 afi
= vpn_policy_getafi(vty
, bgp
, true);
7142 return CMD_WARNING_CONFIG_FAILED
;
7144 safi
= bgp_node_safi(vty
);
7146 if (((BGP_INSTANCE_TYPE_DEFAULT
== bgp
->inst_type
)
7147 && (strcmp(import_name
, VRF_DEFAULT_NAME
) == 0))
7148 || (bgp
->name
&& (strcmp(import_name
, bgp
->name
) == 0))) {
7149 vty_out(vty
, "%% Cannot %s vrf %s into itself\n",
7150 remove
? "unimport" : "import", import_name
);
7154 bgp_default
= bgp_get_default();
7156 /* Auto-create assuming the same AS */
7157 ret
= bgp_get_vty(&bgp_default
, &as
, NULL
,
7158 BGP_INSTANCE_TYPE_DEFAULT
);
7162 "VRF default is not configured as a bgp instance\n");
7167 vrf_bgp
= bgp_lookup_by_name(import_name
);
7169 if (strcmp(import_name
, VRF_DEFAULT_NAME
) == 0)
7170 vrf_bgp
= bgp_default
;
7172 /* Auto-create assuming the same AS */
7173 ret
= bgp_get_vty(&vrf_bgp
, &as
, import_name
, bgp_type
);
7177 "VRF %s is not configured as a bgp instance\n",
7184 vrf_unimport_from_vrf(bgp
, vrf_bgp
, afi
, safi
);
7186 /* Already importing from "import_vrf"? */
7187 for (ALL_LIST_ELEMENTS_RO(bgp
->vpn_policy
[afi
].import_vrf
, node
,
7189 if (strcmp(vname
, import_name
) == 0)
7193 vrf_import_from_vrf(bgp
, vrf_bgp
, afi
, safi
);
7199 /* This command is valid only in a bgp vrf instance or the default instance */
7200 DEFPY (bgp_imexport_vpn
,
7201 bgp_imexport_vpn_cmd
,
7202 "[no] <import|export>$direction_str vpn",
7204 "Import routes to this address-family\n"
7205 "Export routes from this address-family\n"
7206 "to/from default instance VPN RIB\n")
7208 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
7215 vpn_policy_direction_t dir
;
7217 if (argv_find(argv
, argc
, "no", &idx
))
7220 if (BGP_INSTANCE_TYPE_VRF
!= bgp
->inst_type
&&
7221 BGP_INSTANCE_TYPE_DEFAULT
!= bgp
->inst_type
) {
7223 vty_out(vty
, "%% import|export vpn valid only for bgp vrf or default instance\n");
7224 return CMD_WARNING_CONFIG_FAILED
;
7227 afi
= bgp_node_afi(vty
);
7228 safi
= bgp_node_safi(vty
);
7229 if ((SAFI_UNICAST
!= safi
) || ((AFI_IP
!= afi
) && (AFI_IP6
!= afi
))) {
7230 vty_out(vty
, "%% import|export vpn valid only for unicast ipv4|ipv6\n");
7231 return CMD_WARNING_CONFIG_FAILED
;
7234 if (!strcmp(direction_str
, "import")) {
7235 flag
= BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT
;
7236 dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
7237 } else if (!strcmp(direction_str
, "export")) {
7238 flag
= BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT
;
7239 dir
= BGP_VPN_POLICY_DIR_TOVPN
;
7241 vty_out(vty
, "%% unknown direction %s\n", direction_str
);
7242 return CMD_WARNING_CONFIG_FAILED
;
7245 previous_state
= CHECK_FLAG(bgp
->af_flags
[afi
][safi
], flag
);
7248 SET_FLAG(bgp
->af_flags
[afi
][safi
], flag
);
7249 if (!previous_state
) {
7250 /* trigger export current vrf */
7251 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
7254 if (previous_state
) {
7255 /* trigger un-export current vrf */
7256 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
7258 UNSET_FLAG(bgp
->af_flags
[afi
][safi
], flag
);
7264 DEFPY (af_routetarget_import
,
7265 af_routetarget_import_cmd
,
7266 "[no] <rt|route-target> redirect import RTLIST...",
7268 "Specify route target list\n"
7269 "Specify route target list\n"
7270 "Flow-spec redirect type route target\n"
7271 "Import routes to this address-family\n"
7272 "Space separated route target list (A.B.C.D:MN|EF:OPQR|GHJK:MN)\n")
7274 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
7276 struct ecommunity
*ecom
= NULL
;
7281 if (argv_find(argv
, argc
, "no", &idx
))
7284 afi
= vpn_policy_getafi(vty
, bgp
, false);
7286 return CMD_WARNING_CONFIG_FAILED
;
7289 if (!argv_find(argv
, argc
, "RTLIST", &idx
)) {
7290 vty_out(vty
, "%% Missing RTLIST\n");
7291 return CMD_WARNING_CONFIG_FAILED
;
7293 ret
= set_ecom_list(vty
, argc
- idx
, argv
+ idx
, &ecom
);
7294 if (ret
!= CMD_SUCCESS
)
7299 if (bgp
->vpn_policy
[afi
].import_redirect_rtlist
)
7300 ecommunity_free(&bgp
->vpn_policy
[afi
]
7301 .import_redirect_rtlist
);
7302 bgp
->vpn_policy
[afi
].import_redirect_rtlist
=
7303 ecommunity_dup(ecom
);
7305 if (bgp
->vpn_policy
[afi
].import_redirect_rtlist
)
7306 ecommunity_free(&bgp
->vpn_policy
[afi
]
7307 .import_redirect_rtlist
);
7308 bgp
->vpn_policy
[afi
].import_redirect_rtlist
= NULL
;
7312 ecommunity_free(&ecom
);
7317 DEFUN_NOSH (address_family_ipv4_safi
,
7318 address_family_ipv4_safi_cmd
,
7319 "address-family ipv4 [<unicast|multicast|vpn|labeled-unicast|flowspec>]",
7320 "Enter Address Family command mode\n"
7322 BGP_SAFI_WITH_LABEL_HELP_STR
)
7326 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
7327 safi_t safi
= bgp_vty_safi_from_str(argv
[2]->text
);
7328 if (bgp
->inst_type
!= BGP_INSTANCE_TYPE_DEFAULT
7329 && safi
!= SAFI_UNICAST
&& safi
!= SAFI_MULTICAST
7330 && safi
!= SAFI_EVPN
) {
7332 "Only Unicast/Multicast/EVPN SAFIs supported in non-core instances.\n");
7333 return CMD_WARNING_CONFIG_FAILED
;
7335 vty
->node
= bgp_node_type(AFI_IP
, safi
);
7337 vty
->node
= BGP_IPV4_NODE
;
7342 DEFUN_NOSH (address_family_ipv6_safi
,
7343 address_family_ipv6_safi_cmd
,
7344 "address-family ipv6 [<unicast|multicast|vpn|labeled-unicast|flowspec>]",
7345 "Enter Address Family command mode\n"
7347 BGP_SAFI_WITH_LABEL_HELP_STR
)
7350 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
7351 safi_t safi
= bgp_vty_safi_from_str(argv
[2]->text
);
7352 if (bgp
->inst_type
!= BGP_INSTANCE_TYPE_DEFAULT
7353 && safi
!= SAFI_UNICAST
&& safi
!= SAFI_MULTICAST
7354 && safi
!= SAFI_EVPN
) {
7356 "Only Unicast/Multicast/EVPN SAFIs supported in non-core instances.\n");
7357 return CMD_WARNING_CONFIG_FAILED
;
7359 vty
->node
= bgp_node_type(AFI_IP6
, safi
);
7361 vty
->node
= BGP_IPV6_NODE
;
7366 #ifdef KEEP_OLD_VPN_COMMANDS
7367 DEFUN_NOSH (address_family_vpnv4
,
7368 address_family_vpnv4_cmd
,
7369 "address-family vpnv4 [unicast]",
7370 "Enter Address Family command mode\n"
7372 "Address Family modifier\n")
7374 vty
->node
= BGP_VPNV4_NODE
;
7378 DEFUN_NOSH (address_family_vpnv6
,
7379 address_family_vpnv6_cmd
,
7380 "address-family vpnv6 [unicast]",
7381 "Enter Address Family command mode\n"
7383 "Address Family modifier\n")
7385 vty
->node
= BGP_VPNV6_NODE
;
7388 #endif /* KEEP_OLD_VPN_COMMANDS */
7390 DEFUN_NOSH (address_family_evpn
,
7391 address_family_evpn_cmd
,
7392 "address-family l2vpn evpn",
7393 "Enter Address Family command mode\n"
7395 "Address Family modifier\n")
7397 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
7398 vty
->node
= BGP_EVPN_NODE
;
7402 DEFUN_NOSH (exit_address_family
,
7403 exit_address_family_cmd
,
7404 "exit-address-family",
7405 "Exit from Address Family configuration mode\n")
7407 if (vty
->node
== BGP_IPV4_NODE
|| vty
->node
== BGP_IPV4M_NODE
7408 || vty
->node
== BGP_IPV4L_NODE
|| vty
->node
== BGP_VPNV4_NODE
7409 || vty
->node
== BGP_IPV6_NODE
|| vty
->node
== BGP_IPV6M_NODE
7410 || vty
->node
== BGP_IPV6L_NODE
|| vty
->node
== BGP_VPNV6_NODE
7411 || vty
->node
== BGP_EVPN_NODE
7412 || vty
->node
== BGP_FLOWSPECV4_NODE
7413 || vty
->node
== BGP_FLOWSPECV6_NODE
)
7414 vty
->node
= BGP_NODE
;
7418 /* Recalculate bestpath and re-advertise a prefix */
7419 static int bgp_clear_prefix(struct vty
*vty
, const char *view_name
,
7420 const char *ip_str
, afi_t afi
, safi_t safi
,
7421 struct prefix_rd
*prd
)
7424 struct prefix match
;
7425 struct bgp_node
*rn
;
7426 struct bgp_node
*rm
;
7428 struct bgp_table
*table
;
7429 struct bgp_table
*rib
;
7431 /* BGP structure lookup. */
7433 bgp
= bgp_lookup_by_name(view_name
);
7435 vty_out(vty
, "%% Can't find BGP instance %s\n",
7440 bgp
= bgp_get_default();
7442 vty_out(vty
, "%% No BGP process is configured\n");
7447 /* Check IP address argument. */
7448 ret
= str2prefix(ip_str
, &match
);
7450 vty_out(vty
, "%% address is malformed\n");
7454 match
.family
= afi2family(afi
);
7455 rib
= bgp
->rib
[afi
][safi
];
7457 if (safi
== SAFI_MPLS_VPN
) {
7458 for (rn
= bgp_table_top(rib
); rn
; rn
= bgp_route_next(rn
)) {
7459 if (prd
&& memcmp(rn
->p
.u
.val
, prd
->val
, 8) != 0)
7462 table
= bgp_node_get_bgp_table_info(rn
);
7463 if (table
!= NULL
) {
7465 if ((rm
= bgp_node_match(table
, &match
))
7468 == match
.prefixlen
) {
7470 BGP_NODE_USER_CLEAR
);
7471 bgp_process(bgp
, rm
, afi
, safi
);
7473 bgp_unlock_node(rm
);
7478 if ((rn
= bgp_node_match(rib
, &match
)) != NULL
) {
7479 if (rn
->p
.prefixlen
== match
.prefixlen
) {
7480 SET_FLAG(rn
->flags
, BGP_NODE_USER_CLEAR
);
7481 bgp_process(bgp
, rn
, afi
, safi
);
7483 bgp_unlock_node(rn
);
7490 /* one clear bgp command to rule them all */
7491 DEFUN (clear_ip_bgp_all
,
7492 clear_ip_bgp_all_cmd
,
7493 "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>]",
7497 BGP_INSTANCE_HELP_STR
7500 BGP_SAFI_WITH_LABEL_HELP_STR
7501 "Address Family modifier\n"
7503 "BGP IPv4 neighbor to clear\n"
7504 "BGP IPv6 neighbor to clear\n"
7505 "BGP neighbor on interface to clear\n"
7506 "Clear peers with the AS number\n"
7507 "Clear all external peers\n"
7508 "Clear all members of peer-group\n"
7509 "BGP peer-group name\n"
7514 "Push out prefix-list ORF and do inbound soft reconfig\n"
7519 afi_t afi
= AFI_UNSPEC
;
7520 safi_t safi
= SAFI_UNSPEC
;
7521 enum clear_sort clr_sort
= clear_peer
;
7522 enum bgp_clear_type clr_type
;
7523 char *clr_arg
= NULL
;
7527 /* clear [ip] bgp */
7528 if (argv_find(argv
, argc
, "ip", &idx
))
7531 /* [<vrf> VIEWVRFNAME] */
7532 if (argv_find(argv
, argc
, "vrf", &idx
)) {
7533 vrf
= argv
[idx
+ 1]->arg
;
7535 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
7537 } else if (argv_find(argv
, argc
, "view", &idx
)) {
7538 /* [<view> VIEWVRFNAME] */
7539 vrf
= argv
[idx
+ 1]->arg
;
7542 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
7543 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
))
7544 argv_find_and_parse_safi(argv
, argc
, &idx
, &safi
);
7546 /* <*|A.B.C.D|X:X::X:X|WORD|(1-4294967295)|external|peer-group PGNAME> */
7547 if (argv_find(argv
, argc
, "*", &idx
)) {
7548 clr_sort
= clear_all
;
7549 } else if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7550 clr_sort
= clear_peer
;
7551 clr_arg
= argv
[idx
]->arg
;
7552 } else if (argv_find(argv
, argc
, "X:X::X:X", &idx
)) {
7553 clr_sort
= clear_peer
;
7554 clr_arg
= argv
[idx
]->arg
;
7555 } else if (argv_find(argv
, argc
, "peer-group", &idx
)) {
7556 clr_sort
= clear_group
;
7558 clr_arg
= argv
[idx
]->arg
;
7559 } else if (argv_find(argv
, argc
, "PGNAME", &idx
)) {
7560 clr_sort
= clear_peer
;
7561 clr_arg
= argv
[idx
]->arg
;
7562 } else if (argv_find(argv
, argc
, "WORD", &idx
)) {
7563 clr_sort
= clear_peer
;
7564 clr_arg
= argv
[idx
]->arg
;
7565 } else if (argv_find(argv
, argc
, "(1-4294967295)", &idx
)) {
7566 clr_sort
= clear_as
;
7567 clr_arg
= argv
[idx
]->arg
;
7568 } else if (argv_find(argv
, argc
, "external", &idx
)) {
7569 clr_sort
= clear_external
;
7572 /* [<soft [<in|out>]|in [prefix-filter]|out>] */
7573 if (argv_find(argv
, argc
, "soft", &idx
)) {
7574 if (argv_find(argv
, argc
, "in", &idx
)
7575 || argv_find(argv
, argc
, "out", &idx
))
7576 clr_type
= strmatch(argv
[idx
]->text
, "in")
7578 : BGP_CLEAR_SOFT_OUT
;
7580 clr_type
= BGP_CLEAR_SOFT_BOTH
;
7581 } else if (argv_find(argv
, argc
, "in", &idx
)) {
7582 clr_type
= argv_find(argv
, argc
, "prefix-filter", &idx
)
7583 ? BGP_CLEAR_SOFT_IN_ORF_PREFIX
7584 : BGP_CLEAR_SOFT_IN
;
7585 } else if (argv_find(argv
, argc
, "out", &idx
)) {
7586 clr_type
= BGP_CLEAR_SOFT_OUT
;
7588 clr_type
= BGP_CLEAR_SOFT_NONE
;
7590 return bgp_clear_vty(vty
, vrf
, afi
, safi
, clr_sort
, clr_type
, clr_arg
);
7593 DEFUN (clear_ip_bgp_prefix
,
7594 clear_ip_bgp_prefix_cmd
,
7595 "clear [ip] bgp [<view|vrf> VIEWVRFNAME] prefix A.B.C.D/M",
7599 BGP_INSTANCE_HELP_STR
7600 "Clear bestpath and re-advertise\n"
7604 char *prefix
= NULL
;
7608 /* [<view|vrf> VIEWVRFNAME] */
7609 if (argv_find(argv
, argc
, "vrf", &idx
)) {
7610 vrf
= argv
[idx
+ 1]->arg
;
7612 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
7614 } else if (argv_find(argv
, argc
, "view", &idx
)) {
7615 /* [<view> VIEWVRFNAME] */
7616 vrf
= argv
[idx
+ 1]->arg
;
7620 prefix
= argv
[argc
- 1]->arg
;
7622 return bgp_clear_prefix(vty
, vrf
, prefix
, AFI_IP
, SAFI_UNICAST
, NULL
);
7625 DEFUN (clear_bgp_ipv6_safi_prefix
,
7626 clear_bgp_ipv6_safi_prefix_cmd
,
7627 "clear [ip] bgp ipv6 "BGP_SAFI_CMD_STR
" prefix X:X::X:X/M",
7633 "Clear bestpath and re-advertise\n"
7637 int idx_ipv6_prefix
= 0;
7638 safi_t safi
= SAFI_UNICAST
;
7639 char *prefix
= argv_find(argv
, argc
, "X:X::X:X/M", &idx_ipv6_prefix
) ?
7640 argv
[idx_ipv6_prefix
]->arg
: NULL
;
7642 argv_find_and_parse_safi(argv
, argc
, &idx_safi
, &safi
);
7643 return bgp_clear_prefix(
7644 vty
, NULL
, prefix
, AFI_IP6
,
7648 DEFUN (clear_bgp_instance_ipv6_safi_prefix
,
7649 clear_bgp_instance_ipv6_safi_prefix_cmd
,
7650 "clear [ip] bgp <view|vrf> VIEWVRFNAME ipv6 "BGP_SAFI_CMD_STR
" prefix X:X::X:X/M",
7654 BGP_INSTANCE_HELP_STR
7657 "Clear bestpath and re-advertise\n"
7661 int idx_vrfview
= 0;
7662 int idx_ipv6_prefix
= 0;
7663 safi_t safi
= SAFI_UNICAST
;
7664 char *prefix
= argv_find(argv
, argc
, "X:X::X:X/M", &idx_ipv6_prefix
) ?
7665 argv
[idx_ipv6_prefix
]->arg
: NULL
;
7666 char *vrfview
= NULL
;
7668 /* [<view|vrf> VIEWVRFNAME] */
7669 if (argv_find(argv
, argc
, "vrf", &idx_vrfview
)) {
7670 vrfview
= argv
[idx_vrfview
+ 1]->arg
;
7671 if (vrfview
&& strmatch(vrfview
, VRF_DEFAULT_NAME
))
7673 } else if (argv_find(argv
, argc
, "view", &idx_vrfview
)) {
7674 /* [<view> VIEWVRFNAME] */
7675 vrfview
= argv
[idx_vrfview
+ 1]->arg
;
7677 argv_find_and_parse_safi(argv
, argc
, &idx_safi
, &safi
);
7679 return bgp_clear_prefix(
7680 vty
, vrfview
, prefix
,
7681 AFI_IP6
, safi
, NULL
);
7684 DEFUN (show_bgp_views
,
7686 "show [ip] bgp views",
7690 "Show the defined BGP views\n")
7692 struct list
*inst
= bm
->bgp
;
7693 struct listnode
*node
;
7696 vty_out(vty
, "Defined BGP views:\n");
7697 for (ALL_LIST_ELEMENTS_RO(inst
, node
, bgp
)) {
7699 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_VRF
)
7701 vty_out(vty
, "\t%s (AS%u)\n", bgp
->name
? bgp
->name
: "(null)",
7708 DEFUN (show_bgp_vrfs
,
7710 "show [ip] bgp vrfs [json]",
7717 char buf
[ETHER_ADDR_STRLEN
];
7718 struct list
*inst
= bm
->bgp
;
7719 struct listnode
*node
;
7721 bool uj
= use_json(argc
, argv
);
7722 json_object
*json
= NULL
;
7723 json_object
*json_vrfs
= NULL
;
7727 json
= json_object_new_object();
7728 json_vrfs
= json_object_new_object();
7731 for (ALL_LIST_ELEMENTS_RO(inst
, node
, bgp
)) {
7732 const char *name
, *type
;
7734 struct listnode
*node2
, *nnode2
;
7735 int peers_cfg
, peers_estb
;
7736 json_object
*json_vrf
= NULL
;
7739 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_VIEW
)
7743 if (!uj
&& count
== 1) {
7745 "%4s %-5s %-16s %9s %10s %-37s\n",
7746 "Type", "Id", "routerId", "#PeersCfg",
7747 "#PeersEstb", "Name");
7748 vty_out(vty
, "%11s %-16s %-21s %-6s\n", " ",
7749 "L3-VNI", "RouterMAC", "Interface");
7752 peers_cfg
= peers_estb
= 0;
7754 json_vrf
= json_object_new_object();
7757 for (ALL_LIST_ELEMENTS(bgp
->peer
, node2
, nnode2
, peer
)) {
7758 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
7761 if (peer
->status
== Established
)
7765 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
) {
7766 name
= VRF_DEFAULT_NAME
;
7775 int64_t vrf_id_ui
= (bgp
->vrf_id
== VRF_UNKNOWN
)
7777 : (int64_t)bgp
->vrf_id
;
7778 json_object_string_add(json_vrf
, "type", type
);
7779 json_object_int_add(json_vrf
, "vrfId", vrf_id_ui
);
7780 json_object_string_add(json_vrf
, "routerId",
7781 inet_ntoa(bgp
->router_id
));
7782 json_object_int_add(json_vrf
, "numConfiguredPeers",
7784 json_object_int_add(json_vrf
, "numEstablishedPeers",
7787 json_object_int_add(json_vrf
, "l3vni", bgp
->l3vni
);
7788 json_object_string_add(
7790 prefix_mac2str(&bgp
->rmac
, buf
, sizeof(buf
)));
7791 json_object_string_add(json_vrf
, "interface",
7792 ifindex2ifname(bgp
->l3vni_svi_ifindex
,
7794 json_object_object_add(json_vrfs
, name
, json_vrf
);
7797 "%4s %-5d %-16s %-9u %-10u %-37s\n",
7799 bgp
->vrf_id
== VRF_UNKNOWN
? -1
7801 inet_ntoa(bgp
->router_id
), peers_cfg
,
7803 vty_out(vty
,"%11s %-16u %-21s %-20s\n", " ",
7805 prefix_mac2str(&bgp
->rmac
, buf
, sizeof(buf
)),
7806 ifindex2ifname(bgp
->l3vni_svi_ifindex
,
7812 json_object_object_add(json
, "vrfs", json_vrfs
);
7814 json_object_int_add(json
, "totalVrfs", count
);
7816 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
7817 json
, JSON_C_TO_STRING_PRETTY
));
7818 json_object_free(json
);
7822 "\nTotal number of VRFs (including default): %d\n",
7829 DEFUN (show_bgp_mac_hash
,
7830 show_bgp_mac_hash_cmd
,
7831 "show bgp mac hash",
7835 "Mac Address database\n")
7837 bgp_mac_dump_table(vty
);
7842 static void show_tip_entry(struct hash_bucket
*bucket
, void *args
)
7844 struct vty
*vty
= (struct vty
*)args
;
7845 struct tip_addr
*tip
= (struct tip_addr
*)bucket
->data
;
7847 vty_out(vty
, "addr: %s, count: %d\n", inet_ntoa(tip
->addr
),
7851 static void bgp_show_martian_nexthops(struct vty
*vty
, struct bgp
*bgp
)
7853 vty_out(vty
, "self nexthop database:\n");
7854 bgp_nexthop_show_address_hash(vty
, bgp
);
7856 vty_out(vty
, "Tunnel-ip database:\n");
7857 hash_iterate(bgp
->tip_hash
,
7858 (void (*)(struct hash_bucket
*, void *))show_tip_entry
,
7862 DEFUN(show_bgp_martian_nexthop_db
, show_bgp_martian_nexthop_db_cmd
,
7863 "show bgp [<view|vrf> VIEWVRFNAME] martian next-hop",
7864 SHOW_STR BGP_STR BGP_INSTANCE_HELP_STR
7865 "martian next-hops\n"
7866 "martian next-hop database\n")
7868 struct bgp
*bgp
= NULL
;
7872 /* [<vrf> VIEWVRFNAME] */
7873 if (argv_find(argv
, argc
, "vrf", &idx
)) {
7874 name
= argv
[idx
+ 1]->arg
;
7875 if (name
&& strmatch(name
, VRF_DEFAULT_NAME
))
7877 } else if (argv_find(argv
, argc
, "view", &idx
))
7878 /* [<view> VIEWVRFNAME] */
7879 name
= argv
[idx
+ 1]->arg
;
7881 bgp
= bgp_lookup_by_name(name
);
7883 bgp
= bgp_get_default();
7886 vty_out(vty
, "%% No BGP process is configured\n");
7889 bgp_show_martian_nexthops(vty
, bgp
);
7894 DEFUN (show_bgp_memory
,
7895 show_bgp_memory_cmd
,
7896 "show [ip] bgp memory",
7900 "Global BGP memory statistics\n")
7902 char memstrbuf
[MTYPE_MEMSTR_LEN
];
7903 unsigned long count
;
7905 /* RIB related usage stats */
7906 count
= mtype_stats_alloc(MTYPE_BGP_NODE
);
7907 vty_out(vty
, "%ld RIB nodes, using %s of memory\n", count
,
7908 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7909 count
* sizeof(struct bgp_node
)));
7911 count
= mtype_stats_alloc(MTYPE_BGP_ROUTE
);
7912 vty_out(vty
, "%ld BGP routes, using %s of memory\n", count
,
7913 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7914 count
* sizeof(struct bgp_path_info
)));
7915 if ((count
= mtype_stats_alloc(MTYPE_BGP_ROUTE_EXTRA
)))
7916 vty_out(vty
, "%ld BGP route ancillaries, using %s of memory\n",
7919 memstrbuf
, sizeof(memstrbuf
),
7920 count
* sizeof(struct bgp_path_info_extra
)));
7922 if ((count
= mtype_stats_alloc(MTYPE_BGP_STATIC
)))
7923 vty_out(vty
, "%ld Static routes, using %s of memory\n", count
,
7924 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7925 count
* sizeof(struct bgp_static
)));
7927 if ((count
= mtype_stats_alloc(MTYPE_BGP_PACKET
)))
7928 vty_out(vty
, "%ld Packets, using %s of memory\n", count
,
7929 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7930 count
* sizeof(struct bpacket
)));
7933 if ((count
= mtype_stats_alloc(MTYPE_BGP_ADJ_IN
)))
7934 vty_out(vty
, "%ld Adj-In entries, using %s of memory\n", count
,
7935 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7936 count
* sizeof(struct bgp_adj_in
)));
7937 if ((count
= mtype_stats_alloc(MTYPE_BGP_ADJ_OUT
)))
7938 vty_out(vty
, "%ld Adj-Out entries, using %s of memory\n", count
,
7939 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7940 count
* sizeof(struct bgp_adj_out
)));
7942 if ((count
= mtype_stats_alloc(MTYPE_BGP_NEXTHOP_CACHE
)))
7943 vty_out(vty
, "%ld Nexthop cache entries, using %s of memory\n",
7945 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7946 count
* sizeof(struct bgp_nexthop_cache
)));
7948 if ((count
= mtype_stats_alloc(MTYPE_BGP_DAMP_INFO
)))
7949 vty_out(vty
, "%ld Dampening entries, using %s of memory\n",
7951 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7952 count
* sizeof(struct bgp_damp_info
)));
7955 count
= attr_count();
7956 vty_out(vty
, "%ld BGP attributes, using %s of memory\n", count
,
7957 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7958 count
* sizeof(struct attr
)));
7960 if ((count
= attr_unknown_count()))
7961 vty_out(vty
, "%ld unknown attributes\n", count
);
7963 /* AS_PATH attributes */
7964 count
= aspath_count();
7965 vty_out(vty
, "%ld BGP AS-PATH entries, using %s of memory\n", count
,
7966 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7967 count
* sizeof(struct aspath
)));
7969 count
= mtype_stats_alloc(MTYPE_AS_SEG
);
7970 vty_out(vty
, "%ld BGP AS-PATH segments, using %s of memory\n", count
,
7971 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7972 count
* sizeof(struct assegment
)));
7974 /* Other attributes */
7975 if ((count
= community_count()))
7976 vty_out(vty
, "%ld BGP community entries, using %s of memory\n",
7977 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7978 count
* sizeof(struct community
)));
7979 if ((count
= mtype_stats_alloc(MTYPE_ECOMMUNITY
)))
7980 vty_out(vty
, "%ld BGP community entries, using %s of memory\n",
7981 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7982 count
* sizeof(struct ecommunity
)));
7983 if ((count
= mtype_stats_alloc(MTYPE_LCOMMUNITY
)))
7985 "%ld BGP large-community entries, using %s of memory\n",
7986 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7987 count
* sizeof(struct lcommunity
)));
7989 if ((count
= mtype_stats_alloc(MTYPE_CLUSTER
)))
7990 vty_out(vty
, "%ld Cluster lists, using %s of memory\n", count
,
7991 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7992 count
* sizeof(struct cluster_list
)));
7994 /* Peer related usage */
7995 count
= mtype_stats_alloc(MTYPE_BGP_PEER
);
7996 vty_out(vty
, "%ld peers, using %s of memory\n", count
,
7997 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7998 count
* sizeof(struct peer
)));
8000 if ((count
= mtype_stats_alloc(MTYPE_PEER_GROUP
)))
8001 vty_out(vty
, "%ld peer groups, using %s of memory\n", count
,
8002 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
8003 count
* sizeof(struct peer_group
)));
8006 if ((count
= mtype_stats_alloc(MTYPE_BGP_REGEXP
)))
8007 vty_out(vty
, "%ld compiled regexes, using %s of memory\n",
8008 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
8009 count
* sizeof(regex_t
)));
8013 static void bgp_show_bestpath_json(struct bgp
*bgp
, json_object
*json
)
8015 json_object
*bestpath
= json_object_new_object();
8017 if (bgp_flag_check(bgp
, BGP_FLAG_ASPATH_IGNORE
))
8018 json_object_string_add(bestpath
, "asPath", "ignore");
8020 if (bgp_flag_check(bgp
, BGP_FLAG_ASPATH_CONFED
))
8021 json_object_string_add(bestpath
, "asPath", "confed");
8023 if (bgp_flag_check(bgp
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
)) {
8024 if (bgp_flag_check(bgp
, BGP_FLAG_MULTIPATH_RELAX_AS_SET
))
8025 json_object_string_add(bestpath
, "multiPathRelax",
8028 json_object_string_add(bestpath
, "multiPathRelax",
8031 json_object_string_add(bestpath
, "multiPathRelax", "false");
8033 if (bgp_flag_check(bgp
, BGP_FLAG_COMPARE_ROUTER_ID
))
8034 json_object_string_add(bestpath
, "compareRouterId", "true");
8035 if (bgp_flag_check(bgp
, BGP_FLAG_MED_CONFED
)
8036 || bgp_flag_check(bgp
, BGP_FLAG_MED_MISSING_AS_WORST
)) {
8037 if (bgp_flag_check(bgp
, BGP_FLAG_MED_CONFED
))
8038 json_object_string_add(bestpath
, "med", "confed");
8039 if (bgp_flag_check(bgp
, BGP_FLAG_MED_MISSING_AS_WORST
))
8040 json_object_string_add(bestpath
, "med",
8041 "missing-as-worst");
8043 json_object_string_add(bestpath
, "med", "true");
8046 json_object_object_add(json
, "bestPath", bestpath
);
8049 /* Print the error code/subcode for why the peer is down */
8050 static void bgp_show_peer_reset(struct vty
* vty
, struct peer
*peer
,
8051 json_object
*json_peer
, bool use_json
)
8053 const char *code_str
;
8054 const char *subcode_str
;
8057 if (peer
->last_reset
== PEER_DOWN_NOTIFY_SEND
8058 || peer
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
) {
8059 char errorcodesubcode_hexstr
[5];
8060 char errorcodesubcode_str
[256];
8062 code_str
= bgp_notify_code_str(peer
->notify
.code
);
8063 subcode_str
= bgp_notify_subcode_str(
8065 peer
->notify
.subcode
);
8067 sprintf(errorcodesubcode_hexstr
, "%02X%02X",
8068 peer
->notify
.code
, peer
->notify
.subcode
);
8069 json_object_string_add(json_peer
,
8070 "lastErrorCodeSubcode",
8071 errorcodesubcode_hexstr
);
8072 snprintf(errorcodesubcode_str
, 255, "%s%s",
8073 code_str
, subcode_str
);
8074 json_object_string_add(json_peer
,
8075 "lastNotificationReason",
8076 errorcodesubcode_str
);
8077 if (peer
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
8078 && peer
->notify
.code
== BGP_NOTIFY_CEASE
8079 && (peer
->notify
.subcode
8080 == BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
8081 || peer
->notify
.subcode
8082 == BGP_NOTIFY_CEASE_ADMIN_RESET
)
8083 && peer
->notify
.length
) {
8085 const char *msg_str
;
8087 msg_str
= bgp_notify_admin_message(
8088 msgbuf
, sizeof(msgbuf
),
8089 (uint8_t *)peer
->notify
.data
,
8090 peer
->notify
.length
);
8092 json_object_string_add(
8094 "lastShutdownDescription",
8099 json_object_string_add(json_peer
, "lastResetDueTo",
8100 peer_down_str
[(int)peer
->last_reset
]);
8101 json_object_int_add(json_peer
, "lastResetCode",
8104 if (peer
->last_reset
== PEER_DOWN_NOTIFY_SEND
8105 || peer
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
) {
8106 code_str
= bgp_notify_code_str(peer
->notify
.code
);
8108 bgp_notify_subcode_str(peer
->notify
.code
,
8109 peer
->notify
.subcode
);
8110 vty_out(vty
, " Notification %s (%s%s)\n",
8111 peer
->last_reset
== PEER_DOWN_NOTIFY_SEND
8114 code_str
, subcode_str
);
8116 vty_out(vty
, " %s\n",
8117 peer_down_str
[(int)peer
->last_reset
]);
8122 static inline bool bgp_has_peer_failed(struct peer
*peer
, afi_t afi
,
8125 return ((peer
->status
!= Established
) ||
8126 !peer
->afc_recv
[afi
][safi
]);
8129 static void bgp_show_failed_summary(struct vty
*vty
, struct bgp
*bgp
,
8130 struct peer
*peer
, json_object
*json_peer
,
8131 int max_neighbor_width
, bool use_json
)
8133 char timebuf
[BGP_UPTIME_LEN
], dn_flag
[2];
8137 if (peer_dynamic_neighbor(peer
))
8138 json_object_boolean_true_add(json_peer
,
8141 json_object_string_add(json_peer
, "hostname",
8144 if (peer
->domainname
)
8145 json_object_string_add(json_peer
, "domainname",
8147 json_object_int_add(json_peer
, "connectionsEstablished",
8149 json_object_int_add(json_peer
, "connectionsDropped",
8151 peer_uptime(peer
->uptime
, timebuf
, BGP_UPTIME_LEN
,
8152 use_json
, json_peer
);
8153 if (peer
->status
== Established
)
8154 json_object_string_add(json_peer
, "lastResetDueTo",
8155 "AFI/SAFI Not Negotiated");
8157 bgp_show_peer_reset(NULL
, peer
, json_peer
, true);
8160 dn_flag
[0] = peer_dynamic_neighbor(peer
) ? '*' : '\0';
8162 && bgp_flag_check(bgp
, BGP_FLAG_SHOW_HOSTNAME
))
8163 len
= vty_out(vty
, "%s%s(%s)", dn_flag
,
8164 peer
->hostname
, peer
->host
);
8166 len
= vty_out(vty
, "%s%s", dn_flag
, peer
->host
);
8168 /* pad the neighbor column with spaces */
8169 if (len
< max_neighbor_width
)
8170 vty_out(vty
, "%*s", max_neighbor_width
- len
,
8172 vty_out(vty
, "%7d %7d %8s", peer
->established
,
8174 peer_uptime(peer
->uptime
, timebuf
,
8175 BGP_UPTIME_LEN
, 0, NULL
));
8176 if (peer
->status
== Established
)
8177 vty_out(vty
, " AFI/SAFI Not Negotiated\n");
8179 bgp_show_peer_reset(vty
, peer
, NULL
,
8185 /* Show BGP peer's summary information. */
8186 static int bgp_show_summary(struct vty
*vty
, struct bgp
*bgp
, int afi
, int safi
,
8187 bool show_failed
, bool use_json
)
8190 struct listnode
*node
, *nnode
;
8191 unsigned int count
= 0, dn_count
= 0;
8192 char timebuf
[BGP_UPTIME_LEN
], dn_flag
[2];
8193 char neighbor_buf
[VTY_BUFSIZ
];
8194 int neighbor_col_default_width
= 16;
8195 int len
, failed_count
= 0;
8196 int max_neighbor_width
= 0;
8198 json_object
*json
= NULL
;
8199 json_object
*json_peer
= NULL
;
8200 json_object
*json_peers
= NULL
;
8201 struct peer_af
*paf
;
8203 /* labeled-unicast routes are installed in the unicast table so in order
8205 * display the correct PfxRcd value we must look at SAFI_UNICAST
8208 if (safi
== SAFI_LABELED_UNICAST
)
8209 pfx_rcd_safi
= SAFI_UNICAST
;
8211 pfx_rcd_safi
= safi
;
8214 json
= json_object_new_object();
8215 json_peers
= json_object_new_object();
8216 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
8217 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
8220 if (peer
->afc
[afi
][safi
]) {
8221 /* See if we have at least a single failed peer */
8222 if (bgp_has_peer_failed(peer
, afi
, safi
))
8226 if (peer_dynamic_neighbor(peer
))
8231 /* Loop over all neighbors that will be displayed to determine
8233 * characters are needed for the Neighbor column
8235 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
8236 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
8239 if (peer
->afc
[afi
][safi
]) {
8240 memset(dn_flag
, '\0', sizeof(dn_flag
));
8241 if (peer_dynamic_neighbor(peer
))
8245 && bgp_flag_check(bgp
,
8246 BGP_FLAG_SHOW_HOSTNAME
))
8247 sprintf(neighbor_buf
, "%s%s(%s) ",
8248 dn_flag
, peer
->hostname
,
8251 sprintf(neighbor_buf
, "%s%s ", dn_flag
,
8254 len
= strlen(neighbor_buf
);
8256 if (len
> max_neighbor_width
)
8257 max_neighbor_width
= len
;
8259 /* See if we have at least a single failed peer */
8260 if (bgp_has_peer_failed(peer
, afi
, safi
))
8266 /* Originally we displayed the Neighbor column as 16
8267 * characters wide so make that the default
8269 if (max_neighbor_width
< neighbor_col_default_width
)
8270 max_neighbor_width
= neighbor_col_default_width
;
8273 if (show_failed
&& !failed_count
) {
8275 json_object_int_add(json
, "failedPeersCount", 0);
8276 json_object_int_add(json
, "dynamicPeers", dn_count
);
8277 json_object_int_add(json
, "totalPeers", count
);
8279 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
8280 json
, JSON_C_TO_STRING_PRETTY
));
8281 json_object_free(json
);
8283 vty_out(vty
, "%% No failed BGP neighbors found\n");
8284 vty_out(vty
, "\nTotal number of neighbors %d\n", count
);
8289 count
= 0; /* Reset the value as its used again */
8290 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
8291 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
8294 if (!peer
->afc
[afi
][safi
])
8299 char memstrbuf
[MTYPE_MEMSTR_LEN
];
8302 vrf_id_ui
= (bgp
->vrf_id
== VRF_UNKNOWN
)
8304 : (int64_t)bgp
->vrf_id
;
8306 /* Usage summary and header */
8308 json_object_string_add(
8310 inet_ntoa(bgp
->router_id
));
8311 json_object_int_add(json
, "as", bgp
->as
);
8312 json_object_int_add(json
, "vrfId", vrf_id_ui
);
8313 json_object_string_add(
8316 == BGP_INSTANCE_TYPE_DEFAULT
)
8321 "BGP router identifier %s, local AS number %u vrf-id %d",
8322 inet_ntoa(bgp
->router_id
), bgp
->as
,
8323 bgp
->vrf_id
== VRF_UNKNOWN
8325 : (int)bgp
->vrf_id
);
8329 if (bgp_update_delay_configured(bgp
)) {
8331 json_object_int_add(
8332 json
, "updateDelayLimit",
8333 bgp
->v_update_delay
);
8335 if (bgp
->v_update_delay
8336 != bgp
->v_establish_wait
)
8337 json_object_int_add(
8339 "updateDelayEstablishWait",
8340 bgp
->v_establish_wait
);
8342 if (bgp_update_delay_active(bgp
)) {
8343 json_object_string_add(
8345 "updateDelayFirstNeighbor",
8346 bgp
->update_delay_begin_time
);
8347 json_object_boolean_true_add(
8349 "updateDelayInProgress");
8351 if (bgp
->update_delay_over
) {
8352 json_object_string_add(
8354 "updateDelayFirstNeighbor",
8355 bgp
->update_delay_begin_time
);
8356 json_object_string_add(
8358 "updateDelayBestpathResumed",
8359 bgp
->update_delay_end_time
);
8360 json_object_string_add(
8362 "updateDelayZebraUpdateResume",
8363 bgp
->update_delay_zebra_resume_time
);
8364 json_object_string_add(
8366 "updateDelayPeerUpdateResume",
8367 bgp
->update_delay_peers_resume_time
);
8372 "Read-only mode update-delay limit: %d seconds\n",
8373 bgp
->v_update_delay
);
8374 if (bgp
->v_update_delay
8375 != bgp
->v_establish_wait
)
8377 " Establish wait: %d seconds\n",
8378 bgp
->v_establish_wait
);
8380 if (bgp_update_delay_active(bgp
)) {
8382 " First neighbor established: %s\n",
8383 bgp
->update_delay_begin_time
);
8385 " Delay in progress\n");
8387 if (bgp
->update_delay_over
) {
8389 " First neighbor established: %s\n",
8390 bgp
->update_delay_begin_time
);
8392 " Best-paths resumed: %s\n",
8393 bgp
->update_delay_end_time
);
8395 " zebra update resumed: %s\n",
8396 bgp
->update_delay_zebra_resume_time
);
8398 " peers update resumed: %s\n",
8399 bgp
->update_delay_peers_resume_time
);
8406 if (bgp_maxmed_onstartup_configured(bgp
)
8407 && bgp
->maxmed_active
)
8408 json_object_boolean_true_add(
8409 json
, "maxMedOnStartup");
8410 if (bgp
->v_maxmed_admin
)
8411 json_object_boolean_true_add(
8412 json
, "maxMedAdministrative");
8414 json_object_int_add(
8415 json
, "tableVersion",
8416 bgp_table_version(bgp
->rib
[afi
][safi
]));
8418 ents
= bgp_table_count(bgp
->rib
[afi
][safi
]);
8419 json_object_int_add(json
, "ribCount", ents
);
8420 json_object_int_add(
8422 ents
* sizeof(struct bgp_node
));
8424 ents
= bgp
->af_peer_count
[afi
][safi
];
8425 json_object_int_add(json
, "peerCount", ents
);
8426 json_object_int_add(json
, "peerMemory",
8427 ents
* sizeof(struct peer
));
8429 if ((ents
= listcount(bgp
->group
))) {
8430 json_object_int_add(
8431 json
, "peerGroupCount", ents
);
8432 json_object_int_add(
8433 json
, "peerGroupMemory",
8434 ents
* sizeof(struct
8438 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
8439 BGP_CONFIG_DAMPENING
))
8440 json_object_boolean_true_add(
8441 json
, "dampeningEnabled");
8443 if (bgp_maxmed_onstartup_configured(bgp
)
8444 && bgp
->maxmed_active
)
8446 "Max-med on-startup active\n");
8447 if (bgp
->v_maxmed_admin
)
8449 "Max-med administrative active\n");
8451 vty_out(vty
, "BGP table version %" PRIu64
"\n",
8452 bgp_table_version(bgp
->rib
[afi
][safi
]));
8454 ents
= bgp_table_count(bgp
->rib
[afi
][safi
]);
8456 "RIB entries %ld, using %s of memory\n",
8458 mtype_memstr(memstrbuf
,
8460 ents
* sizeof(struct
8463 /* Peer related usage */
8464 ents
= bgp
->af_peer_count
[afi
][safi
];
8465 vty_out(vty
, "Peers %ld, using %s of memory\n",
8468 memstrbuf
, sizeof(memstrbuf
),
8469 ents
* sizeof(struct peer
)));
8471 if ((ents
= listcount(bgp
->group
)))
8473 "Peer groups %ld, using %s of memory\n",
8478 ents
* sizeof(struct
8481 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
8482 BGP_CONFIG_DAMPENING
))
8483 vty_out(vty
, "Dampening enabled.\n");
8486 /* Subtract 8 here because 'Neighbor' is
8488 vty_out(vty
, "Neighbor");
8489 vty_out(vty
, "%*s", max_neighbor_width
- 8,
8492 vty_out(vty
, "EstdCnt DropCnt ResetTime Reason\n");
8495 "V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd\n");
8500 /* Works for both failed & successful cases */
8501 if (peer_dynamic_neighbor(peer
))
8508 bgp_has_peer_failed(peer
, afi
, safi
)) {
8509 json_peer
= json_object_new_object();
8510 bgp_show_failed_summary(vty
, bgp
, peer
,
8511 json_peer
, 0, use_json
);
8512 } else if (!show_failed
) {
8513 json_peer
= json_object_new_object();
8514 if (peer_dynamic_neighbor(peer
)) {
8515 json_object_boolean_true_add(json_peer
,
8520 json_object_string_add(json_peer
, "hostname",
8523 if (peer
->domainname
)
8524 json_object_string_add(json_peer
, "domainname",
8527 json_object_int_add(json_peer
, "remoteAs", peer
->as
);
8528 json_object_int_add(json_peer
, "version", 4);
8529 json_object_int_add(json_peer
, "msgRcvd",
8530 PEER_TOTAL_RX(peer
));
8531 json_object_int_add(json_peer
, "msgSent",
8532 PEER_TOTAL_TX(peer
));
8534 json_object_int_add(json_peer
, "tableVersion",
8535 peer
->version
[afi
][safi
]);
8536 json_object_int_add(json_peer
, "outq",
8538 json_object_int_add(json_peer
, "inq", 0);
8539 peer_uptime(peer
->uptime
, timebuf
, BGP_UPTIME_LEN
,
8540 use_json
, json_peer
);
8543 * Adding "pfxRcd" field to match with the corresponding
8544 * CLI. "prefixReceivedCount" will be deprecated in
8547 json_object_int_add(json_peer
, "prefixReceivedCount",
8548 peer
->pcount
[afi
][pfx_rcd_safi
]);
8549 json_object_int_add(json_peer
, "pfxRcd",
8550 peer
->pcount
[afi
][pfx_rcd_safi
]);
8552 paf
= peer_af_find(peer
, afi
, pfx_rcd_safi
);
8553 if (paf
&& PAF_SUBGRP(paf
))
8554 json_object_int_add(json_peer
,
8556 (PAF_SUBGRP(paf
))->scount
);
8557 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_SHUTDOWN
))
8558 json_object_string_add(json_peer
, "state",
8560 else if (peer
->afc_recv
[afi
][safi
])
8561 json_object_string_add(
8563 lookup_msg(bgp_status_msg
, peer
->status
,
8565 else if (CHECK_FLAG(peer
->sflags
,
8566 PEER_STATUS_PREFIX_OVERFLOW
))
8567 json_object_string_add(json_peer
, "state",
8570 json_object_string_add(
8572 lookup_msg(bgp_status_msg
, peer
->status
,
8574 json_object_int_add(json_peer
, "connectionsEstablished",
8576 json_object_int_add(json_peer
, "connectionsDropped",
8579 /* Avoid creating empty peer dicts in JSON */
8580 if (json_peer
== NULL
)
8584 json_object_string_add(json_peer
, "idType",
8586 else if (peer
->su
.sa
.sa_family
== AF_INET
)
8587 json_object_string_add(json_peer
, "idType",
8589 else if (peer
->su
.sa
.sa_family
== AF_INET6
)
8590 json_object_string_add(json_peer
, "idType",
8592 json_object_object_add(json_peers
, peer
->host
,
8596 bgp_has_peer_failed(peer
, afi
, safi
)) {
8597 bgp_show_failed_summary(vty
, bgp
, peer
, NULL
,
8600 } else if (!show_failed
) {
8601 memset(dn_flag
, '\0', sizeof(dn_flag
));
8602 if (peer_dynamic_neighbor(peer
)) {
8607 && bgp_flag_check(bgp
, BGP_FLAG_SHOW_HOSTNAME
))
8608 len
= vty_out(vty
, "%s%s(%s)", dn_flag
,
8609 peer
->hostname
, peer
->host
);
8611 len
= vty_out(vty
, "%s%s", dn_flag
, peer
->host
);
8613 /* pad the neighbor column with spaces */
8614 if (len
< max_neighbor_width
)
8615 vty_out(vty
, "%*s", max_neighbor_width
- len
,
8618 vty_out(vty
, "4 %10u %7u %7u %8" PRIu64
" %4d %4zd %8s",
8619 peer
->as
, PEER_TOTAL_RX(peer
),
8620 PEER_TOTAL_TX(peer
), peer
->version
[afi
][safi
],
8621 0, peer
->obuf
->count
,
8622 peer_uptime(peer
->uptime
, timebuf
,
8623 BGP_UPTIME_LEN
, 0, NULL
));
8625 if (peer
->status
== Established
)
8626 if (peer
->afc_recv
[afi
][safi
])
8627 vty_out(vty
, " %12" PRIu32
,
8632 vty_out(vty
, " NoNeg");
8634 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_SHUTDOWN
))
8635 vty_out(vty
, " Idle (Admin)");
8636 else if (CHECK_FLAG(
8638 PEER_STATUS_PREFIX_OVERFLOW
))
8639 vty_out(vty
, " Idle (PfxCt)");
8641 vty_out(vty
, " %12s",
8642 lookup_msg(bgp_status_msg
,
8643 peer
->status
, NULL
));
8652 json_object_object_add(json
, "peers", json_peers
);
8653 json_object_int_add(json
, "failedPeers", failed_count
);
8654 json_object_int_add(json
, "totalPeers", count
);
8655 json_object_int_add(json
, "dynamicPeers", dn_count
);
8658 bgp_show_bestpath_json(bgp
, json
);
8660 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
8661 json
, JSON_C_TO_STRING_PRETTY
));
8662 json_object_free(json
);
8665 vty_out(vty
, "\nTotal number of neighbors %d\n", count
);
8667 vty_out(vty
, "No %s neighbor is configured\n",
8668 get_afi_safi_str(afi
, safi
, false));
8672 vty_out(vty
, "* - dynamic neighbor\n");
8673 vty_out(vty
, "%d dynamic neighbor(s), limit %d\n",
8674 dn_count
, bgp
->dynamic_neighbors_limit
);
8681 static void bgp_show_summary_afi_safi(struct vty
*vty
, struct bgp
*bgp
, int afi
,
8682 int safi
, bool show_failed
, bool use_json
)
8685 int afi_wildcard
= (afi
== AFI_MAX
);
8686 int safi_wildcard
= (safi
== SAFI_MAX
);
8687 int is_wildcard
= (afi_wildcard
|| safi_wildcard
);
8688 bool nbr_output
= false;
8690 if (use_json
&& is_wildcard
)
8691 vty_out(vty
, "{\n");
8693 afi
= 1; /* AFI_IP */
8694 while (afi
< AFI_MAX
) {
8696 safi
= 1; /* SAFI_UNICAST */
8697 while (safi
< SAFI_MAX
) {
8698 if (bgp_afi_safi_peer_exists(bgp
, afi
, safi
)) {
8703 * So limit output to those afi/safi
8705 * actualy have something interesting in
8710 vty_out(vty
, ",\n");
8714 vty_out(vty
, "\"%s\":",
8715 get_afi_safi_str(afi
,
8719 vty_out(vty
, "\n%s Summary:\n",
8720 get_afi_safi_str(afi
,
8725 bgp_show_summary(vty
, bgp
, afi
, safi
, show_failed
,
8737 if (use_json
&& is_wildcard
)
8738 vty_out(vty
, "}\n");
8739 else if (!nbr_output
) {
8741 vty_out(vty
, "{}\n");
8743 vty_out(vty
, "%% No BGP neighbors found\n");
8747 static void bgp_show_all_instances_summary_vty(struct vty
*vty
, afi_t afi
,
8748 safi_t safi
, bool show_failed
,
8751 struct listnode
*node
, *nnode
;
8754 bool nbr_output
= false;
8757 vty_out(vty
, "{\n");
8759 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
8763 vty_out(vty
, ",\n");
8767 vty_out(vty
, "\"%s\":",
8768 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
8772 vty_out(vty
, "\nInstance %s:\n",
8773 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
8777 bgp_show_summary_afi_safi(vty
, bgp
, afi
, safi
, show_failed
,
8782 vty_out(vty
, "}\n");
8783 else if (!nbr_output
)
8784 vty_out(vty
, "%% BGP instance not found\n");
8787 int bgp_show_summary_vty(struct vty
*vty
, const char *name
, afi_t afi
,
8788 safi_t safi
, bool show_failed
, bool use_json
)
8793 if (strmatch(name
, "all")) {
8794 bgp_show_all_instances_summary_vty(vty
, afi
, safi
,
8799 bgp
= bgp_lookup_by_name(name
);
8803 vty_out(vty
, "{}\n");
8806 "%% BGP instance not found\n");
8810 bgp_show_summary_afi_safi(vty
, bgp
, afi
, safi
,
8811 show_failed
, use_json
);
8816 bgp
= bgp_get_default();
8819 bgp_show_summary_afi_safi(vty
, bgp
, afi
, safi
, show_failed
,
8823 vty_out(vty
, "{}\n");
8825 vty_out(vty
, "%% BGP instance not found\n");
8832 /* `show [ip] bgp summary' commands. */
8833 DEFUN (show_ip_bgp_summary
,
8834 show_ip_bgp_summary_cmd
,
8835 "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR
" ["BGP_SAFI_WITH_LABEL_CMD_STR
"]] summary [failed] [json]",
8839 BGP_INSTANCE_HELP_STR
8841 BGP_SAFI_WITH_LABEL_HELP_STR
8842 "Summary of BGP neighbor status\n"
8843 "Show only sessions not in Established state\n"
8847 afi_t afi
= AFI_MAX
;
8848 safi_t safi
= SAFI_MAX
;
8849 bool show_failed
= false;
8854 if (argv_find(argv
, argc
, "ip", &idx
))
8856 /* [<vrf> VIEWVRFNAME] */
8857 if (argv_find(argv
, argc
, "vrf", &idx
)) {
8858 vrf
= argv
[idx
+ 1]->arg
;
8859 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
8861 } else if (argv_find(argv
, argc
, "view", &idx
))
8862 /* [<view> VIEWVRFNAME] */
8863 vrf
= argv
[idx
+ 1]->arg
;
8864 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
8865 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
)) {
8866 argv_find_and_parse_safi(argv
, argc
, &idx
, &safi
);
8869 if (argv_find(argv
, argc
, "failed", &idx
))
8872 bool uj
= use_json(argc
, argv
);
8874 return bgp_show_summary_vty(vty
, vrf
, afi
, safi
, show_failed
, uj
);
8877 const char *get_afi_safi_str(afi_t afi
, safi_t safi
, bool for_json
)
8880 return get_afi_safi_json_str(afi
, safi
);
8882 return get_afi_safi_vty_str(afi
, safi
);
8885 /* Show BGP peer's information. */
8886 enum show_type
{ show_all
, show_peer
, show_ipv4_all
, show_ipv6_all
, show_ipv4_peer
, show_ipv6_peer
};
8888 static void bgp_show_peer_afi_orf_cap(struct vty
*vty
, struct peer
*p
,
8889 afi_t afi
, safi_t safi
,
8890 uint16_t adv_smcap
, uint16_t adv_rmcap
,
8891 uint16_t rcv_smcap
, uint16_t rcv_rmcap
,
8892 bool use_json
, json_object
*json_pref
)
8895 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_smcap
)
8896 || CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_smcap
)) {
8898 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_smcap
)
8899 && CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_smcap
))
8900 json_object_string_add(json_pref
, "sendMode",
8901 "advertisedAndReceived");
8902 else if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_smcap
))
8903 json_object_string_add(json_pref
, "sendMode",
8905 else if (CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_smcap
))
8906 json_object_string_add(json_pref
, "sendMode",
8909 vty_out(vty
, " Send-mode: ");
8910 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_smcap
))
8911 vty_out(vty
, "advertised");
8912 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_smcap
))
8913 vty_out(vty
, "%sreceived",
8914 CHECK_FLAG(p
->af_cap
[afi
][safi
],
8923 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_rmcap
)
8924 || CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_rmcap
)) {
8926 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_rmcap
)
8927 && CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_rmcap
))
8928 json_object_string_add(json_pref
, "recvMode",
8929 "advertisedAndReceived");
8930 else if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_rmcap
))
8931 json_object_string_add(json_pref
, "recvMode",
8933 else if (CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_rmcap
))
8934 json_object_string_add(json_pref
, "recvMode",
8937 vty_out(vty
, " Receive-mode: ");
8938 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_rmcap
))
8939 vty_out(vty
, "advertised");
8940 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_rmcap
))
8941 vty_out(vty
, "%sreceived",
8942 CHECK_FLAG(p
->af_cap
[afi
][safi
],
8951 static void bgp_show_peer_afi(struct vty
*vty
, struct peer
*p
, afi_t afi
,
8952 safi_t safi
, bool use_json
,
8953 json_object
*json_neigh
)
8955 struct bgp_filter
*filter
;
8956 struct peer_af
*paf
;
8957 char orf_pfx_name
[BUFSIZ
];
8959 json_object
*json_af
= NULL
;
8960 json_object
*json_prefA
= NULL
;
8961 json_object
*json_prefB
= NULL
;
8962 json_object
*json_addr
= NULL
;
8965 json_addr
= json_object_new_object();
8966 json_af
= json_object_new_object();
8967 filter
= &p
->filter
[afi
][safi
];
8969 if (peer_group_active(p
))
8970 json_object_string_add(json_addr
, "peerGroupMember",
8973 paf
= peer_af_find(p
, afi
, safi
);
8974 if (paf
&& PAF_SUBGRP(paf
)) {
8975 json_object_int_add(json_addr
, "updateGroupId",
8976 PAF_UPDGRP(paf
)->id
);
8977 json_object_int_add(json_addr
, "subGroupId",
8978 PAF_SUBGRP(paf
)->id
);
8979 json_object_int_add(json_addr
, "packetQueueLength",
8980 bpacket_queue_virtual_length(paf
));
8983 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
8984 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8985 PEER_CAP_ORF_PREFIX_SM_RCV
)
8986 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8987 PEER_CAP_ORF_PREFIX_RM_ADV
)
8988 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8989 PEER_CAP_ORF_PREFIX_RM_RCV
)) {
8990 json_object_int_add(json_af
, "orfType",
8992 json_prefA
= json_object_new_object();
8993 bgp_show_peer_afi_orf_cap(vty
, p
, afi
, safi
,
8994 PEER_CAP_ORF_PREFIX_SM_ADV
,
8995 PEER_CAP_ORF_PREFIX_RM_ADV
,
8996 PEER_CAP_ORF_PREFIX_SM_RCV
,
8997 PEER_CAP_ORF_PREFIX_RM_RCV
,
8998 use_json
, json_prefA
);
8999 json_object_object_add(json_af
, "orfPrefixList",
9003 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
9004 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
9005 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
9006 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
9007 PEER_CAP_ORF_PREFIX_RM_ADV
)
9008 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
9009 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
)) {
9010 json_object_int_add(json_af
, "orfOldType",
9011 ORF_TYPE_PREFIX_OLD
);
9012 json_prefB
= json_object_new_object();
9013 bgp_show_peer_afi_orf_cap(
9014 vty
, p
, afi
, safi
, PEER_CAP_ORF_PREFIX_SM_ADV
,
9015 PEER_CAP_ORF_PREFIX_RM_ADV
,
9016 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
,
9017 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
, use_json
,
9019 json_object_object_add(json_af
, "orfOldPrefixList",
9023 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
9024 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
9025 PEER_CAP_ORF_PREFIX_SM_RCV
)
9026 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
9027 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
9028 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
9029 PEER_CAP_ORF_PREFIX_RM_ADV
)
9030 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
9031 PEER_CAP_ORF_PREFIX_RM_RCV
)
9032 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
9033 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
))
9034 json_object_object_add(json_addr
, "afDependentCap",
9037 json_object_free(json_af
);
9039 sprintf(orf_pfx_name
, "%s.%d.%d", p
->host
, afi
, safi
);
9040 orf_pfx_count
= prefix_bgp_show_prefix_list(
9041 NULL
, afi
, orf_pfx_name
, use_json
);
9043 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
9044 PEER_STATUS_ORF_PREFIX_SEND
)
9046 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
9047 PEER_STATUS_ORF_PREFIX_SEND
))
9048 json_object_boolean_true_add(json_neigh
,
9051 json_object_int_add(json_addr
, "orfRecvCounter",
9054 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
9055 PEER_STATUS_ORF_WAIT_REFRESH
))
9056 json_object_string_add(
9057 json_addr
, "orfFirstUpdate",
9058 "deferredUntilORFOrRouteRefreshRecvd");
9060 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9061 PEER_FLAG_REFLECTOR_CLIENT
))
9062 json_object_boolean_true_add(json_addr
,
9063 "routeReflectorClient");
9064 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9065 PEER_FLAG_RSERVER_CLIENT
))
9066 json_object_boolean_true_add(json_addr
,
9067 "routeServerClient");
9068 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
9069 json_object_boolean_true_add(json_addr
,
9070 "inboundSoftConfigPermit");
9072 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9073 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
))
9074 json_object_boolean_true_add(
9076 "privateAsNumsAllReplacedInUpdatesToNbr");
9077 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9078 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
))
9079 json_object_boolean_true_add(
9081 "privateAsNumsReplacedInUpdatesToNbr");
9082 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9083 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
))
9084 json_object_boolean_true_add(
9086 "privateAsNumsAllRemovedInUpdatesToNbr");
9087 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9088 PEER_FLAG_REMOVE_PRIVATE_AS
))
9089 json_object_boolean_true_add(
9091 "privateAsNumsRemovedInUpdatesToNbr");
9093 if (p
->addpath_type
[afi
][safi
] != BGP_ADDPATH_NONE
)
9094 json_object_boolean_true_add(
9096 bgp_addpath_names(p
->addpath_type
[afi
][safi
])
9099 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_AS_OVERRIDE
))
9100 json_object_string_add(json_addr
,
9101 "overrideASNsInOutboundUpdates",
9102 "ifAspathEqualRemoteAs");
9104 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_SELF
)
9105 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
9106 PEER_FLAG_FORCE_NEXTHOP_SELF
))
9107 json_object_boolean_true_add(json_addr
,
9108 "routerAlwaysNextHop");
9109 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9110 PEER_FLAG_AS_PATH_UNCHANGED
))
9111 json_object_boolean_true_add(
9112 json_addr
, "unchangedAsPathPropogatedToNbr");
9113 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9114 PEER_FLAG_NEXTHOP_UNCHANGED
))
9115 json_object_boolean_true_add(
9116 json_addr
, "unchangedNextHopPropogatedToNbr");
9117 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
9118 json_object_boolean_true_add(
9119 json_addr
, "unchangedMedPropogatedToNbr");
9120 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
)
9121 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
9122 PEER_FLAG_SEND_EXT_COMMUNITY
)) {
9123 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9124 PEER_FLAG_SEND_COMMUNITY
)
9125 && CHECK_FLAG(p
->af_flags
[afi
][safi
],
9126 PEER_FLAG_SEND_EXT_COMMUNITY
))
9127 json_object_string_add(json_addr
,
9128 "commAttriSentToNbr",
9129 "extendedAndStandard");
9130 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9131 PEER_FLAG_SEND_EXT_COMMUNITY
))
9132 json_object_string_add(json_addr
,
9133 "commAttriSentToNbr",
9136 json_object_string_add(json_addr
,
9137 "commAttriSentToNbr",
9140 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9141 PEER_FLAG_DEFAULT_ORIGINATE
)) {
9142 if (p
->default_rmap
[afi
][safi
].name
)
9143 json_object_string_add(
9144 json_addr
, "defaultRouteMap",
9145 p
->default_rmap
[afi
][safi
].name
);
9147 if (paf
&& PAF_SUBGRP(paf
)
9148 && CHECK_FLAG(PAF_SUBGRP(paf
)->sflags
,
9149 SUBGRP_STATUS_DEFAULT_ORIGINATE
))
9150 json_object_boolean_true_add(json_addr
,
9153 json_object_boolean_true_add(json_addr
,
9157 if (afi
== AFI_L2VPN
&& safi
== SAFI_EVPN
) {
9158 if (is_evpn_enabled())
9159 json_object_boolean_true_add(
9160 json_addr
, "advertiseAllVnis");
9163 if (filter
->plist
[FILTER_IN
].name
9164 || filter
->dlist
[FILTER_IN
].name
9165 || filter
->aslist
[FILTER_IN
].name
9166 || filter
->map
[RMAP_IN
].name
)
9167 json_object_boolean_true_add(json_addr
,
9168 "inboundPathPolicyConfig");
9169 if (filter
->plist
[FILTER_OUT
].name
9170 || filter
->dlist
[FILTER_OUT
].name
9171 || filter
->aslist
[FILTER_OUT
].name
9172 || filter
->map
[RMAP_OUT
].name
|| filter
->usmap
.name
)
9173 json_object_boolean_true_add(
9174 json_addr
, "outboundPathPolicyConfig");
9177 if (filter
->plist
[FILTER_IN
].name
)
9178 json_object_string_add(json_addr
,
9179 "incomingUpdatePrefixFilterList",
9180 filter
->plist
[FILTER_IN
].name
);
9181 if (filter
->plist
[FILTER_OUT
].name
)
9182 json_object_string_add(json_addr
,
9183 "outgoingUpdatePrefixFilterList",
9184 filter
->plist
[FILTER_OUT
].name
);
9186 /* distribute-list */
9187 if (filter
->dlist
[FILTER_IN
].name
)
9188 json_object_string_add(
9189 json_addr
, "incomingUpdateNetworkFilterList",
9190 filter
->dlist
[FILTER_IN
].name
);
9191 if (filter
->dlist
[FILTER_OUT
].name
)
9192 json_object_string_add(
9193 json_addr
, "outgoingUpdateNetworkFilterList",
9194 filter
->dlist
[FILTER_OUT
].name
);
9197 if (filter
->aslist
[FILTER_IN
].name
)
9198 json_object_string_add(json_addr
,
9199 "incomingUpdateAsPathFilterList",
9200 filter
->aslist
[FILTER_IN
].name
);
9201 if (filter
->aslist
[FILTER_OUT
].name
)
9202 json_object_string_add(json_addr
,
9203 "outgoingUpdateAsPathFilterList",
9204 filter
->aslist
[FILTER_OUT
].name
);
9207 if (filter
->map
[RMAP_IN
].name
)
9208 json_object_string_add(
9209 json_addr
, "routeMapForIncomingAdvertisements",
9210 filter
->map
[RMAP_IN
].name
);
9211 if (filter
->map
[RMAP_OUT
].name
)
9212 json_object_string_add(
9213 json_addr
, "routeMapForOutgoingAdvertisements",
9214 filter
->map
[RMAP_OUT
].name
);
9216 /* ebgp-requires-policy (inbound) */
9217 if (p
->bgp
->ebgp_requires_policy
== DEFAULT_EBGP_POLICY_ENABLED
9218 && !bgp_inbound_policy_exists(p
, filter
))
9219 json_object_string_add(
9220 json_addr
, "inboundEbgpRequiresPolicy",
9221 "Inbound updates discarded due to missing policy");
9223 /* ebgp-requires-policy (outbound) */
9224 if (p
->bgp
->ebgp_requires_policy
== DEFAULT_EBGP_POLICY_ENABLED
9225 && (!bgp_outbound_policy_exists(p
, filter
)))
9226 json_object_string_add(
9227 json_addr
, "outboundEbgpRequiresPolicy",
9228 "Outbound updates discarded due to missing policy");
9230 /* unsuppress-map */
9231 if (filter
->usmap
.name
)
9232 json_object_string_add(json_addr
,
9233 "selectiveUnsuppressRouteMap",
9234 filter
->usmap
.name
);
9236 /* Receive prefix count */
9237 json_object_int_add(json_addr
, "acceptedPrefixCounter",
9238 p
->pcount
[afi
][safi
]);
9239 if (paf
&& PAF_SUBGRP(paf
))
9240 json_object_int_add(json_addr
, "sentPrefixCounter",
9241 (PAF_SUBGRP(paf
))->scount
);
9243 /* Maximum prefix */
9244 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_OUT
))
9245 json_object_int_add(json_addr
, "prefixOutAllowedMax",
9246 p
->pmax_out
[afi
][safi
]);
9248 /* Maximum prefix */
9249 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
)) {
9250 json_object_int_add(json_addr
, "prefixAllowedMax",
9251 p
->pmax
[afi
][safi
]);
9252 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9253 PEER_FLAG_MAX_PREFIX_WARNING
))
9254 json_object_boolean_true_add(
9255 json_addr
, "prefixAllowedMaxWarning");
9256 json_object_int_add(json_addr
,
9257 "prefixAllowedWarningThresh",
9258 p
->pmax_threshold
[afi
][safi
]);
9259 if (p
->pmax_restart
[afi
][safi
])
9260 json_object_int_add(
9262 "prefixAllowedRestartIntervalMsecs",
9263 p
->pmax_restart
[afi
][safi
] * 60000);
9265 json_object_object_add(json_neigh
, get_afi_safi_str(afi
, safi
, true),
9269 filter
= &p
->filter
[afi
][safi
];
9271 vty_out(vty
, " For address family: %s\n",
9272 get_afi_safi_str(afi
, safi
, false));
9274 if (peer_group_active(p
))
9275 vty_out(vty
, " %s peer-group member\n",
9278 paf
= peer_af_find(p
, afi
, safi
);
9279 if (paf
&& PAF_SUBGRP(paf
)) {
9280 vty_out(vty
, " Update group %" PRIu64
9281 ", subgroup %" PRIu64
"\n",
9282 PAF_UPDGRP(paf
)->id
, PAF_SUBGRP(paf
)->id
);
9283 vty_out(vty
, " Packet Queue length %d\n",
9284 bpacket_queue_virtual_length(paf
));
9286 vty_out(vty
, " Not part of any update group\n");
9288 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
9289 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
9290 PEER_CAP_ORF_PREFIX_SM_RCV
)
9291 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
9292 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
9293 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
9294 PEER_CAP_ORF_PREFIX_RM_ADV
)
9295 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
9296 PEER_CAP_ORF_PREFIX_RM_RCV
)
9297 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
9298 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
))
9299 vty_out(vty
, " AF-dependant capabilities:\n");
9301 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
9302 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
9303 PEER_CAP_ORF_PREFIX_SM_RCV
)
9304 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
9305 PEER_CAP_ORF_PREFIX_RM_ADV
)
9306 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
9307 PEER_CAP_ORF_PREFIX_RM_RCV
)) {
9309 " Outbound Route Filter (ORF) type (%d) Prefix-list:\n",
9311 bgp_show_peer_afi_orf_cap(
9312 vty
, p
, afi
, safi
, PEER_CAP_ORF_PREFIX_SM_ADV
,
9313 PEER_CAP_ORF_PREFIX_RM_ADV
,
9314 PEER_CAP_ORF_PREFIX_SM_RCV
,
9315 PEER_CAP_ORF_PREFIX_RM_RCV
, use_json
, NULL
);
9317 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
9318 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
9319 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
9320 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
9321 PEER_CAP_ORF_PREFIX_RM_ADV
)
9322 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
9323 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
)) {
9325 " Outbound Route Filter (ORF) type (%d) Prefix-list:\n",
9326 ORF_TYPE_PREFIX_OLD
);
9327 bgp_show_peer_afi_orf_cap(
9328 vty
, p
, afi
, safi
, PEER_CAP_ORF_PREFIX_SM_ADV
,
9329 PEER_CAP_ORF_PREFIX_RM_ADV
,
9330 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
,
9331 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
, use_json
, NULL
);
9334 sprintf(orf_pfx_name
, "%s.%d.%d", p
->host
, afi
, safi
);
9335 orf_pfx_count
= prefix_bgp_show_prefix_list(
9336 NULL
, afi
, orf_pfx_name
, use_json
);
9338 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
9339 PEER_STATUS_ORF_PREFIX_SEND
)
9341 vty_out(vty
, " Outbound Route Filter (ORF):");
9342 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
9343 PEER_STATUS_ORF_PREFIX_SEND
))
9344 vty_out(vty
, " sent;");
9346 vty_out(vty
, " received (%d entries)",
9350 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
9351 PEER_STATUS_ORF_WAIT_REFRESH
))
9353 " First update is deferred until ORF or ROUTE-REFRESH is received\n");
9355 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9356 PEER_FLAG_REFLECTOR_CLIENT
))
9357 vty_out(vty
, " Route-Reflector Client\n");
9358 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9359 PEER_FLAG_RSERVER_CLIENT
))
9360 vty_out(vty
, " Route-Server Client\n");
9361 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
9363 " Inbound soft reconfiguration allowed\n");
9365 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9366 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
))
9368 " Private AS numbers (all) replaced in updates to this neighbor\n");
9369 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9370 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
))
9372 " Private AS numbers replaced in updates to this neighbor\n");
9373 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9374 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
))
9376 " Private AS numbers (all) removed in updates to this neighbor\n");
9377 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9378 PEER_FLAG_REMOVE_PRIVATE_AS
))
9380 " Private AS numbers removed in updates to this neighbor\n");
9382 if (p
->addpath_type
[afi
][safi
] != BGP_ADDPATH_NONE
)
9383 vty_out(vty
, " %s\n",
9384 bgp_addpath_names(p
->addpath_type
[afi
][safi
])
9385 ->human_description
);
9387 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_AS_OVERRIDE
))
9389 " Override ASNs in outbound updates if aspath equals remote-as\n");
9391 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_SELF
)
9392 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
9393 PEER_FLAG_FORCE_NEXTHOP_SELF
))
9394 vty_out(vty
, " NEXT_HOP is always this router\n");
9395 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9396 PEER_FLAG_AS_PATH_UNCHANGED
))
9398 " AS_PATH is propagated unchanged to this neighbor\n");
9399 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9400 PEER_FLAG_NEXTHOP_UNCHANGED
))
9402 " NEXT_HOP is propagated unchanged to this neighbor\n");
9403 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
9405 " MED is propagated unchanged to this neighbor\n");
9406 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
)
9407 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
9408 PEER_FLAG_SEND_EXT_COMMUNITY
)
9409 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
9410 PEER_FLAG_SEND_LARGE_COMMUNITY
)) {
9412 " Community attribute sent to this neighbor");
9413 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9414 PEER_FLAG_SEND_COMMUNITY
)
9415 && CHECK_FLAG(p
->af_flags
[afi
][safi
],
9416 PEER_FLAG_SEND_EXT_COMMUNITY
)
9417 && CHECK_FLAG(p
->af_flags
[afi
][safi
],
9418 PEER_FLAG_SEND_LARGE_COMMUNITY
))
9419 vty_out(vty
, "(all)\n");
9420 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9421 PEER_FLAG_SEND_LARGE_COMMUNITY
))
9422 vty_out(vty
, "(large)\n");
9423 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9424 PEER_FLAG_SEND_EXT_COMMUNITY
))
9425 vty_out(vty
, "(extended)\n");
9427 vty_out(vty
, "(standard)\n");
9429 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9430 PEER_FLAG_DEFAULT_ORIGINATE
)) {
9431 vty_out(vty
, " Default information originate,");
9433 if (p
->default_rmap
[afi
][safi
].name
)
9434 vty_out(vty
, " default route-map %s%s,",
9435 p
->default_rmap
[afi
][safi
].map
? "*"
9437 p
->default_rmap
[afi
][safi
].name
);
9438 if (paf
&& PAF_SUBGRP(paf
)
9439 && CHECK_FLAG(PAF_SUBGRP(paf
)->sflags
,
9440 SUBGRP_STATUS_DEFAULT_ORIGINATE
))
9441 vty_out(vty
, " default sent\n");
9443 vty_out(vty
, " default not sent\n");
9446 /* advertise-vni-all */
9447 if (afi
== AFI_L2VPN
&& safi
== SAFI_EVPN
) {
9448 if (is_evpn_enabled())
9449 vty_out(vty
, " advertise-all-vni\n");
9452 if (filter
->plist
[FILTER_IN
].name
9453 || filter
->dlist
[FILTER_IN
].name
9454 || filter
->aslist
[FILTER_IN
].name
9455 || filter
->map
[RMAP_IN
].name
)
9456 vty_out(vty
, " Inbound path policy configured\n");
9457 if (filter
->plist
[FILTER_OUT
].name
9458 || filter
->dlist
[FILTER_OUT
].name
9459 || filter
->aslist
[FILTER_OUT
].name
9460 || filter
->map
[RMAP_OUT
].name
|| filter
->usmap
.name
)
9461 vty_out(vty
, " Outbound path policy configured\n");
9464 if (filter
->plist
[FILTER_IN
].name
)
9466 " Incoming update prefix filter list is %s%s\n",
9467 filter
->plist
[FILTER_IN
].plist
? "*" : "",
9468 filter
->plist
[FILTER_IN
].name
);
9469 if (filter
->plist
[FILTER_OUT
].name
)
9471 " Outgoing update prefix filter list is %s%s\n",
9472 filter
->plist
[FILTER_OUT
].plist
? "*" : "",
9473 filter
->plist
[FILTER_OUT
].name
);
9475 /* distribute-list */
9476 if (filter
->dlist
[FILTER_IN
].name
)
9478 " Incoming update network filter list is %s%s\n",
9479 filter
->dlist
[FILTER_IN
].alist
? "*" : "",
9480 filter
->dlist
[FILTER_IN
].name
);
9481 if (filter
->dlist
[FILTER_OUT
].name
)
9483 " Outgoing update network filter list is %s%s\n",
9484 filter
->dlist
[FILTER_OUT
].alist
? "*" : "",
9485 filter
->dlist
[FILTER_OUT
].name
);
9488 if (filter
->aslist
[FILTER_IN
].name
)
9490 " Incoming update AS path filter list is %s%s\n",
9491 filter
->aslist
[FILTER_IN
].aslist
? "*" : "",
9492 filter
->aslist
[FILTER_IN
].name
);
9493 if (filter
->aslist
[FILTER_OUT
].name
)
9495 " Outgoing update AS path filter list is %s%s\n",
9496 filter
->aslist
[FILTER_OUT
].aslist
? "*" : "",
9497 filter
->aslist
[FILTER_OUT
].name
);
9500 if (filter
->map
[RMAP_IN
].name
)
9502 " Route map for incoming advertisements is %s%s\n",
9503 filter
->map
[RMAP_IN
].map
? "*" : "",
9504 filter
->map
[RMAP_IN
].name
);
9505 if (filter
->map
[RMAP_OUT
].name
)
9507 " Route map for outgoing advertisements is %s%s\n",
9508 filter
->map
[RMAP_OUT
].map
? "*" : "",
9509 filter
->map
[RMAP_OUT
].name
);
9511 /* ebgp-requires-policy (inbound) */
9512 if (p
->bgp
->ebgp_requires_policy
== DEFAULT_EBGP_POLICY_ENABLED
9513 && !bgp_inbound_policy_exists(p
, filter
))
9515 " Inbound updates discarded due to missing policy\n");
9517 /* ebgp-requires-policy (outbound) */
9518 if (p
->bgp
->ebgp_requires_policy
== DEFAULT_EBGP_POLICY_ENABLED
9519 && !bgp_outbound_policy_exists(p
, filter
))
9521 " Outbound updates discarded due to missing policy\n");
9523 /* unsuppress-map */
9524 if (filter
->usmap
.name
)
9526 " Route map for selective unsuppress is %s%s\n",
9527 filter
->usmap
.map
? "*" : "",
9528 filter
->usmap
.name
);
9530 /* Receive prefix count */
9531 vty_out(vty
, " %" PRIu32
" accepted prefixes\n",
9532 p
->pcount
[afi
][safi
]);
9534 /* maximum-prefix-out */
9535 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9536 PEER_FLAG_MAX_PREFIX_OUT
))
9538 " Maximum allowed prefixes sent %" PRIu32
"\n",
9539 p
->pmax_out
[afi
][safi
]);
9541 /* Maximum prefix */
9542 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
)) {
9544 " Maximum prefixes allowed %" PRIu32
"%s\n",
9546 CHECK_FLAG(p
->af_flags
[afi
][safi
],
9547 PEER_FLAG_MAX_PREFIX_WARNING
)
9550 vty_out(vty
, " Threshold for warning message %d%%",
9551 p
->pmax_threshold
[afi
][safi
]);
9552 if (p
->pmax_restart
[afi
][safi
])
9553 vty_out(vty
, ", restart interval %d min",
9554 p
->pmax_restart
[afi
][safi
]);
9562 static void bgp_show_peer(struct vty
*vty
, struct peer
*p
, bool use_json
,
9566 char buf1
[PREFIX2STR_BUFFER
], buf
[SU_ADDRSTRLEN
];
9567 char timebuf
[BGP_UPTIME_LEN
];
9573 json_object
*json_neigh
= NULL
;
9579 json_neigh
= json_object_new_object();
9581 memset(dn_flag
, '\0', sizeof(dn_flag
));
9582 if (!p
->conf_if
&& peer_dynamic_neighbor(p
))
9586 if (p
->conf_if
) /* Configured interface name. */
9587 vty_out(vty
, "BGP neighbor on %s: %s, ", p
->conf_if
,
9588 BGP_PEER_SU_UNSPEC(p
)
9590 : sockunion2str(&p
->su
, buf
,
9592 else /* Configured IP address. */
9593 vty_out(vty
, "BGP neighbor is %s%s, ", dn_flag
,
9598 if (p
->conf_if
&& BGP_PEER_SU_UNSPEC(p
))
9599 json_object_string_add(json_neigh
, "bgpNeighborAddr",
9601 else if (p
->conf_if
&& !BGP_PEER_SU_UNSPEC(p
))
9602 json_object_string_add(
9603 json_neigh
, "bgpNeighborAddr",
9604 sockunion2str(&p
->su
, buf
, SU_ADDRSTRLEN
));
9606 json_object_int_add(json_neigh
, "remoteAs", p
->as
);
9608 if (p
->change_local_as
)
9609 json_object_int_add(json_neigh
, "localAs",
9610 p
->change_local_as
);
9612 json_object_int_add(json_neigh
, "localAs", p
->local_as
);
9614 if (CHECK_FLAG(p
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
))
9615 json_object_boolean_true_add(json_neigh
,
9616 "localAsNoPrepend");
9618 if (CHECK_FLAG(p
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
))
9619 json_object_boolean_true_add(json_neigh
,
9620 "localAsReplaceAs");
9622 if ((p
->as_type
== AS_SPECIFIED
) || (p
->as_type
== AS_EXTERNAL
)
9623 || (p
->as_type
== AS_INTERNAL
))
9624 vty_out(vty
, "remote AS %u, ", p
->as
);
9626 vty_out(vty
, "remote AS Unspecified, ");
9627 vty_out(vty
, "local AS %u%s%s, ",
9628 p
->change_local_as
? p
->change_local_as
: p
->local_as
,
9629 CHECK_FLAG(p
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
)
9632 CHECK_FLAG(p
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
)
9636 /* peer type internal or confed-internal */
9637 if ((p
->as
== p
->local_as
) || (p
->as_type
== AS_INTERNAL
)) {
9639 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
))
9640 json_object_boolean_true_add(
9641 json_neigh
, "nbrConfedInternalLink");
9643 json_object_boolean_true_add(json_neigh
,
9646 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
))
9647 vty_out(vty
, "confed-internal link\n");
9649 vty_out(vty
, "internal link\n");
9651 /* peer type external or confed-external */
9652 } else if (p
->as
|| (p
->as_type
== AS_EXTERNAL
)) {
9654 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
))
9655 json_object_boolean_true_add(
9656 json_neigh
, "nbrConfedExternalLink");
9658 json_object_boolean_true_add(json_neigh
,
9661 if (bgp_confederation_peers_check(bgp
, p
->as
))
9662 vty_out(vty
, "confed-external link\n");
9664 vty_out(vty
, "external link\n");
9668 json_object_boolean_true_add(json_neigh
,
9669 "nbrUnspecifiedLink");
9671 vty_out(vty
, "unspecified link\n");
9677 json_object_string_add(json_neigh
, "nbrDesc", p
->desc
);
9679 vty_out(vty
, " Description: %s\n", p
->desc
);
9685 json_object_string_add(json_neigh
, "hostname",
9689 json_object_string_add(json_neigh
, "domainname",
9692 if (p
->domainname
&& (p
->domainname
[0] != '\0'))
9693 vty_out(vty
, "Hostname: %s.%s\n", p
->hostname
,
9696 vty_out(vty
, "Hostname: %s\n", p
->hostname
);
9703 json_object_string_add(json_neigh
, "peerGroup",
9707 struct prefix prefix
, *range
= NULL
;
9709 sockunion2hostprefix(&(p
->su
), &prefix
);
9710 range
= peer_group_lookup_dynamic_neighbor_range(
9714 prefix2str(range
, buf1
, sizeof(buf1
));
9715 json_object_string_add(
9717 "peerSubnetRangeGroup", buf1
);
9722 " Member of peer-group %s for session parameters\n",
9726 struct prefix prefix
, *range
= NULL
;
9728 sockunion2hostprefix(&(p
->su
), &prefix
);
9729 range
= peer_group_lookup_dynamic_neighbor_range(
9733 prefix2str(range
, buf1
, sizeof(buf1
));
9735 " Belongs to the subnet range group: %s\n",
9743 /* Administrative shutdown. */
9744 if (CHECK_FLAG(p
->flags
, PEER_FLAG_SHUTDOWN
))
9745 json_object_boolean_true_add(json_neigh
,
9749 json_object_int_add(json_neigh
, "bgpVersion", 4);
9750 json_object_string_add(
9751 json_neigh
, "remoteRouterId",
9752 inet_ntop(AF_INET
, &p
->remote_id
, buf1
, sizeof(buf1
)));
9753 json_object_string_add(
9754 json_neigh
, "localRouterId",
9755 inet_ntop(AF_INET
, &bgp
->router_id
, buf1
,
9759 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
)
9760 && bgp_confederation_peers_check(bgp
, p
->as
))
9761 json_object_boolean_true_add(json_neigh
,
9765 json_object_string_add(
9766 json_neigh
, "bgpState",
9767 lookup_msg(bgp_status_msg
, p
->status
, NULL
));
9769 if (p
->status
== Established
) {
9772 uptime
= bgp_clock();
9773 uptime
-= p
->uptime
;
9774 epoch_tbuf
= time(NULL
) - uptime
;
9776 json_object_int_add(json_neigh
, "bgpTimerUpMsec",
9778 json_object_string_add(json_neigh
, "bgpTimerUpString",
9779 peer_uptime(p
->uptime
, timebuf
,
9782 json_object_int_add(json_neigh
,
9783 "bgpTimerUpEstablishedEpoch",
9787 else if (p
->status
== Active
) {
9788 if (CHECK_FLAG(p
->flags
, PEER_FLAG_PASSIVE
))
9789 json_object_string_add(json_neigh
, "bgpStateIs",
9791 else if (CHECK_FLAG(p
->sflags
, PEER_STATUS_NSF_WAIT
))
9792 json_object_string_add(json_neigh
, "bgpStateIs",
9800 uptime
= bgp_clock();
9801 uptime
-= p
->readtime
;
9802 tm
= gmtime(&uptime
);
9803 json_object_int_add(json_neigh
, "bgpTimerLastRead",
9804 (tm
->tm_sec
* 1000) + (tm
->tm_min
* 60000)
9805 + (tm
->tm_hour
* 3600000));
9807 uptime
= bgp_clock();
9808 uptime
-= p
->last_write
;
9809 tm
= gmtime(&uptime
);
9810 json_object_int_add(json_neigh
, "bgpTimerLastWrite",
9811 (tm
->tm_sec
* 1000) + (tm
->tm_min
* 60000)
9812 + (tm
->tm_hour
* 3600000));
9814 uptime
= bgp_clock();
9815 uptime
-= p
->update_time
;
9816 tm
= gmtime(&uptime
);
9817 json_object_int_add(json_neigh
, "bgpInUpdateElapsedTimeMsecs",
9818 (tm
->tm_sec
* 1000) + (tm
->tm_min
* 60000)
9819 + (tm
->tm_hour
* 3600000));
9821 /* Configured timer values. */
9822 json_object_int_add(json_neigh
, "bgpTimerHoldTimeMsecs",
9823 p
->v_holdtime
* 1000);
9824 json_object_int_add(json_neigh
,
9825 "bgpTimerKeepAliveIntervalMsecs",
9826 p
->v_keepalive
* 1000);
9827 if (CHECK_FLAG(p
->flags
, PEER_FLAG_TIMER
)) {
9828 json_object_int_add(json_neigh
,
9829 "bgpTimerConfiguredHoldTimeMsecs",
9830 p
->holdtime
* 1000);
9831 json_object_int_add(
9833 "bgpTimerConfiguredKeepAliveIntervalMsecs",
9834 p
->keepalive
* 1000);
9835 } else if ((bgp
->default_holdtime
!= SAVE_BGP_HOLDTIME
)
9836 || (bgp
->default_keepalive
!= SAVE_BGP_KEEPALIVE
)) {
9837 json_object_int_add(json_neigh
,
9838 "bgpTimerConfiguredHoldTimeMsecs",
9839 bgp
->default_holdtime
);
9840 json_object_int_add(
9842 "bgpTimerConfiguredKeepAliveIntervalMsecs",
9843 bgp
->default_keepalive
);
9846 /* Administrative shutdown. */
9847 if (CHECK_FLAG(p
->flags
, PEER_FLAG_SHUTDOWN
))
9848 vty_out(vty
, " Administratively shut down\n");
9851 vty_out(vty
, " BGP version 4");
9852 vty_out(vty
, ", remote router ID %s",
9853 inet_ntop(AF_INET
, &p
->remote_id
, buf1
, sizeof(buf1
)));
9854 vty_out(vty
, ", local router ID %s\n",
9855 inet_ntop(AF_INET
, &bgp
->router_id
, buf1
,
9859 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
)
9860 && bgp_confederation_peers_check(bgp
, p
->as
))
9862 " Neighbor under common administration\n");
9865 vty_out(vty
, " BGP state = %s",
9866 lookup_msg(bgp_status_msg
, p
->status
, NULL
));
9868 if (p
->status
== Established
)
9869 vty_out(vty
, ", up for %8s",
9870 peer_uptime(p
->uptime
, timebuf
, BGP_UPTIME_LEN
,
9873 else if (p
->status
== Active
) {
9874 if (CHECK_FLAG(p
->flags
, PEER_FLAG_PASSIVE
))
9875 vty_out(vty
, " (passive)");
9876 else if (CHECK_FLAG(p
->sflags
, PEER_STATUS_NSF_WAIT
))
9877 vty_out(vty
, " (NSF passive)");
9882 vty_out(vty
, " Last read %s",
9883 peer_uptime(p
->readtime
, timebuf
, BGP_UPTIME_LEN
, 0,
9885 vty_out(vty
, ", Last write %s\n",
9886 peer_uptime(p
->last_write
, timebuf
, BGP_UPTIME_LEN
, 0,
9889 /* Configured timer values. */
9891 " Hold time is %d, keepalive interval is %d seconds\n",
9892 p
->v_holdtime
, p
->v_keepalive
);
9893 if (CHECK_FLAG(p
->flags
, PEER_FLAG_TIMER
)) {
9894 vty_out(vty
, " Configured hold time is %d",
9896 vty_out(vty
, ", keepalive interval is %d seconds\n",
9898 } else if ((bgp
->default_holdtime
!= SAVE_BGP_HOLDTIME
)
9899 || (bgp
->default_keepalive
!= SAVE_BGP_KEEPALIVE
)) {
9900 vty_out(vty
, " Configured hold time is %d",
9901 bgp
->default_holdtime
);
9902 vty_out(vty
, ", keepalive interval is %d seconds\n",
9903 bgp
->default_keepalive
);
9907 if (p
->status
== Established
) {
9908 if (p
->cap
|| p
->afc_adv
[AFI_IP
][SAFI_UNICAST
]
9909 || p
->afc_recv
[AFI_IP
][SAFI_UNICAST
]
9910 || p
->afc_adv
[AFI_IP
][SAFI_MULTICAST
]
9911 || p
->afc_recv
[AFI_IP
][SAFI_MULTICAST
]
9912 || p
->afc_adv
[AFI_IP6
][SAFI_UNICAST
]
9913 || p
->afc_recv
[AFI_IP6
][SAFI_UNICAST
]
9914 || p
->afc_adv
[AFI_IP6
][SAFI_MULTICAST
]
9915 || p
->afc_recv
[AFI_IP6
][SAFI_MULTICAST
]
9916 || p
->afc_adv
[AFI_IP6
][SAFI_MPLS_VPN
]
9917 || p
->afc_recv
[AFI_IP6
][SAFI_MPLS_VPN
]
9918 || p
->afc_adv
[AFI_IP6
][SAFI_ENCAP
]
9919 || p
->afc_recv
[AFI_IP6
][SAFI_ENCAP
]
9920 || p
->afc_adv
[AFI_IP6
][SAFI_FLOWSPEC
]
9921 || p
->afc_recv
[AFI_IP6
][SAFI_FLOWSPEC
]
9922 || p
->afc_adv
[AFI_IP
][SAFI_ENCAP
]
9923 || p
->afc_recv
[AFI_IP
][SAFI_ENCAP
]
9924 || p
->afc_adv
[AFI_IP
][SAFI_FLOWSPEC
]
9925 || p
->afc_recv
[AFI_IP
][SAFI_FLOWSPEC
]
9926 || p
->afc_adv
[AFI_IP
][SAFI_MPLS_VPN
]
9927 || p
->afc_recv
[AFI_IP
][SAFI_MPLS_VPN
]) {
9929 json_object
*json_cap
= NULL
;
9931 json_cap
= json_object_new_object();
9934 if (CHECK_FLAG(p
->cap
, PEER_CAP_AS4_RCV
)
9935 || CHECK_FLAG(p
->cap
, PEER_CAP_AS4_ADV
)) {
9936 if (CHECK_FLAG(p
->cap
, PEER_CAP_AS4_ADV
)
9937 && CHECK_FLAG(p
->cap
,
9939 json_object_string_add(
9940 json_cap
, "4byteAs",
9941 "advertisedAndReceived");
9942 else if (CHECK_FLAG(p
->cap
,
9944 json_object_string_add(
9945 json_cap
, "4byteAs",
9947 else if (CHECK_FLAG(p
->cap
,
9949 json_object_string_add(
9950 json_cap
, "4byteAs",
9955 if (CHECK_FLAG(p
->cap
, PEER_CAP_ADDPATH_RCV
)
9956 || CHECK_FLAG(p
->cap
,
9957 PEER_CAP_ADDPATH_ADV
)) {
9958 json_object
*json_add
= NULL
;
9959 const char *print_store
;
9961 json_add
= json_object_new_object();
9963 FOREACH_AFI_SAFI (afi
, safi
) {
9964 json_object
*json_sub
= NULL
;
9966 json_object_new_object();
9967 print_store
= get_afi_safi_str(
9973 PEER_CAP_ADDPATH_AF_TX_ADV
)
9977 PEER_CAP_ADDPATH_AF_TX_RCV
)) {
9982 PEER_CAP_ADDPATH_AF_TX_ADV
)
9987 PEER_CAP_ADDPATH_AF_TX_RCV
))
9988 json_object_boolean_true_add(
9990 "txAdvertisedAndReceived");
9996 PEER_CAP_ADDPATH_AF_TX_ADV
))
9997 json_object_boolean_true_add(
10005 PEER_CAP_ADDPATH_AF_TX_RCV
))
10006 json_object_boolean_true_add(
10014 PEER_CAP_ADDPATH_AF_RX_ADV
)
10018 PEER_CAP_ADDPATH_AF_RX_RCV
)) {
10023 PEER_CAP_ADDPATH_AF_RX_ADV
)
10028 PEER_CAP_ADDPATH_AF_RX_RCV
))
10029 json_object_boolean_true_add(
10031 "rxAdvertisedAndReceived");
10037 PEER_CAP_ADDPATH_AF_RX_ADV
))
10038 json_object_boolean_true_add(
10046 PEER_CAP_ADDPATH_AF_RX_RCV
))
10047 json_object_boolean_true_add(
10055 PEER_CAP_ADDPATH_AF_TX_ADV
)
10059 PEER_CAP_ADDPATH_AF_TX_RCV
)
10063 PEER_CAP_ADDPATH_AF_RX_ADV
)
10067 PEER_CAP_ADDPATH_AF_RX_RCV
))
10068 json_object_object_add(
10077 json_object_object_add(
10078 json_cap
, "addPath", json_add
);
10082 if (CHECK_FLAG(p
->cap
, PEER_CAP_DYNAMIC_RCV
)
10083 || CHECK_FLAG(p
->cap
,
10084 PEER_CAP_DYNAMIC_ADV
)) {
10085 if (CHECK_FLAG(p
->cap
,
10086 PEER_CAP_DYNAMIC_ADV
)
10087 && CHECK_FLAG(p
->cap
,
10088 PEER_CAP_DYNAMIC_RCV
))
10089 json_object_string_add(
10090 json_cap
, "dynamic",
10091 "advertisedAndReceived");
10092 else if (CHECK_FLAG(
10094 PEER_CAP_DYNAMIC_ADV
))
10095 json_object_string_add(
10096 json_cap
, "dynamic",
10098 else if (CHECK_FLAG(
10100 PEER_CAP_DYNAMIC_RCV
))
10101 json_object_string_add(
10102 json_cap
, "dynamic",
10106 /* Extended nexthop */
10107 if (CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_RCV
)
10108 || CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_ADV
)) {
10109 json_object
*json_nxt
= NULL
;
10110 const char *print_store
;
10113 if (CHECK_FLAG(p
->cap
,
10115 && CHECK_FLAG(p
->cap
,
10116 PEER_CAP_ENHE_RCV
))
10117 json_object_string_add(
10120 "advertisedAndReceived");
10121 else if (CHECK_FLAG(p
->cap
,
10122 PEER_CAP_ENHE_ADV
))
10123 json_object_string_add(
10127 else if (CHECK_FLAG(p
->cap
,
10128 PEER_CAP_ENHE_RCV
))
10129 json_object_string_add(
10134 if (CHECK_FLAG(p
->cap
,
10135 PEER_CAP_ENHE_RCV
)) {
10137 json_object_new_object();
10139 for (safi
= SAFI_UNICAST
;
10140 safi
< SAFI_MAX
; safi
++) {
10145 PEER_CAP_ENHE_AF_RCV
)) {
10146 print_store
= get_afi_safi_str(
10149 json_object_string_add(
10152 "recieved"); /* misspelled for compatibility */
10155 json_object_object_add(
10157 "extendedNexthopFamililesByPeer",
10162 /* Route Refresh */
10163 if (CHECK_FLAG(p
->cap
, PEER_CAP_REFRESH_ADV
)
10164 || CHECK_FLAG(p
->cap
,
10165 PEER_CAP_REFRESH_NEW_RCV
)
10166 || CHECK_FLAG(p
->cap
,
10167 PEER_CAP_REFRESH_OLD_RCV
)) {
10168 if (CHECK_FLAG(p
->cap
,
10169 PEER_CAP_REFRESH_ADV
)
10172 PEER_CAP_REFRESH_NEW_RCV
)
10175 PEER_CAP_REFRESH_OLD_RCV
))) {
10178 PEER_CAP_REFRESH_OLD_RCV
)
10181 PEER_CAP_REFRESH_NEW_RCV
))
10182 json_object_string_add(
10185 "advertisedAndReceivedOldNew");
10189 PEER_CAP_REFRESH_OLD_RCV
))
10190 json_object_string_add(
10193 "advertisedAndReceivedOld");
10195 json_object_string_add(
10198 "advertisedAndReceivedNew");
10203 PEER_CAP_REFRESH_ADV
))
10204 json_object_string_add(
10211 PEER_CAP_REFRESH_NEW_RCV
)
10214 PEER_CAP_REFRESH_OLD_RCV
))
10215 json_object_string_add(
10221 /* Multiprotocol Extensions */
10222 json_object
*json_multi
= NULL
;
10223 json_multi
= json_object_new_object();
10225 FOREACH_AFI_SAFI (afi
, safi
) {
10226 if (p
->afc_adv
[afi
][safi
]
10227 || p
->afc_recv
[afi
][safi
]) {
10228 json_object
*json_exten
= NULL
;
10230 json_object_new_object();
10232 if (p
->afc_adv
[afi
][safi
]
10233 && p
->afc_recv
[afi
][safi
])
10234 json_object_boolean_true_add(
10236 "advertisedAndReceived");
10237 else if (p
->afc_adv
[afi
][safi
])
10238 json_object_boolean_true_add(
10241 else if (p
->afc_recv
[afi
][safi
])
10242 json_object_boolean_true_add(
10246 json_object_object_add(
10248 get_afi_safi_str(afi
,
10254 json_object_object_add(
10255 json_cap
, "multiprotocolExtensions",
10258 /* Hostname capabilities */
10259 json_object
*json_hname
= NULL
;
10261 json_hname
= json_object_new_object();
10263 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_ADV
)) {
10264 json_object_string_add(
10265 json_hname
, "advHostName",
10266 bgp
->peer_self
->hostname
10270 json_object_string_add(
10271 json_hname
, "advDomainName",
10272 bgp
->peer_self
->domainname
10279 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_RCV
)) {
10280 json_object_string_add(
10281 json_hname
, "rcvHostName",
10282 p
->hostname
? p
->hostname
10284 json_object_string_add(
10285 json_hname
, "rcvDomainName",
10286 p
->domainname
? p
->domainname
10290 json_object_object_add(json_cap
, "hostName",
10293 /* Gracefull Restart */
10294 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
)
10295 || CHECK_FLAG(p
->cap
,
10296 PEER_CAP_RESTART_ADV
)) {
10297 if (CHECK_FLAG(p
->cap
,
10298 PEER_CAP_RESTART_ADV
)
10299 && CHECK_FLAG(p
->cap
,
10300 PEER_CAP_RESTART_RCV
))
10301 json_object_string_add(
10304 "advertisedAndReceived");
10305 else if (CHECK_FLAG(
10307 PEER_CAP_RESTART_ADV
))
10308 json_object_string_add(
10310 "gracefulRestartCapability",
10312 else if (CHECK_FLAG(
10314 PEER_CAP_RESTART_RCV
))
10315 json_object_string_add(
10317 "gracefulRestartCapability",
10320 if (CHECK_FLAG(p
->cap
,
10321 PEER_CAP_RESTART_RCV
)) {
10322 int restart_af_count
= 0;
10323 json_object
*json_restart
=
10326 json_object_new_object();
10328 json_object_int_add(
10330 "gracefulRestartRemoteTimerMsecs",
10331 p
->v_gr_restart
* 1000);
10333 FOREACH_AFI_SAFI (afi
, safi
) {
10338 PEER_CAP_RESTART_AF_RCV
)) {
10343 json_object_new_object();
10349 PEER_CAP_RESTART_AF_PRESERVE_RCV
))
10350 json_object_boolean_true_add(
10353 restart_af_count
++;
10354 json_object_object_add(
10363 if (!restart_af_count
) {
10364 json_object_string_add(
10366 "addressFamiliesByPeer",
10371 json_object_object_add(
10373 "addressFamiliesByPeer",
10377 json_object_object_add(json_neigh
,
10378 "neighborCapabilities",
10381 vty_out(vty
, " Neighbor capabilities:\n");
10384 if (CHECK_FLAG(p
->cap
, PEER_CAP_AS4_RCV
)
10385 || CHECK_FLAG(p
->cap
, PEER_CAP_AS4_ADV
)) {
10386 vty_out(vty
, " 4 Byte AS:");
10387 if (CHECK_FLAG(p
->cap
,
10389 vty_out(vty
, " advertised");
10390 if (CHECK_FLAG(p
->cap
,
10392 vty_out(vty
, " %sreceived",
10398 vty_out(vty
, "\n");
10402 if (CHECK_FLAG(p
->cap
, PEER_CAP_ADDPATH_RCV
)
10403 || CHECK_FLAG(p
->cap
,
10404 PEER_CAP_ADDPATH_ADV
)) {
10405 vty_out(vty
, " AddPath:\n");
10407 FOREACH_AFI_SAFI (afi
, safi
) {
10411 PEER_CAP_ADDPATH_AF_TX_ADV
)
10415 PEER_CAP_ADDPATH_AF_TX_RCV
)) {
10427 PEER_CAP_ADDPATH_AF_TX_ADV
))
10439 PEER_CAP_ADDPATH_AF_TX_RCV
))
10446 PEER_CAP_ADDPATH_AF_TX_ADV
)
10450 vty_out(vty
, "\n");
10456 PEER_CAP_ADDPATH_AF_RX_ADV
)
10460 PEER_CAP_ADDPATH_AF_RX_RCV
)) {
10472 PEER_CAP_ADDPATH_AF_RX_ADV
))
10484 PEER_CAP_ADDPATH_AF_RX_RCV
))
10491 PEER_CAP_ADDPATH_AF_RX_ADV
)
10495 vty_out(vty
, "\n");
10501 if (CHECK_FLAG(p
->cap
, PEER_CAP_DYNAMIC_RCV
)
10502 || CHECK_FLAG(p
->cap
,
10503 PEER_CAP_DYNAMIC_ADV
)) {
10504 vty_out(vty
, " Dynamic:");
10505 if (CHECK_FLAG(p
->cap
,
10506 PEER_CAP_DYNAMIC_ADV
))
10507 vty_out(vty
, " advertised");
10508 if (CHECK_FLAG(p
->cap
,
10509 PEER_CAP_DYNAMIC_RCV
))
10510 vty_out(vty
, " %sreceived",
10513 PEER_CAP_DYNAMIC_ADV
)
10516 vty_out(vty
, "\n");
10519 /* Extended nexthop */
10520 if (CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_RCV
)
10521 || CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_ADV
)) {
10522 vty_out(vty
, " Extended nexthop:");
10523 if (CHECK_FLAG(p
->cap
,
10524 PEER_CAP_ENHE_ADV
))
10525 vty_out(vty
, " advertised");
10526 if (CHECK_FLAG(p
->cap
,
10527 PEER_CAP_ENHE_RCV
))
10528 vty_out(vty
, " %sreceived",
10534 vty_out(vty
, "\n");
10536 if (CHECK_FLAG(p
->cap
,
10537 PEER_CAP_ENHE_RCV
)) {
10539 " Address families by peer:\n ");
10540 for (safi
= SAFI_UNICAST
;
10541 safi
< SAFI_MAX
; safi
++)
10546 PEER_CAP_ENHE_AF_RCV
))
10556 /* Route Refresh */
10557 if (CHECK_FLAG(p
->cap
, PEER_CAP_REFRESH_ADV
)
10558 || CHECK_FLAG(p
->cap
,
10559 PEER_CAP_REFRESH_NEW_RCV
)
10560 || CHECK_FLAG(p
->cap
,
10561 PEER_CAP_REFRESH_OLD_RCV
)) {
10562 vty_out(vty
, " Route refresh:");
10563 if (CHECK_FLAG(p
->cap
,
10564 PEER_CAP_REFRESH_ADV
))
10565 vty_out(vty
, " advertised");
10566 if (CHECK_FLAG(p
->cap
,
10567 PEER_CAP_REFRESH_NEW_RCV
)
10570 PEER_CAP_REFRESH_OLD_RCV
))
10571 vty_out(vty
, " %sreceived(%s)",
10574 PEER_CAP_REFRESH_ADV
)
10579 PEER_CAP_REFRESH_OLD_RCV
)
10582 PEER_CAP_REFRESH_NEW_RCV
))
10586 PEER_CAP_REFRESH_OLD_RCV
)
10590 vty_out(vty
, "\n");
10593 /* Multiprotocol Extensions */
10594 FOREACH_AFI_SAFI (afi
, safi
)
10595 if (p
->afc_adv
[afi
][safi
]
10596 || p
->afc_recv
[afi
][safi
]) {
10598 " Address Family %s:",
10603 if (p
->afc_adv
[afi
][safi
])
10606 if (p
->afc_recv
[afi
][safi
])
10613 vty_out(vty
, "\n");
10616 /* Hostname capability */
10617 vty_out(vty
, " Hostname Capability:");
10619 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_ADV
)) {
10621 " advertised (name: %s,domain name: %s)",
10622 bgp
->peer_self
->hostname
10626 bgp
->peer_self
->domainname
10631 vty_out(vty
, " not advertised");
10634 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_RCV
)) {
10636 " received (name: %s,domain name: %s)",
10637 p
->hostname
? p
->hostname
10639 p
->domainname
? p
->domainname
10642 vty_out(vty
, " not received");
10645 vty_out(vty
, "\n");
10647 /* Gracefull Restart */
10648 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
)
10649 || CHECK_FLAG(p
->cap
,
10650 PEER_CAP_RESTART_ADV
)) {
10652 " Graceful Restart Capabilty:");
10653 if (CHECK_FLAG(p
->cap
,
10654 PEER_CAP_RESTART_ADV
))
10655 vty_out(vty
, " advertised");
10656 if (CHECK_FLAG(p
->cap
,
10657 PEER_CAP_RESTART_RCV
))
10658 vty_out(vty
, " %sreceived",
10661 PEER_CAP_RESTART_ADV
)
10664 vty_out(vty
, "\n");
10666 if (CHECK_FLAG(p
->cap
,
10667 PEER_CAP_RESTART_RCV
)) {
10668 int restart_af_count
= 0;
10671 " Remote Restart timer is %d seconds\n",
10674 " Address families by peer:\n ");
10676 FOREACH_AFI_SAFI (afi
, safi
)
10681 PEER_CAP_RESTART_AF_RCV
)) {
10695 PEER_CAP_RESTART_AF_PRESERVE_RCV
)
10697 : "not preserved");
10698 restart_af_count
++;
10700 if (!restart_af_count
)
10701 vty_out(vty
, "none");
10702 vty_out(vty
, "\n");
10709 /* graceful restart information */
10710 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
) || p
->t_gr_restart
10711 || p
->t_gr_stale
) {
10712 json_object
*json_grace
= NULL
;
10713 json_object
*json_grace_send
= NULL
;
10714 json_object
*json_grace_recv
= NULL
;
10715 int eor_send_af_count
= 0;
10716 int eor_receive_af_count
= 0;
10719 json_grace
= json_object_new_object();
10720 json_grace_send
= json_object_new_object();
10721 json_grace_recv
= json_object_new_object();
10723 if (p
->status
== Established
) {
10724 FOREACH_AFI_SAFI (afi
, safi
) {
10725 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
10726 PEER_STATUS_EOR_SEND
)) {
10727 json_object_boolean_true_add(
10729 get_afi_safi_str(afi
,
10732 eor_send_af_count
++;
10735 FOREACH_AFI_SAFI (afi
, safi
) {
10737 p
->af_sflags
[afi
][safi
],
10738 PEER_STATUS_EOR_RECEIVED
)) {
10739 json_object_boolean_true_add(
10741 get_afi_safi_str(afi
,
10744 eor_receive_af_count
++;
10749 json_object_object_add(json_grace
, "endOfRibSend",
10751 json_object_object_add(json_grace
, "endOfRibRecv",
10754 if (p
->t_gr_restart
)
10755 json_object_int_add(json_grace
,
10756 "gracefulRestartTimerMsecs",
10757 thread_timer_remain_second(
10762 json_object_int_add(
10764 "gracefulStalepathTimerMsecs",
10765 thread_timer_remain_second(
10769 json_object_object_add(
10770 json_neigh
, "gracefulRestartInfo", json_grace
);
10772 vty_out(vty
, " Graceful restart information:\n");
10773 if (p
->status
== Established
) {
10774 vty_out(vty
, " End-of-RIB send: ");
10775 FOREACH_AFI_SAFI (afi
, safi
) {
10776 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
10777 PEER_STATUS_EOR_SEND
)) {
10778 vty_out(vty
, "%s%s",
10779 eor_send_af_count
? ", "
10781 get_afi_safi_str(afi
,
10784 eor_send_af_count
++;
10787 vty_out(vty
, "\n");
10788 vty_out(vty
, " End-of-RIB received: ");
10789 FOREACH_AFI_SAFI (afi
, safi
) {
10791 p
->af_sflags
[afi
][safi
],
10792 PEER_STATUS_EOR_RECEIVED
)) {
10793 vty_out(vty
, "%s%s",
10794 eor_receive_af_count
10797 get_afi_safi_str(afi
,
10800 eor_receive_af_count
++;
10803 vty_out(vty
, "\n");
10806 if (p
->t_gr_restart
)
10808 " The remaining time of restart timer is %ld\n",
10809 thread_timer_remain_second(
10814 " The remaining time of stalepath timer is %ld\n",
10815 thread_timer_remain_second(
10820 json_object
*json_stat
= NULL
;
10821 json_stat
= json_object_new_object();
10822 /* Packet counts. */
10823 json_object_int_add(json_stat
, "depthInq", 0);
10824 json_object_int_add(json_stat
, "depthOutq",
10825 (unsigned long)p
->obuf
->count
);
10826 json_object_int_add(json_stat
, "opensSent",
10827 atomic_load_explicit(&p
->open_out
,
10828 memory_order_relaxed
));
10829 json_object_int_add(json_stat
, "opensRecv",
10830 atomic_load_explicit(&p
->open_in
,
10831 memory_order_relaxed
));
10832 json_object_int_add(json_stat
, "notificationsSent",
10833 atomic_load_explicit(&p
->notify_out
,
10834 memory_order_relaxed
));
10835 json_object_int_add(json_stat
, "notificationsRecv",
10836 atomic_load_explicit(&p
->notify_in
,
10837 memory_order_relaxed
));
10838 json_object_int_add(json_stat
, "updatesSent",
10839 atomic_load_explicit(&p
->update_out
,
10840 memory_order_relaxed
));
10841 json_object_int_add(json_stat
, "updatesRecv",
10842 atomic_load_explicit(&p
->update_in
,
10843 memory_order_relaxed
));
10844 json_object_int_add(json_stat
, "keepalivesSent",
10845 atomic_load_explicit(&p
->keepalive_out
,
10846 memory_order_relaxed
));
10847 json_object_int_add(json_stat
, "keepalivesRecv",
10848 atomic_load_explicit(&p
->keepalive_in
,
10849 memory_order_relaxed
));
10850 json_object_int_add(json_stat
, "routeRefreshSent",
10851 atomic_load_explicit(&p
->refresh_out
,
10852 memory_order_relaxed
));
10853 json_object_int_add(json_stat
, "routeRefreshRecv",
10854 atomic_load_explicit(&p
->refresh_in
,
10855 memory_order_relaxed
));
10856 json_object_int_add(json_stat
, "capabilitySent",
10857 atomic_load_explicit(&p
->dynamic_cap_out
,
10858 memory_order_relaxed
));
10859 json_object_int_add(json_stat
, "capabilityRecv",
10860 atomic_load_explicit(&p
->dynamic_cap_in
,
10861 memory_order_relaxed
));
10862 json_object_int_add(json_stat
, "totalSent", PEER_TOTAL_TX(p
));
10863 json_object_int_add(json_stat
, "totalRecv", PEER_TOTAL_RX(p
));
10864 json_object_object_add(json_neigh
, "messageStats", json_stat
);
10866 /* Packet counts. */
10867 vty_out(vty
, " Message statistics:\n");
10868 vty_out(vty
, " Inq depth is 0\n");
10869 vty_out(vty
, " Outq depth is %lu\n",
10870 (unsigned long)p
->obuf
->count
);
10871 vty_out(vty
, " Sent Rcvd\n");
10872 vty_out(vty
, " Opens: %10d %10d\n",
10873 atomic_load_explicit(&p
->open_out
,
10874 memory_order_relaxed
),
10875 atomic_load_explicit(&p
->open_in
,
10876 memory_order_relaxed
));
10877 vty_out(vty
, " Notifications: %10d %10d\n",
10878 atomic_load_explicit(&p
->notify_out
,
10879 memory_order_relaxed
),
10880 atomic_load_explicit(&p
->notify_in
,
10881 memory_order_relaxed
));
10882 vty_out(vty
, " Updates: %10d %10d\n",
10883 atomic_load_explicit(&p
->update_out
,
10884 memory_order_relaxed
),
10885 atomic_load_explicit(&p
->update_in
,
10886 memory_order_relaxed
));
10887 vty_out(vty
, " Keepalives: %10d %10d\n",
10888 atomic_load_explicit(&p
->keepalive_out
,
10889 memory_order_relaxed
),
10890 atomic_load_explicit(&p
->keepalive_in
,
10891 memory_order_relaxed
));
10892 vty_out(vty
, " Route Refresh: %10d %10d\n",
10893 atomic_load_explicit(&p
->refresh_out
,
10894 memory_order_relaxed
),
10895 atomic_load_explicit(&p
->refresh_in
,
10896 memory_order_relaxed
));
10897 vty_out(vty
, " Capability: %10d %10d\n",
10898 atomic_load_explicit(&p
->dynamic_cap_out
,
10899 memory_order_relaxed
),
10900 atomic_load_explicit(&p
->dynamic_cap_in
,
10901 memory_order_relaxed
));
10902 vty_out(vty
, " Total: %10d %10d\n", PEER_TOTAL_TX(p
),
10907 /* advertisement-interval */
10908 json_object_int_add(json_neigh
,
10909 "minBtwnAdvertisementRunsTimerMsecs",
10910 p
->v_routeadv
* 1000);
10912 /* Update-source. */
10913 if (p
->update_if
|| p
->update_source
) {
10915 json_object_string_add(json_neigh
,
10918 else if (p
->update_source
)
10919 json_object_string_add(
10920 json_neigh
, "updateSource",
10921 sockunion2str(p
->update_source
, buf1
,
10925 /* advertisement-interval */
10927 " Minimum time between advertisement runs is %d seconds\n",
10930 /* Update-source. */
10931 if (p
->update_if
|| p
->update_source
) {
10932 vty_out(vty
, " Update source is ");
10934 vty_out(vty
, "%s", p
->update_if
);
10935 else if (p
->update_source
)
10937 sockunion2str(p
->update_source
, buf1
,
10939 vty_out(vty
, "\n");
10942 vty_out(vty
, "\n");
10945 /* Address Family Information */
10946 json_object
*json_hold
= NULL
;
10949 json_hold
= json_object_new_object();
10951 FOREACH_AFI_SAFI (afi
, safi
)
10952 if (p
->afc
[afi
][safi
])
10953 bgp_show_peer_afi(vty
, p
, afi
, safi
, use_json
,
10957 json_object_object_add(json_neigh
, "addressFamilyInfo",
10959 json_object_int_add(json_neigh
, "connectionsEstablished",
10961 json_object_int_add(json_neigh
, "connectionsDropped",
10964 vty_out(vty
, " Connections established %d; dropped %d\n",
10965 p
->established
, p
->dropped
);
10967 if (!p
->last_reset
) {
10969 json_object_string_add(json_neigh
, "lastReset",
10972 vty_out(vty
, " Last reset never\n");
10978 uptime
= bgp_clock();
10979 uptime
-= p
->resettime
;
10980 tm
= gmtime(&uptime
);
10981 json_object_int_add(json_neigh
, "lastResetTimerMsecs",
10982 (tm
->tm_sec
* 1000)
10983 + (tm
->tm_min
* 60000)
10984 + (tm
->tm_hour
* 3600000));
10985 bgp_show_peer_reset(NULL
, p
, json_neigh
, true);
10987 vty_out(vty
, " Last reset %s, ",
10988 peer_uptime(p
->resettime
, timebuf
,
10989 BGP_UPTIME_LEN
, 0, NULL
));
10991 bgp_show_peer_reset(vty
, p
, NULL
, false);
10992 if (p
->last_reset_cause_size
) {
10993 msg
= p
->last_reset_cause
;
10995 " Message received that caused BGP to send a NOTIFICATION:\n ");
10996 for (i
= 1; i
<= p
->last_reset_cause_size
;
10998 vty_out(vty
, "%02X", *msg
++);
11000 if (i
!= p
->last_reset_cause_size
) {
11002 vty_out(vty
, "\n ");
11003 } else if (i
% 4 == 0) {
11008 vty_out(vty
, "\n");
11013 if (CHECK_FLAG(p
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
)) {
11015 json_object_boolean_true_add(json_neigh
,
11016 "prefixesConfigExceedMax");
11019 " Peer had exceeded the max. no. of prefixes configured.\n");
11021 if (p
->t_pmax_restart
) {
11023 json_object_boolean_true_add(
11024 json_neigh
, "reducePrefixNumFrom");
11025 json_object_int_add(json_neigh
,
11026 "restartInTimerMsec",
11027 thread_timer_remain_second(
11032 " Reduce the no. of prefix from %s, will restart in %ld seconds\n",
11033 p
->host
, thread_timer_remain_second(
11034 p
->t_pmax_restart
));
11037 json_object_boolean_true_add(
11039 "reducePrefixNumAndClearIpBgp");
11042 " Reduce the no. of prefix and clear ip bgp %s to restore peering\n",
11047 /* EBGP Multihop and GTSM */
11048 if (p
->sort
!= BGP_PEER_IBGP
) {
11050 if (p
->gtsm_hops
> 0)
11051 json_object_int_add(json_neigh
,
11052 "externalBgpNbrMaxHopsAway",
11054 else if (p
->ttl
> BGP_DEFAULT_TTL
)
11055 json_object_int_add(json_neigh
,
11056 "externalBgpNbrMaxHopsAway",
11059 if (p
->gtsm_hops
> 0)
11061 " External BGP neighbor may be up to %d hops away.\n",
11063 else if (p
->ttl
> BGP_DEFAULT_TTL
)
11065 " External BGP neighbor may be up to %d hops away.\n",
11069 if (p
->gtsm_hops
> 0) {
11071 json_object_int_add(json_neigh
,
11072 "internalBgpNbrMaxHopsAway",
11076 " Internal BGP neighbor may be up to %d hops away.\n",
11081 /* Local address. */
11084 json_object_string_add(json_neigh
, "hostLocal",
11085 sockunion2str(p
->su_local
, buf1
,
11087 json_object_int_add(json_neigh
, "portLocal",
11088 ntohs(p
->su_local
->sin
.sin_port
));
11090 vty_out(vty
, "Local host: %s, Local port: %d\n",
11091 sockunion2str(p
->su_local
, buf1
, SU_ADDRSTRLEN
),
11092 ntohs(p
->su_local
->sin
.sin_port
));
11095 /* Remote address. */
11096 if (p
->su_remote
) {
11098 json_object_string_add(json_neigh
, "hostForeign",
11099 sockunion2str(p
->su_remote
, buf1
,
11101 json_object_int_add(json_neigh
, "portForeign",
11102 ntohs(p
->su_remote
->sin
.sin_port
));
11104 vty_out(vty
, "Foreign host: %s, Foreign port: %d\n",
11105 sockunion2str(p
->su_remote
, buf1
,
11107 ntohs(p
->su_remote
->sin
.sin_port
));
11110 /* Nexthop display. */
11113 json_object_string_add(json_neigh
, "nexthop",
11115 &p
->nexthop
.v4
, buf1
,
11117 json_object_string_add(json_neigh
, "nexthopGlobal",
11118 inet_ntop(AF_INET6
,
11119 &p
->nexthop
.v6_global
,
11120 buf1
, sizeof(buf1
)));
11121 json_object_string_add(json_neigh
, "nexthopLocal",
11122 inet_ntop(AF_INET6
,
11123 &p
->nexthop
.v6_local
,
11124 buf1
, sizeof(buf1
)));
11125 if (p
->shared_network
)
11126 json_object_string_add(json_neigh
,
11130 json_object_string_add(json_neigh
,
11132 "nonSharedNetwork");
11134 vty_out(vty
, "Nexthop: %s\n",
11135 inet_ntop(AF_INET
, &p
->nexthop
.v4
, buf1
,
11137 vty_out(vty
, "Nexthop global: %s\n",
11138 inet_ntop(AF_INET6
, &p
->nexthop
.v6_global
, buf1
,
11140 vty_out(vty
, "Nexthop local: %s\n",
11141 inet_ntop(AF_INET6
, &p
->nexthop
.v6_local
, buf1
,
11143 vty_out(vty
, "BGP connection: %s\n",
11144 p
->shared_network
? "shared network"
11145 : "non shared network");
11149 /* Timer information. */
11151 json_object_int_add(json_neigh
, "connectRetryTimer",
11153 if (p
->status
== Established
&& p
->rtt
)
11154 json_object_int_add(json_neigh
, "estimatedRttInMsecs",
11157 json_object_int_add(
11158 json_neigh
, "nextStartTimerDueInMsecs",
11159 thread_timer_remain_second(p
->t_start
) * 1000);
11161 json_object_int_add(
11162 json_neigh
, "nextConnectTimerDueInMsecs",
11163 thread_timer_remain_second(p
->t_connect
)
11165 if (p
->t_routeadv
) {
11166 json_object_int_add(json_neigh
, "mraiInterval",
11168 json_object_int_add(
11169 json_neigh
, "mraiTimerExpireInMsecs",
11170 thread_timer_remain_second(p
->t_routeadv
)
11174 json_object_int_add(json_neigh
, "authenticationEnabled",
11178 json_object_string_add(json_neigh
, "readThread", "on");
11180 json_object_string_add(json_neigh
, "readThread", "off");
11182 if (CHECK_FLAG(p
->thread_flags
, PEER_THREAD_WRITES_ON
))
11183 json_object_string_add(json_neigh
, "writeThread", "on");
11185 json_object_string_add(json_neigh
, "writeThread",
11188 vty_out(vty
, "BGP Connect Retry Timer in Seconds: %d\n",
11190 if (p
->status
== Established
&& p
->rtt
)
11191 vty_out(vty
, "Estimated round trip time: %d ms\n",
11194 vty_out(vty
, "Next start timer due in %ld seconds\n",
11195 thread_timer_remain_second(p
->t_start
));
11197 vty_out(vty
, "Next connect timer due in %ld seconds\n",
11198 thread_timer_remain_second(p
->t_connect
));
11201 "MRAI (interval %u) timer expires in %ld seconds\n",
11203 thread_timer_remain_second(p
->t_routeadv
));
11205 vty_out(vty
, "Peer Authentication Enabled\n");
11207 vty_out(vty
, "Read thread: %s Write thread: %s FD used: %d\n",
11208 p
->t_read
? "on" : "off",
11209 CHECK_FLAG(p
->thread_flags
, PEER_THREAD_WRITES_ON
)
11214 if (p
->notify
.code
== BGP_NOTIFY_OPEN_ERR
11215 && p
->notify
.subcode
== BGP_NOTIFY_OPEN_UNSUP_CAPBL
)
11216 bgp_capability_vty_out(vty
, p
, use_json
, json_neigh
);
11219 vty_out(vty
, "\n");
11221 /* BFD information. */
11222 bgp_bfd_show_info(vty
, p
, use_json
, json_neigh
);
11225 if (p
->conf_if
) /* Configured interface name. */
11226 json_object_object_add(json
, p
->conf_if
, json_neigh
);
11227 else /* Configured IP address. */
11228 json_object_object_add(json
, p
->host
, json_neigh
);
11232 static int bgp_show_neighbor(struct vty
*vty
, struct bgp
*bgp
,
11233 enum show_type type
, union sockunion
*su
,
11234 const char *conf_if
, bool use_json
,
11237 struct listnode
*node
, *nnode
;
11240 bool nbr_output
= false;
11241 afi_t afi
= AFI_MAX
;
11242 safi_t safi
= SAFI_MAX
;
11244 if (type
== show_ipv4_peer
|| type
== show_ipv4_all
) {
11246 } else if (type
== show_ipv6_peer
|| type
== show_ipv6_all
) {
11250 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
11251 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
11256 bgp_show_peer(vty
, peer
, use_json
, json
);
11262 && !strcmp(peer
->conf_if
, conf_if
))
11264 && !strcmp(peer
->hostname
, conf_if
))) {
11266 bgp_show_peer(vty
, peer
, use_json
,
11270 if (sockunion_same(&peer
->su
, su
)) {
11272 bgp_show_peer(vty
, peer
, use_json
,
11277 case show_ipv4_peer
:
11278 case show_ipv6_peer
:
11279 FOREACH_SAFI (safi
) {
11280 if (peer
->afc
[afi
][safi
]) {
11283 && !strcmp(peer
->conf_if
, conf_if
))
11285 && !strcmp(peer
->hostname
, conf_if
))) {
11287 bgp_show_peer(vty
, peer
, use_json
,
11292 if (sockunion_same(&peer
->su
, su
)) {
11294 bgp_show_peer(vty
, peer
, use_json
,
11302 case show_ipv4_all
:
11303 case show_ipv6_all
:
11304 FOREACH_SAFI (safi
) {
11305 if (peer
->afc
[afi
][safi
]) {
11306 bgp_show_peer(vty
, peer
, use_json
, json
);
11315 if ((type
== show_peer
|| type
== show_ipv4_peer
||
11316 type
== show_ipv6_peer
) && !find
) {
11318 json_object_boolean_true_add(json
, "bgpNoSuchNeighbor");
11320 vty_out(vty
, "%% No such neighbor in this view/vrf\n");
11323 if (type
!= show_peer
&& type
!= show_ipv4_peer
&&
11324 type
!= show_ipv6_peer
&& !nbr_output
&& !use_json
)
11325 vty_out(vty
, "%% No BGP neighbors found\n");
11328 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
11329 json
, JSON_C_TO_STRING_PRETTY
));
11331 vty_out(vty
, "\n");
11334 return CMD_SUCCESS
;
11337 static void bgp_show_all_instances_neighbors_vty(struct vty
*vty
,
11338 enum show_type type
,
11339 const char *ip_str
,
11342 struct listnode
*node
, *nnode
;
11344 union sockunion su
;
11345 json_object
*json
= NULL
;
11346 int ret
, is_first
= 1;
11347 bool nbr_output
= false;
11350 vty_out(vty
, "{\n");
11352 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
11355 if (!(json
= json_object_new_object())) {
11357 EC_BGP_JSON_MEM_ERROR
,
11358 "Unable to allocate memory for JSON object");
11360 "{\"error\": {\"message:\": \"Unable to allocate memory for JSON object\"}}}\n");
11364 json_object_int_add(json
, "vrfId",
11365 (bgp
->vrf_id
== VRF_UNKNOWN
)
11367 : (int64_t)bgp
->vrf_id
);
11368 json_object_string_add(
11370 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
11375 vty_out(vty
, ",\n");
11379 vty_out(vty
, "\"%s\":",
11380 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
11384 vty_out(vty
, "\nInstance %s:\n",
11385 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
11390 if (type
== show_peer
|| type
== show_ipv4_peer
||
11391 type
== show_ipv6_peer
) {
11392 ret
= str2sockunion(ip_str
, &su
);
11394 bgp_show_neighbor(vty
, bgp
, type
, NULL
, ip_str
,
11397 bgp_show_neighbor(vty
, bgp
, type
, &su
, NULL
,
11400 bgp_show_neighbor(vty
, bgp
, type
, NULL
, NULL
,
11403 json_object_free(json
);
11407 vty_out(vty
, "}\n");
11408 json_object_free(json
);
11410 else if (!nbr_output
)
11411 vty_out(vty
, "%% BGP instance not found\n");
11414 static int bgp_show_neighbor_vty(struct vty
*vty
, const char *name
,
11415 enum show_type type
, const char *ip_str
,
11420 union sockunion su
;
11421 json_object
*json
= NULL
;
11424 if (strmatch(name
, "all")) {
11425 bgp_show_all_instances_neighbors_vty(vty
, type
, ip_str
,
11427 return CMD_SUCCESS
;
11429 bgp
= bgp_lookup_by_name(name
);
11432 json
= json_object_new_object();
11433 vty_out(vty
, "%s\n",
11434 json_object_to_json_string_ext(
11436 JSON_C_TO_STRING_PRETTY
));
11437 json_object_free(json
);
11440 "%% BGP instance not found\n");
11442 return CMD_WARNING
;
11446 bgp
= bgp_get_default();
11450 json
= json_object_new_object();
11452 ret
= str2sockunion(ip_str
, &su
);
11454 bgp_show_neighbor(vty
, bgp
, type
, NULL
, ip_str
,
11457 bgp_show_neighbor(vty
, bgp
, type
, &su
, NULL
,
11460 bgp_show_neighbor(vty
, bgp
, type
, NULL
, NULL
, use_json
,
11463 json_object_free(json
);
11466 vty_out(vty
, "{}\n");
11468 vty_out(vty
, "%% BGP instance not found\n");
11471 return CMD_SUCCESS
;
11474 /* "show [ip] bgp neighbors" commands. */
11475 DEFUN (show_ip_bgp_neighbors
,
11476 show_ip_bgp_neighbors_cmd
,
11477 "show [ip] bgp [<view|vrf> VIEWVRFNAME] [<ipv4|ipv6>] neighbors [<A.B.C.D|X:X::X:X|WORD>] [json]",
11481 BGP_INSTANCE_HELP_STR
11484 "Detailed information on TCP and BGP neighbor connections\n"
11485 "Neighbor to display information about\n"
11486 "Neighbor to display information about\n"
11487 "Neighbor on BGP configured interface\n"
11491 char *sh_arg
= NULL
;
11492 enum show_type sh_type
;
11493 afi_t afi
= AFI_MAX
;
11495 bool uj
= use_json(argc
, argv
);
11499 /* [<vrf> VIEWVRFNAME] */
11500 if (argv_find(argv
, argc
, "vrf", &idx
)) {
11501 vrf
= argv
[idx
+ 1]->arg
;
11502 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
11504 } else if (argv_find(argv
, argc
, "view", &idx
))
11505 /* [<view> VIEWVRFNAME] */
11506 vrf
= argv
[idx
+ 1]->arg
;
11510 if (argv_find(argv
, argc
, "ipv4", &idx
)) {
11511 sh_type
= show_ipv4_all
;
11513 } else if (argv_find(argv
, argc
, "ipv6", &idx
)) {
11514 sh_type
= show_ipv6_all
;
11517 sh_type
= show_all
;
11520 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)
11521 || argv_find(argv
, argc
, "X:X::X:X", &idx
)
11522 || argv_find(argv
, argc
, "WORD", &idx
)) {
11523 sh_type
= show_peer
;
11524 sh_arg
= argv
[idx
]->arg
;
11527 if (sh_type
== show_peer
&& afi
== AFI_IP
) {
11528 sh_type
= show_ipv4_peer
;
11529 } else if (sh_type
== show_peer
&& afi
== AFI_IP6
) {
11530 sh_type
= show_ipv6_peer
;
11533 return bgp_show_neighbor_vty(vty
, vrf
, sh_type
, sh_arg
, uj
);
11536 /* Show BGP's AS paths internal data. There are both `show [ip] bgp
11537 paths' and `show ip mbgp paths'. Those functions results are the
11539 DEFUN (show_ip_bgp_paths
,
11540 show_ip_bgp_paths_cmd
,
11541 "show [ip] bgp ["BGP_SAFI_CMD_STR
"] paths",
11546 "Path information\n")
11548 vty_out(vty
, "Address Refcnt Path\n");
11549 aspath_print_all_vty(vty
);
11550 return CMD_SUCCESS
;
11555 static void community_show_all_iterator(struct hash_bucket
*bucket
,
11558 struct community
*com
;
11560 com
= (struct community
*)bucket
->data
;
11561 vty_out(vty
, "[%p] (%ld) %s\n", (void *)com
, com
->refcnt
,
11562 community_str(com
, false));
11565 /* Show BGP's community internal data. */
11566 DEFUN (show_ip_bgp_community_info
,
11567 show_ip_bgp_community_info_cmd
,
11568 "show [ip] bgp community-info",
11572 "List all bgp community information\n")
11574 vty_out(vty
, "Address Refcnt Community\n");
11576 hash_iterate(community_hash(),
11577 (void (*)(struct hash_bucket
*,
11578 void *))community_show_all_iterator
,
11581 return CMD_SUCCESS
;
11584 static void lcommunity_show_all_iterator(struct hash_bucket
*bucket
,
11587 struct lcommunity
*lcom
;
11589 lcom
= (struct lcommunity
*)bucket
->data
;
11590 vty_out(vty
, "[%p] (%ld) %s\n", (void *)lcom
, lcom
->refcnt
,
11591 lcommunity_str(lcom
, false));
11594 /* Show BGP's community internal data. */
11595 DEFUN (show_ip_bgp_lcommunity_info
,
11596 show_ip_bgp_lcommunity_info_cmd
,
11597 "show ip bgp large-community-info",
11601 "List all bgp large-community information\n")
11603 vty_out(vty
, "Address Refcnt Large-community\n");
11605 hash_iterate(lcommunity_hash(),
11606 (void (*)(struct hash_bucket
*,
11607 void *))lcommunity_show_all_iterator
,
11610 return CMD_SUCCESS
;
11614 DEFUN (show_ip_bgp_attr_info
,
11615 show_ip_bgp_attr_info_cmd
,
11616 "show [ip] bgp attribute-info",
11620 "List all bgp attribute information\n")
11622 attr_show_all(vty
);
11623 return CMD_SUCCESS
;
11626 static int bgp_show_route_leak_vty(struct vty
*vty
, const char *name
,
11627 afi_t afi
, safi_t safi
,
11628 bool use_json
, json_object
*json
)
11631 struct listnode
*node
;
11633 char buf1
[INET6_ADDRSTRLEN
];
11635 vpn_policy_direction_t dir
;
11638 json_object
*json_import_vrfs
= NULL
;
11639 json_object
*json_export_vrfs
= NULL
;
11641 bgp
= name
? bgp_lookup_by_name(name
) : bgp_get_default();
11644 vty_out(vty
, "%s\n",
11645 json_object_to_json_string_ext(
11647 JSON_C_TO_STRING_PRETTY
));
11648 json_object_free(json
);
11650 return CMD_WARNING
;
11653 /* Provide context for the block */
11654 json_object_string_add(json
, "vrf", name
? name
: "default");
11655 json_object_string_add(json
, "afiSafi",
11656 get_afi_safi_str(afi
, safi
, true));
11658 if (!CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
11659 BGP_CONFIG_VRF_TO_VRF_IMPORT
)) {
11660 json_object_string_add(json
, "importFromVrfs", "none");
11661 json_object_string_add(json
, "importRts", "none");
11663 json_import_vrfs
= json_object_new_array();
11665 for (ALL_LIST_ELEMENTS_RO(
11666 bgp
->vpn_policy
[afi
].import_vrf
,
11668 json_object_array_add(json_import_vrfs
,
11669 json_object_new_string(vname
));
11671 json_object_object_add(json
, "importFromVrfs",
11673 dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
11674 if (bgp
->vpn_policy
[afi
].rtlist
[dir
]) {
11675 ecom_str
= ecommunity_ecom2str(
11676 bgp
->vpn_policy
[afi
].rtlist
[dir
],
11677 ECOMMUNITY_FORMAT_ROUTE_MAP
, 0);
11678 json_object_string_add(json
, "importRts",
11680 XFREE(MTYPE_ECOMMUNITY_STR
, ecom_str
);
11682 json_object_string_add(json
, "importRts",
11686 if (!CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
11687 BGP_CONFIG_VRF_TO_VRF_EXPORT
)) {
11688 json_object_string_add(json
, "exportToVrfs", "none");
11689 json_object_string_add(json
, "routeDistinguisher",
11691 json_object_string_add(json
, "exportRts", "none");
11693 json_export_vrfs
= json_object_new_array();
11695 for (ALL_LIST_ELEMENTS_RO(
11696 bgp
->vpn_policy
[afi
].export_vrf
,
11698 json_object_array_add(json_export_vrfs
,
11699 json_object_new_string(vname
));
11700 json_object_object_add(json
, "exportToVrfs",
11702 json_object_string_add(json
, "routeDistinguisher",
11703 prefix_rd2str(&bgp
->vpn_policy
[afi
].tovpn_rd
,
11704 buf1
, RD_ADDRSTRLEN
));
11706 dir
= BGP_VPN_POLICY_DIR_TOVPN
;
11707 if (bgp
->vpn_policy
[afi
].rtlist
[dir
]) {
11708 ecom_str
= ecommunity_ecom2str(
11709 bgp
->vpn_policy
[afi
].rtlist
[dir
],
11710 ECOMMUNITY_FORMAT_ROUTE_MAP
, 0);
11711 json_object_string_add(json
, "exportRts",
11713 XFREE(MTYPE_ECOMMUNITY_STR
, ecom_str
);
11715 json_object_string_add(json
, "exportRts",
11720 vty_out(vty
, "%s\n",
11721 json_object_to_json_string_ext(json
,
11722 JSON_C_TO_STRING_PRETTY
));
11723 json_object_free(json
);
11726 bgp
= name
? bgp_lookup_by_name(name
) : bgp_get_default();
11729 vty_out(vty
, "%% No such BGP instance exist\n");
11730 return CMD_WARNING
;
11733 if (!CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
11734 BGP_CONFIG_VRF_TO_VRF_IMPORT
))
11736 "This VRF is not importing %s routes from any other VRF\n",
11737 get_afi_safi_str(afi
, safi
, false));
11740 "This VRF is importing %s routes from the following VRFs:\n",
11741 get_afi_safi_str(afi
, safi
, false));
11743 for (ALL_LIST_ELEMENTS_RO(
11744 bgp
->vpn_policy
[afi
].import_vrf
,
11746 vty_out(vty
, " %s\n", vname
);
11748 dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
11750 if (bgp
->vpn_policy
[afi
].rtlist
[dir
]) {
11751 ecom_str
= ecommunity_ecom2str(
11752 bgp
->vpn_policy
[afi
].rtlist
[dir
],
11753 ECOMMUNITY_FORMAT_ROUTE_MAP
, 0);
11754 vty_out(vty
, "Import RT(s): %s\n", ecom_str
);
11756 XFREE(MTYPE_ECOMMUNITY_STR
, ecom_str
);
11758 vty_out(vty
, "Import RT(s):\n");
11761 if (!CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
11762 BGP_CONFIG_VRF_TO_VRF_EXPORT
))
11764 "This VRF is not exporting %s routes to any other VRF\n",
11765 get_afi_safi_str(afi
, safi
, false));
11768 "This VRF is exporting %s routes to the following VRFs:\n",
11769 get_afi_safi_str(afi
, safi
, false));
11771 for (ALL_LIST_ELEMENTS_RO(
11772 bgp
->vpn_policy
[afi
].export_vrf
,
11774 vty_out(vty
, " %s\n", vname
);
11776 vty_out(vty
, "RD: %s\n",
11777 prefix_rd2str(&bgp
->vpn_policy
[afi
].tovpn_rd
,
11778 buf1
, RD_ADDRSTRLEN
));
11780 dir
= BGP_VPN_POLICY_DIR_TOVPN
;
11781 if (bgp
->vpn_policy
[afi
].rtlist
[dir
]) {
11782 ecom_str
= ecommunity_ecom2str(
11783 bgp
->vpn_policy
[afi
].rtlist
[dir
],
11784 ECOMMUNITY_FORMAT_ROUTE_MAP
, 0);
11785 vty_out(vty
, "Export RT: %s\n", ecom_str
);
11786 XFREE(MTYPE_ECOMMUNITY_STR
, ecom_str
);
11788 vty_out(vty
, "Import RT(s):\n");
11792 return CMD_SUCCESS
;
11795 static int bgp_show_all_instance_route_leak_vty(struct vty
*vty
, afi_t afi
,
11796 safi_t safi
, bool use_json
)
11798 struct listnode
*node
, *nnode
;
11800 char *vrf_name
= NULL
;
11801 json_object
*json
= NULL
;
11802 json_object
*json_vrf
= NULL
;
11803 json_object
*json_vrfs
= NULL
;
11806 json
= json_object_new_object();
11807 json_vrfs
= json_object_new_object();
11810 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
11812 if (bgp
->inst_type
!= BGP_INSTANCE_TYPE_DEFAULT
)
11813 vrf_name
= bgp
->name
;
11816 json_vrf
= json_object_new_object();
11818 vty_out(vty
, "\nInstance %s:\n",
11819 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
11820 ? VRF_DEFAULT_NAME
: bgp
->name
);
11822 bgp_show_route_leak_vty(vty
, vrf_name
, afi
, safi
, 0, json_vrf
);
11824 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
11825 json_object_object_add(json_vrfs
,
11826 VRF_DEFAULT_NAME
, json_vrf
);
11828 json_object_object_add(json_vrfs
, vrf_name
,
11834 json_object_object_add(json
, "vrfs", json_vrfs
);
11835 vty_out(vty
, "%s\n", json_object_to_json_string_ext(json
,
11836 JSON_C_TO_STRING_PRETTY
));
11837 json_object_free(json
);
11840 return CMD_SUCCESS
;
11843 /* "show [ip] bgp route-leak" command. */
11844 DEFUN (show_ip_bgp_route_leak
,
11845 show_ip_bgp_route_leak_cmd
,
11846 "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR
" ["BGP_SAFI_CMD_STR
"]] route-leak [json]",
11850 BGP_INSTANCE_HELP_STR
11853 "Route leaking information\n"
11857 afi_t afi
= AFI_MAX
;
11858 safi_t safi
= SAFI_MAX
;
11860 bool uj
= use_json(argc
, argv
);
11862 json_object
*json
= NULL
;
11864 /* show [ip] bgp */
11865 if (argv_find(argv
, argc
, "ip", &idx
)) {
11867 safi
= SAFI_UNICAST
;
11869 /* [vrf VIEWVRFNAME] */
11870 if (argv_find(argv
, argc
, "view", &idx
)) {
11872 "%% This command is not applicable to BGP views\n");
11873 return CMD_WARNING
;
11876 if (argv_find(argv
, argc
, "vrf", &idx
)) {
11877 vrf
= argv
[idx
+ 1]->arg
;
11878 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
11881 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
11882 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
)) {
11883 argv_find_and_parse_safi(argv
, argc
, &idx
, &safi
);
11886 if (!((afi
== AFI_IP
|| afi
== AFI_IP6
) && safi
== SAFI_UNICAST
)) {
11888 "%% This command is applicable only for unicast ipv4|ipv6\n");
11889 return CMD_WARNING
;
11892 if (vrf
&& strmatch(vrf
, "all"))
11893 return bgp_show_all_instance_route_leak_vty(vty
, afi
, safi
, uj
);
11896 json
= json_object_new_object();
11898 return bgp_show_route_leak_vty(vty
, vrf
, afi
, safi
, uj
, json
);
11901 static void bgp_show_all_instances_updgrps_vty(struct vty
*vty
, afi_t afi
,
11904 struct listnode
*node
, *nnode
;
11907 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
11908 vty_out(vty
, "\nInstance %s:\n",
11909 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
11912 update_group_show(bgp
, afi
, safi
, vty
, 0);
11916 static int bgp_show_update_groups(struct vty
*vty
, const char *name
, int afi
,
11917 int safi
, uint64_t subgrp_id
)
11922 if (strmatch(name
, "all")) {
11923 bgp_show_all_instances_updgrps_vty(vty
, afi
, safi
);
11924 return CMD_SUCCESS
;
11926 bgp
= bgp_lookup_by_name(name
);
11929 bgp
= bgp_get_default();
11933 update_group_show(bgp
, afi
, safi
, vty
, subgrp_id
);
11934 return CMD_SUCCESS
;
11937 DEFUN (show_ip_bgp_updgrps
,
11938 show_ip_bgp_updgrps_cmd
,
11939 "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR
" ["BGP_SAFI_WITH_LABEL_CMD_STR
"]] update-groups [SUBGROUP-ID]",
11943 BGP_INSTANCE_HELP_STR
11945 BGP_SAFI_WITH_LABEL_HELP_STR
11946 "Detailed info about dynamic update groups\n"
11947 "Specific subgroup to display detailed info for\n")
11950 afi_t afi
= AFI_IP6
;
11951 safi_t safi
= SAFI_UNICAST
;
11952 uint64_t subgrp_id
= 0;
11956 /* show [ip] bgp */
11957 if (argv_find(argv
, argc
, "ip", &idx
))
11959 /* [<vrf> VIEWVRFNAME] */
11960 if (argv_find(argv
, argc
, "vrf", &idx
)) {
11961 vrf
= argv
[idx
+ 1]->arg
;
11962 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
11964 } else if (argv_find(argv
, argc
, "view", &idx
))
11965 /* [<view> VIEWVRFNAME] */
11966 vrf
= argv
[idx
+ 1]->arg
;
11967 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
11968 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
)) {
11969 argv_find_and_parse_safi(argv
, argc
, &idx
, &safi
);
11972 /* get subgroup id, if provided */
11974 if (argv
[idx
]->type
== VARIABLE_TKN
)
11975 subgrp_id
= strtoull(argv
[idx
]->arg
, NULL
, 10);
11977 return (bgp_show_update_groups(vty
, vrf
, afi
, safi
, subgrp_id
));
11980 DEFUN (show_bgp_instance_all_ipv6_updgrps
,
11981 show_bgp_instance_all_ipv6_updgrps_cmd
,
11982 "show [ip] bgp <view|vrf> all update-groups",
11986 BGP_INSTANCE_ALL_HELP_STR
11987 "Detailed info about dynamic update groups\n")
11989 bgp_show_all_instances_updgrps_vty(vty
, AFI_IP6
, SAFI_UNICAST
);
11990 return CMD_SUCCESS
;
11993 DEFUN (show_bgp_l2vpn_evpn_updgrps
,
11994 show_bgp_l2vpn_evpn_updgrps_cmd
,
11995 "show [ip] bgp l2vpn evpn update-groups",
11999 "l2vpn address family\n"
12000 "evpn sub-address family\n"
12001 "Detailed info about dynamic update groups\n")
12004 uint64_t subgrp_id
= 0;
12006 bgp_show_update_groups(vty
, vrf
, AFI_L2VPN
, SAFI_EVPN
, subgrp_id
);
12007 return CMD_SUCCESS
;
12010 DEFUN (show_bgp_updgrps_stats
,
12011 show_bgp_updgrps_stats_cmd
,
12012 "show [ip] bgp update-groups statistics",
12016 "Detailed info about dynamic update groups\n"
12021 bgp
= bgp_get_default();
12023 update_group_show_stats(bgp
, vty
);
12025 return CMD_SUCCESS
;
12028 DEFUN (show_bgp_instance_updgrps_stats
,
12029 show_bgp_instance_updgrps_stats_cmd
,
12030 "show [ip] bgp <view|vrf> VIEWVRFNAME update-groups statistics",
12034 BGP_INSTANCE_HELP_STR
12035 "Detailed info about dynamic update groups\n"
12041 bgp
= bgp_lookup_by_name(argv
[idx_word
]->arg
);
12043 update_group_show_stats(bgp
, vty
);
12045 return CMD_SUCCESS
;
12048 static void show_bgp_updgrps_adj_info_aux(struct vty
*vty
, const char *name
,
12049 afi_t afi
, safi_t safi
,
12050 const char *what
, uint64_t subgrp_id
)
12055 bgp
= bgp_lookup_by_name(name
);
12057 bgp
= bgp_get_default();
12060 if (!strcmp(what
, "advertise-queue"))
12061 update_group_show_adj_queue(bgp
, afi
, safi
, vty
,
12063 else if (!strcmp(what
, "advertised-routes"))
12064 update_group_show_advertised(bgp
, afi
, safi
, vty
,
12066 else if (!strcmp(what
, "packet-queue"))
12067 update_group_show_packet_queue(bgp
, afi
, safi
, vty
,
12072 DEFPY(show_ip_bgp_instance_updgrps_adj_s
,
12073 show_ip_bgp_instance_updgrps_adj_s_cmd
,
12074 "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",
12075 SHOW_STR IP_STR BGP_STR BGP_INSTANCE_HELP_STR BGP_AFI_HELP_STR
12077 "Detailed info about dynamic update groups\n"
12078 "Specific subgroup to display info for\n"
12079 "Advertisement queue\n"
12080 "Announced routes\n"
12083 uint64_t subgrp_id
= 0;
12087 subgrp_id
= strtoull(sgid
, NULL
, 10);
12092 afiz
= bgp_vty_afi_from_str(afi
);
12096 afiz
= bgp_vty_afi_from_str(afi
);
12097 if (afiz
!= AFI_IP
)
12099 "%% Cannot specify both 'ip' and 'ipv6'\n");
12100 return CMD_WARNING
;
12103 safiz
= safi
? bgp_vty_safi_from_str(safi
) : SAFI_UNICAST
;
12105 show_bgp_updgrps_adj_info_aux(vty
, vrf
, afiz
, safiz
, rtq
, subgrp_id
);
12106 return CMD_SUCCESS
;
12109 static int bgp_show_one_peer_group(struct vty
*vty
, struct peer_group
*group
)
12111 struct listnode
*node
, *nnode
;
12112 struct prefix
*range
;
12115 char buf
[PREFIX2STR_BUFFER
];
12118 const char *peer_status
;
12119 const char *af_str
;
12124 conf
= group
->conf
;
12126 if (conf
->as_type
== AS_SPECIFIED
|| conf
->as_type
== AS_EXTERNAL
) {
12127 vty_out(vty
, "\nBGP peer-group %s, remote AS %" PRIu32
"\n",
12128 group
->name
, conf
->as
);
12129 } else if (conf
->as_type
== AS_INTERNAL
) {
12130 vty_out(vty
, "\nBGP peer-group %s, remote AS %" PRIu32
"\n",
12131 group
->name
, group
->bgp
->as
);
12133 vty_out(vty
, "\nBGP peer-group %s\n", group
->name
);
12136 if ((group
->bgp
->as
== conf
->as
) || (conf
->as_type
== AS_INTERNAL
))
12137 vty_out(vty
, " Peer-group type is internal\n");
12139 vty_out(vty
, " Peer-group type is external\n");
12141 /* Display AFs configured. */
12142 vty_out(vty
, " Configured address-families:");
12143 FOREACH_AFI_SAFI (afi
, safi
) {
12144 if (conf
->afc
[afi
][safi
]) {
12146 vty_out(vty
, " %s;", get_afi_safi_str(afi
, safi
, false));
12150 vty_out(vty
, " none\n");
12152 vty_out(vty
, "\n");
12154 /* Display listen ranges (for dynamic neighbors), if any */
12155 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++) {
12158 else if (afi
== AFI_IP6
)
12162 lr_count
= listcount(group
->listen_range
[afi
]);
12164 vty_out(vty
, " %d %s listen range(s)\n", lr_count
,
12168 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], node
,
12170 prefix2str(range
, buf
, sizeof(buf
));
12171 vty_out(vty
, " %s\n", buf
);
12176 /* Display group members and their status */
12177 if (listcount(group
->peer
)) {
12178 vty_out(vty
, " Peer-group members:\n");
12179 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
12180 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_SHUTDOWN
))
12181 peer_status
= "Idle (Admin)";
12182 else if (CHECK_FLAG(peer
->sflags
,
12183 PEER_STATUS_PREFIX_OVERFLOW
))
12184 peer_status
= "Idle (PfxCt)";
12186 peer_status
= lookup_msg(bgp_status_msg
,
12187 peer
->status
, NULL
);
12189 dynamic
= peer_dynamic_neighbor(peer
);
12190 vty_out(vty
, " %s %s %s \n", peer
->host
,
12191 dynamic
? "(dynamic)" : "", peer_status
);
12195 return CMD_SUCCESS
;
12198 static int bgp_show_peer_group_vty(struct vty
*vty
, const char *name
,
12199 const char *group_name
)
12202 struct listnode
*node
, *nnode
;
12203 struct peer_group
*group
;
12204 bool found
= false;
12206 bgp
= name
? bgp_lookup_by_name(name
) : bgp_get_default();
12209 vty_out(vty
, "%% BGP instance not found\n");
12210 return CMD_WARNING
;
12213 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
12215 if (strmatch(group
->name
, group_name
)) {
12216 bgp_show_one_peer_group(vty
, group
);
12221 bgp_show_one_peer_group(vty
, group
);
12225 if (group_name
&& !found
)
12226 vty_out(vty
, "%% No such peer-group\n");
12228 return CMD_SUCCESS
;
12231 DEFUN (show_ip_bgp_peer_groups
,
12232 show_ip_bgp_peer_groups_cmd
,
12233 "show [ip] bgp [<view|vrf> VIEWVRFNAME] peer-group [PGNAME]",
12237 BGP_INSTANCE_HELP_STR
12238 "Detailed information on BGP peer groups\n"
12239 "Peer group name\n")
12244 vrf
= argv_find(argv
, argc
, "VIEWVRFNAME", &idx
) ? argv
[idx
]->arg
12246 pg
= argv_find(argv
, argc
, "PGNAME", &idx
) ? argv
[idx
]->arg
: NULL
;
12248 return bgp_show_peer_group_vty(vty
, vrf
, pg
);
12252 /* Redistribute VTY commands. */
12254 DEFUN (bgp_redistribute_ipv4
,
12255 bgp_redistribute_ipv4_cmd
,
12256 "redistribute " FRR_IP_REDIST_STR_BGPD
,
12257 "Redistribute information from another routing protocol\n"
12258 FRR_IP_REDIST_HELP_STR_BGPD
)
12260 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12261 int idx_protocol
= 1;
12264 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
12266 vty_out(vty
, "%% Invalid route type\n");
12267 return CMD_WARNING_CONFIG_FAILED
;
12270 bgp_redist_add(bgp
, AFI_IP
, type
, 0);
12271 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0, false);
12275 bgp_redistribute_ipv4
, bgp_redistribute_ipv4_hidden_cmd
,
12276 "redistribute " FRR_IP_REDIST_STR_BGPD
,
12277 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
)
12279 DEFUN (bgp_redistribute_ipv4_rmap
,
12280 bgp_redistribute_ipv4_rmap_cmd
,
12281 "redistribute " FRR_IP_REDIST_STR_BGPD
" route-map WORD",
12282 "Redistribute information from another routing protocol\n"
12283 FRR_IP_REDIST_HELP_STR_BGPD
12284 "Route map reference\n"
12285 "Pointer to route-map entries\n")
12287 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12288 int idx_protocol
= 1;
12291 struct bgp_redist
*red
;
12293 struct route_map
*route_map
= route_map_lookup_warn_noexist(
12294 vty
, argv
[idx_word
]->arg
);
12296 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
12298 vty_out(vty
, "%% Invalid route type\n");
12299 return CMD_WARNING_CONFIG_FAILED
;
12302 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
12304 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12305 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0, changed
);
12309 bgp_redistribute_ipv4_rmap
, bgp_redistribute_ipv4_rmap_hidden_cmd
,
12310 "redistribute " FRR_IP_REDIST_STR_BGPD
" route-map WORD",
12311 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
12312 "Route map reference\n"
12313 "Pointer to route-map entries\n")
12315 DEFUN (bgp_redistribute_ipv4_metric
,
12316 bgp_redistribute_ipv4_metric_cmd
,
12317 "redistribute " FRR_IP_REDIST_STR_BGPD
" metric (0-4294967295)",
12318 "Redistribute information from another routing protocol\n"
12319 FRR_IP_REDIST_HELP_STR_BGPD
12320 "Metric for redistributed routes\n"
12321 "Default metric\n")
12323 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12324 int idx_protocol
= 1;
12325 int idx_number
= 3;
12328 struct bgp_redist
*red
;
12331 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
12333 vty_out(vty
, "%% Invalid route type\n");
12334 return CMD_WARNING_CONFIG_FAILED
;
12336 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12338 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
12339 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, type
, metric
);
12340 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0, changed
);
12344 bgp_redistribute_ipv4_metric
, bgp_redistribute_ipv4_metric_hidden_cmd
,
12345 "redistribute " FRR_IP_REDIST_STR_BGPD
" metric (0-4294967295)",
12346 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
12347 "Metric for redistributed routes\n"
12348 "Default metric\n")
12350 DEFUN (bgp_redistribute_ipv4_rmap_metric
,
12351 bgp_redistribute_ipv4_rmap_metric_cmd
,
12352 "redistribute " FRR_IP_REDIST_STR_BGPD
" route-map WORD metric (0-4294967295)",
12353 "Redistribute information from another routing protocol\n"
12354 FRR_IP_REDIST_HELP_STR_BGPD
12355 "Route map reference\n"
12356 "Pointer to route-map entries\n"
12357 "Metric for redistributed routes\n"
12358 "Default metric\n")
12360 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12361 int idx_protocol
= 1;
12363 int idx_number
= 5;
12366 struct bgp_redist
*red
;
12368 struct route_map
*route_map
=
12369 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12371 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
12373 vty_out(vty
, "%% Invalid route type\n");
12374 return CMD_WARNING_CONFIG_FAILED
;
12376 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12378 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
12380 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12381 changed
|= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, type
, metric
);
12382 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0, changed
);
12386 bgp_redistribute_ipv4_rmap_metric
,
12387 bgp_redistribute_ipv4_rmap_metric_hidden_cmd
,
12388 "redistribute " FRR_IP_REDIST_STR_BGPD
12389 " route-map WORD metric (0-4294967295)",
12390 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
12391 "Route map reference\n"
12392 "Pointer to route-map entries\n"
12393 "Metric for redistributed routes\n"
12394 "Default metric\n")
12396 DEFUN (bgp_redistribute_ipv4_metric_rmap
,
12397 bgp_redistribute_ipv4_metric_rmap_cmd
,
12398 "redistribute " FRR_IP_REDIST_STR_BGPD
" metric (0-4294967295) route-map WORD",
12399 "Redistribute information from another routing protocol\n"
12400 FRR_IP_REDIST_HELP_STR_BGPD
12401 "Metric for redistributed routes\n"
12403 "Route map reference\n"
12404 "Pointer to route-map entries\n")
12406 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12407 int idx_protocol
= 1;
12408 int idx_number
= 3;
12412 struct bgp_redist
*red
;
12414 struct route_map
*route_map
=
12415 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12417 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
12419 vty_out(vty
, "%% Invalid route type\n");
12420 return CMD_WARNING_CONFIG_FAILED
;
12422 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12424 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
12425 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, type
, metric
);
12427 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12428 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0, changed
);
12432 bgp_redistribute_ipv4_metric_rmap
,
12433 bgp_redistribute_ipv4_metric_rmap_hidden_cmd
,
12434 "redistribute " FRR_IP_REDIST_STR_BGPD
12435 " metric (0-4294967295) route-map WORD",
12436 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
12437 "Metric for redistributed routes\n"
12439 "Route map reference\n"
12440 "Pointer to route-map entries\n")
12442 DEFUN (bgp_redistribute_ipv4_ospf
,
12443 bgp_redistribute_ipv4_ospf_cmd
,
12444 "redistribute <ospf|table> (1-65535)",
12445 "Redistribute information from another routing protocol\n"
12446 "Open Shortest Path First (OSPFv2)\n"
12447 "Non-main Kernel Routing Table\n"
12448 "Instance ID/Table ID\n")
12450 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12451 int idx_ospf_table
= 1;
12452 int idx_number
= 2;
12453 unsigned short instance
;
12454 unsigned short protocol
;
12456 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12458 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
12459 protocol
= ZEBRA_ROUTE_OSPF
;
12461 protocol
= ZEBRA_ROUTE_TABLE
;
12463 bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
12464 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
, false);
12467 ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf
, bgp_redistribute_ipv4_ospf_hidden_cmd
,
12468 "redistribute <ospf|table> (1-65535)",
12469 "Redistribute information from another routing protocol\n"
12470 "Open Shortest Path First (OSPFv2)\n"
12471 "Non-main Kernel Routing Table\n"
12472 "Instance ID/Table ID\n")
12474 DEFUN (bgp_redistribute_ipv4_ospf_rmap
,
12475 bgp_redistribute_ipv4_ospf_rmap_cmd
,
12476 "redistribute <ospf|table> (1-65535) route-map WORD",
12477 "Redistribute information from another routing protocol\n"
12478 "Open Shortest Path First (OSPFv2)\n"
12479 "Non-main Kernel Routing Table\n"
12480 "Instance ID/Table ID\n"
12481 "Route map reference\n"
12482 "Pointer to route-map entries\n")
12484 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12485 int idx_ospf_table
= 1;
12486 int idx_number
= 2;
12488 struct bgp_redist
*red
;
12489 unsigned short instance
;
12492 struct route_map
*route_map
=
12493 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12495 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
12496 protocol
= ZEBRA_ROUTE_OSPF
;
12498 protocol
= ZEBRA_ROUTE_TABLE
;
12500 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12501 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
12503 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12504 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
, changed
);
12507 ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf_rmap
,
12508 bgp_redistribute_ipv4_ospf_rmap_hidden_cmd
,
12509 "redistribute <ospf|table> (1-65535) route-map WORD",
12510 "Redistribute information from another routing protocol\n"
12511 "Open Shortest Path First (OSPFv2)\n"
12512 "Non-main Kernel Routing Table\n"
12513 "Instance ID/Table ID\n"
12514 "Route map reference\n"
12515 "Pointer to route-map entries\n")
12517 DEFUN (bgp_redistribute_ipv4_ospf_metric
,
12518 bgp_redistribute_ipv4_ospf_metric_cmd
,
12519 "redistribute <ospf|table> (1-65535) metric (0-4294967295)",
12520 "Redistribute information from another routing protocol\n"
12521 "Open Shortest Path First (OSPFv2)\n"
12522 "Non-main Kernel Routing Table\n"
12523 "Instance ID/Table ID\n"
12524 "Metric for redistributed routes\n"
12525 "Default metric\n")
12527 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12528 int idx_ospf_table
= 1;
12529 int idx_number
= 2;
12530 int idx_number_2
= 4;
12532 struct bgp_redist
*red
;
12533 unsigned short instance
;
12537 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
12538 protocol
= ZEBRA_ROUTE_OSPF
;
12540 protocol
= ZEBRA_ROUTE_TABLE
;
12542 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12543 metric
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
12545 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
12546 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, protocol
,
12548 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
, changed
);
12551 ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf_metric
,
12552 bgp_redistribute_ipv4_ospf_metric_hidden_cmd
,
12553 "redistribute <ospf|table> (1-65535) metric (0-4294967295)",
12554 "Redistribute information from another routing protocol\n"
12555 "Open Shortest Path First (OSPFv2)\n"
12556 "Non-main Kernel Routing Table\n"
12557 "Instance ID/Table ID\n"
12558 "Metric for redistributed routes\n"
12559 "Default metric\n")
12561 DEFUN (bgp_redistribute_ipv4_ospf_rmap_metric
,
12562 bgp_redistribute_ipv4_ospf_rmap_metric_cmd
,
12563 "redistribute <ospf|table> (1-65535) route-map WORD metric (0-4294967295)",
12564 "Redistribute information from another routing protocol\n"
12565 "Open Shortest Path First (OSPFv2)\n"
12566 "Non-main Kernel Routing Table\n"
12567 "Instance ID/Table ID\n"
12568 "Route map reference\n"
12569 "Pointer to route-map entries\n"
12570 "Metric for redistributed routes\n"
12571 "Default metric\n")
12573 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12574 int idx_ospf_table
= 1;
12575 int idx_number
= 2;
12577 int idx_number_2
= 6;
12579 struct bgp_redist
*red
;
12580 unsigned short instance
;
12583 struct route_map
*route_map
=
12584 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12586 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
12587 protocol
= ZEBRA_ROUTE_OSPF
;
12589 protocol
= ZEBRA_ROUTE_TABLE
;
12591 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12592 metric
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
12594 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
12596 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12597 changed
|= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, protocol
,
12599 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
, changed
);
12603 bgp_redistribute_ipv4_ospf_rmap_metric
,
12604 bgp_redistribute_ipv4_ospf_rmap_metric_hidden_cmd
,
12605 "redistribute <ospf|table> (1-65535) route-map WORD metric (0-4294967295)",
12606 "Redistribute information from another routing protocol\n"
12607 "Open Shortest Path First (OSPFv2)\n"
12608 "Non-main Kernel Routing Table\n"
12609 "Instance ID/Table ID\n"
12610 "Route map reference\n"
12611 "Pointer to route-map entries\n"
12612 "Metric for redistributed routes\n"
12613 "Default metric\n")
12615 DEFUN (bgp_redistribute_ipv4_ospf_metric_rmap
,
12616 bgp_redistribute_ipv4_ospf_metric_rmap_cmd
,
12617 "redistribute <ospf|table> (1-65535) metric (0-4294967295) route-map WORD",
12618 "Redistribute information from another routing protocol\n"
12619 "Open Shortest Path First (OSPFv2)\n"
12620 "Non-main Kernel Routing Table\n"
12621 "Instance ID/Table ID\n"
12622 "Metric for redistributed routes\n"
12624 "Route map reference\n"
12625 "Pointer to route-map entries\n")
12627 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12628 int idx_ospf_table
= 1;
12629 int idx_number
= 2;
12630 int idx_number_2
= 4;
12633 struct bgp_redist
*red
;
12634 unsigned short instance
;
12637 struct route_map
*route_map
=
12638 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12640 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
12641 protocol
= ZEBRA_ROUTE_OSPF
;
12643 protocol
= ZEBRA_ROUTE_TABLE
;
12645 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12646 metric
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
12648 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
12649 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, protocol
,
12652 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12653 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
, changed
);
12657 bgp_redistribute_ipv4_ospf_metric_rmap
,
12658 bgp_redistribute_ipv4_ospf_metric_rmap_hidden_cmd
,
12659 "redistribute <ospf|table> (1-65535) metric (0-4294967295) route-map WORD",
12660 "Redistribute information from another routing protocol\n"
12661 "Open Shortest Path First (OSPFv2)\n"
12662 "Non-main Kernel Routing Table\n"
12663 "Instance ID/Table ID\n"
12664 "Metric for redistributed routes\n"
12666 "Route map reference\n"
12667 "Pointer to route-map entries\n")
12669 DEFUN (no_bgp_redistribute_ipv4_ospf
,
12670 no_bgp_redistribute_ipv4_ospf_cmd
,
12671 "no redistribute <ospf|table> (1-65535) [{metric (0-4294967295)|route-map WORD}]",
12673 "Redistribute information from another routing protocol\n"
12674 "Open Shortest Path First (OSPFv2)\n"
12675 "Non-main Kernel Routing Table\n"
12676 "Instance ID/Table ID\n"
12677 "Metric for redistributed routes\n"
12679 "Route map reference\n"
12680 "Pointer to route-map entries\n")
12682 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12683 int idx_ospf_table
= 2;
12684 int idx_number
= 3;
12685 unsigned short instance
;
12688 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
12689 protocol
= ZEBRA_ROUTE_OSPF
;
12691 protocol
= ZEBRA_ROUTE_TABLE
;
12693 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12694 return bgp_redistribute_unset(bgp
, AFI_IP
, protocol
, instance
);
12698 no_bgp_redistribute_ipv4_ospf
, no_bgp_redistribute_ipv4_ospf_hidden_cmd
,
12699 "no redistribute <ospf|table> (1-65535) [{metric (0-4294967295)|route-map WORD}]",
12701 "Redistribute information from another routing protocol\n"
12702 "Open Shortest Path First (OSPFv2)\n"
12703 "Non-main Kernel Routing Table\n"
12704 "Instance ID/Table ID\n"
12705 "Metric for redistributed routes\n"
12707 "Route map reference\n"
12708 "Pointer to route-map entries\n")
12710 DEFUN (no_bgp_redistribute_ipv4
,
12711 no_bgp_redistribute_ipv4_cmd
,
12712 "no redistribute " FRR_IP_REDIST_STR_BGPD
" [{metric (0-4294967295)|route-map WORD}]",
12714 "Redistribute information from another routing protocol\n"
12715 FRR_IP_REDIST_HELP_STR_BGPD
12716 "Metric for redistributed routes\n"
12718 "Route map reference\n"
12719 "Pointer to route-map entries\n")
12721 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12722 int idx_protocol
= 2;
12725 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
12727 vty_out(vty
, "%% Invalid route type\n");
12728 return CMD_WARNING_CONFIG_FAILED
;
12730 return bgp_redistribute_unset(bgp
, AFI_IP
, type
, 0);
12734 no_bgp_redistribute_ipv4
, no_bgp_redistribute_ipv4_hidden_cmd
,
12735 "no redistribute " FRR_IP_REDIST_STR_BGPD
12736 " [{metric (0-4294967295)|route-map WORD}]",
12738 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
12739 "Metric for redistributed routes\n"
12741 "Route map reference\n"
12742 "Pointer to route-map entries\n")
12744 DEFUN (bgp_redistribute_ipv6
,
12745 bgp_redistribute_ipv6_cmd
,
12746 "redistribute " FRR_IP6_REDIST_STR_BGPD
,
12747 "Redistribute information from another routing protocol\n"
12748 FRR_IP6_REDIST_HELP_STR_BGPD
)
12750 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12751 int idx_protocol
= 1;
12754 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
12756 vty_out(vty
, "%% Invalid route type\n");
12757 return CMD_WARNING_CONFIG_FAILED
;
12760 bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
12761 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0, false);
12764 DEFUN (bgp_redistribute_ipv6_rmap
,
12765 bgp_redistribute_ipv6_rmap_cmd
,
12766 "redistribute " FRR_IP6_REDIST_STR_BGPD
" route-map WORD",
12767 "Redistribute information from another routing protocol\n"
12768 FRR_IP6_REDIST_HELP_STR_BGPD
12769 "Route map reference\n"
12770 "Pointer to route-map entries\n")
12772 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12773 int idx_protocol
= 1;
12776 struct bgp_redist
*red
;
12778 struct route_map
*route_map
=
12779 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12781 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
12783 vty_out(vty
, "%% Invalid route type\n");
12784 return CMD_WARNING_CONFIG_FAILED
;
12787 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
12789 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12790 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0, changed
);
12793 DEFUN (bgp_redistribute_ipv6_metric
,
12794 bgp_redistribute_ipv6_metric_cmd
,
12795 "redistribute " FRR_IP6_REDIST_STR_BGPD
" metric (0-4294967295)",
12796 "Redistribute information from another routing protocol\n"
12797 FRR_IP6_REDIST_HELP_STR_BGPD
12798 "Metric for redistributed routes\n"
12799 "Default metric\n")
12801 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12802 int idx_protocol
= 1;
12803 int idx_number
= 3;
12806 struct bgp_redist
*red
;
12809 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
12811 vty_out(vty
, "%% Invalid route type\n");
12812 return CMD_WARNING_CONFIG_FAILED
;
12814 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12816 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
12817 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP6
, type
, metric
);
12818 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0, changed
);
12821 DEFUN (bgp_redistribute_ipv6_rmap_metric
,
12822 bgp_redistribute_ipv6_rmap_metric_cmd
,
12823 "redistribute " FRR_IP6_REDIST_STR_BGPD
" route-map WORD metric (0-4294967295)",
12824 "Redistribute information from another routing protocol\n"
12825 FRR_IP6_REDIST_HELP_STR_BGPD
12826 "Route map reference\n"
12827 "Pointer to route-map entries\n"
12828 "Metric for redistributed routes\n"
12829 "Default metric\n")
12831 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12832 int idx_protocol
= 1;
12834 int idx_number
= 5;
12837 struct bgp_redist
*red
;
12839 struct route_map
*route_map
=
12840 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12842 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
12844 vty_out(vty
, "%% Invalid route type\n");
12845 return CMD_WARNING_CONFIG_FAILED
;
12847 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12849 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
12851 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12852 changed
|= bgp_redistribute_metric_set(bgp
, red
, AFI_IP6
, type
,
12854 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0, changed
);
12857 DEFUN (bgp_redistribute_ipv6_metric_rmap
,
12858 bgp_redistribute_ipv6_metric_rmap_cmd
,
12859 "redistribute " FRR_IP6_REDIST_STR_BGPD
" metric (0-4294967295) route-map WORD",
12860 "Redistribute information from another routing protocol\n"
12861 FRR_IP6_REDIST_HELP_STR_BGPD
12862 "Metric for redistributed routes\n"
12864 "Route map reference\n"
12865 "Pointer to route-map entries\n")
12867 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12868 int idx_protocol
= 1;
12869 int idx_number
= 3;
12873 struct bgp_redist
*red
;
12875 struct route_map
*route_map
=
12876 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12878 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
12880 vty_out(vty
, "%% Invalid route type\n");
12881 return CMD_WARNING_CONFIG_FAILED
;
12883 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12885 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
12886 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP6
, SAFI_UNICAST
,
12889 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12890 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0, changed
);
12893 DEFUN (no_bgp_redistribute_ipv6
,
12894 no_bgp_redistribute_ipv6_cmd
,
12895 "no redistribute " FRR_IP6_REDIST_STR_BGPD
" [{metric (0-4294967295)|route-map WORD}]",
12897 "Redistribute information from another routing protocol\n"
12898 FRR_IP6_REDIST_HELP_STR_BGPD
12899 "Metric for redistributed routes\n"
12901 "Route map reference\n"
12902 "Pointer to route-map entries\n")
12904 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12905 int idx_protocol
= 2;
12908 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
12910 vty_out(vty
, "%% Invalid route type\n");
12911 return CMD_WARNING_CONFIG_FAILED
;
12914 return bgp_redistribute_unset(bgp
, AFI_IP6
, type
, 0);
12917 static void bgp_config_write_redistribute(struct vty
*vty
, struct bgp
*bgp
,
12918 afi_t afi
, safi_t safi
)
12922 /* Unicast redistribution only. */
12923 if (safi
!= SAFI_UNICAST
)
12926 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++) {
12927 /* Redistribute BGP does not make sense. */
12928 if (i
!= ZEBRA_ROUTE_BGP
) {
12929 struct list
*red_list
;
12930 struct listnode
*node
;
12931 struct bgp_redist
*red
;
12933 red_list
= bgp
->redist
[afi
][i
];
12937 for (ALL_LIST_ELEMENTS_RO(red_list
, node
, red
)) {
12938 /* "redistribute" configuration. */
12939 vty_out(vty
, " redistribute %s",
12940 zebra_route_string(i
));
12942 vty_out(vty
, " %d", red
->instance
);
12943 if (red
->redist_metric_flag
)
12944 vty_out(vty
, " metric %u",
12945 red
->redist_metric
);
12946 if (red
->rmap
.name
)
12947 vty_out(vty
, " route-map %s",
12949 vty_out(vty
, "\n");
12955 /* peer-group helpers for config-write */
12957 static bool peergroup_flag_check(struct peer
*peer
, uint32_t flag
)
12959 if (!peer_group_active(peer
)) {
12960 if (CHECK_FLAG(peer
->flags_invert
, flag
))
12961 return !CHECK_FLAG(peer
->flags
, flag
);
12963 return !!CHECK_FLAG(peer
->flags
, flag
);
12966 return !!CHECK_FLAG(peer
->flags_override
, flag
);
12969 static bool peergroup_af_flag_check(struct peer
*peer
, afi_t afi
, safi_t safi
,
12972 if (!peer_group_active(peer
)) {
12973 if (CHECK_FLAG(peer
->af_flags_invert
[afi
][safi
], flag
))
12974 return !peer_af_flag_check(peer
, afi
, safi
, flag
);
12976 return !!peer_af_flag_check(peer
, afi
, safi
, flag
);
12979 return !!CHECK_FLAG(peer
->af_flags_override
[afi
][safi
], flag
);
12982 static bool peergroup_filter_check(struct peer
*peer
, afi_t afi
, safi_t safi
,
12983 uint8_t type
, int direct
)
12985 struct bgp_filter
*filter
;
12987 if (peer_group_active(peer
))
12988 return !!CHECK_FLAG(peer
->filter_override
[afi
][safi
][direct
],
12991 filter
= &peer
->filter
[afi
][safi
];
12993 case PEER_FT_DISTRIBUTE_LIST
:
12994 return !!(filter
->dlist
[direct
].name
);
12995 case PEER_FT_FILTER_LIST
:
12996 return !!(filter
->aslist
[direct
].name
);
12997 case PEER_FT_PREFIX_LIST
:
12998 return !!(filter
->plist
[direct
].name
);
12999 case PEER_FT_ROUTE_MAP
:
13000 return !!(filter
->map
[direct
].name
);
13001 case PEER_FT_UNSUPPRESS_MAP
:
13002 return !!(filter
->usmap
.name
);
13008 /* Return true if the addpath type is set for peer and different from
13011 static int peergroup_af_addpath_check(struct peer
*peer
, afi_t afi
, safi_t safi
)
13013 enum bgp_addpath_strat type
, g_type
;
13015 type
= peer
->addpath_type
[afi
][safi
];
13017 if (type
!= BGP_ADDPATH_NONE
) {
13018 if (peer_group_active(peer
)) {
13019 g_type
= peer
->group
->conf
->addpath_type
[afi
][safi
];
13021 if (type
!= g_type
)
13033 /* This is part of the address-family block (unicast only) */
13034 static void bgp_vpn_policy_config_write_afi(struct vty
*vty
, struct bgp
*bgp
,
13039 if (bgp
->vpn_policy
[afi
].rmap_name
[BGP_VPN_POLICY_DIR_FROMVPN
]) {
13040 if (listcount(bgp
->vpn_policy
[afi
].import_vrf
))
13041 vty_out(vty
, "%*simport vrf route-map %s\n", indent
, "",
13042 bgp
->vpn_policy
[afi
]
13043 .rmap_name
[BGP_VPN_POLICY_DIR_FROMVPN
]);
13045 vty_out(vty
, "%*sroute-map vpn import %s\n", indent
, "",
13046 bgp
->vpn_policy
[afi
]
13047 .rmap_name
[BGP_VPN_POLICY_DIR_FROMVPN
]);
13049 if (CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
13050 BGP_CONFIG_VRF_TO_VRF_IMPORT
)
13051 || CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
13052 BGP_CONFIG_VRF_TO_VRF_EXPORT
))
13055 if (CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
13056 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
)) {
13058 vty_out(vty
, "%*slabel vpn export %s\n", indent
, "", "auto");
13061 if (bgp
->vpn_policy
[afi
].tovpn_label
!= MPLS_LABEL_NONE
) {
13062 vty_out(vty
, "%*slabel vpn export %u\n", indent
, "",
13063 bgp
->vpn_policy
[afi
].tovpn_label
);
13066 if (CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
13067 BGP_VPN_POLICY_TOVPN_RD_SET
)) {
13068 char buf
[RD_ADDRSTRLEN
];
13069 vty_out(vty
, "%*srd vpn export %s\n", indent
, "",
13070 prefix_rd2str(&bgp
->vpn_policy
[afi
].tovpn_rd
, buf
,
13073 if (CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
13074 BGP_VPN_POLICY_TOVPN_NEXTHOP_SET
)) {
13076 char buf
[PREFIX_STRLEN
];
13077 if (inet_ntop(bgp
->vpn_policy
[afi
].tovpn_nexthop
.family
,
13078 &bgp
->vpn_policy
[afi
].tovpn_nexthop
.u
.prefix
, buf
,
13081 vty_out(vty
, "%*snexthop vpn export %s\n",
13085 if (bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
]
13086 && bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
]
13088 bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
],
13089 bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
])) {
13091 char *b
= ecommunity_ecom2str(
13092 bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
],
13093 ECOMMUNITY_FORMAT_ROUTE_MAP
, ECOMMUNITY_ROUTE_TARGET
);
13094 vty_out(vty
, "%*srt vpn both %s\n", indent
, "", b
);
13095 XFREE(MTYPE_ECOMMUNITY_STR
, b
);
13097 if (bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
]) {
13098 char *b
= ecommunity_ecom2str(
13099 bgp
->vpn_policy
[afi
]
13100 .rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
],
13101 ECOMMUNITY_FORMAT_ROUTE_MAP
,
13102 ECOMMUNITY_ROUTE_TARGET
);
13103 vty_out(vty
, "%*srt vpn import %s\n", indent
, "", b
);
13104 XFREE(MTYPE_ECOMMUNITY_STR
, b
);
13106 if (bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
]) {
13107 char *b
= ecommunity_ecom2str(
13108 bgp
->vpn_policy
[afi
]
13109 .rtlist
[BGP_VPN_POLICY_DIR_TOVPN
],
13110 ECOMMUNITY_FORMAT_ROUTE_MAP
,
13111 ECOMMUNITY_ROUTE_TARGET
);
13112 vty_out(vty
, "%*srt vpn export %s\n", indent
, "", b
);
13113 XFREE(MTYPE_ECOMMUNITY_STR
, b
);
13117 if (bgp
->vpn_policy
[afi
].rmap_name
[BGP_VPN_POLICY_DIR_TOVPN
])
13118 vty_out(vty
, "%*sroute-map vpn export %s\n", indent
, "",
13119 bgp
->vpn_policy
[afi
]
13120 .rmap_name
[BGP_VPN_POLICY_DIR_TOVPN
]);
13122 if (bgp
->vpn_policy
[afi
].import_redirect_rtlist
) {
13123 char *b
= ecommunity_ecom2str(
13124 bgp
->vpn_policy
[afi
]
13125 .import_redirect_rtlist
,
13126 ECOMMUNITY_FORMAT_ROUTE_MAP
,
13127 ECOMMUNITY_ROUTE_TARGET
);
13129 vty_out(vty
, "%*srt redirect import %s\n", indent
, "", b
);
13130 XFREE(MTYPE_ECOMMUNITY_STR
, b
);
13134 static void bgp_config_write_filter(struct vty
*vty
, struct peer
*peer
,
13135 afi_t afi
, safi_t safi
)
13137 struct bgp_filter
*filter
;
13141 filter
= &peer
->filter
[afi
][safi
];
13143 /* distribute-list. */
13144 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_DISTRIBUTE_LIST
,
13146 vty_out(vty
, " neighbor %s distribute-list %s in\n", addr
,
13147 filter
->dlist
[FILTER_IN
].name
);
13149 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_DISTRIBUTE_LIST
,
13151 vty_out(vty
, " neighbor %s distribute-list %s out\n", addr
,
13152 filter
->dlist
[FILTER_OUT
].name
);
13155 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_PREFIX_LIST
,
13157 vty_out(vty
, " neighbor %s prefix-list %s in\n", addr
,
13158 filter
->plist
[FILTER_IN
].name
);
13160 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_PREFIX_LIST
,
13162 vty_out(vty
, " neighbor %s prefix-list %s out\n", addr
,
13163 filter
->plist
[FILTER_OUT
].name
);
13166 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_ROUTE_MAP
, RMAP_IN
))
13167 vty_out(vty
, " neighbor %s route-map %s in\n", addr
,
13168 filter
->map
[RMAP_IN
].name
);
13170 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_ROUTE_MAP
,
13172 vty_out(vty
, " neighbor %s route-map %s out\n", addr
,
13173 filter
->map
[RMAP_OUT
].name
);
13175 /* unsuppress-map */
13176 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_UNSUPPRESS_MAP
, 0))
13177 vty_out(vty
, " neighbor %s unsuppress-map %s\n", addr
,
13178 filter
->usmap
.name
);
13181 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_FILTER_LIST
,
13183 vty_out(vty
, " neighbor %s filter-list %s in\n", addr
,
13184 filter
->aslist
[FILTER_IN
].name
);
13186 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_FILTER_LIST
,
13188 vty_out(vty
, " neighbor %s filter-list %s out\n", addr
,
13189 filter
->aslist
[FILTER_OUT
].name
);
13192 /* BGP peer configuration display function. */
13193 static void bgp_config_write_peer_global(struct vty
*vty
, struct bgp
*bgp
,
13196 struct peer
*g_peer
= NULL
;
13197 char buf
[SU_ADDRSTRLEN
];
13199 int if_pg_printed
= false;
13200 int if_ras_printed
= false;
13202 /* Skip dynamic neighbors. */
13203 if (peer_dynamic_neighbor(peer
))
13207 addr
= peer
->conf_if
;
13211 /************************************
13212 ****** Global to the neighbor ******
13213 ************************************/
13214 if (peer
->conf_if
) {
13215 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
))
13216 vty_out(vty
, " neighbor %s interface v6only", addr
);
13218 vty_out(vty
, " neighbor %s interface", addr
);
13220 if (peer_group_active(peer
)) {
13221 vty_out(vty
, " peer-group %s", peer
->group
->name
);
13222 if_pg_printed
= true;
13223 } else if (peer
->as_type
== AS_SPECIFIED
) {
13224 vty_out(vty
, " remote-as %u", peer
->as
);
13225 if_ras_printed
= true;
13226 } else if (peer
->as_type
== AS_INTERNAL
) {
13227 vty_out(vty
, " remote-as internal");
13228 if_ras_printed
= true;
13229 } else if (peer
->as_type
== AS_EXTERNAL
) {
13230 vty_out(vty
, " remote-as external");
13231 if_ras_printed
= true;
13234 vty_out(vty
, "\n");
13237 /* remote-as and peer-group */
13238 /* peer is a member of a peer-group */
13239 if (peer_group_active(peer
)) {
13240 g_peer
= peer
->group
->conf
;
13242 if (g_peer
->as_type
== AS_UNSPECIFIED
&& !if_ras_printed
) {
13243 if (peer
->as_type
== AS_SPECIFIED
) {
13244 vty_out(vty
, " neighbor %s remote-as %u\n",
13246 } else if (peer
->as_type
== AS_INTERNAL
) {
13248 " neighbor %s remote-as internal\n",
13250 } else if (peer
->as_type
== AS_EXTERNAL
) {
13252 " neighbor %s remote-as external\n",
13257 /* For swpX peers we displayed the peer-group
13258 * via 'neighbor swpX interface peer-group PGNAME' */
13259 if (!if_pg_printed
)
13260 vty_out(vty
, " neighbor %s peer-group %s\n", addr
,
13261 peer
->group
->name
);
13264 /* peer is NOT a member of a peer-group */
13266 /* peer is a peer-group, declare the peer-group */
13267 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
13268 vty_out(vty
, " neighbor %s peer-group\n", addr
);
13271 if (!if_ras_printed
) {
13272 if (peer
->as_type
== AS_SPECIFIED
) {
13273 vty_out(vty
, " neighbor %s remote-as %u\n",
13275 } else if (peer
->as_type
== AS_INTERNAL
) {
13277 " neighbor %s remote-as internal\n",
13279 } else if (peer
->as_type
== AS_EXTERNAL
) {
13281 " neighbor %s remote-as external\n",
13288 if (peergroup_flag_check(peer
, PEER_FLAG_LOCAL_AS
)) {
13289 vty_out(vty
, " neighbor %s local-as %u", addr
,
13290 peer
->change_local_as
);
13291 if (peergroup_flag_check(peer
, PEER_FLAG_LOCAL_AS_NO_PREPEND
))
13292 vty_out(vty
, " no-prepend");
13293 if (peergroup_flag_check(peer
, PEER_FLAG_LOCAL_AS_REPLACE_AS
))
13294 vty_out(vty
, " replace-as");
13295 vty_out(vty
, "\n");
13300 vty_out(vty
, " neighbor %s description %s\n", addr
, peer
->desc
);
13304 if (peergroup_flag_check(peer
, PEER_FLAG_SHUTDOWN
)) {
13305 if (peer
->tx_shutdown_message
)
13306 vty_out(vty
, " neighbor %s shutdown message %s\n", addr
,
13307 peer
->tx_shutdown_message
);
13309 vty_out(vty
, " neighbor %s shutdown\n", addr
);
13313 if (peer
->bfd_info
) {
13314 if (!peer_group_active(peer
) || !g_peer
->bfd_info
) {
13315 bgp_bfd_peer_config_write(vty
, peer
, addr
);
13320 if (peergroup_flag_check(peer
, PEER_FLAG_PASSWORD
))
13321 vty_out(vty
, " neighbor %s password %s\n", addr
,
13324 /* neighbor solo */
13325 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_LONESOUL
)) {
13326 if (!peer_group_active(peer
)) {
13327 vty_out(vty
, " neighbor %s solo\n", addr
);
13332 if (peer
->port
!= BGP_PORT_DEFAULT
) {
13333 vty_out(vty
, " neighbor %s port %d\n", addr
, peer
->port
);
13336 /* Local interface name */
13337 if (peer
->ifname
) {
13338 vty_out(vty
, " neighbor %s interface %s\n", addr
, peer
->ifname
);
13342 if (peergroup_flag_check(peer
, PEER_FLAG_PASSIVE
))
13343 vty_out(vty
, " neighbor %s passive\n", addr
);
13345 /* ebgp-multihop */
13346 if (peer
->sort
!= BGP_PEER_IBGP
&& peer
->ttl
!= BGP_DEFAULT_TTL
13347 && !(peer
->gtsm_hops
!= 0 && peer
->ttl
== MAXTTL
)) {
13348 if (!peer_group_active(peer
) || g_peer
->ttl
!= peer
->ttl
) {
13349 vty_out(vty
, " neighbor %s ebgp-multihop %d\n", addr
,
13354 /* ttl-security hops */
13355 if (peer
->gtsm_hops
!= 0) {
13356 if (!peer_group_active(peer
)
13357 || g_peer
->gtsm_hops
!= peer
->gtsm_hops
) {
13358 vty_out(vty
, " neighbor %s ttl-security hops %d\n",
13359 addr
, peer
->gtsm_hops
);
13363 /* disable-connected-check */
13364 if (peergroup_flag_check(peer
, PEER_FLAG_DISABLE_CONNECTED_CHECK
))
13365 vty_out(vty
, " neighbor %s disable-connected-check\n", addr
);
13367 /* enforce-first-as */
13368 if (peergroup_flag_check(peer
, PEER_FLAG_ENFORCE_FIRST_AS
))
13369 vty_out(vty
, " neighbor %s enforce-first-as\n", addr
);
13371 /* update-source */
13372 if (peergroup_flag_check(peer
, PEER_FLAG_UPDATE_SOURCE
)) {
13373 if (peer
->update_source
)
13374 vty_out(vty
, " neighbor %s update-source %s\n", addr
,
13375 sockunion2str(peer
->update_source
, buf
,
13377 else if (peer
->update_if
)
13378 vty_out(vty
, " neighbor %s update-source %s\n", addr
,
13382 /* advertisement-interval */
13383 if (peergroup_flag_check(peer
, PEER_FLAG_ROUTEADV
))
13384 vty_out(vty
, " neighbor %s advertisement-interval %u\n", addr
,
13388 if (peergroup_flag_check(peer
, PEER_FLAG_TIMER
))
13389 vty_out(vty
, " neighbor %s timers %u %u\n", addr
,
13390 peer
->keepalive
, peer
->holdtime
);
13392 /* timers connect */
13393 if (peergroup_flag_check(peer
, PEER_FLAG_TIMER_CONNECT
))
13394 vty_out(vty
, " neighbor %s timers connect %u\n", addr
,
13396 /* need special-case handling for changed default values due to
13397 * config profile / version (because there is no "timers bgp connect"
13398 * command, we need to save this per-peer :/)
13400 else if (!peer_group_active(peer
) && !peer
->connect
&&
13401 peer
->bgp
->default_connect_retry
!= SAVE_BGP_CONNECT_RETRY
)
13402 vty_out(vty
, " neighbor %s timers connect %u\n", addr
,
13403 peer
->bgp
->default_connect_retry
);
13405 /* capability dynamic */
13406 if (peergroup_flag_check(peer
, PEER_FLAG_DYNAMIC_CAPABILITY
))
13407 vty_out(vty
, " neighbor %s capability dynamic\n", addr
);
13409 /* capability extended-nexthop */
13410 if (peergroup_flag_check(peer
, PEER_FLAG_CAPABILITY_ENHE
)) {
13411 if (!peer
->conf_if
) {
13412 if (CHECK_FLAG(peer
->flags_invert
,
13413 PEER_FLAG_CAPABILITY_ENHE
))
13415 " no neighbor %s capability extended-nexthop\n",
13419 " neighbor %s capability extended-nexthop\n",
13424 /* dont-capability-negotiation */
13425 if (peergroup_flag_check(peer
, PEER_FLAG_DONT_CAPABILITY
))
13426 vty_out(vty
, " neighbor %s dont-capability-negotiate\n", addr
);
13428 /* override-capability */
13429 if (peergroup_flag_check(peer
, PEER_FLAG_OVERRIDE_CAPABILITY
))
13430 vty_out(vty
, " neighbor %s override-capability\n", addr
);
13432 /* strict-capability-match */
13433 if (peergroup_flag_check(peer
, PEER_FLAG_STRICT_CAP_MATCH
))
13434 vty_out(vty
, " neighbor %s strict-capability-match\n", addr
);
13436 /* Sender side AS path loop detection. */
13437 if (peer
->as_path_loop_detection
)
13438 vty_out(vty
, " neighbor %s sender-as-path-loop-detection\n",
13442 /* BGP peer configuration display function. */
13443 static void bgp_config_write_peer_af(struct vty
*vty
, struct bgp
*bgp
,
13444 struct peer
*peer
, afi_t afi
, safi_t safi
)
13446 struct peer
*g_peer
= NULL
;
13448 bool flag_scomm
, flag_secomm
, flag_slcomm
;
13450 /* Skip dynamic neighbors. */
13451 if (peer_dynamic_neighbor(peer
))
13455 addr
= peer
->conf_if
;
13459 /************************************
13460 ****** Per AF to the neighbor ******
13461 ************************************/
13462 if (peer_group_active(peer
)) {
13463 g_peer
= peer
->group
->conf
;
13465 /* If the peer-group is active but peer is not, print a 'no
13467 if (g_peer
->afc
[afi
][safi
] && !peer
->afc
[afi
][safi
]) {
13468 vty_out(vty
, " no neighbor %s activate\n", addr
);
13471 /* If the peer-group is not active but peer is, print an
13473 else if (!g_peer
->afc
[afi
][safi
] && peer
->afc
[afi
][safi
]) {
13474 vty_out(vty
, " neighbor %s activate\n", addr
);
13477 if (peer
->afc
[afi
][safi
]) {
13478 if ((afi
== AFI_IP
) && (safi
== SAFI_UNICAST
)) {
13479 if (bgp_flag_check(bgp
,
13480 BGP_FLAG_NO_DEFAULT_IPV4
)) {
13481 vty_out(vty
, " neighbor %s activate\n",
13485 vty_out(vty
, " neighbor %s activate\n", addr
);
13487 if ((afi
== AFI_IP
) && (safi
== SAFI_UNICAST
)) {
13488 if (!bgp_flag_check(bgp
,
13489 BGP_FLAG_NO_DEFAULT_IPV4
)) {
13491 " no neighbor %s activate\n",
13498 /* addpath TX knobs */
13499 if (peergroup_af_addpath_check(peer
, afi
, safi
)) {
13500 switch (peer
->addpath_type
[afi
][safi
]) {
13501 case BGP_ADDPATH_ALL
:
13502 vty_out(vty
, " neighbor %s addpath-tx-all-paths\n",
13505 case BGP_ADDPATH_BEST_PER_AS
:
13507 " neighbor %s addpath-tx-bestpath-per-AS\n",
13510 case BGP_ADDPATH_MAX
:
13511 case BGP_ADDPATH_NONE
:
13516 /* ORF capability. */
13517 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_ORF_PREFIX_SM
)
13518 || peergroup_af_flag_check(peer
, afi
, safi
,
13519 PEER_FLAG_ORF_PREFIX_RM
)) {
13520 vty_out(vty
, " neighbor %s capability orf prefix-list", addr
);
13522 if (peergroup_af_flag_check(peer
, afi
, safi
,
13523 PEER_FLAG_ORF_PREFIX_SM
)
13524 && peergroup_af_flag_check(peer
, afi
, safi
,
13525 PEER_FLAG_ORF_PREFIX_RM
))
13526 vty_out(vty
, " both");
13527 else if (peergroup_af_flag_check(peer
, afi
, safi
,
13528 PEER_FLAG_ORF_PREFIX_SM
))
13529 vty_out(vty
, " send");
13531 vty_out(vty
, " receive");
13532 vty_out(vty
, "\n");
13535 /* BGP flag dampening. */
13536 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
13537 BGP_CONFIG_DAMPENING
))
13538 bgp_config_write_damp(vty
, afi
, safi
);
13540 /* Route reflector client. */
13541 if (peergroup_af_flag_check(peer
, afi
, safi
,
13542 PEER_FLAG_REFLECTOR_CLIENT
)) {
13543 vty_out(vty
, " neighbor %s route-reflector-client\n", addr
);
13546 /* next-hop-self force */
13547 if (peergroup_af_flag_check(peer
, afi
, safi
,
13548 PEER_FLAG_FORCE_NEXTHOP_SELF
)) {
13549 vty_out(vty
, " neighbor %s next-hop-self force\n", addr
);
13552 /* next-hop-self */
13553 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_NEXTHOP_SELF
)) {
13554 vty_out(vty
, " neighbor %s next-hop-self\n", addr
);
13557 /* remove-private-AS */
13558 if (peergroup_af_flag_check(peer
, afi
, safi
,
13559 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
)) {
13560 vty_out(vty
, " neighbor %s remove-private-AS all replace-AS\n",
13564 else if (peergroup_af_flag_check(peer
, afi
, safi
,
13565 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
)) {
13566 vty_out(vty
, " neighbor %s remove-private-AS replace-AS\n",
13570 else if (peergroup_af_flag_check(peer
, afi
, safi
,
13571 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
)) {
13572 vty_out(vty
, " neighbor %s remove-private-AS all\n", addr
);
13575 else if (peergroup_af_flag_check(peer
, afi
, safi
,
13576 PEER_FLAG_REMOVE_PRIVATE_AS
)) {
13577 vty_out(vty
, " neighbor %s remove-private-AS\n", addr
);
13581 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_AS_OVERRIDE
)) {
13582 vty_out(vty
, " neighbor %s as-override\n", addr
);
13585 /* send-community print. */
13586 flag_scomm
= peergroup_af_flag_check(peer
, afi
, safi
,
13587 PEER_FLAG_SEND_COMMUNITY
);
13588 flag_secomm
= peergroup_af_flag_check(peer
, afi
, safi
,
13589 PEER_FLAG_SEND_EXT_COMMUNITY
);
13590 flag_slcomm
= peergroup_af_flag_check(peer
, afi
, safi
,
13591 PEER_FLAG_SEND_LARGE_COMMUNITY
);
13593 if (flag_scomm
&& flag_secomm
&& flag_slcomm
) {
13594 vty_out(vty
, " no neighbor %s send-community all\n", addr
);
13597 vty_out(vty
, " no neighbor %s send-community\n", addr
);
13600 " no neighbor %s send-community extended\n",
13604 vty_out(vty
, " no neighbor %s send-community large\n",
13608 /* Default information */
13609 if (peergroup_af_flag_check(peer
, afi
, safi
,
13610 PEER_FLAG_DEFAULT_ORIGINATE
)) {
13611 vty_out(vty
, " neighbor %s default-originate", addr
);
13613 if (peer
->default_rmap
[afi
][safi
].name
)
13614 vty_out(vty
, " route-map %s",
13615 peer
->default_rmap
[afi
][safi
].name
);
13617 vty_out(vty
, "\n");
13620 /* Soft reconfiguration inbound. */
13621 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_SOFT_RECONFIG
)) {
13622 vty_out(vty
, " neighbor %s soft-reconfiguration inbound\n",
13626 /* maximum-prefix. */
13627 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX
)) {
13628 vty_out(vty
, " neighbor %s maximum-prefix %" PRIu32
, addr
,
13629 peer
->pmax
[afi
][safi
]);
13631 if (peer
->pmax_threshold
[afi
][safi
]
13632 != MAXIMUM_PREFIX_THRESHOLD_DEFAULT
)
13633 vty_out(vty
, " %u", peer
->pmax_threshold
[afi
][safi
]);
13634 if (peer_af_flag_check(peer
, afi
, safi
,
13635 PEER_FLAG_MAX_PREFIX_WARNING
))
13636 vty_out(vty
, " warning-only");
13637 if (peer
->pmax_restart
[afi
][safi
])
13638 vty_out(vty
, " restart %u",
13639 peer
->pmax_restart
[afi
][safi
]);
13641 vty_out(vty
, "\n");
13644 /* maximum-prefix-out */
13645 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX_OUT
))
13646 vty_out(vty
, " neighbor %s maximum-prefix-out %" PRIu32
"\n",
13647 addr
, peer
->pmax_out
[afi
][safi
]);
13649 /* Route server client. */
13650 if (peergroup_af_flag_check(peer
, afi
, safi
,
13651 PEER_FLAG_RSERVER_CLIENT
)) {
13652 vty_out(vty
, " neighbor %s route-server-client\n", addr
);
13655 /* Nexthop-local unchanged. */
13656 if (peergroup_af_flag_check(peer
, afi
, safi
,
13657 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
)) {
13658 vty_out(vty
, " neighbor %s nexthop-local unchanged\n", addr
);
13661 /* allowas-in <1-10> */
13662 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
)) {
13663 if (peer_af_flag_check(peer
, afi
, safi
,
13664 PEER_FLAG_ALLOWAS_IN_ORIGIN
)) {
13665 vty_out(vty
, " neighbor %s allowas-in origin\n", addr
);
13666 } else if (peer
->allowas_in
[afi
][safi
] == 3) {
13667 vty_out(vty
, " neighbor %s allowas-in\n", addr
);
13669 vty_out(vty
, " neighbor %s allowas-in %d\n", addr
,
13670 peer
->allowas_in
[afi
][safi
]);
13675 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_WEIGHT
))
13676 vty_out(vty
, " neighbor %s weight %lu\n", addr
,
13677 peer
->weight
[afi
][safi
]);
13680 bgp_config_write_filter(vty
, peer
, afi
, safi
);
13682 /* atribute-unchanged. */
13683 if (peer_af_flag_check(peer
, afi
, safi
, PEER_FLAG_AS_PATH_UNCHANGED
)
13684 || (safi
!= SAFI_EVPN
13685 && peer_af_flag_check(peer
, afi
, safi
,
13686 PEER_FLAG_NEXTHOP_UNCHANGED
))
13687 || peer_af_flag_check(peer
, afi
, safi
, PEER_FLAG_MED_UNCHANGED
)) {
13689 if (!peer_group_active(peer
)
13690 || peergroup_af_flag_check(peer
, afi
, safi
,
13691 PEER_FLAG_AS_PATH_UNCHANGED
)
13692 || peergroup_af_flag_check(peer
, afi
, safi
,
13693 PEER_FLAG_NEXTHOP_UNCHANGED
)
13694 || peergroup_af_flag_check(peer
, afi
, safi
,
13695 PEER_FLAG_MED_UNCHANGED
)) {
13698 " neighbor %s attribute-unchanged%s%s%s\n",
13700 peer_af_flag_check(peer
, afi
, safi
,
13701 PEER_FLAG_AS_PATH_UNCHANGED
)
13704 peer_af_flag_check(peer
, afi
, safi
,
13705 PEER_FLAG_NEXTHOP_UNCHANGED
)
13708 peer_af_flag_check(peer
, afi
, safi
,
13709 PEER_FLAG_MED_UNCHANGED
)
13716 /* Address family based peer configuration display. */
13717 static void bgp_config_write_family(struct vty
*vty
, struct bgp
*bgp
, afi_t afi
,
13721 struct peer_group
*group
;
13722 struct listnode
*node
, *nnode
;
13725 vty_frame(vty
, " !\n address-family ");
13726 if (afi
== AFI_IP
) {
13727 if (safi
== SAFI_UNICAST
)
13728 vty_frame(vty
, "ipv4 unicast");
13729 else if (safi
== SAFI_LABELED_UNICAST
)
13730 vty_frame(vty
, "ipv4 labeled-unicast");
13731 else if (safi
== SAFI_MULTICAST
)
13732 vty_frame(vty
, "ipv4 multicast");
13733 else if (safi
== SAFI_MPLS_VPN
)
13734 vty_frame(vty
, "ipv4 vpn");
13735 else if (safi
== SAFI_ENCAP
)
13736 vty_frame(vty
, "ipv4 encap");
13737 else if (safi
== SAFI_FLOWSPEC
)
13738 vty_frame(vty
, "ipv4 flowspec");
13739 } else if (afi
== AFI_IP6
) {
13740 if (safi
== SAFI_UNICAST
)
13741 vty_frame(vty
, "ipv6 unicast");
13742 else if (safi
== SAFI_LABELED_UNICAST
)
13743 vty_frame(vty
, "ipv6 labeled-unicast");
13744 else if (safi
== SAFI_MULTICAST
)
13745 vty_frame(vty
, "ipv6 multicast");
13746 else if (safi
== SAFI_MPLS_VPN
)
13747 vty_frame(vty
, "ipv6 vpn");
13748 else if (safi
== SAFI_ENCAP
)
13749 vty_frame(vty
, "ipv6 encap");
13750 else if (safi
== SAFI_FLOWSPEC
)
13751 vty_frame(vty
, "ipv6 flowspec");
13752 } else if (afi
== AFI_L2VPN
) {
13753 if (safi
== SAFI_EVPN
)
13754 vty_frame(vty
, "l2vpn evpn");
13756 vty_frame(vty
, "\n");
13758 bgp_config_write_distance(vty
, bgp
, afi
, safi
);
13760 bgp_config_write_network(vty
, bgp
, afi
, safi
);
13762 bgp_config_write_redistribute(vty
, bgp
, afi
, safi
);
13764 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
))
13765 bgp_config_write_peer_af(vty
, bgp
, group
->conf
, afi
, safi
);
13767 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
13768 /* Skip dynamic neighbors. */
13769 if (peer_dynamic_neighbor(peer
))
13772 /* Do not display doppelganger peers */
13773 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
13774 bgp_config_write_peer_af(vty
, bgp
, peer
, afi
, safi
);
13777 bgp_config_write_maxpaths(vty
, bgp
, afi
, safi
);
13778 bgp_config_write_table_map(vty
, bgp
, afi
, safi
);
13780 if (safi
== SAFI_EVPN
)
13781 bgp_config_write_evpn_info(vty
, bgp
, afi
, safi
);
13783 if (safi
== SAFI_FLOWSPEC
)
13784 bgp_fs_config_write_pbr(vty
, bgp
, afi
, safi
);
13786 if (safi
== SAFI_UNICAST
) {
13787 bgp_vpn_policy_config_write_afi(vty
, bgp
, afi
);
13788 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
13789 BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT
)) {
13791 vty_out(vty
, " export vpn\n");
13793 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
13794 BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT
)) {
13796 vty_out(vty
, " import vpn\n");
13798 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
13799 BGP_CONFIG_VRF_TO_VRF_IMPORT
)) {
13802 for (ALL_LIST_ELEMENTS_RO(
13803 bgp
->vpn_policy
[afi
].import_vrf
, node
,
13805 vty_out(vty
, " import vrf %s\n", name
);
13809 vty_endframe(vty
, " exit-address-family\n");
13812 int bgp_config_write(struct vty
*vty
)
13815 struct peer_group
*group
;
13817 struct listnode
*node
, *nnode
;
13818 struct listnode
*mnode
, *mnnode
;
13820 if (bm
->rmap_update_timer
!= RMAP_DEFAULT_UPDATE_TIMER
)
13821 vty_out(vty
, "bgp route-map delay-timer %u\n",
13822 bm
->rmap_update_timer
);
13824 /* BGP configuration. */
13825 for (ALL_LIST_ELEMENTS(bm
->bgp
, mnode
, mnnode
, bgp
)) {
13827 /* skip all auto created vrf as they dont have user config */
13828 if (CHECK_FLAG(bgp
->vrf_flags
, BGP_VRF_AUTO
))
13831 /* Router bgp ASN */
13832 vty_out(vty
, "router bgp %u", bgp
->as
);
13835 vty_out(vty
, " %s %s",
13836 (bgp
->inst_type
== BGP_INSTANCE_TYPE_VIEW
)
13837 ? "view" : "vrf", bgp
->name
);
13838 vty_out(vty
, "\n");
13840 /* BGP fast-external-failover. */
13841 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_NO_FAST_EXT_FAILOVER
))
13842 vty_out(vty
, " no bgp fast-external-failover\n");
13844 /* BGP router ID. */
13845 if (bgp
->router_id_static
.s_addr
!= 0)
13846 vty_out(vty
, " bgp router-id %s\n",
13847 inet_ntoa(bgp
->router_id_static
));
13849 /* BGP log-neighbor-changes. */
13850 if (!!bgp_flag_check(bgp
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
)
13851 != SAVE_BGP_LOG_NEIGHBOR_CHANGES
)
13852 vty_out(vty
, " %sbgp log-neighbor-changes\n",
13853 bgp_flag_check(bgp
,
13854 BGP_FLAG_LOG_NEIGHBOR_CHANGES
)
13858 /* BGP configuration. */
13859 if (bgp_flag_check(bgp
, BGP_FLAG_ALWAYS_COMPARE_MED
))
13860 vty_out(vty
, " bgp always-compare-med\n");
13862 /* RFC8212 default eBGP policy. */
13863 if (bgp
->ebgp_requires_policy
13864 == DEFAULT_EBGP_POLICY_ENABLED
)
13865 vty_out(vty
, " bgp ebgp-requires-policy\n");
13867 /* draft-ietf-idr-deprecate-as-set-confed-set */
13868 if (bgp
->reject_as_sets
== BGP_REJECT_AS_SETS_ENABLED
)
13869 vty_out(vty
, " bgp reject-as-sets\n");
13871 /* BGP default ipv4-unicast. */
13872 if (bgp_flag_check(bgp
, BGP_FLAG_NO_DEFAULT_IPV4
))
13873 vty_out(vty
, " no bgp default ipv4-unicast\n");
13875 /* BGP default local-preference. */
13876 if (bgp
->default_local_pref
!= BGP_DEFAULT_LOCAL_PREF
)
13877 vty_out(vty
, " bgp default local-preference %u\n",
13878 bgp
->default_local_pref
);
13880 /* BGP default show-hostname */
13881 if (!!bgp_flag_check(bgp
, BGP_FLAG_SHOW_HOSTNAME
)
13882 != SAVE_BGP_SHOW_HOSTNAME
)
13883 vty_out(vty
, " %sbgp default show-hostname\n",
13884 bgp_flag_check(bgp
, BGP_FLAG_SHOW_HOSTNAME
)
13888 /* BGP default subgroup-pkt-queue-max. */
13889 if (bgp
->default_subgroup_pkt_queue_max
13890 != BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX
)
13891 vty_out(vty
, " bgp default subgroup-pkt-queue-max %u\n",
13892 bgp
->default_subgroup_pkt_queue_max
);
13894 /* BGP client-to-client reflection. */
13895 if (bgp_flag_check(bgp
, BGP_FLAG_NO_CLIENT_TO_CLIENT
))
13896 vty_out(vty
, " no bgp client-to-client reflection\n");
13898 /* BGP cluster ID. */
13899 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CLUSTER_ID
))
13900 vty_out(vty
, " bgp cluster-id %s\n",
13901 inet_ntoa(bgp
->cluster_id
));
13903 /* Disable ebgp connected nexthop check */
13904 if (bgp_flag_check(bgp
, BGP_FLAG_DISABLE_NH_CONNECTED_CHK
))
13906 " bgp disable-ebgp-connected-route-check\n");
13908 /* Confederation identifier*/
13909 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
))
13910 vty_out(vty
, " bgp confederation identifier %u\n",
13913 /* Confederation peer */
13914 if (bgp
->confed_peers_cnt
> 0) {
13917 vty_out(vty
, " bgp confederation peers");
13919 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
13920 vty_out(vty
, " %u", bgp
->confed_peers
[i
]);
13922 vty_out(vty
, "\n");
13925 /* BGP deterministic-med. */
13926 if (!!bgp_flag_check(bgp
, BGP_FLAG_DETERMINISTIC_MED
)
13927 != SAVE_BGP_DETERMINISTIC_MED
)
13928 vty_out(vty
, " %sbgp deterministic-med\n",
13929 bgp_flag_check(bgp
, BGP_FLAG_DETERMINISTIC_MED
)
13933 /* BGP update-delay. */
13934 bgp_config_write_update_delay(vty
, bgp
);
13936 if (bgp
->v_maxmed_onstartup
13937 != BGP_MAXMED_ONSTARTUP_UNCONFIGURED
) {
13938 vty_out(vty
, " bgp max-med on-startup %u",
13939 bgp
->v_maxmed_onstartup
);
13940 if (bgp
->maxmed_onstartup_value
13941 != BGP_MAXMED_VALUE_DEFAULT
)
13942 vty_out(vty
, " %u",
13943 bgp
->maxmed_onstartup_value
);
13944 vty_out(vty
, "\n");
13946 if (bgp
->v_maxmed_admin
!= BGP_MAXMED_ADMIN_UNCONFIGURED
) {
13947 vty_out(vty
, " bgp max-med administrative");
13948 if (bgp
->maxmed_admin_value
!= BGP_MAXMED_VALUE_DEFAULT
)
13949 vty_out(vty
, " %u", bgp
->maxmed_admin_value
);
13950 vty_out(vty
, "\n");
13954 bgp_config_write_wpkt_quanta(vty
, bgp
);
13956 bgp_config_write_rpkt_quanta(vty
, bgp
);
13958 /* coalesce time */
13959 bgp_config_write_coalesce_time(vty
, bgp
);
13961 /* BGP graceful-restart. */
13962 if (bgp
->stalepath_time
!= BGP_DEFAULT_STALEPATH_TIME
)
13964 " bgp graceful-restart stalepath-time %u\n",
13965 bgp
->stalepath_time
);
13966 if (bgp
->restart_time
!= BGP_DEFAULT_RESTART_TIME
)
13967 vty_out(vty
, " bgp graceful-restart restart-time %u\n",
13968 bgp
->restart_time
);
13969 if (bgp_flag_check(bgp
, BGP_FLAG_GRACEFUL_RESTART
))
13970 vty_out(vty
, " bgp graceful-restart\n");
13972 /* BGP graceful-shutdown */
13973 if (bgp_flag_check(bgp
, BGP_FLAG_GRACEFUL_SHUTDOWN
))
13974 vty_out(vty
, " bgp graceful-shutdown\n");
13976 /* BGP graceful-restart Preserve State F bit. */
13977 if (bgp_flag_check(bgp
, BGP_FLAG_GR_PRESERVE_FWD
))
13979 " bgp graceful-restart preserve-fw-state\n");
13981 /* BGP bestpath method. */
13982 if (bgp_flag_check(bgp
, BGP_FLAG_ASPATH_IGNORE
))
13983 vty_out(vty
, " bgp bestpath as-path ignore\n");
13984 if (bgp_flag_check(bgp
, BGP_FLAG_ASPATH_CONFED
))
13985 vty_out(vty
, " bgp bestpath as-path confed\n");
13987 if (bgp_flag_check(bgp
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
)) {
13988 if (bgp_flag_check(bgp
,
13989 BGP_FLAG_MULTIPATH_RELAX_AS_SET
)) {
13991 " bgp bestpath as-path multipath-relax as-set\n");
13994 " bgp bestpath as-path multipath-relax\n");
13998 if (bgp_flag_check(bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
)) {
14000 " bgp route-reflector allow-outbound-policy\n");
14002 if (bgp_flag_check(bgp
, BGP_FLAG_COMPARE_ROUTER_ID
))
14003 vty_out(vty
, " bgp bestpath compare-routerid\n");
14004 if (bgp_flag_check(bgp
, BGP_FLAG_MED_CONFED
)
14005 || bgp_flag_check(bgp
, BGP_FLAG_MED_MISSING_AS_WORST
)) {
14006 vty_out(vty
, " bgp bestpath med");
14007 if (bgp_flag_check(bgp
, BGP_FLAG_MED_CONFED
))
14008 vty_out(vty
, " confed");
14009 if (bgp_flag_check(bgp
, BGP_FLAG_MED_MISSING_AS_WORST
))
14010 vty_out(vty
, " missing-as-worst");
14011 vty_out(vty
, "\n");
14014 /* BGP network import check. */
14015 if (!!bgp_flag_check(bgp
, BGP_FLAG_IMPORT_CHECK
)
14016 != SAVE_BGP_IMPORT_CHECK
)
14017 vty_out(vty
, " %sbgp network import-check\n",
14018 bgp_flag_check(bgp
, BGP_FLAG_IMPORT_CHECK
)
14022 /* BGP timers configuration. */
14023 if (bgp
->default_keepalive
!= SAVE_BGP_KEEPALIVE
14024 && bgp
->default_holdtime
!= SAVE_BGP_HOLDTIME
)
14025 vty_out(vty
, " timers bgp %u %u\n",
14026 bgp
->default_keepalive
, bgp
->default_holdtime
);
14029 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
14030 bgp_config_write_peer_global(vty
, bgp
, group
->conf
);
14033 /* Normal neighbor configuration. */
14034 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
14035 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
14036 bgp_config_write_peer_global(vty
, bgp
, peer
);
14039 /* listen range and limit for dynamic BGP neighbors */
14040 bgp_config_write_listen(vty
, bgp
);
14043 * BGP default autoshutdown neighbors
14045 * This must be placed after any peer and peer-group
14046 * configuration, to avoid setting all peers to shutdown after
14047 * a daemon restart, which is undesired behavior. (see #2286)
14049 if (bgp
->autoshutdown
)
14050 vty_out(vty
, " bgp default shutdown\n");
14052 /* IPv4 unicast configuration. */
14053 bgp_config_write_family(vty
, bgp
, AFI_IP
, SAFI_UNICAST
);
14055 /* IPv4 multicast configuration. */
14056 bgp_config_write_family(vty
, bgp
, AFI_IP
, SAFI_MULTICAST
);
14058 /* IPv4 labeled-unicast configuration. */
14059 bgp_config_write_family(vty
, bgp
, AFI_IP
, SAFI_LABELED_UNICAST
);
14061 /* IPv4 VPN configuration. */
14062 bgp_config_write_family(vty
, bgp
, AFI_IP
, SAFI_MPLS_VPN
);
14064 /* ENCAPv4 configuration. */
14065 bgp_config_write_family(vty
, bgp
, AFI_IP
, SAFI_ENCAP
);
14067 /* FLOWSPEC v4 configuration. */
14068 bgp_config_write_family(vty
, bgp
, AFI_IP
, SAFI_FLOWSPEC
);
14070 /* IPv6 unicast configuration. */
14071 bgp_config_write_family(vty
, bgp
, AFI_IP6
, SAFI_UNICAST
);
14073 /* IPv6 multicast configuration. */
14074 bgp_config_write_family(vty
, bgp
, AFI_IP6
, SAFI_MULTICAST
);
14076 /* IPv6 labeled-unicast configuration. */
14077 bgp_config_write_family(vty
, bgp
, AFI_IP6
,
14078 SAFI_LABELED_UNICAST
);
14080 /* IPv6 VPN configuration. */
14081 bgp_config_write_family(vty
, bgp
, AFI_IP6
, SAFI_MPLS_VPN
);
14083 /* ENCAPv6 configuration. */
14084 bgp_config_write_family(vty
, bgp
, AFI_IP6
, SAFI_ENCAP
);
14086 /* FLOWSPEC v6 configuration. */
14087 bgp_config_write_family(vty
, bgp
, AFI_IP6
, SAFI_FLOWSPEC
);
14089 /* EVPN configuration. */
14090 bgp_config_write_family(vty
, bgp
, AFI_L2VPN
, SAFI_EVPN
);
14092 hook_call(bgp_inst_config_write
, bgp
, vty
);
14095 bgp_rfapi_cfg_write(vty
, bgp
);
14098 vty_out(vty
, "!\n");
14104 /* BGP node structure. */
14105 static struct cmd_node bgp_node
= {
14106 BGP_NODE
, "%s(config-router)# ", 1,
14109 static struct cmd_node bgp_ipv4_unicast_node
= {
14110 BGP_IPV4_NODE
, "%s(config-router-af)# ", 1,
14113 static struct cmd_node bgp_ipv4_multicast_node
= {
14114 BGP_IPV4M_NODE
, "%s(config-router-af)# ", 1,
14117 static struct cmd_node bgp_ipv4_labeled_unicast_node
= {
14118 BGP_IPV4L_NODE
, "%s(config-router-af)# ", 1,
14121 static struct cmd_node bgp_ipv6_unicast_node
= {
14122 BGP_IPV6_NODE
, "%s(config-router-af)# ", 1,
14125 static struct cmd_node bgp_ipv6_multicast_node
= {
14126 BGP_IPV6M_NODE
, "%s(config-router-af)# ", 1,
14129 static struct cmd_node bgp_ipv6_labeled_unicast_node
= {
14130 BGP_IPV6L_NODE
, "%s(config-router-af)# ", 1,
14133 static struct cmd_node bgp_vpnv4_node
= {BGP_VPNV4_NODE
,
14134 "%s(config-router-af)# ", 1};
14136 static struct cmd_node bgp_vpnv6_node
= {BGP_VPNV6_NODE
,
14137 "%s(config-router-af-vpnv6)# ", 1};
14139 static struct cmd_node bgp_evpn_node
= {BGP_EVPN_NODE
,
14140 "%s(config-router-evpn)# ", 1};
14142 static struct cmd_node bgp_evpn_vni_node
= {BGP_EVPN_VNI_NODE
,
14143 "%s(config-router-af-vni)# ", 1};
14145 static struct cmd_node bgp_flowspecv4_node
= {BGP_FLOWSPECV4_NODE
,
14146 "%s(config-router-af)# ", 1};
14148 static struct cmd_node bgp_flowspecv6_node
= {BGP_FLOWSPECV6_NODE
,
14149 "%s(config-router-af-vpnv6)# ", 1};
14151 static void community_list_vty(void);
14153 static void bgp_ac_neighbor(vector comps
, struct cmd_token
*token
)
14157 struct listnode
*lnbgp
, *lnpeer
;
14159 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, lnbgp
, bgp
)) {
14160 for (ALL_LIST_ELEMENTS_RO(bgp
->peer
, lnpeer
, peer
)) {
14161 /* only provide suggestions on the appropriate input
14163 * they'll otherwise show up multiple times */
14164 enum cmd_token_type match_type
;
14165 char *name
= peer
->host
;
14167 if (peer
->conf_if
) {
14168 match_type
= VARIABLE_TKN
;
14169 name
= peer
->conf_if
;
14170 } else if (strchr(peer
->host
, ':'))
14171 match_type
= IPV6_TKN
;
14173 match_type
= IPV4_TKN
;
14175 if (token
->type
!= match_type
)
14178 vector_set(comps
, XSTRDUP(MTYPE_COMPLETION
, name
));
14183 static const struct cmd_variable_handler bgp_var_neighbor
[] = {
14184 {.varname
= "neighbor", .completions
= bgp_ac_neighbor
},
14185 {.varname
= "neighbors", .completions
= bgp_ac_neighbor
},
14186 {.varname
= "peer", .completions
= bgp_ac_neighbor
},
14187 {.completions
= NULL
}};
14189 static void bgp_ac_peergroup(vector comps
, struct cmd_token
*token
)
14192 struct peer_group
*group
;
14193 struct listnode
*lnbgp
, *lnpeer
;
14195 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, lnbgp
, bgp
)) {
14196 for (ALL_LIST_ELEMENTS_RO(bgp
->group
, lnpeer
, group
))
14197 vector_set(comps
, XSTRDUP(MTYPE_COMPLETION
,
14202 static const struct cmd_variable_handler bgp_var_peergroup
[] = {
14203 {.tokenname
= "PGNAME", .completions
= bgp_ac_peergroup
},
14204 {.completions
= NULL
} };
14206 void bgp_vty_init(void)
14208 cmd_variable_handler_register(bgp_var_neighbor
);
14209 cmd_variable_handler_register(bgp_var_peergroup
);
14211 /* Install bgp top node. */
14212 install_node(&bgp_node
, bgp_config_write
);
14213 install_node(&bgp_ipv4_unicast_node
, NULL
);
14214 install_node(&bgp_ipv4_multicast_node
, NULL
);
14215 install_node(&bgp_ipv4_labeled_unicast_node
, NULL
);
14216 install_node(&bgp_ipv6_unicast_node
, NULL
);
14217 install_node(&bgp_ipv6_multicast_node
, NULL
);
14218 install_node(&bgp_ipv6_labeled_unicast_node
, NULL
);
14219 install_node(&bgp_vpnv4_node
, NULL
);
14220 install_node(&bgp_vpnv6_node
, NULL
);
14221 install_node(&bgp_evpn_node
, NULL
);
14222 install_node(&bgp_evpn_vni_node
, NULL
);
14223 install_node(&bgp_flowspecv4_node
, NULL
);
14224 install_node(&bgp_flowspecv6_node
, NULL
);
14226 /* Install default VTY commands to new nodes. */
14227 install_default(BGP_NODE
);
14228 install_default(BGP_IPV4_NODE
);
14229 install_default(BGP_IPV4M_NODE
);
14230 install_default(BGP_IPV4L_NODE
);
14231 install_default(BGP_IPV6_NODE
);
14232 install_default(BGP_IPV6M_NODE
);
14233 install_default(BGP_IPV6L_NODE
);
14234 install_default(BGP_VPNV4_NODE
);
14235 install_default(BGP_VPNV6_NODE
);
14236 install_default(BGP_FLOWSPECV4_NODE
);
14237 install_default(BGP_FLOWSPECV6_NODE
);
14238 install_default(BGP_EVPN_NODE
);
14239 install_default(BGP_EVPN_VNI_NODE
);
14241 /* "bgp local-mac" hidden commands. */
14242 install_element(CONFIG_NODE
, &bgp_local_mac_cmd
);
14243 install_element(CONFIG_NODE
, &no_bgp_local_mac_cmd
);
14245 /* bgp route-map delay-timer commands. */
14246 install_element(CONFIG_NODE
, &bgp_set_route_map_delay_timer_cmd
);
14247 install_element(CONFIG_NODE
, &no_bgp_set_route_map_delay_timer_cmd
);
14249 /* Dummy commands (Currently not supported) */
14250 install_element(BGP_NODE
, &no_synchronization_cmd
);
14251 install_element(BGP_NODE
, &no_auto_summary_cmd
);
14253 /* "router bgp" commands. */
14254 install_element(CONFIG_NODE
, &router_bgp_cmd
);
14256 /* "no router bgp" commands. */
14257 install_element(CONFIG_NODE
, &no_router_bgp_cmd
);
14259 /* "bgp router-id" commands. */
14260 install_element(BGP_NODE
, &bgp_router_id_cmd
);
14261 install_element(BGP_NODE
, &no_bgp_router_id_cmd
);
14263 /* "bgp cluster-id" commands. */
14264 install_element(BGP_NODE
, &bgp_cluster_id_cmd
);
14265 install_element(BGP_NODE
, &no_bgp_cluster_id_cmd
);
14267 /* "bgp confederation" commands. */
14268 install_element(BGP_NODE
, &bgp_confederation_identifier_cmd
);
14269 install_element(BGP_NODE
, &no_bgp_confederation_identifier_cmd
);
14271 /* "bgp confederation peers" commands. */
14272 install_element(BGP_NODE
, &bgp_confederation_peers_cmd
);
14273 install_element(BGP_NODE
, &no_bgp_confederation_peers_cmd
);
14275 /* bgp max-med command */
14276 install_element(BGP_NODE
, &bgp_maxmed_admin_cmd
);
14277 install_element(BGP_NODE
, &no_bgp_maxmed_admin_cmd
);
14278 install_element(BGP_NODE
, &bgp_maxmed_admin_medv_cmd
);
14279 install_element(BGP_NODE
, &bgp_maxmed_onstartup_cmd
);
14280 install_element(BGP_NODE
, &no_bgp_maxmed_onstartup_cmd
);
14282 /* bgp disable-ebgp-connected-nh-check */
14283 install_element(BGP_NODE
, &bgp_disable_connected_route_check_cmd
);
14284 install_element(BGP_NODE
, &no_bgp_disable_connected_route_check_cmd
);
14286 /* bgp update-delay command */
14287 install_element(BGP_NODE
, &bgp_update_delay_cmd
);
14288 install_element(BGP_NODE
, &no_bgp_update_delay_cmd
);
14289 install_element(BGP_NODE
, &bgp_update_delay_establish_wait_cmd
);
14291 install_element(BGP_NODE
, &bgp_wpkt_quanta_cmd
);
14292 install_element(BGP_NODE
, &bgp_rpkt_quanta_cmd
);
14294 install_element(BGP_NODE
, &bgp_coalesce_time_cmd
);
14295 install_element(BGP_NODE
, &no_bgp_coalesce_time_cmd
);
14297 /* "maximum-paths" commands. */
14298 install_element(BGP_NODE
, &bgp_maxpaths_hidden_cmd
);
14299 install_element(BGP_NODE
, &no_bgp_maxpaths_hidden_cmd
);
14300 install_element(BGP_IPV4_NODE
, &bgp_maxpaths_cmd
);
14301 install_element(BGP_IPV4_NODE
, &no_bgp_maxpaths_cmd
);
14302 install_element(BGP_IPV6_NODE
, &bgp_maxpaths_cmd
);
14303 install_element(BGP_IPV6_NODE
, &no_bgp_maxpaths_cmd
);
14304 install_element(BGP_NODE
, &bgp_maxpaths_ibgp_hidden_cmd
);
14305 install_element(BGP_NODE
, &bgp_maxpaths_ibgp_cluster_hidden_cmd
);
14306 install_element(BGP_NODE
, &no_bgp_maxpaths_ibgp_hidden_cmd
);
14307 install_element(BGP_IPV4_NODE
, &bgp_maxpaths_ibgp_cmd
);
14308 install_element(BGP_IPV4_NODE
, &bgp_maxpaths_ibgp_cluster_cmd
);
14309 install_element(BGP_IPV4_NODE
, &no_bgp_maxpaths_ibgp_cmd
);
14310 install_element(BGP_IPV6_NODE
, &bgp_maxpaths_ibgp_cmd
);
14311 install_element(BGP_IPV6_NODE
, &bgp_maxpaths_ibgp_cluster_cmd
);
14312 install_element(BGP_IPV6_NODE
, &no_bgp_maxpaths_ibgp_cmd
);
14314 install_element(BGP_IPV6L_NODE
, &bgp_maxpaths_cmd
);
14315 install_element(BGP_IPV6L_NODE
, &no_bgp_maxpaths_cmd
);
14316 install_element(BGP_IPV6L_NODE
, &bgp_maxpaths_ibgp_cmd
);
14317 install_element(BGP_IPV6L_NODE
, &bgp_maxpaths_ibgp_cluster_cmd
);
14318 install_element(BGP_IPV6L_NODE
, &no_bgp_maxpaths_ibgp_cmd
);
14320 /* "timers bgp" commands. */
14321 install_element(BGP_NODE
, &bgp_timers_cmd
);
14322 install_element(BGP_NODE
, &no_bgp_timers_cmd
);
14324 /* route-map delay-timer commands - per instance for backwards compat.
14326 install_element(BGP_NODE
, &bgp_set_route_map_delay_timer_cmd
);
14327 install_element(BGP_NODE
, &no_bgp_set_route_map_delay_timer_cmd
);
14329 /* "bgp client-to-client reflection" commands */
14330 install_element(BGP_NODE
, &no_bgp_client_to_client_reflection_cmd
);
14331 install_element(BGP_NODE
, &bgp_client_to_client_reflection_cmd
);
14333 /* "bgp always-compare-med" commands */
14334 install_element(BGP_NODE
, &bgp_always_compare_med_cmd
);
14335 install_element(BGP_NODE
, &no_bgp_always_compare_med_cmd
);
14337 /* bgp ebgp-requires-policy */
14338 install_element(BGP_NODE
, &bgp_ebgp_requires_policy_cmd
);
14339 install_element(BGP_NODE
, &no_bgp_ebgp_requires_policy_cmd
);
14341 /* bgp reject-as-sets */
14342 install_element(BGP_NODE
, &bgp_reject_as_sets_cmd
);
14343 install_element(BGP_NODE
, &no_bgp_reject_as_sets_cmd
);
14345 /* "bgp deterministic-med" commands */
14346 install_element(BGP_NODE
, &bgp_deterministic_med_cmd
);
14347 install_element(BGP_NODE
, &no_bgp_deterministic_med_cmd
);
14349 /* "bgp graceful-restart" commands */
14350 install_element(BGP_NODE
, &bgp_graceful_restart_cmd
);
14351 install_element(BGP_NODE
, &no_bgp_graceful_restart_cmd
);
14352 install_element(BGP_NODE
, &bgp_graceful_restart_stalepath_time_cmd
);
14353 install_element(BGP_NODE
, &no_bgp_graceful_restart_stalepath_time_cmd
);
14354 install_element(BGP_NODE
, &bgp_graceful_restart_restart_time_cmd
);
14355 install_element(BGP_NODE
, &no_bgp_graceful_restart_restart_time_cmd
);
14357 install_element(BGP_NODE
, &bgp_graceful_restart_preserve_fw_cmd
);
14358 install_element(BGP_NODE
, &no_bgp_graceful_restart_preserve_fw_cmd
);
14360 /* "bgp graceful-shutdown" commands */
14361 install_element(BGP_NODE
, &bgp_graceful_shutdown_cmd
);
14362 install_element(BGP_NODE
, &no_bgp_graceful_shutdown_cmd
);
14364 /* "bgp fast-external-failover" commands */
14365 install_element(BGP_NODE
, &bgp_fast_external_failover_cmd
);
14366 install_element(BGP_NODE
, &no_bgp_fast_external_failover_cmd
);
14368 /* "bgp bestpath compare-routerid" commands */
14369 install_element(BGP_NODE
, &bgp_bestpath_compare_router_id_cmd
);
14370 install_element(BGP_NODE
, &no_bgp_bestpath_compare_router_id_cmd
);
14372 /* "bgp bestpath as-path ignore" commands */
14373 install_element(BGP_NODE
, &bgp_bestpath_aspath_ignore_cmd
);
14374 install_element(BGP_NODE
, &no_bgp_bestpath_aspath_ignore_cmd
);
14376 /* "bgp bestpath as-path confed" commands */
14377 install_element(BGP_NODE
, &bgp_bestpath_aspath_confed_cmd
);
14378 install_element(BGP_NODE
, &no_bgp_bestpath_aspath_confed_cmd
);
14380 /* "bgp bestpath as-path multipath-relax" commands */
14381 install_element(BGP_NODE
, &bgp_bestpath_aspath_multipath_relax_cmd
);
14382 install_element(BGP_NODE
, &no_bgp_bestpath_aspath_multipath_relax_cmd
);
14384 /* "bgp log-neighbor-changes" commands */
14385 install_element(BGP_NODE
, &bgp_log_neighbor_changes_cmd
);
14386 install_element(BGP_NODE
, &no_bgp_log_neighbor_changes_cmd
);
14388 /* "bgp bestpath med" commands */
14389 install_element(BGP_NODE
, &bgp_bestpath_med_cmd
);
14390 install_element(BGP_NODE
, &no_bgp_bestpath_med_cmd
);
14392 /* "no bgp default ipv4-unicast" commands. */
14393 install_element(BGP_NODE
, &no_bgp_default_ipv4_unicast_cmd
);
14394 install_element(BGP_NODE
, &bgp_default_ipv4_unicast_cmd
);
14396 /* "bgp network import-check" commands. */
14397 install_element(BGP_NODE
, &bgp_network_import_check_cmd
);
14398 install_element(BGP_NODE
, &bgp_network_import_check_exact_cmd
);
14399 install_element(BGP_NODE
, &no_bgp_network_import_check_cmd
);
14401 /* "bgp default local-preference" commands. */
14402 install_element(BGP_NODE
, &bgp_default_local_preference_cmd
);
14403 install_element(BGP_NODE
, &no_bgp_default_local_preference_cmd
);
14405 /* bgp default show-hostname */
14406 install_element(BGP_NODE
, &bgp_default_show_hostname_cmd
);
14407 install_element(BGP_NODE
, &no_bgp_default_show_hostname_cmd
);
14409 /* "bgp default subgroup-pkt-queue-max" commands. */
14410 install_element(BGP_NODE
, &bgp_default_subgroup_pkt_queue_max_cmd
);
14411 install_element(BGP_NODE
, &no_bgp_default_subgroup_pkt_queue_max_cmd
);
14413 /* bgp ibgp-allow-policy-mods command */
14414 install_element(BGP_NODE
, &bgp_rr_allow_outbound_policy_cmd
);
14415 install_element(BGP_NODE
, &no_bgp_rr_allow_outbound_policy_cmd
);
14417 /* "bgp listen limit" commands. */
14418 install_element(BGP_NODE
, &bgp_listen_limit_cmd
);
14419 install_element(BGP_NODE
, &no_bgp_listen_limit_cmd
);
14421 /* "bgp listen range" commands. */
14422 install_element(BGP_NODE
, &bgp_listen_range_cmd
);
14423 install_element(BGP_NODE
, &no_bgp_listen_range_cmd
);
14425 /* "bgp default shutdown" command */
14426 install_element(BGP_NODE
, &bgp_default_shutdown_cmd
);
14428 /* "neighbor remote-as" commands. */
14429 install_element(BGP_NODE
, &neighbor_remote_as_cmd
);
14430 install_element(BGP_NODE
, &neighbor_interface_config_cmd
);
14431 install_element(BGP_NODE
, &neighbor_interface_config_v6only_cmd
);
14432 install_element(BGP_NODE
, &neighbor_interface_config_remote_as_cmd
);
14433 install_element(BGP_NODE
,
14434 &neighbor_interface_v6only_config_remote_as_cmd
);
14435 install_element(BGP_NODE
, &no_neighbor_cmd
);
14436 install_element(BGP_NODE
, &no_neighbor_interface_config_cmd
);
14438 /* "neighbor peer-group" commands. */
14439 install_element(BGP_NODE
, &neighbor_peer_group_cmd
);
14440 install_element(BGP_NODE
, &no_neighbor_peer_group_cmd
);
14441 install_element(BGP_NODE
,
14442 &no_neighbor_interface_peer_group_remote_as_cmd
);
14444 /* "neighbor local-as" commands. */
14445 install_element(BGP_NODE
, &neighbor_local_as_cmd
);
14446 install_element(BGP_NODE
, &neighbor_local_as_no_prepend_cmd
);
14447 install_element(BGP_NODE
, &neighbor_local_as_no_prepend_replace_as_cmd
);
14448 install_element(BGP_NODE
, &no_neighbor_local_as_cmd
);
14450 /* "neighbor solo" commands. */
14451 install_element(BGP_NODE
, &neighbor_solo_cmd
);
14452 install_element(BGP_NODE
, &no_neighbor_solo_cmd
);
14454 /* "neighbor password" commands. */
14455 install_element(BGP_NODE
, &neighbor_password_cmd
);
14456 install_element(BGP_NODE
, &no_neighbor_password_cmd
);
14458 /* "neighbor activate" commands. */
14459 install_element(BGP_NODE
, &neighbor_activate_hidden_cmd
);
14460 install_element(BGP_IPV4_NODE
, &neighbor_activate_cmd
);
14461 install_element(BGP_IPV4M_NODE
, &neighbor_activate_cmd
);
14462 install_element(BGP_IPV4L_NODE
, &neighbor_activate_cmd
);
14463 install_element(BGP_IPV6_NODE
, &neighbor_activate_cmd
);
14464 install_element(BGP_IPV6M_NODE
, &neighbor_activate_cmd
);
14465 install_element(BGP_IPV6L_NODE
, &neighbor_activate_cmd
);
14466 install_element(BGP_VPNV4_NODE
, &neighbor_activate_cmd
);
14467 install_element(BGP_VPNV6_NODE
, &neighbor_activate_cmd
);
14468 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_activate_cmd
);
14469 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_activate_cmd
);
14470 install_element(BGP_EVPN_NODE
, &neighbor_activate_cmd
);
14472 /* "no neighbor activate" commands. */
14473 install_element(BGP_NODE
, &no_neighbor_activate_hidden_cmd
);
14474 install_element(BGP_IPV4_NODE
, &no_neighbor_activate_cmd
);
14475 install_element(BGP_IPV4M_NODE
, &no_neighbor_activate_cmd
);
14476 install_element(BGP_IPV4L_NODE
, &no_neighbor_activate_cmd
);
14477 install_element(BGP_IPV6_NODE
, &no_neighbor_activate_cmd
);
14478 install_element(BGP_IPV6M_NODE
, &no_neighbor_activate_cmd
);
14479 install_element(BGP_IPV6L_NODE
, &no_neighbor_activate_cmd
);
14480 install_element(BGP_VPNV4_NODE
, &no_neighbor_activate_cmd
);
14481 install_element(BGP_VPNV6_NODE
, &no_neighbor_activate_cmd
);
14482 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_activate_cmd
);
14483 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_activate_cmd
);
14484 install_element(BGP_EVPN_NODE
, &no_neighbor_activate_cmd
);
14486 /* "neighbor peer-group" set commands. */
14487 install_element(BGP_NODE
, &neighbor_set_peer_group_cmd
);
14488 install_element(BGP_IPV4_NODE
, &neighbor_set_peer_group_hidden_cmd
);
14489 install_element(BGP_IPV4M_NODE
, &neighbor_set_peer_group_hidden_cmd
);
14490 install_element(BGP_IPV6_NODE
, &neighbor_set_peer_group_hidden_cmd
);
14491 install_element(BGP_IPV6M_NODE
, &neighbor_set_peer_group_hidden_cmd
);
14492 install_element(BGP_IPV6L_NODE
, &neighbor_set_peer_group_hidden_cmd
);
14493 install_element(BGP_VPNV4_NODE
, &neighbor_set_peer_group_hidden_cmd
);
14494 install_element(BGP_VPNV6_NODE
, &neighbor_set_peer_group_hidden_cmd
);
14495 install_element(BGP_FLOWSPECV4_NODE
,
14496 &neighbor_set_peer_group_hidden_cmd
);
14497 install_element(BGP_FLOWSPECV6_NODE
,
14498 &neighbor_set_peer_group_hidden_cmd
);
14500 /* "no neighbor peer-group unset" commands. */
14501 install_element(BGP_NODE
, &no_neighbor_set_peer_group_cmd
);
14502 install_element(BGP_IPV4_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
14503 install_element(BGP_IPV4M_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
14504 install_element(BGP_IPV6_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
14505 install_element(BGP_IPV6M_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
14506 install_element(BGP_IPV6L_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
14507 install_element(BGP_VPNV4_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
14508 install_element(BGP_VPNV6_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
14509 install_element(BGP_FLOWSPECV4_NODE
,
14510 &no_neighbor_set_peer_group_hidden_cmd
);
14511 install_element(BGP_FLOWSPECV6_NODE
,
14512 &no_neighbor_set_peer_group_hidden_cmd
);
14514 /* "neighbor softreconfiguration inbound" commands.*/
14515 install_element(BGP_NODE
, &neighbor_soft_reconfiguration_hidden_cmd
);
14516 install_element(BGP_NODE
, &no_neighbor_soft_reconfiguration_hidden_cmd
);
14517 install_element(BGP_IPV4_NODE
, &neighbor_soft_reconfiguration_cmd
);
14518 install_element(BGP_IPV4_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
14519 install_element(BGP_IPV4L_NODE
, &neighbor_soft_reconfiguration_cmd
);
14520 install_element(BGP_IPV4L_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
14521 install_element(BGP_IPV4M_NODE
, &neighbor_soft_reconfiguration_cmd
);
14522 install_element(BGP_IPV4M_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
14523 install_element(BGP_IPV6_NODE
, &neighbor_soft_reconfiguration_cmd
);
14524 install_element(BGP_IPV6_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
14525 install_element(BGP_IPV6M_NODE
, &neighbor_soft_reconfiguration_cmd
);
14526 install_element(BGP_IPV6M_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
14527 install_element(BGP_IPV6L_NODE
, &neighbor_soft_reconfiguration_cmd
);
14528 install_element(BGP_IPV6L_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
14529 install_element(BGP_VPNV4_NODE
, &neighbor_soft_reconfiguration_cmd
);
14530 install_element(BGP_VPNV4_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
14531 install_element(BGP_VPNV6_NODE
, &neighbor_soft_reconfiguration_cmd
);
14532 install_element(BGP_VPNV6_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
14533 install_element(BGP_FLOWSPECV4_NODE
,
14534 &neighbor_soft_reconfiguration_cmd
);
14535 install_element(BGP_FLOWSPECV4_NODE
,
14536 &no_neighbor_soft_reconfiguration_cmd
);
14537 install_element(BGP_FLOWSPECV6_NODE
,
14538 &neighbor_soft_reconfiguration_cmd
);
14539 install_element(BGP_FLOWSPECV6_NODE
,
14540 &no_neighbor_soft_reconfiguration_cmd
);
14541 install_element(BGP_EVPN_NODE
, &neighbor_soft_reconfiguration_cmd
);
14542 install_element(BGP_EVPN_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
14544 /* "neighbor attribute-unchanged" commands. */
14545 install_element(BGP_NODE
, &neighbor_attr_unchanged_hidden_cmd
);
14546 install_element(BGP_NODE
, &no_neighbor_attr_unchanged_hidden_cmd
);
14547 install_element(BGP_IPV4_NODE
, &neighbor_attr_unchanged_cmd
);
14548 install_element(BGP_IPV4_NODE
, &no_neighbor_attr_unchanged_cmd
);
14549 install_element(BGP_IPV4M_NODE
, &neighbor_attr_unchanged_cmd
);
14550 install_element(BGP_IPV4M_NODE
, &no_neighbor_attr_unchanged_cmd
);
14551 install_element(BGP_IPV4L_NODE
, &neighbor_attr_unchanged_cmd
);
14552 install_element(BGP_IPV4L_NODE
, &no_neighbor_attr_unchanged_cmd
);
14553 install_element(BGP_IPV6_NODE
, &neighbor_attr_unchanged_cmd
);
14554 install_element(BGP_IPV6_NODE
, &no_neighbor_attr_unchanged_cmd
);
14555 install_element(BGP_IPV6M_NODE
, &neighbor_attr_unchanged_cmd
);
14556 install_element(BGP_IPV6M_NODE
, &no_neighbor_attr_unchanged_cmd
);
14557 install_element(BGP_IPV6L_NODE
, &neighbor_attr_unchanged_cmd
);
14558 install_element(BGP_IPV6L_NODE
, &no_neighbor_attr_unchanged_cmd
);
14559 install_element(BGP_VPNV4_NODE
, &neighbor_attr_unchanged_cmd
);
14560 install_element(BGP_VPNV4_NODE
, &no_neighbor_attr_unchanged_cmd
);
14561 install_element(BGP_VPNV6_NODE
, &neighbor_attr_unchanged_cmd
);
14562 install_element(BGP_VPNV6_NODE
, &no_neighbor_attr_unchanged_cmd
);
14564 install_element(BGP_EVPN_NODE
, &neighbor_attr_unchanged_cmd
);
14565 install_element(BGP_EVPN_NODE
, &no_neighbor_attr_unchanged_cmd
);
14567 /* "nexthop-local unchanged" commands */
14568 install_element(BGP_IPV6_NODE
, &neighbor_nexthop_local_unchanged_cmd
);
14569 install_element(BGP_IPV6_NODE
,
14570 &no_neighbor_nexthop_local_unchanged_cmd
);
14572 /* "neighbor next-hop-self" commands. */
14573 install_element(BGP_NODE
, &neighbor_nexthop_self_hidden_cmd
);
14574 install_element(BGP_NODE
, &no_neighbor_nexthop_self_hidden_cmd
);
14575 install_element(BGP_IPV4_NODE
, &neighbor_nexthop_self_cmd
);
14576 install_element(BGP_IPV4_NODE
, &no_neighbor_nexthop_self_cmd
);
14577 install_element(BGP_IPV4M_NODE
, &neighbor_nexthop_self_cmd
);
14578 install_element(BGP_IPV4M_NODE
, &no_neighbor_nexthop_self_cmd
);
14579 install_element(BGP_IPV4L_NODE
, &neighbor_nexthop_self_cmd
);
14580 install_element(BGP_IPV4L_NODE
, &no_neighbor_nexthop_self_cmd
);
14581 install_element(BGP_IPV6_NODE
, &neighbor_nexthop_self_cmd
);
14582 install_element(BGP_IPV6_NODE
, &no_neighbor_nexthop_self_cmd
);
14583 install_element(BGP_IPV6M_NODE
, &neighbor_nexthop_self_cmd
);
14584 install_element(BGP_IPV6M_NODE
, &no_neighbor_nexthop_self_cmd
);
14585 install_element(BGP_IPV6L_NODE
, &neighbor_nexthop_self_cmd
);
14586 install_element(BGP_IPV6L_NODE
, &no_neighbor_nexthop_self_cmd
);
14587 install_element(BGP_VPNV4_NODE
, &neighbor_nexthop_self_cmd
);
14588 install_element(BGP_VPNV4_NODE
, &no_neighbor_nexthop_self_cmd
);
14589 install_element(BGP_VPNV6_NODE
, &neighbor_nexthop_self_cmd
);
14590 install_element(BGP_VPNV6_NODE
, &no_neighbor_nexthop_self_cmd
);
14591 install_element(BGP_EVPN_NODE
, &neighbor_nexthop_self_cmd
);
14592 install_element(BGP_EVPN_NODE
, &no_neighbor_nexthop_self_cmd
);
14594 /* "neighbor next-hop-self force" commands. */
14595 install_element(BGP_NODE
, &neighbor_nexthop_self_force_hidden_cmd
);
14596 install_element(BGP_NODE
, &no_neighbor_nexthop_self_force_hidden_cmd
);
14597 install_element(BGP_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
14598 install_element(BGP_NODE
, &no_neighbor_nexthop_self_all_hidden_cmd
);
14599 install_element(BGP_IPV4_NODE
, &neighbor_nexthop_self_force_cmd
);
14600 install_element(BGP_IPV4_NODE
, &no_neighbor_nexthop_self_force_cmd
);
14601 install_element(BGP_IPV4_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
14602 install_element(BGP_IPV4_NODE
,
14603 &no_neighbor_nexthop_self_all_hidden_cmd
);
14604 install_element(BGP_IPV4M_NODE
, &neighbor_nexthop_self_force_cmd
);
14605 install_element(BGP_IPV4M_NODE
, &no_neighbor_nexthop_self_force_cmd
);
14606 install_element(BGP_IPV4M_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
14607 install_element(BGP_IPV4M_NODE
,
14608 &no_neighbor_nexthop_self_all_hidden_cmd
);
14609 install_element(BGP_IPV4L_NODE
, &neighbor_nexthop_self_force_cmd
);
14610 install_element(BGP_IPV4L_NODE
, &no_neighbor_nexthop_self_force_cmd
);
14611 install_element(BGP_IPV4L_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
14612 install_element(BGP_IPV4L_NODE
,
14613 &no_neighbor_nexthop_self_all_hidden_cmd
);
14614 install_element(BGP_IPV6_NODE
, &neighbor_nexthop_self_force_cmd
);
14615 install_element(BGP_IPV6_NODE
, &no_neighbor_nexthop_self_force_cmd
);
14616 install_element(BGP_IPV6_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
14617 install_element(BGP_IPV6_NODE
,
14618 &no_neighbor_nexthop_self_all_hidden_cmd
);
14619 install_element(BGP_IPV6M_NODE
, &neighbor_nexthop_self_force_cmd
);
14620 install_element(BGP_IPV6M_NODE
, &no_neighbor_nexthop_self_force_cmd
);
14621 install_element(BGP_IPV6M_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
14622 install_element(BGP_IPV6M_NODE
,
14623 &no_neighbor_nexthop_self_all_hidden_cmd
);
14624 install_element(BGP_IPV6L_NODE
, &neighbor_nexthop_self_force_cmd
);
14625 install_element(BGP_IPV6L_NODE
, &no_neighbor_nexthop_self_force_cmd
);
14626 install_element(BGP_IPV6L_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
14627 install_element(BGP_IPV6L_NODE
,
14628 &no_neighbor_nexthop_self_all_hidden_cmd
);
14629 install_element(BGP_VPNV4_NODE
, &neighbor_nexthop_self_force_cmd
);
14630 install_element(BGP_VPNV4_NODE
, &no_neighbor_nexthop_self_force_cmd
);
14631 install_element(BGP_VPNV4_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
14632 install_element(BGP_VPNV4_NODE
,
14633 &no_neighbor_nexthop_self_all_hidden_cmd
);
14634 install_element(BGP_VPNV6_NODE
, &neighbor_nexthop_self_force_cmd
);
14635 install_element(BGP_VPNV6_NODE
, &no_neighbor_nexthop_self_force_cmd
);
14636 install_element(BGP_VPNV6_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
14637 install_element(BGP_VPNV6_NODE
,
14638 &no_neighbor_nexthop_self_all_hidden_cmd
);
14640 /* "neighbor as-override" commands. */
14641 install_element(BGP_NODE
, &neighbor_as_override_hidden_cmd
);
14642 install_element(BGP_NODE
, &no_neighbor_as_override_hidden_cmd
);
14643 install_element(BGP_IPV4_NODE
, &neighbor_as_override_cmd
);
14644 install_element(BGP_IPV4_NODE
, &no_neighbor_as_override_cmd
);
14645 install_element(BGP_IPV4M_NODE
, &neighbor_as_override_cmd
);
14646 install_element(BGP_IPV4M_NODE
, &no_neighbor_as_override_cmd
);
14647 install_element(BGP_IPV4L_NODE
, &neighbor_as_override_cmd
);
14648 install_element(BGP_IPV4L_NODE
, &no_neighbor_as_override_cmd
);
14649 install_element(BGP_IPV6_NODE
, &neighbor_as_override_cmd
);
14650 install_element(BGP_IPV6_NODE
, &no_neighbor_as_override_cmd
);
14651 install_element(BGP_IPV6M_NODE
, &neighbor_as_override_cmd
);
14652 install_element(BGP_IPV6M_NODE
, &no_neighbor_as_override_cmd
);
14653 install_element(BGP_IPV6L_NODE
, &neighbor_as_override_cmd
);
14654 install_element(BGP_IPV6L_NODE
, &no_neighbor_as_override_cmd
);
14655 install_element(BGP_VPNV4_NODE
, &neighbor_as_override_cmd
);
14656 install_element(BGP_VPNV4_NODE
, &no_neighbor_as_override_cmd
);
14657 install_element(BGP_VPNV6_NODE
, &neighbor_as_override_cmd
);
14658 install_element(BGP_VPNV6_NODE
, &no_neighbor_as_override_cmd
);
14660 /* "neighbor remove-private-AS" commands. */
14661 install_element(BGP_NODE
, &neighbor_remove_private_as_hidden_cmd
);
14662 install_element(BGP_NODE
, &no_neighbor_remove_private_as_hidden_cmd
);
14663 install_element(BGP_NODE
, &neighbor_remove_private_as_all_hidden_cmd
);
14664 install_element(BGP_NODE
,
14665 &no_neighbor_remove_private_as_all_hidden_cmd
);
14666 install_element(BGP_NODE
,
14667 &neighbor_remove_private_as_replace_as_hidden_cmd
);
14668 install_element(BGP_NODE
,
14669 &no_neighbor_remove_private_as_replace_as_hidden_cmd
);
14670 install_element(BGP_NODE
,
14671 &neighbor_remove_private_as_all_replace_as_hidden_cmd
);
14674 &no_neighbor_remove_private_as_all_replace_as_hidden_cmd
);
14675 install_element(BGP_IPV4_NODE
, &neighbor_remove_private_as_cmd
);
14676 install_element(BGP_IPV4_NODE
, &no_neighbor_remove_private_as_cmd
);
14677 install_element(BGP_IPV4_NODE
, &neighbor_remove_private_as_all_cmd
);
14678 install_element(BGP_IPV4_NODE
, &no_neighbor_remove_private_as_all_cmd
);
14679 install_element(BGP_IPV4_NODE
,
14680 &neighbor_remove_private_as_replace_as_cmd
);
14681 install_element(BGP_IPV4_NODE
,
14682 &no_neighbor_remove_private_as_replace_as_cmd
);
14683 install_element(BGP_IPV4_NODE
,
14684 &neighbor_remove_private_as_all_replace_as_cmd
);
14685 install_element(BGP_IPV4_NODE
,
14686 &no_neighbor_remove_private_as_all_replace_as_cmd
);
14687 install_element(BGP_IPV4M_NODE
, &neighbor_remove_private_as_cmd
);
14688 install_element(BGP_IPV4M_NODE
, &no_neighbor_remove_private_as_cmd
);
14689 install_element(BGP_IPV4M_NODE
, &neighbor_remove_private_as_all_cmd
);
14690 install_element(BGP_IPV4M_NODE
, &no_neighbor_remove_private_as_all_cmd
);
14691 install_element(BGP_IPV4M_NODE
,
14692 &neighbor_remove_private_as_replace_as_cmd
);
14693 install_element(BGP_IPV4M_NODE
,
14694 &no_neighbor_remove_private_as_replace_as_cmd
);
14695 install_element(BGP_IPV4M_NODE
,
14696 &neighbor_remove_private_as_all_replace_as_cmd
);
14697 install_element(BGP_IPV4M_NODE
,
14698 &no_neighbor_remove_private_as_all_replace_as_cmd
);
14699 install_element(BGP_IPV4L_NODE
, &neighbor_remove_private_as_cmd
);
14700 install_element(BGP_IPV4L_NODE
, &no_neighbor_remove_private_as_cmd
);
14701 install_element(BGP_IPV4L_NODE
, &neighbor_remove_private_as_all_cmd
);
14702 install_element(BGP_IPV4L_NODE
, &no_neighbor_remove_private_as_all_cmd
);
14703 install_element(BGP_IPV4L_NODE
,
14704 &neighbor_remove_private_as_replace_as_cmd
);
14705 install_element(BGP_IPV4L_NODE
,
14706 &no_neighbor_remove_private_as_replace_as_cmd
);
14707 install_element(BGP_IPV4L_NODE
,
14708 &neighbor_remove_private_as_all_replace_as_cmd
);
14709 install_element(BGP_IPV4L_NODE
,
14710 &no_neighbor_remove_private_as_all_replace_as_cmd
);
14711 install_element(BGP_IPV6_NODE
, &neighbor_remove_private_as_cmd
);
14712 install_element(BGP_IPV6_NODE
, &no_neighbor_remove_private_as_cmd
);
14713 install_element(BGP_IPV6_NODE
, &neighbor_remove_private_as_all_cmd
);
14714 install_element(BGP_IPV6_NODE
, &no_neighbor_remove_private_as_all_cmd
);
14715 install_element(BGP_IPV6_NODE
,
14716 &neighbor_remove_private_as_replace_as_cmd
);
14717 install_element(BGP_IPV6_NODE
,
14718 &no_neighbor_remove_private_as_replace_as_cmd
);
14719 install_element(BGP_IPV6_NODE
,
14720 &neighbor_remove_private_as_all_replace_as_cmd
);
14721 install_element(BGP_IPV6_NODE
,
14722 &no_neighbor_remove_private_as_all_replace_as_cmd
);
14723 install_element(BGP_IPV6M_NODE
, &neighbor_remove_private_as_cmd
);
14724 install_element(BGP_IPV6M_NODE
, &no_neighbor_remove_private_as_cmd
);
14725 install_element(BGP_IPV6M_NODE
, &neighbor_remove_private_as_all_cmd
);
14726 install_element(BGP_IPV6M_NODE
, &no_neighbor_remove_private_as_all_cmd
);
14727 install_element(BGP_IPV6M_NODE
,
14728 &neighbor_remove_private_as_replace_as_cmd
);
14729 install_element(BGP_IPV6M_NODE
,
14730 &no_neighbor_remove_private_as_replace_as_cmd
);
14731 install_element(BGP_IPV6M_NODE
,
14732 &neighbor_remove_private_as_all_replace_as_cmd
);
14733 install_element(BGP_IPV6M_NODE
,
14734 &no_neighbor_remove_private_as_all_replace_as_cmd
);
14735 install_element(BGP_IPV6L_NODE
, &neighbor_remove_private_as_cmd
);
14736 install_element(BGP_IPV6L_NODE
, &no_neighbor_remove_private_as_cmd
);
14737 install_element(BGP_IPV6L_NODE
, &neighbor_remove_private_as_all_cmd
);
14738 install_element(BGP_IPV6L_NODE
, &no_neighbor_remove_private_as_all_cmd
);
14739 install_element(BGP_IPV6L_NODE
,
14740 &neighbor_remove_private_as_replace_as_cmd
);
14741 install_element(BGP_IPV6L_NODE
,
14742 &no_neighbor_remove_private_as_replace_as_cmd
);
14743 install_element(BGP_IPV6L_NODE
,
14744 &neighbor_remove_private_as_all_replace_as_cmd
);
14745 install_element(BGP_IPV6L_NODE
,
14746 &no_neighbor_remove_private_as_all_replace_as_cmd
);
14747 install_element(BGP_VPNV4_NODE
, &neighbor_remove_private_as_cmd
);
14748 install_element(BGP_VPNV4_NODE
, &no_neighbor_remove_private_as_cmd
);
14749 install_element(BGP_VPNV4_NODE
, &neighbor_remove_private_as_all_cmd
);
14750 install_element(BGP_VPNV4_NODE
, &no_neighbor_remove_private_as_all_cmd
);
14751 install_element(BGP_VPNV4_NODE
,
14752 &neighbor_remove_private_as_replace_as_cmd
);
14753 install_element(BGP_VPNV4_NODE
,
14754 &no_neighbor_remove_private_as_replace_as_cmd
);
14755 install_element(BGP_VPNV4_NODE
,
14756 &neighbor_remove_private_as_all_replace_as_cmd
);
14757 install_element(BGP_VPNV4_NODE
,
14758 &no_neighbor_remove_private_as_all_replace_as_cmd
);
14759 install_element(BGP_VPNV6_NODE
, &neighbor_remove_private_as_cmd
);
14760 install_element(BGP_VPNV6_NODE
, &no_neighbor_remove_private_as_cmd
);
14761 install_element(BGP_VPNV6_NODE
, &neighbor_remove_private_as_all_cmd
);
14762 install_element(BGP_VPNV6_NODE
, &no_neighbor_remove_private_as_all_cmd
);
14763 install_element(BGP_VPNV6_NODE
,
14764 &neighbor_remove_private_as_replace_as_cmd
);
14765 install_element(BGP_VPNV6_NODE
,
14766 &no_neighbor_remove_private_as_replace_as_cmd
);
14767 install_element(BGP_VPNV6_NODE
,
14768 &neighbor_remove_private_as_all_replace_as_cmd
);
14769 install_element(BGP_VPNV6_NODE
,
14770 &no_neighbor_remove_private_as_all_replace_as_cmd
);
14772 /* "neighbor send-community" commands.*/
14773 install_element(BGP_NODE
, &neighbor_send_community_hidden_cmd
);
14774 install_element(BGP_NODE
, &neighbor_send_community_type_hidden_cmd
);
14775 install_element(BGP_NODE
, &no_neighbor_send_community_hidden_cmd
);
14776 install_element(BGP_NODE
, &no_neighbor_send_community_type_hidden_cmd
);
14777 install_element(BGP_IPV4_NODE
, &neighbor_send_community_cmd
);
14778 install_element(BGP_IPV4_NODE
, &neighbor_send_community_type_cmd
);
14779 install_element(BGP_IPV4_NODE
, &no_neighbor_send_community_cmd
);
14780 install_element(BGP_IPV4_NODE
, &no_neighbor_send_community_type_cmd
);
14781 install_element(BGP_IPV4M_NODE
, &neighbor_send_community_cmd
);
14782 install_element(BGP_IPV4M_NODE
, &neighbor_send_community_type_cmd
);
14783 install_element(BGP_IPV4M_NODE
, &no_neighbor_send_community_cmd
);
14784 install_element(BGP_IPV4M_NODE
, &no_neighbor_send_community_type_cmd
);
14785 install_element(BGP_IPV4L_NODE
, &neighbor_send_community_cmd
);
14786 install_element(BGP_IPV4L_NODE
, &neighbor_send_community_type_cmd
);
14787 install_element(BGP_IPV4L_NODE
, &no_neighbor_send_community_cmd
);
14788 install_element(BGP_IPV4L_NODE
, &no_neighbor_send_community_type_cmd
);
14789 install_element(BGP_IPV6_NODE
, &neighbor_send_community_cmd
);
14790 install_element(BGP_IPV6_NODE
, &neighbor_send_community_type_cmd
);
14791 install_element(BGP_IPV6_NODE
, &no_neighbor_send_community_cmd
);
14792 install_element(BGP_IPV6_NODE
, &no_neighbor_send_community_type_cmd
);
14793 install_element(BGP_IPV6M_NODE
, &neighbor_send_community_cmd
);
14794 install_element(BGP_IPV6M_NODE
, &neighbor_send_community_type_cmd
);
14795 install_element(BGP_IPV6M_NODE
, &no_neighbor_send_community_cmd
);
14796 install_element(BGP_IPV6M_NODE
, &no_neighbor_send_community_type_cmd
);
14797 install_element(BGP_IPV6L_NODE
, &neighbor_send_community_cmd
);
14798 install_element(BGP_IPV6L_NODE
, &neighbor_send_community_type_cmd
);
14799 install_element(BGP_IPV6L_NODE
, &no_neighbor_send_community_cmd
);
14800 install_element(BGP_IPV6L_NODE
, &no_neighbor_send_community_type_cmd
);
14801 install_element(BGP_VPNV4_NODE
, &neighbor_send_community_cmd
);
14802 install_element(BGP_VPNV4_NODE
, &neighbor_send_community_type_cmd
);
14803 install_element(BGP_VPNV4_NODE
, &no_neighbor_send_community_cmd
);
14804 install_element(BGP_VPNV4_NODE
, &no_neighbor_send_community_type_cmd
);
14805 install_element(BGP_VPNV6_NODE
, &neighbor_send_community_cmd
);
14806 install_element(BGP_VPNV6_NODE
, &neighbor_send_community_type_cmd
);
14807 install_element(BGP_VPNV6_NODE
, &no_neighbor_send_community_cmd
);
14808 install_element(BGP_VPNV6_NODE
, &no_neighbor_send_community_type_cmd
);
14810 /* "neighbor route-reflector" commands.*/
14811 install_element(BGP_NODE
, &neighbor_route_reflector_client_hidden_cmd
);
14812 install_element(BGP_NODE
,
14813 &no_neighbor_route_reflector_client_hidden_cmd
);
14814 install_element(BGP_IPV4_NODE
, &neighbor_route_reflector_client_cmd
);
14815 install_element(BGP_IPV4_NODE
, &no_neighbor_route_reflector_client_cmd
);
14816 install_element(BGP_IPV4M_NODE
, &neighbor_route_reflector_client_cmd
);
14817 install_element(BGP_IPV4M_NODE
,
14818 &no_neighbor_route_reflector_client_cmd
);
14819 install_element(BGP_IPV4L_NODE
, &neighbor_route_reflector_client_cmd
);
14820 install_element(BGP_IPV4L_NODE
,
14821 &no_neighbor_route_reflector_client_cmd
);
14822 install_element(BGP_IPV6_NODE
, &neighbor_route_reflector_client_cmd
);
14823 install_element(BGP_IPV6_NODE
, &no_neighbor_route_reflector_client_cmd
);
14824 install_element(BGP_IPV6M_NODE
, &neighbor_route_reflector_client_cmd
);
14825 install_element(BGP_IPV6M_NODE
,
14826 &no_neighbor_route_reflector_client_cmd
);
14827 install_element(BGP_IPV6L_NODE
, &neighbor_route_reflector_client_cmd
);
14828 install_element(BGP_IPV6L_NODE
,
14829 &no_neighbor_route_reflector_client_cmd
);
14830 install_element(BGP_VPNV4_NODE
, &neighbor_route_reflector_client_cmd
);
14831 install_element(BGP_VPNV4_NODE
,
14832 &no_neighbor_route_reflector_client_cmd
);
14833 install_element(BGP_VPNV6_NODE
, &neighbor_route_reflector_client_cmd
);
14834 install_element(BGP_VPNV6_NODE
,
14835 &no_neighbor_route_reflector_client_cmd
);
14836 install_element(BGP_FLOWSPECV4_NODE
,
14837 &neighbor_route_reflector_client_cmd
);
14838 install_element(BGP_FLOWSPECV4_NODE
,
14839 &no_neighbor_route_reflector_client_cmd
);
14840 install_element(BGP_FLOWSPECV6_NODE
,
14841 &neighbor_route_reflector_client_cmd
);
14842 install_element(BGP_FLOWSPECV6_NODE
,
14843 &no_neighbor_route_reflector_client_cmd
);
14844 install_element(BGP_EVPN_NODE
, &neighbor_route_reflector_client_cmd
);
14845 install_element(BGP_EVPN_NODE
, &no_neighbor_route_reflector_client_cmd
);
14847 /* "neighbor route-server" commands.*/
14848 install_element(BGP_NODE
, &neighbor_route_server_client_hidden_cmd
);
14849 install_element(BGP_NODE
, &no_neighbor_route_server_client_hidden_cmd
);
14850 install_element(BGP_IPV4_NODE
, &neighbor_route_server_client_cmd
);
14851 install_element(BGP_IPV4_NODE
, &no_neighbor_route_server_client_cmd
);
14852 install_element(BGP_IPV4M_NODE
, &neighbor_route_server_client_cmd
);
14853 install_element(BGP_IPV4M_NODE
, &no_neighbor_route_server_client_cmd
);
14854 install_element(BGP_IPV4L_NODE
, &neighbor_route_server_client_cmd
);
14855 install_element(BGP_IPV4L_NODE
, &no_neighbor_route_server_client_cmd
);
14856 install_element(BGP_IPV6_NODE
, &neighbor_route_server_client_cmd
);
14857 install_element(BGP_IPV6_NODE
, &no_neighbor_route_server_client_cmd
);
14858 install_element(BGP_IPV6M_NODE
, &neighbor_route_server_client_cmd
);
14859 install_element(BGP_IPV6M_NODE
, &no_neighbor_route_server_client_cmd
);
14860 install_element(BGP_IPV6L_NODE
, &neighbor_route_server_client_cmd
);
14861 install_element(BGP_IPV6L_NODE
, &no_neighbor_route_server_client_cmd
);
14862 install_element(BGP_VPNV4_NODE
, &neighbor_route_server_client_cmd
);
14863 install_element(BGP_VPNV4_NODE
, &no_neighbor_route_server_client_cmd
);
14864 install_element(BGP_VPNV6_NODE
, &neighbor_route_server_client_cmd
);
14865 install_element(BGP_VPNV6_NODE
, &no_neighbor_route_server_client_cmd
);
14866 install_element(BGP_EVPN_NODE
, &neighbor_route_server_client_cmd
);
14867 install_element(BGP_EVPN_NODE
, &no_neighbor_route_server_client_cmd
);
14868 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_route_server_client_cmd
);
14869 install_element(BGP_FLOWSPECV4_NODE
,
14870 &no_neighbor_route_server_client_cmd
);
14871 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_route_server_client_cmd
);
14872 install_element(BGP_FLOWSPECV6_NODE
,
14873 &no_neighbor_route_server_client_cmd
);
14875 /* "neighbor addpath-tx-all-paths" commands.*/
14876 install_element(BGP_NODE
, &neighbor_addpath_tx_all_paths_hidden_cmd
);
14877 install_element(BGP_NODE
, &no_neighbor_addpath_tx_all_paths_hidden_cmd
);
14878 install_element(BGP_IPV4_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
14879 install_element(BGP_IPV4_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
14880 install_element(BGP_IPV4M_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
14881 install_element(BGP_IPV4M_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
14882 install_element(BGP_IPV4L_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
14883 install_element(BGP_IPV4L_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
14884 install_element(BGP_IPV6_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
14885 install_element(BGP_IPV6_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
14886 install_element(BGP_IPV6M_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
14887 install_element(BGP_IPV6M_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
14888 install_element(BGP_IPV6L_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
14889 install_element(BGP_IPV6L_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
14890 install_element(BGP_VPNV4_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
14891 install_element(BGP_VPNV4_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
14892 install_element(BGP_VPNV6_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
14893 install_element(BGP_VPNV6_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
14895 /* "neighbor addpath-tx-bestpath-per-AS" commands.*/
14896 install_element(BGP_NODE
,
14897 &neighbor_addpath_tx_bestpath_per_as_hidden_cmd
);
14898 install_element(BGP_NODE
,
14899 &no_neighbor_addpath_tx_bestpath_per_as_hidden_cmd
);
14900 install_element(BGP_IPV4_NODE
,
14901 &neighbor_addpath_tx_bestpath_per_as_cmd
);
14902 install_element(BGP_IPV4_NODE
,
14903 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
14904 install_element(BGP_IPV4M_NODE
,
14905 &neighbor_addpath_tx_bestpath_per_as_cmd
);
14906 install_element(BGP_IPV4M_NODE
,
14907 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
14908 install_element(BGP_IPV4L_NODE
,
14909 &neighbor_addpath_tx_bestpath_per_as_cmd
);
14910 install_element(BGP_IPV4L_NODE
,
14911 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
14912 install_element(BGP_IPV6_NODE
,
14913 &neighbor_addpath_tx_bestpath_per_as_cmd
);
14914 install_element(BGP_IPV6_NODE
,
14915 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
14916 install_element(BGP_IPV6M_NODE
,
14917 &neighbor_addpath_tx_bestpath_per_as_cmd
);
14918 install_element(BGP_IPV6M_NODE
,
14919 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
14920 install_element(BGP_IPV6L_NODE
,
14921 &neighbor_addpath_tx_bestpath_per_as_cmd
);
14922 install_element(BGP_IPV6L_NODE
,
14923 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
14924 install_element(BGP_VPNV4_NODE
,
14925 &neighbor_addpath_tx_bestpath_per_as_cmd
);
14926 install_element(BGP_VPNV4_NODE
,
14927 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
14928 install_element(BGP_VPNV6_NODE
,
14929 &neighbor_addpath_tx_bestpath_per_as_cmd
);
14930 install_element(BGP_VPNV6_NODE
,
14931 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
14933 /* "neighbor sender-as-path-loop-detection" commands. */
14934 install_element(BGP_NODE
, &neighbor_aspath_loop_detection_cmd
);
14935 install_element(BGP_NODE
, &no_neighbor_aspath_loop_detection_cmd
);
14937 /* "neighbor passive" commands. */
14938 install_element(BGP_NODE
, &neighbor_passive_cmd
);
14939 install_element(BGP_NODE
, &no_neighbor_passive_cmd
);
14942 /* "neighbor shutdown" commands. */
14943 install_element(BGP_NODE
, &neighbor_shutdown_cmd
);
14944 install_element(BGP_NODE
, &no_neighbor_shutdown_cmd
);
14945 install_element(BGP_NODE
, &neighbor_shutdown_msg_cmd
);
14946 install_element(BGP_NODE
, &no_neighbor_shutdown_msg_cmd
);
14948 /* "neighbor capability extended-nexthop" commands.*/
14949 install_element(BGP_NODE
, &neighbor_capability_enhe_cmd
);
14950 install_element(BGP_NODE
, &no_neighbor_capability_enhe_cmd
);
14952 /* "neighbor capability orf prefix-list" commands.*/
14953 install_element(BGP_NODE
, &neighbor_capability_orf_prefix_hidden_cmd
);
14954 install_element(BGP_NODE
,
14955 &no_neighbor_capability_orf_prefix_hidden_cmd
);
14956 install_element(BGP_IPV4_NODE
, &neighbor_capability_orf_prefix_cmd
);
14957 install_element(BGP_IPV4_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
14958 install_element(BGP_IPV4M_NODE
, &neighbor_capability_orf_prefix_cmd
);
14959 install_element(BGP_IPV4M_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
14960 install_element(BGP_IPV4L_NODE
, &neighbor_capability_orf_prefix_cmd
);
14961 install_element(BGP_IPV4L_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
14962 install_element(BGP_IPV6_NODE
, &neighbor_capability_orf_prefix_cmd
);
14963 install_element(BGP_IPV6_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
14964 install_element(BGP_IPV6M_NODE
, &neighbor_capability_orf_prefix_cmd
);
14965 install_element(BGP_IPV6M_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
14966 install_element(BGP_IPV6L_NODE
, &neighbor_capability_orf_prefix_cmd
);
14967 install_element(BGP_IPV6L_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
14969 /* "neighbor capability dynamic" commands.*/
14970 install_element(BGP_NODE
, &neighbor_capability_dynamic_cmd
);
14971 install_element(BGP_NODE
, &no_neighbor_capability_dynamic_cmd
);
14973 /* "neighbor dont-capability-negotiate" commands. */
14974 install_element(BGP_NODE
, &neighbor_dont_capability_negotiate_cmd
);
14975 install_element(BGP_NODE
, &no_neighbor_dont_capability_negotiate_cmd
);
14977 /* "neighbor ebgp-multihop" commands. */
14978 install_element(BGP_NODE
, &neighbor_ebgp_multihop_cmd
);
14979 install_element(BGP_NODE
, &neighbor_ebgp_multihop_ttl_cmd
);
14980 install_element(BGP_NODE
, &no_neighbor_ebgp_multihop_cmd
);
14982 /* "neighbor disable-connected-check" commands. */
14983 install_element(BGP_NODE
, &neighbor_disable_connected_check_cmd
);
14984 install_element(BGP_NODE
, &no_neighbor_disable_connected_check_cmd
);
14986 /* "neighbor enforce-first-as" commands. */
14987 install_element(BGP_NODE
, &neighbor_enforce_first_as_cmd
);
14988 install_element(BGP_NODE
, &no_neighbor_enforce_first_as_cmd
);
14990 /* "neighbor description" commands. */
14991 install_element(BGP_NODE
, &neighbor_description_cmd
);
14992 install_element(BGP_NODE
, &no_neighbor_description_cmd
);
14993 install_element(BGP_NODE
, &no_neighbor_description_comment_cmd
);
14995 /* "neighbor update-source" commands. "*/
14996 install_element(BGP_NODE
, &neighbor_update_source_cmd
);
14997 install_element(BGP_NODE
, &no_neighbor_update_source_cmd
);
14999 /* "neighbor default-originate" commands. */
15000 install_element(BGP_NODE
, &neighbor_default_originate_hidden_cmd
);
15001 install_element(BGP_NODE
, &neighbor_default_originate_rmap_hidden_cmd
);
15002 install_element(BGP_NODE
, &no_neighbor_default_originate_hidden_cmd
);
15003 install_element(BGP_IPV4_NODE
, &neighbor_default_originate_cmd
);
15004 install_element(BGP_IPV4_NODE
, &neighbor_default_originate_rmap_cmd
);
15005 install_element(BGP_IPV4_NODE
, &no_neighbor_default_originate_cmd
);
15006 install_element(BGP_IPV4M_NODE
, &neighbor_default_originate_cmd
);
15007 install_element(BGP_IPV4M_NODE
, &neighbor_default_originate_rmap_cmd
);
15008 install_element(BGP_IPV4M_NODE
, &no_neighbor_default_originate_cmd
);
15009 install_element(BGP_IPV4L_NODE
, &neighbor_default_originate_cmd
);
15010 install_element(BGP_IPV4L_NODE
, &neighbor_default_originate_rmap_cmd
);
15011 install_element(BGP_IPV4L_NODE
, &no_neighbor_default_originate_cmd
);
15012 install_element(BGP_IPV6_NODE
, &neighbor_default_originate_cmd
);
15013 install_element(BGP_IPV6_NODE
, &neighbor_default_originate_rmap_cmd
);
15014 install_element(BGP_IPV6_NODE
, &no_neighbor_default_originate_cmd
);
15015 install_element(BGP_IPV6M_NODE
, &neighbor_default_originate_cmd
);
15016 install_element(BGP_IPV6M_NODE
, &neighbor_default_originate_rmap_cmd
);
15017 install_element(BGP_IPV6M_NODE
, &no_neighbor_default_originate_cmd
);
15018 install_element(BGP_IPV6L_NODE
, &neighbor_default_originate_cmd
);
15019 install_element(BGP_IPV6L_NODE
, &neighbor_default_originate_rmap_cmd
);
15020 install_element(BGP_IPV6L_NODE
, &no_neighbor_default_originate_cmd
);
15022 /* "neighbor port" commands. */
15023 install_element(BGP_NODE
, &neighbor_port_cmd
);
15024 install_element(BGP_NODE
, &no_neighbor_port_cmd
);
15026 /* "neighbor weight" commands. */
15027 install_element(BGP_NODE
, &neighbor_weight_hidden_cmd
);
15028 install_element(BGP_NODE
, &no_neighbor_weight_hidden_cmd
);
15030 install_element(BGP_IPV4_NODE
, &neighbor_weight_cmd
);
15031 install_element(BGP_IPV4_NODE
, &no_neighbor_weight_cmd
);
15032 install_element(BGP_IPV4M_NODE
, &neighbor_weight_cmd
);
15033 install_element(BGP_IPV4M_NODE
, &no_neighbor_weight_cmd
);
15034 install_element(BGP_IPV4L_NODE
, &neighbor_weight_cmd
);
15035 install_element(BGP_IPV4L_NODE
, &no_neighbor_weight_cmd
);
15036 install_element(BGP_IPV6_NODE
, &neighbor_weight_cmd
);
15037 install_element(BGP_IPV6_NODE
, &no_neighbor_weight_cmd
);
15038 install_element(BGP_IPV6M_NODE
, &neighbor_weight_cmd
);
15039 install_element(BGP_IPV6M_NODE
, &no_neighbor_weight_cmd
);
15040 install_element(BGP_IPV6L_NODE
, &neighbor_weight_cmd
);
15041 install_element(BGP_IPV6L_NODE
, &no_neighbor_weight_cmd
);
15042 install_element(BGP_VPNV4_NODE
, &neighbor_weight_cmd
);
15043 install_element(BGP_VPNV4_NODE
, &no_neighbor_weight_cmd
);
15044 install_element(BGP_VPNV6_NODE
, &neighbor_weight_cmd
);
15045 install_element(BGP_VPNV6_NODE
, &no_neighbor_weight_cmd
);
15047 /* "neighbor override-capability" commands. */
15048 install_element(BGP_NODE
, &neighbor_override_capability_cmd
);
15049 install_element(BGP_NODE
, &no_neighbor_override_capability_cmd
);
15051 /* "neighbor strict-capability-match" commands. */
15052 install_element(BGP_NODE
, &neighbor_strict_capability_cmd
);
15053 install_element(BGP_NODE
, &no_neighbor_strict_capability_cmd
);
15055 /* "neighbor timers" commands. */
15056 install_element(BGP_NODE
, &neighbor_timers_cmd
);
15057 install_element(BGP_NODE
, &no_neighbor_timers_cmd
);
15059 /* "neighbor timers connect" commands. */
15060 install_element(BGP_NODE
, &neighbor_timers_connect_cmd
);
15061 install_element(BGP_NODE
, &no_neighbor_timers_connect_cmd
);
15063 /* "neighbor advertisement-interval" commands. */
15064 install_element(BGP_NODE
, &neighbor_advertise_interval_cmd
);
15065 install_element(BGP_NODE
, &no_neighbor_advertise_interval_cmd
);
15067 /* "neighbor interface" commands. */
15068 install_element(BGP_NODE
, &neighbor_interface_cmd
);
15069 install_element(BGP_NODE
, &no_neighbor_interface_cmd
);
15071 /* "neighbor distribute" commands. */
15072 install_element(BGP_NODE
, &neighbor_distribute_list_hidden_cmd
);
15073 install_element(BGP_NODE
, &no_neighbor_distribute_list_hidden_cmd
);
15074 install_element(BGP_IPV4_NODE
, &neighbor_distribute_list_cmd
);
15075 install_element(BGP_IPV4_NODE
, &no_neighbor_distribute_list_cmd
);
15076 install_element(BGP_IPV4M_NODE
, &neighbor_distribute_list_cmd
);
15077 install_element(BGP_IPV4M_NODE
, &no_neighbor_distribute_list_cmd
);
15078 install_element(BGP_IPV4L_NODE
, &neighbor_distribute_list_cmd
);
15079 install_element(BGP_IPV4L_NODE
, &no_neighbor_distribute_list_cmd
);
15080 install_element(BGP_IPV6_NODE
, &neighbor_distribute_list_cmd
);
15081 install_element(BGP_IPV6_NODE
, &no_neighbor_distribute_list_cmd
);
15082 install_element(BGP_IPV6M_NODE
, &neighbor_distribute_list_cmd
);
15083 install_element(BGP_IPV6M_NODE
, &no_neighbor_distribute_list_cmd
);
15084 install_element(BGP_IPV6L_NODE
, &neighbor_distribute_list_cmd
);
15085 install_element(BGP_IPV6L_NODE
, &no_neighbor_distribute_list_cmd
);
15086 install_element(BGP_VPNV4_NODE
, &neighbor_distribute_list_cmd
);
15087 install_element(BGP_VPNV4_NODE
, &no_neighbor_distribute_list_cmd
);
15088 install_element(BGP_VPNV6_NODE
, &neighbor_distribute_list_cmd
);
15089 install_element(BGP_VPNV6_NODE
, &no_neighbor_distribute_list_cmd
);
15091 /* "neighbor prefix-list" commands. */
15092 install_element(BGP_NODE
, &neighbor_prefix_list_hidden_cmd
);
15093 install_element(BGP_NODE
, &no_neighbor_prefix_list_hidden_cmd
);
15094 install_element(BGP_IPV4_NODE
, &neighbor_prefix_list_cmd
);
15095 install_element(BGP_IPV4_NODE
, &no_neighbor_prefix_list_cmd
);
15096 install_element(BGP_IPV4M_NODE
, &neighbor_prefix_list_cmd
);
15097 install_element(BGP_IPV4M_NODE
, &no_neighbor_prefix_list_cmd
);
15098 install_element(BGP_IPV4L_NODE
, &neighbor_prefix_list_cmd
);
15099 install_element(BGP_IPV4L_NODE
, &no_neighbor_prefix_list_cmd
);
15100 install_element(BGP_IPV6_NODE
, &neighbor_prefix_list_cmd
);
15101 install_element(BGP_IPV6_NODE
, &no_neighbor_prefix_list_cmd
);
15102 install_element(BGP_IPV6M_NODE
, &neighbor_prefix_list_cmd
);
15103 install_element(BGP_IPV6M_NODE
, &no_neighbor_prefix_list_cmd
);
15104 install_element(BGP_IPV6L_NODE
, &neighbor_prefix_list_cmd
);
15105 install_element(BGP_IPV6L_NODE
, &no_neighbor_prefix_list_cmd
);
15106 install_element(BGP_VPNV4_NODE
, &neighbor_prefix_list_cmd
);
15107 install_element(BGP_VPNV4_NODE
, &no_neighbor_prefix_list_cmd
);
15108 install_element(BGP_VPNV6_NODE
, &neighbor_prefix_list_cmd
);
15109 install_element(BGP_VPNV6_NODE
, &no_neighbor_prefix_list_cmd
);
15110 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_prefix_list_cmd
);
15111 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_prefix_list_cmd
);
15112 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_prefix_list_cmd
);
15113 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_prefix_list_cmd
);
15115 /* "neighbor filter-list" commands. */
15116 install_element(BGP_NODE
, &neighbor_filter_list_hidden_cmd
);
15117 install_element(BGP_NODE
, &no_neighbor_filter_list_hidden_cmd
);
15118 install_element(BGP_IPV4_NODE
, &neighbor_filter_list_cmd
);
15119 install_element(BGP_IPV4_NODE
, &no_neighbor_filter_list_cmd
);
15120 install_element(BGP_IPV4M_NODE
, &neighbor_filter_list_cmd
);
15121 install_element(BGP_IPV4M_NODE
, &no_neighbor_filter_list_cmd
);
15122 install_element(BGP_IPV4L_NODE
, &neighbor_filter_list_cmd
);
15123 install_element(BGP_IPV4L_NODE
, &no_neighbor_filter_list_cmd
);
15124 install_element(BGP_IPV6_NODE
, &neighbor_filter_list_cmd
);
15125 install_element(BGP_IPV6_NODE
, &no_neighbor_filter_list_cmd
);
15126 install_element(BGP_IPV6M_NODE
, &neighbor_filter_list_cmd
);
15127 install_element(BGP_IPV6M_NODE
, &no_neighbor_filter_list_cmd
);
15128 install_element(BGP_IPV6L_NODE
, &neighbor_filter_list_cmd
);
15129 install_element(BGP_IPV6L_NODE
, &no_neighbor_filter_list_cmd
);
15130 install_element(BGP_VPNV4_NODE
, &neighbor_filter_list_cmd
);
15131 install_element(BGP_VPNV4_NODE
, &no_neighbor_filter_list_cmd
);
15132 install_element(BGP_VPNV6_NODE
, &neighbor_filter_list_cmd
);
15133 install_element(BGP_VPNV6_NODE
, &no_neighbor_filter_list_cmd
);
15134 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_filter_list_cmd
);
15135 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_filter_list_cmd
);
15136 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_filter_list_cmd
);
15137 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_filter_list_cmd
);
15139 /* "neighbor route-map" commands. */
15140 install_element(BGP_NODE
, &neighbor_route_map_hidden_cmd
);
15141 install_element(BGP_NODE
, &no_neighbor_route_map_hidden_cmd
);
15142 install_element(BGP_IPV4_NODE
, &neighbor_route_map_cmd
);
15143 install_element(BGP_IPV4_NODE
, &no_neighbor_route_map_cmd
);
15144 install_element(BGP_IPV4M_NODE
, &neighbor_route_map_cmd
);
15145 install_element(BGP_IPV4M_NODE
, &no_neighbor_route_map_cmd
);
15146 install_element(BGP_IPV4L_NODE
, &neighbor_route_map_cmd
);
15147 install_element(BGP_IPV4L_NODE
, &no_neighbor_route_map_cmd
);
15148 install_element(BGP_IPV6_NODE
, &neighbor_route_map_cmd
);
15149 install_element(BGP_IPV6_NODE
, &no_neighbor_route_map_cmd
);
15150 install_element(BGP_IPV6M_NODE
, &neighbor_route_map_cmd
);
15151 install_element(BGP_IPV6M_NODE
, &no_neighbor_route_map_cmd
);
15152 install_element(BGP_IPV6L_NODE
, &neighbor_route_map_cmd
);
15153 install_element(BGP_IPV6L_NODE
, &no_neighbor_route_map_cmd
);
15154 install_element(BGP_VPNV4_NODE
, &neighbor_route_map_cmd
);
15155 install_element(BGP_VPNV4_NODE
, &no_neighbor_route_map_cmd
);
15156 install_element(BGP_VPNV6_NODE
, &neighbor_route_map_cmd
);
15157 install_element(BGP_VPNV6_NODE
, &no_neighbor_route_map_cmd
);
15158 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_route_map_cmd
);
15159 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_route_map_cmd
);
15160 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_route_map_cmd
);
15161 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_route_map_cmd
);
15162 install_element(BGP_EVPN_NODE
, &neighbor_route_map_cmd
);
15163 install_element(BGP_EVPN_NODE
, &no_neighbor_route_map_cmd
);
15165 /* "neighbor unsuppress-map" commands. */
15166 install_element(BGP_NODE
, &neighbor_unsuppress_map_hidden_cmd
);
15167 install_element(BGP_NODE
, &no_neighbor_unsuppress_map_hidden_cmd
);
15168 install_element(BGP_IPV4_NODE
, &neighbor_unsuppress_map_cmd
);
15169 install_element(BGP_IPV4_NODE
, &no_neighbor_unsuppress_map_cmd
);
15170 install_element(BGP_IPV4M_NODE
, &neighbor_unsuppress_map_cmd
);
15171 install_element(BGP_IPV4M_NODE
, &no_neighbor_unsuppress_map_cmd
);
15172 install_element(BGP_IPV4L_NODE
, &neighbor_unsuppress_map_cmd
);
15173 install_element(BGP_IPV4L_NODE
, &no_neighbor_unsuppress_map_cmd
);
15174 install_element(BGP_IPV6_NODE
, &neighbor_unsuppress_map_cmd
);
15175 install_element(BGP_IPV6_NODE
, &no_neighbor_unsuppress_map_cmd
);
15176 install_element(BGP_IPV6M_NODE
, &neighbor_unsuppress_map_cmd
);
15177 install_element(BGP_IPV6M_NODE
, &no_neighbor_unsuppress_map_cmd
);
15178 install_element(BGP_IPV6L_NODE
, &neighbor_unsuppress_map_cmd
);
15179 install_element(BGP_IPV6L_NODE
, &no_neighbor_unsuppress_map_cmd
);
15180 install_element(BGP_VPNV4_NODE
, &neighbor_unsuppress_map_cmd
);
15181 install_element(BGP_VPNV4_NODE
, &no_neighbor_unsuppress_map_cmd
);
15182 install_element(BGP_VPNV6_NODE
, &neighbor_unsuppress_map_cmd
);
15183 install_element(BGP_VPNV6_NODE
, &no_neighbor_unsuppress_map_cmd
);
15185 /* neighbor maximum-prefix-out commands. */
15186 install_element(BGP_NODE
, &neighbor_maximum_prefix_out_cmd
);
15187 install_element(BGP_NODE
, &no_neighbor_maximum_prefix_out_cmd
);
15188 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_out_cmd
);
15189 install_element(BGP_IPV4_NODE
, &no_neighbor_maximum_prefix_out_cmd
);
15190 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_out_cmd
);
15191 install_element(BGP_IPV4M_NODE
, &no_neighbor_maximum_prefix_out_cmd
);
15192 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_out_cmd
);
15193 install_element(BGP_IPV4L_NODE
, &no_neighbor_maximum_prefix_out_cmd
);
15194 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_out_cmd
);
15195 install_element(BGP_IPV6_NODE
, &no_neighbor_maximum_prefix_out_cmd
);
15196 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_out_cmd
);
15197 install_element(BGP_IPV6M_NODE
, &no_neighbor_maximum_prefix_out_cmd
);
15198 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_out_cmd
);
15199 install_element(BGP_IPV6L_NODE
, &no_neighbor_maximum_prefix_out_cmd
);
15200 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_out_cmd
);
15201 install_element(BGP_VPNV4_NODE
, &no_neighbor_maximum_prefix_out_cmd
);
15202 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_out_cmd
);
15203 install_element(BGP_VPNV6_NODE
, &no_neighbor_maximum_prefix_out_cmd
);
15205 /* "neighbor maximum-prefix" commands. */
15206 install_element(BGP_NODE
, &neighbor_maximum_prefix_hidden_cmd
);
15207 install_element(BGP_NODE
,
15208 &neighbor_maximum_prefix_threshold_hidden_cmd
);
15209 install_element(BGP_NODE
, &neighbor_maximum_prefix_warning_hidden_cmd
);
15210 install_element(BGP_NODE
,
15211 &neighbor_maximum_prefix_threshold_warning_hidden_cmd
);
15212 install_element(BGP_NODE
, &neighbor_maximum_prefix_restart_hidden_cmd
);
15213 install_element(BGP_NODE
,
15214 &neighbor_maximum_prefix_threshold_restart_hidden_cmd
);
15215 install_element(BGP_NODE
, &no_neighbor_maximum_prefix_hidden_cmd
);
15216 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_cmd
);
15217 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
15218 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_warning_cmd
);
15219 install_element(BGP_IPV4_NODE
,
15220 &neighbor_maximum_prefix_threshold_warning_cmd
);
15221 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_restart_cmd
);
15222 install_element(BGP_IPV4_NODE
,
15223 &neighbor_maximum_prefix_threshold_restart_cmd
);
15224 install_element(BGP_IPV4_NODE
, &no_neighbor_maximum_prefix_cmd
);
15225 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_cmd
);
15226 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
15227 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_warning_cmd
);
15228 install_element(BGP_IPV4M_NODE
,
15229 &neighbor_maximum_prefix_threshold_warning_cmd
);
15230 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_restart_cmd
);
15231 install_element(BGP_IPV4M_NODE
,
15232 &neighbor_maximum_prefix_threshold_restart_cmd
);
15233 install_element(BGP_IPV4M_NODE
, &no_neighbor_maximum_prefix_cmd
);
15234 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_cmd
);
15235 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
15236 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_warning_cmd
);
15237 install_element(BGP_IPV4L_NODE
,
15238 &neighbor_maximum_prefix_threshold_warning_cmd
);
15239 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_restart_cmd
);
15240 install_element(BGP_IPV4L_NODE
,
15241 &neighbor_maximum_prefix_threshold_restart_cmd
);
15242 install_element(BGP_IPV4L_NODE
, &no_neighbor_maximum_prefix_cmd
);
15243 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_cmd
);
15244 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
15245 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_warning_cmd
);
15246 install_element(BGP_IPV6_NODE
,
15247 &neighbor_maximum_prefix_threshold_warning_cmd
);
15248 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_restart_cmd
);
15249 install_element(BGP_IPV6_NODE
,
15250 &neighbor_maximum_prefix_threshold_restart_cmd
);
15251 install_element(BGP_IPV6_NODE
, &no_neighbor_maximum_prefix_cmd
);
15252 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_cmd
);
15253 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
15254 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_warning_cmd
);
15255 install_element(BGP_IPV6M_NODE
,
15256 &neighbor_maximum_prefix_threshold_warning_cmd
);
15257 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_restart_cmd
);
15258 install_element(BGP_IPV6M_NODE
,
15259 &neighbor_maximum_prefix_threshold_restart_cmd
);
15260 install_element(BGP_IPV6M_NODE
, &no_neighbor_maximum_prefix_cmd
);
15261 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_cmd
);
15262 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
15263 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_warning_cmd
);
15264 install_element(BGP_IPV6L_NODE
,
15265 &neighbor_maximum_prefix_threshold_warning_cmd
);
15266 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_restart_cmd
);
15267 install_element(BGP_IPV6L_NODE
,
15268 &neighbor_maximum_prefix_threshold_restart_cmd
);
15269 install_element(BGP_IPV6L_NODE
, &no_neighbor_maximum_prefix_cmd
);
15270 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_cmd
);
15271 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
15272 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_warning_cmd
);
15273 install_element(BGP_VPNV4_NODE
,
15274 &neighbor_maximum_prefix_threshold_warning_cmd
);
15275 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_restart_cmd
);
15276 install_element(BGP_VPNV4_NODE
,
15277 &neighbor_maximum_prefix_threshold_restart_cmd
);
15278 install_element(BGP_VPNV4_NODE
, &no_neighbor_maximum_prefix_cmd
);
15279 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_cmd
);
15280 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
15281 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_warning_cmd
);
15282 install_element(BGP_VPNV6_NODE
,
15283 &neighbor_maximum_prefix_threshold_warning_cmd
);
15284 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_restart_cmd
);
15285 install_element(BGP_VPNV6_NODE
,
15286 &neighbor_maximum_prefix_threshold_restart_cmd
);
15287 install_element(BGP_VPNV6_NODE
, &no_neighbor_maximum_prefix_cmd
);
15289 /* "neighbor allowas-in" */
15290 install_element(BGP_NODE
, &neighbor_allowas_in_hidden_cmd
);
15291 install_element(BGP_NODE
, &no_neighbor_allowas_in_hidden_cmd
);
15292 install_element(BGP_IPV4_NODE
, &neighbor_allowas_in_cmd
);
15293 install_element(BGP_IPV4_NODE
, &no_neighbor_allowas_in_cmd
);
15294 install_element(BGP_IPV4M_NODE
, &neighbor_allowas_in_cmd
);
15295 install_element(BGP_IPV4M_NODE
, &no_neighbor_allowas_in_cmd
);
15296 install_element(BGP_IPV4L_NODE
, &neighbor_allowas_in_cmd
);
15297 install_element(BGP_IPV4L_NODE
, &no_neighbor_allowas_in_cmd
);
15298 install_element(BGP_IPV6_NODE
, &neighbor_allowas_in_cmd
);
15299 install_element(BGP_IPV6_NODE
, &no_neighbor_allowas_in_cmd
);
15300 install_element(BGP_IPV6M_NODE
, &neighbor_allowas_in_cmd
);
15301 install_element(BGP_IPV6M_NODE
, &no_neighbor_allowas_in_cmd
);
15302 install_element(BGP_IPV6L_NODE
, &neighbor_allowas_in_cmd
);
15303 install_element(BGP_IPV6L_NODE
, &no_neighbor_allowas_in_cmd
);
15304 install_element(BGP_VPNV4_NODE
, &neighbor_allowas_in_cmd
);
15305 install_element(BGP_VPNV4_NODE
, &no_neighbor_allowas_in_cmd
);
15306 install_element(BGP_VPNV6_NODE
, &neighbor_allowas_in_cmd
);
15307 install_element(BGP_VPNV6_NODE
, &no_neighbor_allowas_in_cmd
);
15308 install_element(BGP_EVPN_NODE
, &neighbor_allowas_in_cmd
);
15309 install_element(BGP_EVPN_NODE
, &no_neighbor_allowas_in_cmd
);
15311 /* address-family commands. */
15312 install_element(BGP_NODE
, &address_family_ipv4_safi_cmd
);
15313 install_element(BGP_NODE
, &address_family_ipv6_safi_cmd
);
15314 #ifdef KEEP_OLD_VPN_COMMANDS
15315 install_element(BGP_NODE
, &address_family_vpnv4_cmd
);
15316 install_element(BGP_NODE
, &address_family_vpnv6_cmd
);
15317 #endif /* KEEP_OLD_VPN_COMMANDS */
15319 install_element(BGP_NODE
, &address_family_evpn_cmd
);
15321 /* "exit-address-family" command. */
15322 install_element(BGP_IPV4_NODE
, &exit_address_family_cmd
);
15323 install_element(BGP_IPV4M_NODE
, &exit_address_family_cmd
);
15324 install_element(BGP_IPV4L_NODE
, &exit_address_family_cmd
);
15325 install_element(BGP_IPV6_NODE
, &exit_address_family_cmd
);
15326 install_element(BGP_IPV6M_NODE
, &exit_address_family_cmd
);
15327 install_element(BGP_IPV6L_NODE
, &exit_address_family_cmd
);
15328 install_element(BGP_VPNV4_NODE
, &exit_address_family_cmd
);
15329 install_element(BGP_VPNV6_NODE
, &exit_address_family_cmd
);
15330 install_element(BGP_FLOWSPECV4_NODE
, &exit_address_family_cmd
);
15331 install_element(BGP_FLOWSPECV6_NODE
, &exit_address_family_cmd
);
15332 install_element(BGP_EVPN_NODE
, &exit_address_family_cmd
);
15334 /* "clear ip bgp commands" */
15335 install_element(ENABLE_NODE
, &clear_ip_bgp_all_cmd
);
15337 /* clear ip bgp prefix */
15338 install_element(ENABLE_NODE
, &clear_ip_bgp_prefix_cmd
);
15339 install_element(ENABLE_NODE
, &clear_bgp_ipv6_safi_prefix_cmd
);
15340 install_element(ENABLE_NODE
, &clear_bgp_instance_ipv6_safi_prefix_cmd
);
15342 /* "show [ip] bgp summary" commands. */
15343 install_element(VIEW_NODE
, &show_bgp_instance_all_ipv6_updgrps_cmd
);
15344 install_element(VIEW_NODE
, &show_bgp_l2vpn_evpn_updgrps_cmd
);
15345 install_element(VIEW_NODE
, &show_bgp_instance_updgrps_stats_cmd
);
15346 install_element(VIEW_NODE
, &show_bgp_updgrps_stats_cmd
);
15347 install_element(VIEW_NODE
, &show_ip_bgp_instance_updgrps_adj_s_cmd
);
15348 install_element(VIEW_NODE
, &show_ip_bgp_summary_cmd
);
15349 install_element(VIEW_NODE
, &show_ip_bgp_updgrps_cmd
);
15351 /* "show [ip] bgp neighbors" commands. */
15352 install_element(VIEW_NODE
, &show_ip_bgp_neighbors_cmd
);
15354 /* "show [ip] bgp peer-group" commands. */
15355 install_element(VIEW_NODE
, &show_ip_bgp_peer_groups_cmd
);
15357 /* "show [ip] bgp paths" commands. */
15358 install_element(VIEW_NODE
, &show_ip_bgp_paths_cmd
);
15360 /* "show [ip] bgp community" commands. */
15361 install_element(VIEW_NODE
, &show_ip_bgp_community_info_cmd
);
15363 /* "show ip bgp large-community" commands. */
15364 install_element(VIEW_NODE
, &show_ip_bgp_lcommunity_info_cmd
);
15365 /* "show [ip] bgp attribute-info" commands. */
15366 install_element(VIEW_NODE
, &show_ip_bgp_attr_info_cmd
);
15367 /* "show [ip] bgp route-leak" command */
15368 install_element(VIEW_NODE
, &show_ip_bgp_route_leak_cmd
);
15370 /* "redistribute" commands. */
15371 install_element(BGP_NODE
, &bgp_redistribute_ipv4_hidden_cmd
);
15372 install_element(BGP_NODE
, &no_bgp_redistribute_ipv4_hidden_cmd
);
15373 install_element(BGP_NODE
, &bgp_redistribute_ipv4_rmap_hidden_cmd
);
15374 install_element(BGP_NODE
, &bgp_redistribute_ipv4_metric_hidden_cmd
);
15375 install_element(BGP_NODE
,
15376 &bgp_redistribute_ipv4_rmap_metric_hidden_cmd
);
15377 install_element(BGP_NODE
,
15378 &bgp_redistribute_ipv4_metric_rmap_hidden_cmd
);
15379 install_element(BGP_NODE
, &bgp_redistribute_ipv4_ospf_hidden_cmd
);
15380 install_element(BGP_NODE
, &no_bgp_redistribute_ipv4_ospf_hidden_cmd
);
15381 install_element(BGP_NODE
, &bgp_redistribute_ipv4_ospf_rmap_hidden_cmd
);
15382 install_element(BGP_NODE
,
15383 &bgp_redistribute_ipv4_ospf_metric_hidden_cmd
);
15384 install_element(BGP_NODE
,
15385 &bgp_redistribute_ipv4_ospf_rmap_metric_hidden_cmd
);
15386 install_element(BGP_NODE
,
15387 &bgp_redistribute_ipv4_ospf_metric_rmap_hidden_cmd
);
15388 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_cmd
);
15389 install_element(BGP_IPV4_NODE
, &no_bgp_redistribute_ipv4_cmd
);
15390 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_rmap_cmd
);
15391 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_metric_cmd
);
15392 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_rmap_metric_cmd
);
15393 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_metric_rmap_cmd
);
15394 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_ospf_cmd
);
15395 install_element(BGP_IPV4_NODE
, &no_bgp_redistribute_ipv4_ospf_cmd
);
15396 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_ospf_rmap_cmd
);
15397 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_ospf_metric_cmd
);
15398 install_element(BGP_IPV4_NODE
,
15399 &bgp_redistribute_ipv4_ospf_rmap_metric_cmd
);
15400 install_element(BGP_IPV4_NODE
,
15401 &bgp_redistribute_ipv4_ospf_metric_rmap_cmd
);
15402 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_cmd
);
15403 install_element(BGP_IPV6_NODE
, &no_bgp_redistribute_ipv6_cmd
);
15404 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_rmap_cmd
);
15405 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_metric_cmd
);
15406 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_rmap_metric_cmd
);
15407 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_metric_rmap_cmd
);
15409 /* import|export vpn [route-map WORD] */
15410 install_element(BGP_IPV4_NODE
, &bgp_imexport_vpn_cmd
);
15411 install_element(BGP_IPV6_NODE
, &bgp_imexport_vpn_cmd
);
15413 install_element(BGP_IPV4_NODE
, &bgp_imexport_vrf_cmd
);
15414 install_element(BGP_IPV6_NODE
, &bgp_imexport_vrf_cmd
);
15416 /* ttl_security commands */
15417 install_element(BGP_NODE
, &neighbor_ttl_security_cmd
);
15418 install_element(BGP_NODE
, &no_neighbor_ttl_security_cmd
);
15420 /* "show [ip] bgp memory" commands. */
15421 install_element(VIEW_NODE
, &show_bgp_memory_cmd
);
15423 /* "show bgp martian next-hop" */
15424 install_element(VIEW_NODE
, &show_bgp_martian_nexthop_db_cmd
);
15426 install_element(VIEW_NODE
, &show_bgp_mac_hash_cmd
);
15428 /* "show [ip] bgp views" commands. */
15429 install_element(VIEW_NODE
, &show_bgp_views_cmd
);
15431 /* "show [ip] bgp vrfs" commands. */
15432 install_element(VIEW_NODE
, &show_bgp_vrfs_cmd
);
15434 /* Community-list. */
15435 community_list_vty();
15437 /* vpn-policy commands */
15438 install_element(BGP_IPV4_NODE
, &af_rd_vpn_export_cmd
);
15439 install_element(BGP_IPV6_NODE
, &af_rd_vpn_export_cmd
);
15440 install_element(BGP_IPV4_NODE
, &af_label_vpn_export_cmd
);
15441 install_element(BGP_IPV6_NODE
, &af_label_vpn_export_cmd
);
15442 install_element(BGP_IPV4_NODE
, &af_nexthop_vpn_export_cmd
);
15443 install_element(BGP_IPV6_NODE
, &af_nexthop_vpn_export_cmd
);
15444 install_element(BGP_IPV4_NODE
, &af_rt_vpn_imexport_cmd
);
15445 install_element(BGP_IPV6_NODE
, &af_rt_vpn_imexport_cmd
);
15446 install_element(BGP_IPV4_NODE
, &af_route_map_vpn_imexport_cmd
);
15447 install_element(BGP_IPV6_NODE
, &af_route_map_vpn_imexport_cmd
);
15448 install_element(BGP_IPV4_NODE
, &af_import_vrf_route_map_cmd
);
15449 install_element(BGP_IPV6_NODE
, &af_import_vrf_route_map_cmd
);
15451 install_element(BGP_IPV4_NODE
, &af_routetarget_import_cmd
);
15452 install_element(BGP_IPV6_NODE
, &af_routetarget_import_cmd
);
15454 install_element(BGP_IPV4_NODE
, &af_no_rd_vpn_export_cmd
);
15455 install_element(BGP_IPV6_NODE
, &af_no_rd_vpn_export_cmd
);
15456 install_element(BGP_IPV4_NODE
, &af_no_label_vpn_export_cmd
);
15457 install_element(BGP_IPV6_NODE
, &af_no_label_vpn_export_cmd
);
15458 install_element(BGP_IPV4_NODE
, &af_no_nexthop_vpn_export_cmd
);
15459 install_element(BGP_IPV6_NODE
, &af_no_nexthop_vpn_export_cmd
);
15460 install_element(BGP_IPV4_NODE
, &af_no_rt_vpn_imexport_cmd
);
15461 install_element(BGP_IPV6_NODE
, &af_no_rt_vpn_imexport_cmd
);
15462 install_element(BGP_IPV4_NODE
, &af_no_route_map_vpn_imexport_cmd
);
15463 install_element(BGP_IPV6_NODE
, &af_no_route_map_vpn_imexport_cmd
);
15464 install_element(BGP_IPV4_NODE
, &af_no_import_vrf_route_map_cmd
);
15465 install_element(BGP_IPV6_NODE
, &af_no_import_vrf_route_map_cmd
);
15468 #include "memory.h"
15469 #include "bgp_regex.h"
15470 #include "bgp_clist.h"
15471 #include "bgp_ecommunity.h"
15473 /* VTY functions. */
15475 /* Direction value to string conversion. */
15476 static const char *community_direct_str(int direct
)
15479 case COMMUNITY_DENY
:
15481 case COMMUNITY_PERMIT
:
15488 /* Display error string. */
15489 static void community_list_perror(struct vty
*vty
, int ret
)
15492 case COMMUNITY_LIST_ERR_CANT_FIND_LIST
:
15493 vty_out(vty
, "%% Can't find community-list\n");
15495 case COMMUNITY_LIST_ERR_MALFORMED_VAL
:
15496 vty_out(vty
, "%% Malformed community-list value\n");
15498 case COMMUNITY_LIST_ERR_STANDARD_CONFLICT
:
15500 "%% Community name conflict, previously defined as standard community\n");
15502 case COMMUNITY_LIST_ERR_EXPANDED_CONFLICT
:
15504 "%% Community name conflict, previously defined as expanded community\n");
15509 /* "community-list" keyword help string. */
15510 #define COMMUNITY_LIST_STR "Add a community list entry\n"
15512 /*community-list standard */
15513 DEFUN (community_list_standard
,
15514 bgp_community_list_standard_cmd
,
15515 "bgp community-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
15518 "Community list number (standard)\n"
15519 "Add an standard community-list entry\n"
15520 "Community list name\n"
15521 "Specify community to reject\n"
15522 "Specify community to accept\n"
15525 char *cl_name_or_number
= NULL
;
15527 int style
= COMMUNITY_LIST_STANDARD
;
15530 argv_find(argv
, argc
, "(1-99)", &idx
);
15531 argv_find(argv
, argc
, "WORD", &idx
);
15532 cl_name_or_number
= argv
[idx
]->arg
;
15533 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
15535 argv_find(argv
, argc
, "AA:NN", &idx
);
15536 char *str
= argv_concat(argv
, argc
, idx
);
15538 int ret
= community_list_set(bgp_clist
, cl_name_or_number
, str
, direct
,
15541 XFREE(MTYPE_TMP
, str
);
15544 /* Display error string. */
15545 community_list_perror(vty
, ret
);
15546 return CMD_WARNING_CONFIG_FAILED
;
15549 return CMD_SUCCESS
;
15552 DEFUN (no_community_list_standard_all
,
15553 no_bgp_community_list_standard_all_cmd
,
15554 "no bgp community-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
15558 "Community list number (standard)\n"
15559 "Add an standard community-list entry\n"
15560 "Community list name\n"
15561 "Specify community to reject\n"
15562 "Specify community to accept\n"
15565 char *cl_name_or_number
= NULL
;
15568 int style
= COMMUNITY_LIST_STANDARD
;
15572 argv_find(argv
, argc
, "permit", &idx
);
15573 argv_find(argv
, argc
, "deny", &idx
);
15576 direct
= argv_find(argv
, argc
, "permit", &idx
)
15581 argv_find(argv
, argc
, "AA:NN", &idx
);
15582 str
= argv_concat(argv
, argc
, idx
);
15586 argv_find(argv
, argc
, "(1-99)", &idx
);
15587 argv_find(argv
, argc
, "WORD", &idx
);
15588 cl_name_or_number
= argv
[idx
]->arg
;
15590 int ret
= community_list_unset(bgp_clist
, cl_name_or_number
, str
,
15593 XFREE(MTYPE_TMP
, str
);
15596 community_list_perror(vty
, ret
);
15597 return CMD_WARNING_CONFIG_FAILED
;
15600 return CMD_SUCCESS
;
15603 ALIAS(no_community_list_standard_all
, no_bgp_community_list_standard_all_list_cmd
,
15604 "no bgp community-list <(1-99)|standard WORD>",
15605 NO_STR BGP_STR COMMUNITY_LIST_STR
15606 "Community list number (standard)\n"
15607 "Add an standard community-list entry\n"
15608 "Community list name\n")
15610 /*community-list expanded */
15611 DEFUN (community_list_expanded_all
,
15612 bgp_community_list_expanded_all_cmd
,
15613 "bgp community-list <(100-500)|expanded WORD> <deny|permit> AA:NN...",
15616 "Community list number (expanded)\n"
15617 "Add an expanded community-list entry\n"
15618 "Community list name\n"
15619 "Specify community to reject\n"
15620 "Specify community to accept\n"
15623 char *cl_name_or_number
= NULL
;
15625 int style
= COMMUNITY_LIST_EXPANDED
;
15629 argv_find(argv
, argc
, "(100-500)", &idx
);
15630 argv_find(argv
, argc
, "WORD", &idx
);
15631 cl_name_or_number
= argv
[idx
]->arg
;
15632 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
15634 argv_find(argv
, argc
, "AA:NN", &idx
);
15635 char *str
= argv_concat(argv
, argc
, idx
);
15637 int ret
= community_list_set(bgp_clist
, cl_name_or_number
, str
, direct
,
15640 XFREE(MTYPE_TMP
, str
);
15643 /* Display error string. */
15644 community_list_perror(vty
, ret
);
15645 return CMD_WARNING_CONFIG_FAILED
;
15648 return CMD_SUCCESS
;
15651 DEFUN (no_community_list_expanded_all
,
15652 no_bgp_community_list_expanded_all_cmd
,
15653 "no bgp community-list <(100-500)|expanded WORD> <deny|permit> AA:NN...",
15657 "Community list number (expanded)\n"
15658 "Add an expanded community-list entry\n"
15659 "Community list name\n"
15660 "Specify community to reject\n"
15661 "Specify community to accept\n"
15664 char *cl_name_or_number
= NULL
;
15667 int style
= COMMUNITY_LIST_EXPANDED
;
15671 argv_find(argv
, argc
, "permit", &idx
);
15672 argv_find(argv
, argc
, "deny", &idx
);
15675 direct
= argv_find(argv
, argc
, "permit", &idx
)
15680 argv_find(argv
, argc
, "AA:NN", &idx
);
15681 str
= argv_concat(argv
, argc
, idx
);
15685 argv_find(argv
, argc
, "(100-500)", &idx
);
15686 argv_find(argv
, argc
, "WORD", &idx
);
15687 cl_name_or_number
= argv
[idx
]->arg
;
15689 int ret
= community_list_unset(bgp_clist
, cl_name_or_number
, str
,
15692 XFREE(MTYPE_TMP
, str
);
15695 community_list_perror(vty
, ret
);
15696 return CMD_WARNING_CONFIG_FAILED
;
15699 return CMD_SUCCESS
;
15702 ALIAS(no_community_list_expanded_all
, no_bgp_community_list_expanded_all_list_cmd
,
15703 "no bgp community-list <(100-500)|expanded WORD>",
15704 NO_STR IP_STR COMMUNITY_LIST_STR
15705 "Community list number (expanded)\n"
15706 "Add an expanded community-list entry\n"
15707 "Community list name\n")
15709 /* Return configuration string of community-list entry. */
15710 static const char *community_list_config_str(struct community_entry
*entry
)
15717 if (entry
->style
== COMMUNITY_LIST_STANDARD
)
15718 str
= community_str(entry
->u
.com
, false);
15719 else if (entry
->style
== LARGE_COMMUNITY_LIST_STANDARD
)
15720 str
= lcommunity_str(entry
->u
.lcom
, false);
15722 str
= entry
->config
;
15727 static void community_list_show(struct vty
*vty
, struct community_list
*list
)
15729 struct community_entry
*entry
;
15731 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
15732 if (entry
== list
->head
) {
15733 if (all_digit(list
->name
))
15734 vty_out(vty
, "Community %s list %s\n",
15735 entry
->style
== COMMUNITY_LIST_STANDARD
15737 : "(expanded) access",
15740 vty_out(vty
, "Named Community %s list %s\n",
15741 entry
->style
== COMMUNITY_LIST_STANDARD
15747 vty_out(vty
, " %s\n",
15748 community_direct_str(entry
->direct
));
15750 vty_out(vty
, " %s %s\n",
15751 community_direct_str(entry
->direct
),
15752 community_list_config_str(entry
));
15756 DEFUN (show_community_list
,
15757 show_bgp_community_list_cmd
,
15758 "show bgp community-list",
15761 "List community-list\n")
15763 struct community_list
*list
;
15764 struct community_list_master
*cm
;
15766 cm
= community_list_master_lookup(bgp_clist
, COMMUNITY_LIST_MASTER
);
15768 return CMD_SUCCESS
;
15770 for (list
= cm
->num
.head
; list
; list
= list
->next
)
15771 community_list_show(vty
, list
);
15773 for (list
= cm
->str
.head
; list
; list
= list
->next
)
15774 community_list_show(vty
, list
);
15776 return CMD_SUCCESS
;
15779 DEFUN (show_community_list_arg
,
15780 show_bgp_community_list_arg_cmd
,
15781 "show bgp community-list <(1-500)|WORD> detail",
15784 "List community-list\n"
15785 "Community-list number\n"
15786 "Community-list name\n"
15787 "Detailed information on community-list\n")
15789 int idx_comm_list
= 3;
15790 struct community_list
*list
;
15792 list
= community_list_lookup(bgp_clist
, argv
[idx_comm_list
]->arg
, 0,
15793 COMMUNITY_LIST_MASTER
);
15795 vty_out(vty
, "%% Can't find community-list\n");
15796 return CMD_WARNING
;
15799 community_list_show(vty
, list
);
15801 return CMD_SUCCESS
;
15805 * Large Community code.
15807 static int lcommunity_list_set_vty(struct vty
*vty
, int argc
,
15808 struct cmd_token
**argv
, int style
,
15809 int reject_all_digit_name
)
15817 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
15820 /* All digit name check. */
15822 argv_find(argv
, argc
, "WORD", &idx
);
15823 argv_find(argv
, argc
, "(1-99)", &idx
);
15824 argv_find(argv
, argc
, "(100-500)", &idx
);
15825 cl_name
= argv
[idx
]->arg
;
15826 if (reject_all_digit_name
&& all_digit(cl_name
)) {
15827 vty_out(vty
, "%% Community name cannot have all digits\n");
15828 return CMD_WARNING_CONFIG_FAILED
;
15832 argv_find(argv
, argc
, "AA:BB:CC", &idx
);
15833 argv_find(argv
, argc
, "LINE", &idx
);
15834 /* Concat community string argument. */
15836 str
= argv_concat(argv
, argc
, idx
);
15840 ret
= lcommunity_list_set(bgp_clist
, cl_name
, str
, direct
, style
);
15842 /* Free temporary community list string allocated by
15844 XFREE(MTYPE_TMP
, str
);
15847 community_list_perror(vty
, ret
);
15848 return CMD_WARNING_CONFIG_FAILED
;
15850 return CMD_SUCCESS
;
15853 static int lcommunity_list_unset_vty(struct vty
*vty
, int argc
,
15854 struct cmd_token
**argv
, int style
)
15861 argv_find(argv
, argc
, "permit", &idx
);
15862 argv_find(argv
, argc
, "deny", &idx
);
15865 /* Check the list direct. */
15866 if (strncmp(argv
[idx
]->arg
, "p", 1) == 0)
15867 direct
= COMMUNITY_PERMIT
;
15869 direct
= COMMUNITY_DENY
;
15872 argv_find(argv
, argc
, "LINE", &idx
);
15873 argv_find(argv
, argc
, "AA:AA:NN", &idx
);
15874 /* Concat community string argument. */
15875 str
= argv_concat(argv
, argc
, idx
);
15879 argv_find(argv
, argc
, "(1-99)", &idx
);
15880 argv_find(argv
, argc
, "(100-500)", &idx
);
15881 argv_find(argv
, argc
, "WORD", &idx
);
15883 /* Unset community list. */
15884 ret
= lcommunity_list_unset(bgp_clist
, argv
[idx
]->arg
, str
, direct
,
15887 /* Free temporary community list string allocated by
15889 XFREE(MTYPE_TMP
, str
);
15892 community_list_perror(vty
, ret
);
15893 return CMD_WARNING_CONFIG_FAILED
;
15896 return CMD_SUCCESS
;
15899 /* "large-community-list" keyword help string. */
15900 #define LCOMMUNITY_LIST_STR "Add a large community list entry\n"
15901 #define LCOMMUNITY_VAL_STR "large community in 'aa:bb:cc' format\n"
15903 DEFUN (lcommunity_list_standard
,
15904 bgp_lcommunity_list_standard_cmd
,
15905 "bgp large-community-list (1-99) <deny|permit> AA:BB:CC...",
15907 LCOMMUNITY_LIST_STR
15908 "Large Community list number (standard)\n"
15909 "Specify large community to reject\n"
15910 "Specify large community to accept\n"
15911 LCOMMUNITY_VAL_STR
)
15913 return lcommunity_list_set_vty(vty
, argc
, argv
,
15914 LARGE_COMMUNITY_LIST_STANDARD
, 0);
15917 DEFUN (lcommunity_list_expanded
,
15918 bgp_lcommunity_list_expanded_cmd
,
15919 "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_set_vty(vty
, argc
, argv
,
15928 LARGE_COMMUNITY_LIST_EXPANDED
, 0);
15931 DEFUN (lcommunity_list_name_standard
,
15932 bgp_lcommunity_list_name_standard_cmd
,
15933 "bgp large-community-list standard WORD <deny|permit> AA:BB:CC...",
15935 LCOMMUNITY_LIST_STR
15936 "Specify standard large-community-list\n"
15937 "Large Community list name\n"
15938 "Specify large community to reject\n"
15939 "Specify large community to accept\n"
15940 LCOMMUNITY_VAL_STR
)
15942 return lcommunity_list_set_vty(vty
, argc
, argv
,
15943 LARGE_COMMUNITY_LIST_STANDARD
, 1);
15946 DEFUN (lcommunity_list_name_expanded
,
15947 bgp_lcommunity_list_name_expanded_cmd
,
15948 "bgp large-community-list expanded WORD <deny|permit> LINE...",
15950 LCOMMUNITY_LIST_STR
15951 "Specify expanded large-community-list\n"
15952 "Large Community list name\n"
15953 "Specify large community to reject\n"
15954 "Specify large community to accept\n"
15955 "An ordered list as a regular-expression\n")
15957 return lcommunity_list_set_vty(vty
, argc
, argv
,
15958 LARGE_COMMUNITY_LIST_EXPANDED
, 1);
15961 DEFUN (no_lcommunity_list_standard_all
,
15962 no_bgp_lcommunity_list_standard_all_cmd
,
15963 "no bgp large-community-list <(1-99)|(100-500)|WORD>",
15966 LCOMMUNITY_LIST_STR
15967 "Large Community list number (standard)\n"
15968 "Large Community list number (expanded)\n"
15969 "Large Community list name\n")
15971 return lcommunity_list_unset_vty(vty
, argc
, argv
,
15972 LARGE_COMMUNITY_LIST_STANDARD
);
15975 DEFUN (no_lcommunity_list_name_expanded_all
,
15976 no_bgp_lcommunity_list_name_expanded_all_cmd
,
15977 "no bgp large-community-list expanded WORD",
15980 LCOMMUNITY_LIST_STR
15981 "Specify expanded large-community-list\n"
15982 "Large Community list name\n")
15984 return lcommunity_list_unset_vty(vty
, argc
, argv
,
15985 LARGE_COMMUNITY_LIST_EXPANDED
);
15988 DEFUN (no_lcommunity_list_standard
,
15989 no_bgp_lcommunity_list_standard_cmd
,
15990 "no bgp large-community-list (1-99) <deny|permit> AA:AA:NN...",
15993 LCOMMUNITY_LIST_STR
15994 "Large Community list number (standard)\n"
15995 "Specify large community to reject\n"
15996 "Specify large community to accept\n"
15997 LCOMMUNITY_VAL_STR
)
15999 return lcommunity_list_unset_vty(vty
, argc
, argv
,
16000 LARGE_COMMUNITY_LIST_STANDARD
);
16003 DEFUN (no_lcommunity_list_expanded
,
16004 no_bgp_lcommunity_list_expanded_cmd
,
16005 "no bgp large-community-list (100-500) <deny|permit> LINE...",
16008 LCOMMUNITY_LIST_STR
16009 "Large Community list number (expanded)\n"
16010 "Specify large community to reject\n"
16011 "Specify large community to accept\n"
16012 "An ordered list as a regular-expression\n")
16014 return lcommunity_list_unset_vty(vty
, argc
, argv
,
16015 LARGE_COMMUNITY_LIST_EXPANDED
);
16018 DEFUN (no_lcommunity_list_name_standard
,
16019 no_bgp_lcommunity_list_name_standard_cmd
,
16020 "no bgp large-community-list standard WORD <deny|permit> AA:AA:NN...",
16023 LCOMMUNITY_LIST_STR
16024 "Specify standard large-community-list\n"
16025 "Large Community list name\n"
16026 "Specify large community to reject\n"
16027 "Specify large community to accept\n"
16028 LCOMMUNITY_VAL_STR
)
16030 return lcommunity_list_unset_vty(vty
, argc
, argv
,
16031 LARGE_COMMUNITY_LIST_STANDARD
);
16034 DEFUN (no_lcommunity_list_name_expanded
,
16035 no_bgp_lcommunity_list_name_expanded_cmd
,
16036 "no bgp large-community-list expanded WORD <deny|permit> LINE...",
16039 LCOMMUNITY_LIST_STR
16040 "Specify expanded large-community-list\n"
16041 "Large community list name\n"
16042 "Specify large community to reject\n"
16043 "Specify large community to accept\n"
16044 "An ordered list as a regular-expression\n")
16046 return lcommunity_list_unset_vty(vty
, argc
, argv
,
16047 LARGE_COMMUNITY_LIST_EXPANDED
);
16050 static void lcommunity_list_show(struct vty
*vty
, struct community_list
*list
)
16052 struct community_entry
*entry
;
16054 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
16055 if (entry
== list
->head
) {
16056 if (all_digit(list
->name
))
16057 vty_out(vty
, "Large community %s list %s\n",
16059 LARGE_COMMUNITY_LIST_STANDARD
16061 : "(expanded) access",
16065 "Named large community %s list %s\n",
16067 LARGE_COMMUNITY_LIST_STANDARD
16073 vty_out(vty
, " %s\n",
16074 community_direct_str(entry
->direct
));
16076 vty_out(vty
, " %s %s\n",
16077 community_direct_str(entry
->direct
),
16078 community_list_config_str(entry
));
16082 DEFUN (show_lcommunity_list
,
16083 show_bgp_lcommunity_list_cmd
,
16084 "show bgp large-community-list",
16087 "List large-community list\n")
16089 struct community_list
*list
;
16090 struct community_list_master
*cm
;
16092 cm
= community_list_master_lookup(bgp_clist
,
16093 LARGE_COMMUNITY_LIST_MASTER
);
16095 return CMD_SUCCESS
;
16097 for (list
= cm
->num
.head
; list
; list
= list
->next
)
16098 lcommunity_list_show(vty
, list
);
16100 for (list
= cm
->str
.head
; list
; list
= list
->next
)
16101 lcommunity_list_show(vty
, list
);
16103 return CMD_SUCCESS
;
16106 DEFUN (show_lcommunity_list_arg
,
16107 show_bgp_lcommunity_list_arg_cmd
,
16108 "show bgp large-community-list <(1-500)|WORD> detail",
16111 "List large-community list\n"
16112 "Large-community-list number\n"
16113 "Large-community-list name\n"
16114 "Detailed information on large-community-list\n")
16116 struct community_list
*list
;
16118 list
= community_list_lookup(bgp_clist
, argv
[3]->arg
, 0,
16119 LARGE_COMMUNITY_LIST_MASTER
);
16121 vty_out(vty
, "%% Can't find large-community-list\n");
16122 return CMD_WARNING
;
16125 lcommunity_list_show(vty
, list
);
16127 return CMD_SUCCESS
;
16130 /* "extcommunity-list" keyword help string. */
16131 #define EXTCOMMUNITY_LIST_STR "Add a extended community list entry\n"
16132 #define EXTCOMMUNITY_VAL_STR "Extended community attribute in 'rt aa:nn_or_IPaddr:nn' OR 'soo aa:nn_or_IPaddr:nn' format\n"
16134 DEFUN (extcommunity_list_standard
,
16135 bgp_extcommunity_list_standard_cmd
,
16136 "bgp extcommunity-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
16138 EXTCOMMUNITY_LIST_STR
16139 "Extended Community list number (standard)\n"
16140 "Specify standard extcommunity-list\n"
16141 "Community list name\n"
16142 "Specify community to reject\n"
16143 "Specify community to accept\n"
16144 EXTCOMMUNITY_VAL_STR
)
16146 int style
= EXTCOMMUNITY_LIST_STANDARD
;
16148 char *cl_number_or_name
= NULL
;
16152 argv_find(argv
, argc
, "(1-99)", &idx
);
16153 argv_find(argv
, argc
, "WORD", &idx
);
16154 cl_number_or_name
= argv
[idx
]->arg
;
16155 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
16157 argv_find(argv
, argc
, "AA:NN", &idx
);
16158 char *str
= argv_concat(argv
, argc
, idx
);
16160 int ret
= extcommunity_list_set(bgp_clist
, cl_number_or_name
, str
,
16163 XFREE(MTYPE_TMP
, str
);
16166 community_list_perror(vty
, ret
);
16167 return CMD_WARNING_CONFIG_FAILED
;
16170 return CMD_SUCCESS
;
16173 DEFUN (extcommunity_list_name_expanded
,
16174 bgp_extcommunity_list_name_expanded_cmd
,
16175 "bgp extcommunity-list <(100-500)|expanded WORD> <deny|permit> LINE...",
16177 EXTCOMMUNITY_LIST_STR
16178 "Extended Community list number (expanded)\n"
16179 "Specify expanded extcommunity-list\n"
16180 "Extended Community list name\n"
16181 "Specify community to reject\n"
16182 "Specify community to accept\n"
16183 "An ordered list as a regular-expression\n")
16185 int style
= EXTCOMMUNITY_LIST_EXPANDED
;
16187 char *cl_number_or_name
= NULL
;
16190 argv_find(argv
, argc
, "(100-500)", &idx
);
16191 argv_find(argv
, argc
, "WORD", &idx
);
16192 cl_number_or_name
= argv
[idx
]->arg
;
16193 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
16195 argv_find(argv
, argc
, "LINE", &idx
);
16196 char *str
= argv_concat(argv
, argc
, idx
);
16198 int ret
= extcommunity_list_set(bgp_clist
, cl_number_or_name
, str
,
16201 XFREE(MTYPE_TMP
, str
);
16204 community_list_perror(vty
, ret
);
16205 return CMD_WARNING_CONFIG_FAILED
;
16208 return CMD_SUCCESS
;
16211 DEFUN (no_extcommunity_list_standard_all
,
16212 no_bgp_extcommunity_list_standard_all_cmd
,
16213 "no bgp extcommunity-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
16216 EXTCOMMUNITY_LIST_STR
16217 "Extended Community list number (standard)\n"
16218 "Specify standard extcommunity-list\n"
16219 "Community list name\n"
16220 "Specify community to reject\n"
16221 "Specify community to accept\n"
16222 EXTCOMMUNITY_VAL_STR
)
16224 int style
= EXTCOMMUNITY_LIST_STANDARD
;
16226 char *cl_number_or_name
= NULL
;
16230 argv_find(argv
, argc
, "permit", &idx
);
16231 argv_find(argv
, argc
, "deny", &idx
);
16234 direct
= argv_find(argv
, argc
, "permit", &idx
)
16239 argv_find(argv
, argc
, "AA:NN", &idx
);
16240 str
= argv_concat(argv
, argc
, idx
);
16244 argv_find(argv
, argc
, "(1-99)", &idx
);
16245 argv_find(argv
, argc
, "WORD", &idx
);
16246 cl_number_or_name
= argv
[idx
]->arg
;
16248 int ret
= extcommunity_list_unset(bgp_clist
, cl_number_or_name
, str
,
16251 XFREE(MTYPE_TMP
, str
);
16254 community_list_perror(vty
, ret
);
16255 return CMD_WARNING_CONFIG_FAILED
;
16258 return CMD_SUCCESS
;
16261 ALIAS(no_extcommunity_list_standard_all
,
16262 no_bgp_extcommunity_list_standard_all_list_cmd
,
16263 "no bgp extcommunity-list <(1-99)|standard WORD>",
16264 NO_STR IP_STR EXTCOMMUNITY_LIST_STR
16265 "Extended Community list number (standard)\n"
16266 "Specify standard extcommunity-list\n"
16267 "Community list name\n")
16269 DEFUN (no_extcommunity_list_expanded_all
,
16270 no_bgp_extcommunity_list_expanded_all_cmd
,
16271 "no bgp extcommunity-list <(100-500)|expanded WORD> <deny|permit> LINE...",
16274 EXTCOMMUNITY_LIST_STR
16275 "Extended Community list number (expanded)\n"
16276 "Specify expanded extcommunity-list\n"
16277 "Extended Community list name\n"
16278 "Specify community to reject\n"
16279 "Specify community to accept\n"
16280 "An ordered list as a regular-expression\n")
16282 int style
= EXTCOMMUNITY_LIST_EXPANDED
;
16284 char *cl_number_or_name
= NULL
;
16288 argv_find(argv
, argc
, "permit", &idx
);
16289 argv_find(argv
, argc
, "deny", &idx
);
16292 direct
= argv_find(argv
, argc
, "permit", &idx
)
16297 argv_find(argv
, argc
, "LINE", &idx
);
16298 str
= argv_concat(argv
, argc
, idx
);
16302 argv_find(argv
, argc
, "(100-500)", &idx
);
16303 argv_find(argv
, argc
, "WORD", &idx
);
16304 cl_number_or_name
= argv
[idx
]->arg
;
16306 int ret
= extcommunity_list_unset(bgp_clist
, cl_number_or_name
, str
,
16309 XFREE(MTYPE_TMP
, str
);
16312 community_list_perror(vty
, ret
);
16313 return CMD_WARNING_CONFIG_FAILED
;
16316 return CMD_SUCCESS
;
16319 ALIAS(no_extcommunity_list_expanded_all
,
16320 no_bgp_extcommunity_list_expanded_all_list_cmd
,
16321 "no bgp extcommunity-list <(100-500)|expanded WORD>",
16322 NO_STR IP_STR EXTCOMMUNITY_LIST_STR
16323 "Extended Community list number (expanded)\n"
16324 "Specify expanded extcommunity-list\n"
16325 "Extended Community list name\n")
16327 static void extcommunity_list_show(struct vty
*vty
, struct community_list
*list
)
16329 struct community_entry
*entry
;
16331 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
16332 if (entry
== list
->head
) {
16333 if (all_digit(list
->name
))
16334 vty_out(vty
, "Extended community %s list %s\n",
16335 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
16337 : "(expanded) access",
16341 "Named extended community %s list %s\n",
16342 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
16348 vty_out(vty
, " %s\n",
16349 community_direct_str(entry
->direct
));
16351 vty_out(vty
, " %s %s\n",
16352 community_direct_str(entry
->direct
),
16353 community_list_config_str(entry
));
16357 DEFUN (show_extcommunity_list
,
16358 show_bgp_extcommunity_list_cmd
,
16359 "show bgp extcommunity-list",
16362 "List extended-community list\n")
16364 struct community_list
*list
;
16365 struct community_list_master
*cm
;
16367 cm
= community_list_master_lookup(bgp_clist
, EXTCOMMUNITY_LIST_MASTER
);
16369 return CMD_SUCCESS
;
16371 for (list
= cm
->num
.head
; list
; list
= list
->next
)
16372 extcommunity_list_show(vty
, list
);
16374 for (list
= cm
->str
.head
; list
; list
= list
->next
)
16375 extcommunity_list_show(vty
, list
);
16377 return CMD_SUCCESS
;
16380 DEFUN (show_extcommunity_list_arg
,
16381 show_bgp_extcommunity_list_arg_cmd
,
16382 "show bgp extcommunity-list <(1-500)|WORD> detail",
16385 "List extended-community list\n"
16386 "Extcommunity-list number\n"
16387 "Extcommunity-list name\n"
16388 "Detailed information on extcommunity-list\n")
16390 int idx_comm_list
= 3;
16391 struct community_list
*list
;
16393 list
= community_list_lookup(bgp_clist
, argv
[idx_comm_list
]->arg
, 0,
16394 EXTCOMMUNITY_LIST_MASTER
);
16396 vty_out(vty
, "%% Can't find extcommunity-list\n");
16397 return CMD_WARNING
;
16400 extcommunity_list_show(vty
, list
);
16402 return CMD_SUCCESS
;
16405 /* Display community-list and extcommunity-list configuration. */
16406 static int community_list_config_write(struct vty
*vty
)
16408 struct community_list
*list
;
16409 struct community_entry
*entry
;
16410 struct community_list_master
*cm
;
16413 /* Community-list. */
16414 cm
= community_list_master_lookup(bgp_clist
, COMMUNITY_LIST_MASTER
);
16416 for (list
= cm
->num
.head
; list
; list
= list
->next
)
16417 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
16418 vty_out(vty
, "bgp community-list %s %s %s\n", list
->name
,
16419 community_direct_str(entry
->direct
),
16420 community_list_config_str(entry
));
16423 for (list
= cm
->str
.head
; list
; list
= list
->next
)
16424 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
16425 vty_out(vty
, "bgp community-list %s %s %s %s\n",
16426 entry
->style
== COMMUNITY_LIST_STANDARD
16429 list
->name
, community_direct_str(entry
->direct
),
16430 community_list_config_str(entry
));
16434 /* Extcommunity-list. */
16435 cm
= community_list_master_lookup(bgp_clist
, EXTCOMMUNITY_LIST_MASTER
);
16437 for (list
= cm
->num
.head
; list
; list
= list
->next
)
16438 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
16439 vty_out(vty
, "bgp extcommunity-list %s %s %s\n",
16440 list
->name
, community_direct_str(entry
->direct
),
16441 community_list_config_str(entry
));
16444 for (list
= cm
->str
.head
; list
; list
= list
->next
)
16445 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
16446 vty_out(vty
, "bgp extcommunity-list %s %s %s %s\n",
16447 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
16450 list
->name
, community_direct_str(entry
->direct
),
16451 community_list_config_str(entry
));
16456 /* lcommunity-list. */
16457 cm
= community_list_master_lookup(bgp_clist
,
16458 LARGE_COMMUNITY_LIST_MASTER
);
16460 for (list
= cm
->num
.head
; list
; list
= list
->next
)
16461 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
16462 vty_out(vty
, "bgp large-community-list %s %s %s\n",
16463 list
->name
, community_direct_str(entry
->direct
),
16464 community_list_config_str(entry
));
16467 for (list
= cm
->str
.head
; list
; list
= list
->next
)
16468 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
16469 vty_out(vty
, "bgp large-community-list %s %s %s %s\n",
16470 entry
->style
== LARGE_COMMUNITY_LIST_STANDARD
16473 list
->name
, community_direct_str(entry
->direct
),
16474 community_list_config_str(entry
));
16481 static struct cmd_node community_list_node
= {
16482 COMMUNITY_LIST_NODE
, "", 1 /* Export to vtysh. */
16485 static void community_list_vty(void)
16487 install_node(&community_list_node
, community_list_config_write
);
16489 /* Community-list. */
16490 install_element(CONFIG_NODE
, &bgp_community_list_standard_cmd
);
16491 install_element(CONFIG_NODE
, &bgp_community_list_expanded_all_cmd
);
16492 install_element(CONFIG_NODE
, &no_bgp_community_list_standard_all_cmd
);
16493 install_element(CONFIG_NODE
, &no_bgp_community_list_standard_all_list_cmd
);
16494 install_element(CONFIG_NODE
, &no_bgp_community_list_expanded_all_cmd
);
16495 install_element(CONFIG_NODE
, &no_bgp_community_list_expanded_all_list_cmd
);
16496 install_element(VIEW_NODE
, &show_bgp_community_list_cmd
);
16497 install_element(VIEW_NODE
, &show_bgp_community_list_arg_cmd
);
16499 /* Extcommunity-list. */
16500 install_element(CONFIG_NODE
, &bgp_extcommunity_list_standard_cmd
);
16501 install_element(CONFIG_NODE
, &bgp_extcommunity_list_name_expanded_cmd
);
16502 install_element(CONFIG_NODE
, &no_bgp_extcommunity_list_standard_all_cmd
);
16503 install_element(CONFIG_NODE
,
16504 &no_bgp_extcommunity_list_standard_all_list_cmd
);
16505 install_element(CONFIG_NODE
, &no_bgp_extcommunity_list_expanded_all_cmd
);
16506 install_element(CONFIG_NODE
,
16507 &no_bgp_extcommunity_list_expanded_all_list_cmd
);
16508 install_element(VIEW_NODE
, &show_bgp_extcommunity_list_cmd
);
16509 install_element(VIEW_NODE
, &show_bgp_extcommunity_list_arg_cmd
);
16511 /* Large Community List */
16512 install_element(CONFIG_NODE
, &bgp_lcommunity_list_standard_cmd
);
16513 install_element(CONFIG_NODE
, &bgp_lcommunity_list_expanded_cmd
);
16514 install_element(CONFIG_NODE
, &bgp_lcommunity_list_name_standard_cmd
);
16515 install_element(CONFIG_NODE
, &bgp_lcommunity_list_name_expanded_cmd
);
16516 install_element(CONFIG_NODE
, &no_bgp_lcommunity_list_standard_all_cmd
);
16517 install_element(CONFIG_NODE
,
16518 &no_bgp_lcommunity_list_name_expanded_all_cmd
);
16519 install_element(CONFIG_NODE
, &no_bgp_lcommunity_list_standard_cmd
);
16520 install_element(CONFIG_NODE
, &no_bgp_lcommunity_list_expanded_cmd
);
16521 install_element(CONFIG_NODE
, &no_bgp_lcommunity_list_name_standard_cmd
);
16522 install_element(CONFIG_NODE
, &no_bgp_lcommunity_list_name_expanded_cmd
);
16523 install_element(VIEW_NODE
, &show_bgp_lcommunity_list_cmd
);
16524 install_element(VIEW_NODE
, &show_bgp_lcommunity_list_arg_cmd
);