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_nht.h"
57 #include "bgpd/bgp_nexthop.h"
58 #include "bgpd/bgp_network.h"
59 #include "bgpd/bgp_open.h"
60 #include "bgpd/bgp_regex.h"
61 #include "bgpd/bgp_route.h"
62 #include "bgpd/bgp_mplsvpn.h"
63 #include "bgpd/bgp_zebra.h"
64 #include "bgpd/bgp_table.h"
65 #include "bgpd/bgp_vty.h"
66 #include "bgpd/bgp_mpath.h"
67 #include "bgpd/bgp_packet.h"
68 #include "bgpd/bgp_updgrp.h"
69 #include "bgpd/bgp_bfd.h"
70 #include "bgpd/bgp_io.h"
71 #include "bgpd/bgp_evpn.h"
72 #include "bgpd/bgp_evpn_vty.h"
73 #include "bgpd/bgp_evpn_mh.h"
74 #include "bgpd/bgp_addpath.h"
75 #include "bgpd/bgp_mac.h"
76 #include "bgpd/bgp_flowspec.h"
77 #include "bgpd/bgp_conditional_adv.h"
79 #include "bgpd/rfapi/bgp_rfapi_cfg.h"
81 #include "bgpd/bgp_orr.h"
84 FRR_CFG_DEFAULT_BOOL(BGP_IMPORT_CHECK
,
87 .match_profile
= "traditional",
88 .match_version
= "< 7.4",
92 FRR_CFG_DEFAULT_BOOL(BGP_SHOW_HOSTNAME
,
93 { .val_bool
= true, .match_profile
= "datacenter", },
94 { .val_bool
= false },
96 FRR_CFG_DEFAULT_BOOL(BGP_SHOW_NEXTHOP_HOSTNAME
,
97 { .val_bool
= true, .match_profile
= "datacenter", },
98 { .val_bool
= false },
100 FRR_CFG_DEFAULT_BOOL(BGP_LOG_NEIGHBOR_CHANGES
,
101 { .val_bool
= true, .match_profile
= "datacenter", },
102 { .val_bool
= false },
104 FRR_CFG_DEFAULT_BOOL(BGP_DETERMINISTIC_MED
,
105 { .val_bool
= true, .match_profile
= "datacenter", },
106 { .val_bool
= false },
108 FRR_CFG_DEFAULT_ULONG(BGP_CONNECT_RETRY
,
109 { .val_ulong
= 10, .match_profile
= "datacenter", },
110 { .val_ulong
= 120 },
112 FRR_CFG_DEFAULT_ULONG(BGP_HOLDTIME
,
113 { .val_ulong
= 9, .match_profile
= "datacenter", },
114 { .val_ulong
= 180 },
116 FRR_CFG_DEFAULT_ULONG(BGP_KEEPALIVE
,
117 { .val_ulong
= 3, .match_profile
= "datacenter", },
120 FRR_CFG_DEFAULT_BOOL(BGP_EBGP_REQUIRES_POLICY
,
121 { .val_bool
= false, .match_profile
= "datacenter", },
122 { .val_bool
= false, .match_version
= "< 7.4", },
123 { .val_bool
= true },
125 FRR_CFG_DEFAULT_BOOL(BGP_SUPPRESS_DUPLICATES
,
126 { .val_bool
= false, .match_version
= "< 7.6", },
127 { .val_bool
= true },
129 FRR_CFG_DEFAULT_BOOL(BGP_GRACEFUL_NOTIFICATION
,
130 { .val_bool
= false, .match_version
= "< 8.3", },
131 { .val_bool
= true },
133 FRR_CFG_DEFAULT_BOOL(BGP_HARD_ADMIN_RESET
,
134 { .val_bool
= false, .match_version
= "< 8.3", },
135 { .val_bool
= true },
138 DEFINE_HOOK(bgp_inst_config_write
,
139 (struct bgp
*bgp
, struct vty
*vty
),
141 DEFINE_HOOK(bgp_snmp_update_last_changed
, (struct bgp
*bgp
), (bgp
));
142 DEFINE_HOOK(bgp_snmp_init_stats
, (struct bgp
*bgp
), (bgp
));
144 static struct peer_group
*listen_range_exists(struct bgp
*bgp
,
145 struct prefix
*range
, int exact
);
147 /* Show BGP peer's information. */
157 static struct peer_group
*listen_range_exists(struct bgp
*bgp
,
158 struct prefix
*range
, int exact
);
160 static void bgp_show_global_graceful_restart_mode_vty(struct vty
*vty
,
165 static int bgp_show_neighbor_graceful_restart_afi_all(struct vty
*vty
,
168 afi_t afi
, bool use_json
);
170 static enum node_type
bgp_node_type(afi_t afi
, safi_t safi
)
176 return BGP_IPV4_NODE
;
178 return BGP_IPV4M_NODE
;
179 case SAFI_LABELED_UNICAST
:
180 return BGP_IPV4L_NODE
;
182 return BGP_VPNV4_NODE
;
184 return BGP_FLOWSPECV4_NODE
;
187 return BGP_IPV4_NODE
;
192 return BGP_IPV6_NODE
;
194 return BGP_IPV6M_NODE
;
195 case SAFI_LABELED_UNICAST
:
196 return BGP_IPV6L_NODE
;
198 return BGP_VPNV6_NODE
;
200 return BGP_FLOWSPECV6_NODE
;
203 return BGP_IPV4_NODE
;
206 return BGP_EVPN_NODE
;
209 // We should never be here but to clarify the switch statement..
210 return BGP_IPV4_NODE
;
213 // Impossible to happen
214 return BGP_IPV4_NODE
;
217 static const char *get_afi_safi_vty_str(afi_t afi
, safi_t safi
)
220 if (safi
== SAFI_UNICAST
)
221 return "IPv4 Unicast";
222 if (safi
== SAFI_MULTICAST
)
223 return "IPv4 Multicast";
224 if (safi
== SAFI_LABELED_UNICAST
)
225 return "IPv4 Labeled Unicast";
226 if (safi
== SAFI_MPLS_VPN
)
228 if (safi
== SAFI_ENCAP
)
230 if (safi
== SAFI_FLOWSPEC
)
231 return "IPv4 Flowspec";
232 } else if (afi
== AFI_IP6
) {
233 if (safi
== SAFI_UNICAST
)
234 return "IPv6 Unicast";
235 if (safi
== SAFI_MULTICAST
)
236 return "IPv6 Multicast";
237 if (safi
== SAFI_LABELED_UNICAST
)
238 return "IPv6 Labeled Unicast";
239 if (safi
== SAFI_MPLS_VPN
)
241 if (safi
== SAFI_ENCAP
)
243 if (safi
== SAFI_FLOWSPEC
)
244 return "IPv6 Flowspec";
245 } else if (afi
== AFI_L2VPN
) {
246 if (safi
== SAFI_EVPN
)
254 * Please note that we have intentionally camelCased
255 * the return strings here. So if you want
256 * to use this function, please ensure you
257 * are doing this within json output
259 static const char *get_afi_safi_json_str(afi_t afi
, safi_t safi
)
262 if (safi
== SAFI_UNICAST
)
263 return "ipv4Unicast";
264 if (safi
== SAFI_MULTICAST
)
265 return "ipv4Multicast";
266 if (safi
== SAFI_LABELED_UNICAST
)
267 return "ipv4LabeledUnicast";
268 if (safi
== SAFI_MPLS_VPN
)
270 if (safi
== SAFI_ENCAP
)
272 if (safi
== SAFI_FLOWSPEC
)
273 return "ipv4Flowspec";
274 } else if (afi
== AFI_IP6
) {
275 if (safi
== SAFI_UNICAST
)
276 return "ipv6Unicast";
277 if (safi
== SAFI_MULTICAST
)
278 return "ipv6Multicast";
279 if (safi
== SAFI_LABELED_UNICAST
)
280 return "ipv6LabeledUnicast";
281 if (safi
== SAFI_MPLS_VPN
)
283 if (safi
== SAFI_ENCAP
)
285 if (safi
== SAFI_FLOWSPEC
)
286 return "ipv6Flowspec";
287 } else if (afi
== AFI_L2VPN
) {
288 if (safi
== SAFI_EVPN
)
295 /* unset srv6 locator */
296 static int bgp_srv6_locator_unset(struct bgp
*bgp
)
299 struct listnode
*node
, *nnode
;
300 struct srv6_locator_chunk
*chunk
, *tovpn_sid_locator
;
301 struct bgp_srv6_function
*func
;
304 /* release chunk notification via ZAPI */
305 ret
= bgp_zebra_srv6_manager_release_locator_chunk(
306 bgp
->srv6_locator_name
);
311 for (ALL_LIST_ELEMENTS(bgp
->srv6_locator_chunks
, node
, nnode
, chunk
)) {
312 listnode_delete(bgp
->srv6_locator_chunks
, chunk
);
313 srv6_locator_chunk_free(chunk
);
316 /* refresh functions */
317 for (ALL_LIST_ELEMENTS(bgp
->srv6_functions
, node
, nnode
, func
)) {
318 listnode_delete(bgp
->srv6_functions
, func
);
319 XFREE(MTYPE_BGP_SRV6_FUNCTION
, func
);
322 /* refresh tovpn_sid */
323 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, node
, bgp_vrf
)) {
324 if (bgp_vrf
->inst_type
!= BGP_INSTANCE_TYPE_VRF
)
327 /* refresh vpnv4 tovpn_sid */
328 XFREE(MTYPE_BGP_SRV6_SID
,
329 bgp_vrf
->vpn_policy
[AFI_IP
].tovpn_sid
);
331 /* refresh vpnv6 tovpn_sid */
332 XFREE(MTYPE_BGP_SRV6_SID
,
333 bgp_vrf
->vpn_policy
[AFI_IP6
].tovpn_sid
);
335 /* refresh per-vrf tovpn_sid */
336 XFREE(MTYPE_BGP_SRV6_SID
, bgp_vrf
->tovpn_sid
);
339 /* update vpn bgp processes */
340 vpn_leak_postchange_all();
342 /* refresh tovpn_sid_locator */
343 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, node
, bgp_vrf
)) {
344 if (bgp_vrf
->inst_type
!= BGP_INSTANCE_TYPE_VRF
)
347 /* refresh vpnv4 tovpn_sid_locator */
349 bgp_vrf
->vpn_policy
[AFI_IP
].tovpn_sid_locator
;
350 if (tovpn_sid_locator
) {
351 srv6_locator_chunk_free(tovpn_sid_locator
);
352 bgp_vrf
->vpn_policy
[AFI_IP
].tovpn_sid_locator
= NULL
;
355 /* refresh vpnv6 tovpn_sid_locator */
357 bgp_vrf
->vpn_policy
[AFI_IP6
].tovpn_sid_locator
;
358 if (tovpn_sid_locator
) {
359 srv6_locator_chunk_free(tovpn_sid_locator
);
360 bgp_vrf
->vpn_policy
[AFI_IP6
].tovpn_sid_locator
= NULL
;
363 /* refresh per-vrf tovpn_sid_locator */
364 srv6_locator_chunk_free(bgp_vrf
->tovpn_sid_locator
);
367 /* clear locator name */
368 memset(bgp
->srv6_locator_name
, 0, sizeof(bgp
->srv6_locator_name
));
373 /* Utility function to get address family from current node. */
374 afi_t
bgp_node_afi(struct vty
*vty
)
382 case BGP_FLOWSPECV6_NODE
:
395 /* Utility function to get subsequent address family from current
397 safi_t
bgp_node_safi(struct vty
*vty
)
403 safi
= SAFI_MPLS_VPN
;
407 safi
= SAFI_MULTICAST
;
414 safi
= SAFI_LABELED_UNICAST
;
416 case BGP_FLOWSPECV4_NODE
:
417 case BGP_FLOWSPECV6_NODE
:
418 safi
= SAFI_FLOWSPEC
;
428 * Converts an AFI in string form to afi_t
430 * @param afi string, one of
434 * @return the corresponding afi_t
436 afi_t
bgp_vty_afi_from_str(const char *afi_str
)
438 afi_t afi
= AFI_MAX
; /* unknown */
439 if (strmatch(afi_str
, "ipv4"))
441 else if (strmatch(afi_str
, "ipv6"))
443 else if (strmatch(afi_str
, "l2vpn"))
448 int argv_find_and_parse_afi(struct cmd_token
**argv
, int argc
, int *index
,
452 if (argv_find(argv
, argc
, "ipv4", index
)) {
456 } else if (argv_find(argv
, argc
, "ipv6", index
)) {
460 } else if (argv_find(argv
, argc
, "l2vpn", index
)) {
468 /* supports <unicast|multicast|vpn|labeled-unicast> */
469 safi_t
bgp_vty_safi_from_str(const char *safi_str
)
471 safi_t safi
= SAFI_MAX
; /* unknown */
472 if (strmatch(safi_str
, "multicast"))
473 safi
= SAFI_MULTICAST
;
474 else if (strmatch(safi_str
, "unicast"))
476 else if (strmatch(safi_str
, "vpn"))
477 safi
= SAFI_MPLS_VPN
;
478 else if (strmatch(safi_str
, "evpn"))
480 else if (strmatch(safi_str
, "labeled-unicast"))
481 safi
= SAFI_LABELED_UNICAST
;
482 else if (strmatch(safi_str
, "flowspec"))
483 safi
= SAFI_FLOWSPEC
;
487 int argv_find_and_parse_safi(struct cmd_token
**argv
, int argc
, int *index
,
491 if (argv_find(argv
, argc
, "unicast", index
)) {
494 *safi
= SAFI_UNICAST
;
495 } else if (argv_find(argv
, argc
, "multicast", index
)) {
498 *safi
= SAFI_MULTICAST
;
499 } else if (argv_find(argv
, argc
, "labeled-unicast", index
)) {
502 *safi
= SAFI_LABELED_UNICAST
;
503 } else if (argv_find(argv
, argc
, "vpn", index
)) {
506 *safi
= SAFI_MPLS_VPN
;
507 } else if (argv_find(argv
, argc
, "evpn", index
)) {
511 } else if (argv_find(argv
, argc
, "flowspec", index
)) {
514 *safi
= SAFI_FLOWSPEC
;
520 * Convert an afi_t/safi_t pair to matching BGP_DEFAULT_AF* flag.
523 * address-family identifier
526 * subsequent address-family identifier
529 * default_af string corresponding to the supplied afi/safi pair.
530 * If afi/safi is invalid or if flag for afi/safi doesn't exist,
533 static const char *get_bgp_default_af_flag(afi_t afi
, safi_t safi
)
539 return "ipv4-unicast";
541 return "ipv4-multicast";
546 case SAFI_LABELED_UNICAST
:
547 return "ipv4-labeled-unicast";
549 return "ipv4-flowspec";
551 return "unknown-afi/safi";
557 return "ipv6-unicast";
559 return "ipv6-multicast";
564 case SAFI_LABELED_UNICAST
:
565 return "ipv6-labeled-unicast";
567 return "ipv6-flowspec";
569 return "unknown-afi/safi";
577 return "unknown-afi/safi";
581 return "unknown-afi/safi";
583 /* all AFIs are accounted for above, so this shouldn't happen */
584 return "unknown-afi/safi";
587 int bgp_get_vty(struct bgp
**bgp
, as_t
*as
, const char *name
,
588 enum bgp_instance_type inst_type
)
590 int ret
= bgp_get(bgp
, as
, name
, inst_type
);
592 if (ret
== BGP_CREATED
) {
593 bgp_timers_set(*bgp
, DFLT_BGP_KEEPALIVE
, DFLT_BGP_HOLDTIME
,
594 DFLT_BGP_CONNECT_RETRY
, BGP_DEFAULT_DELAYOPEN
);
596 if (DFLT_BGP_IMPORT_CHECK
)
597 SET_FLAG((*bgp
)->flags
, BGP_FLAG_IMPORT_CHECK
);
598 if (DFLT_BGP_SHOW_HOSTNAME
)
599 SET_FLAG((*bgp
)->flags
, BGP_FLAG_SHOW_HOSTNAME
);
600 if (DFLT_BGP_SHOW_NEXTHOP_HOSTNAME
)
601 SET_FLAG((*bgp
)->flags
, BGP_FLAG_SHOW_NEXTHOP_HOSTNAME
);
602 if (DFLT_BGP_LOG_NEIGHBOR_CHANGES
)
603 SET_FLAG((*bgp
)->flags
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
);
604 if (DFLT_BGP_DETERMINISTIC_MED
)
605 SET_FLAG((*bgp
)->flags
, BGP_FLAG_DETERMINISTIC_MED
);
606 if (DFLT_BGP_EBGP_REQUIRES_POLICY
)
607 SET_FLAG((*bgp
)->flags
, BGP_FLAG_EBGP_REQUIRES_POLICY
);
608 if (DFLT_BGP_SUPPRESS_DUPLICATES
)
609 SET_FLAG((*bgp
)->flags
, BGP_FLAG_SUPPRESS_DUPLICATES
);
610 if (DFLT_BGP_GRACEFUL_NOTIFICATION
)
611 SET_FLAG((*bgp
)->flags
, BGP_FLAG_GRACEFUL_NOTIFICATION
);
612 if (DFLT_BGP_HARD_ADMIN_RESET
)
613 SET_FLAG((*bgp
)->flags
, BGP_FLAG_HARD_ADMIN_RESET
);
621 * bgp_vty_find_and_parse_afi_safi_bgp
623 * For a given 'show ...' command, correctly parse the afi/safi/bgp out from it
624 * This function *assumes* that the calling function pre-sets the afi/safi/bgp
625 * to appropriate values for the calling function. This is to allow the
626 * calling function to make decisions appropriate for the show command
627 * that is being parsed.
629 * The show commands are generally of the form:
630 * "show [ip] bgp [<view|vrf> VIEWVRFNAME] [<ipv4|ipv6>
631 * [<unicast|multicast|vpn|labeled-unicast>]] ..."
633 * Since we use argv_find if the show command in particular doesn't have:
635 * [<view|vrf> VIEWVRFNAME]
636 * [<ipv4|ipv6> [<unicast|multicast|vpn|labeled-unicast>]]
637 * The command parsing should still be ok.
639 * vty -> The vty for the command so we can output some useful data in
640 * the event of a parse error in the vrf.
641 * argv -> The command tokens
642 * argc -> How many command tokens we have
643 * idx -> The current place in the command, generally should be 0 for this
645 * afi -> The parsed afi if it was included in the show command, returned here
646 * safi -> The parsed safi if it was included in the show command, returned here
647 * bgp -> Pointer to the bgp data structure we need to fill in.
648 * use_json -> json is configured or not
650 * The function returns the correct location in the parse tree for the
653 * Returns 0 for failure to parse correctly, else the idx position of where
654 * it found the last token.
656 int bgp_vty_find_and_parse_afi_safi_bgp(struct vty
*vty
,
657 struct cmd_token
**argv
, int argc
,
658 int *idx
, afi_t
*afi
, safi_t
*safi
,
659 struct bgp
**bgp
, bool use_json
)
661 char *vrf_name
= NULL
;
667 if (argv_find(argv
, argc
, "ip", idx
))
670 if (argv_find(argv
, argc
, "view", idx
))
671 vrf_name
= argv
[*idx
+ 1]->arg
;
672 else if (argv_find(argv
, argc
, "vrf", idx
)) {
673 vrf_name
= argv
[*idx
+ 1]->arg
;
674 if (strmatch(vrf_name
, VRF_DEFAULT_NAME
))
678 if (strmatch(vrf_name
, "all"))
681 *bgp
= bgp_lookup_by_name(vrf_name
);
684 json_object
*json
= NULL
;
685 json
= json_object_new_object();
686 json_object_string_add(
688 "View/Vrf is unknown");
692 vty_out(vty
, "View/Vrf %s is unknown\n",
699 *bgp
= bgp_get_default();
702 json_object
*json
= NULL
;
703 json
= json_object_new_object();
704 json_object_string_add(
706 "Default BGP instance not found");
711 "Default BGP instance not found\n");
717 if (argv_find_and_parse_afi(argv
, argc
, idx
, afi
))
718 argv_find_and_parse_safi(argv
, argc
, idx
, safi
);
724 static bool peer_address_self_check(struct bgp
*bgp
, union sockunion
*su
)
726 struct interface
*ifp
= NULL
;
727 struct listnode
*node
;
728 struct bgp_listener
*listener
;
729 union sockunion all_su
;
731 if (su
->sa
.sa_family
== AF_INET
) {
732 (void)str2sockunion("0.0.0.0", &all_su
);
733 ifp
= if_lookup_by_ipv4_exact(&su
->sin
.sin_addr
, bgp
->vrf_id
);
734 } else if (su
->sa
.sa_family
== AF_INET6
) {
735 (void)str2sockunion("::", &all_su
);
736 ifp
= if_lookup_by_ipv6_exact(&su
->sin6
.sin6_addr
,
737 su
->sin6
.sin6_scope_id
,
742 for (ALL_LIST_ELEMENTS_RO(bm
->listen_sockets
, node
, listener
)) {
743 if (sockunion_family(su
) !=
744 sockunion_family(&listener
->su
))
747 /* If 0.0.0.0/:: is a listener, then treat as self and
750 if (!sockunion_cmp(&listener
->su
, su
) ||
751 !sockunion_cmp(&listener
->su
, &all_su
))
759 /* Utility function for looking up peer from VTY. */
760 /* This is used only for configuration, so disallow if attempted on
761 * a dynamic neighbor.
763 static struct peer
*peer_lookup_vty(struct vty
*vty
, const char *ip_str
)
765 struct bgp
*bgp
= VTY_GET_CONTEXT(bgp
);
774 ret
= str2sockunion(ip_str
, &su
);
776 peer
= peer_lookup_by_conf_if(bgp
, ip_str
);
778 if ((peer
= peer_lookup_by_hostname(bgp
, ip_str
))
781 "%% Malformed address or name: %s\n",
787 peer
= peer_lookup(bgp
, &su
);
790 "%% Specify remote-as or peer-group commands first\n");
793 if (peer_dynamic_neighbor(peer
)) {
795 "%% Operation not allowed on a dynamic neighbor\n");
802 /* Utility function for looking up peer or peer group. */
803 /* This is used only for configuration, so disallow if attempted on
804 * a dynamic neighbor.
806 struct peer
*peer_and_group_lookup_vty(struct vty
*vty
, const char *peer_str
)
808 struct bgp
*bgp
= VTY_GET_CONTEXT(bgp
);
811 struct peer
*peer
= NULL
;
812 struct peer_group
*group
= NULL
;
818 ret
= str2sockunion(peer_str
, &su
);
820 /* IP address, locate peer. */
821 peer
= peer_lookup(bgp
, &su
);
823 /* Not IP, could match either peer configured on interface or a
825 peer
= peer_lookup_by_conf_if(bgp
, peer_str
);
827 group
= peer_group_lookup(bgp
, peer_str
);
831 if (peer_dynamic_neighbor(peer
)) {
833 "%% Operation not allowed on a dynamic neighbor\n");
843 vty_out(vty
, "%% Specify remote-as or peer-group commands first\n");
848 int bgp_vty_return(struct vty
*vty
, enum bgp_create_error_code ret
)
850 const char *str
= NULL
;
855 case BGP_GR_NO_OPERATION
:
857 case BGP_ERR_INVALID_VALUE
:
858 str
= "Invalid value";
860 case BGP_ERR_INVALID_FLAG
:
861 str
= "Invalid flag";
863 case BGP_ERR_PEER_GROUP_SHUTDOWN
:
864 str
= "Peer-group has been shutdown. Activate the peer-group first";
866 case BGP_ERR_PEER_FLAG_CONFLICT
:
867 str
= "Can't set override-capability and strict-capability-match at the same time";
869 case BGP_ERR_PEER_GROUP_NO_REMOTE_AS
:
870 str
= "Specify remote-as or peer-group remote AS first";
872 case BGP_ERR_PEER_GROUP_CANT_CHANGE
:
873 str
= "Cannot change the peer-group. Deconfigure first";
875 case BGP_ERR_PEER_GROUP_MISMATCH
:
876 str
= "Peer is not a member of this peer-group";
878 case BGP_ERR_PEER_FILTER_CONFLICT
:
879 str
= "Prefix/distribute list can not co-exist";
881 case BGP_ERR_NOT_INTERNAL_PEER
:
882 str
= "Invalid command. Not an internal neighbor";
884 case BGP_ERR_REMOVE_PRIVATE_AS
:
885 str
= "remove-private-AS cannot be configured for IBGP peers";
887 case BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS
:
888 str
= "Cannot have local-as same as BGP AS number";
890 case BGP_ERR_TCPSIG_FAILED
:
891 str
= "Error while applying TCP-Sig to session(s)";
893 case BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
:
894 str
= "ebgp-multihop and ttl-security cannot be configured together";
896 case BGP_ERR_NO_IBGP_WITH_TTLHACK
:
897 str
= "ttl-security only allowed for EBGP peers";
899 case BGP_ERR_AS_OVERRIDE
:
900 str
= "as-override cannot be configured for IBGP peers";
902 case BGP_ERR_INVALID_DYNAMIC_NEIGHBORS_LIMIT
:
903 str
= "Invalid limit for number of dynamic neighbors";
905 case BGP_ERR_DYNAMIC_NEIGHBORS_RANGE_EXISTS
:
906 str
= "Dynamic neighbor listen range already exists";
908 case BGP_ERR_INVALID_FOR_DYNAMIC_PEER
:
909 str
= "Operation not allowed on a dynamic neighbor";
911 case BGP_ERR_INVALID_FOR_DIRECT_PEER
:
912 str
= "Operation not allowed on a directly connected neighbor";
914 case BGP_ERR_PEER_SAFI_CONFLICT
:
915 str
= "Cannot activate peer for both 'ipv4 unicast' and 'ipv4 labeled-unicast'";
917 case BGP_ERR_GR_INVALID_CMD
:
918 str
= "The Graceful Restart command used is not valid at this moment.";
920 case BGP_ERR_GR_OPERATION_FAILED
:
921 str
= "The Graceful Restart Operation failed due to an err.";
923 case BGP_ERR_PEER_GROUP_MEMBER
:
924 str
= "Peer-group member cannot override remote-as of peer-group.";
926 case BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
:
927 str
= "Peer-group members must be all internal or all external.";
929 case BGP_ERR_DYNAMIC_NEIGHBORS_RANGE_NOT_FOUND
:
930 str
= "Range specified cannot be deleted because it is not part of current config.";
932 case BGP_ERR_INSTANCE_MISMATCH
:
933 str
= "Instance specified does not match the current instance.";
935 case BGP_ERR_NO_INTERFACE_CONFIG
:
936 str
= "Interface specified is not being used for interface based peer.";
938 case BGP_ERR_SOFT_RECONFIG_UNCONFIGURED
:
939 str
= "No configuration already specified for soft reconfiguration.";
941 case BGP_ERR_AS_MISMATCH
:
942 str
= "BGP is already running.";
944 case BGP_ERR_AF_UNCONFIGURED
:
945 str
= "AFI/SAFI specified is not currently configured.";
947 case BGP_ERR_INVALID_AS
:
948 str
= "Confederation AS specified is the same AS as our AS.";
950 case BGP_ERR_INVALID_ROLE_NAME
:
951 str
= "Invalid role name";
953 case BGP_ERR_INVALID_INTERNAL_ROLE
:
954 str
= "External roles can be set only on eBGP session";
956 case BGP_ERR_PEER_ORR_CONFIGURED
:
957 str
= "Deconfigure optimal-route-reflection on this peer first";
961 vty_out(vty
, "%% %s\n", str
);
962 return CMD_WARNING_CONFIG_FAILED
;
967 /* BGP clear sort. */
976 static void bgp_clear_vty_error(struct vty
*vty
, struct peer
*peer
, afi_t afi
,
977 safi_t safi
, int error
)
980 case BGP_ERR_AF_UNCONFIGURED
:
983 "%% BGP: Enable %s address family for the neighbor %s\n",
984 get_afi_safi_str(afi
, safi
, false), peer
->host
);
987 "%% BGP: Enable %s address family for the neighbor %s",
988 get_afi_safi_str(afi
, safi
, false), peer
->host
);
990 case BGP_ERR_SOFT_RECONFIG_UNCONFIGURED
:
993 "%% BGP: Inbound soft reconfig for %s not possible as it\n has neither refresh capability, nor inbound soft reconfig\n",
997 "%% BGP: Inbound soft reconfig for %s not possible as it has neither refresh capability, nor inbound soft reconfig",
1005 static int bgp_peer_clear(struct peer
*peer
, afi_t afi
, safi_t safi
,
1006 struct listnode
**nnode
, enum bgp_clear_type stype
)
1009 struct peer_af
*paf
;
1011 /* if afi/.safi not specified, spin thru all of them */
1012 if ((afi
== AFI_UNSPEC
) && (safi
== SAFI_UNSPEC
)) {
1015 enum bgp_af_index index
;
1017 for (index
= BGP_AF_START
; index
< BGP_AF_MAX
; index
++) {
1018 paf
= peer
->peer_af_array
[index
];
1022 if (paf
&& paf
->subgroup
)
1023 SET_FLAG(paf
->subgroup
->sflags
,
1024 SUBGRP_STATUS_FORCE_UPDATES
);
1027 tmp_safi
= paf
->safi
;
1028 if (!peer
->afc
[tmp_afi
][tmp_safi
])
1031 if (stype
== BGP_CLEAR_SOFT_NONE
)
1032 ret
= peer_clear(peer
, nnode
);
1034 ret
= peer_clear_soft(peer
, tmp_afi
, tmp_safi
,
1037 /* if afi specified and safi not, spin thru safis on this afi */
1038 } else if (safi
== SAFI_UNSPEC
) {
1041 for (tmp_safi
= SAFI_UNICAST
;
1042 tmp_safi
< SAFI_MAX
; tmp_safi
++) {
1043 if (!peer
->afc
[afi
][tmp_safi
])
1046 paf
= peer_af_find(peer
, afi
, tmp_safi
);
1047 if (paf
&& paf
->subgroup
)
1048 SET_FLAG(paf
->subgroup
->sflags
,
1049 SUBGRP_STATUS_FORCE_UPDATES
);
1051 if (stype
== BGP_CLEAR_SOFT_NONE
)
1052 ret
= peer_clear(peer
, nnode
);
1054 ret
= peer_clear_soft(peer
, afi
,
1057 /* both afi/safi specified, let the caller know if not defined */
1059 if (!peer
->afc
[afi
][safi
])
1062 paf
= peer_af_find(peer
, afi
, safi
);
1063 if (paf
&& paf
->subgroup
)
1064 SET_FLAG(paf
->subgroup
->sflags
,
1065 SUBGRP_STATUS_FORCE_UPDATES
);
1067 if (stype
== BGP_CLEAR_SOFT_NONE
)
1068 ret
= peer_clear(peer
, nnode
);
1070 ret
= peer_clear_soft(peer
, afi
, safi
, stype
);
1076 /* `clear ip bgp' functions. */
1077 static int bgp_clear(struct vty
*vty
, struct bgp
*bgp
, afi_t afi
, safi_t safi
,
1078 enum clear_sort sort
, enum bgp_clear_type stype
,
1085 VTY_BGP_GR_DEFINE_LOOP_VARIABLE
;
1087 /* Clear all neighbors. */
1089 * Pass along pointer to next node to peer_clear() when walking all
1090 * nodes on the BGP instance as that may get freed if it is a
1093 if (sort
== clear_all
) {
1094 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
1096 bgp_peer_gr_flags_update(peer
);
1098 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_GRACEFUL_RESTART
))
1099 gr_router_detected
= true;
1101 ret
= bgp_peer_clear(peer
, afi
, safi
, &nnode
,
1105 bgp_clear_vty_error(vty
, peer
, afi
, safi
, ret
);
1108 if (gr_router_detected
1109 && bgp
->present_zebra_gr_state
== ZEBRA_GR_DISABLE
) {
1110 bgp_zebra_send_capabilities(bgp
, false);
1111 } else if (!gr_router_detected
1112 && bgp
->present_zebra_gr_state
== ZEBRA_GR_ENABLE
) {
1113 bgp_zebra_send_capabilities(bgp
, true);
1116 /* This is to apply read-only mode on this clear. */
1117 if (stype
== BGP_CLEAR_SOFT_NONE
)
1118 bgp
->update_delay_over
= 0;
1123 /* Clear specified neighbor. */
1124 if (sort
== clear_peer
) {
1127 /* Make sockunion for lookup. */
1128 ret
= str2sockunion(arg
, &su
);
1130 peer
= peer_lookup_by_conf_if(bgp
, arg
);
1132 peer
= peer_lookup_by_hostname(bgp
, arg
);
1135 "Malformed address or name: %s\n",
1141 peer
= peer_lookup(bgp
, &su
);
1144 "%% BGP: Unknown neighbor - \"%s\"\n",
1150 VTY_BGP_GR_ROUTER_DETECT(bgp
, peer
, peer
->bgp
->peer
);
1151 VTY_SEND_BGP_GR_CAPABILITY_TO_ZEBRA(peer
->bgp
, ret
);
1153 ret
= bgp_peer_clear(peer
, afi
, safi
, NULL
, stype
);
1155 /* if afi/safi not defined for this peer, let caller know */
1157 ret
= BGP_ERR_AF_UNCONFIGURED
;
1160 bgp_clear_vty_error(vty
, peer
, afi
, safi
, ret
);
1165 /* Clear all neighbors belonging to a specific peer-group. */
1166 if (sort
== clear_group
) {
1167 struct peer_group
*group
;
1169 group
= peer_group_lookup(bgp
, arg
);
1171 vty_out(vty
, "%% BGP: No such peer-group %s\n", arg
);
1175 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
1176 ret
= bgp_peer_clear(peer
, afi
, safi
, &nnode
, stype
);
1179 bgp_clear_vty_error(vty
, peer
, afi
, safi
, ret
);
1186 "%% BGP: No %s peer belonging to peer-group %s is configured\n",
1187 get_afi_safi_str(afi
, safi
, false), arg
);
1192 /* Clear all external (eBGP) neighbors. */
1193 if (sort
== clear_external
) {
1194 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
1195 if (peer
->sort
== BGP_PEER_IBGP
)
1198 bgp_peer_gr_flags_update(peer
);
1200 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_GRACEFUL_RESTART
))
1201 gr_router_detected
= true;
1203 ret
= bgp_peer_clear(peer
, afi
, safi
, &nnode
, stype
);
1206 bgp_clear_vty_error(vty
, peer
, afi
, safi
, ret
);
1211 if (gr_router_detected
1212 && bgp
->present_zebra_gr_state
== ZEBRA_GR_DISABLE
) {
1213 bgp_zebra_send_capabilities(bgp
, false);
1214 } else if (!gr_router_detected
1215 && bgp
->present_zebra_gr_state
== ZEBRA_GR_ENABLE
) {
1216 bgp_zebra_send_capabilities(bgp
, true);
1221 "%% BGP: No external %s peer is configured\n",
1222 get_afi_safi_str(afi
, safi
, false));
1227 /* Clear all neighbors belonging to a specific AS. */
1228 if (sort
== clear_as
) {
1229 as_t as
= strtoul(arg
, NULL
, 10);
1231 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
1235 bgp_peer_gr_flags_update(peer
);
1237 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_GRACEFUL_RESTART
))
1238 gr_router_detected
= true;
1240 ret
= bgp_peer_clear(peer
, afi
, safi
, &nnode
, stype
);
1243 bgp_clear_vty_error(vty
, peer
, afi
, safi
, ret
);
1248 if (gr_router_detected
1249 && bgp
->present_zebra_gr_state
== ZEBRA_GR_DISABLE
) {
1250 bgp_zebra_send_capabilities(bgp
, false);
1251 } else if (!gr_router_detected
1252 && bgp
->present_zebra_gr_state
== ZEBRA_GR_ENABLE
) {
1253 bgp_zebra_send_capabilities(bgp
, true);
1258 "%% BGP: No %s peer is configured with AS %s\n",
1259 get_afi_safi_str(afi
, safi
, false), arg
);
1267 static int bgp_clear_vty(struct vty
*vty
, const char *name
, afi_t afi
,
1268 safi_t safi
, enum clear_sort sort
,
1269 enum bgp_clear_type stype
, const char *arg
)
1273 /* BGP structure lookup. */
1275 bgp
= bgp_lookup_by_name(name
);
1277 vty_out(vty
, "Can't find BGP instance %s\n", name
);
1281 bgp
= bgp_get_default();
1283 vty_out(vty
, "No BGP process is configured\n");
1288 return bgp_clear(vty
, bgp
, afi
, safi
, sort
, stype
, arg
);
1291 /* clear soft inbound */
1292 static void bgp_clear_star_soft_in(struct vty
*vty
, const char *name
)
1297 FOREACH_AFI_SAFI (afi
, safi
)
1298 bgp_clear_vty(vty
, name
, afi
, safi
, clear_all
,
1299 BGP_CLEAR_SOFT_IN
, NULL
);
1302 /* clear soft outbound */
1303 static void bgp_clear_star_soft_out(struct vty
*vty
, const char *name
)
1308 FOREACH_AFI_SAFI (afi
, safi
)
1309 bgp_clear_vty(vty
, name
, afi
, safi
, clear_all
,
1310 BGP_CLEAR_SOFT_OUT
, NULL
);
1314 void bgp_clear_soft_in(struct bgp
*bgp
, afi_t afi
, safi_t safi
)
1316 bgp_clear(NULL
, bgp
, afi
, safi
, clear_all
, BGP_CLEAR_SOFT_IN
, NULL
);
1319 #ifndef VTYSH_EXTRACT_PL
1320 #include "bgpd/bgp_vty_clippy.c"
1323 DEFUN_HIDDEN (bgp_local_mac
,
1325 "bgp local-mac vni " CMD_VNI_RANGE
" mac WORD seq (0-4294967295)",
1327 "Local MAC config\n"
1328 "VxLAN Network Identifier\n"
1332 "mac-mobility sequence\n"
1342 vni
= strtoul(argv
[3]->arg
, NULL
, 10);
1343 if (!prefix_str2mac(argv
[5]->arg
, &mac
)) {
1344 vty_out(vty
, "%% Malformed MAC address\n");
1347 memset(&ip
, 0, sizeof(ip
));
1348 seq
= strtoul(argv
[7]->arg
, NULL
, 10);
1350 bgp
= bgp_get_default();
1352 vty_out(vty
, "Default BGP instance is not there\n");
1356 rv
= bgp_evpn_local_macip_add(bgp
, vni
, &mac
, &ip
, 0 /* flags */, seq
,
1359 vty_out(vty
, "Internal error\n");
1366 DEFUN_HIDDEN (no_bgp_local_mac
,
1367 no_bgp_local_mac_cmd
,
1368 "no bgp local-mac vni " CMD_VNI_RANGE
" mac WORD",
1371 "Local MAC config\n"
1372 "VxLAN Network Identifier\n"
1383 vni
= strtoul(argv
[4]->arg
, NULL
, 10);
1384 if (!prefix_str2mac(argv
[6]->arg
, &mac
)) {
1385 vty_out(vty
, "%% Malformed MAC address\n");
1388 memset(&ip
, 0, sizeof(ip
));
1390 bgp
= bgp_get_default();
1392 vty_out(vty
, "Default BGP instance is not there\n");
1396 rv
= bgp_evpn_local_macip_del(bgp
, vni
, &mac
, &ip
, ZEBRA_NEIGH_ACTIVE
);
1398 vty_out(vty
, "Internal error\n");
1405 DEFUN (no_synchronization
,
1406 no_synchronization_cmd
,
1407 "no synchronization",
1409 "Perform IGP synchronization\n")
1414 DEFUN (no_auto_summary
,
1415 no_auto_summary_cmd
,
1418 "Enable automatic network number summarization\n")
1423 /* "router bgp" commands. */
1424 DEFUN_NOSH (router_bgp
,
1426 "router bgp [(1-4294967295)$instasn [<view|vrf> VIEWVRFNAME]]",
1430 BGP_INSTANCE_HELP_STR
)
1433 int idx_view_vrf
= 3;
1439 const char *name
= NULL
;
1440 enum bgp_instance_type inst_type
;
1442 // "router bgp" without an ASN
1444 // Pending: Make VRF option available for ASN less config
1445 bgp
= bgp_get_default();
1448 vty_out(vty
, "%% No BGP process is configured\n");
1449 return CMD_WARNING_CONFIG_FAILED
;
1452 if (listcount(bm
->bgp
) > 1) {
1453 vty_out(vty
, "%% Please specify ASN and VRF\n");
1454 return CMD_WARNING_CONFIG_FAILED
;
1460 as
= strtoul(argv
[idx_asn
]->arg
, NULL
, 10);
1462 if (as
== BGP_PRIVATE_AS_MAX
|| as
== BGP_AS4_MAX
)
1463 vty_out(vty
, "Reserved AS used (%u|%u); AS is %u\n",
1464 BGP_PRIVATE_AS_MAX
, BGP_AS4_MAX
, as
);
1466 inst_type
= BGP_INSTANCE_TYPE_DEFAULT
;
1468 name
= argv
[idx_vrf
]->arg
;
1470 if (!strcmp(argv
[idx_view_vrf
]->text
, "vrf")) {
1471 if (strmatch(name
, VRF_DEFAULT_NAME
))
1474 inst_type
= BGP_INSTANCE_TYPE_VRF
;
1475 } else if (!strcmp(argv
[idx_view_vrf
]->text
, "view"))
1476 inst_type
= BGP_INSTANCE_TYPE_VIEW
;
1479 if (inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
1480 is_new_bgp
= (bgp_lookup(as
, name
) == NULL
);
1482 ret
= bgp_get_vty(&bgp
, &as
, name
, inst_type
);
1484 case BGP_ERR_AS_MISMATCH
:
1485 vty_out(vty
, "BGP is already running; AS is %u\n", as
);
1486 return CMD_WARNING_CONFIG_FAILED
;
1487 case BGP_ERR_INSTANCE_MISMATCH
:
1489 "BGP instance name and AS number mismatch\n");
1491 "BGP instance is already running; AS is %u\n",
1493 return CMD_WARNING_CONFIG_FAILED
;
1497 * If we just instantiated the default instance, complete
1498 * any pending VRF-VPN leaking that was configured via
1499 * earlier "router bgp X vrf FOO" blocks.
1501 if (is_new_bgp
&& inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
1502 vpn_leak_postchange_all();
1504 if (inst_type
== BGP_INSTANCE_TYPE_VRF
)
1505 bgp_vpn_leak_export(bgp
);
1506 /* Pending: handle when user tries to change a view to vrf n vv.
1510 /* unset the auto created flag as the user config is now present */
1511 UNSET_FLAG(bgp
->vrf_flags
, BGP_VRF_AUTO
);
1512 VTY_PUSH_CONTEXT(BGP_NODE
, bgp
);
1517 /* "no router bgp" commands. */
1518 DEFUN (no_router_bgp
,
1520 "no router bgp [(1-4294967295)$instasn [<view|vrf> VIEWVRFNAME]]",
1525 BGP_INSTANCE_HELP_STR
)
1531 const char *name
= NULL
;
1533 // "no router bgp" without an ASN
1535 // Pending: Make VRF option available for ASN less config
1536 bgp
= bgp_get_default();
1539 vty_out(vty
, "%% No BGP process is configured\n");
1540 return CMD_WARNING_CONFIG_FAILED
;
1543 if (listcount(bm
->bgp
) > 1) {
1544 vty_out(vty
, "%% Please specify ASN and VRF\n");
1545 return CMD_WARNING_CONFIG_FAILED
;
1549 vty_out(vty
, "%% Please unconfigure l3vni %u\n",
1551 return CMD_WARNING_CONFIG_FAILED
;
1554 as
= strtoul(argv
[idx_asn
]->arg
, NULL
, 10);
1557 name
= argv
[idx_vrf
]->arg
;
1558 if (strmatch(argv
[idx_vrf
- 1]->text
, "vrf")
1559 && strmatch(name
, VRF_DEFAULT_NAME
))
1563 /* Lookup bgp structure. */
1564 bgp
= bgp_lookup(as
, name
);
1566 vty_out(vty
, "%% Can't find BGP instance\n");
1567 return CMD_WARNING_CONFIG_FAILED
;
1571 vty_out(vty
, "%% Please unconfigure l3vni %u\n",
1573 return CMD_WARNING_CONFIG_FAILED
;
1576 /* Cannot delete default instance if vrf instances exist */
1577 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
) {
1578 struct listnode
*node
;
1579 struct bgp
*tmp_bgp
;
1581 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, node
, tmp_bgp
)) {
1582 if (tmp_bgp
->inst_type
!= BGP_INSTANCE_TYPE_VRF
)
1584 if (CHECK_FLAG(tmp_bgp
->af_flags
[AFI_IP
][SAFI_UNICAST
],
1585 BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT
) ||
1586 CHECK_FLAG(tmp_bgp
->af_flags
[AFI_IP6
][SAFI_UNICAST
],
1587 BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT
) ||
1588 CHECK_FLAG(tmp_bgp
->af_flags
[AFI_IP
][SAFI_UNICAST
],
1589 BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT
) ||
1590 CHECK_FLAG(tmp_bgp
->af_flags
[AFI_IP6
][SAFI_UNICAST
],
1591 BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT
) ||
1592 CHECK_FLAG(tmp_bgp
->af_flags
[AFI_IP
][SAFI_UNICAST
],
1593 BGP_CONFIG_VRF_TO_VRF_EXPORT
) ||
1594 CHECK_FLAG(tmp_bgp
->af_flags
[AFI_IP6
][SAFI_UNICAST
],
1595 BGP_CONFIG_VRF_TO_VRF_EXPORT
) ||
1596 (bgp
== bgp_get_evpn() &&
1597 (CHECK_FLAG(tmp_bgp
->af_flags
[AFI_L2VPN
][SAFI_EVPN
],
1598 BGP_L2VPN_EVPN_ADV_IPV4_UNICAST
) ||
1599 CHECK_FLAG(tmp_bgp
->af_flags
[AFI_L2VPN
][SAFI_EVPN
],
1600 BGP_L2VPN_EVPN_ADV_IPV4_UNICAST_GW_IP
) ||
1601 CHECK_FLAG(tmp_bgp
->af_flags
[AFI_L2VPN
][SAFI_EVPN
],
1602 BGP_L2VPN_EVPN_ADV_IPV6_UNICAST
) ||
1603 CHECK_FLAG(tmp_bgp
->af_flags
[AFI_L2VPN
][SAFI_EVPN
],
1604 BGP_L2VPN_EVPN_ADV_IPV6_UNICAST_GW_IP
))) ||
1605 (hashcount(tmp_bgp
->vnihash
))) {
1607 "%% Cannot delete default BGP instance. Dependent VRF instances exist\n");
1608 return CMD_WARNING_CONFIG_FAILED
;
1619 /* bgp session-dscp */
1621 DEFPY (bgp_session_dscp
,
1622 bgp_session_dscp_cmd
,
1623 "bgp session-dscp (0-63)$dscp",
1625 "Override default (C6) bgp TCP session DSCP value\n"
1626 "Manually configured dscp parameter\n")
1628 bm
->tcp_dscp
= dscp
<< 2;
1633 DEFPY (no_bgp_session_dscp
,
1634 no_bgp_session_dscp_cmd
,
1635 "no bgp session-dscp [(0-63)]",
1638 "Override default (C6) bgp TCP session DSCP value\n"
1639 "Manually configured dscp parameter\n")
1641 bm
->tcp_dscp
= IPTOS_PREC_INTERNETCONTROL
;
1646 /* BGP router-id. */
1648 DEFPY (bgp_router_id
,
1650 "bgp router-id A.B.C.D",
1652 "Override configured router identifier\n"
1653 "Manually configured router identifier\n")
1655 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1656 bgp_router_id_static_set(bgp
, router_id
);
1660 DEFPY (no_bgp_router_id
,
1661 no_bgp_router_id_cmd
,
1662 "no bgp router-id [A.B.C.D]",
1665 "Override configured router identifier\n"
1666 "Manually configured router identifier\n")
1668 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1670 if (router_id_str
) {
1671 if (!IPV4_ADDR_SAME(&bgp
->router_id_static
, &router_id
)) {
1672 vty_out(vty
, "%% BGP router-id doesn't match\n");
1673 return CMD_WARNING_CONFIG_FAILED
;
1677 router_id
.s_addr
= 0;
1678 bgp_router_id_static_set(bgp
, router_id
);
1683 DEFPY(bgp_community_alias
, bgp_community_alias_cmd
,
1684 "[no$no] bgp community alias WORD$community ALIAS_NAME$alias_name",
1686 "Add community specific parameters\n"
1687 "Create an alias for a community\n"
1688 "Community (AA:BB or AA:BB:CC)\n"
1691 struct community_alias ca
= {};
1692 struct community_alias
*lookup_community
;
1693 struct community_alias
*lookup_alias
;
1694 struct community
*comm
;
1695 struct lcommunity
*lcomm
;
1696 uint8_t invalid
= 0;
1698 comm
= community_str2com(community
);
1701 community_free(&comm
);
1703 lcomm
= lcommunity_str2com(community
);
1706 lcommunity_free(&lcomm
);
1709 vty_out(vty
, "Invalid community format\n");
1713 strlcpy(ca
.community
, community
, sizeof(ca
.community
));
1714 strlcpy(ca
.alias
, alias_name
, sizeof(ca
.alias
));
1716 lookup_community
= bgp_ca_community_lookup(&ca
);
1717 lookup_alias
= bgp_ca_alias_lookup(&ca
);
1720 bgp_ca_alias_delete(&ca
);
1721 bgp_ca_community_delete(&ca
);
1724 /* Lookup if community hash table has an item
1725 * with the same alias name.
1727 strlcpy(ca
.community
, lookup_alias
->community
,
1728 sizeof(ca
.community
));
1729 if (bgp_ca_community_lookup(&ca
)) {
1731 "community (%s) already has this alias (%s)\n",
1732 lookup_alias
->community
,
1733 lookup_alias
->alias
);
1736 bgp_ca_alias_delete(&ca
);
1739 if (lookup_community
) {
1740 /* Lookup if alias hash table has an item
1741 * with the same community.
1743 strlcpy(ca
.alias
, lookup_community
->alias
,
1745 if (bgp_ca_alias_lookup(&ca
)) {
1747 "alias (%s) already has this community (%s)\n",
1748 lookup_community
->alias
,
1749 lookup_community
->community
);
1752 bgp_ca_community_delete(&ca
);
1755 bgp_ca_alias_insert(&ca
);
1756 bgp_ca_community_insert(&ca
);
1762 DEFPY (bgp_global_suppress_fib_pending
,
1763 bgp_global_suppress_fib_pending_cmd
,
1764 "[no] bgp suppress-fib-pending",
1767 "Advertise only routes that are programmed in kernel to peers globally\n")
1769 bm_wait_for_fib_set(!no
);
1774 DEFPY (bgp_suppress_fib_pending
,
1775 bgp_suppress_fib_pending_cmd
,
1776 "[no] bgp suppress-fib-pending",
1779 "Advertise only routes that are programmed in kernel to peers\n")
1781 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1783 bgp_suppress_fib_pending_set(bgp
, !no
);
1788 /* BGP Cluster ID. */
1789 DEFUN (bgp_cluster_id
,
1791 "bgp cluster-id <A.B.C.D|(1-4294967295)>",
1793 "Configure Route-Reflector Cluster-id\n"
1794 "Route-Reflector Cluster-id in IP address format\n"
1795 "Route-Reflector Cluster-id as 32 bit quantity\n")
1797 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1800 struct in_addr cluster
;
1802 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &cluster
);
1804 vty_out(vty
, "%% Malformed bgp cluster identifier\n");
1805 return CMD_WARNING_CONFIG_FAILED
;
1808 bgp_cluster_id_set(bgp
, &cluster
);
1809 bgp_clear_star_soft_out(vty
, bgp
->name
);
1814 DEFUN (no_bgp_cluster_id
,
1815 no_bgp_cluster_id_cmd
,
1816 "no bgp cluster-id [<A.B.C.D|(1-4294967295)>]",
1819 "Configure Route-Reflector Cluster-id\n"
1820 "Route-Reflector Cluster-id in IP address format\n"
1821 "Route-Reflector Cluster-id as 32 bit quantity\n")
1823 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1824 bgp_cluster_id_unset(bgp
);
1825 bgp_clear_star_soft_out(vty
, bgp
->name
);
1834 "Disable BGP route installation to RIB (Zebra)\n")
1836 if (bgp_option_check(BGP_OPT_NO_FIB
)) {
1838 "%% No-RIB option is already set, nothing to do here.\n");
1842 bgp_option_norib_set_runtime();
1847 DEFPY (no_bgp_norib
,
1852 "Disable BGP route installation to RIB (Zebra)\n")
1854 if (!bgp_option_check(BGP_OPT_NO_FIB
)) {
1856 "%% No-RIB option is not set, nothing to do here.\n");
1860 bgp_option_norib_unset_runtime();
1865 DEFPY (no_bgp_send_extra_data
,
1866 no_bgp_send_extra_data_cmd
,
1867 "[no] bgp send-extra-data zebra",
1870 "Extra data to Zebra for display/use\n"
1874 UNSET_FLAG(bm
->flags
, BM_FLAG_SEND_EXTRA_DATA_TO_ZEBRA
);
1876 SET_FLAG(bm
->flags
, BM_FLAG_SEND_EXTRA_DATA_TO_ZEBRA
);
1881 DEFUN (bgp_confederation_identifier
,
1882 bgp_confederation_identifier_cmd
,
1883 "bgp confederation identifier (1-4294967295)",
1885 "AS confederation parameters\n"
1887 "Set routing domain confederation AS\n")
1889 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1893 as
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1895 bgp_confederation_id_set(bgp
, as
);
1900 DEFUN (no_bgp_confederation_identifier
,
1901 no_bgp_confederation_identifier_cmd
,
1902 "no bgp confederation identifier [(1-4294967295)]",
1905 "AS confederation parameters\n"
1907 "Set routing domain confederation AS\n")
1909 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1910 bgp_confederation_id_unset(bgp
);
1915 DEFUN (bgp_confederation_peers
,
1916 bgp_confederation_peers_cmd
,
1917 "bgp confederation peers (1-4294967295)...",
1919 "AS confederation parameters\n"
1920 "Peer ASs in BGP confederation\n"
1923 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1928 for (i
= idx_asn
; i
< argc
; i
++) {
1929 as
= strtoul(argv
[i
]->arg
, NULL
, 10);
1931 if (bgp
->as
== as
) {
1933 "%% Local member-AS not allowed in confed peer list\n");
1937 bgp_confederation_peers_add(bgp
, as
);
1942 DEFUN (no_bgp_confederation_peers
,
1943 no_bgp_confederation_peers_cmd
,
1944 "no bgp confederation peers (1-4294967295)...",
1947 "AS confederation parameters\n"
1948 "Peer ASs in BGP confederation\n"
1951 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1956 for (i
= idx_asn
; i
< argc
; i
++) {
1957 as
= strtoul(argv
[i
]->arg
, NULL
, 10);
1959 bgp_confederation_peers_remove(bgp
, as
);
1965 * Central routine for maximum-paths configuration.
1966 * @peer_type: BGP_PEER_EBGP or BGP_PEER_IBGP
1967 * @set: 1 for setting values, 0 for removing the max-paths config.
1969 static int bgp_maxpaths_config_vty(struct vty
*vty
, int peer_type
,
1970 const char *mpaths
, uint16_t options
,
1973 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1974 uint16_t maxpaths
= 0;
1979 afi
= bgp_node_afi(vty
);
1980 safi
= bgp_node_safi(vty
);
1983 maxpaths
= strtol(mpaths
, NULL
, 10);
1984 if (maxpaths
> multipath_num
) {
1986 "%% Maxpaths Specified: %d is > than multipath num specified on bgp command line %d",
1987 maxpaths
, multipath_num
);
1988 return CMD_WARNING_CONFIG_FAILED
;
1990 ret
= bgp_maximum_paths_set(bgp
, afi
, safi
, peer_type
, maxpaths
,
1993 ret
= bgp_maximum_paths_unset(bgp
, afi
, safi
, peer_type
);
1997 "%% Failed to %sset maximum-paths %s %u for afi %u, safi %u\n",
1998 (set
== 1) ? "" : "un",
1999 (peer_type
== BGP_PEER_EBGP
) ? "ebgp" : "ibgp",
2000 maxpaths
, afi
, safi
);
2001 return CMD_WARNING_CONFIG_FAILED
;
2004 bgp_recalculate_all_bestpaths(bgp
);
2009 DEFUN (bgp_maxmed_admin
,
2010 bgp_maxmed_admin_cmd
,
2011 "bgp max-med administrative ",
2013 "Advertise routes with max-med\n"
2014 "Administratively applied, for an indefinite period\n")
2016 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2018 bgp
->v_maxmed_admin
= 1;
2019 bgp
->maxmed_admin_value
= BGP_MAXMED_VALUE_DEFAULT
;
2021 bgp_maxmed_update(bgp
);
2026 DEFUN (bgp_maxmed_admin_medv
,
2027 bgp_maxmed_admin_medv_cmd
,
2028 "bgp max-med administrative (0-4294967295)",
2030 "Advertise routes with max-med\n"
2031 "Administratively applied, for an indefinite period\n"
2032 "Max MED value to be used\n")
2034 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2037 bgp
->v_maxmed_admin
= 1;
2038 bgp
->maxmed_admin_value
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2040 bgp_maxmed_update(bgp
);
2045 DEFUN (no_bgp_maxmed_admin
,
2046 no_bgp_maxmed_admin_cmd
,
2047 "no bgp max-med administrative [(0-4294967295)]",
2050 "Advertise routes with max-med\n"
2051 "Administratively applied, for an indefinite period\n"
2052 "Max MED value to be used\n")
2054 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2055 bgp
->v_maxmed_admin
= BGP_MAXMED_ADMIN_UNCONFIGURED
;
2056 bgp
->maxmed_admin_value
= BGP_MAXMED_VALUE_DEFAULT
;
2057 bgp_maxmed_update(bgp
);
2062 DEFUN (bgp_maxmed_onstartup
,
2063 bgp_maxmed_onstartup_cmd
,
2064 "bgp max-med on-startup (5-86400) [(0-4294967295)]",
2066 "Advertise routes with max-med\n"
2067 "Effective on a startup\n"
2068 "Time (seconds) period for max-med\n"
2069 "Max MED value to be used\n")
2071 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2074 if (argv_find(argv
, argc
, "(5-86400)", &idx
))
2075 bgp
->v_maxmed_onstartup
= strtoul(argv
[idx
]->arg
, NULL
, 10);
2076 if (argv_find(argv
, argc
, "(0-4294967295)", &idx
))
2077 bgp
->maxmed_onstartup_value
= strtoul(argv
[idx
]->arg
, NULL
, 10);
2079 bgp
->maxmed_onstartup_value
= BGP_MAXMED_VALUE_DEFAULT
;
2081 bgp_maxmed_update(bgp
);
2086 DEFUN (no_bgp_maxmed_onstartup
,
2087 no_bgp_maxmed_onstartup_cmd
,
2088 "no bgp max-med on-startup [(5-86400) [(0-4294967295)]]",
2091 "Advertise routes with max-med\n"
2092 "Effective on a startup\n"
2093 "Time (seconds) period for max-med\n"
2094 "Max MED value to be used\n")
2096 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2098 /* Cancel max-med onstartup if its on */
2099 if (bgp
->t_maxmed_onstartup
) {
2100 THREAD_OFF(bgp
->t_maxmed_onstartup
);
2101 bgp
->maxmed_onstartup_over
= 1;
2104 bgp
->v_maxmed_onstartup
= BGP_MAXMED_ONSTARTUP_UNCONFIGURED
;
2105 bgp
->maxmed_onstartup_value
= BGP_MAXMED_VALUE_DEFAULT
;
2107 bgp_maxmed_update(bgp
);
2112 static int bgp_global_update_delay_config_vty(struct vty
*vty
,
2113 uint16_t update_delay
,
2114 uint16_t establish_wait
)
2116 struct listnode
*node
, *nnode
;
2118 bool vrf_cfg
= false;
2121 * See if update-delay is set per-vrf and warn user to delete it
2122 * Note that we only need to check this if this is the first time
2123 * setting the global config.
2125 if (bm
->v_update_delay
== BGP_UPDATE_DELAY_DEF
) {
2126 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
2127 if (bgp
->v_update_delay
!= BGP_UPDATE_DELAY_DEF
) {
2129 "%% update-delay configuration found in vrf %s\n",
2130 bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
2140 "%%Failed: global update-delay config not permitted\n");
2144 if (!establish_wait
) { /* update-delay <delay> */
2145 bm
->v_update_delay
= update_delay
;
2146 bm
->v_establish_wait
= bm
->v_update_delay
;
2148 /* update-delay <delay> <establish-wait> */
2149 if (update_delay
< establish_wait
) {
2151 "%%Failed: update-delay less than the establish-wait!\n");
2152 return CMD_WARNING_CONFIG_FAILED
;
2155 bm
->v_update_delay
= update_delay
;
2156 bm
->v_establish_wait
= establish_wait
;
2159 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
2160 bgp
->v_update_delay
= bm
->v_update_delay
;
2161 bgp
->v_establish_wait
= bm
->v_establish_wait
;
2167 static int bgp_global_update_delay_deconfig_vty(struct vty
*vty
)
2169 struct listnode
*node
, *nnode
;
2172 bm
->v_update_delay
= BGP_UPDATE_DELAY_DEF
;
2173 bm
->v_establish_wait
= bm
->v_update_delay
;
2175 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
2176 bgp
->v_update_delay
= bm
->v_update_delay
;
2177 bgp
->v_establish_wait
= bm
->v_establish_wait
;
2183 static int bgp_update_delay_config_vty(struct vty
*vty
, uint16_t update_delay
,
2184 uint16_t establish_wait
)
2186 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2188 /* if configured globally, per-instance config is not allowed */
2189 if (bm
->v_update_delay
) {
2191 "%%Failed: per-vrf update-delay config not permitted with global update-delay\n");
2192 return CMD_WARNING_CONFIG_FAILED
;
2196 if (!establish_wait
) /* update-delay <delay> */
2198 bgp
->v_update_delay
= update_delay
;
2199 bgp
->v_establish_wait
= bgp
->v_update_delay
;
2203 /* update-delay <delay> <establish-wait> */
2204 if (update_delay
< establish_wait
) {
2206 "%%Failed: update-delay less than the establish-wait!\n");
2207 return CMD_WARNING_CONFIG_FAILED
;
2210 bgp
->v_update_delay
= update_delay
;
2211 bgp
->v_establish_wait
= establish_wait
;
2216 static int bgp_update_delay_deconfig_vty(struct vty
*vty
)
2218 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2220 /* If configured globally, cannot remove from one bgp instance */
2221 if (bm
->v_update_delay
) {
2223 "%%Failed: bgp update-delay configured globally. Delete per-vrf not permitted\n");
2224 return CMD_WARNING_CONFIG_FAILED
;
2226 bgp
->v_update_delay
= BGP_UPDATE_DELAY_DEF
;
2227 bgp
->v_establish_wait
= bgp
->v_update_delay
;
2232 void bgp_config_write_update_delay(struct vty
*vty
, struct bgp
*bgp
)
2234 /* If configured globally, no need to display per-instance value */
2235 if (bgp
->v_update_delay
!= bm
->v_update_delay
) {
2236 vty_out(vty
, " update-delay %d", bgp
->v_update_delay
);
2237 if (bgp
->v_update_delay
!= bgp
->v_establish_wait
)
2238 vty_out(vty
, " %d", bgp
->v_establish_wait
);
2243 /* Global update-delay configuration */
2244 DEFPY (bgp_global_update_delay
,
2245 bgp_global_update_delay_cmd
,
2246 "bgp update-delay (0-3600)$delay [(1-3600)$wait]",
2248 "Force initial delay for best-path and updates for all bgp instances\n"
2249 "Max delay in seconds\n"
2250 "Establish wait in seconds\n")
2252 return bgp_global_update_delay_config_vty(vty
, delay
, wait
);
2255 /* Global update-delay deconfiguration */
2256 DEFPY (no_bgp_global_update_delay
,
2257 no_bgp_global_update_delay_cmd
,
2258 "no bgp update-delay [(0-3600) [(1-3600)]]",
2261 "Force initial delay for best-path and updates\n"
2262 "Max delay in seconds\n"
2263 "Establish wait in seconds\n")
2265 return bgp_global_update_delay_deconfig_vty(vty
);
2268 /* Update-delay configuration */
2270 DEFPY (bgp_update_delay
,
2271 bgp_update_delay_cmd
,
2272 "update-delay (0-3600)$delay [(1-3600)$wait]",
2273 "Force initial delay for best-path and updates\n"
2274 "Max delay in seconds\n"
2275 "Establish wait in seconds\n")
2277 return bgp_update_delay_config_vty(vty
, delay
, wait
);
2280 /* Update-delay deconfiguration */
2281 DEFPY (no_bgp_update_delay
,
2282 no_bgp_update_delay_cmd
,
2283 "no update-delay [(0-3600) [(1-3600)]]",
2285 "Force initial delay for best-path and updates\n"
2286 "Max delay in seconds\n"
2287 "Establish wait in seconds\n")
2289 return bgp_update_delay_deconfig_vty(vty
);
2293 static int bgp_wpkt_quanta_config_vty(struct vty
*vty
, uint32_t quanta
,
2296 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2298 quanta
= set
? quanta
: BGP_WRITE_PACKET_MAX
;
2299 atomic_store_explicit(&bgp
->wpkt_quanta
, quanta
, memory_order_relaxed
);
2304 static int bgp_rpkt_quanta_config_vty(struct vty
*vty
, uint32_t quanta
,
2307 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2309 quanta
= set
? quanta
: BGP_READ_PACKET_MAX
;
2310 atomic_store_explicit(&bgp
->rpkt_quanta
, quanta
, memory_order_relaxed
);
2315 void bgp_config_write_wpkt_quanta(struct vty
*vty
, struct bgp
*bgp
)
2318 atomic_load_explicit(&bgp
->wpkt_quanta
, memory_order_relaxed
);
2319 if (quanta
!= BGP_WRITE_PACKET_MAX
)
2320 vty_out(vty
, " write-quanta %d\n", quanta
);
2323 void bgp_config_write_rpkt_quanta(struct vty
*vty
, struct bgp
*bgp
)
2326 atomic_load_explicit(&bgp
->rpkt_quanta
, memory_order_relaxed
);
2327 if (quanta
!= BGP_READ_PACKET_MAX
)
2328 vty_out(vty
, " read-quanta %d\n", quanta
);
2331 /* Packet quanta configuration
2333 * XXX: The value set here controls the size of a stack buffer in the IO
2334 * thread. When changing these limits be careful to prevent stack overflow.
2336 * Furthermore, the maximums used here should correspond to
2337 * BGP_WRITE_PACKET_MAX and BGP_READ_PACKET_MAX.
2339 DEFPY (bgp_wpkt_quanta
,
2340 bgp_wpkt_quanta_cmd
,
2341 "[no] write-quanta (1-64)$quanta",
2343 "How many packets to write to peer socket per run\n"
2344 "Number of packets\n")
2346 return bgp_wpkt_quanta_config_vty(vty
, quanta
, !no
);
2349 DEFPY (bgp_rpkt_quanta
,
2350 bgp_rpkt_quanta_cmd
,
2351 "[no] read-quanta (1-10)$quanta",
2353 "How many packets to read from peer socket per I/O cycle\n"
2354 "Number of packets\n")
2356 return bgp_rpkt_quanta_config_vty(vty
, quanta
, !no
);
2359 void bgp_config_write_coalesce_time(struct vty
*vty
, struct bgp
*bgp
)
2361 if (!bgp
->heuristic_coalesce
)
2362 vty_out(vty
, " coalesce-time %u\n", bgp
->coalesce_time
);
2365 /* BGP TCP keepalive */
2366 static void bgp_config_tcp_keepalive(struct vty
*vty
, struct bgp
*bgp
)
2368 if (bgp
->tcp_keepalive_idle
) {
2369 vty_out(vty
, " bgp tcp-keepalive %u %u %u\n",
2370 bgp
->tcp_keepalive_idle
, bgp
->tcp_keepalive_intvl
,
2371 bgp
->tcp_keepalive_probes
);
2375 DEFUN (bgp_coalesce_time
,
2376 bgp_coalesce_time_cmd
,
2377 "coalesce-time (0-4294967295)",
2378 "Subgroup coalesce timer\n"
2379 "Subgroup coalesce timer value (in ms)\n")
2381 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2385 bgp
->heuristic_coalesce
= false;
2387 if (argv_find(argv
, argc
, "(0-4294967295)", &idx
))
2388 bgp
->coalesce_time
= strtoul(argv
[idx
]->arg
, NULL
, 10);
2393 DEFUN (no_bgp_coalesce_time
,
2394 no_bgp_coalesce_time_cmd
,
2395 "no coalesce-time (0-4294967295)",
2397 "Subgroup coalesce timer\n"
2398 "Subgroup coalesce timer value (in ms)\n")
2400 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2402 bgp
->heuristic_coalesce
= true;
2403 bgp
->coalesce_time
= BGP_DEFAULT_SUBGROUP_COALESCE_TIME
;
2407 /* Maximum-paths configuration */
2408 DEFUN (bgp_maxpaths
,
2410 "maximum-paths " CMD_RANGE_STR(1, MULTIPATH_NUM
),
2411 "Forward packets over multiple paths\n"
2412 "Number of paths\n")
2415 return bgp_maxpaths_config_vty(vty
, BGP_PEER_EBGP
,
2416 argv
[idx_number
]->arg
, 0, 1);
2419 ALIAS_HIDDEN(bgp_maxpaths
, bgp_maxpaths_hidden_cmd
,
2420 "maximum-paths " CMD_RANGE_STR(1, MULTIPATH_NUM
),
2421 "Forward packets over multiple paths\n"
2422 "Number of paths\n")
2424 DEFUN (bgp_maxpaths_ibgp
,
2425 bgp_maxpaths_ibgp_cmd
,
2426 "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM
),
2427 "Forward packets over multiple paths\n"
2429 "Number of paths\n")
2432 return bgp_maxpaths_config_vty(vty
, BGP_PEER_IBGP
,
2433 argv
[idx_number
]->arg
, 0, 1);
2436 ALIAS_HIDDEN(bgp_maxpaths_ibgp
, bgp_maxpaths_ibgp_hidden_cmd
,
2437 "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM
),
2438 "Forward packets over multiple paths\n"
2440 "Number of paths\n")
2442 DEFUN (bgp_maxpaths_ibgp_cluster
,
2443 bgp_maxpaths_ibgp_cluster_cmd
,
2444 "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM
) " equal-cluster-length",
2445 "Forward packets over multiple paths\n"
2448 "Match the cluster length\n")
2451 return bgp_maxpaths_config_vty(vty
, BGP_PEER_IBGP
,
2452 argv
[idx_number
]->arg
, true, 1);
2455 ALIAS_HIDDEN(bgp_maxpaths_ibgp_cluster
, bgp_maxpaths_ibgp_cluster_hidden_cmd
,
2456 "maximum-paths ibgp " CMD_RANGE_STR(
2457 1, MULTIPATH_NUM
) " equal-cluster-length",
2458 "Forward packets over multiple paths\n"
2461 "Match the cluster length\n")
2463 DEFUN (no_bgp_maxpaths
,
2464 no_bgp_maxpaths_cmd
,
2465 "no maximum-paths [" CMD_RANGE_STR(1, MULTIPATH_NUM
) "]",
2467 "Forward packets over multiple paths\n"
2468 "Number of paths\n")
2470 return bgp_maxpaths_config_vty(vty
, BGP_PEER_EBGP
, NULL
, 0, 0);
2473 ALIAS_HIDDEN(no_bgp_maxpaths
, no_bgp_maxpaths_hidden_cmd
,
2474 "no maximum-paths [" CMD_RANGE_STR(1, MULTIPATH_NUM
) "]", NO_STR
2475 "Forward packets over multiple paths\n"
2476 "Number of paths\n")
2478 DEFUN (no_bgp_maxpaths_ibgp
,
2479 no_bgp_maxpaths_ibgp_cmd
,
2480 "no maximum-paths ibgp [" CMD_RANGE_STR(1, MULTIPATH_NUM
) " [equal-cluster-length]]",
2482 "Forward packets over multiple paths\n"
2485 "Match the cluster length\n")
2487 return bgp_maxpaths_config_vty(vty
, BGP_PEER_IBGP
, NULL
, 0, 0);
2490 ALIAS_HIDDEN(no_bgp_maxpaths_ibgp
, no_bgp_maxpaths_ibgp_hidden_cmd
,
2491 "no maximum-paths ibgp [" CMD_RANGE_STR(
2492 1, MULTIPATH_NUM
) " [equal-cluster-length]]",
2494 "Forward packets over multiple paths\n"
2497 "Match the cluster length\n")
2499 static void bgp_config_write_maxpaths(struct vty
*vty
, struct bgp
*bgp
,
2500 afi_t afi
, safi_t safi
)
2502 if (bgp
->maxpaths
[afi
][safi
].maxpaths_ebgp
!= multipath_num
) {
2503 vty_out(vty
, " maximum-paths %d\n",
2504 bgp
->maxpaths
[afi
][safi
].maxpaths_ebgp
);
2507 if (bgp
->maxpaths
[afi
][safi
].maxpaths_ibgp
!= multipath_num
) {
2508 vty_out(vty
, " maximum-paths ibgp %d",
2509 bgp
->maxpaths
[afi
][safi
].maxpaths_ibgp
);
2510 if (bgp
->maxpaths
[afi
][safi
].same_clusterlen
)
2511 vty_out(vty
, " equal-cluster-length");
2520 "timers bgp (0-65535) (0-65535)",
2521 "Adjust routing timers\n"
2523 "Keepalive interval\n"
2526 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2528 int idx_number_2
= 3;
2529 unsigned long keepalive
= 0;
2530 unsigned long holdtime
= 0;
2532 keepalive
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2533 holdtime
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
2535 /* Holdtime value check. */
2536 if (holdtime
< 3 && holdtime
!= 0) {
2538 "%% hold time value must be either 0 or greater than 3\n");
2539 return CMD_WARNING_CONFIG_FAILED
;
2542 bgp_timers_set(bgp
, keepalive
, holdtime
, DFLT_BGP_CONNECT_RETRY
,
2543 BGP_DEFAULT_DELAYOPEN
);
2548 DEFUN (no_bgp_timers
,
2550 "no timers bgp [(0-65535) (0-65535)]",
2552 "Adjust routing timers\n"
2554 "Keepalive interval\n"
2557 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2558 bgp_timers_set(bgp
, DFLT_BGP_KEEPALIVE
, DFLT_BGP_HOLDTIME
,
2559 DFLT_BGP_CONNECT_RETRY
, BGP_DEFAULT_DELAYOPEN
);
2564 /* BGP minimum holdtime. */
2566 DEFUN(bgp_minimum_holdtime
, bgp_minimum_holdtime_cmd
,
2567 "bgp minimum-holdtime (1-65535)",
2568 "BGP specific commands\n"
2569 "BGP minimum holdtime\n"
2572 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2574 unsigned long min_holdtime
;
2576 min_holdtime
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2578 bgp
->default_min_holdtime
= min_holdtime
;
2583 DEFUN(no_bgp_minimum_holdtime
, no_bgp_minimum_holdtime_cmd
,
2584 "no bgp minimum-holdtime [(1-65535)]",
2586 "BGP specific commands\n"
2587 "BGP minimum holdtime\n"
2590 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2592 bgp
->default_min_holdtime
= 0;
2597 DEFPY(bgp_tcp_keepalive
, bgp_tcp_keepalive_cmd
,
2598 "bgp tcp-keepalive (1-65535)$idle (1-65535)$intvl (1-30)$probes",
2600 "TCP keepalive parameters\n"
2601 "TCP keepalive idle time (seconds)\n"
2602 "TCP keepalive interval (seconds)\n"
2603 "TCP keepalive maximum probes\n")
2605 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2607 bgp_tcp_keepalive_set(bgp
, (uint16_t)idle
, (uint16_t)intvl
,
2613 DEFPY(no_bgp_tcp_keepalive
, no_bgp_tcp_keepalive_cmd
,
2614 "no bgp tcp-keepalive [(1-65535) (1-65535) (1-30)]",
2617 "TCP keepalive parameters\n"
2618 "TCP keepalive idle time (seconds)\n"
2619 "TCP keepalive interval (seconds)\n"
2620 "TCP keepalive maximum probes\n")
2622 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2624 bgp_tcp_keepalive_unset(bgp
);
2629 DEFUN (bgp_client_to_client_reflection
,
2630 bgp_client_to_client_reflection_cmd
,
2631 "bgp client-to-client reflection",
2633 "Configure client to client route reflection\n"
2634 "reflection of routes allowed\n")
2636 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2637 UNSET_FLAG(bgp
->flags
, BGP_FLAG_NO_CLIENT_TO_CLIENT
);
2638 bgp_clear_star_soft_out(vty
, bgp
->name
);
2643 DEFUN (no_bgp_client_to_client_reflection
,
2644 no_bgp_client_to_client_reflection_cmd
,
2645 "no bgp client-to-client reflection",
2648 "Configure client to client route reflection\n"
2649 "reflection of routes allowed\n")
2651 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2652 SET_FLAG(bgp
->flags
, BGP_FLAG_NO_CLIENT_TO_CLIENT
);
2653 bgp_clear_star_soft_out(vty
, bgp
->name
);
2658 /* "bgp always-compare-med" configuration. */
2659 DEFUN (bgp_always_compare_med
,
2660 bgp_always_compare_med_cmd
,
2661 "bgp always-compare-med",
2663 "Allow comparing MED from different neighbors\n")
2665 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2666 SET_FLAG(bgp
->flags
, BGP_FLAG_ALWAYS_COMPARE_MED
);
2667 bgp_recalculate_all_bestpaths(bgp
);
2672 DEFUN (no_bgp_always_compare_med
,
2673 no_bgp_always_compare_med_cmd
,
2674 "no bgp always-compare-med",
2677 "Allow comparing MED from different neighbors\n")
2679 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2680 UNSET_FLAG(bgp
->flags
, BGP_FLAG_ALWAYS_COMPARE_MED
);
2681 bgp_recalculate_all_bestpaths(bgp
);
2687 DEFUN(bgp_ebgp_requires_policy
, bgp_ebgp_requires_policy_cmd
,
2688 "bgp ebgp-requires-policy",
2690 "Require in and out policy for eBGP peers (RFC8212)\n")
2692 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2693 SET_FLAG(bgp
->flags
, BGP_FLAG_EBGP_REQUIRES_POLICY
);
2697 DEFUN(no_bgp_ebgp_requires_policy
, no_bgp_ebgp_requires_policy_cmd
,
2698 "no bgp ebgp-requires-policy",
2701 "Require in and out policy for eBGP peers (RFC8212)\n")
2703 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2704 UNSET_FLAG(bgp
->flags
, BGP_FLAG_EBGP_REQUIRES_POLICY
);
2708 DEFUN(bgp_suppress_duplicates
, bgp_suppress_duplicates_cmd
,
2709 "bgp suppress-duplicates",
2711 "Suppress duplicate updates if the route actually not changed\n")
2713 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2714 SET_FLAG(bgp
->flags
, BGP_FLAG_SUPPRESS_DUPLICATES
);
2718 DEFUN(no_bgp_suppress_duplicates
, no_bgp_suppress_duplicates_cmd
,
2719 "no bgp suppress-duplicates",
2722 "Suppress duplicate updates if the route actually not changed\n")
2724 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2725 UNSET_FLAG(bgp
->flags
, BGP_FLAG_SUPPRESS_DUPLICATES
);
2729 DEFUN(bgp_reject_as_sets
, bgp_reject_as_sets_cmd
,
2730 "bgp reject-as-sets",
2732 "Reject routes with AS_SET or AS_CONFED_SET flag\n")
2734 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2735 struct listnode
*node
, *nnode
;
2738 bgp
->reject_as_sets
= true;
2740 /* Reset existing BGP sessions to reject routes
2741 * with aspath containing AS_SET or AS_CONFED_SET.
2743 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
2744 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
2745 peer
->last_reset
= PEER_DOWN_AS_SETS_REJECT
;
2746 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
2747 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2754 DEFUN(no_bgp_reject_as_sets
, no_bgp_reject_as_sets_cmd
,
2755 "no bgp reject-as-sets",
2758 "Reject routes with AS_SET or AS_CONFED_SET flag\n")
2760 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2761 struct listnode
*node
, *nnode
;
2764 bgp
->reject_as_sets
= false;
2766 /* Reset existing BGP sessions to reject routes
2767 * with aspath containing AS_SET or AS_CONFED_SET.
2769 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
2770 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
2771 peer
->last_reset
= PEER_DOWN_AS_SETS_REJECT
;
2772 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
2773 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2780 /* "bgp deterministic-med" configuration. */
2781 DEFUN (bgp_deterministic_med
,
2782 bgp_deterministic_med_cmd
,
2783 "bgp deterministic-med",
2785 "Pick the best-MED path among paths advertised from the neighboring AS\n")
2787 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2789 if (!CHECK_FLAG(bgp
->flags
, BGP_FLAG_DETERMINISTIC_MED
)) {
2790 SET_FLAG(bgp
->flags
, BGP_FLAG_DETERMINISTIC_MED
);
2791 bgp_recalculate_all_bestpaths(bgp
);
2797 DEFUN (no_bgp_deterministic_med
,
2798 no_bgp_deterministic_med_cmd
,
2799 "no bgp deterministic-med",
2802 "Pick the best-MED path among paths advertised from the neighboring AS\n")
2804 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2805 int bestpath_per_as_used
;
2809 struct listnode
*node
, *nnode
;
2811 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_DETERMINISTIC_MED
)) {
2812 bestpath_per_as_used
= 0;
2814 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
2815 FOREACH_AFI_SAFI (afi
, safi
)
2816 if (bgp_addpath_dmed_required(
2817 peer
->addpath_type
[afi
][safi
])) {
2818 bestpath_per_as_used
= 1;
2822 if (bestpath_per_as_used
)
2826 if (bestpath_per_as_used
) {
2828 "bgp deterministic-med cannot be disabled while addpath-tx-bestpath-per-AS is in use\n");
2829 return CMD_WARNING_CONFIG_FAILED
;
2831 UNSET_FLAG(bgp
->flags
, BGP_FLAG_DETERMINISTIC_MED
);
2832 bgp_recalculate_all_bestpaths(bgp
);
2839 /* "bgp graceful-restart mode" configuration. */
2840 DEFUN (bgp_graceful_restart
,
2841 bgp_graceful_restart_cmd
,
2842 "bgp graceful-restart",
2847 int ret
= BGP_GR_FAILURE
;
2849 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
2850 zlog_debug("[BGP_GR] bgp_graceful_restart_cmd : START ");
2852 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2854 ret
= bgp_gr_update_all(bgp
, GLOBAL_GR_CMD
);
2856 VTY_BGP_GR_ROUTER_DETECT_AND_SEND_CAPABILITY_TO_ZEBRA(bgp
, bgp
->peer
,
2859 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
2860 zlog_debug("[BGP_GR] bgp_graceful_restart_cmd : END ");
2862 "Graceful restart configuration changed, reset all peers to take effect\n");
2863 return bgp_vty_return(vty
, ret
);
2866 DEFUN (no_bgp_graceful_restart
,
2867 no_bgp_graceful_restart_cmd
,
2868 "no bgp graceful-restart",
2874 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2876 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
2877 zlog_debug("[BGP_GR] no_bgp_graceful_restart_cmd : START ");
2879 int ret
= BGP_GR_FAILURE
;
2881 ret
= bgp_gr_update_all(bgp
, NO_GLOBAL_GR_CMD
);
2883 VTY_BGP_GR_ROUTER_DETECT_AND_SEND_CAPABILITY_TO_ZEBRA(bgp
, bgp
->peer
,
2886 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
2887 zlog_debug("[BGP_GR] no_bgp_graceful_restart_cmd : END ");
2889 "Graceful restart configuration changed, reset all peers to take effect\n");
2891 return bgp_vty_return(vty
, ret
);
2894 DEFUN (bgp_graceful_restart_stalepath_time
,
2895 bgp_graceful_restart_stalepath_time_cmd
,
2896 "bgp graceful-restart stalepath-time (1-4095)",
2898 "Graceful restart capability parameters\n"
2899 "Set the max time to hold onto restarting peer's stale paths\n"
2900 "Delay value (seconds)\n")
2902 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2906 stalepath
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2907 bgp
->stalepath_time
= stalepath
;
2911 DEFUN (bgp_graceful_restart_restart_time
,
2912 bgp_graceful_restart_restart_time_cmd
,
2913 "bgp graceful-restart restart-time (0-4095)",
2915 "Graceful restart capability parameters\n"
2916 "Set the time to wait to delete stale routes before a BGP open message is received\n"
2917 "Delay value (seconds)\n")
2919 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2923 restart
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2924 bgp
->restart_time
= restart
;
2928 DEFUN (bgp_graceful_restart_select_defer_time
,
2929 bgp_graceful_restart_select_defer_time_cmd
,
2930 "bgp graceful-restart select-defer-time (0-3600)",
2932 "Graceful restart capability parameters\n"
2933 "Set the time to defer the BGP route selection after restart\n"
2934 "Delay value (seconds, 0 - disable)\n")
2936 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2938 uint32_t defer_time
;
2940 defer_time
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2941 bgp
->select_defer_time
= defer_time
;
2942 if (defer_time
== 0)
2943 SET_FLAG(bgp
->flags
, BGP_FLAG_SELECT_DEFER_DISABLE
);
2945 UNSET_FLAG(bgp
->flags
, BGP_FLAG_SELECT_DEFER_DISABLE
);
2950 DEFUN (no_bgp_graceful_restart_stalepath_time
,
2951 no_bgp_graceful_restart_stalepath_time_cmd
,
2952 "no bgp graceful-restart stalepath-time [(1-4095)]",
2955 "Graceful restart capability parameters\n"
2956 "Set the max time to hold onto restarting peer's stale paths\n"
2957 "Delay value (seconds)\n")
2959 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2961 bgp
->stalepath_time
= BGP_DEFAULT_STALEPATH_TIME
;
2965 DEFUN (no_bgp_graceful_restart_restart_time
,
2966 no_bgp_graceful_restart_restart_time_cmd
,
2967 "no bgp graceful-restart restart-time [(0-4095)]",
2970 "Graceful restart capability parameters\n"
2971 "Set the time to wait to delete stale routes before a BGP open message is received\n"
2972 "Delay value (seconds)\n")
2974 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2976 bgp
->restart_time
= BGP_DEFAULT_RESTART_TIME
;
2980 DEFUN (no_bgp_graceful_restart_select_defer_time
,
2981 no_bgp_graceful_restart_select_defer_time_cmd
,
2982 "no bgp graceful-restart select-defer-time [(0-3600)]",
2985 "Graceful restart capability parameters\n"
2986 "Set the time to defer the BGP route selection after restart\n"
2987 "Delay value (seconds)\n")
2989 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2991 bgp
->select_defer_time
= BGP_DEFAULT_SELECT_DEFERRAL_TIME
;
2992 UNSET_FLAG(bgp
->flags
, BGP_FLAG_SELECT_DEFER_DISABLE
);
2997 DEFUN (bgp_graceful_restart_preserve_fw
,
2998 bgp_graceful_restart_preserve_fw_cmd
,
2999 "bgp graceful-restart preserve-fw-state",
3001 "Graceful restart capability parameters\n"
3002 "Sets F-bit indication that fib is preserved while doing Graceful Restart\n")
3004 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3005 SET_FLAG(bgp
->flags
, BGP_FLAG_GR_PRESERVE_FWD
);
3009 DEFUN (no_bgp_graceful_restart_preserve_fw
,
3010 no_bgp_graceful_restart_preserve_fw_cmd
,
3011 "no bgp graceful-restart preserve-fw-state",
3014 "Graceful restart capability parameters\n"
3015 "Unsets F-bit indication that fib is preserved while doing Graceful Restart\n")
3017 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3018 UNSET_FLAG(bgp
->flags
, BGP_FLAG_GR_PRESERVE_FWD
);
3022 DEFPY (bgp_graceful_restart_notification
,
3023 bgp_graceful_restart_notification_cmd
,
3024 "[no$no] bgp graceful-restart notification",
3027 "Graceful restart capability parameters\n"
3028 "Indicate Graceful Restart support for BGP NOTIFICATION messages\n")
3030 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3033 UNSET_FLAG(bgp
->flags
, BGP_FLAG_GRACEFUL_NOTIFICATION
);
3035 SET_FLAG(bgp
->flags
, BGP_FLAG_GRACEFUL_NOTIFICATION
);
3040 DEFPY (bgp_administrative_reset
,
3041 bgp_administrative_reset_cmd
,
3042 "[no$no] bgp hard-administrative-reset",
3045 "Send Hard Reset CEASE Notification for 'Administrative Reset'\n")
3047 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3050 UNSET_FLAG(bgp
->flags
, BGP_FLAG_HARD_ADMIN_RESET
);
3052 SET_FLAG(bgp
->flags
, BGP_FLAG_HARD_ADMIN_RESET
);
3057 DEFUN (bgp_graceful_restart_disable
,
3058 bgp_graceful_restart_disable_cmd
,
3059 "bgp graceful-restart-disable",
3063 int ret
= BGP_GR_FAILURE
;
3065 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
3067 "[BGP_GR] bgp_graceful_restart_disable_cmd : START ");
3069 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3071 ret
= bgp_gr_update_all(bgp
, GLOBAL_DISABLE_CMD
);
3073 VTY_BGP_GR_ROUTER_DETECT_AND_SEND_CAPABILITY_TO_ZEBRA(bgp
,
3076 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
3078 "[BGP_GR] bgp_graceful_restart_disable_cmd : END ");
3080 "Graceful restart configuration changed, reset all peers to take effect\n");
3082 return bgp_vty_return(vty
, ret
);
3085 DEFUN (no_bgp_graceful_restart_disable
,
3086 no_bgp_graceful_restart_disable_cmd
,
3087 "no bgp graceful-restart-disable",
3093 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3095 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
3097 "[BGP_GR] no_bgp_graceful_restart_disable_cmd : START ");
3099 int ret
= BGP_GR_FAILURE
;
3101 ret
= bgp_gr_update_all(bgp
, NO_GLOBAL_DISABLE_CMD
);
3103 VTY_BGP_GR_ROUTER_DETECT_AND_SEND_CAPABILITY_TO_ZEBRA(bgp
, bgp
->peer
,
3106 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
3108 "[BGP_GR] no_bgp_graceful_restart_disable_cmd : END ");
3110 "Graceful restart configuration changed, reset all peers to take effect\n");
3112 return bgp_vty_return(vty
, ret
);
3115 DEFUN (bgp_neighbor_graceful_restart_set
,
3116 bgp_neighbor_graceful_restart_set_cmd
,
3117 "neighbor <A.B.C.D|X:X::X:X|WORD> graceful-restart",
3125 int ret
= BGP_GR_FAILURE
;
3127 VTY_BGP_GR_DEFINE_LOOP_VARIABLE
;
3129 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
3131 "[BGP_GR] bgp_neighbor_graceful_restart_set_cmd : START ");
3133 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3135 return CMD_WARNING_CONFIG_FAILED
;
3137 ret
= bgp_neighbor_graceful_restart(peer
, PEER_GR_CMD
);
3139 VTY_BGP_GR_ROUTER_DETECT(bgp
, peer
, peer
->bgp
->peer
);
3140 VTY_SEND_BGP_GR_CAPABILITY_TO_ZEBRA(peer
->bgp
, ret
);
3142 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
3144 "[BGP_GR] bgp_neighbor_graceful_restart_set_cmd : END ");
3146 "Graceful restart configuration changed, reset this peer to take effect\n");
3148 return bgp_vty_return(vty
, ret
);
3151 DEFUN (no_bgp_neighbor_graceful_restart
,
3152 no_bgp_neighbor_graceful_restart_set_cmd
,
3153 "no neighbor <A.B.C.D|X:X::X:X|WORD> graceful-restart",
3161 int ret
= BGP_GR_FAILURE
;
3164 VTY_BGP_GR_DEFINE_LOOP_VARIABLE
;
3166 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3168 return CMD_WARNING_CONFIG_FAILED
;
3170 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
3172 "[BGP_GR] no_bgp_neighbor_graceful_restart_set_cmd : START ");
3174 ret
= bgp_neighbor_graceful_restart(peer
, NO_PEER_GR_CMD
);
3176 VTY_BGP_GR_ROUTER_DETECT(bgp
, peer
, peer
->bgp
->peer
);
3177 VTY_SEND_BGP_GR_CAPABILITY_TO_ZEBRA(peer
->bgp
, ret
);
3179 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
3181 "[BGP_GR] no_bgp_neighbor_graceful_restart_set_cmd : END ");
3183 "Graceful restart configuration changed, reset this peer to take effect\n");
3185 return bgp_vty_return(vty
, ret
);
3188 DEFUN (bgp_neighbor_graceful_restart_helper_set
,
3189 bgp_neighbor_graceful_restart_helper_set_cmd
,
3190 "neighbor <A.B.C.D|X:X::X:X|WORD> graceful-restart-helper",
3193 GR_NEIGHBOR_HELPER_CMD
3198 int ret
= BGP_GR_FAILURE
;
3200 VTY_BGP_GR_DEFINE_LOOP_VARIABLE
;
3202 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
3204 "[BGP_GR] bgp_neighbor_graceful_restart_helper_set_cmd : START ");
3206 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3209 return CMD_WARNING_CONFIG_FAILED
;
3212 ret
= bgp_neighbor_graceful_restart(peer
, PEER_HELPER_CMD
);
3214 VTY_BGP_GR_ROUTER_DETECT(bgp
, peer
, peer
->bgp
->peer
);
3215 VTY_SEND_BGP_GR_CAPABILITY_TO_ZEBRA(peer
->bgp
, ret
);
3217 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
3219 "[BGP_GR] bgp_neighbor_graceful_restart_helper_set_cmd : END ");
3221 "Graceful restart configuration changed, reset this peer to take effect\n");
3223 return bgp_vty_return(vty
, ret
);
3226 DEFUN (no_bgp_neighbor_graceful_restart_helper
,
3227 no_bgp_neighbor_graceful_restart_helper_set_cmd
,
3228 "no neighbor <A.B.C.D|X:X::X:X|WORD> graceful-restart-helper",
3232 NO_GR_NEIGHBOR_HELPER_CMD
3236 int ret
= BGP_GR_FAILURE
;
3239 VTY_BGP_GR_DEFINE_LOOP_VARIABLE
;
3241 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3243 return CMD_WARNING_CONFIG_FAILED
;
3245 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
3247 "[BGP_GR] no_bgp_neighbor_graceful_restart_helper_set_cmd : START ");
3249 ret
= bgp_neighbor_graceful_restart(peer
, NO_PEER_HELPER_CMD
);
3251 VTY_BGP_GR_ROUTER_DETECT(bgp
, peer
, peer
->bgp
->peer
);
3252 VTY_SEND_BGP_GR_CAPABILITY_TO_ZEBRA(peer
->bgp
, ret
);
3254 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
3256 "[BGP_GR] no_bgp_neighbor_graceful_restart_helper_set_cmd : END ");
3258 "Graceful restart configuration changed, reset this peer to take effect\n");
3260 return bgp_vty_return(vty
, ret
);
3263 DEFUN (bgp_neighbor_graceful_restart_disable_set
,
3264 bgp_neighbor_graceful_restart_disable_set_cmd
,
3265 "neighbor <A.B.C.D|X:X::X:X|WORD> graceful-restart-disable",
3268 GR_NEIGHBOR_DISABLE_CMD
3273 int ret
= BGP_GR_FAILURE
;
3275 VTY_BGP_GR_DEFINE_LOOP_VARIABLE
;
3277 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
3279 "[BGP_GR] bgp_neighbor_graceful_restart_disable_set_cmd : START ");
3281 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3283 return CMD_WARNING_CONFIG_FAILED
;
3285 ret
= bgp_neighbor_graceful_restart(peer
, PEER_DISABLE_CMD
);
3287 if (peer
->bgp
->t_startup
)
3288 bgp_peer_gr_flags_update(peer
);
3290 VTY_BGP_GR_ROUTER_DETECT(bgp
, peer
, peer
->bgp
->peer
);
3291 VTY_SEND_BGP_GR_CAPABILITY_TO_ZEBRA(peer
->bgp
, ret
);
3293 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
3295 "[BGP_GR]bgp_neighbor_graceful_restart_disable_set_cmd : END ");
3297 "Graceful restart configuration changed, reset this peer to take effect\n");
3299 return bgp_vty_return(vty
, ret
);
3302 DEFUN (no_bgp_neighbor_graceful_restart_disable
,
3303 no_bgp_neighbor_graceful_restart_disable_set_cmd
,
3304 "no neighbor <A.B.C.D|X:X::X:X|WORD> graceful-restart-disable",
3308 NO_GR_NEIGHBOR_DISABLE_CMD
3312 int ret
= BGP_GR_FAILURE
;
3315 VTY_BGP_GR_DEFINE_LOOP_VARIABLE
;
3317 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3319 return CMD_WARNING_CONFIG_FAILED
;
3321 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
3323 "[BGP_GR] no_bgp_neighbor_graceful_restart_disable_set_cmd : START ");
3325 ret
= bgp_neighbor_graceful_restart(peer
, NO_PEER_DISABLE_CMD
);
3327 VTY_BGP_GR_ROUTER_DETECT(bgp
, peer
, peer
->bgp
->peer
);
3328 VTY_SEND_BGP_GR_CAPABILITY_TO_ZEBRA(peer
->bgp
, ret
);
3330 if (BGP_DEBUG(graceful_restart
, GRACEFUL_RESTART
))
3332 "[BGP_GR] no_bgp_neighbor_graceful_restart_disable_set_cmd : END ");
3334 "Graceful restart configuration changed, reset this peer to take effect\n");
3336 return bgp_vty_return(vty
, ret
);
3339 DEFUN_HIDDEN (bgp_graceful_restart_disable_eor
,
3340 bgp_graceful_restart_disable_eor_cmd
,
3341 "bgp graceful-restart disable-eor",
3343 "Graceful restart configuration parameters\n"
3344 "Disable EOR Check\n")
3346 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3347 SET_FLAG(bgp
->flags
, BGP_FLAG_GR_DISABLE_EOR
);
3352 DEFUN_HIDDEN (no_bgp_graceful_restart_disable_eor
,
3353 no_bgp_graceful_restart_disable_eor_cmd
,
3354 "no bgp graceful-restart disable-eor",
3357 "Graceful restart configuration parameters\n"
3358 "Disable EOR Check\n")
3360 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3361 UNSET_FLAG(bgp
->flags
, BGP_FLAG_GR_DISABLE_EOR
);
3366 DEFUN (bgp_graceful_restart_rib_stale_time
,
3367 bgp_graceful_restart_rib_stale_time_cmd
,
3368 "bgp graceful-restart rib-stale-time (1-3600)",
3370 "Graceful restart configuration parameters\n"
3371 "Specify the stale route removal timer in rib\n"
3372 "Delay value (seconds)\n")
3374 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3376 uint32_t stale_time
;
3378 stale_time
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
3379 bgp
->rib_stale_time
= stale_time
;
3380 /* Send the stale timer update message to RIB */
3381 if (bgp_zebra_stale_timer_update(bgp
))
3387 DEFUN (no_bgp_graceful_restart_rib_stale_time
,
3388 no_bgp_graceful_restart_rib_stale_time_cmd
,
3389 "no bgp graceful-restart rib-stale-time [(1-3600)]",
3392 "Graceful restart configuration parameters\n"
3393 "Specify the stale route removal timer in rib\n"
3394 "Delay value (seconds)\n")
3396 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3398 bgp
->rib_stale_time
= BGP_DEFAULT_RIB_STALE_TIME
;
3399 /* Send the stale timer update message to RIB */
3400 if (bgp_zebra_stale_timer_update(bgp
))
3406 DEFUN(bgp_llgr_stalepath_time
, bgp_llgr_stalepath_time_cmd
,
3407 "bgp long-lived-graceful-restart stale-time (1-4294967295)",
3409 "Enable Long-lived Graceful Restart\n"
3410 "Specifies maximum time to wait before purging long-lived stale routes\n"
3411 "Stale time value (seconds)\n")
3413 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3415 uint32_t llgr_stale_time
;
3417 llgr_stale_time
= strtoul(argv
[3]->arg
, NULL
, 10);
3418 bgp
->llgr_stale_time
= llgr_stale_time
;
3423 DEFUN(no_bgp_llgr_stalepath_time
, no_bgp_llgr_stalepath_time_cmd
,
3424 "no bgp long-lived-graceful-restart stale-time [(1-4294967295)]",
3426 "Enable Long-lived Graceful Restart\n"
3427 "Specifies maximum time to wait before purging long-lived stale routes\n"
3428 "Stale time value (seconds)\n")
3430 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3432 bgp
->llgr_stale_time
= BGP_DEFAULT_LLGR_STALE_TIME
;
3437 static inline void bgp_initiate_graceful_shut_unshut(struct vty
*vty
,
3440 bgp_static_redo_import_check(bgp
);
3441 bgp_redistribute_redo(bgp
);
3442 bgp_clear_star_soft_out(vty
, bgp
->name
);
3443 bgp_clear_star_soft_in(vty
, bgp
->name
);
3446 static int bgp_global_graceful_shutdown_config_vty(struct vty
*vty
)
3448 struct listnode
*node
, *nnode
;
3450 bool vrf_cfg
= false;
3452 if (CHECK_FLAG(bm
->flags
, BM_FLAG_GRACEFUL_SHUTDOWN
))
3455 /* See if graceful-shutdown is set per-vrf and warn user to delete */
3456 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
3457 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_GRACEFUL_SHUTDOWN
)) {
3459 "%% graceful-shutdown configuration found in vrf %s\n",
3460 bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
?
3461 VRF_DEFAULT_NAME
: bgp
->name
);
3468 "%%Failed: global graceful-shutdown not permitted\n");
3472 /* Set flag globally */
3473 SET_FLAG(bm
->flags
, BM_FLAG_GRACEFUL_SHUTDOWN
);
3475 /* Initiate processing for all BGP instances. */
3476 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
))
3477 bgp_initiate_graceful_shut_unshut(vty
, bgp
);
3482 static int bgp_global_graceful_shutdown_deconfig_vty(struct vty
*vty
)
3484 struct listnode
*node
, *nnode
;
3487 if (!CHECK_FLAG(bm
->flags
, BM_FLAG_GRACEFUL_SHUTDOWN
))
3490 /* Unset flag globally */
3491 UNSET_FLAG(bm
->flags
, BM_FLAG_GRACEFUL_SHUTDOWN
);
3493 /* Initiate processing for all BGP instances. */
3494 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
))
3495 bgp_initiate_graceful_shut_unshut(vty
, bgp
);
3500 /* "bgp graceful-shutdown" configuration */
3501 DEFUN (bgp_graceful_shutdown
,
3502 bgp_graceful_shutdown_cmd
,
3503 "bgp graceful-shutdown",
3505 "Graceful shutdown parameters\n")
3507 if (vty
->node
== CONFIG_NODE
)
3508 return bgp_global_graceful_shutdown_config_vty(vty
);
3510 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3512 /* if configured globally, per-instance config is not allowed */
3513 if (CHECK_FLAG(bm
->flags
, BM_FLAG_GRACEFUL_SHUTDOWN
)) {
3515 "%%Failed: per-vrf graceful-shutdown config not permitted with global graceful-shutdown\n");
3516 return CMD_WARNING_CONFIG_FAILED
;
3519 if (!CHECK_FLAG(bgp
->flags
, BGP_FLAG_GRACEFUL_SHUTDOWN
)) {
3520 SET_FLAG(bgp
->flags
, BGP_FLAG_GRACEFUL_SHUTDOWN
);
3521 bgp_initiate_graceful_shut_unshut(vty
, bgp
);
3527 DEFUN (no_bgp_graceful_shutdown
,
3528 no_bgp_graceful_shutdown_cmd
,
3529 "no bgp graceful-shutdown",
3532 "Graceful shutdown parameters\n")
3534 if (vty
->node
== CONFIG_NODE
)
3535 return bgp_global_graceful_shutdown_deconfig_vty(vty
);
3537 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3539 /* If configured globally, cannot remove from one bgp instance */
3540 if (CHECK_FLAG(bm
->flags
, BM_FLAG_GRACEFUL_SHUTDOWN
)) {
3542 "%%Failed: bgp graceful-shutdown configured globally. Delete per-vrf not permitted\n");
3543 return CMD_WARNING_CONFIG_FAILED
;
3546 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_GRACEFUL_SHUTDOWN
)) {
3547 UNSET_FLAG(bgp
->flags
, BGP_FLAG_GRACEFUL_SHUTDOWN
);
3548 bgp_initiate_graceful_shut_unshut(vty
, bgp
);
3554 /* "bgp fast-external-failover" configuration. */
3555 DEFUN (bgp_fast_external_failover
,
3556 bgp_fast_external_failover_cmd
,
3557 "bgp fast-external-failover",
3559 "Immediately reset session if a link to a directly connected external peer goes down\n")
3561 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3562 UNSET_FLAG(bgp
->flags
, BGP_FLAG_NO_FAST_EXT_FAILOVER
);
3566 DEFUN (no_bgp_fast_external_failover
,
3567 no_bgp_fast_external_failover_cmd
,
3568 "no bgp fast-external-failover",
3571 "Immediately reset session if a link to a directly connected external peer goes down\n")
3573 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3574 SET_FLAG(bgp
->flags
, BGP_FLAG_NO_FAST_EXT_FAILOVER
);
3578 /* "bgp bestpath compare-routerid" configuration. */
3579 DEFUN (bgp_bestpath_compare_router_id
,
3580 bgp_bestpath_compare_router_id_cmd
,
3581 "bgp bestpath compare-routerid",
3583 "Change the default bestpath selection\n"
3584 "Compare router-id for identical EBGP paths\n")
3586 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3587 SET_FLAG(bgp
->flags
, BGP_FLAG_COMPARE_ROUTER_ID
);
3588 bgp_recalculate_all_bestpaths(bgp
);
3593 DEFUN (no_bgp_bestpath_compare_router_id
,
3594 no_bgp_bestpath_compare_router_id_cmd
,
3595 "no bgp bestpath compare-routerid",
3598 "Change the default bestpath selection\n"
3599 "Compare router-id for identical EBGP paths\n")
3601 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3602 UNSET_FLAG(bgp
->flags
, BGP_FLAG_COMPARE_ROUTER_ID
);
3603 bgp_recalculate_all_bestpaths(bgp
);
3608 /* "bgp bestpath as-path ignore" configuration. */
3609 DEFUN (bgp_bestpath_aspath_ignore
,
3610 bgp_bestpath_aspath_ignore_cmd
,
3611 "bgp bestpath as-path ignore",
3613 "Change the default bestpath selection\n"
3614 "AS-path attribute\n"
3615 "Ignore as-path length in selecting a route\n")
3617 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3618 SET_FLAG(bgp
->flags
, BGP_FLAG_ASPATH_IGNORE
);
3619 bgp_recalculate_all_bestpaths(bgp
);
3624 DEFUN (no_bgp_bestpath_aspath_ignore
,
3625 no_bgp_bestpath_aspath_ignore_cmd
,
3626 "no bgp bestpath as-path ignore",
3629 "Change the default bestpath selection\n"
3630 "AS-path attribute\n"
3631 "Ignore as-path length in selecting a route\n")
3633 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3634 UNSET_FLAG(bgp
->flags
, BGP_FLAG_ASPATH_IGNORE
);
3635 bgp_recalculate_all_bestpaths(bgp
);
3640 /* "bgp bestpath as-path confed" configuration. */
3641 DEFUN (bgp_bestpath_aspath_confed
,
3642 bgp_bestpath_aspath_confed_cmd
,
3643 "bgp bestpath as-path confed",
3645 "Change the default bestpath selection\n"
3646 "AS-path attribute\n"
3647 "Compare path lengths including confederation sets & sequences in selecting a route\n")
3649 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3650 SET_FLAG(bgp
->flags
, BGP_FLAG_ASPATH_CONFED
);
3651 bgp_recalculate_all_bestpaths(bgp
);
3656 DEFUN (no_bgp_bestpath_aspath_confed
,
3657 no_bgp_bestpath_aspath_confed_cmd
,
3658 "no bgp bestpath as-path confed",
3661 "Change the default bestpath selection\n"
3662 "AS-path attribute\n"
3663 "Compare path lengths including confederation sets & sequences in selecting a route\n")
3665 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3666 UNSET_FLAG(bgp
->flags
, BGP_FLAG_ASPATH_CONFED
);
3667 bgp_recalculate_all_bestpaths(bgp
);
3672 /* "bgp bestpath as-path multipath-relax" configuration. */
3673 DEFUN (bgp_bestpath_aspath_multipath_relax
,
3674 bgp_bestpath_aspath_multipath_relax_cmd
,
3675 "bgp bestpath as-path multipath-relax [<as-set|no-as-set>]",
3677 "Change the default bestpath selection\n"
3678 "AS-path attribute\n"
3679 "Allow load sharing across routes that have different AS paths (but same length)\n"
3680 "Generate an AS_SET\n"
3681 "Do not generate an AS_SET\n")
3683 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3685 SET_FLAG(bgp
->flags
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
);
3687 /* no-as-set is now the default behavior so we can silently
3689 if (argv_find(argv
, argc
, "as-set", &idx
))
3690 SET_FLAG(bgp
->flags
, BGP_FLAG_MULTIPATH_RELAX_AS_SET
);
3692 UNSET_FLAG(bgp
->flags
, BGP_FLAG_MULTIPATH_RELAX_AS_SET
);
3694 bgp_recalculate_all_bestpaths(bgp
);
3699 DEFUN (no_bgp_bestpath_aspath_multipath_relax
,
3700 no_bgp_bestpath_aspath_multipath_relax_cmd
,
3701 "no bgp bestpath as-path multipath-relax [<as-set|no-as-set>]",
3704 "Change the default bestpath selection\n"
3705 "AS-path attribute\n"
3706 "Allow load sharing across routes that have different AS paths (but same length)\n"
3707 "Generate an AS_SET\n"
3708 "Do not generate an AS_SET\n")
3710 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3711 UNSET_FLAG(bgp
->flags
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
);
3712 UNSET_FLAG(bgp
->flags
, BGP_FLAG_MULTIPATH_RELAX_AS_SET
);
3713 bgp_recalculate_all_bestpaths(bgp
);
3718 /* "bgp bestpath peer-type multipath-relax" configuration. */
3719 DEFUN(bgp_bestpath_peer_type_multipath_relax
,
3720 bgp_bestpath_peer_type_multipath_relax_cmd
,
3721 "bgp bestpath peer-type multipath-relax",
3723 "Change the default bestpath selection\n"
3725 "Allow load sharing across routes learned from different peer types\n")
3727 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3728 SET_FLAG(bgp
->flags
, BGP_FLAG_PEERTYPE_MULTIPATH_RELAX
);
3729 bgp_recalculate_all_bestpaths(bgp
);
3734 DEFUN(no_bgp_bestpath_peer_type_multipath_relax
,
3735 no_bgp_bestpath_peer_type_multipath_relax_cmd
,
3736 "no bgp bestpath peer-type multipath-relax",
3738 "Change the default bestpath selection\n"
3740 "Allow load sharing across routes learned from different peer types\n")
3742 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3743 UNSET_FLAG(bgp
->flags
, BGP_FLAG_PEERTYPE_MULTIPATH_RELAX
);
3744 bgp_recalculate_all_bestpaths(bgp
);
3749 /* "bgp log-neighbor-changes" configuration. */
3750 DEFUN (bgp_log_neighbor_changes
,
3751 bgp_log_neighbor_changes_cmd
,
3752 "bgp log-neighbor-changes",
3754 "Log neighbor up/down and reset reason\n")
3756 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3757 SET_FLAG(bgp
->flags
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
);
3761 DEFUN (no_bgp_log_neighbor_changes
,
3762 no_bgp_log_neighbor_changes_cmd
,
3763 "no bgp log-neighbor-changes",
3766 "Log neighbor up/down and reset reason\n")
3768 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3769 UNSET_FLAG(bgp
->flags
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
);
3773 /* "bgp bestpath med" configuration. */
3774 DEFUN (bgp_bestpath_med
,
3775 bgp_bestpath_med_cmd
,
3776 "bgp bestpath med <confed [missing-as-worst]|missing-as-worst [confed]>",
3778 "Change the default bestpath selection\n"
3780 "Compare MED among confederation paths\n"
3781 "Treat missing MED as the least preferred one\n"
3782 "Treat missing MED as the least preferred one\n"
3783 "Compare MED among confederation paths\n")
3785 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3788 if (argv_find(argv
, argc
, "confed", &idx
))
3789 SET_FLAG(bgp
->flags
, BGP_FLAG_MED_CONFED
);
3791 if (argv_find(argv
, argc
, "missing-as-worst", &idx
))
3792 SET_FLAG(bgp
->flags
, BGP_FLAG_MED_MISSING_AS_WORST
);
3794 bgp_recalculate_all_bestpaths(bgp
);
3799 DEFUN (no_bgp_bestpath_med
,
3800 no_bgp_bestpath_med_cmd
,
3801 "no bgp bestpath med <confed [missing-as-worst]|missing-as-worst [confed]>",
3804 "Change the default bestpath selection\n"
3806 "Compare MED among confederation paths\n"
3807 "Treat missing MED as the least preferred one\n"
3808 "Treat missing MED as the least preferred one\n"
3809 "Compare MED among confederation paths\n")
3811 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3814 if (argv_find(argv
, argc
, "confed", &idx
))
3815 UNSET_FLAG(bgp
->flags
, BGP_FLAG_MED_CONFED
);
3817 if (argv_find(argv
, argc
, "missing-as-worst", &idx
))
3818 UNSET_FLAG(bgp
->flags
, BGP_FLAG_MED_MISSING_AS_WORST
);
3820 bgp_recalculate_all_bestpaths(bgp
);
3825 /* "bgp bestpath bandwidth" configuration. */
3826 DEFPY (bgp_bestpath_bw
,
3827 bgp_bestpath_bw_cmd
,
3828 "bgp bestpath bandwidth <ignore|skip-missing|default-weight-for-missing>$bw_cfg",
3830 "Change the default bestpath selection\n"
3831 "Link Bandwidth attribute\n"
3832 "Ignore link bandwidth (i.e., do regular ECMP, not weighted)\n"
3833 "Ignore paths without link bandwidth for ECMP (if other paths have it)\n"
3834 "Assign a low default weight (value 1) to paths not having link bandwidth\n")
3836 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3841 vty_out(vty
, "%% Bandwidth configuration must be specified\n");
3842 return CMD_ERR_INCOMPLETE
;
3844 if (!strcmp(bw_cfg
, "ignore"))
3845 bgp
->lb_handling
= BGP_LINK_BW_IGNORE_BW
;
3846 else if (!strcmp(bw_cfg
, "skip-missing"))
3847 bgp
->lb_handling
= BGP_LINK_BW_SKIP_MISSING
;
3848 else if (!strcmp(bw_cfg
, "default-weight-for-missing"))
3849 bgp
->lb_handling
= BGP_LINK_BW_DEFWT_4_MISSING
;
3851 return CMD_ERR_NO_MATCH
;
3853 /* This config is used in route install, so redo that. */
3854 FOREACH_AFI_SAFI (afi
, safi
) {
3855 if (!bgp_fibupd_safi(safi
))
3857 bgp_zebra_announce_table(bgp
, afi
, safi
);
3863 DEFPY (no_bgp_bestpath_bw
,
3864 no_bgp_bestpath_bw_cmd
,
3865 "no bgp bestpath bandwidth [<ignore|skip-missing|default-weight-for-missing>$bw_cfg]",
3868 "Change the default bestpath selection\n"
3869 "Link Bandwidth attribute\n"
3870 "Ignore link bandwidth (i.e., do regular ECMP, not weighted)\n"
3871 "Ignore paths without link bandwidth for ECMP (if other paths have it)\n"
3872 "Assign a low default weight (value 1) to paths not having link bandwidth\n")
3874 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3878 bgp
->lb_handling
= BGP_LINK_BW_ECMP
;
3880 /* This config is used in route install, so redo that. */
3881 FOREACH_AFI_SAFI (afi
, safi
) {
3882 if (!bgp_fibupd_safi(safi
))
3884 bgp_zebra_announce_table(bgp
, afi
, safi
);
3889 DEFPY(bgp_default_afi_safi
, bgp_default_afi_safi_cmd
,
3890 "[no] bgp default <ipv4-unicast|"
3893 "ipv4-labeled-unicast|"
3898 "ipv6-labeled-unicast|"
3900 "l2vpn-evpn>$afi_safi",
3903 "Configure BGP defaults\n"
3904 "Activate ipv4-unicast for a peer by default\n"
3905 "Activate ipv4-multicast for a peer by default\n"
3906 "Activate ipv4-vpn for a peer by default\n"
3907 "Activate ipv4-labeled-unicast for a peer by default\n"
3908 "Activate ipv4-flowspec for a peer by default\n"
3909 "Activate ipv6-unicast for a peer by default\n"
3910 "Activate ipv6-multicast for a peer by default\n"
3911 "Activate ipv6-vpn for a peer by default\n"
3912 "Activate ipv6-labeled-unicast for a peer by default\n"
3913 "Activate ipv6-flowspec for a peer by default\n"
3914 "Activate l2vpn-evpn for a peer by default\n")
3916 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3917 char afi_safi_str
[strlen(afi_safi
) + 1];
3918 char *afi_safi_str_tok
;
3920 strlcpy(afi_safi_str
, afi_safi
, sizeof(afi_safi_str
));
3921 char *afi_str
= strtok_r(afi_safi_str
, "-", &afi_safi_str_tok
);
3922 char *safi_str
= strtok_r(NULL
, "-", &afi_safi_str_tok
);
3923 afi_t afi
= bgp_vty_afi_from_str(afi_str
);
3927 * Impossible situation but making coverity happy
3929 assert(afi
!= AFI_MAX
);
3931 if (strmatch(safi_str
, "labeled"))
3932 safi
= bgp_vty_safi_from_str("labeled-unicast");
3934 safi
= bgp_vty_safi_from_str(safi_str
);
3936 assert(safi
!= SAFI_MAX
);
3938 bgp
->default_af
[afi
][safi
] = false;
3940 if ((safi
== SAFI_LABELED_UNICAST
3941 && bgp
->default_af
[afi
][SAFI_UNICAST
])
3942 || (safi
== SAFI_UNICAST
3943 && bgp
->default_af
[afi
][SAFI_LABELED_UNICAST
]))
3944 bgp_vty_return(vty
, BGP_ERR_PEER_SAFI_CONFLICT
);
3946 bgp
->default_af
[afi
][safi
] = true;
3952 /* Display hostname in certain command outputs */
3953 DEFUN (bgp_default_show_hostname
,
3954 bgp_default_show_hostname_cmd
,
3955 "bgp default show-hostname",
3957 "Configure BGP defaults\n"
3958 "Show hostname in certain command outputs\n")
3960 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3961 SET_FLAG(bgp
->flags
, BGP_FLAG_SHOW_HOSTNAME
);
3965 DEFUN (no_bgp_default_show_hostname
,
3966 no_bgp_default_show_hostname_cmd
,
3967 "no bgp default show-hostname",
3970 "Configure BGP defaults\n"
3971 "Show hostname in certain command outputs\n")
3973 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3974 UNSET_FLAG(bgp
->flags
, BGP_FLAG_SHOW_HOSTNAME
);
3978 /* Display hostname in certain command outputs */
3979 DEFUN (bgp_default_show_nexthop_hostname
,
3980 bgp_default_show_nexthop_hostname_cmd
,
3981 "bgp default show-nexthop-hostname",
3983 "Configure BGP defaults\n"
3984 "Show hostname for nexthop in certain command outputs\n")
3986 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3987 SET_FLAG(bgp
->flags
, BGP_FLAG_SHOW_NEXTHOP_HOSTNAME
);
3991 DEFUN (no_bgp_default_show_nexthop_hostname
,
3992 no_bgp_default_show_nexthop_hostname_cmd
,
3993 "no bgp default show-nexthop-hostname",
3996 "Configure BGP defaults\n"
3997 "Show hostname for nexthop in certain command outputs\n")
3999 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4000 UNSET_FLAG(bgp
->flags
, BGP_FLAG_SHOW_NEXTHOP_HOSTNAME
);
4004 /* "bgp network import-check" configuration. */
4005 DEFUN (bgp_network_import_check
,
4006 bgp_network_import_check_cmd
,
4007 "bgp network import-check",
4009 "BGP network command\n"
4010 "Check BGP network route exists in IGP\n")
4012 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4013 if (!CHECK_FLAG(bgp
->flags
, BGP_FLAG_IMPORT_CHECK
)) {
4014 SET_FLAG(bgp
->flags
, BGP_FLAG_IMPORT_CHECK
);
4015 bgp_static_redo_import_check(bgp
);
4021 ALIAS_HIDDEN(bgp_network_import_check
, bgp_network_import_check_exact_cmd
,
4022 "bgp network import-check exact",
4024 "BGP network command\n"
4025 "Check BGP network route exists in IGP\n"
4026 "Match route precisely\n")
4028 DEFUN (no_bgp_network_import_check
,
4029 no_bgp_network_import_check_cmd
,
4030 "no bgp network import-check",
4033 "BGP network command\n"
4034 "Check BGP network route exists in IGP\n")
4036 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4037 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_IMPORT_CHECK
)) {
4038 UNSET_FLAG(bgp
->flags
, BGP_FLAG_IMPORT_CHECK
);
4039 bgp_static_redo_import_check(bgp
);
4045 DEFUN (bgp_default_local_preference
,
4046 bgp_default_local_preference_cmd
,
4047 "bgp default local-preference (0-4294967295)",
4049 "Configure BGP defaults\n"
4050 "local preference (higher=more preferred)\n"
4051 "Configure default local preference value\n")
4053 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4055 uint32_t local_pref
;
4057 local_pref
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
4059 bgp_default_local_preference_set(bgp
, local_pref
);
4060 bgp_clear_star_soft_in(vty
, bgp
->name
);
4065 DEFUN (no_bgp_default_local_preference
,
4066 no_bgp_default_local_preference_cmd
,
4067 "no bgp default local-preference [(0-4294967295)]",
4070 "Configure BGP defaults\n"
4071 "local preference (higher=more preferred)\n"
4072 "Configure default local preference value\n")
4074 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4075 bgp_default_local_preference_unset(bgp
);
4076 bgp_clear_star_soft_in(vty
, bgp
->name
);
4082 DEFUN (bgp_default_subgroup_pkt_queue_max
,
4083 bgp_default_subgroup_pkt_queue_max_cmd
,
4084 "bgp default subgroup-pkt-queue-max (20-100)",
4086 "Configure BGP defaults\n"
4087 "subgroup-pkt-queue-max\n"
4088 "Configure subgroup packet queue max\n")
4090 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4094 max_size
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
4096 bgp_default_subgroup_pkt_queue_max_set(bgp
, max_size
);
4101 DEFUN (no_bgp_default_subgroup_pkt_queue_max
,
4102 no_bgp_default_subgroup_pkt_queue_max_cmd
,
4103 "no bgp default subgroup-pkt-queue-max [(20-100)]",
4106 "Configure BGP defaults\n"
4107 "subgroup-pkt-queue-max\n"
4108 "Configure subgroup packet queue max\n")
4110 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4111 bgp_default_subgroup_pkt_queue_max_unset(bgp
);
4116 DEFUN (bgp_rr_allow_outbound_policy
,
4117 bgp_rr_allow_outbound_policy_cmd
,
4118 "bgp route-reflector allow-outbound-policy",
4120 "Allow modifications made by out route-map\n"
4121 "on ibgp neighbors\n")
4123 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4125 if (!CHECK_FLAG(bgp
->flags
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
)) {
4126 SET_FLAG(bgp
->flags
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
);
4127 update_group_announce_rrclients(bgp
);
4128 bgp_clear_star_soft_out(vty
, bgp
->name
);
4134 DEFUN (no_bgp_rr_allow_outbound_policy
,
4135 no_bgp_rr_allow_outbound_policy_cmd
,
4136 "no bgp route-reflector allow-outbound-policy",
4139 "Allow modifications made by out route-map\n"
4140 "on ibgp neighbors\n")
4142 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4144 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
)) {
4145 UNSET_FLAG(bgp
->flags
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
);
4146 update_group_announce_rrclients(bgp
);
4147 bgp_clear_star_soft_out(vty
, bgp
->name
);
4153 DEFUN (bgp_listen_limit
,
4154 bgp_listen_limit_cmd
,
4155 "bgp listen limit (1-65535)",
4157 "BGP Dynamic Neighbors listen commands\n"
4158 "Maximum number of BGP Dynamic Neighbors that can be created\n"
4159 "Configure Dynamic Neighbors listen limit value\n")
4161 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4165 listen_limit
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
4167 bgp_listen_limit_set(bgp
, listen_limit
);
4172 DEFUN (no_bgp_listen_limit
,
4173 no_bgp_listen_limit_cmd
,
4174 "no bgp listen limit [(1-65535)]",
4177 "BGP Dynamic Neighbors listen commands\n"
4178 "Maximum number of BGP Dynamic Neighbors that can be created\n"
4179 "Configure Dynamic Neighbors listen limit value\n")
4181 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4182 bgp_listen_limit_unset(bgp
);
4188 * Check if this listen range is already configured. Check for exact
4189 * match or overlap based on input.
4191 static struct peer_group
*listen_range_exists(struct bgp
*bgp
,
4192 struct prefix
*range
, int exact
)
4194 struct listnode
*node
, *nnode
;
4195 struct listnode
*node1
, *nnode1
;
4196 struct peer_group
*group
;
4201 afi
= family2afi(range
->family
);
4202 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
4203 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], node1
, nnode1
,
4206 match
= prefix_same(range
, lr
);
4208 match
= (prefix_match(range
, lr
)
4209 || prefix_match(lr
, range
));
4218 DEFUN (bgp_listen_range
,
4219 bgp_listen_range_cmd
,
4220 "bgp listen range <A.B.C.D/M|X:X::X:X/M> peer-group PGNAME",
4222 "Configure BGP dynamic neighbors listen range\n"
4223 "Configure BGP dynamic neighbors listen range\n"
4225 "Member of the peer-group\n"
4226 "Peer-group name\n")
4228 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4229 struct prefix range
;
4230 struct peer_group
*group
, *existing_group
;
4235 argv_find(argv
, argc
, "A.B.C.D/M", &idx
);
4236 argv_find(argv
, argc
, "X:X::X:X/M", &idx
);
4237 char *prefix
= argv
[idx
]->arg
;
4238 argv_find(argv
, argc
, "PGNAME", &idx
);
4239 char *peergroup
= argv
[idx
]->arg
;
4241 /* Convert IP prefix string to struct prefix. */
4242 ret
= str2prefix(prefix
, &range
);
4244 vty_out(vty
, "%% Malformed listen range\n");
4245 return CMD_WARNING_CONFIG_FAILED
;
4248 afi
= family2afi(range
.family
);
4250 if (afi
== AFI_IP6
&& IN6_IS_ADDR_LINKLOCAL(&range
.u
.prefix6
)) {
4252 "%% Malformed listen range (link-local address)\n");
4253 return CMD_WARNING_CONFIG_FAILED
;
4258 /* Check if same listen range is already configured. */
4259 existing_group
= listen_range_exists(bgp
, &range
, 1);
4260 if (existing_group
) {
4261 if (strcmp(existing_group
->name
, peergroup
) == 0)
4265 "%% Same listen range is attached to peer-group %s\n",
4266 existing_group
->name
);
4267 return CMD_WARNING_CONFIG_FAILED
;
4271 /* Check if an overlapping listen range exists. */
4272 if (listen_range_exists(bgp
, &range
, 0)) {
4274 "%% Listen range overlaps with existing listen range\n");
4275 return CMD_WARNING_CONFIG_FAILED
;
4278 group
= peer_group_lookup(bgp
, peergroup
);
4280 vty_out(vty
, "%% Configure the peer-group first\n");
4281 return CMD_WARNING_CONFIG_FAILED
;
4284 ret
= peer_group_listen_range_add(group
, &range
);
4285 return bgp_vty_return(vty
, ret
);
4288 DEFUN (no_bgp_listen_range
,
4289 no_bgp_listen_range_cmd
,
4290 "no bgp listen range <A.B.C.D/M|X:X::X:X/M> peer-group PGNAME",
4293 "Unconfigure BGP dynamic neighbors listen range\n"
4294 "Unconfigure BGP dynamic neighbors listen range\n"
4296 "Member of the peer-group\n"
4297 "Peer-group name\n")
4299 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4300 struct prefix range
;
4301 struct peer_group
*group
;
4306 argv_find(argv
, argc
, "A.B.C.D/M", &idx
);
4307 argv_find(argv
, argc
, "X:X::X:X/M", &idx
);
4308 char *prefix
= argv
[idx
]->arg
;
4309 argv_find(argv
, argc
, "PGNAME", &idx
);
4310 char *peergroup
= argv
[idx
]->arg
;
4312 /* Convert IP prefix string to struct prefix. */
4313 ret
= str2prefix(prefix
, &range
);
4315 vty_out(vty
, "%% Malformed listen range\n");
4316 return CMD_WARNING_CONFIG_FAILED
;
4319 afi
= family2afi(range
.family
);
4321 if (afi
== AFI_IP6
&& IN6_IS_ADDR_LINKLOCAL(&range
.u
.prefix6
)) {
4323 "%% Malformed listen range (link-local address)\n");
4324 return CMD_WARNING_CONFIG_FAILED
;
4329 group
= peer_group_lookup(bgp
, peergroup
);
4331 vty_out(vty
, "%% Peer-group does not exist\n");
4332 return CMD_WARNING_CONFIG_FAILED
;
4335 ret
= peer_group_listen_range_del(group
, &range
);
4336 return bgp_vty_return(vty
, ret
);
4339 void bgp_config_write_listen(struct vty
*vty
, struct bgp
*bgp
)
4341 struct peer_group
*group
;
4342 struct listnode
*node
, *nnode
, *rnode
, *nrnode
;
4343 struct prefix
*range
;
4346 if (bgp
->dynamic_neighbors_limit
!= BGP_DYNAMIC_NEIGHBORS_LIMIT_DEFAULT
)
4347 vty_out(vty
, " bgp listen limit %d\n",
4348 bgp
->dynamic_neighbors_limit
);
4350 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
4351 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++) {
4352 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], rnode
,
4355 " bgp listen range %pFX peer-group %s\n",
4356 range
, group
->name
);
4363 DEFUN (bgp_disable_connected_route_check
,
4364 bgp_disable_connected_route_check_cmd
,
4365 "bgp disable-ebgp-connected-route-check",
4367 "Disable checking if nexthop is connected on ebgp sessions\n")
4369 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4370 SET_FLAG(bgp
->flags
, BGP_FLAG_DISABLE_NH_CONNECTED_CHK
);
4371 bgp_clear_star_soft_in(vty
, bgp
->name
);
4376 DEFUN (no_bgp_disable_connected_route_check
,
4377 no_bgp_disable_connected_route_check_cmd
,
4378 "no bgp disable-ebgp-connected-route-check",
4381 "Disable checking if nexthop is connected on ebgp sessions\n")
4383 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4384 UNSET_FLAG(bgp
->flags
, BGP_FLAG_DISABLE_NH_CONNECTED_CHK
);
4385 bgp_clear_star_soft_in(vty
, bgp
->name
);
4391 static int peer_remote_as_vty(struct vty
*vty
, const char *peer_str
,
4394 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4397 int as_type
= AS_SPECIFIED
;
4400 if (as_str
[0] == 'i') {
4402 as_type
= AS_INTERNAL
;
4403 } else if (as_str
[0] == 'e') {
4405 as_type
= AS_EXTERNAL
;
4407 /* Get AS number. */
4408 as
= strtoul(as_str
, NULL
, 10);
4411 /* If peer is peer group or interface peer, call proper function. */
4412 ret
= str2sockunion(peer_str
, &su
);
4416 /* Check if existing interface peer */
4417 peer
= peer_lookup_by_conf_if(bgp
, peer_str
);
4419 ret
= peer_remote_as(bgp
, NULL
, peer_str
, &as
, as_type
);
4421 /* if not interface peer, check peer-group settings */
4422 if (ret
< 0 && !peer
) {
4423 ret
= peer_group_remote_as(bgp
, peer_str
, &as
, as_type
);
4426 "%% Create the peer-group or interface first\n");
4427 return CMD_WARNING_CONFIG_FAILED
;
4432 if (peer_address_self_check(bgp
, &su
)) {
4434 "%% Can not configure the local system as neighbor\n");
4435 return CMD_WARNING_CONFIG_FAILED
;
4437 ret
= peer_remote_as(bgp
, &su
, NULL
, &as
, as_type
);
4440 return bgp_vty_return(vty
, ret
);
4443 DEFUN (bgp_default_shutdown
,
4444 bgp_default_shutdown_cmd
,
4445 "[no] bgp default shutdown",
4448 "Configure BGP defaults\n"
4449 "Apply administrative shutdown to newly configured peers\n")
4451 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4452 bgp
->autoshutdown
= !strmatch(argv
[0]->text
, "no");
4456 DEFPY(bgp_shutdown_msg
, bgp_shutdown_msg_cmd
, "bgp shutdown message MSG...",
4458 "Administrative shutdown of the BGP instance\n"
4459 "Add a shutdown message (RFC 8203)\n"
4460 "Shutdown message\n")
4462 char *msgstr
= NULL
;
4464 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4467 msgstr
= argv_concat(argv
, argc
, 3);
4469 if (msgstr
&& strlen(msgstr
) > BGP_ADMIN_SHUTDOWN_MSG_LEN
) {
4470 vty_out(vty
, "%% Shutdown message size exceeded %d\n",
4471 BGP_ADMIN_SHUTDOWN_MSG_LEN
);
4472 return CMD_WARNING_CONFIG_FAILED
;
4475 bgp_shutdown_enable(bgp
, msgstr
);
4476 XFREE(MTYPE_TMP
, msgstr
);
4481 DEFPY(bgp_shutdown
, bgp_shutdown_cmd
, "bgp shutdown",
4482 BGP_STR
"Administrative shutdown of the BGP instance\n")
4484 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4486 bgp_shutdown_enable(bgp
, NULL
);
4491 DEFPY(no_bgp_shutdown
, no_bgp_shutdown_cmd
, "no bgp shutdown",
4492 NO_STR BGP_STR
"Administrative shutdown of the BGP instance\n")
4494 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4496 bgp_shutdown_disable(bgp
);
4501 ALIAS(no_bgp_shutdown
, no_bgp_shutdown_msg_cmd
,
4502 "no bgp shutdown message MSG...", NO_STR BGP_STR
4503 "Administrative shutdown of the BGP instance\n"
4504 "Add a shutdown message (RFC 8203)\n" "Shutdown message\n")
4506 DEFUN (neighbor_remote_as
,
4507 neighbor_remote_as_cmd
,
4508 "neighbor <A.B.C.D|X:X::X:X|WORD> remote-as <(1-4294967295)|internal|external>",
4511 "Specify a BGP neighbor\n"
4513 "Internal BGP peer\n"
4514 "External BGP peer\n")
4517 int idx_remote_as
= 3;
4518 return peer_remote_as_vty(vty
, argv
[idx_peer
]->arg
,
4519 argv
[idx_remote_as
]->arg
);
4522 DEFPY (bgp_allow_martian
,
4523 bgp_allow_martian_cmd
,
4524 "[no]$no bgp allow-martian-nexthop",
4527 "Allow Martian nexthops to be received in the NLRI from a peer\n")
4529 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4532 bgp
->allow_martian
= false;
4534 bgp
->allow_martian
= true;
4539 /* Enable fast convergence of bgp sessions. If this is enabled, bgp
4540 * sessions do not wait for hold timer expiry to bring down the sessions
4541 * when nexthop becomes unreachable
4543 DEFUN(bgp_fast_convergence
, bgp_fast_convergence_cmd
, "bgp fast-convergence",
4544 BGP_STR
"Fast convergence for bgp sessions\n")
4546 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4547 bgp
->fast_convergence
= true;
4552 DEFUN(no_bgp_fast_convergence
, no_bgp_fast_convergence_cmd
,
4553 "no bgp fast-convergence",
4554 NO_STR BGP_STR
"Fast convergence for bgp sessions\n")
4556 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4557 bgp
->fast_convergence
= false;
4562 static int peer_conf_interface_get(struct vty
*vty
, const char *conf_if
,
4564 const char *peer_group_name
,
4567 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4569 int as_type
= AS_UNSPECIFIED
;
4571 struct peer_group
*group
;
4574 group
= peer_group_lookup(bgp
, conf_if
);
4577 vty_out(vty
, "%% Name conflict with peer-group \n");
4578 return CMD_WARNING_CONFIG_FAILED
;
4582 if (as_str
[0] == 'i') {
4583 as_type
= AS_INTERNAL
;
4584 } else if (as_str
[0] == 'e') {
4585 as_type
= AS_EXTERNAL
;
4587 /* Get AS number. */
4588 as
= strtoul(as_str
, NULL
, 10);
4589 as_type
= AS_SPECIFIED
;
4593 peer
= peer_lookup_by_conf_if(bgp
, conf_if
);
4596 ret
= peer_remote_as(bgp
, NULL
, conf_if
, &as
, as_type
);
4598 peer
= peer_create(NULL
, conf_if
, bgp
, bgp
->as
, as
, as_type
,
4602 vty_out(vty
, "%% BGP failed to create peer\n");
4603 return CMD_WARNING_CONFIG_FAILED
;
4607 peer_flag_set(peer
, PEER_FLAG_IFPEER_V6ONLY
);
4609 /* Request zebra to initiate IPv6 RAs on this interface. We do
4611 * any unnumbered peer in order to not worry about run-time
4613 * (e.g., peering is initially IPv4, but the IPv4 /30 or /31
4615 * gets deleted later etc.)
4618 bgp_zebra_initiate_radv(bgp
, peer
);
4621 if ((v6only
&& !CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
))
4622 || (!v6only
&& CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
))) {
4624 peer_flag_set(peer
, PEER_FLAG_IFPEER_V6ONLY
);
4626 peer_flag_unset(peer
, PEER_FLAG_IFPEER_V6ONLY
);
4628 /* v6only flag changed. Reset bgp seesion */
4629 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
4630 peer
->last_reset
= PEER_DOWN_V6ONLY_CHANGE
;
4631 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
4632 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
4634 bgp_session_reset(peer
);
4637 if (!CHECK_FLAG(peer
->flags_invert
, PEER_FLAG_CAPABILITY_ENHE
)) {
4638 SET_FLAG(peer
->flags
, PEER_FLAG_CAPABILITY_ENHE
);
4639 SET_FLAG(peer
->flags_invert
, PEER_FLAG_CAPABILITY_ENHE
);
4640 SET_FLAG(peer
->flags_override
, PEER_FLAG_CAPABILITY_ENHE
);
4643 if (peer_group_name
) {
4644 group
= peer_group_lookup(bgp
, peer_group_name
);
4646 vty_out(vty
, "%% Configure the peer-group first\n");
4647 return CMD_WARNING_CONFIG_FAILED
;
4650 ret
= peer_group_bind(bgp
, NULL
, peer
, group
, &as
);
4653 return bgp_vty_return(vty
, ret
);
4656 DEFUN (neighbor_interface_config
,
4657 neighbor_interface_config_cmd
,
4658 "neighbor WORD interface [peer-group PGNAME]",
4660 "Interface name or neighbor tag\n"
4661 "Enable BGP on interface\n"
4662 "Member of the peer-group\n"
4663 "Peer-group name\n")
4666 int idx_peer_group_word
= 4;
4668 if (argc
> idx_peer_group_word
)
4669 return peer_conf_interface_get(
4670 vty
, argv
[idx_word
]->arg
, 0,
4671 argv
[idx_peer_group_word
]->arg
, NULL
);
4673 return peer_conf_interface_get(vty
, argv
[idx_word
]->arg
, 0,
4677 DEFUN (neighbor_interface_config_v6only
,
4678 neighbor_interface_config_v6only_cmd
,
4679 "neighbor WORD interface v6only [peer-group PGNAME]",
4681 "Interface name or neighbor tag\n"
4682 "Enable BGP on interface\n"
4683 "Enable BGP with v6 link-local only\n"
4684 "Member of the peer-group\n"
4685 "Peer-group name\n")
4688 int idx_peer_group_word
= 5;
4690 if (argc
> idx_peer_group_word
)
4691 return peer_conf_interface_get(
4692 vty
, argv
[idx_word
]->arg
, 1,
4693 argv
[idx_peer_group_word
]->arg
, NULL
);
4695 return peer_conf_interface_get(vty
, argv
[idx_word
]->arg
, 1, NULL
, NULL
);
4699 DEFUN (neighbor_interface_config_remote_as
,
4700 neighbor_interface_config_remote_as_cmd
,
4701 "neighbor WORD interface remote-as <(1-4294967295)|internal|external>",
4703 "Interface name or neighbor tag\n"
4704 "Enable BGP on interface\n"
4705 "Specify a BGP neighbor\n"
4707 "Internal BGP peer\n"
4708 "External BGP peer\n")
4711 int idx_remote_as
= 4;
4712 return peer_conf_interface_get(vty
, argv
[idx_word
]->arg
, 0, NULL
,
4713 argv
[idx_remote_as
]->arg
);
4716 DEFUN (neighbor_interface_v6only_config_remote_as
,
4717 neighbor_interface_v6only_config_remote_as_cmd
,
4718 "neighbor WORD interface v6only remote-as <(1-4294967295)|internal|external>",
4720 "Interface name or neighbor tag\n"
4721 "Enable BGP with v6 link-local only\n"
4722 "Enable BGP on interface\n"
4723 "Specify a BGP neighbor\n"
4725 "Internal BGP peer\n"
4726 "External BGP peer\n")
4729 int idx_remote_as
= 5;
4730 return peer_conf_interface_get(vty
, argv
[idx_word
]->arg
, 1, NULL
,
4731 argv
[idx_remote_as
]->arg
);
4734 DEFUN (neighbor_peer_group
,
4735 neighbor_peer_group_cmd
,
4736 "neighbor WORD peer-group",
4738 "Interface name or neighbor tag\n"
4739 "Configure peer-group\n")
4741 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4744 struct peer_group
*group
;
4746 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_word
]->arg
);
4748 vty_out(vty
, "%% Name conflict with interface: \n");
4749 return CMD_WARNING_CONFIG_FAILED
;
4752 group
= peer_group_get(bgp
, argv
[idx_word
]->arg
);
4754 vty_out(vty
, "%% BGP failed to find or create peer-group\n");
4755 return CMD_WARNING_CONFIG_FAILED
;
4763 "no neighbor <WORD|<A.B.C.D|X:X::X:X> [remote-as <(1-4294967295)|internal|external>]>",
4767 "Specify a BGP neighbor\n"
4769 "Internal BGP peer\n"
4770 "External BGP peer\n")
4772 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4776 struct peer_group
*group
;
4780 ret
= str2sockunion(argv
[idx_peer
]->arg
, &su
);
4782 /* look up for neighbor by interface name config. */
4783 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_peer
]->arg
);
4785 /* Request zebra to terminate IPv6 RAs on this
4788 bgp_zebra_terminate_radv(peer
->bgp
, peer
);
4789 peer_notify_unconfig(peer
);
4794 group
= peer_group_lookup(bgp
, argv
[idx_peer
]->arg
);
4796 peer_group_notify_unconfig(group
);
4797 peer_group_delete(group
);
4799 vty_out(vty
, "%% Create the peer-group first\n");
4800 return CMD_WARNING_CONFIG_FAILED
;
4803 peer
= peer_lookup(bgp
, &su
);
4805 if (peer_dynamic_neighbor(peer
)) {
4807 "%% Operation not allowed on a dynamic neighbor\n");
4808 return CMD_WARNING_CONFIG_FAILED
;
4811 other
= peer
->doppelganger
;
4813 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CAPABILITY_ENHE
))
4814 bgp_zebra_terminate_radv(peer
->bgp
, peer
);
4816 peer_notify_unconfig(peer
);
4818 if (other
&& other
->status
!= Deleted
) {
4819 peer_notify_unconfig(other
);
4828 DEFUN (no_neighbor_interface_config
,
4829 no_neighbor_interface_config_cmd
,
4830 "no neighbor WORD interface [v6only] [peer-group PGNAME] [remote-as <(1-4294967295)|internal|external>]",
4834 "Configure BGP on interface\n"
4835 "Enable BGP with v6 link-local only\n"
4836 "Member of the peer-group\n"
4838 "Specify a BGP neighbor\n"
4840 "Internal BGP peer\n"
4841 "External BGP peer\n")
4843 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4847 /* look up for neighbor by interface name config. */
4848 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_word
]->arg
);
4850 /* Request zebra to terminate IPv6 RAs on this interface. */
4852 bgp_zebra_terminate_radv(peer
->bgp
, peer
);
4853 peer_notify_unconfig(peer
);
4856 vty_out(vty
, "%% Create the bgp interface first\n");
4857 return CMD_WARNING_CONFIG_FAILED
;
4862 DEFUN (no_neighbor_peer_group
,
4863 no_neighbor_peer_group_cmd
,
4864 "no neighbor WORD peer-group",
4868 "Configure peer-group\n")
4870 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4872 struct peer_group
*group
;
4874 group
= peer_group_lookup(bgp
, argv
[idx_word
]->arg
);
4876 peer_group_notify_unconfig(group
);
4877 peer_group_delete(group
);
4879 vty_out(vty
, "%% Create the peer-group first\n");
4880 return CMD_WARNING_CONFIG_FAILED
;
4885 DEFUN (no_neighbor_interface_peer_group_remote_as
,
4886 no_neighbor_interface_peer_group_remote_as_cmd
,
4887 "no neighbor WORD remote-as <(1-4294967295)|internal|external>",
4890 "Interface name or neighbor tag\n"
4891 "Specify a BGP neighbor\n"
4893 "Internal BGP peer\n"
4894 "External BGP peer\n")
4896 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
4898 struct peer_group
*group
;
4901 /* look up for neighbor by interface name config. */
4902 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_word
]->arg
);
4904 peer_as_change(peer
, 0, AS_UNSPECIFIED
);
4908 group
= peer_group_lookup(bgp
, argv
[idx_word
]->arg
);
4910 peer_group_remote_as_delete(group
);
4912 vty_out(vty
, "%% Create the peer-group or interface first\n");
4913 return CMD_WARNING_CONFIG_FAILED
;
4918 DEFUN (neighbor_local_as
,
4919 neighbor_local_as_cmd
,
4920 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295)",
4923 "Specify a local-as number\n"
4924 "AS number used as local AS\n")
4932 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
4934 return CMD_WARNING_CONFIG_FAILED
;
4936 as
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
4937 ret
= peer_local_as_set(peer
, as
, 0, 0);
4938 return bgp_vty_return(vty
, ret
);
4941 DEFUN (neighbor_local_as_no_prepend
,
4942 neighbor_local_as_no_prepend_cmd
,
4943 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295) no-prepend",
4946 "Specify a local-as number\n"
4947 "AS number used as local AS\n"
4948 "Do not prepend local-as to updates from ebgp peers\n")
4956 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
4958 return CMD_WARNING_CONFIG_FAILED
;
4960 as
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
4961 ret
= peer_local_as_set(peer
, as
, 1, 0);
4962 return bgp_vty_return(vty
, ret
);
4965 DEFUN (neighbor_local_as_no_prepend_replace_as
,
4966 neighbor_local_as_no_prepend_replace_as_cmd
,
4967 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295) no-prepend replace-as",
4970 "Specify a local-as number\n"
4971 "AS number used as local AS\n"
4972 "Do not prepend local-as to updates from ebgp peers\n"
4973 "Do not prepend local-as to updates from ibgp peers\n")
4981 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
4983 return CMD_WARNING_CONFIG_FAILED
;
4985 as
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
4986 ret
= peer_local_as_set(peer
, as
, 1, 1);
4987 return bgp_vty_return(vty
, ret
);
4990 DEFUN (no_neighbor_local_as
,
4991 no_neighbor_local_as_cmd
,
4992 "no neighbor <A.B.C.D|X:X::X:X|WORD> local-as [(1-4294967295) [no-prepend [replace-as]]]",
4996 "Specify a local-as number\n"
4997 "AS number used as local AS\n"
4998 "Do not prepend local-as to updates from ebgp peers\n"
4999 "Do not prepend local-as to updates from ibgp peers\n")
5005 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
5007 return CMD_WARNING_CONFIG_FAILED
;
5009 ret
= peer_local_as_unset(peer
);
5010 return bgp_vty_return(vty
, ret
);
5014 DEFUN (neighbor_solo
,
5016 "neighbor <A.B.C.D|X:X::X:X|WORD> solo",
5019 "Solo peer - part of its own update group\n")
5025 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
5027 return CMD_WARNING_CONFIG_FAILED
;
5029 ret
= update_group_adjust_soloness(peer
, 1);
5030 return bgp_vty_return(vty
, ret
);
5033 DEFUN (no_neighbor_solo
,
5034 no_neighbor_solo_cmd
,
5035 "no neighbor <A.B.C.D|X:X::X:X|WORD> solo",
5039 "Solo peer - part of its own update group\n")
5045 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
5047 return CMD_WARNING_CONFIG_FAILED
;
5049 ret
= update_group_adjust_soloness(peer
, 0);
5050 return bgp_vty_return(vty
, ret
);
5053 DEFUN (neighbor_password
,
5054 neighbor_password_cmd
,
5055 "neighbor <A.B.C.D|X:X::X:X|WORD> password LINE",
5066 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
5068 return CMD_WARNING_CONFIG_FAILED
;
5070 ret
= peer_password_set(peer
, argv
[idx_line
]->arg
);
5071 return bgp_vty_return(vty
, ret
);
5074 DEFUN (no_neighbor_password
,
5075 no_neighbor_password_cmd
,
5076 "no neighbor <A.B.C.D|X:X::X:X|WORD> password [LINE]",
5087 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
5089 return CMD_WARNING_CONFIG_FAILED
;
5091 ret
= peer_password_unset(peer
);
5092 return bgp_vty_return(vty
, ret
);
5095 DEFUN (neighbor_activate
,
5096 neighbor_activate_cmd
,
5097 "neighbor <A.B.C.D|X:X::X:X|WORD> activate",
5100 "Enable the Address Family for this Neighbor\n")
5106 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
5108 return CMD_WARNING_CONFIG_FAILED
;
5110 ret
= peer_activate(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
));
5111 return bgp_vty_return(vty
, ret
);
5114 ALIAS_HIDDEN(neighbor_activate
, neighbor_activate_hidden_cmd
,
5115 "neighbor <A.B.C.D|X:X::X:X|WORD> activate",
5116 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5117 "Enable the Address Family for this Neighbor\n")
5119 DEFUN (no_neighbor_activate
,
5120 no_neighbor_activate_cmd
,
5121 "no neighbor <A.B.C.D|X:X::X:X|WORD> activate",
5125 "Enable the Address Family for this Neighbor\n")
5132 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
5134 return CMD_WARNING_CONFIG_FAILED
;
5136 ret
= peer_deactivate(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
));
5137 return bgp_vty_return(vty
, ret
);
5140 ALIAS_HIDDEN(no_neighbor_activate
, no_neighbor_activate_hidden_cmd
,
5141 "no neighbor <A.B.C.D|X:X::X:X|WORD> activate",
5142 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5143 "Enable the Address Family for this Neighbor\n")
5145 DEFUN (neighbor_set_peer_group
,
5146 neighbor_set_peer_group_cmd
,
5147 "neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
5150 "Member of the peer-group\n"
5151 "Peer-group name\n")
5153 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
5160 struct peer_group
*group
;
5162 ret
= str2sockunion(argv
[idx_peer
]->arg
, &su
);
5164 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_peer
]->arg
);
5166 vty_out(vty
, "%% Malformed address or name: %s\n",
5167 argv
[idx_peer
]->arg
);
5168 return CMD_WARNING_CONFIG_FAILED
;
5171 if (peer_address_self_check(bgp
, &su
)) {
5173 "%% Can not configure the local system as neighbor\n");
5174 return CMD_WARNING_CONFIG_FAILED
;
5177 /* Disallow for dynamic neighbor. */
5178 peer
= peer_lookup(bgp
, &su
);
5179 if (peer
&& peer_dynamic_neighbor(peer
)) {
5181 "%% Operation not allowed on a dynamic neighbor\n");
5182 return CMD_WARNING_CONFIG_FAILED
;
5186 group
= peer_group_lookup(bgp
, argv
[idx_word
]->arg
);
5188 vty_out(vty
, "%% Configure the peer-group first\n");
5189 return CMD_WARNING_CONFIG_FAILED
;
5192 ret
= peer_group_bind(bgp
, &su
, peer
, group
, &as
);
5194 return bgp_vty_return(vty
, ret
);
5197 ALIAS_HIDDEN(neighbor_set_peer_group
, neighbor_set_peer_group_hidden_cmd
,
5198 "neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
5199 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5200 "Member of the peer-group\n"
5201 "Peer-group name\n")
5203 DEFUN (no_neighbor_set_peer_group
,
5204 no_neighbor_set_peer_group_cmd
,
5205 "no neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
5209 "Member of the peer-group\n"
5210 "Peer-group name\n")
5212 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
5217 struct peer_group
*group
;
5219 peer
= peer_lookup_vty(vty
, argv
[idx_peer
]->arg
);
5221 return CMD_WARNING_CONFIG_FAILED
;
5223 group
= peer_group_lookup(bgp
, argv
[idx_word
]->arg
);
5225 vty_out(vty
, "%% Configure the peer-group first\n");
5226 return CMD_WARNING_CONFIG_FAILED
;
5229 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CAPABILITY_ENHE
))
5230 bgp_zebra_terminate_radv(peer
->bgp
, peer
);
5232 peer_notify_unconfig(peer
);
5233 ret
= peer_delete(peer
);
5235 return bgp_vty_return(vty
, ret
);
5238 ALIAS_HIDDEN(no_neighbor_set_peer_group
, no_neighbor_set_peer_group_hidden_cmd
,
5239 "no neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
5240 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5241 "Member of the peer-group\n"
5242 "Peer-group name\n")
5244 static int peer_flag_modify_vty(struct vty
*vty
, const char *ip_str
,
5245 uint64_t flag
, int set
)
5250 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5252 return CMD_WARNING_CONFIG_FAILED
;
5255 * If 'neighbor <interface>', then this is for directly connected peers,
5256 * we should not accept disable-connected-check.
5258 if (peer
->conf_if
&& (flag
== PEER_FLAG_DISABLE_CONNECTED_CHECK
)) {
5260 "%s is directly connected peer, cannot accept disable-connected-check\n",
5262 return CMD_WARNING_CONFIG_FAILED
;
5265 if (!set
&& flag
== PEER_FLAG_SHUTDOWN
)
5266 peer_tx_shutdown_message_unset(peer
);
5269 ret
= peer_flag_set(peer
, flag
);
5271 ret
= peer_flag_unset(peer
, flag
);
5273 return bgp_vty_return(vty
, ret
);
5276 static int peer_flag_set_vty(struct vty
*vty
, const char *ip_str
, uint64_t flag
)
5278 return peer_flag_modify_vty(vty
, ip_str
, flag
, 1);
5281 static int peer_flag_unset_vty(struct vty
*vty
, const char *ip_str
,
5284 return peer_flag_modify_vty(vty
, ip_str
, flag
, 0);
5287 /* neighbor passive. */
5288 DEFUN (neighbor_passive
,
5289 neighbor_passive_cmd
,
5290 "neighbor <A.B.C.D|X:X::X:X|WORD> passive",
5293 "Don't send open messages to this neighbor\n")
5296 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
, PEER_FLAG_PASSIVE
);
5299 DEFUN (no_neighbor_passive
,
5300 no_neighbor_passive_cmd
,
5301 "no neighbor <A.B.C.D|X:X::X:X|WORD> passive",
5305 "Don't send open messages to this neighbor\n")
5308 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
, PEER_FLAG_PASSIVE
);
5311 /* neighbor shutdown. */
5312 DEFUN (neighbor_shutdown_msg
,
5313 neighbor_shutdown_msg_cmd
,
5314 "neighbor <A.B.C.D|X:X::X:X|WORD> shutdown message MSG...",
5317 "Administratively shut down this neighbor\n"
5318 "Add a shutdown message (RFC 8203)\n"
5319 "Shutdown message\n")
5325 peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
5329 return CMD_WARNING_CONFIG_FAILED
;
5330 message
= argv_concat(argv
, argc
, 4);
5331 peer_tx_shutdown_message_set(peer
, message
);
5332 XFREE(MTYPE_TMP
, message
);
5335 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
, PEER_FLAG_SHUTDOWN
);
5338 ALIAS(neighbor_shutdown_msg
, neighbor_shutdown_cmd
,
5339 "neighbor <A.B.C.D|X:X::X:X|WORD> shutdown",
5340 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5341 "Administratively shut down this neighbor\n")
5343 DEFUN (no_neighbor_shutdown_msg
,
5344 no_neighbor_shutdown_msg_cmd
,
5345 "no neighbor <A.B.C.D|X:X::X:X|WORD> shutdown message MSG...",
5349 "Administratively shut down this neighbor\n"
5350 "Remove a shutdown message (RFC 8203)\n"
5351 "Shutdown message\n")
5355 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
5356 PEER_FLAG_SHUTDOWN
);
5359 ALIAS(no_neighbor_shutdown_msg
, no_neighbor_shutdown_cmd
,
5360 "no neighbor <A.B.C.D|X:X::X:X|WORD> shutdown",
5361 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5362 "Administratively shut down this neighbor\n")
5364 DEFUN(neighbor_shutdown_rtt
,
5365 neighbor_shutdown_rtt_cmd
,
5366 "neighbor <A.B.C.D|X:X::X:X|WORD> shutdown rtt (1-65535) [count (1-255)]",
5369 "Administratively shut down this neighbor\n"
5370 "Shutdown if round-trip-time is higher than expected\n"
5371 "Round-trip-time in milliseconds\n"
5372 "Specify the number of keepalives before shutdown\n"
5373 "The number of keepalives with higher RTT to shutdown\n")
5380 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
5383 return CMD_WARNING_CONFIG_FAILED
;
5385 peer
->rtt_expected
= strtol(argv
[idx_rtt
]->arg
, NULL
, 10);
5387 if (argv_find(argv
, argc
, "count", &idx_count
))
5388 peer
->rtt_keepalive_conf
=
5389 strtol(argv
[idx_count
+ 1]->arg
, NULL
, 10);
5391 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
5392 PEER_FLAG_RTT_SHUTDOWN
);
5395 DEFUN(no_neighbor_shutdown_rtt
,
5396 no_neighbor_shutdown_rtt_cmd
,
5397 "no neighbor <A.B.C.D|X:X::X:X|WORD> shutdown rtt [(1-65535) [count (1-255)]]",
5401 "Administratively shut down this neighbor\n"
5402 "Shutdown if round-trip-time is higher than expected\n"
5403 "Round-trip-time in milliseconds\n"
5404 "Specify the number of keepalives before shutdown\n"
5405 "The number of keepalives with higher RTT to shutdown\n")
5410 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
5413 return CMD_WARNING_CONFIG_FAILED
;
5415 peer
->rtt_expected
= 0;
5416 peer
->rtt_keepalive_conf
= 1;
5418 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
5419 PEER_FLAG_RTT_SHUTDOWN
);
5422 /* neighbor capability dynamic. */
5423 DEFUN (neighbor_capability_dynamic
,
5424 neighbor_capability_dynamic_cmd
,
5425 "neighbor <A.B.C.D|X:X::X:X|WORD> capability dynamic",
5428 "Advertise capability to the peer\n"
5429 "Advertise dynamic capability to this neighbor\n")
5432 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
5433 PEER_FLAG_DYNAMIC_CAPABILITY
);
5436 DEFUN (no_neighbor_capability_dynamic
,
5437 no_neighbor_capability_dynamic_cmd
,
5438 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability dynamic",
5442 "Advertise capability to the peer\n"
5443 "Advertise dynamic capability to this neighbor\n")
5446 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
5447 PEER_FLAG_DYNAMIC_CAPABILITY
);
5450 /* neighbor dont-capability-negotiate */
5451 DEFUN (neighbor_dont_capability_negotiate
,
5452 neighbor_dont_capability_negotiate_cmd
,
5453 "neighbor <A.B.C.D|X:X::X:X|WORD> dont-capability-negotiate",
5456 "Do not perform capability negotiation\n")
5459 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
5460 PEER_FLAG_DONT_CAPABILITY
);
5463 DEFUN (no_neighbor_dont_capability_negotiate
,
5464 no_neighbor_dont_capability_negotiate_cmd
,
5465 "no neighbor <A.B.C.D|X:X::X:X|WORD> dont-capability-negotiate",
5469 "Do not perform capability negotiation\n")
5472 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
5473 PEER_FLAG_DONT_CAPABILITY
);
5476 /* neighbor capability extended next hop encoding */
5477 DEFUN (neighbor_capability_enhe
,
5478 neighbor_capability_enhe_cmd
,
5479 "neighbor <A.B.C.D|X:X::X:X|WORD> capability extended-nexthop",
5482 "Advertise capability to the peer\n"
5483 "Advertise extended next-hop capability to the peer\n")
5488 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
5489 if (peer
&& peer
->conf_if
)
5492 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
5493 PEER_FLAG_CAPABILITY_ENHE
);
5496 DEFUN (no_neighbor_capability_enhe
,
5497 no_neighbor_capability_enhe_cmd
,
5498 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability extended-nexthop",
5502 "Advertise capability to the peer\n"
5503 "Advertise extended next-hop capability to the peer\n")
5508 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
5509 if (peer
&& peer
->conf_if
) {
5511 "Peer %s cannot have capability extended-nexthop turned off\n",
5512 argv
[idx_peer
]->arg
);
5513 return CMD_WARNING_CONFIG_FAILED
;
5516 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
5517 PEER_FLAG_CAPABILITY_ENHE
);
5520 static int peer_af_flag_modify_vty(struct vty
*vty
, const char *peer_str
,
5521 afi_t afi
, safi_t safi
, uint32_t flag
,
5527 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
5529 return CMD_WARNING_CONFIG_FAILED
;
5532 ret
= peer_af_flag_set(peer
, afi
, safi
, flag
);
5534 ret
= peer_af_flag_unset(peer
, afi
, safi
, flag
);
5536 return bgp_vty_return(vty
, ret
);
5539 static int peer_af_flag_set_vty(struct vty
*vty
, const char *peer_str
,
5540 afi_t afi
, safi_t safi
, uint32_t flag
)
5542 return peer_af_flag_modify_vty(vty
, peer_str
, afi
, safi
, flag
, 1);
5545 static int peer_af_flag_unset_vty(struct vty
*vty
, const char *peer_str
,
5546 afi_t afi
, safi_t safi
, uint32_t flag
)
5548 return peer_af_flag_modify_vty(vty
, peer_str
, afi
, safi
, flag
, 0);
5551 /* neighbor capability orf prefix-list. */
5552 DEFUN (neighbor_capability_orf_prefix
,
5553 neighbor_capability_orf_prefix_cmd
,
5554 "neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
5557 "Advertise capability to the peer\n"
5558 "Advertise ORF capability to the peer\n"
5559 "Advertise prefixlist ORF capability to this neighbor\n"
5560 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
5561 "Capability to RECEIVE the ORF from this neighbor\n"
5562 "Capability to SEND the ORF to this neighbor\n")
5564 int idx_send_recv
= 5;
5565 char *peer_str
= argv
[1]->arg
;
5567 afi_t afi
= bgp_node_afi(vty
);
5568 safi_t safi
= bgp_node_safi(vty
);
5570 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
5572 return CMD_WARNING_CONFIG_FAILED
;
5574 if (strmatch(argv
[idx_send_recv
]->text
, "send"))
5575 return peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
,
5576 PEER_FLAG_ORF_PREFIX_SM
);
5578 if (strmatch(argv
[idx_send_recv
]->text
, "receive"))
5579 return peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
,
5580 PEER_FLAG_ORF_PREFIX_RM
);
5582 if (strmatch(argv
[idx_send_recv
]->text
, "both"))
5583 return peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
,
5584 PEER_FLAG_ORF_PREFIX_SM
)
5585 | peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
,
5586 PEER_FLAG_ORF_PREFIX_RM
);
5588 return CMD_WARNING_CONFIG_FAILED
;
5592 neighbor_capability_orf_prefix
,
5593 neighbor_capability_orf_prefix_hidden_cmd
,
5594 "neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
5595 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5596 "Advertise capability to the peer\n"
5597 "Advertise ORF capability to the peer\n"
5598 "Advertise prefixlist ORF capability to this neighbor\n"
5599 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
5600 "Capability to RECEIVE the ORF from this neighbor\n"
5601 "Capability to SEND the ORF to this neighbor\n")
5603 DEFUN (no_neighbor_capability_orf_prefix
,
5604 no_neighbor_capability_orf_prefix_cmd
,
5605 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
5609 "Advertise capability to the peer\n"
5610 "Advertise ORF capability to the peer\n"
5611 "Advertise prefixlist ORF capability to this neighbor\n"
5612 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
5613 "Capability to RECEIVE the ORF from this neighbor\n"
5614 "Capability to SEND the ORF to this neighbor\n")
5616 int idx_send_recv
= 6;
5617 char *peer_str
= argv
[2]->arg
;
5619 afi_t afi
= bgp_node_afi(vty
);
5620 safi_t safi
= bgp_node_safi(vty
);
5622 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
5624 return CMD_WARNING_CONFIG_FAILED
;
5626 if (strmatch(argv
[idx_send_recv
]->text
, "send"))
5627 return peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
5628 PEER_FLAG_ORF_PREFIX_SM
);
5630 if (strmatch(argv
[idx_send_recv
]->text
, "receive"))
5631 return peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
5632 PEER_FLAG_ORF_PREFIX_RM
);
5634 if (strmatch(argv
[idx_send_recv
]->text
, "both"))
5635 return peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
5636 PEER_FLAG_ORF_PREFIX_SM
)
5637 | peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
5638 PEER_FLAG_ORF_PREFIX_RM
);
5640 return CMD_WARNING_CONFIG_FAILED
;
5644 no_neighbor_capability_orf_prefix
,
5645 no_neighbor_capability_orf_prefix_hidden_cmd
,
5646 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
5647 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5648 "Advertise capability to the peer\n"
5649 "Advertise ORF capability to the peer\n"
5650 "Advertise prefixlist ORF capability to this neighbor\n"
5651 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
5652 "Capability to RECEIVE the ORF from this neighbor\n"
5653 "Capability to SEND the ORF to this neighbor\n")
5655 /* neighbor next-hop-self. */
5656 DEFUN (neighbor_nexthop_self
,
5657 neighbor_nexthop_self_cmd
,
5658 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
5661 "Disable the next hop calculation for this neighbor\n")
5664 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
5665 bgp_node_safi(vty
), PEER_FLAG_NEXTHOP_SELF
);
5668 ALIAS_HIDDEN(neighbor_nexthop_self
, neighbor_nexthop_self_hidden_cmd
,
5669 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
5670 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5671 "Disable the next hop calculation for this neighbor\n")
5673 /* neighbor next-hop-self. */
5674 DEFUN (neighbor_nexthop_self_force
,
5675 neighbor_nexthop_self_force_cmd
,
5676 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
5679 "Disable the next hop calculation for this neighbor\n"
5680 "Set the next hop to self for reflected routes\n")
5683 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
5685 PEER_FLAG_FORCE_NEXTHOP_SELF
);
5688 ALIAS_HIDDEN(neighbor_nexthop_self_force
,
5689 neighbor_nexthop_self_force_hidden_cmd
,
5690 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
5691 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5692 "Disable the next hop calculation for this neighbor\n"
5693 "Set the next hop to self for reflected routes\n")
5695 ALIAS_HIDDEN(neighbor_nexthop_self_force
,
5696 neighbor_nexthop_self_all_hidden_cmd
,
5697 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self all",
5698 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5699 "Disable the next hop calculation for this neighbor\n"
5700 "Set the next hop to self for reflected routes\n")
5702 DEFUN (no_neighbor_nexthop_self
,
5703 no_neighbor_nexthop_self_cmd
,
5704 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
5708 "Disable the next hop calculation for this neighbor\n")
5711 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
5712 bgp_node_afi(vty
), bgp_node_safi(vty
),
5713 PEER_FLAG_NEXTHOP_SELF
);
5716 ALIAS_HIDDEN(no_neighbor_nexthop_self
, no_neighbor_nexthop_self_hidden_cmd
,
5717 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
5718 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5719 "Disable the next hop calculation for this neighbor\n")
5721 DEFUN (no_neighbor_nexthop_self_force
,
5722 no_neighbor_nexthop_self_force_cmd
,
5723 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
5727 "Disable the next hop calculation for this neighbor\n"
5728 "Set the next hop to self for reflected routes\n")
5731 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
5732 bgp_node_afi(vty
), bgp_node_safi(vty
),
5733 PEER_FLAG_FORCE_NEXTHOP_SELF
);
5736 ALIAS_HIDDEN(no_neighbor_nexthop_self_force
,
5737 no_neighbor_nexthop_self_force_hidden_cmd
,
5738 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
5739 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5740 "Disable the next hop calculation for this neighbor\n"
5741 "Set the next hop to self for reflected routes\n")
5743 ALIAS_HIDDEN(no_neighbor_nexthop_self_force
,
5744 no_neighbor_nexthop_self_all_hidden_cmd
,
5745 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self all",
5746 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5747 "Disable the next hop calculation for this neighbor\n"
5748 "Set the next hop to self for reflected routes\n")
5750 /* neighbor as-override */
5751 DEFUN (neighbor_as_override
,
5752 neighbor_as_override_cmd
,
5753 "neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
5756 "Override ASNs in outbound updates if aspath equals remote-as\n")
5759 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
5760 bgp_node_safi(vty
), PEER_FLAG_AS_OVERRIDE
);
5763 ALIAS_HIDDEN(neighbor_as_override
, neighbor_as_override_hidden_cmd
,
5764 "neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
5765 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5766 "Override ASNs in outbound updates if aspath equals remote-as\n")
5768 DEFUN (no_neighbor_as_override
,
5769 no_neighbor_as_override_cmd
,
5770 "no neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
5774 "Override ASNs in outbound updates if aspath equals remote-as\n")
5777 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
5778 bgp_node_afi(vty
), bgp_node_safi(vty
),
5779 PEER_FLAG_AS_OVERRIDE
);
5782 ALIAS_HIDDEN(no_neighbor_as_override
, no_neighbor_as_override_hidden_cmd
,
5783 "no neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
5784 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5785 "Override ASNs in outbound updates if aspath equals remote-as\n")
5787 /* neighbor remove-private-AS. */
5788 DEFUN (neighbor_remove_private_as
,
5789 neighbor_remove_private_as_cmd
,
5790 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
5793 "Remove private ASNs in outbound updates\n")
5796 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
5798 PEER_FLAG_REMOVE_PRIVATE_AS
);
5801 ALIAS_HIDDEN(neighbor_remove_private_as
, neighbor_remove_private_as_hidden_cmd
,
5802 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
5803 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5804 "Remove private ASNs in outbound updates\n")
5806 DEFUN (neighbor_remove_private_as_all
,
5807 neighbor_remove_private_as_all_cmd
,
5808 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
5811 "Remove private ASNs in outbound updates\n"
5812 "Apply to all AS numbers\n")
5815 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
5817 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
);
5820 ALIAS_HIDDEN(neighbor_remove_private_as_all
,
5821 neighbor_remove_private_as_all_hidden_cmd
,
5822 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
5823 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5824 "Remove private ASNs in outbound updates\n"
5825 "Apply to all AS numbers\n")
5827 DEFUN (neighbor_remove_private_as_replace_as
,
5828 neighbor_remove_private_as_replace_as_cmd
,
5829 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
5832 "Remove private ASNs in outbound updates\n"
5833 "Replace private ASNs with our ASN in outbound updates\n")
5836 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
5838 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
);
5841 ALIAS_HIDDEN(neighbor_remove_private_as_replace_as
,
5842 neighbor_remove_private_as_replace_as_hidden_cmd
,
5843 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
5844 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5845 "Remove private ASNs in outbound updates\n"
5846 "Replace private ASNs with our ASN in outbound updates\n")
5848 DEFUN (neighbor_remove_private_as_all_replace_as
,
5849 neighbor_remove_private_as_all_replace_as_cmd
,
5850 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
5853 "Remove private ASNs in outbound updates\n"
5854 "Apply to all AS numbers\n"
5855 "Replace private ASNs with our ASN in outbound updates\n")
5858 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
5860 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
);
5864 neighbor_remove_private_as_all_replace_as
,
5865 neighbor_remove_private_as_all_replace_as_hidden_cmd
,
5866 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
5867 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5868 "Remove private ASNs in outbound updates\n"
5869 "Apply to all AS numbers\n"
5870 "Replace private ASNs with our ASN in outbound updates\n")
5872 DEFUN (no_neighbor_remove_private_as
,
5873 no_neighbor_remove_private_as_cmd
,
5874 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
5878 "Remove private ASNs in outbound updates\n")
5881 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
5882 bgp_node_afi(vty
), bgp_node_safi(vty
),
5883 PEER_FLAG_REMOVE_PRIVATE_AS
);
5886 ALIAS_HIDDEN(no_neighbor_remove_private_as
,
5887 no_neighbor_remove_private_as_hidden_cmd
,
5888 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
5889 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5890 "Remove private ASNs in outbound updates\n")
5892 DEFUN (no_neighbor_remove_private_as_all
,
5893 no_neighbor_remove_private_as_all_cmd
,
5894 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
5898 "Remove private ASNs in outbound updates\n"
5899 "Apply to all AS numbers\n")
5902 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
5903 bgp_node_afi(vty
), bgp_node_safi(vty
),
5904 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
);
5907 ALIAS_HIDDEN(no_neighbor_remove_private_as_all
,
5908 no_neighbor_remove_private_as_all_hidden_cmd
,
5909 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
5910 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5911 "Remove private ASNs in outbound updates\n"
5912 "Apply to all AS numbers\n")
5914 DEFUN (no_neighbor_remove_private_as_replace_as
,
5915 no_neighbor_remove_private_as_replace_as_cmd
,
5916 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
5920 "Remove private ASNs in outbound updates\n"
5921 "Replace private ASNs with our ASN in outbound updates\n")
5924 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
5925 bgp_node_afi(vty
), bgp_node_safi(vty
),
5926 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
);
5929 ALIAS_HIDDEN(no_neighbor_remove_private_as_replace_as
,
5930 no_neighbor_remove_private_as_replace_as_hidden_cmd
,
5931 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
5932 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5933 "Remove private ASNs in outbound updates\n"
5934 "Replace private ASNs with our ASN in outbound updates\n")
5936 DEFUN (no_neighbor_remove_private_as_all_replace_as
,
5937 no_neighbor_remove_private_as_all_replace_as_cmd
,
5938 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
5942 "Remove private ASNs in outbound updates\n"
5943 "Apply to all AS numbers\n"
5944 "Replace private ASNs with our ASN in outbound updates\n")
5947 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
5948 bgp_node_afi(vty
), bgp_node_safi(vty
),
5949 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
);
5953 no_neighbor_remove_private_as_all_replace_as
,
5954 no_neighbor_remove_private_as_all_replace_as_hidden_cmd
,
5955 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
5956 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5957 "Remove private ASNs in outbound updates\n"
5958 "Apply to all AS numbers\n"
5959 "Replace private ASNs with our ASN in outbound updates\n")
5962 /* neighbor send-community. */
5963 DEFUN (neighbor_send_community
,
5964 neighbor_send_community_cmd
,
5965 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
5968 "Send Community attribute to this neighbor\n")
5972 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
5974 PEER_FLAG_SEND_COMMUNITY
);
5977 ALIAS_HIDDEN(neighbor_send_community
, neighbor_send_community_hidden_cmd
,
5978 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
5979 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5980 "Send Community attribute to this neighbor\n")
5982 DEFUN (no_neighbor_send_community
,
5983 no_neighbor_send_community_cmd
,
5984 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
5988 "Send Community attribute to this neighbor\n")
5992 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
5993 bgp_node_afi(vty
), bgp_node_safi(vty
),
5994 PEER_FLAG_SEND_COMMUNITY
);
5997 ALIAS_HIDDEN(no_neighbor_send_community
, no_neighbor_send_community_hidden_cmd
,
5998 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
5999 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6000 "Send Community attribute to this neighbor\n")
6002 /* neighbor send-community extended. */
6003 DEFUN (neighbor_send_community_type
,
6004 neighbor_send_community_type_cmd
,
6005 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
6008 "Send Community attribute to this neighbor\n"
6009 "Send Standard and Extended Community attributes\n"
6010 "Send Standard, Large and Extended Community attributes\n"
6011 "Send Extended Community attributes\n"
6012 "Send Standard Community attributes\n"
6013 "Send Large Community attributes\n")
6015 const char *type
= argv
[argc
- 1]->text
;
6016 char *peer_str
= argv
[1]->arg
;
6018 afi_t afi
= bgp_node_afi(vty
);
6019 safi_t safi
= bgp_node_safi(vty
);
6021 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
6023 return CMD_WARNING_CONFIG_FAILED
;
6025 if (strmatch(type
, "standard"))
6026 return peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
,
6027 PEER_FLAG_SEND_COMMUNITY
);
6029 if (strmatch(type
, "extended"))
6030 return peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
,
6031 PEER_FLAG_SEND_EXT_COMMUNITY
);
6033 if (strmatch(type
, "large"))
6034 return peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
,
6035 PEER_FLAG_SEND_LARGE_COMMUNITY
);
6037 if (strmatch(type
, "both")) {
6038 return peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
,
6039 PEER_FLAG_SEND_COMMUNITY
)
6040 | peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
,
6041 PEER_FLAG_SEND_EXT_COMMUNITY
);
6043 return peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
,
6044 PEER_FLAG_SEND_COMMUNITY
)
6045 | peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
,
6046 PEER_FLAG_SEND_EXT_COMMUNITY
)
6047 | peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
,
6048 PEER_FLAG_SEND_LARGE_COMMUNITY
);
6052 neighbor_send_community_type
, neighbor_send_community_type_hidden_cmd
,
6053 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
6054 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6055 "Send Community attribute to this neighbor\n"
6056 "Send Standard and Extended Community attributes\n"
6057 "Send Standard, Large and Extended Community attributes\n"
6058 "Send Extended Community attributes\n"
6059 "Send Standard Community attributes\n"
6060 "Send Large Community attributes\n")
6062 DEFUN (no_neighbor_send_community_type
,
6063 no_neighbor_send_community_type_cmd
,
6064 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
6068 "Send Community attribute to this neighbor\n"
6069 "Send Standard and Extended Community attributes\n"
6070 "Send Standard, Large and Extended Community attributes\n"
6071 "Send Extended Community attributes\n"
6072 "Send Standard Community attributes\n"
6073 "Send Large Community attributes\n")
6075 const char *type
= argv
[argc
- 1]->text
;
6076 char *peer_str
= argv
[2]->arg
;
6078 afi_t afi
= bgp_node_afi(vty
);
6079 safi_t safi
= bgp_node_safi(vty
);
6081 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
6083 return CMD_WARNING_CONFIG_FAILED
;
6085 if (strmatch(type
, "standard"))
6086 return peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
6087 PEER_FLAG_SEND_COMMUNITY
);
6089 if (strmatch(type
, "extended"))
6090 return peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
6091 PEER_FLAG_SEND_EXT_COMMUNITY
);
6093 if (strmatch(type
, "large"))
6094 return peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
6095 PEER_FLAG_SEND_LARGE_COMMUNITY
);
6097 if (strmatch(type
, "both")) {
6099 return peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
6100 PEER_FLAG_SEND_COMMUNITY
)
6101 | peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
6102 PEER_FLAG_SEND_EXT_COMMUNITY
);
6105 return peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
6106 PEER_FLAG_SEND_COMMUNITY
)
6107 | peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
6108 PEER_FLAG_SEND_EXT_COMMUNITY
)
6109 | peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
6110 PEER_FLAG_SEND_LARGE_COMMUNITY
);
6114 no_neighbor_send_community_type
,
6115 no_neighbor_send_community_type_hidden_cmd
,
6116 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
6117 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6118 "Send Community attribute to this neighbor\n"
6119 "Send Standard and Extended Community attributes\n"
6120 "Send Standard, Large and Extended Community attributes\n"
6121 "Send Extended Community attributes\n"
6122 "Send Standard Community attributes\n"
6123 "Send Large Community attributes\n")
6125 /* neighbor soft-reconfig. */
6126 DEFUN (neighbor_soft_reconfiguration
,
6127 neighbor_soft_reconfiguration_cmd
,
6128 "neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
6131 "Per neighbor soft reconfiguration\n"
6132 "Allow inbound soft reconfiguration for this neighbor\n")
6135 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
6137 PEER_FLAG_SOFT_RECONFIG
);
6140 ALIAS_HIDDEN(neighbor_soft_reconfiguration
,
6141 neighbor_soft_reconfiguration_hidden_cmd
,
6142 "neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
6143 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6144 "Per neighbor soft reconfiguration\n"
6145 "Allow inbound soft reconfiguration for this neighbor\n")
6147 DEFUN (no_neighbor_soft_reconfiguration
,
6148 no_neighbor_soft_reconfiguration_cmd
,
6149 "no neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
6153 "Per neighbor soft reconfiguration\n"
6154 "Allow inbound soft reconfiguration for this neighbor\n")
6157 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
6158 bgp_node_afi(vty
), bgp_node_safi(vty
),
6159 PEER_FLAG_SOFT_RECONFIG
);
6162 ALIAS_HIDDEN(no_neighbor_soft_reconfiguration
,
6163 no_neighbor_soft_reconfiguration_hidden_cmd
,
6164 "no neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
6165 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6166 "Per neighbor soft reconfiguration\n"
6167 "Allow inbound soft reconfiguration for this neighbor\n")
6169 DEFUN (neighbor_route_reflector_client
,
6170 neighbor_route_reflector_client_cmd
,
6171 "neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
6174 "Configure a neighbor as Route Reflector client\n")
6180 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6182 return CMD_WARNING_CONFIG_FAILED
;
6184 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
6186 PEER_FLAG_REFLECTOR_CLIENT
);
6189 ALIAS_HIDDEN(neighbor_route_reflector_client
,
6190 neighbor_route_reflector_client_hidden_cmd
,
6191 "neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
6192 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6193 "Configure a neighbor as Route Reflector client\n")
6195 DEFUN (no_neighbor_route_reflector_client
,
6196 no_neighbor_route_reflector_client_cmd
,
6197 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
6201 "Configure a neighbor as Route Reflector client\n")
6204 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
6205 bgp_node_afi(vty
), bgp_node_safi(vty
),
6206 PEER_FLAG_REFLECTOR_CLIENT
);
6209 ALIAS_HIDDEN(no_neighbor_route_reflector_client
,
6210 no_neighbor_route_reflector_client_hidden_cmd
,
6211 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
6212 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6213 "Configure a neighbor as Route Reflector client\n")
6215 /* optimal-route-reflection Root Routers configuration */
6216 DEFPY (optimal_route_reflection
,
6217 optimal_route_reflection_cmd
,
6218 "[no$no] optimal-route-reflection WORD$orr_group [<A.B.C.D|X:X::X:X>$primary [<A.B.C.D|X:X::X:X>$secondary [<A.B.C.D|X:X::X:X>$tertiary]]]",
6220 "Create ORR group and assign root router(s)\n"
6222 "Primary Root address\n"
6223 "Primary Root IPv6 address\n"
6224 "Secondary Root address\n"
6225 "Secondary Root IPv6 address\n"
6226 "Tertiary Root address\n"
6227 "Tertiary Root IPv6 address\n")
6229 if (!no
&& !primary
) {
6230 vty_out(vty
, "%% Specify Primary Root address\n");
6231 return CMD_WARNING_CONFIG_FAILED
;
6233 return bgp_afi_safi_orr_group_set_vty(
6234 vty
, bgp_node_afi(vty
), bgp_node_safi(vty
), orr_group
,
6235 primary_str
, secondary_str
, tertiary_str
, !!no
);
6238 /* neighbor optimal-route-reflection group*/
6239 DEFPY (neighbor_optimal_route_reflection
,
6240 neighbor_optimal_route_reflection_cmd
,
6241 "[no$no] neighbor <A.B.C.D|X:X::X:X|WORD>$neighbor optimal-route-reflection WORD$orr_group",
6245 "Apply ORR group configuration to the neighbor\n"
6248 return peer_orr_group_set_vty(vty
, neighbor
, bgp_node_afi(vty
),
6249 bgp_node_safi(vty
), orr_group
, !!no
);
6252 /* neighbor route-server-client. */
6253 DEFUN (neighbor_route_server_client
,
6254 neighbor_route_server_client_cmd
,
6255 "neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
6258 "Configure a neighbor as Route Server client\n")
6263 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6265 return CMD_WARNING_CONFIG_FAILED
;
6266 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
6268 PEER_FLAG_RSERVER_CLIENT
);
6271 ALIAS_HIDDEN(neighbor_route_server_client
,
6272 neighbor_route_server_client_hidden_cmd
,
6273 "neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
6274 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6275 "Configure a neighbor as Route Server client\n")
6277 DEFUN (no_neighbor_route_server_client
,
6278 no_neighbor_route_server_client_cmd
,
6279 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
6283 "Configure a neighbor as Route Server client\n")
6286 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
6287 bgp_node_afi(vty
), bgp_node_safi(vty
),
6288 PEER_FLAG_RSERVER_CLIENT
);
6291 ALIAS_HIDDEN(no_neighbor_route_server_client
,
6292 no_neighbor_route_server_client_hidden_cmd
,
6293 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
6294 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6295 "Configure a neighbor as Route Server client\n")
6297 DEFUN (neighbor_nexthop_local_unchanged
,
6298 neighbor_nexthop_local_unchanged_cmd
,
6299 "neighbor <A.B.C.D|X:X::X:X|WORD> nexthop-local unchanged",
6302 "Configure treatment of outgoing link-local nexthop attribute\n"
6303 "Leave link-local nexthop unchanged for this peer\n")
6306 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
6308 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
);
6311 DEFUN (no_neighbor_nexthop_local_unchanged
,
6312 no_neighbor_nexthop_local_unchanged_cmd
,
6313 "no neighbor <A.B.C.D|X:X::X:X|WORD> nexthop-local unchanged",
6317 "Configure treatment of outgoing link-local-nexthop attribute\n"
6318 "Leave link-local nexthop unchanged for this peer\n")
6321 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
6322 bgp_node_afi(vty
), bgp_node_safi(vty
),
6323 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
);
6326 DEFUN (neighbor_attr_unchanged
,
6327 neighbor_attr_unchanged_cmd
,
6328 "neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
6331 "BGP attribute is propagated unchanged to this neighbor\n"
6332 "As-path attribute\n"
6333 "Nexthop attribute\n"
6337 char *peer_str
= argv
[1]->arg
;
6339 bool aspath
= false;
6340 bool nexthop
= false;
6342 afi_t afi
= bgp_node_afi(vty
);
6343 safi_t safi
= bgp_node_safi(vty
);
6346 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
6348 return CMD_WARNING_CONFIG_FAILED
;
6350 if (argv_find(argv
, argc
, "as-path", &idx
))
6354 if (argv_find(argv
, argc
, "next-hop", &idx
))
6358 if (argv_find(argv
, argc
, "med", &idx
))
6361 /* no flags means all of them! */
6362 if (!aspath
&& !nexthop
&& !med
) {
6363 ret
= peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
,
6364 PEER_FLAG_AS_PATH_UNCHANGED
);
6365 ret
|= peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
,
6366 PEER_FLAG_NEXTHOP_UNCHANGED
);
6367 ret
|= peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
,
6368 PEER_FLAG_MED_UNCHANGED
);
6371 if (peer_af_flag_check(peer
, afi
, safi
,
6372 PEER_FLAG_AS_PATH_UNCHANGED
)) {
6373 ret
|= peer_af_flag_unset_vty(
6374 vty
, peer_str
, afi
, safi
,
6375 PEER_FLAG_AS_PATH_UNCHANGED
);
6378 ret
|= peer_af_flag_set_vty(
6379 vty
, peer_str
, afi
, safi
,
6380 PEER_FLAG_AS_PATH_UNCHANGED
);
6383 if (peer_af_flag_check(peer
, afi
, safi
,
6384 PEER_FLAG_NEXTHOP_UNCHANGED
)) {
6385 ret
|= peer_af_flag_unset_vty(
6386 vty
, peer_str
, afi
, safi
,
6387 PEER_FLAG_NEXTHOP_UNCHANGED
);
6390 ret
|= peer_af_flag_set_vty(
6391 vty
, peer_str
, afi
, safi
,
6392 PEER_FLAG_NEXTHOP_UNCHANGED
);
6395 if (peer_af_flag_check(peer
, afi
, safi
,
6396 PEER_FLAG_MED_UNCHANGED
)) {
6397 ret
|= peer_af_flag_unset_vty(
6398 vty
, peer_str
, afi
, safi
,
6399 PEER_FLAG_MED_UNCHANGED
);
6402 ret
|= peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
,
6403 PEER_FLAG_MED_UNCHANGED
);
6410 neighbor_attr_unchanged
, neighbor_attr_unchanged_hidden_cmd
,
6411 "neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
6412 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6413 "BGP attribute is propagated unchanged to this neighbor\n"
6414 "As-path attribute\n"
6415 "Nexthop attribute\n"
6418 DEFUN (no_neighbor_attr_unchanged
,
6419 no_neighbor_attr_unchanged_cmd
,
6420 "no neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
6424 "BGP attribute is propagated unchanged to this neighbor\n"
6425 "As-path attribute\n"
6426 "Nexthop attribute\n"
6430 char *peer_str
= argv
[2]->arg
;
6432 bool aspath
= false;
6433 bool nexthop
= false;
6435 afi_t afi
= bgp_node_afi(vty
);
6436 safi_t safi
= bgp_node_safi(vty
);
6439 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
6441 return CMD_WARNING_CONFIG_FAILED
;
6443 if (argv_find(argv
, argc
, "as-path", &idx
))
6447 if (argv_find(argv
, argc
, "next-hop", &idx
))
6451 if (argv_find(argv
, argc
, "med", &idx
))
6454 if (!aspath
&& !nexthop
&& !med
) // no flags means all of them!
6455 return peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
6456 PEER_FLAG_AS_PATH_UNCHANGED
)
6457 | peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
6458 PEER_FLAG_NEXTHOP_UNCHANGED
)
6459 | peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
6460 PEER_FLAG_MED_UNCHANGED
);
6463 ret
|= peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
6464 PEER_FLAG_AS_PATH_UNCHANGED
);
6467 ret
|= peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
6468 PEER_FLAG_NEXTHOP_UNCHANGED
);
6471 ret
|= peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
6472 PEER_FLAG_MED_UNCHANGED
);
6478 no_neighbor_attr_unchanged
, no_neighbor_attr_unchanged_hidden_cmd
,
6479 "no neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
6480 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6481 "BGP attribute is propagated unchanged to this neighbor\n"
6482 "As-path attribute\n"
6483 "Nexthop attribute\n"
6486 /* EBGP multihop configuration. */
6487 static int peer_ebgp_multihop_set_vty(struct vty
*vty
, const char *ip_str
,
6488 const char *ttl_str
)
6493 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
6495 return CMD_WARNING_CONFIG_FAILED
;
6498 return bgp_vty_return(vty
, BGP_ERR_INVALID_FOR_DIRECT_PEER
);
6503 ttl
= strtoul(ttl_str
, NULL
, 10);
6505 return bgp_vty_return(vty
, peer_ebgp_multihop_set(peer
, ttl
));
6508 static int peer_ebgp_multihop_unset_vty(struct vty
*vty
, const char *ip_str
)
6512 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
6514 return CMD_WARNING_CONFIG_FAILED
;
6516 return bgp_vty_return(vty
, peer_ebgp_multihop_unset(peer
));
6519 /* neighbor ebgp-multihop. */
6520 DEFUN (neighbor_ebgp_multihop
,
6521 neighbor_ebgp_multihop_cmd
,
6522 "neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop",
6525 "Allow EBGP neighbors not on directly connected networks\n")
6528 return peer_ebgp_multihop_set_vty(vty
, argv
[idx_peer
]->arg
, NULL
);
6531 DEFUN (neighbor_ebgp_multihop_ttl
,
6532 neighbor_ebgp_multihop_ttl_cmd
,
6533 "neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop (1-255)",
6536 "Allow EBGP neighbors not on directly connected networks\n"
6537 "maximum hop count\n")
6541 return peer_ebgp_multihop_set_vty(vty
, argv
[idx_peer
]->arg
,
6542 argv
[idx_number
]->arg
);
6545 DEFUN (no_neighbor_ebgp_multihop
,
6546 no_neighbor_ebgp_multihop_cmd
,
6547 "no neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop [(1-255)]",
6551 "Allow EBGP neighbors not on directly connected networks\n"
6552 "maximum hop count\n")
6555 return peer_ebgp_multihop_unset_vty(vty
, argv
[idx_peer
]->arg
);
6558 static uint8_t get_role_by_name(const char *role_str
)
6560 if (strncmp(role_str
, "peer", 2) == 0)
6562 if (strncmp(role_str
, "provider", 2) == 0)
6563 return ROLE_PROVIDER
;
6564 if (strncmp(role_str
, "customer", 2) == 0)
6565 return ROLE_CUSTOMER
;
6566 if (strncmp(role_str
, "rs-server", 4) == 0)
6567 return ROLE_RS_SERVER
;
6568 if (strncmp(role_str
, "rs-client", 4) == 0)
6569 return ROLE_RS_CLIENT
;
6570 return ROLE_UNDEFINED
;
6573 static int peer_role_set_vty(struct vty
*vty
, const char *ip_str
,
6574 const char *role_str
, bool strict_mode
)
6578 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
6580 return CMD_WARNING_CONFIG_FAILED
;
6581 uint8_t role
= get_role_by_name(role_str
);
6583 if (role
== ROLE_UNDEFINED
)
6584 return bgp_vty_return(vty
, BGP_ERR_INVALID_ROLE_NAME
);
6585 return bgp_vty_return(vty
, peer_role_set(peer
, role
, strict_mode
));
6588 static int peer_role_unset_vty(struct vty
*vty
, const char *ip_str
)
6592 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
6594 return CMD_WARNING_CONFIG_FAILED
;
6595 return bgp_vty_return(vty
, peer_role_unset(peer
));
6598 DEFPY(neighbor_role
,
6600 "neighbor <A.B.C.D|X:X::X:X|WORD> local-role <provider|rs-server|rs-client|customer|peer>",
6603 "Set session role\n"
6609 return peer_role_set_vty(vty
, argv
[idx_peer
]->arg
, argv
[idx_role
]->arg
,
6613 DEFPY(neighbor_role_strict
,
6614 neighbor_role_strict_cmd
,
6615 "neighbor <A.B.C.D|X:X::X:X|WORD> local-role <provider|rs-server|rs-client|customer|peer> strict-mode",
6618 "Set session role\n"
6620 "Use additional restriction on peer\n")
6625 return peer_role_set_vty(vty
, argv
[idx_peer
]->arg
, argv
[idx_role
]->arg
,
6629 DEFPY(no_neighbor_role
,
6630 no_neighbor_role_cmd
,
6631 "no neighbor <A.B.C.D|X:X::X:X|WORD> local-role <provider|rs-server|rs-client|customer|peer> [strict-mode]",
6635 "Set session role\n"
6637 "Use additional restriction on peer\n")
6641 return peer_role_unset_vty(vty
, argv
[idx_peer
]->arg
);
6644 /* disable-connected-check */
6645 DEFUN (neighbor_disable_connected_check
,
6646 neighbor_disable_connected_check_cmd
,
6647 "neighbor <A.B.C.D|X:X::X:X|WORD> <disable-connected-check|enforce-multihop>",
6650 "one-hop away EBGP peer using loopback address\n"
6651 "Enforce EBGP neighbors perform multihop\n")
6654 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
6655 PEER_FLAG_DISABLE_CONNECTED_CHECK
);
6658 DEFUN (no_neighbor_disable_connected_check
,
6659 no_neighbor_disable_connected_check_cmd
,
6660 "no neighbor <A.B.C.D|X:X::X:X|WORD> <disable-connected-check|enforce-multihop>",
6664 "one-hop away EBGP peer using loopback address\n"
6665 "Enforce EBGP neighbors perform multihop\n")
6668 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
6669 PEER_FLAG_DISABLE_CONNECTED_CHECK
);
6672 /* disable-link-bw-encoding-ieee */
6673 DEFUN(neighbor_disable_link_bw_encoding_ieee
,
6674 neighbor_disable_link_bw_encoding_ieee_cmd
,
6675 "neighbor <A.B.C.D|X:X::X:X|WORD> disable-link-bw-encoding-ieee",
6676 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6677 "Disable IEEE floating-point encoding for extended community bandwidth\n")
6681 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
6682 PEER_FLAG_DISABLE_LINK_BW_ENCODING_IEEE
);
6685 DEFUN(no_neighbor_disable_link_bw_encoding_ieee
,
6686 no_neighbor_disable_link_bw_encoding_ieee_cmd
,
6687 "no neighbor <A.B.C.D|X:X::X:X|WORD> disable-link-bw-encoding-ieee",
6688 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6689 "Disable IEEE floating-point encoding for extended community bandwidth\n")
6693 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
6694 PEER_FLAG_DISABLE_LINK_BW_ENCODING_IEEE
);
6697 /* extended-optional-parameters */
6698 DEFUN(neighbor_extended_optional_parameters
,
6699 neighbor_extended_optional_parameters_cmd
,
6700 "neighbor <A.B.C.D|X:X::X:X|WORD> extended-optional-parameters",
6701 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6702 "Force the extended optional parameters format for OPEN messages\n")
6706 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
6707 PEER_FLAG_EXTENDED_OPT_PARAMS
);
6710 DEFUN(no_neighbor_extended_optional_parameters
,
6711 no_neighbor_extended_optional_parameters_cmd
,
6712 "no neighbor <A.B.C.D|X:X::X:X|WORD> extended-optional-parameters",
6713 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6714 "Force the extended optional parameters format for OPEN messages\n")
6718 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
6719 PEER_FLAG_EXTENDED_OPT_PARAMS
);
6722 /* enforce-first-as */
6723 DEFUN (neighbor_enforce_first_as
,
6724 neighbor_enforce_first_as_cmd
,
6725 "neighbor <A.B.C.D|X:X::X:X|WORD> enforce-first-as",
6728 "Enforce the first AS for EBGP routes\n")
6732 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
6733 PEER_FLAG_ENFORCE_FIRST_AS
);
6736 DEFUN (no_neighbor_enforce_first_as
,
6737 no_neighbor_enforce_first_as_cmd
,
6738 "no neighbor <A.B.C.D|X:X::X:X|WORD> enforce-first-as",
6742 "Enforce the first AS for EBGP routes\n")
6746 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
6747 PEER_FLAG_ENFORCE_FIRST_AS
);
6751 DEFUN (neighbor_description
,
6752 neighbor_description_cmd
,
6753 "neighbor <A.B.C.D|X:X::X:X|WORD> description LINE...",
6756 "Neighbor specific description\n"
6757 "Up to 80 characters describing this neighbor\n")
6764 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6766 return CMD_WARNING_CONFIG_FAILED
;
6768 str
= argv_concat(argv
, argc
, idx_line
);
6770 peer_description_set(peer
, str
);
6772 XFREE(MTYPE_TMP
, str
);
6777 DEFUN (no_neighbor_description
,
6778 no_neighbor_description_cmd
,
6779 "no neighbor <A.B.C.D|X:X::X:X|WORD> description",
6783 "Neighbor specific description\n")
6788 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6790 return CMD_WARNING_CONFIG_FAILED
;
6792 peer_description_unset(peer
);
6797 ALIAS(no_neighbor_description
, no_neighbor_description_comment_cmd
,
6798 "no neighbor <A.B.C.D|X:X::X:X|WORD> description LINE...",
6799 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6800 "Neighbor specific description\n"
6801 "Up to 80 characters describing this neighbor\n")
6803 /* Neighbor update-source. */
6804 static int peer_update_source_vty(struct vty
*vty
, const char *peer_str
,
6805 const char *source_str
)
6811 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
6813 return CMD_WARNING_CONFIG_FAILED
;
6819 if (str2sockunion(source_str
, &su
) == 0)
6820 peer_update_source_addr_set(peer
, &su
);
6822 if (str2prefix(source_str
, &p
)) {
6824 "%% Invalid update-source, remove prefix length \n");
6825 return CMD_WARNING_CONFIG_FAILED
;
6827 peer_update_source_if_set(peer
, source_str
);
6830 peer_update_source_unset(peer
);
6835 #define BGP_UPDATE_SOURCE_HELP_STR \
6838 "Interface name (requires zebra to be running)\n"
6840 DEFUN (neighbor_update_source
,
6841 neighbor_update_source_cmd
,
6842 "neighbor <A.B.C.D|X:X::X:X|WORD> update-source <A.B.C.D|X:X::X:X|WORD>",
6845 "Source of routing updates\n"
6846 BGP_UPDATE_SOURCE_HELP_STR
)
6850 return peer_update_source_vty(vty
, argv
[idx_peer
]->arg
,
6851 argv
[idx_peer_2
]->arg
);
6854 DEFUN (no_neighbor_update_source
,
6855 no_neighbor_update_source_cmd
,
6856 "no neighbor <A.B.C.D|X:X::X:X|WORD> update-source [<A.B.C.D|X:X::X:X|WORD>]",
6860 "Source of routing updates\n"
6861 BGP_UPDATE_SOURCE_HELP_STR
)
6864 return peer_update_source_vty(vty
, argv
[idx_peer
]->arg
, NULL
);
6867 static int peer_default_originate_set_vty(struct vty
*vty
, const char *peer_str
,
6868 afi_t afi
, safi_t safi
,
6869 const char *rmap
, int set
)
6873 struct route_map
*route_map
= NULL
;
6875 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
6877 return CMD_WARNING_CONFIG_FAILED
;
6881 route_map
= route_map_lookup_warn_noexist(vty
, rmap
);
6882 ret
= peer_default_originate_set(peer
, afi
, safi
,
6885 ret
= peer_default_originate_unset(peer
, afi
, safi
);
6887 return bgp_vty_return(vty
, ret
);
6890 /* neighbor default-originate. */
6891 DEFUN (neighbor_default_originate
,
6892 neighbor_default_originate_cmd
,
6893 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate",
6896 "Originate default route to this neighbor\n")
6899 return peer_default_originate_set_vty(vty
, argv
[idx_peer
]->arg
,
6901 bgp_node_safi(vty
), NULL
, 1);
6904 ALIAS_HIDDEN(neighbor_default_originate
, neighbor_default_originate_hidden_cmd
,
6905 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate",
6906 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6907 "Originate default route to this neighbor\n")
6909 DEFUN (neighbor_default_originate_rmap
,
6910 neighbor_default_originate_rmap_cmd
,
6911 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate route-map RMAP_NAME",
6914 "Originate default route to this neighbor\n"
6915 "Route-map to specify criteria to originate default\n"
6920 return peer_default_originate_set_vty(
6921 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6922 argv
[idx_word
]->arg
, 1);
6926 neighbor_default_originate_rmap
,
6927 neighbor_default_originate_rmap_hidden_cmd
,
6928 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate route-map RMAP_NAME",
6929 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6930 "Originate default route to this neighbor\n"
6931 "Route-map to specify criteria to originate default\n"
6934 DEFUN (no_neighbor_default_originate
,
6935 no_neighbor_default_originate_cmd
,
6936 "no neighbor <A.B.C.D|X:X::X:X|WORD> default-originate [route-map RMAP_NAME]",
6940 "Originate default route to this neighbor\n"
6941 "Route-map to specify criteria to originate default\n"
6945 return peer_default_originate_set_vty(vty
, argv
[idx_peer
]->arg
,
6947 bgp_node_safi(vty
), NULL
, 0);
6951 no_neighbor_default_originate
, no_neighbor_default_originate_hidden_cmd
,
6952 "no neighbor <A.B.C.D|X:X::X:X|WORD> default-originate [route-map RMAP_NAME]",
6953 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6954 "Originate default route to this neighbor\n"
6955 "Route-map to specify criteria to originate default\n"
6959 /* Set neighbor's BGP port. */
6960 static int peer_port_vty(struct vty
*vty
, const char *ip_str
, int afi
,
6961 const char *port_str
)
6967 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
6969 return CMD_WARNING_CONFIG_FAILED
;
6972 sp
= getservbyname("bgp", "tcp");
6973 port
= (sp
== NULL
) ? BGP_PORT_DEFAULT
: ntohs(sp
->s_port
);
6975 port
= strtoul(port_str
, NULL
, 10);
6978 peer_port_set(peer
, port
);
6983 /* Set specified peer's BGP port. */
6984 DEFUN (neighbor_port
,
6986 "neighbor <A.B.C.D|X:X::X:X|WORD> port (0-65535)",
6989 "Neighbor's BGP port\n"
6990 "TCP port number\n")
6994 return peer_port_vty(vty
, argv
[idx_ip
]->arg
, AFI_IP
,
6995 argv
[idx_number
]->arg
);
6998 DEFUN (no_neighbor_port
,
6999 no_neighbor_port_cmd
,
7000 "no neighbor <A.B.C.D|X:X::X:X|WORD> port [(0-65535)]",
7004 "Neighbor's BGP port\n"
7005 "TCP port number\n")
7008 return peer_port_vty(vty
, argv
[idx_ip
]->arg
, AFI_IP
, NULL
);
7012 /* neighbor weight. */
7013 static int peer_weight_set_vty(struct vty
*vty
, const char *ip_str
, afi_t afi
,
7014 safi_t safi
, const char *weight_str
)
7018 unsigned long weight
;
7020 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
7022 return CMD_WARNING_CONFIG_FAILED
;
7024 weight
= strtoul(weight_str
, NULL
, 10);
7026 ret
= peer_weight_set(peer
, afi
, safi
, weight
);
7027 return bgp_vty_return(vty
, ret
);
7030 static int peer_weight_unset_vty(struct vty
*vty
, const char *ip_str
, afi_t afi
,
7036 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
7038 return CMD_WARNING_CONFIG_FAILED
;
7040 ret
= peer_weight_unset(peer
, afi
, safi
);
7041 return bgp_vty_return(vty
, ret
);
7044 DEFUN (neighbor_weight
,
7045 neighbor_weight_cmd
,
7046 "neighbor <A.B.C.D|X:X::X:X|WORD> weight (0-65535)",
7049 "Set default weight for routes from this neighbor\n"
7054 return peer_weight_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
7055 bgp_node_safi(vty
), argv
[idx_number
]->arg
);
7058 ALIAS_HIDDEN(neighbor_weight
, neighbor_weight_hidden_cmd
,
7059 "neighbor <A.B.C.D|X:X::X:X|WORD> weight (0-65535)",
7060 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7061 "Set default weight for routes from this neighbor\n"
7064 DEFUN (no_neighbor_weight
,
7065 no_neighbor_weight_cmd
,
7066 "no neighbor <A.B.C.D|X:X::X:X|WORD> weight [(0-65535)]",
7070 "Set default weight for routes from this neighbor\n"
7074 return peer_weight_unset_vty(vty
, argv
[idx_peer
]->arg
,
7075 bgp_node_afi(vty
), bgp_node_safi(vty
));
7078 ALIAS_HIDDEN(no_neighbor_weight
, no_neighbor_weight_hidden_cmd
,
7079 "no neighbor <A.B.C.D|X:X::X:X|WORD> weight [(0-65535)]",
7080 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7081 "Set default weight for routes from this neighbor\n"
7085 /* Override capability negotiation. */
7086 DEFUN (neighbor_override_capability
,
7087 neighbor_override_capability_cmd
,
7088 "neighbor <A.B.C.D|X:X::X:X|WORD> override-capability",
7091 "Override capability negotiation result\n")
7094 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
7095 PEER_FLAG_OVERRIDE_CAPABILITY
);
7098 DEFUN (no_neighbor_override_capability
,
7099 no_neighbor_override_capability_cmd
,
7100 "no neighbor <A.B.C.D|X:X::X:X|WORD> override-capability",
7104 "Override capability negotiation result\n")
7107 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
7108 PEER_FLAG_OVERRIDE_CAPABILITY
);
7111 DEFUN (neighbor_strict_capability
,
7112 neighbor_strict_capability_cmd
,
7113 "neighbor <A.B.C.D|X:X::X:X|WORD> strict-capability-match",
7116 "Strict capability negotiation match\n")
7120 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
7121 PEER_FLAG_STRICT_CAP_MATCH
);
7124 DEFUN (no_neighbor_strict_capability
,
7125 no_neighbor_strict_capability_cmd
,
7126 "no neighbor <A.B.C.D|X:X::X:X|WORD> strict-capability-match",
7130 "Strict capability negotiation match\n")
7134 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
7135 PEER_FLAG_STRICT_CAP_MATCH
);
7138 static int peer_timers_set_vty(struct vty
*vty
, const char *ip_str
,
7139 const char *keep_str
, const char *hold_str
)
7146 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
7148 return CMD_WARNING_CONFIG_FAILED
;
7150 keepalive
= strtoul(keep_str
, NULL
, 10);
7151 holdtime
= strtoul(hold_str
, NULL
, 10);
7153 ret
= peer_timers_set(peer
, keepalive
, holdtime
);
7155 return bgp_vty_return(vty
, ret
);
7158 static int peer_timers_unset_vty(struct vty
*vty
, const char *ip_str
)
7163 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
7165 return CMD_WARNING_CONFIG_FAILED
;
7167 ret
= peer_timers_unset(peer
);
7169 return bgp_vty_return(vty
, ret
);
7172 DEFUN (neighbor_timers
,
7173 neighbor_timers_cmd
,
7174 "neighbor <A.B.C.D|X:X::X:X|WORD> timers (0-65535) (0-65535)",
7177 "BGP per neighbor timers\n"
7178 "Keepalive interval\n"
7183 int idx_number_2
= 4;
7184 return peer_timers_set_vty(vty
, argv
[idx_peer
]->arg
,
7185 argv
[idx_number
]->arg
,
7186 argv
[idx_number_2
]->arg
);
7189 DEFUN (no_neighbor_timers
,
7190 no_neighbor_timers_cmd
,
7191 "no neighbor <A.B.C.D|X:X::X:X|WORD> timers [(0-65535) (0-65535)]",
7195 "BGP per neighbor timers\n"
7196 "Keepalive interval\n"
7200 return peer_timers_unset_vty(vty
, argv
[idx_peer
]->arg
);
7204 static int peer_timers_connect_set_vty(struct vty
*vty
, const char *ip_str
,
7205 const char *time_str
)
7211 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
7213 return CMD_WARNING_CONFIG_FAILED
;
7215 connect
= strtoul(time_str
, NULL
, 10);
7217 ret
= peer_timers_connect_set(peer
, connect
);
7219 return bgp_vty_return(vty
, ret
);
7222 static int peer_timers_connect_unset_vty(struct vty
*vty
, const char *ip_str
)
7227 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
7229 return CMD_WARNING_CONFIG_FAILED
;
7231 ret
= peer_timers_connect_unset(peer
);
7233 return bgp_vty_return(vty
, ret
);
7236 DEFUN (neighbor_timers_connect
,
7237 neighbor_timers_connect_cmd
,
7238 "neighbor <A.B.C.D|X:X::X:X|WORD> timers connect (1-65535)",
7241 "BGP per neighbor timers\n"
7242 "BGP connect timer\n"
7247 return peer_timers_connect_set_vty(vty
, argv
[idx_peer
]->arg
,
7248 argv
[idx_number
]->arg
);
7251 DEFUN (no_neighbor_timers_connect
,
7252 no_neighbor_timers_connect_cmd
,
7253 "no neighbor <A.B.C.D|X:X::X:X|WORD> timers connect [(1-65535)]",
7257 "BGP per neighbor timers\n"
7258 "BGP connect timer\n"
7262 return peer_timers_connect_unset_vty(vty
, argv
[idx_peer
]->arg
);
7265 DEFPY (neighbor_timers_delayopen
,
7266 neighbor_timers_delayopen_cmd
,
7267 "neighbor <A.B.C.D|X:X::X:X|WORD>$neighbor timers delayopen (1-240)$interval",
7270 "BGP per neighbor timers\n"
7271 "RFC 4271 DelayOpenTimer\n"
7272 "DelayOpenTime timer interval\n")
7276 peer
= peer_and_group_lookup_vty(vty
, neighbor
);
7278 return CMD_WARNING_CONFIG_FAILED
;
7281 if (peer_timers_delayopen_unset(peer
))
7282 return CMD_WARNING_CONFIG_FAILED
;
7284 if (peer_timers_delayopen_set(peer
, interval
))
7285 return CMD_WARNING_CONFIG_FAILED
;
7291 DEFPY (no_neighbor_timers_delayopen
,
7292 no_neighbor_timers_delayopen_cmd
,
7293 "no neighbor <A.B.C.D|X:X::X:X|WORD>$neighbor timers delayopen [(0-65535)]",
7297 "BGP per neighbor timers\n"
7298 "RFC 4271 DelayOpenTimer\n"
7299 "DelayOpenTime timer interval\n")
7303 peer
= peer_and_group_lookup_vty(vty
, neighbor
);
7305 return CMD_WARNING_CONFIG_FAILED
;
7307 if (peer_timers_delayopen_unset(peer
))
7308 return CMD_WARNING_CONFIG_FAILED
;
7313 static int peer_advertise_interval_vty(struct vty
*vty
, const char *ip_str
,
7314 const char *time_str
, int set
)
7318 uint32_t routeadv
= 0;
7320 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
7322 return CMD_WARNING_CONFIG_FAILED
;
7325 routeadv
= strtoul(time_str
, NULL
, 10);
7328 ret
= peer_advertise_interval_set(peer
, routeadv
);
7330 ret
= peer_advertise_interval_unset(peer
);
7332 return bgp_vty_return(vty
, ret
);
7335 DEFUN (neighbor_advertise_interval
,
7336 neighbor_advertise_interval_cmd
,
7337 "neighbor <A.B.C.D|X:X::X:X|WORD> advertisement-interval (0-600)",
7340 "Minimum interval between sending BGP routing updates\n"
7341 "time in seconds\n")
7345 return peer_advertise_interval_vty(vty
, argv
[idx_peer
]->arg
,
7346 argv
[idx_number
]->arg
, 1);
7349 DEFUN (no_neighbor_advertise_interval
,
7350 no_neighbor_advertise_interval_cmd
,
7351 "no neighbor <A.B.C.D|X:X::X:X|WORD> advertisement-interval [(0-600)]",
7355 "Minimum interval between sending BGP routing updates\n"
7356 "time in seconds\n")
7359 return peer_advertise_interval_vty(vty
, argv
[idx_peer
]->arg
, NULL
, 0);
7363 /* Time to wait before processing route-map updates */
7364 DEFUN (bgp_set_route_map_delay_timer
,
7365 bgp_set_route_map_delay_timer_cmd
,
7366 "bgp route-map delay-timer (0-600)",
7368 "BGP route-map delay timer\n"
7369 "Time in secs to wait before processing route-map changes\n"
7370 "0 disables the timer, no route updates happen when route-maps change\n")
7373 uint32_t rmap_delay_timer
;
7375 if (argv
[idx_number
]->arg
) {
7376 rmap_delay_timer
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
7377 bm
->rmap_update_timer
= rmap_delay_timer
;
7379 /* if the dynamic update handling is being disabled, and a timer
7381 * running, stop the timer and act as if the timer has already
7384 if (!rmap_delay_timer
&& bm
->t_rmap_update
) {
7385 THREAD_OFF(bm
->t_rmap_update
);
7386 thread_execute(bm
->master
, bgp_route_map_update_timer
,
7391 vty_out(vty
, "%% BGP invalid route-map delay-timer\n");
7392 return CMD_WARNING_CONFIG_FAILED
;
7396 DEFUN (no_bgp_set_route_map_delay_timer
,
7397 no_bgp_set_route_map_delay_timer_cmd
,
7398 "no bgp route-map delay-timer [(0-600)]",
7401 "Default BGP route-map delay timer\n"
7402 "Reset to default time to wait for processing route-map changes\n"
7403 "0 disables the timer, no route updates happen when route-maps change\n")
7406 bm
->rmap_update_timer
= RMAP_DEFAULT_UPDATE_TIMER
;
7411 /* neighbor interface */
7412 static int peer_interface_vty(struct vty
*vty
, const char *ip_str
,
7417 peer
= peer_lookup_vty(vty
, ip_str
);
7418 if (!peer
|| peer
->conf_if
) {
7419 vty_out(vty
, "%% BGP invalid peer %s\n", ip_str
);
7420 return CMD_WARNING_CONFIG_FAILED
;
7424 peer_interface_set(peer
, str
);
7426 peer_interface_unset(peer
);
7431 DEFUN (neighbor_interface
,
7432 neighbor_interface_cmd
,
7433 "neighbor <A.B.C.D|X:X::X:X> interface WORD",
7442 return peer_interface_vty(vty
, argv
[idx_ip
]->arg
, argv
[idx_word
]->arg
);
7445 DEFUN (no_neighbor_interface
,
7446 no_neighbor_interface_cmd
,
7447 "no neighbor <A.B.C.D|X:X::X:X> interface WORD",
7456 return peer_interface_vty(vty
, argv
[idx_peer
]->arg
, NULL
);
7459 DEFUN (neighbor_distribute_list
,
7460 neighbor_distribute_list_cmd
,
7461 "neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list ACCESSLIST_NAME <in|out>",
7464 "Filter updates to/from this neighbor\n"
7465 "IP Access-list name\n"
7466 "Filter incoming updates\n"
7467 "Filter outgoing updates\n")
7474 const char *pstr
= argv
[idx_peer
]->arg
;
7475 const char *acl
= argv
[idx_acl
]->arg
;
7476 const char *inout
= argv
[argc
- 1]->text
;
7478 peer
= peer_and_group_lookup_vty(vty
, pstr
);
7480 return CMD_WARNING_CONFIG_FAILED
;
7482 /* Check filter direction. */
7483 direct
= strmatch(inout
, "in") ? FILTER_IN
: FILTER_OUT
;
7484 ret
= peer_distribute_set(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
7487 return bgp_vty_return(vty
, ret
);
7491 neighbor_distribute_list
, neighbor_distribute_list_hidden_cmd
,
7492 "neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list ACCESSLIST_NAME <in|out>",
7493 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7494 "Filter updates to/from this neighbor\n"
7495 "IP Access-list name\n"
7496 "Filter incoming updates\n"
7497 "Filter outgoing updates\n")
7499 DEFUN (no_neighbor_distribute_list
,
7500 no_neighbor_distribute_list_cmd
,
7501 "no neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list ACCESSLIST_NAME <in|out>",
7505 "Filter updates to/from this neighbor\n"
7506 "IP Access-list name\n"
7507 "Filter incoming updates\n"
7508 "Filter outgoing updates\n")
7514 const char *pstr
= argv
[idx_peer
]->arg
;
7515 const char *inout
= argv
[argc
- 1]->text
;
7517 peer
= peer_and_group_lookup_vty(vty
, pstr
);
7519 return CMD_WARNING_CONFIG_FAILED
;
7521 /* Check filter direction. */
7522 direct
= strmatch(inout
, "in") ? FILTER_IN
: FILTER_OUT
;
7523 ret
= peer_distribute_unset(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
7526 return bgp_vty_return(vty
, ret
);
7530 no_neighbor_distribute_list
, no_neighbor_distribute_list_hidden_cmd
,
7531 "no neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list ACCESSLIST_NAME <in|out>",
7532 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7533 "Filter updates to/from this neighbor\n"
7534 "IP Access-list name\n"
7535 "Filter incoming updates\n"
7536 "Filter outgoing updates\n")
7538 /* Set prefix list to the peer. */
7539 static int peer_prefix_list_set_vty(struct vty
*vty
, const char *ip_str
,
7540 afi_t afi
, safi_t safi
,
7541 const char *name_str
,
7542 const char *direct_str
)
7545 int direct
= FILTER_IN
;
7548 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
7550 return CMD_WARNING_CONFIG_FAILED
;
7552 /* Check filter direction. */
7553 if (strncmp(direct_str
, "i", 1) == 0)
7555 else if (strncmp(direct_str
, "o", 1) == 0)
7556 direct
= FILTER_OUT
;
7558 ret
= peer_prefix_list_set(peer
, afi
, safi
, direct
, name_str
);
7560 return bgp_vty_return(vty
, ret
);
7563 static int peer_prefix_list_unset_vty(struct vty
*vty
, const char *ip_str
,
7564 afi_t afi
, safi_t safi
,
7565 const char *direct_str
)
7569 int direct
= FILTER_IN
;
7571 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
7573 return CMD_WARNING_CONFIG_FAILED
;
7575 /* Check filter direction. */
7576 if (strncmp(direct_str
, "i", 1) == 0)
7578 else if (strncmp(direct_str
, "o", 1) == 0)
7579 direct
= FILTER_OUT
;
7581 ret
= peer_prefix_list_unset(peer
, afi
, safi
, direct
);
7583 return bgp_vty_return(vty
, ret
);
7586 DEFUN (neighbor_prefix_list
,
7587 neighbor_prefix_list_cmd
,
7588 "neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
7591 "Filter updates to/from this neighbor\n"
7592 "Name of a prefix list\n"
7593 "Filter incoming updates\n"
7594 "Filter outgoing updates\n")
7599 return peer_prefix_list_set_vty(
7600 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
7601 argv
[idx_word
]->arg
, argv
[idx_in_out
]->arg
);
7604 ALIAS_HIDDEN(neighbor_prefix_list
, neighbor_prefix_list_hidden_cmd
,
7605 "neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
7606 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7607 "Filter updates to/from this neighbor\n"
7608 "Name of a prefix list\n"
7609 "Filter incoming updates\n"
7610 "Filter outgoing updates\n")
7612 DEFUN (no_neighbor_prefix_list
,
7613 no_neighbor_prefix_list_cmd
,
7614 "no neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
7618 "Filter updates to/from this neighbor\n"
7619 "Name of a prefix list\n"
7620 "Filter incoming updates\n"
7621 "Filter outgoing updates\n")
7625 return peer_prefix_list_unset_vty(vty
, argv
[idx_peer
]->arg
,
7626 bgp_node_afi(vty
), bgp_node_safi(vty
),
7627 argv
[idx_in_out
]->arg
);
7630 ALIAS_HIDDEN(no_neighbor_prefix_list
, no_neighbor_prefix_list_hidden_cmd
,
7631 "no neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
7632 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7633 "Filter updates to/from this neighbor\n"
7634 "Name of a prefix list\n"
7635 "Filter incoming updates\n"
7636 "Filter outgoing updates\n")
7638 static int peer_aslist_set_vty(struct vty
*vty
, const char *ip_str
, afi_t afi
,
7639 safi_t safi
, const char *name_str
,
7640 const char *direct_str
)
7644 int direct
= FILTER_IN
;
7646 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
7648 return CMD_WARNING_CONFIG_FAILED
;
7650 /* Check filter direction. */
7651 if (strncmp(direct_str
, "i", 1) == 0)
7653 else if (strncmp(direct_str
, "o", 1) == 0)
7654 direct
= FILTER_OUT
;
7656 ret
= peer_aslist_set(peer
, afi
, safi
, direct
, name_str
);
7658 return bgp_vty_return(vty
, ret
);
7661 static int peer_aslist_unset_vty(struct vty
*vty
, const char *ip_str
, afi_t afi
,
7662 safi_t safi
, const char *direct_str
)
7666 int direct
= FILTER_IN
;
7668 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
7670 return CMD_WARNING_CONFIG_FAILED
;
7672 /* Check filter direction. */
7673 if (strncmp(direct_str
, "i", 1) == 0)
7675 else if (strncmp(direct_str
, "o", 1) == 0)
7676 direct
= FILTER_OUT
;
7678 ret
= peer_aslist_unset(peer
, afi
, safi
, direct
);
7680 return bgp_vty_return(vty
, ret
);
7683 DEFUN (neighbor_filter_list
,
7684 neighbor_filter_list_cmd
,
7685 "neighbor <A.B.C.D|X:X::X:X|WORD> filter-list AS_PATH_FILTER_NAME <in|out>",
7688 "Establish BGP filters\n"
7689 "AS path access-list name\n"
7690 "Filter incoming routes\n"
7691 "Filter outgoing routes\n")
7696 return peer_aslist_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
7697 bgp_node_safi(vty
), argv
[idx_word
]->arg
,
7698 argv
[idx_in_out
]->arg
);
7701 ALIAS_HIDDEN(neighbor_filter_list
, neighbor_filter_list_hidden_cmd
,
7702 "neighbor <A.B.C.D|X:X::X:X|WORD> filter-list AS_PATH_FILTER_NAME <in|out>",
7703 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7704 "Establish BGP filters\n"
7705 "AS path access-list name\n"
7706 "Filter incoming routes\n"
7707 "Filter outgoing routes\n")
7709 DEFUN (no_neighbor_filter_list
,
7710 no_neighbor_filter_list_cmd
,
7711 "no neighbor <A.B.C.D|X:X::X:X|WORD> filter-list AS_PATH_FILTER_NAME <in|out>",
7715 "Establish BGP filters\n"
7716 "AS path access-list name\n"
7717 "Filter incoming routes\n"
7718 "Filter outgoing routes\n")
7722 return peer_aslist_unset_vty(vty
, argv
[idx_peer
]->arg
,
7723 bgp_node_afi(vty
), bgp_node_safi(vty
),
7724 argv
[idx_in_out
]->arg
);
7727 ALIAS_HIDDEN(no_neighbor_filter_list
, no_neighbor_filter_list_hidden_cmd
,
7728 "no neighbor <A.B.C.D|X:X::X:X|WORD> filter-list AS_PATH_FILTER_NAME <in|out>",
7729 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7730 "Establish BGP filters\n"
7731 "AS path access-list name\n"
7732 "Filter incoming routes\n"
7733 "Filter outgoing routes\n")
7735 /* Set advertise-map to the peer. */
7736 static int peer_advertise_map_set_vty(struct vty
*vty
, const char *ip_str
,
7737 afi_t afi
, safi_t safi
,
7738 const char *advertise_str
,
7739 const char *condition_str
, bool condition
,
7742 int ret
= CMD_WARNING_CONFIG_FAILED
;
7744 struct route_map
*advertise_map
;
7745 struct route_map
*condition_map
;
7747 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
7751 condition_map
= route_map_lookup_warn_noexist(vty
, condition_str
);
7752 advertise_map
= route_map_lookup_warn_noexist(vty
, advertise_str
);
7755 ret
= peer_advertise_map_set(peer
, afi
, safi
, advertise_str
,
7756 advertise_map
, condition_str
,
7757 condition_map
, condition
);
7759 ret
= peer_advertise_map_unset(peer
, afi
, safi
, advertise_str
,
7760 advertise_map
, condition_str
,
7761 condition_map
, condition
);
7763 return bgp_vty_return(vty
, ret
);
7766 DEFPY (bgp_condadv_period
,
7767 bgp_condadv_period_cmd
,
7768 "[no$no] bgp conditional-advertisement timer (5-240)$period",
7771 "Conditional advertisement settings\n"
7772 "Set period to rescan BGP table to check if condition is met\n"
7773 "Period between BGP table scans, in seconds; default 60\n")
7775 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
7777 bgp
->condition_check_period
=
7778 no
? DEFAULT_CONDITIONAL_ROUTES_POLL_TIME
: period
;
7783 DEFPY (neighbor_advertise_map
,
7784 neighbor_advertise_map_cmd
,
7785 "[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",
7789 "Route-map to conditionally advertise routes\n"
7790 "Name of advertise map\n"
7791 "Advertise routes only if prefixes in exist-map are installed in BGP table\n"
7792 "Advertise routes only if prefixes in non-exist-map are not installed in BGP table\n"
7793 "Name of the exist or non exist map\n")
7795 bool condition
= CONDITION_EXIST
;
7797 if (!strcmp(exist
, "non-exist-map"))
7798 condition
= CONDITION_NON_EXIST
;
7800 return peer_advertise_map_set_vty(vty
, neighbor
, bgp_node_afi(vty
),
7801 bgp_node_safi(vty
), advertise_str
,
7802 condition_str
, condition
, !no
);
7805 ALIAS_HIDDEN(neighbor_advertise_map
, neighbor_advertise_map_hidden_cmd
,
7806 "[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",
7807 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7808 "Route-map to conditionally advertise routes\n"
7809 "Name of advertise map\n"
7810 "Advertise routes only if prefixes in exist-map are installed in BGP table\n"
7811 "Advertise routes only if prefixes in non-exist-map are not installed in BGP table\n"
7812 "Name of the exist or non exist map\n")
7814 /* Set route-map to the peer. */
7815 static int peer_route_map_set_vty(struct vty
*vty
, const char *ip_str
,
7816 afi_t afi
, safi_t safi
, const char *name_str
,
7817 const char *direct_str
)
7821 int direct
= RMAP_IN
;
7822 struct route_map
*route_map
;
7824 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
7826 return CMD_WARNING_CONFIG_FAILED
;
7828 /* Check filter direction. */
7829 if (strncmp(direct_str
, "in", 2) == 0)
7831 else if (strncmp(direct_str
, "o", 1) == 0)
7834 route_map
= route_map_lookup_warn_noexist(vty
, name_str
);
7835 ret
= peer_route_map_set(peer
, afi
, safi
, direct
, name_str
, route_map
);
7837 return bgp_vty_return(vty
, ret
);
7840 static int peer_route_map_unset_vty(struct vty
*vty
, const char *ip_str
,
7841 afi_t afi
, safi_t safi
,
7842 const char *direct_str
)
7846 int direct
= RMAP_IN
;
7848 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
7850 return CMD_WARNING_CONFIG_FAILED
;
7852 /* Check filter direction. */
7853 if (strncmp(direct_str
, "in", 2) == 0)
7855 else if (strncmp(direct_str
, "o", 1) == 0)
7858 ret
= peer_route_map_unset(peer
, afi
, safi
, direct
);
7860 return bgp_vty_return(vty
, ret
);
7863 DEFUN (neighbor_route_map
,
7864 neighbor_route_map_cmd
,
7865 "neighbor <A.B.C.D|X:X::X:X|WORD> route-map RMAP_NAME <in|out>",
7868 "Apply route map to neighbor\n"
7869 "Name of route map\n"
7870 "Apply map to incoming routes\n"
7871 "Apply map to outbound routes\n")
7876 return peer_route_map_set_vty(
7877 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
7878 argv
[idx_word
]->arg
, argv
[idx_in_out
]->arg
);
7881 ALIAS_HIDDEN(neighbor_route_map
, neighbor_route_map_hidden_cmd
,
7882 "neighbor <A.B.C.D|X:X::X:X|WORD> route-map RMAP_NAME <in|out>",
7883 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7884 "Apply route map to neighbor\n"
7885 "Name of route map\n"
7886 "Apply map to incoming routes\n"
7887 "Apply map to outbound routes\n")
7889 DEFUN (no_neighbor_route_map
,
7890 no_neighbor_route_map_cmd
,
7891 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-map RMAP_NAME <in|out>",
7895 "Apply route map to neighbor\n"
7896 "Name of route map\n"
7897 "Apply map to incoming routes\n"
7898 "Apply map to outbound routes\n")
7902 return peer_route_map_unset_vty(vty
, argv
[idx_peer
]->arg
,
7903 bgp_node_afi(vty
), bgp_node_safi(vty
),
7904 argv
[idx_in_out
]->arg
);
7907 ALIAS_HIDDEN(no_neighbor_route_map
, no_neighbor_route_map_hidden_cmd
,
7908 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-map RMAP_NAME <in|out>",
7909 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7910 "Apply route map to neighbor\n"
7911 "Name of route map\n"
7912 "Apply map to incoming routes\n"
7913 "Apply map to outbound routes\n")
7915 /* Set unsuppress-map to the peer. */
7916 static int peer_unsuppress_map_set_vty(struct vty
*vty
, const char *ip_str
,
7917 afi_t afi
, safi_t safi
,
7918 const char *name_str
)
7922 struct route_map
*route_map
;
7924 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
7926 return CMD_WARNING_CONFIG_FAILED
;
7928 route_map
= route_map_lookup_warn_noexist(vty
, name_str
);
7929 ret
= peer_unsuppress_map_set(peer
, afi
, safi
, name_str
, route_map
);
7931 return bgp_vty_return(vty
, ret
);
7934 /* Unset route-map from the peer. */
7935 static int peer_unsuppress_map_unset_vty(struct vty
*vty
, const char *ip_str
,
7936 afi_t afi
, safi_t safi
)
7941 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
7943 return CMD_WARNING_CONFIG_FAILED
;
7945 ret
= peer_unsuppress_map_unset(peer
, afi
, safi
);
7947 return bgp_vty_return(vty
, ret
);
7950 DEFUN (neighbor_unsuppress_map
,
7951 neighbor_unsuppress_map_cmd
,
7952 "neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
7955 "Route-map to selectively unsuppress suppressed routes\n"
7956 "Name of route map\n")
7960 return peer_unsuppress_map_set_vty(
7961 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
7962 argv
[idx_word
]->arg
);
7965 ALIAS_HIDDEN(neighbor_unsuppress_map
, neighbor_unsuppress_map_hidden_cmd
,
7966 "neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
7967 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7968 "Route-map to selectively unsuppress suppressed routes\n"
7969 "Name of route map\n")
7971 DEFUN (no_neighbor_unsuppress_map
,
7972 no_neighbor_unsuppress_map_cmd
,
7973 "no neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
7977 "Route-map to selectively unsuppress suppressed routes\n"
7978 "Name of route map\n")
7981 return peer_unsuppress_map_unset_vty(vty
, argv
[idx_peer
]->arg
,
7983 bgp_node_safi(vty
));
7986 ALIAS_HIDDEN(no_neighbor_unsuppress_map
, no_neighbor_unsuppress_map_hidden_cmd
,
7987 "no neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
7988 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
7989 "Route-map to selectively unsuppress suppressed routes\n"
7990 "Name of route map\n")
7992 static int peer_maximum_prefix_set_vty(struct vty
*vty
, const char *ip_str
,
7993 afi_t afi
, safi_t safi
,
7994 const char *num_str
,
7995 const char *threshold_str
, int warning
,
7996 const char *restart_str
,
7997 const char *force_str
)
8005 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
8007 return CMD_WARNING_CONFIG_FAILED
;
8009 max
= strtoul(num_str
, NULL
, 10);
8011 threshold
= atoi(threshold_str
);
8013 threshold
= MAXIMUM_PREFIX_THRESHOLD_DEFAULT
;
8016 restart
= atoi(restart_str
);
8020 ret
= peer_maximum_prefix_set(peer
, afi
, safi
, max
, threshold
, warning
,
8021 restart
, force_str
? true : false);
8023 return bgp_vty_return(vty
, ret
);
8026 static int peer_maximum_prefix_unset_vty(struct vty
*vty
, const char *ip_str
,
8027 afi_t afi
, safi_t safi
)
8032 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
8034 return CMD_WARNING_CONFIG_FAILED
;
8036 ret
= peer_maximum_prefix_unset(peer
, afi
, safi
);
8038 return bgp_vty_return(vty
, ret
);
8041 /* Maximum number of prefix to be sent to the neighbor. */
8042 DEFUN(neighbor_maximum_prefix_out
,
8043 neighbor_maximum_prefix_out_cmd
,
8044 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix-out (1-4294967295)",
8047 "Maximum number of prefixes to be sent to this peer\n"
8048 "Maximum no. of prefix limit\n")
8055 afi_t afi
= bgp_node_afi(vty
);
8056 safi_t safi
= bgp_node_safi(vty
);
8058 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
8060 return CMD_WARNING_CONFIG_FAILED
;
8062 max
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
8064 ret
= peer_maximum_prefix_out_set(peer
, afi
, safi
, max
);
8066 return bgp_vty_return(vty
, ret
);
8069 DEFUN(no_neighbor_maximum_prefix_out
,
8070 no_neighbor_maximum_prefix_out_cmd
,
8071 "no neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix-out [(1-4294967295)]",
8075 "Maximum number of prefixes to be sent to this peer\n"
8076 "Maximum no. of prefix limit\n")
8081 afi_t afi
= bgp_node_afi(vty
);
8082 safi_t safi
= bgp_node_safi(vty
);
8084 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
8086 return CMD_WARNING_CONFIG_FAILED
;
8088 ret
= peer_maximum_prefix_out_unset(peer
, afi
, safi
);
8090 return bgp_vty_return(vty
, ret
);
8093 /* Maximum number of prefix configuration. Prefix count is different
8094 for each peer configuration. So this configuration can be set for
8095 each peer configuration. */
8096 DEFUN (neighbor_maximum_prefix
,
8097 neighbor_maximum_prefix_cmd
,
8098 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) [force]",
8101 "Maximum number of prefix accept from this peer\n"
8102 "maximum no. of prefix limit\n"
8103 "Force checking all received routes not only accepted\n")
8110 if (argv_find(argv
, argc
, "force", &idx_force
))
8111 force
= argv
[idx_force
]->arg
;
8113 return peer_maximum_prefix_set_vty(
8114 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
8115 argv
[idx_number
]->arg
, NULL
, 0, NULL
, force
);
8118 ALIAS_HIDDEN(neighbor_maximum_prefix
, neighbor_maximum_prefix_hidden_cmd
,
8119 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) [force]",
8120 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
8121 "Maximum number of prefix accept from this peer\n"
8122 "maximum no. of prefix limit\n"
8123 "Force checking all received routes not only accepted\n")
8125 DEFUN (neighbor_maximum_prefix_threshold
,
8126 neighbor_maximum_prefix_threshold_cmd
,
8127 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) [force]",
8130 "Maximum number of prefix accept from this peer\n"
8131 "maximum no. of prefix limit\n"
8132 "Threshold value (%) at which to generate a warning msg\n"
8133 "Force checking all received routes not only accepted\n")
8137 int idx_number_2
= 4;
8141 if (argv_find(argv
, argc
, "force", &idx_force
))
8142 force
= argv
[idx_force
]->arg
;
8144 return peer_maximum_prefix_set_vty(
8145 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
8146 argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
, 0, NULL
, force
);
8150 neighbor_maximum_prefix_threshold
,
8151 neighbor_maximum_prefix_threshold_hidden_cmd
,
8152 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) [force]",
8153 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
8154 "Maximum number of prefix accept from this peer\n"
8155 "maximum no. of prefix limit\n"
8156 "Threshold value (%) at which to generate a warning msg\n"
8157 "Force checking all received routes not only accepted\n")
8159 DEFUN (neighbor_maximum_prefix_warning
,
8160 neighbor_maximum_prefix_warning_cmd
,
8161 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) warning-only [force]",
8164 "Maximum number of prefix accept from this peer\n"
8165 "maximum no. of prefix limit\n"
8166 "Only give warning message when limit is exceeded\n"
8167 "Force checking all received routes not only accepted\n")
8174 if (argv_find(argv
, argc
, "force", &idx_force
))
8175 force
= argv
[idx_force
]->arg
;
8177 return peer_maximum_prefix_set_vty(
8178 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
8179 argv
[idx_number
]->arg
, NULL
, 1, NULL
, force
);
8183 neighbor_maximum_prefix_warning
,
8184 neighbor_maximum_prefix_warning_hidden_cmd
,
8185 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) warning-only [force]",
8186 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
8187 "Maximum number of prefix accept from this peer\n"
8188 "maximum no. of prefix limit\n"
8189 "Only give warning message when limit is exceeded\n"
8190 "Force checking all received routes not only accepted\n")
8192 DEFUN (neighbor_maximum_prefix_threshold_warning
,
8193 neighbor_maximum_prefix_threshold_warning_cmd
,
8194 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) warning-only [force]",
8197 "Maximum number of prefix accept from this peer\n"
8198 "maximum no. of prefix limit\n"
8199 "Threshold value (%) at which to generate a warning msg\n"
8200 "Only give warning message when limit is exceeded\n"
8201 "Force checking all received routes not only accepted\n")
8205 int idx_number_2
= 4;
8209 if (argv_find(argv
, argc
, "force", &idx_force
))
8210 force
= argv
[idx_force
]->arg
;
8212 return peer_maximum_prefix_set_vty(
8213 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
8214 argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
, 1, NULL
, force
);
8218 neighbor_maximum_prefix_threshold_warning
,
8219 neighbor_maximum_prefix_threshold_warning_hidden_cmd
,
8220 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) warning-only [force]",
8221 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
8222 "Maximum number of prefix accept from this peer\n"
8223 "maximum no. of prefix limit\n"
8224 "Threshold value (%) at which to generate a warning msg\n"
8225 "Only give warning message when limit is exceeded\n"
8226 "Force checking all received routes not only accepted\n")
8228 DEFUN (neighbor_maximum_prefix_restart
,
8229 neighbor_maximum_prefix_restart_cmd
,
8230 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) restart (1-65535) [force]",
8233 "Maximum number of prefix accept from this peer\n"
8234 "maximum no. of prefix limit\n"
8235 "Restart bgp connection after limit is exceeded\n"
8236 "Restart interval in minutes\n"
8237 "Force checking all received routes not only accepted\n")
8241 int idx_number_2
= 5;
8245 if (argv_find(argv
, argc
, "force", &idx_force
))
8246 force
= argv
[idx_force
]->arg
;
8248 return peer_maximum_prefix_set_vty(
8249 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
8250 argv
[idx_number
]->arg
, NULL
, 0, argv
[idx_number_2
]->arg
, force
);
8254 neighbor_maximum_prefix_restart
,
8255 neighbor_maximum_prefix_restart_hidden_cmd
,
8256 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) restart (1-65535) [force]",
8257 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
8258 "Maximum number of prefix accept from this peer\n"
8259 "maximum no. of prefix limit\n"
8260 "Restart bgp connection after limit is exceeded\n"
8261 "Restart interval in minutes\n"
8262 "Force checking all received routes not only accepted\n")
8264 DEFUN (neighbor_maximum_prefix_threshold_restart
,
8265 neighbor_maximum_prefix_threshold_restart_cmd
,
8266 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) restart (1-65535) [force]",
8269 "Maximum number of prefixes to accept from this peer\n"
8270 "maximum no. of prefix limit\n"
8271 "Threshold value (%) at which to generate a warning msg\n"
8272 "Restart bgp connection after limit is exceeded\n"
8273 "Restart interval in minutes\n"
8274 "Force checking all received routes not only accepted\n")
8278 int idx_number_2
= 4;
8279 int idx_number_3
= 6;
8283 if (argv_find(argv
, argc
, "force", &idx_force
))
8284 force
= argv
[idx_force
]->arg
;
8286 return peer_maximum_prefix_set_vty(
8287 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
8288 argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
, 0,
8289 argv
[idx_number_3
]->arg
, force
);
8293 neighbor_maximum_prefix_threshold_restart
,
8294 neighbor_maximum_prefix_threshold_restart_hidden_cmd
,
8295 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) restart (1-65535) [force]",
8296 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
8297 "Maximum number of prefixes to accept from this peer\n"
8298 "maximum no. of prefix limit\n"
8299 "Threshold value (%) at which to generate a warning msg\n"
8300 "Restart bgp connection after limit is exceeded\n"
8301 "Restart interval in minutes\n"
8302 "Force checking all received routes not only accepted\n")
8304 DEFUN (no_neighbor_maximum_prefix
,
8305 no_neighbor_maximum_prefix_cmd
,
8306 "no neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix [(1-4294967295) [(1-100)] [restart (1-65535)] [warning-only] [force]]",
8310 "Maximum number of prefixes to accept from this peer\n"
8311 "maximum no. of prefix limit\n"
8312 "Threshold value (%) at which to generate a warning msg\n"
8313 "Restart bgp connection after limit is exceeded\n"
8314 "Restart interval in minutes\n"
8315 "Only give warning message when limit is exceeded\n"
8316 "Force checking all received routes not only accepted\n")
8319 return peer_maximum_prefix_unset_vty(vty
, argv
[idx_peer
]->arg
,
8321 bgp_node_safi(vty
));
8325 no_neighbor_maximum_prefix
, no_neighbor_maximum_prefix_hidden_cmd
,
8326 "no neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix [(1-4294967295) [(1-100)] [restart (1-65535)] [warning-only] [force]]",
8327 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
8328 "Maximum number of prefixes to accept from this peer\n"
8329 "maximum no. of prefix limit\n"
8330 "Threshold value (%) at which to generate a warning msg\n"
8331 "Restart bgp connection after limit is exceeded\n"
8332 "Restart interval in minutes\n"
8333 "Only give warning message when limit is exceeded\n"
8334 "Force checking all received routes not only accepted\n")
8336 /* "neighbor accept-own" */
8337 DEFPY (neighbor_accept_own
,
8338 neighbor_accept_own_cmd
,
8339 "[no$no] neighbor <A.B.C.D|X:X::X:X|WORD>$neighbor accept-own",
8343 "Enable handling of self-originated VPN routes containing ACCEPT_OWN community\n")
8346 afi_t afi
= bgp_node_afi(vty
);
8347 safi_t safi
= bgp_node_safi(vty
);
8350 peer
= peer_and_group_lookup_vty(vty
, neighbor
);
8352 return CMD_WARNING_CONFIG_FAILED
;
8355 ret
= peer_af_flag_unset(peer
, afi
, safi
, PEER_FLAG_ACCEPT_OWN
);
8357 ret
= peer_af_flag_set(peer
, afi
, safi
, PEER_FLAG_ACCEPT_OWN
);
8359 return bgp_vty_return(vty
, ret
);
8362 /* "neighbor soo" */
8363 DEFPY (neighbor_soo
,
8365 "neighbor <A.B.C.D|X:X::X:X|WORD>$neighbor soo ASN:NN_OR_IP-ADDRESS:NN$soo",
8368 "Set the Site-of-Origin (SoO) extended community\n"
8369 "VPN extended community\n")
8372 afi_t afi
= bgp_node_afi(vty
);
8373 safi_t safi
= bgp_node_safi(vty
);
8374 struct ecommunity
*ecomm_soo
;
8376 peer
= peer_and_group_lookup_vty(vty
, neighbor
);
8378 return CMD_WARNING_CONFIG_FAILED
;
8380 ecomm_soo
= ecommunity_str2com(soo
, ECOMMUNITY_SITE_ORIGIN
, 0);
8382 vty_out(vty
, "%% Malformed SoO extended community\n");
8385 ecommunity_str(ecomm_soo
);
8387 if (!ecommunity_match(peer
->soo
[afi
][safi
], ecomm_soo
)) {
8388 ecommunity_free(&peer
->soo
[afi
][safi
]);
8389 peer
->soo
[afi
][safi
] = ecomm_soo
;
8390 peer_af_flag_unset(peer
, afi
, safi
, PEER_FLAG_SOO
);
8393 return bgp_vty_return(vty
,
8394 peer_af_flag_set(peer
, afi
, safi
, PEER_FLAG_SOO
));
8397 DEFPY (no_neighbor_soo
,
8398 no_neighbor_soo_cmd
,
8399 "no neighbor <A.B.C.D|X:X::X:X|WORD>$neighbor soo [ASN:NN_OR_IP-ADDRESS:NN$soo]",
8403 "Set the Site-of-Origin (SoO) extended community\n"
8404 "VPN extended community\n")
8407 afi_t afi
= bgp_node_afi(vty
);
8408 safi_t safi
= bgp_node_safi(vty
);
8410 peer
= peer_and_group_lookup_vty(vty
, neighbor
);
8412 return CMD_WARNING_CONFIG_FAILED
;
8414 ecommunity_free(&peer
->soo
[afi
][safi
]);
8416 return bgp_vty_return(
8417 vty
, peer_af_flag_unset(peer
, afi
, safi
, PEER_FLAG_SOO
));
8420 /* "neighbor allowas-in" */
8421 DEFUN (neighbor_allowas_in
,
8422 neighbor_allowas_in_cmd
,
8423 "neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
8426 "Accept as-path with my AS present in it\n"
8427 "Number of occurrences of AS number\n"
8428 "Only accept my AS in the as-path if the route was originated in my AS\n")
8431 int idx_number_origin
= 3;
8437 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
8439 return CMD_WARNING_CONFIG_FAILED
;
8441 if (argc
<= idx_number_origin
)
8444 if (argv
[idx_number_origin
]->type
== WORD_TKN
)
8447 allow_num
= atoi(argv
[idx_number_origin
]->arg
);
8450 ret
= peer_allowas_in_set(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
8453 return bgp_vty_return(vty
, ret
);
8457 neighbor_allowas_in
, neighbor_allowas_in_hidden_cmd
,
8458 "neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
8459 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
8460 "Accept as-path with my AS present in it\n"
8461 "Number of occurrences of AS number\n"
8462 "Only accept my AS in the as-path if the route was originated in my AS\n")
8464 DEFUN (no_neighbor_allowas_in
,
8465 no_neighbor_allowas_in_cmd
,
8466 "no neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
8470 "allow local ASN appears in aspath attribute\n"
8471 "Number of occurrences of AS number\n"
8472 "Only accept my AS in the as-path if the route was originated in my AS\n")
8478 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
8480 return CMD_WARNING_CONFIG_FAILED
;
8482 ret
= peer_allowas_in_unset(peer
, bgp_node_afi(vty
),
8483 bgp_node_safi(vty
));
8485 return bgp_vty_return(vty
, ret
);
8489 no_neighbor_allowas_in
, no_neighbor_allowas_in_hidden_cmd
,
8490 "no neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
8491 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
8492 "allow local ASN appears in aspath attribute\n"
8493 "Number of occurrences of AS number\n"
8494 "Only accept my AS in the as-path if the route was originated in my AS\n")
8496 DEFUN (neighbor_ttl_security
,
8497 neighbor_ttl_security_cmd
,
8498 "neighbor <A.B.C.D|X:X::X:X|WORD> ttl-security hops (1-254)",
8501 "BGP ttl-security parameters\n"
8502 "Specify the maximum number of hops to the BGP peer\n"
8503 "Number of hops to BGP peer\n")
8510 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
8512 return CMD_WARNING_CONFIG_FAILED
;
8514 gtsm_hops
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
8517 * If 'neighbor swpX', then this is for directly connected peers,
8518 * we should not accept a ttl-security hops value greater than 1.
8520 if (peer
->conf_if
&& (gtsm_hops
> BGP_GTSM_HOPS_CONNECTED
)) {
8522 "%s is directly connected peer, hops cannot exceed 1\n",
8523 argv
[idx_peer
]->arg
);
8524 return CMD_WARNING_CONFIG_FAILED
;
8527 return bgp_vty_return(vty
, peer_ttl_security_hops_set(peer
, gtsm_hops
));
8530 DEFUN (no_neighbor_ttl_security
,
8531 no_neighbor_ttl_security_cmd
,
8532 "no neighbor <A.B.C.D|X:X::X:X|WORD> ttl-security hops (1-254)",
8536 "BGP ttl-security parameters\n"
8537 "Specify the maximum number of hops to the BGP peer\n"
8538 "Number of hops to BGP peer\n")
8543 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
8545 return CMD_WARNING_CONFIG_FAILED
;
8547 return bgp_vty_return(vty
, peer_ttl_security_hops_unset(peer
));
8550 /* disable-addpath-rx */
8551 DEFUN(neighbor_disable_addpath_rx
,
8552 neighbor_disable_addpath_rx_cmd
,
8553 "neighbor <A.B.C.D|X:X::X:X|WORD> disable-addpath-rx",
8556 "Do not accept additional paths\n")
8558 char *peer_str
= argv
[1]->arg
;
8560 afi_t afi
= bgp_node_afi(vty
);
8561 safi_t safi
= bgp_node_safi(vty
);
8563 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
8565 return CMD_WARNING_CONFIG_FAILED
;
8567 return peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
,
8568 PEER_FLAG_DISABLE_ADDPATH_RX
);
8571 DEFUN(no_neighbor_disable_addpath_rx
,
8572 no_neighbor_disable_addpath_rx_cmd
,
8573 "no neighbor <A.B.C.D|X:X::X:X|WORD> disable-addpath-rx",
8577 "Do not accept additional paths\n")
8579 char *peer_str
= argv
[2]->arg
;
8581 afi_t afi
= bgp_node_afi(vty
);
8582 safi_t safi
= bgp_node_safi(vty
);
8584 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
8586 return CMD_WARNING_CONFIG_FAILED
;
8588 return peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
8589 PEER_FLAG_DISABLE_ADDPATH_RX
);
8592 DEFUN (neighbor_addpath_tx_all_paths
,
8593 neighbor_addpath_tx_all_paths_cmd
,
8594 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
8597 "Use addpath to advertise all paths to a neighbor\n")
8602 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
8604 return CMD_WARNING_CONFIG_FAILED
;
8606 bgp_addpath_set_peer_type(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
8611 ALIAS_HIDDEN(neighbor_addpath_tx_all_paths
,
8612 neighbor_addpath_tx_all_paths_hidden_cmd
,
8613 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
8614 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
8615 "Use addpath to advertise all paths to a neighbor\n")
8617 DEFUN (no_neighbor_addpath_tx_all_paths
,
8618 no_neighbor_addpath_tx_all_paths_cmd
,
8619 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
8623 "Use addpath to advertise all paths to a neighbor\n")
8628 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
8630 return CMD_WARNING_CONFIG_FAILED
;
8632 if (peer
->addpath_type
[bgp_node_afi(vty
)][bgp_node_safi(vty
)]
8633 != BGP_ADDPATH_ALL
) {
8635 "%% Peer not currently configured to transmit all paths.");
8636 return CMD_WARNING_CONFIG_FAILED
;
8639 bgp_addpath_set_peer_type(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
8645 ALIAS_HIDDEN(no_neighbor_addpath_tx_all_paths
,
8646 no_neighbor_addpath_tx_all_paths_hidden_cmd
,
8647 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
8648 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
8649 "Use addpath to advertise all paths to a neighbor\n")
8651 DEFUN (neighbor_addpath_tx_bestpath_per_as
,
8652 neighbor_addpath_tx_bestpath_per_as_cmd
,
8653 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
8656 "Use addpath to advertise the bestpath per each neighboring AS\n")
8661 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
8663 return CMD_WARNING_CONFIG_FAILED
;
8665 bgp_addpath_set_peer_type(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
8666 BGP_ADDPATH_BEST_PER_AS
);
8671 ALIAS_HIDDEN(neighbor_addpath_tx_bestpath_per_as
,
8672 neighbor_addpath_tx_bestpath_per_as_hidden_cmd
,
8673 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
8674 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
8675 "Use addpath to advertise the bestpath per each neighboring AS\n")
8677 DEFUN (no_neighbor_addpath_tx_bestpath_per_as
,
8678 no_neighbor_addpath_tx_bestpath_per_as_cmd
,
8679 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
8683 "Use addpath to advertise the bestpath per each neighboring AS\n")
8688 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
8690 return CMD_WARNING_CONFIG_FAILED
;
8692 if (peer
->addpath_type
[bgp_node_afi(vty
)][bgp_node_safi(vty
)]
8693 != BGP_ADDPATH_BEST_PER_AS
) {
8695 "%% Peer not currently configured to transmit all best path per as.");
8696 return CMD_WARNING_CONFIG_FAILED
;
8699 bgp_addpath_set_peer_type(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
8705 ALIAS_HIDDEN(no_neighbor_addpath_tx_bestpath_per_as
,
8706 no_neighbor_addpath_tx_bestpath_per_as_hidden_cmd
,
8707 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
8708 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
8709 "Use addpath to advertise the bestpath per each neighboring AS\n")
8712 neighbor_aspath_loop_detection
, neighbor_aspath_loop_detection_cmd
,
8713 "neighbor <A.B.C.D|X:X::X:X|WORD>$neighbor sender-as-path-loop-detection",
8716 "Detect AS loops before sending to neighbor\n")
8720 peer
= peer_and_group_lookup_vty(vty
, neighbor
);
8722 return CMD_WARNING_CONFIG_FAILED
;
8724 peer
->as_path_loop_detection
= true;
8730 no_neighbor_aspath_loop_detection
,
8731 no_neighbor_aspath_loop_detection_cmd
,
8732 "no neighbor <A.B.C.D|X:X::X:X|WORD>$neighbor sender-as-path-loop-detection",
8736 "Detect AS loops before sending to neighbor\n")
8740 peer
= peer_and_group_lookup_vty(vty
, neighbor
);
8742 return CMD_WARNING_CONFIG_FAILED
;
8744 peer
->as_path_loop_detection
= false;
8749 static int set_ecom_list(struct vty
*vty
, int argc
, struct cmd_token
**argv
,
8750 struct ecommunity
**list
, bool is_rt6
)
8752 struct ecommunity
*ecom
= NULL
;
8753 struct ecommunity
*ecomadd
;
8755 for (; argc
; --argc
, ++argv
) {
8757 ecomadd
= ecommunity_str2com_ipv6(argv
[0]->arg
,
8758 ECOMMUNITY_ROUTE_TARGET
,
8761 ecomadd
= ecommunity_str2com(argv
[0]->arg
,
8762 ECOMMUNITY_ROUTE_TARGET
,
8765 vty_out(vty
, "Malformed community-list value\n");
8767 ecommunity_free(&ecom
);
8768 return CMD_WARNING_CONFIG_FAILED
;
8772 ecommunity_merge(ecom
, ecomadd
);
8773 ecommunity_free(&ecomadd
);
8780 ecommunity_free(&*list
);
8788 * v2vimport is true if we are handling a `import vrf ...` command
8790 static afi_t
vpn_policy_getafi(struct vty
*vty
, struct bgp
*bgp
, bool v2vimport
)
8794 switch (vty
->node
) {
8803 "%% context error: valid only in address-family <ipv4|ipv6> unicast block\n");
8808 if (CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
8809 BGP_CONFIG_VRF_TO_VRF_IMPORT
)
8810 || CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
8811 BGP_CONFIG_VRF_TO_VRF_EXPORT
)) {
8813 "%% error: Please unconfigure import vrf commands before using vpn commands\n");
8817 if (CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
8818 BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT
)
8819 || CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
8820 BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT
)) {
8822 "%% error: Please unconfigure vpn to vrf commands before using import vrf commands\n");
8829 DEFPY (af_rd_vpn_export
,
8830 af_rd_vpn_export_cmd
,
8831 "[no] rd vpn export ASN:NN_OR_IP-ADDRESS:NN$rd_str",
8833 "Specify route distinguisher\n"
8834 "Between current address-family and vpn\n"
8835 "For routes leaked from current address-family to vpn\n"
8836 "Route Distinguisher (<as-number>:<number> | <ip-address>:<number>)\n")
8838 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
8839 struct prefix_rd prd
;
8845 if (argv_find(argv
, argc
, "no", &idx
))
8849 ret
= str2prefix_rd(rd_str
, &prd
);
8851 vty_out(vty
, "%% Malformed rd\n");
8852 return CMD_WARNING_CONFIG_FAILED
;
8856 afi
= vpn_policy_getafi(vty
, bgp
, false);
8858 return CMD_WARNING_CONFIG_FAILED
;
8861 * pre-change: un-export vpn routes (vpn->vrf routes unaffected)
8863 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
8864 bgp_get_default(), bgp
);
8867 bgp
->vpn_policy
[afi
].tovpn_rd
= prd
;
8868 SET_FLAG(bgp
->vpn_policy
[afi
].flags
,
8869 BGP_VPN_POLICY_TOVPN_RD_SET
);
8871 UNSET_FLAG(bgp
->vpn_policy
[afi
].flags
,
8872 BGP_VPN_POLICY_TOVPN_RD_SET
);
8875 /* post-change: re-export vpn routes */
8876 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
8877 bgp_get_default(), bgp
);
8882 ALIAS (af_rd_vpn_export
,
8883 af_no_rd_vpn_export_cmd
,
8886 "Specify route distinguisher\n"
8887 "Between current address-family and vpn\n"
8888 "For routes leaked from current address-family to vpn\n")
8890 DEFPY (af_label_vpn_export
,
8891 af_label_vpn_export_cmd
,
8892 "[no] label vpn export <(0-1048575)$label_val|auto$label_auto>",
8894 "label value for VRF\n"
8895 "Between current address-family and vpn\n"
8896 "For routes leaked from current address-family to vpn\n"
8897 "Label Value <0-1048575>\n"
8898 "Automatically assign a label\n")
8900 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
8901 mpls_label_t label
= MPLS_LABEL_NONE
;
8906 if (argv_find(argv
, argc
, "no", &idx
))
8909 /* If "no ...", squash trailing parameter */
8915 label
= label_val
; /* parser should force unsigned */
8918 afi
= vpn_policy_getafi(vty
, bgp
, false);
8920 return CMD_WARNING_CONFIG_FAILED
;
8923 if (label_auto
&& CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
8924 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
))
8929 * pre-change: un-export vpn routes (vpn->vrf routes unaffected)
8931 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
8932 bgp_get_default(), bgp
);
8934 if (!label_auto
&& CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
8935 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
)) {
8937 if (bgp
->vpn_policy
[afi
].tovpn_label
!= MPLS_LABEL_NONE
) {
8940 * label has previously been automatically
8941 * assigned by labelpool: release it
8943 * NB if tovpn_label == MPLS_LABEL_NONE it
8944 * means the automatic assignment is in flight
8945 * and therefore the labelpool callback must
8946 * detect that the auto label is not needed.
8949 bgp_lp_release(LP_TYPE_VRF
,
8950 &bgp
->vpn_policy
[afi
],
8951 bgp
->vpn_policy
[afi
].tovpn_label
);
8953 UNSET_FLAG(bgp
->vpn_policy
[afi
].flags
,
8954 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
);
8957 bgp
->vpn_policy
[afi
].tovpn_label
= label
;
8959 SET_FLAG(bgp
->vpn_policy
[afi
].flags
,
8960 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
);
8961 bgp_lp_get(LP_TYPE_VRF
, &bgp
->vpn_policy
[afi
],
8962 vpn_leak_label_callback
);
8965 /* post-change: re-export vpn routes */
8966 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
8967 bgp_get_default(), bgp
);
8969 hook_call(bgp_snmp_update_last_changed
, bgp
);
8973 DEFPY (af_sid_vpn_export
,
8974 af_sid_vpn_export_cmd
,
8975 "[no] sid vpn export <(1-1048575)$sid_idx|auto$sid_auto>",
8977 "sid value for VRF\n"
8978 "Between current address-family and vpn\n"
8979 "For routes leaked from current address-family to vpn\n"
8980 "Sid allocation index\n"
8981 "Automatically assign a label\n")
8983 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
8989 if (argv_find(argv
, argc
, "no", &idx
))
8991 debug
= (BGP_DEBUG(vpn
, VPN_LEAK_TO_VRF
) |
8992 BGP_DEBUG(vpn
, VPN_LEAK_FROM_VRF
));
8994 afi
= vpn_policy_getafi(vty
, bgp
, false);
8996 return CMD_WARNING_CONFIG_FAILED
;
9000 vty_out(vty
, "It's not implemented\n");
9001 return CMD_WARNING_CONFIG_FAILED
;
9004 if (bgp
->tovpn_sid_index
!= 0 ||
9005 CHECK_FLAG(bgp
->vrf_flags
, BGP_VRF_TOVPN_SID_AUTO
)) {
9007 "per-vrf sid and per-af sid are mutually exclusive\n"
9008 "Failed: per-vrf sid is configured. Remove per-vrf sid before configuring per-af sid\n");
9009 return CMD_WARNING_CONFIG_FAILED
;
9012 /* skip when it's already configured */
9013 if ((sid_idx
!= 0 && bgp
->vpn_policy
[afi
].tovpn_sid_index
!= 0)
9014 || (sid_auto
&& CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
9015 BGP_VPN_POLICY_TOVPN_SID_AUTO
)))
9019 * mode change between sid_idx and sid_auto isn't supported.
9020 * user must negate sid vpn export when they want to change the mode
9022 if ((sid_auto
&& bgp
->vpn_policy
[afi
].tovpn_sid_index
!= 0)
9023 || (sid_idx
!= 0 && CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
9024 BGP_VPN_POLICY_TOVPN_SID_AUTO
))) {
9025 vty_out(vty
, "it's already configured as %s.\n",
9026 sid_auto
? "auto-mode" : "idx-mode");
9027 return CMD_WARNING_CONFIG_FAILED
;
9031 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
9032 bgp_get_default(), bgp
);
9035 /* SID allocation auto-mode */
9037 zlog_debug("%s: auto sid alloc.", __func__
);
9038 SET_FLAG(bgp
->vpn_policy
[afi
].flags
,
9039 BGP_VPN_POLICY_TOVPN_SID_AUTO
);
9041 /* SID allocation index-mode */
9043 zlog_debug("%s: idx %ld sid alloc.", __func__
, sid_idx
);
9044 bgp
->vpn_policy
[afi
].tovpn_sid_index
= sid_idx
;
9048 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
9049 bgp_get_default(), bgp
);
9053 DEFPY (bgp_sid_vpn_export
,
9054 bgp_sid_vpn_export_cmd
,
9055 "[no] sid vpn per-vrf export <(1-255)$sid_idx|auto$sid_auto>",
9057 "sid value for VRF\n"
9058 "Between current vrf and vpn\n"
9059 "sid per-VRF (both IPv4 and IPv6 address families)\n"
9060 "For routes leaked from current vrf to vpn\n"
9061 "Sid allocation index\n"
9062 "Automatically assign a label\n")
9064 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9067 debug
= (BGP_DEBUG(vpn
, VPN_LEAK_TO_VRF
) |
9068 BGP_DEBUG(vpn
, VPN_LEAK_FROM_VRF
));
9072 vty_out(vty
, "It's not implemented\n");
9073 return CMD_WARNING_CONFIG_FAILED
;
9076 if (bgp
->vpn_policy
[AFI_IP
].tovpn_sid_index
!= 0 ||
9077 CHECK_FLAG(bgp
->vpn_policy
[AFI_IP
].flags
,
9078 BGP_VPN_POLICY_TOVPN_SID_AUTO
) ||
9079 bgp
->vpn_policy
[AFI_IP6
].tovpn_sid_index
!= 0 ||
9080 CHECK_FLAG(bgp
->vpn_policy
[AFI_IP6
].flags
,
9081 BGP_VPN_POLICY_TOVPN_SID_AUTO
)) {
9083 "per-vrf sid and per-af sid are mutually exclusive\n"
9084 "Failed: per-af sid is configured. Remove per-af sid before configuring per-vrf sid\n");
9085 return CMD_WARNING_CONFIG_FAILED
;
9088 /* skip when it's already configured */
9089 if ((sid_idx
!= 0 && bgp
->tovpn_sid_index
!= 0) ||
9090 (sid_auto
&& CHECK_FLAG(bgp
->vrf_flags
, BGP_VRF_TOVPN_SID_AUTO
)))
9094 * mode change between sid_idx and sid_auto isn't supported.
9095 * user must negate sid vpn export when they want to change the mode
9097 if ((sid_auto
&& bgp
->tovpn_sid_index
!= 0) ||
9099 CHECK_FLAG(bgp
->vrf_flags
, BGP_VRF_TOVPN_SID_AUTO
))) {
9100 vty_out(vty
, "it's already configured as %s.\n",
9101 sid_auto
? "auto-mode" : "idx-mode");
9102 return CMD_WARNING_CONFIG_FAILED
;
9106 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, AFI_IP
, bgp_get_default(),
9108 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, AFI_IP6
, bgp_get_default(),
9112 /* SID allocation auto-mode */
9114 zlog_debug("%s: auto per-vrf sid alloc.", __func__
);
9115 SET_FLAG(bgp
->vrf_flags
, BGP_VRF_TOVPN_SID_AUTO
);
9117 /* SID allocation index-mode */
9119 zlog_debug("%s: idx %ld per-vrf sid alloc.", __func__
,
9121 bgp
->tovpn_sid_index
= sid_idx
;
9125 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, AFI_IP
, bgp_get_default(),
9127 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, AFI_IP6
,
9128 bgp_get_default(), bgp
);
9133 ALIAS (af_label_vpn_export
,
9134 af_no_label_vpn_export_cmd
,
9135 "no label vpn export",
9137 "label value for VRF\n"
9138 "Between current address-family and vpn\n"
9139 "For routes leaked from current address-family to vpn\n")
9141 DEFPY (af_nexthop_vpn_export
,
9142 af_nexthop_vpn_export_cmd
,
9143 "[no] nexthop vpn export [<A.B.C.D|X:X::X:X>$nexthop_su]",
9145 "Specify next hop to use for VRF advertised prefixes\n"
9146 "Between current address-family and vpn\n"
9147 "For routes leaked from current address-family to vpn\n"
9151 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9157 vty_out(vty
, "%% Nexthop required\n");
9158 return CMD_WARNING_CONFIG_FAILED
;
9160 if (!sockunion2hostprefix(nexthop_su
, &p
))
9161 return CMD_WARNING_CONFIG_FAILED
;
9164 afi
= vpn_policy_getafi(vty
, bgp
, false);
9166 return CMD_WARNING_CONFIG_FAILED
;
9169 * pre-change: un-export vpn routes (vpn->vrf routes unaffected)
9171 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
9172 bgp_get_default(), bgp
);
9175 bgp
->vpn_policy
[afi
].tovpn_nexthop
= p
;
9176 SET_FLAG(bgp
->vpn_policy
[afi
].flags
,
9177 BGP_VPN_POLICY_TOVPN_NEXTHOP_SET
);
9179 UNSET_FLAG(bgp
->vpn_policy
[afi
].flags
,
9180 BGP_VPN_POLICY_TOVPN_NEXTHOP_SET
);
9183 /* post-change: re-export vpn routes */
9184 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
9185 bgp_get_default(), bgp
);
9190 static int vpn_policy_getdirs(struct vty
*vty
, const char *dstr
, int *dodir
)
9192 if (!strcmp(dstr
, "import")) {
9193 dodir
[BGP_VPN_POLICY_DIR_FROMVPN
] = 1;
9194 } else if (!strcmp(dstr
, "export")) {
9195 dodir
[BGP_VPN_POLICY_DIR_TOVPN
] = 1;
9196 } else if (!strcmp(dstr
, "both")) {
9197 dodir
[BGP_VPN_POLICY_DIR_FROMVPN
] = 1;
9198 dodir
[BGP_VPN_POLICY_DIR_TOVPN
] = 1;
9200 vty_out(vty
, "%% direction parse error\n");
9201 return CMD_WARNING_CONFIG_FAILED
;
9206 DEFPY (af_rt_vpn_imexport
,
9207 af_rt_vpn_imexport_cmd
,
9208 "[no] <rt|route-target> vpn <import|export|both>$direction_str RTLIST...",
9210 "Specify route target list\n"
9211 "Specify route target list\n"
9212 "Between current address-family and vpn\n"
9213 "For routes leaked from vpn to current address-family: match any\n"
9214 "For routes leaked from current address-family to vpn: set\n"
9215 "both import: match any and export: set\n"
9216 "Space separated route target list (A.B.C.D:MN|EF:OPQR|GHJK:MN)\n")
9218 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9220 struct ecommunity
*ecom
= NULL
;
9221 int dodir
[BGP_VPN_POLICY_DIR_MAX
] = {0};
9222 enum vpn_policy_direction dir
;
9227 if (argv_find(argv
, argc
, "no", &idx
))
9230 afi
= vpn_policy_getafi(vty
, bgp
, false);
9232 return CMD_WARNING_CONFIG_FAILED
;
9234 ret
= vpn_policy_getdirs(vty
, direction_str
, dodir
);
9235 if (ret
!= CMD_SUCCESS
)
9239 if (!argv_find(argv
, argc
, "RTLIST", &idx
)) {
9240 vty_out(vty
, "%% Missing RTLIST\n");
9241 return CMD_WARNING_CONFIG_FAILED
;
9243 ret
= set_ecom_list(vty
, argc
- idx
, argv
+ idx
, &ecom
, false);
9244 if (ret
!= CMD_SUCCESS
) {
9249 for (dir
= 0; dir
< BGP_VPN_POLICY_DIR_MAX
; ++dir
) {
9253 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
9256 if (bgp
->vpn_policy
[afi
].rtlist
[dir
])
9258 &bgp
->vpn_policy
[afi
].rtlist
[dir
]);
9259 bgp
->vpn_policy
[afi
].rtlist
[dir
] =
9260 ecommunity_dup(ecom
);
9262 if (bgp
->vpn_policy
[afi
].rtlist
[dir
])
9264 &bgp
->vpn_policy
[afi
].rtlist
[dir
]);
9265 bgp
->vpn_policy
[afi
].rtlist
[dir
] = NULL
;
9268 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
9272 ecommunity_free(&ecom
);
9277 ALIAS (af_rt_vpn_imexport
,
9278 af_no_rt_vpn_imexport_cmd
,
9279 "no <rt|route-target> vpn <import|export|both>$direction_str",
9281 "Specify route target list\n"
9282 "Specify route target list\n"
9283 "Between current address-family and vpn\n"
9284 "For routes leaked from vpn to current address-family\n"
9285 "For routes leaked from current address-family to vpn\n"
9286 "both import and export\n")
9288 DEFPY (af_route_map_vpn_imexport
,
9289 af_route_map_vpn_imexport_cmd
,
9290 /* future: "route-map <vpn|evpn|vrf NAME> <import|export> RMAP" */
9291 "[no] route-map vpn <import|export>$direction_str RMAP$rmap_str",
9293 "Specify route map\n"
9294 "Between current address-family and vpn\n"
9295 "For routes leaked from vpn to current address-family\n"
9296 "For routes leaked from current address-family to vpn\n"
9297 "name of route-map\n")
9299 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9301 int dodir
[BGP_VPN_POLICY_DIR_MAX
] = {0};
9302 enum vpn_policy_direction dir
;
9307 if (argv_find(argv
, argc
, "no", &idx
))
9310 afi
= vpn_policy_getafi(vty
, bgp
, false);
9312 return CMD_WARNING_CONFIG_FAILED
;
9314 ret
= vpn_policy_getdirs(vty
, direction_str
, dodir
);
9315 if (ret
!= CMD_SUCCESS
)
9318 for (dir
= 0; dir
< BGP_VPN_POLICY_DIR_MAX
; ++dir
) {
9322 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
9325 if (bgp
->vpn_policy
[afi
].rmap_name
[dir
])
9326 XFREE(MTYPE_ROUTE_MAP_NAME
,
9327 bgp
->vpn_policy
[afi
].rmap_name
[dir
]);
9328 bgp
->vpn_policy
[afi
].rmap_name
[dir
] = XSTRDUP(
9329 MTYPE_ROUTE_MAP_NAME
, rmap_str
);
9330 bgp
->vpn_policy
[afi
].rmap
[dir
] =
9331 route_map_lookup_warn_noexist(vty
, rmap_str
);
9332 if (!bgp
->vpn_policy
[afi
].rmap
[dir
])
9335 if (bgp
->vpn_policy
[afi
].rmap_name
[dir
])
9336 XFREE(MTYPE_ROUTE_MAP_NAME
,
9337 bgp
->vpn_policy
[afi
].rmap_name
[dir
]);
9338 bgp
->vpn_policy
[afi
].rmap_name
[dir
] = NULL
;
9339 bgp
->vpn_policy
[afi
].rmap
[dir
] = NULL
;
9342 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
9348 ALIAS (af_route_map_vpn_imexport
,
9349 af_no_route_map_vpn_imexport_cmd
,
9350 "no route-map vpn <import|export>$direction_str",
9352 "Specify route map\n"
9353 "Between current address-family and vpn\n"
9354 "For routes leaked from vpn to current address-family\n"
9355 "For routes leaked from current address-family to vpn\n")
9357 DEFPY(af_import_vrf_route_map
, af_import_vrf_route_map_cmd
,
9358 "import vrf route-map RMAP$rmap_str",
9359 "Import routes from another VRF\n"
9360 "Vrf routes being filtered\n"
9361 "Specify route map\n"
9362 "name of route-map\n")
9364 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9365 enum vpn_policy_direction dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
9367 struct bgp
*bgp_default
;
9369 afi
= vpn_policy_getafi(vty
, bgp
, true);
9371 return CMD_WARNING_CONFIG_FAILED
;
9373 bgp_default
= bgp_get_default();
9378 /* Auto-create assuming the same AS */
9379 ret
= bgp_get_vty(&bgp_default
, &as
, NULL
,
9380 BGP_INSTANCE_TYPE_DEFAULT
);
9384 "VRF default is not configured as a bgp instance\n");
9389 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
9391 if (bgp
->vpn_policy
[afi
].rmap_name
[dir
])
9392 XFREE(MTYPE_ROUTE_MAP_NAME
,
9393 bgp
->vpn_policy
[afi
].rmap_name
[dir
]);
9394 bgp
->vpn_policy
[afi
].rmap_name
[dir
] =
9395 XSTRDUP(MTYPE_ROUTE_MAP_NAME
, rmap_str
);
9396 bgp
->vpn_policy
[afi
].rmap
[dir
] =
9397 route_map_lookup_warn_noexist(vty
, rmap_str
);
9398 if (!bgp
->vpn_policy
[afi
].rmap
[dir
])
9401 SET_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
9402 BGP_CONFIG_VRF_TO_VRF_IMPORT
);
9404 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
9409 DEFPY(af_no_import_vrf_route_map
, af_no_import_vrf_route_map_cmd
,
9410 "no import vrf route-map [RMAP$rmap_str]",
9412 "Import routes from another VRF\n"
9413 "Vrf routes being filtered\n"
9414 "Specify route map\n"
9415 "name of route-map\n")
9417 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9418 enum vpn_policy_direction dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
9421 afi
= vpn_policy_getafi(vty
, bgp
, true);
9423 return CMD_WARNING_CONFIG_FAILED
;
9425 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
9427 if (bgp
->vpn_policy
[afi
].rmap_name
[dir
])
9428 XFREE(MTYPE_ROUTE_MAP_NAME
,
9429 bgp
->vpn_policy
[afi
].rmap_name
[dir
]);
9430 bgp
->vpn_policy
[afi
].rmap_name
[dir
] = NULL
;
9431 bgp
->vpn_policy
[afi
].rmap
[dir
] = NULL
;
9433 if (bgp
->vpn_policy
[afi
].import_vrf
->count
== 0)
9434 UNSET_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
9435 BGP_CONFIG_VRF_TO_VRF_IMPORT
);
9437 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
9442 DEFPY(bgp_imexport_vrf
, bgp_imexport_vrf_cmd
,
9443 "[no] import vrf VIEWVRFNAME$import_name",
9445 "Import routes from another VRF\n"
9446 "VRF to import from\n"
9447 "The name of the VRF\n")
9449 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9450 struct listnode
*node
;
9451 struct bgp
*vrf_bgp
, *bgp_default
;
9454 bool remove
= false;
9457 enum bgp_instance_type bgp_type
= BGP_INSTANCE_TYPE_VRF
;
9461 if (import_name
== NULL
) {
9462 vty_out(vty
, "%% Missing import name\n");
9466 if (strcmp(import_name
, "route-map") == 0) {
9467 vty_out(vty
, "%% Must include route-map name\n");
9471 if (argv_find(argv
, argc
, "no", &idx
))
9474 afi
= vpn_policy_getafi(vty
, bgp
, true);
9476 return CMD_WARNING_CONFIG_FAILED
;
9478 safi
= bgp_node_safi(vty
);
9480 if (((BGP_INSTANCE_TYPE_DEFAULT
== bgp
->inst_type
)
9481 && (strcmp(import_name
, VRF_DEFAULT_NAME
) == 0))
9482 || (bgp
->name
&& (strcmp(import_name
, bgp
->name
) == 0))) {
9483 vty_out(vty
, "%% Cannot %s vrf %s into itself\n",
9484 remove
? "unimport" : "import", import_name
);
9488 bgp_default
= bgp_get_default();
9490 /* Auto-create assuming the same AS */
9491 ret
= bgp_get_vty(&bgp_default
, &as
, NULL
,
9492 BGP_INSTANCE_TYPE_DEFAULT
);
9496 "VRF default is not configured as a bgp instance\n");
9501 vrf_bgp
= bgp_lookup_by_name(import_name
);
9503 if (strcmp(import_name
, VRF_DEFAULT_NAME
) == 0)
9504 vrf_bgp
= bgp_default
;
9506 /* Auto-create assuming the same AS */
9507 ret
= bgp_get_vty(&vrf_bgp
, &as
, import_name
, bgp_type
);
9511 "VRF %s is not configured as a bgp instance\n",
9518 vrf_unimport_from_vrf(bgp
, vrf_bgp
, afi
, safi
);
9520 /* Already importing from "import_vrf"? */
9521 for (ALL_LIST_ELEMENTS_RO(bgp
->vpn_policy
[afi
].import_vrf
, node
,
9523 if (strcmp(vname
, import_name
) == 0)
9527 vrf_import_from_vrf(bgp
, vrf_bgp
, afi
, safi
);
9533 /* This command is valid only in a bgp vrf instance or the default instance */
9534 DEFPY (bgp_imexport_vpn
,
9535 bgp_imexport_vpn_cmd
,
9536 "[no] <import|export>$direction_str vpn",
9538 "Import routes to this address-family\n"
9539 "Export routes from this address-family\n"
9540 "to/from default instance VPN RIB\n")
9542 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9549 enum vpn_policy_direction dir
;
9551 if (argv_find(argv
, argc
, "no", &idx
))
9554 if (BGP_INSTANCE_TYPE_VRF
!= bgp
->inst_type
&&
9555 BGP_INSTANCE_TYPE_DEFAULT
!= bgp
->inst_type
) {
9557 vty_out(vty
, "%% import|export vpn valid only for bgp vrf or default instance\n");
9558 return CMD_WARNING_CONFIG_FAILED
;
9561 afi
= bgp_node_afi(vty
);
9562 safi
= bgp_node_safi(vty
);
9563 if ((SAFI_UNICAST
!= safi
) || ((AFI_IP
!= afi
) && (AFI_IP6
!= afi
))) {
9564 vty_out(vty
, "%% import|export vpn valid only for unicast ipv4|ipv6\n");
9565 return CMD_WARNING_CONFIG_FAILED
;
9568 if (!strcmp(direction_str
, "import")) {
9569 flag
= BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT
;
9570 dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
9571 } else if (!strcmp(direction_str
, "export")) {
9572 flag
= BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT
;
9573 dir
= BGP_VPN_POLICY_DIR_TOVPN
;
9575 vty_out(vty
, "%% unknown direction %s\n", direction_str
);
9576 return CMD_WARNING_CONFIG_FAILED
;
9579 previous_state
= CHECK_FLAG(bgp
->af_flags
[afi
][safi
], flag
);
9582 SET_FLAG(bgp
->af_flags
[afi
][safi
], flag
);
9583 if (!previous_state
) {
9584 /* trigger export current vrf */
9585 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
9588 if (previous_state
) {
9589 /* trigger un-export current vrf */
9590 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
9592 UNSET_FLAG(bgp
->af_flags
[afi
][safi
], flag
);
9595 hook_call(bgp_snmp_init_stats
, bgp
);
9600 DEFPY (af_routetarget_import
,
9601 af_routetarget_import_cmd
,
9602 "[no] <rt|route-target|route-target6|rt6> redirect import RTLIST...",
9604 "Specify route target list\n"
9605 "Specify route target list\n"
9606 "Specify route target list\n"
9607 "Specify route target list\n"
9608 "Flow-spec redirect type route target\n"
9609 "Import routes to this address-family\n"
9610 "Space separated route target list (A.B.C.D:MN|EF:OPQR|GHJK:MN|IPV6:MN)\n")
9612 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9614 struct ecommunity
*ecom
= NULL
;
9616 int idx
= 0, idx_unused
= 0;
9620 if (argv_find(argv
, argc
, "no", &idx
))
9623 if (argv_find(argv
, argc
, "rt6", &idx_unused
) ||
9624 argv_find(argv
, argc
, "route-target6", &idx_unused
))
9627 afi
= vpn_policy_getafi(vty
, bgp
, false);
9629 return CMD_WARNING_CONFIG_FAILED
;
9631 if (rt6
&& afi
!= AFI_IP6
)
9632 return CMD_WARNING_CONFIG_FAILED
;
9635 if (!argv_find(argv
, argc
, "RTLIST", &idx
)) {
9636 vty_out(vty
, "%% Missing RTLIST\n");
9637 return CMD_WARNING_CONFIG_FAILED
;
9639 ret
= set_ecom_list(vty
, argc
- idx
, argv
+ idx
, &ecom
, rt6
);
9640 if (ret
!= CMD_SUCCESS
)
9645 if (bgp
->vpn_policy
[afi
].import_redirect_rtlist
)
9646 ecommunity_free(&bgp
->vpn_policy
[afi
]
9647 .import_redirect_rtlist
);
9648 bgp
->vpn_policy
[afi
].import_redirect_rtlist
=
9649 ecommunity_dup(ecom
);
9651 if (bgp
->vpn_policy
[afi
].import_redirect_rtlist
)
9652 ecommunity_free(&bgp
->vpn_policy
[afi
]
9653 .import_redirect_rtlist
);
9654 bgp
->vpn_policy
[afi
].import_redirect_rtlist
= NULL
;
9658 ecommunity_free(&ecom
);
9663 DEFUN_NOSH (address_family_ipv4_safi
,
9664 address_family_ipv4_safi_cmd
,
9665 "address-family ipv4 [<unicast|multicast|vpn|labeled-unicast|flowspec>]",
9666 "Enter Address Family command mode\n"
9668 BGP_SAFI_WITH_LABEL_HELP_STR
)
9672 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9673 safi_t safi
= bgp_vty_safi_from_str(argv
[2]->text
);
9674 if (bgp
->inst_type
!= BGP_INSTANCE_TYPE_DEFAULT
9675 && safi
!= SAFI_UNICAST
&& safi
!= SAFI_MULTICAST
9676 && safi
!= SAFI_EVPN
) {
9678 "Only Unicast/Multicast/EVPN SAFIs supported in non-core instances.\n");
9679 return CMD_WARNING_CONFIG_FAILED
;
9681 vty
->node
= bgp_node_type(AFI_IP
, safi
);
9683 vty
->node
= BGP_IPV4_NODE
;
9688 DEFUN_NOSH (address_family_ipv6_safi
,
9689 address_family_ipv6_safi_cmd
,
9690 "address-family ipv6 [<unicast|multicast|vpn|labeled-unicast|flowspec>]",
9691 "Enter Address Family command mode\n"
9693 BGP_SAFI_WITH_LABEL_HELP_STR
)
9696 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9697 safi_t safi
= bgp_vty_safi_from_str(argv
[2]->text
);
9698 if (bgp
->inst_type
!= BGP_INSTANCE_TYPE_DEFAULT
9699 && safi
!= SAFI_UNICAST
&& safi
!= SAFI_MULTICAST
9700 && safi
!= SAFI_EVPN
) {
9702 "Only Unicast/Multicast/EVPN SAFIs supported in non-core instances.\n");
9703 return CMD_WARNING_CONFIG_FAILED
;
9705 vty
->node
= bgp_node_type(AFI_IP6
, safi
);
9707 vty
->node
= BGP_IPV6_NODE
;
9712 #ifdef KEEP_OLD_VPN_COMMANDS
9713 DEFUN_NOSH (address_family_vpnv4
,
9714 address_family_vpnv4_cmd
,
9715 "address-family vpnv4 [unicast]",
9716 "Enter Address Family command mode\n"
9718 BGP_AF_MODIFIER_STR
)
9720 vty
->node
= BGP_VPNV4_NODE
;
9724 DEFUN_NOSH (address_family_vpnv6
,
9725 address_family_vpnv6_cmd
,
9726 "address-family vpnv6 [unicast]",
9727 "Enter Address Family command mode\n"
9729 BGP_AF_MODIFIER_STR
)
9731 vty
->node
= BGP_VPNV6_NODE
;
9734 #endif /* KEEP_OLD_VPN_COMMANDS */
9736 DEFUN_NOSH (address_family_evpn
,
9737 address_family_evpn_cmd
,
9738 "address-family l2vpn evpn",
9739 "Enter Address Family command mode\n"
9741 BGP_AF_MODIFIER_STR
)
9743 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9744 vty
->node
= BGP_EVPN_NODE
;
9748 DEFUN_NOSH (bgp_segment_routing_srv6
,
9749 bgp_segment_routing_srv6_cmd
,
9750 "segment-routing srv6",
9751 "Segment-Routing configuration\n"
9752 "Segment-Routing SRv6 configuration\n")
9754 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9755 bgp
->srv6_enabled
= true;
9756 vty
->node
= BGP_SRV6_NODE
;
9760 DEFUN (no_bgp_segment_routing_srv6
,
9761 no_bgp_segment_routing_srv6_cmd
,
9762 "no segment-routing srv6",
9764 "Segment-Routing configuration\n"
9765 "Segment-Routing SRv6 configuration\n")
9767 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9769 if (strlen(bgp
->srv6_locator_name
) > 0)
9770 if (bgp_srv6_locator_unset(bgp
) < 0)
9771 return CMD_WARNING_CONFIG_FAILED
;
9773 bgp
->srv6_enabled
= false;
9777 DEFPY (bgp_srv6_locator
,
9778 bgp_srv6_locator_cmd
,
9779 "locator NAME$name",
9780 "Specify SRv6 locator\n"
9781 "Specify SRv6 locator\n")
9783 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9786 if (strlen(bgp
->srv6_locator_name
) > 0
9787 && strcmp(name
, bgp
->srv6_locator_name
) != 0) {
9788 vty_out(vty
, "srv6 locator is already configured\n");
9789 return CMD_WARNING_CONFIG_FAILED
;
9792 snprintf(bgp
->srv6_locator_name
,
9793 sizeof(bgp
->srv6_locator_name
), "%s", name
);
9795 ret
= bgp_zebra_srv6_manager_get_locator_chunk(name
);
9797 return CMD_WARNING_CONFIG_FAILED
;
9802 DEFPY (no_bgp_srv6_locator
,
9803 no_bgp_srv6_locator_cmd
,
9804 "no locator NAME$name",
9806 "Specify SRv6 locator\n"
9807 "Specify SRv6 locator\n")
9809 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9811 /* when locator isn't configured, do nothing */
9812 if (strlen(bgp
->srv6_locator_name
) < 1)
9815 /* name validation */
9816 if (strcmp(name
, bgp
->srv6_locator_name
) != 0) {
9817 vty_out(vty
, "%% No srv6 locator is configured\n");
9818 return CMD_WARNING_CONFIG_FAILED
;
9822 if (bgp_srv6_locator_unset(bgp
) < 0)
9823 return CMD_WARNING_CONFIG_FAILED
;
9828 DEFPY (show_bgp_srv6
,
9830 "show bgp segment-routing srv6",
9833 "BGP Segment Routing\n"
9834 "BGP Segment Routing SRv6\n")
9837 struct listnode
*node
;
9838 struct srv6_locator_chunk
*chunk
;
9839 struct bgp_srv6_function
*func
;
9842 bgp
= bgp_get_default();
9846 vty_out(vty
, "locator_name: %s\n", bgp
->srv6_locator_name
);
9847 vty_out(vty
, "locator_chunks:\n");
9848 for (ALL_LIST_ELEMENTS_RO(bgp
->srv6_locator_chunks
, node
, chunk
)) {
9849 vty_out(vty
, "- %pFX\n", &chunk
->prefix
);
9850 vty_out(vty
, " block-length: %d\n", chunk
->block_bits_length
);
9851 vty_out(vty
, " node-length: %d\n", chunk
->node_bits_length
);
9852 vty_out(vty
, " func-length: %d\n",
9853 chunk
->function_bits_length
);
9854 vty_out(vty
, " arg-length: %d\n", chunk
->argument_bits_length
);
9857 vty_out(vty
, "functions:\n");
9858 for (ALL_LIST_ELEMENTS_RO(bgp
->srv6_functions
, node
, func
)) {
9859 inet_ntop(AF_INET6
, &func
->sid
, buf
, sizeof(buf
));
9860 vty_out(vty
, "- sid: %s\n", buf
);
9861 vty_out(vty
, " locator: %s\n", func
->locator_name
);
9864 vty_out(vty
, "bgps:\n");
9865 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, node
, bgp
)) {
9866 vty_out(vty
, "- name: %s\n",
9867 bgp
->name
? bgp
->name
: "default");
9869 vty_out(vty
, " vpn_policy[AFI_IP].tovpn_sid: %pI6\n",
9870 bgp
->vpn_policy
[AFI_IP
].tovpn_sid
);
9871 vty_out(vty
, " vpn_policy[AFI_IP6].tovpn_sid: %pI6\n",
9872 bgp
->vpn_policy
[AFI_IP6
].tovpn_sid
);
9873 vty_out(vty
, " per-vrf tovpn_sid: %pI6\n", bgp
->tovpn_sid
);
9879 DEFUN_NOSH (exit_address_family
,
9880 exit_address_family_cmd
,
9881 "exit-address-family",
9882 "Exit from Address Family configuration mode\n")
9884 if (vty
->node
== BGP_IPV4_NODE
|| vty
->node
== BGP_IPV4M_NODE
9885 || vty
->node
== BGP_IPV4L_NODE
|| vty
->node
== BGP_VPNV4_NODE
9886 || vty
->node
== BGP_IPV6_NODE
|| vty
->node
== BGP_IPV6M_NODE
9887 || vty
->node
== BGP_IPV6L_NODE
|| vty
->node
== BGP_VPNV6_NODE
9888 || vty
->node
== BGP_EVPN_NODE
9889 || vty
->node
== BGP_FLOWSPECV4_NODE
9890 || vty
->node
== BGP_FLOWSPECV6_NODE
)
9891 vty
->node
= BGP_NODE
;
9895 /* Recalculate bestpath and re-advertise a prefix */
9896 static int bgp_clear_prefix(struct vty
*vty
, const char *view_name
,
9897 const char *ip_str
, afi_t afi
, safi_t safi
,
9898 struct prefix_rd
*prd
)
9901 struct prefix match
;
9902 struct bgp_dest
*dest
;
9903 struct bgp_dest
*rm
;
9905 struct bgp_table
*table
;
9906 struct bgp_table
*rib
;
9908 /* BGP structure lookup. */
9910 bgp
= bgp_lookup_by_name(view_name
);
9912 vty_out(vty
, "%% Can't find BGP instance %s\n",
9917 bgp
= bgp_get_default();
9919 vty_out(vty
, "%% No BGP process is configured\n");
9924 /* Check IP address argument. */
9925 ret
= str2prefix(ip_str
, &match
);
9927 vty_out(vty
, "%% address is malformed\n");
9931 match
.family
= afi2family(afi
);
9932 rib
= bgp
->rib
[afi
][safi
];
9934 if (safi
== SAFI_MPLS_VPN
) {
9935 for (dest
= bgp_table_top(rib
); dest
;
9936 dest
= bgp_route_next(dest
)) {
9937 const struct prefix
*dest_p
= bgp_dest_get_prefix(dest
);
9939 if (prd
&& memcmp(dest_p
->u
.val
, prd
->val
, 8) != 0)
9942 table
= bgp_dest_get_bgp_table_info(dest
);
9946 rm
= bgp_node_match(table
, &match
);
9948 const struct prefix
*rm_p
=
9949 bgp_dest_get_prefix(rm
);
9951 if (rm_p
->prefixlen
== match
.prefixlen
) {
9953 BGP_NODE_USER_CLEAR
);
9954 bgp_process(bgp
, rm
, afi
, safi
);
9956 bgp_dest_unlock_node(rm
);
9960 dest
= bgp_node_match(rib
, &match
);
9962 const struct prefix
*dest_p
= bgp_dest_get_prefix(dest
);
9964 if (dest_p
->prefixlen
== match
.prefixlen
) {
9965 SET_FLAG(dest
->flags
, BGP_NODE_USER_CLEAR
);
9966 bgp_process(bgp
, dest
, afi
, safi
);
9968 bgp_dest_unlock_node(dest
);
9975 /* one clear bgp command to rule them all */
9976 DEFUN (clear_ip_bgp_all
,
9977 clear_ip_bgp_all_cmd
,
9978 "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>]",
9982 BGP_INSTANCE_HELP_STR
9985 BGP_SAFI_WITH_LABEL_HELP_STR
9988 "BGP IPv4 neighbor to clear\n"
9989 "BGP IPv6 neighbor to clear\n"
9990 "BGP neighbor on interface to clear\n"
9991 "Clear peers with the AS number\n"
9992 "Clear all external peers\n"
9993 "Clear all members of peer-group\n"
9994 "BGP peer-group name\n"
9999 "Push out prefix-list ORF and do inbound soft reconfig\n"
10001 "Reset message statistics\n")
10005 afi_t afi
= AFI_UNSPEC
;
10006 safi_t safi
= SAFI_UNSPEC
;
10007 enum clear_sort clr_sort
= clear_peer
;
10008 enum bgp_clear_type clr_type
;
10009 char *clr_arg
= NULL
;
10013 /* clear [ip] bgp */
10014 if (argv_find(argv
, argc
, "ip", &idx
))
10017 /* [<vrf> VIEWVRFNAME] */
10018 if (argv_find(argv
, argc
, "vrf", &idx
)) {
10019 vrf
= argv
[idx
+ 1]->arg
;
10021 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
10023 } else if (argv_find(argv
, argc
, "view", &idx
)) {
10024 /* [<view> VIEWVRFNAME] */
10025 vrf
= argv
[idx
+ 1]->arg
;
10028 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
10029 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
))
10030 argv_find_and_parse_safi(argv
, argc
, &idx
, &safi
);
10032 /* <*|A.B.C.D|X:X::X:X|WORD|(1-4294967295)|external|peer-group PGNAME> */
10033 if (argv_find(argv
, argc
, "*", &idx
)) {
10034 clr_sort
= clear_all
;
10035 } else if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
10036 clr_sort
= clear_peer
;
10037 clr_arg
= argv
[idx
]->arg
;
10038 } else if (argv_find(argv
, argc
, "X:X::X:X", &idx
)) {
10039 clr_sort
= clear_peer
;
10040 clr_arg
= argv
[idx
]->arg
;
10041 } else if (argv_find(argv
, argc
, "peer-group", &idx
)) {
10042 clr_sort
= clear_group
;
10044 clr_arg
= argv
[idx
]->arg
;
10045 } else if (argv_find(argv
, argc
, "PGNAME", &idx
)) {
10046 clr_sort
= clear_peer
;
10047 clr_arg
= argv
[idx
]->arg
;
10048 } else if (argv_find(argv
, argc
, "WORD", &idx
)) {
10049 clr_sort
= clear_peer
;
10050 clr_arg
= argv
[idx
]->arg
;
10051 } else if (argv_find(argv
, argc
, "(1-4294967295)", &idx
)) {
10052 clr_sort
= clear_as
;
10053 clr_arg
= argv
[idx
]->arg
;
10054 } else if (argv_find(argv
, argc
, "external", &idx
)) {
10055 clr_sort
= clear_external
;
10058 /* [<soft [<in|out>]|in [prefix-filter]|out|message-stats>] */
10059 if (argv_find(argv
, argc
, "soft", &idx
)) {
10060 if (argv_find(argv
, argc
, "in", &idx
)
10061 || argv_find(argv
, argc
, "out", &idx
))
10062 clr_type
= strmatch(argv
[idx
]->text
, "in")
10063 ? BGP_CLEAR_SOFT_IN
10064 : BGP_CLEAR_SOFT_OUT
;
10066 clr_type
= BGP_CLEAR_SOFT_BOTH
;
10067 } else if (argv_find(argv
, argc
, "in", &idx
)) {
10068 clr_type
= argv_find(argv
, argc
, "prefix-filter", &idx
)
10069 ? BGP_CLEAR_SOFT_IN_ORF_PREFIX
10070 : BGP_CLEAR_SOFT_IN
;
10071 } else if (argv_find(argv
, argc
, "out", &idx
)) {
10072 clr_type
= BGP_CLEAR_SOFT_OUT
;
10073 } else if (argv_find(argv
, argc
, "message-stats", &idx
)) {
10074 clr_type
= BGP_CLEAR_MESSAGE_STATS
;
10076 clr_type
= BGP_CLEAR_SOFT_NONE
;
10078 return bgp_clear_vty(vty
, vrf
, afi
, safi
, clr_sort
, clr_type
, clr_arg
);
10081 DEFUN (clear_ip_bgp_prefix
,
10082 clear_ip_bgp_prefix_cmd
,
10083 "clear [ip] bgp [<view|vrf> VIEWVRFNAME] prefix A.B.C.D/M",
10087 BGP_INSTANCE_HELP_STR
10088 "Clear bestpath and re-advertise\n"
10092 char *prefix
= NULL
;
10096 /* [<view|vrf> VIEWVRFNAME] */
10097 if (argv_find(argv
, argc
, "vrf", &idx
)) {
10098 vrf
= argv
[idx
+ 1]->arg
;
10100 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
10102 } else if (argv_find(argv
, argc
, "view", &idx
)) {
10103 /* [<view> VIEWVRFNAME] */
10104 vrf
= argv
[idx
+ 1]->arg
;
10108 prefix
= argv
[argc
- 1]->arg
;
10110 return bgp_clear_prefix(vty
, vrf
, prefix
, AFI_IP
, SAFI_UNICAST
, NULL
);
10113 DEFUN (clear_bgp_ipv6_safi_prefix
,
10114 clear_bgp_ipv6_safi_prefix_cmd
,
10115 "clear [ip] bgp ipv6 "BGP_SAFI_CMD_STR
" prefix X:X::X:X/M",
10121 "Clear bestpath and re-advertise\n"
10125 int idx_ipv6_prefix
= 0;
10126 safi_t safi
= SAFI_UNICAST
;
10127 char *prefix
= argv_find(argv
, argc
, "X:X::X:X/M", &idx_ipv6_prefix
) ?
10128 argv
[idx_ipv6_prefix
]->arg
: NULL
;
10130 argv_find_and_parse_safi(argv
, argc
, &idx_safi
, &safi
);
10131 return bgp_clear_prefix(
10132 vty
, NULL
, prefix
, AFI_IP6
,
10136 DEFUN (clear_bgp_instance_ipv6_safi_prefix
,
10137 clear_bgp_instance_ipv6_safi_prefix_cmd
,
10138 "clear [ip] bgp <view|vrf> VIEWVRFNAME ipv6 "BGP_SAFI_CMD_STR
" prefix X:X::X:X/M",
10142 BGP_INSTANCE_HELP_STR
10145 "Clear bestpath and re-advertise\n"
10149 int idx_vrfview
= 0;
10150 int idx_ipv6_prefix
= 0;
10151 safi_t safi
= SAFI_UNICAST
;
10152 char *prefix
= argv_find(argv
, argc
, "X:X::X:X/M", &idx_ipv6_prefix
) ?
10153 argv
[idx_ipv6_prefix
]->arg
: NULL
;
10154 char *vrfview
= NULL
;
10156 /* [<view|vrf> VIEWVRFNAME] */
10157 if (argv_find(argv
, argc
, "vrf", &idx_vrfview
)) {
10158 vrfview
= argv
[idx_vrfview
+ 1]->arg
;
10159 if (vrfview
&& strmatch(vrfview
, VRF_DEFAULT_NAME
))
10161 } else if (argv_find(argv
, argc
, "view", &idx_vrfview
)) {
10162 /* [<view> VIEWVRFNAME] */
10163 vrfview
= argv
[idx_vrfview
+ 1]->arg
;
10165 argv_find_and_parse_safi(argv
, argc
, &idx_safi
, &safi
);
10167 return bgp_clear_prefix(
10168 vty
, vrfview
, prefix
,
10169 AFI_IP6
, safi
, NULL
);
10172 DEFUN (show_bgp_views
,
10173 show_bgp_views_cmd
,
10174 "show [ip] bgp views",
10178 "Show the defined BGP views\n")
10180 struct list
*inst
= bm
->bgp
;
10181 struct listnode
*node
;
10184 vty_out(vty
, "Defined BGP views:\n");
10185 for (ALL_LIST_ELEMENTS_RO(inst
, node
, bgp
)) {
10187 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_VRF
)
10189 vty_out(vty
, "\t%s (AS%u)\n", bgp
->name
? bgp
->name
: "(null)",
10193 return CMD_SUCCESS
;
10196 DEFUN (show_bgp_vrfs
,
10198 "show [ip] bgp vrfs [json]",
10205 char buf
[ETHER_ADDR_STRLEN
];
10206 struct list
*inst
= bm
->bgp
;
10207 struct listnode
*node
;
10209 bool uj
= use_json(argc
, argv
);
10210 json_object
*json
= NULL
;
10211 json_object
*json_vrfs
= NULL
;
10215 json
= json_object_new_object();
10216 json_vrfs
= json_object_new_object();
10219 for (ALL_LIST_ELEMENTS_RO(inst
, node
, bgp
)) {
10220 const char *name
, *type
;
10222 struct listnode
*node2
, *nnode2
;
10223 int peers_cfg
, peers_estb
;
10224 json_object
*json_vrf
= NULL
;
10227 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_VIEW
)
10231 if (!uj
&& count
== 1) {
10233 "%4s %-5s %-16s %9s %10s %-37s\n",
10234 "Type", "Id", "routerId", "#PeersCfg",
10235 "#PeersEstb", "Name");
10236 vty_out(vty
, "%11s %-16s %-21s %-6s\n", " ",
10237 "L3-VNI", "RouterMAC", "Interface");
10240 peers_cfg
= peers_estb
= 0;
10242 json_vrf
= json_object_new_object();
10245 for (ALL_LIST_ELEMENTS(bgp
->peer
, node2
, nnode2
, peer
)) {
10246 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
10249 if (peer_established(peer
))
10253 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
) {
10254 name
= VRF_DEFAULT_NAME
;
10263 int64_t vrf_id_ui
= (bgp
->vrf_id
== VRF_UNKNOWN
)
10265 : (int64_t)bgp
->vrf_id
;
10266 char buf
[BUFSIZ
] = {0};
10268 json_object_string_add(json_vrf
, "type", type
);
10269 json_object_int_add(json_vrf
, "vrfId", vrf_id_ui
);
10270 json_object_string_addf(json_vrf
, "routerId", "%pI4",
10272 json_object_int_add(json_vrf
, "numConfiguredPeers",
10274 json_object_int_add(json_vrf
, "numEstablishedPeers",
10277 json_object_int_add(json_vrf
, "l3vni", bgp
->l3vni
);
10278 json_object_string_add(
10280 prefix_mac2str(&bgp
->rmac
, buf
, sizeof(buf
)));
10281 json_object_string_add(json_vrf
, "interface",
10282 ifindex2ifname(bgp
->l3vni_svi_ifindex
,
10284 json_object_object_add(json_vrfs
, name
, json_vrf
);
10286 vty_out(vty
, "%4s %-5d %-16pI4 %-9u %-10u %-37s\n",
10288 bgp
->vrf_id
== VRF_UNKNOWN
? -1
10289 : (int)bgp
->vrf_id
,
10290 &bgp
->router_id
, peers_cfg
, peers_estb
, name
);
10291 vty_out(vty
,"%11s %-16u %-21s %-20s\n", " ",
10293 prefix_mac2str(&bgp
->rmac
, buf
, sizeof(buf
)),
10294 ifindex2ifname(bgp
->l3vni_svi_ifindex
,
10300 json_object_object_add(json
, "vrfs", json_vrfs
);
10302 json_object_int_add(json
, "totalVrfs", count
);
10304 vty_json(vty
, json
);
10308 "\nTotal number of VRFs (including default): %d\n",
10312 return CMD_SUCCESS
;
10315 DEFUN (show_bgp_mac_hash
,
10316 show_bgp_mac_hash_cmd
,
10317 "show bgp mac hash",
10321 "Mac Address database\n")
10323 bgp_mac_dump_table(vty
);
10325 return CMD_SUCCESS
;
10328 static void show_tip_entry(struct hash_bucket
*bucket
, void *args
)
10330 struct vty
*vty
= (struct vty
*)args
;
10331 struct tip_addr
*tip
= (struct tip_addr
*)bucket
->data
;
10333 vty_out(vty
, "addr: %pI4, count: %d\n", &tip
->addr
, tip
->refcnt
);
10336 static void bgp_show_martian_nexthops(struct vty
*vty
, struct bgp
*bgp
)
10338 vty_out(vty
, "self nexthop database:\n");
10339 bgp_nexthop_show_address_hash(vty
, bgp
);
10341 vty_out(vty
, "Tunnel-ip database:\n");
10342 hash_iterate(bgp
->tip_hash
,
10343 (void (*)(struct hash_bucket
*, void *))show_tip_entry
,
10347 DEFUN(show_bgp_martian_nexthop_db
, show_bgp_martian_nexthop_db_cmd
,
10348 "show bgp [<view|vrf> VIEWVRFNAME] martian next-hop",
10349 SHOW_STR BGP_STR BGP_INSTANCE_HELP_STR
10350 "martian next-hops\n"
10351 "martian next-hop database\n")
10353 struct bgp
*bgp
= NULL
;
10357 /* [<vrf> VIEWVRFNAME] */
10358 if (argv_find(argv
, argc
, "vrf", &idx
)) {
10359 name
= argv
[idx
+ 1]->arg
;
10360 if (name
&& strmatch(name
, VRF_DEFAULT_NAME
))
10362 } else if (argv_find(argv
, argc
, "view", &idx
))
10363 /* [<view> VIEWVRFNAME] */
10364 name
= argv
[idx
+ 1]->arg
;
10366 bgp
= bgp_lookup_by_name(name
);
10368 bgp
= bgp_get_default();
10371 vty_out(vty
, "%% No BGP process is configured\n");
10372 return CMD_WARNING
;
10374 bgp_show_martian_nexthops(vty
, bgp
);
10376 return CMD_SUCCESS
;
10379 DEFUN (show_bgp_memory
,
10380 show_bgp_memory_cmd
,
10381 "show [ip] bgp memory",
10385 "Global BGP memory statistics\n")
10387 char memstrbuf
[MTYPE_MEMSTR_LEN
];
10388 unsigned long count
;
10390 /* RIB related usage stats */
10391 count
= mtype_stats_alloc(MTYPE_BGP_NODE
);
10392 vty_out(vty
, "%ld RIB nodes, using %s of memory\n", count
,
10393 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
10394 count
* sizeof(struct bgp_dest
)));
10396 count
= mtype_stats_alloc(MTYPE_BGP_ROUTE
);
10397 vty_out(vty
, "%ld BGP routes, using %s of memory\n", count
,
10398 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
10399 count
* sizeof(struct bgp_path_info
)));
10400 if ((count
= mtype_stats_alloc(MTYPE_BGP_ROUTE_EXTRA
)))
10401 vty_out(vty
, "%ld BGP route ancillaries, using %s of memory\n",
10404 memstrbuf
, sizeof(memstrbuf
),
10405 count
* sizeof(struct bgp_path_info_extra
)));
10407 if ((count
= mtype_stats_alloc(MTYPE_BGP_STATIC
)))
10408 vty_out(vty
, "%ld Static routes, using %s of memory\n", count
,
10409 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
10410 count
* sizeof(struct bgp_static
)));
10412 if ((count
= mtype_stats_alloc(MTYPE_BGP_PACKET
)))
10413 vty_out(vty
, "%ld Packets, using %s of memory\n", count
,
10414 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
10415 count
* sizeof(struct bpacket
)));
10418 if ((count
= mtype_stats_alloc(MTYPE_BGP_ADJ_IN
)))
10419 vty_out(vty
, "%ld Adj-In entries, using %s of memory\n", count
,
10420 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
10421 count
* sizeof(struct bgp_adj_in
)));
10422 if ((count
= mtype_stats_alloc(MTYPE_BGP_ADJ_OUT
)))
10423 vty_out(vty
, "%ld Adj-Out entries, using %s of memory\n", count
,
10424 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
10425 count
* sizeof(struct bgp_adj_out
)));
10427 if ((count
= mtype_stats_alloc(MTYPE_BGP_NEXTHOP_CACHE
)))
10428 vty_out(vty
, "%ld Nexthop cache entries, using %s of memory\n",
10430 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
10431 count
* sizeof(struct bgp_nexthop_cache
)));
10433 if ((count
= mtype_stats_alloc(MTYPE_BGP_DAMP_INFO
)))
10434 vty_out(vty
, "%ld Dampening entries, using %s of memory\n",
10436 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
10437 count
* sizeof(struct bgp_damp_info
)));
10440 count
= attr_count();
10441 vty_out(vty
, "%ld BGP attributes, using %s of memory\n", count
,
10442 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
10443 count
* sizeof(struct attr
)));
10445 if ((count
= attr_unknown_count()))
10446 vty_out(vty
, "%ld unknown attributes\n", count
);
10448 /* AS_PATH attributes */
10449 count
= aspath_count();
10450 vty_out(vty
, "%ld BGP AS-PATH entries, using %s of memory\n", count
,
10451 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
10452 count
* sizeof(struct aspath
)));
10454 count
= mtype_stats_alloc(MTYPE_AS_SEG
);
10455 vty_out(vty
, "%ld BGP AS-PATH segments, using %s of memory\n", count
,
10456 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
10457 count
* sizeof(struct assegment
)));
10459 /* Other attributes */
10460 if ((count
= community_count()))
10461 vty_out(vty
, "%ld BGP community entries, using %s of memory\n",
10462 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
10463 count
* sizeof(struct community
)));
10464 if ((count
= mtype_stats_alloc(MTYPE_ECOMMUNITY
)))
10466 "%ld BGP ext-community entries, using %s of memory\n",
10468 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
10469 count
* sizeof(struct ecommunity
)));
10470 if ((count
= mtype_stats_alloc(MTYPE_LCOMMUNITY
)))
10472 "%ld BGP large-community entries, using %s of memory\n",
10473 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
10474 count
* sizeof(struct lcommunity
)));
10476 if ((count
= mtype_stats_alloc(MTYPE_CLUSTER
)))
10477 vty_out(vty
, "%ld Cluster lists, using %s of memory\n", count
,
10478 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
10479 count
* sizeof(struct cluster_list
)));
10481 /* Peer related usage */
10482 count
= mtype_stats_alloc(MTYPE_BGP_PEER
);
10483 vty_out(vty
, "%ld peers, using %s of memory\n", count
,
10484 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
10485 count
* sizeof(struct peer
)));
10487 if ((count
= mtype_stats_alloc(MTYPE_PEER_GROUP
)))
10488 vty_out(vty
, "%ld peer groups, using %s of memory\n", count
,
10489 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
10490 count
* sizeof(struct peer_group
)));
10493 if ((count
= mtype_stats_alloc(MTYPE_BGP_REGEXP
)))
10494 vty_out(vty
, "%ld compiled regexes, using %s of memory\n",
10495 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
10496 count
* sizeof(regex_t
)));
10497 return CMD_SUCCESS
;
10500 static void bgp_show_bestpath_json(struct bgp
*bgp
, json_object
*json
)
10502 json_object
*bestpath
= json_object_new_object();
10504 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_ASPATH_IGNORE
))
10505 json_object_string_add(bestpath
, "asPath", "ignore");
10507 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_ASPATH_CONFED
))
10508 json_object_string_add(bestpath
, "asPath", "confed");
10510 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
)) {
10511 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_MULTIPATH_RELAX_AS_SET
))
10512 json_object_string_add(bestpath
, "multiPathRelax",
10515 json_object_string_add(bestpath
, "multiPathRelax",
10518 json_object_string_add(bestpath
, "multiPathRelax", "false");
10520 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_PEERTYPE_MULTIPATH_RELAX
))
10521 json_object_boolean_true_add(bestpath
, "peerTypeRelax");
10523 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_COMPARE_ROUTER_ID
))
10524 json_object_string_add(bestpath
, "compareRouterId", "true");
10525 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_MED_CONFED
)
10526 || CHECK_FLAG(bgp
->flags
, BGP_FLAG_MED_MISSING_AS_WORST
)) {
10527 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_MED_CONFED
))
10528 json_object_string_add(bestpath
, "med", "confed");
10529 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_MED_MISSING_AS_WORST
))
10530 json_object_string_add(bestpath
, "med",
10531 "missing-as-worst");
10533 json_object_string_add(bestpath
, "med", "true");
10536 json_object_object_add(json
, "bestPath", bestpath
);
10539 /* Print the error code/subcode for why the peer is down */
10540 static void bgp_show_peer_reset(struct vty
* vty
, struct peer
*peer
,
10541 json_object
*json_peer
, bool use_json
)
10543 const char *code_str
;
10544 const char *subcode_str
;
10547 if (peer
->last_reset
== PEER_DOWN_NOTIFY_SEND
10548 || peer
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
) {
10549 char errorcodesubcode_hexstr
[5];
10550 char errorcodesubcode_str
[256];
10552 code_str
= bgp_notify_code_str(peer
->notify
.code
);
10553 subcode_str
= bgp_notify_subcode_str(
10555 peer
->notify
.subcode
);
10557 snprintf(errorcodesubcode_hexstr
,
10558 sizeof(errorcodesubcode_hexstr
), "%02X%02X",
10559 peer
->notify
.code
, peer
->notify
.subcode
);
10560 json_object_string_add(json_peer
,
10561 "lastErrorCodeSubcode",
10562 errorcodesubcode_hexstr
);
10563 snprintf(errorcodesubcode_str
, 255, "%s%s",
10564 code_str
, subcode_str
);
10565 json_object_string_add(json_peer
,
10566 "lastNotificationReason",
10567 errorcodesubcode_str
);
10568 json_object_boolean_add(json_peer
,
10569 "lastNotificationHardReset",
10570 peer
->notify
.hard_reset
);
10571 if (peer
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
10572 && peer
->notify
.code
== BGP_NOTIFY_CEASE
10573 && (peer
->notify
.subcode
10574 == BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
10575 || peer
->notify
.subcode
10576 == BGP_NOTIFY_CEASE_ADMIN_RESET
)
10577 && peer
->notify
.length
) {
10579 const char *msg_str
;
10581 msg_str
= bgp_notify_admin_message(
10582 msgbuf
, sizeof(msgbuf
),
10583 (uint8_t *)peer
->notify
.data
,
10584 peer
->notify
.length
);
10586 json_object_string_add(
10588 "lastShutdownDescription",
10593 json_object_string_add(json_peer
, "lastResetDueTo",
10594 peer_down_str
[(int)peer
->last_reset
]);
10595 json_object_int_add(json_peer
, "lastResetCode",
10598 if (peer
->last_reset
== PEER_DOWN_NOTIFY_SEND
10599 || peer
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
) {
10600 code_str
= bgp_notify_code_str(peer
->notify
.code
);
10602 bgp_notify_subcode_str(peer
->notify
.code
,
10603 peer
->notify
.subcode
);
10604 vty_out(vty
, " Notification %s (%s%s%s)\n",
10605 peer
->last_reset
== PEER_DOWN_NOTIFY_SEND
10608 code_str
, subcode_str
,
10609 peer
->notify
.hard_reset
10610 ? bgp_notify_subcode_str(
10612 BGP_NOTIFY_CEASE_HARD_RESET
)
10615 vty_out(vty
, " %s\n",
10616 peer_down_str
[(int)peer
->last_reset
]);
10621 static inline bool bgp_has_peer_failed(struct peer
*peer
, afi_t afi
,
10624 return ((!peer_established(peer
)) || !peer
->afc_recv
[afi
][safi
]);
10627 static void bgp_show_failed_summary(struct vty
*vty
, struct bgp
*bgp
,
10628 struct peer
*peer
, json_object
*json_peer
,
10629 int max_neighbor_width
, bool use_json
)
10631 char timebuf
[BGP_UPTIME_LEN
], dn_flag
[2];
10635 if (peer_dynamic_neighbor(peer
))
10636 json_object_boolean_true_add(json_peer
,
10638 if (peer
->hostname
)
10639 json_object_string_add(json_peer
, "hostname",
10642 if (peer
->domainname
)
10643 json_object_string_add(json_peer
, "domainname",
10645 json_object_int_add(json_peer
, "connectionsEstablished",
10646 peer
->established
);
10647 json_object_int_add(json_peer
, "connectionsDropped",
10649 peer_uptime(peer
->uptime
, timebuf
, BGP_UPTIME_LEN
,
10650 use_json
, json_peer
);
10651 if (peer_established(peer
))
10652 json_object_string_add(json_peer
, "lastResetDueTo",
10653 "AFI/SAFI Not Negotiated");
10655 bgp_show_peer_reset(NULL
, peer
, json_peer
, true);
10658 dn_flag
[0] = peer_dynamic_neighbor(peer
) ? '*' : '\0';
10660 && CHECK_FLAG(bgp
->flags
, BGP_FLAG_SHOW_HOSTNAME
))
10661 len
= vty_out(vty
, "%s%s(%s)", dn_flag
,
10662 peer
->hostname
, peer
->host
);
10664 len
= vty_out(vty
, "%s%s", dn_flag
, peer
->host
);
10666 /* pad the neighbor column with spaces */
10667 if (len
< max_neighbor_width
)
10668 vty_out(vty
, "%*s", max_neighbor_width
- len
,
10670 vty_out(vty
, "%7d %7d %9s", peer
->established
,
10672 peer_uptime(peer
->uptime
, timebuf
,
10673 BGP_UPTIME_LEN
, 0, NULL
));
10674 if (peer_established(peer
))
10675 vty_out(vty
, " AFI/SAFI Not Negotiated\n");
10677 bgp_show_peer_reset(vty
, peer
, NULL
,
10682 /* Strip peer's description to the given size. */
10683 static char *bgp_peer_description_stripped(char *desc
, uint32_t size
)
10685 static char stripped
[BUFSIZ
];
10687 uint32_t last_space
= 0;
10690 if (*(desc
+ i
) == 0) {
10691 stripped
[i
] = '\0';
10694 if (i
!= 0 && *(desc
+ i
) == ' ' && last_space
!= i
- 1)
10696 stripped
[i
] = *(desc
+ i
);
10700 if (last_space
> size
)
10701 stripped
[size
+ 1] = '\0';
10703 stripped
[last_space
] = '\0';
10708 /* Determine whether var peer should be filtered out of the summary. */
10709 static bool bgp_show_summary_is_peer_filtered(struct peer
*peer
,
10710 struct peer
*fpeer
, int as_type
,
10714 /* filter neighbor XXXX */
10715 if (fpeer
&& fpeer
!= peer
)
10718 /* filter remote-as (internal|external) */
10719 if (as_type
!= AS_UNSPECIFIED
) {
10720 if (peer
->as_type
== AS_SPECIFIED
) {
10721 if (as_type
== AS_INTERNAL
) {
10722 if (peer
->as
!= peer
->local_as
)
10724 } else if (peer
->as
== peer
->local_as
)
10726 } else if (as_type
!= peer
->as_type
)
10728 } else if (as
&& as
!= peer
->as
) /* filter remote-as XXX */
10734 /* Show BGP peer's summary information.
10736 * Peer's description is stripped according to if `wide` option is given
10739 * When adding new columns to `show bgp summary` output, please make
10740 * sure `Desc` is the lastest column to show because it can contain
10741 * whitespaces and the whole output will be tricky.
10743 static int bgp_show_summary(struct vty
*vty
, struct bgp
*bgp
, int afi
, int safi
,
10744 struct peer
*fpeer
, int as_type
, as_t as
,
10745 uint16_t show_flags
)
10748 struct listnode
*node
, *nnode
;
10749 unsigned int count
= 0, dn_count
= 0;
10750 char timebuf
[BGP_UPTIME_LEN
], dn_flag
[2];
10751 char neighbor_buf
[VTY_BUFSIZ
];
10752 int neighbor_col_default_width
= 16;
10753 int len
, failed_count
= 0;
10754 unsigned int filtered_count
= 0;
10755 int max_neighbor_width
= 0;
10757 json_object
*json
= NULL
;
10758 json_object
*json_peer
= NULL
;
10759 json_object
*json_peers
= NULL
;
10760 struct peer_af
*paf
;
10761 struct bgp_filter
*filter
;
10762 bool use_json
= CHECK_FLAG(show_flags
, BGP_SHOW_OPT_JSON
);
10763 bool show_failed
= CHECK_FLAG(show_flags
, BGP_SHOW_OPT_FAILED
);
10764 bool show_established
=
10765 CHECK_FLAG(show_flags
, BGP_SHOW_OPT_ESTABLISHED
);
10766 bool show_wide
= CHECK_FLAG(show_flags
, BGP_SHOW_OPT_WIDE
);
10767 bool show_terse
= CHECK_FLAG(show_flags
, BGP_SHOW_OPT_TERSE
);
10769 /* labeled-unicast routes are installed in the unicast table so in order
10771 * display the correct PfxRcd value we must look at SAFI_UNICAST
10774 if (safi
== SAFI_LABELED_UNICAST
)
10775 pfx_rcd_safi
= SAFI_UNICAST
;
10777 pfx_rcd_safi
= safi
;
10780 json
= json_object_new_object();
10781 json_peers
= json_object_new_object();
10782 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
10783 if (bgp_show_summary_is_peer_filtered(peer
, fpeer
,
10790 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
10793 if (peer
->afc
[afi
][safi
]) {
10794 /* See if we have at least a single failed peer */
10795 if (bgp_has_peer_failed(peer
, afi
, safi
))
10799 if (peer_dynamic_neighbor(peer
))
10804 /* Loop over all neighbors that will be displayed to determine
10806 * characters are needed for the Neighbor column
10808 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
10809 if (bgp_show_summary_is_peer_filtered(peer
, fpeer
,
10816 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
10819 if (peer
->afc
[afi
][safi
]) {
10820 memset(dn_flag
, '\0', sizeof(dn_flag
));
10821 if (peer_dynamic_neighbor(peer
))
10825 && CHECK_FLAG(bgp
->flags
,
10826 BGP_FLAG_SHOW_HOSTNAME
))
10827 snprintf(neighbor_buf
,
10828 sizeof(neighbor_buf
),
10829 "%s%s(%s) ", dn_flag
,
10830 peer
->hostname
, peer
->host
);
10832 snprintf(neighbor_buf
,
10833 sizeof(neighbor_buf
), "%s%s ",
10834 dn_flag
, peer
->host
);
10836 len
= strlen(neighbor_buf
);
10838 if (len
> max_neighbor_width
)
10839 max_neighbor_width
= len
;
10841 /* See if we have at least a single failed peer */
10842 if (bgp_has_peer_failed(peer
, afi
, safi
))
10848 /* Originally we displayed the Neighbor column as 16
10849 * characters wide so make that the default
10851 if (max_neighbor_width
< neighbor_col_default_width
)
10852 max_neighbor_width
= neighbor_col_default_width
;
10855 if (show_failed
&& !failed_count
) {
10857 json_object_int_add(json
, "failedPeersCount", 0);
10858 json_object_int_add(json
, "dynamicPeers", dn_count
);
10859 json_object_int_add(json
, "totalPeers", count
);
10861 vty_json(vty
, json
);
10863 vty_out(vty
, "%% No failed BGP neighbors found\n");
10865 return CMD_SUCCESS
;
10868 count
= 0; /* Reset the value as its used again */
10869 filtered_count
= 0;
10871 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
10872 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
10875 if (!peer
->afc
[afi
][safi
])
10879 unsigned long ents
;
10880 char memstrbuf
[MTYPE_MEMSTR_LEN
];
10883 vrf_id_ui
= (bgp
->vrf_id
== VRF_UNKNOWN
)
10885 : (int64_t)bgp
->vrf_id
;
10887 /* Usage summary and header */
10889 json_object_string_addf(json
, "routerId",
10892 json_object_int_add(json
, "as", bgp
->as
);
10893 json_object_int_add(json
, "vrfId", vrf_id_ui
);
10894 json_object_string_add(
10897 == BGP_INSTANCE_TYPE_DEFAULT
)
10902 "BGP router identifier %pI4, local AS number %u vrf-id %d",
10903 &bgp
->router_id
, bgp
->as
,
10904 bgp
->vrf_id
== VRF_UNKNOWN
10906 : (int)bgp
->vrf_id
);
10907 vty_out(vty
, "\n");
10910 if (bgp_update_delay_configured(bgp
)) {
10912 json_object_int_add(
10913 json
, "updateDelayLimit",
10914 bgp
->v_update_delay
);
10916 if (bgp
->v_update_delay
10917 != bgp
->v_establish_wait
)
10918 json_object_int_add(
10920 "updateDelayEstablishWait",
10921 bgp
->v_establish_wait
);
10923 if (bgp_update_delay_active(bgp
)) {
10924 json_object_string_add(
10926 "updateDelayFirstNeighbor",
10927 bgp
->update_delay_begin_time
);
10928 json_object_boolean_true_add(
10930 "updateDelayInProgress");
10932 if (bgp
->update_delay_over
) {
10933 json_object_string_add(
10935 "updateDelayFirstNeighbor",
10936 bgp
->update_delay_begin_time
);
10937 json_object_string_add(
10939 "updateDelayBestpathResumed",
10940 bgp
->update_delay_end_time
);
10941 json_object_string_add(
10943 "updateDelayZebraUpdateResume",
10944 bgp
->update_delay_zebra_resume_time
);
10945 json_object_string_add(
10947 "updateDelayPeerUpdateResume",
10948 bgp
->update_delay_peers_resume_time
);
10953 "Read-only mode update-delay limit: %d seconds\n",
10954 bgp
->v_update_delay
);
10955 if (bgp
->v_update_delay
10956 != bgp
->v_establish_wait
)
10958 " Establish wait: %d seconds\n",
10959 bgp
->v_establish_wait
);
10961 if (bgp_update_delay_active(bgp
)) {
10963 " First neighbor established: %s\n",
10964 bgp
->update_delay_begin_time
);
10966 " Delay in progress\n");
10968 if (bgp
->update_delay_over
) {
10970 " First neighbor established: %s\n",
10971 bgp
->update_delay_begin_time
);
10973 " Best-paths resumed: %s\n",
10974 bgp
->update_delay_end_time
);
10976 " zebra update resumed: %s\n",
10977 bgp
->update_delay_zebra_resume_time
);
10979 " peers update resumed: %s\n",
10980 bgp
->update_delay_peers_resume_time
);
10987 if (bgp_maxmed_onstartup_configured(bgp
)
10988 && bgp
->maxmed_active
)
10989 json_object_boolean_true_add(
10990 json
, "maxMedOnStartup");
10991 if (bgp
->v_maxmed_admin
)
10992 json_object_boolean_true_add(
10993 json
, "maxMedAdministrative");
10995 json_object_int_add(
10996 json
, "tableVersion",
10997 bgp_table_version(bgp
->rib
[afi
][safi
]));
10999 ents
= bgp_table_count(bgp
->rib
[afi
][safi
]);
11000 json_object_int_add(json
, "ribCount", ents
);
11001 json_object_int_add(
11003 ents
* sizeof(struct bgp_dest
));
11005 ents
= bgp
->af_peer_count
[afi
][safi
];
11006 json_object_int_add(json
, "peerCount", ents
);
11007 json_object_int_add(json
, "peerMemory",
11008 ents
* sizeof(struct peer
));
11010 if ((ents
= listcount(bgp
->group
))) {
11011 json_object_int_add(
11012 json
, "peerGroupCount", ents
);
11013 json_object_int_add(
11014 json
, "peerGroupMemory",
11015 ents
* sizeof(struct
11019 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
11020 BGP_CONFIG_DAMPENING
))
11021 json_object_boolean_true_add(
11022 json
, "dampeningEnabled");
11025 if (bgp_maxmed_onstartup_configured(bgp
)
11026 && bgp
->maxmed_active
)
11028 "Max-med on-startup active\n");
11029 if (bgp
->v_maxmed_admin
)
11031 "Max-med administrative active\n");
11034 "BGP table version %" PRIu64
11037 bgp
->rib
[afi
][safi
]));
11039 ents
= bgp_table_count(
11040 bgp
->rib
[afi
][safi
]);
11042 "RIB entries %ld, using %s of memory\n",
11052 /* Peer related usage */
11053 ents
= bgp
->af_peer_count
[afi
][safi
];
11055 "Peers %ld, using %s of memory\n",
11065 if ((ents
= listcount(bgp
->group
)))
11067 "Peer groups %ld, using %s of memory\n",
11077 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
11078 BGP_CONFIG_DAMPENING
))
11080 "Dampening enabled.\n");
11083 vty_out(vty
, "\n");
11085 /* Subtract 8 here because 'Neighbor' is
11087 vty_out(vty
, "Neighbor");
11088 vty_out(vty
, "%*s",
11089 max_neighbor_width
- 8, " ");
11091 BGP_SHOW_SUMMARY_HEADER_FAILED
);
11096 paf
= peer_af_find(peer
, afi
, safi
);
11097 filter
= &peer
->filter
[afi
][safi
];
11100 /* Works for both failed & successful cases */
11101 if (peer_dynamic_neighbor(peer
))
11106 if (bgp_show_summary_is_peer_filtered(peer
, fpeer
,
11112 bgp_has_peer_failed(peer
, afi
, safi
)) {
11113 json_peer
= json_object_new_object();
11114 bgp_show_failed_summary(vty
, bgp
, peer
,
11115 json_peer
, 0, use_json
);
11116 } else if (!show_failed
) {
11117 if (show_established
11118 && bgp_has_peer_failed(peer
, afi
, safi
)) {
11123 json_peer
= json_object_new_object();
11124 if (peer_dynamic_neighbor(peer
)) {
11125 json_object_boolean_true_add(json_peer
,
11129 if (peer
->hostname
)
11130 json_object_string_add(json_peer
, "hostname",
11133 if (peer
->domainname
)
11134 json_object_string_add(json_peer
, "domainname",
11137 json_object_int_add(json_peer
, "remoteAs", peer
->as
);
11138 json_object_int_add(
11139 json_peer
, "localAs",
11140 peer
->change_local_as
11141 ? peer
->change_local_as
11143 json_object_int_add(json_peer
, "version", 4);
11144 json_object_int_add(json_peer
, "msgRcvd",
11145 PEER_TOTAL_RX(peer
));
11146 json_object_int_add(json_peer
, "msgSent",
11147 PEER_TOTAL_TX(peer
));
11149 atomic_size_t outq_count
, inq_count
;
11150 outq_count
= atomic_load_explicit(
11151 &peer
->obuf
->count
,
11152 memory_order_relaxed
);
11153 inq_count
= atomic_load_explicit(
11154 &peer
->ibuf
->count
,
11155 memory_order_relaxed
);
11157 json_object_int_add(json_peer
, "tableVersion",
11158 peer
->version
[afi
][safi
]);
11159 json_object_int_add(json_peer
, "outq",
11161 json_object_int_add(json_peer
, "inq",
11163 peer_uptime(peer
->uptime
, timebuf
, BGP_UPTIME_LEN
,
11164 use_json
, json_peer
);
11166 json_object_int_add(json_peer
, "pfxRcd",
11167 peer
->pcount
[afi
][pfx_rcd_safi
]);
11169 if (paf
&& PAF_SUBGRP(paf
))
11170 json_object_int_add(
11171 json_peer
, "pfxSnt",
11172 (PAF_SUBGRP(paf
))->scount
);
11174 json_object_int_add(json_peer
, "pfxSnt",
11177 /* BGP FSM state */
11178 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_SHUTDOWN
)
11179 || CHECK_FLAG(peer
->bgp
->flags
,
11180 BGP_FLAG_SHUTDOWN
))
11181 json_object_string_add(json_peer
,
11184 else if (peer
->afc_recv
[afi
][safi
])
11185 json_object_string_add(
11186 json_peer
, "state",
11187 lookup_msg(bgp_status_msg
,
11188 peer
->status
, NULL
));
11189 else if (CHECK_FLAG(
11191 PEER_STATUS_PREFIX_OVERFLOW
))
11192 json_object_string_add(json_peer
,
11196 json_object_string_add(
11197 json_peer
, "state",
11198 lookup_msg(bgp_status_msg
,
11199 peer
->status
, NULL
));
11201 /* BGP peer state */
11202 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_SHUTDOWN
)
11203 || CHECK_FLAG(peer
->bgp
->flags
,
11204 BGP_FLAG_SHUTDOWN
))
11205 json_object_string_add(json_peer
,
11208 else if (CHECK_FLAG(
11210 PEER_STATUS_PREFIX_OVERFLOW
))
11211 json_object_string_add(json_peer
,
11214 else if (CHECK_FLAG(peer
->flags
,
11215 PEER_FLAG_PASSIVE
))
11216 json_object_string_add(json_peer
,
11219 else if (CHECK_FLAG(peer
->sflags
,
11220 PEER_STATUS_NSF_WAIT
))
11221 json_object_string_add(json_peer
,
11224 else if (CHECK_FLAG(
11226 BGP_FLAG_EBGP_REQUIRES_POLICY
)
11227 && (!bgp_inbound_policy_exists(peer
,
11229 || !bgp_outbound_policy_exists(
11231 json_object_string_add(json_peer
,
11235 json_object_string_add(
11236 json_peer
, "peerState", "OK");
11238 json_object_int_add(json_peer
, "connectionsEstablished",
11239 peer
->established
);
11240 json_object_int_add(json_peer
, "connectionsDropped",
11243 json_object_string_add(
11244 json_peer
, "desc", peer
->desc
);
11246 /* Avoid creating empty peer dicts in JSON */
11247 if (json_peer
== NULL
)
11251 json_object_string_add(json_peer
, "idType",
11253 else if (peer
->su
.sa
.sa_family
== AF_INET
)
11254 json_object_string_add(json_peer
, "idType",
11256 else if (peer
->su
.sa
.sa_family
== AF_INET6
)
11257 json_object_string_add(json_peer
, "idType",
11259 json_object_object_add(json_peers
, peer
->host
,
11262 if (bgp_show_summary_is_peer_filtered(peer
, fpeer
,
11268 bgp_has_peer_failed(peer
, afi
, safi
)) {
11269 bgp_show_failed_summary(vty
, bgp
, peer
, NULL
,
11270 max_neighbor_width
,
11272 } else if (!show_failed
) {
11273 if (show_established
11274 && bgp_has_peer_failed(peer
, afi
, safi
)) {
11279 if ((count
- filtered_count
) == 1) {
11280 /* display headline before the first
11282 vty_out(vty
, "\n");
11284 /* Subtract 8 here because 'Neighbor' is
11286 vty_out(vty
, "Neighbor");
11287 vty_out(vty
, "%*s",
11288 max_neighbor_width
- 8, " ");
11291 ? BGP_SHOW_SUMMARY_HEADER_ALL_WIDE
11292 : BGP_SHOW_SUMMARY_HEADER_ALL
);
11295 memset(dn_flag
, '\0', sizeof(dn_flag
));
11296 if (peer_dynamic_neighbor(peer
)) {
11301 && CHECK_FLAG(bgp
->flags
,
11302 BGP_FLAG_SHOW_HOSTNAME
))
11303 len
= vty_out(vty
, "%s%s(%s)", dn_flag
,
11307 len
= vty_out(vty
, "%s%s", dn_flag
, peer
->host
);
11309 /* pad the neighbor column with spaces */
11310 if (len
< max_neighbor_width
)
11311 vty_out(vty
, "%*s", max_neighbor_width
- len
,
11314 atomic_size_t outq_count
, inq_count
;
11315 outq_count
= atomic_load_explicit(
11316 &peer
->obuf
->count
,
11317 memory_order_relaxed
);
11318 inq_count
= atomic_load_explicit(
11319 &peer
->ibuf
->count
,
11320 memory_order_relaxed
);
11324 "4 %10u %10u %9u %9u %8" PRIu64
11327 peer
->change_local_as
11328 ? peer
->change_local_as
11330 PEER_TOTAL_RX(peer
),
11331 PEER_TOTAL_TX(peer
),
11332 peer
->version
[afi
][safi
],
11333 inq_count
, outq_count
,
11334 peer_uptime(peer
->uptime
,
11339 vty_out(vty
, "4 %10u %9u %9u %8" PRIu64
11341 peer
->as
, PEER_TOTAL_RX(peer
),
11342 PEER_TOTAL_TX(peer
),
11343 peer
->version
[afi
][safi
],
11344 inq_count
, outq_count
,
11345 peer_uptime(peer
->uptime
,
11350 if (peer_established(peer
)) {
11351 if (peer
->afc_recv
[afi
][safi
]) {
11354 BGP_FLAG_EBGP_REQUIRES_POLICY
)
11355 && !bgp_inbound_policy_exists(
11357 vty_out(vty
, " %12s",
11366 vty_out(vty
, " NoNeg");
11369 if (paf
&& PAF_SUBGRP(paf
)) {
11372 BGP_FLAG_EBGP_REQUIRES_POLICY
)
11373 && !bgp_outbound_policy_exists(
11375 vty_out(vty
, " %8s",
11384 vty_out(vty
, " NoNeg");
11387 if (CHECK_FLAG(peer
->flags
,
11388 PEER_FLAG_SHUTDOWN
)
11389 || CHECK_FLAG(peer
->bgp
->flags
,
11390 BGP_FLAG_SHUTDOWN
))
11391 vty_out(vty
, " Idle (Admin)");
11392 else if (CHECK_FLAG(
11394 PEER_STATUS_PREFIX_OVERFLOW
))
11395 vty_out(vty
, " Idle (PfxCt)");
11397 vty_out(vty
, " %12s",
11398 lookup_msg(bgp_status_msg
,
11399 peer
->status
, NULL
));
11401 vty_out(vty
, " %8u", 0);
11403 /* Make sure `Desc` column is the lastest in
11407 vty_out(vty
, " %s",
11408 bgp_peer_description_stripped(
11410 show_wide
? 64 : 20));
11412 vty_out(vty
, " N/A");
11413 vty_out(vty
, "\n");
11420 json_object_object_add(json
, "peers", json_peers
);
11421 json_object_int_add(json
, "failedPeers", failed_count
);
11422 json_object_int_add(json
, "displayedPeers",
11423 count
- filtered_count
);
11424 json_object_int_add(json
, "totalPeers", count
);
11425 json_object_int_add(json
, "dynamicPeers", dn_count
);
11428 bgp_show_bestpath_json(bgp
, json
);
11430 vty_json(vty
, json
);
11433 if (filtered_count
== count
)
11434 vty_out(vty
, "\n%% No matching neighbor\n");
11437 vty_out(vty
, "\nDisplayed neighbors %d",
11439 else if (as_type
!= AS_UNSPECIFIED
|| as
11440 || fpeer
|| show_established
)
11441 vty_out(vty
, "\nDisplayed neighbors %d",
11442 count
- filtered_count
);
11444 vty_out(vty
, "\nTotal number of neighbors %d\n",
11448 vty_out(vty
, "No %s neighbor is configured\n",
11449 get_afi_safi_str(afi
, safi
, false));
11453 vty_out(vty
, "* - dynamic neighbor\n");
11454 vty_out(vty
, "%d dynamic neighbor(s), limit %d\n",
11455 dn_count
, bgp
->dynamic_neighbors_limit
);
11459 return CMD_SUCCESS
;
11462 static void bgp_show_summary_afi_safi(struct vty
*vty
, struct bgp
*bgp
, int afi
,
11463 int safi
, struct peer
*fpeer
, int as_type
,
11464 as_t as
, uint16_t show_flags
)
11467 int afi_wildcard
= (afi
== AFI_MAX
);
11468 int safi_wildcard
= (safi
== SAFI_MAX
);
11469 int is_wildcard
= (afi_wildcard
|| safi_wildcard
);
11470 bool nbr_output
= false;
11471 bool use_json
= CHECK_FLAG(show_flags
, BGP_SHOW_OPT_JSON
);
11473 if (use_json
&& is_wildcard
)
11474 vty_out(vty
, "{\n");
11476 afi
= 1; /* AFI_IP */
11477 while (afi
< AFI_MAX
) {
11479 safi
= 1; /* SAFI_UNICAST */
11480 while (safi
< SAFI_MAX
) {
11481 if (bgp_afi_safi_peer_exists(bgp
, afi
, safi
)) {
11486 * So limit output to those afi/safi
11488 * actualy have something interesting in
11493 vty_out(vty
, ",\n");
11497 vty_out(vty
, "\"%s\":",
11498 get_afi_safi_str(afi
,
11503 "\n%s Summary (%s):\n",
11504 get_afi_safi_str(afi
,
11510 bgp_show_summary(vty
, bgp
, afi
, safi
, fpeer
,
11511 as_type
, as
, show_flags
);
11514 if (!safi_wildcard
)
11522 if (use_json
&& is_wildcard
)
11523 vty_out(vty
, "}\n");
11524 else if (!nbr_output
) {
11526 vty_out(vty
, "{}\n");
11528 vty_out(vty
, "%% No BGP neighbors found in %s\n",
11533 static void bgp_show_all_instances_summary_vty(struct vty
*vty
, afi_t afi
,
11535 const char *neighbor
,
11536 int as_type
, as_t as
,
11537 uint16_t show_flags
)
11539 struct listnode
*node
, *nnode
;
11541 struct peer
*fpeer
= NULL
;
11543 bool nbr_output
= false;
11544 bool use_json
= CHECK_FLAG(show_flags
, BGP_SHOW_OPT_JSON
);
11547 vty_out(vty
, "{\n");
11549 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
11553 vty_out(vty
, ",\n");
11557 vty_out(vty
, "\"%s\":",
11558 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
11563 fpeer
= peer_lookup_in_view(vty
, bgp
, neighbor
,
11568 bgp_show_summary_afi_safi(vty
, bgp
, afi
, safi
, fpeer
, as_type
,
11573 vty_out(vty
, "}\n");
11574 else if (!nbr_output
)
11575 vty_out(vty
, "%% BGP instance not found\n");
11578 int bgp_show_summary_vty(struct vty
*vty
, const char *name
, afi_t afi
,
11579 safi_t safi
, const char *neighbor
, int as_type
,
11580 as_t as
, uint16_t show_flags
)
11583 bool use_json
= CHECK_FLAG(show_flags
, BGP_SHOW_OPT_JSON
);
11584 struct peer
*fpeer
= NULL
;
11587 if (strmatch(name
, "all")) {
11588 bgp_show_all_instances_summary_vty(vty
, afi
, safi
,
11591 return CMD_SUCCESS
;
11593 bgp
= bgp_lookup_by_name(name
);
11597 vty_out(vty
, "{}\n");
11600 "%% BGP instance not found\n");
11601 return CMD_WARNING
;
11605 fpeer
= peer_lookup_in_view(vty
, bgp
, neighbor
,
11608 return CMD_WARNING
;
11610 bgp_show_summary_afi_safi(vty
, bgp
, afi
, safi
, fpeer
,
11611 as_type
, as
, show_flags
);
11612 return CMD_SUCCESS
;
11616 bgp
= bgp_get_default();
11620 fpeer
= peer_lookup_in_view(vty
, bgp
, neighbor
,
11623 return CMD_WARNING
;
11625 bgp_show_summary_afi_safi(vty
, bgp
, afi
, safi
, fpeer
, as_type
,
11629 vty_out(vty
, "{}\n");
11631 vty_out(vty
, "%% BGP instance not found\n");
11632 return CMD_WARNING
;
11635 return CMD_SUCCESS
;
11638 /* `show [ip] bgp summary' commands. */
11639 DEFPY(show_ip_bgp_summary
, show_ip_bgp_summary_cmd
,
11640 "show [ip] bgp [<view|vrf> VIEWVRFNAME] [" BGP_AFI_CMD_STR
11641 " [" BGP_SAFI_WITH_LABEL_CMD_STR
11642 "]] [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]",
11643 SHOW_STR IP_STR BGP_STR BGP_INSTANCE_HELP_STR BGP_AFI_HELP_STR
11644 BGP_SAFI_WITH_LABEL_HELP_STR
11645 "Display the entries for all address families\n"
11646 "Summary of BGP neighbor status\n"
11647 "Show only sessions in Established state\n"
11648 "Show only sessions not in Established state\n"
11649 "Show only the specified neighbor session\n"
11650 "Neighbor to display information about\n"
11651 "Neighbor to display information about\n"
11652 "Neighbor on BGP configured interface\n"
11653 "Show only the specified remote AS sessions\n"
11655 "Internal (iBGP) AS sessions\n"
11656 "External (eBGP) AS sessions\n"
11657 "Shorten the information on BGP instances\n"
11658 "Increase table width for longer output\n" JSON_STR
)
11661 afi_t afi
= AFI_MAX
;
11662 safi_t safi
= SAFI_MAX
;
11663 as_t as
= 0; /* 0 means AS filter not set */
11664 int as_type
= AS_UNSPECIFIED
;
11665 uint16_t show_flags
= 0;
11669 /* show [ip] bgp */
11670 if (!all
&& argv_find(argv
, argc
, "ip", &idx
))
11672 /* [<vrf> VIEWVRFNAME] */
11673 if (argv_find(argv
, argc
, "vrf", &idx
)) {
11674 vrf
= argv
[idx
+ 1]->arg
;
11675 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
11677 } else if (argv_find(argv
, argc
, "view", &idx
))
11678 /* [<view> VIEWVRFNAME] */
11679 vrf
= argv
[idx
+ 1]->arg
;
11680 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
11681 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
)) {
11682 argv_find_and_parse_safi(argv
, argc
, &idx
, &safi
);
11685 if (argv_find(argv
, argc
, "failed", &idx
))
11686 SET_FLAG(show_flags
, BGP_SHOW_OPT_FAILED
);
11688 if (argv_find(argv
, argc
, "established", &idx
))
11689 SET_FLAG(show_flags
, BGP_SHOW_OPT_ESTABLISHED
);
11691 if (argv_find(argv
, argc
, "remote-as", &idx
)) {
11692 if (argv
[idx
+ 1]->arg
[0] == 'i')
11693 as_type
= AS_INTERNAL
;
11694 else if (argv
[idx
+ 1]->arg
[0] == 'e')
11695 as_type
= AS_EXTERNAL
;
11697 as
= (as_t
)atoi(argv
[idx
+ 1]->arg
);
11700 if (argv_find(argv
, argc
, "terse", &idx
))
11701 SET_FLAG(show_flags
, BGP_SHOW_OPT_TERSE
);
11703 if (argv_find(argv
, argc
, "wide", &idx
))
11704 SET_FLAG(show_flags
, BGP_SHOW_OPT_WIDE
);
11706 if (argv_find(argv
, argc
, "json", &idx
))
11707 SET_FLAG(show_flags
, BGP_SHOW_OPT_JSON
);
11709 return bgp_show_summary_vty(vty
, vrf
, afi
, safi
, neighbor
, as_type
, as
,
11713 const char *get_afi_safi_str(afi_t afi
, safi_t safi
, bool for_json
)
11716 return get_afi_safi_json_str(afi
, safi
);
11718 return get_afi_safi_vty_str(afi
, safi
);
11722 static void bgp_show_peer_afi_orf_cap(struct vty
*vty
, struct peer
*p
,
11723 afi_t afi
, safi_t safi
,
11724 uint16_t adv_smcap
, uint16_t adv_rmcap
,
11725 uint16_t rcv_smcap
, uint16_t rcv_rmcap
,
11726 bool use_json
, json_object
*json_pref
)
11729 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_smcap
)
11730 || CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_smcap
)) {
11732 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_smcap
)
11733 && CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_smcap
))
11734 json_object_string_add(json_pref
, "sendMode",
11735 "advertisedAndReceived");
11736 else if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_smcap
))
11737 json_object_string_add(json_pref
, "sendMode",
11739 else if (CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_smcap
))
11740 json_object_string_add(json_pref
, "sendMode",
11743 vty_out(vty
, " Send-mode: ");
11744 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_smcap
))
11745 vty_out(vty
, "advertised");
11746 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_smcap
))
11747 vty_out(vty
, "%sreceived",
11748 CHECK_FLAG(p
->af_cap
[afi
][safi
],
11752 vty_out(vty
, "\n");
11757 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_rmcap
)
11758 || CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_rmcap
)) {
11760 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_rmcap
)
11761 && CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_rmcap
))
11762 json_object_string_add(json_pref
, "recvMode",
11763 "advertisedAndReceived");
11764 else if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_rmcap
))
11765 json_object_string_add(json_pref
, "recvMode",
11767 else if (CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_rmcap
))
11768 json_object_string_add(json_pref
, "recvMode",
11771 vty_out(vty
, " Receive-mode: ");
11772 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_rmcap
))
11773 vty_out(vty
, "advertised");
11774 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_rmcap
))
11775 vty_out(vty
, "%sreceived",
11776 CHECK_FLAG(p
->af_cap
[afi
][safi
],
11780 vty_out(vty
, "\n");
11785 static void bgp_show_neighnor_graceful_restart_flags(struct vty
*vty
,
11793 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_ADV
)
11794 && (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
))
11795 && (peer_established(p
))) {
11796 rbit
= CHECK_FLAG(p
->cap
, PEER_CAP_GRACEFUL_RESTART_R_BIT_RCV
);
11797 nbit
= CHECK_FLAG(p
->cap
, PEER_CAP_GRACEFUL_RESTART_N_BIT_RCV
);
11801 json_object_boolean_add(json
, "rBit", rbit
);
11802 json_object_boolean_add(json
, "nBit", nbit
);
11804 vty_out(vty
, "\n R bit: %s", rbit
? "True" : "False");
11805 vty_out(vty
, "\n N bit: %s\n", nbit
? "True" : "False");
11809 static void bgp_show_neighbor_graceful_restart_remote_mode(struct vty
*vty
,
11814 const char *mode
= "NotApplicable";
11817 vty_out(vty
, "\n Remote GR Mode: ");
11819 if (CHECK_FLAG(peer
->cap
, PEER_CAP_RESTART_ADV
)
11820 && (peer_established(peer
))) {
11822 if ((peer
->nsf_af_count
== 0)
11823 && !CHECK_FLAG(peer
->cap
, PEER_CAP_RESTART_RCV
)) {
11827 } else if (peer
->nsf_af_count
== 0
11828 && CHECK_FLAG(peer
->cap
, PEER_CAP_RESTART_RCV
)) {
11832 } else if (peer
->nsf_af_count
!= 0
11833 && CHECK_FLAG(peer
->cap
, PEER_CAP_RESTART_RCV
)) {
11840 json_object_string_add(json
, "remoteGrMode", mode
);
11842 vty_out(vty
, mode
, "\n");
11845 static void bgp_show_neighbor_graceful_restart_local_mode(struct vty
*vty
,
11850 const char *mode
= "Invalid";
11853 vty_out(vty
, " Local GR Mode: ");
11855 if (bgp_peer_gr_mode_get(p
) == PEER_HELPER
)
11857 else if (bgp_peer_gr_mode_get(p
) == PEER_GR
)
11859 else if (bgp_peer_gr_mode_get(p
) == PEER_DISABLE
)
11861 else if (bgp_peer_gr_mode_get(p
) == PEER_GLOBAL_INHERIT
) {
11862 if (bgp_global_gr_mode_get(p
->bgp
) == GLOBAL_HELPER
)
11864 else if (bgp_global_gr_mode_get(p
->bgp
) == GLOBAL_GR
)
11866 else if (bgp_global_gr_mode_get(p
->bgp
) == GLOBAL_DISABLE
)
11873 json_object_string_add(json
, "localGrMode", mode
);
11875 vty_out(vty
, mode
, "\n");
11879 static void bgp_show_neighbor_graceful_restart_capability_per_afi_safi(
11880 struct vty
*vty
, struct peer
*peer
, bool use_json
, json_object
*json
)
11884 json_object
*json_afi_safi
= NULL
;
11885 json_object
*json_timer
= NULL
;
11886 json_object
*json_endofrib_status
= NULL
;
11887 bool eor_flag
= false;
11889 FOREACH_AFI_SAFI_NSF (afi
, safi
) {
11890 if (!peer
->afc
[afi
][safi
])
11893 if (!CHECK_FLAG(peer
->cap
, PEER_CAP_RESTART_ADV
) ||
11894 !CHECK_FLAG(peer
->cap
, PEER_CAP_RESTART_RCV
))
11898 json_afi_safi
= json_object_new_object();
11899 json_endofrib_status
= json_object_new_object();
11900 json_timer
= json_object_new_object();
11903 if (peer
->eor_stime
[afi
][safi
] >= peer
->pkt_stime
[afi
][safi
])
11909 vty_out(vty
, " %s:\n",
11910 get_afi_safi_str(afi
, safi
, false));
11912 vty_out(vty
, " F bit: ");
11915 if (peer
->nsf
[afi
][safi
] &&
11916 CHECK_FLAG(peer
->af_cap
[afi
][safi
],
11917 PEER_CAP_RESTART_AF_PRESERVE_RCV
)) {
11920 json_object_boolean_true_add(json_afi_safi
,
11923 vty_out(vty
, "True\n");
11926 json_object_boolean_false_add(json_afi_safi
,
11929 vty_out(vty
, "False\n");
11933 vty_out(vty
, " End-of-RIB sent: ");
11935 if (CHECK_FLAG(peer
->af_sflags
[afi
][safi
],
11936 PEER_STATUS_EOR_SEND
)) {
11938 json_object_boolean_true_add(
11939 json_endofrib_status
, "endOfRibSend");
11941 PRINT_EOR_JSON(eor_flag
);
11943 vty_out(vty
, "Yes\n");
11945 " End-of-RIB sent after update: ");
11947 PRINT_EOR(eor_flag
);
11951 json_object_boolean_false_add(
11952 json_endofrib_status
, "endOfRibSend");
11953 json_object_boolean_false_add(
11954 json_endofrib_status
,
11955 "endOfRibSentAfterUpdate");
11957 vty_out(vty
, "No\n");
11959 " End-of-RIB sent after update: ");
11960 vty_out(vty
, "No\n");
11965 vty_out(vty
, " End-of-RIB received: ");
11967 if (CHECK_FLAG(peer
->af_sflags
[afi
][safi
],
11968 PEER_STATUS_EOR_RECEIVED
)) {
11970 json_object_boolean_true_add(
11971 json_endofrib_status
, "endOfRibRecv");
11973 vty_out(vty
, "Yes\n");
11976 json_object_boolean_false_add(
11977 json_endofrib_status
, "endOfRibRecv");
11979 vty_out(vty
, "No\n");
11983 json_object_int_add(json_timer
, "stalePathTimer",
11984 peer
->bgp
->stalepath_time
);
11986 if (peer
->t_gr_stale
!= NULL
) {
11987 json_object_int_add(json_timer
,
11988 "stalePathTimerRemaining",
11989 thread_timer_remain_second(
11990 peer
->t_gr_stale
));
11993 /* Display Configured Selection
11994 * Deferral only when when
11995 * Gr mode is enabled.
11997 if (CHECK_FLAG(peer
->flags
,
11998 PEER_FLAG_GRACEFUL_RESTART
)) {
11999 json_object_int_add(json_timer
,
12000 "selectionDeferralTimer",
12001 peer
->bgp
->stalepath_time
);
12004 if (peer
->bgp
->gr_info
[afi
][safi
].t_select_deferral
!=
12007 json_object_int_add(
12009 "selectionDeferralTimerRemaining",
12010 thread_timer_remain_second(
12011 peer
->bgp
->gr_info
[afi
][safi
]
12012 .t_select_deferral
));
12015 vty_out(vty
, " Timers:\n");
12017 " Configured Stale Path Time(sec): %u\n",
12018 peer
->bgp
->stalepath_time
);
12020 if (peer
->t_gr_stale
!= NULL
)
12022 " Stale Path Remaining(sec): %ld\n",
12023 thread_timer_remain_second(
12024 peer
->t_gr_stale
));
12025 /* Display Configured Selection
12026 * Deferral only when when
12027 * Gr mode is enabled.
12029 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_GRACEFUL_RESTART
))
12031 " Configured Selection Deferral Time(sec): %u\n",
12032 peer
->bgp
->select_defer_time
);
12034 if (peer
->bgp
->gr_info
[afi
][safi
].t_select_deferral
!=
12037 " Selection Deferral Time Remaining(sec): %ld\n",
12038 thread_timer_remain_second(
12039 peer
->bgp
->gr_info
[afi
][safi
]
12040 .t_select_deferral
));
12043 json_object_object_add(json_afi_safi
, "endOfRibStatus",
12044 json_endofrib_status
);
12045 json_object_object_add(json_afi_safi
, "timers",
12047 json_object_object_add(
12048 json
, get_afi_safi_str(afi
, safi
, true),
12054 static void bgp_show_neighbor_graceful_restart_time(struct vty
*vty
,
12060 json_object
*json_timer
= NULL
;
12062 json_timer
= json_object_new_object();
12064 json_object_int_add(json_timer
, "configuredRestartTimer",
12065 p
->bgp
->restart_time
);
12067 json_object_int_add(json_timer
, "receivedRestartTimer",
12070 if (p
->t_gr_restart
!= NULL
)
12071 json_object_int_add(
12072 json_timer
, "restartTimerRemaining",
12073 thread_timer_remain_second(p
->t_gr_restart
));
12075 json_object_object_add(json
, "timers", json_timer
);
12078 vty_out(vty
, " Timers:\n");
12079 vty_out(vty
, " Configured Restart Time(sec): %u\n",
12080 p
->bgp
->restart_time
);
12082 vty_out(vty
, " Received Restart Time(sec): %u\n",
12084 if (p
->t_gr_restart
!= NULL
)
12085 vty_out(vty
, " Restart Time Remaining(sec): %ld\n",
12086 thread_timer_remain_second(p
->t_gr_restart
));
12087 if (p
->t_gr_restart
!= NULL
) {
12088 vty_out(vty
, " Restart Time Remaining(sec): %ld\n",
12089 thread_timer_remain_second(p
->t_gr_restart
));
12094 static void bgp_show_peer_gr_status(struct vty
*vty
, struct peer
*p
,
12095 bool use_json
, json_object
*json
)
12097 char dn_flag
[2] = {0};
12098 /* '*' + v6 address of neighbor */
12099 char neighborAddr
[INET6_ADDRSTRLEN
+ 1] = {0};
12101 if (!p
->conf_if
&& peer_dynamic_neighbor(p
))
12106 json_object_string_addf(json
, "neighborAddr", "%pSU",
12109 vty_out(vty
, "BGP neighbor on %s: %pSU\n", p
->conf_if
,
12112 snprintf(neighborAddr
, sizeof(neighborAddr
), "%s%s", dn_flag
,
12116 json_object_string_add(json
, "neighborAddr",
12119 vty_out(vty
, "BGP neighbor is %s\n", neighborAddr
);
12122 /* more gr info in new format */
12123 BGP_SHOW_PEER_GR_CAPABILITY(vty
, p
, use_json
, json
);
12126 static void bgp_show_peer_afi(struct vty
*vty
, struct peer
*p
, afi_t afi
,
12127 safi_t safi
, bool use_json
,
12128 json_object
*json_neigh
)
12130 struct bgp_filter
*filter
;
12131 struct peer_af
*paf
;
12132 char orf_pfx_name
[BUFSIZ
];
12134 json_object
*json_af
= NULL
;
12135 json_object
*json_prefA
= NULL
;
12136 json_object
*json_prefB
= NULL
;
12137 json_object
*json_addr
= NULL
;
12138 json_object
*json_advmap
= NULL
;
12141 json_addr
= json_object_new_object();
12142 json_af
= json_object_new_object();
12143 filter
= &p
->filter
[afi
][safi
];
12145 if (peer_group_active(p
))
12146 json_object_string_add(json_addr
, "peerGroupMember",
12149 paf
= peer_af_find(p
, afi
, safi
);
12150 if (paf
&& PAF_SUBGRP(paf
)) {
12151 json_object_int_add(json_addr
, "updateGroupId",
12152 PAF_UPDGRP(paf
)->id
);
12153 json_object_int_add(json_addr
, "subGroupId",
12154 PAF_SUBGRP(paf
)->id
);
12155 json_object_int_add(json_addr
, "packetQueueLength",
12156 bpacket_queue_virtual_length(paf
));
12159 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
12160 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
12161 PEER_CAP_ORF_PREFIX_SM_RCV
)
12162 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
12163 PEER_CAP_ORF_PREFIX_RM_ADV
)
12164 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
12165 PEER_CAP_ORF_PREFIX_RM_RCV
)) {
12166 json_object_int_add(json_af
, "orfType",
12168 json_prefA
= json_object_new_object();
12169 bgp_show_peer_afi_orf_cap(vty
, p
, afi
, safi
,
12170 PEER_CAP_ORF_PREFIX_SM_ADV
,
12171 PEER_CAP_ORF_PREFIX_RM_ADV
,
12172 PEER_CAP_ORF_PREFIX_SM_RCV
,
12173 PEER_CAP_ORF_PREFIX_RM_RCV
,
12174 use_json
, json_prefA
);
12175 json_object_object_add(json_af
, "orfPrefixList",
12179 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
12180 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
12181 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
12182 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
12183 PEER_CAP_ORF_PREFIX_RM_ADV
)
12184 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
12185 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
)) {
12186 json_object_int_add(json_af
, "orfOldType",
12187 ORF_TYPE_PREFIX_OLD
);
12188 json_prefB
= json_object_new_object();
12189 bgp_show_peer_afi_orf_cap(
12190 vty
, p
, afi
, safi
, PEER_CAP_ORF_PREFIX_SM_ADV
,
12191 PEER_CAP_ORF_PREFIX_RM_ADV
,
12192 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
,
12193 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
, use_json
,
12195 json_object_object_add(json_af
, "orfOldPrefixList",
12199 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
12200 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
12201 PEER_CAP_ORF_PREFIX_SM_RCV
)
12202 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
12203 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
12204 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
12205 PEER_CAP_ORF_PREFIX_RM_ADV
)
12206 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
12207 PEER_CAP_ORF_PREFIX_RM_RCV
)
12208 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
12209 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
))
12210 json_object_object_add(json_addr
, "afDependentCap",
12213 json_object_free(json_af
);
12215 snprintf(orf_pfx_name
, sizeof(orf_pfx_name
), "%s.%d.%d",
12216 p
->host
, afi
, safi
);
12217 orf_pfx_count
= prefix_bgp_show_prefix_list(
12218 NULL
, afi
, orf_pfx_name
, use_json
);
12220 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
12221 PEER_STATUS_ORF_PREFIX_SEND
)
12222 || orf_pfx_count
) {
12223 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
12224 PEER_STATUS_ORF_PREFIX_SEND
))
12225 json_object_boolean_true_add(json_neigh
,
12228 json_object_int_add(json_addr
, "orfRecvCounter",
12231 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
12232 PEER_STATUS_ORF_WAIT_REFRESH
))
12233 json_object_string_add(
12234 json_addr
, "orfFirstUpdate",
12235 "deferredUntilORFOrRouteRefreshRecvd");
12237 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12238 PEER_FLAG_REFLECTOR_CLIENT
))
12239 json_object_boolean_true_add(json_addr
,
12240 "routeReflectorClient");
12241 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12242 PEER_FLAG_RSERVER_CLIENT
))
12243 json_object_boolean_true_add(json_addr
,
12244 "routeServerClient");
12245 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
12246 json_object_boolean_true_add(json_addr
,
12247 "inboundSoftConfigPermit");
12249 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12250 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
))
12251 json_object_boolean_true_add(
12253 "privateAsNumsAllReplacedInUpdatesToNbr");
12254 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12255 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
))
12256 json_object_boolean_true_add(
12258 "privateAsNumsReplacedInUpdatesToNbr");
12259 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12260 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
))
12261 json_object_boolean_true_add(
12263 "privateAsNumsAllRemovedInUpdatesToNbr");
12264 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12265 PEER_FLAG_REMOVE_PRIVATE_AS
))
12266 json_object_boolean_true_add(
12268 "privateAsNumsRemovedInUpdatesToNbr");
12270 if (p
->addpath_type
[afi
][safi
] != BGP_ADDPATH_NONE
)
12271 json_object_boolean_true_add(
12273 bgp_addpath_names(p
->addpath_type
[afi
][safi
])
12276 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_AS_OVERRIDE
))
12277 json_object_string_add(json_addr
,
12278 "overrideASNsInOutboundUpdates",
12279 "ifAspathEqualRemoteAs");
12281 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_SELF
)
12282 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
12283 PEER_FLAG_FORCE_NEXTHOP_SELF
))
12284 json_object_boolean_true_add(json_addr
,
12285 "routerAlwaysNextHop");
12286 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12287 PEER_FLAG_AS_PATH_UNCHANGED
))
12288 json_object_boolean_true_add(
12289 json_addr
, "unchangedAsPathPropogatedToNbr");
12290 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12291 PEER_FLAG_NEXTHOP_UNCHANGED
))
12292 json_object_boolean_true_add(
12293 json_addr
, "unchangedNextHopPropogatedToNbr");
12294 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
12295 json_object_boolean_true_add(
12296 json_addr
, "unchangedMedPropogatedToNbr");
12297 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
)
12298 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
12299 PEER_FLAG_SEND_EXT_COMMUNITY
)) {
12300 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12301 PEER_FLAG_SEND_COMMUNITY
)
12302 && CHECK_FLAG(p
->af_flags
[afi
][safi
],
12303 PEER_FLAG_SEND_EXT_COMMUNITY
))
12304 json_object_string_add(json_addr
,
12305 "commAttriSentToNbr",
12306 "extendedAndStandard");
12307 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12308 PEER_FLAG_SEND_EXT_COMMUNITY
))
12309 json_object_string_add(json_addr
,
12310 "commAttriSentToNbr",
12313 json_object_string_add(json_addr
,
12314 "commAttriSentToNbr",
12317 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12318 PEER_FLAG_DEFAULT_ORIGINATE
)) {
12319 if (p
->default_rmap
[afi
][safi
].name
)
12320 json_object_string_add(
12321 json_addr
, "defaultRouteMap",
12322 p
->default_rmap
[afi
][safi
].name
);
12324 if (paf
&& PAF_SUBGRP(paf
)
12325 && CHECK_FLAG(PAF_SUBGRP(paf
)->sflags
,
12326 SUBGRP_STATUS_DEFAULT_ORIGINATE
))
12327 json_object_boolean_true_add(json_addr
,
12330 json_object_boolean_true_add(json_addr
,
12334 if (afi
== AFI_L2VPN
&& safi
== SAFI_EVPN
) {
12335 if (is_evpn_enabled())
12336 json_object_boolean_true_add(
12337 json_addr
, "advertiseAllVnis");
12340 if (filter
->plist
[FILTER_IN
].name
12341 || filter
->dlist
[FILTER_IN
].name
12342 || filter
->aslist
[FILTER_IN
].name
12343 || filter
->map
[RMAP_IN
].name
)
12344 json_object_boolean_true_add(json_addr
,
12345 "inboundPathPolicyConfig");
12346 if (filter
->plist
[FILTER_OUT
].name
12347 || filter
->dlist
[FILTER_OUT
].name
12348 || filter
->aslist
[FILTER_OUT
].name
12349 || filter
->map
[RMAP_OUT
].name
|| filter
->usmap
.name
)
12350 json_object_boolean_true_add(
12351 json_addr
, "outboundPathPolicyConfig");
12354 if (filter
->plist
[FILTER_IN
].name
)
12355 json_object_string_add(json_addr
,
12356 "incomingUpdatePrefixFilterList",
12357 filter
->plist
[FILTER_IN
].name
);
12358 if (filter
->plist
[FILTER_OUT
].name
)
12359 json_object_string_add(json_addr
,
12360 "outgoingUpdatePrefixFilterList",
12361 filter
->plist
[FILTER_OUT
].name
);
12363 /* distribute-list */
12364 if (filter
->dlist
[FILTER_IN
].name
)
12365 json_object_string_add(
12366 json_addr
, "incomingUpdateNetworkFilterList",
12367 filter
->dlist
[FILTER_IN
].name
);
12368 if (filter
->dlist
[FILTER_OUT
].name
)
12369 json_object_string_add(
12370 json_addr
, "outgoingUpdateNetworkFilterList",
12371 filter
->dlist
[FILTER_OUT
].name
);
12374 if (filter
->aslist
[FILTER_IN
].name
)
12375 json_object_string_add(json_addr
,
12376 "incomingUpdateAsPathFilterList",
12377 filter
->aslist
[FILTER_IN
].name
);
12378 if (filter
->aslist
[FILTER_OUT
].name
)
12379 json_object_string_add(json_addr
,
12380 "outgoingUpdateAsPathFilterList",
12381 filter
->aslist
[FILTER_OUT
].name
);
12384 if (filter
->map
[RMAP_IN
].name
)
12385 json_object_string_add(
12386 json_addr
, "routeMapForIncomingAdvertisements",
12387 filter
->map
[RMAP_IN
].name
);
12388 if (filter
->map
[RMAP_OUT
].name
)
12389 json_object_string_add(
12390 json_addr
, "routeMapForOutgoingAdvertisements",
12391 filter
->map
[RMAP_OUT
].name
);
12393 /* ebgp-requires-policy (inbound) */
12394 if (CHECK_FLAG(p
->bgp
->flags
, BGP_FLAG_EBGP_REQUIRES_POLICY
)
12395 && !bgp_inbound_policy_exists(p
, filter
))
12396 json_object_string_add(
12397 json_addr
, "inboundEbgpRequiresPolicy",
12398 "Inbound updates discarded due to missing policy");
12400 /* ebgp-requires-policy (outbound) */
12401 if (CHECK_FLAG(p
->bgp
->flags
, BGP_FLAG_EBGP_REQUIRES_POLICY
)
12402 && (!bgp_outbound_policy_exists(p
, filter
)))
12403 json_object_string_add(
12404 json_addr
, "outboundEbgpRequiresPolicy",
12405 "Outbound updates discarded due to missing policy");
12407 /* unsuppress-map */
12408 if (filter
->usmap
.name
)
12409 json_object_string_add(json_addr
,
12410 "selectiveUnsuppressRouteMap",
12411 filter
->usmap
.name
);
12413 /* advertise-map */
12414 if (filter
->advmap
.aname
) {
12415 json_advmap
= json_object_new_object();
12416 json_object_string_add(json_advmap
, "condition",
12417 filter
->advmap
.condition
12420 json_object_string_add(json_advmap
, "conditionMap",
12421 filter
->advmap
.cname
);
12422 json_object_string_add(json_advmap
, "advertiseMap",
12423 filter
->advmap
.aname
);
12424 json_object_string_add(
12425 json_advmap
, "advertiseStatus",
12426 filter
->advmap
.update_type
==
12427 UPDATE_TYPE_ADVERTISE
12430 json_object_object_add(json_addr
, "advertiseMap",
12434 /* Receive prefix count */
12435 json_object_int_add(json_addr
, "acceptedPrefixCounter",
12436 p
->pcount
[afi
][safi
]);
12437 if (paf
&& PAF_SUBGRP(paf
))
12438 json_object_int_add(json_addr
, "sentPrefixCounter",
12439 (PAF_SUBGRP(paf
))->scount
);
12441 /* Maximum prefix */
12442 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_OUT
))
12443 json_object_int_add(json_addr
, "prefixOutAllowedMax",
12444 p
->pmax_out
[afi
][safi
]);
12446 /* Maximum prefix */
12447 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
)) {
12448 json_object_int_add(json_addr
, "prefixAllowedMax",
12449 p
->pmax
[afi
][safi
]);
12450 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12451 PEER_FLAG_MAX_PREFIX_WARNING
))
12452 json_object_boolean_true_add(
12453 json_addr
, "prefixAllowedMaxWarning");
12454 json_object_int_add(json_addr
,
12455 "prefixAllowedWarningThresh",
12456 p
->pmax_threshold
[afi
][safi
]);
12457 if (p
->pmax_restart
[afi
][safi
])
12458 json_object_int_add(
12460 "prefixAllowedRestartIntervalMsecs",
12461 p
->pmax_restart
[afi
][safi
] * 60000);
12463 json_object_object_add(json_neigh
,
12464 get_afi_safi_str(afi
, safi
, true),
12468 filter
= &p
->filter
[afi
][safi
];
12470 vty_out(vty
, " For address family: %s\n",
12471 get_afi_safi_str(afi
, safi
, false));
12473 if (peer_group_active(p
))
12474 vty_out(vty
, " %s peer-group member\n",
12477 paf
= peer_af_find(p
, afi
, safi
);
12478 if (paf
&& PAF_SUBGRP(paf
)) {
12479 vty_out(vty
, " Update group %" PRIu64
", subgroup %" PRIu64
"\n",
12480 PAF_UPDGRP(paf
)->id
, PAF_SUBGRP(paf
)->id
);
12481 vty_out(vty
, " Packet Queue length %d\n",
12482 bpacket_queue_virtual_length(paf
));
12484 vty_out(vty
, " Not part of any update group\n");
12486 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
12487 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
12488 PEER_CAP_ORF_PREFIX_SM_RCV
)
12489 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
12490 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
12491 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
12492 PEER_CAP_ORF_PREFIX_RM_ADV
)
12493 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
12494 PEER_CAP_ORF_PREFIX_RM_RCV
)
12495 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
12496 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
))
12497 vty_out(vty
, " AF-dependant capabilities:\n");
12499 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
12500 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
12501 PEER_CAP_ORF_PREFIX_SM_RCV
)
12502 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
12503 PEER_CAP_ORF_PREFIX_RM_ADV
)
12504 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
12505 PEER_CAP_ORF_PREFIX_RM_RCV
)) {
12507 " Outbound Route Filter (ORF) type (%d) Prefix-list:\n",
12509 bgp_show_peer_afi_orf_cap(
12510 vty
, p
, afi
, safi
, PEER_CAP_ORF_PREFIX_SM_ADV
,
12511 PEER_CAP_ORF_PREFIX_RM_ADV
,
12512 PEER_CAP_ORF_PREFIX_SM_RCV
,
12513 PEER_CAP_ORF_PREFIX_RM_RCV
, use_json
, NULL
);
12515 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
12516 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
12517 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
12518 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
12519 PEER_CAP_ORF_PREFIX_RM_ADV
)
12520 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
12521 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
)) {
12523 " Outbound Route Filter (ORF) type (%d) Prefix-list:\n",
12524 ORF_TYPE_PREFIX_OLD
);
12525 bgp_show_peer_afi_orf_cap(
12526 vty
, p
, afi
, safi
, PEER_CAP_ORF_PREFIX_SM_ADV
,
12527 PEER_CAP_ORF_PREFIX_RM_ADV
,
12528 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
,
12529 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
, use_json
, NULL
);
12532 snprintf(orf_pfx_name
, sizeof(orf_pfx_name
), "%s.%d.%d",
12533 p
->host
, afi
, safi
);
12534 orf_pfx_count
= prefix_bgp_show_prefix_list(
12535 NULL
, afi
, orf_pfx_name
, use_json
);
12537 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
12538 PEER_STATUS_ORF_PREFIX_SEND
)
12539 || orf_pfx_count
) {
12540 vty_out(vty
, " Outbound Route Filter (ORF):");
12541 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
12542 PEER_STATUS_ORF_PREFIX_SEND
))
12543 vty_out(vty
, " sent;");
12545 vty_out(vty
, " received (%d entries)",
12547 vty_out(vty
, "\n");
12549 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
12550 PEER_STATUS_ORF_WAIT_REFRESH
))
12552 " First update is deferred until ORF or ROUTE-REFRESH is received\n");
12554 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12555 PEER_FLAG_REFLECTOR_CLIENT
))
12556 vty_out(vty
, " Route-Reflector Client\n");
12557 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12558 PEER_FLAG_RSERVER_CLIENT
))
12559 vty_out(vty
, " Route-Server Client\n");
12561 if (peer_af_flag_check(p
, afi
, safi
, PEER_FLAG_ORR_GROUP
))
12562 vty_out(vty
, " ORR group (configured) : %s\n",
12563 p
->orr_group_name
[afi
][safi
]);
12565 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
12567 " Inbound soft reconfiguration allowed\n");
12569 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12570 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
))
12572 " Private AS numbers (all) replaced in updates to this neighbor\n");
12573 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12574 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
))
12576 " Private AS numbers replaced in updates to this neighbor\n");
12577 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12578 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
))
12580 " Private AS numbers (all) removed in updates to this neighbor\n");
12581 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12582 PEER_FLAG_REMOVE_PRIVATE_AS
))
12584 " Private AS numbers removed in updates to this neighbor\n");
12586 if (p
->addpath_type
[afi
][safi
] != BGP_ADDPATH_NONE
)
12587 vty_out(vty
, " %s\n",
12588 bgp_addpath_names(p
->addpath_type
[afi
][safi
])
12589 ->human_description
);
12591 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_AS_OVERRIDE
))
12593 " Override ASNs in outbound updates if aspath equals remote-as\n");
12595 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_SELF
)
12596 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
12597 PEER_FLAG_FORCE_NEXTHOP_SELF
))
12598 vty_out(vty
, " NEXT_HOP is always this router\n");
12599 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12600 PEER_FLAG_AS_PATH_UNCHANGED
))
12602 " AS_PATH is propagated unchanged to this neighbor\n");
12603 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12604 PEER_FLAG_NEXTHOP_UNCHANGED
))
12606 " NEXT_HOP is propagated unchanged to this neighbor\n");
12607 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
12609 " MED is propagated unchanged to this neighbor\n");
12610 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
)
12611 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
12612 PEER_FLAG_SEND_EXT_COMMUNITY
)
12613 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
12614 PEER_FLAG_SEND_LARGE_COMMUNITY
)) {
12616 " Community attribute sent to this neighbor");
12617 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12618 PEER_FLAG_SEND_COMMUNITY
)
12619 && CHECK_FLAG(p
->af_flags
[afi
][safi
],
12620 PEER_FLAG_SEND_EXT_COMMUNITY
)
12621 && CHECK_FLAG(p
->af_flags
[afi
][safi
],
12622 PEER_FLAG_SEND_LARGE_COMMUNITY
))
12623 vty_out(vty
, "(all)\n");
12624 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12625 PEER_FLAG_SEND_LARGE_COMMUNITY
))
12626 vty_out(vty
, "(large)\n");
12627 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12628 PEER_FLAG_SEND_EXT_COMMUNITY
))
12629 vty_out(vty
, "(extended)\n");
12631 vty_out(vty
, "(standard)\n");
12633 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12634 PEER_FLAG_DEFAULT_ORIGINATE
)) {
12635 vty_out(vty
, " Default information originate,");
12637 if (p
->default_rmap
[afi
][safi
].name
)
12638 vty_out(vty
, " default route-map %s%s,",
12639 p
->default_rmap
[afi
][safi
].map
? "*"
12641 p
->default_rmap
[afi
][safi
].name
);
12642 if (paf
&& PAF_SUBGRP(paf
)
12643 && CHECK_FLAG(PAF_SUBGRP(paf
)->sflags
,
12644 SUBGRP_STATUS_DEFAULT_ORIGINATE
))
12645 vty_out(vty
, " default sent\n");
12647 vty_out(vty
, " default not sent\n");
12650 /* advertise-vni-all */
12651 if (afi
== AFI_L2VPN
&& safi
== SAFI_EVPN
) {
12652 if (is_evpn_enabled())
12653 vty_out(vty
, " advertise-all-vni\n");
12656 if (filter
->plist
[FILTER_IN
].name
12657 || filter
->dlist
[FILTER_IN
].name
12658 || filter
->aslist
[FILTER_IN
].name
12659 || filter
->map
[RMAP_IN
].name
)
12660 vty_out(vty
, " Inbound path policy configured\n");
12661 if (filter
->plist
[FILTER_OUT
].name
12662 || filter
->dlist
[FILTER_OUT
].name
12663 || filter
->aslist
[FILTER_OUT
].name
12664 || filter
->map
[RMAP_OUT
].name
|| filter
->usmap
.name
)
12665 vty_out(vty
, " Outbound path policy configured\n");
12668 if (filter
->plist
[FILTER_IN
].name
)
12670 " Incoming update prefix filter list is %s%s\n",
12671 filter
->plist
[FILTER_IN
].plist
? "*" : "",
12672 filter
->plist
[FILTER_IN
].name
);
12673 if (filter
->plist
[FILTER_OUT
].name
)
12675 " Outgoing update prefix filter list is %s%s\n",
12676 filter
->plist
[FILTER_OUT
].plist
? "*" : "",
12677 filter
->plist
[FILTER_OUT
].name
);
12679 /* distribute-list */
12680 if (filter
->dlist
[FILTER_IN
].name
)
12682 " Incoming update network filter list is %s%s\n",
12683 filter
->dlist
[FILTER_IN
].alist
? "*" : "",
12684 filter
->dlist
[FILTER_IN
].name
);
12685 if (filter
->dlist
[FILTER_OUT
].name
)
12687 " Outgoing update network filter list is %s%s\n",
12688 filter
->dlist
[FILTER_OUT
].alist
? "*" : "",
12689 filter
->dlist
[FILTER_OUT
].name
);
12692 if (filter
->aslist
[FILTER_IN
].name
)
12694 " Incoming update AS path filter list is %s%s\n",
12695 filter
->aslist
[FILTER_IN
].aslist
? "*" : "",
12696 filter
->aslist
[FILTER_IN
].name
);
12697 if (filter
->aslist
[FILTER_OUT
].name
)
12699 " Outgoing update AS path filter list is %s%s\n",
12700 filter
->aslist
[FILTER_OUT
].aslist
? "*" : "",
12701 filter
->aslist
[FILTER_OUT
].name
);
12704 if (filter
->map
[RMAP_IN
].name
)
12706 " Route map for incoming advertisements is %s%s\n",
12707 filter
->map
[RMAP_IN
].map
? "*" : "",
12708 filter
->map
[RMAP_IN
].name
);
12709 if (filter
->map
[RMAP_OUT
].name
)
12711 " Route map for outgoing advertisements is %s%s\n",
12712 filter
->map
[RMAP_OUT
].map
? "*" : "",
12713 filter
->map
[RMAP_OUT
].name
);
12715 /* ebgp-requires-policy (inbound) */
12716 if (CHECK_FLAG(p
->bgp
->flags
, BGP_FLAG_EBGP_REQUIRES_POLICY
)
12717 && !bgp_inbound_policy_exists(p
, filter
))
12719 " Inbound updates discarded due to missing policy\n");
12721 /* ebgp-requires-policy (outbound) */
12722 if (CHECK_FLAG(p
->bgp
->flags
, BGP_FLAG_EBGP_REQUIRES_POLICY
)
12723 && !bgp_outbound_policy_exists(p
, filter
))
12725 " Outbound updates discarded due to missing policy\n");
12727 /* unsuppress-map */
12728 if (filter
->usmap
.name
)
12730 " Route map for selective unsuppress is %s%s\n",
12731 filter
->usmap
.map
? "*" : "",
12732 filter
->usmap
.name
);
12734 /* advertise-map */
12735 if (filter
->advmap
.aname
&& filter
->advmap
.cname
)
12737 " Condition %s, Condition-map %s%s, Advertise-map %s%s, status: %s\n",
12738 filter
->advmap
.condition
? "EXIST"
12740 filter
->advmap
.cmap
? "*" : "",
12741 filter
->advmap
.cname
,
12742 filter
->advmap
.amap
? "*" : "",
12743 filter
->advmap
.aname
,
12744 filter
->advmap
.update_type
==
12745 UPDATE_TYPE_ADVERTISE
12749 /* Receive prefix count */
12750 vty_out(vty
, " %u accepted prefixes\n",
12751 p
->pcount
[afi
][safi
]);
12753 /* maximum-prefix-out */
12754 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
12755 PEER_FLAG_MAX_PREFIX_OUT
))
12757 " Maximum allowed prefixes sent %u\n",
12758 p
->pmax_out
[afi
][safi
]);
12760 /* Maximum prefix */
12761 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
)) {
12763 " Maximum prefixes allowed %u%s\n",
12764 p
->pmax
[afi
][safi
],
12765 CHECK_FLAG(p
->af_flags
[afi
][safi
],
12766 PEER_FLAG_MAX_PREFIX_WARNING
)
12767 ? " (warning-only)"
12769 vty_out(vty
, " Threshold for warning message %d%%",
12770 p
->pmax_threshold
[afi
][safi
]);
12771 if (p
->pmax_restart
[afi
][safi
])
12772 vty_out(vty
, ", restart interval %d min",
12773 p
->pmax_restart
[afi
][safi
]);
12774 vty_out(vty
, "\n");
12777 vty_out(vty
, "\n");
12781 static void bgp_show_peer(struct vty
*vty
, struct peer
*p
, bool use_json
,
12785 char buf1
[PREFIX2STR_BUFFER
];
12786 char timebuf
[BGP_UPTIME_LEN
];
12792 json_object
*json_neigh
= NULL
;
12794 uint32_t sync_tcp_mss
;
12799 json_neigh
= json_object_new_object();
12801 memset(dn_flag
, '\0', sizeof(dn_flag
));
12802 if (!p
->conf_if
&& peer_dynamic_neighbor(p
))
12806 if (p
->conf_if
) /* Configured interface name. */
12807 vty_out(vty
, "BGP neighbor on %s: %pSU, ", p
->conf_if
,
12809 else /* Configured IP address. */
12810 vty_out(vty
, "BGP neighbor is %s%s, ", dn_flag
,
12815 if (p
->conf_if
&& BGP_PEER_SU_UNSPEC(p
))
12816 json_object_string_add(json_neigh
, "bgpNeighborAddr",
12818 else if (p
->conf_if
&& !BGP_PEER_SU_UNSPEC(p
))
12819 json_object_string_addf(json_neigh
, "bgpNeighborAddr",
12822 json_object_int_add(json_neigh
, "remoteAs", p
->as
);
12824 if (p
->change_local_as
)
12825 json_object_int_add(json_neigh
, "localAs",
12826 p
->change_local_as
);
12828 json_object_int_add(json_neigh
, "localAs", p
->local_as
);
12830 if (CHECK_FLAG(p
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
))
12831 json_object_boolean_true_add(json_neigh
,
12832 "localAsNoPrepend");
12834 if (CHECK_FLAG(p
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
))
12835 json_object_boolean_true_add(json_neigh
,
12836 "localAsReplaceAs");
12838 if ((p
->as_type
== AS_SPECIFIED
) || (p
->as_type
== AS_EXTERNAL
)
12839 || (p
->as_type
== AS_INTERNAL
))
12840 vty_out(vty
, "remote AS %u, ", p
->as
);
12842 vty_out(vty
, "remote AS Unspecified, ");
12843 vty_out(vty
, "local AS %u%s%s, ",
12844 p
->change_local_as
? p
->change_local_as
: p
->local_as
,
12845 CHECK_FLAG(p
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
)
12848 CHECK_FLAG(p
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
)
12852 /* peer type internal or confed-internal */
12853 if ((p
->as
== p
->local_as
) || (p
->as_type
== AS_INTERNAL
)) {
12855 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
))
12856 json_object_boolean_true_add(
12857 json_neigh
, "nbrConfedInternalLink");
12859 json_object_boolean_true_add(json_neigh
,
12860 "nbrInternalLink");
12862 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
))
12863 vty_out(vty
, "confed-internal link\n");
12865 vty_out(vty
, "internal link\n");
12867 /* peer type external or confed-external */
12868 } else if (p
->as
|| (p
->as_type
== AS_EXTERNAL
)) {
12870 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
))
12871 json_object_boolean_true_add(
12872 json_neigh
, "nbrConfedExternalLink");
12874 json_object_boolean_true_add(json_neigh
,
12875 "nbrExternalLink");
12877 if (bgp_confederation_peers_check(bgp
, p
->as
))
12878 vty_out(vty
, "confed-external link\n");
12880 vty_out(vty
, "external link\n");
12884 json_object_boolean_true_add(json_neigh
,
12885 "nbrUnspecifiedLink");
12887 vty_out(vty
, "unspecified link\n");
12892 json_object_string_add(json_neigh
, "localRole",
12893 bgp_get_name_by_role(p
->local_role
));
12894 json_object_string_add(json_neigh
, "remoteRole",
12895 bgp_get_name_by_role(p
->remote_role
));
12897 vty_out(vty
, " Local Role: %s\n",
12898 bgp_get_name_by_role(p
->local_role
));
12899 vty_out(vty
, " Remote Role: %s\n",
12900 bgp_get_name_by_role(p
->remote_role
));
12907 json_object_string_add(json_neigh
, "nbrDesc", p
->desc
);
12909 vty_out(vty
, " Description: %s\n", p
->desc
);
12915 json_object_string_add(json_neigh
, "hostname",
12919 json_object_string_add(json_neigh
, "domainname",
12922 if (p
->domainname
&& (p
->domainname
[0] != '\0'))
12923 vty_out(vty
, "Hostname: %s.%s\n", p
->hostname
,
12926 vty_out(vty
, "Hostname: %s\n", p
->hostname
);
12933 json_object_string_add(json_neigh
, "peerGroup",
12937 struct prefix prefix
, *range
= NULL
;
12939 if (sockunion2hostprefix(&(p
->su
), &prefix
))
12940 range
= peer_group_lookup_dynamic_neighbor_range(
12941 p
->group
, &prefix
);
12944 json_object_string_addf(
12946 "peerSubnetRangeGroup", "%pFX",
12952 " Member of peer-group %s for session parameters\n",
12956 struct prefix prefix
, *range
= NULL
;
12958 if (sockunion2hostprefix(&(p
->su
), &prefix
))
12959 range
= peer_group_lookup_dynamic_neighbor_range(
12960 p
->group
, &prefix
);
12964 " Belongs to the subnet range group: %pFX\n",
12972 /* Administrative shutdown. */
12973 if (CHECK_FLAG(p
->flags
, PEER_FLAG_SHUTDOWN
)
12974 || CHECK_FLAG(p
->bgp
->flags
, BGP_FLAG_SHUTDOWN
))
12975 json_object_boolean_true_add(json_neigh
,
12979 json_object_int_add(json_neigh
, "bgpVersion", 4);
12980 json_object_string_addf(json_neigh
, "remoteRouterId", "%pI4",
12982 json_object_string_addf(json_neigh
, "localRouterId", "%pI4",
12985 /* Confederation */
12986 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
)
12987 && bgp_confederation_peers_check(bgp
, p
->as
))
12988 json_object_boolean_true_add(json_neigh
,
12992 json_object_string_add(
12993 json_neigh
, "bgpState",
12994 lookup_msg(bgp_status_msg
, p
->status
, NULL
));
12996 if (peer_established(p
)) {
12999 uptime
= monotime(NULL
);
13000 uptime
-= p
->uptime
;
13001 epoch_tbuf
= time(NULL
) - uptime
;
13003 json_object_int_add(json_neigh
, "bgpTimerUpMsec",
13005 json_object_string_add(json_neigh
, "bgpTimerUpString",
13006 peer_uptime(p
->uptime
, timebuf
,
13009 json_object_int_add(json_neigh
,
13010 "bgpTimerUpEstablishedEpoch",
13014 else if (p
->status
== Active
) {
13015 if (CHECK_FLAG(p
->flags
, PEER_FLAG_PASSIVE
))
13016 json_object_string_add(json_neigh
, "bgpStateIs",
13018 else if (CHECK_FLAG(p
->sflags
, PEER_STATUS_NSF_WAIT
))
13019 json_object_string_add(json_neigh
, "bgpStateIs",
13027 uptime
= monotime(NULL
);
13028 uptime
-= p
->readtime
;
13029 gmtime_r(&uptime
, &tm
);
13031 json_object_int_add(json_neigh
, "bgpTimerLastRead",
13032 (tm
.tm_sec
* 1000) + (tm
.tm_min
* 60000)
13033 + (tm
.tm_hour
* 3600000));
13035 uptime
= monotime(NULL
);
13036 uptime
-= p
->last_write
;
13037 gmtime_r(&uptime
, &tm
);
13039 json_object_int_add(json_neigh
, "bgpTimerLastWrite",
13040 (tm
.tm_sec
* 1000) + (tm
.tm_min
* 60000)
13041 + (tm
.tm_hour
* 3600000));
13043 uptime
= monotime(NULL
);
13044 uptime
-= p
->update_time
;
13045 gmtime_r(&uptime
, &tm
);
13047 json_object_int_add(json_neigh
, "bgpInUpdateElapsedTimeMsecs",
13048 (tm
.tm_sec
* 1000) + (tm
.tm_min
* 60000)
13049 + (tm
.tm_hour
* 3600000));
13051 /* Configured timer values. */
13052 json_object_int_add(json_neigh
,
13053 "bgpTimerConfiguredHoldTimeMsecs",
13054 CHECK_FLAG(p
->flags
, PEER_FLAG_TIMER
)
13055 ? p
->holdtime
* 1000
13056 : bgp
->default_holdtime
* 1000);
13057 json_object_int_add(json_neigh
,
13058 "bgpTimerConfiguredKeepAliveIntervalMsecs",
13059 CHECK_FLAG(p
->flags
, PEER_FLAG_TIMER
)
13060 ? p
->keepalive
* 1000
13061 : bgp
->default_keepalive
* 1000);
13062 json_object_int_add(json_neigh
, "bgpTimerHoldTimeMsecs",
13063 p
->v_holdtime
* 1000);
13064 json_object_int_add(json_neigh
,
13065 "bgpTimerKeepAliveIntervalMsecs",
13066 p
->v_keepalive
* 1000);
13067 if (CHECK_FLAG(p
->flags
, PEER_FLAG_TIMER_DELAYOPEN
)) {
13068 json_object_int_add(json_neigh
,
13069 "bgpTimerDelayOpenTimeMsecs",
13070 p
->v_delayopen
* 1000);
13073 /* Configured and Synced tcp-mss value for peer */
13074 if (CHECK_FLAG(p
->flags
, PEER_FLAG_TCP_MSS
)) {
13075 sync_tcp_mss
= sockopt_tcp_mss_get(p
->fd
);
13076 json_object_int_add(json_neigh
, "bgpTcpMssConfigured",
13078 json_object_int_add(json_neigh
, "bgpTcpMssSynced",
13082 /* Extended Optional Parameters Length for BGP OPEN Message */
13083 if (BGP_OPEN_EXT_OPT_PARAMS_CAPABLE(p
))
13084 json_object_boolean_true_add(
13085 json_neigh
, "extendedOptionalParametersLength");
13087 json_object_boolean_false_add(
13088 json_neigh
, "extendedOptionalParametersLength");
13090 /* Conditional advertisements */
13091 json_object_int_add(
13093 "bgpTimerConfiguredConditionalAdvertisementsSec",
13094 bgp
->condition_check_period
);
13095 if (thread_is_scheduled(bgp
->t_condition_check
))
13096 json_object_int_add(
13098 "bgpTimerUntilConditionalAdvertisementsSec",
13099 thread_timer_remain_second(
13100 bgp
->t_condition_check
));
13102 /* Administrative shutdown. */
13103 if (CHECK_FLAG(p
->flags
, PEER_FLAG_SHUTDOWN
)
13104 || CHECK_FLAG(p
->bgp
->flags
, BGP_FLAG_SHUTDOWN
))
13105 vty_out(vty
, " Administratively shut down\n");
13108 vty_out(vty
, " BGP version 4");
13109 vty_out(vty
, ", remote router ID %s",
13110 inet_ntop(AF_INET
, &p
->remote_id
, buf1
, sizeof(buf1
)));
13111 vty_out(vty
, ", local router ID %s\n",
13112 inet_ntop(AF_INET
, &bgp
->router_id
, buf1
,
13115 /* Confederation */
13116 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
)
13117 && bgp_confederation_peers_check(bgp
, p
->as
))
13119 " Neighbor under common administration\n");
13122 vty_out(vty
, " BGP state = %s",
13123 lookup_msg(bgp_status_msg
, p
->status
, NULL
));
13125 if (peer_established(p
))
13126 vty_out(vty
, ", up for %8s",
13127 peer_uptime(p
->uptime
, timebuf
, BGP_UPTIME_LEN
,
13130 else if (p
->status
== Active
) {
13131 if (CHECK_FLAG(p
->flags
, PEER_FLAG_PASSIVE
))
13132 vty_out(vty
, " (passive)");
13133 else if (CHECK_FLAG(p
->sflags
, PEER_STATUS_NSF_WAIT
))
13134 vty_out(vty
, " (NSF passive)");
13136 vty_out(vty
, "\n");
13139 vty_out(vty
, " Last read %s",
13140 peer_uptime(p
->readtime
, timebuf
, BGP_UPTIME_LEN
, 0,
13142 vty_out(vty
, ", Last write %s\n",
13143 peer_uptime(p
->last_write
, timebuf
, BGP_UPTIME_LEN
, 0,
13146 /* Configured timer values. */
13148 " Hold time is %d seconds, keepalive interval is %d seconds\n",
13149 p
->v_holdtime
, p
->v_keepalive
);
13150 vty_out(vty
, " Configured hold time is %d seconds",
13151 CHECK_FLAG(p
->flags
, PEER_FLAG_TIMER
)
13153 : bgp
->default_holdtime
);
13154 vty_out(vty
, ", keepalive interval is %d seconds\n",
13155 CHECK_FLAG(p
->flags
, PEER_FLAG_TIMER
)
13157 : bgp
->default_keepalive
);
13158 if (CHECK_FLAG(p
->flags
, PEER_FLAG_TIMER_DELAYOPEN
))
13160 " Configured DelayOpenTime is %d seconds\n",
13163 /* Configured and synced tcp-mss value for peer */
13164 if (CHECK_FLAG(p
->flags
, PEER_FLAG_TCP_MSS
)) {
13165 sync_tcp_mss
= sockopt_tcp_mss_get(p
->fd
);
13166 vty_out(vty
, " Configured tcp-mss is %d", p
->tcp_mss
);
13167 vty_out(vty
, ", synced tcp-mss is %d\n", sync_tcp_mss
);
13170 /* Extended Optional Parameters Length for BGP OPEN Message */
13171 if (BGP_OPEN_EXT_OPT_PARAMS_CAPABLE(p
))
13173 " Extended Optional Parameters Length is enabled\n");
13175 /* Conditional advertisements */
13177 " Configured conditional advertisements interval is %d seconds\n",
13178 bgp
->condition_check_period
);
13179 if (thread_is_scheduled(bgp
->t_condition_check
))
13181 " Time until conditional advertisements begin is %lu seconds\n",
13182 thread_timer_remain_second(
13183 bgp
->t_condition_check
));
13186 if (peer_established(p
) &&
13187 (p
->cap
|| peer_afc_advertised(p
) || peer_afc_received(p
))) {
13189 json_object
*json_cap
= NULL
;
13191 json_cap
= json_object_new_object();
13194 if (CHECK_FLAG(p
->cap
, PEER_CAP_AS4_RCV
) ||
13195 CHECK_FLAG(p
->cap
, PEER_CAP_AS4_ADV
)) {
13196 if (CHECK_FLAG(p
->cap
, PEER_CAP_AS4_ADV
) &&
13197 CHECK_FLAG(p
->cap
, PEER_CAP_AS4_RCV
))
13198 json_object_string_add(
13199 json_cap
, "4byteAs",
13200 "advertisedAndReceived");
13201 else if (CHECK_FLAG(p
->cap
, PEER_CAP_AS4_ADV
))
13202 json_object_string_add(json_cap
,
13205 else if (CHECK_FLAG(p
->cap
, PEER_CAP_AS4_RCV
))
13206 json_object_string_add(json_cap
,
13211 /* Extended Message Support */
13212 if (CHECK_FLAG(p
->cap
, PEER_CAP_EXTENDED_MESSAGE_ADV
) &&
13213 CHECK_FLAG(p
->cap
, PEER_CAP_EXTENDED_MESSAGE_RCV
))
13214 json_object_string_add(json_cap
,
13216 "advertisedAndReceived");
13217 else if (CHECK_FLAG(p
->cap
,
13218 PEER_CAP_EXTENDED_MESSAGE_ADV
))
13219 json_object_string_add(json_cap
,
13222 else if (CHECK_FLAG(p
->cap
,
13223 PEER_CAP_EXTENDED_MESSAGE_RCV
))
13224 json_object_string_add(json_cap
,
13229 if (CHECK_FLAG(p
->cap
, PEER_CAP_ADDPATH_RCV
) ||
13230 CHECK_FLAG(p
->cap
, PEER_CAP_ADDPATH_ADV
)) {
13231 json_object
*json_add
= NULL
;
13232 const char *print_store
;
13234 json_add
= json_object_new_object();
13236 FOREACH_AFI_SAFI (afi
, safi
) {
13237 json_object
*json_sub
= NULL
;
13238 json_sub
= json_object_new_object();
13239 print_store
= get_afi_safi_str(
13243 p
->af_cap
[afi
][safi
],
13244 PEER_CAP_ADDPATH_AF_TX_ADV
) ||
13246 p
->af_cap
[afi
][safi
],
13247 PEER_CAP_ADDPATH_AF_TX_RCV
)) {
13251 PEER_CAP_ADDPATH_AF_TX_ADV
) &&
13255 PEER_CAP_ADDPATH_AF_TX_RCV
))
13256 json_object_boolean_true_add(
13258 "txAdvertisedAndReceived");
13263 PEER_CAP_ADDPATH_AF_TX_ADV
))
13264 json_object_boolean_true_add(
13271 PEER_CAP_ADDPATH_AF_TX_RCV
))
13272 json_object_boolean_true_add(
13278 p
->af_cap
[afi
][safi
],
13279 PEER_CAP_ADDPATH_AF_RX_ADV
) ||
13281 p
->af_cap
[afi
][safi
],
13282 PEER_CAP_ADDPATH_AF_RX_RCV
)) {
13286 PEER_CAP_ADDPATH_AF_RX_ADV
) &&
13290 PEER_CAP_ADDPATH_AF_RX_RCV
))
13291 json_object_boolean_true_add(
13293 "rxAdvertisedAndReceived");
13298 PEER_CAP_ADDPATH_AF_RX_ADV
))
13299 json_object_boolean_true_add(
13306 PEER_CAP_ADDPATH_AF_RX_RCV
))
13307 json_object_boolean_true_add(
13313 p
->af_cap
[afi
][safi
],
13314 PEER_CAP_ADDPATH_AF_TX_ADV
) ||
13316 p
->af_cap
[afi
][safi
],
13317 PEER_CAP_ADDPATH_AF_TX_RCV
) ||
13319 p
->af_cap
[afi
][safi
],
13320 PEER_CAP_ADDPATH_AF_RX_ADV
) ||
13322 p
->af_cap
[afi
][safi
],
13323 PEER_CAP_ADDPATH_AF_RX_RCV
))
13324 json_object_object_add(
13325 json_add
, print_store
,
13328 json_object_free(json_sub
);
13331 json_object_object_add(json_cap
, "addPath",
13336 if (CHECK_FLAG(p
->cap
, PEER_CAP_DYNAMIC_RCV
) ||
13337 CHECK_FLAG(p
->cap
, PEER_CAP_DYNAMIC_ADV
)) {
13338 if (CHECK_FLAG(p
->cap
, PEER_CAP_DYNAMIC_ADV
) &&
13339 CHECK_FLAG(p
->cap
, PEER_CAP_DYNAMIC_RCV
))
13340 json_object_string_add(
13341 json_cap
, "dynamic",
13342 "advertisedAndReceived");
13343 else if (CHECK_FLAG(p
->cap
,
13344 PEER_CAP_DYNAMIC_ADV
))
13345 json_object_string_add(json_cap
,
13348 else if (CHECK_FLAG(p
->cap
,
13349 PEER_CAP_DYNAMIC_RCV
))
13350 json_object_string_add(json_cap
,
13356 if (CHECK_FLAG(p
->cap
, PEER_CAP_ROLE_RCV
) ||
13357 CHECK_FLAG(p
->cap
, PEER_CAP_ROLE_ADV
)) {
13358 if (CHECK_FLAG(p
->cap
, PEER_CAP_ROLE_ADV
) &&
13359 CHECK_FLAG(p
->cap
, PEER_CAP_ROLE_RCV
))
13360 json_object_string_add(
13362 "advertisedAndReceived");
13363 else if (CHECK_FLAG(p
->cap
, PEER_CAP_ROLE_ADV
))
13364 json_object_string_add(json_cap
, "role",
13366 else if (CHECK_FLAG(p
->cap
, PEER_CAP_ROLE_RCV
))
13367 json_object_string_add(json_cap
, "role",
13371 /* Extended nexthop */
13372 if (CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_RCV
) ||
13373 CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_ADV
)) {
13374 json_object
*json_nxt
= NULL
;
13375 const char *print_store
;
13378 if (CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_ADV
) &&
13379 CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_RCV
))
13380 json_object_string_add(
13381 json_cap
, "extendedNexthop",
13382 "advertisedAndReceived");
13383 else if (CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_ADV
))
13384 json_object_string_add(
13385 json_cap
, "extendedNexthop",
13387 else if (CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_RCV
))
13388 json_object_string_add(
13389 json_cap
, "extendedNexthop",
13392 if (CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_RCV
)) {
13393 json_nxt
= json_object_new_object();
13395 for (safi
= SAFI_UNICAST
;
13396 safi
< SAFI_MAX
; safi
++) {
13400 PEER_CAP_ENHE_AF_RCV
)) {
13406 json_object_string_add(
13409 "recieved"); /* misspelled for compatibility */
13412 json_object_object_add(
13414 "extendedNexthopFamililesByPeer",
13419 /* Long-lived Graceful Restart */
13420 if (CHECK_FLAG(p
->cap
, PEER_CAP_LLGR_RCV
) ||
13421 CHECK_FLAG(p
->cap
, PEER_CAP_LLGR_ADV
)) {
13422 json_object
*json_llgr
= NULL
;
13423 const char *afi_safi_str
;
13425 if (CHECK_FLAG(p
->cap
, PEER_CAP_LLGR_ADV
) &&
13426 CHECK_FLAG(p
->cap
, PEER_CAP_LLGR_RCV
))
13427 json_object_string_add(
13429 "longLivedGracefulRestart",
13430 "advertisedAndReceived");
13431 else if (CHECK_FLAG(p
->cap
, PEER_CAP_LLGR_ADV
))
13432 json_object_string_add(
13434 "longLivedGracefulRestart",
13436 else if (CHECK_FLAG(p
->cap
, PEER_CAP_LLGR_RCV
))
13437 json_object_string_add(
13439 "longLivedGracefulRestart",
13442 if (CHECK_FLAG(p
->cap
, PEER_CAP_LLGR_RCV
)) {
13443 json_llgr
= json_object_new_object();
13445 FOREACH_AFI_SAFI (afi
, safi
) {
13449 PEER_CAP_ENHE_AF_RCV
)) {
13455 json_object_string_add(
13461 json_object_object_add(
13463 "longLivedGracefulRestartByPeer",
13468 /* Route Refresh */
13469 if (CHECK_FLAG(p
->cap
, PEER_CAP_REFRESH_ADV
) ||
13470 CHECK_FLAG(p
->cap
, PEER_CAP_REFRESH_NEW_RCV
) ||
13471 CHECK_FLAG(p
->cap
, PEER_CAP_REFRESH_OLD_RCV
)) {
13472 if (CHECK_FLAG(p
->cap
, PEER_CAP_REFRESH_ADV
) &&
13473 (CHECK_FLAG(p
->cap
,
13474 PEER_CAP_REFRESH_NEW_RCV
) ||
13476 PEER_CAP_REFRESH_OLD_RCV
))) {
13479 PEER_CAP_REFRESH_OLD_RCV
) &&
13482 PEER_CAP_REFRESH_NEW_RCV
))
13483 json_object_string_add(
13486 "advertisedAndReceivedOldNew");
13490 PEER_CAP_REFRESH_OLD_RCV
))
13491 json_object_string_add(
13494 "advertisedAndReceivedOld");
13496 json_object_string_add(
13499 "advertisedAndReceivedNew");
13501 } else if (CHECK_FLAG(p
->cap
,
13502 PEER_CAP_REFRESH_ADV
))
13503 json_object_string_add(json_cap
,
13506 else if (CHECK_FLAG(p
->cap
,
13507 PEER_CAP_REFRESH_NEW_RCV
) ||
13509 PEER_CAP_REFRESH_OLD_RCV
))
13510 json_object_string_add(json_cap
,
13515 /* Enhanced Route Refresh */
13516 if (CHECK_FLAG(p
->cap
, PEER_CAP_ENHANCED_RR_ADV
) ||
13517 CHECK_FLAG(p
->cap
, PEER_CAP_ENHANCED_RR_RCV
)) {
13518 if (CHECK_FLAG(p
->cap
,
13519 PEER_CAP_ENHANCED_RR_ADV
) &&
13521 PEER_CAP_ENHANCED_RR_RCV
))
13522 json_object_string_add(
13524 "enhancedRouteRefresh",
13525 "advertisedAndReceived");
13526 else if (CHECK_FLAG(p
->cap
,
13527 PEER_CAP_ENHANCED_RR_ADV
))
13528 json_object_string_add(
13530 "enhancedRouteRefresh",
13532 else if (CHECK_FLAG(p
->cap
,
13533 PEER_CAP_ENHANCED_RR_RCV
))
13534 json_object_string_add(
13536 "enhancedRouteRefresh",
13540 /* Multiprotocol Extensions */
13541 json_object
*json_multi
= NULL
;
13543 json_multi
= json_object_new_object();
13545 FOREACH_AFI_SAFI (afi
, safi
) {
13546 if (p
->afc_adv
[afi
][safi
] ||
13547 p
->afc_recv
[afi
][safi
]) {
13548 json_object
*json_exten
= NULL
;
13549 json_exten
= json_object_new_object();
13551 if (p
->afc_adv
[afi
][safi
] &&
13552 p
->afc_recv
[afi
][safi
])
13553 json_object_boolean_true_add(
13555 "advertisedAndReceived");
13556 else if (p
->afc_adv
[afi
][safi
])
13557 json_object_boolean_true_add(
13560 else if (p
->afc_recv
[afi
][safi
])
13561 json_object_boolean_true_add(
13562 json_exten
, "received");
13564 json_object_object_add(
13566 get_afi_safi_str(afi
, safi
,
13571 json_object_object_add(json_cap
,
13572 "multiprotocolExtensions",
13575 /* Hostname capabilities */
13576 json_object
*json_hname
= NULL
;
13578 json_hname
= json_object_new_object();
13580 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_ADV
)) {
13581 json_object_string_add(
13582 json_hname
, "advHostName",
13583 bgp
->peer_self
->hostname
13584 ? bgp
->peer_self
->hostname
13586 json_object_string_add(
13587 json_hname
, "advDomainName",
13588 bgp
->peer_self
->domainname
13589 ? bgp
->peer_self
->domainname
13594 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_RCV
)) {
13595 json_object_string_add(
13596 json_hname
, "rcvHostName",
13597 p
->hostname
? p
->hostname
: "n/a");
13598 json_object_string_add(
13599 json_hname
, "rcvDomainName",
13600 p
->domainname
? p
->domainname
: "n/a");
13603 json_object_object_add(json_cap
, "hostName",
13606 /* Graceful Restart */
13607 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
) ||
13608 CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_ADV
)) {
13609 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_ADV
) &&
13610 CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
))
13611 json_object_string_add(
13612 json_cap
, "gracefulRestart",
13613 "advertisedAndReceived");
13614 else if (CHECK_FLAG(p
->cap
,
13615 PEER_CAP_RESTART_ADV
))
13616 json_object_string_add(
13618 "gracefulRestartCapability",
13620 else if (CHECK_FLAG(p
->cap
,
13621 PEER_CAP_RESTART_RCV
))
13622 json_object_string_add(
13624 "gracefulRestartCapability",
13627 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
)) {
13628 int restart_af_count
= 0;
13629 json_object
*json_restart
= NULL
;
13630 json_restart
= json_object_new_object();
13632 json_object_int_add(
13634 "gracefulRestartRemoteTimerMsecs",
13635 p
->v_gr_restart
* 1000);
13637 FOREACH_AFI_SAFI (afi
, safi
) {
13641 PEER_CAP_RESTART_AF_RCV
)) {
13642 json_object
*json_sub
=
13645 json_object_new_object();
13651 PEER_CAP_RESTART_AF_PRESERVE_RCV
))
13652 json_object_boolean_true_add(
13655 restart_af_count
++;
13656 json_object_object_add(
13665 if (!restart_af_count
) {
13666 json_object_string_add(
13668 "addressFamiliesByPeer",
13670 json_object_free(json_restart
);
13672 json_object_object_add(
13674 "addressFamiliesByPeer",
13678 json_object_object_add(
13679 json_neigh
, "neighborCapabilities", json_cap
);
13681 vty_out(vty
, " Neighbor capabilities:\n");
13684 if (CHECK_FLAG(p
->cap
, PEER_CAP_AS4_RCV
) ||
13685 CHECK_FLAG(p
->cap
, PEER_CAP_AS4_ADV
)) {
13686 vty_out(vty
, " 4 Byte AS:");
13687 if (CHECK_FLAG(p
->cap
, PEER_CAP_AS4_ADV
))
13688 vty_out(vty
, " advertised");
13689 if (CHECK_FLAG(p
->cap
, PEER_CAP_AS4_RCV
))
13690 vty_out(vty
, " %sreceived",
13695 vty_out(vty
, "\n");
13698 /* Extended Message Support */
13699 if (CHECK_FLAG(p
->cap
, PEER_CAP_EXTENDED_MESSAGE_RCV
) ||
13700 CHECK_FLAG(p
->cap
, PEER_CAP_EXTENDED_MESSAGE_ADV
)) {
13701 vty_out(vty
, " Extended Message:");
13702 if (CHECK_FLAG(p
->cap
,
13703 PEER_CAP_EXTENDED_MESSAGE_ADV
))
13704 vty_out(vty
, " advertised");
13705 if (CHECK_FLAG(p
->cap
,
13706 PEER_CAP_EXTENDED_MESSAGE_RCV
))
13707 vty_out(vty
, " %sreceived",
13710 PEER_CAP_EXTENDED_MESSAGE_ADV
)
13713 vty_out(vty
, "\n");
13717 if (CHECK_FLAG(p
->cap
, PEER_CAP_ADDPATH_RCV
) ||
13718 CHECK_FLAG(p
->cap
, PEER_CAP_ADDPATH_ADV
)) {
13719 vty_out(vty
, " AddPath:\n");
13721 FOREACH_AFI_SAFI (afi
, safi
) {
13723 p
->af_cap
[afi
][safi
],
13724 PEER_CAP_ADDPATH_AF_TX_ADV
) ||
13726 p
->af_cap
[afi
][safi
],
13727 PEER_CAP_ADDPATH_AF_TX_RCV
)) {
13728 vty_out(vty
, " %s: TX ",
13736 PEER_CAP_ADDPATH_AF_TX_ADV
))
13743 PEER_CAP_ADDPATH_AF_TX_RCV
))
13750 PEER_CAP_ADDPATH_AF_TX_ADV
)
13754 vty_out(vty
, "\n");
13758 p
->af_cap
[afi
][safi
],
13759 PEER_CAP_ADDPATH_AF_RX_ADV
) ||
13761 p
->af_cap
[afi
][safi
],
13762 PEER_CAP_ADDPATH_AF_RX_RCV
)) {
13763 vty_out(vty
, " %s: RX ",
13771 PEER_CAP_ADDPATH_AF_RX_ADV
))
13778 PEER_CAP_ADDPATH_AF_RX_RCV
))
13785 PEER_CAP_ADDPATH_AF_RX_ADV
)
13789 vty_out(vty
, "\n");
13795 if (CHECK_FLAG(p
->cap
, PEER_CAP_DYNAMIC_RCV
) ||
13796 CHECK_FLAG(p
->cap
, PEER_CAP_DYNAMIC_ADV
)) {
13797 vty_out(vty
, " Dynamic:");
13798 if (CHECK_FLAG(p
->cap
, PEER_CAP_DYNAMIC_ADV
))
13799 vty_out(vty
, " advertised");
13800 if (CHECK_FLAG(p
->cap
, PEER_CAP_DYNAMIC_RCV
))
13801 vty_out(vty
, " %sreceived",
13803 PEER_CAP_DYNAMIC_ADV
)
13806 vty_out(vty
, "\n");
13810 if (CHECK_FLAG(p
->cap
, PEER_CAP_ROLE_RCV
) ||
13811 CHECK_FLAG(p
->cap
, PEER_CAP_ROLE_ADV
)) {
13812 vty_out(vty
, " Role:");
13813 if (CHECK_FLAG(p
->cap
, PEER_CAP_ROLE_ADV
))
13814 vty_out(vty
, " advertised");
13815 if (CHECK_FLAG(p
->cap
, PEER_CAP_ROLE_RCV
))
13816 vty_out(vty
, " %sreceived",
13821 vty_out(vty
, "\n");
13824 /* Extended nexthop */
13825 if (CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_RCV
) ||
13826 CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_ADV
)) {
13827 vty_out(vty
, " Extended nexthop:");
13828 if (CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_ADV
))
13829 vty_out(vty
, " advertised");
13830 if (CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_RCV
))
13831 vty_out(vty
, " %sreceived",
13836 vty_out(vty
, "\n");
13838 if (CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_RCV
)) {
13840 " Address families by peer:\n ");
13841 for (safi
= SAFI_UNICAST
;
13842 safi
< SAFI_MAX
; safi
++)
13846 PEER_CAP_ENHE_AF_RCV
))
13856 /* Long-lived Graceful Restart */
13857 if (CHECK_FLAG(p
->cap
, PEER_CAP_LLGR_RCV
) ||
13858 CHECK_FLAG(p
->cap
, PEER_CAP_LLGR_ADV
)) {
13860 " Long-lived Graceful Restart:");
13861 if (CHECK_FLAG(p
->cap
, PEER_CAP_LLGR_ADV
))
13862 vty_out(vty
, " advertised");
13863 if (CHECK_FLAG(p
->cap
, PEER_CAP_LLGR_RCV
))
13864 vty_out(vty
, " %sreceived",
13869 vty_out(vty
, "\n");
13871 if (CHECK_FLAG(p
->cap
, PEER_CAP_LLGR_RCV
)) {
13873 " Address families by peer:\n");
13874 FOREACH_AFI_SAFI (afi
, safi
)
13878 PEER_CAP_LLGR_AF_RCV
))
13888 /* Route Refresh */
13889 if (CHECK_FLAG(p
->cap
, PEER_CAP_REFRESH_ADV
) ||
13890 CHECK_FLAG(p
->cap
, PEER_CAP_REFRESH_NEW_RCV
) ||
13891 CHECK_FLAG(p
->cap
, PEER_CAP_REFRESH_OLD_RCV
)) {
13892 vty_out(vty
, " Route refresh:");
13893 if (CHECK_FLAG(p
->cap
, PEER_CAP_REFRESH_ADV
))
13894 vty_out(vty
, " advertised");
13895 if (CHECK_FLAG(p
->cap
,
13896 PEER_CAP_REFRESH_NEW_RCV
) ||
13898 PEER_CAP_REFRESH_OLD_RCV
))
13899 vty_out(vty
, " %sreceived(%s)",
13901 PEER_CAP_REFRESH_ADV
)
13906 PEER_CAP_REFRESH_OLD_RCV
) &&
13909 PEER_CAP_REFRESH_NEW_RCV
))
13913 PEER_CAP_REFRESH_OLD_RCV
)
13917 vty_out(vty
, "\n");
13920 /* Enhanced Route Refresh */
13921 if (CHECK_FLAG(p
->cap
, PEER_CAP_ENHANCED_RR_ADV
) ||
13922 CHECK_FLAG(p
->cap
, PEER_CAP_ENHANCED_RR_RCV
)) {
13923 vty_out(vty
, " Enhanced Route Refresh:");
13924 if (CHECK_FLAG(p
->cap
,
13925 PEER_CAP_ENHANCED_RR_ADV
))
13926 vty_out(vty
, " advertised");
13927 if (CHECK_FLAG(p
->cap
,
13928 PEER_CAP_ENHANCED_RR_RCV
))
13929 vty_out(vty
, " %sreceived",
13931 PEER_CAP_REFRESH_ADV
)
13934 vty_out(vty
, "\n");
13937 /* Multiprotocol Extensions */
13938 FOREACH_AFI_SAFI (afi
, safi
)
13939 if (p
->afc_adv
[afi
][safi
] ||
13940 p
->afc_recv
[afi
][safi
]) {
13941 vty_out(vty
, " Address Family %s:",
13942 get_afi_safi_str(afi
, safi
,
13944 if (p
->afc_adv
[afi
][safi
])
13945 vty_out(vty
, " advertised");
13946 if (p
->afc_recv
[afi
][safi
])
13947 vty_out(vty
, " %sreceived",
13948 p
->afc_adv
[afi
][safi
]
13951 vty_out(vty
, "\n");
13954 /* Hostname capability */
13955 vty_out(vty
, " Hostname Capability:");
13957 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_ADV
)) {
13959 " advertised (name: %s,domain name: %s)",
13960 bgp
->peer_self
->hostname
13961 ? bgp
->peer_self
->hostname
13963 bgp
->peer_self
->domainname
13964 ? bgp
->peer_self
->domainname
13967 vty_out(vty
, " not advertised");
13970 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_RCV
)) {
13972 " received (name: %s,domain name: %s)",
13973 p
->hostname
? p
->hostname
: "n/a",
13974 p
->domainname
? p
->domainname
: "n/a");
13976 vty_out(vty
, " not received");
13979 vty_out(vty
, "\n");
13981 /* Graceful Restart */
13982 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
) ||
13983 CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_ADV
)) {
13985 " Graceful Restart Capability:");
13986 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_ADV
))
13987 vty_out(vty
, " advertised");
13988 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
))
13989 vty_out(vty
, " %sreceived",
13991 PEER_CAP_RESTART_ADV
)
13994 vty_out(vty
, "\n");
13996 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
)) {
13997 int restart_af_count
= 0;
14000 " Remote Restart timer is %d seconds\n",
14003 " Address families by peer:\n ");
14005 FOREACH_AFI_SAFI (afi
, safi
)
14009 PEER_CAP_RESTART_AF_RCV
)) {
14010 vty_out(vty
, "%s%s(%s)",
14022 PEER_CAP_RESTART_AF_PRESERVE_RCV
)
14024 : "not preserved");
14025 restart_af_count
++;
14027 if (!restart_af_count
)
14028 vty_out(vty
, "none");
14029 vty_out(vty
, "\n");
14031 } /* Graceful Restart */
14035 /* graceful restart information */
14036 json_object
*json_grace
= NULL
;
14037 json_object
*json_grace_send
= NULL
;
14038 json_object
*json_grace_recv
= NULL
;
14039 int eor_send_af_count
= 0;
14040 int eor_receive_af_count
= 0;
14043 json_grace
= json_object_new_object();
14044 json_grace_send
= json_object_new_object();
14045 json_grace_recv
= json_object_new_object();
14047 if ((peer_established(p
)) &&
14048 CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
)) {
14049 FOREACH_AFI_SAFI (afi
, safi
) {
14050 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
14051 PEER_STATUS_EOR_SEND
)) {
14052 json_object_boolean_true_add(
14054 get_afi_safi_str(afi
, safi
,
14056 eor_send_af_count
++;
14059 FOREACH_AFI_SAFI (afi
, safi
) {
14060 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
14061 PEER_STATUS_EOR_RECEIVED
)) {
14062 json_object_boolean_true_add(
14064 get_afi_safi_str(afi
, safi
,
14066 eor_receive_af_count
++;
14070 json_object_object_add(json_grace
, "endOfRibSend",
14072 json_object_object_add(json_grace
, "endOfRibRecv",
14076 if (p
->t_gr_restart
)
14077 json_object_int_add(
14078 json_grace
, "gracefulRestartTimerMsecs",
14079 thread_timer_remain_second(p
->t_gr_restart
) *
14083 json_object_int_add(
14084 json_grace
, "gracefulStalepathTimerMsecs",
14085 thread_timer_remain_second(p
->t_gr_stale
) *
14087 /* more gr info in new format */
14088 BGP_SHOW_PEER_GR_CAPABILITY(vty
, p
, use_json
, json_grace
);
14089 json_object_object_add(json_neigh
, "gracefulRestartInfo",
14092 vty_out(vty
, " Graceful restart information:\n");
14093 if ((peer_established(p
)) &&
14094 CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
)) {
14096 vty_out(vty
, " End-of-RIB send: ");
14097 FOREACH_AFI_SAFI (afi
, safi
) {
14098 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
14099 PEER_STATUS_EOR_SEND
)) {
14100 vty_out(vty
, "%s%s",
14101 eor_send_af_count
? ", " : "",
14102 get_afi_safi_str(afi
, safi
,
14104 eor_send_af_count
++;
14107 vty_out(vty
, "\n");
14108 vty_out(vty
, " End-of-RIB received: ");
14109 FOREACH_AFI_SAFI (afi
, safi
) {
14110 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
14111 PEER_STATUS_EOR_RECEIVED
)) {
14112 vty_out(vty
, "%s%s",
14113 eor_receive_af_count
? ", "
14115 get_afi_safi_str(afi
, safi
,
14117 eor_receive_af_count
++;
14120 vty_out(vty
, "\n");
14123 if (p
->t_gr_restart
)
14125 " The remaining time of restart timer is %ld\n",
14126 thread_timer_remain_second(p
->t_gr_restart
));
14130 " The remaining time of stalepath timer is %ld\n",
14131 thread_timer_remain_second(p
->t_gr_stale
));
14133 /* more gr info in new format */
14134 BGP_SHOW_PEER_GR_CAPABILITY(vty
, p
, use_json
, NULL
);
14138 json_object
*json_stat
= NULL
;
14139 json_stat
= json_object_new_object();
14140 /* Packet counts. */
14142 atomic_size_t outq_count
, inq_count
;
14143 outq_count
= atomic_load_explicit(&p
->obuf
->count
,
14144 memory_order_relaxed
);
14145 inq_count
= atomic_load_explicit(&p
->ibuf
->count
,
14146 memory_order_relaxed
);
14148 json_object_int_add(json_stat
, "depthInq",
14149 (unsigned long)inq_count
);
14150 json_object_int_add(json_stat
, "depthOutq",
14151 (unsigned long)outq_count
);
14152 json_object_int_add(json_stat
, "opensSent",
14153 atomic_load_explicit(&p
->open_out
,
14154 memory_order_relaxed
));
14155 json_object_int_add(json_stat
, "opensRecv",
14156 atomic_load_explicit(&p
->open_in
,
14157 memory_order_relaxed
));
14158 json_object_int_add(json_stat
, "notificationsSent",
14159 atomic_load_explicit(&p
->notify_out
,
14160 memory_order_relaxed
));
14161 json_object_int_add(json_stat
, "notificationsRecv",
14162 atomic_load_explicit(&p
->notify_in
,
14163 memory_order_relaxed
));
14164 json_object_int_add(json_stat
, "updatesSent",
14165 atomic_load_explicit(&p
->update_out
,
14166 memory_order_relaxed
));
14167 json_object_int_add(json_stat
, "updatesRecv",
14168 atomic_load_explicit(&p
->update_in
,
14169 memory_order_relaxed
));
14170 json_object_int_add(json_stat
, "keepalivesSent",
14171 atomic_load_explicit(&p
->keepalive_out
,
14172 memory_order_relaxed
));
14173 json_object_int_add(json_stat
, "keepalivesRecv",
14174 atomic_load_explicit(&p
->keepalive_in
,
14175 memory_order_relaxed
));
14176 json_object_int_add(json_stat
, "routeRefreshSent",
14177 atomic_load_explicit(&p
->refresh_out
,
14178 memory_order_relaxed
));
14179 json_object_int_add(json_stat
, "routeRefreshRecv",
14180 atomic_load_explicit(&p
->refresh_in
,
14181 memory_order_relaxed
));
14182 json_object_int_add(json_stat
, "capabilitySent",
14183 atomic_load_explicit(&p
->dynamic_cap_out
,
14184 memory_order_relaxed
));
14185 json_object_int_add(json_stat
, "capabilityRecv",
14186 atomic_load_explicit(&p
->dynamic_cap_in
,
14187 memory_order_relaxed
));
14188 json_object_int_add(json_stat
, "totalSent", PEER_TOTAL_TX(p
));
14189 json_object_int_add(json_stat
, "totalRecv", PEER_TOTAL_RX(p
));
14190 json_object_object_add(json_neigh
, "messageStats", json_stat
);
14192 atomic_size_t outq_count
, inq_count
, open_out
, open_in
,
14193 notify_out
, notify_in
, update_out
, update_in
,
14194 keepalive_out
, keepalive_in
, refresh_out
, refresh_in
,
14195 dynamic_cap_out
, dynamic_cap_in
;
14196 outq_count
= atomic_load_explicit(&p
->obuf
->count
,
14197 memory_order_relaxed
);
14198 inq_count
= atomic_load_explicit(&p
->ibuf
->count
,
14199 memory_order_relaxed
);
14200 open_out
= atomic_load_explicit(&p
->open_out
,
14201 memory_order_relaxed
);
14203 atomic_load_explicit(&p
->open_in
, memory_order_relaxed
);
14204 notify_out
= atomic_load_explicit(&p
->notify_out
,
14205 memory_order_relaxed
);
14206 notify_in
= atomic_load_explicit(&p
->notify_in
,
14207 memory_order_relaxed
);
14208 update_out
= atomic_load_explicit(&p
->update_out
,
14209 memory_order_relaxed
);
14210 update_in
= atomic_load_explicit(&p
->update_in
,
14211 memory_order_relaxed
);
14212 keepalive_out
= atomic_load_explicit(&p
->keepalive_out
,
14213 memory_order_relaxed
);
14214 keepalive_in
= atomic_load_explicit(&p
->keepalive_in
,
14215 memory_order_relaxed
);
14216 refresh_out
= atomic_load_explicit(&p
->refresh_out
,
14217 memory_order_relaxed
);
14218 refresh_in
= atomic_load_explicit(&p
->refresh_in
,
14219 memory_order_relaxed
);
14220 dynamic_cap_out
= atomic_load_explicit(&p
->dynamic_cap_out
,
14221 memory_order_relaxed
);
14222 dynamic_cap_in
= atomic_load_explicit(&p
->dynamic_cap_in
,
14223 memory_order_relaxed
);
14225 /* Packet counts. */
14226 vty_out(vty
, " Message statistics:\n");
14227 vty_out(vty
, " Inq depth is %zu\n", inq_count
);
14228 vty_out(vty
, " Outq depth is %zu\n", outq_count
);
14229 vty_out(vty
, " Sent Rcvd\n");
14230 vty_out(vty
, " Opens: %10zu %10zu\n", open_out
,
14232 vty_out(vty
, " Notifications: %10zu %10zu\n", notify_out
,
14234 vty_out(vty
, " Updates: %10zu %10zu\n", update_out
,
14236 vty_out(vty
, " Keepalives: %10zu %10zu\n", keepalive_out
,
14238 vty_out(vty
, " Route Refresh: %10zu %10zu\n", refresh_out
,
14240 vty_out(vty
, " Capability: %10zu %10zu\n",
14241 dynamic_cap_out
, dynamic_cap_in
);
14242 vty_out(vty
, " Total: %10u %10u\n",
14243 (uint32_t)PEER_TOTAL_TX(p
), (uint32_t)PEER_TOTAL_RX(p
));
14247 /* advertisement-interval */
14248 json_object_int_add(json_neigh
,
14249 "minBtwnAdvertisementRunsTimerMsecs",
14250 p
->v_routeadv
* 1000);
14252 /* Update-source. */
14253 if (p
->update_if
|| p
->update_source
) {
14255 json_object_string_add(json_neigh
,
14258 else if (p
->update_source
)
14259 json_object_string_addf(json_neigh
,
14260 "updateSource", "%pSU",
14264 /* advertisement-interval */
14266 " Minimum time between advertisement runs is %d seconds\n",
14269 /* Update-source. */
14270 if (p
->update_if
|| p
->update_source
) {
14271 vty_out(vty
, " Update source is ");
14273 vty_out(vty
, "%s", p
->update_if
);
14274 else if (p
->update_source
)
14275 vty_out(vty
, "%pSU", p
->update_source
);
14276 vty_out(vty
, "\n");
14279 vty_out(vty
, "\n");
14282 /* Address Family Information */
14283 json_object
*json_hold
= NULL
;
14286 json_hold
= json_object_new_object();
14288 FOREACH_AFI_SAFI (afi
, safi
)
14289 if (p
->afc
[afi
][safi
])
14290 bgp_show_peer_afi(vty
, p
, afi
, safi
, use_json
,
14294 json_object_object_add(json_neigh
, "addressFamilyInfo",
14296 json_object_int_add(json_neigh
, "connectionsEstablished",
14298 json_object_int_add(json_neigh
, "connectionsDropped",
14301 vty_out(vty
, " Connections established %d; dropped %d\n",
14302 p
->established
, p
->dropped
);
14304 if (!p
->last_reset
) {
14306 json_object_string_add(json_neigh
, "lastReset",
14309 vty_out(vty
, " Last reset never\n");
14315 uptime
= monotime(NULL
);
14316 uptime
-= p
->resettime
;
14317 gmtime_r(&uptime
, &tm
);
14319 json_object_int_add(json_neigh
, "lastResetTimerMsecs",
14321 + (tm
.tm_min
* 60000)
14322 + (tm
.tm_hour
* 3600000));
14323 bgp_show_peer_reset(NULL
, p
, json_neigh
, true);
14325 vty_out(vty
, " Last reset %s, ",
14326 peer_uptime(p
->resettime
, timebuf
,
14327 BGP_UPTIME_LEN
, 0, NULL
));
14329 bgp_show_peer_reset(vty
, p
, NULL
, false);
14330 if (p
->last_reset_cause_size
) {
14331 msg
= p
->last_reset_cause
;
14333 " Message received that caused BGP to send a NOTIFICATION:\n ");
14334 for (i
= 1; i
<= p
->last_reset_cause_size
;
14336 vty_out(vty
, "%02X", *msg
++);
14338 if (i
!= p
->last_reset_cause_size
) {
14340 vty_out(vty
, "\n ");
14341 } else if (i
% 4 == 0) {
14346 vty_out(vty
, "\n");
14351 if (CHECK_FLAG(p
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
)) {
14353 json_object_boolean_true_add(json_neigh
,
14354 "prefixesConfigExceedMax");
14357 " Peer had exceeded the max. no. of prefixes configured.\n");
14359 if (p
->t_pmax_restart
) {
14361 json_object_boolean_true_add(
14362 json_neigh
, "reducePrefixNumFrom");
14363 json_object_int_add(json_neigh
,
14364 "restartInTimerMsec",
14365 thread_timer_remain_second(
14370 " Reduce the no. of prefix from %s, will restart in %ld seconds\n",
14371 p
->host
, thread_timer_remain_second(
14372 p
->t_pmax_restart
));
14375 json_object_boolean_true_add(
14377 "reducePrefixNumAndClearIpBgp");
14380 " Reduce the no. of prefix and clear ip bgp %s to restore peering\n",
14385 /* EBGP Multihop and GTSM */
14386 if (p
->sort
!= BGP_PEER_IBGP
) {
14388 if (p
->gtsm_hops
> BGP_GTSM_HOPS_DISABLED
)
14389 json_object_int_add(json_neigh
,
14390 "externalBgpNbrMaxHopsAway",
14393 json_object_int_add(json_neigh
,
14394 "externalBgpNbrMaxHopsAway",
14397 if (p
->gtsm_hops
> BGP_GTSM_HOPS_DISABLED
)
14399 " External BGP neighbor may be up to %d hops away.\n",
14403 " External BGP neighbor may be up to %d hops away.\n",
14408 if (p
->gtsm_hops
> BGP_GTSM_HOPS_DISABLED
)
14409 json_object_int_add(json_neigh
,
14410 "internalBgpNbrMaxHopsAway",
14413 json_object_int_add(json_neigh
,
14414 "internalBgpNbrMaxHopsAway",
14417 if (p
->gtsm_hops
> BGP_GTSM_HOPS_DISABLED
)
14419 " Internal BGP neighbor may be up to %d hops away.\n",
14423 " Internal BGP neighbor may be up to %d hops away.\n",
14428 /* Local address. */
14431 json_object_string_addf(json_neigh
, "hostLocal", "%pSU",
14433 json_object_int_add(json_neigh
, "portLocal",
14434 ntohs(p
->su_local
->sin
.sin_port
));
14436 vty_out(vty
, "Local host: %pSU, Local port: %d\n",
14437 p
->su_local
, ntohs(p
->su_local
->sin
.sin_port
));
14440 json_object_string_add(json_neigh
, "hostLocal",
14442 json_object_int_add(json_neigh
, "portLocal", -1);
14446 /* Remote address. */
14447 if (p
->su_remote
) {
14449 json_object_string_addf(json_neigh
, "hostForeign",
14450 "%pSU", p
->su_remote
);
14451 json_object_int_add(json_neigh
, "portForeign",
14452 ntohs(p
->su_remote
->sin
.sin_port
));
14454 vty_out(vty
, "Foreign host: %pSU, Foreign port: %d\n",
14456 ntohs(p
->su_remote
->sin
.sin_port
));
14459 json_object_string_add(json_neigh
, "hostForeign",
14461 json_object_int_add(json_neigh
, "portForeign", -1);
14465 /* Nexthop display. */
14468 json_object_string_addf(json_neigh
, "nexthop", "%pI4",
14470 json_object_string_addf(json_neigh
, "nexthopGlobal",
14471 "%pI6", &p
->nexthop
.v6_global
);
14472 json_object_string_addf(json_neigh
, "nexthopLocal",
14473 "%pI6", &p
->nexthop
.v6_local
);
14474 if (p
->shared_network
)
14475 json_object_string_add(json_neigh
,
14479 json_object_string_add(json_neigh
,
14481 "nonSharedNetwork");
14483 vty_out(vty
, "Nexthop: %s\n",
14484 inet_ntop(AF_INET
, &p
->nexthop
.v4
, buf1
,
14486 vty_out(vty
, "Nexthop global: %s\n",
14487 inet_ntop(AF_INET6
, &p
->nexthop
.v6_global
, buf1
,
14489 vty_out(vty
, "Nexthop local: %s\n",
14490 inet_ntop(AF_INET6
, &p
->nexthop
.v6_local
, buf1
,
14492 vty_out(vty
, "BGP connection: %s\n",
14493 p
->shared_network
? "shared network"
14494 : "non shared network");
14498 /* Timer information. */
14500 json_object_int_add(json_neigh
, "connectRetryTimer",
14502 if (peer_established(p
) && p
->rtt
)
14503 json_object_int_add(json_neigh
, "estimatedRttInMsecs",
14506 json_object_int_add(
14507 json_neigh
, "nextStartTimerDueInMsecs",
14508 thread_timer_remain_second(p
->t_start
) * 1000);
14510 json_object_int_add(
14511 json_neigh
, "nextConnectTimerDueInMsecs",
14512 thread_timer_remain_second(p
->t_connect
)
14514 if (p
->t_routeadv
) {
14515 json_object_int_add(json_neigh
, "mraiInterval",
14517 json_object_int_add(
14518 json_neigh
, "mraiTimerExpireInMsecs",
14519 thread_timer_remain_second(p
->t_routeadv
)
14523 json_object_int_add(json_neigh
, "authenticationEnabled",
14527 json_object_string_add(json_neigh
, "readThread", "on");
14529 json_object_string_add(json_neigh
, "readThread", "off");
14531 if (CHECK_FLAG(p
->thread_flags
, PEER_THREAD_WRITES_ON
))
14532 json_object_string_add(json_neigh
, "writeThread", "on");
14534 json_object_string_add(json_neigh
, "writeThread",
14537 vty_out(vty
, "BGP Connect Retry Timer in Seconds: %d\n",
14539 if (peer_established(p
) && p
->rtt
)
14540 vty_out(vty
, "Estimated round trip time: %d ms\n",
14543 vty_out(vty
, "Next start timer due in %ld seconds\n",
14544 thread_timer_remain_second(p
->t_start
));
14546 vty_out(vty
, "Next connect timer due in %ld seconds\n",
14547 thread_timer_remain_second(p
->t_connect
));
14550 "MRAI (interval %u) timer expires in %ld seconds\n",
14552 thread_timer_remain_second(p
->t_routeadv
));
14554 vty_out(vty
, "Peer Authentication Enabled\n");
14556 vty_out(vty
, "Read thread: %s Write thread: %s FD used: %d\n",
14557 p
->t_read
? "on" : "off",
14558 CHECK_FLAG(p
->thread_flags
, PEER_THREAD_WRITES_ON
)
14563 if (p
->notify
.code
== BGP_NOTIFY_OPEN_ERR
14564 && p
->notify
.subcode
== BGP_NOTIFY_OPEN_UNSUP_CAPBL
)
14565 bgp_capability_vty_out(vty
, p
, use_json
, json_neigh
);
14568 vty_out(vty
, "\n");
14570 /* BFD information. */
14572 bgp_bfd_show_info(vty
, p
, json_neigh
);
14575 if (p
->conf_if
) /* Configured interface name. */
14576 json_object_object_add(json
, p
->conf_if
, json_neigh
);
14577 else /* Configured IP address. */
14578 json_object_object_add(json
, p
->host
, json_neigh
);
14582 static int bgp_show_neighbor_graceful_restart(struct vty
*vty
, struct bgp
*bgp
,
14583 enum show_type type
,
14584 union sockunion
*su
,
14585 const char *conf_if
, afi_t afi
,
14588 struct listnode
*node
, *nnode
;
14591 safi_t safi
= SAFI_UNICAST
;
14592 json_object
*json
= NULL
;
14593 json_object
*json_neighbor
= NULL
;
14596 json
= json_object_new_object();
14597 json_neighbor
= json_object_new_object();
14600 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
14602 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
14605 if ((peer
->afc
[afi
][safi
]) == 0)
14608 if (type
== show_all
) {
14609 bgp_show_peer_gr_status(vty
, peer
, use_json
,
14613 json_object_object_add(json
, peer
->host
,
14615 json_neighbor
= NULL
;
14618 } else if (type
== show_peer
) {
14621 && !strcmp(peer
->conf_if
, conf_if
))
14623 && !strcmp(peer
->hostname
, conf_if
))) {
14625 bgp_show_peer_gr_status(vty
, peer
,
14630 if (sockunion_same(&peer
->su
, su
)) {
14632 bgp_show_peer_gr_status(vty
, peer
,
14637 if (use_json
&& find
)
14638 json_object_object_add(json
, peer
->host
,
14643 json_neighbor
= NULL
;
14648 if (type
== show_peer
&& !find
) {
14650 json_object_boolean_true_add(json
, "bgpNoSuchNeighbor");
14652 vty_out(vty
, "%% No such neighbor\n");
14656 json_object_free(json_neighbor
);
14657 vty_json(vty
, json
);
14659 vty_out(vty
, "\n");
14662 return CMD_SUCCESS
;
14665 static int bgp_show_neighbor(struct vty
*vty
, struct bgp
*bgp
,
14666 enum show_type type
, union sockunion
*su
,
14667 const char *conf_if
, bool use_json
,
14670 struct listnode
*node
, *nnode
;
14673 bool nbr_output
= false;
14674 afi_t afi
= AFI_MAX
;
14675 safi_t safi
= SAFI_MAX
;
14677 if (type
== show_ipv4_peer
|| type
== show_ipv4_all
) {
14679 } else if (type
== show_ipv6_peer
|| type
== show_ipv6_all
) {
14683 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
14684 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
14689 bgp_show_peer(vty
, peer
, use_json
, json
);
14695 && !strcmp(peer
->conf_if
, conf_if
))
14697 && !strcmp(peer
->hostname
, conf_if
))) {
14699 bgp_show_peer(vty
, peer
, use_json
,
14703 if (sockunion_same(&peer
->su
, su
)) {
14705 bgp_show_peer(vty
, peer
, use_json
,
14710 case show_ipv4_peer
:
14711 case show_ipv6_peer
:
14712 FOREACH_SAFI (safi
) {
14713 if (peer
->afc
[afi
][safi
]) {
14716 && !strcmp(peer
->conf_if
, conf_if
))
14718 && !strcmp(peer
->hostname
, conf_if
))) {
14720 bgp_show_peer(vty
, peer
, use_json
,
14725 if (sockunion_same(&peer
->su
, su
)) {
14727 bgp_show_peer(vty
, peer
, use_json
,
14735 case show_ipv4_all
:
14736 case show_ipv6_all
:
14737 FOREACH_SAFI (safi
) {
14738 if (peer
->afc
[afi
][safi
]) {
14739 bgp_show_peer(vty
, peer
, use_json
, json
);
14748 if ((type
== show_peer
|| type
== show_ipv4_peer
||
14749 type
== show_ipv6_peer
) && !find
) {
14751 json_object_boolean_true_add(json
, "bgpNoSuchNeighbor");
14753 vty_out(vty
, "%% No such neighbor in this view/vrf\n");
14756 if (type
!= show_peer
&& type
!= show_ipv4_peer
&&
14757 type
!= show_ipv6_peer
&& !nbr_output
&& !use_json
)
14758 vty_out(vty
, "%% No BGP neighbors found\n");
14761 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
14762 json
, JSON_C_TO_STRING_PRETTY
));
14764 vty_out(vty
, "\n");
14767 return CMD_SUCCESS
;
14770 static void bgp_show_neighbor_graceful_restart_vty(struct vty
*vty
,
14771 enum show_type type
,
14772 const char *ip_str
,
14773 afi_t afi
, bool use_json
)
14778 union sockunion su
;
14780 bgp
= bgp_get_default();
14786 bgp_show_global_graceful_restart_mode_vty(vty
, bgp
, use_json
,
14790 ret
= str2sockunion(ip_str
, &su
);
14792 bgp_show_neighbor_graceful_restart(
14793 vty
, bgp
, type
, NULL
, ip_str
, afi
, use_json
);
14795 bgp_show_neighbor_graceful_restart(vty
, bgp
, type
, &su
,
14796 NULL
, afi
, use_json
);
14798 bgp_show_neighbor_graceful_restart(vty
, bgp
, type
, NULL
, NULL
,
14802 static void bgp_show_all_instances_neighbors_vty(struct vty
*vty
,
14803 enum show_type type
,
14804 const char *ip_str
,
14807 struct listnode
*node
, *nnode
;
14809 union sockunion su
;
14810 json_object
*json
= NULL
;
14811 int ret
, is_first
= 1;
14812 bool nbr_output
= false;
14815 vty_out(vty
, "{\n");
14817 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
14820 if (!(json
= json_object_new_object())) {
14822 EC_BGP_JSON_MEM_ERROR
,
14823 "Unable to allocate memory for JSON object");
14825 "{\"error\": {\"message:\": \"Unable to allocate memory for JSON object\"}}}\n");
14829 json_object_int_add(json
, "vrfId",
14830 (bgp
->vrf_id
== VRF_UNKNOWN
)
14832 : (int64_t)bgp
->vrf_id
);
14833 json_object_string_add(
14835 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
14840 vty_out(vty
, ",\n");
14844 vty_out(vty
, "\"%s\":",
14845 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
14849 vty_out(vty
, "\nInstance %s:\n",
14850 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
14855 if (type
== show_peer
|| type
== show_ipv4_peer
||
14856 type
== show_ipv6_peer
) {
14857 ret
= str2sockunion(ip_str
, &su
);
14859 bgp_show_neighbor(vty
, bgp
, type
, NULL
, ip_str
,
14862 bgp_show_neighbor(vty
, bgp
, type
, &su
, NULL
,
14865 bgp_show_neighbor(vty
, bgp
, type
, NULL
, NULL
,
14868 json_object_free(json
);
14873 vty_out(vty
, "}\n");
14874 else if (!nbr_output
)
14875 vty_out(vty
, "%% BGP instance not found\n");
14878 static int bgp_show_neighbor_vty(struct vty
*vty
, const char *name
,
14879 enum show_type type
, const char *ip_str
,
14884 union sockunion su
;
14885 json_object
*json
= NULL
;
14888 if (strmatch(name
, "all")) {
14889 bgp_show_all_instances_neighbors_vty(vty
, type
, ip_str
,
14891 return CMD_SUCCESS
;
14893 bgp
= bgp_lookup_by_name(name
);
14896 json
= json_object_new_object();
14897 vty_json(vty
, json
);
14900 "%% BGP instance not found\n");
14902 return CMD_WARNING
;
14906 bgp
= bgp_get_default();
14910 json
= json_object_new_object();
14912 ret
= str2sockunion(ip_str
, &su
);
14914 bgp_show_neighbor(vty
, bgp
, type
, NULL
, ip_str
,
14917 bgp_show_neighbor(vty
, bgp
, type
, &su
, NULL
,
14920 bgp_show_neighbor(vty
, bgp
, type
, NULL
, NULL
, use_json
,
14923 json_object_free(json
);
14926 vty_out(vty
, "{}\n");
14928 vty_out(vty
, "%% BGP instance not found\n");
14931 return CMD_SUCCESS
;
14936 /* "show [ip] bgp neighbors graceful-restart" commands. */
14937 DEFUN (show_ip_bgp_neighbors_graceful_restart
,
14938 show_ip_bgp_neighbors_graceful_restart_cmd
,
14939 "show bgp [<ipv4|ipv6>] neighbors [<A.B.C.D|X:X::X:X|WORD>] graceful-restart [json]",
14945 "Neighbor to display information about\n"
14946 "Neighbor to display information about\n"
14947 "Neighbor on BGP configured interface\n"
14951 char *sh_arg
= NULL
;
14952 enum show_type sh_type
;
14954 afi_t afi
= AFI_MAX
;
14955 bool uj
= use_json(argc
, argv
);
14957 if (!argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
))
14962 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)
14963 || argv_find(argv
, argc
, "X:X::X:X", &idx
)
14964 || argv_find(argv
, argc
, "WORD", &idx
)) {
14965 sh_type
= show_peer
;
14966 sh_arg
= argv
[idx
]->arg
;
14968 sh_type
= show_all
;
14970 if (!argv_find(argv
, argc
, "graceful-restart", &idx
))
14971 return CMD_SUCCESS
;
14974 return bgp_show_neighbor_graceful_restart_afi_all(vty
, sh_type
, sh_arg
,
14978 /* "show [ip] bgp neighbors" commands. */
14979 DEFUN (show_ip_bgp_neighbors
,
14980 show_ip_bgp_neighbors_cmd
,
14981 "show [ip] bgp [<view|vrf> VIEWVRFNAME] [<ipv4|ipv6>] neighbors [<A.B.C.D|X:X::X:X|WORD>] [json]",
14985 BGP_INSTANCE_HELP_STR
14988 "Detailed information on TCP and BGP neighbor connections\n"
14989 "Neighbor to display information about\n"
14990 "Neighbor to display information about\n"
14991 "Neighbor on BGP configured interface\n"
14995 char *sh_arg
= NULL
;
14996 enum show_type sh_type
;
14997 afi_t afi
= AFI_MAX
;
14999 bool uj
= use_json(argc
, argv
);
15003 /* [<vrf> VIEWVRFNAME] */
15004 if (argv_find(argv
, argc
, "vrf", &idx
)) {
15005 vrf
= argv
[idx
+ 1]->arg
;
15006 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
15008 } else if (argv_find(argv
, argc
, "view", &idx
))
15009 /* [<view> VIEWVRFNAME] */
15010 vrf
= argv
[idx
+ 1]->arg
;
15014 if (argv_find(argv
, argc
, "ipv4", &idx
)) {
15015 sh_type
= show_ipv4_all
;
15017 } else if (argv_find(argv
, argc
, "ipv6", &idx
)) {
15018 sh_type
= show_ipv6_all
;
15021 sh_type
= show_all
;
15024 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)
15025 || argv_find(argv
, argc
, "X:X::X:X", &idx
)
15026 || argv_find(argv
, argc
, "WORD", &idx
)) {
15027 sh_type
= show_peer
;
15028 sh_arg
= argv
[idx
]->arg
;
15031 if (sh_type
== show_peer
&& afi
== AFI_IP
) {
15032 sh_type
= show_ipv4_peer
;
15033 } else if (sh_type
== show_peer
&& afi
== AFI_IP6
) {
15034 sh_type
= show_ipv6_peer
;
15037 return bgp_show_neighbor_vty(vty
, vrf
, sh_type
, sh_arg
, uj
);
15040 /* Show BGP's AS paths internal data. There are both `show [ip] bgp
15041 paths' and `show ip mbgp paths'. Those functions results are the
15043 DEFUN (show_ip_bgp_paths
,
15044 show_ip_bgp_paths_cmd
,
15045 "show [ip] bgp ["BGP_SAFI_CMD_STR
"] paths",
15050 "Path information\n")
15052 vty_out(vty
, "Address Refcnt Path\n");
15053 aspath_print_all_vty(vty
);
15054 return CMD_SUCCESS
;
15059 static void community_show_all_iterator(struct hash_bucket
*bucket
,
15062 struct community
*com
;
15064 com
= (struct community
*)bucket
->data
;
15065 vty_out(vty
, "[%p] (%ld) %s\n", (void *)com
, com
->refcnt
,
15066 community_str(com
, false, false));
15069 /* Show BGP's community internal data. */
15070 DEFUN (show_ip_bgp_community_info
,
15071 show_ip_bgp_community_info_cmd
,
15072 "show [ip] bgp community-info",
15076 "List all bgp community information\n")
15078 vty_out(vty
, "Address Refcnt Community\n");
15080 hash_iterate(community_hash(),
15081 (void (*)(struct hash_bucket
*,
15082 void *))community_show_all_iterator
,
15085 return CMD_SUCCESS
;
15088 static void lcommunity_show_all_iterator(struct hash_bucket
*bucket
,
15091 struct lcommunity
*lcom
;
15093 lcom
= (struct lcommunity
*)bucket
->data
;
15094 vty_out(vty
, "[%p] (%ld) %s\n", (void *)lcom
, lcom
->refcnt
,
15095 lcommunity_str(lcom
, false, false));
15098 /* Show BGP's community internal data. */
15099 DEFUN (show_ip_bgp_lcommunity_info
,
15100 show_ip_bgp_lcommunity_info_cmd
,
15101 "show ip bgp large-community-info",
15105 "List all bgp large-community information\n")
15107 vty_out(vty
, "Address Refcnt Large-community\n");
15109 hash_iterate(lcommunity_hash(),
15110 (void (*)(struct hash_bucket
*,
15111 void *))lcommunity_show_all_iterator
,
15114 return CMD_SUCCESS
;
15116 /* Graceful Restart */
15118 static void bgp_show_global_graceful_restart_mode_vty(struct vty
*vty
,
15125 vty_out(vty
, "\n%s", SHOW_GR_HEADER
);
15127 enum global_mode bgp_global_gr_mode
= bgp_global_gr_mode_get(bgp
);
15129 switch (bgp_global_gr_mode
) {
15131 case GLOBAL_HELPER
:
15132 vty_out(vty
, "Global BGP GR Mode : Helper\n");
15136 vty_out(vty
, "Global BGP GR Mode : Restart\n");
15139 case GLOBAL_DISABLE
:
15140 vty_out(vty
, "Global BGP GR Mode : Disable\n");
15143 case GLOBAL_INVALID
:
15145 "Global BGP GR Mode Invalid\n");
15148 vty_out(vty
, "\n");
15151 static int bgp_show_neighbor_graceful_restart_afi_all(struct vty
*vty
,
15152 enum show_type type
,
15153 const char *ip_str
,
15154 afi_t afi
, bool use_json
)
15156 if ((afi
== AFI_MAX
) && (ip_str
== NULL
)) {
15159 while ((afi
!= AFI_L2VPN
) && (afi
< AFI_MAX
)) {
15161 bgp_show_neighbor_graceful_restart_vty(
15162 vty
, type
, ip_str
, afi
, use_json
);
15165 } else if (afi
!= AFI_MAX
) {
15166 bgp_show_neighbor_graceful_restart_vty(vty
, type
, ip_str
, afi
,
15169 return CMD_ERR_INCOMPLETE
;
15172 return CMD_SUCCESS
;
15174 /* Graceful Restart */
15176 DEFUN (show_ip_bgp_attr_info
,
15177 show_ip_bgp_attr_info_cmd
,
15178 "show [ip] bgp attribute-info",
15182 "List all bgp attribute information\n")
15184 attr_show_all(vty
);
15185 return CMD_SUCCESS
;
15188 static int bgp_show_route_leak_vty(struct vty
*vty
, const char *name
,
15189 afi_t afi
, safi_t safi
,
15190 bool use_json
, json_object
*json
)
15193 struct listnode
*node
;
15196 enum vpn_policy_direction dir
;
15199 json_object
*json_import_vrfs
= NULL
;
15200 json_object
*json_export_vrfs
= NULL
;
15202 bgp
= name
? bgp_lookup_by_name(name
) : bgp_get_default();
15205 vty_json(vty
, json
);
15207 return CMD_WARNING
;
15210 /* Provide context for the block */
15211 json_object_string_add(json
, "vrf", name
? name
: "default");
15212 json_object_string_add(json
, "afiSafi",
15213 get_afi_safi_str(afi
, safi
, true));
15215 if (!CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
15216 BGP_CONFIG_VRF_TO_VRF_IMPORT
)) {
15217 json_object_string_add(json
, "importFromVrfs", "none");
15218 json_object_string_add(json
, "importRts", "none");
15220 json_import_vrfs
= json_object_new_array();
15222 for (ALL_LIST_ELEMENTS_RO(
15223 bgp
->vpn_policy
[afi
].import_vrf
,
15225 json_object_array_add(json_import_vrfs
,
15226 json_object_new_string(vname
));
15228 json_object_object_add(json
, "importFromVrfs",
15230 dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
15231 if (bgp
->vpn_policy
[afi
].rtlist
[dir
]) {
15232 ecom_str
= ecommunity_ecom2str(
15233 bgp
->vpn_policy
[afi
].rtlist
[dir
],
15234 ECOMMUNITY_FORMAT_ROUTE_MAP
, 0);
15235 json_object_string_add(json
, "importRts",
15237 XFREE(MTYPE_ECOMMUNITY_STR
, ecom_str
);
15239 json_object_string_add(json
, "importRts",
15243 if (!CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
15244 BGP_CONFIG_VRF_TO_VRF_EXPORT
)) {
15245 json_object_string_add(json
, "exportToVrfs", "none");
15246 json_object_string_add(json
, "routeDistinguisher",
15248 json_object_string_add(json
, "exportRts", "none");
15250 json_export_vrfs
= json_object_new_array();
15252 for (ALL_LIST_ELEMENTS_RO(
15253 bgp
->vpn_policy
[afi
].export_vrf
,
15255 json_object_array_add(json_export_vrfs
,
15256 json_object_new_string(vname
));
15257 json_object_object_add(json
, "exportToVrfs",
15259 json_object_string_addf(json
, "routeDistinguisher",
15261 &bgp
->vpn_policy
[afi
].tovpn_rd
);
15263 dir
= BGP_VPN_POLICY_DIR_TOVPN
;
15264 if (bgp
->vpn_policy
[afi
].rtlist
[dir
]) {
15265 ecom_str
= ecommunity_ecom2str(
15266 bgp
->vpn_policy
[afi
].rtlist
[dir
],
15267 ECOMMUNITY_FORMAT_ROUTE_MAP
, 0);
15268 json_object_string_add(json
, "exportRts",
15270 XFREE(MTYPE_ECOMMUNITY_STR
, ecom_str
);
15272 json_object_string_add(json
, "exportRts",
15277 vty_json(vty
, json
);
15280 bgp
= name
? bgp_lookup_by_name(name
) : bgp_get_default();
15283 vty_out(vty
, "%% No such BGP instance exist\n");
15284 return CMD_WARNING
;
15287 if (!CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
15288 BGP_CONFIG_VRF_TO_VRF_IMPORT
))
15290 "This VRF is not importing %s routes from any other VRF\n",
15291 get_afi_safi_str(afi
, safi
, false));
15294 "This VRF is importing %s routes from the following VRFs:\n",
15295 get_afi_safi_str(afi
, safi
, false));
15297 for (ALL_LIST_ELEMENTS_RO(
15298 bgp
->vpn_policy
[afi
].import_vrf
,
15300 vty_out(vty
, " %s\n", vname
);
15302 dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
15304 if (bgp
->vpn_policy
[afi
].rtlist
[dir
]) {
15305 ecom_str
= ecommunity_ecom2str(
15306 bgp
->vpn_policy
[afi
].rtlist
[dir
],
15307 ECOMMUNITY_FORMAT_ROUTE_MAP
, 0);
15308 vty_out(vty
, "Import RT(s): %s\n", ecom_str
);
15310 XFREE(MTYPE_ECOMMUNITY_STR
, ecom_str
);
15312 vty_out(vty
, "Import RT(s):\n");
15315 if (!CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
15316 BGP_CONFIG_VRF_TO_VRF_EXPORT
))
15318 "This VRF is not exporting %s routes to any other VRF\n",
15319 get_afi_safi_str(afi
, safi
, false));
15322 "This VRF is exporting %s routes to the following VRFs:\n",
15323 get_afi_safi_str(afi
, safi
, false));
15325 for (ALL_LIST_ELEMENTS_RO(
15326 bgp
->vpn_policy
[afi
].export_vrf
,
15328 vty_out(vty
, " %s\n", vname
);
15330 vty_out(vty
, "RD: %pRD\n",
15331 &bgp
->vpn_policy
[afi
].tovpn_rd
);
15333 dir
= BGP_VPN_POLICY_DIR_TOVPN
;
15334 if (bgp
->vpn_policy
[afi
].rtlist
[dir
]) {
15335 ecom_str
= ecommunity_ecom2str(
15336 bgp
->vpn_policy
[afi
].rtlist
[dir
],
15337 ECOMMUNITY_FORMAT_ROUTE_MAP
, 0);
15338 vty_out(vty
, "Export RT: %s\n", ecom_str
);
15339 XFREE(MTYPE_ECOMMUNITY_STR
, ecom_str
);
15341 vty_out(vty
, "Import RT(s):\n");
15345 return CMD_SUCCESS
;
15348 static int bgp_show_all_instance_route_leak_vty(struct vty
*vty
, afi_t afi
,
15349 safi_t safi
, bool use_json
)
15351 struct listnode
*node
, *nnode
;
15353 char *vrf_name
= NULL
;
15354 json_object
*json
= NULL
;
15355 json_object
*json_vrf
= NULL
;
15356 json_object
*json_vrfs
= NULL
;
15359 json
= json_object_new_object();
15360 json_vrfs
= json_object_new_object();
15363 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
15365 if (bgp
->inst_type
!= BGP_INSTANCE_TYPE_DEFAULT
)
15366 vrf_name
= bgp
->name
;
15369 json_vrf
= json_object_new_object();
15371 vty_out(vty
, "\nInstance %s:\n",
15372 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
15373 ? VRF_DEFAULT_NAME
: bgp
->name
);
15375 bgp_show_route_leak_vty(vty
, vrf_name
, afi
, safi
, 0, json_vrf
);
15377 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
15378 json_object_object_add(json_vrfs
,
15379 VRF_DEFAULT_NAME
, json_vrf
);
15381 json_object_object_add(json_vrfs
, vrf_name
,
15387 json_object_object_add(json
, "vrfs", json_vrfs
);
15388 vty_json(vty
, json
);
15391 return CMD_SUCCESS
;
15394 /* "show [ip] bgp route-leak" command. */
15395 DEFUN (show_ip_bgp_route_leak
,
15396 show_ip_bgp_route_leak_cmd
,
15397 "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR
" ["BGP_SAFI_CMD_STR
"]] route-leak [json]",
15401 BGP_INSTANCE_HELP_STR
15404 "Route leaking information\n"
15408 afi_t afi
= AFI_MAX
;
15409 safi_t safi
= SAFI_MAX
;
15411 bool uj
= use_json(argc
, argv
);
15413 json_object
*json
= NULL
;
15415 /* show [ip] bgp */
15416 if (argv_find(argv
, argc
, "ip", &idx
)) {
15418 safi
= SAFI_UNICAST
;
15420 /* [vrf VIEWVRFNAME] */
15421 if (argv_find(argv
, argc
, "view", &idx
)) {
15423 "%% This command is not applicable to BGP views\n");
15424 return CMD_WARNING
;
15427 if (argv_find(argv
, argc
, "vrf", &idx
)) {
15428 vrf
= argv
[idx
+ 1]->arg
;
15429 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
15432 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
15433 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
))
15434 argv_find_and_parse_safi(argv
, argc
, &idx
, &safi
);
15436 if (!((afi
== AFI_IP
|| afi
== AFI_IP6
) && safi
== SAFI_UNICAST
)) {
15438 "%% This command is applicable only for unicast ipv4|ipv6\n");
15439 return CMD_WARNING
;
15442 if (vrf
&& strmatch(vrf
, "all"))
15443 return bgp_show_all_instance_route_leak_vty(vty
, afi
, safi
, uj
);
15446 json
= json_object_new_object();
15448 return bgp_show_route_leak_vty(vty
, vrf
, afi
, safi
, uj
, json
);
15451 static void bgp_show_all_instances_updgrps_vty(struct vty
*vty
, afi_t afi
,
15454 struct listnode
*node
, *nnode
;
15457 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
15458 vty_out(vty
, "\nInstance %s:\n",
15459 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
15462 update_group_show(bgp
, afi
, safi
, vty
, 0);
15466 static int bgp_show_update_groups(struct vty
*vty
, const char *name
, int afi
,
15467 int safi
, uint64_t subgrp_id
)
15472 if (strmatch(name
, "all")) {
15473 bgp_show_all_instances_updgrps_vty(vty
, afi
, safi
);
15474 return CMD_SUCCESS
;
15476 bgp
= bgp_lookup_by_name(name
);
15479 bgp
= bgp_get_default();
15483 update_group_show(bgp
, afi
, safi
, vty
, subgrp_id
);
15484 return CMD_SUCCESS
;
15487 DEFUN (show_ip_bgp_updgrps
,
15488 show_ip_bgp_updgrps_cmd
,
15489 "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR
" ["BGP_SAFI_WITH_LABEL_CMD_STR
"]] update-groups [SUBGROUP-ID]",
15493 BGP_INSTANCE_HELP_STR
15495 BGP_SAFI_WITH_LABEL_HELP_STR
15496 "Detailed info about dynamic update groups\n"
15497 "Specific subgroup to display detailed info for\n")
15500 afi_t afi
= AFI_IP6
;
15501 safi_t safi
= SAFI_UNICAST
;
15502 uint64_t subgrp_id
= 0;
15506 /* show [ip] bgp */
15507 if (argv_find(argv
, argc
, "ip", &idx
))
15509 /* [<vrf> VIEWVRFNAME] */
15510 if (argv_find(argv
, argc
, "vrf", &idx
)) {
15511 vrf
= argv
[idx
+ 1]->arg
;
15512 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
15514 } else if (argv_find(argv
, argc
, "view", &idx
))
15515 /* [<view> VIEWVRFNAME] */
15516 vrf
= argv
[idx
+ 1]->arg
;
15517 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
15518 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
)) {
15519 argv_find_and_parse_safi(argv
, argc
, &idx
, &safi
);
15522 /* get subgroup id, if provided */
15524 if (argv
[idx
]->type
== VARIABLE_TKN
)
15525 subgrp_id
= strtoull(argv
[idx
]->arg
, NULL
, 10);
15527 return (bgp_show_update_groups(vty
, vrf
, afi
, safi
, subgrp_id
));
15530 DEFUN (show_bgp_instance_all_ipv6_updgrps
,
15531 show_bgp_instance_all_ipv6_updgrps_cmd
,
15532 "show [ip] bgp <view|vrf> all update-groups",
15536 BGP_INSTANCE_ALL_HELP_STR
15537 "Detailed info about dynamic update groups\n")
15539 bgp_show_all_instances_updgrps_vty(vty
, AFI_IP6
, SAFI_UNICAST
);
15540 return CMD_SUCCESS
;
15543 DEFUN (show_bgp_l2vpn_evpn_updgrps
,
15544 show_bgp_l2vpn_evpn_updgrps_cmd
,
15545 "show [ip] bgp l2vpn evpn update-groups",
15549 "l2vpn address family\n"
15550 "evpn sub-address family\n"
15551 "Detailed info about dynamic update groups\n")
15554 uint64_t subgrp_id
= 0;
15556 bgp_show_update_groups(vty
, vrf
, AFI_L2VPN
, SAFI_EVPN
, subgrp_id
);
15557 return CMD_SUCCESS
;
15560 DEFUN (show_bgp_updgrps_stats
,
15561 show_bgp_updgrps_stats_cmd
,
15562 "show [ip] bgp update-groups statistics",
15566 "Detailed info about dynamic update groups\n"
15571 bgp
= bgp_get_default();
15573 update_group_show_stats(bgp
, vty
);
15575 return CMD_SUCCESS
;
15578 DEFUN (show_bgp_instance_updgrps_stats
,
15579 show_bgp_instance_updgrps_stats_cmd
,
15580 "show [ip] bgp <view|vrf> VIEWVRFNAME update-groups statistics",
15584 BGP_INSTANCE_HELP_STR
15585 "Detailed info about dynamic update groups\n"
15591 bgp
= bgp_lookup_by_name(argv
[idx_word
]->arg
);
15593 update_group_show_stats(bgp
, vty
);
15595 return CMD_SUCCESS
;
15598 static void show_bgp_updgrps_adj_info_aux(struct vty
*vty
, const char *name
,
15599 afi_t afi
, safi_t safi
,
15600 const char *what
, uint64_t subgrp_id
)
15605 bgp
= bgp_lookup_by_name(name
);
15607 bgp
= bgp_get_default();
15610 if (!strcmp(what
, "advertise-queue"))
15611 update_group_show_adj_queue(bgp
, afi
, safi
, vty
,
15613 else if (!strcmp(what
, "advertised-routes"))
15614 update_group_show_advertised(bgp
, afi
, safi
, vty
,
15616 else if (!strcmp(what
, "packet-queue"))
15617 update_group_show_packet_queue(bgp
, afi
, safi
, vty
,
15622 DEFPY(show_ip_bgp_instance_updgrps_adj_s
,
15623 show_ip_bgp_instance_updgrps_adj_s_cmd
,
15624 "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",
15625 SHOW_STR IP_STR BGP_STR BGP_INSTANCE_HELP_STR BGP_AFI_HELP_STR
15627 "Detailed info about dynamic update groups\n"
15628 "Specific subgroup to display info for\n"
15629 "Advertisement queue\n"
15630 "Announced routes\n"
15633 uint64_t subgrp_id
= 0;
15637 subgrp_id
= strtoull(sgid
, NULL
, 10);
15642 afiz
= bgp_vty_afi_from_str(afi
);
15646 afiz
= bgp_vty_afi_from_str(afi
);
15647 if (afiz
!= AFI_IP
)
15649 "%% Cannot specify both 'ip' and 'ipv6'\n");
15650 return CMD_WARNING
;
15653 safiz
= safi
? bgp_vty_safi_from_str(safi
) : SAFI_UNICAST
;
15655 show_bgp_updgrps_adj_info_aux(vty
, vrf
, afiz
, safiz
, rtq
, subgrp_id
);
15656 return CMD_SUCCESS
;
15659 static int bgp_show_one_peer_group(struct vty
*vty
, struct peer_group
*group
,
15662 struct listnode
*node
, *nnode
;
15663 struct prefix
*range
;
15668 const char *peer_status
;
15672 json_object
*json_peer_group
= NULL
;
15673 json_object
*json_peer_group_afc
= NULL
;
15674 json_object
*json_peer_group_members
= NULL
;
15675 json_object
*json_peer_group_dynamic
= NULL
;
15676 json_object
*json_peer_group_dynamic_af
= NULL
;
15677 json_object
*json_peer_group_ranges
= NULL
;
15679 conf
= group
->conf
;
15682 json_peer_group
= json_object_new_object();
15683 json_peer_group_afc
= json_object_new_array();
15686 if (conf
->as_type
== AS_SPECIFIED
|| conf
->as_type
== AS_EXTERNAL
) {
15688 json_object_int_add(json_peer_group
, "remoteAs",
15691 vty_out(vty
, "\nBGP peer-group %s, remote AS %u\n",
15692 group
->name
, conf
->as
);
15693 } else if (conf
->as_type
== AS_INTERNAL
) {
15695 json_object_int_add(json_peer_group
, "remoteAs",
15698 vty_out(vty
, "\nBGP peer-group %s, remote AS %u\n",
15699 group
->name
, group
->bgp
->as
);
15702 vty_out(vty
, "\nBGP peer-group %s\n", group
->name
);
15705 if ((group
->bgp
->as
== conf
->as
) || (conf
->as_type
== AS_INTERNAL
)) {
15707 json_object_string_add(json_peer_group
, "type",
15710 vty_out(vty
, " Peer-group type is internal\n");
15713 json_object_string_add(json_peer_group
, "type",
15716 vty_out(vty
, " Peer-group type is external\n");
15719 /* Display AFs configured. */
15721 vty_out(vty
, " Configured address-families:");
15723 FOREACH_AFI_SAFI (afi
, safi
) {
15724 if (conf
->afc
[afi
][safi
]) {
15727 json_object_array_add(
15728 json_peer_group_afc
,
15729 json_object_new_string(get_afi_safi_str(
15730 afi
, safi
, false)));
15732 vty_out(vty
, " %s;",
15733 get_afi_safi_str(afi
, safi
, false));
15738 json_object_object_add(json_peer_group
,
15739 "addressFamiliesConfigured",
15740 json_peer_group_afc
);
15743 vty_out(vty
, " none\n");
15745 vty_out(vty
, "\n");
15748 /* Display listen ranges (for dynamic neighbors), if any */
15749 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++) {
15750 lr_count
= listcount(group
->listen_range
[afi
]);
15753 if (!json_peer_group_dynamic
)
15754 json_peer_group_dynamic
=
15755 json_object_new_object();
15757 json_peer_group_dynamic_af
=
15758 json_object_new_object();
15759 json_peer_group_ranges
=
15760 json_object_new_array();
15761 json_object_int_add(json_peer_group_dynamic_af
,
15762 "count", lr_count
);
15764 vty_out(vty
, " %d %s listen range(s)\n",
15765 lr_count
, afi2str(afi
));
15768 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], node
,
15773 snprintfrr(buf
, sizeof(buf
), "%pFX",
15776 json_object_array_add(
15777 json_peer_group_ranges
,
15778 json_object_new_string(buf
));
15780 vty_out(vty
, " %pFX\n", range
);
15785 json_object_object_add(
15786 json_peer_group_dynamic_af
, "ranges",
15787 json_peer_group_ranges
);
15789 json_object_object_add(
15790 json_peer_group_dynamic
, afi2str(afi
),
15791 json_peer_group_dynamic_af
);
15796 if (json_peer_group_dynamic
)
15797 json_object_object_add(json_peer_group
, "dynamicRanges",
15798 json_peer_group_dynamic
);
15800 /* Display group members and their status */
15801 if (listcount(group
->peer
)) {
15803 json_peer_group_members
= json_object_new_object();
15805 vty_out(vty
, " Peer-group members:\n");
15806 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
15807 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_SHUTDOWN
)
15808 || CHECK_FLAG(peer
->bgp
->flags
, BGP_FLAG_SHUTDOWN
))
15809 peer_status
= "Idle (Admin)";
15810 else if (CHECK_FLAG(peer
->sflags
,
15811 PEER_STATUS_PREFIX_OVERFLOW
))
15812 peer_status
= "Idle (PfxCt)";
15814 peer_status
= lookup_msg(bgp_status_msg
,
15815 peer
->status
, NULL
);
15817 dynamic
= peer_dynamic_neighbor(peer
);
15820 json_object
*json_peer_group_member
=
15821 json_object_new_object();
15823 json_object_string_add(json_peer_group_member
,
15824 "status", peer_status
);
15827 json_object_boolean_true_add(
15828 json_peer_group_member
,
15831 json_object_object_add(json_peer_group_members
,
15833 json_peer_group_member
);
15835 vty_out(vty
, " %s %s %s \n", peer
->host
,
15836 dynamic
? "(dynamic)" : "",
15841 json_object_object_add(json_peer_group
, "members",
15842 json_peer_group_members
);
15846 json_object_object_add(json
, group
->name
, json_peer_group
);
15848 return CMD_SUCCESS
;
15851 static int bgp_show_peer_group_vty(struct vty
*vty
, const char *name
,
15852 const char *group_name
, bool uj
)
15855 struct listnode
*node
, *nnode
;
15856 struct peer_group
*group
;
15857 bool found
= false;
15858 json_object
*json
= NULL
;
15861 json
= json_object_new_object();
15863 bgp
= name
? bgp_lookup_by_name(name
) : bgp_get_default();
15867 vty_json(vty
, json
);
15869 vty_out(vty
, "%% BGP instance not found\n");
15871 return CMD_WARNING
;
15874 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
15876 if (strmatch(group
->name
, group_name
)) {
15877 bgp_show_one_peer_group(vty
, group
, json
);
15882 bgp_show_one_peer_group(vty
, group
, json
);
15886 if (group_name
&& !found
&& !uj
)
15887 vty_out(vty
, "%% No such peer-group\n");
15890 vty_json(vty
, json
);
15892 return CMD_SUCCESS
;
15895 DEFUN(show_ip_bgp_peer_groups
, show_ip_bgp_peer_groups_cmd
,
15896 "show [ip] bgp [<view|vrf> VIEWVRFNAME] peer-group [PGNAME] [json]",
15897 SHOW_STR IP_STR BGP_STR BGP_INSTANCE_HELP_STR
15898 "Detailed information on BGP peer groups\n"
15899 "Peer group name\n" JSON_STR
)
15903 bool uj
= use_json(argc
, argv
);
15905 vrf
= argv_find(argv
, argc
, "VIEWVRFNAME", &idx
) ? argv
[idx
]->arg
15907 pg
= argv_find(argv
, argc
, "PGNAME", &idx
) ? argv
[idx
]->arg
: NULL
;
15909 return bgp_show_peer_group_vty(vty
, vrf
, pg
, uj
);
15913 /* Redistribute VTY commands. */
15915 DEFUN (bgp_redistribute_ipv4
,
15916 bgp_redistribute_ipv4_cmd
,
15917 "redistribute " FRR_IP_REDIST_STR_BGPD
,
15918 "Redistribute information from another routing protocol\n"
15919 FRR_IP_REDIST_HELP_STR_BGPD
)
15921 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
15922 int idx_protocol
= 1;
15925 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
15927 vty_out(vty
, "%% Invalid route type\n");
15928 return CMD_WARNING_CONFIG_FAILED
;
15931 bgp_redist_add(bgp
, AFI_IP
, type
, 0);
15932 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0, false);
15936 bgp_redistribute_ipv4
, bgp_redistribute_ipv4_hidden_cmd
,
15937 "redistribute " FRR_IP_REDIST_STR_BGPD
,
15938 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
)
15940 DEFUN (bgp_redistribute_ipv4_rmap
,
15941 bgp_redistribute_ipv4_rmap_cmd
,
15942 "redistribute " FRR_IP_REDIST_STR_BGPD
" route-map RMAP_NAME",
15943 "Redistribute information from another routing protocol\n"
15944 FRR_IP_REDIST_HELP_STR_BGPD
15945 "Route map reference\n"
15946 "Pointer to route-map entries\n")
15948 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
15949 int idx_protocol
= 1;
15952 struct bgp_redist
*red
;
15954 struct route_map
*route_map
= route_map_lookup_warn_noexist(
15955 vty
, argv
[idx_word
]->arg
);
15957 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
15959 vty_out(vty
, "%% Invalid route type\n");
15960 return CMD_WARNING_CONFIG_FAILED
;
15963 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
15965 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
15966 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0, changed
);
15970 bgp_redistribute_ipv4_rmap
, bgp_redistribute_ipv4_rmap_hidden_cmd
,
15971 "redistribute " FRR_IP_REDIST_STR_BGPD
" route-map RMAP_NAME",
15972 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
15973 "Route map reference\n"
15974 "Pointer to route-map entries\n")
15976 DEFUN (bgp_redistribute_ipv4_metric
,
15977 bgp_redistribute_ipv4_metric_cmd
,
15978 "redistribute " FRR_IP_REDIST_STR_BGPD
" metric (0-4294967295)",
15979 "Redistribute information from another routing protocol\n"
15980 FRR_IP_REDIST_HELP_STR_BGPD
15981 "Metric for redistributed routes\n"
15982 "Default metric\n")
15984 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
15985 int idx_protocol
= 1;
15986 int idx_number
= 3;
15989 struct bgp_redist
*red
;
15992 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
15994 vty_out(vty
, "%% Invalid route type\n");
15995 return CMD_WARNING_CONFIG_FAILED
;
15997 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
15999 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
16000 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, type
, metric
);
16001 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0, changed
);
16005 bgp_redistribute_ipv4_metric
, bgp_redistribute_ipv4_metric_hidden_cmd
,
16006 "redistribute " FRR_IP_REDIST_STR_BGPD
" metric (0-4294967295)",
16007 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
16008 "Metric for redistributed routes\n"
16009 "Default metric\n")
16011 DEFUN (bgp_redistribute_ipv4_rmap_metric
,
16012 bgp_redistribute_ipv4_rmap_metric_cmd
,
16013 "redistribute " FRR_IP_REDIST_STR_BGPD
" route-map RMAP_NAME metric (0-4294967295)",
16014 "Redistribute information from another routing protocol\n"
16015 FRR_IP_REDIST_HELP_STR_BGPD
16016 "Route map reference\n"
16017 "Pointer to route-map entries\n"
16018 "Metric for redistributed routes\n"
16019 "Default metric\n")
16021 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
16022 int idx_protocol
= 1;
16024 int idx_number
= 5;
16027 struct bgp_redist
*red
;
16029 struct route_map
*route_map
=
16030 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
16032 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
16034 vty_out(vty
, "%% Invalid route type\n");
16035 return CMD_WARNING_CONFIG_FAILED
;
16037 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
16039 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
16041 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
16042 changed
|= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, type
, metric
);
16043 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0, changed
);
16047 bgp_redistribute_ipv4_rmap_metric
,
16048 bgp_redistribute_ipv4_rmap_metric_hidden_cmd
,
16049 "redistribute " FRR_IP_REDIST_STR_BGPD
16050 " route-map RMAP_NAME metric (0-4294967295)",
16051 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
16052 "Route map reference\n"
16053 "Pointer to route-map entries\n"
16054 "Metric for redistributed routes\n"
16055 "Default metric\n")
16057 DEFUN (bgp_redistribute_ipv4_metric_rmap
,
16058 bgp_redistribute_ipv4_metric_rmap_cmd
,
16059 "redistribute " FRR_IP_REDIST_STR_BGPD
" metric (0-4294967295) route-map RMAP_NAME",
16060 "Redistribute information from another routing protocol\n"
16061 FRR_IP_REDIST_HELP_STR_BGPD
16062 "Metric for redistributed routes\n"
16064 "Route map reference\n"
16065 "Pointer to route-map entries\n")
16067 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
16068 int idx_protocol
= 1;
16069 int idx_number
= 3;
16073 struct bgp_redist
*red
;
16075 struct route_map
*route_map
=
16076 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
16078 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
16080 vty_out(vty
, "%% Invalid route type\n");
16081 return CMD_WARNING_CONFIG_FAILED
;
16083 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
16085 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
16086 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, type
, metric
);
16088 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
16089 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0, changed
);
16093 bgp_redistribute_ipv4_metric_rmap
,
16094 bgp_redistribute_ipv4_metric_rmap_hidden_cmd
,
16095 "redistribute " FRR_IP_REDIST_STR_BGPD
16096 " metric (0-4294967295) route-map RMAP_NAME",
16097 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
16098 "Metric for redistributed routes\n"
16100 "Route map reference\n"
16101 "Pointer to route-map entries\n")
16103 DEFUN (bgp_redistribute_ipv4_ospf
,
16104 bgp_redistribute_ipv4_ospf_cmd
,
16105 "redistribute <ospf|table> (1-65535)",
16106 "Redistribute information from another routing protocol\n"
16107 "Open Shortest Path First (OSPFv2)\n"
16108 "Non-main Kernel Routing Table\n"
16109 "Instance ID/Table ID\n")
16111 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
16112 int idx_ospf_table
= 1;
16113 int idx_number
= 2;
16114 unsigned short instance
;
16115 unsigned short protocol
;
16117 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
16119 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
16120 protocol
= ZEBRA_ROUTE_OSPF
;
16122 protocol
= ZEBRA_ROUTE_TABLE
;
16124 bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
16125 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
, false);
16128 ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf
, bgp_redistribute_ipv4_ospf_hidden_cmd
,
16129 "redistribute <ospf|table> (1-65535)",
16130 "Redistribute information from another routing protocol\n"
16131 "Open Shortest Path First (OSPFv2)\n"
16132 "Non-main Kernel Routing Table\n"
16133 "Instance ID/Table ID\n")
16135 DEFUN (bgp_redistribute_ipv4_ospf_rmap
,
16136 bgp_redistribute_ipv4_ospf_rmap_cmd
,
16137 "redistribute <ospf|table> (1-65535) route-map RMAP_NAME",
16138 "Redistribute information from another routing protocol\n"
16139 "Open Shortest Path First (OSPFv2)\n"
16140 "Non-main Kernel Routing Table\n"
16141 "Instance ID/Table ID\n"
16142 "Route map reference\n"
16143 "Pointer to route-map entries\n")
16145 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
16146 int idx_ospf_table
= 1;
16147 int idx_number
= 2;
16149 struct bgp_redist
*red
;
16150 unsigned short instance
;
16153 struct route_map
*route_map
=
16154 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
16156 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
16157 protocol
= ZEBRA_ROUTE_OSPF
;
16159 protocol
= ZEBRA_ROUTE_TABLE
;
16161 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
16162 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
16164 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
16165 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
, changed
);
16168 ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf_rmap
,
16169 bgp_redistribute_ipv4_ospf_rmap_hidden_cmd
,
16170 "redistribute <ospf|table> (1-65535) route-map RMAP_NAME",
16171 "Redistribute information from another routing protocol\n"
16172 "Open Shortest Path First (OSPFv2)\n"
16173 "Non-main Kernel Routing Table\n"
16174 "Instance ID/Table ID\n"
16175 "Route map reference\n"
16176 "Pointer to route-map entries\n")
16178 DEFUN (bgp_redistribute_ipv4_ospf_metric
,
16179 bgp_redistribute_ipv4_ospf_metric_cmd
,
16180 "redistribute <ospf|table> (1-65535) metric (0-4294967295)",
16181 "Redistribute information from another routing protocol\n"
16182 "Open Shortest Path First (OSPFv2)\n"
16183 "Non-main Kernel Routing Table\n"
16184 "Instance ID/Table ID\n"
16185 "Metric for redistributed routes\n"
16186 "Default metric\n")
16188 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
16189 int idx_ospf_table
= 1;
16190 int idx_number
= 2;
16191 int idx_number_2
= 4;
16193 struct bgp_redist
*red
;
16194 unsigned short instance
;
16198 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
16199 protocol
= ZEBRA_ROUTE_OSPF
;
16201 protocol
= ZEBRA_ROUTE_TABLE
;
16203 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
16204 metric
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
16206 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
16207 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, protocol
,
16209 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
, changed
);
16212 ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf_metric
,
16213 bgp_redistribute_ipv4_ospf_metric_hidden_cmd
,
16214 "redistribute <ospf|table> (1-65535) metric (0-4294967295)",
16215 "Redistribute information from another routing protocol\n"
16216 "Open Shortest Path First (OSPFv2)\n"
16217 "Non-main Kernel Routing Table\n"
16218 "Instance ID/Table ID\n"
16219 "Metric for redistributed routes\n"
16220 "Default metric\n")
16222 DEFUN (bgp_redistribute_ipv4_ospf_rmap_metric
,
16223 bgp_redistribute_ipv4_ospf_rmap_metric_cmd
,
16224 "redistribute <ospf|table> (1-65535) route-map RMAP_NAME metric (0-4294967295)",
16225 "Redistribute information from another routing protocol\n"
16226 "Open Shortest Path First (OSPFv2)\n"
16227 "Non-main Kernel Routing Table\n"
16228 "Instance ID/Table ID\n"
16229 "Route map reference\n"
16230 "Pointer to route-map entries\n"
16231 "Metric for redistributed routes\n"
16232 "Default metric\n")
16234 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
16235 int idx_ospf_table
= 1;
16236 int idx_number
= 2;
16238 int idx_number_2
= 6;
16240 struct bgp_redist
*red
;
16241 unsigned short instance
;
16244 struct route_map
*route_map
=
16245 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
16247 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
16248 protocol
= ZEBRA_ROUTE_OSPF
;
16250 protocol
= ZEBRA_ROUTE_TABLE
;
16252 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
16253 metric
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
16255 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
16257 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
16258 changed
|= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, protocol
,
16260 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
, changed
);
16264 bgp_redistribute_ipv4_ospf_rmap_metric
,
16265 bgp_redistribute_ipv4_ospf_rmap_metric_hidden_cmd
,
16266 "redistribute <ospf|table> (1-65535) route-map RMAP_NAME metric (0-4294967295)",
16267 "Redistribute information from another routing protocol\n"
16268 "Open Shortest Path First (OSPFv2)\n"
16269 "Non-main Kernel Routing Table\n"
16270 "Instance ID/Table ID\n"
16271 "Route map reference\n"
16272 "Pointer to route-map entries\n"
16273 "Metric for redistributed routes\n"
16274 "Default metric\n")
16276 DEFUN (bgp_redistribute_ipv4_ospf_metric_rmap
,
16277 bgp_redistribute_ipv4_ospf_metric_rmap_cmd
,
16278 "redistribute <ospf|table> (1-65535) metric (0-4294967295) route-map RMAP_NAME",
16279 "Redistribute information from another routing protocol\n"
16280 "Open Shortest Path First (OSPFv2)\n"
16281 "Non-main Kernel Routing Table\n"
16282 "Instance ID/Table ID\n"
16283 "Metric for redistributed routes\n"
16285 "Route map reference\n"
16286 "Pointer to route-map entries\n")
16288 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
16289 int idx_ospf_table
= 1;
16290 int idx_number
= 2;
16291 int idx_number_2
= 4;
16294 struct bgp_redist
*red
;
16295 unsigned short instance
;
16298 struct route_map
*route_map
=
16299 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
16301 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
16302 protocol
= ZEBRA_ROUTE_OSPF
;
16304 protocol
= ZEBRA_ROUTE_TABLE
;
16306 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
16307 metric
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
16309 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
16310 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, protocol
,
16313 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
16314 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
, changed
);
16318 bgp_redistribute_ipv4_ospf_metric_rmap
,
16319 bgp_redistribute_ipv4_ospf_metric_rmap_hidden_cmd
,
16320 "redistribute <ospf|table> (1-65535) metric (0-4294967295) route-map RMAP_NAME",
16321 "Redistribute information from another routing protocol\n"
16322 "Open Shortest Path First (OSPFv2)\n"
16323 "Non-main Kernel Routing Table\n"
16324 "Instance ID/Table ID\n"
16325 "Metric for redistributed routes\n"
16327 "Route map reference\n"
16328 "Pointer to route-map entries\n")
16330 DEFUN (no_bgp_redistribute_ipv4_ospf
,
16331 no_bgp_redistribute_ipv4_ospf_cmd
,
16332 "no redistribute <ospf|table> (1-65535) [{metric (0-4294967295)|route-map RMAP_NAME}]",
16334 "Redistribute information from another routing protocol\n"
16335 "Open Shortest Path First (OSPFv2)\n"
16336 "Non-main Kernel Routing Table\n"
16337 "Instance ID/Table ID\n"
16338 "Metric for redistributed routes\n"
16340 "Route map reference\n"
16341 "Pointer to route-map entries\n")
16343 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
16344 int idx_ospf_table
= 2;
16345 int idx_number
= 3;
16346 unsigned short instance
;
16349 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
16350 protocol
= ZEBRA_ROUTE_OSPF
;
16352 protocol
= ZEBRA_ROUTE_TABLE
;
16354 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
16355 return bgp_redistribute_unset(bgp
, AFI_IP
, protocol
, instance
);
16359 no_bgp_redistribute_ipv4_ospf
, no_bgp_redistribute_ipv4_ospf_hidden_cmd
,
16360 "no redistribute <ospf|table> (1-65535) [{metric (0-4294967295)|route-map RMAP_NAME}]",
16362 "Redistribute information from another routing protocol\n"
16363 "Open Shortest Path First (OSPFv2)\n"
16364 "Non-main Kernel Routing Table\n"
16365 "Instance ID/Table ID\n"
16366 "Metric for redistributed routes\n"
16368 "Route map reference\n"
16369 "Pointer to route-map entries\n")
16371 DEFUN (no_bgp_redistribute_ipv4
,
16372 no_bgp_redistribute_ipv4_cmd
,
16373 "no redistribute " FRR_IP_REDIST_STR_BGPD
" [{metric (0-4294967295)|route-map RMAP_NAME}]",
16375 "Redistribute information from another routing protocol\n"
16376 FRR_IP_REDIST_HELP_STR_BGPD
16377 "Metric for redistributed routes\n"
16379 "Route map reference\n"
16380 "Pointer to route-map entries\n")
16382 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
16383 int idx_protocol
= 2;
16386 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
16388 vty_out(vty
, "%% Invalid route type\n");
16389 return CMD_WARNING_CONFIG_FAILED
;
16391 return bgp_redistribute_unset(bgp
, AFI_IP
, type
, 0);
16395 no_bgp_redistribute_ipv4
, no_bgp_redistribute_ipv4_hidden_cmd
,
16396 "no redistribute " FRR_IP_REDIST_STR_BGPD
16397 " [{metric (0-4294967295)|route-map RMAP_NAME}]",
16399 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
16400 "Metric for redistributed routes\n"
16402 "Route map reference\n"
16403 "Pointer to route-map entries\n")
16405 DEFUN (bgp_redistribute_ipv6
,
16406 bgp_redistribute_ipv6_cmd
,
16407 "redistribute " FRR_IP6_REDIST_STR_BGPD
,
16408 "Redistribute information from another routing protocol\n"
16409 FRR_IP6_REDIST_HELP_STR_BGPD
)
16411 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
16412 int idx_protocol
= 1;
16415 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
16417 vty_out(vty
, "%% Invalid route type\n");
16418 return CMD_WARNING_CONFIG_FAILED
;
16421 bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
16422 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0, false);
16425 DEFUN (bgp_redistribute_ipv6_rmap
,
16426 bgp_redistribute_ipv6_rmap_cmd
,
16427 "redistribute " FRR_IP6_REDIST_STR_BGPD
" route-map RMAP_NAME",
16428 "Redistribute information from another routing protocol\n"
16429 FRR_IP6_REDIST_HELP_STR_BGPD
16430 "Route map reference\n"
16431 "Pointer to route-map entries\n")
16433 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
16434 int idx_protocol
= 1;
16437 struct bgp_redist
*red
;
16439 struct route_map
*route_map
=
16440 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
16442 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
16444 vty_out(vty
, "%% Invalid route type\n");
16445 return CMD_WARNING_CONFIG_FAILED
;
16448 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
16450 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
16451 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0, changed
);
16454 DEFUN (bgp_redistribute_ipv6_metric
,
16455 bgp_redistribute_ipv6_metric_cmd
,
16456 "redistribute " FRR_IP6_REDIST_STR_BGPD
" metric (0-4294967295)",
16457 "Redistribute information from another routing protocol\n"
16458 FRR_IP6_REDIST_HELP_STR_BGPD
16459 "Metric for redistributed routes\n"
16460 "Default metric\n")
16462 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
16463 int idx_protocol
= 1;
16464 int idx_number
= 3;
16467 struct bgp_redist
*red
;
16470 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
16472 vty_out(vty
, "%% Invalid route type\n");
16473 return CMD_WARNING_CONFIG_FAILED
;
16475 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
16477 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
16478 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP6
, type
, metric
);
16479 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0, changed
);
16482 DEFUN (bgp_redistribute_ipv6_rmap_metric
,
16483 bgp_redistribute_ipv6_rmap_metric_cmd
,
16484 "redistribute " FRR_IP6_REDIST_STR_BGPD
" route-map RMAP_NAME metric (0-4294967295)",
16485 "Redistribute information from another routing protocol\n"
16486 FRR_IP6_REDIST_HELP_STR_BGPD
16487 "Route map reference\n"
16488 "Pointer to route-map entries\n"
16489 "Metric for redistributed routes\n"
16490 "Default metric\n")
16492 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
16493 int idx_protocol
= 1;
16495 int idx_number
= 5;
16498 struct bgp_redist
*red
;
16500 struct route_map
*route_map
=
16501 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
16503 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
16505 vty_out(vty
, "%% Invalid route type\n");
16506 return CMD_WARNING_CONFIG_FAILED
;
16508 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
16510 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
16512 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
16513 changed
|= bgp_redistribute_metric_set(bgp
, red
, AFI_IP6
, type
,
16515 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0, changed
);
16518 DEFUN (bgp_redistribute_ipv6_metric_rmap
,
16519 bgp_redistribute_ipv6_metric_rmap_cmd
,
16520 "redistribute " FRR_IP6_REDIST_STR_BGPD
" metric (0-4294967295) route-map RMAP_NAME",
16521 "Redistribute information from another routing protocol\n"
16522 FRR_IP6_REDIST_HELP_STR_BGPD
16523 "Metric for redistributed routes\n"
16525 "Route map reference\n"
16526 "Pointer to route-map entries\n")
16528 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
16529 int idx_protocol
= 1;
16530 int idx_number
= 3;
16534 struct bgp_redist
*red
;
16536 struct route_map
*route_map
=
16537 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
16539 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
16541 vty_out(vty
, "%% Invalid route type\n");
16542 return CMD_WARNING_CONFIG_FAILED
;
16544 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
16546 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
16547 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP6
, SAFI_UNICAST
,
16550 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
16551 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0, changed
);
16554 DEFUN (no_bgp_redistribute_ipv6
,
16555 no_bgp_redistribute_ipv6_cmd
,
16556 "no redistribute " FRR_IP6_REDIST_STR_BGPD
" [{metric (0-4294967295)|route-map RMAP_NAME}]",
16558 "Redistribute information from another routing protocol\n"
16559 FRR_IP6_REDIST_HELP_STR_BGPD
16560 "Metric for redistributed routes\n"
16562 "Route map reference\n"
16563 "Pointer to route-map entries\n")
16565 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
16566 int idx_protocol
= 2;
16569 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
16571 vty_out(vty
, "%% Invalid route type\n");
16572 return CMD_WARNING_CONFIG_FAILED
;
16575 return bgp_redistribute_unset(bgp
, AFI_IP6
, type
, 0);
16578 /* Neighbor update tcp-mss. */
16579 static int peer_tcp_mss_vty(struct vty
*vty
, const char *peer_str
,
16580 const char *tcp_mss_str
)
16583 uint32_t tcp_mss_val
= 0;
16585 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
16587 return CMD_WARNING_CONFIG_FAILED
;
16590 tcp_mss_val
= strtoul(tcp_mss_str
, NULL
, 10);
16591 peer_tcp_mss_set(peer
, tcp_mss_val
);
16593 peer_tcp_mss_unset(peer
);
16596 return CMD_SUCCESS
;
16599 DEFUN(neighbor_tcp_mss
, neighbor_tcp_mss_cmd
,
16600 "neighbor <A.B.C.D|X:X::X:X|WORD> tcp-mss (1-65535)",
16601 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
16602 "TCP max segment size\n"
16605 int peer_index
= 1;
16609 " Warning: Reset BGP session for tcp-mss value to take effect\n");
16610 return peer_tcp_mss_vty(vty
, argv
[peer_index
]->arg
,
16611 argv
[mss_index
]->arg
);
16614 DEFUN(no_neighbor_tcp_mss
, no_neighbor_tcp_mss_cmd
,
16615 "no neighbor <A.B.C.D|X:X::X:X|WORD> tcp-mss [(1-65535)]",
16616 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
16617 "TCP max segment size\n"
16620 int peer_index
= 2;
16623 " Warning: Reset BGP session for tcp-mss value to take effect\n");
16624 return peer_tcp_mss_vty(vty
, argv
[peer_index
]->arg
, NULL
);
16627 DEFPY(bgp_retain_route_target
, bgp_retain_route_target_cmd
,
16628 "[no$no] bgp retain route-target all",
16630 "Retain BGP updates\n"
16631 "Retain BGP updates based on route-target values\n"
16632 "Retain all BGP updates\n")
16635 struct bgp
*bgp
= VTY_GET_CONTEXT(bgp
);
16637 check
= CHECK_FLAG(bgp
->af_flags
[bgp_node_afi(vty
)][bgp_node_safi(vty
)],
16638 BGP_VPNVX_RETAIN_ROUTE_TARGET_ALL
);
16639 if (check
!= !no
) {
16641 SET_FLAG(bgp
->af_flags
[bgp_node_afi(vty
)]
16642 [bgp_node_safi(vty
)],
16643 BGP_VPNVX_RETAIN_ROUTE_TARGET_ALL
);
16645 UNSET_FLAG(bgp
->af_flags
[bgp_node_afi(vty
)]
16646 [bgp_node_safi(vty
)],
16647 BGP_VPNVX_RETAIN_ROUTE_TARGET_ALL
);
16648 /* trigger a flush to re-sync with ADJ-RIB-in */
16649 bgp_clear(vty
, bgp
, bgp_node_afi(vty
), bgp_node_safi(vty
),
16650 clear_all
, BGP_CLEAR_SOFT_IN
, NULL
);
16652 return CMD_SUCCESS
;
16655 static void bgp_config_write_redistribute(struct vty
*vty
, struct bgp
*bgp
,
16656 afi_t afi
, safi_t safi
)
16660 /* Unicast redistribution only. */
16661 if (safi
!= SAFI_UNICAST
)
16664 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++) {
16665 /* Redistribute BGP does not make sense. */
16666 if (i
!= ZEBRA_ROUTE_BGP
) {
16667 struct list
*red_list
;
16668 struct listnode
*node
;
16669 struct bgp_redist
*red
;
16671 red_list
= bgp
->redist
[afi
][i
];
16675 for (ALL_LIST_ELEMENTS_RO(red_list
, node
, red
)) {
16676 /* "redistribute" configuration. */
16677 vty_out(vty
, " redistribute %s",
16678 zebra_route_string(i
));
16680 vty_out(vty
, " %d", red
->instance
);
16681 if (red
->redist_metric_flag
)
16682 vty_out(vty
, " metric %u",
16683 red
->redist_metric
);
16684 if (red
->rmap
.name
)
16685 vty_out(vty
, " route-map %s",
16687 vty_out(vty
, "\n");
16693 /* peer-group helpers for config-write */
16695 static bool peergroup_flag_check(struct peer
*peer
, uint64_t flag
)
16697 if (!peer_group_active(peer
)) {
16698 if (CHECK_FLAG(peer
->flags_invert
, flag
))
16699 return !CHECK_FLAG(peer
->flags
, flag
);
16701 return !!CHECK_FLAG(peer
->flags
, flag
);
16704 return !!CHECK_FLAG(peer
->flags_override
, flag
);
16707 static bool peergroup_af_flag_check(struct peer
*peer
, afi_t afi
, safi_t safi
,
16710 if (!peer_group_active(peer
)) {
16711 if (CHECK_FLAG(peer
->af_flags_invert
[afi
][safi
], flag
))
16712 return !peer_af_flag_check(peer
, afi
, safi
, flag
);
16714 return !!peer_af_flag_check(peer
, afi
, safi
, flag
);
16717 return !!CHECK_FLAG(peer
->af_flags_override
[afi
][safi
], flag
);
16720 static bool peergroup_filter_check(struct peer
*peer
, afi_t afi
, safi_t safi
,
16721 uint8_t type
, int direct
)
16723 struct bgp_filter
*filter
;
16725 if (peer_group_active(peer
))
16726 return !!CHECK_FLAG(peer
->filter_override
[afi
][safi
][direct
],
16729 filter
= &peer
->filter
[afi
][safi
];
16731 case PEER_FT_DISTRIBUTE_LIST
:
16732 return !!(filter
->dlist
[direct
].name
);
16733 case PEER_FT_FILTER_LIST
:
16734 return !!(filter
->aslist
[direct
].name
);
16735 case PEER_FT_PREFIX_LIST
:
16736 return !!(filter
->plist
[direct
].name
);
16737 case PEER_FT_ROUTE_MAP
:
16738 return !!(filter
->map
[direct
].name
);
16739 case PEER_FT_UNSUPPRESS_MAP
:
16740 return !!(filter
->usmap
.name
);
16741 case PEER_FT_ADVERTISE_MAP
:
16742 return !!(filter
->advmap
.aname
16743 && ((filter
->advmap
.condition
== direct
)
16744 && filter
->advmap
.cname
));
16750 /* Return true if the addpath type is set for peer and different from
16753 static bool peergroup_af_addpath_check(struct peer
*peer
, afi_t afi
,
16756 enum bgp_addpath_strat type
, g_type
;
16758 type
= peer
->addpath_type
[afi
][safi
];
16760 if (type
!= BGP_ADDPATH_NONE
) {
16761 if (peer_group_active(peer
)) {
16762 g_type
= peer
->group
->conf
->addpath_type
[afi
][safi
];
16764 if (type
!= g_type
)
16776 /* This is part of the address-family block (unicast only) */
16777 static void bgp_vpn_policy_config_write_afi(struct vty
*vty
, struct bgp
*bgp
,
16781 uint32_t tovpn_sid_index
= 0;
16783 if (bgp
->vpn_policy
[afi
].rmap_name
[BGP_VPN_POLICY_DIR_FROMVPN
]) {
16784 if (CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
16785 BGP_CONFIG_VRF_TO_VRF_IMPORT
))
16786 vty_out(vty
, "%*simport vrf route-map %s\n", indent
, "",
16787 bgp
->vpn_policy
[afi
]
16788 .rmap_name
[BGP_VPN_POLICY_DIR_FROMVPN
]);
16790 vty_out(vty
, "%*sroute-map vpn import %s\n", indent
, "",
16791 bgp
->vpn_policy
[afi
]
16792 .rmap_name
[BGP_VPN_POLICY_DIR_FROMVPN
]);
16794 if (CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
16795 BGP_CONFIG_VRF_TO_VRF_IMPORT
)
16796 || CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
16797 BGP_CONFIG_VRF_TO_VRF_EXPORT
))
16800 if (CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
16801 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
)) {
16803 vty_out(vty
, "%*slabel vpn export %s\n", indent
, "", "auto");
16806 if (bgp
->vpn_policy
[afi
].tovpn_label
!= MPLS_LABEL_NONE
) {
16807 vty_out(vty
, "%*slabel vpn export %u\n", indent
, "",
16808 bgp
->vpn_policy
[afi
].tovpn_label
);
16812 tovpn_sid_index
= bgp
->vpn_policy
[afi
].tovpn_sid_index
;
16813 if (CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
16814 BGP_VPN_POLICY_TOVPN_SID_AUTO
)) {
16815 vty_out(vty
, "%*ssid vpn export %s\n", indent
, "", "auto");
16816 } else if (tovpn_sid_index
!= 0) {
16817 vty_out(vty
, "%*ssid vpn export %d\n", indent
, "",
16821 if (CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
, BGP_VPN_POLICY_TOVPN_RD_SET
))
16822 vty_out(vty
, "%*srd vpn export %pRD\n", indent
, "",
16823 &bgp
->vpn_policy
[afi
].tovpn_rd
);
16825 if (CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
16826 BGP_VPN_POLICY_TOVPN_NEXTHOP_SET
)) {
16828 char buf
[PREFIX_STRLEN
];
16829 if (inet_ntop(bgp
->vpn_policy
[afi
].tovpn_nexthop
.family
,
16830 &bgp
->vpn_policy
[afi
].tovpn_nexthop
.u
.prefix
, buf
,
16833 vty_out(vty
, "%*snexthop vpn export %s\n",
16837 if (bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
]
16838 && bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
]
16840 bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
],
16841 bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
])) {
16843 char *b
= ecommunity_ecom2str(
16844 bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
],
16845 ECOMMUNITY_FORMAT_ROUTE_MAP
, ECOMMUNITY_ROUTE_TARGET
);
16846 vty_out(vty
, "%*srt vpn both %s\n", indent
, "", b
);
16847 XFREE(MTYPE_ECOMMUNITY_STR
, b
);
16849 if (bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
]) {
16850 char *b
= ecommunity_ecom2str(
16851 bgp
->vpn_policy
[afi
]
16852 .rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
],
16853 ECOMMUNITY_FORMAT_ROUTE_MAP
,
16854 ECOMMUNITY_ROUTE_TARGET
);
16855 vty_out(vty
, "%*srt vpn import %s\n", indent
, "", b
);
16856 XFREE(MTYPE_ECOMMUNITY_STR
, b
);
16858 if (bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
]) {
16859 char *b
= ecommunity_ecom2str(
16860 bgp
->vpn_policy
[afi
]
16861 .rtlist
[BGP_VPN_POLICY_DIR_TOVPN
],
16862 ECOMMUNITY_FORMAT_ROUTE_MAP
,
16863 ECOMMUNITY_ROUTE_TARGET
);
16864 vty_out(vty
, "%*srt vpn export %s\n", indent
, "", b
);
16865 XFREE(MTYPE_ECOMMUNITY_STR
, b
);
16869 if (bgp
->vpn_policy
[afi
].rmap_name
[BGP_VPN_POLICY_DIR_TOVPN
])
16870 vty_out(vty
, "%*sroute-map vpn export %s\n", indent
, "",
16871 bgp
->vpn_policy
[afi
]
16872 .rmap_name
[BGP_VPN_POLICY_DIR_TOVPN
]);
16874 if (bgp
->vpn_policy
[afi
].import_redirect_rtlist
) {
16875 char *b
= ecommunity_ecom2str(
16876 bgp
->vpn_policy
[afi
]
16877 .import_redirect_rtlist
,
16878 ECOMMUNITY_FORMAT_ROUTE_MAP
,
16879 ECOMMUNITY_ROUTE_TARGET
);
16881 if (bgp
->vpn_policy
[afi
].import_redirect_rtlist
->unit_size
16882 != ECOMMUNITY_SIZE
)
16883 vty_out(vty
, "%*srt6 redirect import %s\n",
16886 vty_out(vty
, "%*srt redirect import %s\n",
16888 XFREE(MTYPE_ECOMMUNITY_STR
, b
);
16892 static void bgp_config_write_filter(struct vty
*vty
, struct peer
*peer
,
16893 afi_t afi
, safi_t safi
)
16895 struct bgp_filter
*filter
;
16899 filter
= &peer
->filter
[afi
][safi
];
16901 /* distribute-list. */
16902 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_DISTRIBUTE_LIST
,
16904 vty_out(vty
, " neighbor %s distribute-list %s in\n", addr
,
16905 filter
->dlist
[FILTER_IN
].name
);
16907 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_DISTRIBUTE_LIST
,
16909 vty_out(vty
, " neighbor %s distribute-list %s out\n", addr
,
16910 filter
->dlist
[FILTER_OUT
].name
);
16913 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_PREFIX_LIST
,
16915 vty_out(vty
, " neighbor %s prefix-list %s in\n", addr
,
16916 filter
->plist
[FILTER_IN
].name
);
16918 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_PREFIX_LIST
,
16920 vty_out(vty
, " neighbor %s prefix-list %s out\n", addr
,
16921 filter
->plist
[FILTER_OUT
].name
);
16924 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_ROUTE_MAP
, RMAP_IN
))
16925 vty_out(vty
, " neighbor %s route-map %s in\n", addr
,
16926 filter
->map
[RMAP_IN
].name
);
16928 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_ROUTE_MAP
,
16930 vty_out(vty
, " neighbor %s route-map %s out\n", addr
,
16931 filter
->map
[RMAP_OUT
].name
);
16933 /* unsuppress-map */
16934 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_UNSUPPRESS_MAP
, 0))
16935 vty_out(vty
, " neighbor %s unsuppress-map %s\n", addr
,
16936 filter
->usmap
.name
);
16938 /* advertise-map : always applied in OUT direction*/
16939 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_ADVERTISE_MAP
,
16940 CONDITION_NON_EXIST
))
16942 " neighbor %s advertise-map %s non-exist-map %s\n",
16943 addr
, filter
->advmap
.aname
, filter
->advmap
.cname
);
16945 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_ADVERTISE_MAP
,
16947 vty_out(vty
, " neighbor %s advertise-map %s exist-map %s\n",
16948 addr
, filter
->advmap
.aname
, filter
->advmap
.cname
);
16951 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_FILTER_LIST
,
16953 vty_out(vty
, " neighbor %s filter-list %s in\n", addr
,
16954 filter
->aslist
[FILTER_IN
].name
);
16956 if (peergroup_filter_check(peer
, afi
, safi
, PEER_FT_FILTER_LIST
,
16958 vty_out(vty
, " neighbor %s filter-list %s out\n", addr
,
16959 filter
->aslist
[FILTER_OUT
].name
);
16962 /* BGP peer configuration display function. */
16963 static void bgp_config_write_peer_global(struct vty
*vty
, struct bgp
*bgp
,
16966 struct peer
*g_peer
= NULL
;
16968 int if_pg_printed
= false;
16969 int if_ras_printed
= false;
16971 /* Skip dynamic neighbors. */
16972 if (peer_dynamic_neighbor(peer
))
16976 addr
= peer
->conf_if
;
16980 /************************************
16981 ****** Global to the neighbor ******
16982 ************************************/
16983 if (peer
->conf_if
) {
16984 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
))
16985 vty_out(vty
, " neighbor %s interface v6only", addr
);
16987 vty_out(vty
, " neighbor %s interface", addr
);
16989 if (peer_group_active(peer
)) {
16990 vty_out(vty
, " peer-group %s", peer
->group
->name
);
16991 if_pg_printed
= true;
16992 } else if (peer
->as_type
== AS_SPECIFIED
) {
16993 vty_out(vty
, " remote-as %u", peer
->as
);
16994 if_ras_printed
= true;
16995 } else if (peer
->as_type
== AS_INTERNAL
) {
16996 vty_out(vty
, " remote-as internal");
16997 if_ras_printed
= true;
16998 } else if (peer
->as_type
== AS_EXTERNAL
) {
16999 vty_out(vty
, " remote-as external");
17000 if_ras_printed
= true;
17003 vty_out(vty
, "\n");
17006 /* remote-as and peer-group */
17007 /* peer is a member of a peer-group */
17008 if (peer_group_active(peer
)) {
17009 g_peer
= peer
->group
->conf
;
17011 if (g_peer
->as_type
== AS_UNSPECIFIED
&& !if_ras_printed
) {
17012 if (peer
->as_type
== AS_SPECIFIED
) {
17013 vty_out(vty
, " neighbor %s remote-as %u\n",
17015 } else if (peer
->as_type
== AS_INTERNAL
) {
17017 " neighbor %s remote-as internal\n",
17019 } else if (peer
->as_type
== AS_EXTERNAL
) {
17021 " neighbor %s remote-as external\n",
17026 /* For swpX peers we displayed the peer-group
17027 * via 'neighbor swpX interface peer-group PGNAME' */
17028 if (!if_pg_printed
)
17029 vty_out(vty
, " neighbor %s peer-group %s\n", addr
,
17030 peer
->group
->name
);
17033 /* peer is NOT a member of a peer-group */
17035 /* peer is a peer-group, declare the peer-group */
17036 if (CHECK_FLAG(peer
->sflags
, PEER_STATUS_GROUP
)) {
17037 vty_out(vty
, " neighbor %s peer-group\n", addr
);
17040 if (!if_ras_printed
) {
17041 if (peer
->as_type
== AS_SPECIFIED
) {
17042 vty_out(vty
, " neighbor %s remote-as %u\n",
17044 } else if (peer
->as_type
== AS_INTERNAL
) {
17046 " neighbor %s remote-as internal\n",
17048 } else if (peer
->as_type
== AS_EXTERNAL
) {
17050 " neighbor %s remote-as external\n",
17057 if (peergroup_flag_check(peer
, PEER_FLAG_LOCAL_AS
)) {
17058 vty_out(vty
, " neighbor %s local-as %u", addr
,
17059 peer
->change_local_as
);
17060 if (peergroup_flag_check(peer
, PEER_FLAG_LOCAL_AS_NO_PREPEND
))
17061 vty_out(vty
, " no-prepend");
17062 if (peergroup_flag_check(peer
, PEER_FLAG_LOCAL_AS_REPLACE_AS
))
17063 vty_out(vty
, " replace-as");
17064 vty_out(vty
, "\n");
17069 vty_out(vty
, " neighbor %s description %s\n", addr
, peer
->desc
);
17073 if (peergroup_flag_check(peer
, PEER_FLAG_SHUTDOWN
)) {
17074 if (peer
->tx_shutdown_message
)
17075 vty_out(vty
, " neighbor %s shutdown message %s\n", addr
,
17076 peer
->tx_shutdown_message
);
17078 vty_out(vty
, " neighbor %s shutdown\n", addr
);
17081 if (peergroup_flag_check(peer
, PEER_FLAG_RTT_SHUTDOWN
))
17082 vty_out(vty
, " neighbor %s shutdown rtt %u count %u\n", addr
,
17083 peer
->rtt_expected
, peer
->rtt_keepalive_conf
);
17086 if (peer
->bfd_config
)
17087 bgp_bfd_peer_config_write(vty
, peer
, addr
);
17090 if (peergroup_flag_check(peer
, PEER_FLAG_PASSWORD
))
17091 vty_out(vty
, " neighbor %s password %s\n", addr
,
17094 /* neighbor solo */
17095 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_LONESOUL
)) {
17096 if (!peer_group_active(peer
)) {
17097 vty_out(vty
, " neighbor %s solo\n", addr
);
17102 if (peer
->port
!= BGP_PORT_DEFAULT
) {
17103 vty_out(vty
, " neighbor %s port %d\n", addr
, peer
->port
);
17106 /* Local interface name */
17107 if (peer
->ifname
) {
17108 vty_out(vty
, " neighbor %s interface %s\n", addr
, peer
->ifname
);
17111 /* TCP max segment size */
17112 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_TCP_MSS
))
17113 vty_out(vty
, " neighbor %s tcp-mss %d\n", addr
, peer
->tcp_mss
);
17116 if (peergroup_flag_check(peer
, PEER_FLAG_PASSIVE
))
17117 vty_out(vty
, " neighbor %s passive\n", addr
);
17119 /* ebgp-multihop */
17120 if (peer
->sort
!= BGP_PEER_IBGP
&& peer
->ttl
!= BGP_DEFAULT_TTL
17121 && !(peer
->gtsm_hops
!= BGP_GTSM_HOPS_DISABLED
17122 && peer
->ttl
== MAXTTL
)) {
17123 if (!peer_group_active(peer
) || g_peer
->ttl
!= peer
->ttl
) {
17124 vty_out(vty
, " neighbor %s ebgp-multihop %d\n", addr
,
17130 if (peergroup_flag_check(peer
, PEER_FLAG_ROLE
) &&
17131 peer
->local_role
!= ROLE_UNDEFINED
)
17132 vty_out(vty
, " neighbor %s local-role %s%s\n", addr
,
17133 bgp_get_name_by_role(peer
->local_role
),
17134 CHECK_FLAG(peer
->flags
, PEER_FLAG_ROLE_STRICT_MODE
)
17138 /* ttl-security hops */
17139 if (peer
->gtsm_hops
!= BGP_GTSM_HOPS_DISABLED
) {
17140 if (!peer_group_active(peer
)
17141 || g_peer
->gtsm_hops
!= peer
->gtsm_hops
) {
17142 vty_out(vty
, " neighbor %s ttl-security hops %d\n",
17143 addr
, peer
->gtsm_hops
);
17147 /* disable-connected-check */
17148 if (peergroup_flag_check(peer
, PEER_FLAG_DISABLE_CONNECTED_CHECK
))
17149 vty_out(vty
, " neighbor %s disable-connected-check\n", addr
);
17151 /* link-bw-encoding-ieee */
17152 if (peergroup_flag_check(peer
, PEER_FLAG_DISABLE_LINK_BW_ENCODING_IEEE
))
17153 vty_out(vty
, " neighbor %s disable-link-bw-encoding-ieee\n",
17156 /* extended-optional-parameters */
17157 if (peergroup_flag_check(peer
, PEER_FLAG_EXTENDED_OPT_PARAMS
))
17158 vty_out(vty
, " neighbor %s extended-optional-parameters\n",
17161 /* enforce-first-as */
17162 if (peergroup_flag_check(peer
, PEER_FLAG_ENFORCE_FIRST_AS
))
17163 vty_out(vty
, " neighbor %s enforce-first-as\n", addr
);
17165 /* update-source */
17166 if (peergroup_flag_check(peer
, PEER_FLAG_UPDATE_SOURCE
)) {
17167 if (peer
->update_source
)
17168 vty_out(vty
, " neighbor %s update-source %pSU\n", addr
,
17169 peer
->update_source
);
17170 else if (peer
->update_if
)
17171 vty_out(vty
, " neighbor %s update-source %s\n", addr
,
17175 /* advertisement-interval */
17176 if (peergroup_flag_check(peer
, PEER_FLAG_ROUTEADV
))
17177 vty_out(vty
, " neighbor %s advertisement-interval %u\n", addr
,
17181 if (peergroup_flag_check(peer
, PEER_FLAG_TIMER
))
17182 vty_out(vty
, " neighbor %s timers %u %u\n", addr
,
17183 peer
->keepalive
, peer
->holdtime
);
17185 /* timers connect */
17186 if (peergroup_flag_check(peer
, PEER_FLAG_TIMER_CONNECT
))
17187 vty_out(vty
, " neighbor %s timers connect %u\n", addr
,
17189 /* need special-case handling for changed default values due to
17190 * config profile / version (because there is no "timers bgp connect"
17191 * command, we need to save this per-peer :/)
17193 else if (!peer_group_active(peer
) && !peer
->connect
&&
17194 peer
->bgp
->default_connect_retry
!= SAVE_BGP_CONNECT_RETRY
)
17195 vty_out(vty
, " neighbor %s timers connect %u\n", addr
,
17196 peer
->bgp
->default_connect_retry
);
17198 /* timers delayopen */
17199 if (peergroup_flag_check(peer
, PEER_FLAG_TIMER_DELAYOPEN
))
17200 vty_out(vty
, " neighbor %s timers delayopen %u\n", addr
,
17202 /* Save config even though flag is not set if default values have been
17205 else if (!peer_group_active(peer
) && !peer
->delayopen
17206 && peer
->bgp
->default_delayopen
!= BGP_DEFAULT_DELAYOPEN
)
17207 vty_out(vty
, " neighbor %s timers delayopen %u\n", addr
,
17208 peer
->bgp
->default_delayopen
);
17210 /* capability dynamic */
17211 if (peergroup_flag_check(peer
, PEER_FLAG_DYNAMIC_CAPABILITY
))
17212 vty_out(vty
, " neighbor %s capability dynamic\n", addr
);
17214 /* capability extended-nexthop */
17215 if (peergroup_flag_check(peer
, PEER_FLAG_CAPABILITY_ENHE
)) {
17216 if (CHECK_FLAG(peer
->flags_invert
, PEER_FLAG_CAPABILITY_ENHE
) &&
17219 " no neighbor %s capability extended-nexthop\n",
17221 else if (!peer
->conf_if
)
17223 " neighbor %s capability extended-nexthop\n",
17227 /* dont-capability-negotiation */
17228 if (peergroup_flag_check(peer
, PEER_FLAG_DONT_CAPABILITY
))
17229 vty_out(vty
, " neighbor %s dont-capability-negotiate\n", addr
);
17231 /* override-capability */
17232 if (peergroup_flag_check(peer
, PEER_FLAG_OVERRIDE_CAPABILITY
))
17233 vty_out(vty
, " neighbor %s override-capability\n", addr
);
17235 /* strict-capability-match */
17236 if (peergroup_flag_check(peer
, PEER_FLAG_STRICT_CAP_MATCH
))
17237 vty_out(vty
, " neighbor %s strict-capability-match\n", addr
);
17239 /* Sender side AS path loop detection. */
17240 if (peer
->as_path_loop_detection
)
17241 vty_out(vty
, " neighbor %s sender-as-path-loop-detection\n",
17244 if (!CHECK_FLAG(peer
->peer_gr_new_status_flag
,
17245 PEER_GRACEFUL_RESTART_NEW_STATE_INHERIT
)) {
17247 if (CHECK_FLAG(peer
->peer_gr_new_status_flag
,
17248 PEER_GRACEFUL_RESTART_NEW_STATE_HELPER
)) {
17250 " neighbor %s graceful-restart-helper\n", addr
);
17251 } else if (CHECK_FLAG(
17252 peer
->peer_gr_new_status_flag
,
17253 PEER_GRACEFUL_RESTART_NEW_STATE_RESTART
)) {
17255 " neighbor %s graceful-restart\n", addr
);
17257 (!(CHECK_FLAG(peer
->peer_gr_new_status_flag
,
17258 PEER_GRACEFUL_RESTART_NEW_STATE_HELPER
))
17260 peer
->peer_gr_new_status_flag
,
17261 PEER_GRACEFUL_RESTART_NEW_STATE_RESTART
)))) {
17262 vty_out(vty
, " neighbor %s graceful-restart-disable\n",
17268 /* BGP peer configuration display function. */
17269 static void bgp_config_write_peer_af(struct vty
*vty
, struct bgp
*bgp
,
17270 struct peer
*peer
, afi_t afi
, safi_t safi
)
17272 struct peer
*g_peer
= NULL
;
17274 bool flag_scomm
, flag_secomm
, flag_slcomm
;
17276 /* Skip dynamic neighbors. */
17277 if (peer_dynamic_neighbor(peer
))
17281 addr
= peer
->conf_if
;
17285 /************************************
17286 ****** Per AF to the neighbor ******
17287 ************************************/
17288 if (peer_group_active(peer
)) {
17289 g_peer
= peer
->group
->conf
;
17291 /* If the peer-group is active but peer is not, print a 'no
17293 if (g_peer
->afc
[afi
][safi
] && !peer
->afc
[afi
][safi
]) {
17294 vty_out(vty
, " no neighbor %s activate\n", addr
);
17297 /* If the peer-group is not active but peer is, print an
17299 else if (!g_peer
->afc
[afi
][safi
] && peer
->afc
[afi
][safi
]) {
17300 vty_out(vty
, " neighbor %s activate\n", addr
);
17303 if (peer
->afc
[afi
][safi
]) {
17304 if (safi
== SAFI_ENCAP
)
17305 vty_out(vty
, " neighbor %s activate\n", addr
);
17306 else if (!bgp
->default_af
[afi
][safi
])
17307 vty_out(vty
, " neighbor %s activate\n", addr
);
17309 if (bgp
->default_af
[afi
][safi
])
17310 vty_out(vty
, " no neighbor %s activate\n",
17315 /* addpath TX knobs */
17316 if (peergroup_af_addpath_check(peer
, afi
, safi
)) {
17317 switch (peer
->addpath_type
[afi
][safi
]) {
17318 case BGP_ADDPATH_ALL
:
17319 vty_out(vty
, " neighbor %s addpath-tx-all-paths\n",
17322 case BGP_ADDPATH_BEST_PER_AS
:
17324 " neighbor %s addpath-tx-bestpath-per-AS\n",
17327 case BGP_ADDPATH_MAX
:
17328 case BGP_ADDPATH_NONE
:
17333 if (CHECK_FLAG(peer
->af_flags
[afi
][safi
], PEER_FLAG_DISABLE_ADDPATH_RX
))
17334 vty_out(vty
, " neighbor %s disable-addpath-rx\n", addr
);
17336 /* ORF capability. */
17337 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_ORF_PREFIX_SM
)
17338 || peergroup_af_flag_check(peer
, afi
, safi
,
17339 PEER_FLAG_ORF_PREFIX_RM
)) {
17340 vty_out(vty
, " neighbor %s capability orf prefix-list", addr
);
17342 if (peergroup_af_flag_check(peer
, afi
, safi
,
17343 PEER_FLAG_ORF_PREFIX_SM
)
17344 && peergroup_af_flag_check(peer
, afi
, safi
,
17345 PEER_FLAG_ORF_PREFIX_RM
))
17346 vty_out(vty
, " both");
17347 else if (peergroup_af_flag_check(peer
, afi
, safi
,
17348 PEER_FLAG_ORF_PREFIX_SM
))
17349 vty_out(vty
, " send");
17351 vty_out(vty
, " receive");
17352 vty_out(vty
, "\n");
17355 /* Route reflector client. */
17356 if (peergroup_af_flag_check(peer
, afi
, safi
,
17357 PEER_FLAG_REFLECTOR_CLIENT
)) {
17358 vty_out(vty
, " neighbor %s route-reflector-client\n", addr
);
17361 /* next-hop-self force */
17362 if (peergroup_af_flag_check(peer
, afi
, safi
,
17363 PEER_FLAG_FORCE_NEXTHOP_SELF
)) {
17364 vty_out(vty
, " neighbor %s next-hop-self force\n", addr
);
17367 /* next-hop-self */
17368 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_NEXTHOP_SELF
)) {
17369 vty_out(vty
, " neighbor %s next-hop-self\n", addr
);
17372 /* remove-private-AS */
17373 if (peergroup_af_flag_check(peer
, afi
, safi
,
17374 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
)) {
17375 vty_out(vty
, " neighbor %s remove-private-AS all replace-AS\n",
17379 else if (peergroup_af_flag_check(peer
, afi
, safi
,
17380 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
)) {
17381 vty_out(vty
, " neighbor %s remove-private-AS replace-AS\n",
17385 else if (peergroup_af_flag_check(peer
, afi
, safi
,
17386 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
)) {
17387 vty_out(vty
, " neighbor %s remove-private-AS all\n", addr
);
17390 else if (peergroup_af_flag_check(peer
, afi
, safi
,
17391 PEER_FLAG_REMOVE_PRIVATE_AS
)) {
17392 vty_out(vty
, " neighbor %s remove-private-AS\n", addr
);
17396 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_AS_OVERRIDE
)) {
17397 vty_out(vty
, " neighbor %s as-override\n", addr
);
17400 /* send-community print. */
17401 flag_scomm
= peergroup_af_flag_check(peer
, afi
, safi
,
17402 PEER_FLAG_SEND_COMMUNITY
);
17403 flag_secomm
= peergroup_af_flag_check(peer
, afi
, safi
,
17404 PEER_FLAG_SEND_EXT_COMMUNITY
);
17405 flag_slcomm
= peergroup_af_flag_check(peer
, afi
, safi
,
17406 PEER_FLAG_SEND_LARGE_COMMUNITY
);
17408 if (flag_scomm
&& flag_secomm
&& flag_slcomm
) {
17409 vty_out(vty
, " no neighbor %s send-community all\n", addr
);
17412 vty_out(vty
, " no neighbor %s send-community\n", addr
);
17415 " no neighbor %s send-community extended\n",
17419 vty_out(vty
, " no neighbor %s send-community large\n",
17423 /* Default information */
17424 if (peergroup_af_flag_check(peer
, afi
, safi
,
17425 PEER_FLAG_DEFAULT_ORIGINATE
)) {
17426 vty_out(vty
, " neighbor %s default-originate", addr
);
17428 if (peer
->default_rmap
[afi
][safi
].name
)
17429 vty_out(vty
, " route-map %s",
17430 peer
->default_rmap
[afi
][safi
].name
);
17432 vty_out(vty
, "\n");
17435 /* Soft reconfiguration inbound. */
17436 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_SOFT_RECONFIG
)) {
17437 vty_out(vty
, " neighbor %s soft-reconfiguration inbound\n",
17441 /* maximum-prefix. */
17442 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX
)) {
17443 vty_out(vty
, " neighbor %s maximum-prefix %u", addr
,
17444 peer
->pmax
[afi
][safi
]);
17446 if (peer
->pmax_threshold
[afi
][safi
]
17447 != MAXIMUM_PREFIX_THRESHOLD_DEFAULT
)
17448 vty_out(vty
, " %u", peer
->pmax_threshold
[afi
][safi
]);
17449 if (peer_af_flag_check(peer
, afi
, safi
,
17450 PEER_FLAG_MAX_PREFIX_WARNING
))
17451 vty_out(vty
, " warning-only");
17452 if (peer
->pmax_restart
[afi
][safi
])
17453 vty_out(vty
, " restart %u",
17454 peer
->pmax_restart
[afi
][safi
]);
17455 if (peer_af_flag_check(peer
, afi
, safi
,
17456 PEER_FLAG_MAX_PREFIX_FORCE
))
17457 vty_out(vty
, " force");
17459 vty_out(vty
, "\n");
17462 /* maximum-prefix-out */
17463 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_MAX_PREFIX_OUT
))
17464 vty_out(vty
, " neighbor %s maximum-prefix-out %u\n",
17465 addr
, peer
->pmax_out
[afi
][safi
]);
17467 /* Route server client. */
17468 if (peergroup_af_flag_check(peer
, afi
, safi
,
17469 PEER_FLAG_RSERVER_CLIENT
)) {
17470 vty_out(vty
, " neighbor %s route-server-client\n", addr
);
17473 /* Nexthop-local unchanged. */
17474 if (peergroup_af_flag_check(peer
, afi
, safi
,
17475 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
)) {
17476 vty_out(vty
, " neighbor %s nexthop-local unchanged\n", addr
);
17479 /* allowas-in <1-10> */
17480 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_ALLOWAS_IN
)) {
17481 if (peer_af_flag_check(peer
, afi
, safi
,
17482 PEER_FLAG_ALLOWAS_IN_ORIGIN
)) {
17483 vty_out(vty
, " neighbor %s allowas-in origin\n", addr
);
17484 } else if (peer
->allowas_in
[afi
][safi
] == 3) {
17485 vty_out(vty
, " neighbor %s allowas-in\n", addr
);
17487 vty_out(vty
, " neighbor %s allowas-in %d\n", addr
,
17488 peer
->allowas_in
[afi
][safi
]);
17493 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_ACCEPT_OWN
))
17494 vty_out(vty
, " neighbor %s accept-own\n", addr
);
17497 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_SOO
)) {
17498 char *soo_str
= ecommunity_ecom2str(
17499 peer
->soo
[afi
][safi
], ECOMMUNITY_FORMAT_ROUTE_MAP
, 0);
17501 vty_out(vty
, " neighbor %s soo %s\n", addr
, soo_str
);
17502 XFREE(MTYPE_ECOMMUNITY_STR
, soo_str
);
17506 if (peergroup_af_flag_check(peer
, afi
, safi
, PEER_FLAG_WEIGHT
))
17507 vty_out(vty
, " neighbor %s weight %lu\n", addr
,
17508 peer
->weight
[afi
][safi
]);
17511 bgp_config_write_filter(vty
, peer
, afi
, safi
);
17513 /* atribute-unchanged. */
17514 if (peer_af_flag_check(peer
, afi
, safi
, PEER_FLAG_AS_PATH_UNCHANGED
)
17515 || (safi
!= SAFI_EVPN
17516 && peer_af_flag_check(peer
, afi
, safi
,
17517 PEER_FLAG_NEXTHOP_UNCHANGED
))
17518 || peer_af_flag_check(peer
, afi
, safi
, PEER_FLAG_MED_UNCHANGED
)) {
17520 if (!peer_group_active(peer
)
17521 || peergroup_af_flag_check(peer
, afi
, safi
,
17522 PEER_FLAG_AS_PATH_UNCHANGED
)
17523 || peergroup_af_flag_check(peer
, afi
, safi
,
17524 PEER_FLAG_NEXTHOP_UNCHANGED
)
17525 || peergroup_af_flag_check(peer
, afi
, safi
,
17526 PEER_FLAG_MED_UNCHANGED
)) {
17529 " neighbor %s attribute-unchanged%s%s%s\n",
17531 peer_af_flag_check(peer
, afi
, safi
,
17532 PEER_FLAG_AS_PATH_UNCHANGED
)
17535 peer_af_flag_check(peer
, afi
, safi
,
17536 PEER_FLAG_NEXTHOP_UNCHANGED
)
17539 peer_af_flag_check(peer
, afi
, safi
,
17540 PEER_FLAG_MED_UNCHANGED
)
17546 if (peer_af_flag_check(peer
, afi
, safi
, PEER_FLAG_ORR_GROUP
))
17547 vty_out(vty
, " neighbor %s optimal-route-reflection %s\n",
17548 addr
, peer
->orr_group_name
[afi
][safi
]);
17551 static void bgp_vpn_config_write(struct vty
*vty
, struct bgp
*bgp
, afi_t afi
,
17554 if (!CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
17555 BGP_VPNVX_RETAIN_ROUTE_TARGET_ALL
))
17556 vty_out(vty
, " no bgp retain route-target all\n");
17559 /* Address family based peer configuration display. */
17560 static void bgp_config_write_family(struct vty
*vty
, struct bgp
*bgp
, afi_t afi
,
17564 struct peer_group
*group
;
17565 struct listnode
*node
, *nnode
;
17568 vty_frame(vty
, " !\n address-family ");
17569 if (afi
== AFI_IP
) {
17570 if (safi
== SAFI_UNICAST
)
17571 vty_frame(vty
, "ipv4 unicast");
17572 else if (safi
== SAFI_LABELED_UNICAST
)
17573 vty_frame(vty
, "ipv4 labeled-unicast");
17574 else if (safi
== SAFI_MULTICAST
)
17575 vty_frame(vty
, "ipv4 multicast");
17576 else if (safi
== SAFI_MPLS_VPN
)
17577 vty_frame(vty
, "ipv4 vpn");
17578 else if (safi
== SAFI_ENCAP
)
17579 vty_frame(vty
, "ipv4 encap");
17580 else if (safi
== SAFI_FLOWSPEC
)
17581 vty_frame(vty
, "ipv4 flowspec");
17582 } else if (afi
== AFI_IP6
) {
17583 if (safi
== SAFI_UNICAST
)
17584 vty_frame(vty
, "ipv6 unicast");
17585 else if (safi
== SAFI_LABELED_UNICAST
)
17586 vty_frame(vty
, "ipv6 labeled-unicast");
17587 else if (safi
== SAFI_MULTICAST
)
17588 vty_frame(vty
, "ipv6 multicast");
17589 else if (safi
== SAFI_MPLS_VPN
)
17590 vty_frame(vty
, "ipv6 vpn");
17591 else if (safi
== SAFI_ENCAP
)
17592 vty_frame(vty
, "ipv6 encap");
17593 else if (safi
== SAFI_FLOWSPEC
)
17594 vty_frame(vty
, "ipv6 flowspec");
17595 } else if (afi
== AFI_L2VPN
) {
17596 if (safi
== SAFI_EVPN
)
17597 vty_frame(vty
, "l2vpn evpn");
17599 vty_frame(vty
, "\n");
17601 bgp_config_write_distance(vty
, bgp
, afi
, safi
);
17603 bgp_config_write_network(vty
, bgp
, afi
, safi
);
17605 bgp_config_write_redistribute(vty
, bgp
, afi
, safi
);
17607 /* BGP flag dampening. */
17608 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
], BGP_CONFIG_DAMPENING
))
17609 bgp_config_write_damp(vty
, afi
, safi
);
17611 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
))
17612 bgp_config_write_peer_af(vty
, bgp
, group
->conf
, afi
, safi
);
17614 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
17615 /* Do not display doppelganger peers */
17616 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
17617 bgp_config_write_peer_af(vty
, bgp
, peer
, afi
, safi
);
17620 bgp_config_write_maxpaths(vty
, bgp
, afi
, safi
);
17621 bgp_config_write_table_map(vty
, bgp
, afi
, safi
);
17623 if (safi
== SAFI_EVPN
)
17624 bgp_config_write_evpn_info(vty
, bgp
, afi
, safi
);
17626 if (safi
== SAFI_FLOWSPEC
)
17627 bgp_fs_config_write_pbr(vty
, bgp
, afi
, safi
);
17629 if (safi
== SAFI_MPLS_VPN
)
17630 bgp_vpn_config_write(vty
, bgp
, afi
, safi
);
17632 if (safi
== SAFI_UNICAST
) {
17633 bgp_vpn_policy_config_write_afi(vty
, bgp
, afi
);
17634 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
17635 BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT
)) {
17637 vty_out(vty
, " export vpn\n");
17639 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
17640 BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT
)) {
17642 vty_out(vty
, " import vpn\n");
17644 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
17645 BGP_CONFIG_VRF_TO_VRF_IMPORT
)) {
17648 for (ALL_LIST_ELEMENTS_RO(
17649 bgp
->vpn_policy
[afi
].import_vrf
, node
,
17651 vty_out(vty
, " import vrf %s\n", name
);
17655 /* Optimal Route Reflection */
17656 bgp_config_write_orr(vty
, bgp
, afi
, safi
);
17658 vty_endframe(vty
, " exit-address-family\n");
17661 int bgp_config_write(struct vty
*vty
)
17664 struct peer_group
*group
;
17666 struct listnode
*node
, *nnode
;
17667 struct listnode
*mnode
, *mnnode
;
17671 if (bm
->rmap_update_timer
!= RMAP_DEFAULT_UPDATE_TIMER
)
17672 vty_out(vty
, "bgp route-map delay-timer %u\n",
17673 bm
->rmap_update_timer
);
17675 if (bm
->v_update_delay
!= BGP_UPDATE_DELAY_DEF
) {
17676 vty_out(vty
, "bgp update-delay %d", bm
->v_update_delay
);
17677 if (bm
->v_update_delay
!= bm
->v_establish_wait
)
17678 vty_out(vty
, " %d", bm
->v_establish_wait
);
17679 vty_out(vty
, "\n");
17682 if (bm
->wait_for_fib
)
17683 vty_out(vty
, "bgp suppress-fib-pending\n");
17685 if (CHECK_FLAG(bm
->flags
, BM_FLAG_GRACEFUL_SHUTDOWN
))
17686 vty_out(vty
, "bgp graceful-shutdown\n");
17688 /* No-RIB (Zebra) option flag configuration */
17689 if (bgp_option_check(BGP_OPT_NO_FIB
))
17690 vty_out(vty
, "bgp no-rib\n");
17692 if (CHECK_FLAG(bm
->flags
, BM_FLAG_SEND_EXTRA_DATA_TO_ZEBRA
))
17693 vty_out(vty
, "bgp send-extra-data zebra\n");
17695 /* BGP session DSCP value */
17696 if (bm
->tcp_dscp
!= IPTOS_PREC_INTERNETCONTROL
)
17697 vty_out(vty
, "bgp session-dscp %u\n", bm
->tcp_dscp
>> 2);
17699 /* BGP configuration. */
17700 for (ALL_LIST_ELEMENTS(bm
->bgp
, mnode
, mnnode
, bgp
)) {
17702 /* skip all auto created vrf as they dont have user config */
17703 if (CHECK_FLAG(bgp
->vrf_flags
, BGP_VRF_AUTO
))
17706 /* Router bgp ASN */
17707 vty_out(vty
, "router bgp %u", bgp
->as
);
17710 vty_out(vty
, " %s %s",
17711 (bgp
->inst_type
== BGP_INSTANCE_TYPE_VIEW
)
17712 ? "view" : "vrf", bgp
->name
);
17713 vty_out(vty
, "\n");
17715 /* BGP fast-external-failover. */
17716 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_NO_FAST_EXT_FAILOVER
))
17717 vty_out(vty
, " no bgp fast-external-failover\n");
17719 /* BGP router ID. */
17720 if (bgp
->router_id_static
.s_addr
!= INADDR_ANY
)
17721 vty_out(vty
, " bgp router-id %pI4\n",
17722 &bgp
->router_id_static
);
17724 /* Suppress fib pending */
17725 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_SUPPRESS_FIB_PENDING
))
17726 vty_out(vty
, " bgp suppress-fib-pending\n");
17728 /* BGP log-neighbor-changes. */
17729 if (!!CHECK_FLAG(bgp
->flags
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
)
17730 != SAVE_BGP_LOG_NEIGHBOR_CHANGES
)
17731 vty_out(vty
, " %sbgp log-neighbor-changes\n",
17732 CHECK_FLAG(bgp
->flags
,
17733 BGP_FLAG_LOG_NEIGHBOR_CHANGES
)
17737 /* BGP configuration. */
17738 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_ALWAYS_COMPARE_MED
))
17739 vty_out(vty
, " bgp always-compare-med\n");
17741 /* RFC8212 default eBGP policy. */
17742 if (!!CHECK_FLAG(bgp
->flags
, BGP_FLAG_EBGP_REQUIRES_POLICY
)
17743 != SAVE_BGP_EBGP_REQUIRES_POLICY
)
17744 vty_out(vty
, " %sbgp ebgp-requires-policy\n",
17745 CHECK_FLAG(bgp
->flags
,
17746 BGP_FLAG_EBGP_REQUIRES_POLICY
)
17750 /* draft-ietf-idr-deprecate-as-set-confed-set */
17751 if (bgp
->reject_as_sets
)
17752 vty_out(vty
, " bgp reject-as-sets\n");
17754 /* Suppress duplicate updates if the route actually not changed
17756 if (!!CHECK_FLAG(bgp
->flags
, BGP_FLAG_SUPPRESS_DUPLICATES
)
17757 != SAVE_BGP_SUPPRESS_DUPLICATES
)
17758 vty_out(vty
, " %sbgp suppress-duplicates\n",
17759 CHECK_FLAG(bgp
->flags
,
17760 BGP_FLAG_SUPPRESS_DUPLICATES
)
17764 /* Send Hard Reset CEASE Notification for 'Administrative Reset'
17766 if (!!CHECK_FLAG(bgp
->flags
, BGP_FLAG_HARD_ADMIN_RESET
) !=
17767 SAVE_BGP_HARD_ADMIN_RESET
)
17768 vty_out(vty
, " %sbgp hard-administrative-reset\n",
17769 CHECK_FLAG(bgp
->flags
,
17770 BGP_FLAG_HARD_ADMIN_RESET
)
17774 /* BGP default <afi>-<safi> */
17775 FOREACH_AFI_SAFI (afi
, safi
) {
17776 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
) {
17777 if (!bgp
->default_af
[afi
][safi
])
17778 vty_out(vty
, " no bgp default %s\n",
17779 get_bgp_default_af_flag(afi
,
17781 } else if (bgp
->default_af
[afi
][safi
])
17782 vty_out(vty
, " bgp default %s\n",
17783 get_bgp_default_af_flag(afi
, safi
));
17786 /* BGP default local-preference. */
17787 if (bgp
->default_local_pref
!= BGP_DEFAULT_LOCAL_PREF
)
17788 vty_out(vty
, " bgp default local-preference %u\n",
17789 bgp
->default_local_pref
);
17791 /* BGP default show-hostname */
17792 if (!!CHECK_FLAG(bgp
->flags
, BGP_FLAG_SHOW_HOSTNAME
)
17793 != SAVE_BGP_SHOW_HOSTNAME
)
17794 vty_out(vty
, " %sbgp default show-hostname\n",
17795 CHECK_FLAG(bgp
->flags
, BGP_FLAG_SHOW_HOSTNAME
)
17799 /* BGP default show-nexthop-hostname */
17800 if (!!CHECK_FLAG(bgp
->flags
, BGP_FLAG_SHOW_NEXTHOP_HOSTNAME
)
17801 != SAVE_BGP_SHOW_HOSTNAME
)
17802 vty_out(vty
, " %sbgp default show-nexthop-hostname\n",
17803 CHECK_FLAG(bgp
->flags
,
17804 BGP_FLAG_SHOW_NEXTHOP_HOSTNAME
)
17808 /* BGP default subgroup-pkt-queue-max. */
17809 if (bgp
->default_subgroup_pkt_queue_max
17810 != BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX
)
17811 vty_out(vty
, " bgp default subgroup-pkt-queue-max %u\n",
17812 bgp
->default_subgroup_pkt_queue_max
);
17814 /* BGP client-to-client reflection. */
17815 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_NO_CLIENT_TO_CLIENT
))
17816 vty_out(vty
, " no bgp client-to-client reflection\n");
17818 /* BGP cluster ID. */
17819 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CLUSTER_ID
))
17820 vty_out(vty
, " bgp cluster-id %pI4\n",
17823 /* Disable ebgp connected nexthop check */
17824 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_DISABLE_NH_CONNECTED_CHK
))
17826 " bgp disable-ebgp-connected-route-check\n");
17828 /* Confederation identifier*/
17829 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
))
17830 vty_out(vty
, " bgp confederation identifier %u\n",
17833 /* Confederation peer */
17834 if (bgp
->confed_peers_cnt
> 0) {
17837 vty_out(vty
, " bgp confederation peers");
17839 for (i
= 0; i
< bgp
->confed_peers_cnt
; i
++)
17840 vty_out(vty
, " %u", bgp
->confed_peers
[i
]);
17842 vty_out(vty
, "\n");
17845 /* BGP deterministic-med. */
17846 if (!!CHECK_FLAG(bgp
->flags
, BGP_FLAG_DETERMINISTIC_MED
)
17847 != SAVE_BGP_DETERMINISTIC_MED
)
17848 vty_out(vty
, " %sbgp deterministic-med\n",
17849 CHECK_FLAG(bgp
->flags
,
17850 BGP_FLAG_DETERMINISTIC_MED
)
17854 /* BGP update-delay. */
17855 bgp_config_write_update_delay(vty
, bgp
);
17857 if (bgp
->v_maxmed_onstartup
17858 != BGP_MAXMED_ONSTARTUP_UNCONFIGURED
) {
17859 vty_out(vty
, " bgp max-med on-startup %u",
17860 bgp
->v_maxmed_onstartup
);
17861 if (bgp
->maxmed_onstartup_value
17862 != BGP_MAXMED_VALUE_DEFAULT
)
17863 vty_out(vty
, " %u",
17864 bgp
->maxmed_onstartup_value
);
17865 vty_out(vty
, "\n");
17867 if (bgp
->v_maxmed_admin
!= BGP_MAXMED_ADMIN_UNCONFIGURED
) {
17868 vty_out(vty
, " bgp max-med administrative");
17869 if (bgp
->maxmed_admin_value
!= BGP_MAXMED_VALUE_DEFAULT
)
17870 vty_out(vty
, " %u", bgp
->maxmed_admin_value
);
17871 vty_out(vty
, "\n");
17875 bgp_config_write_wpkt_quanta(vty
, bgp
);
17877 bgp_config_write_rpkt_quanta(vty
, bgp
);
17879 /* coalesce time */
17880 bgp_config_write_coalesce_time(vty
, bgp
);
17882 /* BGP per-instance graceful-shutdown */
17883 /* BGP-wide settings and per-instance settings are mutually
17886 if (!CHECK_FLAG(bm
->flags
, BM_FLAG_GRACEFUL_SHUTDOWN
))
17887 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_GRACEFUL_SHUTDOWN
))
17888 vty_out(vty
, " bgp graceful-shutdown\n");
17890 /* Long-lived Graceful Restart */
17891 if (bgp
->llgr_stale_time
!= BGP_DEFAULT_LLGR_STALE_TIME
)
17893 " bgp long-lived-graceful-restart stale-time %u\n",
17894 bgp
->llgr_stale_time
);
17896 /* BGP graceful-restart. */
17897 if (bgp
->stalepath_time
!= BGP_DEFAULT_STALEPATH_TIME
)
17899 " bgp graceful-restart stalepath-time %u\n",
17900 bgp
->stalepath_time
);
17902 if (bgp
->restart_time
!= BGP_DEFAULT_RESTART_TIME
)
17903 vty_out(vty
, " bgp graceful-restart restart-time %u\n",
17904 bgp
->restart_time
);
17906 if (!!CHECK_FLAG(bgp
->flags
, BGP_FLAG_GRACEFUL_NOTIFICATION
) !=
17907 SAVE_BGP_GRACEFUL_NOTIFICATION
)
17908 vty_out(vty
, " %sbgp graceful-restart notification\n",
17909 CHECK_FLAG(bgp
->flags
,
17910 BGP_FLAG_GRACEFUL_NOTIFICATION
)
17914 if (bgp
->select_defer_time
!= BGP_DEFAULT_SELECT_DEFERRAL_TIME
)
17916 " bgp graceful-restart select-defer-time %u\n",
17917 bgp
->select_defer_time
);
17919 if (bgp_global_gr_mode_get(bgp
) == GLOBAL_GR
)
17920 vty_out(vty
, " bgp graceful-restart\n");
17922 if (bgp_global_gr_mode_get(bgp
) == GLOBAL_DISABLE
)
17923 vty_out(vty
, " bgp graceful-restart-disable\n");
17925 /* BGP graceful-restart Preserve State F bit. */
17926 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_GR_PRESERVE_FWD
))
17928 " bgp graceful-restart preserve-fw-state\n");
17930 /* BGP TCP keepalive */
17931 bgp_config_tcp_keepalive(vty
, bgp
);
17933 /* Stale timer for RIB */
17934 if (bgp
->rib_stale_time
!= BGP_DEFAULT_RIB_STALE_TIME
)
17936 " bgp graceful-restart rib-stale-time %u\n",
17937 bgp
->rib_stale_time
);
17939 /* BGP bestpath method. */
17940 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_ASPATH_IGNORE
))
17941 vty_out(vty
, " bgp bestpath as-path ignore\n");
17942 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_ASPATH_CONFED
))
17943 vty_out(vty
, " bgp bestpath as-path confed\n");
17945 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
)) {
17946 if (CHECK_FLAG(bgp
->flags
,
17947 BGP_FLAG_MULTIPATH_RELAX_AS_SET
)) {
17949 " bgp bestpath as-path multipath-relax as-set\n");
17952 " bgp bestpath as-path multipath-relax\n");
17956 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
)) {
17958 " bgp route-reflector allow-outbound-policy\n");
17960 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_COMPARE_ROUTER_ID
))
17961 vty_out(vty
, " bgp bestpath compare-routerid\n");
17962 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_MED_CONFED
)
17963 || CHECK_FLAG(bgp
->flags
, BGP_FLAG_MED_MISSING_AS_WORST
)) {
17964 vty_out(vty
, " bgp bestpath med");
17965 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_MED_CONFED
))
17966 vty_out(vty
, " confed");
17967 if (CHECK_FLAG(bgp
->flags
,
17968 BGP_FLAG_MED_MISSING_AS_WORST
))
17969 vty_out(vty
, " missing-as-worst");
17970 vty_out(vty
, "\n");
17973 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_PEERTYPE_MULTIPATH_RELAX
))
17975 " bgp bestpath peer-type multipath-relax\n");
17977 /* Link bandwidth handling. */
17978 if (bgp
->lb_handling
== BGP_LINK_BW_IGNORE_BW
)
17979 vty_out(vty
, " bgp bestpath bandwidth ignore\n");
17980 else if (bgp
->lb_handling
== BGP_LINK_BW_SKIP_MISSING
)
17981 vty_out(vty
, " bgp bestpath bandwidth skip-missing\n");
17982 else if (bgp
->lb_handling
== BGP_LINK_BW_DEFWT_4_MISSING
)
17983 vty_out(vty
, " bgp bestpath bandwidth default-weight-for-missing\n");
17985 /* BGP network import check. */
17986 if (!!CHECK_FLAG(bgp
->flags
, BGP_FLAG_IMPORT_CHECK
)
17987 != SAVE_BGP_IMPORT_CHECK
)
17988 vty_out(vty
, " %sbgp network import-check\n",
17989 CHECK_FLAG(bgp
->flags
, BGP_FLAG_IMPORT_CHECK
)
17993 /* BGP timers configuration. */
17994 if (bgp
->default_keepalive
!= SAVE_BGP_KEEPALIVE
17995 || bgp
->default_holdtime
!= SAVE_BGP_HOLDTIME
)
17996 vty_out(vty
, " timers bgp %u %u\n",
17997 bgp
->default_keepalive
, bgp
->default_holdtime
);
17999 /* BGP minimum holdtime configuration. */
18000 if (bgp
->default_min_holdtime
!= SAVE_BGP_HOLDTIME
18001 && bgp
->default_min_holdtime
!= 0)
18002 vty_out(vty
, " bgp minimum-holdtime %u\n",
18003 bgp
->default_min_holdtime
);
18005 /* Conditional advertisement timer configuration */
18006 if (bgp
->condition_check_period
18007 != DEFAULT_CONDITIONAL_ROUTES_POLL_TIME
)
18009 " bgp conditional-advertisement timer %u\n",
18010 bgp
->condition_check_period
);
18013 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
18014 bgp_config_write_peer_global(vty
, bgp
, group
->conf
);
18017 /* Normal neighbor configuration. */
18018 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
18019 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
18020 bgp_config_write_peer_global(vty
, bgp
, peer
);
18023 /* listen range and limit for dynamic BGP neighbors */
18024 bgp_config_write_listen(vty
, bgp
);
18027 * BGP default autoshutdown neighbors
18029 * This must be placed after any peer and peer-group
18030 * configuration, to avoid setting all peers to shutdown after
18031 * a daemon restart, which is undesired behavior. (see #2286)
18033 if (bgp
->autoshutdown
)
18034 vty_out(vty
, " bgp default shutdown\n");
18036 /* BGP instance administrative shutdown */
18037 if (CHECK_FLAG(bgp
->flags
, BGP_FLAG_SHUTDOWN
))
18038 vty_out(vty
, " bgp shutdown\n");
18040 if (bgp
->allow_martian
)
18041 vty_out(vty
, " bgp allow-martian-nexthop\n");
18043 if (bgp
->fast_convergence
)
18044 vty_out(vty
, " bgp fast-convergence\n");
18046 if (bgp
->srv6_enabled
) {
18047 vty_frame(vty
, " !\n segment-routing srv6\n");
18048 if (strlen(bgp
->srv6_locator_name
))
18049 vty_out(vty
, " locator %s\n",
18050 bgp
->srv6_locator_name
);
18051 vty_endframe(vty
, " exit\n");
18055 /* IPv4 unicast configuration. */
18056 bgp_config_write_family(vty
, bgp
, AFI_IP
, SAFI_UNICAST
);
18058 /* IPv4 multicast configuration. */
18059 bgp_config_write_family(vty
, bgp
, AFI_IP
, SAFI_MULTICAST
);
18061 /* IPv4 labeled-unicast configuration. */
18062 bgp_config_write_family(vty
, bgp
, AFI_IP
, SAFI_LABELED_UNICAST
);
18064 /* IPv4 VPN configuration. */
18065 bgp_config_write_family(vty
, bgp
, AFI_IP
, SAFI_MPLS_VPN
);
18067 /* ENCAPv4 configuration. */
18068 bgp_config_write_family(vty
, bgp
, AFI_IP
, SAFI_ENCAP
);
18070 /* FLOWSPEC v4 configuration. */
18071 bgp_config_write_family(vty
, bgp
, AFI_IP
, SAFI_FLOWSPEC
);
18073 /* IPv6 unicast configuration. */
18074 bgp_config_write_family(vty
, bgp
, AFI_IP6
, SAFI_UNICAST
);
18076 /* IPv6 multicast configuration. */
18077 bgp_config_write_family(vty
, bgp
, AFI_IP6
, SAFI_MULTICAST
);
18079 /* IPv6 labeled-unicast configuration. */
18080 bgp_config_write_family(vty
, bgp
, AFI_IP6
,
18081 SAFI_LABELED_UNICAST
);
18083 /* IPv6 VPN configuration. */
18084 bgp_config_write_family(vty
, bgp
, AFI_IP6
, SAFI_MPLS_VPN
);
18086 /* ENCAPv6 configuration. */
18087 bgp_config_write_family(vty
, bgp
, AFI_IP6
, SAFI_ENCAP
);
18089 /* FLOWSPEC v6 configuration. */
18090 bgp_config_write_family(vty
, bgp
, AFI_IP6
, SAFI_FLOWSPEC
);
18092 /* EVPN configuration. */
18093 bgp_config_write_family(vty
, bgp
, AFI_L2VPN
, SAFI_EVPN
);
18095 hook_call(bgp_inst_config_write
, bgp
, vty
);
18097 #ifdef ENABLE_BGP_VNC
18098 bgp_rfapi_cfg_write(vty
, bgp
);
18101 vty_out(vty
, "exit\n");
18102 vty_out(vty
, "!\n");
18108 /* BGP node structure. */
18109 static struct cmd_node bgp_node
= {
18112 .parent_node
= CONFIG_NODE
,
18113 .prompt
= "%s(config-router)# ",
18114 .config_write
= bgp_config_write
,
18117 static struct cmd_node bgp_ipv4_unicast_node
= {
18118 .name
= "bgp ipv4 unicast",
18119 .node
= BGP_IPV4_NODE
,
18120 .parent_node
= BGP_NODE
,
18121 .prompt
= "%s(config-router-af)# ",
18125 static struct cmd_node bgp_ipv4_multicast_node
= {
18126 .name
= "bgp ipv4 multicast",
18127 .node
= BGP_IPV4M_NODE
,
18128 .parent_node
= BGP_NODE
,
18129 .prompt
= "%s(config-router-af)# ",
18133 static struct cmd_node bgp_ipv4_labeled_unicast_node
= {
18134 .name
= "bgp ipv4 labeled unicast",
18135 .node
= BGP_IPV4L_NODE
,
18136 .parent_node
= BGP_NODE
,
18137 .prompt
= "%s(config-router-af)# ",
18141 static struct cmd_node bgp_ipv6_unicast_node
= {
18142 .name
= "bgp ipv6 unicast",
18143 .node
= BGP_IPV6_NODE
,
18144 .parent_node
= BGP_NODE
,
18145 .prompt
= "%s(config-router-af)# ",
18149 static struct cmd_node bgp_ipv6_multicast_node
= {
18150 .name
= "bgp ipv6 multicast",
18151 .node
= BGP_IPV6M_NODE
,
18152 .parent_node
= BGP_NODE
,
18153 .prompt
= "%s(config-router-af)# ",
18157 static struct cmd_node bgp_ipv6_labeled_unicast_node
= {
18158 .name
= "bgp ipv6 labeled unicast",
18159 .node
= BGP_IPV6L_NODE
,
18160 .parent_node
= BGP_NODE
,
18161 .prompt
= "%s(config-router-af)# ",
18165 static struct cmd_node bgp_vpnv4_node
= {
18166 .name
= "bgp vpnv4",
18167 .node
= BGP_VPNV4_NODE
,
18168 .parent_node
= BGP_NODE
,
18169 .prompt
= "%s(config-router-af)# ",
18173 static struct cmd_node bgp_vpnv6_node
= {
18174 .name
= "bgp vpnv6",
18175 .node
= BGP_VPNV6_NODE
,
18176 .parent_node
= BGP_NODE
,
18177 .prompt
= "%s(config-router-af-vpnv6)# ",
18181 static struct cmd_node bgp_evpn_node
= {
18182 .name
= "bgp evpn",
18183 .node
= BGP_EVPN_NODE
,
18184 .parent_node
= BGP_NODE
,
18185 .prompt
= "%s(config-router-evpn)# ",
18189 static struct cmd_node bgp_evpn_vni_node
= {
18190 .name
= "bgp evpn vni",
18191 .node
= BGP_EVPN_VNI_NODE
,
18192 .parent_node
= BGP_EVPN_NODE
,
18193 .prompt
= "%s(config-router-af-vni)# ",
18196 static struct cmd_node bgp_flowspecv4_node
= {
18197 .name
= "bgp ipv4 flowspec",
18198 .node
= BGP_FLOWSPECV4_NODE
,
18199 .parent_node
= BGP_NODE
,
18200 .prompt
= "%s(config-router-af)# ",
18204 static struct cmd_node bgp_flowspecv6_node
= {
18205 .name
= "bgp ipv6 flowspec",
18206 .node
= BGP_FLOWSPECV6_NODE
,
18207 .parent_node
= BGP_NODE
,
18208 .prompt
= "%s(config-router-af-vpnv6)# ",
18212 static struct cmd_node bgp_srv6_node
= {
18213 .name
= "bgp srv6",
18214 .node
= BGP_SRV6_NODE
,
18215 .parent_node
= BGP_NODE
,
18216 .prompt
= "%s(config-router-srv6)# ",
18219 static void community_list_vty(void);
18221 static void bgp_ac_peergroup(vector comps
, struct cmd_token
*token
)
18224 struct peer_group
*group
;
18225 struct listnode
*lnbgp
, *lnpeer
;
18227 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, lnbgp
, bgp
)) {
18228 for (ALL_LIST_ELEMENTS_RO(bgp
->group
, lnpeer
, group
))
18230 XSTRDUP(MTYPE_COMPLETION
, group
->name
));
18234 static void bgp_ac_peer(vector comps
, struct cmd_token
*token
)
18238 struct listnode
*lnbgp
, *lnpeer
;
18240 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, lnbgp
, bgp
)) {
18241 for (ALL_LIST_ELEMENTS_RO(bgp
->peer
, lnpeer
, peer
)) {
18242 /* only provide suggestions on the appropriate input
18244 * they'll otherwise show up multiple times */
18245 enum cmd_token_type match_type
;
18246 char *name
= peer
->host
;
18248 if (peer
->conf_if
) {
18249 match_type
= VARIABLE_TKN
;
18250 name
= peer
->conf_if
;
18251 } else if (strchr(peer
->host
, ':'))
18252 match_type
= IPV6_TKN
;
18254 match_type
= IPV4_TKN
;
18256 if (token
->type
!= match_type
)
18259 vector_set(comps
, XSTRDUP(MTYPE_COMPLETION
, name
));
18264 static void bgp_ac_neighbor(vector comps
, struct cmd_token
*token
)
18266 bgp_ac_peer(comps
, token
);
18268 if (token
->type
== VARIABLE_TKN
)
18269 bgp_ac_peergroup(comps
, token
);
18272 static const struct cmd_variable_handler bgp_var_neighbor
[] = {
18273 {.varname
= "neighbor", .completions
= bgp_ac_neighbor
},
18274 {.varname
= "neighbors", .completions
= bgp_ac_neighbor
},
18275 {.varname
= "peer", .completions
= bgp_ac_neighbor
},
18276 {.completions
= NULL
}};
18278 static const struct cmd_variable_handler bgp_var_peergroup
[] = {
18279 {.tokenname
= "PGNAME", .completions
= bgp_ac_peergroup
},
18280 {.completions
= NULL
} };
18282 DEFINE_HOOK(bgp_config_end
, (struct bgp
*bgp
), (bgp
));
18284 static struct thread
*t_bgp_cfg
;
18286 bool bgp_config_inprocess(void)
18288 return thread_is_scheduled(t_bgp_cfg
);
18291 static void bgp_config_finish(struct thread
*t
)
18293 struct listnode
*node
;
18296 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, node
, bgp
))
18297 hook_call(bgp_config_end
, bgp
);
18300 static void bgp_config_start(void)
18302 #define BGP_PRE_CONFIG_MAX_WAIT_SECONDS 600
18303 THREAD_OFF(t_bgp_cfg
);
18304 thread_add_timer(bm
->master
, bgp_config_finish
, NULL
,
18305 BGP_PRE_CONFIG_MAX_WAIT_SECONDS
, &t_bgp_cfg
);
18308 /* When we receive a hook the configuration is read,
18309 * we start a timer to make sure we postpone sending
18310 * EoR before route-maps are processed.
18311 * This is especially valid if using `bgp route-map delay-timer`.
18313 static void bgp_config_end(void)
18315 #define BGP_POST_CONFIG_DELAY_SECONDS 1
18316 uint32_t bgp_post_config_delay
=
18317 thread_is_scheduled(bm
->t_rmap_update
)
18318 ? thread_timer_remain_second(bm
->t_rmap_update
)
18319 : BGP_POST_CONFIG_DELAY_SECONDS
;
18321 /* If BGP config processing thread isn't running, then
18322 * we can return and rely it's properly handled.
18324 if (!bgp_config_inprocess())
18327 THREAD_OFF(t_bgp_cfg
);
18329 /* Start a new timer to make sure we don't send EoR
18330 * before route-maps are processed.
18332 thread_add_timer(bm
->master
, bgp_config_finish
, NULL
,
18333 bgp_post_config_delay
, &t_bgp_cfg
);
18336 static int config_write_interface_one(struct vty
*vty
, struct vrf
*vrf
)
18339 struct interface
*ifp
;
18340 struct bgp_interface
*iifp
;
18342 FOR_ALL_INTERFACES (vrf
, ifp
) {
18347 if_vty_config_start(vty
, ifp
);
18349 if (CHECK_FLAG(iifp
->flags
,
18350 BGP_INTERFACE_MPLS_BGP_FORWARDING
)) {
18351 vty_out(vty
, " mpls bgp forwarding\n");
18355 if_vty_config_end(vty
);
18361 /* Configuration write function for bgpd. */
18362 static int config_write_interface(struct vty
*vty
)
18365 struct vrf
*vrf
= NULL
;
18367 /* Display all VRF aware OSPF interface configuration */
18368 RB_FOREACH (vrf
, vrf_name_head
, &vrfs_by_name
) {
18369 write
+= config_write_interface_one(vty
, vrf
);
18375 DEFPY(mpls_bgp_forwarding
, mpls_bgp_forwarding_cmd
,
18376 "[no$no] mpls bgp forwarding",
18377 NO_STR MPLS_STR BGP_STR
18378 "Enable MPLS forwarding for eBGP directly connected peers\n")
18381 struct bgp_interface
*iifp
;
18383 VTY_DECLVAR_CONTEXT(interface
, ifp
);
18386 vty_out(vty
, "Interface %s not available\n", ifp
->name
);
18387 return CMD_WARNING_CONFIG_FAILED
;
18389 check
= CHECK_FLAG(iifp
->flags
, BGP_INTERFACE_MPLS_BGP_FORWARDING
);
18390 if (check
!= !no
) {
18392 UNSET_FLAG(iifp
->flags
,
18393 BGP_INTERFACE_MPLS_BGP_FORWARDING
);
18395 SET_FLAG(iifp
->flags
,
18396 BGP_INTERFACE_MPLS_BGP_FORWARDING
);
18397 /* trigger a nht update on eBGP sessions */
18398 if (if_is_operative(ifp
))
18399 bgp_nht_ifp_up(ifp
);
18401 return CMD_SUCCESS
;
18404 /* Initialization of BGP interface. */
18405 static void bgp_vty_if_init(void)
18407 /* Install interface node. */
18408 if_cmd_init(config_write_interface
);
18410 /* "mpls bgp forwarding" commands. */
18411 install_element(INTERFACE_NODE
, &mpls_bgp_forwarding_cmd
);
18414 void bgp_vty_init(void)
18416 cmd_variable_handler_register(bgp_var_neighbor
);
18417 cmd_variable_handler_register(bgp_var_peergroup
);
18419 cmd_init_config_callbacks(bgp_config_start
, bgp_config_end
);
18421 /* Install bgp top node. */
18422 install_node(&bgp_node
);
18423 install_node(&bgp_ipv4_unicast_node
);
18424 install_node(&bgp_ipv4_multicast_node
);
18425 install_node(&bgp_ipv4_labeled_unicast_node
);
18426 install_node(&bgp_ipv6_unicast_node
);
18427 install_node(&bgp_ipv6_multicast_node
);
18428 install_node(&bgp_ipv6_labeled_unicast_node
);
18429 install_node(&bgp_vpnv4_node
);
18430 install_node(&bgp_vpnv6_node
);
18431 install_node(&bgp_evpn_node
);
18432 install_node(&bgp_evpn_vni_node
);
18433 install_node(&bgp_flowspecv4_node
);
18434 install_node(&bgp_flowspecv6_node
);
18435 install_node(&bgp_srv6_node
);
18437 /* Install default VTY commands to new nodes. */
18438 install_default(BGP_NODE
);
18439 install_default(BGP_IPV4_NODE
);
18440 install_default(BGP_IPV4M_NODE
);
18441 install_default(BGP_IPV4L_NODE
);
18442 install_default(BGP_IPV6_NODE
);
18443 install_default(BGP_IPV6M_NODE
);
18444 install_default(BGP_IPV6L_NODE
);
18445 install_default(BGP_VPNV4_NODE
);
18446 install_default(BGP_VPNV6_NODE
);
18447 install_default(BGP_FLOWSPECV4_NODE
);
18448 install_default(BGP_FLOWSPECV6_NODE
);
18449 install_default(BGP_EVPN_NODE
);
18450 install_default(BGP_EVPN_VNI_NODE
);
18451 install_default(BGP_SRV6_NODE
);
18453 /* "bgp local-mac" hidden commands. */
18454 install_element(CONFIG_NODE
, &bgp_local_mac_cmd
);
18455 install_element(CONFIG_NODE
, &no_bgp_local_mac_cmd
);
18457 /* "bgp suppress-fib-pending" global */
18458 install_element(CONFIG_NODE
, &bgp_global_suppress_fib_pending_cmd
);
18460 /* bgp route-map delay-timer commands. */
18461 install_element(CONFIG_NODE
, &bgp_set_route_map_delay_timer_cmd
);
18462 install_element(CONFIG_NODE
, &no_bgp_set_route_map_delay_timer_cmd
);
18464 install_element(BGP_NODE
, &bgp_allow_martian_cmd
);
18466 /* bgp fast-convergence command */
18467 install_element(BGP_NODE
, &bgp_fast_convergence_cmd
);
18468 install_element(BGP_NODE
, &no_bgp_fast_convergence_cmd
);
18470 /* global bgp update-delay command */
18471 install_element(CONFIG_NODE
, &bgp_global_update_delay_cmd
);
18472 install_element(CONFIG_NODE
, &no_bgp_global_update_delay_cmd
);
18474 /* global bgp graceful-shutdown command */
18475 install_element(CONFIG_NODE
, &bgp_graceful_shutdown_cmd
);
18476 install_element(CONFIG_NODE
, &no_bgp_graceful_shutdown_cmd
);
18478 /* Dummy commands (Currently not supported) */
18479 install_element(BGP_NODE
, &no_synchronization_cmd
);
18480 install_element(BGP_NODE
, &no_auto_summary_cmd
);
18482 /* "router bgp" commands. */
18483 install_element(CONFIG_NODE
, &router_bgp_cmd
);
18485 /* "no router bgp" commands. */
18486 install_element(CONFIG_NODE
, &no_router_bgp_cmd
);
18488 /* "bgp session-dscp command */
18489 install_element(CONFIG_NODE
, &bgp_session_dscp_cmd
);
18490 install_element(CONFIG_NODE
, &no_bgp_session_dscp_cmd
);
18492 /* "bgp router-id" commands. */
18493 install_element(BGP_NODE
, &bgp_router_id_cmd
);
18494 install_element(BGP_NODE
, &no_bgp_router_id_cmd
);
18496 /* "bgp suppress-fib-pending" command */
18497 install_element(BGP_NODE
, &bgp_suppress_fib_pending_cmd
);
18499 /* "bgp cluster-id" commands. */
18500 install_element(BGP_NODE
, &bgp_cluster_id_cmd
);
18501 install_element(BGP_NODE
, &no_bgp_cluster_id_cmd
);
18503 /* "bgp no-rib" commands. */
18504 install_element(CONFIG_NODE
, &bgp_norib_cmd
);
18505 install_element(CONFIG_NODE
, &no_bgp_norib_cmd
);
18507 install_element(CONFIG_NODE
, &no_bgp_send_extra_data_cmd
);
18509 /* "bgp confederation" commands. */
18510 install_element(BGP_NODE
, &bgp_confederation_identifier_cmd
);
18511 install_element(BGP_NODE
, &no_bgp_confederation_identifier_cmd
);
18513 /* "bgp confederation peers" commands. */
18514 install_element(BGP_NODE
, &bgp_confederation_peers_cmd
);
18515 install_element(BGP_NODE
, &no_bgp_confederation_peers_cmd
);
18517 /* bgp max-med command */
18518 install_element(BGP_NODE
, &bgp_maxmed_admin_cmd
);
18519 install_element(BGP_NODE
, &no_bgp_maxmed_admin_cmd
);
18520 install_element(BGP_NODE
, &bgp_maxmed_admin_medv_cmd
);
18521 install_element(BGP_NODE
, &bgp_maxmed_onstartup_cmd
);
18522 install_element(BGP_NODE
, &no_bgp_maxmed_onstartup_cmd
);
18524 /* "neighbor role" commands. */
18525 install_element(BGP_NODE
, &neighbor_role_cmd
);
18526 install_element(BGP_NODE
, &neighbor_role_strict_cmd
);
18527 install_element(BGP_NODE
, &no_neighbor_role_cmd
);
18529 /* bgp disable-ebgp-connected-nh-check */
18530 install_element(BGP_NODE
, &bgp_disable_connected_route_check_cmd
);
18531 install_element(BGP_NODE
, &no_bgp_disable_connected_route_check_cmd
);
18533 /* bgp update-delay command */
18534 install_element(BGP_NODE
, &bgp_update_delay_cmd
);
18535 install_element(BGP_NODE
, &no_bgp_update_delay_cmd
);
18537 install_element(BGP_NODE
, &bgp_wpkt_quanta_cmd
);
18538 install_element(BGP_NODE
, &bgp_rpkt_quanta_cmd
);
18540 install_element(BGP_NODE
, &bgp_coalesce_time_cmd
);
18541 install_element(BGP_NODE
, &no_bgp_coalesce_time_cmd
);
18543 /* "maximum-paths" commands. */
18544 install_element(BGP_NODE
, &bgp_maxpaths_hidden_cmd
);
18545 install_element(BGP_NODE
, &no_bgp_maxpaths_hidden_cmd
);
18546 install_element(BGP_IPV4_NODE
, &bgp_maxpaths_cmd
);
18547 install_element(BGP_IPV4_NODE
, &no_bgp_maxpaths_cmd
);
18548 install_element(BGP_IPV6_NODE
, &bgp_maxpaths_cmd
);
18549 install_element(BGP_IPV6_NODE
, &no_bgp_maxpaths_cmd
);
18550 install_element(BGP_NODE
, &bgp_maxpaths_ibgp_hidden_cmd
);
18551 install_element(BGP_NODE
, &bgp_maxpaths_ibgp_cluster_hidden_cmd
);
18552 install_element(BGP_NODE
, &no_bgp_maxpaths_ibgp_hidden_cmd
);
18553 install_element(BGP_IPV4_NODE
, &bgp_maxpaths_ibgp_cmd
);
18554 install_element(BGP_IPV4_NODE
, &bgp_maxpaths_ibgp_cluster_cmd
);
18555 install_element(BGP_IPV4_NODE
, &no_bgp_maxpaths_ibgp_cmd
);
18556 install_element(BGP_IPV6_NODE
, &bgp_maxpaths_ibgp_cmd
);
18557 install_element(BGP_IPV6_NODE
, &bgp_maxpaths_ibgp_cluster_cmd
);
18558 install_element(BGP_IPV6_NODE
, &no_bgp_maxpaths_ibgp_cmd
);
18560 install_element(BGP_IPV4L_NODE
, &bgp_maxpaths_cmd
);
18561 install_element(BGP_IPV4L_NODE
, &no_bgp_maxpaths_cmd
);
18562 install_element(BGP_IPV4L_NODE
, &bgp_maxpaths_ibgp_cmd
);
18563 install_element(BGP_IPV4L_NODE
, &bgp_maxpaths_ibgp_cluster_cmd
);
18564 install_element(BGP_IPV4L_NODE
, &no_bgp_maxpaths_ibgp_cmd
);
18565 install_element(BGP_IPV6L_NODE
, &bgp_maxpaths_cmd
);
18566 install_element(BGP_IPV6L_NODE
, &no_bgp_maxpaths_cmd
);
18567 install_element(BGP_IPV6L_NODE
, &bgp_maxpaths_ibgp_cmd
);
18568 install_element(BGP_IPV6L_NODE
, &bgp_maxpaths_ibgp_cluster_cmd
);
18569 install_element(BGP_IPV6L_NODE
, &no_bgp_maxpaths_ibgp_cmd
);
18571 /* "timers bgp" commands. */
18572 install_element(BGP_NODE
, &bgp_timers_cmd
);
18573 install_element(BGP_NODE
, &no_bgp_timers_cmd
);
18575 /* "minimum-holdtime" commands. */
18576 install_element(BGP_NODE
, &bgp_minimum_holdtime_cmd
);
18577 install_element(BGP_NODE
, &no_bgp_minimum_holdtime_cmd
);
18579 /* route-map delay-timer commands - per instance for backwards compat.
18581 install_element(BGP_NODE
, &bgp_set_route_map_delay_timer_cmd
);
18582 install_element(BGP_NODE
, &no_bgp_set_route_map_delay_timer_cmd
);
18584 /* "bgp client-to-client reflection" commands */
18585 install_element(BGP_NODE
, &no_bgp_client_to_client_reflection_cmd
);
18586 install_element(BGP_NODE
, &bgp_client_to_client_reflection_cmd
);
18588 /* "bgp always-compare-med" commands */
18589 install_element(BGP_NODE
, &bgp_always_compare_med_cmd
);
18590 install_element(BGP_NODE
, &no_bgp_always_compare_med_cmd
);
18592 /* bgp ebgp-requires-policy */
18593 install_element(BGP_NODE
, &bgp_ebgp_requires_policy_cmd
);
18594 install_element(BGP_NODE
, &no_bgp_ebgp_requires_policy_cmd
);
18596 /* bgp suppress-duplicates */
18597 install_element(BGP_NODE
, &bgp_suppress_duplicates_cmd
);
18598 install_element(BGP_NODE
, &no_bgp_suppress_duplicates_cmd
);
18600 /* bgp reject-as-sets */
18601 install_element(BGP_NODE
, &bgp_reject_as_sets_cmd
);
18602 install_element(BGP_NODE
, &no_bgp_reject_as_sets_cmd
);
18604 /* "bgp deterministic-med" commands */
18605 install_element(BGP_NODE
, &bgp_deterministic_med_cmd
);
18606 install_element(BGP_NODE
, &no_bgp_deterministic_med_cmd
);
18608 /* "bgp graceful-restart" command */
18609 install_element(BGP_NODE
, &bgp_graceful_restart_cmd
);
18610 install_element(BGP_NODE
, &no_bgp_graceful_restart_cmd
);
18612 /* "bgp graceful-restart-disable" command */
18613 install_element(BGP_NODE
, &bgp_graceful_restart_disable_cmd
);
18614 install_element(BGP_NODE
, &no_bgp_graceful_restart_disable_cmd
);
18616 /* "neighbor a:b:c:d graceful-restart" command */
18617 install_element(BGP_NODE
, &bgp_neighbor_graceful_restart_set_cmd
);
18618 install_element(BGP_NODE
, &no_bgp_neighbor_graceful_restart_set_cmd
);
18620 /* "neighbor a:b:c:d graceful-restart-disable" command */
18621 install_element(BGP_NODE
,
18622 &bgp_neighbor_graceful_restart_disable_set_cmd
);
18623 install_element(BGP_NODE
,
18624 &no_bgp_neighbor_graceful_restart_disable_set_cmd
);
18626 /* "neighbor a:b:c:d graceful-restart-helper" command */
18627 install_element(BGP_NODE
,
18628 &bgp_neighbor_graceful_restart_helper_set_cmd
);
18629 install_element(BGP_NODE
,
18630 &no_bgp_neighbor_graceful_restart_helper_set_cmd
);
18632 install_element(BGP_NODE
, &bgp_graceful_restart_stalepath_time_cmd
);
18633 install_element(BGP_NODE
, &no_bgp_graceful_restart_stalepath_time_cmd
);
18634 install_element(BGP_NODE
, &bgp_graceful_restart_restart_time_cmd
);
18635 install_element(BGP_NODE
, &no_bgp_graceful_restart_restart_time_cmd
);
18636 install_element(BGP_NODE
, &bgp_graceful_restart_select_defer_time_cmd
);
18637 install_element(BGP_NODE
,
18638 &no_bgp_graceful_restart_select_defer_time_cmd
);
18639 install_element(BGP_NODE
, &bgp_graceful_restart_preserve_fw_cmd
);
18640 install_element(BGP_NODE
, &no_bgp_graceful_restart_preserve_fw_cmd
);
18641 install_element(BGP_NODE
, &bgp_graceful_restart_notification_cmd
);
18643 install_element(BGP_NODE
, &bgp_graceful_restart_disable_eor_cmd
);
18644 install_element(BGP_NODE
, &no_bgp_graceful_restart_disable_eor_cmd
);
18645 install_element(BGP_NODE
, &bgp_graceful_restart_rib_stale_time_cmd
);
18646 install_element(BGP_NODE
, &no_bgp_graceful_restart_rib_stale_time_cmd
);
18648 /* "bgp graceful-shutdown" commands */
18649 install_element(BGP_NODE
, &bgp_graceful_shutdown_cmd
);
18650 install_element(BGP_NODE
, &no_bgp_graceful_shutdown_cmd
);
18652 /* "bgp hard-administrative-reset" commands */
18653 install_element(BGP_NODE
, &bgp_administrative_reset_cmd
);
18655 /* "bgp long-lived-graceful-restart" commands */
18656 install_element(BGP_NODE
, &bgp_llgr_stalepath_time_cmd
);
18657 install_element(BGP_NODE
, &no_bgp_llgr_stalepath_time_cmd
);
18659 /* "bgp fast-external-failover" commands */
18660 install_element(BGP_NODE
, &bgp_fast_external_failover_cmd
);
18661 install_element(BGP_NODE
, &no_bgp_fast_external_failover_cmd
);
18663 /* "bgp bestpath compare-routerid" commands */
18664 install_element(BGP_NODE
, &bgp_bestpath_compare_router_id_cmd
);
18665 install_element(BGP_NODE
, &no_bgp_bestpath_compare_router_id_cmd
);
18667 /* "bgp bestpath as-path ignore" commands */
18668 install_element(BGP_NODE
, &bgp_bestpath_aspath_ignore_cmd
);
18669 install_element(BGP_NODE
, &no_bgp_bestpath_aspath_ignore_cmd
);
18671 /* "bgp bestpath as-path confed" commands */
18672 install_element(BGP_NODE
, &bgp_bestpath_aspath_confed_cmd
);
18673 install_element(BGP_NODE
, &no_bgp_bestpath_aspath_confed_cmd
);
18675 /* "bgp bestpath as-path multipath-relax" commands */
18676 install_element(BGP_NODE
, &bgp_bestpath_aspath_multipath_relax_cmd
);
18677 install_element(BGP_NODE
, &no_bgp_bestpath_aspath_multipath_relax_cmd
);
18679 /* "bgp bestpath peer-type multipath-relax" commands */
18680 install_element(BGP_NODE
, &bgp_bestpath_peer_type_multipath_relax_cmd
);
18681 install_element(BGP_NODE
,
18682 &no_bgp_bestpath_peer_type_multipath_relax_cmd
);
18684 /* "bgp log-neighbor-changes" commands */
18685 install_element(BGP_NODE
, &bgp_log_neighbor_changes_cmd
);
18686 install_element(BGP_NODE
, &no_bgp_log_neighbor_changes_cmd
);
18688 /* "bgp bestpath med" commands */
18689 install_element(BGP_NODE
, &bgp_bestpath_med_cmd
);
18690 install_element(BGP_NODE
, &no_bgp_bestpath_med_cmd
);
18692 /* "bgp bestpath bandwidth" commands */
18693 install_element(BGP_NODE
, &bgp_bestpath_bw_cmd
);
18694 install_element(BGP_NODE
, &no_bgp_bestpath_bw_cmd
);
18696 /* "no bgp default <afi>-<safi>" commands. */
18697 install_element(BGP_NODE
, &bgp_default_afi_safi_cmd
);
18699 /* "bgp network import-check" commands. */
18700 install_element(BGP_NODE
, &bgp_network_import_check_cmd
);
18701 install_element(BGP_NODE
, &bgp_network_import_check_exact_cmd
);
18702 install_element(BGP_NODE
, &no_bgp_network_import_check_cmd
);
18704 /* "bgp default local-preference" commands. */
18705 install_element(BGP_NODE
, &bgp_default_local_preference_cmd
);
18706 install_element(BGP_NODE
, &no_bgp_default_local_preference_cmd
);
18708 /* bgp default show-hostname */
18709 install_element(BGP_NODE
, &bgp_default_show_hostname_cmd
);
18710 install_element(BGP_NODE
, &no_bgp_default_show_hostname_cmd
);
18712 /* bgp default show-nexthop-hostname */
18713 install_element(BGP_NODE
, &bgp_default_show_nexthop_hostname_cmd
);
18714 install_element(BGP_NODE
, &no_bgp_default_show_nexthop_hostname_cmd
);
18716 /* "bgp default subgroup-pkt-queue-max" commands. */
18717 install_element(BGP_NODE
, &bgp_default_subgroup_pkt_queue_max_cmd
);
18718 install_element(BGP_NODE
, &no_bgp_default_subgroup_pkt_queue_max_cmd
);
18720 /* bgp ibgp-allow-policy-mods command */
18721 install_element(BGP_NODE
, &bgp_rr_allow_outbound_policy_cmd
);
18722 install_element(BGP_NODE
, &no_bgp_rr_allow_outbound_policy_cmd
);
18724 /* "bgp listen limit" commands. */
18725 install_element(BGP_NODE
, &bgp_listen_limit_cmd
);
18726 install_element(BGP_NODE
, &no_bgp_listen_limit_cmd
);
18728 /* "bgp listen range" commands. */
18729 install_element(BGP_NODE
, &bgp_listen_range_cmd
);
18730 install_element(BGP_NODE
, &no_bgp_listen_range_cmd
);
18732 /* "bgp default shutdown" command */
18733 install_element(BGP_NODE
, &bgp_default_shutdown_cmd
);
18735 /* "bgp shutdown" commands */
18736 install_element(BGP_NODE
, &bgp_shutdown_cmd
);
18737 install_element(BGP_NODE
, &bgp_shutdown_msg_cmd
);
18738 install_element(BGP_NODE
, &no_bgp_shutdown_cmd
);
18739 install_element(BGP_NODE
, &no_bgp_shutdown_msg_cmd
);
18741 /* "neighbor remote-as" commands. */
18742 install_element(BGP_NODE
, &neighbor_remote_as_cmd
);
18743 install_element(BGP_NODE
, &neighbor_interface_config_cmd
);
18744 install_element(BGP_NODE
, &neighbor_interface_config_v6only_cmd
);
18745 install_element(BGP_NODE
, &neighbor_interface_config_remote_as_cmd
);
18746 install_element(BGP_NODE
,
18747 &neighbor_interface_v6only_config_remote_as_cmd
);
18748 install_element(BGP_NODE
, &no_neighbor_cmd
);
18749 install_element(BGP_NODE
, &no_neighbor_interface_config_cmd
);
18751 /* "neighbor peer-group" commands. */
18752 install_element(BGP_NODE
, &neighbor_peer_group_cmd
);
18753 install_element(BGP_NODE
, &no_neighbor_peer_group_cmd
);
18754 install_element(BGP_NODE
,
18755 &no_neighbor_interface_peer_group_remote_as_cmd
);
18757 /* "neighbor local-as" commands. */
18758 install_element(BGP_NODE
, &neighbor_local_as_cmd
);
18759 install_element(BGP_NODE
, &neighbor_local_as_no_prepend_cmd
);
18760 install_element(BGP_NODE
, &neighbor_local_as_no_prepend_replace_as_cmd
);
18761 install_element(BGP_NODE
, &no_neighbor_local_as_cmd
);
18763 /* "neighbor solo" commands. */
18764 install_element(BGP_NODE
, &neighbor_solo_cmd
);
18765 install_element(BGP_NODE
, &no_neighbor_solo_cmd
);
18767 /* "neighbor password" commands. */
18768 install_element(BGP_NODE
, &neighbor_password_cmd
);
18769 install_element(BGP_NODE
, &no_neighbor_password_cmd
);
18771 /* "neighbor activate" commands. */
18772 install_element(BGP_NODE
, &neighbor_activate_hidden_cmd
);
18773 install_element(BGP_IPV4_NODE
, &neighbor_activate_cmd
);
18774 install_element(BGP_IPV4M_NODE
, &neighbor_activate_cmd
);
18775 install_element(BGP_IPV4L_NODE
, &neighbor_activate_cmd
);
18776 install_element(BGP_IPV6_NODE
, &neighbor_activate_cmd
);
18777 install_element(BGP_IPV6M_NODE
, &neighbor_activate_cmd
);
18778 install_element(BGP_IPV6L_NODE
, &neighbor_activate_cmd
);
18779 install_element(BGP_VPNV4_NODE
, &neighbor_activate_cmd
);
18780 install_element(BGP_VPNV6_NODE
, &neighbor_activate_cmd
);
18781 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_activate_cmd
);
18782 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_activate_cmd
);
18783 install_element(BGP_EVPN_NODE
, &neighbor_activate_cmd
);
18785 /* "no neighbor activate" commands. */
18786 install_element(BGP_NODE
, &no_neighbor_activate_hidden_cmd
);
18787 install_element(BGP_IPV4_NODE
, &no_neighbor_activate_cmd
);
18788 install_element(BGP_IPV4M_NODE
, &no_neighbor_activate_cmd
);
18789 install_element(BGP_IPV4L_NODE
, &no_neighbor_activate_cmd
);
18790 install_element(BGP_IPV6_NODE
, &no_neighbor_activate_cmd
);
18791 install_element(BGP_IPV6M_NODE
, &no_neighbor_activate_cmd
);
18792 install_element(BGP_IPV6L_NODE
, &no_neighbor_activate_cmd
);
18793 install_element(BGP_VPNV4_NODE
, &no_neighbor_activate_cmd
);
18794 install_element(BGP_VPNV6_NODE
, &no_neighbor_activate_cmd
);
18795 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_activate_cmd
);
18796 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_activate_cmd
);
18797 install_element(BGP_EVPN_NODE
, &no_neighbor_activate_cmd
);
18799 /* "neighbor peer-group" set commands. */
18800 install_element(BGP_NODE
, &neighbor_set_peer_group_cmd
);
18801 install_element(BGP_IPV4_NODE
, &neighbor_set_peer_group_hidden_cmd
);
18802 install_element(BGP_IPV4M_NODE
, &neighbor_set_peer_group_hidden_cmd
);
18803 install_element(BGP_IPV6_NODE
, &neighbor_set_peer_group_hidden_cmd
);
18804 install_element(BGP_IPV6M_NODE
, &neighbor_set_peer_group_hidden_cmd
);
18805 install_element(BGP_IPV6L_NODE
, &neighbor_set_peer_group_hidden_cmd
);
18806 install_element(BGP_VPNV4_NODE
, &neighbor_set_peer_group_hidden_cmd
);
18807 install_element(BGP_VPNV6_NODE
, &neighbor_set_peer_group_hidden_cmd
);
18808 install_element(BGP_FLOWSPECV4_NODE
,
18809 &neighbor_set_peer_group_hidden_cmd
);
18810 install_element(BGP_FLOWSPECV6_NODE
,
18811 &neighbor_set_peer_group_hidden_cmd
);
18813 /* "no neighbor peer-group unset" commands. */
18814 install_element(BGP_NODE
, &no_neighbor_set_peer_group_cmd
);
18815 install_element(BGP_IPV4_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
18816 install_element(BGP_IPV4M_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
18817 install_element(BGP_IPV6_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
18818 install_element(BGP_IPV6M_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
18819 install_element(BGP_IPV6L_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
18820 install_element(BGP_VPNV4_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
18821 install_element(BGP_VPNV6_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
18822 install_element(BGP_FLOWSPECV4_NODE
,
18823 &no_neighbor_set_peer_group_hidden_cmd
);
18824 install_element(BGP_FLOWSPECV6_NODE
,
18825 &no_neighbor_set_peer_group_hidden_cmd
);
18827 /* "neighbor softreconfiguration inbound" commands.*/
18828 install_element(BGP_NODE
, &neighbor_soft_reconfiguration_hidden_cmd
);
18829 install_element(BGP_NODE
, &no_neighbor_soft_reconfiguration_hidden_cmd
);
18830 install_element(BGP_IPV4_NODE
, &neighbor_soft_reconfiguration_cmd
);
18831 install_element(BGP_IPV4_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
18832 install_element(BGP_IPV4L_NODE
, &neighbor_soft_reconfiguration_cmd
);
18833 install_element(BGP_IPV4L_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
18834 install_element(BGP_IPV4M_NODE
, &neighbor_soft_reconfiguration_cmd
);
18835 install_element(BGP_IPV4M_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
18836 install_element(BGP_IPV6_NODE
, &neighbor_soft_reconfiguration_cmd
);
18837 install_element(BGP_IPV6_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
18838 install_element(BGP_IPV6M_NODE
, &neighbor_soft_reconfiguration_cmd
);
18839 install_element(BGP_IPV6M_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
18840 install_element(BGP_IPV6L_NODE
, &neighbor_soft_reconfiguration_cmd
);
18841 install_element(BGP_IPV6L_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
18842 install_element(BGP_VPNV4_NODE
, &neighbor_soft_reconfiguration_cmd
);
18843 install_element(BGP_VPNV4_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
18844 install_element(BGP_VPNV6_NODE
, &neighbor_soft_reconfiguration_cmd
);
18845 install_element(BGP_VPNV6_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
18846 install_element(BGP_FLOWSPECV4_NODE
,
18847 &neighbor_soft_reconfiguration_cmd
);
18848 install_element(BGP_FLOWSPECV4_NODE
,
18849 &no_neighbor_soft_reconfiguration_cmd
);
18850 install_element(BGP_FLOWSPECV6_NODE
,
18851 &neighbor_soft_reconfiguration_cmd
);
18852 install_element(BGP_FLOWSPECV6_NODE
,
18853 &no_neighbor_soft_reconfiguration_cmd
);
18854 install_element(BGP_EVPN_NODE
, &neighbor_soft_reconfiguration_cmd
);
18855 install_element(BGP_EVPN_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
18857 /* "neighbor attribute-unchanged" commands. */
18858 install_element(BGP_NODE
, &neighbor_attr_unchanged_hidden_cmd
);
18859 install_element(BGP_NODE
, &no_neighbor_attr_unchanged_hidden_cmd
);
18860 install_element(BGP_IPV4_NODE
, &neighbor_attr_unchanged_cmd
);
18861 install_element(BGP_IPV4_NODE
, &no_neighbor_attr_unchanged_cmd
);
18862 install_element(BGP_IPV4M_NODE
, &neighbor_attr_unchanged_cmd
);
18863 install_element(BGP_IPV4M_NODE
, &no_neighbor_attr_unchanged_cmd
);
18864 install_element(BGP_IPV4L_NODE
, &neighbor_attr_unchanged_cmd
);
18865 install_element(BGP_IPV4L_NODE
, &no_neighbor_attr_unchanged_cmd
);
18866 install_element(BGP_IPV6_NODE
, &neighbor_attr_unchanged_cmd
);
18867 install_element(BGP_IPV6_NODE
, &no_neighbor_attr_unchanged_cmd
);
18868 install_element(BGP_IPV6M_NODE
, &neighbor_attr_unchanged_cmd
);
18869 install_element(BGP_IPV6M_NODE
, &no_neighbor_attr_unchanged_cmd
);
18870 install_element(BGP_IPV6L_NODE
, &neighbor_attr_unchanged_cmd
);
18871 install_element(BGP_IPV6L_NODE
, &no_neighbor_attr_unchanged_cmd
);
18872 install_element(BGP_VPNV4_NODE
, &neighbor_attr_unchanged_cmd
);
18873 install_element(BGP_VPNV4_NODE
, &no_neighbor_attr_unchanged_cmd
);
18874 install_element(BGP_VPNV6_NODE
, &neighbor_attr_unchanged_cmd
);
18875 install_element(BGP_VPNV6_NODE
, &no_neighbor_attr_unchanged_cmd
);
18877 install_element(BGP_EVPN_NODE
, &neighbor_attr_unchanged_cmd
);
18878 install_element(BGP_EVPN_NODE
, &no_neighbor_attr_unchanged_cmd
);
18880 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_attr_unchanged_cmd
);
18881 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_attr_unchanged_cmd
);
18882 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_attr_unchanged_cmd
);
18883 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_attr_unchanged_cmd
);
18885 /* "nexthop-local unchanged" commands */
18886 install_element(BGP_IPV6_NODE
, &neighbor_nexthop_local_unchanged_cmd
);
18887 install_element(BGP_IPV6_NODE
,
18888 &no_neighbor_nexthop_local_unchanged_cmd
);
18890 /* "neighbor next-hop-self" commands. */
18891 install_element(BGP_NODE
, &neighbor_nexthop_self_hidden_cmd
);
18892 install_element(BGP_NODE
, &no_neighbor_nexthop_self_hidden_cmd
);
18893 install_element(BGP_IPV4_NODE
, &neighbor_nexthop_self_cmd
);
18894 install_element(BGP_IPV4_NODE
, &no_neighbor_nexthop_self_cmd
);
18895 install_element(BGP_IPV4M_NODE
, &neighbor_nexthop_self_cmd
);
18896 install_element(BGP_IPV4M_NODE
, &no_neighbor_nexthop_self_cmd
);
18897 install_element(BGP_IPV4L_NODE
, &neighbor_nexthop_self_cmd
);
18898 install_element(BGP_IPV4L_NODE
, &no_neighbor_nexthop_self_cmd
);
18899 install_element(BGP_IPV6_NODE
, &neighbor_nexthop_self_cmd
);
18900 install_element(BGP_IPV6_NODE
, &no_neighbor_nexthop_self_cmd
);
18901 install_element(BGP_IPV6M_NODE
, &neighbor_nexthop_self_cmd
);
18902 install_element(BGP_IPV6M_NODE
, &no_neighbor_nexthop_self_cmd
);
18903 install_element(BGP_IPV6L_NODE
, &neighbor_nexthop_self_cmd
);
18904 install_element(BGP_IPV6L_NODE
, &no_neighbor_nexthop_self_cmd
);
18905 install_element(BGP_VPNV4_NODE
, &neighbor_nexthop_self_cmd
);
18906 install_element(BGP_VPNV4_NODE
, &no_neighbor_nexthop_self_cmd
);
18907 install_element(BGP_VPNV6_NODE
, &neighbor_nexthop_self_cmd
);
18908 install_element(BGP_VPNV6_NODE
, &no_neighbor_nexthop_self_cmd
);
18909 install_element(BGP_EVPN_NODE
, &neighbor_nexthop_self_cmd
);
18910 install_element(BGP_EVPN_NODE
, &no_neighbor_nexthop_self_cmd
);
18912 /* "neighbor next-hop-self force" commands. */
18913 install_element(BGP_NODE
, &neighbor_nexthop_self_force_hidden_cmd
);
18914 install_element(BGP_NODE
, &no_neighbor_nexthop_self_force_hidden_cmd
);
18915 install_element(BGP_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
18916 install_element(BGP_NODE
, &no_neighbor_nexthop_self_all_hidden_cmd
);
18917 install_element(BGP_IPV4_NODE
, &neighbor_nexthop_self_force_cmd
);
18918 install_element(BGP_IPV4_NODE
, &no_neighbor_nexthop_self_force_cmd
);
18919 install_element(BGP_IPV4_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
18920 install_element(BGP_IPV4_NODE
,
18921 &no_neighbor_nexthop_self_all_hidden_cmd
);
18922 install_element(BGP_IPV4M_NODE
, &neighbor_nexthop_self_force_cmd
);
18923 install_element(BGP_IPV4M_NODE
, &no_neighbor_nexthop_self_force_cmd
);
18924 install_element(BGP_IPV4M_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
18925 install_element(BGP_IPV4M_NODE
,
18926 &no_neighbor_nexthop_self_all_hidden_cmd
);
18927 install_element(BGP_IPV4L_NODE
, &neighbor_nexthop_self_force_cmd
);
18928 install_element(BGP_IPV4L_NODE
, &no_neighbor_nexthop_self_force_cmd
);
18929 install_element(BGP_IPV4L_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
18930 install_element(BGP_IPV4L_NODE
,
18931 &no_neighbor_nexthop_self_all_hidden_cmd
);
18932 install_element(BGP_IPV6_NODE
, &neighbor_nexthop_self_force_cmd
);
18933 install_element(BGP_IPV6_NODE
, &no_neighbor_nexthop_self_force_cmd
);
18934 install_element(BGP_IPV6_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
18935 install_element(BGP_IPV6_NODE
,
18936 &no_neighbor_nexthop_self_all_hidden_cmd
);
18937 install_element(BGP_IPV6M_NODE
, &neighbor_nexthop_self_force_cmd
);
18938 install_element(BGP_IPV6M_NODE
, &no_neighbor_nexthop_self_force_cmd
);
18939 install_element(BGP_IPV6M_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
18940 install_element(BGP_IPV6M_NODE
,
18941 &no_neighbor_nexthop_self_all_hidden_cmd
);
18942 install_element(BGP_IPV6L_NODE
, &neighbor_nexthop_self_force_cmd
);
18943 install_element(BGP_IPV6L_NODE
, &no_neighbor_nexthop_self_force_cmd
);
18944 install_element(BGP_IPV6L_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
18945 install_element(BGP_IPV6L_NODE
,
18946 &no_neighbor_nexthop_self_all_hidden_cmd
);
18947 install_element(BGP_VPNV4_NODE
, &neighbor_nexthop_self_force_cmd
);
18948 install_element(BGP_VPNV4_NODE
, &no_neighbor_nexthop_self_force_cmd
);
18949 install_element(BGP_VPNV4_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
18950 install_element(BGP_VPNV4_NODE
,
18951 &no_neighbor_nexthop_self_all_hidden_cmd
);
18952 install_element(BGP_VPNV6_NODE
, &neighbor_nexthop_self_force_cmd
);
18953 install_element(BGP_VPNV6_NODE
, &no_neighbor_nexthop_self_force_cmd
);
18954 install_element(BGP_VPNV6_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
18955 install_element(BGP_VPNV6_NODE
,
18956 &no_neighbor_nexthop_self_all_hidden_cmd
);
18957 install_element(BGP_EVPN_NODE
, &neighbor_nexthop_self_force_cmd
);
18958 install_element(BGP_EVPN_NODE
, &no_neighbor_nexthop_self_force_cmd
);
18960 /* "neighbor as-override" commands. */
18961 install_element(BGP_NODE
, &neighbor_as_override_hidden_cmd
);
18962 install_element(BGP_NODE
, &no_neighbor_as_override_hidden_cmd
);
18963 install_element(BGP_IPV4_NODE
, &neighbor_as_override_cmd
);
18964 install_element(BGP_IPV4_NODE
, &no_neighbor_as_override_cmd
);
18965 install_element(BGP_IPV4M_NODE
, &neighbor_as_override_cmd
);
18966 install_element(BGP_IPV4M_NODE
, &no_neighbor_as_override_cmd
);
18967 install_element(BGP_IPV4L_NODE
, &neighbor_as_override_cmd
);
18968 install_element(BGP_IPV4L_NODE
, &no_neighbor_as_override_cmd
);
18969 install_element(BGP_IPV6_NODE
, &neighbor_as_override_cmd
);
18970 install_element(BGP_IPV6_NODE
, &no_neighbor_as_override_cmd
);
18971 install_element(BGP_IPV6M_NODE
, &neighbor_as_override_cmd
);
18972 install_element(BGP_IPV6M_NODE
, &no_neighbor_as_override_cmd
);
18973 install_element(BGP_IPV6L_NODE
, &neighbor_as_override_cmd
);
18974 install_element(BGP_IPV6L_NODE
, &no_neighbor_as_override_cmd
);
18975 install_element(BGP_VPNV4_NODE
, &neighbor_as_override_cmd
);
18976 install_element(BGP_VPNV4_NODE
, &no_neighbor_as_override_cmd
);
18977 install_element(BGP_VPNV6_NODE
, &neighbor_as_override_cmd
);
18978 install_element(BGP_VPNV6_NODE
, &no_neighbor_as_override_cmd
);
18980 /* "neighbor remove-private-AS" commands. */
18981 install_element(BGP_NODE
, &neighbor_remove_private_as_hidden_cmd
);
18982 install_element(BGP_NODE
, &no_neighbor_remove_private_as_hidden_cmd
);
18983 install_element(BGP_NODE
, &neighbor_remove_private_as_all_hidden_cmd
);
18984 install_element(BGP_NODE
,
18985 &no_neighbor_remove_private_as_all_hidden_cmd
);
18986 install_element(BGP_NODE
,
18987 &neighbor_remove_private_as_replace_as_hidden_cmd
);
18988 install_element(BGP_NODE
,
18989 &no_neighbor_remove_private_as_replace_as_hidden_cmd
);
18990 install_element(BGP_NODE
,
18991 &neighbor_remove_private_as_all_replace_as_hidden_cmd
);
18994 &no_neighbor_remove_private_as_all_replace_as_hidden_cmd
);
18995 install_element(BGP_IPV4_NODE
, &neighbor_remove_private_as_cmd
);
18996 install_element(BGP_IPV4_NODE
, &no_neighbor_remove_private_as_cmd
);
18997 install_element(BGP_IPV4_NODE
, &neighbor_remove_private_as_all_cmd
);
18998 install_element(BGP_IPV4_NODE
, &no_neighbor_remove_private_as_all_cmd
);
18999 install_element(BGP_IPV4_NODE
,
19000 &neighbor_remove_private_as_replace_as_cmd
);
19001 install_element(BGP_IPV4_NODE
,
19002 &no_neighbor_remove_private_as_replace_as_cmd
);
19003 install_element(BGP_IPV4_NODE
,
19004 &neighbor_remove_private_as_all_replace_as_cmd
);
19005 install_element(BGP_IPV4_NODE
,
19006 &no_neighbor_remove_private_as_all_replace_as_cmd
);
19007 install_element(BGP_IPV4M_NODE
, &neighbor_remove_private_as_cmd
);
19008 install_element(BGP_IPV4M_NODE
, &no_neighbor_remove_private_as_cmd
);
19009 install_element(BGP_IPV4M_NODE
, &neighbor_remove_private_as_all_cmd
);
19010 install_element(BGP_IPV4M_NODE
, &no_neighbor_remove_private_as_all_cmd
);
19011 install_element(BGP_IPV4M_NODE
,
19012 &neighbor_remove_private_as_replace_as_cmd
);
19013 install_element(BGP_IPV4M_NODE
,
19014 &no_neighbor_remove_private_as_replace_as_cmd
);
19015 install_element(BGP_IPV4M_NODE
,
19016 &neighbor_remove_private_as_all_replace_as_cmd
);
19017 install_element(BGP_IPV4M_NODE
,
19018 &no_neighbor_remove_private_as_all_replace_as_cmd
);
19019 install_element(BGP_IPV4L_NODE
, &neighbor_remove_private_as_cmd
);
19020 install_element(BGP_IPV4L_NODE
, &no_neighbor_remove_private_as_cmd
);
19021 install_element(BGP_IPV4L_NODE
, &neighbor_remove_private_as_all_cmd
);
19022 install_element(BGP_IPV4L_NODE
, &no_neighbor_remove_private_as_all_cmd
);
19023 install_element(BGP_IPV4L_NODE
,
19024 &neighbor_remove_private_as_replace_as_cmd
);
19025 install_element(BGP_IPV4L_NODE
,
19026 &no_neighbor_remove_private_as_replace_as_cmd
);
19027 install_element(BGP_IPV4L_NODE
,
19028 &neighbor_remove_private_as_all_replace_as_cmd
);
19029 install_element(BGP_IPV4L_NODE
,
19030 &no_neighbor_remove_private_as_all_replace_as_cmd
);
19031 install_element(BGP_IPV6_NODE
, &neighbor_remove_private_as_cmd
);
19032 install_element(BGP_IPV6_NODE
, &no_neighbor_remove_private_as_cmd
);
19033 install_element(BGP_IPV6_NODE
, &neighbor_remove_private_as_all_cmd
);
19034 install_element(BGP_IPV6_NODE
, &no_neighbor_remove_private_as_all_cmd
);
19035 install_element(BGP_IPV6_NODE
,
19036 &neighbor_remove_private_as_replace_as_cmd
);
19037 install_element(BGP_IPV6_NODE
,
19038 &no_neighbor_remove_private_as_replace_as_cmd
);
19039 install_element(BGP_IPV6_NODE
,
19040 &neighbor_remove_private_as_all_replace_as_cmd
);
19041 install_element(BGP_IPV6_NODE
,
19042 &no_neighbor_remove_private_as_all_replace_as_cmd
);
19043 install_element(BGP_IPV6M_NODE
, &neighbor_remove_private_as_cmd
);
19044 install_element(BGP_IPV6M_NODE
, &no_neighbor_remove_private_as_cmd
);
19045 install_element(BGP_IPV6M_NODE
, &neighbor_remove_private_as_all_cmd
);
19046 install_element(BGP_IPV6M_NODE
, &no_neighbor_remove_private_as_all_cmd
);
19047 install_element(BGP_IPV6M_NODE
,
19048 &neighbor_remove_private_as_replace_as_cmd
);
19049 install_element(BGP_IPV6M_NODE
,
19050 &no_neighbor_remove_private_as_replace_as_cmd
);
19051 install_element(BGP_IPV6M_NODE
,
19052 &neighbor_remove_private_as_all_replace_as_cmd
);
19053 install_element(BGP_IPV6M_NODE
,
19054 &no_neighbor_remove_private_as_all_replace_as_cmd
);
19055 install_element(BGP_IPV6L_NODE
, &neighbor_remove_private_as_cmd
);
19056 install_element(BGP_IPV6L_NODE
, &no_neighbor_remove_private_as_cmd
);
19057 install_element(BGP_IPV6L_NODE
, &neighbor_remove_private_as_all_cmd
);
19058 install_element(BGP_IPV6L_NODE
, &no_neighbor_remove_private_as_all_cmd
);
19059 install_element(BGP_IPV6L_NODE
,
19060 &neighbor_remove_private_as_replace_as_cmd
);
19061 install_element(BGP_IPV6L_NODE
,
19062 &no_neighbor_remove_private_as_replace_as_cmd
);
19063 install_element(BGP_IPV6L_NODE
,
19064 &neighbor_remove_private_as_all_replace_as_cmd
);
19065 install_element(BGP_IPV6L_NODE
,
19066 &no_neighbor_remove_private_as_all_replace_as_cmd
);
19067 install_element(BGP_VPNV4_NODE
, &neighbor_remove_private_as_cmd
);
19068 install_element(BGP_VPNV4_NODE
, &no_neighbor_remove_private_as_cmd
);
19069 install_element(BGP_VPNV4_NODE
, &neighbor_remove_private_as_all_cmd
);
19070 install_element(BGP_VPNV4_NODE
, &no_neighbor_remove_private_as_all_cmd
);
19071 install_element(BGP_VPNV4_NODE
,
19072 &neighbor_remove_private_as_replace_as_cmd
);
19073 install_element(BGP_VPNV4_NODE
,
19074 &no_neighbor_remove_private_as_replace_as_cmd
);
19075 install_element(BGP_VPNV4_NODE
,
19076 &neighbor_remove_private_as_all_replace_as_cmd
);
19077 install_element(BGP_VPNV4_NODE
,
19078 &no_neighbor_remove_private_as_all_replace_as_cmd
);
19079 install_element(BGP_VPNV6_NODE
, &neighbor_remove_private_as_cmd
);
19080 install_element(BGP_VPNV6_NODE
, &no_neighbor_remove_private_as_cmd
);
19081 install_element(BGP_VPNV6_NODE
, &neighbor_remove_private_as_all_cmd
);
19082 install_element(BGP_VPNV6_NODE
, &no_neighbor_remove_private_as_all_cmd
);
19083 install_element(BGP_VPNV6_NODE
,
19084 &neighbor_remove_private_as_replace_as_cmd
);
19085 install_element(BGP_VPNV6_NODE
,
19086 &no_neighbor_remove_private_as_replace_as_cmd
);
19087 install_element(BGP_VPNV6_NODE
,
19088 &neighbor_remove_private_as_all_replace_as_cmd
);
19089 install_element(BGP_VPNV6_NODE
,
19090 &no_neighbor_remove_private_as_all_replace_as_cmd
);
19092 /* "neighbor send-community" commands.*/
19093 install_element(BGP_NODE
, &neighbor_send_community_hidden_cmd
);
19094 install_element(BGP_NODE
, &neighbor_send_community_type_hidden_cmd
);
19095 install_element(BGP_NODE
, &no_neighbor_send_community_hidden_cmd
);
19096 install_element(BGP_NODE
, &no_neighbor_send_community_type_hidden_cmd
);
19097 install_element(BGP_IPV4_NODE
, &neighbor_send_community_cmd
);
19098 install_element(BGP_IPV4_NODE
, &neighbor_send_community_type_cmd
);
19099 install_element(BGP_IPV4_NODE
, &no_neighbor_send_community_cmd
);
19100 install_element(BGP_IPV4_NODE
, &no_neighbor_send_community_type_cmd
);
19101 install_element(BGP_IPV4M_NODE
, &neighbor_send_community_cmd
);
19102 install_element(BGP_IPV4M_NODE
, &neighbor_send_community_type_cmd
);
19103 install_element(BGP_IPV4M_NODE
, &no_neighbor_send_community_cmd
);
19104 install_element(BGP_IPV4M_NODE
, &no_neighbor_send_community_type_cmd
);
19105 install_element(BGP_IPV4L_NODE
, &neighbor_send_community_cmd
);
19106 install_element(BGP_IPV4L_NODE
, &neighbor_send_community_type_cmd
);
19107 install_element(BGP_IPV4L_NODE
, &no_neighbor_send_community_cmd
);
19108 install_element(BGP_IPV4L_NODE
, &no_neighbor_send_community_type_cmd
);
19109 install_element(BGP_IPV6_NODE
, &neighbor_send_community_cmd
);
19110 install_element(BGP_IPV6_NODE
, &neighbor_send_community_type_cmd
);
19111 install_element(BGP_IPV6_NODE
, &no_neighbor_send_community_cmd
);
19112 install_element(BGP_IPV6_NODE
, &no_neighbor_send_community_type_cmd
);
19113 install_element(BGP_IPV6M_NODE
, &neighbor_send_community_cmd
);
19114 install_element(BGP_IPV6M_NODE
, &neighbor_send_community_type_cmd
);
19115 install_element(BGP_IPV6M_NODE
, &no_neighbor_send_community_cmd
);
19116 install_element(BGP_IPV6M_NODE
, &no_neighbor_send_community_type_cmd
);
19117 install_element(BGP_IPV6L_NODE
, &neighbor_send_community_cmd
);
19118 install_element(BGP_IPV6L_NODE
, &neighbor_send_community_type_cmd
);
19119 install_element(BGP_IPV6L_NODE
, &no_neighbor_send_community_cmd
);
19120 install_element(BGP_IPV6L_NODE
, &no_neighbor_send_community_type_cmd
);
19121 install_element(BGP_VPNV4_NODE
, &neighbor_send_community_cmd
);
19122 install_element(BGP_VPNV4_NODE
, &neighbor_send_community_type_cmd
);
19123 install_element(BGP_VPNV4_NODE
, &no_neighbor_send_community_cmd
);
19124 install_element(BGP_VPNV4_NODE
, &no_neighbor_send_community_type_cmd
);
19125 install_element(BGP_VPNV6_NODE
, &neighbor_send_community_cmd
);
19126 install_element(BGP_VPNV6_NODE
, &neighbor_send_community_type_cmd
);
19127 install_element(BGP_VPNV6_NODE
, &no_neighbor_send_community_cmd
);
19128 install_element(BGP_VPNV6_NODE
, &no_neighbor_send_community_type_cmd
);
19130 /* "neighbor route-reflector" commands.*/
19131 install_element(BGP_NODE
, &neighbor_route_reflector_client_hidden_cmd
);
19132 install_element(BGP_NODE
,
19133 &no_neighbor_route_reflector_client_hidden_cmd
);
19134 install_element(BGP_IPV4_NODE
, &neighbor_route_reflector_client_cmd
);
19135 install_element(BGP_IPV4_NODE
, &no_neighbor_route_reflector_client_cmd
);
19136 install_element(BGP_IPV4M_NODE
, &neighbor_route_reflector_client_cmd
);
19137 install_element(BGP_IPV4M_NODE
,
19138 &no_neighbor_route_reflector_client_cmd
);
19139 install_element(BGP_IPV4L_NODE
, &neighbor_route_reflector_client_cmd
);
19140 install_element(BGP_IPV4L_NODE
,
19141 &no_neighbor_route_reflector_client_cmd
);
19142 install_element(BGP_IPV6_NODE
, &neighbor_route_reflector_client_cmd
);
19143 install_element(BGP_IPV6_NODE
, &no_neighbor_route_reflector_client_cmd
);
19144 install_element(BGP_IPV6M_NODE
, &neighbor_route_reflector_client_cmd
);
19145 install_element(BGP_IPV6M_NODE
,
19146 &no_neighbor_route_reflector_client_cmd
);
19147 install_element(BGP_IPV6L_NODE
, &neighbor_route_reflector_client_cmd
);
19148 install_element(BGP_IPV6L_NODE
,
19149 &no_neighbor_route_reflector_client_cmd
);
19150 install_element(BGP_VPNV4_NODE
, &neighbor_route_reflector_client_cmd
);
19151 install_element(BGP_VPNV4_NODE
,
19152 &no_neighbor_route_reflector_client_cmd
);
19153 install_element(BGP_VPNV6_NODE
, &neighbor_route_reflector_client_cmd
);
19154 install_element(BGP_VPNV6_NODE
,
19155 &no_neighbor_route_reflector_client_cmd
);
19156 install_element(BGP_FLOWSPECV4_NODE
,
19157 &neighbor_route_reflector_client_cmd
);
19158 install_element(BGP_FLOWSPECV4_NODE
,
19159 &no_neighbor_route_reflector_client_cmd
);
19160 install_element(BGP_FLOWSPECV6_NODE
,
19161 &neighbor_route_reflector_client_cmd
);
19162 install_element(BGP_FLOWSPECV6_NODE
,
19163 &no_neighbor_route_reflector_client_cmd
);
19164 install_element(BGP_EVPN_NODE
, &neighbor_route_reflector_client_cmd
);
19165 install_element(BGP_EVPN_NODE
, &no_neighbor_route_reflector_client_cmd
);
19167 /* "optimal-route-reflection" commands */
19168 install_element(BGP_IPV4_NODE
, &optimal_route_reflection_cmd
);
19169 install_element(BGP_IPV4M_NODE
, &optimal_route_reflection_cmd
);
19170 install_element(BGP_IPV4L_NODE
, &optimal_route_reflection_cmd
);
19171 install_element(BGP_IPV6_NODE
, &optimal_route_reflection_cmd
);
19172 install_element(BGP_IPV6M_NODE
, &optimal_route_reflection_cmd
);
19173 install_element(BGP_IPV6L_NODE
, &optimal_route_reflection_cmd
);
19174 install_element(BGP_VPNV4_NODE
, &optimal_route_reflection_cmd
);
19175 install_element(BGP_VPNV6_NODE
, &optimal_route_reflection_cmd
);
19176 install_element(BGP_FLOWSPECV4_NODE
, &optimal_route_reflection_cmd
);
19177 install_element(BGP_FLOWSPECV6_NODE
, &optimal_route_reflection_cmd
);
19178 install_element(BGP_EVPN_NODE
, &optimal_route_reflection_cmd
);
19180 /* "neighbor optimal-route-reflection" commands */
19181 install_element(BGP_IPV4_NODE
, &neighbor_optimal_route_reflection_cmd
);
19182 install_element(BGP_IPV4M_NODE
, &neighbor_optimal_route_reflection_cmd
);
19183 install_element(BGP_IPV4L_NODE
, &neighbor_optimal_route_reflection_cmd
);
19184 install_element(BGP_IPV6_NODE
, &neighbor_optimal_route_reflection_cmd
);
19185 install_element(BGP_IPV6M_NODE
, &neighbor_optimal_route_reflection_cmd
);
19186 install_element(BGP_IPV6L_NODE
, &neighbor_optimal_route_reflection_cmd
);
19187 install_element(BGP_VPNV4_NODE
, &neighbor_optimal_route_reflection_cmd
);
19188 install_element(BGP_VPNV6_NODE
, &neighbor_optimal_route_reflection_cmd
);
19189 install_element(BGP_FLOWSPECV4_NODE
,
19190 &neighbor_optimal_route_reflection_cmd
);
19191 install_element(BGP_FLOWSPECV6_NODE
,
19192 &neighbor_optimal_route_reflection_cmd
);
19193 install_element(BGP_EVPN_NODE
, &neighbor_optimal_route_reflection_cmd
);
19195 /* "neighbor route-server" commands.*/
19196 install_element(BGP_NODE
, &neighbor_route_server_client_hidden_cmd
);
19197 install_element(BGP_NODE
, &no_neighbor_route_server_client_hidden_cmd
);
19198 install_element(BGP_IPV4_NODE
, &neighbor_route_server_client_cmd
);
19199 install_element(BGP_IPV4_NODE
, &no_neighbor_route_server_client_cmd
);
19200 install_element(BGP_IPV4M_NODE
, &neighbor_route_server_client_cmd
);
19201 install_element(BGP_IPV4M_NODE
, &no_neighbor_route_server_client_cmd
);
19202 install_element(BGP_IPV4L_NODE
, &neighbor_route_server_client_cmd
);
19203 install_element(BGP_IPV4L_NODE
, &no_neighbor_route_server_client_cmd
);
19204 install_element(BGP_IPV6_NODE
, &neighbor_route_server_client_cmd
);
19205 install_element(BGP_IPV6_NODE
, &no_neighbor_route_server_client_cmd
);
19206 install_element(BGP_IPV6M_NODE
, &neighbor_route_server_client_cmd
);
19207 install_element(BGP_IPV6M_NODE
, &no_neighbor_route_server_client_cmd
);
19208 install_element(BGP_IPV6L_NODE
, &neighbor_route_server_client_cmd
);
19209 install_element(BGP_IPV6L_NODE
, &no_neighbor_route_server_client_cmd
);
19210 install_element(BGP_VPNV4_NODE
, &neighbor_route_server_client_cmd
);
19211 install_element(BGP_VPNV4_NODE
, &no_neighbor_route_server_client_cmd
);
19212 install_element(BGP_VPNV6_NODE
, &neighbor_route_server_client_cmd
);
19213 install_element(BGP_VPNV6_NODE
, &no_neighbor_route_server_client_cmd
);
19214 install_element(BGP_EVPN_NODE
, &neighbor_route_server_client_cmd
);
19215 install_element(BGP_EVPN_NODE
, &no_neighbor_route_server_client_cmd
);
19216 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_route_server_client_cmd
);
19217 install_element(BGP_FLOWSPECV4_NODE
,
19218 &no_neighbor_route_server_client_cmd
);
19219 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_route_server_client_cmd
);
19220 install_element(BGP_FLOWSPECV6_NODE
,
19221 &no_neighbor_route_server_client_cmd
);
19223 /* "neighbor disable-addpath-rx" commands. */
19224 install_element(BGP_IPV4_NODE
, &neighbor_disable_addpath_rx_cmd
);
19225 install_element(BGP_IPV4_NODE
, &no_neighbor_disable_addpath_rx_cmd
);
19226 install_element(BGP_IPV4M_NODE
, &neighbor_disable_addpath_rx_cmd
);
19227 install_element(BGP_IPV4M_NODE
, &no_neighbor_disable_addpath_rx_cmd
);
19228 install_element(BGP_IPV4L_NODE
, &neighbor_disable_addpath_rx_cmd
);
19229 install_element(BGP_IPV4L_NODE
, &no_neighbor_disable_addpath_rx_cmd
);
19230 install_element(BGP_IPV6_NODE
, &neighbor_disable_addpath_rx_cmd
);
19231 install_element(BGP_IPV6_NODE
, &no_neighbor_disable_addpath_rx_cmd
);
19232 install_element(BGP_IPV6M_NODE
, &neighbor_disable_addpath_rx_cmd
);
19233 install_element(BGP_IPV6M_NODE
, &no_neighbor_disable_addpath_rx_cmd
);
19234 install_element(BGP_IPV6L_NODE
, &neighbor_disable_addpath_rx_cmd
);
19235 install_element(BGP_IPV6L_NODE
, &no_neighbor_disable_addpath_rx_cmd
);
19236 install_element(BGP_VPNV4_NODE
, &neighbor_disable_addpath_rx_cmd
);
19237 install_element(BGP_VPNV4_NODE
, &no_neighbor_disable_addpath_rx_cmd
);
19238 install_element(BGP_VPNV6_NODE
, &neighbor_disable_addpath_rx_cmd
);
19239 install_element(BGP_VPNV6_NODE
, &no_neighbor_disable_addpath_rx_cmd
);
19241 /* "neighbor addpath-tx-all-paths" commands.*/
19242 install_element(BGP_NODE
, &neighbor_addpath_tx_all_paths_hidden_cmd
);
19243 install_element(BGP_NODE
, &no_neighbor_addpath_tx_all_paths_hidden_cmd
);
19244 install_element(BGP_IPV4_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
19245 install_element(BGP_IPV4_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
19246 install_element(BGP_IPV4M_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
19247 install_element(BGP_IPV4M_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
19248 install_element(BGP_IPV4L_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
19249 install_element(BGP_IPV4L_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
19250 install_element(BGP_IPV6_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
19251 install_element(BGP_IPV6_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
19252 install_element(BGP_IPV6M_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
19253 install_element(BGP_IPV6M_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
19254 install_element(BGP_IPV6L_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
19255 install_element(BGP_IPV6L_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
19256 install_element(BGP_VPNV4_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
19257 install_element(BGP_VPNV4_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
19258 install_element(BGP_VPNV6_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
19259 install_element(BGP_VPNV6_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
19261 /* "neighbor addpath-tx-bestpath-per-AS" commands.*/
19262 install_element(BGP_NODE
,
19263 &neighbor_addpath_tx_bestpath_per_as_hidden_cmd
);
19264 install_element(BGP_NODE
,
19265 &no_neighbor_addpath_tx_bestpath_per_as_hidden_cmd
);
19266 install_element(BGP_IPV4_NODE
,
19267 &neighbor_addpath_tx_bestpath_per_as_cmd
);
19268 install_element(BGP_IPV4_NODE
,
19269 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
19270 install_element(BGP_IPV4M_NODE
,
19271 &neighbor_addpath_tx_bestpath_per_as_cmd
);
19272 install_element(BGP_IPV4M_NODE
,
19273 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
19274 install_element(BGP_IPV4L_NODE
,
19275 &neighbor_addpath_tx_bestpath_per_as_cmd
);
19276 install_element(BGP_IPV4L_NODE
,
19277 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
19278 install_element(BGP_IPV6_NODE
,
19279 &neighbor_addpath_tx_bestpath_per_as_cmd
);
19280 install_element(BGP_IPV6_NODE
,
19281 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
19282 install_element(BGP_IPV6M_NODE
,
19283 &neighbor_addpath_tx_bestpath_per_as_cmd
);
19284 install_element(BGP_IPV6M_NODE
,
19285 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
19286 install_element(BGP_IPV6L_NODE
,
19287 &neighbor_addpath_tx_bestpath_per_as_cmd
);
19288 install_element(BGP_IPV6L_NODE
,
19289 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
19290 install_element(BGP_VPNV4_NODE
,
19291 &neighbor_addpath_tx_bestpath_per_as_cmd
);
19292 install_element(BGP_VPNV4_NODE
,
19293 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
19294 install_element(BGP_VPNV6_NODE
,
19295 &neighbor_addpath_tx_bestpath_per_as_cmd
);
19296 install_element(BGP_VPNV6_NODE
,
19297 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
19299 /* "neighbor sender-as-path-loop-detection" commands. */
19300 install_element(BGP_NODE
, &neighbor_aspath_loop_detection_cmd
);
19301 install_element(BGP_NODE
, &no_neighbor_aspath_loop_detection_cmd
);
19303 /* "neighbor passive" commands. */
19304 install_element(BGP_NODE
, &neighbor_passive_cmd
);
19305 install_element(BGP_NODE
, &no_neighbor_passive_cmd
);
19308 /* "neighbor shutdown" commands. */
19309 install_element(BGP_NODE
, &neighbor_shutdown_cmd
);
19310 install_element(BGP_NODE
, &no_neighbor_shutdown_cmd
);
19311 install_element(BGP_NODE
, &neighbor_shutdown_msg_cmd
);
19312 install_element(BGP_NODE
, &no_neighbor_shutdown_msg_cmd
);
19313 install_element(BGP_NODE
, &neighbor_shutdown_rtt_cmd
);
19314 install_element(BGP_NODE
, &no_neighbor_shutdown_rtt_cmd
);
19316 /* "neighbor capability extended-nexthop" commands.*/
19317 install_element(BGP_NODE
, &neighbor_capability_enhe_cmd
);
19318 install_element(BGP_NODE
, &no_neighbor_capability_enhe_cmd
);
19320 /* "neighbor capability orf prefix-list" commands.*/
19321 install_element(BGP_NODE
, &neighbor_capability_orf_prefix_hidden_cmd
);
19322 install_element(BGP_NODE
,
19323 &no_neighbor_capability_orf_prefix_hidden_cmd
);
19324 install_element(BGP_IPV4_NODE
, &neighbor_capability_orf_prefix_cmd
);
19325 install_element(BGP_IPV4_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
19326 install_element(BGP_IPV4M_NODE
, &neighbor_capability_orf_prefix_cmd
);
19327 install_element(BGP_IPV4M_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
19328 install_element(BGP_IPV4L_NODE
, &neighbor_capability_orf_prefix_cmd
);
19329 install_element(BGP_IPV4L_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
19330 install_element(BGP_IPV6_NODE
, &neighbor_capability_orf_prefix_cmd
);
19331 install_element(BGP_IPV6_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
19332 install_element(BGP_IPV6M_NODE
, &neighbor_capability_orf_prefix_cmd
);
19333 install_element(BGP_IPV6M_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
19334 install_element(BGP_IPV6L_NODE
, &neighbor_capability_orf_prefix_cmd
);
19335 install_element(BGP_IPV6L_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
19337 /* "neighbor capability dynamic" commands.*/
19338 install_element(BGP_NODE
, &neighbor_capability_dynamic_cmd
);
19339 install_element(BGP_NODE
, &no_neighbor_capability_dynamic_cmd
);
19341 /* "neighbor dont-capability-negotiate" commands. */
19342 install_element(BGP_NODE
, &neighbor_dont_capability_negotiate_cmd
);
19343 install_element(BGP_NODE
, &no_neighbor_dont_capability_negotiate_cmd
);
19345 /* "neighbor ebgp-multihop" commands. */
19346 install_element(BGP_NODE
, &neighbor_ebgp_multihop_cmd
);
19347 install_element(BGP_NODE
, &neighbor_ebgp_multihop_ttl_cmd
);
19348 install_element(BGP_NODE
, &no_neighbor_ebgp_multihop_cmd
);
19350 /* "neighbor disable-connected-check" commands. */
19351 install_element(BGP_NODE
, &neighbor_disable_connected_check_cmd
);
19352 install_element(BGP_NODE
, &no_neighbor_disable_connected_check_cmd
);
19354 /* "neighbor disable-link-bw-encoding-ieee" commands. */
19355 install_element(BGP_NODE
, &neighbor_disable_link_bw_encoding_ieee_cmd
);
19356 install_element(BGP_NODE
,
19357 &no_neighbor_disable_link_bw_encoding_ieee_cmd
);
19359 /* "neighbor extended-optional-parameters" commands. */
19360 install_element(BGP_NODE
, &neighbor_extended_optional_parameters_cmd
);
19361 install_element(BGP_NODE
,
19362 &no_neighbor_extended_optional_parameters_cmd
);
19364 /* "neighbor enforce-first-as" commands. */
19365 install_element(BGP_NODE
, &neighbor_enforce_first_as_cmd
);
19366 install_element(BGP_NODE
, &no_neighbor_enforce_first_as_cmd
);
19368 /* "neighbor description" commands. */
19369 install_element(BGP_NODE
, &neighbor_description_cmd
);
19370 install_element(BGP_NODE
, &no_neighbor_description_cmd
);
19371 install_element(BGP_NODE
, &no_neighbor_description_comment_cmd
);
19373 /* "neighbor update-source" commands. "*/
19374 install_element(BGP_NODE
, &neighbor_update_source_cmd
);
19375 install_element(BGP_NODE
, &no_neighbor_update_source_cmd
);
19377 /* "neighbor default-originate" commands. */
19378 install_element(BGP_NODE
, &neighbor_default_originate_hidden_cmd
);
19379 install_element(BGP_NODE
, &neighbor_default_originate_rmap_hidden_cmd
);
19380 install_element(BGP_NODE
, &no_neighbor_default_originate_hidden_cmd
);
19381 install_element(BGP_IPV4_NODE
, &neighbor_default_originate_cmd
);
19382 install_element(BGP_IPV4_NODE
, &neighbor_default_originate_rmap_cmd
);
19383 install_element(BGP_IPV4_NODE
, &no_neighbor_default_originate_cmd
);
19384 install_element(BGP_IPV4M_NODE
, &neighbor_default_originate_cmd
);
19385 install_element(BGP_IPV4M_NODE
, &neighbor_default_originate_rmap_cmd
);
19386 install_element(BGP_IPV4M_NODE
, &no_neighbor_default_originate_cmd
);
19387 install_element(BGP_IPV4L_NODE
, &neighbor_default_originate_cmd
);
19388 install_element(BGP_IPV4L_NODE
, &neighbor_default_originate_rmap_cmd
);
19389 install_element(BGP_IPV4L_NODE
, &no_neighbor_default_originate_cmd
);
19390 install_element(BGP_IPV6_NODE
, &neighbor_default_originate_cmd
);
19391 install_element(BGP_IPV6_NODE
, &neighbor_default_originate_rmap_cmd
);
19392 install_element(BGP_IPV6_NODE
, &no_neighbor_default_originate_cmd
);
19393 install_element(BGP_IPV6M_NODE
, &neighbor_default_originate_cmd
);
19394 install_element(BGP_IPV6M_NODE
, &neighbor_default_originate_rmap_cmd
);
19395 install_element(BGP_IPV6M_NODE
, &no_neighbor_default_originate_cmd
);
19396 install_element(BGP_IPV6L_NODE
, &neighbor_default_originate_cmd
);
19397 install_element(BGP_IPV6L_NODE
, &neighbor_default_originate_rmap_cmd
);
19398 install_element(BGP_IPV6L_NODE
, &no_neighbor_default_originate_cmd
);
19400 /* "neighbor port" commands. */
19401 install_element(BGP_NODE
, &neighbor_port_cmd
);
19402 install_element(BGP_NODE
, &no_neighbor_port_cmd
);
19404 /* "neighbor weight" commands. */
19405 install_element(BGP_NODE
, &neighbor_weight_hidden_cmd
);
19406 install_element(BGP_NODE
, &no_neighbor_weight_hidden_cmd
);
19408 install_element(BGP_IPV4_NODE
, &neighbor_weight_cmd
);
19409 install_element(BGP_IPV4_NODE
, &no_neighbor_weight_cmd
);
19410 install_element(BGP_IPV4M_NODE
, &neighbor_weight_cmd
);
19411 install_element(BGP_IPV4M_NODE
, &no_neighbor_weight_cmd
);
19412 install_element(BGP_IPV4L_NODE
, &neighbor_weight_cmd
);
19413 install_element(BGP_IPV4L_NODE
, &no_neighbor_weight_cmd
);
19414 install_element(BGP_IPV6_NODE
, &neighbor_weight_cmd
);
19415 install_element(BGP_IPV6_NODE
, &no_neighbor_weight_cmd
);
19416 install_element(BGP_IPV6M_NODE
, &neighbor_weight_cmd
);
19417 install_element(BGP_IPV6M_NODE
, &no_neighbor_weight_cmd
);
19418 install_element(BGP_IPV6L_NODE
, &neighbor_weight_cmd
);
19419 install_element(BGP_IPV6L_NODE
, &no_neighbor_weight_cmd
);
19420 install_element(BGP_VPNV4_NODE
, &neighbor_weight_cmd
);
19421 install_element(BGP_VPNV4_NODE
, &no_neighbor_weight_cmd
);
19422 install_element(BGP_VPNV6_NODE
, &neighbor_weight_cmd
);
19423 install_element(BGP_VPNV6_NODE
, &no_neighbor_weight_cmd
);
19425 /* "neighbor override-capability" commands. */
19426 install_element(BGP_NODE
, &neighbor_override_capability_cmd
);
19427 install_element(BGP_NODE
, &no_neighbor_override_capability_cmd
);
19429 /* "neighbor strict-capability-match" commands. */
19430 install_element(BGP_NODE
, &neighbor_strict_capability_cmd
);
19431 install_element(BGP_NODE
, &no_neighbor_strict_capability_cmd
);
19433 /* "neighbor timers" commands. */
19434 install_element(BGP_NODE
, &neighbor_timers_cmd
);
19435 install_element(BGP_NODE
, &no_neighbor_timers_cmd
);
19437 /* "neighbor timers connect" commands. */
19438 install_element(BGP_NODE
, &neighbor_timers_connect_cmd
);
19439 install_element(BGP_NODE
, &no_neighbor_timers_connect_cmd
);
19441 /* "neighbor timers delayopen" commands. */
19442 install_element(BGP_NODE
, &neighbor_timers_delayopen_cmd
);
19443 install_element(BGP_NODE
, &no_neighbor_timers_delayopen_cmd
);
19445 /* "neighbor advertisement-interval" commands. */
19446 install_element(BGP_NODE
, &neighbor_advertise_interval_cmd
);
19447 install_element(BGP_NODE
, &no_neighbor_advertise_interval_cmd
);
19449 /* "neighbor interface" commands. */
19450 install_element(BGP_NODE
, &neighbor_interface_cmd
);
19451 install_element(BGP_NODE
, &no_neighbor_interface_cmd
);
19453 /* "neighbor distribute" commands. */
19454 install_element(BGP_NODE
, &neighbor_distribute_list_hidden_cmd
);
19455 install_element(BGP_NODE
, &no_neighbor_distribute_list_hidden_cmd
);
19456 install_element(BGP_IPV4_NODE
, &neighbor_distribute_list_cmd
);
19457 install_element(BGP_IPV4_NODE
, &no_neighbor_distribute_list_cmd
);
19458 install_element(BGP_IPV4M_NODE
, &neighbor_distribute_list_cmd
);
19459 install_element(BGP_IPV4M_NODE
, &no_neighbor_distribute_list_cmd
);
19460 install_element(BGP_IPV4L_NODE
, &neighbor_distribute_list_cmd
);
19461 install_element(BGP_IPV4L_NODE
, &no_neighbor_distribute_list_cmd
);
19462 install_element(BGP_IPV6_NODE
, &neighbor_distribute_list_cmd
);
19463 install_element(BGP_IPV6_NODE
, &no_neighbor_distribute_list_cmd
);
19464 install_element(BGP_IPV6M_NODE
, &neighbor_distribute_list_cmd
);
19465 install_element(BGP_IPV6M_NODE
, &no_neighbor_distribute_list_cmd
);
19466 install_element(BGP_IPV6L_NODE
, &neighbor_distribute_list_cmd
);
19467 install_element(BGP_IPV6L_NODE
, &no_neighbor_distribute_list_cmd
);
19468 install_element(BGP_VPNV4_NODE
, &neighbor_distribute_list_cmd
);
19469 install_element(BGP_VPNV4_NODE
, &no_neighbor_distribute_list_cmd
);
19470 install_element(BGP_VPNV6_NODE
, &neighbor_distribute_list_cmd
);
19471 install_element(BGP_VPNV6_NODE
, &no_neighbor_distribute_list_cmd
);
19473 /* "neighbor prefix-list" commands. */
19474 install_element(BGP_NODE
, &neighbor_prefix_list_hidden_cmd
);
19475 install_element(BGP_NODE
, &no_neighbor_prefix_list_hidden_cmd
);
19476 install_element(BGP_IPV4_NODE
, &neighbor_prefix_list_cmd
);
19477 install_element(BGP_IPV4_NODE
, &no_neighbor_prefix_list_cmd
);
19478 install_element(BGP_IPV4M_NODE
, &neighbor_prefix_list_cmd
);
19479 install_element(BGP_IPV4M_NODE
, &no_neighbor_prefix_list_cmd
);
19480 install_element(BGP_IPV4L_NODE
, &neighbor_prefix_list_cmd
);
19481 install_element(BGP_IPV4L_NODE
, &no_neighbor_prefix_list_cmd
);
19482 install_element(BGP_IPV6_NODE
, &neighbor_prefix_list_cmd
);
19483 install_element(BGP_IPV6_NODE
, &no_neighbor_prefix_list_cmd
);
19484 install_element(BGP_IPV6M_NODE
, &neighbor_prefix_list_cmd
);
19485 install_element(BGP_IPV6M_NODE
, &no_neighbor_prefix_list_cmd
);
19486 install_element(BGP_IPV6L_NODE
, &neighbor_prefix_list_cmd
);
19487 install_element(BGP_IPV6L_NODE
, &no_neighbor_prefix_list_cmd
);
19488 install_element(BGP_VPNV4_NODE
, &neighbor_prefix_list_cmd
);
19489 install_element(BGP_VPNV4_NODE
, &no_neighbor_prefix_list_cmd
);
19490 install_element(BGP_VPNV6_NODE
, &neighbor_prefix_list_cmd
);
19491 install_element(BGP_VPNV6_NODE
, &no_neighbor_prefix_list_cmd
);
19492 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_prefix_list_cmd
);
19493 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_prefix_list_cmd
);
19494 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_prefix_list_cmd
);
19495 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_prefix_list_cmd
);
19497 /* "neighbor filter-list" commands. */
19498 install_element(BGP_NODE
, &neighbor_filter_list_hidden_cmd
);
19499 install_element(BGP_NODE
, &no_neighbor_filter_list_hidden_cmd
);
19500 install_element(BGP_IPV4_NODE
, &neighbor_filter_list_cmd
);
19501 install_element(BGP_IPV4_NODE
, &no_neighbor_filter_list_cmd
);
19502 install_element(BGP_IPV4M_NODE
, &neighbor_filter_list_cmd
);
19503 install_element(BGP_IPV4M_NODE
, &no_neighbor_filter_list_cmd
);
19504 install_element(BGP_IPV4L_NODE
, &neighbor_filter_list_cmd
);
19505 install_element(BGP_IPV4L_NODE
, &no_neighbor_filter_list_cmd
);
19506 install_element(BGP_IPV6_NODE
, &neighbor_filter_list_cmd
);
19507 install_element(BGP_IPV6_NODE
, &no_neighbor_filter_list_cmd
);
19508 install_element(BGP_IPV6M_NODE
, &neighbor_filter_list_cmd
);
19509 install_element(BGP_IPV6M_NODE
, &no_neighbor_filter_list_cmd
);
19510 install_element(BGP_IPV6L_NODE
, &neighbor_filter_list_cmd
);
19511 install_element(BGP_IPV6L_NODE
, &no_neighbor_filter_list_cmd
);
19512 install_element(BGP_VPNV4_NODE
, &neighbor_filter_list_cmd
);
19513 install_element(BGP_VPNV4_NODE
, &no_neighbor_filter_list_cmd
);
19514 install_element(BGP_VPNV6_NODE
, &neighbor_filter_list_cmd
);
19515 install_element(BGP_VPNV6_NODE
, &no_neighbor_filter_list_cmd
);
19516 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_filter_list_cmd
);
19517 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_filter_list_cmd
);
19518 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_filter_list_cmd
);
19519 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_filter_list_cmd
);
19521 /* "neighbor route-map" commands. */
19522 install_element(BGP_NODE
, &neighbor_route_map_hidden_cmd
);
19523 install_element(BGP_NODE
, &no_neighbor_route_map_hidden_cmd
);
19524 install_element(BGP_IPV4_NODE
, &neighbor_route_map_cmd
);
19525 install_element(BGP_IPV4_NODE
, &no_neighbor_route_map_cmd
);
19526 install_element(BGP_IPV4M_NODE
, &neighbor_route_map_cmd
);
19527 install_element(BGP_IPV4M_NODE
, &no_neighbor_route_map_cmd
);
19528 install_element(BGP_IPV4L_NODE
, &neighbor_route_map_cmd
);
19529 install_element(BGP_IPV4L_NODE
, &no_neighbor_route_map_cmd
);
19530 install_element(BGP_IPV6_NODE
, &neighbor_route_map_cmd
);
19531 install_element(BGP_IPV6_NODE
, &no_neighbor_route_map_cmd
);
19532 install_element(BGP_IPV6M_NODE
, &neighbor_route_map_cmd
);
19533 install_element(BGP_IPV6M_NODE
, &no_neighbor_route_map_cmd
);
19534 install_element(BGP_IPV6L_NODE
, &neighbor_route_map_cmd
);
19535 install_element(BGP_IPV6L_NODE
, &no_neighbor_route_map_cmd
);
19536 install_element(BGP_VPNV4_NODE
, &neighbor_route_map_cmd
);
19537 install_element(BGP_VPNV4_NODE
, &no_neighbor_route_map_cmd
);
19538 install_element(BGP_VPNV6_NODE
, &neighbor_route_map_cmd
);
19539 install_element(BGP_VPNV6_NODE
, &no_neighbor_route_map_cmd
);
19540 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_route_map_cmd
);
19541 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_route_map_cmd
);
19542 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_route_map_cmd
);
19543 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_route_map_cmd
);
19544 install_element(BGP_EVPN_NODE
, &neighbor_route_map_cmd
);
19545 install_element(BGP_EVPN_NODE
, &no_neighbor_route_map_cmd
);
19547 /* "neighbor unsuppress-map" commands. */
19548 install_element(BGP_NODE
, &neighbor_unsuppress_map_hidden_cmd
);
19549 install_element(BGP_NODE
, &no_neighbor_unsuppress_map_hidden_cmd
);
19550 install_element(BGP_IPV4_NODE
, &neighbor_unsuppress_map_cmd
);
19551 install_element(BGP_IPV4_NODE
, &no_neighbor_unsuppress_map_cmd
);
19552 install_element(BGP_IPV4M_NODE
, &neighbor_unsuppress_map_cmd
);
19553 install_element(BGP_IPV4M_NODE
, &no_neighbor_unsuppress_map_cmd
);
19554 install_element(BGP_IPV4L_NODE
, &neighbor_unsuppress_map_cmd
);
19555 install_element(BGP_IPV4L_NODE
, &no_neighbor_unsuppress_map_cmd
);
19556 install_element(BGP_IPV6_NODE
, &neighbor_unsuppress_map_cmd
);
19557 install_element(BGP_IPV6_NODE
, &no_neighbor_unsuppress_map_cmd
);
19558 install_element(BGP_IPV6M_NODE
, &neighbor_unsuppress_map_cmd
);
19559 install_element(BGP_IPV6M_NODE
, &no_neighbor_unsuppress_map_cmd
);
19560 install_element(BGP_IPV6L_NODE
, &neighbor_unsuppress_map_cmd
);
19561 install_element(BGP_IPV6L_NODE
, &no_neighbor_unsuppress_map_cmd
);
19562 install_element(BGP_VPNV4_NODE
, &neighbor_unsuppress_map_cmd
);
19563 install_element(BGP_VPNV4_NODE
, &no_neighbor_unsuppress_map_cmd
);
19564 install_element(BGP_VPNV6_NODE
, &neighbor_unsuppress_map_cmd
);
19565 install_element(BGP_VPNV6_NODE
, &no_neighbor_unsuppress_map_cmd
);
19567 /* "neighbor advertise-map" commands. */
19568 install_element(BGP_NODE
, &bgp_condadv_period_cmd
);
19569 install_element(BGP_NODE
, &neighbor_advertise_map_hidden_cmd
);
19570 install_element(BGP_IPV4_NODE
, &neighbor_advertise_map_cmd
);
19571 install_element(BGP_IPV4M_NODE
, &neighbor_advertise_map_cmd
);
19572 install_element(BGP_IPV4L_NODE
, &neighbor_advertise_map_cmd
);
19573 install_element(BGP_IPV6_NODE
, &neighbor_advertise_map_cmd
);
19574 install_element(BGP_IPV6M_NODE
, &neighbor_advertise_map_cmd
);
19575 install_element(BGP_IPV6L_NODE
, &neighbor_advertise_map_cmd
);
19576 install_element(BGP_VPNV4_NODE
, &neighbor_advertise_map_cmd
);
19577 install_element(BGP_VPNV6_NODE
, &neighbor_advertise_map_cmd
);
19579 /* neighbor maximum-prefix-out commands. */
19580 install_element(BGP_NODE
, &neighbor_maximum_prefix_out_cmd
);
19581 install_element(BGP_NODE
, &no_neighbor_maximum_prefix_out_cmd
);
19582 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_out_cmd
);
19583 install_element(BGP_IPV4_NODE
, &no_neighbor_maximum_prefix_out_cmd
);
19584 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_out_cmd
);
19585 install_element(BGP_IPV4M_NODE
, &no_neighbor_maximum_prefix_out_cmd
);
19586 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_out_cmd
);
19587 install_element(BGP_IPV4L_NODE
, &no_neighbor_maximum_prefix_out_cmd
);
19588 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_out_cmd
);
19589 install_element(BGP_IPV6_NODE
, &no_neighbor_maximum_prefix_out_cmd
);
19590 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_out_cmd
);
19591 install_element(BGP_IPV6M_NODE
, &no_neighbor_maximum_prefix_out_cmd
);
19592 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_out_cmd
);
19593 install_element(BGP_IPV6L_NODE
, &no_neighbor_maximum_prefix_out_cmd
);
19594 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_out_cmd
);
19595 install_element(BGP_VPNV4_NODE
, &no_neighbor_maximum_prefix_out_cmd
);
19596 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_out_cmd
);
19597 install_element(BGP_VPNV6_NODE
, &no_neighbor_maximum_prefix_out_cmd
);
19599 /* "neighbor maximum-prefix" commands. */
19600 install_element(BGP_NODE
, &neighbor_maximum_prefix_hidden_cmd
);
19601 install_element(BGP_NODE
,
19602 &neighbor_maximum_prefix_threshold_hidden_cmd
);
19603 install_element(BGP_NODE
, &neighbor_maximum_prefix_warning_hidden_cmd
);
19604 install_element(BGP_NODE
,
19605 &neighbor_maximum_prefix_threshold_warning_hidden_cmd
);
19606 install_element(BGP_NODE
, &neighbor_maximum_prefix_restart_hidden_cmd
);
19607 install_element(BGP_NODE
,
19608 &neighbor_maximum_prefix_threshold_restart_hidden_cmd
);
19609 install_element(BGP_NODE
, &no_neighbor_maximum_prefix_hidden_cmd
);
19610 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_cmd
);
19611 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
19612 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_warning_cmd
);
19613 install_element(BGP_IPV4_NODE
,
19614 &neighbor_maximum_prefix_threshold_warning_cmd
);
19615 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_restart_cmd
);
19616 install_element(BGP_IPV4_NODE
,
19617 &neighbor_maximum_prefix_threshold_restart_cmd
);
19618 install_element(BGP_IPV4_NODE
, &no_neighbor_maximum_prefix_cmd
);
19619 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_cmd
);
19620 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
19621 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_warning_cmd
);
19622 install_element(BGP_IPV4M_NODE
,
19623 &neighbor_maximum_prefix_threshold_warning_cmd
);
19624 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_restart_cmd
);
19625 install_element(BGP_IPV4M_NODE
,
19626 &neighbor_maximum_prefix_threshold_restart_cmd
);
19627 install_element(BGP_IPV4M_NODE
, &no_neighbor_maximum_prefix_cmd
);
19628 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_cmd
);
19629 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
19630 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_warning_cmd
);
19631 install_element(BGP_IPV4L_NODE
,
19632 &neighbor_maximum_prefix_threshold_warning_cmd
);
19633 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_restart_cmd
);
19634 install_element(BGP_IPV4L_NODE
,
19635 &neighbor_maximum_prefix_threshold_restart_cmd
);
19636 install_element(BGP_IPV4L_NODE
, &no_neighbor_maximum_prefix_cmd
);
19637 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_cmd
);
19638 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
19639 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_warning_cmd
);
19640 install_element(BGP_IPV6_NODE
,
19641 &neighbor_maximum_prefix_threshold_warning_cmd
);
19642 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_restart_cmd
);
19643 install_element(BGP_IPV6_NODE
,
19644 &neighbor_maximum_prefix_threshold_restart_cmd
);
19645 install_element(BGP_IPV6_NODE
, &no_neighbor_maximum_prefix_cmd
);
19646 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_cmd
);
19647 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
19648 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_warning_cmd
);
19649 install_element(BGP_IPV6M_NODE
,
19650 &neighbor_maximum_prefix_threshold_warning_cmd
);
19651 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_restart_cmd
);
19652 install_element(BGP_IPV6M_NODE
,
19653 &neighbor_maximum_prefix_threshold_restart_cmd
);
19654 install_element(BGP_IPV6M_NODE
, &no_neighbor_maximum_prefix_cmd
);
19655 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_cmd
);
19656 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
19657 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_warning_cmd
);
19658 install_element(BGP_IPV6L_NODE
,
19659 &neighbor_maximum_prefix_threshold_warning_cmd
);
19660 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_restart_cmd
);
19661 install_element(BGP_IPV6L_NODE
,
19662 &neighbor_maximum_prefix_threshold_restart_cmd
);
19663 install_element(BGP_IPV6L_NODE
, &no_neighbor_maximum_prefix_cmd
);
19664 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_cmd
);
19665 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
19666 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_warning_cmd
);
19667 install_element(BGP_VPNV4_NODE
,
19668 &neighbor_maximum_prefix_threshold_warning_cmd
);
19669 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_restart_cmd
);
19670 install_element(BGP_VPNV4_NODE
,
19671 &neighbor_maximum_prefix_threshold_restart_cmd
);
19672 install_element(BGP_VPNV4_NODE
, &no_neighbor_maximum_prefix_cmd
);
19673 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_cmd
);
19674 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
19675 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_warning_cmd
);
19676 install_element(BGP_VPNV6_NODE
,
19677 &neighbor_maximum_prefix_threshold_warning_cmd
);
19678 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_restart_cmd
);
19679 install_element(BGP_VPNV6_NODE
,
19680 &neighbor_maximum_prefix_threshold_restart_cmd
);
19681 install_element(BGP_VPNV6_NODE
, &no_neighbor_maximum_prefix_cmd
);
19683 /* "neighbor allowas-in" */
19684 install_element(BGP_NODE
, &neighbor_allowas_in_hidden_cmd
);
19685 install_element(BGP_NODE
, &no_neighbor_allowas_in_hidden_cmd
);
19686 install_element(BGP_IPV4_NODE
, &neighbor_allowas_in_cmd
);
19687 install_element(BGP_IPV4_NODE
, &no_neighbor_allowas_in_cmd
);
19688 install_element(BGP_IPV4M_NODE
, &neighbor_allowas_in_cmd
);
19689 install_element(BGP_IPV4M_NODE
, &no_neighbor_allowas_in_cmd
);
19690 install_element(BGP_IPV4L_NODE
, &neighbor_allowas_in_cmd
);
19691 install_element(BGP_IPV4L_NODE
, &no_neighbor_allowas_in_cmd
);
19692 install_element(BGP_IPV6_NODE
, &neighbor_allowas_in_cmd
);
19693 install_element(BGP_IPV6_NODE
, &no_neighbor_allowas_in_cmd
);
19694 install_element(BGP_IPV6M_NODE
, &neighbor_allowas_in_cmd
);
19695 install_element(BGP_IPV6M_NODE
, &no_neighbor_allowas_in_cmd
);
19696 install_element(BGP_IPV6L_NODE
, &neighbor_allowas_in_cmd
);
19697 install_element(BGP_IPV6L_NODE
, &no_neighbor_allowas_in_cmd
);
19698 install_element(BGP_VPNV4_NODE
, &neighbor_allowas_in_cmd
);
19699 install_element(BGP_VPNV4_NODE
, &no_neighbor_allowas_in_cmd
);
19700 install_element(BGP_VPNV6_NODE
, &neighbor_allowas_in_cmd
);
19701 install_element(BGP_VPNV6_NODE
, &no_neighbor_allowas_in_cmd
);
19702 install_element(BGP_EVPN_NODE
, &neighbor_allowas_in_cmd
);
19703 install_element(BGP_EVPN_NODE
, &no_neighbor_allowas_in_cmd
);
19705 /* neighbor accept-own */
19706 install_element(BGP_VPNV4_NODE
, &neighbor_accept_own_cmd
);
19707 install_element(BGP_VPNV6_NODE
, &neighbor_accept_own_cmd
);
19709 /* "neighbor soo" */
19710 install_element(BGP_IPV4_NODE
, &neighbor_soo_cmd
);
19711 install_element(BGP_IPV4_NODE
, &no_neighbor_soo_cmd
);
19712 install_element(BGP_IPV4M_NODE
, &neighbor_soo_cmd
);
19713 install_element(BGP_IPV4M_NODE
, &no_neighbor_soo_cmd
);
19714 install_element(BGP_IPV4L_NODE
, &neighbor_soo_cmd
);
19715 install_element(BGP_IPV4L_NODE
, &no_neighbor_soo_cmd
);
19716 install_element(BGP_IPV6_NODE
, &neighbor_soo_cmd
);
19717 install_element(BGP_IPV6_NODE
, &no_neighbor_soo_cmd
);
19718 install_element(BGP_IPV6M_NODE
, &neighbor_soo_cmd
);
19719 install_element(BGP_IPV6M_NODE
, &no_neighbor_soo_cmd
);
19720 install_element(BGP_IPV6L_NODE
, &neighbor_soo_cmd
);
19721 install_element(BGP_IPV6L_NODE
, &no_neighbor_soo_cmd
);
19722 install_element(BGP_VPNV4_NODE
, &neighbor_soo_cmd
);
19723 install_element(BGP_VPNV4_NODE
, &no_neighbor_soo_cmd
);
19724 install_element(BGP_VPNV6_NODE
, &neighbor_soo_cmd
);
19725 install_element(BGP_VPNV6_NODE
, &no_neighbor_soo_cmd
);
19726 install_element(BGP_EVPN_NODE
, &neighbor_soo_cmd
);
19727 install_element(BGP_EVPN_NODE
, &no_neighbor_soo_cmd
);
19729 /* address-family commands. */
19730 install_element(BGP_NODE
, &address_family_ipv4_safi_cmd
);
19731 install_element(BGP_NODE
, &address_family_ipv6_safi_cmd
);
19732 #ifdef KEEP_OLD_VPN_COMMANDS
19733 install_element(BGP_NODE
, &address_family_vpnv4_cmd
);
19734 install_element(BGP_NODE
, &address_family_vpnv6_cmd
);
19735 #endif /* KEEP_OLD_VPN_COMMANDS */
19737 install_element(BGP_NODE
, &address_family_evpn_cmd
);
19739 /* "exit-address-family" command. */
19740 install_element(BGP_IPV4_NODE
, &exit_address_family_cmd
);
19741 install_element(BGP_IPV4M_NODE
, &exit_address_family_cmd
);
19742 install_element(BGP_IPV4L_NODE
, &exit_address_family_cmd
);
19743 install_element(BGP_IPV6_NODE
, &exit_address_family_cmd
);
19744 install_element(BGP_IPV6M_NODE
, &exit_address_family_cmd
);
19745 install_element(BGP_IPV6L_NODE
, &exit_address_family_cmd
);
19746 install_element(BGP_VPNV4_NODE
, &exit_address_family_cmd
);
19747 install_element(BGP_VPNV6_NODE
, &exit_address_family_cmd
);
19748 install_element(BGP_FLOWSPECV4_NODE
, &exit_address_family_cmd
);
19749 install_element(BGP_FLOWSPECV6_NODE
, &exit_address_family_cmd
);
19750 install_element(BGP_EVPN_NODE
, &exit_address_family_cmd
);
19752 /* BGP retain all route-target */
19753 install_element(BGP_VPNV4_NODE
, &bgp_retain_route_target_cmd
);
19754 install_element(BGP_VPNV6_NODE
, &bgp_retain_route_target_cmd
);
19756 /* "clear ip bgp commands" */
19757 install_element(ENABLE_NODE
, &clear_ip_bgp_all_cmd
);
19759 /* clear ip bgp prefix */
19760 install_element(ENABLE_NODE
, &clear_ip_bgp_prefix_cmd
);
19761 install_element(ENABLE_NODE
, &clear_bgp_ipv6_safi_prefix_cmd
);
19762 install_element(ENABLE_NODE
, &clear_bgp_instance_ipv6_safi_prefix_cmd
);
19764 /* "show [ip] bgp summary" commands. */
19765 install_element(VIEW_NODE
, &show_bgp_instance_all_ipv6_updgrps_cmd
);
19766 install_element(VIEW_NODE
, &show_bgp_l2vpn_evpn_updgrps_cmd
);
19767 install_element(VIEW_NODE
, &show_bgp_instance_updgrps_stats_cmd
);
19768 install_element(VIEW_NODE
, &show_bgp_updgrps_stats_cmd
);
19769 install_element(VIEW_NODE
, &show_ip_bgp_instance_updgrps_adj_s_cmd
);
19770 install_element(VIEW_NODE
, &show_ip_bgp_summary_cmd
);
19771 install_element(VIEW_NODE
, &show_ip_bgp_updgrps_cmd
);
19773 /* "show [ip] bgp neighbors" commands. */
19774 install_element(VIEW_NODE
, &show_ip_bgp_neighbors_cmd
);
19776 install_element(VIEW_NODE
, &show_ip_bgp_neighbors_graceful_restart_cmd
);
19778 /* "show [ip] bgp peer-group" commands. */
19779 install_element(VIEW_NODE
, &show_ip_bgp_peer_groups_cmd
);
19781 /* "show [ip] bgp paths" commands. */
19782 install_element(VIEW_NODE
, &show_ip_bgp_paths_cmd
);
19784 /* "show [ip] bgp community" commands. */
19785 install_element(VIEW_NODE
, &show_ip_bgp_community_info_cmd
);
19787 /* "show ip bgp large-community" commands. */
19788 install_element(VIEW_NODE
, &show_ip_bgp_lcommunity_info_cmd
);
19789 /* "show [ip] bgp attribute-info" commands. */
19790 install_element(VIEW_NODE
, &show_ip_bgp_attr_info_cmd
);
19791 /* "show [ip] bgp route-leak" command */
19792 install_element(VIEW_NODE
, &show_ip_bgp_route_leak_cmd
);
19794 /* "redistribute" commands. */
19795 install_element(BGP_NODE
, &bgp_redistribute_ipv4_hidden_cmd
);
19796 install_element(BGP_NODE
, &no_bgp_redistribute_ipv4_hidden_cmd
);
19797 install_element(BGP_NODE
, &bgp_redistribute_ipv4_rmap_hidden_cmd
);
19798 install_element(BGP_NODE
, &bgp_redistribute_ipv4_metric_hidden_cmd
);
19799 install_element(BGP_NODE
,
19800 &bgp_redistribute_ipv4_rmap_metric_hidden_cmd
);
19801 install_element(BGP_NODE
,
19802 &bgp_redistribute_ipv4_metric_rmap_hidden_cmd
);
19803 install_element(BGP_NODE
, &bgp_redistribute_ipv4_ospf_hidden_cmd
);
19804 install_element(BGP_NODE
, &no_bgp_redistribute_ipv4_ospf_hidden_cmd
);
19805 install_element(BGP_NODE
, &bgp_redistribute_ipv4_ospf_rmap_hidden_cmd
);
19806 install_element(BGP_NODE
,
19807 &bgp_redistribute_ipv4_ospf_metric_hidden_cmd
);
19808 install_element(BGP_NODE
,
19809 &bgp_redistribute_ipv4_ospf_rmap_metric_hidden_cmd
);
19810 install_element(BGP_NODE
,
19811 &bgp_redistribute_ipv4_ospf_metric_rmap_hidden_cmd
);
19812 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_cmd
);
19813 install_element(BGP_IPV4_NODE
, &no_bgp_redistribute_ipv4_cmd
);
19814 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_rmap_cmd
);
19815 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_metric_cmd
);
19816 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_rmap_metric_cmd
);
19817 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_metric_rmap_cmd
);
19818 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_ospf_cmd
);
19819 install_element(BGP_IPV4_NODE
, &no_bgp_redistribute_ipv4_ospf_cmd
);
19820 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_ospf_rmap_cmd
);
19821 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_ospf_metric_cmd
);
19822 install_element(BGP_IPV4_NODE
,
19823 &bgp_redistribute_ipv4_ospf_rmap_metric_cmd
);
19824 install_element(BGP_IPV4_NODE
,
19825 &bgp_redistribute_ipv4_ospf_metric_rmap_cmd
);
19826 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_cmd
);
19827 install_element(BGP_IPV6_NODE
, &no_bgp_redistribute_ipv6_cmd
);
19828 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_rmap_cmd
);
19829 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_metric_cmd
);
19830 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_rmap_metric_cmd
);
19831 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_metric_rmap_cmd
);
19833 /* import|export vpn [route-map RMAP_NAME] */
19834 install_element(BGP_IPV4_NODE
, &bgp_imexport_vpn_cmd
);
19835 install_element(BGP_IPV6_NODE
, &bgp_imexport_vpn_cmd
);
19837 install_element(BGP_IPV4_NODE
, &bgp_imexport_vrf_cmd
);
19838 install_element(BGP_IPV6_NODE
, &bgp_imexport_vrf_cmd
);
19840 /* ttl_security commands */
19841 install_element(BGP_NODE
, &neighbor_ttl_security_cmd
);
19842 install_element(BGP_NODE
, &no_neighbor_ttl_security_cmd
);
19844 /* "bgp tcp-keepalive" commands */
19845 install_element(BGP_NODE
, &bgp_tcp_keepalive_cmd
);
19846 install_element(BGP_NODE
, &no_bgp_tcp_keepalive_cmd
);
19848 /* "show [ip] bgp memory" commands. */
19849 install_element(VIEW_NODE
, &show_bgp_memory_cmd
);
19851 /* "show bgp martian next-hop" */
19852 install_element(VIEW_NODE
, &show_bgp_martian_nexthop_db_cmd
);
19854 install_element(VIEW_NODE
, &show_bgp_mac_hash_cmd
);
19856 /* "show [ip] bgp views" commands. */
19857 install_element(VIEW_NODE
, &show_bgp_views_cmd
);
19859 /* "show [ip] bgp vrfs" commands. */
19860 install_element(VIEW_NODE
, &show_bgp_vrfs_cmd
);
19862 /* Community-list. */
19863 community_list_vty();
19865 community_alias_vty();
19867 /* vpn-policy commands */
19868 install_element(BGP_IPV4_NODE
, &af_rd_vpn_export_cmd
);
19869 install_element(BGP_IPV6_NODE
, &af_rd_vpn_export_cmd
);
19870 install_element(BGP_IPV4_NODE
, &af_label_vpn_export_cmd
);
19871 install_element(BGP_IPV6_NODE
, &af_label_vpn_export_cmd
);
19872 install_element(BGP_IPV4_NODE
, &af_nexthop_vpn_export_cmd
);
19873 install_element(BGP_IPV6_NODE
, &af_nexthop_vpn_export_cmd
);
19874 install_element(BGP_IPV4_NODE
, &af_rt_vpn_imexport_cmd
);
19875 install_element(BGP_IPV6_NODE
, &af_rt_vpn_imexport_cmd
);
19876 install_element(BGP_IPV4_NODE
, &af_route_map_vpn_imexport_cmd
);
19877 install_element(BGP_IPV6_NODE
, &af_route_map_vpn_imexport_cmd
);
19878 install_element(BGP_IPV4_NODE
, &af_import_vrf_route_map_cmd
);
19879 install_element(BGP_IPV6_NODE
, &af_import_vrf_route_map_cmd
);
19881 install_element(BGP_IPV4_NODE
, &af_routetarget_import_cmd
);
19882 install_element(BGP_IPV6_NODE
, &af_routetarget_import_cmd
);
19884 install_element(BGP_IPV4_NODE
, &af_no_rd_vpn_export_cmd
);
19885 install_element(BGP_IPV6_NODE
, &af_no_rd_vpn_export_cmd
);
19886 install_element(BGP_IPV4_NODE
, &af_no_label_vpn_export_cmd
);
19887 install_element(BGP_IPV6_NODE
, &af_no_label_vpn_export_cmd
);
19888 install_element(BGP_IPV4_NODE
, &af_no_rt_vpn_imexport_cmd
);
19889 install_element(BGP_IPV6_NODE
, &af_no_rt_vpn_imexport_cmd
);
19890 install_element(BGP_IPV4_NODE
, &af_no_route_map_vpn_imexport_cmd
);
19891 install_element(BGP_IPV6_NODE
, &af_no_route_map_vpn_imexport_cmd
);
19892 install_element(BGP_IPV4_NODE
, &af_no_import_vrf_route_map_cmd
);
19893 install_element(BGP_IPV6_NODE
, &af_no_import_vrf_route_map_cmd
);
19895 /* tcp-mss command */
19896 install_element(BGP_NODE
, &neighbor_tcp_mss_cmd
);
19897 install_element(BGP_NODE
, &no_neighbor_tcp_mss_cmd
);
19899 /* srv6 commands */
19900 install_element(VIEW_NODE
, &show_bgp_srv6_cmd
);
19901 install_element(BGP_NODE
, &bgp_segment_routing_srv6_cmd
);
19902 install_element(BGP_NODE
, &no_bgp_segment_routing_srv6_cmd
);
19903 install_element(BGP_SRV6_NODE
, &bgp_srv6_locator_cmd
);
19904 install_element(BGP_SRV6_NODE
, &no_bgp_srv6_locator_cmd
);
19905 install_element(BGP_IPV4_NODE
, &af_sid_vpn_export_cmd
);
19906 install_element(BGP_IPV6_NODE
, &af_sid_vpn_export_cmd
);
19907 install_element(BGP_NODE
, &bgp_sid_vpn_export_cmd
);
19912 #include "memory.h"
19913 #include "bgp_regex.h"
19914 #include "bgp_clist.h"
19915 #include "bgp_ecommunity.h"
19917 /* VTY functions. */
19919 /* Direction value to string conversion. */
19920 static const char *community_direct_str(int direct
)
19923 case COMMUNITY_DENY
:
19925 case COMMUNITY_PERMIT
:
19932 /* Display error string. */
19933 static void community_list_perror(struct vty
*vty
, int ret
)
19936 case COMMUNITY_LIST_ERR_CANT_FIND_LIST
:
19937 vty_out(vty
, "%% Can't find community-list\n");
19939 case COMMUNITY_LIST_ERR_MALFORMED_VAL
:
19940 vty_out(vty
, "%% Malformed community-list value\n");
19942 case COMMUNITY_LIST_ERR_STANDARD_CONFLICT
:
19944 "%% Community name conflict, previously defined as standard community\n");
19946 case COMMUNITY_LIST_ERR_EXPANDED_CONFLICT
:
19948 "%% Community name conflict, previously defined as expanded community\n");
19953 /* "community-list" keyword help string. */
19954 #define COMMUNITY_LIST_STR "Add a community list entry\n"
19956 /*community-list standard */
19957 DEFUN (community_list_standard
,
19958 bgp_community_list_standard_cmd
,
19959 "bgp community-list <(1-99)|standard COMMUNITY_LIST_NAME> [seq (0-4294967295)] <deny|permit> AA:NN...",
19962 "Community list number (standard)\n"
19963 "Add an standard community-list entry\n"
19964 "Community list name\n"
19965 "Sequence number of an entry\n"
19966 "Sequence number\n"
19967 "Specify community to reject\n"
19968 "Specify community to accept\n"
19971 char *cl_name_or_number
= NULL
;
19974 int style
= COMMUNITY_LIST_STANDARD
;
19977 if (argv_find(argv
, argc
, "(0-4294967295)", &idx
))
19978 seq
= argv
[idx
]->arg
;
19981 argv_find(argv
, argc
, "(1-99)", &idx
);
19982 argv_find(argv
, argc
, "COMMUNITY_LIST_NAME", &idx
);
19983 cl_name_or_number
= argv
[idx
]->arg
;
19984 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
19986 argv_find(argv
, argc
, "AA:NN", &idx
);
19987 char *str
= argv_concat(argv
, argc
, idx
);
19989 int ret
= community_list_set(bgp_clist
, cl_name_or_number
, str
, seq
,
19992 XFREE(MTYPE_TMP
, str
);
19995 /* Display error string. */
19996 community_list_perror(vty
, ret
);
19997 return CMD_WARNING_CONFIG_FAILED
;
20000 return CMD_SUCCESS
;
20003 DEFUN (no_community_list_standard_all
,
20004 no_bgp_community_list_standard_all_cmd
,
20005 "no bgp community-list <(1-99)|standard COMMUNITY_LIST_NAME> [seq (0-4294967295)] <deny|permit> AA:NN...",
20009 "Community list number (standard)\n"
20010 "Add an standard community-list entry\n"
20011 "Community list name\n"
20012 "Sequence number of an entry\n"
20013 "Sequence number\n"
20014 "Specify community to reject\n"
20015 "Specify community to accept\n"
20018 char *cl_name_or_number
= NULL
;
20021 int style
= COMMUNITY_LIST_STANDARD
;
20025 if (argv_find(argv
, argc
, "(0-4294967295)", &idx
))
20026 seq
= argv
[idx
]->arg
;
20029 argv_find(argv
, argc
, "permit", &idx
);
20030 argv_find(argv
, argc
, "deny", &idx
);
20033 direct
= argv_find(argv
, argc
, "permit", &idx
)
20038 argv_find(argv
, argc
, "AA:NN", &idx
);
20039 str
= argv_concat(argv
, argc
, idx
);
20043 argv_find(argv
, argc
, "(1-99)", &idx
);
20044 argv_find(argv
, argc
, "COMMUNITY_LIST_NAME", &idx
);
20045 cl_name_or_number
= argv
[idx
]->arg
;
20047 int ret
= community_list_unset(bgp_clist
, cl_name_or_number
, str
, seq
,
20050 XFREE(MTYPE_TMP
, str
);
20053 community_list_perror(vty
, ret
);
20054 return CMD_WARNING_CONFIG_FAILED
;
20057 return CMD_SUCCESS
;
20060 ALIAS(no_community_list_standard_all
, no_bgp_community_list_standard_all_list_cmd
,
20061 "no bgp community-list <(1-99)|standard COMMUNITY_LIST_NAME>",
20062 NO_STR BGP_STR COMMUNITY_LIST_STR
20063 "Community list number (standard)\n"
20064 "Add an standard community-list entry\n"
20065 "Community list name\n")
20067 /*community-list expanded */
20068 DEFUN (community_list_expanded_all
,
20069 bgp_community_list_expanded_all_cmd
,
20070 "bgp community-list <(100-500)|expanded COMMUNITY_LIST_NAME> [seq (0-4294967295)] <deny|permit> AA:NN...",
20073 "Community list number (expanded)\n"
20074 "Add an expanded community-list entry\n"
20075 "Community list name\n"
20076 "Sequence number of an entry\n"
20077 "Sequence number\n"
20078 "Specify community to reject\n"
20079 "Specify community to accept\n"
20082 char *cl_name_or_number
= NULL
;
20085 int style
= COMMUNITY_LIST_EXPANDED
;
20088 if (argv_find(argv
, argc
, "(0-4294967295)", &idx
))
20089 seq
= argv
[idx
]->arg
;
20093 argv_find(argv
, argc
, "(100-500)", &idx
);
20094 argv_find(argv
, argc
, "COMMUNITY_LIST_NAME", &idx
);
20095 cl_name_or_number
= argv
[idx
]->arg
;
20096 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
20098 argv_find(argv
, argc
, "AA:NN", &idx
);
20099 char *str
= argv_concat(argv
, argc
, idx
);
20101 int ret
= community_list_set(bgp_clist
, cl_name_or_number
, str
, seq
,
20104 XFREE(MTYPE_TMP
, str
);
20107 /* Display error string. */
20108 community_list_perror(vty
, ret
);
20109 return CMD_WARNING_CONFIG_FAILED
;
20112 return CMD_SUCCESS
;
20115 DEFUN (no_community_list_expanded_all
,
20116 no_bgp_community_list_expanded_all_cmd
,
20117 "no bgp community-list <(100-500)|expanded COMMUNITY_LIST_NAME> [seq (0-4294967295)] <deny|permit> AA:NN...",
20121 "Community list number (expanded)\n"
20122 "Add an expanded community-list entry\n"
20123 "Community list name\n"
20124 "Sequence number of an entry\n"
20125 "Sequence number\n"
20126 "Specify community to reject\n"
20127 "Specify community to accept\n"
20130 char *cl_name_or_number
= NULL
;
20134 int style
= COMMUNITY_LIST_EXPANDED
;
20137 if (argv_find(argv
, argc
, "(0-4294967295)", &idx
))
20138 seq
= argv
[idx
]->arg
;
20141 argv_find(argv
, argc
, "permit", &idx
);
20142 argv_find(argv
, argc
, "deny", &idx
);
20145 direct
= argv_find(argv
, argc
, "permit", &idx
)
20150 argv_find(argv
, argc
, "AA:NN", &idx
);
20151 str
= argv_concat(argv
, argc
, idx
);
20155 argv_find(argv
, argc
, "(100-500)", &idx
);
20156 argv_find(argv
, argc
, "COMMUNITY_LIST_NAME", &idx
);
20157 cl_name_or_number
= argv
[idx
]->arg
;
20159 int ret
= community_list_unset(bgp_clist
, cl_name_or_number
, str
, seq
,
20162 XFREE(MTYPE_TMP
, str
);
20165 community_list_perror(vty
, ret
);
20166 return CMD_WARNING_CONFIG_FAILED
;
20169 return CMD_SUCCESS
;
20172 ALIAS(no_community_list_expanded_all
,
20173 no_bgp_community_list_expanded_all_list_cmd
,
20174 "no bgp community-list <(100-500)|expanded COMMUNITY_LIST_NAME>",
20175 NO_STR BGP_STR COMMUNITY_LIST_STR
20176 "Community list number (expanded)\n"
20177 "Add an expanded community-list entry\n"
20178 "Community list name\n")
20180 /* Return configuration string of community-list entry. */
20181 static const char *community_list_config_str(struct community_entry
*entry
)
20188 if (entry
->style
== COMMUNITY_LIST_STANDARD
)
20189 str
= community_str(entry
->u
.com
, false, false);
20190 else if (entry
->style
== LARGE_COMMUNITY_LIST_STANDARD
)
20191 str
= lcommunity_str(entry
->u
.lcom
, false, false);
20193 str
= entry
->config
;
20198 static void community_list_show(struct vty
*vty
, struct community_list
*list
)
20200 struct community_entry
*entry
;
20202 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
20203 if (entry
== list
->head
) {
20204 if (all_digit(list
->name
))
20205 vty_out(vty
, "Community %s list %s\n",
20206 entry
->style
== COMMUNITY_LIST_STANDARD
20208 : "(expanded) access",
20211 vty_out(vty
, "Named Community %s list %s\n",
20212 entry
->style
== COMMUNITY_LIST_STANDARD
20218 vty_out(vty
, " %s\n",
20219 community_direct_str(entry
->direct
));
20221 vty_out(vty
, " %s %s\n",
20222 community_direct_str(entry
->direct
),
20223 community_list_config_str(entry
));
20227 DEFUN (show_community_list
,
20228 show_bgp_community_list_cmd
,
20229 "show bgp community-list",
20232 "List community-list\n")
20234 struct community_list
*list
;
20235 struct community_list_master
*cm
;
20237 cm
= community_list_master_lookup(bgp_clist
, COMMUNITY_LIST_MASTER
);
20239 return CMD_SUCCESS
;
20241 for (list
= cm
->num
.head
; list
; list
= list
->next
)
20242 community_list_show(vty
, list
);
20244 for (list
= cm
->str
.head
; list
; list
= list
->next
)
20245 community_list_show(vty
, list
);
20247 return CMD_SUCCESS
;
20250 DEFUN (show_community_list_arg
,
20251 show_bgp_community_list_arg_cmd
,
20252 "show bgp community-list <(1-500)|COMMUNITY_LIST_NAME> detail",
20255 "List community-list\n"
20256 "Community-list number\n"
20257 "Community-list name\n"
20258 "Detailed information on community-list\n")
20260 int idx_comm_list
= 3;
20261 struct community_list
*list
;
20263 list
= community_list_lookup(bgp_clist
, argv
[idx_comm_list
]->arg
, 0,
20264 COMMUNITY_LIST_MASTER
);
20266 vty_out(vty
, "%% Can't find community-list\n");
20267 return CMD_WARNING
;
20270 community_list_show(vty
, list
);
20272 return CMD_SUCCESS
;
20276 * Large Community code.
20278 static int lcommunity_list_set_vty(struct vty
*vty
, int argc
,
20279 struct cmd_token
**argv
, int style
,
20280 int reject_all_digit_name
)
20289 if (argv_find(argv
, argc
, "(0-4294967295)", &idx
))
20290 seq
= argv
[idx
]->arg
;
20293 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
20296 /* All digit name check. */
20298 argv_find(argv
, argc
, "LCOMMUNITY_LIST_NAME", &idx
);
20299 argv_find(argv
, argc
, "(1-99)", &idx
);
20300 argv_find(argv
, argc
, "(100-500)", &idx
);
20301 cl_name
= argv
[idx
]->arg
;
20302 if (reject_all_digit_name
&& all_digit(cl_name
)) {
20303 vty_out(vty
, "%% Community name cannot have all digits\n");
20304 return CMD_WARNING_CONFIG_FAILED
;
20308 argv_find(argv
, argc
, "AA:BB:CC", &idx
);
20309 argv_find(argv
, argc
, "LINE", &idx
);
20310 /* Concat community string argument. */
20312 str
= argv_concat(argv
, argc
, idx
);
20316 ret
= lcommunity_list_set(bgp_clist
, cl_name
, str
, seq
, direct
, style
);
20318 /* Free temporary community list string allocated by
20320 XFREE(MTYPE_TMP
, str
);
20323 community_list_perror(vty
, ret
);
20324 return CMD_WARNING_CONFIG_FAILED
;
20326 return CMD_SUCCESS
;
20329 static int lcommunity_list_unset_vty(struct vty
*vty
, int argc
,
20330 struct cmd_token
**argv
, int style
)
20338 if (argv_find(argv
, argc
, "(0-4294967295)", &idx
))
20339 seq
= argv
[idx
]->arg
;
20342 argv_find(argv
, argc
, "permit", &idx
);
20343 argv_find(argv
, argc
, "deny", &idx
);
20346 /* Check the list direct. */
20347 if (strncmp(argv
[idx
]->arg
, "p", 1) == 0)
20348 direct
= COMMUNITY_PERMIT
;
20350 direct
= COMMUNITY_DENY
;
20353 argv_find(argv
, argc
, "LINE", &idx
);
20354 argv_find(argv
, argc
, "AA:AA:NN", &idx
);
20355 /* Concat community string argument. */
20356 str
= argv_concat(argv
, argc
, idx
);
20360 argv_find(argv
, argc
, "(1-99)", &idx
);
20361 argv_find(argv
, argc
, "(100-500)", &idx
);
20362 argv_find(argv
, argc
, "LCOMMUNITY_LIST_NAME", &idx
);
20364 /* Unset community list. */
20365 ret
= lcommunity_list_unset(bgp_clist
, argv
[idx
]->arg
, str
, seq
, direct
,
20368 /* Free temporary community list string allocated by
20370 XFREE(MTYPE_TMP
, str
);
20373 community_list_perror(vty
, ret
);
20374 return CMD_WARNING_CONFIG_FAILED
;
20377 return CMD_SUCCESS
;
20380 /* "large-community-list" keyword help string. */
20381 #define LCOMMUNITY_LIST_STR "Add a large community list entry\n"
20382 #define LCOMMUNITY_VAL_STR "large community in 'aa:bb:cc' format\n"
20384 DEFUN (lcommunity_list_standard
,
20385 bgp_lcommunity_list_standard_cmd
,
20386 "bgp large-community-list (1-99) [seq (0-4294967295)] <deny|permit> AA:BB:CC...",
20388 LCOMMUNITY_LIST_STR
20389 "Large Community list number (standard)\n"
20390 "Sequence number of an entry\n"
20391 "Sequence number\n"
20392 "Specify large community to reject\n"
20393 "Specify large community to accept\n"
20394 LCOMMUNITY_VAL_STR
)
20396 return lcommunity_list_set_vty(vty
, argc
, argv
,
20397 LARGE_COMMUNITY_LIST_STANDARD
, 0);
20400 DEFUN (lcommunity_list_expanded
,
20401 bgp_lcommunity_list_expanded_cmd
,
20402 "bgp large-community-list (100-500) [seq (0-4294967295)] <deny|permit> LINE...",
20404 LCOMMUNITY_LIST_STR
20405 "Large Community list number (expanded)\n"
20406 "Sequence number of an entry\n"
20407 "Sequence number\n"
20408 "Specify large community to reject\n"
20409 "Specify large community to accept\n"
20410 "An ordered list as a regular-expression\n")
20412 return lcommunity_list_set_vty(vty
, argc
, argv
,
20413 LARGE_COMMUNITY_LIST_EXPANDED
, 0);
20416 DEFUN (lcommunity_list_name_standard
,
20417 bgp_lcommunity_list_name_standard_cmd
,
20418 "bgp large-community-list standard LCOMMUNITY_LIST_NAME [seq (0-4294967295)] <deny|permit> AA:BB:CC...",
20420 LCOMMUNITY_LIST_STR
20421 "Specify standard large-community-list\n"
20422 "Large Community list name\n"
20423 "Sequence number of an entry\n"
20424 "Sequence number\n"
20425 "Specify large community to reject\n"
20426 "Specify large community to accept\n"
20427 LCOMMUNITY_VAL_STR
)
20429 return lcommunity_list_set_vty(vty
, argc
, argv
,
20430 LARGE_COMMUNITY_LIST_STANDARD
, 1);
20433 DEFUN (lcommunity_list_name_expanded
,
20434 bgp_lcommunity_list_name_expanded_cmd
,
20435 "bgp large-community-list expanded LCOMMUNITY_LIST_NAME [seq (0-4294967295)] <deny|permit> LINE...",
20437 LCOMMUNITY_LIST_STR
20438 "Specify expanded large-community-list\n"
20439 "Large Community list name\n"
20440 "Sequence number of an entry\n"
20441 "Sequence number\n"
20442 "Specify large community to reject\n"
20443 "Specify large community to accept\n"
20444 "An ordered list as a regular-expression\n")
20446 return lcommunity_list_set_vty(vty
, argc
, argv
,
20447 LARGE_COMMUNITY_LIST_EXPANDED
, 1);
20450 DEFUN (no_lcommunity_list_all
,
20451 no_bgp_lcommunity_list_all_cmd
,
20452 "no bgp large-community-list <(1-99)|(100-500)|LCOMMUNITY_LIST_NAME>",
20455 LCOMMUNITY_LIST_STR
20456 "Large Community list number (standard)\n"
20457 "Large Community list number (expanded)\n"
20458 "Large Community list name\n")
20460 return lcommunity_list_unset_vty(vty
, argc
, argv
,
20461 LARGE_COMMUNITY_LIST_STANDARD
);
20464 DEFUN (no_lcommunity_list_name_standard_all
,
20465 no_bgp_lcommunity_list_name_standard_all_cmd
,
20466 "no bgp large-community-list standard LCOMMUNITY_LIST_NAME",
20469 LCOMMUNITY_LIST_STR
20470 "Specify standard large-community-list\n"
20471 "Large Community list name\n")
20473 return lcommunity_list_unset_vty(vty
, argc
, argv
,
20474 LARGE_COMMUNITY_LIST_STANDARD
);
20477 DEFUN (no_lcommunity_list_name_expanded_all
,
20478 no_bgp_lcommunity_list_name_expanded_all_cmd
,
20479 "no bgp large-community-list expanded LCOMMUNITY_LIST_NAME",
20482 LCOMMUNITY_LIST_STR
20483 "Specify expanded large-community-list\n"
20484 "Large Community list name\n")
20486 return lcommunity_list_unset_vty(vty
, argc
, argv
,
20487 LARGE_COMMUNITY_LIST_EXPANDED
);
20490 DEFUN (no_lcommunity_list_standard
,
20491 no_bgp_lcommunity_list_standard_cmd
,
20492 "no bgp large-community-list (1-99) [seq (0-4294967295)] <deny|permit> AA:AA:NN...",
20495 LCOMMUNITY_LIST_STR
20496 "Large Community list number (standard)\n"
20497 "Sequence number of an entry\n"
20498 "Sequence number\n"
20499 "Specify large community to reject\n"
20500 "Specify large community to accept\n"
20501 LCOMMUNITY_VAL_STR
)
20503 return lcommunity_list_unset_vty(vty
, argc
, argv
,
20504 LARGE_COMMUNITY_LIST_STANDARD
);
20507 DEFUN (no_lcommunity_list_expanded
,
20508 no_bgp_lcommunity_list_expanded_cmd
,
20509 "no bgp large-community-list (100-500) [seq (0-4294967295)] <deny|permit> LINE...",
20512 LCOMMUNITY_LIST_STR
20513 "Large Community list number (expanded)\n"
20514 "Sequence number of an entry\n"
20515 "Sequence number\n"
20516 "Specify large community to reject\n"
20517 "Specify large community to accept\n"
20518 "An ordered list as a regular-expression\n")
20520 return lcommunity_list_unset_vty(vty
, argc
, argv
,
20521 LARGE_COMMUNITY_LIST_EXPANDED
);
20524 DEFUN (no_lcommunity_list_name_standard
,
20525 no_bgp_lcommunity_list_name_standard_cmd
,
20526 "no bgp large-community-list standard LCOMMUNITY_LIST_NAME [seq (0-4294967295)] <deny|permit> AA:AA:NN...",
20529 LCOMMUNITY_LIST_STR
20530 "Specify standard large-community-list\n"
20531 "Large Community list name\n"
20532 "Sequence number of an entry\n"
20533 "Sequence number\n"
20534 "Specify large community to reject\n"
20535 "Specify large community to accept\n"
20536 LCOMMUNITY_VAL_STR
)
20538 return lcommunity_list_unset_vty(vty
, argc
, argv
,
20539 LARGE_COMMUNITY_LIST_STANDARD
);
20542 DEFUN (no_lcommunity_list_name_expanded
,
20543 no_bgp_lcommunity_list_name_expanded_cmd
,
20544 "no bgp large-community-list expanded LCOMMUNITY_LIST_NAME [seq (0-4294967295)] <deny|permit> LINE...",
20547 LCOMMUNITY_LIST_STR
20548 "Specify expanded large-community-list\n"
20549 "Large community list name\n"
20550 "Sequence number of an entry\n"
20551 "Sequence number\n"
20552 "Specify large community to reject\n"
20553 "Specify large community to accept\n"
20554 "An ordered list as a regular-expression\n")
20556 return lcommunity_list_unset_vty(vty
, argc
, argv
,
20557 LARGE_COMMUNITY_LIST_EXPANDED
);
20560 static void lcommunity_list_show(struct vty
*vty
, struct community_list
*list
)
20562 struct community_entry
*entry
;
20564 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
20565 if (entry
== list
->head
) {
20566 if (all_digit(list
->name
))
20567 vty_out(vty
, "Large community %s list %s\n",
20569 LARGE_COMMUNITY_LIST_STANDARD
20571 : "(expanded) access",
20575 "Named large community %s list %s\n",
20577 LARGE_COMMUNITY_LIST_STANDARD
20583 vty_out(vty
, " %s\n",
20584 community_direct_str(entry
->direct
));
20586 vty_out(vty
, " %s %s\n",
20587 community_direct_str(entry
->direct
),
20588 community_list_config_str(entry
));
20592 DEFUN (show_lcommunity_list
,
20593 show_bgp_lcommunity_list_cmd
,
20594 "show bgp large-community-list",
20597 "List large-community list\n")
20599 struct community_list
*list
;
20600 struct community_list_master
*cm
;
20602 cm
= community_list_master_lookup(bgp_clist
,
20603 LARGE_COMMUNITY_LIST_MASTER
);
20605 return CMD_SUCCESS
;
20607 for (list
= cm
->num
.head
; list
; list
= list
->next
)
20608 lcommunity_list_show(vty
, list
);
20610 for (list
= cm
->str
.head
; list
; list
= list
->next
)
20611 lcommunity_list_show(vty
, list
);
20613 return CMD_SUCCESS
;
20616 DEFUN (show_lcommunity_list_arg
,
20617 show_bgp_lcommunity_list_arg_cmd
,
20618 "show bgp large-community-list <(1-500)|LCOMMUNITY_LIST_NAME> detail",
20621 "List large-community list\n"
20622 "Large-community-list number\n"
20623 "Large-community-list name\n"
20624 "Detailed information on large-community-list\n")
20626 struct community_list
*list
;
20628 list
= community_list_lookup(bgp_clist
, argv
[3]->arg
, 0,
20629 LARGE_COMMUNITY_LIST_MASTER
);
20631 vty_out(vty
, "%% Can't find large-community-list\n");
20632 return CMD_WARNING
;
20635 lcommunity_list_show(vty
, list
);
20637 return CMD_SUCCESS
;
20640 /* "extcommunity-list" keyword help string. */
20641 #define EXTCOMMUNITY_LIST_STR "Add a extended community list entry\n"
20642 #define EXTCOMMUNITY_VAL_STR "Extended community attribute in 'rt aa:nn_or_IPaddr:nn' OR 'soo aa:nn_or_IPaddr:nn' format\n"
20644 DEFUN (extcommunity_list_standard
,
20645 bgp_extcommunity_list_standard_cmd
,
20646 "bgp extcommunity-list <(1-99)|standard EXTCOMMUNITY_LIST_NAME> [seq (0-4294967295)] <deny|permit> AA:NN...",
20648 EXTCOMMUNITY_LIST_STR
20649 "Extended Community list number (standard)\n"
20650 "Specify standard extcommunity-list\n"
20651 "Community list name\n"
20652 "Sequence number of an entry\n"
20653 "Sequence number\n"
20654 "Specify community to reject\n"
20655 "Specify community to accept\n"
20656 EXTCOMMUNITY_VAL_STR
)
20658 int style
= EXTCOMMUNITY_LIST_STANDARD
;
20660 char *cl_number_or_name
= NULL
;
20665 argv_find(argv
, argc
, "(1-99)", &idx
);
20666 argv_find(argv
, argc
, "EXTCOMMUNITY_LIST_NAME", &idx
);
20667 cl_number_or_name
= argv
[idx
]->arg
;
20669 if (argv_find(argv
, argc
, "(0-4294967295)", &idx
))
20670 seq
= argv
[idx
]->arg
;
20672 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
20674 argv_find(argv
, argc
, "AA:NN", &idx
);
20675 char *str
= argv_concat(argv
, argc
, idx
);
20677 int ret
= extcommunity_list_set(bgp_clist
, cl_number_or_name
, str
, seq
,
20680 XFREE(MTYPE_TMP
, str
);
20683 community_list_perror(vty
, ret
);
20684 return CMD_WARNING_CONFIG_FAILED
;
20687 return CMD_SUCCESS
;
20690 DEFUN (extcommunity_list_name_expanded
,
20691 bgp_extcommunity_list_name_expanded_cmd
,
20692 "bgp extcommunity-list <(100-500)|expanded EXTCOMMUNITY_LIST_NAME> [seq (0-4294967295)] <deny|permit> LINE...",
20694 EXTCOMMUNITY_LIST_STR
20695 "Extended Community list number (expanded)\n"
20696 "Specify expanded extcommunity-list\n"
20697 "Extended Community list name\n"
20698 "Sequence number of an entry\n"
20699 "Sequence number\n"
20700 "Specify community to reject\n"
20701 "Specify community to accept\n"
20702 "An ordered list as a regular-expression\n")
20704 int style
= EXTCOMMUNITY_LIST_EXPANDED
;
20706 char *cl_number_or_name
= NULL
;
20710 argv_find(argv
, argc
, "(100-500)", &idx
);
20711 argv_find(argv
, argc
, "EXTCOMMUNITY_LIST_NAME", &idx
);
20712 cl_number_or_name
= argv
[idx
]->arg
;
20714 if (argv_find(argv
, argc
, "(0-4294967295)", &idx
))
20715 seq
= argv
[idx
]->arg
;
20717 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
20719 argv_find(argv
, argc
, "LINE", &idx
);
20720 char *str
= argv_concat(argv
, argc
, idx
);
20722 int ret
= extcommunity_list_set(bgp_clist
, cl_number_or_name
, str
, seq
,
20725 XFREE(MTYPE_TMP
, str
);
20728 community_list_perror(vty
, ret
);
20729 return CMD_WARNING_CONFIG_FAILED
;
20732 return CMD_SUCCESS
;
20735 DEFUN (no_extcommunity_list_standard_all
,
20736 no_bgp_extcommunity_list_standard_all_cmd
,
20737 "no bgp extcommunity-list <(1-99)|standard EXTCOMMUNITY_LIST_NAME> [seq (0-4294967295)] <deny|permit> AA:NN...",
20740 EXTCOMMUNITY_LIST_STR
20741 "Extended Community list number (standard)\n"
20742 "Specify standard extcommunity-list\n"
20743 "Community list name\n"
20744 "Sequence number of an entry\n"
20745 "Sequence number\n"
20746 "Specify community to reject\n"
20747 "Specify community to accept\n"
20748 EXTCOMMUNITY_VAL_STR
)
20750 int style
= EXTCOMMUNITY_LIST_STANDARD
;
20752 char *cl_number_or_name
= NULL
;
20757 if (argv_find(argv
, argc
, "(0-4294967295)", &idx
))
20758 seq
= argv
[idx
]->arg
;
20761 argv_find(argv
, argc
, "permit", &idx
);
20762 argv_find(argv
, argc
, "deny", &idx
);
20764 direct
= argv_find(argv
, argc
, "permit", &idx
)
20769 argv_find(argv
, argc
, "AA:NN", &idx
);
20770 str
= argv_concat(argv
, argc
, idx
);
20774 argv_find(argv
, argc
, "(1-99)", &idx
);
20775 argv_find(argv
, argc
, "EXTCOMMUNITY_LIST_NAME", &idx
);
20776 cl_number_or_name
= argv
[idx
]->arg
;
20778 int ret
= extcommunity_list_unset(bgp_clist
, cl_number_or_name
, str
,
20779 seq
, direct
, style
);
20781 XFREE(MTYPE_TMP
, str
);
20784 community_list_perror(vty
, ret
);
20785 return CMD_WARNING_CONFIG_FAILED
;
20788 return CMD_SUCCESS
;
20791 ALIAS(no_extcommunity_list_standard_all
,
20792 no_bgp_extcommunity_list_standard_all_list_cmd
,
20793 "no bgp extcommunity-list <(1-99)|standard EXTCOMMUNITY_LIST_NAME>",
20794 NO_STR BGP_STR EXTCOMMUNITY_LIST_STR
20795 "Extended Community list number (standard)\n"
20796 "Specify standard extcommunity-list\n"
20797 "Community list name\n")
20799 DEFUN (no_extcommunity_list_expanded_all
,
20800 no_bgp_extcommunity_list_expanded_all_cmd
,
20801 "no bgp extcommunity-list <(100-500)|expanded EXTCOMMUNITY_LIST_NAME> [seq (0-4294967295)] <deny|permit> LINE...",
20804 EXTCOMMUNITY_LIST_STR
20805 "Extended Community list number (expanded)\n"
20806 "Specify expanded extcommunity-list\n"
20807 "Extended Community list name\n"
20808 "Sequence number of an entry\n"
20809 "Sequence number\n"
20810 "Specify community to reject\n"
20811 "Specify community to accept\n"
20812 "An ordered list as a regular-expression\n")
20814 int style
= EXTCOMMUNITY_LIST_EXPANDED
;
20816 char *cl_number_or_name
= NULL
;
20821 if (argv_find(argv
, argc
, "(0-4294967295)", &idx
))
20822 seq
= argv
[idx
]->arg
;
20825 argv_find(argv
, argc
, "permit", &idx
);
20826 argv_find(argv
, argc
, "deny", &idx
);
20829 direct
= argv_find(argv
, argc
, "permit", &idx
)
20834 argv_find(argv
, argc
, "LINE", &idx
);
20835 str
= argv_concat(argv
, argc
, idx
);
20839 argv_find(argv
, argc
, "(100-500)", &idx
);
20840 argv_find(argv
, argc
, "EXTCOMMUNITY_LIST_NAME", &idx
);
20841 cl_number_or_name
= argv
[idx
]->arg
;
20843 int ret
= extcommunity_list_unset(bgp_clist
, cl_number_or_name
, str
,
20844 seq
, direct
, style
);
20846 XFREE(MTYPE_TMP
, str
);
20849 community_list_perror(vty
, ret
);
20850 return CMD_WARNING_CONFIG_FAILED
;
20853 return CMD_SUCCESS
;
20856 ALIAS(no_extcommunity_list_expanded_all
,
20857 no_bgp_extcommunity_list_expanded_all_list_cmd
,
20858 "no bgp extcommunity-list <(100-500)|expanded EXTCOMMUNITY_LIST_NAME>",
20859 NO_STR BGP_STR EXTCOMMUNITY_LIST_STR
20860 "Extended Community list number (expanded)\n"
20861 "Specify expanded extcommunity-list\n"
20862 "Extended Community list name\n")
20864 static void extcommunity_list_show(struct vty
*vty
, struct community_list
*list
)
20866 struct community_entry
*entry
;
20868 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
20869 if (entry
== list
->head
) {
20870 if (all_digit(list
->name
))
20871 vty_out(vty
, "Extended community %s list %s\n",
20872 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
20874 : "(expanded) access",
20878 "Named extended community %s list %s\n",
20879 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
20885 vty_out(vty
, " %s\n",
20886 community_direct_str(entry
->direct
));
20888 vty_out(vty
, " %s %s\n",
20889 community_direct_str(entry
->direct
),
20890 community_list_config_str(entry
));
20894 DEFUN (show_extcommunity_list
,
20895 show_bgp_extcommunity_list_cmd
,
20896 "show bgp extcommunity-list",
20899 "List extended-community list\n")
20901 struct community_list
*list
;
20902 struct community_list_master
*cm
;
20904 cm
= community_list_master_lookup(bgp_clist
, EXTCOMMUNITY_LIST_MASTER
);
20906 return CMD_SUCCESS
;
20908 for (list
= cm
->num
.head
; list
; list
= list
->next
)
20909 extcommunity_list_show(vty
, list
);
20911 for (list
= cm
->str
.head
; list
; list
= list
->next
)
20912 extcommunity_list_show(vty
, list
);
20914 return CMD_SUCCESS
;
20917 DEFUN (show_extcommunity_list_arg
,
20918 show_bgp_extcommunity_list_arg_cmd
,
20919 "show bgp extcommunity-list <(1-500)|EXTCOMMUNITY_LIST_NAME> detail",
20922 "List extended-community list\n"
20923 "Extcommunity-list number\n"
20924 "Extcommunity-list name\n"
20925 "Detailed information on extcommunity-list\n")
20927 int idx_comm_list
= 3;
20928 struct community_list
*list
;
20930 list
= community_list_lookup(bgp_clist
, argv
[idx_comm_list
]->arg
, 0,
20931 EXTCOMMUNITY_LIST_MASTER
);
20933 vty_out(vty
, "%% Can't find extcommunity-list\n");
20934 return CMD_WARNING
;
20937 extcommunity_list_show(vty
, list
);
20939 return CMD_SUCCESS
;
20942 /* Display community-list and extcommunity-list configuration. */
20943 static int community_list_config_write(struct vty
*vty
)
20945 struct community_list
*list
;
20946 struct community_entry
*entry
;
20947 struct community_list_master
*cm
;
20950 /* Community-list. */
20951 cm
= community_list_master_lookup(bgp_clist
, COMMUNITY_LIST_MASTER
);
20953 for (list
= cm
->num
.head
; list
; list
= list
->next
)
20954 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
20956 "bgp community-list %s seq %" PRId64
" %s %s\n",
20957 list
->name
, entry
->seq
,
20958 community_direct_str(entry
->direct
),
20959 community_list_config_str(entry
));
20962 for (list
= cm
->str
.head
; list
; list
= list
->next
)
20963 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
20965 "bgp community-list %s %s seq %" PRId64
" %s %s\n",
20966 entry
->style
== COMMUNITY_LIST_STANDARD
20969 list
->name
, entry
->seq
,
20970 community_direct_str(entry
->direct
),
20971 community_list_config_str(entry
));
20975 /* Extcommunity-list. */
20976 cm
= community_list_master_lookup(bgp_clist
, EXTCOMMUNITY_LIST_MASTER
);
20978 for (list
= cm
->num
.head
; list
; list
= list
->next
)
20979 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
20981 "bgp extcommunity-list %s seq %" PRId64
" %s %s\n",
20982 list
->name
, entry
->seq
,
20983 community_direct_str(entry
->direct
),
20984 community_list_config_str(entry
));
20987 for (list
= cm
->str
.head
; list
; list
= list
->next
)
20988 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
20990 "bgp extcommunity-list %s %s seq %" PRId64
" %s %s\n",
20991 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
20994 list
->name
, entry
->seq
,
20995 community_direct_str(entry
->direct
),
20996 community_list_config_str(entry
));
21001 /* lcommunity-list. */
21002 cm
= community_list_master_lookup(bgp_clist
,
21003 LARGE_COMMUNITY_LIST_MASTER
);
21005 for (list
= cm
->num
.head
; list
; list
= list
->next
)
21006 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
21008 "bgp large-community-list %s seq %" PRId64
" %s %s\n",
21009 list
->name
, entry
->seq
,
21010 community_direct_str(entry
->direct
),
21011 community_list_config_str(entry
));
21014 for (list
= cm
->str
.head
; list
; list
= list
->next
)
21015 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
21017 "bgp large-community-list %s %s seq %" PRId64
" %s %s\n",
21019 entry
->style
== LARGE_COMMUNITY_LIST_STANDARD
21022 list
->name
, entry
->seq
, community_direct_str(entry
->direct
),
21023 community_list_config_str(entry
));
21030 static int community_list_config_write(struct vty
*vty
);
21031 static struct cmd_node community_list_node
= {
21032 .name
= "community list",
21033 .node
= COMMUNITY_LIST_NODE
,
21035 .config_write
= community_list_config_write
,
21038 static void community_list_vty(void)
21040 install_node(&community_list_node
);
21042 /* Community-list. */
21043 install_element(CONFIG_NODE
, &bgp_community_list_standard_cmd
);
21044 install_element(CONFIG_NODE
, &bgp_community_list_expanded_all_cmd
);
21045 install_element(CONFIG_NODE
, &no_bgp_community_list_standard_all_cmd
);
21046 install_element(CONFIG_NODE
, &no_bgp_community_list_standard_all_list_cmd
);
21047 install_element(CONFIG_NODE
, &no_bgp_community_list_expanded_all_cmd
);
21048 install_element(CONFIG_NODE
, &no_bgp_community_list_expanded_all_list_cmd
);
21049 install_element(VIEW_NODE
, &show_bgp_community_list_cmd
);
21050 install_element(VIEW_NODE
, &show_bgp_community_list_arg_cmd
);
21052 /* Extcommunity-list. */
21053 install_element(CONFIG_NODE
, &bgp_extcommunity_list_standard_cmd
);
21054 install_element(CONFIG_NODE
, &bgp_extcommunity_list_name_expanded_cmd
);
21055 install_element(CONFIG_NODE
, &no_bgp_extcommunity_list_standard_all_cmd
);
21056 install_element(CONFIG_NODE
,
21057 &no_bgp_extcommunity_list_standard_all_list_cmd
);
21058 install_element(CONFIG_NODE
, &no_bgp_extcommunity_list_expanded_all_cmd
);
21059 install_element(CONFIG_NODE
,
21060 &no_bgp_extcommunity_list_expanded_all_list_cmd
);
21061 install_element(VIEW_NODE
, &show_bgp_extcommunity_list_cmd
);
21062 install_element(VIEW_NODE
, &show_bgp_extcommunity_list_arg_cmd
);
21064 /* Large Community List */
21065 install_element(CONFIG_NODE
, &bgp_lcommunity_list_standard_cmd
);
21066 install_element(CONFIG_NODE
, &bgp_lcommunity_list_expanded_cmd
);
21067 install_element(CONFIG_NODE
, &bgp_lcommunity_list_name_standard_cmd
);
21068 install_element(CONFIG_NODE
, &bgp_lcommunity_list_name_expanded_cmd
);
21069 install_element(CONFIG_NODE
, &no_bgp_lcommunity_list_all_cmd
);
21070 install_element(CONFIG_NODE
,
21071 &no_bgp_lcommunity_list_name_standard_all_cmd
);
21072 install_element(CONFIG_NODE
,
21073 &no_bgp_lcommunity_list_name_expanded_all_cmd
);
21074 install_element(CONFIG_NODE
, &no_bgp_lcommunity_list_standard_cmd
);
21075 install_element(CONFIG_NODE
, &no_bgp_lcommunity_list_expanded_cmd
);
21076 install_element(CONFIG_NODE
, &no_bgp_lcommunity_list_name_standard_cmd
);
21077 install_element(CONFIG_NODE
, &no_bgp_lcommunity_list_name_expanded_cmd
);
21078 install_element(VIEW_NODE
, &show_bgp_lcommunity_list_cmd
);
21079 install_element(VIEW_NODE
, &show_bgp_lcommunity_list_arg_cmd
);
21081 bgp_community_list_command_completion_setup();
21084 static struct cmd_node community_alias_node
= {
21085 .name
= "community alias",
21086 .node
= COMMUNITY_ALIAS_NODE
,
21088 .config_write
= bgp_community_alias_write
,
21091 void community_alias_vty(void)
21093 install_node(&community_alias_node
);
21095 /* Community-list. */
21096 install_element(CONFIG_NODE
, &bgp_community_alias_cmd
);
21098 bgp_community_alias_command_completion_setup();