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/sockopt.h"
26 #include "lib_errors.h"
27 #include "lib/zclient.h"
28 #include "lib/printfrr.h"
43 #include "bgpd/bgpd.h"
44 #include "bgpd/bgp_attr_evpn.h"
45 #include "bgpd/bgp_advertise.h"
46 #include "bgpd/bgp_attr.h"
47 #include "bgpd/bgp_aspath.h"
48 #include "bgpd/bgp_community.h"
49 #include "bgpd/bgp_community_alias.h"
50 #include "bgpd/bgp_ecommunity.h"
51 #include "bgpd/bgp_lcommunity.h"
52 #include "bgpd/bgp_damp.h"
53 #include "bgpd/bgp_debug.h"
54 #include "bgpd/bgp_errors.h"
55 #include "bgpd/bgp_fsm.h"
56 #include "bgpd/bgp_nexthop.h"
57 #include "bgpd/bgp_network.h"
58 #include "bgpd/bgp_open.h"
59 #include "bgpd/bgp_regex.h"
60 #include "bgpd/bgp_route.h"
61 #include "bgpd/bgp_mplsvpn.h"
62 #include "bgpd/bgp_zebra.h"
63 #include "bgpd/bgp_table.h"
64 #include "bgpd/bgp_vty.h"
65 #include "bgpd/bgp_mpath.h"
66 #include "bgpd/bgp_packet.h"
67 #include "bgpd/bgp_updgrp.h"
68 #include "bgpd/bgp_bfd.h"
69 #include "bgpd/bgp_io.h"
70 #include "bgpd/bgp_evpn.h"
71 #include "bgpd/bgp_evpn_vty.h"
72 #include "bgpd/bgp_evpn_mh.h"
73 #include "bgpd/bgp_addpath.h"
74 #include "bgpd/bgp_mac.h"
75 #include "bgpd/bgp_flowspec.h"
76 #include "bgpd/bgp_conditional_adv.h"
78 #include "bgpd/rfapi/bgp_rfapi_cfg.h"
81 FRR_CFG_DEFAULT_BOOL(BGP_IMPORT_CHECK
,
84 .match_profile
= "traditional",
85 .match_version
= "< 7.4",
89 FRR_CFG_DEFAULT_BOOL(BGP_SHOW_HOSTNAME
,
90 { .val_bool
= true, .match_profile
= "datacenter", },
91 { .val_bool
= false },
93 FRR_CFG_DEFAULT_BOOL(BGP_SHOW_NEXTHOP_HOSTNAME
,
94 { .val_bool
= true, .match_profile
= "datacenter", },
95 { .val_bool
= false },
97 FRR_CFG_DEFAULT_BOOL(BGP_LOG_NEIGHBOR_CHANGES
,
98 { .val_bool
= true, .match_profile
= "datacenter", },
99 { .val_bool
= false },
101 FRR_CFG_DEFAULT_BOOL(BGP_DETERMINISTIC_MED
,
102 { .val_bool
= true, .match_profile
= "datacenter", },
103 { .val_bool
= false },
105 FRR_CFG_DEFAULT_ULONG(BGP_CONNECT_RETRY
,
106 { .val_ulong
= 10, .match_profile
= "datacenter", },
107 { .val_ulong
= 120 },
109 FRR_CFG_DEFAULT_ULONG(BGP_HOLDTIME
,
110 { .val_ulong
= 9, .match_profile
= "datacenter", },
111 { .val_ulong
= 180 },
113 FRR_CFG_DEFAULT_ULONG(BGP_KEEPALIVE
,
114 { .val_ulong
= 3, .match_profile
= "datacenter", },
117 FRR_CFG_DEFAULT_BOOL(BGP_EBGP_REQUIRES_POLICY
,
118 { .val_bool
= false, .match_profile
= "datacenter", },
119 { .val_bool
= false, .match_version
= "< 7.4", },
120 { .val_bool
= true },
122 FRR_CFG_DEFAULT_BOOL(BGP_SUPPRESS_DUPLICATES
,
123 { .val_bool
= false, .match_version
= "< 7.6", },
124 { .val_bool
= true },
126 FRR_CFG_DEFAULT_BOOL(BGP_GRACEFUL_NOTIFICATION
,
127 { .val_bool
= false, .match_version
= "< 8.3", },
128 { .val_bool
= true },
130 FRR_CFG_DEFAULT_BOOL(BGP_HARD_ADMIN_RESET
,
131 { .val_bool
= false, .match_version
= "< 8.3", },
132 { .val_bool
= true },
135 DEFINE_HOOK(bgp_inst_config_write
,
136 (struct bgp
*bgp
, struct vty
*vty
),
138 DEFINE_HOOK(bgp_snmp_update_last_changed
, (struct bgp
*bgp
), (bgp
));
139 DEFINE_HOOK(bgp_snmp_init_stats
, (struct bgp
*bgp
), (bgp
));
141 static struct peer_group
*listen_range_exists(struct bgp
*bgp
,
142 struct prefix
*range
, int exact
);
144 /* Show BGP peer's information. */
154 static struct peer_group
*listen_range_exists(struct bgp
*bgp
,
155 struct prefix
*range
, int exact
);
157 static void bgp_show_global_graceful_restart_mode_vty(struct vty
*vty
,
162 static int bgp_show_neighbor_graceful_restart_afi_all(struct vty
*vty
,
165 afi_t afi
, bool use_json
);
167 static enum node_type
bgp_node_type(afi_t afi
, safi_t safi
)
173 return BGP_IPV4_NODE
;
175 return BGP_IPV4M_NODE
;
176 case SAFI_LABELED_UNICAST
:
177 return BGP_IPV4L_NODE
;
179 return BGP_VPNV4_NODE
;
181 return BGP_FLOWSPECV4_NODE
;
184 return BGP_IPV4_NODE
;
189 return BGP_IPV6_NODE
;
191 return BGP_IPV6M_NODE
;
192 case SAFI_LABELED_UNICAST
:
193 return BGP_IPV6L_NODE
;
195 return BGP_VPNV6_NODE
;
197 return BGP_FLOWSPECV6_NODE
;
200 return BGP_IPV4_NODE
;
203 return BGP_EVPN_NODE
;
206 // We should never be here but to clarify the switch statement..
207 return BGP_IPV4_NODE
;
210 // Impossible to happen
211 return BGP_IPV4_NODE
;
214 static const char *get_afi_safi_vty_str(afi_t afi
, safi_t safi
)
217 if (safi
== SAFI_UNICAST
)
218 return "IPv4 Unicast";
219 if (safi
== SAFI_MULTICAST
)
220 return "IPv4 Multicast";
221 if (safi
== SAFI_LABELED_UNICAST
)
222 return "IPv4 Labeled Unicast";
223 if (safi
== SAFI_MPLS_VPN
)
225 if (safi
== SAFI_ENCAP
)
227 if (safi
== SAFI_FLOWSPEC
)
228 return "IPv4 Flowspec";
229 } else if (afi
== AFI_IP6
) {
230 if (safi
== SAFI_UNICAST
)
231 return "IPv6 Unicast";
232 if (safi
== SAFI_MULTICAST
)
233 return "IPv6 Multicast";
234 if (safi
== SAFI_LABELED_UNICAST
)
235 return "IPv6 Labeled Unicast";
236 if (safi
== SAFI_MPLS_VPN
)
238 if (safi
== SAFI_ENCAP
)
240 if (safi
== SAFI_FLOWSPEC
)
241 return "IPv6 Flowspec";
242 } else if (afi
== AFI_L2VPN
) {
243 if (safi
== SAFI_EVPN
)
251 * Please note that we have intentionally camelCased
252 * the return strings here. So if you want
253 * to use this function, please ensure you
254 * are doing this within json output
256 static const char *get_afi_safi_json_str(afi_t afi
, safi_t safi
)
259 if (safi
== SAFI_UNICAST
)
260 return "ipv4Unicast";
261 if (safi
== SAFI_MULTICAST
)
262 return "ipv4Multicast";
263 if (safi
== SAFI_LABELED_UNICAST
)
264 return "ipv4LabeledUnicast";
265 if (safi
== SAFI_MPLS_VPN
)
267 if (safi
== SAFI_ENCAP
)
269 if (safi
== SAFI_FLOWSPEC
)
270 return "ipv4Flowspec";
271 } else if (afi
== AFI_IP6
) {
272 if (safi
== SAFI_UNICAST
)
273 return "ipv6Unicast";
274 if (safi
== SAFI_MULTICAST
)
275 return "ipv6Multicast";
276 if (safi
== SAFI_LABELED_UNICAST
)
277 return "ipv6LabeledUnicast";
278 if (safi
== SAFI_MPLS_VPN
)
280 if (safi
== SAFI_ENCAP
)
282 if (safi
== SAFI_FLOWSPEC
)
283 return "ipv6Flowspec";
284 } else if (afi
== AFI_L2VPN
) {
285 if (safi
== SAFI_EVPN
)
292 /* unset srv6 locator */
293 static int bgp_srv6_locator_unset(struct bgp
*bgp
)
296 struct listnode
*node
, *nnode
;
297 struct srv6_locator_chunk
*chunk
;
298 struct bgp_srv6_function
*func
;
300 struct in6_addr
*tovpn_sid
;
302 /* release chunk notification via ZAPI */
303 ret
= bgp_zebra_srv6_manager_release_locator_chunk(
304 bgp
->srv6_locator_name
);
309 for (ALL_LIST_ELEMENTS(bgp
->srv6_locator_chunks
, node
, nnode
, chunk
))
310 listnode_delete(bgp
->srv6_locator_chunks
, chunk
);
312 /* refresh functions */
313 for (ALL_LIST_ELEMENTS(bgp
->srv6_functions
, node
, nnode
, func
))
314 listnode_delete(bgp
->srv6_functions
, func
);
316 /* refresh tovpn_sid */
317 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, node
, bgp_vrf
)) {
318 if (bgp_vrf
->inst_type
!= BGP_INSTANCE_TYPE_VRF
)
321 /* refresh vpnv4 tovpn_sid */
322 tovpn_sid
= bgp_vrf
->vpn_policy
[AFI_IP
].tovpn_sid
;
324 XFREE(MTYPE_BGP_SRV6_SID
,
325 bgp_vrf
->vpn_policy
[AFI_IP
].tovpn_sid
);
327 /* refresh vpnv6 tovpn_sid */
328 tovpn_sid
= bgp_vrf
->vpn_policy
[AFI_IP6
].tovpn_sid
;
330 XFREE(MTYPE_BGP_SRV6_SID
,
331 bgp_vrf
->vpn_policy
[AFI_IP6
].tovpn_sid
);
334 /* update vpn bgp processes */
335 vpn_leak_postchange_all();
337 /* clear locator name */
338 memset(bgp
->srv6_locator_name
, 0, sizeof(bgp
->srv6_locator_name
));
343 /* Utility function to get address family from current node. */
344 afi_t
bgp_node_afi(struct vty
*vty
)
352 case BGP_FLOWSPECV6_NODE
:
365 /* Utility function to get subsequent address family from current
367 safi_t
bgp_node_safi(struct vty
*vty
)
373 safi
= SAFI_MPLS_VPN
;
377 safi
= SAFI_MULTICAST
;
384 safi
= SAFI_LABELED_UNICAST
;
386 case BGP_FLOWSPECV4_NODE
:
387 case BGP_FLOWSPECV6_NODE
:
388 safi
= SAFI_FLOWSPEC
;
398 * Converts an AFI in string form to afi_t
400 * @param afi string, one of
404 * @return the corresponding afi_t
406 afi_t
bgp_vty_afi_from_str(const char *afi_str
)
408 afi_t afi
= AFI_MAX
; /* unknown */
409 if (strmatch(afi_str
, "ipv4"))
411 else if (strmatch(afi_str
, "ipv6"))
413 else if (strmatch(afi_str
, "l2vpn"))
418 int argv_find_and_parse_afi(struct cmd_token
**argv
, int argc
, int *index
,
422 if (argv_find(argv
, argc
, "ipv4", index
)) {
426 } else if (argv_find(argv
, argc
, "ipv6", index
)) {
430 } else if (argv_find(argv
, argc
, "l2vpn", index
)) {
438 /* supports <unicast|multicast|vpn|labeled-unicast> */
439 safi_t
bgp_vty_safi_from_str(const char *safi_str
)
441 safi_t safi
= SAFI_MAX
; /* unknown */
442 if (strmatch(safi_str
, "multicast"))
443 safi
= SAFI_MULTICAST
;
444 else if (strmatch(safi_str
, "unicast"))
446 else if (strmatch(safi_str
, "vpn"))
447 safi
= SAFI_MPLS_VPN
;
448 else if (strmatch(safi_str
, "evpn"))
450 else if (strmatch(safi_str
, "labeled-unicast"))
451 safi
= SAFI_LABELED_UNICAST
;
452 else if (strmatch(safi_str
, "flowspec"))
453 safi
= SAFI_FLOWSPEC
;
457 int argv_find_and_parse_safi(struct cmd_token
**argv
, int argc
, int *index
,
461 if (argv_find(argv
, argc
, "unicast", index
)) {
464 *safi
= SAFI_UNICAST
;
465 } else if (argv_find(argv
, argc
, "multicast", index
)) {
468 *safi
= SAFI_MULTICAST
;
469 } else if (argv_find(argv
, argc
, "labeled-unicast", index
)) {
472 *safi
= SAFI_LABELED_UNICAST
;
473 } else if (argv_find(argv
, argc
, "vpn", index
)) {
476 *safi
= SAFI_MPLS_VPN
;
477 } else if (argv_find(argv
, argc
, "evpn", index
)) {
481 } else if (argv_find(argv
, argc
, "flowspec", index
)) {
484 *safi
= SAFI_FLOWSPEC
;
490 * Convert an afi_t/safi_t pair to matching BGP_DEFAULT_AF* flag.
493 * address-family identifier
496 * subsequent address-family identifier
499 * default_af string corresponding to the supplied afi/safi pair.
500 * If afi/safi is invalid or if flag for afi/safi doesn't exist,
503 static const char *get_bgp_default_af_flag(afi_t afi
, safi_t safi
)
509 return "ipv4-unicast";
511 return "ipv4-multicast";
516 case SAFI_LABELED_UNICAST
:
517 return "ipv4-labeled-unicast";
519 return "ipv4-flowspec";
521 return "unknown-afi/safi";
527 return "ipv6-unicast";
529 return "ipv6-multicast";
534 case SAFI_LABELED_UNICAST
:
535 return "ipv6-labeled-unicast";
537 return "ipv6-flowspec";
539 return "unknown-afi/safi";
547 return "unknown-afi/safi";
551 return "unknown-afi/safi";
553 /* all AFIs are accounted for above, so this shouldn't happen */
554 return "unknown-afi/safi";
557 int bgp_get_vty(struct bgp
**bgp
, as_t
*as
, const char *name
,
558 enum bgp_instance_type inst_type
)
560 int ret
= bgp_get(bgp
, as
, name
, inst_type
);
562 if (ret
== BGP_CREATED
) {
563 bgp_timers_set(*bgp
, DFLT_BGP_KEEPALIVE
, DFLT_BGP_HOLDTIME
,
564 DFLT_BGP_CONNECT_RETRY
, BGP_DEFAULT_DELAYOPEN
);
566 if (DFLT_BGP_IMPORT_CHECK
)
567 SET_FLAG((*bgp
)->flags
, BGP_FLAG_IMPORT_CHECK
);
568 if (DFLT_BGP_SHOW_HOSTNAME
)
569 SET_FLAG((*bgp
)->flags
, BGP_FLAG_SHOW_HOSTNAME
);
570 if (DFLT_BGP_SHOW_NEXTHOP_HOSTNAME
)
571 SET_FLAG((*bgp
)->flags
, BGP_FLAG_SHOW_NEXTHOP_HOSTNAME
);
572 if (DFLT_BGP_LOG_NEIGHBOR_CHANGES
)
573 SET_FLAG((*bgp
)->flags
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
);
574 if (DFLT_BGP_DETERMINISTIC_MED
)
575 SET_FLAG((*bgp
)->flags
, BGP_FLAG_DETERMINISTIC_MED
);
576 if (DFLT_BGP_EBGP_REQUIRES_POLICY
)
577 SET_FLAG((*bgp
)->flags
, BGP_FLAG_EBGP_REQUIRES_POLICY
);
578 if (DFLT_BGP_SUPPRESS_DUPLICATES
)
579 SET_FLAG((*bgp
)->flags
, BGP_FLAG_SUPPRESS_DUPLICATES
);
580 if (DFLT_BGP_GRACEFUL_NOTIFICATION
)
581 SET_FLAG((*bgp
)->flags
, BGP_FLAG_GRACEFUL_NOTIFICATION
);
582 if (DFLT_BGP_HARD_ADMIN_RESET
)
583 SET_FLAG((*bgp
)->flags
, BGP_FLAG_HARD_ADMIN_RESET
);
591 * bgp_vty_find_and_parse_afi_safi_bgp
593 * For a given 'show ...' command, correctly parse the afi/safi/bgp out from it
594 * This function *assumes* that the calling function pre-sets the afi/safi/bgp
595 * to appropriate values for the calling function. This is to allow the
596 * calling function to make decisions appropriate for the show command
597 * that is being parsed.
599 * The show commands are generally of the form:
600 * "show [ip] bgp [<view|vrf> VIEWVRFNAME] [<ipv4|ipv6>
601 * [<unicast|multicast|vpn|labeled-unicast>]] ..."
603 * Since we use argv_find if the show command in particular doesn't have:
605 * [<view|vrf> VIEWVRFNAME]
606 * [<ipv4|ipv6> [<unicast|multicast|vpn|labeled-unicast>]]
607 * The command parsing should still be ok.
609 * vty -> The vty for the command so we can output some useful data in
610 * the event of a parse error in the vrf.
611 * argv -> The command tokens
612 * argc -> How many command tokens we have
613 * idx -> The current place in the command, generally should be 0 for this
615 * afi -> The parsed afi if it was included in the show command, returned here
616 * safi -> The parsed safi if it was included in the show command, returned here
617 * bgp -> Pointer to the bgp data structure we need to fill in.
618 * use_json -> json is configured or not
620 * The function returns the correct location in the parse tree for the
623 * Returns 0 for failure to parse correctly, else the idx position of where
624 * it found the last token.
626 int bgp_vty_find_and_parse_afi_safi_bgp(struct vty
*vty
,
627 struct cmd_token
**argv
, int argc
,
628 int *idx
, afi_t
*afi
, safi_t
*safi
,
629 struct bgp
**bgp
, bool use_json
)
631 char *vrf_name
= NULL
;
637 if (argv_find(argv
, argc
, "ip", idx
))
640 if (argv_find(argv
, argc
, "view", idx
))
641 vrf_name
= argv
[*idx
+ 1]->arg
;
642 else if (argv_find(argv
, argc
, "vrf", idx
)) {
643 vrf_name
= argv
[*idx
+ 1]->arg
;
644 if (strmatch(vrf_name
, VRF_DEFAULT_NAME
))
648 if (strmatch(vrf_name
, "all"))
651 *bgp
= bgp_lookup_by_name(vrf_name
);
654 json_object
*json
= NULL
;
655 json
= json_object_new_object();
656 json_object_string_add(
658 "View/Vrf is unknown");
662 vty_out(vty
, "View/Vrf %s is unknown\n",
669 *bgp
= bgp_get_default();
672 json_object
*json
= NULL
;
673 json
= json_object_new_object();
674 json_object_string_add(
676 "Default BGP instance not found");
681 "Default BGP instance not found\n");
687 if (argv_find_and_parse_afi(argv
, argc
, idx
, afi
))
688 argv_find_and_parse_safi(argv
, argc
, idx
, safi
);
694 static bool peer_address_self_check(struct bgp
*bgp
, union sockunion
*su
)
696 struct interface
*ifp
= NULL
;
697 struct listnode
*node
;
698 struct bgp_listener
*listener
;
699 union sockunion all_su
;
701 if (su
->sa
.sa_family
== AF_INET
) {
702 (void)str2sockunion("0.0.0.0", &all_su
);
703 ifp
= if_lookup_by_ipv4_exact(&su
->sin
.sin_addr
, bgp
->vrf_id
);
704 } else if (su
->sa
.sa_family
== AF_INET6
) {
705 (void)str2sockunion("::", &all_su
);
706 ifp
= if_lookup_by_ipv6_exact(&su
->sin6
.sin6_addr
,
707 su
->sin6
.sin6_scope_id
,
712 for (ALL_LIST_ELEMENTS_RO(bm
->listen_sockets
, node
, listener
)) {
713 if (sockunion_family(su
) !=
714 sockunion_family(&listener
->su
))
717 /* If 0.0.0.0/:: is a listener, then treat as self and
720 if (!sockunion_cmp(&listener
->su
, su
) ||
721 !sockunion_cmp(&listener
->su
, &all_su
))
729 /* Utility function for looking up peer from VTY. */
730 /* This is used only for configuration, so disallow if attempted on
731 * a dynamic neighbor.
733 static struct peer
*peer_lookup_vty(struct vty
*vty
, const char *ip_str
)
735 struct bgp
*bgp
= VTY_GET_CONTEXT(bgp
);
744 ret
= str2sockunion(ip_str
, &su
);
746 peer
= peer_lookup_by_conf_if(bgp
, ip_str
);
748 if ((peer
= peer_lookup_by_hostname(bgp
, ip_str
))
751 "%% Malformed address or name: %s\n",
757 peer
= peer_lookup(bgp
, &su
);
760 "%% Specify remote-as or peer-group commands first\n");
763 if (peer_dynamic_neighbor(peer
)) {
765 "%% Operation not allowed on a dynamic neighbor\n");
772 /* Utility function for looking up peer or peer group. */
773 /* This is used only for configuration, so disallow if attempted on
774 * a dynamic neighbor.
776 struct peer
*peer_and_group_lookup_vty(struct vty
*vty
, const char *peer_str
)
778 struct bgp
*bgp
= VTY_GET_CONTEXT(bgp
);
781 struct peer
*peer
= NULL
;
782 struct peer_group
*group
= NULL
;
788 ret
= str2sockunion(peer_str
, &su
);
790 /* IP address, locate peer. */
791 peer
= peer_lookup(bgp
, &su
);
793 /* Not IP, could match either peer configured on interface or a
795 peer
= peer_lookup_by_conf_if(bgp
, peer_str
);
797 group
= peer_group_lookup(bgp
, peer_str
);
801 if (peer_dynamic_neighbor(peer
)) {
803 "%% Operation not allowed on a dynamic neighbor\n");
813 vty_out(vty
, "%% Specify remote-as or peer-group commands first\n");
818 int bgp_vty_return(struct vty
*vty
, enum bgp_create_error_code ret
)
820 const char *str
= NULL
;
825 case BGP_GR_NO_OPERATION
:
827 case BGP_ERR_INVALID_VALUE
:
828 str
= "Invalid value";
830 case BGP_ERR_INVALID_FLAG
:
831 str
= "Invalid flag";
833 case BGP_ERR_PEER_GROUP_SHUTDOWN
:
834 str
= "Peer-group has been shutdown. Activate the peer-group first";
836 case BGP_ERR_PEER_FLAG_CONFLICT
:
837 str
= "Can't set override-capability and strict-capability-match at the same time";
839 case BGP_ERR_PEER_GROUP_NO_REMOTE_AS
:
840 str
= "Specify remote-as or peer-group remote AS first";
842 case BGP_ERR_PEER_GROUP_CANT_CHANGE
:
843 str
= "Cannot change the peer-group. Deconfigure first";
845 case BGP_ERR_PEER_GROUP_MISMATCH
:
846 str
= "Peer is not a member of this peer-group";
848 case BGP_ERR_PEER_FILTER_CONFLICT
:
849 str
= "Prefix/distribute list can not co-exist";
851 case BGP_ERR_NOT_INTERNAL_PEER
:
852 str
= "Invalid command. Not an internal neighbor";
854 case BGP_ERR_REMOVE_PRIVATE_AS
:
855 str
= "remove-private-AS cannot be configured for IBGP peers";
857 case BGP_ERR_LOCAL_AS_ALLOWED_ONLY_FOR_EBGP
:
858 str
= "Local-AS allowed only for EBGP peers";
860 case BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS
:
861 str
= "Cannot have local-as same as BGP AS number";
863 case BGP_ERR_TCPSIG_FAILED
:
864 str
= "Error while applying TCP-Sig to session(s)";
866 case BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
:
867 str
= "ebgp-multihop and ttl-security cannot be configured together";
869 case BGP_ERR_NO_IBGP_WITH_TTLHACK
:
870 str
= "ttl-security only allowed for EBGP peers";
872 case BGP_ERR_AS_OVERRIDE
:
873 str
= "as-override cannot be configured for IBGP peers";
875 case BGP_ERR_INVALID_DYNAMIC_NEIGHBORS_LIMIT
:
876 str
= "Invalid limit for number of dynamic neighbors";
878 case BGP_ERR_DYNAMIC_NEIGHBORS_RANGE_EXISTS
:
879 str
= "Dynamic neighbor listen range already exists";
881 case BGP_ERR_INVALID_FOR_DYNAMIC_PEER
:
882 str
= "Operation not allowed on a dynamic neighbor";
884 case BGP_ERR_INVALID_FOR_DIRECT_PEER
:
885 str
= "Operation not allowed on a directly connected neighbor";
887 case BGP_ERR_PEER_SAFI_CONFLICT
:
888 str
= "Cannot activate peer for both 'ipv4 unicast' and 'ipv4 labeled-unicast'";
890 case BGP_ERR_GR_INVALID_CMD
:
891 str
= "The Graceful Restart command used is not valid at this moment.";
893 case BGP_ERR_GR_OPERATION_FAILED
:
894 str
= "The Graceful Restart Operation failed due to an err.";
896 case BGP_ERR_PEER_GROUP_MEMBER
:
897 str
= "Peer-group member cannot override remote-as of peer-group.";
899 case BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
:
900 str
= "Peer-group members must be all internal or all external.";
902 case BGP_ERR_DYNAMIC_NEIGHBORS_RANGE_NOT_FOUND
:
903 str
= "Range specified cannot be deleted because it is not part of current config.";
905 case BGP_ERR_INSTANCE_MISMATCH
:
906 str
= "Instance specified does not match the current instance.";
908 case BGP_ERR_NO_INTERFACE_CONFIG
:
909 str
= "Interface specified is not being used for interface based peer.";
911 case BGP_ERR_SOFT_RECONFIG_UNCONFIGURED
:
912 str
= "No configuration already specified for soft reconfiguration.";
914 case BGP_ERR_AS_MISMATCH
:
915 str
= "BGP is already running.";
917 case BGP_ERR_AF_UNCONFIGURED
:
918 str
= "AFI/SAFI specified is not currently configured.";
920 case BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS_REMOTE_AS
:
921 str
= "AS specified for local as is the same as the remote as and this is not allowed.";
923 case BGP_ERR_INVALID_AS
:
924 str
= "Confederation AS specified is the same AS as our AS.";
928 vty_out(vty
, "%% %s\n", str
);
929 return CMD_WARNING_CONFIG_FAILED
;
934 /* BGP clear sort. */
943 static void bgp_clear_vty_error(struct vty
*vty
, struct peer
*peer
, afi_t afi
,
944 safi_t safi
, int error
)
947 case BGP_ERR_AF_UNCONFIGURED
:
949 "%% BGP: Enable %s address family for the neighbor %s\n",
950 get_afi_safi_str(afi
, safi
, false), peer
->host
);
952 case BGP_ERR_SOFT_RECONFIG_UNCONFIGURED
:
954 "%% BGP: Inbound soft reconfig for %s not possible as it\n has neither refresh capability, nor inbound soft reconfig\n",
962 static int bgp_peer_clear(struct peer
*peer
, afi_t afi
, safi_t safi
,
963 struct listnode
**nnode
, enum bgp_clear_type stype
)
968 /* if afi/.safi not specified, spin thru all of them */
969 if ((afi
== AFI_UNSPEC
) && (safi
== SAFI_UNSPEC
)) {
972 enum bgp_af_index index
;
974 for (index
= BGP_AF_START
; index
< BGP_AF_MAX
; index
++) {
975 paf
= peer
->peer_af_array
[index
];
979 if (paf
&& paf
->subgroup
)
980 SET_FLAG(paf
->subgroup
->sflags
,
981 SUBGRP_STATUS_FORCE_UPDATES
);
984 tmp_safi
= paf
->safi
;
985 if (!peer
->afc
[tmp_afi
][tmp_safi
])
988 if (stype
== BGP_CLEAR_SOFT_NONE
)
989 ret
= peer_clear(peer
, nnode
);
991 ret
= peer_clear_soft(peer
, tmp_afi
, tmp_safi
,
994 /* if afi specified and safi not, spin thru safis on this afi */
995 } else if (safi
== SAFI_UNSPEC
) {
998 for (tmp_safi
= SAFI_UNICAST
;
999 tmp_safi
< SAFI_MAX
; tmp_safi
++) {
1000 if (!peer
->afc
[afi
][tmp_safi
])
1003 paf
= peer_af_find(peer
, afi
, tmp_safi
);
1004 if (paf
&& paf
->subgroup
)
1005 SET_FLAG(paf
->subgroup
->sflags
,
1006 SUBGRP_STATUS_FORCE_UPDATES
);
1008 if (stype
== BGP_CLEAR_SOFT_NONE
)
1009 ret
= peer_clear(peer
, nnode
);
1011 ret
= peer_clear_soft(peer
, afi
,
1014 /* both afi/safi specified, let the caller know if not defined */
1016 if (!peer
->afc
[afi
][safi
])
1019 paf
= peer_af_find(peer
, afi
, safi
);
1020 if (paf
&& paf
->subgroup
)
1021 SET_FLAG(paf
->subgroup
->sflags
,
1022 SUBGRP_STATUS_FORCE_UPDATES
);
1024 if (stype
== BGP_CLEAR_SOFT_NONE
)
1025 ret
= peer_clear(peer
, nnode
);
1027 ret
= peer_clear_soft(peer
, afi
, safi
, stype
);
1033 /* `clear ip bgp' functions. */
1034 static int bgp_clear(struct vty
*vty
, struct bgp
*bgp
, afi_t afi
, safi_t safi
,
1035 enum clear_sort sort
, enum bgp_clear_type stype
,
1042 VTY_BGP_GR_DEFINE_LOOP_VARIABLE
;
1044 /* Clear all neighbors. */
1046 * Pass along pointer to next node to peer_clear() when walking all
1047 * nodes on the BGP instance as that may get freed if it is a
1050 if (sort
== clear_all
) {
1051 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
1053 bgp_peer_gr_flags_update(peer
);
1055 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_GRACEFUL_RESTART
))
1056 gr_router_detected
= true;
1058 ret
= bgp_peer_clear(peer
, afi
, safi
, &nnode
,
1062 bgp_clear_vty_error(vty
, peer
, afi
, safi
, ret
);
1065 if (gr_router_detected
1066 && bgp
->present_zebra_gr_state
== ZEBRA_GR_DISABLE
) {
1067 bgp_zebra_send_capabilities(bgp
, false);
1068 } else if (!gr_router_detected
1069 && bgp
->present_zebra_gr_state
== ZEBRA_GR_ENABLE
) {
1070 bgp_zebra_send_capabilities(bgp
, true);
1073 /* This is to apply read-only mode on this clear. */
1074 if (stype
== BGP_CLEAR_SOFT_NONE
)
1075 bgp
->update_delay_over
= 0;
1080 /* Clear specified neighbor. */
1081 if (sort
== clear_peer
) {
1084 /* Make sockunion for lookup. */
1085 ret
= str2sockunion(arg
, &su
);
1087 peer
= peer_lookup_by_conf_if(bgp
, arg
);
1089 peer
= peer_lookup_by_hostname(bgp
, arg
);
1092 "Malformed address or name: %s\n",
1098 peer
= peer_lookup(bgp
, &su
);
1101 "%% BGP: Unknown neighbor - \"%s\"\n",
1107 VTY_BGP_GR_ROUTER_DETECT(bgp
, peer
, peer
->bgp
->peer
);
1108 VTY_SEND_BGP_GR_CAPABILITY_TO_ZEBRA(peer
->bgp
, ret
);
1110 ret
= bgp_peer_clear(peer
, afi
, safi
, NULL
, stype
);
1112 /* if afi/safi not defined for this peer, let caller know */
1114 ret
= BGP_ERR_AF_UNCONFIGURED
;
1117 bgp_clear_vty_error(vty
, peer
, afi
, safi
, ret
);
1122 /* Clear all neighbors belonging to a specific peer-group. */
1123 if (sort
== clear_group
) {
1124 struct peer_group
*group
;
1126 group
= peer_group_lookup(bgp
, arg
);
1128 vty_out(vty
, "%% BGP: No such peer-group %s\n", arg
);
1132 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
1133 ret
= bgp_peer_clear(peer
, afi
, safi
, &nnode
, stype
);
1136 bgp_clear_vty_error(vty
, peer
, afi
, safi
, ret
);
1143 "%% BGP: No %s peer belonging to peer-group %s is configured\n",
1144 get_afi_safi_str(afi
, safi
, false), arg
);
1149 /* Clear all external (eBGP) neighbors. */
1150 if (sort
== clear_external
) {
1151 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
1152 if (peer
->sort
== BGP_PEER_IBGP
)
1155 bgp_peer_gr_flags_update(peer
);
1157 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_GRACEFUL_RESTART
))
1158 gr_router_detected
= true;
1160 ret
= bgp_peer_clear(peer
, afi
, safi
, &nnode
, stype
);
1163 bgp_clear_vty_error(vty
, peer
, afi
, safi
, ret
);
1168 if (gr_router_detected
1169 && bgp
->present_zebra_gr_state
== ZEBRA_GR_DISABLE
) {
1170 bgp_zebra_send_capabilities(bgp
, false);
1171 } else if (!gr_router_detected
1172 && bgp
->present_zebra_gr_state
== ZEBRA_GR_ENABLE
) {
1173 bgp_zebra_send_capabilities(bgp
, true);
1178 "%% BGP: No external %s peer is configured\n",
1179 get_afi_safi_str(afi
, safi
, false));
1184 /* Clear all neighbors belonging to a specific AS. */
1185 if (sort
== clear_as
) {
1186 as_t as
= strtoul(arg
, NULL
, 10);
1188 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
1192 bgp_peer_gr_flags_update(peer
);
1194 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_GRACEFUL_RESTART
))
1195 gr_router_detected
= true;
1197 ret
= bgp_peer_clear(peer
, afi
, safi
, &nnode
, stype
);
1200 bgp_clear_vty_error(vty
, peer
, afi
, safi
, ret
);
1205 if (gr_router_detected
1206 && bgp
->present_zebra_gr_state
== ZEBRA_GR_DISABLE
) {
1207 bgp_zebra_send_capabilities(bgp
, false);
1208 } else if (!gr_router_detected
1209 && bgp
->present_zebra_gr_state
== ZEBRA_GR_ENABLE
) {
1210 bgp_zebra_send_capabilities(bgp
, true);
1215 "%% BGP: No %s peer is configured with AS %s\n",
1216 get_afi_safi_str(afi
, safi
, false), arg
);
1224 static int bgp_clear_vty(struct vty
*vty
, const char *name
, afi_t afi
,
1225 safi_t safi
, enum clear_sort sort
,
1226 enum bgp_clear_type stype
, const char *arg
)
1230 /* BGP structure lookup. */
1232 bgp
= bgp_lookup_by_name(name
);
1234 vty_out(vty
, "Can't find BGP instance %s\n", name
);
1238 bgp
= bgp_get_default();
1240 vty_out(vty
, "No BGP process is configured\n");
1245 return bgp_clear(vty
, bgp
, afi
, safi
, sort
, stype
, arg
);
1248 /* clear soft inbound */
1249 static void bgp_clear_star_soft_in(struct vty
*vty
, const char *name
)
1254 FOREACH_AFI_SAFI (afi
, safi
)
1255 bgp_clear_vty(vty
, name
, afi
, safi
, clear_all
,
1256 BGP_CLEAR_SOFT_IN
, NULL
);
1259 /* clear soft outbound */
1260 static void bgp_clear_star_soft_out(struct vty
*vty
, const char *name
)
1265 FOREACH_AFI_SAFI (afi
, safi
)
1266 bgp_clear_vty(vty
, name
, afi
, safi
, clear_all
,
1267 BGP_CLEAR_SOFT_OUT
, NULL
);
1271 #ifndef VTYSH_EXTRACT_PL
1272 #include "bgpd/bgp_vty_clippy.c"
1275 DEFUN_HIDDEN (bgp_local_mac
,
1277 "bgp local-mac vni " CMD_VNI_RANGE
" mac WORD seq (0-4294967295)",
1279 "Local MAC config\n"
1280 "VxLAN Network Identifier\n"
1284 "mac-mobility sequence\n"
1294 vni
= strtoul(argv
[3]->arg
, NULL
, 10);
1295 if (!prefix_str2mac(argv
[5]->arg
, &mac
)) {
1296 vty_out(vty
, "%% Malformed MAC address\n");
1299 memset(&ip
, 0, sizeof(ip
));
1300 seq
= strtoul(argv
[7]->arg
, NULL
, 10);
1302 bgp
= bgp_get_default();
1304 vty_out(vty
, "Default BGP instance is not there\n");
1308 rv
= bgp_evpn_local_macip_add(bgp
, vni
, &mac
, &ip
, 0 /* flags */, seq
,
1311 vty_out(vty
, "Internal error\n");
1318 DEFUN_HIDDEN (no_bgp_local_mac
,
1319 no_bgp_local_mac_cmd
,
1320 "no bgp local-mac vni " CMD_VNI_RANGE
" mac WORD",
1323 "Local MAC config\n"
1324 "VxLAN Network Identifier\n"
1335 vni
= strtoul(argv
[4]->arg
, NULL
, 10);
1336 if (!prefix_str2mac(argv
[6]->arg
, &mac
)) {
1337 vty_out(vty
, "%% Malformed MAC address\n");
1340 memset(&ip
, 0, sizeof(ip
));
1342 bgp
= bgp_get_default();
1344 vty_out(vty
, "Default BGP instance is not there\n");
1348 rv
= bgp_evpn_local_macip_del(bgp
, vni
, &mac
, &ip
, ZEBRA_NEIGH_ACTIVE
);
1350 vty_out(vty
, "Internal error\n");
1357 DEFUN (no_synchronization
,
1358 no_synchronization_cmd
,
1359 "no synchronization",
1361 "Perform IGP synchronization\n")
1366 DEFUN (no_auto_summary
,
1367 no_auto_summary_cmd
,
1370 "Enable automatic network number summarization\n")
1375 /* "router bgp" commands. */
1376 DEFUN_NOSH (router_bgp
,
1378 "router bgp [(1-4294967295)$instasn [<view|vrf> VIEWVRFNAME]]",
1382 BGP_INSTANCE_HELP_STR
)
1385 int idx_view_vrf
= 3;
1391 const char *name
= NULL
;
1392 enum bgp_instance_type inst_type
;
1394 // "router bgp" without an ASN
1396 // Pending: Make VRF option available for ASN less config
1397 bgp
= bgp_get_default();
1400 vty_out(vty
, "%% No BGP process is configured\n");
1401 return CMD_WARNING_CONFIG_FAILED
;
1404 if (listcount(bm
->bgp
) > 1) {
1405 vty_out(vty
, "%% Please specify ASN and VRF\n");
1406 return CMD_WARNING_CONFIG_FAILED
;
1412 as
= strtoul(argv
[idx_asn
]->arg
, NULL
, 10);
1414 if (as
== BGP_PRIVATE_AS_MAX
|| as
== BGP_AS4_MAX
)
1415 vty_out(vty
, "Reserved AS used (%u|%u); AS is %u\n",
1416 BGP_PRIVATE_AS_MAX
, BGP_AS4_MAX
, as
);
1418 inst_type
= BGP_INSTANCE_TYPE_DEFAULT
;
1420 name
= argv
[idx_vrf
]->arg
;
1422 if (!strcmp(argv
[idx_view_vrf
]->text
, "vrf")) {
1423 if (strmatch(name
, VRF_DEFAULT_NAME
))
1426 inst_type
= BGP_INSTANCE_TYPE_VRF
;
1427 } else if (!strcmp(argv
[idx_view_vrf
]->text
, "view"))
1428 inst_type
= BGP_INSTANCE_TYPE_VIEW
;
1431 if (inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
1432 is_new_bgp
= (bgp_lookup(as
, name
) == NULL
);
1434 ret
= bgp_get_vty(&bgp
, &as
, name
, inst_type
);
1436 case BGP_ERR_AS_MISMATCH
:
1437 vty_out(vty
, "BGP is already running; AS is %u\n", as
);
1438 return CMD_WARNING_CONFIG_FAILED
;
1439 case BGP_ERR_INSTANCE_MISMATCH
:
1441 "BGP instance name and AS number mismatch\n");
1443 "BGP instance is already running; AS is %u\n",
1445 return CMD_WARNING_CONFIG_FAILED
;
1449 * If we just instantiated the default instance, complete
1450 * any pending VRF-VPN leaking that was configured via
1451 * earlier "router bgp X vrf FOO" blocks.
1453 if (is_new_bgp
&& inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
1454 vpn_leak_postchange_all();
1456 if (inst_type
== BGP_INSTANCE_TYPE_VRF
)
1457 bgp_vpn_leak_export(bgp
);
1458 /* Pending: handle when user tries to change a view to vrf n vv.
1462 /* unset the auto created flag as the user config is now present */
1463 UNSET_FLAG(bgp
->vrf_flags
, BGP_VRF_AUTO
);
1464 VTY_PUSH_CONTEXT(BGP_NODE
, bgp
);
1469 /* "no router bgp" commands. */
1470 DEFUN (no_router_bgp
,
1472 "no router bgp [(1-4294967295)$instasn [<view|vrf> VIEWVRFNAME]]",
1477 BGP_INSTANCE_HELP_STR
)
1483 const char *name
= NULL
;
1485 // "no router bgp" without an ASN
1487 // Pending: Make VRF option available for ASN less config
1488 bgp
= bgp_get_default();
1491 vty_out(vty
, "%% No BGP process is configured\n");
1492 return CMD_WARNING_CONFIG_FAILED
;
1495 if (listcount(bm
->bgp
) > 1) {
1496 vty_out(vty
, "%% Please specify ASN and VRF\n");
1497 return CMD_WARNING_CONFIG_FAILED
;
1501 vty_out(vty
, "%% Please unconfigure l3vni %u\n",
1503 return CMD_WARNING_CONFIG_FAILED
;
1506 as
= strtoul(argv
[idx_asn
]->arg
, NULL
, 10);
1509 name
= argv
[idx_vrf
]->arg
;
1510 if (strmatch(argv
[idx_vrf
- 1]->text
, "vrf")
1511 && strmatch(name
, VRF_DEFAULT_NAME
))
1515 /* Lookup bgp structure. */
1516 bgp
= bgp_lookup(as
, name
);
1518 vty_out(vty
, "%% Can't find BGP instance\n");
1519 return CMD_WARNING_CONFIG_FAILED
;
1523 vty_out(vty
, "%% Please unconfigure l3vni %u\n",
1525 return CMD_WARNING_CONFIG_FAILED
;
1528 /* Cannot delete default instance if vrf instances exist */
1529 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
) {
1530 struct listnode
*node
;
1531 struct bgp
*tmp_bgp
;
1533 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, node
, tmp_bgp
)) {
1534 if (tmp_bgp
->inst_type
!= BGP_INSTANCE_TYPE_VRF
)
1536 if (CHECK_FLAG(tmp_bgp
->af_flags
[AFI_IP
][SAFI_UNICAST
],
1537 BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT
) ||
1538 CHECK_FLAG(tmp_bgp
->af_flags
[AFI_IP6
][SAFI_UNICAST
],
1539 BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT
) ||
1540 CHECK_FLAG(tmp_bgp
->af_flags
[AFI_IP
][SAFI_UNICAST
],
1541 BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT
) ||
1542 CHECK_FLAG(tmp_bgp
->af_flags
[AFI_IP6
][SAFI_UNICAST
],
1543 BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT
) ||
1544 CHECK_FLAG(tmp_bgp
->af_flags
[AFI_IP
][SAFI_UNICAST
],
1545 BGP_CONFIG_VRF_TO_VRF_EXPORT
) ||
1546 CHECK_FLAG(tmp_bgp
->af_flags
[AFI_IP6
][SAFI_UNICAST
],
1547 BGP_CONFIG_VRF_TO_VRF_EXPORT
) ||
1548 (bgp
== bgp_get_evpn() &&
1549 (CHECK_FLAG(tmp_bgp
->af_flags
[AFI_L2VPN
][SAFI_EVPN
],
1550 BGP_L2VPN_EVPN_ADV_IPV4_UNICAST
) ||
1551 CHECK_FLAG(tmp_bgp
->af_flags
[AFI_L2VPN
][SAFI_EVPN
],
1552 BGP_L2VPN_EVPN_ADV_IPV4_UNICAST_GW_IP
) ||
1553 CHECK_FLAG(tmp_bgp
->af_flags
[AFI_L2VPN
][SAFI_EVPN
],
1554 BGP_L2VPN_EVPN_ADV_IPV6_UNICAST
) ||
1555 CHECK_FLAG(tmp_bgp
->af_flags
[AFI_L2VPN
][SAFI_EVPN
],
1556 BGP_L2VPN_EVPN_ADV_IPV6_UNICAST_GW_IP
))) ||
1557 (hashcount(tmp_bgp
->vnihash
))) {
1559 "%% Cannot delete default BGP instance. Dependent VRF instances exist\n");
1560 return CMD_WARNING_CONFIG_FAILED
;
1571 /* bgp session-dscp */
1573 DEFPY (bgp_session_dscp
,
1574 bgp_session_dscp_cmd
,
1575 "bgp session-dscp (0-63)$dscp",
1577 "Override default (C6) bgp TCP session DSCP value\n"
1578 "Manually configured dscp parameter\n")
1580 bm
->tcp_dscp
= dscp
<< 2;
1585 DEFPY (no_bgp_session_dscp
,
1586 no_bgp_session_dscp_cmd
,
1587 "no bgp session-dscp [(0-63)]",
1590 "Override default (C6) bgp TCP session DSCP value\n"
1591 "Manually configured dscp parameter\n")
1593 bm
->tcp_dscp
= IPTOS_PREC_INTERNETCONTROL
;
1598 /* BGP router-id. */
1600 DEFPY (bgp_router_id
,
1602 "bgp router-id A.B.C.D",
1604 "Override configured router identifier\n"
1605 "Manually configured router identifier\n")
1607 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1608 bgp_router_id_static_set(bgp
, router_id
);
1612 DEFPY (no_bgp_router_id
,
1613 no_bgp_router_id_cmd
,
1614 "no bgp router-id [A.B.C.D]",
1617 "Override configured router identifier\n"
1618 "Manually configured router identifier\n")
1620 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1622 if (router_id_str
) {
1623 if (!IPV4_ADDR_SAME(&bgp
->router_id_static
, &router_id
)) {
1624 vty_out(vty
, "%% BGP router-id doesn't match\n");
1625 return CMD_WARNING_CONFIG_FAILED
;
1629 router_id
.s_addr
= 0;
1630 bgp_router_id_static_set(bgp
, router_id
);
1635 DEFPY(bgp_community_alias
, bgp_community_alias_cmd
,
1636 "[no$no] bgp community alias WORD$community ALIAS_NAME$alias_name",
1638 "Add community specific parameters\n"
1639 "Create an alias for a community\n"
1640 "Community (AA:BB or AA:BB:CC)\n"
1643 struct community_alias ca
= {};
1644 struct community_alias
*lookup_community
;
1645 struct community_alias
*lookup_alias
;
1646 struct community
*comm
;
1647 struct lcommunity
*lcomm
;
1648 uint8_t invalid
= 0;
1650 comm
= community_str2com(community
);
1653 community_free(&comm
);
1655 lcomm
= lcommunity_str2com(community
);
1658 lcommunity_free(&lcomm
);
1661 vty_out(vty
, "Invalid community format\n");
1665 strlcpy(ca
.community
, community
, sizeof(ca
.community
));
1666 strlcpy(ca
.alias
, alias_name
, sizeof(ca
.alias
));
1668 lookup_community
= bgp_ca_community_lookup(&ca
);
1669 lookup_alias
= bgp_ca_alias_lookup(&ca
);
1672 bgp_ca_alias_delete(&ca
);
1673 bgp_ca_community_delete(&ca
);
1676 /* Lookup if community hash table has an item
1677 * with the same alias name.
1679 strlcpy(ca
.community
, lookup_alias
->community
,
1680 sizeof(ca
.community
));
1681 if (bgp_ca_community_lookup(&ca
)) {
1683 "community (%s) already has this alias (%s)\n",
1684 lookup_alias
->community
,
1685 lookup_alias
->alias
);
1688 bgp_ca_alias_delete(&ca
);
1691 if (lookup_community
) {
1692 /* Lookup if alias hash table has an item
1693 * with the same community.
1695 strlcpy(ca
.alias
, lookup_community
->alias
,
1697 if (bgp_ca_alias_lookup(&ca
)) {
1699 "alias (%s) already has this community (%s)\n",
1700 lookup_community
->alias
,
1701 lookup_community
->community
);
1704 bgp_ca_community_delete(&ca
);
1707 bgp_ca_alias_insert(&ca
);
1708 bgp_ca_community_insert(&ca
);
1714 DEFPY (bgp_global_suppress_fib_pending
,
1715 bgp_global_suppress_fib_pending_cmd
,
1716 "[no] bgp suppress-fib-pending",
1719 "Advertise only routes that are programmed in kernel to peers globally\n")
1721 bm_wait_for_fib_set(!no
);
1726 DEFPY (bgp_suppress_fib_pending
,
1727 bgp_suppress_fib_pending_cmd
,
1728 "[no] bgp suppress-fib-pending",
1731 "Advertise only routes that are programmed in kernel to peers\n")
1733 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1735 bgp_suppress_fib_pending_set(bgp
, !no
);
1740 /* BGP Cluster ID. */
1741 DEFUN (bgp_cluster_id
,
1743 "bgp cluster-id <A.B.C.D|(1-4294967295)>",
1745 "Configure Route-Reflector Cluster-id\n"
1746 "Route-Reflector Cluster-id in IP address format\n"
1747 "Route-Reflector Cluster-id as 32 bit quantity\n")
1749 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1752 struct in_addr cluster
;
1754 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &cluster
);
1756 vty_out(vty
, "%% Malformed bgp cluster identifier\n");
1757 return CMD_WARNING_CONFIG_FAILED
;
1760 bgp_cluster_id_set(bgp
, &cluster
);
1761 bgp_clear_star_soft_out(vty
, bgp
->name
);
1766 DEFUN (no_bgp_cluster_id
,
1767 no_bgp_cluster_id_cmd
,
1768 "no bgp cluster-id [<A.B.C.D|(1-4294967295)>]",
1771 "Configure Route-Reflector Cluster-id\n"
1772 "Route-Reflector Cluster-id in IP address format\n"
1773 "Route-Reflector Cluster-id as 32 bit quantity\n")
1775 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1776 bgp_cluster_id_unset(bgp
);
1777 bgp_clear_star_soft_out(vty
, bgp
->name
);
1786 "Disable BGP route installation to RIB (Zebra)\n")
1788 if (bgp_option_check(BGP_OPT_NO_FIB
)) {
1790 "%% No-RIB option is already set, nothing to do here.\n");
1794 bgp_option_norib_set_runtime();
1799 DEFPY (no_bgp_norib
,
1804 "Disable BGP route installation to RIB (Zebra)\n")
1806 if (!bgp_option_check(BGP_OPT_NO_FIB
)) {
1808 "%% No-RIB option is not set, nothing to do here.\n");
1812 bgp_option_norib_unset_runtime();
1817 DEFPY (no_bgp_send_extra_data
,
1818 no_bgp_send_extra_data_cmd
,
1819 "[no] bgp send-extra-data zebra",
1822 "Extra data to Zebra for display/use\n"
1826 UNSET_FLAG(bm
->flags
, BM_FLAG_SEND_EXTRA_DATA_TO_ZEBRA
);
1828 SET_FLAG(bm
->flags
, BM_FLAG_SEND_EXTRA_DATA_TO_ZEBRA
);
1833 DEFUN (bgp_confederation_identifier
,
1834 bgp_confederation_identifier_cmd
,
1835 "bgp confederation identifier (1-4294967295)",
1837 "AS confederation parameters\n"
1839 "Set routing domain confederation AS\n")
1841 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1845 as
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1847 bgp_confederation_id_set(bgp
, as
);
1852 DEFUN (no_bgp_confederation_identifier
,
1853 no_bgp_confederation_identifier_cmd
,
1854 "no bgp confederation identifier [(1-4294967295)]",
1857 "AS confederation parameters\n"
1859 "Set routing domain confederation AS\n")
1861 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1862 bgp_confederation_id_unset(bgp
);
1867 DEFUN (bgp_confederation_peers
,
1868 bgp_confederation_peers_cmd
,
1869 "bgp confederation peers (1-4294967295)...",
1871 "AS confederation parameters\n"
1872 "Peer ASs in BGP confederation\n"
1875 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1880 for (i
= idx_asn
; i
< argc
; i
++) {
1881 as
= strtoul(argv
[i
]->arg
, NULL
, 10);
1883 if (bgp
->as
== as
) {
1885 "%% Local member-AS not allowed in confed peer list\n");
1889 bgp_confederation_peers_add(bgp
, as
);
1894 DEFUN (no_bgp_confederation_peers
,
1895 no_bgp_confederation_peers_cmd
,
1896 "no bgp confederation peers (1-4294967295)...",
1899 "AS confederation parameters\n"
1900 "Peer ASs in BGP confederation\n"
1903 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1908 for (i
= idx_asn
; i
< argc
; i
++) {
1909 as
= strtoul(argv
[i
]->arg
, NULL
, 10);
1911 bgp_confederation_peers_remove(bgp
, as
);
1917 * Central routine for maximum-paths configuration.
1918 * @peer_type: BGP_PEER_EBGP or BGP_PEER_IBGP
1919 * @set: 1 for setting values, 0 for removing the max-paths config.
1921 static int bgp_maxpaths_config_vty(struct vty
*vty
, int peer_type
,
1922 const char *mpaths
, uint16_t options
,
1925 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1926 uint16_t maxpaths
= 0;
1931 afi
= bgp_node_afi(vty
);
1932 safi
= bgp_node_safi(vty
);
1935 maxpaths
= strtol(mpaths
, NULL
, 10);
1936 if (maxpaths
> multipath_num
) {
1938 "%% Maxpaths Specified: %d is > than multipath num specified on bgp command line %d",
1939 maxpaths
, multipath_num
);
1940 return CMD_WARNING_CONFIG_FAILED
;
1942 ret
= bgp_maximum_paths_set(bgp
, afi
, safi
, peer_type
, maxpaths
,
1945 ret
= bgp_maximum_paths_unset(bgp
, afi
, safi
, peer_type
);
1949 "%% Failed to %sset maximum-paths %s %u for afi %u, safi %u\n",
1950 (set
== 1) ? "" : "un",
1951 (peer_type
== BGP_PEER_EBGP
) ? "ebgp" : "ibgp",
1952 maxpaths
, afi
, safi
);
1953 return CMD_WARNING_CONFIG_FAILED
;
1956 bgp_recalculate_all_bestpaths(bgp
);
1961 DEFUN (bgp_maxmed_admin
,
1962 bgp_maxmed_admin_cmd
,
1963 "bgp max-med administrative ",
1965 "Advertise routes with max-med\n"
1966 "Administratively applied, for an indefinite period\n")
1968 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1970 bgp
->v_maxmed_admin
= 1;
1971 bgp
->maxmed_admin_value
= BGP_MAXMED_VALUE_DEFAULT
;
1973 bgp_maxmed_update(bgp
);
1978 DEFUN (bgp_maxmed_admin_medv
,
1979 bgp_maxmed_admin_medv_cmd
,
1980 "bgp max-med administrative (0-4294967295)",
1982 "Advertise routes with max-med\n"
1983 "Administratively applied, for an indefinite period\n"
1984 "Max MED value to be used\n")
1986 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1989 bgp
->v_maxmed_admin
= 1;
1990 bgp
->maxmed_admin_value
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1992 bgp_maxmed_update(bgp
);
1997 DEFUN (no_bgp_maxmed_admin
,
1998 no_bgp_maxmed_admin_cmd
,
1999 "no bgp max-med administrative [(0-4294967295)]",
2002 "Advertise routes with max-med\n"
2003 "Administratively applied, for an indefinite period\n"
2004 "Max MED value to be used\n")
2006 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2007 bgp
->v_maxmed_admin
= BGP_MAXMED_ADMIN_UNCONFIGURED
;
2008 bgp
->maxmed_admin_value
= BGP_MAXMED_VALUE_DEFAULT
;
2009 bgp_maxmed_update(bgp
);
2014 DEFUN (bgp_maxmed_onstartup
,
2015 bgp_maxmed_onstartup_cmd
,
2016 "bgp max-med on-startup (5-86400) [(0-4294967295)]",
2018 "Advertise routes with max-med\n"
2019 "Effective on a startup\n"
2020 "Time (seconds) period for max-med\n"
2021 "Max MED value to be used\n")
2023 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2026 if (argv_find(argv
, argc
, "(5-86400)", &idx
))
2027 bgp
->v_maxmed_onstartup
= strtoul(argv
[idx
]->arg
, NULL
, 10);
2028 if (argv_find(argv
, argc
, "(0-4294967295)", &idx
))
2029 bgp
->maxmed_onstartup_value
= strtoul(argv
[idx
]->arg
, NULL
, 10);
2031 bgp
->maxmed_onstartup_value
= BGP_MAXMED_VALUE_DEFAULT
;
2033 bgp_maxmed_update(bgp
);
2038 DEFUN (no_bgp_maxmed_onstartup
,
2039 no_bgp_maxmed_onstartup_cmd
,
2040 "no bgp max-med on-startup [(5-86400) [(0-4294967295)]]",
2043 "Advertise routes with max-med\n"
2044 "Effective on a startup\n"
2045 "Time (seconds) period for max-med\n"
2046 "Max MED value to be used\n")
2048 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2050 /* Cancel max-med onstartup if its on */
2051 if (bgp
->t_maxmed_onstartup
) {
2052 thread_cancel(&bgp
->t_maxmed_onstartup
);
2053 bgp
->maxmed_onstartup_over
= 1;
2056 bgp
->v_maxmed_onstartup
= BGP_MAXMED_ONSTARTUP_UNCONFIGURED
;
2057 bgp
->maxmed_onstartup_value
= BGP_MAXMED_VALUE_DEFAULT
;
2059 bgp_maxmed_update(bgp
);
2064 static int bgp_global_update_delay_config_vty(struct vty
*vty
,
2065 uint16_t update_delay
,
2066 uint16_t establish_wait
)
2068 struct listnode
*node
, *nnode
;
2070 bool vrf_cfg
= false;
2073 * See if update-delay is set per-vrf and warn user to delete it
2074 * Note that we only need to check this if this is the first time
2075 * setting the global config.
2077 if (bm
->v_update_delay
== BGP_UPDATE_DELAY_DEF
) {
2078 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
2079 if (bgp
->v_update_delay
!= BGP_UPDATE_DELAY_DEF
) {
2081 "%% update-delay configuration found in vrf %s\n",
2082 bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
2092 "%%Failed: global update-delay config not permitted\n");
2096 if (!establish_wait
) { /* update-delay <delay> */
2097 bm
->v_update_delay
= update_delay
;
2098 bm
->v_establish_wait
= bm
->v_update_delay
;
2100 /* update-delay <delay> <establish-wait> */
2101 if (update_delay
< establish_wait
) {
2103 "%%Failed: update-delay less than the establish-wait!\n");
2104 return CMD_WARNING_CONFIG_FAILED
;
2107 bm
->v_update_delay
= update_delay
;
2108 bm
->v_establish_wait
= establish_wait
;
2111 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
2112 bgp
->v_update_delay
= bm
->v_update_delay
;
2113 bgp
->v_establish_wait
= bm
->v_establish_wait
;
2119 static int bgp_global_update_delay_deconfig_vty(struct vty
*vty
)
2121 struct listnode
*node
, *nnode
;
2124 bm
->v_update_delay
= BGP_UPDATE_DELAY_DEF
;
2125 bm
->v_establish_wait
= bm
->v_update_delay
;
2127 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
2128 bgp
->v_update_delay
= bm
->v_update_delay
;
2129 bgp
->v_establish_wait
= bm
->v_establish_wait
;
2135 static int bgp_update_delay_config_vty(struct vty
*vty
, uint16_t update_delay
,
2136 uint16_t establish_wait
)
2138 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2140 /* if configured globally, per-instance config is not allowed */
2141 if (bm
->v_update_delay
) {
2143 "%%Failed: per-vrf update-delay config not permitted with global update-delay\n");
2144 return CMD_WARNING_CONFIG_FAILED
;
2148 if (!establish_wait
) /* update-delay <delay> */
2150 bgp
->v_update_delay
= update_delay
;
2151 bgp
->v_establish_wait
= bgp
->v_update_delay
;
2155 /* update-delay <delay> <establish-wait> */
2156 if (update_delay
< establish_wait
) {
2158 "%%Failed: update-delay less than the establish-wait!\n");
2159 return CMD_WARNING_CONFIG_FAILED
;
2162 bgp
->v_update_delay
= update_delay
;
2163 bgp
->v_establish_wait
= establish_wait
;
2168 static int bgp_update_delay_deconfig_vty(struct vty
*vty
)
2170 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2172 /* If configured globally, cannot remove from one bgp instance */
2173 if (bm
->v_update_delay
) {
2175 "%%Failed: bgp update-delay configured globally. Delete per-vrf not permitted\n");
2176 return CMD_WARNING_CONFIG_FAILED
;
2178 bgp
->v_update_delay
= BGP_UPDATE_DELAY_DEF
;
2179 bgp
->v_establish_wait
= bgp
->v_update_delay
;
2184 void bgp_config_write_update_delay(struct vty
*vty
, struct bgp
*bgp
)
2186 /* If configured globally, no need to display per-instance value */
2187 if (bgp
->v_update_delay
!= bm
->v_update_delay
) {
2188 vty_out(vty
, " update-delay %d", bgp
->v_update_delay
);
2189 if (bgp
->v_update_delay
!= bgp
->v_establish_wait
)
2190 vty_out(vty
, " %d", bgp
->v_establish_wait
);
2195 /* Global update-delay configuration */
2196 DEFPY (bgp_global_update_delay
,
2197 bgp_global_update_delay_cmd
,
2198 "bgp update-delay (0-3600)$delay [(1-3600)$wait]",
2200 "Force initial delay for best-path and updates for all bgp instances\n"
2201 "Max delay in seconds\n"
2202 "Establish wait in seconds\n")
2204 return bgp_global_update_delay_config_vty(vty
, delay
, wait
);
2207 /* Global update-delay deconfiguration */
2208 DEFPY (no_bgp_global_update_delay
,
2209 no_bgp_global_update_delay_cmd
,
2210 "no bgp update-delay [(0-3600) [(1-3600)]]",
2213 "Force initial delay for best-path and updates\n"
2214 "Max delay in seconds\n"
2215 "Establish wait in seconds\n")
2217 return bgp_global_update_delay_deconfig_vty(vty
);
2220 /* Update-delay configuration */
2222 DEFPY (bgp_update_delay
,
2223 bgp_update_delay_cmd
,
2224 "update-delay (0-3600)$delay [(1-3600)$wait]",
2225 "Force initial delay for best-path and updates\n"
2226 "Max delay in seconds\n"
2227 "Establish wait in seconds\n")
2229 return bgp_update_delay_config_vty(vty
, delay
, wait
);
2232 /* Update-delay deconfiguration */
2233 DEFPY (no_bgp_update_delay
,
2234 no_bgp_update_delay_cmd
,
2235 "no update-delay [(0-3600) [(1-3600)]]",
2237 "Force initial delay for best-path and updates\n"
2238 "Max delay in seconds\n"
2239 "Establish wait in seconds\n")
2241 return bgp_update_delay_deconfig_vty(vty
);
2245 static int bgp_wpkt_quanta_config_vty(struct vty
*vty
, uint32_t quanta
,
2248 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2250 quanta
= set
? quanta
: BGP_WRITE_PACKET_MAX
;
2251 atomic_store_explicit(&bgp
->wpkt_quanta
, quanta
, memory_order_relaxed
);
2256 static int bgp_rpkt_quanta_config_vty(struct vty
*vty
, uint32_t quanta
,
2259 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2261 quanta
= set
? quanta
: BGP_READ_PACKET_MAX
;
2262 atomic_store_explicit(&bgp
->rpkt_quanta
, quanta
, memory_order_relaxed
);
2267 void bgp_config_write_wpkt_quanta(struct vty
*vty
, struct bgp
*bgp
)
2270 atomic_load_explicit(&bgp
->wpkt_quanta
, memory_order_relaxed
);
2271 if (quanta
!= BGP_WRITE_PACKET_MAX
)
2272 vty_out(vty
, " write-quanta %d\n", quanta
);
2275 void bgp_config_write_rpkt_quanta(struct vty
*vty
, struct bgp
*bgp
)
2278 atomic_load_explicit(&bgp
->rpkt_quanta
, memory_order_relaxed
);
2279 if (quanta
!= BGP_READ_PACKET_MAX
)
2280 vty_out(vty
, " read-quanta %d\n", quanta
);
2283 /* Packet quanta configuration
2285 * XXX: The value set here controls the size of a stack buffer in the IO
2286 * thread. When changing these limits be careful to prevent stack overflow.
2288 * Furthermore, the maximums used here should correspond to
2289 * BGP_WRITE_PACKET_MAX and BGP_READ_PACKET_MAX.
2291 DEFPY (bgp_wpkt_quanta
,
2292 bgp_wpkt_quanta_cmd
,
2293 "[no] write-quanta (1-64)$quanta",
2295 "How many packets to write to peer socket per run\n"
2296 "Number of packets\n")
2298 return bgp_wpkt_quanta_config_vty(vty
, quanta
, !no
);
2301 DEFPY (bgp_rpkt_quanta
,
2302 bgp_rpkt_quanta_cmd
,
2303 "[no] read-quanta (1-10)$quanta",
2305 "How many packets to read from peer socket per I/O cycle\n"
2306 "Number of packets\n")
2308 return bgp_rpkt_quanta_config_vty(vty
, quanta
, !no
);
2311 void bgp_config_write_coalesce_time(struct vty
*vty
, struct bgp
*bgp
)
2313 if (!bgp
->heuristic_coalesce
)
2314 vty_out(vty
, " coalesce-time %u\n", bgp
->coalesce_time
);
2318 DEFUN (bgp_coalesce_time
,
2319 bgp_coalesce_time_cmd
,
2320 "coalesce-time (0-4294967295)",
2321 "Subgroup coalesce timer\n"
2322 "Subgroup coalesce timer value (in ms)\n")
2324 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2328 bgp
->heuristic_coalesce
= false;
2330 if (argv_find(argv
, argc
, "(0-4294967295)", &idx
))
2331 bgp
->coalesce_time
= strtoul(argv
[idx
]->arg
, NULL
, 10);
2336 DEFUN (no_bgp_coalesce_time
,
2337 no_bgp_coalesce_time_cmd
,
2338 "no coalesce-time (0-4294967295)",
2340 "Subgroup coalesce timer\n"
2341 "Subgroup coalesce timer value (in ms)\n")
2343 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2345 bgp
->heuristic_coalesce
= true;
2346 bgp
->coalesce_time
= BGP_DEFAULT_SUBGROUP_COALESCE_TIME
;
2350 /* Maximum-paths configuration */
2351 DEFUN (bgp_maxpaths
,
2353 "maximum-paths " CMD_RANGE_STR(1, MULTIPATH_NUM
),
2354 "Forward packets over multiple paths\n"
2355 "Number of paths\n")
2358 return bgp_maxpaths_config_vty(vty
, BGP_PEER_EBGP
,
2359 argv
[idx_number
]->arg
, 0, 1);
2362 ALIAS_HIDDEN(bgp_maxpaths
, bgp_maxpaths_hidden_cmd
,
2363 "maximum-paths " CMD_RANGE_STR(1, MULTIPATH_NUM
),
2364 "Forward packets over multiple paths\n"
2365 "Number of paths\n")
2367 DEFUN (bgp_maxpaths_ibgp
,
2368 bgp_maxpaths_ibgp_cmd
,
2369 "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM
),
2370 "Forward packets over multiple paths\n"
2372 "Number of paths\n")
2375 return bgp_maxpaths_config_vty(vty
, BGP_PEER_IBGP
,
2376 argv
[idx_number
]->arg
, 0, 1);
2379 ALIAS_HIDDEN(bgp_maxpaths_ibgp
, bgp_maxpaths_ibgp_hidden_cmd
,
2380 "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM
),
2381 "Forward packets over multiple paths\n"
2383 "Number of paths\n")
2385 DEFUN (bgp_maxpaths_ibgp_cluster
,
2386 bgp_maxpaths_ibgp_cluster_cmd
,
2387 "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM
) " equal-cluster-length",
2388 "Forward packets over multiple paths\n"
2391 "Match the cluster length\n")
2394 return bgp_maxpaths_config_vty(vty
, BGP_PEER_IBGP
,
2395 argv
[idx_number
]->arg
, true, 1);
2398 ALIAS_HIDDEN(bgp_maxpaths_ibgp_cluster
, bgp_maxpaths_ibgp_cluster_hidden_cmd
,
2399 "maximum-paths ibgp " CMD_RANGE_STR(
2400 1, MULTIPATH_NUM
) " equal-cluster-length",
2401 "Forward packets over multiple paths\n"
2404 "Match the cluster length\n")
2406 DEFUN (no_bgp_maxpaths
,
2407 no_bgp_maxpaths_cmd
,
2408 "no maximum-paths [" CMD_RANGE_STR(1, MULTIPATH_NUM
) "]",
2410 "Forward packets over multiple paths\n"
2411 "Number of paths\n")
2413 return bgp_maxpaths_config_vty(vty
, BGP_PEER_EBGP
, NULL
, 0, 0);
2416 ALIAS_HIDDEN(no_bgp_maxpaths
, no_bgp_maxpaths_hidden_cmd
,
2417 "no maximum-paths [" CMD_RANGE_STR(1, MULTIPATH_NUM
) "]", NO_STR
2418 "Forward packets over multiple paths\n"
2419 "Number of paths\n")
2421 DEFUN (no_bgp_maxpaths_ibgp
,
2422 no_bgp_maxpaths_ibgp_cmd
,
2423 "no maximum-paths ibgp [" CMD_RANGE_STR(1, MULTIPATH_NUM
) " [equal-cluster-length]]",
2425 "Forward packets over multiple paths\n"
2428 "Match the cluster length\n")
2430 return bgp_maxpaths_config_vty(vty
, BGP_PEER_IBGP
, NULL
, 0, 0);
2433 ALIAS_HIDDEN(no_bgp_maxpaths_ibgp
, no_bgp_maxpaths_ibgp_hidden_cmd
,
2434 "no maximum-paths ibgp [" CMD_RANGE_STR(
2435 1, MULTIPATH_NUM
) " [equal-cluster-length]]",
2437 "Forward packets over multiple paths\n"
2440 "Match the cluster length\n")
2442 static void bgp_config_write_maxpaths(struct vty
*vty
, struct bgp
*bgp
,
2443 afi_t afi
, safi_t safi
)
2445 if (bgp
->maxpaths
[afi
][safi
].maxpaths_ebgp
!= multipath_num
) {
2446 vty_out(vty
, " maximum-paths %d\n",
2447 bgp
->maxpaths
[afi
][safi
].maxpaths_ebgp
);
2450 if (bgp
->maxpaths
[afi
][safi
].maxpaths_ibgp
!= multipath_num
) {
2451 vty_out(vty
, " maximum-paths ibgp %d",
2452 bgp
->maxpaths
[afi
][safi
].maxpaths_ibgp
);
2453 if (bgp
->maxpaths
[afi
][safi
].same_clusterlen
)
2454 vty_out(vty
, " equal-cluster-length");
2463 "timers bgp (0-65535) (0-65535)",
2464 "Adjust routing timers\n"
2466 "Keepalive interval\n"
2469 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2471 int idx_number_2
= 3;
2472 unsigned long keepalive
= 0;
2473 unsigned long holdtime
= 0;
2475 keepalive
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2476 holdtime
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
2478 /* Holdtime value check. */
2479 if (holdtime
< 3 && holdtime
!= 0) {
2481 "%% hold time value must be either 0 or greater than 3\n");
2482 return CMD_WARNING_CONFIG_FAILED
;
2485 bgp_timers_set(bgp
, keepalive
, holdtime
, DFLT_BGP_CONNECT_RETRY
,
2486 BGP_DEFAULT_DELAYOPEN
);
2491 DEFUN (no_bgp_timers
,
2493 "no timers bgp [(0-65535) (0-65535)]",
2495 "Adjust routing timers\n"
2497 "Keepalive interval\n"
2500 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2501 bgp_timers_set(bgp
, DFLT_BGP_KEEPALIVE
, DFLT_BGP_HOLDTIME
,
2502 DFLT_BGP_CONNECT_RETRY
, BGP_DEFAULT_DELAYOPEN
);
2507 /* BGP minimum holdtime. */
2509 DEFUN(bgp_minimum_holdtime
, bgp_minimum_holdtime_cmd
,
2510 "bgp minimum-holdtime (1-65535)",
2511 "BGP specific commands\n"
2512 "BGP minimum holdtime\n"
2515 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2517 unsigned long min_holdtime
;
2519 min_holdtime
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2521 bgp
->default_min_holdtime
= min_holdtime
;
2526 DEFUN(no_bgp_minimum_holdtime
, no_bgp_minimum_holdtime_cmd
,
2527 "no bgp minimum-holdtime [(1-65535)]",
2529 "BGP specific commands\n"
2530 "BGP minimum holdtime\n"
2533 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2535 bgp
->default_min_holdtime
= 0;
2540 DEFUN (bgp_client_to_client_reflection
,
2541 bgp_client_to_client_reflection_cmd
,
2542 "bgp client-to-client reflection",
2544 "Configure client to client route reflection\n"
2545 "reflection of routes allowed\n")
2547 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2548 UNSET_FLAG(bgp
->flags
, BGP_FLAG_NO_CLIENT_TO_CLIENT
);
2549 bgp_clear_star_soft_out(vty
, bgp
->name
);
2554 DEFUN (no_bgp_client_to_client_reflection
,
2555 no_bgp_client_to_client_reflection_cmd
,
2556 "no bgp client-to-client reflection",
2559 "Configure client to client route reflection\n"
2560 "reflection of routes allowed\n")
2562 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2563 SET_FLAG(bgp
->flags
, BGP_FLAG_NO_CLIENT_TO_CLIENT
);
2564 bgp_clear_star_soft_out(vty
, bgp
->name
);
2569 /* "bgp always-compare-med" configuration. */
2570 DEFUN (bgp_always_compare_med
,
2571 bgp_always_compare_med_cmd
,
2572 "bgp always-compare-med",
2574 "Allow comparing MED from different neighbors\n")
2576 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2577 SET_FLAG(bgp
->flags
, BGP_FLAG_ALWAYS_COMPARE_MED
);
2578 bgp_recalculate_all_bestpaths(bgp
);
2583 DEFUN (no_bgp_always_compare_med
,
2584 no_bgp_always_compare_med_cmd
,
2585 "no bgp always-compare-med",
2588 "Allow comparing MED from different neighbors\n")
2590 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2591 UNSET_FLAG(bgp
->flags
, BGP_FLAG_ALWAYS_COMPARE_MED
);
2592 bgp_recalculate_all_bestpaths(bgp
);
2598 DEFUN(bgp_ebgp_requires_policy
, bgp_ebgp_requires_policy_cmd
,
2599 "bgp ebgp-requires-policy",
2601 "Require in and out policy for eBGP peers (RFC8212)\n")
2603 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2604 SET_FLAG(bgp
->flags
, BGP_FLAG_EBGP_REQUIRES_POLICY
);
2608 DEFUN(no_bgp_ebgp_requires_policy
, no_bgp_ebgp_requires_policy_cmd
,
2609 "no bgp ebgp-requires-policy",
2612 "Require in and out policy for eBGP peers (RFC8212)\n")
2614 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2615 UNSET_FLAG(bgp
->flags
, BGP_FLAG_EBGP_REQUIRES_POLICY
);
2619 DEFUN(bgp_suppress_duplicates
, bgp_suppress_duplicates_cmd
,
2620 "bgp suppress-duplicates",
2622 "Suppress duplicate updates if the route actually not changed\n")
2624 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2625 SET_FLAG(bgp
->flags
, BGP_FLAG_SUPPRESS_DUPLICATES
);
2629 DEFUN(no_bgp_suppress_duplicates
, no_bgp_suppress_duplicates_cmd
,
2630 "no bgp suppress-duplicates",
2633 "Suppress duplicate updates if the route actually not changed\n")
2635 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2636 UNSET_FLAG(bgp
->flags
, BGP_FLAG_SUPPRESS_DUPLICATES
);
2640 DEFUN(bgp_reject_as_sets
, bgp_reject_as_sets_cmd
,
2641 "bgp reject-as-sets",
2643 "Reject routes with AS_SET or AS_CONFED_SET flag\n")
2645 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2646 struct listnode
*node
, *nnode
;
2649 bgp
->reject_as_sets
= true;
2651 /* Reset existing BGP sessions to reject routes
2652 * with aspath containing AS_SET or AS_CONFED_SET.
2654 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
2655 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
2656 peer
->last_reset
= PEER_DOWN_AS_SETS_REJECT
;
2657 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
2658 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2665 DEFUN(no_bgp_reject_as_sets
, no_bgp_reject_as_sets_cmd
,
2666 "no bgp reject-as-sets",
2669 "Reject routes with AS_SET or AS_CONFED_SET flag\n")
2671 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2672 struct listnode
*node
, *nnode
;
2675 bgp
->reject_as_sets
= false;
2677 /* Reset existing BGP sessions to reject routes
2678 * with aspath containing AS_SET or AS_CONFED_SET.
2680 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
2681 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
2682 peer
->last_reset
= PEER_DOWN_AS_SETS_REJECT
;
2683 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
2684 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2691 /* "bgp deterministic-med" configuration. */
2692 DEFUN (bgp_deterministic_med
,
2693 bgp_deterministic_med_cmd
,
2694 "bgp deterministic-med",
2696 "Pick the best-MED path among paths advertised from the neighboring AS\n")
2698 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2700 if (!CHECK_FLAG(bgp
->flags
, BGP_FLAG_DETERMINISTIC_MED
)) {
2701 SET_FLAG(bgp
->flags
, BGP_FLAG_DETERMINISTIC_MED
);
2702 bgp_recalculate_all_bestpaths(bgp
);
2708 DEFUN (no_bgp_deterministic_med
,
2709 no_bgp_deterministic_med_cmd
,
2710 "no bgp deterministic-med",
2713 "Pick the best-MED path among paths advertised from the neighboring AS\n")
2715 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2716 int bestpath_per_as_used
;
2720 struct listnode
*node
, *nnode
;
2722 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_DETERMINISTIC_MED
)) {
2723 bestpath_per_as_used
= 0;
2725 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
2726 FOREACH_AFI_SAFI (afi
, safi
)
2727 if (bgp_addpath_dmed_required(
2728 peer
->addpath_type
[afi
][safi
])) {
2729 bestpath_per_as_used
= 1;
2733 if (bestpath_per_as_used
)
2737 if (bestpath_per_as_used
) {
2739 "bgp deterministic-med cannot be disabled while addpath-tx-bestpath-per-AS is in use\n");
2740 return CMD_WARNING_CONFIG_FAILED
;
2742 UNSET_FLAG(bgp
->flags
, BGP_FLAG_DETERMINISTIC_MED
);
2743 bgp_recalculate_all_bestpaths(bgp
);
2750 /* "bgp graceful-restart mode" configuration. */
2751 DEFUN (bgp_graceful_restart
,
2752 bgp_graceful_restart_cmd
,
2753 "bgp graceful-restart",
2758 int ret
= BGP_GR_FAILURE
;
2760 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
2761 zlog_debug("[BGP_GR] bgp_graceful_restart_cmd : START ");
2763 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2765 ret
= bgp_gr_update_all(bgp
, GLOBAL_GR_CMD
);
2767 VTY_BGP_GR_ROUTER_DETECT_AND_SEND_CAPABILITY_TO_ZEBRA(bgp
, bgp
->peer
,
2770 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
2771 zlog_debug("[BGP_GR] bgp_graceful_restart_cmd : END ");
2773 "Graceful restart configuration changed, reset all peers to take effect\n");
2774 return bgp_vty_return(vty
, ret
);
2777 DEFUN (no_bgp_graceful_restart
,
2778 no_bgp_graceful_restart_cmd
,
2779 "no bgp graceful-restart",
2785 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2787 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
2788 zlog_debug("[BGP_GR] no_bgp_graceful_restart_cmd : START ");
2790 int ret
= BGP_GR_FAILURE
;
2792 ret
= bgp_gr_update_all(bgp
, NO_GLOBAL_GR_CMD
);
2794 VTY_BGP_GR_ROUTER_DETECT_AND_SEND_CAPABILITY_TO_ZEBRA(bgp
, bgp
->peer
,
2797 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
2798 zlog_debug("[BGP_GR] no_bgp_graceful_restart_cmd : END ");
2800 "Graceful restart configuration changed, reset all peers to take effect\n");
2802 return bgp_vty_return(vty
, ret
);
2805 DEFUN (bgp_graceful_restart_stalepath_time
,
2806 bgp_graceful_restart_stalepath_time_cmd
,
2807 "bgp graceful-restart stalepath-time (1-4095)",
2809 "Graceful restart capability parameters\n"
2810 "Set the max time to hold onto restarting peer's stale paths\n"
2811 "Delay value (seconds)\n")
2813 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2817 stalepath
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2818 bgp
->stalepath_time
= stalepath
;
2822 DEFUN (bgp_graceful_restart_restart_time
,
2823 bgp_graceful_restart_restart_time_cmd
,
2824 "bgp graceful-restart restart-time (0-4095)",
2826 "Graceful restart capability parameters\n"
2827 "Set the time to wait to delete stale routes before a BGP open message is received\n"
2828 "Delay value (seconds)\n")
2830 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2834 restart
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2835 bgp
->restart_time
= restart
;
2839 DEFUN (bgp_graceful_restart_select_defer_time
,
2840 bgp_graceful_restart_select_defer_time_cmd
,
2841 "bgp graceful-restart select-defer-time (0-3600)",
2843 "Graceful restart capability parameters\n"
2844 "Set the time to defer the BGP route selection after restart\n"
2845 "Delay value (seconds, 0 - disable)\n")
2847 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2849 uint32_t defer_time
;
2851 defer_time
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2852 bgp
->select_defer_time
= defer_time
;
2853 if (defer_time
== 0)
2854 SET_FLAG(bgp
->flags
, BGP_FLAG_SELECT_DEFER_DISABLE
);
2856 UNSET_FLAG(bgp
->flags
, BGP_FLAG_SELECT_DEFER_DISABLE
);
2861 DEFUN (no_bgp_graceful_restart_stalepath_time
,
2862 no_bgp_graceful_restart_stalepath_time_cmd
,
2863 "no bgp graceful-restart stalepath-time [(1-4095)]",
2866 "Graceful restart capability parameters\n"
2867 "Set the max time to hold onto restarting peer's stale paths\n"
2868 "Delay value (seconds)\n")
2870 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2872 bgp
->stalepath_time
= BGP_DEFAULT_STALEPATH_TIME
;
2876 DEFUN (no_bgp_graceful_restart_restart_time
,
2877 no_bgp_graceful_restart_restart_time_cmd
,
2878 "no bgp graceful-restart restart-time [(0-4095)]",
2881 "Graceful restart capability parameters\n"
2882 "Set the time to wait to delete stale routes before a BGP open message is received\n"
2883 "Delay value (seconds)\n")
2885 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2887 bgp
->restart_time
= BGP_DEFAULT_RESTART_TIME
;
2891 DEFUN (no_bgp_graceful_restart_select_defer_time
,
2892 no_bgp_graceful_restart_select_defer_time_cmd
,
2893 "no bgp graceful-restart select-defer-time [(0-3600)]",
2896 "Graceful restart capability parameters\n"
2897 "Set the time to defer the BGP route selection after restart\n"
2898 "Delay value (seconds)\n")
2900 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2902 bgp
->select_defer_time
= BGP_DEFAULT_SELECT_DEFERRAL_TIME
;
2903 UNSET_FLAG(bgp
->flags
, BGP_FLAG_SELECT_DEFER_DISABLE
);
2908 DEFUN (bgp_graceful_restart_preserve_fw
,
2909 bgp_graceful_restart_preserve_fw_cmd
,
2910 "bgp graceful-restart preserve-fw-state",
2912 "Graceful restart capability parameters\n"
2913 "Sets F-bit indication that fib is preserved while doing Graceful Restart\n")
2915 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2916 SET_FLAG(bgp
->flags
, BGP_FLAG_GR_PRESERVE_FWD
);
2920 DEFUN (no_bgp_graceful_restart_preserve_fw
,
2921 no_bgp_graceful_restart_preserve_fw_cmd
,
2922 "no bgp graceful-restart preserve-fw-state",
2925 "Graceful restart capability parameters\n"
2926 "Unsets F-bit indication that fib is preserved while doing Graceful Restart\n")
2928 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2929 UNSET_FLAG(bgp
->flags
, BGP_FLAG_GR_PRESERVE_FWD
);
2933 DEFPY (bgp_graceful_restart_notification
,
2934 bgp_graceful_restart_notification_cmd
,
2935 "[no$no] bgp graceful-restart notification",
2938 "Graceful restart capability parameters\n"
2939 "Indicate Graceful Restart support for BGP NOTIFICATION messages\n")
2941 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2944 UNSET_FLAG(bgp
->flags
, BGP_FLAG_GRACEFUL_NOTIFICATION
);
2946 SET_FLAG(bgp
->flags
, BGP_FLAG_GRACEFUL_NOTIFICATION
);
2951 DEFPY (bgp_administrative_reset
,
2952 bgp_administrative_reset_cmd
,
2953 "[no$no] bgp hard-administrative-reset",
2956 "Send Hard Reset CEASE Notification for 'Administrative Reset'\n")
2958 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2961 UNSET_FLAG(bgp
->flags
, BGP_FLAG_HARD_ADMIN_RESET
);
2963 SET_FLAG(bgp
->flags
, BGP_FLAG_HARD_ADMIN_RESET
);
2968 DEFUN (bgp_graceful_restart_disable
,
2969 bgp_graceful_restart_disable_cmd
,
2970 "bgp graceful-restart-disable",
2974 int ret
= BGP_GR_FAILURE
;
2976 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
2978 "[BGP_GR] bgp_graceful_restart_disable_cmd : START ");
2980 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2982 ret
= bgp_gr_update_all(bgp
, GLOBAL_DISABLE_CMD
);
2984 VTY_BGP_GR_ROUTER_DETECT_AND_SEND_CAPABILITY_TO_ZEBRA(bgp
,
2987 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
2989 "[BGP_GR] bgp_graceful_restart_disable_cmd : END ");
2991 "Graceful restart configuration changed, reset all peers to take effect\n");
2993 return bgp_vty_return(vty
, ret
);
2996 DEFUN (no_bgp_graceful_restart_disable
,
2997 no_bgp_graceful_restart_disable_cmd
,
2998 "no bgp graceful-restart-disable",
3004 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3006 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
3008 "[BGP_GR] no_bgp_graceful_restart_disable_cmd : START ");
3010 int ret
= BGP_GR_FAILURE
;
3012 ret
= bgp_gr_update_all(bgp
, NO_GLOBAL_DISABLE_CMD
);
3014 VTY_BGP_GR_ROUTER_DETECT_AND_SEND_CAPABILITY_TO_ZEBRA(bgp
, bgp
->peer
,
3017 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
3019 "[BGP_GR] no_bgp_graceful_restart_disable_cmd : END ");
3021 "Graceful restart configuration changed, reset all peers to take effect\n");
3023 return bgp_vty_return(vty
, ret
);
3026 DEFUN (bgp_neighbor_graceful_restart_set
,
3027 bgp_neighbor_graceful_restart_set_cmd
,
3028 "neighbor <A.B.C.D|X:X::X:X|WORD> graceful-restart",
3036 int ret
= BGP_GR_FAILURE
;
3038 VTY_BGP_GR_DEFINE_LOOP_VARIABLE
;
3040 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
3042 "[BGP_GR] bgp_neighbor_graceful_restart_set_cmd : START ");
3044 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3046 return CMD_WARNING_CONFIG_FAILED
;
3048 ret
= bgp_neighbor_graceful_restart(peer
, PEER_GR_CMD
);
3050 VTY_BGP_GR_ROUTER_DETECT(bgp
, peer
, peer
->bgp
->peer
);
3051 VTY_SEND_BGP_GR_CAPABILITY_TO_ZEBRA(peer
->bgp
, ret
);
3053 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
3055 "[BGP_GR] bgp_neighbor_graceful_restart_set_cmd : END ");
3057 "Graceful restart configuration changed, reset this peer to take effect\n");
3059 return bgp_vty_return(vty
, ret
);
3062 DEFUN (no_bgp_neighbor_graceful_restart
,
3063 no_bgp_neighbor_graceful_restart_set_cmd
,
3064 "no neighbor <A.B.C.D|X:X::X:X|WORD> graceful-restart",
3072 int ret
= BGP_GR_FAILURE
;
3075 VTY_BGP_GR_DEFINE_LOOP_VARIABLE
;
3077 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3079 return CMD_WARNING_CONFIG_FAILED
;
3081 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
3083 "[BGP_GR] no_bgp_neighbor_graceful_restart_set_cmd : START ");
3085 ret
= bgp_neighbor_graceful_restart(peer
, NO_PEER_GR_CMD
);
3087 VTY_BGP_GR_ROUTER_DETECT(bgp
, peer
, peer
->bgp
->peer
);
3088 VTY_SEND_BGP_GR_CAPABILITY_TO_ZEBRA(peer
->bgp
, ret
);
3090 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
3092 "[BGP_GR] no_bgp_neighbor_graceful_restart_set_cmd : END ");
3094 "Graceful restart configuration changed, reset this peer to take effect\n");
3096 return bgp_vty_return(vty
, ret
);
3099 DEFUN (bgp_neighbor_graceful_restart_helper_set
,
3100 bgp_neighbor_graceful_restart_helper_set_cmd
,
3101 "neighbor <A.B.C.D|X:X::X:X|WORD> graceful-restart-helper",
3104 GR_NEIGHBOR_HELPER_CMD
3109 int ret
= BGP_GR_FAILURE
;
3111 VTY_BGP_GR_DEFINE_LOOP_VARIABLE
;
3113 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
3115 "[BGP_GR] bgp_neighbor_graceful_restart_helper_set_cmd : START ");
3117 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3120 return CMD_WARNING_CONFIG_FAILED
;
3123 ret
= bgp_neighbor_graceful_restart(peer
, PEER_HELPER_CMD
);
3125 VTY_BGP_GR_ROUTER_DETECT(bgp
, peer
, peer
->bgp
->peer
);
3126 VTY_SEND_BGP_GR_CAPABILITY_TO_ZEBRA(peer
->bgp
, ret
);
3128 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
3130 "[BGP_GR] bgp_neighbor_graceful_restart_helper_set_cmd : END ");
3132 "Graceful restart configuration changed, reset this peer to take effect\n");
3134 return bgp_vty_return(vty
, ret
);
3137 DEFUN (no_bgp_neighbor_graceful_restart_helper
,
3138 no_bgp_neighbor_graceful_restart_helper_set_cmd
,
3139 "no neighbor <A.B.C.D|X:X::X:X|WORD> graceful-restart-helper",
3143 NO_GR_NEIGHBOR_HELPER_CMD
3147 int ret
= BGP_GR_FAILURE
;
3150 VTY_BGP_GR_DEFINE_LOOP_VARIABLE
;
3152 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3154 return CMD_WARNING_CONFIG_FAILED
;
3156 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
3158 "[BGP_GR] no_bgp_neighbor_graceful_restart_helper_set_cmd : START ");
3160 ret
= bgp_neighbor_graceful_restart(peer
, NO_PEER_HELPER_CMD
);
3162 VTY_BGP_GR_ROUTER_DETECT(bgp
, peer
, peer
->bgp
->peer
);
3163 VTY_SEND_BGP_GR_CAPABILITY_TO_ZEBRA(peer
->bgp
, ret
);
3165 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
3167 "[BGP_GR] no_bgp_neighbor_graceful_restart_helper_set_cmd : END ");
3169 "Graceful restart configuration changed, reset this peer to take effect\n");
3171 return bgp_vty_return(vty
, ret
);
3174 DEFUN (bgp_neighbor_graceful_restart_disable_set
,
3175 bgp_neighbor_graceful_restart_disable_set_cmd
,
3176 "neighbor <A.B.C.D|X:X::X:X|WORD> graceful-restart-disable",
3179 GR_NEIGHBOR_DISABLE_CMD
3184 int ret
= BGP_GR_FAILURE
;
3186 VTY_BGP_GR_DEFINE_LOOP_VARIABLE
;
3188 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
3190 "[BGP_GR] bgp_neighbor_graceful_restart_disable_set_cmd : START ");
3192 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3194 return CMD_WARNING_CONFIG_FAILED
;
3196 ret
= bgp_neighbor_graceful_restart(peer
, PEER_DISABLE_CMD
);
3198 if (peer
->bgp
->t_startup
)
3199 bgp_peer_gr_flags_update(peer
);
3201 VTY_BGP_GR_ROUTER_DETECT(bgp
, peer
, peer
->bgp
->peer
);
3202 VTY_SEND_BGP_GR_CAPABILITY_TO_ZEBRA(peer
->bgp
, ret
);
3204 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
3206 "[BGP_GR]bgp_neighbor_graceful_restart_disable_set_cmd : END ");
3208 "Graceful restart configuration changed, reset this peer to take effect\n");
3210 return bgp_vty_return(vty
, ret
);
3213 DEFUN (no_bgp_neighbor_graceful_restart_disable
,
3214 no_bgp_neighbor_graceful_restart_disable_set_cmd
,
3215 "no neighbor <A.B.C.D|X:X::X:X|WORD> graceful-restart-disable",
3219 NO_GR_NEIGHBOR_DISABLE_CMD
3223 int ret
= BGP_GR_FAILURE
;
3226 VTY_BGP_GR_DEFINE_LOOP_VARIABLE
;
3228 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3230 return CMD_WARNING_CONFIG_FAILED
;
3232 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
3234 "[BGP_GR] no_bgp_neighbor_graceful_restart_disable_set_cmd : START ");
3236 ret
= bgp_neighbor_graceful_restart(peer
, NO_PEER_DISABLE_CMD
);
3238 VTY_BGP_GR_ROUTER_DETECT(bgp
, peer
, peer
->bgp
->peer
);
3239 VTY_SEND_BGP_GR_CAPABILITY_TO_ZEBRA(peer
->bgp
, ret
);
3241 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
3243 "[BGP_GR] no_bgp_neighbor_graceful_restart_disable_set_cmd : END ");
3245 "Graceful restart configuration changed, reset this peer to take effect\n");
3247 return bgp_vty_return(vty
, ret
);
3250 DEFUN_HIDDEN (bgp_graceful_restart_disable_eor
,
3251 bgp_graceful_restart_disable_eor_cmd
,
3252 "bgp graceful-restart disable-eor",
3254 "Graceful restart configuration parameters\n"
3255 "Disable EOR Check\n")
3257 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3258 SET_FLAG(bgp
->flags
, BGP_FLAG_GR_DISABLE_EOR
);
3263 DEFUN_HIDDEN (no_bgp_graceful_restart_disable_eor
,
3264 no_bgp_graceful_restart_disable_eor_cmd
,
3265 "no bgp graceful-restart disable-eor",
3268 "Graceful restart configuration parameters\n"
3269 "Disable EOR Check\n")
3271 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3272 UNSET_FLAG(bgp
->flags
, BGP_FLAG_GR_DISABLE_EOR
);
3277 DEFUN (bgp_graceful_restart_rib_stale_time
,
3278 bgp_graceful_restart_rib_stale_time_cmd
,
3279 "bgp graceful-restart rib-stale-time (1-3600)",
3281 "Graceful restart configuration parameters\n"
3282 "Specify the stale route removal timer in rib\n"
3283 "Delay value (seconds)\n")
3285 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3287 uint32_t stale_time
;
3289 stale_time
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
3290 bgp
->rib_stale_time
= stale_time
;
3291 /* Send the stale timer update message to RIB */
3292 if (bgp_zebra_stale_timer_update(bgp
))
3298 DEFUN (no_bgp_graceful_restart_rib_stale_time
,
3299 no_bgp_graceful_restart_rib_stale_time_cmd
,
3300 "no bgp graceful-restart rib-stale-time [(1-3600)]",
3303 "Graceful restart configuration parameters\n"
3304 "Specify the stale route removal timer in rib\n"
3305 "Delay value (seconds)\n")
3307 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3309 bgp
->rib_stale_time
= BGP_DEFAULT_RIB_STALE_TIME
;
3310 /* Send the stale timer update message to RIB */
3311 if (bgp_zebra_stale_timer_update(bgp
))
3317 DEFUN(bgp_llgr_stalepath_time
, bgp_llgr_stalepath_time_cmd
,
3318 "bgp long-lived-graceful-restart stale-time (1-4294967295)",
3320 "Enable Long-lived Graceful Restart\n"
3321 "Specifies maximum time to wait before purging long-lived stale routes\n"
3322 "Stale time value (seconds)\n")
3324 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3326 uint32_t llgr_stale_time
;
3328 llgr_stale_time
= strtoul(argv
[3]->arg
, NULL
, 10);
3329 bgp
->llgr_stale_time
= llgr_stale_time
;
3334 DEFUN(no_bgp_llgr_stalepath_time
, no_bgp_llgr_stalepath_time_cmd
,
3335 "no bgp long-lived-graceful-restart stale-time [(1-4294967295)]",
3337 "Enable Long-lived Graceful Restart\n"
3338 "Specifies maximum time to wait before purging long-lived stale routes\n"
3339 "Stale time value (seconds)\n")
3341 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3343 bgp
->llgr_stale_time
= BGP_DEFAULT_LLGR_STALE_TIME
;
3348 static inline void bgp_initiate_graceful_shut_unshut(struct vty
*vty
,
3351 bgp_static_redo_import_check(bgp
);
3352 bgp_redistribute_redo(bgp
);
3353 bgp_clear_star_soft_out(vty
, bgp
->name
);
3354 bgp_clear_star_soft_in(vty
, bgp
->name
);
3357 static int bgp_global_graceful_shutdown_config_vty(struct vty
*vty
)
3359 struct listnode
*node
, *nnode
;
3361 bool vrf_cfg
= false;
3363 if (CHECK_FLAG(bm
->flags
, BM_FLAG_GRACEFUL_SHUTDOWN
))
3366 /* See if graceful-shutdown is set per-vrf and warn user to delete */
3367 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
3368 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_GRACEFUL_SHUTDOWN
)) {
3370 "%% graceful-shutdown configuration found in vrf %s\n",
3371 bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
?
3372 VRF_DEFAULT_NAME
: bgp
->name
);
3379 "%%Failed: global graceful-shutdown not permitted\n");
3383 /* Set flag globally */
3384 SET_FLAG(bm
->flags
, BM_FLAG_GRACEFUL_SHUTDOWN
);
3386 /* Initiate processing for all BGP instances. */
3387 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
))
3388 bgp_initiate_graceful_shut_unshut(vty
, bgp
);
3393 static int bgp_global_graceful_shutdown_deconfig_vty(struct vty
*vty
)
3395 struct listnode
*node
, *nnode
;
3398 if (!CHECK_FLAG(bm
->flags
, BM_FLAG_GRACEFUL_SHUTDOWN
))
3401 /* Unset flag globally */
3402 UNSET_FLAG(bm
->flags
, BM_FLAG_GRACEFUL_SHUTDOWN
);
3404 /* Initiate processing for all BGP instances. */
3405 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
))
3406 bgp_initiate_graceful_shut_unshut(vty
, bgp
);
3411 /* "bgp graceful-shutdown" configuration */
3412 DEFUN (bgp_graceful_shutdown
,
3413 bgp_graceful_shutdown_cmd
,
3414 "bgp graceful-shutdown",
3416 "Graceful shutdown parameters\n")
3418 if (vty
->node
== CONFIG_NODE
)
3419 return bgp_global_graceful_shutdown_config_vty(vty
);
3421 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3423 /* if configured globally, per-instance config is not allowed */
3424 if (CHECK_FLAG(bm
->flags
, BM_FLAG_GRACEFUL_SHUTDOWN
)) {
3426 "%%Failed: per-vrf graceful-shutdown config not permitted with global graceful-shutdown\n");
3427 return CMD_WARNING_CONFIG_FAILED
;
3430 if (!CHECK_FLAG(bgp
->flags
, BGP_FLAG_GRACEFUL_SHUTDOWN
)) {
3431 SET_FLAG(bgp
->flags
, BGP_FLAG_GRACEFUL_SHUTDOWN
);
3432 bgp_initiate_graceful_shut_unshut(vty
, bgp
);
3438 DEFUN (no_bgp_graceful_shutdown
,
3439 no_bgp_graceful_shutdown_cmd
,
3440 "no bgp graceful-shutdown",
3443 "Graceful shutdown parameters\n")
3445 if (vty
->node
== CONFIG_NODE
)
3446 return bgp_global_graceful_shutdown_deconfig_vty(vty
);
3448 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3450 /* If configured globally, cannot remove from one bgp instance */
3451 if (CHECK_FLAG(bm
->flags
, BM_FLAG_GRACEFUL_SHUTDOWN
)) {
3453 "%%Failed: bgp graceful-shutdown configured globally. Delete per-vrf not permitted\n");
3454 return CMD_WARNING_CONFIG_FAILED
;
3457 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_GRACEFUL_SHUTDOWN
)) {
3458 UNSET_FLAG(bgp
->flags
, BGP_FLAG_GRACEFUL_SHUTDOWN
);
3459 bgp_initiate_graceful_shut_unshut(vty
, bgp
);
3465 /* "bgp fast-external-failover" configuration. */
3466 DEFUN (bgp_fast_external_failover
,
3467 bgp_fast_external_failover_cmd
,
3468 "bgp fast-external-failover",
3470 "Immediately reset session if a link to a directly connected external peer goes down\n")
3472 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3473 UNSET_FLAG(bgp
->flags
, BGP_FLAG_NO_FAST_EXT_FAILOVER
);
3477 DEFUN (no_bgp_fast_external_failover
,
3478 no_bgp_fast_external_failover_cmd
,
3479 "no bgp fast-external-failover",
3482 "Immediately reset session if a link to a directly connected external peer goes down\n")
3484 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3485 SET_FLAG(bgp
->flags
, BGP_FLAG_NO_FAST_EXT_FAILOVER
);
3489 /* "bgp bestpath compare-routerid" configuration. */
3490 DEFUN (bgp_bestpath_compare_router_id
,
3491 bgp_bestpath_compare_router_id_cmd
,
3492 "bgp bestpath compare-routerid",
3494 "Change the default bestpath selection\n"
3495 "Compare router-id for identical EBGP paths\n")
3497 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3498 SET_FLAG(bgp
->flags
, BGP_FLAG_COMPARE_ROUTER_ID
);
3499 bgp_recalculate_all_bestpaths(bgp
);
3504 DEFUN (no_bgp_bestpath_compare_router_id
,
3505 no_bgp_bestpath_compare_router_id_cmd
,
3506 "no bgp bestpath compare-routerid",
3509 "Change the default bestpath selection\n"
3510 "Compare router-id for identical EBGP paths\n")
3512 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3513 UNSET_FLAG(bgp
->flags
, BGP_FLAG_COMPARE_ROUTER_ID
);
3514 bgp_recalculate_all_bestpaths(bgp
);
3519 /* "bgp bestpath as-path ignore" configuration. */
3520 DEFUN (bgp_bestpath_aspath_ignore
,
3521 bgp_bestpath_aspath_ignore_cmd
,
3522 "bgp bestpath as-path ignore",
3524 "Change the default bestpath selection\n"
3525 "AS-path attribute\n"
3526 "Ignore as-path length in selecting a route\n")
3528 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3529 SET_FLAG(bgp
->flags
, BGP_FLAG_ASPATH_IGNORE
);
3530 bgp_recalculate_all_bestpaths(bgp
);
3535 DEFUN (no_bgp_bestpath_aspath_ignore
,
3536 no_bgp_bestpath_aspath_ignore_cmd
,
3537 "no bgp bestpath as-path ignore",
3540 "Change the default bestpath selection\n"
3541 "AS-path attribute\n"
3542 "Ignore as-path length in selecting a route\n")
3544 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3545 UNSET_FLAG(bgp
->flags
, BGP_FLAG_ASPATH_IGNORE
);
3546 bgp_recalculate_all_bestpaths(bgp
);
3551 /* "bgp bestpath as-path confed" configuration. */
3552 DEFUN (bgp_bestpath_aspath_confed
,
3553 bgp_bestpath_aspath_confed_cmd
,
3554 "bgp bestpath as-path confed",
3556 "Change the default bestpath selection\n"
3557 "AS-path attribute\n"
3558 "Compare path lengths including confederation sets & sequences in selecting a route\n")
3560 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3561 SET_FLAG(bgp
->flags
, BGP_FLAG_ASPATH_CONFED
);
3562 bgp_recalculate_all_bestpaths(bgp
);
3567 DEFUN (no_bgp_bestpath_aspath_confed
,
3568 no_bgp_bestpath_aspath_confed_cmd
,
3569 "no bgp bestpath as-path confed",
3572 "Change the default bestpath selection\n"
3573 "AS-path attribute\n"
3574 "Compare path lengths including confederation sets & sequences in selecting a route\n")
3576 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3577 UNSET_FLAG(bgp
->flags
, BGP_FLAG_ASPATH_CONFED
);
3578 bgp_recalculate_all_bestpaths(bgp
);
3583 /* "bgp bestpath as-path multipath-relax" configuration. */
3584 DEFUN (bgp_bestpath_aspath_multipath_relax
,
3585 bgp_bestpath_aspath_multipath_relax_cmd
,
3586 "bgp bestpath as-path multipath-relax [<as-set|no-as-set>]",
3588 "Change the default bestpath selection\n"
3589 "AS-path attribute\n"
3590 "Allow load sharing across routes that have different AS paths (but same length)\n"
3591 "Generate an AS_SET\n"
3592 "Do not generate an AS_SET\n")
3594 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3596 SET_FLAG(bgp
->flags
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
);
3598 /* no-as-set is now the default behavior so we can silently
3600 if (argv_find(argv
, argc
, "as-set", &idx
))
3601 SET_FLAG(bgp
->flags
, BGP_FLAG_MULTIPATH_RELAX_AS_SET
);
3603 UNSET_FLAG(bgp
->flags
, BGP_FLAG_MULTIPATH_RELAX_AS_SET
);
3605 bgp_recalculate_all_bestpaths(bgp
);
3610 DEFUN (no_bgp_bestpath_aspath_multipath_relax
,
3611 no_bgp_bestpath_aspath_multipath_relax_cmd
,
3612 "no bgp bestpath as-path multipath-relax [<as-set|no-as-set>]",
3615 "Change the default bestpath selection\n"
3616 "AS-path attribute\n"
3617 "Allow load sharing across routes that have different AS paths (but same length)\n"
3618 "Generate an AS_SET\n"
3619 "Do not generate an AS_SET\n")
3621 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3622 UNSET_FLAG(bgp
->flags
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
);
3623 UNSET_FLAG(bgp
->flags
, BGP_FLAG_MULTIPATH_RELAX_AS_SET
);
3624 bgp_recalculate_all_bestpaths(bgp
);
3629 /* "bgp bestpath peer-type multipath-relax" configuration. */
3630 DEFUN(bgp_bestpath_peer_type_multipath_relax
,
3631 bgp_bestpath_peer_type_multipath_relax_cmd
,
3632 "bgp bestpath peer-type multipath-relax",
3634 "Change the default bestpath selection\n"
3636 "Allow load sharing across routes learned from different peer types\n")
3638 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3639 SET_FLAG(bgp
->flags
, BGP_FLAG_PEERTYPE_MULTIPATH_RELAX
);
3640 bgp_recalculate_all_bestpaths(bgp
);
3645 DEFUN(no_bgp_bestpath_peer_type_multipath_relax
,
3646 no_bgp_bestpath_peer_type_multipath_relax_cmd
,
3647 "no bgp bestpath peer-type multipath-relax",
3649 "Change the default bestpath selection\n"
3651 "Allow load sharing across routes learned from different peer types\n")
3653 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3654 UNSET_FLAG(bgp
->flags
, BGP_FLAG_PEERTYPE_MULTIPATH_RELAX
);
3655 bgp_recalculate_all_bestpaths(bgp
);
3660 /* "bgp log-neighbor-changes" configuration. */
3661 DEFUN (bgp_log_neighbor_changes
,
3662 bgp_log_neighbor_changes_cmd
,
3663 "bgp log-neighbor-changes",
3665 "Log neighbor up/down and reset reason\n")
3667 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3668 SET_FLAG(bgp
->flags
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
);
3672 DEFUN (no_bgp_log_neighbor_changes
,
3673 no_bgp_log_neighbor_changes_cmd
,
3674 "no bgp log-neighbor-changes",
3677 "Log neighbor up/down and reset reason\n")
3679 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3680 UNSET_FLAG(bgp
->flags
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
);
3684 /* "bgp bestpath med" configuration. */
3685 DEFUN (bgp_bestpath_med
,
3686 bgp_bestpath_med_cmd
,
3687 "bgp bestpath med <confed [missing-as-worst]|missing-as-worst [confed]>",
3689 "Change the default bestpath selection\n"
3691 "Compare MED among confederation paths\n"
3692 "Treat missing MED as the least preferred one\n"
3693 "Treat missing MED as the least preferred one\n"
3694 "Compare MED among confederation paths\n")
3696 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3699 if (argv_find(argv
, argc
, "confed", &idx
))
3700 SET_FLAG(bgp
->flags
, BGP_FLAG_MED_CONFED
);
3702 if (argv_find(argv
, argc
, "missing-as-worst", &idx
))
3703 SET_FLAG(bgp
->flags
, BGP_FLAG_MED_MISSING_AS_WORST
);
3705 bgp_recalculate_all_bestpaths(bgp
);
3710 DEFUN (no_bgp_bestpath_med
,
3711 no_bgp_bestpath_med_cmd
,
3712 "no bgp bestpath med <confed [missing-as-worst]|missing-as-worst [confed]>",
3715 "Change the default bestpath selection\n"
3717 "Compare MED among confederation paths\n"
3718 "Treat missing MED as the least preferred one\n"
3719 "Treat missing MED as the least preferred one\n"
3720 "Compare MED among confederation paths\n")
3722 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3725 if (argv_find(argv
, argc
, "confed", &idx
))
3726 UNSET_FLAG(bgp
->flags
, BGP_FLAG_MED_CONFED
);
3728 if (argv_find(argv
, argc
, "missing-as-worst", &idx
))
3729 UNSET_FLAG(bgp
->flags
, BGP_FLAG_MED_MISSING_AS_WORST
);
3731 bgp_recalculate_all_bestpaths(bgp
);
3736 /* "bgp bestpath bandwidth" configuration. */
3737 DEFPY (bgp_bestpath_bw
,
3738 bgp_bestpath_bw_cmd
,
3739 "bgp bestpath bandwidth <ignore|skip-missing|default-weight-for-missing>$bw_cfg",
3741 "Change the default bestpath selection\n"
3742 "Link Bandwidth attribute\n"
3743 "Ignore link bandwidth (i.e., do regular ECMP, not weighted)\n"
3744 "Ignore paths without link bandwidth for ECMP (if other paths have it)\n"
3745 "Assign a low default weight (value 1) to paths not having link bandwidth\n")
3747 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3752 vty_out(vty
, "%% Bandwidth configuration must be specified\n");
3753 return CMD_ERR_INCOMPLETE
;
3755 if (!strcmp(bw_cfg
, "ignore"))
3756 bgp
->lb_handling
= BGP_LINK_BW_IGNORE_BW
;
3757 else if (!strcmp(bw_cfg
, "skip-missing"))
3758 bgp
->lb_handling
= BGP_LINK_BW_SKIP_MISSING
;
3759 else if (!strcmp(bw_cfg
, "default-weight-for-missing"))
3760 bgp
->lb_handling
= BGP_LINK_BW_DEFWT_4_MISSING
;
3762 return CMD_ERR_NO_MATCH
;
3764 /* This config is used in route install, so redo that. */
3765 FOREACH_AFI_SAFI (afi
, safi
) {
3766 if (!bgp_fibupd_safi(safi
))
3768 bgp_zebra_announce_table(bgp
, afi
, safi
);
3774 DEFPY (no_bgp_bestpath_bw
,
3775 no_bgp_bestpath_bw_cmd
,
3776 "no bgp bestpath bandwidth [<ignore|skip-missing|default-weight-for-missing>$bw_cfg]",
3779 "Change the default bestpath selection\n"
3780 "Link Bandwidth attribute\n"
3781 "Ignore link bandwidth (i.e., do regular ECMP, not weighted)\n"
3782 "Ignore paths without link bandwidth for ECMP (if other paths have it)\n"
3783 "Assign a low default weight (value 1) to paths not having link bandwidth\n")
3785 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3789 bgp
->lb_handling
= BGP_LINK_BW_ECMP
;
3791 /* This config is used in route install, so redo that. */
3792 FOREACH_AFI_SAFI (afi
, safi
) {
3793 if (!bgp_fibupd_safi(safi
))
3795 bgp_zebra_announce_table(bgp
, afi
, safi
);
3800 DEFPY(bgp_default_afi_safi
, bgp_default_afi_safi_cmd
,
3801 "[no] bgp default <ipv4-unicast|"
3804 "ipv4-labeled-unicast|"
3809 "ipv6-labeled-unicast|"
3811 "l2vpn-evpn>$afi_safi",
3814 "Configure BGP defaults\n"
3815 "Activate ipv4-unicast for a peer by default\n"
3816 "Activate ipv4-multicast for a peer by default\n"
3817 "Activate ipv4-vpn for a peer by default\n"
3818 "Activate ipv4-labeled-unicast for a peer by default\n"
3819 "Activate ipv4-flowspec for a peer by default\n"
3820 "Activate ipv6-unicast for a peer by default\n"
3821 "Activate ipv6-multicast for a peer by default\n"
3822 "Activate ipv6-vpn for a peer by default\n"
3823 "Activate ipv6-labeled-unicast for a peer by default\n"
3824 "Activate ipv6-flowspec for a peer by default\n"
3825 "Activate l2vpn-evpn for a peer by default\n")
3827 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3828 char afi_safi_str
[strlen(afi_safi
) + 1];
3829 char *afi_safi_str_tok
;
3831 strlcpy(afi_safi_str
, afi_safi
, sizeof(afi_safi_str
));
3832 char *afi_str
= strtok_r(afi_safi_str
, "-", &afi_safi_str_tok
);
3833 char *safi_str
= strtok_r(NULL
, "-", &afi_safi_str_tok
);
3834 afi_t afi
= bgp_vty_afi_from_str(afi_str
);
3837 if (strmatch(safi_str
, "labeled"))
3838 safi
= bgp_vty_safi_from_str("labeled-unicast");
3840 safi
= bgp_vty_safi_from_str(safi_str
);
3843 bgp
->default_af
[afi
][safi
] = false;
3845 if ((safi
== SAFI_LABELED_UNICAST
3846 && bgp
->default_af
[afi
][SAFI_UNICAST
])
3847 || (safi
== SAFI_UNICAST
3848 && bgp
->default_af
[afi
][SAFI_LABELED_UNICAST
]))
3849 bgp_vty_return(vty
, BGP_ERR_PEER_SAFI_CONFLICT
);
3851 bgp
->default_af
[afi
][safi
] = true;
3857 /* Display hostname in certain command outputs */
3858 DEFUN (bgp_default_show_hostname
,
3859 bgp_default_show_hostname_cmd
,
3860 "bgp default show-hostname",
3862 "Configure BGP defaults\n"
3863 "Show hostname in certain command outputs\n")
3865 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3866 SET_FLAG(bgp
->flags
, BGP_FLAG_SHOW_HOSTNAME
);
3870 DEFUN (no_bgp_default_show_hostname
,
3871 no_bgp_default_show_hostname_cmd
,
3872 "no bgp default show-hostname",
3875 "Configure BGP defaults\n"
3876 "Show hostname in certain command outputs\n")
3878 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3879 UNSET_FLAG(bgp
->flags
, BGP_FLAG_SHOW_HOSTNAME
);
3883 /* Display hostname in certain command outputs */
3884 DEFUN (bgp_default_show_nexthop_hostname
,
3885 bgp_default_show_nexthop_hostname_cmd
,
3886 "bgp default show-nexthop-hostname",
3888 "Configure BGP defaults\n"
3889 "Show hostname for nexthop in certain command outputs\n")
3891 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3892 SET_FLAG(bgp
->flags
, BGP_FLAG_SHOW_NEXTHOP_HOSTNAME
);
3896 DEFUN (no_bgp_default_show_nexthop_hostname
,
3897 no_bgp_default_show_nexthop_hostname_cmd
,
3898 "no bgp default show-nexthop-hostname",
3901 "Configure BGP defaults\n"
3902 "Show hostname for nexthop in certain command outputs\n")
3904 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3905 UNSET_FLAG(bgp
->flags
, BGP_FLAG_SHOW_NEXTHOP_HOSTNAME
);
3909 /* "bgp network import-check" configuration. */
3910 DEFUN (bgp_network_import_check
,
3911 bgp_network_import_check_cmd
,
3912 "bgp network import-check",
3914 "BGP network command\n"
3915 "Check BGP network route exists in IGP\n")
3917 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3918 if (!CHECK_FLAG(bgp
->flags
, BGP_FLAG_IMPORT_CHECK
)) {
3919 SET_FLAG(bgp
->flags
, BGP_FLAG_IMPORT_CHECK
);
3920 bgp_static_redo_import_check(bgp
);
3926 ALIAS_HIDDEN(bgp_network_import_check
, bgp_network_import_check_exact_cmd
,
3927 "bgp network import-check exact",
3929 "BGP network command\n"
3930 "Check BGP network route exists in IGP\n"
3931 "Match route precisely\n")
3933 DEFUN (no_bgp_network_import_check
,
3934 no_bgp_network_import_check_cmd
,
3935 "no bgp network import-check",
3938 "BGP network command\n"
3939 "Check BGP network route exists in IGP\n")
3941 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3942 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_IMPORT_CHECK
)) {
3943 UNSET_FLAG(bgp
->flags
, BGP_FLAG_IMPORT_CHECK
);
3944 bgp_static_redo_import_check(bgp
);
3950 DEFUN (bgp_default_local_preference
,
3951 bgp_default_local_preference_cmd
,
3952 "bgp default local-preference (0-4294967295)",
3954 "Configure BGP defaults\n"
3955 "local preference (higher=more preferred)\n"
3956 "Configure default local preference value\n")
3958 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3960 uint32_t local_pref
;
3962 local_pref
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
3964 bgp_default_local_preference_set(bgp
, local_pref
);
3965 bgp_clear_star_soft_in(vty
, bgp
->name
);
3970 DEFUN (no_bgp_default_local_preference
,
3971 no_bgp_default_local_preference_cmd
,
3972 "no bgp default local-preference [(0-4294967295)]",
3975 "Configure BGP defaults\n"
3976 "local preference (higher=more preferred)\n"
3977 "Configure default local preference value\n")
3979 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3980 bgp_default_local_preference_unset(bgp
);
3981 bgp_clear_star_soft_in(vty
, bgp
->name
);
3987 DEFUN (bgp_default_subgroup_pkt_queue_max
,
3988 bgp_default_subgroup_pkt_queue_max_cmd
,
3989 "bgp default subgroup-pkt-queue-max (20-100)",
3991 "Configure BGP defaults\n"
3992 "subgroup-pkt-queue-max\n"
3993 "Configure subgroup packet queue max\n")
3995 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3999 max_size
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
4001 bgp_default_subgroup_pkt_queue_max_set(bgp
, max_size
);
4006 DEFUN (no_bgp_default_subgroup_pkt_queue_max
,
4007 no_bgp_default_subgroup_pkt_queue_max_cmd
,
4008 "no bgp default subgroup-pkt-queue-max [(20-100)]",
4011 "Configure BGP defaults\n"
4012 "subgroup-pkt-queue-max\n"
4013 "Configure subgroup packet queue max\n")
4015 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4016 bgp_default_subgroup_pkt_queue_max_unset(bgp
);
4021 DEFUN (bgp_rr_allow_outbound_policy
,
4022 bgp_rr_allow_outbound_policy_cmd
,
4023 "bgp route-reflector allow-outbound-policy",
4025 "Allow modifications made by out route-map\n"
4026 "on ibgp neighbors\n")
4028 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4030 if (!CHECK_FLAG(bgp
->flags
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
)) {
4031 SET_FLAG(bgp
->flags
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
);
4032 update_group_announce_rrclients(bgp
);
4033 bgp_clear_star_soft_out(vty
, bgp
->name
);
4039 DEFUN (no_bgp_rr_allow_outbound_policy
,
4040 no_bgp_rr_allow_outbound_policy_cmd
,
4041 "no bgp route-reflector allow-outbound-policy",
4044 "Allow modifications made by out route-map\n"
4045 "on ibgp neighbors\n")
4047 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4049 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
)) {
4050 UNSET_FLAG(bgp
->flags
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
);
4051 update_group_announce_rrclients(bgp
);
4052 bgp_clear_star_soft_out(vty
, bgp
->name
);
4058 DEFUN (bgp_listen_limit
,
4059 bgp_listen_limit_cmd
,
4060 "bgp listen limit (1-65535)",
4062 "BGP Dynamic Neighbors listen commands\n"
4063 "Maximum number of BGP Dynamic Neighbors that can be created\n"
4064 "Configure Dynamic Neighbors listen limit value\n")
4066 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4070 listen_limit
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
4072 bgp_listen_limit_set(bgp
, listen_limit
);
4077 DEFUN (no_bgp_listen_limit
,
4078 no_bgp_listen_limit_cmd
,
4079 "no bgp listen limit [(1-65535)]",
4082 "BGP Dynamic Neighbors listen commands\n"
4083 "Maximum number of BGP Dynamic Neighbors that can be created\n"
4084 "Configure Dynamic Neighbors listen limit value\n")
4086 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4087 bgp_listen_limit_unset(bgp
);
4093 * Check if this listen range is already configured. Check for exact
4094 * match or overlap based on input.
4096 static struct peer_group
*listen_range_exists(struct bgp
*bgp
,
4097 struct prefix
*range
, int exact
)
4099 struct listnode
*node
, *nnode
;
4100 struct listnode
*node1
, *nnode1
;
4101 struct peer_group
*group
;
4106 afi
= family2afi(range
->family
);
4107 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
4108 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], node1
, nnode1
,
4111 match
= prefix_same(range
, lr
);
4113 match
= (prefix_match(range
, lr
)
4114 || prefix_match(lr
, range
));
4123 DEFUN (bgp_listen_range
,
4124 bgp_listen_range_cmd
,
4125 "bgp listen range <A.B.C.D/M|X:X::X:X/M> peer-group PGNAME",
4127 "Configure BGP dynamic neighbors listen range\n"
4128 "Configure BGP dynamic neighbors listen range\n"
4130 "Member of the peer-group\n"
4131 "Peer-group name\n")
4133 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4134 struct prefix range
;
4135 struct peer_group
*group
, *existing_group
;
4140 argv_find(argv
, argc
, "A.B.C.D/M", &idx
);
4141 argv_find(argv
, argc
, "X:X::X:X/M", &idx
);
4142 char *prefix
= argv
[idx
]->arg
;
4143 argv_find(argv
, argc
, "PGNAME", &idx
);
4144 char *peergroup
= argv
[idx
]->arg
;
4146 /* Convert IP prefix string to struct prefix. */
4147 ret
= str2prefix(prefix
, &range
);
4149 vty_out(vty
, "%% Malformed listen range\n");
4150 return CMD_WARNING_CONFIG_FAILED
;
4153 afi
= family2afi(range
.family
);
4155 if (afi
== AFI_IP6
&& IN6_IS_ADDR_LINKLOCAL(&range
.u
.prefix6
)) {
4157 "%% Malformed listen range (link-local address)\n");
4158 return CMD_WARNING_CONFIG_FAILED
;
4163 /* Check if same listen range is already configured. */
4164 existing_group
= listen_range_exists(bgp
, &range
, 1);
4165 if (existing_group
) {
4166 if (strcmp(existing_group
->name
, peergroup
) == 0)
4170 "%% Same listen range is attached to peer-group %s\n",
4171 existing_group
->name
);
4172 return CMD_WARNING_CONFIG_FAILED
;
4176 /* Check if an overlapping listen range exists. */
4177 if (listen_range_exists(bgp
, &range
, 0)) {
4179 "%% Listen range overlaps with existing listen range\n");
4180 return CMD_WARNING_CONFIG_FAILED
;
4183 group
= peer_group_lookup(bgp
, peergroup
);
4185 vty_out(vty
, "%% Configure the peer-group first\n");
4186 return CMD_WARNING_CONFIG_FAILED
;
4189 ret
= peer_group_listen_range_add(group
, &range
);
4190 return bgp_vty_return(vty
, ret
);
4193 DEFUN (no_bgp_listen_range
,
4194 no_bgp_listen_range_cmd
,
4195 "no bgp listen range <A.B.C.D/M|X:X::X:X/M> peer-group PGNAME",
4198 "Unconfigure BGP dynamic neighbors listen range\n"
4199 "Unconfigure BGP dynamic neighbors listen range\n"
4201 "Member of the peer-group\n"
4202 "Peer-group name\n")
4204 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4205 struct prefix range
;
4206 struct peer_group
*group
;
4211 argv_find(argv
, argc
, "A.B.C.D/M", &idx
);
4212 argv_find(argv
, argc
, "X:X::X:X/M", &idx
);
4213 char *prefix
= argv
[idx
]->arg
;
4214 argv_find(argv
, argc
, "PGNAME", &idx
);
4215 char *peergroup
= argv
[idx
]->arg
;
4217 /* Convert IP prefix string to struct prefix. */
4218 ret
= str2prefix(prefix
, &range
);
4220 vty_out(vty
, "%% Malformed listen range\n");
4221 return CMD_WARNING_CONFIG_FAILED
;
4224 afi
= family2afi(range
.family
);
4226 if (afi
== AFI_IP6
&& IN6_IS_ADDR_LINKLOCAL(&range
.u
.prefix6
)) {
4228 "%% Malformed listen range (link-local address)\n");
4229 return CMD_WARNING_CONFIG_FAILED
;
4234 group
= peer_group_lookup(bgp
, peergroup
);
4236 vty_out(vty
, "%% Peer-group does not exist\n");
4237 return CMD_WARNING_CONFIG_FAILED
;
4240 ret
= peer_group_listen_range_del(group
, &range
);
4241 return bgp_vty_return(vty
, ret
);
4244 void bgp_config_write_listen(struct vty
*vty
, struct bgp
*bgp
)
4246 struct peer_group
*group
;
4247 struct listnode
*node
, *nnode
, *rnode
, *nrnode
;
4248 struct prefix
*range
;
4251 if (bgp
->dynamic_neighbors_limit
!= BGP_DYNAMIC_NEIGHBORS_LIMIT_DEFAULT
)
4252 vty_out(vty
, " bgp listen limit %d\n",
4253 bgp
->dynamic_neighbors_limit
);
4255 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
4256 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++) {
4257 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], rnode
,
4260 " bgp listen range %pFX peer-group %s\n",
4261 range
, group
->name
);
4268 DEFUN (bgp_disable_connected_route_check
,
4269 bgp_disable_connected_route_check_cmd
,
4270 "bgp disable-ebgp-connected-route-check",
4272 "Disable checking if nexthop is connected on ebgp sessions\n")
4274 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4275 SET_FLAG(bgp
->flags
, BGP_FLAG_DISABLE_NH_CONNECTED_CHK
);
4276 bgp_clear_star_soft_in(vty
, bgp
->name
);
4281 DEFUN (no_bgp_disable_connected_route_check
,
4282 no_bgp_disable_connected_route_check_cmd
,
4283 "no bgp disable-ebgp-connected-route-check",
4286 "Disable checking if nexthop is connected on ebgp sessions\n")
4288 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4289 UNSET_FLAG(bgp
->flags
, BGP_FLAG_DISABLE_NH_CONNECTED_CHK
);
4290 bgp_clear_star_soft_in(vty
, bgp
->name
);
4296 static int peer_remote_as_vty(struct vty
*vty
, const char *peer_str
,
4299 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4302 int as_type
= AS_SPECIFIED
;
4305 if (as_str
[0] == 'i') {
4307 as_type
= AS_INTERNAL
;
4308 } else if (as_str
[0] == 'e') {
4310 as_type
= AS_EXTERNAL
;
4312 /* Get AS number. */
4313 as
= strtoul(as_str
, NULL
, 10);
4316 /* If peer is peer group or interface peer, call proper function. */
4317 ret
= str2sockunion(peer_str
, &su
);
4321 /* Check if existing interface peer */
4322 peer
= peer_lookup_by_conf_if(bgp
, peer_str
);
4324 ret
= peer_remote_as(bgp
, NULL
, peer_str
, &as
, as_type
);
4326 /* if not interface peer, check peer-group settings */
4327 if (ret
< 0 && !peer
) {
4328 ret
= peer_group_remote_as(bgp
, peer_str
, &as
, as_type
);
4331 "%% Create the peer-group or interface first\n");
4332 return CMD_WARNING_CONFIG_FAILED
;
4337 if (peer_address_self_check(bgp
, &su
)) {
4339 "%% Can not configure the local system as neighbor\n");
4340 return CMD_WARNING_CONFIG_FAILED
;
4342 ret
= peer_remote_as(bgp
, &su
, NULL
, &as
, as_type
);
4345 return bgp_vty_return(vty
, ret
);
4348 DEFUN (bgp_default_shutdown
,
4349 bgp_default_shutdown_cmd
,
4350 "[no] bgp default shutdown",
4353 "Configure BGP defaults\n"
4354 "Apply administrative shutdown to newly configured peers\n")
4356 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4357 bgp
->autoshutdown
= !strmatch(argv
[0]->text
, "no");
4361 DEFPY(bgp_shutdown_msg
, bgp_shutdown_msg_cmd
, "bgp shutdown message MSG...",
4363 "Administrative shutdown of the BGP instance\n"
4364 "Add a shutdown message (RFC 8203)\n"
4365 "Shutdown message\n")
4367 char *msgstr
= NULL
;
4369 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4372 msgstr
= argv_concat(argv
, argc
, 3);
4374 if (msgstr
&& strlen(msgstr
) > BGP_ADMIN_SHUTDOWN_MSG_LEN
) {
4375 vty_out(vty
, "%% Shutdown message size exceeded %d\n",
4376 BGP_ADMIN_SHUTDOWN_MSG_LEN
);
4377 return CMD_WARNING_CONFIG_FAILED
;
4380 bgp_shutdown_enable(bgp
, msgstr
);
4381 XFREE(MTYPE_TMP
, msgstr
);
4386 DEFPY(bgp_shutdown
, bgp_shutdown_cmd
, "bgp shutdown",
4387 BGP_STR
"Administrative shutdown of the BGP instance\n")
4389 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4391 bgp_shutdown_enable(bgp
, NULL
);
4396 DEFPY(no_bgp_shutdown
, no_bgp_shutdown_cmd
, "no bgp shutdown",
4397 NO_STR BGP_STR
"Administrative shutdown of the BGP instance\n")
4399 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4401 bgp_shutdown_disable(bgp
);
4406 ALIAS(no_bgp_shutdown
, no_bgp_shutdown_msg_cmd
,
4407 "no bgp shutdown message MSG...", NO_STR BGP_STR
4408 "Administrative shutdown of the BGP instance\n"
4409 "Add a shutdown message (RFC 8203)\n" "Shutdown message\n")
4411 DEFUN (neighbor_remote_as
,
4412 neighbor_remote_as_cmd
,
4413 "neighbor <A.B.C.D|X:X::X:X|WORD> remote-as <(1-4294967295)|internal|external>",
4416 "Specify a BGP neighbor\n"
4418 "Internal BGP peer\n"
4419 "External BGP peer\n")
4422 int idx_remote_as
= 3;
4423 return peer_remote_as_vty(vty
, argv
[idx_peer
]->arg
,
4424 argv
[idx_remote_as
]->arg
);
4426 /* Enable fast convergence of bgp sessions. If this is enabled, bgp
4427 * sessions do not wait for hold timer expiry to bring down the sessions
4428 * when nexthop becomes unreachable
4430 DEFUN(bgp_fast_convergence
, bgp_fast_convergence_cmd
, "bgp fast-convergence",
4431 BGP_STR
"Fast convergence for bgp sessions\n")
4433 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4434 bgp
->fast_convergence
= true;
4439 DEFUN(no_bgp_fast_convergence
, no_bgp_fast_convergence_cmd
,
4440 "no bgp fast-convergence",
4441 NO_STR BGP_STR
"Fast convergence for bgp sessions\n")
4443 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4444 bgp
->fast_convergence
= false;
4449 static int peer_conf_interface_get(struct vty
*vty
, const char *conf_if
,
4451 const char *peer_group_name
,
4454 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4456 int as_type
= AS_UNSPECIFIED
;
4458 struct peer_group
*group
;
4461 group
= peer_group_lookup(bgp
, conf_if
);
4464 vty_out(vty
, "%% Name conflict with peer-group \n");
4465 return CMD_WARNING_CONFIG_FAILED
;
4469 if (as_str
[0] == 'i') {
4470 as_type
= AS_INTERNAL
;
4471 } else if (as_str
[0] == 'e') {
4472 as_type
= AS_EXTERNAL
;
4474 /* Get AS number. */
4475 as
= strtoul(as_str
, NULL
, 10);
4476 as_type
= AS_SPECIFIED
;
4480 peer
= peer_lookup_by_conf_if(bgp
, conf_if
);
4483 ret
= peer_remote_as(bgp
, NULL
, conf_if
, &as
, as_type
);
4485 peer
= peer_create(NULL
, conf_if
, bgp
, bgp
->as
, as
, as_type
,
4489 vty_out(vty
, "%% BGP failed to create peer\n");
4490 return CMD_WARNING_CONFIG_FAILED
;
4494 peer_flag_set(peer
, PEER_FLAG_IFPEER_V6ONLY
);
4496 /* Request zebra to initiate IPv6 RAs on this interface. We do
4498 * any unnumbered peer in order to not worry about run-time
4500 * (e.g., peering is initially IPv4, but the IPv4 /30 or /31
4502 * gets deleted later etc.)
4505 bgp_zebra_initiate_radv(bgp
, peer
);
4508 if ((v6only
&& !CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
))
4509 || (!v6only
&& CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
))) {
4511 peer_flag_set(peer
, PEER_FLAG_IFPEER_V6ONLY
);
4513 peer_flag_unset(peer
, PEER_FLAG_IFPEER_V6ONLY
);
4515 /* v6only flag changed. Reset bgp seesion */
4516 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
4517 peer
->last_reset
= PEER_DOWN_V6ONLY_CHANGE
;
4518 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
4519 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4521 bgp_session_reset(peer
);
4524 if (!CHECK_FLAG(peer
->flags_invert
, PEER_FLAG_CAPABILITY_ENHE
)) {
4525 SET_FLAG(peer
->flags
, PEER_FLAG_CAPABILITY_ENHE
);
4526 SET_FLAG(peer
->flags_invert
, PEER_FLAG_CAPABILITY_ENHE
);
4527 SET_FLAG(peer
->flags_override
, PEER_FLAG_CAPABILITY_ENHE
);
4530 if (peer_group_name
) {
4531 group
= peer_group_lookup(bgp
, peer_group_name
);
4533 vty_out(vty
, "%% Configure the peer-group first\n");
4534 return CMD_WARNING_CONFIG_FAILED
;
4537 ret
= peer_group_bind(bgp
, NULL
, peer
, group
, &as
);
4540 return bgp_vty_return(vty
, ret
);
4543 DEFUN (neighbor_interface_config
,
4544 neighbor_interface_config_cmd
,
4545 "neighbor WORD interface [peer-group PGNAME]",
4547 "Interface name or neighbor tag\n"
4548 "Enable BGP on interface\n"
4549 "Member of the peer-group\n"
4550 "Peer-group name\n")
4553 int idx_peer_group_word
= 4;
4555 if (argc
> idx_peer_group_word
)
4556 return peer_conf_interface_get(
4557 vty
, argv
[idx_word
]->arg
, 0,
4558 argv
[idx_peer_group_word
]->arg
, NULL
);
4560 return peer_conf_interface_get(vty
, argv
[idx_word
]->arg
, 0,
4564 DEFUN (neighbor_interface_config_v6only
,
4565 neighbor_interface_config_v6only_cmd
,
4566 "neighbor WORD interface v6only [peer-group PGNAME]",
4568 "Interface name or neighbor tag\n"
4569 "Enable BGP on interface\n"
4570 "Enable BGP with v6 link-local only\n"
4571 "Member of the peer-group\n"
4572 "Peer-group name\n")
4575 int idx_peer_group_word
= 5;
4577 if (argc
> idx_peer_group_word
)
4578 return peer_conf_interface_get(
4579 vty
, argv
[idx_word
]->arg
, 1,
4580 argv
[idx_peer_group_word
]->arg
, NULL
);
4582 return peer_conf_interface_get(vty
, argv
[idx_word
]->arg
, 1, NULL
, NULL
);
4586 DEFUN (neighbor_interface_config_remote_as
,
4587 neighbor_interface_config_remote_as_cmd
,
4588 "neighbor WORD interface remote-as <(1-4294967295)|internal|external>",
4590 "Interface name or neighbor tag\n"
4591 "Enable BGP on interface\n"
4592 "Specify a BGP neighbor\n"
4594 "Internal BGP peer\n"
4595 "External BGP peer\n")
4598 int idx_remote_as
= 4;
4599 return peer_conf_interface_get(vty
, argv
[idx_word
]->arg
, 0, NULL
,
4600 argv
[idx_remote_as
]->arg
);
4603 DEFUN (neighbor_interface_v6only_config_remote_as
,
4604 neighbor_interface_v6only_config_remote_as_cmd
,
4605 "neighbor WORD interface v6only remote-as <(1-4294967295)|internal|external>",
4607 "Interface name or neighbor tag\n"
4608 "Enable BGP with v6 link-local only\n"
4609 "Enable BGP on interface\n"
4610 "Specify a BGP neighbor\n"
4612 "Internal BGP peer\n"
4613 "External BGP peer\n")
4616 int idx_remote_as
= 5;
4617 return peer_conf_interface_get(vty
, argv
[idx_word
]->arg
, 1, NULL
,
4618 argv
[idx_remote_as
]->arg
);
4621 DEFUN (neighbor_peer_group
,
4622 neighbor_peer_group_cmd
,
4623 "neighbor WORD peer-group",
4625 "Interface name or neighbor tag\n"
4626 "Configure peer-group\n")
4628 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4631 struct peer_group
*group
;
4633 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_word
]->arg
);
4635 vty_out(vty
, "%% Name conflict with interface: \n");
4636 return CMD_WARNING_CONFIG_FAILED
;
4639 group
= peer_group_get(bgp
, argv
[idx_word
]->arg
);
4641 vty_out(vty
, "%% BGP failed to find or create peer-group\n");
4642 return CMD_WARNING_CONFIG_FAILED
;
4650 "no neighbor <WORD|<A.B.C.D|X:X::X:X> [remote-as <(1-4294967295)|internal|external>]>",
4654 "Specify a BGP neighbor\n"
4656 "Internal BGP peer\n"
4657 "External BGP peer\n")
4659 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4663 struct peer_group
*group
;
4667 ret
= str2sockunion(argv
[idx_peer
]->arg
, &su
);
4669 /* look up for neighbor by interface name config. */
4670 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_peer
]->arg
);
4672 /* Request zebra to terminate IPv6 RAs on this
4675 bgp_zebra_terminate_radv(peer
->bgp
, peer
);
4676 peer_notify_unconfig(peer
);
4681 group
= peer_group_lookup(bgp
, argv
[idx_peer
]->arg
);
4683 peer_group_notify_unconfig(group
);
4684 peer_group_delete(group
);
4686 vty_out(vty
, "%% Create the peer-group first\n");
4687 return CMD_WARNING_CONFIG_FAILED
;
4690 peer
= peer_lookup(bgp
, &su
);
4692 if (peer_dynamic_neighbor(peer
)) {
4694 "%% Operation not allowed on a dynamic neighbor\n");
4695 return CMD_WARNING_CONFIG_FAILED
;
4698 other
= peer
->doppelganger
;
4700 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CAPABILITY_ENHE
))
4701 bgp_zebra_terminate_radv(peer
->bgp
, peer
);
4703 peer_notify_unconfig(peer
);
4705 if (other
&& other
->status
!= Deleted
) {
4706 peer_notify_unconfig(other
);
4715 DEFUN (no_neighbor_interface_config
,
4716 no_neighbor_interface_config_cmd
,
4717 "no neighbor WORD interface [v6only] [peer-group PGNAME] [remote-as <(1-4294967295)|internal|external>]",
4721 "Configure BGP on interface\n"
4722 "Enable BGP with v6 link-local only\n"
4723 "Member of the peer-group\n"
4725 "Specify a BGP neighbor\n"
4727 "Internal BGP peer\n"
4728 "External BGP peer\n")
4730 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4734 /* look up for neighbor by interface name config. */
4735 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_word
]->arg
);
4737 /* Request zebra to terminate IPv6 RAs on this interface. */
4739 bgp_zebra_terminate_radv(peer
->bgp
, peer
);
4740 peer_notify_unconfig(peer
);
4743 vty_out(vty
, "%% Create the bgp interface first\n");
4744 return CMD_WARNING_CONFIG_FAILED
;
4749 DEFUN (no_neighbor_peer_group
,
4750 no_neighbor_peer_group_cmd
,
4751 "no neighbor WORD peer-group",
4755 "Configure peer-group\n")
4757 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4759 struct peer_group
*group
;
4761 group
= peer_group_lookup(bgp
, argv
[idx_word
]->arg
);
4763 peer_group_notify_unconfig(group
);
4764 peer_group_delete(group
);
4766 vty_out(vty
, "%% Create the peer-group first\n");
4767 return CMD_WARNING_CONFIG_FAILED
;
4772 DEFUN (no_neighbor_interface_peer_group_remote_as
,
4773 no_neighbor_interface_peer_group_remote_as_cmd
,
4774 "no neighbor WORD remote-as <(1-4294967295)|internal|external>",
4777 "Interface name or neighbor tag\n"
4778 "Specify a BGP neighbor\n"
4780 "Internal BGP peer\n"
4781 "External BGP peer\n")
4783 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4785 struct peer_group
*group
;
4788 /* look up for neighbor by interface name config. */
4789 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_word
]->arg
);
4791 peer_as_change(peer
, 0, AS_UNSPECIFIED
);
4795 group
= peer_group_lookup(bgp
, argv
[idx_word
]->arg
);
4797 peer_group_remote_as_delete(group
);
4799 vty_out(vty
, "%% Create the peer-group or interface first\n");
4800 return CMD_WARNING_CONFIG_FAILED
;
4805 DEFUN (neighbor_local_as
,
4806 neighbor_local_as_cmd
,
4807 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295)",
4810 "Specify a local-as number\n"
4811 "AS number used as local AS\n")
4819 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
4821 return CMD_WARNING_CONFIG_FAILED
;
4823 as
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
4824 ret
= peer_local_as_set(peer
, as
, 0, 0);
4825 return bgp_vty_return(vty
, ret
);
4828 DEFUN (neighbor_local_as_no_prepend
,
4829 neighbor_local_as_no_prepend_cmd
,
4830 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295) no-prepend",
4833 "Specify a local-as number\n"
4834 "AS number used as local AS\n"
4835 "Do not prepend local-as to updates from ebgp peers\n")
4843 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
4845 return CMD_WARNING_CONFIG_FAILED
;
4847 as
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
4848 ret
= peer_local_as_set(peer
, as
, 1, 0);
4849 return bgp_vty_return(vty
, ret
);
4852 DEFUN (neighbor_local_as_no_prepend_replace_as
,
4853 neighbor_local_as_no_prepend_replace_as_cmd
,
4854 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295) no-prepend replace-as",
4857 "Specify a local-as number\n"
4858 "AS number used as local AS\n"
4859 "Do not prepend local-as to updates from ebgp peers\n"
4860 "Do not prepend local-as to updates from ibgp peers\n")
4868 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
4870 return CMD_WARNING_CONFIG_FAILED
;
4872 as
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
4873 ret
= peer_local_as_set(peer
, as
, 1, 1);
4874 return bgp_vty_return(vty
, ret
);
4877 DEFUN (no_neighbor_local_as
,
4878 no_neighbor_local_as_cmd
,
4879 "no neighbor <A.B.C.D|X:X::X:X|WORD> local-as [(1-4294967295) [no-prepend [replace-as]]]",
4883 "Specify a local-as number\n"
4884 "AS number used as local AS\n"
4885 "Do not prepend local-as to updates from ebgp peers\n"
4886 "Do not prepend local-as to updates from ibgp peers\n")
4892 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
4894 return CMD_WARNING_CONFIG_FAILED
;
4896 ret
= peer_local_as_unset(peer
);
4897 return bgp_vty_return(vty
, ret
);
4901 DEFUN (neighbor_solo
,
4903 "neighbor <A.B.C.D|X:X::X:X|WORD> solo",
4906 "Solo peer - part of its own update group\n")
4912 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
4914 return CMD_WARNING_CONFIG_FAILED
;
4916 ret
= update_group_adjust_soloness(peer
, 1);
4917 return bgp_vty_return(vty
, ret
);
4920 DEFUN (no_neighbor_solo
,
4921 no_neighbor_solo_cmd
,
4922 "no neighbor <A.B.C.D|X:X::X:X|WORD> solo",
4926 "Solo peer - part of its own update group\n")
4932 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
4934 return CMD_WARNING_CONFIG_FAILED
;
4936 ret
= update_group_adjust_soloness(peer
, 0);
4937 return bgp_vty_return(vty
, ret
);
4940 DEFUN (neighbor_password
,
4941 neighbor_password_cmd
,
4942 "neighbor <A.B.C.D|X:X::X:X|WORD> password LINE",
4953 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
4955 return CMD_WARNING_CONFIG_FAILED
;
4957 ret
= peer_password_set(peer
, argv
[idx_line
]->arg
);
4958 return bgp_vty_return(vty
, ret
);
4961 DEFUN (no_neighbor_password
,
4962 no_neighbor_password_cmd
,
4963 "no neighbor <A.B.C.D|X:X::X:X|WORD> password [LINE]",
4974 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
4976 return CMD_WARNING_CONFIG_FAILED
;
4978 ret
= peer_password_unset(peer
);
4979 return bgp_vty_return(vty
, ret
);
4982 DEFUN (neighbor_activate
,
4983 neighbor_activate_cmd
,
4984 "neighbor <A.B.C.D|X:X::X:X|WORD> activate",
4987 "Enable the Address Family for this Neighbor\n")
4993 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
4995 return CMD_WARNING_CONFIG_FAILED
;
4997 ret
= peer_activate(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
));
4998 return bgp_vty_return(vty
, ret
);
5001 ALIAS_HIDDEN(neighbor_activate
, neighbor_activate_hidden_cmd
,
5002 "neighbor <A.B.C.D|X:X::X:X|WORD> activate",
5003 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5004 "Enable the Address Family for this Neighbor\n")
5006 DEFUN (no_neighbor_activate
,
5007 no_neighbor_activate_cmd
,
5008 "no neighbor <A.B.C.D|X:X::X:X|WORD> activate",
5012 "Enable the Address Family for this Neighbor\n")
5019 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
5021 return CMD_WARNING_CONFIG_FAILED
;
5023 ret
= peer_deactivate(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
));
5024 return bgp_vty_return(vty
, ret
);
5027 ALIAS_HIDDEN(no_neighbor_activate
, no_neighbor_activate_hidden_cmd
,
5028 "no neighbor <A.B.C.D|X:X::X:X|WORD> activate",
5029 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5030 "Enable the Address Family for this Neighbor\n")
5032 DEFUN (neighbor_set_peer_group
,
5033 neighbor_set_peer_group_cmd
,
5034 "neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
5037 "Member of the peer-group\n"
5038 "Peer-group name\n")
5040 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
5047 struct peer_group
*group
;
5049 ret
= str2sockunion(argv
[idx_peer
]->arg
, &su
);
5051 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_peer
]->arg
);
5053 vty_out(vty
, "%% Malformed address or name: %s\n",
5054 argv
[idx_peer
]->arg
);
5055 return CMD_WARNING_CONFIG_FAILED
;
5058 if (peer_address_self_check(bgp
, &su
)) {
5060 "%% Can not configure the local system as neighbor\n");
5061 return CMD_WARNING_CONFIG_FAILED
;
5064 /* Disallow for dynamic neighbor. */
5065 peer
= peer_lookup(bgp
, &su
);
5066 if (peer
&& peer_dynamic_neighbor(peer
)) {
5068 "%% Operation not allowed on a dynamic neighbor\n");
5069 return CMD_WARNING_CONFIG_FAILED
;
5073 group
= peer_group_lookup(bgp
, argv
[idx_word
]->arg
);
5075 vty_out(vty
, "%% Configure the peer-group first\n");
5076 return CMD_WARNING_CONFIG_FAILED
;
5079 ret
= peer_group_bind(bgp
, &su
, peer
, group
, &as
);
5081 return bgp_vty_return(vty
, ret
);
5084 ALIAS_HIDDEN(neighbor_set_peer_group
, neighbor_set_peer_group_hidden_cmd
,
5085 "neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
5086 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5087 "Member of the peer-group\n"
5088 "Peer-group name\n")
5090 DEFUN (no_neighbor_set_peer_group
,
5091 no_neighbor_set_peer_group_cmd
,
5092 "no neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
5096 "Member of the peer-group\n"
5097 "Peer-group name\n")
5099 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
5104 struct peer_group
*group
;
5106 peer
= peer_lookup_vty(vty
, argv
[idx_peer
]->arg
);
5108 return CMD_WARNING_CONFIG_FAILED
;
5110 group
= peer_group_lookup(bgp
, argv
[idx_word
]->arg
);
5112 vty_out(vty
, "%% Configure the peer-group first\n");
5113 return CMD_WARNING_CONFIG_FAILED
;
5116 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CAPABILITY_ENHE
))
5117 bgp_zebra_terminate_radv(peer
->bgp
, peer
);
5119 peer_notify_unconfig(peer
);
5120 ret
= peer_delete(peer
);
5122 return bgp_vty_return(vty
, ret
);
5125 ALIAS_HIDDEN(no_neighbor_set_peer_group
, no_neighbor_set_peer_group_hidden_cmd
,
5126 "no neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
5127 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5128 "Member of the peer-group\n"
5129 "Peer-group name\n")
5131 static int peer_flag_modify_vty(struct vty
*vty
, const char *ip_str
,
5132 uint32_t flag
, int set
)
5137 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5139 return CMD_WARNING_CONFIG_FAILED
;
5142 * If 'neighbor <interface>', then this is for directly connected peers,
5143 * we should not accept disable-connected-check.
5145 if (peer
->conf_if
&& (flag
== PEER_FLAG_DISABLE_CONNECTED_CHECK
)) {
5147 "%s is directly connected peer, cannot accept disable-connected-check\n",
5149 return CMD_WARNING_CONFIG_FAILED
;
5152 if (!set
&& flag
== PEER_FLAG_SHUTDOWN
)
5153 peer_tx_shutdown_message_unset(peer
);
5156 ret
= peer_flag_set(peer
, flag
);
5158 ret
= peer_flag_unset(peer
, flag
);
5160 return bgp_vty_return(vty
, ret
);
5163 static int peer_flag_set_vty(struct vty
*vty
, const char *ip_str
, uint32_t flag
)
5165 return peer_flag_modify_vty(vty
, ip_str
, flag
, 1);
5168 static int peer_flag_unset_vty(struct vty
*vty
, const char *ip_str
,
5171 return peer_flag_modify_vty(vty
, ip_str
, flag
, 0);
5174 /* neighbor passive. */
5175 DEFUN (neighbor_passive
,
5176 neighbor_passive_cmd
,
5177 "neighbor <A.B.C.D|X:X::X:X|WORD> passive",
5180 "Don't send open messages to this neighbor\n")
5183 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
, PEER_FLAG_PASSIVE
);
5186 DEFUN (no_neighbor_passive
,
5187 no_neighbor_passive_cmd
,
5188 "no neighbor <A.B.C.D|X:X::X:X|WORD> passive",
5192 "Don't send open messages to this neighbor\n")
5195 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
, PEER_FLAG_PASSIVE
);
5198 /* neighbor shutdown. */
5199 DEFUN (neighbor_shutdown_msg
,
5200 neighbor_shutdown_msg_cmd
,
5201 "neighbor <A.B.C.D|X:X::X:X|WORD> shutdown message MSG...",
5204 "Administratively shut down this neighbor\n"
5205 "Add a shutdown message (RFC 8203)\n"
5206 "Shutdown message\n")
5212 peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
5216 return CMD_WARNING_CONFIG_FAILED
;
5217 message
= argv_concat(argv
, argc
, 4);
5218 peer_tx_shutdown_message_set(peer
, message
);
5219 XFREE(MTYPE_TMP
, message
);
5222 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
, PEER_FLAG_SHUTDOWN
);
5225 ALIAS(neighbor_shutdown_msg
, neighbor_shutdown_cmd
,
5226 "neighbor <A.B.C.D|X:X::X:X|WORD> shutdown",
5227 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5228 "Administratively shut down this neighbor\n")
5230 DEFUN (no_neighbor_shutdown_msg
,
5231 no_neighbor_shutdown_msg_cmd
,
5232 "no neighbor <A.B.C.D|X:X::X:X|WORD> shutdown message MSG...",
5236 "Administratively shut down this neighbor\n"
5237 "Remove a shutdown message (RFC 8203)\n"
5238 "Shutdown message\n")
5242 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
5243 PEER_FLAG_SHUTDOWN
);
5246 ALIAS(no_neighbor_shutdown_msg
, no_neighbor_shutdown_cmd
,
5247 "no neighbor <A.B.C.D|X:X::X:X|WORD> shutdown",
5248 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5249 "Administratively shut down this neighbor\n")
5251 DEFUN(neighbor_shutdown_rtt
,
5252 neighbor_shutdown_rtt_cmd
,
5253 "neighbor <A.B.C.D|X:X::X:X|WORD> shutdown rtt (1-65535) [count (1-255)]",
5256 "Administratively shut down this neighbor\n"
5257 "Shutdown if round-trip-time is higher than expected\n"
5258 "Round-trip-time in milliseconds\n"
5259 "Specify the number of keepalives before shutdown\n"
5260 "The number of keepalives with higher RTT to shutdown\n")
5267 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
5270 return CMD_WARNING_CONFIG_FAILED
;
5272 peer
->rtt_expected
= strtol(argv
[idx_rtt
]->arg
, NULL
, 10);
5274 if (argv_find(argv
, argc
, "count", &idx_count
))
5275 peer
->rtt_keepalive_conf
=
5276 strtol(argv
[idx_count
+ 1]->arg
, NULL
, 10);
5278 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
5279 PEER_FLAG_RTT_SHUTDOWN
);
5282 DEFUN(no_neighbor_shutdown_rtt
,
5283 no_neighbor_shutdown_rtt_cmd
,
5284 "no neighbor <A.B.C.D|X:X::X:X|WORD> shutdown rtt [(1-65535) [count (1-255)]]",
5288 "Administratively shut down this neighbor\n"
5289 "Shutdown if round-trip-time is higher than expected\n"
5290 "Round-trip-time in milliseconds\n"
5291 "Specify the number of keepalives before shutdown\n"
5292 "The number of keepalives with higher RTT to shutdown\n")
5297 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
5300 return CMD_WARNING_CONFIG_FAILED
;
5302 peer
->rtt_expected
= 0;
5303 peer
->rtt_keepalive_conf
= 1;
5305 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
5306 PEER_FLAG_RTT_SHUTDOWN
);
5309 /* neighbor capability dynamic. */
5310 DEFUN (neighbor_capability_dynamic
,
5311 neighbor_capability_dynamic_cmd
,
5312 "neighbor <A.B.C.D|X:X::X:X|WORD> capability dynamic",
5315 "Advertise capability to the peer\n"
5316 "Advertise dynamic capability to this neighbor\n")
5319 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
5320 PEER_FLAG_DYNAMIC_CAPABILITY
);
5323 DEFUN (no_neighbor_capability_dynamic
,
5324 no_neighbor_capability_dynamic_cmd
,
5325 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability dynamic",
5329 "Advertise capability to the peer\n"
5330 "Advertise dynamic capability to this neighbor\n")
5333 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
5334 PEER_FLAG_DYNAMIC_CAPABILITY
);
5337 /* neighbor dont-capability-negotiate */
5338 DEFUN (neighbor_dont_capability_negotiate
,
5339 neighbor_dont_capability_negotiate_cmd
,
5340 "neighbor <A.B.C.D|X:X::X:X|WORD> dont-capability-negotiate",
5343 "Do not perform capability negotiation\n")
5346 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
5347 PEER_FLAG_DONT_CAPABILITY
);
5350 DEFUN (no_neighbor_dont_capability_negotiate
,
5351 no_neighbor_dont_capability_negotiate_cmd
,
5352 "no neighbor <A.B.C.D|X:X::X:X|WORD> dont-capability-negotiate",
5356 "Do not perform capability negotiation\n")
5359 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
5360 PEER_FLAG_DONT_CAPABILITY
);
5363 /* neighbor capability extended next hop encoding */
5364 DEFUN (neighbor_capability_enhe
,
5365 neighbor_capability_enhe_cmd
,
5366 "neighbor <A.B.C.D|X:X::X:X|WORD> capability extended-nexthop",
5369 "Advertise capability to the peer\n"
5370 "Advertise extended next-hop capability to the peer\n")
5375 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
5376 if (peer
&& peer
->conf_if
)
5379 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
5380 PEER_FLAG_CAPABILITY_ENHE
);
5383 DEFUN (no_neighbor_capability_enhe
,
5384 no_neighbor_capability_enhe_cmd
,
5385 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability extended-nexthop",
5389 "Advertise capability to the peer\n"
5390 "Advertise extended next-hop capability to the peer\n")
5395 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
5396 if (peer
&& peer
->conf_if
) {
5398 "Peer %s cannot have capability extended-nexthop turned off\n",
5399 argv
[idx_peer
]->arg
);
5400 return CMD_WARNING_CONFIG_FAILED
;
5403 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
5404 PEER_FLAG_CAPABILITY_ENHE
);
5407 static int peer_af_flag_modify_vty(struct vty
*vty
, const char *peer_str
,
5408 afi_t afi
, safi_t safi
, uint32_t flag
,
5414 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
5416 return CMD_WARNING_CONFIG_FAILED
;
5419 ret
= peer_af_flag_set(peer
, afi
, safi
, flag
);
5421 ret
= peer_af_flag_unset(peer
, afi
, safi
, flag
);
5423 return bgp_vty_return(vty
, ret
);
5426 static int peer_af_flag_set_vty(struct vty
*vty
, const char *peer_str
,
5427 afi_t afi
, safi_t safi
, uint32_t flag
)
5429 return peer_af_flag_modify_vty(vty
, peer_str
, afi
, safi
, flag
, 1);
5432 static int peer_af_flag_unset_vty(struct vty
*vty
, const char *peer_str
,
5433 afi_t afi
, safi_t safi
, uint32_t flag
)
5435 return peer_af_flag_modify_vty(vty
, peer_str
, afi
, safi
, flag
, 0);
5438 /* neighbor capability orf prefix-list. */
5439 DEFUN (neighbor_capability_orf_prefix
,
5440 neighbor_capability_orf_prefix_cmd
,
5441 "neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
5444 "Advertise capability to the peer\n"
5445 "Advertise ORF capability to the peer\n"
5446 "Advertise prefixlist ORF capability to this neighbor\n"
5447 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
5448 "Capability to RECEIVE the ORF from this neighbor\n"
5449 "Capability to SEND the ORF to this neighbor\n")
5451 int idx_send_recv
= 5;
5452 char *peer_str
= argv
[1]->arg
;
5454 afi_t afi
= bgp_node_afi(vty
);
5455 safi_t safi
= bgp_node_safi(vty
);
5457 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
5459 return CMD_WARNING_CONFIG_FAILED
;
5461 if (strmatch(argv
[idx_send_recv
]->text
, "send"))
5462 return peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
,
5463 PEER_FLAG_ORF_PREFIX_SM
);
5465 if (strmatch(argv
[idx_send_recv
]->text
, "receive"))
5466 return peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
,
5467 PEER_FLAG_ORF_PREFIX_RM
);
5469 if (strmatch(argv
[idx_send_recv
]->text
, "both"))
5470 return peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
,
5471 PEER_FLAG_ORF_PREFIX_SM
)
5472 | peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
,
5473 PEER_FLAG_ORF_PREFIX_RM
);
5475 return CMD_WARNING_CONFIG_FAILED
;
5479 neighbor_capability_orf_prefix
,
5480 neighbor_capability_orf_prefix_hidden_cmd
,
5481 "neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
5482 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5483 "Advertise capability to the peer\n"
5484 "Advertise ORF capability to the peer\n"
5485 "Advertise prefixlist ORF capability to this neighbor\n"
5486 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
5487 "Capability to RECEIVE the ORF from this neighbor\n"
5488 "Capability to SEND the ORF to this neighbor\n")
5490 DEFUN (no_neighbor_capability_orf_prefix
,
5491 no_neighbor_capability_orf_prefix_cmd
,
5492 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
5496 "Advertise capability to the peer\n"
5497 "Advertise ORF capability to the peer\n"
5498 "Advertise prefixlist ORF capability to this neighbor\n"
5499 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
5500 "Capability to RECEIVE the ORF from this neighbor\n"
5501 "Capability to SEND the ORF to this neighbor\n")
5503 int idx_send_recv
= 6;
5504 char *peer_str
= argv
[2]->arg
;
5506 afi_t afi
= bgp_node_afi(vty
);
5507 safi_t safi
= bgp_node_safi(vty
);
5509 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
5511 return CMD_WARNING_CONFIG_FAILED
;
5513 if (strmatch(argv
[idx_send_recv
]->text
, "send"))
5514 return peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
5515 PEER_FLAG_ORF_PREFIX_SM
);
5517 if (strmatch(argv
[idx_send_recv
]->text
, "receive"))
5518 return peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
5519 PEER_FLAG_ORF_PREFIX_RM
);
5521 if (strmatch(argv
[idx_send_recv
]->text
, "both"))
5522 return peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
5523 PEER_FLAG_ORF_PREFIX_SM
)
5524 | peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
5525 PEER_FLAG_ORF_PREFIX_RM
);
5527 return CMD_WARNING_CONFIG_FAILED
;
5531 no_neighbor_capability_orf_prefix
,
5532 no_neighbor_capability_orf_prefix_hidden_cmd
,
5533 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
5534 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5535 "Advertise capability to the peer\n"
5536 "Advertise ORF capability to the peer\n"
5537 "Advertise prefixlist ORF capability to this neighbor\n"
5538 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
5539 "Capability to RECEIVE the ORF from this neighbor\n"
5540 "Capability to SEND the ORF to this neighbor\n")
5542 /* neighbor next-hop-self. */
5543 DEFUN (neighbor_nexthop_self
,
5544 neighbor_nexthop_self_cmd
,
5545 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
5548 "Disable the next hop calculation for this neighbor\n")
5551 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
5552 bgp_node_safi(vty
), PEER_FLAG_NEXTHOP_SELF
);
5555 ALIAS_HIDDEN(neighbor_nexthop_self
, neighbor_nexthop_self_hidden_cmd
,
5556 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
5557 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5558 "Disable the next hop calculation for this neighbor\n")
5560 /* neighbor next-hop-self. */
5561 DEFUN (neighbor_nexthop_self_force
,
5562 neighbor_nexthop_self_force_cmd
,
5563 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
5566 "Disable the next hop calculation for this neighbor\n"
5567 "Set the next hop to self for reflected routes\n")
5570 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
5572 PEER_FLAG_FORCE_NEXTHOP_SELF
);
5575 ALIAS_HIDDEN(neighbor_nexthop_self_force
,
5576 neighbor_nexthop_self_force_hidden_cmd
,
5577 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
5578 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5579 "Disable the next hop calculation for this neighbor\n"
5580 "Set the next hop to self for reflected routes\n")
5582 ALIAS_HIDDEN(neighbor_nexthop_self_force
,
5583 neighbor_nexthop_self_all_hidden_cmd
,
5584 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self all",
5585 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5586 "Disable the next hop calculation for this neighbor\n"
5587 "Set the next hop to self for reflected routes\n")
5589 DEFUN (no_neighbor_nexthop_self
,
5590 no_neighbor_nexthop_self_cmd
,
5591 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
5595 "Disable the next hop calculation for this neighbor\n")
5598 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
5599 bgp_node_afi(vty
), bgp_node_safi(vty
),
5600 PEER_FLAG_NEXTHOP_SELF
);
5603 ALIAS_HIDDEN(no_neighbor_nexthop_self
, no_neighbor_nexthop_self_hidden_cmd
,
5604 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
5605 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5606 "Disable the next hop calculation for this neighbor\n")
5608 DEFUN (no_neighbor_nexthop_self_force
,
5609 no_neighbor_nexthop_self_force_cmd
,
5610 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
5614 "Disable the next hop calculation for this neighbor\n"
5615 "Set the next hop to self for reflected routes\n")
5618 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
5619 bgp_node_afi(vty
), bgp_node_safi(vty
),
5620 PEER_FLAG_FORCE_NEXTHOP_SELF
);
5623 ALIAS_HIDDEN(no_neighbor_nexthop_self_force
,
5624 no_neighbor_nexthop_self_force_hidden_cmd
,
5625 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
5626 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5627 "Disable the next hop calculation for this neighbor\n"
5628 "Set the next hop to self for reflected routes\n")
5630 ALIAS_HIDDEN(no_neighbor_nexthop_self_force
,
5631 no_neighbor_nexthop_self_all_hidden_cmd
,
5632 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self all",
5633 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5634 "Disable the next hop calculation for this neighbor\n"
5635 "Set the next hop to self for reflected routes\n")
5637 /* neighbor as-override */
5638 DEFUN (neighbor_as_override
,
5639 neighbor_as_override_cmd
,
5640 "neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
5643 "Override ASNs in outbound updates if aspath equals remote-as\n")
5646 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
5647 bgp_node_safi(vty
), PEER_FLAG_AS_OVERRIDE
);
5650 ALIAS_HIDDEN(neighbor_as_override
, neighbor_as_override_hidden_cmd
,
5651 "neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
5652 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5653 "Override ASNs in outbound updates if aspath equals remote-as\n")
5655 DEFUN (no_neighbor_as_override
,
5656 no_neighbor_as_override_cmd
,
5657 "no neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
5661 "Override ASNs in outbound updates if aspath equals remote-as\n")
5664 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
5665 bgp_node_afi(vty
), bgp_node_safi(vty
),
5666 PEER_FLAG_AS_OVERRIDE
);
5669 ALIAS_HIDDEN(no_neighbor_as_override
, no_neighbor_as_override_hidden_cmd
,
5670 "no neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
5671 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5672 "Override ASNs in outbound updates if aspath equals remote-as\n")
5674 /* neighbor remove-private-AS. */
5675 DEFUN (neighbor_remove_private_as
,
5676 neighbor_remove_private_as_cmd
,
5677 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
5680 "Remove private ASNs in outbound updates\n")
5683 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
5685 PEER_FLAG_REMOVE_PRIVATE_AS
);
5688 ALIAS_HIDDEN(neighbor_remove_private_as
, neighbor_remove_private_as_hidden_cmd
,
5689 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
5690 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5691 "Remove private ASNs in outbound updates\n")
5693 DEFUN (neighbor_remove_private_as_all
,
5694 neighbor_remove_private_as_all_cmd
,
5695 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
5698 "Remove private ASNs in outbound updates\n"
5699 "Apply to all AS numbers\n")
5702 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
5704 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
);
5707 ALIAS_HIDDEN(neighbor_remove_private_as_all
,
5708 neighbor_remove_private_as_all_hidden_cmd
,
5709 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
5710 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5711 "Remove private ASNs in outbound updates\n"
5712 "Apply to all AS numbers")
5714 DEFUN (neighbor_remove_private_as_replace_as
,
5715 neighbor_remove_private_as_replace_as_cmd
,
5716 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
5719 "Remove private ASNs in outbound updates\n"
5720 "Replace private ASNs with our ASN in outbound updates\n")
5723 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
5725 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
);
5728 ALIAS_HIDDEN(neighbor_remove_private_as_replace_as
,
5729 neighbor_remove_private_as_replace_as_hidden_cmd
,
5730 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
5731 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5732 "Remove private ASNs in outbound updates\n"
5733 "Replace private ASNs with our ASN in outbound updates\n")
5735 DEFUN (neighbor_remove_private_as_all_replace_as
,
5736 neighbor_remove_private_as_all_replace_as_cmd
,
5737 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
5740 "Remove private ASNs in outbound updates\n"
5741 "Apply to all AS numbers\n"
5742 "Replace private ASNs with our ASN in outbound updates\n")
5745 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
5747 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
);
5751 neighbor_remove_private_as_all_replace_as
,
5752 neighbor_remove_private_as_all_replace_as_hidden_cmd
,
5753 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
5754 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5755 "Remove private ASNs in outbound updates\n"
5756 "Apply to all AS numbers\n"
5757 "Replace private ASNs with our ASN in outbound updates\n")
5759 DEFUN (no_neighbor_remove_private_as
,
5760 no_neighbor_remove_private_as_cmd
,
5761 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
5765 "Remove private ASNs in outbound updates\n")
5768 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
5769 bgp_node_afi(vty
), bgp_node_safi(vty
),
5770 PEER_FLAG_REMOVE_PRIVATE_AS
);
5773 ALIAS_HIDDEN(no_neighbor_remove_private_as
,
5774 no_neighbor_remove_private_as_hidden_cmd
,
5775 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
5776 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5777 "Remove private ASNs in outbound updates\n")
5779 DEFUN (no_neighbor_remove_private_as_all
,
5780 no_neighbor_remove_private_as_all_cmd
,
5781 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
5785 "Remove private ASNs in outbound updates\n"
5786 "Apply to all AS numbers\n")
5789 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
5790 bgp_node_afi(vty
), bgp_node_safi(vty
),
5791 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
);
5794 ALIAS_HIDDEN(no_neighbor_remove_private_as_all
,
5795 no_neighbor_remove_private_as_all_hidden_cmd
,
5796 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
5797 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5798 "Remove private ASNs in outbound updates\n"
5799 "Apply to all AS numbers\n")
5801 DEFUN (no_neighbor_remove_private_as_replace_as
,
5802 no_neighbor_remove_private_as_replace_as_cmd
,
5803 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
5807 "Remove private ASNs in outbound updates\n"
5808 "Replace private ASNs with our ASN in outbound updates\n")
5811 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
5812 bgp_node_afi(vty
), bgp_node_safi(vty
),
5813 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
);
5816 ALIAS_HIDDEN(no_neighbor_remove_private_as_replace_as
,
5817 no_neighbor_remove_private_as_replace_as_hidden_cmd
,
5818 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
5819 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5820 "Remove private ASNs in outbound updates\n"
5821 "Replace private ASNs with our ASN in outbound updates\n")
5823 DEFUN (no_neighbor_remove_private_as_all_replace_as
,
5824 no_neighbor_remove_private_as_all_replace_as_cmd
,
5825 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
5829 "Remove private ASNs in outbound updates\n"
5830 "Apply to all AS numbers\n"
5831 "Replace private ASNs with our ASN in outbound updates\n")
5834 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
5835 bgp_node_afi(vty
), bgp_node_safi(vty
),
5836 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
);
5840 no_neighbor_remove_private_as_all_replace_as
,
5841 no_neighbor_remove_private_as_all_replace_as_hidden_cmd
,
5842 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
5843 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5844 "Remove private ASNs in outbound updates\n"
5845 "Apply to all AS numbers\n"
5846 "Replace private ASNs with our ASN in outbound updates\n")
5849 /* neighbor send-community. */
5850 DEFUN (neighbor_send_community
,
5851 neighbor_send_community_cmd
,
5852 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
5855 "Send Community attribute to this neighbor\n")
5859 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
5861 PEER_FLAG_SEND_COMMUNITY
);
5864 ALIAS_HIDDEN(neighbor_send_community
, neighbor_send_community_hidden_cmd
,
5865 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
5866 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5867 "Send Community attribute to this neighbor\n")
5869 DEFUN (no_neighbor_send_community
,
5870 no_neighbor_send_community_cmd
,
5871 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
5875 "Send Community attribute to this neighbor\n")
5879 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
5880 bgp_node_afi(vty
), bgp_node_safi(vty
),
5881 PEER_FLAG_SEND_COMMUNITY
);
5884 ALIAS_HIDDEN(no_neighbor_send_community
, no_neighbor_send_community_hidden_cmd
,
5885 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
5886 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5887 "Send Community attribute to this neighbor\n")
5889 /* neighbor send-community extended. */
5890 DEFUN (neighbor_send_community_type
,
5891 neighbor_send_community_type_cmd
,
5892 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
5895 "Send Community attribute to this neighbor\n"
5896 "Send Standard and Extended Community attributes\n"
5897 "Send Standard, Large and Extended Community attributes\n"
5898 "Send Extended Community attributes\n"
5899 "Send Standard Community attributes\n"
5900 "Send Large Community attributes\n")
5902 const char *type
= argv
[argc
- 1]->text
;
5903 char *peer_str
= argv
[1]->arg
;
5905 afi_t afi
= bgp_node_afi(vty
);
5906 safi_t safi
= bgp_node_safi(vty
);
5908 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
5910 return CMD_WARNING_CONFIG_FAILED
;
5912 if (strmatch(type
, "standard"))
5913 return peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
,
5914 PEER_FLAG_SEND_COMMUNITY
);
5916 if (strmatch(type
, "extended"))
5917 return peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
,
5918 PEER_FLAG_SEND_EXT_COMMUNITY
);
5920 if (strmatch(type
, "large"))
5921 return peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
,
5922 PEER_FLAG_SEND_LARGE_COMMUNITY
);
5924 if (strmatch(type
, "both")) {
5925 return peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
,
5926 PEER_FLAG_SEND_COMMUNITY
)
5927 | peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
,
5928 PEER_FLAG_SEND_EXT_COMMUNITY
);
5930 return peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
,
5931 PEER_FLAG_SEND_COMMUNITY
)
5932 | peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
,
5933 PEER_FLAG_SEND_EXT_COMMUNITY
)
5934 | peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
,
5935 PEER_FLAG_SEND_LARGE_COMMUNITY
);
5939 neighbor_send_community_type
, neighbor_send_community_type_hidden_cmd
,
5940 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
5941 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5942 "Send Community attribute to this neighbor\n"
5943 "Send Standard and Extended Community attributes\n"
5944 "Send Standard, Large and Extended Community attributes\n"
5945 "Send Extended Community attributes\n"
5946 "Send Standard Community attributes\n"
5947 "Send Large Community attributes\n")
5949 DEFUN (no_neighbor_send_community_type
,
5950 no_neighbor_send_community_type_cmd
,
5951 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
5955 "Send Community attribute to this neighbor\n"
5956 "Send Standard and Extended Community attributes\n"
5957 "Send Standard, Large and Extended Community attributes\n"
5958 "Send Extended Community attributes\n"
5959 "Send Standard Community attributes\n"
5960 "Send Large Community attributes\n")
5962 const char *type
= argv
[argc
- 1]->text
;
5963 char *peer_str
= argv
[2]->arg
;
5965 afi_t afi
= bgp_node_afi(vty
);
5966 safi_t safi
= bgp_node_safi(vty
);
5968 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
5970 return CMD_WARNING_CONFIG_FAILED
;
5972 if (strmatch(type
, "standard"))
5973 return peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
5974 PEER_FLAG_SEND_COMMUNITY
);
5976 if (strmatch(type
, "extended"))
5977 return peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
5978 PEER_FLAG_SEND_EXT_COMMUNITY
);
5980 if (strmatch(type
, "large"))
5981 return peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
5982 PEER_FLAG_SEND_LARGE_COMMUNITY
);
5984 if (strmatch(type
, "both")) {
5986 return peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
5987 PEER_FLAG_SEND_COMMUNITY
)
5988 | peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
5989 PEER_FLAG_SEND_EXT_COMMUNITY
);
5992 return peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
5993 PEER_FLAG_SEND_COMMUNITY
)
5994 | peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
5995 PEER_FLAG_SEND_EXT_COMMUNITY
)
5996 | peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
5997 PEER_FLAG_SEND_LARGE_COMMUNITY
);
6001 no_neighbor_send_community_type
,
6002 no_neighbor_send_community_type_hidden_cmd
,
6003 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
6004 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6005 "Send Community attribute to this neighbor\n"
6006 "Send Standard and Extended Community attributes\n"
6007 "Send Standard, Large and Extended Community attributes\n"
6008 "Send Extended Community attributes\n"
6009 "Send Standard Community attributes\n"
6010 "Send Large Community attributes\n")
6012 /* neighbor soft-reconfig. */
6013 DEFUN (neighbor_soft_reconfiguration
,
6014 neighbor_soft_reconfiguration_cmd
,
6015 "neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
6018 "Per neighbor soft reconfiguration\n"
6019 "Allow inbound soft reconfiguration for this neighbor\n")
6022 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
6024 PEER_FLAG_SOFT_RECONFIG
);
6027 ALIAS_HIDDEN(neighbor_soft_reconfiguration
,
6028 neighbor_soft_reconfiguration_hidden_cmd
,
6029 "neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
6030 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6031 "Per neighbor soft reconfiguration\n"
6032 "Allow inbound soft reconfiguration for this neighbor\n")
6034 DEFUN (no_neighbor_soft_reconfiguration
,
6035 no_neighbor_soft_reconfiguration_cmd
,
6036 "no neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
6040 "Per neighbor soft reconfiguration\n"
6041 "Allow inbound soft reconfiguration for this neighbor\n")
6044 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
6045 bgp_node_afi(vty
), bgp_node_safi(vty
),
6046 PEER_FLAG_SOFT_RECONFIG
);
6049 ALIAS_HIDDEN(no_neighbor_soft_reconfiguration
,
6050 no_neighbor_soft_reconfiguration_hidden_cmd
,
6051 "no neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
6052 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6053 "Per neighbor soft reconfiguration\n"
6054 "Allow inbound soft reconfiguration for this neighbor\n")
6056 DEFUN (neighbor_route_reflector_client
,
6057 neighbor_route_reflector_client_cmd
,
6058 "neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
6061 "Configure a neighbor as Route Reflector client\n")
6067 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6069 return CMD_WARNING_CONFIG_FAILED
;
6071 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
6073 PEER_FLAG_REFLECTOR_CLIENT
);
6076 ALIAS_HIDDEN(neighbor_route_reflector_client
,
6077 neighbor_route_reflector_client_hidden_cmd
,
6078 "neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
6079 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6080 "Configure a neighbor as Route Reflector client\n")
6082 DEFUN (no_neighbor_route_reflector_client
,
6083 no_neighbor_route_reflector_client_cmd
,
6084 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
6088 "Configure a neighbor as Route Reflector client\n")
6091 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
6092 bgp_node_afi(vty
), bgp_node_safi(vty
),
6093 PEER_FLAG_REFLECTOR_CLIENT
);
6096 ALIAS_HIDDEN(no_neighbor_route_reflector_client
,
6097 no_neighbor_route_reflector_client_hidden_cmd
,
6098 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
6099 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6100 "Configure a neighbor as Route Reflector client\n")
6102 /* neighbor route-server-client. */
6103 DEFUN (neighbor_route_server_client
,
6104 neighbor_route_server_client_cmd
,
6105 "neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
6108 "Configure a neighbor as Route Server client\n")
6113 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6115 return CMD_WARNING_CONFIG_FAILED
;
6116 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
6118 PEER_FLAG_RSERVER_CLIENT
);
6121 ALIAS_HIDDEN(neighbor_route_server_client
,
6122 neighbor_route_server_client_hidden_cmd
,
6123 "neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
6124 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6125 "Configure a neighbor as Route Server client\n")
6127 DEFUN (no_neighbor_route_server_client
,
6128 no_neighbor_route_server_client_cmd
,
6129 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
6133 "Configure a neighbor as Route Server client\n")
6136 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
6137 bgp_node_afi(vty
), bgp_node_safi(vty
),
6138 PEER_FLAG_RSERVER_CLIENT
);
6141 ALIAS_HIDDEN(no_neighbor_route_server_client
,
6142 no_neighbor_route_server_client_hidden_cmd
,
6143 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
6144 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6145 "Configure a neighbor as Route Server client\n")
6147 DEFUN (neighbor_nexthop_local_unchanged
,
6148 neighbor_nexthop_local_unchanged_cmd
,
6149 "neighbor <A.B.C.D|X:X::X:X|WORD> nexthop-local unchanged",
6152 "Configure treatment of outgoing link-local nexthop attribute\n"
6153 "Leave link-local nexthop unchanged for this peer\n")
6156 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
6158 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
);
6161 DEFUN (no_neighbor_nexthop_local_unchanged
,
6162 no_neighbor_nexthop_local_unchanged_cmd
,
6163 "no neighbor <A.B.C.D|X:X::X:X|WORD> nexthop-local unchanged",
6167 "Configure treatment of outgoing link-local-nexthop attribute\n"
6168 "Leave link-local nexthop unchanged for this peer\n")
6171 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
6172 bgp_node_afi(vty
), bgp_node_safi(vty
),
6173 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
);
6176 DEFUN (neighbor_attr_unchanged
,
6177 neighbor_attr_unchanged_cmd
,
6178 "neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
6181 "BGP attribute is propagated unchanged to this neighbor\n"
6182 "As-path attribute\n"
6183 "Nexthop attribute\n"
6187 char *peer_str
= argv
[1]->arg
;
6189 bool aspath
= false;
6190 bool nexthop
= false;
6192 afi_t afi
= bgp_node_afi(vty
);
6193 safi_t safi
= bgp_node_safi(vty
);
6196 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
6198 return CMD_WARNING_CONFIG_FAILED
;
6200 if (argv_find(argv
, argc
, "as-path", &idx
))
6204 if (argv_find(argv
, argc
, "next-hop", &idx
))
6208 if (argv_find(argv
, argc
, "med", &idx
))
6211 /* no flags means all of them! */
6212 if (!aspath
&& !nexthop
&& !med
) {
6213 ret
= peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
,
6214 PEER_FLAG_AS_PATH_UNCHANGED
);
6215 ret
|= peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
,
6216 PEER_FLAG_NEXTHOP_UNCHANGED
);
6217 ret
|= peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
,
6218 PEER_FLAG_MED_UNCHANGED
);
6221 if (peer_af_flag_check(peer
, afi
, safi
,
6222 PEER_FLAG_AS_PATH_UNCHANGED
)) {
6223 ret
|= peer_af_flag_unset_vty(
6224 vty
, peer_str
, afi
, safi
,
6225 PEER_FLAG_AS_PATH_UNCHANGED
);
6228 ret
|= peer_af_flag_set_vty(
6229 vty
, peer_str
, afi
, safi
,
6230 PEER_FLAG_AS_PATH_UNCHANGED
);
6233 if (peer_af_flag_check(peer
, afi
, safi
,
6234 PEER_FLAG_NEXTHOP_UNCHANGED
)) {
6235 ret
|= peer_af_flag_unset_vty(
6236 vty
, peer_str
, afi
, safi
,
6237 PEER_FLAG_NEXTHOP_UNCHANGED
);
6240 ret
|= peer_af_flag_set_vty(
6241 vty
, peer_str
, afi
, safi
,
6242 PEER_FLAG_NEXTHOP_UNCHANGED
);
6245 if (peer_af_flag_check(peer
, afi
, safi
,
6246 PEER_FLAG_MED_UNCHANGED
)) {
6247 ret
|= peer_af_flag_unset_vty(
6248 vty
, peer_str
, afi
, safi
,
6249 PEER_FLAG_MED_UNCHANGED
);
6252 ret
|= peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
,
6253 PEER_FLAG_MED_UNCHANGED
);
6260 neighbor_attr_unchanged
, neighbor_attr_unchanged_hidden_cmd
,
6261 "neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
6262 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6263 "BGP attribute is propagated unchanged to this neighbor\n"
6264 "As-path attribute\n"
6265 "Nexthop attribute\n"
6268 DEFUN (no_neighbor_attr_unchanged
,
6269 no_neighbor_attr_unchanged_cmd
,
6270 "no neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
6274 "BGP attribute is propagated unchanged to this neighbor\n"
6275 "As-path attribute\n"
6276 "Nexthop attribute\n"
6280 char *peer_str
= argv
[2]->arg
;
6282 bool aspath
= false;
6283 bool nexthop
= false;
6285 afi_t afi
= bgp_node_afi(vty
);
6286 safi_t safi
= bgp_node_safi(vty
);
6289 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
6291 return CMD_WARNING_CONFIG_FAILED
;
6293 if (argv_find(argv
, argc
, "as-path", &idx
))
6297 if (argv_find(argv
, argc
, "next-hop", &idx
))
6301 if (argv_find(argv
, argc
, "med", &idx
))
6304 if (!aspath
&& !nexthop
&& !med
) // no flags means all of them!
6305 return peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
6306 PEER_FLAG_AS_PATH_UNCHANGED
)
6307 | peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
6308 PEER_FLAG_NEXTHOP_UNCHANGED
)
6309 | peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
6310 PEER_FLAG_MED_UNCHANGED
);
6313 ret
|= peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
6314 PEER_FLAG_AS_PATH_UNCHANGED
);
6317 ret
|= peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
6318 PEER_FLAG_NEXTHOP_UNCHANGED
);
6321 ret
|= peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
6322 PEER_FLAG_MED_UNCHANGED
);
6328 no_neighbor_attr_unchanged
, no_neighbor_attr_unchanged_hidden_cmd
,
6329 "no neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
6330 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6331 "BGP attribute is propagated unchanged to this neighbor\n"
6332 "As-path attribute\n"
6333 "Nexthop attribute\n"
6336 /* EBGP multihop configuration. */
6337 static int peer_ebgp_multihop_set_vty(struct vty
*vty
, const char *ip_str
,
6338 const char *ttl_str
)
6343 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
6345 return CMD_WARNING_CONFIG_FAILED
;
6348 return bgp_vty_return(vty
, BGP_ERR_INVALID_FOR_DIRECT_PEER
);
6353 ttl
= strtoul(ttl_str
, NULL
, 10);
6355 return bgp_vty_return(vty
, peer_ebgp_multihop_set(peer
, ttl
));
6358 static int peer_ebgp_multihop_unset_vty(struct vty
*vty
, const char *ip_str
)
6362 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
6364 return CMD_WARNING_CONFIG_FAILED
;
6366 return bgp_vty_return(vty
, peer_ebgp_multihop_unset(peer
));
6369 /* neighbor ebgp-multihop. */
6370 DEFUN (neighbor_ebgp_multihop
,
6371 neighbor_ebgp_multihop_cmd
,
6372 "neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop",
6375 "Allow EBGP neighbors not on directly connected networks\n")
6378 return peer_ebgp_multihop_set_vty(vty
, argv
[idx_peer
]->arg
, NULL
);
6381 DEFUN (neighbor_ebgp_multihop_ttl
,
6382 neighbor_ebgp_multihop_ttl_cmd
,
6383 "neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop (1-255)",
6386 "Allow EBGP neighbors not on directly connected networks\n"
6387 "maximum hop count\n")
6391 return peer_ebgp_multihop_set_vty(vty
, argv
[idx_peer
]->arg
,
6392 argv
[idx_number
]->arg
);
6395 DEFUN (no_neighbor_ebgp_multihop
,
6396 no_neighbor_ebgp_multihop_cmd
,
6397 "no neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop [(1-255)]",
6401 "Allow EBGP neighbors not on directly connected networks\n"
6402 "maximum hop count\n")
6405 return peer_ebgp_multihop_unset_vty(vty
, argv
[idx_peer
]->arg
);
6409 /* disable-connected-check */
6410 DEFUN (neighbor_disable_connected_check
,
6411 neighbor_disable_connected_check_cmd
,
6412 "neighbor <A.B.C.D|X:X::X:X|WORD> <disable-connected-check|enforce-multihop>",
6415 "one-hop away EBGP peer using loopback address\n"
6416 "Enforce EBGP neighbors perform multihop\n")
6419 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
6420 PEER_FLAG_DISABLE_CONNECTED_CHECK
);
6423 DEFUN (no_neighbor_disable_connected_check
,
6424 no_neighbor_disable_connected_check_cmd
,
6425 "no neighbor <A.B.C.D|X:X::X:X|WORD> <disable-connected-check|enforce-multihop>",
6429 "one-hop away EBGP peer using loopback address\n"
6430 "Enforce EBGP neighbors perform multihop\n")
6433 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
6434 PEER_FLAG_DISABLE_CONNECTED_CHECK
);
6437 /* disable-link-bw-encoding-ieee */
6438 DEFUN(neighbor_disable_link_bw_encoding_ieee
,
6439 neighbor_disable_link_bw_encoding_ieee_cmd
,
6440 "neighbor <A.B.C.D|X:X::X:X|WORD> disable-link-bw-encoding-ieee",
6441 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6442 "Disable IEEE floating-point encoding for extended community bandwidth\n")
6446 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
6447 PEER_FLAG_DISABLE_LINK_BW_ENCODING_IEEE
);
6450 DEFUN(no_neighbor_disable_link_bw_encoding_ieee
,
6451 no_neighbor_disable_link_bw_encoding_ieee_cmd
,
6452 "no neighbor <A.B.C.D|X:X::X:X|WORD> disable-link-bw-encoding-ieee",
6453 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6454 "Disable IEEE floating-point encoding for extended community bandwidth\n")
6458 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
6459 PEER_FLAG_DISABLE_LINK_BW_ENCODING_IEEE
);
6462 /* extended-optional-parameters */
6463 DEFUN(neighbor_extended_optional_parameters
,
6464 neighbor_extended_optional_parameters_cmd
,
6465 "neighbor <A.B.C.D|X:X::X:X|WORD> extended-optional-parameters",
6466 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6467 "Force the extended optional parameters format for OPEN messages\n")
6471 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
6472 PEER_FLAG_EXTENDED_OPT_PARAMS
);
6475 DEFUN(no_neighbor_extended_optional_parameters
,
6476 no_neighbor_extended_optional_parameters_cmd
,
6477 "no neighbor <A.B.C.D|X:X::X:X|WORD> extended-optional-parameters",
6478 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6479 "Force the extended optional parameters format for OPEN messages\n")
6483 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
6484 PEER_FLAG_EXTENDED_OPT_PARAMS
);
6487 /* enforce-first-as */
6488 DEFUN (neighbor_enforce_first_as
,
6489 neighbor_enforce_first_as_cmd
,
6490 "neighbor <A.B.C.D|X:X::X:X|WORD> enforce-first-as",
6493 "Enforce the first AS for EBGP routes\n")
6497 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
6498 PEER_FLAG_ENFORCE_FIRST_AS
);
6501 DEFUN (no_neighbor_enforce_first_as
,
6502 no_neighbor_enforce_first_as_cmd
,
6503 "no neighbor <A.B.C.D|X:X::X:X|WORD> enforce-first-as",
6507 "Enforce the first AS for EBGP routes\n")
6511 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
6512 PEER_FLAG_ENFORCE_FIRST_AS
);
6516 DEFUN (neighbor_description
,
6517 neighbor_description_cmd
,
6518 "neighbor <A.B.C.D|X:X::X:X|WORD> description LINE...",
6521 "Neighbor specific description\n"
6522 "Up to 80 characters describing this neighbor\n")
6529 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6531 return CMD_WARNING_CONFIG_FAILED
;
6533 str
= argv_concat(argv
, argc
, idx_line
);
6535 peer_description_set(peer
, str
);
6537 XFREE(MTYPE_TMP
, str
);
6542 DEFUN (no_neighbor_description
,
6543 no_neighbor_description_cmd
,
6544 "no neighbor <A.B.C.D|X:X::X:X|WORD> description",
6548 "Neighbor specific description\n")
6553 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6555 return CMD_WARNING_CONFIG_FAILED
;
6557 peer_description_unset(peer
);
6562 ALIAS(no_neighbor_description
, no_neighbor_description_comment_cmd
,
6563 "no neighbor <A.B.C.D|X:X::X:X|WORD> description LINE...",
6564 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6565 "Neighbor specific description\n"
6566 "Up to 80 characters describing this neighbor\n")
6568 /* Neighbor update-source. */
6569 static int peer_update_source_vty(struct vty
*vty
, const char *peer_str
,
6570 const char *source_str
)
6576 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
6578 return CMD_WARNING_CONFIG_FAILED
;
6584 if (str2sockunion(source_str
, &su
) == 0)
6585 peer_update_source_addr_set(peer
, &su
);
6587 if (str2prefix(source_str
, &p
)) {
6589 "%% Invalid update-source, remove prefix length \n");
6590 return CMD_WARNING_CONFIG_FAILED
;
6592 peer_update_source_if_set(peer
, source_str
);
6595 peer_update_source_unset(peer
);
6600 #define BGP_UPDATE_SOURCE_HELP_STR \
6603 "Interface name (requires zebra to be running)\n"
6605 DEFUN (neighbor_update_source
,
6606 neighbor_update_source_cmd
,
6607 "neighbor <A.B.C.D|X:X::X:X|WORD> update-source <A.B.C.D|X:X::X:X|WORD>",
6610 "Source of routing updates\n"
6611 BGP_UPDATE_SOURCE_HELP_STR
)
6615 return peer_update_source_vty(vty
, argv
[idx_peer
]->arg
,
6616 argv
[idx_peer_2
]->arg
);
6619 DEFUN (no_neighbor_update_source
,
6620 no_neighbor_update_source_cmd
,
6621 "no neighbor <A.B.C.D|X:X::X:X|WORD> update-source [<A.B.C.D|X:X::X:X|WORD>]",
6625 "Source of routing updates\n"
6626 BGP_UPDATE_SOURCE_HELP_STR
)
6629 return peer_update_source_vty(vty
, argv
[idx_peer
]->arg
, NULL
);
6632 static int peer_default_originate_set_vty(struct vty
*vty
, const char *peer_str
,
6633 afi_t afi
, safi_t safi
,
6634 const char *rmap
, int set
)
6638 struct route_map
*route_map
= NULL
;
6640 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
6642 return CMD_WARNING_CONFIG_FAILED
;
6646 route_map
= route_map_lookup_warn_noexist(vty
, rmap
);
6647 ret
= peer_default_originate_set(peer
, afi
, safi
,
6650 ret
= peer_default_originate_unset(peer
, afi
, safi
);
6652 return bgp_vty_return(vty
, ret
);
6655 /* neighbor default-originate. */
6656 DEFUN (neighbor_default_originate
,
6657 neighbor_default_originate_cmd
,
6658 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate",
6661 "Originate default route to this neighbor\n")
6664 return peer_default_originate_set_vty(vty
, argv
[idx_peer
]->arg
,
6666 bgp_node_safi(vty
), NULL
, 1);
6669 ALIAS_HIDDEN(neighbor_default_originate
, neighbor_default_originate_hidden_cmd
,
6670 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate",
6671 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6672 "Originate default route to this neighbor\n")
6674 DEFUN (neighbor_default_originate_rmap
,
6675 neighbor_default_originate_rmap_cmd
,
6676 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate route-map RMAP_NAME",
6679 "Originate default route to this neighbor\n"
6680 "Route-map to specify criteria to originate default\n"
6685 return peer_default_originate_set_vty(
6686 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6687 argv
[idx_word
]->arg
, 1);
6691 neighbor_default_originate_rmap
,
6692 neighbor_default_originate_rmap_hidden_cmd
,
6693 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate route-map RMAP_NAME",
6694 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6695 "Originate default route to this neighbor\n"
6696 "Route-map to specify criteria to originate default\n"
6699 DEFUN (no_neighbor_default_originate
,
6700 no_neighbor_default_originate_cmd
,
6701 "no neighbor <A.B.C.D|X:X::X:X|WORD> default-originate [route-map RMAP_NAME]",
6705 "Originate default route to this neighbor\n"
6706 "Route-map to specify criteria to originate default\n"
6710 return peer_default_originate_set_vty(vty
, argv
[idx_peer
]->arg
,
6712 bgp_node_safi(vty
), NULL
, 0);
6716 no_neighbor_default_originate
, no_neighbor_default_originate_hidden_cmd
,
6717 "no neighbor <A.B.C.D|X:X::X:X|WORD> default-originate [route-map RMAP_NAME]",
6718 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6719 "Originate default route to this neighbor\n"
6720 "Route-map to specify criteria to originate default\n"
6724 /* Set neighbor's BGP port. */
6725 static int peer_port_vty(struct vty
*vty
, const char *ip_str
, int afi
,
6726 const char *port_str
)
6732 peer
= peer_lookup_vty(vty
, ip_str
);
6734 return CMD_WARNING_CONFIG_FAILED
;
6737 sp
= getservbyname("bgp", "tcp");
6738 port
= (sp
== NULL
) ? BGP_PORT_DEFAULT
: ntohs(sp
->s_port
);
6740 port
= strtoul(port_str
, NULL
, 10);
6743 peer_port_set(peer
, port
);
6748 /* Set specified peer's BGP port. */
6749 DEFUN (neighbor_port
,
6751 "neighbor <A.B.C.D|X:X::X:X> port (0-65535)",
6754 "Neighbor's BGP port\n"
6755 "TCP port number\n")
6759 return peer_port_vty(vty
, argv
[idx_ip
]->arg
, AFI_IP
,
6760 argv
[idx_number
]->arg
);
6763 DEFUN (no_neighbor_port
,
6764 no_neighbor_port_cmd
,
6765 "no neighbor <A.B.C.D|X:X::X:X> port [(0-65535)]",
6769 "Neighbor's BGP port\n"
6770 "TCP port number\n")
6773 return peer_port_vty(vty
, argv
[idx_ip
]->arg
, AFI_IP
, NULL
);
6777 /* neighbor weight. */
6778 static int peer_weight_set_vty(struct vty
*vty
, const char *ip_str
, afi_t afi
,
6779 safi_t safi
, const char *weight_str
)
6783 unsigned long weight
;
6785 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
6787 return CMD_WARNING_CONFIG_FAILED
;
6789 weight
= strtoul(weight_str
, NULL
, 10);
6791 ret
= peer_weight_set(peer
, afi
, safi
, weight
);
6792 return bgp_vty_return(vty
, ret
);
6795 static int peer_weight_unset_vty(struct vty
*vty
, const char *ip_str
, afi_t afi
,
6801 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
6803 return CMD_WARNING_CONFIG_FAILED
;
6805 ret
= peer_weight_unset(peer
, afi
, safi
);
6806 return bgp_vty_return(vty
, ret
);
6809 DEFUN (neighbor_weight
,
6810 neighbor_weight_cmd
,
6811 "neighbor <A.B.C.D|X:X::X:X|WORD> weight (0-65535)",
6814 "Set default weight for routes from this neighbor\n"
6819 return peer_weight_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
6820 bgp_node_safi(vty
), argv
[idx_number
]->arg
);
6823 ALIAS_HIDDEN(neighbor_weight
, neighbor_weight_hidden_cmd
,
6824 "neighbor <A.B.C.D|X:X::X:X|WORD> weight (0-65535)",
6825 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6826 "Set default weight for routes from this neighbor\n"
6829 DEFUN (no_neighbor_weight
,
6830 no_neighbor_weight_cmd
,
6831 "no neighbor <A.B.C.D|X:X::X:X|WORD> weight [(0-65535)]",
6835 "Set default weight for routes from this neighbor\n"
6839 return peer_weight_unset_vty(vty
, argv
[idx_peer
]->arg
,
6840 bgp_node_afi(vty
), bgp_node_safi(vty
));
6843 ALIAS_HIDDEN(no_neighbor_weight
, no_neighbor_weight_hidden_cmd
,
6844 "no neighbor <A.B.C.D|X:X::X:X|WORD> weight [(0-65535)]",
6845 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6846 "Set default weight for routes from this neighbor\n"
6850 /* Override capability negotiation. */
6851 DEFUN (neighbor_override_capability
,
6852 neighbor_override_capability_cmd
,
6853 "neighbor <A.B.C.D|X:X::X:X|WORD> override-capability",
6856 "Override capability negotiation result\n")
6859 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
6860 PEER_FLAG_OVERRIDE_CAPABILITY
);
6863 DEFUN (no_neighbor_override_capability
,
6864 no_neighbor_override_capability_cmd
,
6865 "no neighbor <A.B.C.D|X:X::X:X|WORD> override-capability",
6869 "Override capability negotiation result\n")
6872 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
6873 PEER_FLAG_OVERRIDE_CAPABILITY
);
6876 DEFUN (neighbor_strict_capability
,
6877 neighbor_strict_capability_cmd
,
6878 "neighbor <A.B.C.D|X:X::X:X|WORD> strict-capability-match",
6881 "Strict capability negotiation match\n")
6885 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
6886 PEER_FLAG_STRICT_CAP_MATCH
);
6889 DEFUN (no_neighbor_strict_capability
,
6890 no_neighbor_strict_capability_cmd
,
6891 "no neighbor <A.B.C.D|X:X::X:X|WORD> strict-capability-match",
6895 "Strict capability negotiation match\n")
6899 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
6900 PEER_FLAG_STRICT_CAP_MATCH
);
6903 static int peer_timers_set_vty(struct vty
*vty
, const char *ip_str
,
6904 const char *keep_str
, const char *hold_str
)
6911 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
6913 return CMD_WARNING_CONFIG_FAILED
;
6915 keepalive
= strtoul(keep_str
, NULL
, 10);
6916 holdtime
= strtoul(hold_str
, NULL
, 10);
6918 ret
= peer_timers_set(peer
, keepalive
, holdtime
);
6920 return bgp_vty_return(vty
, ret
);
6923 static int peer_timers_unset_vty(struct vty
*vty
, const char *ip_str
)
6928 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
6930 return CMD_WARNING_CONFIG_FAILED
;
6932 ret
= peer_timers_unset(peer
);
6934 return bgp_vty_return(vty
, ret
);
6937 DEFUN (neighbor_timers
,
6938 neighbor_timers_cmd
,
6939 "neighbor <A.B.C.D|X:X::X:X|WORD> timers (0-65535) (0-65535)",
6942 "BGP per neighbor timers\n"
6943 "Keepalive interval\n"
6948 int idx_number_2
= 4;
6949 return peer_timers_set_vty(vty
, argv
[idx_peer
]->arg
,
6950 argv
[idx_number
]->arg
,
6951 argv
[idx_number_2
]->arg
);
6954 DEFUN (no_neighbor_timers
,
6955 no_neighbor_timers_cmd
,
6956 "no neighbor <A.B.C.D|X:X::X:X|WORD> timers [(0-65535) (0-65535)]",
6960 "BGP per neighbor timers\n"
6961 "Keepalive interval\n"
6965 return peer_timers_unset_vty(vty
, argv
[idx_peer
]->arg
);
6969 static int peer_timers_connect_set_vty(struct vty
*vty
, const char *ip_str
,
6970 const char *time_str
)
6976 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
6978 return CMD_WARNING_CONFIG_FAILED
;
6980 connect
= strtoul(time_str
, NULL
, 10);
6982 ret
= peer_timers_connect_set(peer
, connect
);
6984 return bgp_vty_return(vty
, ret
);
6987 static int peer_timers_connect_unset_vty(struct vty
*vty
, const char *ip_str
)
6992 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
6994 return CMD_WARNING_CONFIG_FAILED
;
6996 ret
= peer_timers_connect_unset(peer
);
6998 return bgp_vty_return(vty
, ret
);
7001 DEFUN (neighbor_timers_connect
,
7002 neighbor_timers_connect_cmd
,
7003 "neighbor <A.B.C.D|X:X::X:X|WORD> timers connect (1-65535)",
7006 "BGP per neighbor timers\n"
7007 "BGP connect timer\n"
7012 return peer_timers_connect_set_vty(vty
, argv
[idx_peer
]->arg
,
7013 argv
[idx_number
]->arg
);
7016 DEFUN (no_neighbor_timers_connect
,
7017 no_neighbor_timers_connect_cmd
,
7018 "no neighbor <A.B.C.D|X:X::X:X|WORD> timers connect [(1-65535)]",
7022 "BGP per neighbor timers\n"
7023 "BGP connect timer\n"
7027 return peer_timers_connect_unset_vty(vty
, argv
[idx_peer
]->arg
);
7030 DEFPY (neighbor_timers_delayopen
,
7031 neighbor_timers_delayopen_cmd
,
7032 "neighbor <A.B.C.D|X:X::X:X|WORD>$neighbor timers delayopen (1-240)$interval",
7035 "BGP per neighbor timers\n"
7036 "RFC 4271 DelayOpenTimer\n"
7037 "DelayOpenTime timer interval\n")
7041 peer
= peer_and_group_lookup_vty(vty
, neighbor
);
7043 return CMD_WARNING_CONFIG_FAILED
;
7046 if (peer_timers_delayopen_unset(peer
))
7047 return CMD_WARNING_CONFIG_FAILED
;
7049 if (peer_timers_delayopen_set(peer
, interval
))
7050 return CMD_WARNING_CONFIG_FAILED
;
7056 DEFPY (no_neighbor_timers_delayopen
,
7057 no_neighbor_timers_delayopen_cmd
,
7058 "no neighbor <A.B.C.D|X:X::X:X|WORD>$neighbor timers delayopen [(0-65535)]",
7062 "BGP per neighbor timers\n"
7063 "RFC 4271 DelayOpenTimer\n"
7064 "DelayOpenTime timer interval\n")
7068 peer
= peer_and_group_lookup_vty(vty
, neighbor
);
7070 return CMD_WARNING_CONFIG_FAILED
;
7072 if (peer_timers_delayopen_unset(peer
))
7073 return CMD_WARNING_CONFIG_FAILED
;
7078 static int peer_advertise_interval_vty(struct vty
*vty
, const char *ip_str
,
7079 const char *time_str
, int set
)
7083 uint32_t routeadv
= 0;
7085 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
7087 return CMD_WARNING_CONFIG_FAILED
;
7090 routeadv
= strtoul(time_str
, NULL
, 10);
7093 ret
= peer_advertise_interval_set(peer
, routeadv
);
7095 ret
= peer_advertise_interval_unset(peer
);
7097 return bgp_vty_return(vty
, ret
);
7100 DEFUN (neighbor_advertise_interval
,
7101 neighbor_advertise_interval_cmd
,
7102 "neighbor <A.B.C.D|X:X::X:X|WORD> advertisement-interval (0-600)",
7105 "Minimum interval between sending BGP routing updates\n"
7106 "time in seconds\n")
7110 return peer_advertise_interval_vty(vty
, argv
[idx_peer
]->arg
,
7111 argv
[idx_number
]->arg
, 1);
7114 DEFUN (no_neighbor_advertise_interval
,
7115 no_neighbor_advertise_interval_cmd
,
7116 "no neighbor <A.B.C.D|X:X::X:X|WORD> advertisement-interval [(0-600)]",
7120 "Minimum interval between sending BGP routing updates\n"
7121 "time in seconds\n")
7124 return peer_advertise_interval_vty(vty
, argv
[idx_peer
]->arg
, NULL
, 0);
7128 /* Time to wait before processing route-map updates */
7129 DEFUN (bgp_set_route_map_delay_timer
,
7130 bgp_set_route_map_delay_timer_cmd
,
7131 "bgp route-map delay-timer (0-600)",
7133 "BGP route-map delay timer\n"
7134 "Time in secs to wait before processing route-map changes\n"
7135 "0 disables the timer, no route updates happen when route-maps change\n")
7138 uint32_t rmap_delay_timer
;
7140 if (argv
[idx_number
]->arg
) {
7141 rmap_delay_timer
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
7142 bm
->rmap_update_timer
= rmap_delay_timer
;
7144 /* if the dynamic update handling is being disabled, and a timer
7146 * running, stop the timer and act as if the timer has already
7149 if (!rmap_delay_timer
&& bm
->t_rmap_update
) {
7150 BGP_TIMER_OFF(bm
->t_rmap_update
);
7151 thread_execute(bm
->master
, bgp_route_map_update_timer
,
7156 vty_out(vty
, "%% BGP invalid route-map delay-timer\n");
7157 return CMD_WARNING_CONFIG_FAILED
;
7161 DEFUN (no_bgp_set_route_map_delay_timer
,
7162 no_bgp_set_route_map_delay_timer_cmd
,
7163 "no bgp route-map delay-timer [(0-600)]",
7166 "Default BGP route-map delay timer\n"
7167 "Reset to default time to wait for processing route-map changes\n"
7168 "0 disables the timer, no route updates happen when route-maps change\n")
7171 bm
->rmap_update_timer
= RMAP_DEFAULT_UPDATE_TIMER
;
7176 /* neighbor interface */
7177 static int peer_interface_vty(struct vty
*vty
, const char *ip_str
,
7182 peer
= peer_lookup_vty(vty
, ip_str
);
7183 if (!peer
|| peer
->conf_if
) {
7184 vty_out(vty
, "%% BGP invalid peer %s\n", ip_str
);
7185 return CMD_WARNING_CONFIG_FAILED
;
7189 peer_interface_set(peer
, str
);
7191 peer_interface_unset(peer
);
7196 DEFUN (neighbor_interface
,
7197 neighbor_interface_cmd
,
7198 "neighbor <A.B.C.D|X:X::X:X> interface WORD",
7207 return peer_interface_vty(vty
, argv
[idx_ip
]->arg
, argv
[idx_word
]->arg
);
7210 DEFUN (no_neighbor_interface
,
7211 no_neighbor_interface_cmd
,
7212 "no neighbor <A.B.C.D|X:X::X:X> interface WORD",
7221 return peer_interface_vty(vty
, argv
[idx_peer
]->arg
, NULL
);
7224 DEFUN (neighbor_distribute_list
,
7225 neighbor_distribute_list_cmd
,
7226 "neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list ACCESSLIST_NAME <in|out>",
7229 "Filter updates to/from this neighbor\n"
7230 "IP Access-list name\n"
7231 "Filter incoming updates\n"
7232 "Filter outgoing updates\n")
7239 const char *pstr
= argv
[idx_peer
]->arg
;
7240 const char *acl
= argv
[idx_acl
]->arg
;
7241 const char *inout
= argv
[argc
- 1]->text
;
7243 peer
= peer_and_group_lookup_vty(vty
, pstr
);
7245 return CMD_WARNING_CONFIG_FAILED
;
7247 /* Check filter direction. */
7248 direct
= strmatch(inout
, "in") ? FILTER_IN
: FILTER_OUT
;
7249 ret
= peer_distribute_set(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
7252 return bgp_vty_return(vty
, ret
);
7256 neighbor_distribute_list
, neighbor_distribute_list_hidden_cmd
,
7257 "neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list ACCESSLIST_NAME <in|out>",
7258 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7259 "Filter updates to/from this neighbor\n"
7260 "IP Access-list name\n"
7261 "Filter incoming updates\n"
7262 "Filter outgoing updates\n")
7264 DEFUN (no_neighbor_distribute_list
,
7265 no_neighbor_distribute_list_cmd
,
7266 "no neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list ACCESSLIST_NAME <in|out>",
7270 "Filter updates to/from this neighbor\n"
7271 "IP Access-list name\n"
7272 "Filter incoming updates\n"
7273 "Filter outgoing updates\n")
7279 const char *pstr
= argv
[idx_peer
]->arg
;
7280 const char *inout
= argv
[argc
- 1]->text
;
7282 peer
= peer_and_group_lookup_vty(vty
, pstr
);
7284 return CMD_WARNING_CONFIG_FAILED
;
7286 /* Check filter direction. */
7287 direct
= strmatch(inout
, "in") ? FILTER_IN
: FILTER_OUT
;
7288 ret
= peer_distribute_unset(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
7291 return bgp_vty_return(vty
, ret
);
7295 no_neighbor_distribute_list
, no_neighbor_distribute_list_hidden_cmd
,
7296 "no neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list ACCESSLIST_NAME <in|out>",
7297 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7298 "Filter updates to/from this neighbor\n"
7299 "IP Access-list name\n"
7300 "Filter incoming updates\n"
7301 "Filter outgoing updates\n")
7303 /* Set prefix list to the peer. */
7304 static int peer_prefix_list_set_vty(struct vty
*vty
, const char *ip_str
,
7305 afi_t afi
, safi_t safi
,
7306 const char *name_str
,
7307 const char *direct_str
)
7310 int direct
= FILTER_IN
;
7313 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
7315 return CMD_WARNING_CONFIG_FAILED
;
7317 /* Check filter direction. */
7318 if (strncmp(direct_str
, "i", 1) == 0)
7320 else if (strncmp(direct_str
, "o", 1) == 0)
7321 direct
= FILTER_OUT
;
7323 ret
= peer_prefix_list_set(peer
, afi
, safi
, direct
, name_str
);
7325 return bgp_vty_return(vty
, ret
);
7328 static int peer_prefix_list_unset_vty(struct vty
*vty
, const char *ip_str
,
7329 afi_t afi
, safi_t safi
,
7330 const char *direct_str
)
7334 int direct
= FILTER_IN
;
7336 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
7338 return CMD_WARNING_CONFIG_FAILED
;
7340 /* Check filter direction. */
7341 if (strncmp(direct_str
, "i", 1) == 0)
7343 else if (strncmp(direct_str
, "o", 1) == 0)
7344 direct
= FILTER_OUT
;
7346 ret
= peer_prefix_list_unset(peer
, afi
, safi
, direct
);
7348 return bgp_vty_return(vty
, ret
);
7351 DEFUN (neighbor_prefix_list
,
7352 neighbor_prefix_list_cmd
,
7353 "neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
7356 "Filter updates to/from this neighbor\n"
7357 "Name of a prefix list\n"
7358 "Filter incoming updates\n"
7359 "Filter outgoing updates\n")
7364 return peer_prefix_list_set_vty(
7365 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
7366 argv
[idx_word
]->arg
, argv
[idx_in_out
]->arg
);
7369 ALIAS_HIDDEN(neighbor_prefix_list
, neighbor_prefix_list_hidden_cmd
,
7370 "neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
7371 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7372 "Filter updates to/from this neighbor\n"
7373 "Name of a prefix list\n"
7374 "Filter incoming updates\n"
7375 "Filter outgoing updates\n")
7377 DEFUN (no_neighbor_prefix_list
,
7378 no_neighbor_prefix_list_cmd
,
7379 "no neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
7383 "Filter updates to/from this neighbor\n"
7384 "Name of a prefix list\n"
7385 "Filter incoming updates\n"
7386 "Filter outgoing updates\n")
7390 return peer_prefix_list_unset_vty(vty
, argv
[idx_peer
]->arg
,
7391 bgp_node_afi(vty
), bgp_node_safi(vty
),
7392 argv
[idx_in_out
]->arg
);
7395 ALIAS_HIDDEN(no_neighbor_prefix_list
, no_neighbor_prefix_list_hidden_cmd
,
7396 "no neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
7397 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7398 "Filter updates to/from this neighbor\n"
7399 "Name of a prefix list\n"
7400 "Filter incoming updates\n"
7401 "Filter outgoing updates\n")
7403 static int peer_aslist_set_vty(struct vty
*vty
, const char *ip_str
, afi_t afi
,
7404 safi_t safi
, const char *name_str
,
7405 const char *direct_str
)
7409 int direct
= FILTER_IN
;
7411 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
7413 return CMD_WARNING_CONFIG_FAILED
;
7415 /* Check filter direction. */
7416 if (strncmp(direct_str
, "i", 1) == 0)
7418 else if (strncmp(direct_str
, "o", 1) == 0)
7419 direct
= FILTER_OUT
;
7421 ret
= peer_aslist_set(peer
, afi
, safi
, direct
, name_str
);
7423 return bgp_vty_return(vty
, ret
);
7426 static int peer_aslist_unset_vty(struct vty
*vty
, const char *ip_str
, afi_t afi
,
7427 safi_t safi
, const char *direct_str
)
7431 int direct
= FILTER_IN
;
7433 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
7435 return CMD_WARNING_CONFIG_FAILED
;
7437 /* Check filter direction. */
7438 if (strncmp(direct_str
, "i", 1) == 0)
7440 else if (strncmp(direct_str
, "o", 1) == 0)
7441 direct
= FILTER_OUT
;
7443 ret
= peer_aslist_unset(peer
, afi
, safi
, direct
);
7445 return bgp_vty_return(vty
, ret
);
7448 DEFUN (neighbor_filter_list
,
7449 neighbor_filter_list_cmd
,
7450 "neighbor <A.B.C.D|X:X::X:X|WORD> filter-list AS_PATH_FILTER_NAME <in|out>",
7453 "Establish BGP filters\n"
7454 "AS path access-list name\n"
7455 "Filter incoming routes\n"
7456 "Filter outgoing routes\n")
7461 return peer_aslist_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
7462 bgp_node_safi(vty
), argv
[idx_word
]->arg
,
7463 argv
[idx_in_out
]->arg
);
7466 ALIAS_HIDDEN(neighbor_filter_list
, neighbor_filter_list_hidden_cmd
,
7467 "neighbor <A.B.C.D|X:X::X:X|WORD> filter-list AS_PATH_FILTER_NAME <in|out>",
7468 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7469 "Establish BGP filters\n"
7470 "AS path access-list name\n"
7471 "Filter incoming routes\n"
7472 "Filter outgoing routes\n")
7474 DEFUN (no_neighbor_filter_list
,
7475 no_neighbor_filter_list_cmd
,
7476 "no neighbor <A.B.C.D|X:X::X:X|WORD> filter-list AS_PATH_FILTER_NAME <in|out>",
7480 "Establish BGP filters\n"
7481 "AS path access-list name\n"
7482 "Filter incoming routes\n"
7483 "Filter outgoing routes\n")
7487 return peer_aslist_unset_vty(vty
, argv
[idx_peer
]->arg
,
7488 bgp_node_afi(vty
), bgp_node_safi(vty
),
7489 argv
[idx_in_out
]->arg
);
7492 ALIAS_HIDDEN(no_neighbor_filter_list
, no_neighbor_filter_list_hidden_cmd
,
7493 "no neighbor <A.B.C.D|X:X::X:X|WORD> filter-list AS_PATH_FILTER_NAME <in|out>",
7494 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7495 "Establish BGP filters\n"
7496 "AS path access-list name\n"
7497 "Filter incoming routes\n"
7498 "Filter outgoing routes\n")
7500 /* Set advertise-map to the peer. */
7501 static int peer_advertise_map_set_vty(struct vty
*vty
, const char *ip_str
,
7502 afi_t afi
, safi_t safi
,
7503 const char *advertise_str
,
7504 const char *condition_str
, bool condition
,
7507 int ret
= CMD_WARNING_CONFIG_FAILED
;
7509 struct route_map
*advertise_map
;
7510 struct route_map
*condition_map
;
7512 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
7516 condition_map
= route_map_lookup_warn_noexist(vty
, condition_str
);
7517 advertise_map
= route_map_lookup_warn_noexist(vty
, advertise_str
);
7520 ret
= peer_advertise_map_set(peer
, afi
, safi
, advertise_str
,
7521 advertise_map
, condition_str
,
7522 condition_map
, condition
);
7524 ret
= peer_advertise_map_unset(peer
, afi
, safi
, advertise_str
,
7525 advertise_map
, condition_str
,
7526 condition_map
, condition
);
7528 return bgp_vty_return(vty
, ret
);
7531 DEFPY (bgp_condadv_period
,
7532 bgp_condadv_period_cmd
,
7533 "[no$no] bgp conditional-advertisement timer (5-240)$period",
7536 "Conditional advertisement settings\n"
7537 "Set period to rescan BGP table to check if condition is met\n"
7538 "Period between BGP table scans, in seconds; default 60\n")
7540 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
7542 bgp
->condition_check_period
=
7543 no
? DEFAULT_CONDITIONAL_ROUTES_POLL_TIME
: period
;
7548 DEFPY (neighbor_advertise_map
,
7549 neighbor_advertise_map_cmd
,
7550 "[no$no] neighbor <A.B.C.D|X:X::X:X|WORD>$neighbor advertise-map RMAP_NAME$advertise_str <exist-map|non-exist-map>$exist RMAP_NAME$condition_str",
7554 "Route-map to conditionally advertise routes\n"
7555 "Name of advertise map\n"
7556 "Advertise routes only if prefixes in exist-map are installed in BGP table\n"
7557 "Advertise routes only if prefixes in non-exist-map are not installed in BGP table\n"
7558 "Name of the exist or non exist map\n")
7560 bool condition
= CONDITION_EXIST
;
7562 if (!strcmp(exist
, "non-exist-map"))
7563 condition
= CONDITION_NON_EXIST
;
7565 return peer_advertise_map_set_vty(vty
, neighbor
, bgp_node_afi(vty
),
7566 bgp_node_safi(vty
), advertise_str
,
7567 condition_str
, condition
, !no
);
7570 ALIAS_HIDDEN(neighbor_advertise_map
, neighbor_advertise_map_hidden_cmd
,
7571 "[no$no] neighbor <A.B.C.D|X:X::X:X|WORD>$neighbor advertise-map RMAP_NAME$advertise_str <exist-map|non-exist-map>$exist RMAP_NAME$condition_str",
7572 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7573 "Route-map to conditionally advertise routes\n"
7574 "Name of advertise map\n"
7575 "Advertise routes only if prefixes in exist-map are installed in BGP table\n"
7576 "Advertise routes only if prefixes in non-exist-map are not installed in BGP table\n"
7577 "Name of the exist or non exist map\n")
7579 /* Set route-map to the peer. */
7580 static int peer_route_map_set_vty(struct vty
*vty
, const char *ip_str
,
7581 afi_t afi
, safi_t safi
, const char *name_str
,
7582 const char *direct_str
)
7586 int direct
= RMAP_IN
;
7587 struct route_map
*route_map
;
7589 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
7591 return CMD_WARNING_CONFIG_FAILED
;
7593 /* Check filter direction. */
7594 if (strncmp(direct_str
, "in", 2) == 0)
7596 else if (strncmp(direct_str
, "o", 1) == 0)
7599 route_map
= route_map_lookup_warn_noexist(vty
, name_str
);
7600 ret
= peer_route_map_set(peer
, afi
, safi
, direct
, name_str
, route_map
);
7602 return bgp_vty_return(vty
, ret
);
7605 static int peer_route_map_unset_vty(struct vty
*vty
, const char *ip_str
,
7606 afi_t afi
, safi_t safi
,
7607 const char *direct_str
)
7611 int direct
= RMAP_IN
;
7613 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
7615 return CMD_WARNING_CONFIG_FAILED
;
7617 /* Check filter direction. */
7618 if (strncmp(direct_str
, "in", 2) == 0)
7620 else if (strncmp(direct_str
, "o", 1) == 0)
7623 ret
= peer_route_map_unset(peer
, afi
, safi
, direct
);
7625 return bgp_vty_return(vty
, ret
);
7628 DEFUN (neighbor_route_map
,
7629 neighbor_route_map_cmd
,
7630 "neighbor <A.B.C.D|X:X::X:X|WORD> route-map RMAP_NAME <in|out>",
7633 "Apply route map to neighbor\n"
7634 "Name of route map\n"
7635 "Apply map to incoming routes\n"
7636 "Apply map to outbound routes\n")
7641 return peer_route_map_set_vty(
7642 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
7643 argv
[idx_word
]->arg
, argv
[idx_in_out
]->arg
);
7646 ALIAS_HIDDEN(neighbor_route_map
, neighbor_route_map_hidden_cmd
,
7647 "neighbor <A.B.C.D|X:X::X:X|WORD> route-map RMAP_NAME <in|out>",
7648 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7649 "Apply route map to neighbor\n"
7650 "Name of route map\n"
7651 "Apply map to incoming routes\n"
7652 "Apply map to outbound routes\n")
7654 DEFUN (no_neighbor_route_map
,
7655 no_neighbor_route_map_cmd
,
7656 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-map RMAP_NAME <in|out>",
7660 "Apply route map to neighbor\n"
7661 "Name of route map\n"
7662 "Apply map to incoming routes\n"
7663 "Apply map to outbound routes\n")
7667 return peer_route_map_unset_vty(vty
, argv
[idx_peer
]->arg
,
7668 bgp_node_afi(vty
), bgp_node_safi(vty
),
7669 argv
[idx_in_out
]->arg
);
7672 ALIAS_HIDDEN(no_neighbor_route_map
, no_neighbor_route_map_hidden_cmd
,
7673 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-map RMAP_NAME <in|out>",
7674 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7675 "Apply route map to neighbor\n"
7676 "Name of route map\n"
7677 "Apply map to incoming routes\n"
7678 "Apply map to outbound routes\n")
7680 /* Set unsuppress-map to the peer. */
7681 static int peer_unsuppress_map_set_vty(struct vty
*vty
, const char *ip_str
,
7682 afi_t afi
, safi_t safi
,
7683 const char *name_str
)
7687 struct route_map
*route_map
;
7689 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
7691 return CMD_WARNING_CONFIG_FAILED
;
7693 route_map
= route_map_lookup_warn_noexist(vty
, name_str
);
7694 ret
= peer_unsuppress_map_set(peer
, afi
, safi
, name_str
, route_map
);
7696 return bgp_vty_return(vty
, ret
);
7699 /* Unset route-map from the peer. */
7700 static int peer_unsuppress_map_unset_vty(struct vty
*vty
, const char *ip_str
,
7701 afi_t afi
, safi_t safi
)
7706 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
7708 return CMD_WARNING_CONFIG_FAILED
;
7710 ret
= peer_unsuppress_map_unset(peer
, afi
, safi
);
7712 return bgp_vty_return(vty
, ret
);
7715 DEFUN (neighbor_unsuppress_map
,
7716 neighbor_unsuppress_map_cmd
,
7717 "neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
7720 "Route-map to selectively unsuppress suppressed routes\n"
7721 "Name of route map\n")
7725 return peer_unsuppress_map_set_vty(
7726 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
7727 argv
[idx_word
]->arg
);
7730 ALIAS_HIDDEN(neighbor_unsuppress_map
, neighbor_unsuppress_map_hidden_cmd
,
7731 "neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
7732 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7733 "Route-map to selectively unsuppress suppressed routes\n"
7734 "Name of route map\n")
7736 DEFUN (no_neighbor_unsuppress_map
,
7737 no_neighbor_unsuppress_map_cmd
,
7738 "no neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
7742 "Route-map to selectively unsuppress suppressed routes\n"
7743 "Name of route map\n")
7746 return peer_unsuppress_map_unset_vty(vty
, argv
[idx_peer
]->arg
,
7748 bgp_node_safi(vty
));
7751 ALIAS_HIDDEN(no_neighbor_unsuppress_map
, no_neighbor_unsuppress_map_hidden_cmd
,
7752 "no neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
7753 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7754 "Route-map to selectively unsuppress suppressed routes\n"
7755 "Name of route map\n")
7757 static int peer_maximum_prefix_set_vty(struct vty
*vty
, const char *ip_str
,
7758 afi_t afi
, safi_t safi
,
7759 const char *num_str
,
7760 const char *threshold_str
, int warning
,
7761 const char *restart_str
,
7762 const char *force_str
)
7770 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
7772 return CMD_WARNING_CONFIG_FAILED
;
7774 max
= strtoul(num_str
, NULL
, 10);
7776 threshold
= atoi(threshold_str
);
7778 threshold
= MAXIMUM_PREFIX_THRESHOLD_DEFAULT
;
7781 restart
= atoi(restart_str
);
7785 ret
= peer_maximum_prefix_set(peer
, afi
, safi
, max
, threshold
, warning
,
7786 restart
, force_str
? true : false);
7788 return bgp_vty_return(vty
, ret
);
7791 static int peer_maximum_prefix_unset_vty(struct vty
*vty
, const char *ip_str
,
7792 afi_t afi
, safi_t safi
)
7797 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
7799 return CMD_WARNING_CONFIG_FAILED
;
7801 ret
= peer_maximum_prefix_unset(peer
, afi
, safi
);
7803 return bgp_vty_return(vty
, ret
);
7806 /* Maximum number of prefix to be sent to the neighbor. */
7807 DEFUN(neighbor_maximum_prefix_out
,
7808 neighbor_maximum_prefix_out_cmd
,
7809 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix-out (1-4294967295)",
7812 "Maximum number of prefixes to be sent to this peer\n"
7813 "Maximum no. of prefix limit\n")
7820 afi_t afi
= bgp_node_afi(vty
);
7821 safi_t safi
= bgp_node_safi(vty
);
7823 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
7825 return CMD_WARNING_CONFIG_FAILED
;
7827 max
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
7829 ret
= peer_maximum_prefix_out_set(peer
, afi
, safi
, max
);
7831 return bgp_vty_return(vty
, ret
);
7834 DEFUN(no_neighbor_maximum_prefix_out
,
7835 no_neighbor_maximum_prefix_out_cmd
,
7836 "no neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix-out [(1-4294967295)]",
7840 "Maximum number of prefixes to be sent to this peer\n"
7841 "Maximum no. of prefix limit\n")
7846 afi_t afi
= bgp_node_afi(vty
);
7847 safi_t safi
= bgp_node_safi(vty
);
7849 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
7851 return CMD_WARNING_CONFIG_FAILED
;
7853 ret
= peer_maximum_prefix_out_unset(peer
, afi
, safi
);
7855 return bgp_vty_return(vty
, ret
);
7858 /* Maximum number of prefix configuration. Prefix count is different
7859 for each peer configuration. So this configuration can be set for
7860 each peer configuration. */
7861 DEFUN (neighbor_maximum_prefix
,
7862 neighbor_maximum_prefix_cmd
,
7863 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) [force]",
7866 "Maximum number of prefix accept from this peer\n"
7867 "maximum no. of prefix limit\n"
7868 "Force checking all received routes not only accepted\n")
7875 if (argv_find(argv
, argc
, "force", &idx_force
))
7876 force
= argv
[idx_force
]->arg
;
7878 return peer_maximum_prefix_set_vty(
7879 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
7880 argv
[idx_number
]->arg
, NULL
, 0, NULL
, force
);
7883 ALIAS_HIDDEN(neighbor_maximum_prefix
, neighbor_maximum_prefix_hidden_cmd
,
7884 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) [force]",
7885 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7886 "Maximum number of prefix accept from this peer\n"
7887 "maximum no. of prefix limit\n"
7888 "Force checking all received routes not only accepted\n")
7890 DEFUN (neighbor_maximum_prefix_threshold
,
7891 neighbor_maximum_prefix_threshold_cmd
,
7892 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) [force]",
7895 "Maximum number of prefix accept from this peer\n"
7896 "maximum no. of prefix limit\n"
7897 "Threshold value (%) at which to generate a warning msg\n"
7898 "Force checking all received routes not only accepted\n")
7902 int idx_number_2
= 4;
7906 if (argv_find(argv
, argc
, "force", &idx_force
))
7907 force
= argv
[idx_force
]->arg
;
7909 return peer_maximum_prefix_set_vty(
7910 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
7911 argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
, 0, NULL
, force
);
7915 neighbor_maximum_prefix_threshold
,
7916 neighbor_maximum_prefix_threshold_hidden_cmd
,
7917 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) [force]",
7918 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7919 "Maximum number of prefix accept from this peer\n"
7920 "maximum no. of prefix limit\n"
7921 "Threshold value (%) at which to generate a warning msg\n"
7922 "Force checking all received routes not only accepted\n")
7924 DEFUN (neighbor_maximum_prefix_warning
,
7925 neighbor_maximum_prefix_warning_cmd
,
7926 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) warning-only [force]",
7929 "Maximum number of prefix accept from this peer\n"
7930 "maximum no. of prefix limit\n"
7931 "Only give warning message when limit is exceeded\n"
7932 "Force checking all received routes not only accepted\n")
7939 if (argv_find(argv
, argc
, "force", &idx_force
))
7940 force
= argv
[idx_force
]->arg
;
7942 return peer_maximum_prefix_set_vty(
7943 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
7944 argv
[idx_number
]->arg
, NULL
, 1, NULL
, force
);
7948 neighbor_maximum_prefix_warning
,
7949 neighbor_maximum_prefix_warning_hidden_cmd
,
7950 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) warning-only [force]",
7951 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7952 "Maximum number of prefix accept from this peer\n"
7953 "maximum no. of prefix limit\n"
7954 "Only give warning message when limit is exceeded\n"
7955 "Force checking all received routes not only accepted\n")
7957 DEFUN (neighbor_maximum_prefix_threshold_warning
,
7958 neighbor_maximum_prefix_threshold_warning_cmd
,
7959 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) warning-only [force]",
7962 "Maximum number of prefix accept from this peer\n"
7963 "maximum no. of prefix limit\n"
7964 "Threshold value (%) at which to generate a warning msg\n"
7965 "Only give warning message when limit is exceeded\n"
7966 "Force checking all received routes not only accepted\n")
7970 int idx_number_2
= 4;
7974 if (argv_find(argv
, argc
, "force", &idx_force
))
7975 force
= argv
[idx_force
]->arg
;
7977 return peer_maximum_prefix_set_vty(
7978 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
7979 argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
, 1, NULL
, force
);
7983 neighbor_maximum_prefix_threshold_warning
,
7984 neighbor_maximum_prefix_threshold_warning_hidden_cmd
,
7985 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) warning-only [force]",
7986 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7987 "Maximum number of prefix accept from this peer\n"
7988 "maximum no. of prefix limit\n"
7989 "Threshold value (%) at which to generate a warning msg\n"
7990 "Only give warning message when limit is exceeded\n"
7991 "Force checking all received routes not only accepted\n")
7993 DEFUN (neighbor_maximum_prefix_restart
,
7994 neighbor_maximum_prefix_restart_cmd
,
7995 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) restart (1-65535) [force]",
7998 "Maximum number of prefix accept from this peer\n"
7999 "maximum no. of prefix limit\n"
8000 "Restart bgp connection after limit is exceeded\n"
8001 "Restart interval in minutes\n"
8002 "Force checking all received routes not only accepted\n")
8006 int idx_number_2
= 5;
8010 if (argv_find(argv
, argc
, "force", &idx_force
))
8011 force
= argv
[idx_force
]->arg
;
8013 return peer_maximum_prefix_set_vty(
8014 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
8015 argv
[idx_number
]->arg
, NULL
, 0, argv
[idx_number_2
]->arg
, force
);
8019 neighbor_maximum_prefix_restart
,
8020 neighbor_maximum_prefix_restart_hidden_cmd
,
8021 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) restart (1-65535) [force]",
8022 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
8023 "Maximum number of prefix accept from this peer\n"
8024 "maximum no. of prefix limit\n"
8025 "Restart bgp connection after limit is exceeded\n"
8026 "Restart interval in minutes\n"
8027 "Force checking all received routes not only accepted\n")
8029 DEFUN (neighbor_maximum_prefix_threshold_restart
,
8030 neighbor_maximum_prefix_threshold_restart_cmd
,
8031 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) restart (1-65535) [force]",
8034 "Maximum number of prefixes to accept from this peer\n"
8035 "maximum no. of prefix limit\n"
8036 "Threshold value (%) at which to generate a warning msg\n"
8037 "Restart bgp connection after limit is exceeded\n"
8038 "Restart interval in minutes\n"
8039 "Force checking all received routes not only accepted\n")
8043 int idx_number_2
= 4;
8044 int idx_number_3
= 6;
8048 if (argv_find(argv
, argc
, "force", &idx_force
))
8049 force
= argv
[idx_force
]->arg
;
8051 return peer_maximum_prefix_set_vty(
8052 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
8053 argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
, 0,
8054 argv
[idx_number_3
]->arg
, force
);
8058 neighbor_maximum_prefix_threshold_restart
,
8059 neighbor_maximum_prefix_threshold_restart_hidden_cmd
,
8060 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) restart (1-65535) [force]",
8061 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
8062 "Maximum number of prefixes to accept from this peer\n"
8063 "maximum no. of prefix limit\n"
8064 "Threshold value (%) at which to generate a warning msg\n"
8065 "Restart bgp connection after limit is exceeded\n"
8066 "Restart interval in minutes\n"
8067 "Force checking all received routes not only accepted\n")
8069 DEFUN (no_neighbor_maximum_prefix
,
8070 no_neighbor_maximum_prefix_cmd
,
8071 "no neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix [(1-4294967295) [(1-100)] [restart (1-65535)] [warning-only] [force]]",
8075 "Maximum number of prefixes to accept from this peer\n"
8076 "maximum no. of prefix limit\n"
8077 "Threshold value (%) at which to generate a warning msg\n"
8078 "Restart bgp connection after limit is exceeded\n"
8079 "Restart interval in minutes\n"
8080 "Only give warning message when limit is exceeded\n"
8081 "Force checking all received routes not only accepted\n")
8084 return peer_maximum_prefix_unset_vty(vty
, argv
[idx_peer
]->arg
,
8086 bgp_node_safi(vty
));
8090 no_neighbor_maximum_prefix
, no_neighbor_maximum_prefix_hidden_cmd
,
8091 "no neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix [(1-4294967295) [(1-100)] [restart (1-65535)] [warning-only] [force]]",
8092 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
8093 "Maximum number of prefixes to accept from this peer\n"
8094 "maximum no. of prefix limit\n"
8095 "Threshold value (%) at which to generate a warning msg\n"
8096 "Restart bgp connection after limit is exceeded\n"
8097 "Restart interval in minutes\n"
8098 "Only give warning message when limit is exceeded\n"
8099 "Force checking all received routes not only accepted\n")
8102 /* "neighbor allowas-in" */
8103 DEFUN (neighbor_allowas_in
,
8104 neighbor_allowas_in_cmd
,
8105 "neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
8108 "Accept as-path with my AS present in it\n"
8109 "Number of occurrences of AS number\n"
8110 "Only accept my AS in the as-path if the route was originated in my AS\n")
8113 int idx_number_origin
= 3;
8119 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
8121 return CMD_WARNING_CONFIG_FAILED
;
8123 if (argc
<= idx_number_origin
)
8126 if (argv
[idx_number_origin
]->type
== WORD_TKN
)
8129 allow_num
= atoi(argv
[idx_number_origin
]->arg
);
8132 ret
= peer_allowas_in_set(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
8135 return bgp_vty_return(vty
, ret
);
8139 neighbor_allowas_in
, neighbor_allowas_in_hidden_cmd
,
8140 "neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
8141 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
8142 "Accept as-path with my AS present in it\n"
8143 "Number of occurrences of AS number\n"
8144 "Only accept my AS in the as-path if the route was originated in my AS\n")
8146 DEFUN (no_neighbor_allowas_in
,
8147 no_neighbor_allowas_in_cmd
,
8148 "no neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
8152 "allow local ASN appears in aspath attribute\n"
8153 "Number of occurrences of AS number\n"
8154 "Only accept my AS in the as-path if the route was originated in my AS\n")
8160 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
8162 return CMD_WARNING_CONFIG_FAILED
;
8164 ret
= peer_allowas_in_unset(peer
, bgp_node_afi(vty
),
8165 bgp_node_safi(vty
));
8167 return bgp_vty_return(vty
, ret
);
8171 no_neighbor_allowas_in
, no_neighbor_allowas_in_hidden_cmd
,
8172 "no neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
8173 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
8174 "allow local ASN appears in aspath attribute\n"
8175 "Number of occurrences of AS number\n"
8176 "Only accept my AS in the as-path if the route was originated in my AS\n")
8178 DEFUN (neighbor_ttl_security
,
8179 neighbor_ttl_security_cmd
,
8180 "neighbor <A.B.C.D|X:X::X:X|WORD> ttl-security hops (1-254)",
8183 "BGP ttl-security parameters\n"
8184 "Specify the maximum number of hops to the BGP peer\n"
8185 "Number of hops to BGP peer\n")
8192 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
8194 return CMD_WARNING_CONFIG_FAILED
;
8196 gtsm_hops
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
8199 * If 'neighbor swpX', then this is for directly connected peers,
8200 * we should not accept a ttl-security hops value greater than 1.
8202 if (peer
->conf_if
&& (gtsm_hops
> BGP_GTSM_HOPS_CONNECTED
)) {
8204 "%s is directly connected peer, hops cannot exceed 1\n",
8205 argv
[idx_peer
]->arg
);
8206 return CMD_WARNING_CONFIG_FAILED
;
8209 return bgp_vty_return(vty
, peer_ttl_security_hops_set(peer
, gtsm_hops
));
8212 DEFUN (no_neighbor_ttl_security
,
8213 no_neighbor_ttl_security_cmd
,
8214 "no neighbor <A.B.C.D|X:X::X:X|WORD> ttl-security hops (1-254)",
8218 "BGP ttl-security parameters\n"
8219 "Specify the maximum number of hops to the BGP peer\n"
8220 "Number of hops to BGP peer\n")
8225 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
8227 return CMD_WARNING_CONFIG_FAILED
;
8229 return bgp_vty_return(vty
, peer_ttl_security_hops_unset(peer
));
8232 /* disable-addpath-rx */
8233 DEFUN(neighbor_disable_addpath_rx
,
8234 neighbor_disable_addpath_rx_cmd
,
8235 "neighbor <A.B.C.D|X:X::X:X|WORD> disable-addpath-rx",
8238 "Do not accept additional paths\n")
8240 char *peer_str
= argv
[1]->arg
;
8242 afi_t afi
= bgp_node_afi(vty
);
8243 safi_t safi
= bgp_node_safi(vty
);
8245 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
8247 return CMD_WARNING_CONFIG_FAILED
;
8249 return peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
,
8250 PEER_FLAG_DISABLE_ADDPATH_RX
);
8253 DEFUN(no_neighbor_disable_addpath_rx
,
8254 no_neighbor_disable_addpath_rx_cmd
,
8255 "no neighbor <A.B.C.D|X:X::X:X|WORD> disable-addpath-rx",
8259 "Do not accept additional paths\n")
8261 char *peer_str
= argv
[2]->arg
;
8263 afi_t afi
= bgp_node_afi(vty
);
8264 safi_t safi
= bgp_node_safi(vty
);
8266 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
8268 return CMD_WARNING_CONFIG_FAILED
;
8270 return peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
8271 PEER_FLAG_DISABLE_ADDPATH_RX
);
8274 DEFUN (neighbor_addpath_tx_all_paths
,
8275 neighbor_addpath_tx_all_paths_cmd
,
8276 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
8279 "Use addpath to advertise all paths to a neighbor\n")
8284 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
8286 return CMD_WARNING_CONFIG_FAILED
;
8288 bgp_addpath_set_peer_type(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
8293 ALIAS_HIDDEN(neighbor_addpath_tx_all_paths
,
8294 neighbor_addpath_tx_all_paths_hidden_cmd
,
8295 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
8296 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
8297 "Use addpath to advertise all paths to a neighbor\n")
8299 DEFUN (no_neighbor_addpath_tx_all_paths
,
8300 no_neighbor_addpath_tx_all_paths_cmd
,
8301 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
8305 "Use addpath to advertise all paths to a neighbor\n")
8310 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
8312 return CMD_WARNING_CONFIG_FAILED
;
8314 if (peer
->addpath_type
[bgp_node_afi(vty
)][bgp_node_safi(vty
)]
8315 != BGP_ADDPATH_ALL
) {
8317 "%% Peer not currently configured to transmit all paths.");
8318 return CMD_WARNING_CONFIG_FAILED
;
8321 bgp_addpath_set_peer_type(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
8327 ALIAS_HIDDEN(no_neighbor_addpath_tx_all_paths
,
8328 no_neighbor_addpath_tx_all_paths_hidden_cmd
,
8329 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
8330 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
8331 "Use addpath to advertise all paths to a neighbor\n")
8333 DEFUN (neighbor_addpath_tx_bestpath_per_as
,
8334 neighbor_addpath_tx_bestpath_per_as_cmd
,
8335 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
8338 "Use addpath to advertise the bestpath per each neighboring AS\n")
8343 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
8345 return CMD_WARNING_CONFIG_FAILED
;
8347 bgp_addpath_set_peer_type(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
8348 BGP_ADDPATH_BEST_PER_AS
);
8353 ALIAS_HIDDEN(neighbor_addpath_tx_bestpath_per_as
,
8354 neighbor_addpath_tx_bestpath_per_as_hidden_cmd
,
8355 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
8356 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
8357 "Use addpath to advertise the bestpath per each neighboring AS\n")
8359 DEFUN (no_neighbor_addpath_tx_bestpath_per_as
,
8360 no_neighbor_addpath_tx_bestpath_per_as_cmd
,
8361 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
8365 "Use addpath to advertise the bestpath per each neighboring AS\n")
8370 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
8372 return CMD_WARNING_CONFIG_FAILED
;
8374 if (peer
->addpath_type
[bgp_node_afi(vty
)][bgp_node_safi(vty
)]
8375 != BGP_ADDPATH_BEST_PER_AS
) {
8377 "%% Peer not currently configured to transmit all best path per as.");
8378 return CMD_WARNING_CONFIG_FAILED
;
8381 bgp_addpath_set_peer_type(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
8387 ALIAS_HIDDEN(no_neighbor_addpath_tx_bestpath_per_as
,
8388 no_neighbor_addpath_tx_bestpath_per_as_hidden_cmd
,
8389 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
8390 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
8391 "Use addpath to advertise the bestpath per each neighboring AS\n")
8394 neighbor_aspath_loop_detection
, neighbor_aspath_loop_detection_cmd
,
8395 "neighbor <A.B.C.D|X:X::X:X|WORD>$neighbor sender-as-path-loop-detection",
8398 "Detect AS loops before sending to neighbor\n")
8402 peer
= peer_and_group_lookup_vty(vty
, neighbor
);
8404 return CMD_WARNING_CONFIG_FAILED
;
8406 peer
->as_path_loop_detection
= true;
8412 no_neighbor_aspath_loop_detection
,
8413 no_neighbor_aspath_loop_detection_cmd
,
8414 "no neighbor <A.B.C.D|X:X::X:X|WORD>$neighbor sender-as-path-loop-detection",
8418 "Detect AS loops before sending to neighbor\n")
8422 peer
= peer_and_group_lookup_vty(vty
, neighbor
);
8424 return CMD_WARNING_CONFIG_FAILED
;
8426 peer
->as_path_loop_detection
= false;
8431 static int set_ecom_list(struct vty
*vty
, int argc
, struct cmd_token
**argv
,
8432 struct ecommunity
**list
, bool is_rt6
)
8434 struct ecommunity
*ecom
= NULL
;
8435 struct ecommunity
*ecomadd
;
8437 for (; argc
; --argc
, ++argv
) {
8439 ecomadd
= ecommunity_str2com_ipv6(argv
[0]->arg
,
8440 ECOMMUNITY_ROUTE_TARGET
,
8443 ecomadd
= ecommunity_str2com(argv
[0]->arg
,
8444 ECOMMUNITY_ROUTE_TARGET
,
8447 vty_out(vty
, "Malformed community-list value\n");
8449 ecommunity_free(&ecom
);
8450 return CMD_WARNING_CONFIG_FAILED
;
8454 ecommunity_merge(ecom
, ecomadd
);
8455 ecommunity_free(&ecomadd
);
8462 ecommunity_free(&*list
);
8470 * v2vimport is true if we are handling a `import vrf ...` command
8472 static afi_t
vpn_policy_getafi(struct vty
*vty
, struct bgp
*bgp
, bool v2vimport
)
8476 switch (vty
->node
) {
8485 "%% context error: valid only in address-family <ipv4|ipv6> unicast block\n");
8490 if (CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
8491 BGP_CONFIG_VRF_TO_VRF_IMPORT
)
8492 || CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
8493 BGP_CONFIG_VRF_TO_VRF_EXPORT
)) {
8495 "%% error: Please unconfigure import vrf commands before using vpn commands\n");
8499 if (CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
8500 BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT
)
8501 || CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
8502 BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT
)) {
8504 "%% error: Please unconfigure vpn to vrf commands before using import vrf commands\n");
8511 DEFPY (af_rd_vpn_export
,
8512 af_rd_vpn_export_cmd
,
8513 "[no] rd vpn export ASN:NN_OR_IP-ADDRESS:NN$rd_str",
8515 "Specify route distinguisher\n"
8516 "Between current address-family and vpn\n"
8517 "For routes leaked from current address-family to vpn\n"
8518 "Route Distinguisher (<as-number>:<number> | <ip-address>:<number>)\n")
8520 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
8521 struct prefix_rd prd
;
8527 if (argv_find(argv
, argc
, "no", &idx
))
8531 ret
= str2prefix_rd(rd_str
, &prd
);
8533 vty_out(vty
, "%% Malformed rd\n");
8534 return CMD_WARNING_CONFIG_FAILED
;
8538 afi
= vpn_policy_getafi(vty
, bgp
, false);
8540 return CMD_WARNING_CONFIG_FAILED
;
8543 * pre-change: un-export vpn routes (vpn->vrf routes unaffected)
8545 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
8546 bgp_get_default(), bgp
);
8549 bgp
->vpn_policy
[afi
].tovpn_rd
= prd
;
8550 SET_FLAG(bgp
->vpn_policy
[afi
].flags
,
8551 BGP_VPN_POLICY_TOVPN_RD_SET
);
8553 UNSET_FLAG(bgp
->vpn_policy
[afi
].flags
,
8554 BGP_VPN_POLICY_TOVPN_RD_SET
);
8557 /* post-change: re-export vpn routes */
8558 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
8559 bgp_get_default(), bgp
);
8564 ALIAS (af_rd_vpn_export
,
8565 af_no_rd_vpn_export_cmd
,
8568 "Specify route distinguisher\n"
8569 "Between current address-family and vpn\n"
8570 "For routes leaked from current address-family to vpn\n")
8572 DEFPY (af_label_vpn_export
,
8573 af_label_vpn_export_cmd
,
8574 "[no] label vpn export <(0-1048575)$label_val|auto$label_auto>",
8576 "label value for VRF\n"
8577 "Between current address-family and vpn\n"
8578 "For routes leaked from current address-family to vpn\n"
8579 "Label Value <0-1048575>\n"
8580 "Automatically assign a label\n")
8582 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
8583 mpls_label_t label
= MPLS_LABEL_NONE
;
8588 if (argv_find(argv
, argc
, "no", &idx
))
8591 /* If "no ...", squash trailing parameter */
8597 label
= label_val
; /* parser should force unsigned */
8600 afi
= vpn_policy_getafi(vty
, bgp
, false);
8602 return CMD_WARNING_CONFIG_FAILED
;
8605 if (label_auto
&& CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
8606 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
))
8611 * pre-change: un-export vpn routes (vpn->vrf routes unaffected)
8613 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
8614 bgp_get_default(), bgp
);
8616 if (!label_auto
&& CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
8617 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
)) {
8619 if (bgp
->vpn_policy
[afi
].tovpn_label
!= MPLS_LABEL_NONE
) {
8622 * label has previously been automatically
8623 * assigned by labelpool: release it
8625 * NB if tovpn_label == MPLS_LABEL_NONE it
8626 * means the automatic assignment is in flight
8627 * and therefore the labelpool callback must
8628 * detect that the auto label is not needed.
8631 bgp_lp_release(LP_TYPE_VRF
,
8632 &bgp
->vpn_policy
[afi
],
8633 bgp
->vpn_policy
[afi
].tovpn_label
);
8635 UNSET_FLAG(bgp
->vpn_policy
[afi
].flags
,
8636 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
);
8639 bgp
->vpn_policy
[afi
].tovpn_label
= label
;
8641 SET_FLAG(bgp
->vpn_policy
[afi
].flags
,
8642 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
);
8643 bgp_lp_get(LP_TYPE_VRF
, &bgp
->vpn_policy
[afi
],
8644 vpn_leak_label_callback
);
8647 /* post-change: re-export vpn routes */
8648 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
8649 bgp_get_default(), bgp
);
8651 hook_call(bgp_snmp_update_last_changed
, bgp
);
8655 DEFPY (af_sid_vpn_export
,
8656 af_sid_vpn_export_cmd
,
8657 "[no] sid vpn export <(1-255)$sid_idx|auto$sid_auto>",
8659 "sid value for VRF\n"
8660 "Between current address-family and vpn\n"
8661 "For routes leaked from current address-family to vpn\n"
8662 "Sid allocation index\n"
8663 "Automatically assign a label\n")
8665 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
8671 if (argv_find(argv
, argc
, "no", &idx
))
8673 debug
= (BGP_DEBUG(vpn
, VPN_LEAK_TO_VRF
) |
8674 BGP_DEBUG(vpn
, VPN_LEAK_FROM_VRF
));
8676 afi
= vpn_policy_getafi(vty
, bgp
, false);
8678 return CMD_WARNING_CONFIG_FAILED
;
8682 vty_out(vty
, "It's not implemented\n");
8683 return CMD_WARNING_CONFIG_FAILED
;
8686 /* skip when it's already configured */
8687 if ((sid_idx
!= 0 && bgp
->vpn_policy
[afi
].tovpn_sid_index
!= 0)
8688 || (sid_auto
&& CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
8689 BGP_VPN_POLICY_TOVPN_SID_AUTO
)))
8693 * mode change between sid_idx and sid_auto isn't supported.
8694 * user must negate sid vpn export when they want to change the mode
8696 if ((sid_auto
&& bgp
->vpn_policy
[afi
].tovpn_sid_index
!= 0)
8697 || (sid_idx
!= 0 && CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
8698 BGP_VPN_POLICY_TOVPN_SID_AUTO
))) {
8699 vty_out(vty
, "it's already configured as %s.\n",
8700 sid_auto
? "auto-mode" : "idx-mode");
8701 return CMD_WARNING_CONFIG_FAILED
;
8705 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
8706 bgp_get_default(), bgp
);
8709 /* SID allocation auto-mode */
8711 zlog_debug("%s: auto sid alloc.", __func__
);
8712 SET_FLAG(bgp
->vpn_policy
[afi
].flags
,
8713 BGP_VPN_POLICY_TOVPN_SID_AUTO
);
8715 /* SID allocation index-mode */
8717 zlog_debug("%s: idx %ld sid alloc.", __func__
, sid_idx
);
8718 bgp
->vpn_policy
[afi
].tovpn_sid_index
= sid_idx
;
8722 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
8723 bgp_get_default(), bgp
);
8727 ALIAS (af_label_vpn_export
,
8728 af_no_label_vpn_export_cmd
,
8729 "no label vpn export",
8731 "label value for VRF\n"
8732 "Between current address-family and vpn\n"
8733 "For routes leaked from current address-family to vpn\n")
8735 DEFPY (af_nexthop_vpn_export
,
8736 af_nexthop_vpn_export_cmd
,
8737 "[no] nexthop vpn export [<A.B.C.D|X:X::X:X>$nexthop_su]",
8739 "Specify next hop to use for VRF advertised prefixes\n"
8740 "Between current address-family and vpn\n"
8741 "For routes leaked from current address-family to vpn\n"
8745 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
8751 vty_out(vty
, "%% Nexthop required\n");
8752 return CMD_WARNING_CONFIG_FAILED
;
8754 if (!sockunion2hostprefix(nexthop_su
, &p
))
8755 return CMD_WARNING_CONFIG_FAILED
;
8758 afi
= vpn_policy_getafi(vty
, bgp
, false);
8760 return CMD_WARNING_CONFIG_FAILED
;
8763 * pre-change: un-export vpn routes (vpn->vrf routes unaffected)
8765 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
8766 bgp_get_default(), bgp
);
8769 bgp
->vpn_policy
[afi
].tovpn_nexthop
= p
;
8770 SET_FLAG(bgp
->vpn_policy
[afi
].flags
,
8771 BGP_VPN_POLICY_TOVPN_NEXTHOP_SET
);
8773 UNSET_FLAG(bgp
->vpn_policy
[afi
].flags
,
8774 BGP_VPN_POLICY_TOVPN_NEXTHOP_SET
);
8777 /* post-change: re-export vpn routes */
8778 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
8779 bgp_get_default(), bgp
);
8784 static int vpn_policy_getdirs(struct vty
*vty
, const char *dstr
, int *dodir
)
8786 if (!strcmp(dstr
, "import")) {
8787 dodir
[BGP_VPN_POLICY_DIR_FROMVPN
] = 1;
8788 } else if (!strcmp(dstr
, "export")) {
8789 dodir
[BGP_VPN_POLICY_DIR_TOVPN
] = 1;
8790 } else if (!strcmp(dstr
, "both")) {
8791 dodir
[BGP_VPN_POLICY_DIR_FROMVPN
] = 1;
8792 dodir
[BGP_VPN_POLICY_DIR_TOVPN
] = 1;
8794 vty_out(vty
, "%% direction parse error\n");
8795 return CMD_WARNING_CONFIG_FAILED
;
8800 DEFPY (af_rt_vpn_imexport
,
8801 af_rt_vpn_imexport_cmd
,
8802 "[no] <rt|route-target> vpn <import|export|both>$direction_str RTLIST...",
8804 "Specify route target list\n"
8805 "Specify route target list\n"
8806 "Between current address-family and vpn\n"
8807 "For routes leaked from vpn to current address-family: match any\n"
8808 "For routes leaked from current address-family to vpn: set\n"
8809 "both import: match any and export: set\n"
8810 "Space separated route target list (A.B.C.D:MN|EF:OPQR|GHJK:MN)\n")
8812 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
8814 struct ecommunity
*ecom
= NULL
;
8815 int dodir
[BGP_VPN_POLICY_DIR_MAX
] = {0};
8816 enum vpn_policy_direction dir
;
8821 if (argv_find(argv
, argc
, "no", &idx
))
8824 afi
= vpn_policy_getafi(vty
, bgp
, false);
8826 return CMD_WARNING_CONFIG_FAILED
;
8828 ret
= vpn_policy_getdirs(vty
, direction_str
, dodir
);
8829 if (ret
!= CMD_SUCCESS
)
8833 if (!argv_find(argv
, argc
, "RTLIST", &idx
)) {
8834 vty_out(vty
, "%% Missing RTLIST\n");
8835 return CMD_WARNING_CONFIG_FAILED
;
8837 ret
= set_ecom_list(vty
, argc
- idx
, argv
+ idx
, &ecom
, false);
8838 if (ret
!= CMD_SUCCESS
) {
8843 for (dir
= 0; dir
< BGP_VPN_POLICY_DIR_MAX
; ++dir
) {
8847 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
8850 if (bgp
->vpn_policy
[afi
].rtlist
[dir
])
8852 &bgp
->vpn_policy
[afi
].rtlist
[dir
]);
8853 bgp
->vpn_policy
[afi
].rtlist
[dir
] =
8854 ecommunity_dup(ecom
);
8856 if (bgp
->vpn_policy
[afi
].rtlist
[dir
])
8858 &bgp
->vpn_policy
[afi
].rtlist
[dir
]);
8859 bgp
->vpn_policy
[afi
].rtlist
[dir
] = NULL
;
8862 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
8866 ecommunity_free(&ecom
);
8871 ALIAS (af_rt_vpn_imexport
,
8872 af_no_rt_vpn_imexport_cmd
,
8873 "no <rt|route-target> vpn <import|export|both>$direction_str",
8875 "Specify route target list\n"
8876 "Specify route target list\n"
8877 "Between current address-family and vpn\n"
8878 "For routes leaked from vpn to current address-family\n"
8879 "For routes leaked from current address-family to vpn\n"
8880 "both import and export\n")
8882 DEFPY (af_route_map_vpn_imexport
,
8883 af_route_map_vpn_imexport_cmd
,
8884 /* future: "route-map <vpn|evpn|vrf NAME> <import|export> RMAP" */
8885 "[no] route-map vpn <import|export>$direction_str RMAP$rmap_str",
8887 "Specify route map\n"
8888 "Between current address-family and vpn\n"
8889 "For routes leaked from vpn to current address-family\n"
8890 "For routes leaked from current address-family to vpn\n"
8891 "name of route-map\n")
8893 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
8895 int dodir
[BGP_VPN_POLICY_DIR_MAX
] = {0};
8896 enum vpn_policy_direction dir
;
8901 if (argv_find(argv
, argc
, "no", &idx
))
8904 afi
= vpn_policy_getafi(vty
, bgp
, false);
8906 return CMD_WARNING_CONFIG_FAILED
;
8908 ret
= vpn_policy_getdirs(vty
, direction_str
, dodir
);
8909 if (ret
!= CMD_SUCCESS
)
8912 for (dir
= 0; dir
< BGP_VPN_POLICY_DIR_MAX
; ++dir
) {
8916 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
8919 if (bgp
->vpn_policy
[afi
].rmap_name
[dir
])
8920 XFREE(MTYPE_ROUTE_MAP_NAME
,
8921 bgp
->vpn_policy
[afi
].rmap_name
[dir
]);
8922 bgp
->vpn_policy
[afi
].rmap_name
[dir
] = XSTRDUP(
8923 MTYPE_ROUTE_MAP_NAME
, rmap_str
);
8924 bgp
->vpn_policy
[afi
].rmap
[dir
] =
8925 route_map_lookup_warn_noexist(vty
, rmap_str
);
8926 if (!bgp
->vpn_policy
[afi
].rmap
[dir
])
8929 if (bgp
->vpn_policy
[afi
].rmap_name
[dir
])
8930 XFREE(MTYPE_ROUTE_MAP_NAME
,
8931 bgp
->vpn_policy
[afi
].rmap_name
[dir
]);
8932 bgp
->vpn_policy
[afi
].rmap_name
[dir
] = NULL
;
8933 bgp
->vpn_policy
[afi
].rmap
[dir
] = NULL
;
8936 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
8942 ALIAS (af_route_map_vpn_imexport
,
8943 af_no_route_map_vpn_imexport_cmd
,
8944 "no route-map vpn <import|export>$direction_str",
8946 "Specify route map\n"
8947 "Between current address-family and vpn\n"
8948 "For routes leaked from vpn to current address-family\n"
8949 "For routes leaked from current address-family to vpn\n")
8951 DEFPY(af_import_vrf_route_map
, af_import_vrf_route_map_cmd
,
8952 "import vrf route-map RMAP$rmap_str",
8953 "Import routes from another VRF\n"
8954 "Vrf routes being filtered\n"
8955 "Specify route map\n"
8956 "name of route-map\n")
8958 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
8959 enum vpn_policy_direction dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
8961 struct bgp
*bgp_default
;
8963 afi
= vpn_policy_getafi(vty
, bgp
, true);
8965 return CMD_WARNING_CONFIG_FAILED
;
8967 bgp_default
= bgp_get_default();
8972 /* Auto-create assuming the same AS */
8973 ret
= bgp_get_vty(&bgp_default
, &as
, NULL
,
8974 BGP_INSTANCE_TYPE_DEFAULT
);
8978 "VRF default is not configured as a bgp instance\n");
8983 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
8985 if (bgp
->vpn_policy
[afi
].rmap_name
[dir
])
8986 XFREE(MTYPE_ROUTE_MAP_NAME
,
8987 bgp
->vpn_policy
[afi
].rmap_name
[dir
]);
8988 bgp
->vpn_policy
[afi
].rmap_name
[dir
] =
8989 XSTRDUP(MTYPE_ROUTE_MAP_NAME
, rmap_str
);
8990 bgp
->vpn_policy
[afi
].rmap
[dir
] =
8991 route_map_lookup_warn_noexist(vty
, rmap_str
);
8992 if (!bgp
->vpn_policy
[afi
].rmap
[dir
])
8995 SET_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
8996 BGP_CONFIG_VRF_TO_VRF_IMPORT
);
8998 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
9003 DEFPY(af_no_import_vrf_route_map
, af_no_import_vrf_route_map_cmd
,
9004 "no import vrf route-map [RMAP$rmap_str]",
9006 "Import routes from another VRF\n"
9007 "Vrf routes being filtered\n"
9008 "Specify route map\n"
9009 "name of route-map\n")
9011 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9012 enum vpn_policy_direction dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
9015 afi
= vpn_policy_getafi(vty
, bgp
, true);
9017 return CMD_WARNING_CONFIG_FAILED
;
9019 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
9021 if (bgp
->vpn_policy
[afi
].rmap_name
[dir
])
9022 XFREE(MTYPE_ROUTE_MAP_NAME
,
9023 bgp
->vpn_policy
[afi
].rmap_name
[dir
]);
9024 bgp
->vpn_policy
[afi
].rmap_name
[dir
] = NULL
;
9025 bgp
->vpn_policy
[afi
].rmap
[dir
] = NULL
;
9027 if (bgp
->vpn_policy
[afi
].import_vrf
->count
== 0)
9028 UNSET_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
9029 BGP_CONFIG_VRF_TO_VRF_IMPORT
);
9031 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
9036 DEFPY(bgp_imexport_vrf
, bgp_imexport_vrf_cmd
,
9037 "[no] import vrf VIEWVRFNAME$import_name",
9039 "Import routes from another VRF\n"
9040 "VRF to import from\n"
9041 "The name of the VRF\n")
9043 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9044 struct listnode
*node
;
9045 struct bgp
*vrf_bgp
, *bgp_default
;
9048 bool remove
= false;
9051 enum bgp_instance_type bgp_type
= BGP_INSTANCE_TYPE_VRF
;
9055 if (import_name
== NULL
) {
9056 vty_out(vty
, "%% Missing import name\n");
9060 if (strcmp(import_name
, "route-map") == 0) {
9061 vty_out(vty
, "%% Must include route-map name\n");
9065 if (argv_find(argv
, argc
, "no", &idx
))
9068 afi
= vpn_policy_getafi(vty
, bgp
, true);
9070 return CMD_WARNING_CONFIG_FAILED
;
9072 safi
= bgp_node_safi(vty
);
9074 if (((BGP_INSTANCE_TYPE_DEFAULT
== bgp
->inst_type
)
9075 && (strcmp(import_name
, VRF_DEFAULT_NAME
) == 0))
9076 || (bgp
->name
&& (strcmp(import_name
, bgp
->name
) == 0))) {
9077 vty_out(vty
, "%% Cannot %s vrf %s into itself\n",
9078 remove
? "unimport" : "import", import_name
);
9082 bgp_default
= bgp_get_default();
9084 /* Auto-create assuming the same AS */
9085 ret
= bgp_get_vty(&bgp_default
, &as
, NULL
,
9086 BGP_INSTANCE_TYPE_DEFAULT
);
9090 "VRF default is not configured as a bgp instance\n");
9095 vrf_bgp
= bgp_lookup_by_name(import_name
);
9097 if (strcmp(import_name
, VRF_DEFAULT_NAME
) == 0)
9098 vrf_bgp
= bgp_default
;
9100 /* Auto-create assuming the same AS */
9101 ret
= bgp_get_vty(&vrf_bgp
, &as
, import_name
, bgp_type
);
9105 "VRF %s is not configured as a bgp instance\n",
9112 vrf_unimport_from_vrf(bgp
, vrf_bgp
, afi
, safi
);
9114 /* Already importing from "import_vrf"? */
9115 for (ALL_LIST_ELEMENTS_RO(bgp
->vpn_policy
[afi
].import_vrf
, node
,
9117 if (strcmp(vname
, import_name
) == 0)
9121 vrf_import_from_vrf(bgp
, vrf_bgp
, afi
, safi
);
9127 /* This command is valid only in a bgp vrf instance or the default instance */
9128 DEFPY (bgp_imexport_vpn
,
9129 bgp_imexport_vpn_cmd
,
9130 "[no] <import|export>$direction_str vpn",
9132 "Import routes to this address-family\n"
9133 "Export routes from this address-family\n"
9134 "to/from default instance VPN RIB\n")
9136 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9143 enum vpn_policy_direction dir
;
9145 if (argv_find(argv
, argc
, "no", &idx
))
9148 if (BGP_INSTANCE_TYPE_VRF
!= bgp
->inst_type
&&
9149 BGP_INSTANCE_TYPE_DEFAULT
!= bgp
->inst_type
) {
9151 vty_out(vty
, "%% import|export vpn valid only for bgp vrf or default instance\n");
9152 return CMD_WARNING_CONFIG_FAILED
;
9155 afi
= bgp_node_afi(vty
);
9156 safi
= bgp_node_safi(vty
);
9157 if ((SAFI_UNICAST
!= safi
) || ((AFI_IP
!= afi
) && (AFI_IP6
!= afi
))) {
9158 vty_out(vty
, "%% import|export vpn valid only for unicast ipv4|ipv6\n");
9159 return CMD_WARNING_CONFIG_FAILED
;
9162 if (!strcmp(direction_str
, "import")) {
9163 flag
= BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT
;
9164 dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
9165 } else if (!strcmp(direction_str
, "export")) {
9166 flag
= BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT
;
9167 dir
= BGP_VPN_POLICY_DIR_TOVPN
;
9169 vty_out(vty
, "%% unknown direction %s\n", direction_str
);
9170 return CMD_WARNING_CONFIG_FAILED
;
9173 previous_state
= CHECK_FLAG(bgp
->af_flags
[afi
][safi
], flag
);
9176 SET_FLAG(bgp
->af_flags
[afi
][safi
], flag
);
9177 if (!previous_state
) {
9178 /* trigger export current vrf */
9179 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
9182 if (previous_state
) {
9183 /* trigger un-export current vrf */
9184 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
9186 UNSET_FLAG(bgp
->af_flags
[afi
][safi
], flag
);
9189 hook_call(bgp_snmp_init_stats
, bgp
);
9194 DEFPY (af_routetarget_import
,
9195 af_routetarget_import_cmd
,
9196 "[no] <rt|route-target|route-target6|rt6> redirect import RTLIST...",
9198 "Specify route target list\n"
9199 "Specify route target list\n"
9200 "Specify route target list\n"
9201 "Specify route target list\n"
9202 "Flow-spec redirect type route target\n"
9203 "Import routes to this address-family\n"
9204 "Space separated route target list (A.B.C.D:MN|EF:OPQR|GHJK:MN|IPV6:MN)\n")
9206 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9208 struct ecommunity
*ecom
= NULL
;
9210 int idx
= 0, idx_unused
= 0;
9214 if (argv_find(argv
, argc
, "no", &idx
))
9217 if (argv_find(argv
, argc
, "rt6", &idx_unused
) ||
9218 argv_find(argv
, argc
, "route-target6", &idx_unused
))
9221 afi
= vpn_policy_getafi(vty
, bgp
, false);
9223 return CMD_WARNING_CONFIG_FAILED
;
9225 if (rt6
&& afi
!= AFI_IP6
)
9226 return CMD_WARNING_CONFIG_FAILED
;
9229 if (!argv_find(argv
, argc
, "RTLIST", &idx
)) {
9230 vty_out(vty
, "%% Missing RTLIST\n");
9231 return CMD_WARNING_CONFIG_FAILED
;
9233 ret
= set_ecom_list(vty
, argc
- idx
, argv
+ idx
, &ecom
, rt6
);
9234 if (ret
!= CMD_SUCCESS
)
9239 if (bgp
->vpn_policy
[afi
].import_redirect_rtlist
)
9240 ecommunity_free(&bgp
->vpn_policy
[afi
]
9241 .import_redirect_rtlist
);
9242 bgp
->vpn_policy
[afi
].import_redirect_rtlist
=
9243 ecommunity_dup(ecom
);
9245 if (bgp
->vpn_policy
[afi
].import_redirect_rtlist
)
9246 ecommunity_free(&bgp
->vpn_policy
[afi
]
9247 .import_redirect_rtlist
);
9248 bgp
->vpn_policy
[afi
].import_redirect_rtlist
= NULL
;
9252 ecommunity_free(&ecom
);
9257 DEFUN_NOSH (address_family_ipv4_safi
,
9258 address_family_ipv4_safi_cmd
,
9259 "address-family ipv4 [<unicast|multicast|vpn|labeled-unicast|flowspec>]",
9260 "Enter Address Family command mode\n"
9262 BGP_SAFI_WITH_LABEL_HELP_STR
)
9266 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9267 safi_t safi
= bgp_vty_safi_from_str(argv
[2]->text
);
9268 if (bgp
->inst_type
!= BGP_INSTANCE_TYPE_DEFAULT
9269 && safi
!= SAFI_UNICAST
&& safi
!= SAFI_MULTICAST
9270 && safi
!= SAFI_EVPN
) {
9272 "Only Unicast/Multicast/EVPN SAFIs supported in non-core instances.\n");
9273 return CMD_WARNING_CONFIG_FAILED
;
9275 vty
->node
= bgp_node_type(AFI_IP
, safi
);
9277 vty
->node
= BGP_IPV4_NODE
;
9282 DEFUN_NOSH (address_family_ipv6_safi
,
9283 address_family_ipv6_safi_cmd
,
9284 "address-family ipv6 [<unicast|multicast|vpn|labeled-unicast|flowspec>]",
9285 "Enter Address Family command mode\n"
9287 BGP_SAFI_WITH_LABEL_HELP_STR
)
9290 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9291 safi_t safi
= bgp_vty_safi_from_str(argv
[2]->text
);
9292 if (bgp
->inst_type
!= BGP_INSTANCE_TYPE_DEFAULT
9293 && safi
!= SAFI_UNICAST
&& safi
!= SAFI_MULTICAST
9294 && safi
!= SAFI_EVPN
) {
9296 "Only Unicast/Multicast/EVPN SAFIs supported in non-core instances.\n");
9297 return CMD_WARNING_CONFIG_FAILED
;
9299 vty
->node
= bgp_node_type(AFI_IP6
, safi
);
9301 vty
->node
= BGP_IPV6_NODE
;
9306 #ifdef KEEP_OLD_VPN_COMMANDS
9307 DEFUN_NOSH (address_family_vpnv4
,
9308 address_family_vpnv4_cmd
,
9309 "address-family vpnv4 [unicast]",
9310 "Enter Address Family command mode\n"
9312 "Address Family modifier\n")
9314 vty
->node
= BGP_VPNV4_NODE
;
9318 DEFUN_NOSH (address_family_vpnv6
,
9319 address_family_vpnv6_cmd
,
9320 "address-family vpnv6 [unicast]",
9321 "Enter Address Family command mode\n"
9323 "Address Family modifier\n")
9325 vty
->node
= BGP_VPNV6_NODE
;
9328 #endif /* KEEP_OLD_VPN_COMMANDS */
9330 DEFUN_NOSH (address_family_evpn
,
9331 address_family_evpn_cmd
,
9332 "address-family l2vpn evpn",
9333 "Enter Address Family command mode\n"
9335 "Address Family modifier\n")
9337 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9338 vty
->node
= BGP_EVPN_NODE
;
9342 DEFUN_NOSH (bgp_segment_routing_srv6
,
9343 bgp_segment_routing_srv6_cmd
,
9344 "segment-routing srv6",
9345 "Segment-Routing configuration\n"
9346 "Segment-Routing SRv6 configuration\n")
9348 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9349 bgp
->srv6_enabled
= true;
9350 vty
->node
= BGP_SRV6_NODE
;
9354 DEFUN (no_bgp_segment_routing_srv6
,
9355 no_bgp_segment_routing_srv6_cmd
,
9356 "no segment-routing srv6",
9358 "Segment-Routing configuration\n"
9359 "Segment-Routing SRv6 configuration\n")
9361 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9363 if (strlen(bgp
->srv6_locator_name
) > 0)
9364 if (bgp_srv6_locator_unset(bgp
) < 0)
9365 return CMD_WARNING_CONFIG_FAILED
;
9367 bgp
->srv6_enabled
= false;
9371 DEFPY (bgp_srv6_locator
,
9372 bgp_srv6_locator_cmd
,
9373 "locator NAME$name",
9374 "Specify SRv6 locator\n"
9375 "Specify SRv6 locator\n")
9377 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9380 if (strlen(bgp
->srv6_locator_name
) > 0
9381 && strcmp(name
, bgp
->srv6_locator_name
) != 0) {
9382 vty_out(vty
, "srv6 locator is already configured\n");
9383 return CMD_WARNING_CONFIG_FAILED
;
9386 snprintf(bgp
->srv6_locator_name
,
9387 sizeof(bgp
->srv6_locator_name
), "%s", name
);
9389 ret
= bgp_zebra_srv6_manager_get_locator_chunk(name
);
9391 return CMD_WARNING_CONFIG_FAILED
;
9396 DEFPY (no_bgp_srv6_locator
,
9397 no_bgp_srv6_locator_cmd
,
9398 "no locator NAME$name",
9400 "Specify SRv6 locator\n"
9401 "Specify SRv6 locator\n")
9403 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9405 /* when locator isn't configured, do nothing */
9406 if (strlen(bgp
->srv6_locator_name
) < 1)
9409 /* name validation */
9410 if (strcmp(name
, bgp
->srv6_locator_name
) != 0) {
9411 vty_out(vty
, "%% No srv6 locator is configured\n");
9412 return CMD_WARNING_CONFIG_FAILED
;
9416 if (bgp_srv6_locator_unset(bgp
) < 0)
9417 return CMD_WARNING_CONFIG_FAILED
;
9422 DEFPY (show_bgp_srv6
,
9424 "show bgp segment-routing srv6",
9427 "BGP Segment Routing\n"
9428 "BGP Segment Routing SRv6\n")
9431 struct listnode
*node
;
9432 struct srv6_locator_chunk
*chunk
;
9433 struct bgp_srv6_function
*func
;
9434 struct in6_addr
*tovpn4_sid
;
9435 struct in6_addr
*tovpn6_sid
;
9437 char buf_tovpn4_sid
[256];
9438 char buf_tovpn6_sid
[256];
9440 bgp
= bgp_get_default();
9444 vty_out(vty
, "locator_name: %s\n", bgp
->srv6_locator_name
);
9445 vty_out(vty
, "locator_chunks:\n");
9446 for (ALL_LIST_ELEMENTS_RO(bgp
->srv6_locator_chunks
, node
, chunk
)) {
9447 prefix2str(&chunk
->prefix
, buf
, sizeof(buf
));
9448 vty_out(vty
, "- %s\n", buf
);
9451 vty_out(vty
, "functions:\n");
9452 for (ALL_LIST_ELEMENTS_RO(bgp
->srv6_functions
, node
, func
)) {
9453 inet_ntop(AF_INET6
, &func
->sid
, buf
, sizeof(buf
));
9454 vty_out(vty
, "- sid: %s\n", buf
);
9455 vty_out(vty
, " locator: %s\n", func
->locator_name
);
9458 vty_out(vty
, "bgps:\n");
9459 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, node
, bgp
)) {
9460 vty_out(vty
, "- name: %s\n",
9461 bgp
->name
? bgp
->name
: "default");
9463 tovpn4_sid
= bgp
->vpn_policy
[AFI_IP
].tovpn_sid
;
9464 tovpn6_sid
= bgp
->vpn_policy
[AFI_IP6
].tovpn_sid
;
9466 inet_ntop(AF_INET6
, tovpn4_sid
, buf_tovpn4_sid
,
9467 sizeof(buf_tovpn4_sid
));
9469 inet_ntop(AF_INET6
, tovpn6_sid
, buf_tovpn6_sid
,
9470 sizeof(buf_tovpn6_sid
));
9472 vty_out(vty
, " vpn_policy[AFI_IP].tovpn_sid: %s\n",
9473 tovpn4_sid
? buf_tovpn4_sid
: "none");
9474 vty_out(vty
, " vpn_policy[AFI_IP6].tovpn_sid: %s\n",
9475 tovpn6_sid
? buf_tovpn6_sid
: "none");
9481 DEFUN_NOSH (exit_address_family
,
9482 exit_address_family_cmd
,
9483 "exit-address-family",
9484 "Exit from Address Family configuration mode\n")
9486 if (vty
->node
== BGP_IPV4_NODE
|| vty
->node
== BGP_IPV4M_NODE
9487 || vty
->node
== BGP_IPV4L_NODE
|| vty
->node
== BGP_VPNV4_NODE
9488 || vty
->node
== BGP_IPV6_NODE
|| vty
->node
== BGP_IPV6M_NODE
9489 || vty
->node
== BGP_IPV6L_NODE
|| vty
->node
== BGP_VPNV6_NODE
9490 || vty
->node
== BGP_EVPN_NODE
9491 || vty
->node
== BGP_FLOWSPECV4_NODE
9492 || vty
->node
== BGP_FLOWSPECV6_NODE
)
9493 vty
->node
= BGP_NODE
;
9497 /* Recalculate bestpath and re-advertise a prefix */
9498 static int bgp_clear_prefix(struct vty
*vty
, const char *view_name
,
9499 const char *ip_str
, afi_t afi
, safi_t safi
,
9500 struct prefix_rd
*prd
)
9503 struct prefix match
;
9504 struct bgp_dest
*dest
;
9505 struct bgp_dest
*rm
;
9507 struct bgp_table
*table
;
9508 struct bgp_table
*rib
;
9510 /* BGP structure lookup. */
9512 bgp
= bgp_lookup_by_name(view_name
);
9514 vty_out(vty
, "%% Can't find BGP instance %s\n",
9519 bgp
= bgp_get_default();
9521 vty_out(vty
, "%% No BGP process is configured\n");
9526 /* Check IP address argument. */
9527 ret
= str2prefix(ip_str
, &match
);
9529 vty_out(vty
, "%% address is malformed\n");
9533 match
.family
= afi2family(afi
);
9534 rib
= bgp
->rib
[afi
][safi
];
9536 if (safi
== SAFI_MPLS_VPN
) {
9537 for (dest
= bgp_table_top(rib
); dest
;
9538 dest
= bgp_route_next(dest
)) {
9539 const struct prefix
*dest_p
= bgp_dest_get_prefix(dest
);
9541 if (prd
&& memcmp(dest_p
->u
.val
, prd
->val
, 8) != 0)
9544 table
= bgp_dest_get_bgp_table_info(dest
);
9548 rm
= bgp_node_match(table
, &match
);
9550 const struct prefix
*rm_p
=
9551 bgp_dest_get_prefix(rm
);
9553 if (rm_p
->prefixlen
== match
.prefixlen
) {
9555 BGP_NODE_USER_CLEAR
);
9556 bgp_process(bgp
, rm
, afi
, safi
);
9558 bgp_dest_unlock_node(rm
);
9562 dest
= bgp_node_match(rib
, &match
);
9564 const struct prefix
*dest_p
= bgp_dest_get_prefix(dest
);
9566 if (dest_p
->prefixlen
== match
.prefixlen
) {
9567 SET_FLAG(dest
->flags
, BGP_NODE_USER_CLEAR
);
9568 bgp_process(bgp
, dest
, afi
, safi
);
9570 bgp_dest_unlock_node(dest
);
9577 /* one clear bgp command to rule them all */
9578 DEFUN (clear_ip_bgp_all
,
9579 clear_ip_bgp_all_cmd
,
9580 "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|message-stats>]",
9584 BGP_INSTANCE_HELP_STR
9587 BGP_SAFI_WITH_LABEL_HELP_STR
9588 "Address Family modifier\n"
9590 "BGP IPv4 neighbor to clear\n"
9591 "BGP IPv6 neighbor to clear\n"
9592 "BGP neighbor on interface to clear\n"
9593 "Clear peers with the AS number\n"
9594 "Clear all external peers\n"
9595 "Clear all members of peer-group\n"
9596 "BGP peer-group name\n"
9601 "Push out prefix-list ORF and do inbound soft reconfig\n"
9603 "Reset message statistics\n")
9607 afi_t afi
= AFI_UNSPEC
;
9608 safi_t safi
= SAFI_UNSPEC
;
9609 enum clear_sort clr_sort
= clear_peer
;
9610 enum bgp_clear_type clr_type
;
9611 char *clr_arg
= NULL
;
9615 /* clear [ip] bgp */
9616 if (argv_find(argv
, argc
, "ip", &idx
))
9619 /* [<vrf> VIEWVRFNAME] */
9620 if (argv_find(argv
, argc
, "vrf", &idx
)) {
9621 vrf
= argv
[idx
+ 1]->arg
;
9623 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
9625 } else if (argv_find(argv
, argc
, "view", &idx
)) {
9626 /* [<view> VIEWVRFNAME] */
9627 vrf
= argv
[idx
+ 1]->arg
;
9630 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
9631 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
))
9632 argv_find_and_parse_safi(argv
, argc
, &idx
, &safi
);
9634 /* <*|A.B.C.D|X:X::X:X|WORD|(1-4294967295)|external|peer-group PGNAME> */
9635 if (argv_find(argv
, argc
, "*", &idx
)) {
9636 clr_sort
= clear_all
;
9637 } else if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
9638 clr_sort
= clear_peer
;
9639 clr_arg
= argv
[idx
]->arg
;
9640 } else if (argv_find(argv
, argc
, "X:X::X:X", &idx
)) {
9641 clr_sort
= clear_peer
;
9642 clr_arg
= argv
[idx
]->arg
;
9643 } else if (argv_find(argv
, argc
, "peer-group", &idx
)) {
9644 clr_sort
= clear_group
;
9646 clr_arg
= argv
[idx
]->arg
;
9647 } else if (argv_find(argv
, argc
, "PGNAME", &idx
)) {
9648 clr_sort
= clear_peer
;
9649 clr_arg
= argv
[idx
]->arg
;
9650 } else if (argv_find(argv
, argc
, "WORD", &idx
)) {
9651 clr_sort
= clear_peer
;
9652 clr_arg
= argv
[idx
]->arg
;
9653 } else if (argv_find(argv
, argc
, "(1-4294967295)", &idx
)) {
9654 clr_sort
= clear_as
;
9655 clr_arg
= argv
[idx
]->arg
;
9656 } else if (argv_find(argv
, argc
, "external", &idx
)) {
9657 clr_sort
= clear_external
;
9660 /* [<soft [<in|out>]|in [prefix-filter]|out|message-stats>] */
9661 if (argv_find(argv
, argc
, "soft", &idx
)) {
9662 if (argv_find(argv
, argc
, "in", &idx
)
9663 || argv_find(argv
, argc
, "out", &idx
))
9664 clr_type
= strmatch(argv
[idx
]->text
, "in")
9666 : BGP_CLEAR_SOFT_OUT
;
9668 clr_type
= BGP_CLEAR_SOFT_BOTH
;
9669 } else if (argv_find(argv
, argc
, "in", &idx
)) {
9670 clr_type
= argv_find(argv
, argc
, "prefix-filter", &idx
)
9671 ? BGP_CLEAR_SOFT_IN_ORF_PREFIX
9672 : BGP_CLEAR_SOFT_IN
;
9673 } else if (argv_find(argv
, argc
, "out", &idx
)) {
9674 clr_type
= BGP_CLEAR_SOFT_OUT
;
9675 } else if (argv_find(argv
, argc
, "message-stats", &idx
)) {
9676 clr_type
= BGP_CLEAR_MESSAGE_STATS
;
9678 clr_type
= BGP_CLEAR_SOFT_NONE
;
9680 return bgp_clear_vty(vty
, vrf
, afi
, safi
, clr_sort
, clr_type
, clr_arg
);
9683 DEFUN (clear_ip_bgp_prefix
,
9684 clear_ip_bgp_prefix_cmd
,
9685 "clear [ip] bgp [<view|vrf> VIEWVRFNAME] prefix A.B.C.D/M",
9689 BGP_INSTANCE_HELP_STR
9690 "Clear bestpath and re-advertise\n"
9694 char *prefix
= NULL
;
9698 /* [<view|vrf> VIEWVRFNAME] */
9699 if (argv_find(argv
, argc
, "vrf", &idx
)) {
9700 vrf
= argv
[idx
+ 1]->arg
;
9702 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
9704 } else if (argv_find(argv
, argc
, "view", &idx
)) {
9705 /* [<view> VIEWVRFNAME] */
9706 vrf
= argv
[idx
+ 1]->arg
;
9710 prefix
= argv
[argc
- 1]->arg
;
9712 return bgp_clear_prefix(vty
, vrf
, prefix
, AFI_IP
, SAFI_UNICAST
, NULL
);
9715 DEFUN (clear_bgp_ipv6_safi_prefix
,
9716 clear_bgp_ipv6_safi_prefix_cmd
,
9717 "clear [ip] bgp ipv6 "BGP_SAFI_CMD_STR
" prefix X:X::X:X/M",
9723 "Clear bestpath and re-advertise\n"
9727 int idx_ipv6_prefix
= 0;
9728 safi_t safi
= SAFI_UNICAST
;
9729 char *prefix
= argv_find(argv
, argc
, "X:X::X:X/M", &idx_ipv6_prefix
) ?
9730 argv
[idx_ipv6_prefix
]->arg
: NULL
;
9732 argv_find_and_parse_safi(argv
, argc
, &idx_safi
, &safi
);
9733 return bgp_clear_prefix(
9734 vty
, NULL
, prefix
, AFI_IP6
,
9738 DEFUN (clear_bgp_instance_ipv6_safi_prefix
,
9739 clear_bgp_instance_ipv6_safi_prefix_cmd
,
9740 "clear [ip] bgp <view|vrf> VIEWVRFNAME ipv6 "BGP_SAFI_CMD_STR
" prefix X:X::X:X/M",
9744 BGP_INSTANCE_HELP_STR
9747 "Clear bestpath and re-advertise\n"
9751 int idx_vrfview
= 0;
9752 int idx_ipv6_prefix
= 0;
9753 safi_t safi
= SAFI_UNICAST
;
9754 char *prefix
= argv_find(argv
, argc
, "X:X::X:X/M", &idx_ipv6_prefix
) ?
9755 argv
[idx_ipv6_prefix
]->arg
: NULL
;
9756 char *vrfview
= NULL
;
9758 /* [<view|vrf> VIEWVRFNAME] */
9759 if (argv_find(argv
, argc
, "vrf", &idx_vrfview
)) {
9760 vrfview
= argv
[idx_vrfview
+ 1]->arg
;
9761 if (vrfview
&& strmatch(vrfview
, VRF_DEFAULT_NAME
))
9763 } else if (argv_find(argv
, argc
, "view", &idx_vrfview
)) {
9764 /* [<view> VIEWVRFNAME] */
9765 vrfview
= argv
[idx_vrfview
+ 1]->arg
;
9767 argv_find_and_parse_safi(argv
, argc
, &idx_safi
, &safi
);
9769 return bgp_clear_prefix(
9770 vty
, vrfview
, prefix
,
9771 AFI_IP6
, safi
, NULL
);
9774 DEFUN (show_bgp_views
,
9776 "show [ip] bgp views",
9780 "Show the defined BGP views\n")
9782 struct list
*inst
= bm
->bgp
;
9783 struct listnode
*node
;
9786 vty_out(vty
, "Defined BGP views:\n");
9787 for (ALL_LIST_ELEMENTS_RO(inst
, node
, bgp
)) {
9789 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_VRF
)
9791 vty_out(vty
, "\t%s (AS%u)\n", bgp
->name
? bgp
->name
: "(null)",
9798 DEFUN (show_bgp_vrfs
,
9800 "show [ip] bgp vrfs [json]",
9807 char buf
[ETHER_ADDR_STRLEN
];
9808 struct list
*inst
= bm
->bgp
;
9809 struct listnode
*node
;
9811 bool uj
= use_json(argc
, argv
);
9812 json_object
*json
= NULL
;
9813 json_object
*json_vrfs
= NULL
;
9817 json
= json_object_new_object();
9818 json_vrfs
= json_object_new_object();
9821 for (ALL_LIST_ELEMENTS_RO(inst
, node
, bgp
)) {
9822 const char *name
, *type
;
9824 struct listnode
*node2
, *nnode2
;
9825 int peers_cfg
, peers_estb
;
9826 json_object
*json_vrf
= NULL
;
9829 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_VIEW
)
9833 if (!uj
&& count
== 1) {
9835 "%4s %-5s %-16s %9s %10s %-37s\n",
9836 "Type", "Id", "routerId", "#PeersCfg",
9837 "#PeersEstb", "Name");
9838 vty_out(vty
, "%11s %-16s %-21s %-6s\n", " ",
9839 "L3-VNI", "RouterMAC", "Interface");
9842 peers_cfg
= peers_estb
= 0;
9844 json_vrf
= json_object_new_object();
9847 for (ALL_LIST_ELEMENTS(bgp
->peer
, node2
, nnode2
, peer
)) {
9848 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
9851 if (peer_established(peer
))
9855 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
) {
9856 name
= VRF_DEFAULT_NAME
;
9865 int64_t vrf_id_ui
= (bgp
->vrf_id
== VRF_UNKNOWN
)
9867 : (int64_t)bgp
->vrf_id
;
9868 char buf
[BUFSIZ
] = {0};
9870 json_object_string_add(json_vrf
, "type", type
);
9871 json_object_int_add(json_vrf
, "vrfId", vrf_id_ui
);
9872 json_object_string_addf(json_vrf
, "routerId", "%pI4",
9874 json_object_int_add(json_vrf
, "numConfiguredPeers",
9876 json_object_int_add(json_vrf
, "numEstablishedPeers",
9879 json_object_int_add(json_vrf
, "l3vni", bgp
->l3vni
);
9880 json_object_string_add(
9882 prefix_mac2str(&bgp
->rmac
, buf
, sizeof(buf
)));
9883 json_object_string_add(json_vrf
, "interface",
9884 ifindex2ifname(bgp
->l3vni_svi_ifindex
,
9886 json_object_object_add(json_vrfs
, name
, json_vrf
);
9888 vty_out(vty
, "%4s %-5d %-16pI4 %-9u %-10u %-37s\n",
9890 bgp
->vrf_id
== VRF_UNKNOWN
? -1
9892 &bgp
->router_id
, peers_cfg
, peers_estb
, name
);
9893 vty_out(vty
,"%11s %-16u %-21s %-20s\n", " ",
9895 prefix_mac2str(&bgp
->rmac
, buf
, sizeof(buf
)),
9896 ifindex2ifname(bgp
->l3vni_svi_ifindex
,
9902 json_object_object_add(json
, "vrfs", json_vrfs
);
9904 json_object_int_add(json
, "totalVrfs", count
);
9906 vty_json(vty
, json
);
9910 "\nTotal number of VRFs (including default): %d\n",
9917 DEFUN (show_bgp_mac_hash
,
9918 show_bgp_mac_hash_cmd
,
9919 "show bgp mac hash",
9923 "Mac Address database\n")
9925 bgp_mac_dump_table(vty
);
9930 static void show_tip_entry(struct hash_bucket
*bucket
, void *args
)
9932 struct vty
*vty
= (struct vty
*)args
;
9933 struct tip_addr
*tip
= (struct tip_addr
*)bucket
->data
;
9935 vty_out(vty
, "addr: %pI4, count: %d\n", &tip
->addr
, tip
->refcnt
);
9938 static void bgp_show_martian_nexthops(struct vty
*vty
, struct bgp
*bgp
)
9940 vty_out(vty
, "self nexthop database:\n");
9941 bgp_nexthop_show_address_hash(vty
, bgp
);
9943 vty_out(vty
, "Tunnel-ip database:\n");
9944 hash_iterate(bgp
->tip_hash
,
9945 (void (*)(struct hash_bucket
*, void *))show_tip_entry
,
9949 DEFUN(show_bgp_martian_nexthop_db
, show_bgp_martian_nexthop_db_cmd
,
9950 "show bgp [<view|vrf> VIEWVRFNAME] martian next-hop",
9951 SHOW_STR BGP_STR BGP_INSTANCE_HELP_STR
9952 "martian next-hops\n"
9953 "martian next-hop database\n")
9955 struct bgp
*bgp
= NULL
;
9959 /* [<vrf> VIEWVRFNAME] */
9960 if (argv_find(argv
, argc
, "vrf", &idx
)) {
9961 name
= argv
[idx
+ 1]->arg
;
9962 if (name
&& strmatch(name
, VRF_DEFAULT_NAME
))
9964 } else if (argv_find(argv
, argc
, "view", &idx
))
9965 /* [<view> VIEWVRFNAME] */
9966 name
= argv
[idx
+ 1]->arg
;
9968 bgp
= bgp_lookup_by_name(name
);
9970 bgp
= bgp_get_default();
9973 vty_out(vty
, "%% No BGP process is configured\n");
9976 bgp_show_martian_nexthops(vty
, bgp
);
9981 DEFUN (show_bgp_memory
,
9982 show_bgp_memory_cmd
,
9983 "show [ip] bgp memory",
9987 "Global BGP memory statistics\n")
9989 char memstrbuf
[MTYPE_MEMSTR_LEN
];
9990 unsigned long count
;
9992 /* RIB related usage stats */
9993 count
= mtype_stats_alloc(MTYPE_BGP_NODE
);
9994 vty_out(vty
, "%ld RIB nodes, using %s of memory\n", count
,
9995 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
9996 count
* sizeof(struct bgp_dest
)));
9998 count
= mtype_stats_alloc(MTYPE_BGP_ROUTE
);
9999 vty_out(vty
, "%ld BGP routes, using %s of memory\n", count
,
10000 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
10001 count
* sizeof(struct bgp_path_info
)));
10002 if ((count
= mtype_stats_alloc(MTYPE_BGP_ROUTE_EXTRA
)))
10003 vty_out(vty
, "%ld BGP route ancillaries, using %s of memory\n",
10006 memstrbuf
, sizeof(memstrbuf
),
10007 count
* sizeof(struct bgp_path_info_extra
)));
10009 if ((count
= mtype_stats_alloc(MTYPE_BGP_STATIC
)))
10010 vty_out(vty
, "%ld Static routes, using %s of memory\n", count
,
10011 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
10012 count
* sizeof(struct bgp_static
)));
10014 if ((count
= mtype_stats_alloc(MTYPE_BGP_PACKET
)))
10015 vty_out(vty
, "%ld Packets, using %s of memory\n", count
,
10016 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
10017 count
* sizeof(struct bpacket
)));
10020 if ((count
= mtype_stats_alloc(MTYPE_BGP_ADJ_IN
)))
10021 vty_out(vty
, "%ld Adj-In entries, using %s of memory\n", count
,
10022 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
10023 count
* sizeof(struct bgp_adj_in
)));
10024 if ((count
= mtype_stats_alloc(MTYPE_BGP_ADJ_OUT
)))
10025 vty_out(vty
, "%ld Adj-Out entries, using %s of memory\n", count
,
10026 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
10027 count
* sizeof(struct bgp_adj_out
)));
10029 if ((count
= mtype_stats_alloc(MTYPE_BGP_NEXTHOP_CACHE
)))
10030 vty_out(vty
, "%ld Nexthop cache entries, using %s of memory\n",
10032 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
10033 count
* sizeof(struct bgp_nexthop_cache
)));
10035 if ((count
= mtype_stats_alloc(MTYPE_BGP_DAMP_INFO
)))
10036 vty_out(vty
, "%ld Dampening entries, using %s of memory\n",
10038 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
10039 count
* sizeof(struct bgp_damp_info
)));
10042 count
= attr_count();
10043 vty_out(vty
, "%ld BGP attributes, using %s of memory\n", count
,
10044 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
10045 count
* sizeof(struct attr
)));
10047 if ((count
= attr_unknown_count()))
10048 vty_out(vty
, "%ld unknown attributes\n", count
);
10050 /* AS_PATH attributes */
10051 count
= aspath_count();
10052 vty_out(vty
, "%ld BGP AS-PATH entries, using %s of memory\n", count
,
10053 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
10054 count
* sizeof(struct aspath
)));
10056 count
= mtype_stats_alloc(MTYPE_AS_SEG
);
10057 vty_out(vty
, "%ld BGP AS-PATH segments, using %s of memory\n", count
,
10058 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
10059 count
* sizeof(struct assegment
)));
10061 /* Other attributes */
10062 if ((count
= community_count()))
10063 vty_out(vty
, "%ld BGP community entries, using %s of memory\n",
10064 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
10065 count
* sizeof(struct community
)));
10066 if ((count
= mtype_stats_alloc(MTYPE_ECOMMUNITY
)))
10067 vty_out(vty
, "%ld BGP community entries, using %s of memory\n",
10068 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
10069 count
* sizeof(struct ecommunity
)));
10070 if ((count
= mtype_stats_alloc(MTYPE_LCOMMUNITY
)))
10072 "%ld BGP large-community entries, using %s of memory\n",
10073 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
10074 count
* sizeof(struct lcommunity
)));
10076 if ((count
= mtype_stats_alloc(MTYPE_CLUSTER
)))
10077 vty_out(vty
, "%ld Cluster lists, using %s of memory\n", count
,
10078 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
10079 count
* sizeof(struct cluster_list
)));
10081 /* Peer related usage */
10082 count
= mtype_stats_alloc(MTYPE_BGP_PEER
);
10083 vty_out(vty
, "%ld peers, using %s of memory\n", count
,
10084 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
10085 count
* sizeof(struct peer
)));
10087 if ((count
= mtype_stats_alloc(MTYPE_PEER_GROUP
)))
10088 vty_out(vty
, "%ld peer groups, using %s of memory\n", count
,
10089 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
10090 count
* sizeof(struct peer_group
)));
10093 if ((count
= mtype_stats_alloc(MTYPE_BGP_REGEXP
)))
10094 vty_out(vty
, "%ld compiled regexes, using %s of memory\n",
10095 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
10096 count
* sizeof(regex_t
)));
10097 return CMD_SUCCESS
;
10100 static void bgp_show_bestpath_json(struct bgp
*bgp
, json_object
*json
)
10102 json_object
*bestpath
= json_object_new_object();
10104 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_ASPATH_IGNORE
))
10105 json_object_string_add(bestpath
, "asPath", "ignore");
10107 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_ASPATH_CONFED
))
10108 json_object_string_add(bestpath
, "asPath", "confed");
10110 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
)) {
10111 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_MULTIPATH_RELAX_AS_SET
))
10112 json_object_string_add(bestpath
, "multiPathRelax",
10115 json_object_string_add(bestpath
, "multiPathRelax",
10118 json_object_string_add(bestpath
, "multiPathRelax", "false");
10120 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_PEERTYPE_MULTIPATH_RELAX
))
10121 json_object_boolean_true_add(bestpath
, "peerTypeRelax");
10123 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_COMPARE_ROUTER_ID
))
10124 json_object_string_add(bestpath
, "compareRouterId", "true");
10125 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_MED_CONFED
)
10126 || CHECK_FLAG(bgp
->flags
, BGP_FLAG_MED_MISSING_AS_WORST
)) {
10127 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_MED_CONFED
))
10128 json_object_string_add(bestpath
, "med", "confed");
10129 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_MED_MISSING_AS_WORST
))
10130 json_object_string_add(bestpath
, "med",
10131 "missing-as-worst");
10133 json_object_string_add(bestpath
, "med", "true");
10136 json_object_object_add(json
, "bestPath", bestpath
);
10139 /* Print the error code/subcode for why the peer is down */
10140 static void bgp_show_peer_reset(struct vty
* vty
, struct peer
*peer
,
10141 json_object
*json_peer
, bool use_json
)
10143 const char *code_str
;
10144 const char *subcode_str
;
10147 if (peer
->last_reset
== PEER_DOWN_NOTIFY_SEND
10148 || peer
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
) {
10149 char errorcodesubcode_hexstr
[5];
10150 char errorcodesubcode_str
[256];
10152 code_str
= bgp_notify_code_str(peer
->notify
.code
);
10153 subcode_str
= bgp_notify_subcode_str(
10155 peer
->notify
.subcode
);
10157 snprintf(errorcodesubcode_hexstr
,
10158 sizeof(errorcodesubcode_hexstr
), "%02X%02X",
10159 peer
->notify
.code
, peer
->notify
.subcode
);
10160 json_object_string_add(json_peer
,
10161 "lastErrorCodeSubcode",
10162 errorcodesubcode_hexstr
);
10163 snprintf(errorcodesubcode_str
, 255, "%s%s",
10164 code_str
, subcode_str
);
10165 json_object_string_add(json_peer
,
10166 "lastNotificationReason",
10167 errorcodesubcode_str
);
10168 json_object_boolean_add(json_peer
,
10169 "lastNotificationHardReset",
10170 peer
->notify
.hard_reset
);
10171 if (peer
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
10172 && peer
->notify
.code
== BGP_NOTIFY_CEASE
10173 && (peer
->notify
.subcode
10174 == BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
10175 || peer
->notify
.subcode
10176 == BGP_NOTIFY_CEASE_ADMIN_RESET
)
10177 && peer
->notify
.length
) {
10179 const char *msg_str
;
10181 msg_str
= bgp_notify_admin_message(
10182 msgbuf
, sizeof(msgbuf
),
10183 (uint8_t *)peer
->notify
.data
,
10184 peer
->notify
.length
);
10186 json_object_string_add(
10188 "lastShutdownDescription",
10193 json_object_string_add(json_peer
, "lastResetDueTo",
10194 peer_down_str
[(int)peer
->last_reset
]);
10195 json_object_int_add(json_peer
, "lastResetCode",
10198 if (peer
->last_reset
== PEER_DOWN_NOTIFY_SEND
10199 || peer
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
) {
10200 code_str
= bgp_notify_code_str(peer
->notify
.code
);
10202 bgp_notify_subcode_str(peer
->notify
.code
,
10203 peer
->notify
.subcode
);
10204 vty_out(vty
, " Notification %s (%s%s%s)\n",
10205 peer
->last_reset
== PEER_DOWN_NOTIFY_SEND
10208 code_str
, subcode_str
,
10209 peer
->notify
.hard_reset
10210 ? bgp_notify_subcode_str(
10212 BGP_NOTIFY_CEASE_HARD_RESET
)
10215 vty_out(vty
, " %s\n",
10216 peer_down_str
[(int)peer
->last_reset
]);
10221 static inline bool bgp_has_peer_failed(struct peer
*peer
, afi_t afi
,
10224 return ((!peer_established(peer
)) || !peer
->afc_recv
[afi
][safi
]);
10227 static void bgp_show_failed_summary(struct vty
*vty
, struct bgp
*bgp
,
10228 struct peer
*peer
, json_object
*json_peer
,
10229 int max_neighbor_width
, bool use_json
)
10231 char timebuf
[BGP_UPTIME_LEN
], dn_flag
[2];
10235 if (peer_dynamic_neighbor(peer
))
10236 json_object_boolean_true_add(json_peer
,
10238 if (peer
->hostname
)
10239 json_object_string_add(json_peer
, "hostname",
10242 if (peer
->domainname
)
10243 json_object_string_add(json_peer
, "domainname",
10245 json_object_int_add(json_peer
, "connectionsEstablished",
10246 peer
->established
);
10247 json_object_int_add(json_peer
, "connectionsDropped",
10249 peer_uptime(peer
->uptime
, timebuf
, BGP_UPTIME_LEN
,
10250 use_json
, json_peer
);
10251 if (peer_established(peer
))
10252 json_object_string_add(json_peer
, "lastResetDueTo",
10253 "AFI/SAFI Not Negotiated");
10255 bgp_show_peer_reset(NULL
, peer
, json_peer
, true);
10258 dn_flag
[0] = peer_dynamic_neighbor(peer
) ? '*' : '\0';
10260 && CHECK_FLAG(bgp
->flags
, BGP_FLAG_SHOW_HOSTNAME
))
10261 len
= vty_out(vty
, "%s%s(%s)", dn_flag
,
10262 peer
->hostname
, peer
->host
);
10264 len
= vty_out(vty
, "%s%s", dn_flag
, peer
->host
);
10266 /* pad the neighbor column with spaces */
10267 if (len
< max_neighbor_width
)
10268 vty_out(vty
, "%*s", max_neighbor_width
- len
,
10270 vty_out(vty
, "%7d %7d %9s", peer
->established
,
10272 peer_uptime(peer
->uptime
, timebuf
,
10273 BGP_UPTIME_LEN
, 0, NULL
));
10274 if (peer_established(peer
))
10275 vty_out(vty
, " AFI/SAFI Not Negotiated\n");
10277 bgp_show_peer_reset(vty
, peer
, NULL
,
10282 /* Strip peer's description to the given size. */
10283 static char *bgp_peer_description_stripped(char *desc
, uint32_t size
)
10285 static char stripped
[BUFSIZ
];
10286 uint32_t len
= size
> strlen(desc
) ? strlen(desc
) : size
;
10288 strlcpy(stripped
, desc
, len
+ 1);
10293 /* Determine whether var peer should be filtered out of the summary. */
10294 static bool bgp_show_summary_is_peer_filtered(struct peer
*peer
,
10295 struct peer
*fpeer
, int as_type
,
10299 /* filter neighbor XXXX */
10300 if (fpeer
&& fpeer
!= peer
)
10303 /* filter remote-as (internal|external) */
10304 if (as_type
!= AS_UNSPECIFIED
) {
10305 if (peer
->as_type
== AS_SPECIFIED
) {
10306 if (as_type
== AS_INTERNAL
) {
10307 if (peer
->as
!= peer
->local_as
)
10309 } else if (peer
->as
== peer
->local_as
)
10311 } else if (as_type
!= peer
->as_type
)
10313 } else if (as
&& as
!= peer
->as
) /* filter remote-as XXX */
10319 /* Show BGP peer's summary information.
10321 * Peer's description is stripped according to if `wide` option is given
10324 * When adding new columns to `show bgp summary` output, please make
10325 * sure `Desc` is the lastest column to show because it can contain
10326 * whitespaces and the whole output will be tricky.
10328 static int bgp_show_summary(struct vty
*vty
, struct bgp
*bgp
, int afi
, int safi
,
10329 struct peer
*fpeer
, int as_type
, as_t as
,
10330 uint16_t show_flags
)
10333 struct listnode
*node
, *nnode
;
10334 unsigned int count
= 0, dn_count
= 0;
10335 char timebuf
[BGP_UPTIME_LEN
], dn_flag
[2];
10336 char neighbor_buf
[VTY_BUFSIZ
];
10337 int neighbor_col_default_width
= 16;
10338 int len
, failed_count
= 0;
10339 unsigned int filtered_count
= 0;
10340 int max_neighbor_width
= 0;
10342 json_object
*json
= NULL
;
10343 json_object
*json_peer
= NULL
;
10344 json_object
*json_peers
= NULL
;
10345 struct peer_af
*paf
;
10346 struct bgp_filter
*filter
;
10347 bool use_json
= CHECK_FLAG(show_flags
, BGP_SHOW_OPT_JSON
);
10348 bool show_failed
= CHECK_FLAG(show_flags
, BGP_SHOW_OPT_FAILED
);
10349 bool show_established
=
10350 CHECK_FLAG(show_flags
, BGP_SHOW_OPT_ESTABLISHED
);
10351 bool show_wide
= CHECK_FLAG(show_flags
, BGP_SHOW_OPT_WIDE
);
10352 bool show_terse
= CHECK_FLAG(show_flags
, BGP_SHOW_OPT_TERSE
);
10354 /* labeled-unicast routes are installed in the unicast table so in order
10356 * display the correct PfxRcd value we must look at SAFI_UNICAST
10359 if (safi
== SAFI_LABELED_UNICAST
)
10360 pfx_rcd_safi
= SAFI_UNICAST
;
10362 pfx_rcd_safi
= safi
;
10365 json
= json_object_new_object();
10366 json_peers
= json_object_new_object();
10367 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
10368 if (bgp_show_summary_is_peer_filtered(peer
, fpeer
,
10375 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
10378 if (peer
->afc
[afi
][safi
]) {
10379 /* See if we have at least a single failed peer */
10380 if (bgp_has_peer_failed(peer
, afi
, safi
))
10384 if (peer_dynamic_neighbor(peer
))
10389 /* Loop over all neighbors that will be displayed to determine
10391 * characters are needed for the Neighbor column
10393 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
10394 if (bgp_show_summary_is_peer_filtered(peer
, fpeer
,
10401 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
10404 if (peer
->afc
[afi
][safi
]) {
10405 memset(dn_flag
, '\0', sizeof(dn_flag
));
10406 if (peer_dynamic_neighbor(peer
))
10410 && CHECK_FLAG(bgp
->flags
,
10411 BGP_FLAG_SHOW_HOSTNAME
))
10412 snprintf(neighbor_buf
,
10413 sizeof(neighbor_buf
),
10414 "%s%s(%s) ", dn_flag
,
10415 peer
->hostname
, peer
->host
);
10417 snprintf(neighbor_buf
,
10418 sizeof(neighbor_buf
), "%s%s ",
10419 dn_flag
, peer
->host
);
10421 len
= strlen(neighbor_buf
);
10423 if (len
> max_neighbor_width
)
10424 max_neighbor_width
= len
;
10426 /* See if we have at least a single failed peer */
10427 if (bgp_has_peer_failed(peer
, afi
, safi
))
10433 /* Originally we displayed the Neighbor column as 16
10434 * characters wide so make that the default
10436 if (max_neighbor_width
< neighbor_col_default_width
)
10437 max_neighbor_width
= neighbor_col_default_width
;
10440 if (show_failed
&& !failed_count
) {
10442 json_object_int_add(json
, "failedPeersCount", 0);
10443 json_object_int_add(json
, "dynamicPeers", dn_count
);
10444 json_object_int_add(json
, "totalPeers", count
);
10446 vty_json(vty
, json
);
10448 vty_out(vty
, "%% No failed BGP neighbors found\n");
10450 return CMD_SUCCESS
;
10453 count
= 0; /* Reset the value as its used again */
10454 filtered_count
= 0;
10456 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
10457 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
10460 if (!peer
->afc
[afi
][safi
])
10464 unsigned long ents
;
10465 char memstrbuf
[MTYPE_MEMSTR_LEN
];
10468 vrf_id_ui
= (bgp
->vrf_id
== VRF_UNKNOWN
)
10470 : (int64_t)bgp
->vrf_id
;
10472 /* Usage summary and header */
10474 json_object_string_addf(json
, "routerId",
10477 json_object_int_add(json
, "as", bgp
->as
);
10478 json_object_int_add(json
, "vrfId", vrf_id_ui
);
10479 json_object_string_add(
10482 == BGP_INSTANCE_TYPE_DEFAULT
)
10487 "BGP router identifier %pI4, local AS number %u vrf-id %d",
10488 &bgp
->router_id
, bgp
->as
,
10489 bgp
->vrf_id
== VRF_UNKNOWN
10491 : (int)bgp
->vrf_id
);
10492 vty_out(vty
, "\n");
10495 if (bgp_update_delay_configured(bgp
)) {
10497 json_object_int_add(
10498 json
, "updateDelayLimit",
10499 bgp
->v_update_delay
);
10501 if (bgp
->v_update_delay
10502 != bgp
->v_establish_wait
)
10503 json_object_int_add(
10505 "updateDelayEstablishWait",
10506 bgp
->v_establish_wait
);
10508 if (bgp_update_delay_active(bgp
)) {
10509 json_object_string_add(
10511 "updateDelayFirstNeighbor",
10512 bgp
->update_delay_begin_time
);
10513 json_object_boolean_true_add(
10515 "updateDelayInProgress");
10517 if (bgp
->update_delay_over
) {
10518 json_object_string_add(
10520 "updateDelayFirstNeighbor",
10521 bgp
->update_delay_begin_time
);
10522 json_object_string_add(
10524 "updateDelayBestpathResumed",
10525 bgp
->update_delay_end_time
);
10526 json_object_string_add(
10528 "updateDelayZebraUpdateResume",
10529 bgp
->update_delay_zebra_resume_time
);
10530 json_object_string_add(
10532 "updateDelayPeerUpdateResume",
10533 bgp
->update_delay_peers_resume_time
);
10538 "Read-only mode update-delay limit: %d seconds\n",
10539 bgp
->v_update_delay
);
10540 if (bgp
->v_update_delay
10541 != bgp
->v_establish_wait
)
10543 " Establish wait: %d seconds\n",
10544 bgp
->v_establish_wait
);
10546 if (bgp_update_delay_active(bgp
)) {
10548 " First neighbor established: %s\n",
10549 bgp
->update_delay_begin_time
);
10551 " Delay in progress\n");
10553 if (bgp
->update_delay_over
) {
10555 " First neighbor established: %s\n",
10556 bgp
->update_delay_begin_time
);
10558 " Best-paths resumed: %s\n",
10559 bgp
->update_delay_end_time
);
10561 " zebra update resumed: %s\n",
10562 bgp
->update_delay_zebra_resume_time
);
10564 " peers update resumed: %s\n",
10565 bgp
->update_delay_peers_resume_time
);
10572 if (bgp_maxmed_onstartup_configured(bgp
)
10573 && bgp
->maxmed_active
)
10574 json_object_boolean_true_add(
10575 json
, "maxMedOnStartup");
10576 if (bgp
->v_maxmed_admin
)
10577 json_object_boolean_true_add(
10578 json
, "maxMedAdministrative");
10580 json_object_int_add(
10581 json
, "tableVersion",
10582 bgp_table_version(bgp
->rib
[afi
][safi
]));
10584 ents
= bgp_table_count(bgp
->rib
[afi
][safi
]);
10585 json_object_int_add(json
, "ribCount", ents
);
10586 json_object_int_add(
10588 ents
* sizeof(struct bgp_dest
));
10590 ents
= bgp
->af_peer_count
[afi
][safi
];
10591 json_object_int_add(json
, "peerCount", ents
);
10592 json_object_int_add(json
, "peerMemory",
10593 ents
* sizeof(struct peer
));
10595 if ((ents
= listcount(bgp
->group
))) {
10596 json_object_int_add(
10597 json
, "peerGroupCount", ents
);
10598 json_object_int_add(
10599 json
, "peerGroupMemory",
10600 ents
* sizeof(struct
10604 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
10605 BGP_CONFIG_DAMPENING
))
10606 json_object_boolean_true_add(
10607 json
, "dampeningEnabled");
10610 if (bgp_maxmed_onstartup_configured(bgp
)
10611 && bgp
->maxmed_active
)
10613 "Max-med on-startup active\n");
10614 if (bgp
->v_maxmed_admin
)
10616 "Max-med administrative active\n");
10619 "BGP table version %" PRIu64
10622 bgp
->rib
[afi
][safi
]));
10624 ents
= bgp_table_count(
10625 bgp
->rib
[afi
][safi
]);
10627 "RIB entries %ld, using %s of memory\n",
10637 /* Peer related usage */
10638 ents
= bgp
->af_peer_count
[afi
][safi
];
10640 "Peers %ld, using %s of memory\n",
10650 if ((ents
= listcount(bgp
->group
)))
10652 "Peer groups %ld, using %s of memory\n",
10662 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
10663 BGP_CONFIG_DAMPENING
))
10665 "Dampening enabled.\n");
10668 vty_out(vty
, "\n");
10670 /* Subtract 8 here because 'Neighbor' is
10672 vty_out(vty
, "Neighbor");
10673 vty_out(vty
, "%*s",
10674 max_neighbor_width
- 8, " ");
10676 BGP_SHOW_SUMMARY_HEADER_FAILED
);
10681 paf
= peer_af_find(peer
, afi
, safi
);
10682 filter
= &peer
->filter
[afi
][safi
];
10685 /* Works for both failed & successful cases */
10686 if (peer_dynamic_neighbor(peer
))
10691 if (bgp_show_summary_is_peer_filtered(peer
, fpeer
,
10697 bgp_has_peer_failed(peer
, afi
, safi
)) {
10698 json_peer
= json_object_new_object();
10699 bgp_show_failed_summary(vty
, bgp
, peer
,
10700 json_peer
, 0, use_json
);
10701 } else if (!show_failed
) {
10702 if (show_established
10703 && bgp_has_peer_failed(peer
, afi
, safi
)) {
10708 json_peer
= json_object_new_object();
10709 if (peer_dynamic_neighbor(peer
)) {
10710 json_object_boolean_true_add(json_peer
,
10714 if (peer
->hostname
)
10715 json_object_string_add(json_peer
, "hostname",
10718 if (peer
->domainname
)
10719 json_object_string_add(json_peer
, "domainname",
10722 json_object_int_add(json_peer
, "remoteAs", peer
->as
);
10723 json_object_int_add(
10724 json_peer
, "localAs",
10725 peer
->change_local_as
10726 ? peer
->change_local_as
10728 json_object_int_add(json_peer
, "version", 4);
10729 json_object_int_add(json_peer
, "msgRcvd",
10730 PEER_TOTAL_RX(peer
));
10731 json_object_int_add(json_peer
, "msgSent",
10732 PEER_TOTAL_TX(peer
));
10734 atomic_size_t outq_count
, inq_count
;
10735 outq_count
= atomic_load_explicit(
10736 &peer
->obuf
->count
,
10737 memory_order_relaxed
);
10738 inq_count
= atomic_load_explicit(
10739 &peer
->ibuf
->count
,
10740 memory_order_relaxed
);
10742 json_object_int_add(json_peer
, "tableVersion",
10743 peer
->version
[afi
][safi
]);
10744 json_object_int_add(json_peer
, "outq",
10746 json_object_int_add(json_peer
, "inq",
10748 peer_uptime(peer
->uptime
, timebuf
, BGP_UPTIME_LEN
,
10749 use_json
, json_peer
);
10751 json_object_int_add(json_peer
, "pfxRcd",
10752 peer
->pcount
[afi
][pfx_rcd_safi
]);
10754 if (paf
&& PAF_SUBGRP(paf
))
10755 json_object_int_add(
10756 json_peer
, "pfxSnt",
10757 (PAF_SUBGRP(paf
))->scount
);
10759 json_object_int_add(json_peer
, "pfxSnt",
10762 /* BGP FSM state */
10763 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_SHUTDOWN
)
10764 || CHECK_FLAG(peer
->bgp
->flags
,
10765 BGP_FLAG_SHUTDOWN
))
10766 json_object_string_add(json_peer
,
10769 else if (peer
->afc_recv
[afi
][safi
])
10770 json_object_string_add(
10771 json_peer
, "state",
10772 lookup_msg(bgp_status_msg
,
10773 peer
->status
, NULL
));
10774 else if (CHECK_FLAG(
10776 PEER_STATUS_PREFIX_OVERFLOW
))
10777 json_object_string_add(json_peer
,
10781 json_object_string_add(
10782 json_peer
, "state",
10783 lookup_msg(bgp_status_msg
,
10784 peer
->status
, NULL
));
10786 /* BGP peer state */
10787 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_SHUTDOWN
)
10788 || CHECK_FLAG(peer
->bgp
->flags
,
10789 BGP_FLAG_SHUTDOWN
))
10790 json_object_string_add(json_peer
,
10793 else if (CHECK_FLAG(
10795 PEER_STATUS_PREFIX_OVERFLOW
))
10796 json_object_string_add(json_peer
,
10799 else if (CHECK_FLAG(peer
->flags
,
10800 PEER_FLAG_PASSIVE
))
10801 json_object_string_add(json_peer
,
10804 else if (CHECK_FLAG(peer
->sflags
,
10805 PEER_STATUS_NSF_WAIT
))
10806 json_object_string_add(json_peer
,
10809 else if (CHECK_FLAG(
10811 BGP_FLAG_EBGP_REQUIRES_POLICY
)
10812 && (!bgp_inbound_policy_exists(peer
,
10814 || !bgp_outbound_policy_exists(
10816 json_object_string_add(json_peer
,
10820 json_object_string_add(
10821 json_peer
, "peerState", "OK");
10823 json_object_int_add(json_peer
, "connectionsEstablished",
10824 peer
->established
);
10825 json_object_int_add(json_peer
, "connectionsDropped",
10828 json_object_string_add(
10829 json_peer
, "desc", peer
->desc
);
10831 /* Avoid creating empty peer dicts in JSON */
10832 if (json_peer
== NULL
)
10836 json_object_string_add(json_peer
, "idType",
10838 else if (peer
->su
.sa
.sa_family
== AF_INET
)
10839 json_object_string_add(json_peer
, "idType",
10841 else if (peer
->su
.sa
.sa_family
== AF_INET6
)
10842 json_object_string_add(json_peer
, "idType",
10844 json_object_object_add(json_peers
, peer
->host
,
10847 if (bgp_show_summary_is_peer_filtered(peer
, fpeer
,
10853 bgp_has_peer_failed(peer
, afi
, safi
)) {
10854 bgp_show_failed_summary(vty
, bgp
, peer
, NULL
,
10855 max_neighbor_width
,
10857 } else if (!show_failed
) {
10858 if (show_established
10859 && bgp_has_peer_failed(peer
, afi
, safi
)) {
10864 if ((count
- filtered_count
) == 1) {
10865 /* display headline before the first
10867 vty_out(vty
, "\n");
10869 /* Subtract 8 here because 'Neighbor' is
10871 vty_out(vty
, "Neighbor");
10872 vty_out(vty
, "%*s",
10873 max_neighbor_width
- 8, " ");
10876 ? BGP_SHOW_SUMMARY_HEADER_ALL_WIDE
10877 : BGP_SHOW_SUMMARY_HEADER_ALL
);
10880 memset(dn_flag
, '\0', sizeof(dn_flag
));
10881 if (peer_dynamic_neighbor(peer
)) {
10886 && CHECK_FLAG(bgp
->flags
,
10887 BGP_FLAG_SHOW_HOSTNAME
))
10888 len
= vty_out(vty
, "%s%s(%s)", dn_flag
,
10892 len
= vty_out(vty
, "%s%s", dn_flag
, peer
->host
);
10894 /* pad the neighbor column with spaces */
10895 if (len
< max_neighbor_width
)
10896 vty_out(vty
, "%*s", max_neighbor_width
- len
,
10899 atomic_size_t outq_count
, inq_count
;
10900 outq_count
= atomic_load_explicit(
10901 &peer
->obuf
->count
,
10902 memory_order_relaxed
);
10903 inq_count
= atomic_load_explicit(
10904 &peer
->ibuf
->count
,
10905 memory_order_relaxed
);
10909 "4 %10u %10u %9u %9u %8" PRIu64
10912 peer
->change_local_as
10913 ? peer
->change_local_as
10915 PEER_TOTAL_RX(peer
),
10916 PEER_TOTAL_TX(peer
),
10917 peer
->version
[afi
][safi
],
10918 inq_count
, outq_count
,
10919 peer_uptime(peer
->uptime
,
10924 vty_out(vty
, "4 %10u %9u %9u %8" PRIu64
10926 peer
->as
, PEER_TOTAL_RX(peer
),
10927 PEER_TOTAL_TX(peer
),
10928 peer
->version
[afi
][safi
],
10929 inq_count
, outq_count
,
10930 peer_uptime(peer
->uptime
,
10935 if (peer_established(peer
)) {
10936 if (peer
->afc_recv
[afi
][safi
]) {
10939 BGP_FLAG_EBGP_REQUIRES_POLICY
)
10940 && !bgp_inbound_policy_exists(
10942 vty_out(vty
, " %12s",
10951 vty_out(vty
, " NoNeg");
10954 if (paf
&& PAF_SUBGRP(paf
)) {
10957 BGP_FLAG_EBGP_REQUIRES_POLICY
)
10958 && !bgp_outbound_policy_exists(
10960 vty_out(vty
, " %8s",
10969 vty_out(vty
, " NoNeg");
10972 if (CHECK_FLAG(peer
->flags
,
10973 PEER_FLAG_SHUTDOWN
)
10974 || CHECK_FLAG(peer
->bgp
->flags
,
10975 BGP_FLAG_SHUTDOWN
))
10976 vty_out(vty
, " Idle (Admin)");
10977 else if (CHECK_FLAG(
10979 PEER_STATUS_PREFIX_OVERFLOW
))
10980 vty_out(vty
, " Idle (PfxCt)");
10982 vty_out(vty
, " %12s",
10983 lookup_msg(bgp_status_msg
,
10984 peer
->status
, NULL
));
10986 vty_out(vty
, " %8u", 0);
10988 /* Make sure `Desc` column is the lastest in
10992 vty_out(vty
, " %s",
10993 bgp_peer_description_stripped(
10995 show_wide
? 64 : 20));
10997 vty_out(vty
, " N/A");
10998 vty_out(vty
, "\n");
11005 json_object_object_add(json
, "peers", json_peers
);
11006 json_object_int_add(json
, "failedPeers", failed_count
);
11007 json_object_int_add(json
, "displayedPeers",
11008 count
- filtered_count
);
11009 json_object_int_add(json
, "totalPeers", count
);
11010 json_object_int_add(json
, "dynamicPeers", dn_count
);
11013 bgp_show_bestpath_json(bgp
, json
);
11015 vty_json(vty
, json
);
11018 if (filtered_count
== count
)
11019 vty_out(vty
, "\n%% No matching neighbor\n");
11022 vty_out(vty
, "\nDisplayed neighbors %d",
11024 else if (as_type
!= AS_UNSPECIFIED
|| as
11025 || fpeer
|| show_established
)
11026 vty_out(vty
, "\nDisplayed neighbors %d",
11027 count
- filtered_count
);
11029 vty_out(vty
, "\nTotal number of neighbors %d\n",
11033 vty_out(vty
, "No %s neighbor is configured\n",
11034 get_afi_safi_str(afi
, safi
, false));
11038 vty_out(vty
, "* - dynamic neighbor\n");
11039 vty_out(vty
, "%d dynamic neighbor(s), limit %d\n",
11040 dn_count
, bgp
->dynamic_neighbors_limit
);
11044 return CMD_SUCCESS
;
11047 static void bgp_show_summary_afi_safi(struct vty
*vty
, struct bgp
*bgp
, int afi
,
11048 int safi
, struct peer
*fpeer
, int as_type
,
11049 as_t as
, uint16_t show_flags
)
11052 int afi_wildcard
= (afi
== AFI_MAX
);
11053 int safi_wildcard
= (safi
== SAFI_MAX
);
11054 int is_wildcard
= (afi_wildcard
|| safi_wildcard
);
11055 bool nbr_output
= false;
11056 bool use_json
= CHECK_FLAG(show_flags
, BGP_SHOW_OPT_JSON
);
11058 if (use_json
&& is_wildcard
)
11059 vty_out(vty
, "{\n");
11061 afi
= 1; /* AFI_IP */
11062 while (afi
< AFI_MAX
) {
11064 safi
= 1; /* SAFI_UNICAST */
11065 while (safi
< SAFI_MAX
) {
11066 if (bgp_afi_safi_peer_exists(bgp
, afi
, safi
)) {
11071 * So limit output to those afi/safi
11073 * actualy have something interesting in
11078 vty_out(vty
, ",\n");
11082 vty_out(vty
, "\"%s\":",
11083 get_afi_safi_str(afi
,
11088 "\n%s Summary (%s):\n",
11089 get_afi_safi_str(afi
,
11095 bgp_show_summary(vty
, bgp
, afi
, safi
, fpeer
,
11096 as_type
, as
, show_flags
);
11099 if (!safi_wildcard
)
11107 if (use_json
&& is_wildcard
)
11108 vty_out(vty
, "}\n");
11109 else if (!nbr_output
) {
11111 vty_out(vty
, "{}\n");
11113 vty_out(vty
, "%% No BGP neighbors found in %s\n",
11118 static void bgp_show_all_instances_summary_vty(struct vty
*vty
, afi_t afi
,
11120 const char *neighbor
,
11121 int as_type
, as_t as
,
11122 uint16_t show_flags
)
11124 struct listnode
*node
, *nnode
;
11126 struct peer
*fpeer
= NULL
;
11128 bool nbr_output
= false;
11129 bool use_json
= CHECK_FLAG(show_flags
, BGP_SHOW_OPT_JSON
);
11132 vty_out(vty
, "{\n");
11134 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
11138 vty_out(vty
, ",\n");
11142 vty_out(vty
, "\"%s\":",
11143 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
11148 fpeer
= peer_lookup_in_view(vty
, bgp
, neighbor
,
11153 bgp_show_summary_afi_safi(vty
, bgp
, afi
, safi
, fpeer
, as_type
,
11158 vty_out(vty
, "}\n");
11159 else if (!nbr_output
)
11160 vty_out(vty
, "%% BGP instance not found\n");
11163 int bgp_show_summary_vty(struct vty
*vty
, const char *name
, afi_t afi
,
11164 safi_t safi
, const char *neighbor
, int as_type
,
11165 as_t as
, uint16_t show_flags
)
11168 bool use_json
= CHECK_FLAG(show_flags
, BGP_SHOW_OPT_JSON
);
11169 struct peer
*fpeer
= NULL
;
11172 if (strmatch(name
, "all")) {
11173 bgp_show_all_instances_summary_vty(vty
, afi
, safi
,
11176 return CMD_SUCCESS
;
11178 bgp
= bgp_lookup_by_name(name
);
11182 vty_out(vty
, "{}\n");
11185 "%% BGP instance not found\n");
11186 return CMD_WARNING
;
11190 fpeer
= peer_lookup_in_view(vty
, bgp
, neighbor
,
11193 return CMD_WARNING
;
11195 bgp_show_summary_afi_safi(vty
, bgp
, afi
, safi
, fpeer
,
11196 as_type
, as
, show_flags
);
11197 return CMD_SUCCESS
;
11201 bgp
= bgp_get_default();
11205 fpeer
= peer_lookup_in_view(vty
, bgp
, neighbor
,
11208 return CMD_WARNING
;
11210 bgp_show_summary_afi_safi(vty
, bgp
, afi
, safi
, fpeer
, as_type
,
11214 vty_out(vty
, "{}\n");
11216 vty_out(vty
, "%% BGP instance not found\n");
11217 return CMD_WARNING
;
11220 return CMD_SUCCESS
;
11223 /* `show [ip] bgp summary' commands. */
11224 DEFPY(show_ip_bgp_summary
, show_ip_bgp_summary_cmd
,
11225 "show [ip] bgp [<view|vrf> VIEWVRFNAME] [" BGP_AFI_CMD_STR
11226 " [" BGP_SAFI_WITH_LABEL_CMD_STR
11227 "]] [all$all] summary [established|failed] [<neighbor <A.B.C.D|X:X::X:X|WORD>|remote-as <(1-4294967295)|internal|external>>] [terse] [wide] [json$uj]",
11228 SHOW_STR IP_STR BGP_STR BGP_INSTANCE_HELP_STR BGP_AFI_HELP_STR
11229 BGP_SAFI_WITH_LABEL_HELP_STR
11230 "Display the entries for all address families\n"
11231 "Summary of BGP neighbor status\n"
11232 "Show only sessions in Established state\n"
11233 "Show only sessions not in Established state\n"
11234 "Show only the specified neighbor session\n"
11235 "Neighbor to display information about\n"
11236 "Neighbor to display information about\n"
11237 "Neighbor on BGP configured interface\n"
11238 "Show only the specified remote AS sessions\n"
11240 "Internal (iBGP) AS sessions\n"
11241 "External (eBGP) AS sessions\n"
11242 "Shorten the information on BGP instances\n"
11243 "Increase table width for longer output\n" JSON_STR
)
11246 afi_t afi
= AFI_MAX
;
11247 safi_t safi
= SAFI_MAX
;
11248 as_t as
= 0; /* 0 means AS filter not set */
11249 int as_type
= AS_UNSPECIFIED
;
11250 uint16_t show_flags
= 0;
11254 /* show [ip] bgp */
11255 if (!all
&& argv_find(argv
, argc
, "ip", &idx
))
11257 /* [<vrf> VIEWVRFNAME] */
11258 if (argv_find(argv
, argc
, "vrf", &idx
)) {
11259 vrf
= argv
[idx
+ 1]->arg
;
11260 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
11262 } else if (argv_find(argv
, argc
, "view", &idx
))
11263 /* [<view> VIEWVRFNAME] */
11264 vrf
= argv
[idx
+ 1]->arg
;
11265 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
11266 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
)) {
11267 argv_find_and_parse_safi(argv
, argc
, &idx
, &safi
);
11270 if (argv_find(argv
, argc
, "failed", &idx
))
11271 SET_FLAG(show_flags
, BGP_SHOW_OPT_FAILED
);
11273 if (argv_find(argv
, argc
, "established", &idx
))
11274 SET_FLAG(show_flags
, BGP_SHOW_OPT_ESTABLISHED
);
11276 if (argv_find(argv
, argc
, "remote-as", &idx
)) {
11277 if (argv
[idx
+ 1]->arg
[0] == 'i')
11278 as_type
= AS_INTERNAL
;
11279 else if (argv
[idx
+ 1]->arg
[0] == 'e')
11280 as_type
= AS_EXTERNAL
;
11282 as
= (as_t
)atoi(argv
[idx
+ 1]->arg
);
11285 if (argv_find(argv
, argc
, "terse", &idx
))
11286 SET_FLAG(show_flags
, BGP_SHOW_OPT_TERSE
);
11288 if (argv_find(argv
, argc
, "wide", &idx
))
11289 SET_FLAG(show_flags
, BGP_SHOW_OPT_WIDE
);
11291 if (argv_find(argv
, argc
, "json", &idx
))
11292 SET_FLAG(show_flags
, BGP_SHOW_OPT_JSON
);
11294 return bgp_show_summary_vty(vty
, vrf
, afi
, safi
, neighbor
, as_type
, as
,
11298 const char *get_afi_safi_str(afi_t afi
, safi_t safi
, bool for_json
)
11301 return get_afi_safi_json_str(afi
, safi
);
11303 return get_afi_safi_vty_str(afi
, safi
);
11307 static void bgp_show_peer_afi_orf_cap(struct vty
*vty
, struct peer
*p
,
11308 afi_t afi
, safi_t safi
,
11309 uint16_t adv_smcap
, uint16_t adv_rmcap
,
11310 uint16_t rcv_smcap
, uint16_t rcv_rmcap
,
11311 bool use_json
, json_object
*json_pref
)
11314 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_smcap
)
11315 || CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_smcap
)) {
11317 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_smcap
)
11318 && CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_smcap
))
11319 json_object_string_add(json_pref
, "sendMode",
11320 "advertisedAndReceived");
11321 else if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_smcap
))
11322 json_object_string_add(json_pref
, "sendMode",
11324 else if (CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_smcap
))
11325 json_object_string_add(json_pref
, "sendMode",
11328 vty_out(vty
, " Send-mode: ");
11329 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_smcap
))
11330 vty_out(vty
, "advertised");
11331 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_smcap
))
11332 vty_out(vty
, "%sreceived",
11333 CHECK_FLAG(p
->af_cap
[afi
][safi
],
11337 vty_out(vty
, "\n");
11342 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_rmcap
)
11343 || CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_rmcap
)) {
11345 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_rmcap
)
11346 && CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_rmcap
))
11347 json_object_string_add(json_pref
, "recvMode",
11348 "advertisedAndReceived");
11349 else if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_rmcap
))
11350 json_object_string_add(json_pref
, "recvMode",
11352 else if (CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_rmcap
))
11353 json_object_string_add(json_pref
, "recvMode",
11356 vty_out(vty
, " Receive-mode: ");
11357 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_rmcap
))
11358 vty_out(vty
, "advertised");
11359 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_rmcap
))
11360 vty_out(vty
, "%sreceived",
11361 CHECK_FLAG(p
->af_cap
[afi
][safi
],
11365 vty_out(vty
, "\n");
11370 static void bgp_show_neighnor_graceful_restart_flags(struct vty
*vty
,
11378 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_ADV
)
11379 && (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
))
11380 && (peer_established(p
))) {
11381 rbit
= CHECK_FLAG(p
->cap
, PEER_CAP_GRACEFUL_RESTART_R_BIT_RCV
);
11382 nbit
= CHECK_FLAG(p
->cap
, PEER_CAP_GRACEFUL_RESTART_N_BIT_RCV
);
11386 json_object_boolean_add(json
, "rBit", rbit
);
11387 json_object_boolean_add(json
, "nBit", nbit
);
11389 vty_out(vty
, "\n R bit: %s", rbit
? "True" : "False");
11390 vty_out(vty
, "\n N bit: %s\n", nbit
? "True" : "False");
11394 static void bgp_show_neighbor_graceful_restart_remote_mode(struct vty
*vty
,
11399 const char *mode
= "NotApplicable";
11402 vty_out(vty
, "\n Remote GR Mode: ");
11404 if (CHECK_FLAG(peer
->cap
, PEER_CAP_RESTART_ADV
)
11405 && (peer_established(peer
))) {
11407 if ((peer
->nsf_af_count
== 0)
11408 && !CHECK_FLAG(peer
->cap
, PEER_CAP_RESTART_RCV
)) {
11412 } else if (peer
->nsf_af_count
== 0
11413 && CHECK_FLAG(peer
->cap
, PEER_CAP_RESTART_RCV
)) {
11417 } else if (peer
->nsf_af_count
!= 0
11418 && CHECK_FLAG(peer
->cap
, PEER_CAP_RESTART_RCV
)) {
11425 json_object_string_add(json
, "remoteGrMode", mode
);
11427 vty_out(vty
, mode
, "\n");
11430 static void bgp_show_neighbor_graceful_restart_local_mode(struct vty
*vty
,
11435 const char *mode
= "Invalid";
11438 vty_out(vty
, " Local GR Mode: ");
11440 if (bgp_peer_gr_mode_get(p
) == PEER_HELPER
)
11442 else if (bgp_peer_gr_mode_get(p
) == PEER_GR
)
11444 else if (bgp_peer_gr_mode_get(p
) == PEER_DISABLE
)
11446 else if (bgp_peer_gr_mode_get(p
) == PEER_GLOBAL_INHERIT
) {
11447 if (bgp_global_gr_mode_get(p
->bgp
) == GLOBAL_HELPER
)
11449 else if (bgp_global_gr_mode_get(p
->bgp
) == GLOBAL_GR
)
11451 else if (bgp_global_gr_mode_get(p
->bgp
) == GLOBAL_DISABLE
)
11458 json_object_string_add(json
, "localGrMode", mode
);
11460 vty_out(vty
, mode
, "\n");
11464 static void bgp_show_neighbor_graceful_restart_capability_per_afi_safi(
11465 struct vty
*vty
, struct peer
*peer
, bool use_json
, json_object
*json
)
11469 json_object
*json_afi_safi
= NULL
;
11470 json_object
*json_timer
= NULL
;
11471 json_object
*json_endofrib_status
= NULL
;
11472 bool eor_flag
= false;
11474 FOREACH_AFI_SAFI_NSF (afi
, safi
) {
11475 if (!peer
->afc
[afi
][safi
])
11478 if (!CHECK_FLAG(peer
->cap
, PEER_CAP_RESTART_ADV
) ||
11479 !CHECK_FLAG(peer
->cap
, PEER_CAP_RESTART_RCV
))
11483 json_afi_safi
= json_object_new_object();
11484 json_endofrib_status
= json_object_new_object();
11485 json_timer
= json_object_new_object();
11488 if (peer
->eor_stime
[afi
][safi
] >= peer
->pkt_stime
[afi
][safi
])
11494 vty_out(vty
, " %s:\n",
11495 get_afi_safi_str(afi
, safi
, false));
11497 vty_out(vty
, " F bit: ");
11500 if (peer
->nsf
[afi
][safi
] &&
11501 CHECK_FLAG(peer
->af_cap
[afi
][safi
],
11502 PEER_CAP_RESTART_AF_PRESERVE_RCV
)) {
11505 json_object_boolean_true_add(json_afi_safi
,
11508 vty_out(vty
, "True\n");
11511 json_object_boolean_false_add(json_afi_safi
,
11514 vty_out(vty
, "False\n");
11518 vty_out(vty
, " End-of-RIB sent: ");
11520 if (CHECK_FLAG(peer
->af_sflags
[afi
][safi
],
11521 PEER_STATUS_EOR_SEND
)) {
11523 json_object_boolean_true_add(
11524 json_endofrib_status
, "endOfRibSend");
11526 PRINT_EOR_JSON(eor_flag
);
11528 vty_out(vty
, "Yes\n");
11530 " End-of-RIB sent after update: ");
11532 PRINT_EOR(eor_flag
);
11536 json_object_boolean_false_add(
11537 json_endofrib_status
, "endOfRibSend");
11538 json_object_boolean_false_add(
11539 json_endofrib_status
,
11540 "endOfRibSentAfterUpdate");
11542 vty_out(vty
, "No\n");
11544 " End-of-RIB sent after update: ");
11545 vty_out(vty
, "No\n");
11550 vty_out(vty
, " End-of-RIB received: ");
11552 if (CHECK_FLAG(peer
->af_sflags
[afi
][safi
],
11553 PEER_STATUS_EOR_RECEIVED
)) {
11555 json_object_boolean_true_add(
11556 json_endofrib_status
, "endOfRibRecv");
11558 vty_out(vty
, "Yes\n");
11561 json_object_boolean_false_add(
11562 json_endofrib_status
, "endOfRibRecv");
11564 vty_out(vty
, "No\n");
11568 json_object_int_add(json_timer
, "stalePathTimer",
11569 peer
->bgp
->stalepath_time
);
11571 if (peer
->t_gr_stale
!= NULL
) {
11572 json_object_int_add(json_timer
,
11573 "stalePathTimerRemaining",
11574 thread_timer_remain_second(
11575 peer
->t_gr_stale
));
11578 /* Display Configured Selection
11579 * Deferral only when when
11580 * Gr mode is enabled.
11582 if (CHECK_FLAG(peer
->flags
,
11583 PEER_FLAG_GRACEFUL_RESTART
)) {
11584 json_object_int_add(json_timer
,
11585 "selectionDeferralTimer",
11586 peer
->bgp
->stalepath_time
);
11589 if (peer
->bgp
->gr_info
[afi
][safi
].t_select_deferral
!=
11592 json_object_int_add(
11594 "selectionDeferralTimerRemaining",
11595 thread_timer_remain_second(
11596 peer
->bgp
->gr_info
[afi
][safi
]
11597 .t_select_deferral
));
11600 vty_out(vty
, " Timers:\n");
11602 " Configured Stale Path Time(sec): %u\n",
11603 peer
->bgp
->stalepath_time
);
11605 if (peer
->t_gr_stale
!= NULL
)
11607 " Stale Path Remaining(sec): %ld\n",
11608 thread_timer_remain_second(
11609 peer
->t_gr_stale
));
11610 /* Display Configured Selection
11611 * Deferral only when when
11612 * Gr mode is enabled.
11614 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_GRACEFUL_RESTART
))
11616 " Configured Selection Deferral Time(sec): %u\n",
11617 peer
->bgp
->select_defer_time
);
11619 if (peer
->bgp
->gr_info
[afi
][safi
].t_select_deferral
!=
11622 " Selection Deferral Time Remaining(sec): %ld\n",
11623 thread_timer_remain_second(
11624 peer
->bgp
->gr_info
[afi
][safi
]
11625 .t_select_deferral
));
11628 json_object_object_add(json_afi_safi
, "endOfRibStatus",
11629 json_endofrib_status
);
11630 json_object_object_add(json_afi_safi
, "timers",
11632 json_object_object_add(
11633 json
, get_afi_safi_str(afi
, safi
, true),
11639 static void bgp_show_neighbor_graceful_restart_time(struct vty
*vty
,
11645 json_object
*json_timer
= NULL
;
11647 json_timer
= json_object_new_object();
11649 json_object_int_add(json_timer
, "configuredRestartTimer",
11650 p
->bgp
->restart_time
);
11652 json_object_int_add(json_timer
, "receivedRestartTimer",
11655 if (p
->t_gr_restart
!= NULL
)
11656 json_object_int_add(
11657 json_timer
, "restartTimerRemaining",
11658 thread_timer_remain_second(p
->t_gr_restart
));
11660 json_object_object_add(json
, "timers", json_timer
);
11663 vty_out(vty
, " Timers:\n");
11664 vty_out(vty
, " Configured Restart Time(sec): %u\n",
11665 p
->bgp
->restart_time
);
11667 vty_out(vty
, " Received Restart Time(sec): %u\n",
11669 if (p
->t_gr_restart
!= NULL
)
11670 vty_out(vty
, " Restart Time Remaining(sec): %ld\n",
11671 thread_timer_remain_second(p
->t_gr_restart
));
11672 if (p
->t_gr_restart
!= NULL
) {
11673 vty_out(vty
, " Restart Time Remaining(sec): %ld\n",
11674 thread_timer_remain_second(p
->t_gr_restart
));
11679 static void bgp_show_peer_gr_status(struct vty
*vty
, struct peer
*p
,
11680 bool use_json
, json_object
*json
)
11682 char buf
[SU_ADDRSTRLEN
] = {0};
11683 char dn_flag
[2] = {0};
11684 /* '*' + v6 address of neighbor */
11685 char neighborAddr
[INET6_ADDRSTRLEN
+ 1] = {0};
11687 if (!p
->conf_if
&& peer_dynamic_neighbor(p
))
11692 json_object_string_add(
11693 json
, "neighborAddr",
11694 BGP_PEER_SU_UNSPEC(p
)
11696 : sockunion2str(&p
->su
, buf
,
11699 vty_out(vty
, "BGP neighbor on %s: %s\n", p
->conf_if
,
11700 BGP_PEER_SU_UNSPEC(p
)
11702 : sockunion2str(&p
->su
, buf
,
11705 snprintf(neighborAddr
, sizeof(neighborAddr
), "%s%s", dn_flag
,
11709 json_object_string_add(json
, "neighborAddr",
11712 vty_out(vty
, "BGP neighbor is %s\n", neighborAddr
);
11715 /* more gr info in new format */
11716 BGP_SHOW_PEER_GR_CAPABILITY(vty
, p
, use_json
, json
);
11719 static void bgp_show_peer_afi(struct vty
*vty
, struct peer
*p
, afi_t afi
,
11720 safi_t safi
, bool use_json
,
11721 json_object
*json_neigh
)
11723 struct bgp_filter
*filter
;
11724 struct peer_af
*paf
;
11725 char orf_pfx_name
[BUFSIZ
];
11727 json_object
*json_af
= NULL
;
11728 json_object
*json_prefA
= NULL
;
11729 json_object
*json_prefB
= NULL
;
11730 json_object
*json_addr
= NULL
;
11731 json_object
*json_advmap
= NULL
;
11734 json_addr
= json_object_new_object();
11735 json_af
= json_object_new_object();
11736 filter
= &p
->filter
[afi
][safi
];
11738 if (peer_group_active(p
))
11739 json_object_string_add(json_addr
, "peerGroupMember",
11742 paf
= peer_af_find(p
, afi
, safi
);
11743 if (paf
&& PAF_SUBGRP(paf
)) {
11744 json_object_int_add(json_addr
, "updateGroupId",
11745 PAF_UPDGRP(paf
)->id
);
11746 json_object_int_add(json_addr
, "subGroupId",
11747 PAF_SUBGRP(paf
)->id
);
11748 json_object_int_add(json_addr
, "packetQueueLength",
11749 bpacket_queue_virtual_length(paf
));
11752 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
11753 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
11754 PEER_CAP_ORF_PREFIX_SM_RCV
)
11755 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
11756 PEER_CAP_ORF_PREFIX_RM_ADV
)
11757 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
11758 PEER_CAP_ORF_PREFIX_RM_RCV
)) {
11759 json_object_int_add(json_af
, "orfType",
11761 json_prefA
= json_object_new_object();
11762 bgp_show_peer_afi_orf_cap(vty
, p
, afi
, safi
,
11763 PEER_CAP_ORF_PREFIX_SM_ADV
,
11764 PEER_CAP_ORF_PREFIX_RM_ADV
,
11765 PEER_CAP_ORF_PREFIX_SM_RCV
,
11766 PEER_CAP_ORF_PREFIX_RM_RCV
,
11767 use_json
, json_prefA
);
11768 json_object_object_add(json_af
, "orfPrefixList",
11772 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
11773 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
11774 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
11775 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
11776 PEER_CAP_ORF_PREFIX_RM_ADV
)
11777 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
11778 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
)) {
11779 json_object_int_add(json_af
, "orfOldType",
11780 ORF_TYPE_PREFIX_OLD
);
11781 json_prefB
= json_object_new_object();
11782 bgp_show_peer_afi_orf_cap(
11783 vty
, p
, afi
, safi
, PEER_CAP_ORF_PREFIX_SM_ADV
,
11784 PEER_CAP_ORF_PREFIX_RM_ADV
,
11785 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
,
11786 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
, use_json
,
11788 json_object_object_add(json_af
, "orfOldPrefixList",
11792 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
11793 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
11794 PEER_CAP_ORF_PREFIX_SM_RCV
)
11795 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
11796 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
11797 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
11798 PEER_CAP_ORF_PREFIX_RM_ADV
)
11799 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
11800 PEER_CAP_ORF_PREFIX_RM_RCV
)
11801 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
11802 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
))
11803 json_object_object_add(json_addr
, "afDependentCap",
11806 json_object_free(json_af
);
11808 snprintf(orf_pfx_name
, sizeof(orf_pfx_name
), "%s.%d.%d",
11809 p
->host
, afi
, safi
);
11810 orf_pfx_count
= prefix_bgp_show_prefix_list(
11811 NULL
, afi
, orf_pfx_name
, use_json
);
11813 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
11814 PEER_STATUS_ORF_PREFIX_SEND
)
11815 || orf_pfx_count
) {
11816 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
11817 PEER_STATUS_ORF_PREFIX_SEND
))
11818 json_object_boolean_true_add(json_neigh
,
11821 json_object_int_add(json_addr
, "orfRecvCounter",
11824 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
11825 PEER_STATUS_ORF_WAIT_REFRESH
))
11826 json_object_string_add(
11827 json_addr
, "orfFirstUpdate",
11828 "deferredUntilORFOrRouteRefreshRecvd");
11830 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
11831 PEER_FLAG_REFLECTOR_CLIENT
))
11832 json_object_boolean_true_add(json_addr
,
11833 "routeReflectorClient");
11834 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
11835 PEER_FLAG_RSERVER_CLIENT
))
11836 json_object_boolean_true_add(json_addr
,
11837 "routeServerClient");
11838 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
11839 json_object_boolean_true_add(json_addr
,
11840 "inboundSoftConfigPermit");
11842 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
11843 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
))
11844 json_object_boolean_true_add(
11846 "privateAsNumsAllReplacedInUpdatesToNbr");
11847 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
11848 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
))
11849 json_object_boolean_true_add(
11851 "privateAsNumsReplacedInUpdatesToNbr");
11852 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
11853 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
))
11854 json_object_boolean_true_add(
11856 "privateAsNumsAllRemovedInUpdatesToNbr");
11857 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
11858 PEER_FLAG_REMOVE_PRIVATE_AS
))
11859 json_object_boolean_true_add(
11861 "privateAsNumsRemovedInUpdatesToNbr");
11863 if (p
->addpath_type
[afi
][safi
] != BGP_ADDPATH_NONE
)
11864 json_object_boolean_true_add(
11866 bgp_addpath_names(p
->addpath_type
[afi
][safi
])
11869 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_AS_OVERRIDE
))
11870 json_object_string_add(json_addr
,
11871 "overrideASNsInOutboundUpdates",
11872 "ifAspathEqualRemoteAs");
11874 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_SELF
)
11875 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
11876 PEER_FLAG_FORCE_NEXTHOP_SELF
))
11877 json_object_boolean_true_add(json_addr
,
11878 "routerAlwaysNextHop");
11879 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
11880 PEER_FLAG_AS_PATH_UNCHANGED
))
11881 json_object_boolean_true_add(
11882 json_addr
, "unchangedAsPathPropogatedToNbr");
11883 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
11884 PEER_FLAG_NEXTHOP_UNCHANGED
))
11885 json_object_boolean_true_add(
11886 json_addr
, "unchangedNextHopPropogatedToNbr");
11887 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
11888 json_object_boolean_true_add(
11889 json_addr
, "unchangedMedPropogatedToNbr");
11890 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
)
11891 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
11892 PEER_FLAG_SEND_EXT_COMMUNITY
)) {
11893 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
11894 PEER_FLAG_SEND_COMMUNITY
)
11895 && CHECK_FLAG(p
->af_flags
[afi
][safi
],
11896 PEER_FLAG_SEND_EXT_COMMUNITY
))
11897 json_object_string_add(json_addr
,
11898 "commAttriSentToNbr",
11899 "extendedAndStandard");
11900 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
11901 PEER_FLAG_SEND_EXT_COMMUNITY
))
11902 json_object_string_add(json_addr
,
11903 "commAttriSentToNbr",
11906 json_object_string_add(json_addr
,
11907 "commAttriSentToNbr",
11910 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
11911 PEER_FLAG_DEFAULT_ORIGINATE
)) {
11912 if (p
->default_rmap
[afi
][safi
].name
)
11913 json_object_string_add(
11914 json_addr
, "defaultRouteMap",
11915 p
->default_rmap
[afi
][safi
].name
);
11917 if (paf
&& PAF_SUBGRP(paf
)
11918 && CHECK_FLAG(PAF_SUBGRP(paf
)->sflags
,
11919 SUBGRP_STATUS_DEFAULT_ORIGINATE
))
11920 json_object_boolean_true_add(json_addr
,
11923 json_object_boolean_true_add(json_addr
,
11927 if (afi
== AFI_L2VPN
&& safi
== SAFI_EVPN
) {
11928 if (is_evpn_enabled())
11929 json_object_boolean_true_add(
11930 json_addr
, "advertiseAllVnis");
11933 if (filter
->plist
[FILTER_IN
].name
11934 || filter
->dlist
[FILTER_IN
].name
11935 || filter
->aslist
[FILTER_IN
].name
11936 || filter
->map
[RMAP_IN
].name
)
11937 json_object_boolean_true_add(json_addr
,
11938 "inboundPathPolicyConfig");
11939 if (filter
->plist
[FILTER_OUT
].name
11940 || filter
->dlist
[FILTER_OUT
].name
11941 || filter
->aslist
[FILTER_OUT
].name
11942 || filter
->map
[RMAP_OUT
].name
|| filter
->usmap
.name
)
11943 json_object_boolean_true_add(
11944 json_addr
, "outboundPathPolicyConfig");
11947 if (filter
->plist
[FILTER_IN
].name
)
11948 json_object_string_add(json_addr
,
11949 "incomingUpdatePrefixFilterList",
11950 filter
->plist
[FILTER_IN
].name
);
11951 if (filter
->plist
[FILTER_OUT
].name
)
11952 json_object_string_add(json_addr
,
11953 "outgoingUpdatePrefixFilterList",
11954 filter
->plist
[FILTER_OUT
].name
);
11956 /* distribute-list */
11957 if (filter
->dlist
[FILTER_IN
].name
)
11958 json_object_string_add(
11959 json_addr
, "incomingUpdateNetworkFilterList",
11960 filter
->dlist
[FILTER_IN
].name
);
11961 if (filter
->dlist
[FILTER_OUT
].name
)
11962 json_object_string_add(
11963 json_addr
, "outgoingUpdateNetworkFilterList",
11964 filter
->dlist
[FILTER_OUT
].name
);
11967 if (filter
->aslist
[FILTER_IN
].name
)
11968 json_object_string_add(json_addr
,
11969 "incomingUpdateAsPathFilterList",
11970 filter
->aslist
[FILTER_IN
].name
);
11971 if (filter
->aslist
[FILTER_OUT
].name
)
11972 json_object_string_add(json_addr
,
11973 "outgoingUpdateAsPathFilterList",
11974 filter
->aslist
[FILTER_OUT
].name
);
11977 if (filter
->map
[RMAP_IN
].name
)
11978 json_object_string_add(
11979 json_addr
, "routeMapForIncomingAdvertisements",
11980 filter
->map
[RMAP_IN
].name
);
11981 if (filter
->map
[RMAP_OUT
].name
)
11982 json_object_string_add(
11983 json_addr
, "routeMapForOutgoingAdvertisements",
11984 filter
->map
[RMAP_OUT
].name
);
11986 /* ebgp-requires-policy (inbound) */
11987 if (CHECK_FLAG(p
->bgp
->flags
, BGP_FLAG_EBGP_REQUIRES_POLICY
)
11988 && !bgp_inbound_policy_exists(p
, filter
))
11989 json_object_string_add(
11990 json_addr
, "inboundEbgpRequiresPolicy",
11991 "Inbound updates discarded due to missing policy");
11993 /* ebgp-requires-policy (outbound) */
11994 if (CHECK_FLAG(p
->bgp
->flags
, BGP_FLAG_EBGP_REQUIRES_POLICY
)
11995 && (!bgp_outbound_policy_exists(p
, filter
)))
11996 json_object_string_add(
11997 json_addr
, "outboundEbgpRequiresPolicy",
11998 "Outbound updates discarded due to missing policy");
12000 /* unsuppress-map */
12001 if (filter
->usmap
.name
)
12002 json_object_string_add(json_addr
,
12003 "selectiveUnsuppressRouteMap",
12004 filter
->usmap
.name
);
12006 /* advertise-map */
12007 if (filter
->advmap
.aname
) {
12008 json_advmap
= json_object_new_object();
12009 json_object_string_add(json_advmap
, "condition",
12010 filter
->advmap
.condition
12013 json_object_string_add(json_advmap
, "conditionMap",
12014 filter
->advmap
.cname
);
12015 json_object_string_add(json_advmap
, "advertiseMap",
12016 filter
->advmap
.aname
);
12017 json_object_string_add(json_advmap
, "advertiseStatus",
12018 filter
->advmap
.update_type
12022 json_object_object_add(json_addr
, "advertiseMap",
12026 /* Receive prefix count */
12027 json_object_int_add(json_addr
, "acceptedPrefixCounter",
12028 p
->pcount
[afi
][safi
]);
12029 if (paf
&& PAF_SUBGRP(paf
))
12030 json_object_int_add(json_addr
, "sentPrefixCounter",
12031 (PAF_SUBGRP(paf
))->scount
);
12033 /* Maximum prefix */
12034 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_OUT
))
12035 json_object_int_add(json_addr
, "prefixOutAllowedMax",
12036 p
->pmax_out
[afi
][safi
]);
12038 /* Maximum prefix */
12039 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
)) {
12040 json_object_int_add(json_addr
, "prefixAllowedMax",
12041 p
->pmax
[afi
][safi
]);
12042 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12043 PEER_FLAG_MAX_PREFIX_WARNING
))
12044 json_object_boolean_true_add(
12045 json_addr
, "prefixAllowedMaxWarning");
12046 json_object_int_add(json_addr
,
12047 "prefixAllowedWarningThresh",
12048 p
->pmax_threshold
[afi
][safi
]);
12049 if (p
->pmax_restart
[afi
][safi
])
12050 json_object_int_add(
12052 "prefixAllowedRestartIntervalMsecs",
12053 p
->pmax_restart
[afi
][safi
] * 60000);
12055 json_object_object_add(json_neigh
,
12056 get_afi_safi_str(afi
, safi
, true),
12060 filter
= &p
->filter
[afi
][safi
];
12062 vty_out(vty
, " For address family: %s\n",
12063 get_afi_safi_str(afi
, safi
, false));
12065 if (peer_group_active(p
))
12066 vty_out(vty
, " %s peer-group member\n",
12069 paf
= peer_af_find(p
, afi
, safi
);
12070 if (paf
&& PAF_SUBGRP(paf
)) {
12071 vty_out(vty
, " Update group %" PRIu64
", subgroup %" PRIu64
"\n",
12072 PAF_UPDGRP(paf
)->id
, PAF_SUBGRP(paf
)->id
);
12073 vty_out(vty
, " Packet Queue length %d\n",
12074 bpacket_queue_virtual_length(paf
));
12076 vty_out(vty
, " Not part of any update group\n");
12078 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
12079 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
12080 PEER_CAP_ORF_PREFIX_SM_RCV
)
12081 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
12082 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
12083 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
12084 PEER_CAP_ORF_PREFIX_RM_ADV
)
12085 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
12086 PEER_CAP_ORF_PREFIX_RM_RCV
)
12087 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
12088 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
))
12089 vty_out(vty
, " AF-dependant capabilities:\n");
12091 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
12092 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
12093 PEER_CAP_ORF_PREFIX_SM_RCV
)
12094 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
12095 PEER_CAP_ORF_PREFIX_RM_ADV
)
12096 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
12097 PEER_CAP_ORF_PREFIX_RM_RCV
)) {
12099 " Outbound Route Filter (ORF) type (%d) Prefix-list:\n",
12101 bgp_show_peer_afi_orf_cap(
12102 vty
, p
, afi
, safi
, PEER_CAP_ORF_PREFIX_SM_ADV
,
12103 PEER_CAP_ORF_PREFIX_RM_ADV
,
12104 PEER_CAP_ORF_PREFIX_SM_RCV
,
12105 PEER_CAP_ORF_PREFIX_RM_RCV
, use_json
, NULL
);
12107 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
12108 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
12109 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
12110 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
12111 PEER_CAP_ORF_PREFIX_RM_ADV
)
12112 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
12113 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
)) {
12115 " Outbound Route Filter (ORF) type (%d) Prefix-list:\n",
12116 ORF_TYPE_PREFIX_OLD
);
12117 bgp_show_peer_afi_orf_cap(
12118 vty
, p
, afi
, safi
, PEER_CAP_ORF_PREFIX_SM_ADV
,
12119 PEER_CAP_ORF_PREFIX_RM_ADV
,
12120 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
,
12121 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
, use_json
, NULL
);
12124 snprintf(orf_pfx_name
, sizeof(orf_pfx_name
), "%s.%d.%d",
12125 p
->host
, afi
, safi
);
12126 orf_pfx_count
= prefix_bgp_show_prefix_list(
12127 NULL
, afi
, orf_pfx_name
, use_json
);
12129 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
12130 PEER_STATUS_ORF_PREFIX_SEND
)
12131 || orf_pfx_count
) {
12132 vty_out(vty
, " Outbound Route Filter (ORF):");
12133 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
12134 PEER_STATUS_ORF_PREFIX_SEND
))
12135 vty_out(vty
, " sent;");
12137 vty_out(vty
, " received (%d entries)",
12139 vty_out(vty
, "\n");
12141 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
12142 PEER_STATUS_ORF_WAIT_REFRESH
))
12144 " First update is deferred until ORF or ROUTE-REFRESH is received\n");
12146 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12147 PEER_FLAG_REFLECTOR_CLIENT
))
12148 vty_out(vty
, " Route-Reflector Client\n");
12149 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12150 PEER_FLAG_RSERVER_CLIENT
))
12151 vty_out(vty
, " Route-Server Client\n");
12152 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
12154 " Inbound soft reconfiguration allowed\n");
12156 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12157 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
))
12159 " Private AS numbers (all) replaced in updates to this neighbor\n");
12160 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12161 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
))
12163 " Private AS numbers replaced in updates to this neighbor\n");
12164 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12165 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
))
12167 " Private AS numbers (all) removed in updates to this neighbor\n");
12168 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12169 PEER_FLAG_REMOVE_PRIVATE_AS
))
12171 " Private AS numbers removed in updates to this neighbor\n");
12173 if (p
->addpath_type
[afi
][safi
] != BGP_ADDPATH_NONE
)
12174 vty_out(vty
, " %s\n",
12175 bgp_addpath_names(p
->addpath_type
[afi
][safi
])
12176 ->human_description
);
12178 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_AS_OVERRIDE
))
12180 " Override ASNs in outbound updates if aspath equals remote-as\n");
12182 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_SELF
)
12183 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
12184 PEER_FLAG_FORCE_NEXTHOP_SELF
))
12185 vty_out(vty
, " NEXT_HOP is always this router\n");
12186 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12187 PEER_FLAG_AS_PATH_UNCHANGED
))
12189 " AS_PATH is propagated unchanged to this neighbor\n");
12190 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12191 PEER_FLAG_NEXTHOP_UNCHANGED
))
12193 " NEXT_HOP is propagated unchanged to this neighbor\n");
12194 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
12196 " MED is propagated unchanged to this neighbor\n");
12197 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
)
12198 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
12199 PEER_FLAG_SEND_EXT_COMMUNITY
)
12200 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
12201 PEER_FLAG_SEND_LARGE_COMMUNITY
)) {
12203 " Community attribute sent to this neighbor");
12204 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12205 PEER_FLAG_SEND_COMMUNITY
)
12206 && CHECK_FLAG(p
->af_flags
[afi
][safi
],
12207 PEER_FLAG_SEND_EXT_COMMUNITY
)
12208 && CHECK_FLAG(p
->af_flags
[afi
][safi
],
12209 PEER_FLAG_SEND_LARGE_COMMUNITY
))
12210 vty_out(vty
, "(all)\n");
12211 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12212 PEER_FLAG_SEND_LARGE_COMMUNITY
))
12213 vty_out(vty
, "(large)\n");
12214 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12215 PEER_FLAG_SEND_EXT_COMMUNITY
))
12216 vty_out(vty
, "(extended)\n");
12218 vty_out(vty
, "(standard)\n");
12220 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12221 PEER_FLAG_DEFAULT_ORIGINATE
)) {
12222 vty_out(vty
, " Default information originate,");
12224 if (p
->default_rmap
[afi
][safi
].name
)
12225 vty_out(vty
, " default route-map %s%s,",
12226 p
->default_rmap
[afi
][safi
].map
? "*"
12228 p
->default_rmap
[afi
][safi
].name
);
12229 if (paf
&& PAF_SUBGRP(paf
)
12230 && CHECK_FLAG(PAF_SUBGRP(paf
)->sflags
,
12231 SUBGRP_STATUS_DEFAULT_ORIGINATE
))
12232 vty_out(vty
, " default sent\n");
12234 vty_out(vty
, " default not sent\n");
12237 /* advertise-vni-all */
12238 if (afi
== AFI_L2VPN
&& safi
== SAFI_EVPN
) {
12239 if (is_evpn_enabled())
12240 vty_out(vty
, " advertise-all-vni\n");
12243 if (filter
->plist
[FILTER_IN
].name
12244 || filter
->dlist
[FILTER_IN
].name
12245 || filter
->aslist
[FILTER_IN
].name
12246 || filter
->map
[RMAP_IN
].name
)
12247 vty_out(vty
, " Inbound path policy configured\n");
12248 if (filter
->plist
[FILTER_OUT
].name
12249 || filter
->dlist
[FILTER_OUT
].name
12250 || filter
->aslist
[FILTER_OUT
].name
12251 || filter
->map
[RMAP_OUT
].name
|| filter
->usmap
.name
)
12252 vty_out(vty
, " Outbound path policy configured\n");
12255 if (filter
->plist
[FILTER_IN
].name
)
12257 " Incoming update prefix filter list is %s%s\n",
12258 filter
->plist
[FILTER_IN
].plist
? "*" : "",
12259 filter
->plist
[FILTER_IN
].name
);
12260 if (filter
->plist
[FILTER_OUT
].name
)
12262 " Outgoing update prefix filter list is %s%s\n",
12263 filter
->plist
[FILTER_OUT
].plist
? "*" : "",
12264 filter
->plist
[FILTER_OUT
].name
);
12266 /* distribute-list */
12267 if (filter
->dlist
[FILTER_IN
].name
)
12269 " Incoming update network filter list is %s%s\n",
12270 filter
->dlist
[FILTER_IN
].alist
? "*" : "",
12271 filter
->dlist
[FILTER_IN
].name
);
12272 if (filter
->dlist
[FILTER_OUT
].name
)
12274 " Outgoing update network filter list is %s%s\n",
12275 filter
->dlist
[FILTER_OUT
].alist
? "*" : "",
12276 filter
->dlist
[FILTER_OUT
].name
);
12279 if (filter
->aslist
[FILTER_IN
].name
)
12281 " Incoming update AS path filter list is %s%s\n",
12282 filter
->aslist
[FILTER_IN
].aslist
? "*" : "",
12283 filter
->aslist
[FILTER_IN
].name
);
12284 if (filter
->aslist
[FILTER_OUT
].name
)
12286 " Outgoing update AS path filter list is %s%s\n",
12287 filter
->aslist
[FILTER_OUT
].aslist
? "*" : "",
12288 filter
->aslist
[FILTER_OUT
].name
);
12291 if (filter
->map
[RMAP_IN
].name
)
12293 " Route map for incoming advertisements is %s%s\n",
12294 filter
->map
[RMAP_IN
].map
? "*" : "",
12295 filter
->map
[RMAP_IN
].name
);
12296 if (filter
->map
[RMAP_OUT
].name
)
12298 " Route map for outgoing advertisements is %s%s\n",
12299 filter
->map
[RMAP_OUT
].map
? "*" : "",
12300 filter
->map
[RMAP_OUT
].name
);
12302 /* ebgp-requires-policy (inbound) */
12303 if (CHECK_FLAG(p
->bgp
->flags
, BGP_FLAG_EBGP_REQUIRES_POLICY
)
12304 && !bgp_inbound_policy_exists(p
, filter
))
12306 " Inbound updates discarded due to missing policy\n");
12308 /* ebgp-requires-policy (outbound) */
12309 if (CHECK_FLAG(p
->bgp
->flags
, BGP_FLAG_EBGP_REQUIRES_POLICY
)
12310 && !bgp_outbound_policy_exists(p
, filter
))
12312 " Outbound updates discarded due to missing policy\n");
12314 /* unsuppress-map */
12315 if (filter
->usmap
.name
)
12317 " Route map for selective unsuppress is %s%s\n",
12318 filter
->usmap
.map
? "*" : "",
12319 filter
->usmap
.name
);
12321 /* advertise-map */
12322 if (filter
->advmap
.aname
&& filter
->advmap
.cname
)
12324 " Condition %s, Condition-map %s%s, Advertise-map %s%s, status: %s\n",
12325 filter
->advmap
.condition
? "EXIST"
12327 filter
->advmap
.cmap
? "*" : "",
12328 filter
->advmap
.cname
,
12329 filter
->advmap
.amap
? "*" : "",
12330 filter
->advmap
.aname
,
12331 filter
->advmap
.update_type
== ADVERTISE
12335 /* Receive prefix count */
12336 vty_out(vty
, " %u accepted prefixes\n",
12337 p
->pcount
[afi
][safi
]);
12339 /* maximum-prefix-out */
12340 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12341 PEER_FLAG_MAX_PREFIX_OUT
))
12343 " Maximum allowed prefixes sent %u\n",
12344 p
->pmax_out
[afi
][safi
]);
12346 /* Maximum prefix */
12347 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
)) {
12349 " Maximum prefixes allowed %u%s\n",
12350 p
->pmax
[afi
][safi
],
12351 CHECK_FLAG(p
->af_flags
[afi
][safi
],
12352 PEER_FLAG_MAX_PREFIX_WARNING
)
12353 ? " (warning-only)"
12355 vty_out(vty
, " Threshold for warning message %d%%",
12356 p
->pmax_threshold
[afi
][safi
]);
12357 if (p
->pmax_restart
[afi
][safi
])
12358 vty_out(vty
, ", restart interval %d min",
12359 p
->pmax_restart
[afi
][safi
]);
12360 vty_out(vty
, "\n");
12363 vty_out(vty
, "\n");
12367 static void bgp_show_peer(struct vty
*vty
, struct peer
*p
, bool use_json
,
12371 char buf1
[PREFIX2STR_BUFFER
], buf
[SU_ADDRSTRLEN
];
12372 char timebuf
[BGP_UPTIME_LEN
];
12378 json_object
*json_neigh
= NULL
;
12380 uint32_t sync_tcp_mss
;
12385 json_neigh
= json_object_new_object();
12387 memset(dn_flag
, '\0', sizeof(dn_flag
));
12388 if (!p
->conf_if
&& peer_dynamic_neighbor(p
))
12392 if (p
->conf_if
) /* Configured interface name. */
12393 vty_out(vty
, "BGP neighbor on %s: %s, ", p
->conf_if
,
12394 BGP_PEER_SU_UNSPEC(p
)
12396 : sockunion2str(&p
->su
, buf
,
12398 else /* Configured IP address. */
12399 vty_out(vty
, "BGP neighbor is %s%s, ", dn_flag
,
12404 if (p
->conf_if
&& BGP_PEER_SU_UNSPEC(p
))
12405 json_object_string_add(json_neigh
, "bgpNeighborAddr",
12407 else if (p
->conf_if
&& !BGP_PEER_SU_UNSPEC(p
))
12408 json_object_string_add(
12409 json_neigh
, "bgpNeighborAddr",
12410 sockunion2str(&p
->su
, buf
, SU_ADDRSTRLEN
));
12412 json_object_int_add(json_neigh
, "remoteAs", p
->as
);
12414 if (p
->change_local_as
)
12415 json_object_int_add(json_neigh
, "localAs",
12416 p
->change_local_as
);
12418 json_object_int_add(json_neigh
, "localAs", p
->local_as
);
12420 if (CHECK_FLAG(p
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
))
12421 json_object_boolean_true_add(json_neigh
,
12422 "localAsNoPrepend");
12424 if (CHECK_FLAG(p
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
))
12425 json_object_boolean_true_add(json_neigh
,
12426 "localAsReplaceAs");
12428 if ((p
->as_type
== AS_SPECIFIED
) || (p
->as_type
== AS_EXTERNAL
)
12429 || (p
->as_type
== AS_INTERNAL
))
12430 vty_out(vty
, "remote AS %u, ", p
->as
);
12432 vty_out(vty
, "remote AS Unspecified, ");
12433 vty_out(vty
, "local AS %u%s%s, ",
12434 p
->change_local_as
? p
->change_local_as
: p
->local_as
,
12435 CHECK_FLAG(p
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
)
12438 CHECK_FLAG(p
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
)
12442 /* peer type internal or confed-internal */
12443 if ((p
->as
== p
->local_as
) || (p
->as_type
== AS_INTERNAL
)) {
12445 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
))
12446 json_object_boolean_true_add(
12447 json_neigh
, "nbrConfedInternalLink");
12449 json_object_boolean_true_add(json_neigh
,
12450 "nbrInternalLink");
12452 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
))
12453 vty_out(vty
, "confed-internal link\n");
12455 vty_out(vty
, "internal link\n");
12457 /* peer type external or confed-external */
12458 } else if (p
->as
|| (p
->as_type
== AS_EXTERNAL
)) {
12460 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
))
12461 json_object_boolean_true_add(
12462 json_neigh
, "nbrConfedExternalLink");
12464 json_object_boolean_true_add(json_neigh
,
12465 "nbrExternalLink");
12467 if (bgp_confederation_peers_check(bgp
, p
->as
))
12468 vty_out(vty
, "confed-external link\n");
12470 vty_out(vty
, "external link\n");
12474 json_object_boolean_true_add(json_neigh
,
12475 "nbrUnspecifiedLink");
12477 vty_out(vty
, "unspecified link\n");
12483 json_object_string_add(json_neigh
, "nbrDesc", p
->desc
);
12485 vty_out(vty
, " Description: %s\n", p
->desc
);
12491 json_object_string_add(json_neigh
, "hostname",
12495 json_object_string_add(json_neigh
, "domainname",
12498 if (p
->domainname
&& (p
->domainname
[0] != '\0'))
12499 vty_out(vty
, "Hostname: %s.%s\n", p
->hostname
,
12502 vty_out(vty
, "Hostname: %s\n", p
->hostname
);
12509 json_object_string_add(json_neigh
, "peerGroup",
12513 struct prefix prefix
, *range
= NULL
;
12515 if (sockunion2hostprefix(&(p
->su
), &prefix
))
12516 range
= peer_group_lookup_dynamic_neighbor_range(
12517 p
->group
, &prefix
);
12520 json_object_string_addf(
12522 "peerSubnetRangeGroup", "%pFX",
12528 " Member of peer-group %s for session parameters\n",
12532 struct prefix prefix
, *range
= NULL
;
12534 if (sockunion2hostprefix(&(p
->su
), &prefix
))
12535 range
= peer_group_lookup_dynamic_neighbor_range(
12536 p
->group
, &prefix
);
12540 " Belongs to the subnet range group: %pFX\n",
12548 /* Administrative shutdown. */
12549 if (CHECK_FLAG(p
->flags
, PEER_FLAG_SHUTDOWN
)
12550 || CHECK_FLAG(p
->bgp
->flags
, BGP_FLAG_SHUTDOWN
))
12551 json_object_boolean_true_add(json_neigh
,
12555 json_object_int_add(json_neigh
, "bgpVersion", 4);
12556 json_object_string_addf(json_neigh
, "remoteRouterId", "%pI4",
12558 json_object_string_addf(json_neigh
, "localRouterId", "%pI4",
12561 /* Confederation */
12562 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
)
12563 && bgp_confederation_peers_check(bgp
, p
->as
))
12564 json_object_boolean_true_add(json_neigh
,
12568 json_object_string_add(
12569 json_neigh
, "bgpState",
12570 lookup_msg(bgp_status_msg
, p
->status
, NULL
));
12572 if (peer_established(p
)) {
12575 uptime
= bgp_clock();
12576 uptime
-= p
->uptime
;
12577 epoch_tbuf
= time(NULL
) - uptime
;
12579 json_object_int_add(json_neigh
, "bgpTimerUpMsec",
12581 json_object_string_add(json_neigh
, "bgpTimerUpString",
12582 peer_uptime(p
->uptime
, timebuf
,
12585 json_object_int_add(json_neigh
,
12586 "bgpTimerUpEstablishedEpoch",
12590 else if (p
->status
== Active
) {
12591 if (CHECK_FLAG(p
->flags
, PEER_FLAG_PASSIVE
))
12592 json_object_string_add(json_neigh
, "bgpStateIs",
12594 else if (CHECK_FLAG(p
->sflags
, PEER_STATUS_NSF_WAIT
))
12595 json_object_string_add(json_neigh
, "bgpStateIs",
12603 uptime
= bgp_clock();
12604 uptime
-= p
->readtime
;
12605 gmtime_r(&uptime
, &tm
);
12607 json_object_int_add(json_neigh
, "bgpTimerLastRead",
12608 (tm
.tm_sec
* 1000) + (tm
.tm_min
* 60000)
12609 + (tm
.tm_hour
* 3600000));
12611 uptime
= bgp_clock();
12612 uptime
-= p
->last_write
;
12613 gmtime_r(&uptime
, &tm
);
12615 json_object_int_add(json_neigh
, "bgpTimerLastWrite",
12616 (tm
.tm_sec
* 1000) + (tm
.tm_min
* 60000)
12617 + (tm
.tm_hour
* 3600000));
12619 uptime
= bgp_clock();
12620 uptime
-= p
->update_time
;
12621 gmtime_r(&uptime
, &tm
);
12623 json_object_int_add(json_neigh
, "bgpInUpdateElapsedTimeMsecs",
12624 (tm
.tm_sec
* 1000) + (tm
.tm_min
* 60000)
12625 + (tm
.tm_hour
* 3600000));
12627 /* Configured timer values. */
12628 json_object_int_add(json_neigh
, "bgpTimerHoldTimeMsecs",
12629 p
->v_holdtime
* 1000);
12630 json_object_int_add(json_neigh
,
12631 "bgpTimerKeepAliveIntervalMsecs",
12632 p
->v_keepalive
* 1000);
12633 if (CHECK_FLAG(p
->flags
, PEER_FLAG_TIMER_DELAYOPEN
)) {
12634 json_object_int_add(json_neigh
,
12635 "bgpTimerDelayOpenTimeMsecs",
12636 p
->v_delayopen
* 1000);
12639 /* Configured and Synced tcp-mss value for peer */
12640 if (CHECK_FLAG(p
->flags
, PEER_FLAG_TCP_MSS
)) {
12641 sync_tcp_mss
= sockopt_tcp_mss_get(p
->fd
);
12642 json_object_int_add(json_neigh
, "bgpTcpMssConfigured",
12644 json_object_int_add(json_neigh
, "bgpTcpMssSynced",
12648 if (CHECK_FLAG(p
->flags
, PEER_FLAG_TIMER
)) {
12649 json_object_int_add(json_neigh
,
12650 "bgpTimerConfiguredHoldTimeMsecs",
12651 p
->holdtime
* 1000);
12652 json_object_int_add(
12654 "bgpTimerConfiguredKeepAliveIntervalMsecs",
12655 p
->keepalive
* 1000);
12656 } else if ((bgp
->default_holdtime
!= SAVE_BGP_HOLDTIME
)
12657 || (bgp
->default_keepalive
!= SAVE_BGP_KEEPALIVE
)) {
12658 json_object_int_add(json_neigh
,
12659 "bgpTimerConfiguredHoldTimeMsecs",
12660 bgp
->default_holdtime
);
12661 json_object_int_add(
12663 "bgpTimerConfiguredKeepAliveIntervalMsecs",
12664 bgp
->default_keepalive
);
12667 /* Extended Optional Parameters Length for BGP OPEN Message */
12668 if (BGP_OPEN_EXT_OPT_PARAMS_CAPABLE(p
))
12669 json_object_boolean_true_add(
12670 json_neigh
, "extendedOptionalParametersLength");
12672 json_object_boolean_false_add(
12673 json_neigh
, "extendedOptionalParametersLength");
12675 /* Conditional advertisements */
12676 json_object_int_add(
12678 "bgpTimerConfiguredConditionalAdvertisementsSec",
12679 bgp
->condition_check_period
);
12680 if (thread_is_scheduled(bgp
->t_condition_check
))
12681 json_object_int_add(
12683 "bgpTimerUntilConditionalAdvertisementsSec",
12684 thread_timer_remain_second(
12685 bgp
->t_condition_check
));
12687 /* Administrative shutdown. */
12688 if (CHECK_FLAG(p
->flags
, PEER_FLAG_SHUTDOWN
)
12689 || CHECK_FLAG(p
->bgp
->flags
, BGP_FLAG_SHUTDOWN
))
12690 vty_out(vty
, " Administratively shut down\n");
12693 vty_out(vty
, " BGP version 4");
12694 vty_out(vty
, ", remote router ID %s",
12695 inet_ntop(AF_INET
, &p
->remote_id
, buf1
, sizeof(buf1
)));
12696 vty_out(vty
, ", local router ID %s\n",
12697 inet_ntop(AF_INET
, &bgp
->router_id
, buf1
,
12700 /* Confederation */
12701 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
)
12702 && bgp_confederation_peers_check(bgp
, p
->as
))
12704 " Neighbor under common administration\n");
12707 vty_out(vty
, " BGP state = %s",
12708 lookup_msg(bgp_status_msg
, p
->status
, NULL
));
12710 if (peer_established(p
))
12711 vty_out(vty
, ", up for %8s",
12712 peer_uptime(p
->uptime
, timebuf
, BGP_UPTIME_LEN
,
12715 else if (p
->status
== Active
) {
12716 if (CHECK_FLAG(p
->flags
, PEER_FLAG_PASSIVE
))
12717 vty_out(vty
, " (passive)");
12718 else if (CHECK_FLAG(p
->sflags
, PEER_STATUS_NSF_WAIT
))
12719 vty_out(vty
, " (NSF passive)");
12721 vty_out(vty
, "\n");
12724 vty_out(vty
, " Last read %s",
12725 peer_uptime(p
->readtime
, timebuf
, BGP_UPTIME_LEN
, 0,
12727 vty_out(vty
, ", Last write %s\n",
12728 peer_uptime(p
->last_write
, timebuf
, BGP_UPTIME_LEN
, 0,
12731 /* Configured timer values. */
12733 " Hold time is %d, keepalive interval is %d seconds\n",
12734 p
->v_holdtime
, p
->v_keepalive
);
12735 if (CHECK_FLAG(p
->flags
, PEER_FLAG_TIMER
)) {
12736 vty_out(vty
, " Configured hold time is %d",
12738 vty_out(vty
, ", keepalive interval is %d seconds\n",
12740 } else if ((bgp
->default_holdtime
!= SAVE_BGP_HOLDTIME
)
12741 || (bgp
->default_keepalive
!= SAVE_BGP_KEEPALIVE
)) {
12742 vty_out(vty
, " Configured hold time is %d",
12743 bgp
->default_holdtime
);
12744 vty_out(vty
, ", keepalive interval is %d seconds\n",
12745 bgp
->default_keepalive
);
12747 if (CHECK_FLAG(p
->flags
, PEER_FLAG_TIMER_DELAYOPEN
))
12749 " Configured DelayOpenTime is %d seconds\n",
12752 /* Configured and synced tcp-mss value for peer */
12753 if (CHECK_FLAG(p
->flags
, PEER_FLAG_TCP_MSS
)) {
12754 sync_tcp_mss
= sockopt_tcp_mss_get(p
->fd
);
12755 vty_out(vty
, " Configured tcp-mss is %d", p
->tcp_mss
);
12756 vty_out(vty
, ", synced tcp-mss is %d\n", sync_tcp_mss
);
12759 /* Extended Optional Parameters Length for BGP OPEN Message */
12760 if (BGP_OPEN_EXT_OPT_PARAMS_CAPABLE(p
))
12762 " Extended Optional Parameters Length is enabled\n");
12764 /* Conditional advertisements */
12766 " Configured conditional advertisements interval is %d seconds\n",
12767 bgp
->condition_check_period
);
12768 if (thread_is_scheduled(bgp
->t_condition_check
))
12770 " Time until conditional advertisements begin is %lu seconds\n",
12771 thread_timer_remain_second(
12772 bgp
->t_condition_check
));
12775 if (peer_established(p
) &&
12776 (p
->cap
|| peer_afc_advertised(p
) || peer_afc_received(p
))) {
12778 json_object
*json_cap
= NULL
;
12780 json_cap
= json_object_new_object();
12783 if (CHECK_FLAG(p
->cap
, PEER_CAP_AS4_RCV
) ||
12784 CHECK_FLAG(p
->cap
, PEER_CAP_AS4_ADV
)) {
12785 if (CHECK_FLAG(p
->cap
, PEER_CAP_AS4_ADV
) &&
12786 CHECK_FLAG(p
->cap
, PEER_CAP_AS4_RCV
))
12787 json_object_string_add(
12788 json_cap
, "4byteAs",
12789 "advertisedAndReceived");
12790 else if (CHECK_FLAG(p
->cap
, PEER_CAP_AS4_ADV
))
12791 json_object_string_add(json_cap
,
12794 else if (CHECK_FLAG(p
->cap
, PEER_CAP_AS4_RCV
))
12795 json_object_string_add(json_cap
,
12800 /* Extended Message Support */
12801 if (CHECK_FLAG(p
->cap
, PEER_CAP_EXTENDED_MESSAGE_ADV
) &&
12802 CHECK_FLAG(p
->cap
, PEER_CAP_EXTENDED_MESSAGE_RCV
))
12803 json_object_string_add(json_cap
,
12805 "advertisedAndReceived");
12806 else if (CHECK_FLAG(p
->cap
,
12807 PEER_CAP_EXTENDED_MESSAGE_ADV
))
12808 json_object_string_add(json_cap
,
12811 else if (CHECK_FLAG(p
->cap
,
12812 PEER_CAP_EXTENDED_MESSAGE_RCV
))
12813 json_object_string_add(json_cap
,
12818 if (CHECK_FLAG(p
->cap
, PEER_CAP_ADDPATH_RCV
) ||
12819 CHECK_FLAG(p
->cap
, PEER_CAP_ADDPATH_ADV
)) {
12820 json_object
*json_add
= NULL
;
12821 const char *print_store
;
12823 json_add
= json_object_new_object();
12825 FOREACH_AFI_SAFI (afi
, safi
) {
12826 json_object
*json_sub
= NULL
;
12827 json_sub
= json_object_new_object();
12828 print_store
= get_afi_safi_str(
12832 p
->af_cap
[afi
][safi
],
12833 PEER_CAP_ADDPATH_AF_TX_ADV
) ||
12835 p
->af_cap
[afi
][safi
],
12836 PEER_CAP_ADDPATH_AF_TX_RCV
)) {
12840 PEER_CAP_ADDPATH_AF_TX_ADV
) &&
12844 PEER_CAP_ADDPATH_AF_TX_RCV
))
12845 json_object_boolean_true_add(
12847 "txAdvertisedAndReceived");
12852 PEER_CAP_ADDPATH_AF_TX_ADV
))
12853 json_object_boolean_true_add(
12860 PEER_CAP_ADDPATH_AF_TX_RCV
))
12861 json_object_boolean_true_add(
12867 p
->af_cap
[afi
][safi
],
12868 PEER_CAP_ADDPATH_AF_RX_ADV
) ||
12870 p
->af_cap
[afi
][safi
],
12871 PEER_CAP_ADDPATH_AF_RX_RCV
)) {
12875 PEER_CAP_ADDPATH_AF_RX_ADV
) &&
12879 PEER_CAP_ADDPATH_AF_RX_RCV
))
12880 json_object_boolean_true_add(
12882 "rxAdvertisedAndReceived");
12887 PEER_CAP_ADDPATH_AF_RX_ADV
))
12888 json_object_boolean_true_add(
12895 PEER_CAP_ADDPATH_AF_RX_RCV
))
12896 json_object_boolean_true_add(
12902 p
->af_cap
[afi
][safi
],
12903 PEER_CAP_ADDPATH_AF_TX_ADV
) ||
12905 p
->af_cap
[afi
][safi
],
12906 PEER_CAP_ADDPATH_AF_TX_RCV
) ||
12908 p
->af_cap
[afi
][safi
],
12909 PEER_CAP_ADDPATH_AF_RX_ADV
) ||
12911 p
->af_cap
[afi
][safi
],
12912 PEER_CAP_ADDPATH_AF_RX_RCV
))
12913 json_object_object_add(
12914 json_add
, print_store
,
12917 json_object_free(json_sub
);
12920 json_object_object_add(json_cap
, "addPath",
12925 if (CHECK_FLAG(p
->cap
, PEER_CAP_DYNAMIC_RCV
) ||
12926 CHECK_FLAG(p
->cap
, PEER_CAP_DYNAMIC_ADV
)) {
12927 if (CHECK_FLAG(p
->cap
, PEER_CAP_DYNAMIC_ADV
) &&
12928 CHECK_FLAG(p
->cap
, PEER_CAP_DYNAMIC_RCV
))
12929 json_object_string_add(
12930 json_cap
, "dynamic",
12931 "advertisedAndReceived");
12932 else if (CHECK_FLAG(p
->cap
,
12933 PEER_CAP_DYNAMIC_ADV
))
12934 json_object_string_add(json_cap
,
12937 else if (CHECK_FLAG(p
->cap
,
12938 PEER_CAP_DYNAMIC_RCV
))
12939 json_object_string_add(json_cap
,
12944 /* Extended nexthop */
12945 if (CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_RCV
) ||
12946 CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_ADV
)) {
12947 json_object
*json_nxt
= NULL
;
12948 const char *print_store
;
12951 if (CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_ADV
) &&
12952 CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_RCV
))
12953 json_object_string_add(
12954 json_cap
, "extendedNexthop",
12955 "advertisedAndReceived");
12956 else if (CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_ADV
))
12957 json_object_string_add(
12958 json_cap
, "extendedNexthop",
12960 else if (CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_RCV
))
12961 json_object_string_add(
12962 json_cap
, "extendedNexthop",
12965 if (CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_RCV
)) {
12966 json_nxt
= json_object_new_object();
12968 for (safi
= SAFI_UNICAST
;
12969 safi
< SAFI_MAX
; safi
++) {
12973 PEER_CAP_ENHE_AF_RCV
)) {
12979 json_object_string_add(
12982 "recieved"); /* misspelled for compatibility */
12985 json_object_object_add(
12987 "extendedNexthopFamililesByPeer",
12992 /* Long-lived Graceful Restart */
12993 if (CHECK_FLAG(p
->cap
, PEER_CAP_LLGR_RCV
) ||
12994 CHECK_FLAG(p
->cap
, PEER_CAP_LLGR_ADV
)) {
12995 json_object
*json_llgr
= NULL
;
12996 const char *afi_safi_str
;
12998 if (CHECK_FLAG(p
->cap
, PEER_CAP_LLGR_ADV
) &&
12999 CHECK_FLAG(p
->cap
, PEER_CAP_LLGR_RCV
))
13000 json_object_string_add(
13002 "longLivedGracefulRestart",
13003 "advertisedAndReceived");
13004 else if (CHECK_FLAG(p
->cap
, PEER_CAP_LLGR_ADV
))
13005 json_object_string_add(
13007 "longLivedGracefulRestart",
13009 else if (CHECK_FLAG(p
->cap
, PEER_CAP_LLGR_RCV
))
13010 json_object_string_add(
13012 "longLivedGracefulRestart",
13015 if (CHECK_FLAG(p
->cap
, PEER_CAP_LLGR_RCV
)) {
13016 json_llgr
= json_object_new_object();
13018 FOREACH_AFI_SAFI (afi
, safi
) {
13022 PEER_CAP_ENHE_AF_RCV
)) {
13028 json_object_string_add(
13034 json_object_object_add(
13036 "longLivedGracefulRestartByPeer",
13041 /* Route Refresh */
13042 if (CHECK_FLAG(p
->cap
, PEER_CAP_REFRESH_ADV
) ||
13043 CHECK_FLAG(p
->cap
, PEER_CAP_REFRESH_NEW_RCV
) ||
13044 CHECK_FLAG(p
->cap
, PEER_CAP_REFRESH_OLD_RCV
)) {
13045 if (CHECK_FLAG(p
->cap
, PEER_CAP_REFRESH_ADV
) &&
13046 (CHECK_FLAG(p
->cap
,
13047 PEER_CAP_REFRESH_NEW_RCV
) ||
13049 PEER_CAP_REFRESH_OLD_RCV
))) {
13052 PEER_CAP_REFRESH_OLD_RCV
) &&
13055 PEER_CAP_REFRESH_NEW_RCV
))
13056 json_object_string_add(
13059 "advertisedAndReceivedOldNew");
13063 PEER_CAP_REFRESH_OLD_RCV
))
13064 json_object_string_add(
13067 "advertisedAndReceivedOld");
13069 json_object_string_add(
13072 "advertisedAndReceivedNew");
13074 } else if (CHECK_FLAG(p
->cap
,
13075 PEER_CAP_REFRESH_ADV
))
13076 json_object_string_add(json_cap
,
13079 else if (CHECK_FLAG(p
->cap
,
13080 PEER_CAP_REFRESH_NEW_RCV
) ||
13082 PEER_CAP_REFRESH_OLD_RCV
))
13083 json_object_string_add(json_cap
,
13088 /* Enhanced Route Refresh */
13089 if (CHECK_FLAG(p
->cap
, PEER_CAP_ENHANCED_RR_ADV
) ||
13090 CHECK_FLAG(p
->cap
, PEER_CAP_ENHANCED_RR_RCV
)) {
13091 if (CHECK_FLAG(p
->cap
,
13092 PEER_CAP_ENHANCED_RR_ADV
) &&
13094 PEER_CAP_ENHANCED_RR_RCV
))
13095 json_object_string_add(
13097 "enhancedRouteRefresh",
13098 "advertisedAndReceived");
13099 else if (CHECK_FLAG(p
->cap
,
13100 PEER_CAP_ENHANCED_RR_ADV
))
13101 json_object_string_add(
13103 "enhancedRouteRefresh",
13105 else if (CHECK_FLAG(p
->cap
,
13106 PEER_CAP_ENHANCED_RR_RCV
))
13107 json_object_string_add(
13109 "enhancedRouteRefresh",
13113 /* Multiprotocol Extensions */
13114 json_object
*json_multi
= NULL
;
13116 json_multi
= json_object_new_object();
13118 FOREACH_AFI_SAFI (afi
, safi
) {
13119 if (p
->afc_adv
[afi
][safi
] ||
13120 p
->afc_recv
[afi
][safi
]) {
13121 json_object
*json_exten
= NULL
;
13122 json_exten
= json_object_new_object();
13124 if (p
->afc_adv
[afi
][safi
] &&
13125 p
->afc_recv
[afi
][safi
])
13126 json_object_boolean_true_add(
13128 "advertisedAndReceived");
13129 else if (p
->afc_adv
[afi
][safi
])
13130 json_object_boolean_true_add(
13133 else if (p
->afc_recv
[afi
][safi
])
13134 json_object_boolean_true_add(
13135 json_exten
, "received");
13137 json_object_object_add(
13139 get_afi_safi_str(afi
, safi
,
13144 json_object_object_add(json_cap
,
13145 "multiprotocolExtensions",
13148 /* Hostname capabilities */
13149 json_object
*json_hname
= NULL
;
13151 json_hname
= json_object_new_object();
13153 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_ADV
)) {
13154 json_object_string_add(
13155 json_hname
, "advHostName",
13156 bgp
->peer_self
->hostname
13157 ? bgp
->peer_self
->hostname
13159 json_object_string_add(
13160 json_hname
, "advDomainName",
13161 bgp
->peer_self
->domainname
13162 ? bgp
->peer_self
->domainname
13167 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_RCV
)) {
13168 json_object_string_add(
13169 json_hname
, "rcvHostName",
13170 p
->hostname
? p
->hostname
: "n/a");
13171 json_object_string_add(
13172 json_hname
, "rcvDomainName",
13173 p
->domainname
? p
->domainname
: "n/a");
13176 json_object_object_add(json_cap
, "hostName",
13179 /* Graceful Restart */
13180 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
) ||
13181 CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_ADV
)) {
13182 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_ADV
) &&
13183 CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
))
13184 json_object_string_add(
13185 json_cap
, "gracefulRestart",
13186 "advertisedAndReceived");
13187 else if (CHECK_FLAG(p
->cap
,
13188 PEER_CAP_RESTART_ADV
))
13189 json_object_string_add(
13191 "gracefulRestartCapability",
13193 else if (CHECK_FLAG(p
->cap
,
13194 PEER_CAP_RESTART_RCV
))
13195 json_object_string_add(
13197 "gracefulRestartCapability",
13200 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
)) {
13201 int restart_af_count
= 0;
13202 json_object
*json_restart
= NULL
;
13203 json_restart
= json_object_new_object();
13205 json_object_int_add(
13207 "gracefulRestartRemoteTimerMsecs",
13208 p
->v_gr_restart
* 1000);
13210 FOREACH_AFI_SAFI (afi
, safi
) {
13214 PEER_CAP_RESTART_AF_RCV
)) {
13215 json_object
*json_sub
=
13218 json_object_new_object();
13224 PEER_CAP_RESTART_AF_PRESERVE_RCV
))
13225 json_object_boolean_true_add(
13228 restart_af_count
++;
13229 json_object_object_add(
13238 if (!restart_af_count
) {
13239 json_object_string_add(
13241 "addressFamiliesByPeer",
13243 json_object_free(json_restart
);
13245 json_object_object_add(
13247 "addressFamiliesByPeer",
13251 json_object_object_add(
13252 json_neigh
, "neighborCapabilities", json_cap
);
13254 vty_out(vty
, " Neighbor capabilities:\n");
13257 if (CHECK_FLAG(p
->cap
, PEER_CAP_AS4_RCV
) ||
13258 CHECK_FLAG(p
->cap
, PEER_CAP_AS4_ADV
)) {
13259 vty_out(vty
, " 4 Byte AS:");
13260 if (CHECK_FLAG(p
->cap
, PEER_CAP_AS4_ADV
))
13261 vty_out(vty
, " advertised");
13262 if (CHECK_FLAG(p
->cap
, PEER_CAP_AS4_RCV
))
13263 vty_out(vty
, " %sreceived",
13268 vty_out(vty
, "\n");
13271 /* Extended Message Support */
13272 if (CHECK_FLAG(p
->cap
, PEER_CAP_EXTENDED_MESSAGE_RCV
) ||
13273 CHECK_FLAG(p
->cap
, PEER_CAP_EXTENDED_MESSAGE_ADV
)) {
13274 vty_out(vty
, " Extended Message:");
13275 if (CHECK_FLAG(p
->cap
,
13276 PEER_CAP_EXTENDED_MESSAGE_ADV
))
13277 vty_out(vty
, " advertised");
13278 if (CHECK_FLAG(p
->cap
,
13279 PEER_CAP_EXTENDED_MESSAGE_RCV
))
13280 vty_out(vty
, " %sreceived",
13283 PEER_CAP_EXTENDED_MESSAGE_ADV
)
13286 vty_out(vty
, "\n");
13290 if (CHECK_FLAG(p
->cap
, PEER_CAP_ADDPATH_RCV
) ||
13291 CHECK_FLAG(p
->cap
, PEER_CAP_ADDPATH_ADV
)) {
13292 vty_out(vty
, " AddPath:\n");
13294 FOREACH_AFI_SAFI (afi
, safi
) {
13296 p
->af_cap
[afi
][safi
],
13297 PEER_CAP_ADDPATH_AF_TX_ADV
) ||
13299 p
->af_cap
[afi
][safi
],
13300 PEER_CAP_ADDPATH_AF_TX_RCV
)) {
13301 vty_out(vty
, " %s: TX ",
13309 PEER_CAP_ADDPATH_AF_TX_ADV
))
13316 PEER_CAP_ADDPATH_AF_TX_RCV
))
13323 PEER_CAP_ADDPATH_AF_TX_ADV
)
13327 vty_out(vty
, "\n");
13331 p
->af_cap
[afi
][safi
],
13332 PEER_CAP_ADDPATH_AF_RX_ADV
) ||
13334 p
->af_cap
[afi
][safi
],
13335 PEER_CAP_ADDPATH_AF_RX_RCV
)) {
13336 vty_out(vty
, " %s: RX ",
13344 PEER_CAP_ADDPATH_AF_RX_ADV
))
13351 PEER_CAP_ADDPATH_AF_RX_RCV
))
13358 PEER_CAP_ADDPATH_AF_RX_ADV
)
13362 vty_out(vty
, "\n");
13368 if (CHECK_FLAG(p
->cap
, PEER_CAP_DYNAMIC_RCV
) ||
13369 CHECK_FLAG(p
->cap
, PEER_CAP_DYNAMIC_ADV
)) {
13370 vty_out(vty
, " Dynamic:");
13371 if (CHECK_FLAG(p
->cap
, PEER_CAP_DYNAMIC_ADV
))
13372 vty_out(vty
, " advertised");
13373 if (CHECK_FLAG(p
->cap
, PEER_CAP_DYNAMIC_RCV
))
13374 vty_out(vty
, " %sreceived",
13376 PEER_CAP_DYNAMIC_ADV
)
13379 vty_out(vty
, "\n");
13382 /* Extended nexthop */
13383 if (CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_RCV
) ||
13384 CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_ADV
)) {
13385 vty_out(vty
, " Extended nexthop:");
13386 if (CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_ADV
))
13387 vty_out(vty
, " advertised");
13388 if (CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_RCV
))
13389 vty_out(vty
, " %sreceived",
13394 vty_out(vty
, "\n");
13396 if (CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_RCV
)) {
13398 " Address families by peer:\n ");
13399 for (safi
= SAFI_UNICAST
;
13400 safi
< SAFI_MAX
; safi
++)
13404 PEER_CAP_ENHE_AF_RCV
))
13414 /* Long-lived Graceful Restart */
13415 if (CHECK_FLAG(p
->cap
, PEER_CAP_LLGR_RCV
) ||
13416 CHECK_FLAG(p
->cap
, PEER_CAP_LLGR_ADV
)) {
13418 " Long-lived Graceful Restart:");
13419 if (CHECK_FLAG(p
->cap
, PEER_CAP_LLGR_ADV
))
13420 vty_out(vty
, " advertised");
13421 if (CHECK_FLAG(p
->cap
, PEER_CAP_LLGR_RCV
))
13422 vty_out(vty
, " %sreceived",
13427 vty_out(vty
, "\n");
13429 if (CHECK_FLAG(p
->cap
, PEER_CAP_LLGR_RCV
)) {
13431 " Address families by peer:\n");
13432 FOREACH_AFI_SAFI (afi
, safi
)
13436 PEER_CAP_LLGR_AF_RCV
))
13446 /* Route Refresh */
13447 if (CHECK_FLAG(p
->cap
, PEER_CAP_REFRESH_ADV
) ||
13448 CHECK_FLAG(p
->cap
, PEER_CAP_REFRESH_NEW_RCV
) ||
13449 CHECK_FLAG(p
->cap
, PEER_CAP_REFRESH_OLD_RCV
)) {
13450 vty_out(vty
, " Route refresh:");
13451 if (CHECK_FLAG(p
->cap
, PEER_CAP_REFRESH_ADV
))
13452 vty_out(vty
, " advertised");
13453 if (CHECK_FLAG(p
->cap
,
13454 PEER_CAP_REFRESH_NEW_RCV
) ||
13456 PEER_CAP_REFRESH_OLD_RCV
))
13457 vty_out(vty
, " %sreceived(%s)",
13459 PEER_CAP_REFRESH_ADV
)
13464 PEER_CAP_REFRESH_OLD_RCV
) &&
13467 PEER_CAP_REFRESH_NEW_RCV
))
13471 PEER_CAP_REFRESH_OLD_RCV
)
13475 vty_out(vty
, "\n");
13478 /* Enhanced Route Refresh */
13479 if (CHECK_FLAG(p
->cap
, PEER_CAP_ENHANCED_RR_ADV
) ||
13480 CHECK_FLAG(p
->cap
, PEER_CAP_ENHANCED_RR_RCV
)) {
13481 vty_out(vty
, " Enhanced Route Refresh:");
13482 if (CHECK_FLAG(p
->cap
,
13483 PEER_CAP_ENHANCED_RR_ADV
))
13484 vty_out(vty
, " advertised");
13485 if (CHECK_FLAG(p
->cap
,
13486 PEER_CAP_ENHANCED_RR_RCV
))
13487 vty_out(vty
, " %sreceived",
13489 PEER_CAP_REFRESH_ADV
)
13492 vty_out(vty
, "\n");
13495 /* Multiprotocol Extensions */
13496 FOREACH_AFI_SAFI (afi
, safi
)
13497 if (p
->afc_adv
[afi
][safi
] ||
13498 p
->afc_recv
[afi
][safi
]) {
13499 vty_out(vty
, " Address Family %s:",
13500 get_afi_safi_str(afi
, safi
,
13502 if (p
->afc_adv
[afi
][safi
])
13503 vty_out(vty
, " advertised");
13504 if (p
->afc_recv
[afi
][safi
])
13505 vty_out(vty
, " %sreceived",
13506 p
->afc_adv
[afi
][safi
]
13509 vty_out(vty
, "\n");
13512 /* Hostname capability */
13513 vty_out(vty
, " Hostname Capability:");
13515 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_ADV
)) {
13517 " advertised (name: %s,domain name: %s)",
13518 bgp
->peer_self
->hostname
13519 ? bgp
->peer_self
->hostname
13521 bgp
->peer_self
->domainname
13522 ? bgp
->peer_self
->domainname
13525 vty_out(vty
, " not advertised");
13528 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_RCV
)) {
13530 " received (name: %s,domain name: %s)",
13531 p
->hostname
? p
->hostname
: "n/a",
13532 p
->domainname
? p
->domainname
: "n/a");
13534 vty_out(vty
, " not received");
13537 vty_out(vty
, "\n");
13539 /* Graceful Restart */
13540 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
) ||
13541 CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_ADV
)) {
13543 " Graceful Restart Capability:");
13544 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_ADV
))
13545 vty_out(vty
, " advertised");
13546 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
))
13547 vty_out(vty
, " %sreceived",
13549 PEER_CAP_RESTART_ADV
)
13552 vty_out(vty
, "\n");
13554 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
)) {
13555 int restart_af_count
= 0;
13558 " Remote Restart timer is %d seconds\n",
13561 " Address families by peer:\n ");
13563 FOREACH_AFI_SAFI (afi
, safi
)
13567 PEER_CAP_RESTART_AF_RCV
)) {
13568 vty_out(vty
, "%s%s(%s)",
13580 PEER_CAP_RESTART_AF_PRESERVE_RCV
)
13582 : "not preserved");
13583 restart_af_count
++;
13585 if (!restart_af_count
)
13586 vty_out(vty
, "none");
13587 vty_out(vty
, "\n");
13589 } /* Graceful Restart */
13593 /* graceful restart information */
13594 json_object
*json_grace
= NULL
;
13595 json_object
*json_grace_send
= NULL
;
13596 json_object
*json_grace_recv
= NULL
;
13597 int eor_send_af_count
= 0;
13598 int eor_receive_af_count
= 0;
13601 json_grace
= json_object_new_object();
13602 json_grace_send
= json_object_new_object();
13603 json_grace_recv
= json_object_new_object();
13605 if ((peer_established(p
)) &&
13606 CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
)) {
13607 FOREACH_AFI_SAFI (afi
, safi
) {
13608 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
13609 PEER_STATUS_EOR_SEND
)) {
13610 json_object_boolean_true_add(
13612 get_afi_safi_str(afi
, safi
,
13614 eor_send_af_count
++;
13617 FOREACH_AFI_SAFI (afi
, safi
) {
13618 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
13619 PEER_STATUS_EOR_RECEIVED
)) {
13620 json_object_boolean_true_add(
13622 get_afi_safi_str(afi
, safi
,
13624 eor_receive_af_count
++;
13628 json_object_object_add(json_grace
, "endOfRibSend",
13630 json_object_object_add(json_grace
, "endOfRibRecv",
13634 if (p
->t_gr_restart
)
13635 json_object_int_add(
13636 json_grace
, "gracefulRestartTimerMsecs",
13637 thread_timer_remain_second(p
->t_gr_restart
) *
13641 json_object_int_add(
13642 json_grace
, "gracefulStalepathTimerMsecs",
13643 thread_timer_remain_second(p
->t_gr_stale
) *
13645 /* more gr info in new format */
13646 BGP_SHOW_PEER_GR_CAPABILITY(vty
, p
, use_json
, json_grace
);
13647 json_object_object_add(json_neigh
, "gracefulRestartInfo",
13650 vty_out(vty
, " Graceful restart information:\n");
13651 if ((peer_established(p
)) &&
13652 CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
)) {
13654 vty_out(vty
, " End-of-RIB send: ");
13655 FOREACH_AFI_SAFI (afi
, safi
) {
13656 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
13657 PEER_STATUS_EOR_SEND
)) {
13658 vty_out(vty
, "%s%s",
13659 eor_send_af_count
? ", " : "",
13660 get_afi_safi_str(afi
, safi
,
13662 eor_send_af_count
++;
13665 vty_out(vty
, "\n");
13666 vty_out(vty
, " End-of-RIB received: ");
13667 FOREACH_AFI_SAFI (afi
, safi
) {
13668 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
13669 PEER_STATUS_EOR_RECEIVED
)) {
13670 vty_out(vty
, "%s%s",
13671 eor_receive_af_count
? ", "
13673 get_afi_safi_str(afi
, safi
,
13675 eor_receive_af_count
++;
13678 vty_out(vty
, "\n");
13681 if (p
->t_gr_restart
)
13683 " The remaining time of restart timer is %ld\n",
13684 thread_timer_remain_second(p
->t_gr_restart
));
13688 " The remaining time of stalepath timer is %ld\n",
13689 thread_timer_remain_second(p
->t_gr_stale
));
13691 /* more gr info in new format */
13692 BGP_SHOW_PEER_GR_CAPABILITY(vty
, p
, use_json
, NULL
);
13696 json_object
*json_stat
= NULL
;
13697 json_stat
= json_object_new_object();
13698 /* Packet counts. */
13700 atomic_size_t outq_count
, inq_count
;
13701 outq_count
= atomic_load_explicit(&p
->obuf
->count
,
13702 memory_order_relaxed
);
13703 inq_count
= atomic_load_explicit(&p
->ibuf
->count
,
13704 memory_order_relaxed
);
13706 json_object_int_add(json_stat
, "depthInq",
13707 (unsigned long)inq_count
);
13708 json_object_int_add(json_stat
, "depthOutq",
13709 (unsigned long)outq_count
);
13710 json_object_int_add(json_stat
, "opensSent",
13711 atomic_load_explicit(&p
->open_out
,
13712 memory_order_relaxed
));
13713 json_object_int_add(json_stat
, "opensRecv",
13714 atomic_load_explicit(&p
->open_in
,
13715 memory_order_relaxed
));
13716 json_object_int_add(json_stat
, "notificationsSent",
13717 atomic_load_explicit(&p
->notify_out
,
13718 memory_order_relaxed
));
13719 json_object_int_add(json_stat
, "notificationsRecv",
13720 atomic_load_explicit(&p
->notify_in
,
13721 memory_order_relaxed
));
13722 json_object_int_add(json_stat
, "updatesSent",
13723 atomic_load_explicit(&p
->update_out
,
13724 memory_order_relaxed
));
13725 json_object_int_add(json_stat
, "updatesRecv",
13726 atomic_load_explicit(&p
->update_in
,
13727 memory_order_relaxed
));
13728 json_object_int_add(json_stat
, "keepalivesSent",
13729 atomic_load_explicit(&p
->keepalive_out
,
13730 memory_order_relaxed
));
13731 json_object_int_add(json_stat
, "keepalivesRecv",
13732 atomic_load_explicit(&p
->keepalive_in
,
13733 memory_order_relaxed
));
13734 json_object_int_add(json_stat
, "routeRefreshSent",
13735 atomic_load_explicit(&p
->refresh_out
,
13736 memory_order_relaxed
));
13737 json_object_int_add(json_stat
, "routeRefreshRecv",
13738 atomic_load_explicit(&p
->refresh_in
,
13739 memory_order_relaxed
));
13740 json_object_int_add(json_stat
, "capabilitySent",
13741 atomic_load_explicit(&p
->dynamic_cap_out
,
13742 memory_order_relaxed
));
13743 json_object_int_add(json_stat
, "capabilityRecv",
13744 atomic_load_explicit(&p
->dynamic_cap_in
,
13745 memory_order_relaxed
));
13746 json_object_int_add(json_stat
, "totalSent", PEER_TOTAL_TX(p
));
13747 json_object_int_add(json_stat
, "totalRecv", PEER_TOTAL_RX(p
));
13748 json_object_object_add(json_neigh
, "messageStats", json_stat
);
13750 atomic_size_t outq_count
, inq_count
, open_out
, open_in
,
13751 notify_out
, notify_in
, update_out
, update_in
,
13752 keepalive_out
, keepalive_in
, refresh_out
, refresh_in
,
13753 dynamic_cap_out
, dynamic_cap_in
;
13754 outq_count
= atomic_load_explicit(&p
->obuf
->count
,
13755 memory_order_relaxed
);
13756 inq_count
= atomic_load_explicit(&p
->ibuf
->count
,
13757 memory_order_relaxed
);
13758 open_out
= atomic_load_explicit(&p
->open_out
,
13759 memory_order_relaxed
);
13761 atomic_load_explicit(&p
->open_in
, memory_order_relaxed
);
13762 notify_out
= atomic_load_explicit(&p
->notify_out
,
13763 memory_order_relaxed
);
13764 notify_in
= atomic_load_explicit(&p
->notify_in
,
13765 memory_order_relaxed
);
13766 update_out
= atomic_load_explicit(&p
->update_out
,
13767 memory_order_relaxed
);
13768 update_in
= atomic_load_explicit(&p
->update_in
,
13769 memory_order_relaxed
);
13770 keepalive_out
= atomic_load_explicit(&p
->keepalive_out
,
13771 memory_order_relaxed
);
13772 keepalive_in
= atomic_load_explicit(&p
->keepalive_in
,
13773 memory_order_relaxed
);
13774 refresh_out
= atomic_load_explicit(&p
->refresh_out
,
13775 memory_order_relaxed
);
13776 refresh_in
= atomic_load_explicit(&p
->refresh_in
,
13777 memory_order_relaxed
);
13778 dynamic_cap_out
= atomic_load_explicit(&p
->dynamic_cap_out
,
13779 memory_order_relaxed
);
13780 dynamic_cap_in
= atomic_load_explicit(&p
->dynamic_cap_in
,
13781 memory_order_relaxed
);
13783 /* Packet counts. */
13784 vty_out(vty
, " Message statistics:\n");
13785 vty_out(vty
, " Inq depth is %zu\n", inq_count
);
13786 vty_out(vty
, " Outq depth is %zu\n", outq_count
);
13787 vty_out(vty
, " Sent Rcvd\n");
13788 vty_out(vty
, " Opens: %10zu %10zu\n", open_out
,
13790 vty_out(vty
, " Notifications: %10zu %10zu\n", notify_out
,
13792 vty_out(vty
, " Updates: %10zu %10zu\n", update_out
,
13794 vty_out(vty
, " Keepalives: %10zu %10zu\n", keepalive_out
,
13796 vty_out(vty
, " Route Refresh: %10zu %10zu\n", refresh_out
,
13798 vty_out(vty
, " Capability: %10zu %10zu\n",
13799 dynamic_cap_out
, dynamic_cap_in
);
13800 vty_out(vty
, " Total: %10u %10u\n",
13801 (uint32_t)PEER_TOTAL_TX(p
), (uint32_t)PEER_TOTAL_RX(p
));
13805 /* advertisement-interval */
13806 json_object_int_add(json_neigh
,
13807 "minBtwnAdvertisementRunsTimerMsecs",
13808 p
->v_routeadv
* 1000);
13810 /* Update-source. */
13811 if (p
->update_if
|| p
->update_source
) {
13813 json_object_string_add(json_neigh
,
13816 else if (p
->update_source
)
13817 json_object_string_add(
13818 json_neigh
, "updateSource",
13819 sockunion2str(p
->update_source
, buf1
,
13823 /* advertisement-interval */
13825 " Minimum time between advertisement runs is %d seconds\n",
13828 /* Update-source. */
13829 if (p
->update_if
|| p
->update_source
) {
13830 vty_out(vty
, " Update source is ");
13832 vty_out(vty
, "%s", p
->update_if
);
13833 else if (p
->update_source
)
13835 sockunion2str(p
->update_source
, buf1
,
13837 vty_out(vty
, "\n");
13840 vty_out(vty
, "\n");
13843 /* Address Family Information */
13844 json_object
*json_hold
= NULL
;
13847 json_hold
= json_object_new_object();
13849 FOREACH_AFI_SAFI (afi
, safi
)
13850 if (p
->afc
[afi
][safi
])
13851 bgp_show_peer_afi(vty
, p
, afi
, safi
, use_json
,
13855 json_object_object_add(json_neigh
, "addressFamilyInfo",
13857 json_object_int_add(json_neigh
, "connectionsEstablished",
13859 json_object_int_add(json_neigh
, "connectionsDropped",
13862 vty_out(vty
, " Connections established %d; dropped %d\n",
13863 p
->established
, p
->dropped
);
13865 if (!p
->last_reset
) {
13867 json_object_string_add(json_neigh
, "lastReset",
13870 vty_out(vty
, " Last reset never\n");
13876 uptime
= bgp_clock();
13877 uptime
-= p
->resettime
;
13878 gmtime_r(&uptime
, &tm
);
13880 json_object_int_add(json_neigh
, "lastResetTimerMsecs",
13882 + (tm
.tm_min
* 60000)
13883 + (tm
.tm_hour
* 3600000));
13884 bgp_show_peer_reset(NULL
, p
, json_neigh
, true);
13886 vty_out(vty
, " Last reset %s, ",
13887 peer_uptime(p
->resettime
, timebuf
,
13888 BGP_UPTIME_LEN
, 0, NULL
));
13890 bgp_show_peer_reset(vty
, p
, NULL
, false);
13891 if (p
->last_reset_cause_size
) {
13892 msg
= p
->last_reset_cause
;
13894 " Message received that caused BGP to send a NOTIFICATION:\n ");
13895 for (i
= 1; i
<= p
->last_reset_cause_size
;
13897 vty_out(vty
, "%02X", *msg
++);
13899 if (i
!= p
->last_reset_cause_size
) {
13901 vty_out(vty
, "\n ");
13902 } else if (i
% 4 == 0) {
13907 vty_out(vty
, "\n");
13912 if (CHECK_FLAG(p
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
)) {
13914 json_object_boolean_true_add(json_neigh
,
13915 "prefixesConfigExceedMax");
13918 " Peer had exceeded the max. no. of prefixes configured.\n");
13920 if (p
->t_pmax_restart
) {
13922 json_object_boolean_true_add(
13923 json_neigh
, "reducePrefixNumFrom");
13924 json_object_int_add(json_neigh
,
13925 "restartInTimerMsec",
13926 thread_timer_remain_second(
13931 " Reduce the no. of prefix from %s, will restart in %ld seconds\n",
13932 p
->host
, thread_timer_remain_second(
13933 p
->t_pmax_restart
));
13936 json_object_boolean_true_add(
13938 "reducePrefixNumAndClearIpBgp");
13941 " Reduce the no. of prefix and clear ip bgp %s to restore peering\n",
13946 /* EBGP Multihop and GTSM */
13947 if (p
->sort
!= BGP_PEER_IBGP
) {
13949 if (p
->gtsm_hops
> BGP_GTSM_HOPS_DISABLED
)
13950 json_object_int_add(json_neigh
,
13951 "externalBgpNbrMaxHopsAway",
13954 json_object_int_add(json_neigh
,
13955 "externalBgpNbrMaxHopsAway",
13958 if (p
->gtsm_hops
> BGP_GTSM_HOPS_DISABLED
)
13960 " External BGP neighbor may be up to %d hops away.\n",
13964 " External BGP neighbor may be up to %d hops away.\n",
13969 if (p
->gtsm_hops
> BGP_GTSM_HOPS_DISABLED
)
13970 json_object_int_add(json_neigh
,
13971 "internalBgpNbrMaxHopsAway",
13974 json_object_int_add(json_neigh
,
13975 "internalBgpNbrMaxHopsAway",
13978 if (p
->gtsm_hops
> BGP_GTSM_HOPS_DISABLED
)
13980 " Internal BGP neighbor may be up to %d hops away.\n",
13984 " Internal BGP neighbor may be up to %d hops away.\n",
13989 /* Local address. */
13992 json_object_string_add(json_neigh
, "hostLocal",
13993 sockunion2str(p
->su_local
, buf1
,
13995 json_object_int_add(json_neigh
, "portLocal",
13996 ntohs(p
->su_local
->sin
.sin_port
));
13998 vty_out(vty
, "Local host: %s, Local port: %d\n",
13999 sockunion2str(p
->su_local
, buf1
, SU_ADDRSTRLEN
),
14000 ntohs(p
->su_local
->sin
.sin_port
));
14003 /* Remote address. */
14004 if (p
->su_remote
) {
14006 json_object_string_add(json_neigh
, "hostForeign",
14007 sockunion2str(p
->su_remote
, buf1
,
14009 json_object_int_add(json_neigh
, "portForeign",
14010 ntohs(p
->su_remote
->sin
.sin_port
));
14012 vty_out(vty
, "Foreign host: %s, Foreign port: %d\n",
14013 sockunion2str(p
->su_remote
, buf1
,
14015 ntohs(p
->su_remote
->sin
.sin_port
));
14018 /* Nexthop display. */
14021 json_object_string_addf(json_neigh
, "nexthop", "%pI4",
14023 json_object_string_addf(json_neigh
, "nexthopGlobal",
14024 "%pI6", &p
->nexthop
.v6_global
);
14025 json_object_string_addf(json_neigh
, "nexthopLocal",
14026 "%pI6", &p
->nexthop
.v6_local
);
14027 if (p
->shared_network
)
14028 json_object_string_add(json_neigh
,
14032 json_object_string_add(json_neigh
,
14034 "nonSharedNetwork");
14036 vty_out(vty
, "Nexthop: %s\n",
14037 inet_ntop(AF_INET
, &p
->nexthop
.v4
, buf1
,
14039 vty_out(vty
, "Nexthop global: %s\n",
14040 inet_ntop(AF_INET6
, &p
->nexthop
.v6_global
, buf1
,
14042 vty_out(vty
, "Nexthop local: %s\n",
14043 inet_ntop(AF_INET6
, &p
->nexthop
.v6_local
, buf1
,
14045 vty_out(vty
, "BGP connection: %s\n",
14046 p
->shared_network
? "shared network"
14047 : "non shared network");
14051 /* Timer information. */
14053 json_object_int_add(json_neigh
, "connectRetryTimer",
14055 if (peer_established(p
) && p
->rtt
)
14056 json_object_int_add(json_neigh
, "estimatedRttInMsecs",
14059 json_object_int_add(
14060 json_neigh
, "nextStartTimerDueInMsecs",
14061 thread_timer_remain_second(p
->t_start
) * 1000);
14063 json_object_int_add(
14064 json_neigh
, "nextConnectTimerDueInMsecs",
14065 thread_timer_remain_second(p
->t_connect
)
14067 if (p
->t_routeadv
) {
14068 json_object_int_add(json_neigh
, "mraiInterval",
14070 json_object_int_add(
14071 json_neigh
, "mraiTimerExpireInMsecs",
14072 thread_timer_remain_second(p
->t_routeadv
)
14076 json_object_int_add(json_neigh
, "authenticationEnabled",
14080 json_object_string_add(json_neigh
, "readThread", "on");
14082 json_object_string_add(json_neigh
, "readThread", "off");
14084 if (CHECK_FLAG(p
->thread_flags
, PEER_THREAD_WRITES_ON
))
14085 json_object_string_add(json_neigh
, "writeThread", "on");
14087 json_object_string_add(json_neigh
, "writeThread",
14090 vty_out(vty
, "BGP Connect Retry Timer in Seconds: %d\n",
14092 if (peer_established(p
) && p
->rtt
)
14093 vty_out(vty
, "Estimated round trip time: %d ms\n",
14096 vty_out(vty
, "Next start timer due in %ld seconds\n",
14097 thread_timer_remain_second(p
->t_start
));
14099 vty_out(vty
, "Next connect timer due in %ld seconds\n",
14100 thread_timer_remain_second(p
->t_connect
));
14103 "MRAI (interval %u) timer expires in %ld seconds\n",
14105 thread_timer_remain_second(p
->t_routeadv
));
14107 vty_out(vty
, "Peer Authentication Enabled\n");
14109 vty_out(vty
, "Read thread: %s Write thread: %s FD used: %d\n",
14110 p
->t_read
? "on" : "off",
14111 CHECK_FLAG(p
->thread_flags
, PEER_THREAD_WRITES_ON
)
14116 if (p
->notify
.code
== BGP_NOTIFY_OPEN_ERR
14117 && p
->notify
.subcode
== BGP_NOTIFY_OPEN_UNSUP_CAPBL
)
14118 bgp_capability_vty_out(vty
, p
, use_json
, json_neigh
);
14121 vty_out(vty
, "\n");
14123 /* BFD information. */
14125 bgp_bfd_show_info(vty
, p
, json_neigh
);
14128 if (p
->conf_if
) /* Configured interface name. */
14129 json_object_object_add(json
, p
->conf_if
, json_neigh
);
14130 else /* Configured IP address. */
14131 json_object_object_add(json
, p
->host
, json_neigh
);
14135 static int bgp_show_neighbor_graceful_restart(struct vty
*vty
, struct bgp
*bgp
,
14136 enum show_type type
,
14137 union sockunion
*su
,
14138 const char *conf_if
, afi_t afi
,
14141 struct listnode
*node
, *nnode
;
14144 safi_t safi
= SAFI_UNICAST
;
14145 json_object
*json
= NULL
;
14146 json_object
*json_neighbor
= NULL
;
14149 json
= json_object_new_object();
14150 json_neighbor
= json_object_new_object();
14153 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
14155 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
14158 if ((peer
->afc
[afi
][safi
]) == 0)
14161 if (type
== show_all
) {
14162 bgp_show_peer_gr_status(vty
, peer
, use_json
,
14166 json_object_object_add(json
, peer
->host
,
14168 json_neighbor
= NULL
;
14171 } else if (type
== show_peer
) {
14174 && !strcmp(peer
->conf_if
, conf_if
))
14176 && !strcmp(peer
->hostname
, conf_if
))) {
14178 bgp_show_peer_gr_status(vty
, peer
,
14183 if (sockunion_same(&peer
->su
, su
)) {
14185 bgp_show_peer_gr_status(vty
, peer
,
14190 if (use_json
&& find
)
14191 json_object_object_add(json
, peer
->host
,
14196 json_neighbor
= NULL
;
14201 if (type
== show_peer
&& !find
) {
14203 json_object_boolean_true_add(json
, "bgpNoSuchNeighbor");
14205 vty_out(vty
, "%% No such neighbor\n");
14209 json_object_free(json_neighbor
);
14210 vty_json(vty
, json
);
14212 vty_out(vty
, "\n");
14215 return CMD_SUCCESS
;
14218 static int bgp_show_neighbor(struct vty
*vty
, struct bgp
*bgp
,
14219 enum show_type type
, union sockunion
*su
,
14220 const char *conf_if
, bool use_json
,
14223 struct listnode
*node
, *nnode
;
14226 bool nbr_output
= false;
14227 afi_t afi
= AFI_MAX
;
14228 safi_t safi
= SAFI_MAX
;
14230 if (type
== show_ipv4_peer
|| type
== show_ipv4_all
) {
14232 } else if (type
== show_ipv6_peer
|| type
== show_ipv6_all
) {
14236 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
14237 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
14242 bgp_show_peer(vty
, peer
, use_json
, json
);
14248 && !strcmp(peer
->conf_if
, conf_if
))
14250 && !strcmp(peer
->hostname
, conf_if
))) {
14252 bgp_show_peer(vty
, peer
, use_json
,
14256 if (sockunion_same(&peer
->su
, su
)) {
14258 bgp_show_peer(vty
, peer
, use_json
,
14263 case show_ipv4_peer
:
14264 case show_ipv6_peer
:
14265 FOREACH_SAFI (safi
) {
14266 if (peer
->afc
[afi
][safi
]) {
14269 && !strcmp(peer
->conf_if
, conf_if
))
14271 && !strcmp(peer
->hostname
, conf_if
))) {
14273 bgp_show_peer(vty
, peer
, use_json
,
14278 if (sockunion_same(&peer
->su
, su
)) {
14280 bgp_show_peer(vty
, peer
, use_json
,
14288 case show_ipv4_all
:
14289 case show_ipv6_all
:
14290 FOREACH_SAFI (safi
) {
14291 if (peer
->afc
[afi
][safi
]) {
14292 bgp_show_peer(vty
, peer
, use_json
, json
);
14301 if ((type
== show_peer
|| type
== show_ipv4_peer
||
14302 type
== show_ipv6_peer
) && !find
) {
14304 json_object_boolean_true_add(json
, "bgpNoSuchNeighbor");
14306 vty_out(vty
, "%% No such neighbor in this view/vrf\n");
14309 if (type
!= show_peer
&& type
!= show_ipv4_peer
&&
14310 type
!= show_ipv6_peer
&& !nbr_output
&& !use_json
)
14311 vty_out(vty
, "%% No BGP neighbors found\n");
14314 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
14315 json
, JSON_C_TO_STRING_PRETTY
));
14317 vty_out(vty
, "\n");
14320 return CMD_SUCCESS
;
14323 static void bgp_show_neighbor_graceful_restart_vty(struct vty
*vty
,
14324 enum show_type type
,
14325 const char *ip_str
,
14326 afi_t afi
, bool use_json
)
14331 union sockunion su
;
14333 bgp
= bgp_get_default();
14339 bgp_show_global_graceful_restart_mode_vty(vty
, bgp
, use_json
,
14343 ret
= str2sockunion(ip_str
, &su
);
14345 bgp_show_neighbor_graceful_restart(
14346 vty
, bgp
, type
, NULL
, ip_str
, afi
, use_json
);
14348 bgp_show_neighbor_graceful_restart(vty
, bgp
, type
, &su
,
14349 NULL
, afi
, use_json
);
14351 bgp_show_neighbor_graceful_restart(vty
, bgp
, type
, NULL
, NULL
,
14355 static void bgp_show_all_instances_neighbors_vty(struct vty
*vty
,
14356 enum show_type type
,
14357 const char *ip_str
,
14360 struct listnode
*node
, *nnode
;
14362 union sockunion su
;
14363 json_object
*json
= NULL
;
14364 int ret
, is_first
= 1;
14365 bool nbr_output
= false;
14368 vty_out(vty
, "{\n");
14370 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
14373 if (!(json
= json_object_new_object())) {
14375 EC_BGP_JSON_MEM_ERROR
,
14376 "Unable to allocate memory for JSON object");
14378 "{\"error\": {\"message:\": \"Unable to allocate memory for JSON object\"}}}\n");
14382 json_object_int_add(json
, "vrfId",
14383 (bgp
->vrf_id
== VRF_UNKNOWN
)
14385 : (int64_t)bgp
->vrf_id
);
14386 json_object_string_add(
14388 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
14393 vty_out(vty
, ",\n");
14397 vty_out(vty
, "\"%s\":",
14398 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
14402 vty_out(vty
, "\nInstance %s:\n",
14403 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
14408 if (type
== show_peer
|| type
== show_ipv4_peer
||
14409 type
== show_ipv6_peer
) {
14410 ret
= str2sockunion(ip_str
, &su
);
14412 bgp_show_neighbor(vty
, bgp
, type
, NULL
, ip_str
,
14415 bgp_show_neighbor(vty
, bgp
, type
, &su
, NULL
,
14418 bgp_show_neighbor(vty
, bgp
, type
, NULL
, NULL
,
14421 json_object_free(json
);
14426 vty_out(vty
, "}\n");
14427 else if (!nbr_output
)
14428 vty_out(vty
, "%% BGP instance not found\n");
14431 static int bgp_show_neighbor_vty(struct vty
*vty
, const char *name
,
14432 enum show_type type
, const char *ip_str
,
14437 union sockunion su
;
14438 json_object
*json
= NULL
;
14441 if (strmatch(name
, "all")) {
14442 bgp_show_all_instances_neighbors_vty(vty
, type
, ip_str
,
14444 return CMD_SUCCESS
;
14446 bgp
= bgp_lookup_by_name(name
);
14449 json
= json_object_new_object();
14450 vty_json(vty
, json
);
14453 "%% BGP instance not found\n");
14455 return CMD_WARNING
;
14459 bgp
= bgp_get_default();
14463 json
= json_object_new_object();
14465 ret
= str2sockunion(ip_str
, &su
);
14467 bgp_show_neighbor(vty
, bgp
, type
, NULL
, ip_str
,
14470 bgp_show_neighbor(vty
, bgp
, type
, &su
, NULL
,
14473 bgp_show_neighbor(vty
, bgp
, type
, NULL
, NULL
, use_json
,
14476 json_object_free(json
);
14479 vty_out(vty
, "{}\n");
14481 vty_out(vty
, "%% BGP instance not found\n");
14484 return CMD_SUCCESS
;
14489 /* "show [ip] bgp neighbors graceful-restart" commands. */
14490 DEFUN (show_ip_bgp_neighbors_gracrful_restart
,
14491 show_ip_bgp_neighbors_graceful_restart_cmd
,
14492 "show bgp [<ipv4|ipv6>] neighbors [<A.B.C.D|X:X::X:X|WORD>] graceful-restart [json]",
14498 "Neighbor to display information about\n"
14499 "Neighbor to display information about\n"
14500 "Neighbor on BGP configured interface\n"
14504 char *sh_arg
= NULL
;
14505 enum show_type sh_type
;
14507 afi_t afi
= AFI_MAX
;
14508 bool uj
= use_json(argc
, argv
);
14510 if (!argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
))
14515 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)
14516 || argv_find(argv
, argc
, "X:X::X:X", &idx
)
14517 || argv_find(argv
, argc
, "WORD", &idx
)) {
14518 sh_type
= show_peer
;
14519 sh_arg
= argv
[idx
]->arg
;
14521 sh_type
= show_all
;
14523 if (!argv_find(argv
, argc
, "graceful-restart", &idx
))
14524 return CMD_SUCCESS
;
14527 return bgp_show_neighbor_graceful_restart_afi_all(vty
, sh_type
, sh_arg
,
14531 /* "show [ip] bgp neighbors" commands. */
14532 DEFUN (show_ip_bgp_neighbors
,
14533 show_ip_bgp_neighbors_cmd
,
14534 "show [ip] bgp [<view|vrf> VIEWVRFNAME] [<ipv4|ipv6>] neighbors [<A.B.C.D|X:X::X:X|WORD>] [json]",
14538 BGP_INSTANCE_HELP_STR
14541 "Detailed information on TCP and BGP neighbor connections\n"
14542 "Neighbor to display information about\n"
14543 "Neighbor to display information about\n"
14544 "Neighbor on BGP configured interface\n"
14548 char *sh_arg
= NULL
;
14549 enum show_type sh_type
;
14550 afi_t afi
= AFI_MAX
;
14552 bool uj
= use_json(argc
, argv
);
14556 /* [<vrf> VIEWVRFNAME] */
14557 if (argv_find(argv
, argc
, "vrf", &idx
)) {
14558 vrf
= argv
[idx
+ 1]->arg
;
14559 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
14561 } else if (argv_find(argv
, argc
, "view", &idx
))
14562 /* [<view> VIEWVRFNAME] */
14563 vrf
= argv
[idx
+ 1]->arg
;
14567 if (argv_find(argv
, argc
, "ipv4", &idx
)) {
14568 sh_type
= show_ipv4_all
;
14570 } else if (argv_find(argv
, argc
, "ipv6", &idx
)) {
14571 sh_type
= show_ipv6_all
;
14574 sh_type
= show_all
;
14577 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)
14578 || argv_find(argv
, argc
, "X:X::X:X", &idx
)
14579 || argv_find(argv
, argc
, "WORD", &idx
)) {
14580 sh_type
= show_peer
;
14581 sh_arg
= argv
[idx
]->arg
;
14584 if (sh_type
== show_peer
&& afi
== AFI_IP
) {
14585 sh_type
= show_ipv4_peer
;
14586 } else if (sh_type
== show_peer
&& afi
== AFI_IP6
) {
14587 sh_type
= show_ipv6_peer
;
14590 return bgp_show_neighbor_vty(vty
, vrf
, sh_type
, sh_arg
, uj
);
14593 /* Show BGP's AS paths internal data. There are both `show [ip] bgp
14594 paths' and `show ip mbgp paths'. Those functions results are the
14596 DEFUN (show_ip_bgp_paths
,
14597 show_ip_bgp_paths_cmd
,
14598 "show [ip] bgp ["BGP_SAFI_CMD_STR
"] paths",
14603 "Path information\n")
14605 vty_out(vty
, "Address Refcnt Path\n");
14606 aspath_print_all_vty(vty
);
14607 return CMD_SUCCESS
;
14612 static void community_show_all_iterator(struct hash_bucket
*bucket
,
14615 struct community
*com
;
14617 com
= (struct community
*)bucket
->data
;
14618 vty_out(vty
, "[%p] (%ld) %s\n", (void *)com
, com
->refcnt
,
14619 community_str(com
, false, false));
14622 /* Show BGP's community internal data. */
14623 DEFUN (show_ip_bgp_community_info
,
14624 show_ip_bgp_community_info_cmd
,
14625 "show [ip] bgp community-info",
14629 "List all bgp community information\n")
14631 vty_out(vty
, "Address Refcnt Community\n");
14633 hash_iterate(community_hash(),
14634 (void (*)(struct hash_bucket
*,
14635 void *))community_show_all_iterator
,
14638 return CMD_SUCCESS
;
14641 static void lcommunity_show_all_iterator(struct hash_bucket
*bucket
,
14644 struct lcommunity
*lcom
;
14646 lcom
= (struct lcommunity
*)bucket
->data
;
14647 vty_out(vty
, "[%p] (%ld) %s\n", (void *)lcom
, lcom
->refcnt
,
14648 lcommunity_str(lcom
, false, false));
14651 /* Show BGP's community internal data. */
14652 DEFUN (show_ip_bgp_lcommunity_info
,
14653 show_ip_bgp_lcommunity_info_cmd
,
14654 "show ip bgp large-community-info",
14658 "List all bgp large-community information\n")
14660 vty_out(vty
, "Address Refcnt Large-community\n");
14662 hash_iterate(lcommunity_hash(),
14663 (void (*)(struct hash_bucket
*,
14664 void *))lcommunity_show_all_iterator
,
14667 return CMD_SUCCESS
;
14669 /* Graceful Restart */
14671 static void bgp_show_global_graceful_restart_mode_vty(struct vty
*vty
,
14678 vty_out(vty
, "\n%s", SHOW_GR_HEADER
);
14680 enum global_mode bgp_global_gr_mode
= bgp_global_gr_mode_get(bgp
);
14682 switch (bgp_global_gr_mode
) {
14684 case GLOBAL_HELPER
:
14685 vty_out(vty
, "Global BGP GR Mode : Helper\n");
14689 vty_out(vty
, "Global BGP GR Mode : Restart\n");
14692 case GLOBAL_DISABLE
:
14693 vty_out(vty
, "Global BGP GR Mode : Disable\n");
14696 case GLOBAL_INVALID
:
14698 "Global BGP GR Mode Invalid\n");
14701 vty_out(vty
, "\n");
14704 static int bgp_show_neighbor_graceful_restart_afi_all(struct vty
*vty
,
14705 enum show_type type
,
14706 const char *ip_str
,
14707 afi_t afi
, bool use_json
)
14709 if ((afi
== AFI_MAX
) && (ip_str
== NULL
)) {
14712 while ((afi
!= AFI_L2VPN
) && (afi
< AFI_MAX
)) {
14714 bgp_show_neighbor_graceful_restart_vty(
14715 vty
, type
, ip_str
, afi
, use_json
);
14718 } else if (afi
!= AFI_MAX
) {
14719 bgp_show_neighbor_graceful_restart_vty(vty
, type
, ip_str
, afi
,
14722 return CMD_ERR_INCOMPLETE
;
14725 return CMD_SUCCESS
;
14727 /* Graceful Restart */
14729 DEFUN (show_ip_bgp_attr_info
,
14730 show_ip_bgp_attr_info_cmd
,
14731 "show [ip] bgp attribute-info",
14735 "List all bgp attribute information\n")
14737 attr_show_all(vty
);
14738 return CMD_SUCCESS
;
14741 static int bgp_show_route_leak_vty(struct vty
*vty
, const char *name
,
14742 afi_t afi
, safi_t safi
,
14743 bool use_json
, json_object
*json
)
14746 struct listnode
*node
;
14748 char buf1
[INET6_ADDRSTRLEN
];
14750 enum vpn_policy_direction dir
;
14753 json_object
*json_import_vrfs
= NULL
;
14754 json_object
*json_export_vrfs
= NULL
;
14756 bgp
= name
? bgp_lookup_by_name(name
) : bgp_get_default();
14759 vty_json(vty
, json
);
14761 return CMD_WARNING
;
14764 /* Provide context for the block */
14765 json_object_string_add(json
, "vrf", name
? name
: "default");
14766 json_object_string_add(json
, "afiSafi",
14767 get_afi_safi_str(afi
, safi
, true));
14769 if (!CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
14770 BGP_CONFIG_VRF_TO_VRF_IMPORT
)) {
14771 json_object_string_add(json
, "importFromVrfs", "none");
14772 json_object_string_add(json
, "importRts", "none");
14774 json_import_vrfs
= json_object_new_array();
14776 for (ALL_LIST_ELEMENTS_RO(
14777 bgp
->vpn_policy
[afi
].import_vrf
,
14779 json_object_array_add(json_import_vrfs
,
14780 json_object_new_string(vname
));
14782 json_object_object_add(json
, "importFromVrfs",
14784 dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
14785 if (bgp
->vpn_policy
[afi
].rtlist
[dir
]) {
14786 ecom_str
= ecommunity_ecom2str(
14787 bgp
->vpn_policy
[afi
].rtlist
[dir
],
14788 ECOMMUNITY_FORMAT_ROUTE_MAP
, 0);
14789 json_object_string_add(json
, "importRts",
14791 XFREE(MTYPE_ECOMMUNITY_STR
, ecom_str
);
14793 json_object_string_add(json
, "importRts",
14797 if (!CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
14798 BGP_CONFIG_VRF_TO_VRF_EXPORT
)) {
14799 json_object_string_add(json
, "exportToVrfs", "none");
14800 json_object_string_add(json
, "routeDistinguisher",
14802 json_object_string_add(json
, "exportRts", "none");
14804 json_export_vrfs
= json_object_new_array();
14806 for (ALL_LIST_ELEMENTS_RO(
14807 bgp
->vpn_policy
[afi
].export_vrf
,
14809 json_object_array_add(json_export_vrfs
,
14810 json_object_new_string(vname
));
14811 json_object_object_add(json
, "exportToVrfs",
14813 json_object_string_add(json
, "routeDistinguisher",
14814 prefix_rd2str(&bgp
->vpn_policy
[afi
].tovpn_rd
,
14815 buf1
, RD_ADDRSTRLEN
));
14817 dir
= BGP_VPN_POLICY_DIR_TOVPN
;
14818 if (bgp
->vpn_policy
[afi
].rtlist
[dir
]) {
14819 ecom_str
= ecommunity_ecom2str(
14820 bgp
->vpn_policy
[afi
].rtlist
[dir
],
14821 ECOMMUNITY_FORMAT_ROUTE_MAP
, 0);
14822 json_object_string_add(json
, "exportRts",
14824 XFREE(MTYPE_ECOMMUNITY_STR
, ecom_str
);
14826 json_object_string_add(json
, "exportRts",
14831 vty_json(vty
, json
);
14834 bgp
= name
? bgp_lookup_by_name(name
) : bgp_get_default();
14837 vty_out(vty
, "%% No such BGP instance exist\n");
14838 return CMD_WARNING
;
14841 if (!CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
14842 BGP_CONFIG_VRF_TO_VRF_IMPORT
))
14844 "This VRF is not importing %s routes from any other VRF\n",
14845 get_afi_safi_str(afi
, safi
, false));
14848 "This VRF is importing %s routes from the following VRFs:\n",
14849 get_afi_safi_str(afi
, safi
, false));
14851 for (ALL_LIST_ELEMENTS_RO(
14852 bgp
->vpn_policy
[afi
].import_vrf
,
14854 vty_out(vty
, " %s\n", vname
);
14856 dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
14858 if (bgp
->vpn_policy
[afi
].rtlist
[dir
]) {
14859 ecom_str
= ecommunity_ecom2str(
14860 bgp
->vpn_policy
[afi
].rtlist
[dir
],
14861 ECOMMUNITY_FORMAT_ROUTE_MAP
, 0);
14862 vty_out(vty
, "Import RT(s): %s\n", ecom_str
);
14864 XFREE(MTYPE_ECOMMUNITY_STR
, ecom_str
);
14866 vty_out(vty
, "Import RT(s):\n");
14869 if (!CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
14870 BGP_CONFIG_VRF_TO_VRF_EXPORT
))
14872 "This VRF is not exporting %s routes to any other VRF\n",
14873 get_afi_safi_str(afi
, safi
, false));
14876 "This VRF is exporting %s routes to the following VRFs:\n",
14877 get_afi_safi_str(afi
, safi
, false));
14879 for (ALL_LIST_ELEMENTS_RO(
14880 bgp
->vpn_policy
[afi
].export_vrf
,
14882 vty_out(vty
, " %s\n", vname
);
14884 vty_out(vty
, "RD: %s\n",
14885 prefix_rd2str(&bgp
->vpn_policy
[afi
].tovpn_rd
,
14886 buf1
, RD_ADDRSTRLEN
));
14888 dir
= BGP_VPN_POLICY_DIR_TOVPN
;
14889 if (bgp
->vpn_policy
[afi
].rtlist
[dir
]) {
14890 ecom_str
= ecommunity_ecom2str(
14891 bgp
->vpn_policy
[afi
].rtlist
[dir
],
14892 ECOMMUNITY_FORMAT_ROUTE_MAP
, 0);
14893 vty_out(vty
, "Export RT: %s\n", ecom_str
);
14894 XFREE(MTYPE_ECOMMUNITY_STR
, ecom_str
);
14896 vty_out(vty
, "Import RT(s):\n");
14900 return CMD_SUCCESS
;
14903 static int bgp_show_all_instance_route_leak_vty(struct vty
*vty
, afi_t afi
,
14904 safi_t safi
, bool use_json
)
14906 struct listnode
*node
, *nnode
;
14908 char *vrf_name
= NULL
;
14909 json_object
*json
= NULL
;
14910 json_object
*json_vrf
= NULL
;
14911 json_object
*json_vrfs
= NULL
;
14914 json
= json_object_new_object();
14915 json_vrfs
= json_object_new_object();
14918 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
14920 if (bgp
->inst_type
!= BGP_INSTANCE_TYPE_DEFAULT
)
14921 vrf_name
= bgp
->name
;
14924 json_vrf
= json_object_new_object();
14926 vty_out(vty
, "\nInstance %s:\n",
14927 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
14928 ? VRF_DEFAULT_NAME
: bgp
->name
);
14930 bgp_show_route_leak_vty(vty
, vrf_name
, afi
, safi
, 0, json_vrf
);
14932 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
14933 json_object_object_add(json_vrfs
,
14934 VRF_DEFAULT_NAME
, json_vrf
);
14936 json_object_object_add(json_vrfs
, vrf_name
,
14942 json_object_object_add(json
, "vrfs", json_vrfs
);
14943 vty_json(vty
, json
);
14946 return CMD_SUCCESS
;
14949 /* "show [ip] bgp route-leak" command. */
14950 DEFUN (show_ip_bgp_route_leak
,
14951 show_ip_bgp_route_leak_cmd
,
14952 "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR
" ["BGP_SAFI_CMD_STR
"]] route-leak [json]",
14956 BGP_INSTANCE_HELP_STR
14959 "Route leaking information\n"
14963 afi_t afi
= AFI_MAX
;
14964 safi_t safi
= SAFI_MAX
;
14966 bool uj
= use_json(argc
, argv
);
14968 json_object
*json
= NULL
;
14970 /* show [ip] bgp */
14971 if (argv_find(argv
, argc
, "ip", &idx
)) {
14973 safi
= SAFI_UNICAST
;
14975 /* [vrf VIEWVRFNAME] */
14976 if (argv_find(argv
, argc
, "view", &idx
)) {
14978 "%% This command is not applicable to BGP views\n");
14979 return CMD_WARNING
;
14982 if (argv_find(argv
, argc
, "vrf", &idx
)) {
14983 vrf
= argv
[idx
+ 1]->arg
;
14984 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
14987 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
14988 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
))
14989 argv_find_and_parse_safi(argv
, argc
, &idx
, &safi
);
14991 if (!((afi
== AFI_IP
|| afi
== AFI_IP6
) && safi
== SAFI_UNICAST
)) {
14993 "%% This command is applicable only for unicast ipv4|ipv6\n");
14994 return CMD_WARNING
;
14997 if (vrf
&& strmatch(vrf
, "all"))
14998 return bgp_show_all_instance_route_leak_vty(vty
, afi
, safi
, uj
);
15001 json
= json_object_new_object();
15003 return bgp_show_route_leak_vty(vty
, vrf
, afi
, safi
, uj
, json
);
15006 static void bgp_show_all_instances_updgrps_vty(struct vty
*vty
, afi_t afi
,
15009 struct listnode
*node
, *nnode
;
15012 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
15013 vty_out(vty
, "\nInstance %s:\n",
15014 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
15017 update_group_show(bgp
, afi
, safi
, vty
, 0);
15021 static int bgp_show_update_groups(struct vty
*vty
, const char *name
, int afi
,
15022 int safi
, uint64_t subgrp_id
)
15027 if (strmatch(name
, "all")) {
15028 bgp_show_all_instances_updgrps_vty(vty
, afi
, safi
);
15029 return CMD_SUCCESS
;
15031 bgp
= bgp_lookup_by_name(name
);
15034 bgp
= bgp_get_default();
15038 update_group_show(bgp
, afi
, safi
, vty
, subgrp_id
);
15039 return CMD_SUCCESS
;
15042 DEFUN (show_ip_bgp_updgrps
,
15043 show_ip_bgp_updgrps_cmd
,
15044 "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR
" ["BGP_SAFI_WITH_LABEL_CMD_STR
"]] update-groups [SUBGROUP-ID]",
15048 BGP_INSTANCE_HELP_STR
15050 BGP_SAFI_WITH_LABEL_HELP_STR
15051 "Detailed info about dynamic update groups\n"
15052 "Specific subgroup to display detailed info for\n")
15055 afi_t afi
= AFI_IP6
;
15056 safi_t safi
= SAFI_UNICAST
;
15057 uint64_t subgrp_id
= 0;
15061 /* show [ip] bgp */
15062 if (argv_find(argv
, argc
, "ip", &idx
))
15064 /* [<vrf> VIEWVRFNAME] */
15065 if (argv_find(argv
, argc
, "vrf", &idx
)) {
15066 vrf
= argv
[idx
+ 1]->arg
;
15067 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
15069 } else if (argv_find(argv
, argc
, "view", &idx
))
15070 /* [<view> VIEWVRFNAME] */
15071 vrf
= argv
[idx
+ 1]->arg
;
15072 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
15073 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
)) {
15074 argv_find_and_parse_safi(argv
, argc
, &idx
, &safi
);
15077 /* get subgroup id, if provided */
15079 if (argv
[idx
]->type
== VARIABLE_TKN
)
15080 subgrp_id
= strtoull(argv
[idx
]->arg
, NULL
, 10);
15082 return (bgp_show_update_groups(vty
, vrf
, afi
, safi
, subgrp_id
));
15085 DEFUN (show_bgp_instance_all_ipv6_updgrps
,
15086 show_bgp_instance_all_ipv6_updgrps_cmd
,
15087 "show [ip] bgp <view|vrf> all update-groups",
15091 BGP_INSTANCE_ALL_HELP_STR
15092 "Detailed info about dynamic update groups\n")
15094 bgp_show_all_instances_updgrps_vty(vty
, AFI_IP6
, SAFI_UNICAST
);
15095 return CMD_SUCCESS
;
15098 DEFUN (show_bgp_l2vpn_evpn_updgrps
,
15099 show_bgp_l2vpn_evpn_updgrps_cmd
,
15100 "show [ip] bgp l2vpn evpn update-groups",
15104 "l2vpn address family\n"
15105 "evpn sub-address family\n"
15106 "Detailed info about dynamic update groups\n")
15109 uint64_t subgrp_id
= 0;
15111 bgp_show_update_groups(vty
, vrf
, AFI_L2VPN
, SAFI_EVPN
, subgrp_id
);
15112 return CMD_SUCCESS
;
15115 DEFUN (show_bgp_updgrps_stats
,
15116 show_bgp_updgrps_stats_cmd
,
15117 "show [ip] bgp update-groups statistics",
15121 "Detailed info about dynamic update groups\n"
15126 bgp
= bgp_get_default();
15128 update_group_show_stats(bgp
, vty
);
15130 return CMD_SUCCESS
;
15133 DEFUN (show_bgp_instance_updgrps_stats
,
15134 show_bgp_instance_updgrps_stats_cmd
,
15135 "show [ip] bgp <view|vrf> VIEWVRFNAME update-groups statistics",
15139 BGP_INSTANCE_HELP_STR
15140 "Detailed info about dynamic update groups\n"
15146 bgp
= bgp_lookup_by_name(argv
[idx_word
]->arg
);
15148 update_group_show_stats(bgp
, vty
);
15150 return CMD_SUCCESS
;
15153 static void show_bgp_updgrps_adj_info_aux(struct vty
*vty
, const char *name
,
15154 afi_t afi
, safi_t safi
,
15155 const char *what
, uint64_t subgrp_id
)
15160 bgp
= bgp_lookup_by_name(name
);
15162 bgp
= bgp_get_default();
15165 if (!strcmp(what
, "advertise-queue"))
15166 update_group_show_adj_queue(bgp
, afi
, safi
, vty
,
15168 else if (!strcmp(what
, "advertised-routes"))
15169 update_group_show_advertised(bgp
, afi
, safi
, vty
,
15171 else if (!strcmp(what
, "packet-queue"))
15172 update_group_show_packet_queue(bgp
, afi
, safi
, vty
,
15177 DEFPY(show_ip_bgp_instance_updgrps_adj_s
,
15178 show_ip_bgp_instance_updgrps_adj_s_cmd
,
15179 "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",
15180 SHOW_STR IP_STR BGP_STR BGP_INSTANCE_HELP_STR BGP_AFI_HELP_STR
15182 "Detailed info about dynamic update groups\n"
15183 "Specific subgroup to display info for\n"
15184 "Advertisement queue\n"
15185 "Announced routes\n"
15188 uint64_t subgrp_id
= 0;
15192 subgrp_id
= strtoull(sgid
, NULL
, 10);
15197 afiz
= bgp_vty_afi_from_str(afi
);
15201 afiz
= bgp_vty_afi_from_str(afi
);
15202 if (afiz
!= AFI_IP
)
15204 "%% Cannot specify both 'ip' and 'ipv6'\n");
15205 return CMD_WARNING
;
15208 safiz
= safi
? bgp_vty_safi_from_str(safi
) : SAFI_UNICAST
;
15210 show_bgp_updgrps_adj_info_aux(vty
, vrf
, afiz
, safiz
, rtq
, subgrp_id
);
15211 return CMD_SUCCESS
;
15214 static int bgp_show_one_peer_group(struct vty
*vty
, struct peer_group
*group
,
15217 struct listnode
*node
, *nnode
;
15218 struct prefix
*range
;
15223 const char *peer_status
;
15227 json_object
*json_peer_group
= NULL
;
15228 json_object
*json_peer_group_afc
= NULL
;
15229 json_object
*json_peer_group_members
= NULL
;
15230 json_object
*json_peer_group_dynamic
= NULL
;
15231 json_object
*json_peer_group_dynamic_af
= NULL
;
15232 json_object
*json_peer_group_ranges
= NULL
;
15234 conf
= group
->conf
;
15237 json_peer_group
= json_object_new_object();
15238 json_peer_group_afc
= json_object_new_array();
15241 if (conf
->as_type
== AS_SPECIFIED
|| conf
->as_type
== AS_EXTERNAL
) {
15243 json_object_int_add(json_peer_group
, "remoteAs",
15246 vty_out(vty
, "\nBGP peer-group %s, remote AS %u\n",
15247 group
->name
, conf
->as
);
15248 } else if (conf
->as_type
== AS_INTERNAL
) {
15250 json_object_int_add(json_peer_group
, "remoteAs",
15253 vty_out(vty
, "\nBGP peer-group %s, remote AS %u\n",
15254 group
->name
, group
->bgp
->as
);
15257 vty_out(vty
, "\nBGP peer-group %s\n", group
->name
);
15260 if ((group
->bgp
->as
== conf
->as
) || (conf
->as_type
== AS_INTERNAL
)) {
15262 json_object_string_add(json_peer_group
, "type",
15265 vty_out(vty
, " Peer-group type is internal\n");
15268 json_object_string_add(json_peer_group
, "type",
15271 vty_out(vty
, " Peer-group type is external\n");
15274 /* Display AFs configured. */
15276 vty_out(vty
, " Configured address-families:");
15278 FOREACH_AFI_SAFI (afi
, safi
) {
15279 if (conf
->afc
[afi
][safi
]) {
15282 json_object_array_add(
15283 json_peer_group_afc
,
15284 json_object_new_string(get_afi_safi_str(
15285 afi
, safi
, false)));
15287 vty_out(vty
, " %s;",
15288 get_afi_safi_str(afi
, safi
, false));
15293 json_object_object_add(json_peer_group
,
15294 "addressFamiliesConfigured",
15295 json_peer_group_afc
);
15298 vty_out(vty
, " none\n");
15300 vty_out(vty
, "\n");
15303 /* Display listen ranges (for dynamic neighbors), if any */
15304 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++) {
15305 lr_count
= listcount(group
->listen_range
[afi
]);
15308 if (!json_peer_group_dynamic
)
15309 json_peer_group_dynamic
=
15310 json_object_new_object();
15312 json_peer_group_dynamic_af
=
15313 json_object_new_object();
15314 json_peer_group_ranges
=
15315 json_object_new_array();
15316 json_object_int_add(json_peer_group_dynamic_af
,
15317 "count", lr_count
);
15319 vty_out(vty
, " %d %s listen range(s)\n",
15320 lr_count
, afi2str(afi
));
15323 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], node
,
15328 snprintfrr(buf
, sizeof(buf
), "%pFX",
15331 json_object_array_add(
15332 json_peer_group_ranges
,
15333 json_object_new_string(buf
));
15335 vty_out(vty
, " %pFX\n", range
);
15340 json_object_object_add(
15341 json_peer_group_dynamic_af
, "ranges",
15342 json_peer_group_ranges
);
15344 json_object_object_add(
15345 json_peer_group_dynamic
, afi2str(afi
),
15346 json_peer_group_dynamic_af
);
15351 if (json_peer_group_dynamic
)
15352 json_object_object_add(json_peer_group
, "dynamicRanges",
15353 json_peer_group_dynamic
);
15355 /* Display group members and their status */
15356 if (listcount(group
->peer
)) {
15358 json_peer_group_members
= json_object_new_object();
15360 vty_out(vty
, " Peer-group members:\n");
15361 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
15362 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_SHUTDOWN
)
15363 || CHECK_FLAG(peer
->bgp
->flags
, BGP_FLAG_SHUTDOWN
))
15364 peer_status
= "Idle (Admin)";
15365 else if (CHECK_FLAG(peer
->sflags
,
15366 PEER_STATUS_PREFIX_OVERFLOW
))
15367 peer_status
= "Idle (PfxCt)";
15369 peer_status
= lookup_msg(bgp_status_msg
,
15370 peer
->status
, NULL
);
15372 dynamic
= peer_dynamic_neighbor(peer
);
15375 json_object
*json_peer_group_member
=
15376 json_object_new_object();
15378 json_object_string_add(json_peer_group_member
,
15379 "status", peer_status
);
15382 json_object_boolean_true_add(
15383 json_peer_group_member
,
15386 json_object_object_add(json_peer_group_members
,
15388 json_peer_group_member
);
15390 vty_out(vty
, " %s %s %s \n", peer
->host
,
15391 dynamic
? "(dynamic)" : "",
15396 json_object_object_add(json_peer_group
, "members",
15397 json_peer_group_members
);
15401 json_object_object_add(json
, group
->name
, json_peer_group
);
15403 return CMD_SUCCESS
;
15406 static int bgp_show_peer_group_vty(struct vty
*vty
, const char *name
,
15407 const char *group_name
, bool uj
)
15410 struct listnode
*node
, *nnode
;
15411 struct peer_group
*group
;
15412 bool found
= false;
15413 json_object
*json
= NULL
;
15416 json
= json_object_new_object();
15418 bgp
= name
? bgp_lookup_by_name(name
) : bgp_get_default();
15422 vty_json(vty
, json
);
15424 vty_out(vty
, "%% BGP instance not found\n");
15426 return CMD_WARNING
;
15429 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
15431 if (strmatch(group
->name
, group_name
)) {
15432 bgp_show_one_peer_group(vty
, group
, json
);
15437 bgp_show_one_peer_group(vty
, group
, json
);
15441 if (group_name
&& !found
&& !uj
)
15442 vty_out(vty
, "%% No such peer-group\n");
15445 vty_json(vty
, json
);
15447 return CMD_SUCCESS
;
15450 DEFUN(show_ip_bgp_peer_groups
, show_ip_bgp_peer_groups_cmd
,
15451 "show [ip] bgp [<view|vrf> VIEWVRFNAME] peer-group [PGNAME] [json]",
15452 SHOW_STR IP_STR BGP_STR BGP_INSTANCE_HELP_STR
15453 "Detailed information on BGP peer groups\n"
15454 "Peer group name\n" JSON_STR
)
15458 bool uj
= use_json(argc
, argv
);
15460 vrf
= argv_find(argv
, argc
, "VIEWVRFNAME", &idx
) ? argv
[idx
]->arg
15462 pg
= argv_find(argv
, argc
, "PGNAME", &idx
) ? argv
[idx
]->arg
: NULL
;
15464 return bgp_show_peer_group_vty(vty
, vrf
, pg
, uj
);
15468 /* Redistribute VTY commands. */
15470 DEFUN (bgp_redistribute_ipv4
,
15471 bgp_redistribute_ipv4_cmd
,
15472 "redistribute " FRR_IP_REDIST_STR_BGPD
,
15473 "Redistribute information from another routing protocol\n"
15474 FRR_IP_REDIST_HELP_STR_BGPD
)
15476 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
15477 int idx_protocol
= 1;
15480 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
15482 vty_out(vty
, "%% Invalid route type\n");
15483 return CMD_WARNING_CONFIG_FAILED
;
15486 bgp_redist_add(bgp
, AFI_IP
, type
, 0);
15487 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0, false);
15491 bgp_redistribute_ipv4
, bgp_redistribute_ipv4_hidden_cmd
,
15492 "redistribute " FRR_IP_REDIST_STR_BGPD
,
15493 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
)
15495 DEFUN (bgp_redistribute_ipv4_rmap
,
15496 bgp_redistribute_ipv4_rmap_cmd
,
15497 "redistribute " FRR_IP_REDIST_STR_BGPD
" route-map RMAP_NAME",
15498 "Redistribute information from another routing protocol\n"
15499 FRR_IP_REDIST_HELP_STR_BGPD
15500 "Route map reference\n"
15501 "Pointer to route-map entries\n")
15503 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
15504 int idx_protocol
= 1;
15507 struct bgp_redist
*red
;
15509 struct route_map
*route_map
= route_map_lookup_warn_noexist(
15510 vty
, argv
[idx_word
]->arg
);
15512 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
15514 vty_out(vty
, "%% Invalid route type\n");
15515 return CMD_WARNING_CONFIG_FAILED
;
15518 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
15520 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
15521 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0, changed
);
15525 bgp_redistribute_ipv4_rmap
, bgp_redistribute_ipv4_rmap_hidden_cmd
,
15526 "redistribute " FRR_IP_REDIST_STR_BGPD
" route-map RMAP_NAME",
15527 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
15528 "Route map reference\n"
15529 "Pointer to route-map entries\n")
15531 DEFUN (bgp_redistribute_ipv4_metric
,
15532 bgp_redistribute_ipv4_metric_cmd
,
15533 "redistribute " FRR_IP_REDIST_STR_BGPD
" metric (0-4294967295)",
15534 "Redistribute information from another routing protocol\n"
15535 FRR_IP_REDIST_HELP_STR_BGPD
15536 "Metric for redistributed routes\n"
15537 "Default metric\n")
15539 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
15540 int idx_protocol
= 1;
15541 int idx_number
= 3;
15544 struct bgp_redist
*red
;
15547 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
15549 vty_out(vty
, "%% Invalid route type\n");
15550 return CMD_WARNING_CONFIG_FAILED
;
15552 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
15554 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
15555 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, type
, metric
);
15556 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0, changed
);
15560 bgp_redistribute_ipv4_metric
, bgp_redistribute_ipv4_metric_hidden_cmd
,
15561 "redistribute " FRR_IP_REDIST_STR_BGPD
" metric (0-4294967295)",
15562 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
15563 "Metric for redistributed routes\n"
15564 "Default metric\n")
15566 DEFUN (bgp_redistribute_ipv4_rmap_metric
,
15567 bgp_redistribute_ipv4_rmap_metric_cmd
,
15568 "redistribute " FRR_IP_REDIST_STR_BGPD
" route-map RMAP_NAME metric (0-4294967295)",
15569 "Redistribute information from another routing protocol\n"
15570 FRR_IP_REDIST_HELP_STR_BGPD
15571 "Route map reference\n"
15572 "Pointer to route-map entries\n"
15573 "Metric for redistributed routes\n"
15574 "Default metric\n")
15576 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
15577 int idx_protocol
= 1;
15579 int idx_number
= 5;
15582 struct bgp_redist
*red
;
15584 struct route_map
*route_map
=
15585 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
15587 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
15589 vty_out(vty
, "%% Invalid route type\n");
15590 return CMD_WARNING_CONFIG_FAILED
;
15592 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
15594 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
15596 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
15597 changed
|= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, type
, metric
);
15598 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0, changed
);
15602 bgp_redistribute_ipv4_rmap_metric
,
15603 bgp_redistribute_ipv4_rmap_metric_hidden_cmd
,
15604 "redistribute " FRR_IP_REDIST_STR_BGPD
15605 " route-map RMAP_NAME metric (0-4294967295)",
15606 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
15607 "Route map reference\n"
15608 "Pointer to route-map entries\n"
15609 "Metric for redistributed routes\n"
15610 "Default metric\n")
15612 DEFUN (bgp_redistribute_ipv4_metric_rmap
,
15613 bgp_redistribute_ipv4_metric_rmap_cmd
,
15614 "redistribute " FRR_IP_REDIST_STR_BGPD
" metric (0-4294967295) route-map RMAP_NAME",
15615 "Redistribute information from another routing protocol\n"
15616 FRR_IP_REDIST_HELP_STR_BGPD
15617 "Metric for redistributed routes\n"
15619 "Route map reference\n"
15620 "Pointer to route-map entries\n")
15622 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
15623 int idx_protocol
= 1;
15624 int idx_number
= 3;
15628 struct bgp_redist
*red
;
15630 struct route_map
*route_map
=
15631 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
15633 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
15635 vty_out(vty
, "%% Invalid route type\n");
15636 return CMD_WARNING_CONFIG_FAILED
;
15638 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
15640 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
15641 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, type
, metric
);
15643 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
15644 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0, changed
);
15648 bgp_redistribute_ipv4_metric_rmap
,
15649 bgp_redistribute_ipv4_metric_rmap_hidden_cmd
,
15650 "redistribute " FRR_IP_REDIST_STR_BGPD
15651 " metric (0-4294967295) route-map RMAP_NAME",
15652 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
15653 "Metric for redistributed routes\n"
15655 "Route map reference\n"
15656 "Pointer to route-map entries\n")
15658 DEFUN (bgp_redistribute_ipv4_ospf
,
15659 bgp_redistribute_ipv4_ospf_cmd
,
15660 "redistribute <ospf|table> (1-65535)",
15661 "Redistribute information from another routing protocol\n"
15662 "Open Shortest Path First (OSPFv2)\n"
15663 "Non-main Kernel Routing Table\n"
15664 "Instance ID/Table ID\n")
15666 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
15667 int idx_ospf_table
= 1;
15668 int idx_number
= 2;
15669 unsigned short instance
;
15670 unsigned short protocol
;
15672 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
15674 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
15675 protocol
= ZEBRA_ROUTE_OSPF
;
15677 protocol
= ZEBRA_ROUTE_TABLE
;
15679 bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
15680 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
, false);
15683 ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf
, bgp_redistribute_ipv4_ospf_hidden_cmd
,
15684 "redistribute <ospf|table> (1-65535)",
15685 "Redistribute information from another routing protocol\n"
15686 "Open Shortest Path First (OSPFv2)\n"
15687 "Non-main Kernel Routing Table\n"
15688 "Instance ID/Table ID\n")
15690 DEFUN (bgp_redistribute_ipv4_ospf_rmap
,
15691 bgp_redistribute_ipv4_ospf_rmap_cmd
,
15692 "redistribute <ospf|table> (1-65535) route-map RMAP_NAME",
15693 "Redistribute information from another routing protocol\n"
15694 "Open Shortest Path First (OSPFv2)\n"
15695 "Non-main Kernel Routing Table\n"
15696 "Instance ID/Table ID\n"
15697 "Route map reference\n"
15698 "Pointer to route-map entries\n")
15700 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
15701 int idx_ospf_table
= 1;
15702 int idx_number
= 2;
15704 struct bgp_redist
*red
;
15705 unsigned short instance
;
15708 struct route_map
*route_map
=
15709 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
15711 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
15712 protocol
= ZEBRA_ROUTE_OSPF
;
15714 protocol
= ZEBRA_ROUTE_TABLE
;
15716 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
15717 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
15719 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
15720 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
, changed
);
15723 ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf_rmap
,
15724 bgp_redistribute_ipv4_ospf_rmap_hidden_cmd
,
15725 "redistribute <ospf|table> (1-65535) route-map RMAP_NAME",
15726 "Redistribute information from another routing protocol\n"
15727 "Open Shortest Path First (OSPFv2)\n"
15728 "Non-main Kernel Routing Table\n"
15729 "Instance ID/Table ID\n"
15730 "Route map reference\n"
15731 "Pointer to route-map entries\n")
15733 DEFUN (bgp_redistribute_ipv4_ospf_metric
,
15734 bgp_redistribute_ipv4_ospf_metric_cmd
,
15735 "redistribute <ospf|table> (1-65535) metric (0-4294967295)",
15736 "Redistribute information from another routing protocol\n"
15737 "Open Shortest Path First (OSPFv2)\n"
15738 "Non-main Kernel Routing Table\n"
15739 "Instance ID/Table ID\n"
15740 "Metric for redistributed routes\n"
15741 "Default metric\n")
15743 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
15744 int idx_ospf_table
= 1;
15745 int idx_number
= 2;
15746 int idx_number_2
= 4;
15748 struct bgp_redist
*red
;
15749 unsigned short instance
;
15753 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
15754 protocol
= ZEBRA_ROUTE_OSPF
;
15756 protocol
= ZEBRA_ROUTE_TABLE
;
15758 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
15759 metric
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
15761 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
15762 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, protocol
,
15764 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
, changed
);
15767 ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf_metric
,
15768 bgp_redistribute_ipv4_ospf_metric_hidden_cmd
,
15769 "redistribute <ospf|table> (1-65535) metric (0-4294967295)",
15770 "Redistribute information from another routing protocol\n"
15771 "Open Shortest Path First (OSPFv2)\n"
15772 "Non-main Kernel Routing Table\n"
15773 "Instance ID/Table ID\n"
15774 "Metric for redistributed routes\n"
15775 "Default metric\n")
15777 DEFUN (bgp_redistribute_ipv4_ospf_rmap_metric
,
15778 bgp_redistribute_ipv4_ospf_rmap_metric_cmd
,
15779 "redistribute <ospf|table> (1-65535) route-map RMAP_NAME metric (0-4294967295)",
15780 "Redistribute information from another routing protocol\n"
15781 "Open Shortest Path First (OSPFv2)\n"
15782 "Non-main Kernel Routing Table\n"
15783 "Instance ID/Table ID\n"
15784 "Route map reference\n"
15785 "Pointer to route-map entries\n"
15786 "Metric for redistributed routes\n"
15787 "Default metric\n")
15789 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
15790 int idx_ospf_table
= 1;
15791 int idx_number
= 2;
15793 int idx_number_2
= 6;
15795 struct bgp_redist
*red
;
15796 unsigned short instance
;
15799 struct route_map
*route_map
=
15800 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
15802 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
15803 protocol
= ZEBRA_ROUTE_OSPF
;
15805 protocol
= ZEBRA_ROUTE_TABLE
;
15807 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
15808 metric
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
15810 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
15812 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
15813 changed
|= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, protocol
,
15815 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
, changed
);
15819 bgp_redistribute_ipv4_ospf_rmap_metric
,
15820 bgp_redistribute_ipv4_ospf_rmap_metric_hidden_cmd
,
15821 "redistribute <ospf|table> (1-65535) route-map RMAP_NAME metric (0-4294967295)",
15822 "Redistribute information from another routing protocol\n"
15823 "Open Shortest Path First (OSPFv2)\n"
15824 "Non-main Kernel Routing Table\n"
15825 "Instance ID/Table ID\n"
15826 "Route map reference\n"
15827 "Pointer to route-map entries\n"
15828 "Metric for redistributed routes\n"
15829 "Default metric\n")
15831 DEFUN (bgp_redistribute_ipv4_ospf_metric_rmap
,
15832 bgp_redistribute_ipv4_ospf_metric_rmap_cmd
,
15833 "redistribute <ospf|table> (1-65535) metric (0-4294967295) route-map RMAP_NAME",
15834 "Redistribute information from another routing protocol\n"
15835 "Open Shortest Path First (OSPFv2)\n"
15836 "Non-main Kernel Routing Table\n"
15837 "Instance ID/Table ID\n"
15838 "Metric for redistributed routes\n"
15840 "Route map reference\n"
15841 "Pointer to route-map entries\n")
15843 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
15844 int idx_ospf_table
= 1;
15845 int idx_number
= 2;
15846 int idx_number_2
= 4;
15849 struct bgp_redist
*red
;
15850 unsigned short instance
;
15853 struct route_map
*route_map
=
15854 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
15856 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
15857 protocol
= ZEBRA_ROUTE_OSPF
;
15859 protocol
= ZEBRA_ROUTE_TABLE
;
15861 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
15862 metric
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
15864 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
15865 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, protocol
,
15868 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
15869 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
, changed
);
15873 bgp_redistribute_ipv4_ospf_metric_rmap
,
15874 bgp_redistribute_ipv4_ospf_metric_rmap_hidden_cmd
,
15875 "redistribute <ospf|table> (1-65535) metric (0-4294967295) route-map RMAP_NAME",
15876 "Redistribute information from another routing protocol\n"
15877 "Open Shortest Path First (OSPFv2)\n"
15878 "Non-main Kernel Routing Table\n"
15879 "Instance ID/Table ID\n"
15880 "Metric for redistributed routes\n"
15882 "Route map reference\n"
15883 "Pointer to route-map entries\n")
15885 DEFUN (no_bgp_redistribute_ipv4_ospf
,
15886 no_bgp_redistribute_ipv4_ospf_cmd
,
15887 "no redistribute <ospf|table> (1-65535) [{metric (0-4294967295)|route-map RMAP_NAME}]",
15889 "Redistribute information from another routing protocol\n"
15890 "Open Shortest Path First (OSPFv2)\n"
15891 "Non-main Kernel Routing Table\n"
15892 "Instance ID/Table ID\n"
15893 "Metric for redistributed routes\n"
15895 "Route map reference\n"
15896 "Pointer to route-map entries\n")
15898 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
15899 int idx_ospf_table
= 2;
15900 int idx_number
= 3;
15901 unsigned short instance
;
15904 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
15905 protocol
= ZEBRA_ROUTE_OSPF
;
15907 protocol
= ZEBRA_ROUTE_TABLE
;
15909 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
15910 return bgp_redistribute_unset(bgp
, AFI_IP
, protocol
, instance
);
15914 no_bgp_redistribute_ipv4_ospf
, no_bgp_redistribute_ipv4_ospf_hidden_cmd
,
15915 "no redistribute <ospf|table> (1-65535) [{metric (0-4294967295)|route-map RMAP_NAME}]",
15917 "Redistribute information from another routing protocol\n"
15918 "Open Shortest Path First (OSPFv2)\n"
15919 "Non-main Kernel Routing Table\n"
15920 "Instance ID/Table ID\n"
15921 "Metric for redistributed routes\n"
15923 "Route map reference\n"
15924 "Pointer to route-map entries\n")
15926 DEFUN (no_bgp_redistribute_ipv4
,
15927 no_bgp_redistribute_ipv4_cmd
,
15928 "no redistribute " FRR_IP_REDIST_STR_BGPD
" [{metric (0-4294967295)|route-map RMAP_NAME}]",
15930 "Redistribute information from another routing protocol\n"
15931 FRR_IP_REDIST_HELP_STR_BGPD
15932 "Metric for redistributed routes\n"
15934 "Route map reference\n"
15935 "Pointer to route-map entries\n")
15937 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
15938 int idx_protocol
= 2;
15941 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
15943 vty_out(vty
, "%% Invalid route type\n");
15944 return CMD_WARNING_CONFIG_FAILED
;
15946 return bgp_redistribute_unset(bgp
, AFI_IP
, type
, 0);
15950 no_bgp_redistribute_ipv4
, no_bgp_redistribute_ipv4_hidden_cmd
,
15951 "no redistribute " FRR_IP_REDIST_STR_BGPD
15952 " [{metric (0-4294967295)|route-map RMAP_NAME}]",
15954 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
15955 "Metric for redistributed routes\n"
15957 "Route map reference\n"
15958 "Pointer to route-map entries\n")
15960 DEFUN (bgp_redistribute_ipv6
,
15961 bgp_redistribute_ipv6_cmd
,
15962 "redistribute " FRR_IP6_REDIST_STR_BGPD
,
15963 "Redistribute information from another routing protocol\n"
15964 FRR_IP6_REDIST_HELP_STR_BGPD
)
15966 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
15967 int idx_protocol
= 1;
15970 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
15972 vty_out(vty
, "%% Invalid route type\n");
15973 return CMD_WARNING_CONFIG_FAILED
;
15976 bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
15977 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0, false);
15980 DEFUN (bgp_redistribute_ipv6_rmap
,
15981 bgp_redistribute_ipv6_rmap_cmd
,
15982 "redistribute " FRR_IP6_REDIST_STR_BGPD
" route-map RMAP_NAME",
15983 "Redistribute information from another routing protocol\n"
15984 FRR_IP6_REDIST_HELP_STR_BGPD
15985 "Route map reference\n"
15986 "Pointer to route-map entries\n")
15988 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
15989 int idx_protocol
= 1;
15992 struct bgp_redist
*red
;
15994 struct route_map
*route_map
=
15995 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
15997 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
15999 vty_out(vty
, "%% Invalid route type\n");
16000 return CMD_WARNING_CONFIG_FAILED
;
16003 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
16005 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
16006 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0, changed
);
16009 DEFUN (bgp_redistribute_ipv6_metric
,
16010 bgp_redistribute_ipv6_metric_cmd
,
16011 "redistribute " FRR_IP6_REDIST_STR_BGPD
" metric (0-4294967295)",
16012 "Redistribute information from another routing protocol\n"
16013 FRR_IP6_REDIST_HELP_STR_BGPD
16014 "Metric for redistributed routes\n"
16015 "Default metric\n")
16017 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
16018 int idx_protocol
= 1;
16019 int idx_number
= 3;
16022 struct bgp_redist
*red
;
16025 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
16027 vty_out(vty
, "%% Invalid route type\n");
16028 return CMD_WARNING_CONFIG_FAILED
;
16030 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
16032 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
16033 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP6
, type
, metric
);
16034 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0, changed
);
16037 DEFUN (bgp_redistribute_ipv6_rmap_metric
,
16038 bgp_redistribute_ipv6_rmap_metric_cmd
,
16039 "redistribute " FRR_IP6_REDIST_STR_BGPD
" route-map RMAP_NAME metric (0-4294967295)",
16040 "Redistribute information from another routing protocol\n"
16041 FRR_IP6_REDIST_HELP_STR_BGPD
16042 "Route map reference\n"
16043 "Pointer to route-map entries\n"
16044 "Metric for redistributed routes\n"
16045 "Default metric\n")
16047 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
16048 int idx_protocol
= 1;
16050 int idx_number
= 5;
16053 struct bgp_redist
*red
;
16055 struct route_map
*route_map
=
16056 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
16058 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
16060 vty_out(vty
, "%% Invalid route type\n");
16061 return CMD_WARNING_CONFIG_FAILED
;
16063 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
16065 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
16067 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
16068 changed
|= bgp_redistribute_metric_set(bgp
, red
, AFI_IP6
, type
,
16070 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0, changed
);
16073 DEFUN (bgp_redistribute_ipv6_metric_rmap
,
16074 bgp_redistribute_ipv6_metric_rmap_cmd
,
16075 "redistribute " FRR_IP6_REDIST_STR_BGPD
" metric (0-4294967295) route-map RMAP_NAME",
16076 "Redistribute information from another routing protocol\n"
16077 FRR_IP6_REDIST_HELP_STR_BGPD
16078 "Metric for redistributed routes\n"
16080 "Route map reference\n"
16081 "Pointer to route-map entries\n")
16083 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
16084 int idx_protocol
= 1;
16085 int idx_number
= 3;
16089 struct bgp_redist
*red
;
16091 struct route_map
*route_map
=
16092 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
16094 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
16096 vty_out(vty
, "%% Invalid route type\n");
16097 return CMD_WARNING_CONFIG_FAILED
;
16099 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
16101 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
16102 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP6
, SAFI_UNICAST
,
16105 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
16106 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0, changed
);
16109 DEFUN (no_bgp_redistribute_ipv6
,
16110 no_bgp_redistribute_ipv6_cmd
,
16111 "no redistribute " FRR_IP6_REDIST_STR_BGPD
" [{metric (0-4294967295)|route-map RMAP_NAME}]",
16113 "Redistribute information from another routing protocol\n"
16114 FRR_IP6_REDIST_HELP_STR_BGPD
16115 "Metric for redistributed routes\n"
16117 "Route map reference\n"
16118 "Pointer to route-map entries\n")
16120 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
16121 int idx_protocol
= 2;
16124 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
16126 vty_out(vty
, "%% Invalid route type\n");
16127 return CMD_WARNING_CONFIG_FAILED
;
16130 return bgp_redistribute_unset(bgp
, AFI_IP6
, type
, 0);
16133 /* Neighbor update tcp-mss. */
16134 static int peer_tcp_mss_vty(struct vty
*vty
, const char *peer_str
,
16135 const char *tcp_mss_str
)
16138 uint32_t tcp_mss_val
= 0;
16140 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
16142 return CMD_WARNING_CONFIG_FAILED
;
16145 tcp_mss_val
= strtoul(tcp_mss_str
, NULL
, 10);
16146 peer_tcp_mss_set(peer
, tcp_mss_val
);
16148 peer_tcp_mss_unset(peer
);
16151 return CMD_SUCCESS
;
16154 DEFUN(neighbor_tcp_mss
, neighbor_tcp_mss_cmd
,
16155 "neighbor <A.B.C.D|X:X::X:X|WORD> tcp-mss (1-65535)",
16156 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
16157 "TCP max segment size\n"
16160 int peer_index
= 1;
16164 " Warning: Reset BGP session for tcp-mss value to take effect\n");
16165 return peer_tcp_mss_vty(vty
, argv
[peer_index
]->arg
,
16166 argv
[mss_index
]->arg
);
16169 DEFUN(no_neighbor_tcp_mss
, no_neighbor_tcp_mss_cmd
,
16170 "no neighbor <A.B.C.D|X:X::X:X|WORD> tcp-mss [(1-65535)]",
16171 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
16172 "TCP max segment size\n"
16175 int peer_index
= 2;
16178 " Warning: Reset BGP session for tcp-mss value to take effect\n");
16179 return peer_tcp_mss_vty(vty
, argv
[peer_index
]->arg
, NULL
);
16182 static void bgp_config_write_redistribute(struct vty
*vty
, struct bgp
*bgp
,
16183 afi_t afi
, safi_t safi
)
16187 /* Unicast redistribution only. */
16188 if (safi
!= SAFI_UNICAST
)
16191 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++) {
16192 /* Redistribute BGP does not make sense. */
16193 if (i
!= ZEBRA_ROUTE_BGP
) {
16194 struct list
*red_list
;
16195 struct listnode
*node
;
16196 struct bgp_redist
*red
;
16198 red_list
= bgp
->redist
[afi
][i
];
16202 for (ALL_LIST_ELEMENTS_RO(red_list
, node
, red
)) {
16203 /* "redistribute" configuration. */
16204 vty_out(vty
, " redistribute %s",
16205 zebra_route_string(i
));
16207 vty_out(vty
, " %d", red
->instance
);
16208 if (red
->redist_metric_flag
)
16209 vty_out(vty
, " metric %u",
16210 red
->redist_metric
);
16211 if (red
->rmap
.name
)
16212 vty_out(vty
, " route-map %s",
16214 vty_out(vty
, "\n");
16220 /* peer-group helpers for config-write */
16222 static bool peergroup_flag_check(struct peer
*peer
, uint32_t flag
)
16224 if (!peer_group_active(peer
)) {
16225 if (CHECK_FLAG(peer
->flags_invert
, flag
))
16226 return !CHECK_FLAG(peer
->flags
, flag
);
16228 return !!CHECK_FLAG(peer
->flags
, flag
);
16231 return !!CHECK_FLAG(peer
->flags_override
, flag
);
16234 static bool peergroup_af_flag_check(struct peer
*peer
, afi_t afi
, safi_t safi
,
16237 if (!peer_group_active(peer
)) {
16238 if (CHECK_FLAG(peer
->af_flags_invert
[afi
][safi
], flag
))
16239 return !peer_af_flag_check(peer
, afi
, safi
, flag
);
16241 return !!peer_af_flag_check(peer
, afi
, safi
, flag
);
16244 return !!CHECK_FLAG(peer
->af_flags_override
[afi
][safi
], flag
);
16247 static bool peergroup_filter_check(struct peer
*peer
, afi_t afi
, safi_t safi
,
16248 uint8_t type
, int direct
)
16250 struct bgp_filter
*filter
;
16252 if (peer_group_active(peer
))
16253 return !!CHECK_FLAG(peer
->filter_override
[afi
][safi
][direct
],
16256 filter
= &peer
->filter
[afi
][safi
];
16258 case PEER_FT_DISTRIBUTE_LIST
:
16259 return !!(filter
->dlist
[direct
].name
);
16260 case PEER_FT_FILTER_LIST
:
16261 return !!(filter
->aslist
[direct
].name
);
16262 case PEER_FT_PREFIX_LIST
:
16263 return !!(filter
->plist
[direct
].name
);
16264 case PEER_FT_ROUTE_MAP
:
16265 return !!(filter
->map
[direct
].name
);
16266 case PEER_FT_UNSUPPRESS_MAP
:
16267 return !!(filter
->usmap
.name
);
16268 case PEER_FT_ADVERTISE_MAP
:
16269 return !!(filter
->advmap
.aname
16270 && ((filter
->advmap
.condition
== direct
)
16271 && filter
->advmap
.cname
));
16277 /* Return true if the addpath type is set for peer and different from
16280 static bool peergroup_af_addpath_check(struct peer
*peer
, afi_t afi
,
16283 enum bgp_addpath_strat type
, g_type
;
16285 type
= peer
->addpath_type
[afi
][safi
];
16287 if (type
!= BGP_ADDPATH_NONE
) {
16288 if (peer_group_active(peer
)) {
16289 g_type
= peer
->group
->conf
->addpath_type
[afi
][safi
];
16291 if (type
!= g_type
)
16303 /* This is part of the address-family block (unicast only) */
16304 static void bgp_vpn_policy_config_write_afi(struct vty
*vty
, struct bgp
*bgp
,
16308 uint32_t tovpn_sid_index
= 0;
16310 if (bgp
->vpn_policy
[afi
].rmap_name
[BGP_VPN_POLICY_DIR_FROMVPN
]) {
16311 if (CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
16312 BGP_CONFIG_VRF_TO_VRF_IMPORT
))
16313 vty_out(vty
, "%*simport vrf route-map %s\n", indent
, "",
16314 bgp
->vpn_policy
[afi
]
16315 .rmap_name
[BGP_VPN_POLICY_DIR_FROMVPN
]);
16317 vty_out(vty
, "%*sroute-map vpn import %s\n", indent
, "",
16318 bgp
->vpn_policy
[afi
]
16319 .rmap_name
[BGP_VPN_POLICY_DIR_FROMVPN
]);
16321 if (CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
16322 BGP_CONFIG_VRF_TO_VRF_IMPORT
)
16323 || CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
16324 BGP_CONFIG_VRF_TO_VRF_EXPORT
))
16327 if (CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
16328 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
)) {
16330 vty_out(vty
, "%*slabel vpn export %s\n", indent
, "", "auto");
16333 if (bgp
->vpn_policy
[afi
].tovpn_label
!= MPLS_LABEL_NONE
) {
16334 vty_out(vty
, "%*slabel vpn export %u\n", indent
, "",
16335 bgp
->vpn_policy
[afi
].tovpn_label
);
16339 tovpn_sid_index
= bgp
->vpn_policy
[afi
].tovpn_sid_index
;
16340 if (CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
16341 BGP_VPN_POLICY_TOVPN_SID_AUTO
)) {
16342 vty_out(vty
, "%*ssid vpn export %s\n", indent
, "", "auto");
16343 } else if (tovpn_sid_index
!= 0) {
16344 vty_out(vty
, "%*ssid vpn export %d\n", indent
, "",
16348 if (CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
16349 BGP_VPN_POLICY_TOVPN_RD_SET
)) {
16350 char buf
[RD_ADDRSTRLEN
];
16351 vty_out(vty
, "%*srd vpn export %s\n", indent
, "",
16352 prefix_rd2str(&bgp
->vpn_policy
[afi
].tovpn_rd
, buf
,
16355 if (CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
16356 BGP_VPN_POLICY_TOVPN_NEXTHOP_SET
)) {
16358 char buf
[PREFIX_STRLEN
];
16359 if (inet_ntop(bgp
->vpn_policy
[afi
].tovpn_nexthop
.family
,
16360 &bgp
->vpn_policy
[afi
].tovpn_nexthop
.u
.prefix
, buf
,
16363 vty_out(vty
, "%*snexthop vpn export %s\n",
16367 if (bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
]
16368 && bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
]
16370 bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
],
16371 bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
])) {
16373 char *b
= ecommunity_ecom2str(
16374 bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
],
16375 ECOMMUNITY_FORMAT_ROUTE_MAP
, ECOMMUNITY_ROUTE_TARGET
);
16376 vty_out(vty
, "%*srt vpn both %s\n", indent
, "", b
);
16377 XFREE(MTYPE_ECOMMUNITY_STR
, b
);
16379 if (bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
]) {
16380 char *b
= ecommunity_ecom2str(
16381 bgp
->vpn_policy
[afi
]
16382 .rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
],
16383 ECOMMUNITY_FORMAT_ROUTE_MAP
,
16384 ECOMMUNITY_ROUTE_TARGET
);
16385 vty_out(vty
, "%*srt vpn import %s\n", indent
, "", b
);
16386 XFREE(MTYPE_ECOMMUNITY_STR
, b
);
16388 if (bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
]) {
16389 char *b
= ecommunity_ecom2str(
16390 bgp
->vpn_policy
[afi
]
16391 .rtlist
[BGP_VPN_POLICY_DIR_TOVPN
],
16392 ECOMMUNITY_FORMAT_ROUTE_MAP
,
16393 ECOMMUNITY_ROUTE_TARGET
);
16394 vty_out(vty
, "%*srt vpn export %s\n", indent
, "", b
);
16395 XFREE(MTYPE_ECOMMUNITY_STR
, b
);
16399 if (bgp
->vpn_policy
[afi
].rmap_name
[BGP_VPN_POLICY_DIR_TOVPN
])
16400 vty_out(vty
, "%*sroute-map vpn export %s\n", indent
, "",
16401 bgp
->vpn_policy
[afi
]
16402 .rmap_name
[BGP_VPN_POLICY_DIR_TOVPN
]);
16404 if (bgp
->vpn_policy
[afi
].import_redirect_rtlist
) {
16405 char *b
= ecommunity_ecom2str(
16406 bgp
->vpn_policy
[afi
]
16407 .import_redirect_rtlist
,
16408 ECOMMUNITY_FORMAT_ROUTE_MAP
,
16409 ECOMMUNITY_ROUTE_TARGET
);
16411 if (bgp
->vpn_policy
[afi
].import_redirect_rtlist
->unit_size
16412 != ECOMMUNITY_SIZE
)
16413 vty_out(vty
, "%*srt6 redirect import %s\n",
16416 vty_out(vty
, "%*srt redirect import %s\n",
16418 XFREE(MTYPE_ECOMMUNITY_STR
, b
);
16422 static void bgp_config_write_filter(struct vty
*vty
, struct peer
*peer
,
16423 afi_t afi
, safi_t safi
)
16425 struct bgp_filter
*filter
;
16429 filter
= &peer
->filter
[afi
][safi
];
16431 /* distribute-list. */
16432 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_DISTRIBUTE_LIST
,
16434 vty_out(vty
, " neighbor %s distribute-list %s in\n", addr
,
16435 filter
->dlist
[FILTER_IN
].name
);
16437 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_DISTRIBUTE_LIST
,
16439 vty_out(vty
, " neighbor %s distribute-list %s out\n", addr
,
16440 filter
->dlist
[FILTER_OUT
].name
);
16443 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_PREFIX_LIST
,
16445 vty_out(vty
, " neighbor %s prefix-list %s in\n", addr
,
16446 filter
->plist
[FILTER_IN
].name
);
16448 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_PREFIX_LIST
,
16450 vty_out(vty
, " neighbor %s prefix-list %s out\n", addr
,
16451 filter
->plist
[FILTER_OUT
].name
);
16454 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_ROUTE_MAP
, RMAP_IN
))
16455 vty_out(vty
, " neighbor %s route-map %s in\n", addr
,
16456 filter
->map
[RMAP_IN
].name
);
16458 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_ROUTE_MAP
,
16460 vty_out(vty
, " neighbor %s route-map %s out\n", addr
,
16461 filter
->map
[RMAP_OUT
].name
);
16463 /* unsuppress-map */
16464 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_UNSUPPRESS_MAP
, 0))
16465 vty_out(vty
, " neighbor %s unsuppress-map %s\n", addr
,
16466 filter
->usmap
.name
);
16468 /* advertise-map : always applied in OUT direction*/
16469 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_ADVERTISE_MAP
,
16470 CONDITION_NON_EXIST
))
16472 " neighbor %s advertise-map %s non-exist-map %s\n",
16473 addr
, filter
->advmap
.aname
, filter
->advmap
.cname
);
16475 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_ADVERTISE_MAP
,
16477 vty_out(vty
, " neighbor %s advertise-map %s exist-map %s\n",
16478 addr
, filter
->advmap
.aname
, filter
->advmap
.cname
);
16481 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_FILTER_LIST
,
16483 vty_out(vty
, " neighbor %s filter-list %s in\n", addr
,
16484 filter
->aslist
[FILTER_IN
].name
);
16486 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_FILTER_LIST
,
16488 vty_out(vty
, " neighbor %s filter-list %s out\n", addr
,
16489 filter
->aslist
[FILTER_OUT
].name
);
16492 /* BGP peer configuration display function. */
16493 static void bgp_config_write_peer_global(struct vty
*vty
, struct bgp
*bgp
,
16496 struct peer
*g_peer
= NULL
;
16497 char buf
[SU_ADDRSTRLEN
];
16499 int if_pg_printed
= false;
16500 int if_ras_printed
= false;
16502 /* Skip dynamic neighbors. */
16503 if (peer_dynamic_neighbor(peer
))
16507 addr
= peer
->conf_if
;
16511 /************************************
16512 ****** Global to the neighbor ******
16513 ************************************/
16514 if (peer
->conf_if
) {
16515 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
))
16516 vty_out(vty
, " neighbor %s interface v6only", addr
);
16518 vty_out(vty
, " neighbor %s interface", addr
);
16520 if (peer_group_active(peer
)) {
16521 vty_out(vty
, " peer-group %s", peer
->group
->name
);
16522 if_pg_printed
= true;
16523 } else if (peer
->as_type
== AS_SPECIFIED
) {
16524 vty_out(vty
, " remote-as %u", peer
->as
);
16525 if_ras_printed
= true;
16526 } else if (peer
->as_type
== AS_INTERNAL
) {
16527 vty_out(vty
, " remote-as internal");
16528 if_ras_printed
= true;
16529 } else if (peer
->as_type
== AS_EXTERNAL
) {
16530 vty_out(vty
, " remote-as external");
16531 if_ras_printed
= true;
16534 vty_out(vty
, "\n");
16537 /* remote-as and peer-group */
16538 /* peer is a member of a peer-group */
16539 if (peer_group_active(peer
)) {
16540 g_peer
= peer
->group
->conf
;
16542 if (g_peer
->as_type
== AS_UNSPECIFIED
&& !if_ras_printed
) {
16543 if (peer
->as_type
== AS_SPECIFIED
) {
16544 vty_out(vty
, " neighbor %s remote-as %u\n",
16546 } else if (peer
->as_type
== AS_INTERNAL
) {
16548 " neighbor %s remote-as internal\n",
16550 } else if (peer
->as_type
== AS_EXTERNAL
) {
16552 " neighbor %s remote-as external\n",
16557 /* For swpX peers we displayed the peer-group
16558 * via 'neighbor swpX interface peer-group PGNAME' */
16559 if (!if_pg_printed
)
16560 vty_out(vty
, " neighbor %s peer-group %s\n", addr
,
16561 peer
->group
->name
);
16564 /* peer is NOT a member of a peer-group */
16566 /* peer is a peer-group, declare the peer-group */
16567 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
16568 vty_out(vty
, " neighbor %s peer-group\n", addr
);
16571 if (!if_ras_printed
) {
16572 if (peer
->as_type
== AS_SPECIFIED
) {
16573 vty_out(vty
, " neighbor %s remote-as %u\n",
16575 } else if (peer
->as_type
== AS_INTERNAL
) {
16577 " neighbor %s remote-as internal\n",
16579 } else if (peer
->as_type
== AS_EXTERNAL
) {
16581 " neighbor %s remote-as external\n",
16588 if (peergroup_flag_check(peer
, PEER_FLAG_LOCAL_AS
)) {
16589 vty_out(vty
, " neighbor %s local-as %u", addr
,
16590 peer
->change_local_as
);
16591 if (peergroup_flag_check(peer
, PEER_FLAG_LOCAL_AS_NO_PREPEND
))
16592 vty_out(vty
, " no-prepend");
16593 if (peergroup_flag_check(peer
, PEER_FLAG_LOCAL_AS_REPLACE_AS
))
16594 vty_out(vty
, " replace-as");
16595 vty_out(vty
, "\n");
16600 vty_out(vty
, " neighbor %s description %s\n", addr
, peer
->desc
);
16604 if (peergroup_flag_check(peer
, PEER_FLAG_SHUTDOWN
)) {
16605 if (peer
->tx_shutdown_message
)
16606 vty_out(vty
, " neighbor %s shutdown message %s\n", addr
,
16607 peer
->tx_shutdown_message
);
16609 vty_out(vty
, " neighbor %s shutdown\n", addr
);
16612 if (peergroup_flag_check(peer
, PEER_FLAG_RTT_SHUTDOWN
))
16613 vty_out(vty
, " neighbor %s shutdown rtt %u count %u\n", addr
,
16614 peer
->rtt_expected
, peer
->rtt_keepalive_conf
);
16617 if (peer
->bfd_config
)
16618 bgp_bfd_peer_config_write(vty
, peer
, addr
);
16621 if (peergroup_flag_check(peer
, PEER_FLAG_PASSWORD
))
16622 vty_out(vty
, " neighbor %s password %s\n", addr
,
16625 /* neighbor solo */
16626 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_LONESOUL
)) {
16627 if (!peer_group_active(peer
)) {
16628 vty_out(vty
, " neighbor %s solo\n", addr
);
16633 if (peer
->port
!= BGP_PORT_DEFAULT
) {
16634 vty_out(vty
, " neighbor %s port %d\n", addr
, peer
->port
);
16637 /* Local interface name */
16638 if (peer
->ifname
) {
16639 vty_out(vty
, " neighbor %s interface %s\n", addr
, peer
->ifname
);
16642 /* TCP max segment size */
16643 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_TCP_MSS
))
16644 vty_out(vty
, " neighbor %s tcp-mss %d\n", addr
, peer
->tcp_mss
);
16647 if (peergroup_flag_check(peer
, PEER_FLAG_PASSIVE
))
16648 vty_out(vty
, " neighbor %s passive\n", addr
);
16650 /* ebgp-multihop */
16651 if (peer
->sort
!= BGP_PEER_IBGP
&& peer
->ttl
!= BGP_DEFAULT_TTL
16652 && !(peer
->gtsm_hops
!= BGP_GTSM_HOPS_DISABLED
16653 && peer
->ttl
== MAXTTL
)) {
16654 if (!peer_group_active(peer
) || g_peer
->ttl
!= peer
->ttl
) {
16655 vty_out(vty
, " neighbor %s ebgp-multihop %d\n", addr
,
16660 /* ttl-security hops */
16661 if (peer
->gtsm_hops
!= BGP_GTSM_HOPS_DISABLED
) {
16662 if (!peer_group_active(peer
)
16663 || g_peer
->gtsm_hops
!= peer
->gtsm_hops
) {
16664 vty_out(vty
, " neighbor %s ttl-security hops %d\n",
16665 addr
, peer
->gtsm_hops
);
16669 /* disable-connected-check */
16670 if (peergroup_flag_check(peer
, PEER_FLAG_DISABLE_CONNECTED_CHECK
))
16671 vty_out(vty
, " neighbor %s disable-connected-check\n", addr
);
16673 /* link-bw-encoding-ieee */
16674 if (peergroup_flag_check(peer
, PEER_FLAG_DISABLE_LINK_BW_ENCODING_IEEE
))
16675 vty_out(vty
, " neighbor %s disable-link-bw-encoding-ieee\n",
16678 /* extended-optional-parameters */
16679 if (peergroup_flag_check(peer
, PEER_FLAG_EXTENDED_OPT_PARAMS
))
16680 vty_out(vty
, " neighbor %s extended-optional-parameters\n",
16683 /* enforce-first-as */
16684 if (peergroup_flag_check(peer
, PEER_FLAG_ENFORCE_FIRST_AS
))
16685 vty_out(vty
, " neighbor %s enforce-first-as\n", addr
);
16687 /* update-source */
16688 if (peergroup_flag_check(peer
, PEER_FLAG_UPDATE_SOURCE
)) {
16689 if (peer
->update_source
)
16690 vty_out(vty
, " neighbor %s update-source %s\n", addr
,
16691 sockunion2str(peer
->update_source
, buf
,
16693 else if (peer
->update_if
)
16694 vty_out(vty
, " neighbor %s update-source %s\n", addr
,
16698 /* advertisement-interval */
16699 if (peergroup_flag_check(peer
, PEER_FLAG_ROUTEADV
))
16700 vty_out(vty
, " neighbor %s advertisement-interval %u\n", addr
,
16704 if (peergroup_flag_check(peer
, PEER_FLAG_TIMER
))
16705 vty_out(vty
, " neighbor %s timers %u %u\n", addr
,
16706 peer
->keepalive
, peer
->holdtime
);
16708 /* timers connect */
16709 if (peergroup_flag_check(peer
, PEER_FLAG_TIMER_CONNECT
))
16710 vty_out(vty
, " neighbor %s timers connect %u\n", addr
,
16712 /* need special-case handling for changed default values due to
16713 * config profile / version (because there is no "timers bgp connect"
16714 * command, we need to save this per-peer :/)
16716 else if (!peer_group_active(peer
) && !peer
->connect
&&
16717 peer
->bgp
->default_connect_retry
!= SAVE_BGP_CONNECT_RETRY
)
16718 vty_out(vty
, " neighbor %s timers connect %u\n", addr
,
16719 peer
->bgp
->default_connect_retry
);
16721 /* timers delayopen */
16722 if (peergroup_flag_check(peer
, PEER_FLAG_TIMER_DELAYOPEN
))
16723 vty_out(vty
, " neighbor %s timers delayopen %u\n", addr
,
16725 /* Save config even though flag is not set if default values have been
16728 else if (!peer_group_active(peer
) && !peer
->delayopen
16729 && peer
->bgp
->default_delayopen
!= BGP_DEFAULT_DELAYOPEN
)
16730 vty_out(vty
, " neighbor %s timers delayopen %u\n", addr
,
16731 peer
->bgp
->default_delayopen
);
16733 /* capability dynamic */
16734 if (peergroup_flag_check(peer
, PEER_FLAG_DYNAMIC_CAPABILITY
))
16735 vty_out(vty
, " neighbor %s capability dynamic\n", addr
);
16737 /* capability extended-nexthop */
16738 if (peergroup_flag_check(peer
, PEER_FLAG_CAPABILITY_ENHE
)) {
16739 if (CHECK_FLAG(peer
->flags_invert
, PEER_FLAG_CAPABILITY_ENHE
) &&
16742 " no neighbor %s capability extended-nexthop\n",
16744 else if (!peer
->conf_if
)
16746 " neighbor %s capability extended-nexthop\n",
16750 /* dont-capability-negotiation */
16751 if (peergroup_flag_check(peer
, PEER_FLAG_DONT_CAPABILITY
))
16752 vty_out(vty
, " neighbor %s dont-capability-negotiate\n", addr
);
16754 /* override-capability */
16755 if (peergroup_flag_check(peer
, PEER_FLAG_OVERRIDE_CAPABILITY
))
16756 vty_out(vty
, " neighbor %s override-capability\n", addr
);
16758 /* strict-capability-match */
16759 if (peergroup_flag_check(peer
, PEER_FLAG_STRICT_CAP_MATCH
))
16760 vty_out(vty
, " neighbor %s strict-capability-match\n", addr
);
16762 /* Sender side AS path loop detection. */
16763 if (peer
->as_path_loop_detection
)
16764 vty_out(vty
, " neighbor %s sender-as-path-loop-detection\n",
16767 if (!CHECK_FLAG(peer
->peer_gr_new_status_flag
,
16768 PEER_GRACEFUL_RESTART_NEW_STATE_INHERIT
)) {
16770 if (CHECK_FLAG(peer
->peer_gr_new_status_flag
,
16771 PEER_GRACEFUL_RESTART_NEW_STATE_HELPER
)) {
16773 " neighbor %s graceful-restart-helper\n", addr
);
16774 } else if (CHECK_FLAG(
16775 peer
->peer_gr_new_status_flag
,
16776 PEER_GRACEFUL_RESTART_NEW_STATE_RESTART
)) {
16778 " neighbor %s graceful-restart\n", addr
);
16780 (!(CHECK_FLAG(peer
->peer_gr_new_status_flag
,
16781 PEER_GRACEFUL_RESTART_NEW_STATE_HELPER
))
16783 peer
->peer_gr_new_status_flag
,
16784 PEER_GRACEFUL_RESTART_NEW_STATE_RESTART
)))) {
16785 vty_out(vty
, " neighbor %s graceful-restart-disable\n",
16791 /* BGP peer configuration display function. */
16792 static void bgp_config_write_peer_af(struct vty
*vty
, struct bgp
*bgp
,
16793 struct peer
*peer
, afi_t afi
, safi_t safi
)
16795 struct peer
*g_peer
= NULL
;
16797 bool flag_scomm
, flag_secomm
, flag_slcomm
;
16799 /* Skip dynamic neighbors. */
16800 if (peer_dynamic_neighbor(peer
))
16804 addr
= peer
->conf_if
;
16808 /************************************
16809 ****** Per AF to the neighbor ******
16810 ************************************/
16811 if (peer_group_active(peer
)) {
16812 g_peer
= peer
->group
->conf
;
16814 /* If the peer-group is active but peer is not, print a 'no
16816 if (g_peer
->afc
[afi
][safi
] && !peer
->afc
[afi
][safi
]) {
16817 vty_out(vty
, " no neighbor %s activate\n", addr
);
16820 /* If the peer-group is not active but peer is, print an
16822 else if (!g_peer
->afc
[afi
][safi
] && peer
->afc
[afi
][safi
]) {
16823 vty_out(vty
, " neighbor %s activate\n", addr
);
16826 if (peer
->afc
[afi
][safi
]) {
16827 if (safi
== SAFI_ENCAP
)
16828 vty_out(vty
, " neighbor %s activate\n", addr
);
16829 else if (!bgp
->default_af
[afi
][safi
])
16830 vty_out(vty
, " neighbor %s activate\n", addr
);
16832 if (bgp
->default_af
[afi
][safi
])
16833 vty_out(vty
, " no neighbor %s activate\n",
16838 /* addpath TX knobs */
16839 if (peergroup_af_addpath_check(peer
, afi
, safi
)) {
16840 switch (peer
->addpath_type
[afi
][safi
]) {
16841 case BGP_ADDPATH_ALL
:
16842 vty_out(vty
, " neighbor %s addpath-tx-all-paths\n",
16845 case BGP_ADDPATH_BEST_PER_AS
:
16847 " neighbor %s addpath-tx-bestpath-per-AS\n",
16850 case BGP_ADDPATH_MAX
:
16851 case BGP_ADDPATH_NONE
:
16856 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
], PEER_FLAG_DISABLE_ADDPATH_RX
))
16857 vty_out(vty
, " neighbor %s disable-addpath-rx\n", addr
);
16859 /* ORF capability. */
16860 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_ORF_PREFIX_SM
)
16861 || peergroup_af_flag_check(peer
, afi
, safi
,
16862 PEER_FLAG_ORF_PREFIX_RM
)) {
16863 vty_out(vty
, " neighbor %s capability orf prefix-list", addr
);
16865 if (peergroup_af_flag_check(peer
, afi
, safi
,
16866 PEER_FLAG_ORF_PREFIX_SM
)
16867 && peergroup_af_flag_check(peer
, afi
, safi
,
16868 PEER_FLAG_ORF_PREFIX_RM
))
16869 vty_out(vty
, " both");
16870 else if (peergroup_af_flag_check(peer
, afi
, safi
,
16871 PEER_FLAG_ORF_PREFIX_SM
))
16872 vty_out(vty
, " send");
16874 vty_out(vty
, " receive");
16875 vty_out(vty
, "\n");
16878 /* Route reflector client. */
16879 if (peergroup_af_flag_check(peer
, afi
, safi
,
16880 PEER_FLAG_REFLECTOR_CLIENT
)) {
16881 vty_out(vty
, " neighbor %s route-reflector-client\n", addr
);
16884 /* next-hop-self force */
16885 if (peergroup_af_flag_check(peer
, afi
, safi
,
16886 PEER_FLAG_FORCE_NEXTHOP_SELF
)) {
16887 vty_out(vty
, " neighbor %s next-hop-self force\n", addr
);
16890 /* next-hop-self */
16891 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_NEXTHOP_SELF
)) {
16892 vty_out(vty
, " neighbor %s next-hop-self\n", addr
);
16895 /* remove-private-AS */
16896 if (peergroup_af_flag_check(peer
, afi
, safi
,
16897 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
)) {
16898 vty_out(vty
, " neighbor %s remove-private-AS all replace-AS\n",
16902 else if (peergroup_af_flag_check(peer
, afi
, safi
,
16903 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
)) {
16904 vty_out(vty
, " neighbor %s remove-private-AS replace-AS\n",
16908 else if (peergroup_af_flag_check(peer
, afi
, safi
,
16909 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
)) {
16910 vty_out(vty
, " neighbor %s remove-private-AS all\n", addr
);
16913 else if (peergroup_af_flag_check(peer
, afi
, safi
,
16914 PEER_FLAG_REMOVE_PRIVATE_AS
)) {
16915 vty_out(vty
, " neighbor %s remove-private-AS\n", addr
);
16919 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_AS_OVERRIDE
)) {
16920 vty_out(vty
, " neighbor %s as-override\n", addr
);
16923 /* send-community print. */
16924 flag_scomm
= peergroup_af_flag_check(peer
, afi
, safi
,
16925 PEER_FLAG_SEND_COMMUNITY
);
16926 flag_secomm
= peergroup_af_flag_check(peer
, afi
, safi
,
16927 PEER_FLAG_SEND_EXT_COMMUNITY
);
16928 flag_slcomm
= peergroup_af_flag_check(peer
, afi
, safi
,
16929 PEER_FLAG_SEND_LARGE_COMMUNITY
);
16931 if (flag_scomm
&& flag_secomm
&& flag_slcomm
) {
16932 vty_out(vty
, " no neighbor %s send-community all\n", addr
);
16935 vty_out(vty
, " no neighbor %s send-community\n", addr
);
16938 " no neighbor %s send-community extended\n",
16942 vty_out(vty
, " no neighbor %s send-community large\n",
16946 /* Default information */
16947 if (peergroup_af_flag_check(peer
, afi
, safi
,
16948 PEER_FLAG_DEFAULT_ORIGINATE
)) {
16949 vty_out(vty
, " neighbor %s default-originate", addr
);
16951 if (peer
->default_rmap
[afi
][safi
].name
)
16952 vty_out(vty
, " route-map %s",
16953 peer
->default_rmap
[afi
][safi
].name
);
16955 vty_out(vty
, "\n");
16958 /* Soft reconfiguration inbound. */
16959 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_SOFT_RECONFIG
)) {
16960 vty_out(vty
, " neighbor %s soft-reconfiguration inbound\n",
16964 /* maximum-prefix. */
16965 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX
)) {
16966 vty_out(vty
, " neighbor %s maximum-prefix %u", addr
,
16967 peer
->pmax
[afi
][safi
]);
16969 if (peer
->pmax_threshold
[afi
][safi
]
16970 != MAXIMUM_PREFIX_THRESHOLD_DEFAULT
)
16971 vty_out(vty
, " %u", peer
->pmax_threshold
[afi
][safi
]);
16972 if (peer_af_flag_check(peer
, afi
, safi
,
16973 PEER_FLAG_MAX_PREFIX_WARNING
))
16974 vty_out(vty
, " warning-only");
16975 if (peer
->pmax_restart
[afi
][safi
])
16976 vty_out(vty
, " restart %u",
16977 peer
->pmax_restart
[afi
][safi
]);
16978 if (peer_af_flag_check(peer
, afi
, safi
,
16979 PEER_FLAG_MAX_PREFIX_FORCE
))
16980 vty_out(vty
, " force");
16982 vty_out(vty
, "\n");
16985 /* maximum-prefix-out */
16986 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX_OUT
))
16987 vty_out(vty
, " neighbor %s maximum-prefix-out %u\n",
16988 addr
, peer
->pmax_out
[afi
][safi
]);
16990 /* Route server client. */
16991 if (peergroup_af_flag_check(peer
, afi
, safi
,
16992 PEER_FLAG_RSERVER_CLIENT
)) {
16993 vty_out(vty
, " neighbor %s route-server-client\n", addr
);
16996 /* Nexthop-local unchanged. */
16997 if (peergroup_af_flag_check(peer
, afi
, safi
,
16998 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
)) {
16999 vty_out(vty
, " neighbor %s nexthop-local unchanged\n", addr
);
17002 /* allowas-in <1-10> */
17003 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
)) {
17004 if (peer_af_flag_check(peer
, afi
, safi
,
17005 PEER_FLAG_ALLOWAS_IN_ORIGIN
)) {
17006 vty_out(vty
, " neighbor %s allowas-in origin\n", addr
);
17007 } else if (peer
->allowas_in
[afi
][safi
] == 3) {
17008 vty_out(vty
, " neighbor %s allowas-in\n", addr
);
17010 vty_out(vty
, " neighbor %s allowas-in %d\n", addr
,
17011 peer
->allowas_in
[afi
][safi
]);
17016 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_WEIGHT
))
17017 vty_out(vty
, " neighbor %s weight %lu\n", addr
,
17018 peer
->weight
[afi
][safi
]);
17021 bgp_config_write_filter(vty
, peer
, afi
, safi
);
17023 /* atribute-unchanged. */
17024 if (peer_af_flag_check(peer
, afi
, safi
, PEER_FLAG_AS_PATH_UNCHANGED
)
17025 || (safi
!= SAFI_EVPN
17026 && peer_af_flag_check(peer
, afi
, safi
,
17027 PEER_FLAG_NEXTHOP_UNCHANGED
))
17028 || peer_af_flag_check(peer
, afi
, safi
, PEER_FLAG_MED_UNCHANGED
)) {
17030 if (!peer_group_active(peer
)
17031 || peergroup_af_flag_check(peer
, afi
, safi
,
17032 PEER_FLAG_AS_PATH_UNCHANGED
)
17033 || peergroup_af_flag_check(peer
, afi
, safi
,
17034 PEER_FLAG_NEXTHOP_UNCHANGED
)
17035 || peergroup_af_flag_check(peer
, afi
, safi
,
17036 PEER_FLAG_MED_UNCHANGED
)) {
17039 " neighbor %s attribute-unchanged%s%s%s\n",
17041 peer_af_flag_check(peer
, afi
, safi
,
17042 PEER_FLAG_AS_PATH_UNCHANGED
)
17045 peer_af_flag_check(peer
, afi
, safi
,
17046 PEER_FLAG_NEXTHOP_UNCHANGED
)
17049 peer_af_flag_check(peer
, afi
, safi
,
17050 PEER_FLAG_MED_UNCHANGED
)
17057 /* Address family based peer configuration display. */
17058 static void bgp_config_write_family(struct vty
*vty
, struct bgp
*bgp
, afi_t afi
,
17062 struct peer_group
*group
;
17063 struct listnode
*node
, *nnode
;
17066 vty_frame(vty
, " !\n address-family ");
17067 if (afi
== AFI_IP
) {
17068 if (safi
== SAFI_UNICAST
)
17069 vty_frame(vty
, "ipv4 unicast");
17070 else if (safi
== SAFI_LABELED_UNICAST
)
17071 vty_frame(vty
, "ipv4 labeled-unicast");
17072 else if (safi
== SAFI_MULTICAST
)
17073 vty_frame(vty
, "ipv4 multicast");
17074 else if (safi
== SAFI_MPLS_VPN
)
17075 vty_frame(vty
, "ipv4 vpn");
17076 else if (safi
== SAFI_ENCAP
)
17077 vty_frame(vty
, "ipv4 encap");
17078 else if (safi
== SAFI_FLOWSPEC
)
17079 vty_frame(vty
, "ipv4 flowspec");
17080 } else if (afi
== AFI_IP6
) {
17081 if (safi
== SAFI_UNICAST
)
17082 vty_frame(vty
, "ipv6 unicast");
17083 else if (safi
== SAFI_LABELED_UNICAST
)
17084 vty_frame(vty
, "ipv6 labeled-unicast");
17085 else if (safi
== SAFI_MULTICAST
)
17086 vty_frame(vty
, "ipv6 multicast");
17087 else if (safi
== SAFI_MPLS_VPN
)
17088 vty_frame(vty
, "ipv6 vpn");
17089 else if (safi
== SAFI_ENCAP
)
17090 vty_frame(vty
, "ipv6 encap");
17091 else if (safi
== SAFI_FLOWSPEC
)
17092 vty_frame(vty
, "ipv6 flowspec");
17093 } else if (afi
== AFI_L2VPN
) {
17094 if (safi
== SAFI_EVPN
)
17095 vty_frame(vty
, "l2vpn evpn");
17097 vty_frame(vty
, "\n");
17099 bgp_config_write_distance(vty
, bgp
, afi
, safi
);
17101 bgp_config_write_network(vty
, bgp
, afi
, safi
);
17103 bgp_config_write_redistribute(vty
, bgp
, afi
, safi
);
17105 /* BGP flag dampening. */
17106 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
], BGP_CONFIG_DAMPENING
))
17107 bgp_config_write_damp(vty
, afi
, safi
);
17109 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
))
17110 bgp_config_write_peer_af(vty
, bgp
, group
->conf
, afi
, safi
);
17112 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
17113 /* Do not display doppelganger peers */
17114 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
17115 bgp_config_write_peer_af(vty
, bgp
, peer
, afi
, safi
);
17118 bgp_config_write_maxpaths(vty
, bgp
, afi
, safi
);
17119 bgp_config_write_table_map(vty
, bgp
, afi
, safi
);
17121 if (safi
== SAFI_EVPN
)
17122 bgp_config_write_evpn_info(vty
, bgp
, afi
, safi
);
17124 if (safi
== SAFI_FLOWSPEC
)
17125 bgp_fs_config_write_pbr(vty
, bgp
, afi
, safi
);
17127 if (safi
== SAFI_UNICAST
) {
17128 bgp_vpn_policy_config_write_afi(vty
, bgp
, afi
);
17129 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
17130 BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT
)) {
17132 vty_out(vty
, " export vpn\n");
17134 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
17135 BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT
)) {
17137 vty_out(vty
, " import vpn\n");
17139 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
17140 BGP_CONFIG_VRF_TO_VRF_IMPORT
)) {
17143 for (ALL_LIST_ELEMENTS_RO(
17144 bgp
->vpn_policy
[afi
].import_vrf
, node
,
17146 vty_out(vty
, " import vrf %s\n", name
);
17150 vty_endframe(vty
, " exit-address-family\n");
17153 int bgp_config_write(struct vty
*vty
)
17156 struct peer_group
*group
;
17158 struct listnode
*node
, *nnode
;
17159 struct listnode
*mnode
, *mnnode
;
17163 if (bm
->rmap_update_timer
!= RMAP_DEFAULT_UPDATE_TIMER
)
17164 vty_out(vty
, "bgp route-map delay-timer %u\n",
17165 bm
->rmap_update_timer
);
17167 if (bm
->v_update_delay
!= BGP_UPDATE_DELAY_DEF
) {
17168 vty_out(vty
, "bgp update-delay %d", bm
->v_update_delay
);
17169 if (bm
->v_update_delay
!= bm
->v_establish_wait
)
17170 vty_out(vty
, " %d", bm
->v_establish_wait
);
17171 vty_out(vty
, "\n");
17174 if (bm
->wait_for_fib
)
17175 vty_out(vty
, "bgp suppress-fib-pending\n");
17177 if (CHECK_FLAG(bm
->flags
, BM_FLAG_GRACEFUL_SHUTDOWN
))
17178 vty_out(vty
, "bgp graceful-shutdown\n");
17180 /* No-RIB (Zebra) option flag configuration */
17181 if (bgp_option_check(BGP_OPT_NO_FIB
))
17182 vty_out(vty
, "bgp no-rib\n");
17184 if (CHECK_FLAG(bm
->flags
, BM_FLAG_SEND_EXTRA_DATA_TO_ZEBRA
))
17185 vty_out(vty
, "bgp send-extra-data zebra\n");
17187 /* BGP session DSCP value */
17188 if (bm
->tcp_dscp
!= IPTOS_PREC_INTERNETCONTROL
)
17189 vty_out(vty
, "bgp session-dscp %u\n", bm
->tcp_dscp
>> 2);
17191 /* BGP configuration. */
17192 for (ALL_LIST_ELEMENTS(bm
->bgp
, mnode
, mnnode
, bgp
)) {
17194 /* skip all auto created vrf as they dont have user config */
17195 if (CHECK_FLAG(bgp
->vrf_flags
, BGP_VRF_AUTO
))
17198 /* Router bgp ASN */
17199 vty_out(vty
, "router bgp %u", bgp
->as
);
17202 vty_out(vty
, " %s %s",
17203 (bgp
->inst_type
== BGP_INSTANCE_TYPE_VIEW
)
17204 ? "view" : "vrf", bgp
->name
);
17205 vty_out(vty
, "\n");
17207 /* BGP fast-external-failover. */
17208 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_NO_FAST_EXT_FAILOVER
))
17209 vty_out(vty
, " no bgp fast-external-failover\n");
17211 /* BGP router ID. */
17212 if (bgp
->router_id_static
.s_addr
!= INADDR_ANY
)
17213 vty_out(vty
, " bgp router-id %pI4\n",
17214 &bgp
->router_id_static
);
17216 /* Suppress fib pending */
17217 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_SUPPRESS_FIB_PENDING
))
17218 vty_out(vty
, " bgp suppress-fib-pending\n");
17220 /* BGP log-neighbor-changes. */
17221 if (!!CHECK_FLAG(bgp
->flags
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
)
17222 != SAVE_BGP_LOG_NEIGHBOR_CHANGES
)
17223 vty_out(vty
, " %sbgp log-neighbor-changes\n",
17224 CHECK_FLAG(bgp
->flags
,
17225 BGP_FLAG_LOG_NEIGHBOR_CHANGES
)
17229 /* BGP configuration. */
17230 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_ALWAYS_COMPARE_MED
))
17231 vty_out(vty
, " bgp always-compare-med\n");
17233 /* RFC8212 default eBGP policy. */
17234 if (!!CHECK_FLAG(bgp
->flags
, BGP_FLAG_EBGP_REQUIRES_POLICY
)
17235 != SAVE_BGP_EBGP_REQUIRES_POLICY
)
17236 vty_out(vty
, " %sbgp ebgp-requires-policy\n",
17237 CHECK_FLAG(bgp
->flags
,
17238 BGP_FLAG_EBGP_REQUIRES_POLICY
)
17242 /* draft-ietf-idr-deprecate-as-set-confed-set */
17243 if (bgp
->reject_as_sets
)
17244 vty_out(vty
, " bgp reject-as-sets\n");
17246 /* Suppress duplicate updates if the route actually not changed
17248 if (!!CHECK_FLAG(bgp
->flags
, BGP_FLAG_SUPPRESS_DUPLICATES
)
17249 != SAVE_BGP_SUPPRESS_DUPLICATES
)
17250 vty_out(vty
, " %sbgp suppress-duplicates\n",
17251 CHECK_FLAG(bgp
->flags
,
17252 BGP_FLAG_SUPPRESS_DUPLICATES
)
17256 /* Send Hard Reset CEASE Notification for 'Administrative Reset'
17258 if (!!CHECK_FLAG(bgp
->flags
, BGP_FLAG_HARD_ADMIN_RESET
) !=
17259 SAVE_BGP_HARD_ADMIN_RESET
)
17260 vty_out(vty
, " %sbgp hard-administrative-reset\n",
17261 CHECK_FLAG(bgp
->flags
,
17262 BGP_FLAG_HARD_ADMIN_RESET
)
17266 /* BGP default <afi>-<safi> */
17267 FOREACH_AFI_SAFI (afi
, safi
) {
17268 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
) {
17269 if (!bgp
->default_af
[afi
][safi
])
17270 vty_out(vty
, " no bgp default %s\n",
17271 get_bgp_default_af_flag(afi
,
17273 } else if (bgp
->default_af
[afi
][safi
])
17274 vty_out(vty
, " bgp default %s\n",
17275 get_bgp_default_af_flag(afi
, safi
));
17278 /* BGP default local-preference. */
17279 if (bgp
->default_local_pref
!= BGP_DEFAULT_LOCAL_PREF
)
17280 vty_out(vty
, " bgp default local-preference %u\n",
17281 bgp
->default_local_pref
);
17283 /* BGP default show-hostname */
17284 if (!!CHECK_FLAG(bgp
->flags
, BGP_FLAG_SHOW_HOSTNAME
)
17285 != SAVE_BGP_SHOW_HOSTNAME
)
17286 vty_out(vty
, " %sbgp default show-hostname\n",
17287 CHECK_FLAG(bgp
->flags
, BGP_FLAG_SHOW_HOSTNAME
)
17291 /* BGP default show-nexthop-hostname */
17292 if (!!CHECK_FLAG(bgp
->flags
, BGP_FLAG_SHOW_NEXTHOP_HOSTNAME
)
17293 != SAVE_BGP_SHOW_HOSTNAME
)
17294 vty_out(vty
, " %sbgp default show-nexthop-hostname\n",
17295 CHECK_FLAG(bgp
->flags
,
17296 BGP_FLAG_SHOW_NEXTHOP_HOSTNAME
)
17300 /* BGP default subgroup-pkt-queue-max. */
17301 if (bgp
->default_subgroup_pkt_queue_max
17302 != BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX
)
17303 vty_out(vty
, " bgp default subgroup-pkt-queue-max %u\n",
17304 bgp
->default_subgroup_pkt_queue_max
);
17306 /* BGP client-to-client reflection. */
17307 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_NO_CLIENT_TO_CLIENT
))
17308 vty_out(vty
, " no bgp client-to-client reflection\n");
17310 /* BGP cluster ID. */
17311 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CLUSTER_ID
))
17312 vty_out(vty
, " bgp cluster-id %pI4\n",
17315 /* Disable ebgp connected nexthop check */
17316 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_DISABLE_NH_CONNECTED_CHK
))
17318 " bgp disable-ebgp-connected-route-check\n");
17320 /* Confederation identifier*/
17321 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
))
17322 vty_out(vty
, " bgp confederation identifier %u\n",
17325 /* Confederation peer */
17326 if (bgp
->confed_peers_cnt
> 0) {
17329 vty_out(vty
, " bgp confederation peers");
17331 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
17332 vty_out(vty
, " %u", bgp
->confed_peers
[i
]);
17334 vty_out(vty
, "\n");
17337 /* BGP deterministic-med. */
17338 if (!!CHECK_FLAG(bgp
->flags
, BGP_FLAG_DETERMINISTIC_MED
)
17339 != SAVE_BGP_DETERMINISTIC_MED
)
17340 vty_out(vty
, " %sbgp deterministic-med\n",
17341 CHECK_FLAG(bgp
->flags
,
17342 BGP_FLAG_DETERMINISTIC_MED
)
17346 /* BGP update-delay. */
17347 bgp_config_write_update_delay(vty
, bgp
);
17349 if (bgp
->v_maxmed_onstartup
17350 != BGP_MAXMED_ONSTARTUP_UNCONFIGURED
) {
17351 vty_out(vty
, " bgp max-med on-startup %u",
17352 bgp
->v_maxmed_onstartup
);
17353 if (bgp
->maxmed_onstartup_value
17354 != BGP_MAXMED_VALUE_DEFAULT
)
17355 vty_out(vty
, " %u",
17356 bgp
->maxmed_onstartup_value
);
17357 vty_out(vty
, "\n");
17359 if (bgp
->v_maxmed_admin
!= BGP_MAXMED_ADMIN_UNCONFIGURED
) {
17360 vty_out(vty
, " bgp max-med administrative");
17361 if (bgp
->maxmed_admin_value
!= BGP_MAXMED_VALUE_DEFAULT
)
17362 vty_out(vty
, " %u", bgp
->maxmed_admin_value
);
17363 vty_out(vty
, "\n");
17367 bgp_config_write_wpkt_quanta(vty
, bgp
);
17369 bgp_config_write_rpkt_quanta(vty
, bgp
);
17371 /* coalesce time */
17372 bgp_config_write_coalesce_time(vty
, bgp
);
17374 /* BGP per-instance graceful-shutdown */
17375 /* BGP-wide settings and per-instance settings are mutually
17378 if (!CHECK_FLAG(bm
->flags
, BM_FLAG_GRACEFUL_SHUTDOWN
))
17379 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_GRACEFUL_SHUTDOWN
))
17380 vty_out(vty
, " bgp graceful-shutdown\n");
17382 /* Long-lived Graceful Restart */
17383 if (bgp
->llgr_stale_time
!= BGP_DEFAULT_LLGR_STALE_TIME
)
17385 " bgp long-lived-graceful-restart stale-time %u\n",
17386 bgp
->llgr_stale_time
);
17388 /* BGP graceful-restart. */
17389 if (bgp
->stalepath_time
!= BGP_DEFAULT_STALEPATH_TIME
)
17391 " bgp graceful-restart stalepath-time %u\n",
17392 bgp
->stalepath_time
);
17394 if (bgp
->restart_time
!= BGP_DEFAULT_RESTART_TIME
)
17395 vty_out(vty
, " bgp graceful-restart restart-time %u\n",
17396 bgp
->restart_time
);
17398 if (!!CHECK_FLAG(bgp
->flags
, BGP_FLAG_GRACEFUL_NOTIFICATION
) !=
17399 SAVE_BGP_GRACEFUL_NOTIFICATION
)
17400 vty_out(vty
, " %sbgp graceful-restart notification\n",
17401 CHECK_FLAG(bgp
->flags
,
17402 BGP_FLAG_GRACEFUL_NOTIFICATION
)
17406 if (bgp
->select_defer_time
!= BGP_DEFAULT_SELECT_DEFERRAL_TIME
)
17408 " bgp graceful-restart select-defer-time %u\n",
17409 bgp
->select_defer_time
);
17411 if (bgp_global_gr_mode_get(bgp
) == GLOBAL_GR
)
17412 vty_out(vty
, " bgp graceful-restart\n");
17414 if (bgp_global_gr_mode_get(bgp
) == GLOBAL_DISABLE
)
17415 vty_out(vty
, " bgp graceful-restart-disable\n");
17417 /* BGP graceful-restart Preserve State F bit. */
17418 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_GR_PRESERVE_FWD
))
17420 " bgp graceful-restart preserve-fw-state\n");
17422 /* Stale timer for RIB */
17423 if (bgp
->rib_stale_time
!= BGP_DEFAULT_RIB_STALE_TIME
)
17425 " bgp graceful-restart rib-stale-time %u\n",
17426 bgp
->rib_stale_time
);
17428 /* BGP bestpath method. */
17429 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_ASPATH_IGNORE
))
17430 vty_out(vty
, " bgp bestpath as-path ignore\n");
17431 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_ASPATH_CONFED
))
17432 vty_out(vty
, " bgp bestpath as-path confed\n");
17434 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
)) {
17435 if (CHECK_FLAG(bgp
->flags
,
17436 BGP_FLAG_MULTIPATH_RELAX_AS_SET
)) {
17438 " bgp bestpath as-path multipath-relax as-set\n");
17441 " bgp bestpath as-path multipath-relax\n");
17445 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
)) {
17447 " bgp route-reflector allow-outbound-policy\n");
17449 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_COMPARE_ROUTER_ID
))
17450 vty_out(vty
, " bgp bestpath compare-routerid\n");
17451 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_MED_CONFED
)
17452 || CHECK_FLAG(bgp
->flags
, BGP_FLAG_MED_MISSING_AS_WORST
)) {
17453 vty_out(vty
, " bgp bestpath med");
17454 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_MED_CONFED
))
17455 vty_out(vty
, " confed");
17456 if (CHECK_FLAG(bgp
->flags
,
17457 BGP_FLAG_MED_MISSING_AS_WORST
))
17458 vty_out(vty
, " missing-as-worst");
17459 vty_out(vty
, "\n");
17462 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_PEERTYPE_MULTIPATH_RELAX
))
17464 " bgp bestpath peer-type multipath-relax\n");
17466 /* Link bandwidth handling. */
17467 if (bgp
->lb_handling
== BGP_LINK_BW_IGNORE_BW
)
17468 vty_out(vty
, " bgp bestpath bandwidth ignore\n");
17469 else if (bgp
->lb_handling
== BGP_LINK_BW_SKIP_MISSING
)
17470 vty_out(vty
, " bgp bestpath bandwidth skip-missing\n");
17471 else if (bgp
->lb_handling
== BGP_LINK_BW_DEFWT_4_MISSING
)
17472 vty_out(vty
, " bgp bestpath bandwidth default-weight-for-missing\n");
17474 /* BGP network import check. */
17475 if (!!CHECK_FLAG(bgp
->flags
, BGP_FLAG_IMPORT_CHECK
)
17476 != SAVE_BGP_IMPORT_CHECK
)
17477 vty_out(vty
, " %sbgp network import-check\n",
17478 CHECK_FLAG(bgp
->flags
, BGP_FLAG_IMPORT_CHECK
)
17482 /* BGP timers configuration. */
17483 if (bgp
->default_keepalive
!= SAVE_BGP_KEEPALIVE
17484 || bgp
->default_holdtime
!= SAVE_BGP_HOLDTIME
)
17485 vty_out(vty
, " timers bgp %u %u\n",
17486 bgp
->default_keepalive
, bgp
->default_holdtime
);
17488 /* BGP minimum holdtime configuration. */
17489 if (bgp
->default_min_holdtime
!= SAVE_BGP_HOLDTIME
17490 && bgp
->default_min_holdtime
!= 0)
17491 vty_out(vty
, " bgp minimum-holdtime %u\n",
17492 bgp
->default_min_holdtime
);
17494 /* Conditional advertisement timer configuration */
17495 if (bgp
->condition_check_period
17496 != DEFAULT_CONDITIONAL_ROUTES_POLL_TIME
)
17498 " bgp conditional-advertisement timer %u\n",
17499 bgp
->condition_check_period
);
17502 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
17503 bgp_config_write_peer_global(vty
, bgp
, group
->conf
);
17506 /* Normal neighbor configuration. */
17507 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
17508 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
17509 bgp_config_write_peer_global(vty
, bgp
, peer
);
17512 /* listen range and limit for dynamic BGP neighbors */
17513 bgp_config_write_listen(vty
, bgp
);
17516 * BGP default autoshutdown neighbors
17518 * This must be placed after any peer and peer-group
17519 * configuration, to avoid setting all peers to shutdown after
17520 * a daemon restart, which is undesired behavior. (see #2286)
17522 if (bgp
->autoshutdown
)
17523 vty_out(vty
, " bgp default shutdown\n");
17525 /* BGP instance administrative shutdown */
17526 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_SHUTDOWN
))
17527 vty_out(vty
, " bgp shutdown\n");
17529 if (bgp
->fast_convergence
)
17530 vty_out(vty
, " bgp fast-convergence\n");
17532 if (bgp
->srv6_enabled
) {
17533 vty_frame(vty
, " !\n segment-routing srv6\n");
17534 if (strlen(bgp
->srv6_locator_name
))
17535 vty_out(vty
, " locator %s\n",
17536 bgp
->srv6_locator_name
);
17537 vty_endframe(vty
, " exit\n");
17541 /* IPv4 unicast configuration. */
17542 bgp_config_write_family(vty
, bgp
, AFI_IP
, SAFI_UNICAST
);
17544 /* IPv4 multicast configuration. */
17545 bgp_config_write_family(vty
, bgp
, AFI_IP
, SAFI_MULTICAST
);
17547 /* IPv4 labeled-unicast configuration. */
17548 bgp_config_write_family(vty
, bgp
, AFI_IP
, SAFI_LABELED_UNICAST
);
17550 /* IPv4 VPN configuration. */
17551 bgp_config_write_family(vty
, bgp
, AFI_IP
, SAFI_MPLS_VPN
);
17553 /* ENCAPv4 configuration. */
17554 bgp_config_write_family(vty
, bgp
, AFI_IP
, SAFI_ENCAP
);
17556 /* FLOWSPEC v4 configuration. */
17557 bgp_config_write_family(vty
, bgp
, AFI_IP
, SAFI_FLOWSPEC
);
17559 /* IPv6 unicast configuration. */
17560 bgp_config_write_family(vty
, bgp
, AFI_IP6
, SAFI_UNICAST
);
17562 /* IPv6 multicast configuration. */
17563 bgp_config_write_family(vty
, bgp
, AFI_IP6
, SAFI_MULTICAST
);
17565 /* IPv6 labeled-unicast configuration. */
17566 bgp_config_write_family(vty
, bgp
, AFI_IP6
,
17567 SAFI_LABELED_UNICAST
);
17569 /* IPv6 VPN configuration. */
17570 bgp_config_write_family(vty
, bgp
, AFI_IP6
, SAFI_MPLS_VPN
);
17572 /* ENCAPv6 configuration. */
17573 bgp_config_write_family(vty
, bgp
, AFI_IP6
, SAFI_ENCAP
);
17575 /* FLOWSPEC v6 configuration. */
17576 bgp_config_write_family(vty
, bgp
, AFI_IP6
, SAFI_FLOWSPEC
);
17578 /* EVPN configuration. */
17579 bgp_config_write_family(vty
, bgp
, AFI_L2VPN
, SAFI_EVPN
);
17581 hook_call(bgp_inst_config_write
, bgp
, vty
);
17583 #ifdef ENABLE_BGP_VNC
17584 bgp_rfapi_cfg_write(vty
, bgp
);
17587 vty_out(vty
, "exit\n");
17588 vty_out(vty
, "!\n");
17594 /* BGP node structure. */
17595 static struct cmd_node bgp_node
= {
17598 .parent_node
= CONFIG_NODE
,
17599 .prompt
= "%s(config-router)# ",
17600 .config_write
= bgp_config_write
,
17603 static struct cmd_node bgp_ipv4_unicast_node
= {
17604 .name
= "bgp ipv4 unicast",
17605 .node
= BGP_IPV4_NODE
,
17606 .parent_node
= BGP_NODE
,
17607 .prompt
= "%s(config-router-af)# ",
17611 static struct cmd_node bgp_ipv4_multicast_node
= {
17612 .name
= "bgp ipv4 multicast",
17613 .node
= BGP_IPV4M_NODE
,
17614 .parent_node
= BGP_NODE
,
17615 .prompt
= "%s(config-router-af)# ",
17619 static struct cmd_node bgp_ipv4_labeled_unicast_node
= {
17620 .name
= "bgp ipv4 labeled unicast",
17621 .node
= BGP_IPV4L_NODE
,
17622 .parent_node
= BGP_NODE
,
17623 .prompt
= "%s(config-router-af)# ",
17627 static struct cmd_node bgp_ipv6_unicast_node
= {
17628 .name
= "bgp ipv6 unicast",
17629 .node
= BGP_IPV6_NODE
,
17630 .parent_node
= BGP_NODE
,
17631 .prompt
= "%s(config-router-af)# ",
17635 static struct cmd_node bgp_ipv6_multicast_node
= {
17636 .name
= "bgp ipv6 multicast",
17637 .node
= BGP_IPV6M_NODE
,
17638 .parent_node
= BGP_NODE
,
17639 .prompt
= "%s(config-router-af)# ",
17643 static struct cmd_node bgp_ipv6_labeled_unicast_node
= {
17644 .name
= "bgp ipv6 labeled unicast",
17645 .node
= BGP_IPV6L_NODE
,
17646 .parent_node
= BGP_NODE
,
17647 .prompt
= "%s(config-router-af)# ",
17651 static struct cmd_node bgp_vpnv4_node
= {
17652 .name
= "bgp vpnv4",
17653 .node
= BGP_VPNV4_NODE
,
17654 .parent_node
= BGP_NODE
,
17655 .prompt
= "%s(config-router-af)# ",
17659 static struct cmd_node bgp_vpnv6_node
= {
17660 .name
= "bgp vpnv6",
17661 .node
= BGP_VPNV6_NODE
,
17662 .parent_node
= BGP_NODE
,
17663 .prompt
= "%s(config-router-af-vpnv6)# ",
17667 static struct cmd_node bgp_evpn_node
= {
17668 .name
= "bgp evpn",
17669 .node
= BGP_EVPN_NODE
,
17670 .parent_node
= BGP_NODE
,
17671 .prompt
= "%s(config-router-evpn)# ",
17675 static struct cmd_node bgp_evpn_vni_node
= {
17676 .name
= "bgp evpn vni",
17677 .node
= BGP_EVPN_VNI_NODE
,
17678 .parent_node
= BGP_EVPN_NODE
,
17679 .prompt
= "%s(config-router-af-vni)# ",
17682 static struct cmd_node bgp_flowspecv4_node
= {
17683 .name
= "bgp ipv4 flowspec",
17684 .node
= BGP_FLOWSPECV4_NODE
,
17685 .parent_node
= BGP_NODE
,
17686 .prompt
= "%s(config-router-af)# ",
17690 static struct cmd_node bgp_flowspecv6_node
= {
17691 .name
= "bgp ipv6 flowspec",
17692 .node
= BGP_FLOWSPECV6_NODE
,
17693 .parent_node
= BGP_NODE
,
17694 .prompt
= "%s(config-router-af-vpnv6)# ",
17698 static struct cmd_node bgp_srv6_node
= {
17699 .name
= "bgp srv6",
17700 .node
= BGP_SRV6_NODE
,
17701 .parent_node
= BGP_NODE
,
17702 .prompt
= "%s(config-router-srv6)# ",
17705 static void community_list_vty(void);
17707 static void bgp_ac_peergroup(vector comps
, struct cmd_token
*token
)
17710 struct peer_group
*group
;
17711 struct listnode
*lnbgp
, *lnpeer
;
17713 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, lnbgp
, bgp
)) {
17714 for (ALL_LIST_ELEMENTS_RO(bgp
->group
, lnpeer
, group
))
17716 XSTRDUP(MTYPE_COMPLETION
, group
->name
));
17720 static void bgp_ac_peer(vector comps
, struct cmd_token
*token
)
17724 struct listnode
*lnbgp
, *lnpeer
;
17726 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, lnbgp
, bgp
)) {
17727 for (ALL_LIST_ELEMENTS_RO(bgp
->peer
, lnpeer
, peer
)) {
17728 /* only provide suggestions on the appropriate input
17730 * they'll otherwise show up multiple times */
17731 enum cmd_token_type match_type
;
17732 char *name
= peer
->host
;
17734 if (peer
->conf_if
) {
17735 match_type
= VARIABLE_TKN
;
17736 name
= peer
->conf_if
;
17737 } else if (strchr(peer
->host
, ':'))
17738 match_type
= IPV6_TKN
;
17740 match_type
= IPV4_TKN
;
17742 if (token
->type
!= match_type
)
17745 vector_set(comps
, XSTRDUP(MTYPE_COMPLETION
, name
));
17750 static void bgp_ac_neighbor(vector comps
, struct cmd_token
*token
)
17752 bgp_ac_peer(comps
, token
);
17754 if (token
->type
== VARIABLE_TKN
)
17755 bgp_ac_peergroup(comps
, token
);
17758 static const struct cmd_variable_handler bgp_var_neighbor
[] = {
17759 {.varname
= "neighbor", .completions
= bgp_ac_neighbor
},
17760 {.varname
= "neighbors", .completions
= bgp_ac_neighbor
},
17761 {.varname
= "peer", .completions
= bgp_ac_neighbor
},
17762 {.completions
= NULL
}};
17764 static const struct cmd_variable_handler bgp_var_peergroup
[] = {
17765 {.tokenname
= "PGNAME", .completions
= bgp_ac_peergroup
},
17766 {.completions
= NULL
} };
17768 DEFINE_HOOK(bgp_config_end
, (struct bgp
*bgp
), (bgp
));
17770 static struct thread
*t_bgp_cfg
;
17772 bool bgp_config_inprocess(void)
17774 return thread_is_scheduled(t_bgp_cfg
);
17777 static void bgp_config_finish(struct thread
*t
)
17779 struct listnode
*node
;
17782 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, node
, bgp
))
17783 hook_call(bgp_config_end
, bgp
);
17786 static void bgp_config_start(void)
17788 #define BGP_PRE_CONFIG_MAX_WAIT_SECONDS 600
17789 THREAD_OFF(t_bgp_cfg
);
17790 thread_add_timer(bm
->master
, bgp_config_finish
, NULL
,
17791 BGP_PRE_CONFIG_MAX_WAIT_SECONDS
, &t_bgp_cfg
);
17794 /* When we receive a hook the configuration is read,
17795 * we start a timer to make sure we postpone sending
17796 * EoR before route-maps are processed.
17797 * This is especially valid if using `bgp route-map delay-timer`.
17799 static void bgp_config_end(void)
17801 #define BGP_POST_CONFIG_DELAY_SECONDS 1
17802 uint32_t bgp_post_config_delay
=
17803 thread_is_scheduled(bm
->t_rmap_update
)
17804 ? thread_timer_remain_second(bm
->t_rmap_update
)
17805 : BGP_POST_CONFIG_DELAY_SECONDS
;
17807 /* If BGP config processing thread isn't running, then
17808 * we can return and rely it's properly handled.
17810 if (!bgp_config_inprocess())
17813 THREAD_OFF(t_bgp_cfg
);
17815 /* Start a new timer to make sure we don't send EoR
17816 * before route-maps are processed.
17818 thread_add_timer(bm
->master
, bgp_config_finish
, NULL
,
17819 bgp_post_config_delay
, &t_bgp_cfg
);
17822 void bgp_vty_init(void)
17824 cmd_variable_handler_register(bgp_var_neighbor
);
17825 cmd_variable_handler_register(bgp_var_peergroup
);
17827 cmd_init_config_callbacks(bgp_config_start
, bgp_config_end
);
17829 /* Install bgp top node. */
17830 install_node(&bgp_node
);
17831 install_node(&bgp_ipv4_unicast_node
);
17832 install_node(&bgp_ipv4_multicast_node
);
17833 install_node(&bgp_ipv4_labeled_unicast_node
);
17834 install_node(&bgp_ipv6_unicast_node
);
17835 install_node(&bgp_ipv6_multicast_node
);
17836 install_node(&bgp_ipv6_labeled_unicast_node
);
17837 install_node(&bgp_vpnv4_node
);
17838 install_node(&bgp_vpnv6_node
);
17839 install_node(&bgp_evpn_node
);
17840 install_node(&bgp_evpn_vni_node
);
17841 install_node(&bgp_flowspecv4_node
);
17842 install_node(&bgp_flowspecv6_node
);
17843 install_node(&bgp_srv6_node
);
17845 /* Install default VTY commands to new nodes. */
17846 install_default(BGP_NODE
);
17847 install_default(BGP_IPV4_NODE
);
17848 install_default(BGP_IPV4M_NODE
);
17849 install_default(BGP_IPV4L_NODE
);
17850 install_default(BGP_IPV6_NODE
);
17851 install_default(BGP_IPV6M_NODE
);
17852 install_default(BGP_IPV6L_NODE
);
17853 install_default(BGP_VPNV4_NODE
);
17854 install_default(BGP_VPNV6_NODE
);
17855 install_default(BGP_FLOWSPECV4_NODE
);
17856 install_default(BGP_FLOWSPECV6_NODE
);
17857 install_default(BGP_EVPN_NODE
);
17858 install_default(BGP_EVPN_VNI_NODE
);
17859 install_default(BGP_SRV6_NODE
);
17861 /* "bgp local-mac" hidden commands. */
17862 install_element(CONFIG_NODE
, &bgp_local_mac_cmd
);
17863 install_element(CONFIG_NODE
, &no_bgp_local_mac_cmd
);
17865 /* "bgp suppress-fib-pending" global */
17866 install_element(CONFIG_NODE
, &bgp_global_suppress_fib_pending_cmd
);
17868 /* bgp route-map delay-timer commands. */
17869 install_element(CONFIG_NODE
, &bgp_set_route_map_delay_timer_cmd
);
17870 install_element(CONFIG_NODE
, &no_bgp_set_route_map_delay_timer_cmd
);
17872 /* bgp fast-convergence command */
17873 install_element(BGP_NODE
, &bgp_fast_convergence_cmd
);
17874 install_element(BGP_NODE
, &no_bgp_fast_convergence_cmd
);
17876 /* global bgp update-delay command */
17877 install_element(CONFIG_NODE
, &bgp_global_update_delay_cmd
);
17878 install_element(CONFIG_NODE
, &no_bgp_global_update_delay_cmd
);
17880 /* global bgp graceful-shutdown command */
17881 install_element(CONFIG_NODE
, &bgp_graceful_shutdown_cmd
);
17882 install_element(CONFIG_NODE
, &no_bgp_graceful_shutdown_cmd
);
17884 /* Dummy commands (Currently not supported) */
17885 install_element(BGP_NODE
, &no_synchronization_cmd
);
17886 install_element(BGP_NODE
, &no_auto_summary_cmd
);
17888 /* "router bgp" commands. */
17889 install_element(CONFIG_NODE
, &router_bgp_cmd
);
17891 /* "no router bgp" commands. */
17892 install_element(CONFIG_NODE
, &no_router_bgp_cmd
);
17894 /* "bgp session-dscp command */
17895 install_element(CONFIG_NODE
, &bgp_session_dscp_cmd
);
17896 install_element(CONFIG_NODE
, &no_bgp_session_dscp_cmd
);
17898 /* "bgp router-id" commands. */
17899 install_element(BGP_NODE
, &bgp_router_id_cmd
);
17900 install_element(BGP_NODE
, &no_bgp_router_id_cmd
);
17902 /* "bgp suppress-fib-pending" command */
17903 install_element(BGP_NODE
, &bgp_suppress_fib_pending_cmd
);
17905 /* "bgp cluster-id" commands. */
17906 install_element(BGP_NODE
, &bgp_cluster_id_cmd
);
17907 install_element(BGP_NODE
, &no_bgp_cluster_id_cmd
);
17909 /* "bgp no-rib" commands. */
17910 install_element(CONFIG_NODE
, &bgp_norib_cmd
);
17911 install_element(CONFIG_NODE
, &no_bgp_norib_cmd
);
17913 install_element(CONFIG_NODE
, &no_bgp_send_extra_data_cmd
);
17915 /* "bgp confederation" commands. */
17916 install_element(BGP_NODE
, &bgp_confederation_identifier_cmd
);
17917 install_element(BGP_NODE
, &no_bgp_confederation_identifier_cmd
);
17919 /* "bgp confederation peers" commands. */
17920 install_element(BGP_NODE
, &bgp_confederation_peers_cmd
);
17921 install_element(BGP_NODE
, &no_bgp_confederation_peers_cmd
);
17923 /* bgp max-med command */
17924 install_element(BGP_NODE
, &bgp_maxmed_admin_cmd
);
17925 install_element(BGP_NODE
, &no_bgp_maxmed_admin_cmd
);
17926 install_element(BGP_NODE
, &bgp_maxmed_admin_medv_cmd
);
17927 install_element(BGP_NODE
, &bgp_maxmed_onstartup_cmd
);
17928 install_element(BGP_NODE
, &no_bgp_maxmed_onstartup_cmd
);
17930 /* bgp disable-ebgp-connected-nh-check */
17931 install_element(BGP_NODE
, &bgp_disable_connected_route_check_cmd
);
17932 install_element(BGP_NODE
, &no_bgp_disable_connected_route_check_cmd
);
17934 /* bgp update-delay command */
17935 install_element(BGP_NODE
, &bgp_update_delay_cmd
);
17936 install_element(BGP_NODE
, &no_bgp_update_delay_cmd
);
17938 install_element(BGP_NODE
, &bgp_wpkt_quanta_cmd
);
17939 install_element(BGP_NODE
, &bgp_rpkt_quanta_cmd
);
17941 install_element(BGP_NODE
, &bgp_coalesce_time_cmd
);
17942 install_element(BGP_NODE
, &no_bgp_coalesce_time_cmd
);
17944 /* "maximum-paths" commands. */
17945 install_element(BGP_NODE
, &bgp_maxpaths_hidden_cmd
);
17946 install_element(BGP_NODE
, &no_bgp_maxpaths_hidden_cmd
);
17947 install_element(BGP_IPV4_NODE
, &bgp_maxpaths_cmd
);
17948 install_element(BGP_IPV4_NODE
, &no_bgp_maxpaths_cmd
);
17949 install_element(BGP_IPV6_NODE
, &bgp_maxpaths_cmd
);
17950 install_element(BGP_IPV6_NODE
, &no_bgp_maxpaths_cmd
);
17951 install_element(BGP_NODE
, &bgp_maxpaths_ibgp_hidden_cmd
);
17952 install_element(BGP_NODE
, &bgp_maxpaths_ibgp_cluster_hidden_cmd
);
17953 install_element(BGP_NODE
, &no_bgp_maxpaths_ibgp_hidden_cmd
);
17954 install_element(BGP_IPV4_NODE
, &bgp_maxpaths_ibgp_cmd
);
17955 install_element(BGP_IPV4_NODE
, &bgp_maxpaths_ibgp_cluster_cmd
);
17956 install_element(BGP_IPV4_NODE
, &no_bgp_maxpaths_ibgp_cmd
);
17957 install_element(BGP_IPV6_NODE
, &bgp_maxpaths_ibgp_cmd
);
17958 install_element(BGP_IPV6_NODE
, &bgp_maxpaths_ibgp_cluster_cmd
);
17959 install_element(BGP_IPV6_NODE
, &no_bgp_maxpaths_ibgp_cmd
);
17961 install_element(BGP_IPV4L_NODE
, &bgp_maxpaths_cmd
);
17962 install_element(BGP_IPV4L_NODE
, &no_bgp_maxpaths_cmd
);
17963 install_element(BGP_IPV4L_NODE
, &bgp_maxpaths_ibgp_cmd
);
17964 install_element(BGP_IPV4L_NODE
, &bgp_maxpaths_ibgp_cluster_cmd
);
17965 install_element(BGP_IPV4L_NODE
, &no_bgp_maxpaths_ibgp_cmd
);
17966 install_element(BGP_IPV6L_NODE
, &bgp_maxpaths_cmd
);
17967 install_element(BGP_IPV6L_NODE
, &no_bgp_maxpaths_cmd
);
17968 install_element(BGP_IPV6L_NODE
, &bgp_maxpaths_ibgp_cmd
);
17969 install_element(BGP_IPV6L_NODE
, &bgp_maxpaths_ibgp_cluster_cmd
);
17970 install_element(BGP_IPV6L_NODE
, &no_bgp_maxpaths_ibgp_cmd
);
17972 /* "timers bgp" commands. */
17973 install_element(BGP_NODE
, &bgp_timers_cmd
);
17974 install_element(BGP_NODE
, &no_bgp_timers_cmd
);
17976 /* "minimum-holdtime" commands. */
17977 install_element(BGP_NODE
, &bgp_minimum_holdtime_cmd
);
17978 install_element(BGP_NODE
, &no_bgp_minimum_holdtime_cmd
);
17980 /* route-map delay-timer commands - per instance for backwards compat.
17982 install_element(BGP_NODE
, &bgp_set_route_map_delay_timer_cmd
);
17983 install_element(BGP_NODE
, &no_bgp_set_route_map_delay_timer_cmd
);
17985 /* "bgp client-to-client reflection" commands */
17986 install_element(BGP_NODE
, &no_bgp_client_to_client_reflection_cmd
);
17987 install_element(BGP_NODE
, &bgp_client_to_client_reflection_cmd
);
17989 /* "bgp always-compare-med" commands */
17990 install_element(BGP_NODE
, &bgp_always_compare_med_cmd
);
17991 install_element(BGP_NODE
, &no_bgp_always_compare_med_cmd
);
17993 /* bgp ebgp-requires-policy */
17994 install_element(BGP_NODE
, &bgp_ebgp_requires_policy_cmd
);
17995 install_element(BGP_NODE
, &no_bgp_ebgp_requires_policy_cmd
);
17997 /* bgp suppress-duplicates */
17998 install_element(BGP_NODE
, &bgp_suppress_duplicates_cmd
);
17999 install_element(BGP_NODE
, &no_bgp_suppress_duplicates_cmd
);
18001 /* bgp reject-as-sets */
18002 install_element(BGP_NODE
, &bgp_reject_as_sets_cmd
);
18003 install_element(BGP_NODE
, &no_bgp_reject_as_sets_cmd
);
18005 /* "bgp deterministic-med" commands */
18006 install_element(BGP_NODE
, &bgp_deterministic_med_cmd
);
18007 install_element(BGP_NODE
, &no_bgp_deterministic_med_cmd
);
18009 /* "bgp graceful-restart" command */
18010 install_element(BGP_NODE
, &bgp_graceful_restart_cmd
);
18011 install_element(BGP_NODE
, &no_bgp_graceful_restart_cmd
);
18013 /* "bgp graceful-restart-disable" command */
18014 install_element(BGP_NODE
, &bgp_graceful_restart_disable_cmd
);
18015 install_element(BGP_NODE
, &no_bgp_graceful_restart_disable_cmd
);
18017 /* "neighbor a:b:c:d graceful-restart" command */
18018 install_element(BGP_NODE
, &bgp_neighbor_graceful_restart_set_cmd
);
18019 install_element(BGP_NODE
, &no_bgp_neighbor_graceful_restart_set_cmd
);
18021 /* "neighbor a:b:c:d graceful-restart-disable" command */
18022 install_element(BGP_NODE
,
18023 &bgp_neighbor_graceful_restart_disable_set_cmd
);
18024 install_element(BGP_NODE
,
18025 &no_bgp_neighbor_graceful_restart_disable_set_cmd
);
18027 /* "neighbor a:b:c:d graceful-restart-helper" command */
18028 install_element(BGP_NODE
,
18029 &bgp_neighbor_graceful_restart_helper_set_cmd
);
18030 install_element(BGP_NODE
,
18031 &no_bgp_neighbor_graceful_restart_helper_set_cmd
);
18033 install_element(BGP_NODE
, &bgp_graceful_restart_stalepath_time_cmd
);
18034 install_element(BGP_NODE
, &no_bgp_graceful_restart_stalepath_time_cmd
);
18035 install_element(BGP_NODE
, &bgp_graceful_restart_restart_time_cmd
);
18036 install_element(BGP_NODE
, &no_bgp_graceful_restart_restart_time_cmd
);
18037 install_element(BGP_NODE
, &bgp_graceful_restart_select_defer_time_cmd
);
18038 install_element(BGP_NODE
,
18039 &no_bgp_graceful_restart_select_defer_time_cmd
);
18040 install_element(BGP_NODE
, &bgp_graceful_restart_preserve_fw_cmd
);
18041 install_element(BGP_NODE
, &no_bgp_graceful_restart_preserve_fw_cmd
);
18042 install_element(BGP_NODE
, &bgp_graceful_restart_notification_cmd
);
18044 install_element(BGP_NODE
, &bgp_graceful_restart_disable_eor_cmd
);
18045 install_element(BGP_NODE
, &no_bgp_graceful_restart_disable_eor_cmd
);
18046 install_element(BGP_NODE
, &bgp_graceful_restart_rib_stale_time_cmd
);
18047 install_element(BGP_NODE
, &no_bgp_graceful_restart_rib_stale_time_cmd
);
18049 /* "bgp graceful-shutdown" commands */
18050 install_element(BGP_NODE
, &bgp_graceful_shutdown_cmd
);
18051 install_element(BGP_NODE
, &no_bgp_graceful_shutdown_cmd
);
18053 /* "bgp hard-administrative-reset" commands */
18054 install_element(BGP_NODE
, &bgp_administrative_reset_cmd
);
18056 /* "bgp long-lived-graceful-restart" commands */
18057 install_element(BGP_NODE
, &bgp_llgr_stalepath_time_cmd
);
18058 install_element(BGP_NODE
, &no_bgp_llgr_stalepath_time_cmd
);
18060 /* "bgp fast-external-failover" commands */
18061 install_element(BGP_NODE
, &bgp_fast_external_failover_cmd
);
18062 install_element(BGP_NODE
, &no_bgp_fast_external_failover_cmd
);
18064 /* "bgp bestpath compare-routerid" commands */
18065 install_element(BGP_NODE
, &bgp_bestpath_compare_router_id_cmd
);
18066 install_element(BGP_NODE
, &no_bgp_bestpath_compare_router_id_cmd
);
18068 /* "bgp bestpath as-path ignore" commands */
18069 install_element(BGP_NODE
, &bgp_bestpath_aspath_ignore_cmd
);
18070 install_element(BGP_NODE
, &no_bgp_bestpath_aspath_ignore_cmd
);
18072 /* "bgp bestpath as-path confed" commands */
18073 install_element(BGP_NODE
, &bgp_bestpath_aspath_confed_cmd
);
18074 install_element(BGP_NODE
, &no_bgp_bestpath_aspath_confed_cmd
);
18076 /* "bgp bestpath as-path multipath-relax" commands */
18077 install_element(BGP_NODE
, &bgp_bestpath_aspath_multipath_relax_cmd
);
18078 install_element(BGP_NODE
, &no_bgp_bestpath_aspath_multipath_relax_cmd
);
18080 /* "bgp bestpath peer-type multipath-relax" commands */
18081 install_element(BGP_NODE
, &bgp_bestpath_peer_type_multipath_relax_cmd
);
18082 install_element(BGP_NODE
,
18083 &no_bgp_bestpath_peer_type_multipath_relax_cmd
);
18085 /* "bgp log-neighbor-changes" commands */
18086 install_element(BGP_NODE
, &bgp_log_neighbor_changes_cmd
);
18087 install_element(BGP_NODE
, &no_bgp_log_neighbor_changes_cmd
);
18089 /* "bgp bestpath med" commands */
18090 install_element(BGP_NODE
, &bgp_bestpath_med_cmd
);
18091 install_element(BGP_NODE
, &no_bgp_bestpath_med_cmd
);
18093 /* "bgp bestpath bandwidth" commands */
18094 install_element(BGP_NODE
, &bgp_bestpath_bw_cmd
);
18095 install_element(BGP_NODE
, &no_bgp_bestpath_bw_cmd
);
18097 /* "no bgp default <afi>-<safi>" commands. */
18098 install_element(BGP_NODE
, &bgp_default_afi_safi_cmd
);
18100 /* "bgp network import-check" commands. */
18101 install_element(BGP_NODE
, &bgp_network_import_check_cmd
);
18102 install_element(BGP_NODE
, &bgp_network_import_check_exact_cmd
);
18103 install_element(BGP_NODE
, &no_bgp_network_import_check_cmd
);
18105 /* "bgp default local-preference" commands. */
18106 install_element(BGP_NODE
, &bgp_default_local_preference_cmd
);
18107 install_element(BGP_NODE
, &no_bgp_default_local_preference_cmd
);
18109 /* bgp default show-hostname */
18110 install_element(BGP_NODE
, &bgp_default_show_hostname_cmd
);
18111 install_element(BGP_NODE
, &no_bgp_default_show_hostname_cmd
);
18113 /* bgp default show-nexthop-hostname */
18114 install_element(BGP_NODE
, &bgp_default_show_nexthop_hostname_cmd
);
18115 install_element(BGP_NODE
, &no_bgp_default_show_nexthop_hostname_cmd
);
18117 /* "bgp default subgroup-pkt-queue-max" commands. */
18118 install_element(BGP_NODE
, &bgp_default_subgroup_pkt_queue_max_cmd
);
18119 install_element(BGP_NODE
, &no_bgp_default_subgroup_pkt_queue_max_cmd
);
18121 /* bgp ibgp-allow-policy-mods command */
18122 install_element(BGP_NODE
, &bgp_rr_allow_outbound_policy_cmd
);
18123 install_element(BGP_NODE
, &no_bgp_rr_allow_outbound_policy_cmd
);
18125 /* "bgp listen limit" commands. */
18126 install_element(BGP_NODE
, &bgp_listen_limit_cmd
);
18127 install_element(BGP_NODE
, &no_bgp_listen_limit_cmd
);
18129 /* "bgp listen range" commands. */
18130 install_element(BGP_NODE
, &bgp_listen_range_cmd
);
18131 install_element(BGP_NODE
, &no_bgp_listen_range_cmd
);
18133 /* "bgp default shutdown" command */
18134 install_element(BGP_NODE
, &bgp_default_shutdown_cmd
);
18136 /* "bgp shutdown" commands */
18137 install_element(BGP_NODE
, &bgp_shutdown_cmd
);
18138 install_element(BGP_NODE
, &bgp_shutdown_msg_cmd
);
18139 install_element(BGP_NODE
, &no_bgp_shutdown_cmd
);
18140 install_element(BGP_NODE
, &no_bgp_shutdown_msg_cmd
);
18142 /* "neighbor remote-as" commands. */
18143 install_element(BGP_NODE
, &neighbor_remote_as_cmd
);
18144 install_element(BGP_NODE
, &neighbor_interface_config_cmd
);
18145 install_element(BGP_NODE
, &neighbor_interface_config_v6only_cmd
);
18146 install_element(BGP_NODE
, &neighbor_interface_config_remote_as_cmd
);
18147 install_element(BGP_NODE
,
18148 &neighbor_interface_v6only_config_remote_as_cmd
);
18149 install_element(BGP_NODE
, &no_neighbor_cmd
);
18150 install_element(BGP_NODE
, &no_neighbor_interface_config_cmd
);
18152 /* "neighbor peer-group" commands. */
18153 install_element(BGP_NODE
, &neighbor_peer_group_cmd
);
18154 install_element(BGP_NODE
, &no_neighbor_peer_group_cmd
);
18155 install_element(BGP_NODE
,
18156 &no_neighbor_interface_peer_group_remote_as_cmd
);
18158 /* "neighbor local-as" commands. */
18159 install_element(BGP_NODE
, &neighbor_local_as_cmd
);
18160 install_element(BGP_NODE
, &neighbor_local_as_no_prepend_cmd
);
18161 install_element(BGP_NODE
, &neighbor_local_as_no_prepend_replace_as_cmd
);
18162 install_element(BGP_NODE
, &no_neighbor_local_as_cmd
);
18164 /* "neighbor solo" commands. */
18165 install_element(BGP_NODE
, &neighbor_solo_cmd
);
18166 install_element(BGP_NODE
, &no_neighbor_solo_cmd
);
18168 /* "neighbor password" commands. */
18169 install_element(BGP_NODE
, &neighbor_password_cmd
);
18170 install_element(BGP_NODE
, &no_neighbor_password_cmd
);
18172 /* "neighbor activate" commands. */
18173 install_element(BGP_NODE
, &neighbor_activate_hidden_cmd
);
18174 install_element(BGP_IPV4_NODE
, &neighbor_activate_cmd
);
18175 install_element(BGP_IPV4M_NODE
, &neighbor_activate_cmd
);
18176 install_element(BGP_IPV4L_NODE
, &neighbor_activate_cmd
);
18177 install_element(BGP_IPV6_NODE
, &neighbor_activate_cmd
);
18178 install_element(BGP_IPV6M_NODE
, &neighbor_activate_cmd
);
18179 install_element(BGP_IPV6L_NODE
, &neighbor_activate_cmd
);
18180 install_element(BGP_VPNV4_NODE
, &neighbor_activate_cmd
);
18181 install_element(BGP_VPNV6_NODE
, &neighbor_activate_cmd
);
18182 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_activate_cmd
);
18183 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_activate_cmd
);
18184 install_element(BGP_EVPN_NODE
, &neighbor_activate_cmd
);
18186 /* "no neighbor activate" commands. */
18187 install_element(BGP_NODE
, &no_neighbor_activate_hidden_cmd
);
18188 install_element(BGP_IPV4_NODE
, &no_neighbor_activate_cmd
);
18189 install_element(BGP_IPV4M_NODE
, &no_neighbor_activate_cmd
);
18190 install_element(BGP_IPV4L_NODE
, &no_neighbor_activate_cmd
);
18191 install_element(BGP_IPV6_NODE
, &no_neighbor_activate_cmd
);
18192 install_element(BGP_IPV6M_NODE
, &no_neighbor_activate_cmd
);
18193 install_element(BGP_IPV6L_NODE
, &no_neighbor_activate_cmd
);
18194 install_element(BGP_VPNV4_NODE
, &no_neighbor_activate_cmd
);
18195 install_element(BGP_VPNV6_NODE
, &no_neighbor_activate_cmd
);
18196 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_activate_cmd
);
18197 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_activate_cmd
);
18198 install_element(BGP_EVPN_NODE
, &no_neighbor_activate_cmd
);
18200 /* "neighbor peer-group" set commands. */
18201 install_element(BGP_NODE
, &neighbor_set_peer_group_cmd
);
18202 install_element(BGP_IPV4_NODE
, &neighbor_set_peer_group_hidden_cmd
);
18203 install_element(BGP_IPV4M_NODE
, &neighbor_set_peer_group_hidden_cmd
);
18204 install_element(BGP_IPV6_NODE
, &neighbor_set_peer_group_hidden_cmd
);
18205 install_element(BGP_IPV6M_NODE
, &neighbor_set_peer_group_hidden_cmd
);
18206 install_element(BGP_IPV6L_NODE
, &neighbor_set_peer_group_hidden_cmd
);
18207 install_element(BGP_VPNV4_NODE
, &neighbor_set_peer_group_hidden_cmd
);
18208 install_element(BGP_VPNV6_NODE
, &neighbor_set_peer_group_hidden_cmd
);
18209 install_element(BGP_FLOWSPECV4_NODE
,
18210 &neighbor_set_peer_group_hidden_cmd
);
18211 install_element(BGP_FLOWSPECV6_NODE
,
18212 &neighbor_set_peer_group_hidden_cmd
);
18214 /* "no neighbor peer-group unset" commands. */
18215 install_element(BGP_NODE
, &no_neighbor_set_peer_group_cmd
);
18216 install_element(BGP_IPV4_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
18217 install_element(BGP_IPV4M_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
18218 install_element(BGP_IPV6_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
18219 install_element(BGP_IPV6M_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
18220 install_element(BGP_IPV6L_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
18221 install_element(BGP_VPNV4_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
18222 install_element(BGP_VPNV6_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
18223 install_element(BGP_FLOWSPECV4_NODE
,
18224 &no_neighbor_set_peer_group_hidden_cmd
);
18225 install_element(BGP_FLOWSPECV6_NODE
,
18226 &no_neighbor_set_peer_group_hidden_cmd
);
18228 /* "neighbor softreconfiguration inbound" commands.*/
18229 install_element(BGP_NODE
, &neighbor_soft_reconfiguration_hidden_cmd
);
18230 install_element(BGP_NODE
, &no_neighbor_soft_reconfiguration_hidden_cmd
);
18231 install_element(BGP_IPV4_NODE
, &neighbor_soft_reconfiguration_cmd
);
18232 install_element(BGP_IPV4_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
18233 install_element(BGP_IPV4L_NODE
, &neighbor_soft_reconfiguration_cmd
);
18234 install_element(BGP_IPV4L_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
18235 install_element(BGP_IPV4M_NODE
, &neighbor_soft_reconfiguration_cmd
);
18236 install_element(BGP_IPV4M_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
18237 install_element(BGP_IPV6_NODE
, &neighbor_soft_reconfiguration_cmd
);
18238 install_element(BGP_IPV6_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
18239 install_element(BGP_IPV6M_NODE
, &neighbor_soft_reconfiguration_cmd
);
18240 install_element(BGP_IPV6M_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
18241 install_element(BGP_IPV6L_NODE
, &neighbor_soft_reconfiguration_cmd
);
18242 install_element(BGP_IPV6L_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
18243 install_element(BGP_VPNV4_NODE
, &neighbor_soft_reconfiguration_cmd
);
18244 install_element(BGP_VPNV4_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
18245 install_element(BGP_VPNV6_NODE
, &neighbor_soft_reconfiguration_cmd
);
18246 install_element(BGP_VPNV6_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
18247 install_element(BGP_FLOWSPECV4_NODE
,
18248 &neighbor_soft_reconfiguration_cmd
);
18249 install_element(BGP_FLOWSPECV4_NODE
,
18250 &no_neighbor_soft_reconfiguration_cmd
);
18251 install_element(BGP_FLOWSPECV6_NODE
,
18252 &neighbor_soft_reconfiguration_cmd
);
18253 install_element(BGP_FLOWSPECV6_NODE
,
18254 &no_neighbor_soft_reconfiguration_cmd
);
18255 install_element(BGP_EVPN_NODE
, &neighbor_soft_reconfiguration_cmd
);
18256 install_element(BGP_EVPN_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
18258 /* "neighbor attribute-unchanged" commands. */
18259 install_element(BGP_NODE
, &neighbor_attr_unchanged_hidden_cmd
);
18260 install_element(BGP_NODE
, &no_neighbor_attr_unchanged_hidden_cmd
);
18261 install_element(BGP_IPV4_NODE
, &neighbor_attr_unchanged_cmd
);
18262 install_element(BGP_IPV4_NODE
, &no_neighbor_attr_unchanged_cmd
);
18263 install_element(BGP_IPV4M_NODE
, &neighbor_attr_unchanged_cmd
);
18264 install_element(BGP_IPV4M_NODE
, &no_neighbor_attr_unchanged_cmd
);
18265 install_element(BGP_IPV4L_NODE
, &neighbor_attr_unchanged_cmd
);
18266 install_element(BGP_IPV4L_NODE
, &no_neighbor_attr_unchanged_cmd
);
18267 install_element(BGP_IPV6_NODE
, &neighbor_attr_unchanged_cmd
);
18268 install_element(BGP_IPV6_NODE
, &no_neighbor_attr_unchanged_cmd
);
18269 install_element(BGP_IPV6M_NODE
, &neighbor_attr_unchanged_cmd
);
18270 install_element(BGP_IPV6M_NODE
, &no_neighbor_attr_unchanged_cmd
);
18271 install_element(BGP_IPV6L_NODE
, &neighbor_attr_unchanged_cmd
);
18272 install_element(BGP_IPV6L_NODE
, &no_neighbor_attr_unchanged_cmd
);
18273 install_element(BGP_VPNV4_NODE
, &neighbor_attr_unchanged_cmd
);
18274 install_element(BGP_VPNV4_NODE
, &no_neighbor_attr_unchanged_cmd
);
18275 install_element(BGP_VPNV6_NODE
, &neighbor_attr_unchanged_cmd
);
18276 install_element(BGP_VPNV6_NODE
, &no_neighbor_attr_unchanged_cmd
);
18278 install_element(BGP_EVPN_NODE
, &neighbor_attr_unchanged_cmd
);
18279 install_element(BGP_EVPN_NODE
, &no_neighbor_attr_unchanged_cmd
);
18281 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_attr_unchanged_cmd
);
18282 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_attr_unchanged_cmd
);
18283 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_attr_unchanged_cmd
);
18284 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_attr_unchanged_cmd
);
18286 /* "nexthop-local unchanged" commands */
18287 install_element(BGP_IPV6_NODE
, &neighbor_nexthop_local_unchanged_cmd
);
18288 install_element(BGP_IPV6_NODE
,
18289 &no_neighbor_nexthop_local_unchanged_cmd
);
18291 /* "neighbor next-hop-self" commands. */
18292 install_element(BGP_NODE
, &neighbor_nexthop_self_hidden_cmd
);
18293 install_element(BGP_NODE
, &no_neighbor_nexthop_self_hidden_cmd
);
18294 install_element(BGP_IPV4_NODE
, &neighbor_nexthop_self_cmd
);
18295 install_element(BGP_IPV4_NODE
, &no_neighbor_nexthop_self_cmd
);
18296 install_element(BGP_IPV4M_NODE
, &neighbor_nexthop_self_cmd
);
18297 install_element(BGP_IPV4M_NODE
, &no_neighbor_nexthop_self_cmd
);
18298 install_element(BGP_IPV4L_NODE
, &neighbor_nexthop_self_cmd
);
18299 install_element(BGP_IPV4L_NODE
, &no_neighbor_nexthop_self_cmd
);
18300 install_element(BGP_IPV6_NODE
, &neighbor_nexthop_self_cmd
);
18301 install_element(BGP_IPV6_NODE
, &no_neighbor_nexthop_self_cmd
);
18302 install_element(BGP_IPV6M_NODE
, &neighbor_nexthop_self_cmd
);
18303 install_element(BGP_IPV6M_NODE
, &no_neighbor_nexthop_self_cmd
);
18304 install_element(BGP_IPV6L_NODE
, &neighbor_nexthop_self_cmd
);
18305 install_element(BGP_IPV6L_NODE
, &no_neighbor_nexthop_self_cmd
);
18306 install_element(BGP_VPNV4_NODE
, &neighbor_nexthop_self_cmd
);
18307 install_element(BGP_VPNV4_NODE
, &no_neighbor_nexthop_self_cmd
);
18308 install_element(BGP_VPNV6_NODE
, &neighbor_nexthop_self_cmd
);
18309 install_element(BGP_VPNV6_NODE
, &no_neighbor_nexthop_self_cmd
);
18310 install_element(BGP_EVPN_NODE
, &neighbor_nexthop_self_cmd
);
18311 install_element(BGP_EVPN_NODE
, &no_neighbor_nexthop_self_cmd
);
18313 /* "neighbor next-hop-self force" commands. */
18314 install_element(BGP_NODE
, &neighbor_nexthop_self_force_hidden_cmd
);
18315 install_element(BGP_NODE
, &no_neighbor_nexthop_self_force_hidden_cmd
);
18316 install_element(BGP_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
18317 install_element(BGP_NODE
, &no_neighbor_nexthop_self_all_hidden_cmd
);
18318 install_element(BGP_IPV4_NODE
, &neighbor_nexthop_self_force_cmd
);
18319 install_element(BGP_IPV4_NODE
, &no_neighbor_nexthop_self_force_cmd
);
18320 install_element(BGP_IPV4_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
18321 install_element(BGP_IPV4_NODE
,
18322 &no_neighbor_nexthop_self_all_hidden_cmd
);
18323 install_element(BGP_IPV4M_NODE
, &neighbor_nexthop_self_force_cmd
);
18324 install_element(BGP_IPV4M_NODE
, &no_neighbor_nexthop_self_force_cmd
);
18325 install_element(BGP_IPV4M_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
18326 install_element(BGP_IPV4M_NODE
,
18327 &no_neighbor_nexthop_self_all_hidden_cmd
);
18328 install_element(BGP_IPV4L_NODE
, &neighbor_nexthop_self_force_cmd
);
18329 install_element(BGP_IPV4L_NODE
, &no_neighbor_nexthop_self_force_cmd
);
18330 install_element(BGP_IPV4L_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
18331 install_element(BGP_IPV4L_NODE
,
18332 &no_neighbor_nexthop_self_all_hidden_cmd
);
18333 install_element(BGP_IPV6_NODE
, &neighbor_nexthop_self_force_cmd
);
18334 install_element(BGP_IPV6_NODE
, &no_neighbor_nexthop_self_force_cmd
);
18335 install_element(BGP_IPV6_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
18336 install_element(BGP_IPV6_NODE
,
18337 &no_neighbor_nexthop_self_all_hidden_cmd
);
18338 install_element(BGP_IPV6M_NODE
, &neighbor_nexthop_self_force_cmd
);
18339 install_element(BGP_IPV6M_NODE
, &no_neighbor_nexthop_self_force_cmd
);
18340 install_element(BGP_IPV6M_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
18341 install_element(BGP_IPV6M_NODE
,
18342 &no_neighbor_nexthop_self_all_hidden_cmd
);
18343 install_element(BGP_IPV6L_NODE
, &neighbor_nexthop_self_force_cmd
);
18344 install_element(BGP_IPV6L_NODE
, &no_neighbor_nexthop_self_force_cmd
);
18345 install_element(BGP_IPV6L_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
18346 install_element(BGP_IPV6L_NODE
,
18347 &no_neighbor_nexthop_self_all_hidden_cmd
);
18348 install_element(BGP_VPNV4_NODE
, &neighbor_nexthop_self_force_cmd
);
18349 install_element(BGP_VPNV4_NODE
, &no_neighbor_nexthop_self_force_cmd
);
18350 install_element(BGP_VPNV4_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
18351 install_element(BGP_VPNV4_NODE
,
18352 &no_neighbor_nexthop_self_all_hidden_cmd
);
18353 install_element(BGP_VPNV6_NODE
, &neighbor_nexthop_self_force_cmd
);
18354 install_element(BGP_VPNV6_NODE
, &no_neighbor_nexthop_self_force_cmd
);
18355 install_element(BGP_VPNV6_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
18356 install_element(BGP_VPNV6_NODE
,
18357 &no_neighbor_nexthop_self_all_hidden_cmd
);
18358 install_element(BGP_EVPN_NODE
, &neighbor_nexthop_self_force_cmd
);
18359 install_element(BGP_EVPN_NODE
, &no_neighbor_nexthop_self_force_cmd
);
18361 /* "neighbor as-override" commands. */
18362 install_element(BGP_NODE
, &neighbor_as_override_hidden_cmd
);
18363 install_element(BGP_NODE
, &no_neighbor_as_override_hidden_cmd
);
18364 install_element(BGP_IPV4_NODE
, &neighbor_as_override_cmd
);
18365 install_element(BGP_IPV4_NODE
, &no_neighbor_as_override_cmd
);
18366 install_element(BGP_IPV4M_NODE
, &neighbor_as_override_cmd
);
18367 install_element(BGP_IPV4M_NODE
, &no_neighbor_as_override_cmd
);
18368 install_element(BGP_IPV4L_NODE
, &neighbor_as_override_cmd
);
18369 install_element(BGP_IPV4L_NODE
, &no_neighbor_as_override_cmd
);
18370 install_element(BGP_IPV6_NODE
, &neighbor_as_override_cmd
);
18371 install_element(BGP_IPV6_NODE
, &no_neighbor_as_override_cmd
);
18372 install_element(BGP_IPV6M_NODE
, &neighbor_as_override_cmd
);
18373 install_element(BGP_IPV6M_NODE
, &no_neighbor_as_override_cmd
);
18374 install_element(BGP_IPV6L_NODE
, &neighbor_as_override_cmd
);
18375 install_element(BGP_IPV6L_NODE
, &no_neighbor_as_override_cmd
);
18376 install_element(BGP_VPNV4_NODE
, &neighbor_as_override_cmd
);
18377 install_element(BGP_VPNV4_NODE
, &no_neighbor_as_override_cmd
);
18378 install_element(BGP_VPNV6_NODE
, &neighbor_as_override_cmd
);
18379 install_element(BGP_VPNV6_NODE
, &no_neighbor_as_override_cmd
);
18381 /* "neighbor remove-private-AS" commands. */
18382 install_element(BGP_NODE
, &neighbor_remove_private_as_hidden_cmd
);
18383 install_element(BGP_NODE
, &no_neighbor_remove_private_as_hidden_cmd
);
18384 install_element(BGP_NODE
, &neighbor_remove_private_as_all_hidden_cmd
);
18385 install_element(BGP_NODE
,
18386 &no_neighbor_remove_private_as_all_hidden_cmd
);
18387 install_element(BGP_NODE
,
18388 &neighbor_remove_private_as_replace_as_hidden_cmd
);
18389 install_element(BGP_NODE
,
18390 &no_neighbor_remove_private_as_replace_as_hidden_cmd
);
18391 install_element(BGP_NODE
,
18392 &neighbor_remove_private_as_all_replace_as_hidden_cmd
);
18395 &no_neighbor_remove_private_as_all_replace_as_hidden_cmd
);
18396 install_element(BGP_IPV4_NODE
, &neighbor_remove_private_as_cmd
);
18397 install_element(BGP_IPV4_NODE
, &no_neighbor_remove_private_as_cmd
);
18398 install_element(BGP_IPV4_NODE
, &neighbor_remove_private_as_all_cmd
);
18399 install_element(BGP_IPV4_NODE
, &no_neighbor_remove_private_as_all_cmd
);
18400 install_element(BGP_IPV4_NODE
,
18401 &neighbor_remove_private_as_replace_as_cmd
);
18402 install_element(BGP_IPV4_NODE
,
18403 &no_neighbor_remove_private_as_replace_as_cmd
);
18404 install_element(BGP_IPV4_NODE
,
18405 &neighbor_remove_private_as_all_replace_as_cmd
);
18406 install_element(BGP_IPV4_NODE
,
18407 &no_neighbor_remove_private_as_all_replace_as_cmd
);
18408 install_element(BGP_IPV4M_NODE
, &neighbor_remove_private_as_cmd
);
18409 install_element(BGP_IPV4M_NODE
, &no_neighbor_remove_private_as_cmd
);
18410 install_element(BGP_IPV4M_NODE
, &neighbor_remove_private_as_all_cmd
);
18411 install_element(BGP_IPV4M_NODE
, &no_neighbor_remove_private_as_all_cmd
);
18412 install_element(BGP_IPV4M_NODE
,
18413 &neighbor_remove_private_as_replace_as_cmd
);
18414 install_element(BGP_IPV4M_NODE
,
18415 &no_neighbor_remove_private_as_replace_as_cmd
);
18416 install_element(BGP_IPV4M_NODE
,
18417 &neighbor_remove_private_as_all_replace_as_cmd
);
18418 install_element(BGP_IPV4M_NODE
,
18419 &no_neighbor_remove_private_as_all_replace_as_cmd
);
18420 install_element(BGP_IPV4L_NODE
, &neighbor_remove_private_as_cmd
);
18421 install_element(BGP_IPV4L_NODE
, &no_neighbor_remove_private_as_cmd
);
18422 install_element(BGP_IPV4L_NODE
, &neighbor_remove_private_as_all_cmd
);
18423 install_element(BGP_IPV4L_NODE
, &no_neighbor_remove_private_as_all_cmd
);
18424 install_element(BGP_IPV4L_NODE
,
18425 &neighbor_remove_private_as_replace_as_cmd
);
18426 install_element(BGP_IPV4L_NODE
,
18427 &no_neighbor_remove_private_as_replace_as_cmd
);
18428 install_element(BGP_IPV4L_NODE
,
18429 &neighbor_remove_private_as_all_replace_as_cmd
);
18430 install_element(BGP_IPV4L_NODE
,
18431 &no_neighbor_remove_private_as_all_replace_as_cmd
);
18432 install_element(BGP_IPV6_NODE
, &neighbor_remove_private_as_cmd
);
18433 install_element(BGP_IPV6_NODE
, &no_neighbor_remove_private_as_cmd
);
18434 install_element(BGP_IPV6_NODE
, &neighbor_remove_private_as_all_cmd
);
18435 install_element(BGP_IPV6_NODE
, &no_neighbor_remove_private_as_all_cmd
);
18436 install_element(BGP_IPV6_NODE
,
18437 &neighbor_remove_private_as_replace_as_cmd
);
18438 install_element(BGP_IPV6_NODE
,
18439 &no_neighbor_remove_private_as_replace_as_cmd
);
18440 install_element(BGP_IPV6_NODE
,
18441 &neighbor_remove_private_as_all_replace_as_cmd
);
18442 install_element(BGP_IPV6_NODE
,
18443 &no_neighbor_remove_private_as_all_replace_as_cmd
);
18444 install_element(BGP_IPV6M_NODE
, &neighbor_remove_private_as_cmd
);
18445 install_element(BGP_IPV6M_NODE
, &no_neighbor_remove_private_as_cmd
);
18446 install_element(BGP_IPV6M_NODE
, &neighbor_remove_private_as_all_cmd
);
18447 install_element(BGP_IPV6M_NODE
, &no_neighbor_remove_private_as_all_cmd
);
18448 install_element(BGP_IPV6M_NODE
,
18449 &neighbor_remove_private_as_replace_as_cmd
);
18450 install_element(BGP_IPV6M_NODE
,
18451 &no_neighbor_remove_private_as_replace_as_cmd
);
18452 install_element(BGP_IPV6M_NODE
,
18453 &neighbor_remove_private_as_all_replace_as_cmd
);
18454 install_element(BGP_IPV6M_NODE
,
18455 &no_neighbor_remove_private_as_all_replace_as_cmd
);
18456 install_element(BGP_IPV6L_NODE
, &neighbor_remove_private_as_cmd
);
18457 install_element(BGP_IPV6L_NODE
, &no_neighbor_remove_private_as_cmd
);
18458 install_element(BGP_IPV6L_NODE
, &neighbor_remove_private_as_all_cmd
);
18459 install_element(BGP_IPV6L_NODE
, &no_neighbor_remove_private_as_all_cmd
);
18460 install_element(BGP_IPV6L_NODE
,
18461 &neighbor_remove_private_as_replace_as_cmd
);
18462 install_element(BGP_IPV6L_NODE
,
18463 &no_neighbor_remove_private_as_replace_as_cmd
);
18464 install_element(BGP_IPV6L_NODE
,
18465 &neighbor_remove_private_as_all_replace_as_cmd
);
18466 install_element(BGP_IPV6L_NODE
,
18467 &no_neighbor_remove_private_as_all_replace_as_cmd
);
18468 install_element(BGP_VPNV4_NODE
, &neighbor_remove_private_as_cmd
);
18469 install_element(BGP_VPNV4_NODE
, &no_neighbor_remove_private_as_cmd
);
18470 install_element(BGP_VPNV4_NODE
, &neighbor_remove_private_as_all_cmd
);
18471 install_element(BGP_VPNV4_NODE
, &no_neighbor_remove_private_as_all_cmd
);
18472 install_element(BGP_VPNV4_NODE
,
18473 &neighbor_remove_private_as_replace_as_cmd
);
18474 install_element(BGP_VPNV4_NODE
,
18475 &no_neighbor_remove_private_as_replace_as_cmd
);
18476 install_element(BGP_VPNV4_NODE
,
18477 &neighbor_remove_private_as_all_replace_as_cmd
);
18478 install_element(BGP_VPNV4_NODE
,
18479 &no_neighbor_remove_private_as_all_replace_as_cmd
);
18480 install_element(BGP_VPNV6_NODE
, &neighbor_remove_private_as_cmd
);
18481 install_element(BGP_VPNV6_NODE
, &no_neighbor_remove_private_as_cmd
);
18482 install_element(BGP_VPNV6_NODE
, &neighbor_remove_private_as_all_cmd
);
18483 install_element(BGP_VPNV6_NODE
, &no_neighbor_remove_private_as_all_cmd
);
18484 install_element(BGP_VPNV6_NODE
,
18485 &neighbor_remove_private_as_replace_as_cmd
);
18486 install_element(BGP_VPNV6_NODE
,
18487 &no_neighbor_remove_private_as_replace_as_cmd
);
18488 install_element(BGP_VPNV6_NODE
,
18489 &neighbor_remove_private_as_all_replace_as_cmd
);
18490 install_element(BGP_VPNV6_NODE
,
18491 &no_neighbor_remove_private_as_all_replace_as_cmd
);
18493 /* "neighbor send-community" commands.*/
18494 install_element(BGP_NODE
, &neighbor_send_community_hidden_cmd
);
18495 install_element(BGP_NODE
, &neighbor_send_community_type_hidden_cmd
);
18496 install_element(BGP_NODE
, &no_neighbor_send_community_hidden_cmd
);
18497 install_element(BGP_NODE
, &no_neighbor_send_community_type_hidden_cmd
);
18498 install_element(BGP_IPV4_NODE
, &neighbor_send_community_cmd
);
18499 install_element(BGP_IPV4_NODE
, &neighbor_send_community_type_cmd
);
18500 install_element(BGP_IPV4_NODE
, &no_neighbor_send_community_cmd
);
18501 install_element(BGP_IPV4_NODE
, &no_neighbor_send_community_type_cmd
);
18502 install_element(BGP_IPV4M_NODE
, &neighbor_send_community_cmd
);
18503 install_element(BGP_IPV4M_NODE
, &neighbor_send_community_type_cmd
);
18504 install_element(BGP_IPV4M_NODE
, &no_neighbor_send_community_cmd
);
18505 install_element(BGP_IPV4M_NODE
, &no_neighbor_send_community_type_cmd
);
18506 install_element(BGP_IPV4L_NODE
, &neighbor_send_community_cmd
);
18507 install_element(BGP_IPV4L_NODE
, &neighbor_send_community_type_cmd
);
18508 install_element(BGP_IPV4L_NODE
, &no_neighbor_send_community_cmd
);
18509 install_element(BGP_IPV4L_NODE
, &no_neighbor_send_community_type_cmd
);
18510 install_element(BGP_IPV6_NODE
, &neighbor_send_community_cmd
);
18511 install_element(BGP_IPV6_NODE
, &neighbor_send_community_type_cmd
);
18512 install_element(BGP_IPV6_NODE
, &no_neighbor_send_community_cmd
);
18513 install_element(BGP_IPV6_NODE
, &no_neighbor_send_community_type_cmd
);
18514 install_element(BGP_IPV6M_NODE
, &neighbor_send_community_cmd
);
18515 install_element(BGP_IPV6M_NODE
, &neighbor_send_community_type_cmd
);
18516 install_element(BGP_IPV6M_NODE
, &no_neighbor_send_community_cmd
);
18517 install_element(BGP_IPV6M_NODE
, &no_neighbor_send_community_type_cmd
);
18518 install_element(BGP_IPV6L_NODE
, &neighbor_send_community_cmd
);
18519 install_element(BGP_IPV6L_NODE
, &neighbor_send_community_type_cmd
);
18520 install_element(BGP_IPV6L_NODE
, &no_neighbor_send_community_cmd
);
18521 install_element(BGP_IPV6L_NODE
, &no_neighbor_send_community_type_cmd
);
18522 install_element(BGP_VPNV4_NODE
, &neighbor_send_community_cmd
);
18523 install_element(BGP_VPNV4_NODE
, &neighbor_send_community_type_cmd
);
18524 install_element(BGP_VPNV4_NODE
, &no_neighbor_send_community_cmd
);
18525 install_element(BGP_VPNV4_NODE
, &no_neighbor_send_community_type_cmd
);
18526 install_element(BGP_VPNV6_NODE
, &neighbor_send_community_cmd
);
18527 install_element(BGP_VPNV6_NODE
, &neighbor_send_community_type_cmd
);
18528 install_element(BGP_VPNV6_NODE
, &no_neighbor_send_community_cmd
);
18529 install_element(BGP_VPNV6_NODE
, &no_neighbor_send_community_type_cmd
);
18531 /* "neighbor route-reflector" commands.*/
18532 install_element(BGP_NODE
, &neighbor_route_reflector_client_hidden_cmd
);
18533 install_element(BGP_NODE
,
18534 &no_neighbor_route_reflector_client_hidden_cmd
);
18535 install_element(BGP_IPV4_NODE
, &neighbor_route_reflector_client_cmd
);
18536 install_element(BGP_IPV4_NODE
, &no_neighbor_route_reflector_client_cmd
);
18537 install_element(BGP_IPV4M_NODE
, &neighbor_route_reflector_client_cmd
);
18538 install_element(BGP_IPV4M_NODE
,
18539 &no_neighbor_route_reflector_client_cmd
);
18540 install_element(BGP_IPV4L_NODE
, &neighbor_route_reflector_client_cmd
);
18541 install_element(BGP_IPV4L_NODE
,
18542 &no_neighbor_route_reflector_client_cmd
);
18543 install_element(BGP_IPV6_NODE
, &neighbor_route_reflector_client_cmd
);
18544 install_element(BGP_IPV6_NODE
, &no_neighbor_route_reflector_client_cmd
);
18545 install_element(BGP_IPV6M_NODE
, &neighbor_route_reflector_client_cmd
);
18546 install_element(BGP_IPV6M_NODE
,
18547 &no_neighbor_route_reflector_client_cmd
);
18548 install_element(BGP_IPV6L_NODE
, &neighbor_route_reflector_client_cmd
);
18549 install_element(BGP_IPV6L_NODE
,
18550 &no_neighbor_route_reflector_client_cmd
);
18551 install_element(BGP_VPNV4_NODE
, &neighbor_route_reflector_client_cmd
);
18552 install_element(BGP_VPNV4_NODE
,
18553 &no_neighbor_route_reflector_client_cmd
);
18554 install_element(BGP_VPNV6_NODE
, &neighbor_route_reflector_client_cmd
);
18555 install_element(BGP_VPNV6_NODE
,
18556 &no_neighbor_route_reflector_client_cmd
);
18557 install_element(BGP_FLOWSPECV4_NODE
,
18558 &neighbor_route_reflector_client_cmd
);
18559 install_element(BGP_FLOWSPECV4_NODE
,
18560 &no_neighbor_route_reflector_client_cmd
);
18561 install_element(BGP_FLOWSPECV6_NODE
,
18562 &neighbor_route_reflector_client_cmd
);
18563 install_element(BGP_FLOWSPECV6_NODE
,
18564 &no_neighbor_route_reflector_client_cmd
);
18565 install_element(BGP_EVPN_NODE
, &neighbor_route_reflector_client_cmd
);
18566 install_element(BGP_EVPN_NODE
, &no_neighbor_route_reflector_client_cmd
);
18568 /* "neighbor route-server" commands.*/
18569 install_element(BGP_NODE
, &neighbor_route_server_client_hidden_cmd
);
18570 install_element(BGP_NODE
, &no_neighbor_route_server_client_hidden_cmd
);
18571 install_element(BGP_IPV4_NODE
, &neighbor_route_server_client_cmd
);
18572 install_element(BGP_IPV4_NODE
, &no_neighbor_route_server_client_cmd
);
18573 install_element(BGP_IPV4M_NODE
, &neighbor_route_server_client_cmd
);
18574 install_element(BGP_IPV4M_NODE
, &no_neighbor_route_server_client_cmd
);
18575 install_element(BGP_IPV4L_NODE
, &neighbor_route_server_client_cmd
);
18576 install_element(BGP_IPV4L_NODE
, &no_neighbor_route_server_client_cmd
);
18577 install_element(BGP_IPV6_NODE
, &neighbor_route_server_client_cmd
);
18578 install_element(BGP_IPV6_NODE
, &no_neighbor_route_server_client_cmd
);
18579 install_element(BGP_IPV6M_NODE
, &neighbor_route_server_client_cmd
);
18580 install_element(BGP_IPV6M_NODE
, &no_neighbor_route_server_client_cmd
);
18581 install_element(BGP_IPV6L_NODE
, &neighbor_route_server_client_cmd
);
18582 install_element(BGP_IPV6L_NODE
, &no_neighbor_route_server_client_cmd
);
18583 install_element(BGP_VPNV4_NODE
, &neighbor_route_server_client_cmd
);
18584 install_element(BGP_VPNV4_NODE
, &no_neighbor_route_server_client_cmd
);
18585 install_element(BGP_VPNV6_NODE
, &neighbor_route_server_client_cmd
);
18586 install_element(BGP_VPNV6_NODE
, &no_neighbor_route_server_client_cmd
);
18587 install_element(BGP_EVPN_NODE
, &neighbor_route_server_client_cmd
);
18588 install_element(BGP_EVPN_NODE
, &no_neighbor_route_server_client_cmd
);
18589 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_route_server_client_cmd
);
18590 install_element(BGP_FLOWSPECV4_NODE
,
18591 &no_neighbor_route_server_client_cmd
);
18592 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_route_server_client_cmd
);
18593 install_element(BGP_FLOWSPECV6_NODE
,
18594 &no_neighbor_route_server_client_cmd
);
18596 /* "neighbor disable-addpath-rx" commands. */
18597 install_element(BGP_IPV4_NODE
, &neighbor_disable_addpath_rx_cmd
);
18598 install_element(BGP_IPV4_NODE
, &no_neighbor_disable_addpath_rx_cmd
);
18599 install_element(BGP_IPV4M_NODE
, &neighbor_disable_addpath_rx_cmd
);
18600 install_element(BGP_IPV4M_NODE
, &no_neighbor_disable_addpath_rx_cmd
);
18601 install_element(BGP_IPV4L_NODE
, &neighbor_disable_addpath_rx_cmd
);
18602 install_element(BGP_IPV4L_NODE
, &no_neighbor_disable_addpath_rx_cmd
);
18603 install_element(BGP_IPV6_NODE
, &neighbor_disable_addpath_rx_cmd
);
18604 install_element(BGP_IPV6_NODE
, &no_neighbor_disable_addpath_rx_cmd
);
18605 install_element(BGP_IPV6M_NODE
, &neighbor_disable_addpath_rx_cmd
);
18606 install_element(BGP_IPV6M_NODE
, &no_neighbor_disable_addpath_rx_cmd
);
18607 install_element(BGP_IPV6L_NODE
, &neighbor_disable_addpath_rx_cmd
);
18608 install_element(BGP_IPV6L_NODE
, &no_neighbor_disable_addpath_rx_cmd
);
18609 install_element(BGP_VPNV4_NODE
, &neighbor_disable_addpath_rx_cmd
);
18610 install_element(BGP_VPNV4_NODE
, &no_neighbor_disable_addpath_rx_cmd
);
18611 install_element(BGP_VPNV6_NODE
, &neighbor_disable_addpath_rx_cmd
);
18612 install_element(BGP_VPNV6_NODE
, &no_neighbor_disable_addpath_rx_cmd
);
18614 /* "neighbor addpath-tx-all-paths" commands.*/
18615 install_element(BGP_NODE
, &neighbor_addpath_tx_all_paths_hidden_cmd
);
18616 install_element(BGP_NODE
, &no_neighbor_addpath_tx_all_paths_hidden_cmd
);
18617 install_element(BGP_IPV4_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
18618 install_element(BGP_IPV4_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
18619 install_element(BGP_IPV4M_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
18620 install_element(BGP_IPV4M_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
18621 install_element(BGP_IPV4L_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
18622 install_element(BGP_IPV4L_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
18623 install_element(BGP_IPV6_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
18624 install_element(BGP_IPV6_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
18625 install_element(BGP_IPV6M_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
18626 install_element(BGP_IPV6M_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
18627 install_element(BGP_IPV6L_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
18628 install_element(BGP_IPV6L_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
18629 install_element(BGP_VPNV4_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
18630 install_element(BGP_VPNV4_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
18631 install_element(BGP_VPNV6_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
18632 install_element(BGP_VPNV6_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
18634 /* "neighbor addpath-tx-bestpath-per-AS" commands.*/
18635 install_element(BGP_NODE
,
18636 &neighbor_addpath_tx_bestpath_per_as_hidden_cmd
);
18637 install_element(BGP_NODE
,
18638 &no_neighbor_addpath_tx_bestpath_per_as_hidden_cmd
);
18639 install_element(BGP_IPV4_NODE
,
18640 &neighbor_addpath_tx_bestpath_per_as_cmd
);
18641 install_element(BGP_IPV4_NODE
,
18642 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
18643 install_element(BGP_IPV4M_NODE
,
18644 &neighbor_addpath_tx_bestpath_per_as_cmd
);
18645 install_element(BGP_IPV4M_NODE
,
18646 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
18647 install_element(BGP_IPV4L_NODE
,
18648 &neighbor_addpath_tx_bestpath_per_as_cmd
);
18649 install_element(BGP_IPV4L_NODE
,
18650 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
18651 install_element(BGP_IPV6_NODE
,
18652 &neighbor_addpath_tx_bestpath_per_as_cmd
);
18653 install_element(BGP_IPV6_NODE
,
18654 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
18655 install_element(BGP_IPV6M_NODE
,
18656 &neighbor_addpath_tx_bestpath_per_as_cmd
);
18657 install_element(BGP_IPV6M_NODE
,
18658 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
18659 install_element(BGP_IPV6L_NODE
,
18660 &neighbor_addpath_tx_bestpath_per_as_cmd
);
18661 install_element(BGP_IPV6L_NODE
,
18662 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
18663 install_element(BGP_VPNV4_NODE
,
18664 &neighbor_addpath_tx_bestpath_per_as_cmd
);
18665 install_element(BGP_VPNV4_NODE
,
18666 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
18667 install_element(BGP_VPNV6_NODE
,
18668 &neighbor_addpath_tx_bestpath_per_as_cmd
);
18669 install_element(BGP_VPNV6_NODE
,
18670 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
18672 /* "neighbor sender-as-path-loop-detection" commands. */
18673 install_element(BGP_NODE
, &neighbor_aspath_loop_detection_cmd
);
18674 install_element(BGP_NODE
, &no_neighbor_aspath_loop_detection_cmd
);
18676 /* "neighbor passive" commands. */
18677 install_element(BGP_NODE
, &neighbor_passive_cmd
);
18678 install_element(BGP_NODE
, &no_neighbor_passive_cmd
);
18681 /* "neighbor shutdown" commands. */
18682 install_element(BGP_NODE
, &neighbor_shutdown_cmd
);
18683 install_element(BGP_NODE
, &no_neighbor_shutdown_cmd
);
18684 install_element(BGP_NODE
, &neighbor_shutdown_msg_cmd
);
18685 install_element(BGP_NODE
, &no_neighbor_shutdown_msg_cmd
);
18686 install_element(BGP_NODE
, &neighbor_shutdown_rtt_cmd
);
18687 install_element(BGP_NODE
, &no_neighbor_shutdown_rtt_cmd
);
18689 /* "neighbor capability extended-nexthop" commands.*/
18690 install_element(BGP_NODE
, &neighbor_capability_enhe_cmd
);
18691 install_element(BGP_NODE
, &no_neighbor_capability_enhe_cmd
);
18693 /* "neighbor capability orf prefix-list" commands.*/
18694 install_element(BGP_NODE
, &neighbor_capability_orf_prefix_hidden_cmd
);
18695 install_element(BGP_NODE
,
18696 &no_neighbor_capability_orf_prefix_hidden_cmd
);
18697 install_element(BGP_IPV4_NODE
, &neighbor_capability_orf_prefix_cmd
);
18698 install_element(BGP_IPV4_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
18699 install_element(BGP_IPV4M_NODE
, &neighbor_capability_orf_prefix_cmd
);
18700 install_element(BGP_IPV4M_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
18701 install_element(BGP_IPV4L_NODE
, &neighbor_capability_orf_prefix_cmd
);
18702 install_element(BGP_IPV4L_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
18703 install_element(BGP_IPV6_NODE
, &neighbor_capability_orf_prefix_cmd
);
18704 install_element(BGP_IPV6_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
18705 install_element(BGP_IPV6M_NODE
, &neighbor_capability_orf_prefix_cmd
);
18706 install_element(BGP_IPV6M_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
18707 install_element(BGP_IPV6L_NODE
, &neighbor_capability_orf_prefix_cmd
);
18708 install_element(BGP_IPV6L_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
18710 /* "neighbor capability dynamic" commands.*/
18711 install_element(BGP_NODE
, &neighbor_capability_dynamic_cmd
);
18712 install_element(BGP_NODE
, &no_neighbor_capability_dynamic_cmd
);
18714 /* "neighbor dont-capability-negotiate" commands. */
18715 install_element(BGP_NODE
, &neighbor_dont_capability_negotiate_cmd
);
18716 install_element(BGP_NODE
, &no_neighbor_dont_capability_negotiate_cmd
);
18718 /* "neighbor ebgp-multihop" commands. */
18719 install_element(BGP_NODE
, &neighbor_ebgp_multihop_cmd
);
18720 install_element(BGP_NODE
, &neighbor_ebgp_multihop_ttl_cmd
);
18721 install_element(BGP_NODE
, &no_neighbor_ebgp_multihop_cmd
);
18723 /* "neighbor disable-connected-check" commands. */
18724 install_element(BGP_NODE
, &neighbor_disable_connected_check_cmd
);
18725 install_element(BGP_NODE
, &no_neighbor_disable_connected_check_cmd
);
18727 /* "neighbor disable-link-bw-encoding-ieee" commands. */
18728 install_element(BGP_NODE
, &neighbor_disable_link_bw_encoding_ieee_cmd
);
18729 install_element(BGP_NODE
,
18730 &no_neighbor_disable_link_bw_encoding_ieee_cmd
);
18732 /* "neighbor extended-optional-parameters" commands. */
18733 install_element(BGP_NODE
, &neighbor_extended_optional_parameters_cmd
);
18734 install_element(BGP_NODE
,
18735 &no_neighbor_extended_optional_parameters_cmd
);
18737 /* "neighbor enforce-first-as" commands. */
18738 install_element(BGP_NODE
, &neighbor_enforce_first_as_cmd
);
18739 install_element(BGP_NODE
, &no_neighbor_enforce_first_as_cmd
);
18741 /* "neighbor description" commands. */
18742 install_element(BGP_NODE
, &neighbor_description_cmd
);
18743 install_element(BGP_NODE
, &no_neighbor_description_cmd
);
18744 install_element(BGP_NODE
, &no_neighbor_description_comment_cmd
);
18746 /* "neighbor update-source" commands. "*/
18747 install_element(BGP_NODE
, &neighbor_update_source_cmd
);
18748 install_element(BGP_NODE
, &no_neighbor_update_source_cmd
);
18750 /* "neighbor default-originate" commands. */
18751 install_element(BGP_NODE
, &neighbor_default_originate_hidden_cmd
);
18752 install_element(BGP_NODE
, &neighbor_default_originate_rmap_hidden_cmd
);
18753 install_element(BGP_NODE
, &no_neighbor_default_originate_hidden_cmd
);
18754 install_element(BGP_IPV4_NODE
, &neighbor_default_originate_cmd
);
18755 install_element(BGP_IPV4_NODE
, &neighbor_default_originate_rmap_cmd
);
18756 install_element(BGP_IPV4_NODE
, &no_neighbor_default_originate_cmd
);
18757 install_element(BGP_IPV4M_NODE
, &neighbor_default_originate_cmd
);
18758 install_element(BGP_IPV4M_NODE
, &neighbor_default_originate_rmap_cmd
);
18759 install_element(BGP_IPV4M_NODE
, &no_neighbor_default_originate_cmd
);
18760 install_element(BGP_IPV4L_NODE
, &neighbor_default_originate_cmd
);
18761 install_element(BGP_IPV4L_NODE
, &neighbor_default_originate_rmap_cmd
);
18762 install_element(BGP_IPV4L_NODE
, &no_neighbor_default_originate_cmd
);
18763 install_element(BGP_IPV6_NODE
, &neighbor_default_originate_cmd
);
18764 install_element(BGP_IPV6_NODE
, &neighbor_default_originate_rmap_cmd
);
18765 install_element(BGP_IPV6_NODE
, &no_neighbor_default_originate_cmd
);
18766 install_element(BGP_IPV6M_NODE
, &neighbor_default_originate_cmd
);
18767 install_element(BGP_IPV6M_NODE
, &neighbor_default_originate_rmap_cmd
);
18768 install_element(BGP_IPV6M_NODE
, &no_neighbor_default_originate_cmd
);
18769 install_element(BGP_IPV6L_NODE
, &neighbor_default_originate_cmd
);
18770 install_element(BGP_IPV6L_NODE
, &neighbor_default_originate_rmap_cmd
);
18771 install_element(BGP_IPV6L_NODE
, &no_neighbor_default_originate_cmd
);
18773 /* "neighbor port" commands. */
18774 install_element(BGP_NODE
, &neighbor_port_cmd
);
18775 install_element(BGP_NODE
, &no_neighbor_port_cmd
);
18777 /* "neighbor weight" commands. */
18778 install_element(BGP_NODE
, &neighbor_weight_hidden_cmd
);
18779 install_element(BGP_NODE
, &no_neighbor_weight_hidden_cmd
);
18781 install_element(BGP_IPV4_NODE
, &neighbor_weight_cmd
);
18782 install_element(BGP_IPV4_NODE
, &no_neighbor_weight_cmd
);
18783 install_element(BGP_IPV4M_NODE
, &neighbor_weight_cmd
);
18784 install_element(BGP_IPV4M_NODE
, &no_neighbor_weight_cmd
);
18785 install_element(BGP_IPV4L_NODE
, &neighbor_weight_cmd
);
18786 install_element(BGP_IPV4L_NODE
, &no_neighbor_weight_cmd
);
18787 install_element(BGP_IPV6_NODE
, &neighbor_weight_cmd
);
18788 install_element(BGP_IPV6_NODE
, &no_neighbor_weight_cmd
);
18789 install_element(BGP_IPV6M_NODE
, &neighbor_weight_cmd
);
18790 install_element(BGP_IPV6M_NODE
, &no_neighbor_weight_cmd
);
18791 install_element(BGP_IPV6L_NODE
, &neighbor_weight_cmd
);
18792 install_element(BGP_IPV6L_NODE
, &no_neighbor_weight_cmd
);
18793 install_element(BGP_VPNV4_NODE
, &neighbor_weight_cmd
);
18794 install_element(BGP_VPNV4_NODE
, &no_neighbor_weight_cmd
);
18795 install_element(BGP_VPNV6_NODE
, &neighbor_weight_cmd
);
18796 install_element(BGP_VPNV6_NODE
, &no_neighbor_weight_cmd
);
18798 /* "neighbor override-capability" commands. */
18799 install_element(BGP_NODE
, &neighbor_override_capability_cmd
);
18800 install_element(BGP_NODE
, &no_neighbor_override_capability_cmd
);
18802 /* "neighbor strict-capability-match" commands. */
18803 install_element(BGP_NODE
, &neighbor_strict_capability_cmd
);
18804 install_element(BGP_NODE
, &no_neighbor_strict_capability_cmd
);
18806 /* "neighbor timers" commands. */
18807 install_element(BGP_NODE
, &neighbor_timers_cmd
);
18808 install_element(BGP_NODE
, &no_neighbor_timers_cmd
);
18810 /* "neighbor timers connect" commands. */
18811 install_element(BGP_NODE
, &neighbor_timers_connect_cmd
);
18812 install_element(BGP_NODE
, &no_neighbor_timers_connect_cmd
);
18814 /* "neighbor timers delayopen" commands. */
18815 install_element(BGP_NODE
, &neighbor_timers_delayopen_cmd
);
18816 install_element(BGP_NODE
, &no_neighbor_timers_delayopen_cmd
);
18818 /* "neighbor advertisement-interval" commands. */
18819 install_element(BGP_NODE
, &neighbor_advertise_interval_cmd
);
18820 install_element(BGP_NODE
, &no_neighbor_advertise_interval_cmd
);
18822 /* "neighbor interface" commands. */
18823 install_element(BGP_NODE
, &neighbor_interface_cmd
);
18824 install_element(BGP_NODE
, &no_neighbor_interface_cmd
);
18826 /* "neighbor distribute" commands. */
18827 install_element(BGP_NODE
, &neighbor_distribute_list_hidden_cmd
);
18828 install_element(BGP_NODE
, &no_neighbor_distribute_list_hidden_cmd
);
18829 install_element(BGP_IPV4_NODE
, &neighbor_distribute_list_cmd
);
18830 install_element(BGP_IPV4_NODE
, &no_neighbor_distribute_list_cmd
);
18831 install_element(BGP_IPV4M_NODE
, &neighbor_distribute_list_cmd
);
18832 install_element(BGP_IPV4M_NODE
, &no_neighbor_distribute_list_cmd
);
18833 install_element(BGP_IPV4L_NODE
, &neighbor_distribute_list_cmd
);
18834 install_element(BGP_IPV4L_NODE
, &no_neighbor_distribute_list_cmd
);
18835 install_element(BGP_IPV6_NODE
, &neighbor_distribute_list_cmd
);
18836 install_element(BGP_IPV6_NODE
, &no_neighbor_distribute_list_cmd
);
18837 install_element(BGP_IPV6M_NODE
, &neighbor_distribute_list_cmd
);
18838 install_element(BGP_IPV6M_NODE
, &no_neighbor_distribute_list_cmd
);
18839 install_element(BGP_IPV6L_NODE
, &neighbor_distribute_list_cmd
);
18840 install_element(BGP_IPV6L_NODE
, &no_neighbor_distribute_list_cmd
);
18841 install_element(BGP_VPNV4_NODE
, &neighbor_distribute_list_cmd
);
18842 install_element(BGP_VPNV4_NODE
, &no_neighbor_distribute_list_cmd
);
18843 install_element(BGP_VPNV6_NODE
, &neighbor_distribute_list_cmd
);
18844 install_element(BGP_VPNV6_NODE
, &no_neighbor_distribute_list_cmd
);
18846 /* "neighbor prefix-list" commands. */
18847 install_element(BGP_NODE
, &neighbor_prefix_list_hidden_cmd
);
18848 install_element(BGP_NODE
, &no_neighbor_prefix_list_hidden_cmd
);
18849 install_element(BGP_IPV4_NODE
, &neighbor_prefix_list_cmd
);
18850 install_element(BGP_IPV4_NODE
, &no_neighbor_prefix_list_cmd
);
18851 install_element(BGP_IPV4M_NODE
, &neighbor_prefix_list_cmd
);
18852 install_element(BGP_IPV4M_NODE
, &no_neighbor_prefix_list_cmd
);
18853 install_element(BGP_IPV4L_NODE
, &neighbor_prefix_list_cmd
);
18854 install_element(BGP_IPV4L_NODE
, &no_neighbor_prefix_list_cmd
);
18855 install_element(BGP_IPV6_NODE
, &neighbor_prefix_list_cmd
);
18856 install_element(BGP_IPV6_NODE
, &no_neighbor_prefix_list_cmd
);
18857 install_element(BGP_IPV6M_NODE
, &neighbor_prefix_list_cmd
);
18858 install_element(BGP_IPV6M_NODE
, &no_neighbor_prefix_list_cmd
);
18859 install_element(BGP_IPV6L_NODE
, &neighbor_prefix_list_cmd
);
18860 install_element(BGP_IPV6L_NODE
, &no_neighbor_prefix_list_cmd
);
18861 install_element(BGP_VPNV4_NODE
, &neighbor_prefix_list_cmd
);
18862 install_element(BGP_VPNV4_NODE
, &no_neighbor_prefix_list_cmd
);
18863 install_element(BGP_VPNV6_NODE
, &neighbor_prefix_list_cmd
);
18864 install_element(BGP_VPNV6_NODE
, &no_neighbor_prefix_list_cmd
);
18865 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_prefix_list_cmd
);
18866 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_prefix_list_cmd
);
18867 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_prefix_list_cmd
);
18868 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_prefix_list_cmd
);
18870 /* "neighbor filter-list" commands. */
18871 install_element(BGP_NODE
, &neighbor_filter_list_hidden_cmd
);
18872 install_element(BGP_NODE
, &no_neighbor_filter_list_hidden_cmd
);
18873 install_element(BGP_IPV4_NODE
, &neighbor_filter_list_cmd
);
18874 install_element(BGP_IPV4_NODE
, &no_neighbor_filter_list_cmd
);
18875 install_element(BGP_IPV4M_NODE
, &neighbor_filter_list_cmd
);
18876 install_element(BGP_IPV4M_NODE
, &no_neighbor_filter_list_cmd
);
18877 install_element(BGP_IPV4L_NODE
, &neighbor_filter_list_cmd
);
18878 install_element(BGP_IPV4L_NODE
, &no_neighbor_filter_list_cmd
);
18879 install_element(BGP_IPV6_NODE
, &neighbor_filter_list_cmd
);
18880 install_element(BGP_IPV6_NODE
, &no_neighbor_filter_list_cmd
);
18881 install_element(BGP_IPV6M_NODE
, &neighbor_filter_list_cmd
);
18882 install_element(BGP_IPV6M_NODE
, &no_neighbor_filter_list_cmd
);
18883 install_element(BGP_IPV6L_NODE
, &neighbor_filter_list_cmd
);
18884 install_element(BGP_IPV6L_NODE
, &no_neighbor_filter_list_cmd
);
18885 install_element(BGP_VPNV4_NODE
, &neighbor_filter_list_cmd
);
18886 install_element(BGP_VPNV4_NODE
, &no_neighbor_filter_list_cmd
);
18887 install_element(BGP_VPNV6_NODE
, &neighbor_filter_list_cmd
);
18888 install_element(BGP_VPNV6_NODE
, &no_neighbor_filter_list_cmd
);
18889 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_filter_list_cmd
);
18890 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_filter_list_cmd
);
18891 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_filter_list_cmd
);
18892 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_filter_list_cmd
);
18894 /* "neighbor route-map" commands. */
18895 install_element(BGP_NODE
, &neighbor_route_map_hidden_cmd
);
18896 install_element(BGP_NODE
, &no_neighbor_route_map_hidden_cmd
);
18897 install_element(BGP_IPV4_NODE
, &neighbor_route_map_cmd
);
18898 install_element(BGP_IPV4_NODE
, &no_neighbor_route_map_cmd
);
18899 install_element(BGP_IPV4M_NODE
, &neighbor_route_map_cmd
);
18900 install_element(BGP_IPV4M_NODE
, &no_neighbor_route_map_cmd
);
18901 install_element(BGP_IPV4L_NODE
, &neighbor_route_map_cmd
);
18902 install_element(BGP_IPV4L_NODE
, &no_neighbor_route_map_cmd
);
18903 install_element(BGP_IPV6_NODE
, &neighbor_route_map_cmd
);
18904 install_element(BGP_IPV6_NODE
, &no_neighbor_route_map_cmd
);
18905 install_element(BGP_IPV6M_NODE
, &neighbor_route_map_cmd
);
18906 install_element(BGP_IPV6M_NODE
, &no_neighbor_route_map_cmd
);
18907 install_element(BGP_IPV6L_NODE
, &neighbor_route_map_cmd
);
18908 install_element(BGP_IPV6L_NODE
, &no_neighbor_route_map_cmd
);
18909 install_element(BGP_VPNV4_NODE
, &neighbor_route_map_cmd
);
18910 install_element(BGP_VPNV4_NODE
, &no_neighbor_route_map_cmd
);
18911 install_element(BGP_VPNV6_NODE
, &neighbor_route_map_cmd
);
18912 install_element(BGP_VPNV6_NODE
, &no_neighbor_route_map_cmd
);
18913 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_route_map_cmd
);
18914 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_route_map_cmd
);
18915 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_route_map_cmd
);
18916 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_route_map_cmd
);
18917 install_element(BGP_EVPN_NODE
, &neighbor_route_map_cmd
);
18918 install_element(BGP_EVPN_NODE
, &no_neighbor_route_map_cmd
);
18920 /* "neighbor unsuppress-map" commands. */
18921 install_element(BGP_NODE
, &neighbor_unsuppress_map_hidden_cmd
);
18922 install_element(BGP_NODE
, &no_neighbor_unsuppress_map_hidden_cmd
);
18923 install_element(BGP_IPV4_NODE
, &neighbor_unsuppress_map_cmd
);
18924 install_element(BGP_IPV4_NODE
, &no_neighbor_unsuppress_map_cmd
);
18925 install_element(BGP_IPV4M_NODE
, &neighbor_unsuppress_map_cmd
);
18926 install_element(BGP_IPV4M_NODE
, &no_neighbor_unsuppress_map_cmd
);
18927 install_element(BGP_IPV4L_NODE
, &neighbor_unsuppress_map_cmd
);
18928 install_element(BGP_IPV4L_NODE
, &no_neighbor_unsuppress_map_cmd
);
18929 install_element(BGP_IPV6_NODE
, &neighbor_unsuppress_map_cmd
);
18930 install_element(BGP_IPV6_NODE
, &no_neighbor_unsuppress_map_cmd
);
18931 install_element(BGP_IPV6M_NODE
, &neighbor_unsuppress_map_cmd
);
18932 install_element(BGP_IPV6M_NODE
, &no_neighbor_unsuppress_map_cmd
);
18933 install_element(BGP_IPV6L_NODE
, &neighbor_unsuppress_map_cmd
);
18934 install_element(BGP_IPV6L_NODE
, &no_neighbor_unsuppress_map_cmd
);
18935 install_element(BGP_VPNV4_NODE
, &neighbor_unsuppress_map_cmd
);
18936 install_element(BGP_VPNV4_NODE
, &no_neighbor_unsuppress_map_cmd
);
18937 install_element(BGP_VPNV6_NODE
, &neighbor_unsuppress_map_cmd
);
18938 install_element(BGP_VPNV6_NODE
, &no_neighbor_unsuppress_map_cmd
);
18940 /* "neighbor advertise-map" commands. */
18941 install_element(BGP_NODE
, &bgp_condadv_period_cmd
);
18942 install_element(BGP_NODE
, &neighbor_advertise_map_hidden_cmd
);
18943 install_element(BGP_IPV4_NODE
, &neighbor_advertise_map_cmd
);
18944 install_element(BGP_IPV4M_NODE
, &neighbor_advertise_map_cmd
);
18945 install_element(BGP_IPV4L_NODE
, &neighbor_advertise_map_cmd
);
18946 install_element(BGP_IPV6_NODE
, &neighbor_advertise_map_cmd
);
18947 install_element(BGP_IPV6M_NODE
, &neighbor_advertise_map_cmd
);
18948 install_element(BGP_IPV6L_NODE
, &neighbor_advertise_map_cmd
);
18949 install_element(BGP_VPNV4_NODE
, &neighbor_advertise_map_cmd
);
18950 install_element(BGP_VPNV6_NODE
, &neighbor_advertise_map_cmd
);
18952 /* neighbor maximum-prefix-out commands. */
18953 install_element(BGP_NODE
, &neighbor_maximum_prefix_out_cmd
);
18954 install_element(BGP_NODE
, &no_neighbor_maximum_prefix_out_cmd
);
18955 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_out_cmd
);
18956 install_element(BGP_IPV4_NODE
, &no_neighbor_maximum_prefix_out_cmd
);
18957 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_out_cmd
);
18958 install_element(BGP_IPV4M_NODE
, &no_neighbor_maximum_prefix_out_cmd
);
18959 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_out_cmd
);
18960 install_element(BGP_IPV4L_NODE
, &no_neighbor_maximum_prefix_out_cmd
);
18961 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_out_cmd
);
18962 install_element(BGP_IPV6_NODE
, &no_neighbor_maximum_prefix_out_cmd
);
18963 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_out_cmd
);
18964 install_element(BGP_IPV6M_NODE
, &no_neighbor_maximum_prefix_out_cmd
);
18965 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_out_cmd
);
18966 install_element(BGP_IPV6L_NODE
, &no_neighbor_maximum_prefix_out_cmd
);
18967 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_out_cmd
);
18968 install_element(BGP_VPNV4_NODE
, &no_neighbor_maximum_prefix_out_cmd
);
18969 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_out_cmd
);
18970 install_element(BGP_VPNV6_NODE
, &no_neighbor_maximum_prefix_out_cmd
);
18972 /* "neighbor maximum-prefix" commands. */
18973 install_element(BGP_NODE
, &neighbor_maximum_prefix_hidden_cmd
);
18974 install_element(BGP_NODE
,
18975 &neighbor_maximum_prefix_threshold_hidden_cmd
);
18976 install_element(BGP_NODE
, &neighbor_maximum_prefix_warning_hidden_cmd
);
18977 install_element(BGP_NODE
,
18978 &neighbor_maximum_prefix_threshold_warning_hidden_cmd
);
18979 install_element(BGP_NODE
, &neighbor_maximum_prefix_restart_hidden_cmd
);
18980 install_element(BGP_NODE
,
18981 &neighbor_maximum_prefix_threshold_restart_hidden_cmd
);
18982 install_element(BGP_NODE
, &no_neighbor_maximum_prefix_hidden_cmd
);
18983 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_cmd
);
18984 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
18985 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_warning_cmd
);
18986 install_element(BGP_IPV4_NODE
,
18987 &neighbor_maximum_prefix_threshold_warning_cmd
);
18988 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_restart_cmd
);
18989 install_element(BGP_IPV4_NODE
,
18990 &neighbor_maximum_prefix_threshold_restart_cmd
);
18991 install_element(BGP_IPV4_NODE
, &no_neighbor_maximum_prefix_cmd
);
18992 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_cmd
);
18993 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
18994 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_warning_cmd
);
18995 install_element(BGP_IPV4M_NODE
,
18996 &neighbor_maximum_prefix_threshold_warning_cmd
);
18997 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_restart_cmd
);
18998 install_element(BGP_IPV4M_NODE
,
18999 &neighbor_maximum_prefix_threshold_restart_cmd
);
19000 install_element(BGP_IPV4M_NODE
, &no_neighbor_maximum_prefix_cmd
);
19001 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_cmd
);
19002 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
19003 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_warning_cmd
);
19004 install_element(BGP_IPV4L_NODE
,
19005 &neighbor_maximum_prefix_threshold_warning_cmd
);
19006 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_restart_cmd
);
19007 install_element(BGP_IPV4L_NODE
,
19008 &neighbor_maximum_prefix_threshold_restart_cmd
);
19009 install_element(BGP_IPV4L_NODE
, &no_neighbor_maximum_prefix_cmd
);
19010 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_cmd
);
19011 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
19012 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_warning_cmd
);
19013 install_element(BGP_IPV6_NODE
,
19014 &neighbor_maximum_prefix_threshold_warning_cmd
);
19015 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_restart_cmd
);
19016 install_element(BGP_IPV6_NODE
,
19017 &neighbor_maximum_prefix_threshold_restart_cmd
);
19018 install_element(BGP_IPV6_NODE
, &no_neighbor_maximum_prefix_cmd
);
19019 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_cmd
);
19020 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
19021 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_warning_cmd
);
19022 install_element(BGP_IPV6M_NODE
,
19023 &neighbor_maximum_prefix_threshold_warning_cmd
);
19024 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_restart_cmd
);
19025 install_element(BGP_IPV6M_NODE
,
19026 &neighbor_maximum_prefix_threshold_restart_cmd
);
19027 install_element(BGP_IPV6M_NODE
, &no_neighbor_maximum_prefix_cmd
);
19028 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_cmd
);
19029 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
19030 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_warning_cmd
);
19031 install_element(BGP_IPV6L_NODE
,
19032 &neighbor_maximum_prefix_threshold_warning_cmd
);
19033 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_restart_cmd
);
19034 install_element(BGP_IPV6L_NODE
,
19035 &neighbor_maximum_prefix_threshold_restart_cmd
);
19036 install_element(BGP_IPV6L_NODE
, &no_neighbor_maximum_prefix_cmd
);
19037 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_cmd
);
19038 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
19039 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_warning_cmd
);
19040 install_element(BGP_VPNV4_NODE
,
19041 &neighbor_maximum_prefix_threshold_warning_cmd
);
19042 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_restart_cmd
);
19043 install_element(BGP_VPNV4_NODE
,
19044 &neighbor_maximum_prefix_threshold_restart_cmd
);
19045 install_element(BGP_VPNV4_NODE
, &no_neighbor_maximum_prefix_cmd
);
19046 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_cmd
);
19047 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
19048 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_warning_cmd
);
19049 install_element(BGP_VPNV6_NODE
,
19050 &neighbor_maximum_prefix_threshold_warning_cmd
);
19051 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_restart_cmd
);
19052 install_element(BGP_VPNV6_NODE
,
19053 &neighbor_maximum_prefix_threshold_restart_cmd
);
19054 install_element(BGP_VPNV6_NODE
, &no_neighbor_maximum_prefix_cmd
);
19056 /* "neighbor allowas-in" */
19057 install_element(BGP_NODE
, &neighbor_allowas_in_hidden_cmd
);
19058 install_element(BGP_NODE
, &no_neighbor_allowas_in_hidden_cmd
);
19059 install_element(BGP_IPV4_NODE
, &neighbor_allowas_in_cmd
);
19060 install_element(BGP_IPV4_NODE
, &no_neighbor_allowas_in_cmd
);
19061 install_element(BGP_IPV4M_NODE
, &neighbor_allowas_in_cmd
);
19062 install_element(BGP_IPV4M_NODE
, &no_neighbor_allowas_in_cmd
);
19063 install_element(BGP_IPV4L_NODE
, &neighbor_allowas_in_cmd
);
19064 install_element(BGP_IPV4L_NODE
, &no_neighbor_allowas_in_cmd
);
19065 install_element(BGP_IPV6_NODE
, &neighbor_allowas_in_cmd
);
19066 install_element(BGP_IPV6_NODE
, &no_neighbor_allowas_in_cmd
);
19067 install_element(BGP_IPV6M_NODE
, &neighbor_allowas_in_cmd
);
19068 install_element(BGP_IPV6M_NODE
, &no_neighbor_allowas_in_cmd
);
19069 install_element(BGP_IPV6L_NODE
, &neighbor_allowas_in_cmd
);
19070 install_element(BGP_IPV6L_NODE
, &no_neighbor_allowas_in_cmd
);
19071 install_element(BGP_VPNV4_NODE
, &neighbor_allowas_in_cmd
);
19072 install_element(BGP_VPNV4_NODE
, &no_neighbor_allowas_in_cmd
);
19073 install_element(BGP_VPNV6_NODE
, &neighbor_allowas_in_cmd
);
19074 install_element(BGP_VPNV6_NODE
, &no_neighbor_allowas_in_cmd
);
19075 install_element(BGP_EVPN_NODE
, &neighbor_allowas_in_cmd
);
19076 install_element(BGP_EVPN_NODE
, &no_neighbor_allowas_in_cmd
);
19078 /* address-family commands. */
19079 install_element(BGP_NODE
, &address_family_ipv4_safi_cmd
);
19080 install_element(BGP_NODE
, &address_family_ipv6_safi_cmd
);
19081 #ifdef KEEP_OLD_VPN_COMMANDS
19082 install_element(BGP_NODE
, &address_family_vpnv4_cmd
);
19083 install_element(BGP_NODE
, &address_family_vpnv6_cmd
);
19084 #endif /* KEEP_OLD_VPN_COMMANDS */
19086 install_element(BGP_NODE
, &address_family_evpn_cmd
);
19088 /* "exit-address-family" command. */
19089 install_element(BGP_IPV4_NODE
, &exit_address_family_cmd
);
19090 install_element(BGP_IPV4M_NODE
, &exit_address_family_cmd
);
19091 install_element(BGP_IPV4L_NODE
, &exit_address_family_cmd
);
19092 install_element(BGP_IPV6_NODE
, &exit_address_family_cmd
);
19093 install_element(BGP_IPV6M_NODE
, &exit_address_family_cmd
);
19094 install_element(BGP_IPV6L_NODE
, &exit_address_family_cmd
);
19095 install_element(BGP_VPNV4_NODE
, &exit_address_family_cmd
);
19096 install_element(BGP_VPNV6_NODE
, &exit_address_family_cmd
);
19097 install_element(BGP_FLOWSPECV4_NODE
, &exit_address_family_cmd
);
19098 install_element(BGP_FLOWSPECV6_NODE
, &exit_address_family_cmd
);
19099 install_element(BGP_EVPN_NODE
, &exit_address_family_cmd
);
19101 /* "clear ip bgp commands" */
19102 install_element(ENABLE_NODE
, &clear_ip_bgp_all_cmd
);
19104 /* clear ip bgp prefix */
19105 install_element(ENABLE_NODE
, &clear_ip_bgp_prefix_cmd
);
19106 install_element(ENABLE_NODE
, &clear_bgp_ipv6_safi_prefix_cmd
);
19107 install_element(ENABLE_NODE
, &clear_bgp_instance_ipv6_safi_prefix_cmd
);
19109 /* "show [ip] bgp summary" commands. */
19110 install_element(VIEW_NODE
, &show_bgp_instance_all_ipv6_updgrps_cmd
);
19111 install_element(VIEW_NODE
, &show_bgp_l2vpn_evpn_updgrps_cmd
);
19112 install_element(VIEW_NODE
, &show_bgp_instance_updgrps_stats_cmd
);
19113 install_element(VIEW_NODE
, &show_bgp_updgrps_stats_cmd
);
19114 install_element(VIEW_NODE
, &show_ip_bgp_instance_updgrps_adj_s_cmd
);
19115 install_element(VIEW_NODE
, &show_ip_bgp_summary_cmd
);
19116 install_element(VIEW_NODE
, &show_ip_bgp_updgrps_cmd
);
19118 /* "show [ip] bgp neighbors" commands. */
19119 install_element(VIEW_NODE
, &show_ip_bgp_neighbors_cmd
);
19121 install_element(VIEW_NODE
, &show_ip_bgp_neighbors_graceful_restart_cmd
);
19123 /* "show [ip] bgp peer-group" commands. */
19124 install_element(VIEW_NODE
, &show_ip_bgp_peer_groups_cmd
);
19126 /* "show [ip] bgp paths" commands. */
19127 install_element(VIEW_NODE
, &show_ip_bgp_paths_cmd
);
19129 /* "show [ip] bgp community" commands. */
19130 install_element(VIEW_NODE
, &show_ip_bgp_community_info_cmd
);
19132 /* "show ip bgp large-community" commands. */
19133 install_element(VIEW_NODE
, &show_ip_bgp_lcommunity_info_cmd
);
19134 /* "show [ip] bgp attribute-info" commands. */
19135 install_element(VIEW_NODE
, &show_ip_bgp_attr_info_cmd
);
19136 /* "show [ip] bgp route-leak" command */
19137 install_element(VIEW_NODE
, &show_ip_bgp_route_leak_cmd
);
19139 /* "redistribute" commands. */
19140 install_element(BGP_NODE
, &bgp_redistribute_ipv4_hidden_cmd
);
19141 install_element(BGP_NODE
, &no_bgp_redistribute_ipv4_hidden_cmd
);
19142 install_element(BGP_NODE
, &bgp_redistribute_ipv4_rmap_hidden_cmd
);
19143 install_element(BGP_NODE
, &bgp_redistribute_ipv4_metric_hidden_cmd
);
19144 install_element(BGP_NODE
,
19145 &bgp_redistribute_ipv4_rmap_metric_hidden_cmd
);
19146 install_element(BGP_NODE
,
19147 &bgp_redistribute_ipv4_metric_rmap_hidden_cmd
);
19148 install_element(BGP_NODE
, &bgp_redistribute_ipv4_ospf_hidden_cmd
);
19149 install_element(BGP_NODE
, &no_bgp_redistribute_ipv4_ospf_hidden_cmd
);
19150 install_element(BGP_NODE
, &bgp_redistribute_ipv4_ospf_rmap_hidden_cmd
);
19151 install_element(BGP_NODE
,
19152 &bgp_redistribute_ipv4_ospf_metric_hidden_cmd
);
19153 install_element(BGP_NODE
,
19154 &bgp_redistribute_ipv4_ospf_rmap_metric_hidden_cmd
);
19155 install_element(BGP_NODE
,
19156 &bgp_redistribute_ipv4_ospf_metric_rmap_hidden_cmd
);
19157 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_cmd
);
19158 install_element(BGP_IPV4_NODE
, &no_bgp_redistribute_ipv4_cmd
);
19159 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_rmap_cmd
);
19160 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_metric_cmd
);
19161 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_rmap_metric_cmd
);
19162 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_metric_rmap_cmd
);
19163 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_ospf_cmd
);
19164 install_element(BGP_IPV4_NODE
, &no_bgp_redistribute_ipv4_ospf_cmd
);
19165 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_ospf_rmap_cmd
);
19166 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_ospf_metric_cmd
);
19167 install_element(BGP_IPV4_NODE
,
19168 &bgp_redistribute_ipv4_ospf_rmap_metric_cmd
);
19169 install_element(BGP_IPV4_NODE
,
19170 &bgp_redistribute_ipv4_ospf_metric_rmap_cmd
);
19171 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_cmd
);
19172 install_element(BGP_IPV6_NODE
, &no_bgp_redistribute_ipv6_cmd
);
19173 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_rmap_cmd
);
19174 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_metric_cmd
);
19175 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_rmap_metric_cmd
);
19176 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_metric_rmap_cmd
);
19178 /* import|export vpn [route-map RMAP_NAME] */
19179 install_element(BGP_IPV4_NODE
, &bgp_imexport_vpn_cmd
);
19180 install_element(BGP_IPV6_NODE
, &bgp_imexport_vpn_cmd
);
19182 install_element(BGP_IPV4_NODE
, &bgp_imexport_vrf_cmd
);
19183 install_element(BGP_IPV6_NODE
, &bgp_imexport_vrf_cmd
);
19185 /* ttl_security commands */
19186 install_element(BGP_NODE
, &neighbor_ttl_security_cmd
);
19187 install_element(BGP_NODE
, &no_neighbor_ttl_security_cmd
);
19189 /* "show [ip] bgp memory" commands. */
19190 install_element(VIEW_NODE
, &show_bgp_memory_cmd
);
19192 /* "show bgp martian next-hop" */
19193 install_element(VIEW_NODE
, &show_bgp_martian_nexthop_db_cmd
);
19195 install_element(VIEW_NODE
, &show_bgp_mac_hash_cmd
);
19197 /* "show [ip] bgp views" commands. */
19198 install_element(VIEW_NODE
, &show_bgp_views_cmd
);
19200 /* "show [ip] bgp vrfs" commands. */
19201 install_element(VIEW_NODE
, &show_bgp_vrfs_cmd
);
19203 /* Community-list. */
19204 community_list_vty();
19206 community_alias_vty();
19208 /* vpn-policy commands */
19209 install_element(BGP_IPV4_NODE
, &af_rd_vpn_export_cmd
);
19210 install_element(BGP_IPV6_NODE
, &af_rd_vpn_export_cmd
);
19211 install_element(BGP_IPV4_NODE
, &af_label_vpn_export_cmd
);
19212 install_element(BGP_IPV6_NODE
, &af_label_vpn_export_cmd
);
19213 install_element(BGP_IPV4_NODE
, &af_nexthop_vpn_export_cmd
);
19214 install_element(BGP_IPV6_NODE
, &af_nexthop_vpn_export_cmd
);
19215 install_element(BGP_IPV4_NODE
, &af_rt_vpn_imexport_cmd
);
19216 install_element(BGP_IPV6_NODE
, &af_rt_vpn_imexport_cmd
);
19217 install_element(BGP_IPV4_NODE
, &af_route_map_vpn_imexport_cmd
);
19218 install_element(BGP_IPV6_NODE
, &af_route_map_vpn_imexport_cmd
);
19219 install_element(BGP_IPV4_NODE
, &af_import_vrf_route_map_cmd
);
19220 install_element(BGP_IPV6_NODE
, &af_import_vrf_route_map_cmd
);
19222 install_element(BGP_IPV4_NODE
, &af_routetarget_import_cmd
);
19223 install_element(BGP_IPV6_NODE
, &af_routetarget_import_cmd
);
19225 install_element(BGP_IPV4_NODE
, &af_no_rd_vpn_export_cmd
);
19226 install_element(BGP_IPV6_NODE
, &af_no_rd_vpn_export_cmd
);
19227 install_element(BGP_IPV4_NODE
, &af_no_label_vpn_export_cmd
);
19228 install_element(BGP_IPV6_NODE
, &af_no_label_vpn_export_cmd
);
19229 install_element(BGP_IPV4_NODE
, &af_no_rt_vpn_imexport_cmd
);
19230 install_element(BGP_IPV6_NODE
, &af_no_rt_vpn_imexport_cmd
);
19231 install_element(BGP_IPV4_NODE
, &af_no_route_map_vpn_imexport_cmd
);
19232 install_element(BGP_IPV6_NODE
, &af_no_route_map_vpn_imexport_cmd
);
19233 install_element(BGP_IPV4_NODE
, &af_no_import_vrf_route_map_cmd
);
19234 install_element(BGP_IPV6_NODE
, &af_no_import_vrf_route_map_cmd
);
19236 /* tcp-mss command */
19237 install_element(BGP_NODE
, &neighbor_tcp_mss_cmd
);
19238 install_element(BGP_NODE
, &no_neighbor_tcp_mss_cmd
);
19240 /* srv6 commands */
19241 install_element(VIEW_NODE
, &show_bgp_srv6_cmd
);
19242 install_element(BGP_NODE
, &bgp_segment_routing_srv6_cmd
);
19243 install_element(BGP_NODE
, &no_bgp_segment_routing_srv6_cmd
);
19244 install_element(BGP_SRV6_NODE
, &bgp_srv6_locator_cmd
);
19245 install_element(BGP_SRV6_NODE
, &no_bgp_srv6_locator_cmd
);
19246 install_element(BGP_IPV4_NODE
, &af_sid_vpn_export_cmd
);
19247 install_element(BGP_IPV6_NODE
, &af_sid_vpn_export_cmd
);
19250 #include "memory.h"
19251 #include "bgp_regex.h"
19252 #include "bgp_clist.h"
19253 #include "bgp_ecommunity.h"
19255 /* VTY functions. */
19257 /* Direction value to string conversion. */
19258 static const char *community_direct_str(int direct
)
19261 case COMMUNITY_DENY
:
19263 case COMMUNITY_PERMIT
:
19270 /* Display error string. */
19271 static void community_list_perror(struct vty
*vty
, int ret
)
19274 case COMMUNITY_LIST_ERR_CANT_FIND_LIST
:
19275 vty_out(vty
, "%% Can't find community-list\n");
19277 case COMMUNITY_LIST_ERR_MALFORMED_VAL
:
19278 vty_out(vty
, "%% Malformed community-list value\n");
19280 case COMMUNITY_LIST_ERR_STANDARD_CONFLICT
:
19282 "%% Community name conflict, previously defined as standard community\n");
19284 case COMMUNITY_LIST_ERR_EXPANDED_CONFLICT
:
19286 "%% Community name conflict, previously defined as expanded community\n");
19291 /* "community-list" keyword help string. */
19292 #define COMMUNITY_LIST_STR "Add a community list entry\n"
19294 /*community-list standard */
19295 DEFUN (community_list_standard
,
19296 bgp_community_list_standard_cmd
,
19297 "bgp community-list <(1-99)|standard COMMUNITY_LIST_NAME> [seq (0-4294967295)] <deny|permit> AA:NN...",
19300 "Community list number (standard)\n"
19301 "Add an standard community-list entry\n"
19302 "Community list name\n"
19303 "Sequence number of an entry\n"
19304 "Sequence number\n"
19305 "Specify community to reject\n"
19306 "Specify community to accept\n"
19309 char *cl_name_or_number
= NULL
;
19312 int style
= COMMUNITY_LIST_STANDARD
;
19315 if (argv_find(argv
, argc
, "(0-4294967295)", &idx
))
19316 seq
= argv
[idx
]->arg
;
19319 argv_find(argv
, argc
, "(1-99)", &idx
);
19320 argv_find(argv
, argc
, "COMMUNITY_LIST_NAME", &idx
);
19321 cl_name_or_number
= argv
[idx
]->arg
;
19322 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
19324 argv_find(argv
, argc
, "AA:NN", &idx
);
19325 char *str
= argv_concat(argv
, argc
, idx
);
19327 int ret
= community_list_set(bgp_clist
, cl_name_or_number
, str
, seq
,
19330 XFREE(MTYPE_TMP
, str
);
19333 /* Display error string. */
19334 community_list_perror(vty
, ret
);
19335 return CMD_WARNING_CONFIG_FAILED
;
19338 return CMD_SUCCESS
;
19341 DEFUN (no_community_list_standard_all
,
19342 no_bgp_community_list_standard_all_cmd
,
19343 "no bgp community-list <(1-99)|standard COMMUNITY_LIST_NAME> [seq (0-4294967295)] <deny|permit> AA:NN...",
19347 "Community list number (standard)\n"
19348 "Add an standard community-list entry\n"
19349 "Community list name\n"
19350 "Sequence number of an entry\n"
19351 "Sequence number\n"
19352 "Specify community to reject\n"
19353 "Specify community to accept\n"
19356 char *cl_name_or_number
= NULL
;
19359 int style
= COMMUNITY_LIST_STANDARD
;
19363 if (argv_find(argv
, argc
, "(0-4294967295)", &idx
))
19364 seq
= argv
[idx
]->arg
;
19367 argv_find(argv
, argc
, "permit", &idx
);
19368 argv_find(argv
, argc
, "deny", &idx
);
19371 direct
= argv_find(argv
, argc
, "permit", &idx
)
19376 argv_find(argv
, argc
, "AA:NN", &idx
);
19377 str
= argv_concat(argv
, argc
, idx
);
19381 argv_find(argv
, argc
, "(1-99)", &idx
);
19382 argv_find(argv
, argc
, "COMMUNITY_LIST_NAME", &idx
);
19383 cl_name_or_number
= argv
[idx
]->arg
;
19385 int ret
= community_list_unset(bgp_clist
, cl_name_or_number
, str
, seq
,
19388 XFREE(MTYPE_TMP
, str
);
19391 community_list_perror(vty
, ret
);
19392 return CMD_WARNING_CONFIG_FAILED
;
19395 return CMD_SUCCESS
;
19398 ALIAS(no_community_list_standard_all
, no_bgp_community_list_standard_all_list_cmd
,
19399 "no bgp community-list <(1-99)|standard COMMUNITY_LIST_NAME>",
19400 NO_STR BGP_STR COMMUNITY_LIST_STR
19401 "Community list number (standard)\n"
19402 "Add an standard community-list entry\n"
19403 "Community list name\n")
19405 /*community-list expanded */
19406 DEFUN (community_list_expanded_all
,
19407 bgp_community_list_expanded_all_cmd
,
19408 "bgp community-list <(100-500)|expanded COMMUNITY_LIST_NAME> [seq (0-4294967295)] <deny|permit> AA:NN...",
19411 "Community list number (expanded)\n"
19412 "Add an expanded community-list entry\n"
19413 "Community list name\n"
19414 "Sequence number of an entry\n"
19415 "Sequence number\n"
19416 "Specify community to reject\n"
19417 "Specify community to accept\n"
19420 char *cl_name_or_number
= NULL
;
19423 int style
= COMMUNITY_LIST_EXPANDED
;
19426 if (argv_find(argv
, argc
, "(0-4294967295)", &idx
))
19427 seq
= argv
[idx
]->arg
;
19431 argv_find(argv
, argc
, "(100-500)", &idx
);
19432 argv_find(argv
, argc
, "COMMUNITY_LIST_NAME", &idx
);
19433 cl_name_or_number
= argv
[idx
]->arg
;
19434 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
19436 argv_find(argv
, argc
, "AA:NN", &idx
);
19437 char *str
= argv_concat(argv
, argc
, idx
);
19439 int ret
= community_list_set(bgp_clist
, cl_name_or_number
, str
, seq
,
19442 XFREE(MTYPE_TMP
, str
);
19445 /* Display error string. */
19446 community_list_perror(vty
, ret
);
19447 return CMD_WARNING_CONFIG_FAILED
;
19450 return CMD_SUCCESS
;
19453 DEFUN (no_community_list_expanded_all
,
19454 no_bgp_community_list_expanded_all_cmd
,
19455 "no bgp community-list <(100-500)|expanded COMMUNITY_LIST_NAME> [seq (0-4294967295)] <deny|permit> AA:NN...",
19459 "Community list number (expanded)\n"
19460 "Add an expanded community-list entry\n"
19461 "Community list name\n"
19462 "Sequence number of an entry\n"
19463 "Sequence number\n"
19464 "Specify community to reject\n"
19465 "Specify community to accept\n"
19468 char *cl_name_or_number
= NULL
;
19472 int style
= COMMUNITY_LIST_EXPANDED
;
19475 if (argv_find(argv
, argc
, "(0-4294967295)", &idx
))
19476 seq
= argv
[idx
]->arg
;
19479 argv_find(argv
, argc
, "permit", &idx
);
19480 argv_find(argv
, argc
, "deny", &idx
);
19483 direct
= argv_find(argv
, argc
, "permit", &idx
)
19488 argv_find(argv
, argc
, "AA:NN", &idx
);
19489 str
= argv_concat(argv
, argc
, idx
);
19493 argv_find(argv
, argc
, "(100-500)", &idx
);
19494 argv_find(argv
, argc
, "COMMUNITY_LIST_NAME", &idx
);
19495 cl_name_or_number
= argv
[idx
]->arg
;
19497 int ret
= community_list_unset(bgp_clist
, cl_name_or_number
, str
, seq
,
19500 XFREE(MTYPE_TMP
, str
);
19503 community_list_perror(vty
, ret
);
19504 return CMD_WARNING_CONFIG_FAILED
;
19507 return CMD_SUCCESS
;
19510 ALIAS(no_community_list_expanded_all
,
19511 no_bgp_community_list_expanded_all_list_cmd
,
19512 "no bgp community-list <(100-500)|expanded COMMUNITY_LIST_NAME>",
19513 NO_STR BGP_STR COMMUNITY_LIST_STR
19514 "Community list number (expanded)\n"
19515 "Add an expanded community-list entry\n"
19516 "Community list name\n")
19518 /* Return configuration string of community-list entry. */
19519 static const char *community_list_config_str(struct community_entry
*entry
)
19526 if (entry
->style
== COMMUNITY_LIST_STANDARD
)
19527 str
= community_str(entry
->u
.com
, false, false);
19528 else if (entry
->style
== LARGE_COMMUNITY_LIST_STANDARD
)
19529 str
= lcommunity_str(entry
->u
.lcom
, false, false);
19531 str
= entry
->config
;
19536 static void community_list_show(struct vty
*vty
, struct community_list
*list
)
19538 struct community_entry
*entry
;
19540 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
19541 if (entry
== list
->head
) {
19542 if (all_digit(list
->name
))
19543 vty_out(vty
, "Community %s list %s\n",
19544 entry
->style
== COMMUNITY_LIST_STANDARD
19546 : "(expanded) access",
19549 vty_out(vty
, "Named Community %s list %s\n",
19550 entry
->style
== COMMUNITY_LIST_STANDARD
19556 vty_out(vty
, " %s\n",
19557 community_direct_str(entry
->direct
));
19559 vty_out(vty
, " %s %s\n",
19560 community_direct_str(entry
->direct
),
19561 community_list_config_str(entry
));
19565 DEFUN (show_community_list
,
19566 show_bgp_community_list_cmd
,
19567 "show bgp community-list",
19570 "List community-list\n")
19572 struct community_list
*list
;
19573 struct community_list_master
*cm
;
19575 cm
= community_list_master_lookup(bgp_clist
, COMMUNITY_LIST_MASTER
);
19577 return CMD_SUCCESS
;
19579 for (list
= cm
->num
.head
; list
; list
= list
->next
)
19580 community_list_show(vty
, list
);
19582 for (list
= cm
->str
.head
; list
; list
= list
->next
)
19583 community_list_show(vty
, list
);
19585 return CMD_SUCCESS
;
19588 DEFUN (show_community_list_arg
,
19589 show_bgp_community_list_arg_cmd
,
19590 "show bgp community-list <(1-500)|COMMUNITY_LIST_NAME> detail",
19593 "List community-list\n"
19594 "Community-list number\n"
19595 "Community-list name\n"
19596 "Detailed information on community-list\n")
19598 int idx_comm_list
= 3;
19599 struct community_list
*list
;
19601 list
= community_list_lookup(bgp_clist
, argv
[idx_comm_list
]->arg
, 0,
19602 COMMUNITY_LIST_MASTER
);
19604 vty_out(vty
, "%% Can't find community-list\n");
19605 return CMD_WARNING
;
19608 community_list_show(vty
, list
);
19610 return CMD_SUCCESS
;
19614 * Large Community code.
19616 static int lcommunity_list_set_vty(struct vty
*vty
, int argc
,
19617 struct cmd_token
**argv
, int style
,
19618 int reject_all_digit_name
)
19627 if (argv_find(argv
, argc
, "(0-4294967295)", &idx
))
19628 seq
= argv
[idx
]->arg
;
19631 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
19634 /* All digit name check. */
19636 argv_find(argv
, argc
, "LCOMMUNITY_LIST_NAME", &idx
);
19637 argv_find(argv
, argc
, "(1-99)", &idx
);
19638 argv_find(argv
, argc
, "(100-500)", &idx
);
19639 cl_name
= argv
[idx
]->arg
;
19640 if (reject_all_digit_name
&& all_digit(cl_name
)) {
19641 vty_out(vty
, "%% Community name cannot have all digits\n");
19642 return CMD_WARNING_CONFIG_FAILED
;
19646 argv_find(argv
, argc
, "AA:BB:CC", &idx
);
19647 argv_find(argv
, argc
, "LINE", &idx
);
19648 /* Concat community string argument. */
19650 str
= argv_concat(argv
, argc
, idx
);
19654 ret
= lcommunity_list_set(bgp_clist
, cl_name
, str
, seq
, direct
, style
);
19656 /* Free temporary community list string allocated by
19658 XFREE(MTYPE_TMP
, str
);
19661 community_list_perror(vty
, ret
);
19662 return CMD_WARNING_CONFIG_FAILED
;
19664 return CMD_SUCCESS
;
19667 static int lcommunity_list_unset_vty(struct vty
*vty
, int argc
,
19668 struct cmd_token
**argv
, int style
)
19676 if (argv_find(argv
, argc
, "(0-4294967295)", &idx
))
19677 seq
= argv
[idx
]->arg
;
19680 argv_find(argv
, argc
, "permit", &idx
);
19681 argv_find(argv
, argc
, "deny", &idx
);
19684 /* Check the list direct. */
19685 if (strncmp(argv
[idx
]->arg
, "p", 1) == 0)
19686 direct
= COMMUNITY_PERMIT
;
19688 direct
= COMMUNITY_DENY
;
19691 argv_find(argv
, argc
, "LINE", &idx
);
19692 argv_find(argv
, argc
, "AA:AA:NN", &idx
);
19693 /* Concat community string argument. */
19694 str
= argv_concat(argv
, argc
, idx
);
19698 argv_find(argv
, argc
, "(1-99)", &idx
);
19699 argv_find(argv
, argc
, "(100-500)", &idx
);
19700 argv_find(argv
, argc
, "LCOMMUNITY_LIST_NAME", &idx
);
19702 /* Unset community list. */
19703 ret
= lcommunity_list_unset(bgp_clist
, argv
[idx
]->arg
, str
, seq
, direct
,
19706 /* Free temporary community list string allocated by
19708 XFREE(MTYPE_TMP
, str
);
19711 community_list_perror(vty
, ret
);
19712 return CMD_WARNING_CONFIG_FAILED
;
19715 return CMD_SUCCESS
;
19718 /* "large-community-list" keyword help string. */
19719 #define LCOMMUNITY_LIST_STR "Add a large community list entry\n"
19720 #define LCOMMUNITY_VAL_STR "large community in 'aa:bb:cc' format\n"
19722 DEFUN (lcommunity_list_standard
,
19723 bgp_lcommunity_list_standard_cmd
,
19724 "bgp large-community-list (1-99) [seq (0-4294967295)] <deny|permit> AA:BB:CC...",
19726 LCOMMUNITY_LIST_STR
19727 "Large Community list number (standard)\n"
19728 "Sequence number of an entry\n"
19729 "Sequence number\n"
19730 "Specify large community to reject\n"
19731 "Specify large community to accept\n"
19732 LCOMMUNITY_VAL_STR
)
19734 return lcommunity_list_set_vty(vty
, argc
, argv
,
19735 LARGE_COMMUNITY_LIST_STANDARD
, 0);
19738 DEFUN (lcommunity_list_expanded
,
19739 bgp_lcommunity_list_expanded_cmd
,
19740 "bgp large-community-list (100-500) [seq (0-4294967295)] <deny|permit> LINE...",
19742 LCOMMUNITY_LIST_STR
19743 "Large Community list number (expanded)\n"
19744 "Sequence number of an entry\n"
19745 "Sequence number\n"
19746 "Specify large community to reject\n"
19747 "Specify large community to accept\n"
19748 "An ordered list as a regular-expression\n")
19750 return lcommunity_list_set_vty(vty
, argc
, argv
,
19751 LARGE_COMMUNITY_LIST_EXPANDED
, 0);
19754 DEFUN (lcommunity_list_name_standard
,
19755 bgp_lcommunity_list_name_standard_cmd
,
19756 "bgp large-community-list standard LCOMMUNITY_LIST_NAME [seq (0-4294967295)] <deny|permit> AA:BB:CC...",
19758 LCOMMUNITY_LIST_STR
19759 "Specify standard large-community-list\n"
19760 "Large Community list name\n"
19761 "Sequence number of an entry\n"
19762 "Sequence number\n"
19763 "Specify large community to reject\n"
19764 "Specify large community to accept\n"
19765 LCOMMUNITY_VAL_STR
)
19767 return lcommunity_list_set_vty(vty
, argc
, argv
,
19768 LARGE_COMMUNITY_LIST_STANDARD
, 1);
19771 DEFUN (lcommunity_list_name_expanded
,
19772 bgp_lcommunity_list_name_expanded_cmd
,
19773 "bgp large-community-list expanded LCOMMUNITY_LIST_NAME [seq (0-4294967295)] <deny|permit> LINE...",
19775 LCOMMUNITY_LIST_STR
19776 "Specify expanded large-community-list\n"
19777 "Large Community list name\n"
19778 "Sequence number of an entry\n"
19779 "Sequence number\n"
19780 "Specify large community to reject\n"
19781 "Specify large community to accept\n"
19782 "An ordered list as a regular-expression\n")
19784 return lcommunity_list_set_vty(vty
, argc
, argv
,
19785 LARGE_COMMUNITY_LIST_EXPANDED
, 1);
19788 DEFUN (no_lcommunity_list_all
,
19789 no_bgp_lcommunity_list_all_cmd
,
19790 "no bgp large-community-list <(1-99)|(100-500)|LCOMMUNITY_LIST_NAME>",
19793 LCOMMUNITY_LIST_STR
19794 "Large Community list number (standard)\n"
19795 "Large Community list number (expanded)\n"
19796 "Large Community list name\n")
19798 return lcommunity_list_unset_vty(vty
, argc
, argv
,
19799 LARGE_COMMUNITY_LIST_STANDARD
);
19802 DEFUN (no_lcommunity_list_name_standard_all
,
19803 no_bgp_lcommunity_list_name_standard_all_cmd
,
19804 "no bgp large-community-list standard LCOMMUNITY_LIST_NAME",
19807 LCOMMUNITY_LIST_STR
19808 "Specify standard large-community-list\n"
19809 "Large Community list name\n")
19811 return lcommunity_list_unset_vty(vty
, argc
, argv
,
19812 LARGE_COMMUNITY_LIST_STANDARD
);
19815 DEFUN (no_lcommunity_list_name_expanded_all
,
19816 no_bgp_lcommunity_list_name_expanded_all_cmd
,
19817 "no bgp large-community-list expanded LCOMMUNITY_LIST_NAME",
19820 LCOMMUNITY_LIST_STR
19821 "Specify expanded large-community-list\n"
19822 "Large Community list name\n")
19824 return lcommunity_list_unset_vty(vty
, argc
, argv
,
19825 LARGE_COMMUNITY_LIST_EXPANDED
);
19828 DEFUN (no_lcommunity_list_standard
,
19829 no_bgp_lcommunity_list_standard_cmd
,
19830 "no bgp large-community-list (1-99) [seq (0-4294967295)] <deny|permit> AA:AA:NN...",
19833 LCOMMUNITY_LIST_STR
19834 "Large Community list number (standard)\n"
19835 "Sequence number of an entry\n"
19836 "Sequence number\n"
19837 "Specify large community to reject\n"
19838 "Specify large community to accept\n"
19839 LCOMMUNITY_VAL_STR
)
19841 return lcommunity_list_unset_vty(vty
, argc
, argv
,
19842 LARGE_COMMUNITY_LIST_STANDARD
);
19845 DEFUN (no_lcommunity_list_expanded
,
19846 no_bgp_lcommunity_list_expanded_cmd
,
19847 "no bgp large-community-list (100-500) [seq (0-4294967295)] <deny|permit> LINE...",
19850 LCOMMUNITY_LIST_STR
19851 "Large Community list number (expanded)\n"
19852 "Sequence number of an entry\n"
19853 "Sequence number\n"
19854 "Specify large community to reject\n"
19855 "Specify large community to accept\n"
19856 "An ordered list as a regular-expression\n")
19858 return lcommunity_list_unset_vty(vty
, argc
, argv
,
19859 LARGE_COMMUNITY_LIST_EXPANDED
);
19862 DEFUN (no_lcommunity_list_name_standard
,
19863 no_bgp_lcommunity_list_name_standard_cmd
,
19864 "no bgp large-community-list standard LCOMMUNITY_LIST_NAME [seq (0-4294967295)] <deny|permit> AA:AA:NN...",
19867 LCOMMUNITY_LIST_STR
19868 "Specify standard large-community-list\n"
19869 "Large Community list name\n"
19870 "Sequence number of an entry\n"
19871 "Sequence number\n"
19872 "Specify large community to reject\n"
19873 "Specify large community to accept\n"
19874 LCOMMUNITY_VAL_STR
)
19876 return lcommunity_list_unset_vty(vty
, argc
, argv
,
19877 LARGE_COMMUNITY_LIST_STANDARD
);
19880 DEFUN (no_lcommunity_list_name_expanded
,
19881 no_bgp_lcommunity_list_name_expanded_cmd
,
19882 "no bgp large-community-list expanded LCOMMUNITY_LIST_NAME [seq (0-4294967295)] <deny|permit> LINE...",
19885 LCOMMUNITY_LIST_STR
19886 "Specify expanded large-community-list\n"
19887 "Large community list name\n"
19888 "Sequence number of an entry\n"
19889 "Sequence number\n"
19890 "Specify large community to reject\n"
19891 "Specify large community to accept\n"
19892 "An ordered list as a regular-expression\n")
19894 return lcommunity_list_unset_vty(vty
, argc
, argv
,
19895 LARGE_COMMUNITY_LIST_EXPANDED
);
19898 static void lcommunity_list_show(struct vty
*vty
, struct community_list
*list
)
19900 struct community_entry
*entry
;
19902 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
19903 if (entry
== list
->head
) {
19904 if (all_digit(list
->name
))
19905 vty_out(vty
, "Large community %s list %s\n",
19907 LARGE_COMMUNITY_LIST_STANDARD
19909 : "(expanded) access",
19913 "Named large community %s list %s\n",
19915 LARGE_COMMUNITY_LIST_STANDARD
19921 vty_out(vty
, " %s\n",
19922 community_direct_str(entry
->direct
));
19924 vty_out(vty
, " %s %s\n",
19925 community_direct_str(entry
->direct
),
19926 community_list_config_str(entry
));
19930 DEFUN (show_lcommunity_list
,
19931 show_bgp_lcommunity_list_cmd
,
19932 "show bgp large-community-list",
19935 "List large-community list\n")
19937 struct community_list
*list
;
19938 struct community_list_master
*cm
;
19940 cm
= community_list_master_lookup(bgp_clist
,
19941 LARGE_COMMUNITY_LIST_MASTER
);
19943 return CMD_SUCCESS
;
19945 for (list
= cm
->num
.head
; list
; list
= list
->next
)
19946 lcommunity_list_show(vty
, list
);
19948 for (list
= cm
->str
.head
; list
; list
= list
->next
)
19949 lcommunity_list_show(vty
, list
);
19951 return CMD_SUCCESS
;
19954 DEFUN (show_lcommunity_list_arg
,
19955 show_bgp_lcommunity_list_arg_cmd
,
19956 "show bgp large-community-list <(1-500)|LCOMMUNITY_LIST_NAME> detail",
19959 "List large-community list\n"
19960 "Large-community-list number\n"
19961 "Large-community-list name\n"
19962 "Detailed information on large-community-list\n")
19964 struct community_list
*list
;
19966 list
= community_list_lookup(bgp_clist
, argv
[3]->arg
, 0,
19967 LARGE_COMMUNITY_LIST_MASTER
);
19969 vty_out(vty
, "%% Can't find large-community-list\n");
19970 return CMD_WARNING
;
19973 lcommunity_list_show(vty
, list
);
19975 return CMD_SUCCESS
;
19978 /* "extcommunity-list" keyword help string. */
19979 #define EXTCOMMUNITY_LIST_STR "Add a extended community list entry\n"
19980 #define EXTCOMMUNITY_VAL_STR "Extended community attribute in 'rt aa:nn_or_IPaddr:nn' OR 'soo aa:nn_or_IPaddr:nn' format\n"
19982 DEFUN (extcommunity_list_standard
,
19983 bgp_extcommunity_list_standard_cmd
,
19984 "bgp extcommunity-list <(1-99)|standard EXTCOMMUNITY_LIST_NAME> [seq (0-4294967295)] <deny|permit> AA:NN...",
19986 EXTCOMMUNITY_LIST_STR
19987 "Extended Community list number (standard)\n"
19988 "Specify standard extcommunity-list\n"
19989 "Community list name\n"
19990 "Sequence number of an entry\n"
19991 "Sequence number\n"
19992 "Specify community to reject\n"
19993 "Specify community to accept\n"
19994 EXTCOMMUNITY_VAL_STR
)
19996 int style
= EXTCOMMUNITY_LIST_STANDARD
;
19998 char *cl_number_or_name
= NULL
;
20003 argv_find(argv
, argc
, "(1-99)", &idx
);
20004 argv_find(argv
, argc
, "EXTCOMMUNITY_LIST_NAME", &idx
);
20005 cl_number_or_name
= argv
[idx
]->arg
;
20007 if (argv_find(argv
, argc
, "(0-4294967295)", &idx
))
20008 seq
= argv
[idx
]->arg
;
20010 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
20012 argv_find(argv
, argc
, "AA:NN", &idx
);
20013 char *str
= argv_concat(argv
, argc
, idx
);
20015 int ret
= extcommunity_list_set(bgp_clist
, cl_number_or_name
, str
, seq
,
20018 XFREE(MTYPE_TMP
, str
);
20021 community_list_perror(vty
, ret
);
20022 return CMD_WARNING_CONFIG_FAILED
;
20025 return CMD_SUCCESS
;
20028 DEFUN (extcommunity_list_name_expanded
,
20029 bgp_extcommunity_list_name_expanded_cmd
,
20030 "bgp extcommunity-list <(100-500)|expanded EXTCOMMUNITY_LIST_NAME> [seq (0-4294967295)] <deny|permit> LINE...",
20032 EXTCOMMUNITY_LIST_STR
20033 "Extended Community list number (expanded)\n"
20034 "Specify expanded extcommunity-list\n"
20035 "Extended Community list name\n"
20036 "Sequence number of an entry\n"
20037 "Sequence number\n"
20038 "Specify community to reject\n"
20039 "Specify community to accept\n"
20040 "An ordered list as a regular-expression\n")
20042 int style
= EXTCOMMUNITY_LIST_EXPANDED
;
20044 char *cl_number_or_name
= NULL
;
20048 argv_find(argv
, argc
, "(100-500)", &idx
);
20049 argv_find(argv
, argc
, "EXTCOMMUNITY_LIST_NAME", &idx
);
20050 cl_number_or_name
= argv
[idx
]->arg
;
20052 if (argv_find(argv
, argc
, "(0-4294967295)", &idx
))
20053 seq
= argv
[idx
]->arg
;
20055 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
20057 argv_find(argv
, argc
, "LINE", &idx
);
20058 char *str
= argv_concat(argv
, argc
, idx
);
20060 int ret
= extcommunity_list_set(bgp_clist
, cl_number_or_name
, str
, seq
,
20063 XFREE(MTYPE_TMP
, str
);
20066 community_list_perror(vty
, ret
);
20067 return CMD_WARNING_CONFIG_FAILED
;
20070 return CMD_SUCCESS
;
20073 DEFUN (no_extcommunity_list_standard_all
,
20074 no_bgp_extcommunity_list_standard_all_cmd
,
20075 "no bgp extcommunity-list <(1-99)|standard EXTCOMMUNITY_LIST_NAME> [seq (0-4294967295)] <deny|permit> AA:NN...",
20078 EXTCOMMUNITY_LIST_STR
20079 "Extended Community list number (standard)\n"
20080 "Specify standard extcommunity-list\n"
20081 "Community list name\n"
20082 "Sequence number of an entry\n"
20083 "Sequence number\n"
20084 "Specify community to reject\n"
20085 "Specify community to accept\n"
20086 EXTCOMMUNITY_VAL_STR
)
20088 int style
= EXTCOMMUNITY_LIST_STANDARD
;
20090 char *cl_number_or_name
= NULL
;
20095 if (argv_find(argv
, argc
, "(0-4294967295)", &idx
))
20096 seq
= argv
[idx
]->arg
;
20099 argv_find(argv
, argc
, "permit", &idx
);
20100 argv_find(argv
, argc
, "deny", &idx
);
20102 direct
= argv_find(argv
, argc
, "permit", &idx
)
20107 argv_find(argv
, argc
, "AA:NN", &idx
);
20108 str
= argv_concat(argv
, argc
, idx
);
20112 argv_find(argv
, argc
, "(1-99)", &idx
);
20113 argv_find(argv
, argc
, "EXTCOMMUNITY_LIST_NAME", &idx
);
20114 cl_number_or_name
= argv
[idx
]->arg
;
20116 int ret
= extcommunity_list_unset(bgp_clist
, cl_number_or_name
, str
,
20117 seq
, direct
, style
);
20119 XFREE(MTYPE_TMP
, str
);
20122 community_list_perror(vty
, ret
);
20123 return CMD_WARNING_CONFIG_FAILED
;
20126 return CMD_SUCCESS
;
20129 ALIAS(no_extcommunity_list_standard_all
,
20130 no_bgp_extcommunity_list_standard_all_list_cmd
,
20131 "no bgp extcommunity-list <(1-99)|standard EXTCOMMUNITY_LIST_NAME>",
20132 NO_STR BGP_STR EXTCOMMUNITY_LIST_STR
20133 "Extended Community list number (standard)\n"
20134 "Specify standard extcommunity-list\n"
20135 "Community list name\n")
20137 DEFUN (no_extcommunity_list_expanded_all
,
20138 no_bgp_extcommunity_list_expanded_all_cmd
,
20139 "no bgp extcommunity-list <(100-500)|expanded EXTCOMMUNITY_LIST_NAME> [seq (0-4294967295)] <deny|permit> LINE...",
20142 EXTCOMMUNITY_LIST_STR
20143 "Extended Community list number (expanded)\n"
20144 "Specify expanded extcommunity-list\n"
20145 "Extended Community list name\n"
20146 "Sequence number of an entry\n"
20147 "Sequence number\n"
20148 "Specify community to reject\n"
20149 "Specify community to accept\n"
20150 "An ordered list as a regular-expression\n")
20152 int style
= EXTCOMMUNITY_LIST_EXPANDED
;
20154 char *cl_number_or_name
= NULL
;
20159 if (argv_find(argv
, argc
, "(0-4294967295)", &idx
))
20160 seq
= argv
[idx
]->arg
;
20163 argv_find(argv
, argc
, "permit", &idx
);
20164 argv_find(argv
, argc
, "deny", &idx
);
20167 direct
= argv_find(argv
, argc
, "permit", &idx
)
20172 argv_find(argv
, argc
, "LINE", &idx
);
20173 str
= argv_concat(argv
, argc
, idx
);
20177 argv_find(argv
, argc
, "(100-500)", &idx
);
20178 argv_find(argv
, argc
, "EXTCOMMUNITY_LIST_NAME", &idx
);
20179 cl_number_or_name
= argv
[idx
]->arg
;
20181 int ret
= extcommunity_list_unset(bgp_clist
, cl_number_or_name
, str
,
20182 seq
, direct
, style
);
20184 XFREE(MTYPE_TMP
, str
);
20187 community_list_perror(vty
, ret
);
20188 return CMD_WARNING_CONFIG_FAILED
;
20191 return CMD_SUCCESS
;
20194 ALIAS(no_extcommunity_list_expanded_all
,
20195 no_bgp_extcommunity_list_expanded_all_list_cmd
,
20196 "no bgp extcommunity-list <(100-500)|expanded EXTCOMMUNITY_LIST_NAME>",
20197 NO_STR BGP_STR EXTCOMMUNITY_LIST_STR
20198 "Extended Community list number (expanded)\n"
20199 "Specify expanded extcommunity-list\n"
20200 "Extended Community list name\n")
20202 static void extcommunity_list_show(struct vty
*vty
, struct community_list
*list
)
20204 struct community_entry
*entry
;
20206 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
20207 if (entry
== list
->head
) {
20208 if (all_digit(list
->name
))
20209 vty_out(vty
, "Extended community %s list %s\n",
20210 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
20212 : "(expanded) access",
20216 "Named extended community %s list %s\n",
20217 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
20223 vty_out(vty
, " %s\n",
20224 community_direct_str(entry
->direct
));
20226 vty_out(vty
, " %s %s\n",
20227 community_direct_str(entry
->direct
),
20228 community_list_config_str(entry
));
20232 DEFUN (show_extcommunity_list
,
20233 show_bgp_extcommunity_list_cmd
,
20234 "show bgp extcommunity-list",
20237 "List extended-community list\n")
20239 struct community_list
*list
;
20240 struct community_list_master
*cm
;
20242 cm
= community_list_master_lookup(bgp_clist
, EXTCOMMUNITY_LIST_MASTER
);
20244 return CMD_SUCCESS
;
20246 for (list
= cm
->num
.head
; list
; list
= list
->next
)
20247 extcommunity_list_show(vty
, list
);
20249 for (list
= cm
->str
.head
; list
; list
= list
->next
)
20250 extcommunity_list_show(vty
, list
);
20252 return CMD_SUCCESS
;
20255 DEFUN (show_extcommunity_list_arg
,
20256 show_bgp_extcommunity_list_arg_cmd
,
20257 "show bgp extcommunity-list <(1-500)|EXTCOMMUNITY_LIST_NAME> detail",
20260 "List extended-community list\n"
20261 "Extcommunity-list number\n"
20262 "Extcommunity-list name\n"
20263 "Detailed information on extcommunity-list\n")
20265 int idx_comm_list
= 3;
20266 struct community_list
*list
;
20268 list
= community_list_lookup(bgp_clist
, argv
[idx_comm_list
]->arg
, 0,
20269 EXTCOMMUNITY_LIST_MASTER
);
20271 vty_out(vty
, "%% Can't find extcommunity-list\n");
20272 return CMD_WARNING
;
20275 extcommunity_list_show(vty
, list
);
20277 return CMD_SUCCESS
;
20280 /* Display community-list and extcommunity-list configuration. */
20281 static int community_list_config_write(struct vty
*vty
)
20283 struct community_list
*list
;
20284 struct community_entry
*entry
;
20285 struct community_list_master
*cm
;
20288 /* Community-list. */
20289 cm
= community_list_master_lookup(bgp_clist
, COMMUNITY_LIST_MASTER
);
20291 for (list
= cm
->num
.head
; list
; list
= list
->next
)
20292 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
20294 "bgp community-list %s seq %" PRId64
" %s %s\n",
20295 list
->name
, entry
->seq
,
20296 community_direct_str(entry
->direct
),
20297 community_list_config_str(entry
));
20300 for (list
= cm
->str
.head
; list
; list
= list
->next
)
20301 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
20303 "bgp community-list %s %s seq %" PRId64
" %s %s\n",
20304 entry
->style
== COMMUNITY_LIST_STANDARD
20307 list
->name
, entry
->seq
,
20308 community_direct_str(entry
->direct
),
20309 community_list_config_str(entry
));
20313 /* Extcommunity-list. */
20314 cm
= community_list_master_lookup(bgp_clist
, EXTCOMMUNITY_LIST_MASTER
);
20316 for (list
= cm
->num
.head
; list
; list
= list
->next
)
20317 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
20319 "bgp extcommunity-list %s seq %" PRId64
" %s %s\n",
20320 list
->name
, entry
->seq
,
20321 community_direct_str(entry
->direct
),
20322 community_list_config_str(entry
));
20325 for (list
= cm
->str
.head
; list
; list
= list
->next
)
20326 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
20328 "bgp extcommunity-list %s %s seq %" PRId64
" %s %s\n",
20329 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
20332 list
->name
, entry
->seq
,
20333 community_direct_str(entry
->direct
),
20334 community_list_config_str(entry
));
20339 /* lcommunity-list. */
20340 cm
= community_list_master_lookup(bgp_clist
,
20341 LARGE_COMMUNITY_LIST_MASTER
);
20343 for (list
= cm
->num
.head
; list
; list
= list
->next
)
20344 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
20346 "bgp large-community-list %s seq %" PRId64
" %s %s\n",
20347 list
->name
, entry
->seq
,
20348 community_direct_str(entry
->direct
),
20349 community_list_config_str(entry
));
20352 for (list
= cm
->str
.head
; list
; list
= list
->next
)
20353 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
20355 "bgp large-community-list %s %s seq %" PRId64
" %s %s\n",
20357 entry
->style
== LARGE_COMMUNITY_LIST_STANDARD
20360 list
->name
, entry
->seq
, community_direct_str(entry
->direct
),
20361 community_list_config_str(entry
));
20368 static int community_list_config_write(struct vty
*vty
);
20369 static struct cmd_node community_list_node
= {
20370 .name
= "community list",
20371 .node
= COMMUNITY_LIST_NODE
,
20373 .config_write
= community_list_config_write
,
20376 static void community_list_vty(void)
20378 install_node(&community_list_node
);
20380 /* Community-list. */
20381 install_element(CONFIG_NODE
, &bgp_community_list_standard_cmd
);
20382 install_element(CONFIG_NODE
, &bgp_community_list_expanded_all_cmd
);
20383 install_element(CONFIG_NODE
, &no_bgp_community_list_standard_all_cmd
);
20384 install_element(CONFIG_NODE
, &no_bgp_community_list_standard_all_list_cmd
);
20385 install_element(CONFIG_NODE
, &no_bgp_community_list_expanded_all_cmd
);
20386 install_element(CONFIG_NODE
, &no_bgp_community_list_expanded_all_list_cmd
);
20387 install_element(VIEW_NODE
, &show_bgp_community_list_cmd
);
20388 install_element(VIEW_NODE
, &show_bgp_community_list_arg_cmd
);
20390 /* Extcommunity-list. */
20391 install_element(CONFIG_NODE
, &bgp_extcommunity_list_standard_cmd
);
20392 install_element(CONFIG_NODE
, &bgp_extcommunity_list_name_expanded_cmd
);
20393 install_element(CONFIG_NODE
, &no_bgp_extcommunity_list_standard_all_cmd
);
20394 install_element(CONFIG_NODE
,
20395 &no_bgp_extcommunity_list_standard_all_list_cmd
);
20396 install_element(CONFIG_NODE
, &no_bgp_extcommunity_list_expanded_all_cmd
);
20397 install_element(CONFIG_NODE
,
20398 &no_bgp_extcommunity_list_expanded_all_list_cmd
);
20399 install_element(VIEW_NODE
, &show_bgp_extcommunity_list_cmd
);
20400 install_element(VIEW_NODE
, &show_bgp_extcommunity_list_arg_cmd
);
20402 /* Large Community List */
20403 install_element(CONFIG_NODE
, &bgp_lcommunity_list_standard_cmd
);
20404 install_element(CONFIG_NODE
, &bgp_lcommunity_list_expanded_cmd
);
20405 install_element(CONFIG_NODE
, &bgp_lcommunity_list_name_standard_cmd
);
20406 install_element(CONFIG_NODE
, &bgp_lcommunity_list_name_expanded_cmd
);
20407 install_element(CONFIG_NODE
, &no_bgp_lcommunity_list_all_cmd
);
20408 install_element(CONFIG_NODE
,
20409 &no_bgp_lcommunity_list_name_standard_all_cmd
);
20410 install_element(CONFIG_NODE
,
20411 &no_bgp_lcommunity_list_name_expanded_all_cmd
);
20412 install_element(CONFIG_NODE
, &no_bgp_lcommunity_list_standard_cmd
);
20413 install_element(CONFIG_NODE
, &no_bgp_lcommunity_list_expanded_cmd
);
20414 install_element(CONFIG_NODE
, &no_bgp_lcommunity_list_name_standard_cmd
);
20415 install_element(CONFIG_NODE
, &no_bgp_lcommunity_list_name_expanded_cmd
);
20416 install_element(VIEW_NODE
, &show_bgp_lcommunity_list_cmd
);
20417 install_element(VIEW_NODE
, &show_bgp_lcommunity_list_arg_cmd
);
20419 bgp_community_list_command_completion_setup();
20422 static struct cmd_node community_alias_node
= {
20423 .name
= "community alias",
20424 .node
= COMMUNITY_ALIAS_NODE
,
20426 .config_write
= bgp_community_alias_write
,
20429 void community_alias_vty(void)
20431 install_node(&community_alias_node
);
20433 /* Community-list. */
20434 install_element(CONFIG_NODE
, &bgp_community_alias_cmd
);
20436 bgp_community_alias_command_completion_setup();