2 * Copyright (C) 1996, 97, 98, 99, 2000 Kunihiro Ishiguro
4 * This file is part of GNU Zebra.
6 * GNU Zebra is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2, or (at your option) any
11 * GNU Zebra is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program; see the file COPYING; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25 #include "lib/zclient.h"
34 #include "memory_vty.h"
40 #include "bgpd/bgpd.h"
41 #include "bgpd/bgp_attr_evpn.h"
42 #include "bgpd/bgp_advertise.h"
43 #include "bgpd/bgp_attr.h"
44 #include "bgpd/bgp_aspath.h"
45 #include "bgpd/bgp_community.h"
46 #include "bgpd/bgp_ecommunity.h"
47 #include "bgpd/bgp_lcommunity.h"
48 #include "bgpd/bgp_damp.h"
49 #include "bgpd/bgp_debug.h"
50 #include "bgpd/bgp_errors.h"
51 #include "bgpd/bgp_fsm.h"
52 #include "bgpd/bgp_nexthop.h"
53 #include "bgpd/bgp_open.h"
54 #include "bgpd/bgp_regex.h"
55 #include "bgpd/bgp_route.h"
56 #include "bgpd/bgp_mplsvpn.h"
57 #include "bgpd/bgp_zebra.h"
58 #include "bgpd/bgp_table.h"
59 #include "bgpd/bgp_vty.h"
60 #include "bgpd/bgp_mpath.h"
61 #include "bgpd/bgp_packet.h"
62 #include "bgpd/bgp_updgrp.h"
63 #include "bgpd/bgp_bfd.h"
64 #include "bgpd/bgp_io.h"
65 #include "bgpd/bgp_evpn.h"
66 #include "bgpd/bgp_addpath.h"
67 #include "bgpd/bgp_mac.h"
69 static struct peer_group
*listen_range_exists(struct bgp
*bgp
,
70 struct prefix
*range
, int exact
);
72 static enum node_type
bgp_node_type(afi_t afi
, safi_t safi
)
81 return BGP_IPV4M_NODE
;
83 case SAFI_LABELED_UNICAST
:
84 return BGP_IPV4L_NODE
;
87 return BGP_VPNV4_NODE
;
90 return BGP_FLOWSPECV4_NODE
;
100 return BGP_IPV6_NODE
;
103 return BGP_IPV6M_NODE
;
105 case SAFI_LABELED_UNICAST
:
106 return BGP_IPV6L_NODE
;
109 return BGP_VPNV6_NODE
;
112 return BGP_FLOWSPECV6_NODE
;
115 return BGP_IPV4_NODE
;
120 return BGP_EVPN_NODE
;
124 // We should never be here but to clarify the switch statement..
125 return BGP_IPV4_NODE
;
129 // Impossible to happen
130 return BGP_IPV4_NODE
;
133 /* Utility function to get address family from current node. */
134 afi_t
bgp_node_afi(struct vty
*vty
)
142 case BGP_FLOWSPECV6_NODE
:
155 /* Utility function to get subsequent address family from current
157 safi_t
bgp_node_safi(struct vty
*vty
)
163 safi
= SAFI_MPLS_VPN
;
167 safi
= SAFI_MULTICAST
;
174 safi
= SAFI_LABELED_UNICAST
;
176 case BGP_FLOWSPECV4_NODE
:
177 case BGP_FLOWSPECV6_NODE
:
178 safi
= SAFI_FLOWSPEC
;
188 * Converts an AFI in string form to afi_t
190 * @param afi string, one of
194 * @return the corresponding afi_t
196 afi_t
bgp_vty_afi_from_str(const char *afi_str
)
198 afi_t afi
= AFI_MAX
; /* unknown */
199 if (strmatch(afi_str
, "ipv4"))
201 else if (strmatch(afi_str
, "ipv6"))
203 else if (strmatch(afi_str
, "l2vpn"))
208 int argv_find_and_parse_afi(struct cmd_token
**argv
, int argc
, int *index
,
212 if (argv_find(argv
, argc
, "ipv4", index
)) {
216 } else if (argv_find(argv
, argc
, "ipv6", index
)) {
220 } else if (argv_find(argv
, argc
, "l2vpn", index
)) {
228 /* supports <unicast|multicast|vpn|labeled-unicast> */
229 safi_t
bgp_vty_safi_from_str(const char *safi_str
)
231 safi_t safi
= SAFI_MAX
; /* unknown */
232 if (strmatch(safi_str
, "multicast"))
233 safi
= SAFI_MULTICAST
;
234 else if (strmatch(safi_str
, "unicast"))
236 else if (strmatch(safi_str
, "vpn"))
237 safi
= SAFI_MPLS_VPN
;
238 else if (strmatch(safi_str
, "evpn"))
240 else if (strmatch(safi_str
, "labeled-unicast"))
241 safi
= SAFI_LABELED_UNICAST
;
242 else if (strmatch(safi_str
, "flowspec"))
243 safi
= SAFI_FLOWSPEC
;
247 int argv_find_and_parse_safi(struct cmd_token
**argv
, int argc
, int *index
,
251 if (argv_find(argv
, argc
, "unicast", index
)) {
254 *safi
= SAFI_UNICAST
;
255 } else if (argv_find(argv
, argc
, "multicast", index
)) {
258 *safi
= SAFI_MULTICAST
;
259 } else if (argv_find(argv
, argc
, "labeled-unicast", index
)) {
262 *safi
= SAFI_LABELED_UNICAST
;
263 } else if (argv_find(argv
, argc
, "vpn", index
)) {
266 *safi
= SAFI_MPLS_VPN
;
267 } else if (argv_find(argv
, argc
, "evpn", index
)) {
271 } else if (argv_find(argv
, argc
, "flowspec", index
)) {
274 *safi
= SAFI_FLOWSPEC
;
280 * bgp_vty_find_and_parse_afi_safi_bgp
282 * For a given 'show ...' command, correctly parse the afi/safi/bgp out from it
283 * This function *assumes* that the calling function pre-sets the afi/safi/bgp
284 * to appropriate values for the calling function. This is to allow the
285 * calling function to make decisions appropriate for the show command
286 * that is being parsed.
288 * The show commands are generally of the form:
289 * "show [ip] bgp [<view|vrf> VIEWVRFNAME] [<ipv4|ipv6>
290 * [<unicast|multicast|vpn|labeled-unicast>]] ..."
292 * Since we use argv_find if the show command in particular doesn't have:
294 * [<view|vrf> VIEWVRFNAME]
295 * [<ipv4|ipv6> [<unicast|multicast|vpn|labeled-unicast>]]
296 * The command parsing should still be ok.
298 * vty -> The vty for the command so we can output some useful data in
299 * the event of a parse error in the vrf.
300 * argv -> The command tokens
301 * argc -> How many command tokens we have
302 * idx -> The current place in the command, generally should be 0 for this
304 * afi -> The parsed afi if it was included in the show command, returned here
305 * safi -> The parsed safi if it was included in the show command, returned here
306 * bgp -> Pointer to the bgp data structure we need to fill in.
307 * use_json -> json is configured or not
309 * The function returns the correct location in the parse tree for the
312 * Returns 0 for failure to parse correctly, else the idx position of where
313 * it found the last token.
315 int bgp_vty_find_and_parse_afi_safi_bgp(struct vty
*vty
,
316 struct cmd_token
**argv
, int argc
,
317 int *idx
, afi_t
*afi
, safi_t
*safi
,
318 struct bgp
**bgp
, bool use_json
)
320 char *vrf_name
= NULL
;
326 if (argv_find(argv
, argc
, "ip", idx
))
329 if (argv_find(argv
, argc
, "view", idx
))
330 vrf_name
= argv
[*idx
+ 1]->arg
;
331 else if (argv_find(argv
, argc
, "vrf", idx
)) {
332 vrf_name
= argv
[*idx
+ 1]->arg
;
333 if (strmatch(vrf_name
, VRF_DEFAULT_NAME
))
337 if (strmatch(vrf_name
, "all"))
340 *bgp
= bgp_lookup_by_name(vrf_name
);
343 json_object
*json
= NULL
;
344 json
= json_object_new_object();
345 json_object_string_add(
347 "View/Vrf is unknown");
349 json_object_to_json_string_ext(json
,
350 JSON_C_TO_STRING_PRETTY
));
351 json_object_free(json
);
354 vty_out(vty
, "View/Vrf %s is unknown\n",
361 *bgp
= bgp_get_default();
364 json_object
*json
= NULL
;
365 json
= json_object_new_object();
366 json_object_string_add(
368 "Default BGP instance not found");
370 json_object_to_json_string_ext(json
,
371 JSON_C_TO_STRING_PRETTY
));
372 json_object_free(json
);
376 "Default BGP instance not found\n");
382 if (argv_find_and_parse_afi(argv
, argc
, idx
, afi
))
383 argv_find_and_parse_safi(argv
, argc
, idx
, safi
);
389 static int peer_address_self_check(struct bgp
*bgp
, union sockunion
*su
)
391 struct interface
*ifp
= NULL
;
393 if (su
->sa
.sa_family
== AF_INET
)
394 ifp
= if_lookup_by_ipv4_exact(&su
->sin
.sin_addr
, bgp
->vrf_id
);
395 else if (su
->sa
.sa_family
== AF_INET6
)
396 ifp
= if_lookup_by_ipv6_exact(&su
->sin6
.sin6_addr
,
397 su
->sin6
.sin6_scope_id
,
406 /* Utility function for looking up peer from VTY. */
407 /* This is used only for configuration, so disallow if attempted on
408 * a dynamic neighbor.
410 static struct peer
*peer_lookup_vty(struct vty
*vty
, const char *ip_str
)
412 struct bgp
*bgp
= VTY_GET_CONTEXT(bgp
);
421 ret
= str2sockunion(ip_str
, &su
);
423 peer
= peer_lookup_by_conf_if(bgp
, ip_str
);
425 if ((peer
= peer_lookup_by_hostname(bgp
, ip_str
))
428 "%% Malformed address or name: %s\n",
434 peer
= peer_lookup(bgp
, &su
);
437 "%% Specify remote-as or peer-group commands first\n");
440 if (peer_dynamic_neighbor(peer
)) {
442 "%% Operation not allowed on a dynamic neighbor\n");
449 /* Utility function for looking up peer or peer group. */
450 /* This is used only for configuration, so disallow if attempted on
451 * a dynamic neighbor.
453 struct peer
*peer_and_group_lookup_vty(struct vty
*vty
, const char *peer_str
)
455 struct bgp
*bgp
= VTY_GET_CONTEXT(bgp
);
458 struct peer
*peer
= NULL
;
459 struct peer_group
*group
= NULL
;
465 ret
= str2sockunion(peer_str
, &su
);
467 /* IP address, locate peer. */
468 peer
= peer_lookup(bgp
, &su
);
470 /* Not IP, could match either peer configured on interface or a
472 peer
= peer_lookup_by_conf_if(bgp
, peer_str
);
474 group
= peer_group_lookup(bgp
, peer_str
);
478 if (peer_dynamic_neighbor(peer
)) {
480 "%% Operation not allowed on a dynamic neighbor\n");
490 vty_out(vty
, "%% Specify remote-as or peer-group commands first\n");
495 int bgp_vty_return(struct vty
*vty
, int ret
)
497 const char *str
= NULL
;
500 case BGP_ERR_INVALID_VALUE
:
501 str
= "Invalid value";
503 case BGP_ERR_INVALID_FLAG
:
504 str
= "Invalid flag";
506 case BGP_ERR_PEER_GROUP_SHUTDOWN
:
507 str
= "Peer-group has been shutdown. Activate the peer-group first";
509 case BGP_ERR_PEER_FLAG_CONFLICT
:
510 str
= "Can't set override-capability and strict-capability-match at the same time";
512 case BGP_ERR_PEER_GROUP_NO_REMOTE_AS
:
513 str
= "Specify remote-as or peer-group remote AS first";
515 case BGP_ERR_PEER_GROUP_CANT_CHANGE
:
516 str
= "Cannot change the peer-group. Deconfigure first";
518 case BGP_ERR_PEER_GROUP_MISMATCH
:
519 str
= "Peer is not a member of this peer-group";
521 case BGP_ERR_PEER_FILTER_CONFLICT
:
522 str
= "Prefix/distribute list can not co-exist";
524 case BGP_ERR_NOT_INTERNAL_PEER
:
525 str
= "Invalid command. Not an internal neighbor";
527 case BGP_ERR_REMOVE_PRIVATE_AS
:
528 str
= "remove-private-AS cannot be configured for IBGP peers";
530 case BGP_ERR_LOCAL_AS_ALLOWED_ONLY_FOR_EBGP
:
531 str
= "Local-AS allowed only for EBGP peers";
533 case BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS
:
534 str
= "Cannot have local-as same as BGP AS number";
536 case BGP_ERR_TCPSIG_FAILED
:
537 str
= "Error while applying TCP-Sig to session(s)";
539 case BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
:
540 str
= "ebgp-multihop and ttl-security cannot be configured together";
542 case BGP_ERR_NO_IBGP_WITH_TTLHACK
:
543 str
= "ttl-security only allowed for EBGP peers";
545 case BGP_ERR_AS_OVERRIDE
:
546 str
= "as-override cannot be configured for IBGP peers";
548 case BGP_ERR_INVALID_DYNAMIC_NEIGHBORS_LIMIT
:
549 str
= "Invalid limit for number of dynamic neighbors";
551 case BGP_ERR_DYNAMIC_NEIGHBORS_RANGE_EXISTS
:
552 str
= "Dynamic neighbor listen range already exists";
554 case BGP_ERR_INVALID_FOR_DYNAMIC_PEER
:
555 str
= "Operation not allowed on a dynamic neighbor";
557 case BGP_ERR_INVALID_FOR_DIRECT_PEER
:
558 str
= "Operation not allowed on a directly connected neighbor";
560 case BGP_ERR_PEER_SAFI_CONFLICT
:
561 str
= "Cannot activate peer for both 'ipv4 unicast' and 'ipv4 labeled-unicast'";
565 vty_out(vty
, "%% %s\n", str
);
566 return CMD_WARNING_CONFIG_FAILED
;
571 /* BGP clear sort. */
580 static void bgp_clear_vty_error(struct vty
*vty
, struct peer
*peer
, afi_t afi
,
581 safi_t safi
, int error
)
584 case BGP_ERR_AF_UNCONFIGURED
:
586 "%%BGP: Enable %s address family for the neighbor %s\n",
587 afi_safi_print(afi
, safi
), peer
->host
);
589 case BGP_ERR_SOFT_RECONFIG_UNCONFIGURED
:
591 "%%BGP: Inbound soft reconfig for %s not possible as it\n has neither refresh capability, nor inbound soft reconfig\n",
599 /* `clear ip bgp' functions. */
600 static int bgp_clear(struct vty
*vty
, struct bgp
*bgp
, afi_t afi
, safi_t safi
,
601 enum clear_sort sort
, enum bgp_clear_type stype
,
607 struct listnode
*node
, *nnode
;
609 /* Clear all neighbors. */
611 * Pass along pointer to next node to peer_clear() when walking all
612 * nodes on the BGP instance as that may get freed if it is a
615 if (sort
== clear_all
) {
616 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
617 if (!peer
->afc
[afi
][safi
])
620 if (stype
== BGP_CLEAR_SOFT_NONE
)
621 ret
= peer_clear(peer
, &nnode
);
623 ret
= peer_clear_soft(peer
, afi
, safi
, stype
);
626 bgp_clear_vty_error(vty
, peer
, afi
, safi
, ret
);
629 /* This is to apply read-only mode on this clear. */
630 if (stype
== BGP_CLEAR_SOFT_NONE
)
631 bgp
->update_delay_over
= 0;
636 /* Clear specified neighbor. */
637 if (sort
== clear_peer
) {
640 /* Make sockunion for lookup. */
641 ret
= str2sockunion(arg
, &su
);
643 peer
= peer_lookup_by_conf_if(bgp
, arg
);
645 peer
= peer_lookup_by_hostname(bgp
, arg
);
648 "Malformed address or name: %s\n",
654 peer
= peer_lookup(bgp
, &su
);
657 "%%BGP: Unknown neighbor - \"%s\"\n",
663 if (!peer
->afc
[afi
][safi
])
664 ret
= BGP_ERR_AF_UNCONFIGURED
;
665 else if (stype
== BGP_CLEAR_SOFT_NONE
)
666 ret
= peer_clear(peer
, NULL
);
668 ret
= peer_clear_soft(peer
, afi
, safi
, stype
);
671 bgp_clear_vty_error(vty
, peer
, afi
, safi
, ret
);
676 /* Clear all neighbors belonging to a specific peer-group. */
677 if (sort
== clear_group
) {
678 struct peer_group
*group
;
680 group
= peer_group_lookup(bgp
, arg
);
682 vty_out(vty
, "%%BGP: No such peer-group %s\n", arg
);
686 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
687 if (!peer
->afc
[afi
][safi
])
690 if (stype
== BGP_CLEAR_SOFT_NONE
)
691 ret
= peer_clear(peer
, NULL
);
693 ret
= peer_clear_soft(peer
, afi
, safi
, stype
);
696 bgp_clear_vty_error(vty
, peer
, afi
, safi
, ret
);
703 "%%BGP: No %s peer belonging to peer-group %s is configured\n",
704 afi_safi_print(afi
, safi
), arg
);
709 /* Clear all external (eBGP) neighbors. */
710 if (sort
== clear_external
) {
711 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
712 if (peer
->sort
== BGP_PEER_IBGP
)
715 if (!peer
->afc
[afi
][safi
])
718 if (stype
== BGP_CLEAR_SOFT_NONE
)
719 ret
= peer_clear(peer
, &nnode
);
721 ret
= peer_clear_soft(peer
, afi
, safi
, stype
);
724 bgp_clear_vty_error(vty
, peer
, afi
, safi
, ret
);
731 "%%BGP: No external %s peer is configured\n",
732 afi_safi_print(afi
, safi
));
737 /* Clear all neighbors belonging to a specific AS. */
738 if (sort
== clear_as
) {
739 as_t as
= strtoul(arg
, NULL
, 10);
741 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
745 if (!peer
->afc
[afi
][safi
])
746 ret
= BGP_ERR_AF_UNCONFIGURED
;
747 else if (stype
== BGP_CLEAR_SOFT_NONE
)
748 ret
= peer_clear(peer
, &nnode
);
750 ret
= peer_clear_soft(peer
, afi
, safi
, stype
);
753 bgp_clear_vty_error(vty
, peer
, afi
, safi
, ret
);
760 "%%BGP: No %s peer is configured with AS %s\n",
761 afi_safi_print(afi
, safi
), arg
);
769 static int bgp_clear_vty(struct vty
*vty
, const char *name
, afi_t afi
,
770 safi_t safi
, enum clear_sort sort
,
771 enum bgp_clear_type stype
, const char *arg
)
775 /* BGP structure lookup. */
777 bgp
= bgp_lookup_by_name(name
);
779 vty_out(vty
, "Can't find BGP instance %s\n", name
);
783 bgp
= bgp_get_default();
785 vty_out(vty
, "No BGP process is configured\n");
790 return bgp_clear(vty
, bgp
, afi
, safi
, sort
, stype
, arg
);
793 /* clear soft inbound */
794 static void bgp_clear_star_soft_in(struct vty
*vty
, const char *name
)
799 FOREACH_AFI_SAFI (afi
, safi
)
800 bgp_clear_vty(vty
, name
, afi
, safi
, clear_all
,
801 BGP_CLEAR_SOFT_IN
, NULL
);
804 /* clear soft outbound */
805 static void bgp_clear_star_soft_out(struct vty
*vty
, const char *name
)
810 FOREACH_AFI_SAFI (afi
, safi
)
811 bgp_clear_vty(vty
, name
, afi
, safi
, clear_all
,
812 BGP_CLEAR_SOFT_OUT
, NULL
);
816 #ifndef VTYSH_EXTRACT_PL
817 #include "bgpd/bgp_vty_clippy.c"
820 DEFUN_HIDDEN (bgp_local_mac
,
822 "bgp local-mac vni " CMD_VNI_RANGE
" mac WORD seq (0-4294967295)",
825 "VxLAN Network Identifier\n"
829 "mac-mobility sequence\n"
839 vni
= strtoul(argv
[3]->arg
, NULL
, 10);
840 if (!prefix_str2mac(argv
[5]->arg
, &mac
)) {
841 vty_out(vty
, "%% Malformed MAC address\n");
844 memset(&ip
, 0, sizeof(ip
));
845 seq
= strtoul(argv
[7]->arg
, NULL
, 10);
847 bgp
= bgp_get_default();
849 vty_out(vty
, "Default BGP instance is not there\n");
853 rv
= bgp_evpn_local_macip_add(bgp
, vni
, &mac
, &ip
, 0 /* flags */, seq
);
855 vty_out(vty
, "Internal error\n");
862 DEFUN_HIDDEN (no_bgp_local_mac
,
863 no_bgp_local_mac_cmd
,
864 "no bgp local-mac vni " CMD_VNI_RANGE
" mac WORD",
868 "VxLAN Network Identifier\n"
879 vni
= strtoul(argv
[4]->arg
, NULL
, 10);
880 if (!prefix_str2mac(argv
[6]->arg
, &mac
)) {
881 vty_out(vty
, "%% Malformed MAC address\n");
884 memset(&ip
, 0, sizeof(ip
));
886 bgp
= bgp_get_default();
888 vty_out(vty
, "Default BGP instance is not there\n");
892 rv
= bgp_evpn_local_macip_del(bgp
, vni
, &mac
, &ip
, ZEBRA_NEIGH_ACTIVE
);
894 vty_out(vty
, "Internal error\n");
901 DEFUN (no_synchronization
,
902 no_synchronization_cmd
,
903 "no synchronization",
905 "Perform IGP synchronization\n")
910 DEFUN (no_auto_summary
,
914 "Enable automatic network number summarization\n")
919 /* "router bgp" commands. */
920 DEFUN_NOSH (router_bgp
,
922 "router bgp [(1-4294967295)$instasn [<view|vrf> VIEWVRFNAME]]",
926 BGP_INSTANCE_HELP_STR
)
929 int idx_view_vrf
= 3;
935 const char *name
= NULL
;
936 enum bgp_instance_type inst_type
;
938 // "router bgp" without an ASN
940 // Pending: Make VRF option available for ASN less config
941 bgp
= bgp_get_default();
944 vty_out(vty
, "%% No BGP process is configured\n");
945 return CMD_WARNING_CONFIG_FAILED
;
948 if (listcount(bm
->bgp
) > 1) {
949 vty_out(vty
, "%% Please specify ASN and VRF\n");
950 return CMD_WARNING_CONFIG_FAILED
;
956 as
= strtoul(argv
[idx_asn
]->arg
, NULL
, 10);
958 inst_type
= BGP_INSTANCE_TYPE_DEFAULT
;
960 name
= argv
[idx_vrf
]->arg
;
962 if (!strcmp(argv
[idx_view_vrf
]->text
, "vrf")) {
963 if (strmatch(name
, VRF_DEFAULT_NAME
))
966 inst_type
= BGP_INSTANCE_TYPE_VRF
;
967 } else if (!strcmp(argv
[idx_view_vrf
]->text
, "view"))
968 inst_type
= BGP_INSTANCE_TYPE_VIEW
;
971 if (inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
972 is_new_bgp
= (bgp_lookup(as
, name
) == NULL
);
974 ret
= bgp_get(&bgp
, &as
, name
, inst_type
);
976 case BGP_ERR_AS_MISMATCH
:
977 vty_out(vty
, "BGP is already running; AS is %u\n", as
);
978 return CMD_WARNING_CONFIG_FAILED
;
979 case BGP_ERR_INSTANCE_MISMATCH
:
981 "BGP instance name and AS number mismatch\n");
983 "BGP instance is already running; AS is %u\n",
985 return CMD_WARNING_CONFIG_FAILED
;
989 * If we just instantiated the default instance, complete
990 * any pending VRF-VPN leaking that was configured via
991 * earlier "router bgp X vrf FOO" blocks.
993 if (is_new_bgp
&& inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
994 vpn_leak_postchange_all();
996 if (inst_type
== BGP_INSTANCE_TYPE_VRF
)
997 bgp_vpn_leak_export(bgp
);
998 /* Pending: handle when user tries to change a view to vrf n vv.
1002 /* unset the auto created flag as the user config is now present */
1003 UNSET_FLAG(bgp
->vrf_flags
, BGP_VRF_AUTO
);
1004 VTY_PUSH_CONTEXT(BGP_NODE
, bgp
);
1009 /* "no router bgp" commands. */
1010 DEFUN (no_router_bgp
,
1012 "no router bgp [(1-4294967295)$instasn [<view|vrf> VIEWVRFNAME]]",
1017 BGP_INSTANCE_HELP_STR
)
1023 const char *name
= NULL
;
1025 // "no router bgp" without an ASN
1027 // Pending: Make VRF option available for ASN less config
1028 bgp
= bgp_get_default();
1031 vty_out(vty
, "%% No BGP process is configured\n");
1032 return CMD_WARNING_CONFIG_FAILED
;
1035 if (listcount(bm
->bgp
) > 1) {
1036 vty_out(vty
, "%% Please specify ASN and VRF\n");
1037 return CMD_WARNING_CONFIG_FAILED
;
1041 vty_out(vty
, "%% Please unconfigure l3vni %u",
1043 return CMD_WARNING_CONFIG_FAILED
;
1046 as
= strtoul(argv
[idx_asn
]->arg
, NULL
, 10);
1049 name
= argv
[idx_vrf
]->arg
;
1051 /* Lookup bgp structure. */
1052 bgp
= bgp_lookup(as
, name
);
1054 vty_out(vty
, "%% Can't find BGP instance\n");
1055 return CMD_WARNING_CONFIG_FAILED
;
1059 vty_out(vty
, "%% Please unconfigure l3vni %u\n",
1061 return CMD_WARNING_CONFIG_FAILED
;
1064 /* Cannot delete default instance if vrf instances exist */
1065 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
) {
1066 struct listnode
*node
;
1067 struct bgp
*tmp_bgp
;
1069 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, node
, tmp_bgp
)) {
1070 if (tmp_bgp
->inst_type
1071 == BGP_INSTANCE_TYPE_VRF
) {
1073 "%% Cannot delete default BGP instance. Dependent VRF instances exist\n");
1074 return CMD_WARNING_CONFIG_FAILED
;
1080 if (bgp_vpn_leak_unimport(bgp
, vty
))
1081 return CMD_WARNING_CONFIG_FAILED
;
1089 /* BGP router-id. */
1091 DEFPY (bgp_router_id
,
1093 "bgp router-id A.B.C.D",
1095 "Override configured router identifier\n"
1096 "Manually configured router identifier\n")
1098 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1099 bgp_router_id_static_set(bgp
, router_id
);
1103 DEFPY (no_bgp_router_id
,
1104 no_bgp_router_id_cmd
,
1105 "no bgp router-id [A.B.C.D]",
1108 "Override configured router identifier\n"
1109 "Manually configured router identifier\n")
1111 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1113 if (router_id_str
) {
1114 if (!IPV4_ADDR_SAME(&bgp
->router_id_static
, &router_id
)) {
1115 vty_out(vty
, "%% BGP router-id doesn't match\n");
1116 return CMD_WARNING_CONFIG_FAILED
;
1120 router_id
.s_addr
= 0;
1121 bgp_router_id_static_set(bgp
, router_id
);
1127 /* BGP Cluster ID. */
1128 DEFUN (bgp_cluster_id
,
1130 "bgp cluster-id <A.B.C.D|(1-4294967295)>",
1132 "Configure Route-Reflector Cluster-id\n"
1133 "Route-Reflector Cluster-id in IP address format\n"
1134 "Route-Reflector Cluster-id as 32 bit quantity\n")
1136 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1139 struct in_addr cluster
;
1141 ret
= inet_aton(argv
[idx_ipv4
]->arg
, &cluster
);
1143 vty_out(vty
, "%% Malformed bgp cluster identifier\n");
1144 return CMD_WARNING_CONFIG_FAILED
;
1147 bgp_cluster_id_set(bgp
, &cluster
);
1148 bgp_clear_star_soft_out(vty
, bgp
->name
);
1153 DEFUN (no_bgp_cluster_id
,
1154 no_bgp_cluster_id_cmd
,
1155 "no bgp cluster-id [<A.B.C.D|(1-4294967295)>]",
1158 "Configure Route-Reflector Cluster-id\n"
1159 "Route-Reflector Cluster-id in IP address format\n"
1160 "Route-Reflector Cluster-id as 32 bit quantity\n")
1162 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1163 bgp_cluster_id_unset(bgp
);
1164 bgp_clear_star_soft_out(vty
, bgp
->name
);
1169 DEFUN (bgp_confederation_identifier
,
1170 bgp_confederation_identifier_cmd
,
1171 "bgp confederation identifier (1-4294967295)",
1172 "BGP specific commands\n"
1173 "AS confederation parameters\n"
1175 "Set routing domain confederation AS\n")
1177 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1181 as
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1183 bgp_confederation_id_set(bgp
, as
);
1188 DEFUN (no_bgp_confederation_identifier
,
1189 no_bgp_confederation_identifier_cmd
,
1190 "no bgp confederation identifier [(1-4294967295)]",
1192 "BGP specific commands\n"
1193 "AS confederation parameters\n"
1195 "Set routing domain confederation AS\n")
1197 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1198 bgp_confederation_id_unset(bgp
);
1203 DEFUN (bgp_confederation_peers
,
1204 bgp_confederation_peers_cmd
,
1205 "bgp confederation peers (1-4294967295)...",
1206 "BGP specific commands\n"
1207 "AS confederation parameters\n"
1208 "Peer ASs in BGP confederation\n"
1211 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1216 for (i
= idx_asn
; i
< argc
; i
++) {
1217 as
= strtoul(argv
[i
]->arg
, NULL
, 10);
1219 if (bgp
->as
== as
) {
1221 "%% Local member-AS not allowed in confed peer list\n");
1225 bgp_confederation_peers_add(bgp
, as
);
1230 DEFUN (no_bgp_confederation_peers
,
1231 no_bgp_confederation_peers_cmd
,
1232 "no bgp confederation peers (1-4294967295)...",
1234 "BGP specific commands\n"
1235 "AS confederation parameters\n"
1236 "Peer ASs in BGP confederation\n"
1239 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1244 for (i
= idx_asn
; i
< argc
; i
++) {
1245 as
= strtoul(argv
[i
]->arg
, NULL
, 10);
1247 bgp_confederation_peers_remove(bgp
, as
);
1253 * Central routine for maximum-paths configuration.
1254 * @peer_type: BGP_PEER_EBGP or BGP_PEER_IBGP
1255 * @set: 1 for setting values, 0 for removing the max-paths config.
1257 static int bgp_maxpaths_config_vty(struct vty
*vty
, int peer_type
,
1258 const char *mpaths
, uint16_t options
,
1261 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1262 uint16_t maxpaths
= 0;
1267 afi
= bgp_node_afi(vty
);
1268 safi
= bgp_node_safi(vty
);
1271 maxpaths
= strtol(mpaths
, NULL
, 10);
1272 if (maxpaths
> multipath_num
) {
1274 "%% Maxpaths Specified: %d is > than multipath num specified on bgp command line %d",
1275 maxpaths
, multipath_num
);
1276 return CMD_WARNING_CONFIG_FAILED
;
1278 ret
= bgp_maximum_paths_set(bgp
, afi
, safi
, peer_type
, maxpaths
,
1281 ret
= bgp_maximum_paths_unset(bgp
, afi
, safi
, peer_type
);
1285 "%% Failed to %sset maximum-paths %s %u for afi %u, safi %u\n",
1286 (set
== 1) ? "" : "un",
1287 (peer_type
== BGP_PEER_EBGP
) ? "ebgp" : "ibgp",
1288 maxpaths
, afi
, safi
);
1289 return CMD_WARNING_CONFIG_FAILED
;
1292 bgp_recalculate_all_bestpaths(bgp
);
1297 DEFUN (bgp_maxmed_admin
,
1298 bgp_maxmed_admin_cmd
,
1299 "bgp max-med administrative ",
1301 "Advertise routes with max-med\n"
1302 "Administratively applied, for an indefinite period\n")
1304 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1306 bgp
->v_maxmed_admin
= 1;
1307 bgp
->maxmed_admin_value
= BGP_MAXMED_VALUE_DEFAULT
;
1309 bgp_maxmed_update(bgp
);
1314 DEFUN (bgp_maxmed_admin_medv
,
1315 bgp_maxmed_admin_medv_cmd
,
1316 "bgp max-med administrative (0-4294967295)",
1318 "Advertise routes with max-med\n"
1319 "Administratively applied, for an indefinite period\n"
1320 "Max MED value to be used\n")
1322 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1325 bgp
->v_maxmed_admin
= 1;
1326 bgp
->maxmed_admin_value
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1328 bgp_maxmed_update(bgp
);
1333 DEFUN (no_bgp_maxmed_admin
,
1334 no_bgp_maxmed_admin_cmd
,
1335 "no bgp max-med administrative [(0-4294967295)]",
1338 "Advertise routes with max-med\n"
1339 "Administratively applied, for an indefinite period\n"
1340 "Max MED value to be used\n")
1342 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1343 bgp
->v_maxmed_admin
= BGP_MAXMED_ADMIN_UNCONFIGURED
;
1344 bgp
->maxmed_admin_value
= BGP_MAXMED_VALUE_DEFAULT
;
1345 bgp_maxmed_update(bgp
);
1350 DEFUN (bgp_maxmed_onstartup
,
1351 bgp_maxmed_onstartup_cmd
,
1352 "bgp max-med on-startup (5-86400) [(0-4294967295)]",
1354 "Advertise routes with max-med\n"
1355 "Effective on a startup\n"
1356 "Time (seconds) period for max-med\n"
1357 "Max MED value to be used\n")
1359 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1362 argv_find(argv
, argc
, "(5-86400)", &idx
);
1363 bgp
->v_maxmed_onstartup
= strtoul(argv
[idx
]->arg
, NULL
, 10);
1364 if (argv_find(argv
, argc
, "(0-4294967295)", &idx
))
1365 bgp
->maxmed_onstartup_value
= strtoul(argv
[idx
]->arg
, NULL
, 10);
1367 bgp
->maxmed_onstartup_value
= BGP_MAXMED_VALUE_DEFAULT
;
1369 bgp_maxmed_update(bgp
);
1374 DEFUN (no_bgp_maxmed_onstartup
,
1375 no_bgp_maxmed_onstartup_cmd
,
1376 "no bgp max-med on-startup [(5-86400) [(0-4294967295)]]",
1379 "Advertise routes with max-med\n"
1380 "Effective on a startup\n"
1381 "Time (seconds) period for max-med\n"
1382 "Max MED value to be used\n")
1384 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1386 /* Cancel max-med onstartup if its on */
1387 if (bgp
->t_maxmed_onstartup
) {
1388 THREAD_TIMER_OFF(bgp
->t_maxmed_onstartup
);
1389 bgp
->maxmed_onstartup_over
= 1;
1392 bgp
->v_maxmed_onstartup
= BGP_MAXMED_ONSTARTUP_UNCONFIGURED
;
1393 bgp
->maxmed_onstartup_value
= BGP_MAXMED_VALUE_DEFAULT
;
1395 bgp_maxmed_update(bgp
);
1400 static int bgp_update_delay_config_vty(struct vty
*vty
, const char *delay
,
1403 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1404 uint16_t update_delay
;
1405 uint16_t establish_wait
;
1407 update_delay
= strtoul(delay
, NULL
, 10);
1409 if (!wait
) /* update-delay <delay> */
1411 bgp
->v_update_delay
= update_delay
;
1412 bgp
->v_establish_wait
= bgp
->v_update_delay
;
1416 /* update-delay <delay> <establish-wait> */
1417 establish_wait
= atoi(wait
);
1418 if (update_delay
< establish_wait
) {
1420 "%%Failed: update-delay less than the establish-wait!\n");
1421 return CMD_WARNING_CONFIG_FAILED
;
1424 bgp
->v_update_delay
= update_delay
;
1425 bgp
->v_establish_wait
= establish_wait
;
1430 static int bgp_update_delay_deconfig_vty(struct vty
*vty
)
1432 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1434 bgp
->v_update_delay
= BGP_UPDATE_DELAY_DEF
;
1435 bgp
->v_establish_wait
= bgp
->v_update_delay
;
1440 void bgp_config_write_update_delay(struct vty
*vty
, struct bgp
*bgp
)
1442 if (bgp
->v_update_delay
!= BGP_UPDATE_DELAY_DEF
) {
1443 vty_out(vty
, " update-delay %d", bgp
->v_update_delay
);
1444 if (bgp
->v_update_delay
!= bgp
->v_establish_wait
)
1445 vty_out(vty
, " %d", bgp
->v_establish_wait
);
1451 /* Update-delay configuration */
1452 DEFUN (bgp_update_delay
,
1453 bgp_update_delay_cmd
,
1454 "update-delay (0-3600)",
1455 "Force initial delay for best-path and updates\n"
1459 return bgp_update_delay_config_vty(vty
, argv
[idx_number
]->arg
, NULL
);
1462 DEFUN (bgp_update_delay_establish_wait
,
1463 bgp_update_delay_establish_wait_cmd
,
1464 "update-delay (0-3600) (1-3600)",
1465 "Force initial delay for best-path and updates\n"
1470 int idx_number_2
= 2;
1471 return bgp_update_delay_config_vty(vty
, argv
[idx_number
]->arg
,
1472 argv
[idx_number_2
]->arg
);
1475 /* Update-delay deconfiguration */
1476 DEFUN (no_bgp_update_delay
,
1477 no_bgp_update_delay_cmd
,
1478 "no update-delay [(0-3600) [(1-3600)]]",
1480 "Force initial delay for best-path and updates\n"
1484 return bgp_update_delay_deconfig_vty(vty
);
1488 static int bgp_wpkt_quanta_config_vty(struct vty
*vty
, const char *num
,
1491 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1494 uint32_t quanta
= strtoul(num
, NULL
, 10);
1495 atomic_store_explicit(&bgp
->wpkt_quanta
, quanta
,
1496 memory_order_relaxed
);
1498 atomic_store_explicit(&bgp
->wpkt_quanta
, BGP_WRITE_PACKET_MAX
,
1499 memory_order_relaxed
);
1505 static int bgp_rpkt_quanta_config_vty(struct vty
*vty
, const char *num
,
1508 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1511 uint32_t quanta
= strtoul(num
, NULL
, 10);
1512 atomic_store_explicit(&bgp
->rpkt_quanta
, quanta
,
1513 memory_order_relaxed
);
1515 atomic_store_explicit(&bgp
->rpkt_quanta
, BGP_READ_PACKET_MAX
,
1516 memory_order_relaxed
);
1522 void bgp_config_write_wpkt_quanta(struct vty
*vty
, struct bgp
*bgp
)
1525 atomic_load_explicit(&bgp
->wpkt_quanta
, memory_order_relaxed
);
1526 if (quanta
!= BGP_WRITE_PACKET_MAX
)
1527 vty_out(vty
, " write-quanta %d\n", quanta
);
1530 void bgp_config_write_rpkt_quanta(struct vty
*vty
, struct bgp
*bgp
)
1533 atomic_load_explicit(&bgp
->rpkt_quanta
, memory_order_relaxed
);
1534 if (quanta
!= BGP_READ_PACKET_MAX
)
1535 vty_out(vty
, " read-quanta %d\n", quanta
);
1538 /* Packet quanta configuration */
1539 DEFUN (bgp_wpkt_quanta
,
1540 bgp_wpkt_quanta_cmd
,
1541 "write-quanta (1-10)",
1542 "How many packets to write to peer socket per run\n"
1543 "Number of packets\n")
1546 return bgp_wpkt_quanta_config_vty(vty
, argv
[idx_number
]->arg
, 1);
1549 DEFUN (no_bgp_wpkt_quanta
,
1550 no_bgp_wpkt_quanta_cmd
,
1551 "no write-quanta (1-10)",
1553 "How many packets to write to peer socket per I/O cycle\n"
1554 "Number of packets\n")
1557 return bgp_wpkt_quanta_config_vty(vty
, argv
[idx_number
]->arg
, 0);
1560 DEFUN (bgp_rpkt_quanta
,
1561 bgp_rpkt_quanta_cmd
,
1562 "read-quanta (1-10)",
1563 "How many packets to read from peer socket per I/O cycle\n"
1564 "Number of packets\n")
1567 return bgp_rpkt_quanta_config_vty(vty
, argv
[idx_number
]->arg
, 1);
1570 DEFUN (no_bgp_rpkt_quanta
,
1571 no_bgp_rpkt_quanta_cmd
,
1572 "no read-quanta (1-10)",
1574 "How many packets to read from peer socket per I/O cycle\n"
1575 "Number of packets\n")
1578 return bgp_rpkt_quanta_config_vty(vty
, argv
[idx_number
]->arg
, 0);
1581 void bgp_config_write_coalesce_time(struct vty
*vty
, struct bgp
*bgp
)
1583 if (!bgp
->heuristic_coalesce
)
1584 vty_out(vty
, " coalesce-time %u\n", bgp
->coalesce_time
);
1588 DEFUN (bgp_coalesce_time
,
1589 bgp_coalesce_time_cmd
,
1590 "coalesce-time (0-4294967295)",
1591 "Subgroup coalesce timer\n"
1592 "Subgroup coalesce timer value (in ms)\n")
1594 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1597 argv_find(argv
, argc
, "(0-4294967295)", &idx
);
1598 bgp
->heuristic_coalesce
= false;
1599 bgp
->coalesce_time
= strtoul(argv
[idx
]->arg
, NULL
, 10);
1603 DEFUN (no_bgp_coalesce_time
,
1604 no_bgp_coalesce_time_cmd
,
1605 "no coalesce-time (0-4294967295)",
1607 "Subgroup coalesce timer\n"
1608 "Subgroup coalesce timer value (in ms)\n")
1610 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1612 bgp
->heuristic_coalesce
= true;
1613 bgp
->coalesce_time
= BGP_DEFAULT_SUBGROUP_COALESCE_TIME
;
1617 /* Maximum-paths configuration */
1618 DEFUN (bgp_maxpaths
,
1620 "maximum-paths " CMD_RANGE_STR(1, MULTIPATH_NUM
),
1621 "Forward packets over multiple paths\n"
1622 "Number of paths\n")
1625 return bgp_maxpaths_config_vty(vty
, BGP_PEER_EBGP
,
1626 argv
[idx_number
]->arg
, 0, 1);
1629 ALIAS_HIDDEN(bgp_maxpaths
, bgp_maxpaths_hidden_cmd
,
1630 "maximum-paths " CMD_RANGE_STR(1, MULTIPATH_NUM
),
1631 "Forward packets over multiple paths\n"
1632 "Number of paths\n")
1634 DEFUN (bgp_maxpaths_ibgp
,
1635 bgp_maxpaths_ibgp_cmd
,
1636 "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM
),
1637 "Forward packets over multiple paths\n"
1639 "Number of paths\n")
1642 return bgp_maxpaths_config_vty(vty
, BGP_PEER_IBGP
,
1643 argv
[idx_number
]->arg
, 0, 1);
1646 ALIAS_HIDDEN(bgp_maxpaths_ibgp
, bgp_maxpaths_ibgp_hidden_cmd
,
1647 "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM
),
1648 "Forward packets over multiple paths\n"
1650 "Number of paths\n")
1652 DEFUN (bgp_maxpaths_ibgp_cluster
,
1653 bgp_maxpaths_ibgp_cluster_cmd
,
1654 "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM
) " equal-cluster-length",
1655 "Forward packets over multiple paths\n"
1658 "Match the cluster length\n")
1661 return bgp_maxpaths_config_vty(
1662 vty
, BGP_PEER_IBGP
, argv
[idx_number
]->arg
,
1663 BGP_FLAG_IBGP_MULTIPATH_SAME_CLUSTERLEN
, 1);
1666 ALIAS_HIDDEN(bgp_maxpaths_ibgp_cluster
, bgp_maxpaths_ibgp_cluster_hidden_cmd
,
1667 "maximum-paths ibgp " CMD_RANGE_STR(
1668 1, MULTIPATH_NUM
) " equal-cluster-length",
1669 "Forward packets over multiple paths\n"
1672 "Match the cluster length\n")
1674 DEFUN (no_bgp_maxpaths
,
1675 no_bgp_maxpaths_cmd
,
1676 "no maximum-paths [" CMD_RANGE_STR(1, MULTIPATH_NUM
) "]",
1678 "Forward packets over multiple paths\n"
1679 "Number of paths\n")
1681 return bgp_maxpaths_config_vty(vty
, BGP_PEER_EBGP
, NULL
, 0, 0);
1684 ALIAS_HIDDEN(no_bgp_maxpaths
, no_bgp_maxpaths_hidden_cmd
,
1685 "no maximum-paths [" CMD_RANGE_STR(1, MULTIPATH_NUM
) "]", NO_STR
1686 "Forward packets over multiple paths\n"
1687 "Number of paths\n")
1689 DEFUN (no_bgp_maxpaths_ibgp
,
1690 no_bgp_maxpaths_ibgp_cmd
,
1691 "no maximum-paths ibgp [" CMD_RANGE_STR(1, MULTIPATH_NUM
) " [equal-cluster-length]]",
1693 "Forward packets over multiple paths\n"
1696 "Match the cluster length\n")
1698 return bgp_maxpaths_config_vty(vty
, BGP_PEER_IBGP
, NULL
, 0, 0);
1701 ALIAS_HIDDEN(no_bgp_maxpaths_ibgp
, no_bgp_maxpaths_ibgp_hidden_cmd
,
1702 "no maximum-paths ibgp [" CMD_RANGE_STR(
1703 1, MULTIPATH_NUM
) " [equal-cluster-length]]",
1705 "Forward packets over multiple paths\n"
1708 "Match the cluster length\n")
1710 void bgp_config_write_maxpaths(struct vty
*vty
, struct bgp
*bgp
, afi_t afi
,
1713 if (bgp
->maxpaths
[afi
][safi
].maxpaths_ebgp
!= MULTIPATH_NUM
) {
1714 vty_out(vty
, " maximum-paths %d\n",
1715 bgp
->maxpaths
[afi
][safi
].maxpaths_ebgp
);
1718 if (bgp
->maxpaths
[afi
][safi
].maxpaths_ibgp
!= MULTIPATH_NUM
) {
1719 vty_out(vty
, " maximum-paths ibgp %d",
1720 bgp
->maxpaths
[afi
][safi
].maxpaths_ibgp
);
1721 if (CHECK_FLAG(bgp
->maxpaths
[afi
][safi
].ibgp_flags
,
1722 BGP_FLAG_IBGP_MULTIPATH_SAME_CLUSTERLEN
))
1723 vty_out(vty
, " equal-cluster-length");
1732 "timers bgp (0-65535) (0-65535)",
1733 "Adjust routing timers\n"
1735 "Keepalive interval\n"
1738 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1740 int idx_number_2
= 3;
1741 unsigned long keepalive
= 0;
1742 unsigned long holdtime
= 0;
1744 keepalive
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1745 holdtime
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
1747 /* Holdtime value check. */
1748 if (holdtime
< 3 && holdtime
!= 0) {
1750 "%% hold time value must be either 0 or greater than 3\n");
1751 return CMD_WARNING_CONFIG_FAILED
;
1754 bgp_timers_set(bgp
, keepalive
, holdtime
);
1759 DEFUN (no_bgp_timers
,
1761 "no timers bgp [(0-65535) (0-65535)]",
1763 "Adjust routing timers\n"
1765 "Keepalive interval\n"
1768 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1769 bgp_timers_unset(bgp
);
1775 DEFUN (bgp_client_to_client_reflection
,
1776 bgp_client_to_client_reflection_cmd
,
1777 "bgp client-to-client reflection",
1778 "BGP specific commands\n"
1779 "Configure client to client route reflection\n"
1780 "reflection of routes allowed\n")
1782 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1783 bgp_flag_unset(bgp
, BGP_FLAG_NO_CLIENT_TO_CLIENT
);
1784 bgp_clear_star_soft_out(vty
, bgp
->name
);
1789 DEFUN (no_bgp_client_to_client_reflection
,
1790 no_bgp_client_to_client_reflection_cmd
,
1791 "no bgp client-to-client reflection",
1793 "BGP specific commands\n"
1794 "Configure client to client route reflection\n"
1795 "reflection of routes allowed\n")
1797 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1798 bgp_flag_set(bgp
, BGP_FLAG_NO_CLIENT_TO_CLIENT
);
1799 bgp_clear_star_soft_out(vty
, bgp
->name
);
1804 /* "bgp always-compare-med" configuration. */
1805 DEFUN (bgp_always_compare_med
,
1806 bgp_always_compare_med_cmd
,
1807 "bgp always-compare-med",
1808 "BGP specific commands\n"
1809 "Allow comparing MED from different neighbors\n")
1811 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1812 bgp_flag_set(bgp
, BGP_FLAG_ALWAYS_COMPARE_MED
);
1813 bgp_recalculate_all_bestpaths(bgp
);
1818 DEFUN (no_bgp_always_compare_med
,
1819 no_bgp_always_compare_med_cmd
,
1820 "no bgp always-compare-med",
1822 "BGP specific commands\n"
1823 "Allow comparing MED from different neighbors\n")
1825 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1826 bgp_flag_unset(bgp
, BGP_FLAG_ALWAYS_COMPARE_MED
);
1827 bgp_recalculate_all_bestpaths(bgp
);
1833 DEFUN(bgp_ebgp_requires_policy
, bgp_ebgp_requires_policy_cmd
,
1834 "bgp ebgp-requires-policy",
1835 "BGP specific commands\n"
1836 "Require in and out policy for eBGP peers (RFC8212)\n")
1838 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1839 bgp
->ebgp_requires_policy
= DEFAULT_EBGP_POLICY_ENABLED
;
1843 DEFUN(no_bgp_ebgp_requires_policy
, no_bgp_ebgp_requires_policy_cmd
,
1844 "no bgp ebgp-requires-policy",
1846 "BGP specific commands\n"
1847 "Require in and out policy for eBGP peers (RFC8212)\n")
1849 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1850 bgp
->ebgp_requires_policy
= DEFAULT_EBGP_POLICY_DISABLED
;
1855 /* "bgp deterministic-med" configuration. */
1856 DEFUN (bgp_deterministic_med
,
1857 bgp_deterministic_med_cmd
,
1858 "bgp deterministic-med",
1859 "BGP specific commands\n"
1860 "Pick the best-MED path among paths advertised from the neighboring AS\n")
1862 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1864 if (!bgp_flag_check(bgp
, BGP_FLAG_DETERMINISTIC_MED
)) {
1865 bgp_flag_set(bgp
, BGP_FLAG_DETERMINISTIC_MED
);
1866 bgp_recalculate_all_bestpaths(bgp
);
1872 DEFUN (no_bgp_deterministic_med
,
1873 no_bgp_deterministic_med_cmd
,
1874 "no bgp deterministic-med",
1876 "BGP specific commands\n"
1877 "Pick the best-MED path among paths advertised from the neighboring AS\n")
1879 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1880 int bestpath_per_as_used
;
1884 struct listnode
*node
, *nnode
;
1886 if (bgp_flag_check(bgp
, BGP_FLAG_DETERMINISTIC_MED
)) {
1887 bestpath_per_as_used
= 0;
1889 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
1890 FOREACH_AFI_SAFI (afi
, safi
)
1891 if (bgp_addpath_dmed_required(
1892 peer
->addpath_type
[afi
][safi
])) {
1893 bestpath_per_as_used
= 1;
1897 if (bestpath_per_as_used
)
1901 if (bestpath_per_as_used
) {
1903 "bgp deterministic-med cannot be disabled while addpath-tx-bestpath-per-AS is in use\n");
1904 return CMD_WARNING_CONFIG_FAILED
;
1906 bgp_flag_unset(bgp
, BGP_FLAG_DETERMINISTIC_MED
);
1907 bgp_recalculate_all_bestpaths(bgp
);
1914 /* "bgp graceful-restart" configuration. */
1915 DEFUN (bgp_graceful_restart
,
1916 bgp_graceful_restart_cmd
,
1917 "bgp graceful-restart",
1918 "BGP specific commands\n"
1919 "Graceful restart capability parameters\n")
1921 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1922 bgp_flag_set(bgp
, BGP_FLAG_GRACEFUL_RESTART
);
1926 DEFUN (no_bgp_graceful_restart
,
1927 no_bgp_graceful_restart_cmd
,
1928 "no bgp graceful-restart",
1930 "BGP specific commands\n"
1931 "Graceful restart capability parameters\n")
1933 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1934 bgp_flag_unset(bgp
, BGP_FLAG_GRACEFUL_RESTART
);
1938 DEFUN (bgp_graceful_restart_stalepath_time
,
1939 bgp_graceful_restart_stalepath_time_cmd
,
1940 "bgp graceful-restart stalepath-time (1-4095)",
1941 "BGP specific commands\n"
1942 "Graceful restart capability parameters\n"
1943 "Set the max time to hold onto restarting peer's stale paths\n"
1944 "Delay value (seconds)\n")
1946 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1950 stalepath
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1951 bgp
->stalepath_time
= stalepath
;
1955 DEFUN (bgp_graceful_restart_restart_time
,
1956 bgp_graceful_restart_restart_time_cmd
,
1957 "bgp graceful-restart restart-time (1-4095)",
1958 "BGP specific commands\n"
1959 "Graceful restart capability parameters\n"
1960 "Set the time to wait to delete stale routes before a BGP open message is received\n"
1961 "Delay value (seconds)\n")
1963 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1967 restart
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
1968 bgp
->restart_time
= restart
;
1972 DEFUN (no_bgp_graceful_restart_stalepath_time
,
1973 no_bgp_graceful_restart_stalepath_time_cmd
,
1974 "no bgp graceful-restart stalepath-time [(1-4095)]",
1976 "BGP specific commands\n"
1977 "Graceful restart capability parameters\n"
1978 "Set the max time to hold onto restarting peer's stale paths\n"
1979 "Delay value (seconds)\n")
1981 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1983 bgp
->stalepath_time
= BGP_DEFAULT_STALEPATH_TIME
;
1987 DEFUN (no_bgp_graceful_restart_restart_time
,
1988 no_bgp_graceful_restart_restart_time_cmd
,
1989 "no bgp graceful-restart restart-time [(1-4095)]",
1991 "BGP specific commands\n"
1992 "Graceful restart capability parameters\n"
1993 "Set the time to wait to delete stale routes before a BGP open message is received\n"
1994 "Delay value (seconds)\n")
1996 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1998 bgp
->restart_time
= BGP_DEFAULT_RESTART_TIME
;
2002 DEFUN (bgp_graceful_restart_preserve_fw
,
2003 bgp_graceful_restart_preserve_fw_cmd
,
2004 "bgp graceful-restart preserve-fw-state",
2005 "BGP specific commands\n"
2006 "Graceful restart capability parameters\n"
2007 "Sets F-bit indication that fib is preserved while doing Graceful Restart\n")
2009 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2010 bgp_flag_set(bgp
, BGP_FLAG_GR_PRESERVE_FWD
);
2014 DEFUN (no_bgp_graceful_restart_preserve_fw
,
2015 no_bgp_graceful_restart_preserve_fw_cmd
,
2016 "no bgp graceful-restart preserve-fw-state",
2018 "BGP specific commands\n"
2019 "Graceful restart capability parameters\n"
2020 "Unsets F-bit indication that fib is preserved while doing Graceful Restart\n")
2022 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2023 bgp_flag_unset(bgp
, BGP_FLAG_GR_PRESERVE_FWD
);
2027 /* "bgp graceful-shutdown" configuration */
2028 DEFUN (bgp_graceful_shutdown
,
2029 bgp_graceful_shutdown_cmd
,
2030 "bgp graceful-shutdown",
2032 "Graceful shutdown parameters\n")
2034 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2036 if (!bgp_flag_check(bgp
, BGP_FLAG_GRACEFUL_SHUTDOWN
)) {
2037 bgp_flag_set(bgp
, BGP_FLAG_GRACEFUL_SHUTDOWN
);
2038 bgp_static_redo_import_check(bgp
);
2039 bgp_redistribute_redo(bgp
);
2040 bgp_clear_star_soft_out(vty
, bgp
->name
);
2041 bgp_clear_star_soft_in(vty
, bgp
->name
);
2047 DEFUN (no_bgp_graceful_shutdown
,
2048 no_bgp_graceful_shutdown_cmd
,
2049 "no bgp graceful-shutdown",
2052 "Graceful shutdown parameters\n")
2054 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2056 if (bgp_flag_check(bgp
, BGP_FLAG_GRACEFUL_SHUTDOWN
)) {
2057 bgp_flag_unset(bgp
, BGP_FLAG_GRACEFUL_SHUTDOWN
);
2058 bgp_static_redo_import_check(bgp
);
2059 bgp_redistribute_redo(bgp
);
2060 bgp_clear_star_soft_out(vty
, bgp
->name
);
2061 bgp_clear_star_soft_in(vty
, bgp
->name
);
2067 /* "bgp fast-external-failover" configuration. */
2068 DEFUN (bgp_fast_external_failover
,
2069 bgp_fast_external_failover_cmd
,
2070 "bgp fast-external-failover",
2072 "Immediately reset session if a link to a directly connected external peer goes down\n")
2074 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2075 bgp_flag_unset(bgp
, BGP_FLAG_NO_FAST_EXT_FAILOVER
);
2079 DEFUN (no_bgp_fast_external_failover
,
2080 no_bgp_fast_external_failover_cmd
,
2081 "no bgp fast-external-failover",
2084 "Immediately reset session if a link to a directly connected external peer goes down\n")
2086 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2087 bgp_flag_set(bgp
, BGP_FLAG_NO_FAST_EXT_FAILOVER
);
2091 /* "bgp bestpath compare-routerid" configuration. */
2092 DEFUN (bgp_bestpath_compare_router_id
,
2093 bgp_bestpath_compare_router_id_cmd
,
2094 "bgp bestpath compare-routerid",
2095 "BGP specific commands\n"
2096 "Change the default bestpath selection\n"
2097 "Compare router-id for identical EBGP paths\n")
2099 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2100 bgp_flag_set(bgp
, BGP_FLAG_COMPARE_ROUTER_ID
);
2101 bgp_recalculate_all_bestpaths(bgp
);
2106 DEFUN (no_bgp_bestpath_compare_router_id
,
2107 no_bgp_bestpath_compare_router_id_cmd
,
2108 "no bgp bestpath compare-routerid",
2110 "BGP specific commands\n"
2111 "Change the default bestpath selection\n"
2112 "Compare router-id for identical EBGP paths\n")
2114 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2115 bgp_flag_unset(bgp
, BGP_FLAG_COMPARE_ROUTER_ID
);
2116 bgp_recalculate_all_bestpaths(bgp
);
2121 /* "bgp bestpath as-path ignore" configuration. */
2122 DEFUN (bgp_bestpath_aspath_ignore
,
2123 bgp_bestpath_aspath_ignore_cmd
,
2124 "bgp bestpath as-path ignore",
2125 "BGP specific commands\n"
2126 "Change the default bestpath selection\n"
2127 "AS-path attribute\n"
2128 "Ignore as-path length in selecting a route\n")
2130 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2131 bgp_flag_set(bgp
, BGP_FLAG_ASPATH_IGNORE
);
2132 bgp_recalculate_all_bestpaths(bgp
);
2137 DEFUN (no_bgp_bestpath_aspath_ignore
,
2138 no_bgp_bestpath_aspath_ignore_cmd
,
2139 "no bgp bestpath as-path ignore",
2141 "BGP specific commands\n"
2142 "Change the default bestpath selection\n"
2143 "AS-path attribute\n"
2144 "Ignore as-path length in selecting a route\n")
2146 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2147 bgp_flag_unset(bgp
, BGP_FLAG_ASPATH_IGNORE
);
2148 bgp_recalculate_all_bestpaths(bgp
);
2153 /* "bgp bestpath as-path confed" configuration. */
2154 DEFUN (bgp_bestpath_aspath_confed
,
2155 bgp_bestpath_aspath_confed_cmd
,
2156 "bgp bestpath as-path confed",
2157 "BGP specific commands\n"
2158 "Change the default bestpath selection\n"
2159 "AS-path attribute\n"
2160 "Compare path lengths including confederation sets & sequences in selecting a route\n")
2162 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2163 bgp_flag_set(bgp
, BGP_FLAG_ASPATH_CONFED
);
2164 bgp_recalculate_all_bestpaths(bgp
);
2169 DEFUN (no_bgp_bestpath_aspath_confed
,
2170 no_bgp_bestpath_aspath_confed_cmd
,
2171 "no bgp bestpath as-path confed",
2173 "BGP specific commands\n"
2174 "Change the default bestpath selection\n"
2175 "AS-path attribute\n"
2176 "Compare path lengths including confederation sets & sequences in selecting a route\n")
2178 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2179 bgp_flag_unset(bgp
, BGP_FLAG_ASPATH_CONFED
);
2180 bgp_recalculate_all_bestpaths(bgp
);
2185 /* "bgp bestpath as-path multipath-relax" configuration. */
2186 DEFUN (bgp_bestpath_aspath_multipath_relax
,
2187 bgp_bestpath_aspath_multipath_relax_cmd
,
2188 "bgp bestpath as-path multipath-relax [<as-set|no-as-set>]",
2189 "BGP specific commands\n"
2190 "Change the default bestpath selection\n"
2191 "AS-path attribute\n"
2192 "Allow load sharing across routes that have different AS paths (but same length)\n"
2193 "Generate an AS_SET\n"
2194 "Do not generate an AS_SET\n")
2196 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2198 bgp_flag_set(bgp
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
);
2200 /* no-as-set is now the default behavior so we can silently
2202 if (argv_find(argv
, argc
, "as-set", &idx
))
2203 bgp_flag_set(bgp
, BGP_FLAG_MULTIPATH_RELAX_AS_SET
);
2205 bgp_flag_unset(bgp
, BGP_FLAG_MULTIPATH_RELAX_AS_SET
);
2207 bgp_recalculate_all_bestpaths(bgp
);
2212 DEFUN (no_bgp_bestpath_aspath_multipath_relax
,
2213 no_bgp_bestpath_aspath_multipath_relax_cmd
,
2214 "no bgp bestpath as-path multipath-relax [<as-set|no-as-set>]",
2216 "BGP specific commands\n"
2217 "Change the default bestpath selection\n"
2218 "AS-path attribute\n"
2219 "Allow load sharing across routes that have different AS paths (but same length)\n"
2220 "Generate an AS_SET\n"
2221 "Do not generate an AS_SET\n")
2223 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2224 bgp_flag_unset(bgp
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
);
2225 bgp_flag_unset(bgp
, BGP_FLAG_MULTIPATH_RELAX_AS_SET
);
2226 bgp_recalculate_all_bestpaths(bgp
);
2231 /* "bgp log-neighbor-changes" configuration. */
2232 DEFUN (bgp_log_neighbor_changes
,
2233 bgp_log_neighbor_changes_cmd
,
2234 "bgp log-neighbor-changes",
2235 "BGP specific commands\n"
2236 "Log neighbor up/down and reset reason\n")
2238 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2239 bgp_flag_set(bgp
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
);
2243 DEFUN (no_bgp_log_neighbor_changes
,
2244 no_bgp_log_neighbor_changes_cmd
,
2245 "no bgp log-neighbor-changes",
2247 "BGP specific commands\n"
2248 "Log neighbor up/down and reset reason\n")
2250 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2251 bgp_flag_unset(bgp
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
);
2255 /* "bgp bestpath med" configuration. */
2256 DEFUN (bgp_bestpath_med
,
2257 bgp_bestpath_med_cmd
,
2258 "bgp bestpath med <confed [missing-as-worst]|missing-as-worst [confed]>",
2259 "BGP specific commands\n"
2260 "Change the default bestpath selection\n"
2262 "Compare MED among confederation paths\n"
2263 "Treat missing MED as the least preferred one\n"
2264 "Treat missing MED as the least preferred one\n"
2265 "Compare MED among confederation paths\n")
2267 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2270 if (argv_find(argv
, argc
, "confed", &idx
))
2271 bgp_flag_set(bgp
, BGP_FLAG_MED_CONFED
);
2273 if (argv_find(argv
, argc
, "missing-as-worst", &idx
))
2274 bgp_flag_set(bgp
, BGP_FLAG_MED_MISSING_AS_WORST
);
2276 bgp_recalculate_all_bestpaths(bgp
);
2281 DEFUN (no_bgp_bestpath_med
,
2282 no_bgp_bestpath_med_cmd
,
2283 "no bgp bestpath med <confed [missing-as-worst]|missing-as-worst [confed]>",
2285 "BGP specific commands\n"
2286 "Change the default bestpath selection\n"
2288 "Compare MED among confederation paths\n"
2289 "Treat missing MED as the least preferred one\n"
2290 "Treat missing MED as the least preferred one\n"
2291 "Compare MED among confederation paths\n")
2293 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2296 if (argv_find(argv
, argc
, "confed", &idx
))
2297 bgp_flag_unset(bgp
, BGP_FLAG_MED_CONFED
);
2299 if (argv_find(argv
, argc
, "missing-as-worst", &idx
))
2300 bgp_flag_unset(bgp
, BGP_FLAG_MED_MISSING_AS_WORST
);
2302 bgp_recalculate_all_bestpaths(bgp
);
2307 /* "no bgp default ipv4-unicast". */
2308 DEFUN (no_bgp_default_ipv4_unicast
,
2309 no_bgp_default_ipv4_unicast_cmd
,
2310 "no bgp default ipv4-unicast",
2312 "BGP specific commands\n"
2313 "Configure BGP defaults\n"
2314 "Activate ipv4-unicast for a peer by default\n")
2316 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2317 bgp_flag_set(bgp
, BGP_FLAG_NO_DEFAULT_IPV4
);
2321 DEFUN (bgp_default_ipv4_unicast
,
2322 bgp_default_ipv4_unicast_cmd
,
2323 "bgp default ipv4-unicast",
2324 "BGP specific commands\n"
2325 "Configure BGP defaults\n"
2326 "Activate ipv4-unicast for a peer by default\n")
2328 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2329 bgp_flag_unset(bgp
, BGP_FLAG_NO_DEFAULT_IPV4
);
2333 /* Display hostname in certain command outputs */
2334 DEFUN (bgp_default_show_hostname
,
2335 bgp_default_show_hostname_cmd
,
2336 "bgp default show-hostname",
2337 "BGP specific commands\n"
2338 "Configure BGP defaults\n"
2339 "Show hostname in certain command outputs\n")
2341 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2342 bgp_flag_set(bgp
, BGP_FLAG_SHOW_HOSTNAME
);
2346 DEFUN (no_bgp_default_show_hostname
,
2347 no_bgp_default_show_hostname_cmd
,
2348 "no bgp default show-hostname",
2350 "BGP specific commands\n"
2351 "Configure BGP defaults\n"
2352 "Show hostname in certain command outputs\n")
2354 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2355 bgp_flag_unset(bgp
, BGP_FLAG_SHOW_HOSTNAME
);
2359 /* "bgp network import-check" configuration. */
2360 DEFUN (bgp_network_import_check
,
2361 bgp_network_import_check_cmd
,
2362 "bgp network import-check",
2363 "BGP specific commands\n"
2364 "BGP network command\n"
2365 "Check BGP network route exists in IGP\n")
2367 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2368 if (!bgp_flag_check(bgp
, BGP_FLAG_IMPORT_CHECK
)) {
2369 bgp_flag_set(bgp
, BGP_FLAG_IMPORT_CHECK
);
2370 bgp_static_redo_import_check(bgp
);
2376 ALIAS_HIDDEN(bgp_network_import_check
, bgp_network_import_check_exact_cmd
,
2377 "bgp network import-check exact",
2378 "BGP specific commands\n"
2379 "BGP network command\n"
2380 "Check BGP network route exists in IGP\n"
2381 "Match route precisely\n")
2383 DEFUN (no_bgp_network_import_check
,
2384 no_bgp_network_import_check_cmd
,
2385 "no bgp network import-check",
2387 "BGP specific commands\n"
2388 "BGP network command\n"
2389 "Check BGP network route exists in IGP\n")
2391 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2392 if (bgp_flag_check(bgp
, BGP_FLAG_IMPORT_CHECK
)) {
2393 bgp_flag_unset(bgp
, BGP_FLAG_IMPORT_CHECK
);
2394 bgp_static_redo_import_check(bgp
);
2400 DEFUN (bgp_default_local_preference
,
2401 bgp_default_local_preference_cmd
,
2402 "bgp default local-preference (0-4294967295)",
2403 "BGP specific commands\n"
2404 "Configure BGP defaults\n"
2405 "local preference (higher=more preferred)\n"
2406 "Configure default local preference value\n")
2408 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2410 uint32_t local_pref
;
2412 local_pref
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2414 bgp_default_local_preference_set(bgp
, local_pref
);
2415 bgp_clear_star_soft_in(vty
, bgp
->name
);
2420 DEFUN (no_bgp_default_local_preference
,
2421 no_bgp_default_local_preference_cmd
,
2422 "no bgp default local-preference [(0-4294967295)]",
2424 "BGP specific commands\n"
2425 "Configure BGP defaults\n"
2426 "local preference (higher=more preferred)\n"
2427 "Configure default local preference value\n")
2429 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2430 bgp_default_local_preference_unset(bgp
);
2431 bgp_clear_star_soft_in(vty
, bgp
->name
);
2437 DEFUN (bgp_default_subgroup_pkt_queue_max
,
2438 bgp_default_subgroup_pkt_queue_max_cmd
,
2439 "bgp default subgroup-pkt-queue-max (20-100)",
2440 "BGP specific commands\n"
2441 "Configure BGP defaults\n"
2442 "subgroup-pkt-queue-max\n"
2443 "Configure subgroup packet queue max\n")
2445 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2449 max_size
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2451 bgp_default_subgroup_pkt_queue_max_set(bgp
, max_size
);
2456 DEFUN (no_bgp_default_subgroup_pkt_queue_max
,
2457 no_bgp_default_subgroup_pkt_queue_max_cmd
,
2458 "no bgp default subgroup-pkt-queue-max [(20-100)]",
2460 "BGP specific commands\n"
2461 "Configure BGP defaults\n"
2462 "subgroup-pkt-queue-max\n"
2463 "Configure subgroup packet queue max\n")
2465 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2466 bgp_default_subgroup_pkt_queue_max_unset(bgp
);
2471 DEFUN (bgp_rr_allow_outbound_policy
,
2472 bgp_rr_allow_outbound_policy_cmd
,
2473 "bgp route-reflector allow-outbound-policy",
2474 "BGP specific commands\n"
2475 "Allow modifications made by out route-map\n"
2476 "on ibgp neighbors\n")
2478 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2480 if (!bgp_flag_check(bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
)) {
2481 bgp_flag_set(bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
);
2482 update_group_announce_rrclients(bgp
);
2483 bgp_clear_star_soft_out(vty
, bgp
->name
);
2489 DEFUN (no_bgp_rr_allow_outbound_policy
,
2490 no_bgp_rr_allow_outbound_policy_cmd
,
2491 "no bgp route-reflector allow-outbound-policy",
2493 "BGP specific commands\n"
2494 "Allow modifications made by out route-map\n"
2495 "on ibgp neighbors\n")
2497 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2499 if (bgp_flag_check(bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
)) {
2500 bgp_flag_unset(bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
);
2501 update_group_announce_rrclients(bgp
);
2502 bgp_clear_star_soft_out(vty
, bgp
->name
);
2508 DEFUN (bgp_listen_limit
,
2509 bgp_listen_limit_cmd
,
2510 "bgp listen limit (1-5000)",
2511 "BGP specific commands\n"
2512 "Configure BGP defaults\n"
2513 "maximum number of BGP Dynamic Neighbors that can be created\n"
2514 "Configure Dynamic Neighbors listen limit value\n")
2516 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2520 listen_limit
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
2522 bgp_listen_limit_set(bgp
, listen_limit
);
2527 DEFUN (no_bgp_listen_limit
,
2528 no_bgp_listen_limit_cmd
,
2529 "no bgp listen limit [(1-5000)]",
2530 "BGP specific commands\n"
2531 "Configure BGP defaults\n"
2532 "unset maximum number of BGP Dynamic Neighbors that can be created\n"
2533 "Configure Dynamic Neighbors listen limit value to default\n"
2534 "Configure Dynamic Neighbors listen limit value\n")
2536 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2537 bgp_listen_limit_unset(bgp
);
2543 * Check if this listen range is already configured. Check for exact
2544 * match or overlap based on input.
2546 static struct peer_group
*listen_range_exists(struct bgp
*bgp
,
2547 struct prefix
*range
, int exact
)
2549 struct listnode
*node
, *nnode
;
2550 struct listnode
*node1
, *nnode1
;
2551 struct peer_group
*group
;
2556 afi
= family2afi(range
->family
);
2557 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
2558 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], node1
, nnode1
,
2561 match
= prefix_same(range
, lr
);
2563 match
= (prefix_match(range
, lr
)
2564 || prefix_match(lr
, range
));
2573 DEFUN (bgp_listen_range
,
2574 bgp_listen_range_cmd
,
2575 "bgp listen range <A.B.C.D/M|X:X::X:X/M> peer-group PGNAME",
2576 "BGP specific commands\n"
2577 "Configure BGP dynamic neighbors listen range\n"
2578 "Configure BGP dynamic neighbors listen range\n"
2580 "Member of the peer-group\n"
2581 "Peer-group name\n")
2583 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2584 struct prefix range
;
2585 struct peer_group
*group
, *existing_group
;
2590 argv_find(argv
, argc
, "A.B.C.D/M", &idx
);
2591 argv_find(argv
, argc
, "X:X::X:X/M", &idx
);
2592 char *prefix
= argv
[idx
]->arg
;
2593 argv_find(argv
, argc
, "PGNAME", &idx
);
2594 char *peergroup
= argv
[idx
]->arg
;
2596 /* Convert IP prefix string to struct prefix. */
2597 ret
= str2prefix(prefix
, &range
);
2599 vty_out(vty
, "%% Malformed listen range\n");
2600 return CMD_WARNING_CONFIG_FAILED
;
2603 afi
= family2afi(range
.family
);
2605 if (afi
== AFI_IP6
&& IN6_IS_ADDR_LINKLOCAL(&range
.u
.prefix6
)) {
2607 "%% Malformed listen range (link-local address)\n");
2608 return CMD_WARNING_CONFIG_FAILED
;
2613 /* Check if same listen range is already configured. */
2614 existing_group
= listen_range_exists(bgp
, &range
, 1);
2615 if (existing_group
) {
2616 if (strcmp(existing_group
->name
, peergroup
) == 0)
2620 "%% Same listen range is attached to peer-group %s\n",
2621 existing_group
->name
);
2622 return CMD_WARNING_CONFIG_FAILED
;
2626 /* Check if an overlapping listen range exists. */
2627 if (listen_range_exists(bgp
, &range
, 0)) {
2629 "%% Listen range overlaps with existing listen range\n");
2630 return CMD_WARNING_CONFIG_FAILED
;
2633 group
= peer_group_lookup(bgp
, peergroup
);
2635 vty_out(vty
, "%% Configure the peer-group first\n");
2636 return CMD_WARNING_CONFIG_FAILED
;
2639 ret
= peer_group_listen_range_add(group
, &range
);
2640 return bgp_vty_return(vty
, ret
);
2643 DEFUN (no_bgp_listen_range
,
2644 no_bgp_listen_range_cmd
,
2645 "no bgp listen range <A.B.C.D/M|X:X::X:X/M> peer-group PGNAME",
2647 "BGP specific commands\n"
2648 "Unconfigure BGP dynamic neighbors listen range\n"
2649 "Unconfigure BGP dynamic neighbors listen range\n"
2651 "Member of the peer-group\n"
2652 "Peer-group name\n")
2654 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2655 struct prefix range
;
2656 struct peer_group
*group
;
2661 argv_find(argv
, argc
, "A.B.C.D/M", &idx
);
2662 argv_find(argv
, argc
, "X:X::X:X/M", &idx
);
2663 char *prefix
= argv
[idx
]->arg
;
2664 argv_find(argv
, argc
, "WORD", &idx
);
2665 char *peergroup
= argv
[idx
]->arg
;
2667 /* Convert IP prefix string to struct prefix. */
2668 ret
= str2prefix(prefix
, &range
);
2670 vty_out(vty
, "%% Malformed listen range\n");
2671 return CMD_WARNING_CONFIG_FAILED
;
2674 afi
= family2afi(range
.family
);
2676 if (afi
== AFI_IP6
&& IN6_IS_ADDR_LINKLOCAL(&range
.u
.prefix6
)) {
2678 "%% Malformed listen range (link-local address)\n");
2679 return CMD_WARNING_CONFIG_FAILED
;
2684 group
= peer_group_lookup(bgp
, peergroup
);
2686 vty_out(vty
, "%% Peer-group does not exist\n");
2687 return CMD_WARNING_CONFIG_FAILED
;
2690 ret
= peer_group_listen_range_del(group
, &range
);
2691 return bgp_vty_return(vty
, ret
);
2694 void bgp_config_write_listen(struct vty
*vty
, struct bgp
*bgp
)
2696 struct peer_group
*group
;
2697 struct listnode
*node
, *nnode
, *rnode
, *nrnode
;
2698 struct prefix
*range
;
2700 char buf
[PREFIX2STR_BUFFER
];
2702 if (bgp
->dynamic_neighbors_limit
!= BGP_DYNAMIC_NEIGHBORS_LIMIT_DEFAULT
)
2703 vty_out(vty
, " bgp listen limit %d\n",
2704 bgp
->dynamic_neighbors_limit
);
2706 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
2707 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++) {
2708 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], rnode
,
2710 prefix2str(range
, buf
, sizeof(buf
));
2712 " bgp listen range %s peer-group %s\n",
2720 DEFUN (bgp_disable_connected_route_check
,
2721 bgp_disable_connected_route_check_cmd
,
2722 "bgp disable-ebgp-connected-route-check",
2723 "BGP specific commands\n"
2724 "Disable checking if nexthop is connected on ebgp sessions\n")
2726 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2727 bgp_flag_set(bgp
, BGP_FLAG_DISABLE_NH_CONNECTED_CHK
);
2728 bgp_clear_star_soft_in(vty
, bgp
->name
);
2733 DEFUN (no_bgp_disable_connected_route_check
,
2734 no_bgp_disable_connected_route_check_cmd
,
2735 "no bgp disable-ebgp-connected-route-check",
2737 "BGP specific commands\n"
2738 "Disable checking if nexthop is connected on ebgp sessions\n")
2740 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2741 bgp_flag_unset(bgp
, BGP_FLAG_DISABLE_NH_CONNECTED_CHK
);
2742 bgp_clear_star_soft_in(vty
, bgp
->name
);
2748 static int peer_remote_as_vty(struct vty
*vty
, const char *peer_str
,
2749 const char *as_str
, afi_t afi
, safi_t safi
)
2751 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2754 int as_type
= AS_SPECIFIED
;
2757 if (as_str
[0] == 'i') {
2759 as_type
= AS_INTERNAL
;
2760 } else if (as_str
[0] == 'e') {
2762 as_type
= AS_EXTERNAL
;
2764 /* Get AS number. */
2765 as
= strtoul(as_str
, NULL
, 10);
2768 /* If peer is peer group or interface peer, call proper function. */
2769 ret
= str2sockunion(peer_str
, &su
);
2773 /* Check if existing interface peer */
2774 peer
= peer_lookup_by_conf_if(bgp
, peer_str
);
2776 ret
= peer_remote_as(bgp
, NULL
, peer_str
, &as
, as_type
, afi
,
2779 /* if not interface peer, check peer-group settings */
2780 if (ret
< 0 && !peer
) {
2781 ret
= peer_group_remote_as(bgp
, peer_str
, &as
, as_type
);
2784 "%% Create the peer-group or interface first\n");
2785 return CMD_WARNING_CONFIG_FAILED
;
2790 if (peer_address_self_check(bgp
, &su
)) {
2792 "%% Can not configure the local system as neighbor\n");
2793 return CMD_WARNING_CONFIG_FAILED
;
2795 ret
= peer_remote_as(bgp
, &su
, NULL
, &as
, as_type
, afi
, safi
);
2798 /* This peer belongs to peer group. */
2800 case BGP_ERR_PEER_GROUP_MEMBER
:
2802 "%% Peer-group member cannot override remote-as of peer-group\n");
2803 return CMD_WARNING_CONFIG_FAILED
;
2804 case BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
:
2806 "%% Peer-group members must be all internal or all external\n");
2807 return CMD_WARNING_CONFIG_FAILED
;
2809 return bgp_vty_return(vty
, ret
);
2812 DEFUN (bgp_default_shutdown
,
2813 bgp_default_shutdown_cmd
,
2814 "[no] bgp default shutdown",
2817 "Configure BGP defaults\n"
2818 "Apply administrative shutdown to newly configured peers\n")
2820 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2821 bgp
->autoshutdown
= !strmatch(argv
[0]->text
, "no");
2825 DEFUN (neighbor_remote_as
,
2826 neighbor_remote_as_cmd
,
2827 "neighbor <A.B.C.D|X:X::X:X|WORD> remote-as <(1-4294967295)|internal|external>",
2830 "Specify a BGP neighbor\n"
2832 "Internal BGP peer\n"
2833 "External BGP peer\n")
2836 int idx_remote_as
= 3;
2837 return peer_remote_as_vty(vty
, argv
[idx_peer
]->arg
,
2838 argv
[idx_remote_as
]->arg
, AFI_IP
,
2842 static int peer_conf_interface_get(struct vty
*vty
, const char *conf_if
,
2843 afi_t afi
, safi_t safi
, int v6only
,
2844 const char *peer_group_name
,
2847 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2849 int as_type
= AS_UNSPECIFIED
;
2851 struct peer_group
*group
;
2855 group
= peer_group_lookup(bgp
, conf_if
);
2858 vty_out(vty
, "%% Name conflict with peer-group \n");
2859 return CMD_WARNING_CONFIG_FAILED
;
2863 if (as_str
[0] == 'i') {
2864 as_type
= AS_INTERNAL
;
2865 } else if (as_str
[0] == 'e') {
2866 as_type
= AS_EXTERNAL
;
2868 /* Get AS number. */
2869 as
= strtoul(as_str
, NULL
, 10);
2870 as_type
= AS_SPECIFIED
;
2874 peer
= peer_lookup_by_conf_if(bgp
, conf_if
);
2877 ret
= peer_remote_as(bgp
, NULL
, conf_if
, &as
, as_type
,
2880 if (bgp_flag_check(bgp
, BGP_FLAG_NO_DEFAULT_IPV4
)
2881 && afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
2882 peer
= peer_create(NULL
, conf_if
, bgp
, bgp
->as
, as
,
2883 as_type
, 0, 0, NULL
);
2885 peer
= peer_create(NULL
, conf_if
, bgp
, bgp
->as
, as
,
2886 as_type
, afi
, safi
, NULL
);
2889 vty_out(vty
, "%% BGP failed to create peer\n");
2890 return CMD_WARNING_CONFIG_FAILED
;
2894 peer_flag_set(peer
, PEER_FLAG_IFPEER_V6ONLY
);
2896 /* Request zebra to initiate IPv6 RAs on this interface. We do
2898 * any unnumbered peer in order to not worry about run-time
2900 * (e.g., peering is initially IPv4, but the IPv4 /30 or /31
2902 * gets deleted later etc.)
2905 bgp_zebra_initiate_radv(bgp
, peer
);
2908 if ((v6only
&& !CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
))
2909 || (!v6only
&& CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
))) {
2911 peer_flag_set(peer
, PEER_FLAG_IFPEER_V6ONLY
);
2913 peer_flag_unset(peer
, PEER_FLAG_IFPEER_V6ONLY
);
2915 /* v6only flag changed. Reset bgp seesion */
2916 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
)) {
2917 peer
->last_reset
= PEER_DOWN_V6ONLY_CHANGE
;
2918 bgp_notify_send(peer
, BGP_NOTIFY_CEASE
,
2919 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2921 bgp_session_reset(peer
);
2924 if (!CHECK_FLAG(peer
->flags_invert
, PEER_FLAG_CAPABILITY_ENHE
)) {
2925 SET_FLAG(peer
->flags
, PEER_FLAG_CAPABILITY_ENHE
);
2926 SET_FLAG(peer
->flags_invert
, PEER_FLAG_CAPABILITY_ENHE
);
2927 SET_FLAG(peer
->flags_override
, PEER_FLAG_CAPABILITY_ENHE
);
2930 if (peer_group_name
) {
2931 group
= peer_group_lookup(bgp
, peer_group_name
);
2933 vty_out(vty
, "%% Configure the peer-group first\n");
2934 return CMD_WARNING_CONFIG_FAILED
;
2937 ret
= peer_group_bind(bgp
, &su
, peer
, group
, &as
);
2940 return bgp_vty_return(vty
, ret
);
2943 DEFUN (neighbor_interface_config
,
2944 neighbor_interface_config_cmd
,
2945 "neighbor WORD interface [peer-group PGNAME]",
2947 "Interface name or neighbor tag\n"
2948 "Enable BGP on interface\n"
2949 "Member of the peer-group\n"
2950 "Peer-group name\n")
2953 int idx_peer_group_word
= 4;
2955 if (argc
> idx_peer_group_word
)
2956 return peer_conf_interface_get(
2957 vty
, argv
[idx_word
]->arg
, AFI_IP
, SAFI_UNICAST
, 0,
2958 argv
[idx_peer_group_word
]->arg
, NULL
);
2960 return peer_conf_interface_get(vty
, argv
[idx_word
]->arg
, AFI_IP
,
2961 SAFI_UNICAST
, 0, NULL
, NULL
);
2964 DEFUN (neighbor_interface_config_v6only
,
2965 neighbor_interface_config_v6only_cmd
,
2966 "neighbor WORD interface v6only [peer-group PGNAME]",
2968 "Interface name or neighbor tag\n"
2969 "Enable BGP on interface\n"
2970 "Enable BGP with v6 link-local only\n"
2971 "Member of the peer-group\n"
2972 "Peer-group name\n")
2975 int idx_peer_group_word
= 5;
2977 if (argc
> idx_peer_group_word
)
2978 return peer_conf_interface_get(
2979 vty
, argv
[idx_word
]->arg
, AFI_IP
, SAFI_UNICAST
, 1,
2980 argv
[idx_peer_group_word
]->arg
, NULL
);
2982 return peer_conf_interface_get(vty
, argv
[idx_word
]->arg
, AFI_IP
,
2983 SAFI_UNICAST
, 1, NULL
, NULL
);
2987 DEFUN (neighbor_interface_config_remote_as
,
2988 neighbor_interface_config_remote_as_cmd
,
2989 "neighbor WORD interface remote-as <(1-4294967295)|internal|external>",
2991 "Interface name or neighbor tag\n"
2992 "Enable BGP on interface\n"
2993 "Specify a BGP neighbor\n"
2995 "Internal BGP peer\n"
2996 "External BGP peer\n")
2999 int idx_remote_as
= 4;
3000 return peer_conf_interface_get(vty
, argv
[idx_word
]->arg
, AFI_IP
,
3001 SAFI_UNICAST
, 0, NULL
,
3002 argv
[idx_remote_as
]->arg
);
3005 DEFUN (neighbor_interface_v6only_config_remote_as
,
3006 neighbor_interface_v6only_config_remote_as_cmd
,
3007 "neighbor WORD interface v6only remote-as <(1-4294967295)|internal|external>",
3009 "Interface name or neighbor tag\n"
3010 "Enable BGP with v6 link-local only\n"
3011 "Enable BGP on interface\n"
3012 "Specify a BGP neighbor\n"
3014 "Internal BGP peer\n"
3015 "External BGP peer\n")
3018 int idx_remote_as
= 5;
3019 return peer_conf_interface_get(vty
, argv
[idx_word
]->arg
, AFI_IP
,
3020 SAFI_UNICAST
, 1, NULL
,
3021 argv
[idx_remote_as
]->arg
);
3024 DEFUN (neighbor_peer_group
,
3025 neighbor_peer_group_cmd
,
3026 "neighbor WORD peer-group",
3028 "Interface name or neighbor tag\n"
3029 "Configure peer-group\n")
3031 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3034 struct peer_group
*group
;
3036 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_word
]->arg
);
3038 vty_out(vty
, "%% Name conflict with interface: \n");
3039 return CMD_WARNING_CONFIG_FAILED
;
3042 group
= peer_group_get(bgp
, argv
[idx_word
]->arg
);
3044 vty_out(vty
, "%% BGP failed to find or create peer-group\n");
3045 return CMD_WARNING_CONFIG_FAILED
;
3053 "no neighbor <WORD|<A.B.C.D|X:X::X:X> [remote-as <(1-4294967295)|internal|external>]>",
3057 "Specify a BGP neighbor\n"
3059 "Internal BGP peer\n"
3060 "External BGP peer\n")
3062 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3066 struct peer_group
*group
;
3070 ret
= str2sockunion(argv
[idx_peer
]->arg
, &su
);
3072 /* look up for neighbor by interface name config. */
3073 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_peer
]->arg
);
3075 /* Request zebra to terminate IPv6 RAs on this
3078 bgp_zebra_terminate_radv(peer
->bgp
, peer
);
3083 group
= peer_group_lookup(bgp
, argv
[idx_peer
]->arg
);
3085 peer_group_delete(group
);
3087 vty_out(vty
, "%% Create the peer-group first\n");
3088 return CMD_WARNING_CONFIG_FAILED
;
3091 peer
= peer_lookup(bgp
, &su
);
3093 if (peer_dynamic_neighbor(peer
)) {
3095 "%% Operation not allowed on a dynamic neighbor\n");
3096 return CMD_WARNING_CONFIG_FAILED
;
3099 other
= peer
->doppelganger
;
3101 if (other
&& other
->status
!= Deleted
)
3109 DEFUN (no_neighbor_interface_config
,
3110 no_neighbor_interface_config_cmd
,
3111 "no neighbor WORD interface [v6only] [peer-group PGNAME] [remote-as <(1-4294967295)|internal|external>]",
3115 "Configure BGP on interface\n"
3116 "Enable BGP with v6 link-local only\n"
3117 "Member of the peer-group\n"
3119 "Specify a BGP neighbor\n"
3121 "Internal BGP peer\n"
3122 "External BGP peer\n")
3124 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3128 /* look up for neighbor by interface name config. */
3129 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_word
]->arg
);
3131 /* Request zebra to terminate IPv6 RAs on this interface. */
3133 bgp_zebra_terminate_radv(peer
->bgp
, peer
);
3136 vty_out(vty
, "%% Create the bgp interface first\n");
3137 return CMD_WARNING_CONFIG_FAILED
;
3142 DEFUN (no_neighbor_peer_group
,
3143 no_neighbor_peer_group_cmd
,
3144 "no neighbor WORD peer-group",
3148 "Configure peer-group\n")
3150 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3152 struct peer_group
*group
;
3154 group
= peer_group_lookup(bgp
, argv
[idx_word
]->arg
);
3156 peer_group_delete(group
);
3158 vty_out(vty
, "%% Create the peer-group first\n");
3159 return CMD_WARNING_CONFIG_FAILED
;
3164 DEFUN (no_neighbor_interface_peer_group_remote_as
,
3165 no_neighbor_interface_peer_group_remote_as_cmd
,
3166 "no neighbor WORD remote-as <(1-4294967295)|internal|external>",
3169 "Interface name or neighbor tag\n"
3170 "Specify a BGP neighbor\n"
3172 "Internal BGP peer\n"
3173 "External BGP peer\n")
3175 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3177 struct peer_group
*group
;
3180 /* look up for neighbor by interface name config. */
3181 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_word
]->arg
);
3183 peer_as_change(peer
, 0, AS_UNSPECIFIED
);
3187 group
= peer_group_lookup(bgp
, argv
[idx_word
]->arg
);
3189 peer_group_remote_as_delete(group
);
3191 vty_out(vty
, "%% Create the peer-group or interface first\n");
3192 return CMD_WARNING_CONFIG_FAILED
;
3197 DEFUN (neighbor_local_as
,
3198 neighbor_local_as_cmd
,
3199 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295)",
3202 "Specify a local-as number\n"
3203 "AS number used as local AS\n")
3211 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3213 return CMD_WARNING_CONFIG_FAILED
;
3215 as
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
3216 ret
= peer_local_as_set(peer
, as
, 0, 0);
3217 return bgp_vty_return(vty
, ret
);
3220 DEFUN (neighbor_local_as_no_prepend
,
3221 neighbor_local_as_no_prepend_cmd
,
3222 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295) no-prepend",
3225 "Specify a local-as number\n"
3226 "AS number used as local AS\n"
3227 "Do not prepend local-as to updates from ebgp peers\n")
3235 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3237 return CMD_WARNING_CONFIG_FAILED
;
3239 as
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
3240 ret
= peer_local_as_set(peer
, as
, 1, 0);
3241 return bgp_vty_return(vty
, ret
);
3244 DEFUN (neighbor_local_as_no_prepend_replace_as
,
3245 neighbor_local_as_no_prepend_replace_as_cmd
,
3246 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295) no-prepend replace-as",
3249 "Specify a local-as number\n"
3250 "AS number used as local AS\n"
3251 "Do not prepend local-as to updates from ebgp peers\n"
3252 "Do not prepend local-as to updates from ibgp peers\n")
3260 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3262 return CMD_WARNING_CONFIG_FAILED
;
3264 as
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
3265 ret
= peer_local_as_set(peer
, as
, 1, 1);
3266 return bgp_vty_return(vty
, ret
);
3269 DEFUN (no_neighbor_local_as
,
3270 no_neighbor_local_as_cmd
,
3271 "no neighbor <A.B.C.D|X:X::X:X|WORD> local-as [(1-4294967295) [no-prepend [replace-as]]]",
3275 "Specify a local-as number\n"
3276 "AS number used as local AS\n"
3277 "Do not prepend local-as to updates from ebgp peers\n"
3278 "Do not prepend local-as to updates from ibgp peers\n")
3284 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3286 return CMD_WARNING_CONFIG_FAILED
;
3288 ret
= peer_local_as_unset(peer
);
3289 return bgp_vty_return(vty
, ret
);
3293 DEFUN (neighbor_solo
,
3295 "neighbor <A.B.C.D|X:X::X:X|WORD> solo",
3298 "Solo peer - part of its own update group\n")
3304 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3306 return CMD_WARNING_CONFIG_FAILED
;
3308 ret
= update_group_adjust_soloness(peer
, 1);
3309 return bgp_vty_return(vty
, ret
);
3312 DEFUN (no_neighbor_solo
,
3313 no_neighbor_solo_cmd
,
3314 "no neighbor <A.B.C.D|X:X::X:X|WORD> solo",
3318 "Solo peer - part of its own update group\n")
3324 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3326 return CMD_WARNING_CONFIG_FAILED
;
3328 ret
= update_group_adjust_soloness(peer
, 0);
3329 return bgp_vty_return(vty
, ret
);
3332 DEFUN (neighbor_password
,
3333 neighbor_password_cmd
,
3334 "neighbor <A.B.C.D|X:X::X:X|WORD> password LINE",
3345 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3347 return CMD_WARNING_CONFIG_FAILED
;
3349 ret
= peer_password_set(peer
, argv
[idx_line
]->arg
);
3350 return bgp_vty_return(vty
, ret
);
3353 DEFUN (no_neighbor_password
,
3354 no_neighbor_password_cmd
,
3355 "no neighbor <A.B.C.D|X:X::X:X|WORD> password [LINE]",
3366 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3368 return CMD_WARNING_CONFIG_FAILED
;
3370 ret
= peer_password_unset(peer
);
3371 return bgp_vty_return(vty
, ret
);
3374 DEFUN (neighbor_activate
,
3375 neighbor_activate_cmd
,
3376 "neighbor <A.B.C.D|X:X::X:X|WORD> activate",
3379 "Enable the Address Family for this Neighbor\n")
3385 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3387 return CMD_WARNING_CONFIG_FAILED
;
3389 ret
= peer_activate(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
));
3390 return bgp_vty_return(vty
, ret
);
3393 ALIAS_HIDDEN(neighbor_activate
, neighbor_activate_hidden_cmd
,
3394 "neighbor <A.B.C.D|X:X::X:X|WORD> activate",
3395 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3396 "Enable the Address Family for this Neighbor\n")
3398 DEFUN (no_neighbor_activate
,
3399 no_neighbor_activate_cmd
,
3400 "no neighbor <A.B.C.D|X:X::X:X|WORD> activate",
3404 "Enable the Address Family for this Neighbor\n")
3411 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3413 return CMD_WARNING_CONFIG_FAILED
;
3415 ret
= peer_deactivate(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
));
3416 return bgp_vty_return(vty
, ret
);
3419 ALIAS_HIDDEN(no_neighbor_activate
, no_neighbor_activate_hidden_cmd
,
3420 "no neighbor <A.B.C.D|X:X::X:X|WORD> activate",
3421 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3422 "Enable the Address Family for this Neighbor\n")
3424 DEFUN (neighbor_set_peer_group
,
3425 neighbor_set_peer_group_cmd
,
3426 "neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
3429 "Member of the peer-group\n"
3430 "Peer-group name\n")
3432 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3439 struct peer_group
*group
;
3441 ret
= str2sockunion(argv
[idx_peer
]->arg
, &su
);
3443 peer
= peer_lookup_by_conf_if(bgp
, argv
[idx_peer
]->arg
);
3445 vty_out(vty
, "%% Malformed address or name: %s\n",
3446 argv
[idx_peer
]->arg
);
3447 return CMD_WARNING_CONFIG_FAILED
;
3450 if (peer_address_self_check(bgp
, &su
)) {
3452 "%% Can not configure the local system as neighbor\n");
3453 return CMD_WARNING_CONFIG_FAILED
;
3456 /* Disallow for dynamic neighbor. */
3457 peer
= peer_lookup(bgp
, &su
);
3458 if (peer
&& peer_dynamic_neighbor(peer
)) {
3460 "%% Operation not allowed on a dynamic neighbor\n");
3461 return CMD_WARNING_CONFIG_FAILED
;
3465 group
= peer_group_lookup(bgp
, argv
[idx_word
]->arg
);
3467 vty_out(vty
, "%% Configure the peer-group first\n");
3468 return CMD_WARNING_CONFIG_FAILED
;
3471 ret
= peer_group_bind(bgp
, &su
, peer
, group
, &as
);
3473 if (ret
== BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
) {
3475 "%% Peer with AS %u cannot be in this peer-group, members must be all internal or all external\n",
3477 return CMD_WARNING_CONFIG_FAILED
;
3480 return bgp_vty_return(vty
, ret
);
3483 ALIAS_HIDDEN(neighbor_set_peer_group
, neighbor_set_peer_group_hidden_cmd
,
3484 "neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
3485 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3486 "Member of the peer-group\n"
3487 "Peer-group name\n")
3489 DEFUN (no_neighbor_set_peer_group
,
3490 no_neighbor_set_peer_group_cmd
,
3491 "no neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
3495 "Member of the peer-group\n"
3496 "Peer-group name\n")
3498 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3503 struct peer_group
*group
;
3505 peer
= peer_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3507 return CMD_WARNING_CONFIG_FAILED
;
3509 group
= peer_group_lookup(bgp
, argv
[idx_word
]->arg
);
3511 vty_out(vty
, "%% Configure the peer-group first\n");
3512 return CMD_WARNING_CONFIG_FAILED
;
3515 ret
= peer_delete(peer
);
3517 return bgp_vty_return(vty
, ret
);
3520 ALIAS_HIDDEN(no_neighbor_set_peer_group
, no_neighbor_set_peer_group_hidden_cmd
,
3521 "no neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
3522 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3523 "Member of the peer-group\n"
3524 "Peer-group name\n")
3526 static int peer_flag_modify_vty(struct vty
*vty
, const char *ip_str
,
3527 uint32_t flag
, int set
)
3532 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
3534 return CMD_WARNING_CONFIG_FAILED
;
3537 * If 'neighbor <interface>', then this is for directly connected peers,
3538 * we should not accept disable-connected-check.
3540 if (peer
->conf_if
&& (flag
== PEER_FLAG_DISABLE_CONNECTED_CHECK
)) {
3542 "%s is directly connected peer, cannot accept disable-"
3543 "connected-check\n",
3545 return CMD_WARNING_CONFIG_FAILED
;
3548 if (!set
&& flag
== PEER_FLAG_SHUTDOWN
)
3549 peer_tx_shutdown_message_unset(peer
);
3552 ret
= peer_flag_set(peer
, flag
);
3554 ret
= peer_flag_unset(peer
, flag
);
3556 return bgp_vty_return(vty
, ret
);
3559 static int peer_flag_set_vty(struct vty
*vty
, const char *ip_str
, uint32_t flag
)
3561 return peer_flag_modify_vty(vty
, ip_str
, flag
, 1);
3564 static int peer_flag_unset_vty(struct vty
*vty
, const char *ip_str
,
3567 return peer_flag_modify_vty(vty
, ip_str
, flag
, 0);
3570 /* neighbor passive. */
3571 DEFUN (neighbor_passive
,
3572 neighbor_passive_cmd
,
3573 "neighbor <A.B.C.D|X:X::X:X|WORD> passive",
3576 "Don't send open messages to this neighbor\n")
3579 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
, PEER_FLAG_PASSIVE
);
3582 DEFUN (no_neighbor_passive
,
3583 no_neighbor_passive_cmd
,
3584 "no neighbor <A.B.C.D|X:X::X:X|WORD> passive",
3588 "Don't send open messages to this neighbor\n")
3591 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
, PEER_FLAG_PASSIVE
);
3594 /* neighbor shutdown. */
3595 DEFUN (neighbor_shutdown_msg
,
3596 neighbor_shutdown_msg_cmd
,
3597 "neighbor <A.B.C.D|X:X::X:X|WORD> shutdown message MSG...",
3600 "Administratively shut down this neighbor\n"
3601 "Add a shutdown message (draft-ietf-idr-shutdown-06)\n"
3602 "Shutdown message\n")
3608 peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
3612 return CMD_WARNING_CONFIG_FAILED
;
3613 message
= argv_concat(argv
, argc
, 4);
3614 peer_tx_shutdown_message_set(peer
, message
);
3615 XFREE(MTYPE_TMP
, message
);
3618 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
, PEER_FLAG_SHUTDOWN
);
3621 ALIAS(neighbor_shutdown_msg
, neighbor_shutdown_cmd
,
3622 "neighbor <A.B.C.D|X:X::X:X|WORD> shutdown",
3623 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3624 "Administratively shut down this neighbor\n")
3626 DEFUN (no_neighbor_shutdown_msg
,
3627 no_neighbor_shutdown_msg_cmd
,
3628 "no neighbor <A.B.C.D|X:X::X:X|WORD> shutdown message MSG...",
3632 "Administratively shut down this neighbor\n"
3633 "Remove a shutdown message (draft-ietf-idr-shutdown-06)\n"
3634 "Shutdown message\n")
3638 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3639 PEER_FLAG_SHUTDOWN
);
3642 ALIAS(no_neighbor_shutdown_msg
, no_neighbor_shutdown_cmd
,
3643 "no neighbor <A.B.C.D|X:X::X:X|WORD> shutdown",
3644 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3645 "Administratively shut down this neighbor\n")
3647 /* neighbor capability dynamic. */
3648 DEFUN (neighbor_capability_dynamic
,
3649 neighbor_capability_dynamic_cmd
,
3650 "neighbor <A.B.C.D|X:X::X:X|WORD> capability dynamic",
3653 "Advertise capability to the peer\n"
3654 "Advertise dynamic capability to this neighbor\n")
3657 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
3658 PEER_FLAG_DYNAMIC_CAPABILITY
);
3661 DEFUN (no_neighbor_capability_dynamic
,
3662 no_neighbor_capability_dynamic_cmd
,
3663 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability dynamic",
3667 "Advertise capability to the peer\n"
3668 "Advertise dynamic capability to this neighbor\n")
3671 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3672 PEER_FLAG_DYNAMIC_CAPABILITY
);
3675 /* neighbor dont-capability-negotiate */
3676 DEFUN (neighbor_dont_capability_negotiate
,
3677 neighbor_dont_capability_negotiate_cmd
,
3678 "neighbor <A.B.C.D|X:X::X:X|WORD> dont-capability-negotiate",
3681 "Do not perform capability negotiation\n")
3684 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
3685 PEER_FLAG_DONT_CAPABILITY
);
3688 DEFUN (no_neighbor_dont_capability_negotiate
,
3689 no_neighbor_dont_capability_negotiate_cmd
,
3690 "no neighbor <A.B.C.D|X:X::X:X|WORD> dont-capability-negotiate",
3694 "Do not perform capability negotiation\n")
3697 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3698 PEER_FLAG_DONT_CAPABILITY
);
3701 /* neighbor capability extended next hop encoding */
3702 DEFUN (neighbor_capability_enhe
,
3703 neighbor_capability_enhe_cmd
,
3704 "neighbor <A.B.C.D|X:X::X:X|WORD> capability extended-nexthop",
3707 "Advertise capability to the peer\n"
3708 "Advertise extended next-hop capability to the peer\n")
3711 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
3712 PEER_FLAG_CAPABILITY_ENHE
);
3715 DEFUN (no_neighbor_capability_enhe
,
3716 no_neighbor_capability_enhe_cmd
,
3717 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability extended-nexthop",
3721 "Advertise capability to the peer\n"
3722 "Advertise extended next-hop capability to the peer\n")
3725 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3726 PEER_FLAG_CAPABILITY_ENHE
);
3729 static int peer_af_flag_modify_vty(struct vty
*vty
, const char *peer_str
,
3730 afi_t afi
, safi_t safi
, uint32_t flag
,
3736 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
3738 return CMD_WARNING_CONFIG_FAILED
;
3741 ret
= peer_af_flag_set(peer
, afi
, safi
, flag
);
3743 ret
= peer_af_flag_unset(peer
, afi
, safi
, flag
);
3745 return bgp_vty_return(vty
, ret
);
3748 static int peer_af_flag_set_vty(struct vty
*vty
, const char *peer_str
,
3749 afi_t afi
, safi_t safi
, uint32_t flag
)
3751 return peer_af_flag_modify_vty(vty
, peer_str
, afi
, safi
, flag
, 1);
3754 static int peer_af_flag_unset_vty(struct vty
*vty
, const char *peer_str
,
3755 afi_t afi
, safi_t safi
, uint32_t flag
)
3757 return peer_af_flag_modify_vty(vty
, peer_str
, afi
, safi
, flag
, 0);
3760 /* neighbor capability orf prefix-list. */
3761 DEFUN (neighbor_capability_orf_prefix
,
3762 neighbor_capability_orf_prefix_cmd
,
3763 "neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
3766 "Advertise capability to the peer\n"
3767 "Advertise ORF capability to the peer\n"
3768 "Advertise prefixlist ORF capability to this neighbor\n"
3769 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
3770 "Capability to RECEIVE the ORF from this neighbor\n"
3771 "Capability to SEND the ORF to this neighbor\n")
3774 int idx_send_recv
= 5;
3777 if (strmatch(argv
[idx_send_recv
]->text
, "send"))
3778 flag
= PEER_FLAG_ORF_PREFIX_SM
;
3779 else if (strmatch(argv
[idx_send_recv
]->text
, "receive"))
3780 flag
= PEER_FLAG_ORF_PREFIX_RM
;
3781 else if (strmatch(argv
[idx_send_recv
]->text
, "both"))
3782 flag
= PEER_FLAG_ORF_PREFIX_SM
| PEER_FLAG_ORF_PREFIX_RM
;
3784 vty_out(vty
, "%% BGP invalid orf prefix-list option\n");
3785 return CMD_WARNING_CONFIG_FAILED
;
3788 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
3789 bgp_node_safi(vty
), flag
);
3793 neighbor_capability_orf_prefix
,
3794 neighbor_capability_orf_prefix_hidden_cmd
,
3795 "neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
3796 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3797 "Advertise capability to the peer\n"
3798 "Advertise ORF capability to the peer\n"
3799 "Advertise prefixlist ORF capability to this neighbor\n"
3800 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
3801 "Capability to RECEIVE the ORF from this neighbor\n"
3802 "Capability to SEND the ORF to this neighbor\n")
3804 DEFUN (no_neighbor_capability_orf_prefix
,
3805 no_neighbor_capability_orf_prefix_cmd
,
3806 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
3810 "Advertise capability to the peer\n"
3811 "Advertise ORF capability to the peer\n"
3812 "Advertise prefixlist ORF capability to this neighbor\n"
3813 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
3814 "Capability to RECEIVE the ORF from this neighbor\n"
3815 "Capability to SEND the ORF to this neighbor\n")
3818 int idx_send_recv
= 6;
3821 if (strmatch(argv
[idx_send_recv
]->text
, "send"))
3822 flag
= PEER_FLAG_ORF_PREFIX_SM
;
3823 else if (strmatch(argv
[idx_send_recv
]->text
, "receive"))
3824 flag
= PEER_FLAG_ORF_PREFIX_RM
;
3825 else if (strmatch(argv
[idx_send_recv
]->text
, "both"))
3826 flag
= PEER_FLAG_ORF_PREFIX_SM
| PEER_FLAG_ORF_PREFIX_RM
;
3828 vty_out(vty
, "%% BGP invalid orf prefix-list option\n");
3829 return CMD_WARNING_CONFIG_FAILED
;
3832 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3833 bgp_node_afi(vty
), bgp_node_safi(vty
),
3838 no_neighbor_capability_orf_prefix
,
3839 no_neighbor_capability_orf_prefix_hidden_cmd
,
3840 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
3841 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3842 "Advertise capability to the peer\n"
3843 "Advertise ORF capability to the peer\n"
3844 "Advertise prefixlist ORF capability to this neighbor\n"
3845 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
3846 "Capability to RECEIVE the ORF from this neighbor\n"
3847 "Capability to SEND the ORF to this neighbor\n")
3849 /* neighbor next-hop-self. */
3850 DEFUN (neighbor_nexthop_self
,
3851 neighbor_nexthop_self_cmd
,
3852 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
3855 "Disable the next hop calculation for this neighbor\n")
3858 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
3859 bgp_node_safi(vty
), PEER_FLAG_NEXTHOP_SELF
);
3862 ALIAS_HIDDEN(neighbor_nexthop_self
, neighbor_nexthop_self_hidden_cmd
,
3863 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
3864 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3865 "Disable the next hop calculation for this neighbor\n")
3867 /* neighbor next-hop-self. */
3868 DEFUN (neighbor_nexthop_self_force
,
3869 neighbor_nexthop_self_force_cmd
,
3870 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
3873 "Disable the next hop calculation for this neighbor\n"
3874 "Set the next hop to self for reflected routes\n")
3877 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
3879 PEER_FLAG_FORCE_NEXTHOP_SELF
);
3882 ALIAS_HIDDEN(neighbor_nexthop_self_force
,
3883 neighbor_nexthop_self_force_hidden_cmd
,
3884 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
3885 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3886 "Disable the next hop calculation for this neighbor\n"
3887 "Set the next hop to self for reflected routes\n")
3889 ALIAS_HIDDEN(neighbor_nexthop_self_force
,
3890 neighbor_nexthop_self_all_hidden_cmd
,
3891 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self all",
3892 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3893 "Disable the next hop calculation for this neighbor\n"
3894 "Set the next hop to self for reflected routes\n")
3896 DEFUN (no_neighbor_nexthop_self
,
3897 no_neighbor_nexthop_self_cmd
,
3898 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
3902 "Disable the next hop calculation for this neighbor\n")
3905 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3906 bgp_node_afi(vty
), bgp_node_safi(vty
),
3907 PEER_FLAG_NEXTHOP_SELF
);
3910 ALIAS_HIDDEN(no_neighbor_nexthop_self
, no_neighbor_nexthop_self_hidden_cmd
,
3911 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
3912 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3913 "Disable the next hop calculation for this neighbor\n")
3915 DEFUN (no_neighbor_nexthop_self_force
,
3916 no_neighbor_nexthop_self_force_cmd
,
3917 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
3921 "Disable the next hop calculation for this neighbor\n"
3922 "Set the next hop to self for reflected routes\n")
3925 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3926 bgp_node_afi(vty
), bgp_node_safi(vty
),
3927 PEER_FLAG_FORCE_NEXTHOP_SELF
);
3930 ALIAS_HIDDEN(no_neighbor_nexthop_self_force
,
3931 no_neighbor_nexthop_self_force_hidden_cmd
,
3932 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
3933 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3934 "Disable the next hop calculation for this neighbor\n"
3935 "Set the next hop to self for reflected routes\n")
3937 ALIAS_HIDDEN(no_neighbor_nexthop_self_force
,
3938 no_neighbor_nexthop_self_all_hidden_cmd
,
3939 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self all",
3940 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3941 "Disable the next hop calculation for this neighbor\n"
3942 "Set the next hop to self for reflected routes\n")
3944 /* neighbor as-override */
3945 DEFUN (neighbor_as_override
,
3946 neighbor_as_override_cmd
,
3947 "neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
3950 "Override ASNs in outbound updates if aspath equals remote-as\n")
3953 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
3954 bgp_node_safi(vty
), PEER_FLAG_AS_OVERRIDE
);
3957 ALIAS_HIDDEN(neighbor_as_override
, neighbor_as_override_hidden_cmd
,
3958 "neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
3959 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3960 "Override ASNs in outbound updates if aspath equals remote-as\n")
3962 DEFUN (no_neighbor_as_override
,
3963 no_neighbor_as_override_cmd
,
3964 "no neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
3968 "Override ASNs in outbound updates if aspath equals remote-as\n")
3971 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
3972 bgp_node_afi(vty
), bgp_node_safi(vty
),
3973 PEER_FLAG_AS_OVERRIDE
);
3976 ALIAS_HIDDEN(no_neighbor_as_override
, no_neighbor_as_override_hidden_cmd
,
3977 "no neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
3978 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3979 "Override ASNs in outbound updates if aspath equals remote-as\n")
3981 /* neighbor remove-private-AS. */
3982 DEFUN (neighbor_remove_private_as
,
3983 neighbor_remove_private_as_cmd
,
3984 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
3987 "Remove private ASNs in outbound updates\n")
3990 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
3992 PEER_FLAG_REMOVE_PRIVATE_AS
);
3995 ALIAS_HIDDEN(neighbor_remove_private_as
, neighbor_remove_private_as_hidden_cmd
,
3996 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
3997 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3998 "Remove private ASNs in outbound updates\n")
4000 DEFUN (neighbor_remove_private_as_all
,
4001 neighbor_remove_private_as_all_cmd
,
4002 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
4005 "Remove private ASNs in outbound updates\n"
4006 "Apply to all AS numbers\n")
4009 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4011 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
);
4014 ALIAS_HIDDEN(neighbor_remove_private_as_all
,
4015 neighbor_remove_private_as_all_hidden_cmd
,
4016 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
4017 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4018 "Remove private ASNs in outbound updates\n"
4019 "Apply to all AS numbers")
4021 DEFUN (neighbor_remove_private_as_replace_as
,
4022 neighbor_remove_private_as_replace_as_cmd
,
4023 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
4026 "Remove private ASNs in outbound updates\n"
4027 "Replace private ASNs with our ASN in outbound updates\n")
4030 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4032 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
);
4035 ALIAS_HIDDEN(neighbor_remove_private_as_replace_as
,
4036 neighbor_remove_private_as_replace_as_hidden_cmd
,
4037 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
4038 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4039 "Remove private ASNs in outbound updates\n"
4040 "Replace private ASNs with our ASN in outbound updates\n")
4042 DEFUN (neighbor_remove_private_as_all_replace_as
,
4043 neighbor_remove_private_as_all_replace_as_cmd
,
4044 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
4047 "Remove private ASNs in outbound updates\n"
4048 "Apply to all AS numbers\n"
4049 "Replace private ASNs with our ASN in outbound updates\n")
4052 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4054 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
);
4058 neighbor_remove_private_as_all_replace_as
,
4059 neighbor_remove_private_as_all_replace_as_hidden_cmd
,
4060 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
4061 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4062 "Remove private ASNs in outbound updates\n"
4063 "Apply to all AS numbers\n"
4064 "Replace private ASNs with our ASN in outbound updates\n")
4066 DEFUN (no_neighbor_remove_private_as
,
4067 no_neighbor_remove_private_as_cmd
,
4068 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
4072 "Remove private ASNs in outbound updates\n")
4075 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4076 bgp_node_afi(vty
), bgp_node_safi(vty
),
4077 PEER_FLAG_REMOVE_PRIVATE_AS
);
4080 ALIAS_HIDDEN(no_neighbor_remove_private_as
,
4081 no_neighbor_remove_private_as_hidden_cmd
,
4082 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
4083 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4084 "Remove private ASNs in outbound updates\n")
4086 DEFUN (no_neighbor_remove_private_as_all
,
4087 no_neighbor_remove_private_as_all_cmd
,
4088 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
4092 "Remove private ASNs in outbound updates\n"
4093 "Apply to all AS numbers\n")
4096 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4097 bgp_node_afi(vty
), bgp_node_safi(vty
),
4098 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
);
4101 ALIAS_HIDDEN(no_neighbor_remove_private_as_all
,
4102 no_neighbor_remove_private_as_all_hidden_cmd
,
4103 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
4104 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4105 "Remove private ASNs in outbound updates\n"
4106 "Apply to all AS numbers\n")
4108 DEFUN (no_neighbor_remove_private_as_replace_as
,
4109 no_neighbor_remove_private_as_replace_as_cmd
,
4110 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
4114 "Remove private ASNs in outbound updates\n"
4115 "Replace private ASNs with our ASN in outbound updates\n")
4118 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4119 bgp_node_afi(vty
), bgp_node_safi(vty
),
4120 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
);
4123 ALIAS_HIDDEN(no_neighbor_remove_private_as_replace_as
,
4124 no_neighbor_remove_private_as_replace_as_hidden_cmd
,
4125 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
4126 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4127 "Remove private ASNs in outbound updates\n"
4128 "Replace private ASNs with our ASN in outbound updates\n")
4130 DEFUN (no_neighbor_remove_private_as_all_replace_as
,
4131 no_neighbor_remove_private_as_all_replace_as_cmd
,
4132 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
4136 "Remove private ASNs in outbound updates\n"
4137 "Apply to all AS numbers\n"
4138 "Replace private ASNs with our ASN in outbound updates\n")
4141 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4142 bgp_node_afi(vty
), bgp_node_safi(vty
),
4143 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
);
4147 no_neighbor_remove_private_as_all_replace_as
,
4148 no_neighbor_remove_private_as_all_replace_as_hidden_cmd
,
4149 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
4150 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4151 "Remove private ASNs in outbound updates\n"
4152 "Apply to all AS numbers\n"
4153 "Replace private ASNs with our ASN in outbound updates\n")
4156 /* neighbor send-community. */
4157 DEFUN (neighbor_send_community
,
4158 neighbor_send_community_cmd
,
4159 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
4162 "Send Community attribute to this neighbor\n")
4166 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4168 PEER_FLAG_SEND_COMMUNITY
);
4171 ALIAS_HIDDEN(neighbor_send_community
, neighbor_send_community_hidden_cmd
,
4172 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
4173 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4174 "Send Community attribute to this neighbor\n")
4176 DEFUN (no_neighbor_send_community
,
4177 no_neighbor_send_community_cmd
,
4178 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
4182 "Send Community attribute to this neighbor\n")
4186 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4187 bgp_node_afi(vty
), bgp_node_safi(vty
),
4188 PEER_FLAG_SEND_COMMUNITY
);
4191 ALIAS_HIDDEN(no_neighbor_send_community
, no_neighbor_send_community_hidden_cmd
,
4192 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
4193 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4194 "Send Community attribute to this neighbor\n")
4196 /* neighbor send-community extended. */
4197 DEFUN (neighbor_send_community_type
,
4198 neighbor_send_community_type_cmd
,
4199 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
4202 "Send Community attribute to this neighbor\n"
4203 "Send Standard and Extended Community attributes\n"
4204 "Send Standard, Large and Extended Community attributes\n"
4205 "Send Extended Community attributes\n"
4206 "Send Standard Community attributes\n"
4207 "Send Large Community attributes\n")
4211 const char *type
= argv
[argc
- 1]->text
;
4213 if (strmatch(type
, "standard")) {
4214 SET_FLAG(flag
, PEER_FLAG_SEND_COMMUNITY
);
4215 } else if (strmatch(type
, "extended")) {
4216 SET_FLAG(flag
, PEER_FLAG_SEND_EXT_COMMUNITY
);
4217 } else if (strmatch(type
, "large")) {
4218 SET_FLAG(flag
, PEER_FLAG_SEND_LARGE_COMMUNITY
);
4219 } else if (strmatch(type
, "both")) {
4220 SET_FLAG(flag
, PEER_FLAG_SEND_COMMUNITY
);
4221 SET_FLAG(flag
, PEER_FLAG_SEND_EXT_COMMUNITY
);
4222 } else { /* if (strmatch(type, "all")) */
4223 SET_FLAG(flag
, PEER_FLAG_SEND_COMMUNITY
);
4224 SET_FLAG(flag
, PEER_FLAG_SEND_EXT_COMMUNITY
);
4225 SET_FLAG(flag
, PEER_FLAG_SEND_LARGE_COMMUNITY
);
4228 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4229 bgp_node_safi(vty
), flag
);
4233 neighbor_send_community_type
, neighbor_send_community_type_hidden_cmd
,
4234 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
4235 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4236 "Send Community attribute to this neighbor\n"
4237 "Send Standard and Extended Community attributes\n"
4238 "Send Standard, Large and Extended Community attributes\n"
4239 "Send Extended Community attributes\n"
4240 "Send Standard Community attributes\n"
4241 "Send Large Community attributes\n")
4243 DEFUN (no_neighbor_send_community_type
,
4244 no_neighbor_send_community_type_cmd
,
4245 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
4249 "Send Community attribute to this neighbor\n"
4250 "Send Standard and Extended Community attributes\n"
4251 "Send Standard, Large and Extended Community attributes\n"
4252 "Send Extended Community attributes\n"
4253 "Send Standard Community attributes\n"
4254 "Send Large Community attributes\n")
4258 const char *type
= argv
[argc
- 1]->text
;
4260 if (strmatch(type
, "standard")) {
4261 SET_FLAG(flag
, PEER_FLAG_SEND_COMMUNITY
);
4262 } else if (strmatch(type
, "extended")) {
4263 SET_FLAG(flag
, PEER_FLAG_SEND_EXT_COMMUNITY
);
4264 } else if (strmatch(type
, "large")) {
4265 SET_FLAG(flag
, PEER_FLAG_SEND_LARGE_COMMUNITY
);
4266 } else if (strmatch(type
, "both")) {
4267 SET_FLAG(flag
, PEER_FLAG_SEND_COMMUNITY
);
4268 SET_FLAG(flag
, PEER_FLAG_SEND_EXT_COMMUNITY
);
4269 } else { /* if (strmatch(type, "all")) */
4270 SET_FLAG(flag
, PEER_FLAG_SEND_COMMUNITY
);
4271 SET_FLAG(flag
, PEER_FLAG_SEND_EXT_COMMUNITY
);
4272 SET_FLAG(flag
, PEER_FLAG_SEND_LARGE_COMMUNITY
);
4275 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4276 bgp_node_afi(vty
), bgp_node_safi(vty
),
4281 no_neighbor_send_community_type
,
4282 no_neighbor_send_community_type_hidden_cmd
,
4283 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
4284 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4285 "Send Community attribute to this neighbor\n"
4286 "Send Standard and Extended Community attributes\n"
4287 "Send Standard, Large and Extended Community attributes\n"
4288 "Send Extended Community attributes\n"
4289 "Send Standard Community attributes\n"
4290 "Send Large Community attributes\n")
4292 /* neighbor soft-reconfig. */
4293 DEFUN (neighbor_soft_reconfiguration
,
4294 neighbor_soft_reconfiguration_cmd
,
4295 "neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
4298 "Per neighbor soft reconfiguration\n"
4299 "Allow inbound soft reconfiguration for this neighbor\n")
4302 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4304 PEER_FLAG_SOFT_RECONFIG
);
4307 ALIAS_HIDDEN(neighbor_soft_reconfiguration
,
4308 neighbor_soft_reconfiguration_hidden_cmd
,
4309 "neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
4310 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4311 "Per neighbor soft reconfiguration\n"
4312 "Allow inbound soft reconfiguration for this neighbor\n")
4314 DEFUN (no_neighbor_soft_reconfiguration
,
4315 no_neighbor_soft_reconfiguration_cmd
,
4316 "no neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
4320 "Per neighbor soft reconfiguration\n"
4321 "Allow inbound soft reconfiguration for this neighbor\n")
4324 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4325 bgp_node_afi(vty
), bgp_node_safi(vty
),
4326 PEER_FLAG_SOFT_RECONFIG
);
4329 ALIAS_HIDDEN(no_neighbor_soft_reconfiguration
,
4330 no_neighbor_soft_reconfiguration_hidden_cmd
,
4331 "no neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
4332 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4333 "Per neighbor soft reconfiguration\n"
4334 "Allow inbound soft reconfiguration for this neighbor\n")
4336 DEFUN (neighbor_route_reflector_client
,
4337 neighbor_route_reflector_client_cmd
,
4338 "neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
4341 "Configure a neighbor as Route Reflector client\n")
4347 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
4349 return CMD_WARNING_CONFIG_FAILED
;
4351 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4353 PEER_FLAG_REFLECTOR_CLIENT
);
4356 ALIAS_HIDDEN(neighbor_route_reflector_client
,
4357 neighbor_route_reflector_client_hidden_cmd
,
4358 "neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
4359 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4360 "Configure a neighbor as Route Reflector client\n")
4362 DEFUN (no_neighbor_route_reflector_client
,
4363 no_neighbor_route_reflector_client_cmd
,
4364 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
4368 "Configure a neighbor as Route Reflector client\n")
4371 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4372 bgp_node_afi(vty
), bgp_node_safi(vty
),
4373 PEER_FLAG_REFLECTOR_CLIENT
);
4376 ALIAS_HIDDEN(no_neighbor_route_reflector_client
,
4377 no_neighbor_route_reflector_client_hidden_cmd
,
4378 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
4379 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4380 "Configure a neighbor as Route Reflector client\n")
4382 /* neighbor route-server-client. */
4383 DEFUN (neighbor_route_server_client
,
4384 neighbor_route_server_client_cmd
,
4385 "neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
4388 "Configure a neighbor as Route Server client\n")
4393 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
4395 return CMD_WARNING_CONFIG_FAILED
;
4396 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4398 PEER_FLAG_RSERVER_CLIENT
);
4401 ALIAS_HIDDEN(neighbor_route_server_client
,
4402 neighbor_route_server_client_hidden_cmd
,
4403 "neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
4404 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4405 "Configure a neighbor as Route Server client\n")
4407 DEFUN (no_neighbor_route_server_client
,
4408 no_neighbor_route_server_client_cmd
,
4409 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
4413 "Configure a neighbor as Route Server client\n")
4416 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4417 bgp_node_afi(vty
), bgp_node_safi(vty
),
4418 PEER_FLAG_RSERVER_CLIENT
);
4421 ALIAS_HIDDEN(no_neighbor_route_server_client
,
4422 no_neighbor_route_server_client_hidden_cmd
,
4423 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
4424 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4425 "Configure a neighbor as Route Server client\n")
4427 DEFUN (neighbor_nexthop_local_unchanged
,
4428 neighbor_nexthop_local_unchanged_cmd
,
4429 "neighbor <A.B.C.D|X:X::X:X|WORD> nexthop-local unchanged",
4432 "Configure treatment of outgoing link-local nexthop attribute\n"
4433 "Leave link-local nexthop unchanged for this peer\n")
4436 return peer_af_flag_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
4438 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
);
4441 DEFUN (no_neighbor_nexthop_local_unchanged
,
4442 no_neighbor_nexthop_local_unchanged_cmd
,
4443 "no neighbor <A.B.C.D|X:X::X:X|WORD> nexthop-local unchanged",
4447 "Configure treatment of outgoing link-local-nexthop attribute\n"
4448 "Leave link-local nexthop unchanged for this peer\n")
4451 return peer_af_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4452 bgp_node_afi(vty
), bgp_node_safi(vty
),
4453 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
);
4456 DEFUN (neighbor_attr_unchanged
,
4457 neighbor_attr_unchanged_cmd
,
4458 "neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
4461 "BGP attribute is propagated unchanged to this neighbor\n"
4462 "As-path attribute\n"
4463 "Nexthop attribute\n"
4467 char *peer_str
= argv
[1]->arg
;
4470 afi_t afi
= bgp_node_afi(vty
);
4471 safi_t safi
= bgp_node_safi(vty
);
4473 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
4475 return CMD_WARNING_CONFIG_FAILED
;
4477 if (argv_find(argv
, argc
, "as-path", &idx
))
4478 SET_FLAG(flags
, PEER_FLAG_AS_PATH_UNCHANGED
);
4480 if (argv_find(argv
, argc
, "next-hop", &idx
))
4481 SET_FLAG(flags
, PEER_FLAG_NEXTHOP_UNCHANGED
);
4483 if (argv_find(argv
, argc
, "med", &idx
))
4484 SET_FLAG(flags
, PEER_FLAG_MED_UNCHANGED
);
4486 /* no flags means all of them! */
4488 SET_FLAG(flags
, PEER_FLAG_AS_PATH_UNCHANGED
);
4489 SET_FLAG(flags
, PEER_FLAG_NEXTHOP_UNCHANGED
);
4490 SET_FLAG(flags
, PEER_FLAG_MED_UNCHANGED
);
4492 if (!CHECK_FLAG(flags
, PEER_FLAG_AS_PATH_UNCHANGED
)
4493 && peer_af_flag_check(peer
, afi
, safi
,
4494 PEER_FLAG_AS_PATH_UNCHANGED
)) {
4495 peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
4496 PEER_FLAG_AS_PATH_UNCHANGED
);
4499 if (!CHECK_FLAG(flags
, PEER_FLAG_NEXTHOP_UNCHANGED
)
4500 && peer_af_flag_check(peer
, afi
, safi
,
4501 PEER_FLAG_NEXTHOP_UNCHANGED
)) {
4502 peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
4503 PEER_FLAG_NEXTHOP_UNCHANGED
);
4506 if (!CHECK_FLAG(flags
, PEER_FLAG_MED_UNCHANGED
)
4507 && peer_af_flag_check(peer
, afi
, safi
,
4508 PEER_FLAG_MED_UNCHANGED
)) {
4509 peer_af_flag_unset_vty(vty
, peer_str
, afi
, safi
,
4510 PEER_FLAG_MED_UNCHANGED
);
4514 return peer_af_flag_set_vty(vty
, peer_str
, afi
, safi
, flags
);
4518 neighbor_attr_unchanged
, neighbor_attr_unchanged_hidden_cmd
,
4519 "neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
4520 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4521 "BGP attribute is propagated unchanged to this neighbor\n"
4522 "As-path attribute\n"
4523 "Nexthop attribute\n"
4526 DEFUN (no_neighbor_attr_unchanged
,
4527 no_neighbor_attr_unchanged_cmd
,
4528 "no neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
4532 "BGP attribute is propagated unchanged to this neighbor\n"
4533 "As-path attribute\n"
4534 "Nexthop attribute\n"
4538 char *peer
= argv
[2]->arg
;
4541 if (argv_find(argv
, argc
, "as-path", &idx
))
4542 SET_FLAG(flags
, PEER_FLAG_AS_PATH_UNCHANGED
);
4544 if (argv_find(argv
, argc
, "next-hop", &idx
))
4545 SET_FLAG(flags
, PEER_FLAG_NEXTHOP_UNCHANGED
);
4547 if (argv_find(argv
, argc
, "med", &idx
))
4548 SET_FLAG(flags
, PEER_FLAG_MED_UNCHANGED
);
4550 if (!flags
) // no flags means all of them!
4552 SET_FLAG(flags
, PEER_FLAG_AS_PATH_UNCHANGED
);
4553 SET_FLAG(flags
, PEER_FLAG_NEXTHOP_UNCHANGED
);
4554 SET_FLAG(flags
, PEER_FLAG_MED_UNCHANGED
);
4557 return peer_af_flag_unset_vty(vty
, peer
, bgp_node_afi(vty
),
4558 bgp_node_safi(vty
), flags
);
4562 no_neighbor_attr_unchanged
, no_neighbor_attr_unchanged_hidden_cmd
,
4563 "no neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
4564 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4565 "BGP attribute is propagated unchanged to this neighbor\n"
4566 "As-path attribute\n"
4567 "Nexthop attribute\n"
4570 /* EBGP multihop configuration. */
4571 static int peer_ebgp_multihop_set_vty(struct vty
*vty
, const char *ip_str
,
4572 const char *ttl_str
)
4577 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
4579 return CMD_WARNING_CONFIG_FAILED
;
4582 return bgp_vty_return(vty
, BGP_ERR_INVALID_FOR_DIRECT_PEER
);
4587 ttl
= strtoul(ttl_str
, NULL
, 10);
4589 return bgp_vty_return(vty
, peer_ebgp_multihop_set(peer
, ttl
));
4592 static int peer_ebgp_multihop_unset_vty(struct vty
*vty
, const char *ip_str
)
4596 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
4598 return CMD_WARNING_CONFIG_FAILED
;
4600 return bgp_vty_return(vty
, peer_ebgp_multihop_unset(peer
));
4603 /* neighbor ebgp-multihop. */
4604 DEFUN (neighbor_ebgp_multihop
,
4605 neighbor_ebgp_multihop_cmd
,
4606 "neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop",
4609 "Allow EBGP neighbors not on directly connected networks\n")
4612 return peer_ebgp_multihop_set_vty(vty
, argv
[idx_peer
]->arg
, NULL
);
4615 DEFUN (neighbor_ebgp_multihop_ttl
,
4616 neighbor_ebgp_multihop_ttl_cmd
,
4617 "neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop (1-255)",
4620 "Allow EBGP neighbors not on directly connected networks\n"
4621 "maximum hop count\n")
4625 return peer_ebgp_multihop_set_vty(vty
, argv
[idx_peer
]->arg
,
4626 argv
[idx_number
]->arg
);
4629 DEFUN (no_neighbor_ebgp_multihop
,
4630 no_neighbor_ebgp_multihop_cmd
,
4631 "no neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop [(1-255)]",
4635 "Allow EBGP neighbors not on directly connected networks\n"
4636 "maximum hop count\n")
4639 return peer_ebgp_multihop_unset_vty(vty
, argv
[idx_peer
]->arg
);
4643 /* disable-connected-check */
4644 DEFUN (neighbor_disable_connected_check
,
4645 neighbor_disable_connected_check_cmd
,
4646 "neighbor <A.B.C.D|X:X::X:X|WORD> <disable-connected-check|enforce-multihop>",
4649 "one-hop away EBGP peer using loopback address\n"
4650 "Enforce EBGP neighbors perform multihop\n")
4653 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
4654 PEER_FLAG_DISABLE_CONNECTED_CHECK
);
4657 DEFUN (no_neighbor_disable_connected_check
,
4658 no_neighbor_disable_connected_check_cmd
,
4659 "no neighbor <A.B.C.D|X:X::X:X|WORD> <disable-connected-check|enforce-multihop>",
4663 "one-hop away EBGP peer using loopback address\n"
4664 "Enforce EBGP neighbors perform multihop\n")
4667 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4668 PEER_FLAG_DISABLE_CONNECTED_CHECK
);
4672 /* enforce-first-as */
4673 DEFUN (neighbor_enforce_first_as
,
4674 neighbor_enforce_first_as_cmd
,
4675 "neighbor <A.B.C.D|X:X::X:X|WORD> enforce-first-as",
4678 "Enforce the first AS for EBGP routes\n")
4682 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
4683 PEER_FLAG_ENFORCE_FIRST_AS
);
4686 DEFUN (no_neighbor_enforce_first_as
,
4687 no_neighbor_enforce_first_as_cmd
,
4688 "no neighbor <A.B.C.D|X:X::X:X|WORD> enforce-first-as",
4692 "Enforce the first AS for EBGP routes\n")
4696 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
4697 PEER_FLAG_ENFORCE_FIRST_AS
);
4701 DEFUN (neighbor_description
,
4702 neighbor_description_cmd
,
4703 "neighbor <A.B.C.D|X:X::X:X|WORD> description LINE...",
4706 "Neighbor specific description\n"
4707 "Up to 80 characters describing this neighbor\n")
4714 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
4716 return CMD_WARNING_CONFIG_FAILED
;
4718 str
= argv_concat(argv
, argc
, idx_line
);
4720 peer_description_set(peer
, str
);
4722 XFREE(MTYPE_TMP
, str
);
4727 DEFUN (no_neighbor_description
,
4728 no_neighbor_description_cmd
,
4729 "no neighbor <A.B.C.D|X:X::X:X|WORD> description",
4733 "Neighbor specific description\n")
4738 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
4740 return CMD_WARNING_CONFIG_FAILED
;
4742 peer_description_unset(peer
);
4747 ALIAS(no_neighbor_description
, no_neighbor_description_comment_cmd
,
4748 "no neighbor <A.B.C.D|X:X::X:X|WORD> description LINE...",
4749 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4750 "Neighbor specific description\n"
4751 "Up to 80 characters describing this neighbor\n")
4753 /* Neighbor update-source. */
4754 static int peer_update_source_vty(struct vty
*vty
, const char *peer_str
,
4755 const char *source_str
)
4761 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
4763 return CMD_WARNING_CONFIG_FAILED
;
4769 if (str2sockunion(source_str
, &su
) == 0)
4770 peer_update_source_addr_set(peer
, &su
);
4772 if (str2prefix(source_str
, &p
)) {
4774 "%% Invalid update-source, remove prefix length \n");
4775 return CMD_WARNING_CONFIG_FAILED
;
4777 peer_update_source_if_set(peer
, source_str
);
4780 peer_update_source_unset(peer
);
4785 #define BGP_UPDATE_SOURCE_HELP_STR \
4788 "Interface name (requires zebra to be running)\n"
4790 DEFUN (neighbor_update_source
,
4791 neighbor_update_source_cmd
,
4792 "neighbor <A.B.C.D|X:X::X:X|WORD> update-source <A.B.C.D|X:X::X:X|WORD>",
4795 "Source of routing updates\n"
4796 BGP_UPDATE_SOURCE_HELP_STR
)
4800 return peer_update_source_vty(vty
, argv
[idx_peer
]->arg
,
4801 argv
[idx_peer_2
]->arg
);
4804 DEFUN (no_neighbor_update_source
,
4805 no_neighbor_update_source_cmd
,
4806 "no neighbor <A.B.C.D|X:X::X:X|WORD> update-source [<A.B.C.D|X:X::X:X|WORD>]",
4810 "Source of routing updates\n"
4811 BGP_UPDATE_SOURCE_HELP_STR
)
4814 return peer_update_source_vty(vty
, argv
[idx_peer
]->arg
, NULL
);
4817 static int peer_default_originate_set_vty(struct vty
*vty
, const char *peer_str
,
4818 afi_t afi
, safi_t safi
,
4819 const char *rmap
, int set
)
4823 struct route_map
*route_map
= NULL
;
4825 peer
= peer_and_group_lookup_vty(vty
, peer_str
);
4827 return CMD_WARNING_CONFIG_FAILED
;
4831 route_map
= route_map_lookup_warn_noexist(vty
, rmap
);
4832 ret
= peer_default_originate_set(peer
, afi
, safi
,
4835 ret
= peer_default_originate_unset(peer
, afi
, safi
);
4837 return bgp_vty_return(vty
, ret
);
4840 /* neighbor default-originate. */
4841 DEFUN (neighbor_default_originate
,
4842 neighbor_default_originate_cmd
,
4843 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate",
4846 "Originate default route to this neighbor\n")
4849 return peer_default_originate_set_vty(vty
, argv
[idx_peer
]->arg
,
4851 bgp_node_safi(vty
), NULL
, 1);
4854 ALIAS_HIDDEN(neighbor_default_originate
, neighbor_default_originate_hidden_cmd
,
4855 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate",
4856 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4857 "Originate default route to this neighbor\n")
4859 DEFUN (neighbor_default_originate_rmap
,
4860 neighbor_default_originate_rmap_cmd
,
4861 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate route-map WORD",
4864 "Originate default route to this neighbor\n"
4865 "Route-map to specify criteria to originate default\n"
4870 return peer_default_originate_set_vty(
4871 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
4872 argv
[idx_word
]->arg
, 1);
4876 neighbor_default_originate_rmap
,
4877 neighbor_default_originate_rmap_hidden_cmd
,
4878 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate route-map WORD",
4879 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4880 "Originate default route to this neighbor\n"
4881 "Route-map to specify criteria to originate default\n"
4884 DEFUN (no_neighbor_default_originate
,
4885 no_neighbor_default_originate_cmd
,
4886 "no neighbor <A.B.C.D|X:X::X:X|WORD> default-originate [route-map WORD]",
4890 "Originate default route to this neighbor\n"
4891 "Route-map to specify criteria to originate default\n"
4895 return peer_default_originate_set_vty(vty
, argv
[idx_peer
]->arg
,
4897 bgp_node_safi(vty
), NULL
, 0);
4901 no_neighbor_default_originate
, no_neighbor_default_originate_hidden_cmd
,
4902 "no neighbor <A.B.C.D|X:X::X:X|WORD> default-originate [route-map WORD]",
4903 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4904 "Originate default route to this neighbor\n"
4905 "Route-map to specify criteria to originate default\n"
4909 /* Set neighbor's BGP port. */
4910 static int peer_port_vty(struct vty
*vty
, const char *ip_str
, int afi
,
4911 const char *port_str
)
4917 peer
= peer_lookup_vty(vty
, ip_str
);
4919 return CMD_WARNING_CONFIG_FAILED
;
4922 sp
= getservbyname("bgp", "tcp");
4923 port
= (sp
== NULL
) ? BGP_PORT_DEFAULT
: ntohs(sp
->s_port
);
4925 port
= strtoul(port_str
, NULL
, 10);
4928 peer_port_set(peer
, port
);
4933 /* Set specified peer's BGP port. */
4934 DEFUN (neighbor_port
,
4936 "neighbor <A.B.C.D|X:X::X:X> port (0-65535)",
4939 "Neighbor's BGP port\n"
4940 "TCP port number\n")
4944 return peer_port_vty(vty
, argv
[idx_ip
]->arg
, AFI_IP
,
4945 argv
[idx_number
]->arg
);
4948 DEFUN (no_neighbor_port
,
4949 no_neighbor_port_cmd
,
4950 "no neighbor <A.B.C.D|X:X::X:X> port [(0-65535)]",
4954 "Neighbor's BGP port\n"
4955 "TCP port number\n")
4958 return peer_port_vty(vty
, argv
[idx_ip
]->arg
, AFI_IP
, NULL
);
4962 /* neighbor weight. */
4963 static int peer_weight_set_vty(struct vty
*vty
, const char *ip_str
, afi_t afi
,
4964 safi_t safi
, const char *weight_str
)
4968 unsigned long weight
;
4970 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
4972 return CMD_WARNING_CONFIG_FAILED
;
4974 weight
= strtoul(weight_str
, NULL
, 10);
4976 ret
= peer_weight_set(peer
, afi
, safi
, weight
);
4977 return bgp_vty_return(vty
, ret
);
4980 static int peer_weight_unset_vty(struct vty
*vty
, const char *ip_str
, afi_t afi
,
4986 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
4988 return CMD_WARNING_CONFIG_FAILED
;
4990 ret
= peer_weight_unset(peer
, afi
, safi
);
4991 return bgp_vty_return(vty
, ret
);
4994 DEFUN (neighbor_weight
,
4995 neighbor_weight_cmd
,
4996 "neighbor <A.B.C.D|X:X::X:X|WORD> weight (0-65535)",
4999 "Set default weight for routes from this neighbor\n"
5004 return peer_weight_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
5005 bgp_node_safi(vty
), argv
[idx_number
]->arg
);
5008 ALIAS_HIDDEN(neighbor_weight
, neighbor_weight_hidden_cmd
,
5009 "neighbor <A.B.C.D|X:X::X:X|WORD> weight (0-65535)",
5010 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5011 "Set default weight for routes from this neighbor\n"
5014 DEFUN (no_neighbor_weight
,
5015 no_neighbor_weight_cmd
,
5016 "no neighbor <A.B.C.D|X:X::X:X|WORD> weight [(0-65535)]",
5020 "Set default weight for routes from this neighbor\n"
5024 return peer_weight_unset_vty(vty
, argv
[idx_peer
]->arg
,
5025 bgp_node_afi(vty
), bgp_node_safi(vty
));
5028 ALIAS_HIDDEN(no_neighbor_weight
, no_neighbor_weight_hidden_cmd
,
5029 "no neighbor <A.B.C.D|X:X::X:X|WORD> weight [(0-65535)]",
5030 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5031 "Set default weight for routes from this neighbor\n"
5035 /* Override capability negotiation. */
5036 DEFUN (neighbor_override_capability
,
5037 neighbor_override_capability_cmd
,
5038 "neighbor <A.B.C.D|X:X::X:X|WORD> override-capability",
5041 "Override capability negotiation result\n")
5044 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
5045 PEER_FLAG_OVERRIDE_CAPABILITY
);
5048 DEFUN (no_neighbor_override_capability
,
5049 no_neighbor_override_capability_cmd
,
5050 "no neighbor <A.B.C.D|X:X::X:X|WORD> override-capability",
5054 "Override capability negotiation result\n")
5057 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
5058 PEER_FLAG_OVERRIDE_CAPABILITY
);
5061 DEFUN (neighbor_strict_capability
,
5062 neighbor_strict_capability_cmd
,
5063 "neighbor <A.B.C.D|X:X::X:X|WORD> strict-capability-match",
5066 "Strict capability negotiation match\n")
5070 return peer_flag_set_vty(vty
, argv
[idx_peer
]->arg
,
5071 PEER_FLAG_STRICT_CAP_MATCH
);
5074 DEFUN (no_neighbor_strict_capability
,
5075 no_neighbor_strict_capability_cmd
,
5076 "no neighbor <A.B.C.D|X:X::X:X|WORD> strict-capability-match",
5080 "Strict capability negotiation match\n")
5084 return peer_flag_unset_vty(vty
, argv
[idx_peer
]->arg
,
5085 PEER_FLAG_STRICT_CAP_MATCH
);
5088 static int peer_timers_set_vty(struct vty
*vty
, const char *ip_str
,
5089 const char *keep_str
, const char *hold_str
)
5096 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5098 return CMD_WARNING_CONFIG_FAILED
;
5100 keepalive
= strtoul(keep_str
, NULL
, 10);
5101 holdtime
= strtoul(hold_str
, NULL
, 10);
5103 ret
= peer_timers_set(peer
, keepalive
, holdtime
);
5105 return bgp_vty_return(vty
, ret
);
5108 static int peer_timers_unset_vty(struct vty
*vty
, const char *ip_str
)
5113 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5115 return CMD_WARNING_CONFIG_FAILED
;
5117 ret
= peer_timers_unset(peer
);
5119 return bgp_vty_return(vty
, ret
);
5122 DEFUN (neighbor_timers
,
5123 neighbor_timers_cmd
,
5124 "neighbor <A.B.C.D|X:X::X:X|WORD> timers (0-65535) (0-65535)",
5127 "BGP per neighbor timers\n"
5128 "Keepalive interval\n"
5133 int idx_number_2
= 4;
5134 return peer_timers_set_vty(vty
, argv
[idx_peer
]->arg
,
5135 argv
[idx_number
]->arg
,
5136 argv
[idx_number_2
]->arg
);
5139 DEFUN (no_neighbor_timers
,
5140 no_neighbor_timers_cmd
,
5141 "no neighbor <A.B.C.D|X:X::X:X|WORD> timers [(0-65535) (0-65535)]",
5145 "BGP per neighbor timers\n"
5146 "Keepalive interval\n"
5150 return peer_timers_unset_vty(vty
, argv
[idx_peer
]->arg
);
5154 static int peer_timers_connect_set_vty(struct vty
*vty
, const char *ip_str
,
5155 const char *time_str
)
5161 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5163 return CMD_WARNING_CONFIG_FAILED
;
5165 connect
= strtoul(time_str
, NULL
, 10);
5167 ret
= peer_timers_connect_set(peer
, connect
);
5169 return bgp_vty_return(vty
, ret
);
5172 static int peer_timers_connect_unset_vty(struct vty
*vty
, const char *ip_str
)
5177 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5179 return CMD_WARNING_CONFIG_FAILED
;
5181 ret
= peer_timers_connect_unset(peer
);
5183 return bgp_vty_return(vty
, ret
);
5186 DEFUN (neighbor_timers_connect
,
5187 neighbor_timers_connect_cmd
,
5188 "neighbor <A.B.C.D|X:X::X:X|WORD> timers connect (1-65535)",
5191 "BGP per neighbor timers\n"
5192 "BGP connect timer\n"
5197 return peer_timers_connect_set_vty(vty
, argv
[idx_peer
]->arg
,
5198 argv
[idx_number
]->arg
);
5201 DEFUN (no_neighbor_timers_connect
,
5202 no_neighbor_timers_connect_cmd
,
5203 "no neighbor <A.B.C.D|X:X::X:X|WORD> timers connect [(1-65535)]",
5207 "BGP per neighbor timers\n"
5208 "BGP connect timer\n"
5212 return peer_timers_connect_unset_vty(vty
, argv
[idx_peer
]->arg
);
5216 static int peer_advertise_interval_vty(struct vty
*vty
, const char *ip_str
,
5217 const char *time_str
, int set
)
5221 uint32_t routeadv
= 0;
5223 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5225 return CMD_WARNING_CONFIG_FAILED
;
5228 routeadv
= strtoul(time_str
, NULL
, 10);
5231 ret
= peer_advertise_interval_set(peer
, routeadv
);
5233 ret
= peer_advertise_interval_unset(peer
);
5235 return bgp_vty_return(vty
, ret
);
5238 DEFUN (neighbor_advertise_interval
,
5239 neighbor_advertise_interval_cmd
,
5240 "neighbor <A.B.C.D|X:X::X:X|WORD> advertisement-interval (0-600)",
5243 "Minimum interval between sending BGP routing updates\n"
5244 "time in seconds\n")
5248 return peer_advertise_interval_vty(vty
, argv
[idx_peer
]->arg
,
5249 argv
[idx_number
]->arg
, 1);
5252 DEFUN (no_neighbor_advertise_interval
,
5253 no_neighbor_advertise_interval_cmd
,
5254 "no neighbor <A.B.C.D|X:X::X:X|WORD> advertisement-interval [(0-600)]",
5258 "Minimum interval between sending BGP routing updates\n"
5259 "time in seconds\n")
5262 return peer_advertise_interval_vty(vty
, argv
[idx_peer
]->arg
, NULL
, 0);
5266 /* Time to wait before processing route-map updates */
5267 DEFUN (bgp_set_route_map_delay_timer
,
5268 bgp_set_route_map_delay_timer_cmd
,
5269 "bgp route-map delay-timer (0-600)",
5271 "BGP route-map delay timer\n"
5272 "Time in secs to wait before processing route-map changes\n"
5273 "0 disables the timer, no route updates happen when route-maps change\n")
5276 uint32_t rmap_delay_timer
;
5278 if (argv
[idx_number
]->arg
) {
5279 rmap_delay_timer
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
5280 bm
->rmap_update_timer
= rmap_delay_timer
;
5282 /* if the dynamic update handling is being disabled, and a timer
5284 * running, stop the timer and act as if the timer has already
5287 if (!rmap_delay_timer
&& bm
->t_rmap_update
) {
5288 BGP_TIMER_OFF(bm
->t_rmap_update
);
5289 thread_execute(bm
->master
, bgp_route_map_update_timer
,
5294 vty_out(vty
, "%% BGP invalid route-map delay-timer\n");
5295 return CMD_WARNING_CONFIG_FAILED
;
5299 DEFUN (no_bgp_set_route_map_delay_timer
,
5300 no_bgp_set_route_map_delay_timer_cmd
,
5301 "no bgp route-map delay-timer [(0-600)]",
5304 "Default BGP route-map delay timer\n"
5305 "Reset to default time to wait for processing route-map changes\n"
5306 "0 disables the timer, no route updates happen when route-maps change\n")
5309 bm
->rmap_update_timer
= RMAP_DEFAULT_UPDATE_TIMER
;
5315 /* neighbor interface */
5316 static int peer_interface_vty(struct vty
*vty
, const char *ip_str
,
5321 peer
= peer_lookup_vty(vty
, ip_str
);
5322 if (!peer
|| peer
->conf_if
) {
5323 vty_out(vty
, "%% BGP invalid peer %s\n", ip_str
);
5324 return CMD_WARNING_CONFIG_FAILED
;
5328 peer_interface_set(peer
, str
);
5330 peer_interface_unset(peer
);
5335 DEFUN (neighbor_interface
,
5336 neighbor_interface_cmd
,
5337 "neighbor <A.B.C.D|X:X::X:X> interface WORD",
5345 return peer_interface_vty(vty
, argv
[idx_ip
]->arg
, argv
[idx_word
]->arg
);
5348 DEFUN (no_neighbor_interface
,
5349 no_neighbor_interface_cmd
,
5350 "no neighbor <A.B.C.D|X:X::X:X|WORD> interface WORD",
5358 return peer_interface_vty(vty
, argv
[idx_peer
]->arg
, NULL
);
5361 DEFUN (neighbor_distribute_list
,
5362 neighbor_distribute_list_cmd
,
5363 "neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list <(1-199)|(1300-2699)|WORD> <in|out>",
5366 "Filter updates to/from this neighbor\n"
5367 "IP access-list number\n"
5368 "IP access-list number (expanded range)\n"
5369 "IP Access-list name\n"
5370 "Filter incoming updates\n"
5371 "Filter outgoing updates\n")
5378 const char *pstr
= argv
[idx_peer
]->arg
;
5379 const char *acl
= argv
[idx_acl
]->arg
;
5380 const char *inout
= argv
[argc
- 1]->text
;
5382 peer
= peer_and_group_lookup_vty(vty
, pstr
);
5384 return CMD_WARNING_CONFIG_FAILED
;
5386 /* Check filter direction. */
5387 direct
= strmatch(inout
, "in") ? FILTER_IN
: FILTER_OUT
;
5388 ret
= peer_distribute_set(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5391 return bgp_vty_return(vty
, ret
);
5395 neighbor_distribute_list
, neighbor_distribute_list_hidden_cmd
,
5396 "neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list <(1-199)|(1300-2699)|WORD> <in|out>",
5397 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5398 "Filter updates to/from this neighbor\n"
5399 "IP access-list number\n"
5400 "IP access-list number (expanded range)\n"
5401 "IP Access-list name\n"
5402 "Filter incoming updates\n"
5403 "Filter outgoing updates\n")
5405 DEFUN (no_neighbor_distribute_list
,
5406 no_neighbor_distribute_list_cmd
,
5407 "no neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list <(1-199)|(1300-2699)|WORD> <in|out>",
5411 "Filter updates to/from this neighbor\n"
5412 "IP access-list number\n"
5413 "IP access-list number (expanded range)\n"
5414 "IP Access-list name\n"
5415 "Filter incoming updates\n"
5416 "Filter outgoing updates\n")
5422 const char *pstr
= argv
[idx_peer
]->arg
;
5423 const char *inout
= argv
[argc
- 1]->text
;
5425 peer
= peer_and_group_lookup_vty(vty
, pstr
);
5427 return CMD_WARNING_CONFIG_FAILED
;
5429 /* Check filter direction. */
5430 direct
= strmatch(inout
, "in") ? FILTER_IN
: FILTER_OUT
;
5431 ret
= peer_distribute_unset(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5434 return bgp_vty_return(vty
, ret
);
5438 no_neighbor_distribute_list
, no_neighbor_distribute_list_hidden_cmd
,
5439 "no neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list <(1-199)|(1300-2699)|WORD> <in|out>",
5440 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5441 "Filter updates to/from this neighbor\n"
5442 "IP access-list number\n"
5443 "IP access-list number (expanded range)\n"
5444 "IP Access-list name\n"
5445 "Filter incoming updates\n"
5446 "Filter outgoing updates\n")
5448 /* Set prefix list to the peer. */
5449 static int peer_prefix_list_set_vty(struct vty
*vty
, const char *ip_str
,
5450 afi_t afi
, safi_t safi
,
5451 const char *name_str
,
5452 const char *direct_str
)
5455 int direct
= FILTER_IN
;
5458 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5460 return CMD_WARNING_CONFIG_FAILED
;
5462 /* Check filter direction. */
5463 if (strncmp(direct_str
, "i", 1) == 0)
5465 else if (strncmp(direct_str
, "o", 1) == 0)
5466 direct
= FILTER_OUT
;
5468 ret
= peer_prefix_list_set(peer
, afi
, safi
, direct
, name_str
);
5470 return bgp_vty_return(vty
, ret
);
5473 static int peer_prefix_list_unset_vty(struct vty
*vty
, const char *ip_str
,
5474 afi_t afi
, safi_t safi
,
5475 const char *direct_str
)
5479 int direct
= FILTER_IN
;
5481 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5483 return CMD_WARNING_CONFIG_FAILED
;
5485 /* Check filter direction. */
5486 if (strncmp(direct_str
, "i", 1) == 0)
5488 else if (strncmp(direct_str
, "o", 1) == 0)
5489 direct
= FILTER_OUT
;
5491 ret
= peer_prefix_list_unset(peer
, afi
, safi
, direct
);
5493 return bgp_vty_return(vty
, ret
);
5496 DEFUN (neighbor_prefix_list
,
5497 neighbor_prefix_list_cmd
,
5498 "neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
5501 "Filter updates to/from this neighbor\n"
5502 "Name of a prefix list\n"
5503 "Filter incoming updates\n"
5504 "Filter outgoing updates\n")
5509 return peer_prefix_list_set_vty(
5510 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5511 argv
[idx_word
]->arg
, argv
[idx_in_out
]->arg
);
5514 ALIAS_HIDDEN(neighbor_prefix_list
, neighbor_prefix_list_hidden_cmd
,
5515 "neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
5516 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5517 "Filter updates to/from this neighbor\n"
5518 "Name of a prefix list\n"
5519 "Filter incoming updates\n"
5520 "Filter outgoing updates\n")
5522 DEFUN (no_neighbor_prefix_list
,
5523 no_neighbor_prefix_list_cmd
,
5524 "no neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
5528 "Filter updates to/from this neighbor\n"
5529 "Name of a prefix list\n"
5530 "Filter incoming updates\n"
5531 "Filter outgoing updates\n")
5535 return peer_prefix_list_unset_vty(vty
, argv
[idx_peer
]->arg
,
5536 bgp_node_afi(vty
), bgp_node_safi(vty
),
5537 argv
[idx_in_out
]->arg
);
5540 ALIAS_HIDDEN(no_neighbor_prefix_list
, no_neighbor_prefix_list_hidden_cmd
,
5541 "no neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
5542 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5543 "Filter updates to/from this neighbor\n"
5544 "Name of a prefix list\n"
5545 "Filter incoming updates\n"
5546 "Filter outgoing updates\n")
5548 static int peer_aslist_set_vty(struct vty
*vty
, const char *ip_str
, afi_t afi
,
5549 safi_t safi
, const char *name_str
,
5550 const char *direct_str
)
5554 int direct
= FILTER_IN
;
5556 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5558 return CMD_WARNING_CONFIG_FAILED
;
5560 /* Check filter direction. */
5561 if (strncmp(direct_str
, "i", 1) == 0)
5563 else if (strncmp(direct_str
, "o", 1) == 0)
5564 direct
= FILTER_OUT
;
5566 ret
= peer_aslist_set(peer
, afi
, safi
, direct
, name_str
);
5568 return bgp_vty_return(vty
, ret
);
5571 static int peer_aslist_unset_vty(struct vty
*vty
, const char *ip_str
, afi_t afi
,
5572 safi_t safi
, const char *direct_str
)
5576 int direct
= FILTER_IN
;
5578 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5580 return CMD_WARNING_CONFIG_FAILED
;
5582 /* Check filter direction. */
5583 if (strncmp(direct_str
, "i", 1) == 0)
5585 else if (strncmp(direct_str
, "o", 1) == 0)
5586 direct
= FILTER_OUT
;
5588 ret
= peer_aslist_unset(peer
, afi
, safi
, direct
);
5590 return bgp_vty_return(vty
, ret
);
5593 DEFUN (neighbor_filter_list
,
5594 neighbor_filter_list_cmd
,
5595 "neighbor <A.B.C.D|X:X::X:X|WORD> filter-list WORD <in|out>",
5598 "Establish BGP filters\n"
5599 "AS path access-list name\n"
5600 "Filter incoming routes\n"
5601 "Filter outgoing routes\n")
5606 return peer_aslist_set_vty(vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
),
5607 bgp_node_safi(vty
), argv
[idx_word
]->arg
,
5608 argv
[idx_in_out
]->arg
);
5611 ALIAS_HIDDEN(neighbor_filter_list
, neighbor_filter_list_hidden_cmd
,
5612 "neighbor <A.B.C.D|X:X::X:X|WORD> filter-list WORD <in|out>",
5613 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5614 "Establish BGP filters\n"
5615 "AS path access-list name\n"
5616 "Filter incoming routes\n"
5617 "Filter outgoing routes\n")
5619 DEFUN (no_neighbor_filter_list
,
5620 no_neighbor_filter_list_cmd
,
5621 "no neighbor <A.B.C.D|X:X::X:X|WORD> filter-list WORD <in|out>",
5625 "Establish BGP filters\n"
5626 "AS path access-list name\n"
5627 "Filter incoming routes\n"
5628 "Filter outgoing routes\n")
5632 return peer_aslist_unset_vty(vty
, argv
[idx_peer
]->arg
,
5633 bgp_node_afi(vty
), bgp_node_safi(vty
),
5634 argv
[idx_in_out
]->arg
);
5637 ALIAS_HIDDEN(no_neighbor_filter_list
, no_neighbor_filter_list_hidden_cmd
,
5638 "no neighbor <A.B.C.D|X:X::X:X|WORD> filter-list WORD <in|out>",
5639 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5640 "Establish BGP filters\n"
5641 "AS path access-list name\n"
5642 "Filter incoming routes\n"
5643 "Filter outgoing routes\n")
5645 /* Set route-map to the peer. */
5646 static int peer_route_map_set_vty(struct vty
*vty
, const char *ip_str
,
5647 afi_t afi
, safi_t safi
, const char *name_str
,
5648 const char *direct_str
)
5652 int direct
= RMAP_IN
;
5653 struct route_map
*route_map
;
5655 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5657 return CMD_WARNING_CONFIG_FAILED
;
5659 /* Check filter direction. */
5660 if (strncmp(direct_str
, "in", 2) == 0)
5662 else if (strncmp(direct_str
, "o", 1) == 0)
5665 route_map
= route_map_lookup_warn_noexist(vty
, name_str
);
5666 ret
= peer_route_map_set(peer
, afi
, safi
, direct
, name_str
, route_map
);
5668 return bgp_vty_return(vty
, ret
);
5671 static int peer_route_map_unset_vty(struct vty
*vty
, const char *ip_str
,
5672 afi_t afi
, safi_t safi
,
5673 const char *direct_str
)
5677 int direct
= RMAP_IN
;
5679 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5681 return CMD_WARNING_CONFIG_FAILED
;
5683 /* Check filter direction. */
5684 if (strncmp(direct_str
, "in", 2) == 0)
5686 else if (strncmp(direct_str
, "o", 1) == 0)
5689 ret
= peer_route_map_unset(peer
, afi
, safi
, direct
);
5691 return bgp_vty_return(vty
, ret
);
5694 DEFUN (neighbor_route_map
,
5695 neighbor_route_map_cmd
,
5696 "neighbor <A.B.C.D|X:X::X:X|WORD> route-map WORD <in|out>",
5699 "Apply route map to neighbor\n"
5700 "Name of route map\n"
5701 "Apply map to incoming routes\n"
5702 "Apply map to outbound routes\n")
5707 return peer_route_map_set_vty(
5708 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5709 argv
[idx_word
]->arg
, argv
[idx_in_out
]->arg
);
5712 ALIAS_HIDDEN(neighbor_route_map
, neighbor_route_map_hidden_cmd
,
5713 "neighbor <A.B.C.D|X:X::X:X|WORD> route-map WORD <in|out>",
5714 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5715 "Apply route map to neighbor\n"
5716 "Name of route map\n"
5717 "Apply map to incoming routes\n"
5718 "Apply map to outbound routes\n")
5720 DEFUN (no_neighbor_route_map
,
5721 no_neighbor_route_map_cmd
,
5722 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-map WORD <in|out>",
5726 "Apply route map to neighbor\n"
5727 "Name of route map\n"
5728 "Apply map to incoming routes\n"
5729 "Apply map to outbound routes\n")
5733 return peer_route_map_unset_vty(vty
, argv
[idx_peer
]->arg
,
5734 bgp_node_afi(vty
), bgp_node_safi(vty
),
5735 argv
[idx_in_out
]->arg
);
5738 ALIAS_HIDDEN(no_neighbor_route_map
, no_neighbor_route_map_hidden_cmd
,
5739 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-map WORD <in|out>",
5740 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5741 "Apply route map to neighbor\n"
5742 "Name of route map\n"
5743 "Apply map to incoming routes\n"
5744 "Apply map to outbound routes\n")
5746 /* Set unsuppress-map to the peer. */
5747 static int peer_unsuppress_map_set_vty(struct vty
*vty
, const char *ip_str
,
5748 afi_t afi
, safi_t safi
,
5749 const char *name_str
)
5753 struct route_map
*route_map
;
5755 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5757 return CMD_WARNING_CONFIG_FAILED
;
5759 route_map
= route_map_lookup_warn_noexist(vty
, name_str
);
5760 ret
= peer_unsuppress_map_set(peer
, afi
, safi
, name_str
, route_map
);
5762 return bgp_vty_return(vty
, ret
);
5765 /* Unset route-map from the peer. */
5766 static int peer_unsuppress_map_unset_vty(struct vty
*vty
, const char *ip_str
,
5767 afi_t afi
, safi_t safi
)
5772 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5774 return CMD_WARNING_CONFIG_FAILED
;
5776 ret
= peer_unsuppress_map_unset(peer
, afi
, safi
);
5778 return bgp_vty_return(vty
, ret
);
5781 DEFUN (neighbor_unsuppress_map
,
5782 neighbor_unsuppress_map_cmd
,
5783 "neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
5786 "Route-map to selectively unsuppress suppressed routes\n"
5787 "Name of route map\n")
5791 return peer_unsuppress_map_set_vty(
5792 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5793 argv
[idx_word
]->arg
);
5796 ALIAS_HIDDEN(neighbor_unsuppress_map
, neighbor_unsuppress_map_hidden_cmd
,
5797 "neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
5798 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5799 "Route-map to selectively unsuppress suppressed routes\n"
5800 "Name of route map\n")
5802 DEFUN (no_neighbor_unsuppress_map
,
5803 no_neighbor_unsuppress_map_cmd
,
5804 "no neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
5808 "Route-map to selectively unsuppress suppressed routes\n"
5809 "Name of route map\n")
5812 return peer_unsuppress_map_unset_vty(vty
, argv
[idx_peer
]->arg
,
5814 bgp_node_safi(vty
));
5817 ALIAS_HIDDEN(no_neighbor_unsuppress_map
, no_neighbor_unsuppress_map_hidden_cmd
,
5818 "no neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
5819 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5820 "Route-map to selectively unsuppress suppressed routes\n"
5821 "Name of route map\n")
5823 static int peer_maximum_prefix_set_vty(struct vty
*vty
, const char *ip_str
,
5824 afi_t afi
, safi_t safi
,
5825 const char *num_str
,
5826 const char *threshold_str
, int warning
,
5827 const char *restart_str
)
5835 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5837 return CMD_WARNING_CONFIG_FAILED
;
5839 max
= strtoul(num_str
, NULL
, 10);
5841 threshold
= atoi(threshold_str
);
5843 threshold
= MAXIMUM_PREFIX_THRESHOLD_DEFAULT
;
5846 restart
= atoi(restart_str
);
5850 ret
= peer_maximum_prefix_set(peer
, afi
, safi
, max
, threshold
, warning
,
5853 return bgp_vty_return(vty
, ret
);
5856 static int peer_maximum_prefix_unset_vty(struct vty
*vty
, const char *ip_str
,
5857 afi_t afi
, safi_t safi
)
5862 peer
= peer_and_group_lookup_vty(vty
, ip_str
);
5864 return CMD_WARNING_CONFIG_FAILED
;
5866 ret
= peer_maximum_prefix_unset(peer
, afi
, safi
);
5868 return bgp_vty_return(vty
, ret
);
5871 /* Maximum number of prefix configuration. prefix count is different
5872 for each peer configuration. So this configuration can be set for
5873 each peer configuration. */
5874 DEFUN (neighbor_maximum_prefix
,
5875 neighbor_maximum_prefix_cmd
,
5876 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295)",
5879 "Maximum number of prefix accept from this peer\n"
5880 "maximum no. of prefix limit\n")
5884 return peer_maximum_prefix_set_vty(
5885 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5886 argv
[idx_number
]->arg
, NULL
, 0, NULL
);
5889 ALIAS_HIDDEN(neighbor_maximum_prefix
, neighbor_maximum_prefix_hidden_cmd
,
5890 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295)",
5891 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5892 "Maximum number of prefix accept from this peer\n"
5893 "maximum no. of prefix limit\n")
5895 DEFUN (neighbor_maximum_prefix_threshold
,
5896 neighbor_maximum_prefix_threshold_cmd
,
5897 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100)",
5900 "Maximum number of prefix accept from this peer\n"
5901 "maximum no. of prefix limit\n"
5902 "Threshold value (%) at which to generate a warning msg\n")
5906 int idx_number_2
= 4;
5907 return peer_maximum_prefix_set_vty(
5908 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5909 argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
, 0, NULL
);
5913 neighbor_maximum_prefix_threshold
,
5914 neighbor_maximum_prefix_threshold_hidden_cmd
,
5915 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100)",
5916 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5917 "Maximum number of prefix accept from this peer\n"
5918 "maximum no. of prefix limit\n"
5919 "Threshold value (%) at which to generate a warning msg\n")
5921 DEFUN (neighbor_maximum_prefix_warning
,
5922 neighbor_maximum_prefix_warning_cmd
,
5923 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) warning-only",
5926 "Maximum number of prefix accept from this peer\n"
5927 "maximum no. of prefix limit\n"
5928 "Only give warning message when limit is exceeded\n")
5932 return peer_maximum_prefix_set_vty(
5933 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5934 argv
[idx_number
]->arg
, NULL
, 1, NULL
);
5938 neighbor_maximum_prefix_warning
,
5939 neighbor_maximum_prefix_warning_hidden_cmd
,
5940 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) warning-only",
5941 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5942 "Maximum number of prefix accept from this peer\n"
5943 "maximum no. of prefix limit\n"
5944 "Only give warning message when limit is exceeded\n")
5946 DEFUN (neighbor_maximum_prefix_threshold_warning
,
5947 neighbor_maximum_prefix_threshold_warning_cmd
,
5948 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) warning-only",
5951 "Maximum number of prefix accept from this peer\n"
5952 "maximum no. of prefix limit\n"
5953 "Threshold value (%) at which to generate a warning msg\n"
5954 "Only give warning message when limit is exceeded\n")
5958 int idx_number_2
= 4;
5959 return peer_maximum_prefix_set_vty(
5960 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5961 argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
, 1, NULL
);
5965 neighbor_maximum_prefix_threshold_warning
,
5966 neighbor_maximum_prefix_threshold_warning_hidden_cmd
,
5967 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) warning-only",
5968 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5969 "Maximum number of prefix accept from this peer\n"
5970 "maximum no. of prefix limit\n"
5971 "Threshold value (%) at which to generate a warning msg\n"
5972 "Only give warning message when limit is exceeded\n")
5974 DEFUN (neighbor_maximum_prefix_restart
,
5975 neighbor_maximum_prefix_restart_cmd
,
5976 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) restart (1-65535)",
5979 "Maximum number of prefix accept from this peer\n"
5980 "maximum no. of prefix limit\n"
5981 "Restart bgp connection after limit is exceeded\n"
5982 "Restart interval in minutes\n")
5986 int idx_number_2
= 5;
5987 return peer_maximum_prefix_set_vty(
5988 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
5989 argv
[idx_number
]->arg
, NULL
, 0, argv
[idx_number_2
]->arg
);
5993 neighbor_maximum_prefix_restart
,
5994 neighbor_maximum_prefix_restart_hidden_cmd
,
5995 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) restart (1-65535)",
5996 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5997 "Maximum number of prefix accept from this peer\n"
5998 "maximum no. of prefix limit\n"
5999 "Restart bgp connection after limit is exceeded\n"
6000 "Restart interval in minutes\n")
6002 DEFUN (neighbor_maximum_prefix_threshold_restart
,
6003 neighbor_maximum_prefix_threshold_restart_cmd
,
6004 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) restart (1-65535)",
6007 "Maximum number of prefixes to accept from this peer\n"
6008 "maximum no. of prefix limit\n"
6009 "Threshold value (%) at which to generate a warning msg\n"
6010 "Restart bgp connection after limit is exceeded\n"
6011 "Restart interval in minutes\n")
6015 int idx_number_2
= 4;
6016 int idx_number_3
= 6;
6017 return peer_maximum_prefix_set_vty(
6018 vty
, argv
[idx_peer
]->arg
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6019 argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
, 0,
6020 argv
[idx_number_3
]->arg
);
6024 neighbor_maximum_prefix_threshold_restart
,
6025 neighbor_maximum_prefix_threshold_restart_hidden_cmd
,
6026 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) restart (1-65535)",
6027 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6028 "Maximum number of prefixes to accept from this peer\n"
6029 "maximum no. of prefix limit\n"
6030 "Threshold value (%) at which to generate a warning msg\n"
6031 "Restart bgp connection after limit is exceeded\n"
6032 "Restart interval in minutes\n")
6034 DEFUN (no_neighbor_maximum_prefix
,
6035 no_neighbor_maximum_prefix_cmd
,
6036 "no neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix [(1-4294967295) [(1-100)] [restart (1-65535)] [warning-only]]",
6040 "Maximum number of prefixes to accept from this peer\n"
6041 "maximum no. of prefix limit\n"
6042 "Threshold value (%) at which to generate a warning msg\n"
6043 "Restart bgp connection after limit is exceeded\n"
6044 "Restart interval in minutes\n"
6045 "Only give warning message when limit is exceeded\n")
6048 return peer_maximum_prefix_unset_vty(vty
, argv
[idx_peer
]->arg
,
6050 bgp_node_safi(vty
));
6054 no_neighbor_maximum_prefix
, no_neighbor_maximum_prefix_hidden_cmd
,
6055 "no neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix [(1-4294967295) [(1-100)] [restart (1-65535)] [warning-only]]",
6056 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6057 "Maximum number of prefixes to accept from this peer\n"
6058 "maximum no. of prefix limit\n"
6059 "Threshold value (%) at which to generate a warning msg\n"
6060 "Restart bgp connection after limit is exceeded\n"
6061 "Restart interval in minutes\n"
6062 "Only give warning message when limit is exceeded\n")
6065 /* "neighbor allowas-in" */
6066 DEFUN (neighbor_allowas_in
,
6067 neighbor_allowas_in_cmd
,
6068 "neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
6071 "Accept as-path with my AS present in it\n"
6072 "Number of occurences of AS number\n"
6073 "Only accept my AS in the as-path if the route was originated in my AS\n")
6076 int idx_number_origin
= 3;
6082 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6084 return CMD_WARNING_CONFIG_FAILED
;
6086 if (argc
<= idx_number_origin
)
6089 if (argv
[idx_number_origin
]->type
== WORD_TKN
)
6092 allow_num
= atoi(argv
[idx_number_origin
]->arg
);
6095 ret
= peer_allowas_in_set(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6098 return bgp_vty_return(vty
, ret
);
6102 neighbor_allowas_in
, neighbor_allowas_in_hidden_cmd
,
6103 "neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
6104 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6105 "Accept as-path with my AS present in it\n"
6106 "Number of occurences of AS number\n"
6107 "Only accept my AS in the as-path if the route was originated in my AS\n")
6109 DEFUN (no_neighbor_allowas_in
,
6110 no_neighbor_allowas_in_cmd
,
6111 "no neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
6115 "allow local ASN appears in aspath attribute\n"
6116 "Number of occurences of AS number\n"
6117 "Only accept my AS in the as-path if the route was originated in my AS\n")
6123 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6125 return CMD_WARNING_CONFIG_FAILED
;
6127 ret
= peer_allowas_in_unset(peer
, bgp_node_afi(vty
),
6128 bgp_node_safi(vty
));
6130 return bgp_vty_return(vty
, ret
);
6134 no_neighbor_allowas_in
, no_neighbor_allowas_in_hidden_cmd
,
6135 "no neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
6136 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6137 "allow local ASN appears in aspath attribute\n"
6138 "Number of occurences of AS number\n"
6139 "Only accept my AS in the as-path if the route was originated in my AS\n")
6141 DEFUN (neighbor_ttl_security
,
6142 neighbor_ttl_security_cmd
,
6143 "neighbor <A.B.C.D|X:X::X:X|WORD> ttl-security hops (1-254)",
6146 "BGP ttl-security parameters\n"
6147 "Specify the maximum number of hops to the BGP peer\n"
6148 "Number of hops to BGP peer\n")
6155 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6157 return CMD_WARNING_CONFIG_FAILED
;
6159 gtsm_hops
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
6162 * If 'neighbor swpX', then this is for directly connected peers,
6163 * we should not accept a ttl-security hops value greater than 1.
6165 if (peer
->conf_if
&& (gtsm_hops
> 1)) {
6167 "%s is directly connected peer, hops cannot exceed 1\n",
6168 argv
[idx_peer
]->arg
);
6169 return CMD_WARNING_CONFIG_FAILED
;
6172 return bgp_vty_return(vty
, peer_ttl_security_hops_set(peer
, gtsm_hops
));
6175 DEFUN (no_neighbor_ttl_security
,
6176 no_neighbor_ttl_security_cmd
,
6177 "no neighbor <A.B.C.D|X:X::X:X|WORD> ttl-security hops (1-254)",
6181 "BGP ttl-security parameters\n"
6182 "Specify the maximum number of hops to the BGP peer\n"
6183 "Number of hops to BGP peer\n")
6188 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6190 return CMD_WARNING_CONFIG_FAILED
;
6192 return bgp_vty_return(vty
, peer_ttl_security_hops_unset(peer
));
6195 DEFUN (neighbor_addpath_tx_all_paths
,
6196 neighbor_addpath_tx_all_paths_cmd
,
6197 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
6200 "Use addpath to advertise all paths to a neighbor\n")
6205 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6207 return CMD_WARNING_CONFIG_FAILED
;
6209 bgp_addpath_set_peer_type(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6214 ALIAS_HIDDEN(neighbor_addpath_tx_all_paths
,
6215 neighbor_addpath_tx_all_paths_hidden_cmd
,
6216 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
6217 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6218 "Use addpath to advertise all paths to a neighbor\n")
6220 DEFUN (no_neighbor_addpath_tx_all_paths
,
6221 no_neighbor_addpath_tx_all_paths_cmd
,
6222 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
6226 "Use addpath to advertise all paths to a neighbor\n")
6231 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6233 return CMD_WARNING_CONFIG_FAILED
;
6235 if (peer
->addpath_type
[bgp_node_afi(vty
)][bgp_node_safi(vty
)]
6236 != BGP_ADDPATH_ALL
) {
6238 "%% Peer not currently configured to transmit all paths.");
6239 return CMD_WARNING_CONFIG_FAILED
;
6242 bgp_addpath_set_peer_type(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6248 ALIAS_HIDDEN(no_neighbor_addpath_tx_all_paths
,
6249 no_neighbor_addpath_tx_all_paths_hidden_cmd
,
6250 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
6251 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6252 "Use addpath to advertise all paths to a neighbor\n")
6254 DEFUN (neighbor_addpath_tx_bestpath_per_as
,
6255 neighbor_addpath_tx_bestpath_per_as_cmd
,
6256 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
6259 "Use addpath to advertise the bestpath per each neighboring AS\n")
6264 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6266 return CMD_WARNING_CONFIG_FAILED
;
6268 bgp_addpath_set_peer_type(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6269 BGP_ADDPATH_BEST_PER_AS
);
6274 ALIAS_HIDDEN(neighbor_addpath_tx_bestpath_per_as
,
6275 neighbor_addpath_tx_bestpath_per_as_hidden_cmd
,
6276 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
6277 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6278 "Use addpath to advertise the bestpath per each neighboring AS\n")
6280 DEFUN (no_neighbor_addpath_tx_bestpath_per_as
,
6281 no_neighbor_addpath_tx_bestpath_per_as_cmd
,
6282 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
6286 "Use addpath to advertise the bestpath per each neighboring AS\n")
6291 peer
= peer_and_group_lookup_vty(vty
, argv
[idx_peer
]->arg
);
6293 return CMD_WARNING_CONFIG_FAILED
;
6295 if (peer
->addpath_type
[bgp_node_afi(vty
)][bgp_node_safi(vty
)]
6296 != BGP_ADDPATH_BEST_PER_AS
) {
6298 "%% Peer not currently configured to transmit all best path per as.");
6299 return CMD_WARNING_CONFIG_FAILED
;
6302 bgp_addpath_set_peer_type(peer
, bgp_node_afi(vty
), bgp_node_safi(vty
),
6308 ALIAS_HIDDEN(no_neighbor_addpath_tx_bestpath_per_as
,
6309 no_neighbor_addpath_tx_bestpath_per_as_hidden_cmd
,
6310 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
6311 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6312 "Use addpath to advertise the bestpath per each neighboring AS\n")
6314 static int set_ecom_list(struct vty
*vty
, int argc
, struct cmd_token
**argv
,
6315 struct ecommunity
**list
)
6317 struct ecommunity
*ecom
= NULL
;
6318 struct ecommunity
*ecomadd
;
6320 for (; argc
; --argc
, ++argv
) {
6322 ecomadd
= ecommunity_str2com(argv
[0]->arg
,
6323 ECOMMUNITY_ROUTE_TARGET
, 0);
6325 vty_out(vty
, "Malformed community-list value\n");
6327 ecommunity_free(&ecom
);
6328 return CMD_WARNING_CONFIG_FAILED
;
6332 ecommunity_merge(ecom
, ecomadd
);
6333 ecommunity_free(&ecomadd
);
6340 ecommunity_free(&*list
);
6348 * v2vimport is true if we are handling a `import vrf ...` command
6350 static afi_t
vpn_policy_getafi(struct vty
*vty
, struct bgp
*bgp
, bool v2vimport
)
6354 switch (vty
->node
) {
6363 "%% context error: valid only in address-family <ipv4|ipv6> unicast block\n");
6368 if (CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
6369 BGP_CONFIG_VRF_TO_VRF_IMPORT
)
6370 || CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
6371 BGP_CONFIG_VRF_TO_VRF_EXPORT
)) {
6373 "%% error: Please unconfigure import vrf commands before using vpn commands\n");
6377 if (CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
6378 BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT
)
6379 || CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
6380 BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT
)) {
6382 "%% error: Please unconfigure vpn to vrf commands before using import vrf commands\n");
6389 DEFPY (af_rd_vpn_export
,
6390 af_rd_vpn_export_cmd
,
6391 "[no] rd vpn export ASN:NN_OR_IP-ADDRESS:NN$rd_str",
6393 "Specify route distinguisher\n"
6394 "Between current address-family and vpn\n"
6395 "For routes leaked from current address-family to vpn\n"
6396 "Route Distinguisher (<as-number>:<number> | <ip-address>:<number>)\n")
6398 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6399 struct prefix_rd prd
;
6405 if (argv_find(argv
, argc
, "no", &idx
))
6409 ret
= str2prefix_rd(rd_str
, &prd
);
6411 vty_out(vty
, "%% Malformed rd\n");
6412 return CMD_WARNING_CONFIG_FAILED
;
6416 afi
= vpn_policy_getafi(vty
, bgp
, false);
6418 return CMD_WARNING_CONFIG_FAILED
;
6421 * pre-change: un-export vpn routes (vpn->vrf routes unaffected)
6423 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6424 bgp_get_default(), bgp
);
6427 bgp
->vpn_policy
[afi
].tovpn_rd
= prd
;
6428 SET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6429 BGP_VPN_POLICY_TOVPN_RD_SET
);
6431 UNSET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6432 BGP_VPN_POLICY_TOVPN_RD_SET
);
6435 /* post-change: re-export vpn routes */
6436 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6437 bgp_get_default(), bgp
);
6442 ALIAS (af_rd_vpn_export
,
6443 af_no_rd_vpn_export_cmd
,
6446 "Specify route distinguisher\n"
6447 "Between current address-family and vpn\n"
6448 "For routes leaked from current address-family to vpn\n")
6450 DEFPY (af_label_vpn_export
,
6451 af_label_vpn_export_cmd
,
6452 "[no] label vpn export <(0-1048575)$label_val|auto$label_auto>",
6454 "label value for VRF\n"
6455 "Between current address-family and vpn\n"
6456 "For routes leaked from current address-family to vpn\n"
6457 "Label Value <0-1048575>\n"
6458 "Automatically assign a label\n")
6460 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6461 mpls_label_t label
= MPLS_LABEL_NONE
;
6466 if (argv_find(argv
, argc
, "no", &idx
))
6469 /* If "no ...", squash trailing parameter */
6475 label
= label_val
; /* parser should force unsigned */
6478 afi
= vpn_policy_getafi(vty
, bgp
, false);
6480 return CMD_WARNING_CONFIG_FAILED
;
6483 if (label_auto
&& CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
6484 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
))
6489 * pre-change: un-export vpn routes (vpn->vrf routes unaffected)
6491 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6492 bgp_get_default(), bgp
);
6494 if (!label_auto
&& CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
6495 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
)) {
6497 if (bgp
->vpn_policy
[afi
].tovpn_label
!= MPLS_LABEL_NONE
) {
6500 * label has previously been automatically
6501 * assigned by labelpool: release it
6503 * NB if tovpn_label == MPLS_LABEL_NONE it
6504 * means the automatic assignment is in flight
6505 * and therefore the labelpool callback must
6506 * detect that the auto label is not needed.
6509 bgp_lp_release(LP_TYPE_VRF
,
6510 &bgp
->vpn_policy
[afi
],
6511 bgp
->vpn_policy
[afi
].tovpn_label
);
6513 UNSET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6514 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
);
6517 bgp
->vpn_policy
[afi
].tovpn_label
= label
;
6519 SET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6520 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
);
6521 bgp_lp_get(LP_TYPE_VRF
, &bgp
->vpn_policy
[afi
],
6522 vpn_leak_label_callback
);
6525 /* post-change: re-export vpn routes */
6526 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6527 bgp_get_default(), bgp
);
6532 ALIAS (af_label_vpn_export
,
6533 af_no_label_vpn_export_cmd
,
6534 "no label vpn export",
6536 "label value for VRF\n"
6537 "Between current address-family and vpn\n"
6538 "For routes leaked from current address-family to vpn\n")
6540 DEFPY (af_nexthop_vpn_export
,
6541 af_nexthop_vpn_export_cmd
,
6542 "[no] nexthop vpn export <A.B.C.D|X:X::X:X>$nexthop_str",
6544 "Specify next hop to use for VRF advertised prefixes\n"
6545 "Between current address-family and vpn\n"
6546 "For routes leaked from current address-family to vpn\n"
6550 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6556 if (argv_find(argv
, argc
, "no", &idx
))
6560 if (!sockunion2hostprefix(nexthop_str
, &p
))
6561 return CMD_WARNING_CONFIG_FAILED
;
6564 afi
= vpn_policy_getafi(vty
, bgp
, false);
6566 return CMD_WARNING_CONFIG_FAILED
;
6569 * pre-change: un-export vpn routes (vpn->vrf routes unaffected)
6571 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6572 bgp_get_default(), bgp
);
6575 bgp
->vpn_policy
[afi
].tovpn_nexthop
= p
;
6576 SET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6577 BGP_VPN_POLICY_TOVPN_NEXTHOP_SET
);
6579 UNSET_FLAG(bgp
->vpn_policy
[afi
].flags
,
6580 BGP_VPN_POLICY_TOVPN_NEXTHOP_SET
);
6583 /* post-change: re-export vpn routes */
6584 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN
, afi
,
6585 bgp_get_default(), bgp
);
6590 ALIAS (af_nexthop_vpn_export
,
6591 af_no_nexthop_vpn_export_cmd
,
6592 "no nexthop vpn export",
6594 "Specify next hop to use for VRF advertised prefixes\n"
6595 "Between current address-family and vpn\n"
6596 "For routes leaked from current address-family to vpn\n")
6598 static int vpn_policy_getdirs(struct vty
*vty
, const char *dstr
, int *dodir
)
6600 if (!strcmp(dstr
, "import")) {
6601 dodir
[BGP_VPN_POLICY_DIR_FROMVPN
] = 1;
6602 } else if (!strcmp(dstr
, "export")) {
6603 dodir
[BGP_VPN_POLICY_DIR_TOVPN
] = 1;
6604 } else if (!strcmp(dstr
, "both")) {
6605 dodir
[BGP_VPN_POLICY_DIR_FROMVPN
] = 1;
6606 dodir
[BGP_VPN_POLICY_DIR_TOVPN
] = 1;
6608 vty_out(vty
, "%% direction parse error\n");
6609 return CMD_WARNING_CONFIG_FAILED
;
6614 DEFPY (af_rt_vpn_imexport
,
6615 af_rt_vpn_imexport_cmd
,
6616 "[no] <rt|route-target> vpn <import|export|both>$direction_str RTLIST...",
6618 "Specify route target list\n"
6619 "Specify route target list\n"
6620 "Between current address-family and vpn\n"
6621 "For routes leaked from vpn to current address-family: match any\n"
6622 "For routes leaked from current address-family to vpn: set\n"
6623 "both import: match any and export: set\n"
6624 "Space separated route target list (A.B.C.D:MN|EF:OPQR|GHJK:MN)\n")
6626 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6628 struct ecommunity
*ecom
= NULL
;
6629 int dodir
[BGP_VPN_POLICY_DIR_MAX
] = {0};
6630 vpn_policy_direction_t dir
;
6635 if (argv_find(argv
, argc
, "no", &idx
))
6638 afi
= vpn_policy_getafi(vty
, bgp
, false);
6640 return CMD_WARNING_CONFIG_FAILED
;
6642 ret
= vpn_policy_getdirs(vty
, direction_str
, dodir
);
6643 if (ret
!= CMD_SUCCESS
)
6647 if (!argv_find(argv
, argc
, "RTLIST", &idx
)) {
6648 vty_out(vty
, "%% Missing RTLIST\n");
6649 return CMD_WARNING_CONFIG_FAILED
;
6651 ret
= set_ecom_list(vty
, argc
- idx
, argv
+ idx
, &ecom
);
6652 if (ret
!= CMD_SUCCESS
) {
6657 for (dir
= 0; dir
< BGP_VPN_POLICY_DIR_MAX
; ++dir
) {
6661 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
6664 if (bgp
->vpn_policy
[afi
].rtlist
[dir
])
6666 &bgp
->vpn_policy
[afi
].rtlist
[dir
]);
6667 bgp
->vpn_policy
[afi
].rtlist
[dir
] =
6668 ecommunity_dup(ecom
);
6670 if (bgp
->vpn_policy
[afi
].rtlist
[dir
])
6672 &bgp
->vpn_policy
[afi
].rtlist
[dir
]);
6673 bgp
->vpn_policy
[afi
].rtlist
[dir
] = NULL
;
6676 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
6680 ecommunity_free(&ecom
);
6685 ALIAS (af_rt_vpn_imexport
,
6686 af_no_rt_vpn_imexport_cmd
,
6687 "no <rt|route-target> vpn <import|export|both>$direction_str",
6689 "Specify route target list\n"
6690 "Specify route target list\n"
6691 "Between current address-family and vpn\n"
6692 "For routes leaked from vpn to current address-family\n"
6693 "For routes leaked from current address-family to vpn\n"
6694 "both import and export\n")
6696 DEFPY (af_route_map_vpn_imexport
,
6697 af_route_map_vpn_imexport_cmd
,
6698 /* future: "route-map <vpn|evpn|vrf NAME> <import|export> RMAP" */
6699 "[no] route-map vpn <import|export>$direction_str RMAP$rmap_str",
6701 "Specify route map\n"
6702 "Between current address-family and vpn\n"
6703 "For routes leaked from vpn to current address-family\n"
6704 "For routes leaked from current address-family to vpn\n"
6705 "name of route-map\n")
6707 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6709 int dodir
[BGP_VPN_POLICY_DIR_MAX
] = {0};
6710 vpn_policy_direction_t dir
;
6715 if (argv_find(argv
, argc
, "no", &idx
))
6718 afi
= vpn_policy_getafi(vty
, bgp
, false);
6720 return CMD_WARNING_CONFIG_FAILED
;
6722 ret
= vpn_policy_getdirs(vty
, direction_str
, dodir
);
6723 if (ret
!= CMD_SUCCESS
)
6726 for (dir
= 0; dir
< BGP_VPN_POLICY_DIR_MAX
; ++dir
) {
6730 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
6733 if (bgp
->vpn_policy
[afi
].rmap_name
[dir
])
6734 XFREE(MTYPE_ROUTE_MAP_NAME
,
6735 bgp
->vpn_policy
[afi
].rmap_name
[dir
]);
6736 bgp
->vpn_policy
[afi
].rmap_name
[dir
] = XSTRDUP(
6737 MTYPE_ROUTE_MAP_NAME
, rmap_str
);
6738 bgp
->vpn_policy
[afi
].rmap
[dir
] =
6739 route_map_lookup_warn_noexist(vty
, rmap_str
);
6740 if (!bgp
->vpn_policy
[afi
].rmap
[dir
])
6743 if (bgp
->vpn_policy
[afi
].rmap_name
[dir
])
6744 XFREE(MTYPE_ROUTE_MAP_NAME
,
6745 bgp
->vpn_policy
[afi
].rmap_name
[dir
]);
6746 bgp
->vpn_policy
[afi
].rmap_name
[dir
] = NULL
;
6747 bgp
->vpn_policy
[afi
].rmap
[dir
] = NULL
;
6750 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
6756 ALIAS (af_route_map_vpn_imexport
,
6757 af_no_route_map_vpn_imexport_cmd
,
6758 "no route-map vpn <import|export>$direction_str",
6760 "Specify route map\n"
6761 "Between current address-family and vpn\n"
6762 "For routes leaked from vpn to current address-family\n"
6763 "For routes leaked from current address-family to vpn\n")
6765 DEFPY(af_import_vrf_route_map
, af_import_vrf_route_map_cmd
,
6766 "[no] import vrf route-map RMAP$rmap_str",
6768 "Import routes from another VRF\n"
6769 "Vrf routes being filtered\n"
6770 "Specify route map\n"
6771 "name of route-map\n")
6773 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6774 vpn_policy_direction_t dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
6778 struct bgp
*bgp_default
;
6780 if (argv_find(argv
, argc
, "no", &idx
))
6783 afi
= vpn_policy_getafi(vty
, bgp
, true);
6785 return CMD_WARNING_CONFIG_FAILED
;
6787 bgp_default
= bgp_get_default();
6792 /* Auto-create assuming the same AS */
6793 ret
= bgp_get(&bgp_default
, &as
, NULL
,
6794 BGP_INSTANCE_TYPE_DEFAULT
);
6798 "VRF default is not configured as a bgp instance\n");
6803 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
6806 if (bgp
->vpn_policy
[afi
].rmap_name
[dir
])
6807 XFREE(MTYPE_ROUTE_MAP_NAME
,
6808 bgp
->vpn_policy
[afi
].rmap_name
[dir
]);
6809 bgp
->vpn_policy
[afi
].rmap_name
[dir
] =
6810 XSTRDUP(MTYPE_ROUTE_MAP_NAME
, rmap_str
);
6811 bgp
->vpn_policy
[afi
].rmap
[dir
] =
6812 route_map_lookup_warn_noexist(vty
, rmap_str
);
6813 if (!bgp
->vpn_policy
[afi
].rmap
[dir
])
6816 if (bgp
->vpn_policy
[afi
].rmap_name
[dir
])
6817 XFREE(MTYPE_ROUTE_MAP_NAME
,
6818 bgp
->vpn_policy
[afi
].rmap_name
[dir
]);
6819 bgp
->vpn_policy
[afi
].rmap_name
[dir
] = NULL
;
6820 bgp
->vpn_policy
[afi
].rmap
[dir
] = NULL
;
6823 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
6828 ALIAS(af_import_vrf_route_map
, af_no_import_vrf_route_map_cmd
,
6829 "no import vrf route-map",
6831 "Import routes from another VRF\n"
6832 "Vrf routes being filtered\n"
6833 "Specify route map\n")
6835 DEFPY(bgp_imexport_vrf
, bgp_imexport_vrf_cmd
,
6836 "[no] import vrf VIEWVRFNAME$import_name",
6838 "Import routes from another VRF\n"
6839 "VRF to import from\n"
6840 "The name of the VRF\n")
6842 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6843 struct listnode
*node
;
6844 struct bgp
*vrf_bgp
, *bgp_default
;
6847 bool remove
= false;
6850 enum bgp_instance_type bgp_type
= BGP_INSTANCE_TYPE_VRF
;
6854 if (import_name
== NULL
) {
6855 vty_out(vty
, "%% Missing import name\n");
6859 if (argv_find(argv
, argc
, "no", &idx
))
6862 afi
= vpn_policy_getafi(vty
, bgp
, true);
6864 return CMD_WARNING_CONFIG_FAILED
;
6866 safi
= bgp_node_safi(vty
);
6868 if (((BGP_INSTANCE_TYPE_DEFAULT
== bgp
->inst_type
)
6869 && (strcmp(import_name
, VRF_DEFAULT_NAME
) == 0))
6870 || (bgp
->name
&& (strcmp(import_name
, bgp
->name
) == 0))) {
6871 vty_out(vty
, "%% Cannot %s vrf %s into itself\n",
6872 remove
? "unimport" : "import", import_name
);
6876 bgp_default
= bgp_get_default();
6878 /* Auto-create assuming the same AS */
6879 ret
= bgp_get(&bgp_default
, &as
, NULL
,
6880 BGP_INSTANCE_TYPE_DEFAULT
);
6884 "VRF default is not configured as a bgp instance\n");
6889 vrf_bgp
= bgp_lookup_by_name(import_name
);
6891 if (strcmp(import_name
, VRF_DEFAULT_NAME
) == 0)
6892 vrf_bgp
= bgp_default
;
6894 /* Auto-create assuming the same AS */
6895 ret
= bgp_get(&vrf_bgp
, &as
, import_name
, bgp_type
);
6899 "VRF %s is not configured as a bgp instance\n",
6906 vrf_unimport_from_vrf(bgp
, vrf_bgp
, afi
, safi
);
6908 /* Already importing from "import_vrf"? */
6909 for (ALL_LIST_ELEMENTS_RO(bgp
->vpn_policy
[afi
].import_vrf
, node
,
6911 if (strcmp(vname
, import_name
) == 0)
6915 vrf_import_from_vrf(bgp
, vrf_bgp
, afi
, safi
);
6921 /* This command is valid only in a bgp vrf instance or the default instance */
6922 DEFPY (bgp_imexport_vpn
,
6923 bgp_imexport_vpn_cmd
,
6924 "[no] <import|export>$direction_str vpn",
6926 "Import routes to this address-family\n"
6927 "Export routes from this address-family\n"
6928 "to/from default instance VPN RIB\n")
6930 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6937 vpn_policy_direction_t dir
;
6939 if (argv_find(argv
, argc
, "no", &idx
))
6942 if (BGP_INSTANCE_TYPE_VRF
!= bgp
->inst_type
&&
6943 BGP_INSTANCE_TYPE_DEFAULT
!= bgp
->inst_type
) {
6945 vty_out(vty
, "%% import|export vpn valid only for bgp vrf or default instance\n");
6946 return CMD_WARNING_CONFIG_FAILED
;
6949 afi
= bgp_node_afi(vty
);
6950 safi
= bgp_node_safi(vty
);
6951 if ((SAFI_UNICAST
!= safi
) || ((AFI_IP
!= afi
) && (AFI_IP6
!= afi
))) {
6952 vty_out(vty
, "%% import|export vpn valid only for unicast ipv4|ipv6\n");
6953 return CMD_WARNING_CONFIG_FAILED
;
6956 if (!strcmp(direction_str
, "import")) {
6957 flag
= BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT
;
6958 dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
6959 } else if (!strcmp(direction_str
, "export")) {
6960 flag
= BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT
;
6961 dir
= BGP_VPN_POLICY_DIR_TOVPN
;
6963 vty_out(vty
, "%% unknown direction %s\n", direction_str
);
6964 return CMD_WARNING_CONFIG_FAILED
;
6967 previous_state
= CHECK_FLAG(bgp
->af_flags
[afi
][safi
], flag
);
6970 SET_FLAG(bgp
->af_flags
[afi
][safi
], flag
);
6971 if (!previous_state
) {
6972 /* trigger export current vrf */
6973 vpn_leak_postchange(dir
, afi
, bgp_get_default(), bgp
);
6976 if (previous_state
) {
6977 /* trigger un-export current vrf */
6978 vpn_leak_prechange(dir
, afi
, bgp_get_default(), bgp
);
6980 UNSET_FLAG(bgp
->af_flags
[afi
][safi
], flag
);
6986 DEFPY (af_routetarget_import
,
6987 af_routetarget_import_cmd
,
6988 "[no] <rt|route-target> redirect import RTLIST...",
6990 "Specify route target list\n"
6991 "Specify route target list\n"
6992 "Flow-spec redirect type route target\n"
6993 "Import routes to this address-family\n"
6994 "Space separated route target list (A.B.C.D:MN|EF:OPQR|GHJK:MN)\n")
6996 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
6998 struct ecommunity
*ecom
= NULL
;
7003 if (argv_find(argv
, argc
, "no", &idx
))
7006 afi
= vpn_policy_getafi(vty
, bgp
, false);
7008 return CMD_WARNING_CONFIG_FAILED
;
7011 if (!argv_find(argv
, argc
, "RTLIST", &idx
)) {
7012 vty_out(vty
, "%% Missing RTLIST\n");
7013 return CMD_WARNING_CONFIG_FAILED
;
7015 ret
= set_ecom_list(vty
, argc
- idx
, argv
+ idx
, &ecom
);
7016 if (ret
!= CMD_SUCCESS
)
7021 if (bgp
->vpn_policy
[afi
].import_redirect_rtlist
)
7022 ecommunity_free(&bgp
->vpn_policy
[afi
]
7023 .import_redirect_rtlist
);
7024 bgp
->vpn_policy
[afi
].import_redirect_rtlist
=
7025 ecommunity_dup(ecom
);
7027 if (bgp
->vpn_policy
[afi
].import_redirect_rtlist
)
7028 ecommunity_free(&bgp
->vpn_policy
[afi
]
7029 .import_redirect_rtlist
);
7030 bgp
->vpn_policy
[afi
].import_redirect_rtlist
= NULL
;
7034 ecommunity_free(&ecom
);
7039 DEFUN_NOSH (address_family_ipv4_safi
,
7040 address_family_ipv4_safi_cmd
,
7041 "address-family ipv4 [<unicast|multicast|vpn|labeled-unicast|flowspec>]",
7042 "Enter Address Family command mode\n"
7044 BGP_SAFI_WITH_LABEL_HELP_STR
)
7048 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
7049 safi_t safi
= bgp_vty_safi_from_str(argv
[2]->text
);
7050 if (bgp
->inst_type
!= BGP_INSTANCE_TYPE_DEFAULT
7051 && safi
!= SAFI_UNICAST
&& safi
!= SAFI_MULTICAST
7052 && safi
!= SAFI_EVPN
) {
7054 "Only Unicast/Multicast/EVPN SAFIs supported in non-core instances.\n");
7055 return CMD_WARNING_CONFIG_FAILED
;
7057 vty
->node
= bgp_node_type(AFI_IP
, safi
);
7059 vty
->node
= BGP_IPV4_NODE
;
7064 DEFUN_NOSH (address_family_ipv6_safi
,
7065 address_family_ipv6_safi_cmd
,
7066 "address-family ipv6 [<unicast|multicast|vpn|labeled-unicast|flowspec>]",
7067 "Enter Address Family command mode\n"
7069 BGP_SAFI_WITH_LABEL_HELP_STR
)
7072 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
7073 safi_t safi
= bgp_vty_safi_from_str(argv
[2]->text
);
7074 if (bgp
->inst_type
!= BGP_INSTANCE_TYPE_DEFAULT
7075 && safi
!= SAFI_UNICAST
&& safi
!= SAFI_MULTICAST
7076 && safi
!= SAFI_EVPN
) {
7078 "Only Unicast/Multicast/EVPN SAFIs supported in non-core instances.\n");
7079 return CMD_WARNING_CONFIG_FAILED
;
7081 vty
->node
= bgp_node_type(AFI_IP6
, safi
);
7083 vty
->node
= BGP_IPV6_NODE
;
7088 #ifdef KEEP_OLD_VPN_COMMANDS
7089 DEFUN_NOSH (address_family_vpnv4
,
7090 address_family_vpnv4_cmd
,
7091 "address-family vpnv4 [unicast]",
7092 "Enter Address Family command mode\n"
7094 "Address Family modifier\n")
7096 vty
->node
= BGP_VPNV4_NODE
;
7100 DEFUN_NOSH (address_family_vpnv6
,
7101 address_family_vpnv6_cmd
,
7102 "address-family vpnv6 [unicast]",
7103 "Enter Address Family command mode\n"
7105 "Address Family modifier\n")
7107 vty
->node
= BGP_VPNV6_NODE
;
7110 #endif /* KEEP_OLD_VPN_COMMANDS */
7112 DEFUN_NOSH (address_family_evpn
,
7113 address_family_evpn_cmd
,
7114 "address-family l2vpn evpn",
7115 "Enter Address Family command mode\n"
7117 "Address Family modifier\n")
7119 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
7120 vty
->node
= BGP_EVPN_NODE
;
7124 DEFUN_NOSH (exit_address_family
,
7125 exit_address_family_cmd
,
7126 "exit-address-family",
7127 "Exit from Address Family configuration mode\n")
7129 if (vty
->node
== BGP_IPV4_NODE
|| vty
->node
== BGP_IPV4M_NODE
7130 || vty
->node
== BGP_IPV4L_NODE
|| vty
->node
== BGP_VPNV4_NODE
7131 || vty
->node
== BGP_IPV6_NODE
|| vty
->node
== BGP_IPV6M_NODE
7132 || vty
->node
== BGP_IPV6L_NODE
|| vty
->node
== BGP_VPNV6_NODE
7133 || vty
->node
== BGP_EVPN_NODE
7134 || vty
->node
== BGP_FLOWSPECV4_NODE
7135 || vty
->node
== BGP_FLOWSPECV6_NODE
)
7136 vty
->node
= BGP_NODE
;
7140 /* Recalculate bestpath and re-advertise a prefix */
7141 static int bgp_clear_prefix(struct vty
*vty
, const char *view_name
,
7142 const char *ip_str
, afi_t afi
, safi_t safi
,
7143 struct prefix_rd
*prd
)
7146 struct prefix match
;
7147 struct bgp_node
*rn
;
7148 struct bgp_node
*rm
;
7150 struct bgp_table
*table
;
7151 struct bgp_table
*rib
;
7153 /* BGP structure lookup. */
7155 bgp
= bgp_lookup_by_name(view_name
);
7157 vty_out(vty
, "%% Can't find BGP instance %s\n",
7162 bgp
= bgp_get_default();
7164 vty_out(vty
, "%% No BGP process is configured\n");
7169 /* Check IP address argument. */
7170 ret
= str2prefix(ip_str
, &match
);
7172 vty_out(vty
, "%% address is malformed\n");
7176 match
.family
= afi2family(afi
);
7177 rib
= bgp
->rib
[afi
][safi
];
7179 if (safi
== SAFI_MPLS_VPN
) {
7180 for (rn
= bgp_table_top(rib
); rn
; rn
= bgp_route_next(rn
)) {
7181 if (prd
&& memcmp(rn
->p
.u
.val
, prd
->val
, 8) != 0)
7184 table
= bgp_node_get_bgp_table_info(rn
);
7185 if (table
!= NULL
) {
7187 if ((rm
= bgp_node_match(table
, &match
))
7190 == match
.prefixlen
) {
7192 BGP_NODE_USER_CLEAR
);
7193 bgp_process(bgp
, rm
, afi
, safi
);
7195 bgp_unlock_node(rm
);
7200 if ((rn
= bgp_node_match(rib
, &match
)) != NULL
) {
7201 if (rn
->p
.prefixlen
== match
.prefixlen
) {
7202 SET_FLAG(rn
->flags
, BGP_NODE_USER_CLEAR
);
7203 bgp_process(bgp
, rn
, afi
, safi
);
7205 bgp_unlock_node(rn
);
7212 /* one clear bgp command to rule them all */
7213 DEFUN (clear_ip_bgp_all
,
7214 clear_ip_bgp_all_cmd
,
7215 "clear [ip] bgp [<view|vrf> VIEWVRFNAME] [<ipv4|ipv6|l2vpn> [<unicast|multicast|vpn|labeled-unicast|flowspec|evpn>]] <*|A.B.C.D|X:X::X:X|WORD|(1-4294967295)|external|peer-group PGNAME> [<soft [<in|out>]|in [prefix-filter]|out>]",
7219 BGP_INSTANCE_HELP_STR
7222 BGP_SAFI_WITH_LABEL_HELP_STR
7223 "Address Family modifier\n"
7225 "BGP neighbor address to clear\n"
7226 "BGP IPv6 neighbor to clear\n"
7227 "BGP neighbor on interface to clear\n"
7228 "Clear peers with the AS number\n"
7229 "Clear all external peers\n"
7230 "Clear all members of peer-group\n"
7231 "BGP peer-group name\n"
7236 "Push out prefix-list ORF and do inbound soft reconfig\n"
7241 afi_t afi
= AFI_IP6
;
7242 safi_t safi
= SAFI_UNICAST
;
7243 enum clear_sort clr_sort
= clear_peer
;
7244 enum bgp_clear_type clr_type
;
7245 char *clr_arg
= NULL
;
7249 /* clear [ip] bgp */
7250 if (argv_find(argv
, argc
, "ip", &idx
))
7253 /* [<vrf> VIEWVRFNAME] */
7254 if (argv_find(argv
, argc
, "vrf", &idx
)) {
7255 vrf
= argv
[idx
+ 1]->arg
;
7257 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
7259 } else if (argv_find(argv
, argc
, "view", &idx
)) {
7260 /* [<view> VIEWVRFNAME] */
7261 vrf
= argv
[idx
+ 1]->arg
;
7264 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
7265 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
))
7266 argv_find_and_parse_safi(argv
, argc
, &idx
, &safi
);
7268 /* <*|A.B.C.D|X:X::X:X|WORD|(1-4294967295)|external|peer-group PGNAME> */
7269 if (argv_find(argv
, argc
, "*", &idx
)) {
7270 clr_sort
= clear_all
;
7271 } else if (argv_find(argv
, argc
, "A.B.C.D", &idx
)) {
7272 clr_sort
= clear_peer
;
7273 clr_arg
= argv
[idx
]->arg
;
7274 } else if (argv_find(argv
, argc
, "X:X::X:X", &idx
)) {
7275 clr_sort
= clear_peer
;
7276 clr_arg
= argv
[idx
]->arg
;
7277 } else if (argv_find(argv
, argc
, "peer-group", &idx
)) {
7278 clr_sort
= clear_group
;
7280 clr_arg
= argv
[idx
]->arg
;
7281 } else if (argv_find(argv
, argc
, "PGNAME", &idx
)) {
7282 clr_sort
= clear_peer
;
7283 clr_arg
= argv
[idx
]->arg
;
7284 } else if (argv_find(argv
, argc
, "WORD", &idx
)) {
7285 clr_sort
= clear_peer
;
7286 clr_arg
= argv
[idx
]->arg
;
7287 } else if (argv_find(argv
, argc
, "(1-4294967295)", &idx
)) {
7288 clr_sort
= clear_as
;
7289 clr_arg
= argv
[idx
]->arg
;
7290 } else if (argv_find(argv
, argc
, "external", &idx
)) {
7291 clr_sort
= clear_external
;
7294 /* [<soft [<in|out>]|in [prefix-filter]|out>] */
7295 if (argv_find(argv
, argc
, "soft", &idx
)) {
7296 if (argv_find(argv
, argc
, "in", &idx
)
7297 || argv_find(argv
, argc
, "out", &idx
))
7298 clr_type
= strmatch(argv
[idx
]->text
, "in")
7300 : BGP_CLEAR_SOFT_OUT
;
7302 clr_type
= BGP_CLEAR_SOFT_BOTH
;
7303 } else if (argv_find(argv
, argc
, "in", &idx
)) {
7304 clr_type
= argv_find(argv
, argc
, "prefix-filter", &idx
)
7305 ? BGP_CLEAR_SOFT_IN_ORF_PREFIX
7306 : BGP_CLEAR_SOFT_IN
;
7307 } else if (argv_find(argv
, argc
, "out", &idx
)) {
7308 clr_type
= BGP_CLEAR_SOFT_OUT
;
7310 clr_type
= BGP_CLEAR_SOFT_NONE
;
7312 return bgp_clear_vty(vty
, vrf
, afi
, safi
, clr_sort
, clr_type
, clr_arg
);
7315 DEFUN (clear_ip_bgp_prefix
,
7316 clear_ip_bgp_prefix_cmd
,
7317 "clear [ip] bgp [<view|vrf> VIEWVRFNAME] prefix A.B.C.D/M",
7321 BGP_INSTANCE_HELP_STR
7322 "Clear bestpath and re-advertise\n"
7326 char *prefix
= NULL
;
7330 /* [<view|vrf> VIEWVRFNAME] */
7331 if (argv_find(argv
, argc
, "vrf", &idx
)) {
7332 vrf
= argv
[idx
+ 1]->arg
;
7334 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
7336 } else if (argv_find(argv
, argc
, "view", &idx
)) {
7337 /* [<view> VIEWVRFNAME] */
7338 vrf
= argv
[idx
+ 1]->arg
;
7342 prefix
= argv
[argc
- 1]->arg
;
7344 return bgp_clear_prefix(vty
, vrf
, prefix
, AFI_IP
, SAFI_UNICAST
, NULL
);
7347 DEFUN (clear_bgp_ipv6_safi_prefix
,
7348 clear_bgp_ipv6_safi_prefix_cmd
,
7349 "clear [ip] bgp ipv6 "BGP_SAFI_CMD_STR
" prefix X:X::X:X/M",
7355 "Clear bestpath and re-advertise\n"
7359 int idx_ipv6_prefix
= 0;
7360 safi_t safi
= SAFI_UNICAST
;
7361 char *prefix
= argv_find(argv
, argc
, "X:X::X:X/M", &idx_ipv6_prefix
) ?
7362 argv
[idx_ipv6_prefix
]->arg
: NULL
;
7364 argv_find_and_parse_safi(argv
, argc
, &idx_safi
, &safi
);
7365 return bgp_clear_prefix(
7366 vty
, NULL
, prefix
, AFI_IP6
,
7370 DEFUN (clear_bgp_instance_ipv6_safi_prefix
,
7371 clear_bgp_instance_ipv6_safi_prefix_cmd
,
7372 "clear [ip] bgp <view|vrf> VIEWVRFNAME ipv6 "BGP_SAFI_CMD_STR
" prefix X:X::X:X/M",
7376 BGP_INSTANCE_HELP_STR
7379 "Clear bestpath and re-advertise\n"
7383 int idx_vrfview
= 0;
7384 int idx_ipv6_prefix
= 0;
7385 safi_t safi
= SAFI_UNICAST
;
7386 char *prefix
= argv_find(argv
, argc
, "X:X::X:X/M", &idx_ipv6_prefix
) ?
7387 argv
[idx_ipv6_prefix
]->arg
: NULL
;
7388 char *vrfview
= NULL
;
7390 /* [<view|vrf> VIEWVRFNAME] */
7391 if (argv_find(argv
, argc
, "vrf", &idx_vrfview
)) {
7392 vrfview
= argv
[idx_vrfview
+ 1]->arg
;
7393 if (vrfview
&& strmatch(vrfview
, VRF_DEFAULT_NAME
))
7395 } else if (argv_find(argv
, argc
, "view", &idx_vrfview
)) {
7396 /* [<view> VIEWVRFNAME] */
7397 vrfview
= argv
[idx_vrfview
+ 1]->arg
;
7399 argv_find_and_parse_safi(argv
, argc
, &idx_safi
, &safi
);
7401 return bgp_clear_prefix(
7402 vty
, vrfview
, prefix
,
7403 AFI_IP6
, safi
, NULL
);
7406 DEFUN (show_bgp_views
,
7408 "show [ip] bgp views",
7412 "Show the defined BGP views\n")
7414 struct list
*inst
= bm
->bgp
;
7415 struct listnode
*node
;
7418 vty_out(vty
, "Defined BGP views:\n");
7419 for (ALL_LIST_ELEMENTS_RO(inst
, node
, bgp
)) {
7421 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_VRF
)
7423 vty_out(vty
, "\t%s (AS%u)\n", bgp
->name
? bgp
->name
: "(null)",
7430 DEFUN (show_bgp_vrfs
,
7432 "show [ip] bgp vrfs [json]",
7439 char buf
[ETHER_ADDR_STRLEN
];
7440 struct list
*inst
= bm
->bgp
;
7441 struct listnode
*node
;
7443 bool uj
= use_json(argc
, argv
);
7444 json_object
*json
= NULL
;
7445 json_object
*json_vrfs
= NULL
;
7449 json
= json_object_new_object();
7450 json_vrfs
= json_object_new_object();
7453 for (ALL_LIST_ELEMENTS_RO(inst
, node
, bgp
)) {
7454 const char *name
, *type
;
7456 struct listnode
*node2
, *nnode2
;
7457 int peers_cfg
, peers_estb
;
7458 json_object
*json_vrf
= NULL
;
7461 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_VIEW
)
7465 if (!uj
&& count
== 1) {
7467 "%4s %-5s %-16s %9s %10s %-37s\n",
7468 "Type", "Id", "routerId", "#PeersVfg",
7469 "#PeersEstb", "Name");
7470 vty_out(vty
, "%11s %-16s %-21s %-6s\n", " ",
7471 "L3-VNI", "RouterMAC", "Interface");
7474 peers_cfg
= peers_estb
= 0;
7476 json_vrf
= json_object_new_object();
7479 for (ALL_LIST_ELEMENTS(bgp
->peer
, node2
, nnode2
, peer
)) {
7480 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
7483 if (peer
->status
== Established
)
7487 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
) {
7488 name
= VRF_DEFAULT_NAME
;
7497 int64_t vrf_id_ui
= (bgp
->vrf_id
== VRF_UNKNOWN
)
7499 : (int64_t)bgp
->vrf_id
;
7500 json_object_string_add(json_vrf
, "type", type
);
7501 json_object_int_add(json_vrf
, "vrfId", vrf_id_ui
);
7502 json_object_string_add(json_vrf
, "routerId",
7503 inet_ntoa(bgp
->router_id
));
7504 json_object_int_add(json_vrf
, "numConfiguredPeers",
7506 json_object_int_add(json_vrf
, "numEstablishedPeers",
7509 json_object_int_add(json_vrf
, "l3vni", bgp
->l3vni
);
7510 json_object_string_add(
7512 prefix_mac2str(&bgp
->rmac
, buf
, sizeof(buf
)));
7513 json_object_string_add(json_vrf
, "interface",
7514 ifindex2ifname(bgp
->l3vni_svi_ifindex
,
7516 json_object_object_add(json_vrfs
, name
, json_vrf
);
7519 "%4s %-5d %-16s %-9u %-10u %-37s\n",
7521 bgp
->vrf_id
== VRF_UNKNOWN
? -1
7523 inet_ntoa(bgp
->router_id
), peers_cfg
,
7525 vty_out(vty
,"%11s %-16u %-21s %-20s\n", " ",
7527 prefix_mac2str(&bgp
->rmac
, buf
, sizeof(buf
)),
7528 ifindex2ifname(bgp
->l3vni_svi_ifindex
,
7534 json_object_object_add(json
, "vrfs", json_vrfs
);
7536 json_object_int_add(json
, "totalVrfs", count
);
7538 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
7539 json
, JSON_C_TO_STRING_PRETTY
));
7540 json_object_free(json
);
7544 "\nTotal number of VRFs (including default): %d\n",
7551 DEFUN (show_bgp_mac_hash
,
7552 show_bgp_mac_hash_cmd
,
7553 "show bgp mac hash",
7557 "Mac Address database\n")
7559 bgp_mac_dump_table(vty
);
7564 static void show_tip_entry(struct hash_bucket
*bucket
, void *args
)
7566 struct vty
*vty
= (struct vty
*)args
;
7567 struct tip_addr
*tip
= (struct tip_addr
*)bucket
->data
;
7569 vty_out(vty
, "addr: %s, count: %d\n", inet_ntoa(tip
->addr
),
7573 static void bgp_show_martian_nexthops(struct vty
*vty
, struct bgp
*bgp
)
7575 vty_out(vty
, "self nexthop database:\n");
7576 bgp_nexthop_show_address_hash(vty
, bgp
);
7578 vty_out(vty
, "Tunnel-ip database:\n");
7579 hash_iterate(bgp
->tip_hash
,
7580 (void (*)(struct hash_bucket
*, void *))show_tip_entry
,
7584 DEFUN(show_bgp_martian_nexthop_db
, show_bgp_martian_nexthop_db_cmd
,
7585 "show bgp [<view|vrf> VIEWVRFNAME] martian next-hop",
7586 SHOW_STR BGP_STR BGP_INSTANCE_HELP_STR
7587 "martian next-hops\n"
7588 "martian next-hop database\n")
7590 struct bgp
*bgp
= NULL
;
7594 /* [<vrf> VIEWVRFNAME] */
7595 if (argv_find(argv
, argc
, "vrf", &idx
)) {
7596 name
= argv
[idx
+ 1]->arg
;
7597 if (name
&& strmatch(name
, VRF_DEFAULT_NAME
))
7599 } else if (argv_find(argv
, argc
, "view", &idx
))
7600 /* [<view> VIEWVRFNAME] */
7601 name
= argv
[idx
+ 1]->arg
;
7603 bgp
= bgp_lookup_by_name(name
);
7605 bgp
= bgp_get_default();
7608 vty_out(vty
, "%% No BGP process is configured\n");
7611 bgp_show_martian_nexthops(vty
, bgp
);
7616 DEFUN (show_bgp_memory
,
7617 show_bgp_memory_cmd
,
7618 "show [ip] bgp memory",
7622 "Global BGP memory statistics\n")
7624 char memstrbuf
[MTYPE_MEMSTR_LEN
];
7625 unsigned long count
;
7627 /* RIB related usage stats */
7628 count
= mtype_stats_alloc(MTYPE_BGP_NODE
);
7629 vty_out(vty
, "%ld RIB nodes, using %s of memory\n", count
,
7630 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7631 count
* sizeof(struct bgp_node
)));
7633 count
= mtype_stats_alloc(MTYPE_BGP_ROUTE
);
7634 vty_out(vty
, "%ld BGP routes, using %s of memory\n", count
,
7635 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7636 count
* sizeof(struct bgp_path_info
)));
7637 if ((count
= mtype_stats_alloc(MTYPE_BGP_ROUTE_EXTRA
)))
7638 vty_out(vty
, "%ld BGP route ancillaries, using %s of memory\n",
7641 memstrbuf
, sizeof(memstrbuf
),
7642 count
* sizeof(struct bgp_path_info_extra
)));
7644 if ((count
= mtype_stats_alloc(MTYPE_BGP_STATIC
)))
7645 vty_out(vty
, "%ld Static routes, using %s of memory\n", count
,
7646 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7647 count
* sizeof(struct bgp_static
)));
7649 if ((count
= mtype_stats_alloc(MTYPE_BGP_PACKET
)))
7650 vty_out(vty
, "%ld Packets, using %s of memory\n", count
,
7651 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7652 count
* sizeof(struct bpacket
)));
7655 if ((count
= mtype_stats_alloc(MTYPE_BGP_ADJ_IN
)))
7656 vty_out(vty
, "%ld Adj-In entries, using %s of memory\n", count
,
7657 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7658 count
* sizeof(struct bgp_adj_in
)));
7659 if ((count
= mtype_stats_alloc(MTYPE_BGP_ADJ_OUT
)))
7660 vty_out(vty
, "%ld Adj-Out entries, using %s of memory\n", count
,
7661 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7662 count
* sizeof(struct bgp_adj_out
)));
7664 if ((count
= mtype_stats_alloc(MTYPE_BGP_NEXTHOP_CACHE
)))
7665 vty_out(vty
, "%ld Nexthop cache entries, using %s of memory\n",
7667 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7668 count
* sizeof(struct bgp_nexthop_cache
)));
7670 if ((count
= mtype_stats_alloc(MTYPE_BGP_DAMP_INFO
)))
7671 vty_out(vty
, "%ld Dampening entries, using %s of memory\n",
7673 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7674 count
* sizeof(struct bgp_damp_info
)));
7677 count
= attr_count();
7678 vty_out(vty
, "%ld BGP attributes, using %s of memory\n", count
,
7679 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7680 count
* sizeof(struct attr
)));
7682 if ((count
= attr_unknown_count()))
7683 vty_out(vty
, "%ld unknown attributes\n", count
);
7685 /* AS_PATH attributes */
7686 count
= aspath_count();
7687 vty_out(vty
, "%ld BGP AS-PATH entries, using %s of memory\n", count
,
7688 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7689 count
* sizeof(struct aspath
)));
7691 count
= mtype_stats_alloc(MTYPE_AS_SEG
);
7692 vty_out(vty
, "%ld BGP AS-PATH segments, using %s of memory\n", count
,
7693 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7694 count
* sizeof(struct assegment
)));
7696 /* Other attributes */
7697 if ((count
= community_count()))
7698 vty_out(vty
, "%ld BGP community entries, using %s of memory\n",
7699 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7700 count
* sizeof(struct community
)));
7701 if ((count
= mtype_stats_alloc(MTYPE_ECOMMUNITY
)))
7702 vty_out(vty
, "%ld BGP community entries, using %s of memory\n",
7703 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7704 count
* sizeof(struct ecommunity
)));
7705 if ((count
= mtype_stats_alloc(MTYPE_LCOMMUNITY
)))
7707 "%ld BGP large-community entries, using %s of memory\n",
7708 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7709 count
* sizeof(struct lcommunity
)));
7711 if ((count
= mtype_stats_alloc(MTYPE_CLUSTER
)))
7712 vty_out(vty
, "%ld Cluster lists, using %s of memory\n", count
,
7713 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7714 count
* sizeof(struct cluster_list
)));
7716 /* Peer related usage */
7717 count
= mtype_stats_alloc(MTYPE_BGP_PEER
);
7718 vty_out(vty
, "%ld peers, using %s of memory\n", count
,
7719 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7720 count
* sizeof(struct peer
)));
7722 if ((count
= mtype_stats_alloc(MTYPE_PEER_GROUP
)))
7723 vty_out(vty
, "%ld peer groups, using %s of memory\n", count
,
7724 mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7725 count
* sizeof(struct peer_group
)));
7728 if ((count
= mtype_stats_alloc(MTYPE_BGP_REGEXP
)))
7729 vty_out(vty
, "%ld compiled regexes, using %s of memory\n",
7730 count
, mtype_memstr(memstrbuf
, sizeof(memstrbuf
),
7731 count
* sizeof(regex_t
)));
7735 static void bgp_show_bestpath_json(struct bgp
*bgp
, json_object
*json
)
7737 json_object
*bestpath
= json_object_new_object();
7739 if (bgp_flag_check(bgp
, BGP_FLAG_ASPATH_IGNORE
))
7740 json_object_string_add(bestpath
, "asPath", "ignore");
7742 if (bgp_flag_check(bgp
, BGP_FLAG_ASPATH_CONFED
))
7743 json_object_string_add(bestpath
, "asPath", "confed");
7745 if (bgp_flag_check(bgp
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
)) {
7746 if (bgp_flag_check(bgp
, BGP_FLAG_MULTIPATH_RELAX_AS_SET
))
7747 json_object_string_add(bestpath
, "multiPathRelax",
7750 json_object_string_add(bestpath
, "multiPathRelax",
7753 json_object_string_add(bestpath
, "multiPathRelax", "false");
7755 if (bgp_flag_check(bgp
, BGP_FLAG_COMPARE_ROUTER_ID
))
7756 json_object_string_add(bestpath
, "compareRouterId", "true");
7757 if (bgp_flag_check(bgp
, BGP_FLAG_MED_CONFED
)
7758 || bgp_flag_check(bgp
, BGP_FLAG_MED_MISSING_AS_WORST
)) {
7759 if (bgp_flag_check(bgp
, BGP_FLAG_MED_CONFED
))
7760 json_object_string_add(bestpath
, "med", "confed");
7761 if (bgp_flag_check(bgp
, BGP_FLAG_MED_MISSING_AS_WORST
))
7762 json_object_string_add(bestpath
, "med",
7763 "missing-as-worst");
7765 json_object_string_add(bestpath
, "med", "true");
7768 json_object_object_add(json
, "bestPath", bestpath
);
7771 /* Show BGP peer's summary information. */
7772 static int bgp_show_summary(struct vty
*vty
, struct bgp
*bgp
, int afi
, int safi
,
7773 bool use_json
, json_object
*json
)
7776 struct listnode
*node
, *nnode
;
7777 unsigned int count
= 0, dn_count
= 0;
7778 char timebuf
[BGP_UPTIME_LEN
], dn_flag
[2];
7779 char neighbor_buf
[VTY_BUFSIZ
];
7780 int neighbor_col_default_width
= 16;
7782 int max_neighbor_width
= 0;
7784 json_object
*json_peer
= NULL
;
7785 json_object
*json_peers
= NULL
;
7786 struct peer_af
*paf
;
7788 /* labeled-unicast routes are installed in the unicast table so in order
7790 * display the correct PfxRcd value we must look at SAFI_UNICAST
7792 if (safi
== SAFI_LABELED_UNICAST
)
7793 pfx_rcd_safi
= SAFI_UNICAST
;
7795 pfx_rcd_safi
= safi
;
7799 json
= json_object_new_object();
7801 json_peers
= json_object_new_object();
7803 /* Loop over all neighbors that will be displayed to determine
7805 * characters are needed for the Neighbor column
7807 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
7808 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
7811 if (peer
->afc
[afi
][safi
]) {
7812 memset(dn_flag
, '\0', sizeof(dn_flag
));
7813 if (peer_dynamic_neighbor(peer
))
7817 && bgp_flag_check(bgp
,
7818 BGP_FLAG_SHOW_HOSTNAME
))
7819 sprintf(neighbor_buf
, "%s%s(%s) ",
7820 dn_flag
, peer
->hostname
,
7823 sprintf(neighbor_buf
, "%s%s ", dn_flag
,
7826 len
= strlen(neighbor_buf
);
7828 if (len
> max_neighbor_width
)
7829 max_neighbor_width
= len
;
7833 /* Originally we displayed the Neighbor column as 16
7834 * characters wide so make that the default
7836 if (max_neighbor_width
< neighbor_col_default_width
)
7837 max_neighbor_width
= neighbor_col_default_width
;
7840 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
7841 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
7844 if (!peer
->afc
[afi
][safi
])
7849 char memstrbuf
[MTYPE_MEMSTR_LEN
];
7852 vrf_id_ui
= (bgp
->vrf_id
== VRF_UNKNOWN
)
7854 : (int64_t)bgp
->vrf_id
;
7856 /* Usage summary and header */
7858 json_object_string_add(
7860 inet_ntoa(bgp
->router_id
));
7861 json_object_int_add(json
, "as", bgp
->as
);
7862 json_object_int_add(json
, "vrfId", vrf_id_ui
);
7863 json_object_string_add(
7866 == BGP_INSTANCE_TYPE_DEFAULT
)
7871 "BGP router identifier %s, local AS number %u vrf-id %d",
7872 inet_ntoa(bgp
->router_id
), bgp
->as
,
7873 bgp
->vrf_id
== VRF_UNKNOWN
7875 : (int)bgp
->vrf_id
);
7879 if (bgp_update_delay_configured(bgp
)) {
7881 json_object_int_add(
7882 json
, "updateDelayLimit",
7883 bgp
->v_update_delay
);
7885 if (bgp
->v_update_delay
7886 != bgp
->v_establish_wait
)
7887 json_object_int_add(
7889 "updateDelayEstablishWait",
7890 bgp
->v_establish_wait
);
7892 if (bgp_update_delay_active(bgp
)) {
7893 json_object_string_add(
7895 "updateDelayFirstNeighbor",
7896 bgp
->update_delay_begin_time
);
7897 json_object_boolean_true_add(
7899 "updateDelayInProgress");
7901 if (bgp
->update_delay_over
) {
7902 json_object_string_add(
7904 "updateDelayFirstNeighbor",
7905 bgp
->update_delay_begin_time
);
7906 json_object_string_add(
7908 "updateDelayBestpathResumed",
7909 bgp
->update_delay_end_time
);
7910 json_object_string_add(
7912 "updateDelayZebraUpdateResume",
7913 bgp
->update_delay_zebra_resume_time
);
7914 json_object_string_add(
7916 "updateDelayPeerUpdateResume",
7917 bgp
->update_delay_peers_resume_time
);
7922 "Read-only mode update-delay limit: %d seconds\n",
7923 bgp
->v_update_delay
);
7924 if (bgp
->v_update_delay
7925 != bgp
->v_establish_wait
)
7927 " Establish wait: %d seconds\n",
7928 bgp
->v_establish_wait
);
7930 if (bgp_update_delay_active(bgp
)) {
7932 " First neighbor established: %s\n",
7933 bgp
->update_delay_begin_time
);
7935 " Delay in progress\n");
7937 if (bgp
->update_delay_over
) {
7939 " First neighbor established: %s\n",
7940 bgp
->update_delay_begin_time
);
7942 " Best-paths resumed: %s\n",
7943 bgp
->update_delay_end_time
);
7945 " zebra update resumed: %s\n",
7946 bgp
->update_delay_zebra_resume_time
);
7948 " peers update resumed: %s\n",
7949 bgp
->update_delay_peers_resume_time
);
7956 if (bgp_maxmed_onstartup_configured(bgp
)
7957 && bgp
->maxmed_active
)
7958 json_object_boolean_true_add(
7959 json
, "maxMedOnStartup");
7960 if (bgp
->v_maxmed_admin
)
7961 json_object_boolean_true_add(
7962 json
, "maxMedAdministrative");
7964 json_object_int_add(
7965 json
, "tableVersion",
7966 bgp_table_version(bgp
->rib
[afi
][safi
]));
7968 ents
= bgp_table_count(bgp
->rib
[afi
][safi
]);
7969 json_object_int_add(json
, "ribCount", ents
);
7970 json_object_int_add(
7972 ents
* sizeof(struct bgp_node
));
7974 ents
= bgp
->af_peer_count
[afi
][safi
];
7975 json_object_int_add(json
, "peerCount", ents
);
7976 json_object_int_add(json
, "peerMemory",
7977 ents
* sizeof(struct peer
));
7979 if ((ents
= listcount(bgp
->group
))) {
7980 json_object_int_add(
7981 json
, "peerGroupCount", ents
);
7982 json_object_int_add(
7983 json
, "peerGroupMemory",
7984 ents
* sizeof(struct
7988 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
7989 BGP_CONFIG_DAMPENING
))
7990 json_object_boolean_true_add(
7991 json
, "dampeningEnabled");
7993 if (bgp_maxmed_onstartup_configured(bgp
)
7994 && bgp
->maxmed_active
)
7996 "Max-med on-startup active\n");
7997 if (bgp
->v_maxmed_admin
)
7999 "Max-med administrative active\n");
8001 vty_out(vty
, "BGP table version %" PRIu64
"\n",
8002 bgp_table_version(bgp
->rib
[afi
][safi
]));
8004 ents
= bgp_table_count(bgp
->rib
[afi
][safi
]);
8006 "RIB entries %ld, using %s of memory\n",
8008 mtype_memstr(memstrbuf
,
8010 ents
* sizeof(struct
8013 /* Peer related usage */
8014 ents
= bgp
->af_peer_count
[afi
][safi
];
8015 vty_out(vty
, "Peers %ld, using %s of memory\n",
8018 memstrbuf
, sizeof(memstrbuf
),
8019 ents
* sizeof(struct peer
)));
8021 if ((ents
= listcount(bgp
->group
)))
8023 "Peer groups %ld, using %s of memory\n",
8028 ents
* sizeof(struct
8031 if (CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
8032 BGP_CONFIG_DAMPENING
))
8033 vty_out(vty
, "Dampening enabled.\n");
8036 /* Subtract 8 here because 'Neighbor' is
8038 vty_out(vty
, "Neighbor");
8039 vty_out(vty
, "%*s", max_neighbor_width
- 8,
8042 "V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd\n");
8049 json_peer
= json_object_new_object();
8051 if (peer_dynamic_neighbor(peer
)) {
8053 json_object_boolean_true_add(json_peer
,
8058 json_object_string_add(json_peer
, "hostname",
8061 if (peer
->domainname
)
8062 json_object_string_add(json_peer
, "domainname",
8065 json_object_int_add(json_peer
, "remoteAs", peer
->as
);
8066 json_object_int_add(json_peer
, "version", 4);
8067 json_object_int_add(json_peer
, "msgRcvd",
8068 PEER_TOTAL_RX(peer
));
8069 json_object_int_add(json_peer
, "msgSent",
8070 PEER_TOTAL_TX(peer
));
8072 json_object_int_add(json_peer
, "tableVersion",
8073 peer
->version
[afi
][safi
]);
8074 json_object_int_add(json_peer
, "outq",
8076 json_object_int_add(json_peer
, "inq", 0);
8077 peer_uptime(peer
->uptime
, timebuf
, BGP_UPTIME_LEN
,
8078 use_json
, json_peer
);
8081 * Adding "pfxRcd" field to match with the corresponding
8082 * CLI. "prefixReceivedCount" will be deprecated in
8085 json_object_int_add(json_peer
, "prefixReceivedCount",
8086 peer
->pcount
[afi
][pfx_rcd_safi
]);
8087 json_object_int_add(json_peer
, "pfxRcd",
8088 peer
->pcount
[afi
][pfx_rcd_safi
]);
8090 paf
= peer_af_find(peer
, afi
, pfx_rcd_safi
);
8091 if (paf
&& PAF_SUBGRP(paf
))
8092 json_object_int_add(json_peer
,
8094 (PAF_SUBGRP(paf
))->scount
);
8096 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_SHUTDOWN
))
8097 json_object_string_add(json_peer
, "state",
8099 else if (peer
->afc_recv
[afi
][safi
])
8100 json_object_string_add(
8102 lookup_msg(bgp_status_msg
, peer
->status
,
8104 else if (CHECK_FLAG(peer
->sflags
,
8105 PEER_STATUS_PREFIX_OVERFLOW
))
8106 json_object_string_add(json_peer
, "state",
8109 json_object_string_add(
8111 lookup_msg(bgp_status_msg
, peer
->status
,
8115 json_object_string_add(json_peer
, "idType",
8117 else if (peer
->su
.sa
.sa_family
== AF_INET
)
8118 json_object_string_add(json_peer
, "idType",
8120 else if (peer
->su
.sa
.sa_family
== AF_INET6
)
8121 json_object_string_add(json_peer
, "idType",
8124 json_object_object_add(json_peers
, peer
->host
,
8127 memset(dn_flag
, '\0', sizeof(dn_flag
));
8128 if (peer_dynamic_neighbor(peer
)) {
8134 && bgp_flag_check(bgp
, BGP_FLAG_SHOW_HOSTNAME
))
8135 len
= vty_out(vty
, "%s%s(%s)", dn_flag
,
8136 peer
->hostname
, peer
->host
);
8138 len
= vty_out(vty
, "%s%s", dn_flag
, peer
->host
);
8140 /* pad the neighbor column with spaces */
8141 if (len
< max_neighbor_width
)
8142 vty_out(vty
, "%*s", max_neighbor_width
- len
,
8145 vty_out(vty
, "4 %10u %7u %7u %8" PRIu64
" %4d %4zd %8s",
8146 peer
->as
, PEER_TOTAL_RX(peer
),
8147 PEER_TOTAL_TX(peer
), peer
->version
[afi
][safi
],
8148 0, peer
->obuf
->count
,
8149 peer_uptime(peer
->uptime
, timebuf
,
8150 BGP_UPTIME_LEN
, 0, NULL
));
8152 if (peer
->status
== Established
)
8153 if (peer
->afc_recv
[afi
][safi
])
8154 vty_out(vty
, " %12ld",
8158 vty_out(vty
, " NoNeg");
8160 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_SHUTDOWN
))
8161 vty_out(vty
, " Idle (Admin)");
8162 else if (CHECK_FLAG(
8164 PEER_STATUS_PREFIX_OVERFLOW
))
8165 vty_out(vty
, " Idle (PfxCt)");
8167 vty_out(vty
, " %12s",
8168 lookup_msg(bgp_status_msg
,
8169 peer
->status
, NULL
));
8176 json_object_object_add(json
, "peers", json_peers
);
8178 json_object_int_add(json
, "totalPeers", count
);
8179 json_object_int_add(json
, "dynamicPeers", dn_count
);
8181 bgp_show_bestpath_json(bgp
, json
);
8183 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
8184 json
, JSON_C_TO_STRING_PRETTY
));
8185 json_object_free(json
);
8188 vty_out(vty
, "\nTotal number of neighbors %d\n", count
);
8190 vty_out(vty
, "No %s neighbor is configured\n",
8191 afi_safi_print(afi
, safi
));
8195 vty_out(vty
, "* - dynamic neighbor\n");
8196 vty_out(vty
, "%d dynamic neighbor(s), limit %d\n",
8197 dn_count
, bgp
->dynamic_neighbors_limit
);
8204 static void bgp_show_summary_afi_safi(struct vty
*vty
, struct bgp
*bgp
, int afi
,
8205 int safi
, bool use_json
,
8209 int afi_wildcard
= (afi
== AFI_MAX
);
8210 int safi_wildcard
= (safi
== SAFI_MAX
);
8211 int is_wildcard
= (afi_wildcard
|| safi_wildcard
);
8212 bool nbr_output
= false;
8214 if (use_json
&& is_wildcard
)
8215 vty_out(vty
, "{\n");
8217 afi
= 1; /* AFI_IP */
8218 while (afi
< AFI_MAX
) {
8220 safi
= 1; /* SAFI_UNICAST */
8221 while (safi
< SAFI_MAX
) {
8222 if (bgp_afi_safi_peer_exists(bgp
, afi
, safi
)) {
8226 * So limit output to those afi/safi
8228 * actualy have something interesting in
8232 json
= json_object_new_object();
8235 vty_out(vty
, ",\n");
8239 vty_out(vty
, "\"%s\":",
8243 vty_out(vty
, "\n%s Summary:\n",
8248 bgp_show_summary(vty
, bgp
, afi
, safi
, use_json
,
8260 if (use_json
&& is_wildcard
)
8261 vty_out(vty
, "}\n");
8262 else if (!nbr_output
) {
8264 vty_out(vty
, "{}\n");
8266 vty_out(vty
, "%% No BGP neighbors found\n");
8270 static void bgp_show_all_instances_summary_vty(struct vty
*vty
, afi_t afi
,
8271 safi_t safi
, bool use_json
)
8273 struct listnode
*node
, *nnode
;
8275 json_object
*json
= NULL
;
8277 bool nbr_output
= false;
8280 vty_out(vty
, "{\n");
8282 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
8285 json
= json_object_new_object();
8288 vty_out(vty
, ",\n");
8292 vty_out(vty
, "\"%s\":",
8293 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
8297 vty_out(vty
, "\nInstance %s:\n",
8298 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
8302 bgp_show_summary_afi_safi(vty
, bgp
, afi
, safi
, use_json
, json
);
8306 vty_out(vty
, "}\n");
8307 else if (!nbr_output
)
8308 vty_out(vty
, "%% BGP instance not found\n");
8311 int bgp_show_summary_vty(struct vty
*vty
, const char *name
, afi_t afi
,
8312 safi_t safi
, bool use_json
)
8317 if (strmatch(name
, "all")) {
8318 bgp_show_all_instances_summary_vty(vty
, afi
, safi
,
8322 bgp
= bgp_lookup_by_name(name
);
8326 vty_out(vty
, "{}\n");
8329 "%% BGP instance not found\n");
8333 bgp_show_summary_afi_safi(vty
, bgp
, afi
, safi
, use_json
,
8339 bgp
= bgp_get_default();
8342 bgp_show_summary_afi_safi(vty
, bgp
, afi
, safi
, use_json
, NULL
);
8345 vty_out(vty
, "{}\n");
8347 vty_out(vty
, "%% BGP instance not found\n");
8354 /* `show [ip] bgp summary' commands. */
8355 DEFUN (show_ip_bgp_summary
,
8356 show_ip_bgp_summary_cmd
,
8357 "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR
" ["BGP_SAFI_WITH_LABEL_CMD_STR
"]] summary [json]",
8361 BGP_INSTANCE_HELP_STR
8363 BGP_SAFI_WITH_LABEL_HELP_STR
8364 "Summary of BGP neighbor status\n"
8368 afi_t afi
= AFI_MAX
;
8369 safi_t safi
= SAFI_MAX
;
8374 if (argv_find(argv
, argc
, "ip", &idx
))
8376 /* [<vrf> VIEWVRFNAME] */
8377 if (argv_find(argv
, argc
, "vrf", &idx
)) {
8378 vrf
= argv
[idx
+ 1]->arg
;
8379 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
8381 } else if (argv_find(argv
, argc
, "view", &idx
))
8382 /* [<view> VIEWVRFNAME] */
8383 vrf
= argv
[idx
+ 1]->arg
;
8384 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
8385 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
)) {
8386 argv_find_and_parse_safi(argv
, argc
, &idx
, &safi
);
8389 bool uj
= use_json(argc
, argv
);
8391 return bgp_show_summary_vty(vty
, vrf
, afi
, safi
, uj
);
8394 const char *afi_safi_print(afi_t afi
, safi_t safi
)
8396 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
8397 return "IPv4 Unicast";
8398 else if (afi
== AFI_IP
&& safi
== SAFI_MULTICAST
)
8399 return "IPv4 Multicast";
8400 else if (afi
== AFI_IP
&& safi
== SAFI_LABELED_UNICAST
)
8401 return "IPv4 Labeled Unicast";
8402 else if (afi
== AFI_IP
&& safi
== SAFI_MPLS_VPN
)
8404 else if (afi
== AFI_IP
&& safi
== SAFI_ENCAP
)
8405 return "IPv4 Encap";
8406 else if (afi
== AFI_IP
&& safi
== SAFI_FLOWSPEC
)
8407 return "IPv4 Flowspec";
8408 else if (afi
== AFI_IP6
&& safi
== SAFI_UNICAST
)
8409 return "IPv6 Unicast";
8410 else if (afi
== AFI_IP6
&& safi
== SAFI_MULTICAST
)
8411 return "IPv6 Multicast";
8412 else if (afi
== AFI_IP6
&& safi
== SAFI_LABELED_UNICAST
)
8413 return "IPv6 Labeled Unicast";
8414 else if (afi
== AFI_IP6
&& safi
== SAFI_MPLS_VPN
)
8416 else if (afi
== AFI_IP6
&& safi
== SAFI_ENCAP
)
8417 return "IPv6 Encap";
8418 else if (afi
== AFI_IP6
&& safi
== SAFI_FLOWSPEC
)
8419 return "IPv6 Flowspec";
8420 else if (afi
== AFI_L2VPN
&& safi
== SAFI_EVPN
)
8421 return "L2VPN EVPN";
8427 * Please note that we have intentionally camelCased
8428 * the return strings here. So if you want
8429 * to use this function, please ensure you
8430 * are doing this within json output
8432 const char *afi_safi_json(afi_t afi
, safi_t safi
)
8434 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
8435 return "ipv4Unicast";
8436 else if (afi
== AFI_IP
&& safi
== SAFI_MULTICAST
)
8437 return "ipv4Multicast";
8438 else if (afi
== AFI_IP
&& safi
== SAFI_LABELED_UNICAST
)
8439 return "ipv4LabeledUnicast";
8440 else if (afi
== AFI_IP
&& safi
== SAFI_MPLS_VPN
)
8442 else if (afi
== AFI_IP
&& safi
== SAFI_ENCAP
)
8444 else if (afi
== AFI_IP
&& safi
== SAFI_FLOWSPEC
)
8445 return "ipv4Flowspec";
8446 else if (afi
== AFI_IP6
&& safi
== SAFI_UNICAST
)
8447 return "ipv6Unicast";
8448 else if (afi
== AFI_IP6
&& safi
== SAFI_MULTICAST
)
8449 return "ipv6Multicast";
8450 else if (afi
== AFI_IP6
&& safi
== SAFI_LABELED_UNICAST
)
8451 return "ipv6LabeledUnicast";
8452 else if (afi
== AFI_IP6
&& safi
== SAFI_MPLS_VPN
)
8454 else if (afi
== AFI_IP6
&& safi
== SAFI_ENCAP
)
8456 else if (afi
== AFI_IP6
&& safi
== SAFI_FLOWSPEC
)
8457 return "ipv6Flowspec";
8458 else if (afi
== AFI_L2VPN
&& safi
== SAFI_EVPN
)
8464 /* Show BGP peer's information. */
8465 enum show_type
{ show_all
, show_peer
, show_ipv4_all
, show_ipv6_all
, show_ipv4_peer
, show_ipv6_peer
};
8467 static void bgp_show_peer_afi_orf_cap(struct vty
*vty
, struct peer
*p
,
8468 afi_t afi
, safi_t safi
,
8469 uint16_t adv_smcap
, uint16_t adv_rmcap
,
8470 uint16_t rcv_smcap
, uint16_t rcv_rmcap
,
8471 bool use_json
, json_object
*json_pref
)
8474 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_smcap
)
8475 || CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_smcap
)) {
8477 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_smcap
)
8478 && CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_smcap
))
8479 json_object_string_add(json_pref
, "sendMode",
8480 "advertisedAndReceived");
8481 else if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_smcap
))
8482 json_object_string_add(json_pref
, "sendMode",
8484 else if (CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_smcap
))
8485 json_object_string_add(json_pref
, "sendMode",
8488 vty_out(vty
, " Send-mode: ");
8489 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_smcap
))
8490 vty_out(vty
, "advertised");
8491 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_smcap
))
8492 vty_out(vty
, "%sreceived",
8493 CHECK_FLAG(p
->af_cap
[afi
][safi
],
8502 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_rmcap
)
8503 || CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_rmcap
)) {
8505 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_rmcap
)
8506 && CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_rmcap
))
8507 json_object_string_add(json_pref
, "recvMode",
8508 "advertisedAndReceived");
8509 else if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_rmcap
))
8510 json_object_string_add(json_pref
, "recvMode",
8512 else if (CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_rmcap
))
8513 json_object_string_add(json_pref
, "recvMode",
8516 vty_out(vty
, " Receive-mode: ");
8517 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], adv_rmcap
))
8518 vty_out(vty
, "advertised");
8519 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], rcv_rmcap
))
8520 vty_out(vty
, "%sreceived",
8521 CHECK_FLAG(p
->af_cap
[afi
][safi
],
8530 static void bgp_show_peer_afi(struct vty
*vty
, struct peer
*p
, afi_t afi
,
8531 safi_t safi
, bool use_json
,
8532 json_object
*json_neigh
)
8534 struct bgp_filter
*filter
;
8535 struct peer_af
*paf
;
8536 char orf_pfx_name
[BUFSIZ
];
8538 json_object
*json_af
= NULL
;
8539 json_object
*json_prefA
= NULL
;
8540 json_object
*json_prefB
= NULL
;
8541 json_object
*json_addr
= NULL
;
8544 json_addr
= json_object_new_object();
8545 json_af
= json_object_new_object();
8546 filter
= &p
->filter
[afi
][safi
];
8548 if (peer_group_active(p
))
8549 json_object_string_add(json_addr
, "peerGroupMember",
8552 paf
= peer_af_find(p
, afi
, safi
);
8553 if (paf
&& PAF_SUBGRP(paf
)) {
8554 json_object_int_add(json_addr
, "updateGroupId",
8555 PAF_UPDGRP(paf
)->id
);
8556 json_object_int_add(json_addr
, "subGroupId",
8557 PAF_SUBGRP(paf
)->id
);
8558 json_object_int_add(json_addr
, "packetQueueLength",
8559 bpacket_queue_virtual_length(paf
));
8562 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
8563 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8564 PEER_CAP_ORF_PREFIX_SM_RCV
)
8565 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8566 PEER_CAP_ORF_PREFIX_RM_ADV
)
8567 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8568 PEER_CAP_ORF_PREFIX_RM_RCV
)) {
8569 json_object_int_add(json_af
, "orfType",
8571 json_prefA
= json_object_new_object();
8572 bgp_show_peer_afi_orf_cap(vty
, p
, afi
, safi
,
8573 PEER_CAP_ORF_PREFIX_SM_ADV
,
8574 PEER_CAP_ORF_PREFIX_RM_ADV
,
8575 PEER_CAP_ORF_PREFIX_SM_RCV
,
8576 PEER_CAP_ORF_PREFIX_RM_RCV
,
8577 use_json
, json_prefA
);
8578 json_object_object_add(json_af
, "orfPrefixList",
8582 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
8583 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8584 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
8585 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8586 PEER_CAP_ORF_PREFIX_RM_ADV
)
8587 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8588 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
)) {
8589 json_object_int_add(json_af
, "orfOldType",
8590 ORF_TYPE_PREFIX_OLD
);
8591 json_prefB
= json_object_new_object();
8592 bgp_show_peer_afi_orf_cap(
8593 vty
, p
, afi
, safi
, PEER_CAP_ORF_PREFIX_SM_ADV
,
8594 PEER_CAP_ORF_PREFIX_RM_ADV
,
8595 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
,
8596 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
, use_json
,
8598 json_object_object_add(json_af
, "orfOldPrefixList",
8602 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
8603 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8604 PEER_CAP_ORF_PREFIX_SM_RCV
)
8605 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8606 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
8607 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8608 PEER_CAP_ORF_PREFIX_RM_ADV
)
8609 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8610 PEER_CAP_ORF_PREFIX_RM_RCV
)
8611 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8612 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
))
8613 json_object_object_add(json_addr
, "afDependentCap",
8616 json_object_free(json_af
);
8618 sprintf(orf_pfx_name
, "%s.%d.%d", p
->host
, afi
, safi
);
8619 orf_pfx_count
= prefix_bgp_show_prefix_list(
8620 NULL
, afi
, orf_pfx_name
, use_json
);
8622 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
8623 PEER_STATUS_ORF_PREFIX_SEND
)
8625 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
8626 PEER_STATUS_ORF_PREFIX_SEND
))
8627 json_object_boolean_true_add(json_neigh
,
8630 json_object_int_add(json_addr
, "orfRecvCounter",
8633 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
8634 PEER_STATUS_ORF_WAIT_REFRESH
))
8635 json_object_string_add(
8636 json_addr
, "orfFirstUpdate",
8637 "deferredUntilORFOrRouteRefreshRecvd");
8639 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8640 PEER_FLAG_REFLECTOR_CLIENT
))
8641 json_object_boolean_true_add(json_addr
,
8642 "routeReflectorClient");
8643 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8644 PEER_FLAG_RSERVER_CLIENT
))
8645 json_object_boolean_true_add(json_addr
,
8646 "routeServerClient");
8647 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
8648 json_object_boolean_true_add(json_addr
,
8649 "inboundSoftConfigPermit");
8651 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8652 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
))
8653 json_object_boolean_true_add(
8655 "privateAsNumsAllReplacedInUpdatesToNbr");
8656 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8657 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
))
8658 json_object_boolean_true_add(
8660 "privateAsNumsReplacedInUpdatesToNbr");
8661 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8662 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
))
8663 json_object_boolean_true_add(
8665 "privateAsNumsAllRemovedInUpdatesToNbr");
8666 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8667 PEER_FLAG_REMOVE_PRIVATE_AS
))
8668 json_object_boolean_true_add(
8670 "privateAsNumsRemovedInUpdatesToNbr");
8672 if (p
->addpath_type
[afi
][safi
] != BGP_ADDPATH_NONE
)
8673 json_object_boolean_true_add(
8675 bgp_addpath_names(p
->addpath_type
[afi
][safi
])
8678 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_AS_OVERRIDE
))
8679 json_object_string_add(json_addr
,
8680 "overrideASNsInOutboundUpdates",
8681 "ifAspathEqualRemoteAs");
8683 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_SELF
)
8684 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
8685 PEER_FLAG_FORCE_NEXTHOP_SELF
))
8686 json_object_boolean_true_add(json_addr
,
8687 "routerAlwaysNextHop");
8688 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8689 PEER_FLAG_AS_PATH_UNCHANGED
))
8690 json_object_boolean_true_add(
8691 json_addr
, "unchangedAsPathPropogatedToNbr");
8692 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8693 PEER_FLAG_NEXTHOP_UNCHANGED
))
8694 json_object_boolean_true_add(
8695 json_addr
, "unchangedNextHopPropogatedToNbr");
8696 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
8697 json_object_boolean_true_add(
8698 json_addr
, "unchangedMedPropogatedToNbr");
8699 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
)
8700 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
8701 PEER_FLAG_SEND_EXT_COMMUNITY
)) {
8702 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8703 PEER_FLAG_SEND_COMMUNITY
)
8704 && CHECK_FLAG(p
->af_flags
[afi
][safi
],
8705 PEER_FLAG_SEND_EXT_COMMUNITY
))
8706 json_object_string_add(json_addr
,
8707 "commAttriSentToNbr",
8708 "extendedAndStandard");
8709 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8710 PEER_FLAG_SEND_EXT_COMMUNITY
))
8711 json_object_string_add(json_addr
,
8712 "commAttriSentToNbr",
8715 json_object_string_add(json_addr
,
8716 "commAttriSentToNbr",
8719 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8720 PEER_FLAG_DEFAULT_ORIGINATE
)) {
8721 if (p
->default_rmap
[afi
][safi
].name
)
8722 json_object_string_add(
8723 json_addr
, "defaultRouteMap",
8724 p
->default_rmap
[afi
][safi
].name
);
8726 if (paf
&& PAF_SUBGRP(paf
)
8727 && CHECK_FLAG(PAF_SUBGRP(paf
)->sflags
,
8728 SUBGRP_STATUS_DEFAULT_ORIGINATE
))
8729 json_object_boolean_true_add(json_addr
,
8732 json_object_boolean_true_add(json_addr
,
8736 if (afi
== AFI_L2VPN
&& safi
== SAFI_EVPN
) {
8737 if (is_evpn_enabled())
8738 json_object_boolean_true_add(
8739 json_addr
, "advertiseAllVnis");
8742 if (filter
->plist
[FILTER_IN
].name
8743 || filter
->dlist
[FILTER_IN
].name
8744 || filter
->aslist
[FILTER_IN
].name
8745 || filter
->map
[RMAP_IN
].name
)
8746 json_object_boolean_true_add(json_addr
,
8747 "inboundPathPolicyConfig");
8748 if (filter
->plist
[FILTER_OUT
].name
8749 || filter
->dlist
[FILTER_OUT
].name
8750 || filter
->aslist
[FILTER_OUT
].name
8751 || filter
->map
[RMAP_OUT
].name
|| filter
->usmap
.name
)
8752 json_object_boolean_true_add(
8753 json_addr
, "outboundPathPolicyConfig");
8756 if (filter
->plist
[FILTER_IN
].name
)
8757 json_object_string_add(json_addr
,
8758 "incomingUpdatePrefixFilterList",
8759 filter
->plist
[FILTER_IN
].name
);
8760 if (filter
->plist
[FILTER_OUT
].name
)
8761 json_object_string_add(json_addr
,
8762 "outgoingUpdatePrefixFilterList",
8763 filter
->plist
[FILTER_OUT
].name
);
8765 /* distribute-list */
8766 if (filter
->dlist
[FILTER_IN
].name
)
8767 json_object_string_add(
8768 json_addr
, "incomingUpdateNetworkFilterList",
8769 filter
->dlist
[FILTER_IN
].name
);
8770 if (filter
->dlist
[FILTER_OUT
].name
)
8771 json_object_string_add(
8772 json_addr
, "outgoingUpdateNetworkFilterList",
8773 filter
->dlist
[FILTER_OUT
].name
);
8776 if (filter
->aslist
[FILTER_IN
].name
)
8777 json_object_string_add(json_addr
,
8778 "incomingUpdateAsPathFilterList",
8779 filter
->aslist
[FILTER_IN
].name
);
8780 if (filter
->aslist
[FILTER_OUT
].name
)
8781 json_object_string_add(json_addr
,
8782 "outgoingUpdateAsPathFilterList",
8783 filter
->aslist
[FILTER_OUT
].name
);
8786 if (filter
->map
[RMAP_IN
].name
)
8787 json_object_string_add(
8788 json_addr
, "routeMapForIncomingAdvertisements",
8789 filter
->map
[RMAP_IN
].name
);
8790 if (filter
->map
[RMAP_OUT
].name
)
8791 json_object_string_add(
8792 json_addr
, "routeMapForOutgoingAdvertisements",
8793 filter
->map
[RMAP_OUT
].name
);
8795 /* ebgp-requires-policy (inbound) */
8796 if (p
->bgp
->ebgp_requires_policy
== DEFAULT_EBGP_POLICY_ENABLED
8797 && !bgp_inbound_policy_exists(p
, filter
))
8798 json_object_string_add(
8799 json_addr
, "inboundEbgpRequiresPolicy",
8800 "Inbound updates discarded due to missing policy");
8802 /* ebgp-requires-policy (outbound) */
8803 if (p
->bgp
->ebgp_requires_policy
== DEFAULT_EBGP_POLICY_ENABLED
8804 && (!bgp_outbound_policy_exists(p
, filter
)))
8805 json_object_string_add(
8806 json_addr
, "outboundEbgpRequiresPolicy",
8807 "Outbound updates discarded due to missing policy");
8809 /* unsuppress-map */
8810 if (filter
->usmap
.name
)
8811 json_object_string_add(json_addr
,
8812 "selectiveUnsuppressRouteMap",
8813 filter
->usmap
.name
);
8815 /* Receive prefix count */
8816 json_object_int_add(json_addr
, "acceptedPrefixCounter",
8817 p
->pcount
[afi
][safi
]);
8818 if (paf
&& PAF_SUBGRP(paf
))
8819 json_object_int_add(json_addr
, "sentPrefixCounter",
8820 (PAF_SUBGRP(paf
))->scount
);
8822 /* Maximum prefix */
8823 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
)) {
8824 json_object_int_add(json_addr
, "prefixAllowedMax",
8825 p
->pmax
[afi
][safi
]);
8826 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8827 PEER_FLAG_MAX_PREFIX_WARNING
))
8828 json_object_boolean_true_add(
8829 json_addr
, "prefixAllowedMaxWarning");
8830 json_object_int_add(json_addr
,
8831 "prefixAllowedWarningThresh",
8832 p
->pmax_threshold
[afi
][safi
]);
8833 if (p
->pmax_restart
[afi
][safi
])
8834 json_object_int_add(
8836 "prefixAllowedRestartIntervalMsecs",
8837 p
->pmax_restart
[afi
][safi
] * 60000);
8839 json_object_object_add(json_neigh
, afi_safi_print(afi
, safi
),
8843 filter
= &p
->filter
[afi
][safi
];
8845 vty_out(vty
, " For address family: %s\n",
8846 afi_safi_print(afi
, safi
));
8848 if (peer_group_active(p
))
8849 vty_out(vty
, " %s peer-group member\n",
8852 paf
= peer_af_find(p
, afi
, safi
);
8853 if (paf
&& PAF_SUBGRP(paf
)) {
8854 vty_out(vty
, " Update group %" PRIu64
8855 ", subgroup %" PRIu64
"\n",
8856 PAF_UPDGRP(paf
)->id
, PAF_SUBGRP(paf
)->id
);
8857 vty_out(vty
, " Packet Queue length %d\n",
8858 bpacket_queue_virtual_length(paf
));
8860 vty_out(vty
, " Not part of any update group\n");
8862 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
8863 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8864 PEER_CAP_ORF_PREFIX_SM_RCV
)
8865 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8866 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
8867 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8868 PEER_CAP_ORF_PREFIX_RM_ADV
)
8869 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8870 PEER_CAP_ORF_PREFIX_RM_RCV
)
8871 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8872 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
))
8873 vty_out(vty
, " AF-dependant capabilities:\n");
8875 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
8876 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8877 PEER_CAP_ORF_PREFIX_SM_RCV
)
8878 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8879 PEER_CAP_ORF_PREFIX_RM_ADV
)
8880 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8881 PEER_CAP_ORF_PREFIX_RM_RCV
)) {
8883 " Outbound Route Filter (ORF) type (%d) Prefix-list:\n",
8885 bgp_show_peer_afi_orf_cap(
8886 vty
, p
, afi
, safi
, PEER_CAP_ORF_PREFIX_SM_ADV
,
8887 PEER_CAP_ORF_PREFIX_RM_ADV
,
8888 PEER_CAP_ORF_PREFIX_SM_RCV
,
8889 PEER_CAP_ORF_PREFIX_RM_RCV
, use_json
, NULL
);
8891 if (CHECK_FLAG(p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
8892 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8893 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
8894 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8895 PEER_CAP_ORF_PREFIX_RM_ADV
)
8896 || CHECK_FLAG(p
->af_cap
[afi
][safi
],
8897 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
)) {
8899 " Outbound Route Filter (ORF) type (%d) Prefix-list:\n",
8900 ORF_TYPE_PREFIX_OLD
);
8901 bgp_show_peer_afi_orf_cap(
8902 vty
, p
, afi
, safi
, PEER_CAP_ORF_PREFIX_SM_ADV
,
8903 PEER_CAP_ORF_PREFIX_RM_ADV
,
8904 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
,
8905 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
, use_json
, NULL
);
8908 sprintf(orf_pfx_name
, "%s.%d.%d", p
->host
, afi
, safi
);
8909 orf_pfx_count
= prefix_bgp_show_prefix_list(
8910 NULL
, afi
, orf_pfx_name
, use_json
);
8912 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
8913 PEER_STATUS_ORF_PREFIX_SEND
)
8915 vty_out(vty
, " Outbound Route Filter (ORF):");
8916 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
8917 PEER_STATUS_ORF_PREFIX_SEND
))
8918 vty_out(vty
, " sent;");
8920 vty_out(vty
, " received (%d entries)",
8924 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
8925 PEER_STATUS_ORF_WAIT_REFRESH
))
8927 " First update is deferred until ORF or ROUTE-REFRESH is received\n");
8929 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8930 PEER_FLAG_REFLECTOR_CLIENT
))
8931 vty_out(vty
, " Route-Reflector Client\n");
8932 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8933 PEER_FLAG_RSERVER_CLIENT
))
8934 vty_out(vty
, " Route-Server Client\n");
8935 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
8937 " Inbound soft reconfiguration allowed\n");
8939 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8940 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
))
8942 " Private AS numbers (all) replaced in updates to this neighbor\n");
8943 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8944 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
))
8946 " Private AS numbers replaced in updates to this neighbor\n");
8947 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8948 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
))
8950 " Private AS numbers (all) removed in updates to this neighbor\n");
8951 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8952 PEER_FLAG_REMOVE_PRIVATE_AS
))
8954 " Private AS numbers removed in updates to this neighbor\n");
8956 if (p
->addpath_type
[afi
][safi
] != BGP_ADDPATH_NONE
)
8957 vty_out(vty
, " %s\n",
8958 bgp_addpath_names(p
->addpath_type
[afi
][safi
])
8959 ->human_description
);
8961 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_AS_OVERRIDE
))
8963 " Override ASNs in outbound updates if aspath equals remote-as\n");
8965 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_SELF
)
8966 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
8967 PEER_FLAG_FORCE_NEXTHOP_SELF
))
8968 vty_out(vty
, " NEXT_HOP is always this router\n");
8969 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8970 PEER_FLAG_AS_PATH_UNCHANGED
))
8972 " AS_PATH is propagated unchanged to this neighbor\n");
8973 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8974 PEER_FLAG_NEXTHOP_UNCHANGED
))
8976 " NEXT_HOP is propagated unchanged to this neighbor\n");
8977 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
8979 " MED is propagated unchanged to this neighbor\n");
8980 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
)
8981 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
8982 PEER_FLAG_SEND_EXT_COMMUNITY
)
8983 || CHECK_FLAG(p
->af_flags
[afi
][safi
],
8984 PEER_FLAG_SEND_LARGE_COMMUNITY
)) {
8986 " Community attribute sent to this neighbor");
8987 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8988 PEER_FLAG_SEND_COMMUNITY
)
8989 && CHECK_FLAG(p
->af_flags
[afi
][safi
],
8990 PEER_FLAG_SEND_EXT_COMMUNITY
)
8991 && CHECK_FLAG(p
->af_flags
[afi
][safi
],
8992 PEER_FLAG_SEND_LARGE_COMMUNITY
))
8993 vty_out(vty
, "(all)\n");
8994 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8995 PEER_FLAG_SEND_LARGE_COMMUNITY
))
8996 vty_out(vty
, "(large)\n");
8997 else if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
8998 PEER_FLAG_SEND_EXT_COMMUNITY
))
8999 vty_out(vty
, "(extended)\n");
9001 vty_out(vty
, "(standard)\n");
9003 if (CHECK_FLAG(p
->af_flags
[afi
][safi
],
9004 PEER_FLAG_DEFAULT_ORIGINATE
)) {
9005 vty_out(vty
, " Default information originate,");
9007 if (p
->default_rmap
[afi
][safi
].name
)
9008 vty_out(vty
, " default route-map %s%s,",
9009 p
->default_rmap
[afi
][safi
].map
? "*"
9011 p
->default_rmap
[afi
][safi
].name
);
9012 if (paf
&& PAF_SUBGRP(paf
)
9013 && CHECK_FLAG(PAF_SUBGRP(paf
)->sflags
,
9014 SUBGRP_STATUS_DEFAULT_ORIGINATE
))
9015 vty_out(vty
, " default sent\n");
9017 vty_out(vty
, " default not sent\n");
9020 /* advertise-vni-all */
9021 if (afi
== AFI_L2VPN
&& safi
== SAFI_EVPN
) {
9022 if (is_evpn_enabled())
9023 vty_out(vty
, " advertise-all-vni\n");
9026 if (filter
->plist
[FILTER_IN
].name
9027 || filter
->dlist
[FILTER_IN
].name
9028 || filter
->aslist
[FILTER_IN
].name
9029 || filter
->map
[RMAP_IN
].name
)
9030 vty_out(vty
, " Inbound path policy configured\n");
9031 if (filter
->plist
[FILTER_OUT
].name
9032 || filter
->dlist
[FILTER_OUT
].name
9033 || filter
->aslist
[FILTER_OUT
].name
9034 || filter
->map
[RMAP_OUT
].name
|| filter
->usmap
.name
)
9035 vty_out(vty
, " Outbound path policy configured\n");
9038 if (filter
->plist
[FILTER_IN
].name
)
9040 " Incoming update prefix filter list is %s%s\n",
9041 filter
->plist
[FILTER_IN
].plist
? "*" : "",
9042 filter
->plist
[FILTER_IN
].name
);
9043 if (filter
->plist
[FILTER_OUT
].name
)
9045 " Outgoing update prefix filter list is %s%s\n",
9046 filter
->plist
[FILTER_OUT
].plist
? "*" : "",
9047 filter
->plist
[FILTER_OUT
].name
);
9049 /* distribute-list */
9050 if (filter
->dlist
[FILTER_IN
].name
)
9052 " Incoming update network filter list is %s%s\n",
9053 filter
->dlist
[FILTER_IN
].alist
? "*" : "",
9054 filter
->dlist
[FILTER_IN
].name
);
9055 if (filter
->dlist
[FILTER_OUT
].name
)
9057 " Outgoing update network filter list is %s%s\n",
9058 filter
->dlist
[FILTER_OUT
].alist
? "*" : "",
9059 filter
->dlist
[FILTER_OUT
].name
);
9062 if (filter
->aslist
[FILTER_IN
].name
)
9064 " Incoming update AS path filter list is %s%s\n",
9065 filter
->aslist
[FILTER_IN
].aslist
? "*" : "",
9066 filter
->aslist
[FILTER_IN
].name
);
9067 if (filter
->aslist
[FILTER_OUT
].name
)
9069 " Outgoing update AS path filter list is %s%s\n",
9070 filter
->aslist
[FILTER_OUT
].aslist
? "*" : "",
9071 filter
->aslist
[FILTER_OUT
].name
);
9074 if (filter
->map
[RMAP_IN
].name
)
9076 " Route map for incoming advertisements is %s%s\n",
9077 filter
->map
[RMAP_IN
].map
? "*" : "",
9078 filter
->map
[RMAP_IN
].name
);
9079 if (filter
->map
[RMAP_OUT
].name
)
9081 " Route map for outgoing advertisements is %s%s\n",
9082 filter
->map
[RMAP_OUT
].map
? "*" : "",
9083 filter
->map
[RMAP_OUT
].name
);
9085 /* ebgp-requires-policy (inbound) */
9086 if (p
->bgp
->ebgp_requires_policy
== DEFAULT_EBGP_POLICY_ENABLED
9087 && !bgp_inbound_policy_exists(p
, filter
))
9089 " Inbound updates discarded due to missing policy\n");
9091 /* ebgp-requires-policy (outbound) */
9092 if (p
->bgp
->ebgp_requires_policy
== DEFAULT_EBGP_POLICY_ENABLED
9093 && !bgp_outbound_policy_exists(p
, filter
))
9095 " Outbound updates discarded due to missing policy\n");
9097 /* unsuppress-map */
9098 if (filter
->usmap
.name
)
9100 " Route map for selective unsuppress is %s%s\n",
9101 filter
->usmap
.map
? "*" : "",
9102 filter
->usmap
.name
);
9104 /* Receive prefix count */
9105 vty_out(vty
, " %ld accepted prefixes\n", p
->pcount
[afi
][safi
]);
9107 /* Maximum prefix */
9108 if (CHECK_FLAG(p
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
)) {
9109 vty_out(vty
, " Maximum prefixes allowed %ld%s\n",
9111 CHECK_FLAG(p
->af_flags
[afi
][safi
],
9112 PEER_FLAG_MAX_PREFIX_WARNING
)
9115 vty_out(vty
, " Threshold for warning message %d%%",
9116 p
->pmax_threshold
[afi
][safi
]);
9117 if (p
->pmax_restart
[afi
][safi
])
9118 vty_out(vty
, ", restart interval %d min",
9119 p
->pmax_restart
[afi
][safi
]);
9127 static void bgp_show_peer(struct vty
*vty
, struct peer
*p
, bool use_json
,
9131 char buf1
[PREFIX2STR_BUFFER
], buf
[SU_ADDRSTRLEN
];
9132 char timebuf
[BGP_UPTIME_LEN
];
9134 const char *subcode_str
;
9135 const char *code_str
;
9140 json_object
*json_neigh
= NULL
;
9146 json_neigh
= json_object_new_object();
9148 memset(dn_flag
, '\0', sizeof(dn_flag
));
9149 if (!p
->conf_if
&& peer_dynamic_neighbor(p
))
9153 if (p
->conf_if
) /* Configured interface name. */
9154 vty_out(vty
, "BGP neighbor on %s: %s, ", p
->conf_if
,
9155 BGP_PEER_SU_UNSPEC(p
)
9157 : sockunion2str(&p
->su
, buf
,
9159 else /* Configured IP address. */
9160 vty_out(vty
, "BGP neighbor is %s%s, ", dn_flag
,
9165 if (p
->conf_if
&& BGP_PEER_SU_UNSPEC(p
))
9166 json_object_string_add(json_neigh
, "bgpNeighborAddr",
9168 else if (p
->conf_if
&& !BGP_PEER_SU_UNSPEC(p
))
9169 json_object_string_add(
9170 json_neigh
, "bgpNeighborAddr",
9171 sockunion2str(&p
->su
, buf
, SU_ADDRSTRLEN
));
9173 json_object_int_add(json_neigh
, "remoteAs", p
->as
);
9175 if (p
->change_local_as
)
9176 json_object_int_add(json_neigh
, "localAs",
9177 p
->change_local_as
);
9179 json_object_int_add(json_neigh
, "localAs", p
->local_as
);
9181 if (CHECK_FLAG(p
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
))
9182 json_object_boolean_true_add(json_neigh
,
9183 "localAsNoPrepend");
9185 if (CHECK_FLAG(p
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
))
9186 json_object_boolean_true_add(json_neigh
,
9187 "localAsReplaceAs");
9189 if ((p
->as_type
== AS_SPECIFIED
) || (p
->as_type
== AS_EXTERNAL
)
9190 || (p
->as_type
== AS_INTERNAL
))
9191 vty_out(vty
, "remote AS %u, ", p
->as
);
9193 vty_out(vty
, "remote AS Unspecified, ");
9194 vty_out(vty
, "local AS %u%s%s, ",
9195 p
->change_local_as
? p
->change_local_as
: p
->local_as
,
9196 CHECK_FLAG(p
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
)
9199 CHECK_FLAG(p
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
)
9203 /* peer type internal or confed-internal */
9204 if ((p
->as
== p
->local_as
) || (p
->as_type
== AS_INTERNAL
)) {
9206 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
))
9207 json_object_boolean_true_add(
9208 json_neigh
, "nbrConfedInternalLink");
9210 json_object_boolean_true_add(json_neigh
,
9213 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
))
9214 vty_out(vty
, "confed-internal link\n");
9216 vty_out(vty
, "internal link\n");
9218 /* peer type external or confed-external */
9219 } else if (p
->as
|| (p
->as_type
== AS_EXTERNAL
)) {
9221 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
))
9222 json_object_boolean_true_add(
9223 json_neigh
, "nbrConfedExternalLink");
9225 json_object_boolean_true_add(json_neigh
,
9228 if (bgp_confederation_peers_check(bgp
, p
->as
))
9229 vty_out(vty
, "confed-external link\n");
9231 vty_out(vty
, "external link\n");
9235 json_object_boolean_true_add(json_neigh
,
9236 "nbrUnspecifiedLink");
9238 vty_out(vty
, "unspecified link\n");
9244 json_object_string_add(json_neigh
, "nbrDesc", p
->desc
);
9246 vty_out(vty
, " Description: %s\n", p
->desc
);
9252 json_object_string_add(json_neigh
, "hostname",
9256 json_object_string_add(json_neigh
, "domainname",
9259 if (p
->domainname
&& (p
->domainname
[0] != '\0'))
9260 vty_out(vty
, "Hostname: %s.%s\n", p
->hostname
,
9263 vty_out(vty
, "Hostname: %s\n", p
->hostname
);
9270 json_object_string_add(json_neigh
, "peerGroup",
9274 struct prefix prefix
, *range
= NULL
;
9276 sockunion2hostprefix(&(p
->su
), &prefix
);
9277 range
= peer_group_lookup_dynamic_neighbor_range(
9281 prefix2str(range
, buf1
, sizeof(buf1
));
9282 json_object_string_add(
9284 "peerSubnetRangeGroup", buf1
);
9289 " Member of peer-group %s for session parameters\n",
9293 struct prefix prefix
, *range
= NULL
;
9295 sockunion2hostprefix(&(p
->su
), &prefix
);
9296 range
= peer_group_lookup_dynamic_neighbor_range(
9300 prefix2str(range
, buf1
, sizeof(buf1
));
9302 " Belongs to the subnet range group: %s\n",
9310 /* Administrative shutdown. */
9311 if (CHECK_FLAG(p
->flags
, PEER_FLAG_SHUTDOWN
))
9312 json_object_boolean_true_add(json_neigh
,
9316 json_object_int_add(json_neigh
, "bgpVersion", 4);
9317 json_object_string_add(
9318 json_neigh
, "remoteRouterId",
9319 inet_ntop(AF_INET
, &p
->remote_id
, buf1
, sizeof(buf1
)));
9320 json_object_string_add(
9321 json_neigh
, "localRouterId",
9322 inet_ntop(AF_INET
, &bgp
->router_id
, buf1
,
9326 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
)
9327 && bgp_confederation_peers_check(bgp
, p
->as
))
9328 json_object_boolean_true_add(json_neigh
,
9332 json_object_string_add(
9333 json_neigh
, "bgpState",
9334 lookup_msg(bgp_status_msg
, p
->status
, NULL
));
9336 if (p
->status
== Established
) {
9339 uptime
= bgp_clock();
9340 uptime
-= p
->uptime
;
9341 epoch_tbuf
= time(NULL
) - uptime
;
9343 #if CONFDATE > 20200101
9345 "bgpTimerUp should be deprecated and can be removed now");
9348 * bgpTimerUp was miliseconds that was accurate
9349 * up to 1 day, then the value returned
9350 * became garbage. So in order to provide
9351 * some level of backwards compatability,
9352 * we still provde the data, but now
9353 * we are returning the correct value
9354 * and also adding a new bgpTimerUpMsec
9355 * which will allow us to deprecate
9358 json_object_int_add(json_neigh
, "bgpTimerUp",
9360 json_object_int_add(json_neigh
, "bgpTimerUpMsec",
9362 json_object_string_add(json_neigh
, "bgpTimerUpString",
9363 peer_uptime(p
->uptime
, timebuf
,
9366 json_object_int_add(json_neigh
,
9367 "bgpTimerUpEstablishedEpoch",
9371 else if (p
->status
== Active
) {
9372 if (CHECK_FLAG(p
->flags
, PEER_FLAG_PASSIVE
))
9373 json_object_string_add(json_neigh
, "bgpStateIs",
9375 else if (CHECK_FLAG(p
->sflags
, PEER_STATUS_NSF_WAIT
))
9376 json_object_string_add(json_neigh
, "bgpStateIs",
9384 uptime
= bgp_clock();
9385 uptime
-= p
->readtime
;
9386 tm
= gmtime(&uptime
);
9387 json_object_int_add(json_neigh
, "bgpTimerLastRead",
9388 (tm
->tm_sec
* 1000) + (tm
->tm_min
* 60000)
9389 + (tm
->tm_hour
* 3600000));
9391 uptime
= bgp_clock();
9392 uptime
-= p
->last_write
;
9393 tm
= gmtime(&uptime
);
9394 json_object_int_add(json_neigh
, "bgpTimerLastWrite",
9395 (tm
->tm_sec
* 1000) + (tm
->tm_min
* 60000)
9396 + (tm
->tm_hour
* 3600000));
9398 uptime
= bgp_clock();
9399 uptime
-= p
->update_time
;
9400 tm
= gmtime(&uptime
);
9401 json_object_int_add(json_neigh
, "bgpInUpdateElapsedTimeMsecs",
9402 (tm
->tm_sec
* 1000) + (tm
->tm_min
* 60000)
9403 + (tm
->tm_hour
* 3600000));
9405 /* Configured timer values. */
9406 json_object_int_add(json_neigh
, "bgpTimerHoldTimeMsecs",
9407 p
->v_holdtime
* 1000);
9408 json_object_int_add(json_neigh
,
9409 "bgpTimerKeepAliveIntervalMsecs",
9410 p
->v_keepalive
* 1000);
9411 if (CHECK_FLAG(p
->flags
, PEER_FLAG_TIMER
)) {
9412 json_object_int_add(json_neigh
,
9413 "bgpTimerConfiguredHoldTimeMsecs",
9414 p
->holdtime
* 1000);
9415 json_object_int_add(
9417 "bgpTimerConfiguredKeepAliveIntervalMsecs",
9418 p
->keepalive
* 1000);
9419 } else if ((bgp
->default_holdtime
!= BGP_DEFAULT_HOLDTIME
)
9420 || (bgp
->default_keepalive
9421 != BGP_DEFAULT_KEEPALIVE
)) {
9422 json_object_int_add(json_neigh
,
9423 "bgpTimerConfiguredHoldTimeMsecs",
9424 bgp
->default_holdtime
);
9425 json_object_int_add(
9427 "bgpTimerConfiguredKeepAliveIntervalMsecs",
9428 bgp
->default_keepalive
);
9431 /* Administrative shutdown. */
9432 if (CHECK_FLAG(p
->flags
, PEER_FLAG_SHUTDOWN
))
9433 vty_out(vty
, " Administratively shut down\n");
9436 vty_out(vty
, " BGP version 4");
9437 vty_out(vty
, ", remote router ID %s",
9438 inet_ntop(AF_INET
, &p
->remote_id
, buf1
, sizeof(buf1
)));
9439 vty_out(vty
, ", local router ID %s\n",
9440 inet_ntop(AF_INET
, &bgp
->router_id
, buf1
,
9444 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
)
9445 && bgp_confederation_peers_check(bgp
, p
->as
))
9447 " Neighbor under common administration\n");
9450 vty_out(vty
, " BGP state = %s",
9451 lookup_msg(bgp_status_msg
, p
->status
, NULL
));
9453 if (p
->status
== Established
)
9454 vty_out(vty
, ", up for %8s",
9455 peer_uptime(p
->uptime
, timebuf
, BGP_UPTIME_LEN
,
9458 else if (p
->status
== Active
) {
9459 if (CHECK_FLAG(p
->flags
, PEER_FLAG_PASSIVE
))
9460 vty_out(vty
, " (passive)");
9461 else if (CHECK_FLAG(p
->sflags
, PEER_STATUS_NSF_WAIT
))
9462 vty_out(vty
, " (NSF passive)");
9467 vty_out(vty
, " Last read %s",
9468 peer_uptime(p
->readtime
, timebuf
, BGP_UPTIME_LEN
, 0,
9470 vty_out(vty
, ", Last write %s\n",
9471 peer_uptime(p
->last_write
, timebuf
, BGP_UPTIME_LEN
, 0,
9474 /* Configured timer values. */
9476 " Hold time is %d, keepalive interval is %d seconds\n",
9477 p
->v_holdtime
, p
->v_keepalive
);
9478 if (CHECK_FLAG(p
->flags
, PEER_FLAG_TIMER
)) {
9479 vty_out(vty
, " Configured hold time is %d",
9481 vty_out(vty
, ", keepalive interval is %d seconds\n",
9483 } else if ((bgp
->default_holdtime
!= BGP_DEFAULT_HOLDTIME
)
9484 || (bgp
->default_keepalive
9485 != BGP_DEFAULT_KEEPALIVE
)) {
9486 vty_out(vty
, " Configured hold time is %d",
9487 bgp
->default_holdtime
);
9488 vty_out(vty
, ", keepalive interval is %d seconds\n",
9489 bgp
->default_keepalive
);
9493 if (p
->status
== Established
) {
9494 if (p
->cap
|| p
->afc_adv
[AFI_IP
][SAFI_UNICAST
]
9495 || p
->afc_recv
[AFI_IP
][SAFI_UNICAST
]
9496 || p
->afc_adv
[AFI_IP
][SAFI_MULTICAST
]
9497 || p
->afc_recv
[AFI_IP
][SAFI_MULTICAST
]
9498 || p
->afc_adv
[AFI_IP6
][SAFI_UNICAST
]
9499 || p
->afc_recv
[AFI_IP6
][SAFI_UNICAST
]
9500 || p
->afc_adv
[AFI_IP6
][SAFI_MULTICAST
]
9501 || p
->afc_recv
[AFI_IP6
][SAFI_MULTICAST
]
9502 || p
->afc_adv
[AFI_IP6
][SAFI_MPLS_VPN
]
9503 || p
->afc_recv
[AFI_IP6
][SAFI_MPLS_VPN
]
9504 || p
->afc_adv
[AFI_IP6
][SAFI_ENCAP
]
9505 || p
->afc_recv
[AFI_IP6
][SAFI_ENCAP
]
9506 || p
->afc_adv
[AFI_IP6
][SAFI_FLOWSPEC
]
9507 || p
->afc_recv
[AFI_IP6
][SAFI_FLOWSPEC
]
9508 || p
->afc_adv
[AFI_IP
][SAFI_ENCAP
]
9509 || p
->afc_recv
[AFI_IP
][SAFI_ENCAP
]
9510 || p
->afc_adv
[AFI_IP
][SAFI_FLOWSPEC
]
9511 || p
->afc_recv
[AFI_IP
][SAFI_FLOWSPEC
]
9512 || p
->afc_adv
[AFI_IP
][SAFI_MPLS_VPN
]
9513 || p
->afc_recv
[AFI_IP
][SAFI_MPLS_VPN
]) {
9515 json_object
*json_cap
= NULL
;
9517 json_cap
= json_object_new_object();
9520 if (CHECK_FLAG(p
->cap
, PEER_CAP_AS4_RCV
)
9521 || CHECK_FLAG(p
->cap
, PEER_CAP_AS4_ADV
)) {
9522 if (CHECK_FLAG(p
->cap
, PEER_CAP_AS4_ADV
)
9523 && CHECK_FLAG(p
->cap
,
9525 json_object_string_add(
9526 json_cap
, "4byteAs",
9527 "advertisedAndReceived");
9528 else if (CHECK_FLAG(p
->cap
,
9530 json_object_string_add(
9531 json_cap
, "4byteAs",
9533 else if (CHECK_FLAG(p
->cap
,
9535 json_object_string_add(
9536 json_cap
, "4byteAs",
9541 if (CHECK_FLAG(p
->cap
, PEER_CAP_ADDPATH_RCV
)
9542 || CHECK_FLAG(p
->cap
,
9543 PEER_CAP_ADDPATH_ADV
)) {
9544 json_object
*json_add
= NULL
;
9545 const char *print_store
;
9547 json_add
= json_object_new_object();
9549 FOREACH_AFI_SAFI (afi
, safi
) {
9550 json_object
*json_sub
= NULL
;
9552 json_object_new_object();
9553 print_store
= afi_safi_print(
9559 PEER_CAP_ADDPATH_AF_TX_ADV
)
9563 PEER_CAP_ADDPATH_AF_TX_RCV
)) {
9568 PEER_CAP_ADDPATH_AF_TX_ADV
)
9573 PEER_CAP_ADDPATH_AF_TX_RCV
))
9574 json_object_boolean_true_add(
9576 "txAdvertisedAndReceived");
9582 PEER_CAP_ADDPATH_AF_TX_ADV
))
9583 json_object_boolean_true_add(
9591 PEER_CAP_ADDPATH_AF_TX_RCV
))
9592 json_object_boolean_true_add(
9600 PEER_CAP_ADDPATH_AF_RX_ADV
)
9604 PEER_CAP_ADDPATH_AF_RX_RCV
)) {
9609 PEER_CAP_ADDPATH_AF_RX_ADV
)
9614 PEER_CAP_ADDPATH_AF_RX_RCV
))
9615 json_object_boolean_true_add(
9617 "rxAdvertisedAndReceived");
9623 PEER_CAP_ADDPATH_AF_RX_ADV
))
9624 json_object_boolean_true_add(
9632 PEER_CAP_ADDPATH_AF_RX_RCV
))
9633 json_object_boolean_true_add(
9641 PEER_CAP_ADDPATH_AF_TX_ADV
)
9645 PEER_CAP_ADDPATH_AF_TX_RCV
)
9649 PEER_CAP_ADDPATH_AF_RX_ADV
)
9653 PEER_CAP_ADDPATH_AF_RX_RCV
))
9654 json_object_object_add(
9663 json_object_object_add(
9664 json_cap
, "addPath", json_add
);
9668 if (CHECK_FLAG(p
->cap
, PEER_CAP_DYNAMIC_RCV
)
9669 || CHECK_FLAG(p
->cap
,
9670 PEER_CAP_DYNAMIC_ADV
)) {
9671 if (CHECK_FLAG(p
->cap
,
9672 PEER_CAP_DYNAMIC_ADV
)
9673 && CHECK_FLAG(p
->cap
,
9674 PEER_CAP_DYNAMIC_RCV
))
9675 json_object_string_add(
9676 json_cap
, "dynamic",
9677 "advertisedAndReceived");
9678 else if (CHECK_FLAG(
9680 PEER_CAP_DYNAMIC_ADV
))
9681 json_object_string_add(
9682 json_cap
, "dynamic",
9684 else if (CHECK_FLAG(
9686 PEER_CAP_DYNAMIC_RCV
))
9687 json_object_string_add(
9688 json_cap
, "dynamic",
9692 /* Extended nexthop */
9693 if (CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_RCV
)
9694 || CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_ADV
)) {
9695 json_object
*json_nxt
= NULL
;
9696 const char *print_store
;
9699 if (CHECK_FLAG(p
->cap
,
9701 && CHECK_FLAG(p
->cap
,
9703 json_object_string_add(
9706 "advertisedAndReceived");
9707 else if (CHECK_FLAG(p
->cap
,
9709 json_object_string_add(
9713 else if (CHECK_FLAG(p
->cap
,
9715 json_object_string_add(
9720 if (CHECK_FLAG(p
->cap
,
9721 PEER_CAP_ENHE_RCV
)) {
9723 json_object_new_object();
9725 for (safi
= SAFI_UNICAST
;
9726 safi
< SAFI_MAX
; safi
++) {
9731 PEER_CAP_ENHE_AF_RCV
)) {
9732 print_store
= afi_safi_print(
9735 json_object_string_add(
9738 "recieved"); /* misspelled for compatibility */
9741 json_object_object_add(
9743 "extendedNexthopFamililesByPeer",
9749 if (CHECK_FLAG(p
->cap
, PEER_CAP_REFRESH_ADV
)
9750 || CHECK_FLAG(p
->cap
,
9751 PEER_CAP_REFRESH_NEW_RCV
)
9752 || CHECK_FLAG(p
->cap
,
9753 PEER_CAP_REFRESH_OLD_RCV
)) {
9754 if (CHECK_FLAG(p
->cap
,
9755 PEER_CAP_REFRESH_ADV
)
9758 PEER_CAP_REFRESH_NEW_RCV
)
9761 PEER_CAP_REFRESH_OLD_RCV
))) {
9764 PEER_CAP_REFRESH_OLD_RCV
)
9767 PEER_CAP_REFRESH_NEW_RCV
))
9768 json_object_string_add(
9771 "advertisedAndReceivedOldNew");
9775 PEER_CAP_REFRESH_OLD_RCV
))
9776 json_object_string_add(
9779 "advertisedAndReceivedOld");
9781 json_object_string_add(
9784 "advertisedAndReceivedNew");
9789 PEER_CAP_REFRESH_ADV
))
9790 json_object_string_add(
9797 PEER_CAP_REFRESH_NEW_RCV
)
9800 PEER_CAP_REFRESH_OLD_RCV
))
9801 json_object_string_add(
9807 /* Multiprotocol Extensions */
9808 json_object
*json_multi
= NULL
;
9809 json_multi
= json_object_new_object();
9811 FOREACH_AFI_SAFI (afi
, safi
) {
9812 if (p
->afc_adv
[afi
][safi
]
9813 || p
->afc_recv
[afi
][safi
]) {
9814 json_object
*json_exten
= NULL
;
9816 json_object_new_object();
9818 if (p
->afc_adv
[afi
][safi
]
9819 && p
->afc_recv
[afi
][safi
])
9820 json_object_boolean_true_add(
9822 "advertisedAndReceived");
9823 else if (p
->afc_adv
[afi
][safi
])
9824 json_object_boolean_true_add(
9827 else if (p
->afc_recv
[afi
][safi
])
9828 json_object_boolean_true_add(
9832 json_object_object_add(
9839 json_object_object_add(
9840 json_cap
, "multiprotocolExtensions",
9843 /* Hostname capabilities */
9844 json_object
*json_hname
= NULL
;
9846 json_hname
= json_object_new_object();
9848 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_ADV
)) {
9849 json_object_string_add(
9850 json_hname
, "advHostName",
9851 bgp
->peer_self
->hostname
9855 json_object_string_add(
9856 json_hname
, "advDomainName",
9857 bgp
->peer_self
->domainname
9864 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_RCV
)) {
9865 json_object_string_add(
9866 json_hname
, "rcvHostName",
9867 p
->hostname
? p
->hostname
9869 json_object_string_add(
9870 json_hname
, "rcvDomainName",
9871 p
->domainname
? p
->domainname
9875 json_object_object_add(json_cap
, "hostName",
9878 /* Gracefull Restart */
9879 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
)
9880 || CHECK_FLAG(p
->cap
,
9881 PEER_CAP_RESTART_ADV
)) {
9882 if (CHECK_FLAG(p
->cap
,
9883 PEER_CAP_RESTART_ADV
)
9884 && CHECK_FLAG(p
->cap
,
9885 PEER_CAP_RESTART_RCV
))
9886 json_object_string_add(
9889 "advertisedAndReceived");
9890 else if (CHECK_FLAG(
9892 PEER_CAP_RESTART_ADV
))
9893 json_object_string_add(
9895 "gracefulRestartCapability",
9897 else if (CHECK_FLAG(
9899 PEER_CAP_RESTART_RCV
))
9900 json_object_string_add(
9902 "gracefulRestartCapability",
9905 if (CHECK_FLAG(p
->cap
,
9906 PEER_CAP_RESTART_RCV
)) {
9907 int restart_af_count
= 0;
9908 json_object
*json_restart
=
9911 json_object_new_object();
9913 json_object_int_add(
9915 "gracefulRestartRemoteTimerMsecs",
9916 p
->v_gr_restart
* 1000);
9918 FOREACH_AFI_SAFI (afi
, safi
) {
9923 PEER_CAP_RESTART_AF_RCV
)) {
9928 json_object_new_object();
9934 PEER_CAP_RESTART_AF_PRESERVE_RCV
))
9935 json_object_boolean_true_add(
9939 json_object_object_add(
9947 if (!restart_af_count
) {
9948 json_object_string_add(
9950 "addressFamiliesByPeer",
9955 json_object_object_add(
9957 "addressFamiliesByPeer",
9961 json_object_object_add(json_neigh
,
9962 "neighborCapabilities",
9965 vty_out(vty
, " Neighbor capabilities:\n");
9968 if (CHECK_FLAG(p
->cap
, PEER_CAP_AS4_RCV
)
9969 || CHECK_FLAG(p
->cap
, PEER_CAP_AS4_ADV
)) {
9970 vty_out(vty
, " 4 Byte AS:");
9971 if (CHECK_FLAG(p
->cap
,
9973 vty_out(vty
, " advertised");
9974 if (CHECK_FLAG(p
->cap
,
9976 vty_out(vty
, " %sreceived",
9986 if (CHECK_FLAG(p
->cap
, PEER_CAP_ADDPATH_RCV
)
9987 || CHECK_FLAG(p
->cap
,
9988 PEER_CAP_ADDPATH_ADV
)) {
9989 vty_out(vty
, " AddPath:\n");
9991 FOREACH_AFI_SAFI (afi
, safi
) {
9995 PEER_CAP_ADDPATH_AF_TX_ADV
)
9999 PEER_CAP_ADDPATH_AF_TX_RCV
)) {
10010 PEER_CAP_ADDPATH_AF_TX_ADV
))
10021 PEER_CAP_ADDPATH_AF_TX_RCV
))
10028 PEER_CAP_ADDPATH_AF_TX_ADV
)
10032 vty_out(vty
, "\n");
10038 PEER_CAP_ADDPATH_AF_RX_ADV
)
10042 PEER_CAP_ADDPATH_AF_RX_RCV
)) {
10053 PEER_CAP_ADDPATH_AF_RX_ADV
))
10064 PEER_CAP_ADDPATH_AF_RX_RCV
))
10071 PEER_CAP_ADDPATH_AF_RX_ADV
)
10075 vty_out(vty
, "\n");
10081 if (CHECK_FLAG(p
->cap
, PEER_CAP_DYNAMIC_RCV
)
10082 || CHECK_FLAG(p
->cap
,
10083 PEER_CAP_DYNAMIC_ADV
)) {
10084 vty_out(vty
, " Dynamic:");
10085 if (CHECK_FLAG(p
->cap
,
10086 PEER_CAP_DYNAMIC_ADV
))
10087 vty_out(vty
, " advertised");
10088 if (CHECK_FLAG(p
->cap
,
10089 PEER_CAP_DYNAMIC_RCV
))
10090 vty_out(vty
, " %sreceived",
10093 PEER_CAP_DYNAMIC_ADV
)
10096 vty_out(vty
, "\n");
10099 /* Extended nexthop */
10100 if (CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_RCV
)
10101 || CHECK_FLAG(p
->cap
, PEER_CAP_ENHE_ADV
)) {
10102 vty_out(vty
, " Extended nexthop:");
10103 if (CHECK_FLAG(p
->cap
,
10104 PEER_CAP_ENHE_ADV
))
10105 vty_out(vty
, " advertised");
10106 if (CHECK_FLAG(p
->cap
,
10107 PEER_CAP_ENHE_RCV
))
10108 vty_out(vty
, " %sreceived",
10114 vty_out(vty
, "\n");
10116 if (CHECK_FLAG(p
->cap
,
10117 PEER_CAP_ENHE_RCV
)) {
10119 " Address families by peer:\n ");
10120 for (safi
= SAFI_UNICAST
;
10121 safi
< SAFI_MAX
; safi
++)
10126 PEER_CAP_ENHE_AF_RCV
))
10135 /* Route Refresh */
10136 if (CHECK_FLAG(p
->cap
, PEER_CAP_REFRESH_ADV
)
10137 || CHECK_FLAG(p
->cap
,
10138 PEER_CAP_REFRESH_NEW_RCV
)
10139 || CHECK_FLAG(p
->cap
,
10140 PEER_CAP_REFRESH_OLD_RCV
)) {
10141 vty_out(vty
, " Route refresh:");
10142 if (CHECK_FLAG(p
->cap
,
10143 PEER_CAP_REFRESH_ADV
))
10144 vty_out(vty
, " advertised");
10145 if (CHECK_FLAG(p
->cap
,
10146 PEER_CAP_REFRESH_NEW_RCV
)
10149 PEER_CAP_REFRESH_OLD_RCV
))
10150 vty_out(vty
, " %sreceived(%s)",
10153 PEER_CAP_REFRESH_ADV
)
10158 PEER_CAP_REFRESH_OLD_RCV
)
10161 PEER_CAP_REFRESH_NEW_RCV
))
10165 PEER_CAP_REFRESH_OLD_RCV
)
10169 vty_out(vty
, "\n");
10172 /* Multiprotocol Extensions */
10173 FOREACH_AFI_SAFI (afi
, safi
)
10174 if (p
->afc_adv
[afi
][safi
]
10175 || p
->afc_recv
[afi
][safi
]) {
10177 " Address Family %s:",
10178 afi_safi_print(afi
,
10180 if (p
->afc_adv
[afi
][safi
])
10183 if (p
->afc_recv
[afi
][safi
])
10190 vty_out(vty
, "\n");
10193 /* Hostname capability */
10194 vty_out(vty
, " Hostname Capability:");
10196 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_ADV
)) {
10198 " advertised (name: %s,domain name: %s)",
10199 bgp
->peer_self
->hostname
10203 bgp
->peer_self
->domainname
10208 vty_out(vty
, " not advertised");
10211 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_RCV
)) {
10213 " received (name: %s,domain name: %s)",
10214 p
->hostname
? p
->hostname
10216 p
->domainname
? p
->domainname
10219 vty_out(vty
, " not received");
10222 vty_out(vty
, "\n");
10224 /* Gracefull Restart */
10225 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
)
10226 || CHECK_FLAG(p
->cap
,
10227 PEER_CAP_RESTART_ADV
)) {
10229 " Graceful Restart Capabilty:");
10230 if (CHECK_FLAG(p
->cap
,
10231 PEER_CAP_RESTART_ADV
))
10232 vty_out(vty
, " advertised");
10233 if (CHECK_FLAG(p
->cap
,
10234 PEER_CAP_RESTART_RCV
))
10235 vty_out(vty
, " %sreceived",
10238 PEER_CAP_RESTART_ADV
)
10241 vty_out(vty
, "\n");
10243 if (CHECK_FLAG(p
->cap
,
10244 PEER_CAP_RESTART_RCV
)) {
10245 int restart_af_count
= 0;
10248 " Remote Restart timer is %d seconds\n",
10251 " Address families by peer:\n ");
10253 FOREACH_AFI_SAFI (afi
, safi
)
10258 PEER_CAP_RESTART_AF_RCV
)) {
10271 PEER_CAP_RESTART_AF_PRESERVE_RCV
)
10273 : "not preserved");
10274 restart_af_count
++;
10276 if (!restart_af_count
)
10277 vty_out(vty
, "none");
10278 vty_out(vty
, "\n");
10285 /* graceful restart information */
10286 if (CHECK_FLAG(p
->cap
, PEER_CAP_RESTART_RCV
) || p
->t_gr_restart
10287 || p
->t_gr_stale
) {
10288 json_object
*json_grace
= NULL
;
10289 json_object
*json_grace_send
= NULL
;
10290 json_object
*json_grace_recv
= NULL
;
10291 int eor_send_af_count
= 0;
10292 int eor_receive_af_count
= 0;
10295 json_grace
= json_object_new_object();
10296 json_grace_send
= json_object_new_object();
10297 json_grace_recv
= json_object_new_object();
10299 if (p
->status
== Established
) {
10300 FOREACH_AFI_SAFI (afi
, safi
) {
10301 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
10302 PEER_STATUS_EOR_SEND
)) {
10303 json_object_boolean_true_add(
10305 afi_safi_print(afi
,
10307 eor_send_af_count
++;
10310 FOREACH_AFI_SAFI (afi
, safi
) {
10312 p
->af_sflags
[afi
][safi
],
10313 PEER_STATUS_EOR_RECEIVED
)) {
10314 json_object_boolean_true_add(
10316 afi_safi_print(afi
,
10318 eor_receive_af_count
++;
10323 json_object_object_add(json_grace
, "endOfRibSend",
10325 json_object_object_add(json_grace
, "endOfRibRecv",
10328 if (p
->t_gr_restart
)
10329 json_object_int_add(json_grace
,
10330 "gracefulRestartTimerMsecs",
10331 thread_timer_remain_second(
10336 json_object_int_add(
10338 "gracefulStalepathTimerMsecs",
10339 thread_timer_remain_second(
10343 json_object_object_add(
10344 json_neigh
, "gracefulRestartInfo", json_grace
);
10346 vty_out(vty
, " Graceful restart information:\n");
10347 if (p
->status
== Established
) {
10348 vty_out(vty
, " End-of-RIB send: ");
10349 FOREACH_AFI_SAFI (afi
, safi
) {
10350 if (CHECK_FLAG(p
->af_sflags
[afi
][safi
],
10351 PEER_STATUS_EOR_SEND
)) {
10352 vty_out(vty
, "%s%s",
10353 eor_send_af_count
? ", "
10355 afi_safi_print(afi
,
10357 eor_send_af_count
++;
10360 vty_out(vty
, "\n");
10361 vty_out(vty
, " End-of-RIB received: ");
10362 FOREACH_AFI_SAFI (afi
, safi
) {
10364 p
->af_sflags
[afi
][safi
],
10365 PEER_STATUS_EOR_RECEIVED
)) {
10366 vty_out(vty
, "%s%s",
10367 eor_receive_af_count
10370 afi_safi_print(afi
,
10372 eor_receive_af_count
++;
10375 vty_out(vty
, "\n");
10378 if (p
->t_gr_restart
)
10380 " The remaining time of restart timer is %ld\n",
10381 thread_timer_remain_second(
10386 " The remaining time of stalepath timer is %ld\n",
10387 thread_timer_remain_second(
10392 json_object
*json_stat
= NULL
;
10393 json_stat
= json_object_new_object();
10394 /* Packet counts. */
10395 json_object_int_add(json_stat
, "depthInq", 0);
10396 json_object_int_add(json_stat
, "depthOutq",
10397 (unsigned long)p
->obuf
->count
);
10398 json_object_int_add(json_stat
, "opensSent",
10399 atomic_load_explicit(&p
->open_out
,
10400 memory_order_relaxed
));
10401 json_object_int_add(json_stat
, "opensRecv",
10402 atomic_load_explicit(&p
->open_in
,
10403 memory_order_relaxed
));
10404 json_object_int_add(json_stat
, "notificationsSent",
10405 atomic_load_explicit(&p
->notify_out
,
10406 memory_order_relaxed
));
10407 json_object_int_add(json_stat
, "notificationsRecv",
10408 atomic_load_explicit(&p
->notify_in
,
10409 memory_order_relaxed
));
10410 json_object_int_add(json_stat
, "updatesSent",
10411 atomic_load_explicit(&p
->update_out
,
10412 memory_order_relaxed
));
10413 json_object_int_add(json_stat
, "updatesRecv",
10414 atomic_load_explicit(&p
->update_in
,
10415 memory_order_relaxed
));
10416 json_object_int_add(json_stat
, "keepalivesSent",
10417 atomic_load_explicit(&p
->keepalive_out
,
10418 memory_order_relaxed
));
10419 json_object_int_add(json_stat
, "keepalivesRecv",
10420 atomic_load_explicit(&p
->keepalive_in
,
10421 memory_order_relaxed
));
10422 json_object_int_add(json_stat
, "routeRefreshSent",
10423 atomic_load_explicit(&p
->refresh_out
,
10424 memory_order_relaxed
));
10425 json_object_int_add(json_stat
, "routeRefreshRecv",
10426 atomic_load_explicit(&p
->refresh_in
,
10427 memory_order_relaxed
));
10428 json_object_int_add(json_stat
, "capabilitySent",
10429 atomic_load_explicit(&p
->dynamic_cap_out
,
10430 memory_order_relaxed
));
10431 json_object_int_add(json_stat
, "capabilityRecv",
10432 atomic_load_explicit(&p
->dynamic_cap_in
,
10433 memory_order_relaxed
));
10434 json_object_int_add(json_stat
, "totalSent", PEER_TOTAL_TX(p
));
10435 json_object_int_add(json_stat
, "totalRecv", PEER_TOTAL_RX(p
));
10436 json_object_object_add(json_neigh
, "messageStats", json_stat
);
10438 /* Packet counts. */
10439 vty_out(vty
, " Message statistics:\n");
10440 vty_out(vty
, " Inq depth is 0\n");
10441 vty_out(vty
, " Outq depth is %lu\n",
10442 (unsigned long)p
->obuf
->count
);
10443 vty_out(vty
, " Sent Rcvd\n");
10444 vty_out(vty
, " Opens: %10d %10d\n",
10445 atomic_load_explicit(&p
->open_out
,
10446 memory_order_relaxed
),
10447 atomic_load_explicit(&p
->open_in
,
10448 memory_order_relaxed
));
10449 vty_out(vty
, " Notifications: %10d %10d\n",
10450 atomic_load_explicit(&p
->notify_out
,
10451 memory_order_relaxed
),
10452 atomic_load_explicit(&p
->notify_in
,
10453 memory_order_relaxed
));
10454 vty_out(vty
, " Updates: %10d %10d\n",
10455 atomic_load_explicit(&p
->update_out
,
10456 memory_order_relaxed
),
10457 atomic_load_explicit(&p
->update_in
,
10458 memory_order_relaxed
));
10459 vty_out(vty
, " Keepalives: %10d %10d\n",
10460 atomic_load_explicit(&p
->keepalive_out
,
10461 memory_order_relaxed
),
10462 atomic_load_explicit(&p
->keepalive_in
,
10463 memory_order_relaxed
));
10464 vty_out(vty
, " Route Refresh: %10d %10d\n",
10465 atomic_load_explicit(&p
->refresh_out
,
10466 memory_order_relaxed
),
10467 atomic_load_explicit(&p
->refresh_in
,
10468 memory_order_relaxed
));
10469 vty_out(vty
, " Capability: %10d %10d\n",
10470 atomic_load_explicit(&p
->dynamic_cap_out
,
10471 memory_order_relaxed
),
10472 atomic_load_explicit(&p
->dynamic_cap_in
,
10473 memory_order_relaxed
));
10474 vty_out(vty
, " Total: %10d %10d\n", PEER_TOTAL_TX(p
),
10479 /* advertisement-interval */
10480 json_object_int_add(json_neigh
,
10481 "minBtwnAdvertisementRunsTimerMsecs",
10482 p
->v_routeadv
* 1000);
10484 /* Update-source. */
10485 if (p
->update_if
|| p
->update_source
) {
10487 json_object_string_add(json_neigh
,
10490 else if (p
->update_source
)
10491 json_object_string_add(
10492 json_neigh
, "updateSource",
10493 sockunion2str(p
->update_source
, buf1
,
10497 /* advertisement-interval */
10499 " Minimum time between advertisement runs is %d seconds\n",
10502 /* Update-source. */
10503 if (p
->update_if
|| p
->update_source
) {
10504 vty_out(vty
, " Update source is ");
10506 vty_out(vty
, "%s", p
->update_if
);
10507 else if (p
->update_source
)
10509 sockunion2str(p
->update_source
, buf1
,
10511 vty_out(vty
, "\n");
10514 vty_out(vty
, "\n");
10517 /* Address Family Information */
10518 json_object
*json_hold
= NULL
;
10521 json_hold
= json_object_new_object();
10523 FOREACH_AFI_SAFI (afi
, safi
)
10524 if (p
->afc
[afi
][safi
])
10525 bgp_show_peer_afi(vty
, p
, afi
, safi
, use_json
,
10529 json_object_object_add(json_neigh
, "addressFamilyInfo",
10531 json_object_int_add(json_neigh
, "connectionsEstablished",
10533 json_object_int_add(json_neigh
, "connectionsDropped",
10536 vty_out(vty
, " Connections established %d; dropped %d\n",
10537 p
->established
, p
->dropped
);
10539 if (!p
->last_reset
) {
10541 json_object_string_add(json_neigh
, "lastReset",
10544 vty_out(vty
, " Last reset never\n");
10550 uptime
= bgp_clock();
10551 uptime
-= p
->resettime
;
10552 tm
= gmtime(&uptime
);
10553 json_object_int_add(json_neigh
, "lastResetTimerMsecs",
10554 (tm
->tm_sec
* 1000)
10555 + (tm
->tm_min
* 60000)
10556 + (tm
->tm_hour
* 3600000));
10557 json_object_string_add(
10558 json_neigh
, "lastResetDueTo",
10559 peer_down_str
[(int)p
->last_reset
]);
10560 if (p
->last_reset
== PEER_DOWN_NOTIFY_SEND
10561 || p
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
) {
10562 char errorcodesubcode_hexstr
[5];
10563 char errorcodesubcode_str
[256];
10565 code_str
= bgp_notify_code_str(p
->notify
.code
);
10566 subcode_str
= bgp_notify_subcode_str(
10567 p
->notify
.code
, p
->notify
.subcode
);
10569 sprintf(errorcodesubcode_hexstr
, "%02X%02X",
10570 p
->notify
.code
, p
->notify
.subcode
);
10571 json_object_string_add(json_neigh
,
10572 "lastErrorCodeSubcode",
10573 errorcodesubcode_hexstr
);
10574 snprintf(errorcodesubcode_str
, 255, "%s%s",
10575 code_str
, subcode_str
);
10576 json_object_string_add(json_neigh
,
10577 "lastNotificationReason",
10578 errorcodesubcode_str
);
10579 if (p
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
10580 && p
->notify
.code
== BGP_NOTIFY_CEASE
10581 && (p
->notify
.subcode
10582 == BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
10583 || p
->notify
.subcode
10584 == BGP_NOTIFY_CEASE_ADMIN_RESET
)
10585 && p
->notify
.length
) {
10587 const char *msg_str
;
10589 msg_str
= bgp_notify_admin_message(
10590 msgbuf
, sizeof(msgbuf
),
10591 (uint8_t *)p
->notify
.data
,
10594 json_object_string_add(
10596 "lastShutdownDescription",
10601 vty_out(vty
, " Last reset %s, ",
10602 peer_uptime(p
->resettime
, timebuf
,
10603 BGP_UPTIME_LEN
, 0, NULL
));
10605 if (p
->last_reset
== PEER_DOWN_NOTIFY_SEND
10606 || p
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
) {
10607 code_str
= bgp_notify_code_str(p
->notify
.code
);
10608 subcode_str
= bgp_notify_subcode_str(
10609 p
->notify
.code
, p
->notify
.subcode
);
10610 vty_out(vty
, "due to NOTIFICATION %s (%s%s)\n",
10611 p
->last_reset
== PEER_DOWN_NOTIFY_SEND
10614 code_str
, subcode_str
);
10615 if (p
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
10616 && p
->notify
.code
== BGP_NOTIFY_CEASE
10617 && (p
->notify
.subcode
10618 == BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
10619 || p
->notify
.subcode
10620 == BGP_NOTIFY_CEASE_ADMIN_RESET
)
10621 && p
->notify
.length
) {
10623 const char *msg_str
;
10625 msg_str
= bgp_notify_admin_message(
10626 msgbuf
, sizeof(msgbuf
),
10627 (uint8_t *)p
->notify
.data
,
10631 " Message: \"%s\"\n",
10635 vty_out(vty
, "due to %s\n",
10636 peer_down_str
[(int)p
->last_reset
]);
10639 if (p
->last_reset_cause_size
) {
10640 msg
= p
->last_reset_cause
;
10642 " Message received that caused BGP to send a NOTIFICATION:\n ");
10643 for (i
= 1; i
<= p
->last_reset_cause_size
;
10645 vty_out(vty
, "%02X", *msg
++);
10647 if (i
!= p
->last_reset_cause_size
) {
10649 vty_out(vty
, "\n ");
10650 } else if (i
% 4 == 0) {
10655 vty_out(vty
, "\n");
10660 if (CHECK_FLAG(p
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
)) {
10662 json_object_boolean_true_add(json_neigh
,
10663 "prefixesConfigExceedMax");
10666 " Peer had exceeded the max. no. of prefixes configured.\n");
10668 if (p
->t_pmax_restart
) {
10670 json_object_boolean_true_add(
10671 json_neigh
, "reducePrefixNumFrom");
10672 json_object_int_add(json_neigh
,
10673 "restartInTimerMsec",
10674 thread_timer_remain_second(
10679 " Reduce the no. of prefix from %s, will restart in %ld seconds\n",
10680 p
->host
, thread_timer_remain_second(
10681 p
->t_pmax_restart
));
10684 json_object_boolean_true_add(
10686 "reducePrefixNumAndClearIpBgp");
10689 " Reduce the no. of prefix and clear ip bgp %s to restore peering\n",
10694 /* EBGP Multihop and GTSM */
10695 if (p
->sort
!= BGP_PEER_IBGP
) {
10697 if (p
->gtsm_hops
> 0)
10698 json_object_int_add(json_neigh
,
10699 "externalBgpNbrMaxHopsAway",
10701 else if (p
->ttl
> 1)
10702 json_object_int_add(json_neigh
,
10703 "externalBgpNbrMaxHopsAway",
10706 if (p
->gtsm_hops
> 0)
10708 " External BGP neighbor may be up to %d hops away.\n",
10710 else if (p
->ttl
> 1)
10712 " External BGP neighbor may be up to %d hops away.\n",
10716 if (p
->gtsm_hops
> 0) {
10718 json_object_int_add(json_neigh
,
10719 "internalBgpNbrMaxHopsAway",
10723 " Internal BGP neighbor may be up to %d hops away.\n",
10728 /* Local address. */
10731 json_object_string_add(json_neigh
, "hostLocal",
10732 sockunion2str(p
->su_local
, buf1
,
10734 json_object_int_add(json_neigh
, "portLocal",
10735 ntohs(p
->su_local
->sin
.sin_port
));
10737 vty_out(vty
, "Local host: %s, Local port: %d\n",
10738 sockunion2str(p
->su_local
, buf1
, SU_ADDRSTRLEN
),
10739 ntohs(p
->su_local
->sin
.sin_port
));
10742 /* Remote address. */
10743 if (p
->su_remote
) {
10745 json_object_string_add(json_neigh
, "hostForeign",
10746 sockunion2str(p
->su_remote
, buf1
,
10748 json_object_int_add(json_neigh
, "portForeign",
10749 ntohs(p
->su_remote
->sin
.sin_port
));
10751 vty_out(vty
, "Foreign host: %s, Foreign port: %d\n",
10752 sockunion2str(p
->su_remote
, buf1
,
10754 ntohs(p
->su_remote
->sin
.sin_port
));
10757 /* Nexthop display. */
10760 json_object_string_add(json_neigh
, "nexthop",
10762 &p
->nexthop
.v4
, buf1
,
10764 json_object_string_add(json_neigh
, "nexthopGlobal",
10765 inet_ntop(AF_INET6
,
10766 &p
->nexthop
.v6_global
,
10767 buf1
, sizeof(buf1
)));
10768 json_object_string_add(json_neigh
, "nexthopLocal",
10769 inet_ntop(AF_INET6
,
10770 &p
->nexthop
.v6_local
,
10771 buf1
, sizeof(buf1
)));
10772 if (p
->shared_network
)
10773 json_object_string_add(json_neigh
,
10777 json_object_string_add(json_neigh
,
10779 "nonSharedNetwork");
10781 vty_out(vty
, "Nexthop: %s\n",
10782 inet_ntop(AF_INET
, &p
->nexthop
.v4
, buf1
,
10784 vty_out(vty
, "Nexthop global: %s\n",
10785 inet_ntop(AF_INET6
, &p
->nexthop
.v6_global
, buf1
,
10787 vty_out(vty
, "Nexthop local: %s\n",
10788 inet_ntop(AF_INET6
, &p
->nexthop
.v6_local
, buf1
,
10790 vty_out(vty
, "BGP connection: %s\n",
10791 p
->shared_network
? "shared network"
10792 : "non shared network");
10796 /* Timer information. */
10798 json_object_int_add(json_neigh
, "connectRetryTimer",
10800 if (p
->status
== Established
&& p
->rtt
)
10801 json_object_int_add(json_neigh
, "estimatedRttInMsecs",
10804 json_object_int_add(
10805 json_neigh
, "nextStartTimerDueInMsecs",
10806 thread_timer_remain_second(p
->t_start
) * 1000);
10808 json_object_int_add(
10809 json_neigh
, "nextConnectTimerDueInMsecs",
10810 thread_timer_remain_second(p
->t_connect
)
10812 if (p
->t_routeadv
) {
10813 json_object_int_add(json_neigh
, "mraiInterval",
10815 json_object_int_add(
10816 json_neigh
, "mraiTimerExpireInMsecs",
10817 thread_timer_remain_second(p
->t_routeadv
)
10821 json_object_int_add(json_neigh
, "authenticationEnabled",
10825 json_object_string_add(json_neigh
, "readThread", "on");
10827 json_object_string_add(json_neigh
, "readThread", "off");
10829 if (CHECK_FLAG(p
->thread_flags
, PEER_THREAD_WRITES_ON
))
10830 json_object_string_add(json_neigh
, "writeThread", "on");
10832 json_object_string_add(json_neigh
, "writeThread",
10835 vty_out(vty
, "BGP Connect Retry Timer in Seconds: %d\n",
10837 if (p
->status
== Established
&& p
->rtt
)
10838 vty_out(vty
, "Estimated round trip time: %d ms\n",
10841 vty_out(vty
, "Next start timer due in %ld seconds\n",
10842 thread_timer_remain_second(p
->t_start
));
10844 vty_out(vty
, "Next connect timer due in %ld seconds\n",
10845 thread_timer_remain_second(p
->t_connect
));
10848 "MRAI (interval %u) timer expires in %ld seconds\n",
10850 thread_timer_remain_second(p
->t_routeadv
));
10852 vty_out(vty
, "Peer Authentication Enabled\n");
10854 vty_out(vty
, "Read thread: %s Write thread: %s FD used: %d\n",
10855 p
->t_read
? "on" : "off",
10856 CHECK_FLAG(p
->thread_flags
, PEER_THREAD_WRITES_ON
)
10861 if (p
->notify
.code
== BGP_NOTIFY_OPEN_ERR
10862 && p
->notify
.subcode
== BGP_NOTIFY_OPEN_UNSUP_CAPBL
)
10863 bgp_capability_vty_out(vty
, p
, use_json
, json_neigh
);
10866 vty_out(vty
, "\n");
10868 /* BFD information. */
10869 bgp_bfd_show_info(vty
, p
, use_json
, json_neigh
);
10872 if (p
->conf_if
) /* Configured interface name. */
10873 json_object_object_add(json
, p
->conf_if
, json_neigh
);
10874 else /* Configured IP address. */
10875 json_object_object_add(json
, p
->host
, json_neigh
);
10879 static int bgp_show_neighbor(struct vty
*vty
, struct bgp
*bgp
,
10880 enum show_type type
, union sockunion
*su
,
10881 const char *conf_if
, bool use_json
,
10884 struct listnode
*node
, *nnode
;
10887 bool nbr_output
= false;
10888 afi_t afi
= AFI_MAX
;
10889 safi_t safi
= SAFI_MAX
;
10891 if (type
== show_ipv4_peer
|| type
== show_ipv4_all
) {
10893 } else if (type
== show_ipv6_peer
|| type
== show_ipv6_all
) {
10897 for (ALL_LIST_ELEMENTS(bgp
->peer
, node
, nnode
, peer
)) {
10898 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
10903 bgp_show_peer(vty
, peer
, use_json
, json
);
10909 && !strcmp(peer
->conf_if
, conf_if
))
10911 && !strcmp(peer
->hostname
, conf_if
))) {
10913 bgp_show_peer(vty
, peer
, use_json
,
10917 if (sockunion_same(&peer
->su
, su
)) {
10919 bgp_show_peer(vty
, peer
, use_json
,
10924 case show_ipv4_peer
:
10925 case show_ipv6_peer
:
10926 FOREACH_SAFI (safi
) {
10927 if (peer
->afc
[afi
][safi
]) {
10930 && !strcmp(peer
->conf_if
, conf_if
))
10932 && !strcmp(peer
->hostname
, conf_if
))) {
10934 bgp_show_peer(vty
, peer
, use_json
,
10939 if (sockunion_same(&peer
->su
, su
)) {
10941 bgp_show_peer(vty
, peer
, use_json
,
10949 case show_ipv4_all
:
10950 case show_ipv6_all
:
10951 FOREACH_SAFI (safi
) {
10952 if (peer
->afc
[afi
][safi
]) {
10953 bgp_show_peer(vty
, peer
, use_json
, json
);
10962 if ((type
== show_peer
|| type
== show_ipv4_peer
||
10963 type
== show_ipv6_peer
) && !find
) {
10965 json_object_boolean_true_add(json
, "bgpNoSuchNeighbor");
10967 vty_out(vty
, "%% No such neighbor in this view/vrf\n");
10970 if (type
!= show_peer
&& type
!= show_ipv4_peer
&&
10971 type
!= show_ipv6_peer
&& !nbr_output
&& !use_json
)
10972 vty_out(vty
, "%% No BGP neighbors found\n");
10975 vty_out(vty
, "%s\n", json_object_to_json_string_ext(
10976 json
, JSON_C_TO_STRING_PRETTY
));
10978 vty_out(vty
, "\n");
10981 return CMD_SUCCESS
;
10984 static void bgp_show_all_instances_neighbors_vty(struct vty
*vty
,
10985 enum show_type type
,
10986 const char *ip_str
,
10989 struct listnode
*node
, *nnode
;
10991 union sockunion su
;
10992 json_object
*json
= NULL
;
10993 int ret
, is_first
= 1;
10994 bool nbr_output
= false;
10997 vty_out(vty
, "{\n");
10999 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
11002 if (!(json
= json_object_new_object())) {
11004 EC_BGP_JSON_MEM_ERROR
,
11005 "Unable to allocate memory for JSON object");
11007 "{\"error\": {\"message:\": \"Unable to allocate memory for JSON object\"}}}\n");
11011 json_object_int_add(json
, "vrfId",
11012 (bgp
->vrf_id
== VRF_UNKNOWN
)
11014 : (int64_t)bgp
->vrf_id
);
11015 json_object_string_add(
11017 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
11022 vty_out(vty
, ",\n");
11026 vty_out(vty
, "\"%s\":",
11027 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
11031 vty_out(vty
, "\nInstance %s:\n",
11032 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
11037 if (type
== show_peer
|| type
== show_ipv4_peer
||
11038 type
== show_ipv6_peer
) {
11039 ret
= str2sockunion(ip_str
, &su
);
11041 bgp_show_neighbor(vty
, bgp
, type
, NULL
, ip_str
,
11044 bgp_show_neighbor(vty
, bgp
, type
, &su
, NULL
,
11047 bgp_show_neighbor(vty
, bgp
, type
, NULL
, NULL
,
11050 json_object_free(json
);
11054 vty_out(vty
, "}\n");
11055 json_object_free(json
);
11057 else if (!nbr_output
)
11058 vty_out(vty
, "%% BGP instance not found\n");
11061 static int bgp_show_neighbor_vty(struct vty
*vty
, const char *name
,
11062 enum show_type type
, const char *ip_str
,
11067 union sockunion su
;
11068 json_object
*json
= NULL
;
11071 if (strmatch(name
, "all")) {
11072 bgp_show_all_instances_neighbors_vty(vty
, type
, ip_str
,
11074 return CMD_SUCCESS
;
11076 bgp
= bgp_lookup_by_name(name
);
11079 json
= json_object_new_object();
11080 vty_out(vty
, "%s\n",
11081 json_object_to_json_string_ext(
11083 JSON_C_TO_STRING_PRETTY
));
11084 json_object_free(json
);
11087 "%% BGP instance not found\n");
11089 return CMD_WARNING
;
11093 bgp
= bgp_get_default();
11097 json
= json_object_new_object();
11099 ret
= str2sockunion(ip_str
, &su
);
11101 bgp_show_neighbor(vty
, bgp
, type
, NULL
, ip_str
,
11104 bgp_show_neighbor(vty
, bgp
, type
, &su
, NULL
,
11107 bgp_show_neighbor(vty
, bgp
, type
, NULL
, NULL
, use_json
,
11110 json_object_free(json
);
11113 vty_out(vty
, "{}\n");
11115 vty_out(vty
, "%% BGP instance not found\n");
11118 return CMD_SUCCESS
;
11121 /* "show [ip] bgp neighbors" commands. */
11122 DEFUN (show_ip_bgp_neighbors
,
11123 show_ip_bgp_neighbors_cmd
,
11124 "show [ip] bgp [<view|vrf> VIEWVRFNAME] [<ipv4|ipv6>] neighbors [<A.B.C.D|X:X::X:X|WORD>] [json]",
11128 BGP_INSTANCE_HELP_STR
11131 "Detailed information on TCP and BGP neighbor connections\n"
11132 "Neighbor to display information about\n"
11133 "Neighbor to display information about\n"
11134 "Neighbor on BGP configured interface\n"
11138 char *sh_arg
= NULL
;
11139 enum show_type sh_type
;
11140 afi_t afi
= AFI_MAX
;
11142 bool uj
= use_json(argc
, argv
);
11146 /* [<vrf> VIEWVRFNAME] */
11147 if (argv_find(argv
, argc
, "vrf", &idx
)) {
11148 vrf
= argv
[idx
+ 1]->arg
;
11149 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
11151 } else if (argv_find(argv
, argc
, "view", &idx
))
11152 /* [<view> VIEWVRFNAME] */
11153 vrf
= argv
[idx
+ 1]->arg
;
11157 if (argv_find(argv
, argc
, "ipv4", &idx
)) {
11158 sh_type
= show_ipv4_all
;
11160 } else if (argv_find(argv
, argc
, "ipv6", &idx
)) {
11161 sh_type
= show_ipv6_all
;
11164 sh_type
= show_all
;
11167 if (argv_find(argv
, argc
, "A.B.C.D", &idx
)
11168 || argv_find(argv
, argc
, "X:X::X:X", &idx
)
11169 || argv_find(argv
, argc
, "WORD", &idx
)) {
11170 sh_type
= show_peer
;
11171 sh_arg
= argv
[idx
]->arg
;
11174 if (sh_type
== show_peer
&& afi
== AFI_IP
) {
11175 sh_type
= show_ipv4_peer
;
11176 } else if (sh_type
== show_peer
&& afi
== AFI_IP6
) {
11177 sh_type
= show_ipv6_peer
;
11180 return bgp_show_neighbor_vty(vty
, vrf
, sh_type
, sh_arg
, uj
);
11183 /* Show BGP's AS paths internal data. There are both `show [ip] bgp
11184 paths' and `show ip mbgp paths'. Those functions results are the
11186 DEFUN (show_ip_bgp_paths
,
11187 show_ip_bgp_paths_cmd
,
11188 "show [ip] bgp ["BGP_SAFI_CMD_STR
"] paths",
11193 "Path information\n")
11195 vty_out(vty
, "Address Refcnt Path\n");
11196 aspath_print_all_vty(vty
);
11197 return CMD_SUCCESS
;
11202 static void community_show_all_iterator(struct hash_bucket
*bucket
,
11205 struct community
*com
;
11207 com
= (struct community
*)bucket
->data
;
11208 vty_out(vty
, "[%p] (%ld) %s\n", (void *)com
, com
->refcnt
,
11209 community_str(com
, false));
11212 /* Show BGP's community internal data. */
11213 DEFUN (show_ip_bgp_community_info
,
11214 show_ip_bgp_community_info_cmd
,
11215 "show [ip] bgp community-info",
11219 "List all bgp community information\n")
11221 vty_out(vty
, "Address Refcnt Community\n");
11223 hash_iterate(community_hash(),
11224 (void (*)(struct hash_bucket
*,
11225 void *))community_show_all_iterator
,
11228 return CMD_SUCCESS
;
11231 static void lcommunity_show_all_iterator(struct hash_bucket
*bucket
,
11234 struct lcommunity
*lcom
;
11236 lcom
= (struct lcommunity
*)bucket
->data
;
11237 vty_out(vty
, "[%p] (%ld) %s\n", (void *)lcom
, lcom
->refcnt
,
11238 lcommunity_str(lcom
, false));
11241 /* Show BGP's community internal data. */
11242 DEFUN (show_ip_bgp_lcommunity_info
,
11243 show_ip_bgp_lcommunity_info_cmd
,
11244 "show ip bgp large-community-info",
11248 "List all bgp large-community information\n")
11250 vty_out(vty
, "Address Refcnt Large-community\n");
11252 hash_iterate(lcommunity_hash(),
11253 (void (*)(struct hash_bucket
*,
11254 void *))lcommunity_show_all_iterator
,
11257 return CMD_SUCCESS
;
11261 DEFUN (show_ip_bgp_attr_info
,
11262 show_ip_bgp_attr_info_cmd
,
11263 "show [ip] bgp attribute-info",
11267 "List all bgp attribute information\n")
11269 attr_show_all(vty
);
11270 return CMD_SUCCESS
;
11273 static int bgp_show_route_leak_vty(struct vty
*vty
, const char *name
,
11274 afi_t afi
, safi_t safi
,
11275 bool use_json
, json_object
*json
)
11278 struct listnode
*node
;
11280 char buf1
[INET6_ADDRSTRLEN
];
11282 vpn_policy_direction_t dir
;
11285 json_object
*json_import_vrfs
= NULL
;
11286 json_object
*json_export_vrfs
= NULL
;
11288 bgp
= name
? bgp_lookup_by_name(name
) : bgp_get_default();
11291 vty_out(vty
, "%s\n",
11292 json_object_to_json_string_ext(
11294 JSON_C_TO_STRING_PRETTY
));
11295 json_object_free(json
);
11297 return CMD_WARNING
;
11300 /* Provide context for the block */
11301 json_object_string_add(json
, "vrf", name
? name
: "default");
11302 json_object_string_add(json
, "afiSafi",
11303 afi_safi_print(afi
, safi
));
11305 if (!CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
11306 BGP_CONFIG_VRF_TO_VRF_IMPORT
)) {
11307 json_object_string_add(json
, "importFromVrfs", "none");
11308 json_object_string_add(json
, "importRts", "none");
11310 json_import_vrfs
= json_object_new_array();
11312 for (ALL_LIST_ELEMENTS_RO(
11313 bgp
->vpn_policy
[afi
].import_vrf
,
11315 json_object_array_add(json_import_vrfs
,
11316 json_object_new_string(vname
));
11318 json_object_object_add(json
, "importFromVrfs",
11320 dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
11321 if (bgp
->vpn_policy
[afi
].rtlist
[dir
]) {
11322 ecom_str
= ecommunity_ecom2str(
11323 bgp
->vpn_policy
[afi
].rtlist
[dir
],
11324 ECOMMUNITY_FORMAT_ROUTE_MAP
, 0);
11325 json_object_string_add(json
, "importRts",
11327 XFREE(MTYPE_ECOMMUNITY_STR
, ecom_str
);
11329 json_object_string_add(json
, "importRts",
11333 if (!CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
11334 BGP_CONFIG_VRF_TO_VRF_EXPORT
)) {
11335 json_object_string_add(json
, "exportToVrfs", "none");
11336 json_object_string_add(json
, "routeDistinguisher",
11338 json_object_string_add(json
, "exportRts", "none");
11340 json_export_vrfs
= json_object_new_array();
11342 for (ALL_LIST_ELEMENTS_RO(
11343 bgp
->vpn_policy
[afi
].export_vrf
,
11345 json_object_array_add(json_export_vrfs
,
11346 json_object_new_string(vname
));
11347 json_object_object_add(json
, "exportToVrfs",
11349 json_object_string_add(json
, "routeDistinguisher",
11350 prefix_rd2str(&bgp
->vpn_policy
[afi
].tovpn_rd
,
11351 buf1
, RD_ADDRSTRLEN
));
11353 dir
= BGP_VPN_POLICY_DIR_TOVPN
;
11354 if (bgp
->vpn_policy
[afi
].rtlist
[dir
]) {
11355 ecom_str
= ecommunity_ecom2str(
11356 bgp
->vpn_policy
[afi
].rtlist
[dir
],
11357 ECOMMUNITY_FORMAT_ROUTE_MAP
, 0);
11358 json_object_string_add(json
, "exportRts",
11360 XFREE(MTYPE_ECOMMUNITY_STR
, ecom_str
);
11362 json_object_string_add(json
, "exportRts",
11367 vty_out(vty
, "%s\n",
11368 json_object_to_json_string_ext(json
,
11369 JSON_C_TO_STRING_PRETTY
));
11370 json_object_free(json
);
11373 bgp
= name
? bgp_lookup_by_name(name
) : bgp_get_default();
11376 vty_out(vty
, "%% No such BGP instance exist\n");
11377 return CMD_WARNING
;
11380 if (!CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
11381 BGP_CONFIG_VRF_TO_VRF_IMPORT
))
11383 "This VRF is not importing %s routes from any other VRF\n",
11384 afi_safi_print(afi
, safi
));
11387 "This VRF is importing %s routes from the following VRFs:\n",
11388 afi_safi_print(afi
, safi
));
11390 for (ALL_LIST_ELEMENTS_RO(
11391 bgp
->vpn_policy
[afi
].import_vrf
,
11393 vty_out(vty
, " %s\n", vname
);
11395 dir
= BGP_VPN_POLICY_DIR_FROMVPN
;
11397 if (bgp
->vpn_policy
[afi
].rtlist
[dir
]) {
11398 ecom_str
= ecommunity_ecom2str(
11399 bgp
->vpn_policy
[afi
].rtlist
[dir
],
11400 ECOMMUNITY_FORMAT_ROUTE_MAP
, 0);
11401 vty_out(vty
, "Import RT(s): %s\n", ecom_str
);
11403 XFREE(MTYPE_ECOMMUNITY_STR
, ecom_str
);
11405 vty_out(vty
, "Import RT(s):\n");
11408 if (!CHECK_FLAG(bgp
->af_flags
[afi
][safi
],
11409 BGP_CONFIG_VRF_TO_VRF_EXPORT
))
11411 "This VRF is not exporting %s routes to any other VRF\n",
11412 afi_safi_print(afi
, safi
));
11415 "This VRF is exporting %s routes to the following VRFs:\n",
11416 afi_safi_print(afi
, safi
));
11418 for (ALL_LIST_ELEMENTS_RO(
11419 bgp
->vpn_policy
[afi
].export_vrf
,
11421 vty_out(vty
, " %s\n", vname
);
11423 vty_out(vty
, "RD: %s\n",
11424 prefix_rd2str(&bgp
->vpn_policy
[afi
].tovpn_rd
,
11425 buf1
, RD_ADDRSTRLEN
));
11427 dir
= BGP_VPN_POLICY_DIR_TOVPN
;
11428 if (bgp
->vpn_policy
[afi
].rtlist
[dir
]) {
11429 ecom_str
= ecommunity_ecom2str(
11430 bgp
->vpn_policy
[afi
].rtlist
[dir
],
11431 ECOMMUNITY_FORMAT_ROUTE_MAP
, 0);
11432 vty_out(vty
, "Export RT: %s\n", ecom_str
);
11433 XFREE(MTYPE_ECOMMUNITY_STR
, ecom_str
);
11435 vty_out(vty
, "Import RT(s):\n");
11439 return CMD_SUCCESS
;
11442 static int bgp_show_all_instance_route_leak_vty(struct vty
*vty
, afi_t afi
,
11443 safi_t safi
, bool use_json
)
11445 struct listnode
*node
, *nnode
;
11447 char *vrf_name
= NULL
;
11448 json_object
*json
= NULL
;
11449 json_object
*json_vrf
= NULL
;
11450 json_object
*json_vrfs
= NULL
;
11453 json
= json_object_new_object();
11454 json_vrfs
= json_object_new_object();
11457 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
11459 if (bgp
->inst_type
!= BGP_INSTANCE_TYPE_DEFAULT
)
11460 vrf_name
= bgp
->name
;
11463 json_vrf
= json_object_new_object();
11465 vty_out(vty
, "\nInstance %s:\n",
11466 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
11467 ? VRF_DEFAULT_NAME
: bgp
->name
);
11469 bgp_show_route_leak_vty(vty
, vrf_name
, afi
, safi
, 0, json_vrf
);
11471 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
11472 json_object_object_add(json_vrfs
,
11473 VRF_DEFAULT_NAME
, json_vrf
);
11475 json_object_object_add(json_vrfs
, vrf_name
,
11481 json_object_object_add(json
, "vrfs", json_vrfs
);
11482 vty_out(vty
, "%s\n", json_object_to_json_string_ext(json
,
11483 JSON_C_TO_STRING_PRETTY
));
11484 json_object_free(json
);
11487 return CMD_SUCCESS
;
11490 /* "show [ip] bgp route-leak" command. */
11491 DEFUN (show_ip_bgp_route_leak
,
11492 show_ip_bgp_route_leak_cmd
,
11493 "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR
" ["BGP_SAFI_CMD_STR
"]] route-leak [json]",
11497 BGP_INSTANCE_HELP_STR
11500 "Route leaking information\n"
11504 afi_t afi
= AFI_MAX
;
11505 safi_t safi
= SAFI_MAX
;
11507 bool uj
= use_json(argc
, argv
);
11509 json_object
*json
= NULL
;
11511 /* show [ip] bgp */
11512 if (argv_find(argv
, argc
, "ip", &idx
)) {
11514 safi
= SAFI_UNICAST
;
11516 /* [vrf VIEWVRFNAME] */
11517 if (argv_find(argv
, argc
, "view", &idx
)) {
11519 "%% This command is not applicable to BGP views\n");
11520 return CMD_WARNING
;
11523 if (argv_find(argv
, argc
, "vrf", &idx
)) {
11524 vrf
= argv
[idx
+ 1]->arg
;
11525 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
11528 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
11529 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
)) {
11530 argv_find_and_parse_safi(argv
, argc
, &idx
, &safi
);
11533 if (!((afi
== AFI_IP
|| afi
== AFI_IP6
) && safi
== SAFI_UNICAST
)) {
11535 "%% This command is applicable only for unicast ipv4|ipv6\n");
11536 return CMD_WARNING
;
11539 if (vrf
&& strmatch(vrf
, "all"))
11540 return bgp_show_all_instance_route_leak_vty(vty
, afi
, safi
, uj
);
11543 json
= json_object_new_object();
11545 return bgp_show_route_leak_vty(vty
, vrf
, afi
, safi
, uj
, json
);
11548 static void bgp_show_all_instances_updgrps_vty(struct vty
*vty
, afi_t afi
,
11551 struct listnode
*node
, *nnode
;
11554 for (ALL_LIST_ELEMENTS(bm
->bgp
, node
, nnode
, bgp
)) {
11555 vty_out(vty
, "\nInstance %s:\n",
11556 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
11559 update_group_show(bgp
, afi
, safi
, vty
, 0);
11563 static int bgp_show_update_groups(struct vty
*vty
, const char *name
, int afi
,
11564 int safi
, uint64_t subgrp_id
)
11569 if (strmatch(name
, "all")) {
11570 bgp_show_all_instances_updgrps_vty(vty
, afi
, safi
);
11571 return CMD_SUCCESS
;
11573 bgp
= bgp_lookup_by_name(name
);
11576 bgp
= bgp_get_default();
11580 update_group_show(bgp
, afi
, safi
, vty
, subgrp_id
);
11581 return CMD_SUCCESS
;
11584 DEFUN (show_ip_bgp_updgrps
,
11585 show_ip_bgp_updgrps_cmd
,
11586 "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR
" ["BGP_SAFI_WITH_LABEL_CMD_STR
"]] update-groups [SUBGROUP-ID]",
11590 BGP_INSTANCE_HELP_STR
11592 BGP_SAFI_WITH_LABEL_HELP_STR
11593 "Detailed info about dynamic update groups\n"
11594 "Specific subgroup to display detailed info for\n")
11597 afi_t afi
= AFI_IP6
;
11598 safi_t safi
= SAFI_UNICAST
;
11599 uint64_t subgrp_id
= 0;
11603 /* show [ip] bgp */
11604 if (argv_find(argv
, argc
, "ip", &idx
))
11606 /* [<vrf> VIEWVRFNAME] */
11607 if (argv_find(argv
, argc
, "vrf", &idx
)) {
11608 vrf
= argv
[idx
+ 1]->arg
;
11609 if (vrf
&& strmatch(vrf
, VRF_DEFAULT_NAME
))
11611 } else if (argv_find(argv
, argc
, "view", &idx
))
11612 /* [<view> VIEWVRFNAME] */
11613 vrf
= argv
[idx
+ 1]->arg
;
11614 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
11615 if (argv_find_and_parse_afi(argv
, argc
, &idx
, &afi
)) {
11616 argv_find_and_parse_safi(argv
, argc
, &idx
, &safi
);
11619 /* get subgroup id, if provided */
11621 if (argv
[idx
]->type
== VARIABLE_TKN
)
11622 subgrp_id
= strtoull(argv
[idx
]->arg
, NULL
, 10);
11624 return (bgp_show_update_groups(vty
, vrf
, afi
, safi
, subgrp_id
));
11627 DEFUN (show_bgp_instance_all_ipv6_updgrps
,
11628 show_bgp_instance_all_ipv6_updgrps_cmd
,
11629 "show [ip] bgp <view|vrf> all update-groups",
11633 BGP_INSTANCE_ALL_HELP_STR
11634 "Detailed info about dynamic update groups\n")
11636 bgp_show_all_instances_updgrps_vty(vty
, AFI_IP6
, SAFI_UNICAST
);
11637 return CMD_SUCCESS
;
11640 DEFUN (show_bgp_l2vpn_evpn_updgrps
,
11641 show_bgp_l2vpn_evpn_updgrps_cmd
,
11642 "show [ip] bgp l2vpn evpn update-groups",
11646 "l2vpn address family\n"
11647 "evpn sub-address family\n"
11648 "Detailed info about dynamic update groups\n")
11651 uint64_t subgrp_id
= 0;
11653 bgp_show_update_groups(vty
, vrf
, AFI_L2VPN
, SAFI_EVPN
, subgrp_id
);
11654 return CMD_SUCCESS
;
11657 DEFUN (show_bgp_updgrps_stats
,
11658 show_bgp_updgrps_stats_cmd
,
11659 "show [ip] bgp update-groups statistics",
11663 "Detailed info about dynamic update groups\n"
11668 bgp
= bgp_get_default();
11670 update_group_show_stats(bgp
, vty
);
11672 return CMD_SUCCESS
;
11675 DEFUN (show_bgp_instance_updgrps_stats
,
11676 show_bgp_instance_updgrps_stats_cmd
,
11677 "show [ip] bgp <view|vrf> VIEWVRFNAME update-groups statistics",
11681 BGP_INSTANCE_HELP_STR
11682 "Detailed info about dynamic update groups\n"
11688 bgp
= bgp_lookup_by_name(argv
[idx_word
]->arg
);
11690 update_group_show_stats(bgp
, vty
);
11692 return CMD_SUCCESS
;
11695 static void show_bgp_updgrps_adj_info_aux(struct vty
*vty
, const char *name
,
11696 afi_t afi
, safi_t safi
,
11697 const char *what
, uint64_t subgrp_id
)
11702 bgp
= bgp_lookup_by_name(name
);
11704 bgp
= bgp_get_default();
11707 if (!strcmp(what
, "advertise-queue"))
11708 update_group_show_adj_queue(bgp
, afi
, safi
, vty
,
11710 else if (!strcmp(what
, "advertised-routes"))
11711 update_group_show_advertised(bgp
, afi
, safi
, vty
,
11713 else if (!strcmp(what
, "packet-queue"))
11714 update_group_show_packet_queue(bgp
, afi
, safi
, vty
,
11719 DEFPY(show_ip_bgp_instance_updgrps_adj_s
,
11720 show_ip_bgp_instance_updgrps_adj_s_cmd
,
11721 "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",
11722 SHOW_STR IP_STR BGP_STR BGP_INSTANCE_HELP_STR BGP_AFI_HELP_STR
11724 "Detailed info about dynamic update groups\n"
11725 "Specific subgroup to display info for\n"
11726 "Advertisement queue\n"
11727 "Announced routes\n"
11730 uint64_t subgrp_id
= 0;
11734 subgrp_id
= strtoull(sgid
, NULL
, 10);
11739 afiz
= bgp_vty_afi_from_str(afi
);
11743 afiz
= bgp_vty_afi_from_str(afi
);
11744 if (afiz
!= AFI_IP
)
11746 "%% Cannot specify both 'ip' and 'ipv6'\n");
11747 return CMD_WARNING
;
11750 safiz
= safi
? bgp_vty_safi_from_str(safi
) : SAFI_UNICAST
;
11752 show_bgp_updgrps_adj_info_aux(vty
, vrf
, afiz
, safiz
, rtq
, subgrp_id
);
11753 return CMD_SUCCESS
;
11756 static int bgp_show_one_peer_group(struct vty
*vty
, struct peer_group
*group
)
11758 struct listnode
*node
, *nnode
;
11759 struct prefix
*range
;
11762 char buf
[PREFIX2STR_BUFFER
];
11765 const char *peer_status
;
11766 const char *af_str
;
11771 conf
= group
->conf
;
11773 if (conf
->as_type
== AS_SPECIFIED
|| conf
->as_type
== AS_EXTERNAL
) {
11774 vty_out(vty
, "\nBGP peer-group %s, remote AS %" PRIu32
"\n",
11775 group
->name
, conf
->as
);
11776 } else if (conf
->as_type
== AS_INTERNAL
) {
11777 vty_out(vty
, "\nBGP peer-group %s, remote AS %" PRIu32
"\n",
11778 group
->name
, group
->bgp
->as
);
11780 vty_out(vty
, "\nBGP peer-group %s\n", group
->name
);
11783 if ((group
->bgp
->as
== conf
->as
) || (conf
->as_type
== AS_INTERNAL
))
11784 vty_out(vty
, " Peer-group type is internal\n");
11786 vty_out(vty
, " Peer-group type is external\n");
11788 /* Display AFs configured. */
11789 vty_out(vty
, " Configured address-families:");
11790 FOREACH_AFI_SAFI (afi
, safi
) {
11791 if (conf
->afc
[afi
][safi
]) {
11793 vty_out(vty
, " %s;", afi_safi_print(afi
, safi
));
11797 vty_out(vty
, " none\n");
11799 vty_out(vty
, "\n");
11801 /* Display listen ranges (for dynamic neighbors), if any */
11802 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++) {
11805 else if (afi
== AFI_IP6
)
11809 lr_count
= listcount(group
->listen_range
[afi
]);
11811 vty_out(vty
, " %d %s listen range(s)\n", lr_count
,
11815 for (ALL_LIST_ELEMENTS(group
->listen_range
[afi
], node
,
11817 prefix2str(range
, buf
, sizeof(buf
));
11818 vty_out(vty
, " %s\n", buf
);
11823 /* Display group members and their status */
11824 if (listcount(group
->peer
)) {
11825 vty_out(vty
, " Peer-group members:\n");
11826 for (ALL_LIST_ELEMENTS(group
->peer
, node
, nnode
, peer
)) {
11827 if (CHECK_FLAG(peer
->flags
, PEER_FLAG_SHUTDOWN
))
11828 peer_status
= "Idle (Admin)";
11829 else if (CHECK_FLAG(peer
->sflags
,
11830 PEER_STATUS_PREFIX_OVERFLOW
))
11831 peer_status
= "Idle (PfxCt)";
11833 peer_status
= lookup_msg(bgp_status_msg
,
11834 peer
->status
, NULL
);
11836 dynamic
= peer_dynamic_neighbor(peer
);
11837 vty_out(vty
, " %s %s %s \n", peer
->host
,
11838 dynamic
? "(dynamic)" : "", peer_status
);
11842 return CMD_SUCCESS
;
11845 static int bgp_show_peer_group_vty(struct vty
*vty
, const char *name
,
11846 const char *group_name
)
11849 struct listnode
*node
, *nnode
;
11850 struct peer_group
*group
;
11851 bool found
= false;
11853 bgp
= name
? bgp_lookup_by_name(name
) : bgp_get_default();
11856 vty_out(vty
, "%% BGP instance not found\n");
11857 return CMD_WARNING
;
11860 for (ALL_LIST_ELEMENTS(bgp
->group
, node
, nnode
, group
)) {
11862 if (strmatch(group
->name
, group_name
)) {
11863 bgp_show_one_peer_group(vty
, group
);
11868 bgp_show_one_peer_group(vty
, group
);
11872 if (group_name
&& !found
)
11873 vty_out(vty
, "%% No such peer-group\n");
11875 return CMD_SUCCESS
;
11878 DEFUN (show_ip_bgp_peer_groups
,
11879 show_ip_bgp_peer_groups_cmd
,
11880 "show [ip] bgp [<view|vrf> VIEWVRFNAME] peer-group [PGNAME]",
11884 BGP_INSTANCE_HELP_STR
11885 "Detailed information on BGP peer groups\n"
11886 "Peer group name\n")
11891 vrf
= argv_find(argv
, argc
, "VIEWVRFNAME", &idx
) ? argv
[idx
]->arg
11893 pg
= argv_find(argv
, argc
, "PGNAME", &idx
) ? argv
[idx
]->arg
: NULL
;
11895 return bgp_show_peer_group_vty(vty
, vrf
, pg
);
11899 /* Redistribute VTY commands. */
11901 DEFUN (bgp_redistribute_ipv4
,
11902 bgp_redistribute_ipv4_cmd
,
11903 "redistribute " FRR_IP_REDIST_STR_BGPD
,
11904 "Redistribute information from another routing protocol\n"
11905 FRR_IP_REDIST_HELP_STR_BGPD
)
11907 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11908 int idx_protocol
= 1;
11911 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
11913 vty_out(vty
, "%% Invalid route type\n");
11914 return CMD_WARNING_CONFIG_FAILED
;
11917 bgp_redist_add(bgp
, AFI_IP
, type
, 0);
11918 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0, false);
11922 bgp_redistribute_ipv4
, bgp_redistribute_ipv4_hidden_cmd
,
11923 "redistribute " FRR_IP_REDIST_STR_BGPD
,
11924 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
)
11926 DEFUN (bgp_redistribute_ipv4_rmap
,
11927 bgp_redistribute_ipv4_rmap_cmd
,
11928 "redistribute " FRR_IP_REDIST_STR_BGPD
" route-map WORD",
11929 "Redistribute information from another routing protocol\n"
11930 FRR_IP_REDIST_HELP_STR_BGPD
11931 "Route map reference\n"
11932 "Pointer to route-map entries\n")
11934 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11935 int idx_protocol
= 1;
11938 struct bgp_redist
*red
;
11940 struct route_map
*route_map
= route_map_lookup_warn_noexist(
11941 vty
, argv
[idx_word
]->arg
);
11943 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
11945 vty_out(vty
, "%% Invalid route type\n");
11946 return CMD_WARNING_CONFIG_FAILED
;
11949 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
11951 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
11952 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0, changed
);
11956 bgp_redistribute_ipv4_rmap
, bgp_redistribute_ipv4_rmap_hidden_cmd
,
11957 "redistribute " FRR_IP_REDIST_STR_BGPD
" route-map WORD",
11958 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
11959 "Route map reference\n"
11960 "Pointer to route-map entries\n")
11962 DEFUN (bgp_redistribute_ipv4_metric
,
11963 bgp_redistribute_ipv4_metric_cmd
,
11964 "redistribute " FRR_IP_REDIST_STR_BGPD
" metric (0-4294967295)",
11965 "Redistribute information from another routing protocol\n"
11966 FRR_IP_REDIST_HELP_STR_BGPD
11967 "Metric for redistributed routes\n"
11968 "Default metric\n")
11970 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
11971 int idx_protocol
= 1;
11972 int idx_number
= 3;
11975 struct bgp_redist
*red
;
11978 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
11980 vty_out(vty
, "%% Invalid route type\n");
11981 return CMD_WARNING_CONFIG_FAILED
;
11983 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
11985 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
11986 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, type
, metric
);
11987 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0, changed
);
11991 bgp_redistribute_ipv4_metric
, bgp_redistribute_ipv4_metric_hidden_cmd
,
11992 "redistribute " FRR_IP_REDIST_STR_BGPD
" metric (0-4294967295)",
11993 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
11994 "Metric for redistributed routes\n"
11995 "Default metric\n")
11997 DEFUN (bgp_redistribute_ipv4_rmap_metric
,
11998 bgp_redistribute_ipv4_rmap_metric_cmd
,
11999 "redistribute " FRR_IP_REDIST_STR_BGPD
" route-map WORD metric (0-4294967295)",
12000 "Redistribute information from another routing protocol\n"
12001 FRR_IP_REDIST_HELP_STR_BGPD
12002 "Route map reference\n"
12003 "Pointer to route-map entries\n"
12004 "Metric for redistributed routes\n"
12005 "Default metric\n")
12007 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12008 int idx_protocol
= 1;
12010 int idx_number
= 5;
12013 struct bgp_redist
*red
;
12015 struct route_map
*route_map
=
12016 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12018 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
12020 vty_out(vty
, "%% Invalid route type\n");
12021 return CMD_WARNING_CONFIG_FAILED
;
12023 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12025 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
12027 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12028 changed
|= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, type
, metric
);
12029 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0, changed
);
12033 bgp_redistribute_ipv4_rmap_metric
,
12034 bgp_redistribute_ipv4_rmap_metric_hidden_cmd
,
12035 "redistribute " FRR_IP_REDIST_STR_BGPD
12036 " route-map WORD metric (0-4294967295)",
12037 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
12038 "Route map reference\n"
12039 "Pointer to route-map entries\n"
12040 "Metric for redistributed routes\n"
12041 "Default metric\n")
12043 DEFUN (bgp_redistribute_ipv4_metric_rmap
,
12044 bgp_redistribute_ipv4_metric_rmap_cmd
,
12045 "redistribute " FRR_IP_REDIST_STR_BGPD
" metric (0-4294967295) route-map WORD",
12046 "Redistribute information from another routing protocol\n"
12047 FRR_IP_REDIST_HELP_STR_BGPD
12048 "Metric for redistributed routes\n"
12050 "Route map reference\n"
12051 "Pointer to route-map entries\n")
12053 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12054 int idx_protocol
= 1;
12055 int idx_number
= 3;
12059 struct bgp_redist
*red
;
12061 struct route_map
*route_map
=
12062 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12064 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
12066 vty_out(vty
, "%% Invalid route type\n");
12067 return CMD_WARNING_CONFIG_FAILED
;
12069 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12071 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
12072 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, type
, metric
);
12074 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12075 return bgp_redistribute_set(bgp
, AFI_IP
, type
, 0, changed
);
12079 bgp_redistribute_ipv4_metric_rmap
,
12080 bgp_redistribute_ipv4_metric_rmap_hidden_cmd
,
12081 "redistribute " FRR_IP_REDIST_STR_BGPD
12082 " metric (0-4294967295) route-map WORD",
12083 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
12084 "Metric for redistributed routes\n"
12086 "Route map reference\n"
12087 "Pointer to route-map entries\n")
12089 DEFUN (bgp_redistribute_ipv4_ospf
,
12090 bgp_redistribute_ipv4_ospf_cmd
,
12091 "redistribute <ospf|table> (1-65535)",
12092 "Redistribute information from another routing protocol\n"
12093 "Open Shortest Path First (OSPFv2)\n"
12094 "Non-main Kernel Routing Table\n"
12095 "Instance ID/Table ID\n")
12097 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12098 int idx_ospf_table
= 1;
12099 int idx_number
= 2;
12100 unsigned short instance
;
12101 unsigned short protocol
;
12103 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12105 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
12106 protocol
= ZEBRA_ROUTE_OSPF
;
12108 protocol
= ZEBRA_ROUTE_TABLE
;
12110 bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
12111 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
, false);
12114 ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf
, bgp_redistribute_ipv4_ospf_hidden_cmd
,
12115 "redistribute <ospf|table> (1-65535)",
12116 "Redistribute information from another routing protocol\n"
12117 "Open Shortest Path First (OSPFv2)\n"
12118 "Non-main Kernel Routing Table\n"
12119 "Instance ID/Table ID\n")
12121 DEFUN (bgp_redistribute_ipv4_ospf_rmap
,
12122 bgp_redistribute_ipv4_ospf_rmap_cmd
,
12123 "redistribute <ospf|table> (1-65535) route-map WORD",
12124 "Redistribute information from another routing protocol\n"
12125 "Open Shortest Path First (OSPFv2)\n"
12126 "Non-main Kernel Routing Table\n"
12127 "Instance ID/Table ID\n"
12128 "Route map reference\n"
12129 "Pointer to route-map entries\n")
12131 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12132 int idx_ospf_table
= 1;
12133 int idx_number
= 2;
12135 struct bgp_redist
*red
;
12136 unsigned short instance
;
12139 struct route_map
*route_map
=
12140 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12142 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
12143 protocol
= ZEBRA_ROUTE_OSPF
;
12145 protocol
= ZEBRA_ROUTE_TABLE
;
12147 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12148 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
12150 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12151 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
, changed
);
12154 ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf_rmap
,
12155 bgp_redistribute_ipv4_ospf_rmap_hidden_cmd
,
12156 "redistribute <ospf|table> (1-65535) route-map WORD",
12157 "Redistribute information from another routing protocol\n"
12158 "Open Shortest Path First (OSPFv2)\n"
12159 "Non-main Kernel Routing Table\n"
12160 "Instance ID/Table ID\n"
12161 "Route map reference\n"
12162 "Pointer to route-map entries\n")
12164 DEFUN (bgp_redistribute_ipv4_ospf_metric
,
12165 bgp_redistribute_ipv4_ospf_metric_cmd
,
12166 "redistribute <ospf|table> (1-65535) metric (0-4294967295)",
12167 "Redistribute information from another routing protocol\n"
12168 "Open Shortest Path First (OSPFv2)\n"
12169 "Non-main Kernel Routing Table\n"
12170 "Instance ID/Table ID\n"
12171 "Metric for redistributed routes\n"
12172 "Default metric\n")
12174 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12175 int idx_ospf_table
= 1;
12176 int idx_number
= 2;
12177 int idx_number_2
= 4;
12179 struct bgp_redist
*red
;
12180 unsigned short instance
;
12184 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
12185 protocol
= ZEBRA_ROUTE_OSPF
;
12187 protocol
= ZEBRA_ROUTE_TABLE
;
12189 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12190 metric
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
12192 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
12193 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, protocol
,
12195 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
, changed
);
12198 ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf_metric
,
12199 bgp_redistribute_ipv4_ospf_metric_hidden_cmd
,
12200 "redistribute <ospf|table> (1-65535) metric (0-4294967295)",
12201 "Redistribute information from another routing protocol\n"
12202 "Open Shortest Path First (OSPFv2)\n"
12203 "Non-main Kernel Routing Table\n"
12204 "Instance ID/Table ID\n"
12205 "Metric for redistributed routes\n"
12206 "Default metric\n")
12208 DEFUN (bgp_redistribute_ipv4_ospf_rmap_metric
,
12209 bgp_redistribute_ipv4_ospf_rmap_metric_cmd
,
12210 "redistribute <ospf|table> (1-65535) route-map WORD metric (0-4294967295)",
12211 "Redistribute information from another routing protocol\n"
12212 "Open Shortest Path First (OSPFv2)\n"
12213 "Non-main Kernel Routing Table\n"
12214 "Instance ID/Table ID\n"
12215 "Route map reference\n"
12216 "Pointer to route-map entries\n"
12217 "Metric for redistributed routes\n"
12218 "Default metric\n")
12220 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12221 int idx_ospf_table
= 1;
12222 int idx_number
= 2;
12224 int idx_number_2
= 6;
12226 struct bgp_redist
*red
;
12227 unsigned short instance
;
12230 struct route_map
*route_map
=
12231 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12233 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
12234 protocol
= ZEBRA_ROUTE_OSPF
;
12236 protocol
= ZEBRA_ROUTE_TABLE
;
12238 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12239 metric
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
12241 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
12243 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12244 changed
|= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, protocol
,
12246 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
, changed
);
12250 bgp_redistribute_ipv4_ospf_rmap_metric
,
12251 bgp_redistribute_ipv4_ospf_rmap_metric_hidden_cmd
,
12252 "redistribute <ospf|table> (1-65535) route-map WORD metric (0-4294967295)",
12253 "Redistribute information from another routing protocol\n"
12254 "Open Shortest Path First (OSPFv2)\n"
12255 "Non-main Kernel Routing Table\n"
12256 "Instance ID/Table ID\n"
12257 "Route map reference\n"
12258 "Pointer to route-map entries\n"
12259 "Metric for redistributed routes\n"
12260 "Default metric\n")
12262 DEFUN (bgp_redistribute_ipv4_ospf_metric_rmap
,
12263 bgp_redistribute_ipv4_ospf_metric_rmap_cmd
,
12264 "redistribute <ospf|table> (1-65535) metric (0-4294967295) route-map WORD",
12265 "Redistribute information from another routing protocol\n"
12266 "Open Shortest Path First (OSPFv2)\n"
12267 "Non-main Kernel Routing Table\n"
12268 "Instance ID/Table ID\n"
12269 "Metric for redistributed routes\n"
12271 "Route map reference\n"
12272 "Pointer to route-map entries\n")
12274 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12275 int idx_ospf_table
= 1;
12276 int idx_number
= 2;
12277 int idx_number_2
= 4;
12280 struct bgp_redist
*red
;
12281 unsigned short instance
;
12284 struct route_map
*route_map
=
12285 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12287 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
12288 protocol
= ZEBRA_ROUTE_OSPF
;
12290 protocol
= ZEBRA_ROUTE_TABLE
;
12292 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12293 metric
= strtoul(argv
[idx_number_2
]->arg
, NULL
, 10);
12295 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
12296 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, protocol
,
12299 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12300 return bgp_redistribute_set(bgp
, AFI_IP
, protocol
, instance
, changed
);
12304 bgp_redistribute_ipv4_ospf_metric_rmap
,
12305 bgp_redistribute_ipv4_ospf_metric_rmap_hidden_cmd
,
12306 "redistribute <ospf|table> (1-65535) metric (0-4294967295) route-map WORD",
12307 "Redistribute information from another routing protocol\n"
12308 "Open Shortest Path First (OSPFv2)\n"
12309 "Non-main Kernel Routing Table\n"
12310 "Instance ID/Table ID\n"
12311 "Metric for redistributed routes\n"
12313 "Route map reference\n"
12314 "Pointer to route-map entries\n")
12316 DEFUN (no_bgp_redistribute_ipv4_ospf
,
12317 no_bgp_redistribute_ipv4_ospf_cmd
,
12318 "no redistribute <ospf|table> (1-65535) [{metric (0-4294967295)|route-map WORD}]",
12320 "Redistribute information from another routing protocol\n"
12321 "Open Shortest Path First (OSPFv2)\n"
12322 "Non-main Kernel Routing Table\n"
12323 "Instance ID/Table ID\n"
12324 "Metric for redistributed routes\n"
12326 "Route map reference\n"
12327 "Pointer to route-map entries\n")
12329 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12330 int idx_ospf_table
= 2;
12331 int idx_number
= 3;
12332 unsigned short instance
;
12335 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
12336 protocol
= ZEBRA_ROUTE_OSPF
;
12338 protocol
= ZEBRA_ROUTE_TABLE
;
12340 instance
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12341 return bgp_redistribute_unset(bgp
, AFI_IP
, protocol
, instance
);
12345 no_bgp_redistribute_ipv4_ospf
, no_bgp_redistribute_ipv4_ospf_hidden_cmd
,
12346 "no redistribute <ospf|table> (1-65535) [{metric (0-4294967295)|route-map WORD}]",
12348 "Redistribute information from another routing protocol\n"
12349 "Open Shortest Path First (OSPFv2)\n"
12350 "Non-main Kernel Routing Table\n"
12351 "Instance ID/Table ID\n"
12352 "Metric for redistributed routes\n"
12354 "Route map reference\n"
12355 "Pointer to route-map entries\n")
12357 DEFUN (no_bgp_redistribute_ipv4
,
12358 no_bgp_redistribute_ipv4_cmd
,
12359 "no redistribute " FRR_IP_REDIST_STR_BGPD
" [{metric (0-4294967295)|route-map WORD}]",
12361 "Redistribute information from another routing protocol\n"
12362 FRR_IP_REDIST_HELP_STR_BGPD
12363 "Metric for redistributed routes\n"
12365 "Route map reference\n"
12366 "Pointer to route-map entries\n")
12368 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12369 int idx_protocol
= 2;
12372 type
= proto_redistnum(AFI_IP
, argv
[idx_protocol
]->text
);
12374 vty_out(vty
, "%% Invalid route type\n");
12375 return CMD_WARNING_CONFIG_FAILED
;
12377 return bgp_redistribute_unset(bgp
, AFI_IP
, type
, 0);
12381 no_bgp_redistribute_ipv4
, no_bgp_redistribute_ipv4_hidden_cmd
,
12382 "no redistribute " FRR_IP_REDIST_STR_BGPD
12383 " [{metric (0-4294967295)|route-map WORD}]",
12385 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
12386 "Metric for redistributed routes\n"
12388 "Route map reference\n"
12389 "Pointer to route-map entries\n")
12391 DEFUN (bgp_redistribute_ipv6
,
12392 bgp_redistribute_ipv6_cmd
,
12393 "redistribute " FRR_IP6_REDIST_STR_BGPD
,
12394 "Redistribute information from another routing protocol\n"
12395 FRR_IP6_REDIST_HELP_STR_BGPD
)
12397 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12398 int idx_protocol
= 1;
12401 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
12403 vty_out(vty
, "%% Invalid route type\n");
12404 return CMD_WARNING_CONFIG_FAILED
;
12407 bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
12408 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0, false);
12411 DEFUN (bgp_redistribute_ipv6_rmap
,
12412 bgp_redistribute_ipv6_rmap_cmd
,
12413 "redistribute " FRR_IP6_REDIST_STR_BGPD
" route-map WORD",
12414 "Redistribute information from another routing protocol\n"
12415 FRR_IP6_REDIST_HELP_STR_BGPD
12416 "Route map reference\n"
12417 "Pointer to route-map entries\n")
12419 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12420 int idx_protocol
= 1;
12423 struct bgp_redist
*red
;
12425 struct route_map
*route_map
=
12426 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12428 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
12430 vty_out(vty
, "%% Invalid route type\n");
12431 return CMD_WARNING_CONFIG_FAILED
;
12434 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
12436 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12437 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0, changed
);
12440 DEFUN (bgp_redistribute_ipv6_metric
,
12441 bgp_redistribute_ipv6_metric_cmd
,
12442 "redistribute " FRR_IP6_REDIST_STR_BGPD
" metric (0-4294967295)",
12443 "Redistribute information from another routing protocol\n"
12444 FRR_IP6_REDIST_HELP_STR_BGPD
12445 "Metric for redistributed routes\n"
12446 "Default metric\n")
12448 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12449 int idx_protocol
= 1;
12450 int idx_number
= 3;
12453 struct bgp_redist
*red
;
12456 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
12458 vty_out(vty
, "%% Invalid route type\n");
12459 return CMD_WARNING_CONFIG_FAILED
;
12461 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12463 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
12464 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP6
, type
, metric
);
12465 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0, changed
);
12468 DEFUN (bgp_redistribute_ipv6_rmap_metric
,
12469 bgp_redistribute_ipv6_rmap_metric_cmd
,
12470 "redistribute " FRR_IP6_REDIST_STR_BGPD
" route-map WORD metric (0-4294967295)",
12471 "Redistribute information from another routing protocol\n"
12472 FRR_IP6_REDIST_HELP_STR_BGPD
12473 "Route map reference\n"
12474 "Pointer to route-map entries\n"
12475 "Metric for redistributed routes\n"
12476 "Default metric\n")
12478 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12479 int idx_protocol
= 1;
12481 int idx_number
= 5;
12484 struct bgp_redist
*red
;
12486 struct route_map
*route_map
=
12487 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12489 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
12491 vty_out(vty
, "%% Invalid route type\n");
12492 return CMD_WARNING_CONFIG_FAILED
;
12494 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12496 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
12498 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12499 changed
|= bgp_redistribute_metric_set(bgp
, red
, AFI_IP6
, type
,
12501 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0, changed
);
12504 DEFUN (bgp_redistribute_ipv6_metric_rmap
,
12505 bgp_redistribute_ipv6_metric_rmap_cmd
,
12506 "redistribute " FRR_IP6_REDIST_STR_BGPD
" metric (0-4294967295) route-map WORD",
12507 "Redistribute information from another routing protocol\n"
12508 FRR_IP6_REDIST_HELP_STR_BGPD
12509 "Metric for redistributed routes\n"
12511 "Route map reference\n"
12512 "Pointer to route-map entries\n")
12514 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12515 int idx_protocol
= 1;
12516 int idx_number
= 3;
12520 struct bgp_redist
*red
;
12522 struct route_map
*route_map
=
12523 route_map_lookup_warn_noexist(vty
, argv
[idx_word
]->arg
);
12525 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
12527 vty_out(vty
, "%% Invalid route type\n");
12528 return CMD_WARNING_CONFIG_FAILED
;
12530 metric
= strtoul(argv
[idx_number
]->arg
, NULL
, 10);
12532 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
12533 changed
= bgp_redistribute_metric_set(bgp
, red
, AFI_IP6
, SAFI_UNICAST
,
12536 bgp_redistribute_rmap_set(red
, argv
[idx_word
]->arg
, route_map
);
12537 return bgp_redistribute_set(bgp
, AFI_IP6
, type
, 0, changed
);
12540 DEFUN (no_bgp_redistribute_ipv6
,
12541 no_bgp_redistribute_ipv6_cmd
,
12542 "no redistribute " FRR_IP6_REDIST_STR_BGPD
" [{metric (0-4294967295)|route-map WORD}]",
12544 "Redistribute information from another routing protocol\n"
12545 FRR_IP6_REDIST_HELP_STR_BGPD
12546 "Metric for redistributed routes\n"
12548 "Route map reference\n"
12549 "Pointer to route-map entries\n")
12551 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
12552 int idx_protocol
= 2;
12555 type
= proto_redistnum(AFI_IP6
, argv
[idx_protocol
]->text
);
12557 vty_out(vty
, "%% Invalid route type\n");
12558 return CMD_WARNING_CONFIG_FAILED
;
12561 return bgp_redistribute_unset(bgp
, AFI_IP6
, type
, 0);
12564 void bgp_config_write_redistribute(struct vty
*vty
, struct bgp
*bgp
, afi_t afi
,
12569 /* Unicast redistribution only. */
12570 if (safi
!= SAFI_UNICAST
)
12573 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++) {
12574 /* Redistribute BGP does not make sense. */
12575 if (i
!= ZEBRA_ROUTE_BGP
) {
12576 struct list
*red_list
;
12577 struct listnode
*node
;
12578 struct bgp_redist
*red
;
12580 red_list
= bgp
->redist
[afi
][i
];
12584 for (ALL_LIST_ELEMENTS_RO(red_list
, node
, red
)) {
12585 /* "redistribute" configuration. */
12586 vty_out(vty
, " redistribute %s",
12587 zebra_route_string(i
));
12589 vty_out(vty
, " %d", red
->instance
);
12590 if (red
->redist_metric_flag
)
12591 vty_out(vty
, " metric %u",
12592 red
->redist_metric
);
12593 if (red
->rmap
.name
)
12594 vty_out(vty
, " route-map %s",
12596 vty_out(vty
, "\n");
12602 /* This is part of the address-family block (unicast only) */
12603 void bgp_vpn_policy_config_write_afi(struct vty
*vty
, struct bgp
*bgp
,
12608 if (bgp
->vpn_policy
[afi
].rmap_name
[BGP_VPN_POLICY_DIR_FROMVPN
]) {
12609 if (listcount(bgp
->vpn_policy
[afi
].import_vrf
))
12610 vty_out(vty
, "%*simport vrf route-map %s\n", indent
, "",
12611 bgp
->vpn_policy
[afi
]
12612 .rmap_name
[BGP_VPN_POLICY_DIR_FROMVPN
]);
12614 vty_out(vty
, "%*sroute-map vpn import %s\n", indent
, "",
12615 bgp
->vpn_policy
[afi
]
12616 .rmap_name
[BGP_VPN_POLICY_DIR_FROMVPN
]);
12618 if (CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
12619 BGP_CONFIG_VRF_TO_VRF_IMPORT
)
12620 || CHECK_FLAG(bgp
->af_flags
[afi
][SAFI_UNICAST
],
12621 BGP_CONFIG_VRF_TO_VRF_EXPORT
))
12624 if (CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
12625 BGP_VPN_POLICY_TOVPN_LABEL_AUTO
)) {
12627 vty_out(vty
, "%*slabel vpn export %s\n", indent
, "", "auto");
12630 if (bgp
->vpn_policy
[afi
].tovpn_label
!= MPLS_LABEL_NONE
) {
12631 vty_out(vty
, "%*slabel vpn export %u\n", indent
, "",
12632 bgp
->vpn_policy
[afi
].tovpn_label
);
12635 if (CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
12636 BGP_VPN_POLICY_TOVPN_RD_SET
)) {
12637 char buf
[RD_ADDRSTRLEN
];
12638 vty_out(vty
, "%*srd vpn export %s\n", indent
, "",
12639 prefix_rd2str(&bgp
->vpn_policy
[afi
].tovpn_rd
, buf
,
12642 if (CHECK_FLAG(bgp
->vpn_policy
[afi
].flags
,
12643 BGP_VPN_POLICY_TOVPN_NEXTHOP_SET
)) {
12645 char buf
[PREFIX_STRLEN
];
12646 if (inet_ntop(bgp
->vpn_policy
[afi
].tovpn_nexthop
.family
,
12647 &bgp
->vpn_policy
[afi
].tovpn_nexthop
.u
.prefix
, buf
,
12650 vty_out(vty
, "%*snexthop vpn export %s\n",
12654 if (bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
]
12655 && bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
]
12657 bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
],
12658 bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
])) {
12660 char *b
= ecommunity_ecom2str(
12661 bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
],
12662 ECOMMUNITY_FORMAT_ROUTE_MAP
, ECOMMUNITY_ROUTE_TARGET
);
12663 vty_out(vty
, "%*srt vpn both %s\n", indent
, "", b
);
12664 XFREE(MTYPE_ECOMMUNITY_STR
, b
);
12666 if (bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
]) {
12667 char *b
= ecommunity_ecom2str(
12668 bgp
->vpn_policy
[afi
]
12669 .rtlist
[BGP_VPN_POLICY_DIR_FROMVPN
],
12670 ECOMMUNITY_FORMAT_ROUTE_MAP
,
12671 ECOMMUNITY_ROUTE_TARGET
);
12672 vty_out(vty
, "%*srt vpn import %s\n", indent
, "", b
);
12673 XFREE(MTYPE_ECOMMUNITY_STR
, b
);
12675 if (bgp
->vpn_policy
[afi
].rtlist
[BGP_VPN_POLICY_DIR_TOVPN
]) {
12676 char *b
= ecommunity_ecom2str(
12677 bgp
->vpn_policy
[afi
]
12678 .rtlist
[BGP_VPN_POLICY_DIR_TOVPN
],
12679 ECOMMUNITY_FORMAT_ROUTE_MAP
,
12680 ECOMMUNITY_ROUTE_TARGET
);
12681 vty_out(vty
, "%*srt vpn export %s\n", indent
, "", b
);
12682 XFREE(MTYPE_ECOMMUNITY_STR
, b
);
12686 if (bgp
->vpn_policy
[afi
].rmap_name
[BGP_VPN_POLICY_DIR_TOVPN
])
12687 vty_out(vty
, "%*sroute-map vpn export %s\n", indent
, "",
12688 bgp
->vpn_policy
[afi
]
12689 .rmap_name
[BGP_VPN_POLICY_DIR_TOVPN
]);
12691 if (bgp
->vpn_policy
[afi
].import_redirect_rtlist
) {
12692 char *b
= ecommunity_ecom2str(
12693 bgp
->vpn_policy
[afi
]
12694 .import_redirect_rtlist
,
12695 ECOMMUNITY_FORMAT_ROUTE_MAP
,
12696 ECOMMUNITY_ROUTE_TARGET
);
12698 vty_out(vty
, "%*srt redirect import %s\n", indent
, "", b
);
12699 XFREE(MTYPE_ECOMMUNITY_STR
, b
);
12704 /* BGP node structure. */
12705 static struct cmd_node bgp_node
= {
12706 BGP_NODE
, "%s(config-router)# ", 1,
12709 static struct cmd_node bgp_ipv4_unicast_node
= {
12710 BGP_IPV4_NODE
, "%s(config-router-af)# ", 1,
12713 static struct cmd_node bgp_ipv4_multicast_node
= {
12714 BGP_IPV4M_NODE
, "%s(config-router-af)# ", 1,
12717 static struct cmd_node bgp_ipv4_labeled_unicast_node
= {
12718 BGP_IPV4L_NODE
, "%s(config-router-af)# ", 1,
12721 static struct cmd_node bgp_ipv6_unicast_node
= {
12722 BGP_IPV6_NODE
, "%s(config-router-af)# ", 1,
12725 static struct cmd_node bgp_ipv6_multicast_node
= {
12726 BGP_IPV6M_NODE
, "%s(config-router-af)# ", 1,
12729 static struct cmd_node bgp_ipv6_labeled_unicast_node
= {
12730 BGP_IPV6L_NODE
, "%s(config-router-af)# ", 1,
12733 static struct cmd_node bgp_vpnv4_node
= {BGP_VPNV4_NODE
,
12734 "%s(config-router-af)# ", 1};
12736 static struct cmd_node bgp_vpnv6_node
= {BGP_VPNV6_NODE
,
12737 "%s(config-router-af-vpnv6)# ", 1};
12739 static struct cmd_node bgp_evpn_node
= {BGP_EVPN_NODE
,
12740 "%s(config-router-evpn)# ", 1};
12742 static struct cmd_node bgp_evpn_vni_node
= {BGP_EVPN_VNI_NODE
,
12743 "%s(config-router-af-vni)# ", 1};
12745 static struct cmd_node bgp_flowspecv4_node
= {BGP_FLOWSPECV4_NODE
,
12746 "%s(config-router-af)# ", 1};
12748 static struct cmd_node bgp_flowspecv6_node
= {BGP_FLOWSPECV6_NODE
,
12749 "%s(config-router-af-vpnv6)# ", 1};
12751 static void community_list_vty(void);
12753 static void bgp_ac_neighbor(vector comps
, struct cmd_token
*token
)
12757 struct listnode
*lnbgp
, *lnpeer
;
12759 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, lnbgp
, bgp
)) {
12760 for (ALL_LIST_ELEMENTS_RO(bgp
->peer
, lnpeer
, peer
)) {
12761 /* only provide suggestions on the appropriate input
12763 * they'll otherwise show up multiple times */
12764 enum cmd_token_type match_type
;
12765 char *name
= peer
->host
;
12767 if (peer
->conf_if
) {
12768 match_type
= VARIABLE_TKN
;
12769 name
= peer
->conf_if
;
12770 } else if (strchr(peer
->host
, ':'))
12771 match_type
= IPV6_TKN
;
12773 match_type
= IPV4_TKN
;
12775 if (token
->type
!= match_type
)
12778 vector_set(comps
, XSTRDUP(MTYPE_COMPLETION
, name
));
12783 static const struct cmd_variable_handler bgp_var_neighbor
[] = {
12784 {.varname
= "neighbor", .completions
= bgp_ac_neighbor
},
12785 {.varname
= "neighbors", .completions
= bgp_ac_neighbor
},
12786 {.varname
= "peer", .completions
= bgp_ac_neighbor
},
12787 {.completions
= NULL
}};
12789 static void bgp_ac_peergroup(vector comps
, struct cmd_token
*token
)
12792 struct peer_group
*group
;
12793 struct listnode
*lnbgp
, *lnpeer
;
12795 for (ALL_LIST_ELEMENTS_RO(bm
->bgp
, lnbgp
, bgp
)) {
12796 for (ALL_LIST_ELEMENTS_RO(bgp
->group
, lnpeer
, group
))
12797 vector_set(comps
, XSTRDUP(MTYPE_COMPLETION
,
12802 static const struct cmd_variable_handler bgp_var_peergroup
[] = {
12803 {.tokenname
= "PGNAME", .completions
= bgp_ac_peergroup
},
12804 {.completions
= NULL
} };
12806 void bgp_vty_init(void)
12808 cmd_variable_handler_register(bgp_var_neighbor
);
12809 cmd_variable_handler_register(bgp_var_peergroup
);
12811 /* Install bgp top node. */
12812 install_node(&bgp_node
, bgp_config_write
);
12813 install_node(&bgp_ipv4_unicast_node
, NULL
);
12814 install_node(&bgp_ipv4_multicast_node
, NULL
);
12815 install_node(&bgp_ipv4_labeled_unicast_node
, NULL
);
12816 install_node(&bgp_ipv6_unicast_node
, NULL
);
12817 install_node(&bgp_ipv6_multicast_node
, NULL
);
12818 install_node(&bgp_ipv6_labeled_unicast_node
, NULL
);
12819 install_node(&bgp_vpnv4_node
, NULL
);
12820 install_node(&bgp_vpnv6_node
, NULL
);
12821 install_node(&bgp_evpn_node
, NULL
);
12822 install_node(&bgp_evpn_vni_node
, NULL
);
12823 install_node(&bgp_flowspecv4_node
, NULL
);
12824 install_node(&bgp_flowspecv6_node
, NULL
);
12826 /* Install default VTY commands to new nodes. */
12827 install_default(BGP_NODE
);
12828 install_default(BGP_IPV4_NODE
);
12829 install_default(BGP_IPV4M_NODE
);
12830 install_default(BGP_IPV4L_NODE
);
12831 install_default(BGP_IPV6_NODE
);
12832 install_default(BGP_IPV6M_NODE
);
12833 install_default(BGP_IPV6L_NODE
);
12834 install_default(BGP_VPNV4_NODE
);
12835 install_default(BGP_VPNV6_NODE
);
12836 install_default(BGP_FLOWSPECV4_NODE
);
12837 install_default(BGP_FLOWSPECV6_NODE
);
12838 install_default(BGP_EVPN_NODE
);
12839 install_default(BGP_EVPN_VNI_NODE
);
12841 /* "bgp local-mac" hidden commands. */
12842 install_element(CONFIG_NODE
, &bgp_local_mac_cmd
);
12843 install_element(CONFIG_NODE
, &no_bgp_local_mac_cmd
);
12845 /* bgp route-map delay-timer commands. */
12846 install_element(CONFIG_NODE
, &bgp_set_route_map_delay_timer_cmd
);
12847 install_element(CONFIG_NODE
, &no_bgp_set_route_map_delay_timer_cmd
);
12849 /* Dummy commands (Currently not supported) */
12850 install_element(BGP_NODE
, &no_synchronization_cmd
);
12851 install_element(BGP_NODE
, &no_auto_summary_cmd
);
12853 /* "router bgp" commands. */
12854 install_element(CONFIG_NODE
, &router_bgp_cmd
);
12856 /* "no router bgp" commands. */
12857 install_element(CONFIG_NODE
, &no_router_bgp_cmd
);
12859 /* "bgp router-id" commands. */
12860 install_element(BGP_NODE
, &bgp_router_id_cmd
);
12861 install_element(BGP_NODE
, &no_bgp_router_id_cmd
);
12863 /* "bgp cluster-id" commands. */
12864 install_element(BGP_NODE
, &bgp_cluster_id_cmd
);
12865 install_element(BGP_NODE
, &no_bgp_cluster_id_cmd
);
12867 /* "bgp confederation" commands. */
12868 install_element(BGP_NODE
, &bgp_confederation_identifier_cmd
);
12869 install_element(BGP_NODE
, &no_bgp_confederation_identifier_cmd
);
12871 /* "bgp confederation peers" commands. */
12872 install_element(BGP_NODE
, &bgp_confederation_peers_cmd
);
12873 install_element(BGP_NODE
, &no_bgp_confederation_peers_cmd
);
12875 /* bgp max-med command */
12876 install_element(BGP_NODE
, &bgp_maxmed_admin_cmd
);
12877 install_element(BGP_NODE
, &no_bgp_maxmed_admin_cmd
);
12878 install_element(BGP_NODE
, &bgp_maxmed_admin_medv_cmd
);
12879 install_element(BGP_NODE
, &bgp_maxmed_onstartup_cmd
);
12880 install_element(BGP_NODE
, &no_bgp_maxmed_onstartup_cmd
);
12882 /* bgp disable-ebgp-connected-nh-check */
12883 install_element(BGP_NODE
, &bgp_disable_connected_route_check_cmd
);
12884 install_element(BGP_NODE
, &no_bgp_disable_connected_route_check_cmd
);
12886 /* bgp update-delay command */
12887 install_element(BGP_NODE
, &bgp_update_delay_cmd
);
12888 install_element(BGP_NODE
, &no_bgp_update_delay_cmd
);
12889 install_element(BGP_NODE
, &bgp_update_delay_establish_wait_cmd
);
12891 install_element(BGP_NODE
, &bgp_wpkt_quanta_cmd
);
12892 install_element(BGP_NODE
, &no_bgp_wpkt_quanta_cmd
);
12893 install_element(BGP_NODE
, &bgp_rpkt_quanta_cmd
);
12894 install_element(BGP_NODE
, &no_bgp_rpkt_quanta_cmd
);
12896 install_element(BGP_NODE
, &bgp_coalesce_time_cmd
);
12897 install_element(BGP_NODE
, &no_bgp_coalesce_time_cmd
);
12899 /* "maximum-paths" commands. */
12900 install_element(BGP_NODE
, &bgp_maxpaths_hidden_cmd
);
12901 install_element(BGP_NODE
, &no_bgp_maxpaths_hidden_cmd
);
12902 install_element(BGP_IPV4_NODE
, &bgp_maxpaths_cmd
);
12903 install_element(BGP_IPV4_NODE
, &no_bgp_maxpaths_cmd
);
12904 install_element(BGP_IPV6_NODE
, &bgp_maxpaths_cmd
);
12905 install_element(BGP_IPV6_NODE
, &no_bgp_maxpaths_cmd
);
12906 install_element(BGP_NODE
, &bgp_maxpaths_ibgp_hidden_cmd
);
12907 install_element(BGP_NODE
, &bgp_maxpaths_ibgp_cluster_hidden_cmd
);
12908 install_element(BGP_NODE
, &no_bgp_maxpaths_ibgp_hidden_cmd
);
12909 install_element(BGP_IPV4_NODE
, &bgp_maxpaths_ibgp_cmd
);
12910 install_element(BGP_IPV4_NODE
, &bgp_maxpaths_ibgp_cluster_cmd
);
12911 install_element(BGP_IPV4_NODE
, &no_bgp_maxpaths_ibgp_cmd
);
12912 install_element(BGP_IPV6_NODE
, &bgp_maxpaths_ibgp_cmd
);
12913 install_element(BGP_IPV6_NODE
, &bgp_maxpaths_ibgp_cluster_cmd
);
12914 install_element(BGP_IPV6_NODE
, &no_bgp_maxpaths_ibgp_cmd
);
12916 install_element(BGP_IPV6L_NODE
, &bgp_maxpaths_cmd
);
12917 install_element(BGP_IPV6L_NODE
, &no_bgp_maxpaths_cmd
);
12918 install_element(BGP_IPV6L_NODE
, &bgp_maxpaths_ibgp_cmd
);
12919 install_element(BGP_IPV6L_NODE
, &bgp_maxpaths_ibgp_cluster_cmd
);
12920 install_element(BGP_IPV6L_NODE
, &no_bgp_maxpaths_ibgp_cmd
);
12922 /* "timers bgp" commands. */
12923 install_element(BGP_NODE
, &bgp_timers_cmd
);
12924 install_element(BGP_NODE
, &no_bgp_timers_cmd
);
12926 /* route-map delay-timer commands - per instance for backwards compat.
12928 install_element(BGP_NODE
, &bgp_set_route_map_delay_timer_cmd
);
12929 install_element(BGP_NODE
, &no_bgp_set_route_map_delay_timer_cmd
);
12931 /* "bgp client-to-client reflection" commands */
12932 install_element(BGP_NODE
, &no_bgp_client_to_client_reflection_cmd
);
12933 install_element(BGP_NODE
, &bgp_client_to_client_reflection_cmd
);
12935 /* "bgp always-compare-med" commands */
12936 install_element(BGP_NODE
, &bgp_always_compare_med_cmd
);
12937 install_element(BGP_NODE
, &no_bgp_always_compare_med_cmd
);
12939 /* bgp ebgp-requires-policy */
12940 install_element(BGP_NODE
, &bgp_ebgp_requires_policy_cmd
);
12941 install_element(BGP_NODE
, &no_bgp_ebgp_requires_policy_cmd
);
12943 /* "bgp deterministic-med" commands */
12944 install_element(BGP_NODE
, &bgp_deterministic_med_cmd
);
12945 install_element(BGP_NODE
, &no_bgp_deterministic_med_cmd
);
12947 /* "bgp graceful-restart" commands */
12948 install_element(BGP_NODE
, &bgp_graceful_restart_cmd
);
12949 install_element(BGP_NODE
, &no_bgp_graceful_restart_cmd
);
12950 install_element(BGP_NODE
, &bgp_graceful_restart_stalepath_time_cmd
);
12951 install_element(BGP_NODE
, &no_bgp_graceful_restart_stalepath_time_cmd
);
12952 install_element(BGP_NODE
, &bgp_graceful_restart_restart_time_cmd
);
12953 install_element(BGP_NODE
, &no_bgp_graceful_restart_restart_time_cmd
);
12955 install_element(BGP_NODE
, &bgp_graceful_restart_preserve_fw_cmd
);
12956 install_element(BGP_NODE
, &no_bgp_graceful_restart_preserve_fw_cmd
);
12958 /* "bgp graceful-shutdown" commands */
12959 install_element(BGP_NODE
, &bgp_graceful_shutdown_cmd
);
12960 install_element(BGP_NODE
, &no_bgp_graceful_shutdown_cmd
);
12962 /* "bgp fast-external-failover" commands */
12963 install_element(BGP_NODE
, &bgp_fast_external_failover_cmd
);
12964 install_element(BGP_NODE
, &no_bgp_fast_external_failover_cmd
);
12966 /* "bgp bestpath compare-routerid" commands */
12967 install_element(BGP_NODE
, &bgp_bestpath_compare_router_id_cmd
);
12968 install_element(BGP_NODE
, &no_bgp_bestpath_compare_router_id_cmd
);
12970 /* "bgp bestpath as-path ignore" commands */
12971 install_element(BGP_NODE
, &bgp_bestpath_aspath_ignore_cmd
);
12972 install_element(BGP_NODE
, &no_bgp_bestpath_aspath_ignore_cmd
);
12974 /* "bgp bestpath as-path confed" commands */
12975 install_element(BGP_NODE
, &bgp_bestpath_aspath_confed_cmd
);
12976 install_element(BGP_NODE
, &no_bgp_bestpath_aspath_confed_cmd
);
12978 /* "bgp bestpath as-path multipath-relax" commands */
12979 install_element(BGP_NODE
, &bgp_bestpath_aspath_multipath_relax_cmd
);
12980 install_element(BGP_NODE
, &no_bgp_bestpath_aspath_multipath_relax_cmd
);
12982 /* "bgp log-neighbor-changes" commands */
12983 install_element(BGP_NODE
, &bgp_log_neighbor_changes_cmd
);
12984 install_element(BGP_NODE
, &no_bgp_log_neighbor_changes_cmd
);
12986 /* "bgp bestpath med" commands */
12987 install_element(BGP_NODE
, &bgp_bestpath_med_cmd
);
12988 install_element(BGP_NODE
, &no_bgp_bestpath_med_cmd
);
12990 /* "no bgp default ipv4-unicast" commands. */
12991 install_element(BGP_NODE
, &no_bgp_default_ipv4_unicast_cmd
);
12992 install_element(BGP_NODE
, &bgp_default_ipv4_unicast_cmd
);
12994 /* "bgp network import-check" commands. */
12995 install_element(BGP_NODE
, &bgp_network_import_check_cmd
);
12996 install_element(BGP_NODE
, &bgp_network_import_check_exact_cmd
);
12997 install_element(BGP_NODE
, &no_bgp_network_import_check_cmd
);
12999 /* "bgp default local-preference" commands. */
13000 install_element(BGP_NODE
, &bgp_default_local_preference_cmd
);
13001 install_element(BGP_NODE
, &no_bgp_default_local_preference_cmd
);
13003 /* bgp default show-hostname */
13004 install_element(BGP_NODE
, &bgp_default_show_hostname_cmd
);
13005 install_element(BGP_NODE
, &no_bgp_default_show_hostname_cmd
);
13007 /* "bgp default subgroup-pkt-queue-max" commands. */
13008 install_element(BGP_NODE
, &bgp_default_subgroup_pkt_queue_max_cmd
);
13009 install_element(BGP_NODE
, &no_bgp_default_subgroup_pkt_queue_max_cmd
);
13011 /* bgp ibgp-allow-policy-mods command */
13012 install_element(BGP_NODE
, &bgp_rr_allow_outbound_policy_cmd
);
13013 install_element(BGP_NODE
, &no_bgp_rr_allow_outbound_policy_cmd
);
13015 /* "bgp listen limit" commands. */
13016 install_element(BGP_NODE
, &bgp_listen_limit_cmd
);
13017 install_element(BGP_NODE
, &no_bgp_listen_limit_cmd
);
13019 /* "bgp listen range" commands. */
13020 install_element(BGP_NODE
, &bgp_listen_range_cmd
);
13021 install_element(BGP_NODE
, &no_bgp_listen_range_cmd
);
13023 /* "bgp default shutdown" command */
13024 install_element(BGP_NODE
, &bgp_default_shutdown_cmd
);
13026 /* "neighbor remote-as" commands. */
13027 install_element(BGP_NODE
, &neighbor_remote_as_cmd
);
13028 install_element(BGP_NODE
, &neighbor_interface_config_cmd
);
13029 install_element(BGP_NODE
, &neighbor_interface_config_v6only_cmd
);
13030 install_element(BGP_NODE
, &neighbor_interface_config_remote_as_cmd
);
13031 install_element(BGP_NODE
,
13032 &neighbor_interface_v6only_config_remote_as_cmd
);
13033 install_element(BGP_NODE
, &no_neighbor_cmd
);
13034 install_element(BGP_NODE
, &no_neighbor_interface_config_cmd
);
13036 /* "neighbor peer-group" commands. */
13037 install_element(BGP_NODE
, &neighbor_peer_group_cmd
);
13038 install_element(BGP_NODE
, &no_neighbor_peer_group_cmd
);
13039 install_element(BGP_NODE
,
13040 &no_neighbor_interface_peer_group_remote_as_cmd
);
13042 /* "neighbor local-as" commands. */
13043 install_element(BGP_NODE
, &neighbor_local_as_cmd
);
13044 install_element(BGP_NODE
, &neighbor_local_as_no_prepend_cmd
);
13045 install_element(BGP_NODE
, &neighbor_local_as_no_prepend_replace_as_cmd
);
13046 install_element(BGP_NODE
, &no_neighbor_local_as_cmd
);
13048 /* "neighbor solo" commands. */
13049 install_element(BGP_NODE
, &neighbor_solo_cmd
);
13050 install_element(BGP_NODE
, &no_neighbor_solo_cmd
);
13052 /* "neighbor password" commands. */
13053 install_element(BGP_NODE
, &neighbor_password_cmd
);
13054 install_element(BGP_NODE
, &no_neighbor_password_cmd
);
13056 /* "neighbor activate" commands. */
13057 install_element(BGP_NODE
, &neighbor_activate_hidden_cmd
);
13058 install_element(BGP_IPV4_NODE
, &neighbor_activate_cmd
);
13059 install_element(BGP_IPV4M_NODE
, &neighbor_activate_cmd
);
13060 install_element(BGP_IPV4L_NODE
, &neighbor_activate_cmd
);
13061 install_element(BGP_IPV6_NODE
, &neighbor_activate_cmd
);
13062 install_element(BGP_IPV6M_NODE
, &neighbor_activate_cmd
);
13063 install_element(BGP_IPV6L_NODE
, &neighbor_activate_cmd
);
13064 install_element(BGP_VPNV4_NODE
, &neighbor_activate_cmd
);
13065 install_element(BGP_VPNV6_NODE
, &neighbor_activate_cmd
);
13066 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_activate_cmd
);
13067 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_activate_cmd
);
13068 install_element(BGP_EVPN_NODE
, &neighbor_activate_cmd
);
13070 /* "no neighbor activate" commands. */
13071 install_element(BGP_NODE
, &no_neighbor_activate_hidden_cmd
);
13072 install_element(BGP_IPV4_NODE
, &no_neighbor_activate_cmd
);
13073 install_element(BGP_IPV4M_NODE
, &no_neighbor_activate_cmd
);
13074 install_element(BGP_IPV4L_NODE
, &no_neighbor_activate_cmd
);
13075 install_element(BGP_IPV6_NODE
, &no_neighbor_activate_cmd
);
13076 install_element(BGP_IPV6M_NODE
, &no_neighbor_activate_cmd
);
13077 install_element(BGP_IPV6L_NODE
, &no_neighbor_activate_cmd
);
13078 install_element(BGP_VPNV4_NODE
, &no_neighbor_activate_cmd
);
13079 install_element(BGP_VPNV6_NODE
, &no_neighbor_activate_cmd
);
13080 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_activate_cmd
);
13081 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_activate_cmd
);
13082 install_element(BGP_EVPN_NODE
, &no_neighbor_activate_cmd
);
13084 /* "neighbor peer-group" set commands. */
13085 install_element(BGP_NODE
, &neighbor_set_peer_group_cmd
);
13086 install_element(BGP_IPV4_NODE
, &neighbor_set_peer_group_hidden_cmd
);
13087 install_element(BGP_IPV4M_NODE
, &neighbor_set_peer_group_hidden_cmd
);
13088 install_element(BGP_IPV6_NODE
, &neighbor_set_peer_group_hidden_cmd
);
13089 install_element(BGP_IPV6M_NODE
, &neighbor_set_peer_group_hidden_cmd
);
13090 install_element(BGP_IPV6L_NODE
, &neighbor_set_peer_group_hidden_cmd
);
13091 install_element(BGP_VPNV4_NODE
, &neighbor_set_peer_group_hidden_cmd
);
13092 install_element(BGP_VPNV6_NODE
, &neighbor_set_peer_group_hidden_cmd
);
13093 install_element(BGP_FLOWSPECV4_NODE
,
13094 &neighbor_set_peer_group_hidden_cmd
);
13095 install_element(BGP_FLOWSPECV6_NODE
,
13096 &neighbor_set_peer_group_hidden_cmd
);
13098 /* "no neighbor peer-group unset" commands. */
13099 install_element(BGP_NODE
, &no_neighbor_set_peer_group_cmd
);
13100 install_element(BGP_IPV4_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
13101 install_element(BGP_IPV4M_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
13102 install_element(BGP_IPV6_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
13103 install_element(BGP_IPV6M_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
13104 install_element(BGP_IPV6L_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
13105 install_element(BGP_VPNV4_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
13106 install_element(BGP_VPNV6_NODE
, &no_neighbor_set_peer_group_hidden_cmd
);
13107 install_element(BGP_FLOWSPECV4_NODE
,
13108 &no_neighbor_set_peer_group_hidden_cmd
);
13109 install_element(BGP_FLOWSPECV6_NODE
,
13110 &no_neighbor_set_peer_group_hidden_cmd
);
13112 /* "neighbor softreconfiguration inbound" commands.*/
13113 install_element(BGP_NODE
, &neighbor_soft_reconfiguration_hidden_cmd
);
13114 install_element(BGP_NODE
, &no_neighbor_soft_reconfiguration_hidden_cmd
);
13115 install_element(BGP_IPV4_NODE
, &neighbor_soft_reconfiguration_cmd
);
13116 install_element(BGP_IPV4_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
13117 install_element(BGP_IPV4L_NODE
, &neighbor_soft_reconfiguration_cmd
);
13118 install_element(BGP_IPV4L_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
13119 install_element(BGP_IPV4M_NODE
, &neighbor_soft_reconfiguration_cmd
);
13120 install_element(BGP_IPV4M_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
13121 install_element(BGP_IPV6_NODE
, &neighbor_soft_reconfiguration_cmd
);
13122 install_element(BGP_IPV6_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
13123 install_element(BGP_IPV6M_NODE
, &neighbor_soft_reconfiguration_cmd
);
13124 install_element(BGP_IPV6M_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
13125 install_element(BGP_IPV6L_NODE
, &neighbor_soft_reconfiguration_cmd
);
13126 install_element(BGP_IPV6L_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
13127 install_element(BGP_VPNV4_NODE
, &neighbor_soft_reconfiguration_cmd
);
13128 install_element(BGP_VPNV4_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
13129 install_element(BGP_VPNV6_NODE
, &neighbor_soft_reconfiguration_cmd
);
13130 install_element(BGP_VPNV6_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
13131 install_element(BGP_FLOWSPECV4_NODE
,
13132 &neighbor_soft_reconfiguration_cmd
);
13133 install_element(BGP_FLOWSPECV4_NODE
,
13134 &no_neighbor_soft_reconfiguration_cmd
);
13135 install_element(BGP_FLOWSPECV6_NODE
,
13136 &neighbor_soft_reconfiguration_cmd
);
13137 install_element(BGP_FLOWSPECV6_NODE
,
13138 &no_neighbor_soft_reconfiguration_cmd
);
13139 install_element(BGP_EVPN_NODE
, &neighbor_soft_reconfiguration_cmd
);
13140 install_element(BGP_EVPN_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
13142 /* "neighbor attribute-unchanged" commands. */
13143 install_element(BGP_NODE
, &neighbor_attr_unchanged_hidden_cmd
);
13144 install_element(BGP_NODE
, &no_neighbor_attr_unchanged_hidden_cmd
);
13145 install_element(BGP_IPV4_NODE
, &neighbor_attr_unchanged_cmd
);
13146 install_element(BGP_IPV4_NODE
, &no_neighbor_attr_unchanged_cmd
);
13147 install_element(BGP_IPV4M_NODE
, &neighbor_attr_unchanged_cmd
);
13148 install_element(BGP_IPV4M_NODE
, &no_neighbor_attr_unchanged_cmd
);
13149 install_element(BGP_IPV4L_NODE
, &neighbor_attr_unchanged_cmd
);
13150 install_element(BGP_IPV4L_NODE
, &no_neighbor_attr_unchanged_cmd
);
13151 install_element(BGP_IPV6_NODE
, &neighbor_attr_unchanged_cmd
);
13152 install_element(BGP_IPV6_NODE
, &no_neighbor_attr_unchanged_cmd
);
13153 install_element(BGP_IPV6M_NODE
, &neighbor_attr_unchanged_cmd
);
13154 install_element(BGP_IPV6M_NODE
, &no_neighbor_attr_unchanged_cmd
);
13155 install_element(BGP_IPV6L_NODE
, &neighbor_attr_unchanged_cmd
);
13156 install_element(BGP_IPV6L_NODE
, &no_neighbor_attr_unchanged_cmd
);
13157 install_element(BGP_VPNV4_NODE
, &neighbor_attr_unchanged_cmd
);
13158 install_element(BGP_VPNV4_NODE
, &no_neighbor_attr_unchanged_cmd
);
13159 install_element(BGP_VPNV6_NODE
, &neighbor_attr_unchanged_cmd
);
13160 install_element(BGP_VPNV6_NODE
, &no_neighbor_attr_unchanged_cmd
);
13162 install_element(BGP_EVPN_NODE
, &neighbor_attr_unchanged_cmd
);
13163 install_element(BGP_EVPN_NODE
, &no_neighbor_attr_unchanged_cmd
);
13165 /* "nexthop-local unchanged" commands */
13166 install_element(BGP_IPV6_NODE
, &neighbor_nexthop_local_unchanged_cmd
);
13167 install_element(BGP_IPV6_NODE
,
13168 &no_neighbor_nexthop_local_unchanged_cmd
);
13170 /* "neighbor next-hop-self" commands. */
13171 install_element(BGP_NODE
, &neighbor_nexthop_self_hidden_cmd
);
13172 install_element(BGP_NODE
, &no_neighbor_nexthop_self_hidden_cmd
);
13173 install_element(BGP_IPV4_NODE
, &neighbor_nexthop_self_cmd
);
13174 install_element(BGP_IPV4_NODE
, &no_neighbor_nexthop_self_cmd
);
13175 install_element(BGP_IPV4M_NODE
, &neighbor_nexthop_self_cmd
);
13176 install_element(BGP_IPV4M_NODE
, &no_neighbor_nexthop_self_cmd
);
13177 install_element(BGP_IPV4L_NODE
, &neighbor_nexthop_self_cmd
);
13178 install_element(BGP_IPV4L_NODE
, &no_neighbor_nexthop_self_cmd
);
13179 install_element(BGP_IPV6_NODE
, &neighbor_nexthop_self_cmd
);
13180 install_element(BGP_IPV6_NODE
, &no_neighbor_nexthop_self_cmd
);
13181 install_element(BGP_IPV6M_NODE
, &neighbor_nexthop_self_cmd
);
13182 install_element(BGP_IPV6M_NODE
, &no_neighbor_nexthop_self_cmd
);
13183 install_element(BGP_IPV6L_NODE
, &neighbor_nexthop_self_cmd
);
13184 install_element(BGP_IPV6L_NODE
, &no_neighbor_nexthop_self_cmd
);
13185 install_element(BGP_VPNV4_NODE
, &neighbor_nexthop_self_cmd
);
13186 install_element(BGP_VPNV4_NODE
, &no_neighbor_nexthop_self_cmd
);
13187 install_element(BGP_VPNV6_NODE
, &neighbor_nexthop_self_cmd
);
13188 install_element(BGP_VPNV6_NODE
, &no_neighbor_nexthop_self_cmd
);
13189 install_element(BGP_EVPN_NODE
, &neighbor_nexthop_self_cmd
);
13190 install_element(BGP_EVPN_NODE
, &no_neighbor_nexthop_self_cmd
);
13192 /* "neighbor next-hop-self force" commands. */
13193 install_element(BGP_NODE
, &neighbor_nexthop_self_force_hidden_cmd
);
13194 install_element(BGP_NODE
, &no_neighbor_nexthop_self_force_hidden_cmd
);
13195 install_element(BGP_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
13196 install_element(BGP_NODE
, &no_neighbor_nexthop_self_all_hidden_cmd
);
13197 install_element(BGP_IPV4_NODE
, &neighbor_nexthop_self_force_cmd
);
13198 install_element(BGP_IPV4_NODE
, &no_neighbor_nexthop_self_force_cmd
);
13199 install_element(BGP_IPV4_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
13200 install_element(BGP_IPV4_NODE
,
13201 &no_neighbor_nexthop_self_all_hidden_cmd
);
13202 install_element(BGP_IPV4M_NODE
, &neighbor_nexthop_self_force_cmd
);
13203 install_element(BGP_IPV4M_NODE
, &no_neighbor_nexthop_self_force_cmd
);
13204 install_element(BGP_IPV4M_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
13205 install_element(BGP_IPV4M_NODE
,
13206 &no_neighbor_nexthop_self_all_hidden_cmd
);
13207 install_element(BGP_IPV4L_NODE
, &neighbor_nexthop_self_force_cmd
);
13208 install_element(BGP_IPV4L_NODE
, &no_neighbor_nexthop_self_force_cmd
);
13209 install_element(BGP_IPV4L_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
13210 install_element(BGP_IPV4L_NODE
,
13211 &no_neighbor_nexthop_self_all_hidden_cmd
);
13212 install_element(BGP_IPV6_NODE
, &neighbor_nexthop_self_force_cmd
);
13213 install_element(BGP_IPV6_NODE
, &no_neighbor_nexthop_self_force_cmd
);
13214 install_element(BGP_IPV6_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
13215 install_element(BGP_IPV6_NODE
,
13216 &no_neighbor_nexthop_self_all_hidden_cmd
);
13217 install_element(BGP_IPV6M_NODE
, &neighbor_nexthop_self_force_cmd
);
13218 install_element(BGP_IPV6M_NODE
, &no_neighbor_nexthop_self_force_cmd
);
13219 install_element(BGP_IPV6M_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
13220 install_element(BGP_IPV6M_NODE
,
13221 &no_neighbor_nexthop_self_all_hidden_cmd
);
13222 install_element(BGP_IPV6L_NODE
, &neighbor_nexthop_self_force_cmd
);
13223 install_element(BGP_IPV6L_NODE
, &no_neighbor_nexthop_self_force_cmd
);
13224 install_element(BGP_IPV6L_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
13225 install_element(BGP_IPV6L_NODE
,
13226 &no_neighbor_nexthop_self_all_hidden_cmd
);
13227 install_element(BGP_VPNV4_NODE
, &neighbor_nexthop_self_force_cmd
);
13228 install_element(BGP_VPNV4_NODE
, &no_neighbor_nexthop_self_force_cmd
);
13229 install_element(BGP_VPNV4_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
13230 install_element(BGP_VPNV4_NODE
,
13231 &no_neighbor_nexthop_self_all_hidden_cmd
);
13232 install_element(BGP_VPNV6_NODE
, &neighbor_nexthop_self_force_cmd
);
13233 install_element(BGP_VPNV6_NODE
, &no_neighbor_nexthop_self_force_cmd
);
13234 install_element(BGP_VPNV6_NODE
, &neighbor_nexthop_self_all_hidden_cmd
);
13235 install_element(BGP_VPNV6_NODE
,
13236 &no_neighbor_nexthop_self_all_hidden_cmd
);
13238 /* "neighbor as-override" commands. */
13239 install_element(BGP_NODE
, &neighbor_as_override_hidden_cmd
);
13240 install_element(BGP_NODE
, &no_neighbor_as_override_hidden_cmd
);
13241 install_element(BGP_IPV4_NODE
, &neighbor_as_override_cmd
);
13242 install_element(BGP_IPV4_NODE
, &no_neighbor_as_override_cmd
);
13243 install_element(BGP_IPV4M_NODE
, &neighbor_as_override_cmd
);
13244 install_element(BGP_IPV4M_NODE
, &no_neighbor_as_override_cmd
);
13245 install_element(BGP_IPV4L_NODE
, &neighbor_as_override_cmd
);
13246 install_element(BGP_IPV4L_NODE
, &no_neighbor_as_override_cmd
);
13247 install_element(BGP_IPV6_NODE
, &neighbor_as_override_cmd
);
13248 install_element(BGP_IPV6_NODE
, &no_neighbor_as_override_cmd
);
13249 install_element(BGP_IPV6M_NODE
, &neighbor_as_override_cmd
);
13250 install_element(BGP_IPV6M_NODE
, &no_neighbor_as_override_cmd
);
13251 install_element(BGP_IPV6L_NODE
, &neighbor_as_override_cmd
);
13252 install_element(BGP_IPV6L_NODE
, &no_neighbor_as_override_cmd
);
13253 install_element(BGP_VPNV4_NODE
, &neighbor_as_override_cmd
);
13254 install_element(BGP_VPNV4_NODE
, &no_neighbor_as_override_cmd
);
13255 install_element(BGP_VPNV6_NODE
, &neighbor_as_override_cmd
);
13256 install_element(BGP_VPNV6_NODE
, &no_neighbor_as_override_cmd
);
13258 /* "neighbor remove-private-AS" commands. */
13259 install_element(BGP_NODE
, &neighbor_remove_private_as_hidden_cmd
);
13260 install_element(BGP_NODE
, &no_neighbor_remove_private_as_hidden_cmd
);
13261 install_element(BGP_NODE
, &neighbor_remove_private_as_all_hidden_cmd
);
13262 install_element(BGP_NODE
,
13263 &no_neighbor_remove_private_as_all_hidden_cmd
);
13264 install_element(BGP_NODE
,
13265 &neighbor_remove_private_as_replace_as_hidden_cmd
);
13266 install_element(BGP_NODE
,
13267 &no_neighbor_remove_private_as_replace_as_hidden_cmd
);
13268 install_element(BGP_NODE
,
13269 &neighbor_remove_private_as_all_replace_as_hidden_cmd
);
13272 &no_neighbor_remove_private_as_all_replace_as_hidden_cmd
);
13273 install_element(BGP_IPV4_NODE
, &neighbor_remove_private_as_cmd
);
13274 install_element(BGP_IPV4_NODE
, &no_neighbor_remove_private_as_cmd
);
13275 install_element(BGP_IPV4_NODE
, &neighbor_remove_private_as_all_cmd
);
13276 install_element(BGP_IPV4_NODE
, &no_neighbor_remove_private_as_all_cmd
);
13277 install_element(BGP_IPV4_NODE
,
13278 &neighbor_remove_private_as_replace_as_cmd
);
13279 install_element(BGP_IPV4_NODE
,
13280 &no_neighbor_remove_private_as_replace_as_cmd
);
13281 install_element(BGP_IPV4_NODE
,
13282 &neighbor_remove_private_as_all_replace_as_cmd
);
13283 install_element(BGP_IPV4_NODE
,
13284 &no_neighbor_remove_private_as_all_replace_as_cmd
);
13285 install_element(BGP_IPV4M_NODE
, &neighbor_remove_private_as_cmd
);
13286 install_element(BGP_IPV4M_NODE
, &no_neighbor_remove_private_as_cmd
);
13287 install_element(BGP_IPV4M_NODE
, &neighbor_remove_private_as_all_cmd
);
13288 install_element(BGP_IPV4M_NODE
, &no_neighbor_remove_private_as_all_cmd
);
13289 install_element(BGP_IPV4M_NODE
,
13290 &neighbor_remove_private_as_replace_as_cmd
);
13291 install_element(BGP_IPV4M_NODE
,
13292 &no_neighbor_remove_private_as_replace_as_cmd
);
13293 install_element(BGP_IPV4M_NODE
,
13294 &neighbor_remove_private_as_all_replace_as_cmd
);
13295 install_element(BGP_IPV4M_NODE
,
13296 &no_neighbor_remove_private_as_all_replace_as_cmd
);
13297 install_element(BGP_IPV4L_NODE
, &neighbor_remove_private_as_cmd
);
13298 install_element(BGP_IPV4L_NODE
, &no_neighbor_remove_private_as_cmd
);
13299 install_element(BGP_IPV4L_NODE
, &neighbor_remove_private_as_all_cmd
);
13300 install_element(BGP_IPV4L_NODE
, &no_neighbor_remove_private_as_all_cmd
);
13301 install_element(BGP_IPV4L_NODE
,
13302 &neighbor_remove_private_as_replace_as_cmd
);
13303 install_element(BGP_IPV4L_NODE
,
13304 &no_neighbor_remove_private_as_replace_as_cmd
);
13305 install_element(BGP_IPV4L_NODE
,
13306 &neighbor_remove_private_as_all_replace_as_cmd
);
13307 install_element(BGP_IPV4L_NODE
,
13308 &no_neighbor_remove_private_as_all_replace_as_cmd
);
13309 install_element(BGP_IPV6_NODE
, &neighbor_remove_private_as_cmd
);
13310 install_element(BGP_IPV6_NODE
, &no_neighbor_remove_private_as_cmd
);
13311 install_element(BGP_IPV6_NODE
, &neighbor_remove_private_as_all_cmd
);
13312 install_element(BGP_IPV6_NODE
, &no_neighbor_remove_private_as_all_cmd
);
13313 install_element(BGP_IPV6_NODE
,
13314 &neighbor_remove_private_as_replace_as_cmd
);
13315 install_element(BGP_IPV6_NODE
,
13316 &no_neighbor_remove_private_as_replace_as_cmd
);
13317 install_element(BGP_IPV6_NODE
,
13318 &neighbor_remove_private_as_all_replace_as_cmd
);
13319 install_element(BGP_IPV6_NODE
,
13320 &no_neighbor_remove_private_as_all_replace_as_cmd
);
13321 install_element(BGP_IPV6M_NODE
, &neighbor_remove_private_as_cmd
);
13322 install_element(BGP_IPV6M_NODE
, &no_neighbor_remove_private_as_cmd
);
13323 install_element(BGP_IPV6M_NODE
, &neighbor_remove_private_as_all_cmd
);
13324 install_element(BGP_IPV6M_NODE
, &no_neighbor_remove_private_as_all_cmd
);
13325 install_element(BGP_IPV6M_NODE
,
13326 &neighbor_remove_private_as_replace_as_cmd
);
13327 install_element(BGP_IPV6M_NODE
,
13328 &no_neighbor_remove_private_as_replace_as_cmd
);
13329 install_element(BGP_IPV6M_NODE
,
13330 &neighbor_remove_private_as_all_replace_as_cmd
);
13331 install_element(BGP_IPV6M_NODE
,
13332 &no_neighbor_remove_private_as_all_replace_as_cmd
);
13333 install_element(BGP_IPV6L_NODE
, &neighbor_remove_private_as_cmd
);
13334 install_element(BGP_IPV6L_NODE
, &no_neighbor_remove_private_as_cmd
);
13335 install_element(BGP_IPV6L_NODE
, &neighbor_remove_private_as_all_cmd
);
13336 install_element(BGP_IPV6L_NODE
, &no_neighbor_remove_private_as_all_cmd
);
13337 install_element(BGP_IPV6L_NODE
,
13338 &neighbor_remove_private_as_replace_as_cmd
);
13339 install_element(BGP_IPV6L_NODE
,
13340 &no_neighbor_remove_private_as_replace_as_cmd
);
13341 install_element(BGP_IPV6L_NODE
,
13342 &neighbor_remove_private_as_all_replace_as_cmd
);
13343 install_element(BGP_IPV6L_NODE
,
13344 &no_neighbor_remove_private_as_all_replace_as_cmd
);
13345 install_element(BGP_VPNV4_NODE
, &neighbor_remove_private_as_cmd
);
13346 install_element(BGP_VPNV4_NODE
, &no_neighbor_remove_private_as_cmd
);
13347 install_element(BGP_VPNV4_NODE
, &neighbor_remove_private_as_all_cmd
);
13348 install_element(BGP_VPNV4_NODE
, &no_neighbor_remove_private_as_all_cmd
);
13349 install_element(BGP_VPNV4_NODE
,
13350 &neighbor_remove_private_as_replace_as_cmd
);
13351 install_element(BGP_VPNV4_NODE
,
13352 &no_neighbor_remove_private_as_replace_as_cmd
);
13353 install_element(BGP_VPNV4_NODE
,
13354 &neighbor_remove_private_as_all_replace_as_cmd
);
13355 install_element(BGP_VPNV4_NODE
,
13356 &no_neighbor_remove_private_as_all_replace_as_cmd
);
13357 install_element(BGP_VPNV6_NODE
, &neighbor_remove_private_as_cmd
);
13358 install_element(BGP_VPNV6_NODE
, &no_neighbor_remove_private_as_cmd
);
13359 install_element(BGP_VPNV6_NODE
, &neighbor_remove_private_as_all_cmd
);
13360 install_element(BGP_VPNV6_NODE
, &no_neighbor_remove_private_as_all_cmd
);
13361 install_element(BGP_VPNV6_NODE
,
13362 &neighbor_remove_private_as_replace_as_cmd
);
13363 install_element(BGP_VPNV6_NODE
,
13364 &no_neighbor_remove_private_as_replace_as_cmd
);
13365 install_element(BGP_VPNV6_NODE
,
13366 &neighbor_remove_private_as_all_replace_as_cmd
);
13367 install_element(BGP_VPNV6_NODE
,
13368 &no_neighbor_remove_private_as_all_replace_as_cmd
);
13370 /* "neighbor send-community" commands.*/
13371 install_element(BGP_NODE
, &neighbor_send_community_hidden_cmd
);
13372 install_element(BGP_NODE
, &neighbor_send_community_type_hidden_cmd
);
13373 install_element(BGP_NODE
, &no_neighbor_send_community_hidden_cmd
);
13374 install_element(BGP_NODE
, &no_neighbor_send_community_type_hidden_cmd
);
13375 install_element(BGP_IPV4_NODE
, &neighbor_send_community_cmd
);
13376 install_element(BGP_IPV4_NODE
, &neighbor_send_community_type_cmd
);
13377 install_element(BGP_IPV4_NODE
, &no_neighbor_send_community_cmd
);
13378 install_element(BGP_IPV4_NODE
, &no_neighbor_send_community_type_cmd
);
13379 install_element(BGP_IPV4M_NODE
, &neighbor_send_community_cmd
);
13380 install_element(BGP_IPV4M_NODE
, &neighbor_send_community_type_cmd
);
13381 install_element(BGP_IPV4M_NODE
, &no_neighbor_send_community_cmd
);
13382 install_element(BGP_IPV4M_NODE
, &no_neighbor_send_community_type_cmd
);
13383 install_element(BGP_IPV4L_NODE
, &neighbor_send_community_cmd
);
13384 install_element(BGP_IPV4L_NODE
, &neighbor_send_community_type_cmd
);
13385 install_element(BGP_IPV4L_NODE
, &no_neighbor_send_community_cmd
);
13386 install_element(BGP_IPV4L_NODE
, &no_neighbor_send_community_type_cmd
);
13387 install_element(BGP_IPV6_NODE
, &neighbor_send_community_cmd
);
13388 install_element(BGP_IPV6_NODE
, &neighbor_send_community_type_cmd
);
13389 install_element(BGP_IPV6_NODE
, &no_neighbor_send_community_cmd
);
13390 install_element(BGP_IPV6_NODE
, &no_neighbor_send_community_type_cmd
);
13391 install_element(BGP_IPV6M_NODE
, &neighbor_send_community_cmd
);
13392 install_element(BGP_IPV6M_NODE
, &neighbor_send_community_type_cmd
);
13393 install_element(BGP_IPV6M_NODE
, &no_neighbor_send_community_cmd
);
13394 install_element(BGP_IPV6M_NODE
, &no_neighbor_send_community_type_cmd
);
13395 install_element(BGP_IPV6L_NODE
, &neighbor_send_community_cmd
);
13396 install_element(BGP_IPV6L_NODE
, &neighbor_send_community_type_cmd
);
13397 install_element(BGP_IPV6L_NODE
, &no_neighbor_send_community_cmd
);
13398 install_element(BGP_IPV6L_NODE
, &no_neighbor_send_community_type_cmd
);
13399 install_element(BGP_VPNV4_NODE
, &neighbor_send_community_cmd
);
13400 install_element(BGP_VPNV4_NODE
, &neighbor_send_community_type_cmd
);
13401 install_element(BGP_VPNV4_NODE
, &no_neighbor_send_community_cmd
);
13402 install_element(BGP_VPNV4_NODE
, &no_neighbor_send_community_type_cmd
);
13403 install_element(BGP_VPNV6_NODE
, &neighbor_send_community_cmd
);
13404 install_element(BGP_VPNV6_NODE
, &neighbor_send_community_type_cmd
);
13405 install_element(BGP_VPNV6_NODE
, &no_neighbor_send_community_cmd
);
13406 install_element(BGP_VPNV6_NODE
, &no_neighbor_send_community_type_cmd
);
13408 /* "neighbor route-reflector" commands.*/
13409 install_element(BGP_NODE
, &neighbor_route_reflector_client_hidden_cmd
);
13410 install_element(BGP_NODE
,
13411 &no_neighbor_route_reflector_client_hidden_cmd
);
13412 install_element(BGP_IPV4_NODE
, &neighbor_route_reflector_client_cmd
);
13413 install_element(BGP_IPV4_NODE
, &no_neighbor_route_reflector_client_cmd
);
13414 install_element(BGP_IPV4M_NODE
, &neighbor_route_reflector_client_cmd
);
13415 install_element(BGP_IPV4M_NODE
,
13416 &no_neighbor_route_reflector_client_cmd
);
13417 install_element(BGP_IPV4L_NODE
, &neighbor_route_reflector_client_cmd
);
13418 install_element(BGP_IPV4L_NODE
,
13419 &no_neighbor_route_reflector_client_cmd
);
13420 install_element(BGP_IPV6_NODE
, &neighbor_route_reflector_client_cmd
);
13421 install_element(BGP_IPV6_NODE
, &no_neighbor_route_reflector_client_cmd
);
13422 install_element(BGP_IPV6M_NODE
, &neighbor_route_reflector_client_cmd
);
13423 install_element(BGP_IPV6M_NODE
,
13424 &no_neighbor_route_reflector_client_cmd
);
13425 install_element(BGP_IPV6L_NODE
, &neighbor_route_reflector_client_cmd
);
13426 install_element(BGP_IPV6L_NODE
,
13427 &no_neighbor_route_reflector_client_cmd
);
13428 install_element(BGP_VPNV4_NODE
, &neighbor_route_reflector_client_cmd
);
13429 install_element(BGP_VPNV4_NODE
,
13430 &no_neighbor_route_reflector_client_cmd
);
13431 install_element(BGP_VPNV6_NODE
, &neighbor_route_reflector_client_cmd
);
13432 install_element(BGP_VPNV6_NODE
,
13433 &no_neighbor_route_reflector_client_cmd
);
13434 install_element(BGP_FLOWSPECV4_NODE
,
13435 &neighbor_route_reflector_client_cmd
);
13436 install_element(BGP_FLOWSPECV4_NODE
,
13437 &no_neighbor_route_reflector_client_cmd
);
13438 install_element(BGP_FLOWSPECV6_NODE
,
13439 &neighbor_route_reflector_client_cmd
);
13440 install_element(BGP_FLOWSPECV6_NODE
,
13441 &no_neighbor_route_reflector_client_cmd
);
13442 install_element(BGP_EVPN_NODE
, &neighbor_route_reflector_client_cmd
);
13443 install_element(BGP_EVPN_NODE
, &no_neighbor_route_reflector_client_cmd
);
13445 /* "neighbor route-server" commands.*/
13446 install_element(BGP_NODE
, &neighbor_route_server_client_hidden_cmd
);
13447 install_element(BGP_NODE
, &no_neighbor_route_server_client_hidden_cmd
);
13448 install_element(BGP_IPV4_NODE
, &neighbor_route_server_client_cmd
);
13449 install_element(BGP_IPV4_NODE
, &no_neighbor_route_server_client_cmd
);
13450 install_element(BGP_IPV4M_NODE
, &neighbor_route_server_client_cmd
);
13451 install_element(BGP_IPV4M_NODE
, &no_neighbor_route_server_client_cmd
);
13452 install_element(BGP_IPV4L_NODE
, &neighbor_route_server_client_cmd
);
13453 install_element(BGP_IPV4L_NODE
, &no_neighbor_route_server_client_cmd
);
13454 install_element(BGP_IPV6_NODE
, &neighbor_route_server_client_cmd
);
13455 install_element(BGP_IPV6_NODE
, &no_neighbor_route_server_client_cmd
);
13456 install_element(BGP_IPV6M_NODE
, &neighbor_route_server_client_cmd
);
13457 install_element(BGP_IPV6M_NODE
, &no_neighbor_route_server_client_cmd
);
13458 install_element(BGP_IPV6L_NODE
, &neighbor_route_server_client_cmd
);
13459 install_element(BGP_IPV6L_NODE
, &no_neighbor_route_server_client_cmd
);
13460 install_element(BGP_VPNV4_NODE
, &neighbor_route_server_client_cmd
);
13461 install_element(BGP_VPNV4_NODE
, &no_neighbor_route_server_client_cmd
);
13462 install_element(BGP_VPNV6_NODE
, &neighbor_route_server_client_cmd
);
13463 install_element(BGP_VPNV6_NODE
, &no_neighbor_route_server_client_cmd
);
13464 install_element(BGP_EVPN_NODE
, &neighbor_route_server_client_cmd
);
13465 install_element(BGP_EVPN_NODE
, &no_neighbor_route_server_client_cmd
);
13466 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_route_server_client_cmd
);
13467 install_element(BGP_FLOWSPECV4_NODE
,
13468 &no_neighbor_route_server_client_cmd
);
13469 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_route_server_client_cmd
);
13470 install_element(BGP_FLOWSPECV6_NODE
,
13471 &no_neighbor_route_server_client_cmd
);
13473 /* "neighbor addpath-tx-all-paths" commands.*/
13474 install_element(BGP_NODE
, &neighbor_addpath_tx_all_paths_hidden_cmd
);
13475 install_element(BGP_NODE
, &no_neighbor_addpath_tx_all_paths_hidden_cmd
);
13476 install_element(BGP_IPV4_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
13477 install_element(BGP_IPV4_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
13478 install_element(BGP_IPV4M_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
13479 install_element(BGP_IPV4M_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
13480 install_element(BGP_IPV4L_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
13481 install_element(BGP_IPV4L_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
13482 install_element(BGP_IPV6_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
13483 install_element(BGP_IPV6_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
13484 install_element(BGP_IPV6M_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
13485 install_element(BGP_IPV6M_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
13486 install_element(BGP_IPV6L_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
13487 install_element(BGP_IPV6L_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
13488 install_element(BGP_VPNV4_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
13489 install_element(BGP_VPNV4_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
13490 install_element(BGP_VPNV6_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
13491 install_element(BGP_VPNV6_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
13493 /* "neighbor addpath-tx-bestpath-per-AS" commands.*/
13494 install_element(BGP_NODE
,
13495 &neighbor_addpath_tx_bestpath_per_as_hidden_cmd
);
13496 install_element(BGP_NODE
,
13497 &no_neighbor_addpath_tx_bestpath_per_as_hidden_cmd
);
13498 install_element(BGP_IPV4_NODE
,
13499 &neighbor_addpath_tx_bestpath_per_as_cmd
);
13500 install_element(BGP_IPV4_NODE
,
13501 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
13502 install_element(BGP_IPV4M_NODE
,
13503 &neighbor_addpath_tx_bestpath_per_as_cmd
);
13504 install_element(BGP_IPV4M_NODE
,
13505 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
13506 install_element(BGP_IPV4L_NODE
,
13507 &neighbor_addpath_tx_bestpath_per_as_cmd
);
13508 install_element(BGP_IPV4L_NODE
,
13509 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
13510 install_element(BGP_IPV6_NODE
,
13511 &neighbor_addpath_tx_bestpath_per_as_cmd
);
13512 install_element(BGP_IPV6_NODE
,
13513 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
13514 install_element(BGP_IPV6M_NODE
,
13515 &neighbor_addpath_tx_bestpath_per_as_cmd
);
13516 install_element(BGP_IPV6M_NODE
,
13517 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
13518 install_element(BGP_IPV6L_NODE
,
13519 &neighbor_addpath_tx_bestpath_per_as_cmd
);
13520 install_element(BGP_IPV6L_NODE
,
13521 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
13522 install_element(BGP_VPNV4_NODE
,
13523 &neighbor_addpath_tx_bestpath_per_as_cmd
);
13524 install_element(BGP_VPNV4_NODE
,
13525 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
13526 install_element(BGP_VPNV6_NODE
,
13527 &neighbor_addpath_tx_bestpath_per_as_cmd
);
13528 install_element(BGP_VPNV6_NODE
,
13529 &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
13531 /* "neighbor passive" commands. */
13532 install_element(BGP_NODE
, &neighbor_passive_cmd
);
13533 install_element(BGP_NODE
, &no_neighbor_passive_cmd
);
13536 /* "neighbor shutdown" commands. */
13537 install_element(BGP_NODE
, &neighbor_shutdown_cmd
);
13538 install_element(BGP_NODE
, &no_neighbor_shutdown_cmd
);
13539 install_element(BGP_NODE
, &neighbor_shutdown_msg_cmd
);
13540 install_element(BGP_NODE
, &no_neighbor_shutdown_msg_cmd
);
13542 /* "neighbor capability extended-nexthop" commands.*/
13543 install_element(BGP_NODE
, &neighbor_capability_enhe_cmd
);
13544 install_element(BGP_NODE
, &no_neighbor_capability_enhe_cmd
);
13546 /* "neighbor capability orf prefix-list" commands.*/
13547 install_element(BGP_NODE
, &neighbor_capability_orf_prefix_hidden_cmd
);
13548 install_element(BGP_NODE
,
13549 &no_neighbor_capability_orf_prefix_hidden_cmd
);
13550 install_element(BGP_IPV4_NODE
, &neighbor_capability_orf_prefix_cmd
);
13551 install_element(BGP_IPV4_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
13552 install_element(BGP_IPV4M_NODE
, &neighbor_capability_orf_prefix_cmd
);
13553 install_element(BGP_IPV4M_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
13554 install_element(BGP_IPV4L_NODE
, &neighbor_capability_orf_prefix_cmd
);
13555 install_element(BGP_IPV4L_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
13556 install_element(BGP_IPV6_NODE
, &neighbor_capability_orf_prefix_cmd
);
13557 install_element(BGP_IPV6_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
13558 install_element(BGP_IPV6M_NODE
, &neighbor_capability_orf_prefix_cmd
);
13559 install_element(BGP_IPV6M_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
13560 install_element(BGP_IPV6L_NODE
, &neighbor_capability_orf_prefix_cmd
);
13561 install_element(BGP_IPV6L_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
13563 /* "neighbor capability dynamic" commands.*/
13564 install_element(BGP_NODE
, &neighbor_capability_dynamic_cmd
);
13565 install_element(BGP_NODE
, &no_neighbor_capability_dynamic_cmd
);
13567 /* "neighbor dont-capability-negotiate" commands. */
13568 install_element(BGP_NODE
, &neighbor_dont_capability_negotiate_cmd
);
13569 install_element(BGP_NODE
, &no_neighbor_dont_capability_negotiate_cmd
);
13571 /* "neighbor ebgp-multihop" commands. */
13572 install_element(BGP_NODE
, &neighbor_ebgp_multihop_cmd
);
13573 install_element(BGP_NODE
, &neighbor_ebgp_multihop_ttl_cmd
);
13574 install_element(BGP_NODE
, &no_neighbor_ebgp_multihop_cmd
);
13576 /* "neighbor disable-connected-check" commands. */
13577 install_element(BGP_NODE
, &neighbor_disable_connected_check_cmd
);
13578 install_element(BGP_NODE
, &no_neighbor_disable_connected_check_cmd
);
13580 /* "neighbor enforce-first-as" commands. */
13581 install_element(BGP_NODE
, &neighbor_enforce_first_as_cmd
);
13582 install_element(BGP_NODE
, &no_neighbor_enforce_first_as_cmd
);
13584 /* "neighbor description" commands. */
13585 install_element(BGP_NODE
, &neighbor_description_cmd
);
13586 install_element(BGP_NODE
, &no_neighbor_description_cmd
);
13587 install_element(BGP_NODE
, &no_neighbor_description_comment_cmd
);
13589 /* "neighbor update-source" commands. "*/
13590 install_element(BGP_NODE
, &neighbor_update_source_cmd
);
13591 install_element(BGP_NODE
, &no_neighbor_update_source_cmd
);
13593 /* "neighbor default-originate" commands. */
13594 install_element(BGP_NODE
, &neighbor_default_originate_hidden_cmd
);
13595 install_element(BGP_NODE
, &neighbor_default_originate_rmap_hidden_cmd
);
13596 install_element(BGP_NODE
, &no_neighbor_default_originate_hidden_cmd
);
13597 install_element(BGP_IPV4_NODE
, &neighbor_default_originate_cmd
);
13598 install_element(BGP_IPV4_NODE
, &neighbor_default_originate_rmap_cmd
);
13599 install_element(BGP_IPV4_NODE
, &no_neighbor_default_originate_cmd
);
13600 install_element(BGP_IPV4M_NODE
, &neighbor_default_originate_cmd
);
13601 install_element(BGP_IPV4M_NODE
, &neighbor_default_originate_rmap_cmd
);
13602 install_element(BGP_IPV4M_NODE
, &no_neighbor_default_originate_cmd
);
13603 install_element(BGP_IPV4L_NODE
, &neighbor_default_originate_cmd
);
13604 install_element(BGP_IPV4L_NODE
, &neighbor_default_originate_rmap_cmd
);
13605 install_element(BGP_IPV4L_NODE
, &no_neighbor_default_originate_cmd
);
13606 install_element(BGP_IPV6_NODE
, &neighbor_default_originate_cmd
);
13607 install_element(BGP_IPV6_NODE
, &neighbor_default_originate_rmap_cmd
);
13608 install_element(BGP_IPV6_NODE
, &no_neighbor_default_originate_cmd
);
13609 install_element(BGP_IPV6M_NODE
, &neighbor_default_originate_cmd
);
13610 install_element(BGP_IPV6M_NODE
, &neighbor_default_originate_rmap_cmd
);
13611 install_element(BGP_IPV6M_NODE
, &no_neighbor_default_originate_cmd
);
13612 install_element(BGP_IPV6L_NODE
, &neighbor_default_originate_cmd
);
13613 install_element(BGP_IPV6L_NODE
, &neighbor_default_originate_rmap_cmd
);
13614 install_element(BGP_IPV6L_NODE
, &no_neighbor_default_originate_cmd
);
13616 /* "neighbor port" commands. */
13617 install_element(BGP_NODE
, &neighbor_port_cmd
);
13618 install_element(BGP_NODE
, &no_neighbor_port_cmd
);
13620 /* "neighbor weight" commands. */
13621 install_element(BGP_NODE
, &neighbor_weight_hidden_cmd
);
13622 install_element(BGP_NODE
, &no_neighbor_weight_hidden_cmd
);
13624 install_element(BGP_IPV4_NODE
, &neighbor_weight_cmd
);
13625 install_element(BGP_IPV4_NODE
, &no_neighbor_weight_cmd
);
13626 install_element(BGP_IPV4M_NODE
, &neighbor_weight_cmd
);
13627 install_element(BGP_IPV4M_NODE
, &no_neighbor_weight_cmd
);
13628 install_element(BGP_IPV4L_NODE
, &neighbor_weight_cmd
);
13629 install_element(BGP_IPV4L_NODE
, &no_neighbor_weight_cmd
);
13630 install_element(BGP_IPV6_NODE
, &neighbor_weight_cmd
);
13631 install_element(BGP_IPV6_NODE
, &no_neighbor_weight_cmd
);
13632 install_element(BGP_IPV6M_NODE
, &neighbor_weight_cmd
);
13633 install_element(BGP_IPV6M_NODE
, &no_neighbor_weight_cmd
);
13634 install_element(BGP_IPV6L_NODE
, &neighbor_weight_cmd
);
13635 install_element(BGP_IPV6L_NODE
, &no_neighbor_weight_cmd
);
13636 install_element(BGP_VPNV4_NODE
, &neighbor_weight_cmd
);
13637 install_element(BGP_VPNV4_NODE
, &no_neighbor_weight_cmd
);
13638 install_element(BGP_VPNV6_NODE
, &neighbor_weight_cmd
);
13639 install_element(BGP_VPNV6_NODE
, &no_neighbor_weight_cmd
);
13641 /* "neighbor override-capability" commands. */
13642 install_element(BGP_NODE
, &neighbor_override_capability_cmd
);
13643 install_element(BGP_NODE
, &no_neighbor_override_capability_cmd
);
13645 /* "neighbor strict-capability-match" commands. */
13646 install_element(BGP_NODE
, &neighbor_strict_capability_cmd
);
13647 install_element(BGP_NODE
, &no_neighbor_strict_capability_cmd
);
13649 /* "neighbor timers" commands. */
13650 install_element(BGP_NODE
, &neighbor_timers_cmd
);
13651 install_element(BGP_NODE
, &no_neighbor_timers_cmd
);
13653 /* "neighbor timers connect" commands. */
13654 install_element(BGP_NODE
, &neighbor_timers_connect_cmd
);
13655 install_element(BGP_NODE
, &no_neighbor_timers_connect_cmd
);
13657 /* "neighbor advertisement-interval" commands. */
13658 install_element(BGP_NODE
, &neighbor_advertise_interval_cmd
);
13659 install_element(BGP_NODE
, &no_neighbor_advertise_interval_cmd
);
13661 /* "neighbor interface" commands. */
13662 install_element(BGP_NODE
, &neighbor_interface_cmd
);
13663 install_element(BGP_NODE
, &no_neighbor_interface_cmd
);
13665 /* "neighbor distribute" commands. */
13666 install_element(BGP_NODE
, &neighbor_distribute_list_hidden_cmd
);
13667 install_element(BGP_NODE
, &no_neighbor_distribute_list_hidden_cmd
);
13668 install_element(BGP_IPV4_NODE
, &neighbor_distribute_list_cmd
);
13669 install_element(BGP_IPV4_NODE
, &no_neighbor_distribute_list_cmd
);
13670 install_element(BGP_IPV4M_NODE
, &neighbor_distribute_list_cmd
);
13671 install_element(BGP_IPV4M_NODE
, &no_neighbor_distribute_list_cmd
);
13672 install_element(BGP_IPV4L_NODE
, &neighbor_distribute_list_cmd
);
13673 install_element(BGP_IPV4L_NODE
, &no_neighbor_distribute_list_cmd
);
13674 install_element(BGP_IPV6_NODE
, &neighbor_distribute_list_cmd
);
13675 install_element(BGP_IPV6_NODE
, &no_neighbor_distribute_list_cmd
);
13676 install_element(BGP_IPV6M_NODE
, &neighbor_distribute_list_cmd
);
13677 install_element(BGP_IPV6M_NODE
, &no_neighbor_distribute_list_cmd
);
13678 install_element(BGP_IPV6L_NODE
, &neighbor_distribute_list_cmd
);
13679 install_element(BGP_IPV6L_NODE
, &no_neighbor_distribute_list_cmd
);
13680 install_element(BGP_VPNV4_NODE
, &neighbor_distribute_list_cmd
);
13681 install_element(BGP_VPNV4_NODE
, &no_neighbor_distribute_list_cmd
);
13682 install_element(BGP_VPNV6_NODE
, &neighbor_distribute_list_cmd
);
13683 install_element(BGP_VPNV6_NODE
, &no_neighbor_distribute_list_cmd
);
13685 /* "neighbor prefix-list" commands. */
13686 install_element(BGP_NODE
, &neighbor_prefix_list_hidden_cmd
);
13687 install_element(BGP_NODE
, &no_neighbor_prefix_list_hidden_cmd
);
13688 install_element(BGP_IPV4_NODE
, &neighbor_prefix_list_cmd
);
13689 install_element(BGP_IPV4_NODE
, &no_neighbor_prefix_list_cmd
);
13690 install_element(BGP_IPV4M_NODE
, &neighbor_prefix_list_cmd
);
13691 install_element(BGP_IPV4M_NODE
, &no_neighbor_prefix_list_cmd
);
13692 install_element(BGP_IPV4L_NODE
, &neighbor_prefix_list_cmd
);
13693 install_element(BGP_IPV4L_NODE
, &no_neighbor_prefix_list_cmd
);
13694 install_element(BGP_IPV6_NODE
, &neighbor_prefix_list_cmd
);
13695 install_element(BGP_IPV6_NODE
, &no_neighbor_prefix_list_cmd
);
13696 install_element(BGP_IPV6M_NODE
, &neighbor_prefix_list_cmd
);
13697 install_element(BGP_IPV6M_NODE
, &no_neighbor_prefix_list_cmd
);
13698 install_element(BGP_IPV6L_NODE
, &neighbor_prefix_list_cmd
);
13699 install_element(BGP_IPV6L_NODE
, &no_neighbor_prefix_list_cmd
);
13700 install_element(BGP_VPNV4_NODE
, &neighbor_prefix_list_cmd
);
13701 install_element(BGP_VPNV4_NODE
, &no_neighbor_prefix_list_cmd
);
13702 install_element(BGP_VPNV6_NODE
, &neighbor_prefix_list_cmd
);
13703 install_element(BGP_VPNV6_NODE
, &no_neighbor_prefix_list_cmd
);
13704 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_prefix_list_cmd
);
13705 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_prefix_list_cmd
);
13706 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_prefix_list_cmd
);
13707 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_prefix_list_cmd
);
13709 /* "neighbor filter-list" commands. */
13710 install_element(BGP_NODE
, &neighbor_filter_list_hidden_cmd
);
13711 install_element(BGP_NODE
, &no_neighbor_filter_list_hidden_cmd
);
13712 install_element(BGP_IPV4_NODE
, &neighbor_filter_list_cmd
);
13713 install_element(BGP_IPV4_NODE
, &no_neighbor_filter_list_cmd
);
13714 install_element(BGP_IPV4M_NODE
, &neighbor_filter_list_cmd
);
13715 install_element(BGP_IPV4M_NODE
, &no_neighbor_filter_list_cmd
);
13716 install_element(BGP_IPV4L_NODE
, &neighbor_filter_list_cmd
);
13717 install_element(BGP_IPV4L_NODE
, &no_neighbor_filter_list_cmd
);
13718 install_element(BGP_IPV6_NODE
, &neighbor_filter_list_cmd
);
13719 install_element(BGP_IPV6_NODE
, &no_neighbor_filter_list_cmd
);
13720 install_element(BGP_IPV6M_NODE
, &neighbor_filter_list_cmd
);
13721 install_element(BGP_IPV6M_NODE
, &no_neighbor_filter_list_cmd
);
13722 install_element(BGP_IPV6L_NODE
, &neighbor_filter_list_cmd
);
13723 install_element(BGP_IPV6L_NODE
, &no_neighbor_filter_list_cmd
);
13724 install_element(BGP_VPNV4_NODE
, &neighbor_filter_list_cmd
);
13725 install_element(BGP_VPNV4_NODE
, &no_neighbor_filter_list_cmd
);
13726 install_element(BGP_VPNV6_NODE
, &neighbor_filter_list_cmd
);
13727 install_element(BGP_VPNV6_NODE
, &no_neighbor_filter_list_cmd
);
13728 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_filter_list_cmd
);
13729 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_filter_list_cmd
);
13730 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_filter_list_cmd
);
13731 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_filter_list_cmd
);
13733 /* "neighbor route-map" commands. */
13734 install_element(BGP_NODE
, &neighbor_route_map_hidden_cmd
);
13735 install_element(BGP_NODE
, &no_neighbor_route_map_hidden_cmd
);
13736 install_element(BGP_IPV4_NODE
, &neighbor_route_map_cmd
);
13737 install_element(BGP_IPV4_NODE
, &no_neighbor_route_map_cmd
);
13738 install_element(BGP_IPV4M_NODE
, &neighbor_route_map_cmd
);
13739 install_element(BGP_IPV4M_NODE
, &no_neighbor_route_map_cmd
);
13740 install_element(BGP_IPV4L_NODE
, &neighbor_route_map_cmd
);
13741 install_element(BGP_IPV4L_NODE
, &no_neighbor_route_map_cmd
);
13742 install_element(BGP_IPV6_NODE
, &neighbor_route_map_cmd
);
13743 install_element(BGP_IPV6_NODE
, &no_neighbor_route_map_cmd
);
13744 install_element(BGP_IPV6M_NODE
, &neighbor_route_map_cmd
);
13745 install_element(BGP_IPV6M_NODE
, &no_neighbor_route_map_cmd
);
13746 install_element(BGP_IPV6L_NODE
, &neighbor_route_map_cmd
);
13747 install_element(BGP_IPV6L_NODE
, &no_neighbor_route_map_cmd
);
13748 install_element(BGP_VPNV4_NODE
, &neighbor_route_map_cmd
);
13749 install_element(BGP_VPNV4_NODE
, &no_neighbor_route_map_cmd
);
13750 install_element(BGP_VPNV6_NODE
, &neighbor_route_map_cmd
);
13751 install_element(BGP_VPNV6_NODE
, &no_neighbor_route_map_cmd
);
13752 install_element(BGP_FLOWSPECV4_NODE
, &neighbor_route_map_cmd
);
13753 install_element(BGP_FLOWSPECV4_NODE
, &no_neighbor_route_map_cmd
);
13754 install_element(BGP_FLOWSPECV6_NODE
, &neighbor_route_map_cmd
);
13755 install_element(BGP_FLOWSPECV6_NODE
, &no_neighbor_route_map_cmd
);
13756 install_element(BGP_EVPN_NODE
, &neighbor_route_map_cmd
);
13757 install_element(BGP_EVPN_NODE
, &no_neighbor_route_map_cmd
);
13759 /* "neighbor unsuppress-map" commands. */
13760 install_element(BGP_NODE
, &neighbor_unsuppress_map_hidden_cmd
);
13761 install_element(BGP_NODE
, &no_neighbor_unsuppress_map_hidden_cmd
);
13762 install_element(BGP_IPV4_NODE
, &neighbor_unsuppress_map_cmd
);
13763 install_element(BGP_IPV4_NODE
, &no_neighbor_unsuppress_map_cmd
);
13764 install_element(BGP_IPV4M_NODE
, &neighbor_unsuppress_map_cmd
);
13765 install_element(BGP_IPV4M_NODE
, &no_neighbor_unsuppress_map_cmd
);
13766 install_element(BGP_IPV4L_NODE
, &neighbor_unsuppress_map_cmd
);
13767 install_element(BGP_IPV4L_NODE
, &no_neighbor_unsuppress_map_cmd
);
13768 install_element(BGP_IPV6_NODE
, &neighbor_unsuppress_map_cmd
);
13769 install_element(BGP_IPV6_NODE
, &no_neighbor_unsuppress_map_cmd
);
13770 install_element(BGP_IPV6M_NODE
, &neighbor_unsuppress_map_cmd
);
13771 install_element(BGP_IPV6M_NODE
, &no_neighbor_unsuppress_map_cmd
);
13772 install_element(BGP_IPV6L_NODE
, &neighbor_unsuppress_map_cmd
);
13773 install_element(BGP_IPV6L_NODE
, &no_neighbor_unsuppress_map_cmd
);
13774 install_element(BGP_VPNV4_NODE
, &neighbor_unsuppress_map_cmd
);
13775 install_element(BGP_VPNV4_NODE
, &no_neighbor_unsuppress_map_cmd
);
13776 install_element(BGP_VPNV6_NODE
, &neighbor_unsuppress_map_cmd
);
13777 install_element(BGP_VPNV6_NODE
, &no_neighbor_unsuppress_map_cmd
);
13779 /* "neighbor maximum-prefix" commands. */
13780 install_element(BGP_NODE
, &neighbor_maximum_prefix_hidden_cmd
);
13781 install_element(BGP_NODE
,
13782 &neighbor_maximum_prefix_threshold_hidden_cmd
);
13783 install_element(BGP_NODE
, &neighbor_maximum_prefix_warning_hidden_cmd
);
13784 install_element(BGP_NODE
,
13785 &neighbor_maximum_prefix_threshold_warning_hidden_cmd
);
13786 install_element(BGP_NODE
, &neighbor_maximum_prefix_restart_hidden_cmd
);
13787 install_element(BGP_NODE
,
13788 &neighbor_maximum_prefix_threshold_restart_hidden_cmd
);
13789 install_element(BGP_NODE
, &no_neighbor_maximum_prefix_hidden_cmd
);
13790 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_cmd
);
13791 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13792 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13793 install_element(BGP_IPV4_NODE
,
13794 &neighbor_maximum_prefix_threshold_warning_cmd
);
13795 install_element(BGP_IPV4_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13796 install_element(BGP_IPV4_NODE
,
13797 &neighbor_maximum_prefix_threshold_restart_cmd
);
13798 install_element(BGP_IPV4_NODE
, &no_neighbor_maximum_prefix_cmd
);
13799 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_cmd
);
13800 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13801 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13802 install_element(BGP_IPV4M_NODE
,
13803 &neighbor_maximum_prefix_threshold_warning_cmd
);
13804 install_element(BGP_IPV4M_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13805 install_element(BGP_IPV4M_NODE
,
13806 &neighbor_maximum_prefix_threshold_restart_cmd
);
13807 install_element(BGP_IPV4M_NODE
, &no_neighbor_maximum_prefix_cmd
);
13808 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_cmd
);
13809 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13810 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13811 install_element(BGP_IPV4L_NODE
,
13812 &neighbor_maximum_prefix_threshold_warning_cmd
);
13813 install_element(BGP_IPV4L_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13814 install_element(BGP_IPV4L_NODE
,
13815 &neighbor_maximum_prefix_threshold_restart_cmd
);
13816 install_element(BGP_IPV4L_NODE
, &no_neighbor_maximum_prefix_cmd
);
13817 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_cmd
);
13818 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13819 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13820 install_element(BGP_IPV6_NODE
,
13821 &neighbor_maximum_prefix_threshold_warning_cmd
);
13822 install_element(BGP_IPV6_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13823 install_element(BGP_IPV6_NODE
,
13824 &neighbor_maximum_prefix_threshold_restart_cmd
);
13825 install_element(BGP_IPV6_NODE
, &no_neighbor_maximum_prefix_cmd
);
13826 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_cmd
);
13827 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13828 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13829 install_element(BGP_IPV6M_NODE
,
13830 &neighbor_maximum_prefix_threshold_warning_cmd
);
13831 install_element(BGP_IPV6M_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13832 install_element(BGP_IPV6M_NODE
,
13833 &neighbor_maximum_prefix_threshold_restart_cmd
);
13834 install_element(BGP_IPV6M_NODE
, &no_neighbor_maximum_prefix_cmd
);
13835 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_cmd
);
13836 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13837 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13838 install_element(BGP_IPV6L_NODE
,
13839 &neighbor_maximum_prefix_threshold_warning_cmd
);
13840 install_element(BGP_IPV6L_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13841 install_element(BGP_IPV6L_NODE
,
13842 &neighbor_maximum_prefix_threshold_restart_cmd
);
13843 install_element(BGP_IPV6L_NODE
, &no_neighbor_maximum_prefix_cmd
);
13844 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_cmd
);
13845 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13846 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13847 install_element(BGP_VPNV4_NODE
,
13848 &neighbor_maximum_prefix_threshold_warning_cmd
);
13849 install_element(BGP_VPNV4_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13850 install_element(BGP_VPNV4_NODE
,
13851 &neighbor_maximum_prefix_threshold_restart_cmd
);
13852 install_element(BGP_VPNV4_NODE
, &no_neighbor_maximum_prefix_cmd
);
13853 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_cmd
);
13854 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
13855 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_warning_cmd
);
13856 install_element(BGP_VPNV6_NODE
,
13857 &neighbor_maximum_prefix_threshold_warning_cmd
);
13858 install_element(BGP_VPNV6_NODE
, &neighbor_maximum_prefix_restart_cmd
);
13859 install_element(BGP_VPNV6_NODE
,
13860 &neighbor_maximum_prefix_threshold_restart_cmd
);
13861 install_element(BGP_VPNV6_NODE
, &no_neighbor_maximum_prefix_cmd
);
13863 /* "neighbor allowas-in" */
13864 install_element(BGP_NODE
, &neighbor_allowas_in_hidden_cmd
);
13865 install_element(BGP_NODE
, &no_neighbor_allowas_in_hidden_cmd
);
13866 install_element(BGP_IPV4_NODE
, &neighbor_allowas_in_cmd
);
13867 install_element(BGP_IPV4_NODE
, &no_neighbor_allowas_in_cmd
);
13868 install_element(BGP_IPV4M_NODE
, &neighbor_allowas_in_cmd
);
13869 install_element(BGP_IPV4M_NODE
, &no_neighbor_allowas_in_cmd
);
13870 install_element(BGP_IPV4L_NODE
, &neighbor_allowas_in_cmd
);
13871 install_element(BGP_IPV4L_NODE
, &no_neighbor_allowas_in_cmd
);
13872 install_element(BGP_IPV6_NODE
, &neighbor_allowas_in_cmd
);
13873 install_element(BGP_IPV6_NODE
, &no_neighbor_allowas_in_cmd
);
13874 install_element(BGP_IPV6M_NODE
, &neighbor_allowas_in_cmd
);
13875 install_element(BGP_IPV6M_NODE
, &no_neighbor_allowas_in_cmd
);
13876 install_element(BGP_IPV6L_NODE
, &neighbor_allowas_in_cmd
);
13877 install_element(BGP_IPV6L_NODE
, &no_neighbor_allowas_in_cmd
);
13878 install_element(BGP_VPNV4_NODE
, &neighbor_allowas_in_cmd
);
13879 install_element(BGP_VPNV4_NODE
, &no_neighbor_allowas_in_cmd
);
13880 install_element(BGP_VPNV6_NODE
, &neighbor_allowas_in_cmd
);
13881 install_element(BGP_VPNV6_NODE
, &no_neighbor_allowas_in_cmd
);
13882 install_element(BGP_EVPN_NODE
, &neighbor_allowas_in_cmd
);
13883 install_element(BGP_EVPN_NODE
, &no_neighbor_allowas_in_cmd
);
13885 /* address-family commands. */
13886 install_element(BGP_NODE
, &address_family_ipv4_safi_cmd
);
13887 install_element(BGP_NODE
, &address_family_ipv6_safi_cmd
);
13888 #ifdef KEEP_OLD_VPN_COMMANDS
13889 install_element(BGP_NODE
, &address_family_vpnv4_cmd
);
13890 install_element(BGP_NODE
, &address_family_vpnv6_cmd
);
13891 #endif /* KEEP_OLD_VPN_COMMANDS */
13893 install_element(BGP_NODE
, &address_family_evpn_cmd
);
13895 /* "exit-address-family" command. */
13896 install_element(BGP_IPV4_NODE
, &exit_address_family_cmd
);
13897 install_element(BGP_IPV4M_NODE
, &exit_address_family_cmd
);
13898 install_element(BGP_IPV4L_NODE
, &exit_address_family_cmd
);
13899 install_element(BGP_IPV6_NODE
, &exit_address_family_cmd
);
13900 install_element(BGP_IPV6M_NODE
, &exit_address_family_cmd
);
13901 install_element(BGP_IPV6L_NODE
, &exit_address_family_cmd
);
13902 install_element(BGP_VPNV4_NODE
, &exit_address_family_cmd
);
13903 install_element(BGP_VPNV6_NODE
, &exit_address_family_cmd
);
13904 install_element(BGP_FLOWSPECV4_NODE
, &exit_address_family_cmd
);
13905 install_element(BGP_FLOWSPECV6_NODE
, &exit_address_family_cmd
);
13906 install_element(BGP_EVPN_NODE
, &exit_address_family_cmd
);
13908 /* "clear ip bgp commands" */
13909 install_element(ENABLE_NODE
, &clear_ip_bgp_all_cmd
);
13911 /* clear ip bgp prefix */
13912 install_element(ENABLE_NODE
, &clear_ip_bgp_prefix_cmd
);
13913 install_element(ENABLE_NODE
, &clear_bgp_ipv6_safi_prefix_cmd
);
13914 install_element(ENABLE_NODE
, &clear_bgp_instance_ipv6_safi_prefix_cmd
);
13916 /* "show [ip] bgp summary" commands. */
13917 install_element(VIEW_NODE
, &show_bgp_instance_all_ipv6_updgrps_cmd
);
13918 install_element(VIEW_NODE
, &show_bgp_l2vpn_evpn_updgrps_cmd
);
13919 install_element(VIEW_NODE
, &show_bgp_instance_updgrps_stats_cmd
);
13920 install_element(VIEW_NODE
, &show_bgp_updgrps_stats_cmd
);
13921 install_element(VIEW_NODE
, &show_ip_bgp_instance_updgrps_adj_s_cmd
);
13922 install_element(VIEW_NODE
, &show_ip_bgp_summary_cmd
);
13923 install_element(VIEW_NODE
, &show_ip_bgp_updgrps_cmd
);
13925 /* "show [ip] bgp neighbors" commands. */
13926 install_element(VIEW_NODE
, &show_ip_bgp_neighbors_cmd
);
13928 /* "show [ip] bgp peer-group" commands. */
13929 install_element(VIEW_NODE
, &show_ip_bgp_peer_groups_cmd
);
13931 /* "show [ip] bgp paths" commands. */
13932 install_element(VIEW_NODE
, &show_ip_bgp_paths_cmd
);
13934 /* "show [ip] bgp community" commands. */
13935 install_element(VIEW_NODE
, &show_ip_bgp_community_info_cmd
);
13937 /* "show ip bgp large-community" commands. */
13938 install_element(VIEW_NODE
, &show_ip_bgp_lcommunity_info_cmd
);
13939 /* "show [ip] bgp attribute-info" commands. */
13940 install_element(VIEW_NODE
, &show_ip_bgp_attr_info_cmd
);
13941 /* "show [ip] bgp route-leak" command */
13942 install_element(VIEW_NODE
, &show_ip_bgp_route_leak_cmd
);
13944 /* "redistribute" commands. */
13945 install_element(BGP_NODE
, &bgp_redistribute_ipv4_hidden_cmd
);
13946 install_element(BGP_NODE
, &no_bgp_redistribute_ipv4_hidden_cmd
);
13947 install_element(BGP_NODE
, &bgp_redistribute_ipv4_rmap_hidden_cmd
);
13948 install_element(BGP_NODE
, &bgp_redistribute_ipv4_metric_hidden_cmd
);
13949 install_element(BGP_NODE
,
13950 &bgp_redistribute_ipv4_rmap_metric_hidden_cmd
);
13951 install_element(BGP_NODE
,
13952 &bgp_redistribute_ipv4_metric_rmap_hidden_cmd
);
13953 install_element(BGP_NODE
, &bgp_redistribute_ipv4_ospf_hidden_cmd
);
13954 install_element(BGP_NODE
, &no_bgp_redistribute_ipv4_ospf_hidden_cmd
);
13955 install_element(BGP_NODE
, &bgp_redistribute_ipv4_ospf_rmap_hidden_cmd
);
13956 install_element(BGP_NODE
,
13957 &bgp_redistribute_ipv4_ospf_metric_hidden_cmd
);
13958 install_element(BGP_NODE
,
13959 &bgp_redistribute_ipv4_ospf_rmap_metric_hidden_cmd
);
13960 install_element(BGP_NODE
,
13961 &bgp_redistribute_ipv4_ospf_metric_rmap_hidden_cmd
);
13962 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_cmd
);
13963 install_element(BGP_IPV4_NODE
, &no_bgp_redistribute_ipv4_cmd
);
13964 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_rmap_cmd
);
13965 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_metric_cmd
);
13966 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_rmap_metric_cmd
);
13967 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_metric_rmap_cmd
);
13968 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_ospf_cmd
);
13969 install_element(BGP_IPV4_NODE
, &no_bgp_redistribute_ipv4_ospf_cmd
);
13970 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_ospf_rmap_cmd
);
13971 install_element(BGP_IPV4_NODE
, &bgp_redistribute_ipv4_ospf_metric_cmd
);
13972 install_element(BGP_IPV4_NODE
,
13973 &bgp_redistribute_ipv4_ospf_rmap_metric_cmd
);
13974 install_element(BGP_IPV4_NODE
,
13975 &bgp_redistribute_ipv4_ospf_metric_rmap_cmd
);
13976 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_cmd
);
13977 install_element(BGP_IPV6_NODE
, &no_bgp_redistribute_ipv6_cmd
);
13978 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_rmap_cmd
);
13979 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_metric_cmd
);
13980 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_rmap_metric_cmd
);
13981 install_element(BGP_IPV6_NODE
, &bgp_redistribute_ipv6_metric_rmap_cmd
);
13983 /* import|export vpn [route-map WORD] */
13984 install_element(BGP_IPV4_NODE
, &bgp_imexport_vpn_cmd
);
13985 install_element(BGP_IPV6_NODE
, &bgp_imexport_vpn_cmd
);
13987 install_element(BGP_IPV4_NODE
, &bgp_imexport_vrf_cmd
);
13988 install_element(BGP_IPV6_NODE
, &bgp_imexport_vrf_cmd
);
13990 /* ttl_security commands */
13991 install_element(BGP_NODE
, &neighbor_ttl_security_cmd
);
13992 install_element(BGP_NODE
, &no_neighbor_ttl_security_cmd
);
13994 /* "show [ip] bgp memory" commands. */
13995 install_element(VIEW_NODE
, &show_bgp_memory_cmd
);
13997 /* "show bgp martian next-hop" */
13998 install_element(VIEW_NODE
, &show_bgp_martian_nexthop_db_cmd
);
14000 install_element(VIEW_NODE
, &show_bgp_mac_hash_cmd
);
14002 /* "show [ip] bgp views" commands. */
14003 install_element(VIEW_NODE
, &show_bgp_views_cmd
);
14005 /* "show [ip] bgp vrfs" commands. */
14006 install_element(VIEW_NODE
, &show_bgp_vrfs_cmd
);
14008 /* Community-list. */
14009 community_list_vty();
14011 /* vpn-policy commands */
14012 install_element(BGP_IPV4_NODE
, &af_rd_vpn_export_cmd
);
14013 install_element(BGP_IPV6_NODE
, &af_rd_vpn_export_cmd
);
14014 install_element(BGP_IPV4_NODE
, &af_label_vpn_export_cmd
);
14015 install_element(BGP_IPV6_NODE
, &af_label_vpn_export_cmd
);
14016 install_element(BGP_IPV4_NODE
, &af_nexthop_vpn_export_cmd
);
14017 install_element(BGP_IPV6_NODE
, &af_nexthop_vpn_export_cmd
);
14018 install_element(BGP_IPV4_NODE
, &af_rt_vpn_imexport_cmd
);
14019 install_element(BGP_IPV6_NODE
, &af_rt_vpn_imexport_cmd
);
14020 install_element(BGP_IPV4_NODE
, &af_route_map_vpn_imexport_cmd
);
14021 install_element(BGP_IPV6_NODE
, &af_route_map_vpn_imexport_cmd
);
14022 install_element(BGP_IPV4_NODE
, &af_import_vrf_route_map_cmd
);
14023 install_element(BGP_IPV6_NODE
, &af_import_vrf_route_map_cmd
);
14025 install_element(BGP_IPV4_NODE
, &af_routetarget_import_cmd
);
14026 install_element(BGP_IPV6_NODE
, &af_routetarget_import_cmd
);
14028 install_element(BGP_IPV4_NODE
, &af_no_rd_vpn_export_cmd
);
14029 install_element(BGP_IPV6_NODE
, &af_no_rd_vpn_export_cmd
);
14030 install_element(BGP_IPV4_NODE
, &af_no_label_vpn_export_cmd
);
14031 install_element(BGP_IPV6_NODE
, &af_no_label_vpn_export_cmd
);
14032 install_element(BGP_IPV4_NODE
, &af_no_nexthop_vpn_export_cmd
);
14033 install_element(BGP_IPV6_NODE
, &af_no_nexthop_vpn_export_cmd
);
14034 install_element(BGP_IPV4_NODE
, &af_no_rt_vpn_imexport_cmd
);
14035 install_element(BGP_IPV6_NODE
, &af_no_rt_vpn_imexport_cmd
);
14036 install_element(BGP_IPV4_NODE
, &af_no_route_map_vpn_imexport_cmd
);
14037 install_element(BGP_IPV6_NODE
, &af_no_route_map_vpn_imexport_cmd
);
14038 install_element(BGP_IPV4_NODE
, &af_no_import_vrf_route_map_cmd
);
14039 install_element(BGP_IPV6_NODE
, &af_no_import_vrf_route_map_cmd
);
14042 #include "memory.h"
14043 #include "bgp_regex.h"
14044 #include "bgp_clist.h"
14045 #include "bgp_ecommunity.h"
14047 /* VTY functions. */
14049 /* Direction value to string conversion. */
14050 static const char *community_direct_str(int direct
)
14053 case COMMUNITY_DENY
:
14055 case COMMUNITY_PERMIT
:
14062 /* Display error string. */
14063 static void community_list_perror(struct vty
*vty
, int ret
)
14066 case COMMUNITY_LIST_ERR_CANT_FIND_LIST
:
14067 vty_out(vty
, "%% Can't find community-list\n");
14069 case COMMUNITY_LIST_ERR_MALFORMED_VAL
:
14070 vty_out(vty
, "%% Malformed community-list value\n");
14072 case COMMUNITY_LIST_ERR_STANDARD_CONFLICT
:
14074 "%% Community name conflict, previously defined as standard community\n");
14076 case COMMUNITY_LIST_ERR_EXPANDED_CONFLICT
:
14078 "%% Community name conflict, previously defined as expanded community\n");
14083 /* "community-list" keyword help string. */
14084 #define COMMUNITY_LIST_STR "Add a community list entry\n"
14086 /*community-list standard */
14087 DEFUN (community_list_standard
,
14088 bgp_community_list_standard_cmd
,
14089 "bgp community-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
14092 "Community list number (standard)\n"
14093 "Add an standard community-list entry\n"
14094 "Community list name\n"
14095 "Specify community to reject\n"
14096 "Specify community to accept\n"
14099 char *cl_name_or_number
= NULL
;
14101 int style
= COMMUNITY_LIST_STANDARD
;
14105 if (argv_find(argv
, argc
, "ip", &idx
)) {
14106 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
14107 vty_out(vty
, "if you are using this please migrate to the below command.\n");
14108 vty_out(vty
, "'bgp community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> AA:NN'\n");
14109 zlog_warn("Deprecated option: 'ip community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> AA:NN' being used");
14112 argv_find(argv
, argc
, "(1-99)", &idx
);
14113 argv_find(argv
, argc
, "WORD", &idx
);
14114 cl_name_or_number
= argv
[idx
]->arg
;
14115 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
14117 argv_find(argv
, argc
, "AA:NN", &idx
);
14118 char *str
= argv_concat(argv
, argc
, idx
);
14120 int ret
= community_list_set(bgp_clist
, cl_name_or_number
, str
, direct
,
14123 XFREE(MTYPE_TMP
, str
);
14126 /* Display error string. */
14127 community_list_perror(vty
, ret
);
14128 return CMD_WARNING_CONFIG_FAILED
;
14131 return CMD_SUCCESS
;
14134 #if CONFDATE > 20191005
14135 CPP_NOTICE("bgpd: remove deprecated 'ip community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> AA:NN' command")
14137 ALIAS (community_list_standard
,
14138 ip_community_list_standard_cmd
,
14139 "ip community-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
14142 "Community list number (standard)\n"
14143 "Add an standard community-list entry\n"
14144 "Community list name\n"
14145 "Specify community to reject\n"
14146 "Specify community to accept\n"
14149 DEFUN (no_community_list_standard_all
,
14150 no_bgp_community_list_standard_all_cmd
,
14151 "no bgp community-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
14155 "Community list number (standard)\n"
14156 "Add an standard community-list entry\n"
14157 "Community list name\n"
14158 "Specify community to reject\n"
14159 "Specify community to accept\n"
14162 char *cl_name_or_number
= NULL
;
14165 int style
= COMMUNITY_LIST_STANDARD
;
14169 if (argv_find(argv
, argc
, "ip", &idx
)) {
14170 vty_out(vty
, "This config option is deprecated, and is scheduled for removal\n");
14171 vty_out(vty
, "if you are using this please migrate to the below command.\n");
14172 vty_out(vty
, "'no bgp community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> AA:NN'\n");
14173 zlog_warn("Deprecated option: 'no ip community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> |AA:NN' being used");
14176 argv_find(argv
, argc
, "permit", &idx
);
14177 argv_find(argv
, argc
, "deny", &idx
);
14180 direct
= argv_find(argv
, argc
, "permit", &idx
)
14185 argv_find(argv
, argc
, "AA:NN", &idx
);
14186 str
= argv_concat(argv
, argc
, idx
);
14190 argv_find(argv
, argc
, "(1-99)", &idx
);
14191 argv_find(argv
, argc
, "WORD", &idx
);
14192 cl_name_or_number
= argv
[idx
]->arg
;
14194 int ret
= community_list_unset(bgp_clist
, cl_name_or_number
, str
,
14197 XFREE(MTYPE_TMP
, str
);
14200 community_list_perror(vty
, ret
);
14201 return CMD_WARNING_CONFIG_FAILED
;
14204 return CMD_SUCCESS
;
14206 ALIAS (no_community_list_standard_all
,
14207 no_ip_community_list_standard_all_cmd
,
14208 "no ip community-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
14212 "Community list number (standard)\n"
14213 "Add an standard community-list entry\n"
14214 "Community list name\n"
14215 "Specify community to reject\n"
14216 "Specify community to accept\n"
14219 ALIAS(no_community_list_standard_all
, no_bgp_community_list_standard_all_list_cmd
,
14220 "no bgp community-list <(1-99)|standard WORD>",
14221 NO_STR BGP_STR COMMUNITY_LIST_STR
14222 "Community list number (standard)\n"
14223 "Add an standard community-list entry\n"
14224 "Community list name\n")
14226 ALIAS(no_community_list_standard_all
, no_ip_community_list_standard_all_list_cmd
,
14227 "no ip community-list <(1-99)|standard WORD>",
14228 NO_STR BGP_STR COMMUNITY_LIST_STR
14229 "Community list number (standard)\n"
14230 "Add an standard community-list entry\n"
14231 "Community list name\n")
14233 /*community-list expanded */
14234 DEFUN (community_list_expanded_all
,
14235 bgp_community_list_expanded_all_cmd
,
14236 "bgp community-list <(100-500)|expanded WORD> <deny|permit> AA:NN...",
14239 "Community list number (expanded)\n"
14240 "Add an expanded community-list entry\n"
14241 "Community list name\n"
14242 "Specify community to reject\n"
14243 "Specify community to accept\n"
14246 char *cl_name_or_number
= NULL
;
14248 int style
= COMMUNITY_LIST_EXPANDED
;
14251 if (argv_find(argv
, argc
, "ip", &idx
)) {
14252 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
14253 vty_out(vty
, "if you are using this please migrate to the below command.\n");
14254 vty_out(vty
, "'bgp community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> AA:NN'\n");
14255 zlog_warn("Deprecated option: 'ip community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> AA:NN' being used");
14257 argv_find(argv
, argc
, "(100-500)", &idx
);
14258 argv_find(argv
, argc
, "WORD", &idx
);
14259 cl_name_or_number
= argv
[idx
]->arg
;
14260 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
14262 argv_find(argv
, argc
, "AA:NN", &idx
);
14263 char *str
= argv_concat(argv
, argc
, idx
);
14265 int ret
= community_list_set(bgp_clist
, cl_name_or_number
, str
, direct
,
14268 XFREE(MTYPE_TMP
, str
);
14271 /* Display error string. */
14272 community_list_perror(vty
, ret
);
14273 return CMD_WARNING_CONFIG_FAILED
;
14276 return CMD_SUCCESS
;
14279 ALIAS (community_list_expanded_all
,
14280 ip_community_list_expanded_all_cmd
,
14281 "ip community-list <(100-500)|expanded WORD> <deny|permit> AA:NN...",
14284 "Community list number (expanded)\n"
14285 "Add an expanded community-list entry\n"
14286 "Community list name\n"
14287 "Specify community to reject\n"
14288 "Specify community to accept\n"
14291 DEFUN (no_community_list_expanded_all
,
14292 no_bgp_community_list_expanded_all_cmd
,
14293 "no bgp community-list <(100-500)|expanded WORD> <deny|permit> AA:NN...",
14297 "Community list number (expanded)\n"
14298 "Add an expanded community-list entry\n"
14299 "Community list name\n"
14300 "Specify community to reject\n"
14301 "Specify community to accept\n"
14304 char *cl_name_or_number
= NULL
;
14307 int style
= COMMUNITY_LIST_EXPANDED
;
14310 if (argv_find(argv
, argc
, "ip", &idx
)) {
14311 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
14312 vty_out(vty
, "if you are using this please migrate to the below command.\n");
14313 vty_out(vty
, "'no bgp community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> AA:NN'\n");
14314 zlog_warn("Deprecated option: 'no ip community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> AA:NN' being used");
14318 argv_find(argv
, argc
, "permit", &idx
);
14319 argv_find(argv
, argc
, "deny", &idx
);
14322 direct
= argv_find(argv
, argc
, "permit", &idx
)
14327 argv_find(argv
, argc
, "AA:NN", &idx
);
14328 str
= argv_concat(argv
, argc
, idx
);
14332 argv_find(argv
, argc
, "(100-500)", &idx
);
14333 argv_find(argv
, argc
, "WORD", &idx
);
14334 cl_name_or_number
= argv
[idx
]->arg
;
14336 int ret
= community_list_unset(bgp_clist
, cl_name_or_number
, str
,
14339 XFREE(MTYPE_TMP
, str
);
14342 community_list_perror(vty
, ret
);
14343 return CMD_WARNING_CONFIG_FAILED
;
14346 return CMD_SUCCESS
;
14349 ALIAS (no_community_list_expanded_all
,
14350 no_ip_community_list_expanded_all_cmd
,
14351 "no ip community-list <(100-500)|expanded WORD> <deny|permit> AA:NN...",
14355 "Community list number (expanded)\n"
14356 "Add an expanded community-list entry\n"
14357 "Community list name\n"
14358 "Specify community to reject\n"
14359 "Specify community to accept\n"
14362 ALIAS(no_community_list_expanded_all
, no_bgp_community_list_expanded_all_list_cmd
,
14363 "no bgp community-list <(100-500)|expanded WORD>",
14364 NO_STR IP_STR COMMUNITY_LIST_STR
14365 "Community list number (expanded)\n"
14366 "Add an expanded community-list entry\n"
14367 "Community list name\n")
14369 ALIAS(no_community_list_expanded_all
, no_ip_community_list_expanded_all_list_cmd
,
14370 "no ip community-list <(100-500)|expanded WORD>",
14371 NO_STR IP_STR COMMUNITY_LIST_STR
14372 "Community list number (expanded)\n"
14373 "Add an expanded community-list entry\n"
14374 "Community list name\n")
14376 /* Return configuration string of community-list entry. */
14377 static const char *community_list_config_str(struct community_entry
*entry
)
14384 if (entry
->style
== COMMUNITY_LIST_STANDARD
)
14385 str
= community_str(entry
->u
.com
, false);
14386 else if (entry
->style
== LARGE_COMMUNITY_LIST_STANDARD
)
14387 str
= lcommunity_str(entry
->u
.lcom
, false);
14389 str
= entry
->config
;
14394 static void community_list_show(struct vty
*vty
, struct community_list
*list
)
14396 struct community_entry
*entry
;
14398 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
14399 if (entry
== list
->head
) {
14400 if (all_digit(list
->name
))
14401 vty_out(vty
, "Community %s list %s\n",
14402 entry
->style
== COMMUNITY_LIST_STANDARD
14404 : "(expanded) access",
14407 vty_out(vty
, "Named Community %s list %s\n",
14408 entry
->style
== COMMUNITY_LIST_STANDARD
14414 vty_out(vty
, " %s\n",
14415 community_direct_str(entry
->direct
));
14417 vty_out(vty
, " %s %s\n",
14418 community_direct_str(entry
->direct
),
14419 community_list_config_str(entry
));
14423 DEFUN (show_community_list
,
14424 show_bgp_community_list_cmd
,
14425 "show bgp community-list",
14428 "List community-list\n")
14430 struct community_list
*list
;
14431 struct community_list_master
*cm
;
14434 if (argv_find(argv
, argc
, "ip", &idx
)) {
14435 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
14436 vty_out(vty
, "if you are using this please migrate to the below command.\n");
14437 vty_out(vty
, "'show bgp community-list <(1-500)|WORD>'\n");
14438 zlog_warn("Deprecated option: 'ip show community-list <(1-500)|WORD>' being used");
14440 cm
= community_list_master_lookup(bgp_clist
, COMMUNITY_LIST_MASTER
);
14442 return CMD_SUCCESS
;
14444 for (list
= cm
->num
.head
; list
; list
= list
->next
)
14445 community_list_show(vty
, list
);
14447 for (list
= cm
->str
.head
; list
; list
= list
->next
)
14448 community_list_show(vty
, list
);
14450 return CMD_SUCCESS
;
14453 ALIAS (show_community_list
,
14454 show_ip_community_list_cmd
,
14455 "show ip community-list",
14458 "List community-list\n")
14460 DEFUN (show_community_list_arg
,
14461 show_bgp_community_list_arg_cmd
,
14462 "show bgp community-list <(1-500)|WORD>",
14465 "List community-list\n"
14466 "Community-list number\n"
14467 "Community-list name\n")
14469 int idx_comm_list
= 3;
14470 struct community_list
*list
;
14473 if (argv_find(argv
, argc
, "ip", &idx
)) {
14474 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
14475 vty_out(vty
, "if you are using this please migrate to the below command.\n");
14476 vty_out(vty
, "'show bgp community-list <(1-500)|WORD>'\n");
14477 zlog_warn("Deprecated option: 'ip show community-list <(1-500)|WORD>' being used");
14479 list
= community_list_lookup(bgp_clist
, argv
[idx_comm_list
]->arg
, 0,
14480 COMMUNITY_LIST_MASTER
);
14482 vty_out(vty
, "%% Can't find community-list\n");
14483 return CMD_WARNING
;
14486 community_list_show(vty
, list
);
14488 return CMD_SUCCESS
;
14491 ALIAS (show_community_list_arg
,
14492 show_ip_community_list_arg_cmd
,
14493 "show ip community-list <(1-500)|WORD>",
14496 "List community-list\n"
14497 "Community-list number\n"
14498 "Community-list name\n")
14501 * Large Community code.
14503 static int lcommunity_list_set_vty(struct vty
*vty
, int argc
,
14504 struct cmd_token
**argv
, int style
,
14505 int reject_all_digit_name
)
14513 if (argv_find(argv
, argc
, "ip", &idx
)) {
14514 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
14515 vty_out(vty
, "if you are using this please migrate to the below command.\n");
14516 vty_out(vty
, "'bgp large-community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:BB:CC>'\n");
14517 zlog_warn("Deprecated option: 'large-community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:BB:CC>' being used");
14519 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
14522 /* All digit name check. */
14524 argv_find(argv
, argc
, "WORD", &idx
);
14525 argv_find(argv
, argc
, "(1-99)", &idx
);
14526 argv_find(argv
, argc
, "(100-500)", &idx
);
14527 cl_name
= argv
[idx
]->arg
;
14528 if (reject_all_digit_name
&& all_digit(cl_name
)) {
14529 vty_out(vty
, "%% Community name cannot have all digits\n");
14530 return CMD_WARNING_CONFIG_FAILED
;
14534 argv_find(argv
, argc
, "AA:BB:CC", &idx
);
14535 argv_find(argv
, argc
, "LINE", &idx
);
14536 /* Concat community string argument. */
14538 str
= argv_concat(argv
, argc
, idx
);
14542 ret
= lcommunity_list_set(bgp_clist
, cl_name
, str
, direct
, style
);
14544 /* Free temporary community list string allocated by
14546 XFREE(MTYPE_TMP
, str
);
14549 community_list_perror(vty
, ret
);
14550 return CMD_WARNING_CONFIG_FAILED
;
14552 return CMD_SUCCESS
;
14555 static int lcommunity_list_unset_vty(struct vty
*vty
, int argc
,
14556 struct cmd_token
**argv
, int style
)
14563 if (argv_find(argv
, argc
, "ip", &idx
)) {
14564 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
14565 vty_out(vty
, "if you are using this please migrate to the below command.\n");
14566 vty_out(vty
, "'no bgp large-community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:BB:CC>'\n");
14567 zlog_warn("Deprecated option: 'no ip large-community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:BB:CC>' being used");
14569 argv_find(argv
, argc
, "permit", &idx
);
14570 argv_find(argv
, argc
, "deny", &idx
);
14573 /* Check the list direct. */
14574 if (strncmp(argv
[idx
]->arg
, "p", 1) == 0)
14575 direct
= COMMUNITY_PERMIT
;
14577 direct
= COMMUNITY_DENY
;
14580 argv_find(argv
, argc
, "LINE", &idx
);
14581 argv_find(argv
, argc
, "AA:AA:NN", &idx
);
14582 /* Concat community string argument. */
14583 str
= argv_concat(argv
, argc
, idx
);
14587 argv_find(argv
, argc
, "(1-99)", &idx
);
14588 argv_find(argv
, argc
, "(100-500)", &idx
);
14589 argv_find(argv
, argc
, "WORD", &idx
);
14591 /* Unset community list. */
14592 ret
= lcommunity_list_unset(bgp_clist
, argv
[idx
]->arg
, str
, direct
,
14595 /* Free temporary community list string allocated by
14597 XFREE(MTYPE_TMP
, str
);
14600 community_list_perror(vty
, ret
);
14601 return CMD_WARNING_CONFIG_FAILED
;
14604 return CMD_SUCCESS
;
14607 /* "large-community-list" keyword help string. */
14608 #define LCOMMUNITY_LIST_STR "Add a large community list entry\n"
14609 #define LCOMMUNITY_VAL_STR "large community in 'aa:bb:cc' format\n"
14611 #if CONFDATE > 20191005
14612 CPP_NOTICE("bgpd: remove deprecated 'ip large-community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:BB:CC>' command")
14614 DEFUN (lcommunity_list_standard
,
14615 bgp_lcommunity_list_standard_cmd
,
14616 "bgp large-community-list (1-99) <deny|permit>",
14618 LCOMMUNITY_LIST_STR
14619 "Large Community list number (standard)\n"
14620 "Specify large community to reject\n"
14621 "Specify large community to accept\n")
14623 return lcommunity_list_set_vty(vty
, argc
, argv
,
14624 LARGE_COMMUNITY_LIST_STANDARD
, 0);
14627 ALIAS (lcommunity_list_standard
,
14628 ip_lcommunity_list_standard_cmd
,
14629 "ip large-community-list (1-99) <deny|permit>",
14631 LCOMMUNITY_LIST_STR
14632 "Large Community list number (standard)\n"
14633 "Specify large community to reject\n"
14634 "Specify large community to accept\n")
14636 DEFUN (lcommunity_list_standard1
,
14637 bgp_lcommunity_list_standard1_cmd
,
14638 "bgp large-community-list (1-99) <deny|permit> AA:BB:CC...",
14640 LCOMMUNITY_LIST_STR
14641 "Large Community list number (standard)\n"
14642 "Specify large community to reject\n"
14643 "Specify large community to accept\n"
14644 LCOMMUNITY_VAL_STR
)
14646 return lcommunity_list_set_vty(vty
, argc
, argv
,
14647 LARGE_COMMUNITY_LIST_STANDARD
, 0);
14650 ALIAS (lcommunity_list_standard1
,
14651 ip_lcommunity_list_standard1_cmd
,
14652 "ip large-community-list (1-99) <deny|permit> AA:BB:CC...",
14654 LCOMMUNITY_LIST_STR
14655 "Large Community list number (standard)\n"
14656 "Specify large community to reject\n"
14657 "Specify large community to accept\n"
14658 LCOMMUNITY_VAL_STR
)
14660 DEFUN (lcommunity_list_expanded
,
14661 bgp_lcommunity_list_expanded_cmd
,
14662 "bgp large-community-list (100-500) <deny|permit> LINE...",
14664 LCOMMUNITY_LIST_STR
14665 "Large Community list number (expanded)\n"
14666 "Specify large community to reject\n"
14667 "Specify large community to accept\n"
14668 "An ordered list as a regular-expression\n")
14670 return lcommunity_list_set_vty(vty
, argc
, argv
,
14671 LARGE_COMMUNITY_LIST_EXPANDED
, 0);
14674 ALIAS (lcommunity_list_expanded
,
14675 ip_lcommunity_list_expanded_cmd
,
14676 "ip large-community-list (100-500) <deny|permit> LINE...",
14678 LCOMMUNITY_LIST_STR
14679 "Large Community list number (expanded)\n"
14680 "Specify large community to reject\n"
14681 "Specify large community to accept\n"
14682 "An ordered list as a regular-expression\n")
14684 DEFUN (lcommunity_list_name_standard
,
14685 bgp_lcommunity_list_name_standard_cmd
,
14686 "bgp large-community-list standard WORD <deny|permit>",
14688 LCOMMUNITY_LIST_STR
14689 "Specify standard large-community-list\n"
14690 "Large Community list name\n"
14691 "Specify large community to reject\n"
14692 "Specify large community to accept\n")
14694 return lcommunity_list_set_vty(vty
, argc
, argv
,
14695 LARGE_COMMUNITY_LIST_STANDARD
, 1);
14698 ALIAS (lcommunity_list_name_standard
,
14699 ip_lcommunity_list_name_standard_cmd
,
14700 "ip large-community-list standard WORD <deny|permit>",
14702 LCOMMUNITY_LIST_STR
14703 "Specify standard large-community-list\n"
14704 "Large Community list name\n"
14705 "Specify large community to reject\n"
14706 "Specify large community to accept\n")
14708 DEFUN (lcommunity_list_name_standard1
,
14709 bgp_lcommunity_list_name_standard1_cmd
,
14710 "bgp large-community-list standard WORD <deny|permit> AA:BB:CC...",
14712 LCOMMUNITY_LIST_STR
14713 "Specify standard large-community-list\n"
14714 "Large Community list name\n"
14715 "Specify large community to reject\n"
14716 "Specify large community to accept\n"
14717 LCOMMUNITY_VAL_STR
)
14719 return lcommunity_list_set_vty(vty
, argc
, argv
,
14720 LARGE_COMMUNITY_LIST_STANDARD
, 1);
14723 ALIAS (lcommunity_list_name_standard1
,
14724 ip_lcommunity_list_name_standard1_cmd
,
14725 "ip large-community-list standard WORD <deny|permit> AA:BB:CC...",
14727 LCOMMUNITY_LIST_STR
14728 "Specify standard large-community-list\n"
14729 "Large Community list name\n"
14730 "Specify large community to reject\n"
14731 "Specify large community to accept\n"
14732 LCOMMUNITY_VAL_STR
)
14734 DEFUN (lcommunity_list_name_expanded
,
14735 bgp_lcommunity_list_name_expanded_cmd
,
14736 "bgp large-community-list expanded WORD <deny|permit> LINE...",
14738 LCOMMUNITY_LIST_STR
14739 "Specify expanded large-community-list\n"
14740 "Large Community list name\n"
14741 "Specify large community to reject\n"
14742 "Specify large community to accept\n"
14743 "An ordered list as a regular-expression\n")
14745 return lcommunity_list_set_vty(vty
, argc
, argv
,
14746 LARGE_COMMUNITY_LIST_EXPANDED
, 1);
14749 ALIAS (lcommunity_list_name_expanded
,
14750 ip_lcommunity_list_name_expanded_cmd
,
14751 "ip large-community-list expanded WORD <deny|permit> LINE...",
14753 LCOMMUNITY_LIST_STR
14754 "Specify expanded large-community-list\n"
14755 "Large Community list name\n"
14756 "Specify large community to reject\n"
14757 "Specify large community to accept\n"
14758 "An ordered list as a regular-expression\n")
14760 DEFUN (no_lcommunity_list_standard_all
,
14761 no_bgp_lcommunity_list_standard_all_cmd
,
14762 "no bgp large-community-list <(1-99)|(100-500)|WORD>",
14765 LCOMMUNITY_LIST_STR
14766 "Large Community list number (standard)\n"
14767 "Large Community list number (expanded)\n"
14768 "Large Community list name\n")
14770 return lcommunity_list_unset_vty(vty
, argc
, argv
,
14771 LARGE_COMMUNITY_LIST_STANDARD
);
14774 ALIAS (no_lcommunity_list_standard_all
,
14775 no_ip_lcommunity_list_standard_all_cmd
,
14776 "no ip large-community-list <(1-99)|(100-500)|WORD>",
14779 LCOMMUNITY_LIST_STR
14780 "Large Community list number (standard)\n"
14781 "Large Community list number (expanded)\n"
14782 "Large Community list name\n")
14784 DEFUN (no_lcommunity_list_name_expanded_all
,
14785 no_bgp_lcommunity_list_name_expanded_all_cmd
,
14786 "no bgp large-community-list expanded WORD",
14789 LCOMMUNITY_LIST_STR
14790 "Specify expanded large-community-list\n"
14791 "Large Community list name\n")
14793 return lcommunity_list_unset_vty(vty
, argc
, argv
,
14794 LARGE_COMMUNITY_LIST_EXPANDED
);
14797 ALIAS (no_lcommunity_list_name_expanded_all
,
14798 no_ip_lcommunity_list_name_expanded_all_cmd
,
14799 "no ip large-community-list expanded WORD",
14802 LCOMMUNITY_LIST_STR
14803 "Specify expanded large-community-list\n"
14804 "Large Community list name\n")
14806 DEFUN (no_lcommunity_list_standard
,
14807 no_bgp_lcommunity_list_standard_cmd
,
14808 "no bgp large-community-list (1-99) <deny|permit> AA:AA:NN...",
14811 LCOMMUNITY_LIST_STR
14812 "Large Community list number (standard)\n"
14813 "Specify large community to reject\n"
14814 "Specify large community to accept\n"
14815 LCOMMUNITY_VAL_STR
)
14817 return lcommunity_list_unset_vty(vty
, argc
, argv
,
14818 LARGE_COMMUNITY_LIST_STANDARD
);
14821 ALIAS (no_lcommunity_list_standard
,
14822 no_ip_lcommunity_list_standard_cmd
,
14823 "no ip large-community-list (1-99) <deny|permit> AA:AA:NN...",
14826 LCOMMUNITY_LIST_STR
14827 "Large Community list number (standard)\n"
14828 "Specify large community to reject\n"
14829 "Specify large community to accept\n"
14830 LCOMMUNITY_VAL_STR
)
14832 DEFUN (no_lcommunity_list_expanded
,
14833 no_bgp_lcommunity_list_expanded_cmd
,
14834 "no bgp large-community-list (100-500) <deny|permit> LINE...",
14837 LCOMMUNITY_LIST_STR
14838 "Large Community list number (expanded)\n"
14839 "Specify large community to reject\n"
14840 "Specify large community to accept\n"
14841 "An ordered list as a regular-expression\n")
14843 return lcommunity_list_unset_vty(vty
, argc
, argv
,
14844 LARGE_COMMUNITY_LIST_EXPANDED
);
14847 ALIAS (no_lcommunity_list_expanded
,
14848 no_ip_lcommunity_list_expanded_cmd
,
14849 "no ip large-community-list (100-500) <deny|permit> LINE...",
14852 LCOMMUNITY_LIST_STR
14853 "Large Community list number (expanded)\n"
14854 "Specify large community to reject\n"
14855 "Specify large community to accept\n"
14856 "An ordered list as a regular-expression\n")
14858 DEFUN (no_lcommunity_list_name_standard
,
14859 no_bgp_lcommunity_list_name_standard_cmd
,
14860 "no bgp large-community-list standard WORD <deny|permit> AA:AA:NN...",
14863 LCOMMUNITY_LIST_STR
14864 "Specify standard large-community-list\n"
14865 "Large Community list name\n"
14866 "Specify large community to reject\n"
14867 "Specify large community to accept\n"
14868 LCOMMUNITY_VAL_STR
)
14870 return lcommunity_list_unset_vty(vty
, argc
, argv
,
14871 LARGE_COMMUNITY_LIST_STANDARD
);
14874 ALIAS (no_lcommunity_list_name_standard
,
14875 no_ip_lcommunity_list_name_standard_cmd
,
14876 "no ip large-community-list standard WORD <deny|permit> AA:AA:NN...",
14879 LCOMMUNITY_LIST_STR
14880 "Specify standard large-community-list\n"
14881 "Large Community list name\n"
14882 "Specify large community to reject\n"
14883 "Specify large community to accept\n"
14884 LCOMMUNITY_VAL_STR
)
14886 DEFUN (no_lcommunity_list_name_expanded
,
14887 no_bgp_lcommunity_list_name_expanded_cmd
,
14888 "no bgp large-community-list expanded WORD <deny|permit> LINE...",
14891 LCOMMUNITY_LIST_STR
14892 "Specify expanded large-community-list\n"
14893 "Large community list name\n"
14894 "Specify large community to reject\n"
14895 "Specify large community to accept\n"
14896 "An ordered list as a regular-expression\n")
14898 return lcommunity_list_unset_vty(vty
, argc
, argv
,
14899 LARGE_COMMUNITY_LIST_EXPANDED
);
14902 ALIAS (no_lcommunity_list_name_expanded
,
14903 no_ip_lcommunity_list_name_expanded_cmd
,
14904 "no ip large-community-list expanded WORD <deny|permit> LINE...",
14907 LCOMMUNITY_LIST_STR
14908 "Specify expanded large-community-list\n"
14909 "Large community list name\n"
14910 "Specify large community to reject\n"
14911 "Specify large community to accept\n"
14912 "An ordered list as a regular-expression\n")
14914 static void lcommunity_list_show(struct vty
*vty
, struct community_list
*list
)
14916 struct community_entry
*entry
;
14918 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
14919 if (entry
== list
->head
) {
14920 if (all_digit(list
->name
))
14921 vty_out(vty
, "Large community %s list %s\n",
14923 LARGE_COMMUNITY_LIST_STANDARD
14925 : "(expanded) access",
14929 "Named large community %s list %s\n",
14931 LARGE_COMMUNITY_LIST_STANDARD
14937 vty_out(vty
, " %s\n",
14938 community_direct_str(entry
->direct
));
14940 vty_out(vty
, " %s %s\n",
14941 community_direct_str(entry
->direct
),
14942 community_list_config_str(entry
));
14946 DEFUN (show_lcommunity_list
,
14947 show_bgp_lcommunity_list_cmd
,
14948 "show bgp large-community-list",
14951 "List large-community list\n")
14953 struct community_list
*list
;
14954 struct community_list_master
*cm
;
14957 if (argv_find(argv
, argc
, "ip", &idx
)) {
14958 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
14959 vty_out(vty
, "if you are using this please migrate to the below command.\n");
14960 vty_out(vty
, "'show bgp large-community-list <(1-500)|WORD>'\n");
14961 zlog_warn("Deprecated option: 'ip show large-community-list <(1-500)|WORD>' being used");
14964 cm
= community_list_master_lookup(bgp_clist
,
14965 LARGE_COMMUNITY_LIST_MASTER
);
14967 return CMD_SUCCESS
;
14969 for (list
= cm
->num
.head
; list
; list
= list
->next
)
14970 lcommunity_list_show(vty
, list
);
14972 for (list
= cm
->str
.head
; list
; list
= list
->next
)
14973 lcommunity_list_show(vty
, list
);
14975 return CMD_SUCCESS
;
14978 ALIAS (show_lcommunity_list
,
14979 show_ip_lcommunity_list_cmd
,
14980 "show ip large-community-list",
14983 "List large-community list\n")
14985 DEFUN (show_lcommunity_list_arg
,
14986 show_bgp_lcommunity_list_arg_cmd
,
14987 "show bgp large-community-list <(1-500)|WORD>",
14990 "List large-community list\n"
14991 "large-community-list number\n"
14992 "large-community-list name\n")
14994 struct community_list
*list
;
14997 if (argv_find(argv
, argc
, "ip", &idx
)) {
14998 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
14999 vty_out(vty
, "if you are using this please migrate to the below command.\n");
15000 vty_out(vty
, "'show bgp large-community-list <(1-500)|WORD>'\n");
15001 zlog_warn("Deprecated option: 'ip show large-community-list <(1-500)|WORD>' being used");
15004 list
= community_list_lookup(bgp_clist
, argv
[3]->arg
, 0,
15005 LARGE_COMMUNITY_LIST_MASTER
);
15007 vty_out(vty
, "%% Can't find extcommunity-list\n");
15008 return CMD_WARNING
;
15011 lcommunity_list_show(vty
, list
);
15013 return CMD_SUCCESS
;
15016 ALIAS (show_lcommunity_list_arg
,
15017 show_ip_lcommunity_list_arg_cmd
,
15018 "show ip large-community-list <(1-500)|WORD>",
15021 "List large-community list\n"
15022 "large-community-list number\n"
15023 "large-community-list name\n")
15025 /* "extcommunity-list" keyword help string. */
15026 #define EXTCOMMUNITY_LIST_STR "Add a extended community list entry\n"
15027 #define EXTCOMMUNITY_VAL_STR "Extended community attribute in 'rt aa:nn_or_IPaddr:nn' OR 'soo aa:nn_or_IPaddr:nn' format\n"
15029 DEFUN (extcommunity_list_standard
,
15030 bgp_extcommunity_list_standard_cmd
,
15031 "bgp extcommunity-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
15033 EXTCOMMUNITY_LIST_STR
15034 "Extended Community list number (standard)\n"
15035 "Specify standard extcommunity-list\n"
15036 "Community list name\n"
15037 "Specify community to reject\n"
15038 "Specify community to accept\n"
15039 EXTCOMMUNITY_VAL_STR
)
15041 int style
= EXTCOMMUNITY_LIST_STANDARD
;
15043 char *cl_number_or_name
= NULL
;
15046 if (argv_find(argv
, argc
, "ip", &idx
)) {
15047 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
15048 vty_out(vty
, "if you are using this please migrate to the below command.\n");
15049 vty_out(vty
, "'bgp extcommunity-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:NN>'\n");
15050 zlog_warn("Deprecated option: 'ip extcommunity-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:NN>' being used");
15052 argv_find(argv
, argc
, "(1-99)", &idx
);
15053 argv_find(argv
, argc
, "WORD", &idx
);
15054 cl_number_or_name
= argv
[idx
]->arg
;
15055 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
15057 argv_find(argv
, argc
, "AA:NN", &idx
);
15058 char *str
= argv_concat(argv
, argc
, idx
);
15060 int ret
= extcommunity_list_set(bgp_clist
, cl_number_or_name
, str
,
15063 XFREE(MTYPE_TMP
, str
);
15066 community_list_perror(vty
, ret
);
15067 return CMD_WARNING_CONFIG_FAILED
;
15070 return CMD_SUCCESS
;
15073 #if CONFDATE > 20191005
15074 CPP_NOTICE("bgpd: remove deprecated 'ip extcommunity-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:NN>' command")
15076 ALIAS (extcommunity_list_standard
,
15077 ip_extcommunity_list_standard_cmd
,
15078 "ip extcommunity-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
15080 EXTCOMMUNITY_LIST_STR
15081 "Extended Community list number (standard)\n"
15082 "Specify standard extcommunity-list\n"
15083 "Community list name\n"
15084 "Specify community to reject\n"
15085 "Specify community to accept\n"
15086 EXTCOMMUNITY_VAL_STR
)
15088 DEFUN (extcommunity_list_name_expanded
,
15089 bgp_extcommunity_list_name_expanded_cmd
,
15090 "bgp extcommunity-list <(100-500)|expanded WORD> <deny|permit> LINE...",
15092 EXTCOMMUNITY_LIST_STR
15093 "Extended Community list number (expanded)\n"
15094 "Specify expanded extcommunity-list\n"
15095 "Extended Community list name\n"
15096 "Specify community to reject\n"
15097 "Specify community to accept\n"
15098 "An ordered list as a regular-expression\n")
15100 int style
= EXTCOMMUNITY_LIST_EXPANDED
;
15102 char *cl_number_or_name
= NULL
;
15105 if (argv_find(argv
, argc
, "ip", &idx
)) {
15106 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
15107 vty_out(vty
, "if you are using this please migrate to the below command.\n");
15108 vty_out(vty
, "'extcommunity-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:NN>'\n");
15109 zlog_warn("Deprecated option: ‘ip extcommunity-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:NN>' being used");
15112 argv_find(argv
, argc
, "(100-500)", &idx
);
15113 argv_find(argv
, argc
, "WORD", &idx
);
15114 cl_number_or_name
= argv
[idx
]->arg
;
15115 direct
= argv_find(argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
15117 argv_find(argv
, argc
, "LINE", &idx
);
15118 char *str
= argv_concat(argv
, argc
, idx
);
15120 int ret
= extcommunity_list_set(bgp_clist
, cl_number_or_name
, str
,
15123 XFREE(MTYPE_TMP
, str
);
15126 community_list_perror(vty
, ret
);
15127 return CMD_WARNING_CONFIG_FAILED
;
15130 return CMD_SUCCESS
;
15133 ALIAS (extcommunity_list_name_expanded
,
15134 ip_extcommunity_list_name_expanded_cmd
,
15135 "ip extcommunity-list <(100-500)|expanded WORD> <deny|permit> LINE...",
15137 EXTCOMMUNITY_LIST_STR
15138 "Extended Community list number (expanded)\n"
15139 "Specify expanded extcommunity-list\n"
15140 "Extended Community list name\n"
15141 "Specify community to reject\n"
15142 "Specify community to accept\n"
15143 "An ordered list as a regular-expression\n")
15145 DEFUN (no_extcommunity_list_standard_all
,
15146 no_bgp_extcommunity_list_standard_all_cmd
,
15147 "no bgp extcommunity-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
15150 EXTCOMMUNITY_LIST_STR
15151 "Extended Community list number (standard)\n"
15152 "Specify standard extcommunity-list\n"
15153 "Community list name\n"
15154 "Specify community to reject\n"
15155 "Specify community to accept\n"
15156 EXTCOMMUNITY_VAL_STR
)
15158 int style
= EXTCOMMUNITY_LIST_STANDARD
;
15160 char *cl_number_or_name
= NULL
;
15164 if (argv_find(argv
, argc
, "ip", &idx
)) {
15165 vty_out(vty
, "This config option is deprecated, and is scheduled for removal\n");
15166 vty_out(vty
, "if you are using this please migrate to the below command.\n");
15167 vty_out(vty
, "'no bgp extcommunity-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:NN>'\n");
15168 zlog_warn("Deprecated option: ‘no ip extcommunity-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:NN>' being used");
15172 argv_find(argv
, argc
, "permit", &idx
);
15173 argv_find(argv
, argc
, "deny", &idx
);
15176 direct
= argv_find(argv
, argc
, "permit", &idx
)
15181 argv_find(argv
, argc
, "AA:NN", &idx
);
15182 str
= argv_concat(argv
, argc
, idx
);
15186 argv_find(argv
, argc
, "(1-99)", &idx
);
15187 argv_find(argv
, argc
, "WORD", &idx
);
15188 cl_number_or_name
= argv
[idx
]->arg
;
15190 int ret
= extcommunity_list_unset(bgp_clist
, cl_number_or_name
, str
,
15193 XFREE(MTYPE_TMP
, str
);
15196 community_list_perror(vty
, ret
);
15197 return CMD_WARNING_CONFIG_FAILED
;
15200 return CMD_SUCCESS
;
15203 ALIAS (no_extcommunity_list_standard_all
,
15204 no_ip_extcommunity_list_standard_all_cmd
,
15205 "no ip extcommunity-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
15208 EXTCOMMUNITY_LIST_STR
15209 "Extended Community list number (standard)\n"
15210 "Specify standard extcommunity-list\n"
15211 "Community list name\n"
15212 "Specify community to reject\n"
15213 "Specify community to accept\n"
15214 EXTCOMMUNITY_VAL_STR
)
15216 ALIAS(no_extcommunity_list_standard_all
,
15217 no_bgp_extcommunity_list_standard_all_list_cmd
,
15218 "no bgp extcommunity-list <(1-99)|standard WORD>",
15219 NO_STR IP_STR EXTCOMMUNITY_LIST_STR
15220 "Extended Community list number (standard)\n"
15221 "Specify standard extcommunity-list\n"
15222 "Community list name\n")
15224 ALIAS(no_extcommunity_list_standard_all
,
15225 no_ip_extcommunity_list_standard_all_list_cmd
,
15226 "no ip extcommunity-list <(1-99)|standard WORD>",
15227 NO_STR IP_STR EXTCOMMUNITY_LIST_STR
15228 "Extended Community list number (standard)\n"
15229 "Specify standard extcommunity-list\n"
15230 "Community list name\n")
15232 DEFUN (no_extcommunity_list_expanded_all
,
15233 no_bgp_extcommunity_list_expanded_all_cmd
,
15234 "no bgp extcommunity-list <(100-500)|expanded WORD> <deny|permit> LINE...",
15237 EXTCOMMUNITY_LIST_STR
15238 "Extended Community list number (expanded)\n"
15239 "Specify expanded extcommunity-list\n"
15240 "Extended Community list name\n"
15241 "Specify community to reject\n"
15242 "Specify community to accept\n"
15243 "An ordered list as a regular-expression\n")
15245 int style
= EXTCOMMUNITY_LIST_EXPANDED
;
15247 char *cl_number_or_name
= NULL
;
15251 if (argv_find(argv
, argc
, "ip", &idx
)) {
15252 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
15253 vty_out(vty
, "if you are using this please migrate to the below command.\n");
15254 vty_out(vty
, "'no bgp extcommunity-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:NN>'\n");
15255 zlog_warn("Deprecated option: ‘no ip extcommunity-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:NN>' being used");
15259 argv_find(argv
, argc
, "permit", &idx
);
15260 argv_find(argv
, argc
, "deny", &idx
);
15263 direct
= argv_find(argv
, argc
, "permit", &idx
)
15268 argv_find(argv
, argc
, "LINE", &idx
);
15269 str
= argv_concat(argv
, argc
, idx
);
15273 argv_find(argv
, argc
, "(100-500)", &idx
);
15274 argv_find(argv
, argc
, "WORD", &idx
);
15275 cl_number_or_name
= argv
[idx
]->arg
;
15277 int ret
= extcommunity_list_unset(bgp_clist
, cl_number_or_name
, str
,
15280 XFREE(MTYPE_TMP
, str
);
15283 community_list_perror(vty
, ret
);
15284 return CMD_WARNING_CONFIG_FAILED
;
15287 return CMD_SUCCESS
;
15290 ALIAS (no_extcommunity_list_expanded_all
,
15291 no_ip_extcommunity_list_expanded_all_cmd
,
15292 "no ip extcommunity-list <(100-500)|expanded WORD> <deny|permit> LINE...",
15295 EXTCOMMUNITY_LIST_STR
15296 "Extended Community list number (expanded)\n"
15297 "Specify expanded extcommunity-list\n"
15298 "Extended Community list name\n"
15299 "Specify community to reject\n"
15300 "Specify community to accept\n"
15301 "An ordered list as a regular-expression\n")
15303 ALIAS(no_extcommunity_list_expanded_all
,
15304 no_ip_extcommunity_list_expanded_all_list_cmd
,
15305 "no ip extcommunity-list <(100-500)|expanded WORD>",
15306 NO_STR IP_STR EXTCOMMUNITY_LIST_STR
15307 "Extended Community list number (expanded)\n"
15308 "Specify expanded extcommunity-list\n"
15309 "Extended Community list name\n")
15311 ALIAS(no_extcommunity_list_expanded_all
,
15312 no_bgp_extcommunity_list_expanded_all_list_cmd
,
15313 "no bgp extcommunity-list <(100-500)|expanded WORD>",
15314 NO_STR IP_STR EXTCOMMUNITY_LIST_STR
15315 "Extended Community list number (expanded)\n"
15316 "Specify expanded extcommunity-list\n"
15317 "Extended Community list name\n")
15319 static void extcommunity_list_show(struct vty
*vty
, struct community_list
*list
)
15321 struct community_entry
*entry
;
15323 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
15324 if (entry
== list
->head
) {
15325 if (all_digit(list
->name
))
15326 vty_out(vty
, "Extended community %s list %s\n",
15327 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
15329 : "(expanded) access",
15333 "Named extended community %s list %s\n",
15334 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
15340 vty_out(vty
, " %s\n",
15341 community_direct_str(entry
->direct
));
15343 vty_out(vty
, " %s %s\n",
15344 community_direct_str(entry
->direct
),
15345 community_list_config_str(entry
));
15349 DEFUN (show_extcommunity_list
,
15350 show_bgp_extcommunity_list_cmd
,
15351 "show bgp extcommunity-list",
15354 "List extended-community list\n")
15356 struct community_list
*list
;
15357 struct community_list_master
*cm
;
15360 if (argv_find(argv
, argc
, "ip", &idx
)) {
15361 vty_out(vty
, "This config option is deprecated, and is scheduled for removal\n");
15362 vty_out(vty
, "if you are using this please migrate to the below command.\n");
15363 vty_out(vty
, "'show bgp extcommunity-list <(1-500)|WORD>'\n");
15364 zlog_warn("Deprecated option: 'ip show extcommunity-list <(1-500)|WORD>' being used");
15366 cm
= community_list_master_lookup(bgp_clist
, EXTCOMMUNITY_LIST_MASTER
);
15368 return CMD_SUCCESS
;
15370 for (list
= cm
->num
.head
; list
; list
= list
->next
)
15371 extcommunity_list_show(vty
, list
);
15373 for (list
= cm
->str
.head
; list
; list
= list
->next
)
15374 extcommunity_list_show(vty
, list
);
15376 return CMD_SUCCESS
;
15379 ALIAS (show_extcommunity_list
,
15380 show_ip_extcommunity_list_cmd
,
15381 "show ip extcommunity-list",
15384 "List extended-community list\n")
15386 DEFUN (show_extcommunity_list_arg
,
15387 show_bgp_extcommunity_list_arg_cmd
,
15388 "show bgp extcommunity-list <(1-500)|WORD>",
15391 "List extended-community list\n"
15392 "Extcommunity-list number\n"
15393 "Extcommunity-list name\n")
15395 int idx_comm_list
= 3;
15396 struct community_list
*list
;
15399 if (argv_find(argv
, argc
, "ip", &idx
)) {
15400 vty_out(vty
, "This config option is deprecated, and is scheduled for removal.\n");
15401 vty_out(vty
, "if you are using this please migrate to the below command.\n");
15402 vty_out(vty
, "'show bgp extcommunity-list <(1-500)|WORD>'\n");
15403 zlog_warn("Deprecated option: 'ip show extcommunity-list <(1-500)|WORD>' being used");
15405 list
= community_list_lookup(bgp_clist
, argv
[idx_comm_list
]->arg
, 0,
15406 EXTCOMMUNITY_LIST_MASTER
);
15408 vty_out(vty
, "%% Can't find extcommunity-list\n");
15409 return CMD_WARNING
;
15412 extcommunity_list_show(vty
, list
);
15414 return CMD_SUCCESS
;
15417 ALIAS (show_extcommunity_list_arg
,
15418 show_ip_extcommunity_list_arg_cmd
,
15419 "show ip extcommunity-list <(1-500)|WORD>",
15422 "List extended-community list\n"
15423 "Extcommunity-list number\n"
15424 "Extcommunity-list name\n")
15426 /* Display community-list and extcommunity-list configuration. */
15427 static int community_list_config_write(struct vty
*vty
)
15429 struct community_list
*list
;
15430 struct community_entry
*entry
;
15431 struct community_list_master
*cm
;
15434 /* Community-list. */
15435 cm
= community_list_master_lookup(bgp_clist
, COMMUNITY_LIST_MASTER
);
15437 for (list
= cm
->num
.head
; list
; list
= list
->next
)
15438 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
15439 vty_out(vty
, "bgp community-list %s %s %s\n", list
->name
,
15440 community_direct_str(entry
->direct
),
15441 community_list_config_str(entry
));
15444 for (list
= cm
->str
.head
; list
; list
= list
->next
)
15445 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
15446 vty_out(vty
, "bgp community-list %s %s %s %s\n",
15447 entry
->style
== COMMUNITY_LIST_STANDARD
15450 list
->name
, community_direct_str(entry
->direct
),
15451 community_list_config_str(entry
));
15455 /* Extcommunity-list. */
15456 cm
= community_list_master_lookup(bgp_clist
, EXTCOMMUNITY_LIST_MASTER
);
15458 for (list
= cm
->num
.head
; list
; list
= list
->next
)
15459 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
15460 vty_out(vty
, "bgp extcommunity-list %s %s %s\n",
15461 list
->name
, community_direct_str(entry
->direct
),
15462 community_list_config_str(entry
));
15465 for (list
= cm
->str
.head
; list
; list
= list
->next
)
15466 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
15467 vty_out(vty
, "bgp extcommunity-list %s %s %s %s\n",
15468 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
15471 list
->name
, community_direct_str(entry
->direct
),
15472 community_list_config_str(entry
));
15477 /* lcommunity-list. */
15478 cm
= community_list_master_lookup(bgp_clist
,
15479 LARGE_COMMUNITY_LIST_MASTER
);
15481 for (list
= cm
->num
.head
; list
; list
= list
->next
)
15482 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
15483 vty_out(vty
, "bgp large-community-list %s %s %s\n",
15484 list
->name
, community_direct_str(entry
->direct
),
15485 community_list_config_str(entry
));
15488 for (list
= cm
->str
.head
; list
; list
= list
->next
)
15489 for (entry
= list
->head
; entry
; entry
= entry
->next
) {
15490 vty_out(vty
, "bgp large-community-list %s %s %s %s\n",
15491 entry
->style
== LARGE_COMMUNITY_LIST_STANDARD
15494 list
->name
, community_direct_str(entry
->direct
),
15495 community_list_config_str(entry
));
15502 static struct cmd_node community_list_node
= {
15503 COMMUNITY_LIST_NODE
, "", 1 /* Export to vtysh. */
15506 static void community_list_vty(void)
15508 install_node(&community_list_node
, community_list_config_write
);
15510 /* Community-list. */
15511 install_element(CONFIG_NODE
, &bgp_community_list_standard_cmd
);
15512 install_element(CONFIG_NODE
, &bgp_community_list_expanded_all_cmd
);
15513 install_element(CONFIG_NODE
, &no_bgp_community_list_standard_all_cmd
);
15514 install_element(CONFIG_NODE
, &no_bgp_community_list_standard_all_list_cmd
);
15515 install_element(CONFIG_NODE
, &no_bgp_community_list_expanded_all_cmd
);
15516 install_element(CONFIG_NODE
, &no_bgp_community_list_expanded_all_list_cmd
);
15517 install_element(VIEW_NODE
, &show_bgp_community_list_cmd
);
15518 install_element(VIEW_NODE
, &show_bgp_community_list_arg_cmd
);
15519 install_element(CONFIG_NODE
, &ip_community_list_standard_cmd
);
15520 install_element(CONFIG_NODE
, &ip_community_list_expanded_all_cmd
);
15521 install_element(CONFIG_NODE
, &no_ip_community_list_standard_all_cmd
);
15522 install_element(CONFIG_NODE
, &no_ip_community_list_standard_all_list_cmd
);
15523 install_element(CONFIG_NODE
, &no_ip_community_list_expanded_all_cmd
);
15524 install_element(CONFIG_NODE
, &no_ip_community_list_expanded_all_list_cmd
);
15525 install_element(VIEW_NODE
, &show_ip_community_list_cmd
);
15526 install_element(VIEW_NODE
, &show_ip_community_list_arg_cmd
);
15528 /* Extcommunity-list. */
15529 install_element(CONFIG_NODE
, &bgp_extcommunity_list_standard_cmd
);
15530 install_element(CONFIG_NODE
, &bgp_extcommunity_list_name_expanded_cmd
);
15531 install_element(CONFIG_NODE
, &no_bgp_extcommunity_list_standard_all_cmd
);
15532 install_element(CONFIG_NODE
,
15533 &no_bgp_extcommunity_list_standard_all_list_cmd
);
15534 install_element(CONFIG_NODE
, &no_bgp_extcommunity_list_expanded_all_cmd
);
15535 install_element(CONFIG_NODE
,
15536 &no_bgp_extcommunity_list_expanded_all_list_cmd
);
15537 install_element(VIEW_NODE
, &show_bgp_extcommunity_list_cmd
);
15538 install_element(VIEW_NODE
, &show_bgp_extcommunity_list_arg_cmd
);
15539 install_element(CONFIG_NODE
, &ip_extcommunity_list_standard_cmd
);
15540 install_element(CONFIG_NODE
, &ip_extcommunity_list_name_expanded_cmd
);
15541 install_element(CONFIG_NODE
, &no_ip_extcommunity_list_standard_all_cmd
);
15542 install_element(CONFIG_NODE
, &no_ip_extcommunity_list_standard_all_list_cmd
);
15543 install_element(CONFIG_NODE
, &no_ip_extcommunity_list_expanded_all_cmd
);
15544 install_element(CONFIG_NODE
, &no_ip_extcommunity_list_expanded_all_list_cmd
);
15545 install_element(VIEW_NODE
, &show_ip_extcommunity_list_cmd
);
15546 install_element(VIEW_NODE
, &show_ip_extcommunity_list_arg_cmd
);
15548 /* Large Community List */
15549 install_element(CONFIG_NODE
, &bgp_lcommunity_list_standard_cmd
);
15550 install_element(CONFIG_NODE
, &bgp_lcommunity_list_standard1_cmd
);
15551 install_element(CONFIG_NODE
, &bgp_lcommunity_list_expanded_cmd
);
15552 install_element(CONFIG_NODE
, &bgp_lcommunity_list_name_standard_cmd
);
15553 install_element(CONFIG_NODE
, &bgp_lcommunity_list_name_standard1_cmd
);
15554 install_element(CONFIG_NODE
, &bgp_lcommunity_list_name_expanded_cmd
);
15555 install_element(CONFIG_NODE
, &no_bgp_lcommunity_list_standard_all_cmd
);
15556 install_element(CONFIG_NODE
,
15557 &no_bgp_lcommunity_list_name_expanded_all_cmd
);
15558 install_element(CONFIG_NODE
, &no_bgp_lcommunity_list_standard_cmd
);
15559 install_element(CONFIG_NODE
, &no_bgp_lcommunity_list_expanded_cmd
);
15560 install_element(CONFIG_NODE
, &no_bgp_lcommunity_list_name_standard_cmd
);
15561 install_element(CONFIG_NODE
, &no_bgp_lcommunity_list_name_expanded_cmd
);
15562 install_element(VIEW_NODE
, &show_bgp_lcommunity_list_cmd
);
15563 install_element(VIEW_NODE
, &show_bgp_lcommunity_list_arg_cmd
);
15564 install_element(CONFIG_NODE
, &ip_lcommunity_list_standard_cmd
);
15565 install_element(CONFIG_NODE
, &ip_lcommunity_list_standard1_cmd
);
15566 install_element(CONFIG_NODE
, &ip_lcommunity_list_expanded_cmd
);
15567 install_element(CONFIG_NODE
, &ip_lcommunity_list_name_standard_cmd
);
15568 install_element(CONFIG_NODE
, &ip_lcommunity_list_name_standard1_cmd
);
15569 install_element(CONFIG_NODE
, &ip_lcommunity_list_name_expanded_cmd
);
15570 install_element(CONFIG_NODE
, &no_ip_lcommunity_list_standard_all_cmd
);
15571 install_element(CONFIG_NODE
,
15572 &no_ip_lcommunity_list_name_expanded_all_cmd
);
15573 install_element(CONFIG_NODE
, &no_ip_lcommunity_list_standard_cmd
);
15574 install_element(CONFIG_NODE
, &no_ip_lcommunity_list_expanded_cmd
);
15575 install_element(CONFIG_NODE
, &no_ip_lcommunity_list_name_standard_cmd
);
15576 install_element(CONFIG_NODE
, &no_ip_lcommunity_list_name_expanded_cmd
);
15577 install_element(VIEW_NODE
, &show_ip_lcommunity_list_cmd
);
15578 install_element(VIEW_NODE
, &show_ip_lcommunity_list_arg_cmd
);