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
17 along with GNU Zebra; see the file COPYING. If not, write to the Free
18 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
33 #include "memory_vty.h"
38 #include "bgpd/bgpd.h"
39 #include "bgpd/bgp_advertise.h"
40 #include "bgpd/bgp_attr.h"
41 #include "bgpd/bgp_aspath.h"
42 #include "bgpd/bgp_community.h"
43 #include "bgpd/bgp_ecommunity.h"
44 #include "bgpd/bgp_lcommunity.h"
45 #include "bgpd/bgp_damp.h"
46 #include "bgpd/bgp_debug.h"
47 #include "bgpd/bgp_fsm.h"
48 #include "bgpd/bgp_nexthop.h"
49 #include "bgpd/bgp_open.h"
50 #include "bgpd/bgp_regex.h"
51 #include "bgpd/bgp_route.h"
52 #include "bgpd/bgp_mplsvpn.h"
53 #include "bgpd/bgp_zebra.h"
54 #include "bgpd/bgp_table.h"
55 #include "bgpd/bgp_vty.h"
56 #include "bgpd/bgp_mpath.h"
57 #include "bgpd/bgp_packet.h"
58 #include "bgpd/bgp_updgrp.h"
59 #include "bgpd/bgp_bfd.h"
61 static struct peer_group
*
62 listen_range_exists (struct bgp
*bgp
, struct prefix
*range
, int exact
);
64 /* Utility function to get address family from current node. */
66 bgp_node_afi (struct vty
*vty
)
74 case BGP_ENCAPV6_NODE
:
87 /* Utility function to get subsequent address family from current
90 bgp_node_safi (struct vty
*vty
)
96 case BGP_ENCAPV6_NODE
:
101 safi
= SAFI_MPLS_VPN
;
105 safi
= SAFI_MULTICAST
;
117 /* supports <ipv4|ipv6> */
119 bgp_vty_afi_from_arg(const char *afi_str
)
121 afi_t afi
= AFI_MAX
; /* unknown */
122 if (!strcmp(afi_str
, "ipv4")) {
125 else if (!strcmp(afi_str
, "ipv6")) {
128 else if (!strcmp(afi_str
, "l2vpn")) {
135 bgp_parse_afi(const char *str
, afi_t
*afi
)
137 *afi
= bgp_vty_afi_from_arg(str
);
145 argv_find_and_parse_afi(struct cmd_token
**argv
, int argc
, int *index
, afi_t
*afi
)
148 if (argv_find (argv
, argc
, "ipv4", index
))
154 else if (argv_find (argv
, argc
, "ipv6", index
))
163 /* supports <unicast|multicast|vpn|encap> */
165 bgp_vty_safi_from_arg(const char *safi_str
)
167 safi_t safi
= SAFI_MAX
; /* unknown */
168 if (strncmp (safi_str
, "m", 1) == 0)
169 safi
= SAFI_MULTICAST
;
170 else if (strncmp (safi_str
, "u", 1) == 0)
172 else if (strncmp (safi_str
, "e", 1) == 0)
174 else if (strncmp (safi_str
, "v", 1) == 0)
175 safi
= SAFI_MPLS_VPN
;
180 argv_find_and_parse_safi (struct cmd_token
**argv
, int argc
, int *index
, safi_t
*safi
)
183 if (argv_find (argv
, argc
, "unicast", index
))
187 *safi
= SAFI_UNICAST
;
189 else if (argv_find (argv
, argc
, "multicast", index
))
193 *safi
= SAFI_MULTICAST
;
195 else if (argv_find (argv
, argc
, "vpn", index
))
199 *safi
= SAFI_MPLS_VPN
;
201 else if (argv_find (argv
, argc
, "encap", index
))
207 else if (argv_find (argv
, argc
, "evpn", index
))
217 * bgp_vty_find_and_parse_afi_safi_bgp
219 * For a given 'show ...' command, correctly parse the afi/safi/bgp out from it
220 * This function *assumes* that the calling function pre-sets the afi/safi/bgp
221 * to appropriate values for the calling function. This is to allow the
222 * calling function to make decisions appropriate for the show command
223 * that is being parsed.
225 * The show commands are generally of the form:
226 * "show [ip] bgp [<view|vrf> WORD] [<ipv4|ipv6> [<unicast|multicast|vpn|encap>]] ..."
228 * Since we use argv_find if the show command in particular doesn't have:
231 * [<ipv4|ipv6> [<unicast|multicast|vpn|encap>]]
232 * The command parsing should still be ok.
234 * vty -> The vty for the command so we can output some useful data in
235 * the event of a parse error in the vrf.
236 * argv -> The command tokens
237 * argc -> How many command tokens we have
238 * idx -> The current place in the command, generally should be 0 for this function
239 * afi -> The parsed afi if it was included in the show command, returned here
240 * safi -> The parsed safi if it was included in the show command, returned here
241 * bgp -> Pointer to the bgp data structure we need to fill in.
243 * The function returns the correct location in the parse tree for the
246 * Returns 0 for failure to parse correctly, else the idx position of where
247 * it found the last token.
250 bgp_vty_find_and_parse_afi_safi_bgp (struct vty
*vty
, struct cmd_token
**argv
, int argc
, int *idx
,
251 afi_t
*afi
, safi_t
*safi
, struct bgp
**bgp
)
253 char *vrf_name
= NULL
;
259 if (argv_find (argv
, argc
, "ip", idx
))
262 if (argv_find (argv
, argc
, "view", idx
) || argv_find (argv
, argc
, "vrf", idx
))
264 vrf_name
= argv
[*idx
+ 1]->arg
;
267 if (strmatch (vrf_name
, "all"))
271 *bgp
= bgp_lookup_by_name (vrf_name
);
274 vty_out (vty
, "View/Vrf specified is unknown: %s%s", vrf_name
, VTY_NEWLINE
);
282 *bgp
= bgp_get_default ();
285 vty_out (vty
, "Unable to find default BGP instance%s", VTY_NEWLINE
);
291 if (argv_find_and_parse_afi (argv
, argc
, idx
, afi
))
292 argv_find_and_parse_safi (argv
, argc
, idx
, safi
);
299 peer_address_self_check (struct bgp
*bgp
, union sockunion
*su
)
301 struct interface
*ifp
= NULL
;
303 if (su
->sa
.sa_family
== AF_INET
)
304 ifp
= if_lookup_by_ipv4_exact (&su
->sin
.sin_addr
, bgp
->vrf_id
);
305 else if (su
->sa
.sa_family
== AF_INET6
)
306 ifp
= if_lookup_by_ipv6_exact (&su
->sin6
.sin6_addr
,
307 su
->sin6
.sin6_scope_id
, bgp
->vrf_id
);
315 /* Utility function for looking up peer from VTY. */
316 /* This is used only for configuration, so disallow if attempted on
317 * a dynamic neighbor.
320 peer_lookup_vty (struct vty
*vty
, const char *ip_str
)
322 struct bgp
*bgp
= VTY_GET_CONTEXT(bgp
);
331 ret
= str2sockunion (ip_str
, &su
);
334 peer
= peer_lookup_by_conf_if (bgp
, ip_str
);
337 if ((peer
= peer_lookup_by_hostname(bgp
, ip_str
)) == NULL
)
339 vty_out (vty
, "%% Malformed address or name: %s%s", ip_str
, VTY_NEWLINE
);
346 peer
= peer_lookup (bgp
, &su
);
349 vty_out (vty
, "%% Specify remote-as or peer-group commands first%s",
353 if (peer_dynamic_neighbor (peer
))
355 vty_out (vty
, "%% Operation not allowed on a dynamic neighbor%s",
364 /* Utility function for looking up peer or peer group. */
365 /* This is used only for configuration, so disallow if attempted on
366 * a dynamic neighbor.
369 peer_and_group_lookup_vty (struct vty
*vty
, const char *peer_str
)
371 struct bgp
*bgp
= VTY_GET_CONTEXT(bgp
);
374 struct peer
*peer
= NULL
;
375 struct peer_group
*group
= NULL
;
381 ret
= str2sockunion (peer_str
, &su
);
384 /* IP address, locate peer. */
385 peer
= peer_lookup (bgp
, &su
);
389 /* Not IP, could match either peer configured on interface or a group. */
390 peer
= peer_lookup_by_conf_if (bgp
, peer_str
);
392 group
= peer_group_lookup (bgp
, peer_str
);
397 if (peer_dynamic_neighbor (peer
))
399 vty_out (vty
, "%% Operation not allowed on a dynamic neighbor%s",
410 vty_out (vty
, "%% Specify remote-as or peer-group commands first%s",
417 bgp_vty_return (struct vty
*vty
, int ret
)
419 const char *str
= NULL
;
423 case BGP_ERR_INVALID_VALUE
:
424 str
= "Invalid value";
426 case BGP_ERR_INVALID_FLAG
:
427 str
= "Invalid flag";
429 case BGP_ERR_PEER_GROUP_SHUTDOWN
:
430 str
= "Peer-group has been shutdown. Activate the peer-group first";
432 case BGP_ERR_PEER_FLAG_CONFLICT
:
433 str
= "Can't set override-capability and strict-capability-match at the same time";
435 case BGP_ERR_PEER_GROUP_NO_REMOTE_AS
:
436 str
= "Specify remote-as or peer-group remote AS first";
438 case BGP_ERR_PEER_GROUP_CANT_CHANGE
:
439 str
= "Cannot change the peer-group. Deconfigure first";
441 case BGP_ERR_PEER_GROUP_MISMATCH
:
442 str
= "Peer is not a member of this peer-group";
444 case BGP_ERR_PEER_FILTER_CONFLICT
:
445 str
= "Prefix/distribute list can not co-exist";
447 case BGP_ERR_NOT_INTERNAL_PEER
:
448 str
= "Invalid command. Not an internal neighbor";
450 case BGP_ERR_REMOVE_PRIVATE_AS
:
451 str
= "remove-private-AS cannot be configured for IBGP peers";
453 case BGP_ERR_LOCAL_AS_ALLOWED_ONLY_FOR_EBGP
:
454 str
= "Local-AS allowed only for EBGP peers";
456 case BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS
:
457 str
= "Cannot have local-as same as BGP AS number";
459 case BGP_ERR_TCPSIG_FAILED
:
460 str
= "Error while applying TCP-Sig to session(s)";
462 case BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
:
463 str
= "ebgp-multihop and ttl-security cannot be configured together";
465 case BGP_ERR_NO_IBGP_WITH_TTLHACK
:
466 str
= "ttl-security only allowed for EBGP peers";
468 case BGP_ERR_AS_OVERRIDE
:
469 str
= "as-override cannot be configured for IBGP peers";
471 case BGP_ERR_INVALID_DYNAMIC_NEIGHBORS_LIMIT
:
472 str
= "Invalid limit for number of dynamic neighbors";
474 case BGP_ERR_DYNAMIC_NEIGHBORS_RANGE_EXISTS
:
475 str
= "Dynamic neighbor listen range already exists";
477 case BGP_ERR_INVALID_FOR_DYNAMIC_PEER
:
478 str
= "Operation not allowed on a dynamic neighbor";
480 case BGP_ERR_INVALID_FOR_DIRECT_PEER
:
481 str
= "Operation not allowed on a directly connected neighbor";
486 vty_out (vty
, "%% %s%s", str
, VTY_NEWLINE
);
492 /* BGP clear sort. */
503 bgp_clear_vty_error (struct vty
*vty
, struct peer
*peer
, afi_t afi
,
504 safi_t safi
, int error
)
508 case BGP_ERR_AF_UNCONFIGURED
:
510 "%%BGP: Enable %s address family for the neighbor %s%s",
511 afi_safi_print(afi
, safi
), peer
->host
, VTY_NEWLINE
);
513 case BGP_ERR_SOFT_RECONFIG_UNCONFIGURED
:
514 vty_out (vty
, "%%BGP: Inbound soft reconfig for %s not possible as it%s has neither refresh capability, nor inbound soft reconfig%s", peer
->host
, VTY_NEWLINE
, VTY_NEWLINE
);
521 /* `clear ip bgp' functions. */
523 bgp_clear (struct vty
*vty
, struct bgp
*bgp
, afi_t afi
, safi_t safi
,
524 enum clear_sort sort
,enum bgp_clear_type stype
, const char *arg
)
528 struct listnode
*node
, *nnode
;
530 /* Clear all neighbors. */
532 * Pass along pointer to next node to peer_clear() when walking all nodes
533 * on the BGP instance as that may get freed if it is a doppelganger
535 if (sort
== clear_all
)
537 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
539 if (stype
== BGP_CLEAR_SOFT_NONE
)
540 ret
= peer_clear (peer
, &nnode
);
541 else if (peer
->afc
[afi
][safi
])
542 ret
= peer_clear_soft (peer
, afi
, safi
, stype
);
547 bgp_clear_vty_error (vty
, peer
, afi
, safi
, ret
);
550 /* This is to apply read-only mode on this clear. */
551 if (stype
== BGP_CLEAR_SOFT_NONE
)
552 bgp
->update_delay_over
= 0;
557 /* Clear specified neighbors. */
558 if (sort
== clear_peer
)
563 /* Make sockunion for lookup. */
564 ret
= str2sockunion (arg
, &su
);
567 peer
= peer_lookup_by_conf_if (bgp
, arg
);
570 peer
= peer_lookup_by_hostname(bgp
, arg
);
573 vty_out (vty
, "Malformed address or name: %s%s", arg
, VTY_NEWLINE
);
580 peer
= peer_lookup (bgp
, &su
);
583 vty_out (vty
, "%%BGP: Unknown neighbor - \"%s\"%s", arg
, VTY_NEWLINE
);
588 if (stype
== BGP_CLEAR_SOFT_NONE
)
589 ret
= peer_clear (peer
, NULL
);
591 ret
= peer_clear_soft (peer
, afi
, safi
, stype
);
594 bgp_clear_vty_error (vty
, peer
, afi
, safi
, ret
);
599 /* Clear all peer-group members. */
600 if (sort
== clear_group
)
602 struct peer_group
*group
;
604 group
= peer_group_lookup (bgp
, arg
);
607 vty_out (vty
, "%%BGP: No such peer-group %s%s", arg
, VTY_NEWLINE
);
611 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
613 if (stype
== BGP_CLEAR_SOFT_NONE
)
615 peer_clear (peer
, NULL
);
619 if (! peer
->afc
[afi
][safi
])
622 ret
= peer_clear_soft (peer
, afi
, safi
, stype
);
625 bgp_clear_vty_error (vty
, peer
, afi
, safi
, ret
);
630 if (sort
== clear_external
)
632 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
634 if (peer
->sort
== BGP_PEER_IBGP
)
637 if (stype
== BGP_CLEAR_SOFT_NONE
)
638 ret
= peer_clear (peer
, &nnode
);
640 ret
= peer_clear_soft (peer
, afi
, safi
, stype
);
643 bgp_clear_vty_error (vty
, peer
, afi
, safi
, ret
);
648 if (sort
== clear_as
)
653 VTY_GET_INTEGER_RANGE ("AS", as
, arg
, 1, BGP_AS4_MAX
);
655 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
661 if (stype
== BGP_CLEAR_SOFT_NONE
)
662 ret
= peer_clear (peer
, &nnode
);
664 ret
= peer_clear_soft (peer
, afi
, safi
, stype
);
667 bgp_clear_vty_error (vty
, peer
, afi
, safi
, ret
);
670 vty_out (vty
, "%%BGP: No peer is configured with AS %s%s", arg
,
679 bgp_clear_vty (struct vty
*vty
, const char *name
, afi_t afi
, safi_t safi
,
680 enum clear_sort sort
, enum bgp_clear_type stype
,
685 /* BGP structure lookup. */
688 bgp
= bgp_lookup_by_name (name
);
691 vty_out (vty
, "Can't find BGP instance %s%s", name
, VTY_NEWLINE
);
697 bgp
= bgp_get_default ();
700 vty_out (vty
, "No BGP process is configured%s", VTY_NEWLINE
);
705 return bgp_clear (vty
, bgp
, afi
, safi
, sort
, stype
, arg
);
708 /* clear soft inbound */
710 bgp_clear_star_soft_in (struct vty
*vty
, const char *name
)
712 bgp_clear_vty (vty
, name
, AFI_IP
, SAFI_UNICAST
, clear_all
,
713 BGP_CLEAR_SOFT_IN
, NULL
);
714 bgp_clear_vty (vty
, name
, AFI_IP6
, SAFI_UNICAST
, clear_all
,
715 BGP_CLEAR_SOFT_IN
, NULL
);
718 /* clear soft outbound */
720 bgp_clear_star_soft_out (struct vty
*vty
, const char *name
)
722 bgp_clear_vty (vty
, name
, AFI_IP
, SAFI_UNICAST
, clear_all
,
723 BGP_CLEAR_SOFT_OUT
, NULL
);
724 bgp_clear_vty (vty
, name
, AFI_IP6
, SAFI_UNICAST
, clear_all
,
725 BGP_CLEAR_SOFT_OUT
, NULL
);
729 /* BGP global configuration. */
731 DEFUN (bgp_multiple_instance_func
,
732 bgp_multiple_instance_cmd
,
733 "bgp multiple-instance",
735 "Enable bgp multiple instance\n")
737 bgp_option_set (BGP_OPT_MULTIPLE_INSTANCE
);
741 DEFUN (no_bgp_multiple_instance
,
742 no_bgp_multiple_instance_cmd
,
743 "no bgp multiple-instance",
746 "BGP multiple instance\n")
750 ret
= bgp_option_unset (BGP_OPT_MULTIPLE_INSTANCE
);
753 vty_out (vty
, "%% There are more than two BGP instances%s", VTY_NEWLINE
);
759 DEFUN (bgp_config_type
,
761 "bgp config-type <cisco|zebra>",
763 "Configuration type\n"
768 if (strncmp (argv
[idx_vendor
]->arg
, "c", 1) == 0)
769 bgp_option_set (BGP_OPT_CONFIG_CISCO
);
771 bgp_option_unset (BGP_OPT_CONFIG_CISCO
);
776 DEFUN (no_bgp_config_type
,
777 no_bgp_config_type_cmd
,
778 "no bgp config-type [<cisco|zebra>]",
781 "Display configuration type\n"
785 bgp_option_unset (BGP_OPT_CONFIG_CISCO
);
790 DEFUN (no_synchronization
,
791 no_synchronization_cmd
,
792 "no synchronization",
794 "Perform IGP synchronization\n")
799 DEFUN (no_auto_summary
,
803 "Enable automatic network number summarization\n")
808 /* "router bgp" commands. */
809 DEFUN_NOSH (router_bgp
,
811 "router bgp [(1-4294967295) [<view|vrf> WORD]]",
815 BGP_INSTANCE_HELP_STR
)
818 int idx_view_vrf
= 3;
823 const char *name
= NULL
;
824 enum bgp_instance_type inst_type
;
826 // "router bgp" without an ASN
829 //Pending: Make VRF option available for ASN less config
830 bgp
= bgp_get_default();
834 vty_out (vty
, "%% No BGP process is configured%s", VTY_NEWLINE
);
838 if (listcount(bm
->bgp
) > 1)
840 vty_out (vty
, "%% Multiple BGP processes are configured%s", VTY_NEWLINE
);
848 VTY_GET_INTEGER_RANGE ("AS", as
, argv
[idx_asn
]->arg
, 1, BGP_AS4_MAX
);
850 inst_type
= BGP_INSTANCE_TYPE_DEFAULT
;
853 name
= argv
[idx_vrf
]->arg
;
855 if (!strcmp(argv
[idx_view_vrf
]->text
, "vrf"))
856 inst_type
= BGP_INSTANCE_TYPE_VRF
;
857 else if (!strcmp(argv
[idx_view_vrf
]->text
, "view"))
858 inst_type
= BGP_INSTANCE_TYPE_VIEW
;
861 ret
= bgp_get (&bgp
, &as
, name
, inst_type
);
864 case BGP_ERR_MULTIPLE_INSTANCE_NOT_SET
:
865 vty_out (vty
, "Please specify 'bgp multiple-instance' first%s",
868 case BGP_ERR_AS_MISMATCH
:
869 vty_out (vty
, "BGP is already running; AS is %u%s", as
, VTY_NEWLINE
);
871 case BGP_ERR_INSTANCE_MISMATCH
:
872 vty_out (vty
, "BGP instance name and AS number mismatch%s", VTY_NEWLINE
);
873 vty_out (vty
, "BGP instance is already running; AS is %u%s",
878 /* Pending: handle when user tries to change a view to vrf n vv. */
881 VTY_PUSH_CONTEXT(BGP_NODE
, bgp
);
886 /* "no router bgp" commands. */
887 DEFUN (no_router_bgp
,
889 "no router bgp [(1-4294967295) [<view|vrf> WORD]]",
894 BGP_INSTANCE_HELP_STR
)
900 const char *name
= NULL
;
902 // "no router bgp" without an ASN
905 //Pending: Make VRF option available for ASN less config
906 bgp
= bgp_get_default();
910 vty_out (vty
, "%% No BGP process is configured%s", VTY_NEWLINE
);
914 if (listcount(bm
->bgp
) > 1)
916 vty_out (vty
, "%% Multiple BGP processes are configured%s", VTY_NEWLINE
);
922 VTY_GET_INTEGER_RANGE ("AS", as
, argv
[idx_asn
]->arg
, 1, BGP_AS4_MAX
);
925 name
= argv
[idx_vrf
]->arg
;
927 /* Lookup bgp structure. */
928 bgp
= bgp_lookup (as
, name
);
931 vty_out (vty
, "%% Can't find BGP instance%s", VTY_NEWLINE
);
945 DEFUN (bgp_router_id
,
947 "bgp router-id A.B.C.D",
949 "Override configured router identifier\n"
950 "Manually configured router identifier\n")
952 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
957 ret
= inet_aton (argv
[idx_ipv4
]->arg
, &id
);
960 vty_out (vty
, "%% Malformed bgp router identifier%s", VTY_NEWLINE
);
964 bgp_router_id_static_set (bgp
, id
);
969 DEFUN (no_bgp_router_id
,
970 no_bgp_router_id_cmd
,
971 "no bgp router-id [A.B.C.D]",
974 "Override configured router identifier\n"
975 "Manually configured router identifier\n")
977 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
978 int idx_router_id
= 3;
982 if (argc
> idx_router_id
)
984 ret
= inet_aton (argv
[idx_router_id
]->arg
, &id
);
987 vty_out (vty
, "%% Malformed BGP router identifier%s", VTY_NEWLINE
);
991 if (! IPV4_ADDR_SAME (&bgp
->router_id_static
, &id
))
993 vty_out (vty
, "%% BGP router-id doesn't match%s", VTY_NEWLINE
);
999 bgp_router_id_static_set (bgp
, id
);
1005 /* BGP Cluster ID. */
1006 DEFUN (bgp_cluster_id
,
1008 "bgp cluster-id <A.B.C.D|(1-4294967295)>",
1010 "Configure Route-Reflector Cluster-id\n"
1011 "Route-Reflector Cluster-id in IP address format\n"
1012 "Route-Reflector Cluster-id as 32 bit quantity\n")
1014 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1017 struct in_addr cluster
;
1019 ret
= inet_aton (argv
[idx_ipv4
]->arg
, &cluster
);
1022 vty_out (vty
, "%% Malformed bgp cluster identifier%s", VTY_NEWLINE
);
1026 bgp_cluster_id_set (bgp
, &cluster
);
1027 bgp_clear_star_soft_out (vty
, bgp
->name
);
1032 DEFUN (no_bgp_cluster_id
,
1033 no_bgp_cluster_id_cmd
,
1034 "no bgp cluster-id [<A.B.C.D|(1-4294967295)>]",
1037 "Configure Route-Reflector Cluster-id\n"
1038 "Route-Reflector Cluster-id in IP address format\n"
1039 "Route-Reflector Cluster-id as 32 bit quantity\n")
1041 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1042 bgp_cluster_id_unset (bgp
);
1043 bgp_clear_star_soft_out (vty
, bgp
->name
);
1048 DEFUN (bgp_confederation_identifier
,
1049 bgp_confederation_identifier_cmd
,
1050 "bgp confederation identifier (1-4294967295)",
1051 "BGP specific commands\n"
1052 "AS confederation parameters\n"
1054 "Set routing domain confederation AS\n")
1056 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1060 VTY_GET_INTEGER_RANGE ("AS", as
, argv
[idx_number
]->arg
, 1, BGP_AS4_MAX
);
1062 bgp_confederation_id_set (bgp
, as
);
1067 DEFUN (no_bgp_confederation_identifier
,
1068 no_bgp_confederation_identifier_cmd
,
1069 "no bgp confederation identifier [(1-4294967295)]",
1071 "BGP specific commands\n"
1072 "AS confederation parameters\n"
1074 "Set routing domain confederation AS\n")
1076 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1077 bgp_confederation_id_unset (bgp
);
1082 DEFUN (bgp_confederation_peers
,
1083 bgp_confederation_peers_cmd
,
1084 "bgp confederation peers (1-4294967295)...",
1085 "BGP specific commands\n"
1086 "AS confederation parameters\n"
1087 "Peer ASs in BGP confederation\n"
1090 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1095 for (i
= idx_asn
; i
< argc
; i
++)
1097 VTY_GET_INTEGER_RANGE ("AS", as
, argv
[i
]->arg
, 1, BGP_AS4_MAX
);
1101 vty_out (vty
, "%% Local member-AS not allowed in confed peer list%s",
1106 bgp_confederation_peers_add (bgp
, as
);
1111 DEFUN (no_bgp_confederation_peers
,
1112 no_bgp_confederation_peers_cmd
,
1113 "no bgp confederation peers (1-4294967295)...",
1115 "BGP specific commands\n"
1116 "AS confederation parameters\n"
1117 "Peer ASs in BGP confederation\n"
1120 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1125 for (i
= idx_asn
; i
< argc
; i
++)
1127 VTY_GET_INTEGER_RANGE ("AS", as
, argv
[i
]->arg
, 1, BGP_AS4_MAX
);
1129 bgp_confederation_peers_remove (bgp
, as
);
1135 * Central routine for maximum-paths configuration.
1136 * @peer_type: BGP_PEER_EBGP or BGP_PEER_IBGP
1137 * @set: 1 for setting values, 0 for removing the max-paths config.
1140 bgp_maxpaths_config_vty (struct vty
*vty
, int peer_type
, const char *mpaths
,
1141 u_int16_t options
, int set
)
1143 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1144 u_int16_t maxpaths
= 0;
1149 afi
= bgp_node_afi (vty
);
1150 safi
= bgp_node_safi (vty
);
1154 maxpaths
= strtol(mpaths
, NULL
, 10);
1155 if (maxpaths
> multipath_num
)
1158 "%% Maxpaths Specified: %d is > than multipath num specified on bgp command line %d",
1159 maxpaths
, multipath_num
);
1162 ret
= bgp_maximum_paths_set (bgp
, afi
, safi
, peer_type
, maxpaths
, options
);
1165 ret
= bgp_maximum_paths_unset (bgp
, afi
, safi
, peer_type
);
1170 "%% Failed to %sset maximum-paths %s %u for afi %u, safi %u%s",
1171 (set
== 1) ? "" : "un",
1172 (peer_type
== BGP_PEER_EBGP
) ? "ebgp" : "ibgp",
1173 maxpaths
, afi
, safi
, VTY_NEWLINE
);
1177 bgp_recalculate_all_bestpaths (bgp
);
1182 DEFUN (bgp_maxmed_admin
,
1183 bgp_maxmed_admin_cmd
,
1184 "bgp max-med administrative ",
1186 "Advertise routes with max-med\n"
1187 "Administratively applied, for an indefinite period\n")
1189 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1191 bgp
->v_maxmed_admin
= 1;
1192 bgp
->maxmed_admin_value
= BGP_MAXMED_VALUE_DEFAULT
;
1194 bgp_maxmed_update(bgp
);
1199 DEFUN (bgp_maxmed_admin_medv
,
1200 bgp_maxmed_admin_medv_cmd
,
1201 "bgp max-med administrative (0-4294967294)",
1203 "Advertise routes with max-med\n"
1204 "Administratively applied, for an indefinite period\n"
1205 "Max MED value to be used\n")
1207 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1210 bgp
->v_maxmed_admin
= 1;
1211 VTY_GET_INTEGER ("max-med admin med-value", bgp
->maxmed_admin_value
, argv
[idx_number
]->arg
);
1213 bgp_maxmed_update(bgp
);
1218 DEFUN (no_bgp_maxmed_admin
,
1219 no_bgp_maxmed_admin_cmd
,
1220 "no bgp max-med administrative [(0-4294967294)]",
1223 "Advertise routes with max-med\n"
1224 "Administratively applied, for an indefinite period\n"
1225 "Max MED value to be used\n")
1227 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1228 bgp
->v_maxmed_admin
= BGP_MAXMED_ADMIN_UNCONFIGURED
;
1229 bgp
->maxmed_admin_value
= BGP_MAXMED_VALUE_DEFAULT
;
1230 bgp_maxmed_update(bgp
);
1235 DEFUN (bgp_maxmed_onstartup
,
1236 bgp_maxmed_onstartup_cmd
,
1237 "bgp max-med on-startup (5-86400)",
1239 "Advertise routes with max-med\n"
1240 "Effective on a startup\n"
1241 "Time (seconds) period for max-med\n")
1243 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1245 VTY_GET_INTEGER ("max-med on-startup period", bgp
->v_maxmed_onstartup
, argv
[idx_number
]->arg
);
1246 bgp
->maxmed_onstartup_value
= BGP_MAXMED_VALUE_DEFAULT
;
1247 bgp_maxmed_update(bgp
);
1252 DEFUN (bgp_maxmed_onstartup_medv
,
1253 bgp_maxmed_onstartup_medv_cmd
,
1254 "bgp max-med on-startup (5-86400) (0-4294967294)",
1256 "Advertise routes with max-med\n"
1257 "Effective on a startup\n"
1258 "Time (seconds) period for max-med\n"
1259 "Max MED value to be used\n")
1261 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1263 int idx_number_2
= 4;
1264 VTY_GET_INTEGER ("max-med on-startup period", bgp
->v_maxmed_onstartup
, argv
[idx_number
]->arg
);
1265 VTY_GET_INTEGER ("max-med on-startup med-value", bgp
->maxmed_onstartup_value
, argv
[idx_number_2
]->arg
);
1266 bgp_maxmed_update(bgp
);
1271 DEFUN (no_bgp_maxmed_onstartup
,
1272 no_bgp_maxmed_onstartup_cmd
,
1273 "no bgp max-med on-startup [(5-86400) [(0-4294967294)]]",
1276 "Advertise routes with max-med\n"
1277 "Effective on a startup\n"
1278 "Time (seconds) period for max-med\n"
1279 "Max MED value to be used\n")
1281 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1283 /* Cancel max-med onstartup if its on */
1284 if (bgp
->t_maxmed_onstartup
)
1286 THREAD_TIMER_OFF (bgp
->t_maxmed_onstartup
);
1287 bgp
->maxmed_onstartup_over
= 1;
1290 bgp
->v_maxmed_onstartup
= BGP_MAXMED_ONSTARTUP_UNCONFIGURED
;
1291 bgp
->maxmed_onstartup_value
= BGP_MAXMED_VALUE_DEFAULT
;
1293 bgp_maxmed_update(bgp
);
1299 bgp_update_delay_config_vty (struct vty
*vty
, const char *delay
,
1302 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1303 u_int16_t update_delay
;
1304 u_int16_t establish_wait
;
1306 VTY_GET_INTEGER_RANGE ("update-delay", update_delay
, delay
,
1307 BGP_UPDATE_DELAY_MIN
, BGP_UPDATE_DELAY_MAX
);
1309 if (!wait
) /* update-delay <delay> */
1311 bgp
->v_update_delay
= update_delay
;
1312 bgp
->v_establish_wait
= bgp
->v_update_delay
;
1316 /* update-delay <delay> <establish-wait> */
1317 establish_wait
= atoi (wait
);
1318 if (update_delay
< establish_wait
)
1320 vty_out (vty
, "%%Failed: update-delay less than the establish-wait!%s",
1325 bgp
->v_update_delay
= update_delay
;
1326 bgp
->v_establish_wait
= establish_wait
;
1332 bgp_update_delay_deconfig_vty (struct vty
*vty
)
1334 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1336 bgp
->v_update_delay
= BGP_UPDATE_DELAY_DEF
;
1337 bgp
->v_establish_wait
= bgp
->v_update_delay
;
1343 bgp_config_write_update_delay (struct vty
*vty
, struct bgp
*bgp
)
1345 if (bgp
->v_update_delay
!= BGP_UPDATE_DELAY_DEF
)
1347 vty_out (vty
, " update-delay %d", bgp
->v_update_delay
);
1348 if (bgp
->v_update_delay
!= bgp
->v_establish_wait
)
1349 vty_out (vty
, " %d", bgp
->v_establish_wait
);
1350 vty_out (vty
, "%s", VTY_NEWLINE
);
1357 /* Update-delay configuration */
1358 DEFUN (bgp_update_delay
,
1359 bgp_update_delay_cmd
,
1360 "update-delay (0-3600)",
1361 "Force initial delay for best-path and updates\n"
1365 return bgp_update_delay_config_vty(vty
, argv
[idx_number
]->arg
, NULL
);
1368 DEFUN (bgp_update_delay_establish_wait
,
1369 bgp_update_delay_establish_wait_cmd
,
1370 "update-delay (0-3600) (1-3600)",
1371 "Force initial delay for best-path and updates\n"
1373 "Wait for peers to be established\n"
1377 int idx_number_2
= 2;
1378 return bgp_update_delay_config_vty(vty
, argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
);
1381 /* Update-delay deconfiguration */
1382 DEFUN (no_bgp_update_delay
,
1383 no_bgp_update_delay_cmd
,
1384 "no update-delay [(0-3600) [(1-3600)]]",
1386 "Force initial delay for best-path and updates\n"
1388 "Wait for peers to be established\n")
1390 return bgp_update_delay_deconfig_vty(vty
);
1395 bgp_wpkt_quanta_config_vty (struct vty
*vty
, const char *num
, char set
)
1397 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1400 VTY_GET_INTEGER_RANGE ("write-quanta", bgp
->wpkt_quanta
, num
,
1403 bgp
->wpkt_quanta
= BGP_WRITE_PACKET_MAX
;
1409 bgp_config_write_wpkt_quanta (struct vty
*vty
, struct bgp
*bgp
)
1411 if (bgp
->wpkt_quanta
!= BGP_WRITE_PACKET_MAX
)
1412 vty_out (vty
, " write-quanta %d%s",
1413 bgp
->wpkt_quanta
, VTY_NEWLINE
);
1419 /* Update-delay configuration */
1420 DEFUN (bgp_wpkt_quanta
,
1421 bgp_wpkt_quanta_cmd
,
1422 "write-quanta (1-10000)",
1423 "How many packets to write to peer socket per run\n"
1424 "Number of packets\n")
1427 return bgp_wpkt_quanta_config_vty(vty
, argv
[idx_number
]->arg
, 1);
1430 /* Update-delay deconfiguration */
1431 DEFUN (no_bgp_wpkt_quanta
,
1432 no_bgp_wpkt_quanta_cmd
,
1433 "no write-quanta (1-10000)",
1435 "How many packets to write to peer socket per run\n"
1436 "Number of packets\n")
1439 return bgp_wpkt_quanta_config_vty(vty
, argv
[idx_number
]->arg
, 0);
1443 bgp_coalesce_config_vty (struct vty
*vty
, const char *num
, char set
)
1445 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1448 VTY_GET_INTEGER_RANGE ("coalesce-time", bgp
->coalesce_time
, num
,
1451 bgp
->coalesce_time
= BGP_DEFAULT_SUBGROUP_COALESCE_TIME
;
1457 bgp_config_write_coalesce_time (struct vty
*vty
, struct bgp
*bgp
)
1459 if (bgp
->coalesce_time
!= BGP_DEFAULT_SUBGROUP_COALESCE_TIME
)
1460 vty_out (vty
, " coalesce-time %d%s",
1461 bgp
->coalesce_time
, VTY_NEWLINE
);
1467 DEFUN (bgp_coalesce_time
,
1468 bgp_coalesce_time_cmd
,
1469 "coalesce-time (0-4294967295)",
1470 "Subgroup coalesce timer\n"
1471 "Subgroup coalesce timer value (in ms)\n")
1474 return bgp_coalesce_config_vty(vty
, argv
[idx_number
]->arg
, 1);
1477 DEFUN (no_bgp_coalesce_time
,
1478 no_bgp_coalesce_time_cmd
,
1479 "no coalesce-time (0-4294967295)",
1481 "Subgroup coalesce timer\n"
1482 "Subgroup coalesce timer value (in ms)\n")
1485 return bgp_coalesce_config_vty(vty
, argv
[idx_number
]->arg
, 0);
1488 /* Maximum-paths configuration */
1489 DEFUN (bgp_maxpaths
,
1491 "maximum-paths (1-255)",
1492 "Forward packets over multiple paths\n"
1493 "Number of paths\n")
1496 return bgp_maxpaths_config_vty(vty
, BGP_PEER_EBGP
, argv
[idx_number
]->arg
, 0, 1);
1499 DEFUN (bgp_maxpaths_ibgp
,
1500 bgp_maxpaths_ibgp_cmd
,
1501 "maximum-paths ibgp (1-255)",
1502 "Forward packets over multiple paths\n"
1504 "Number of paths\n")
1507 return bgp_maxpaths_config_vty(vty
, BGP_PEER_IBGP
, argv
[idx_number
]->arg
, 0, 1);
1510 DEFUN (bgp_maxpaths_ibgp_cluster
,
1511 bgp_maxpaths_ibgp_cluster_cmd
,
1512 "maximum-paths ibgp (1-255) equal-cluster-length",
1513 "Forward packets over multiple paths\n"
1516 "Match the cluster length\n")
1519 return bgp_maxpaths_config_vty(vty
, BGP_PEER_IBGP
, argv
[idx_number
]->arg
,
1520 BGP_FLAG_IBGP_MULTIPATH_SAME_CLUSTERLEN
, 1);
1523 DEFUN (no_bgp_maxpaths
,
1524 no_bgp_maxpaths_cmd
,
1525 "no maximum-paths [(1-255)]",
1527 "Forward packets over multiple paths\n"
1528 "Number of paths\n")
1530 return bgp_maxpaths_config_vty(vty
, BGP_PEER_EBGP
, NULL
, 0, 0);
1533 DEFUN (no_bgp_maxpaths_ibgp
,
1534 no_bgp_maxpaths_ibgp_cmd
,
1535 "no maximum-paths ibgp [(1-255) [equal-cluster-length]]",
1537 "Forward packets over multiple paths\n"
1540 "Match the cluster length\n")
1542 return bgp_maxpaths_config_vty(vty
, BGP_PEER_IBGP
, NULL
, 0, 0);
1546 bgp_config_write_maxpaths (struct vty
*vty
, struct bgp
*bgp
, afi_t afi
,
1547 safi_t safi
, int *write
)
1549 if (bgp
->maxpaths
[afi
][safi
].maxpaths_ebgp
!= MULTIPATH_NUM
)
1551 bgp_config_write_family_header (vty
, afi
, safi
, write
);
1552 vty_out (vty
, " maximum-paths %d%s",
1553 bgp
->maxpaths
[afi
][safi
].maxpaths_ebgp
, VTY_NEWLINE
);
1556 if (bgp
->maxpaths
[afi
][safi
].maxpaths_ibgp
!= MULTIPATH_NUM
)
1558 bgp_config_write_family_header (vty
, afi
, safi
, write
);
1559 vty_out (vty
, " maximum-paths ibgp %d",
1560 bgp
->maxpaths
[afi
][safi
].maxpaths_ibgp
);
1561 if (CHECK_FLAG (bgp
->maxpaths
[afi
][safi
].ibgp_flags
,
1562 BGP_FLAG_IBGP_MULTIPATH_SAME_CLUSTERLEN
))
1563 vty_out (vty
, " equal-cluster-length");
1564 vty_out (vty
, "%s", VTY_NEWLINE
);
1574 "timers bgp (0-65535) (0-65535)",
1575 "Adjust routing timers\n"
1577 "Keepalive interval\n"
1580 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1582 int idx_number_2
= 3;
1583 unsigned long keepalive
= 0;
1584 unsigned long holdtime
= 0;
1586 VTY_GET_INTEGER ("keepalive", keepalive
, argv
[idx_number
]->arg
);
1587 VTY_GET_INTEGER ("holdtime", holdtime
, argv
[idx_number_2
]->arg
);
1589 /* Holdtime value check. */
1590 if (holdtime
< 3 && holdtime
!= 0)
1592 vty_out (vty
, "%% hold time value must be either 0 or greater than 3%s",
1597 bgp_timers_set (bgp
, keepalive
, holdtime
);
1602 DEFUN (no_bgp_timers
,
1604 "no timers bgp [(0-65535) (0-65535)]",
1606 "Adjust routing timers\n"
1608 "Keepalive interval\n"
1611 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1612 bgp_timers_unset (bgp
);
1618 DEFUN (bgp_client_to_client_reflection
,
1619 bgp_client_to_client_reflection_cmd
,
1620 "bgp client-to-client reflection",
1621 "BGP specific commands\n"
1622 "Configure client to client route reflection\n"
1623 "reflection of routes allowed\n")
1625 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1626 bgp_flag_unset (bgp
, BGP_FLAG_NO_CLIENT_TO_CLIENT
);
1627 bgp_clear_star_soft_out (vty
, bgp
->name
);
1632 DEFUN (no_bgp_client_to_client_reflection
,
1633 no_bgp_client_to_client_reflection_cmd
,
1634 "no bgp client-to-client reflection",
1636 "BGP specific commands\n"
1637 "Configure client to client route reflection\n"
1638 "reflection of routes allowed\n")
1640 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1641 bgp_flag_set (bgp
, BGP_FLAG_NO_CLIENT_TO_CLIENT
);
1642 bgp_clear_star_soft_out (vty
, bgp
->name
);
1647 /* "bgp always-compare-med" configuration. */
1648 DEFUN (bgp_always_compare_med
,
1649 bgp_always_compare_med_cmd
,
1650 "bgp always-compare-med",
1651 "BGP specific commands\n"
1652 "Allow comparing MED from different neighbors\n")
1654 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1655 bgp_flag_set (bgp
, BGP_FLAG_ALWAYS_COMPARE_MED
);
1656 bgp_recalculate_all_bestpaths (bgp
);
1661 DEFUN (no_bgp_always_compare_med
,
1662 no_bgp_always_compare_med_cmd
,
1663 "no bgp always-compare-med",
1665 "BGP specific commands\n"
1666 "Allow comparing MED from different neighbors\n")
1668 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1669 bgp_flag_unset (bgp
, BGP_FLAG_ALWAYS_COMPARE_MED
);
1670 bgp_recalculate_all_bestpaths (bgp
);
1675 /* "bgp deterministic-med" configuration. */
1676 DEFUN (bgp_deterministic_med
,
1677 bgp_deterministic_med_cmd
,
1678 "bgp deterministic-med",
1679 "BGP specific commands\n"
1680 "Pick the best-MED path among paths advertised from the neighboring AS\n")
1682 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1684 if (!bgp_flag_check(bgp
, BGP_FLAG_DETERMINISTIC_MED
))
1686 bgp_flag_set (bgp
, BGP_FLAG_DETERMINISTIC_MED
);
1687 bgp_recalculate_all_bestpaths (bgp
);
1693 DEFUN (no_bgp_deterministic_med
,
1694 no_bgp_deterministic_med_cmd
,
1695 "no bgp deterministic-med",
1697 "BGP specific commands\n"
1698 "Pick the best-MED path among paths advertised from the neighboring AS\n")
1700 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1701 int bestpath_per_as_used
;
1705 struct listnode
*node
, *nnode
;
1707 if (bgp_flag_check(bgp
, BGP_FLAG_DETERMINISTIC_MED
))
1709 bestpath_per_as_used
= 0;
1711 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
1713 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
1714 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
1715 if (CHECK_FLAG (peer
->af_flags
[afi
][safi
], PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS
))
1717 bestpath_per_as_used
= 1;
1721 if (bestpath_per_as_used
)
1725 if (bestpath_per_as_used
)
1727 vty_out (vty
, "bgp deterministic-med cannot be disabled while addpath-tx-bestpath-per-AS is in use%s",
1733 bgp_flag_unset (bgp
, BGP_FLAG_DETERMINISTIC_MED
);
1734 bgp_recalculate_all_bestpaths (bgp
);
1741 /* "bgp graceful-restart" configuration. */
1742 DEFUN (bgp_graceful_restart
,
1743 bgp_graceful_restart_cmd
,
1744 "bgp graceful-restart",
1745 "BGP specific commands\n"
1746 "Graceful restart capability parameters\n")
1748 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1749 bgp_flag_set (bgp
, BGP_FLAG_GRACEFUL_RESTART
);
1753 DEFUN (no_bgp_graceful_restart
,
1754 no_bgp_graceful_restart_cmd
,
1755 "no bgp graceful-restart",
1757 "BGP specific commands\n"
1758 "Graceful restart capability parameters\n")
1760 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1761 bgp_flag_unset (bgp
, BGP_FLAG_GRACEFUL_RESTART
);
1765 DEFUN (bgp_graceful_restart_stalepath_time
,
1766 bgp_graceful_restart_stalepath_time_cmd
,
1767 "bgp graceful-restart stalepath-time (1-3600)",
1768 "BGP specific commands\n"
1769 "Graceful restart capability parameters\n"
1770 "Set the max time to hold onto restarting peer's stale paths\n"
1771 "Delay value (seconds)\n")
1773 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1775 u_int32_t stalepath
;
1777 VTY_GET_INTEGER_RANGE ("stalepath-time", stalepath
, argv
[idx_number
]->arg
, 1, 3600);
1778 bgp
->stalepath_time
= stalepath
;
1782 DEFUN (bgp_graceful_restart_restart_time
,
1783 bgp_graceful_restart_restart_time_cmd
,
1784 "bgp graceful-restart restart-time (1-3600)",
1785 "BGP specific commands\n"
1786 "Graceful restart capability parameters\n"
1787 "Set the time to wait to delete stale routes before a BGP open message is received\n"
1788 "Delay value (seconds)\n")
1790 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1794 VTY_GET_INTEGER_RANGE ("restart-time", restart
, argv
[idx_number
]->arg
, 1, 3600);
1795 bgp
->restart_time
= restart
;
1799 DEFUN (no_bgp_graceful_restart_stalepath_time
,
1800 no_bgp_graceful_restart_stalepath_time_cmd
,
1801 "no bgp graceful-restart stalepath-time [(1-3600)]",
1803 "BGP specific commands\n"
1804 "Graceful restart capability parameters\n"
1805 "Set the max time to hold onto restarting peer's stale paths\n"
1806 "Delay value (seconds)\n")
1808 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1810 bgp
->stalepath_time
= BGP_DEFAULT_STALEPATH_TIME
;
1814 DEFUN (no_bgp_graceful_restart_restart_time
,
1815 no_bgp_graceful_restart_restart_time_cmd
,
1816 "no bgp graceful-restart restart-time [(1-3600)]",
1818 "BGP specific commands\n"
1819 "Graceful restart capability parameters\n"
1820 "Set the time to wait to delete stale routes before a BGP open message is received\n"
1821 "Delay value (seconds)\n")
1823 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1825 bgp
->restart_time
= BGP_DEFAULT_RESTART_TIME
;
1829 DEFUN (bgp_graceful_restart_preserve_fw
,
1830 bgp_graceful_restart_preserve_fw_cmd
,
1831 "bgp graceful-restart preserve-fw-state",
1832 "BGP specific commands\n"
1833 "Graceful restart capability parameters\n"
1834 "Sets F-bit indication that fib is preserved while doing Graceful Restart\n")
1836 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1837 bgp_flag_set(bgp
, BGP_FLAG_GR_PRESERVE_FWD
);
1841 DEFUN (no_bgp_graceful_restart_preserve_fw
,
1842 no_bgp_graceful_restart_preserve_fw_cmd
,
1843 "no bgp graceful-restart preserve-fw-state",
1845 "BGP specific commands\n"
1846 "Graceful restart capability parameters\n"
1847 "Unsets F-bit indication that fib is preserved while doing Graceful Restart\n")
1849 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1850 bgp_flag_unset(bgp
, BGP_FLAG_GR_PRESERVE_FWD
);
1854 /* "bgp fast-external-failover" configuration. */
1855 DEFUN (bgp_fast_external_failover
,
1856 bgp_fast_external_failover_cmd
,
1857 "bgp fast-external-failover",
1859 "Immediately reset session if a link to a directly connected external peer goes down\n")
1861 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1862 bgp_flag_unset (bgp
, BGP_FLAG_NO_FAST_EXT_FAILOVER
);
1866 DEFUN (no_bgp_fast_external_failover
,
1867 no_bgp_fast_external_failover_cmd
,
1868 "no bgp fast-external-failover",
1871 "Immediately reset session if a link to a directly connected external peer goes down\n")
1873 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1874 bgp_flag_set (bgp
, BGP_FLAG_NO_FAST_EXT_FAILOVER
);
1878 /* "bgp enforce-first-as" configuration. */
1879 DEFUN (bgp_enforce_first_as
,
1880 bgp_enforce_first_as_cmd
,
1881 "bgp enforce-first-as",
1883 "Enforce the first AS for EBGP routes\n")
1885 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1886 bgp_flag_set (bgp
, BGP_FLAG_ENFORCE_FIRST_AS
);
1887 bgp_clear_star_soft_in (vty
, bgp
->name
);
1892 DEFUN (no_bgp_enforce_first_as
,
1893 no_bgp_enforce_first_as_cmd
,
1894 "no bgp enforce-first-as",
1897 "Enforce the first AS for EBGP routes\n")
1899 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1900 bgp_flag_unset (bgp
, BGP_FLAG_ENFORCE_FIRST_AS
);
1901 bgp_clear_star_soft_in (vty
, bgp
->name
);
1906 /* "bgp bestpath compare-routerid" configuration. */
1907 DEFUN (bgp_bestpath_compare_router_id
,
1908 bgp_bestpath_compare_router_id_cmd
,
1909 "bgp bestpath compare-routerid",
1910 "BGP specific commands\n"
1911 "Change the default bestpath selection\n"
1912 "Compare router-id for identical EBGP paths\n")
1914 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1915 bgp_flag_set (bgp
, BGP_FLAG_COMPARE_ROUTER_ID
);
1916 bgp_recalculate_all_bestpaths (bgp
);
1921 DEFUN (no_bgp_bestpath_compare_router_id
,
1922 no_bgp_bestpath_compare_router_id_cmd
,
1923 "no bgp bestpath compare-routerid",
1925 "BGP specific commands\n"
1926 "Change the default bestpath selection\n"
1927 "Compare router-id for identical EBGP paths\n")
1929 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1930 bgp_flag_unset (bgp
, BGP_FLAG_COMPARE_ROUTER_ID
);
1931 bgp_recalculate_all_bestpaths (bgp
);
1936 /* "bgp bestpath as-path ignore" configuration. */
1937 DEFUN (bgp_bestpath_aspath_ignore
,
1938 bgp_bestpath_aspath_ignore_cmd
,
1939 "bgp bestpath as-path ignore",
1940 "BGP specific commands\n"
1941 "Change the default bestpath selection\n"
1942 "AS-path attribute\n"
1943 "Ignore as-path length in selecting a route\n")
1945 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1946 bgp_flag_set (bgp
, BGP_FLAG_ASPATH_IGNORE
);
1947 bgp_recalculate_all_bestpaths (bgp
);
1952 DEFUN (no_bgp_bestpath_aspath_ignore
,
1953 no_bgp_bestpath_aspath_ignore_cmd
,
1954 "no bgp bestpath as-path ignore",
1956 "BGP specific commands\n"
1957 "Change the default bestpath selection\n"
1958 "AS-path attribute\n"
1959 "Ignore as-path length in selecting a route\n")
1961 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1962 bgp_flag_unset (bgp
, BGP_FLAG_ASPATH_IGNORE
);
1963 bgp_recalculate_all_bestpaths (bgp
);
1968 /* "bgp bestpath as-path confed" configuration. */
1969 DEFUN (bgp_bestpath_aspath_confed
,
1970 bgp_bestpath_aspath_confed_cmd
,
1971 "bgp bestpath as-path confed",
1972 "BGP specific commands\n"
1973 "Change the default bestpath selection\n"
1974 "AS-path attribute\n"
1975 "Compare path lengths including confederation sets & sequences in selecting a route\n")
1977 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1978 bgp_flag_set (bgp
, BGP_FLAG_ASPATH_CONFED
);
1979 bgp_recalculate_all_bestpaths (bgp
);
1984 DEFUN (no_bgp_bestpath_aspath_confed
,
1985 no_bgp_bestpath_aspath_confed_cmd
,
1986 "no bgp bestpath as-path confed",
1988 "BGP specific commands\n"
1989 "Change the default bestpath selection\n"
1990 "AS-path attribute\n"
1991 "Compare path lengths including confederation sets & sequences in selecting a route\n")
1993 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
1994 bgp_flag_unset (bgp
, BGP_FLAG_ASPATH_CONFED
);
1995 bgp_recalculate_all_bestpaths (bgp
);
2000 /* "bgp bestpath as-path multipath-relax" configuration. */
2001 DEFUN (bgp_bestpath_aspath_multipath_relax
,
2002 bgp_bestpath_aspath_multipath_relax_cmd
,
2003 "bgp bestpath as-path multipath-relax [<as-set|no-as-set>]",
2004 "BGP specific commands\n"
2005 "Change the default bestpath selection\n"
2006 "AS-path attribute\n"
2007 "Allow load sharing across routes that have different AS paths (but same length)\n"
2008 "Generate an AS_SET\n"
2009 "Do not generate an AS_SET\n")
2011 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2013 bgp_flag_set (bgp
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
);
2015 /* no-as-set is now the default behavior so we can silently
2017 if (argv_find (argv
, argc
, "as-set", &idx
))
2018 bgp_flag_set (bgp
, BGP_FLAG_MULTIPATH_RELAX_AS_SET
);
2020 bgp_flag_unset (bgp
, BGP_FLAG_MULTIPATH_RELAX_AS_SET
) ;
2022 bgp_recalculate_all_bestpaths (bgp
);
2027 DEFUN (no_bgp_bestpath_aspath_multipath_relax
,
2028 no_bgp_bestpath_aspath_multipath_relax_cmd
,
2029 "no bgp bestpath as-path multipath-relax [<as-set|no-as-set>]",
2031 "BGP specific commands\n"
2032 "Change the default bestpath selection\n"
2033 "AS-path attribute\n"
2034 "Allow load sharing across routes that have different AS paths (but same length)\n"
2035 "Generate an AS_SET\n"
2036 "Do not generate an AS_SET\n")
2038 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2039 bgp_flag_unset (bgp
, BGP_FLAG_ASPATH_MULTIPATH_RELAX
);
2040 bgp_flag_unset (bgp
, BGP_FLAG_MULTIPATH_RELAX_AS_SET
);
2041 bgp_recalculate_all_bestpaths (bgp
);
2046 /* "bgp log-neighbor-changes" configuration. */
2047 DEFUN (bgp_log_neighbor_changes
,
2048 bgp_log_neighbor_changes_cmd
,
2049 "bgp log-neighbor-changes",
2050 "BGP specific commands\n"
2051 "Log neighbor up/down and reset reason\n")
2053 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2054 bgp_flag_set (bgp
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
);
2058 DEFUN (no_bgp_log_neighbor_changes
,
2059 no_bgp_log_neighbor_changes_cmd
,
2060 "no bgp log-neighbor-changes",
2062 "BGP specific commands\n"
2063 "Log neighbor up/down and reset reason\n")
2065 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2066 bgp_flag_unset (bgp
, BGP_FLAG_LOG_NEIGHBOR_CHANGES
);
2070 /* "bgp bestpath med" configuration. */
2071 DEFUN (bgp_bestpath_med
,
2072 bgp_bestpath_med_cmd
,
2073 "bgp bestpath med <confed [missing-as-worst]|missing-as-worst [confed]>",
2074 "BGP specific commands\n"
2075 "Change the default bestpath selection\n"
2077 "Compare MED among confederation paths\n"
2078 "Treat missing MED as the least preferred one\n"
2079 "Treat missing MED as the least preferred one\n"
2080 "Compare MED among confederation paths\n")
2082 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2085 if (argv_find (argv
, argc
, "confed", &idx
))
2086 bgp_flag_set (bgp
, BGP_FLAG_MED_CONFED
);
2088 if (argv_find (argv
, argc
, "missing-as-worst", &idx
))
2089 bgp_flag_set (bgp
, BGP_FLAG_MED_MISSING_AS_WORST
);
2091 bgp_recalculate_all_bestpaths (bgp
);
2096 DEFUN (no_bgp_bestpath_med
,
2097 no_bgp_bestpath_med_cmd
,
2098 "no bgp bestpath med <confed [missing-as-worst]|missing-as-worst [confed]>",
2100 "BGP specific commands\n"
2101 "Change the default bestpath selection\n"
2103 "Compare MED among confederation paths\n"
2104 "Treat missing MED as the least preferred one\n"
2105 "Treat missing MED as the least preferred one\n"
2106 "Compare MED among confederation paths\n")
2108 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2111 if (argv_find (argv
, argc
, "confed", &idx
))
2112 bgp_flag_unset (bgp
, BGP_FLAG_MED_CONFED
);
2114 if (argv_find (argv
, argc
, "missing-as-worst", &idx
))
2115 bgp_flag_unset (bgp
, BGP_FLAG_MED_MISSING_AS_WORST
);
2117 bgp_recalculate_all_bestpaths (bgp
);
2122 /* "no bgp default ipv4-unicast". */
2123 DEFUN (no_bgp_default_ipv4_unicast
,
2124 no_bgp_default_ipv4_unicast_cmd
,
2125 "no bgp default ipv4-unicast",
2127 "BGP specific commands\n"
2128 "Configure BGP defaults\n"
2129 "Activate ipv4-unicast for a peer by default\n")
2131 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2132 bgp_flag_set (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
);
2136 DEFUN (bgp_default_ipv4_unicast
,
2137 bgp_default_ipv4_unicast_cmd
,
2138 "bgp default ipv4-unicast",
2139 "BGP specific commands\n"
2140 "Configure BGP defaults\n"
2141 "Activate ipv4-unicast for a peer by default\n")
2143 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2144 bgp_flag_unset (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
);
2148 /* Display hostname in certain command outputs */
2149 DEFUN (bgp_default_show_hostname
,
2150 bgp_default_show_hostname_cmd
,
2151 "bgp default show-hostname",
2152 "BGP specific commands\n"
2153 "Configure BGP defaults\n"
2154 "Show hostname in certain command ouputs\n")
2156 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2157 bgp_flag_set (bgp
, BGP_FLAG_SHOW_HOSTNAME
);
2161 DEFUN (no_bgp_default_show_hostname
,
2162 no_bgp_default_show_hostname_cmd
,
2163 "no bgp default show-hostname",
2165 "BGP specific commands\n"
2166 "Configure BGP defaults\n"
2167 "Show hostname in certain command ouputs\n")
2169 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2170 bgp_flag_unset (bgp
, BGP_FLAG_SHOW_HOSTNAME
);
2174 /* "bgp network import-check" configuration. */
2175 DEFUN (bgp_network_import_check
,
2176 bgp_network_import_check_cmd
,
2177 "bgp network import-check",
2178 "BGP specific commands\n"
2179 "BGP network command\n"
2180 "Check BGP network route exists in IGP\n")
2182 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2183 if (!bgp_flag_check(bgp
, BGP_FLAG_IMPORT_CHECK
))
2185 bgp_flag_set (bgp
, BGP_FLAG_IMPORT_CHECK
);
2186 bgp_static_redo_import_check(bgp
);
2192 ALIAS_HIDDEN (bgp_network_import_check
,
2193 bgp_network_import_check_exact_cmd
,
2194 "bgp network import-check exact",
2195 "BGP specific commands\n"
2196 "BGP network command\n"
2197 "Check BGP network route exists in IGP\n"
2198 "Match route precisely\n")
2200 DEFUN (no_bgp_network_import_check
,
2201 no_bgp_network_import_check_cmd
,
2202 "no bgp network import-check",
2204 "BGP specific commands\n"
2205 "BGP network command\n"
2206 "Check BGP network route exists in IGP\n")
2208 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2209 if (bgp_flag_check(bgp
, BGP_FLAG_IMPORT_CHECK
))
2211 bgp_flag_unset (bgp
, BGP_FLAG_IMPORT_CHECK
);
2212 bgp_static_redo_import_check(bgp
);
2218 DEFUN (bgp_default_local_preference
,
2219 bgp_default_local_preference_cmd
,
2220 "bgp default local-preference (0-4294967295)",
2221 "BGP specific commands\n"
2222 "Configure BGP defaults\n"
2223 "local preference (higher=more preferred)\n"
2224 "Configure default local preference value\n")
2226 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2228 u_int32_t local_pref
;
2230 VTY_GET_INTEGER ("local preference", local_pref
, argv
[idx_number
]->arg
);
2232 bgp_default_local_preference_set (bgp
, local_pref
);
2233 bgp_clear_star_soft_in (vty
, bgp
->name
);
2238 DEFUN (no_bgp_default_local_preference
,
2239 no_bgp_default_local_preference_cmd
,
2240 "no bgp default local-preference [(0-4294967295)]",
2242 "BGP specific commands\n"
2243 "Configure BGP defaults\n"
2244 "local preference (higher=more preferred)\n"
2245 "Configure default local preference value\n")
2247 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2248 bgp_default_local_preference_unset (bgp
);
2249 bgp_clear_star_soft_in (vty
, bgp
->name
);
2255 DEFUN (bgp_default_subgroup_pkt_queue_max
,
2256 bgp_default_subgroup_pkt_queue_max_cmd
,
2257 "bgp default subgroup-pkt-queue-max (20-100)",
2258 "BGP specific commands\n"
2259 "Configure BGP defaults\n"
2260 "subgroup-pkt-queue-max\n"
2261 "Configure subgroup packet queue max\n")
2263 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2267 VTY_GET_INTEGER ("subgroup packet queue max", max_size
, argv
[idx_number
]->arg
);
2269 bgp_default_subgroup_pkt_queue_max_set (bgp
, max_size
);
2274 DEFUN (no_bgp_default_subgroup_pkt_queue_max
,
2275 no_bgp_default_subgroup_pkt_queue_max_cmd
,
2276 "no bgp default subgroup-pkt-queue-max [(20-100)]",
2278 "BGP specific commands\n"
2279 "Configure BGP defaults\n"
2280 "subgroup-pkt-queue-max\n"
2281 "Configure subgroup packet queue max\n")
2283 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2284 bgp_default_subgroup_pkt_queue_max_unset (bgp
);
2289 DEFUN (bgp_rr_allow_outbound_policy
,
2290 bgp_rr_allow_outbound_policy_cmd
,
2291 "bgp route-reflector allow-outbound-policy",
2292 "BGP specific commands\n"
2293 "Allow modifications made by out route-map\n"
2294 "on ibgp neighbors\n")
2296 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2298 if (!bgp_flag_check(bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
))
2300 bgp_flag_set(bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
);
2301 update_group_announce_rrclients(bgp
);
2302 bgp_clear_star_soft_out (vty
, bgp
->name
);
2308 DEFUN (no_bgp_rr_allow_outbound_policy
,
2309 no_bgp_rr_allow_outbound_policy_cmd
,
2310 "no bgp route-reflector allow-outbound-policy",
2312 "BGP specific commands\n"
2313 "Allow modifications made by out route-map\n"
2314 "on ibgp neighbors\n")
2316 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2318 if (bgp_flag_check(bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
))
2320 bgp_flag_unset(bgp
, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY
);
2321 update_group_announce_rrclients(bgp
);
2322 bgp_clear_star_soft_out (vty
, bgp
->name
);
2328 DEFUN (bgp_listen_limit
,
2329 bgp_listen_limit_cmd
,
2330 "bgp listen limit (1-5000)",
2331 "BGP specific commands\n"
2332 "Configure BGP defaults\n"
2333 "maximum number of BGP Dynamic Neighbors that can be created\n"
2334 "Configure Dynamic Neighbors listen limit value\n")
2336 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2340 VTY_GET_INTEGER_RANGE ("listen limit", listen_limit
, argv
[idx_number
]->arg
,
2341 BGP_DYNAMIC_NEIGHBORS_LIMIT_MIN
,
2342 BGP_DYNAMIC_NEIGHBORS_LIMIT_MAX
);
2344 bgp_listen_limit_set (bgp
, listen_limit
);
2349 DEFUN (no_bgp_listen_limit
,
2350 no_bgp_listen_limit_cmd
,
2351 "no bgp listen limit [(1-5000)]",
2352 "BGP specific commands\n"
2353 "Configure BGP defaults\n"
2354 "unset maximum number of BGP Dynamic Neighbors that can be created\n"
2355 "Configure Dynamic Neighbors listen limit value to default\n"
2356 "Configure Dynamic Neighbors listen limit value\n")
2358 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2359 bgp_listen_limit_unset (bgp
);
2365 * Check if this listen range is already configured. Check for exact
2366 * match or overlap based on input.
2368 static struct peer_group
*
2369 listen_range_exists (struct bgp
*bgp
, struct prefix
*range
, int exact
)
2371 struct listnode
*node
, *nnode
;
2372 struct listnode
*node1
, *nnode1
;
2373 struct peer_group
*group
;
2378 afi
= family2afi(range
->family
);
2379 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
2381 for (ALL_LIST_ELEMENTS (group
->listen_range
[afi
], node1
,
2385 match
= prefix_same (range
, lr
);
2387 match
= (prefix_match (range
, lr
) || prefix_match (lr
, range
));
2396 DEFUN (bgp_listen_range
,
2397 bgp_listen_range_cmd
,
2398 "bgp listen range <A.B.C.D/M|X:X::X:X/M> peer-group WORD",
2399 "BGP specific commands\n"
2400 "Configure BGP dynamic neighbors listen range\n"
2401 "Configure BGP dynamic neighbors listen range\n"
2403 "Member of the peer-group\n"
2404 "Peer-group name\n")
2406 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2407 struct prefix range
;
2408 struct peer_group
*group
, *existing_group
;
2413 argv_find (argv
, argc
, "A.B.C.D/M", &idx
);
2414 argv_find (argv
, argc
, "X:X::X:X/M", &idx
);
2415 char *prefix
= argv
[idx
]->arg
;
2416 argv_find (argv
, argc
, "WORD", &idx
);
2417 char *peergroup
= argv
[idx
]->arg
;
2419 /* Convert IP prefix string to struct prefix. */
2420 ret
= str2prefix (prefix
, &range
);
2423 vty_out (vty
, "%% Malformed listen range%s", VTY_NEWLINE
);
2427 afi
= family2afi(range
.family
);
2429 if (afi
== AFI_IP6
&& IN6_IS_ADDR_LINKLOCAL (&range
.u
.prefix6
))
2431 vty_out (vty
, "%% Malformed listen range (link-local address)%s",
2436 apply_mask (&range
);
2438 /* Check if same listen range is already configured. */
2439 existing_group
= listen_range_exists (bgp
, &range
, 1);
2442 if (strcmp (existing_group
->name
, peergroup
) == 0)
2446 vty_out (vty
, "%% Same listen range is attached to peer-group %s%s",
2447 existing_group
->name
, VTY_NEWLINE
);
2452 /* Check if an overlapping listen range exists. */
2453 if (listen_range_exists (bgp
, &range
, 0))
2455 vty_out (vty
, "%% Listen range overlaps with existing listen range%s",
2460 group
= peer_group_lookup (bgp
, peergroup
);
2463 vty_out (vty
, "%% Configure the peer-group first%s", VTY_NEWLINE
);
2467 ret
= peer_group_listen_range_add(group
, &range
);
2468 return bgp_vty_return (vty
, ret
);
2471 DEFUN (no_bgp_listen_range
,
2472 no_bgp_listen_range_cmd
,
2473 "no bgp listen range <A.B.C.D/M|X:X::X:X/M> peer-group WORD",
2475 "BGP specific commands\n"
2476 "Unconfigure BGP dynamic neighbors listen range\n"
2477 "Unconfigure BGP dynamic neighbors listen range\n"
2479 "Member of the peer-group\n"
2480 "Peer-group name\n")
2482 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2483 struct prefix range
;
2484 struct peer_group
*group
;
2489 argv_find (argv
, argc
, "A.B.C.D/M", &idx
);
2490 argv_find (argv
, argc
, "X:X::X:X/M", &idx
);
2491 char *prefix
= argv
[idx
]->arg
;
2492 argv_find (argv
, argc
, "WORD", &idx
);
2493 char *peergroup
= argv
[idx
]->arg
;
2495 // VTY_GET_IPV4_PREFIX ("listen range", range, argv[idx_ipv4_prefixlen]->arg);
2497 /* Convert IP prefix string to struct prefix. */
2498 ret
= str2prefix (prefix
, &range
);
2501 vty_out (vty
, "%% Malformed listen range%s", VTY_NEWLINE
);
2505 afi
= family2afi(range
.family
);
2507 if (afi
== AFI_IP6
&& IN6_IS_ADDR_LINKLOCAL (&range
.u
.prefix6
))
2509 vty_out (vty
, "%% Malformed listen range (link-local address)%s",
2514 apply_mask (&range
);
2516 group
= peer_group_lookup (bgp
, peergroup
);
2519 vty_out (vty
, "%% Peer-group does not exist%s", VTY_NEWLINE
);
2523 ret
= peer_group_listen_range_del(group
, &range
);
2524 return bgp_vty_return (vty
, ret
);
2528 bgp_config_write_listen (struct vty
*vty
, struct bgp
*bgp
)
2530 struct peer_group
*group
;
2531 struct listnode
*node
, *nnode
, *rnode
, *nrnode
;
2532 struct prefix
*range
;
2534 char buf
[PREFIX2STR_BUFFER
];
2536 if (bgp
->dynamic_neighbors_limit
!= BGP_DYNAMIC_NEIGHBORS_LIMIT_DEFAULT
)
2537 vty_out (vty
, " bgp listen limit %d%s",
2538 bgp
->dynamic_neighbors_limit
, VTY_NEWLINE
);
2540 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
2542 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
2544 for (ALL_LIST_ELEMENTS (group
->listen_range
[afi
], rnode
, nrnode
, range
))
2546 prefix2str(range
, buf
, sizeof(buf
));
2547 vty_out(vty
, " bgp listen range %s peer-group %s%s",
2548 buf
, group
->name
, VTY_NEWLINE
);
2557 DEFUN (bgp_disable_connected_route_check
,
2558 bgp_disable_connected_route_check_cmd
,
2559 "bgp disable-ebgp-connected-route-check",
2560 "BGP specific commands\n"
2561 "Disable checking if nexthop is connected on ebgp sessions\n")
2563 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2564 bgp_flag_set (bgp
, BGP_FLAG_DISABLE_NH_CONNECTED_CHK
);
2565 bgp_clear_star_soft_in (vty
, bgp
->name
);
2570 DEFUN (no_bgp_disable_connected_route_check
,
2571 no_bgp_disable_connected_route_check_cmd
,
2572 "no bgp disable-ebgp-connected-route-check",
2574 "BGP specific commands\n"
2575 "Disable checking if nexthop is connected on ebgp sessions\n")
2577 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2578 bgp_flag_unset (bgp
, BGP_FLAG_DISABLE_NH_CONNECTED_CHK
);
2579 bgp_clear_star_soft_in (vty
, bgp
->name
);
2586 peer_remote_as_vty (struct vty
*vty
, const char *peer_str
,
2587 const char *as_str
, afi_t afi
, safi_t safi
)
2589 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2592 int as_type
= AS_SPECIFIED
;
2595 if (as_str
[0] == 'i')
2598 as_type
= AS_INTERNAL
;
2600 else if (as_str
[0] == 'e')
2603 as_type
= AS_EXTERNAL
;
2607 /* Get AS number. */
2608 VTY_GET_INTEGER_RANGE ("AS", as
, as_str
, 1, BGP_AS4_MAX
);
2611 /* If peer is peer group, call proper function. */
2612 ret
= str2sockunion (peer_str
, &su
);
2615 /* Check for peer by interface */
2616 ret
= peer_remote_as (bgp
, NULL
, peer_str
, &as
, as_type
, afi
, safi
);
2619 ret
= peer_group_remote_as (bgp
, peer_str
, &as
, as_type
);
2622 vty_out (vty
, "%% Create the peer-group or interface first%s",
2631 if (peer_address_self_check (bgp
, &su
))
2633 vty_out (vty
, "%% Can not configure the local system as neighbor%s",
2637 ret
= peer_remote_as (bgp
, &su
, NULL
, &as
, as_type
, afi
, safi
);
2640 /* This peer belongs to peer group. */
2643 case BGP_ERR_PEER_GROUP_MEMBER
:
2644 vty_out (vty
, "%% Peer-group AS %u. Cannot configure remote-as for member%s", as
, VTY_NEWLINE
);
2646 case BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
:
2647 vty_out (vty
, "%% The AS# can not be changed from %u to %s, peer-group members must be all internal or all external%s", as
, as_str
, VTY_NEWLINE
);
2650 return bgp_vty_return (vty
, ret
);
2653 DEFUN (neighbor_remote_as
,
2654 neighbor_remote_as_cmd
,
2655 "neighbor <A.B.C.D|X:X::X:X|WORD> remote-as <(1-4294967295)|internal|external>",
2658 "Specify a BGP neighbor\n"
2660 "Internal BGP peer\n"
2661 "External BGP peer\n")
2664 int idx_remote_as
= 3;
2665 return peer_remote_as_vty (vty
, argv
[idx_peer
]->arg
, argv
[idx_remote_as
]->arg
, AFI_IP
, SAFI_UNICAST
);
2669 peer_conf_interface_get (struct vty
*vty
, const char *conf_if
, afi_t afi
,
2670 safi_t safi
, int v6only
, const char *peer_group_name
,
2673 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2675 int as_type
= AS_UNSPECIFIED
;
2677 struct peer_group
*group
;
2681 group
= peer_group_lookup (bgp
, conf_if
);
2685 vty_out (vty
, "%% Name conflict with peer-group %s", VTY_NEWLINE
);
2691 if (as_str
[0] == 'i')
2693 as_type
= AS_INTERNAL
;
2695 else if (as_str
[0] == 'e')
2697 as_type
= AS_EXTERNAL
;
2701 /* Get AS number. */
2702 VTY_GET_INTEGER_RANGE ("AS", as
, as_str
, 1, BGP_AS4_MAX
);
2703 as_type
= AS_SPECIFIED
;
2707 peer
= peer_lookup_by_conf_if (bgp
, conf_if
);
2710 if (bgp_flag_check (bgp
, BGP_FLAG_NO_DEFAULT_IPV4
)
2711 && afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
2712 peer
= peer_create (NULL
, conf_if
, bgp
, bgp
->as
, as
, as_type
, 0, 0,
2715 peer
= peer_create (NULL
, conf_if
, bgp
, bgp
->as
, as
, as_type
, afi
, safi
,
2719 SET_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
);
2721 /* Request zebra to initiate IPv6 RAs on this interface. We do this
2722 * any unnumbered peer in order to not worry about run-time transitions
2723 * (e.g., peering is initially IPv4, but the IPv4 /30 or /31 address
2724 * gets deleted later etc.)
2728 bgp_zebra_initiate_radv (bgp
, peer
);
2730 peer_flag_set (peer
, PEER_FLAG_CAPABILITY_ENHE
);
2732 else if ((v6only
&& !CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
)) ||
2733 (!v6only
&& CHECK_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
)))
2736 SET_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
);
2738 UNSET_FLAG(peer
->flags
, PEER_FLAG_IFPEER_V6ONLY
);
2740 /* v6only flag changed. Reset bgp seesion */
2741 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer
->status
))
2743 peer
->last_reset
= PEER_DOWN_V6ONLY_CHANGE
;
2744 bgp_notify_send (peer
, BGP_NOTIFY_CEASE
,
2745 BGP_NOTIFY_CEASE_CONFIG_CHANGE
);
2748 bgp_session_reset(peer
);
2754 if (peer_group_name
)
2756 group
= peer_group_lookup (bgp
, peer_group_name
);
2759 vty_out (vty
, "%% Configure the peer-group first%s", VTY_NEWLINE
);
2763 ret
= peer_group_bind (bgp
, &su
, peer
, group
, &as
);
2766 return bgp_vty_return (vty
, ret
);
2769 DEFUN (neighbor_interface_config
,
2770 neighbor_interface_config_cmd
,
2771 "neighbor WORD interface [peer-group WORD]",
2773 "Interface name or neighbor tag\n"
2774 "Enable BGP on interface\n"
2775 "Member of the peer-group\n"
2776 "Peer-group name\n")
2779 int idx_peer_group_word
= 4;
2781 if (argc
> idx_peer_group_word
)
2782 return peer_conf_interface_get (vty
, argv
[idx_word
]->arg
, AFI_IP
, SAFI_UNICAST
, 0,
2783 argv
[idx_peer_group_word
]->arg
, NULL
);
2785 return peer_conf_interface_get (vty
, argv
[idx_word
]->arg
, AFI_IP
, SAFI_UNICAST
, 0,
2789 DEFUN (neighbor_interface_config_v6only
,
2790 neighbor_interface_config_v6only_cmd
,
2791 "neighbor WORD interface v6only [peer-group WORD]",
2793 "Interface name or neighbor tag\n"
2794 "Enable BGP on interface\n"
2795 "Enable BGP with v6 link-local only\n"
2796 "Member of the peer-group\n"
2797 "Peer-group name\n")
2800 int idx_peer_group_word
= 5;
2802 if (argc
> idx_peer_group_word
)
2803 return peer_conf_interface_get (vty
, argv
[idx_word
]->arg
, AFI_IP
, SAFI_UNICAST
, 1,
2804 argv
[idx_peer_group_word
]->arg
, NULL
);
2806 return peer_conf_interface_get (vty
, argv
[idx_word
]->arg
, AFI_IP
, SAFI_UNICAST
, 1,
2811 DEFUN (neighbor_interface_config_remote_as
,
2812 neighbor_interface_config_remote_as_cmd
,
2813 "neighbor WORD interface remote-as <(1-4294967295)|internal|external>",
2815 "Interface name or neighbor tag\n"
2816 "Enable BGP on interface\n"
2817 "Specify a BGP neighbor\n"
2819 "Internal BGP peer\n"
2820 "External BGP peer\n")
2823 int idx_remote_as
= 4;
2824 return peer_conf_interface_get (vty
, argv
[idx_word
]->arg
, AFI_IP
, SAFI_UNICAST
, 0,
2825 NULL
, argv
[idx_remote_as
]->arg
);
2828 DEFUN (neighbor_interface_v6only_config_remote_as
,
2829 neighbor_interface_v6only_config_remote_as_cmd
,
2830 "neighbor WORD interface v6only remote-as <(1-4294967295)|internal|external>",
2832 "Interface name or neighbor tag\n"
2833 "Enable BGP with v6 link-local only\n"
2834 "Enable BGP on interface\n"
2835 "Specify a BGP neighbor\n"
2837 "Internal BGP peer\n"
2838 "External BGP peer\n")
2841 int idx_remote_as
= 5;
2842 return peer_conf_interface_get (vty
, argv
[idx_word
]->arg
, AFI_IP
, SAFI_UNICAST
, 1,
2843 NULL
, argv
[idx_remote_as
]->arg
);
2846 DEFUN (neighbor_peer_group
,
2847 neighbor_peer_group_cmd
,
2848 "neighbor WORD peer-group",
2850 "Interface name or neighbor tag\n"
2851 "Configure peer-group\n")
2853 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2856 struct peer_group
*group
;
2858 peer
= peer_lookup_by_conf_if (bgp
, argv
[idx_word
]->arg
);
2861 vty_out (vty
, "%% Name conflict with interface: %s", VTY_NEWLINE
);
2865 group
= peer_group_get (bgp
, argv
[idx_word
]->arg
);
2874 "no neighbor <WORD|<A.B.C.D|X:X::X:X> [remote-as <(1-4294967295)|internal|external>]>",
2878 "Specify a BGP neighbor\n"
2880 "Internal BGP peer\n"
2881 "External BGP peer\n")
2883 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2887 struct peer_group
*group
;
2891 ret
= str2sockunion (argv
[idx_peer
]->arg
, &su
);
2894 /* look up for neighbor by interface name config. */
2895 peer
= peer_lookup_by_conf_if (bgp
, argv
[idx_peer
]->arg
);
2898 /* Request zebra to terminate IPv6 RAs on this interface. */
2900 bgp_zebra_terminate_radv (peer
->bgp
, peer
);
2905 group
= peer_group_lookup (bgp
, argv
[idx_peer
]->arg
);
2907 peer_group_delete (group
);
2910 vty_out (vty
, "%% Create the peer-group first%s", VTY_NEWLINE
);
2916 peer
= peer_lookup (bgp
, &su
);
2919 if (peer_dynamic_neighbor (peer
))
2921 vty_out (vty
, "%% Operation not allowed on a dynamic neighbor%s",
2926 other
= peer
->doppelganger
;
2928 if (other
&& other
->status
!= Deleted
)
2936 DEFUN (no_neighbor_interface_config
,
2937 no_neighbor_interface_config_cmd
,
2938 "no neighbor WORD interface [v6only] [peer-group WORD] [remote-as <(1-4294967295)|internal|external>]",
2942 "Configure BGP on interface\n"
2943 "Enable BGP with v6 link-local only\n"
2944 "Member of the peer-group\n"
2946 "Specify a BGP neighbor\n"
2948 "Internal BGP peer\n"
2949 "External BGP peer\n")
2951 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2955 /* look up for neighbor by interface name config. */
2956 peer
= peer_lookup_by_conf_if (bgp
, argv
[idx_word
]->arg
);
2959 /* Request zebra to terminate IPv6 RAs on this interface. */
2961 bgp_zebra_terminate_radv (peer
->bgp
, peer
);
2966 vty_out (vty
, "%% Create the bgp interface first%s", VTY_NEWLINE
);
2972 DEFUN (no_neighbor_peer_group
,
2973 no_neighbor_peer_group_cmd
,
2974 "no neighbor WORD peer-group",
2978 "Configure peer-group\n")
2980 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
2982 struct peer_group
*group
;
2984 group
= peer_group_lookup (bgp
, argv
[idx_word
]->arg
);
2986 peer_group_delete (group
);
2989 vty_out (vty
, "%% Create the peer-group first%s", VTY_NEWLINE
);
2995 DEFUN (no_neighbor_interface_peer_group_remote_as
,
2996 no_neighbor_interface_peer_group_remote_as_cmd
,
2997 "no neighbor WORD remote-as <(1-4294967295)|internal|external>",
3000 "Interface name or neighbor tag\n"
3001 "Specify a BGP neighbor\n"
3003 "Internal BGP peer\n"
3004 "External BGP peer\n")
3006 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3008 struct peer_group
*group
;
3011 /* look up for neighbor by interface name config. */
3012 peer
= peer_lookup_by_conf_if (bgp
, argv
[idx_word
]->arg
);
3015 peer_as_change (peer
, 0, AS_SPECIFIED
);
3019 group
= peer_group_lookup (bgp
, argv
[idx_word
]->arg
);
3021 peer_group_remote_as_delete (group
);
3024 vty_out (vty
, "%% Create the peer-group or interface first%s", VTY_NEWLINE
);
3030 DEFUN (neighbor_local_as
,
3031 neighbor_local_as_cmd
,
3032 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295)",
3035 "Specify a local-as number\n"
3036 "AS number used as local AS\n")
3044 peer
= peer_and_group_lookup_vty (vty
, argv
[idx_peer
]->arg
);
3048 VTY_GET_INTEGER_RANGE ("Local AS", as
, argv
[idx_number
]->arg
, 1, BGP_AS4_MAX
);
3049 ret
= peer_local_as_set (peer
, as
, 0, 0);
3050 return bgp_vty_return (vty
, ret
);
3053 DEFUN (neighbor_local_as_no_prepend
,
3054 neighbor_local_as_no_prepend_cmd
,
3055 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295) no-prepend",
3058 "Specify a local-as number\n"
3059 "AS number used as local AS\n"
3060 "Do not prepend local-as to updates from ebgp peers\n")
3068 peer
= peer_and_group_lookup_vty (vty
, argv
[idx_peer
]->arg
);
3072 VTY_GET_INTEGER_RANGE ("Local AS", as
, argv
[idx_number
]->arg
, 1, BGP_AS4_MAX
);
3073 ret
= peer_local_as_set (peer
, as
, 1, 0);
3074 return bgp_vty_return (vty
, ret
);
3077 DEFUN (neighbor_local_as_no_prepend_replace_as
,
3078 neighbor_local_as_no_prepend_replace_as_cmd
,
3079 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295) no-prepend replace-as",
3082 "Specify a local-as number\n"
3083 "AS number used as local AS\n"
3084 "Do not prepend local-as to updates from ebgp peers\n"
3085 "Do not prepend local-as to updates from ibgp peers\n")
3093 peer
= peer_and_group_lookup_vty (vty
, argv
[idx_peer
]->arg
);
3097 VTY_GET_INTEGER_RANGE ("Local AS", as
, argv
[idx_number
]->arg
, 1, BGP_AS4_MAX
);
3098 ret
= peer_local_as_set (peer
, as
, 1, 1);
3099 return bgp_vty_return (vty
, ret
);
3102 DEFUN (no_neighbor_local_as
,
3103 no_neighbor_local_as_cmd
,
3104 "no neighbor <A.B.C.D|X:X::X:X|WORD> local-as [(1-4294967295) [no-prepend [replace-as]]]",
3108 "Specify a local-as number\n"
3109 "AS number used as local AS\n"
3110 "Do not prepend local-as to updates from ebgp peers\n"
3111 "Do not prepend local-as to updates from ibgp peers\n")
3117 peer
= peer_and_group_lookup_vty (vty
, argv
[idx_peer
]->arg
);
3121 ret
= peer_local_as_unset (peer
);
3122 return bgp_vty_return (vty
, ret
);
3128 DEFUN (neighbor_solo
,
3130 "neighbor <A.B.C.D|X:X::X:X|WORD> solo",
3133 "Solo peer - part of its own update group\n")
3139 peer
= peer_and_group_lookup_vty (vty
, argv
[idx_peer
]->arg
);
3143 ret
= update_group_adjust_soloness(peer
, 1);
3144 return bgp_vty_return (vty
, ret
);
3147 DEFUN (no_neighbor_solo
,
3148 no_neighbor_solo_cmd
,
3149 "no neighbor <A.B.C.D|X:X::X:X|WORD> solo",
3153 "Solo peer - part of its own update group\n")
3159 peer
= peer_and_group_lookup_vty (vty
, argv
[idx_peer
]->arg
);
3163 ret
= update_group_adjust_soloness(peer
, 0);
3164 return bgp_vty_return (vty
, ret
);
3167 DEFUN (neighbor_password
,
3168 neighbor_password_cmd
,
3169 "neighbor <A.B.C.D|X:X::X:X|WORD> password LINE",
3180 peer
= peer_and_group_lookup_vty (vty
, argv
[idx_peer
]->arg
);
3184 ret
= peer_password_set (peer
, argv
[idx_line
]->arg
);
3185 return bgp_vty_return (vty
, ret
);
3188 DEFUN (no_neighbor_password
,
3189 no_neighbor_password_cmd
,
3190 "no neighbor <A.B.C.D|X:X::X:X|WORD> password [LINE]",
3201 peer
= peer_and_group_lookup_vty (vty
, argv
[idx_peer
]->arg
);
3205 ret
= peer_password_unset (peer
);
3206 return bgp_vty_return (vty
, ret
);
3210 DEFUN (neighbor_activate
,
3211 neighbor_activate_cmd
,
3212 "neighbor <A.B.C.D|X:X::X:X|WORD> activate",
3215 "Enable the Address Family for this Neighbor\n")
3221 peer
= peer_and_group_lookup_vty (vty
, argv
[idx_peer
]->arg
);
3225 ret
= peer_activate (peer
, bgp_node_afi (vty
), bgp_node_safi (vty
));
3232 DEFUN (no_neighbor_activate
,
3233 no_neighbor_activate_cmd
,
3234 "no neighbor <A.B.C.D|X:X::X:X|WORD> activate",
3238 "Enable the Address Family for this Neighbor\n")
3245 peer
= peer_and_group_lookup_vty (vty
, argv
[idx_peer
]->arg
);
3249 ret
= peer_deactivate (peer
, bgp_node_afi (vty
), bgp_node_safi (vty
));
3256 DEFUN (neighbor_set_peer_group
,
3257 neighbor_set_peer_group_cmd
,
3258 "neighbor <A.B.C.D|X:X::X:X|WORD> peer-group WORD",
3261 "Member of the peer-group\n"
3262 "Peer-group name\n")
3264 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3271 struct peer_group
*group
;
3275 ret
= str2sockunion (argv
[idx_peer
]->arg
, &su
);
3278 peer
= peer_lookup_by_conf_if (bgp
, argv
[idx_peer
]->arg
);
3281 vty_out (vty
, "%% Malformed address or name: %s%s", argv
[idx_peer
]->arg
, VTY_NEWLINE
);
3287 if (peer_address_self_check (bgp
, &su
))
3289 vty_out (vty
, "%% Can not configure the local system as neighbor%s",
3294 /* Disallow for dynamic neighbor. */
3295 peer
= peer_lookup (bgp
, &su
);
3296 if (peer
&& peer_dynamic_neighbor (peer
))
3298 vty_out (vty
, "%% Operation not allowed on a dynamic neighbor%s",
3304 group
= peer_group_lookup (bgp
, argv
[idx_word
]->arg
);
3307 vty_out (vty
, "%% Configure the peer-group first%s", VTY_NEWLINE
);
3311 ret
= peer_group_bind (bgp
, &su
, peer
, group
, &as
);
3313 if (ret
== BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT
)
3315 vty_out (vty
, "%% Peer with AS %u cannot be in this peer-group, members must be all internal or all external%s", as
, VTY_NEWLINE
);
3319 return bgp_vty_return (vty
, ret
);
3322 DEFUN (no_neighbor_set_peer_group
,
3323 no_neighbor_set_peer_group_cmd
,
3324 "no neighbor <A.B.C.D|X:X::X:X|WORD> peer-group WORD",
3328 "Member of the peer-group\n"
3329 "Peer-group name\n")
3331 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
3336 struct peer_group
*group
;
3338 peer
= peer_lookup_vty (vty
, argv
[idx_peer
]->arg
);
3342 group
= peer_group_lookup (bgp
, argv
[idx_word
]->arg
);
3345 vty_out (vty
, "%% Configure the peer-group first%s", VTY_NEWLINE
);
3349 ret
= peer_group_unbind (bgp
, peer
, group
);
3351 return bgp_vty_return (vty
, ret
);
3355 peer_flag_modify_vty (struct vty
*vty
, const char *ip_str
,
3356 u_int16_t flag
, int set
)
3361 peer
= peer_and_group_lookup_vty (vty
, ip_str
);
3366 * If 'neighbor <interface>', then this is for directly connected peers,
3367 * we should not accept disable-connected-check.
3369 if (peer
->conf_if
&& (flag
== PEER_FLAG_DISABLE_CONNECTED_CHECK
)) {
3370 vty_out (vty
, "%s is directly connected peer, cannot accept disable-"
3371 "connected-check%s", ip_str
, VTY_NEWLINE
);
3375 if (!set
&& flag
== PEER_FLAG_SHUTDOWN
)
3376 peer_tx_shutdown_message_unset (peer
);
3379 ret
= peer_flag_set (peer
, flag
);
3381 ret
= peer_flag_unset (peer
, flag
);
3383 return bgp_vty_return (vty
, ret
);
3387 peer_flag_set_vty (struct vty
*vty
, const char *ip_str
, u_int16_t flag
)
3389 return peer_flag_modify_vty (vty
, ip_str
, flag
, 1);
3393 peer_flag_unset_vty (struct vty
*vty
, const char *ip_str
, u_int16_t flag
)
3395 return peer_flag_modify_vty (vty
, ip_str
, flag
, 0);
3398 /* neighbor passive. */
3399 DEFUN (neighbor_passive
,
3400 neighbor_passive_cmd
,
3401 "neighbor <A.B.C.D|X:X::X:X|WORD> passive",
3404 "Don't send open messages to this neighbor\n")
3407 return peer_flag_set_vty (vty
, argv
[idx_peer
]->arg
, PEER_FLAG_PASSIVE
);
3410 DEFUN (no_neighbor_passive
,
3411 no_neighbor_passive_cmd
,
3412 "no neighbor <A.B.C.D|X:X::X:X|WORD> passive",
3416 "Don't send open messages to this neighbor\n")
3419 return peer_flag_unset_vty (vty
, argv
[idx_peer
]->arg
, PEER_FLAG_PASSIVE
);
3422 /* neighbor shutdown. */
3423 DEFUN (neighbor_shutdown_msg
,
3424 neighbor_shutdown_msg_cmd
,
3425 "neighbor <A.B.C.D|X:X::X:X|WORD> shutdown message MSG...",
3428 "Administratively shut down this neighbor\n"
3429 "Add a shutdown message (draft-ietf-idr-shutdown-06)\n"
3430 "Shutdown message\n")
3436 struct peer
*peer
= peer_and_group_lookup_vty (vty
, argv
[idx_peer
]->arg
);
3441 message
= argv_concat (argv
, argc
, 4);
3442 peer_tx_shutdown_message_set (peer
, message
);
3443 XFREE (MTYPE_TMP
, message
);
3446 return peer_flag_set_vty (vty
, argv
[idx_peer
]->arg
, PEER_FLAG_SHUTDOWN
);
3449 ALIAS (neighbor_shutdown_msg
,
3450 neighbor_shutdown_cmd
,
3451 "neighbor <A.B.C.D|X:X::X:X|WORD> shutdown",
3454 "Administratively shut down this neighbor\n")
3456 DEFUN (no_neighbor_shutdown_msg
,
3457 no_neighbor_shutdown_msg_cmd
,
3458 "no neighbor <A.B.C.D|X:X::X:X|WORD> shutdown message MSG...",
3462 "Administratively shut down this neighbor\n"
3463 "Remove a shutdown message (draft-ietf-idr-shutdown-06)\n"
3464 "Shutdown message\n")
3468 return peer_flag_unset_vty (vty
, argv
[idx_peer
]->arg
, PEER_FLAG_SHUTDOWN
);
3471 ALIAS (no_neighbor_shutdown_msg
,
3472 no_neighbor_shutdown_cmd
,
3473 "no neighbor <A.B.C.D|X:X::X:X|WORD> shutdown",
3477 "Administratively shut down this neighbor\n")
3479 /* neighbor capability dynamic. */
3480 DEFUN (neighbor_capability_dynamic
,
3481 neighbor_capability_dynamic_cmd
,
3482 "neighbor <A.B.C.D|X:X::X:X|WORD> capability dynamic",
3485 "Advertise capability to the peer\n"
3486 "Advertise dynamic capability to this neighbor\n")
3489 return peer_flag_set_vty (vty
, argv
[idx_peer
]->arg
, PEER_FLAG_DYNAMIC_CAPABILITY
);
3492 DEFUN (no_neighbor_capability_dynamic
,
3493 no_neighbor_capability_dynamic_cmd
,
3494 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability dynamic",
3498 "Advertise capability to the peer\n"
3499 "Advertise dynamic capability to this neighbor\n")
3502 return peer_flag_unset_vty (vty
, argv
[idx_peer
]->arg
, PEER_FLAG_DYNAMIC_CAPABILITY
);
3505 /* neighbor dont-capability-negotiate */
3506 DEFUN (neighbor_dont_capability_negotiate
,
3507 neighbor_dont_capability_negotiate_cmd
,
3508 "neighbor <A.B.C.D|X:X::X:X|WORD> dont-capability-negotiate",
3511 "Do not perform capability negotiation\n")
3514 return peer_flag_set_vty (vty
, argv
[idx_peer
]->arg
, PEER_FLAG_DONT_CAPABILITY
);
3517 DEFUN (no_neighbor_dont_capability_negotiate
,
3518 no_neighbor_dont_capability_negotiate_cmd
,
3519 "no neighbor <A.B.C.D|X:X::X:X|WORD> dont-capability-negotiate",
3523 "Do not perform capability negotiation\n")
3526 return peer_flag_unset_vty (vty
, argv
[idx_peer
]->arg
, PEER_FLAG_DONT_CAPABILITY
);
3529 /* neighbor capability extended next hop encoding */
3530 DEFUN (neighbor_capability_enhe
,
3531 neighbor_capability_enhe_cmd
,
3532 "neighbor <A.B.C.D|X:X::X:X|WORD> capability extended-nexthop",
3535 "Advertise capability to the peer\n"
3536 "Advertise extended next-hop capability to the peer\n")
3539 return peer_flag_set_vty (vty
, argv
[idx_peer
]->arg
, PEER_FLAG_CAPABILITY_ENHE
);
3542 DEFUN (no_neighbor_capability_enhe
,
3543 no_neighbor_capability_enhe_cmd
,
3544 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability extended-nexthop",
3548 "Advertise capability to the peer\n"
3549 "Advertise extended next-hop capability to the peer\n")
3552 return peer_flag_unset_vty (vty
, argv
[idx_peer
]->arg
, PEER_FLAG_CAPABILITY_ENHE
);
3556 peer_af_flag_modify_vty (struct vty
*vty
, const char *peer_str
, afi_t afi
,
3557 safi_t safi
, u_int32_t flag
, int set
)
3562 peer
= peer_and_group_lookup_vty (vty
, peer_str
);
3567 ret
= peer_af_flag_set (peer
, afi
, safi
, flag
);
3569 ret
= peer_af_flag_unset (peer
, afi
, safi
, flag
);
3571 return bgp_vty_return (vty
, ret
);
3575 peer_af_flag_set_vty (struct vty
*vty
, const char *peer_str
, afi_t afi
,
3576 safi_t safi
, u_int32_t flag
)
3578 return peer_af_flag_modify_vty (vty
, peer_str
, afi
, safi
, flag
, 1);
3582 peer_af_flag_unset_vty (struct vty
*vty
, const char *peer_str
, afi_t afi
,
3583 safi_t safi
, u_int32_t flag
)
3585 return peer_af_flag_modify_vty (vty
, peer_str
, afi
, safi
, flag
, 0);
3588 /* neighbor capability orf prefix-list. */
3589 DEFUN (neighbor_capability_orf_prefix
,
3590 neighbor_capability_orf_prefix_cmd
,
3591 "neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
3594 "Advertise capability to the peer\n"
3595 "Advertise ORF capability to the peer\n"
3596 "Advertise prefixlist ORF capability to this neighbor\n"
3597 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
3598 "Capability to RECEIVE the ORF from this neighbor\n"
3599 "Capability to SEND the ORF to this neighbor\n")
3602 int idx_send_recv
= 5;
3605 if (strncmp (argv
[idx_send_recv
]->arg
, "s", 1) == 0)
3606 flag
= PEER_FLAG_ORF_PREFIX_SM
;
3607 else if (strncmp (argv
[idx_send_recv
]->arg
, "r", 1) == 0)
3608 flag
= PEER_FLAG_ORF_PREFIX_RM
;
3609 else if (strncmp (argv
[idx_send_recv
]->arg
, "b", 1) == 0)
3610 flag
= PEER_FLAG_ORF_PREFIX_SM
|PEER_FLAG_ORF_PREFIX_RM
;
3614 return peer_af_flag_set_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
3615 bgp_node_safi (vty
), flag
);
3618 DEFUN (no_neighbor_capability_orf_prefix
,
3619 no_neighbor_capability_orf_prefix_cmd
,
3620 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
3624 "Advertise capability to the peer\n"
3625 "Advertise ORF capability to the peer\n"
3626 "Advertise prefixlist ORF capability to this neighbor\n"
3627 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
3628 "Capability to RECEIVE the ORF from this neighbor\n"
3629 "Capability to SEND the ORF to this neighbor\n")
3632 int idx_send_recv
= 6;
3635 if (strncmp (argv
[idx_send_recv
]->arg
, "s", 1) == 0)
3636 flag
= PEER_FLAG_ORF_PREFIX_SM
;
3637 else if (strncmp (argv
[idx_send_recv
]->arg
, "r", 1) == 0)
3638 flag
= PEER_FLAG_ORF_PREFIX_RM
;
3639 else if (strncmp (argv
[idx_send_recv
]->arg
, "b", 1) == 0)
3640 flag
= PEER_FLAG_ORF_PREFIX_SM
|PEER_FLAG_ORF_PREFIX_RM
;
3644 return peer_af_flag_unset_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
3645 bgp_node_safi (vty
), flag
);
3648 /* neighbor next-hop-self. */
3649 DEFUN (neighbor_nexthop_self
,
3650 neighbor_nexthop_self_cmd
,
3651 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
3654 "Disable the next hop calculation for this neighbor\n")
3657 return peer_af_flag_set_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
3658 bgp_node_safi (vty
), PEER_FLAG_NEXTHOP_SELF
);
3661 /* neighbor next-hop-self. */
3662 DEFUN (neighbor_nexthop_self_force
,
3663 neighbor_nexthop_self_force_cmd
,
3664 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
3667 "Disable the next hop calculation for this neighbor\n"
3668 "Set the next hop to self for reflected routes\n")
3671 return peer_af_flag_set_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
3672 bgp_node_safi (vty
),
3673 PEER_FLAG_FORCE_NEXTHOP_SELF
);
3676 DEFUN (no_neighbor_nexthop_self
,
3677 no_neighbor_nexthop_self_cmd
,
3678 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
3682 "Disable the next hop calculation for this neighbor\n")
3685 return peer_af_flag_unset_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
3686 bgp_node_safi (vty
),
3687 PEER_FLAG_NEXTHOP_SELF
);
3690 DEFUN (no_neighbor_nexthop_self_force
,
3691 no_neighbor_nexthop_self_force_cmd
,
3692 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
3696 "Disable the next hop calculation for this neighbor\n"
3697 "Set the next hop to self for reflected routes\n")
3700 return peer_af_flag_unset_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
3701 bgp_node_safi (vty
),
3702 PEER_FLAG_FORCE_NEXTHOP_SELF
);
3705 /* neighbor as-override */
3706 DEFUN (neighbor_as_override
,
3707 neighbor_as_override_cmd
,
3708 "neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
3711 "Override ASNs in outbound updates if aspath equals remote-as\n")
3714 return peer_af_flag_set_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
3715 bgp_node_safi (vty
),
3716 PEER_FLAG_AS_OVERRIDE
);
3719 DEFUN (no_neighbor_as_override
,
3720 no_neighbor_as_override_cmd
,
3721 "no neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
3725 "Override ASNs in outbound updates if aspath equals remote-as\n")
3728 return peer_af_flag_unset_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
3729 bgp_node_safi (vty
),
3730 PEER_FLAG_AS_OVERRIDE
);
3733 /* neighbor remove-private-AS. */
3734 DEFUN (neighbor_remove_private_as
,
3735 neighbor_remove_private_as_cmd
,
3736 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
3739 "Remove private ASNs in outbound updates\n")
3742 return peer_af_flag_set_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
3743 bgp_node_safi (vty
),
3744 PEER_FLAG_REMOVE_PRIVATE_AS
);
3747 DEFUN (neighbor_remove_private_as_all
,
3748 neighbor_remove_private_as_all_cmd
,
3749 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
3752 "Remove private ASNs in outbound updates\n"
3753 "Apply to all AS numbers")
3756 return peer_af_flag_set_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
3757 bgp_node_safi (vty
),
3758 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
);
3761 DEFUN (neighbor_remove_private_as_replace_as
,
3762 neighbor_remove_private_as_replace_as_cmd
,
3763 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
3766 "Remove private ASNs in outbound updates\n"
3767 "Replace private ASNs with our ASN in outbound updates\n")
3770 return peer_af_flag_set_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
3771 bgp_node_safi (vty
),
3772 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
);
3775 DEFUN (neighbor_remove_private_as_all_replace_as
,
3776 neighbor_remove_private_as_all_replace_as_cmd
,
3777 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
3780 "Remove private ASNs in outbound updates\n"
3781 "Apply to all AS numbers\n"
3782 "Replace private ASNs with our ASN in outbound updates\n")
3785 return peer_af_flag_set_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
3786 bgp_node_safi (vty
),
3787 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
);
3790 DEFUN (no_neighbor_remove_private_as
,
3791 no_neighbor_remove_private_as_cmd
,
3792 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
3796 "Remove private ASNs in outbound updates\n")
3799 return peer_af_flag_unset_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
3800 bgp_node_safi (vty
),
3801 PEER_FLAG_REMOVE_PRIVATE_AS
);
3804 DEFUN (no_neighbor_remove_private_as_all
,
3805 no_neighbor_remove_private_as_all_cmd
,
3806 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
3810 "Remove private ASNs in outbound updates\n"
3811 "Apply to all AS numbers\n")
3814 return peer_af_flag_unset_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
3815 bgp_node_safi (vty
),
3816 PEER_FLAG_REMOVE_PRIVATE_AS_ALL
);
3819 DEFUN (no_neighbor_remove_private_as_replace_as
,
3820 no_neighbor_remove_private_as_replace_as_cmd
,
3821 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
3825 "Remove private ASNs in outbound updates\n"
3826 "Replace private ASNs with our ASN in outbound updates\n")
3829 return peer_af_flag_unset_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
3830 bgp_node_safi (vty
),
3831 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
);
3834 DEFUN (no_neighbor_remove_private_as_all_replace_as
,
3835 no_neighbor_remove_private_as_all_replace_as_cmd
,
3836 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
3840 "Remove private ASNs in outbound updates\n"
3841 "Apply to all AS numbers\n"
3842 "Replace private ASNs with our ASN in outbound updates\n")
3845 return peer_af_flag_unset_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
3846 bgp_node_safi (vty
),
3847 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
);
3851 /* neighbor send-community. */
3852 DEFUN (neighbor_send_community
,
3853 neighbor_send_community_cmd
,
3854 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
3857 "Send Community attribute to this neighbor\n")
3860 return peer_af_flag_set_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
3861 bgp_node_safi (vty
),
3862 PEER_FLAG_SEND_COMMUNITY
);
3865 DEFUN (no_neighbor_send_community
,
3866 no_neighbor_send_community_cmd
,
3867 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
3871 "Send Community attribute to this neighbor\n")
3874 return peer_af_flag_unset_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
3875 bgp_node_safi (vty
),
3876 PEER_FLAG_SEND_COMMUNITY
);
3879 /* neighbor send-community extended. */
3880 DEFUN (neighbor_send_community_type
,
3881 neighbor_send_community_type_cmd
,
3882 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
3885 "Send Community attribute to this neighbor\n"
3886 "Send Standard and Extended Community attributes\n"
3887 "Send Standard, Large and Extended Community attributes\n"
3888 "Send Extended Community attributes\n"
3889 "Send Standard Community attributes\n"
3890 "Send Large Community attributes\n")
3895 char *peer
= argv
[1]->arg
;
3897 if (argv_find (argv
, argc
, "standard", &idx
))
3898 SET_FLAG (flag
, PEER_FLAG_SEND_COMMUNITY
);
3899 else if (argv_find (argv
, argc
, "extended", &idx
))
3900 SET_FLAG (flag
, PEER_FLAG_SEND_EXT_COMMUNITY
);
3901 else if (argv_find (argv
, argc
, "large", &idx
))
3902 SET_FLAG (flag
, PEER_FLAG_SEND_LARGE_COMMUNITY
);
3903 else if (argv_find (argv
, argc
, "both", &idx
))
3905 SET_FLAG (flag
, PEER_FLAG_SEND_COMMUNITY
);
3906 SET_FLAG (flag
, PEER_FLAG_SEND_EXT_COMMUNITY
);
3910 SET_FLAG (flag
, PEER_FLAG_SEND_COMMUNITY
);
3911 SET_FLAG (flag
, PEER_FLAG_SEND_EXT_COMMUNITY
);
3912 SET_FLAG (flag
, PEER_FLAG_SEND_LARGE_COMMUNITY
);
3915 return peer_af_flag_set_vty (vty
, peer
, bgp_node_afi (vty
), bgp_node_safi (vty
), flag
);
3918 DEFUN (no_neighbor_send_community_type
,
3919 no_neighbor_send_community_type_cmd
,
3920 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
3924 "Send Community attribute to this neighbor\n"
3925 "Send Standard and Extended Community attributes\n"
3926 "Send Standard, Large and Extended Community attributes\n"
3927 "Send Extended Community attributes\n"
3928 "Send Standard Community attributes\n"
3929 "Send Large Community attributes\n")
3933 if (strncmp (argv
[idx_type
]->arg
, "s", 1) == 0)
3934 return peer_af_flag_unset_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
3935 bgp_node_safi (vty
),
3936 PEER_FLAG_SEND_COMMUNITY
);
3937 if (strncmp (argv
[idx_type
]->arg
, "e", 1) == 0)
3938 return peer_af_flag_unset_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
3939 bgp_node_safi (vty
),
3940 PEER_FLAG_SEND_EXT_COMMUNITY
);
3941 if (strncmp (argv
[idx_type
]->arg
, "l", 1) == 0)
3942 return peer_af_flag_unset_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
3943 bgp_node_safi (vty
),
3944 PEER_FLAG_SEND_LARGE_COMMUNITY
);
3945 if (strncmp (argv
[idx_type
]->arg
, "b", 1) == 0)
3946 return peer_af_flag_unset_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
3947 bgp_node_safi (vty
),
3948 PEER_FLAG_SEND_COMMUNITY
|
3949 PEER_FLAG_SEND_EXT_COMMUNITY
);
3951 return peer_af_flag_unset_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
3952 bgp_node_safi (vty
),
3953 (PEER_FLAG_SEND_COMMUNITY
|
3954 PEER_FLAG_SEND_EXT_COMMUNITY
|
3955 PEER_FLAG_SEND_LARGE_COMMUNITY
));
3958 /* neighbor soft-reconfig. */
3959 DEFUN (neighbor_soft_reconfiguration
,
3960 neighbor_soft_reconfiguration_cmd
,
3961 "neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
3964 "Per neighbor soft reconfiguration\n"
3965 "Allow inbound soft reconfiguration for this neighbor\n")
3968 return peer_af_flag_set_vty (vty
, argv
[idx_peer
]->arg
,
3969 bgp_node_afi (vty
), bgp_node_safi (vty
),
3970 PEER_FLAG_SOFT_RECONFIG
);
3973 DEFUN (no_neighbor_soft_reconfiguration
,
3974 no_neighbor_soft_reconfiguration_cmd
,
3975 "no neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
3979 "Per neighbor soft reconfiguration\n"
3980 "Allow inbound soft reconfiguration for this neighbor\n")
3983 return peer_af_flag_unset_vty (vty
, argv
[idx_peer
]->arg
,
3984 bgp_node_afi (vty
), bgp_node_safi (vty
),
3985 PEER_FLAG_SOFT_RECONFIG
);
3988 DEFUN (neighbor_route_reflector_client
,
3989 neighbor_route_reflector_client_cmd
,
3990 "neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
3993 "Configure a neighbor as Route Reflector client\n")
3999 peer
= peer_and_group_lookup_vty (vty
, argv
[idx_peer
]->arg
);
4003 return peer_af_flag_set_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
4004 bgp_node_safi (vty
),
4005 PEER_FLAG_REFLECTOR_CLIENT
);
4008 DEFUN (no_neighbor_route_reflector_client
,
4009 no_neighbor_route_reflector_client_cmd
,
4010 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
4014 "Configure a neighbor as Route Reflector client\n")
4017 return peer_af_flag_unset_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
4018 bgp_node_safi (vty
),
4019 PEER_FLAG_REFLECTOR_CLIENT
);
4022 /* neighbor route-server-client. */
4023 DEFUN (neighbor_route_server_client
,
4024 neighbor_route_server_client_cmd
,
4025 "neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
4028 "Configure a neighbor as Route Server client\n")
4033 peer
= peer_and_group_lookup_vty (vty
, argv
[idx_peer
]->arg
);
4036 return peer_af_flag_set_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
4037 bgp_node_safi (vty
),
4038 PEER_FLAG_RSERVER_CLIENT
);
4041 DEFUN (no_neighbor_route_server_client
,
4042 no_neighbor_route_server_client_cmd
,
4043 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
4047 "Configure a neighbor as Route Server client\n")
4050 return peer_af_flag_unset_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
4051 bgp_node_safi (vty
),
4052 PEER_FLAG_RSERVER_CLIENT
);
4055 DEFUN (neighbor_nexthop_local_unchanged
,
4056 neighbor_nexthop_local_unchanged_cmd
,
4057 "neighbor <A.B.C.D|X:X::X:X|WORD> nexthop-local unchanged",
4060 "Configure treatment of outgoing link-local nexthop attribute\n"
4061 "Leave link-local nexthop unchanged for this peer\n")
4064 return peer_af_flag_set_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
4065 bgp_node_safi (vty
),
4066 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
);
4069 DEFUN (no_neighbor_nexthop_local_unchanged
,
4070 no_neighbor_nexthop_local_unchanged_cmd
,
4071 "no neighbor <A.B.C.D|X:X::X:X|WORD> nexthop-local unchanged",
4075 "Configure treatment of outgoing link-local-nexthop attribute\n"
4076 "Leave link-local nexthop unchanged for this peer\n")
4079 return peer_af_flag_unset_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
4080 bgp_node_safi (vty
),
4081 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED
);
4084 DEFUN (neighbor_attr_unchanged
,
4085 neighbor_attr_unchanged_cmd
,
4086 "neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged\
4088 as-path [<next-hop [med]|med [next-hop]>]|\
4089 next-hop [<as-path [med]|med [as-path]>]|\
4090 med [<as-path [next-hop]|next-hop [as-path]>]\
4094 "BGP attribute is propagated unchanged to this neighbor\n"
4095 "As-path attribute\n"
4096 "Nexthop attribute\n"
4099 "Nexthop attribute\n"
4100 "Nexthop attribute\n"
4101 "As-path attribute\n"
4104 "As-path attribute\n"
4106 "As-path attribute\n"
4107 "Nexthop attribute\n"
4108 "Nexthop attribute\n"
4109 "As-path attribute\n")
4112 char *peer
= argv
[1]->arg
;
4113 u_int16_t flags
= 0;
4115 if (argv_find (argv
, argc
, "as-path", &idx
))
4116 SET_FLAG (flags
, PEER_FLAG_AS_PATH_UNCHANGED
);
4118 if (argv_find (argv
, argc
, "next-hop", &idx
))
4119 SET_FLAG (flags
, PEER_FLAG_NEXTHOP_UNCHANGED
);
4121 if (argv_find (argv
, argc
, "med", &idx
))
4122 SET_FLAG (flags
, PEER_FLAG_MED_UNCHANGED
);
4124 if (!flags
) // no flags means all of them!
4126 SET_FLAG (flags
, PEER_FLAG_AS_PATH_UNCHANGED
);
4127 SET_FLAG (flags
, PEER_FLAG_NEXTHOP_UNCHANGED
);
4128 SET_FLAG (flags
, PEER_FLAG_MED_UNCHANGED
);
4131 return peer_af_flag_set_vty (vty
, peer
, bgp_node_afi (vty
), bgp_node_safi (vty
), flags
);
4134 DEFUN (no_neighbor_attr_unchanged
,
4135 no_neighbor_attr_unchanged_cmd
,
4136 "no neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged\
4138 as-path [<next-hop [med]|med [next-hop]>]|\
4139 next-hop [<as-path [med]|med [as-path]>]|\
4140 med [<as-path [next-hop]|next-hop [as-path]>]\
4145 "BGP attribute is propagated unchanged to this neighbor\n"
4146 "As-path attribute\n"
4147 "Nexthop attribute\n"
4150 "Nexthop attribute\n"
4151 "Nexthop attribute\n"
4152 "As-path attribute\n"
4155 "As-path attribute\n"
4157 "As-path attribute\n"
4158 "Nexthop attribute\n"
4159 "Nexthop attribute\n"
4160 "As-path attribute\n")
4163 char *peer
= argv
[2]->arg
;
4164 u_int16_t flags
= 0;
4166 if (argv_find (argv
, argc
, "as-path", &idx
))
4167 SET_FLAG (flags
, PEER_FLAG_AS_PATH_UNCHANGED
);
4169 if (argv_find (argv
, argc
, "next-hop", &idx
))
4170 SET_FLAG (flags
, PEER_FLAG_NEXTHOP_UNCHANGED
);
4172 if (argv_find (argv
, argc
, "med", &idx
))
4173 SET_FLAG (flags
, PEER_FLAG_MED_UNCHANGED
);
4175 if (!flags
) // no flags means all of them!
4177 SET_FLAG (flags
, PEER_FLAG_AS_PATH_UNCHANGED
);
4178 SET_FLAG (flags
, PEER_FLAG_NEXTHOP_UNCHANGED
);
4179 SET_FLAG (flags
, PEER_FLAG_MED_UNCHANGED
);
4182 return peer_af_flag_unset_vty (vty
, peer
, bgp_node_afi (vty
), bgp_node_safi (vty
), flags
);
4186 /* EBGP multihop configuration. */
4188 peer_ebgp_multihop_set_vty (struct vty
*vty
, const char *ip_str
,
4189 const char *ttl_str
)
4194 peer
= peer_and_group_lookup_vty (vty
, ip_str
);
4199 return bgp_vty_return (vty
, BGP_ERR_INVALID_FOR_DIRECT_PEER
);
4204 VTY_GET_INTEGER_RANGE ("TTL", ttl
, ttl_str
, 1, MAXTTL
);
4206 return bgp_vty_return (vty
, peer_ebgp_multihop_set (peer
, ttl
));
4210 peer_ebgp_multihop_unset_vty (struct vty
*vty
, const char *ip_str
)
4214 peer
= peer_and_group_lookup_vty (vty
, ip_str
);
4218 return bgp_vty_return (vty
, peer_ebgp_multihop_unset (peer
));
4221 /* neighbor ebgp-multihop. */
4222 DEFUN (neighbor_ebgp_multihop
,
4223 neighbor_ebgp_multihop_cmd
,
4224 "neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop",
4227 "Allow EBGP neighbors not on directly connected networks\n")
4230 return peer_ebgp_multihop_set_vty (vty
, argv
[idx_peer
]->arg
, NULL
);
4233 DEFUN (neighbor_ebgp_multihop_ttl
,
4234 neighbor_ebgp_multihop_ttl_cmd
,
4235 "neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop (1-255)",
4238 "Allow EBGP neighbors not on directly connected networks\n"
4239 "maximum hop count\n")
4243 return peer_ebgp_multihop_set_vty (vty
, argv
[idx_peer
]->arg
, argv
[idx_number
]->arg
);
4246 DEFUN (no_neighbor_ebgp_multihop
,
4247 no_neighbor_ebgp_multihop_cmd
,
4248 "no neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop [(1-255)]",
4252 "Allow EBGP neighbors not on directly connected networks\n"
4253 "maximum hop count\n")
4256 return peer_ebgp_multihop_unset_vty (vty
, argv
[idx_peer
]->arg
);
4260 /* disable-connected-check */
4261 DEFUN (neighbor_disable_connected_check
,
4262 neighbor_disable_connected_check_cmd
,
4263 "neighbor <A.B.C.D|X:X::X:X|WORD> <disable-connected-check|enforce-multihop>",
4266 "one-hop away EBGP peer using loopback address\n"
4267 "Enforce EBGP neighbors perform multihop\n")
4270 return peer_flag_set_vty (vty
, argv
[idx_peer
]->arg
, PEER_FLAG_DISABLE_CONNECTED_CHECK
);
4273 DEFUN (no_neighbor_disable_connected_check
,
4274 no_neighbor_disable_connected_check_cmd
,
4275 "no neighbor <A.B.C.D|X:X::X:X|WORD> <disable-connected-check|enforce-multihop>",
4279 "one-hop away EBGP peer using loopback address\n"
4280 "Enforce EBGP neighbors perform multihop\n")
4283 return peer_flag_unset_vty (vty
, argv
[idx_peer
]->arg
, PEER_FLAG_DISABLE_CONNECTED_CHECK
);
4286 DEFUN (neighbor_description
,
4287 neighbor_description_cmd
,
4288 "neighbor <A.B.C.D|X:X::X:X|WORD> description LINE...",
4291 "Neighbor specific description\n"
4292 "Up to 80 characters describing this neighbor\n")
4299 peer
= peer_and_group_lookup_vty (vty
, argv
[idx_peer
]->arg
);
4303 str
= argv_concat(argv
, argc
, idx_line
);
4305 peer_description_set (peer
, str
);
4307 XFREE (MTYPE_TMP
, str
);
4312 DEFUN (no_neighbor_description
,
4313 no_neighbor_description_cmd
,
4314 "no neighbor <A.B.C.D|X:X::X:X|WORD> description [LINE]",
4318 "Neighbor specific description\n"
4319 "Up to 80 characters describing this neighbor\n")
4324 peer
= peer_and_group_lookup_vty (vty
, argv
[idx_peer
]->arg
);
4328 peer_description_unset (peer
);
4334 /* Neighbor update-source. */
4336 peer_update_source_vty (struct vty
*vty
, const char *peer_str
,
4337 const char *source_str
)
4342 peer
= peer_and_group_lookup_vty (vty
, peer_str
);
4352 int ret
= str2sockunion (source_str
, &su
);
4355 peer_update_source_addr_set (peer
, &su
);
4358 if (str2prefix (source_str
, &p
))
4360 vty_out (vty
, "%% Invalid update-source, remove prefix length %s",
4365 peer_update_source_if_set (peer
, source_str
);
4369 peer_update_source_unset (peer
);
4374 #define BGP_UPDATE_SOURCE_HELP_STR \
4377 "Interface name (requires zebra to be running)\n"
4379 DEFUN (neighbor_update_source
,
4380 neighbor_update_source_cmd
,
4381 "neighbor <A.B.C.D|X:X::X:X|WORD> update-source <A.B.C.D|X:X::X:X|WORD>",
4384 "Source of routing updates\n"
4385 BGP_UPDATE_SOURCE_HELP_STR
)
4389 return peer_update_source_vty (vty
, argv
[idx_peer
]->arg
, argv
[idx_peer_2
]->arg
);
4392 DEFUN (no_neighbor_update_source
,
4393 no_neighbor_update_source_cmd
,
4394 "no neighbor <A.B.C.D|X:X::X:X|WORD> update-source [<A.B.C.D|X:X::X:X|WORD>]",
4398 "Source of routing updates\n"
4399 BGP_UPDATE_SOURCE_HELP_STR
)
4402 return peer_update_source_vty (vty
, argv
[idx_peer
]->arg
, NULL
);
4406 peer_default_originate_set_vty (struct vty
*vty
, const char *peer_str
,
4407 afi_t afi
, safi_t safi
,
4408 const char *rmap
, int set
)
4413 peer
= peer_and_group_lookup_vty (vty
, peer_str
);
4418 ret
= peer_default_originate_set (peer
, afi
, safi
, rmap
);
4420 ret
= peer_default_originate_unset (peer
, afi
, safi
);
4422 return bgp_vty_return (vty
, ret
);
4425 /* neighbor default-originate. */
4426 DEFUN (neighbor_default_originate
,
4427 neighbor_default_originate_cmd
,
4428 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate",
4431 "Originate default route to this neighbor\n")
4434 return peer_default_originate_set_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
4435 bgp_node_safi (vty
), NULL
, 1);
4438 DEFUN (neighbor_default_originate_rmap
,
4439 neighbor_default_originate_rmap_cmd
,
4440 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate route-map WORD",
4443 "Originate default route to this neighbor\n"
4444 "Route-map to specify criteria to originate default\n"
4449 return peer_default_originate_set_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
4450 bgp_node_safi (vty
), argv
[idx_word
]->arg
, 1);
4453 DEFUN (no_neighbor_default_originate
,
4454 no_neighbor_default_originate_cmd
,
4455 "no neighbor <A.B.C.D|X:X::X:X|WORD> default-originate [route-map WORD]",
4459 "Originate default route to this neighbor\n"
4460 "Route-map to specify criteria to originate default\n"
4464 return peer_default_originate_set_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
4465 bgp_node_safi (vty
), NULL
, 0);
4469 /* Set neighbor's BGP port. */
4471 peer_port_vty (struct vty
*vty
, const char *ip_str
, int afi
,
4472 const char *port_str
)
4478 peer
= peer_lookup_vty (vty
, ip_str
);
4484 sp
= getservbyname ("bgp", "tcp");
4485 port
= (sp
== NULL
) ? BGP_PORT_DEFAULT
: ntohs (sp
->s_port
);
4489 VTY_GET_INTEGER("port", port
, port_str
);
4492 peer_port_set (peer
, port
);
4497 /* Set specified peer's BGP port. */
4498 DEFUN (neighbor_port
,
4500 "neighbor <A.B.C.D|X:X::X:X> port (0-65535)",
4503 "Neighbor's BGP port\n"
4504 "TCP port number\n")
4508 return peer_port_vty (vty
, argv
[idx_ip
]->arg
, AFI_IP
, argv
[idx_number
]->arg
);
4511 DEFUN (no_neighbor_port
,
4512 no_neighbor_port_cmd
,
4513 "no neighbor <A.B.C.D|X:X::X:X> port [(0-65535)]",
4517 "Neighbor's BGP port\n"
4518 "TCP port number\n")
4521 return peer_port_vty (vty
, argv
[idx_ip
]->arg
, AFI_IP
, NULL
);
4525 /* neighbor weight. */
4527 peer_weight_set_vty (struct vty
*vty
, const char *ip_str
,
4528 afi_t afi
, safi_t safi
,
4529 const char *weight_str
)
4533 unsigned long weight
;
4535 peer
= peer_and_group_lookup_vty (vty
, ip_str
);
4539 VTY_GET_INTEGER_RANGE("weight", weight
, weight_str
, 0, 65535);
4541 ret
= peer_weight_set (peer
, afi
, safi
, weight
);
4542 return bgp_vty_return (vty
, ret
);
4546 peer_weight_unset_vty (struct vty
*vty
, const char *ip_str
,
4547 afi_t afi
, safi_t safi
)
4552 peer
= peer_and_group_lookup_vty (vty
, ip_str
);
4556 ret
= peer_weight_unset (peer
, afi
, safi
);
4557 return bgp_vty_return (vty
, ret
);
4560 DEFUN (neighbor_weight
,
4561 neighbor_weight_cmd
,
4562 "neighbor <A.B.C.D|X:X::X:X|WORD> weight (0-65535)",
4565 "Set default weight for routes from this neighbor\n"
4570 return peer_weight_set_vty (vty
,
4571 argv
[idx_peer
]->arg
,
4573 bgp_node_safi (vty
),
4574 argv
[idx_number
]->arg
);
4577 DEFUN (no_neighbor_weight
,
4578 no_neighbor_weight_cmd
,
4579 "no neighbor <A.B.C.D|X:X::X:X|WORD> weight [(0-65535)]",
4583 "Set default weight for routes from this neighbor\n"
4587 return peer_weight_unset_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
), bgp_node_safi (vty
));
4591 /* Override capability negotiation. */
4592 DEFUN (neighbor_override_capability
,
4593 neighbor_override_capability_cmd
,
4594 "neighbor <A.B.C.D|X:X::X:X|WORD> override-capability",
4597 "Override capability negotiation result\n")
4600 return peer_flag_set_vty (vty
, argv
[idx_peer
]->arg
, PEER_FLAG_OVERRIDE_CAPABILITY
);
4603 DEFUN (no_neighbor_override_capability
,
4604 no_neighbor_override_capability_cmd
,
4605 "no neighbor <A.B.C.D|X:X::X:X|WORD> override-capability",
4609 "Override capability negotiation result\n")
4612 return peer_flag_unset_vty (vty
, argv
[idx_peer
]->arg
, PEER_FLAG_OVERRIDE_CAPABILITY
);
4615 DEFUN (neighbor_strict_capability
,
4616 neighbor_strict_capability_cmd
,
4617 "neighbor <A.B.C.D|X:X::X:X> strict-capability-match",
4620 "Strict capability negotiation match\n")
4623 return peer_flag_set_vty (vty
, argv
[idx_ip
]->arg
, PEER_FLAG_STRICT_CAP_MATCH
);
4626 DEFUN (no_neighbor_strict_capability
,
4627 no_neighbor_strict_capability_cmd
,
4628 "no neighbor <A.B.C.D|X:X::X:X> strict-capability-match",
4632 "Strict capability negotiation match\n")
4635 return peer_flag_unset_vty (vty
, argv
[idx_ip
]->arg
, PEER_FLAG_STRICT_CAP_MATCH
);
4639 peer_timers_set_vty (struct vty
*vty
, const char *ip_str
,
4640 const char *keep_str
, const char *hold_str
)
4644 u_int32_t keepalive
;
4647 peer
= peer_and_group_lookup_vty (vty
, ip_str
);
4651 VTY_GET_INTEGER_RANGE ("Keepalive", keepalive
, keep_str
, 0, 65535);
4652 VTY_GET_INTEGER_RANGE ("Holdtime", holdtime
, hold_str
, 0, 65535);
4654 ret
= peer_timers_set (peer
, keepalive
, holdtime
);
4656 return bgp_vty_return (vty
, ret
);
4660 peer_timers_unset_vty (struct vty
*vty
, const char *ip_str
)
4665 peer
= peer_and_group_lookup_vty (vty
, ip_str
);
4669 ret
= peer_timers_unset (peer
);
4671 return bgp_vty_return (vty
, ret
);
4674 DEFUN (neighbor_timers
,
4675 neighbor_timers_cmd
,
4676 "neighbor <A.B.C.D|X:X::X:X|WORD> timers (0-65535) (0-65535)",
4679 "BGP per neighbor timers\n"
4680 "Keepalive interval\n"
4685 int idx_number_2
= 4;
4686 return peer_timers_set_vty (vty
, argv
[idx_peer
]->arg
, argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
);
4689 DEFUN (no_neighbor_timers
,
4690 no_neighbor_timers_cmd
,
4691 "no neighbor <A.B.C.D|X:X::X:X|WORD> timers [(0-65535) (0-65535)]",
4695 "BGP per neighbor timers\n"
4696 "Keepalive interval\n"
4700 return peer_timers_unset_vty (vty
, argv
[idx_peer
]->arg
);
4705 peer_timers_connect_set_vty (struct vty
*vty
, const char *ip_str
,
4706 const char *time_str
)
4712 peer
= peer_and_group_lookup_vty (vty
, ip_str
);
4716 VTY_GET_INTEGER_RANGE ("Connect time", connect
, time_str
, 0, 65535);
4718 ret
= peer_timers_connect_set (peer
, connect
);
4720 return bgp_vty_return (vty
, ret
);
4724 peer_timers_connect_unset_vty (struct vty
*vty
, const char *ip_str
)
4729 peer
= peer_and_group_lookup_vty (vty
, ip_str
);
4733 ret
= peer_timers_connect_unset (peer
);
4735 return bgp_vty_return (vty
, ret
);
4738 DEFUN (neighbor_timers_connect
,
4739 neighbor_timers_connect_cmd
,
4740 "neighbor <A.B.C.D|X:X::X:X|WORD> timers connect (1-65535)",
4743 "BGP per neighbor timers\n"
4744 "BGP connect timer\n"
4749 return peer_timers_connect_set_vty (vty
, argv
[idx_peer
]->arg
, argv
[idx_number
]->arg
);
4752 DEFUN (no_neighbor_timers_connect
,
4753 no_neighbor_timers_connect_cmd
,
4754 "no neighbor <A.B.C.D|X:X::X:X|WORD> timers connect [(1-65535)]",
4758 "BGP per neighbor timers\n"
4759 "BGP connect timer\n"
4763 return peer_timers_connect_unset_vty (vty
, argv
[idx_peer
]->arg
);
4768 peer_advertise_interval_vty (struct vty
*vty
, const char *ip_str
,
4769 const char *time_str
, int set
)
4773 u_int32_t routeadv
= 0;
4775 peer
= peer_and_group_lookup_vty (vty
, ip_str
);
4780 VTY_GET_INTEGER_RANGE ("advertise interval", routeadv
, time_str
, 0, 600);
4783 ret
= peer_advertise_interval_set (peer
, routeadv
);
4785 ret
= peer_advertise_interval_unset (peer
);
4787 return bgp_vty_return (vty
, ret
);
4790 DEFUN (neighbor_advertise_interval
,
4791 neighbor_advertise_interval_cmd
,
4792 "neighbor <A.B.C.D|X:X::X:X|WORD> advertisement-interval (0-600)",
4795 "Minimum interval between sending BGP routing updates\n"
4796 "time in seconds\n")
4800 return peer_advertise_interval_vty (vty
, argv
[idx_peer
]->arg
, argv
[idx_number
]->arg
, 1);
4803 DEFUN (no_neighbor_advertise_interval
,
4804 no_neighbor_advertise_interval_cmd
,
4805 "no neighbor <A.B.C.D|X:X::X:X|WORD> advertisement-interval [(0-600)]",
4809 "Minimum interval between sending BGP routing updates\n"
4810 "time in seconds\n")
4813 return peer_advertise_interval_vty (vty
, argv
[idx_peer
]->arg
, NULL
, 0);
4817 /* Time to wait before processing route-map updates */
4818 DEFUN (bgp_set_route_map_delay_timer
,
4819 bgp_set_route_map_delay_timer_cmd
,
4820 "bgp route-map delay-timer (0-600)",
4822 "BGP route-map delay timer\n"
4823 "Time in secs to wait before processing route-map changes\n"
4824 "0 disables the timer, no route updates happen when route-maps change\n")
4827 u_int32_t rmap_delay_timer
;
4829 if (argv
[idx_number
]->arg
)
4831 VTY_GET_INTEGER_RANGE ("delay-timer", rmap_delay_timer
, argv
[idx_number
]->arg
, 0, 600);
4832 bm
->rmap_update_timer
= rmap_delay_timer
;
4834 /* if the dynamic update handling is being disabled, and a timer is
4835 * running, stop the timer and act as if the timer has already fired.
4837 if (!rmap_delay_timer
&& bm
->t_rmap_update
)
4839 BGP_TIMER_OFF(bm
->t_rmap_update
);
4840 thread_execute (bm
->master
, bgp_route_map_update_timer
, NULL
, 0);
4848 DEFUN (no_bgp_set_route_map_delay_timer
,
4849 no_bgp_set_route_map_delay_timer_cmd
,
4850 "no bgp route-map delay-timer [(0-600)]",
4853 "Default BGP route-map delay timer\n"
4854 "Reset to default time to wait for processing route-map changes\n"
4855 "0 disables the timer, no route updates happen when route-maps change\n")
4858 bm
->rmap_update_timer
= RMAP_DEFAULT_UPDATE_TIMER
;
4864 /* neighbor interface */
4866 peer_interface_vty (struct vty
*vty
, const char *ip_str
, const char *str
)
4870 peer
= peer_lookup_vty (vty
, ip_str
);
4871 if (! peer
|| peer
->conf_if
)
4875 peer_interface_set (peer
, str
);
4877 peer_interface_unset (peer
);
4882 DEFUN (neighbor_interface
,
4883 neighbor_interface_cmd
,
4884 "neighbor <A.B.C.D|X:X::X:X> interface WORD",
4892 return peer_interface_vty (vty
, argv
[idx_ip
]->arg
, argv
[idx_word
]->arg
);
4895 DEFUN (no_neighbor_interface
,
4896 no_neighbor_interface_cmd
,
4897 "no neighbor <A.B.C.D|X:X::X:X|WORD> interface WORD",
4905 return peer_interface_vty (vty
, argv
[idx_peer
]->arg
, NULL
);
4908 /* Set distribute list to the peer. */
4910 peer_distribute_set_vty (struct vty
*vty
, const char *ip_str
,
4911 afi_t afi
, safi_t safi
,
4912 const char *name_str
, const char *direct_str
)
4916 int direct
= FILTER_IN
;
4918 peer
= peer_and_group_lookup_vty (vty
, ip_str
);
4922 /* Check filter direction. */
4923 if (strncmp (direct_str
, "i", 1) == 0)
4925 else if (strncmp (direct_str
, "o", 1) == 0)
4926 direct
= FILTER_OUT
;
4928 ret
= peer_distribute_set (peer
, afi
, safi
, direct
, name_str
);
4930 return bgp_vty_return (vty
, ret
);
4934 peer_distribute_unset_vty (struct vty
*vty
, const char *ip_str
, afi_t afi
,
4935 safi_t safi
, const char *direct_str
)
4939 int direct
= FILTER_IN
;
4941 peer
= peer_and_group_lookup_vty (vty
, ip_str
);
4945 /* Check filter direction. */
4946 if (strncmp (direct_str
, "i", 1) == 0)
4948 else if (strncmp (direct_str
, "o", 1) == 0)
4949 direct
= FILTER_OUT
;
4951 ret
= peer_distribute_unset (peer
, afi
, safi
, direct
);
4953 return bgp_vty_return (vty
, ret
);
4956 DEFUN (neighbor_distribute_list
,
4957 neighbor_distribute_list_cmd
,
4958 "neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list <(1-199)|(1300-2699)|WORD> <in|out>",
4961 "Filter updates to/from this neighbor\n"
4962 "IP access-list number\n"
4963 "IP access-list number (expanded range)\n"
4964 "IP Access-list name\n"
4965 "Filter incoming updates\n"
4966 "Filter outgoing updates\n")
4971 return peer_distribute_set_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
4972 bgp_node_safi (vty
), argv
[idx_acl
]->arg
, argv
[idx_in_out
]->arg
);
4975 DEFUN (no_neighbor_distribute_list
,
4976 no_neighbor_distribute_list_cmd
,
4977 "no neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list <(1-199)|(1300-2699)|WORD> <in|out>",
4981 "Filter updates to/from this neighbor\n"
4982 "IP access-list number\n"
4983 "IP access-list number (expanded range)\n"
4984 "IP Access-list name\n"
4985 "Filter incoming updates\n"
4986 "Filter outgoing updates\n")
4990 return peer_distribute_unset_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
4991 bgp_node_safi (vty
), argv
[idx_in_out
]->arg
);
4994 /* Set prefix list to the peer. */
4996 peer_prefix_list_set_vty (struct vty
*vty
, const char *ip_str
, afi_t afi
,
4997 safi_t safi
, const char *name_str
,
4998 const char *direct_str
)
5002 int direct
= FILTER_IN
;
5004 peer
= peer_and_group_lookup_vty (vty
, ip_str
);
5008 /* Check filter direction. */
5009 if (strncmp (direct_str
, "i", 1) == 0)
5011 else if (strncmp (direct_str
, "o", 1) == 0)
5012 direct
= FILTER_OUT
;
5014 ret
= peer_prefix_list_set (peer
, afi
, safi
, direct
, name_str
);
5016 return bgp_vty_return (vty
, ret
);
5020 peer_prefix_list_unset_vty (struct vty
*vty
, const char *ip_str
, afi_t afi
,
5021 safi_t safi
, const char *direct_str
)
5025 int direct
= FILTER_IN
;
5027 peer
= peer_and_group_lookup_vty (vty
, ip_str
);
5031 /* Check filter direction. */
5032 if (strncmp (direct_str
, "i", 1) == 0)
5034 else if (strncmp (direct_str
, "o", 1) == 0)
5035 direct
= FILTER_OUT
;
5037 ret
= peer_prefix_list_unset (peer
, afi
, safi
, direct
);
5039 return bgp_vty_return (vty
, ret
);
5042 DEFUN (neighbor_prefix_list
,
5043 neighbor_prefix_list_cmd
,
5044 "neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
5047 "Filter updates to/from this neighbor\n"
5048 "Name of a prefix list\n"
5049 "Filter incoming updates\n"
5050 "Filter outgoing updates\n")
5055 return peer_prefix_list_set_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
5056 bgp_node_safi (vty
), argv
[idx_word
]->arg
, argv
[idx_in_out
]->arg
);
5059 DEFUN (no_neighbor_prefix_list
,
5060 no_neighbor_prefix_list_cmd
,
5061 "no neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
5065 "Filter updates to/from this neighbor\n"
5066 "Name of a prefix list\n"
5067 "Filter incoming updates\n"
5068 "Filter outgoing updates\n")
5072 return peer_prefix_list_unset_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
5073 bgp_node_safi (vty
), argv
[idx_in_out
]->arg
);
5077 peer_aslist_set_vty (struct vty
*vty
, const char *ip_str
,
5078 afi_t afi
, safi_t safi
,
5079 const char *name_str
, const char *direct_str
)
5083 int direct
= FILTER_IN
;
5085 peer
= peer_and_group_lookup_vty (vty
, ip_str
);
5089 /* Check filter direction. */
5090 if (strncmp (direct_str
, "i", 1) == 0)
5092 else if (strncmp (direct_str
, "o", 1) == 0)
5093 direct
= FILTER_OUT
;
5095 ret
= peer_aslist_set (peer
, afi
, safi
, direct
, name_str
);
5097 return bgp_vty_return (vty
, ret
);
5101 peer_aslist_unset_vty (struct vty
*vty
, const char *ip_str
,
5102 afi_t afi
, safi_t safi
,
5103 const char *direct_str
)
5107 int direct
= FILTER_IN
;
5109 peer
= peer_and_group_lookup_vty (vty
, ip_str
);
5113 /* Check filter direction. */
5114 if (strncmp (direct_str
, "i", 1) == 0)
5116 else if (strncmp (direct_str
, "o", 1) == 0)
5117 direct
= FILTER_OUT
;
5119 ret
= peer_aslist_unset (peer
, afi
, safi
, direct
);
5121 return bgp_vty_return (vty
, ret
);
5124 DEFUN (neighbor_filter_list
,
5125 neighbor_filter_list_cmd
,
5126 "neighbor <A.B.C.D|X:X::X:X|WORD> filter-list WORD <in|out>",
5129 "Establish BGP filters\n"
5130 "AS path access-list name\n"
5131 "Filter incoming routes\n"
5132 "Filter outgoing routes\n")
5137 return peer_aslist_set_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
5138 bgp_node_safi (vty
), argv
[idx_word
]->arg
, argv
[idx_in_out
]->arg
);
5141 DEFUN (no_neighbor_filter_list
,
5142 no_neighbor_filter_list_cmd
,
5143 "no neighbor <A.B.C.D|X:X::X:X|WORD> filter-list WORD <in|out>",
5147 "Establish BGP filters\n"
5148 "AS path access-list name\n"
5149 "Filter incoming routes\n"
5150 "Filter outgoing routes\n")
5154 return peer_aslist_unset_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
5155 bgp_node_safi (vty
), argv
[idx_in_out
]->arg
);
5158 /* Set route-map to the peer. */
5160 peer_route_map_set_vty (struct vty
*vty
, const char *ip_str
,
5161 afi_t afi
, safi_t safi
,
5162 const char *name_str
, const char *direct_str
)
5166 int direct
= RMAP_IN
;
5168 peer
= peer_and_group_lookup_vty (vty
, ip_str
);
5172 /* Check filter direction. */
5173 if (strncmp (direct_str
, "in", 2) == 0)
5175 else if (strncmp (direct_str
, "o", 1) == 0)
5178 ret
= peer_route_map_set (peer
, afi
, safi
, direct
, name_str
);
5180 return bgp_vty_return (vty
, ret
);
5184 peer_route_map_unset_vty (struct vty
*vty
, const char *ip_str
, afi_t afi
,
5185 safi_t safi
, const char *direct_str
)
5189 int direct
= RMAP_IN
;
5191 peer
= peer_and_group_lookup_vty (vty
, ip_str
);
5195 /* Check filter direction. */
5196 if (strncmp (direct_str
, "in", 2) == 0)
5198 else if (strncmp (direct_str
, "o", 1) == 0)
5201 ret
= peer_route_map_unset (peer
, afi
, safi
, direct
);
5203 return bgp_vty_return (vty
, ret
);
5206 DEFUN (neighbor_route_map
,
5207 neighbor_route_map_cmd
,
5208 "neighbor <A.B.C.D|X:X::X:X|WORD> route-map WORD <in|out>",
5211 "Apply route map to neighbor\n"
5212 "Name of route map\n"
5213 "Apply map to incoming routes\n"
5214 "Apply map to outbound routes\n")
5219 return peer_route_map_set_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
5220 bgp_node_safi (vty
), argv
[idx_word
]->arg
, argv
[idx_in_out
]->arg
);
5223 DEFUN (no_neighbor_route_map
,
5224 no_neighbor_route_map_cmd
,
5225 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-map WORD <in|out>",
5229 "Apply route map to neighbor\n"
5230 "Name of route map\n"
5231 "Apply map to incoming routes\n"
5232 "Apply map to outbound routes\n")
5236 return peer_route_map_unset_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
5237 bgp_node_safi (vty
), argv
[idx_in_out
]->arg
);
5240 /* Set unsuppress-map to the peer. */
5242 peer_unsuppress_map_set_vty (struct vty
*vty
, const char *ip_str
, afi_t afi
,
5243 safi_t safi
, const char *name_str
)
5248 peer
= peer_and_group_lookup_vty (vty
, ip_str
);
5252 ret
= peer_unsuppress_map_set (peer
, afi
, safi
, name_str
);
5254 return bgp_vty_return (vty
, ret
);
5257 /* Unset route-map from the peer. */
5259 peer_unsuppress_map_unset_vty (struct vty
*vty
, const char *ip_str
, afi_t afi
,
5265 peer
= peer_and_group_lookup_vty (vty
, ip_str
);
5269 ret
= peer_unsuppress_map_unset (peer
, afi
, safi
);
5271 return bgp_vty_return (vty
, ret
);
5274 DEFUN (neighbor_unsuppress_map
,
5275 neighbor_unsuppress_map_cmd
,
5276 "neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
5279 "Route-map to selectively unsuppress suppressed routes\n"
5280 "Name of route map\n")
5284 return peer_unsuppress_map_set_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
5285 bgp_node_safi (vty
), argv
[idx_word
]->arg
);
5288 DEFUN (no_neighbor_unsuppress_map
,
5289 no_neighbor_unsuppress_map_cmd
,
5290 "no neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
5294 "Route-map to selectively unsuppress suppressed routes\n"
5295 "Name of route map\n")
5298 return peer_unsuppress_map_unset_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
5299 bgp_node_safi (vty
));
5303 peer_maximum_prefix_set_vty (struct vty
*vty
, const char *ip_str
, afi_t afi
,
5304 safi_t safi
, const char *num_str
,
5305 const char *threshold_str
, int warning
,
5306 const char *restart_str
)
5314 peer
= peer_and_group_lookup_vty (vty
, ip_str
);
5318 VTY_GET_INTEGER ("maximum number", max
, num_str
);
5320 threshold
= atoi (threshold_str
);
5322 threshold
= MAXIMUM_PREFIX_THRESHOLD_DEFAULT
;
5325 restart
= atoi (restart_str
);
5329 ret
= peer_maximum_prefix_set (peer
, afi
, safi
, max
, threshold
, warning
, restart
);
5331 return bgp_vty_return (vty
, ret
);
5335 peer_maximum_prefix_unset_vty (struct vty
*vty
, const char *ip_str
, afi_t afi
,
5341 peer
= peer_and_group_lookup_vty (vty
, ip_str
);
5345 ret
= peer_maximum_prefix_unset (peer
, afi
, safi
);
5347 return bgp_vty_return (vty
, ret
);
5350 /* Maximum number of prefix configuration. prefix count is different
5351 for each peer configuration. So this configuration can be set for
5352 each peer configuration. */
5353 DEFUN (neighbor_maximum_prefix
,
5354 neighbor_maximum_prefix_cmd
,
5355 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295)",
5358 "Maximum number of prefix accept from this peer\n"
5359 "maximum no. of prefix limit\n")
5363 return peer_maximum_prefix_set_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
5364 bgp_node_safi (vty
), argv
[idx_number
]->arg
, NULL
, 0,
5368 DEFUN (neighbor_maximum_prefix_threshold
,
5369 neighbor_maximum_prefix_threshold_cmd
,
5370 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100)",
5373 "Maximum number of prefix accept from this peer\n"
5374 "maximum no. of prefix limit\n"
5375 "Threshold value (%) at which to generate a warning msg\n")
5379 int idx_number_2
= 4;
5380 return peer_maximum_prefix_set_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
5381 bgp_node_safi (vty
), argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
, 0,
5385 DEFUN (neighbor_maximum_prefix_warning
,
5386 neighbor_maximum_prefix_warning_cmd
,
5387 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) warning-only",
5390 "Maximum number of prefix accept from this peer\n"
5391 "maximum no. of prefix limit\n"
5392 "Only give warning message when limit is exceeded\n")
5396 return peer_maximum_prefix_set_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
5397 bgp_node_safi (vty
), argv
[idx_number
]->arg
, NULL
, 1,
5401 DEFUN (neighbor_maximum_prefix_threshold_warning
,
5402 neighbor_maximum_prefix_threshold_warning_cmd
,
5403 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) warning-only",
5406 "Maximum number of prefix accept from this peer\n"
5407 "maximum no. of prefix limit\n"
5408 "Threshold value (%) at which to generate a warning msg\n"
5409 "Only give warning message when limit is exceeded\n")
5413 int idx_number_2
= 4;
5414 return peer_maximum_prefix_set_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
5415 bgp_node_safi (vty
), argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
, 1, NULL
);
5418 DEFUN (neighbor_maximum_prefix_restart
,
5419 neighbor_maximum_prefix_restart_cmd
,
5420 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) restart (1-65535)",
5423 "Maximum number of prefix accept from this peer\n"
5424 "maximum no. of prefix limit\n"
5425 "Restart bgp connection after limit is exceeded\n"
5426 "Restart interval in minutes")
5430 int idx_number_2
= 5;
5431 return peer_maximum_prefix_set_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
5432 bgp_node_safi (vty
), argv
[idx_number
]->arg
, NULL
, 0, argv
[idx_number_2
]->arg
);
5435 DEFUN (neighbor_maximum_prefix_threshold_restart
,
5436 neighbor_maximum_prefix_threshold_restart_cmd
,
5437 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) restart (1-65535)",
5440 "Maximum number of prefixes to accept from this peer\n"
5441 "maximum no. of prefix limit\n"
5442 "Threshold value (%) at which to generate a warning msg\n"
5443 "Restart bgp connection after limit is exceeded\n"
5444 "Restart interval in minutes\n")
5448 int idx_number_2
= 4;
5449 int idx_number_3
= 6;
5450 return peer_maximum_prefix_set_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
5451 bgp_node_safi (vty
), argv
[idx_number
]->arg
, argv
[idx_number_2
]->arg
, 0, argv
[idx_number_3
]->arg
);
5454 DEFUN (no_neighbor_maximum_prefix
,
5455 no_neighbor_maximum_prefix_cmd
,
5456 "no neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix [(1-4294967295) [(1-100)] [restart (1-65535)] [warning-only]]",
5460 "Maximum number of prefixes to accept from this peer\n"
5461 "maximum no. of prefix limit\n"
5462 "Threshold value (%) at which to generate a warning msg\n"
5463 "Restart bgp connection after limit is exceeded\n"
5464 "Restart interval in minutes\n"
5465 "Only give warning message when limit is exceeded\n")
5468 return peer_maximum_prefix_unset_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
5469 bgp_node_safi (vty
));
5473 /* "neighbor allowas-in" */
5474 DEFUN (neighbor_allowas_in
,
5475 neighbor_allowas_in_cmd
,
5476 "neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
5479 "Accept as-path with my AS present in it\n"
5480 "Number of occurances of AS number\n"
5481 "Only accept my AS in the as-path if the route was originated in my AS\n")
5484 int idx_number_origin
= 3;
5490 peer
= peer_and_group_lookup_vty (vty
, argv
[idx_peer
]->arg
);
5494 if (argc
<= idx_number_origin
)
5498 if (argv
[idx_number_origin
]->type
== WORD_TKN
)
5501 allow_num
= atoi (argv
[idx_number_origin
]->arg
);
5504 ret
= peer_allowas_in_set (peer
, bgp_node_afi (vty
), bgp_node_safi (vty
),
5507 return bgp_vty_return (vty
, ret
);
5510 DEFUN (no_neighbor_allowas_in
,
5511 no_neighbor_allowas_in_cmd
,
5512 "no neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
5516 "allow local ASN appears in aspath attribute\n"
5517 "Number of occurances of AS number\n"
5518 "Only accept my AS in the as-path if the route was originated in my AS\n")
5524 peer
= peer_and_group_lookup_vty (vty
, argv
[idx_peer
]->arg
);
5528 ret
= peer_allowas_in_unset (peer
, bgp_node_afi (vty
), bgp_node_safi (vty
));
5530 return bgp_vty_return (vty
, ret
);
5533 DEFUN (neighbor_ttl_security
,
5534 neighbor_ttl_security_cmd
,
5535 "neighbor <A.B.C.D|X:X::X:X|WORD> ttl-security hops (1-254)",
5538 "BGP ttl-security parameters\n"
5539 "Specify the maximum number of hops to the BGP peer\n"
5540 "Number of hops to BGP peer\n")
5547 peer
= peer_and_group_lookup_vty (vty
, argv
[idx_peer
]->arg
);
5551 VTY_GET_INTEGER_RANGE ("", gtsm_hops
, argv
[idx_number
]->arg
, 1, 254);
5554 * If 'neighbor swpX', then this is for directly connected peers,
5555 * we should not accept a ttl-security hops value greater than 1.
5557 if (peer
->conf_if
&& (gtsm_hops
> 1)) {
5558 vty_out (vty
, "%s is directly connected peer, hops cannot exceed 1%s",
5559 argv
[idx_peer
]->arg
, VTY_NEWLINE
);
5563 return bgp_vty_return (vty
, peer_ttl_security_hops_set (peer
, gtsm_hops
));
5566 DEFUN (no_neighbor_ttl_security
,
5567 no_neighbor_ttl_security_cmd
,
5568 "no neighbor <A.B.C.D|X:X::X:X|WORD> ttl-security hops (1-254)",
5572 "BGP ttl-security parameters\n"
5573 "Specify the maximum number of hops to the BGP peer\n"
5574 "Number of hops to BGP peer\n")
5579 peer
= peer_and_group_lookup_vty (vty
, argv
[idx_peer
]->arg
);
5583 return bgp_vty_return (vty
, peer_ttl_security_hops_unset (peer
));
5586 DEFUN (neighbor_addpath_tx_all_paths
,
5587 neighbor_addpath_tx_all_paths_cmd
,
5588 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
5591 "Use addpath to advertise all paths to a neighbor\n")
5596 peer
= peer_and_group_lookup_vty (vty
, argv
[idx_peer
]->arg
);
5600 return peer_af_flag_set_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
5601 bgp_node_safi (vty
),
5602 PEER_FLAG_ADDPATH_TX_ALL_PATHS
);
5605 DEFUN (no_neighbor_addpath_tx_all_paths
,
5606 no_neighbor_addpath_tx_all_paths_cmd
,
5607 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
5611 "Use addpath to advertise all paths to a neighbor\n")
5614 return peer_af_flag_unset_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
5615 bgp_node_safi (vty
),
5616 PEER_FLAG_ADDPATH_TX_ALL_PATHS
);
5619 DEFUN (neighbor_addpath_tx_bestpath_per_as
,
5620 neighbor_addpath_tx_bestpath_per_as_cmd
,
5621 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
5624 "Use addpath to advertise the bestpath per each neighboring AS\n")
5629 peer
= peer_and_group_lookup_vty (vty
, argv
[idx_peer
]->arg
);
5633 return peer_af_flag_set_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
5634 bgp_node_safi (vty
),
5635 PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS
);
5638 DEFUN (no_neighbor_addpath_tx_bestpath_per_as
,
5639 no_neighbor_addpath_tx_bestpath_per_as_cmd
,
5640 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
5644 "Use addpath to advertise the bestpath per each neighboring AS\n")
5647 return peer_af_flag_unset_vty (vty
, argv
[idx_peer
]->arg
, bgp_node_afi (vty
),
5648 bgp_node_safi (vty
),
5649 PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS
);
5652 DEFUN_NOSH (address_family_ipv4_safi
,
5653 address_family_ipv4_safi_cmd
,
5654 "address-family ipv4 [<unicast|multicast|vpn|encap>]",
5655 "Enter Address Family command mode\n"
5660 if (argc
== (idx_safi
+ 1))
5662 switch (bgp_vty_safi_from_arg(argv
[idx_safi
]->arg
))
5664 case SAFI_MULTICAST
:
5665 vty
->node
= BGP_IPV4M_NODE
;
5668 vty
->node
= BGP_ENCAP_NODE
;
5671 vty
->node
= BGP_VPNV4_NODE
;
5675 vty
->node
= BGP_IPV4_NODE
;
5680 vty
->node
= BGP_IPV4_NODE
;
5685 DEFUN_NOSH (address_family_ipv6_safi
,
5686 address_family_ipv6_safi_cmd
,
5687 "address-family ipv6 [<unicast|multicast|vpn|encap>]",
5688 "Enter Address Family command mode\n"
5693 if (argc
== (idx_safi
+ 1))
5695 switch (bgp_vty_safi_from_arg(argv
[idx_safi
]->arg
))
5697 case SAFI_MULTICAST
:
5698 vty
->node
= BGP_IPV6M_NODE
;
5701 vty
->node
= BGP_ENCAPV6_NODE
;
5704 vty
->node
= BGP_VPNV6_NODE
;
5708 vty
->node
= BGP_IPV6_NODE
;
5713 vty
->node
= BGP_IPV6_NODE
;
5718 #ifdef KEEP_OLD_VPN_COMMANDS
5719 DEFUN_NOSH (address_family_vpnv4
,
5720 address_family_vpnv4_cmd
,
5721 "address-family vpnv4 [unicast]",
5722 "Enter Address Family command mode\n"
5724 "Address Family modifier\n")
5726 vty
->node
= BGP_VPNV4_NODE
;
5730 DEFUN_NOSH (address_family_vpnv6
,
5731 address_family_vpnv6_cmd
,
5732 "address-family vpnv6 [unicast]",
5733 "Enter Address Family command mode\n"
5735 "Address Family modifier\n")
5737 vty
->node
= BGP_VPNV6_NODE
;
5742 DEFUN_NOSH (address_family_encap
,
5743 address_family_encap_cmd
,
5744 "address-family <encap|encapv4>",
5745 "Enter Address Family command mode\n"
5749 vty
->node
= BGP_ENCAP_NODE
;
5754 DEFUN_NOSH (address_family_encapv6
,
5755 address_family_encapv6_cmd
,
5756 "address-family encapv6",
5757 "Enter Address Family command mode\n"
5760 vty
->node
= BGP_ENCAPV6_NODE
;
5764 DEFUN_NOSH (address_family_evpn
,
5765 address_family_evpn_cmd
,
5766 "address-family <l2vpn evpn>",
5767 "Enter Address Family command mode\n"
5768 "EVPN Address family\n"
5769 "Layer2 VPN Address family\n"
5770 "Ethernet Virtual Private Network Subsequent Address Family\n")
5772 vty
->node
= BGP_EVPN_NODE
;
5776 DEFUN_NOSH (exit_address_family
,
5777 exit_address_family_cmd
,
5778 "exit-address-family",
5779 "Exit from Address Family configuration mode\n")
5781 if (vty
->node
== BGP_IPV4_NODE
5782 || vty
->node
== BGP_IPV4M_NODE
5783 || vty
->node
== BGP_VPNV4_NODE
5784 || vty
->node
== BGP_IPV6_NODE
5785 || vty
->node
== BGP_IPV6M_NODE
5786 || vty
->node
== BGP_VPNV6_NODE
5787 || vty
->node
== BGP_ENCAP_NODE
5788 || vty
->node
== BGP_ENCAPV6_NODE
5789 || vty
->node
== BGP_EVPN_NODE
)
5790 vty
->node
= BGP_NODE
;
5794 /* Recalculate bestpath and re-advertise a prefix */
5796 bgp_clear_prefix (struct vty
*vty
, const char *view_name
, const char *ip_str
,
5797 afi_t afi
, safi_t safi
, struct prefix_rd
*prd
)
5800 struct prefix match
;
5801 struct bgp_node
*rn
;
5802 struct bgp_node
*rm
;
5804 struct bgp_table
*table
;
5805 struct bgp_table
*rib
;
5807 /* BGP structure lookup. */
5810 bgp
= bgp_lookup_by_name (view_name
);
5813 vty_out (vty
, "%% Can't find BGP instance %s%s", view_name
, VTY_NEWLINE
);
5819 bgp
= bgp_get_default ();
5822 vty_out (vty
, "%% No BGP process is configured%s", VTY_NEWLINE
);
5827 /* Check IP address argument. */
5828 ret
= str2prefix (ip_str
, &match
);
5831 vty_out (vty
, "%% address is malformed%s", VTY_NEWLINE
);
5835 match
.family
= afi2family (afi
);
5836 rib
= bgp
->rib
[afi
][safi
];
5838 if (safi
== SAFI_MPLS_VPN
)
5840 for (rn
= bgp_table_top (rib
); rn
; rn
= bgp_route_next (rn
))
5842 if (prd
&& memcmp (rn
->p
.u
.val
, prd
->val
, 8) != 0)
5845 if ((table
= rn
->info
) != NULL
)
5847 if ((rm
= bgp_node_match (table
, &match
)) != NULL
)
5849 if (rm
->p
.prefixlen
== match
.prefixlen
)
5851 SET_FLAG (rn
->flags
, BGP_NODE_USER_CLEAR
);
5852 bgp_process (bgp
, rm
, afi
, safi
);
5854 bgp_unlock_node (rm
);
5861 if ((rn
= bgp_node_match (rib
, &match
)) != NULL
)
5863 if (rn
->p
.prefixlen
== match
.prefixlen
)
5865 SET_FLAG (rn
->flags
, BGP_NODE_USER_CLEAR
);
5866 bgp_process (bgp
, rn
, afi
, safi
);
5868 bgp_unlock_node (rn
);
5875 /* one clear bgp command to rule them all */
5876 DEFUN (clear_ip_bgp_all
,
5877 clear_ip_bgp_all_cmd
,
5878 "clear [ip] bgp [<view|vrf> WORD] ["BGP_AFI_CMD_STR
" ["BGP_SAFI_CMD_STR
"]] <*|A.B.C.D|X:X::X:X|WORD|(1-4294967295)|external|peer-group WORD> [<soft [<in|out>]|in [prefix-filter]|out>]",
5882 BGP_INSTANCE_HELP_STR
5884 "BGP neighbor address to clear\n"
5885 "BGP IPv6 neighbor to clear\n"
5886 "BGP neighbor on interface to clear\n"
5887 "Clear peers with the AS number\n"
5888 "Clear all external peers\n"
5889 "Clear all members of peer-group\n"
5890 "BGP peer-group name\n"
5897 "Push out prefix-list ORF and do inbound soft reconfig\n"
5902 afi_t afi
= AFI_IP6
;
5903 safi_t safi
= SAFI_UNICAST
;
5904 enum clear_sort clr_sort
= clear_peer
;
5905 enum bgp_clear_type clr_type
;
5906 char *clr_arg
= NULL
;
5910 /* clear [ip] bgp */
5911 if (argv_find (argv
, argc
, "ip", &idx
))
5913 /* [<view|vrf> WORD] */
5914 if (argv_find (argv
, argc
, "view", &idx
) || argv_find (argv
, argc
, "vrf", &idx
))
5916 vrf
= argv
[idx
+ 1]->arg
;
5919 /* <*|A.B.C.D|X:X::X:X|WORD|(1-4294967295)|external|peer-group WORD> */
5920 if (argv_find (argv
, argc
, "*", &idx
))
5922 clr_sort
= clear_all
;
5924 else if (argv_find (argv
, argc
, "A.B.C.D", &idx
))
5926 clr_sort
= clear_peer
;
5927 clr_arg
= argv
[idx
]->arg
;
5929 else if (argv_find (argv
, argc
, "X:X::X:X", &idx
))
5931 clr_sort
= clear_peer
;
5932 clr_arg
= argv
[idx
]->arg
;
5934 else if (argv_find (argv
, argc
, "peer-group", &idx
))
5936 clr_sort
= clear_group
;
5938 clr_arg
= argv
[idx
]->arg
;
5940 else if (argv_find (argv
, argc
, "WORD", &idx
))
5942 clr_sort
= clear_peer
;
5943 clr_arg
= argv
[idx
]->arg
;
5945 else if (argv_find (argv
, argc
, "(1-4294967295)", &idx
))
5947 clr_sort
= clear_as
;
5948 clr_arg
= argv
[idx
]->arg
;
5950 else if (argv_find (argv
, argc
, "external", &idx
))
5952 clr_sort
= clear_external
;
5954 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
5955 if (argv_find_and_parse_afi (argv
, argc
, &idx
, &afi
))
5957 argv_find_and_parse_safi (argv
, argc
, &idx
, &safi
);
5959 /* [<soft [<in|out>]|in [prefix-filter]|out>] */
5960 if (argv_find (argv
, argc
, "soft", &idx
))
5962 if (argv_find (argv
, argc
, "in", &idx
) || argv_find (argv
, argc
, "out", &idx
))
5963 clr_type
= strmatch (argv
[idx
]->text
, "in") ? BGP_CLEAR_SOFT_IN
: BGP_CLEAR_SOFT_OUT
;
5965 clr_type
= BGP_CLEAR_SOFT_BOTH
;
5967 else if (argv_find (argv
, argc
, "in", &idx
))
5969 clr_type
= argv_find (argv
, argc
, "prefix-filter", &idx
) ? BGP_CLEAR_SOFT_IN_ORF_PREFIX
: BGP_CLEAR_SOFT_IN
;
5971 else if (argv_find (argv
, argc
, "out", &idx
))
5973 clr_type
= BGP_CLEAR_SOFT_OUT
;
5976 clr_type
= BGP_CLEAR_SOFT_NONE
;
5978 return bgp_clear_vty (vty
, vrf
, afi
, safi
, clr_sort
, clr_type
, clr_arg
);
5981 DEFUN (clear_ip_bgp_prefix
,
5982 clear_ip_bgp_prefix_cmd
,
5983 "clear [ip] bgp [<view|vrf> WORD] prefix A.B.C.D/M",
5987 BGP_INSTANCE_HELP_STR
5988 "Clear bestpath and re-advertise\n"
5992 char *prefix
= NULL
;
5996 /* [<view|vrf> WORD] */
5997 if (argv_find (argv
, argc
, "WORD", &idx
))
5998 vrf
= argv
[idx
]->arg
;
6000 prefix
= argv
[argc
-1]->arg
;
6002 return bgp_clear_prefix (vty
, vrf
, prefix
, AFI_IP
, SAFI_UNICAST
, NULL
);
6005 DEFUN (clear_bgp_ipv6_safi_prefix
,
6006 clear_bgp_ipv6_safi_prefix_cmd
,
6007 "clear [ip] bgp ipv6 "BGP_SAFI_CMD_STR
" prefix X:X::X:X/M",
6013 "Clear bestpath and re-advertise\n"
6017 int idx_ipv6_prefixlen
= 5;
6018 return bgp_clear_prefix (vty
, NULL
, argv
[idx_ipv6_prefixlen
]->arg
, AFI_IP6
,
6019 bgp_vty_safi_from_arg(argv
[idx_safi
]->arg
), NULL
);
6022 DEFUN (clear_bgp_instance_ipv6_safi_prefix
,
6023 clear_bgp_instance_ipv6_safi_prefix_cmd
,
6024 "clear [ip] bgp <view|vrf> WORD ipv6 "BGP_SAFI_CMD_STR
" prefix X:X::X:X/M",
6028 BGP_INSTANCE_HELP_STR
6031 "Clear bestpath and re-advertise\n"
6036 int idx_ipv6_prefixlen
= 7;
6037 return bgp_clear_prefix (vty
, argv
[idx_word
]->arg
, argv
[idx_ipv6_prefixlen
]->arg
, AFI_IP6
,
6038 bgp_vty_safi_from_arg(argv
[idx_safi
]->arg
), NULL
);
6041 DEFUN (show_bgp_views
,
6043 "show [ip] bgp views",
6047 "Show the defined BGP views\n")
6049 struct list
*inst
= bm
->bgp
;
6050 struct listnode
*node
;
6053 if (!bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
6055 vty_out (vty
, "BGP Multiple Instance is not enabled%s", VTY_NEWLINE
);
6059 vty_out (vty
, "Defined BGP views:%s", VTY_NEWLINE
);
6060 for (ALL_LIST_ELEMENTS_RO(inst
, node
, bgp
))
6063 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_VRF
)
6065 vty_out (vty
, "\t%s (AS%u)%s",
6066 bgp
->name
? bgp
->name
: "(null)",
6067 bgp
->as
, VTY_NEWLINE
);
6073 DEFUN (show_bgp_vrfs
,
6075 "show [ip] bgp vrfs [json]",
6082 struct list
*inst
= bm
->bgp
;
6083 struct listnode
*node
;
6085 u_char uj
= use_json(argc
, argv
);
6086 json_object
*json
= NULL
;
6087 json_object
*json_vrfs
= NULL
;
6089 static char header
[] = "Type Id RouterId #PeersCfg #PeersEstb Name";
6091 if (!bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE
))
6093 vty_out (vty
, "BGP Multiple Instance is not enabled%s", VTY_NEWLINE
);
6099 json
= json_object_new_object();
6100 json_vrfs
= json_object_new_object();
6103 for (ALL_LIST_ELEMENTS_RO(inst
, node
, bgp
))
6105 const char *name
, *type
;
6107 struct listnode
*node
, *nnode
;
6108 int peers_cfg
, peers_estb
;
6109 json_object
*json_vrf
= NULL
;
6113 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_VIEW
)
6117 if (!uj
&& count
== 1)
6118 vty_out (vty
, "%s%s", header
, VTY_NEWLINE
);
6120 peers_cfg
= peers_estb
= 0;
6122 json_vrf
= json_object_new_object();
6125 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
6127 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
6130 if (peer
->status
== Established
)
6134 if (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
6145 vrf_id_ui
= (bgp
->vrf_id
== VRF_UNKNOWN
) ? -1 : bgp
->vrf_id
;
6148 json_object_string_add(json_vrf
, "type", type
);
6149 json_object_int_add(json_vrf
, "vrfId", vrf_id_ui
);
6150 json_object_string_add(json_vrf
, "routerId", inet_ntoa (bgp
->router_id
));
6151 json_object_int_add(json_vrf
, "numConfiguredPeers", peers_cfg
);
6152 json_object_int_add(json_vrf
, "numEstablishedPeers", peers_estb
);
6154 json_object_object_add(json_vrfs
, name
, json_vrf
);
6157 vty_out (vty
, "%4s %-5d %-16s %9u %10u %s%s",
6158 type
, vrf_id_ui
, inet_ntoa (bgp
->router_id
),
6159 peers_cfg
, peers_estb
, name
,
6165 json_object_object_add(json
, "vrfs", json_vrfs
);
6167 json_object_int_add(json
, "totalVrfs", count
);
6169 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
6170 json_object_free(json
);
6175 vty_out (vty
, "%sTotal number of VRFs (including default): %d%s",
6176 VTY_NEWLINE
, count
, VTY_NEWLINE
);
6182 DEFUN (show_bgp_memory
,
6183 show_bgp_memory_cmd
,
6184 "show [ip] bgp memory",
6188 "Global BGP memory statistics\n")
6190 char memstrbuf
[MTYPE_MEMSTR_LEN
];
6191 unsigned long count
;
6193 /* RIB related usage stats */
6194 count
= mtype_stats_alloc (MTYPE_BGP_NODE
);
6195 vty_out (vty
, "%ld RIB nodes, using %s of memory%s", count
,
6196 mtype_memstr (memstrbuf
, sizeof (memstrbuf
),
6197 count
* sizeof (struct bgp_node
)),
6200 count
= mtype_stats_alloc (MTYPE_BGP_ROUTE
);
6201 vty_out (vty
, "%ld BGP routes, using %s of memory%s", count
,
6202 mtype_memstr (memstrbuf
, sizeof (memstrbuf
),
6203 count
* sizeof (struct bgp_info
)),
6205 if ((count
= mtype_stats_alloc (MTYPE_BGP_ROUTE_EXTRA
)))
6206 vty_out (vty
, "%ld BGP route ancillaries, using %s of memory%s", count
,
6207 mtype_memstr (memstrbuf
, sizeof (memstrbuf
),
6208 count
* sizeof (struct bgp_info_extra
)),
6211 if ((count
= mtype_stats_alloc (MTYPE_BGP_STATIC
)))
6212 vty_out (vty
, "%ld Static routes, using %s of memory%s", count
,
6213 mtype_memstr (memstrbuf
, sizeof (memstrbuf
),
6214 count
* sizeof (struct bgp_static
)),
6217 if ((count
= mtype_stats_alloc (MTYPE_BGP_PACKET
)))
6218 vty_out (vty
, "%ld Packets, using %s of memory%s", count
,
6219 mtype_memstr (memstrbuf
, sizeof (memstrbuf
),
6220 count
* sizeof (struct bpacket
)),
6224 if ((count
= mtype_stats_alloc (MTYPE_BGP_ADJ_IN
)))
6225 vty_out (vty
, "%ld Adj-In entries, using %s of memory%s", count
,
6226 mtype_memstr (memstrbuf
, sizeof (memstrbuf
),
6227 count
* sizeof (struct bgp_adj_in
)),
6229 if ((count
= mtype_stats_alloc (MTYPE_BGP_ADJ_OUT
)))
6230 vty_out (vty
, "%ld Adj-Out entries, using %s of memory%s", count
,
6231 mtype_memstr (memstrbuf
, sizeof (memstrbuf
),
6232 count
* sizeof (struct bgp_adj_out
)),
6235 if ((count
= mtype_stats_alloc (MTYPE_BGP_NEXTHOP_CACHE
)))
6236 vty_out (vty
, "%ld Nexthop cache entries, using %s of memory%s", count
,
6237 mtype_memstr (memstrbuf
, sizeof (memstrbuf
),
6238 count
* sizeof (struct bgp_nexthop_cache
)),
6241 if ((count
= mtype_stats_alloc (MTYPE_BGP_DAMP_INFO
)))
6242 vty_out (vty
, "%ld Dampening entries, using %s of memory%s", count
,
6243 mtype_memstr (memstrbuf
, sizeof (memstrbuf
),
6244 count
* sizeof (struct bgp_damp_info
)),
6248 count
= attr_count();
6249 vty_out (vty
, "%ld BGP attributes, using %s of memory%s", count
,
6250 mtype_memstr (memstrbuf
, sizeof (memstrbuf
),
6251 count
* sizeof(struct attr
)),
6253 if ((count
= mtype_stats_alloc (MTYPE_ATTR_EXTRA
)))
6254 vty_out (vty
, "%ld BGP extra attributes, using %s of memory%s", count
,
6255 mtype_memstr (memstrbuf
, sizeof (memstrbuf
),
6256 count
* sizeof(struct attr_extra
)),
6259 if ((count
= attr_unknown_count()))
6260 vty_out (vty
, "%ld unknown attributes%s", count
, VTY_NEWLINE
);
6262 /* AS_PATH attributes */
6263 count
= aspath_count ();
6264 vty_out (vty
, "%ld BGP AS-PATH entries, using %s of memory%s", count
,
6265 mtype_memstr (memstrbuf
, sizeof (memstrbuf
),
6266 count
* sizeof (struct aspath
)),
6269 count
= mtype_stats_alloc (MTYPE_AS_SEG
);
6270 vty_out (vty
, "%ld BGP AS-PATH segments, using %s of memory%s", count
,
6271 mtype_memstr (memstrbuf
, sizeof (memstrbuf
),
6272 count
* sizeof (struct assegment
)),
6275 /* Other attributes */
6276 if ((count
= community_count ()))
6277 vty_out (vty
, "%ld BGP community entries, using %s of memory%s", count
,
6278 mtype_memstr (memstrbuf
, sizeof (memstrbuf
),
6279 count
* sizeof (struct community
)),
6281 if ((count
= mtype_stats_alloc (MTYPE_ECOMMUNITY
)))
6282 vty_out (vty
, "%ld BGP community entries, using %s of memory%s", count
,
6283 mtype_memstr (memstrbuf
, sizeof (memstrbuf
),
6284 count
* sizeof (struct ecommunity
)),
6286 if ((count
= mtype_stats_alloc (MTYPE_LCOMMUNITY
)))
6287 vty_out (vty
, "%ld BGP large-community entries, using %s of memory%s",
6289 mtype_memstr (memstrbuf
, sizeof (memstrbuf
),
6290 count
* sizeof (struct lcommunity
)),
6293 if ((count
= mtype_stats_alloc (MTYPE_CLUSTER
)))
6294 vty_out (vty
, "%ld Cluster lists, using %s of memory%s", count
,
6295 mtype_memstr (memstrbuf
, sizeof (memstrbuf
),
6296 count
* sizeof (struct cluster_list
)),
6299 /* Peer related usage */
6300 count
= mtype_stats_alloc (MTYPE_BGP_PEER
);
6301 vty_out (vty
, "%ld peers, using %s of memory%s", count
,
6302 mtype_memstr (memstrbuf
, sizeof (memstrbuf
),
6303 count
* sizeof (struct peer
)),
6306 if ((count
= mtype_stats_alloc (MTYPE_PEER_GROUP
)))
6307 vty_out (vty
, "%ld peer groups, using %s of memory%s", count
,
6308 mtype_memstr (memstrbuf
, sizeof (memstrbuf
),
6309 count
* sizeof (struct peer_group
)),
6313 if ((count
= mtype_stats_alloc (MTYPE_HASH
)))
6314 vty_out (vty
, "%ld hash tables, using %s of memory%s", count
,
6315 mtype_memstr (memstrbuf
, sizeof (memstrbuf
),
6316 count
* sizeof (struct hash
)),
6318 if ((count
= mtype_stats_alloc (MTYPE_HASH_BACKET
)))
6319 vty_out (vty
, "%ld hash buckets, using %s of memory%s", count
,
6320 mtype_memstr (memstrbuf
, sizeof (memstrbuf
),
6321 count
* sizeof (struct hash_backet
)),
6323 if ((count
= mtype_stats_alloc (MTYPE_BGP_REGEXP
)))
6324 vty_out (vty
, "%ld compiled regexes, using %s of memory%s", count
,
6325 mtype_memstr (memstrbuf
, sizeof (memstrbuf
),
6326 count
* sizeof (regex_t
)),
6331 /* Show BGP peer's summary information. */
6333 bgp_show_summary (struct vty
*vty
, struct bgp
*bgp
, int afi
, int safi
,
6334 u_char use_json
, json_object
*json
)
6337 struct listnode
*node
, *nnode
;
6338 unsigned int count
= 0, dn_count
= 0;
6339 char timebuf
[BGP_UPTIME_LEN
], dn_flag
[2];
6340 char neighbor_buf
[VTY_BUFSIZ
];
6341 int neighbor_col_default_width
= 16;
6343 int max_neighbor_width
= 0;
6344 json_object
*json_peer
= NULL
;
6345 json_object
*json_peers
= NULL
;
6350 json
= json_object_new_object();
6352 json_peers
= json_object_new_object();
6356 /* Loop over all neighbors that will be displayed to determine how many
6357 * characters are needed for the Neighbor column
6359 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
6361 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
6364 if (peer
->afc
[afi
][safi
])
6366 memset(dn_flag
, '\0', sizeof(dn_flag
));
6367 if (peer_dynamic_neighbor(peer
))
6370 if (peer
->hostname
&& bgp_flag_check(bgp
, BGP_FLAG_SHOW_HOSTNAME
))
6371 sprintf(neighbor_buf
, "%s%s(%s) ", dn_flag
, peer
->hostname
, peer
->host
);
6373 sprintf(neighbor_buf
, "%s%s ", dn_flag
, peer
->host
);
6375 len
= strlen(neighbor_buf
);
6377 if (len
> max_neighbor_width
)
6378 max_neighbor_width
= len
;
6382 /* Originally we displayed the Neighbor column as 16
6383 * characters wide so make that the default
6385 if (max_neighbor_width
< neighbor_col_default_width
)
6386 max_neighbor_width
= neighbor_col_default_width
;
6389 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
6391 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
6394 if (peer
->afc
[afi
][safi
])
6399 char memstrbuf
[MTYPE_MEMSTR_LEN
];
6402 vrf_id_ui
= (bgp
->vrf_id
== VRF_UNKNOWN
) ? -1 : bgp
->vrf_id
;
6404 /* Usage summary and header */
6407 json_object_string_add(json
, "routerId", inet_ntoa (bgp
->router_id
));
6408 json_object_int_add(json
, "as", bgp
->as
);
6409 json_object_int_add(json
, "vrfId", vrf_id_ui
);
6410 json_object_string_add(json
, "vrfName",
6411 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
6412 ? "Default" : bgp
->name
);
6417 "BGP router identifier %s, local AS number %u vrf-id %d",
6418 inet_ntoa (bgp
->router_id
), bgp
->as
, vrf_id_ui
);
6419 vty_out (vty
, "%s", VTY_NEWLINE
);
6422 if (bgp_update_delay_configured(bgp
))
6426 json_object_int_add(json
, "updateDelayLimit", bgp
->v_update_delay
);
6428 if (bgp
->v_update_delay
!= bgp
->v_establish_wait
)
6429 json_object_int_add(json
, "updateDelayEstablishWait", bgp
->v_establish_wait
);
6431 if (bgp_update_delay_active(bgp
))
6433 json_object_string_add(json
, "updateDelayFirstNeighbor", bgp
->update_delay_begin_time
);
6434 json_object_boolean_true_add(json
, "updateDelayInProgress");
6438 if (bgp
->update_delay_over
)
6440 json_object_string_add(json
, "updateDelayFirstNeighbor",
6441 bgp
->update_delay_begin_time
);
6442 json_object_string_add(json
, "updateDelayBestpathResumed",
6443 bgp
->update_delay_end_time
);
6444 json_object_string_add(json
, "updateDelayZebraUpdateResume",
6445 bgp
->update_delay_zebra_resume_time
);
6446 json_object_string_add(json
, "updateDelayPeerUpdateResume",
6447 bgp
->update_delay_peers_resume_time
);
6453 vty_out (vty
, "Read-only mode update-delay limit: %d seconds%s",
6454 bgp
->v_update_delay
, VTY_NEWLINE
);
6455 if (bgp
->v_update_delay
!= bgp
->v_establish_wait
)
6456 vty_out (vty
, " Establish wait: %d seconds%s",
6457 bgp
->v_establish_wait
, VTY_NEWLINE
);
6459 if (bgp_update_delay_active(bgp
))
6461 vty_out (vty
, " First neighbor established: %s%s",
6462 bgp
->update_delay_begin_time
, VTY_NEWLINE
);
6463 vty_out (vty
, " Delay in progress%s", VTY_NEWLINE
);
6467 if (bgp
->update_delay_over
)
6469 vty_out (vty
, " First neighbor established: %s%s",
6470 bgp
->update_delay_begin_time
, VTY_NEWLINE
);
6471 vty_out (vty
, " Best-paths resumed: %s%s",
6472 bgp
->update_delay_end_time
, VTY_NEWLINE
);
6473 vty_out (vty
, " zebra update resumed: %s%s",
6474 bgp
->update_delay_zebra_resume_time
, VTY_NEWLINE
);
6475 vty_out (vty
, " peers update resumed: %s%s",
6476 bgp
->update_delay_peers_resume_time
, VTY_NEWLINE
);
6484 if (bgp_maxmed_onstartup_configured(bgp
) && bgp
->maxmed_active
)
6485 json_object_boolean_true_add(json
, "maxMedOnStartup");
6486 if (bgp
->v_maxmed_admin
)
6487 json_object_boolean_true_add(json
, "maxMedAdministrative");
6489 json_object_int_add(json
, "tableVersion", bgp_table_version(bgp
->rib
[afi
][safi
]));
6491 ents
= bgp_table_count (bgp
->rib
[afi
][safi
]);
6492 json_object_int_add(json
, "ribCount", ents
);
6493 json_object_int_add(json
, "ribMemory", ents
* sizeof (struct bgp_node
));
6495 ents
= listcount (bgp
->peer
);
6496 json_object_int_add(json
, "peerCount", ents
);
6497 json_object_int_add(json
, "peerMemory", ents
* sizeof (struct peer
));
6499 if ((ents
= listcount (bgp
->group
)))
6501 json_object_int_add(json
, "peerGroupCount", ents
);
6502 json_object_int_add(json
, "peerGroupMemory", ents
* sizeof (struct peer_group
));
6505 if (CHECK_FLAG (bgp
->af_flags
[afi
][safi
], BGP_CONFIG_DAMPENING
))
6506 json_object_boolean_true_add(json
, "dampeningEnabled");
6510 if (bgp_maxmed_onstartup_configured(bgp
) && bgp
->maxmed_active
)
6511 vty_out (vty
, "Max-med on-startup active%s", VTY_NEWLINE
);
6512 if (bgp
->v_maxmed_admin
)
6513 vty_out (vty
, "Max-med administrative active%s", VTY_NEWLINE
);
6515 vty_out(vty
, "BGP table version %" PRIu64
"%s",
6516 bgp_table_version(bgp
->rib
[afi
][safi
]), VTY_NEWLINE
);
6518 ents
= bgp_table_count (bgp
->rib
[afi
][safi
]);
6519 vty_out (vty
, "RIB entries %ld, using %s of memory%s", ents
,
6520 mtype_memstr (memstrbuf
, sizeof (memstrbuf
),
6521 ents
* sizeof (struct bgp_node
)),
6524 /* Peer related usage */
6525 ents
= listcount (bgp
->peer
);
6526 vty_out (vty
, "Peers %ld, using %s of memory%s",
6528 mtype_memstr (memstrbuf
, sizeof (memstrbuf
),
6529 ents
* sizeof (struct peer
)),
6532 if ((ents
= listcount (bgp
->group
)))
6533 vty_out (vty
, "Peer groups %ld, using %s of memory%s", ents
,
6534 mtype_memstr (memstrbuf
, sizeof (memstrbuf
),
6535 ents
* sizeof (struct peer_group
)),
6538 if (CHECK_FLAG (bgp
->af_flags
[afi
][safi
], BGP_CONFIG_DAMPENING
))
6539 vty_out (vty
, "Dampening enabled.%s", VTY_NEWLINE
);
6540 vty_out (vty
, "%s", VTY_NEWLINE
);
6542 /* Subtract 8 here because 'Neighbor' is 8 characters */
6543 vty_out (vty
, "Neighbor");
6544 vty_out (vty
, "%*s", max_neighbor_width
- 8, " ");
6545 vty_out (vty
, "V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd%s", VTY_NEWLINE
);
6553 json_peer
= json_object_new_object();
6555 if (peer_dynamic_neighbor(peer
))
6556 json_object_boolean_true_add(json_peer
, "dynamicPeer");
6559 json_object_string_add(json_peer
, "hostname", peer
->hostname
);
6561 if (peer
->domainname
)
6562 json_object_string_add(json_peer
, "domainname", peer
->domainname
);
6564 json_object_int_add(json_peer
, "remoteAs", peer
->as
);
6565 json_object_int_add(json_peer
, "version", 4);
6566 json_object_int_add(json_peer
, "msgRcvd",
6567 peer
->open_in
+ peer
->update_in
+ peer
->keepalive_in
6568 + peer
->notify_in
+ peer
->refresh_in
6569 + peer
->dynamic_cap_in
);
6570 json_object_int_add(json_peer
, "msgSent",
6571 peer
->open_out
+ peer
->update_out
+ peer
->keepalive_out
6572 + peer
->notify_out
+ peer
->refresh_out
6573 + peer
->dynamic_cap_out
);
6575 json_object_int_add(json_peer
, "tableVersion", peer
->version
[afi
][safi
]);
6576 json_object_int_add(json_peer
, "outq", peer
->obuf
->count
);
6577 json_object_int_add(json_peer
, "inq", 0);
6578 peer_uptime (peer
->uptime
, timebuf
, BGP_UPTIME_LEN
, use_json
, json_peer
);
6579 json_object_int_add(json_peer
, "prefixReceivedCount", peer
->pcount
[afi
][safi
]);
6581 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_SHUTDOWN
))
6582 json_object_string_add(json_peer
, "state", "Idle (Admin)");
6583 else if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
))
6584 json_object_string_add(json_peer
, "state", "Idle (PfxCt)");
6586 json_object_string_add(json_peer
, "state", LOOKUP(bgp_status_msg
, peer
->status
));
6589 json_object_string_add(json_peer
, "idType", "interface");
6590 else if (peer
->su
.sa
.sa_family
== AF_INET
)
6591 json_object_string_add(json_peer
, "idType", "ipv4");
6592 else if (peer
->su
.sa
.sa_family
== AF_INET6
)
6593 json_object_string_add(json_peer
, "idType", "ipv6");
6595 json_object_object_add(json_peers
, peer
->host
, json_peer
);
6599 memset(dn_flag
, '\0', sizeof(dn_flag
));
6600 if (peer_dynamic_neighbor(peer
))
6606 if (peer
->hostname
&& bgp_flag_check(bgp
, BGP_FLAG_SHOW_HOSTNAME
))
6607 len
= vty_out (vty
, "%s%s(%s)", dn_flag
, peer
->hostname
,
6610 len
= vty_out (vty
, "%s%s", dn_flag
, peer
->host
);
6612 /* pad the neighbor column with spaces */
6613 if (len
< max_neighbor_width
)
6614 vty_out (vty
, "%*s", max_neighbor_width
- len
, " ");
6616 vty_out (vty
, "4 %10u %7d %7d %8" PRIu64
" %4d %4zd %8s",
6618 peer
->open_in
+ peer
->update_in
+ peer
->keepalive_in
6619 + peer
->notify_in
+ peer
->refresh_in
6620 + peer
->dynamic_cap_in
,
6621 peer
->open_out
+ peer
->update_out
+ peer
->keepalive_out
6622 + peer
->notify_out
+ peer
->refresh_out
6623 + peer
->dynamic_cap_out
,
6624 peer
->version
[afi
][safi
],
6627 peer_uptime (peer
->uptime
, timebuf
, BGP_UPTIME_LEN
, 0, NULL
));
6629 if (peer
->status
== Established
)
6630 vty_out (vty
, " %12ld", peer
->pcount
[afi
][safi
]);
6633 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_SHUTDOWN
))
6634 vty_out (vty
, " Idle (Admin)");
6635 else if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
))
6636 vty_out (vty
, " Idle (PfxCt)");
6638 vty_out (vty
, " %12s", LOOKUP(bgp_status_msg
, peer
->status
));
6640 vty_out (vty
, "%s", VTY_NEWLINE
);
6647 json_object_object_add(json
, "peers", json_peers
);
6649 json_object_int_add(json
, "totalPeers", count
);
6650 json_object_int_add(json
, "dynamicPeers", dn_count
);
6652 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
6653 json_object_free(json
);
6658 vty_out (vty
, "%sTotal number of neighbors %d%s", VTY_NEWLINE
,
6659 count
, VTY_NEWLINE
);
6663 vty_out(vty
, "{\"error\": {\"message\": \"No %s neighbor configured\"}}%s",
6664 afi_safi_print(afi
, safi
), VTY_NEWLINE
);
6666 vty_out (vty
, "No %s neighbor is configured%s",
6667 afi_safi_print(afi
, safi
), VTY_NEWLINE
);
6670 if (dn_count
&& ! use_json
)
6672 vty_out(vty
, "* - dynamic neighbor%s", VTY_NEWLINE
);
6674 "%d dynamic neighbor(s), limit %d%s",
6675 dn_count
, bgp
->dynamic_neighbors_limit
, VTY_NEWLINE
);
6683 * Return if we have a peer configured to use this afi/safi
6686 bgp_show_summary_afi_safi_peer_exists (struct bgp
*bgp
, int afi
, int safi
)
6688 struct listnode
*node
;
6691 for (ALL_LIST_ELEMENTS_RO (bgp
->peer
, node
, peer
))
6693 if (!CHECK_FLAG (peer
->flags
, PEER_FLAG_CONFIG_NODE
))
6696 if (peer
->afc
[afi
][safi
])
6704 bgp_show_summary_afi_safi (struct vty
*vty
, struct bgp
*bgp
, int afi
, int safi
,
6705 u_char use_json
, json_object
*json
)
6708 int afi_wildcard
= (afi
== AFI_MAX
);
6709 int safi_wildcard
= (safi
== SAFI_MAX
);
6710 int is_wildcard
= (afi_wildcard
|| safi_wildcard
);
6712 if (use_json
&& is_wildcard
)
6713 vty_out (vty
, "{%s", VTY_NEWLINE
);
6715 afi
= 1; /* AFI_IP */
6716 while (afi
< AFI_MAX
)
6719 safi
= 1; /* SAFI_UNICAST */
6720 while (safi
< SAFI_MAX
)
6722 if (bgp_show_summary_afi_safi_peer_exists (bgp
, afi
, safi
))
6727 * So limit output to those afi/safi pairs that
6728 * actualy have something interesting in them
6732 json
= json_object_new_object();
6735 vty_out (vty
, ",%s", VTY_NEWLINE
);
6739 vty_out(vty
, "\"%s\":", afi_safi_json(afi
, safi
));
6743 vty_out (vty
, "%s%s Summary:%s",
6744 VTY_NEWLINE
, afi_safi_print(afi
, safi
), VTY_NEWLINE
);
6747 bgp_show_summary (vty
, bgp
, afi
, safi
, use_json
, json
);
6750 if (safi
== SAFI_RESERVED_4
||
6751 safi
== SAFI_RESERVED_5
) /* handle special cases to match zebra.h */
6753 if (! safi_wildcard
)
6757 if (! afi_wildcard
||
6758 afi
== AFI_L2VPN
) /* special case, not handled yet */
6762 if (use_json
&& is_wildcard
)
6763 vty_out (vty
, "}%s", VTY_NEWLINE
);
6768 bgp_show_all_instances_summary_vty (struct vty
*vty
, afi_t afi
, safi_t safi
,
6771 struct listnode
*node
, *nnode
;
6773 json_object
*json
= NULL
;
6777 vty_out (vty
, "{%s", VTY_NEWLINE
);
6779 for (ALL_LIST_ELEMENTS (bm
->bgp
, node
, nnode
, bgp
))
6783 json
= json_object_new_object();
6786 vty_out (vty
, ",%s", VTY_NEWLINE
);
6790 vty_out(vty
, "\"%s\":", (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
6791 ? "Default" : bgp
->name
);
6795 vty_out (vty
, "%sInstance %s:%s",
6797 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
6798 ? "Default" : bgp
->name
, VTY_NEWLINE
);
6800 bgp_show_summary_afi_safi (vty
, bgp
, afi
, safi
, use_json
, json
);
6804 vty_out (vty
, "}%s", VTY_NEWLINE
);
6809 bgp_show_summary_vty (struct vty
*vty
, const char *name
,
6810 afi_t afi
, safi_t safi
, u_char use_json
)
6816 if (strmatch(name
, "all"))
6818 bgp_show_all_instances_summary_vty (vty
, afi
, safi
, use_json
);
6823 bgp
= bgp_lookup_by_name (name
);
6828 vty_out (vty
, "{}%s", VTY_NEWLINE
);
6830 vty_out (vty
, "%% No such BGP instance exist%s", VTY_NEWLINE
);
6834 bgp_show_summary_afi_safi (vty
, bgp
, afi
, safi
, use_json
, NULL
);
6839 bgp
= bgp_get_default ();
6842 bgp_show_summary_afi_safi (vty
, bgp
, afi
, safi
, use_json
, NULL
);
6847 /* `show [ip] bgp summary' commands. */
6848 DEFUN (show_ip_bgp_summary
,
6849 show_ip_bgp_summary_cmd
,
6850 "show [ip] bgp [<view|vrf> WORD] ["BGP_AFI_CMD_STR
" ["BGP_SAFI_CMD_STR
"]] summary [json]",
6854 BGP_INSTANCE_HELP_STR
6857 "Summary of BGP neighbor status\n"
6861 afi_t afi
= AFI_MAX
;
6862 safi_t safi
= SAFI_MAX
;
6867 if (argv_find (argv
, argc
, "ip", &idx
))
6869 /* [<view|vrf> WORD] */
6870 if (argv_find (argv
, argc
, "view", &idx
) || argv_find (argv
, argc
, "vrf", &idx
))
6871 vrf
= argv
[++idx
]->arg
;
6872 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
6873 if (argv_find_and_parse_afi (argv
, argc
, &idx
, &afi
))
6875 argv_find_and_parse_safi (argv
, argc
, &idx
, &safi
);
6878 int uj
= use_json (argc
, argv
);
6880 return bgp_show_summary_vty (vty
, vrf
, afi
, safi
, uj
);
6884 afi_safi_print (afi_t afi
, safi_t safi
)
6886 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
6887 return "IPv4 Unicast";
6888 else if (afi
== AFI_IP
&& safi
== SAFI_MULTICAST
)
6889 return "IPv4 Multicast";
6890 else if (afi
== AFI_IP
&& safi
== SAFI_MPLS_VPN
)
6892 else if (afi
== AFI_IP
&& safi
== SAFI_ENCAP
)
6893 return "IPv4 Encap";
6894 else if (afi
== AFI_IP6
&& safi
== SAFI_UNICAST
)
6895 return "IPv6 Unicast";
6896 else if (afi
== AFI_IP6
&& safi
== SAFI_MULTICAST
)
6897 return "IPv6 Multicast";
6898 else if (afi
== AFI_IP6
&& safi
== SAFI_MPLS_VPN
)
6900 else if (afi
== AFI_IP6
&& safi
== SAFI_ENCAP
)
6901 return "IPv6 Encap";
6902 else if (afi
== AFI_L2VPN
&& safi
== SAFI_EVPN
)
6903 return "L2VPN EVPN";
6909 * Please note that we have intentionally camelCased
6910 * the return strings here. So if you want
6911 * to use this function, please ensure you
6912 * are doing this within json output
6915 afi_safi_json (afi_t afi
, safi_t safi
)
6917 if (afi
== AFI_IP
&& safi
== SAFI_UNICAST
)
6918 return "ipv4Unicast";
6919 else if (afi
== AFI_IP
&& safi
== SAFI_MULTICAST
)
6920 return "ipv4Multicast";
6921 else if (afi
== AFI_IP
&& safi
== SAFI_MPLS_VPN
)
6923 else if (afi
== AFI_IP
&& safi
== SAFI_ENCAP
)
6925 else if (afi
== AFI_IP6
&& safi
== SAFI_UNICAST
)
6926 return "ipv6Unicast";
6927 else if (afi
== AFI_IP6
&& safi
== SAFI_MULTICAST
)
6928 return "ipv6Multicast";
6929 else if (afi
== AFI_IP6
&& safi
== SAFI_MPLS_VPN
)
6931 else if (afi
== AFI_IP6
&& safi
== SAFI_ENCAP
)
6933 else if (afi
== AFI_L2VPN
&& safi
== SAFI_EVPN
)
6939 /* Show BGP peer's information. */
6947 bgp_show_peer_afi_orf_cap (struct vty
*vty
, struct peer
*p
, afi_t afi
, safi_t safi
,
6948 u_int16_t adv_smcap
, u_int16_t adv_rmcap
, u_int16_t rcv_smcap
,
6949 u_int16_t rcv_rmcap
, u_char use_json
, json_object
*json_pref
)
6952 if (CHECK_FLAG (p
->af_cap
[afi
][safi
], adv_smcap
)
6953 || CHECK_FLAG (p
->af_cap
[afi
][safi
], rcv_smcap
))
6957 if (CHECK_FLAG (p
->af_cap
[afi
][safi
], adv_smcap
) && CHECK_FLAG (p
->af_cap
[afi
][safi
], rcv_smcap
))
6958 json_object_string_add(json_pref
, "sendMode", "advertisedAndReceived");
6959 else if (CHECK_FLAG (p
->af_cap
[afi
][safi
], adv_smcap
))
6960 json_object_string_add(json_pref
, "sendMode", "advertised");
6961 else if (CHECK_FLAG (p
->af_cap
[afi
][safi
], rcv_smcap
))
6962 json_object_string_add(json_pref
, "sendMode", "received");
6966 vty_out (vty
, " Send-mode: ");
6967 if (CHECK_FLAG (p
->af_cap
[afi
][safi
], adv_smcap
))
6968 vty_out (vty
, "advertised");
6969 if (CHECK_FLAG (p
->af_cap
[afi
][safi
], rcv_smcap
))
6970 vty_out (vty
, "%sreceived",
6971 CHECK_FLAG (p
->af_cap
[afi
][safi
], adv_smcap
) ?
6973 vty_out (vty
, "%s", VTY_NEWLINE
);
6978 if (CHECK_FLAG (p
->af_cap
[afi
][safi
], adv_rmcap
)
6979 || CHECK_FLAG (p
->af_cap
[afi
][safi
], rcv_rmcap
))
6983 if (CHECK_FLAG (p
->af_cap
[afi
][safi
], adv_rmcap
) && CHECK_FLAG (p
->af_cap
[afi
][safi
], rcv_rmcap
))
6984 json_object_string_add(json_pref
, "recvMode", "advertisedAndReceived");
6985 else if (CHECK_FLAG (p
->af_cap
[afi
][safi
], adv_rmcap
))
6986 json_object_string_add(json_pref
, "recvMode", "advertised");
6987 else if (CHECK_FLAG (p
->af_cap
[afi
][safi
], rcv_rmcap
))
6988 json_object_string_add(json_pref
, "recvMode", "received");
6992 vty_out (vty
, " Receive-mode: ");
6993 if (CHECK_FLAG (p
->af_cap
[afi
][safi
], adv_rmcap
))
6994 vty_out (vty
, "advertised");
6995 if (CHECK_FLAG (p
->af_cap
[afi
][safi
], rcv_rmcap
))
6996 vty_out (vty
, "%sreceived",
6997 CHECK_FLAG (p
->af_cap
[afi
][safi
], adv_rmcap
) ?
6999 vty_out (vty
, "%s", VTY_NEWLINE
);
7005 bgp_show_peer_afi (struct vty
*vty
, struct peer
*p
, afi_t afi
, safi_t safi
,
7006 u_char use_json
, json_object
*json_neigh
)
7008 struct bgp_filter
*filter
;
7009 struct peer_af
*paf
;
7010 char orf_pfx_name
[BUFSIZ
];
7012 json_object
*json_af
= NULL
;
7013 json_object
*json_prefA
= NULL
;
7014 json_object
*json_prefB
= NULL
;
7015 json_object
*json_addr
= NULL
;
7019 json_addr
= json_object_new_object();
7020 json_af
= json_object_new_object();
7021 filter
= &p
->filter
[afi
][safi
];
7023 if (peer_group_active(p
))
7024 json_object_string_add(json_addr
, "peerGroupMember", p
->group
->name
);
7026 paf
= peer_af_find(p
, afi
, safi
);
7027 if (paf
&& PAF_SUBGRP(paf
))
7029 json_object_int_add(json_addr
, "updateGroupId", PAF_UPDGRP(paf
)->id
);
7030 json_object_int_add(json_addr
, "subGroupId", PAF_SUBGRP(paf
)->id
);
7031 json_object_int_add(json_addr
, "packetQueueLength", bpacket_queue_virtual_length(paf
));
7034 if (CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
7035 || CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_RCV
)
7036 || CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_ADV
)
7037 || CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_RCV
))
7039 json_object_int_add(json_af
, "orfType", ORF_TYPE_PREFIX
);
7040 json_prefA
= json_object_new_object();
7041 bgp_show_peer_afi_orf_cap (vty
, p
, afi
, safi
,
7042 PEER_CAP_ORF_PREFIX_SM_ADV
,
7043 PEER_CAP_ORF_PREFIX_RM_ADV
,
7044 PEER_CAP_ORF_PREFIX_SM_RCV
,
7045 PEER_CAP_ORF_PREFIX_RM_RCV
, use_json
, json_prefA
);
7046 json_object_object_add(json_af
, "orfPrefixList", json_prefA
);
7049 if (CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
7050 || CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
7051 || CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_ADV
)
7052 || CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_OLD_RCV
))
7054 json_object_int_add(json_af
, "orfOldType", ORF_TYPE_PREFIX_OLD
);
7055 json_prefB
= json_object_new_object();
7056 bgp_show_peer_afi_orf_cap (vty
, p
, afi
, safi
,
7057 PEER_CAP_ORF_PREFIX_SM_ADV
,
7058 PEER_CAP_ORF_PREFIX_RM_ADV
,
7059 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
,
7060 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
, use_json
, json_prefB
);
7061 json_object_object_add(json_af
, "orfOldPrefixList", json_prefB
);
7064 if (CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
7065 || CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_RCV
)
7066 || CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
7067 || CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_ADV
)
7068 || CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_RCV
)
7069 || CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_OLD_RCV
))
7070 json_object_object_add(json_addr
, "afDependentCap", json_af
);
7072 json_object_free(json_af
);
7074 sprintf (orf_pfx_name
, "%s.%d.%d", p
->host
, afi
, safi
);
7075 orf_pfx_count
= prefix_bgp_show_prefix_list (NULL
, afi
, orf_pfx_name
, use_json
);
7077 if (CHECK_FLAG (p
->af_sflags
[afi
][safi
], PEER_STATUS_ORF_PREFIX_SEND
)
7080 if (CHECK_FLAG (p
->af_sflags
[afi
][safi
], PEER_STATUS_ORF_PREFIX_SEND
))
7081 json_object_boolean_true_add(json_neigh
, "orfSent");
7083 json_object_int_add(json_addr
, "orfRecvCounter", orf_pfx_count
);
7085 if (CHECK_FLAG (p
->af_sflags
[afi
][safi
], PEER_STATUS_ORF_WAIT_REFRESH
))
7086 json_object_string_add(json_addr
, "orfFirstUpdate", "deferredUntilORFOrRouteRefreshRecvd");
7088 if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_REFLECTOR_CLIENT
))
7089 json_object_boolean_true_add(json_addr
, "routeReflectorClient");
7090 if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
))
7091 json_object_boolean_true_add(json_addr
, "routeServerClient");
7092 if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
7093 json_object_boolean_true_add(json_addr
, "inboundSoftConfigPermit");
7095 if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
))
7096 json_object_boolean_true_add(json_addr
, "privateAsNumsAllReplacedInUpdatesToNbr");
7097 else if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
))
7098 json_object_boolean_true_add(json_addr
, "privateAsNumsReplacedInUpdatesToNbr");
7099 else if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_REMOVE_PRIVATE_AS_ALL
))
7100 json_object_boolean_true_add(json_addr
, "privateAsNumsAllRemovedInUpdatesToNbr");
7101 else if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_REMOVE_PRIVATE_AS
))
7102 json_object_boolean_true_add(json_addr
, "privateAsNumsRemovedInUpdatesToNbr");
7104 if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_ADDPATH_TX_ALL_PATHS
))
7105 json_object_boolean_true_add(json_addr
, "addpathTxAllPaths");
7107 if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS
))
7108 json_object_boolean_true_add(json_addr
, "addpathTxBestpathPerAS");
7110 if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_AS_OVERRIDE
))
7111 json_object_string_add(json_addr
, "overrideASNsInOutboundUpdates", "ifAspathEqualRemoteAs");
7113 if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_SELF
) ||
7114 CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_FORCE_NEXTHOP_SELF
))
7115 json_object_boolean_true_add(json_addr
, "routerAlwaysNextHop");
7116 if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
))
7117 json_object_boolean_true_add(json_addr
, "unchangedAsPathPropogatedToNbr");
7118 if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
))
7119 json_object_boolean_true_add(json_addr
, "unchangedNextHopPropogatedToNbr");
7120 if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
7121 json_object_boolean_true_add(json_addr
, "unchangedMedPropogatedToNbr");
7122 if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
)
7123 || CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_SEND_EXT_COMMUNITY
))
7125 if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
)
7126 && CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_SEND_EXT_COMMUNITY
))
7127 json_object_string_add(json_addr
, "commAttriSentToNbr", "extendedAndStandard");
7128 else if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_SEND_EXT_COMMUNITY
))
7129 json_object_string_add(json_addr
, "commAttriSentToNbr", "extended");
7131 json_object_string_add(json_addr
, "commAttriSentToNbr", "standard");
7133 if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
))
7135 if (p
->default_rmap
[afi
][safi
].name
)
7136 json_object_string_add(json_addr
, "defaultRouteMap", p
->default_rmap
[afi
][safi
].name
);
7138 if (paf
&& PAF_SUBGRP(paf
) && CHECK_FLAG(PAF_SUBGRP(paf
)->sflags
, SUBGRP_STATUS_DEFAULT_ORIGINATE
))
7139 json_object_boolean_true_add(json_addr
, "defaultSent");
7141 json_object_boolean_true_add(json_addr
, "defaultNotSent");
7144 if (filter
->plist
[FILTER_IN
].name
7145 || filter
->dlist
[FILTER_IN
].name
7146 || filter
->aslist
[FILTER_IN
].name
7147 || filter
->map
[RMAP_IN
].name
)
7148 json_object_boolean_true_add(json_addr
, "inboundPathPolicyConfig");
7149 if (filter
->plist
[FILTER_OUT
].name
7150 || filter
->dlist
[FILTER_OUT
].name
7151 || filter
->aslist
[FILTER_OUT
].name
7152 || filter
->map
[RMAP_OUT
].name
7153 || filter
->usmap
.name
)
7154 json_object_boolean_true_add(json_addr
, "outboundPathPolicyConfig");
7157 if (filter
->plist
[FILTER_IN
].name
)
7158 json_object_string_add(json_addr
, "incomingUpdatePrefixFilterList", filter
->plist
[FILTER_IN
].name
);
7159 if (filter
->plist
[FILTER_OUT
].name
)
7160 json_object_string_add(json_addr
, "outgoingUpdatePrefixFilterList", filter
->plist
[FILTER_OUT
].name
);
7162 /* distribute-list */
7163 if (filter
->dlist
[FILTER_IN
].name
)
7164 json_object_string_add(json_addr
, "incomingUpdateNetworkFilterList", filter
->dlist
[FILTER_IN
].name
);
7165 if (filter
->dlist
[FILTER_OUT
].name
)
7166 json_object_string_add(json_addr
, "outgoingUpdateNetworkFilterList", filter
->dlist
[FILTER_OUT
].name
);
7169 if (filter
->aslist
[FILTER_IN
].name
)
7170 json_object_string_add(json_addr
, "incomingUpdateAsPathFilterList", filter
->aslist
[FILTER_IN
].name
);
7171 if (filter
->aslist
[FILTER_OUT
].name
)
7172 json_object_string_add(json_addr
, "outgoingUpdateAsPathFilterList", filter
->aslist
[FILTER_OUT
].name
);
7175 if (filter
->map
[RMAP_IN
].name
)
7176 json_object_string_add(json_addr
, "routeMapForIncomingAdvertisements", filter
->map
[RMAP_IN
].name
);
7177 if (filter
->map
[RMAP_OUT
].name
)
7178 json_object_string_add(json_addr
, "routeMapForOutgoingAdvertisements", filter
->map
[RMAP_OUT
].name
);
7180 /* unsuppress-map */
7181 if (filter
->usmap
.name
)
7182 json_object_string_add(json_addr
, "selectiveUnsuppressRouteMap", filter
->usmap
.name
);
7184 /* Receive prefix count */
7185 json_object_int_add(json_addr
, "acceptedPrefixCounter", p
->pcount
[afi
][safi
]);
7187 /* Maximum prefix */
7188 if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
))
7190 json_object_int_add(json_addr
, "prefixAllowedMax", p
->pmax
[afi
][safi
]);
7191 if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
))
7192 json_object_boolean_true_add(json_addr
, "prefixAllowedMaxWarning");
7193 json_object_int_add(json_addr
, "prefixAllowedWarningThresh", p
->pmax_threshold
[afi
][safi
]);
7194 if (p
->pmax_restart
[afi
][safi
])
7195 json_object_int_add(json_addr
, "prefixAllowedRestartIntervalMsecs", p
->pmax_restart
[afi
][safi
] * 60000);
7197 json_object_object_add(json_neigh
, afi_safi_print (afi
, safi
), json_addr
);
7202 filter
= &p
->filter
[afi
][safi
];
7204 vty_out (vty
, " For address family: %s%s", afi_safi_print (afi
, safi
),
7207 if (peer_group_active(p
))
7208 vty_out (vty
, " %s peer-group member%s", p
->group
->name
, VTY_NEWLINE
);
7210 paf
= peer_af_find(p
, afi
, safi
);
7211 if (paf
&& PAF_SUBGRP(paf
))
7213 vty_out (vty
, " Update group %" PRIu64
", subgroup %" PRIu64
"%s",
7214 PAF_UPDGRP(paf
)->id
, PAF_SUBGRP(paf
)->id
, VTY_NEWLINE
);
7215 vty_out (vty
, " Packet Queue length %d%s",
7216 bpacket_queue_virtual_length(paf
), VTY_NEWLINE
);
7220 vty_out(vty
, " Not part of any update group%s", VTY_NEWLINE
);
7222 if (CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
7223 || CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_RCV
)
7224 || CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
7225 || CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_ADV
)
7226 || CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_RCV
)
7227 || CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_OLD_RCV
))
7228 vty_out (vty
, " AF-dependant capabilities:%s", VTY_NEWLINE
);
7230 if (CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
7231 || CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_RCV
)
7232 || CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_ADV
)
7233 || CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_RCV
))
7235 vty_out (vty
, " Outbound Route Filter (ORF) type (%d) Prefix-list:%s",
7236 ORF_TYPE_PREFIX
, VTY_NEWLINE
);
7237 bgp_show_peer_afi_orf_cap (vty
, p
, afi
, safi
,
7238 PEER_CAP_ORF_PREFIX_SM_ADV
,
7239 PEER_CAP_ORF_PREFIX_RM_ADV
,
7240 PEER_CAP_ORF_PREFIX_SM_RCV
,
7241 PEER_CAP_ORF_PREFIX_RM_RCV
, use_json
, NULL
);
7243 if (CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_ADV
)
7244 || CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_SM_OLD_RCV
)
7245 || CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_ADV
)
7246 || CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ORF_PREFIX_RM_OLD_RCV
))
7248 vty_out (vty
, " Outbound Route Filter (ORF) type (%d) Prefix-list:%s",
7249 ORF_TYPE_PREFIX_OLD
, VTY_NEWLINE
);
7250 bgp_show_peer_afi_orf_cap (vty
, p
, afi
, safi
,
7251 PEER_CAP_ORF_PREFIX_SM_ADV
,
7252 PEER_CAP_ORF_PREFIX_RM_ADV
,
7253 PEER_CAP_ORF_PREFIX_SM_OLD_RCV
,
7254 PEER_CAP_ORF_PREFIX_RM_OLD_RCV
, use_json
, NULL
);
7257 sprintf (orf_pfx_name
, "%s.%d.%d", p
->host
, afi
, safi
);
7258 orf_pfx_count
= prefix_bgp_show_prefix_list (NULL
, afi
, orf_pfx_name
, use_json
);
7260 if (CHECK_FLAG (p
->af_sflags
[afi
][safi
], PEER_STATUS_ORF_PREFIX_SEND
)
7263 vty_out (vty
, " Outbound Route Filter (ORF):");
7264 if (CHECK_FLAG (p
->af_sflags
[afi
][safi
], PEER_STATUS_ORF_PREFIX_SEND
))
7265 vty_out (vty
, " sent;");
7267 vty_out (vty
, " received (%d entries)", orf_pfx_count
);
7268 vty_out (vty
, "%s", VTY_NEWLINE
);
7270 if (CHECK_FLAG (p
->af_sflags
[afi
][safi
], PEER_STATUS_ORF_WAIT_REFRESH
))
7271 vty_out (vty
, " First update is deferred until ORF or ROUTE-REFRESH is received%s", VTY_NEWLINE
);
7273 if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_REFLECTOR_CLIENT
))
7274 vty_out (vty
, " Route-Reflector Client%s", VTY_NEWLINE
);
7275 if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_RSERVER_CLIENT
))
7276 vty_out (vty
, " Route-Server Client%s", VTY_NEWLINE
);
7277 if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_SOFT_RECONFIG
))
7278 vty_out (vty
, " Inbound soft reconfiguration allowed%s", VTY_NEWLINE
);
7280 if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE
))
7281 vty_out (vty
, " Private AS numbers (all) replaced in updates to this neighbor%s", VTY_NEWLINE
);
7282 else if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE
))
7283 vty_out (vty
, " Private AS numbers replaced in updates to this neighbor%s", VTY_NEWLINE
);
7284 else if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_REMOVE_PRIVATE_AS_ALL
))
7285 vty_out (vty
, " Private AS numbers (all) removed in updates to this neighbor%s", VTY_NEWLINE
);
7286 else if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_REMOVE_PRIVATE_AS
))
7287 vty_out (vty
, " Private AS numbers removed in updates to this neighbor%s", VTY_NEWLINE
);
7289 if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_ADDPATH_TX_ALL_PATHS
))
7290 vty_out (vty
, " Advertise all paths via addpath%s", VTY_NEWLINE
);
7292 if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS
))
7293 vty_out (vty
, " Advertise bestpath per AS via addpath%s", VTY_NEWLINE
);
7295 if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_AS_OVERRIDE
))
7296 vty_out (vty
, " Override ASNs in outbound updates if aspath equals remote-as%s", VTY_NEWLINE
);
7298 if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_SELF
) ||
7299 CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_FORCE_NEXTHOP_SELF
))
7300 vty_out (vty
, " NEXT_HOP is always this router%s", VTY_NEWLINE
);
7301 if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_AS_PATH_UNCHANGED
))
7302 vty_out (vty
, " AS_PATH is propagated unchanged to this neighbor%s", VTY_NEWLINE
);
7303 if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_NEXTHOP_UNCHANGED
))
7304 vty_out (vty
, " NEXT_HOP is propagated unchanged to this neighbor%s", VTY_NEWLINE
);
7305 if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_MED_UNCHANGED
))
7306 vty_out (vty
, " MED is propagated unchanged to this neighbor%s", VTY_NEWLINE
);
7307 if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
)
7308 || CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_SEND_EXT_COMMUNITY
)
7309 || CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_SEND_LARGE_COMMUNITY
))
7311 vty_out (vty
, " Community attribute sent to this neighbor");
7312 if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_SEND_COMMUNITY
)
7313 && CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_SEND_EXT_COMMUNITY
)
7314 && CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_SEND_LARGE_COMMUNITY
))
7315 vty_out (vty
, "(all)%s", VTY_NEWLINE
);
7316 else if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_SEND_LARGE_COMMUNITY
))
7317 vty_out (vty
, "(large)%s", VTY_NEWLINE
);
7318 else if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_SEND_EXT_COMMUNITY
))
7319 vty_out (vty
, "(extended)%s", VTY_NEWLINE
);
7321 vty_out (vty
, "(standard)%s", VTY_NEWLINE
);
7323 if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_DEFAULT_ORIGINATE
))
7325 vty_out (vty
, " Default information originate,");
7327 if (p
->default_rmap
[afi
][safi
].name
)
7328 vty_out (vty
, " default route-map %s%s,",
7329 p
->default_rmap
[afi
][safi
].map
? "*" : "",
7330 p
->default_rmap
[afi
][safi
].name
);
7331 if (paf
&& PAF_SUBGRP(paf
) && CHECK_FLAG(PAF_SUBGRP(paf
)->sflags
, SUBGRP_STATUS_DEFAULT_ORIGINATE
))
7332 vty_out (vty
, " default sent%s", VTY_NEWLINE
);
7334 vty_out (vty
, " default not sent%s", VTY_NEWLINE
);
7337 if (filter
->plist
[FILTER_IN
].name
7338 || filter
->dlist
[FILTER_IN
].name
7339 || filter
->aslist
[FILTER_IN
].name
7340 || filter
->map
[RMAP_IN
].name
)
7341 vty_out (vty
, " Inbound path policy configured%s", VTY_NEWLINE
);
7342 if (filter
->plist
[FILTER_OUT
].name
7343 || filter
->dlist
[FILTER_OUT
].name
7344 || filter
->aslist
[FILTER_OUT
].name
7345 || filter
->map
[RMAP_OUT
].name
7346 || filter
->usmap
.name
)
7347 vty_out (vty
, " Outbound path policy configured%s", VTY_NEWLINE
);
7350 if (filter
->plist
[FILTER_IN
].name
)
7351 vty_out (vty
, " Incoming update prefix filter list is %s%s%s",
7352 filter
->plist
[FILTER_IN
].plist
? "*" : "",
7353 filter
->plist
[FILTER_IN
].name
,
7355 if (filter
->plist
[FILTER_OUT
].name
)
7356 vty_out (vty
, " Outgoing update prefix filter list is %s%s%s",
7357 filter
->plist
[FILTER_OUT
].plist
? "*" : "",
7358 filter
->plist
[FILTER_OUT
].name
,
7361 /* distribute-list */
7362 if (filter
->dlist
[FILTER_IN
].name
)
7363 vty_out (vty
, " Incoming update network filter list is %s%s%s",
7364 filter
->dlist
[FILTER_IN
].alist
? "*" : "",
7365 filter
->dlist
[FILTER_IN
].name
,
7367 if (filter
->dlist
[FILTER_OUT
].name
)
7368 vty_out (vty
, " Outgoing update network filter list is %s%s%s",
7369 filter
->dlist
[FILTER_OUT
].alist
? "*" : "",
7370 filter
->dlist
[FILTER_OUT
].name
,
7374 if (filter
->aslist
[FILTER_IN
].name
)
7375 vty_out (vty
, " Incoming update AS path filter list is %s%s%s",
7376 filter
->aslist
[FILTER_IN
].aslist
? "*" : "",
7377 filter
->aslist
[FILTER_IN
].name
,
7379 if (filter
->aslist
[FILTER_OUT
].name
)
7380 vty_out (vty
, " Outgoing update AS path filter list is %s%s%s",
7381 filter
->aslist
[FILTER_OUT
].aslist
? "*" : "",
7382 filter
->aslist
[FILTER_OUT
].name
,
7386 if (filter
->map
[RMAP_IN
].name
)
7387 vty_out (vty
, " Route map for incoming advertisements is %s%s%s",
7388 filter
->map
[RMAP_IN
].map
? "*" : "",
7389 filter
->map
[RMAP_IN
].name
,
7391 if (filter
->map
[RMAP_OUT
].name
)
7392 vty_out (vty
, " Route map for outgoing advertisements is %s%s%s",
7393 filter
->map
[RMAP_OUT
].map
? "*" : "",
7394 filter
->map
[RMAP_OUT
].name
,
7397 /* unsuppress-map */
7398 if (filter
->usmap
.name
)
7399 vty_out (vty
, " Route map for selective unsuppress is %s%s%s",
7400 filter
->usmap
.map
? "*" : "",
7401 filter
->usmap
.name
, VTY_NEWLINE
);
7403 /* Receive prefix count */
7404 vty_out (vty
, " %ld accepted prefixes%s", p
->pcount
[afi
][safi
], VTY_NEWLINE
);
7406 /* Maximum prefix */
7407 if (CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX
))
7409 vty_out (vty
, " Maximum prefixes allowed %ld%s%s", p
->pmax
[afi
][safi
],
7410 CHECK_FLAG (p
->af_flags
[afi
][safi
], PEER_FLAG_MAX_PREFIX_WARNING
)
7411 ? " (warning-only)" : "", VTY_NEWLINE
);
7412 vty_out (vty
, " Threshold for warning message %d%%",
7413 p
->pmax_threshold
[afi
][safi
]);
7414 if (p
->pmax_restart
[afi
][safi
])
7415 vty_out (vty
, ", restart interval %d min", p
->pmax_restart
[afi
][safi
]);
7416 vty_out (vty
, "%s", VTY_NEWLINE
);
7419 vty_out (vty
, "%s", VTY_NEWLINE
);
7424 bgp_show_peer (struct vty
*vty
, struct peer
*p
, u_char use_json
, json_object
*json
)
7427 char buf1
[PREFIX2STR_BUFFER
], buf
[SU_ADDRSTRLEN
];
7428 char timebuf
[BGP_UPTIME_LEN
];
7430 const char *subcode_str
;
7431 const char *code_str
;
7436 json_object
*json_neigh
= NULL
;
7441 json_neigh
= json_object_new_object();
7443 memset (dn_flag
, '\0', sizeof (dn_flag
));
7444 if (!p
->conf_if
&& peer_dynamic_neighbor (p
))
7449 if (p
->conf_if
) /* Configured interface name. */
7450 vty_out (vty
, "BGP neighbor on %s: %s, ", p
->conf_if
,
7451 BGP_PEER_SU_UNSPEC(p
) ? "None" :
7452 sockunion2str (&p
->su
, buf
, SU_ADDRSTRLEN
));
7453 else /* Configured IP address. */
7454 vty_out (vty
, "BGP neighbor is %s%s, ", dn_flag
, p
->host
);
7459 if (p
->conf_if
&& BGP_PEER_SU_UNSPEC(p
))
7460 json_object_string_add(json_neigh
, "bgpNeighborAddr", "none");
7461 else if (p
->conf_if
&& !BGP_PEER_SU_UNSPEC(p
))
7462 json_object_string_add(json_neigh
, "bgpNeighborAddr", sockunion2str (&p
->su
, buf
, SU_ADDRSTRLEN
));
7464 json_object_int_add(json_neigh
, "remoteAs", p
->as
);
7466 if (p
->change_local_as
)
7467 json_object_int_add(json_neigh
, "localAs", p
->change_local_as
);
7469 json_object_int_add(json_neigh
, "localAs", p
->local_as
);
7471 if (CHECK_FLAG (p
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
))
7472 json_object_boolean_true_add(json_neigh
, "localAsNoPrepend");
7474 if (CHECK_FLAG (p
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
))
7475 json_object_boolean_true_add(json_neigh
, "localAsReplaceAs");
7479 if ((p
->as_type
== AS_SPECIFIED
) ||
7480 (p
->as_type
== AS_EXTERNAL
) ||
7481 (p
->as_type
== AS_INTERNAL
))
7482 vty_out (vty
, "remote AS %u, ", p
->as
);
7484 vty_out (vty
, "remote AS Unspecified, ");
7485 vty_out (vty
, "local AS %u%s%s, ",
7486 p
->change_local_as
? p
->change_local_as
: p
->local_as
,
7487 CHECK_FLAG (p
->flags
, PEER_FLAG_LOCAL_AS_NO_PREPEND
) ?
7489 CHECK_FLAG (p
->flags
, PEER_FLAG_LOCAL_AS_REPLACE_AS
) ?
7490 " replace-as" : "");
7492 /* peer type internal, external, confed-internal or confed-external */
7493 if (p
->as
== p
->local_as
)
7497 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
))
7498 json_object_boolean_true_add(json_neigh
, "nbrConfedInternalLink");
7500 json_object_boolean_true_add(json_neigh
, "nbrInternalLink");
7504 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
))
7505 vty_out (vty
, "confed-internal link%s", VTY_NEWLINE
);
7507 vty_out (vty
, "internal link%s", VTY_NEWLINE
);
7514 if (CHECK_FLAG(bgp
->config
, BGP_CONFIG_CONFEDERATION
))
7515 json_object_boolean_true_add(json_neigh
, "nbrConfedExternalLink");
7517 json_object_boolean_true_add(json_neigh
, "nbrExternalLink");
7521 if (bgp_confederation_peers_check(bgp
, p
->as
))
7522 vty_out (vty
, "confed-external link%s", VTY_NEWLINE
);
7524 vty_out (vty
, "external link%s", VTY_NEWLINE
);
7532 json_object_string_add(json_neigh
, "nbrDesc", p
->desc
);
7534 vty_out (vty
, " Description: %s%s", p
->desc
, VTY_NEWLINE
);
7542 json_object_string_add(json_neigh
, "hostname", p
->hostname
);
7545 json_object_string_add(json_neigh
, "domainname", p
->domainname
);
7549 if (p
->domainname
&& (p
->domainname
[0] != '\0'))
7550 vty_out(vty
, "Hostname: %s.%s%s", p
->hostname
, p
->domainname
,
7553 vty_out(vty
, "Hostname: %s%s", p
->hostname
, VTY_NEWLINE
);
7563 json_object_string_add(json_neigh
, "peerGroup", p
->group
->name
);
7567 struct prefix prefix
, *range
= NULL
;
7569 sockunion2hostprefix(&(p
->su
), &prefix
);
7570 range
= peer_group_lookup_dynamic_neighbor_range (p
->group
, &prefix
);
7574 prefix2str(range
, buf1
, sizeof(buf1
));
7575 json_object_string_add(json_neigh
, "peerSubnetRangeGroup", buf1
);
7581 vty_out (vty
, " Member of peer-group %s for session parameters%s",
7582 p
->group
->name
, VTY_NEWLINE
);
7586 struct prefix prefix
, *range
= NULL
;
7588 sockunion2hostprefix(&(p
->su
), &prefix
);
7589 range
= peer_group_lookup_dynamic_neighbor_range (p
->group
, &prefix
);
7593 prefix2str(range
, buf1
, sizeof(buf1
));
7594 vty_out (vty
, " Belongs to the subnet range group: %s%s", buf1
, VTY_NEWLINE
);
7602 /* Administrative shutdown. */
7603 if (CHECK_FLAG (p
->flags
, PEER_FLAG_SHUTDOWN
))
7604 json_object_boolean_true_add(json_neigh
, "adminShutDown");
7607 json_object_int_add(json_neigh
, "bgpVersion", 4);
7608 json_object_string_add(json_neigh
, "remoteRouterId",
7609 inet_ntop (AF_INET
, &p
->remote_id
, buf1
, sizeof(buf1
)));
7612 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_CONFEDERATION
) && bgp_confederation_peers_check (bgp
, p
->as
))
7613 json_object_boolean_true_add(json_neigh
, "nbrCommonAdmin");
7616 json_object_string_add(json_neigh
, "bgpState", LOOKUP (bgp_status_msg
, p
->status
));
7618 if (p
->status
== Established
)
7623 uptime
= bgp_clock();
7624 uptime
-= p
->uptime
;
7625 tm
= gmtime(&uptime
);
7627 json_object_int_add(json_neigh
, "bgpTimerUp", (tm
->tm_sec
* 1000) + (tm
->tm_min
* 60000) + (tm
->tm_hour
* 3600000));
7630 else if (p
->status
== Active
)
7632 if (CHECK_FLAG (p
->flags
, PEER_FLAG_PASSIVE
))
7633 json_object_string_add(json_neigh
, "bgpStateIs", "passive");
7634 else if (CHECK_FLAG (p
->sflags
, PEER_STATUS_NSF_WAIT
))
7635 json_object_string_add(json_neigh
, "bgpStateIs", "passiveNSF");
7642 uptime
= bgp_clock();
7643 uptime
-= p
->readtime
;
7644 tm
= gmtime(&uptime
);
7645 json_object_int_add(json_neigh
, "bgpTimerLastRead", (tm
->tm_sec
* 1000) + (tm
->tm_min
* 60000) + (tm
->tm_hour
* 3600000));
7647 uptime
= bgp_clock();
7648 uptime
-= p
->last_write
;
7649 tm
= gmtime(&uptime
);
7650 json_object_int_add(json_neigh
, "bgpTimerLastWrite", (tm
->tm_sec
* 1000) + (tm
->tm_min
* 60000) + (tm
->tm_hour
* 3600000));
7652 uptime
= bgp_clock();
7653 uptime
-= p
->update_time
;
7654 tm
= gmtime(&uptime
);
7655 json_object_int_add(json_neigh
, "bgpInUpdateElapsedTimeMsecs",
7656 (tm
->tm_sec
* 1000) + (tm
->tm_min
* 60000) + (tm
->tm_hour
* 3600000));
7658 /* Configured timer values. */
7659 json_object_int_add(json_neigh
, "bgpTimerHoldTimeMsecs", p
->v_holdtime
* 1000);
7660 json_object_int_add(json_neigh
, "bgpTimerKeepAliveIntervalMsecs", p
->v_keepalive
* 1000);
7662 if (CHECK_FLAG (p
->config
, PEER_CONFIG_TIMER
))
7664 json_object_int_add(json_neigh
, "bgpTimerConfiguredHoldTimeMsecs", p
->holdtime
* 1000);
7665 json_object_int_add(json_neigh
, "bgpTimerConfiguredKeepAliveIntervalMsecs", p
->keepalive
* 1000);
7670 /* Administrative shutdown. */
7671 if (CHECK_FLAG (p
->flags
, PEER_FLAG_SHUTDOWN
))
7672 vty_out (vty
, " Administratively shut down%s", VTY_NEWLINE
);
7675 vty_out (vty
, " BGP version 4");
7676 vty_out (vty
, ", remote router ID %s%s",
7677 inet_ntop (AF_INET
, &p
->remote_id
, buf1
, sizeof(buf1
)),
7681 if (CHECK_FLAG (bgp
->config
, BGP_CONFIG_CONFEDERATION
)
7682 && bgp_confederation_peers_check (bgp
, p
->as
))
7683 vty_out (vty
, " Neighbor under common administration%s", VTY_NEWLINE
);
7686 vty_out (vty
, " BGP state = %s", LOOKUP (bgp_status_msg
, p
->status
));
7688 if (p
->status
== Established
)
7689 vty_out (vty
, ", up for %8s", peer_uptime (p
->uptime
, timebuf
, BGP_UPTIME_LEN
, 0, NULL
));
7691 else if (p
->status
== Active
)
7693 if (CHECK_FLAG (p
->flags
, PEER_FLAG_PASSIVE
))
7694 vty_out (vty
, " (passive)");
7695 else if (CHECK_FLAG (p
->sflags
, PEER_STATUS_NSF_WAIT
))
7696 vty_out (vty
, " (NSF passive)");
7698 vty_out (vty
, "%s", VTY_NEWLINE
);
7701 vty_out (vty
, " Last read %s", peer_uptime (p
->readtime
, timebuf
, BGP_UPTIME_LEN
, 0, NULL
));
7702 vty_out (vty
, ", Last write %s%s",
7703 peer_uptime (p
->last_write
, timebuf
, BGP_UPTIME_LEN
, 0, NULL
), VTY_NEWLINE
);
7705 /* Configured timer values. */
7706 vty_out (vty
, " Hold time is %d, keepalive interval is %d seconds%s",
7707 p
->v_holdtime
, p
->v_keepalive
, VTY_NEWLINE
);
7708 if (CHECK_FLAG (p
->config
, PEER_CONFIG_TIMER
))
7710 vty_out (vty
, " Configured hold time is %d", p
->holdtime
);
7711 vty_out (vty
, ", keepalive interval is %d seconds%s",
7712 p
->keepalive
, VTY_NEWLINE
);
7716 if (p
->status
== Established
)
7719 || p
->afc_adv
[AFI_IP
][SAFI_UNICAST
]
7720 || p
->afc_recv
[AFI_IP
][SAFI_UNICAST
]
7721 || p
->afc_adv
[AFI_IP
][SAFI_MULTICAST
]
7722 || p
->afc_recv
[AFI_IP
][SAFI_MULTICAST
]
7723 || p
->afc_adv
[AFI_IP6
][SAFI_UNICAST
]
7724 || p
->afc_recv
[AFI_IP6
][SAFI_UNICAST
]
7725 || p
->afc_adv
[AFI_IP6
][SAFI_MULTICAST
]
7726 || p
->afc_recv
[AFI_IP6
][SAFI_MULTICAST
]
7727 || p
->afc_adv
[AFI_IP6
][SAFI_MPLS_VPN
]
7728 || p
->afc_recv
[AFI_IP6
][SAFI_MPLS_VPN
]
7729 || p
->afc_adv
[AFI_IP6
][SAFI_ENCAP
]
7730 || p
->afc_recv
[AFI_IP6
][SAFI_ENCAP
]
7731 || p
->afc_adv
[AFI_IP
][SAFI_ENCAP
]
7732 || p
->afc_recv
[AFI_IP
][SAFI_ENCAP
]
7733 || p
->afc_adv
[AFI_IP
][SAFI_MPLS_VPN
]
7734 || p
->afc_recv
[AFI_IP
][SAFI_MPLS_VPN
])
7738 json_object
*json_cap
= NULL
;
7740 json_cap
= json_object_new_object();
7743 if (CHECK_FLAG (p
->cap
, PEER_CAP_AS4_RCV
)
7744 || CHECK_FLAG (p
->cap
, PEER_CAP_AS4_ADV
))
7746 if (CHECK_FLAG (p
->cap
, PEER_CAP_AS4_ADV
) && CHECK_FLAG (p
->cap
, PEER_CAP_AS4_RCV
))
7747 json_object_string_add(json_cap
, "4byteAs", "advertisedAndReceived");
7748 else if (CHECK_FLAG (p
->cap
, PEER_CAP_AS4_ADV
))
7749 json_object_string_add(json_cap
, "4byteAs", "advertised");
7750 else if (CHECK_FLAG (p
->cap
, PEER_CAP_AS4_RCV
))
7751 json_object_string_add(json_cap
, "4byteAs", "received");
7755 if (CHECK_FLAG (p
->cap
, PEER_CAP_ADDPATH_RCV
)
7756 || CHECK_FLAG (p
->cap
, PEER_CAP_ADDPATH_ADV
))
7758 json_object
*json_add
= NULL
;
7759 const char *print_store
;
7761 json_add
= json_object_new_object();
7763 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
7764 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
7766 json_object
*json_sub
= NULL
;
7767 json_sub
= json_object_new_object();
7768 print_store
= afi_safi_print (afi
, safi
);
7770 if (CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ADDPATH_AF_TX_ADV
) ||
7771 CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ADDPATH_AF_TX_RCV
))
7773 if (CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ADDPATH_AF_TX_ADV
) && CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ADDPATH_AF_TX_RCV
))
7774 json_object_boolean_true_add(json_sub
, "txAdvertisedAndReceived");
7775 else if (CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ADDPATH_AF_TX_ADV
))
7776 json_object_boolean_true_add(json_sub
, "txAdvertised");
7777 else if (CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ADDPATH_AF_TX_RCV
))
7778 json_object_boolean_true_add(json_sub
, "txReceived");
7781 if (CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ADDPATH_AF_RX_ADV
) ||
7782 CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ADDPATH_AF_RX_RCV
))
7784 if (CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ADDPATH_AF_RX_ADV
) && CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ADDPATH_AF_RX_RCV
))
7785 json_object_boolean_true_add(json_sub
, "rxAdvertisedAndReceived");
7786 else if (CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ADDPATH_AF_RX_ADV
))
7787 json_object_boolean_true_add(json_sub
, "rxAdvertised");
7788 else if (CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ADDPATH_AF_RX_RCV
))
7789 json_object_boolean_true_add(json_sub
, "rxReceived");
7792 if (CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ADDPATH_AF_TX_ADV
) ||
7793 CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ADDPATH_AF_TX_RCV
) ||
7794 CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ADDPATH_AF_RX_ADV
) ||
7795 CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ADDPATH_AF_RX_RCV
))
7796 json_object_object_add(json_add
, print_store
, json_sub
);
7798 json_object_free(json_sub
);
7801 json_object_object_add(json_cap
, "addPath", json_add
);
7805 if (CHECK_FLAG (p
->cap
, PEER_CAP_DYNAMIC_RCV
)
7806 || CHECK_FLAG (p
->cap
, PEER_CAP_DYNAMIC_ADV
))
7808 if (CHECK_FLAG (p
->cap
, PEER_CAP_DYNAMIC_ADV
) && CHECK_FLAG (p
->cap
, PEER_CAP_DYNAMIC_RCV
))
7809 json_object_string_add(json_cap
, "dynamic", "advertisedAndReceived");
7810 else if (CHECK_FLAG (p
->cap
, PEER_CAP_DYNAMIC_ADV
))
7811 json_object_string_add(json_cap
, "dynamic", "advertised");
7812 else if (CHECK_FLAG (p
->cap
, PEER_CAP_DYNAMIC_RCV
))
7813 json_object_string_add(json_cap
, "dynamic", "received");
7816 /* Extended nexthop */
7817 if (CHECK_FLAG (p
->cap
, PEER_CAP_ENHE_RCV
)
7818 || CHECK_FLAG (p
->cap
, PEER_CAP_ENHE_ADV
))
7820 json_object
*json_nxt
= NULL
;
7821 const char *print_store
;
7824 if (CHECK_FLAG (p
->cap
, PEER_CAP_ENHE_ADV
) && CHECK_FLAG (p
->cap
, PEER_CAP_ENHE_RCV
))
7825 json_object_string_add(json_cap
, "extendedNexthop", "advertisedAndReceived");
7826 else if (CHECK_FLAG (p
->cap
, PEER_CAP_ENHE_ADV
))
7827 json_object_string_add(json_cap
, "extendedNexthop", "advertised");
7828 else if (CHECK_FLAG (p
->cap
, PEER_CAP_ENHE_RCV
))
7829 json_object_string_add(json_cap
, "extendedNexthop", "received");
7831 if (CHECK_FLAG (p
->cap
, PEER_CAP_ENHE_RCV
))
7833 json_nxt
= json_object_new_object();
7835 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
7837 if (CHECK_FLAG (p
->af_cap
[AFI_IP
][safi
], PEER_CAP_ENHE_AF_RCV
))
7839 print_store
= afi_safi_print (AFI_IP
, safi
);
7840 json_object_string_add(json_nxt
, print_store
, "recieved");
7843 json_object_object_add(json_cap
, "extendedNexthopFamililesByPeer", json_nxt
);
7848 if (CHECK_FLAG (p
->cap
, PEER_CAP_REFRESH_ADV
)
7849 || CHECK_FLAG (p
->cap
, PEER_CAP_REFRESH_NEW_RCV
)
7850 || CHECK_FLAG (p
->cap
, PEER_CAP_REFRESH_OLD_RCV
))
7852 if (CHECK_FLAG (p
->cap
, PEER_CAP_REFRESH_ADV
) && (CHECK_FLAG (p
->cap
, PEER_CAP_REFRESH_NEW_RCV
) || CHECK_FLAG (p
->cap
, PEER_CAP_REFRESH_OLD_RCV
)))
7854 if (CHECK_FLAG (p
->cap
, PEER_CAP_REFRESH_OLD_RCV
) && CHECK_FLAG (p
->cap
, PEER_CAP_REFRESH_NEW_RCV
))
7855 json_object_string_add(json_cap
, "routeRefresh", "advertisedAndReceivedOldNew");
7858 if (CHECK_FLAG (p
->cap
, PEER_CAP_REFRESH_OLD_RCV
))
7859 json_object_string_add(json_cap
, "routeRefresh", "advertisedAndReceivedOld");
7861 json_object_string_add(json_cap
, "routeRefresh", "advertisedAndReceivedNew");
7864 else if (CHECK_FLAG (p
->cap
, PEER_CAP_REFRESH_ADV
))
7865 json_object_string_add(json_cap
, "routeRefresh", "advertised");
7866 else if (CHECK_FLAG (p
->cap
, PEER_CAP_REFRESH_NEW_RCV
) || CHECK_FLAG (p
->cap
, PEER_CAP_REFRESH_OLD_RCV
))
7867 json_object_string_add(json_cap
, "routeRefresh", "received");
7870 /* Multiprotocol Extensions */
7871 json_object
*json_multi
= NULL
;
7872 json_multi
= json_object_new_object();
7874 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
7876 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
7878 if (p
->afc_adv
[afi
][safi
] || p
->afc_recv
[afi
][safi
])
7880 json_object
*json_exten
= NULL
;
7881 json_exten
= json_object_new_object();
7883 if (p
->afc_adv
[afi
][safi
] && p
->afc_recv
[afi
][safi
])
7884 json_object_boolean_true_add(json_exten
, "advertisedAndReceived");
7885 else if (p
->afc_adv
[afi
][safi
])
7886 json_object_boolean_true_add(json_exten
, "advertised");
7887 else if (p
->afc_recv
[afi
][safi
])
7888 json_object_boolean_true_add(json_exten
, "received");
7890 json_object_object_add(json_multi
, afi_safi_print (afi
, safi
), json_exten
);
7894 json_object_object_add(json_cap
, "multiprotocolExtensions", json_multi
);
7896 /* Gracefull Restart */
7897 if (CHECK_FLAG (p
->cap
, PEER_CAP_RESTART_RCV
)
7898 || CHECK_FLAG (p
->cap
, PEER_CAP_RESTART_ADV
))
7900 if (CHECK_FLAG (p
->cap
, PEER_CAP_RESTART_ADV
) && CHECK_FLAG (p
->cap
, PEER_CAP_RESTART_RCV
))
7901 json_object_string_add(json_cap
, "gracefulRestart", "advertisedAndReceived");
7902 else if (CHECK_FLAG (p
->cap
, PEER_CAP_RESTART_ADV
))
7903 json_object_string_add(json_cap
, "gracefulRestartCapability", "advertised");
7904 else if (CHECK_FLAG (p
->cap
, PEER_CAP_RESTART_RCV
))
7905 json_object_string_add(json_cap
, "gracefulRestartCapability", "received");
7907 if (CHECK_FLAG (p
->cap
, PEER_CAP_RESTART_RCV
))
7909 int restart_af_count
= 0;
7910 json_object
*json_restart
= NULL
;
7911 json_restart
= json_object_new_object();
7913 json_object_int_add(json_cap
, "gracefulRestartRemoteTimerMsecs", p
->v_gr_restart
* 1000);
7915 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
7917 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
7919 if (CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_RESTART_AF_RCV
))
7921 json_object
*json_sub
= NULL
;
7922 json_sub
= json_object_new_object();
7924 if (CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_RESTART_AF_PRESERVE_RCV
))
7925 json_object_boolean_true_add(json_sub
, "preserved");
7927 json_object_object_add(json_restart
, afi_safi_print (afi
, safi
), json_sub
);
7931 if (! restart_af_count
)
7933 json_object_string_add(json_cap
, "addressFamiliesByPeer", "none");
7934 json_object_free(json_restart
);
7937 json_object_object_add(json_cap
, "addressFamiliesByPeer", json_restart
);
7940 json_object_object_add(json_neigh
, "neighborCapabilities", json_cap
);
7944 vty_out (vty
, " Neighbor capabilities:%s", VTY_NEWLINE
);
7947 if (CHECK_FLAG (p
->cap
, PEER_CAP_AS4_RCV
)
7948 || CHECK_FLAG (p
->cap
, PEER_CAP_AS4_ADV
))
7950 vty_out (vty
, " 4 Byte AS:");
7951 if (CHECK_FLAG (p
->cap
, PEER_CAP_AS4_ADV
))
7952 vty_out (vty
, " advertised");
7953 if (CHECK_FLAG (p
->cap
, PEER_CAP_AS4_RCV
))
7954 vty_out (vty
, " %sreceived",
7955 CHECK_FLAG (p
->cap
, PEER_CAP_AS4_ADV
) ? "and " : "");
7956 vty_out (vty
, "%s", VTY_NEWLINE
);
7960 if (CHECK_FLAG (p
->cap
, PEER_CAP_ADDPATH_RCV
)
7961 || CHECK_FLAG (p
->cap
, PEER_CAP_ADDPATH_ADV
))
7963 vty_out (vty
, " AddPath:%s", VTY_NEWLINE
);
7965 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
7966 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
7968 if (CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ADDPATH_AF_TX_ADV
) ||
7969 CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ADDPATH_AF_TX_RCV
))
7971 vty_out (vty
, " %s: TX ", afi_safi_print (afi
, safi
));
7973 if (CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ADDPATH_AF_TX_ADV
))
7974 vty_out (vty
, "advertised %s", afi_safi_print (afi
, safi
));
7976 if (CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ADDPATH_AF_TX_RCV
))
7977 vty_out (vty
, "%sreceived", CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ADDPATH_AF_TX_ADV
) ? " and " : "" );
7979 vty_out (vty
, "%s", VTY_NEWLINE
);
7982 if (CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ADDPATH_AF_RX_ADV
) ||
7983 CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ADDPATH_AF_RX_RCV
))
7985 vty_out (vty
, " %s: RX ", afi_safi_print (afi
, safi
));
7987 if (CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ADDPATH_AF_RX_ADV
))
7988 vty_out (vty
, "advertised %s", afi_safi_print (afi
, safi
));
7990 if (CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ADDPATH_AF_RX_RCV
))
7991 vty_out (vty
, "%sreceived", CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_ADDPATH_AF_RX_ADV
) ? " and " : "" );
7993 vty_out (vty
, "%s", VTY_NEWLINE
);
7999 if (CHECK_FLAG (p
->cap
, PEER_CAP_DYNAMIC_RCV
)
8000 || CHECK_FLAG (p
->cap
, PEER_CAP_DYNAMIC_ADV
))
8002 vty_out (vty
, " Dynamic:");
8003 if (CHECK_FLAG (p
->cap
, PEER_CAP_DYNAMIC_ADV
))
8004 vty_out (vty
, " advertised");
8005 if (CHECK_FLAG (p
->cap
, PEER_CAP_DYNAMIC_RCV
))
8006 vty_out (vty
, " %sreceived",
8007 CHECK_FLAG (p
->cap
, PEER_CAP_DYNAMIC_ADV
) ? "and " : "");
8008 vty_out (vty
, "%s", VTY_NEWLINE
);
8011 /* Extended nexthop */
8012 if (CHECK_FLAG (p
->cap
, PEER_CAP_ENHE_RCV
)
8013 || CHECK_FLAG (p
->cap
, PEER_CAP_ENHE_ADV
))
8015 vty_out (vty
, " Extended nexthop:");
8016 if (CHECK_FLAG (p
->cap
, PEER_CAP_ENHE_ADV
))
8017 vty_out (vty
, " advertised");
8018 if (CHECK_FLAG (p
->cap
, PEER_CAP_ENHE_RCV
))
8019 vty_out (vty
, " %sreceived",
8020 CHECK_FLAG (p
->cap
, PEER_CAP_ENHE_ADV
) ? "and " : "");
8021 vty_out (vty
, "%s", VTY_NEWLINE
);
8023 if (CHECK_FLAG (p
->cap
, PEER_CAP_ENHE_RCV
))
8025 vty_out (vty
, " Address families by peer:%s ", VTY_NEWLINE
);
8026 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
8027 if (CHECK_FLAG (p
->af_cap
[AFI_IP
][safi
], PEER_CAP_ENHE_AF_RCV
))
8028 vty_out (vty
, " %s%s",
8029 afi_safi_print (AFI_IP
, safi
), VTY_NEWLINE
);
8034 if (CHECK_FLAG (p
->cap
, PEER_CAP_REFRESH_ADV
)
8035 || CHECK_FLAG (p
->cap
, PEER_CAP_REFRESH_NEW_RCV
)
8036 || CHECK_FLAG (p
->cap
, PEER_CAP_REFRESH_OLD_RCV
))
8038 vty_out (vty
, " Route refresh:");
8039 if (CHECK_FLAG (p
->cap
, PEER_CAP_REFRESH_ADV
))
8040 vty_out (vty
, " advertised");
8041 if (CHECK_FLAG (p
->cap
, PEER_CAP_REFRESH_NEW_RCV
)
8042 || CHECK_FLAG (p
->cap
, PEER_CAP_REFRESH_OLD_RCV
))
8043 vty_out (vty
, " %sreceived(%s)",
8044 CHECK_FLAG (p
->cap
, PEER_CAP_REFRESH_ADV
) ? "and " : "",
8045 (CHECK_FLAG (p
->cap
, PEER_CAP_REFRESH_OLD_RCV
)
8046 && CHECK_FLAG (p
->cap
, PEER_CAP_REFRESH_NEW_RCV
)) ?
8047 "old & new" : CHECK_FLAG (p
->cap
, PEER_CAP_REFRESH_OLD_RCV
) ? "old" : "new");
8049 vty_out (vty
, "%s", VTY_NEWLINE
);
8052 /* Multiprotocol Extensions */
8053 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
8054 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
8055 if (p
->afc_adv
[afi
][safi
] || p
->afc_recv
[afi
][safi
])
8057 vty_out (vty
, " Address Family %s:", afi_safi_print (afi
, safi
));
8058 if (p
->afc_adv
[afi
][safi
])
8059 vty_out (vty
, " advertised");
8060 if (p
->afc_recv
[afi
][safi
])
8061 vty_out (vty
, " %sreceived", p
->afc_adv
[afi
][safi
] ? "and " : "");
8062 vty_out (vty
, "%s", VTY_NEWLINE
);
8065 /* Hostname capability */
8066 if (CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_ADV
) ||
8067 CHECK_FLAG(p
->cap
, PEER_CAP_HOSTNAME_RCV
))
8069 vty_out (vty
, " Hostname Capability:");
8070 if (CHECK_FLAG (p
->cap
, PEER_CAP_HOSTNAME_ADV
))
8071 vty_out (vty
, " advertised");
8072 if (CHECK_FLAG (p
->cap
, PEER_CAP_HOSTNAME_RCV
))
8073 vty_out (vty
, " %sreceived",
8074 CHECK_FLAG (p
->cap
, PEER_CAP_HOSTNAME_ADV
) ? "and " : "");
8075 vty_out (vty
, "%s", VTY_NEWLINE
);
8078 /* Gracefull Restart */
8079 if (CHECK_FLAG (p
->cap
, PEER_CAP_RESTART_RCV
)
8080 || CHECK_FLAG (p
->cap
, PEER_CAP_RESTART_ADV
))
8082 vty_out (vty
, " Graceful Restart Capabilty:");
8083 if (CHECK_FLAG (p
->cap
, PEER_CAP_RESTART_ADV
))
8084 vty_out (vty
, " advertised");
8085 if (CHECK_FLAG (p
->cap
, PEER_CAP_RESTART_RCV
))
8086 vty_out (vty
, " %sreceived",
8087 CHECK_FLAG (p
->cap
, PEER_CAP_RESTART_ADV
) ? "and " : "");
8088 vty_out (vty
, "%s", VTY_NEWLINE
);
8090 if (CHECK_FLAG (p
->cap
, PEER_CAP_RESTART_RCV
))
8092 int restart_af_count
= 0;
8094 vty_out (vty
, " Remote Restart timer is %d seconds%s",
8095 p
->v_gr_restart
, VTY_NEWLINE
);
8096 vty_out (vty
, " Address families by peer:%s ", VTY_NEWLINE
);
8098 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
8099 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
8100 if (CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_RESTART_AF_RCV
))
8102 vty_out (vty
, "%s%s(%s)", restart_af_count
? ", " : "",
8103 afi_safi_print (afi
, safi
),
8104 CHECK_FLAG (p
->af_cap
[afi
][safi
], PEER_CAP_RESTART_AF_PRESERVE_RCV
) ?
8105 "preserved" : "not preserved");
8108 if (! restart_af_count
)
8109 vty_out (vty
, "none");
8110 vty_out (vty
, "%s", VTY_NEWLINE
);
8117 /* graceful restart information */
8118 if (CHECK_FLAG (p
->cap
, PEER_CAP_RESTART_RCV
)
8122 json_object
*json_grace
= NULL
;
8123 json_object
*json_grace_send
= NULL
;
8124 json_object
*json_grace_recv
= NULL
;
8125 int eor_send_af_count
= 0;
8126 int eor_receive_af_count
= 0;
8130 json_grace
= json_object_new_object();
8131 json_grace_send
= json_object_new_object();
8132 json_grace_recv
= json_object_new_object();
8134 if (p
->status
== Established
)
8136 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
8138 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
8140 if (CHECK_FLAG (p
->af_sflags
[afi
][safi
], PEER_STATUS_EOR_SEND
))
8142 json_object_boolean_true_add(json_grace_send
, afi_safi_print (afi
, safi
));
8143 eor_send_af_count
++;
8147 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
8149 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
8151 if (CHECK_FLAG (p
->af_sflags
[afi
][safi
], PEER_STATUS_EOR_RECEIVED
))
8153 json_object_boolean_true_add(json_grace_recv
, afi_safi_print (afi
, safi
));
8154 eor_receive_af_count
++;
8160 json_object_object_add(json_grace
, "endOfRibSend", json_grace_send
);
8161 json_object_object_add(json_grace
, "endOfRibRecv", json_grace_recv
);
8163 if (p
->t_gr_restart
)
8164 json_object_int_add(json_grace
, "gracefulRestartTimerMsecs", thread_timer_remain_second (p
->t_gr_restart
) * 1000);
8167 json_object_int_add(json_grace
, "gracefulStalepathTimerMsecs", thread_timer_remain_second (p
->t_gr_stale
) * 1000);
8169 json_object_object_add(json_neigh
, "gracefulRestartInfo", json_grace
);
8173 vty_out (vty
, " Graceful restart informations:%s", VTY_NEWLINE
);
8174 if (p
->status
== Established
)
8176 vty_out (vty
, " End-of-RIB send: ");
8177 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
8179 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
8181 if (CHECK_FLAG (p
->af_sflags
[afi
][safi
], PEER_STATUS_EOR_SEND
))
8183 vty_out (vty
, "%s%s", eor_send_af_count
? ", " : "",
8184 afi_safi_print (afi
, safi
));
8185 eor_send_af_count
++;
8189 vty_out (vty
, "%s", VTY_NEWLINE
);
8190 vty_out (vty
, " End-of-RIB received: ");
8191 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
8193 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
8195 if (CHECK_FLAG (p
->af_sflags
[afi
][safi
], PEER_STATUS_EOR_RECEIVED
))
8197 vty_out (vty
, "%s%s", eor_receive_af_count
? ", " : "",
8198 afi_safi_print (afi
, safi
));
8199 eor_receive_af_count
++;
8203 vty_out (vty
, "%s", VTY_NEWLINE
);
8206 if (p
->t_gr_restart
)
8207 vty_out (vty
, " The remaining time of restart timer is %ld%s",
8208 thread_timer_remain_second (p
->t_gr_restart
), VTY_NEWLINE
);
8211 vty_out (vty
, " The remaining time of stalepath timer is %ld%s",
8212 thread_timer_remain_second (p
->t_gr_stale
), VTY_NEWLINE
);
8217 json_object
*json_stat
= NULL
;
8218 json_stat
= json_object_new_object();
8219 /* Packet counts. */
8220 json_object_int_add(json_stat
, "depthInq", 0);
8221 json_object_int_add(json_stat
, "depthOutq", (unsigned long) p
->obuf
->count
);
8222 json_object_int_add(json_stat
, "opensSent", p
->open_out
);
8223 json_object_int_add(json_stat
, "opensRecv", p
->open_in
);
8224 json_object_int_add(json_stat
, "notificationsSent", p
->notify_out
);
8225 json_object_int_add(json_stat
, "notificationsRecv", p
->notify_in
);
8226 json_object_int_add(json_stat
, "updatesSent", p
->update_out
);
8227 json_object_int_add(json_stat
, "updatesRecv", p
->update_in
);
8228 json_object_int_add(json_stat
, "keepalivesSent", p
->keepalive_out
);
8229 json_object_int_add(json_stat
, "keepalivesRecv", p
->keepalive_in
);
8230 json_object_int_add(json_stat
, "routeRefreshSent", p
->refresh_out
);
8231 json_object_int_add(json_stat
, "routeRefreshRecv", p
->refresh_in
);
8232 json_object_int_add(json_stat
, "capabilitySent", p
->dynamic_cap_out
);
8233 json_object_int_add(json_stat
, "capabilityRecv", p
->dynamic_cap_in
);
8234 json_object_int_add(json_stat
, "totalSent", p
->open_out
+ p
->notify_out
+ p
->update_out
+ p
->keepalive_out
+ p
->refresh_out
+ p
->dynamic_cap_out
);
8235 json_object_int_add(json_stat
, "totalRecv", p
->open_in
+ p
->notify_in
+ p
->update_in
+ p
->keepalive_in
+ p
->refresh_in
+ p
->dynamic_cap_in
);
8236 json_object_object_add(json_neigh
, "messageStats", json_stat
);
8240 /* Packet counts. */
8241 vty_out (vty
, " Message statistics:%s", VTY_NEWLINE
);
8242 vty_out (vty
, " Inq depth is 0%s", VTY_NEWLINE
);
8243 vty_out (vty
, " Outq depth is %lu%s", (unsigned long) p
->obuf
->count
, VTY_NEWLINE
);
8244 vty_out (vty
, " Sent Rcvd%s", VTY_NEWLINE
);
8245 vty_out (vty
, " Opens: %10d %10d%s", p
->open_out
, p
->open_in
, VTY_NEWLINE
);
8246 vty_out (vty
, " Notifications: %10d %10d%s", p
->notify_out
, p
->notify_in
, VTY_NEWLINE
);
8247 vty_out (vty
, " Updates: %10d %10d%s", p
->update_out
, p
->update_in
, VTY_NEWLINE
);
8248 vty_out (vty
, " Keepalives: %10d %10d%s", p
->keepalive_out
, p
->keepalive_in
, VTY_NEWLINE
);
8249 vty_out (vty
, " Route Refresh: %10d %10d%s", p
->refresh_out
, p
->refresh_in
, VTY_NEWLINE
);
8250 vty_out (vty
, " Capability: %10d %10d%s", p
->dynamic_cap_out
, p
->dynamic_cap_in
, VTY_NEWLINE
);
8251 vty_out (vty
, " Total: %10d %10d%s", p
->open_out
+ p
->notify_out
+
8252 p
->update_out
+ p
->keepalive_out
+ p
->refresh_out
+ p
->dynamic_cap_out
,
8253 p
->open_in
+ p
->notify_in
+ p
->update_in
+ p
->keepalive_in
+ p
->refresh_in
+
8254 p
->dynamic_cap_in
, VTY_NEWLINE
);
8259 /* advertisement-interval */
8260 json_object_int_add(json_neigh
, "minBtwnAdvertisementRunsTimerMsecs", p
->v_routeadv
* 1000);
8262 /* Update-source. */
8263 if (p
->update_if
|| p
->update_source
)
8266 json_object_string_add(json_neigh
, "updateSource", p
->update_if
);
8267 else if (p
->update_source
)
8268 json_object_string_add(json_neigh
, "updateSource", sockunion2str (p
->update_source
, buf1
, SU_ADDRSTRLEN
));
8273 /* advertisement-interval */
8274 vty_out (vty
, " Minimum time between advertisement runs is %d seconds%s",
8275 p
->v_routeadv
, VTY_NEWLINE
);
8277 /* Update-source. */
8278 if (p
->update_if
|| p
->update_source
)
8280 vty_out (vty
, " Update source is ");
8282 vty_out (vty
, "%s", p
->update_if
);
8283 else if (p
->update_source
)
8284 vty_out (vty
, "%s", sockunion2str (p
->update_source
, buf1
, SU_ADDRSTRLEN
));
8285 vty_out (vty
, "%s", VTY_NEWLINE
);
8288 vty_out (vty
, "%s", VTY_NEWLINE
);
8291 /* Address Family Information */
8292 json_object
*json_hold
= NULL
;
8295 json_hold
= json_object_new_object();
8297 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
8298 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
8299 if (p
->afc
[afi
][safi
])
8300 bgp_show_peer_afi (vty
, p
, afi
, safi
, use_json
, json_hold
);
8304 json_object_object_add(json_neigh
, "addressFamilyInfo", json_hold
);
8305 json_object_int_add(json_neigh
, "connectionsEstablished", p
->established
);
8306 json_object_int_add(json_neigh
, "connectionsDropped", p
->dropped
);
8309 vty_out (vty
, " Connections established %d; dropped %d%s", p
->established
, p
->dropped
,
8312 if (! p
->last_reset
)
8315 json_object_string_add(json_neigh
, "lastReset", "never");
8317 vty_out (vty
, " Last reset never%s", VTY_NEWLINE
);
8326 uptime
= bgp_clock();
8327 uptime
-= p
->resettime
;
8328 tm
= gmtime(&uptime
);
8329 json_object_int_add(json_neigh
, "lastResetTimerMsecs", (tm
->tm_sec
* 1000) + (tm
->tm_min
* 60000) + (tm
->tm_hour
* 3600000));
8330 json_object_string_add(json_neigh
, "lastResetDueTo", peer_down_str
[(int) p
->last_reset
]);
8331 if (p
->last_reset
== PEER_DOWN_NOTIFY_SEND
||
8332 p
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
)
8334 char errorcodesubcode_hexstr
[5];
8335 char errorcodesubcode_str
[256];
8337 code_str
= bgp_notify_code_str(p
->notify
.code
);
8338 subcode_str
= bgp_notify_subcode_str(p
->notify
.code
, p
->notify
.subcode
);
8340 sprintf(errorcodesubcode_hexstr
, "%02X%02X", p
->notify
.code
, p
->notify
.subcode
);
8341 json_object_string_add(json_neigh
, "lastErrorCodeSubcode", errorcodesubcode_hexstr
);
8342 snprintf(errorcodesubcode_str
, 255, "%s%s", code_str
, subcode_str
);
8343 json_object_string_add(json_neigh
, "lastNotificationReason", errorcodesubcode_str
);
8344 if (p
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
8345 && p
->notify
.code
== BGP_NOTIFY_CEASE
8346 && (p
->notify
.subcode
== BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
8347 || p
->notify
.subcode
== BGP_NOTIFY_CEASE_ADMIN_RESET
)
8348 && p
->notify
.length
)
8351 const char *msg_str
;
8353 msg_str
= bgp_notify_admin_message(msgbuf
, sizeof(msgbuf
),
8354 (u_char
*)p
->notify
.data
, p
->notify
.length
);
8356 json_object_string_add(json_neigh
, "lastShutdownDescription", msg_str
);
8362 vty_out (vty
, " Last reset %s, ",
8363 peer_uptime (p
->resettime
, timebuf
, BGP_UPTIME_LEN
, 0, NULL
));
8365 if (p
->last_reset
== PEER_DOWN_NOTIFY_SEND
||
8366 p
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
)
8368 code_str
= bgp_notify_code_str(p
->notify
.code
);
8369 subcode_str
= bgp_notify_subcode_str(p
->notify
.code
, p
->notify
.subcode
);
8370 vty_out (vty
, "due to NOTIFICATION %s (%s%s)%s",
8371 p
->last_reset
== PEER_DOWN_NOTIFY_SEND
? "sent" : "received",
8372 code_str
, subcode_str
, VTY_NEWLINE
);
8373 if (p
->last_reset
== PEER_DOWN_NOTIFY_RECEIVED
8374 && p
->notify
.code
== BGP_NOTIFY_CEASE
8375 && (p
->notify
.subcode
== BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
8376 || p
->notify
.subcode
== BGP_NOTIFY_CEASE_ADMIN_RESET
)
8377 && p
->notify
.length
)
8380 const char *msg_str
;
8382 msg_str
= bgp_notify_admin_message(msgbuf
, sizeof(msgbuf
),
8383 (u_char
*)p
->notify
.data
, p
->notify
.length
);
8385 vty_out (vty
, " Message: \"%s\"%s", msg_str
, VTY_NEWLINE
);
8390 vty_out (vty
, "due to %s%s",
8391 peer_down_str
[(int) p
->last_reset
], VTY_NEWLINE
);
8394 if (p
->last_reset_cause_size
)
8396 msg
= p
->last_reset_cause
;
8397 vty_out(vty
, " Message received that caused BGP to send a NOTIFICATION:%s ", VTY_NEWLINE
);
8398 for (i
= 1; i
<= p
->last_reset_cause_size
; i
++)
8400 vty_out(vty
, "%02X", *msg
++);
8402 if (i
!= p
->last_reset_cause_size
)
8406 vty_out(vty
, "%s ", VTY_NEWLINE
);
8408 else if (i
% 4 == 0)
8414 vty_out(vty
, "%s", VTY_NEWLINE
);
8419 if (CHECK_FLAG (p
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
))
8422 json_object_boolean_true_add(json_neigh
, "prefixesConfigExceedMax");
8424 vty_out (vty
, " Peer had exceeded the max. no. of prefixes configured.%s", VTY_NEWLINE
);
8426 if (p
->t_pmax_restart
)
8430 json_object_boolean_true_add(json_neigh
, "reducePrefixNumFrom");
8431 json_object_int_add(json_neigh
, "restartInTimerMsec", thread_timer_remain_second (p
->t_pmax_restart
) * 1000);
8434 vty_out (vty
, " Reduce the no. of prefix from %s, will restart in %ld seconds%s",
8435 p
->host
, thread_timer_remain_second (p
->t_pmax_restart
),
8441 json_object_boolean_true_add(json_neigh
, "reducePrefixNumAndClearIpBgp");
8443 vty_out (vty
, " Reduce the no. of prefix and clear ip bgp %s to restore peering%s",
8444 p
->host
, VTY_NEWLINE
);
8448 /* EBGP Multihop and GTSM */
8449 if (p
->sort
!= BGP_PEER_IBGP
)
8453 if (p
->gtsm_hops
> 0)
8454 json_object_int_add(json_neigh
, "externalBgpNbrMaxHopsAway", p
->gtsm_hops
);
8455 else if (p
->ttl
> 1)
8456 json_object_int_add(json_neigh
, "externalBgpNbrMaxHopsAway", p
->ttl
);
8460 if (p
->gtsm_hops
> 0)
8461 vty_out (vty
, " External BGP neighbor may be up to %d hops away.%s",
8462 p
->gtsm_hops
, VTY_NEWLINE
);
8463 else if (p
->ttl
> 1)
8464 vty_out (vty
, " External BGP neighbor may be up to %d hops away.%s",
8465 p
->ttl
, VTY_NEWLINE
);
8470 if (p
->gtsm_hops
> 0)
8473 json_object_int_add(json_neigh
, "internalBgpNbrMaxHopsAway", p
->gtsm_hops
);
8475 vty_out (vty
, " Internal BGP neighbor may be up to %d hops away.%s",
8476 p
->gtsm_hops
, VTY_NEWLINE
);
8480 /* Local address. */
8485 json_object_string_add(json_neigh
, "hostLocal", sockunion2str (p
->su_local
, buf1
, SU_ADDRSTRLEN
));
8486 json_object_int_add(json_neigh
, "portLocal", ntohs (p
->su_local
->sin
.sin_port
));
8489 vty_out (vty
, "Local host: %s, Local port: %d%s",
8490 sockunion2str (p
->su_local
, buf1
, SU_ADDRSTRLEN
),
8491 ntohs (p
->su_local
->sin
.sin_port
),
8495 /* Remote address. */
8500 json_object_string_add(json_neigh
, "hostForeign", sockunion2str (p
->su_remote
, buf1
, SU_ADDRSTRLEN
));
8501 json_object_int_add(json_neigh
, "portForeign", ntohs (p
->su_remote
->sin
.sin_port
));
8504 vty_out (vty
, "Foreign host: %s, Foreign port: %d%s",
8505 sockunion2str (p
->su_remote
, buf1
, SU_ADDRSTRLEN
),
8506 ntohs (p
->su_remote
->sin
.sin_port
),
8510 /* Nexthop display. */
8515 json_object_string_add(json_neigh
, "nexthop",
8516 inet_ntop (AF_INET
, &p
->nexthop
.v4
, buf1
, sizeof(buf1
)));
8517 json_object_string_add(json_neigh
, "nexthopGlobal",
8518 inet_ntop (AF_INET6
, &p
->nexthop
.v6_global
, buf1
, sizeof(buf1
)));
8519 json_object_string_add(json_neigh
, "nexthopLocal",
8520 inet_ntop (AF_INET6
, &p
->nexthop
.v6_local
, buf1
, sizeof(buf1
)));
8521 if (p
->shared_network
)
8522 json_object_string_add(json_neigh
, "bgpConnection", "sharedNetwork");
8524 json_object_string_add(json_neigh
, "bgpConnection", "nonSharedNetwork");
8528 vty_out (vty
, "Nexthop: %s%s",
8529 inet_ntop (AF_INET
, &p
->nexthop
.v4
, buf1
, sizeof(buf1
)),
8531 vty_out (vty
, "Nexthop global: %s%s",
8532 inet_ntop (AF_INET6
, &p
->nexthop
.v6_global
, buf1
, sizeof(buf1
)),
8534 vty_out (vty
, "Nexthop local: %s%s",
8535 inet_ntop (AF_INET6
, &p
->nexthop
.v6_local
, buf1
, sizeof(buf1
)),
8537 vty_out (vty
, "BGP connection: %s%s",
8538 p
->shared_network
? "shared network" : "non shared network",
8543 /* Timer information. */
8546 json_object_int_add(json_neigh
, "connectRetryTimer", p
->v_connect
);
8547 if (p
->status
== Established
&& p
->rtt
)
8548 json_object_int_add(json_neigh
, "estimatedRttInMsecs", p
->rtt
);
8550 json_object_int_add(json_neigh
, "nextStartTimerDueInMsecs", thread_timer_remain_second (p
->t_start
) * 1000);
8552 json_object_int_add(json_neigh
, "nextConnectTimerDueInMsecs", thread_timer_remain_second (p
->t_connect
) * 1000);
8555 json_object_int_add(json_neigh
, "mraiInterval", p
->v_routeadv
);
8556 json_object_int_add(json_neigh
, "mraiTimerExpireInMsecs", thread_timer_remain_second (p
->t_routeadv
) * 1000);
8560 json_object_string_add(json_neigh
, "readThread", "on");
8562 json_object_string_add(json_neigh
, "readThread", "off");
8564 json_object_string_add(json_neigh
, "writeThread", "on");
8566 json_object_string_add(json_neigh
, "writeThread", "off");
8570 vty_out (vty
, "BGP Connect Retry Timer in Seconds: %d%s",
8571 p
->v_connect
, VTY_NEWLINE
);
8572 if (p
->status
== Established
&& p
->rtt
)
8573 vty_out (vty
, "Estimated round trip time: %d ms%s",
8574 p
->rtt
, VTY_NEWLINE
);
8576 vty_out (vty
, "Next start timer due in %ld seconds%s",
8577 thread_timer_remain_second (p
->t_start
), VTY_NEWLINE
);
8579 vty_out (vty
, "Next connect timer due in %ld seconds%s",
8580 thread_timer_remain_second (p
->t_connect
), VTY_NEWLINE
);
8582 vty_out (vty
, "MRAI (interval %u) timer expires in %ld seconds%s",
8583 p
->v_routeadv
, thread_timer_remain_second (p
->t_routeadv
),
8586 vty_out (vty
, "Read thread: %s Write thread: %s%s",
8587 p
->t_read
? "on" : "off",
8588 p
->t_write
? "on" : "off",
8592 if (p
->notify
.code
== BGP_NOTIFY_OPEN_ERR
8593 && p
->notify
.subcode
== BGP_NOTIFY_OPEN_UNSUP_CAPBL
)
8594 bgp_capability_vty_out (vty
, p
, use_json
, json_neigh
);
8597 vty_out (vty
, "%s", VTY_NEWLINE
);
8599 /* BFD information. */
8600 bgp_bfd_show_info(vty
, p
, use_json
, json_neigh
);
8604 if (p
->conf_if
) /* Configured interface name. */
8605 json_object_object_add(json
, p
->conf_if
, json_neigh
);
8606 else /* Configured IP address. */
8607 json_object_object_add(json
, p
->host
, json_neigh
);
8612 bgp_show_neighbor (struct vty
*vty
, struct bgp
*bgp
, enum show_type type
,
8613 union sockunion
*su
, const char *conf_if
, u_char use_json
, json_object
*json
)
8615 struct listnode
*node
, *nnode
;
8619 for (ALL_LIST_ELEMENTS (bgp
->peer
, node
, nnode
, peer
))
8621 if (!CHECK_FLAG(peer
->flags
, PEER_FLAG_CONFIG_NODE
))
8627 bgp_show_peer (vty
, peer
, use_json
, json
);
8632 if ((peer
->conf_if
&& !strcmp(peer
->conf_if
, conf_if
)) ||
8633 (peer
->hostname
&& !strcmp(peer
->hostname
, conf_if
)))
8636 bgp_show_peer (vty
, peer
, use_json
, json
);
8641 if (sockunion_same (&peer
->su
, su
))
8644 bgp_show_peer (vty
, peer
, use_json
, json
);
8651 if (type
== show_peer
&& ! find
)
8654 json_object_boolean_true_add(json
, "bgpNoSuchNeighbor");
8656 vty_out (vty
, "%% No such neighbor%s", VTY_NEWLINE
);
8661 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
8662 json_object_free(json
);
8666 vty_out (vty
, "%s", VTY_NEWLINE
);
8673 bgp_show_all_instances_neighbors_vty (struct vty
*vty
, u_char use_json
)
8675 struct listnode
*node
, *nnode
;
8677 json_object
*json
= NULL
;
8681 vty_out (vty
, "{%s", VTY_NEWLINE
);
8683 for (ALL_LIST_ELEMENTS (bm
->bgp
, node
, nnode
, bgp
))
8687 if (!(json
= json_object_new_object()))
8689 zlog_err("Unable to allocate memory for JSON object");
8691 "{\"error\": {\"message:\": \"Unable to allocate memory for JSON object\"}}}%s",
8696 json_object_int_add(json
, "vrfId",
8697 (bgp
->vrf_id
== VRF_UNKNOWN
)
8698 ? -1 : bgp
->vrf_id
);
8699 json_object_string_add(json
, "vrfName",
8700 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
8701 ? "Default" : bgp
->name
);
8704 vty_out (vty
, ",%s", VTY_NEWLINE
);
8708 vty_out(vty
, "\"%s\":", (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
8709 ? "Default" : bgp
->name
);
8713 vty_out (vty
, "%sInstance %s:%s",
8715 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
)
8716 ? "Default" : bgp
->name
,
8719 bgp_show_neighbor (vty
, bgp
, show_all
, NULL
, NULL
, use_json
, json
);
8723 vty_out (vty
, "}%s", VTY_NEWLINE
);
8727 bgp_show_neighbor_vty (struct vty
*vty
, const char *name
,
8728 enum show_type type
, const char *ip_str
, u_char use_json
)
8733 json_object
*json
= NULL
;
8736 json
= json_object_new_object();
8740 if (strmatch(name
, "all"))
8742 bgp_show_all_instances_neighbors_vty (vty
, use_json
);
8747 bgp
= bgp_lookup_by_name (name
);
8752 json_object_boolean_true_add(json
, "bgpNoSuchInstance");
8753 vty_out (vty
, "%s%s", json_object_to_json_string_ext(json
, JSON_C_TO_STRING_PRETTY
), VTY_NEWLINE
);
8754 json_object_free(json
);
8757 vty_out (vty
, "%% No such BGP instance exist%s", VTY_NEWLINE
);
8765 bgp
= bgp_get_default ();
8772 ret
= str2sockunion (ip_str
, &su
);
8774 bgp_show_neighbor (vty
, bgp
, type
, NULL
, ip_str
, use_json
, json
);
8776 bgp_show_neighbor (vty
, bgp
, type
, &su
, NULL
, use_json
, json
);
8780 bgp_show_neighbor (vty
, bgp
, type
, NULL
, NULL
, use_json
, json
);
8787 /* "show [ip] bgp neighbors" commands. */
8788 DEFUN (show_ip_bgp_neighbors
,
8789 show_ip_bgp_neighbors_cmd
,
8790 "show [ip] bgp [<view|vrf> WORD] [<ipv4|ipv6|vpnv4 <all|rd ASN:nn_or_IP-address:nn>>] neighbors [<A.B.C.D|X:X::X:X|WORD>] [json]",
8794 BGP_INSTANCE_HELP_STR
8798 "Display information about all VPNv4 NLRIs\n"
8799 "Display information for a route distinguisher\n"
8800 "VPN Route Distinguisher\n"
8801 "Detailed information on TCP and BGP neighbor connections\n"
8802 "Neighbor to display information about\n"
8803 "Neighbor to display information about\n"
8804 "Neighbor on BGP configured interface\n"
8808 char *sh_arg
= NULL
;
8809 enum show_type sh_type
;
8811 u_char uj
= use_json(argc
, argv
);
8815 if (argv_find (argv
, argc
, "view", &idx
) ||
8816 argv_find (argv
, argc
, "vrf", &idx
))
8817 vrf
= argv
[idx
+1]->arg
;
8820 if (argv_find (argv
, argc
, "A.B.C.D", &idx
) ||
8821 argv_find (argv
, argc
, "X:X::X:X", &idx
) ||
8822 argv_find (argv
, argc
, "WORD", &idx
))
8824 sh_type
= show_peer
;
8825 sh_arg
= argv
[idx
]->arg
;
8830 return bgp_show_neighbor_vty (vty
, vrf
, sh_type
, sh_arg
, uj
);
8833 /* Show BGP's AS paths internal data. There are both `show [ip] bgp
8834 paths' and `show ip mbgp paths'. Those functions results are the
8836 DEFUN (show_ip_bgp_paths
,
8837 show_ip_bgp_paths_cmd
,
8838 "show [ip] bgp ["BGP_SAFI_CMD_STR
"] paths",
8843 "Path information\n")
8845 vty_out (vty
, "Address Refcnt Path%s", VTY_NEWLINE
);
8846 aspath_print_all_vty (vty
);
8853 community_show_all_iterator (struct hash_backet
*backet
, struct vty
*vty
)
8855 struct community
*com
;
8857 com
= (struct community
*) backet
->data
;
8858 vty_out (vty
, "[%p] (%ld) %s%s", (void *)backet
, com
->refcnt
,
8859 community_str (com
), VTY_NEWLINE
);
8862 /* Show BGP's community internal data. */
8863 DEFUN (show_ip_bgp_community_info
,
8864 show_ip_bgp_community_info_cmd
,
8865 "show [ip] bgp community-info",
8869 "List all bgp community information\n")
8871 vty_out (vty
, "Address Refcnt Community%s", VTY_NEWLINE
);
8873 hash_iterate (community_hash (),
8874 (void (*) (struct hash_backet
*, void *))
8875 community_show_all_iterator
,
8882 lcommunity_show_all_iterator (struct hash_backet
*backet
, struct vty
*vty
)
8884 struct lcommunity
*lcom
;
8886 lcom
= (struct lcommunity
*) backet
->data
;
8887 vty_out (vty
, "[%p] (%ld) %s%s", (void *)backet
, lcom
->refcnt
,
8888 lcommunity_str (lcom
), VTY_NEWLINE
);
8891 /* Show BGP's community internal data. */
8892 DEFUN (show_ip_bgp_lcommunity_info
,
8893 show_ip_bgp_lcommunity_info_cmd
,
8894 "show ip bgp large-community-info",
8898 "List all bgp large-community information\n")
8900 vty_out (vty
, "Address Refcnt Large-community%s", VTY_NEWLINE
);
8902 hash_iterate (lcommunity_hash (),
8903 (void (*) (struct hash_backet
*, void *))
8904 lcommunity_show_all_iterator
,
8911 DEFUN (show_ip_bgp_attr_info
,
8912 show_ip_bgp_attr_info_cmd
,
8913 "show [ip] bgp attribute-info",
8917 "List all bgp attribute information\n")
8919 attr_show_all (vty
);
8924 bgp_show_all_instances_updgrps_vty (struct vty
*vty
, afi_t afi
, safi_t safi
)
8926 struct listnode
*node
, *nnode
;
8929 for (ALL_LIST_ELEMENTS (bm
->bgp
, node
, nnode
, bgp
))
8931 vty_out (vty
, "%sInstance %s:%s",
8933 (bgp
->inst_type
== BGP_INSTANCE_TYPE_DEFAULT
) ? "Default" : bgp
->name
,
8935 update_group_show(bgp
, afi
, safi
, vty
, 0);
8940 bgp_show_update_groups(struct vty
*vty
, const char *name
,
8948 if (strmatch (name
, "all"))
8950 bgp_show_all_instances_updgrps_vty (vty
, afi
, safi
);
8955 bgp
= bgp_lookup_by_name (name
);
8960 bgp
= bgp_get_default ();
8964 update_group_show(bgp
, afi
, safi
, vty
, subgrp_id
);
8968 DEFUN (show_ip_bgp_updgrps
,
8969 show_ip_bgp_updgrps_cmd
,
8970 "show [ip] bgp [<view|vrf> WORD] ["BGP_AFI_CMD_STR
" ["BGP_SAFI_CMD_STR
"]] update-groups [SUBGROUP-ID]",
8974 BGP_INSTANCE_HELP_STR
8977 "Detailed info about dynamic update groups\n"
8978 "Specific subgroup to display detailed info for\n")
8981 afi_t afi
= AFI_IP6
;
8982 safi_t safi
= SAFI_UNICAST
;
8983 uint64_t subgrp_id
= 0;
8988 if (argv_find (argv
, argc
, "ip", &idx
))
8990 /* [<view|vrf> WORD] */
8991 if (argv_find (argv
, argc
, "view", &idx
) || argv_find (argv
, argc
, "vrf", &idx
))
8992 vrf
= argv
[++idx
]->arg
;
8993 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
8994 if (argv_find_and_parse_afi (argv
, argc
, &idx
, &afi
))
8996 argv_find_and_parse_safi (argv
, argc
, &idx
, &safi
);
8999 /* get subgroup id, if provided */
9001 if (argv
[idx
]->type
== VARIABLE_TKN
)
9002 VTY_GET_ULL("subgroup-id", subgrp_id
, argv
[idx
]->arg
);
9004 return (bgp_show_update_groups(vty
, vrf
, afi
, safi
, subgrp_id
));
9007 DEFUN (show_bgp_instance_all_ipv6_updgrps
,
9008 show_bgp_instance_all_ipv6_updgrps_cmd
,
9009 "show [ip] bgp <view|vrf> all update-groups",
9013 BGP_INSTANCE_ALL_HELP_STR
9014 "Detailed info about dynamic update groups\n")
9016 bgp_show_all_instances_updgrps_vty (vty
, AFI_IP6
, SAFI_UNICAST
);
9020 DEFUN (show_bgp_updgrps_stats
,
9021 show_bgp_updgrps_stats_cmd
,
9022 "show [ip] bgp update-groups statistics",
9026 "Detailed info about dynamic update groups\n"
9031 bgp
= bgp_get_default();
9033 update_group_show_stats(bgp
, vty
);
9038 DEFUN (show_bgp_instance_updgrps_stats
,
9039 show_bgp_instance_updgrps_stats_cmd
,
9040 "show [ip] bgp <view|vrf> WORD update-groups statistics",
9044 BGP_INSTANCE_HELP_STR
9045 "Detailed info about dynamic update groups\n"
9051 bgp
= bgp_lookup_by_name (argv
[idx_word
]->arg
);
9053 update_group_show_stats(bgp
, vty
);
9059 show_bgp_updgrps_adj_info_aux (struct vty
*vty
, const char *name
,
9060 afi_t afi
, safi_t safi
,
9061 const char *what
, uint64_t subgrp_id
)
9066 bgp
= bgp_lookup_by_name (name
);
9068 bgp
= bgp_get_default ();
9072 if (!strcmp(what
, "advertise-queue"))
9073 update_group_show_adj_queue(bgp
, afi
, safi
, vty
, subgrp_id
);
9074 else if (!strcmp(what
, "advertised-routes"))
9075 update_group_show_advertised(bgp
, afi
, safi
, vty
, subgrp_id
);
9076 else if (!strcmp(what
, "packet-queue"))
9077 update_group_show_packet_queue(bgp
, afi
, safi
, vty
, subgrp_id
);
9081 DEFUN (show_ip_bgp_updgrps_adj
,
9082 show_ip_bgp_updgrps_adj_cmd
,
9083 "show [ip] bgp update-groups <advertise-queue|advertised-routes|packet-queue>",
9087 "Detailed info about dynamic update groups\n"
9088 "Advertisement queue\n"
9089 "Announced routes\n"
9094 show_bgp_updgrps_adj_info_aux(vty
, NULL
, AFI_IP
, SAFI_UNICAST
, argv
[idx_type
]->arg
, 0);
9098 DEFUN (show_ip_bgp_instance_updgrps_adj
,
9099 show_ip_bgp_instance_updgrps_adj_cmd
,
9100 "show [ip] bgp <view|vrf> WORD update-groups <advertise-queue|advertised-routes|packet-queue>",
9104 BGP_INSTANCE_HELP_STR
9105 "Detailed info about dynamic update groups\n"
9106 "Advertisement queue\n"
9107 "Announced routes\n"
9113 show_bgp_updgrps_adj_info_aux(vty
, argv
[idx_word
]->arg
, AFI_IP
, SAFI_UNICAST
, argv
[idx_type
]->arg
, 0);
9117 DEFUN (show_bgp_updgrps_afi_adj
,
9118 show_bgp_updgrps_afi_adj_cmd
,
9119 "show [ip] bgp "BGP_AFI_SAFI_CMD_STR
" update-groups <advertise-queue|advertised-routes|packet-queue>",
9123 BGP_AFI_SAFI_HELP_STR
9124 "Detailed info about dynamic update groups\n"
9125 "Advertisement queue\n"
9126 "Announced routes\n"
9128 "Specific subgroup info wanted for\n")
9133 show_bgp_updgrps_adj_info_aux(vty
, NULL
,
9134 bgp_vty_afi_from_arg(argv
[idx_afi
]->arg
),
9135 bgp_vty_safi_from_arg(argv
[idx_safi
]->arg
),
9136 argv
[idx_type
]->arg
, 0);
9140 DEFUN (show_bgp_updgrps_adj
,
9141 show_bgp_updgrps_adj_cmd
,
9142 "show [ip] bgp update-groups <advertise-queue|advertised-routes|packet-queue>",
9146 "Detailed info about dynamic update groups\n"
9147 "Advertisement queue\n"
9148 "Announced routes\n"
9152 show_bgp_updgrps_adj_info_aux(vty
, NULL
, AFI_IP6
, SAFI_UNICAST
, argv
[idx_type
]->arg
, 0);
9156 DEFUN (show_bgp_instance_updgrps_adj
,
9157 show_bgp_instance_updgrps_adj_cmd
,
9158 "show [ip] bgp <view|vrf> WORD update-groups <advertise-queue|advertised-routes|packet-queue>",
9162 BGP_INSTANCE_HELP_STR
9163 "Detailed info about dynamic update groups\n"
9164 "Advertisement queue\n"
9165 "Announced routes\n"
9170 show_bgp_updgrps_adj_info_aux(vty
, argv
[idx_word
]->arg
, AFI_IP6
, SAFI_UNICAST
, argv
[idx_type
]->arg
, 0);
9174 DEFUN (show_ip_bgp_updgrps_adj_s
,
9175 show_ip_bgp_updgrps_adj_s_cmd
,
9176 "show [ip] bgp update-groups SUBGROUP-ID <advertise-queue|advertised-routes|packet-queue>",
9180 "Detailed info about dynamic update groups\n"
9181 "Specific subgroup to display info for\n"
9182 "Advertisement queue\n"
9183 "Announced routes\n"
9187 int idx_subgroup_id
= 4;
9191 VTY_GET_ULL("subgroup-id", subgrp_id
, argv
[idx_subgroup_id
]->arg
);
9193 show_bgp_updgrps_adj_info_aux(vty
, NULL
, AFI_IP
, SAFI_UNICAST
, argv
[idx_type
]->arg
, subgrp_id
);
9197 DEFUN (show_ip_bgp_instance_updgrps_adj_s
,
9198 show_ip_bgp_instance_updgrps_adj_s_cmd
,
9199 "show [ip] bgp <view|vrf> WORD update-groups SUBGROUP-ID <advertise-queue|advertised-routes|packet-queue>",
9203 BGP_INSTANCE_HELP_STR
9204 "Detailed info about dynamic update groups\n"
9205 "Specific subgroup to display info for\n"
9206 "Advertisement queue\n"
9207 "Announced routes\n"
9212 int idx_subgroup_id
= 6;
9216 VTY_GET_ULL("subgroup-id", subgrp_id
, argv
[idx_subgroup_id
]->arg
);
9218 show_bgp_updgrps_adj_info_aux(vty
, argv
[idx_vrf
]->arg
, AFI_IP
, SAFI_UNICAST
, argv
[idx_type
]->arg
, subgrp_id
);
9222 DEFUN (show_bgp_updgrps_afi_adj_s
,
9223 show_bgp_updgrps_afi_adj_s_cmd
,
9224 "show [ip] bgp "BGP_AFI_SAFI_CMD_STR
" update-groups SUBGROUP-ID <advertise-queue|advertised-routes|packet-queue>",
9228 BGP_AFI_SAFI_HELP_STR
9229 "Detailed info about dynamic update groups\n"
9230 "Specific subgroup to display info for\n"
9231 "Advertisement queue\n"
9232 "Announced routes\n"
9234 "Specific subgroup info wanted for\n")
9238 int idx_subgroup_id
= 5;
9242 VTY_GET_ULL("subgroup-id", subgrp_id
, argv
[idx_subgroup_id
]->arg
);
9244 show_bgp_updgrps_adj_info_aux(vty
, NULL
,
9245 bgp_vty_afi_from_arg(argv
[idx_afi
]->arg
),
9246 bgp_vty_safi_from_arg(argv
[idx_safi
]->arg
),
9247 argv
[idx_type
]->arg
, subgrp_id
);
9251 DEFUN (show_bgp_updgrps_adj_s
,
9252 show_bgp_updgrps_adj_s_cmd
,
9253 "show [ip] bgp update-groups SUBGROUP-ID <advertise-queue|advertised-routes|packet-queue>",
9257 "Detailed info about dynamic update groups\n"
9258 "Specific subgroup to display info for\n"
9259 "Advertisement queue\n"
9260 "Announced routes\n"
9263 int idx_subgroup_id
= 3;
9267 VTY_GET_ULL("subgroup-id", subgrp_id
, argv
[idx_subgroup_id
]->arg
);
9269 show_bgp_updgrps_adj_info_aux(vty
, NULL
, AFI_IP6
, SAFI_UNICAST
, argv
[idx_type
]->arg
, subgrp_id
);
9273 DEFUN (show_bgp_instance_updgrps_adj_s
,
9274 show_bgp_instance_updgrps_adj_s_cmd
,
9275 "show [ip] bgp <view|vrf> WORD update-groups SUBGROUP-ID <advertise-queue|advertised-routes|packet-queue>",
9279 BGP_INSTANCE_HELP_STR
9280 "Detailed info about dynamic update groups\n"
9281 "Specific subgroup to display info for\n"
9282 "Advertisement queue\n"
9283 "Announced routes\n"
9287 int idx_subgroup_id
= 5;
9291 VTY_GET_ULL("subgroup-id", subgrp_id
, argv
[idx_subgroup_id
]->arg
);
9293 show_bgp_updgrps_adj_info_aux(vty
, argv
[idx_vrf
]->arg
, AFI_IP6
, SAFI_UNICAST
, argv
[idx_type
]->arg
, subgrp_id
);
9300 bgp_show_one_peer_group (struct vty
*vty
, struct peer_group
*group
)
9302 struct listnode
*node
, *nnode
;
9303 struct prefix
*range
;
9306 char buf
[PREFIX2STR_BUFFER
];
9309 const char *peer_status
;
9317 if (conf
->as_type
== AS_SPECIFIED
||
9318 conf
->as_type
== AS_EXTERNAL
) {
9319 vty_out (vty
, "%sBGP peer-group %s, remote AS %d%s",
9320 VTY_NEWLINE
, group
->name
, conf
->as
, VTY_NEWLINE
);
9321 } else if (conf
->as_type
== AS_INTERNAL
) {
9322 vty_out (vty
, "%sBGP peer-group %s, remote AS %d%s",
9323 VTY_NEWLINE
, group
->name
, group
->bgp
->as
, VTY_NEWLINE
);
9325 vty_out (vty
, "%sBGP peer-group %s%s",
9326 VTY_NEWLINE
, group
->name
, VTY_NEWLINE
);
9329 if ((group
->bgp
->as
== conf
->as
) || (conf
->as_type
== AS_INTERNAL
))
9330 vty_out (vty
, " Peer-group type is internal%s", VTY_NEWLINE
);
9332 vty_out (vty
, " Peer-group type is external%s", VTY_NEWLINE
);
9334 /* Display AFs configured. */
9335 vty_out (vty
, " Configured address-families:");
9336 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
9337 for (safi
= SAFI_UNICAST
; safi
< SAFI_MAX
; safi
++)
9339 if (conf
->afc
[afi
][safi
])
9342 vty_out (vty
, " %s;", afi_safi_print(afi
, safi
));
9346 vty_out (vty
, " none%s", VTY_NEWLINE
);
9348 vty_out (vty
, "%s", VTY_NEWLINE
);
9350 /* Display listen ranges (for dynamic neighbors), if any */
9351 for (afi
= AFI_IP
; afi
< AFI_MAX
; afi
++)
9355 else if (afi
== AFI_IP6
)
9359 lr_count
= listcount(group
->listen_range
[afi
]);
9363 " %d %s listen range(s)%s",
9364 lr_count
, af_str
, VTY_NEWLINE
);
9367 for (ALL_LIST_ELEMENTS (group
->listen_range
[afi
], node
,
9370 prefix2str(range
, buf
, sizeof(buf
));
9371 vty_out(vty
, " %s%s", buf
, VTY_NEWLINE
);
9376 /* Display group members and their status */
9377 if (listcount(group
->peer
))
9379 vty_out (vty
, " Peer-group members:%s", VTY_NEWLINE
);
9380 for (ALL_LIST_ELEMENTS (group
->peer
, node
, nnode
, peer
))
9382 if (CHECK_FLAG (peer
->flags
, PEER_FLAG_SHUTDOWN
))
9383 peer_status
= "Idle (Admin)";
9384 else if (CHECK_FLAG (peer
->sflags
, PEER_STATUS_PREFIX_OVERFLOW
))
9385 peer_status
= "Idle (PfxCt)";
9387 peer_status
= LOOKUP(bgp_status_msg
, peer
->status
);
9389 dynamic
= peer_dynamic_neighbor(peer
);
9390 vty_out (vty
, " %s %s %s %s",
9391 peer
->host
, dynamic
? "(dynamic)" : "",
9392 peer_status
, VTY_NEWLINE
);
9399 /* Show BGP peer group's information. */
9400 enum show_group_type
9407 bgp_show_peer_group (struct vty
*vty
, struct bgp
*bgp
,
9408 enum show_group_type type
, const char *group_name
)
9410 struct listnode
*node
, *nnode
;
9411 struct peer_group
*group
;
9414 for (ALL_LIST_ELEMENTS (bgp
->group
, node
, nnode
, group
))
9418 case show_all_groups
:
9419 bgp_show_one_peer_group (vty
, group
);
9421 case show_peer_group
:
9422 if (group_name
&& (strcmp(group
->name
, group_name
) == 0))
9425 bgp_show_one_peer_group (vty
, group
);
9431 if (type
== show_peer_group
&& ! find
)
9432 vty_out (vty
, "%% No such peer-group%s", VTY_NEWLINE
);
9438 bgp_show_peer_group_vty (struct vty
*vty
, const char *name
,
9439 enum show_group_type type
, const char *group_name
)
9442 int ret
= CMD_SUCCESS
;
9445 bgp
= bgp_lookup_by_name (name
);
9447 bgp
= bgp_get_default ();
9451 vty_out (vty
, "%% No such BGP instance exist%s", VTY_NEWLINE
);
9455 ret
= bgp_show_peer_group (vty
, bgp
, type
, group_name
);
9460 DEFUN (show_ip_bgp_peer_groups
,
9461 show_ip_bgp_peer_groups_cmd
,
9462 "show [ip] bgp [<view|vrf> WORD] peer-group [PGNAME]",
9466 BGP_INSTANCE_HELP_STR
9467 "Detailed information on BGP peer groups\n"
9468 "Peer group name\n")
9474 vrf
= argv_find (argv
, argc
, "WORD", &idx
) ? argv
[idx
]->arg
: NULL
;
9475 pg
= argv_find (argv
, argc
, "PGNAME", &idx
) ? argv
[idx
]->arg
: NULL
;
9477 return bgp_show_peer_group_vty (vty
, vrf
, show_all_groups
, pg
);
9481 /* Redistribute VTY commands. */
9483 DEFUN (bgp_redistribute_ipv4
,
9484 bgp_redistribute_ipv4_cmd
,
9485 "redistribute " FRR_IP_REDIST_STR_BGPD
,
9486 "Redistribute information from another routing protocol\n"
9487 FRR_IP_REDIST_HELP_STR_BGPD
)
9489 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9490 int idx_protocol
= 1;
9493 type
= proto_redistnum (AFI_IP
, argv
[idx_protocol
]->text
);
9496 vty_out (vty
, "%% Invalid route type%s", VTY_NEWLINE
);
9499 bgp_redist_add(bgp
, AFI_IP
, type
, 0);
9500 return bgp_redistribute_set (bgp
, AFI_IP
, type
, 0);
9503 DEFUN (bgp_redistribute_ipv4_rmap
,
9504 bgp_redistribute_ipv4_rmap_cmd
,
9505 "redistribute " FRR_IP_REDIST_STR_BGPD
" route-map WORD",
9506 "Redistribute information from another routing protocol\n"
9507 FRR_IP_REDIST_HELP_STR_BGPD
9508 "Route map reference\n"
9509 "Pointer to route-map entries\n")
9511 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9512 int idx_protocol
= 1;
9515 struct bgp_redist
*red
;
9517 type
= proto_redistnum (AFI_IP
, argv
[idx_protocol
]->text
);
9520 vty_out (vty
, "%% Invalid route type%s", VTY_NEWLINE
);
9524 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
9525 bgp_redistribute_rmap_set (red
, argv
[idx_word
]->arg
);
9526 return bgp_redistribute_set (bgp
, AFI_IP
, type
, 0);
9529 DEFUN (bgp_redistribute_ipv4_metric
,
9530 bgp_redistribute_ipv4_metric_cmd
,
9531 "redistribute " FRR_IP_REDIST_STR_BGPD
" metric (0-4294967295)",
9532 "Redistribute information from another routing protocol\n"
9533 FRR_IP_REDIST_HELP_STR_BGPD
9534 "Metric for redistributed routes\n"
9537 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9538 int idx_protocol
= 1;
9542 struct bgp_redist
*red
;
9544 type
= proto_redistnum (AFI_IP
, argv
[idx_protocol
]->text
);
9547 vty_out (vty
, "%% Invalid route type%s", VTY_NEWLINE
);
9550 VTY_GET_INTEGER ("metric", metric
, argv
[idx_number
]->arg
);
9552 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
9553 bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, type
, metric
);
9554 return bgp_redistribute_set (bgp
, AFI_IP
, type
, 0);
9557 DEFUN (bgp_redistribute_ipv4_rmap_metric
,
9558 bgp_redistribute_ipv4_rmap_metric_cmd
,
9559 "redistribute " FRR_IP_REDIST_STR_BGPD
" route-map WORD metric (0-4294967295)",
9560 "Redistribute information from another routing protocol\n"
9561 FRR_IP_REDIST_HELP_STR_BGPD
9562 "Route map reference\n"
9563 "Pointer to route-map entries\n"
9564 "Metric for redistributed routes\n"
9567 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9568 int idx_protocol
= 1;
9573 struct bgp_redist
*red
;
9575 type
= proto_redistnum (AFI_IP
, argv
[idx_protocol
]->text
);
9578 vty_out (vty
, "%% Invalid route type%s", VTY_NEWLINE
);
9581 VTY_GET_INTEGER ("metric", metric
, argv
[idx_number
]->arg
);
9583 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
9584 bgp_redistribute_rmap_set (red
, argv
[idx_word
]->arg
);
9585 bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, type
, metric
);
9586 return bgp_redistribute_set (bgp
, AFI_IP
, type
, 0);
9589 DEFUN (bgp_redistribute_ipv4_metric_rmap
,
9590 bgp_redistribute_ipv4_metric_rmap_cmd
,
9591 "redistribute " FRR_IP_REDIST_STR_BGPD
" metric (0-4294967295) route-map WORD",
9592 "Redistribute information from another routing protocol\n"
9593 FRR_IP_REDIST_HELP_STR_BGPD
9594 "Metric for redistributed routes\n"
9596 "Route map reference\n"
9597 "Pointer to route-map entries\n")
9599 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9600 int idx_protocol
= 1;
9605 struct bgp_redist
*red
;
9607 type
= proto_redistnum (AFI_IP
, argv
[idx_protocol
]->text
);
9610 vty_out (vty
, "%% Invalid route type%s", VTY_NEWLINE
);
9613 VTY_GET_INTEGER ("metric", metric
, argv
[idx_number
]->arg
);
9615 red
= bgp_redist_add(bgp
, AFI_IP
, type
, 0);
9616 bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, type
, metric
);
9617 bgp_redistribute_rmap_set (red
, argv
[idx_word
]->arg
);
9618 return bgp_redistribute_set (bgp
, AFI_IP
, type
, 0);
9621 DEFUN (bgp_redistribute_ipv4_ospf
,
9622 bgp_redistribute_ipv4_ospf_cmd
,
9623 "redistribute <ospf|table> (1-65535)",
9624 "Redistribute information from another routing protocol\n"
9625 "Open Shortest Path First (OSPFv2)\n"
9626 "Non-main Kernel Routing Table\n"
9627 "Instance ID/Table ID\n")
9629 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9630 int idx_ospf_table
= 1;
9635 VTY_GET_INTEGER ("Instance ID", instance
, argv
[idx_number
]->arg
);
9637 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
9638 protocol
= ZEBRA_ROUTE_OSPF
;
9640 protocol
= ZEBRA_ROUTE_TABLE
;
9642 bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
9643 return bgp_redistribute_set (bgp
, AFI_IP
, protocol
, instance
);
9646 DEFUN (bgp_redistribute_ipv4_ospf_rmap
,
9647 bgp_redistribute_ipv4_ospf_rmap_cmd
,
9648 "redistribute <ospf|table> (1-65535) route-map WORD",
9649 "Redistribute information from another routing protocol\n"
9650 "Open Shortest Path First (OSPFv2)\n"
9651 "Non-main Kernel Routing Table\n"
9652 "Instance ID/Table ID\n"
9653 "Route map reference\n"
9654 "Pointer to route-map entries\n")
9656 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9657 int idx_ospf_table
= 1;
9660 struct bgp_redist
*red
;
9664 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
9665 protocol
= ZEBRA_ROUTE_OSPF
;
9667 protocol
= ZEBRA_ROUTE_TABLE
;
9669 VTY_GET_INTEGER ("Instance ID", instance
, argv
[idx_number
]->arg
);
9670 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
9671 bgp_redistribute_rmap_set (red
, argv
[idx_word
]->arg
);
9672 return bgp_redistribute_set (bgp
, AFI_IP
, protocol
, instance
);
9675 DEFUN (bgp_redistribute_ipv4_ospf_metric
,
9676 bgp_redistribute_ipv4_ospf_metric_cmd
,
9677 "redistribute <ospf|table> (1-65535) metric (0-4294967295)",
9678 "Redistribute information from another routing protocol\n"
9679 "Open Shortest Path First (OSPFv2)\n"
9680 "Non-main Kernel Routing Table\n"
9681 "Instance ID/Table ID\n"
9682 "Metric for redistributed routes\n"
9685 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9686 int idx_ospf_table
= 1;
9688 int idx_number_2
= 4;
9690 struct bgp_redist
*red
;
9694 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
9695 protocol
= ZEBRA_ROUTE_OSPF
;
9697 protocol
= ZEBRA_ROUTE_TABLE
;
9699 VTY_GET_INTEGER ("Instance ID", instance
, argv
[idx_number
]->arg
);
9700 VTY_GET_INTEGER ("metric", metric
, argv
[idx_number_2
]->arg
);
9702 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
9703 bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, protocol
, metric
);
9704 return bgp_redistribute_set (bgp
, AFI_IP
, protocol
, instance
);
9707 DEFUN (bgp_redistribute_ipv4_ospf_rmap_metric
,
9708 bgp_redistribute_ipv4_ospf_rmap_metric_cmd
,
9709 "redistribute <ospf|table> (1-65535) route-map WORD metric (0-4294967295)",
9710 "Redistribute information from another routing protocol\n"
9711 "Open Shortest Path First (OSPFv2)\n"
9712 "Non-main Kernel Routing Table\n"
9713 "Instance ID/Table ID\n"
9714 "Route map reference\n"
9715 "Pointer to route-map entries\n"
9716 "Metric for redistributed routes\n"
9719 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9720 int idx_ospf_table
= 1;
9723 int idx_number_2
= 6;
9725 struct bgp_redist
*red
;
9729 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
9730 protocol
= ZEBRA_ROUTE_OSPF
;
9732 protocol
= ZEBRA_ROUTE_TABLE
;
9734 VTY_GET_INTEGER ("Instance ID", instance
, argv
[idx_number
]->arg
);
9735 VTY_GET_INTEGER ("metric", metric
, argv
[idx_number_2
]->arg
);
9737 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
9738 bgp_redistribute_rmap_set (red
, argv
[idx_word
]->arg
);
9739 bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, protocol
, metric
);
9740 return bgp_redistribute_set (bgp
, AFI_IP
, protocol
, instance
);
9743 DEFUN (bgp_redistribute_ipv4_ospf_metric_rmap
,
9744 bgp_redistribute_ipv4_ospf_metric_rmap_cmd
,
9745 "redistribute <ospf|table> (1-65535) metric (0-4294967295) route-map WORD",
9746 "Redistribute information from another routing protocol\n"
9747 "Open Shortest Path First (OSPFv2)\n"
9748 "Non-main Kernel Routing Table\n"
9749 "Instance ID/Table ID\n"
9750 "Metric for redistributed routes\n"
9752 "Route map reference\n"
9753 "Pointer to route-map entries\n")
9755 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9756 int idx_ospf_table
= 1;
9758 int idx_number_2
= 4;
9761 struct bgp_redist
*red
;
9765 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
9766 protocol
= ZEBRA_ROUTE_OSPF
;
9768 protocol
= ZEBRA_ROUTE_TABLE
;
9770 VTY_GET_INTEGER ("Instance ID", instance
, argv
[idx_number
]->arg
);
9771 VTY_GET_INTEGER ("metric", metric
, argv
[idx_number_2
]->arg
);
9773 red
= bgp_redist_add(bgp
, AFI_IP
, protocol
, instance
);
9774 bgp_redistribute_metric_set(bgp
, red
, AFI_IP
, protocol
, metric
);
9775 bgp_redistribute_rmap_set (red
, argv
[idx_word
]->arg
);
9776 return bgp_redistribute_set (bgp
, AFI_IP
, protocol
, instance
);
9779 DEFUN (no_bgp_redistribute_ipv4_ospf
,
9780 no_bgp_redistribute_ipv4_ospf_cmd
,
9781 "no redistribute <ospf|table> (1-65535) [metric (0-4294967295)] [route-map WORD]",
9783 "Redistribute information from another routing protocol\n"
9784 "Open Shortest Path First (OSPFv2)\n"
9785 "Non-main Kernel Routing Table\n"
9786 "Instance ID/Table ID\n"
9787 "Metric for redistributed routes\n"
9789 "Route map reference\n"
9790 "Pointer to route-map entries\n")
9792 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9793 int idx_ospf_table
= 2;
9798 if (strncmp(argv
[idx_ospf_table
]->arg
, "o", 1) == 0)
9799 protocol
= ZEBRA_ROUTE_OSPF
;
9801 protocol
= ZEBRA_ROUTE_TABLE
;
9803 VTY_GET_INTEGER ("Instance ID", instance
, argv
[idx_number
]->arg
);
9804 return bgp_redistribute_unset (bgp
, AFI_IP
, protocol
, instance
);
9807 DEFUN (no_bgp_redistribute_ipv4
,
9808 no_bgp_redistribute_ipv4_cmd
,
9809 "no redistribute " FRR_IP_REDIST_STR_BGPD
" [metric (0-4294967295)] [route-map WORD]",
9811 "Redistribute information from another routing protocol\n"
9812 FRR_IP_REDIST_HELP_STR_BGPD
9813 "Metric for redistributed routes\n"
9815 "Route map reference\n"
9816 "Pointer to route-map entries\n")
9818 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9819 int idx_protocol
= 2;
9822 type
= proto_redistnum (AFI_IP
, argv
[idx_protocol
]->text
);
9825 vty_out (vty
, "%% Invalid route type%s", VTY_NEWLINE
);
9828 return bgp_redistribute_unset (bgp
, AFI_IP
, type
, 0);
9831 DEFUN (bgp_redistribute_ipv6
,
9832 bgp_redistribute_ipv6_cmd
,
9833 "redistribute " FRR_IP6_REDIST_STR_BGPD
,
9834 "Redistribute information from another routing protocol\n"
9835 FRR_IP6_REDIST_HELP_STR_BGPD
)
9837 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9838 int idx_protocol
= 1;
9841 type
= proto_redistnum (AFI_IP6
, argv
[idx_protocol
]->text
);
9844 vty_out (vty
, "%% Invalid route type%s", VTY_NEWLINE
);
9848 bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
9849 return bgp_redistribute_set (bgp
, AFI_IP6
, type
, 0);
9852 DEFUN (bgp_redistribute_ipv6_rmap
,
9853 bgp_redistribute_ipv6_rmap_cmd
,
9854 "redistribute " FRR_IP6_REDIST_STR_BGPD
" route-map WORD",
9855 "Redistribute information from another routing protocol\n"
9856 FRR_IP6_REDIST_HELP_STR_BGPD
9857 "Route map reference\n"
9858 "Pointer to route-map entries\n")
9860 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9861 int idx_protocol
= 1;
9864 struct bgp_redist
*red
;
9866 type
= proto_redistnum (AFI_IP6
, argv
[idx_protocol
]->text
);
9869 vty_out (vty
, "%% Invalid route type%s", VTY_NEWLINE
);
9873 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
9874 bgp_redistribute_rmap_set (red
, argv
[idx_word
]->arg
);
9875 return bgp_redistribute_set (bgp
, AFI_IP6
, type
, 0);
9878 DEFUN (bgp_redistribute_ipv6_metric
,
9879 bgp_redistribute_ipv6_metric_cmd
,
9880 "redistribute " FRR_IP6_REDIST_STR_BGPD
" metric (0-4294967295)",
9881 "Redistribute information from another routing protocol\n"
9882 FRR_IP6_REDIST_HELP_STR_BGPD
9883 "Metric for redistributed routes\n"
9886 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9887 int idx_protocol
= 1;
9891 struct bgp_redist
*red
;
9893 type
= proto_redistnum (AFI_IP6
, argv
[idx_protocol
]->text
);
9896 vty_out (vty
, "%% Invalid route type%s", VTY_NEWLINE
);
9899 VTY_GET_INTEGER ("metric", metric
, argv
[idx_number
]->arg
);
9901 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
9902 bgp_redistribute_metric_set(bgp
, red
, AFI_IP6
, type
, metric
);
9903 return bgp_redistribute_set (bgp
, AFI_IP6
, type
, 0);
9906 DEFUN (bgp_redistribute_ipv6_rmap_metric
,
9907 bgp_redistribute_ipv6_rmap_metric_cmd
,
9908 "redistribute " FRR_IP6_REDIST_STR_BGPD
" route-map WORD metric (0-4294967295)",
9909 "Redistribute information from another routing protocol\n"
9910 FRR_IP6_REDIST_HELP_STR_BGPD
9911 "Route map reference\n"
9912 "Pointer to route-map entries\n"
9913 "Metric for redistributed routes\n"
9916 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9917 int idx_protocol
= 1;
9922 struct bgp_redist
*red
;
9924 type
= proto_redistnum (AFI_IP6
, argv
[idx_protocol
]->text
);
9927 vty_out (vty
, "%% Invalid route type%s", VTY_NEWLINE
);
9930 VTY_GET_INTEGER ("metric", metric
, argv
[idx_number
]->arg
);
9932 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
9933 bgp_redistribute_rmap_set (red
, argv
[idx_word
]->arg
);
9934 bgp_redistribute_metric_set(bgp
, red
, AFI_IP6
, type
, metric
);
9935 return bgp_redistribute_set (bgp
, AFI_IP6
, type
, 0);
9938 DEFUN (bgp_redistribute_ipv6_metric_rmap
,
9939 bgp_redistribute_ipv6_metric_rmap_cmd
,
9940 "redistribute " FRR_IP6_REDIST_STR_BGPD
" metric (0-4294967295) route-map WORD",
9941 "Redistribute information from another routing protocol\n"
9942 FRR_IP6_REDIST_HELP_STR_BGPD
9943 "Metric for redistributed routes\n"
9945 "Route map reference\n"
9946 "Pointer to route-map entries\n")
9948 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9949 int idx_protocol
= 1;
9954 struct bgp_redist
*red
;
9956 type
= proto_redistnum (AFI_IP6
, argv
[idx_protocol
]->text
);
9959 vty_out (vty
, "%% Invalid route type%s", VTY_NEWLINE
);
9962 VTY_GET_INTEGER ("metric", metric
, argv
[idx_number
]->arg
);
9964 red
= bgp_redist_add(bgp
, AFI_IP6
, type
, 0);
9965 bgp_redistribute_metric_set(bgp
, red
, AFI_IP6
, SAFI_UNICAST
, metric
);
9966 bgp_redistribute_rmap_set (red
, argv
[idx_word
]->arg
);
9967 return bgp_redistribute_set (bgp
, AFI_IP6
, type
, 0);
9970 DEFUN (no_bgp_redistribute_ipv6
,
9971 no_bgp_redistribute_ipv6_cmd
,
9972 "no redistribute " FRR_IP6_REDIST_STR_BGPD
" [metric (0-4294967295)] [route-map WORD]",
9974 "Redistribute information from another routing protocol\n"
9975 FRR_IP6_REDIST_HELP_STR_BGPD
9976 "Metric for redistributed routes\n"
9978 "Route map reference\n"
9979 "Pointer to route-map entries\n")
9981 VTY_DECLVAR_CONTEXT(bgp
, bgp
);
9982 int idx_protocol
= 2;
9985 type
= proto_redistnum (AFI_IP6
, argv
[idx_protocol
]->text
);
9988 vty_out (vty
, "%% Invalid route type%s", VTY_NEWLINE
);
9992 return bgp_redistribute_unset (bgp
, AFI_IP6
, type
, 0);
9996 bgp_config_write_redistribute (struct vty
*vty
, struct bgp
*bgp
, afi_t afi
,
9997 safi_t safi
, int *write
)
10001 /* Unicast redistribution only. */
10002 if (safi
!= SAFI_UNICAST
)
10005 for (i
= 0; i
< ZEBRA_ROUTE_MAX
; i
++)
10007 /* Redistribute BGP does not make sense. */
10008 if (i
!= ZEBRA_ROUTE_BGP
)
10010 struct list
*red_list
;
10011 struct listnode
*node
;
10012 struct bgp_redist
*red
;
10014 red_list
= bgp
->redist
[afi
][i
];
10018 for (ALL_LIST_ELEMENTS_RO(red_list
, node
, red
))
10020 /* Display "address-family" when it is not yet diplayed. */
10021 bgp_config_write_family_header (vty
, afi
, safi
, write
);
10023 /* "redistribute" configuration. */
10024 vty_out (vty
, " redistribute %s", zebra_route_string(i
));
10026 vty_out (vty
, " %d", red
->instance
);
10027 if (red
->redist_metric_flag
)
10028 vty_out (vty
, " metric %u", red
->redist_metric
);
10029 if (red
->rmap
.name
)
10030 vty_out (vty
, " route-map %s", red
->rmap
.name
);
10031 vty_out (vty
, "%s", VTY_NEWLINE
);
10038 /* BGP node structure. */
10039 static struct cmd_node bgp_node
=
10042 "%s(config-router)# ",
10046 static struct cmd_node bgp_ipv4_unicast_node
=
10049 "%s(config-router-af)# ",
10053 static struct cmd_node bgp_ipv4_multicast_node
=
10056 "%s(config-router-af)# ",
10060 static struct cmd_node bgp_ipv6_unicast_node
=
10063 "%s(config-router-af)# ",
10067 static struct cmd_node bgp_ipv6_multicast_node
=
10070 "%s(config-router-af)# ",
10074 static struct cmd_node bgp_vpnv4_node
=
10077 "%s(config-router-af)# ",
10081 static struct cmd_node bgp_vpnv6_node
=
10084 "%s(config-router-af-vpnv6)# ",
10088 static struct cmd_node bgp_encap_node
=
10091 "%s(config-router-af-encap)# ",
10095 static struct cmd_node bgp_encapv6_node
=
10098 "%s(config-router-af-encapv6)# ",
10102 static struct cmd_node bgp_evpn_node
=
10105 "%s(config-router-evpn)# ",
10109 static void community_list_vty (void);
10112 bgp_vty_init (void)
10114 /* Install bgp top node. */
10115 install_node (&bgp_node
, bgp_config_write
);
10116 install_node (&bgp_ipv4_unicast_node
, NULL
);
10117 install_node (&bgp_ipv4_multicast_node
, NULL
);
10118 install_node (&bgp_ipv6_unicast_node
, NULL
);
10119 install_node (&bgp_ipv6_multicast_node
, NULL
);
10120 install_node (&bgp_vpnv4_node
, NULL
);
10121 install_node (&bgp_vpnv6_node
, NULL
);
10122 install_node (&bgp_encap_node
, NULL
);
10123 install_node (&bgp_encapv6_node
, NULL
);
10124 install_node (&bgp_evpn_node
, NULL
);
10126 /* Install default VTY commands to new nodes. */
10127 install_default (BGP_NODE
);
10128 install_default (BGP_IPV4_NODE
);
10129 install_default (BGP_IPV4M_NODE
);
10130 install_default (BGP_IPV6_NODE
);
10131 install_default (BGP_IPV6M_NODE
);
10132 install_default (BGP_VPNV4_NODE
);
10133 install_default (BGP_VPNV6_NODE
);
10134 install_default (BGP_ENCAP_NODE
);
10135 install_default (BGP_ENCAPV6_NODE
);
10136 install_default (BGP_EVPN_NODE
);
10138 /* "bgp multiple-instance" commands. */
10139 install_element (CONFIG_NODE
, &bgp_multiple_instance_cmd
);
10140 install_element (CONFIG_NODE
, &no_bgp_multiple_instance_cmd
);
10142 /* "bgp config-type" commands. */
10143 install_element (CONFIG_NODE
, &bgp_config_type_cmd
);
10144 install_element (CONFIG_NODE
, &no_bgp_config_type_cmd
);
10146 /* bgp route-map delay-timer commands. */
10147 install_element (CONFIG_NODE
, &bgp_set_route_map_delay_timer_cmd
);
10148 install_element (CONFIG_NODE
, &no_bgp_set_route_map_delay_timer_cmd
);
10150 /* Dummy commands (Currently not supported) */
10151 install_element (BGP_NODE
, &no_synchronization_cmd
);
10152 install_element (BGP_NODE
, &no_auto_summary_cmd
);
10154 /* "router bgp" commands. */
10155 install_element (CONFIG_NODE
, &router_bgp_cmd
);
10157 /* "no router bgp" commands. */
10158 install_element (CONFIG_NODE
, &no_router_bgp_cmd
);
10160 /* "bgp router-id" commands. */
10161 install_element (BGP_NODE
, &bgp_router_id_cmd
);
10162 install_element (BGP_NODE
, &no_bgp_router_id_cmd
);
10164 /* "bgp cluster-id" commands. */
10165 install_element (BGP_NODE
, &bgp_cluster_id_cmd
);
10166 install_element (BGP_NODE
, &no_bgp_cluster_id_cmd
);
10168 /* "bgp confederation" commands. */
10169 install_element (BGP_NODE
, &bgp_confederation_identifier_cmd
);
10170 install_element (BGP_NODE
, &no_bgp_confederation_identifier_cmd
);
10172 /* "bgp confederation peers" commands. */
10173 install_element (BGP_NODE
, &bgp_confederation_peers_cmd
);
10174 install_element (BGP_NODE
, &no_bgp_confederation_peers_cmd
);
10176 /* bgp max-med command */
10177 install_element (BGP_NODE
, &bgp_maxmed_admin_cmd
);
10178 install_element (BGP_NODE
, &no_bgp_maxmed_admin_cmd
);
10179 install_element (BGP_NODE
, &bgp_maxmed_admin_medv_cmd
);
10180 install_element (BGP_NODE
, &bgp_maxmed_onstartup_cmd
);
10181 install_element (BGP_NODE
, &no_bgp_maxmed_onstartup_cmd
);
10182 install_element (BGP_NODE
, &bgp_maxmed_onstartup_medv_cmd
);
10184 /* bgp disable-ebgp-connected-nh-check */
10185 install_element (BGP_NODE
, &bgp_disable_connected_route_check_cmd
);
10186 install_element (BGP_NODE
, &no_bgp_disable_connected_route_check_cmd
);
10188 /* bgp update-delay command */
10189 install_element (BGP_NODE
, &bgp_update_delay_cmd
);
10190 install_element (BGP_NODE
, &no_bgp_update_delay_cmd
);
10191 install_element (BGP_NODE
, &bgp_update_delay_establish_wait_cmd
);
10193 install_element (BGP_NODE
, &bgp_wpkt_quanta_cmd
);
10194 install_element (BGP_NODE
, &no_bgp_wpkt_quanta_cmd
);
10196 install_element (BGP_NODE
, &bgp_coalesce_time_cmd
);
10197 install_element (BGP_NODE
, &no_bgp_coalesce_time_cmd
);
10199 /* "maximum-paths" commands. */
10200 install_element (BGP_NODE
, &bgp_maxpaths_cmd
);
10201 install_element (BGP_NODE
, &no_bgp_maxpaths_cmd
);
10202 install_element (BGP_IPV4_NODE
, &bgp_maxpaths_cmd
);
10203 install_element (BGP_IPV4_NODE
, &no_bgp_maxpaths_cmd
);
10204 install_element (BGP_IPV6_NODE
, &bgp_maxpaths_cmd
);
10205 install_element (BGP_IPV6_NODE
, &no_bgp_maxpaths_cmd
);
10206 install_element (BGP_NODE
, &bgp_maxpaths_ibgp_cmd
);
10207 install_element(BGP_NODE
, &bgp_maxpaths_ibgp_cluster_cmd
);
10208 install_element (BGP_NODE
, &no_bgp_maxpaths_ibgp_cmd
);
10209 install_element (BGP_IPV4_NODE
, &bgp_maxpaths_ibgp_cmd
);
10210 install_element(BGP_IPV4_NODE
, &bgp_maxpaths_ibgp_cluster_cmd
);
10211 install_element (BGP_IPV4_NODE
, &no_bgp_maxpaths_ibgp_cmd
);
10212 install_element (BGP_IPV6_NODE
, &bgp_maxpaths_ibgp_cmd
);
10213 install_element(BGP_IPV6_NODE
, &bgp_maxpaths_ibgp_cluster_cmd
);
10214 install_element (BGP_IPV6_NODE
, &no_bgp_maxpaths_ibgp_cmd
);
10216 /* "timers bgp" commands. */
10217 install_element (BGP_NODE
, &bgp_timers_cmd
);
10218 install_element (BGP_NODE
, &no_bgp_timers_cmd
);
10220 /* route-map delay-timer commands - per instance for backwards compat. */
10221 install_element (BGP_NODE
, &bgp_set_route_map_delay_timer_cmd
);
10222 install_element (BGP_NODE
, &no_bgp_set_route_map_delay_timer_cmd
);
10224 /* "bgp client-to-client reflection" commands */
10225 install_element (BGP_NODE
, &no_bgp_client_to_client_reflection_cmd
);
10226 install_element (BGP_NODE
, &bgp_client_to_client_reflection_cmd
);
10228 /* "bgp always-compare-med" commands */
10229 install_element (BGP_NODE
, &bgp_always_compare_med_cmd
);
10230 install_element (BGP_NODE
, &no_bgp_always_compare_med_cmd
);
10232 /* "bgp deterministic-med" commands */
10233 install_element (BGP_NODE
, &bgp_deterministic_med_cmd
);
10234 install_element (BGP_NODE
, &no_bgp_deterministic_med_cmd
);
10236 /* "bgp graceful-restart" commands */
10237 install_element (BGP_NODE
, &bgp_graceful_restart_cmd
);
10238 install_element (BGP_NODE
, &no_bgp_graceful_restart_cmd
);
10239 install_element (BGP_NODE
, &bgp_graceful_restart_stalepath_time_cmd
);
10240 install_element (BGP_NODE
, &no_bgp_graceful_restart_stalepath_time_cmd
);
10241 install_element (BGP_NODE
, &bgp_graceful_restart_restart_time_cmd
);
10242 install_element (BGP_NODE
, &no_bgp_graceful_restart_restart_time_cmd
);
10244 install_element (BGP_NODE
, &bgp_graceful_restart_preserve_fw_cmd
);
10245 install_element (BGP_NODE
, &no_bgp_graceful_restart_preserve_fw_cmd
);
10247 /* "bgp fast-external-failover" commands */
10248 install_element (BGP_NODE
, &bgp_fast_external_failover_cmd
);
10249 install_element (BGP_NODE
, &no_bgp_fast_external_failover_cmd
);
10251 /* "bgp enforce-first-as" commands */
10252 install_element (BGP_NODE
, &bgp_enforce_first_as_cmd
);
10253 install_element (BGP_NODE
, &no_bgp_enforce_first_as_cmd
);
10255 /* "bgp bestpath compare-routerid" commands */
10256 install_element (BGP_NODE
, &bgp_bestpath_compare_router_id_cmd
);
10257 install_element (BGP_NODE
, &no_bgp_bestpath_compare_router_id_cmd
);
10259 /* "bgp bestpath as-path ignore" commands */
10260 install_element (BGP_NODE
, &bgp_bestpath_aspath_ignore_cmd
);
10261 install_element (BGP_NODE
, &no_bgp_bestpath_aspath_ignore_cmd
);
10263 /* "bgp bestpath as-path confed" commands */
10264 install_element (BGP_NODE
, &bgp_bestpath_aspath_confed_cmd
);
10265 install_element (BGP_NODE
, &no_bgp_bestpath_aspath_confed_cmd
);
10267 /* "bgp bestpath as-path multipath-relax" commands */
10268 install_element (BGP_NODE
, &bgp_bestpath_aspath_multipath_relax_cmd
);
10269 install_element (BGP_NODE
, &no_bgp_bestpath_aspath_multipath_relax_cmd
);
10271 /* "bgp log-neighbor-changes" commands */
10272 install_element (BGP_NODE
, &bgp_log_neighbor_changes_cmd
);
10273 install_element (BGP_NODE
, &no_bgp_log_neighbor_changes_cmd
);
10275 /* "bgp bestpath med" commands */
10276 install_element (BGP_NODE
, &bgp_bestpath_med_cmd
);
10277 install_element (BGP_NODE
, &no_bgp_bestpath_med_cmd
);
10279 /* "no bgp default ipv4-unicast" commands. */
10280 install_element (BGP_NODE
, &no_bgp_default_ipv4_unicast_cmd
);
10281 install_element (BGP_NODE
, &bgp_default_ipv4_unicast_cmd
);
10283 /* "bgp network import-check" commands. */
10284 install_element (BGP_NODE
, &bgp_network_import_check_cmd
);
10285 install_element (BGP_NODE
, &bgp_network_import_check_exact_cmd
);
10286 install_element (BGP_NODE
, &no_bgp_network_import_check_cmd
);
10288 /* "bgp default local-preference" commands. */
10289 install_element (BGP_NODE
, &bgp_default_local_preference_cmd
);
10290 install_element (BGP_NODE
, &no_bgp_default_local_preference_cmd
);
10292 /* bgp default show-hostname */
10293 install_element (BGP_NODE
, &bgp_default_show_hostname_cmd
);
10294 install_element (BGP_NODE
, &no_bgp_default_show_hostname_cmd
);
10296 /* "bgp default subgroup-pkt-queue-max" commands. */
10297 install_element (BGP_NODE
, &bgp_default_subgroup_pkt_queue_max_cmd
);
10298 install_element (BGP_NODE
, &no_bgp_default_subgroup_pkt_queue_max_cmd
);
10300 /* bgp ibgp-allow-policy-mods command */
10301 install_element (BGP_NODE
, &bgp_rr_allow_outbound_policy_cmd
);
10302 install_element (BGP_NODE
, &no_bgp_rr_allow_outbound_policy_cmd
);
10304 /* "bgp listen limit" commands. */
10305 install_element (BGP_NODE
, &bgp_listen_limit_cmd
);
10306 install_element (BGP_NODE
, &no_bgp_listen_limit_cmd
);
10308 /* "bgp listen range" commands. */
10309 install_element (BGP_NODE
, &bgp_listen_range_cmd
);
10310 install_element (BGP_NODE
, &no_bgp_listen_range_cmd
);
10312 /* "neighbor remote-as" commands. */
10313 install_element (BGP_NODE
, &neighbor_remote_as_cmd
);
10314 install_element (BGP_NODE
, &neighbor_interface_config_cmd
);
10315 install_element (BGP_NODE
, &neighbor_interface_config_v6only_cmd
);
10316 install_element (BGP_NODE
, &neighbor_interface_config_remote_as_cmd
);
10317 install_element (BGP_NODE
, &neighbor_interface_v6only_config_remote_as_cmd
);
10318 install_element (BGP_NODE
, &no_neighbor_cmd
);
10319 install_element (BGP_NODE
, &no_neighbor_interface_config_cmd
);
10321 /* "neighbor peer-group" commands. */
10322 install_element (BGP_NODE
, &neighbor_peer_group_cmd
);
10323 install_element (BGP_NODE
, &no_neighbor_peer_group_cmd
);
10324 install_element (BGP_NODE
, &no_neighbor_interface_peer_group_remote_as_cmd
);
10326 /* "neighbor local-as" commands. */
10327 install_element (BGP_NODE
, &neighbor_local_as_cmd
);
10328 install_element (BGP_NODE
, &neighbor_local_as_no_prepend_cmd
);
10329 install_element (BGP_NODE
, &neighbor_local_as_no_prepend_replace_as_cmd
);
10330 install_element (BGP_NODE
, &no_neighbor_local_as_cmd
);
10332 /* "neighbor solo" commands. */
10333 install_element (BGP_NODE
, &neighbor_solo_cmd
);
10334 install_element (BGP_NODE
, &no_neighbor_solo_cmd
);
10336 /* "neighbor password" commands. */
10337 install_element (BGP_NODE
, &neighbor_password_cmd
);
10338 install_element (BGP_NODE
, &no_neighbor_password_cmd
);
10340 /* "neighbor activate" commands. */
10341 install_element (BGP_NODE
, &neighbor_activate_cmd
);
10342 install_element (BGP_IPV4_NODE
, &neighbor_activate_cmd
);
10343 install_element (BGP_IPV4M_NODE
, &neighbor_activate_cmd
);
10344 install_element (BGP_IPV6_NODE
, &neighbor_activate_cmd
);
10345 install_element (BGP_IPV6M_NODE
, &neighbor_activate_cmd
);
10346 install_element (BGP_VPNV4_NODE
, &neighbor_activate_cmd
);
10347 install_element (BGP_VPNV6_NODE
, &neighbor_activate_cmd
);
10348 install_element (BGP_ENCAP_NODE
, &neighbor_activate_cmd
);
10349 install_element (BGP_ENCAPV6_NODE
, &neighbor_activate_cmd
);
10350 install_element (BGP_EVPN_NODE
, &neighbor_activate_cmd
);
10352 /* "no neighbor activate" commands. */
10353 install_element (BGP_NODE
, &no_neighbor_activate_cmd
);
10354 install_element (BGP_IPV4_NODE
, &no_neighbor_activate_cmd
);
10355 install_element (BGP_IPV4M_NODE
, &no_neighbor_activate_cmd
);
10356 install_element (BGP_IPV6_NODE
, &no_neighbor_activate_cmd
);
10357 install_element (BGP_IPV6M_NODE
, &no_neighbor_activate_cmd
);
10358 install_element (BGP_VPNV4_NODE
, &no_neighbor_activate_cmd
);
10359 install_element (BGP_VPNV6_NODE
, &no_neighbor_activate_cmd
);
10360 install_element (BGP_ENCAP_NODE
, &no_neighbor_activate_cmd
);
10361 install_element (BGP_ENCAPV6_NODE
, &no_neighbor_activate_cmd
);
10362 install_element (BGP_EVPN_NODE
, &no_neighbor_activate_cmd
);
10364 /* "neighbor peer-group" set commands.
10365 * Long term we should only accept this command under BGP_NODE and not all of
10366 * the afi/safi sub-contexts. For now though we need to accept it for backwards
10367 * compatibility. This changed when we stopped requiring that peers be assigned
10368 * to their peer-group under each address-family sub-context.
10370 install_element (BGP_NODE
, &neighbor_set_peer_group_cmd
);
10371 install_element (BGP_IPV4_NODE
, &neighbor_set_peer_group_cmd
);
10372 install_element (BGP_IPV4M_NODE
, &neighbor_set_peer_group_cmd
);
10373 install_element (BGP_IPV6_NODE
, &neighbor_set_peer_group_cmd
);
10374 install_element (BGP_IPV6M_NODE
, &neighbor_set_peer_group_cmd
);
10375 install_element (BGP_VPNV4_NODE
, &neighbor_set_peer_group_cmd
);
10376 install_element (BGP_VPNV6_NODE
, &neighbor_set_peer_group_cmd
);
10377 install_element (BGP_ENCAP_NODE
, &neighbor_set_peer_group_cmd
);
10378 install_element (BGP_ENCAPV6_NODE
, &neighbor_set_peer_group_cmd
);
10380 /* "no neighbor peer-group unset" commands. */
10381 install_element (BGP_NODE
, &no_neighbor_set_peer_group_cmd
);
10382 install_element (BGP_IPV4_NODE
, &no_neighbor_set_peer_group_cmd
);
10383 install_element (BGP_IPV4M_NODE
, &no_neighbor_set_peer_group_cmd
);
10384 install_element (BGP_IPV6_NODE
, &no_neighbor_set_peer_group_cmd
);
10385 install_element (BGP_IPV6M_NODE
, &no_neighbor_set_peer_group_cmd
);
10386 install_element (BGP_VPNV4_NODE
, &no_neighbor_set_peer_group_cmd
);
10387 install_element (BGP_VPNV6_NODE
, &no_neighbor_set_peer_group_cmd
);
10388 install_element (BGP_ENCAP_NODE
, &no_neighbor_set_peer_group_cmd
);
10389 install_element (BGP_ENCAPV6_NODE
, &no_neighbor_set_peer_group_cmd
);
10391 /* "neighbor softreconfiguration inbound" commands.*/
10392 install_element (BGP_NODE
, &neighbor_soft_reconfiguration_cmd
);
10393 install_element (BGP_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
10394 install_element (BGP_IPV4_NODE
, &neighbor_soft_reconfiguration_cmd
);
10395 install_element (BGP_IPV4_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
10396 install_element (BGP_IPV4M_NODE
, &neighbor_soft_reconfiguration_cmd
);
10397 install_element (BGP_IPV4M_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
10398 install_element (BGP_IPV6_NODE
, &neighbor_soft_reconfiguration_cmd
);
10399 install_element (BGP_IPV6_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
10400 install_element (BGP_IPV6M_NODE
, &neighbor_soft_reconfiguration_cmd
);
10401 install_element (BGP_IPV6M_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
10402 install_element (BGP_VPNV4_NODE
, &neighbor_soft_reconfiguration_cmd
);
10403 install_element (BGP_VPNV4_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
10404 install_element (BGP_VPNV6_NODE
, &neighbor_soft_reconfiguration_cmd
);
10405 install_element (BGP_VPNV6_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
10406 install_element (BGP_ENCAP_NODE
, &neighbor_soft_reconfiguration_cmd
);
10407 install_element (BGP_ENCAP_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
10408 install_element (BGP_ENCAPV6_NODE
, &neighbor_soft_reconfiguration_cmd
);
10409 install_element (BGP_ENCAPV6_NODE
, &no_neighbor_soft_reconfiguration_cmd
);
10411 /* "neighbor attribute-unchanged" commands. */
10412 install_element (BGP_NODE
, &neighbor_attr_unchanged_cmd
);
10413 install_element (BGP_NODE
, &no_neighbor_attr_unchanged_cmd
);
10414 install_element (BGP_IPV4_NODE
, &neighbor_attr_unchanged_cmd
);
10415 install_element (BGP_IPV4_NODE
, &no_neighbor_attr_unchanged_cmd
);
10416 install_element (BGP_IPV4M_NODE
, &neighbor_attr_unchanged_cmd
);
10417 install_element (BGP_IPV4M_NODE
, &no_neighbor_attr_unchanged_cmd
);
10418 install_element (BGP_IPV6_NODE
, &neighbor_attr_unchanged_cmd
);
10419 install_element (BGP_IPV6_NODE
, &no_neighbor_attr_unchanged_cmd
);
10420 install_element (BGP_IPV6M_NODE
, &neighbor_attr_unchanged_cmd
);
10421 install_element (BGP_IPV6M_NODE
, &no_neighbor_attr_unchanged_cmd
);
10422 install_element (BGP_VPNV4_NODE
, &neighbor_attr_unchanged_cmd
);
10423 install_element (BGP_VPNV4_NODE
, &no_neighbor_attr_unchanged_cmd
);
10424 install_element (BGP_VPNV6_NODE
, &neighbor_attr_unchanged_cmd
);
10425 install_element (BGP_VPNV6_NODE
, &no_neighbor_attr_unchanged_cmd
);
10427 install_element (BGP_ENCAP_NODE
, &neighbor_attr_unchanged_cmd
);
10428 install_element (BGP_ENCAP_NODE
, &no_neighbor_attr_unchanged_cmd
);
10430 install_element (BGP_ENCAPV6_NODE
, &neighbor_attr_unchanged_cmd
);
10431 install_element (BGP_ENCAPV6_NODE
, &no_neighbor_attr_unchanged_cmd
);
10433 install_element (BGP_EVPN_NODE
, &neighbor_attr_unchanged_cmd
);
10434 install_element (BGP_EVPN_NODE
, &no_neighbor_attr_unchanged_cmd
);
10436 /* "nexthop-local unchanged" commands */
10437 install_element (BGP_IPV6_NODE
, &neighbor_nexthop_local_unchanged_cmd
);
10438 install_element (BGP_IPV6_NODE
, &no_neighbor_nexthop_local_unchanged_cmd
);
10440 /* "neighbor next-hop-self" commands. */
10441 install_element (BGP_NODE
, &neighbor_nexthop_self_cmd
);
10442 install_element (BGP_NODE
, &no_neighbor_nexthop_self_cmd
);
10443 install_element (BGP_IPV4_NODE
, &neighbor_nexthop_self_cmd
);
10444 install_element (BGP_IPV4_NODE
, &no_neighbor_nexthop_self_cmd
);
10445 install_element (BGP_IPV4M_NODE
, &neighbor_nexthop_self_cmd
);
10446 install_element (BGP_IPV4M_NODE
, &no_neighbor_nexthop_self_cmd
);
10447 install_element (BGP_IPV6_NODE
, &neighbor_nexthop_self_cmd
);
10448 install_element (BGP_IPV6_NODE
, &no_neighbor_nexthop_self_cmd
);
10449 install_element (BGP_IPV6M_NODE
, &neighbor_nexthop_self_cmd
);
10450 install_element (BGP_IPV6M_NODE
, &no_neighbor_nexthop_self_cmd
);
10451 install_element (BGP_VPNV4_NODE
, &neighbor_nexthop_self_cmd
);
10452 install_element (BGP_VPNV4_NODE
, &no_neighbor_nexthop_self_cmd
);
10453 install_element (BGP_VPNV6_NODE
, &neighbor_nexthop_self_cmd
);
10454 install_element (BGP_VPNV6_NODE
, &no_neighbor_nexthop_self_cmd
);
10455 install_element (BGP_ENCAP_NODE
, &neighbor_nexthop_self_cmd
);
10456 install_element (BGP_ENCAP_NODE
, &no_neighbor_nexthop_self_cmd
);
10457 install_element (BGP_ENCAPV6_NODE
, &neighbor_nexthop_self_cmd
);
10458 install_element (BGP_ENCAPV6_NODE
, &no_neighbor_nexthop_self_cmd
);
10460 /* "neighbor next-hop-self force" commands. */
10461 install_element (BGP_NODE
, &neighbor_nexthop_self_force_cmd
);
10462 install_element (BGP_NODE
, &no_neighbor_nexthop_self_force_cmd
);
10463 install_element (BGP_IPV4_NODE
, &neighbor_nexthop_self_force_cmd
);
10464 install_element (BGP_IPV4_NODE
, &no_neighbor_nexthop_self_force_cmd
);
10465 install_element (BGP_IPV4M_NODE
, &neighbor_nexthop_self_force_cmd
);
10466 install_element (BGP_IPV4M_NODE
, &no_neighbor_nexthop_self_force_cmd
);
10467 install_element (BGP_IPV6_NODE
, &neighbor_nexthop_self_force_cmd
);
10468 install_element (BGP_IPV6_NODE
, &no_neighbor_nexthop_self_force_cmd
);
10469 install_element (BGP_IPV6M_NODE
, &neighbor_nexthop_self_force_cmd
);
10470 install_element (BGP_IPV6M_NODE
, &no_neighbor_nexthop_self_force_cmd
);
10471 install_element (BGP_VPNV4_NODE
, &neighbor_nexthop_self_force_cmd
);
10472 install_element (BGP_VPNV4_NODE
, &no_neighbor_nexthop_self_force_cmd
);
10473 install_element (BGP_VPNV6_NODE
, &neighbor_nexthop_self_force_cmd
);
10474 install_element (BGP_VPNV6_NODE
, &no_neighbor_nexthop_self_force_cmd
);
10476 /* "neighbor as-override" commands. */
10477 install_element (BGP_NODE
, &neighbor_as_override_cmd
);
10478 install_element (BGP_NODE
, &no_neighbor_as_override_cmd
);
10479 install_element (BGP_IPV4_NODE
, &neighbor_as_override_cmd
);
10480 install_element (BGP_IPV4_NODE
, &no_neighbor_as_override_cmd
);
10481 install_element (BGP_IPV4M_NODE
, &neighbor_as_override_cmd
);
10482 install_element (BGP_IPV4M_NODE
, &no_neighbor_as_override_cmd
);
10483 install_element (BGP_IPV6_NODE
, &neighbor_as_override_cmd
);
10484 install_element (BGP_IPV6_NODE
, &no_neighbor_as_override_cmd
);
10485 install_element (BGP_IPV6M_NODE
, &neighbor_as_override_cmd
);
10486 install_element (BGP_IPV6M_NODE
, &no_neighbor_as_override_cmd
);
10487 install_element (BGP_VPNV4_NODE
, &neighbor_as_override_cmd
);
10488 install_element (BGP_VPNV4_NODE
, &no_neighbor_as_override_cmd
);
10489 install_element (BGP_VPNV6_NODE
, &neighbor_as_override_cmd
);
10490 install_element (BGP_VPNV6_NODE
, &no_neighbor_as_override_cmd
);
10492 /* "neighbor remove-private-AS" commands. */
10493 install_element (BGP_NODE
, &neighbor_remove_private_as_cmd
);
10494 install_element (BGP_NODE
, &no_neighbor_remove_private_as_cmd
);
10495 install_element (BGP_NODE
, &neighbor_remove_private_as_all_cmd
);
10496 install_element (BGP_NODE
, &no_neighbor_remove_private_as_all_cmd
);
10497 install_element (BGP_NODE
, &neighbor_remove_private_as_replace_as_cmd
);
10498 install_element (BGP_NODE
, &no_neighbor_remove_private_as_replace_as_cmd
);
10499 install_element (BGP_NODE
, &neighbor_remove_private_as_all_replace_as_cmd
);
10500 install_element (BGP_NODE
, &no_neighbor_remove_private_as_all_replace_as_cmd
);
10501 install_element (BGP_IPV4_NODE
, &neighbor_remove_private_as_cmd
);
10502 install_element (BGP_IPV4_NODE
, &no_neighbor_remove_private_as_cmd
);
10503 install_element (BGP_IPV4_NODE
, &neighbor_remove_private_as_all_cmd
);
10504 install_element (BGP_IPV4_NODE
, &no_neighbor_remove_private_as_all_cmd
);
10505 install_element (BGP_IPV4_NODE
, &neighbor_remove_private_as_replace_as_cmd
);
10506 install_element (BGP_IPV4_NODE
, &no_neighbor_remove_private_as_replace_as_cmd
);
10507 install_element (BGP_IPV4_NODE
, &neighbor_remove_private_as_all_replace_as_cmd
);
10508 install_element (BGP_IPV4_NODE
, &no_neighbor_remove_private_as_all_replace_as_cmd
);
10509 install_element (BGP_IPV4M_NODE
, &neighbor_remove_private_as_cmd
);
10510 install_element (BGP_IPV4M_NODE
, &no_neighbor_remove_private_as_cmd
);
10511 install_element (BGP_IPV4M_NODE
, &neighbor_remove_private_as_all_cmd
);
10512 install_element (BGP_IPV4M_NODE
, &no_neighbor_remove_private_as_all_cmd
);
10513 install_element (BGP_IPV4M_NODE
, &neighbor_remove_private_as_replace_as_cmd
);
10514 install_element (BGP_IPV4M_NODE
, &no_neighbor_remove_private_as_replace_as_cmd
);
10515 install_element (BGP_IPV4M_NODE
, &neighbor_remove_private_as_all_replace_as_cmd
);
10516 install_element (BGP_IPV4M_NODE
, &no_neighbor_remove_private_as_all_replace_as_cmd
);
10517 install_element (BGP_IPV6_NODE
, &neighbor_remove_private_as_cmd
);
10518 install_element (BGP_IPV6_NODE
, &no_neighbor_remove_private_as_cmd
);
10519 install_element (BGP_IPV6_NODE
, &neighbor_remove_private_as_all_cmd
);
10520 install_element (BGP_IPV6_NODE
, &no_neighbor_remove_private_as_all_cmd
);
10521 install_element (BGP_IPV6_NODE
, &neighbor_remove_private_as_replace_as_cmd
);
10522 install_element (BGP_IPV6_NODE
, &no_neighbor_remove_private_as_replace_as_cmd
);
10523 install_element (BGP_IPV6_NODE
, &neighbor_remove_private_as_all_replace_as_cmd
);
10524 install_element (BGP_IPV6_NODE
, &no_neighbor_remove_private_as_all_replace_as_cmd
);
10525 install_element (BGP_IPV6M_NODE
, &neighbor_remove_private_as_cmd
);
10526 install_element (BGP_IPV6M_NODE
, &no_neighbor_remove_private_as_cmd
);
10527 install_element (BGP_IPV6M_NODE
, &neighbor_remove_private_as_all_cmd
);
10528 install_element (BGP_IPV6M_NODE
, &no_neighbor_remove_private_as_all_cmd
);
10529 install_element (BGP_IPV6M_NODE
, &neighbor_remove_private_as_replace_as_cmd
);
10530 install_element (BGP_IPV6M_NODE
, &no_neighbor_remove_private_as_replace_as_cmd
);
10531 install_element (BGP_IPV6M_NODE
, &neighbor_remove_private_as_all_replace_as_cmd
);
10532 install_element (BGP_IPV6M_NODE
, &no_neighbor_remove_private_as_all_replace_as_cmd
);
10533 install_element (BGP_VPNV4_NODE
, &neighbor_remove_private_as_cmd
);
10534 install_element (BGP_VPNV4_NODE
, &no_neighbor_remove_private_as_cmd
);
10535 install_element (BGP_VPNV4_NODE
, &neighbor_remove_private_as_all_cmd
);
10536 install_element (BGP_VPNV4_NODE
, &no_neighbor_remove_private_as_all_cmd
);
10537 install_element (BGP_VPNV4_NODE
, &neighbor_remove_private_as_replace_as_cmd
);
10538 install_element (BGP_VPNV4_NODE
, &no_neighbor_remove_private_as_replace_as_cmd
);
10539 install_element (BGP_VPNV4_NODE
, &neighbor_remove_private_as_all_replace_as_cmd
);
10540 install_element (BGP_VPNV4_NODE
, &no_neighbor_remove_private_as_all_replace_as_cmd
);
10541 install_element (BGP_VPNV6_NODE
, &neighbor_remove_private_as_cmd
);
10542 install_element (BGP_VPNV6_NODE
, &no_neighbor_remove_private_as_cmd
);
10543 install_element (BGP_VPNV6_NODE
, &neighbor_remove_private_as_all_cmd
);
10544 install_element (BGP_VPNV6_NODE
, &no_neighbor_remove_private_as_all_cmd
);
10545 install_element (BGP_VPNV6_NODE
, &neighbor_remove_private_as_replace_as_cmd
);
10546 install_element (BGP_VPNV6_NODE
, &no_neighbor_remove_private_as_replace_as_cmd
);
10547 install_element (BGP_VPNV6_NODE
, &neighbor_remove_private_as_all_replace_as_cmd
);
10548 install_element (BGP_VPNV6_NODE
, &no_neighbor_remove_private_as_all_replace_as_cmd
);
10549 install_element (BGP_ENCAP_NODE
, &neighbor_remove_private_as_cmd
);
10550 install_element (BGP_ENCAP_NODE
, &no_neighbor_remove_private_as_cmd
);
10551 install_element (BGP_ENCAPV6_NODE
, &neighbor_remove_private_as_cmd
);
10552 install_element (BGP_ENCAPV6_NODE
, &no_neighbor_remove_private_as_cmd
);
10554 /* "neighbor send-community" commands.*/
10555 install_element (BGP_NODE
, &neighbor_send_community_cmd
);
10556 install_element (BGP_NODE
, &neighbor_send_community_type_cmd
);
10557 install_element (BGP_NODE
, &no_neighbor_send_community_cmd
);
10558 install_element (BGP_NODE
, &no_neighbor_send_community_type_cmd
);
10559 install_element (BGP_IPV4_NODE
, &neighbor_send_community_cmd
);
10560 install_element (BGP_IPV4_NODE
, &neighbor_send_community_type_cmd
);
10561 install_element (BGP_IPV4_NODE
, &no_neighbor_send_community_cmd
);
10562 install_element (BGP_IPV4_NODE
, &no_neighbor_send_community_type_cmd
);
10563 install_element (BGP_IPV4M_NODE
, &neighbor_send_community_cmd
);
10564 install_element (BGP_IPV4M_NODE
, &neighbor_send_community_type_cmd
);
10565 install_element (BGP_IPV4M_NODE
, &no_neighbor_send_community_cmd
);
10566 install_element (BGP_IPV4M_NODE
, &no_neighbor_send_community_type_cmd
);
10567 install_element (BGP_IPV6_NODE
, &neighbor_send_community_cmd
);
10568 install_element (BGP_IPV6_NODE
, &neighbor_send_community_type_cmd
);
10569 install_element (BGP_IPV6_NODE
, &no_neighbor_send_community_cmd
);
10570 install_element (BGP_IPV6_NODE
, &no_neighbor_send_community_type_cmd
);
10571 install_element (BGP_IPV6M_NODE
, &neighbor_send_community_cmd
);
10572 install_element (BGP_IPV6M_NODE
, &neighbor_send_community_type_cmd
);
10573 install_element (BGP_IPV6M_NODE
, &no_neighbor_send_community_cmd
);
10574 install_element (BGP_IPV6M_NODE
, &no_neighbor_send_community_type_cmd
);
10575 install_element (BGP_VPNV4_NODE
, &neighbor_send_community_cmd
);
10576 install_element (BGP_VPNV4_NODE
, &neighbor_send_community_type_cmd
);
10577 install_element (BGP_VPNV4_NODE
, &no_neighbor_send_community_cmd
);
10578 install_element (BGP_VPNV4_NODE
, &no_neighbor_send_community_type_cmd
);
10579 install_element (BGP_VPNV6_NODE
, &neighbor_send_community_cmd
);
10580 install_element (BGP_VPNV6_NODE
, &neighbor_send_community_type_cmd
);
10581 install_element (BGP_VPNV6_NODE
, &no_neighbor_send_community_cmd
);
10582 install_element (BGP_VPNV6_NODE
, &no_neighbor_send_community_type_cmd
);
10583 install_element (BGP_ENCAP_NODE
, &neighbor_send_community_cmd
);
10584 install_element (BGP_ENCAP_NODE
, &neighbor_send_community_type_cmd
);
10585 install_element (BGP_ENCAP_NODE
, &no_neighbor_send_community_cmd
);
10586 install_element (BGP_ENCAP_NODE
, &no_neighbor_send_community_type_cmd
);
10587 install_element (BGP_ENCAPV6_NODE
, &neighbor_send_community_cmd
);
10588 install_element (BGP_ENCAPV6_NODE
, &neighbor_send_community_type_cmd
);
10589 install_element (BGP_ENCAPV6_NODE
, &no_neighbor_send_community_cmd
);
10590 install_element (BGP_ENCAPV6_NODE
, &no_neighbor_send_community_type_cmd
);
10592 /* "neighbor route-reflector" commands.*/
10593 install_element (BGP_NODE
, &neighbor_route_reflector_client_cmd
);
10594 install_element (BGP_NODE
, &no_neighbor_route_reflector_client_cmd
);
10595 install_element (BGP_IPV4_NODE
, &neighbor_route_reflector_client_cmd
);
10596 install_element (BGP_IPV4_NODE
, &no_neighbor_route_reflector_client_cmd
);
10597 install_element (BGP_IPV4M_NODE
, &neighbor_route_reflector_client_cmd
);
10598 install_element (BGP_IPV4M_NODE
, &no_neighbor_route_reflector_client_cmd
);
10599 install_element (BGP_IPV6_NODE
, &neighbor_route_reflector_client_cmd
);
10600 install_element (BGP_IPV6_NODE
, &no_neighbor_route_reflector_client_cmd
);
10601 install_element (BGP_IPV6M_NODE
, &neighbor_route_reflector_client_cmd
);
10602 install_element (BGP_IPV6M_NODE
, &no_neighbor_route_reflector_client_cmd
);
10603 install_element (BGP_VPNV4_NODE
, &neighbor_route_reflector_client_cmd
);
10604 install_element (BGP_VPNV4_NODE
, &no_neighbor_route_reflector_client_cmd
);
10605 install_element (BGP_VPNV6_NODE
, &neighbor_route_reflector_client_cmd
);
10606 install_element (BGP_VPNV6_NODE
, &no_neighbor_route_reflector_client_cmd
);
10607 install_element (BGP_ENCAP_NODE
, &neighbor_route_reflector_client_cmd
);
10608 install_element (BGP_ENCAP_NODE
, &no_neighbor_route_reflector_client_cmd
);
10609 install_element (BGP_ENCAPV6_NODE
, &neighbor_route_reflector_client_cmd
);
10610 install_element (BGP_ENCAPV6_NODE
, &no_neighbor_route_reflector_client_cmd
);
10612 /* "neighbor route-server" commands.*/
10613 install_element (BGP_NODE
, &neighbor_route_server_client_cmd
);
10614 install_element (BGP_NODE
, &no_neighbor_route_server_client_cmd
);
10615 install_element (BGP_IPV4_NODE
, &neighbor_route_server_client_cmd
);
10616 install_element (BGP_IPV4_NODE
, &no_neighbor_route_server_client_cmd
);
10617 install_element (BGP_IPV4M_NODE
, &neighbor_route_server_client_cmd
);
10618 install_element (BGP_IPV4M_NODE
, &no_neighbor_route_server_client_cmd
);
10619 install_element (BGP_IPV6_NODE
, &neighbor_route_server_client_cmd
);
10620 install_element (BGP_IPV6_NODE
, &no_neighbor_route_server_client_cmd
);
10621 install_element (BGP_IPV6M_NODE
, &neighbor_route_server_client_cmd
);
10622 install_element (BGP_IPV6M_NODE
, &no_neighbor_route_server_client_cmd
);
10623 install_element (BGP_VPNV4_NODE
, &neighbor_route_server_client_cmd
);
10624 install_element (BGP_VPNV4_NODE
, &no_neighbor_route_server_client_cmd
);
10625 install_element (BGP_VPNV6_NODE
, &neighbor_route_server_client_cmd
);
10626 install_element (BGP_VPNV6_NODE
, &no_neighbor_route_server_client_cmd
);
10627 install_element (BGP_ENCAP_NODE
, &neighbor_route_server_client_cmd
);
10628 install_element (BGP_ENCAP_NODE
, &no_neighbor_route_server_client_cmd
);
10629 install_element (BGP_ENCAPV6_NODE
, &neighbor_route_server_client_cmd
);
10630 install_element (BGP_ENCAPV6_NODE
, &no_neighbor_route_server_client_cmd
);
10632 /* "neighbor addpath-tx-all-paths" commands.*/
10633 install_element (BGP_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
10634 install_element (BGP_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
10635 install_element (BGP_IPV4_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
10636 install_element (BGP_IPV4_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
10637 install_element (BGP_IPV4M_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
10638 install_element (BGP_IPV4M_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
10639 install_element (BGP_IPV6_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
10640 install_element (BGP_IPV6_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
10641 install_element (BGP_IPV6M_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
10642 install_element (BGP_IPV6M_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
10643 install_element (BGP_VPNV4_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
10644 install_element (BGP_VPNV4_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
10645 install_element (BGP_VPNV6_NODE
, &neighbor_addpath_tx_all_paths_cmd
);
10646 install_element (BGP_VPNV6_NODE
, &no_neighbor_addpath_tx_all_paths_cmd
);
10648 /* "neighbor addpath-tx-bestpath-per-AS" commands.*/
10649 install_element (BGP_NODE
, &neighbor_addpath_tx_bestpath_per_as_cmd
);
10650 install_element (BGP_NODE
, &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
10651 install_element (BGP_IPV4_NODE
, &neighbor_addpath_tx_bestpath_per_as_cmd
);
10652 install_element (BGP_IPV4_NODE
, &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
10653 install_element (BGP_IPV4M_NODE
, &neighbor_addpath_tx_bestpath_per_as_cmd
);
10654 install_element (BGP_IPV4M_NODE
, &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
10655 install_element (BGP_IPV6_NODE
, &neighbor_addpath_tx_bestpath_per_as_cmd
);
10656 install_element (BGP_IPV6_NODE
, &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
10657 install_element (BGP_IPV6M_NODE
, &neighbor_addpath_tx_bestpath_per_as_cmd
);
10658 install_element (BGP_IPV6M_NODE
, &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
10659 install_element (BGP_VPNV4_NODE
, &neighbor_addpath_tx_bestpath_per_as_cmd
);
10660 install_element (BGP_VPNV4_NODE
, &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
10661 install_element (BGP_VPNV6_NODE
, &neighbor_addpath_tx_bestpath_per_as_cmd
);
10662 install_element (BGP_VPNV6_NODE
, &no_neighbor_addpath_tx_bestpath_per_as_cmd
);
10664 /* "neighbor passive" commands. */
10665 install_element (BGP_NODE
, &neighbor_passive_cmd
);
10666 install_element (BGP_NODE
, &no_neighbor_passive_cmd
);
10669 /* "neighbor shutdown" commands. */
10670 install_element (BGP_NODE
, &neighbor_shutdown_cmd
);
10671 install_element (BGP_NODE
, &no_neighbor_shutdown_cmd
);
10672 install_element (BGP_NODE
, &neighbor_shutdown_msg_cmd
);
10673 install_element (BGP_NODE
, &no_neighbor_shutdown_msg_cmd
);
10675 /* "neighbor capability extended-nexthop" commands.*/
10676 install_element (BGP_NODE
, &neighbor_capability_enhe_cmd
);
10677 install_element (BGP_NODE
, &no_neighbor_capability_enhe_cmd
);
10679 /* "neighbor capability orf prefix-list" commands.*/
10680 install_element (BGP_NODE
, &neighbor_capability_orf_prefix_cmd
);
10681 install_element (BGP_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
10682 install_element (BGP_IPV4_NODE
, &neighbor_capability_orf_prefix_cmd
);
10683 install_element (BGP_IPV4_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
10684 install_element (BGP_IPV4M_NODE
, &neighbor_capability_orf_prefix_cmd
);
10685 install_element (BGP_IPV4M_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
10686 install_element (BGP_IPV6_NODE
, &neighbor_capability_orf_prefix_cmd
);
10687 install_element (BGP_IPV6_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
10688 install_element (BGP_IPV6M_NODE
, &neighbor_capability_orf_prefix_cmd
);
10689 install_element (BGP_IPV6M_NODE
, &no_neighbor_capability_orf_prefix_cmd
);
10691 /* "neighbor capability dynamic" commands.*/
10692 install_element (BGP_NODE
, &neighbor_capability_dynamic_cmd
);
10693 install_element (BGP_NODE
, &no_neighbor_capability_dynamic_cmd
);
10695 /* "neighbor dont-capability-negotiate" commands. */
10696 install_element (BGP_NODE
, &neighbor_dont_capability_negotiate_cmd
);
10697 install_element (BGP_NODE
, &no_neighbor_dont_capability_negotiate_cmd
);
10699 /* "neighbor ebgp-multihop" commands. */
10700 install_element (BGP_NODE
, &neighbor_ebgp_multihop_cmd
);
10701 install_element (BGP_NODE
, &neighbor_ebgp_multihop_ttl_cmd
);
10702 install_element (BGP_NODE
, &no_neighbor_ebgp_multihop_cmd
);
10704 /* "neighbor disable-connected-check" commands. */
10705 install_element (BGP_NODE
, &neighbor_disable_connected_check_cmd
);
10706 install_element (BGP_NODE
, &no_neighbor_disable_connected_check_cmd
);
10708 /* "neighbor description" commands. */
10709 install_element (BGP_NODE
, &neighbor_description_cmd
);
10710 install_element (BGP_NODE
, &no_neighbor_description_cmd
);
10712 /* "neighbor update-source" commands. "*/
10713 install_element (BGP_NODE
, &neighbor_update_source_cmd
);
10714 install_element (BGP_NODE
, &no_neighbor_update_source_cmd
);
10716 /* "neighbor default-originate" commands. */
10717 install_element (BGP_NODE
, &neighbor_default_originate_cmd
);
10718 install_element (BGP_NODE
, &neighbor_default_originate_rmap_cmd
);
10719 install_element (BGP_NODE
, &no_neighbor_default_originate_cmd
);
10720 install_element (BGP_IPV4_NODE
, &neighbor_default_originate_cmd
);
10721 install_element (BGP_IPV4_NODE
, &neighbor_default_originate_rmap_cmd
);
10722 install_element (BGP_IPV4_NODE
, &no_neighbor_default_originate_cmd
);
10723 install_element (BGP_IPV4M_NODE
, &neighbor_default_originate_cmd
);
10724 install_element (BGP_IPV4M_NODE
, &neighbor_default_originate_rmap_cmd
);
10725 install_element (BGP_IPV4M_NODE
, &no_neighbor_default_originate_cmd
);
10726 install_element (BGP_IPV6_NODE
, &neighbor_default_originate_cmd
);
10727 install_element (BGP_IPV6_NODE
, &neighbor_default_originate_rmap_cmd
);
10728 install_element (BGP_IPV6_NODE
, &no_neighbor_default_originate_cmd
);
10729 install_element (BGP_IPV6M_NODE
, &neighbor_default_originate_cmd
);
10730 install_element (BGP_IPV6M_NODE
, &neighbor_default_originate_rmap_cmd
);
10731 install_element (BGP_IPV6M_NODE
, &no_neighbor_default_originate_cmd
);
10733 /* "neighbor port" commands. */
10734 install_element (BGP_NODE
, &neighbor_port_cmd
);
10735 install_element (BGP_NODE
, &no_neighbor_port_cmd
);
10737 /* "neighbor weight" commands. */
10738 install_element (BGP_NODE
, &neighbor_weight_cmd
);
10739 install_element (BGP_NODE
, &no_neighbor_weight_cmd
);
10741 install_element (BGP_IPV4_NODE
, &neighbor_weight_cmd
);
10742 install_element (BGP_IPV4_NODE
, &no_neighbor_weight_cmd
);
10743 install_element (BGP_IPV4M_NODE
, &neighbor_weight_cmd
);
10744 install_element (BGP_IPV4M_NODE
, &no_neighbor_weight_cmd
);
10745 install_element (BGP_IPV6_NODE
, &neighbor_weight_cmd
);
10746 install_element (BGP_IPV6_NODE
, &no_neighbor_weight_cmd
);
10747 install_element (BGP_IPV6M_NODE
, &neighbor_weight_cmd
);
10748 install_element (BGP_IPV6M_NODE
, &no_neighbor_weight_cmd
);
10749 install_element (BGP_VPNV4_NODE
, &neighbor_weight_cmd
);
10750 install_element (BGP_VPNV4_NODE
, &no_neighbor_weight_cmd
);
10751 install_element (BGP_VPNV6_NODE
, &neighbor_weight_cmd
);
10752 install_element (BGP_VPNV6_NODE
, &no_neighbor_weight_cmd
);
10753 install_element (BGP_ENCAP_NODE
, &neighbor_weight_cmd
);
10754 install_element (BGP_ENCAP_NODE
, &no_neighbor_weight_cmd
);
10755 install_element (BGP_ENCAPV6_NODE
, &neighbor_weight_cmd
);
10756 install_element (BGP_ENCAPV6_NODE
, &no_neighbor_weight_cmd
);
10758 /* "neighbor override-capability" commands. */
10759 install_element (BGP_NODE
, &neighbor_override_capability_cmd
);
10760 install_element (BGP_NODE
, &no_neighbor_override_capability_cmd
);
10762 /* "neighbor strict-capability-match" commands. */
10763 install_element (BGP_NODE
, &neighbor_strict_capability_cmd
);
10764 install_element (BGP_NODE
, &no_neighbor_strict_capability_cmd
);
10766 /* "neighbor timers" commands. */
10767 install_element (BGP_NODE
, &neighbor_timers_cmd
);
10768 install_element (BGP_NODE
, &no_neighbor_timers_cmd
);
10770 /* "neighbor timers connect" commands. */
10771 install_element (BGP_NODE
, &neighbor_timers_connect_cmd
);
10772 install_element (BGP_NODE
, &no_neighbor_timers_connect_cmd
);
10774 /* "neighbor advertisement-interval" commands. */
10775 install_element (BGP_NODE
, &neighbor_advertise_interval_cmd
);
10776 install_element (BGP_NODE
, &no_neighbor_advertise_interval_cmd
);
10778 /* "neighbor interface" commands. */
10779 install_element (BGP_NODE
, &neighbor_interface_cmd
);
10780 install_element (BGP_NODE
, &no_neighbor_interface_cmd
);
10782 /* "neighbor distribute" commands. */
10783 install_element (BGP_NODE
, &neighbor_distribute_list_cmd
);
10784 install_element (BGP_NODE
, &no_neighbor_distribute_list_cmd
);
10785 install_element (BGP_IPV4_NODE
, &neighbor_distribute_list_cmd
);
10786 install_element (BGP_IPV4_NODE
, &no_neighbor_distribute_list_cmd
);
10787 install_element (BGP_IPV4M_NODE
, &neighbor_distribute_list_cmd
);
10788 install_element (BGP_IPV4M_NODE
, &no_neighbor_distribute_list_cmd
);
10789 install_element (BGP_IPV6_NODE
, &neighbor_distribute_list_cmd
);
10790 install_element (BGP_IPV6_NODE
, &no_neighbor_distribute_list_cmd
);
10791 install_element (BGP_IPV6M_NODE
, &neighbor_distribute_list_cmd
);
10792 install_element (BGP_IPV6M_NODE
, &no_neighbor_distribute_list_cmd
);
10793 install_element (BGP_VPNV4_NODE
, &neighbor_distribute_list_cmd
);
10794 install_element (BGP_VPNV4_NODE
, &no_neighbor_distribute_list_cmd
);
10795 install_element (BGP_VPNV6_NODE
, &neighbor_distribute_list_cmd
);
10796 install_element (BGP_VPNV6_NODE
, &no_neighbor_distribute_list_cmd
);
10797 install_element (BGP_ENCAP_NODE
, &neighbor_distribute_list_cmd
);
10798 install_element (BGP_ENCAP_NODE
, &no_neighbor_distribute_list_cmd
);
10799 install_element (BGP_ENCAPV6_NODE
, &neighbor_distribute_list_cmd
);
10800 install_element (BGP_ENCAPV6_NODE
, &no_neighbor_distribute_list_cmd
);
10802 /* "neighbor prefix-list" commands. */
10803 install_element (BGP_NODE
, &neighbor_prefix_list_cmd
);
10804 install_element (BGP_NODE
, &no_neighbor_prefix_list_cmd
);
10805 install_element (BGP_IPV4_NODE
, &neighbor_prefix_list_cmd
);
10806 install_element (BGP_IPV4_NODE
, &no_neighbor_prefix_list_cmd
);
10807 install_element (BGP_IPV4M_NODE
, &neighbor_prefix_list_cmd
);
10808 install_element (BGP_IPV4M_NODE
, &no_neighbor_prefix_list_cmd
);
10809 install_element (BGP_IPV6_NODE
, &neighbor_prefix_list_cmd
);
10810 install_element (BGP_IPV6_NODE
, &no_neighbor_prefix_list_cmd
);
10811 install_element (BGP_IPV6M_NODE
, &neighbor_prefix_list_cmd
);
10812 install_element (BGP_IPV6M_NODE
, &no_neighbor_prefix_list_cmd
);
10813 install_element (BGP_VPNV4_NODE
, &neighbor_prefix_list_cmd
);
10814 install_element (BGP_VPNV4_NODE
, &no_neighbor_prefix_list_cmd
);
10815 install_element (BGP_VPNV6_NODE
, &neighbor_prefix_list_cmd
);
10816 install_element (BGP_VPNV6_NODE
, &no_neighbor_prefix_list_cmd
);
10817 install_element (BGP_ENCAP_NODE
, &neighbor_prefix_list_cmd
);
10818 install_element (BGP_ENCAP_NODE
, &no_neighbor_prefix_list_cmd
);
10819 install_element (BGP_ENCAPV6_NODE
, &neighbor_prefix_list_cmd
);
10820 install_element (BGP_ENCAPV6_NODE
, &no_neighbor_prefix_list_cmd
);
10822 /* "neighbor filter-list" commands. */
10823 install_element (BGP_NODE
, &neighbor_filter_list_cmd
);
10824 install_element (BGP_NODE
, &no_neighbor_filter_list_cmd
);
10825 install_element (BGP_IPV4_NODE
, &neighbor_filter_list_cmd
);
10826 install_element (BGP_IPV4_NODE
, &no_neighbor_filter_list_cmd
);
10827 install_element (BGP_IPV4M_NODE
, &neighbor_filter_list_cmd
);
10828 install_element (BGP_IPV4M_NODE
, &no_neighbor_filter_list_cmd
);
10829 install_element (BGP_IPV6_NODE
, &neighbor_filter_list_cmd
);
10830 install_element (BGP_IPV6_NODE
, &no_neighbor_filter_list_cmd
);
10831 install_element (BGP_IPV6M_NODE
, &neighbor_filter_list_cmd
);
10832 install_element (BGP_IPV6M_NODE
, &no_neighbor_filter_list_cmd
);
10833 install_element (BGP_VPNV4_NODE
, &neighbor_filter_list_cmd
);
10834 install_element (BGP_VPNV4_NODE
, &no_neighbor_filter_list_cmd
);
10835 install_element (BGP_VPNV6_NODE
, &neighbor_filter_list_cmd
);
10836 install_element (BGP_VPNV6_NODE
, &no_neighbor_filter_list_cmd
);
10837 install_element (BGP_ENCAP_NODE
, &neighbor_filter_list_cmd
);
10838 install_element (BGP_ENCAP_NODE
, &no_neighbor_filter_list_cmd
);
10839 install_element (BGP_ENCAPV6_NODE
, &neighbor_filter_list_cmd
);
10840 install_element (BGP_ENCAPV6_NODE
, &no_neighbor_filter_list_cmd
);
10842 /* "neighbor route-map" commands. */
10843 install_element (BGP_NODE
, &neighbor_route_map_cmd
);
10844 install_element (BGP_NODE
, &no_neighbor_route_map_cmd
);
10845 install_element (BGP_IPV4_NODE
, &neighbor_route_map_cmd
);
10846 install_element (BGP_IPV4_NODE
, &no_neighbor_route_map_cmd
);
10847 install_element (BGP_IPV4M_NODE
, &neighbor_route_map_cmd
);
10848 install_element (BGP_IPV4M_NODE
, &no_neighbor_route_map_cmd
);
10849 install_element (BGP_IPV6_NODE
, &neighbor_route_map_cmd
);
10850 install_element (BGP_IPV6_NODE
, &no_neighbor_route_map_cmd
);
10851 install_element (BGP_IPV6M_NODE
, &neighbor_route_map_cmd
);
10852 install_element (BGP_IPV6M_NODE
, &no_neighbor_route_map_cmd
);
10853 install_element (BGP_VPNV4_NODE
, &neighbor_route_map_cmd
);
10854 install_element (BGP_VPNV4_NODE
, &no_neighbor_route_map_cmd
);
10855 install_element (BGP_VPNV6_NODE
, &neighbor_route_map_cmd
);
10856 install_element (BGP_VPNV6_NODE
, &no_neighbor_route_map_cmd
);
10857 install_element (BGP_ENCAP_NODE
, &neighbor_route_map_cmd
);
10858 install_element (BGP_ENCAP_NODE
, &no_neighbor_route_map_cmd
);
10859 install_element (BGP_ENCAPV6_NODE
, &neighbor_route_map_cmd
);
10860 install_element (BGP_ENCAPV6_NODE
, &no_neighbor_route_map_cmd
);
10862 /* "neighbor unsuppress-map" commands. */
10863 install_element (BGP_NODE
, &neighbor_unsuppress_map_cmd
);
10864 install_element (BGP_NODE
, &no_neighbor_unsuppress_map_cmd
);
10865 install_element (BGP_IPV4_NODE
, &neighbor_unsuppress_map_cmd
);
10866 install_element (BGP_IPV4_NODE
, &no_neighbor_unsuppress_map_cmd
);
10867 install_element (BGP_IPV4M_NODE
, &neighbor_unsuppress_map_cmd
);
10868 install_element (BGP_IPV4M_NODE
, &no_neighbor_unsuppress_map_cmd
);
10869 install_element (BGP_IPV6_NODE
, &neighbor_unsuppress_map_cmd
);
10870 install_element (BGP_IPV6_NODE
, &no_neighbor_unsuppress_map_cmd
);
10871 install_element (BGP_IPV6M_NODE
, &neighbor_unsuppress_map_cmd
);
10872 install_element (BGP_IPV6M_NODE
, &no_neighbor_unsuppress_map_cmd
);
10873 install_element (BGP_VPNV4_NODE
, &neighbor_unsuppress_map_cmd
);
10874 install_element (BGP_VPNV4_NODE
, &no_neighbor_unsuppress_map_cmd
);
10875 install_element (BGP_VPNV6_NODE
, &neighbor_unsuppress_map_cmd
);
10876 install_element (BGP_VPNV6_NODE
, &no_neighbor_unsuppress_map_cmd
);
10877 install_element (BGP_ENCAP_NODE
, &neighbor_unsuppress_map_cmd
);
10878 install_element (BGP_ENCAP_NODE
, &no_neighbor_unsuppress_map_cmd
);
10879 install_element (BGP_ENCAPV6_NODE
, &neighbor_unsuppress_map_cmd
);
10880 install_element (BGP_ENCAPV6_NODE
, &no_neighbor_unsuppress_map_cmd
);
10882 /* "neighbor maximum-prefix" commands. */
10883 install_element (BGP_NODE
, &neighbor_maximum_prefix_cmd
);
10884 install_element (BGP_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
10885 install_element (BGP_NODE
, &neighbor_maximum_prefix_warning_cmd
);
10886 install_element (BGP_NODE
, &neighbor_maximum_prefix_threshold_warning_cmd
);
10887 install_element (BGP_NODE
, &neighbor_maximum_prefix_restart_cmd
);
10888 install_element (BGP_NODE
, &neighbor_maximum_prefix_threshold_restart_cmd
);
10889 install_element (BGP_NODE
, &no_neighbor_maximum_prefix_cmd
);
10890 install_element (BGP_IPV4_NODE
, &neighbor_maximum_prefix_cmd
);
10891 install_element (BGP_IPV4_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
10892 install_element (BGP_IPV4_NODE
, &neighbor_maximum_prefix_warning_cmd
);
10893 install_element (BGP_IPV4_NODE
, &neighbor_maximum_prefix_threshold_warning_cmd
);
10894 install_element (BGP_IPV4_NODE
, &neighbor_maximum_prefix_restart_cmd
);
10895 install_element (BGP_IPV4_NODE
, &neighbor_maximum_prefix_threshold_restart_cmd
);
10896 install_element (BGP_IPV4_NODE
, &no_neighbor_maximum_prefix_cmd
);
10897 install_element (BGP_IPV4M_NODE
, &neighbor_maximum_prefix_cmd
);
10898 install_element (BGP_IPV4M_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
10899 install_element (BGP_IPV4M_NODE
, &neighbor_maximum_prefix_warning_cmd
);
10900 install_element (BGP_IPV4M_NODE
, &neighbor_maximum_prefix_threshold_warning_cmd
);
10901 install_element (BGP_IPV4M_NODE
, &neighbor_maximum_prefix_restart_cmd
);
10902 install_element (BGP_IPV4M_NODE
, &neighbor_maximum_prefix_threshold_restart_cmd
);
10903 install_element (BGP_IPV4M_NODE
, &no_neighbor_maximum_prefix_cmd
);
10904 install_element (BGP_IPV6_NODE
, &neighbor_maximum_prefix_cmd
);
10905 install_element (BGP_IPV6_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
10906 install_element (BGP_IPV6_NODE
, &neighbor_maximum_prefix_warning_cmd
);
10907 install_element (BGP_IPV6_NODE
, &neighbor_maximum_prefix_threshold_warning_cmd
);
10908 install_element (BGP_IPV6_NODE
, &neighbor_maximum_prefix_restart_cmd
);
10909 install_element (BGP_IPV6_NODE
, &neighbor_maximum_prefix_threshold_restart_cmd
);
10910 install_element (BGP_IPV6_NODE
, &no_neighbor_maximum_prefix_cmd
);
10911 install_element (BGP_IPV6M_NODE
, &neighbor_maximum_prefix_cmd
);
10912 install_element (BGP_IPV6M_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
10913 install_element (BGP_IPV6M_NODE
, &neighbor_maximum_prefix_warning_cmd
);
10914 install_element (BGP_IPV6M_NODE
, &neighbor_maximum_prefix_threshold_warning_cmd
);
10915 install_element (BGP_IPV6M_NODE
, &neighbor_maximum_prefix_restart_cmd
);
10916 install_element (BGP_IPV6M_NODE
, &neighbor_maximum_prefix_threshold_restart_cmd
);
10917 install_element (BGP_IPV6M_NODE
, &no_neighbor_maximum_prefix_cmd
);
10918 install_element (BGP_VPNV4_NODE
, &neighbor_maximum_prefix_cmd
);
10919 install_element (BGP_VPNV4_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
10920 install_element (BGP_VPNV4_NODE
, &neighbor_maximum_prefix_warning_cmd
);
10921 install_element (BGP_VPNV4_NODE
, &neighbor_maximum_prefix_threshold_warning_cmd
);
10922 install_element (BGP_VPNV4_NODE
, &neighbor_maximum_prefix_restart_cmd
);
10923 install_element (BGP_VPNV4_NODE
, &neighbor_maximum_prefix_threshold_restart_cmd
);
10924 install_element (BGP_VPNV4_NODE
, &no_neighbor_maximum_prefix_cmd
);
10925 install_element (BGP_VPNV6_NODE
, &neighbor_maximum_prefix_cmd
);
10926 install_element (BGP_VPNV6_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
10927 install_element (BGP_VPNV6_NODE
, &neighbor_maximum_prefix_warning_cmd
);
10928 install_element (BGP_VPNV6_NODE
, &neighbor_maximum_prefix_threshold_warning_cmd
);
10929 install_element (BGP_VPNV6_NODE
, &neighbor_maximum_prefix_restart_cmd
);
10930 install_element (BGP_VPNV6_NODE
, &neighbor_maximum_prefix_threshold_restart_cmd
);
10931 install_element (BGP_VPNV6_NODE
, &no_neighbor_maximum_prefix_cmd
);
10933 install_element (BGP_ENCAP_NODE
, &neighbor_maximum_prefix_cmd
);
10934 install_element (BGP_ENCAP_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
10935 install_element (BGP_ENCAP_NODE
, &neighbor_maximum_prefix_warning_cmd
);
10936 install_element (BGP_ENCAP_NODE
, &neighbor_maximum_prefix_threshold_warning_cmd
);
10937 install_element (BGP_ENCAP_NODE
, &neighbor_maximum_prefix_restart_cmd
);
10938 install_element (BGP_ENCAP_NODE
, &neighbor_maximum_prefix_threshold_restart_cmd
);
10939 install_element (BGP_ENCAP_NODE
, &no_neighbor_maximum_prefix_cmd
);
10941 install_element (BGP_ENCAPV6_NODE
, &neighbor_maximum_prefix_cmd
);
10942 install_element (BGP_ENCAPV6_NODE
, &neighbor_maximum_prefix_threshold_cmd
);
10943 install_element (BGP_ENCAPV6_NODE
, &neighbor_maximum_prefix_warning_cmd
);
10944 install_element (BGP_ENCAPV6_NODE
, &neighbor_maximum_prefix_threshold_warning_cmd
);
10945 install_element (BGP_ENCAPV6_NODE
, &neighbor_maximum_prefix_restart_cmd
);
10946 install_element (BGP_ENCAPV6_NODE
, &neighbor_maximum_prefix_threshold_restart_cmd
);
10947 install_element (BGP_ENCAPV6_NODE
, &no_neighbor_maximum_prefix_cmd
);
10949 /* "neighbor allowas-in" */
10950 install_element (BGP_NODE
, &neighbor_allowas_in_cmd
);
10951 install_element (BGP_NODE
, &no_neighbor_allowas_in_cmd
);
10952 install_element (BGP_IPV4_NODE
, &neighbor_allowas_in_cmd
);
10953 install_element (BGP_IPV4_NODE
, &no_neighbor_allowas_in_cmd
);
10954 install_element (BGP_IPV4M_NODE
, &neighbor_allowas_in_cmd
);
10955 install_element (BGP_IPV4M_NODE
, &no_neighbor_allowas_in_cmd
);
10956 install_element (BGP_IPV6_NODE
, &neighbor_allowas_in_cmd
);
10957 install_element (BGP_IPV6_NODE
, &no_neighbor_allowas_in_cmd
);
10958 install_element (BGP_IPV6M_NODE
, &neighbor_allowas_in_cmd
);
10959 install_element (BGP_IPV6M_NODE
, &no_neighbor_allowas_in_cmd
);
10960 install_element (BGP_VPNV4_NODE
, &neighbor_allowas_in_cmd
);
10961 install_element (BGP_VPNV4_NODE
, &no_neighbor_allowas_in_cmd
);
10962 install_element (BGP_VPNV6_NODE
, &neighbor_allowas_in_cmd
);
10963 install_element (BGP_VPNV6_NODE
, &no_neighbor_allowas_in_cmd
);
10964 install_element (BGP_ENCAP_NODE
, &neighbor_allowas_in_cmd
);
10965 install_element (BGP_ENCAP_NODE
, &no_neighbor_allowas_in_cmd
);
10966 install_element (BGP_ENCAPV6_NODE
, &neighbor_allowas_in_cmd
);
10967 install_element (BGP_ENCAPV6_NODE
, &no_neighbor_allowas_in_cmd
);
10969 /* address-family commands. */
10970 install_element (BGP_NODE
, &address_family_ipv4_safi_cmd
);
10971 install_element (BGP_NODE
, &address_family_ipv6_safi_cmd
);
10972 #ifdef KEEP_OLD_VPN_COMMANDS
10973 install_element (BGP_NODE
, &address_family_vpnv4_cmd
);
10974 install_element (BGP_NODE
, &address_family_vpnv6_cmd
);
10975 #endif /* KEEP_OLD_VPN_COMMANDS */
10977 install_element (BGP_NODE
, &address_family_encap_cmd
);
10978 install_element (BGP_NODE
, &address_family_encapv6_cmd
);
10980 install_element (BGP_NODE
, &address_family_evpn_cmd
);
10982 /* "exit-address-family" command. */
10983 install_element (BGP_IPV4_NODE
, &exit_address_family_cmd
);
10984 install_element (BGP_IPV4M_NODE
, &exit_address_family_cmd
);
10985 install_element (BGP_IPV6_NODE
, &exit_address_family_cmd
);
10986 install_element (BGP_IPV6M_NODE
, &exit_address_family_cmd
);
10987 install_element (BGP_VPNV4_NODE
, &exit_address_family_cmd
);
10988 install_element (BGP_VPNV6_NODE
, &exit_address_family_cmd
);
10989 install_element (BGP_ENCAP_NODE
, &exit_address_family_cmd
);
10990 install_element (BGP_ENCAPV6_NODE
, &exit_address_family_cmd
);
10991 install_element (BGP_EVPN_NODE
, &exit_address_family_cmd
);
10993 /* "clear ip bgp commands" */
10994 install_element (ENABLE_NODE
, &clear_ip_bgp_all_cmd
);
10996 /* clear ip bgp prefix */
10997 install_element (ENABLE_NODE
, &clear_ip_bgp_prefix_cmd
);
10998 install_element (ENABLE_NODE
, &clear_bgp_ipv6_safi_prefix_cmd
);
10999 install_element (ENABLE_NODE
, &clear_bgp_instance_ipv6_safi_prefix_cmd
);
11001 /* "show [ip] bgp summary" commands. */
11002 install_element (VIEW_NODE
, &show_bgp_instance_all_ipv6_updgrps_cmd
);
11003 install_element (VIEW_NODE
, &show_bgp_instance_updgrps_adj_cmd
);
11004 install_element (VIEW_NODE
, &show_bgp_instance_updgrps_adj_s_cmd
);
11005 install_element (VIEW_NODE
, &show_bgp_instance_updgrps_stats_cmd
);
11006 install_element (VIEW_NODE
, &show_bgp_updgrps_adj_cmd
);
11007 install_element (VIEW_NODE
, &show_bgp_updgrps_adj_s_cmd
);
11008 install_element (VIEW_NODE
, &show_bgp_updgrps_afi_adj_cmd
);
11009 install_element (VIEW_NODE
, &show_bgp_updgrps_afi_adj_s_cmd
);
11010 install_element (VIEW_NODE
, &show_bgp_updgrps_stats_cmd
);
11011 install_element (VIEW_NODE
, &show_ip_bgp_instance_updgrps_adj_cmd
);
11012 install_element (VIEW_NODE
, &show_ip_bgp_instance_updgrps_adj_s_cmd
);
11013 install_element (VIEW_NODE
, &show_ip_bgp_summary_cmd
);
11014 install_element (VIEW_NODE
, &show_ip_bgp_updgrps_adj_cmd
);
11015 install_element (VIEW_NODE
, &show_ip_bgp_updgrps_adj_s_cmd
);
11016 install_element (VIEW_NODE
, &show_ip_bgp_updgrps_cmd
);
11018 /* "show [ip] bgp neighbors" commands. */
11019 install_element (VIEW_NODE
, &show_ip_bgp_neighbors_cmd
);
11021 /* "show [ip] bgp peer-group" commands. */
11022 install_element (VIEW_NODE
, &show_ip_bgp_peer_groups_cmd
);
11024 /* "show [ip] bgp paths" commands. */
11025 install_element (VIEW_NODE
, &show_ip_bgp_paths_cmd
);
11027 /* "show [ip] bgp community" commands. */
11028 install_element (VIEW_NODE
, &show_ip_bgp_community_info_cmd
);
11030 /* "show ip bgp large-community" commands. */
11031 install_element (VIEW_NODE
, &show_ip_bgp_lcommunity_info_cmd
);
11032 /* "show [ip] bgp attribute-info" commands. */
11033 install_element (VIEW_NODE
, &show_ip_bgp_attr_info_cmd
);
11035 /* "redistribute" commands. */
11036 install_element (BGP_NODE
, &bgp_redistribute_ipv4_cmd
);
11037 install_element (BGP_NODE
, &no_bgp_redistribute_ipv4_cmd
);
11038 install_element (BGP_NODE
, &bgp_redistribute_ipv4_rmap_cmd
);
11039 install_element (BGP_NODE
, &bgp_redistribute_ipv4_metric_cmd
);
11040 install_element (BGP_NODE
, &bgp_redistribute_ipv4_rmap_metric_cmd
);
11041 install_element (BGP_NODE
, &bgp_redistribute_ipv4_metric_rmap_cmd
);
11042 install_element (BGP_NODE
, &bgp_redistribute_ipv4_ospf_cmd
);
11043 install_element (BGP_NODE
, &no_bgp_redistribute_ipv4_ospf_cmd
);
11044 install_element (BGP_NODE
, &bgp_redistribute_ipv4_ospf_rmap_cmd
);
11045 install_element (BGP_NODE
, &bgp_redistribute_ipv4_ospf_metric_cmd
);
11046 install_element (BGP_NODE
, &bgp_redistribute_ipv4_ospf_rmap_metric_cmd
);
11047 install_element (BGP_NODE
, &bgp_redistribute_ipv4_ospf_metric_rmap_cmd
);
11048 install_element (BGP_IPV4_NODE
, &bgp_redistribute_ipv4_cmd
);
11049 install_element (BGP_IPV4_NODE
, &no_bgp_redistribute_ipv4_cmd
);
11050 install_element (BGP_IPV4_NODE
, &bgp_redistribute_ipv4_rmap_cmd
);
11051 install_element (BGP_IPV4_NODE
, &bgp_redistribute_ipv4_metric_cmd
);
11052 install_element (BGP_IPV4_NODE
, &bgp_redistribute_ipv4_rmap_metric_cmd
);
11053 install_element (BGP_IPV4_NODE
, &bgp_redistribute_ipv4_metric_rmap_cmd
);
11054 install_element (BGP_IPV4_NODE
, &bgp_redistribute_ipv4_ospf_cmd
);
11055 install_element (BGP_IPV4_NODE
, &no_bgp_redistribute_ipv4_ospf_cmd
);
11056 install_element (BGP_IPV4_NODE
, &bgp_redistribute_ipv4_ospf_rmap_cmd
);
11057 install_element (BGP_IPV4_NODE
, &bgp_redistribute_ipv4_ospf_metric_cmd
);
11058 install_element (BGP_IPV4_NODE
, &bgp_redistribute_ipv4_ospf_rmap_metric_cmd
);
11059 install_element (BGP_IPV4_NODE
, &bgp_redistribute_ipv4_ospf_metric_rmap_cmd
);
11060 install_element (BGP_IPV6_NODE
, &bgp_redistribute_ipv6_cmd
);
11061 install_element (BGP_IPV6_NODE
, &no_bgp_redistribute_ipv6_cmd
);
11062 install_element (BGP_IPV6_NODE
, &bgp_redistribute_ipv6_rmap_cmd
);
11063 install_element (BGP_IPV6_NODE
, &bgp_redistribute_ipv6_metric_cmd
);
11064 install_element (BGP_IPV6_NODE
, &bgp_redistribute_ipv6_rmap_metric_cmd
);
11065 install_element (BGP_IPV6_NODE
, &bgp_redistribute_ipv6_metric_rmap_cmd
);
11067 /* ttl_security commands */
11068 install_element (BGP_NODE
, &neighbor_ttl_security_cmd
);
11069 install_element (BGP_NODE
, &no_neighbor_ttl_security_cmd
);
11071 /* "show [ip] bgp memory" commands. */
11072 install_element (VIEW_NODE
, &show_bgp_memory_cmd
);
11074 /* "show [ip] bgp views" commands. */
11075 install_element (VIEW_NODE
, &show_bgp_views_cmd
);
11077 /* "show [ip] bgp vrfs" commands. */
11078 install_element (VIEW_NODE
, &show_bgp_vrfs_cmd
);
11080 /* Community-list. */
11081 community_list_vty ();
11084 #include "memory.h"
11085 #include "bgp_regex.h"
11086 #include "bgp_clist.h"
11087 #include "bgp_ecommunity.h"
11089 /* VTY functions. */
11091 /* Direction value to string conversion. */
11092 static const char *
11093 community_direct_str (int direct
)
11097 case COMMUNITY_DENY
:
11099 case COMMUNITY_PERMIT
:
11106 /* Display error string. */
11108 community_list_perror (struct vty
*vty
, int ret
)
11112 case COMMUNITY_LIST_ERR_CANT_FIND_LIST
:
11113 vty_out (vty
, "%% Can't find community-list%s", VTY_NEWLINE
);
11115 case COMMUNITY_LIST_ERR_MALFORMED_VAL
:
11116 vty_out (vty
, "%% Malformed community-list value%s", VTY_NEWLINE
);
11118 case COMMUNITY_LIST_ERR_STANDARD_CONFLICT
:
11119 vty_out (vty
, "%% Community name conflict, previously defined as standard community%s", VTY_NEWLINE
);
11121 case COMMUNITY_LIST_ERR_EXPANDED_CONFLICT
:
11122 vty_out (vty
, "%% Community name conflict, previously defined as expanded community%s", VTY_NEWLINE
);
11127 /* "community-list" keyword help string. */
11128 #define COMMUNITY_LIST_STR "Add a community list entry\n"
11131 /* ip community-list standard */
11132 DEFUN (ip_community_list_standard
,
11133 ip_community_list_standard_cmd
,
11134 "ip community-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
11137 "Community list number (standard)\n"
11138 "Add an standard community-list entry\n"
11139 "Community list name\n"
11140 "Specify community to reject\n"
11141 "Specify community to accept\n"
11144 char *cl_name_or_number
= NULL
;
11146 int style
= COMMUNITY_LIST_STANDARD
;
11149 argv_find (argv
, argc
, "(1-99)", &idx
);
11150 argv_find (argv
, argc
, "WORD", &idx
);
11151 cl_name_or_number
= argv
[idx
]->arg
;
11152 direct
= argv_find (argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
: COMMUNITY_DENY
;
11153 argv_find (argv
, argc
, "AA:NN", &idx
);
11154 char *str
= argv_concat (argv
, argc
, idx
);
11156 int ret
= community_list_set (bgp_clist
, cl_name_or_number
, str
, direct
, style
);
11158 XFREE (MTYPE_TMP
, str
);
11162 /* Display error string. */
11163 community_list_perror (vty
, ret
);
11164 return CMD_WARNING
;
11167 return CMD_SUCCESS
;
11170 DEFUN (no_ip_community_list_standard_all
,
11171 no_ip_community_list_standard_all_cmd
,
11172 "no ip community-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
11176 "Community list number (standard)\n"
11177 "Add an standard community-list entry\n"
11178 "Community list name\n"
11179 "Specify community to reject\n"
11180 "Specify community to accept\n"
11183 int delete_all
= 0;
11185 char *cl_name_or_number
= NULL
;
11187 int style
= COMMUNITY_LIST_STANDARD
;
11190 argv_find (argv
, argc
, "(1-99)", &idx
);
11191 argv_find (argv
, argc
, "WORD", &idx
);
11192 cl_name_or_number
= argv
[idx
]->arg
;
11193 direct
= argv_find (argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
: COMMUNITY_DENY
;
11194 argv_find (argv
, argc
, "AA:NN", &idx
);
11195 char *str
= argv_concat (argv
, argc
, idx
);
11197 int ret
= community_list_unset (bgp_clist
, cl_name_or_number
, str
, direct
, style
, delete_all
);
11199 XFREE (MTYPE_TMP
, str
);
11203 community_list_perror (vty
, ret
);
11204 return CMD_WARNING
;
11207 return CMD_SUCCESS
;
11210 /* ip community-list expanded */
11211 DEFUN (ip_community_list_expanded_all
,
11212 ip_community_list_expanded_all_cmd
,
11213 "ip community-list <(100-500)|expanded WORD> <deny|permit> AA:NN...",
11216 "Community list number (expanded)\n"
11217 "Add an expanded community-list entry\n"
11218 "Community list name\n"
11219 "Specify community to reject\n"
11220 "Specify community to accept\n"
11223 char *cl_name_or_number
= NULL
;
11225 int style
= COMMUNITY_LIST_EXPANDED
;
11228 argv_find (argv
, argc
, "(100-500)", &idx
);
11229 argv_find (argv
, argc
, "WORD", &idx
);
11230 cl_name_or_number
= argv
[idx
]->arg
;
11231 direct
= argv_find (argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
: COMMUNITY_DENY
;
11232 argv_find (argv
, argc
, "AA:NN", &idx
);
11233 char *str
= argv_concat (argv
, argc
, idx
);
11235 int ret
= community_list_set (bgp_clist
, cl_name_or_number
, str
, direct
, style
);
11237 XFREE (MTYPE_TMP
, str
);
11241 /* Display error string. */
11242 community_list_perror (vty
, ret
);
11243 return CMD_WARNING
;
11246 return CMD_SUCCESS
;
11249 DEFUN (no_ip_community_list_expanded_all
,
11250 no_ip_community_list_expanded_all_cmd
,
11251 "no ip community-list <(100-500)|expanded WORD> <deny|permit> AA:NN...",
11255 "Community list number (expanded)\n"
11256 "Add an expanded community-list entry\n"
11257 "Community list name\n"
11258 "Specify community to reject\n"
11259 "Specify community to accept\n"
11262 int delete_all
= 0;
11264 char *cl_name_or_number
= NULL
;
11266 int style
= COMMUNITY_LIST_EXPANDED
;
11269 argv_find (argv
, argc
, "(100-500)", &idx
);
11270 argv_find (argv
, argc
, "WORD", &idx
);
11271 cl_name_or_number
= argv
[idx
]->arg
;
11272 direct
= argv_find (argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
: COMMUNITY_DENY
;
11273 argv_find (argv
, argc
, "AA:NN", &idx
);
11274 char *str
= argv_concat (argv
, argc
, idx
);
11276 int ret
= community_list_unset (bgp_clist
, cl_name_or_number
, str
, direct
, style
, delete_all
);
11278 XFREE (MTYPE_TMP
, str
);
11282 community_list_perror (vty
, ret
);
11283 return CMD_WARNING
;
11286 return CMD_SUCCESS
;
11290 community_list_show (struct vty
*vty
, struct community_list
*list
)
11292 struct community_entry
*entry
;
11294 for (entry
= list
->head
; entry
; entry
= entry
->next
)
11296 if (entry
== list
->head
)
11298 if (all_digit (list
->name
))
11299 vty_out (vty
, "Community %s list %s%s",
11300 entry
->style
== COMMUNITY_LIST_STANDARD
?
11301 "standard" : "(expanded) access",
11302 list
->name
, VTY_NEWLINE
);
11304 vty_out (vty
, "Named Community %s list %s%s",
11305 entry
->style
== COMMUNITY_LIST_STANDARD
?
11306 "standard" : "expanded",
11307 list
->name
, VTY_NEWLINE
);
11310 vty_out (vty
, " %s%s",
11311 community_direct_str (entry
->direct
), VTY_NEWLINE
);
11313 vty_out (vty
, " %s %s%s",
11314 community_direct_str (entry
->direct
),
11315 entry
->style
== COMMUNITY_LIST_STANDARD
11316 ? community_str (entry
->u
.com
) : entry
->config
,
11321 DEFUN (show_ip_community_list
,
11322 show_ip_community_list_cmd
,
11323 "show ip community-list",
11326 "List community-list\n")
11328 struct community_list
*list
;
11329 struct community_list_master
*cm
;
11331 cm
= community_list_master_lookup (bgp_clist
, COMMUNITY_LIST_MASTER
);
11333 return CMD_SUCCESS
;
11335 for (list
= cm
->num
.head
; list
; list
= list
->next
)
11336 community_list_show (vty
, list
);
11338 for (list
= cm
->str
.head
; list
; list
= list
->next
)
11339 community_list_show (vty
, list
);
11341 return CMD_SUCCESS
;
11344 DEFUN (show_ip_community_list_arg
,
11345 show_ip_community_list_arg_cmd
,
11346 "show ip community-list <(1-500)|WORD>",
11349 "List community-list\n"
11350 "Community-list number\n"
11351 "Community-list name\n")
11353 int idx_comm_list
= 3;
11354 struct community_list
*list
;
11356 list
= community_list_lookup (bgp_clist
, argv
[idx_comm_list
]->arg
, COMMUNITY_LIST_MASTER
);
11359 vty_out (vty
, "%% Can't find community-list%s", VTY_NEWLINE
);
11360 return CMD_WARNING
;
11363 community_list_show (vty
, list
);
11365 return CMD_SUCCESS
;
11369 * Large Community code.
11372 lcommunity_list_set_vty (struct vty
*vty
, int argc
, struct cmd_token
**argv
,
11373 int style
, int reject_all_digit_name
)
11381 direct
= argv_find (argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
: COMMUNITY_DENY
;
11383 /* All digit name check. */
11385 argv_find (argv
, argc
, "WORD", &idx
);
11386 argv_find (argv
, argc
, "(1-99)", &idx
);
11387 argv_find (argv
, argc
, "(100-500)", &idx
);
11388 cl_name
= argv
[idx
]->arg
;
11389 if (reject_all_digit_name
&& all_digit (cl_name
))
11391 vty_out (vty
, "%% Community name cannot have all digits%s", VTY_NEWLINE
);
11392 return CMD_WARNING
;
11395 argv_find (argv
, argc
, "AA:BB:CC", &idx
);
11396 argv_find (argv
, argc
, "LINE", &idx
);
11397 /* Concat community string argument. */
11399 str
= argv_concat (argv
, argc
, idx
);
11403 ret
= lcommunity_list_set (bgp_clist
, cl_name
, str
, direct
, style
);
11405 /* Free temporary community list string allocated by
11408 XFREE (MTYPE_TMP
, str
);
11412 community_list_perror (vty
, ret
);
11413 return CMD_WARNING
;
11415 return CMD_SUCCESS
;
11419 lcommunity_list_unset_vty (struct vty
*vty
, int argc
, struct cmd_token
**argv
,
11427 argv_find (argv
, argc
, "permit", &idx
);
11428 argv_find (argv
, argc
, "deny", &idx
);
11432 /* Check the list direct. */
11433 if (strncmp (argv
[idx
]->arg
, "p", 1) == 0)
11434 direct
= COMMUNITY_PERMIT
;
11436 direct
= COMMUNITY_DENY
;
11439 argv_find (argv
, argc
, "LINE", &idx
);
11440 argv_find (argv
, argc
, "AA:AA:NN", &idx
);
11441 /* Concat community string argument. */
11442 str
= argv_concat (argv
, argc
, idx
);
11446 argv_find (argv
, argc
, "(1-99)", &idx
);
11447 argv_find (argv
, argc
, "(100-500)", &idx
);
11448 argv_find (argv
, argc
, "WORD", &idx
);
11450 /* Unset community list. */
11451 ret
= lcommunity_list_unset (bgp_clist
, argv
[idx
]->arg
, str
, direct
, style
);
11453 /* Free temporary community list string allocated by
11456 XFREE (MTYPE_TMP
, str
);
11460 community_list_perror (vty
, ret
);
11461 return CMD_WARNING
;
11464 return CMD_SUCCESS
;
11467 /* "large-community-list" keyword help string. */
11468 #define LCOMMUNITY_LIST_STR "Add a large community list entry\n"
11469 #define LCOMMUNITY_VAL_STR "large community in 'aa:bb:cc' format\n"
11471 DEFUN (ip_lcommunity_list_standard
,
11472 ip_lcommunity_list_standard_cmd
,
11473 "ip large-community-list (1-99) <deny|permit>",
11475 LCOMMUNITY_LIST_STR
11476 "Large Community list number (standard)\n"
11477 "Specify large community to reject\n"
11478 "Specify large community to accept\n"
11479 LCOMMUNITY_VAL_STR
)
11481 return lcommunity_list_set_vty (vty
, argc
, argv
, LARGE_COMMUNITY_LIST_STANDARD
, 0);
11484 DEFUN (ip_lcommunity_list_standard1
,
11485 ip_lcommunity_list_standard1_cmd
,
11486 "ip large-community-list (1-99) <deny|permit> AA:BB:CC...",
11488 LCOMMUNITY_LIST_STR
11489 "Large Community list number (standard)\n"
11490 "Specify large community to reject\n"
11491 "Specify large community to accept\n"
11492 LCOMMUNITY_VAL_STR
)
11494 return lcommunity_list_set_vty (vty
, argc
, argv
, LARGE_COMMUNITY_LIST_STANDARD
, 0);
11497 DEFUN (ip_lcommunity_list_expanded
,
11498 ip_lcommunity_list_expanded_cmd
,
11499 "ip large-community-list (100-500) <deny|permit> LINE...",
11501 LCOMMUNITY_LIST_STR
11502 "Large Community list number (expanded)\n"
11503 "Specify large community to reject\n"
11504 "Specify large community to accept\n"
11505 "An ordered list as a regular-expression\n")
11507 return lcommunity_list_set_vty (vty
, argc
, argv
, LARGE_COMMUNITY_LIST_EXPANDED
, 0);
11510 DEFUN (ip_lcommunity_list_name_standard
,
11511 ip_lcommunity_list_name_standard_cmd
,
11512 "ip large-community-list standard WORD <deny|permit>",
11514 LCOMMUNITY_LIST_STR
11515 "Specify standard large-community-list\n"
11516 "Large Community list name\n"
11517 "Specify large community to reject\n"
11518 "Specify large community to accept\n")
11520 return lcommunity_list_set_vty (vty
, argc
, argv
, LARGE_COMMUNITY_LIST_STANDARD
, 1);
11523 DEFUN (ip_lcommunity_list_name_standard1
,
11524 ip_lcommunity_list_name_standard1_cmd
,
11525 "ip large-community-list standard WORD <deny|permit> AA:BB:CC...",
11527 LCOMMUNITY_LIST_STR
11528 "Specify standard large-community-list\n"
11529 "Large Community list name\n"
11530 "Specify large community to reject\n"
11531 "Specify large community to accept\n"
11532 LCOMMUNITY_VAL_STR
)
11534 return lcommunity_list_set_vty (vty
, argc
, argv
, LARGE_COMMUNITY_LIST_STANDARD
, 1);
11537 DEFUN (ip_lcommunity_list_name_expanded
,
11538 ip_lcommunity_list_name_expanded_cmd
,
11539 "ip large-community-list expanded WORD <deny|permit> LINE...",
11541 LCOMMUNITY_LIST_STR
11542 "Specify expanded large-community-list\n"
11543 "Large Community list name\n"
11544 "Specify large community to reject\n"
11545 "Specify large community to accept\n"
11546 "An ordered list as a regular-expression\n")
11548 return lcommunity_list_set_vty (vty
, argc
, argv
, LARGE_COMMUNITY_LIST_EXPANDED
, 1);
11551 DEFUN (no_ip_lcommunity_list_standard_all
,
11552 no_ip_lcommunity_list_standard_all_cmd
,
11553 "no ip large-community-list <(1-99)|(100-500)|WORD>",
11556 LCOMMUNITY_LIST_STR
11557 "Large Community list number (standard)\n"
11558 "Large Community list number (expanded)\n"
11559 "Large Community list name\n")
11561 return lcommunity_list_unset_vty (vty
, argc
, argv
, LARGE_COMMUNITY_LIST_STANDARD
);
11564 DEFUN (no_ip_lcommunity_list_name_expanded_all
,
11565 no_ip_lcommunity_list_name_expanded_all_cmd
,
11566 "no ip large-community-list expanded WORD",
11569 LCOMMUNITY_LIST_STR
11570 "Specify expanded large-community-list\n"
11571 "Large Community list name\n")
11573 return lcommunity_list_unset_vty (vty
, argc
, argv
, LARGE_COMMUNITY_LIST_EXPANDED
);
11576 DEFUN (no_ip_lcommunity_list_standard
,
11577 no_ip_lcommunity_list_standard_cmd
,
11578 "no ip large-community-list (1-99) <deny|permit> AA:AA:NN...",
11581 LCOMMUNITY_LIST_STR
11582 "Large Community list number (standard)\n"
11583 "Specify large community to reject\n"
11584 "Specify large community to accept\n"
11585 LCOMMUNITY_VAL_STR
)
11587 return lcommunity_list_unset_vty (vty
, argc
, argv
, LARGE_COMMUNITY_LIST_STANDARD
);
11590 DEFUN (no_ip_lcommunity_list_expanded
,
11591 no_ip_lcommunity_list_expanded_cmd
,
11592 "no ip large-community-list (100-500) <deny|permit> LINE...",
11595 LCOMMUNITY_LIST_STR
11596 "Large Community list number (expanded)\n"
11597 "Specify large community to reject\n"
11598 "Specify large community to accept\n"
11599 "An ordered list as a regular-expression\n")
11601 return lcommunity_list_unset_vty (vty
, argc
, argv
, LARGE_COMMUNITY_LIST_EXPANDED
);
11604 DEFUN (no_ip_lcommunity_list_name_standard
,
11605 no_ip_lcommunity_list_name_standard_cmd
,
11606 "no ip large-community-list standard WORD <deny|permit> AA:AA:NN...",
11609 LCOMMUNITY_LIST_STR
11610 "Specify standard large-community-list\n"
11611 "Large Community list name\n"
11612 "Specify large community to reject\n"
11613 "Specify large community to accept\n"
11614 LCOMMUNITY_VAL_STR
)
11616 return lcommunity_list_unset_vty (vty
, argc
, argv
, LARGE_COMMUNITY_LIST_STANDARD
);
11619 DEFUN (no_ip_lcommunity_list_name_expanded
,
11620 no_ip_lcommunity_list_name_expanded_cmd
,
11621 "no ip large-community-list expanded WORD <deny|permit> LINE...",
11624 LCOMMUNITY_LIST_STR
11625 "Specify expanded large-community-list\n"
11626 "Large community list name\n"
11627 "Specify large community to reject\n"
11628 "Specify large community to accept\n"
11629 "An ordered list as a regular-expression\n")
11631 return lcommunity_list_unset_vty (vty
, argc
, argv
, LARGE_COMMUNITY_LIST_EXPANDED
);
11635 lcommunity_list_show (struct vty
*vty
, struct community_list
*list
)
11637 struct community_entry
*entry
;
11639 for (entry
= list
->head
; entry
; entry
= entry
->next
)
11641 if (entry
== list
->head
)
11643 if (all_digit (list
->name
))
11644 vty_out (vty
, "Large community %s list %s%s",
11645 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
?
11646 "standard" : "(expanded) access",
11647 list
->name
, VTY_NEWLINE
);
11649 vty_out (vty
, "Named large community %s list %s%s",
11650 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
?
11651 "standard" : "expanded",
11652 list
->name
, VTY_NEWLINE
);
11655 vty_out (vty
, " %s%s",
11656 community_direct_str (entry
->direct
), VTY_NEWLINE
);
11658 vty_out (vty
, " %s %s%s",
11659 community_direct_str (entry
->direct
),
11660 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
?
11661 entry
->u
.ecom
->str
: entry
->config
,
11666 DEFUN (show_ip_lcommunity_list
,
11667 show_ip_lcommunity_list_cmd
,
11668 "show ip large-community-list",
11671 "List large-community list\n")
11673 struct community_list
*list
;
11674 struct community_list_master
*cm
;
11676 cm
= community_list_master_lookup (bgp_clist
, LARGE_COMMUNITY_LIST_MASTER
);
11678 return CMD_SUCCESS
;
11680 for (list
= cm
->num
.head
; list
; list
= list
->next
)
11681 lcommunity_list_show (vty
, list
);
11683 for (list
= cm
->str
.head
; list
; list
= list
->next
)
11684 lcommunity_list_show (vty
, list
);
11686 return CMD_SUCCESS
;
11689 DEFUN (show_ip_lcommunity_list_arg
,
11690 show_ip_lcommunity_list_arg_cmd
,
11691 "show ip large-community-list <(1-500)|WORD>",
11694 "List large-community list\n"
11695 "large-community-list number\n"
11696 "large-community-list name\n")
11698 struct community_list
*list
;
11700 list
= community_list_lookup (bgp_clist
, argv
[3]->arg
, LARGE_COMMUNITY_LIST_MASTER
);
11703 vty_out (vty
, "%% Can't find extcommunity-list%s", VTY_NEWLINE
);
11704 return CMD_WARNING
;
11707 lcommunity_list_show (vty
, list
);
11709 return CMD_SUCCESS
;
11712 /* "extcommunity-list" keyword help string. */
11713 #define EXTCOMMUNITY_LIST_STR "Add a extended community list entry\n"
11714 #define EXTCOMMUNITY_VAL_STR "Extended community attribute in 'rt aa:nn_or_IPaddr:nn' OR 'soo aa:nn_or_IPaddr:nn' format\n"
11716 DEFUN (ip_extcommunity_list_standard
,
11717 ip_extcommunity_list_standard_cmd
,
11718 "ip extcommunity-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
11720 EXTCOMMUNITY_LIST_STR
11721 "Extended Community list number (standard)\n"
11722 "Specify standard extcommunity-list\n"
11723 "Community list name\n"
11724 "Specify community to reject\n"
11725 "Specify community to accept\n"
11726 EXTCOMMUNITY_VAL_STR
)
11728 int style
= EXTCOMMUNITY_LIST_STANDARD
;
11730 char *cl_number_or_name
= NULL
;
11733 argv_find (argv
, argc
, "(1-99)", &idx
);
11734 argv_find (argv
, argc
, "WORD", &idx
);
11735 cl_number_or_name
= argv
[idx
]->arg
;
11736 direct
= argv_find (argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
: COMMUNITY_DENY
;
11737 argv_find (argv
, argc
, "AA:NN", &idx
);
11738 char *str
= argv_concat (argv
, argc
, idx
);
11740 int ret
= extcommunity_list_set (bgp_clist
, cl_number_or_name
, str
, direct
, style
);
11742 XFREE (MTYPE_TMP
, str
);
11746 community_list_perror (vty
, ret
);
11747 return CMD_WARNING
;
11750 return CMD_SUCCESS
;
11753 DEFUN (ip_extcommunity_list_name_expanded
,
11754 ip_extcommunity_list_name_expanded_cmd
,
11755 "ip extcommunity-list <(100-500)|expanded WORD> <deny|permit> LINE...",
11757 EXTCOMMUNITY_LIST_STR
11758 "Extended Community list number (expanded)\n"
11759 "Specify expanded extcommunity-list\n"
11760 "Extended Community list name\n"
11761 "Specify community to reject\n"
11762 "Specify community to accept\n"
11763 "An ordered list as a regular-expression\n")
11765 int style
= EXTCOMMUNITY_LIST_EXPANDED
;
11767 char *cl_number_or_name
= NULL
;
11770 argv_find (argv
, argc
, "(100-500)", &idx
);
11771 argv_find (argv
, argc
, "WORD", &idx
);
11772 cl_number_or_name
= argv
[idx
]->arg
;
11773 direct
= argv_find (argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
: COMMUNITY_DENY
;
11774 argv_find (argv
, argc
, "LINE", &idx
);
11775 char *str
= argv_concat (argv
, argc
, idx
);
11777 int ret
= extcommunity_list_set (bgp_clist
, cl_number_or_name
, str
, direct
, style
);
11779 XFREE (MTYPE_TMP
, str
);
11783 community_list_perror (vty
, ret
);
11784 return CMD_WARNING
;
11787 return CMD_SUCCESS
;
11790 DEFUN (no_ip_extcommunity_list_standard_all
,
11791 no_ip_extcommunity_list_standard_all_cmd
,
11792 "no ip extcommunity-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
11795 EXTCOMMUNITY_LIST_STR
11796 "Extended Community list number (standard)\n"
11797 "Specify standard extcommunity-list\n"
11798 "Community list name\n"
11799 "Specify community to reject\n"
11800 "Specify community to accept\n"
11801 EXTCOMMUNITY_VAL_STR
)
11805 int style
= EXTCOMMUNITY_LIST_STANDARD
;
11807 char *cl_number_or_name
= NULL
;
11810 argv_find (argv
, argc
, "(1-99)", &idx
);
11811 argv_find (argv
, argc
, "WORD", &idx
);
11812 cl_number_or_name
= argv
[idx
]->arg
;
11813 direct
= argv_find (argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
: COMMUNITY_DENY
;
11814 argv_find (argv
, argc
, "AA:NN", &idx
);
11815 char *str
= argv_concat (argv
, argc
, idx
);
11817 int ret
= extcommunity_list_unset (bgp_clist
, cl_number_or_name
, str
, direct
, style
, deleteall
);
11819 XFREE (MTYPE_TMP
, str
);
11823 community_list_perror (vty
, ret
);
11824 return CMD_WARNING
;
11827 return CMD_SUCCESS
;
11830 DEFUN (no_ip_extcommunity_list_expanded_all
,
11831 no_ip_extcommunity_list_expanded_all_cmd
,
11832 "no ip extcommunity-list <(100-500)|expanded WORD> <deny|permit> LINE...",
11835 EXTCOMMUNITY_LIST_STR
11836 "Extended Community list number (expanded)\n"
11837 "Specify expanded extcommunity-list\n"
11838 "Extended Community list name\n"
11839 "Specify community to reject\n"
11840 "Specify community to accept\n"
11841 "An ordered list as a regular-expression\n")
11845 int style
= EXTCOMMUNITY_LIST_EXPANDED
;
11847 char *cl_number_or_name
= NULL
;
11850 argv_find (argv
, argc
, "(100-500)", &idx
);
11851 argv_find (argv
, argc
, "WORD", &idx
);
11852 cl_number_or_name
= argv
[idx
]->arg
;
11853 direct
= argv_find (argv
, argc
, "permit", &idx
) ? COMMUNITY_PERMIT
: COMMUNITY_DENY
;
11854 argv_find (argv
, argc
, "LINE", &idx
);
11855 char *str
= argv_concat (argv
, argc
, idx
);
11857 int ret
= extcommunity_list_unset (bgp_clist
, cl_number_or_name
, str
, direct
, style
, deleteall
);
11859 XFREE (MTYPE_TMP
, str
);
11863 community_list_perror (vty
, ret
);
11864 return CMD_WARNING
;
11867 return CMD_SUCCESS
;
11871 extcommunity_list_show (struct vty
*vty
, struct community_list
*list
)
11873 struct community_entry
*entry
;
11875 for (entry
= list
->head
; entry
; entry
= entry
->next
)
11877 if (entry
== list
->head
)
11879 if (all_digit (list
->name
))
11880 vty_out (vty
, "Extended community %s list %s%s",
11881 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
?
11882 "standard" : "(expanded) access",
11883 list
->name
, VTY_NEWLINE
);
11885 vty_out (vty
, "Named extended community %s list %s%s",
11886 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
?
11887 "standard" : "expanded",
11888 list
->name
, VTY_NEWLINE
);
11891 vty_out (vty
, " %s%s",
11892 community_direct_str (entry
->direct
), VTY_NEWLINE
);
11894 vty_out (vty
, " %s %s%s",
11895 community_direct_str (entry
->direct
),
11896 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
?
11897 entry
->u
.ecom
->str
: entry
->config
,
11902 DEFUN (show_ip_extcommunity_list
,
11903 show_ip_extcommunity_list_cmd
,
11904 "show ip extcommunity-list",
11907 "List extended-community list\n")
11909 struct community_list
*list
;
11910 struct community_list_master
*cm
;
11912 cm
= community_list_master_lookup (bgp_clist
, EXTCOMMUNITY_LIST_MASTER
);
11914 return CMD_SUCCESS
;
11916 for (list
= cm
->num
.head
; list
; list
= list
->next
)
11917 extcommunity_list_show (vty
, list
);
11919 for (list
= cm
->str
.head
; list
; list
= list
->next
)
11920 extcommunity_list_show (vty
, list
);
11922 return CMD_SUCCESS
;
11925 DEFUN (show_ip_extcommunity_list_arg
,
11926 show_ip_extcommunity_list_arg_cmd
,
11927 "show ip extcommunity-list <(1-500)|WORD>",
11930 "List extended-community list\n"
11931 "Extcommunity-list number\n"
11932 "Extcommunity-list name\n")
11934 int idx_comm_list
= 3;
11935 struct community_list
*list
;
11937 list
= community_list_lookup (bgp_clist
, argv
[idx_comm_list
]->arg
, EXTCOMMUNITY_LIST_MASTER
);
11940 vty_out (vty
, "%% Can't find extcommunity-list%s", VTY_NEWLINE
);
11941 return CMD_WARNING
;
11944 extcommunity_list_show (vty
, list
);
11946 return CMD_SUCCESS
;
11949 /* Return configuration string of community-list entry. */
11950 static const char *
11951 community_list_config_str (struct community_entry
*entry
)
11959 if (entry
->style
== COMMUNITY_LIST_STANDARD
)
11960 str
= community_str (entry
->u
.com
);
11962 str
= entry
->config
;
11967 /* Display community-list and extcommunity-list configuration. */
11969 community_list_config_write (struct vty
*vty
)
11971 struct community_list
*list
;
11972 struct community_entry
*entry
;
11973 struct community_list_master
*cm
;
11976 /* Community-list. */
11977 cm
= community_list_master_lookup (bgp_clist
, COMMUNITY_LIST_MASTER
);
11979 for (list
= cm
->num
.head
; list
; list
= list
->next
)
11980 for (entry
= list
->head
; entry
; entry
= entry
->next
)
11982 vty_out (vty
, "ip community-list %s %s %s%s",
11983 list
->name
, community_direct_str (entry
->direct
),
11984 community_list_config_str (entry
),
11988 for (list
= cm
->str
.head
; list
; list
= list
->next
)
11989 for (entry
= list
->head
; entry
; entry
= entry
->next
)
11991 vty_out (vty
, "ip community-list %s %s %s %s%s",
11992 entry
->style
== COMMUNITY_LIST_STANDARD
11993 ? "standard" : "expanded",
11994 list
->name
, community_direct_str (entry
->direct
),
11995 community_list_config_str (entry
),
12000 /* Extcommunity-list. */
12001 cm
= community_list_master_lookup (bgp_clist
, EXTCOMMUNITY_LIST_MASTER
);
12003 for (list
= cm
->num
.head
; list
; list
= list
->next
)
12004 for (entry
= list
->head
; entry
; entry
= entry
->next
)
12006 vty_out (vty
, "ip extcommunity-list %s %s %s%s",
12007 list
->name
, community_direct_str (entry
->direct
),
12008 community_list_config_str (entry
), VTY_NEWLINE
);
12011 for (list
= cm
->str
.head
; list
; list
= list
->next
)
12012 for (entry
= list
->head
; entry
; entry
= entry
->next
)
12014 vty_out (vty
, "ip extcommunity-list %s %s %s %s%s",
12015 entry
->style
== EXTCOMMUNITY_LIST_STANDARD
12016 ? "standard" : "expanded",
12017 list
->name
, community_direct_str (entry
->direct
),
12018 community_list_config_str (entry
), VTY_NEWLINE
);
12023 /* lcommunity-list. */
12024 cm
= community_list_master_lookup (bgp_clist
, LARGE_COMMUNITY_LIST_MASTER
);
12026 for (list
= cm
->num
.head
; list
; list
= list
->next
)
12027 for (entry
= list
->head
; entry
; entry
= entry
->next
)
12029 vty_out (vty
, "ip large-community-list %s %s %s%s",
12030 list
->name
, community_direct_str (entry
->direct
),
12031 community_list_config_str (entry
), VTY_NEWLINE
);
12034 for (list
= cm
->str
.head
; list
; list
= list
->next
)
12035 for (entry
= list
->head
; entry
; entry
= entry
->next
)
12037 vty_out (vty
, "ip large-community-list %s %s %s %s%s",
12038 entry
->style
== LARGE_COMMUNITY_LIST_STANDARD
12039 ? "standard" : "expanded",
12040 list
->name
, community_direct_str (entry
->direct
),
12041 community_list_config_str (entry
), VTY_NEWLINE
);
12048 static struct cmd_node community_list_node
=
12050 COMMUNITY_LIST_NODE
,
12052 1 /* Export to vtysh. */
12056 community_list_vty (void)
12058 install_node (&community_list_node
, community_list_config_write
);
12060 /* Community-list. */
12061 install_element (CONFIG_NODE
, &ip_community_list_standard_cmd
);
12062 install_element (CONFIG_NODE
, &ip_community_list_expanded_all_cmd
);
12063 install_element (CONFIG_NODE
, &no_ip_community_list_standard_all_cmd
);
12064 install_element (CONFIG_NODE
, &no_ip_community_list_expanded_all_cmd
);
12065 install_element (VIEW_NODE
, &show_ip_community_list_cmd
);
12066 install_element (VIEW_NODE
, &show_ip_community_list_arg_cmd
);
12068 /* Extcommunity-list. */
12069 install_element (CONFIG_NODE
, &ip_extcommunity_list_standard_cmd
);
12070 install_element (CONFIG_NODE
, &ip_extcommunity_list_name_expanded_cmd
);
12071 install_element (CONFIG_NODE
, &no_ip_extcommunity_list_standard_all_cmd
);
12072 install_element (CONFIG_NODE
, &no_ip_extcommunity_list_expanded_all_cmd
);
12073 install_element (VIEW_NODE
, &show_ip_extcommunity_list_cmd
);
12074 install_element (VIEW_NODE
, &show_ip_extcommunity_list_arg_cmd
);
12076 /* Large Community List */
12077 install_element (CONFIG_NODE
, &ip_lcommunity_list_standard_cmd
);
12078 install_element (CONFIG_NODE
, &ip_lcommunity_list_standard1_cmd
);
12079 install_element (CONFIG_NODE
, &ip_lcommunity_list_expanded_cmd
);
12080 install_element (CONFIG_NODE
, &ip_lcommunity_list_name_standard_cmd
);
12081 install_element (CONFIG_NODE
, &ip_lcommunity_list_name_standard1_cmd
);
12082 install_element (CONFIG_NODE
, &ip_lcommunity_list_name_expanded_cmd
);
12083 install_element (CONFIG_NODE
, &no_ip_lcommunity_list_standard_all_cmd
);
12084 install_element (CONFIG_NODE
, &no_ip_lcommunity_list_name_expanded_all_cmd
);
12085 install_element (CONFIG_NODE
, &no_ip_lcommunity_list_standard_cmd
);
12086 install_element (CONFIG_NODE
, &no_ip_lcommunity_list_expanded_cmd
);
12087 install_element (CONFIG_NODE
, &no_ip_lcommunity_list_name_standard_cmd
);
12088 install_element (CONFIG_NODE
, &no_ip_lcommunity_list_name_expanded_cmd
);
12089 install_element (VIEW_NODE
, &show_ip_lcommunity_list_cmd
);
12090 install_element (VIEW_NODE
, &show_ip_lcommunity_list_arg_cmd
);