]> git.proxmox.com Git - mirror_frr.git/blob - bgpd/bgp_vty.c
Merge pull request #4586 from donaldsharp/default_originate
[mirror_frr.git] / bgpd / bgp_vty.c
1 /* BGP VTY interface.
2 * Copyright (C) 1996, 97, 98, 99, 2000 Kunihiro Ishiguro
3 *
4 * This file is part of GNU Zebra.
5 *
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
9 * later version.
10 *
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.
15 *
16 * You should have received a copy of the GNU General Public License along
17 * with this program; see the file COPYING; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21 #include <zebra.h>
22
23 #include "command.h"
24 #include "lib/json.h"
25 #include "lib/zclient.h"
26 #include "prefix.h"
27 #include "plist.h"
28 #include "buffer.h"
29 #include "linklist.h"
30 #include "stream.h"
31 #include "thread.h"
32 #include "log.h"
33 #include "memory.h"
34 #include "memory_vty.h"
35 #include "hash.h"
36 #include "queue.h"
37 #include "filter.h"
38 #include "frrstr.h"
39
40 #include "bgpd/bgpd.h"
41 #include "bgpd/bgp_attr_evpn.h"
42 #include "bgpd/bgp_advertise.h"
43 #include "bgpd/bgp_attr.h"
44 #include "bgpd/bgp_aspath.h"
45 #include "bgpd/bgp_community.h"
46 #include "bgpd/bgp_ecommunity.h"
47 #include "bgpd/bgp_lcommunity.h"
48 #include "bgpd/bgp_damp.h"
49 #include "bgpd/bgp_debug.h"
50 #include "bgpd/bgp_errors.h"
51 #include "bgpd/bgp_fsm.h"
52 #include "bgpd/bgp_nexthop.h"
53 #include "bgpd/bgp_open.h"
54 #include "bgpd/bgp_regex.h"
55 #include "bgpd/bgp_route.h"
56 #include "bgpd/bgp_mplsvpn.h"
57 #include "bgpd/bgp_zebra.h"
58 #include "bgpd/bgp_table.h"
59 #include "bgpd/bgp_vty.h"
60 #include "bgpd/bgp_mpath.h"
61 #include "bgpd/bgp_packet.h"
62 #include "bgpd/bgp_updgrp.h"
63 #include "bgpd/bgp_bfd.h"
64 #include "bgpd/bgp_io.h"
65 #include "bgpd/bgp_evpn.h"
66 #include "bgpd/bgp_addpath.h"
67 #include "bgpd/bgp_mac.h"
68
69 static struct peer_group *listen_range_exists(struct bgp *bgp,
70 struct prefix *range, int exact);
71
72 static enum node_type bgp_node_type(afi_t afi, safi_t safi)
73 {
74 switch (afi) {
75 case AFI_IP:
76 switch (safi) {
77 case SAFI_UNICAST:
78 return BGP_IPV4_NODE;
79 break;
80 case SAFI_MULTICAST:
81 return BGP_IPV4M_NODE;
82 break;
83 case SAFI_LABELED_UNICAST:
84 return BGP_IPV4L_NODE;
85 break;
86 case SAFI_MPLS_VPN:
87 return BGP_VPNV4_NODE;
88 break;
89 case SAFI_FLOWSPEC:
90 return BGP_FLOWSPECV4_NODE;
91 default:
92 /* not expected */
93 return BGP_IPV4_NODE;
94 break;
95 }
96 break;
97 case AFI_IP6:
98 switch (safi) {
99 case SAFI_UNICAST:
100 return BGP_IPV6_NODE;
101 break;
102 case SAFI_MULTICAST:
103 return BGP_IPV6M_NODE;
104 break;
105 case SAFI_LABELED_UNICAST:
106 return BGP_IPV6L_NODE;
107 break;
108 case SAFI_MPLS_VPN:
109 return BGP_VPNV6_NODE;
110 break;
111 case SAFI_FLOWSPEC:
112 return BGP_FLOWSPECV6_NODE;
113 default:
114 /* not expected */
115 return BGP_IPV4_NODE;
116 break;
117 }
118 break;
119 case AFI_L2VPN:
120 return BGP_EVPN_NODE;
121 break;
122 case AFI_UNSPEC:
123 case AFI_MAX:
124 // We should never be here but to clarify the switch statement..
125 return BGP_IPV4_NODE;
126 break;
127 }
128
129 // Impossible to happen
130 return BGP_IPV4_NODE;
131 }
132
133 /* Utility function to get address family from current node. */
134 afi_t bgp_node_afi(struct vty *vty)
135 {
136 afi_t afi;
137 switch (vty->node) {
138 case BGP_IPV6_NODE:
139 case BGP_IPV6M_NODE:
140 case BGP_IPV6L_NODE:
141 case BGP_VPNV6_NODE:
142 case BGP_FLOWSPECV6_NODE:
143 afi = AFI_IP6;
144 break;
145 case BGP_EVPN_NODE:
146 afi = AFI_L2VPN;
147 break;
148 default:
149 afi = AFI_IP;
150 break;
151 }
152 return afi;
153 }
154
155 /* Utility function to get subsequent address family from current
156 node. */
157 safi_t bgp_node_safi(struct vty *vty)
158 {
159 safi_t safi;
160 switch (vty->node) {
161 case BGP_VPNV4_NODE:
162 case BGP_VPNV6_NODE:
163 safi = SAFI_MPLS_VPN;
164 break;
165 case BGP_IPV4M_NODE:
166 case BGP_IPV6M_NODE:
167 safi = SAFI_MULTICAST;
168 break;
169 case BGP_EVPN_NODE:
170 safi = SAFI_EVPN;
171 break;
172 case BGP_IPV4L_NODE:
173 case BGP_IPV6L_NODE:
174 safi = SAFI_LABELED_UNICAST;
175 break;
176 case BGP_FLOWSPECV4_NODE:
177 case BGP_FLOWSPECV6_NODE:
178 safi = SAFI_FLOWSPEC;
179 break;
180 default:
181 safi = SAFI_UNICAST;
182 break;
183 }
184 return safi;
185 }
186
187 /**
188 * Converts an AFI in string form to afi_t
189 *
190 * @param afi string, one of
191 * - "ipv4"
192 * - "ipv6"
193 * - "l2vpn"
194 * @return the corresponding afi_t
195 */
196 afi_t bgp_vty_afi_from_str(const char *afi_str)
197 {
198 afi_t afi = AFI_MAX; /* unknown */
199 if (strmatch(afi_str, "ipv4"))
200 afi = AFI_IP;
201 else if (strmatch(afi_str, "ipv6"))
202 afi = AFI_IP6;
203 else if (strmatch(afi_str, "l2vpn"))
204 afi = AFI_L2VPN;
205 return afi;
206 }
207
208 int argv_find_and_parse_afi(struct cmd_token **argv, int argc, int *index,
209 afi_t *afi)
210 {
211 int ret = 0;
212 if (argv_find(argv, argc, "ipv4", index)) {
213 ret = 1;
214 if (afi)
215 *afi = AFI_IP;
216 } else if (argv_find(argv, argc, "ipv6", index)) {
217 ret = 1;
218 if (afi)
219 *afi = AFI_IP6;
220 } else if (argv_find(argv, argc, "l2vpn", index)) {
221 ret = 1;
222 if (afi)
223 *afi = AFI_L2VPN;
224 }
225 return ret;
226 }
227
228 /* supports <unicast|multicast|vpn|labeled-unicast> */
229 safi_t bgp_vty_safi_from_str(const char *safi_str)
230 {
231 safi_t safi = SAFI_MAX; /* unknown */
232 if (strmatch(safi_str, "multicast"))
233 safi = SAFI_MULTICAST;
234 else if (strmatch(safi_str, "unicast"))
235 safi = SAFI_UNICAST;
236 else if (strmatch(safi_str, "vpn"))
237 safi = SAFI_MPLS_VPN;
238 else if (strmatch(safi_str, "evpn"))
239 safi = SAFI_EVPN;
240 else if (strmatch(safi_str, "labeled-unicast"))
241 safi = SAFI_LABELED_UNICAST;
242 else if (strmatch(safi_str, "flowspec"))
243 safi = SAFI_FLOWSPEC;
244 return safi;
245 }
246
247 int argv_find_and_parse_safi(struct cmd_token **argv, int argc, int *index,
248 safi_t *safi)
249 {
250 int ret = 0;
251 if (argv_find(argv, argc, "unicast", index)) {
252 ret = 1;
253 if (safi)
254 *safi = SAFI_UNICAST;
255 } else if (argv_find(argv, argc, "multicast", index)) {
256 ret = 1;
257 if (safi)
258 *safi = SAFI_MULTICAST;
259 } else if (argv_find(argv, argc, "labeled-unicast", index)) {
260 ret = 1;
261 if (safi)
262 *safi = SAFI_LABELED_UNICAST;
263 } else if (argv_find(argv, argc, "vpn", index)) {
264 ret = 1;
265 if (safi)
266 *safi = SAFI_MPLS_VPN;
267 } else if (argv_find(argv, argc, "evpn", index)) {
268 ret = 1;
269 if (safi)
270 *safi = SAFI_EVPN;
271 } else if (argv_find(argv, argc, "flowspec", index)) {
272 ret = 1;
273 if (safi)
274 *safi = SAFI_FLOWSPEC;
275 }
276 return ret;
277 }
278
279 /*
280 * bgp_vty_find_and_parse_afi_safi_bgp
281 *
282 * For a given 'show ...' command, correctly parse the afi/safi/bgp out from it
283 * This function *assumes* that the calling function pre-sets the afi/safi/bgp
284 * to appropriate values for the calling function. This is to allow the
285 * calling function to make decisions appropriate for the show command
286 * that is being parsed.
287 *
288 * The show commands are generally of the form:
289 * "show [ip] bgp [<view|vrf> VIEWVRFNAME] [<ipv4|ipv6>
290 * [<unicast|multicast|vpn|labeled-unicast>]] ..."
291 *
292 * Since we use argv_find if the show command in particular doesn't have:
293 * [ip]
294 * [<view|vrf> VIEWVRFNAME]
295 * [<ipv4|ipv6> [<unicast|multicast|vpn|labeled-unicast>]]
296 * The command parsing should still be ok.
297 *
298 * vty -> The vty for the command so we can output some useful data in
299 * the event of a parse error in the vrf.
300 * argv -> The command tokens
301 * argc -> How many command tokens we have
302 * idx -> The current place in the command, generally should be 0 for this
303 * function
304 * afi -> The parsed afi if it was included in the show command, returned here
305 * safi -> The parsed safi if it was included in the show command, returned here
306 * bgp -> Pointer to the bgp data structure we need to fill in.
307 * use_json -> json is configured or not
308 *
309 * The function returns the correct location in the parse tree for the
310 * last token found.
311 *
312 * Returns 0 for failure to parse correctly, else the idx position of where
313 * it found the last token.
314 */
315 int bgp_vty_find_and_parse_afi_safi_bgp(struct vty *vty,
316 struct cmd_token **argv, int argc,
317 int *idx, afi_t *afi, safi_t *safi,
318 struct bgp **bgp, bool use_json)
319 {
320 char *vrf_name = NULL;
321
322 assert(afi);
323 assert(safi);
324 assert(bgp);
325
326 if (argv_find(argv, argc, "ip", idx))
327 *afi = AFI_IP;
328
329 if (argv_find(argv, argc, "view", idx))
330 vrf_name = argv[*idx + 1]->arg;
331 else if (argv_find(argv, argc, "vrf", idx)) {
332 vrf_name = argv[*idx + 1]->arg;
333 if (strmatch(vrf_name, VRF_DEFAULT_NAME))
334 vrf_name = NULL;
335 }
336 if (vrf_name) {
337 if (strmatch(vrf_name, "all"))
338 *bgp = NULL;
339 else {
340 *bgp = bgp_lookup_by_name(vrf_name);
341 if (!*bgp) {
342 if (use_json) {
343 json_object *json = NULL;
344 json = json_object_new_object();
345 json_object_string_add(
346 json, "warning",
347 "View/Vrf is unknown");
348 vty_out(vty, "%s\n",
349 json_object_to_json_string_ext(json,
350 JSON_C_TO_STRING_PRETTY));
351 json_object_free(json);
352 }
353 else
354 vty_out(vty, "View/Vrf %s is unknown\n",
355 vrf_name);
356 *idx = 0;
357 return 0;
358 }
359 }
360 } else {
361 *bgp = bgp_get_default();
362 if (!*bgp) {
363 if (use_json) {
364 json_object *json = NULL;
365 json = json_object_new_object();
366 json_object_string_add(
367 json, "warning",
368 "Default BGP instance not found");
369 vty_out(vty, "%s\n",
370 json_object_to_json_string_ext(json,
371 JSON_C_TO_STRING_PRETTY));
372 json_object_free(json);
373 }
374 else
375 vty_out(vty,
376 "Default BGP instance not found\n");
377 *idx = 0;
378 return 0;
379 }
380 }
381
382 if (argv_find_and_parse_afi(argv, argc, idx, afi))
383 argv_find_and_parse_safi(argv, argc, idx, safi);
384
385 *idx += 1;
386 return *idx;
387 }
388
389 static int peer_address_self_check(struct bgp *bgp, union sockunion *su)
390 {
391 struct interface *ifp = NULL;
392
393 if (su->sa.sa_family == AF_INET)
394 ifp = if_lookup_by_ipv4_exact(&su->sin.sin_addr, bgp->vrf_id);
395 else if (su->sa.sa_family == AF_INET6)
396 ifp = if_lookup_by_ipv6_exact(&su->sin6.sin6_addr,
397 su->sin6.sin6_scope_id,
398 bgp->vrf_id);
399
400 if (ifp)
401 return 1;
402
403 return 0;
404 }
405
406 /* Utility function for looking up peer from VTY. */
407 /* This is used only for configuration, so disallow if attempted on
408 * a dynamic neighbor.
409 */
410 static struct peer *peer_lookup_vty(struct vty *vty, const char *ip_str)
411 {
412 struct bgp *bgp = VTY_GET_CONTEXT(bgp);
413 int ret;
414 union sockunion su;
415 struct peer *peer;
416
417 if (!bgp) {
418 return NULL;
419 }
420
421 ret = str2sockunion(ip_str, &su);
422 if (ret < 0) {
423 peer = peer_lookup_by_conf_if(bgp, ip_str);
424 if (!peer) {
425 if ((peer = peer_lookup_by_hostname(bgp, ip_str))
426 == NULL) {
427 vty_out(vty,
428 "%% Malformed address or name: %s\n",
429 ip_str);
430 return NULL;
431 }
432 }
433 } else {
434 peer = peer_lookup(bgp, &su);
435 if (!peer) {
436 vty_out(vty,
437 "%% Specify remote-as or peer-group commands first\n");
438 return NULL;
439 }
440 if (peer_dynamic_neighbor(peer)) {
441 vty_out(vty,
442 "%% Operation not allowed on a dynamic neighbor\n");
443 return NULL;
444 }
445 }
446 return peer;
447 }
448
449 /* Utility function for looking up peer or peer group. */
450 /* This is used only for configuration, so disallow if attempted on
451 * a dynamic neighbor.
452 */
453 struct peer *peer_and_group_lookup_vty(struct vty *vty, const char *peer_str)
454 {
455 struct bgp *bgp = VTY_GET_CONTEXT(bgp);
456 int ret;
457 union sockunion su;
458 struct peer *peer = NULL;
459 struct peer_group *group = NULL;
460
461 if (!bgp) {
462 return NULL;
463 }
464
465 ret = str2sockunion(peer_str, &su);
466 if (ret == 0) {
467 /* IP address, locate peer. */
468 peer = peer_lookup(bgp, &su);
469 } else {
470 /* Not IP, could match either peer configured on interface or a
471 * group. */
472 peer = peer_lookup_by_conf_if(bgp, peer_str);
473 if (!peer)
474 group = peer_group_lookup(bgp, peer_str);
475 }
476
477 if (peer) {
478 if (peer_dynamic_neighbor(peer)) {
479 vty_out(vty,
480 "%% Operation not allowed on a dynamic neighbor\n");
481 return NULL;
482 }
483
484 return peer;
485 }
486
487 if (group)
488 return group->conf;
489
490 vty_out(vty, "%% Specify remote-as or peer-group commands first\n");
491
492 return NULL;
493 }
494
495 int bgp_vty_return(struct vty *vty, int ret)
496 {
497 const char *str = NULL;
498
499 switch (ret) {
500 case BGP_ERR_INVALID_VALUE:
501 str = "Invalid value";
502 break;
503 case BGP_ERR_INVALID_FLAG:
504 str = "Invalid flag";
505 break;
506 case BGP_ERR_PEER_GROUP_SHUTDOWN:
507 str = "Peer-group has been shutdown. Activate the peer-group first";
508 break;
509 case BGP_ERR_PEER_FLAG_CONFLICT:
510 str = "Can't set override-capability and strict-capability-match at the same time";
511 break;
512 case BGP_ERR_PEER_GROUP_NO_REMOTE_AS:
513 str = "Specify remote-as or peer-group remote AS first";
514 break;
515 case BGP_ERR_PEER_GROUP_CANT_CHANGE:
516 str = "Cannot change the peer-group. Deconfigure first";
517 break;
518 case BGP_ERR_PEER_GROUP_MISMATCH:
519 str = "Peer is not a member of this peer-group";
520 break;
521 case BGP_ERR_PEER_FILTER_CONFLICT:
522 str = "Prefix/distribute list can not co-exist";
523 break;
524 case BGP_ERR_NOT_INTERNAL_PEER:
525 str = "Invalid command. Not an internal neighbor";
526 break;
527 case BGP_ERR_REMOVE_PRIVATE_AS:
528 str = "remove-private-AS cannot be configured for IBGP peers";
529 break;
530 case BGP_ERR_LOCAL_AS_ALLOWED_ONLY_FOR_EBGP:
531 str = "Local-AS allowed only for EBGP peers";
532 break;
533 case BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS:
534 str = "Cannot have local-as same as BGP AS number";
535 break;
536 case BGP_ERR_TCPSIG_FAILED:
537 str = "Error while applying TCP-Sig to session(s)";
538 break;
539 case BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK:
540 str = "ebgp-multihop and ttl-security cannot be configured together";
541 break;
542 case BGP_ERR_NO_IBGP_WITH_TTLHACK:
543 str = "ttl-security only allowed for EBGP peers";
544 break;
545 case BGP_ERR_AS_OVERRIDE:
546 str = "as-override cannot be configured for IBGP peers";
547 break;
548 case BGP_ERR_INVALID_DYNAMIC_NEIGHBORS_LIMIT:
549 str = "Invalid limit for number of dynamic neighbors";
550 break;
551 case BGP_ERR_DYNAMIC_NEIGHBORS_RANGE_EXISTS:
552 str = "Dynamic neighbor listen range already exists";
553 break;
554 case BGP_ERR_INVALID_FOR_DYNAMIC_PEER:
555 str = "Operation not allowed on a dynamic neighbor";
556 break;
557 case BGP_ERR_INVALID_FOR_DIRECT_PEER:
558 str = "Operation not allowed on a directly connected neighbor";
559 break;
560 case BGP_ERR_PEER_SAFI_CONFLICT:
561 str = "Cannot activate peer for both 'ipv4 unicast' and 'ipv4 labeled-unicast'";
562 break;
563 }
564 if (str) {
565 vty_out(vty, "%% %s\n", str);
566 return CMD_WARNING_CONFIG_FAILED;
567 }
568 return CMD_SUCCESS;
569 }
570
571 /* BGP clear sort. */
572 enum clear_sort {
573 clear_all,
574 clear_peer,
575 clear_group,
576 clear_external,
577 clear_as
578 };
579
580 static void bgp_clear_vty_error(struct vty *vty, struct peer *peer, afi_t afi,
581 safi_t safi, int error)
582 {
583 switch (error) {
584 case BGP_ERR_AF_UNCONFIGURED:
585 vty_out(vty,
586 "%%BGP: Enable %s address family for the neighbor %s\n",
587 afi_safi_print(afi, safi), peer->host);
588 break;
589 case BGP_ERR_SOFT_RECONFIG_UNCONFIGURED:
590 vty_out(vty,
591 "%%BGP: Inbound soft reconfig for %s not possible as it\n has neither refresh capability, nor inbound soft reconfig\n",
592 peer->host);
593 break;
594 default:
595 break;
596 }
597 }
598
599 /* `clear ip bgp' functions. */
600 static int bgp_clear(struct vty *vty, struct bgp *bgp, afi_t afi, safi_t safi,
601 enum clear_sort sort, enum bgp_clear_type stype,
602 const char *arg)
603 {
604 int ret;
605 bool found = false;
606 struct peer *peer;
607 struct listnode *node, *nnode;
608
609 /* Clear all neighbors. */
610 /*
611 * Pass along pointer to next node to peer_clear() when walking all
612 * nodes on the BGP instance as that may get freed if it is a
613 * doppelganger
614 */
615 if (sort == clear_all) {
616 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
617 if (!peer->afc[afi][safi])
618 continue;
619
620 if (stype == BGP_CLEAR_SOFT_NONE)
621 ret = peer_clear(peer, &nnode);
622 else
623 ret = peer_clear_soft(peer, afi, safi, stype);
624
625 if (ret < 0)
626 bgp_clear_vty_error(vty, peer, afi, safi, ret);
627 else
628 found = true;
629 }
630
631 /* This is to apply read-only mode on this clear. */
632 if (stype == BGP_CLEAR_SOFT_NONE)
633 bgp->update_delay_over = 0;
634
635 if (!found)
636 vty_out(vty, "%%BGP: No %s peer configured\n",
637 afi_safi_print(afi, safi));
638
639 return CMD_SUCCESS;
640 }
641
642 /* Clear specified neighbor. */
643 if (sort == clear_peer) {
644 union sockunion su;
645
646 /* Make sockunion for lookup. */
647 ret = str2sockunion(arg, &su);
648 if (ret < 0) {
649 peer = peer_lookup_by_conf_if(bgp, arg);
650 if (!peer) {
651 peer = peer_lookup_by_hostname(bgp, arg);
652 if (!peer) {
653 vty_out(vty,
654 "Malformed address or name: %s\n",
655 arg);
656 return CMD_WARNING;
657 }
658 }
659 } else {
660 peer = peer_lookup(bgp, &su);
661 if (!peer) {
662 vty_out(vty,
663 "%%BGP: Unknown neighbor - \"%s\"\n",
664 arg);
665 return CMD_WARNING;
666 }
667 }
668
669 if (!peer->afc[afi][safi])
670 ret = BGP_ERR_AF_UNCONFIGURED;
671 else if (stype == BGP_CLEAR_SOFT_NONE)
672 ret = peer_clear(peer, NULL);
673 else
674 ret = peer_clear_soft(peer, afi, safi, stype);
675
676 if (ret < 0)
677 bgp_clear_vty_error(vty, peer, afi, safi, ret);
678
679 return CMD_SUCCESS;
680 }
681
682 /* Clear all neighbors belonging to a specific peer-group. */
683 if (sort == clear_group) {
684 struct peer_group *group;
685
686 group = peer_group_lookup(bgp, arg);
687 if (!group) {
688 vty_out(vty, "%%BGP: No such peer-group %s\n", arg);
689 return CMD_WARNING;
690 }
691
692 for (ALL_LIST_ELEMENTS(group->peer, node, nnode, peer)) {
693 if (!peer->afc[afi][safi])
694 continue;
695
696 if (stype == BGP_CLEAR_SOFT_NONE)
697 ret = peer_clear(peer, NULL);
698 else
699 ret = peer_clear_soft(peer, afi, safi, stype);
700
701 if (ret < 0)
702 bgp_clear_vty_error(vty, peer, afi, safi, ret);
703 else
704 found = true;
705 }
706
707 if (!found)
708 vty_out(vty,
709 "%%BGP: No %s peer belonging to peer-group %s is configured\n",
710 afi_safi_print(afi, safi), arg);
711
712 return CMD_SUCCESS;
713 }
714
715 /* Clear all external (eBGP) neighbors. */
716 if (sort == clear_external) {
717 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
718 if (peer->sort == BGP_PEER_IBGP)
719 continue;
720
721 if (!peer->afc[afi][safi])
722 continue;
723
724 if (stype == BGP_CLEAR_SOFT_NONE)
725 ret = peer_clear(peer, &nnode);
726 else
727 ret = peer_clear_soft(peer, afi, safi, stype);
728
729 if (ret < 0)
730 bgp_clear_vty_error(vty, peer, afi, safi, ret);
731 else
732 found = true;
733 }
734
735 if (!found)
736 vty_out(vty,
737 "%%BGP: No external %s peer is configured\n",
738 afi_safi_print(afi, safi));
739
740 return CMD_SUCCESS;
741 }
742
743 /* Clear all neighbors belonging to a specific AS. */
744 if (sort == clear_as) {
745 as_t as = strtoul(arg, NULL, 10);
746
747 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
748 if (peer->as != as)
749 continue;
750
751 if (!peer->afc[afi][safi])
752 ret = BGP_ERR_AF_UNCONFIGURED;
753 else if (stype == BGP_CLEAR_SOFT_NONE)
754 ret = peer_clear(peer, &nnode);
755 else
756 ret = peer_clear_soft(peer, afi, safi, stype);
757
758 if (ret < 0)
759 bgp_clear_vty_error(vty, peer, afi, safi, ret);
760 else
761 found = true;
762 }
763
764 if (!found)
765 vty_out(vty,
766 "%%BGP: No %s peer is configured with AS %s\n",
767 afi_safi_print(afi, safi), arg);
768
769 return CMD_SUCCESS;
770 }
771
772 return CMD_SUCCESS;
773 }
774
775 static int bgp_clear_vty(struct vty *vty, const char *name, afi_t afi,
776 safi_t safi, enum clear_sort sort,
777 enum bgp_clear_type stype, const char *arg)
778 {
779 struct bgp *bgp;
780
781 /* BGP structure lookup. */
782 if (name) {
783 bgp = bgp_lookup_by_name(name);
784 if (bgp == NULL) {
785 vty_out(vty, "Can't find BGP instance %s\n", name);
786 return CMD_WARNING;
787 }
788 } else {
789 bgp = bgp_get_default();
790 if (bgp == NULL) {
791 vty_out(vty, "No BGP process is configured\n");
792 return CMD_WARNING;
793 }
794 }
795
796 return bgp_clear(vty, bgp, afi, safi, sort, stype, arg);
797 }
798
799 /* clear soft inbound */
800 static void bgp_clear_star_soft_in(struct vty *vty, const char *name)
801 {
802 afi_t afi;
803 safi_t safi;
804
805 FOREACH_AFI_SAFI (afi, safi)
806 bgp_clear_vty(vty, name, afi, safi, clear_all,
807 BGP_CLEAR_SOFT_IN, NULL);
808 }
809
810 /* clear soft outbound */
811 static void bgp_clear_star_soft_out(struct vty *vty, const char *name)
812 {
813 afi_t afi;
814 safi_t safi;
815
816 FOREACH_AFI_SAFI (afi, safi)
817 bgp_clear_vty(vty, name, afi, safi, clear_all,
818 BGP_CLEAR_SOFT_OUT, NULL);
819 }
820
821
822 #ifndef VTYSH_EXTRACT_PL
823 #include "bgpd/bgp_vty_clippy.c"
824 #endif
825
826 DEFUN_HIDDEN (bgp_local_mac,
827 bgp_local_mac_cmd,
828 "bgp local-mac vni " CMD_VNI_RANGE " mac WORD seq (0-4294967295)",
829 BGP_STR
830 "Local MAC config\n"
831 "VxLAN Network Identifier\n"
832 "VNI number\n"
833 "local mac\n"
834 "mac address\n"
835 "mac-mobility sequence\n"
836 "seq number\n")
837 {
838 int rv;
839 vni_t vni;
840 struct ethaddr mac;
841 struct ipaddr ip;
842 uint32_t seq;
843 struct bgp *bgp;
844
845 vni = strtoul(argv[3]->arg, NULL, 10);
846 if (!prefix_str2mac(argv[5]->arg, &mac)) {
847 vty_out(vty, "%% Malformed MAC address\n");
848 return CMD_WARNING;
849 }
850 memset(&ip, 0, sizeof(ip));
851 seq = strtoul(argv[7]->arg, NULL, 10);
852
853 bgp = bgp_get_default();
854 if (!bgp) {
855 vty_out(vty, "Default BGP instance is not there\n");
856 return CMD_WARNING;
857 }
858
859 rv = bgp_evpn_local_macip_add(bgp, vni, &mac, &ip, 0 /* flags */, seq);
860 if (rv < 0) {
861 vty_out(vty, "Internal error\n");
862 return CMD_WARNING;
863 }
864
865 return CMD_SUCCESS;
866 }
867
868 DEFUN_HIDDEN (no_bgp_local_mac,
869 no_bgp_local_mac_cmd,
870 "no bgp local-mac vni " CMD_VNI_RANGE " mac WORD",
871 NO_STR
872 BGP_STR
873 "Local MAC config\n"
874 "VxLAN Network Identifier\n"
875 "VNI number\n"
876 "local mac\n"
877 "mac address\n")
878 {
879 int rv;
880 vni_t vni;
881 struct ethaddr mac;
882 struct ipaddr ip;
883 struct bgp *bgp;
884
885 vni = strtoul(argv[4]->arg, NULL, 10);
886 if (!prefix_str2mac(argv[6]->arg, &mac)) {
887 vty_out(vty, "%% Malformed MAC address\n");
888 return CMD_WARNING;
889 }
890 memset(&ip, 0, sizeof(ip));
891
892 bgp = bgp_get_default();
893 if (!bgp) {
894 vty_out(vty, "Default BGP instance is not there\n");
895 return CMD_WARNING;
896 }
897
898 rv = bgp_evpn_local_macip_del(bgp, vni, &mac, &ip, ZEBRA_NEIGH_ACTIVE);
899 if (rv < 0) {
900 vty_out(vty, "Internal error\n");
901 return CMD_WARNING;
902 }
903
904 return CMD_SUCCESS;
905 }
906
907 DEFUN (no_synchronization,
908 no_synchronization_cmd,
909 "no synchronization",
910 NO_STR
911 "Perform IGP synchronization\n")
912 {
913 return CMD_SUCCESS;
914 }
915
916 DEFUN (no_auto_summary,
917 no_auto_summary_cmd,
918 "no auto-summary",
919 NO_STR
920 "Enable automatic network number summarization\n")
921 {
922 return CMD_SUCCESS;
923 }
924
925 /* "router bgp" commands. */
926 DEFUN_NOSH (router_bgp,
927 router_bgp_cmd,
928 "router bgp [(1-4294967295) [<view|vrf> VIEWVRFNAME]]",
929 ROUTER_STR
930 BGP_STR
931 AS_STR
932 BGP_INSTANCE_HELP_STR)
933 {
934 int idx_asn = 2;
935 int idx_view_vrf = 3;
936 int idx_vrf = 4;
937 int is_new_bgp = 0;
938 int ret;
939 as_t as;
940 struct bgp *bgp;
941 const char *name = NULL;
942 enum bgp_instance_type inst_type;
943
944 // "router bgp" without an ASN
945 if (argc == 2) {
946 // Pending: Make VRF option available for ASN less config
947 bgp = bgp_get_default();
948
949 if (bgp == NULL) {
950 vty_out(vty, "%% No BGP process is configured\n");
951 return CMD_WARNING_CONFIG_FAILED;
952 }
953
954 if (listcount(bm->bgp) > 1) {
955 vty_out(vty, "%% Please specify ASN and VRF\n");
956 return CMD_WARNING_CONFIG_FAILED;
957 }
958 }
959
960 // "router bgp X"
961 else {
962 as = strtoul(argv[idx_asn]->arg, NULL, 10);
963
964 inst_type = BGP_INSTANCE_TYPE_DEFAULT;
965 if (argc > 3) {
966 name = argv[idx_vrf]->arg;
967
968 if (!strcmp(argv[idx_view_vrf]->text, "vrf")) {
969 if (strmatch(name, VRF_DEFAULT_NAME))
970 name = NULL;
971 else
972 inst_type = BGP_INSTANCE_TYPE_VRF;
973 } else if (!strcmp(argv[idx_view_vrf]->text, "view"))
974 inst_type = BGP_INSTANCE_TYPE_VIEW;
975 }
976
977 if (inst_type == BGP_INSTANCE_TYPE_DEFAULT)
978 is_new_bgp = (bgp_lookup(as, name) == NULL);
979
980 ret = bgp_get(&bgp, &as, name, inst_type);
981 switch (ret) {
982 case BGP_ERR_AS_MISMATCH:
983 vty_out(vty, "BGP is already running; AS is %u\n", as);
984 return CMD_WARNING_CONFIG_FAILED;
985 case BGP_ERR_INSTANCE_MISMATCH:
986 vty_out(vty,
987 "BGP instance name and AS number mismatch\n");
988 vty_out(vty,
989 "BGP instance is already running; AS is %u\n",
990 as);
991 return CMD_WARNING_CONFIG_FAILED;
992 }
993
994 /*
995 * If we just instantiated the default instance, complete
996 * any pending VRF-VPN leaking that was configured via
997 * earlier "router bgp X vrf FOO" blocks.
998 */
999 if (is_new_bgp && inst_type == BGP_INSTANCE_TYPE_DEFAULT)
1000 vpn_leak_postchange_all();
1001
1002 /* Pending: handle when user tries to change a view to vrf n vv.
1003 */
1004 }
1005
1006 /* unset the auto created flag as the user config is now present */
1007 UNSET_FLAG(bgp->vrf_flags, BGP_VRF_AUTO);
1008 VTY_PUSH_CONTEXT(BGP_NODE, bgp);
1009
1010 return CMD_SUCCESS;
1011 }
1012
1013 /* "no router bgp" commands. */
1014 DEFUN (no_router_bgp,
1015 no_router_bgp_cmd,
1016 "no router bgp [(1-4294967295) [<view|vrf> VIEWVRFNAME]]",
1017 NO_STR
1018 ROUTER_STR
1019 BGP_STR
1020 AS_STR
1021 BGP_INSTANCE_HELP_STR)
1022 {
1023 int idx_asn = 3;
1024 int idx_vrf = 5;
1025 as_t as;
1026 struct bgp *bgp;
1027 const char *name = NULL;
1028
1029 // "no router bgp" without an ASN
1030 if (argc == 3) {
1031 // Pending: Make VRF option available for ASN less config
1032 bgp = bgp_get_default();
1033
1034 if (bgp == NULL) {
1035 vty_out(vty, "%% No BGP process is configured\n");
1036 return CMD_WARNING_CONFIG_FAILED;
1037 }
1038
1039 if (listcount(bm->bgp) > 1) {
1040 vty_out(vty, "%% Please specify ASN and VRF\n");
1041 return CMD_WARNING_CONFIG_FAILED;
1042 }
1043
1044 if (bgp->l3vni) {
1045 vty_out(vty, "%% Please unconfigure l3vni %u",
1046 bgp->l3vni);
1047 return CMD_WARNING_CONFIG_FAILED;
1048 }
1049 } else {
1050 as = strtoul(argv[idx_asn]->arg, NULL, 10);
1051
1052 if (argc > 4)
1053 name = argv[idx_vrf]->arg;
1054
1055 /* Lookup bgp structure. */
1056 bgp = bgp_lookup(as, name);
1057 if (!bgp) {
1058 vty_out(vty, "%% Can't find BGP instance\n");
1059 return CMD_WARNING_CONFIG_FAILED;
1060 }
1061
1062 if (bgp->l3vni) {
1063 vty_out(vty, "%% Please unconfigure l3vni %u\n",
1064 bgp->l3vni);
1065 return CMD_WARNING_CONFIG_FAILED;
1066 }
1067
1068 /* Cannot delete default instance if vrf instances exist */
1069 if (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT) {
1070 struct listnode *node;
1071 struct bgp *tmp_bgp;
1072
1073 for (ALL_LIST_ELEMENTS_RO(bm->bgp, node, tmp_bgp)) {
1074 if (tmp_bgp->inst_type
1075 == BGP_INSTANCE_TYPE_VRF) {
1076 vty_out(vty,
1077 "%% Cannot delete default BGP instance. Dependent VRF instances exist\n");
1078 return CMD_WARNING_CONFIG_FAILED;
1079 }
1080 }
1081 }
1082 }
1083
1084 bgp_delete(bgp);
1085
1086 return CMD_SUCCESS;
1087 }
1088
1089
1090 /* BGP router-id. */
1091
1092 DEFPY (bgp_router_id,
1093 bgp_router_id_cmd,
1094 "bgp router-id A.B.C.D",
1095 BGP_STR
1096 "Override configured router identifier\n"
1097 "Manually configured router identifier\n")
1098 {
1099 VTY_DECLVAR_CONTEXT(bgp, bgp);
1100 bgp_router_id_static_set(bgp, router_id);
1101 return CMD_SUCCESS;
1102 }
1103
1104 DEFPY (no_bgp_router_id,
1105 no_bgp_router_id_cmd,
1106 "no bgp router-id [A.B.C.D]",
1107 NO_STR
1108 BGP_STR
1109 "Override configured router identifier\n"
1110 "Manually configured router identifier\n")
1111 {
1112 VTY_DECLVAR_CONTEXT(bgp, bgp);
1113
1114 if (router_id_str) {
1115 if (!IPV4_ADDR_SAME(&bgp->router_id_static, &router_id)) {
1116 vty_out(vty, "%% BGP router-id doesn't match\n");
1117 return CMD_WARNING_CONFIG_FAILED;
1118 }
1119 }
1120
1121 router_id.s_addr = 0;
1122 bgp_router_id_static_set(bgp, router_id);
1123
1124 return CMD_SUCCESS;
1125 }
1126
1127
1128 /* BGP Cluster ID. */
1129 DEFUN (bgp_cluster_id,
1130 bgp_cluster_id_cmd,
1131 "bgp cluster-id <A.B.C.D|(1-4294967295)>",
1132 BGP_STR
1133 "Configure Route-Reflector Cluster-id\n"
1134 "Route-Reflector Cluster-id in IP address format\n"
1135 "Route-Reflector Cluster-id as 32 bit quantity\n")
1136 {
1137 VTY_DECLVAR_CONTEXT(bgp, bgp);
1138 int idx_ipv4 = 2;
1139 int ret;
1140 struct in_addr cluster;
1141
1142 ret = inet_aton(argv[idx_ipv4]->arg, &cluster);
1143 if (!ret) {
1144 vty_out(vty, "%% Malformed bgp cluster identifier\n");
1145 return CMD_WARNING_CONFIG_FAILED;
1146 }
1147
1148 bgp_cluster_id_set(bgp, &cluster);
1149 bgp_clear_star_soft_out(vty, bgp->name);
1150
1151 return CMD_SUCCESS;
1152 }
1153
1154 DEFUN (no_bgp_cluster_id,
1155 no_bgp_cluster_id_cmd,
1156 "no bgp cluster-id [<A.B.C.D|(1-4294967295)>]",
1157 NO_STR
1158 BGP_STR
1159 "Configure Route-Reflector Cluster-id\n"
1160 "Route-Reflector Cluster-id in IP address format\n"
1161 "Route-Reflector Cluster-id as 32 bit quantity\n")
1162 {
1163 VTY_DECLVAR_CONTEXT(bgp, bgp);
1164 bgp_cluster_id_unset(bgp);
1165 bgp_clear_star_soft_out(vty, bgp->name);
1166
1167 return CMD_SUCCESS;
1168 }
1169
1170 DEFUN (bgp_confederation_identifier,
1171 bgp_confederation_identifier_cmd,
1172 "bgp confederation identifier (1-4294967295)",
1173 "BGP specific commands\n"
1174 "AS confederation parameters\n"
1175 "AS number\n"
1176 "Set routing domain confederation AS\n")
1177 {
1178 VTY_DECLVAR_CONTEXT(bgp, bgp);
1179 int idx_number = 3;
1180 as_t as;
1181
1182 as = strtoul(argv[idx_number]->arg, NULL, 10);
1183
1184 bgp_confederation_id_set(bgp, as);
1185
1186 return CMD_SUCCESS;
1187 }
1188
1189 DEFUN (no_bgp_confederation_identifier,
1190 no_bgp_confederation_identifier_cmd,
1191 "no bgp confederation identifier [(1-4294967295)]",
1192 NO_STR
1193 "BGP specific commands\n"
1194 "AS confederation parameters\n"
1195 "AS number\n"
1196 "Set routing domain confederation AS\n")
1197 {
1198 VTY_DECLVAR_CONTEXT(bgp, bgp);
1199 bgp_confederation_id_unset(bgp);
1200
1201 return CMD_SUCCESS;
1202 }
1203
1204 DEFUN (bgp_confederation_peers,
1205 bgp_confederation_peers_cmd,
1206 "bgp confederation peers (1-4294967295)...",
1207 "BGP specific commands\n"
1208 "AS confederation parameters\n"
1209 "Peer ASs in BGP confederation\n"
1210 AS_STR)
1211 {
1212 VTY_DECLVAR_CONTEXT(bgp, bgp);
1213 int idx_asn = 3;
1214 as_t as;
1215 int i;
1216
1217 for (i = idx_asn; i < argc; i++) {
1218 as = strtoul(argv[i]->arg, NULL, 10);
1219
1220 if (bgp->as == as) {
1221 vty_out(vty,
1222 "%% Local member-AS not allowed in confed peer list\n");
1223 continue;
1224 }
1225
1226 bgp_confederation_peers_add(bgp, as);
1227 }
1228 return CMD_SUCCESS;
1229 }
1230
1231 DEFUN (no_bgp_confederation_peers,
1232 no_bgp_confederation_peers_cmd,
1233 "no bgp confederation peers (1-4294967295)...",
1234 NO_STR
1235 "BGP specific commands\n"
1236 "AS confederation parameters\n"
1237 "Peer ASs in BGP confederation\n"
1238 AS_STR)
1239 {
1240 VTY_DECLVAR_CONTEXT(bgp, bgp);
1241 int idx_asn = 4;
1242 as_t as;
1243 int i;
1244
1245 for (i = idx_asn; i < argc; i++) {
1246 as = strtoul(argv[i]->arg, NULL, 10);
1247
1248 bgp_confederation_peers_remove(bgp, as);
1249 }
1250 return CMD_SUCCESS;
1251 }
1252
1253 /**
1254 * Central routine for maximum-paths configuration.
1255 * @peer_type: BGP_PEER_EBGP or BGP_PEER_IBGP
1256 * @set: 1 for setting values, 0 for removing the max-paths config.
1257 */
1258 static int bgp_maxpaths_config_vty(struct vty *vty, int peer_type,
1259 const char *mpaths, uint16_t options,
1260 int set)
1261 {
1262 VTY_DECLVAR_CONTEXT(bgp, bgp);
1263 uint16_t maxpaths = 0;
1264 int ret;
1265 afi_t afi;
1266 safi_t safi;
1267
1268 afi = bgp_node_afi(vty);
1269 safi = bgp_node_safi(vty);
1270
1271 if (set) {
1272 maxpaths = strtol(mpaths, NULL, 10);
1273 if (maxpaths > multipath_num) {
1274 vty_out(vty,
1275 "%% Maxpaths Specified: %d is > than multipath num specified on bgp command line %d",
1276 maxpaths, multipath_num);
1277 return CMD_WARNING_CONFIG_FAILED;
1278 }
1279 ret = bgp_maximum_paths_set(bgp, afi, safi, peer_type, maxpaths,
1280 options);
1281 } else
1282 ret = bgp_maximum_paths_unset(bgp, afi, safi, peer_type);
1283
1284 if (ret < 0) {
1285 vty_out(vty,
1286 "%% Failed to %sset maximum-paths %s %u for afi %u, safi %u\n",
1287 (set == 1) ? "" : "un",
1288 (peer_type == BGP_PEER_EBGP) ? "ebgp" : "ibgp",
1289 maxpaths, afi, safi);
1290 return CMD_WARNING_CONFIG_FAILED;
1291 }
1292
1293 bgp_recalculate_all_bestpaths(bgp);
1294
1295 return CMD_SUCCESS;
1296 }
1297
1298 DEFUN (bgp_maxmed_admin,
1299 bgp_maxmed_admin_cmd,
1300 "bgp max-med administrative ",
1301 BGP_STR
1302 "Advertise routes with max-med\n"
1303 "Administratively applied, for an indefinite period\n")
1304 {
1305 VTY_DECLVAR_CONTEXT(bgp, bgp);
1306
1307 bgp->v_maxmed_admin = 1;
1308 bgp->maxmed_admin_value = BGP_MAXMED_VALUE_DEFAULT;
1309
1310 bgp_maxmed_update(bgp);
1311
1312 return CMD_SUCCESS;
1313 }
1314
1315 DEFUN (bgp_maxmed_admin_medv,
1316 bgp_maxmed_admin_medv_cmd,
1317 "bgp max-med administrative (0-4294967295)",
1318 BGP_STR
1319 "Advertise routes with max-med\n"
1320 "Administratively applied, for an indefinite period\n"
1321 "Max MED value to be used\n")
1322 {
1323 VTY_DECLVAR_CONTEXT(bgp, bgp);
1324 int idx_number = 3;
1325
1326 bgp->v_maxmed_admin = 1;
1327 bgp->maxmed_admin_value = strtoul(argv[idx_number]->arg, NULL, 10);
1328
1329 bgp_maxmed_update(bgp);
1330
1331 return CMD_SUCCESS;
1332 }
1333
1334 DEFUN (no_bgp_maxmed_admin,
1335 no_bgp_maxmed_admin_cmd,
1336 "no bgp max-med administrative [(0-4294967295)]",
1337 NO_STR
1338 BGP_STR
1339 "Advertise routes with max-med\n"
1340 "Administratively applied, for an indefinite period\n"
1341 "Max MED value to be used\n")
1342 {
1343 VTY_DECLVAR_CONTEXT(bgp, bgp);
1344 bgp->v_maxmed_admin = BGP_MAXMED_ADMIN_UNCONFIGURED;
1345 bgp->maxmed_admin_value = BGP_MAXMED_VALUE_DEFAULT;
1346 bgp_maxmed_update(bgp);
1347
1348 return CMD_SUCCESS;
1349 }
1350
1351 DEFUN (bgp_maxmed_onstartup,
1352 bgp_maxmed_onstartup_cmd,
1353 "bgp max-med on-startup (5-86400) [(0-4294967295)]",
1354 BGP_STR
1355 "Advertise routes with max-med\n"
1356 "Effective on a startup\n"
1357 "Time (seconds) period for max-med\n"
1358 "Max MED value to be used\n")
1359 {
1360 VTY_DECLVAR_CONTEXT(bgp, bgp);
1361 int idx = 0;
1362
1363 argv_find(argv, argc, "(5-86400)", &idx);
1364 bgp->v_maxmed_onstartup = strtoul(argv[idx]->arg, NULL, 10);
1365 if (argv_find(argv, argc, "(0-4294967295)", &idx))
1366 bgp->maxmed_onstartup_value = strtoul(argv[idx]->arg, NULL, 10);
1367 else
1368 bgp->maxmed_onstartup_value = BGP_MAXMED_VALUE_DEFAULT;
1369
1370 bgp_maxmed_update(bgp);
1371
1372 return CMD_SUCCESS;
1373 }
1374
1375 DEFUN (no_bgp_maxmed_onstartup,
1376 no_bgp_maxmed_onstartup_cmd,
1377 "no bgp max-med on-startup [(5-86400) [(0-4294967295)]]",
1378 NO_STR
1379 BGP_STR
1380 "Advertise routes with max-med\n"
1381 "Effective on a startup\n"
1382 "Time (seconds) period for max-med\n"
1383 "Max MED value to be used\n")
1384 {
1385 VTY_DECLVAR_CONTEXT(bgp, bgp);
1386
1387 /* Cancel max-med onstartup if its on */
1388 if (bgp->t_maxmed_onstartup) {
1389 THREAD_TIMER_OFF(bgp->t_maxmed_onstartup);
1390 bgp->maxmed_onstartup_over = 1;
1391 }
1392
1393 bgp->v_maxmed_onstartup = BGP_MAXMED_ONSTARTUP_UNCONFIGURED;
1394 bgp->maxmed_onstartup_value = BGP_MAXMED_VALUE_DEFAULT;
1395
1396 bgp_maxmed_update(bgp);
1397
1398 return CMD_SUCCESS;
1399 }
1400
1401 static int bgp_update_delay_config_vty(struct vty *vty, const char *delay,
1402 const char *wait)
1403 {
1404 VTY_DECLVAR_CONTEXT(bgp, bgp);
1405 uint16_t update_delay;
1406 uint16_t establish_wait;
1407
1408 update_delay = strtoul(delay, NULL, 10);
1409
1410 if (!wait) /* update-delay <delay> */
1411 {
1412 bgp->v_update_delay = update_delay;
1413 bgp->v_establish_wait = bgp->v_update_delay;
1414 return CMD_SUCCESS;
1415 }
1416
1417 /* update-delay <delay> <establish-wait> */
1418 establish_wait = atoi(wait);
1419 if (update_delay < establish_wait) {
1420 vty_out(vty,
1421 "%%Failed: update-delay less than the establish-wait!\n");
1422 return CMD_WARNING_CONFIG_FAILED;
1423 }
1424
1425 bgp->v_update_delay = update_delay;
1426 bgp->v_establish_wait = establish_wait;
1427
1428 return CMD_SUCCESS;
1429 }
1430
1431 static int bgp_update_delay_deconfig_vty(struct vty *vty)
1432 {
1433 VTY_DECLVAR_CONTEXT(bgp, bgp);
1434
1435 bgp->v_update_delay = BGP_UPDATE_DELAY_DEF;
1436 bgp->v_establish_wait = bgp->v_update_delay;
1437
1438 return CMD_SUCCESS;
1439 }
1440
1441 void bgp_config_write_update_delay(struct vty *vty, struct bgp *bgp)
1442 {
1443 if (bgp->v_update_delay != BGP_UPDATE_DELAY_DEF) {
1444 vty_out(vty, " update-delay %d", bgp->v_update_delay);
1445 if (bgp->v_update_delay != bgp->v_establish_wait)
1446 vty_out(vty, " %d", bgp->v_establish_wait);
1447 vty_out(vty, "\n");
1448 }
1449 }
1450
1451
1452 /* Update-delay configuration */
1453 DEFUN (bgp_update_delay,
1454 bgp_update_delay_cmd,
1455 "update-delay (0-3600)",
1456 "Force initial delay for best-path and updates\n"
1457 "Seconds\n")
1458 {
1459 int idx_number = 1;
1460 return bgp_update_delay_config_vty(vty, argv[idx_number]->arg, NULL);
1461 }
1462
1463 DEFUN (bgp_update_delay_establish_wait,
1464 bgp_update_delay_establish_wait_cmd,
1465 "update-delay (0-3600) (1-3600)",
1466 "Force initial delay for best-path and updates\n"
1467 "Seconds\n"
1468 "Seconds\n")
1469 {
1470 int idx_number = 1;
1471 int idx_number_2 = 2;
1472 return bgp_update_delay_config_vty(vty, argv[idx_number]->arg,
1473 argv[idx_number_2]->arg);
1474 }
1475
1476 /* Update-delay deconfiguration */
1477 DEFUN (no_bgp_update_delay,
1478 no_bgp_update_delay_cmd,
1479 "no update-delay [(0-3600) [(1-3600)]]",
1480 NO_STR
1481 "Force initial delay for best-path and updates\n"
1482 "Seconds\n"
1483 "Seconds\n")
1484 {
1485 return bgp_update_delay_deconfig_vty(vty);
1486 }
1487
1488
1489 static int bgp_wpkt_quanta_config_vty(struct vty *vty, const char *num,
1490 char set)
1491 {
1492 VTY_DECLVAR_CONTEXT(bgp, bgp);
1493
1494 if (set) {
1495 uint32_t quanta = strtoul(num, NULL, 10);
1496 atomic_store_explicit(&bgp->wpkt_quanta, quanta,
1497 memory_order_relaxed);
1498 } else {
1499 atomic_store_explicit(&bgp->wpkt_quanta, BGP_WRITE_PACKET_MAX,
1500 memory_order_relaxed);
1501 }
1502
1503 return CMD_SUCCESS;
1504 }
1505
1506 static int bgp_rpkt_quanta_config_vty(struct vty *vty, const char *num,
1507 char set)
1508 {
1509 VTY_DECLVAR_CONTEXT(bgp, bgp);
1510
1511 if (set) {
1512 uint32_t quanta = strtoul(num, NULL, 10);
1513 atomic_store_explicit(&bgp->rpkt_quanta, quanta,
1514 memory_order_relaxed);
1515 } else {
1516 atomic_store_explicit(&bgp->rpkt_quanta, BGP_READ_PACKET_MAX,
1517 memory_order_relaxed);
1518 }
1519
1520 return CMD_SUCCESS;
1521 }
1522
1523 void bgp_config_write_wpkt_quanta(struct vty *vty, struct bgp *bgp)
1524 {
1525 uint32_t quanta =
1526 atomic_load_explicit(&bgp->wpkt_quanta, memory_order_relaxed);
1527 if (quanta != BGP_WRITE_PACKET_MAX)
1528 vty_out(vty, " write-quanta %d\n", quanta);
1529 }
1530
1531 void bgp_config_write_rpkt_quanta(struct vty *vty, struct bgp *bgp)
1532 {
1533 uint32_t quanta =
1534 atomic_load_explicit(&bgp->rpkt_quanta, memory_order_relaxed);
1535 if (quanta != BGP_READ_PACKET_MAX)
1536 vty_out(vty, " read-quanta %d\n", quanta);
1537 }
1538
1539 /* Packet quanta configuration */
1540 DEFUN (bgp_wpkt_quanta,
1541 bgp_wpkt_quanta_cmd,
1542 "write-quanta (1-10)",
1543 "How many packets to write to peer socket per run\n"
1544 "Number of packets\n")
1545 {
1546 int idx_number = 1;
1547 return bgp_wpkt_quanta_config_vty(vty, argv[idx_number]->arg, 1);
1548 }
1549
1550 DEFUN (no_bgp_wpkt_quanta,
1551 no_bgp_wpkt_quanta_cmd,
1552 "no write-quanta (1-10)",
1553 NO_STR
1554 "How many packets to write to peer socket per I/O cycle\n"
1555 "Number of packets\n")
1556 {
1557 int idx_number = 2;
1558 return bgp_wpkt_quanta_config_vty(vty, argv[idx_number]->arg, 0);
1559 }
1560
1561 DEFUN (bgp_rpkt_quanta,
1562 bgp_rpkt_quanta_cmd,
1563 "read-quanta (1-10)",
1564 "How many packets to read from peer socket per I/O cycle\n"
1565 "Number of packets\n")
1566 {
1567 int idx_number = 1;
1568 return bgp_rpkt_quanta_config_vty(vty, argv[idx_number]->arg, 1);
1569 }
1570
1571 DEFUN (no_bgp_rpkt_quanta,
1572 no_bgp_rpkt_quanta_cmd,
1573 "no read-quanta (1-10)",
1574 NO_STR
1575 "How many packets to read from peer socket per I/O cycle\n"
1576 "Number of packets\n")
1577 {
1578 int idx_number = 2;
1579 return bgp_rpkt_quanta_config_vty(vty, argv[idx_number]->arg, 0);
1580 }
1581
1582 void bgp_config_write_coalesce_time(struct vty *vty, struct bgp *bgp)
1583 {
1584 if (!bgp->heuristic_coalesce)
1585 vty_out(vty, " coalesce-time %u\n", bgp->coalesce_time);
1586 }
1587
1588
1589 DEFUN (bgp_coalesce_time,
1590 bgp_coalesce_time_cmd,
1591 "coalesce-time (0-4294967295)",
1592 "Subgroup coalesce timer\n"
1593 "Subgroup coalesce timer value (in ms)\n")
1594 {
1595 VTY_DECLVAR_CONTEXT(bgp, bgp);
1596
1597 int idx = 0;
1598 argv_find(argv, argc, "(0-4294967295)", &idx);
1599 bgp->heuristic_coalesce = false;
1600 bgp->coalesce_time = strtoul(argv[idx]->arg, NULL, 10);
1601 return CMD_SUCCESS;
1602 }
1603
1604 DEFUN (no_bgp_coalesce_time,
1605 no_bgp_coalesce_time_cmd,
1606 "no coalesce-time (0-4294967295)",
1607 NO_STR
1608 "Subgroup coalesce timer\n"
1609 "Subgroup coalesce timer value (in ms)\n")
1610 {
1611 VTY_DECLVAR_CONTEXT(bgp, bgp);
1612
1613 bgp->heuristic_coalesce = true;
1614 bgp->coalesce_time = BGP_DEFAULT_SUBGROUP_COALESCE_TIME;
1615 return CMD_SUCCESS;
1616 }
1617
1618 /* Maximum-paths configuration */
1619 DEFUN (bgp_maxpaths,
1620 bgp_maxpaths_cmd,
1621 "maximum-paths " CMD_RANGE_STR(1, MULTIPATH_NUM),
1622 "Forward packets over multiple paths\n"
1623 "Number of paths\n")
1624 {
1625 int idx_number = 1;
1626 return bgp_maxpaths_config_vty(vty, BGP_PEER_EBGP,
1627 argv[idx_number]->arg, 0, 1);
1628 }
1629
1630 ALIAS_HIDDEN(bgp_maxpaths, bgp_maxpaths_hidden_cmd,
1631 "maximum-paths " CMD_RANGE_STR(1, MULTIPATH_NUM),
1632 "Forward packets over multiple paths\n"
1633 "Number of paths\n")
1634
1635 DEFUN (bgp_maxpaths_ibgp,
1636 bgp_maxpaths_ibgp_cmd,
1637 "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM),
1638 "Forward packets over multiple paths\n"
1639 "iBGP-multipath\n"
1640 "Number of paths\n")
1641 {
1642 int idx_number = 2;
1643 return bgp_maxpaths_config_vty(vty, BGP_PEER_IBGP,
1644 argv[idx_number]->arg, 0, 1);
1645 }
1646
1647 ALIAS_HIDDEN(bgp_maxpaths_ibgp, bgp_maxpaths_ibgp_hidden_cmd,
1648 "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM),
1649 "Forward packets over multiple paths\n"
1650 "iBGP-multipath\n"
1651 "Number of paths\n")
1652
1653 DEFUN (bgp_maxpaths_ibgp_cluster,
1654 bgp_maxpaths_ibgp_cluster_cmd,
1655 "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM) " equal-cluster-length",
1656 "Forward packets over multiple paths\n"
1657 "iBGP-multipath\n"
1658 "Number of paths\n"
1659 "Match the cluster length\n")
1660 {
1661 int idx_number = 2;
1662 return bgp_maxpaths_config_vty(
1663 vty, BGP_PEER_IBGP, argv[idx_number]->arg,
1664 BGP_FLAG_IBGP_MULTIPATH_SAME_CLUSTERLEN, 1);
1665 }
1666
1667 ALIAS_HIDDEN(bgp_maxpaths_ibgp_cluster, bgp_maxpaths_ibgp_cluster_hidden_cmd,
1668 "maximum-paths ibgp " CMD_RANGE_STR(
1669 1, MULTIPATH_NUM) " equal-cluster-length",
1670 "Forward packets over multiple paths\n"
1671 "iBGP-multipath\n"
1672 "Number of paths\n"
1673 "Match the cluster length\n")
1674
1675 DEFUN (no_bgp_maxpaths,
1676 no_bgp_maxpaths_cmd,
1677 "no maximum-paths [" CMD_RANGE_STR(1, MULTIPATH_NUM) "]",
1678 NO_STR
1679 "Forward packets over multiple paths\n"
1680 "Number of paths\n")
1681 {
1682 return bgp_maxpaths_config_vty(vty, BGP_PEER_EBGP, NULL, 0, 0);
1683 }
1684
1685 ALIAS_HIDDEN(no_bgp_maxpaths, no_bgp_maxpaths_hidden_cmd,
1686 "no maximum-paths [" CMD_RANGE_STR(1, MULTIPATH_NUM) "]", NO_STR
1687 "Forward packets over multiple paths\n"
1688 "Number of paths\n")
1689
1690 DEFUN (no_bgp_maxpaths_ibgp,
1691 no_bgp_maxpaths_ibgp_cmd,
1692 "no maximum-paths ibgp [" CMD_RANGE_STR(1, MULTIPATH_NUM) " [equal-cluster-length]]",
1693 NO_STR
1694 "Forward packets over multiple paths\n"
1695 "iBGP-multipath\n"
1696 "Number of paths\n"
1697 "Match the cluster length\n")
1698 {
1699 return bgp_maxpaths_config_vty(vty, BGP_PEER_IBGP, NULL, 0, 0);
1700 }
1701
1702 ALIAS_HIDDEN(no_bgp_maxpaths_ibgp, no_bgp_maxpaths_ibgp_hidden_cmd,
1703 "no maximum-paths ibgp [" CMD_RANGE_STR(
1704 1, MULTIPATH_NUM) " [equal-cluster-length]]",
1705 NO_STR
1706 "Forward packets over multiple paths\n"
1707 "iBGP-multipath\n"
1708 "Number of paths\n"
1709 "Match the cluster length\n")
1710
1711 void bgp_config_write_maxpaths(struct vty *vty, struct bgp *bgp, afi_t afi,
1712 safi_t safi)
1713 {
1714 if (bgp->maxpaths[afi][safi].maxpaths_ebgp != MULTIPATH_NUM) {
1715 vty_out(vty, " maximum-paths %d\n",
1716 bgp->maxpaths[afi][safi].maxpaths_ebgp);
1717 }
1718
1719 if (bgp->maxpaths[afi][safi].maxpaths_ibgp != MULTIPATH_NUM) {
1720 vty_out(vty, " maximum-paths ibgp %d",
1721 bgp->maxpaths[afi][safi].maxpaths_ibgp);
1722 if (CHECK_FLAG(bgp->maxpaths[afi][safi].ibgp_flags,
1723 BGP_FLAG_IBGP_MULTIPATH_SAME_CLUSTERLEN))
1724 vty_out(vty, " equal-cluster-length");
1725 vty_out(vty, "\n");
1726 }
1727 }
1728
1729 /* BGP timers. */
1730
1731 DEFUN (bgp_timers,
1732 bgp_timers_cmd,
1733 "timers bgp (0-65535) (0-65535)",
1734 "Adjust routing timers\n"
1735 "BGP timers\n"
1736 "Keepalive interval\n"
1737 "Holdtime\n")
1738 {
1739 VTY_DECLVAR_CONTEXT(bgp, bgp);
1740 int idx_number = 2;
1741 int idx_number_2 = 3;
1742 unsigned long keepalive = 0;
1743 unsigned long holdtime = 0;
1744
1745 keepalive = strtoul(argv[idx_number]->arg, NULL, 10);
1746 holdtime = strtoul(argv[idx_number_2]->arg, NULL, 10);
1747
1748 /* Holdtime value check. */
1749 if (holdtime < 3 && holdtime != 0) {
1750 vty_out(vty,
1751 "%% hold time value must be either 0 or greater than 3\n");
1752 return CMD_WARNING_CONFIG_FAILED;
1753 }
1754
1755 bgp_timers_set(bgp, keepalive, holdtime);
1756
1757 return CMD_SUCCESS;
1758 }
1759
1760 DEFUN (no_bgp_timers,
1761 no_bgp_timers_cmd,
1762 "no timers bgp [(0-65535) (0-65535)]",
1763 NO_STR
1764 "Adjust routing timers\n"
1765 "BGP timers\n"
1766 "Keepalive interval\n"
1767 "Holdtime\n")
1768 {
1769 VTY_DECLVAR_CONTEXT(bgp, bgp);
1770 bgp_timers_unset(bgp);
1771
1772 return CMD_SUCCESS;
1773 }
1774
1775
1776 DEFUN (bgp_client_to_client_reflection,
1777 bgp_client_to_client_reflection_cmd,
1778 "bgp client-to-client reflection",
1779 "BGP specific commands\n"
1780 "Configure client to client route reflection\n"
1781 "reflection of routes allowed\n")
1782 {
1783 VTY_DECLVAR_CONTEXT(bgp, bgp);
1784 bgp_flag_unset(bgp, BGP_FLAG_NO_CLIENT_TO_CLIENT);
1785 bgp_clear_star_soft_out(vty, bgp->name);
1786
1787 return CMD_SUCCESS;
1788 }
1789
1790 DEFUN (no_bgp_client_to_client_reflection,
1791 no_bgp_client_to_client_reflection_cmd,
1792 "no bgp client-to-client reflection",
1793 NO_STR
1794 "BGP specific commands\n"
1795 "Configure client to client route reflection\n"
1796 "reflection of routes allowed\n")
1797 {
1798 VTY_DECLVAR_CONTEXT(bgp, bgp);
1799 bgp_flag_set(bgp, BGP_FLAG_NO_CLIENT_TO_CLIENT);
1800 bgp_clear_star_soft_out(vty, bgp->name);
1801
1802 return CMD_SUCCESS;
1803 }
1804
1805 /* "bgp always-compare-med" configuration. */
1806 DEFUN (bgp_always_compare_med,
1807 bgp_always_compare_med_cmd,
1808 "bgp always-compare-med",
1809 "BGP specific commands\n"
1810 "Allow comparing MED from different neighbors\n")
1811 {
1812 VTY_DECLVAR_CONTEXT(bgp, bgp);
1813 bgp_flag_set(bgp, BGP_FLAG_ALWAYS_COMPARE_MED);
1814 bgp_recalculate_all_bestpaths(bgp);
1815
1816 return CMD_SUCCESS;
1817 }
1818
1819 DEFUN (no_bgp_always_compare_med,
1820 no_bgp_always_compare_med_cmd,
1821 "no bgp always-compare-med",
1822 NO_STR
1823 "BGP specific commands\n"
1824 "Allow comparing MED from different neighbors\n")
1825 {
1826 VTY_DECLVAR_CONTEXT(bgp, bgp);
1827 bgp_flag_unset(bgp, BGP_FLAG_ALWAYS_COMPARE_MED);
1828 bgp_recalculate_all_bestpaths(bgp);
1829
1830 return CMD_SUCCESS;
1831 }
1832
1833
1834 DEFUN(bgp_ebgp_requires_policy, bgp_ebgp_requires_policy_cmd,
1835 "bgp ebgp-requires-policy",
1836 "BGP specific commands\n"
1837 "Require in and out policy for eBGP peers (RFC8212)\n")
1838 {
1839 VTY_DECLVAR_CONTEXT(bgp, bgp);
1840 bgp->ebgp_requires_policy = DEFAULT_EBGP_POLICY_ENABLED;
1841 return CMD_SUCCESS;
1842 }
1843
1844 DEFUN(no_bgp_ebgp_requires_policy, no_bgp_ebgp_requires_policy_cmd,
1845 "no bgp ebgp-requires-policy",
1846 NO_STR
1847 "BGP specific commands\n"
1848 "Require in and out policy for eBGP peers (RFC8212)\n")
1849 {
1850 VTY_DECLVAR_CONTEXT(bgp, bgp);
1851 bgp->ebgp_requires_policy = DEFAULT_EBGP_POLICY_DISABLED;
1852 return CMD_SUCCESS;
1853 }
1854
1855
1856 /* "bgp deterministic-med" configuration. */
1857 DEFUN (bgp_deterministic_med,
1858 bgp_deterministic_med_cmd,
1859 "bgp deterministic-med",
1860 "BGP specific commands\n"
1861 "Pick the best-MED path among paths advertised from the neighboring AS\n")
1862 {
1863 VTY_DECLVAR_CONTEXT(bgp, bgp);
1864
1865 if (!bgp_flag_check(bgp, BGP_FLAG_DETERMINISTIC_MED)) {
1866 bgp_flag_set(bgp, BGP_FLAG_DETERMINISTIC_MED);
1867 bgp_recalculate_all_bestpaths(bgp);
1868 }
1869
1870 return CMD_SUCCESS;
1871 }
1872
1873 DEFUN (no_bgp_deterministic_med,
1874 no_bgp_deterministic_med_cmd,
1875 "no bgp deterministic-med",
1876 NO_STR
1877 "BGP specific commands\n"
1878 "Pick the best-MED path among paths advertised from the neighboring AS\n")
1879 {
1880 VTY_DECLVAR_CONTEXT(bgp, bgp);
1881 int bestpath_per_as_used;
1882 afi_t afi;
1883 safi_t safi;
1884 struct peer *peer;
1885 struct listnode *node, *nnode;
1886
1887 if (bgp_flag_check(bgp, BGP_FLAG_DETERMINISTIC_MED)) {
1888 bestpath_per_as_used = 0;
1889
1890 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
1891 FOREACH_AFI_SAFI (afi, safi)
1892 if (bgp_addpath_dmed_required(
1893 peer->addpath_type[afi][safi])) {
1894 bestpath_per_as_used = 1;
1895 break;
1896 }
1897
1898 if (bestpath_per_as_used)
1899 break;
1900 }
1901
1902 if (bestpath_per_as_used) {
1903 vty_out(vty,
1904 "bgp deterministic-med cannot be disabled while addpath-tx-bestpath-per-AS is in use\n");
1905 return CMD_WARNING_CONFIG_FAILED;
1906 } else {
1907 bgp_flag_unset(bgp, BGP_FLAG_DETERMINISTIC_MED);
1908 bgp_recalculate_all_bestpaths(bgp);
1909 }
1910 }
1911
1912 return CMD_SUCCESS;
1913 }
1914
1915 /* "bgp graceful-restart" configuration. */
1916 DEFUN (bgp_graceful_restart,
1917 bgp_graceful_restart_cmd,
1918 "bgp graceful-restart",
1919 "BGP specific commands\n"
1920 "Graceful restart capability parameters\n")
1921 {
1922 VTY_DECLVAR_CONTEXT(bgp, bgp);
1923 bgp_flag_set(bgp, BGP_FLAG_GRACEFUL_RESTART);
1924 return CMD_SUCCESS;
1925 }
1926
1927 DEFUN (no_bgp_graceful_restart,
1928 no_bgp_graceful_restart_cmd,
1929 "no bgp graceful-restart",
1930 NO_STR
1931 "BGP specific commands\n"
1932 "Graceful restart capability parameters\n")
1933 {
1934 VTY_DECLVAR_CONTEXT(bgp, bgp);
1935 bgp_flag_unset(bgp, BGP_FLAG_GRACEFUL_RESTART);
1936 return CMD_SUCCESS;
1937 }
1938
1939 DEFUN (bgp_graceful_restart_stalepath_time,
1940 bgp_graceful_restart_stalepath_time_cmd,
1941 "bgp graceful-restart stalepath-time (1-4095)",
1942 "BGP specific commands\n"
1943 "Graceful restart capability parameters\n"
1944 "Set the max time to hold onto restarting peer's stale paths\n"
1945 "Delay value (seconds)\n")
1946 {
1947 VTY_DECLVAR_CONTEXT(bgp, bgp);
1948 int idx_number = 3;
1949 uint32_t stalepath;
1950
1951 stalepath = strtoul(argv[idx_number]->arg, NULL, 10);
1952 bgp->stalepath_time = stalepath;
1953 return CMD_SUCCESS;
1954 }
1955
1956 DEFUN (bgp_graceful_restart_restart_time,
1957 bgp_graceful_restart_restart_time_cmd,
1958 "bgp graceful-restart restart-time (1-4095)",
1959 "BGP specific commands\n"
1960 "Graceful restart capability parameters\n"
1961 "Set the time to wait to delete stale routes before a BGP open message is received\n"
1962 "Delay value (seconds)\n")
1963 {
1964 VTY_DECLVAR_CONTEXT(bgp, bgp);
1965 int idx_number = 3;
1966 uint32_t restart;
1967
1968 restart = strtoul(argv[idx_number]->arg, NULL, 10);
1969 bgp->restart_time = restart;
1970 return CMD_SUCCESS;
1971 }
1972
1973 DEFUN (no_bgp_graceful_restart_stalepath_time,
1974 no_bgp_graceful_restart_stalepath_time_cmd,
1975 "no bgp graceful-restart stalepath-time [(1-4095)]",
1976 NO_STR
1977 "BGP specific commands\n"
1978 "Graceful restart capability parameters\n"
1979 "Set the max time to hold onto restarting peer's stale paths\n"
1980 "Delay value (seconds)\n")
1981 {
1982 VTY_DECLVAR_CONTEXT(bgp, bgp);
1983
1984 bgp->stalepath_time = BGP_DEFAULT_STALEPATH_TIME;
1985 return CMD_SUCCESS;
1986 }
1987
1988 DEFUN (no_bgp_graceful_restart_restart_time,
1989 no_bgp_graceful_restart_restart_time_cmd,
1990 "no bgp graceful-restart restart-time [(1-4095)]",
1991 NO_STR
1992 "BGP specific commands\n"
1993 "Graceful restart capability parameters\n"
1994 "Set the time to wait to delete stale routes before a BGP open message is received\n"
1995 "Delay value (seconds)\n")
1996 {
1997 VTY_DECLVAR_CONTEXT(bgp, bgp);
1998
1999 bgp->restart_time = BGP_DEFAULT_RESTART_TIME;
2000 return CMD_SUCCESS;
2001 }
2002
2003 DEFUN (bgp_graceful_restart_preserve_fw,
2004 bgp_graceful_restart_preserve_fw_cmd,
2005 "bgp graceful-restart preserve-fw-state",
2006 "BGP specific commands\n"
2007 "Graceful restart capability parameters\n"
2008 "Sets F-bit indication that fib is preserved while doing Graceful Restart\n")
2009 {
2010 VTY_DECLVAR_CONTEXT(bgp, bgp);
2011 bgp_flag_set(bgp, BGP_FLAG_GR_PRESERVE_FWD);
2012 return CMD_SUCCESS;
2013 }
2014
2015 DEFUN (no_bgp_graceful_restart_preserve_fw,
2016 no_bgp_graceful_restart_preserve_fw_cmd,
2017 "no bgp graceful-restart preserve-fw-state",
2018 NO_STR
2019 "BGP specific commands\n"
2020 "Graceful restart capability parameters\n"
2021 "Unsets F-bit indication that fib is preserved while doing Graceful Restart\n")
2022 {
2023 VTY_DECLVAR_CONTEXT(bgp, bgp);
2024 bgp_flag_unset(bgp, BGP_FLAG_GR_PRESERVE_FWD);
2025 return CMD_SUCCESS;
2026 }
2027
2028 /* "bgp graceful-shutdown" configuration */
2029 DEFUN (bgp_graceful_shutdown,
2030 bgp_graceful_shutdown_cmd,
2031 "bgp graceful-shutdown",
2032 BGP_STR
2033 "Graceful shutdown parameters\n")
2034 {
2035 VTY_DECLVAR_CONTEXT(bgp, bgp);
2036
2037 if (!bgp_flag_check(bgp, BGP_FLAG_GRACEFUL_SHUTDOWN)) {
2038 bgp_flag_set(bgp, BGP_FLAG_GRACEFUL_SHUTDOWN);
2039 bgp_static_redo_import_check(bgp);
2040 bgp_redistribute_redo(bgp);
2041 bgp_clear_star_soft_out(vty, bgp->name);
2042 bgp_clear_star_soft_in(vty, bgp->name);
2043 }
2044
2045 return CMD_SUCCESS;
2046 }
2047
2048 DEFUN (no_bgp_graceful_shutdown,
2049 no_bgp_graceful_shutdown_cmd,
2050 "no bgp graceful-shutdown",
2051 NO_STR
2052 BGP_STR
2053 "Graceful shutdown parameters\n")
2054 {
2055 VTY_DECLVAR_CONTEXT(bgp, bgp);
2056
2057 if (bgp_flag_check(bgp, BGP_FLAG_GRACEFUL_SHUTDOWN)) {
2058 bgp_flag_unset(bgp, BGP_FLAG_GRACEFUL_SHUTDOWN);
2059 bgp_static_redo_import_check(bgp);
2060 bgp_redistribute_redo(bgp);
2061 bgp_clear_star_soft_out(vty, bgp->name);
2062 bgp_clear_star_soft_in(vty, bgp->name);
2063 }
2064
2065 return CMD_SUCCESS;
2066 }
2067
2068 /* "bgp fast-external-failover" configuration. */
2069 DEFUN (bgp_fast_external_failover,
2070 bgp_fast_external_failover_cmd,
2071 "bgp fast-external-failover",
2072 BGP_STR
2073 "Immediately reset session if a link to a directly connected external peer goes down\n")
2074 {
2075 VTY_DECLVAR_CONTEXT(bgp, bgp);
2076 bgp_flag_unset(bgp, BGP_FLAG_NO_FAST_EXT_FAILOVER);
2077 return CMD_SUCCESS;
2078 }
2079
2080 DEFUN (no_bgp_fast_external_failover,
2081 no_bgp_fast_external_failover_cmd,
2082 "no bgp fast-external-failover",
2083 NO_STR
2084 BGP_STR
2085 "Immediately reset session if a link to a directly connected external peer goes down\n")
2086 {
2087 VTY_DECLVAR_CONTEXT(bgp, bgp);
2088 bgp_flag_set(bgp, BGP_FLAG_NO_FAST_EXT_FAILOVER);
2089 return CMD_SUCCESS;
2090 }
2091
2092 /* "bgp bestpath compare-routerid" configuration. */
2093 DEFUN (bgp_bestpath_compare_router_id,
2094 bgp_bestpath_compare_router_id_cmd,
2095 "bgp bestpath compare-routerid",
2096 "BGP specific commands\n"
2097 "Change the default bestpath selection\n"
2098 "Compare router-id for identical EBGP paths\n")
2099 {
2100 VTY_DECLVAR_CONTEXT(bgp, bgp);
2101 bgp_flag_set(bgp, BGP_FLAG_COMPARE_ROUTER_ID);
2102 bgp_recalculate_all_bestpaths(bgp);
2103
2104 return CMD_SUCCESS;
2105 }
2106
2107 DEFUN (no_bgp_bestpath_compare_router_id,
2108 no_bgp_bestpath_compare_router_id_cmd,
2109 "no bgp bestpath compare-routerid",
2110 NO_STR
2111 "BGP specific commands\n"
2112 "Change the default bestpath selection\n"
2113 "Compare router-id for identical EBGP paths\n")
2114 {
2115 VTY_DECLVAR_CONTEXT(bgp, bgp);
2116 bgp_flag_unset(bgp, BGP_FLAG_COMPARE_ROUTER_ID);
2117 bgp_recalculate_all_bestpaths(bgp);
2118
2119 return CMD_SUCCESS;
2120 }
2121
2122 /* "bgp bestpath as-path ignore" configuration. */
2123 DEFUN (bgp_bestpath_aspath_ignore,
2124 bgp_bestpath_aspath_ignore_cmd,
2125 "bgp bestpath as-path ignore",
2126 "BGP specific commands\n"
2127 "Change the default bestpath selection\n"
2128 "AS-path attribute\n"
2129 "Ignore as-path length in selecting a route\n")
2130 {
2131 VTY_DECLVAR_CONTEXT(bgp, bgp);
2132 bgp_flag_set(bgp, BGP_FLAG_ASPATH_IGNORE);
2133 bgp_recalculate_all_bestpaths(bgp);
2134
2135 return CMD_SUCCESS;
2136 }
2137
2138 DEFUN (no_bgp_bestpath_aspath_ignore,
2139 no_bgp_bestpath_aspath_ignore_cmd,
2140 "no bgp bestpath as-path ignore",
2141 NO_STR
2142 "BGP specific commands\n"
2143 "Change the default bestpath selection\n"
2144 "AS-path attribute\n"
2145 "Ignore as-path length in selecting a route\n")
2146 {
2147 VTY_DECLVAR_CONTEXT(bgp, bgp);
2148 bgp_flag_unset(bgp, BGP_FLAG_ASPATH_IGNORE);
2149 bgp_recalculate_all_bestpaths(bgp);
2150
2151 return CMD_SUCCESS;
2152 }
2153
2154 /* "bgp bestpath as-path confed" configuration. */
2155 DEFUN (bgp_bestpath_aspath_confed,
2156 bgp_bestpath_aspath_confed_cmd,
2157 "bgp bestpath as-path confed",
2158 "BGP specific commands\n"
2159 "Change the default bestpath selection\n"
2160 "AS-path attribute\n"
2161 "Compare path lengths including confederation sets & sequences in selecting a route\n")
2162 {
2163 VTY_DECLVAR_CONTEXT(bgp, bgp);
2164 bgp_flag_set(bgp, BGP_FLAG_ASPATH_CONFED);
2165 bgp_recalculate_all_bestpaths(bgp);
2166
2167 return CMD_SUCCESS;
2168 }
2169
2170 DEFUN (no_bgp_bestpath_aspath_confed,
2171 no_bgp_bestpath_aspath_confed_cmd,
2172 "no bgp bestpath as-path confed",
2173 NO_STR
2174 "BGP specific commands\n"
2175 "Change the default bestpath selection\n"
2176 "AS-path attribute\n"
2177 "Compare path lengths including confederation sets & sequences in selecting a route\n")
2178 {
2179 VTY_DECLVAR_CONTEXT(bgp, bgp);
2180 bgp_flag_unset(bgp, BGP_FLAG_ASPATH_CONFED);
2181 bgp_recalculate_all_bestpaths(bgp);
2182
2183 return CMD_SUCCESS;
2184 }
2185
2186 /* "bgp bestpath as-path multipath-relax" configuration. */
2187 DEFUN (bgp_bestpath_aspath_multipath_relax,
2188 bgp_bestpath_aspath_multipath_relax_cmd,
2189 "bgp bestpath as-path multipath-relax [<as-set|no-as-set>]",
2190 "BGP specific commands\n"
2191 "Change the default bestpath selection\n"
2192 "AS-path attribute\n"
2193 "Allow load sharing across routes that have different AS paths (but same length)\n"
2194 "Generate an AS_SET\n"
2195 "Do not generate an AS_SET\n")
2196 {
2197 VTY_DECLVAR_CONTEXT(bgp, bgp);
2198 int idx = 0;
2199 bgp_flag_set(bgp, BGP_FLAG_ASPATH_MULTIPATH_RELAX);
2200
2201 /* no-as-set is now the default behavior so we can silently
2202 * ignore it */
2203 if (argv_find(argv, argc, "as-set", &idx))
2204 bgp_flag_set(bgp, BGP_FLAG_MULTIPATH_RELAX_AS_SET);
2205 else
2206 bgp_flag_unset(bgp, BGP_FLAG_MULTIPATH_RELAX_AS_SET);
2207
2208 bgp_recalculate_all_bestpaths(bgp);
2209
2210 return CMD_SUCCESS;
2211 }
2212
2213 DEFUN (no_bgp_bestpath_aspath_multipath_relax,
2214 no_bgp_bestpath_aspath_multipath_relax_cmd,
2215 "no bgp bestpath as-path multipath-relax [<as-set|no-as-set>]",
2216 NO_STR
2217 "BGP specific commands\n"
2218 "Change the default bestpath selection\n"
2219 "AS-path attribute\n"
2220 "Allow load sharing across routes that have different AS paths (but same length)\n"
2221 "Generate an AS_SET\n"
2222 "Do not generate an AS_SET\n")
2223 {
2224 VTY_DECLVAR_CONTEXT(bgp, bgp);
2225 bgp_flag_unset(bgp, BGP_FLAG_ASPATH_MULTIPATH_RELAX);
2226 bgp_flag_unset(bgp, BGP_FLAG_MULTIPATH_RELAX_AS_SET);
2227 bgp_recalculate_all_bestpaths(bgp);
2228
2229 return CMD_SUCCESS;
2230 }
2231
2232 /* "bgp log-neighbor-changes" configuration. */
2233 DEFUN (bgp_log_neighbor_changes,
2234 bgp_log_neighbor_changes_cmd,
2235 "bgp log-neighbor-changes",
2236 "BGP specific commands\n"
2237 "Log neighbor up/down and reset reason\n")
2238 {
2239 VTY_DECLVAR_CONTEXT(bgp, bgp);
2240 bgp_flag_set(bgp, BGP_FLAG_LOG_NEIGHBOR_CHANGES);
2241 return CMD_SUCCESS;
2242 }
2243
2244 DEFUN (no_bgp_log_neighbor_changes,
2245 no_bgp_log_neighbor_changes_cmd,
2246 "no bgp log-neighbor-changes",
2247 NO_STR
2248 "BGP specific commands\n"
2249 "Log neighbor up/down and reset reason\n")
2250 {
2251 VTY_DECLVAR_CONTEXT(bgp, bgp);
2252 bgp_flag_unset(bgp, BGP_FLAG_LOG_NEIGHBOR_CHANGES);
2253 return CMD_SUCCESS;
2254 }
2255
2256 /* "bgp bestpath med" configuration. */
2257 DEFUN (bgp_bestpath_med,
2258 bgp_bestpath_med_cmd,
2259 "bgp bestpath med <confed [missing-as-worst]|missing-as-worst [confed]>",
2260 "BGP specific commands\n"
2261 "Change the default bestpath selection\n"
2262 "MED attribute\n"
2263 "Compare MED among confederation paths\n"
2264 "Treat missing MED as the least preferred one\n"
2265 "Treat missing MED as the least preferred one\n"
2266 "Compare MED among confederation paths\n")
2267 {
2268 VTY_DECLVAR_CONTEXT(bgp, bgp);
2269
2270 int idx = 0;
2271 if (argv_find(argv, argc, "confed", &idx))
2272 bgp_flag_set(bgp, BGP_FLAG_MED_CONFED);
2273 idx = 0;
2274 if (argv_find(argv, argc, "missing-as-worst", &idx))
2275 bgp_flag_set(bgp, BGP_FLAG_MED_MISSING_AS_WORST);
2276
2277 bgp_recalculate_all_bestpaths(bgp);
2278
2279 return CMD_SUCCESS;
2280 }
2281
2282 DEFUN (no_bgp_bestpath_med,
2283 no_bgp_bestpath_med_cmd,
2284 "no bgp bestpath med <confed [missing-as-worst]|missing-as-worst [confed]>",
2285 NO_STR
2286 "BGP specific commands\n"
2287 "Change the default bestpath selection\n"
2288 "MED attribute\n"
2289 "Compare MED among confederation paths\n"
2290 "Treat missing MED as the least preferred one\n"
2291 "Treat missing MED as the least preferred one\n"
2292 "Compare MED among confederation paths\n")
2293 {
2294 VTY_DECLVAR_CONTEXT(bgp, bgp);
2295
2296 int idx = 0;
2297 if (argv_find(argv, argc, "confed", &idx))
2298 bgp_flag_unset(bgp, BGP_FLAG_MED_CONFED);
2299 idx = 0;
2300 if (argv_find(argv, argc, "missing-as-worst", &idx))
2301 bgp_flag_unset(bgp, BGP_FLAG_MED_MISSING_AS_WORST);
2302
2303 bgp_recalculate_all_bestpaths(bgp);
2304
2305 return CMD_SUCCESS;
2306 }
2307
2308 /* "no bgp default ipv4-unicast". */
2309 DEFUN (no_bgp_default_ipv4_unicast,
2310 no_bgp_default_ipv4_unicast_cmd,
2311 "no bgp default ipv4-unicast",
2312 NO_STR
2313 "BGP specific commands\n"
2314 "Configure BGP defaults\n"
2315 "Activate ipv4-unicast for a peer by default\n")
2316 {
2317 VTY_DECLVAR_CONTEXT(bgp, bgp);
2318 bgp_flag_set(bgp, BGP_FLAG_NO_DEFAULT_IPV4);
2319 return CMD_SUCCESS;
2320 }
2321
2322 DEFUN (bgp_default_ipv4_unicast,
2323 bgp_default_ipv4_unicast_cmd,
2324 "bgp default ipv4-unicast",
2325 "BGP specific commands\n"
2326 "Configure BGP defaults\n"
2327 "Activate ipv4-unicast for a peer by default\n")
2328 {
2329 VTY_DECLVAR_CONTEXT(bgp, bgp);
2330 bgp_flag_unset(bgp, BGP_FLAG_NO_DEFAULT_IPV4);
2331 return CMD_SUCCESS;
2332 }
2333
2334 /* Display hostname in certain command outputs */
2335 DEFUN (bgp_default_show_hostname,
2336 bgp_default_show_hostname_cmd,
2337 "bgp default show-hostname",
2338 "BGP specific commands\n"
2339 "Configure BGP defaults\n"
2340 "Show hostname in certain command outputs\n")
2341 {
2342 VTY_DECLVAR_CONTEXT(bgp, bgp);
2343 bgp_flag_set(bgp, BGP_FLAG_SHOW_HOSTNAME);
2344 return CMD_SUCCESS;
2345 }
2346
2347 DEFUN (no_bgp_default_show_hostname,
2348 no_bgp_default_show_hostname_cmd,
2349 "no bgp default show-hostname",
2350 NO_STR
2351 "BGP specific commands\n"
2352 "Configure BGP defaults\n"
2353 "Show hostname in certain command outputs\n")
2354 {
2355 VTY_DECLVAR_CONTEXT(bgp, bgp);
2356 bgp_flag_unset(bgp, BGP_FLAG_SHOW_HOSTNAME);
2357 return CMD_SUCCESS;
2358 }
2359
2360 /* "bgp network import-check" configuration. */
2361 DEFUN (bgp_network_import_check,
2362 bgp_network_import_check_cmd,
2363 "bgp network import-check",
2364 "BGP specific commands\n"
2365 "BGP network command\n"
2366 "Check BGP network route exists in IGP\n")
2367 {
2368 VTY_DECLVAR_CONTEXT(bgp, bgp);
2369 if (!bgp_flag_check(bgp, BGP_FLAG_IMPORT_CHECK)) {
2370 bgp_flag_set(bgp, BGP_FLAG_IMPORT_CHECK);
2371 bgp_static_redo_import_check(bgp);
2372 }
2373
2374 return CMD_SUCCESS;
2375 }
2376
2377 ALIAS_HIDDEN(bgp_network_import_check, bgp_network_import_check_exact_cmd,
2378 "bgp network import-check exact",
2379 "BGP specific commands\n"
2380 "BGP network command\n"
2381 "Check BGP network route exists in IGP\n"
2382 "Match route precisely\n")
2383
2384 DEFUN (no_bgp_network_import_check,
2385 no_bgp_network_import_check_cmd,
2386 "no bgp network import-check",
2387 NO_STR
2388 "BGP specific commands\n"
2389 "BGP network command\n"
2390 "Check BGP network route exists in IGP\n")
2391 {
2392 VTY_DECLVAR_CONTEXT(bgp, bgp);
2393 if (bgp_flag_check(bgp, BGP_FLAG_IMPORT_CHECK)) {
2394 bgp_flag_unset(bgp, BGP_FLAG_IMPORT_CHECK);
2395 bgp_static_redo_import_check(bgp);
2396 }
2397
2398 return CMD_SUCCESS;
2399 }
2400
2401 DEFUN (bgp_default_local_preference,
2402 bgp_default_local_preference_cmd,
2403 "bgp default local-preference (0-4294967295)",
2404 "BGP specific commands\n"
2405 "Configure BGP defaults\n"
2406 "local preference (higher=more preferred)\n"
2407 "Configure default local preference value\n")
2408 {
2409 VTY_DECLVAR_CONTEXT(bgp, bgp);
2410 int idx_number = 3;
2411 uint32_t local_pref;
2412
2413 local_pref = strtoul(argv[idx_number]->arg, NULL, 10);
2414
2415 bgp_default_local_preference_set(bgp, local_pref);
2416 bgp_clear_star_soft_in(vty, bgp->name);
2417
2418 return CMD_SUCCESS;
2419 }
2420
2421 DEFUN (no_bgp_default_local_preference,
2422 no_bgp_default_local_preference_cmd,
2423 "no bgp default local-preference [(0-4294967295)]",
2424 NO_STR
2425 "BGP specific commands\n"
2426 "Configure BGP defaults\n"
2427 "local preference (higher=more preferred)\n"
2428 "Configure default local preference value\n")
2429 {
2430 VTY_DECLVAR_CONTEXT(bgp, bgp);
2431 bgp_default_local_preference_unset(bgp);
2432 bgp_clear_star_soft_in(vty, bgp->name);
2433
2434 return CMD_SUCCESS;
2435 }
2436
2437
2438 DEFUN (bgp_default_subgroup_pkt_queue_max,
2439 bgp_default_subgroup_pkt_queue_max_cmd,
2440 "bgp default subgroup-pkt-queue-max (20-100)",
2441 "BGP specific commands\n"
2442 "Configure BGP defaults\n"
2443 "subgroup-pkt-queue-max\n"
2444 "Configure subgroup packet queue max\n")
2445 {
2446 VTY_DECLVAR_CONTEXT(bgp, bgp);
2447 int idx_number = 3;
2448 uint32_t max_size;
2449
2450 max_size = strtoul(argv[idx_number]->arg, NULL, 10);
2451
2452 bgp_default_subgroup_pkt_queue_max_set(bgp, max_size);
2453
2454 return CMD_SUCCESS;
2455 }
2456
2457 DEFUN (no_bgp_default_subgroup_pkt_queue_max,
2458 no_bgp_default_subgroup_pkt_queue_max_cmd,
2459 "no bgp default subgroup-pkt-queue-max [(20-100)]",
2460 NO_STR
2461 "BGP specific commands\n"
2462 "Configure BGP defaults\n"
2463 "subgroup-pkt-queue-max\n"
2464 "Configure subgroup packet queue max\n")
2465 {
2466 VTY_DECLVAR_CONTEXT(bgp, bgp);
2467 bgp_default_subgroup_pkt_queue_max_unset(bgp);
2468 return CMD_SUCCESS;
2469 }
2470
2471
2472 DEFUN (bgp_rr_allow_outbound_policy,
2473 bgp_rr_allow_outbound_policy_cmd,
2474 "bgp route-reflector allow-outbound-policy",
2475 "BGP specific commands\n"
2476 "Allow modifications made by out route-map\n"
2477 "on ibgp neighbors\n")
2478 {
2479 VTY_DECLVAR_CONTEXT(bgp, bgp);
2480
2481 if (!bgp_flag_check(bgp, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY)) {
2482 bgp_flag_set(bgp, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY);
2483 update_group_announce_rrclients(bgp);
2484 bgp_clear_star_soft_out(vty, bgp->name);
2485 }
2486
2487 return CMD_SUCCESS;
2488 }
2489
2490 DEFUN (no_bgp_rr_allow_outbound_policy,
2491 no_bgp_rr_allow_outbound_policy_cmd,
2492 "no bgp route-reflector allow-outbound-policy",
2493 NO_STR
2494 "BGP specific commands\n"
2495 "Allow modifications made by out route-map\n"
2496 "on ibgp neighbors\n")
2497 {
2498 VTY_DECLVAR_CONTEXT(bgp, bgp);
2499
2500 if (bgp_flag_check(bgp, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY)) {
2501 bgp_flag_unset(bgp, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY);
2502 update_group_announce_rrclients(bgp);
2503 bgp_clear_star_soft_out(vty, bgp->name);
2504 }
2505
2506 return CMD_SUCCESS;
2507 }
2508
2509 DEFUN (bgp_listen_limit,
2510 bgp_listen_limit_cmd,
2511 "bgp listen limit (1-5000)",
2512 "BGP specific commands\n"
2513 "Configure BGP defaults\n"
2514 "maximum number of BGP Dynamic Neighbors that can be created\n"
2515 "Configure Dynamic Neighbors listen limit value\n")
2516 {
2517 VTY_DECLVAR_CONTEXT(bgp, bgp);
2518 int idx_number = 3;
2519 int listen_limit;
2520
2521 listen_limit = strtoul(argv[idx_number]->arg, NULL, 10);
2522
2523 bgp_listen_limit_set(bgp, listen_limit);
2524
2525 return CMD_SUCCESS;
2526 }
2527
2528 DEFUN (no_bgp_listen_limit,
2529 no_bgp_listen_limit_cmd,
2530 "no bgp listen limit [(1-5000)]",
2531 "BGP specific commands\n"
2532 "Configure BGP defaults\n"
2533 "unset maximum number of BGP Dynamic Neighbors that can be created\n"
2534 "Configure Dynamic Neighbors listen limit value to default\n"
2535 "Configure Dynamic Neighbors listen limit value\n")
2536 {
2537 VTY_DECLVAR_CONTEXT(bgp, bgp);
2538 bgp_listen_limit_unset(bgp);
2539 return CMD_SUCCESS;
2540 }
2541
2542
2543 /*
2544 * Check if this listen range is already configured. Check for exact
2545 * match or overlap based on input.
2546 */
2547 static struct peer_group *listen_range_exists(struct bgp *bgp,
2548 struct prefix *range, int exact)
2549 {
2550 struct listnode *node, *nnode;
2551 struct listnode *node1, *nnode1;
2552 struct peer_group *group;
2553 struct prefix *lr;
2554 afi_t afi;
2555 int match;
2556
2557 afi = family2afi(range->family);
2558 for (ALL_LIST_ELEMENTS(bgp->group, node, nnode, group)) {
2559 for (ALL_LIST_ELEMENTS(group->listen_range[afi], node1, nnode1,
2560 lr)) {
2561 if (exact)
2562 match = prefix_same(range, lr);
2563 else
2564 match = (prefix_match(range, lr)
2565 || prefix_match(lr, range));
2566 if (match)
2567 return group;
2568 }
2569 }
2570
2571 return NULL;
2572 }
2573
2574 DEFUN (bgp_listen_range,
2575 bgp_listen_range_cmd,
2576 "bgp listen range <A.B.C.D/M|X:X::X:X/M> peer-group PGNAME",
2577 "BGP specific commands\n"
2578 "Configure BGP dynamic neighbors listen range\n"
2579 "Configure BGP dynamic neighbors listen range\n"
2580 NEIGHBOR_ADDR_STR
2581 "Member of the peer-group\n"
2582 "Peer-group name\n")
2583 {
2584 VTY_DECLVAR_CONTEXT(bgp, bgp);
2585 struct prefix range;
2586 struct peer_group *group, *existing_group;
2587 afi_t afi;
2588 int ret;
2589 int idx = 0;
2590
2591 argv_find(argv, argc, "A.B.C.D/M", &idx);
2592 argv_find(argv, argc, "X:X::X:X/M", &idx);
2593 char *prefix = argv[idx]->arg;
2594 argv_find(argv, argc, "PGNAME", &idx);
2595 char *peergroup = argv[idx]->arg;
2596
2597 /* Convert IP prefix string to struct prefix. */
2598 ret = str2prefix(prefix, &range);
2599 if (!ret) {
2600 vty_out(vty, "%% Malformed listen range\n");
2601 return CMD_WARNING_CONFIG_FAILED;
2602 }
2603
2604 afi = family2afi(range.family);
2605
2606 if (afi == AFI_IP6 && IN6_IS_ADDR_LINKLOCAL(&range.u.prefix6)) {
2607 vty_out(vty,
2608 "%% Malformed listen range (link-local address)\n");
2609 return CMD_WARNING_CONFIG_FAILED;
2610 }
2611
2612 apply_mask(&range);
2613
2614 /* Check if same listen range is already configured. */
2615 existing_group = listen_range_exists(bgp, &range, 1);
2616 if (existing_group) {
2617 if (strcmp(existing_group->name, peergroup) == 0)
2618 return CMD_SUCCESS;
2619 else {
2620 vty_out(vty,
2621 "%% Same listen range is attached to peer-group %s\n",
2622 existing_group->name);
2623 return CMD_WARNING_CONFIG_FAILED;
2624 }
2625 }
2626
2627 /* Check if an overlapping listen range exists. */
2628 if (listen_range_exists(bgp, &range, 0)) {
2629 vty_out(vty,
2630 "%% Listen range overlaps with existing listen range\n");
2631 return CMD_WARNING_CONFIG_FAILED;
2632 }
2633
2634 group = peer_group_lookup(bgp, peergroup);
2635 if (!group) {
2636 vty_out(vty, "%% Configure the peer-group first\n");
2637 return CMD_WARNING_CONFIG_FAILED;
2638 }
2639
2640 ret = peer_group_listen_range_add(group, &range);
2641 return bgp_vty_return(vty, ret);
2642 }
2643
2644 DEFUN (no_bgp_listen_range,
2645 no_bgp_listen_range_cmd,
2646 "no bgp listen range <A.B.C.D/M|X:X::X:X/M> peer-group PGNAME",
2647 NO_STR
2648 "BGP specific commands\n"
2649 "Unconfigure BGP dynamic neighbors listen range\n"
2650 "Unconfigure BGP dynamic neighbors listen range\n"
2651 NEIGHBOR_ADDR_STR
2652 "Member of the peer-group\n"
2653 "Peer-group name\n")
2654 {
2655 VTY_DECLVAR_CONTEXT(bgp, bgp);
2656 struct prefix range;
2657 struct peer_group *group;
2658 afi_t afi;
2659 int ret;
2660 int idx = 0;
2661
2662 argv_find(argv, argc, "A.B.C.D/M", &idx);
2663 argv_find(argv, argc, "X:X::X:X/M", &idx);
2664 char *prefix = argv[idx]->arg;
2665 argv_find(argv, argc, "WORD", &idx);
2666 char *peergroup = argv[idx]->arg;
2667
2668 /* Convert IP prefix string to struct prefix. */
2669 ret = str2prefix(prefix, &range);
2670 if (!ret) {
2671 vty_out(vty, "%% Malformed listen range\n");
2672 return CMD_WARNING_CONFIG_FAILED;
2673 }
2674
2675 afi = family2afi(range.family);
2676
2677 if (afi == AFI_IP6 && IN6_IS_ADDR_LINKLOCAL(&range.u.prefix6)) {
2678 vty_out(vty,
2679 "%% Malformed listen range (link-local address)\n");
2680 return CMD_WARNING_CONFIG_FAILED;
2681 }
2682
2683 apply_mask(&range);
2684
2685 group = peer_group_lookup(bgp, peergroup);
2686 if (!group) {
2687 vty_out(vty, "%% Peer-group does not exist\n");
2688 return CMD_WARNING_CONFIG_FAILED;
2689 }
2690
2691 ret = peer_group_listen_range_del(group, &range);
2692 return bgp_vty_return(vty, ret);
2693 }
2694
2695 void bgp_config_write_listen(struct vty *vty, struct bgp *bgp)
2696 {
2697 struct peer_group *group;
2698 struct listnode *node, *nnode, *rnode, *nrnode;
2699 struct prefix *range;
2700 afi_t afi;
2701 char buf[PREFIX2STR_BUFFER];
2702
2703 if (bgp->dynamic_neighbors_limit != BGP_DYNAMIC_NEIGHBORS_LIMIT_DEFAULT)
2704 vty_out(vty, " bgp listen limit %d\n",
2705 bgp->dynamic_neighbors_limit);
2706
2707 for (ALL_LIST_ELEMENTS(bgp->group, node, nnode, group)) {
2708 for (afi = AFI_IP; afi < AFI_MAX; afi++) {
2709 for (ALL_LIST_ELEMENTS(group->listen_range[afi], rnode,
2710 nrnode, range)) {
2711 prefix2str(range, buf, sizeof(buf));
2712 vty_out(vty,
2713 " bgp listen range %s peer-group %s\n",
2714 buf, group->name);
2715 }
2716 }
2717 }
2718 }
2719
2720
2721 DEFUN (bgp_disable_connected_route_check,
2722 bgp_disable_connected_route_check_cmd,
2723 "bgp disable-ebgp-connected-route-check",
2724 "BGP specific commands\n"
2725 "Disable checking if nexthop is connected on ebgp sessions\n")
2726 {
2727 VTY_DECLVAR_CONTEXT(bgp, bgp);
2728 bgp_flag_set(bgp, BGP_FLAG_DISABLE_NH_CONNECTED_CHK);
2729 bgp_clear_star_soft_in(vty, bgp->name);
2730
2731 return CMD_SUCCESS;
2732 }
2733
2734 DEFUN (no_bgp_disable_connected_route_check,
2735 no_bgp_disable_connected_route_check_cmd,
2736 "no bgp disable-ebgp-connected-route-check",
2737 NO_STR
2738 "BGP specific commands\n"
2739 "Disable checking if nexthop is connected on ebgp sessions\n")
2740 {
2741 VTY_DECLVAR_CONTEXT(bgp, bgp);
2742 bgp_flag_unset(bgp, BGP_FLAG_DISABLE_NH_CONNECTED_CHK);
2743 bgp_clear_star_soft_in(vty, bgp->name);
2744
2745 return CMD_SUCCESS;
2746 }
2747
2748
2749 static int peer_remote_as_vty(struct vty *vty, const char *peer_str,
2750 const char *as_str, afi_t afi, safi_t safi)
2751 {
2752 VTY_DECLVAR_CONTEXT(bgp, bgp);
2753 int ret;
2754 as_t as;
2755 int as_type = AS_SPECIFIED;
2756 union sockunion su;
2757
2758 if (as_str[0] == 'i') {
2759 as = 0;
2760 as_type = AS_INTERNAL;
2761 } else if (as_str[0] == 'e') {
2762 as = 0;
2763 as_type = AS_EXTERNAL;
2764 } else {
2765 /* Get AS number. */
2766 as = strtoul(as_str, NULL, 10);
2767 }
2768
2769 /* If peer is peer group or interface peer, call proper function. */
2770 ret = str2sockunion(peer_str, &su);
2771 if (ret < 0) {
2772 struct peer *peer;
2773
2774 /* Check if existing interface peer */
2775 peer = peer_lookup_by_conf_if(bgp, peer_str);
2776
2777 ret = peer_remote_as(bgp, NULL, peer_str, &as, as_type, afi,
2778 safi);
2779
2780 /* if not interface peer, check peer-group settings */
2781 if (ret < 0 && !peer) {
2782 ret = peer_group_remote_as(bgp, peer_str, &as, as_type);
2783 if (ret < 0) {
2784 vty_out(vty,
2785 "%% Create the peer-group or interface first\n");
2786 return CMD_WARNING_CONFIG_FAILED;
2787 }
2788 return CMD_SUCCESS;
2789 }
2790 } else {
2791 if (peer_address_self_check(bgp, &su)) {
2792 vty_out(vty,
2793 "%% Can not configure the local system as neighbor\n");
2794 return CMD_WARNING_CONFIG_FAILED;
2795 }
2796 ret = peer_remote_as(bgp, &su, NULL, &as, as_type, afi, safi);
2797 }
2798
2799 /* This peer belongs to peer group. */
2800 switch (ret) {
2801 case BGP_ERR_PEER_GROUP_MEMBER:
2802 vty_out(vty,
2803 "%% Peer-group member cannot override remote-as of peer-group\n");
2804 return CMD_WARNING_CONFIG_FAILED;
2805 case BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT:
2806 vty_out(vty,
2807 "%% Peer-group members must be all internal or all external\n");
2808 return CMD_WARNING_CONFIG_FAILED;
2809 }
2810 return bgp_vty_return(vty, ret);
2811 }
2812
2813 DEFUN (bgp_default_shutdown,
2814 bgp_default_shutdown_cmd,
2815 "[no] bgp default shutdown",
2816 NO_STR
2817 BGP_STR
2818 "Configure BGP defaults\n"
2819 "Apply administrative shutdown to newly configured peers\n")
2820 {
2821 VTY_DECLVAR_CONTEXT(bgp, bgp);
2822 bgp->autoshutdown = !strmatch(argv[0]->text, "no");
2823 return CMD_SUCCESS;
2824 }
2825
2826 DEFUN (neighbor_remote_as,
2827 neighbor_remote_as_cmd,
2828 "neighbor <A.B.C.D|X:X::X:X|WORD> remote-as <(1-4294967295)|internal|external>",
2829 NEIGHBOR_STR
2830 NEIGHBOR_ADDR_STR2
2831 "Specify a BGP neighbor\n"
2832 AS_STR
2833 "Internal BGP peer\n"
2834 "External BGP peer\n")
2835 {
2836 int idx_peer = 1;
2837 int idx_remote_as = 3;
2838 return peer_remote_as_vty(vty, argv[idx_peer]->arg,
2839 argv[idx_remote_as]->arg, AFI_IP,
2840 SAFI_UNICAST);
2841 }
2842
2843 static int peer_conf_interface_get(struct vty *vty, const char *conf_if,
2844 afi_t afi, safi_t safi, int v6only,
2845 const char *peer_group_name,
2846 const char *as_str)
2847 {
2848 VTY_DECLVAR_CONTEXT(bgp, bgp);
2849 as_t as = 0;
2850 int as_type = AS_UNSPECIFIED;
2851 struct peer *peer;
2852 struct peer_group *group;
2853 int ret = 0;
2854 union sockunion su;
2855
2856 group = peer_group_lookup(bgp, conf_if);
2857
2858 if (group) {
2859 vty_out(vty, "%% Name conflict with peer-group \n");
2860 return CMD_WARNING_CONFIG_FAILED;
2861 }
2862
2863 if (as_str) {
2864 if (as_str[0] == 'i') {
2865 as_type = AS_INTERNAL;
2866 } else if (as_str[0] == 'e') {
2867 as_type = AS_EXTERNAL;
2868 } else {
2869 /* Get AS number. */
2870 as = strtoul(as_str, NULL, 10);
2871 as_type = AS_SPECIFIED;
2872 }
2873 }
2874
2875 peer = peer_lookup_by_conf_if(bgp, conf_if);
2876 if (peer) {
2877 if (as_str)
2878 ret = peer_remote_as(bgp, NULL, conf_if, &as, as_type,
2879 afi, safi);
2880 } else {
2881 if (bgp_flag_check(bgp, BGP_FLAG_NO_DEFAULT_IPV4)
2882 && afi == AFI_IP && safi == SAFI_UNICAST)
2883 peer = peer_create(NULL, conf_if, bgp, bgp->as, as,
2884 as_type, 0, 0, NULL);
2885 else
2886 peer = peer_create(NULL, conf_if, bgp, bgp->as, as,
2887 as_type, afi, safi, NULL);
2888
2889 if (!peer) {
2890 vty_out(vty, "%% BGP failed to create peer\n");
2891 return CMD_WARNING_CONFIG_FAILED;
2892 }
2893
2894 if (v6only)
2895 peer_flag_set(peer, PEER_FLAG_IFPEER_V6ONLY);
2896
2897 /* Request zebra to initiate IPv6 RAs on this interface. We do
2898 * this
2899 * any unnumbered peer in order to not worry about run-time
2900 * transitions
2901 * (e.g., peering is initially IPv4, but the IPv4 /30 or /31
2902 * address
2903 * gets deleted later etc.)
2904 */
2905 if (peer->ifp)
2906 bgp_zebra_initiate_radv(bgp, peer);
2907 }
2908
2909 if ((v6only && !CHECK_FLAG(peer->flags, PEER_FLAG_IFPEER_V6ONLY))
2910 || (!v6only && CHECK_FLAG(peer->flags, PEER_FLAG_IFPEER_V6ONLY))) {
2911 if (v6only)
2912 peer_flag_set(peer, PEER_FLAG_IFPEER_V6ONLY);
2913 else
2914 peer_flag_unset(peer, PEER_FLAG_IFPEER_V6ONLY);
2915
2916 /* v6only flag changed. Reset bgp seesion */
2917 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status)) {
2918 peer->last_reset = PEER_DOWN_V6ONLY_CHANGE;
2919 bgp_notify_send(peer, BGP_NOTIFY_CEASE,
2920 BGP_NOTIFY_CEASE_CONFIG_CHANGE);
2921 } else
2922 bgp_session_reset(peer);
2923 }
2924
2925 if (!CHECK_FLAG(peer->flags_invert, PEER_FLAG_CAPABILITY_ENHE)) {
2926 SET_FLAG(peer->flags, PEER_FLAG_CAPABILITY_ENHE);
2927 SET_FLAG(peer->flags_invert, PEER_FLAG_CAPABILITY_ENHE);
2928 SET_FLAG(peer->flags_override, PEER_FLAG_CAPABILITY_ENHE);
2929 }
2930
2931 if (peer_group_name) {
2932 group = peer_group_lookup(bgp, peer_group_name);
2933 if (!group) {
2934 vty_out(vty, "%% Configure the peer-group first\n");
2935 return CMD_WARNING_CONFIG_FAILED;
2936 }
2937
2938 ret = peer_group_bind(bgp, &su, peer, group, &as);
2939 }
2940
2941 return bgp_vty_return(vty, ret);
2942 }
2943
2944 DEFUN (neighbor_interface_config,
2945 neighbor_interface_config_cmd,
2946 "neighbor WORD interface [peer-group PGNAME]",
2947 NEIGHBOR_STR
2948 "Interface name or neighbor tag\n"
2949 "Enable BGP on interface\n"
2950 "Member of the peer-group\n"
2951 "Peer-group name\n")
2952 {
2953 int idx_word = 1;
2954 int idx_peer_group_word = 4;
2955
2956 if (argc > idx_peer_group_word)
2957 return peer_conf_interface_get(
2958 vty, argv[idx_word]->arg, AFI_IP, SAFI_UNICAST, 0,
2959 argv[idx_peer_group_word]->arg, NULL);
2960 else
2961 return peer_conf_interface_get(vty, argv[idx_word]->arg, AFI_IP,
2962 SAFI_UNICAST, 0, NULL, NULL);
2963 }
2964
2965 DEFUN (neighbor_interface_config_v6only,
2966 neighbor_interface_config_v6only_cmd,
2967 "neighbor WORD interface v6only [peer-group PGNAME]",
2968 NEIGHBOR_STR
2969 "Interface name or neighbor tag\n"
2970 "Enable BGP on interface\n"
2971 "Enable BGP with v6 link-local only\n"
2972 "Member of the peer-group\n"
2973 "Peer-group name\n")
2974 {
2975 int idx_word = 1;
2976 int idx_peer_group_word = 5;
2977
2978 if (argc > idx_peer_group_word)
2979 return peer_conf_interface_get(
2980 vty, argv[idx_word]->arg, AFI_IP, SAFI_UNICAST, 1,
2981 argv[idx_peer_group_word]->arg, NULL);
2982
2983 return peer_conf_interface_get(vty, argv[idx_word]->arg, AFI_IP,
2984 SAFI_UNICAST, 1, NULL, NULL);
2985 }
2986
2987
2988 DEFUN (neighbor_interface_config_remote_as,
2989 neighbor_interface_config_remote_as_cmd,
2990 "neighbor WORD interface remote-as <(1-4294967295)|internal|external>",
2991 NEIGHBOR_STR
2992 "Interface name or neighbor tag\n"
2993 "Enable BGP on interface\n"
2994 "Specify a BGP neighbor\n"
2995 AS_STR
2996 "Internal BGP peer\n"
2997 "External BGP peer\n")
2998 {
2999 int idx_word = 1;
3000 int idx_remote_as = 4;
3001 return peer_conf_interface_get(vty, argv[idx_word]->arg, AFI_IP,
3002 SAFI_UNICAST, 0, NULL,
3003 argv[idx_remote_as]->arg);
3004 }
3005
3006 DEFUN (neighbor_interface_v6only_config_remote_as,
3007 neighbor_interface_v6only_config_remote_as_cmd,
3008 "neighbor WORD interface v6only remote-as <(1-4294967295)|internal|external>",
3009 NEIGHBOR_STR
3010 "Interface name or neighbor tag\n"
3011 "Enable BGP with v6 link-local only\n"
3012 "Enable BGP on interface\n"
3013 "Specify a BGP neighbor\n"
3014 AS_STR
3015 "Internal BGP peer\n"
3016 "External BGP peer\n")
3017 {
3018 int idx_word = 1;
3019 int idx_remote_as = 5;
3020 return peer_conf_interface_get(vty, argv[idx_word]->arg, AFI_IP,
3021 SAFI_UNICAST, 1, NULL,
3022 argv[idx_remote_as]->arg);
3023 }
3024
3025 DEFUN (neighbor_peer_group,
3026 neighbor_peer_group_cmd,
3027 "neighbor WORD peer-group",
3028 NEIGHBOR_STR
3029 "Interface name or neighbor tag\n"
3030 "Configure peer-group\n")
3031 {
3032 VTY_DECLVAR_CONTEXT(bgp, bgp);
3033 int idx_word = 1;
3034 struct peer *peer;
3035 struct peer_group *group;
3036
3037 peer = peer_lookup_by_conf_if(bgp, argv[idx_word]->arg);
3038 if (peer) {
3039 vty_out(vty, "%% Name conflict with interface: \n");
3040 return CMD_WARNING_CONFIG_FAILED;
3041 }
3042
3043 group = peer_group_get(bgp, argv[idx_word]->arg);
3044 if (!group) {
3045 vty_out(vty, "%% BGP failed to find or create peer-group\n");
3046 return CMD_WARNING_CONFIG_FAILED;
3047 }
3048
3049 return CMD_SUCCESS;
3050 }
3051
3052 DEFUN (no_neighbor,
3053 no_neighbor_cmd,
3054 "no neighbor <WORD|<A.B.C.D|X:X::X:X> [remote-as <(1-4294967295)|internal|external>]>",
3055 NO_STR
3056 NEIGHBOR_STR
3057 NEIGHBOR_ADDR_STR2
3058 "Specify a BGP neighbor\n"
3059 AS_STR
3060 "Internal BGP peer\n"
3061 "External BGP peer\n")
3062 {
3063 VTY_DECLVAR_CONTEXT(bgp, bgp);
3064 int idx_peer = 2;
3065 int ret;
3066 union sockunion su;
3067 struct peer_group *group;
3068 struct peer *peer;
3069 struct peer *other;
3070
3071 ret = str2sockunion(argv[idx_peer]->arg, &su);
3072 if (ret < 0) {
3073 /* look up for neighbor by interface name config. */
3074 peer = peer_lookup_by_conf_if(bgp, argv[idx_peer]->arg);
3075 if (peer) {
3076 /* Request zebra to terminate IPv6 RAs on this
3077 * interface. */
3078 if (peer->ifp)
3079 bgp_zebra_terminate_radv(peer->bgp, peer);
3080 peer_delete(peer);
3081 return CMD_SUCCESS;
3082 }
3083
3084 group = peer_group_lookup(bgp, argv[idx_peer]->arg);
3085 if (group)
3086 peer_group_delete(group);
3087 else {
3088 vty_out(vty, "%% Create the peer-group first\n");
3089 return CMD_WARNING_CONFIG_FAILED;
3090 }
3091 } else {
3092 peer = peer_lookup(bgp, &su);
3093 if (peer) {
3094 if (peer_dynamic_neighbor(peer)) {
3095 vty_out(vty,
3096 "%% Operation not allowed on a dynamic neighbor\n");
3097 return CMD_WARNING_CONFIG_FAILED;
3098 }
3099
3100 other = peer->doppelganger;
3101 peer_delete(peer);
3102 if (other && other->status != Deleted)
3103 peer_delete(other);
3104 }
3105 }
3106
3107 return CMD_SUCCESS;
3108 }
3109
3110 DEFUN (no_neighbor_interface_config,
3111 no_neighbor_interface_config_cmd,
3112 "no neighbor WORD interface [v6only] [peer-group PGNAME] [remote-as <(1-4294967295)|internal|external>]",
3113 NO_STR
3114 NEIGHBOR_STR
3115 "Interface name\n"
3116 "Configure BGP on interface\n"
3117 "Enable BGP with v6 link-local only\n"
3118 "Member of the peer-group\n"
3119 "Peer-group name\n"
3120 "Specify a BGP neighbor\n"
3121 AS_STR
3122 "Internal BGP peer\n"
3123 "External BGP peer\n")
3124 {
3125 VTY_DECLVAR_CONTEXT(bgp, bgp);
3126 int idx_word = 2;
3127 struct peer *peer;
3128
3129 /* look up for neighbor by interface name config. */
3130 peer = peer_lookup_by_conf_if(bgp, argv[idx_word]->arg);
3131 if (peer) {
3132 /* Request zebra to terminate IPv6 RAs on this interface. */
3133 if (peer->ifp)
3134 bgp_zebra_terminate_radv(peer->bgp, peer);
3135 peer_delete(peer);
3136 } else {
3137 vty_out(vty, "%% Create the bgp interface first\n");
3138 return CMD_WARNING_CONFIG_FAILED;
3139 }
3140 return CMD_SUCCESS;
3141 }
3142
3143 DEFUN (no_neighbor_peer_group,
3144 no_neighbor_peer_group_cmd,
3145 "no neighbor WORD peer-group",
3146 NO_STR
3147 NEIGHBOR_STR
3148 "Neighbor tag\n"
3149 "Configure peer-group\n")
3150 {
3151 VTY_DECLVAR_CONTEXT(bgp, bgp);
3152 int idx_word = 2;
3153 struct peer_group *group;
3154
3155 group = peer_group_lookup(bgp, argv[idx_word]->arg);
3156 if (group)
3157 peer_group_delete(group);
3158 else {
3159 vty_out(vty, "%% Create the peer-group first\n");
3160 return CMD_WARNING_CONFIG_FAILED;
3161 }
3162 return CMD_SUCCESS;
3163 }
3164
3165 DEFUN (no_neighbor_interface_peer_group_remote_as,
3166 no_neighbor_interface_peer_group_remote_as_cmd,
3167 "no neighbor WORD remote-as <(1-4294967295)|internal|external>",
3168 NO_STR
3169 NEIGHBOR_STR
3170 "Interface name or neighbor tag\n"
3171 "Specify a BGP neighbor\n"
3172 AS_STR
3173 "Internal BGP peer\n"
3174 "External BGP peer\n")
3175 {
3176 VTY_DECLVAR_CONTEXT(bgp, bgp);
3177 int idx_word = 2;
3178 struct peer_group *group;
3179 struct peer *peer;
3180
3181 /* look up for neighbor by interface name config. */
3182 peer = peer_lookup_by_conf_if(bgp, argv[idx_word]->arg);
3183 if (peer) {
3184 peer_as_change(peer, 0, AS_UNSPECIFIED);
3185 return CMD_SUCCESS;
3186 }
3187
3188 group = peer_group_lookup(bgp, argv[idx_word]->arg);
3189 if (group)
3190 peer_group_remote_as_delete(group);
3191 else {
3192 vty_out(vty, "%% Create the peer-group or interface first\n");
3193 return CMD_WARNING_CONFIG_FAILED;
3194 }
3195 return CMD_SUCCESS;
3196 }
3197
3198 DEFUN (neighbor_local_as,
3199 neighbor_local_as_cmd,
3200 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295)",
3201 NEIGHBOR_STR
3202 NEIGHBOR_ADDR_STR2
3203 "Specify a local-as number\n"
3204 "AS number used as local AS\n")
3205 {
3206 int idx_peer = 1;
3207 int idx_number = 3;
3208 struct peer *peer;
3209 int ret;
3210 as_t as;
3211
3212 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
3213 if (!peer)
3214 return CMD_WARNING_CONFIG_FAILED;
3215
3216 as = strtoul(argv[idx_number]->arg, NULL, 10);
3217 ret = peer_local_as_set(peer, as, 0, 0);
3218 return bgp_vty_return(vty, ret);
3219 }
3220
3221 DEFUN (neighbor_local_as_no_prepend,
3222 neighbor_local_as_no_prepend_cmd,
3223 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295) no-prepend",
3224 NEIGHBOR_STR
3225 NEIGHBOR_ADDR_STR2
3226 "Specify a local-as number\n"
3227 "AS number used as local AS\n"
3228 "Do not prepend local-as to updates from ebgp peers\n")
3229 {
3230 int idx_peer = 1;
3231 int idx_number = 3;
3232 struct peer *peer;
3233 int ret;
3234 as_t as;
3235
3236 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
3237 if (!peer)
3238 return CMD_WARNING_CONFIG_FAILED;
3239
3240 as = strtoul(argv[idx_number]->arg, NULL, 10);
3241 ret = peer_local_as_set(peer, as, 1, 0);
3242 return bgp_vty_return(vty, ret);
3243 }
3244
3245 DEFUN (neighbor_local_as_no_prepend_replace_as,
3246 neighbor_local_as_no_prepend_replace_as_cmd,
3247 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295) no-prepend replace-as",
3248 NEIGHBOR_STR
3249 NEIGHBOR_ADDR_STR2
3250 "Specify a local-as number\n"
3251 "AS number used as local AS\n"
3252 "Do not prepend local-as to updates from ebgp peers\n"
3253 "Do not prepend local-as to updates from ibgp peers\n")
3254 {
3255 int idx_peer = 1;
3256 int idx_number = 3;
3257 struct peer *peer;
3258 int ret;
3259 as_t as;
3260
3261 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
3262 if (!peer)
3263 return CMD_WARNING_CONFIG_FAILED;
3264
3265 as = strtoul(argv[idx_number]->arg, NULL, 10);
3266 ret = peer_local_as_set(peer, as, 1, 1);
3267 return bgp_vty_return(vty, ret);
3268 }
3269
3270 DEFUN (no_neighbor_local_as,
3271 no_neighbor_local_as_cmd,
3272 "no neighbor <A.B.C.D|X:X::X:X|WORD> local-as [(1-4294967295) [no-prepend [replace-as]]]",
3273 NO_STR
3274 NEIGHBOR_STR
3275 NEIGHBOR_ADDR_STR2
3276 "Specify a local-as number\n"
3277 "AS number used as local AS\n"
3278 "Do not prepend local-as to updates from ebgp peers\n"
3279 "Do not prepend local-as to updates from ibgp peers\n")
3280 {
3281 int idx_peer = 2;
3282 struct peer *peer;
3283 int ret;
3284
3285 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
3286 if (!peer)
3287 return CMD_WARNING_CONFIG_FAILED;
3288
3289 ret = peer_local_as_unset(peer);
3290 return bgp_vty_return(vty, ret);
3291 }
3292
3293
3294 DEFUN (neighbor_solo,
3295 neighbor_solo_cmd,
3296 "neighbor <A.B.C.D|X:X::X:X|WORD> solo",
3297 NEIGHBOR_STR
3298 NEIGHBOR_ADDR_STR2
3299 "Solo peer - part of its own update group\n")
3300 {
3301 int idx_peer = 1;
3302 struct peer *peer;
3303 int ret;
3304
3305 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
3306 if (!peer)
3307 return CMD_WARNING_CONFIG_FAILED;
3308
3309 ret = update_group_adjust_soloness(peer, 1);
3310 return bgp_vty_return(vty, ret);
3311 }
3312
3313 DEFUN (no_neighbor_solo,
3314 no_neighbor_solo_cmd,
3315 "no neighbor <A.B.C.D|X:X::X:X|WORD> solo",
3316 NO_STR
3317 NEIGHBOR_STR
3318 NEIGHBOR_ADDR_STR2
3319 "Solo peer - part of its own update group\n")
3320 {
3321 int idx_peer = 2;
3322 struct peer *peer;
3323 int ret;
3324
3325 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
3326 if (!peer)
3327 return CMD_WARNING_CONFIG_FAILED;
3328
3329 ret = update_group_adjust_soloness(peer, 0);
3330 return bgp_vty_return(vty, ret);
3331 }
3332
3333 DEFUN (neighbor_password,
3334 neighbor_password_cmd,
3335 "neighbor <A.B.C.D|X:X::X:X|WORD> password LINE",
3336 NEIGHBOR_STR
3337 NEIGHBOR_ADDR_STR2
3338 "Set a password\n"
3339 "The password\n")
3340 {
3341 int idx_peer = 1;
3342 int idx_line = 3;
3343 struct peer *peer;
3344 int ret;
3345
3346 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
3347 if (!peer)
3348 return CMD_WARNING_CONFIG_FAILED;
3349
3350 ret = peer_password_set(peer, argv[idx_line]->arg);
3351 return bgp_vty_return(vty, ret);
3352 }
3353
3354 DEFUN (no_neighbor_password,
3355 no_neighbor_password_cmd,
3356 "no neighbor <A.B.C.D|X:X::X:X|WORD> password [LINE]",
3357 NO_STR
3358 NEIGHBOR_STR
3359 NEIGHBOR_ADDR_STR2
3360 "Set a password\n"
3361 "The password\n")
3362 {
3363 int idx_peer = 2;
3364 struct peer *peer;
3365 int ret;
3366
3367 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
3368 if (!peer)
3369 return CMD_WARNING_CONFIG_FAILED;
3370
3371 ret = peer_password_unset(peer);
3372 return bgp_vty_return(vty, ret);
3373 }
3374
3375 DEFUN (neighbor_activate,
3376 neighbor_activate_cmd,
3377 "neighbor <A.B.C.D|X:X::X:X|WORD> activate",
3378 NEIGHBOR_STR
3379 NEIGHBOR_ADDR_STR2
3380 "Enable the Address Family for this Neighbor\n")
3381 {
3382 int idx_peer = 1;
3383 int ret;
3384 struct peer *peer;
3385
3386 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
3387 if (!peer)
3388 return CMD_WARNING_CONFIG_FAILED;
3389
3390 ret = peer_activate(peer, bgp_node_afi(vty), bgp_node_safi(vty));
3391 return bgp_vty_return(vty, ret);
3392 }
3393
3394 ALIAS_HIDDEN(neighbor_activate, neighbor_activate_hidden_cmd,
3395 "neighbor <A.B.C.D|X:X::X:X|WORD> activate",
3396 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3397 "Enable the Address Family for this Neighbor\n")
3398
3399 DEFUN (no_neighbor_activate,
3400 no_neighbor_activate_cmd,
3401 "no neighbor <A.B.C.D|X:X::X:X|WORD> activate",
3402 NO_STR
3403 NEIGHBOR_STR
3404 NEIGHBOR_ADDR_STR2
3405 "Enable the Address Family for this Neighbor\n")
3406 {
3407 int idx_peer = 2;
3408 int ret;
3409 struct peer *peer;
3410
3411 /* Lookup peer. */
3412 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
3413 if (!peer)
3414 return CMD_WARNING_CONFIG_FAILED;
3415
3416 ret = peer_deactivate(peer, bgp_node_afi(vty), bgp_node_safi(vty));
3417 return bgp_vty_return(vty, ret);
3418 }
3419
3420 ALIAS_HIDDEN(no_neighbor_activate, no_neighbor_activate_hidden_cmd,
3421 "no neighbor <A.B.C.D|X:X::X:X|WORD> activate",
3422 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3423 "Enable the Address Family for this Neighbor\n")
3424
3425 DEFUN (neighbor_set_peer_group,
3426 neighbor_set_peer_group_cmd,
3427 "neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
3428 NEIGHBOR_STR
3429 NEIGHBOR_ADDR_STR2
3430 "Member of the peer-group\n"
3431 "Peer-group name\n")
3432 {
3433 VTY_DECLVAR_CONTEXT(bgp, bgp);
3434 int idx_peer = 1;
3435 int idx_word = 3;
3436 int ret;
3437 as_t as;
3438 union sockunion su;
3439 struct peer *peer;
3440 struct peer_group *group;
3441
3442 ret = str2sockunion(argv[idx_peer]->arg, &su);
3443 if (ret < 0) {
3444 peer = peer_lookup_by_conf_if(bgp, argv[idx_peer]->arg);
3445 if (!peer) {
3446 vty_out(vty, "%% Malformed address or name: %s\n",
3447 argv[idx_peer]->arg);
3448 return CMD_WARNING_CONFIG_FAILED;
3449 }
3450 } else {
3451 if (peer_address_self_check(bgp, &su)) {
3452 vty_out(vty,
3453 "%% Can not configure the local system as neighbor\n");
3454 return CMD_WARNING_CONFIG_FAILED;
3455 }
3456
3457 /* Disallow for dynamic neighbor. */
3458 peer = peer_lookup(bgp, &su);
3459 if (peer && peer_dynamic_neighbor(peer)) {
3460 vty_out(vty,
3461 "%% Operation not allowed on a dynamic neighbor\n");
3462 return CMD_WARNING_CONFIG_FAILED;
3463 }
3464 }
3465
3466 group = peer_group_lookup(bgp, argv[idx_word]->arg);
3467 if (!group) {
3468 vty_out(vty, "%% Configure the peer-group first\n");
3469 return CMD_WARNING_CONFIG_FAILED;
3470 }
3471
3472 ret = peer_group_bind(bgp, &su, peer, group, &as);
3473
3474 if (ret == BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT) {
3475 vty_out(vty,
3476 "%% Peer with AS %u cannot be in this peer-group, members must be all internal or all external\n",
3477 as);
3478 return CMD_WARNING_CONFIG_FAILED;
3479 }
3480
3481 return bgp_vty_return(vty, ret);
3482 }
3483
3484 ALIAS_HIDDEN(neighbor_set_peer_group, neighbor_set_peer_group_hidden_cmd,
3485 "neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
3486 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3487 "Member of the peer-group\n"
3488 "Peer-group name\n")
3489
3490 DEFUN (no_neighbor_set_peer_group,
3491 no_neighbor_set_peer_group_cmd,
3492 "no neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
3493 NO_STR
3494 NEIGHBOR_STR
3495 NEIGHBOR_ADDR_STR2
3496 "Member of the peer-group\n"
3497 "Peer-group name\n")
3498 {
3499 VTY_DECLVAR_CONTEXT(bgp, bgp);
3500 int idx_peer = 2;
3501 int idx_word = 4;
3502 int ret;
3503 struct peer *peer;
3504 struct peer_group *group;
3505
3506 peer = peer_lookup_vty(vty, argv[idx_peer]->arg);
3507 if (!peer)
3508 return CMD_WARNING_CONFIG_FAILED;
3509
3510 group = peer_group_lookup(bgp, argv[idx_word]->arg);
3511 if (!group) {
3512 vty_out(vty, "%% Configure the peer-group first\n");
3513 return CMD_WARNING_CONFIG_FAILED;
3514 }
3515
3516 ret = peer_delete(peer);
3517
3518 return bgp_vty_return(vty, ret);
3519 }
3520
3521 ALIAS_HIDDEN(no_neighbor_set_peer_group, no_neighbor_set_peer_group_hidden_cmd,
3522 "no neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
3523 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3524 "Member of the peer-group\n"
3525 "Peer-group name\n")
3526
3527 static int peer_flag_modify_vty(struct vty *vty, const char *ip_str,
3528 uint32_t flag, int set)
3529 {
3530 int ret;
3531 struct peer *peer;
3532
3533 peer = peer_and_group_lookup_vty(vty, ip_str);
3534 if (!peer)
3535 return CMD_WARNING_CONFIG_FAILED;
3536
3537 /*
3538 * If 'neighbor <interface>', then this is for directly connected peers,
3539 * we should not accept disable-connected-check.
3540 */
3541 if (peer->conf_if && (flag == PEER_FLAG_DISABLE_CONNECTED_CHECK)) {
3542 vty_out(vty,
3543 "%s is directly connected peer, cannot accept disable-"
3544 "connected-check\n",
3545 ip_str);
3546 return CMD_WARNING_CONFIG_FAILED;
3547 }
3548
3549 if (!set && flag == PEER_FLAG_SHUTDOWN)
3550 peer_tx_shutdown_message_unset(peer);
3551
3552 if (set)
3553 ret = peer_flag_set(peer, flag);
3554 else
3555 ret = peer_flag_unset(peer, flag);
3556
3557 return bgp_vty_return(vty, ret);
3558 }
3559
3560 static int peer_flag_set_vty(struct vty *vty, const char *ip_str, uint32_t flag)
3561 {
3562 return peer_flag_modify_vty(vty, ip_str, flag, 1);
3563 }
3564
3565 static int peer_flag_unset_vty(struct vty *vty, const char *ip_str,
3566 uint32_t flag)
3567 {
3568 return peer_flag_modify_vty(vty, ip_str, flag, 0);
3569 }
3570
3571 /* neighbor passive. */
3572 DEFUN (neighbor_passive,
3573 neighbor_passive_cmd,
3574 "neighbor <A.B.C.D|X:X::X:X|WORD> passive",
3575 NEIGHBOR_STR
3576 NEIGHBOR_ADDR_STR2
3577 "Don't send open messages to this neighbor\n")
3578 {
3579 int idx_peer = 1;
3580 return peer_flag_set_vty(vty, argv[idx_peer]->arg, PEER_FLAG_PASSIVE);
3581 }
3582
3583 DEFUN (no_neighbor_passive,
3584 no_neighbor_passive_cmd,
3585 "no neighbor <A.B.C.D|X:X::X:X|WORD> passive",
3586 NO_STR
3587 NEIGHBOR_STR
3588 NEIGHBOR_ADDR_STR2
3589 "Don't send open messages to this neighbor\n")
3590 {
3591 int idx_peer = 2;
3592 return peer_flag_unset_vty(vty, argv[idx_peer]->arg, PEER_FLAG_PASSIVE);
3593 }
3594
3595 /* neighbor shutdown. */
3596 DEFUN (neighbor_shutdown_msg,
3597 neighbor_shutdown_msg_cmd,
3598 "neighbor <A.B.C.D|X:X::X:X|WORD> shutdown message MSG...",
3599 NEIGHBOR_STR
3600 NEIGHBOR_ADDR_STR2
3601 "Administratively shut down this neighbor\n"
3602 "Add a shutdown message (draft-ietf-idr-shutdown-06)\n"
3603 "Shutdown message\n")
3604 {
3605 int idx_peer = 1;
3606
3607 if (argc >= 5) {
3608 struct peer *peer =
3609 peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
3610 char *message;
3611
3612 if (!peer)
3613 return CMD_WARNING_CONFIG_FAILED;
3614 message = argv_concat(argv, argc, 4);
3615 peer_tx_shutdown_message_set(peer, message);
3616 XFREE(MTYPE_TMP, message);
3617 }
3618
3619 return peer_flag_set_vty(vty, argv[idx_peer]->arg, PEER_FLAG_SHUTDOWN);
3620 }
3621
3622 ALIAS(neighbor_shutdown_msg, neighbor_shutdown_cmd,
3623 "neighbor <A.B.C.D|X:X::X:X|WORD> shutdown",
3624 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3625 "Administratively shut down this neighbor\n")
3626
3627 DEFUN (no_neighbor_shutdown_msg,
3628 no_neighbor_shutdown_msg_cmd,
3629 "no neighbor <A.B.C.D|X:X::X:X|WORD> shutdown message MSG...",
3630 NO_STR
3631 NEIGHBOR_STR
3632 NEIGHBOR_ADDR_STR2
3633 "Administratively shut down this neighbor\n"
3634 "Remove a shutdown message (draft-ietf-idr-shutdown-06)\n"
3635 "Shutdown message\n")
3636 {
3637 int idx_peer = 2;
3638
3639 return peer_flag_unset_vty(vty, argv[idx_peer]->arg,
3640 PEER_FLAG_SHUTDOWN);
3641 }
3642
3643 ALIAS(no_neighbor_shutdown_msg, no_neighbor_shutdown_cmd,
3644 "no neighbor <A.B.C.D|X:X::X:X|WORD> shutdown",
3645 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3646 "Administratively shut down this neighbor\n")
3647
3648 /* neighbor capability dynamic. */
3649 DEFUN (neighbor_capability_dynamic,
3650 neighbor_capability_dynamic_cmd,
3651 "neighbor <A.B.C.D|X:X::X:X|WORD> capability dynamic",
3652 NEIGHBOR_STR
3653 NEIGHBOR_ADDR_STR2
3654 "Advertise capability to the peer\n"
3655 "Advertise dynamic capability to this neighbor\n")
3656 {
3657 int idx_peer = 1;
3658 return peer_flag_set_vty(vty, argv[idx_peer]->arg,
3659 PEER_FLAG_DYNAMIC_CAPABILITY);
3660 }
3661
3662 DEFUN (no_neighbor_capability_dynamic,
3663 no_neighbor_capability_dynamic_cmd,
3664 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability dynamic",
3665 NO_STR
3666 NEIGHBOR_STR
3667 NEIGHBOR_ADDR_STR2
3668 "Advertise capability to the peer\n"
3669 "Advertise dynamic capability to this neighbor\n")
3670 {
3671 int idx_peer = 2;
3672 return peer_flag_unset_vty(vty, argv[idx_peer]->arg,
3673 PEER_FLAG_DYNAMIC_CAPABILITY);
3674 }
3675
3676 /* neighbor dont-capability-negotiate */
3677 DEFUN (neighbor_dont_capability_negotiate,
3678 neighbor_dont_capability_negotiate_cmd,
3679 "neighbor <A.B.C.D|X:X::X:X|WORD> dont-capability-negotiate",
3680 NEIGHBOR_STR
3681 NEIGHBOR_ADDR_STR2
3682 "Do not perform capability negotiation\n")
3683 {
3684 int idx_peer = 1;
3685 return peer_flag_set_vty(vty, argv[idx_peer]->arg,
3686 PEER_FLAG_DONT_CAPABILITY);
3687 }
3688
3689 DEFUN (no_neighbor_dont_capability_negotiate,
3690 no_neighbor_dont_capability_negotiate_cmd,
3691 "no neighbor <A.B.C.D|X:X::X:X|WORD> dont-capability-negotiate",
3692 NO_STR
3693 NEIGHBOR_STR
3694 NEIGHBOR_ADDR_STR2
3695 "Do not perform capability negotiation\n")
3696 {
3697 int idx_peer = 2;
3698 return peer_flag_unset_vty(vty, argv[idx_peer]->arg,
3699 PEER_FLAG_DONT_CAPABILITY);
3700 }
3701
3702 /* neighbor capability extended next hop encoding */
3703 DEFUN (neighbor_capability_enhe,
3704 neighbor_capability_enhe_cmd,
3705 "neighbor <A.B.C.D|X:X::X:X|WORD> capability extended-nexthop",
3706 NEIGHBOR_STR
3707 NEIGHBOR_ADDR_STR2
3708 "Advertise capability to the peer\n"
3709 "Advertise extended next-hop capability to the peer\n")
3710 {
3711 int idx_peer = 1;
3712 return peer_flag_set_vty(vty, argv[idx_peer]->arg,
3713 PEER_FLAG_CAPABILITY_ENHE);
3714 }
3715
3716 DEFUN (no_neighbor_capability_enhe,
3717 no_neighbor_capability_enhe_cmd,
3718 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability extended-nexthop",
3719 NO_STR
3720 NEIGHBOR_STR
3721 NEIGHBOR_ADDR_STR2
3722 "Advertise capability to the peer\n"
3723 "Advertise extended next-hop capability to the peer\n")
3724 {
3725 int idx_peer = 2;
3726 return peer_flag_unset_vty(vty, argv[idx_peer]->arg,
3727 PEER_FLAG_CAPABILITY_ENHE);
3728 }
3729
3730 static int peer_af_flag_modify_vty(struct vty *vty, const char *peer_str,
3731 afi_t afi, safi_t safi, uint32_t flag,
3732 int set)
3733 {
3734 int ret;
3735 struct peer *peer;
3736
3737 peer = peer_and_group_lookup_vty(vty, peer_str);
3738 if (!peer)
3739 return CMD_WARNING_CONFIG_FAILED;
3740
3741 if (set)
3742 ret = peer_af_flag_set(peer, afi, safi, flag);
3743 else
3744 ret = peer_af_flag_unset(peer, afi, safi, flag);
3745
3746 return bgp_vty_return(vty, ret);
3747 }
3748
3749 static int peer_af_flag_set_vty(struct vty *vty, const char *peer_str,
3750 afi_t afi, safi_t safi, uint32_t flag)
3751 {
3752 return peer_af_flag_modify_vty(vty, peer_str, afi, safi, flag, 1);
3753 }
3754
3755 static int peer_af_flag_unset_vty(struct vty *vty, const char *peer_str,
3756 afi_t afi, safi_t safi, uint32_t flag)
3757 {
3758 return peer_af_flag_modify_vty(vty, peer_str, afi, safi, flag, 0);
3759 }
3760
3761 /* neighbor capability orf prefix-list. */
3762 DEFUN (neighbor_capability_orf_prefix,
3763 neighbor_capability_orf_prefix_cmd,
3764 "neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
3765 NEIGHBOR_STR
3766 NEIGHBOR_ADDR_STR2
3767 "Advertise capability to the peer\n"
3768 "Advertise ORF capability to the peer\n"
3769 "Advertise prefixlist ORF capability to this neighbor\n"
3770 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
3771 "Capability to RECEIVE the ORF from this neighbor\n"
3772 "Capability to SEND the ORF to this neighbor\n")
3773 {
3774 int idx_peer = 1;
3775 int idx_send_recv = 5;
3776 uint16_t flag = 0;
3777
3778 if (strmatch(argv[idx_send_recv]->text, "send"))
3779 flag = PEER_FLAG_ORF_PREFIX_SM;
3780 else if (strmatch(argv[idx_send_recv]->text, "receive"))
3781 flag = PEER_FLAG_ORF_PREFIX_RM;
3782 else if (strmatch(argv[idx_send_recv]->text, "both"))
3783 flag = PEER_FLAG_ORF_PREFIX_SM | PEER_FLAG_ORF_PREFIX_RM;
3784 else {
3785 vty_out(vty, "%% BGP invalid orf prefix-list option\n");
3786 return CMD_WARNING_CONFIG_FAILED;
3787 }
3788
3789 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
3790 bgp_node_safi(vty), flag);
3791 }
3792
3793 ALIAS_HIDDEN(
3794 neighbor_capability_orf_prefix,
3795 neighbor_capability_orf_prefix_hidden_cmd,
3796 "neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
3797 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3798 "Advertise capability to the peer\n"
3799 "Advertise ORF capability to the peer\n"
3800 "Advertise prefixlist ORF capability to this neighbor\n"
3801 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
3802 "Capability to RECEIVE the ORF from this neighbor\n"
3803 "Capability to SEND the ORF to this neighbor\n")
3804
3805 DEFUN (no_neighbor_capability_orf_prefix,
3806 no_neighbor_capability_orf_prefix_cmd,
3807 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
3808 NO_STR
3809 NEIGHBOR_STR
3810 NEIGHBOR_ADDR_STR2
3811 "Advertise capability to the peer\n"
3812 "Advertise ORF capability to the peer\n"
3813 "Advertise prefixlist ORF capability to this neighbor\n"
3814 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
3815 "Capability to RECEIVE the ORF from this neighbor\n"
3816 "Capability to SEND the ORF to this neighbor\n")
3817 {
3818 int idx_peer = 2;
3819 int idx_send_recv = 6;
3820 uint16_t flag = 0;
3821
3822 if (strmatch(argv[idx_send_recv]->text, "send"))
3823 flag = PEER_FLAG_ORF_PREFIX_SM;
3824 else if (strmatch(argv[idx_send_recv]->text, "receive"))
3825 flag = PEER_FLAG_ORF_PREFIX_RM;
3826 else if (strmatch(argv[idx_send_recv]->text, "both"))
3827 flag = PEER_FLAG_ORF_PREFIX_SM | PEER_FLAG_ORF_PREFIX_RM;
3828 else {
3829 vty_out(vty, "%% BGP invalid orf prefix-list option\n");
3830 return CMD_WARNING_CONFIG_FAILED;
3831 }
3832
3833 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
3834 bgp_node_afi(vty), bgp_node_safi(vty),
3835 flag);
3836 }
3837
3838 ALIAS_HIDDEN(
3839 no_neighbor_capability_orf_prefix,
3840 no_neighbor_capability_orf_prefix_hidden_cmd,
3841 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
3842 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3843 "Advertise capability to the peer\n"
3844 "Advertise ORF capability to the peer\n"
3845 "Advertise prefixlist ORF capability to this neighbor\n"
3846 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
3847 "Capability to RECEIVE the ORF from this neighbor\n"
3848 "Capability to SEND the ORF to this neighbor\n")
3849
3850 /* neighbor next-hop-self. */
3851 DEFUN (neighbor_nexthop_self,
3852 neighbor_nexthop_self_cmd,
3853 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
3854 NEIGHBOR_STR
3855 NEIGHBOR_ADDR_STR2
3856 "Disable the next hop calculation for this neighbor\n")
3857 {
3858 int idx_peer = 1;
3859 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
3860 bgp_node_safi(vty), PEER_FLAG_NEXTHOP_SELF);
3861 }
3862
3863 ALIAS_HIDDEN(neighbor_nexthop_self, neighbor_nexthop_self_hidden_cmd,
3864 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
3865 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3866 "Disable the next hop calculation for this neighbor\n")
3867
3868 /* neighbor next-hop-self. */
3869 DEFUN (neighbor_nexthop_self_force,
3870 neighbor_nexthop_self_force_cmd,
3871 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
3872 NEIGHBOR_STR
3873 NEIGHBOR_ADDR_STR2
3874 "Disable the next hop calculation for this neighbor\n"
3875 "Set the next hop to self for reflected routes\n")
3876 {
3877 int idx_peer = 1;
3878 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
3879 bgp_node_safi(vty),
3880 PEER_FLAG_FORCE_NEXTHOP_SELF);
3881 }
3882
3883 ALIAS_HIDDEN(neighbor_nexthop_self_force,
3884 neighbor_nexthop_self_force_hidden_cmd,
3885 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
3886 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3887 "Disable the next hop calculation for this neighbor\n"
3888 "Set the next hop to self for reflected routes\n")
3889
3890 ALIAS_HIDDEN(neighbor_nexthop_self_force,
3891 neighbor_nexthop_self_all_hidden_cmd,
3892 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self all",
3893 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3894 "Disable the next hop calculation for this neighbor\n"
3895 "Set the next hop to self for reflected routes\n")
3896
3897 DEFUN (no_neighbor_nexthop_self,
3898 no_neighbor_nexthop_self_cmd,
3899 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
3900 NO_STR
3901 NEIGHBOR_STR
3902 NEIGHBOR_ADDR_STR2
3903 "Disable the next hop calculation for this neighbor\n")
3904 {
3905 int idx_peer = 2;
3906 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
3907 bgp_node_afi(vty), bgp_node_safi(vty),
3908 PEER_FLAG_NEXTHOP_SELF);
3909 }
3910
3911 ALIAS_HIDDEN(no_neighbor_nexthop_self, no_neighbor_nexthop_self_hidden_cmd,
3912 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
3913 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3914 "Disable the next hop calculation for this neighbor\n")
3915
3916 DEFUN (no_neighbor_nexthop_self_force,
3917 no_neighbor_nexthop_self_force_cmd,
3918 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
3919 NO_STR
3920 NEIGHBOR_STR
3921 NEIGHBOR_ADDR_STR2
3922 "Disable the next hop calculation for this neighbor\n"
3923 "Set the next hop to self for reflected routes\n")
3924 {
3925 int idx_peer = 2;
3926 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
3927 bgp_node_afi(vty), bgp_node_safi(vty),
3928 PEER_FLAG_FORCE_NEXTHOP_SELF);
3929 }
3930
3931 ALIAS_HIDDEN(no_neighbor_nexthop_self_force,
3932 no_neighbor_nexthop_self_force_hidden_cmd,
3933 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
3934 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3935 "Disable the next hop calculation for this neighbor\n"
3936 "Set the next hop to self for reflected routes\n")
3937
3938 ALIAS_HIDDEN(no_neighbor_nexthop_self_force,
3939 no_neighbor_nexthop_self_all_hidden_cmd,
3940 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self all",
3941 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3942 "Disable the next hop calculation for this neighbor\n"
3943 "Set the next hop to self for reflected routes\n")
3944
3945 /* neighbor as-override */
3946 DEFUN (neighbor_as_override,
3947 neighbor_as_override_cmd,
3948 "neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
3949 NEIGHBOR_STR
3950 NEIGHBOR_ADDR_STR2
3951 "Override ASNs in outbound updates if aspath equals remote-as\n")
3952 {
3953 int idx_peer = 1;
3954 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
3955 bgp_node_safi(vty), PEER_FLAG_AS_OVERRIDE);
3956 }
3957
3958 ALIAS_HIDDEN(neighbor_as_override, neighbor_as_override_hidden_cmd,
3959 "neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
3960 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3961 "Override ASNs in outbound updates if aspath equals remote-as\n")
3962
3963 DEFUN (no_neighbor_as_override,
3964 no_neighbor_as_override_cmd,
3965 "no neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
3966 NO_STR
3967 NEIGHBOR_STR
3968 NEIGHBOR_ADDR_STR2
3969 "Override ASNs in outbound updates if aspath equals remote-as\n")
3970 {
3971 int idx_peer = 2;
3972 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
3973 bgp_node_afi(vty), bgp_node_safi(vty),
3974 PEER_FLAG_AS_OVERRIDE);
3975 }
3976
3977 ALIAS_HIDDEN(no_neighbor_as_override, no_neighbor_as_override_hidden_cmd,
3978 "no neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
3979 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3980 "Override ASNs in outbound updates if aspath equals remote-as\n")
3981
3982 /* neighbor remove-private-AS. */
3983 DEFUN (neighbor_remove_private_as,
3984 neighbor_remove_private_as_cmd,
3985 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
3986 NEIGHBOR_STR
3987 NEIGHBOR_ADDR_STR2
3988 "Remove private ASNs in outbound updates\n")
3989 {
3990 int idx_peer = 1;
3991 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
3992 bgp_node_safi(vty),
3993 PEER_FLAG_REMOVE_PRIVATE_AS);
3994 }
3995
3996 ALIAS_HIDDEN(neighbor_remove_private_as, neighbor_remove_private_as_hidden_cmd,
3997 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
3998 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3999 "Remove private ASNs in outbound updates\n")
4000
4001 DEFUN (neighbor_remove_private_as_all,
4002 neighbor_remove_private_as_all_cmd,
4003 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
4004 NEIGHBOR_STR
4005 NEIGHBOR_ADDR_STR2
4006 "Remove private ASNs in outbound updates\n"
4007 "Apply to all AS numbers\n")
4008 {
4009 int idx_peer = 1;
4010 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
4011 bgp_node_safi(vty),
4012 PEER_FLAG_REMOVE_PRIVATE_AS_ALL);
4013 }
4014
4015 ALIAS_HIDDEN(neighbor_remove_private_as_all,
4016 neighbor_remove_private_as_all_hidden_cmd,
4017 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
4018 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4019 "Remove private ASNs in outbound updates\n"
4020 "Apply to all AS numbers")
4021
4022 DEFUN (neighbor_remove_private_as_replace_as,
4023 neighbor_remove_private_as_replace_as_cmd,
4024 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
4025 NEIGHBOR_STR
4026 NEIGHBOR_ADDR_STR2
4027 "Remove private ASNs in outbound updates\n"
4028 "Replace private ASNs with our ASN in outbound updates\n")
4029 {
4030 int idx_peer = 1;
4031 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
4032 bgp_node_safi(vty),
4033 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE);
4034 }
4035
4036 ALIAS_HIDDEN(neighbor_remove_private_as_replace_as,
4037 neighbor_remove_private_as_replace_as_hidden_cmd,
4038 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
4039 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4040 "Remove private ASNs in outbound updates\n"
4041 "Replace private ASNs with our ASN in outbound updates\n")
4042
4043 DEFUN (neighbor_remove_private_as_all_replace_as,
4044 neighbor_remove_private_as_all_replace_as_cmd,
4045 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
4046 NEIGHBOR_STR
4047 NEIGHBOR_ADDR_STR2
4048 "Remove private ASNs in outbound updates\n"
4049 "Apply to all AS numbers\n"
4050 "Replace private ASNs with our ASN in outbound updates\n")
4051 {
4052 int idx_peer = 1;
4053 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
4054 bgp_node_safi(vty),
4055 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE);
4056 }
4057
4058 ALIAS_HIDDEN(
4059 neighbor_remove_private_as_all_replace_as,
4060 neighbor_remove_private_as_all_replace_as_hidden_cmd,
4061 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
4062 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4063 "Remove private ASNs in outbound updates\n"
4064 "Apply to all AS numbers\n"
4065 "Replace private ASNs with our ASN in outbound updates\n")
4066
4067 DEFUN (no_neighbor_remove_private_as,
4068 no_neighbor_remove_private_as_cmd,
4069 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
4070 NO_STR
4071 NEIGHBOR_STR
4072 NEIGHBOR_ADDR_STR2
4073 "Remove private ASNs in outbound updates\n")
4074 {
4075 int idx_peer = 2;
4076 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
4077 bgp_node_afi(vty), bgp_node_safi(vty),
4078 PEER_FLAG_REMOVE_PRIVATE_AS);
4079 }
4080
4081 ALIAS_HIDDEN(no_neighbor_remove_private_as,
4082 no_neighbor_remove_private_as_hidden_cmd,
4083 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
4084 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4085 "Remove private ASNs in outbound updates\n")
4086
4087 DEFUN (no_neighbor_remove_private_as_all,
4088 no_neighbor_remove_private_as_all_cmd,
4089 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
4090 NO_STR
4091 NEIGHBOR_STR
4092 NEIGHBOR_ADDR_STR2
4093 "Remove private ASNs in outbound updates\n"
4094 "Apply to all AS numbers\n")
4095 {
4096 int idx_peer = 2;
4097 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
4098 bgp_node_afi(vty), bgp_node_safi(vty),
4099 PEER_FLAG_REMOVE_PRIVATE_AS_ALL);
4100 }
4101
4102 ALIAS_HIDDEN(no_neighbor_remove_private_as_all,
4103 no_neighbor_remove_private_as_all_hidden_cmd,
4104 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
4105 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4106 "Remove private ASNs in outbound updates\n"
4107 "Apply to all AS numbers\n")
4108
4109 DEFUN (no_neighbor_remove_private_as_replace_as,
4110 no_neighbor_remove_private_as_replace_as_cmd,
4111 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
4112 NO_STR
4113 NEIGHBOR_STR
4114 NEIGHBOR_ADDR_STR2
4115 "Remove private ASNs in outbound updates\n"
4116 "Replace private ASNs with our ASN in outbound updates\n")
4117 {
4118 int idx_peer = 2;
4119 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
4120 bgp_node_afi(vty), bgp_node_safi(vty),
4121 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE);
4122 }
4123
4124 ALIAS_HIDDEN(no_neighbor_remove_private_as_replace_as,
4125 no_neighbor_remove_private_as_replace_as_hidden_cmd,
4126 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
4127 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4128 "Remove private ASNs in outbound updates\n"
4129 "Replace private ASNs with our ASN in outbound updates\n")
4130
4131 DEFUN (no_neighbor_remove_private_as_all_replace_as,
4132 no_neighbor_remove_private_as_all_replace_as_cmd,
4133 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
4134 NO_STR
4135 NEIGHBOR_STR
4136 NEIGHBOR_ADDR_STR2
4137 "Remove private ASNs in outbound updates\n"
4138 "Apply to all AS numbers\n"
4139 "Replace private ASNs with our ASN in outbound updates\n")
4140 {
4141 int idx_peer = 2;
4142 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
4143 bgp_node_afi(vty), bgp_node_safi(vty),
4144 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE);
4145 }
4146
4147 ALIAS_HIDDEN(
4148 no_neighbor_remove_private_as_all_replace_as,
4149 no_neighbor_remove_private_as_all_replace_as_hidden_cmd,
4150 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
4151 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4152 "Remove private ASNs in outbound updates\n"
4153 "Apply to all AS numbers\n"
4154 "Replace private ASNs with our ASN in outbound updates\n")
4155
4156
4157 /* neighbor send-community. */
4158 DEFUN (neighbor_send_community,
4159 neighbor_send_community_cmd,
4160 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
4161 NEIGHBOR_STR
4162 NEIGHBOR_ADDR_STR2
4163 "Send Community attribute to this neighbor\n")
4164 {
4165 int idx_peer = 1;
4166
4167 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
4168 bgp_node_safi(vty),
4169 PEER_FLAG_SEND_COMMUNITY);
4170 }
4171
4172 ALIAS_HIDDEN(neighbor_send_community, neighbor_send_community_hidden_cmd,
4173 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
4174 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4175 "Send Community attribute to this neighbor\n")
4176
4177 DEFUN (no_neighbor_send_community,
4178 no_neighbor_send_community_cmd,
4179 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
4180 NO_STR
4181 NEIGHBOR_STR
4182 NEIGHBOR_ADDR_STR2
4183 "Send Community attribute to this neighbor\n")
4184 {
4185 int idx_peer = 2;
4186
4187 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
4188 bgp_node_afi(vty), bgp_node_safi(vty),
4189 PEER_FLAG_SEND_COMMUNITY);
4190 }
4191
4192 ALIAS_HIDDEN(no_neighbor_send_community, no_neighbor_send_community_hidden_cmd,
4193 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
4194 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4195 "Send Community attribute to this neighbor\n")
4196
4197 /* neighbor send-community extended. */
4198 DEFUN (neighbor_send_community_type,
4199 neighbor_send_community_type_cmd,
4200 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
4201 NEIGHBOR_STR
4202 NEIGHBOR_ADDR_STR2
4203 "Send Community attribute to this neighbor\n"
4204 "Send Standard and Extended Community attributes\n"
4205 "Send Standard, Large and Extended Community attributes\n"
4206 "Send Extended Community attributes\n"
4207 "Send Standard Community attributes\n"
4208 "Send Large Community attributes\n")
4209 {
4210 int idx_peer = 1;
4211 uint32_t flag = 0;
4212 const char *type = argv[argc - 1]->text;
4213
4214 if (strmatch(type, "standard")) {
4215 SET_FLAG(flag, PEER_FLAG_SEND_COMMUNITY);
4216 } else if (strmatch(type, "extended")) {
4217 SET_FLAG(flag, PEER_FLAG_SEND_EXT_COMMUNITY);
4218 } else if (strmatch(type, "large")) {
4219 SET_FLAG(flag, PEER_FLAG_SEND_LARGE_COMMUNITY);
4220 } else if (strmatch(type, "both")) {
4221 SET_FLAG(flag, PEER_FLAG_SEND_COMMUNITY);
4222 SET_FLAG(flag, PEER_FLAG_SEND_EXT_COMMUNITY);
4223 } else { /* if (strmatch(type, "all")) */
4224 SET_FLAG(flag, PEER_FLAG_SEND_COMMUNITY);
4225 SET_FLAG(flag, PEER_FLAG_SEND_EXT_COMMUNITY);
4226 SET_FLAG(flag, PEER_FLAG_SEND_LARGE_COMMUNITY);
4227 }
4228
4229 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
4230 bgp_node_safi(vty), flag);
4231 }
4232
4233 ALIAS_HIDDEN(
4234 neighbor_send_community_type, neighbor_send_community_type_hidden_cmd,
4235 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
4236 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4237 "Send Community attribute to this neighbor\n"
4238 "Send Standard and Extended Community attributes\n"
4239 "Send Standard, Large and Extended Community attributes\n"
4240 "Send Extended Community attributes\n"
4241 "Send Standard Community attributes\n"
4242 "Send Large Community attributes\n")
4243
4244 DEFUN (no_neighbor_send_community_type,
4245 no_neighbor_send_community_type_cmd,
4246 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
4247 NO_STR
4248 NEIGHBOR_STR
4249 NEIGHBOR_ADDR_STR2
4250 "Send Community attribute to this neighbor\n"
4251 "Send Standard and Extended Community attributes\n"
4252 "Send Standard, Large and Extended Community attributes\n"
4253 "Send Extended Community attributes\n"
4254 "Send Standard Community attributes\n"
4255 "Send Large Community attributes\n")
4256 {
4257 int idx_peer = 2;
4258 uint32_t flag = 0;
4259 const char *type = argv[argc - 1]->text;
4260
4261 if (strmatch(type, "standard")) {
4262 SET_FLAG(flag, PEER_FLAG_SEND_COMMUNITY);
4263 } else if (strmatch(type, "extended")) {
4264 SET_FLAG(flag, PEER_FLAG_SEND_EXT_COMMUNITY);
4265 } else if (strmatch(type, "large")) {
4266 SET_FLAG(flag, PEER_FLAG_SEND_LARGE_COMMUNITY);
4267 } else if (strmatch(type, "both")) {
4268 SET_FLAG(flag, PEER_FLAG_SEND_COMMUNITY);
4269 SET_FLAG(flag, PEER_FLAG_SEND_EXT_COMMUNITY);
4270 } else { /* if (strmatch(type, "all")) */
4271 SET_FLAG(flag, PEER_FLAG_SEND_COMMUNITY);
4272 SET_FLAG(flag, PEER_FLAG_SEND_EXT_COMMUNITY);
4273 SET_FLAG(flag, PEER_FLAG_SEND_LARGE_COMMUNITY);
4274 }
4275
4276 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
4277 bgp_node_afi(vty), bgp_node_safi(vty),
4278 flag);
4279 }
4280
4281 ALIAS_HIDDEN(
4282 no_neighbor_send_community_type,
4283 no_neighbor_send_community_type_hidden_cmd,
4284 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
4285 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4286 "Send Community attribute to this neighbor\n"
4287 "Send Standard and Extended Community attributes\n"
4288 "Send Standard, Large and Extended Community attributes\n"
4289 "Send Extended Community attributes\n"
4290 "Send Standard Community attributes\n"
4291 "Send Large Community attributes\n")
4292
4293 /* neighbor soft-reconfig. */
4294 DEFUN (neighbor_soft_reconfiguration,
4295 neighbor_soft_reconfiguration_cmd,
4296 "neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
4297 NEIGHBOR_STR
4298 NEIGHBOR_ADDR_STR2
4299 "Per neighbor soft reconfiguration\n"
4300 "Allow inbound soft reconfiguration for this neighbor\n")
4301 {
4302 int idx_peer = 1;
4303 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
4304 bgp_node_safi(vty),
4305 PEER_FLAG_SOFT_RECONFIG);
4306 }
4307
4308 ALIAS_HIDDEN(neighbor_soft_reconfiguration,
4309 neighbor_soft_reconfiguration_hidden_cmd,
4310 "neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
4311 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4312 "Per neighbor soft reconfiguration\n"
4313 "Allow inbound soft reconfiguration for this neighbor\n")
4314
4315 DEFUN (no_neighbor_soft_reconfiguration,
4316 no_neighbor_soft_reconfiguration_cmd,
4317 "no neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
4318 NO_STR
4319 NEIGHBOR_STR
4320 NEIGHBOR_ADDR_STR2
4321 "Per neighbor soft reconfiguration\n"
4322 "Allow inbound soft reconfiguration for this neighbor\n")
4323 {
4324 int idx_peer = 2;
4325 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
4326 bgp_node_afi(vty), bgp_node_safi(vty),
4327 PEER_FLAG_SOFT_RECONFIG);
4328 }
4329
4330 ALIAS_HIDDEN(no_neighbor_soft_reconfiguration,
4331 no_neighbor_soft_reconfiguration_hidden_cmd,
4332 "no neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
4333 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4334 "Per neighbor soft reconfiguration\n"
4335 "Allow inbound soft reconfiguration for this neighbor\n")
4336
4337 DEFUN (neighbor_route_reflector_client,
4338 neighbor_route_reflector_client_cmd,
4339 "neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
4340 NEIGHBOR_STR
4341 NEIGHBOR_ADDR_STR2
4342 "Configure a neighbor as Route Reflector client\n")
4343 {
4344 int idx_peer = 1;
4345 struct peer *peer;
4346
4347
4348 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
4349 if (!peer)
4350 return CMD_WARNING_CONFIG_FAILED;
4351
4352 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
4353 bgp_node_safi(vty),
4354 PEER_FLAG_REFLECTOR_CLIENT);
4355 }
4356
4357 ALIAS_HIDDEN(neighbor_route_reflector_client,
4358 neighbor_route_reflector_client_hidden_cmd,
4359 "neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
4360 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4361 "Configure a neighbor as Route Reflector client\n")
4362
4363 DEFUN (no_neighbor_route_reflector_client,
4364 no_neighbor_route_reflector_client_cmd,
4365 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
4366 NO_STR
4367 NEIGHBOR_STR
4368 NEIGHBOR_ADDR_STR2
4369 "Configure a neighbor as Route Reflector client\n")
4370 {
4371 int idx_peer = 2;
4372 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
4373 bgp_node_afi(vty), bgp_node_safi(vty),
4374 PEER_FLAG_REFLECTOR_CLIENT);
4375 }
4376
4377 ALIAS_HIDDEN(no_neighbor_route_reflector_client,
4378 no_neighbor_route_reflector_client_hidden_cmd,
4379 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
4380 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4381 "Configure a neighbor as Route Reflector client\n")
4382
4383 /* neighbor route-server-client. */
4384 DEFUN (neighbor_route_server_client,
4385 neighbor_route_server_client_cmd,
4386 "neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
4387 NEIGHBOR_STR
4388 NEIGHBOR_ADDR_STR2
4389 "Configure a neighbor as Route Server client\n")
4390 {
4391 int idx_peer = 1;
4392 struct peer *peer;
4393
4394 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
4395 if (!peer)
4396 return CMD_WARNING_CONFIG_FAILED;
4397 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
4398 bgp_node_safi(vty),
4399 PEER_FLAG_RSERVER_CLIENT);
4400 }
4401
4402 ALIAS_HIDDEN(neighbor_route_server_client,
4403 neighbor_route_server_client_hidden_cmd,
4404 "neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
4405 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4406 "Configure a neighbor as Route Server client\n")
4407
4408 DEFUN (no_neighbor_route_server_client,
4409 no_neighbor_route_server_client_cmd,
4410 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
4411 NO_STR
4412 NEIGHBOR_STR
4413 NEIGHBOR_ADDR_STR2
4414 "Configure a neighbor as Route Server client\n")
4415 {
4416 int idx_peer = 2;
4417 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
4418 bgp_node_afi(vty), bgp_node_safi(vty),
4419 PEER_FLAG_RSERVER_CLIENT);
4420 }
4421
4422 ALIAS_HIDDEN(no_neighbor_route_server_client,
4423 no_neighbor_route_server_client_hidden_cmd,
4424 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
4425 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4426 "Configure a neighbor as Route Server client\n")
4427
4428 DEFUN (neighbor_nexthop_local_unchanged,
4429 neighbor_nexthop_local_unchanged_cmd,
4430 "neighbor <A.B.C.D|X:X::X:X|WORD> nexthop-local unchanged",
4431 NEIGHBOR_STR
4432 NEIGHBOR_ADDR_STR2
4433 "Configure treatment of outgoing link-local nexthop attribute\n"
4434 "Leave link-local nexthop unchanged for this peer\n")
4435 {
4436 int idx_peer = 1;
4437 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
4438 bgp_node_safi(vty),
4439 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED);
4440 }
4441
4442 DEFUN (no_neighbor_nexthop_local_unchanged,
4443 no_neighbor_nexthop_local_unchanged_cmd,
4444 "no neighbor <A.B.C.D|X:X::X:X|WORD> nexthop-local unchanged",
4445 NO_STR
4446 NEIGHBOR_STR
4447 NEIGHBOR_ADDR_STR2
4448 "Configure treatment of outgoing link-local-nexthop attribute\n"
4449 "Leave link-local nexthop unchanged for this peer\n")
4450 {
4451 int idx_peer = 2;
4452 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
4453 bgp_node_afi(vty), bgp_node_safi(vty),
4454 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED);
4455 }
4456
4457 DEFUN (neighbor_attr_unchanged,
4458 neighbor_attr_unchanged_cmd,
4459 "neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
4460 NEIGHBOR_STR
4461 NEIGHBOR_ADDR_STR2
4462 "BGP attribute is propagated unchanged to this neighbor\n"
4463 "As-path attribute\n"
4464 "Nexthop attribute\n"
4465 "Med attribute\n")
4466 {
4467 int idx = 0;
4468 char *peer_str = argv[1]->arg;
4469 struct peer *peer;
4470 uint16_t flags = 0;
4471 afi_t afi = bgp_node_afi(vty);
4472 safi_t safi = bgp_node_safi(vty);
4473
4474 peer = peer_and_group_lookup_vty(vty, peer_str);
4475 if (!peer)
4476 return CMD_WARNING_CONFIG_FAILED;
4477
4478 if (argv_find(argv, argc, "as-path", &idx))
4479 SET_FLAG(flags, PEER_FLAG_AS_PATH_UNCHANGED);
4480 idx = 0;
4481 if (argv_find(argv, argc, "next-hop", &idx))
4482 SET_FLAG(flags, PEER_FLAG_NEXTHOP_UNCHANGED);
4483 idx = 0;
4484 if (argv_find(argv, argc, "med", &idx))
4485 SET_FLAG(flags, PEER_FLAG_MED_UNCHANGED);
4486
4487 /* no flags means all of them! */
4488 if (!flags) {
4489 SET_FLAG(flags, PEER_FLAG_AS_PATH_UNCHANGED);
4490 SET_FLAG(flags, PEER_FLAG_NEXTHOP_UNCHANGED);
4491 SET_FLAG(flags, PEER_FLAG_MED_UNCHANGED);
4492 } else {
4493 if (!CHECK_FLAG(flags, PEER_FLAG_AS_PATH_UNCHANGED)
4494 && peer_af_flag_check(peer, afi, safi,
4495 PEER_FLAG_AS_PATH_UNCHANGED)) {
4496 peer_af_flag_unset_vty(vty, peer_str, afi, safi,
4497 PEER_FLAG_AS_PATH_UNCHANGED);
4498 }
4499
4500 if (!CHECK_FLAG(flags, PEER_FLAG_NEXTHOP_UNCHANGED)
4501 && peer_af_flag_check(peer, afi, safi,
4502 PEER_FLAG_NEXTHOP_UNCHANGED)) {
4503 peer_af_flag_unset_vty(vty, peer_str, afi, safi,
4504 PEER_FLAG_NEXTHOP_UNCHANGED);
4505 }
4506
4507 if (!CHECK_FLAG(flags, PEER_FLAG_MED_UNCHANGED)
4508 && peer_af_flag_check(peer, afi, safi,
4509 PEER_FLAG_MED_UNCHANGED)) {
4510 peer_af_flag_unset_vty(vty, peer_str, afi, safi,
4511 PEER_FLAG_MED_UNCHANGED);
4512 }
4513 }
4514
4515 return peer_af_flag_set_vty(vty, peer_str, afi, safi, flags);
4516 }
4517
4518 ALIAS_HIDDEN(
4519 neighbor_attr_unchanged, neighbor_attr_unchanged_hidden_cmd,
4520 "neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
4521 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4522 "BGP attribute is propagated unchanged to this neighbor\n"
4523 "As-path attribute\n"
4524 "Nexthop attribute\n"
4525 "Med attribute\n")
4526
4527 DEFUN (no_neighbor_attr_unchanged,
4528 no_neighbor_attr_unchanged_cmd,
4529 "no neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
4530 NO_STR
4531 NEIGHBOR_STR
4532 NEIGHBOR_ADDR_STR2
4533 "BGP attribute is propagated unchanged to this neighbor\n"
4534 "As-path attribute\n"
4535 "Nexthop attribute\n"
4536 "Med attribute\n")
4537 {
4538 int idx = 0;
4539 char *peer = argv[2]->arg;
4540 uint16_t flags = 0;
4541
4542 if (argv_find(argv, argc, "as-path", &idx))
4543 SET_FLAG(flags, PEER_FLAG_AS_PATH_UNCHANGED);
4544 idx = 0;
4545 if (argv_find(argv, argc, "next-hop", &idx))
4546 SET_FLAG(flags, PEER_FLAG_NEXTHOP_UNCHANGED);
4547 idx = 0;
4548 if (argv_find(argv, argc, "med", &idx))
4549 SET_FLAG(flags, PEER_FLAG_MED_UNCHANGED);
4550
4551 if (!flags) // no flags means all of them!
4552 {
4553 SET_FLAG(flags, PEER_FLAG_AS_PATH_UNCHANGED);
4554 SET_FLAG(flags, PEER_FLAG_NEXTHOP_UNCHANGED);
4555 SET_FLAG(flags, PEER_FLAG_MED_UNCHANGED);
4556 }
4557
4558 return peer_af_flag_unset_vty(vty, peer, bgp_node_afi(vty),
4559 bgp_node_safi(vty), flags);
4560 }
4561
4562 ALIAS_HIDDEN(
4563 no_neighbor_attr_unchanged, no_neighbor_attr_unchanged_hidden_cmd,
4564 "no neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
4565 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4566 "BGP attribute is propagated unchanged to this neighbor\n"
4567 "As-path attribute\n"
4568 "Nexthop attribute\n"
4569 "Med attribute\n")
4570
4571 /* EBGP multihop configuration. */
4572 static int peer_ebgp_multihop_set_vty(struct vty *vty, const char *ip_str,
4573 const char *ttl_str)
4574 {
4575 struct peer *peer;
4576 unsigned int ttl;
4577
4578 peer = peer_and_group_lookup_vty(vty, ip_str);
4579 if (!peer)
4580 return CMD_WARNING_CONFIG_FAILED;
4581
4582 if (peer->conf_if)
4583 return bgp_vty_return(vty, BGP_ERR_INVALID_FOR_DIRECT_PEER);
4584
4585 if (!ttl_str)
4586 ttl = MAXTTL;
4587 else
4588 ttl = strtoul(ttl_str, NULL, 10);
4589
4590 return bgp_vty_return(vty, peer_ebgp_multihop_set(peer, ttl));
4591 }
4592
4593 static int peer_ebgp_multihop_unset_vty(struct vty *vty, const char *ip_str)
4594 {
4595 struct peer *peer;
4596
4597 peer = peer_and_group_lookup_vty(vty, ip_str);
4598 if (!peer)
4599 return CMD_WARNING_CONFIG_FAILED;
4600
4601 return bgp_vty_return(vty, peer_ebgp_multihop_unset(peer));
4602 }
4603
4604 /* neighbor ebgp-multihop. */
4605 DEFUN (neighbor_ebgp_multihop,
4606 neighbor_ebgp_multihop_cmd,
4607 "neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop",
4608 NEIGHBOR_STR
4609 NEIGHBOR_ADDR_STR2
4610 "Allow EBGP neighbors not on directly connected networks\n")
4611 {
4612 int idx_peer = 1;
4613 return peer_ebgp_multihop_set_vty(vty, argv[idx_peer]->arg, NULL);
4614 }
4615
4616 DEFUN (neighbor_ebgp_multihop_ttl,
4617 neighbor_ebgp_multihop_ttl_cmd,
4618 "neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop (1-255)",
4619 NEIGHBOR_STR
4620 NEIGHBOR_ADDR_STR2
4621 "Allow EBGP neighbors not on directly connected networks\n"
4622 "maximum hop count\n")
4623 {
4624 int idx_peer = 1;
4625 int idx_number = 3;
4626 return peer_ebgp_multihop_set_vty(vty, argv[idx_peer]->arg,
4627 argv[idx_number]->arg);
4628 }
4629
4630 DEFUN (no_neighbor_ebgp_multihop,
4631 no_neighbor_ebgp_multihop_cmd,
4632 "no neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop [(1-255)]",
4633 NO_STR
4634 NEIGHBOR_STR
4635 NEIGHBOR_ADDR_STR2
4636 "Allow EBGP neighbors not on directly connected networks\n"
4637 "maximum hop count\n")
4638 {
4639 int idx_peer = 2;
4640 return peer_ebgp_multihop_unset_vty(vty, argv[idx_peer]->arg);
4641 }
4642
4643
4644 /* disable-connected-check */
4645 DEFUN (neighbor_disable_connected_check,
4646 neighbor_disable_connected_check_cmd,
4647 "neighbor <A.B.C.D|X:X::X:X|WORD> <disable-connected-check|enforce-multihop>",
4648 NEIGHBOR_STR
4649 NEIGHBOR_ADDR_STR2
4650 "one-hop away EBGP peer using loopback address\n"
4651 "Enforce EBGP neighbors perform multihop\n")
4652 {
4653 int idx_peer = 1;
4654 return peer_flag_set_vty(vty, argv[idx_peer]->arg,
4655 PEER_FLAG_DISABLE_CONNECTED_CHECK);
4656 }
4657
4658 DEFUN (no_neighbor_disable_connected_check,
4659 no_neighbor_disable_connected_check_cmd,
4660 "no neighbor <A.B.C.D|X:X::X:X|WORD> <disable-connected-check|enforce-multihop>",
4661 NO_STR
4662 NEIGHBOR_STR
4663 NEIGHBOR_ADDR_STR2
4664 "one-hop away EBGP peer using loopback address\n"
4665 "Enforce EBGP neighbors perform multihop\n")
4666 {
4667 int idx_peer = 2;
4668 return peer_flag_unset_vty(vty, argv[idx_peer]->arg,
4669 PEER_FLAG_DISABLE_CONNECTED_CHECK);
4670 }
4671
4672
4673 /* enforce-first-as */
4674 DEFUN (neighbor_enforce_first_as,
4675 neighbor_enforce_first_as_cmd,
4676 "neighbor <A.B.C.D|X:X::X:X|WORD> enforce-first-as",
4677 NEIGHBOR_STR
4678 NEIGHBOR_ADDR_STR2
4679 "Enforce the first AS for EBGP routes\n")
4680 {
4681 int idx_peer = 1;
4682
4683 return peer_flag_set_vty(vty, argv[idx_peer]->arg,
4684 PEER_FLAG_ENFORCE_FIRST_AS);
4685 }
4686
4687 DEFUN (no_neighbor_enforce_first_as,
4688 no_neighbor_enforce_first_as_cmd,
4689 "no neighbor <A.B.C.D|X:X::X:X|WORD> enforce-first-as",
4690 NO_STR
4691 NEIGHBOR_STR
4692 NEIGHBOR_ADDR_STR2
4693 "Enforce the first AS for EBGP routes\n")
4694 {
4695 int idx_peer = 2;
4696
4697 return peer_flag_unset_vty(vty, argv[idx_peer]->arg,
4698 PEER_FLAG_ENFORCE_FIRST_AS);
4699 }
4700
4701
4702 DEFUN (neighbor_description,
4703 neighbor_description_cmd,
4704 "neighbor <A.B.C.D|X:X::X:X|WORD> description LINE...",
4705 NEIGHBOR_STR
4706 NEIGHBOR_ADDR_STR2
4707 "Neighbor specific description\n"
4708 "Up to 80 characters describing this neighbor\n")
4709 {
4710 int idx_peer = 1;
4711 int idx_line = 3;
4712 struct peer *peer;
4713 char *str;
4714
4715 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
4716 if (!peer)
4717 return CMD_WARNING_CONFIG_FAILED;
4718
4719 str = argv_concat(argv, argc, idx_line);
4720
4721 peer_description_set(peer, str);
4722
4723 XFREE(MTYPE_TMP, str);
4724
4725 return CMD_SUCCESS;
4726 }
4727
4728 DEFUN (no_neighbor_description,
4729 no_neighbor_description_cmd,
4730 "no neighbor <A.B.C.D|X:X::X:X|WORD> description",
4731 NO_STR
4732 NEIGHBOR_STR
4733 NEIGHBOR_ADDR_STR2
4734 "Neighbor specific description\n")
4735 {
4736 int idx_peer = 2;
4737 struct peer *peer;
4738
4739 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
4740 if (!peer)
4741 return CMD_WARNING_CONFIG_FAILED;
4742
4743 peer_description_unset(peer);
4744
4745 return CMD_SUCCESS;
4746 }
4747
4748 ALIAS(no_neighbor_description, no_neighbor_description_comment_cmd,
4749 "no neighbor <A.B.C.D|X:X::X:X|WORD> description LINE...",
4750 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4751 "Neighbor specific description\n"
4752 "Up to 80 characters describing this neighbor\n")
4753
4754 /* Neighbor update-source. */
4755 static int peer_update_source_vty(struct vty *vty, const char *peer_str,
4756 const char *source_str)
4757 {
4758 struct peer *peer;
4759 struct prefix p;
4760 union sockunion su;
4761
4762 peer = peer_and_group_lookup_vty(vty, peer_str);
4763 if (!peer)
4764 return CMD_WARNING_CONFIG_FAILED;
4765
4766 if (peer->conf_if)
4767 return CMD_WARNING;
4768
4769 if (source_str) {
4770 if (str2sockunion(source_str, &su) == 0)
4771 peer_update_source_addr_set(peer, &su);
4772 else {
4773 if (str2prefix(source_str, &p)) {
4774 vty_out(vty,
4775 "%% Invalid update-source, remove prefix length \n");
4776 return CMD_WARNING_CONFIG_FAILED;
4777 } else
4778 peer_update_source_if_set(peer, source_str);
4779 }
4780 } else
4781 peer_update_source_unset(peer);
4782
4783 return CMD_SUCCESS;
4784 }
4785
4786 #define BGP_UPDATE_SOURCE_HELP_STR \
4787 "IPv4 address\n" \
4788 "IPv6 address\n" \
4789 "Interface name (requires zebra to be running)\n"
4790
4791 DEFUN (neighbor_update_source,
4792 neighbor_update_source_cmd,
4793 "neighbor <A.B.C.D|X:X::X:X|WORD> update-source <A.B.C.D|X:X::X:X|WORD>",
4794 NEIGHBOR_STR
4795 NEIGHBOR_ADDR_STR2
4796 "Source of routing updates\n"
4797 BGP_UPDATE_SOURCE_HELP_STR)
4798 {
4799 int idx_peer = 1;
4800 int idx_peer_2 = 3;
4801 return peer_update_source_vty(vty, argv[idx_peer]->arg,
4802 argv[idx_peer_2]->arg);
4803 }
4804
4805 DEFUN (no_neighbor_update_source,
4806 no_neighbor_update_source_cmd,
4807 "no neighbor <A.B.C.D|X:X::X:X|WORD> update-source [<A.B.C.D|X:X::X:X|WORD>]",
4808 NO_STR
4809 NEIGHBOR_STR
4810 NEIGHBOR_ADDR_STR2
4811 "Source of routing updates\n"
4812 BGP_UPDATE_SOURCE_HELP_STR)
4813 {
4814 int idx_peer = 2;
4815 return peer_update_source_vty(vty, argv[idx_peer]->arg, NULL);
4816 }
4817
4818 static int peer_default_originate_set_vty(struct vty *vty, const char *peer_str,
4819 afi_t afi, safi_t safi,
4820 const char *rmap, int set)
4821 {
4822 int ret;
4823 struct peer *peer;
4824 struct route_map *route_map = NULL;
4825
4826 peer = peer_and_group_lookup_vty(vty, peer_str);
4827 if (!peer)
4828 return CMD_WARNING_CONFIG_FAILED;
4829
4830 if (set) {
4831 if (rmap)
4832 route_map = route_map_lookup_warn_noexist(vty, rmap);
4833 ret = peer_default_originate_set(peer, afi, safi,
4834 rmap, route_map);
4835 } else
4836 ret = peer_default_originate_unset(peer, afi, safi);
4837
4838 return bgp_vty_return(vty, ret);
4839 }
4840
4841 /* neighbor default-originate. */
4842 DEFUN (neighbor_default_originate,
4843 neighbor_default_originate_cmd,
4844 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate",
4845 NEIGHBOR_STR
4846 NEIGHBOR_ADDR_STR2
4847 "Originate default route to this neighbor\n")
4848 {
4849 int idx_peer = 1;
4850 return peer_default_originate_set_vty(vty, argv[idx_peer]->arg,
4851 bgp_node_afi(vty),
4852 bgp_node_safi(vty), NULL, 1);
4853 }
4854
4855 ALIAS_HIDDEN(neighbor_default_originate, neighbor_default_originate_hidden_cmd,
4856 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate",
4857 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4858 "Originate default route to this neighbor\n")
4859
4860 DEFUN (neighbor_default_originate_rmap,
4861 neighbor_default_originate_rmap_cmd,
4862 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate route-map WORD",
4863 NEIGHBOR_STR
4864 NEIGHBOR_ADDR_STR2
4865 "Originate default route to this neighbor\n"
4866 "Route-map to specify criteria to originate default\n"
4867 "route-map name\n")
4868 {
4869 int idx_peer = 1;
4870 int idx_word = 4;
4871 return peer_default_originate_set_vty(
4872 vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty),
4873 argv[idx_word]->arg, 1);
4874 }
4875
4876 ALIAS_HIDDEN(
4877 neighbor_default_originate_rmap,
4878 neighbor_default_originate_rmap_hidden_cmd,
4879 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate route-map WORD",
4880 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4881 "Originate default route to this neighbor\n"
4882 "Route-map to specify criteria to originate default\n"
4883 "route-map name\n")
4884
4885 DEFUN (no_neighbor_default_originate,
4886 no_neighbor_default_originate_cmd,
4887 "no neighbor <A.B.C.D|X:X::X:X|WORD> default-originate [route-map WORD]",
4888 NO_STR
4889 NEIGHBOR_STR
4890 NEIGHBOR_ADDR_STR2
4891 "Originate default route to this neighbor\n"
4892 "Route-map to specify criteria to originate default\n"
4893 "route-map name\n")
4894 {
4895 int idx_peer = 2;
4896 return peer_default_originate_set_vty(vty, argv[idx_peer]->arg,
4897 bgp_node_afi(vty),
4898 bgp_node_safi(vty), NULL, 0);
4899 }
4900
4901 ALIAS_HIDDEN(
4902 no_neighbor_default_originate, no_neighbor_default_originate_hidden_cmd,
4903 "no neighbor <A.B.C.D|X:X::X:X|WORD> default-originate [route-map WORD]",
4904 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4905 "Originate default route to this neighbor\n"
4906 "Route-map to specify criteria to originate default\n"
4907 "route-map name\n")
4908
4909
4910 /* Set neighbor's BGP port. */
4911 static int peer_port_vty(struct vty *vty, const char *ip_str, int afi,
4912 const char *port_str)
4913 {
4914 struct peer *peer;
4915 uint16_t port;
4916 struct servent *sp;
4917
4918 peer = peer_lookup_vty(vty, ip_str);
4919 if (!peer)
4920 return CMD_WARNING_CONFIG_FAILED;
4921
4922 if (!port_str) {
4923 sp = getservbyname("bgp", "tcp");
4924 port = (sp == NULL) ? BGP_PORT_DEFAULT : ntohs(sp->s_port);
4925 } else {
4926 port = strtoul(port_str, NULL, 10);
4927 }
4928
4929 peer_port_set(peer, port);
4930
4931 return CMD_SUCCESS;
4932 }
4933
4934 /* Set specified peer's BGP port. */
4935 DEFUN (neighbor_port,
4936 neighbor_port_cmd,
4937 "neighbor <A.B.C.D|X:X::X:X> port (0-65535)",
4938 NEIGHBOR_STR
4939 NEIGHBOR_ADDR_STR
4940 "Neighbor's BGP port\n"
4941 "TCP port number\n")
4942 {
4943 int idx_ip = 1;
4944 int idx_number = 3;
4945 return peer_port_vty(vty, argv[idx_ip]->arg, AFI_IP,
4946 argv[idx_number]->arg);
4947 }
4948
4949 DEFUN (no_neighbor_port,
4950 no_neighbor_port_cmd,
4951 "no neighbor <A.B.C.D|X:X::X:X> port [(0-65535)]",
4952 NO_STR
4953 NEIGHBOR_STR
4954 NEIGHBOR_ADDR_STR
4955 "Neighbor's BGP port\n"
4956 "TCP port number\n")
4957 {
4958 int idx_ip = 2;
4959 return peer_port_vty(vty, argv[idx_ip]->arg, AFI_IP, NULL);
4960 }
4961
4962
4963 /* neighbor weight. */
4964 static int peer_weight_set_vty(struct vty *vty, const char *ip_str, afi_t afi,
4965 safi_t safi, const char *weight_str)
4966 {
4967 int ret;
4968 struct peer *peer;
4969 unsigned long weight;
4970
4971 peer = peer_and_group_lookup_vty(vty, ip_str);
4972 if (!peer)
4973 return CMD_WARNING_CONFIG_FAILED;
4974
4975 weight = strtoul(weight_str, NULL, 10);
4976
4977 ret = peer_weight_set(peer, afi, safi, weight);
4978 return bgp_vty_return(vty, ret);
4979 }
4980
4981 static int peer_weight_unset_vty(struct vty *vty, const char *ip_str, afi_t afi,
4982 safi_t safi)
4983 {
4984 int ret;
4985 struct peer *peer;
4986
4987 peer = peer_and_group_lookup_vty(vty, ip_str);
4988 if (!peer)
4989 return CMD_WARNING_CONFIG_FAILED;
4990
4991 ret = peer_weight_unset(peer, afi, safi);
4992 return bgp_vty_return(vty, ret);
4993 }
4994
4995 DEFUN (neighbor_weight,
4996 neighbor_weight_cmd,
4997 "neighbor <A.B.C.D|X:X::X:X|WORD> weight (0-65535)",
4998 NEIGHBOR_STR
4999 NEIGHBOR_ADDR_STR2
5000 "Set default weight for routes from this neighbor\n"
5001 "default weight\n")
5002 {
5003 int idx_peer = 1;
5004 int idx_number = 3;
5005 return peer_weight_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
5006 bgp_node_safi(vty), argv[idx_number]->arg);
5007 }
5008
5009 ALIAS_HIDDEN(neighbor_weight, neighbor_weight_hidden_cmd,
5010 "neighbor <A.B.C.D|X:X::X:X|WORD> weight (0-65535)",
5011 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5012 "Set default weight for routes from this neighbor\n"
5013 "default weight\n")
5014
5015 DEFUN (no_neighbor_weight,
5016 no_neighbor_weight_cmd,
5017 "no neighbor <A.B.C.D|X:X::X:X|WORD> weight [(0-65535)]",
5018 NO_STR
5019 NEIGHBOR_STR
5020 NEIGHBOR_ADDR_STR2
5021 "Set default weight for routes from this neighbor\n"
5022 "default weight\n")
5023 {
5024 int idx_peer = 2;
5025 return peer_weight_unset_vty(vty, argv[idx_peer]->arg,
5026 bgp_node_afi(vty), bgp_node_safi(vty));
5027 }
5028
5029 ALIAS_HIDDEN(no_neighbor_weight, no_neighbor_weight_hidden_cmd,
5030 "no neighbor <A.B.C.D|X:X::X:X|WORD> weight [(0-65535)]",
5031 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5032 "Set default weight for routes from this neighbor\n"
5033 "default weight\n")
5034
5035
5036 /* Override capability negotiation. */
5037 DEFUN (neighbor_override_capability,
5038 neighbor_override_capability_cmd,
5039 "neighbor <A.B.C.D|X:X::X:X|WORD> override-capability",
5040 NEIGHBOR_STR
5041 NEIGHBOR_ADDR_STR2
5042 "Override capability negotiation result\n")
5043 {
5044 int idx_peer = 1;
5045 return peer_flag_set_vty(vty, argv[idx_peer]->arg,
5046 PEER_FLAG_OVERRIDE_CAPABILITY);
5047 }
5048
5049 DEFUN (no_neighbor_override_capability,
5050 no_neighbor_override_capability_cmd,
5051 "no neighbor <A.B.C.D|X:X::X:X|WORD> override-capability",
5052 NO_STR
5053 NEIGHBOR_STR
5054 NEIGHBOR_ADDR_STR2
5055 "Override capability negotiation result\n")
5056 {
5057 int idx_peer = 2;
5058 return peer_flag_unset_vty(vty, argv[idx_peer]->arg,
5059 PEER_FLAG_OVERRIDE_CAPABILITY);
5060 }
5061
5062 DEFUN (neighbor_strict_capability,
5063 neighbor_strict_capability_cmd,
5064 "neighbor <A.B.C.D|X:X::X:X|WORD> strict-capability-match",
5065 NEIGHBOR_STR
5066 NEIGHBOR_ADDR_STR2
5067 "Strict capability negotiation match\n")
5068 {
5069 int idx_peer = 1;
5070
5071 return peer_flag_set_vty(vty, argv[idx_peer]->arg,
5072 PEER_FLAG_STRICT_CAP_MATCH);
5073 }
5074
5075 DEFUN (no_neighbor_strict_capability,
5076 no_neighbor_strict_capability_cmd,
5077 "no neighbor <A.B.C.D|X:X::X:X|WORD> strict-capability-match",
5078 NO_STR
5079 NEIGHBOR_STR
5080 NEIGHBOR_ADDR_STR2
5081 "Strict capability negotiation match\n")
5082 {
5083 int idx_peer = 2;
5084
5085 return peer_flag_unset_vty(vty, argv[idx_peer]->arg,
5086 PEER_FLAG_STRICT_CAP_MATCH);
5087 }
5088
5089 static int peer_timers_set_vty(struct vty *vty, const char *ip_str,
5090 const char *keep_str, const char *hold_str)
5091 {
5092 int ret;
5093 struct peer *peer;
5094 uint32_t keepalive;
5095 uint32_t holdtime;
5096
5097 peer = peer_and_group_lookup_vty(vty, ip_str);
5098 if (!peer)
5099 return CMD_WARNING_CONFIG_FAILED;
5100
5101 keepalive = strtoul(keep_str, NULL, 10);
5102 holdtime = strtoul(hold_str, NULL, 10);
5103
5104 ret = peer_timers_set(peer, keepalive, holdtime);
5105
5106 return bgp_vty_return(vty, ret);
5107 }
5108
5109 static int peer_timers_unset_vty(struct vty *vty, const char *ip_str)
5110 {
5111 int ret;
5112 struct peer *peer;
5113
5114 peer = peer_and_group_lookup_vty(vty, ip_str);
5115 if (!peer)
5116 return CMD_WARNING_CONFIG_FAILED;
5117
5118 ret = peer_timers_unset(peer);
5119
5120 return bgp_vty_return(vty, ret);
5121 }
5122
5123 DEFUN (neighbor_timers,
5124 neighbor_timers_cmd,
5125 "neighbor <A.B.C.D|X:X::X:X|WORD> timers (0-65535) (0-65535)",
5126 NEIGHBOR_STR
5127 NEIGHBOR_ADDR_STR2
5128 "BGP per neighbor timers\n"
5129 "Keepalive interval\n"
5130 "Holdtime\n")
5131 {
5132 int idx_peer = 1;
5133 int idx_number = 3;
5134 int idx_number_2 = 4;
5135 return peer_timers_set_vty(vty, argv[idx_peer]->arg,
5136 argv[idx_number]->arg,
5137 argv[idx_number_2]->arg);
5138 }
5139
5140 DEFUN (no_neighbor_timers,
5141 no_neighbor_timers_cmd,
5142 "no neighbor <A.B.C.D|X:X::X:X|WORD> timers [(0-65535) (0-65535)]",
5143 NO_STR
5144 NEIGHBOR_STR
5145 NEIGHBOR_ADDR_STR2
5146 "BGP per neighbor timers\n"
5147 "Keepalive interval\n"
5148 "Holdtime\n")
5149 {
5150 int idx_peer = 2;
5151 return peer_timers_unset_vty(vty, argv[idx_peer]->arg);
5152 }
5153
5154
5155 static int peer_timers_connect_set_vty(struct vty *vty, const char *ip_str,
5156 const char *time_str)
5157 {
5158 int ret;
5159 struct peer *peer;
5160 uint32_t connect;
5161
5162 peer = peer_and_group_lookup_vty(vty, ip_str);
5163 if (!peer)
5164 return CMD_WARNING_CONFIG_FAILED;
5165
5166 connect = strtoul(time_str, NULL, 10);
5167
5168 ret = peer_timers_connect_set(peer, connect);
5169
5170 return bgp_vty_return(vty, ret);
5171 }
5172
5173 static int peer_timers_connect_unset_vty(struct vty *vty, const char *ip_str)
5174 {
5175 int ret;
5176 struct peer *peer;
5177
5178 peer = peer_and_group_lookup_vty(vty, ip_str);
5179 if (!peer)
5180 return CMD_WARNING_CONFIG_FAILED;
5181
5182 ret = peer_timers_connect_unset(peer);
5183
5184 return bgp_vty_return(vty, ret);
5185 }
5186
5187 DEFUN (neighbor_timers_connect,
5188 neighbor_timers_connect_cmd,
5189 "neighbor <A.B.C.D|X:X::X:X|WORD> timers connect (1-65535)",
5190 NEIGHBOR_STR
5191 NEIGHBOR_ADDR_STR2
5192 "BGP per neighbor timers\n"
5193 "BGP connect timer\n"
5194 "Connect timer\n")
5195 {
5196 int idx_peer = 1;
5197 int idx_number = 4;
5198 return peer_timers_connect_set_vty(vty, argv[idx_peer]->arg,
5199 argv[idx_number]->arg);
5200 }
5201
5202 DEFUN (no_neighbor_timers_connect,
5203 no_neighbor_timers_connect_cmd,
5204 "no neighbor <A.B.C.D|X:X::X:X|WORD> timers connect [(1-65535)]",
5205 NO_STR
5206 NEIGHBOR_STR
5207 NEIGHBOR_ADDR_STR2
5208 "BGP per neighbor timers\n"
5209 "BGP connect timer\n"
5210 "Connect timer\n")
5211 {
5212 int idx_peer = 2;
5213 return peer_timers_connect_unset_vty(vty, argv[idx_peer]->arg);
5214 }
5215
5216
5217 static int peer_advertise_interval_vty(struct vty *vty, const char *ip_str,
5218 const char *time_str, int set)
5219 {
5220 int ret;
5221 struct peer *peer;
5222 uint32_t routeadv = 0;
5223
5224 peer = peer_and_group_lookup_vty(vty, ip_str);
5225 if (!peer)
5226 return CMD_WARNING_CONFIG_FAILED;
5227
5228 if (time_str)
5229 routeadv = strtoul(time_str, NULL, 10);
5230
5231 if (set)
5232 ret = peer_advertise_interval_set(peer, routeadv);
5233 else
5234 ret = peer_advertise_interval_unset(peer);
5235
5236 return bgp_vty_return(vty, ret);
5237 }
5238
5239 DEFUN (neighbor_advertise_interval,
5240 neighbor_advertise_interval_cmd,
5241 "neighbor <A.B.C.D|X:X::X:X|WORD> advertisement-interval (0-600)",
5242 NEIGHBOR_STR
5243 NEIGHBOR_ADDR_STR2
5244 "Minimum interval between sending BGP routing updates\n"
5245 "time in seconds\n")
5246 {
5247 int idx_peer = 1;
5248 int idx_number = 3;
5249 return peer_advertise_interval_vty(vty, argv[idx_peer]->arg,
5250 argv[idx_number]->arg, 1);
5251 }
5252
5253 DEFUN (no_neighbor_advertise_interval,
5254 no_neighbor_advertise_interval_cmd,
5255 "no neighbor <A.B.C.D|X:X::X:X|WORD> advertisement-interval [(0-600)]",
5256 NO_STR
5257 NEIGHBOR_STR
5258 NEIGHBOR_ADDR_STR2
5259 "Minimum interval between sending BGP routing updates\n"
5260 "time in seconds\n")
5261 {
5262 int idx_peer = 2;
5263 return peer_advertise_interval_vty(vty, argv[idx_peer]->arg, NULL, 0);
5264 }
5265
5266
5267 /* Time to wait before processing route-map updates */
5268 DEFUN (bgp_set_route_map_delay_timer,
5269 bgp_set_route_map_delay_timer_cmd,
5270 "bgp route-map delay-timer (0-600)",
5271 SET_STR
5272 "BGP route-map delay timer\n"
5273 "Time in secs to wait before processing route-map changes\n"
5274 "0 disables the timer, no route updates happen when route-maps change\n")
5275 {
5276 int idx_number = 3;
5277 uint32_t rmap_delay_timer;
5278
5279 if (argv[idx_number]->arg) {
5280 rmap_delay_timer = strtoul(argv[idx_number]->arg, NULL, 10);
5281 bm->rmap_update_timer = rmap_delay_timer;
5282
5283 /* if the dynamic update handling is being disabled, and a timer
5284 * is
5285 * running, stop the timer and act as if the timer has already
5286 * fired.
5287 */
5288 if (!rmap_delay_timer && bm->t_rmap_update) {
5289 BGP_TIMER_OFF(bm->t_rmap_update);
5290 thread_execute(bm->master, bgp_route_map_update_timer,
5291 NULL, 0);
5292 }
5293 return CMD_SUCCESS;
5294 } else {
5295 vty_out(vty, "%% BGP invalid route-map delay-timer\n");
5296 return CMD_WARNING_CONFIG_FAILED;
5297 }
5298 }
5299
5300 DEFUN (no_bgp_set_route_map_delay_timer,
5301 no_bgp_set_route_map_delay_timer_cmd,
5302 "no bgp route-map delay-timer [(0-600)]",
5303 NO_STR
5304 BGP_STR
5305 "Default BGP route-map delay timer\n"
5306 "Reset to default time to wait for processing route-map changes\n"
5307 "0 disables the timer, no route updates happen when route-maps change\n")
5308 {
5309
5310 bm->rmap_update_timer = RMAP_DEFAULT_UPDATE_TIMER;
5311
5312 return CMD_SUCCESS;
5313 }
5314
5315
5316 /* neighbor interface */
5317 static int peer_interface_vty(struct vty *vty, const char *ip_str,
5318 const char *str)
5319 {
5320 struct peer *peer;
5321
5322 peer = peer_lookup_vty(vty, ip_str);
5323 if (!peer || peer->conf_if) {
5324 vty_out(vty, "%% BGP invalid peer %s\n", ip_str);
5325 return CMD_WARNING_CONFIG_FAILED;
5326 }
5327
5328 if (str)
5329 peer_interface_set(peer, str);
5330 else
5331 peer_interface_unset(peer);
5332
5333 return CMD_SUCCESS;
5334 }
5335
5336 DEFUN (neighbor_interface,
5337 neighbor_interface_cmd,
5338 "neighbor <A.B.C.D|X:X::X:X> interface WORD",
5339 NEIGHBOR_STR
5340 NEIGHBOR_ADDR_STR
5341 "Interface\n"
5342 "Interface name\n")
5343 {
5344 int idx_ip = 1;
5345 int idx_word = 3;
5346 return peer_interface_vty(vty, argv[idx_ip]->arg, argv[idx_word]->arg);
5347 }
5348
5349 DEFUN (no_neighbor_interface,
5350 no_neighbor_interface_cmd,
5351 "no neighbor <A.B.C.D|X:X::X:X|WORD> interface WORD",
5352 NO_STR
5353 NEIGHBOR_STR
5354 NEIGHBOR_ADDR_STR2
5355 "Interface\n"
5356 "Interface name\n")
5357 {
5358 int idx_peer = 2;
5359 return peer_interface_vty(vty, argv[idx_peer]->arg, NULL);
5360 }
5361
5362 DEFUN (neighbor_distribute_list,
5363 neighbor_distribute_list_cmd,
5364 "neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list <(1-199)|(1300-2699)|WORD> <in|out>",
5365 NEIGHBOR_STR
5366 NEIGHBOR_ADDR_STR2
5367 "Filter updates to/from this neighbor\n"
5368 "IP access-list number\n"
5369 "IP access-list number (expanded range)\n"
5370 "IP Access-list name\n"
5371 "Filter incoming updates\n"
5372 "Filter outgoing updates\n")
5373 {
5374 int idx_peer = 1;
5375 int idx_acl = 3;
5376 int direct, ret;
5377 struct peer *peer;
5378
5379 const char *pstr = argv[idx_peer]->arg;
5380 const char *acl = argv[idx_acl]->arg;
5381 const char *inout = argv[argc - 1]->text;
5382
5383 peer = peer_and_group_lookup_vty(vty, pstr);
5384 if (!peer)
5385 return CMD_WARNING_CONFIG_FAILED;
5386
5387 /* Check filter direction. */
5388 direct = strmatch(inout, "in") ? FILTER_IN : FILTER_OUT;
5389 ret = peer_distribute_set(peer, bgp_node_afi(vty), bgp_node_safi(vty),
5390 direct, acl);
5391
5392 return bgp_vty_return(vty, ret);
5393 }
5394
5395 ALIAS_HIDDEN(
5396 neighbor_distribute_list, neighbor_distribute_list_hidden_cmd,
5397 "neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list <(1-199)|(1300-2699)|WORD> <in|out>",
5398 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5399 "Filter updates to/from this neighbor\n"
5400 "IP access-list number\n"
5401 "IP access-list number (expanded range)\n"
5402 "IP Access-list name\n"
5403 "Filter incoming updates\n"
5404 "Filter outgoing updates\n")
5405
5406 DEFUN (no_neighbor_distribute_list,
5407 no_neighbor_distribute_list_cmd,
5408 "no neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list <(1-199)|(1300-2699)|WORD> <in|out>",
5409 NO_STR
5410 NEIGHBOR_STR
5411 NEIGHBOR_ADDR_STR2
5412 "Filter updates to/from this neighbor\n"
5413 "IP access-list number\n"
5414 "IP access-list number (expanded range)\n"
5415 "IP Access-list name\n"
5416 "Filter incoming updates\n"
5417 "Filter outgoing updates\n")
5418 {
5419 int idx_peer = 2;
5420 int direct, ret;
5421 struct peer *peer;
5422
5423 const char *pstr = argv[idx_peer]->arg;
5424 const char *inout = argv[argc - 1]->text;
5425
5426 peer = peer_and_group_lookup_vty(vty, pstr);
5427 if (!peer)
5428 return CMD_WARNING_CONFIG_FAILED;
5429
5430 /* Check filter direction. */
5431 direct = strmatch(inout, "in") ? FILTER_IN : FILTER_OUT;
5432 ret = peer_distribute_unset(peer, bgp_node_afi(vty), bgp_node_safi(vty),
5433 direct);
5434
5435 return bgp_vty_return(vty, ret);
5436 }
5437
5438 ALIAS_HIDDEN(
5439 no_neighbor_distribute_list, no_neighbor_distribute_list_hidden_cmd,
5440 "no neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list <(1-199)|(1300-2699)|WORD> <in|out>",
5441 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5442 "Filter updates to/from this neighbor\n"
5443 "IP access-list number\n"
5444 "IP access-list number (expanded range)\n"
5445 "IP Access-list name\n"
5446 "Filter incoming updates\n"
5447 "Filter outgoing updates\n")
5448
5449 /* Set prefix list to the peer. */
5450 static int peer_prefix_list_set_vty(struct vty *vty, const char *ip_str,
5451 afi_t afi, safi_t safi,
5452 const char *name_str,
5453 const char *direct_str)
5454 {
5455 int ret;
5456 int direct = FILTER_IN;
5457 struct peer *peer;
5458
5459 peer = peer_and_group_lookup_vty(vty, ip_str);
5460 if (!peer)
5461 return CMD_WARNING_CONFIG_FAILED;
5462
5463 /* Check filter direction. */
5464 if (strncmp(direct_str, "i", 1) == 0)
5465 direct = FILTER_IN;
5466 else if (strncmp(direct_str, "o", 1) == 0)
5467 direct = FILTER_OUT;
5468
5469 ret = peer_prefix_list_set(peer, afi, safi, direct, name_str);
5470
5471 return bgp_vty_return(vty, ret);
5472 }
5473
5474 static int peer_prefix_list_unset_vty(struct vty *vty, const char *ip_str,
5475 afi_t afi, safi_t safi,
5476 const char *direct_str)
5477 {
5478 int ret;
5479 struct peer *peer;
5480 int direct = FILTER_IN;
5481
5482 peer = peer_and_group_lookup_vty(vty, ip_str);
5483 if (!peer)
5484 return CMD_WARNING_CONFIG_FAILED;
5485
5486 /* Check filter direction. */
5487 if (strncmp(direct_str, "i", 1) == 0)
5488 direct = FILTER_IN;
5489 else if (strncmp(direct_str, "o", 1) == 0)
5490 direct = FILTER_OUT;
5491
5492 ret = peer_prefix_list_unset(peer, afi, safi, direct);
5493
5494 return bgp_vty_return(vty, ret);
5495 }
5496
5497 DEFUN (neighbor_prefix_list,
5498 neighbor_prefix_list_cmd,
5499 "neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
5500 NEIGHBOR_STR
5501 NEIGHBOR_ADDR_STR2
5502 "Filter updates to/from this neighbor\n"
5503 "Name of a prefix list\n"
5504 "Filter incoming updates\n"
5505 "Filter outgoing updates\n")
5506 {
5507 int idx_peer = 1;
5508 int idx_word = 3;
5509 int idx_in_out = 4;
5510 return peer_prefix_list_set_vty(
5511 vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty),
5512 argv[idx_word]->arg, argv[idx_in_out]->arg);
5513 }
5514
5515 ALIAS_HIDDEN(neighbor_prefix_list, neighbor_prefix_list_hidden_cmd,
5516 "neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
5517 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5518 "Filter updates to/from this neighbor\n"
5519 "Name of a prefix list\n"
5520 "Filter incoming updates\n"
5521 "Filter outgoing updates\n")
5522
5523 DEFUN (no_neighbor_prefix_list,
5524 no_neighbor_prefix_list_cmd,
5525 "no neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
5526 NO_STR
5527 NEIGHBOR_STR
5528 NEIGHBOR_ADDR_STR2
5529 "Filter updates to/from this neighbor\n"
5530 "Name of a prefix list\n"
5531 "Filter incoming updates\n"
5532 "Filter outgoing updates\n")
5533 {
5534 int idx_peer = 2;
5535 int idx_in_out = 5;
5536 return peer_prefix_list_unset_vty(vty, argv[idx_peer]->arg,
5537 bgp_node_afi(vty), bgp_node_safi(vty),
5538 argv[idx_in_out]->arg);
5539 }
5540
5541 ALIAS_HIDDEN(no_neighbor_prefix_list, no_neighbor_prefix_list_hidden_cmd,
5542 "no neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
5543 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5544 "Filter updates to/from this neighbor\n"
5545 "Name of a prefix list\n"
5546 "Filter incoming updates\n"
5547 "Filter outgoing updates\n")
5548
5549 static int peer_aslist_set_vty(struct vty *vty, const char *ip_str, afi_t afi,
5550 safi_t safi, const char *name_str,
5551 const char *direct_str)
5552 {
5553 int ret;
5554 struct peer *peer;
5555 int direct = FILTER_IN;
5556
5557 peer = peer_and_group_lookup_vty(vty, ip_str);
5558 if (!peer)
5559 return CMD_WARNING_CONFIG_FAILED;
5560
5561 /* Check filter direction. */
5562 if (strncmp(direct_str, "i", 1) == 0)
5563 direct = FILTER_IN;
5564 else if (strncmp(direct_str, "o", 1) == 0)
5565 direct = FILTER_OUT;
5566
5567 ret = peer_aslist_set(peer, afi, safi, direct, name_str);
5568
5569 return bgp_vty_return(vty, ret);
5570 }
5571
5572 static int peer_aslist_unset_vty(struct vty *vty, const char *ip_str, afi_t afi,
5573 safi_t safi, const char *direct_str)
5574 {
5575 int ret;
5576 struct peer *peer;
5577 int direct = FILTER_IN;
5578
5579 peer = peer_and_group_lookup_vty(vty, ip_str);
5580 if (!peer)
5581 return CMD_WARNING_CONFIG_FAILED;
5582
5583 /* Check filter direction. */
5584 if (strncmp(direct_str, "i", 1) == 0)
5585 direct = FILTER_IN;
5586 else if (strncmp(direct_str, "o", 1) == 0)
5587 direct = FILTER_OUT;
5588
5589 ret = peer_aslist_unset(peer, afi, safi, direct);
5590
5591 return bgp_vty_return(vty, ret);
5592 }
5593
5594 DEFUN (neighbor_filter_list,
5595 neighbor_filter_list_cmd,
5596 "neighbor <A.B.C.D|X:X::X:X|WORD> filter-list WORD <in|out>",
5597 NEIGHBOR_STR
5598 NEIGHBOR_ADDR_STR2
5599 "Establish BGP filters\n"
5600 "AS path access-list name\n"
5601 "Filter incoming routes\n"
5602 "Filter outgoing routes\n")
5603 {
5604 int idx_peer = 1;
5605 int idx_word = 3;
5606 int idx_in_out = 4;
5607 return peer_aslist_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
5608 bgp_node_safi(vty), argv[idx_word]->arg,
5609 argv[idx_in_out]->arg);
5610 }
5611
5612 ALIAS_HIDDEN(neighbor_filter_list, neighbor_filter_list_hidden_cmd,
5613 "neighbor <A.B.C.D|X:X::X:X|WORD> filter-list WORD <in|out>",
5614 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5615 "Establish BGP filters\n"
5616 "AS path access-list name\n"
5617 "Filter incoming routes\n"
5618 "Filter outgoing routes\n")
5619
5620 DEFUN (no_neighbor_filter_list,
5621 no_neighbor_filter_list_cmd,
5622 "no neighbor <A.B.C.D|X:X::X:X|WORD> filter-list WORD <in|out>",
5623 NO_STR
5624 NEIGHBOR_STR
5625 NEIGHBOR_ADDR_STR2
5626 "Establish BGP filters\n"
5627 "AS path access-list name\n"
5628 "Filter incoming routes\n"
5629 "Filter outgoing routes\n")
5630 {
5631 int idx_peer = 2;
5632 int idx_in_out = 5;
5633 return peer_aslist_unset_vty(vty, argv[idx_peer]->arg,
5634 bgp_node_afi(vty), bgp_node_safi(vty),
5635 argv[idx_in_out]->arg);
5636 }
5637
5638 ALIAS_HIDDEN(no_neighbor_filter_list, no_neighbor_filter_list_hidden_cmd,
5639 "no neighbor <A.B.C.D|X:X::X:X|WORD> filter-list WORD <in|out>",
5640 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5641 "Establish BGP filters\n"
5642 "AS path access-list name\n"
5643 "Filter incoming routes\n"
5644 "Filter outgoing routes\n")
5645
5646 /* Set route-map to the peer. */
5647 static int peer_route_map_set_vty(struct vty *vty, const char *ip_str,
5648 afi_t afi, safi_t safi, const char *name_str,
5649 const char *direct_str)
5650 {
5651 int ret;
5652 struct peer *peer;
5653 int direct = RMAP_IN;
5654 struct route_map *route_map;
5655
5656 peer = peer_and_group_lookup_vty(vty, ip_str);
5657 if (!peer)
5658 return CMD_WARNING_CONFIG_FAILED;
5659
5660 /* Check filter direction. */
5661 if (strncmp(direct_str, "in", 2) == 0)
5662 direct = RMAP_IN;
5663 else if (strncmp(direct_str, "o", 1) == 0)
5664 direct = RMAP_OUT;
5665
5666 route_map = route_map_lookup_warn_noexist(vty, name_str);
5667 ret = peer_route_map_set(peer, afi, safi, direct, name_str, route_map);
5668
5669 return bgp_vty_return(vty, ret);
5670 }
5671
5672 static int peer_route_map_unset_vty(struct vty *vty, const char *ip_str,
5673 afi_t afi, safi_t safi,
5674 const char *direct_str)
5675 {
5676 int ret;
5677 struct peer *peer;
5678 int direct = RMAP_IN;
5679
5680 peer = peer_and_group_lookup_vty(vty, ip_str);
5681 if (!peer)
5682 return CMD_WARNING_CONFIG_FAILED;
5683
5684 /* Check filter direction. */
5685 if (strncmp(direct_str, "in", 2) == 0)
5686 direct = RMAP_IN;
5687 else if (strncmp(direct_str, "o", 1) == 0)
5688 direct = RMAP_OUT;
5689
5690 ret = peer_route_map_unset(peer, afi, safi, direct);
5691
5692 return bgp_vty_return(vty, ret);
5693 }
5694
5695 DEFUN (neighbor_route_map,
5696 neighbor_route_map_cmd,
5697 "neighbor <A.B.C.D|X:X::X:X|WORD> route-map WORD <in|out>",
5698 NEIGHBOR_STR
5699 NEIGHBOR_ADDR_STR2
5700 "Apply route map to neighbor\n"
5701 "Name of route map\n"
5702 "Apply map to incoming routes\n"
5703 "Apply map to outbound routes\n")
5704 {
5705 int idx_peer = 1;
5706 int idx_word = 3;
5707 int idx_in_out = 4;
5708 return peer_route_map_set_vty(
5709 vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty),
5710 argv[idx_word]->arg, argv[idx_in_out]->arg);
5711 }
5712
5713 ALIAS_HIDDEN(neighbor_route_map, neighbor_route_map_hidden_cmd,
5714 "neighbor <A.B.C.D|X:X::X:X|WORD> route-map WORD <in|out>",
5715 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5716 "Apply route map to neighbor\n"
5717 "Name of route map\n"
5718 "Apply map to incoming routes\n"
5719 "Apply map to outbound routes\n")
5720
5721 DEFUN (no_neighbor_route_map,
5722 no_neighbor_route_map_cmd,
5723 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-map WORD <in|out>",
5724 NO_STR
5725 NEIGHBOR_STR
5726 NEIGHBOR_ADDR_STR2
5727 "Apply route map to neighbor\n"
5728 "Name of route map\n"
5729 "Apply map to incoming routes\n"
5730 "Apply map to outbound routes\n")
5731 {
5732 int idx_peer = 2;
5733 int idx_in_out = 5;
5734 return peer_route_map_unset_vty(vty, argv[idx_peer]->arg,
5735 bgp_node_afi(vty), bgp_node_safi(vty),
5736 argv[idx_in_out]->arg);
5737 }
5738
5739 ALIAS_HIDDEN(no_neighbor_route_map, no_neighbor_route_map_hidden_cmd,
5740 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-map WORD <in|out>",
5741 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5742 "Apply route map to neighbor\n"
5743 "Name of route map\n"
5744 "Apply map to incoming routes\n"
5745 "Apply map to outbound routes\n")
5746
5747 /* Set unsuppress-map to the peer. */
5748 static int peer_unsuppress_map_set_vty(struct vty *vty, const char *ip_str,
5749 afi_t afi, safi_t safi,
5750 const char *name_str)
5751 {
5752 int ret;
5753 struct peer *peer;
5754 struct route_map *route_map;
5755
5756 peer = peer_and_group_lookup_vty(vty, ip_str);
5757 if (!peer)
5758 return CMD_WARNING_CONFIG_FAILED;
5759
5760 route_map = route_map_lookup_warn_noexist(vty, name_str);
5761 ret = peer_unsuppress_map_set(peer, afi, safi, name_str, route_map);
5762
5763 return bgp_vty_return(vty, ret);
5764 }
5765
5766 /* Unset route-map from the peer. */
5767 static int peer_unsuppress_map_unset_vty(struct vty *vty, const char *ip_str,
5768 afi_t afi, safi_t safi)
5769 {
5770 int ret;
5771 struct peer *peer;
5772
5773 peer = peer_and_group_lookup_vty(vty, ip_str);
5774 if (!peer)
5775 return CMD_WARNING_CONFIG_FAILED;
5776
5777 ret = peer_unsuppress_map_unset(peer, afi, safi);
5778
5779 return bgp_vty_return(vty, ret);
5780 }
5781
5782 DEFUN (neighbor_unsuppress_map,
5783 neighbor_unsuppress_map_cmd,
5784 "neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
5785 NEIGHBOR_STR
5786 NEIGHBOR_ADDR_STR2
5787 "Route-map to selectively unsuppress suppressed routes\n"
5788 "Name of route map\n")
5789 {
5790 int idx_peer = 1;
5791 int idx_word = 3;
5792 return peer_unsuppress_map_set_vty(
5793 vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty),
5794 argv[idx_word]->arg);
5795 }
5796
5797 ALIAS_HIDDEN(neighbor_unsuppress_map, neighbor_unsuppress_map_hidden_cmd,
5798 "neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
5799 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5800 "Route-map to selectively unsuppress suppressed routes\n"
5801 "Name of route map\n")
5802
5803 DEFUN (no_neighbor_unsuppress_map,
5804 no_neighbor_unsuppress_map_cmd,
5805 "no neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
5806 NO_STR
5807 NEIGHBOR_STR
5808 NEIGHBOR_ADDR_STR2
5809 "Route-map to selectively unsuppress suppressed routes\n"
5810 "Name of route map\n")
5811 {
5812 int idx_peer = 2;
5813 return peer_unsuppress_map_unset_vty(vty, argv[idx_peer]->arg,
5814 bgp_node_afi(vty),
5815 bgp_node_safi(vty));
5816 }
5817
5818 ALIAS_HIDDEN(no_neighbor_unsuppress_map, no_neighbor_unsuppress_map_hidden_cmd,
5819 "no neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
5820 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5821 "Route-map to selectively unsuppress suppressed routes\n"
5822 "Name of route map\n")
5823
5824 static int peer_maximum_prefix_set_vty(struct vty *vty, const char *ip_str,
5825 afi_t afi, safi_t safi,
5826 const char *num_str,
5827 const char *threshold_str, int warning,
5828 const char *restart_str)
5829 {
5830 int ret;
5831 struct peer *peer;
5832 uint32_t max;
5833 uint8_t threshold;
5834 uint16_t restart;
5835
5836 peer = peer_and_group_lookup_vty(vty, ip_str);
5837 if (!peer)
5838 return CMD_WARNING_CONFIG_FAILED;
5839
5840 max = strtoul(num_str, NULL, 10);
5841 if (threshold_str)
5842 threshold = atoi(threshold_str);
5843 else
5844 threshold = MAXIMUM_PREFIX_THRESHOLD_DEFAULT;
5845
5846 if (restart_str)
5847 restart = atoi(restart_str);
5848 else
5849 restart = 0;
5850
5851 ret = peer_maximum_prefix_set(peer, afi, safi, max, threshold, warning,
5852 restart);
5853
5854 return bgp_vty_return(vty, ret);
5855 }
5856
5857 static int peer_maximum_prefix_unset_vty(struct vty *vty, const char *ip_str,
5858 afi_t afi, safi_t safi)
5859 {
5860 int ret;
5861 struct peer *peer;
5862
5863 peer = peer_and_group_lookup_vty(vty, ip_str);
5864 if (!peer)
5865 return CMD_WARNING_CONFIG_FAILED;
5866
5867 ret = peer_maximum_prefix_unset(peer, afi, safi);
5868
5869 return bgp_vty_return(vty, ret);
5870 }
5871
5872 /* Maximum number of prefix configuration. prefix count is different
5873 for each peer configuration. So this configuration can be set for
5874 each peer configuration. */
5875 DEFUN (neighbor_maximum_prefix,
5876 neighbor_maximum_prefix_cmd,
5877 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295)",
5878 NEIGHBOR_STR
5879 NEIGHBOR_ADDR_STR2
5880 "Maximum number of prefix accept from this peer\n"
5881 "maximum no. of prefix limit\n")
5882 {
5883 int idx_peer = 1;
5884 int idx_number = 3;
5885 return peer_maximum_prefix_set_vty(
5886 vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty),
5887 argv[idx_number]->arg, NULL, 0, NULL);
5888 }
5889
5890 ALIAS_HIDDEN(neighbor_maximum_prefix, neighbor_maximum_prefix_hidden_cmd,
5891 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295)",
5892 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5893 "Maximum number of prefix accept from this peer\n"
5894 "maximum no. of prefix limit\n")
5895
5896 DEFUN (neighbor_maximum_prefix_threshold,
5897 neighbor_maximum_prefix_threshold_cmd,
5898 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100)",
5899 NEIGHBOR_STR
5900 NEIGHBOR_ADDR_STR2
5901 "Maximum number of prefix accept from this peer\n"
5902 "maximum no. of prefix limit\n"
5903 "Threshold value (%) at which to generate a warning msg\n")
5904 {
5905 int idx_peer = 1;
5906 int idx_number = 3;
5907 int idx_number_2 = 4;
5908 return peer_maximum_prefix_set_vty(
5909 vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty),
5910 argv[idx_number]->arg, argv[idx_number_2]->arg, 0, NULL);
5911 }
5912
5913 ALIAS_HIDDEN(
5914 neighbor_maximum_prefix_threshold,
5915 neighbor_maximum_prefix_threshold_hidden_cmd,
5916 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100)",
5917 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5918 "Maximum number of prefix accept from this peer\n"
5919 "maximum no. of prefix limit\n"
5920 "Threshold value (%) at which to generate a warning msg\n")
5921
5922 DEFUN (neighbor_maximum_prefix_warning,
5923 neighbor_maximum_prefix_warning_cmd,
5924 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) warning-only",
5925 NEIGHBOR_STR
5926 NEIGHBOR_ADDR_STR2
5927 "Maximum number of prefix accept from this peer\n"
5928 "maximum no. of prefix limit\n"
5929 "Only give warning message when limit is exceeded\n")
5930 {
5931 int idx_peer = 1;
5932 int idx_number = 3;
5933 return peer_maximum_prefix_set_vty(
5934 vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty),
5935 argv[idx_number]->arg, NULL, 1, NULL);
5936 }
5937
5938 ALIAS_HIDDEN(
5939 neighbor_maximum_prefix_warning,
5940 neighbor_maximum_prefix_warning_hidden_cmd,
5941 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) warning-only",
5942 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5943 "Maximum number of prefix accept from this peer\n"
5944 "maximum no. of prefix limit\n"
5945 "Only give warning message when limit is exceeded\n")
5946
5947 DEFUN (neighbor_maximum_prefix_threshold_warning,
5948 neighbor_maximum_prefix_threshold_warning_cmd,
5949 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) warning-only",
5950 NEIGHBOR_STR
5951 NEIGHBOR_ADDR_STR2
5952 "Maximum number of prefix accept from this peer\n"
5953 "maximum no. of prefix limit\n"
5954 "Threshold value (%) at which to generate a warning msg\n"
5955 "Only give warning message when limit is exceeded\n")
5956 {
5957 int idx_peer = 1;
5958 int idx_number = 3;
5959 int idx_number_2 = 4;
5960 return peer_maximum_prefix_set_vty(
5961 vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty),
5962 argv[idx_number]->arg, argv[idx_number_2]->arg, 1, NULL);
5963 }
5964
5965 ALIAS_HIDDEN(
5966 neighbor_maximum_prefix_threshold_warning,
5967 neighbor_maximum_prefix_threshold_warning_hidden_cmd,
5968 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) warning-only",
5969 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5970 "Maximum number of prefix accept from this peer\n"
5971 "maximum no. of prefix limit\n"
5972 "Threshold value (%) at which to generate a warning msg\n"
5973 "Only give warning message when limit is exceeded\n")
5974
5975 DEFUN (neighbor_maximum_prefix_restart,
5976 neighbor_maximum_prefix_restart_cmd,
5977 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) restart (1-65535)",
5978 NEIGHBOR_STR
5979 NEIGHBOR_ADDR_STR2
5980 "Maximum number of prefix accept from this peer\n"
5981 "maximum no. of prefix limit\n"
5982 "Restart bgp connection after limit is exceeded\n"
5983 "Restart interval in minutes\n")
5984 {
5985 int idx_peer = 1;
5986 int idx_number = 3;
5987 int idx_number_2 = 5;
5988 return peer_maximum_prefix_set_vty(
5989 vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty),
5990 argv[idx_number]->arg, NULL, 0, argv[idx_number_2]->arg);
5991 }
5992
5993 ALIAS_HIDDEN(
5994 neighbor_maximum_prefix_restart,
5995 neighbor_maximum_prefix_restart_hidden_cmd,
5996 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) restart (1-65535)",
5997 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5998 "Maximum number of prefix accept from this peer\n"
5999 "maximum no. of prefix limit\n"
6000 "Restart bgp connection after limit is exceeded\n"
6001 "Restart interval in minutes\n")
6002
6003 DEFUN (neighbor_maximum_prefix_threshold_restart,
6004 neighbor_maximum_prefix_threshold_restart_cmd,
6005 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) restart (1-65535)",
6006 NEIGHBOR_STR
6007 NEIGHBOR_ADDR_STR2
6008 "Maximum number of prefixes to accept from this peer\n"
6009 "maximum no. of prefix limit\n"
6010 "Threshold value (%) at which to generate a warning msg\n"
6011 "Restart bgp connection after limit is exceeded\n"
6012 "Restart interval in minutes\n")
6013 {
6014 int idx_peer = 1;
6015 int idx_number = 3;
6016 int idx_number_2 = 4;
6017 int idx_number_3 = 6;
6018 return peer_maximum_prefix_set_vty(
6019 vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty),
6020 argv[idx_number]->arg, argv[idx_number_2]->arg, 0,
6021 argv[idx_number_3]->arg);
6022 }
6023
6024 ALIAS_HIDDEN(
6025 neighbor_maximum_prefix_threshold_restart,
6026 neighbor_maximum_prefix_threshold_restart_hidden_cmd,
6027 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) restart (1-65535)",
6028 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6029 "Maximum number of prefixes to accept from this peer\n"
6030 "maximum no. of prefix limit\n"
6031 "Threshold value (%) at which to generate a warning msg\n"
6032 "Restart bgp connection after limit is exceeded\n"
6033 "Restart interval in minutes\n")
6034
6035 DEFUN (no_neighbor_maximum_prefix,
6036 no_neighbor_maximum_prefix_cmd,
6037 "no neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix [(1-4294967295) [(1-100)] [restart (1-65535)] [warning-only]]",
6038 NO_STR
6039 NEIGHBOR_STR
6040 NEIGHBOR_ADDR_STR2
6041 "Maximum number of prefixes to accept from this peer\n"
6042 "maximum no. of prefix limit\n"
6043 "Threshold value (%) at which to generate a warning msg\n"
6044 "Restart bgp connection after limit is exceeded\n"
6045 "Restart interval in minutes\n"
6046 "Only give warning message when limit is exceeded\n")
6047 {
6048 int idx_peer = 2;
6049 return peer_maximum_prefix_unset_vty(vty, argv[idx_peer]->arg,
6050 bgp_node_afi(vty),
6051 bgp_node_safi(vty));
6052 }
6053
6054 ALIAS_HIDDEN(
6055 no_neighbor_maximum_prefix, no_neighbor_maximum_prefix_hidden_cmd,
6056 "no neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix [(1-4294967295) [(1-100)] [restart (1-65535)] [warning-only]]",
6057 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6058 "Maximum number of prefixes to accept from this peer\n"
6059 "maximum no. of prefix limit\n"
6060 "Threshold value (%) at which to generate a warning msg\n"
6061 "Restart bgp connection after limit is exceeded\n"
6062 "Restart interval in minutes\n"
6063 "Only give warning message when limit is exceeded\n")
6064
6065
6066 /* "neighbor allowas-in" */
6067 DEFUN (neighbor_allowas_in,
6068 neighbor_allowas_in_cmd,
6069 "neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
6070 NEIGHBOR_STR
6071 NEIGHBOR_ADDR_STR2
6072 "Accept as-path with my AS present in it\n"
6073 "Number of occurences of AS number\n"
6074 "Only accept my AS in the as-path if the route was originated in my AS\n")
6075 {
6076 int idx_peer = 1;
6077 int idx_number_origin = 3;
6078 int ret;
6079 int origin = 0;
6080 struct peer *peer;
6081 int allow_num = 0;
6082
6083 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
6084 if (!peer)
6085 return CMD_WARNING_CONFIG_FAILED;
6086
6087 if (argc <= idx_number_origin)
6088 allow_num = 3;
6089 else {
6090 if (argv[idx_number_origin]->type == WORD_TKN)
6091 origin = 1;
6092 else
6093 allow_num = atoi(argv[idx_number_origin]->arg);
6094 }
6095
6096 ret = peer_allowas_in_set(peer, bgp_node_afi(vty), bgp_node_safi(vty),
6097 allow_num, origin);
6098
6099 return bgp_vty_return(vty, ret);
6100 }
6101
6102 ALIAS_HIDDEN(
6103 neighbor_allowas_in, neighbor_allowas_in_hidden_cmd,
6104 "neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
6105 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6106 "Accept as-path with my AS present in it\n"
6107 "Number of occurences of AS number\n"
6108 "Only accept my AS in the as-path if the route was originated in my AS\n")
6109
6110 DEFUN (no_neighbor_allowas_in,
6111 no_neighbor_allowas_in_cmd,
6112 "no neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
6113 NO_STR
6114 NEIGHBOR_STR
6115 NEIGHBOR_ADDR_STR2
6116 "allow local ASN appears in aspath attribute\n"
6117 "Number of occurences of AS number\n"
6118 "Only accept my AS in the as-path if the route was originated in my AS\n")
6119 {
6120 int idx_peer = 2;
6121 int ret;
6122 struct peer *peer;
6123
6124 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
6125 if (!peer)
6126 return CMD_WARNING_CONFIG_FAILED;
6127
6128 ret = peer_allowas_in_unset(peer, bgp_node_afi(vty),
6129 bgp_node_safi(vty));
6130
6131 return bgp_vty_return(vty, ret);
6132 }
6133
6134 ALIAS_HIDDEN(
6135 no_neighbor_allowas_in, no_neighbor_allowas_in_hidden_cmd,
6136 "no neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
6137 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6138 "allow local ASN appears in aspath attribute\n"
6139 "Number of occurences of AS number\n"
6140 "Only accept my AS in the as-path if the route was originated in my AS\n")
6141
6142 DEFUN (neighbor_ttl_security,
6143 neighbor_ttl_security_cmd,
6144 "neighbor <A.B.C.D|X:X::X:X|WORD> ttl-security hops (1-254)",
6145 NEIGHBOR_STR
6146 NEIGHBOR_ADDR_STR2
6147 "BGP ttl-security parameters\n"
6148 "Specify the maximum number of hops to the BGP peer\n"
6149 "Number of hops to BGP peer\n")
6150 {
6151 int idx_peer = 1;
6152 int idx_number = 4;
6153 struct peer *peer;
6154 int gtsm_hops;
6155
6156 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
6157 if (!peer)
6158 return CMD_WARNING_CONFIG_FAILED;
6159
6160 gtsm_hops = strtoul(argv[idx_number]->arg, NULL, 10);
6161
6162 /*
6163 * If 'neighbor swpX', then this is for directly connected peers,
6164 * we should not accept a ttl-security hops value greater than 1.
6165 */
6166 if (peer->conf_if && (gtsm_hops > 1)) {
6167 vty_out(vty,
6168 "%s is directly connected peer, hops cannot exceed 1\n",
6169 argv[idx_peer]->arg);
6170 return CMD_WARNING_CONFIG_FAILED;
6171 }
6172
6173 return bgp_vty_return(vty, peer_ttl_security_hops_set(peer, gtsm_hops));
6174 }
6175
6176 DEFUN (no_neighbor_ttl_security,
6177 no_neighbor_ttl_security_cmd,
6178 "no neighbor <A.B.C.D|X:X::X:X|WORD> ttl-security hops (1-254)",
6179 NO_STR
6180 NEIGHBOR_STR
6181 NEIGHBOR_ADDR_STR2
6182 "BGP ttl-security parameters\n"
6183 "Specify the maximum number of hops to the BGP peer\n"
6184 "Number of hops to BGP peer\n")
6185 {
6186 int idx_peer = 2;
6187 struct peer *peer;
6188
6189 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
6190 if (!peer)
6191 return CMD_WARNING_CONFIG_FAILED;
6192
6193 return bgp_vty_return(vty, peer_ttl_security_hops_unset(peer));
6194 }
6195
6196 DEFUN (neighbor_addpath_tx_all_paths,
6197 neighbor_addpath_tx_all_paths_cmd,
6198 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
6199 NEIGHBOR_STR
6200 NEIGHBOR_ADDR_STR2
6201 "Use addpath to advertise all paths to a neighbor\n")
6202 {
6203 int idx_peer = 1;
6204 struct peer *peer;
6205
6206 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
6207 if (!peer)
6208 return CMD_WARNING_CONFIG_FAILED;
6209
6210 bgp_addpath_set_peer_type(peer, bgp_node_afi(vty), bgp_node_safi(vty),
6211 BGP_ADDPATH_ALL);
6212 return CMD_SUCCESS;
6213 }
6214
6215 ALIAS_HIDDEN(neighbor_addpath_tx_all_paths,
6216 neighbor_addpath_tx_all_paths_hidden_cmd,
6217 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
6218 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6219 "Use addpath to advertise all paths to a neighbor\n")
6220
6221 DEFUN (no_neighbor_addpath_tx_all_paths,
6222 no_neighbor_addpath_tx_all_paths_cmd,
6223 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
6224 NO_STR
6225 NEIGHBOR_STR
6226 NEIGHBOR_ADDR_STR2
6227 "Use addpath to advertise all paths to a neighbor\n")
6228 {
6229 int idx_peer = 2;
6230 struct peer *peer;
6231
6232 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
6233 if (!peer)
6234 return CMD_WARNING_CONFIG_FAILED;
6235
6236 if (peer->addpath_type[bgp_node_afi(vty)][bgp_node_safi(vty)]
6237 != BGP_ADDPATH_ALL) {
6238 vty_out(vty,
6239 "%% Peer not currently configured to transmit all paths.");
6240 return CMD_WARNING_CONFIG_FAILED;
6241 }
6242
6243 bgp_addpath_set_peer_type(peer, bgp_node_afi(vty), bgp_node_safi(vty),
6244 BGP_ADDPATH_NONE);
6245
6246 return CMD_SUCCESS;
6247 }
6248
6249 ALIAS_HIDDEN(no_neighbor_addpath_tx_all_paths,
6250 no_neighbor_addpath_tx_all_paths_hidden_cmd,
6251 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
6252 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6253 "Use addpath to advertise all paths to a neighbor\n")
6254
6255 DEFUN (neighbor_addpath_tx_bestpath_per_as,
6256 neighbor_addpath_tx_bestpath_per_as_cmd,
6257 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
6258 NEIGHBOR_STR
6259 NEIGHBOR_ADDR_STR2
6260 "Use addpath to advertise the bestpath per each neighboring AS\n")
6261 {
6262 int idx_peer = 1;
6263 struct peer *peer;
6264
6265 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
6266 if (!peer)
6267 return CMD_WARNING_CONFIG_FAILED;
6268
6269 bgp_addpath_set_peer_type(peer, bgp_node_afi(vty), bgp_node_safi(vty),
6270 BGP_ADDPATH_BEST_PER_AS);
6271
6272 return CMD_SUCCESS;
6273 }
6274
6275 ALIAS_HIDDEN(neighbor_addpath_tx_bestpath_per_as,
6276 neighbor_addpath_tx_bestpath_per_as_hidden_cmd,
6277 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
6278 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6279 "Use addpath to advertise the bestpath per each neighboring AS\n")
6280
6281 DEFUN (no_neighbor_addpath_tx_bestpath_per_as,
6282 no_neighbor_addpath_tx_bestpath_per_as_cmd,
6283 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
6284 NO_STR
6285 NEIGHBOR_STR
6286 NEIGHBOR_ADDR_STR2
6287 "Use addpath to advertise the bestpath per each neighboring AS\n")
6288 {
6289 int idx_peer = 2;
6290 struct peer *peer;
6291
6292 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
6293 if (!peer)
6294 return CMD_WARNING_CONFIG_FAILED;
6295
6296 if (peer->addpath_type[bgp_node_afi(vty)][bgp_node_safi(vty)]
6297 != BGP_ADDPATH_BEST_PER_AS) {
6298 vty_out(vty,
6299 "%% Peer not currently configured to transmit all best path per as.");
6300 return CMD_WARNING_CONFIG_FAILED;
6301 }
6302
6303 bgp_addpath_set_peer_type(peer, bgp_node_afi(vty), bgp_node_safi(vty),
6304 BGP_ADDPATH_NONE);
6305
6306 return CMD_SUCCESS;
6307 }
6308
6309 ALIAS_HIDDEN(no_neighbor_addpath_tx_bestpath_per_as,
6310 no_neighbor_addpath_tx_bestpath_per_as_hidden_cmd,
6311 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
6312 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6313 "Use addpath to advertise the bestpath per each neighboring AS\n")
6314
6315 static int set_ecom_list(struct vty *vty, int argc, struct cmd_token **argv,
6316 struct ecommunity **list)
6317 {
6318 struct ecommunity *ecom = NULL;
6319 struct ecommunity *ecomadd;
6320
6321 for (; argc; --argc, ++argv) {
6322
6323 ecomadd = ecommunity_str2com(argv[0]->arg,
6324 ECOMMUNITY_ROUTE_TARGET, 0);
6325 if (!ecomadd) {
6326 vty_out(vty, "Malformed community-list value\n");
6327 if (ecom)
6328 ecommunity_free(&ecom);
6329 return CMD_WARNING_CONFIG_FAILED;
6330 }
6331
6332 if (ecom) {
6333 ecommunity_merge(ecom, ecomadd);
6334 ecommunity_free(&ecomadd);
6335 } else {
6336 ecom = ecomadd;
6337 }
6338 }
6339
6340 if (*list) {
6341 ecommunity_free(&*list);
6342 }
6343 *list = ecom;
6344
6345 return CMD_SUCCESS;
6346 }
6347
6348 /*
6349 * v2vimport is true if we are handling a `import vrf ...` command
6350 */
6351 static afi_t vpn_policy_getafi(struct vty *vty, struct bgp *bgp, bool v2vimport)
6352 {
6353 afi_t afi;
6354
6355 switch (vty->node) {
6356 case BGP_IPV4_NODE:
6357 afi = AFI_IP;
6358 break;
6359 case BGP_IPV6_NODE:
6360 afi = AFI_IP6;
6361 break;
6362 default:
6363 vty_out(vty,
6364 "%% context error: valid only in address-family <ipv4|ipv6> unicast block\n");
6365 return AFI_MAX;
6366 }
6367
6368 if (!v2vimport) {
6369 if (CHECK_FLAG(bgp->af_flags[afi][SAFI_UNICAST],
6370 BGP_CONFIG_VRF_TO_VRF_IMPORT)
6371 || CHECK_FLAG(bgp->af_flags[afi][SAFI_UNICAST],
6372 BGP_CONFIG_VRF_TO_VRF_EXPORT)) {
6373 vty_out(vty,
6374 "%% error: Please unconfigure import vrf commands before using vpn commands\n");
6375 return AFI_MAX;
6376 }
6377 } else {
6378 if (CHECK_FLAG(bgp->af_flags[afi][SAFI_UNICAST],
6379 BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT)
6380 || CHECK_FLAG(bgp->af_flags[afi][SAFI_UNICAST],
6381 BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT)) {
6382 vty_out(vty,
6383 "%% error: Please unconfigure vpn to vrf commands before using import vrf commands\n");
6384 return AFI_MAX;
6385 }
6386 }
6387 return afi;
6388 }
6389
6390 DEFPY (af_rd_vpn_export,
6391 af_rd_vpn_export_cmd,
6392 "[no] rd vpn export ASN:NN_OR_IP-ADDRESS:NN$rd_str",
6393 NO_STR
6394 "Specify route distinguisher\n"
6395 "Between current address-family and vpn\n"
6396 "For routes leaked from current address-family to vpn\n"
6397 "Route Distinguisher (<as-number>:<number> | <ip-address>:<number>)\n")
6398 {
6399 VTY_DECLVAR_CONTEXT(bgp, bgp);
6400 struct prefix_rd prd;
6401 int ret;
6402 afi_t afi;
6403 int idx = 0;
6404 int yes = 1;
6405
6406 if (argv_find(argv, argc, "no", &idx))
6407 yes = 0;
6408
6409 if (yes) {
6410 ret = str2prefix_rd(rd_str, &prd);
6411 if (!ret) {
6412 vty_out(vty, "%% Malformed rd\n");
6413 return CMD_WARNING_CONFIG_FAILED;
6414 }
6415 }
6416
6417 afi = vpn_policy_getafi(vty, bgp, false);
6418 if (afi == AFI_MAX)
6419 return CMD_WARNING_CONFIG_FAILED;
6420
6421 /*
6422 * pre-change: un-export vpn routes (vpn->vrf routes unaffected)
6423 */
6424 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN, afi,
6425 bgp_get_default(), bgp);
6426
6427 if (yes) {
6428 bgp->vpn_policy[afi].tovpn_rd = prd;
6429 SET_FLAG(bgp->vpn_policy[afi].flags,
6430 BGP_VPN_POLICY_TOVPN_RD_SET);
6431 } else {
6432 UNSET_FLAG(bgp->vpn_policy[afi].flags,
6433 BGP_VPN_POLICY_TOVPN_RD_SET);
6434 }
6435
6436 /* post-change: re-export vpn routes */
6437 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN, afi,
6438 bgp_get_default(), bgp);
6439
6440 return CMD_SUCCESS;
6441 }
6442
6443 ALIAS (af_rd_vpn_export,
6444 af_no_rd_vpn_export_cmd,
6445 "no rd vpn export",
6446 NO_STR
6447 "Specify route distinguisher\n"
6448 "Between current address-family and vpn\n"
6449 "For routes leaked from current address-family to vpn\n")
6450
6451 DEFPY (af_label_vpn_export,
6452 af_label_vpn_export_cmd,
6453 "[no] label vpn export <(0-1048575)$label_val|auto$label_auto>",
6454 NO_STR
6455 "label value for VRF\n"
6456 "Between current address-family and vpn\n"
6457 "For routes leaked from current address-family to vpn\n"
6458 "Label Value <0-1048575>\n"
6459 "Automatically assign a label\n")
6460 {
6461 VTY_DECLVAR_CONTEXT(bgp, bgp);
6462 mpls_label_t label = MPLS_LABEL_NONE;
6463 afi_t afi;
6464 int idx = 0;
6465 int yes = 1;
6466
6467 if (argv_find(argv, argc, "no", &idx))
6468 yes = 0;
6469
6470 /* If "no ...", squash trailing parameter */
6471 if (!yes)
6472 label_auto = NULL;
6473
6474 if (yes) {
6475 if (!label_auto)
6476 label = label_val; /* parser should force unsigned */
6477 }
6478
6479 afi = vpn_policy_getafi(vty, bgp, false);
6480 if (afi == AFI_MAX)
6481 return CMD_WARNING_CONFIG_FAILED;
6482
6483
6484 if (label_auto && CHECK_FLAG(bgp->vpn_policy[afi].flags,
6485 BGP_VPN_POLICY_TOVPN_LABEL_AUTO))
6486 /* no change */
6487 return CMD_SUCCESS;
6488
6489 /*
6490 * pre-change: un-export vpn routes (vpn->vrf routes unaffected)
6491 */
6492 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN, afi,
6493 bgp_get_default(), bgp);
6494
6495 if (!label_auto && CHECK_FLAG(bgp->vpn_policy[afi].flags,
6496 BGP_VPN_POLICY_TOVPN_LABEL_AUTO)) {
6497
6498 if (bgp->vpn_policy[afi].tovpn_label != MPLS_LABEL_NONE) {
6499
6500 /*
6501 * label has previously been automatically
6502 * assigned by labelpool: release it
6503 *
6504 * NB if tovpn_label == MPLS_LABEL_NONE it
6505 * means the automatic assignment is in flight
6506 * and therefore the labelpool callback must
6507 * detect that the auto label is not needed.
6508 */
6509
6510 bgp_lp_release(LP_TYPE_VRF,
6511 &bgp->vpn_policy[afi],
6512 bgp->vpn_policy[afi].tovpn_label);
6513 }
6514 UNSET_FLAG(bgp->vpn_policy[afi].flags,
6515 BGP_VPN_POLICY_TOVPN_LABEL_AUTO);
6516 }
6517
6518 bgp->vpn_policy[afi].tovpn_label = label;
6519 if (label_auto) {
6520 SET_FLAG(bgp->vpn_policy[afi].flags,
6521 BGP_VPN_POLICY_TOVPN_LABEL_AUTO);
6522 bgp_lp_get(LP_TYPE_VRF, &bgp->vpn_policy[afi],
6523 vpn_leak_label_callback);
6524 }
6525
6526 /* post-change: re-export vpn routes */
6527 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN, afi,
6528 bgp_get_default(), bgp);
6529
6530 return CMD_SUCCESS;
6531 }
6532
6533 ALIAS (af_label_vpn_export,
6534 af_no_label_vpn_export_cmd,
6535 "no label vpn export",
6536 NO_STR
6537 "label value for VRF\n"
6538 "Between current address-family and vpn\n"
6539 "For routes leaked from current address-family to vpn\n")
6540
6541 DEFPY (af_nexthop_vpn_export,
6542 af_nexthop_vpn_export_cmd,
6543 "[no] nexthop vpn export <A.B.C.D|X:X::X:X>$nexthop_str",
6544 NO_STR
6545 "Specify next hop to use for VRF advertised prefixes\n"
6546 "Between current address-family and vpn\n"
6547 "For routes leaked from current address-family to vpn\n"
6548 "IPv4 prefix\n"
6549 "IPv6 prefix\n")
6550 {
6551 VTY_DECLVAR_CONTEXT(bgp, bgp);
6552 afi_t afi;
6553 struct prefix p;
6554 int idx = 0;
6555 int yes = 1;
6556
6557 if (argv_find(argv, argc, "no", &idx))
6558 yes = 0;
6559
6560 if (yes) {
6561 if (!sockunion2hostprefix(nexthop_str, &p))
6562 return CMD_WARNING_CONFIG_FAILED;
6563 }
6564
6565 afi = vpn_policy_getafi(vty, bgp, false);
6566 if (afi == AFI_MAX)
6567 return CMD_WARNING_CONFIG_FAILED;
6568
6569 /*
6570 * pre-change: un-export vpn routes (vpn->vrf routes unaffected)
6571 */
6572 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN, afi,
6573 bgp_get_default(), bgp);
6574
6575 if (yes) {
6576 bgp->vpn_policy[afi].tovpn_nexthop = p;
6577 SET_FLAG(bgp->vpn_policy[afi].flags,
6578 BGP_VPN_POLICY_TOVPN_NEXTHOP_SET);
6579 } else {
6580 UNSET_FLAG(bgp->vpn_policy[afi].flags,
6581 BGP_VPN_POLICY_TOVPN_NEXTHOP_SET);
6582 }
6583
6584 /* post-change: re-export vpn routes */
6585 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN, afi,
6586 bgp_get_default(), bgp);
6587
6588 return CMD_SUCCESS;
6589 }
6590
6591 ALIAS (af_nexthop_vpn_export,
6592 af_no_nexthop_vpn_export_cmd,
6593 "no nexthop vpn export",
6594 NO_STR
6595 "Specify next hop to use for VRF advertised prefixes\n"
6596 "Between current address-family and vpn\n"
6597 "For routes leaked from current address-family to vpn\n")
6598
6599 static int vpn_policy_getdirs(struct vty *vty, const char *dstr, int *dodir)
6600 {
6601 if (!strcmp(dstr, "import")) {
6602 dodir[BGP_VPN_POLICY_DIR_FROMVPN] = 1;
6603 } else if (!strcmp(dstr, "export")) {
6604 dodir[BGP_VPN_POLICY_DIR_TOVPN] = 1;
6605 } else if (!strcmp(dstr, "both")) {
6606 dodir[BGP_VPN_POLICY_DIR_FROMVPN] = 1;
6607 dodir[BGP_VPN_POLICY_DIR_TOVPN] = 1;
6608 } else {
6609 vty_out(vty, "%% direction parse error\n");
6610 return CMD_WARNING_CONFIG_FAILED;
6611 }
6612 return CMD_SUCCESS;
6613 }
6614
6615 DEFPY (af_rt_vpn_imexport,
6616 af_rt_vpn_imexport_cmd,
6617 "[no] <rt|route-target> vpn <import|export|both>$direction_str RTLIST...",
6618 NO_STR
6619 "Specify route target list\n"
6620 "Specify route target list\n"
6621 "Between current address-family and vpn\n"
6622 "For routes leaked from vpn to current address-family: match any\n"
6623 "For routes leaked from current address-family to vpn: set\n"
6624 "both import: match any and export: set\n"
6625 "Space separated route target list (A.B.C.D:MN|EF:OPQR|GHJK:MN)\n")
6626 {
6627 VTY_DECLVAR_CONTEXT(bgp, bgp);
6628 int ret;
6629 struct ecommunity *ecom = NULL;
6630 int dodir[BGP_VPN_POLICY_DIR_MAX] = {0};
6631 vpn_policy_direction_t dir;
6632 afi_t afi;
6633 int idx = 0;
6634 int yes = 1;
6635
6636 if (argv_find(argv, argc, "no", &idx))
6637 yes = 0;
6638
6639 afi = vpn_policy_getafi(vty, bgp, false);
6640 if (afi == AFI_MAX)
6641 return CMD_WARNING_CONFIG_FAILED;
6642
6643 ret = vpn_policy_getdirs(vty, direction_str, dodir);
6644 if (ret != CMD_SUCCESS)
6645 return ret;
6646
6647 if (yes) {
6648 if (!argv_find(argv, argc, "RTLIST", &idx)) {
6649 vty_out(vty, "%% Missing RTLIST\n");
6650 return CMD_WARNING_CONFIG_FAILED;
6651 }
6652 ret = set_ecom_list(vty, argc - idx, argv + idx, &ecom);
6653 if (ret != CMD_SUCCESS) {
6654 return ret;
6655 }
6656 }
6657
6658 for (dir = 0; dir < BGP_VPN_POLICY_DIR_MAX; ++dir) {
6659 if (!dodir[dir])
6660 continue;
6661
6662 vpn_leak_prechange(dir, afi, bgp_get_default(), bgp);
6663
6664 if (yes) {
6665 if (bgp->vpn_policy[afi].rtlist[dir])
6666 ecommunity_free(
6667 &bgp->vpn_policy[afi].rtlist[dir]);
6668 bgp->vpn_policy[afi].rtlist[dir] =
6669 ecommunity_dup(ecom);
6670 } else {
6671 if (bgp->vpn_policy[afi].rtlist[dir])
6672 ecommunity_free(
6673 &bgp->vpn_policy[afi].rtlist[dir]);
6674 bgp->vpn_policy[afi].rtlist[dir] = NULL;
6675 }
6676
6677 vpn_leak_postchange(dir, afi, bgp_get_default(), bgp);
6678 }
6679
6680 if (ecom)
6681 ecommunity_free(&ecom);
6682
6683 return CMD_SUCCESS;
6684 }
6685
6686 ALIAS (af_rt_vpn_imexport,
6687 af_no_rt_vpn_imexport_cmd,
6688 "no <rt|route-target> vpn <import|export|both>$direction_str",
6689 NO_STR
6690 "Specify route target list\n"
6691 "Specify route target list\n"
6692 "Between current address-family and vpn\n"
6693 "For routes leaked from vpn to current address-family\n"
6694 "For routes leaked from current address-family to vpn\n"
6695 "both import and export\n")
6696
6697 DEFPY (af_route_map_vpn_imexport,
6698 af_route_map_vpn_imexport_cmd,
6699 /* future: "route-map <vpn|evpn|vrf NAME> <import|export> RMAP" */
6700 "[no] route-map vpn <import|export>$direction_str RMAP$rmap_str",
6701 NO_STR
6702 "Specify route map\n"
6703 "Between current address-family and vpn\n"
6704 "For routes leaked from vpn to current address-family\n"
6705 "For routes leaked from current address-family to vpn\n"
6706 "name of route-map\n")
6707 {
6708 VTY_DECLVAR_CONTEXT(bgp, bgp);
6709 int ret;
6710 int dodir[BGP_VPN_POLICY_DIR_MAX] = {0};
6711 vpn_policy_direction_t dir;
6712 afi_t afi;
6713 int idx = 0;
6714 int yes = 1;
6715
6716 if (argv_find(argv, argc, "no", &idx))
6717 yes = 0;
6718
6719 afi = vpn_policy_getafi(vty, bgp, false);
6720 if (afi == AFI_MAX)
6721 return CMD_WARNING_CONFIG_FAILED;
6722
6723 ret = vpn_policy_getdirs(vty, direction_str, dodir);
6724 if (ret != CMD_SUCCESS)
6725 return ret;
6726
6727 for (dir = 0; dir < BGP_VPN_POLICY_DIR_MAX; ++dir) {
6728 if (!dodir[dir])
6729 continue;
6730
6731 vpn_leak_prechange(dir, afi, bgp_get_default(), bgp);
6732
6733 if (yes) {
6734 if (bgp->vpn_policy[afi].rmap_name[dir])
6735 XFREE(MTYPE_ROUTE_MAP_NAME,
6736 bgp->vpn_policy[afi].rmap_name[dir]);
6737 bgp->vpn_policy[afi].rmap_name[dir] = XSTRDUP(
6738 MTYPE_ROUTE_MAP_NAME, rmap_str);
6739 bgp->vpn_policy[afi].rmap[dir] =
6740 route_map_lookup_warn_noexist(vty, rmap_str);
6741 if (!bgp->vpn_policy[afi].rmap[dir])
6742 return CMD_SUCCESS;
6743 } else {
6744 if (bgp->vpn_policy[afi].rmap_name[dir])
6745 XFREE(MTYPE_ROUTE_MAP_NAME,
6746 bgp->vpn_policy[afi].rmap_name[dir]);
6747 bgp->vpn_policy[afi].rmap_name[dir] = NULL;
6748 bgp->vpn_policy[afi].rmap[dir] = NULL;
6749 }
6750
6751 vpn_leak_postchange(dir, afi, bgp_get_default(), bgp);
6752 }
6753
6754 return CMD_SUCCESS;
6755 }
6756
6757 ALIAS (af_route_map_vpn_imexport,
6758 af_no_route_map_vpn_imexport_cmd,
6759 "no route-map vpn <import|export>$direction_str",
6760 NO_STR
6761 "Specify route map\n"
6762 "Between current address-family and vpn\n"
6763 "For routes leaked from vpn to current address-family\n"
6764 "For routes leaked from current address-family to vpn\n")
6765
6766 DEFPY(af_import_vrf_route_map, af_import_vrf_route_map_cmd,
6767 "[no] import vrf route-map RMAP$rmap_str",
6768 NO_STR
6769 "Import routes from another VRF\n"
6770 "Vrf routes being filtered\n"
6771 "Specify route map\n"
6772 "name of route-map\n")
6773 {
6774 VTY_DECLVAR_CONTEXT(bgp, bgp);
6775 vpn_policy_direction_t dir = BGP_VPN_POLICY_DIR_FROMVPN;
6776 afi_t afi;
6777 int idx = 0;
6778 int yes = 1;
6779 struct bgp *bgp_default;
6780
6781 if (argv_find(argv, argc, "no", &idx))
6782 yes = 0;
6783
6784 afi = vpn_policy_getafi(vty, bgp, true);
6785 if (afi == AFI_MAX)
6786 return CMD_WARNING_CONFIG_FAILED;
6787
6788 bgp_default = bgp_get_default();
6789 if (!bgp_default) {
6790 int32_t ret;
6791 as_t as = bgp->as;
6792
6793 /* Auto-create assuming the same AS */
6794 ret = bgp_get(&bgp_default, &as, NULL,
6795 BGP_INSTANCE_TYPE_DEFAULT);
6796
6797 if (ret) {
6798 vty_out(vty,
6799 "VRF default is not configured as a bgp instance\n");
6800 return CMD_WARNING;
6801 }
6802 }
6803
6804 vpn_leak_prechange(dir, afi, bgp_get_default(), bgp);
6805
6806 if (yes) {
6807 if (bgp->vpn_policy[afi].rmap_name[dir])
6808 XFREE(MTYPE_ROUTE_MAP_NAME,
6809 bgp->vpn_policy[afi].rmap_name[dir]);
6810 bgp->vpn_policy[afi].rmap_name[dir] =
6811 XSTRDUP(MTYPE_ROUTE_MAP_NAME, rmap_str);
6812 bgp->vpn_policy[afi].rmap[dir] =
6813 route_map_lookup_warn_noexist(vty, rmap_str);
6814 if (!bgp->vpn_policy[afi].rmap[dir])
6815 return CMD_SUCCESS;
6816 } else {
6817 if (bgp->vpn_policy[afi].rmap_name[dir])
6818 XFREE(MTYPE_ROUTE_MAP_NAME,
6819 bgp->vpn_policy[afi].rmap_name[dir]);
6820 bgp->vpn_policy[afi].rmap_name[dir] = NULL;
6821 bgp->vpn_policy[afi].rmap[dir] = NULL;
6822 }
6823
6824 vpn_leak_postchange(dir, afi, bgp_get_default(), bgp);
6825
6826 return CMD_SUCCESS;
6827 }
6828
6829 ALIAS(af_import_vrf_route_map, af_no_import_vrf_route_map_cmd,
6830 "no import vrf route-map",
6831 NO_STR
6832 "Import routes from another VRF\n"
6833 "Vrf routes being filtered\n"
6834 "Specify route map\n")
6835
6836 DEFPY(bgp_imexport_vrf, bgp_imexport_vrf_cmd,
6837 "[no] import vrf VIEWVRFNAME$import_name",
6838 NO_STR
6839 "Import routes from another VRF\n"
6840 "VRF to import from\n"
6841 "The name of the VRF\n")
6842 {
6843 VTY_DECLVAR_CONTEXT(bgp, bgp);
6844 struct listnode *node;
6845 struct bgp *vrf_bgp, *bgp_default;
6846 int32_t ret = 0;
6847 as_t as = bgp->as;
6848 bool remove = false;
6849 int32_t idx = 0;
6850 char *vname;
6851 enum bgp_instance_type bgp_type = BGP_INSTANCE_TYPE_VRF;
6852 safi_t safi;
6853 afi_t afi;
6854
6855 if (import_name == NULL) {
6856 vty_out(vty, "%% Missing import name\n");
6857 return CMD_WARNING;
6858 }
6859
6860 if (argv_find(argv, argc, "no", &idx))
6861 remove = true;
6862
6863 afi = vpn_policy_getafi(vty, bgp, true);
6864 if (afi == AFI_MAX)
6865 return CMD_WARNING_CONFIG_FAILED;
6866
6867 safi = bgp_node_safi(vty);
6868
6869 if (((BGP_INSTANCE_TYPE_DEFAULT == bgp->inst_type)
6870 && (strcmp(import_name, VRF_DEFAULT_NAME) == 0))
6871 || (bgp->name && (strcmp(import_name, bgp->name) == 0))) {
6872 vty_out(vty, "%% Cannot %s vrf %s into itself\n",
6873 remove ? "unimport" : "import", import_name);
6874 return CMD_WARNING;
6875 }
6876
6877 bgp_default = bgp_get_default();
6878 if (!bgp_default) {
6879 /* Auto-create assuming the same AS */
6880 ret = bgp_get(&bgp_default, &as, NULL,
6881 BGP_INSTANCE_TYPE_DEFAULT);
6882
6883 if (ret) {
6884 vty_out(vty,
6885 "VRF default is not configured as a bgp instance\n");
6886 return CMD_WARNING;
6887 }
6888 }
6889
6890 vrf_bgp = bgp_lookup_by_name(import_name);
6891 if (!vrf_bgp) {
6892 if (strcmp(import_name, VRF_DEFAULT_NAME) == 0)
6893 vrf_bgp = bgp_default;
6894 else
6895 /* Auto-create assuming the same AS */
6896 ret = bgp_get(&vrf_bgp, &as, import_name, bgp_type);
6897
6898 if (ret) {
6899 vty_out(vty,
6900 "VRF %s is not configured as a bgp instance\n",
6901 import_name);
6902 return CMD_WARNING;
6903 }
6904 }
6905
6906 if (remove) {
6907 vrf_unimport_from_vrf(bgp, vrf_bgp, afi, safi);
6908 } else {
6909 /* Already importing from "import_vrf"? */
6910 for (ALL_LIST_ELEMENTS_RO(bgp->vpn_policy[afi].import_vrf, node,
6911 vname)) {
6912 if (strcmp(vname, import_name) == 0)
6913 return CMD_WARNING;
6914 }
6915
6916 vrf_import_from_vrf(bgp, vrf_bgp, afi, safi);
6917 }
6918
6919 return CMD_SUCCESS;
6920 }
6921
6922 /* This command is valid only in a bgp vrf instance or the default instance */
6923 DEFPY (bgp_imexport_vpn,
6924 bgp_imexport_vpn_cmd,
6925 "[no] <import|export>$direction_str vpn",
6926 NO_STR
6927 "Import routes to this address-family\n"
6928 "Export routes from this address-family\n"
6929 "to/from default instance VPN RIB\n")
6930 {
6931 VTY_DECLVAR_CONTEXT(bgp, bgp);
6932 int previous_state;
6933 afi_t afi;
6934 safi_t safi;
6935 int idx = 0;
6936 int yes = 1;
6937 int flag;
6938 vpn_policy_direction_t dir;
6939
6940 if (argv_find(argv, argc, "no", &idx))
6941 yes = 0;
6942
6943 if (BGP_INSTANCE_TYPE_VRF != bgp->inst_type &&
6944 BGP_INSTANCE_TYPE_DEFAULT != bgp->inst_type) {
6945
6946 vty_out(vty, "%% import|export vpn valid only for bgp vrf or default instance\n");
6947 return CMD_WARNING_CONFIG_FAILED;
6948 }
6949
6950 afi = bgp_node_afi(vty);
6951 safi = bgp_node_safi(vty);
6952 if ((SAFI_UNICAST != safi) || ((AFI_IP != afi) && (AFI_IP6 != afi))) {
6953 vty_out(vty, "%% import|export vpn valid only for unicast ipv4|ipv6\n");
6954 return CMD_WARNING_CONFIG_FAILED;
6955 }
6956
6957 if (!strcmp(direction_str, "import")) {
6958 flag = BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT;
6959 dir = BGP_VPN_POLICY_DIR_FROMVPN;
6960 } else if (!strcmp(direction_str, "export")) {
6961 flag = BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT;
6962 dir = BGP_VPN_POLICY_DIR_TOVPN;
6963 } else {
6964 vty_out(vty, "%% unknown direction %s\n", direction_str);
6965 return CMD_WARNING_CONFIG_FAILED;
6966 }
6967
6968 previous_state = CHECK_FLAG(bgp->af_flags[afi][safi], flag);
6969
6970 if (yes) {
6971 SET_FLAG(bgp->af_flags[afi][safi], flag);
6972 if (!previous_state) {
6973 /* trigger export current vrf */
6974 vpn_leak_postchange(dir, afi, bgp_get_default(), bgp);
6975 }
6976 } else {
6977 if (previous_state) {
6978 /* trigger un-export current vrf */
6979 vpn_leak_prechange(dir, afi, bgp_get_default(), bgp);
6980 }
6981 UNSET_FLAG(bgp->af_flags[afi][safi], flag);
6982 }
6983
6984 return CMD_SUCCESS;
6985 }
6986
6987 DEFPY (af_routetarget_import,
6988 af_routetarget_import_cmd,
6989 "[no] <rt|route-target> redirect import RTLIST...",
6990 NO_STR
6991 "Specify route target list\n"
6992 "Specify route target list\n"
6993 "Flow-spec redirect type route target\n"
6994 "Import routes to this address-family\n"
6995 "Space separated route target list (A.B.C.D:MN|EF:OPQR|GHJK:MN)\n")
6996 {
6997 VTY_DECLVAR_CONTEXT(bgp, bgp);
6998 int ret;
6999 struct ecommunity *ecom = NULL;
7000 afi_t afi;
7001 int idx = 0;
7002 int yes = 1;
7003
7004 if (argv_find(argv, argc, "no", &idx))
7005 yes = 0;
7006
7007 afi = vpn_policy_getafi(vty, bgp, false);
7008 if (afi == AFI_MAX)
7009 return CMD_WARNING_CONFIG_FAILED;
7010
7011 if (yes) {
7012 if (!argv_find(argv, argc, "RTLIST", &idx)) {
7013 vty_out(vty, "%% Missing RTLIST\n");
7014 return CMD_WARNING_CONFIG_FAILED;
7015 }
7016 ret = set_ecom_list(vty, argc - idx, argv + idx, &ecom);
7017 if (ret != CMD_SUCCESS)
7018 return ret;
7019 }
7020
7021 if (yes) {
7022 if (bgp->vpn_policy[afi].import_redirect_rtlist)
7023 ecommunity_free(&bgp->vpn_policy[afi]
7024 .import_redirect_rtlist);
7025 bgp->vpn_policy[afi].import_redirect_rtlist =
7026 ecommunity_dup(ecom);
7027 } else {
7028 if (bgp->vpn_policy[afi].import_redirect_rtlist)
7029 ecommunity_free(&bgp->vpn_policy[afi]
7030 .import_redirect_rtlist);
7031 bgp->vpn_policy[afi].import_redirect_rtlist = NULL;
7032 }
7033
7034 if (ecom)
7035 ecommunity_free(&ecom);
7036
7037 return CMD_SUCCESS;
7038 }
7039
7040 DEFUN_NOSH (address_family_ipv4_safi,
7041 address_family_ipv4_safi_cmd,
7042 "address-family ipv4 [<unicast|multicast|vpn|labeled-unicast|flowspec>]",
7043 "Enter Address Family command mode\n"
7044 "Address Family\n"
7045 BGP_SAFI_WITH_LABEL_HELP_STR)
7046 {
7047
7048 if (argc == 3) {
7049 VTY_DECLVAR_CONTEXT(bgp, bgp);
7050 safi_t safi = bgp_vty_safi_from_str(argv[2]->text);
7051 if (bgp->inst_type != BGP_INSTANCE_TYPE_DEFAULT
7052 && safi != SAFI_UNICAST && safi != SAFI_MULTICAST
7053 && safi != SAFI_EVPN) {
7054 vty_out(vty,
7055 "Only Unicast/Multicast/EVPN SAFIs supported in non-core instances.\n");
7056 return CMD_WARNING_CONFIG_FAILED;
7057 }
7058 vty->node = bgp_node_type(AFI_IP, safi);
7059 } else
7060 vty->node = BGP_IPV4_NODE;
7061
7062 return CMD_SUCCESS;
7063 }
7064
7065 DEFUN_NOSH (address_family_ipv6_safi,
7066 address_family_ipv6_safi_cmd,
7067 "address-family ipv6 [<unicast|multicast|vpn|labeled-unicast|flowspec>]",
7068 "Enter Address Family command mode\n"
7069 "Address Family\n"
7070 BGP_SAFI_WITH_LABEL_HELP_STR)
7071 {
7072 if (argc == 3) {
7073 VTY_DECLVAR_CONTEXT(bgp, bgp);
7074 safi_t safi = bgp_vty_safi_from_str(argv[2]->text);
7075 if (bgp->inst_type != BGP_INSTANCE_TYPE_DEFAULT
7076 && safi != SAFI_UNICAST && safi != SAFI_MULTICAST
7077 && safi != SAFI_EVPN) {
7078 vty_out(vty,
7079 "Only Unicast/Multicast/EVPN SAFIs supported in non-core instances.\n");
7080 return CMD_WARNING_CONFIG_FAILED;
7081 }
7082 vty->node = bgp_node_type(AFI_IP6, safi);
7083 } else
7084 vty->node = BGP_IPV6_NODE;
7085
7086 return CMD_SUCCESS;
7087 }
7088
7089 #ifdef KEEP_OLD_VPN_COMMANDS
7090 DEFUN_NOSH (address_family_vpnv4,
7091 address_family_vpnv4_cmd,
7092 "address-family vpnv4 [unicast]",
7093 "Enter Address Family command mode\n"
7094 "Address Family\n"
7095 "Address Family modifier\n")
7096 {
7097 vty->node = BGP_VPNV4_NODE;
7098 return CMD_SUCCESS;
7099 }
7100
7101 DEFUN_NOSH (address_family_vpnv6,
7102 address_family_vpnv6_cmd,
7103 "address-family vpnv6 [unicast]",
7104 "Enter Address Family command mode\n"
7105 "Address Family\n"
7106 "Address Family modifier\n")
7107 {
7108 vty->node = BGP_VPNV6_NODE;
7109 return CMD_SUCCESS;
7110 }
7111 #endif /* KEEP_OLD_VPN_COMMANDS */
7112
7113 DEFUN_NOSH (address_family_evpn,
7114 address_family_evpn_cmd,
7115 "address-family l2vpn evpn",
7116 "Enter Address Family command mode\n"
7117 "Address Family\n"
7118 "Address Family modifier\n")
7119 {
7120 VTY_DECLVAR_CONTEXT(bgp, bgp);
7121 vty->node = BGP_EVPN_NODE;
7122 return CMD_SUCCESS;
7123 }
7124
7125 DEFUN_NOSH (exit_address_family,
7126 exit_address_family_cmd,
7127 "exit-address-family",
7128 "Exit from Address Family configuration mode\n")
7129 {
7130 if (vty->node == BGP_IPV4_NODE || vty->node == BGP_IPV4M_NODE
7131 || vty->node == BGP_IPV4L_NODE || vty->node == BGP_VPNV4_NODE
7132 || vty->node == BGP_IPV6_NODE || vty->node == BGP_IPV6M_NODE
7133 || vty->node == BGP_IPV6L_NODE || vty->node == BGP_VPNV6_NODE
7134 || vty->node == BGP_EVPN_NODE
7135 || vty->node == BGP_FLOWSPECV4_NODE
7136 || vty->node == BGP_FLOWSPECV6_NODE)
7137 vty->node = BGP_NODE;
7138 return CMD_SUCCESS;
7139 }
7140
7141 /* Recalculate bestpath and re-advertise a prefix */
7142 static int bgp_clear_prefix(struct vty *vty, const char *view_name,
7143 const char *ip_str, afi_t afi, safi_t safi,
7144 struct prefix_rd *prd)
7145 {
7146 int ret;
7147 struct prefix match;
7148 struct bgp_node *rn;
7149 struct bgp_node *rm;
7150 struct bgp *bgp;
7151 struct bgp_table *table;
7152 struct bgp_table *rib;
7153
7154 /* BGP structure lookup. */
7155 if (view_name) {
7156 bgp = bgp_lookup_by_name(view_name);
7157 if (bgp == NULL) {
7158 vty_out(vty, "%% Can't find BGP instance %s\n",
7159 view_name);
7160 return CMD_WARNING;
7161 }
7162 } else {
7163 bgp = bgp_get_default();
7164 if (bgp == NULL) {
7165 vty_out(vty, "%% No BGP process is configured\n");
7166 return CMD_WARNING;
7167 }
7168 }
7169
7170 /* Check IP address argument. */
7171 ret = str2prefix(ip_str, &match);
7172 if (!ret) {
7173 vty_out(vty, "%% address is malformed\n");
7174 return CMD_WARNING;
7175 }
7176
7177 match.family = afi2family(afi);
7178 rib = bgp->rib[afi][safi];
7179
7180 if (safi == SAFI_MPLS_VPN) {
7181 for (rn = bgp_table_top(rib); rn; rn = bgp_route_next(rn)) {
7182 if (prd && memcmp(rn->p.u.val, prd->val, 8) != 0)
7183 continue;
7184
7185 table = bgp_node_get_bgp_table_info(rn);
7186 if (table != NULL) {
7187
7188 if ((rm = bgp_node_match(table, &match))
7189 != NULL) {
7190 if (rm->p.prefixlen
7191 == match.prefixlen) {
7192 SET_FLAG(rm->flags,
7193 BGP_NODE_USER_CLEAR);
7194 bgp_process(bgp, rm, afi, safi);
7195 }
7196 bgp_unlock_node(rm);
7197 }
7198 }
7199 }
7200 } else {
7201 if ((rn = bgp_node_match(rib, &match)) != NULL) {
7202 if (rn->p.prefixlen == match.prefixlen) {
7203 SET_FLAG(rn->flags, BGP_NODE_USER_CLEAR);
7204 bgp_process(bgp, rn, afi, safi);
7205 }
7206 bgp_unlock_node(rn);
7207 }
7208 }
7209
7210 return CMD_SUCCESS;
7211 }
7212
7213 /* one clear bgp command to rule them all */
7214 DEFUN (clear_ip_bgp_all,
7215 clear_ip_bgp_all_cmd,
7216 "clear [ip] bgp [<view|vrf> VIEWVRFNAME] [<ipv4|ipv6|l2vpn> [<unicast|multicast|vpn|labeled-unicast|flowspec|evpn>]] <*|A.B.C.D|X:X::X:X|WORD|(1-4294967295)|external|peer-group PGNAME> [<soft [<in|out>]|in [prefix-filter]|out>]",
7217 CLEAR_STR
7218 IP_STR
7219 BGP_STR
7220 BGP_INSTANCE_HELP_STR
7221 BGP_AFI_HELP_STR
7222 "Address Family\n"
7223 BGP_SAFI_WITH_LABEL_HELP_STR
7224 "Address Family modifier\n"
7225 "Clear all peers\n"
7226 "BGP neighbor address to clear\n"
7227 "BGP IPv6 neighbor to clear\n"
7228 "BGP neighbor on interface to clear\n"
7229 "Clear peers with the AS number\n"
7230 "Clear all external peers\n"
7231 "Clear all members of peer-group\n"
7232 "BGP peer-group name\n"
7233 BGP_SOFT_STR
7234 BGP_SOFT_IN_STR
7235 BGP_SOFT_OUT_STR
7236 BGP_SOFT_IN_STR
7237 "Push out prefix-list ORF and do inbound soft reconfig\n"
7238 BGP_SOFT_OUT_STR)
7239 {
7240 char *vrf = NULL;
7241
7242 afi_t afi = AFI_IP6;
7243 safi_t safi = SAFI_UNICAST;
7244 enum clear_sort clr_sort = clear_peer;
7245 enum bgp_clear_type clr_type;
7246 char *clr_arg = NULL;
7247
7248 int idx = 0;
7249
7250 /* clear [ip] bgp */
7251 if (argv_find(argv, argc, "ip", &idx))
7252 afi = AFI_IP;
7253
7254 /* [<vrf> VIEWVRFNAME] */
7255 if (argv_find(argv, argc, "vrf", &idx)) {
7256 vrf = argv[idx + 1]->arg;
7257 idx += 2;
7258 if (vrf && strmatch(vrf, VRF_DEFAULT_NAME))
7259 vrf = NULL;
7260 } else if (argv_find(argv, argc, "view", &idx)) {
7261 /* [<view> VIEWVRFNAME] */
7262 vrf = argv[idx + 1]->arg;
7263 idx += 2;
7264 }
7265 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
7266 if (argv_find_and_parse_afi(argv, argc, &idx, &afi))
7267 argv_find_and_parse_safi(argv, argc, &idx, &safi);
7268
7269 /* <*|A.B.C.D|X:X::X:X|WORD|(1-4294967295)|external|peer-group PGNAME> */
7270 if (argv_find(argv, argc, "*", &idx)) {
7271 clr_sort = clear_all;
7272 } else if (argv_find(argv, argc, "A.B.C.D", &idx)) {
7273 clr_sort = clear_peer;
7274 clr_arg = argv[idx]->arg;
7275 } else if (argv_find(argv, argc, "X:X::X:X", &idx)) {
7276 clr_sort = clear_peer;
7277 clr_arg = argv[idx]->arg;
7278 } else if (argv_find(argv, argc, "peer-group", &idx)) {
7279 clr_sort = clear_group;
7280 idx++;
7281 clr_arg = argv[idx]->arg;
7282 } else if (argv_find(argv, argc, "PGNAME", &idx)) {
7283 clr_sort = clear_peer;
7284 clr_arg = argv[idx]->arg;
7285 } else if (argv_find(argv, argc, "(1-4294967295)", &idx)) {
7286 clr_sort = clear_as;
7287 clr_arg = argv[idx]->arg;
7288 } else if (argv_find(argv, argc, "external", &idx)) {
7289 clr_sort = clear_external;
7290 }
7291
7292 /* [<soft [<in|out>]|in [prefix-filter]|out>] */
7293 if (argv_find(argv, argc, "soft", &idx)) {
7294 if (argv_find(argv, argc, "in", &idx)
7295 || argv_find(argv, argc, "out", &idx))
7296 clr_type = strmatch(argv[idx]->text, "in")
7297 ? BGP_CLEAR_SOFT_IN
7298 : BGP_CLEAR_SOFT_OUT;
7299 else
7300 clr_type = BGP_CLEAR_SOFT_BOTH;
7301 } else if (argv_find(argv, argc, "in", &idx)) {
7302 clr_type = argv_find(argv, argc, "prefix-filter", &idx)
7303 ? BGP_CLEAR_SOFT_IN_ORF_PREFIX
7304 : BGP_CLEAR_SOFT_IN;
7305 } else if (argv_find(argv, argc, "out", &idx)) {
7306 clr_type = BGP_CLEAR_SOFT_OUT;
7307 } else
7308 clr_type = BGP_CLEAR_SOFT_NONE;
7309
7310 return bgp_clear_vty(vty, vrf, afi, safi, clr_sort, clr_type, clr_arg);
7311 }
7312
7313 DEFUN (clear_ip_bgp_prefix,
7314 clear_ip_bgp_prefix_cmd,
7315 "clear [ip] bgp [<view|vrf> VIEWVRFNAME] prefix A.B.C.D/M",
7316 CLEAR_STR
7317 IP_STR
7318 BGP_STR
7319 BGP_INSTANCE_HELP_STR
7320 "Clear bestpath and re-advertise\n"
7321 "IPv4 prefix\n")
7322 {
7323 char *vrf = NULL;
7324 char *prefix = NULL;
7325
7326 int idx = 0;
7327
7328 /* [<view|vrf> VIEWVRFNAME] */
7329 if (argv_find(argv, argc, "vrf", &idx)) {
7330 vrf = argv[idx + 1]->arg;
7331 idx += 2;
7332 if (vrf && strmatch(vrf, VRF_DEFAULT_NAME))
7333 vrf = NULL;
7334 } else if (argv_find(argv, argc, "view", &idx)) {
7335 /* [<view> VIEWVRFNAME] */
7336 vrf = argv[idx + 1]->arg;
7337 idx += 2;
7338 }
7339
7340 prefix = argv[argc - 1]->arg;
7341
7342 return bgp_clear_prefix(vty, vrf, prefix, AFI_IP, SAFI_UNICAST, NULL);
7343 }
7344
7345 DEFUN (clear_bgp_ipv6_safi_prefix,
7346 clear_bgp_ipv6_safi_prefix_cmd,
7347 "clear [ip] bgp ipv6 "BGP_SAFI_CMD_STR" prefix X:X::X:X/M",
7348 CLEAR_STR
7349 IP_STR
7350 BGP_STR
7351 "Address Family\n"
7352 BGP_SAFI_HELP_STR
7353 "Clear bestpath and re-advertise\n"
7354 "IPv6 prefix\n")
7355 {
7356 int idx_safi = 0;
7357 int idx_ipv6_prefix = 0;
7358 safi_t safi = SAFI_UNICAST;
7359 char *prefix = argv_find(argv, argc, "X:X::X:X/M", &idx_ipv6_prefix) ?
7360 argv[idx_ipv6_prefix]->arg : NULL;
7361
7362 argv_find_and_parse_safi(argv, argc, &idx_safi, &safi);
7363 return bgp_clear_prefix(
7364 vty, NULL, prefix, AFI_IP6,
7365 safi, NULL);
7366 }
7367
7368 DEFUN (clear_bgp_instance_ipv6_safi_prefix,
7369 clear_bgp_instance_ipv6_safi_prefix_cmd,
7370 "clear [ip] bgp <view|vrf> VIEWVRFNAME ipv6 "BGP_SAFI_CMD_STR" prefix X:X::X:X/M",
7371 CLEAR_STR
7372 IP_STR
7373 BGP_STR
7374 BGP_INSTANCE_HELP_STR
7375 "Address Family\n"
7376 BGP_SAFI_HELP_STR
7377 "Clear bestpath and re-advertise\n"
7378 "IPv6 prefix\n")
7379 {
7380 int idx_safi = 0;
7381 int idx_vrfview = 0;
7382 int idx_ipv6_prefix = 0;
7383 safi_t safi = SAFI_UNICAST;
7384 char *prefix = argv_find(argv, argc, "X:X::X:X/M", &idx_ipv6_prefix) ?
7385 argv[idx_ipv6_prefix]->arg : NULL;
7386 char *vrfview = NULL;
7387
7388 /* [<view|vrf> VIEWVRFNAME] */
7389 if (argv_find(argv, argc, "vrf", &idx_vrfview)) {
7390 vrfview = argv[idx_vrfview + 1]->arg;
7391 if (vrfview && strmatch(vrfview, VRF_DEFAULT_NAME))
7392 vrfview = NULL;
7393 } else if (argv_find(argv, argc, "view", &idx_vrfview)) {
7394 /* [<view> VIEWVRFNAME] */
7395 vrfview = argv[idx_vrfview + 1]->arg;
7396 }
7397 argv_find_and_parse_safi(argv, argc, &idx_safi, &safi);
7398
7399 return bgp_clear_prefix(
7400 vty, vrfview, prefix,
7401 AFI_IP6, safi, NULL);
7402 }
7403
7404 DEFUN (show_bgp_views,
7405 show_bgp_views_cmd,
7406 "show [ip] bgp views",
7407 SHOW_STR
7408 IP_STR
7409 BGP_STR
7410 "Show the defined BGP views\n")
7411 {
7412 struct list *inst = bm->bgp;
7413 struct listnode *node;
7414 struct bgp *bgp;
7415
7416 vty_out(vty, "Defined BGP views:\n");
7417 for (ALL_LIST_ELEMENTS_RO(inst, node, bgp)) {
7418 /* Skip VRFs. */
7419 if (bgp->inst_type == BGP_INSTANCE_TYPE_VRF)
7420 continue;
7421 vty_out(vty, "\t%s (AS%u)\n", bgp->name ? bgp->name : "(null)",
7422 bgp->as);
7423 }
7424
7425 return CMD_SUCCESS;
7426 }
7427
7428 DEFUN (show_bgp_vrfs,
7429 show_bgp_vrfs_cmd,
7430 "show [ip] bgp vrfs [json]",
7431 SHOW_STR
7432 IP_STR
7433 BGP_STR
7434 "Show BGP VRFs\n"
7435 JSON_STR)
7436 {
7437 char buf[ETHER_ADDR_STRLEN];
7438 struct list *inst = bm->bgp;
7439 struct listnode *node;
7440 struct bgp *bgp;
7441 bool uj = use_json(argc, argv);
7442 json_object *json = NULL;
7443 json_object *json_vrfs = NULL;
7444 int count = 0;
7445
7446 if (uj) {
7447 json = json_object_new_object();
7448 json_vrfs = json_object_new_object();
7449 }
7450
7451 for (ALL_LIST_ELEMENTS_RO(inst, node, bgp)) {
7452 const char *name, *type;
7453 struct peer *peer;
7454 struct listnode *node2, *nnode2;
7455 int peers_cfg, peers_estb;
7456 json_object *json_vrf = NULL;
7457
7458 /* Skip Views. */
7459 if (bgp->inst_type == BGP_INSTANCE_TYPE_VIEW)
7460 continue;
7461
7462 count++;
7463 if (!uj && count == 1) {
7464 vty_out(vty,
7465 "%4s %-5s %-16s %9s %10s %-37s\n",
7466 "Type", "Id", "routerId", "#PeersVfg",
7467 "#PeersEstb", "Name");
7468 vty_out(vty, "%11s %-16s %-21s %-6s\n", " ",
7469 "L3-VNI", "RouterMAC", "Interface");
7470 }
7471
7472 peers_cfg = peers_estb = 0;
7473 if (uj)
7474 json_vrf = json_object_new_object();
7475
7476
7477 for (ALL_LIST_ELEMENTS(bgp->peer, node2, nnode2, peer)) {
7478 if (!CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE))
7479 continue;
7480 peers_cfg++;
7481 if (peer->status == Established)
7482 peers_estb++;
7483 }
7484
7485 if (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT) {
7486 name = VRF_DEFAULT_NAME;
7487 type = "DFLT";
7488 } else {
7489 name = bgp->name;
7490 type = "VRF";
7491 }
7492
7493
7494 if (uj) {
7495 int64_t vrf_id_ui = (bgp->vrf_id == VRF_UNKNOWN)
7496 ? -1
7497 : (int64_t)bgp->vrf_id;
7498 json_object_string_add(json_vrf, "type", type);
7499 json_object_int_add(json_vrf, "vrfId", vrf_id_ui);
7500 json_object_string_add(json_vrf, "routerId",
7501 inet_ntoa(bgp->router_id));
7502 json_object_int_add(json_vrf, "numConfiguredPeers",
7503 peers_cfg);
7504 json_object_int_add(json_vrf, "numEstablishedPeers",
7505 peers_estb);
7506
7507 json_object_int_add(json_vrf, "l3vni", bgp->l3vni);
7508 json_object_string_add(
7509 json_vrf, "rmac",
7510 prefix_mac2str(&bgp->rmac, buf, sizeof(buf)));
7511 json_object_string_add(json_vrf, "interface",
7512 ifindex2ifname(bgp->l3vni_svi_ifindex,
7513 bgp->vrf_id));
7514 json_object_object_add(json_vrfs, name, json_vrf);
7515 } else {
7516 vty_out(vty,
7517 "%4s %-5d %-16s %-9u %-10u %-37s\n",
7518 type,
7519 bgp->vrf_id == VRF_UNKNOWN ? -1
7520 : (int)bgp->vrf_id,
7521 inet_ntoa(bgp->router_id), peers_cfg,
7522 peers_estb, name);
7523 vty_out(vty,"%11s %-16u %-21s %-20s\n", " ",
7524 bgp->l3vni,
7525 prefix_mac2str(&bgp->rmac, buf, sizeof(buf)),
7526 ifindex2ifname(bgp->l3vni_svi_ifindex,
7527 bgp->vrf_id));
7528 }
7529 }
7530
7531 if (uj) {
7532 json_object_object_add(json, "vrfs", json_vrfs);
7533
7534 json_object_int_add(json, "totalVrfs", count);
7535
7536 vty_out(vty, "%s\n", json_object_to_json_string_ext(
7537 json, JSON_C_TO_STRING_PRETTY));
7538 json_object_free(json);
7539 } else {
7540 if (count)
7541 vty_out(vty,
7542 "\nTotal number of VRFs (including default): %d\n",
7543 count);
7544 }
7545
7546 return CMD_SUCCESS;
7547 }
7548
7549 DEFUN (show_bgp_mac_hash,
7550 show_bgp_mac_hash_cmd,
7551 "show bgp mac hash",
7552 SHOW_STR
7553 BGP_STR
7554 "Mac Address\n"
7555 "Mac Address database\n")
7556 {
7557 bgp_mac_dump_table(vty);
7558
7559 return CMD_SUCCESS;
7560 }
7561
7562 static void show_tip_entry(struct hash_bucket *bucket, void *args)
7563 {
7564 struct vty *vty = (struct vty *)args;
7565 struct tip_addr *tip = (struct tip_addr *)bucket->data;
7566
7567 vty_out(vty, "addr: %s, count: %d\n", inet_ntoa(tip->addr),
7568 tip->refcnt);
7569 }
7570
7571 static void bgp_show_martian_nexthops(struct vty *vty, struct bgp *bgp)
7572 {
7573 vty_out(vty, "self nexthop database:\n");
7574 bgp_nexthop_show_address_hash(vty, bgp);
7575
7576 vty_out(vty, "Tunnel-ip database:\n");
7577 hash_iterate(bgp->tip_hash,
7578 (void (*)(struct hash_bucket *, void *))show_tip_entry,
7579 vty);
7580 }
7581
7582 DEFUN(show_bgp_martian_nexthop_db, show_bgp_martian_nexthop_db_cmd,
7583 "show bgp [<view|vrf> VIEWVRFNAME] martian next-hop",
7584 SHOW_STR BGP_STR BGP_INSTANCE_HELP_STR
7585 "martian next-hops\n"
7586 "martian next-hop database\n")
7587 {
7588 struct bgp *bgp = NULL;
7589 int idx = 0;
7590 char *name = NULL;
7591
7592 /* [<vrf> VIEWVRFNAME] */
7593 if (argv_find(argv, argc, "vrf", &idx)) {
7594 name = argv[idx + 1]->arg;
7595 if (name && strmatch(name, VRF_DEFAULT_NAME))
7596 name = NULL;
7597 } else if (argv_find(argv, argc, "view", &idx))
7598 /* [<view> VIEWVRFNAME] */
7599 name = argv[idx + 1]->arg;
7600 if (name)
7601 bgp = bgp_lookup_by_name(name);
7602 else
7603 bgp = bgp_get_default();
7604
7605 if (!bgp) {
7606 vty_out(vty, "%% No BGP process is configured\n");
7607 return CMD_WARNING;
7608 }
7609 bgp_show_martian_nexthops(vty, bgp);
7610
7611 return CMD_SUCCESS;
7612 }
7613
7614 DEFUN (show_bgp_memory,
7615 show_bgp_memory_cmd,
7616 "show [ip] bgp memory",
7617 SHOW_STR
7618 IP_STR
7619 BGP_STR
7620 "Global BGP memory statistics\n")
7621 {
7622 char memstrbuf[MTYPE_MEMSTR_LEN];
7623 unsigned long count;
7624
7625 /* RIB related usage stats */
7626 count = mtype_stats_alloc(MTYPE_BGP_NODE);
7627 vty_out(vty, "%ld RIB nodes, using %s of memory\n", count,
7628 mtype_memstr(memstrbuf, sizeof(memstrbuf),
7629 count * sizeof(struct bgp_node)));
7630
7631 count = mtype_stats_alloc(MTYPE_BGP_ROUTE);
7632 vty_out(vty, "%ld BGP routes, using %s of memory\n", count,
7633 mtype_memstr(memstrbuf, sizeof(memstrbuf),
7634 count * sizeof(struct bgp_path_info)));
7635 if ((count = mtype_stats_alloc(MTYPE_BGP_ROUTE_EXTRA)))
7636 vty_out(vty, "%ld BGP route ancillaries, using %s of memory\n",
7637 count,
7638 mtype_memstr(
7639 memstrbuf, sizeof(memstrbuf),
7640 count * sizeof(struct bgp_path_info_extra)));
7641
7642 if ((count = mtype_stats_alloc(MTYPE_BGP_STATIC)))
7643 vty_out(vty, "%ld Static routes, using %s of memory\n", count,
7644 mtype_memstr(memstrbuf, sizeof(memstrbuf),
7645 count * sizeof(struct bgp_static)));
7646
7647 if ((count = mtype_stats_alloc(MTYPE_BGP_PACKET)))
7648 vty_out(vty, "%ld Packets, using %s of memory\n", count,
7649 mtype_memstr(memstrbuf, sizeof(memstrbuf),
7650 count * sizeof(struct bpacket)));
7651
7652 /* Adj-In/Out */
7653 if ((count = mtype_stats_alloc(MTYPE_BGP_ADJ_IN)))
7654 vty_out(vty, "%ld Adj-In entries, using %s of memory\n", count,
7655 mtype_memstr(memstrbuf, sizeof(memstrbuf),
7656 count * sizeof(struct bgp_adj_in)));
7657 if ((count = mtype_stats_alloc(MTYPE_BGP_ADJ_OUT)))
7658 vty_out(vty, "%ld Adj-Out entries, using %s of memory\n", count,
7659 mtype_memstr(memstrbuf, sizeof(memstrbuf),
7660 count * sizeof(struct bgp_adj_out)));
7661
7662 if ((count = mtype_stats_alloc(MTYPE_BGP_NEXTHOP_CACHE)))
7663 vty_out(vty, "%ld Nexthop cache entries, using %s of memory\n",
7664 count,
7665 mtype_memstr(memstrbuf, sizeof(memstrbuf),
7666 count * sizeof(struct bgp_nexthop_cache)));
7667
7668 if ((count = mtype_stats_alloc(MTYPE_BGP_DAMP_INFO)))
7669 vty_out(vty, "%ld Dampening entries, using %s of memory\n",
7670 count,
7671 mtype_memstr(memstrbuf, sizeof(memstrbuf),
7672 count * sizeof(struct bgp_damp_info)));
7673
7674 /* Attributes */
7675 count = attr_count();
7676 vty_out(vty, "%ld BGP attributes, using %s of memory\n", count,
7677 mtype_memstr(memstrbuf, sizeof(memstrbuf),
7678 count * sizeof(struct attr)));
7679
7680 if ((count = attr_unknown_count()))
7681 vty_out(vty, "%ld unknown attributes\n", count);
7682
7683 /* AS_PATH attributes */
7684 count = aspath_count();
7685 vty_out(vty, "%ld BGP AS-PATH entries, using %s of memory\n", count,
7686 mtype_memstr(memstrbuf, sizeof(memstrbuf),
7687 count * sizeof(struct aspath)));
7688
7689 count = mtype_stats_alloc(MTYPE_AS_SEG);
7690 vty_out(vty, "%ld BGP AS-PATH segments, using %s of memory\n", count,
7691 mtype_memstr(memstrbuf, sizeof(memstrbuf),
7692 count * sizeof(struct assegment)));
7693
7694 /* Other attributes */
7695 if ((count = community_count()))
7696 vty_out(vty, "%ld BGP community entries, using %s of memory\n",
7697 count, mtype_memstr(memstrbuf, sizeof(memstrbuf),
7698 count * sizeof(struct community)));
7699 if ((count = mtype_stats_alloc(MTYPE_ECOMMUNITY)))
7700 vty_out(vty, "%ld BGP community entries, using %s of memory\n",
7701 count, mtype_memstr(memstrbuf, sizeof(memstrbuf),
7702 count * sizeof(struct ecommunity)));
7703 if ((count = mtype_stats_alloc(MTYPE_LCOMMUNITY)))
7704 vty_out(vty,
7705 "%ld BGP large-community entries, using %s of memory\n",
7706 count, mtype_memstr(memstrbuf, sizeof(memstrbuf),
7707 count * sizeof(struct lcommunity)));
7708
7709 if ((count = mtype_stats_alloc(MTYPE_CLUSTER)))
7710 vty_out(vty, "%ld Cluster lists, using %s of memory\n", count,
7711 mtype_memstr(memstrbuf, sizeof(memstrbuf),
7712 count * sizeof(struct cluster_list)));
7713
7714 /* Peer related usage */
7715 count = mtype_stats_alloc(MTYPE_BGP_PEER);
7716 vty_out(vty, "%ld peers, using %s of memory\n", count,
7717 mtype_memstr(memstrbuf, sizeof(memstrbuf),
7718 count * sizeof(struct peer)));
7719
7720 if ((count = mtype_stats_alloc(MTYPE_PEER_GROUP)))
7721 vty_out(vty, "%ld peer groups, using %s of memory\n", count,
7722 mtype_memstr(memstrbuf, sizeof(memstrbuf),
7723 count * sizeof(struct peer_group)));
7724
7725 /* Other */
7726 if ((count = mtype_stats_alloc(MTYPE_BGP_REGEXP)))
7727 vty_out(vty, "%ld compiled regexes, using %s of memory\n",
7728 count, mtype_memstr(memstrbuf, sizeof(memstrbuf),
7729 count * sizeof(regex_t)));
7730 return CMD_SUCCESS;
7731 }
7732
7733 static void bgp_show_bestpath_json(struct bgp *bgp, json_object *json)
7734 {
7735 json_object *bestpath = json_object_new_object();
7736
7737 if (bgp_flag_check(bgp, BGP_FLAG_ASPATH_IGNORE))
7738 json_object_string_add(bestpath, "asPath", "ignore");
7739
7740 if (bgp_flag_check(bgp, BGP_FLAG_ASPATH_CONFED))
7741 json_object_string_add(bestpath, "asPath", "confed");
7742
7743 if (bgp_flag_check(bgp, BGP_FLAG_ASPATH_MULTIPATH_RELAX)) {
7744 if (bgp_flag_check(bgp, BGP_FLAG_MULTIPATH_RELAX_AS_SET))
7745 json_object_string_add(bestpath, "multiPathRelax",
7746 "as-set");
7747 else
7748 json_object_string_add(bestpath, "multiPathRelax",
7749 "true");
7750 } else
7751 json_object_string_add(bestpath, "multiPathRelax", "false");
7752
7753 if (bgp_flag_check(bgp, BGP_FLAG_COMPARE_ROUTER_ID))
7754 json_object_string_add(bestpath, "compareRouterId", "true");
7755 if (bgp_flag_check(bgp, BGP_FLAG_MED_CONFED)
7756 || bgp_flag_check(bgp, BGP_FLAG_MED_MISSING_AS_WORST)) {
7757 if (bgp_flag_check(bgp, BGP_FLAG_MED_CONFED))
7758 json_object_string_add(bestpath, "med", "confed");
7759 if (bgp_flag_check(bgp, BGP_FLAG_MED_MISSING_AS_WORST))
7760 json_object_string_add(bestpath, "med",
7761 "missing-as-worst");
7762 else
7763 json_object_string_add(bestpath, "med", "true");
7764 }
7765
7766 json_object_object_add(json, "bestPath", bestpath);
7767 }
7768
7769 /* Show BGP peer's summary information. */
7770 static int bgp_show_summary(struct vty *vty, struct bgp *bgp, int afi, int safi,
7771 bool use_json, json_object *json)
7772 {
7773 struct peer *peer;
7774 struct listnode *node, *nnode;
7775 unsigned int count = 0, dn_count = 0;
7776 char timebuf[BGP_UPTIME_LEN], dn_flag[2];
7777 char neighbor_buf[VTY_BUFSIZ];
7778 int neighbor_col_default_width = 16;
7779 int len;
7780 int max_neighbor_width = 0;
7781 int pfx_rcd_safi;
7782 json_object *json_peer = NULL;
7783 json_object *json_peers = NULL;
7784 struct peer_af *paf;
7785
7786 /* labeled-unicast routes are installed in the unicast table so in order
7787 * to
7788 * display the correct PfxRcd value we must look at SAFI_UNICAST
7789 */
7790 if (safi == SAFI_LABELED_UNICAST)
7791 pfx_rcd_safi = SAFI_UNICAST;
7792 else
7793 pfx_rcd_safi = safi;
7794
7795 if (use_json) {
7796 if (json == NULL)
7797 json = json_object_new_object();
7798
7799 json_peers = json_object_new_object();
7800 } else {
7801 /* Loop over all neighbors that will be displayed to determine
7802 * how many
7803 * characters are needed for the Neighbor column
7804 */
7805 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
7806 if (!CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE))
7807 continue;
7808
7809 if (peer->afc[afi][safi]) {
7810 memset(dn_flag, '\0', sizeof(dn_flag));
7811 if (peer_dynamic_neighbor(peer))
7812 dn_flag[0] = '*';
7813
7814 if (peer->hostname
7815 && bgp_flag_check(bgp,
7816 BGP_FLAG_SHOW_HOSTNAME))
7817 sprintf(neighbor_buf, "%s%s(%s) ",
7818 dn_flag, peer->hostname,
7819 peer->host);
7820 else
7821 sprintf(neighbor_buf, "%s%s ", dn_flag,
7822 peer->host);
7823
7824 len = strlen(neighbor_buf);
7825
7826 if (len > max_neighbor_width)
7827 max_neighbor_width = len;
7828 }
7829 }
7830
7831 /* Originally we displayed the Neighbor column as 16
7832 * characters wide so make that the default
7833 */
7834 if (max_neighbor_width < neighbor_col_default_width)
7835 max_neighbor_width = neighbor_col_default_width;
7836 }
7837
7838 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
7839 if (!CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE))
7840 continue;
7841
7842 if (!peer->afc[afi][safi])
7843 continue;
7844
7845 if (!count) {
7846 unsigned long ents;
7847 char memstrbuf[MTYPE_MEMSTR_LEN];
7848 int64_t vrf_id_ui;
7849
7850 vrf_id_ui = (bgp->vrf_id == VRF_UNKNOWN)
7851 ? -1
7852 : (int64_t)bgp->vrf_id;
7853
7854 /* Usage summary and header */
7855 if (use_json) {
7856 json_object_string_add(
7857 json, "routerId",
7858 inet_ntoa(bgp->router_id));
7859 json_object_int_add(json, "as", bgp->as);
7860 json_object_int_add(json, "vrfId", vrf_id_ui);
7861 json_object_string_add(
7862 json, "vrfName",
7863 (bgp->inst_type
7864 == BGP_INSTANCE_TYPE_DEFAULT)
7865 ? VRF_DEFAULT_NAME
7866 : bgp->name);
7867 } else {
7868 vty_out(vty,
7869 "BGP router identifier %s, local AS number %u vrf-id %d",
7870 inet_ntoa(bgp->router_id), bgp->as,
7871 bgp->vrf_id == VRF_UNKNOWN
7872 ? -1
7873 : (int)bgp->vrf_id);
7874 vty_out(vty, "\n");
7875 }
7876
7877 if (bgp_update_delay_configured(bgp)) {
7878 if (use_json) {
7879 json_object_int_add(
7880 json, "updateDelayLimit",
7881 bgp->v_update_delay);
7882
7883 if (bgp->v_update_delay
7884 != bgp->v_establish_wait)
7885 json_object_int_add(
7886 json,
7887 "updateDelayEstablishWait",
7888 bgp->v_establish_wait);
7889
7890 if (bgp_update_delay_active(bgp)) {
7891 json_object_string_add(
7892 json,
7893 "updateDelayFirstNeighbor",
7894 bgp->update_delay_begin_time);
7895 json_object_boolean_true_add(
7896 json,
7897 "updateDelayInProgress");
7898 } else {
7899 if (bgp->update_delay_over) {
7900 json_object_string_add(
7901 json,
7902 "updateDelayFirstNeighbor",
7903 bgp->update_delay_begin_time);
7904 json_object_string_add(
7905 json,
7906 "updateDelayBestpathResumed",
7907 bgp->update_delay_end_time);
7908 json_object_string_add(
7909 json,
7910 "updateDelayZebraUpdateResume",
7911 bgp->update_delay_zebra_resume_time);
7912 json_object_string_add(
7913 json,
7914 "updateDelayPeerUpdateResume",
7915 bgp->update_delay_peers_resume_time);
7916 }
7917 }
7918 } else {
7919 vty_out(vty,
7920 "Read-only mode update-delay limit: %d seconds\n",
7921 bgp->v_update_delay);
7922 if (bgp->v_update_delay
7923 != bgp->v_establish_wait)
7924 vty_out(vty,
7925 " Establish wait: %d seconds\n",
7926 bgp->v_establish_wait);
7927
7928 if (bgp_update_delay_active(bgp)) {
7929 vty_out(vty,
7930 " First neighbor established: %s\n",
7931 bgp->update_delay_begin_time);
7932 vty_out(vty,
7933 " Delay in progress\n");
7934 } else {
7935 if (bgp->update_delay_over) {
7936 vty_out(vty,
7937 " First neighbor established: %s\n",
7938 bgp->update_delay_begin_time);
7939 vty_out(vty,
7940 " Best-paths resumed: %s\n",
7941 bgp->update_delay_end_time);
7942 vty_out(vty,
7943 " zebra update resumed: %s\n",
7944 bgp->update_delay_zebra_resume_time);
7945 vty_out(vty,
7946 " peers update resumed: %s\n",
7947 bgp->update_delay_peers_resume_time);
7948 }
7949 }
7950 }
7951 }
7952
7953 if (use_json) {
7954 if (bgp_maxmed_onstartup_configured(bgp)
7955 && bgp->maxmed_active)
7956 json_object_boolean_true_add(
7957 json, "maxMedOnStartup");
7958 if (bgp->v_maxmed_admin)
7959 json_object_boolean_true_add(
7960 json, "maxMedAdministrative");
7961
7962 json_object_int_add(
7963 json, "tableVersion",
7964 bgp_table_version(bgp->rib[afi][safi]));
7965
7966 ents = bgp_table_count(bgp->rib[afi][safi]);
7967 json_object_int_add(json, "ribCount", ents);
7968 json_object_int_add(
7969 json, "ribMemory",
7970 ents * sizeof(struct bgp_node));
7971
7972 ents = bgp->af_peer_count[afi][safi];
7973 json_object_int_add(json, "peerCount", ents);
7974 json_object_int_add(json, "peerMemory",
7975 ents * sizeof(struct peer));
7976
7977 if ((ents = listcount(bgp->group))) {
7978 json_object_int_add(
7979 json, "peerGroupCount", ents);
7980 json_object_int_add(
7981 json, "peerGroupMemory",
7982 ents * sizeof(struct
7983 peer_group));
7984 }
7985
7986 if (CHECK_FLAG(bgp->af_flags[afi][safi],
7987 BGP_CONFIG_DAMPENING))
7988 json_object_boolean_true_add(
7989 json, "dampeningEnabled");
7990 } else {
7991 if (bgp_maxmed_onstartup_configured(bgp)
7992 && bgp->maxmed_active)
7993 vty_out(vty,
7994 "Max-med on-startup active\n");
7995 if (bgp->v_maxmed_admin)
7996 vty_out(vty,
7997 "Max-med administrative active\n");
7998
7999 vty_out(vty, "BGP table version %" PRIu64 "\n",
8000 bgp_table_version(bgp->rib[afi][safi]));
8001
8002 ents = bgp_table_count(bgp->rib[afi][safi]);
8003 vty_out(vty,
8004 "RIB entries %ld, using %s of memory\n",
8005 ents,
8006 mtype_memstr(memstrbuf,
8007 sizeof(memstrbuf),
8008 ents * sizeof(struct
8009 bgp_node)));
8010
8011 /* Peer related usage */
8012 ents = bgp->af_peer_count[afi][safi];
8013 vty_out(vty, "Peers %ld, using %s of memory\n",
8014 ents,
8015 mtype_memstr(
8016 memstrbuf, sizeof(memstrbuf),
8017 ents * sizeof(struct peer)));
8018
8019 if ((ents = listcount(bgp->group)))
8020 vty_out(vty,
8021 "Peer groups %ld, using %s of memory\n",
8022 ents,
8023 mtype_memstr(
8024 memstrbuf,
8025 sizeof(memstrbuf),
8026 ents * sizeof(struct
8027 peer_group)));
8028
8029 if (CHECK_FLAG(bgp->af_flags[afi][safi],
8030 BGP_CONFIG_DAMPENING))
8031 vty_out(vty, "Dampening enabled.\n");
8032 vty_out(vty, "\n");
8033
8034 /* Subtract 8 here because 'Neighbor' is
8035 * 8 characters */
8036 vty_out(vty, "Neighbor");
8037 vty_out(vty, "%*s", max_neighbor_width - 8,
8038 " ");
8039 vty_out(vty,
8040 "V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd\n");
8041 }
8042 }
8043
8044 count++;
8045
8046 if (use_json) {
8047 json_peer = json_object_new_object();
8048
8049 if (peer_dynamic_neighbor(peer)) {
8050 dn_count++;
8051 json_object_boolean_true_add(json_peer,
8052 "dynamicPeer");
8053 }
8054
8055 if (peer->hostname)
8056 json_object_string_add(json_peer, "hostname",
8057 peer->hostname);
8058
8059 if (peer->domainname)
8060 json_object_string_add(json_peer, "domainname",
8061 peer->domainname);
8062
8063 json_object_int_add(json_peer, "remoteAs", peer->as);
8064 json_object_int_add(json_peer, "version", 4);
8065 json_object_int_add(json_peer, "msgRcvd",
8066 PEER_TOTAL_RX(peer));
8067 json_object_int_add(json_peer, "msgSent",
8068 PEER_TOTAL_TX(peer));
8069
8070 json_object_int_add(json_peer, "tableVersion",
8071 peer->version[afi][safi]);
8072 json_object_int_add(json_peer, "outq",
8073 peer->obuf->count);
8074 json_object_int_add(json_peer, "inq", 0);
8075 peer_uptime(peer->uptime, timebuf, BGP_UPTIME_LEN,
8076 use_json, json_peer);
8077
8078 /*
8079 * Adding "pfxRcd" field to match with the corresponding
8080 * CLI. "prefixReceivedCount" will be deprecated in
8081 * future.
8082 */
8083 json_object_int_add(json_peer, "prefixReceivedCount",
8084 peer->pcount[afi][pfx_rcd_safi]);
8085 json_object_int_add(json_peer, "pfxRcd",
8086 peer->pcount[afi][pfx_rcd_safi]);
8087
8088 paf = peer_af_find(peer, afi, pfx_rcd_safi);
8089 if (paf && PAF_SUBGRP(paf))
8090 json_object_int_add(json_peer,
8091 "pfxSnt",
8092 (PAF_SUBGRP(paf))->scount);
8093
8094 if (CHECK_FLAG(peer->flags, PEER_FLAG_SHUTDOWN))
8095 json_object_string_add(json_peer, "state",
8096 "Idle (Admin)");
8097 else if (peer->afc_recv[afi][safi])
8098 json_object_string_add(
8099 json_peer, "state",
8100 lookup_msg(bgp_status_msg, peer->status,
8101 NULL));
8102 else if (CHECK_FLAG(peer->sflags,
8103 PEER_STATUS_PREFIX_OVERFLOW))
8104 json_object_string_add(json_peer, "state",
8105 "Idle (PfxCt)");
8106 else
8107 json_object_string_add(
8108 json_peer, "state",
8109 lookup_msg(bgp_status_msg, peer->status,
8110 NULL));
8111
8112 if (peer->conf_if)
8113 json_object_string_add(json_peer, "idType",
8114 "interface");
8115 else if (peer->su.sa.sa_family == AF_INET)
8116 json_object_string_add(json_peer, "idType",
8117 "ipv4");
8118 else if (peer->su.sa.sa_family == AF_INET6)
8119 json_object_string_add(json_peer, "idType",
8120 "ipv6");
8121
8122 json_object_object_add(json_peers, peer->host,
8123 json_peer);
8124 } else {
8125 memset(dn_flag, '\0', sizeof(dn_flag));
8126 if (peer_dynamic_neighbor(peer)) {
8127 dn_count++;
8128 dn_flag[0] = '*';
8129 }
8130
8131 if (peer->hostname
8132 && bgp_flag_check(bgp, BGP_FLAG_SHOW_HOSTNAME))
8133 len = vty_out(vty, "%s%s(%s)", dn_flag,
8134 peer->hostname, peer->host);
8135 else
8136 len = vty_out(vty, "%s%s", dn_flag, peer->host);
8137
8138 /* pad the neighbor column with spaces */
8139 if (len < max_neighbor_width)
8140 vty_out(vty, "%*s", max_neighbor_width - len,
8141 " ");
8142
8143 vty_out(vty, "4 %10u %7u %7u %8" PRIu64 " %4d %4zd %8s",
8144 peer->as, PEER_TOTAL_RX(peer),
8145 PEER_TOTAL_TX(peer), peer->version[afi][safi],
8146 0, peer->obuf->count,
8147 peer_uptime(peer->uptime, timebuf,
8148 BGP_UPTIME_LEN, 0, NULL));
8149
8150 if (peer->status == Established)
8151 if (peer->afc_recv[afi][safi])
8152 vty_out(vty, " %12ld",
8153 peer->pcount[afi]
8154 [pfx_rcd_safi]);
8155 else
8156 vty_out(vty, " NoNeg");
8157 else {
8158 if (CHECK_FLAG(peer->flags, PEER_FLAG_SHUTDOWN))
8159 vty_out(vty, " Idle (Admin)");
8160 else if (CHECK_FLAG(
8161 peer->sflags,
8162 PEER_STATUS_PREFIX_OVERFLOW))
8163 vty_out(vty, " Idle (PfxCt)");
8164 else
8165 vty_out(vty, " %12s",
8166 lookup_msg(bgp_status_msg,
8167 peer->status, NULL));
8168 }
8169 vty_out(vty, "\n");
8170 }
8171 }
8172
8173 if (use_json) {
8174 json_object_object_add(json, "peers", json_peers);
8175
8176 json_object_int_add(json, "totalPeers", count);
8177 json_object_int_add(json, "dynamicPeers", dn_count);
8178
8179 bgp_show_bestpath_json(bgp, json);
8180
8181 vty_out(vty, "%s\n", json_object_to_json_string_ext(
8182 json, JSON_C_TO_STRING_PRETTY));
8183 json_object_free(json);
8184 } else {
8185 if (count)
8186 vty_out(vty, "\nTotal number of neighbors %d\n", count);
8187 else {
8188 vty_out(vty, "No %s neighbor is configured\n",
8189 afi_safi_print(afi, safi));
8190 }
8191
8192 if (dn_count) {
8193 vty_out(vty, "* - dynamic neighbor\n");
8194 vty_out(vty, "%d dynamic neighbor(s), limit %d\n",
8195 dn_count, bgp->dynamic_neighbors_limit);
8196 }
8197 }
8198
8199 return CMD_SUCCESS;
8200 }
8201
8202 static void bgp_show_summary_afi_safi(struct vty *vty, struct bgp *bgp, int afi,
8203 int safi, bool use_json,
8204 json_object *json)
8205 {
8206 int is_first = 1;
8207 int afi_wildcard = (afi == AFI_MAX);
8208 int safi_wildcard = (safi == SAFI_MAX);
8209 int is_wildcard = (afi_wildcard || safi_wildcard);
8210 bool nbr_output = false;
8211
8212 if (use_json && is_wildcard)
8213 vty_out(vty, "{\n");
8214 if (afi_wildcard)
8215 afi = 1; /* AFI_IP */
8216 while (afi < AFI_MAX) {
8217 if (safi_wildcard)
8218 safi = 1; /* SAFI_UNICAST */
8219 while (safi < SAFI_MAX) {
8220 if (bgp_afi_safi_peer_exists(bgp, afi, safi)) {
8221 nbr_output = true;
8222 if (is_wildcard) {
8223 /*
8224 * So limit output to those afi/safi
8225 * pairs that
8226 * actualy have something interesting in
8227 * them
8228 */
8229 if (use_json) {
8230 json = json_object_new_object();
8231
8232 if (!is_first)
8233 vty_out(vty, ",\n");
8234 else
8235 is_first = 0;
8236
8237 vty_out(vty, "\"%s\":",
8238 afi_safi_json(afi,
8239 safi));
8240 } else {
8241 vty_out(vty, "\n%s Summary:\n",
8242 afi_safi_print(afi,
8243 safi));
8244 }
8245 }
8246 bgp_show_summary(vty, bgp, afi, safi, use_json,
8247 json);
8248 }
8249 safi++;
8250 if (!safi_wildcard)
8251 safi = SAFI_MAX;
8252 }
8253 afi++;
8254 if (!afi_wildcard)
8255 afi = AFI_MAX;
8256 }
8257
8258 if (use_json && is_wildcard)
8259 vty_out(vty, "}\n");
8260 else if (!nbr_output) {
8261 if (use_json)
8262 vty_out(vty, "{}\n");
8263 else
8264 vty_out(vty, "%% No BGP neighbors found\n");
8265 }
8266 }
8267
8268 static void bgp_show_all_instances_summary_vty(struct vty *vty, afi_t afi,
8269 safi_t safi, bool use_json)
8270 {
8271 struct listnode *node, *nnode;
8272 struct bgp *bgp;
8273 json_object *json = NULL;
8274 int is_first = 1;
8275 bool nbr_output = false;
8276
8277 if (use_json)
8278 vty_out(vty, "{\n");
8279
8280 for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) {
8281 nbr_output = true;
8282 if (use_json) {
8283 json = json_object_new_object();
8284
8285 if (!is_first)
8286 vty_out(vty, ",\n");
8287 else
8288 is_first = 0;
8289
8290 vty_out(vty, "\"%s\":",
8291 (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)
8292 ? VRF_DEFAULT_NAME
8293 : bgp->name);
8294 } else {
8295 vty_out(vty, "\nInstance %s:\n",
8296 (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)
8297 ? VRF_DEFAULT_NAME
8298 : bgp->name);
8299 }
8300 bgp_show_summary_afi_safi(vty, bgp, afi, safi, use_json, json);
8301 }
8302
8303 if (use_json)
8304 vty_out(vty, "}\n");
8305 else if (!nbr_output)
8306 vty_out(vty, "%% BGP instance not found\n");
8307 }
8308
8309 int bgp_show_summary_vty(struct vty *vty, const char *name, afi_t afi,
8310 safi_t safi, bool use_json)
8311 {
8312 struct bgp *bgp;
8313
8314 if (name) {
8315 if (strmatch(name, "all")) {
8316 bgp_show_all_instances_summary_vty(vty, afi, safi,
8317 use_json);
8318 return CMD_SUCCESS;
8319 } else {
8320 bgp = bgp_lookup_by_name(name);
8321
8322 if (!bgp) {
8323 if (use_json)
8324 vty_out(vty, "{}\n");
8325 else
8326 vty_out(vty,
8327 "%% BGP instance not found\n");
8328 return CMD_WARNING;
8329 }
8330
8331 bgp_show_summary_afi_safi(vty, bgp, afi, safi, use_json,
8332 NULL);
8333 return CMD_SUCCESS;
8334 }
8335 }
8336
8337 bgp = bgp_get_default();
8338
8339 if (bgp)
8340 bgp_show_summary_afi_safi(vty, bgp, afi, safi, use_json, NULL);
8341 else {
8342 if (use_json)
8343 vty_out(vty, "{}\n");
8344 else
8345 vty_out(vty, "%% BGP instance not found\n");
8346 return CMD_WARNING;
8347 }
8348
8349 return CMD_SUCCESS;
8350 }
8351
8352 /* `show [ip] bgp summary' commands. */
8353 DEFUN (show_ip_bgp_summary,
8354 show_ip_bgp_summary_cmd,
8355 "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR" ["BGP_SAFI_WITH_LABEL_CMD_STR"]] summary [json]",
8356 SHOW_STR
8357 IP_STR
8358 BGP_STR
8359 BGP_INSTANCE_HELP_STR
8360 BGP_AFI_HELP_STR
8361 BGP_SAFI_WITH_LABEL_HELP_STR
8362 "Summary of BGP neighbor status\n"
8363 JSON_STR)
8364 {
8365 char *vrf = NULL;
8366 afi_t afi = AFI_MAX;
8367 safi_t safi = SAFI_MAX;
8368
8369 int idx = 0;
8370
8371 /* show [ip] bgp */
8372 if (argv_find(argv, argc, "ip", &idx))
8373 afi = AFI_IP;
8374 /* [<vrf> VIEWVRFNAME] */
8375 if (argv_find(argv, argc, "vrf", &idx)) {
8376 vrf = argv[idx + 1]->arg;
8377 if (vrf && strmatch(vrf, VRF_DEFAULT_NAME))
8378 vrf = NULL;
8379 } else if (argv_find(argv, argc, "view", &idx))
8380 /* [<view> VIEWVRFNAME] */
8381 vrf = argv[idx + 1]->arg;
8382 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
8383 if (argv_find_and_parse_afi(argv, argc, &idx, &afi)) {
8384 argv_find_and_parse_safi(argv, argc, &idx, &safi);
8385 }
8386
8387 bool uj = use_json(argc, argv);
8388
8389 return bgp_show_summary_vty(vty, vrf, afi, safi, uj);
8390 }
8391
8392 const char *afi_safi_print(afi_t afi, safi_t safi)
8393 {
8394 if (afi == AFI_IP && safi == SAFI_UNICAST)
8395 return "IPv4 Unicast";
8396 else if (afi == AFI_IP && safi == SAFI_MULTICAST)
8397 return "IPv4 Multicast";
8398 else if (afi == AFI_IP && safi == SAFI_LABELED_UNICAST)
8399 return "IPv4 Labeled Unicast";
8400 else if (afi == AFI_IP && safi == SAFI_MPLS_VPN)
8401 return "IPv4 VPN";
8402 else if (afi == AFI_IP && safi == SAFI_ENCAP)
8403 return "IPv4 Encap";
8404 else if (afi == AFI_IP && safi == SAFI_FLOWSPEC)
8405 return "IPv4 Flowspec";
8406 else if (afi == AFI_IP6 && safi == SAFI_UNICAST)
8407 return "IPv6 Unicast";
8408 else if (afi == AFI_IP6 && safi == SAFI_MULTICAST)
8409 return "IPv6 Multicast";
8410 else if (afi == AFI_IP6 && safi == SAFI_LABELED_UNICAST)
8411 return "IPv6 Labeled Unicast";
8412 else if (afi == AFI_IP6 && safi == SAFI_MPLS_VPN)
8413 return "IPv6 VPN";
8414 else if (afi == AFI_IP6 && safi == SAFI_ENCAP)
8415 return "IPv6 Encap";
8416 else if (afi == AFI_IP6 && safi == SAFI_FLOWSPEC)
8417 return "IPv6 Flowspec";
8418 else if (afi == AFI_L2VPN && safi == SAFI_EVPN)
8419 return "L2VPN EVPN";
8420 else
8421 return "Unknown";
8422 }
8423
8424 /*
8425 * Please note that we have intentionally camelCased
8426 * the return strings here. So if you want
8427 * to use this function, please ensure you
8428 * are doing this within json output
8429 */
8430 const char *afi_safi_json(afi_t afi, safi_t safi)
8431 {
8432 if (afi == AFI_IP && safi == SAFI_UNICAST)
8433 return "ipv4Unicast";
8434 else if (afi == AFI_IP && safi == SAFI_MULTICAST)
8435 return "ipv4Multicast";
8436 else if (afi == AFI_IP && safi == SAFI_LABELED_UNICAST)
8437 return "ipv4LabeledUnicast";
8438 else if (afi == AFI_IP && safi == SAFI_MPLS_VPN)
8439 return "ipv4Vpn";
8440 else if (afi == AFI_IP && safi == SAFI_ENCAP)
8441 return "ipv4Encap";
8442 else if (afi == AFI_IP && safi == SAFI_FLOWSPEC)
8443 return "ipv4Flowspec";
8444 else if (afi == AFI_IP6 && safi == SAFI_UNICAST)
8445 return "ipv6Unicast";
8446 else if (afi == AFI_IP6 && safi == SAFI_MULTICAST)
8447 return "ipv6Multicast";
8448 else if (afi == AFI_IP6 && safi == SAFI_LABELED_UNICAST)
8449 return "ipv6LabeledUnicast";
8450 else if (afi == AFI_IP6 && safi == SAFI_MPLS_VPN)
8451 return "ipv6Vpn";
8452 else if (afi == AFI_IP6 && safi == SAFI_ENCAP)
8453 return "ipv6Encap";
8454 else if (afi == AFI_IP6 && safi == SAFI_FLOWSPEC)
8455 return "ipv6Flowspec";
8456 else if (afi == AFI_L2VPN && safi == SAFI_EVPN)
8457 return "l2VpnEvpn";
8458 else
8459 return "Unknown";
8460 }
8461
8462 /* Show BGP peer's information. */
8463 enum show_type { show_all, show_peer, show_ipv4_all, show_ipv6_all, show_ipv4_peer, show_ipv6_peer };
8464
8465 static void bgp_show_peer_afi_orf_cap(struct vty *vty, struct peer *p,
8466 afi_t afi, safi_t safi,
8467 uint16_t adv_smcap, uint16_t adv_rmcap,
8468 uint16_t rcv_smcap, uint16_t rcv_rmcap,
8469 bool use_json, json_object *json_pref)
8470 {
8471 /* Send-Mode */
8472 if (CHECK_FLAG(p->af_cap[afi][safi], adv_smcap)
8473 || CHECK_FLAG(p->af_cap[afi][safi], rcv_smcap)) {
8474 if (use_json) {
8475 if (CHECK_FLAG(p->af_cap[afi][safi], adv_smcap)
8476 && CHECK_FLAG(p->af_cap[afi][safi], rcv_smcap))
8477 json_object_string_add(json_pref, "sendMode",
8478 "advertisedAndReceived");
8479 else if (CHECK_FLAG(p->af_cap[afi][safi], adv_smcap))
8480 json_object_string_add(json_pref, "sendMode",
8481 "advertised");
8482 else if (CHECK_FLAG(p->af_cap[afi][safi], rcv_smcap))
8483 json_object_string_add(json_pref, "sendMode",
8484 "received");
8485 } else {
8486 vty_out(vty, " Send-mode: ");
8487 if (CHECK_FLAG(p->af_cap[afi][safi], adv_smcap))
8488 vty_out(vty, "advertised");
8489 if (CHECK_FLAG(p->af_cap[afi][safi], rcv_smcap))
8490 vty_out(vty, "%sreceived",
8491 CHECK_FLAG(p->af_cap[afi][safi],
8492 adv_smcap)
8493 ? ", "
8494 : "");
8495 vty_out(vty, "\n");
8496 }
8497 }
8498
8499 /* Receive-Mode */
8500 if (CHECK_FLAG(p->af_cap[afi][safi], adv_rmcap)
8501 || CHECK_FLAG(p->af_cap[afi][safi], rcv_rmcap)) {
8502 if (use_json) {
8503 if (CHECK_FLAG(p->af_cap[afi][safi], adv_rmcap)
8504 && CHECK_FLAG(p->af_cap[afi][safi], rcv_rmcap))
8505 json_object_string_add(json_pref, "recvMode",
8506 "advertisedAndReceived");
8507 else if (CHECK_FLAG(p->af_cap[afi][safi], adv_rmcap))
8508 json_object_string_add(json_pref, "recvMode",
8509 "advertised");
8510 else if (CHECK_FLAG(p->af_cap[afi][safi], rcv_rmcap))
8511 json_object_string_add(json_pref, "recvMode",
8512 "received");
8513 } else {
8514 vty_out(vty, " Receive-mode: ");
8515 if (CHECK_FLAG(p->af_cap[afi][safi], adv_rmcap))
8516 vty_out(vty, "advertised");
8517 if (CHECK_FLAG(p->af_cap[afi][safi], rcv_rmcap))
8518 vty_out(vty, "%sreceived",
8519 CHECK_FLAG(p->af_cap[afi][safi],
8520 adv_rmcap)
8521 ? ", "
8522 : "");
8523 vty_out(vty, "\n");
8524 }
8525 }
8526 }
8527
8528 static void bgp_show_peer_afi(struct vty *vty, struct peer *p, afi_t afi,
8529 safi_t safi, bool use_json,
8530 json_object *json_neigh)
8531 {
8532 struct bgp_filter *filter;
8533 struct peer_af *paf;
8534 char orf_pfx_name[BUFSIZ];
8535 int orf_pfx_count;
8536 json_object *json_af = NULL;
8537 json_object *json_prefA = NULL;
8538 json_object *json_prefB = NULL;
8539 json_object *json_addr = NULL;
8540
8541 if (use_json) {
8542 json_addr = json_object_new_object();
8543 json_af = json_object_new_object();
8544 filter = &p->filter[afi][safi];
8545
8546 if (peer_group_active(p))
8547 json_object_string_add(json_addr, "peerGroupMember",
8548 p->group->name);
8549
8550 paf = peer_af_find(p, afi, safi);
8551 if (paf && PAF_SUBGRP(paf)) {
8552 json_object_int_add(json_addr, "updateGroupId",
8553 PAF_UPDGRP(paf)->id);
8554 json_object_int_add(json_addr, "subGroupId",
8555 PAF_SUBGRP(paf)->id);
8556 json_object_int_add(json_addr, "packetQueueLength",
8557 bpacket_queue_virtual_length(paf));
8558 }
8559
8560 if (CHECK_FLAG(p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
8561 || CHECK_FLAG(p->af_cap[afi][safi],
8562 PEER_CAP_ORF_PREFIX_SM_RCV)
8563 || CHECK_FLAG(p->af_cap[afi][safi],
8564 PEER_CAP_ORF_PREFIX_RM_ADV)
8565 || CHECK_FLAG(p->af_cap[afi][safi],
8566 PEER_CAP_ORF_PREFIX_RM_RCV)) {
8567 json_object_int_add(json_af, "orfType",
8568 ORF_TYPE_PREFIX);
8569 json_prefA = json_object_new_object();
8570 bgp_show_peer_afi_orf_cap(vty, p, afi, safi,
8571 PEER_CAP_ORF_PREFIX_SM_ADV,
8572 PEER_CAP_ORF_PREFIX_RM_ADV,
8573 PEER_CAP_ORF_PREFIX_SM_RCV,
8574 PEER_CAP_ORF_PREFIX_RM_RCV,
8575 use_json, json_prefA);
8576 json_object_object_add(json_af, "orfPrefixList",
8577 json_prefA);
8578 }
8579
8580 if (CHECK_FLAG(p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
8581 || CHECK_FLAG(p->af_cap[afi][safi],
8582 PEER_CAP_ORF_PREFIX_SM_OLD_RCV)
8583 || CHECK_FLAG(p->af_cap[afi][safi],
8584 PEER_CAP_ORF_PREFIX_RM_ADV)
8585 || CHECK_FLAG(p->af_cap[afi][safi],
8586 PEER_CAP_ORF_PREFIX_RM_OLD_RCV)) {
8587 json_object_int_add(json_af, "orfOldType",
8588 ORF_TYPE_PREFIX_OLD);
8589 json_prefB = json_object_new_object();
8590 bgp_show_peer_afi_orf_cap(
8591 vty, p, afi, safi, PEER_CAP_ORF_PREFIX_SM_ADV,
8592 PEER_CAP_ORF_PREFIX_RM_ADV,
8593 PEER_CAP_ORF_PREFIX_SM_OLD_RCV,
8594 PEER_CAP_ORF_PREFIX_RM_OLD_RCV, use_json,
8595 json_prefB);
8596 json_object_object_add(json_af, "orfOldPrefixList",
8597 json_prefB);
8598 }
8599
8600 if (CHECK_FLAG(p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
8601 || CHECK_FLAG(p->af_cap[afi][safi],
8602 PEER_CAP_ORF_PREFIX_SM_RCV)
8603 || CHECK_FLAG(p->af_cap[afi][safi],
8604 PEER_CAP_ORF_PREFIX_SM_OLD_RCV)
8605 || CHECK_FLAG(p->af_cap[afi][safi],
8606 PEER_CAP_ORF_PREFIX_RM_ADV)
8607 || CHECK_FLAG(p->af_cap[afi][safi],
8608 PEER_CAP_ORF_PREFIX_RM_RCV)
8609 || CHECK_FLAG(p->af_cap[afi][safi],
8610 PEER_CAP_ORF_PREFIX_RM_OLD_RCV))
8611 json_object_object_add(json_addr, "afDependentCap",
8612 json_af);
8613 else
8614 json_object_free(json_af);
8615
8616 sprintf(orf_pfx_name, "%s.%d.%d", p->host, afi, safi);
8617 orf_pfx_count = prefix_bgp_show_prefix_list(
8618 NULL, afi, orf_pfx_name, use_json);
8619
8620 if (CHECK_FLAG(p->af_sflags[afi][safi],
8621 PEER_STATUS_ORF_PREFIX_SEND)
8622 || orf_pfx_count) {
8623 if (CHECK_FLAG(p->af_sflags[afi][safi],
8624 PEER_STATUS_ORF_PREFIX_SEND))
8625 json_object_boolean_true_add(json_neigh,
8626 "orfSent");
8627 if (orf_pfx_count)
8628 json_object_int_add(json_addr, "orfRecvCounter",
8629 orf_pfx_count);
8630 }
8631 if (CHECK_FLAG(p->af_sflags[afi][safi],
8632 PEER_STATUS_ORF_WAIT_REFRESH))
8633 json_object_string_add(
8634 json_addr, "orfFirstUpdate",
8635 "deferredUntilORFOrRouteRefreshRecvd");
8636
8637 if (CHECK_FLAG(p->af_flags[afi][safi],
8638 PEER_FLAG_REFLECTOR_CLIENT))
8639 json_object_boolean_true_add(json_addr,
8640 "routeReflectorClient");
8641 if (CHECK_FLAG(p->af_flags[afi][safi],
8642 PEER_FLAG_RSERVER_CLIENT))
8643 json_object_boolean_true_add(json_addr,
8644 "routeServerClient");
8645 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
8646 json_object_boolean_true_add(json_addr,
8647 "inboundSoftConfigPermit");
8648
8649 if (CHECK_FLAG(p->af_flags[afi][safi],
8650 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE))
8651 json_object_boolean_true_add(
8652 json_addr,
8653 "privateAsNumsAllReplacedInUpdatesToNbr");
8654 else if (CHECK_FLAG(p->af_flags[afi][safi],
8655 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE))
8656 json_object_boolean_true_add(
8657 json_addr,
8658 "privateAsNumsReplacedInUpdatesToNbr");
8659 else if (CHECK_FLAG(p->af_flags[afi][safi],
8660 PEER_FLAG_REMOVE_PRIVATE_AS_ALL))
8661 json_object_boolean_true_add(
8662 json_addr,
8663 "privateAsNumsAllRemovedInUpdatesToNbr");
8664 else if (CHECK_FLAG(p->af_flags[afi][safi],
8665 PEER_FLAG_REMOVE_PRIVATE_AS))
8666 json_object_boolean_true_add(
8667 json_addr,
8668 "privateAsNumsRemovedInUpdatesToNbr");
8669
8670 if (p->addpath_type[afi][safi] != BGP_ADDPATH_NONE)
8671 json_object_boolean_true_add(
8672 json_addr,
8673 bgp_addpath_names(p->addpath_type[afi][safi])
8674 ->type_json_name);
8675
8676 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_AS_OVERRIDE))
8677 json_object_string_add(json_addr,
8678 "overrideASNsInOutboundUpdates",
8679 "ifAspathEqualRemoteAs");
8680
8681 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_NEXTHOP_SELF)
8682 || CHECK_FLAG(p->af_flags[afi][safi],
8683 PEER_FLAG_FORCE_NEXTHOP_SELF))
8684 json_object_boolean_true_add(json_addr,
8685 "routerAlwaysNextHop");
8686 if (CHECK_FLAG(p->af_flags[afi][safi],
8687 PEER_FLAG_AS_PATH_UNCHANGED))
8688 json_object_boolean_true_add(
8689 json_addr, "unchangedAsPathPropogatedToNbr");
8690 if (CHECK_FLAG(p->af_flags[afi][safi],
8691 PEER_FLAG_NEXTHOP_UNCHANGED))
8692 json_object_boolean_true_add(
8693 json_addr, "unchangedNextHopPropogatedToNbr");
8694 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_MED_UNCHANGED))
8695 json_object_boolean_true_add(
8696 json_addr, "unchangedMedPropogatedToNbr");
8697 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_SEND_COMMUNITY)
8698 || CHECK_FLAG(p->af_flags[afi][safi],
8699 PEER_FLAG_SEND_EXT_COMMUNITY)) {
8700 if (CHECK_FLAG(p->af_flags[afi][safi],
8701 PEER_FLAG_SEND_COMMUNITY)
8702 && CHECK_FLAG(p->af_flags[afi][safi],
8703 PEER_FLAG_SEND_EXT_COMMUNITY))
8704 json_object_string_add(json_addr,
8705 "commAttriSentToNbr",
8706 "extendedAndStandard");
8707 else if (CHECK_FLAG(p->af_flags[afi][safi],
8708 PEER_FLAG_SEND_EXT_COMMUNITY))
8709 json_object_string_add(json_addr,
8710 "commAttriSentToNbr",
8711 "extended");
8712 else
8713 json_object_string_add(json_addr,
8714 "commAttriSentToNbr",
8715 "standard");
8716 }
8717 if (CHECK_FLAG(p->af_flags[afi][safi],
8718 PEER_FLAG_DEFAULT_ORIGINATE)) {
8719 if (p->default_rmap[afi][safi].name)
8720 json_object_string_add(
8721 json_addr, "defaultRouteMap",
8722 p->default_rmap[afi][safi].name);
8723
8724 if (paf && PAF_SUBGRP(paf)
8725 && CHECK_FLAG(PAF_SUBGRP(paf)->sflags,
8726 SUBGRP_STATUS_DEFAULT_ORIGINATE))
8727 json_object_boolean_true_add(json_addr,
8728 "defaultSent");
8729 else
8730 json_object_boolean_true_add(json_addr,
8731 "defaultNotSent");
8732 }
8733
8734 if (afi == AFI_L2VPN && safi == SAFI_EVPN) {
8735 if (is_evpn_enabled())
8736 json_object_boolean_true_add(
8737 json_addr, "advertiseAllVnis");
8738 }
8739
8740 if (filter->plist[FILTER_IN].name
8741 || filter->dlist[FILTER_IN].name
8742 || filter->aslist[FILTER_IN].name
8743 || filter->map[RMAP_IN].name)
8744 json_object_boolean_true_add(json_addr,
8745 "inboundPathPolicyConfig");
8746 if (filter->plist[FILTER_OUT].name
8747 || filter->dlist[FILTER_OUT].name
8748 || filter->aslist[FILTER_OUT].name
8749 || filter->map[RMAP_OUT].name || filter->usmap.name)
8750 json_object_boolean_true_add(
8751 json_addr, "outboundPathPolicyConfig");
8752
8753 /* prefix-list */
8754 if (filter->plist[FILTER_IN].name)
8755 json_object_string_add(json_addr,
8756 "incomingUpdatePrefixFilterList",
8757 filter->plist[FILTER_IN].name);
8758 if (filter->plist[FILTER_OUT].name)
8759 json_object_string_add(json_addr,
8760 "outgoingUpdatePrefixFilterList",
8761 filter->plist[FILTER_OUT].name);
8762
8763 /* distribute-list */
8764 if (filter->dlist[FILTER_IN].name)
8765 json_object_string_add(
8766 json_addr, "incomingUpdateNetworkFilterList",
8767 filter->dlist[FILTER_IN].name);
8768 if (filter->dlist[FILTER_OUT].name)
8769 json_object_string_add(
8770 json_addr, "outgoingUpdateNetworkFilterList",
8771 filter->dlist[FILTER_OUT].name);
8772
8773 /* filter-list. */
8774 if (filter->aslist[FILTER_IN].name)
8775 json_object_string_add(json_addr,
8776 "incomingUpdateAsPathFilterList",
8777 filter->aslist[FILTER_IN].name);
8778 if (filter->aslist[FILTER_OUT].name)
8779 json_object_string_add(json_addr,
8780 "outgoingUpdateAsPathFilterList",
8781 filter->aslist[FILTER_OUT].name);
8782
8783 /* route-map. */
8784 if (filter->map[RMAP_IN].name)
8785 json_object_string_add(
8786 json_addr, "routeMapForIncomingAdvertisements",
8787 filter->map[RMAP_IN].name);
8788 if (filter->map[RMAP_OUT].name)
8789 json_object_string_add(
8790 json_addr, "routeMapForOutgoingAdvertisements",
8791 filter->map[RMAP_OUT].name);
8792
8793 /* ebgp-requires-policy (inbound) */
8794 if (p->bgp->ebgp_requires_policy == DEFAULT_EBGP_POLICY_ENABLED
8795 && !bgp_inbound_policy_exists(p, filter))
8796 json_object_string_add(
8797 json_addr, "inboundEbgpRequiresPolicy",
8798 "Inbound updates discarded due to missing policy");
8799
8800 /* ebgp-requires-policy (outbound) */
8801 if (p->bgp->ebgp_requires_policy == DEFAULT_EBGP_POLICY_ENABLED
8802 && (!bgp_outbound_policy_exists(p, filter)))
8803 json_object_string_add(
8804 json_addr, "outboundEbgpRequiresPolicy",
8805 "Outbound updates discarded due to missing policy");
8806
8807 /* unsuppress-map */
8808 if (filter->usmap.name)
8809 json_object_string_add(json_addr,
8810 "selectiveUnsuppressRouteMap",
8811 filter->usmap.name);
8812
8813 /* Receive prefix count */
8814 json_object_int_add(json_addr, "acceptedPrefixCounter",
8815 p->pcount[afi][safi]);
8816 if (paf && PAF_SUBGRP(paf))
8817 json_object_int_add(json_addr, "sentPrefixCounter",
8818 (PAF_SUBGRP(paf))->scount);
8819
8820 /* Maximum prefix */
8821 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX)) {
8822 json_object_int_add(json_addr, "prefixAllowedMax",
8823 p->pmax[afi][safi]);
8824 if (CHECK_FLAG(p->af_flags[afi][safi],
8825 PEER_FLAG_MAX_PREFIX_WARNING))
8826 json_object_boolean_true_add(
8827 json_addr, "prefixAllowedMaxWarning");
8828 json_object_int_add(json_addr,
8829 "prefixAllowedWarningThresh",
8830 p->pmax_threshold[afi][safi]);
8831 if (p->pmax_restart[afi][safi])
8832 json_object_int_add(
8833 json_addr,
8834 "prefixAllowedRestartIntervalMsecs",
8835 p->pmax_restart[afi][safi] * 60000);
8836 }
8837 json_object_object_add(json_neigh, afi_safi_print(afi, safi),
8838 json_addr);
8839
8840 } else {
8841 filter = &p->filter[afi][safi];
8842
8843 vty_out(vty, " For address family: %s\n",
8844 afi_safi_print(afi, safi));
8845
8846 if (peer_group_active(p))
8847 vty_out(vty, " %s peer-group member\n",
8848 p->group->name);
8849
8850 paf = peer_af_find(p, afi, safi);
8851 if (paf && PAF_SUBGRP(paf)) {
8852 vty_out(vty, " Update group %" PRIu64
8853 ", subgroup %" PRIu64 "\n",
8854 PAF_UPDGRP(paf)->id, PAF_SUBGRP(paf)->id);
8855 vty_out(vty, " Packet Queue length %d\n",
8856 bpacket_queue_virtual_length(paf));
8857 } else {
8858 vty_out(vty, " Not part of any update group\n");
8859 }
8860 if (CHECK_FLAG(p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
8861 || CHECK_FLAG(p->af_cap[afi][safi],
8862 PEER_CAP_ORF_PREFIX_SM_RCV)
8863 || CHECK_FLAG(p->af_cap[afi][safi],
8864 PEER_CAP_ORF_PREFIX_SM_OLD_RCV)
8865 || CHECK_FLAG(p->af_cap[afi][safi],
8866 PEER_CAP_ORF_PREFIX_RM_ADV)
8867 || CHECK_FLAG(p->af_cap[afi][safi],
8868 PEER_CAP_ORF_PREFIX_RM_RCV)
8869 || CHECK_FLAG(p->af_cap[afi][safi],
8870 PEER_CAP_ORF_PREFIX_RM_OLD_RCV))
8871 vty_out(vty, " AF-dependant capabilities:\n");
8872
8873 if (CHECK_FLAG(p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
8874 || CHECK_FLAG(p->af_cap[afi][safi],
8875 PEER_CAP_ORF_PREFIX_SM_RCV)
8876 || CHECK_FLAG(p->af_cap[afi][safi],
8877 PEER_CAP_ORF_PREFIX_RM_ADV)
8878 || CHECK_FLAG(p->af_cap[afi][safi],
8879 PEER_CAP_ORF_PREFIX_RM_RCV)) {
8880 vty_out(vty,
8881 " Outbound Route Filter (ORF) type (%d) Prefix-list:\n",
8882 ORF_TYPE_PREFIX);
8883 bgp_show_peer_afi_orf_cap(
8884 vty, p, afi, safi, PEER_CAP_ORF_PREFIX_SM_ADV,
8885 PEER_CAP_ORF_PREFIX_RM_ADV,
8886 PEER_CAP_ORF_PREFIX_SM_RCV,
8887 PEER_CAP_ORF_PREFIX_RM_RCV, use_json, NULL);
8888 }
8889 if (CHECK_FLAG(p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
8890 || CHECK_FLAG(p->af_cap[afi][safi],
8891 PEER_CAP_ORF_PREFIX_SM_OLD_RCV)
8892 || CHECK_FLAG(p->af_cap[afi][safi],
8893 PEER_CAP_ORF_PREFIX_RM_ADV)
8894 || CHECK_FLAG(p->af_cap[afi][safi],
8895 PEER_CAP_ORF_PREFIX_RM_OLD_RCV)) {
8896 vty_out(vty,
8897 " Outbound Route Filter (ORF) type (%d) Prefix-list:\n",
8898 ORF_TYPE_PREFIX_OLD);
8899 bgp_show_peer_afi_orf_cap(
8900 vty, p, afi, safi, PEER_CAP_ORF_PREFIX_SM_ADV,
8901 PEER_CAP_ORF_PREFIX_RM_ADV,
8902 PEER_CAP_ORF_PREFIX_SM_OLD_RCV,
8903 PEER_CAP_ORF_PREFIX_RM_OLD_RCV, use_json, NULL);
8904 }
8905
8906 sprintf(orf_pfx_name, "%s.%d.%d", p->host, afi, safi);
8907 orf_pfx_count = prefix_bgp_show_prefix_list(
8908 NULL, afi, orf_pfx_name, use_json);
8909
8910 if (CHECK_FLAG(p->af_sflags[afi][safi],
8911 PEER_STATUS_ORF_PREFIX_SEND)
8912 || orf_pfx_count) {
8913 vty_out(vty, " Outbound Route Filter (ORF):");
8914 if (CHECK_FLAG(p->af_sflags[afi][safi],
8915 PEER_STATUS_ORF_PREFIX_SEND))
8916 vty_out(vty, " sent;");
8917 if (orf_pfx_count)
8918 vty_out(vty, " received (%d entries)",
8919 orf_pfx_count);
8920 vty_out(vty, "\n");
8921 }
8922 if (CHECK_FLAG(p->af_sflags[afi][safi],
8923 PEER_STATUS_ORF_WAIT_REFRESH))
8924 vty_out(vty,
8925 " First update is deferred until ORF or ROUTE-REFRESH is received\n");
8926
8927 if (CHECK_FLAG(p->af_flags[afi][safi],
8928 PEER_FLAG_REFLECTOR_CLIENT))
8929 vty_out(vty, " Route-Reflector Client\n");
8930 if (CHECK_FLAG(p->af_flags[afi][safi],
8931 PEER_FLAG_RSERVER_CLIENT))
8932 vty_out(vty, " Route-Server Client\n");
8933 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
8934 vty_out(vty,
8935 " Inbound soft reconfiguration allowed\n");
8936
8937 if (CHECK_FLAG(p->af_flags[afi][safi],
8938 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE))
8939 vty_out(vty,
8940 " Private AS numbers (all) replaced in updates to this neighbor\n");
8941 else if (CHECK_FLAG(p->af_flags[afi][safi],
8942 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE))
8943 vty_out(vty,
8944 " Private AS numbers replaced in updates to this neighbor\n");
8945 else if (CHECK_FLAG(p->af_flags[afi][safi],
8946 PEER_FLAG_REMOVE_PRIVATE_AS_ALL))
8947 vty_out(vty,
8948 " Private AS numbers (all) removed in updates to this neighbor\n");
8949 else if (CHECK_FLAG(p->af_flags[afi][safi],
8950 PEER_FLAG_REMOVE_PRIVATE_AS))
8951 vty_out(vty,
8952 " Private AS numbers removed in updates to this neighbor\n");
8953
8954 if (p->addpath_type[afi][safi] != BGP_ADDPATH_NONE)
8955 vty_out(vty, " %s\n",
8956 bgp_addpath_names(p->addpath_type[afi][safi])
8957 ->human_description);
8958
8959 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_AS_OVERRIDE))
8960 vty_out(vty,
8961 " Override ASNs in outbound updates if aspath equals remote-as\n");
8962
8963 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_NEXTHOP_SELF)
8964 || CHECK_FLAG(p->af_flags[afi][safi],
8965 PEER_FLAG_FORCE_NEXTHOP_SELF))
8966 vty_out(vty, " NEXT_HOP is always this router\n");
8967 if (CHECK_FLAG(p->af_flags[afi][safi],
8968 PEER_FLAG_AS_PATH_UNCHANGED))
8969 vty_out(vty,
8970 " AS_PATH is propagated unchanged to this neighbor\n");
8971 if (CHECK_FLAG(p->af_flags[afi][safi],
8972 PEER_FLAG_NEXTHOP_UNCHANGED))
8973 vty_out(vty,
8974 " NEXT_HOP is propagated unchanged to this neighbor\n");
8975 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_MED_UNCHANGED))
8976 vty_out(vty,
8977 " MED is propagated unchanged to this neighbor\n");
8978 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_SEND_COMMUNITY)
8979 || CHECK_FLAG(p->af_flags[afi][safi],
8980 PEER_FLAG_SEND_EXT_COMMUNITY)
8981 || CHECK_FLAG(p->af_flags[afi][safi],
8982 PEER_FLAG_SEND_LARGE_COMMUNITY)) {
8983 vty_out(vty,
8984 " Community attribute sent to this neighbor");
8985 if (CHECK_FLAG(p->af_flags[afi][safi],
8986 PEER_FLAG_SEND_COMMUNITY)
8987 && CHECK_FLAG(p->af_flags[afi][safi],
8988 PEER_FLAG_SEND_EXT_COMMUNITY)
8989 && CHECK_FLAG(p->af_flags[afi][safi],
8990 PEER_FLAG_SEND_LARGE_COMMUNITY))
8991 vty_out(vty, "(all)\n");
8992 else if (CHECK_FLAG(p->af_flags[afi][safi],
8993 PEER_FLAG_SEND_LARGE_COMMUNITY))
8994 vty_out(vty, "(large)\n");
8995 else if (CHECK_FLAG(p->af_flags[afi][safi],
8996 PEER_FLAG_SEND_EXT_COMMUNITY))
8997 vty_out(vty, "(extended)\n");
8998 else
8999 vty_out(vty, "(standard)\n");
9000 }
9001 if (CHECK_FLAG(p->af_flags[afi][safi],
9002 PEER_FLAG_DEFAULT_ORIGINATE)) {
9003 vty_out(vty, " Default information originate,");
9004
9005 if (p->default_rmap[afi][safi].name)
9006 vty_out(vty, " default route-map %s%s,",
9007 p->default_rmap[afi][safi].map ? "*"
9008 : "",
9009 p->default_rmap[afi][safi].name);
9010 if (paf && PAF_SUBGRP(paf)
9011 && CHECK_FLAG(PAF_SUBGRP(paf)->sflags,
9012 SUBGRP_STATUS_DEFAULT_ORIGINATE))
9013 vty_out(vty, " default sent\n");
9014 else
9015 vty_out(vty, " default not sent\n");
9016 }
9017
9018 /* advertise-vni-all */
9019 if (afi == AFI_L2VPN && safi == SAFI_EVPN) {
9020 if (is_evpn_enabled())
9021 vty_out(vty, " advertise-all-vni\n");
9022 }
9023
9024 if (filter->plist[FILTER_IN].name
9025 || filter->dlist[FILTER_IN].name
9026 || filter->aslist[FILTER_IN].name
9027 || filter->map[RMAP_IN].name)
9028 vty_out(vty, " Inbound path policy configured\n");
9029 if (filter->plist[FILTER_OUT].name
9030 || filter->dlist[FILTER_OUT].name
9031 || filter->aslist[FILTER_OUT].name
9032 || filter->map[RMAP_OUT].name || filter->usmap.name)
9033 vty_out(vty, " Outbound path policy configured\n");
9034
9035 /* prefix-list */
9036 if (filter->plist[FILTER_IN].name)
9037 vty_out(vty,
9038 " Incoming update prefix filter list is %s%s\n",
9039 filter->plist[FILTER_IN].plist ? "*" : "",
9040 filter->plist[FILTER_IN].name);
9041 if (filter->plist[FILTER_OUT].name)
9042 vty_out(vty,
9043 " Outgoing update prefix filter list is %s%s\n",
9044 filter->plist[FILTER_OUT].plist ? "*" : "",
9045 filter->plist[FILTER_OUT].name);
9046
9047 /* distribute-list */
9048 if (filter->dlist[FILTER_IN].name)
9049 vty_out(vty,
9050 " Incoming update network filter list is %s%s\n",
9051 filter->dlist[FILTER_IN].alist ? "*" : "",
9052 filter->dlist[FILTER_IN].name);
9053 if (filter->dlist[FILTER_OUT].name)
9054 vty_out(vty,
9055 " Outgoing update network filter list is %s%s\n",
9056 filter->dlist[FILTER_OUT].alist ? "*" : "",
9057 filter->dlist[FILTER_OUT].name);
9058
9059 /* filter-list. */
9060 if (filter->aslist[FILTER_IN].name)
9061 vty_out(vty,
9062 " Incoming update AS path filter list is %s%s\n",
9063 filter->aslist[FILTER_IN].aslist ? "*" : "",
9064 filter->aslist[FILTER_IN].name);
9065 if (filter->aslist[FILTER_OUT].name)
9066 vty_out(vty,
9067 " Outgoing update AS path filter list is %s%s\n",
9068 filter->aslist[FILTER_OUT].aslist ? "*" : "",
9069 filter->aslist[FILTER_OUT].name);
9070
9071 /* route-map. */
9072 if (filter->map[RMAP_IN].name)
9073 vty_out(vty,
9074 " Route map for incoming advertisements is %s%s\n",
9075 filter->map[RMAP_IN].map ? "*" : "",
9076 filter->map[RMAP_IN].name);
9077 if (filter->map[RMAP_OUT].name)
9078 vty_out(vty,
9079 " Route map for outgoing advertisements is %s%s\n",
9080 filter->map[RMAP_OUT].map ? "*" : "",
9081 filter->map[RMAP_OUT].name);
9082
9083 /* ebgp-requires-policy (inbound) */
9084 if (p->bgp->ebgp_requires_policy == DEFAULT_EBGP_POLICY_ENABLED
9085 && !bgp_inbound_policy_exists(p, filter))
9086 vty_out(vty,
9087 " Inbound updates discarded due to missing policy\n");
9088
9089 /* ebgp-requires-policy (outbound) */
9090 if (p->bgp->ebgp_requires_policy == DEFAULT_EBGP_POLICY_ENABLED
9091 && !bgp_outbound_policy_exists(p, filter))
9092 vty_out(vty,
9093 " Outbound updates discarded due to missing policy\n");
9094
9095 /* unsuppress-map */
9096 if (filter->usmap.name)
9097 vty_out(vty,
9098 " Route map for selective unsuppress is %s%s\n",
9099 filter->usmap.map ? "*" : "",
9100 filter->usmap.name);
9101
9102 /* Receive prefix count */
9103 vty_out(vty, " %ld accepted prefixes\n", p->pcount[afi][safi]);
9104
9105 /* Maximum prefix */
9106 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX)) {
9107 vty_out(vty, " Maximum prefixes allowed %ld%s\n",
9108 p->pmax[afi][safi],
9109 CHECK_FLAG(p->af_flags[afi][safi],
9110 PEER_FLAG_MAX_PREFIX_WARNING)
9111 ? " (warning-only)"
9112 : "");
9113 vty_out(vty, " Threshold for warning message %d%%",
9114 p->pmax_threshold[afi][safi]);
9115 if (p->pmax_restart[afi][safi])
9116 vty_out(vty, ", restart interval %d min",
9117 p->pmax_restart[afi][safi]);
9118 vty_out(vty, "\n");
9119 }
9120
9121 vty_out(vty, "\n");
9122 }
9123 }
9124
9125 static void bgp_show_peer(struct vty *vty, struct peer *p, bool use_json,
9126 json_object *json)
9127 {
9128 struct bgp *bgp;
9129 char buf1[PREFIX2STR_BUFFER], buf[SU_ADDRSTRLEN];
9130 char timebuf[BGP_UPTIME_LEN];
9131 char dn_flag[2];
9132 const char *subcode_str;
9133 const char *code_str;
9134 afi_t afi;
9135 safi_t safi;
9136 uint16_t i;
9137 uint8_t *msg;
9138 json_object *json_neigh = NULL;
9139 time_t epoch_tbuf;
9140
9141 bgp = p->bgp;
9142
9143 if (use_json)
9144 json_neigh = json_object_new_object();
9145
9146 memset(dn_flag, '\0', sizeof(dn_flag));
9147 if (!p->conf_if && peer_dynamic_neighbor(p))
9148 dn_flag[0] = '*';
9149
9150 if (!use_json) {
9151 if (p->conf_if) /* Configured interface name. */
9152 vty_out(vty, "BGP neighbor on %s: %s, ", p->conf_if,
9153 BGP_PEER_SU_UNSPEC(p)
9154 ? "None"
9155 : sockunion2str(&p->su, buf,
9156 SU_ADDRSTRLEN));
9157 else /* Configured IP address. */
9158 vty_out(vty, "BGP neighbor is %s%s, ", dn_flag,
9159 p->host);
9160 }
9161
9162 if (use_json) {
9163 if (p->conf_if && BGP_PEER_SU_UNSPEC(p))
9164 json_object_string_add(json_neigh, "bgpNeighborAddr",
9165 "none");
9166 else if (p->conf_if && !BGP_PEER_SU_UNSPEC(p))
9167 json_object_string_add(
9168 json_neigh, "bgpNeighborAddr",
9169 sockunion2str(&p->su, buf, SU_ADDRSTRLEN));
9170
9171 json_object_int_add(json_neigh, "remoteAs", p->as);
9172
9173 if (p->change_local_as)
9174 json_object_int_add(json_neigh, "localAs",
9175 p->change_local_as);
9176 else
9177 json_object_int_add(json_neigh, "localAs", p->local_as);
9178
9179 if (CHECK_FLAG(p->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND))
9180 json_object_boolean_true_add(json_neigh,
9181 "localAsNoPrepend");
9182
9183 if (CHECK_FLAG(p->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS))
9184 json_object_boolean_true_add(json_neigh,
9185 "localAsReplaceAs");
9186 } else {
9187 if ((p->as_type == AS_SPECIFIED) || (p->as_type == AS_EXTERNAL)
9188 || (p->as_type == AS_INTERNAL))
9189 vty_out(vty, "remote AS %u, ", p->as);
9190 else
9191 vty_out(vty, "remote AS Unspecified, ");
9192 vty_out(vty, "local AS %u%s%s, ",
9193 p->change_local_as ? p->change_local_as : p->local_as,
9194 CHECK_FLAG(p->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND)
9195 ? " no-prepend"
9196 : "",
9197 CHECK_FLAG(p->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS)
9198 ? " replace-as"
9199 : "");
9200 }
9201 /* peer type internal or confed-internal */
9202 if ((p->as == p->local_as) || (p->as_type == AS_INTERNAL)) {
9203 if (use_json) {
9204 if (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION))
9205 json_object_boolean_true_add(
9206 json_neigh, "nbrConfedInternalLink");
9207 else
9208 json_object_boolean_true_add(json_neigh,
9209 "nbrInternalLink");
9210 } else {
9211 if (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION))
9212 vty_out(vty, "confed-internal link\n");
9213 else
9214 vty_out(vty, "internal link\n");
9215 }
9216 /* peer type external or confed-external */
9217 } else if (p->as || (p->as_type == AS_EXTERNAL)) {
9218 if (use_json) {
9219 if (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION))
9220 json_object_boolean_true_add(
9221 json_neigh, "nbrConfedExternalLink");
9222 else
9223 json_object_boolean_true_add(json_neigh,
9224 "nbrExternalLink");
9225 } else {
9226 if (bgp_confederation_peers_check(bgp, p->as))
9227 vty_out(vty, "confed-external link\n");
9228 else
9229 vty_out(vty, "external link\n");
9230 }
9231 } else {
9232 if (use_json)
9233 json_object_boolean_true_add(json_neigh,
9234 "nbrUnspecifiedLink");
9235 else
9236 vty_out(vty, "unspecified link\n");
9237 }
9238
9239 /* Description. */
9240 if (p->desc) {
9241 if (use_json)
9242 json_object_string_add(json_neigh, "nbrDesc", p->desc);
9243 else
9244 vty_out(vty, " Description: %s\n", p->desc);
9245 }
9246
9247 if (p->hostname) {
9248 if (use_json) {
9249 if (p->hostname)
9250 json_object_string_add(json_neigh, "hostname",
9251 p->hostname);
9252
9253 if (p->domainname)
9254 json_object_string_add(json_neigh, "domainname",
9255 p->domainname);
9256 } else {
9257 if (p->domainname && (p->domainname[0] != '\0'))
9258 vty_out(vty, "Hostname: %s.%s\n", p->hostname,
9259 p->domainname);
9260 else
9261 vty_out(vty, "Hostname: %s\n", p->hostname);
9262 }
9263 }
9264
9265 /* Peer-group */
9266 if (p->group) {
9267 if (use_json) {
9268 json_object_string_add(json_neigh, "peerGroup",
9269 p->group->name);
9270
9271 if (dn_flag[0]) {
9272 struct prefix prefix, *range = NULL;
9273
9274 sockunion2hostprefix(&(p->su), &prefix);
9275 range = peer_group_lookup_dynamic_neighbor_range(
9276 p->group, &prefix);
9277
9278 if (range) {
9279 prefix2str(range, buf1, sizeof(buf1));
9280 json_object_string_add(
9281 json_neigh,
9282 "peerSubnetRangeGroup", buf1);
9283 }
9284 }
9285 } else {
9286 vty_out(vty,
9287 " Member of peer-group %s for session parameters\n",
9288 p->group->name);
9289
9290 if (dn_flag[0]) {
9291 struct prefix prefix, *range = NULL;
9292
9293 sockunion2hostprefix(&(p->su), &prefix);
9294 range = peer_group_lookup_dynamic_neighbor_range(
9295 p->group, &prefix);
9296
9297 if (range) {
9298 prefix2str(range, buf1, sizeof(buf1));
9299 vty_out(vty,
9300 " Belongs to the subnet range group: %s\n",
9301 buf1);
9302 }
9303 }
9304 }
9305 }
9306
9307 if (use_json) {
9308 /* Administrative shutdown. */
9309 if (CHECK_FLAG(p->flags, PEER_FLAG_SHUTDOWN))
9310 json_object_boolean_true_add(json_neigh,
9311 "adminShutDown");
9312
9313 /* BGP Version. */
9314 json_object_int_add(json_neigh, "bgpVersion", 4);
9315 json_object_string_add(
9316 json_neigh, "remoteRouterId",
9317 inet_ntop(AF_INET, &p->remote_id, buf1, sizeof(buf1)));
9318 json_object_string_add(
9319 json_neigh, "localRouterId",
9320 inet_ntop(AF_INET, &bgp->router_id, buf1,
9321 sizeof(buf1)));
9322
9323 /* Confederation */
9324 if (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION)
9325 && bgp_confederation_peers_check(bgp, p->as))
9326 json_object_boolean_true_add(json_neigh,
9327 "nbrCommonAdmin");
9328
9329 /* Status. */
9330 json_object_string_add(
9331 json_neigh, "bgpState",
9332 lookup_msg(bgp_status_msg, p->status, NULL));
9333
9334 if (p->status == Established) {
9335 time_t uptime;
9336
9337 uptime = bgp_clock();
9338 uptime -= p->uptime;
9339 epoch_tbuf = time(NULL) - uptime;
9340
9341 #if CONFDATE > 20200101
9342 CPP_NOTICE(
9343 "bgpTimerUp should be deprecated and can be removed now");
9344 #endif
9345 /*
9346 * bgpTimerUp was miliseconds that was accurate
9347 * up to 1 day, then the value returned
9348 * became garbage. So in order to provide
9349 * some level of backwards compatability,
9350 * we still provde the data, but now
9351 * we are returning the correct value
9352 * and also adding a new bgpTimerUpMsec
9353 * which will allow us to deprecate
9354 * this eventually
9355 */
9356 json_object_int_add(json_neigh, "bgpTimerUp",
9357 uptime * 1000);
9358 json_object_int_add(json_neigh, "bgpTimerUpMsec",
9359 uptime * 1000);
9360 json_object_string_add(json_neigh, "bgpTimerUpString",
9361 peer_uptime(p->uptime, timebuf,
9362 BGP_UPTIME_LEN, 0,
9363 NULL));
9364 json_object_int_add(json_neigh,
9365 "bgpTimerUpEstablishedEpoch",
9366 epoch_tbuf);
9367 }
9368
9369 else if (p->status == Active) {
9370 if (CHECK_FLAG(p->flags, PEER_FLAG_PASSIVE))
9371 json_object_string_add(json_neigh, "bgpStateIs",
9372 "passive");
9373 else if (CHECK_FLAG(p->sflags, PEER_STATUS_NSF_WAIT))
9374 json_object_string_add(json_neigh, "bgpStateIs",
9375 "passiveNSF");
9376 }
9377
9378 /* read timer */
9379 time_t uptime;
9380 struct tm *tm;
9381
9382 uptime = bgp_clock();
9383 uptime -= p->readtime;
9384 tm = gmtime(&uptime);
9385 json_object_int_add(json_neigh, "bgpTimerLastRead",
9386 (tm->tm_sec * 1000) + (tm->tm_min * 60000)
9387 + (tm->tm_hour * 3600000));
9388
9389 uptime = bgp_clock();
9390 uptime -= p->last_write;
9391 tm = gmtime(&uptime);
9392 json_object_int_add(json_neigh, "bgpTimerLastWrite",
9393 (tm->tm_sec * 1000) + (tm->tm_min * 60000)
9394 + (tm->tm_hour * 3600000));
9395
9396 uptime = bgp_clock();
9397 uptime -= p->update_time;
9398 tm = gmtime(&uptime);
9399 json_object_int_add(json_neigh, "bgpInUpdateElapsedTimeMsecs",
9400 (tm->tm_sec * 1000) + (tm->tm_min * 60000)
9401 + (tm->tm_hour * 3600000));
9402
9403 /* Configured timer values. */
9404 json_object_int_add(json_neigh, "bgpTimerHoldTimeMsecs",
9405 p->v_holdtime * 1000);
9406 json_object_int_add(json_neigh,
9407 "bgpTimerKeepAliveIntervalMsecs",
9408 p->v_keepalive * 1000);
9409 if (CHECK_FLAG(p->flags, PEER_FLAG_TIMER)) {
9410 json_object_int_add(json_neigh,
9411 "bgpTimerConfiguredHoldTimeMsecs",
9412 p->holdtime * 1000);
9413 json_object_int_add(
9414 json_neigh,
9415 "bgpTimerConfiguredKeepAliveIntervalMsecs",
9416 p->keepalive * 1000);
9417 } else if ((bgp->default_holdtime != BGP_DEFAULT_HOLDTIME)
9418 || (bgp->default_keepalive
9419 != BGP_DEFAULT_KEEPALIVE)) {
9420 json_object_int_add(json_neigh,
9421 "bgpTimerConfiguredHoldTimeMsecs",
9422 bgp->default_holdtime);
9423 json_object_int_add(
9424 json_neigh,
9425 "bgpTimerConfiguredKeepAliveIntervalMsecs",
9426 bgp->default_keepalive);
9427 }
9428 } else {
9429 /* Administrative shutdown. */
9430 if (CHECK_FLAG(p->flags, PEER_FLAG_SHUTDOWN))
9431 vty_out(vty, " Administratively shut down\n");
9432
9433 /* BGP Version. */
9434 vty_out(vty, " BGP version 4");
9435 vty_out(vty, ", remote router ID %s",
9436 inet_ntop(AF_INET, &p->remote_id, buf1, sizeof(buf1)));
9437 vty_out(vty, ", local router ID %s\n",
9438 inet_ntop(AF_INET, &bgp->router_id, buf1,
9439 sizeof(buf1)));
9440
9441 /* Confederation */
9442 if (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION)
9443 && bgp_confederation_peers_check(bgp, p->as))
9444 vty_out(vty,
9445 " Neighbor under common administration\n");
9446
9447 /* Status. */
9448 vty_out(vty, " BGP state = %s",
9449 lookup_msg(bgp_status_msg, p->status, NULL));
9450
9451 if (p->status == Established)
9452 vty_out(vty, ", up for %8s",
9453 peer_uptime(p->uptime, timebuf, BGP_UPTIME_LEN,
9454 0, NULL));
9455
9456 else if (p->status == Active) {
9457 if (CHECK_FLAG(p->flags, PEER_FLAG_PASSIVE))
9458 vty_out(vty, " (passive)");
9459 else if (CHECK_FLAG(p->sflags, PEER_STATUS_NSF_WAIT))
9460 vty_out(vty, " (NSF passive)");
9461 }
9462 vty_out(vty, "\n");
9463
9464 /* read timer */
9465 vty_out(vty, " Last read %s",
9466 peer_uptime(p->readtime, timebuf, BGP_UPTIME_LEN, 0,
9467 NULL));
9468 vty_out(vty, ", Last write %s\n",
9469 peer_uptime(p->last_write, timebuf, BGP_UPTIME_LEN, 0,
9470 NULL));
9471
9472 /* Configured timer values. */
9473 vty_out(vty,
9474 " Hold time is %d, keepalive interval is %d seconds\n",
9475 p->v_holdtime, p->v_keepalive);
9476 if (CHECK_FLAG(p->flags, PEER_FLAG_TIMER)) {
9477 vty_out(vty, " Configured hold time is %d",
9478 p->holdtime);
9479 vty_out(vty, ", keepalive interval is %d seconds\n",
9480 p->keepalive);
9481 } else if ((bgp->default_holdtime != BGP_DEFAULT_HOLDTIME)
9482 || (bgp->default_keepalive
9483 != BGP_DEFAULT_KEEPALIVE)) {
9484 vty_out(vty, " Configured hold time is %d",
9485 bgp->default_holdtime);
9486 vty_out(vty, ", keepalive interval is %d seconds\n",
9487 bgp->default_keepalive);
9488 }
9489 }
9490 /* Capability. */
9491 if (p->status == Established) {
9492 if (p->cap || p->afc_adv[AFI_IP][SAFI_UNICAST]
9493 || p->afc_recv[AFI_IP][SAFI_UNICAST]
9494 || p->afc_adv[AFI_IP][SAFI_MULTICAST]
9495 || p->afc_recv[AFI_IP][SAFI_MULTICAST]
9496 || p->afc_adv[AFI_IP6][SAFI_UNICAST]
9497 || p->afc_recv[AFI_IP6][SAFI_UNICAST]
9498 || p->afc_adv[AFI_IP6][SAFI_MULTICAST]
9499 || p->afc_recv[AFI_IP6][SAFI_MULTICAST]
9500 || p->afc_adv[AFI_IP6][SAFI_MPLS_VPN]
9501 || p->afc_recv[AFI_IP6][SAFI_MPLS_VPN]
9502 || p->afc_adv[AFI_IP6][SAFI_ENCAP]
9503 || p->afc_recv[AFI_IP6][SAFI_ENCAP]
9504 || p->afc_adv[AFI_IP6][SAFI_FLOWSPEC]
9505 || p->afc_recv[AFI_IP6][SAFI_FLOWSPEC]
9506 || p->afc_adv[AFI_IP][SAFI_ENCAP]
9507 || p->afc_recv[AFI_IP][SAFI_ENCAP]
9508 || p->afc_adv[AFI_IP][SAFI_FLOWSPEC]
9509 || p->afc_recv[AFI_IP][SAFI_FLOWSPEC]
9510 || p->afc_adv[AFI_IP][SAFI_MPLS_VPN]
9511 || p->afc_recv[AFI_IP][SAFI_MPLS_VPN]) {
9512 if (use_json) {
9513 json_object *json_cap = NULL;
9514
9515 json_cap = json_object_new_object();
9516
9517 /* AS4 */
9518 if (CHECK_FLAG(p->cap, PEER_CAP_AS4_RCV)
9519 || CHECK_FLAG(p->cap, PEER_CAP_AS4_ADV)) {
9520 if (CHECK_FLAG(p->cap, PEER_CAP_AS4_ADV)
9521 && CHECK_FLAG(p->cap,
9522 PEER_CAP_AS4_RCV))
9523 json_object_string_add(
9524 json_cap, "4byteAs",
9525 "advertisedAndReceived");
9526 else if (CHECK_FLAG(p->cap,
9527 PEER_CAP_AS4_ADV))
9528 json_object_string_add(
9529 json_cap, "4byteAs",
9530 "advertised");
9531 else if (CHECK_FLAG(p->cap,
9532 PEER_CAP_AS4_RCV))
9533 json_object_string_add(
9534 json_cap, "4byteAs",
9535 "received");
9536 }
9537
9538 /* AddPath */
9539 if (CHECK_FLAG(p->cap, PEER_CAP_ADDPATH_RCV)
9540 || CHECK_FLAG(p->cap,
9541 PEER_CAP_ADDPATH_ADV)) {
9542 json_object *json_add = NULL;
9543 const char *print_store;
9544
9545 json_add = json_object_new_object();
9546
9547 FOREACH_AFI_SAFI (afi, safi) {
9548 json_object *json_sub = NULL;
9549 json_sub =
9550 json_object_new_object();
9551 print_store = afi_safi_print(
9552 afi, safi);
9553
9554 if (CHECK_FLAG(
9555 p->af_cap[afi]
9556 [safi],
9557 PEER_CAP_ADDPATH_AF_TX_ADV)
9558 || CHECK_FLAG(
9559 p->af_cap[afi]
9560 [safi],
9561 PEER_CAP_ADDPATH_AF_TX_RCV)) {
9562 if (CHECK_FLAG(
9563 p->af_cap
9564 [afi]
9565 [safi],
9566 PEER_CAP_ADDPATH_AF_TX_ADV)
9567 && CHECK_FLAG(
9568 p->af_cap
9569 [afi]
9570 [safi],
9571 PEER_CAP_ADDPATH_AF_TX_RCV))
9572 json_object_boolean_true_add(
9573 json_sub,
9574 "txAdvertisedAndReceived");
9575 else if (
9576 CHECK_FLAG(
9577 p->af_cap
9578 [afi]
9579 [safi],
9580 PEER_CAP_ADDPATH_AF_TX_ADV))
9581 json_object_boolean_true_add(
9582 json_sub,
9583 "txAdvertised");
9584 else if (
9585 CHECK_FLAG(
9586 p->af_cap
9587 [afi]
9588 [safi],
9589 PEER_CAP_ADDPATH_AF_TX_RCV))
9590 json_object_boolean_true_add(
9591 json_sub,
9592 "txReceived");
9593 }
9594
9595 if (CHECK_FLAG(
9596 p->af_cap[afi]
9597 [safi],
9598 PEER_CAP_ADDPATH_AF_RX_ADV)
9599 || CHECK_FLAG(
9600 p->af_cap[afi]
9601 [safi],
9602 PEER_CAP_ADDPATH_AF_RX_RCV)) {
9603 if (CHECK_FLAG(
9604 p->af_cap
9605 [afi]
9606 [safi],
9607 PEER_CAP_ADDPATH_AF_RX_ADV)
9608 && CHECK_FLAG(
9609 p->af_cap
9610 [afi]
9611 [safi],
9612 PEER_CAP_ADDPATH_AF_RX_RCV))
9613 json_object_boolean_true_add(
9614 json_sub,
9615 "rxAdvertisedAndReceived");
9616 else if (
9617 CHECK_FLAG(
9618 p->af_cap
9619 [afi]
9620 [safi],
9621 PEER_CAP_ADDPATH_AF_RX_ADV))
9622 json_object_boolean_true_add(
9623 json_sub,
9624 "rxAdvertised");
9625 else if (
9626 CHECK_FLAG(
9627 p->af_cap
9628 [afi]
9629 [safi],
9630 PEER_CAP_ADDPATH_AF_RX_RCV))
9631 json_object_boolean_true_add(
9632 json_sub,
9633 "rxReceived");
9634 }
9635
9636 if (CHECK_FLAG(
9637 p->af_cap[afi]
9638 [safi],
9639 PEER_CAP_ADDPATH_AF_TX_ADV)
9640 || CHECK_FLAG(
9641 p->af_cap[afi]
9642 [safi],
9643 PEER_CAP_ADDPATH_AF_TX_RCV)
9644 || CHECK_FLAG(
9645 p->af_cap[afi]
9646 [safi],
9647 PEER_CAP_ADDPATH_AF_RX_ADV)
9648 || CHECK_FLAG(
9649 p->af_cap[afi]
9650 [safi],
9651 PEER_CAP_ADDPATH_AF_RX_RCV))
9652 json_object_object_add(
9653 json_add,
9654 print_store,
9655 json_sub);
9656 else
9657 json_object_free(
9658 json_sub);
9659 }
9660
9661 json_object_object_add(
9662 json_cap, "addPath", json_add);
9663 }
9664
9665 /* Dynamic */
9666 if (CHECK_FLAG(p->cap, PEER_CAP_DYNAMIC_RCV)
9667 || CHECK_FLAG(p->cap,
9668 PEER_CAP_DYNAMIC_ADV)) {
9669 if (CHECK_FLAG(p->cap,
9670 PEER_CAP_DYNAMIC_ADV)
9671 && CHECK_FLAG(p->cap,
9672 PEER_CAP_DYNAMIC_RCV))
9673 json_object_string_add(
9674 json_cap, "dynamic",
9675 "advertisedAndReceived");
9676 else if (CHECK_FLAG(
9677 p->cap,
9678 PEER_CAP_DYNAMIC_ADV))
9679 json_object_string_add(
9680 json_cap, "dynamic",
9681 "advertised");
9682 else if (CHECK_FLAG(
9683 p->cap,
9684 PEER_CAP_DYNAMIC_RCV))
9685 json_object_string_add(
9686 json_cap, "dynamic",
9687 "received");
9688 }
9689
9690 /* Extended nexthop */
9691 if (CHECK_FLAG(p->cap, PEER_CAP_ENHE_RCV)
9692 || CHECK_FLAG(p->cap, PEER_CAP_ENHE_ADV)) {
9693 json_object *json_nxt = NULL;
9694 const char *print_store;
9695
9696
9697 if (CHECK_FLAG(p->cap,
9698 PEER_CAP_ENHE_ADV)
9699 && CHECK_FLAG(p->cap,
9700 PEER_CAP_ENHE_RCV))
9701 json_object_string_add(
9702 json_cap,
9703 "extendedNexthop",
9704 "advertisedAndReceived");
9705 else if (CHECK_FLAG(p->cap,
9706 PEER_CAP_ENHE_ADV))
9707 json_object_string_add(
9708 json_cap,
9709 "extendedNexthop",
9710 "advertised");
9711 else if (CHECK_FLAG(p->cap,
9712 PEER_CAP_ENHE_RCV))
9713 json_object_string_add(
9714 json_cap,
9715 "extendedNexthop",
9716 "received");
9717
9718 if (CHECK_FLAG(p->cap,
9719 PEER_CAP_ENHE_RCV)) {
9720 json_nxt =
9721 json_object_new_object();
9722
9723 for (safi = SAFI_UNICAST;
9724 safi < SAFI_MAX; safi++) {
9725 if (CHECK_FLAG(
9726 p->af_cap
9727 [AFI_IP]
9728 [safi],
9729 PEER_CAP_ENHE_AF_RCV)) {
9730 print_store = afi_safi_print(
9731 AFI_IP,
9732 safi);
9733 json_object_string_add(
9734 json_nxt,
9735 print_store,
9736 "recieved"); /* misspelled for compatibility */
9737 }
9738 }
9739 json_object_object_add(
9740 json_cap,
9741 "extendedNexthopFamililesByPeer",
9742 json_nxt);
9743 }
9744 }
9745
9746 /* Route Refresh */
9747 if (CHECK_FLAG(p->cap, PEER_CAP_REFRESH_ADV)
9748 || CHECK_FLAG(p->cap,
9749 PEER_CAP_REFRESH_NEW_RCV)
9750 || CHECK_FLAG(p->cap,
9751 PEER_CAP_REFRESH_OLD_RCV)) {
9752 if (CHECK_FLAG(p->cap,
9753 PEER_CAP_REFRESH_ADV)
9754 && (CHECK_FLAG(
9755 p->cap,
9756 PEER_CAP_REFRESH_NEW_RCV)
9757 || CHECK_FLAG(
9758 p->cap,
9759 PEER_CAP_REFRESH_OLD_RCV))) {
9760 if (CHECK_FLAG(
9761 p->cap,
9762 PEER_CAP_REFRESH_OLD_RCV)
9763 && CHECK_FLAG(
9764 p->cap,
9765 PEER_CAP_REFRESH_NEW_RCV))
9766 json_object_string_add(
9767 json_cap,
9768 "routeRefresh",
9769 "advertisedAndReceivedOldNew");
9770 else {
9771 if (CHECK_FLAG(
9772 p->cap,
9773 PEER_CAP_REFRESH_OLD_RCV))
9774 json_object_string_add(
9775 json_cap,
9776 "routeRefresh",
9777 "advertisedAndReceivedOld");
9778 else
9779 json_object_string_add(
9780 json_cap,
9781 "routeRefresh",
9782 "advertisedAndReceivedNew");
9783 }
9784 } else if (
9785 CHECK_FLAG(
9786 p->cap,
9787 PEER_CAP_REFRESH_ADV))
9788 json_object_string_add(
9789 json_cap,
9790 "routeRefresh",
9791 "advertised");
9792 else if (
9793 CHECK_FLAG(
9794 p->cap,
9795 PEER_CAP_REFRESH_NEW_RCV)
9796 || CHECK_FLAG(
9797 p->cap,
9798 PEER_CAP_REFRESH_OLD_RCV))
9799 json_object_string_add(
9800 json_cap,
9801 "routeRefresh",
9802 "received");
9803 }
9804
9805 /* Multiprotocol Extensions */
9806 json_object *json_multi = NULL;
9807 json_multi = json_object_new_object();
9808
9809 FOREACH_AFI_SAFI (afi, safi) {
9810 if (p->afc_adv[afi][safi]
9811 || p->afc_recv[afi][safi]) {
9812 json_object *json_exten = NULL;
9813 json_exten =
9814 json_object_new_object();
9815
9816 if (p->afc_adv[afi][safi]
9817 && p->afc_recv[afi][safi])
9818 json_object_boolean_true_add(
9819 json_exten,
9820 "advertisedAndReceived");
9821 else if (p->afc_adv[afi][safi])
9822 json_object_boolean_true_add(
9823 json_exten,
9824 "advertised");
9825 else if (p->afc_recv[afi][safi])
9826 json_object_boolean_true_add(
9827 json_exten,
9828 "received");
9829
9830 json_object_object_add(
9831 json_multi,
9832 afi_safi_print(afi,
9833 safi),
9834 json_exten);
9835 }
9836 }
9837 json_object_object_add(
9838 json_cap, "multiprotocolExtensions",
9839 json_multi);
9840
9841 /* Hostname capabilities */
9842 json_object *json_hname = NULL;
9843
9844 json_hname = json_object_new_object();
9845
9846 if (CHECK_FLAG(p->cap, PEER_CAP_HOSTNAME_ADV)) {
9847 json_object_string_add(
9848 json_hname, "advHostName",
9849 bgp->peer_self->hostname
9850 ? bgp->peer_self
9851 ->hostname
9852 : "n/a");
9853 json_object_string_add(
9854 json_hname, "advDomainName",
9855 bgp->peer_self->domainname
9856 ? bgp->peer_self
9857 ->domainname
9858 : "n/a");
9859 }
9860
9861
9862 if (CHECK_FLAG(p->cap, PEER_CAP_HOSTNAME_RCV)) {
9863 json_object_string_add(
9864 json_hname, "rcvHostName",
9865 p->hostname ? p->hostname
9866 : "n/a");
9867 json_object_string_add(
9868 json_hname, "rcvDomainName",
9869 p->domainname ? p->domainname
9870 : "n/a");
9871 }
9872
9873 json_object_object_add(json_cap, "hostName",
9874 json_hname);
9875
9876 /* Gracefull Restart */
9877 if (CHECK_FLAG(p->cap, PEER_CAP_RESTART_RCV)
9878 || CHECK_FLAG(p->cap,
9879 PEER_CAP_RESTART_ADV)) {
9880 if (CHECK_FLAG(p->cap,
9881 PEER_CAP_RESTART_ADV)
9882 && CHECK_FLAG(p->cap,
9883 PEER_CAP_RESTART_RCV))
9884 json_object_string_add(
9885 json_cap,
9886 "gracefulRestart",
9887 "advertisedAndReceived");
9888 else if (CHECK_FLAG(
9889 p->cap,
9890 PEER_CAP_RESTART_ADV))
9891 json_object_string_add(
9892 json_cap,
9893 "gracefulRestartCapability",
9894 "advertised");
9895 else if (CHECK_FLAG(
9896 p->cap,
9897 PEER_CAP_RESTART_RCV))
9898 json_object_string_add(
9899 json_cap,
9900 "gracefulRestartCapability",
9901 "received");
9902
9903 if (CHECK_FLAG(p->cap,
9904 PEER_CAP_RESTART_RCV)) {
9905 int restart_af_count = 0;
9906 json_object *json_restart =
9907 NULL;
9908 json_restart =
9909 json_object_new_object();
9910
9911 json_object_int_add(
9912 json_cap,
9913 "gracefulRestartRemoteTimerMsecs",
9914 p->v_gr_restart * 1000);
9915
9916 FOREACH_AFI_SAFI (afi, safi) {
9917 if (CHECK_FLAG(
9918 p->af_cap
9919 [afi]
9920 [safi],
9921 PEER_CAP_RESTART_AF_RCV)) {
9922 json_object *
9923 json_sub =
9924 NULL;
9925 json_sub =
9926 json_object_new_object();
9927
9928 if (CHECK_FLAG(
9929 p->af_cap
9930 [afi]
9931 [safi],
9932 PEER_CAP_RESTART_AF_PRESERVE_RCV))
9933 json_object_boolean_true_add(
9934 json_sub,
9935 "preserved");
9936 restart_af_count++;
9937 json_object_object_add(
9938 json_restart,
9939 afi_safi_print(
9940 afi,
9941 safi),
9942 json_sub);
9943 }
9944 }
9945 if (!restart_af_count) {
9946 json_object_string_add(
9947 json_cap,
9948 "addressFamiliesByPeer",
9949 "none");
9950 json_object_free(
9951 json_restart);
9952 } else
9953 json_object_object_add(
9954 json_cap,
9955 "addressFamiliesByPeer",
9956 json_restart);
9957 }
9958 }
9959 json_object_object_add(json_neigh,
9960 "neighborCapabilities",
9961 json_cap);
9962 } else {
9963 vty_out(vty, " Neighbor capabilities:\n");
9964
9965 /* AS4 */
9966 if (CHECK_FLAG(p->cap, PEER_CAP_AS4_RCV)
9967 || CHECK_FLAG(p->cap, PEER_CAP_AS4_ADV)) {
9968 vty_out(vty, " 4 Byte AS:");
9969 if (CHECK_FLAG(p->cap,
9970 PEER_CAP_AS4_ADV))
9971 vty_out(vty, " advertised");
9972 if (CHECK_FLAG(p->cap,
9973 PEER_CAP_AS4_RCV))
9974 vty_out(vty, " %sreceived",
9975 CHECK_FLAG(
9976 p->cap,
9977 PEER_CAP_AS4_ADV)
9978 ? "and "
9979 : "");
9980 vty_out(vty, "\n");
9981 }
9982
9983 /* AddPath */
9984 if (CHECK_FLAG(p->cap, PEER_CAP_ADDPATH_RCV)
9985 || CHECK_FLAG(p->cap,
9986 PEER_CAP_ADDPATH_ADV)) {
9987 vty_out(vty, " AddPath:\n");
9988
9989 FOREACH_AFI_SAFI (afi, safi) {
9990 if (CHECK_FLAG(
9991 p->af_cap[afi]
9992 [safi],
9993 PEER_CAP_ADDPATH_AF_TX_ADV)
9994 || CHECK_FLAG(
9995 p->af_cap[afi]
9996 [safi],
9997 PEER_CAP_ADDPATH_AF_TX_RCV)) {
9998 vty_out(vty,
9999 " %s: TX ",
10000 afi_safi_print(
10001 afi,
10002 safi));
10003
10004 if (CHECK_FLAG(
10005 p->af_cap
10006 [afi]
10007 [safi],
10008 PEER_CAP_ADDPATH_AF_TX_ADV))
10009 vty_out(vty,
10010 "advertised %s",
10011 afi_safi_print(
10012 afi,
10013 safi));
10014
10015 if (CHECK_FLAG(
10016 p->af_cap
10017 [afi]
10018 [safi],
10019 PEER_CAP_ADDPATH_AF_TX_RCV))
10020 vty_out(vty,
10021 "%sreceived",
10022 CHECK_FLAG(
10023 p->af_cap
10024 [afi]
10025 [safi],
10026 PEER_CAP_ADDPATH_AF_TX_ADV)
10027 ? " and "
10028 : "");
10029
10030 vty_out(vty, "\n");
10031 }
10032
10033 if (CHECK_FLAG(
10034 p->af_cap[afi]
10035 [safi],
10036 PEER_CAP_ADDPATH_AF_RX_ADV)
10037 || CHECK_FLAG(
10038 p->af_cap[afi]
10039 [safi],
10040 PEER_CAP_ADDPATH_AF_RX_RCV)) {
10041 vty_out(vty,
10042 " %s: RX ",
10043 afi_safi_print(
10044 afi,
10045 safi));
10046
10047 if (CHECK_FLAG(
10048 p->af_cap
10049 [afi]
10050 [safi],
10051 PEER_CAP_ADDPATH_AF_RX_ADV))
10052 vty_out(vty,
10053 "advertised %s",
10054 afi_safi_print(
10055 afi,
10056 safi));
10057
10058 if (CHECK_FLAG(
10059 p->af_cap
10060 [afi]
10061 [safi],
10062 PEER_CAP_ADDPATH_AF_RX_RCV))
10063 vty_out(vty,
10064 "%sreceived",
10065 CHECK_FLAG(
10066 p->af_cap
10067 [afi]
10068 [safi],
10069 PEER_CAP_ADDPATH_AF_RX_ADV)
10070 ? " and "
10071 : "");
10072
10073 vty_out(vty, "\n");
10074 }
10075 }
10076 }
10077
10078 /* Dynamic */
10079 if (CHECK_FLAG(p->cap, PEER_CAP_DYNAMIC_RCV)
10080 || CHECK_FLAG(p->cap,
10081 PEER_CAP_DYNAMIC_ADV)) {
10082 vty_out(vty, " Dynamic:");
10083 if (CHECK_FLAG(p->cap,
10084 PEER_CAP_DYNAMIC_ADV))
10085 vty_out(vty, " advertised");
10086 if (CHECK_FLAG(p->cap,
10087 PEER_CAP_DYNAMIC_RCV))
10088 vty_out(vty, " %sreceived",
10089 CHECK_FLAG(
10090 p->cap,
10091 PEER_CAP_DYNAMIC_ADV)
10092 ? "and "
10093 : "");
10094 vty_out(vty, "\n");
10095 }
10096
10097 /* Extended nexthop */
10098 if (CHECK_FLAG(p->cap, PEER_CAP_ENHE_RCV)
10099 || CHECK_FLAG(p->cap, PEER_CAP_ENHE_ADV)) {
10100 vty_out(vty, " Extended nexthop:");
10101 if (CHECK_FLAG(p->cap,
10102 PEER_CAP_ENHE_ADV))
10103 vty_out(vty, " advertised");
10104 if (CHECK_FLAG(p->cap,
10105 PEER_CAP_ENHE_RCV))
10106 vty_out(vty, " %sreceived",
10107 CHECK_FLAG(
10108 p->cap,
10109 PEER_CAP_ENHE_ADV)
10110 ? "and "
10111 : "");
10112 vty_out(vty, "\n");
10113
10114 if (CHECK_FLAG(p->cap,
10115 PEER_CAP_ENHE_RCV)) {
10116 vty_out(vty,
10117 " Address families by peer:\n ");
10118 for (safi = SAFI_UNICAST;
10119 safi < SAFI_MAX; safi++)
10120 if (CHECK_FLAG(
10121 p->af_cap
10122 [AFI_IP]
10123 [safi],
10124 PEER_CAP_ENHE_AF_RCV))
10125 vty_out(vty,
10126 " %s\n",
10127 afi_safi_print(
10128 AFI_IP,
10129 safi));
10130 }
10131 }
10132
10133 /* Route Refresh */
10134 if (CHECK_FLAG(p->cap, PEER_CAP_REFRESH_ADV)
10135 || CHECK_FLAG(p->cap,
10136 PEER_CAP_REFRESH_NEW_RCV)
10137 || CHECK_FLAG(p->cap,
10138 PEER_CAP_REFRESH_OLD_RCV)) {
10139 vty_out(vty, " Route refresh:");
10140 if (CHECK_FLAG(p->cap,
10141 PEER_CAP_REFRESH_ADV))
10142 vty_out(vty, " advertised");
10143 if (CHECK_FLAG(p->cap,
10144 PEER_CAP_REFRESH_NEW_RCV)
10145 || CHECK_FLAG(
10146 p->cap,
10147 PEER_CAP_REFRESH_OLD_RCV))
10148 vty_out(vty, " %sreceived(%s)",
10149 CHECK_FLAG(
10150 p->cap,
10151 PEER_CAP_REFRESH_ADV)
10152 ? "and "
10153 : "",
10154 (CHECK_FLAG(
10155 p->cap,
10156 PEER_CAP_REFRESH_OLD_RCV)
10157 && CHECK_FLAG(
10158 p->cap,
10159 PEER_CAP_REFRESH_NEW_RCV))
10160 ? "old & new"
10161 : CHECK_FLAG(
10162 p->cap,
10163 PEER_CAP_REFRESH_OLD_RCV)
10164 ? "old"
10165 : "new");
10166
10167 vty_out(vty, "\n");
10168 }
10169
10170 /* Multiprotocol Extensions */
10171 FOREACH_AFI_SAFI (afi, safi)
10172 if (p->afc_adv[afi][safi]
10173 || p->afc_recv[afi][safi]) {
10174 vty_out(vty,
10175 " Address Family %s:",
10176 afi_safi_print(afi,
10177 safi));
10178 if (p->afc_adv[afi][safi])
10179 vty_out(vty,
10180 " advertised");
10181 if (p->afc_recv[afi][safi])
10182 vty_out(vty,
10183 " %sreceived",
10184 p->afc_adv[afi]
10185 [safi]
10186 ? "and "
10187 : "");
10188 vty_out(vty, "\n");
10189 }
10190
10191 /* Hostname capability */
10192 vty_out(vty, " Hostname Capability:");
10193
10194 if (CHECK_FLAG(p->cap, PEER_CAP_HOSTNAME_ADV)) {
10195 vty_out(vty,
10196 " advertised (name: %s,domain name: %s)",
10197 bgp->peer_self->hostname
10198 ? bgp->peer_self
10199 ->hostname
10200 : "n/a",
10201 bgp->peer_self->domainname
10202 ? bgp->peer_self
10203 ->domainname
10204 : "n/a");
10205 } else {
10206 vty_out(vty, " not advertised");
10207 }
10208
10209 if (CHECK_FLAG(p->cap, PEER_CAP_HOSTNAME_RCV)) {
10210 vty_out(vty,
10211 " received (name: %s,domain name: %s)",
10212 p->hostname ? p->hostname
10213 : "n/a",
10214 p->domainname ? p->domainname
10215 : "n/a");
10216 } else {
10217 vty_out(vty, " not received");
10218 }
10219
10220 vty_out(vty, "\n");
10221
10222 /* Gracefull Restart */
10223 if (CHECK_FLAG(p->cap, PEER_CAP_RESTART_RCV)
10224 || CHECK_FLAG(p->cap,
10225 PEER_CAP_RESTART_ADV)) {
10226 vty_out(vty,
10227 " Graceful Restart Capabilty:");
10228 if (CHECK_FLAG(p->cap,
10229 PEER_CAP_RESTART_ADV))
10230 vty_out(vty, " advertised");
10231 if (CHECK_FLAG(p->cap,
10232 PEER_CAP_RESTART_RCV))
10233 vty_out(vty, " %sreceived",
10234 CHECK_FLAG(
10235 p->cap,
10236 PEER_CAP_RESTART_ADV)
10237 ? "and "
10238 : "");
10239 vty_out(vty, "\n");
10240
10241 if (CHECK_FLAG(p->cap,
10242 PEER_CAP_RESTART_RCV)) {
10243 int restart_af_count = 0;
10244
10245 vty_out(vty,
10246 " Remote Restart timer is %d seconds\n",
10247 p->v_gr_restart);
10248 vty_out(vty,
10249 " Address families by peer:\n ");
10250
10251 FOREACH_AFI_SAFI (afi, safi)
10252 if (CHECK_FLAG(
10253 p->af_cap
10254 [afi]
10255 [safi],
10256 PEER_CAP_RESTART_AF_RCV)) {
10257 vty_out(vty,
10258 "%s%s(%s)",
10259 restart_af_count
10260 ? ", "
10261 : "",
10262 afi_safi_print(
10263 afi,
10264 safi),
10265 CHECK_FLAG(
10266 p->af_cap
10267 [afi]
10268 [safi],
10269 PEER_CAP_RESTART_AF_PRESERVE_RCV)
10270 ? "preserved"
10271 : "not preserved");
10272 restart_af_count++;
10273 }
10274 if (!restart_af_count)
10275 vty_out(vty, "none");
10276 vty_out(vty, "\n");
10277 }
10278 }
10279 }
10280 }
10281 }
10282
10283 /* graceful restart information */
10284 if (CHECK_FLAG(p->cap, PEER_CAP_RESTART_RCV) || p->t_gr_restart
10285 || p->t_gr_stale) {
10286 json_object *json_grace = NULL;
10287 json_object *json_grace_send = NULL;
10288 json_object *json_grace_recv = NULL;
10289 int eor_send_af_count = 0;
10290 int eor_receive_af_count = 0;
10291
10292 if (use_json) {
10293 json_grace = json_object_new_object();
10294 json_grace_send = json_object_new_object();
10295 json_grace_recv = json_object_new_object();
10296
10297 if (p->status == Established) {
10298 FOREACH_AFI_SAFI (afi, safi) {
10299 if (CHECK_FLAG(p->af_sflags[afi][safi],
10300 PEER_STATUS_EOR_SEND)) {
10301 json_object_boolean_true_add(
10302 json_grace_send,
10303 afi_safi_print(afi,
10304 safi));
10305 eor_send_af_count++;
10306 }
10307 }
10308 FOREACH_AFI_SAFI (afi, safi) {
10309 if (CHECK_FLAG(
10310 p->af_sflags[afi][safi],
10311 PEER_STATUS_EOR_RECEIVED)) {
10312 json_object_boolean_true_add(
10313 json_grace_recv,
10314 afi_safi_print(afi,
10315 safi));
10316 eor_receive_af_count++;
10317 }
10318 }
10319 }
10320
10321 json_object_object_add(json_grace, "endOfRibSend",
10322 json_grace_send);
10323 json_object_object_add(json_grace, "endOfRibRecv",
10324 json_grace_recv);
10325
10326 if (p->t_gr_restart)
10327 json_object_int_add(json_grace,
10328 "gracefulRestartTimerMsecs",
10329 thread_timer_remain_second(
10330 p->t_gr_restart)
10331 * 1000);
10332
10333 if (p->t_gr_stale)
10334 json_object_int_add(
10335 json_grace,
10336 "gracefulStalepathTimerMsecs",
10337 thread_timer_remain_second(
10338 p->t_gr_stale)
10339 * 1000);
10340
10341 json_object_object_add(
10342 json_neigh, "gracefulRestartInfo", json_grace);
10343 } else {
10344 vty_out(vty, " Graceful restart information:\n");
10345 if (p->status == Established) {
10346 vty_out(vty, " End-of-RIB send: ");
10347 FOREACH_AFI_SAFI (afi, safi) {
10348 if (CHECK_FLAG(p->af_sflags[afi][safi],
10349 PEER_STATUS_EOR_SEND)) {
10350 vty_out(vty, "%s%s",
10351 eor_send_af_count ? ", "
10352 : "",
10353 afi_safi_print(afi,
10354 safi));
10355 eor_send_af_count++;
10356 }
10357 }
10358 vty_out(vty, "\n");
10359 vty_out(vty, " End-of-RIB received: ");
10360 FOREACH_AFI_SAFI (afi, safi) {
10361 if (CHECK_FLAG(
10362 p->af_sflags[afi][safi],
10363 PEER_STATUS_EOR_RECEIVED)) {
10364 vty_out(vty, "%s%s",
10365 eor_receive_af_count
10366 ? ", "
10367 : "",
10368 afi_safi_print(afi,
10369 safi));
10370 eor_receive_af_count++;
10371 }
10372 }
10373 vty_out(vty, "\n");
10374 }
10375
10376 if (p->t_gr_restart)
10377 vty_out(vty,
10378 " The remaining time of restart timer is %ld\n",
10379 thread_timer_remain_second(
10380 p->t_gr_restart));
10381
10382 if (p->t_gr_stale)
10383 vty_out(vty,
10384 " The remaining time of stalepath timer is %ld\n",
10385 thread_timer_remain_second(
10386 p->t_gr_stale));
10387 }
10388 }
10389 if (use_json) {
10390 json_object *json_stat = NULL;
10391 json_stat = json_object_new_object();
10392 /* Packet counts. */
10393 json_object_int_add(json_stat, "depthInq", 0);
10394 json_object_int_add(json_stat, "depthOutq",
10395 (unsigned long)p->obuf->count);
10396 json_object_int_add(json_stat, "opensSent",
10397 atomic_load_explicit(&p->open_out,
10398 memory_order_relaxed));
10399 json_object_int_add(json_stat, "opensRecv",
10400 atomic_load_explicit(&p->open_in,
10401 memory_order_relaxed));
10402 json_object_int_add(json_stat, "notificationsSent",
10403 atomic_load_explicit(&p->notify_out,
10404 memory_order_relaxed));
10405 json_object_int_add(json_stat, "notificationsRecv",
10406 atomic_load_explicit(&p->notify_in,
10407 memory_order_relaxed));
10408 json_object_int_add(json_stat, "updatesSent",
10409 atomic_load_explicit(&p->update_out,
10410 memory_order_relaxed));
10411 json_object_int_add(json_stat, "updatesRecv",
10412 atomic_load_explicit(&p->update_in,
10413 memory_order_relaxed));
10414 json_object_int_add(json_stat, "keepalivesSent",
10415 atomic_load_explicit(&p->keepalive_out,
10416 memory_order_relaxed));
10417 json_object_int_add(json_stat, "keepalivesRecv",
10418 atomic_load_explicit(&p->keepalive_in,
10419 memory_order_relaxed));
10420 json_object_int_add(json_stat, "routeRefreshSent",
10421 atomic_load_explicit(&p->refresh_out,
10422 memory_order_relaxed));
10423 json_object_int_add(json_stat, "routeRefreshRecv",
10424 atomic_load_explicit(&p->refresh_in,
10425 memory_order_relaxed));
10426 json_object_int_add(json_stat, "capabilitySent",
10427 atomic_load_explicit(&p->dynamic_cap_out,
10428 memory_order_relaxed));
10429 json_object_int_add(json_stat, "capabilityRecv",
10430 atomic_load_explicit(&p->dynamic_cap_in,
10431 memory_order_relaxed));
10432 json_object_int_add(json_stat, "totalSent", PEER_TOTAL_TX(p));
10433 json_object_int_add(json_stat, "totalRecv", PEER_TOTAL_RX(p));
10434 json_object_object_add(json_neigh, "messageStats", json_stat);
10435 } else {
10436 /* Packet counts. */
10437 vty_out(vty, " Message statistics:\n");
10438 vty_out(vty, " Inq depth is 0\n");
10439 vty_out(vty, " Outq depth is %lu\n",
10440 (unsigned long)p->obuf->count);
10441 vty_out(vty, " Sent Rcvd\n");
10442 vty_out(vty, " Opens: %10d %10d\n",
10443 atomic_load_explicit(&p->open_out,
10444 memory_order_relaxed),
10445 atomic_load_explicit(&p->open_in,
10446 memory_order_relaxed));
10447 vty_out(vty, " Notifications: %10d %10d\n",
10448 atomic_load_explicit(&p->notify_out,
10449 memory_order_relaxed),
10450 atomic_load_explicit(&p->notify_in,
10451 memory_order_relaxed));
10452 vty_out(vty, " Updates: %10d %10d\n",
10453 atomic_load_explicit(&p->update_out,
10454 memory_order_relaxed),
10455 atomic_load_explicit(&p->update_in,
10456 memory_order_relaxed));
10457 vty_out(vty, " Keepalives: %10d %10d\n",
10458 atomic_load_explicit(&p->keepalive_out,
10459 memory_order_relaxed),
10460 atomic_load_explicit(&p->keepalive_in,
10461 memory_order_relaxed));
10462 vty_out(vty, " Route Refresh: %10d %10d\n",
10463 atomic_load_explicit(&p->refresh_out,
10464 memory_order_relaxed),
10465 atomic_load_explicit(&p->refresh_in,
10466 memory_order_relaxed));
10467 vty_out(vty, " Capability: %10d %10d\n",
10468 atomic_load_explicit(&p->dynamic_cap_out,
10469 memory_order_relaxed),
10470 atomic_load_explicit(&p->dynamic_cap_in,
10471 memory_order_relaxed));
10472 vty_out(vty, " Total: %10d %10d\n", PEER_TOTAL_TX(p),
10473 PEER_TOTAL_RX(p));
10474 }
10475
10476 if (use_json) {
10477 /* advertisement-interval */
10478 json_object_int_add(json_neigh,
10479 "minBtwnAdvertisementRunsTimerMsecs",
10480 p->v_routeadv * 1000);
10481
10482 /* Update-source. */
10483 if (p->update_if || p->update_source) {
10484 if (p->update_if)
10485 json_object_string_add(json_neigh,
10486 "updateSource",
10487 p->update_if);
10488 else if (p->update_source)
10489 json_object_string_add(
10490 json_neigh, "updateSource",
10491 sockunion2str(p->update_source, buf1,
10492 SU_ADDRSTRLEN));
10493 }
10494 } else {
10495 /* advertisement-interval */
10496 vty_out(vty,
10497 " Minimum time between advertisement runs is %d seconds\n",
10498 p->v_routeadv);
10499
10500 /* Update-source. */
10501 if (p->update_if || p->update_source) {
10502 vty_out(vty, " Update source is ");
10503 if (p->update_if)
10504 vty_out(vty, "%s", p->update_if);
10505 else if (p->update_source)
10506 vty_out(vty, "%s",
10507 sockunion2str(p->update_source, buf1,
10508 SU_ADDRSTRLEN));
10509 vty_out(vty, "\n");
10510 }
10511
10512 vty_out(vty, "\n");
10513 }
10514
10515 /* Address Family Information */
10516 json_object *json_hold = NULL;
10517
10518 if (use_json)
10519 json_hold = json_object_new_object();
10520
10521 FOREACH_AFI_SAFI (afi, safi)
10522 if (p->afc[afi][safi])
10523 bgp_show_peer_afi(vty, p, afi, safi, use_json,
10524 json_hold);
10525
10526 if (use_json) {
10527 json_object_object_add(json_neigh, "addressFamilyInfo",
10528 json_hold);
10529 json_object_int_add(json_neigh, "connectionsEstablished",
10530 p->established);
10531 json_object_int_add(json_neigh, "connectionsDropped",
10532 p->dropped);
10533 } else
10534 vty_out(vty, " Connections established %d; dropped %d\n",
10535 p->established, p->dropped);
10536
10537 if (!p->last_reset) {
10538 if (use_json)
10539 json_object_string_add(json_neigh, "lastReset",
10540 "never");
10541 else
10542 vty_out(vty, " Last reset never\n");
10543 } else {
10544 if (use_json) {
10545 time_t uptime;
10546 struct tm *tm;
10547
10548 uptime = bgp_clock();
10549 uptime -= p->resettime;
10550 tm = gmtime(&uptime);
10551 json_object_int_add(json_neigh, "lastResetTimerMsecs",
10552 (tm->tm_sec * 1000)
10553 + (tm->tm_min * 60000)
10554 + (tm->tm_hour * 3600000));
10555 json_object_string_add(
10556 json_neigh, "lastResetDueTo",
10557 peer_down_str[(int)p->last_reset]);
10558 if (p->last_reset == PEER_DOWN_NOTIFY_SEND
10559 || p->last_reset == PEER_DOWN_NOTIFY_RECEIVED) {
10560 char errorcodesubcode_hexstr[5];
10561 char errorcodesubcode_str[256];
10562
10563 code_str = bgp_notify_code_str(p->notify.code);
10564 subcode_str = bgp_notify_subcode_str(
10565 p->notify.code, p->notify.subcode);
10566
10567 sprintf(errorcodesubcode_hexstr, "%02X%02X",
10568 p->notify.code, p->notify.subcode);
10569 json_object_string_add(json_neigh,
10570 "lastErrorCodeSubcode",
10571 errorcodesubcode_hexstr);
10572 snprintf(errorcodesubcode_str, 255, "%s%s",
10573 code_str, subcode_str);
10574 json_object_string_add(json_neigh,
10575 "lastNotificationReason",
10576 errorcodesubcode_str);
10577 if (p->last_reset == PEER_DOWN_NOTIFY_RECEIVED
10578 && p->notify.code == BGP_NOTIFY_CEASE
10579 && (p->notify.subcode
10580 == BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
10581 || p->notify.subcode
10582 == BGP_NOTIFY_CEASE_ADMIN_RESET)
10583 && p->notify.length) {
10584 char msgbuf[1024];
10585 const char *msg_str;
10586
10587 msg_str = bgp_notify_admin_message(
10588 msgbuf, sizeof(msgbuf),
10589 (uint8_t *)p->notify.data,
10590 p->notify.length);
10591 if (msg_str)
10592 json_object_string_add(
10593 json_neigh,
10594 "lastShutdownDescription",
10595 msg_str);
10596 }
10597 }
10598 } else {
10599 vty_out(vty, " Last reset %s, ",
10600 peer_uptime(p->resettime, timebuf,
10601 BGP_UPTIME_LEN, 0, NULL));
10602
10603 if (p->last_reset == PEER_DOWN_NOTIFY_SEND
10604 || p->last_reset == PEER_DOWN_NOTIFY_RECEIVED) {
10605 code_str = bgp_notify_code_str(p->notify.code);
10606 subcode_str = bgp_notify_subcode_str(
10607 p->notify.code, p->notify.subcode);
10608 vty_out(vty, "due to NOTIFICATION %s (%s%s)\n",
10609 p->last_reset == PEER_DOWN_NOTIFY_SEND
10610 ? "sent"
10611 : "received",
10612 code_str, subcode_str);
10613 if (p->last_reset == PEER_DOWN_NOTIFY_RECEIVED
10614 && p->notify.code == BGP_NOTIFY_CEASE
10615 && (p->notify.subcode
10616 == BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
10617 || p->notify.subcode
10618 == BGP_NOTIFY_CEASE_ADMIN_RESET)
10619 && p->notify.length) {
10620 char msgbuf[1024];
10621 const char *msg_str;
10622
10623 msg_str = bgp_notify_admin_message(
10624 msgbuf, sizeof(msgbuf),
10625 (uint8_t *)p->notify.data,
10626 p->notify.length);
10627 if (msg_str)
10628 vty_out(vty,
10629 " Message: \"%s\"\n",
10630 msg_str);
10631 }
10632 } else {
10633 vty_out(vty, "due to %s\n",
10634 peer_down_str[(int)p->last_reset]);
10635 }
10636
10637 if (p->last_reset_cause_size) {
10638 msg = p->last_reset_cause;
10639 vty_out(vty,
10640 " Message received that caused BGP to send a NOTIFICATION:\n ");
10641 for (i = 1; i <= p->last_reset_cause_size;
10642 i++) {
10643 vty_out(vty, "%02X", *msg++);
10644
10645 if (i != p->last_reset_cause_size) {
10646 if (i % 16 == 0) {
10647 vty_out(vty, "\n ");
10648 } else if (i % 4 == 0) {
10649 vty_out(vty, " ");
10650 }
10651 }
10652 }
10653 vty_out(vty, "\n");
10654 }
10655 }
10656 }
10657
10658 if (CHECK_FLAG(p->sflags, PEER_STATUS_PREFIX_OVERFLOW)) {
10659 if (use_json)
10660 json_object_boolean_true_add(json_neigh,
10661 "prefixesConfigExceedMax");
10662 else
10663 vty_out(vty,
10664 " Peer had exceeded the max. no. of prefixes configured.\n");
10665
10666 if (p->t_pmax_restart) {
10667 if (use_json) {
10668 json_object_boolean_true_add(
10669 json_neigh, "reducePrefixNumFrom");
10670 json_object_int_add(json_neigh,
10671 "restartInTimerMsec",
10672 thread_timer_remain_second(
10673 p->t_pmax_restart)
10674 * 1000);
10675 } else
10676 vty_out(vty,
10677 " Reduce the no. of prefix from %s, will restart in %ld seconds\n",
10678 p->host, thread_timer_remain_second(
10679 p->t_pmax_restart));
10680 } else {
10681 if (use_json)
10682 json_object_boolean_true_add(
10683 json_neigh,
10684 "reducePrefixNumAndClearIpBgp");
10685 else
10686 vty_out(vty,
10687 " Reduce the no. of prefix and clear ip bgp %s to restore peering\n",
10688 p->host);
10689 }
10690 }
10691
10692 /* EBGP Multihop and GTSM */
10693 if (p->sort != BGP_PEER_IBGP) {
10694 if (use_json) {
10695 if (p->gtsm_hops > 0)
10696 json_object_int_add(json_neigh,
10697 "externalBgpNbrMaxHopsAway",
10698 p->gtsm_hops);
10699 else if (p->ttl > 1)
10700 json_object_int_add(json_neigh,
10701 "externalBgpNbrMaxHopsAway",
10702 p->ttl);
10703 } else {
10704 if (p->gtsm_hops > 0)
10705 vty_out(vty,
10706 " External BGP neighbor may be up to %d hops away.\n",
10707 p->gtsm_hops);
10708 else if (p->ttl > 1)
10709 vty_out(vty,
10710 " External BGP neighbor may be up to %d hops away.\n",
10711 p->ttl);
10712 }
10713 } else {
10714 if (p->gtsm_hops > 0) {
10715 if (use_json)
10716 json_object_int_add(json_neigh,
10717 "internalBgpNbrMaxHopsAway",
10718 p->gtsm_hops);
10719 else
10720 vty_out(vty,
10721 " Internal BGP neighbor may be up to %d hops away.\n",
10722 p->gtsm_hops);
10723 }
10724 }
10725
10726 /* Local address. */
10727 if (p->su_local) {
10728 if (use_json) {
10729 json_object_string_add(json_neigh, "hostLocal",
10730 sockunion2str(p->su_local, buf1,
10731 SU_ADDRSTRLEN));
10732 json_object_int_add(json_neigh, "portLocal",
10733 ntohs(p->su_local->sin.sin_port));
10734 } else
10735 vty_out(vty, "Local host: %s, Local port: %d\n",
10736 sockunion2str(p->su_local, buf1, SU_ADDRSTRLEN),
10737 ntohs(p->su_local->sin.sin_port));
10738 }
10739
10740 /* Remote address. */
10741 if (p->su_remote) {
10742 if (use_json) {
10743 json_object_string_add(json_neigh, "hostForeign",
10744 sockunion2str(p->su_remote, buf1,
10745 SU_ADDRSTRLEN));
10746 json_object_int_add(json_neigh, "portForeign",
10747 ntohs(p->su_remote->sin.sin_port));
10748 } else
10749 vty_out(vty, "Foreign host: %s, Foreign port: %d\n",
10750 sockunion2str(p->su_remote, buf1,
10751 SU_ADDRSTRLEN),
10752 ntohs(p->su_remote->sin.sin_port));
10753 }
10754
10755 /* Nexthop display. */
10756 if (p->su_local) {
10757 if (use_json) {
10758 json_object_string_add(json_neigh, "nexthop",
10759 inet_ntop(AF_INET,
10760 &p->nexthop.v4, buf1,
10761 sizeof(buf1)));
10762 json_object_string_add(json_neigh, "nexthopGlobal",
10763 inet_ntop(AF_INET6,
10764 &p->nexthop.v6_global,
10765 buf1, sizeof(buf1)));
10766 json_object_string_add(json_neigh, "nexthopLocal",
10767 inet_ntop(AF_INET6,
10768 &p->nexthop.v6_local,
10769 buf1, sizeof(buf1)));
10770 if (p->shared_network)
10771 json_object_string_add(json_neigh,
10772 "bgpConnection",
10773 "sharedNetwork");
10774 else
10775 json_object_string_add(json_neigh,
10776 "bgpConnection",
10777 "nonSharedNetwork");
10778 } else {
10779 vty_out(vty, "Nexthop: %s\n",
10780 inet_ntop(AF_INET, &p->nexthop.v4, buf1,
10781 sizeof(buf1)));
10782 vty_out(vty, "Nexthop global: %s\n",
10783 inet_ntop(AF_INET6, &p->nexthop.v6_global, buf1,
10784 sizeof(buf1)));
10785 vty_out(vty, "Nexthop local: %s\n",
10786 inet_ntop(AF_INET6, &p->nexthop.v6_local, buf1,
10787 sizeof(buf1)));
10788 vty_out(vty, "BGP connection: %s\n",
10789 p->shared_network ? "shared network"
10790 : "non shared network");
10791 }
10792 }
10793
10794 /* Timer information. */
10795 if (use_json) {
10796 json_object_int_add(json_neigh, "connectRetryTimer",
10797 p->v_connect);
10798 if (p->status == Established && p->rtt)
10799 json_object_int_add(json_neigh, "estimatedRttInMsecs",
10800 p->rtt);
10801 if (p->t_start)
10802 json_object_int_add(
10803 json_neigh, "nextStartTimerDueInMsecs",
10804 thread_timer_remain_second(p->t_start) * 1000);
10805 if (p->t_connect)
10806 json_object_int_add(
10807 json_neigh, "nextConnectTimerDueInMsecs",
10808 thread_timer_remain_second(p->t_connect)
10809 * 1000);
10810 if (p->t_routeadv) {
10811 json_object_int_add(json_neigh, "mraiInterval",
10812 p->v_routeadv);
10813 json_object_int_add(
10814 json_neigh, "mraiTimerExpireInMsecs",
10815 thread_timer_remain_second(p->t_routeadv)
10816 * 1000);
10817 }
10818 if (p->password)
10819 json_object_int_add(json_neigh, "authenticationEnabled",
10820 1);
10821
10822 if (p->t_read)
10823 json_object_string_add(json_neigh, "readThread", "on");
10824 else
10825 json_object_string_add(json_neigh, "readThread", "off");
10826
10827 if (CHECK_FLAG(p->thread_flags, PEER_THREAD_WRITES_ON))
10828 json_object_string_add(json_neigh, "writeThread", "on");
10829 else
10830 json_object_string_add(json_neigh, "writeThread",
10831 "off");
10832 } else {
10833 vty_out(vty, "BGP Connect Retry Timer in Seconds: %d\n",
10834 p->v_connect);
10835 if (p->status == Established && p->rtt)
10836 vty_out(vty, "Estimated round trip time: %d ms\n",
10837 p->rtt);
10838 if (p->t_start)
10839 vty_out(vty, "Next start timer due in %ld seconds\n",
10840 thread_timer_remain_second(p->t_start));
10841 if (p->t_connect)
10842 vty_out(vty, "Next connect timer due in %ld seconds\n",
10843 thread_timer_remain_second(p->t_connect));
10844 if (p->t_routeadv)
10845 vty_out(vty,
10846 "MRAI (interval %u) timer expires in %ld seconds\n",
10847 p->v_routeadv,
10848 thread_timer_remain_second(p->t_routeadv));
10849 if (p->password)
10850 vty_out(vty, "Peer Authentication Enabled\n");
10851
10852 vty_out(vty, "Read thread: %s Write thread: %s FD used: %d\n",
10853 p->t_read ? "on" : "off",
10854 CHECK_FLAG(p->thread_flags, PEER_THREAD_WRITES_ON)
10855 ? "on"
10856 : "off", p->fd);
10857 }
10858
10859 if (p->notify.code == BGP_NOTIFY_OPEN_ERR
10860 && p->notify.subcode == BGP_NOTIFY_OPEN_UNSUP_CAPBL)
10861 bgp_capability_vty_out(vty, p, use_json, json_neigh);
10862
10863 if (!use_json)
10864 vty_out(vty, "\n");
10865
10866 /* BFD information. */
10867 bgp_bfd_show_info(vty, p, use_json, json_neigh);
10868
10869 if (use_json) {
10870 if (p->conf_if) /* Configured interface name. */
10871 json_object_object_add(json, p->conf_if, json_neigh);
10872 else /* Configured IP address. */
10873 json_object_object_add(json, p->host, json_neigh);
10874 }
10875 }
10876
10877 static int bgp_show_neighbor(struct vty *vty, struct bgp *bgp,
10878 enum show_type type, union sockunion *su,
10879 const char *conf_if, bool use_json,
10880 json_object *json)
10881 {
10882 struct listnode *node, *nnode;
10883 struct peer *peer;
10884 int find = 0;
10885 bool nbr_output = false;
10886 afi_t afi = AFI_MAX;
10887 safi_t safi = SAFI_MAX;
10888
10889 if (type == show_ipv4_peer || type == show_ipv4_all) {
10890 afi = AFI_IP;
10891 } else if (type == show_ipv6_peer || type == show_ipv6_all) {
10892 afi = AFI_IP6;
10893 }
10894
10895 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
10896 if (!CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE))
10897 continue;
10898
10899 switch (type) {
10900 case show_all:
10901 bgp_show_peer(vty, peer, use_json, json);
10902 nbr_output = true;
10903 break;
10904 case show_peer:
10905 if (conf_if) {
10906 if ((peer->conf_if
10907 && !strcmp(peer->conf_if, conf_if))
10908 || (peer->hostname
10909 && !strcmp(peer->hostname, conf_if))) {
10910 find = 1;
10911 bgp_show_peer(vty, peer, use_json,
10912 json);
10913 }
10914 } else {
10915 if (sockunion_same(&peer->su, su)) {
10916 find = 1;
10917 bgp_show_peer(vty, peer, use_json,
10918 json);
10919 }
10920 }
10921 break;
10922 case show_ipv4_peer:
10923 case show_ipv6_peer:
10924 FOREACH_SAFI (safi) {
10925 if (peer->afc[afi][safi]) {
10926 if (conf_if) {
10927 if ((peer->conf_if
10928 && !strcmp(peer->conf_if, conf_if))
10929 || (peer->hostname
10930 && !strcmp(peer->hostname, conf_if))) {
10931 find = 1;
10932 bgp_show_peer(vty, peer, use_json,
10933 json);
10934 break;
10935 }
10936 } else {
10937 if (sockunion_same(&peer->su, su)) {
10938 find = 1;
10939 bgp_show_peer(vty, peer, use_json,
10940 json);
10941 break;
10942 }
10943 }
10944 }
10945 }
10946 break;
10947 case show_ipv4_all:
10948 case show_ipv6_all:
10949 FOREACH_SAFI (safi) {
10950 if (peer->afc[afi][safi]) {
10951 bgp_show_peer(vty, peer, use_json, json);
10952 nbr_output = true;
10953 break;
10954 }
10955 }
10956 break;
10957 }
10958 }
10959
10960 if ((type == show_peer || type == show_ipv4_peer ||
10961 type == show_ipv6_peer) && !find) {
10962 if (use_json)
10963 json_object_boolean_true_add(json, "bgpNoSuchNeighbor");
10964 else
10965 vty_out(vty, "%% No such neighbor in this view/vrf\n");
10966 }
10967
10968 if (type != show_peer && type != show_ipv4_peer &&
10969 type != show_ipv6_peer && !nbr_output && !use_json)
10970 vty_out(vty, "%% No BGP neighbors found\n");
10971
10972 if (use_json) {
10973 vty_out(vty, "%s\n", json_object_to_json_string_ext(
10974 json, JSON_C_TO_STRING_PRETTY));
10975 } else {
10976 vty_out(vty, "\n");
10977 }
10978
10979 return CMD_SUCCESS;
10980 }
10981
10982 static void bgp_show_all_instances_neighbors_vty(struct vty *vty,
10983 enum show_type type,
10984 const char *ip_str,
10985 bool use_json)
10986 {
10987 struct listnode *node, *nnode;
10988 struct bgp *bgp;
10989 union sockunion su;
10990 json_object *json = NULL;
10991 int ret, is_first = 1;
10992 bool nbr_output = false;
10993
10994 if (use_json)
10995 vty_out(vty, "{\n");
10996
10997 for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) {
10998 nbr_output = true;
10999 if (use_json) {
11000 if (!(json = json_object_new_object())) {
11001 flog_err(
11002 EC_BGP_JSON_MEM_ERROR,
11003 "Unable to allocate memory for JSON object");
11004 vty_out(vty,
11005 "{\"error\": {\"message:\": \"Unable to allocate memory for JSON object\"}}}\n");
11006 return;
11007 }
11008
11009 json_object_int_add(json, "vrfId",
11010 (bgp->vrf_id == VRF_UNKNOWN)
11011 ? -1
11012 : (int64_t)bgp->vrf_id);
11013 json_object_string_add(
11014 json, "vrfName",
11015 (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)
11016 ? VRF_DEFAULT_NAME
11017 : bgp->name);
11018
11019 if (!is_first)
11020 vty_out(vty, ",\n");
11021 else
11022 is_first = 0;
11023
11024 vty_out(vty, "\"%s\":",
11025 (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)
11026 ? VRF_DEFAULT_NAME
11027 : bgp->name);
11028 } else {
11029 vty_out(vty, "\nInstance %s:\n",
11030 (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)
11031 ? VRF_DEFAULT_NAME
11032 : bgp->name);
11033 }
11034
11035 if (type == show_peer || type == show_ipv4_peer ||
11036 type == show_ipv6_peer) {
11037 ret = str2sockunion(ip_str, &su);
11038 if (ret < 0)
11039 bgp_show_neighbor(vty, bgp, type, NULL, ip_str,
11040 use_json, json);
11041 else
11042 bgp_show_neighbor(vty, bgp, type, &su, NULL,
11043 use_json, json);
11044 } else {
11045 bgp_show_neighbor(vty, bgp, type, NULL, NULL,
11046 use_json, json);
11047 }
11048 json_object_free(json);
11049 }
11050
11051 if (use_json) {
11052 vty_out(vty, "}\n");
11053 json_object_free(json);
11054 }
11055 else if (!nbr_output)
11056 vty_out(vty, "%% BGP instance not found\n");
11057 }
11058
11059 static int bgp_show_neighbor_vty(struct vty *vty, const char *name,
11060 enum show_type type, const char *ip_str,
11061 bool use_json)
11062 {
11063 int ret;
11064 struct bgp *bgp;
11065 union sockunion su;
11066 json_object *json = NULL;
11067
11068 if (name) {
11069 if (strmatch(name, "all")) {
11070 bgp_show_all_instances_neighbors_vty(vty, type, ip_str,
11071 use_json);
11072 return CMD_SUCCESS;
11073 } else {
11074 bgp = bgp_lookup_by_name(name);
11075 if (!bgp) {
11076 if (use_json) {
11077 json = json_object_new_object();
11078 vty_out(vty, "%s\n",
11079 json_object_to_json_string_ext(
11080 json,
11081 JSON_C_TO_STRING_PRETTY));
11082 json_object_free(json);
11083 } else
11084 vty_out(vty,
11085 "%% BGP instance not found\n");
11086
11087 return CMD_WARNING;
11088 }
11089 }
11090 } else {
11091 bgp = bgp_get_default();
11092 }
11093
11094 if (bgp) {
11095 json = json_object_new_object();
11096 if (ip_str) {
11097 ret = str2sockunion(ip_str, &su);
11098 if (ret < 0)
11099 bgp_show_neighbor(vty, bgp, type, NULL, ip_str,
11100 use_json, json);
11101 else
11102 bgp_show_neighbor(vty, bgp, type, &su, NULL,
11103 use_json, json);
11104 } else {
11105 bgp_show_neighbor(vty, bgp, type, NULL, NULL, use_json,
11106 json);
11107 }
11108 json_object_free(json);
11109 } else {
11110 if (use_json)
11111 vty_out(vty, "{}\n");
11112 else
11113 vty_out(vty, "%% BGP instance not found\n");
11114 }
11115
11116 return CMD_SUCCESS;
11117 }
11118
11119 /* "show [ip] bgp neighbors" commands. */
11120 DEFUN (show_ip_bgp_neighbors,
11121 show_ip_bgp_neighbors_cmd,
11122 "show [ip] bgp [<view|vrf> VIEWVRFNAME] [<ipv4|ipv6>] neighbors [<A.B.C.D|X:X::X:X|WORD>] [json]",
11123 SHOW_STR
11124 IP_STR
11125 BGP_STR
11126 BGP_INSTANCE_HELP_STR
11127 "Address Family\n"
11128 "Address Family\n"
11129 "Detailed information on TCP and BGP neighbor connections\n"
11130 "Neighbor to display information about\n"
11131 "Neighbor to display information about\n"
11132 "Neighbor on BGP configured interface\n"
11133 JSON_STR)
11134 {
11135 char *vrf = NULL;
11136 char *sh_arg = NULL;
11137 enum show_type sh_type;
11138 afi_t afi = AFI_MAX;
11139
11140 bool uj = use_json(argc, argv);
11141
11142 int idx = 0;
11143
11144 /* [<vrf> VIEWVRFNAME] */
11145 if (argv_find(argv, argc, "vrf", &idx)) {
11146 vrf = argv[idx + 1]->arg;
11147 if (vrf && strmatch(vrf, VRF_DEFAULT_NAME))
11148 vrf = NULL;
11149 } else if (argv_find(argv, argc, "view", &idx))
11150 /* [<view> VIEWVRFNAME] */
11151 vrf = argv[idx + 1]->arg;
11152
11153 idx++;
11154
11155 if (argv_find(argv, argc, "ipv4", &idx)) {
11156 sh_type = show_ipv4_all;
11157 afi = AFI_IP;
11158 } else if (argv_find(argv, argc, "ipv6", &idx)) {
11159 sh_type = show_ipv6_all;
11160 afi = AFI_IP6;
11161 } else {
11162 sh_type = show_all;
11163 }
11164
11165 if (argv_find(argv, argc, "A.B.C.D", &idx)
11166 || argv_find(argv, argc, "X:X::X:X", &idx)
11167 || argv_find(argv, argc, "WORD", &idx)) {
11168 sh_type = show_peer;
11169 sh_arg = argv[idx]->arg;
11170 }
11171
11172 if (sh_type == show_peer && afi == AFI_IP) {
11173 sh_type = show_ipv4_peer;
11174 } else if (sh_type == show_peer && afi == AFI_IP6) {
11175 sh_type = show_ipv6_peer;
11176 }
11177
11178 return bgp_show_neighbor_vty(vty, vrf, sh_type, sh_arg, uj);
11179 }
11180
11181 /* Show BGP's AS paths internal data. There are both `show [ip] bgp
11182 paths' and `show ip mbgp paths'. Those functions results are the
11183 same.*/
11184 DEFUN (show_ip_bgp_paths,
11185 show_ip_bgp_paths_cmd,
11186 "show [ip] bgp ["BGP_SAFI_CMD_STR"] paths",
11187 SHOW_STR
11188 IP_STR
11189 BGP_STR
11190 BGP_SAFI_HELP_STR
11191 "Path information\n")
11192 {
11193 vty_out(vty, "Address Refcnt Path\n");
11194 aspath_print_all_vty(vty);
11195 return CMD_SUCCESS;
11196 }
11197
11198 #include "hash.h"
11199
11200 static void community_show_all_iterator(struct hash_bucket *bucket,
11201 struct vty *vty)
11202 {
11203 struct community *com;
11204
11205 com = (struct community *)bucket->data;
11206 vty_out(vty, "[%p] (%ld) %s\n", (void *)com, com->refcnt,
11207 community_str(com, false));
11208 }
11209
11210 /* Show BGP's community internal data. */
11211 DEFUN (show_ip_bgp_community_info,
11212 show_ip_bgp_community_info_cmd,
11213 "show [ip] bgp community-info",
11214 SHOW_STR
11215 IP_STR
11216 BGP_STR
11217 "List all bgp community information\n")
11218 {
11219 vty_out(vty, "Address Refcnt Community\n");
11220
11221 hash_iterate(community_hash(),
11222 (void (*)(struct hash_bucket *,
11223 void *))community_show_all_iterator,
11224 vty);
11225
11226 return CMD_SUCCESS;
11227 }
11228
11229 static void lcommunity_show_all_iterator(struct hash_bucket *bucket,
11230 struct vty *vty)
11231 {
11232 struct lcommunity *lcom;
11233
11234 lcom = (struct lcommunity *)bucket->data;
11235 vty_out(vty, "[%p] (%ld) %s\n", (void *)lcom, lcom->refcnt,
11236 lcommunity_str(lcom, false));
11237 }
11238
11239 /* Show BGP's community internal data. */
11240 DEFUN (show_ip_bgp_lcommunity_info,
11241 show_ip_bgp_lcommunity_info_cmd,
11242 "show ip bgp large-community-info",
11243 SHOW_STR
11244 IP_STR
11245 BGP_STR
11246 "List all bgp large-community information\n")
11247 {
11248 vty_out(vty, "Address Refcnt Large-community\n");
11249
11250 hash_iterate(lcommunity_hash(),
11251 (void (*)(struct hash_bucket *,
11252 void *))lcommunity_show_all_iterator,
11253 vty);
11254
11255 return CMD_SUCCESS;
11256 }
11257
11258
11259 DEFUN (show_ip_bgp_attr_info,
11260 show_ip_bgp_attr_info_cmd,
11261 "show [ip] bgp attribute-info",
11262 SHOW_STR
11263 IP_STR
11264 BGP_STR
11265 "List all bgp attribute information\n")
11266 {
11267 attr_show_all(vty);
11268 return CMD_SUCCESS;
11269 }
11270
11271 static int bgp_show_route_leak_vty(struct vty *vty, const char *name,
11272 afi_t afi, safi_t safi,
11273 bool use_json, json_object *json)
11274 {
11275 struct bgp *bgp;
11276 struct listnode *node;
11277 char *vname;
11278 char buf1[INET6_ADDRSTRLEN];
11279 char *ecom_str;
11280 vpn_policy_direction_t dir;
11281
11282 if (json) {
11283 json_object *json_import_vrfs = NULL;
11284 json_object *json_export_vrfs = NULL;
11285
11286 bgp = name ? bgp_lookup_by_name(name) : bgp_get_default();
11287
11288 if (!bgp) {
11289 vty_out(vty, "%s\n",
11290 json_object_to_json_string_ext(
11291 json,
11292 JSON_C_TO_STRING_PRETTY));
11293 json_object_free(json);
11294
11295 return CMD_WARNING;
11296 }
11297
11298 /* Provide context for the block */
11299 json_object_string_add(json, "vrf", name ? name : "default");
11300 json_object_string_add(json, "afiSafi",
11301 afi_safi_print(afi, safi));
11302
11303 if (!CHECK_FLAG(bgp->af_flags[afi][safi],
11304 BGP_CONFIG_VRF_TO_VRF_IMPORT)) {
11305 json_object_string_add(json, "importFromVrfs", "none");
11306 json_object_string_add(json, "importRts", "none");
11307 } else {
11308 json_import_vrfs = json_object_new_array();
11309
11310 for (ALL_LIST_ELEMENTS_RO(
11311 bgp->vpn_policy[afi].import_vrf,
11312 node, vname))
11313 json_object_array_add(json_import_vrfs,
11314 json_object_new_string(vname));
11315
11316 dir = BGP_VPN_POLICY_DIR_FROMVPN;
11317 ecom_str = ecommunity_ecom2str(
11318 bgp->vpn_policy[afi].rtlist[dir],
11319 ECOMMUNITY_FORMAT_ROUTE_MAP, 0);
11320 json_object_object_add(json, "importFromVrfs",
11321 json_import_vrfs);
11322 json_object_string_add(json, "importRts", ecom_str);
11323
11324 XFREE(MTYPE_ECOMMUNITY_STR, ecom_str);
11325 }
11326
11327 if (!CHECK_FLAG(bgp->af_flags[afi][safi],
11328 BGP_CONFIG_VRF_TO_VRF_EXPORT)) {
11329 json_object_string_add(json, "exportToVrfs", "none");
11330 json_object_string_add(json, "routeDistinguisher",
11331 "none");
11332 json_object_string_add(json, "exportRts", "none");
11333 } else {
11334 json_export_vrfs = json_object_new_array();
11335
11336 for (ALL_LIST_ELEMENTS_RO(
11337 bgp->vpn_policy[afi].export_vrf,
11338 node, vname))
11339 json_object_array_add(json_export_vrfs,
11340 json_object_new_string(vname));
11341 json_object_object_add(json, "exportToVrfs",
11342 json_export_vrfs);
11343 json_object_string_add(json, "routeDistinguisher",
11344 prefix_rd2str(&bgp->vpn_policy[afi].tovpn_rd,
11345 buf1, RD_ADDRSTRLEN));
11346
11347 dir = BGP_VPN_POLICY_DIR_TOVPN;
11348 ecom_str = ecommunity_ecom2str(
11349 bgp->vpn_policy[afi].rtlist[dir],
11350 ECOMMUNITY_FORMAT_ROUTE_MAP, 0);
11351 json_object_string_add(json, "exportRts", ecom_str);
11352
11353 XFREE(MTYPE_ECOMMUNITY_STR, ecom_str);
11354 }
11355
11356 if (use_json) {
11357 vty_out(vty, "%s\n",
11358 json_object_to_json_string_ext(json,
11359 JSON_C_TO_STRING_PRETTY));
11360 json_object_free(json);
11361 }
11362 } else {
11363 bgp = name ? bgp_lookup_by_name(name) : bgp_get_default();
11364
11365 if (!bgp) {
11366 vty_out(vty, "%% No such BGP instance exist\n");
11367 return CMD_WARNING;
11368 }
11369
11370 if (!CHECK_FLAG(bgp->af_flags[afi][safi],
11371 BGP_CONFIG_VRF_TO_VRF_IMPORT))
11372 vty_out(vty,
11373 "This VRF is not importing %s routes from any other VRF\n",
11374 afi_safi_print(afi, safi));
11375 else {
11376 vty_out(vty,
11377 "This VRF is importing %s routes from the following VRFs:\n",
11378 afi_safi_print(afi, safi));
11379
11380 for (ALL_LIST_ELEMENTS_RO(
11381 bgp->vpn_policy[afi].import_vrf,
11382 node, vname))
11383 vty_out(vty, " %s\n", vname);
11384
11385 dir = BGP_VPN_POLICY_DIR_FROMVPN;
11386 ecom_str = ecommunity_ecom2str(
11387 bgp->vpn_policy[afi].rtlist[dir],
11388 ECOMMUNITY_FORMAT_ROUTE_MAP, 0);
11389 vty_out(vty, "Import RT(s): %s\n", ecom_str);
11390
11391 XFREE(MTYPE_ECOMMUNITY_STR, ecom_str);
11392 }
11393
11394 if (!CHECK_FLAG(bgp->af_flags[afi][safi],
11395 BGP_CONFIG_VRF_TO_VRF_EXPORT))
11396 vty_out(vty,
11397 "This VRF is not exporting %s routes to any other VRF\n",
11398 afi_safi_print(afi, safi));
11399 else {
11400 vty_out(vty,
11401 "This VRF is exporting %s routes to the following VRFs:\n",
11402 afi_safi_print(afi, safi));
11403
11404 for (ALL_LIST_ELEMENTS_RO(
11405 bgp->vpn_policy[afi].export_vrf,
11406 node, vname))
11407 vty_out(vty, " %s\n", vname);
11408
11409 vty_out(vty, "RD: %s\n",
11410 prefix_rd2str(&bgp->vpn_policy[afi].tovpn_rd,
11411 buf1, RD_ADDRSTRLEN));
11412
11413 dir = BGP_VPN_POLICY_DIR_TOVPN;
11414 ecom_str = ecommunity_ecom2str(
11415 bgp->vpn_policy[afi].rtlist[dir],
11416 ECOMMUNITY_FORMAT_ROUTE_MAP, 0);
11417 vty_out(vty, "Export RT: %s\n", ecom_str);
11418 XFREE(MTYPE_ECOMMUNITY_STR, ecom_str);
11419 }
11420 }
11421
11422 return CMD_SUCCESS;
11423 }
11424
11425 static int bgp_show_all_instance_route_leak_vty(struct vty *vty, afi_t afi,
11426 safi_t safi, bool use_json)
11427 {
11428 struct listnode *node, *nnode;
11429 struct bgp *bgp;
11430 char *vrf_name = NULL;
11431 json_object *json = NULL;
11432 json_object *json_vrf = NULL;
11433 json_object *json_vrfs = NULL;
11434
11435 if (use_json) {
11436 json = json_object_new_object();
11437 json_vrfs = json_object_new_object();
11438 }
11439
11440 for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) {
11441
11442 if (bgp->inst_type != BGP_INSTANCE_TYPE_DEFAULT)
11443 vrf_name = bgp->name;
11444
11445 if (use_json) {
11446 json_vrf = json_object_new_object();
11447 } else {
11448 vty_out(vty, "\nInstance %s:\n",
11449 (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)
11450 ? VRF_DEFAULT_NAME : bgp->name);
11451 }
11452 bgp_show_route_leak_vty(vty, vrf_name, afi, safi, 0, json_vrf);
11453 if (use_json) {
11454 if (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)
11455 json_object_object_add(json_vrfs,
11456 VRF_DEFAULT_NAME, json_vrf);
11457 else
11458 json_object_object_add(json_vrfs, vrf_name,
11459 json_vrf);
11460 }
11461 }
11462
11463 if (use_json) {
11464 json_object_object_add(json, "vrfs", json_vrfs);
11465 vty_out(vty, "%s\n", json_object_to_json_string_ext(json,
11466 JSON_C_TO_STRING_PRETTY));
11467 json_object_free(json);
11468 }
11469
11470 return CMD_SUCCESS;
11471 }
11472
11473 /* "show [ip] bgp route-leak" command. */
11474 DEFUN (show_ip_bgp_route_leak,
11475 show_ip_bgp_route_leak_cmd,
11476 "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] route-leak [json]",
11477 SHOW_STR
11478 IP_STR
11479 BGP_STR
11480 BGP_INSTANCE_HELP_STR
11481 BGP_AFI_HELP_STR
11482 BGP_SAFI_HELP_STR
11483 "Route leaking information\n"
11484 JSON_STR)
11485 {
11486 char *vrf = NULL;
11487 afi_t afi = AFI_MAX;
11488 safi_t safi = SAFI_MAX;
11489
11490 bool uj = use_json(argc, argv);
11491 int idx = 0;
11492 json_object *json = NULL;
11493
11494 /* show [ip] bgp */
11495 if (argv_find(argv, argc, "ip", &idx)) {
11496 afi = AFI_IP;
11497 safi = SAFI_UNICAST;
11498 }
11499 /* [vrf VIEWVRFNAME] */
11500 if (argv_find(argv, argc, "view", &idx)) {
11501 vty_out(vty,
11502 "%% This command is not applicable to BGP views\n");
11503 return CMD_WARNING;
11504 }
11505
11506 if (argv_find(argv, argc, "vrf", &idx)) {
11507 vrf = argv[idx + 1]->arg;
11508 if (vrf && strmatch(vrf, VRF_DEFAULT_NAME))
11509 vrf = NULL;
11510 }
11511 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
11512 if (argv_find_and_parse_afi(argv, argc, &idx, &afi)) {
11513 argv_find_and_parse_safi(argv, argc, &idx, &safi);
11514 }
11515
11516 if (!((afi == AFI_IP || afi == AFI_IP6) && safi == SAFI_UNICAST)) {
11517 vty_out(vty,
11518 "%% This command is applicable only for unicast ipv4|ipv6\n");
11519 return CMD_WARNING;
11520 }
11521
11522 if (vrf && strmatch(vrf, "all"))
11523 return bgp_show_all_instance_route_leak_vty(vty, afi, safi, uj);
11524
11525 if (uj)
11526 json = json_object_new_object();
11527
11528 return bgp_show_route_leak_vty(vty, vrf, afi, safi, uj, json);
11529 }
11530
11531 static void bgp_show_all_instances_updgrps_vty(struct vty *vty, afi_t afi,
11532 safi_t safi)
11533 {
11534 struct listnode *node, *nnode;
11535 struct bgp *bgp;
11536
11537 for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) {
11538 vty_out(vty, "\nInstance %s:\n",
11539 (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)
11540 ? VRF_DEFAULT_NAME
11541 : bgp->name);
11542 update_group_show(bgp, afi, safi, vty, 0);
11543 }
11544 }
11545
11546 static int bgp_show_update_groups(struct vty *vty, const char *name, int afi,
11547 int safi, uint64_t subgrp_id)
11548 {
11549 struct bgp *bgp;
11550
11551 if (name) {
11552 if (strmatch(name, "all")) {
11553 bgp_show_all_instances_updgrps_vty(vty, afi, safi);
11554 return CMD_SUCCESS;
11555 } else {
11556 bgp = bgp_lookup_by_name(name);
11557 }
11558 } else {
11559 bgp = bgp_get_default();
11560 }
11561
11562 if (bgp)
11563 update_group_show(bgp, afi, safi, vty, subgrp_id);
11564 return CMD_SUCCESS;
11565 }
11566
11567 DEFUN (show_ip_bgp_updgrps,
11568 show_ip_bgp_updgrps_cmd,
11569 "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR" ["BGP_SAFI_WITH_LABEL_CMD_STR"]] update-groups [SUBGROUP-ID]",
11570 SHOW_STR
11571 IP_STR
11572 BGP_STR
11573 BGP_INSTANCE_HELP_STR
11574 BGP_AFI_HELP_STR
11575 BGP_SAFI_WITH_LABEL_HELP_STR
11576 "Detailed info about dynamic update groups\n"
11577 "Specific subgroup to display detailed info for\n")
11578 {
11579 char *vrf = NULL;
11580 afi_t afi = AFI_IP6;
11581 safi_t safi = SAFI_UNICAST;
11582 uint64_t subgrp_id = 0;
11583
11584 int idx = 0;
11585
11586 /* show [ip] bgp */
11587 if (argv_find(argv, argc, "ip", &idx))
11588 afi = AFI_IP;
11589 /* [<vrf> VIEWVRFNAME] */
11590 if (argv_find(argv, argc, "vrf", &idx)) {
11591 vrf = argv[idx + 1]->arg;
11592 if (vrf && strmatch(vrf, VRF_DEFAULT_NAME))
11593 vrf = NULL;
11594 } else if (argv_find(argv, argc, "view", &idx))
11595 /* [<view> VIEWVRFNAME] */
11596 vrf = argv[idx + 1]->arg;
11597 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
11598 if (argv_find_and_parse_afi(argv, argc, &idx, &afi)) {
11599 argv_find_and_parse_safi(argv, argc, &idx, &safi);
11600 }
11601
11602 /* get subgroup id, if provided */
11603 idx = argc - 1;
11604 if (argv[idx]->type == VARIABLE_TKN)
11605 subgrp_id = strtoull(argv[idx]->arg, NULL, 10);
11606
11607 return (bgp_show_update_groups(vty, vrf, afi, safi, subgrp_id));
11608 }
11609
11610 DEFUN (show_bgp_instance_all_ipv6_updgrps,
11611 show_bgp_instance_all_ipv6_updgrps_cmd,
11612 "show [ip] bgp <view|vrf> all update-groups",
11613 SHOW_STR
11614 IP_STR
11615 BGP_STR
11616 BGP_INSTANCE_ALL_HELP_STR
11617 "Detailed info about dynamic update groups\n")
11618 {
11619 bgp_show_all_instances_updgrps_vty(vty, AFI_IP6, SAFI_UNICAST);
11620 return CMD_SUCCESS;
11621 }
11622
11623 DEFUN (show_bgp_l2vpn_evpn_updgrps,
11624 show_bgp_l2vpn_evpn_updgrps_cmd,
11625 "show [ip] bgp l2vpn evpn update-groups",
11626 SHOW_STR
11627 IP_STR
11628 BGP_STR
11629 "l2vpn address family\n"
11630 "evpn sub-address family\n"
11631 "Detailed info about dynamic update groups\n")
11632 {
11633 char *vrf = NULL;
11634 uint64_t subgrp_id = 0;
11635
11636 bgp_show_update_groups(vty, vrf, AFI_L2VPN, SAFI_EVPN, subgrp_id);
11637 return CMD_SUCCESS;
11638 }
11639
11640 DEFUN (show_bgp_updgrps_stats,
11641 show_bgp_updgrps_stats_cmd,
11642 "show [ip] bgp update-groups statistics",
11643 SHOW_STR
11644 IP_STR
11645 BGP_STR
11646 "Detailed info about dynamic update groups\n"
11647 "Statistics\n")
11648 {
11649 struct bgp *bgp;
11650
11651 bgp = bgp_get_default();
11652 if (bgp)
11653 update_group_show_stats(bgp, vty);
11654
11655 return CMD_SUCCESS;
11656 }
11657
11658 DEFUN (show_bgp_instance_updgrps_stats,
11659 show_bgp_instance_updgrps_stats_cmd,
11660 "show [ip] bgp <view|vrf> VIEWVRFNAME update-groups statistics",
11661 SHOW_STR
11662 IP_STR
11663 BGP_STR
11664 BGP_INSTANCE_HELP_STR
11665 "Detailed info about dynamic update groups\n"
11666 "Statistics\n")
11667 {
11668 int idx_word = 3;
11669 struct bgp *bgp;
11670
11671 bgp = bgp_lookup_by_name(argv[idx_word]->arg);
11672 if (bgp)
11673 update_group_show_stats(bgp, vty);
11674
11675 return CMD_SUCCESS;
11676 }
11677
11678 static void show_bgp_updgrps_adj_info_aux(struct vty *vty, const char *name,
11679 afi_t afi, safi_t safi,
11680 const char *what, uint64_t subgrp_id)
11681 {
11682 struct bgp *bgp;
11683
11684 if (name)
11685 bgp = bgp_lookup_by_name(name);
11686 else
11687 bgp = bgp_get_default();
11688
11689 if (bgp) {
11690 if (!strcmp(what, "advertise-queue"))
11691 update_group_show_adj_queue(bgp, afi, safi, vty,
11692 subgrp_id);
11693 else if (!strcmp(what, "advertised-routes"))
11694 update_group_show_advertised(bgp, afi, safi, vty,
11695 subgrp_id);
11696 else if (!strcmp(what, "packet-queue"))
11697 update_group_show_packet_queue(bgp, afi, safi, vty,
11698 subgrp_id);
11699 }
11700 }
11701
11702 DEFPY(show_ip_bgp_instance_updgrps_adj_s,
11703 show_ip_bgp_instance_updgrps_adj_s_cmd,
11704 "show [ip]$ip bgp [<view|vrf> VIEWVRFNAME$vrf] [<ipv4|ipv6>$afi <unicast|multicast|vpn>$safi] update-groups [SUBGROUP-ID]$sgid <advertise-queue|advertised-routes|packet-queue>$rtq",
11705 SHOW_STR IP_STR BGP_STR BGP_INSTANCE_HELP_STR BGP_AFI_HELP_STR
11706 BGP_SAFI_HELP_STR
11707 "Detailed info about dynamic update groups\n"
11708 "Specific subgroup to display info for\n"
11709 "Advertisement queue\n"
11710 "Announced routes\n"
11711 "Packet queue\n")
11712 {
11713 uint64_t subgrp_id = 0;
11714 afi_t afiz;
11715 safi_t safiz;
11716 if (sgid)
11717 subgrp_id = strtoull(sgid, NULL, 10);
11718
11719 if (!ip && !afi)
11720 afiz = AFI_IP6;
11721 if (!ip && afi)
11722 afiz = bgp_vty_afi_from_str(afi);
11723 if (ip && !afi)
11724 afiz = AFI_IP;
11725 if (ip && afi) {
11726 afiz = bgp_vty_afi_from_str(afi);
11727 if (afiz != AFI_IP)
11728 vty_out(vty,
11729 "%% Cannot specify both 'ip' and 'ipv6'\n");
11730 return CMD_WARNING;
11731 }
11732
11733 safiz = safi ? bgp_vty_safi_from_str(safi) : SAFI_UNICAST;
11734
11735 show_bgp_updgrps_adj_info_aux(vty, vrf, afiz, safiz, rtq, subgrp_id);
11736 return CMD_SUCCESS;
11737 }
11738
11739 static int bgp_show_one_peer_group(struct vty *vty, struct peer_group *group)
11740 {
11741 struct listnode *node, *nnode;
11742 struct prefix *range;
11743 struct peer *conf;
11744 struct peer *peer;
11745 char buf[PREFIX2STR_BUFFER];
11746 afi_t afi;
11747 safi_t safi;
11748 const char *peer_status;
11749 const char *af_str;
11750 int lr_count;
11751 int dynamic;
11752 int af_cfgd;
11753
11754 conf = group->conf;
11755
11756 if (conf->as_type == AS_SPECIFIED || conf->as_type == AS_EXTERNAL) {
11757 vty_out(vty, "\nBGP peer-group %s, remote AS %" PRIu32 "\n",
11758 group->name, conf->as);
11759 } else if (conf->as_type == AS_INTERNAL) {
11760 vty_out(vty, "\nBGP peer-group %s, remote AS %" PRIu32 "\n",
11761 group->name, group->bgp->as);
11762 } else {
11763 vty_out(vty, "\nBGP peer-group %s\n", group->name);
11764 }
11765
11766 if ((group->bgp->as == conf->as) || (conf->as_type == AS_INTERNAL))
11767 vty_out(vty, " Peer-group type is internal\n");
11768 else
11769 vty_out(vty, " Peer-group type is external\n");
11770
11771 /* Display AFs configured. */
11772 vty_out(vty, " Configured address-families:");
11773 FOREACH_AFI_SAFI (afi, safi) {
11774 if (conf->afc[afi][safi]) {
11775 af_cfgd = 1;
11776 vty_out(vty, " %s;", afi_safi_print(afi, safi));
11777 }
11778 }
11779 if (!af_cfgd)
11780 vty_out(vty, " none\n");
11781 else
11782 vty_out(vty, "\n");
11783
11784 /* Display listen ranges (for dynamic neighbors), if any */
11785 for (afi = AFI_IP; afi < AFI_MAX; afi++) {
11786 if (afi == AFI_IP)
11787 af_str = "IPv4";
11788 else if (afi == AFI_IP6)
11789 af_str = "IPv6";
11790 else
11791 af_str = "???";
11792 lr_count = listcount(group->listen_range[afi]);
11793 if (lr_count) {
11794 vty_out(vty, " %d %s listen range(s)\n", lr_count,
11795 af_str);
11796
11797
11798 for (ALL_LIST_ELEMENTS(group->listen_range[afi], node,
11799 nnode, range)) {
11800 prefix2str(range, buf, sizeof(buf));
11801 vty_out(vty, " %s\n", buf);
11802 }
11803 }
11804 }
11805
11806 /* Display group members and their status */
11807 if (listcount(group->peer)) {
11808 vty_out(vty, " Peer-group members:\n");
11809 for (ALL_LIST_ELEMENTS(group->peer, node, nnode, peer)) {
11810 if (CHECK_FLAG(peer->flags, PEER_FLAG_SHUTDOWN))
11811 peer_status = "Idle (Admin)";
11812 else if (CHECK_FLAG(peer->sflags,
11813 PEER_STATUS_PREFIX_OVERFLOW))
11814 peer_status = "Idle (PfxCt)";
11815 else
11816 peer_status = lookup_msg(bgp_status_msg,
11817 peer->status, NULL);
11818
11819 dynamic = peer_dynamic_neighbor(peer);
11820 vty_out(vty, " %s %s %s \n", peer->host,
11821 dynamic ? "(dynamic)" : "", peer_status);
11822 }
11823 }
11824
11825 return CMD_SUCCESS;
11826 }
11827
11828 static int bgp_show_peer_group_vty(struct vty *vty, const char *name,
11829 const char *group_name)
11830 {
11831 struct bgp *bgp;
11832 struct listnode *node, *nnode;
11833 struct peer_group *group;
11834 bool found = false;
11835
11836 bgp = name ? bgp_lookup_by_name(name) : bgp_get_default();
11837
11838 if (!bgp) {
11839 vty_out(vty, "%% BGP instance not found\n");
11840 return CMD_WARNING;
11841 }
11842
11843 for (ALL_LIST_ELEMENTS(bgp->group, node, nnode, group)) {
11844 if (group_name) {
11845 if (strmatch(group->name, group_name)) {
11846 bgp_show_one_peer_group(vty, group);
11847 found = true;
11848 break;
11849 }
11850 } else {
11851 bgp_show_one_peer_group(vty, group);
11852 }
11853 }
11854
11855 if (group_name && !found)
11856 vty_out(vty, "%% No such peer-group\n");
11857
11858 return CMD_SUCCESS;
11859 }
11860
11861 DEFUN (show_ip_bgp_peer_groups,
11862 show_ip_bgp_peer_groups_cmd,
11863 "show [ip] bgp [<view|vrf> VIEWVRFNAME] peer-group [PGNAME]",
11864 SHOW_STR
11865 IP_STR
11866 BGP_STR
11867 BGP_INSTANCE_HELP_STR
11868 "Detailed information on BGP peer groups\n"
11869 "Peer group name\n")
11870 {
11871 char *vrf, *pg;
11872 int idx = 0;
11873
11874 vrf = argv_find(argv, argc, "VIEWVRFNAME", &idx) ? argv[idx]->arg
11875 : NULL;
11876 pg = argv_find(argv, argc, "PGNAME", &idx) ? argv[idx]->arg : NULL;
11877
11878 return bgp_show_peer_group_vty(vty, vrf, pg);
11879 }
11880
11881
11882 /* Redistribute VTY commands. */
11883
11884 DEFUN (bgp_redistribute_ipv4,
11885 bgp_redistribute_ipv4_cmd,
11886 "redistribute " FRR_IP_REDIST_STR_BGPD,
11887 "Redistribute information from another routing protocol\n"
11888 FRR_IP_REDIST_HELP_STR_BGPD)
11889 {
11890 VTY_DECLVAR_CONTEXT(bgp, bgp);
11891 int idx_protocol = 1;
11892 int type;
11893
11894 type = proto_redistnum(AFI_IP, argv[idx_protocol]->text);
11895 if (type < 0) {
11896 vty_out(vty, "%% Invalid route type\n");
11897 return CMD_WARNING_CONFIG_FAILED;
11898 }
11899
11900 bgp_redist_add(bgp, AFI_IP, type, 0);
11901 return bgp_redistribute_set(bgp, AFI_IP, type, 0, false);
11902 }
11903
11904 ALIAS_HIDDEN(
11905 bgp_redistribute_ipv4, bgp_redistribute_ipv4_hidden_cmd,
11906 "redistribute " FRR_IP_REDIST_STR_BGPD,
11907 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD)
11908
11909 DEFUN (bgp_redistribute_ipv4_rmap,
11910 bgp_redistribute_ipv4_rmap_cmd,
11911 "redistribute " FRR_IP_REDIST_STR_BGPD " route-map WORD",
11912 "Redistribute information from another routing protocol\n"
11913 FRR_IP_REDIST_HELP_STR_BGPD
11914 "Route map reference\n"
11915 "Pointer to route-map entries\n")
11916 {
11917 VTY_DECLVAR_CONTEXT(bgp, bgp);
11918 int idx_protocol = 1;
11919 int idx_word = 3;
11920 int type;
11921 struct bgp_redist *red;
11922 bool changed;
11923 struct route_map *route_map = route_map_lookup_warn_noexist(
11924 vty, argv[idx_word]->arg);
11925
11926 type = proto_redistnum(AFI_IP, argv[idx_protocol]->text);
11927 if (type < 0) {
11928 vty_out(vty, "%% Invalid route type\n");
11929 return CMD_WARNING_CONFIG_FAILED;
11930 }
11931
11932 red = bgp_redist_add(bgp, AFI_IP, type, 0);
11933 changed =
11934 bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map);
11935 return bgp_redistribute_set(bgp, AFI_IP, type, 0, changed);
11936 }
11937
11938 ALIAS_HIDDEN(
11939 bgp_redistribute_ipv4_rmap, bgp_redistribute_ipv4_rmap_hidden_cmd,
11940 "redistribute " FRR_IP_REDIST_STR_BGPD " route-map WORD",
11941 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
11942 "Route map reference\n"
11943 "Pointer to route-map entries\n")
11944
11945 DEFUN (bgp_redistribute_ipv4_metric,
11946 bgp_redistribute_ipv4_metric_cmd,
11947 "redistribute " FRR_IP_REDIST_STR_BGPD " metric (0-4294967295)",
11948 "Redistribute information from another routing protocol\n"
11949 FRR_IP_REDIST_HELP_STR_BGPD
11950 "Metric for redistributed routes\n"
11951 "Default metric\n")
11952 {
11953 VTY_DECLVAR_CONTEXT(bgp, bgp);
11954 int idx_protocol = 1;
11955 int idx_number = 3;
11956 int type;
11957 uint32_t metric;
11958 struct bgp_redist *red;
11959 bool changed;
11960
11961 type = proto_redistnum(AFI_IP, argv[idx_protocol]->text);
11962 if (type < 0) {
11963 vty_out(vty, "%% Invalid route type\n");
11964 return CMD_WARNING_CONFIG_FAILED;
11965 }
11966 metric = strtoul(argv[idx_number]->arg, NULL, 10);
11967
11968 red = bgp_redist_add(bgp, AFI_IP, type, 0);
11969 changed = bgp_redistribute_metric_set(bgp, red, AFI_IP, type, metric);
11970 return bgp_redistribute_set(bgp, AFI_IP, type, 0, changed);
11971 }
11972
11973 ALIAS_HIDDEN(
11974 bgp_redistribute_ipv4_metric, bgp_redistribute_ipv4_metric_hidden_cmd,
11975 "redistribute " FRR_IP_REDIST_STR_BGPD " metric (0-4294967295)",
11976 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
11977 "Metric for redistributed routes\n"
11978 "Default metric\n")
11979
11980 DEFUN (bgp_redistribute_ipv4_rmap_metric,
11981 bgp_redistribute_ipv4_rmap_metric_cmd,
11982 "redistribute " FRR_IP_REDIST_STR_BGPD " route-map WORD metric (0-4294967295)",
11983 "Redistribute information from another routing protocol\n"
11984 FRR_IP_REDIST_HELP_STR_BGPD
11985 "Route map reference\n"
11986 "Pointer to route-map entries\n"
11987 "Metric for redistributed routes\n"
11988 "Default metric\n")
11989 {
11990 VTY_DECLVAR_CONTEXT(bgp, bgp);
11991 int idx_protocol = 1;
11992 int idx_word = 3;
11993 int idx_number = 5;
11994 int type;
11995 uint32_t metric;
11996 struct bgp_redist *red;
11997 bool changed;
11998 struct route_map *route_map =
11999 route_map_lookup_warn_noexist(vty, argv[idx_word]->arg);
12000
12001 type = proto_redistnum(AFI_IP, argv[idx_protocol]->text);
12002 if (type < 0) {
12003 vty_out(vty, "%% Invalid route type\n");
12004 return CMD_WARNING_CONFIG_FAILED;
12005 }
12006 metric = strtoul(argv[idx_number]->arg, NULL, 10);
12007
12008 red = bgp_redist_add(bgp, AFI_IP, type, 0);
12009 changed =
12010 bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map);
12011 changed |= bgp_redistribute_metric_set(bgp, red, AFI_IP, type, metric);
12012 return bgp_redistribute_set(bgp, AFI_IP, type, 0, changed);
12013 }
12014
12015 ALIAS_HIDDEN(
12016 bgp_redistribute_ipv4_rmap_metric,
12017 bgp_redistribute_ipv4_rmap_metric_hidden_cmd,
12018 "redistribute " FRR_IP_REDIST_STR_BGPD
12019 " route-map WORD metric (0-4294967295)",
12020 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
12021 "Route map reference\n"
12022 "Pointer to route-map entries\n"
12023 "Metric for redistributed routes\n"
12024 "Default metric\n")
12025
12026 DEFUN (bgp_redistribute_ipv4_metric_rmap,
12027 bgp_redistribute_ipv4_metric_rmap_cmd,
12028 "redistribute " FRR_IP_REDIST_STR_BGPD " metric (0-4294967295) route-map WORD",
12029 "Redistribute information from another routing protocol\n"
12030 FRR_IP_REDIST_HELP_STR_BGPD
12031 "Metric for redistributed routes\n"
12032 "Default metric\n"
12033 "Route map reference\n"
12034 "Pointer to route-map entries\n")
12035 {
12036 VTY_DECLVAR_CONTEXT(bgp, bgp);
12037 int idx_protocol = 1;
12038 int idx_number = 3;
12039 int idx_word = 5;
12040 int type;
12041 uint32_t metric;
12042 struct bgp_redist *red;
12043 bool changed;
12044 struct route_map *route_map =
12045 route_map_lookup_warn_noexist(vty, argv[idx_word]->arg);
12046
12047 type = proto_redistnum(AFI_IP, argv[idx_protocol]->text);
12048 if (type < 0) {
12049 vty_out(vty, "%% Invalid route type\n");
12050 return CMD_WARNING_CONFIG_FAILED;
12051 }
12052 metric = strtoul(argv[idx_number]->arg, NULL, 10);
12053
12054 red = bgp_redist_add(bgp, AFI_IP, type, 0);
12055 changed = bgp_redistribute_metric_set(bgp, red, AFI_IP, type, metric);
12056 changed |=
12057 bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map);
12058 return bgp_redistribute_set(bgp, AFI_IP, type, 0, changed);
12059 }
12060
12061 ALIAS_HIDDEN(
12062 bgp_redistribute_ipv4_metric_rmap,
12063 bgp_redistribute_ipv4_metric_rmap_hidden_cmd,
12064 "redistribute " FRR_IP_REDIST_STR_BGPD
12065 " metric (0-4294967295) route-map WORD",
12066 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
12067 "Metric for redistributed routes\n"
12068 "Default metric\n"
12069 "Route map reference\n"
12070 "Pointer to route-map entries\n")
12071
12072 DEFUN (bgp_redistribute_ipv4_ospf,
12073 bgp_redistribute_ipv4_ospf_cmd,
12074 "redistribute <ospf|table> (1-65535)",
12075 "Redistribute information from another routing protocol\n"
12076 "Open Shortest Path First (OSPFv2)\n"
12077 "Non-main Kernel Routing Table\n"
12078 "Instance ID/Table ID\n")
12079 {
12080 VTY_DECLVAR_CONTEXT(bgp, bgp);
12081 int idx_ospf_table = 1;
12082 int idx_number = 2;
12083 unsigned short instance;
12084 unsigned short protocol;
12085
12086 instance = strtoul(argv[idx_number]->arg, NULL, 10);
12087
12088 if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
12089 protocol = ZEBRA_ROUTE_OSPF;
12090 else
12091 protocol = ZEBRA_ROUTE_TABLE;
12092
12093 bgp_redist_add(bgp, AFI_IP, protocol, instance);
12094 return bgp_redistribute_set(bgp, AFI_IP, protocol, instance, false);
12095 }
12096
12097 ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf, bgp_redistribute_ipv4_ospf_hidden_cmd,
12098 "redistribute <ospf|table> (1-65535)",
12099 "Redistribute information from another routing protocol\n"
12100 "Open Shortest Path First (OSPFv2)\n"
12101 "Non-main Kernel Routing Table\n"
12102 "Instance ID/Table ID\n")
12103
12104 DEFUN (bgp_redistribute_ipv4_ospf_rmap,
12105 bgp_redistribute_ipv4_ospf_rmap_cmd,
12106 "redistribute <ospf|table> (1-65535) route-map WORD",
12107 "Redistribute information from another routing protocol\n"
12108 "Open Shortest Path First (OSPFv2)\n"
12109 "Non-main Kernel Routing Table\n"
12110 "Instance ID/Table ID\n"
12111 "Route map reference\n"
12112 "Pointer to route-map entries\n")
12113 {
12114 VTY_DECLVAR_CONTEXT(bgp, bgp);
12115 int idx_ospf_table = 1;
12116 int idx_number = 2;
12117 int idx_word = 4;
12118 struct bgp_redist *red;
12119 unsigned short instance;
12120 int protocol;
12121 bool changed;
12122 struct route_map *route_map =
12123 route_map_lookup_warn_noexist(vty, argv[idx_word]->arg);
12124
12125 if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
12126 protocol = ZEBRA_ROUTE_OSPF;
12127 else
12128 protocol = ZEBRA_ROUTE_TABLE;
12129
12130 instance = strtoul(argv[idx_number]->arg, NULL, 10);
12131 red = bgp_redist_add(bgp, AFI_IP, protocol, instance);
12132 changed =
12133 bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map);
12134 return bgp_redistribute_set(bgp, AFI_IP, protocol, instance, changed);
12135 }
12136
12137 ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf_rmap,
12138 bgp_redistribute_ipv4_ospf_rmap_hidden_cmd,
12139 "redistribute <ospf|table> (1-65535) route-map WORD",
12140 "Redistribute information from another routing protocol\n"
12141 "Open Shortest Path First (OSPFv2)\n"
12142 "Non-main Kernel Routing Table\n"
12143 "Instance ID/Table ID\n"
12144 "Route map reference\n"
12145 "Pointer to route-map entries\n")
12146
12147 DEFUN (bgp_redistribute_ipv4_ospf_metric,
12148 bgp_redistribute_ipv4_ospf_metric_cmd,
12149 "redistribute <ospf|table> (1-65535) metric (0-4294967295)",
12150 "Redistribute information from another routing protocol\n"
12151 "Open Shortest Path First (OSPFv2)\n"
12152 "Non-main Kernel Routing Table\n"
12153 "Instance ID/Table ID\n"
12154 "Metric for redistributed routes\n"
12155 "Default metric\n")
12156 {
12157 VTY_DECLVAR_CONTEXT(bgp, bgp);
12158 int idx_ospf_table = 1;
12159 int idx_number = 2;
12160 int idx_number_2 = 4;
12161 uint32_t metric;
12162 struct bgp_redist *red;
12163 unsigned short instance;
12164 int protocol;
12165 bool changed;
12166
12167 if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
12168 protocol = ZEBRA_ROUTE_OSPF;
12169 else
12170 protocol = ZEBRA_ROUTE_TABLE;
12171
12172 instance = strtoul(argv[idx_number]->arg, NULL, 10);
12173 metric = strtoul(argv[idx_number_2]->arg, NULL, 10);
12174
12175 red = bgp_redist_add(bgp, AFI_IP, protocol, instance);
12176 changed = bgp_redistribute_metric_set(bgp, red, AFI_IP, protocol,
12177 metric);
12178 return bgp_redistribute_set(bgp, AFI_IP, protocol, instance, changed);
12179 }
12180
12181 ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf_metric,
12182 bgp_redistribute_ipv4_ospf_metric_hidden_cmd,
12183 "redistribute <ospf|table> (1-65535) metric (0-4294967295)",
12184 "Redistribute information from another routing protocol\n"
12185 "Open Shortest Path First (OSPFv2)\n"
12186 "Non-main Kernel Routing Table\n"
12187 "Instance ID/Table ID\n"
12188 "Metric for redistributed routes\n"
12189 "Default metric\n")
12190
12191 DEFUN (bgp_redistribute_ipv4_ospf_rmap_metric,
12192 bgp_redistribute_ipv4_ospf_rmap_metric_cmd,
12193 "redistribute <ospf|table> (1-65535) route-map WORD metric (0-4294967295)",
12194 "Redistribute information from another routing protocol\n"
12195 "Open Shortest Path First (OSPFv2)\n"
12196 "Non-main Kernel Routing Table\n"
12197 "Instance ID/Table ID\n"
12198 "Route map reference\n"
12199 "Pointer to route-map entries\n"
12200 "Metric for redistributed routes\n"
12201 "Default metric\n")
12202 {
12203 VTY_DECLVAR_CONTEXT(bgp, bgp);
12204 int idx_ospf_table = 1;
12205 int idx_number = 2;
12206 int idx_word = 4;
12207 int idx_number_2 = 6;
12208 uint32_t metric;
12209 struct bgp_redist *red;
12210 unsigned short instance;
12211 int protocol;
12212 bool changed;
12213 struct route_map *route_map =
12214 route_map_lookup_warn_noexist(vty, argv[idx_word]->arg);
12215
12216 if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
12217 protocol = ZEBRA_ROUTE_OSPF;
12218 else
12219 protocol = ZEBRA_ROUTE_TABLE;
12220
12221 instance = strtoul(argv[idx_number]->arg, NULL, 10);
12222 metric = strtoul(argv[idx_number_2]->arg, NULL, 10);
12223
12224 red = bgp_redist_add(bgp, AFI_IP, protocol, instance);
12225 changed =
12226 bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map);
12227 changed |= bgp_redistribute_metric_set(bgp, red, AFI_IP, protocol,
12228 metric);
12229 return bgp_redistribute_set(bgp, AFI_IP, protocol, instance, changed);
12230 }
12231
12232 ALIAS_HIDDEN(
12233 bgp_redistribute_ipv4_ospf_rmap_metric,
12234 bgp_redistribute_ipv4_ospf_rmap_metric_hidden_cmd,
12235 "redistribute <ospf|table> (1-65535) route-map WORD metric (0-4294967295)",
12236 "Redistribute information from another routing protocol\n"
12237 "Open Shortest Path First (OSPFv2)\n"
12238 "Non-main Kernel Routing Table\n"
12239 "Instance ID/Table ID\n"
12240 "Route map reference\n"
12241 "Pointer to route-map entries\n"
12242 "Metric for redistributed routes\n"
12243 "Default metric\n")
12244
12245 DEFUN (bgp_redistribute_ipv4_ospf_metric_rmap,
12246 bgp_redistribute_ipv4_ospf_metric_rmap_cmd,
12247 "redistribute <ospf|table> (1-65535) metric (0-4294967295) route-map WORD",
12248 "Redistribute information from another routing protocol\n"
12249 "Open Shortest Path First (OSPFv2)\n"
12250 "Non-main Kernel Routing Table\n"
12251 "Instance ID/Table ID\n"
12252 "Metric for redistributed routes\n"
12253 "Default metric\n"
12254 "Route map reference\n"
12255 "Pointer to route-map entries\n")
12256 {
12257 VTY_DECLVAR_CONTEXT(bgp, bgp);
12258 int idx_ospf_table = 1;
12259 int idx_number = 2;
12260 int idx_number_2 = 4;
12261 int idx_word = 6;
12262 uint32_t metric;
12263 struct bgp_redist *red;
12264 unsigned short instance;
12265 int protocol;
12266 bool changed;
12267 struct route_map *route_map =
12268 route_map_lookup_warn_noexist(vty, argv[idx_word]->arg);
12269
12270 if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
12271 protocol = ZEBRA_ROUTE_OSPF;
12272 else
12273 protocol = ZEBRA_ROUTE_TABLE;
12274
12275 instance = strtoul(argv[idx_number]->arg, NULL, 10);
12276 metric = strtoul(argv[idx_number_2]->arg, NULL, 10);
12277
12278 red = bgp_redist_add(bgp, AFI_IP, protocol, instance);
12279 changed = bgp_redistribute_metric_set(bgp, red, AFI_IP, protocol,
12280 metric);
12281 changed |=
12282 bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map);
12283 return bgp_redistribute_set(bgp, AFI_IP, protocol, instance, changed);
12284 }
12285
12286 ALIAS_HIDDEN(
12287 bgp_redistribute_ipv4_ospf_metric_rmap,
12288 bgp_redistribute_ipv4_ospf_metric_rmap_hidden_cmd,
12289 "redistribute <ospf|table> (1-65535) metric (0-4294967295) route-map WORD",
12290 "Redistribute information from another routing protocol\n"
12291 "Open Shortest Path First (OSPFv2)\n"
12292 "Non-main Kernel Routing Table\n"
12293 "Instance ID/Table ID\n"
12294 "Metric for redistributed routes\n"
12295 "Default metric\n"
12296 "Route map reference\n"
12297 "Pointer to route-map entries\n")
12298
12299 DEFUN (no_bgp_redistribute_ipv4_ospf,
12300 no_bgp_redistribute_ipv4_ospf_cmd,
12301 "no redistribute <ospf|table> (1-65535) [metric (0-4294967295)] [route-map WORD]",
12302 NO_STR
12303 "Redistribute information from another routing protocol\n"
12304 "Open Shortest Path First (OSPFv2)\n"
12305 "Non-main Kernel Routing Table\n"
12306 "Instance ID/Table ID\n"
12307 "Metric for redistributed routes\n"
12308 "Default metric\n"
12309 "Route map reference\n"
12310 "Pointer to route-map entries\n")
12311 {
12312 VTY_DECLVAR_CONTEXT(bgp, bgp);
12313 int idx_ospf_table = 2;
12314 int idx_number = 3;
12315 unsigned short instance;
12316 int protocol;
12317
12318 if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
12319 protocol = ZEBRA_ROUTE_OSPF;
12320 else
12321 protocol = ZEBRA_ROUTE_TABLE;
12322
12323 instance = strtoul(argv[idx_number]->arg, NULL, 10);
12324 return bgp_redistribute_unset(bgp, AFI_IP, protocol, instance);
12325 }
12326
12327 ALIAS_HIDDEN(
12328 no_bgp_redistribute_ipv4_ospf, no_bgp_redistribute_ipv4_ospf_hidden_cmd,
12329 "no redistribute <ospf|table> (1-65535) [metric (0-4294967295)] [route-map WORD]",
12330 NO_STR
12331 "Redistribute information from another routing protocol\n"
12332 "Open Shortest Path First (OSPFv2)\n"
12333 "Non-main Kernel Routing Table\n"
12334 "Instance ID/Table ID\n"
12335 "Metric for redistributed routes\n"
12336 "Default metric\n"
12337 "Route map reference\n"
12338 "Pointer to route-map entries\n")
12339
12340 DEFUN (no_bgp_redistribute_ipv4,
12341 no_bgp_redistribute_ipv4_cmd,
12342 "no redistribute " FRR_IP_REDIST_STR_BGPD " [metric (0-4294967295)] [route-map WORD]",
12343 NO_STR
12344 "Redistribute information from another routing protocol\n"
12345 FRR_IP_REDIST_HELP_STR_BGPD
12346 "Metric for redistributed routes\n"
12347 "Default metric\n"
12348 "Route map reference\n"
12349 "Pointer to route-map entries\n")
12350 {
12351 VTY_DECLVAR_CONTEXT(bgp, bgp);
12352 int idx_protocol = 2;
12353 int type;
12354
12355 type = proto_redistnum(AFI_IP, argv[idx_protocol]->text);
12356 if (type < 0) {
12357 vty_out(vty, "%% Invalid route type\n");
12358 return CMD_WARNING_CONFIG_FAILED;
12359 }
12360 return bgp_redistribute_unset(bgp, AFI_IP, type, 0);
12361 }
12362
12363 ALIAS_HIDDEN(
12364 no_bgp_redistribute_ipv4, no_bgp_redistribute_ipv4_hidden_cmd,
12365 "no redistribute " FRR_IP_REDIST_STR_BGPD
12366 " [metric (0-4294967295)] [route-map WORD]",
12367 NO_STR
12368 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
12369 "Metric for redistributed routes\n"
12370 "Default metric\n"
12371 "Route map reference\n"
12372 "Pointer to route-map entries\n")
12373
12374 DEFUN (bgp_redistribute_ipv6,
12375 bgp_redistribute_ipv6_cmd,
12376 "redistribute " FRR_IP6_REDIST_STR_BGPD,
12377 "Redistribute information from another routing protocol\n"
12378 FRR_IP6_REDIST_HELP_STR_BGPD)
12379 {
12380 VTY_DECLVAR_CONTEXT(bgp, bgp);
12381 int idx_protocol = 1;
12382 int type;
12383
12384 type = proto_redistnum(AFI_IP6, argv[idx_protocol]->text);
12385 if (type < 0) {
12386 vty_out(vty, "%% Invalid route type\n");
12387 return CMD_WARNING_CONFIG_FAILED;
12388 }
12389
12390 bgp_redist_add(bgp, AFI_IP6, type, 0);
12391 return bgp_redistribute_set(bgp, AFI_IP6, type, 0, false);
12392 }
12393
12394 DEFUN (bgp_redistribute_ipv6_rmap,
12395 bgp_redistribute_ipv6_rmap_cmd,
12396 "redistribute " FRR_IP6_REDIST_STR_BGPD " route-map WORD",
12397 "Redistribute information from another routing protocol\n"
12398 FRR_IP6_REDIST_HELP_STR_BGPD
12399 "Route map reference\n"
12400 "Pointer to route-map entries\n")
12401 {
12402 VTY_DECLVAR_CONTEXT(bgp, bgp);
12403 int idx_protocol = 1;
12404 int idx_word = 3;
12405 int type;
12406 struct bgp_redist *red;
12407 bool changed;
12408 struct route_map *route_map =
12409 route_map_lookup_warn_noexist(vty, argv[idx_word]->arg);
12410
12411 type = proto_redistnum(AFI_IP6, argv[idx_protocol]->text);
12412 if (type < 0) {
12413 vty_out(vty, "%% Invalid route type\n");
12414 return CMD_WARNING_CONFIG_FAILED;
12415 }
12416
12417 red = bgp_redist_add(bgp, AFI_IP6, type, 0);
12418 changed =
12419 bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map);
12420 return bgp_redistribute_set(bgp, AFI_IP6, type, 0, changed);
12421 }
12422
12423 DEFUN (bgp_redistribute_ipv6_metric,
12424 bgp_redistribute_ipv6_metric_cmd,
12425 "redistribute " FRR_IP6_REDIST_STR_BGPD " metric (0-4294967295)",
12426 "Redistribute information from another routing protocol\n"
12427 FRR_IP6_REDIST_HELP_STR_BGPD
12428 "Metric for redistributed routes\n"
12429 "Default metric\n")
12430 {
12431 VTY_DECLVAR_CONTEXT(bgp, bgp);
12432 int idx_protocol = 1;
12433 int idx_number = 3;
12434 int type;
12435 uint32_t metric;
12436 struct bgp_redist *red;
12437 bool changed;
12438
12439 type = proto_redistnum(AFI_IP6, argv[idx_protocol]->text);
12440 if (type < 0) {
12441 vty_out(vty, "%% Invalid route type\n");
12442 return CMD_WARNING_CONFIG_FAILED;
12443 }
12444 metric = strtoul(argv[idx_number]->arg, NULL, 10);
12445
12446 red = bgp_redist_add(bgp, AFI_IP6, type, 0);
12447 changed = bgp_redistribute_metric_set(bgp, red, AFI_IP6, type, metric);
12448 return bgp_redistribute_set(bgp, AFI_IP6, type, 0, changed);
12449 }
12450
12451 DEFUN (bgp_redistribute_ipv6_rmap_metric,
12452 bgp_redistribute_ipv6_rmap_metric_cmd,
12453 "redistribute " FRR_IP6_REDIST_STR_BGPD " route-map WORD metric (0-4294967295)",
12454 "Redistribute information from another routing protocol\n"
12455 FRR_IP6_REDIST_HELP_STR_BGPD
12456 "Route map reference\n"
12457 "Pointer to route-map entries\n"
12458 "Metric for redistributed routes\n"
12459 "Default metric\n")
12460 {
12461 VTY_DECLVAR_CONTEXT(bgp, bgp);
12462 int idx_protocol = 1;
12463 int idx_word = 3;
12464 int idx_number = 5;
12465 int type;
12466 uint32_t metric;
12467 struct bgp_redist *red;
12468 bool changed;
12469 struct route_map *route_map =
12470 route_map_lookup_warn_noexist(vty, argv[idx_word]->arg);
12471
12472 type = proto_redistnum(AFI_IP6, argv[idx_protocol]->text);
12473 if (type < 0) {
12474 vty_out(vty, "%% Invalid route type\n");
12475 return CMD_WARNING_CONFIG_FAILED;
12476 }
12477 metric = strtoul(argv[idx_number]->arg, NULL, 10);
12478
12479 red = bgp_redist_add(bgp, AFI_IP6, type, 0);
12480 changed =
12481 bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map);
12482 changed |= bgp_redistribute_metric_set(bgp, red, AFI_IP6, type,
12483 metric);
12484 return bgp_redistribute_set(bgp, AFI_IP6, type, 0, changed);
12485 }
12486
12487 DEFUN (bgp_redistribute_ipv6_metric_rmap,
12488 bgp_redistribute_ipv6_metric_rmap_cmd,
12489 "redistribute " FRR_IP6_REDIST_STR_BGPD " metric (0-4294967295) route-map WORD",
12490 "Redistribute information from another routing protocol\n"
12491 FRR_IP6_REDIST_HELP_STR_BGPD
12492 "Metric for redistributed routes\n"
12493 "Default metric\n"
12494 "Route map reference\n"
12495 "Pointer to route-map entries\n")
12496 {
12497 VTY_DECLVAR_CONTEXT(bgp, bgp);
12498 int idx_protocol = 1;
12499 int idx_number = 3;
12500 int idx_word = 5;
12501 int type;
12502 uint32_t metric;
12503 struct bgp_redist *red;
12504 bool changed;
12505 struct route_map *route_map =
12506 route_map_lookup_warn_noexist(vty, argv[idx_word]->arg);
12507
12508 type = proto_redistnum(AFI_IP6, argv[idx_protocol]->text);
12509 if (type < 0) {
12510 vty_out(vty, "%% Invalid route type\n");
12511 return CMD_WARNING_CONFIG_FAILED;
12512 }
12513 metric = strtoul(argv[idx_number]->arg, NULL, 10);
12514
12515 red = bgp_redist_add(bgp, AFI_IP6, type, 0);
12516 changed = bgp_redistribute_metric_set(bgp, red, AFI_IP6, SAFI_UNICAST,
12517 metric);
12518 changed |=
12519 bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map);
12520 return bgp_redistribute_set(bgp, AFI_IP6, type, 0, changed);
12521 }
12522
12523 DEFUN (no_bgp_redistribute_ipv6,
12524 no_bgp_redistribute_ipv6_cmd,
12525 "no redistribute " FRR_IP6_REDIST_STR_BGPD " [metric (0-4294967295)] [route-map WORD]",
12526 NO_STR
12527 "Redistribute information from another routing protocol\n"
12528 FRR_IP6_REDIST_HELP_STR_BGPD
12529 "Metric for redistributed routes\n"
12530 "Default metric\n"
12531 "Route map reference\n"
12532 "Pointer to route-map entries\n")
12533 {
12534 VTY_DECLVAR_CONTEXT(bgp, bgp);
12535 int idx_protocol = 2;
12536 int type;
12537
12538 type = proto_redistnum(AFI_IP6, argv[idx_protocol]->text);
12539 if (type < 0) {
12540 vty_out(vty, "%% Invalid route type\n");
12541 return CMD_WARNING_CONFIG_FAILED;
12542 }
12543
12544 return bgp_redistribute_unset(bgp, AFI_IP6, type, 0);
12545 }
12546
12547 void bgp_config_write_redistribute(struct vty *vty, struct bgp *bgp, afi_t afi,
12548 safi_t safi)
12549 {
12550 int i;
12551
12552 /* Unicast redistribution only. */
12553 if (safi != SAFI_UNICAST)
12554 return;
12555
12556 for (i = 0; i < ZEBRA_ROUTE_MAX; i++) {
12557 /* Redistribute BGP does not make sense. */
12558 if (i != ZEBRA_ROUTE_BGP) {
12559 struct list *red_list;
12560 struct listnode *node;
12561 struct bgp_redist *red;
12562
12563 red_list = bgp->redist[afi][i];
12564 if (!red_list)
12565 continue;
12566
12567 for (ALL_LIST_ELEMENTS_RO(red_list, node, red)) {
12568 /* "redistribute" configuration. */
12569 vty_out(vty, " redistribute %s",
12570 zebra_route_string(i));
12571 if (red->instance)
12572 vty_out(vty, " %d", red->instance);
12573 if (red->redist_metric_flag)
12574 vty_out(vty, " metric %u",
12575 red->redist_metric);
12576 if (red->rmap.name)
12577 vty_out(vty, " route-map %s",
12578 red->rmap.name);
12579 vty_out(vty, "\n");
12580 }
12581 }
12582 }
12583 }
12584
12585 /* This is part of the address-family block (unicast only) */
12586 void bgp_vpn_policy_config_write_afi(struct vty *vty, struct bgp *bgp,
12587 afi_t afi)
12588 {
12589 int indent = 2;
12590
12591 if (bgp->vpn_policy[afi].rmap_name[BGP_VPN_POLICY_DIR_FROMVPN]) {
12592 if (listcount(bgp->vpn_policy[afi].import_vrf))
12593 vty_out(vty, "%*simport vrf route-map %s\n", indent, "",
12594 bgp->vpn_policy[afi]
12595 .rmap_name[BGP_VPN_POLICY_DIR_FROMVPN]);
12596 else
12597 vty_out(vty, "%*sroute-map vpn import %s\n", indent, "",
12598 bgp->vpn_policy[afi]
12599 .rmap_name[BGP_VPN_POLICY_DIR_FROMVPN]);
12600 }
12601 if (CHECK_FLAG(bgp->af_flags[afi][SAFI_UNICAST],
12602 BGP_CONFIG_VRF_TO_VRF_IMPORT)
12603 || CHECK_FLAG(bgp->af_flags[afi][SAFI_UNICAST],
12604 BGP_CONFIG_VRF_TO_VRF_EXPORT))
12605 return;
12606
12607 if (CHECK_FLAG(bgp->vpn_policy[afi].flags,
12608 BGP_VPN_POLICY_TOVPN_LABEL_AUTO)) {
12609
12610 vty_out(vty, "%*slabel vpn export %s\n", indent, "", "auto");
12611
12612 } else {
12613 if (bgp->vpn_policy[afi].tovpn_label != MPLS_LABEL_NONE) {
12614 vty_out(vty, "%*slabel vpn export %u\n", indent, "",
12615 bgp->vpn_policy[afi].tovpn_label);
12616 }
12617 }
12618 if (CHECK_FLAG(bgp->vpn_policy[afi].flags,
12619 BGP_VPN_POLICY_TOVPN_RD_SET)) {
12620 char buf[RD_ADDRSTRLEN];
12621 vty_out(vty, "%*srd vpn export %s\n", indent, "",
12622 prefix_rd2str(&bgp->vpn_policy[afi].tovpn_rd, buf,
12623 sizeof(buf)));
12624 }
12625 if (CHECK_FLAG(bgp->vpn_policy[afi].flags,
12626 BGP_VPN_POLICY_TOVPN_NEXTHOP_SET)) {
12627
12628 char buf[PREFIX_STRLEN];
12629 if (inet_ntop(bgp->vpn_policy[afi].tovpn_nexthop.family,
12630 &bgp->vpn_policy[afi].tovpn_nexthop.u.prefix, buf,
12631 sizeof(buf))) {
12632
12633 vty_out(vty, "%*snexthop vpn export %s\n",
12634 indent, "", buf);
12635 }
12636 }
12637 if (bgp->vpn_policy[afi].rtlist[BGP_VPN_POLICY_DIR_FROMVPN]
12638 && bgp->vpn_policy[afi].rtlist[BGP_VPN_POLICY_DIR_TOVPN]
12639 && ecommunity_cmp(
12640 bgp->vpn_policy[afi].rtlist[BGP_VPN_POLICY_DIR_FROMVPN],
12641 bgp->vpn_policy[afi].rtlist[BGP_VPN_POLICY_DIR_TOVPN])) {
12642
12643 char *b = ecommunity_ecom2str(
12644 bgp->vpn_policy[afi].rtlist[BGP_VPN_POLICY_DIR_TOVPN],
12645 ECOMMUNITY_FORMAT_ROUTE_MAP, ECOMMUNITY_ROUTE_TARGET);
12646 vty_out(vty, "%*srt vpn both %s\n", indent, "", b);
12647 XFREE(MTYPE_ECOMMUNITY_STR, b);
12648 } else {
12649 if (bgp->vpn_policy[afi].rtlist[BGP_VPN_POLICY_DIR_FROMVPN]) {
12650 char *b = ecommunity_ecom2str(
12651 bgp->vpn_policy[afi]
12652 .rtlist[BGP_VPN_POLICY_DIR_FROMVPN],
12653 ECOMMUNITY_FORMAT_ROUTE_MAP,
12654 ECOMMUNITY_ROUTE_TARGET);
12655 vty_out(vty, "%*srt vpn import %s\n", indent, "", b);
12656 XFREE(MTYPE_ECOMMUNITY_STR, b);
12657 }
12658 if (bgp->vpn_policy[afi].rtlist[BGP_VPN_POLICY_DIR_TOVPN]) {
12659 char *b = ecommunity_ecom2str(
12660 bgp->vpn_policy[afi]
12661 .rtlist[BGP_VPN_POLICY_DIR_TOVPN],
12662 ECOMMUNITY_FORMAT_ROUTE_MAP,
12663 ECOMMUNITY_ROUTE_TARGET);
12664 vty_out(vty, "%*srt vpn export %s\n", indent, "", b);
12665 XFREE(MTYPE_ECOMMUNITY_STR, b);
12666 }
12667 }
12668
12669 if (bgp->vpn_policy[afi].rmap_name[BGP_VPN_POLICY_DIR_TOVPN])
12670 vty_out(vty, "%*sroute-map vpn export %s\n", indent, "",
12671 bgp->vpn_policy[afi]
12672 .rmap_name[BGP_VPN_POLICY_DIR_TOVPN]);
12673
12674 if (bgp->vpn_policy[afi].import_redirect_rtlist) {
12675 char *b = ecommunity_ecom2str(
12676 bgp->vpn_policy[afi]
12677 .import_redirect_rtlist,
12678 ECOMMUNITY_FORMAT_ROUTE_MAP,
12679 ECOMMUNITY_ROUTE_TARGET);
12680
12681 vty_out(vty, "%*srt redirect import %s\n", indent, "", b);
12682 XFREE(MTYPE_ECOMMUNITY_STR, b);
12683 }
12684 }
12685
12686
12687 /* BGP node structure. */
12688 static struct cmd_node bgp_node = {
12689 BGP_NODE, "%s(config-router)# ", 1,
12690 };
12691
12692 static struct cmd_node bgp_ipv4_unicast_node = {
12693 BGP_IPV4_NODE, "%s(config-router-af)# ", 1,
12694 };
12695
12696 static struct cmd_node bgp_ipv4_multicast_node = {
12697 BGP_IPV4M_NODE, "%s(config-router-af)# ", 1,
12698 };
12699
12700 static struct cmd_node bgp_ipv4_labeled_unicast_node = {
12701 BGP_IPV4L_NODE, "%s(config-router-af)# ", 1,
12702 };
12703
12704 static struct cmd_node bgp_ipv6_unicast_node = {
12705 BGP_IPV6_NODE, "%s(config-router-af)# ", 1,
12706 };
12707
12708 static struct cmd_node bgp_ipv6_multicast_node = {
12709 BGP_IPV6M_NODE, "%s(config-router-af)# ", 1,
12710 };
12711
12712 static struct cmd_node bgp_ipv6_labeled_unicast_node = {
12713 BGP_IPV6L_NODE, "%s(config-router-af)# ", 1,
12714 };
12715
12716 static struct cmd_node bgp_vpnv4_node = {BGP_VPNV4_NODE,
12717 "%s(config-router-af)# ", 1};
12718
12719 static struct cmd_node bgp_vpnv6_node = {BGP_VPNV6_NODE,
12720 "%s(config-router-af-vpnv6)# ", 1};
12721
12722 static struct cmd_node bgp_evpn_node = {BGP_EVPN_NODE,
12723 "%s(config-router-evpn)# ", 1};
12724
12725 static struct cmd_node bgp_evpn_vni_node = {BGP_EVPN_VNI_NODE,
12726 "%s(config-router-af-vni)# ", 1};
12727
12728 static struct cmd_node bgp_flowspecv4_node = {BGP_FLOWSPECV4_NODE,
12729 "%s(config-router-af)# ", 1};
12730
12731 static struct cmd_node bgp_flowspecv6_node = {BGP_FLOWSPECV6_NODE,
12732 "%s(config-router-af-vpnv6)# ", 1};
12733
12734 static void community_list_vty(void);
12735
12736 static void bgp_ac_neighbor(vector comps, struct cmd_token *token)
12737 {
12738 struct bgp *bgp;
12739 struct peer *peer;
12740 struct listnode *lnbgp, *lnpeer;
12741
12742 for (ALL_LIST_ELEMENTS_RO(bm->bgp, lnbgp, bgp)) {
12743 for (ALL_LIST_ELEMENTS_RO(bgp->peer, lnpeer, peer)) {
12744 /* only provide suggestions on the appropriate input
12745 * token type,
12746 * they'll otherwise show up multiple times */
12747 enum cmd_token_type match_type;
12748 char *name = peer->host;
12749
12750 if (peer->conf_if) {
12751 match_type = VARIABLE_TKN;
12752 name = peer->conf_if;
12753 } else if (strchr(peer->host, ':'))
12754 match_type = IPV6_TKN;
12755 else
12756 match_type = IPV4_TKN;
12757
12758 if (token->type != match_type)
12759 continue;
12760
12761 vector_set(comps, XSTRDUP(MTYPE_COMPLETION, name));
12762 }
12763 }
12764 }
12765
12766 static const struct cmd_variable_handler bgp_var_neighbor[] = {
12767 {.varname = "neighbor", .completions = bgp_ac_neighbor},
12768 {.varname = "neighbors", .completions = bgp_ac_neighbor},
12769 {.varname = "peer", .completions = bgp_ac_neighbor},
12770 {.completions = NULL}};
12771
12772 static void bgp_ac_peergroup(vector comps, struct cmd_token *token)
12773 {
12774 struct bgp *bgp;
12775 struct peer_group *group;
12776 struct listnode *lnbgp, *lnpeer;
12777
12778 for (ALL_LIST_ELEMENTS_RO(bm->bgp, lnbgp, bgp)) {
12779 for (ALL_LIST_ELEMENTS_RO(bgp->group, lnpeer, group))
12780 vector_set(comps, XSTRDUP(MTYPE_COMPLETION,
12781 group->name));
12782 }
12783 }
12784
12785 static const struct cmd_variable_handler bgp_var_peergroup[] = {
12786 {.tokenname = "PGNAME", .completions = bgp_ac_peergroup},
12787 {.completions = NULL} };
12788
12789 void bgp_vty_init(void)
12790 {
12791 cmd_variable_handler_register(bgp_var_neighbor);
12792 cmd_variable_handler_register(bgp_var_peergroup);
12793
12794 /* Install bgp top node. */
12795 install_node(&bgp_node, bgp_config_write);
12796 install_node(&bgp_ipv4_unicast_node, NULL);
12797 install_node(&bgp_ipv4_multicast_node, NULL);
12798 install_node(&bgp_ipv4_labeled_unicast_node, NULL);
12799 install_node(&bgp_ipv6_unicast_node, NULL);
12800 install_node(&bgp_ipv6_multicast_node, NULL);
12801 install_node(&bgp_ipv6_labeled_unicast_node, NULL);
12802 install_node(&bgp_vpnv4_node, NULL);
12803 install_node(&bgp_vpnv6_node, NULL);
12804 install_node(&bgp_evpn_node, NULL);
12805 install_node(&bgp_evpn_vni_node, NULL);
12806 install_node(&bgp_flowspecv4_node, NULL);
12807 install_node(&bgp_flowspecv6_node, NULL);
12808
12809 /* Install default VTY commands to new nodes. */
12810 install_default(BGP_NODE);
12811 install_default(BGP_IPV4_NODE);
12812 install_default(BGP_IPV4M_NODE);
12813 install_default(BGP_IPV4L_NODE);
12814 install_default(BGP_IPV6_NODE);
12815 install_default(BGP_IPV6M_NODE);
12816 install_default(BGP_IPV6L_NODE);
12817 install_default(BGP_VPNV4_NODE);
12818 install_default(BGP_VPNV6_NODE);
12819 install_default(BGP_FLOWSPECV4_NODE);
12820 install_default(BGP_FLOWSPECV6_NODE);
12821 install_default(BGP_EVPN_NODE);
12822 install_default(BGP_EVPN_VNI_NODE);
12823
12824 /* "bgp local-mac" hidden commands. */
12825 install_element(CONFIG_NODE, &bgp_local_mac_cmd);
12826 install_element(CONFIG_NODE, &no_bgp_local_mac_cmd);
12827
12828 /* bgp route-map delay-timer commands. */
12829 install_element(CONFIG_NODE, &bgp_set_route_map_delay_timer_cmd);
12830 install_element(CONFIG_NODE, &no_bgp_set_route_map_delay_timer_cmd);
12831
12832 /* Dummy commands (Currently not supported) */
12833 install_element(BGP_NODE, &no_synchronization_cmd);
12834 install_element(BGP_NODE, &no_auto_summary_cmd);
12835
12836 /* "router bgp" commands. */
12837 install_element(CONFIG_NODE, &router_bgp_cmd);
12838
12839 /* "no router bgp" commands. */
12840 install_element(CONFIG_NODE, &no_router_bgp_cmd);
12841
12842 /* "bgp router-id" commands. */
12843 install_element(BGP_NODE, &bgp_router_id_cmd);
12844 install_element(BGP_NODE, &no_bgp_router_id_cmd);
12845
12846 /* "bgp cluster-id" commands. */
12847 install_element(BGP_NODE, &bgp_cluster_id_cmd);
12848 install_element(BGP_NODE, &no_bgp_cluster_id_cmd);
12849
12850 /* "bgp confederation" commands. */
12851 install_element(BGP_NODE, &bgp_confederation_identifier_cmd);
12852 install_element(BGP_NODE, &no_bgp_confederation_identifier_cmd);
12853
12854 /* "bgp confederation peers" commands. */
12855 install_element(BGP_NODE, &bgp_confederation_peers_cmd);
12856 install_element(BGP_NODE, &no_bgp_confederation_peers_cmd);
12857
12858 /* bgp max-med command */
12859 install_element(BGP_NODE, &bgp_maxmed_admin_cmd);
12860 install_element(BGP_NODE, &no_bgp_maxmed_admin_cmd);
12861 install_element(BGP_NODE, &bgp_maxmed_admin_medv_cmd);
12862 install_element(BGP_NODE, &bgp_maxmed_onstartup_cmd);
12863 install_element(BGP_NODE, &no_bgp_maxmed_onstartup_cmd);
12864
12865 /* bgp disable-ebgp-connected-nh-check */
12866 install_element(BGP_NODE, &bgp_disable_connected_route_check_cmd);
12867 install_element(BGP_NODE, &no_bgp_disable_connected_route_check_cmd);
12868
12869 /* bgp update-delay command */
12870 install_element(BGP_NODE, &bgp_update_delay_cmd);
12871 install_element(BGP_NODE, &no_bgp_update_delay_cmd);
12872 install_element(BGP_NODE, &bgp_update_delay_establish_wait_cmd);
12873
12874 install_element(BGP_NODE, &bgp_wpkt_quanta_cmd);
12875 install_element(BGP_NODE, &no_bgp_wpkt_quanta_cmd);
12876 install_element(BGP_NODE, &bgp_rpkt_quanta_cmd);
12877 install_element(BGP_NODE, &no_bgp_rpkt_quanta_cmd);
12878
12879 install_element(BGP_NODE, &bgp_coalesce_time_cmd);
12880 install_element(BGP_NODE, &no_bgp_coalesce_time_cmd);
12881
12882 /* "maximum-paths" commands. */
12883 install_element(BGP_NODE, &bgp_maxpaths_hidden_cmd);
12884 install_element(BGP_NODE, &no_bgp_maxpaths_hidden_cmd);
12885 install_element(BGP_IPV4_NODE, &bgp_maxpaths_cmd);
12886 install_element(BGP_IPV4_NODE, &no_bgp_maxpaths_cmd);
12887 install_element(BGP_IPV6_NODE, &bgp_maxpaths_cmd);
12888 install_element(BGP_IPV6_NODE, &no_bgp_maxpaths_cmd);
12889 install_element(BGP_NODE, &bgp_maxpaths_ibgp_hidden_cmd);
12890 install_element(BGP_NODE, &bgp_maxpaths_ibgp_cluster_hidden_cmd);
12891 install_element(BGP_NODE, &no_bgp_maxpaths_ibgp_hidden_cmd);
12892 install_element(BGP_IPV4_NODE, &bgp_maxpaths_ibgp_cmd);
12893 install_element(BGP_IPV4_NODE, &bgp_maxpaths_ibgp_cluster_cmd);
12894 install_element(BGP_IPV4_NODE, &no_bgp_maxpaths_ibgp_cmd);
12895 install_element(BGP_IPV6_NODE, &bgp_maxpaths_ibgp_cmd);
12896 install_element(BGP_IPV6_NODE, &bgp_maxpaths_ibgp_cluster_cmd);
12897 install_element(BGP_IPV6_NODE, &no_bgp_maxpaths_ibgp_cmd);
12898
12899 install_element(BGP_IPV6L_NODE, &bgp_maxpaths_cmd);
12900 install_element(BGP_IPV6L_NODE, &no_bgp_maxpaths_cmd);
12901 install_element(BGP_IPV6L_NODE, &bgp_maxpaths_ibgp_cmd);
12902 install_element(BGP_IPV6L_NODE, &bgp_maxpaths_ibgp_cluster_cmd);
12903 install_element(BGP_IPV6L_NODE, &no_bgp_maxpaths_ibgp_cmd);
12904
12905 /* "timers bgp" commands. */
12906 install_element(BGP_NODE, &bgp_timers_cmd);
12907 install_element(BGP_NODE, &no_bgp_timers_cmd);
12908
12909 /* route-map delay-timer commands - per instance for backwards compat.
12910 */
12911 install_element(BGP_NODE, &bgp_set_route_map_delay_timer_cmd);
12912 install_element(BGP_NODE, &no_bgp_set_route_map_delay_timer_cmd);
12913
12914 /* "bgp client-to-client reflection" commands */
12915 install_element(BGP_NODE, &no_bgp_client_to_client_reflection_cmd);
12916 install_element(BGP_NODE, &bgp_client_to_client_reflection_cmd);
12917
12918 /* "bgp always-compare-med" commands */
12919 install_element(BGP_NODE, &bgp_always_compare_med_cmd);
12920 install_element(BGP_NODE, &no_bgp_always_compare_med_cmd);
12921
12922 /* bgp ebgp-requires-policy */
12923 install_element(BGP_NODE, &bgp_ebgp_requires_policy_cmd);
12924 install_element(BGP_NODE, &no_bgp_ebgp_requires_policy_cmd);
12925
12926 /* "bgp deterministic-med" commands */
12927 install_element(BGP_NODE, &bgp_deterministic_med_cmd);
12928 install_element(BGP_NODE, &no_bgp_deterministic_med_cmd);
12929
12930 /* "bgp graceful-restart" commands */
12931 install_element(BGP_NODE, &bgp_graceful_restart_cmd);
12932 install_element(BGP_NODE, &no_bgp_graceful_restart_cmd);
12933 install_element(BGP_NODE, &bgp_graceful_restart_stalepath_time_cmd);
12934 install_element(BGP_NODE, &no_bgp_graceful_restart_stalepath_time_cmd);
12935 install_element(BGP_NODE, &bgp_graceful_restart_restart_time_cmd);
12936 install_element(BGP_NODE, &no_bgp_graceful_restart_restart_time_cmd);
12937
12938 install_element(BGP_NODE, &bgp_graceful_restart_preserve_fw_cmd);
12939 install_element(BGP_NODE, &no_bgp_graceful_restart_preserve_fw_cmd);
12940
12941 /* "bgp graceful-shutdown" commands */
12942 install_element(BGP_NODE, &bgp_graceful_shutdown_cmd);
12943 install_element(BGP_NODE, &no_bgp_graceful_shutdown_cmd);
12944
12945 /* "bgp fast-external-failover" commands */
12946 install_element(BGP_NODE, &bgp_fast_external_failover_cmd);
12947 install_element(BGP_NODE, &no_bgp_fast_external_failover_cmd);
12948
12949 /* "bgp bestpath compare-routerid" commands */
12950 install_element(BGP_NODE, &bgp_bestpath_compare_router_id_cmd);
12951 install_element(BGP_NODE, &no_bgp_bestpath_compare_router_id_cmd);
12952
12953 /* "bgp bestpath as-path ignore" commands */
12954 install_element(BGP_NODE, &bgp_bestpath_aspath_ignore_cmd);
12955 install_element(BGP_NODE, &no_bgp_bestpath_aspath_ignore_cmd);
12956
12957 /* "bgp bestpath as-path confed" commands */
12958 install_element(BGP_NODE, &bgp_bestpath_aspath_confed_cmd);
12959 install_element(BGP_NODE, &no_bgp_bestpath_aspath_confed_cmd);
12960
12961 /* "bgp bestpath as-path multipath-relax" commands */
12962 install_element(BGP_NODE, &bgp_bestpath_aspath_multipath_relax_cmd);
12963 install_element(BGP_NODE, &no_bgp_bestpath_aspath_multipath_relax_cmd);
12964
12965 /* "bgp log-neighbor-changes" commands */
12966 install_element(BGP_NODE, &bgp_log_neighbor_changes_cmd);
12967 install_element(BGP_NODE, &no_bgp_log_neighbor_changes_cmd);
12968
12969 /* "bgp bestpath med" commands */
12970 install_element(BGP_NODE, &bgp_bestpath_med_cmd);
12971 install_element(BGP_NODE, &no_bgp_bestpath_med_cmd);
12972
12973 /* "no bgp default ipv4-unicast" commands. */
12974 install_element(BGP_NODE, &no_bgp_default_ipv4_unicast_cmd);
12975 install_element(BGP_NODE, &bgp_default_ipv4_unicast_cmd);
12976
12977 /* "bgp network import-check" commands. */
12978 install_element(BGP_NODE, &bgp_network_import_check_cmd);
12979 install_element(BGP_NODE, &bgp_network_import_check_exact_cmd);
12980 install_element(BGP_NODE, &no_bgp_network_import_check_cmd);
12981
12982 /* "bgp default local-preference" commands. */
12983 install_element(BGP_NODE, &bgp_default_local_preference_cmd);
12984 install_element(BGP_NODE, &no_bgp_default_local_preference_cmd);
12985
12986 /* bgp default show-hostname */
12987 install_element(BGP_NODE, &bgp_default_show_hostname_cmd);
12988 install_element(BGP_NODE, &no_bgp_default_show_hostname_cmd);
12989
12990 /* "bgp default subgroup-pkt-queue-max" commands. */
12991 install_element(BGP_NODE, &bgp_default_subgroup_pkt_queue_max_cmd);
12992 install_element(BGP_NODE, &no_bgp_default_subgroup_pkt_queue_max_cmd);
12993
12994 /* bgp ibgp-allow-policy-mods command */
12995 install_element(BGP_NODE, &bgp_rr_allow_outbound_policy_cmd);
12996 install_element(BGP_NODE, &no_bgp_rr_allow_outbound_policy_cmd);
12997
12998 /* "bgp listen limit" commands. */
12999 install_element(BGP_NODE, &bgp_listen_limit_cmd);
13000 install_element(BGP_NODE, &no_bgp_listen_limit_cmd);
13001
13002 /* "bgp listen range" commands. */
13003 install_element(BGP_NODE, &bgp_listen_range_cmd);
13004 install_element(BGP_NODE, &no_bgp_listen_range_cmd);
13005
13006 /* "bgp default shutdown" command */
13007 install_element(BGP_NODE, &bgp_default_shutdown_cmd);
13008
13009 /* "neighbor remote-as" commands. */
13010 install_element(BGP_NODE, &neighbor_remote_as_cmd);
13011 install_element(BGP_NODE, &neighbor_interface_config_cmd);
13012 install_element(BGP_NODE, &neighbor_interface_config_v6only_cmd);
13013 install_element(BGP_NODE, &neighbor_interface_config_remote_as_cmd);
13014 install_element(BGP_NODE,
13015 &neighbor_interface_v6only_config_remote_as_cmd);
13016 install_element(BGP_NODE, &no_neighbor_cmd);
13017 install_element(BGP_NODE, &no_neighbor_interface_config_cmd);
13018
13019 /* "neighbor peer-group" commands. */
13020 install_element(BGP_NODE, &neighbor_peer_group_cmd);
13021 install_element(BGP_NODE, &no_neighbor_peer_group_cmd);
13022 install_element(BGP_NODE,
13023 &no_neighbor_interface_peer_group_remote_as_cmd);
13024
13025 /* "neighbor local-as" commands. */
13026 install_element(BGP_NODE, &neighbor_local_as_cmd);
13027 install_element(BGP_NODE, &neighbor_local_as_no_prepend_cmd);
13028 install_element(BGP_NODE, &neighbor_local_as_no_prepend_replace_as_cmd);
13029 install_element(BGP_NODE, &no_neighbor_local_as_cmd);
13030
13031 /* "neighbor solo" commands. */
13032 install_element(BGP_NODE, &neighbor_solo_cmd);
13033 install_element(BGP_NODE, &no_neighbor_solo_cmd);
13034
13035 /* "neighbor password" commands. */
13036 install_element(BGP_NODE, &neighbor_password_cmd);
13037 install_element(BGP_NODE, &no_neighbor_password_cmd);
13038
13039 /* "neighbor activate" commands. */
13040 install_element(BGP_NODE, &neighbor_activate_hidden_cmd);
13041 install_element(BGP_IPV4_NODE, &neighbor_activate_cmd);
13042 install_element(BGP_IPV4M_NODE, &neighbor_activate_cmd);
13043 install_element(BGP_IPV4L_NODE, &neighbor_activate_cmd);
13044 install_element(BGP_IPV6_NODE, &neighbor_activate_cmd);
13045 install_element(BGP_IPV6M_NODE, &neighbor_activate_cmd);
13046 install_element(BGP_IPV6L_NODE, &neighbor_activate_cmd);
13047 install_element(BGP_VPNV4_NODE, &neighbor_activate_cmd);
13048 install_element(BGP_VPNV6_NODE, &neighbor_activate_cmd);
13049 install_element(BGP_FLOWSPECV4_NODE, &neighbor_activate_cmd);
13050 install_element(BGP_FLOWSPECV6_NODE, &neighbor_activate_cmd);
13051 install_element(BGP_EVPN_NODE, &neighbor_activate_cmd);
13052
13053 /* "no neighbor activate" commands. */
13054 install_element(BGP_NODE, &no_neighbor_activate_hidden_cmd);
13055 install_element(BGP_IPV4_NODE, &no_neighbor_activate_cmd);
13056 install_element(BGP_IPV4M_NODE, &no_neighbor_activate_cmd);
13057 install_element(BGP_IPV4L_NODE, &no_neighbor_activate_cmd);
13058 install_element(BGP_IPV6_NODE, &no_neighbor_activate_cmd);
13059 install_element(BGP_IPV6M_NODE, &no_neighbor_activate_cmd);
13060 install_element(BGP_IPV6L_NODE, &no_neighbor_activate_cmd);
13061 install_element(BGP_VPNV4_NODE, &no_neighbor_activate_cmd);
13062 install_element(BGP_VPNV6_NODE, &no_neighbor_activate_cmd);
13063 install_element(BGP_FLOWSPECV4_NODE, &no_neighbor_activate_cmd);
13064 install_element(BGP_FLOWSPECV6_NODE, &no_neighbor_activate_cmd);
13065 install_element(BGP_EVPN_NODE, &no_neighbor_activate_cmd);
13066
13067 /* "neighbor peer-group" set commands. */
13068 install_element(BGP_NODE, &neighbor_set_peer_group_cmd);
13069 install_element(BGP_IPV4_NODE, &neighbor_set_peer_group_hidden_cmd);
13070 install_element(BGP_IPV4M_NODE, &neighbor_set_peer_group_hidden_cmd);
13071 install_element(BGP_IPV6_NODE, &neighbor_set_peer_group_hidden_cmd);
13072 install_element(BGP_IPV6M_NODE, &neighbor_set_peer_group_hidden_cmd);
13073 install_element(BGP_IPV6L_NODE, &neighbor_set_peer_group_hidden_cmd);
13074 install_element(BGP_VPNV4_NODE, &neighbor_set_peer_group_hidden_cmd);
13075 install_element(BGP_VPNV6_NODE, &neighbor_set_peer_group_hidden_cmd);
13076 install_element(BGP_FLOWSPECV4_NODE,
13077 &neighbor_set_peer_group_hidden_cmd);
13078 install_element(BGP_FLOWSPECV6_NODE,
13079 &neighbor_set_peer_group_hidden_cmd);
13080
13081 /* "no neighbor peer-group unset" commands. */
13082 install_element(BGP_NODE, &no_neighbor_set_peer_group_cmd);
13083 install_element(BGP_IPV4_NODE, &no_neighbor_set_peer_group_hidden_cmd);
13084 install_element(BGP_IPV4M_NODE, &no_neighbor_set_peer_group_hidden_cmd);
13085 install_element(BGP_IPV6_NODE, &no_neighbor_set_peer_group_hidden_cmd);
13086 install_element(BGP_IPV6M_NODE, &no_neighbor_set_peer_group_hidden_cmd);
13087 install_element(BGP_IPV6L_NODE, &no_neighbor_set_peer_group_hidden_cmd);
13088 install_element(BGP_VPNV4_NODE, &no_neighbor_set_peer_group_hidden_cmd);
13089 install_element(BGP_VPNV6_NODE, &no_neighbor_set_peer_group_hidden_cmd);
13090 install_element(BGP_FLOWSPECV4_NODE,
13091 &no_neighbor_set_peer_group_hidden_cmd);
13092 install_element(BGP_FLOWSPECV6_NODE,
13093 &no_neighbor_set_peer_group_hidden_cmd);
13094
13095 /* "neighbor softreconfiguration inbound" commands.*/
13096 install_element(BGP_NODE, &neighbor_soft_reconfiguration_hidden_cmd);
13097 install_element(BGP_NODE, &no_neighbor_soft_reconfiguration_hidden_cmd);
13098 install_element(BGP_IPV4_NODE, &neighbor_soft_reconfiguration_cmd);
13099 install_element(BGP_IPV4_NODE, &no_neighbor_soft_reconfiguration_cmd);
13100 install_element(BGP_IPV4L_NODE, &neighbor_soft_reconfiguration_cmd);
13101 install_element(BGP_IPV4L_NODE, &no_neighbor_soft_reconfiguration_cmd);
13102 install_element(BGP_IPV4M_NODE, &neighbor_soft_reconfiguration_cmd);
13103 install_element(BGP_IPV4M_NODE, &no_neighbor_soft_reconfiguration_cmd);
13104 install_element(BGP_IPV6_NODE, &neighbor_soft_reconfiguration_cmd);
13105 install_element(BGP_IPV6_NODE, &no_neighbor_soft_reconfiguration_cmd);
13106 install_element(BGP_IPV6M_NODE, &neighbor_soft_reconfiguration_cmd);
13107 install_element(BGP_IPV6M_NODE, &no_neighbor_soft_reconfiguration_cmd);
13108 install_element(BGP_IPV6L_NODE, &neighbor_soft_reconfiguration_cmd);
13109 install_element(BGP_IPV6L_NODE, &no_neighbor_soft_reconfiguration_cmd);
13110 install_element(BGP_VPNV4_NODE, &neighbor_soft_reconfiguration_cmd);
13111 install_element(BGP_VPNV4_NODE, &no_neighbor_soft_reconfiguration_cmd);
13112 install_element(BGP_VPNV6_NODE, &neighbor_soft_reconfiguration_cmd);
13113 install_element(BGP_VPNV6_NODE, &no_neighbor_soft_reconfiguration_cmd);
13114 install_element(BGP_FLOWSPECV4_NODE,
13115 &neighbor_soft_reconfiguration_cmd);
13116 install_element(BGP_FLOWSPECV4_NODE,
13117 &no_neighbor_soft_reconfiguration_cmd);
13118 install_element(BGP_FLOWSPECV6_NODE,
13119 &neighbor_soft_reconfiguration_cmd);
13120 install_element(BGP_FLOWSPECV6_NODE,
13121 &no_neighbor_soft_reconfiguration_cmd);
13122 install_element(BGP_EVPN_NODE, &neighbor_soft_reconfiguration_cmd);
13123 install_element(BGP_EVPN_NODE, &no_neighbor_soft_reconfiguration_cmd);
13124
13125 /* "neighbor attribute-unchanged" commands. */
13126 install_element(BGP_NODE, &neighbor_attr_unchanged_hidden_cmd);
13127 install_element(BGP_NODE, &no_neighbor_attr_unchanged_hidden_cmd);
13128 install_element(BGP_IPV4_NODE, &neighbor_attr_unchanged_cmd);
13129 install_element(BGP_IPV4_NODE, &no_neighbor_attr_unchanged_cmd);
13130 install_element(BGP_IPV4M_NODE, &neighbor_attr_unchanged_cmd);
13131 install_element(BGP_IPV4M_NODE, &no_neighbor_attr_unchanged_cmd);
13132 install_element(BGP_IPV4L_NODE, &neighbor_attr_unchanged_cmd);
13133 install_element(BGP_IPV4L_NODE, &no_neighbor_attr_unchanged_cmd);
13134 install_element(BGP_IPV6_NODE, &neighbor_attr_unchanged_cmd);
13135 install_element(BGP_IPV6_NODE, &no_neighbor_attr_unchanged_cmd);
13136 install_element(BGP_IPV6M_NODE, &neighbor_attr_unchanged_cmd);
13137 install_element(BGP_IPV6M_NODE, &no_neighbor_attr_unchanged_cmd);
13138 install_element(BGP_IPV6L_NODE, &neighbor_attr_unchanged_cmd);
13139 install_element(BGP_IPV6L_NODE, &no_neighbor_attr_unchanged_cmd);
13140 install_element(BGP_VPNV4_NODE, &neighbor_attr_unchanged_cmd);
13141 install_element(BGP_VPNV4_NODE, &no_neighbor_attr_unchanged_cmd);
13142 install_element(BGP_VPNV6_NODE, &neighbor_attr_unchanged_cmd);
13143 install_element(BGP_VPNV6_NODE, &no_neighbor_attr_unchanged_cmd);
13144
13145 install_element(BGP_EVPN_NODE, &neighbor_attr_unchanged_cmd);
13146 install_element(BGP_EVPN_NODE, &no_neighbor_attr_unchanged_cmd);
13147
13148 /* "nexthop-local unchanged" commands */
13149 install_element(BGP_IPV6_NODE, &neighbor_nexthop_local_unchanged_cmd);
13150 install_element(BGP_IPV6_NODE,
13151 &no_neighbor_nexthop_local_unchanged_cmd);
13152
13153 /* "neighbor next-hop-self" commands. */
13154 install_element(BGP_NODE, &neighbor_nexthop_self_hidden_cmd);
13155 install_element(BGP_NODE, &no_neighbor_nexthop_self_hidden_cmd);
13156 install_element(BGP_IPV4_NODE, &neighbor_nexthop_self_cmd);
13157 install_element(BGP_IPV4_NODE, &no_neighbor_nexthop_self_cmd);
13158 install_element(BGP_IPV4M_NODE, &neighbor_nexthop_self_cmd);
13159 install_element(BGP_IPV4M_NODE, &no_neighbor_nexthop_self_cmd);
13160 install_element(BGP_IPV4L_NODE, &neighbor_nexthop_self_cmd);
13161 install_element(BGP_IPV4L_NODE, &no_neighbor_nexthop_self_cmd);
13162 install_element(BGP_IPV6_NODE, &neighbor_nexthop_self_cmd);
13163 install_element(BGP_IPV6_NODE, &no_neighbor_nexthop_self_cmd);
13164 install_element(BGP_IPV6M_NODE, &neighbor_nexthop_self_cmd);
13165 install_element(BGP_IPV6M_NODE, &no_neighbor_nexthop_self_cmd);
13166 install_element(BGP_IPV6L_NODE, &neighbor_nexthop_self_cmd);
13167 install_element(BGP_IPV6L_NODE, &no_neighbor_nexthop_self_cmd);
13168 install_element(BGP_VPNV4_NODE, &neighbor_nexthop_self_cmd);
13169 install_element(BGP_VPNV4_NODE, &no_neighbor_nexthop_self_cmd);
13170 install_element(BGP_VPNV6_NODE, &neighbor_nexthop_self_cmd);
13171 install_element(BGP_VPNV6_NODE, &no_neighbor_nexthop_self_cmd);
13172 install_element(BGP_EVPN_NODE, &neighbor_nexthop_self_cmd);
13173 install_element(BGP_EVPN_NODE, &no_neighbor_nexthop_self_cmd);
13174
13175 /* "neighbor next-hop-self force" commands. */
13176 install_element(BGP_NODE, &neighbor_nexthop_self_force_hidden_cmd);
13177 install_element(BGP_NODE, &no_neighbor_nexthop_self_force_hidden_cmd);
13178 install_element(BGP_NODE, &neighbor_nexthop_self_all_hidden_cmd);
13179 install_element(BGP_NODE, &no_neighbor_nexthop_self_all_hidden_cmd);
13180 install_element(BGP_IPV4_NODE, &neighbor_nexthop_self_force_cmd);
13181 install_element(BGP_IPV4_NODE, &no_neighbor_nexthop_self_force_cmd);
13182 install_element(BGP_IPV4M_NODE, &neighbor_nexthop_self_force_cmd);
13183 install_element(BGP_IPV4M_NODE, &no_neighbor_nexthop_self_force_cmd);
13184 install_element(BGP_IPV4L_NODE, &neighbor_nexthop_self_force_cmd);
13185 install_element(BGP_IPV4L_NODE, &no_neighbor_nexthop_self_force_cmd);
13186 install_element(BGP_IPV6_NODE, &neighbor_nexthop_self_force_cmd);
13187 install_element(BGP_IPV6_NODE, &no_neighbor_nexthop_self_force_cmd);
13188 install_element(BGP_IPV6M_NODE, &neighbor_nexthop_self_force_cmd);
13189 install_element(BGP_IPV6M_NODE, &no_neighbor_nexthop_self_force_cmd);
13190 install_element(BGP_IPV6L_NODE, &neighbor_nexthop_self_force_cmd);
13191 install_element(BGP_IPV6L_NODE, &no_neighbor_nexthop_self_force_cmd);
13192 install_element(BGP_VPNV4_NODE, &neighbor_nexthop_self_force_cmd);
13193 install_element(BGP_VPNV4_NODE, &no_neighbor_nexthop_self_force_cmd);
13194 install_element(BGP_VPNV6_NODE, &neighbor_nexthop_self_force_cmd);
13195 install_element(BGP_VPNV6_NODE, &no_neighbor_nexthop_self_force_cmd);
13196
13197 /* "neighbor as-override" commands. */
13198 install_element(BGP_NODE, &neighbor_as_override_hidden_cmd);
13199 install_element(BGP_NODE, &no_neighbor_as_override_hidden_cmd);
13200 install_element(BGP_IPV4_NODE, &neighbor_as_override_cmd);
13201 install_element(BGP_IPV4_NODE, &no_neighbor_as_override_cmd);
13202 install_element(BGP_IPV4M_NODE, &neighbor_as_override_cmd);
13203 install_element(BGP_IPV4M_NODE, &no_neighbor_as_override_cmd);
13204 install_element(BGP_IPV4L_NODE, &neighbor_as_override_cmd);
13205 install_element(BGP_IPV4L_NODE, &no_neighbor_as_override_cmd);
13206 install_element(BGP_IPV6_NODE, &neighbor_as_override_cmd);
13207 install_element(BGP_IPV6_NODE, &no_neighbor_as_override_cmd);
13208 install_element(BGP_IPV6M_NODE, &neighbor_as_override_cmd);
13209 install_element(BGP_IPV6M_NODE, &no_neighbor_as_override_cmd);
13210 install_element(BGP_IPV6L_NODE, &neighbor_as_override_cmd);
13211 install_element(BGP_IPV6L_NODE, &no_neighbor_as_override_cmd);
13212 install_element(BGP_VPNV4_NODE, &neighbor_as_override_cmd);
13213 install_element(BGP_VPNV4_NODE, &no_neighbor_as_override_cmd);
13214 install_element(BGP_VPNV6_NODE, &neighbor_as_override_cmd);
13215 install_element(BGP_VPNV6_NODE, &no_neighbor_as_override_cmd);
13216
13217 /* "neighbor remove-private-AS" commands. */
13218 install_element(BGP_NODE, &neighbor_remove_private_as_hidden_cmd);
13219 install_element(BGP_NODE, &no_neighbor_remove_private_as_hidden_cmd);
13220 install_element(BGP_NODE, &neighbor_remove_private_as_all_hidden_cmd);
13221 install_element(BGP_NODE,
13222 &no_neighbor_remove_private_as_all_hidden_cmd);
13223 install_element(BGP_NODE,
13224 &neighbor_remove_private_as_replace_as_hidden_cmd);
13225 install_element(BGP_NODE,
13226 &no_neighbor_remove_private_as_replace_as_hidden_cmd);
13227 install_element(BGP_NODE,
13228 &neighbor_remove_private_as_all_replace_as_hidden_cmd);
13229 install_element(
13230 BGP_NODE,
13231 &no_neighbor_remove_private_as_all_replace_as_hidden_cmd);
13232 install_element(BGP_IPV4_NODE, &neighbor_remove_private_as_cmd);
13233 install_element(BGP_IPV4_NODE, &no_neighbor_remove_private_as_cmd);
13234 install_element(BGP_IPV4_NODE, &neighbor_remove_private_as_all_cmd);
13235 install_element(BGP_IPV4_NODE, &no_neighbor_remove_private_as_all_cmd);
13236 install_element(BGP_IPV4_NODE,
13237 &neighbor_remove_private_as_replace_as_cmd);
13238 install_element(BGP_IPV4_NODE,
13239 &no_neighbor_remove_private_as_replace_as_cmd);
13240 install_element(BGP_IPV4_NODE,
13241 &neighbor_remove_private_as_all_replace_as_cmd);
13242 install_element(BGP_IPV4_NODE,
13243 &no_neighbor_remove_private_as_all_replace_as_cmd);
13244 install_element(BGP_IPV4M_NODE, &neighbor_remove_private_as_cmd);
13245 install_element(BGP_IPV4M_NODE, &no_neighbor_remove_private_as_cmd);
13246 install_element(BGP_IPV4M_NODE, &neighbor_remove_private_as_all_cmd);
13247 install_element(BGP_IPV4M_NODE, &no_neighbor_remove_private_as_all_cmd);
13248 install_element(BGP_IPV4M_NODE,
13249 &neighbor_remove_private_as_replace_as_cmd);
13250 install_element(BGP_IPV4M_NODE,
13251 &no_neighbor_remove_private_as_replace_as_cmd);
13252 install_element(BGP_IPV4M_NODE,
13253 &neighbor_remove_private_as_all_replace_as_cmd);
13254 install_element(BGP_IPV4M_NODE,
13255 &no_neighbor_remove_private_as_all_replace_as_cmd);
13256 install_element(BGP_IPV4L_NODE, &neighbor_remove_private_as_cmd);
13257 install_element(BGP_IPV4L_NODE, &no_neighbor_remove_private_as_cmd);
13258 install_element(BGP_IPV4L_NODE, &neighbor_remove_private_as_all_cmd);
13259 install_element(BGP_IPV4L_NODE, &no_neighbor_remove_private_as_all_cmd);
13260 install_element(BGP_IPV4L_NODE,
13261 &neighbor_remove_private_as_replace_as_cmd);
13262 install_element(BGP_IPV4L_NODE,
13263 &no_neighbor_remove_private_as_replace_as_cmd);
13264 install_element(BGP_IPV4L_NODE,
13265 &neighbor_remove_private_as_all_replace_as_cmd);
13266 install_element(BGP_IPV4L_NODE,
13267 &no_neighbor_remove_private_as_all_replace_as_cmd);
13268 install_element(BGP_IPV6_NODE, &neighbor_remove_private_as_cmd);
13269 install_element(BGP_IPV6_NODE, &no_neighbor_remove_private_as_cmd);
13270 install_element(BGP_IPV6_NODE, &neighbor_remove_private_as_all_cmd);
13271 install_element(BGP_IPV6_NODE, &no_neighbor_remove_private_as_all_cmd);
13272 install_element(BGP_IPV6_NODE,
13273 &neighbor_remove_private_as_replace_as_cmd);
13274 install_element(BGP_IPV6_NODE,
13275 &no_neighbor_remove_private_as_replace_as_cmd);
13276 install_element(BGP_IPV6_NODE,
13277 &neighbor_remove_private_as_all_replace_as_cmd);
13278 install_element(BGP_IPV6_NODE,
13279 &no_neighbor_remove_private_as_all_replace_as_cmd);
13280 install_element(BGP_IPV6M_NODE, &neighbor_remove_private_as_cmd);
13281 install_element(BGP_IPV6M_NODE, &no_neighbor_remove_private_as_cmd);
13282 install_element(BGP_IPV6M_NODE, &neighbor_remove_private_as_all_cmd);
13283 install_element(BGP_IPV6M_NODE, &no_neighbor_remove_private_as_all_cmd);
13284 install_element(BGP_IPV6M_NODE,
13285 &neighbor_remove_private_as_replace_as_cmd);
13286 install_element(BGP_IPV6M_NODE,
13287 &no_neighbor_remove_private_as_replace_as_cmd);
13288 install_element(BGP_IPV6M_NODE,
13289 &neighbor_remove_private_as_all_replace_as_cmd);
13290 install_element(BGP_IPV6M_NODE,
13291 &no_neighbor_remove_private_as_all_replace_as_cmd);
13292 install_element(BGP_IPV6L_NODE, &neighbor_remove_private_as_cmd);
13293 install_element(BGP_IPV6L_NODE, &no_neighbor_remove_private_as_cmd);
13294 install_element(BGP_IPV6L_NODE, &neighbor_remove_private_as_all_cmd);
13295 install_element(BGP_IPV6L_NODE, &no_neighbor_remove_private_as_all_cmd);
13296 install_element(BGP_IPV6L_NODE,
13297 &neighbor_remove_private_as_replace_as_cmd);
13298 install_element(BGP_IPV6L_NODE,
13299 &no_neighbor_remove_private_as_replace_as_cmd);
13300 install_element(BGP_IPV6L_NODE,
13301 &neighbor_remove_private_as_all_replace_as_cmd);
13302 install_element(BGP_IPV6L_NODE,
13303 &no_neighbor_remove_private_as_all_replace_as_cmd);
13304 install_element(BGP_VPNV4_NODE, &neighbor_remove_private_as_cmd);
13305 install_element(BGP_VPNV4_NODE, &no_neighbor_remove_private_as_cmd);
13306 install_element(BGP_VPNV4_NODE, &neighbor_remove_private_as_all_cmd);
13307 install_element(BGP_VPNV4_NODE, &no_neighbor_remove_private_as_all_cmd);
13308 install_element(BGP_VPNV4_NODE,
13309 &neighbor_remove_private_as_replace_as_cmd);
13310 install_element(BGP_VPNV4_NODE,
13311 &no_neighbor_remove_private_as_replace_as_cmd);
13312 install_element(BGP_VPNV4_NODE,
13313 &neighbor_remove_private_as_all_replace_as_cmd);
13314 install_element(BGP_VPNV4_NODE,
13315 &no_neighbor_remove_private_as_all_replace_as_cmd);
13316 install_element(BGP_VPNV6_NODE, &neighbor_remove_private_as_cmd);
13317 install_element(BGP_VPNV6_NODE, &no_neighbor_remove_private_as_cmd);
13318 install_element(BGP_VPNV6_NODE, &neighbor_remove_private_as_all_cmd);
13319 install_element(BGP_VPNV6_NODE, &no_neighbor_remove_private_as_all_cmd);
13320 install_element(BGP_VPNV6_NODE,
13321 &neighbor_remove_private_as_replace_as_cmd);
13322 install_element(BGP_VPNV6_NODE,
13323 &no_neighbor_remove_private_as_replace_as_cmd);
13324 install_element(BGP_VPNV6_NODE,
13325 &neighbor_remove_private_as_all_replace_as_cmd);
13326 install_element(BGP_VPNV6_NODE,
13327 &no_neighbor_remove_private_as_all_replace_as_cmd);
13328
13329 /* "neighbor send-community" commands.*/
13330 install_element(BGP_NODE, &neighbor_send_community_hidden_cmd);
13331 install_element(BGP_NODE, &neighbor_send_community_type_hidden_cmd);
13332 install_element(BGP_NODE, &no_neighbor_send_community_hidden_cmd);
13333 install_element(BGP_NODE, &no_neighbor_send_community_type_hidden_cmd);
13334 install_element(BGP_IPV4_NODE, &neighbor_send_community_cmd);
13335 install_element(BGP_IPV4_NODE, &neighbor_send_community_type_cmd);
13336 install_element(BGP_IPV4_NODE, &no_neighbor_send_community_cmd);
13337 install_element(BGP_IPV4_NODE, &no_neighbor_send_community_type_cmd);
13338 install_element(BGP_IPV4M_NODE, &neighbor_send_community_cmd);
13339 install_element(BGP_IPV4M_NODE, &neighbor_send_community_type_cmd);
13340 install_element(BGP_IPV4M_NODE, &no_neighbor_send_community_cmd);
13341 install_element(BGP_IPV4M_NODE, &no_neighbor_send_community_type_cmd);
13342 install_element(BGP_IPV4L_NODE, &neighbor_send_community_cmd);
13343 install_element(BGP_IPV4L_NODE, &neighbor_send_community_type_cmd);
13344 install_element(BGP_IPV4L_NODE, &no_neighbor_send_community_cmd);
13345 install_element(BGP_IPV4L_NODE, &no_neighbor_send_community_type_cmd);
13346 install_element(BGP_IPV6_NODE, &neighbor_send_community_cmd);
13347 install_element(BGP_IPV6_NODE, &neighbor_send_community_type_cmd);
13348 install_element(BGP_IPV6_NODE, &no_neighbor_send_community_cmd);
13349 install_element(BGP_IPV6_NODE, &no_neighbor_send_community_type_cmd);
13350 install_element(BGP_IPV6M_NODE, &neighbor_send_community_cmd);
13351 install_element(BGP_IPV6M_NODE, &neighbor_send_community_type_cmd);
13352 install_element(BGP_IPV6M_NODE, &no_neighbor_send_community_cmd);
13353 install_element(BGP_IPV6M_NODE, &no_neighbor_send_community_type_cmd);
13354 install_element(BGP_IPV6L_NODE, &neighbor_send_community_cmd);
13355 install_element(BGP_IPV6L_NODE, &neighbor_send_community_type_cmd);
13356 install_element(BGP_IPV6L_NODE, &no_neighbor_send_community_cmd);
13357 install_element(BGP_IPV6L_NODE, &no_neighbor_send_community_type_cmd);
13358 install_element(BGP_VPNV4_NODE, &neighbor_send_community_cmd);
13359 install_element(BGP_VPNV4_NODE, &neighbor_send_community_type_cmd);
13360 install_element(BGP_VPNV4_NODE, &no_neighbor_send_community_cmd);
13361 install_element(BGP_VPNV4_NODE, &no_neighbor_send_community_type_cmd);
13362 install_element(BGP_VPNV6_NODE, &neighbor_send_community_cmd);
13363 install_element(BGP_VPNV6_NODE, &neighbor_send_community_type_cmd);
13364 install_element(BGP_VPNV6_NODE, &no_neighbor_send_community_cmd);
13365 install_element(BGP_VPNV6_NODE, &no_neighbor_send_community_type_cmd);
13366
13367 /* "neighbor route-reflector" commands.*/
13368 install_element(BGP_NODE, &neighbor_route_reflector_client_hidden_cmd);
13369 install_element(BGP_NODE,
13370 &no_neighbor_route_reflector_client_hidden_cmd);
13371 install_element(BGP_IPV4_NODE, &neighbor_route_reflector_client_cmd);
13372 install_element(BGP_IPV4_NODE, &no_neighbor_route_reflector_client_cmd);
13373 install_element(BGP_IPV4M_NODE, &neighbor_route_reflector_client_cmd);
13374 install_element(BGP_IPV4M_NODE,
13375 &no_neighbor_route_reflector_client_cmd);
13376 install_element(BGP_IPV4L_NODE, &neighbor_route_reflector_client_cmd);
13377 install_element(BGP_IPV4L_NODE,
13378 &no_neighbor_route_reflector_client_cmd);
13379 install_element(BGP_IPV6_NODE, &neighbor_route_reflector_client_cmd);
13380 install_element(BGP_IPV6_NODE, &no_neighbor_route_reflector_client_cmd);
13381 install_element(BGP_IPV6M_NODE, &neighbor_route_reflector_client_cmd);
13382 install_element(BGP_IPV6M_NODE,
13383 &no_neighbor_route_reflector_client_cmd);
13384 install_element(BGP_IPV6L_NODE, &neighbor_route_reflector_client_cmd);
13385 install_element(BGP_IPV6L_NODE,
13386 &no_neighbor_route_reflector_client_cmd);
13387 install_element(BGP_VPNV4_NODE, &neighbor_route_reflector_client_cmd);
13388 install_element(BGP_VPNV4_NODE,
13389 &no_neighbor_route_reflector_client_cmd);
13390 install_element(BGP_VPNV6_NODE, &neighbor_route_reflector_client_cmd);
13391 install_element(BGP_VPNV6_NODE,
13392 &no_neighbor_route_reflector_client_cmd);
13393 install_element(BGP_FLOWSPECV4_NODE,
13394 &neighbor_route_reflector_client_cmd);
13395 install_element(BGP_FLOWSPECV4_NODE,
13396 &no_neighbor_route_reflector_client_cmd);
13397 install_element(BGP_FLOWSPECV6_NODE,
13398 &neighbor_route_reflector_client_cmd);
13399 install_element(BGP_FLOWSPECV6_NODE,
13400 &no_neighbor_route_reflector_client_cmd);
13401 install_element(BGP_EVPN_NODE, &neighbor_route_reflector_client_cmd);
13402 install_element(BGP_EVPN_NODE, &no_neighbor_route_reflector_client_cmd);
13403
13404 /* "neighbor route-server" commands.*/
13405 install_element(BGP_NODE, &neighbor_route_server_client_hidden_cmd);
13406 install_element(BGP_NODE, &no_neighbor_route_server_client_hidden_cmd);
13407 install_element(BGP_IPV4_NODE, &neighbor_route_server_client_cmd);
13408 install_element(BGP_IPV4_NODE, &no_neighbor_route_server_client_cmd);
13409 install_element(BGP_IPV4M_NODE, &neighbor_route_server_client_cmd);
13410 install_element(BGP_IPV4M_NODE, &no_neighbor_route_server_client_cmd);
13411 install_element(BGP_IPV4L_NODE, &neighbor_route_server_client_cmd);
13412 install_element(BGP_IPV4L_NODE, &no_neighbor_route_server_client_cmd);
13413 install_element(BGP_IPV6_NODE, &neighbor_route_server_client_cmd);
13414 install_element(BGP_IPV6_NODE, &no_neighbor_route_server_client_cmd);
13415 install_element(BGP_IPV6M_NODE, &neighbor_route_server_client_cmd);
13416 install_element(BGP_IPV6M_NODE, &no_neighbor_route_server_client_cmd);
13417 install_element(BGP_IPV6L_NODE, &neighbor_route_server_client_cmd);
13418 install_element(BGP_IPV6L_NODE, &no_neighbor_route_server_client_cmd);
13419 install_element(BGP_VPNV4_NODE, &neighbor_route_server_client_cmd);
13420 install_element(BGP_VPNV4_NODE, &no_neighbor_route_server_client_cmd);
13421 install_element(BGP_VPNV6_NODE, &neighbor_route_server_client_cmd);
13422 install_element(BGP_VPNV6_NODE, &no_neighbor_route_server_client_cmd);
13423 install_element(BGP_EVPN_NODE, &neighbor_route_server_client_cmd);
13424 install_element(BGP_EVPN_NODE, &no_neighbor_route_server_client_cmd);
13425 install_element(BGP_FLOWSPECV4_NODE, &neighbor_route_server_client_cmd);
13426 install_element(BGP_FLOWSPECV4_NODE,
13427 &no_neighbor_route_server_client_cmd);
13428 install_element(BGP_FLOWSPECV6_NODE, &neighbor_route_server_client_cmd);
13429 install_element(BGP_FLOWSPECV6_NODE,
13430 &no_neighbor_route_server_client_cmd);
13431
13432 /* "neighbor addpath-tx-all-paths" commands.*/
13433 install_element(BGP_NODE, &neighbor_addpath_tx_all_paths_hidden_cmd);
13434 install_element(BGP_NODE, &no_neighbor_addpath_tx_all_paths_hidden_cmd);
13435 install_element(BGP_IPV4_NODE, &neighbor_addpath_tx_all_paths_cmd);
13436 install_element(BGP_IPV4_NODE, &no_neighbor_addpath_tx_all_paths_cmd);
13437 install_element(BGP_IPV4M_NODE, &neighbor_addpath_tx_all_paths_cmd);
13438 install_element(BGP_IPV4M_NODE, &no_neighbor_addpath_tx_all_paths_cmd);
13439 install_element(BGP_IPV4L_NODE, &neighbor_addpath_tx_all_paths_cmd);
13440 install_element(BGP_IPV4L_NODE, &no_neighbor_addpath_tx_all_paths_cmd);
13441 install_element(BGP_IPV6_NODE, &neighbor_addpath_tx_all_paths_cmd);
13442 install_element(BGP_IPV6_NODE, &no_neighbor_addpath_tx_all_paths_cmd);
13443 install_element(BGP_IPV6M_NODE, &neighbor_addpath_tx_all_paths_cmd);
13444 install_element(BGP_IPV6M_NODE, &no_neighbor_addpath_tx_all_paths_cmd);
13445 install_element(BGP_IPV6L_NODE, &neighbor_addpath_tx_all_paths_cmd);
13446 install_element(BGP_IPV6L_NODE, &no_neighbor_addpath_tx_all_paths_cmd);
13447 install_element(BGP_VPNV4_NODE, &neighbor_addpath_tx_all_paths_cmd);
13448 install_element(BGP_VPNV4_NODE, &no_neighbor_addpath_tx_all_paths_cmd);
13449 install_element(BGP_VPNV6_NODE, &neighbor_addpath_tx_all_paths_cmd);
13450 install_element(BGP_VPNV6_NODE, &no_neighbor_addpath_tx_all_paths_cmd);
13451
13452 /* "neighbor addpath-tx-bestpath-per-AS" commands.*/
13453 install_element(BGP_NODE,
13454 &neighbor_addpath_tx_bestpath_per_as_hidden_cmd);
13455 install_element(BGP_NODE,
13456 &no_neighbor_addpath_tx_bestpath_per_as_hidden_cmd);
13457 install_element(BGP_IPV4_NODE,
13458 &neighbor_addpath_tx_bestpath_per_as_cmd);
13459 install_element(BGP_IPV4_NODE,
13460 &no_neighbor_addpath_tx_bestpath_per_as_cmd);
13461 install_element(BGP_IPV4M_NODE,
13462 &neighbor_addpath_tx_bestpath_per_as_cmd);
13463 install_element(BGP_IPV4M_NODE,
13464 &no_neighbor_addpath_tx_bestpath_per_as_cmd);
13465 install_element(BGP_IPV4L_NODE,
13466 &neighbor_addpath_tx_bestpath_per_as_cmd);
13467 install_element(BGP_IPV4L_NODE,
13468 &no_neighbor_addpath_tx_bestpath_per_as_cmd);
13469 install_element(BGP_IPV6_NODE,
13470 &neighbor_addpath_tx_bestpath_per_as_cmd);
13471 install_element(BGP_IPV6_NODE,
13472 &no_neighbor_addpath_tx_bestpath_per_as_cmd);
13473 install_element(BGP_IPV6M_NODE,
13474 &neighbor_addpath_tx_bestpath_per_as_cmd);
13475 install_element(BGP_IPV6M_NODE,
13476 &no_neighbor_addpath_tx_bestpath_per_as_cmd);
13477 install_element(BGP_IPV6L_NODE,
13478 &neighbor_addpath_tx_bestpath_per_as_cmd);
13479 install_element(BGP_IPV6L_NODE,
13480 &no_neighbor_addpath_tx_bestpath_per_as_cmd);
13481 install_element(BGP_VPNV4_NODE,
13482 &neighbor_addpath_tx_bestpath_per_as_cmd);
13483 install_element(BGP_VPNV4_NODE,
13484 &no_neighbor_addpath_tx_bestpath_per_as_cmd);
13485 install_element(BGP_VPNV6_NODE,
13486 &neighbor_addpath_tx_bestpath_per_as_cmd);
13487 install_element(BGP_VPNV6_NODE,
13488 &no_neighbor_addpath_tx_bestpath_per_as_cmd);
13489
13490 /* "neighbor passive" commands. */
13491 install_element(BGP_NODE, &neighbor_passive_cmd);
13492 install_element(BGP_NODE, &no_neighbor_passive_cmd);
13493
13494
13495 /* "neighbor shutdown" commands. */
13496 install_element(BGP_NODE, &neighbor_shutdown_cmd);
13497 install_element(BGP_NODE, &no_neighbor_shutdown_cmd);
13498 install_element(BGP_NODE, &neighbor_shutdown_msg_cmd);
13499 install_element(BGP_NODE, &no_neighbor_shutdown_msg_cmd);
13500
13501 /* "neighbor capability extended-nexthop" commands.*/
13502 install_element(BGP_NODE, &neighbor_capability_enhe_cmd);
13503 install_element(BGP_NODE, &no_neighbor_capability_enhe_cmd);
13504
13505 /* "neighbor capability orf prefix-list" commands.*/
13506 install_element(BGP_NODE, &neighbor_capability_orf_prefix_hidden_cmd);
13507 install_element(BGP_NODE,
13508 &no_neighbor_capability_orf_prefix_hidden_cmd);
13509 install_element(BGP_IPV4_NODE, &neighbor_capability_orf_prefix_cmd);
13510 install_element(BGP_IPV4_NODE, &no_neighbor_capability_orf_prefix_cmd);
13511 install_element(BGP_IPV4M_NODE, &neighbor_capability_orf_prefix_cmd);
13512 install_element(BGP_IPV4M_NODE, &no_neighbor_capability_orf_prefix_cmd);
13513 install_element(BGP_IPV4L_NODE, &neighbor_capability_orf_prefix_cmd);
13514 install_element(BGP_IPV4L_NODE, &no_neighbor_capability_orf_prefix_cmd);
13515 install_element(BGP_IPV6_NODE, &neighbor_capability_orf_prefix_cmd);
13516 install_element(BGP_IPV6_NODE, &no_neighbor_capability_orf_prefix_cmd);
13517 install_element(BGP_IPV6M_NODE, &neighbor_capability_orf_prefix_cmd);
13518 install_element(BGP_IPV6M_NODE, &no_neighbor_capability_orf_prefix_cmd);
13519 install_element(BGP_IPV6L_NODE, &neighbor_capability_orf_prefix_cmd);
13520 install_element(BGP_IPV6L_NODE, &no_neighbor_capability_orf_prefix_cmd);
13521
13522 /* "neighbor capability dynamic" commands.*/
13523 install_element(BGP_NODE, &neighbor_capability_dynamic_cmd);
13524 install_element(BGP_NODE, &no_neighbor_capability_dynamic_cmd);
13525
13526 /* "neighbor dont-capability-negotiate" commands. */
13527 install_element(BGP_NODE, &neighbor_dont_capability_negotiate_cmd);
13528 install_element(BGP_NODE, &no_neighbor_dont_capability_negotiate_cmd);
13529
13530 /* "neighbor ebgp-multihop" commands. */
13531 install_element(BGP_NODE, &neighbor_ebgp_multihop_cmd);
13532 install_element(BGP_NODE, &neighbor_ebgp_multihop_ttl_cmd);
13533 install_element(BGP_NODE, &no_neighbor_ebgp_multihop_cmd);
13534
13535 /* "neighbor disable-connected-check" commands. */
13536 install_element(BGP_NODE, &neighbor_disable_connected_check_cmd);
13537 install_element(BGP_NODE, &no_neighbor_disable_connected_check_cmd);
13538
13539 /* "neighbor enforce-first-as" commands. */
13540 install_element(BGP_NODE, &neighbor_enforce_first_as_cmd);
13541 install_element(BGP_NODE, &no_neighbor_enforce_first_as_cmd);
13542
13543 /* "neighbor description" commands. */
13544 install_element(BGP_NODE, &neighbor_description_cmd);
13545 install_element(BGP_NODE, &no_neighbor_description_cmd);
13546 install_element(BGP_NODE, &no_neighbor_description_comment_cmd);
13547
13548 /* "neighbor update-source" commands. "*/
13549 install_element(BGP_NODE, &neighbor_update_source_cmd);
13550 install_element(BGP_NODE, &no_neighbor_update_source_cmd);
13551
13552 /* "neighbor default-originate" commands. */
13553 install_element(BGP_NODE, &neighbor_default_originate_hidden_cmd);
13554 install_element(BGP_NODE, &neighbor_default_originate_rmap_hidden_cmd);
13555 install_element(BGP_NODE, &no_neighbor_default_originate_hidden_cmd);
13556 install_element(BGP_IPV4_NODE, &neighbor_default_originate_cmd);
13557 install_element(BGP_IPV4_NODE, &neighbor_default_originate_rmap_cmd);
13558 install_element(BGP_IPV4_NODE, &no_neighbor_default_originate_cmd);
13559 install_element(BGP_IPV4M_NODE, &neighbor_default_originate_cmd);
13560 install_element(BGP_IPV4M_NODE, &neighbor_default_originate_rmap_cmd);
13561 install_element(BGP_IPV4M_NODE, &no_neighbor_default_originate_cmd);
13562 install_element(BGP_IPV4L_NODE, &neighbor_default_originate_cmd);
13563 install_element(BGP_IPV4L_NODE, &neighbor_default_originate_rmap_cmd);
13564 install_element(BGP_IPV4L_NODE, &no_neighbor_default_originate_cmd);
13565 install_element(BGP_IPV6_NODE, &neighbor_default_originate_cmd);
13566 install_element(BGP_IPV6_NODE, &neighbor_default_originate_rmap_cmd);
13567 install_element(BGP_IPV6_NODE, &no_neighbor_default_originate_cmd);
13568 install_element(BGP_IPV6M_NODE, &neighbor_default_originate_cmd);
13569 install_element(BGP_IPV6M_NODE, &neighbor_default_originate_rmap_cmd);
13570 install_element(BGP_IPV6M_NODE, &no_neighbor_default_originate_cmd);
13571 install_element(BGP_IPV6L_NODE, &neighbor_default_originate_cmd);
13572 install_element(BGP_IPV6L_NODE, &neighbor_default_originate_rmap_cmd);
13573 install_element(BGP_IPV6L_NODE, &no_neighbor_default_originate_cmd);
13574
13575 /* "neighbor port" commands. */
13576 install_element(BGP_NODE, &neighbor_port_cmd);
13577 install_element(BGP_NODE, &no_neighbor_port_cmd);
13578
13579 /* "neighbor weight" commands. */
13580 install_element(BGP_NODE, &neighbor_weight_hidden_cmd);
13581 install_element(BGP_NODE, &no_neighbor_weight_hidden_cmd);
13582
13583 install_element(BGP_IPV4_NODE, &neighbor_weight_cmd);
13584 install_element(BGP_IPV4_NODE, &no_neighbor_weight_cmd);
13585 install_element(BGP_IPV4M_NODE, &neighbor_weight_cmd);
13586 install_element(BGP_IPV4M_NODE, &no_neighbor_weight_cmd);
13587 install_element(BGP_IPV4L_NODE, &neighbor_weight_cmd);
13588 install_element(BGP_IPV4L_NODE, &no_neighbor_weight_cmd);
13589 install_element(BGP_IPV6_NODE, &neighbor_weight_cmd);
13590 install_element(BGP_IPV6_NODE, &no_neighbor_weight_cmd);
13591 install_element(BGP_IPV6M_NODE, &neighbor_weight_cmd);
13592 install_element(BGP_IPV6M_NODE, &no_neighbor_weight_cmd);
13593 install_element(BGP_IPV6L_NODE, &neighbor_weight_cmd);
13594 install_element(BGP_IPV6L_NODE, &no_neighbor_weight_cmd);
13595 install_element(BGP_VPNV4_NODE, &neighbor_weight_cmd);
13596 install_element(BGP_VPNV4_NODE, &no_neighbor_weight_cmd);
13597 install_element(BGP_VPNV6_NODE, &neighbor_weight_cmd);
13598 install_element(BGP_VPNV6_NODE, &no_neighbor_weight_cmd);
13599
13600 /* "neighbor override-capability" commands. */
13601 install_element(BGP_NODE, &neighbor_override_capability_cmd);
13602 install_element(BGP_NODE, &no_neighbor_override_capability_cmd);
13603
13604 /* "neighbor strict-capability-match" commands. */
13605 install_element(BGP_NODE, &neighbor_strict_capability_cmd);
13606 install_element(BGP_NODE, &no_neighbor_strict_capability_cmd);
13607
13608 /* "neighbor timers" commands. */
13609 install_element(BGP_NODE, &neighbor_timers_cmd);
13610 install_element(BGP_NODE, &no_neighbor_timers_cmd);
13611
13612 /* "neighbor timers connect" commands. */
13613 install_element(BGP_NODE, &neighbor_timers_connect_cmd);
13614 install_element(BGP_NODE, &no_neighbor_timers_connect_cmd);
13615
13616 /* "neighbor advertisement-interval" commands. */
13617 install_element(BGP_NODE, &neighbor_advertise_interval_cmd);
13618 install_element(BGP_NODE, &no_neighbor_advertise_interval_cmd);
13619
13620 /* "neighbor interface" commands. */
13621 install_element(BGP_NODE, &neighbor_interface_cmd);
13622 install_element(BGP_NODE, &no_neighbor_interface_cmd);
13623
13624 /* "neighbor distribute" commands. */
13625 install_element(BGP_NODE, &neighbor_distribute_list_hidden_cmd);
13626 install_element(BGP_NODE, &no_neighbor_distribute_list_hidden_cmd);
13627 install_element(BGP_IPV4_NODE, &neighbor_distribute_list_cmd);
13628 install_element(BGP_IPV4_NODE, &no_neighbor_distribute_list_cmd);
13629 install_element(BGP_IPV4M_NODE, &neighbor_distribute_list_cmd);
13630 install_element(BGP_IPV4M_NODE, &no_neighbor_distribute_list_cmd);
13631 install_element(BGP_IPV4L_NODE, &neighbor_distribute_list_cmd);
13632 install_element(BGP_IPV4L_NODE, &no_neighbor_distribute_list_cmd);
13633 install_element(BGP_IPV6_NODE, &neighbor_distribute_list_cmd);
13634 install_element(BGP_IPV6_NODE, &no_neighbor_distribute_list_cmd);
13635 install_element(BGP_IPV6M_NODE, &neighbor_distribute_list_cmd);
13636 install_element(BGP_IPV6M_NODE, &no_neighbor_distribute_list_cmd);
13637 install_element(BGP_IPV6L_NODE, &neighbor_distribute_list_cmd);
13638 install_element(BGP_IPV6L_NODE, &no_neighbor_distribute_list_cmd);
13639 install_element(BGP_VPNV4_NODE, &neighbor_distribute_list_cmd);
13640 install_element(BGP_VPNV4_NODE, &no_neighbor_distribute_list_cmd);
13641 install_element(BGP_VPNV6_NODE, &neighbor_distribute_list_cmd);
13642 install_element(BGP_VPNV6_NODE, &no_neighbor_distribute_list_cmd);
13643
13644 /* "neighbor prefix-list" commands. */
13645 install_element(BGP_NODE, &neighbor_prefix_list_hidden_cmd);
13646 install_element(BGP_NODE, &no_neighbor_prefix_list_hidden_cmd);
13647 install_element(BGP_IPV4_NODE, &neighbor_prefix_list_cmd);
13648 install_element(BGP_IPV4_NODE, &no_neighbor_prefix_list_cmd);
13649 install_element(BGP_IPV4M_NODE, &neighbor_prefix_list_cmd);
13650 install_element(BGP_IPV4M_NODE, &no_neighbor_prefix_list_cmd);
13651 install_element(BGP_IPV4L_NODE, &neighbor_prefix_list_cmd);
13652 install_element(BGP_IPV4L_NODE, &no_neighbor_prefix_list_cmd);
13653 install_element(BGP_IPV6_NODE, &neighbor_prefix_list_cmd);
13654 install_element(BGP_IPV6_NODE, &no_neighbor_prefix_list_cmd);
13655 install_element(BGP_IPV6M_NODE, &neighbor_prefix_list_cmd);
13656 install_element(BGP_IPV6M_NODE, &no_neighbor_prefix_list_cmd);
13657 install_element(BGP_IPV6L_NODE, &neighbor_prefix_list_cmd);
13658 install_element(BGP_IPV6L_NODE, &no_neighbor_prefix_list_cmd);
13659 install_element(BGP_VPNV4_NODE, &neighbor_prefix_list_cmd);
13660 install_element(BGP_VPNV4_NODE, &no_neighbor_prefix_list_cmd);
13661 install_element(BGP_VPNV6_NODE, &neighbor_prefix_list_cmd);
13662 install_element(BGP_VPNV6_NODE, &no_neighbor_prefix_list_cmd);
13663 install_element(BGP_FLOWSPECV4_NODE, &neighbor_prefix_list_cmd);
13664 install_element(BGP_FLOWSPECV4_NODE, &no_neighbor_prefix_list_cmd);
13665 install_element(BGP_FLOWSPECV6_NODE, &neighbor_prefix_list_cmd);
13666 install_element(BGP_FLOWSPECV6_NODE, &no_neighbor_prefix_list_cmd);
13667
13668 /* "neighbor filter-list" commands. */
13669 install_element(BGP_NODE, &neighbor_filter_list_hidden_cmd);
13670 install_element(BGP_NODE, &no_neighbor_filter_list_hidden_cmd);
13671 install_element(BGP_IPV4_NODE, &neighbor_filter_list_cmd);
13672 install_element(BGP_IPV4_NODE, &no_neighbor_filter_list_cmd);
13673 install_element(BGP_IPV4M_NODE, &neighbor_filter_list_cmd);
13674 install_element(BGP_IPV4M_NODE, &no_neighbor_filter_list_cmd);
13675 install_element(BGP_IPV4L_NODE, &neighbor_filter_list_cmd);
13676 install_element(BGP_IPV4L_NODE, &no_neighbor_filter_list_cmd);
13677 install_element(BGP_IPV6_NODE, &neighbor_filter_list_cmd);
13678 install_element(BGP_IPV6_NODE, &no_neighbor_filter_list_cmd);
13679 install_element(BGP_IPV6M_NODE, &neighbor_filter_list_cmd);
13680 install_element(BGP_IPV6M_NODE, &no_neighbor_filter_list_cmd);
13681 install_element(BGP_IPV6L_NODE, &neighbor_filter_list_cmd);
13682 install_element(BGP_IPV6L_NODE, &no_neighbor_filter_list_cmd);
13683 install_element(BGP_VPNV4_NODE, &neighbor_filter_list_cmd);
13684 install_element(BGP_VPNV4_NODE, &no_neighbor_filter_list_cmd);
13685 install_element(BGP_VPNV6_NODE, &neighbor_filter_list_cmd);
13686 install_element(BGP_VPNV6_NODE, &no_neighbor_filter_list_cmd);
13687 install_element(BGP_FLOWSPECV4_NODE, &neighbor_filter_list_cmd);
13688 install_element(BGP_FLOWSPECV4_NODE, &no_neighbor_filter_list_cmd);
13689 install_element(BGP_FLOWSPECV6_NODE, &neighbor_filter_list_cmd);
13690 install_element(BGP_FLOWSPECV6_NODE, &no_neighbor_filter_list_cmd);
13691
13692 /* "neighbor route-map" commands. */
13693 install_element(BGP_NODE, &neighbor_route_map_hidden_cmd);
13694 install_element(BGP_NODE, &no_neighbor_route_map_hidden_cmd);
13695 install_element(BGP_IPV4_NODE, &neighbor_route_map_cmd);
13696 install_element(BGP_IPV4_NODE, &no_neighbor_route_map_cmd);
13697 install_element(BGP_IPV4M_NODE, &neighbor_route_map_cmd);
13698 install_element(BGP_IPV4M_NODE, &no_neighbor_route_map_cmd);
13699 install_element(BGP_IPV4L_NODE, &neighbor_route_map_cmd);
13700 install_element(BGP_IPV4L_NODE, &no_neighbor_route_map_cmd);
13701 install_element(BGP_IPV6_NODE, &neighbor_route_map_cmd);
13702 install_element(BGP_IPV6_NODE, &no_neighbor_route_map_cmd);
13703 install_element(BGP_IPV6M_NODE, &neighbor_route_map_cmd);
13704 install_element(BGP_IPV6M_NODE, &no_neighbor_route_map_cmd);
13705 install_element(BGP_IPV6L_NODE, &neighbor_route_map_cmd);
13706 install_element(BGP_IPV6L_NODE, &no_neighbor_route_map_cmd);
13707 install_element(BGP_VPNV4_NODE, &neighbor_route_map_cmd);
13708 install_element(BGP_VPNV4_NODE, &no_neighbor_route_map_cmd);
13709 install_element(BGP_VPNV6_NODE, &neighbor_route_map_cmd);
13710 install_element(BGP_VPNV6_NODE, &no_neighbor_route_map_cmd);
13711 install_element(BGP_FLOWSPECV4_NODE, &neighbor_route_map_cmd);
13712 install_element(BGP_FLOWSPECV4_NODE, &no_neighbor_route_map_cmd);
13713 install_element(BGP_FLOWSPECV6_NODE, &neighbor_route_map_cmd);
13714 install_element(BGP_FLOWSPECV6_NODE, &no_neighbor_route_map_cmd);
13715 install_element(BGP_EVPN_NODE, &neighbor_route_map_cmd);
13716 install_element(BGP_EVPN_NODE, &no_neighbor_route_map_cmd);
13717
13718 /* "neighbor unsuppress-map" commands. */
13719 install_element(BGP_NODE, &neighbor_unsuppress_map_hidden_cmd);
13720 install_element(BGP_NODE, &no_neighbor_unsuppress_map_hidden_cmd);
13721 install_element(BGP_IPV4_NODE, &neighbor_unsuppress_map_cmd);
13722 install_element(BGP_IPV4_NODE, &no_neighbor_unsuppress_map_cmd);
13723 install_element(BGP_IPV4M_NODE, &neighbor_unsuppress_map_cmd);
13724 install_element(BGP_IPV4M_NODE, &no_neighbor_unsuppress_map_cmd);
13725 install_element(BGP_IPV4L_NODE, &neighbor_unsuppress_map_cmd);
13726 install_element(BGP_IPV4L_NODE, &no_neighbor_unsuppress_map_cmd);
13727 install_element(BGP_IPV6_NODE, &neighbor_unsuppress_map_cmd);
13728 install_element(BGP_IPV6_NODE, &no_neighbor_unsuppress_map_cmd);
13729 install_element(BGP_IPV6M_NODE, &neighbor_unsuppress_map_cmd);
13730 install_element(BGP_IPV6M_NODE, &no_neighbor_unsuppress_map_cmd);
13731 install_element(BGP_IPV6L_NODE, &neighbor_unsuppress_map_cmd);
13732 install_element(BGP_IPV6L_NODE, &no_neighbor_unsuppress_map_cmd);
13733 install_element(BGP_VPNV4_NODE, &neighbor_unsuppress_map_cmd);
13734 install_element(BGP_VPNV4_NODE, &no_neighbor_unsuppress_map_cmd);
13735 install_element(BGP_VPNV6_NODE, &neighbor_unsuppress_map_cmd);
13736 install_element(BGP_VPNV6_NODE, &no_neighbor_unsuppress_map_cmd);
13737
13738 /* "neighbor maximum-prefix" commands. */
13739 install_element(BGP_NODE, &neighbor_maximum_prefix_hidden_cmd);
13740 install_element(BGP_NODE,
13741 &neighbor_maximum_prefix_threshold_hidden_cmd);
13742 install_element(BGP_NODE, &neighbor_maximum_prefix_warning_hidden_cmd);
13743 install_element(BGP_NODE,
13744 &neighbor_maximum_prefix_threshold_warning_hidden_cmd);
13745 install_element(BGP_NODE, &neighbor_maximum_prefix_restart_hidden_cmd);
13746 install_element(BGP_NODE,
13747 &neighbor_maximum_prefix_threshold_restart_hidden_cmd);
13748 install_element(BGP_NODE, &no_neighbor_maximum_prefix_hidden_cmd);
13749 install_element(BGP_IPV4_NODE, &neighbor_maximum_prefix_cmd);
13750 install_element(BGP_IPV4_NODE, &neighbor_maximum_prefix_threshold_cmd);
13751 install_element(BGP_IPV4_NODE, &neighbor_maximum_prefix_warning_cmd);
13752 install_element(BGP_IPV4_NODE,
13753 &neighbor_maximum_prefix_threshold_warning_cmd);
13754 install_element(BGP_IPV4_NODE, &neighbor_maximum_prefix_restart_cmd);
13755 install_element(BGP_IPV4_NODE,
13756 &neighbor_maximum_prefix_threshold_restart_cmd);
13757 install_element(BGP_IPV4_NODE, &no_neighbor_maximum_prefix_cmd);
13758 install_element(BGP_IPV4M_NODE, &neighbor_maximum_prefix_cmd);
13759 install_element(BGP_IPV4M_NODE, &neighbor_maximum_prefix_threshold_cmd);
13760 install_element(BGP_IPV4M_NODE, &neighbor_maximum_prefix_warning_cmd);
13761 install_element(BGP_IPV4M_NODE,
13762 &neighbor_maximum_prefix_threshold_warning_cmd);
13763 install_element(BGP_IPV4M_NODE, &neighbor_maximum_prefix_restart_cmd);
13764 install_element(BGP_IPV4M_NODE,
13765 &neighbor_maximum_prefix_threshold_restart_cmd);
13766 install_element(BGP_IPV4M_NODE, &no_neighbor_maximum_prefix_cmd);
13767 install_element(BGP_IPV4L_NODE, &neighbor_maximum_prefix_cmd);
13768 install_element(BGP_IPV4L_NODE, &neighbor_maximum_prefix_threshold_cmd);
13769 install_element(BGP_IPV4L_NODE, &neighbor_maximum_prefix_warning_cmd);
13770 install_element(BGP_IPV4L_NODE,
13771 &neighbor_maximum_prefix_threshold_warning_cmd);
13772 install_element(BGP_IPV4L_NODE, &neighbor_maximum_prefix_restart_cmd);
13773 install_element(BGP_IPV4L_NODE,
13774 &neighbor_maximum_prefix_threshold_restart_cmd);
13775 install_element(BGP_IPV4L_NODE, &no_neighbor_maximum_prefix_cmd);
13776 install_element(BGP_IPV6_NODE, &neighbor_maximum_prefix_cmd);
13777 install_element(BGP_IPV6_NODE, &neighbor_maximum_prefix_threshold_cmd);
13778 install_element(BGP_IPV6_NODE, &neighbor_maximum_prefix_warning_cmd);
13779 install_element(BGP_IPV6_NODE,
13780 &neighbor_maximum_prefix_threshold_warning_cmd);
13781 install_element(BGP_IPV6_NODE, &neighbor_maximum_prefix_restart_cmd);
13782 install_element(BGP_IPV6_NODE,
13783 &neighbor_maximum_prefix_threshold_restart_cmd);
13784 install_element(BGP_IPV6_NODE, &no_neighbor_maximum_prefix_cmd);
13785 install_element(BGP_IPV6M_NODE, &neighbor_maximum_prefix_cmd);
13786 install_element(BGP_IPV6M_NODE, &neighbor_maximum_prefix_threshold_cmd);
13787 install_element(BGP_IPV6M_NODE, &neighbor_maximum_prefix_warning_cmd);
13788 install_element(BGP_IPV6M_NODE,
13789 &neighbor_maximum_prefix_threshold_warning_cmd);
13790 install_element(BGP_IPV6M_NODE, &neighbor_maximum_prefix_restart_cmd);
13791 install_element(BGP_IPV6M_NODE,
13792 &neighbor_maximum_prefix_threshold_restart_cmd);
13793 install_element(BGP_IPV6M_NODE, &no_neighbor_maximum_prefix_cmd);
13794 install_element(BGP_IPV6L_NODE, &neighbor_maximum_prefix_cmd);
13795 install_element(BGP_IPV6L_NODE, &neighbor_maximum_prefix_threshold_cmd);
13796 install_element(BGP_IPV6L_NODE, &neighbor_maximum_prefix_warning_cmd);
13797 install_element(BGP_IPV6L_NODE,
13798 &neighbor_maximum_prefix_threshold_warning_cmd);
13799 install_element(BGP_IPV6L_NODE, &neighbor_maximum_prefix_restart_cmd);
13800 install_element(BGP_IPV6L_NODE,
13801 &neighbor_maximum_prefix_threshold_restart_cmd);
13802 install_element(BGP_IPV6L_NODE, &no_neighbor_maximum_prefix_cmd);
13803 install_element(BGP_VPNV4_NODE, &neighbor_maximum_prefix_cmd);
13804 install_element(BGP_VPNV4_NODE, &neighbor_maximum_prefix_threshold_cmd);
13805 install_element(BGP_VPNV4_NODE, &neighbor_maximum_prefix_warning_cmd);
13806 install_element(BGP_VPNV4_NODE,
13807 &neighbor_maximum_prefix_threshold_warning_cmd);
13808 install_element(BGP_VPNV4_NODE, &neighbor_maximum_prefix_restart_cmd);
13809 install_element(BGP_VPNV4_NODE,
13810 &neighbor_maximum_prefix_threshold_restart_cmd);
13811 install_element(BGP_VPNV4_NODE, &no_neighbor_maximum_prefix_cmd);
13812 install_element(BGP_VPNV6_NODE, &neighbor_maximum_prefix_cmd);
13813 install_element(BGP_VPNV6_NODE, &neighbor_maximum_prefix_threshold_cmd);
13814 install_element(BGP_VPNV6_NODE, &neighbor_maximum_prefix_warning_cmd);
13815 install_element(BGP_VPNV6_NODE,
13816 &neighbor_maximum_prefix_threshold_warning_cmd);
13817 install_element(BGP_VPNV6_NODE, &neighbor_maximum_prefix_restart_cmd);
13818 install_element(BGP_VPNV6_NODE,
13819 &neighbor_maximum_prefix_threshold_restart_cmd);
13820 install_element(BGP_VPNV6_NODE, &no_neighbor_maximum_prefix_cmd);
13821
13822 /* "neighbor allowas-in" */
13823 install_element(BGP_NODE, &neighbor_allowas_in_hidden_cmd);
13824 install_element(BGP_NODE, &no_neighbor_allowas_in_hidden_cmd);
13825 install_element(BGP_IPV4_NODE, &neighbor_allowas_in_cmd);
13826 install_element(BGP_IPV4_NODE, &no_neighbor_allowas_in_cmd);
13827 install_element(BGP_IPV4M_NODE, &neighbor_allowas_in_cmd);
13828 install_element(BGP_IPV4M_NODE, &no_neighbor_allowas_in_cmd);
13829 install_element(BGP_IPV4L_NODE, &neighbor_allowas_in_cmd);
13830 install_element(BGP_IPV4L_NODE, &no_neighbor_allowas_in_cmd);
13831 install_element(BGP_IPV6_NODE, &neighbor_allowas_in_cmd);
13832 install_element(BGP_IPV6_NODE, &no_neighbor_allowas_in_cmd);
13833 install_element(BGP_IPV6M_NODE, &neighbor_allowas_in_cmd);
13834 install_element(BGP_IPV6M_NODE, &no_neighbor_allowas_in_cmd);
13835 install_element(BGP_IPV6L_NODE, &neighbor_allowas_in_cmd);
13836 install_element(BGP_IPV6L_NODE, &no_neighbor_allowas_in_cmd);
13837 install_element(BGP_VPNV4_NODE, &neighbor_allowas_in_cmd);
13838 install_element(BGP_VPNV4_NODE, &no_neighbor_allowas_in_cmd);
13839 install_element(BGP_VPNV6_NODE, &neighbor_allowas_in_cmd);
13840 install_element(BGP_VPNV6_NODE, &no_neighbor_allowas_in_cmd);
13841 install_element(BGP_EVPN_NODE, &neighbor_allowas_in_cmd);
13842 install_element(BGP_EVPN_NODE, &no_neighbor_allowas_in_cmd);
13843
13844 /* address-family commands. */
13845 install_element(BGP_NODE, &address_family_ipv4_safi_cmd);
13846 install_element(BGP_NODE, &address_family_ipv6_safi_cmd);
13847 #ifdef KEEP_OLD_VPN_COMMANDS
13848 install_element(BGP_NODE, &address_family_vpnv4_cmd);
13849 install_element(BGP_NODE, &address_family_vpnv6_cmd);
13850 #endif /* KEEP_OLD_VPN_COMMANDS */
13851
13852 install_element(BGP_NODE, &address_family_evpn_cmd);
13853
13854 /* "exit-address-family" command. */
13855 install_element(BGP_IPV4_NODE, &exit_address_family_cmd);
13856 install_element(BGP_IPV4M_NODE, &exit_address_family_cmd);
13857 install_element(BGP_IPV4L_NODE, &exit_address_family_cmd);
13858 install_element(BGP_IPV6_NODE, &exit_address_family_cmd);
13859 install_element(BGP_IPV6M_NODE, &exit_address_family_cmd);
13860 install_element(BGP_IPV6L_NODE, &exit_address_family_cmd);
13861 install_element(BGP_VPNV4_NODE, &exit_address_family_cmd);
13862 install_element(BGP_VPNV6_NODE, &exit_address_family_cmd);
13863 install_element(BGP_FLOWSPECV4_NODE, &exit_address_family_cmd);
13864 install_element(BGP_FLOWSPECV6_NODE, &exit_address_family_cmd);
13865 install_element(BGP_EVPN_NODE, &exit_address_family_cmd);
13866
13867 /* "clear ip bgp commands" */
13868 install_element(ENABLE_NODE, &clear_ip_bgp_all_cmd);
13869
13870 /* clear ip bgp prefix */
13871 install_element(ENABLE_NODE, &clear_ip_bgp_prefix_cmd);
13872 install_element(ENABLE_NODE, &clear_bgp_ipv6_safi_prefix_cmd);
13873 install_element(ENABLE_NODE, &clear_bgp_instance_ipv6_safi_prefix_cmd);
13874
13875 /* "show [ip] bgp summary" commands. */
13876 install_element(VIEW_NODE, &show_bgp_instance_all_ipv6_updgrps_cmd);
13877 install_element(VIEW_NODE, &show_bgp_l2vpn_evpn_updgrps_cmd);
13878 install_element(VIEW_NODE, &show_bgp_instance_updgrps_stats_cmd);
13879 install_element(VIEW_NODE, &show_bgp_updgrps_stats_cmd);
13880 install_element(VIEW_NODE, &show_ip_bgp_instance_updgrps_adj_s_cmd);
13881 install_element(VIEW_NODE, &show_ip_bgp_summary_cmd);
13882 install_element(VIEW_NODE, &show_ip_bgp_updgrps_cmd);
13883
13884 /* "show [ip] bgp neighbors" commands. */
13885 install_element(VIEW_NODE, &show_ip_bgp_neighbors_cmd);
13886
13887 /* "show [ip] bgp peer-group" commands. */
13888 install_element(VIEW_NODE, &show_ip_bgp_peer_groups_cmd);
13889
13890 /* "show [ip] bgp paths" commands. */
13891 install_element(VIEW_NODE, &show_ip_bgp_paths_cmd);
13892
13893 /* "show [ip] bgp community" commands. */
13894 install_element(VIEW_NODE, &show_ip_bgp_community_info_cmd);
13895
13896 /* "show ip bgp large-community" commands. */
13897 install_element(VIEW_NODE, &show_ip_bgp_lcommunity_info_cmd);
13898 /* "show [ip] bgp attribute-info" commands. */
13899 install_element(VIEW_NODE, &show_ip_bgp_attr_info_cmd);
13900 /* "show [ip] bgp route-leak" command */
13901 install_element(VIEW_NODE, &show_ip_bgp_route_leak_cmd);
13902
13903 /* "redistribute" commands. */
13904 install_element(BGP_NODE, &bgp_redistribute_ipv4_hidden_cmd);
13905 install_element(BGP_NODE, &no_bgp_redistribute_ipv4_hidden_cmd);
13906 install_element(BGP_NODE, &bgp_redistribute_ipv4_rmap_hidden_cmd);
13907 install_element(BGP_NODE, &bgp_redistribute_ipv4_metric_hidden_cmd);
13908 install_element(BGP_NODE,
13909 &bgp_redistribute_ipv4_rmap_metric_hidden_cmd);
13910 install_element(BGP_NODE,
13911 &bgp_redistribute_ipv4_metric_rmap_hidden_cmd);
13912 install_element(BGP_NODE, &bgp_redistribute_ipv4_ospf_hidden_cmd);
13913 install_element(BGP_NODE, &no_bgp_redistribute_ipv4_ospf_hidden_cmd);
13914 install_element(BGP_NODE, &bgp_redistribute_ipv4_ospf_rmap_hidden_cmd);
13915 install_element(BGP_NODE,
13916 &bgp_redistribute_ipv4_ospf_metric_hidden_cmd);
13917 install_element(BGP_NODE,
13918 &bgp_redistribute_ipv4_ospf_rmap_metric_hidden_cmd);
13919 install_element(BGP_NODE,
13920 &bgp_redistribute_ipv4_ospf_metric_rmap_hidden_cmd);
13921 install_element(BGP_IPV4_NODE, &bgp_redistribute_ipv4_cmd);
13922 install_element(BGP_IPV4_NODE, &no_bgp_redistribute_ipv4_cmd);
13923 install_element(BGP_IPV4_NODE, &bgp_redistribute_ipv4_rmap_cmd);
13924 install_element(BGP_IPV4_NODE, &bgp_redistribute_ipv4_metric_cmd);
13925 install_element(BGP_IPV4_NODE, &bgp_redistribute_ipv4_rmap_metric_cmd);
13926 install_element(BGP_IPV4_NODE, &bgp_redistribute_ipv4_metric_rmap_cmd);
13927 install_element(BGP_IPV4_NODE, &bgp_redistribute_ipv4_ospf_cmd);
13928 install_element(BGP_IPV4_NODE, &no_bgp_redistribute_ipv4_ospf_cmd);
13929 install_element(BGP_IPV4_NODE, &bgp_redistribute_ipv4_ospf_rmap_cmd);
13930 install_element(BGP_IPV4_NODE, &bgp_redistribute_ipv4_ospf_metric_cmd);
13931 install_element(BGP_IPV4_NODE,
13932 &bgp_redistribute_ipv4_ospf_rmap_metric_cmd);
13933 install_element(BGP_IPV4_NODE,
13934 &bgp_redistribute_ipv4_ospf_metric_rmap_cmd);
13935 install_element(BGP_IPV6_NODE, &bgp_redistribute_ipv6_cmd);
13936 install_element(BGP_IPV6_NODE, &no_bgp_redistribute_ipv6_cmd);
13937 install_element(BGP_IPV6_NODE, &bgp_redistribute_ipv6_rmap_cmd);
13938 install_element(BGP_IPV6_NODE, &bgp_redistribute_ipv6_metric_cmd);
13939 install_element(BGP_IPV6_NODE, &bgp_redistribute_ipv6_rmap_metric_cmd);
13940 install_element(BGP_IPV6_NODE, &bgp_redistribute_ipv6_metric_rmap_cmd);
13941
13942 /* import|export vpn [route-map WORD] */
13943 install_element(BGP_IPV4_NODE, &bgp_imexport_vpn_cmd);
13944 install_element(BGP_IPV6_NODE, &bgp_imexport_vpn_cmd);
13945
13946 install_element(BGP_IPV4_NODE, &bgp_imexport_vrf_cmd);
13947 install_element(BGP_IPV6_NODE, &bgp_imexport_vrf_cmd);
13948
13949 /* ttl_security commands */
13950 install_element(BGP_NODE, &neighbor_ttl_security_cmd);
13951 install_element(BGP_NODE, &no_neighbor_ttl_security_cmd);
13952
13953 /* "show [ip] bgp memory" commands. */
13954 install_element(VIEW_NODE, &show_bgp_memory_cmd);
13955
13956 /* "show bgp martian next-hop" */
13957 install_element(VIEW_NODE, &show_bgp_martian_nexthop_db_cmd);
13958
13959 install_element(VIEW_NODE, &show_bgp_mac_hash_cmd);
13960
13961 /* "show [ip] bgp views" commands. */
13962 install_element(VIEW_NODE, &show_bgp_views_cmd);
13963
13964 /* "show [ip] bgp vrfs" commands. */
13965 install_element(VIEW_NODE, &show_bgp_vrfs_cmd);
13966
13967 /* Community-list. */
13968 community_list_vty();
13969
13970 /* vpn-policy commands */
13971 install_element(BGP_IPV4_NODE, &af_rd_vpn_export_cmd);
13972 install_element(BGP_IPV6_NODE, &af_rd_vpn_export_cmd);
13973 install_element(BGP_IPV4_NODE, &af_label_vpn_export_cmd);
13974 install_element(BGP_IPV6_NODE, &af_label_vpn_export_cmd);
13975 install_element(BGP_IPV4_NODE, &af_nexthop_vpn_export_cmd);
13976 install_element(BGP_IPV6_NODE, &af_nexthop_vpn_export_cmd);
13977 install_element(BGP_IPV4_NODE, &af_rt_vpn_imexport_cmd);
13978 install_element(BGP_IPV6_NODE, &af_rt_vpn_imexport_cmd);
13979 install_element(BGP_IPV4_NODE, &af_route_map_vpn_imexport_cmd);
13980 install_element(BGP_IPV6_NODE, &af_route_map_vpn_imexport_cmd);
13981 install_element(BGP_IPV4_NODE, &af_import_vrf_route_map_cmd);
13982 install_element(BGP_IPV6_NODE, &af_import_vrf_route_map_cmd);
13983
13984 install_element(BGP_IPV4_NODE, &af_routetarget_import_cmd);
13985 install_element(BGP_IPV6_NODE, &af_routetarget_import_cmd);
13986
13987 install_element(BGP_IPV4_NODE, &af_no_rd_vpn_export_cmd);
13988 install_element(BGP_IPV6_NODE, &af_no_rd_vpn_export_cmd);
13989 install_element(BGP_IPV4_NODE, &af_no_label_vpn_export_cmd);
13990 install_element(BGP_IPV6_NODE, &af_no_label_vpn_export_cmd);
13991 install_element(BGP_IPV4_NODE, &af_no_nexthop_vpn_export_cmd);
13992 install_element(BGP_IPV6_NODE, &af_no_nexthop_vpn_export_cmd);
13993 install_element(BGP_IPV4_NODE, &af_no_rt_vpn_imexport_cmd);
13994 install_element(BGP_IPV6_NODE, &af_no_rt_vpn_imexport_cmd);
13995 install_element(BGP_IPV4_NODE, &af_no_route_map_vpn_imexport_cmd);
13996 install_element(BGP_IPV6_NODE, &af_no_route_map_vpn_imexport_cmd);
13997 install_element(BGP_IPV4_NODE, &af_no_import_vrf_route_map_cmd);
13998 install_element(BGP_IPV6_NODE, &af_no_import_vrf_route_map_cmd);
13999 }
14000
14001 #include "memory.h"
14002 #include "bgp_regex.h"
14003 #include "bgp_clist.h"
14004 #include "bgp_ecommunity.h"
14005
14006 /* VTY functions. */
14007
14008 /* Direction value to string conversion. */
14009 static const char *community_direct_str(int direct)
14010 {
14011 switch (direct) {
14012 case COMMUNITY_DENY:
14013 return "deny";
14014 case COMMUNITY_PERMIT:
14015 return "permit";
14016 default:
14017 return "unknown";
14018 }
14019 }
14020
14021 /* Display error string. */
14022 static void community_list_perror(struct vty *vty, int ret)
14023 {
14024 switch (ret) {
14025 case COMMUNITY_LIST_ERR_CANT_FIND_LIST:
14026 vty_out(vty, "%% Can't find community-list\n");
14027 break;
14028 case COMMUNITY_LIST_ERR_MALFORMED_VAL:
14029 vty_out(vty, "%% Malformed community-list value\n");
14030 break;
14031 case COMMUNITY_LIST_ERR_STANDARD_CONFLICT:
14032 vty_out(vty,
14033 "%% Community name conflict, previously defined as standard community\n");
14034 break;
14035 case COMMUNITY_LIST_ERR_EXPANDED_CONFLICT:
14036 vty_out(vty,
14037 "%% Community name conflict, previously defined as expanded community\n");
14038 break;
14039 }
14040 }
14041
14042 /* "community-list" keyword help string. */
14043 #define COMMUNITY_LIST_STR "Add a community list entry\n"
14044
14045 /*community-list standard */
14046 DEFUN (community_list_standard,
14047 bgp_community_list_standard_cmd,
14048 "bgp community-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
14049 BGP_STR
14050 COMMUNITY_LIST_STR
14051 "Community list number (standard)\n"
14052 "Add an standard community-list entry\n"
14053 "Community list name\n"
14054 "Specify community to reject\n"
14055 "Specify community to accept\n"
14056 COMMUNITY_VAL_STR)
14057 {
14058 char *cl_name_or_number = NULL;
14059 int direct = 0;
14060 int style = COMMUNITY_LIST_STANDARD;
14061
14062 int idx = 0;
14063
14064 if (argv_find(argv, argc, "ip", &idx)) {
14065 vty_out(vty, "This config option is deprecated, and is scheduled for removal.\n");
14066 vty_out(vty, "if you are using this please migrate to the below command.\n");
14067 vty_out(vty, "'bgp community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> AA:NN'\n");
14068 zlog_warn("Deprecated option: 'ip community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> AA:NN' being used");
14069 }
14070
14071 argv_find(argv, argc, "(1-99)", &idx);
14072 argv_find(argv, argc, "WORD", &idx);
14073 cl_name_or_number = argv[idx]->arg;
14074 direct = argv_find(argv, argc, "permit", &idx) ? COMMUNITY_PERMIT
14075 : COMMUNITY_DENY;
14076 argv_find(argv, argc, "AA:NN", &idx);
14077 char *str = argv_concat(argv, argc, idx);
14078
14079 int ret = community_list_set(bgp_clist, cl_name_or_number, str, direct,
14080 style);
14081
14082 XFREE(MTYPE_TMP, str);
14083
14084 if (ret < 0) {
14085 /* Display error string. */
14086 community_list_perror(vty, ret);
14087 return CMD_WARNING_CONFIG_FAILED;
14088 }
14089
14090 return CMD_SUCCESS;
14091 }
14092
14093 #if CONFDATE > 20191005
14094 CPP_NOTICE("bgpd: remove deprecated 'ip community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> AA:NN' command")
14095 #endif
14096 ALIAS (community_list_standard,
14097 ip_community_list_standard_cmd,
14098 "ip community-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
14099 IP_STR
14100 COMMUNITY_LIST_STR
14101 "Community list number (standard)\n"
14102 "Add an standard community-list entry\n"
14103 "Community list name\n"
14104 "Specify community to reject\n"
14105 "Specify community to accept\n"
14106 COMMUNITY_VAL_STR)
14107
14108 DEFUN (no_community_list_standard_all,
14109 no_bgp_community_list_standard_all_cmd,
14110 "no bgp community-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
14111 NO_STR
14112 BGP_STR
14113 COMMUNITY_LIST_STR
14114 "Community list number (standard)\n"
14115 "Add an standard community-list entry\n"
14116 "Community list name\n"
14117 "Specify community to reject\n"
14118 "Specify community to accept\n"
14119 COMMUNITY_VAL_STR)
14120 {
14121 char *cl_name_or_number = NULL;
14122 char *str = NULL;
14123 int direct = 0;
14124 int style = COMMUNITY_LIST_STANDARD;
14125
14126 int idx = 0;
14127
14128 if (argv_find(argv, argc, "ip", &idx)) {
14129 vty_out(vty, "This config option is deprecated, and is scheduled for removal\n");
14130 vty_out(vty, "if you are using this please migrate to the below command.\n");
14131 vty_out(vty, "'no bgp community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> AA:NN'\n");
14132 zlog_warn("Deprecated option: 'no ip community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> |AA:NN' being used");
14133 }
14134
14135 argv_find(argv, argc, "permit", &idx);
14136 argv_find(argv, argc, "deny", &idx);
14137
14138 if (idx) {
14139 direct = argv_find(argv, argc, "permit", &idx)
14140 ? COMMUNITY_PERMIT
14141 : COMMUNITY_DENY;
14142
14143 idx = 0;
14144 argv_find(argv, argc, "AA:NN", &idx);
14145 str = argv_concat(argv, argc, idx);
14146 }
14147
14148 idx = 0;
14149 argv_find(argv, argc, "(1-99)", &idx);
14150 argv_find(argv, argc, "WORD", &idx);
14151 cl_name_or_number = argv[idx]->arg;
14152
14153 int ret = community_list_unset(bgp_clist, cl_name_or_number, str,
14154 direct, style);
14155
14156 XFREE(MTYPE_TMP, str);
14157
14158 if (ret < 0) {
14159 community_list_perror(vty, ret);
14160 return CMD_WARNING_CONFIG_FAILED;
14161 }
14162
14163 return CMD_SUCCESS;
14164 }
14165 ALIAS (no_community_list_standard_all,
14166 no_ip_community_list_standard_all_cmd,
14167 "no ip community-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
14168 NO_STR
14169 IP_STR
14170 COMMUNITY_LIST_STR
14171 "Community list number (standard)\n"
14172 "Add an standard community-list entry\n"
14173 "Community list name\n"
14174 "Specify community to reject\n"
14175 "Specify community to accept\n"
14176 COMMUNITY_VAL_STR)
14177
14178 ALIAS(no_community_list_standard_all, no_bgp_community_list_standard_all_list_cmd,
14179 "no bgp community-list <(1-99)|standard WORD>",
14180 NO_STR BGP_STR COMMUNITY_LIST_STR
14181 "Community list number (standard)\n"
14182 "Add an standard community-list entry\n"
14183 "Community list name\n")
14184
14185 ALIAS(no_community_list_standard_all, no_ip_community_list_standard_all_list_cmd,
14186 "no ip community-list <(1-99)|standard WORD>",
14187 NO_STR BGP_STR COMMUNITY_LIST_STR
14188 "Community list number (standard)\n"
14189 "Add an standard community-list entry\n"
14190 "Community list name\n")
14191
14192 /*community-list expanded */
14193 DEFUN (community_list_expanded_all,
14194 bgp_community_list_expanded_all_cmd,
14195 "bgp community-list <(100-500)|expanded WORD> <deny|permit> AA:NN...",
14196 BGP_STR
14197 COMMUNITY_LIST_STR
14198 "Community list number (expanded)\n"
14199 "Add an expanded community-list entry\n"
14200 "Community list name\n"
14201 "Specify community to reject\n"
14202 "Specify community to accept\n"
14203 COMMUNITY_VAL_STR)
14204 {
14205 char *cl_name_or_number = NULL;
14206 int direct = 0;
14207 int style = COMMUNITY_LIST_EXPANDED;
14208
14209 int idx = 0;
14210 if (argv_find(argv, argc, "ip", &idx)) {
14211 vty_out(vty, "This config option is deprecated, and is scheduled for removal.\n");
14212 vty_out(vty, "if you are using this please migrate to the below command.\n");
14213 vty_out(vty, "'bgp community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> AA:NN'\n");
14214 zlog_warn("Deprecated option: 'ip community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> AA:NN' being used");
14215 }
14216 argv_find(argv, argc, "(100-500)", &idx);
14217 argv_find(argv, argc, "WORD", &idx);
14218 cl_name_or_number = argv[idx]->arg;
14219 direct = argv_find(argv, argc, "permit", &idx) ? COMMUNITY_PERMIT
14220 : COMMUNITY_DENY;
14221 argv_find(argv, argc, "AA:NN", &idx);
14222 char *str = argv_concat(argv, argc, idx);
14223
14224 int ret = community_list_set(bgp_clist, cl_name_or_number, str, direct,
14225 style);
14226
14227 XFREE(MTYPE_TMP, str);
14228
14229 if (ret < 0) {
14230 /* Display error string. */
14231 community_list_perror(vty, ret);
14232 return CMD_WARNING_CONFIG_FAILED;
14233 }
14234
14235 return CMD_SUCCESS;
14236 }
14237
14238 ALIAS (community_list_expanded_all,
14239 ip_community_list_expanded_all_cmd,
14240 "ip community-list <(100-500)|expanded WORD> <deny|permit> AA:NN...",
14241 IP_STR
14242 COMMUNITY_LIST_STR
14243 "Community list number (expanded)\n"
14244 "Add an expanded community-list entry\n"
14245 "Community list name\n"
14246 "Specify community to reject\n"
14247 "Specify community to accept\n"
14248 COMMUNITY_VAL_STR)
14249
14250 DEFUN (no_community_list_expanded_all,
14251 no_bgp_community_list_expanded_all_cmd,
14252 "no bgp community-list <(100-500)|expanded WORD> <deny|permit> AA:NN...",
14253 NO_STR
14254 BGP_STR
14255 COMMUNITY_LIST_STR
14256 "Community list number (expanded)\n"
14257 "Add an expanded community-list entry\n"
14258 "Community list name\n"
14259 "Specify community to reject\n"
14260 "Specify community to accept\n"
14261 COMMUNITY_VAL_STR)
14262 {
14263 char *cl_name_or_number = NULL;
14264 char *str = NULL;
14265 int direct = 0;
14266 int style = COMMUNITY_LIST_EXPANDED;
14267
14268 int idx = 0;
14269 if (argv_find(argv, argc, "ip", &idx)) {
14270 vty_out(vty, "This config option is deprecated, and is scheduled for removal.\n");
14271 vty_out(vty, "if you are using this please migrate to the below command.\n");
14272 vty_out(vty, "'no bgp community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> AA:NN'\n");
14273 zlog_warn("Deprecated option: 'no ip community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> AA:NN' being used");
14274 }
14275
14276 idx = 0;
14277 argv_find(argv, argc, "permit", &idx);
14278 argv_find(argv, argc, "deny", &idx);
14279
14280 if (idx) {
14281 direct = argv_find(argv, argc, "permit", &idx)
14282 ? COMMUNITY_PERMIT
14283 : COMMUNITY_DENY;
14284
14285 idx = 0;
14286 argv_find(argv, argc, "AA:NN", &idx);
14287 str = argv_concat(argv, argc, idx);
14288 }
14289
14290 idx = 0;
14291 argv_find(argv, argc, "(100-500)", &idx);
14292 argv_find(argv, argc, "WORD", &idx);
14293 cl_name_or_number = argv[idx]->arg;
14294
14295 int ret = community_list_unset(bgp_clist, cl_name_or_number, str,
14296 direct, style);
14297
14298 XFREE(MTYPE_TMP, str);
14299
14300 if (ret < 0) {
14301 community_list_perror(vty, ret);
14302 return CMD_WARNING_CONFIG_FAILED;
14303 }
14304
14305 return CMD_SUCCESS;
14306 }
14307
14308 ALIAS (no_community_list_expanded_all,
14309 no_ip_community_list_expanded_all_cmd,
14310 "no ip community-list <(100-500)|expanded WORD> <deny|permit> AA:NN...",
14311 NO_STR
14312 IP_STR
14313 COMMUNITY_LIST_STR
14314 "Community list number (expanded)\n"
14315 "Add an expanded community-list entry\n"
14316 "Community list name\n"
14317 "Specify community to reject\n"
14318 "Specify community to accept\n"
14319 COMMUNITY_VAL_STR)
14320
14321 ALIAS(no_community_list_expanded_all, no_bgp_community_list_expanded_all_list_cmd,
14322 "no bgp community-list <(100-500)|expanded WORD>",
14323 NO_STR IP_STR COMMUNITY_LIST_STR
14324 "Community list number (expanded)\n"
14325 "Add an expanded community-list entry\n"
14326 "Community list name\n")
14327
14328 ALIAS(no_community_list_expanded_all, no_ip_community_list_expanded_all_list_cmd,
14329 "no ip community-list <(100-500)|expanded WORD>",
14330 NO_STR IP_STR COMMUNITY_LIST_STR
14331 "Community list number (expanded)\n"
14332 "Add an expanded community-list entry\n"
14333 "Community list name\n")
14334
14335 /* Return configuration string of community-list entry. */
14336 static const char *community_list_config_str(struct community_entry *entry)
14337 {
14338 const char *str;
14339
14340 if (entry->any)
14341 str = "";
14342 else {
14343 if (entry->style == COMMUNITY_LIST_STANDARD)
14344 str = community_str(entry->u.com, false);
14345 else if (entry->style == LARGE_COMMUNITY_LIST_STANDARD)
14346 str = lcommunity_str(entry->u.lcom, false);
14347 else
14348 str = entry->config;
14349 }
14350 return str;
14351 }
14352
14353 static void community_list_show(struct vty *vty, struct community_list *list)
14354 {
14355 struct community_entry *entry;
14356
14357 for (entry = list->head; entry; entry = entry->next) {
14358 if (entry == list->head) {
14359 if (all_digit(list->name))
14360 vty_out(vty, "Community %s list %s\n",
14361 entry->style == COMMUNITY_LIST_STANDARD
14362 ? "standard"
14363 : "(expanded) access",
14364 list->name);
14365 else
14366 vty_out(vty, "Named Community %s list %s\n",
14367 entry->style == COMMUNITY_LIST_STANDARD
14368 ? "standard"
14369 : "expanded",
14370 list->name);
14371 }
14372 if (entry->any)
14373 vty_out(vty, " %s\n",
14374 community_direct_str(entry->direct));
14375 else
14376 vty_out(vty, " %s %s\n",
14377 community_direct_str(entry->direct),
14378 community_list_config_str(entry));
14379 }
14380 }
14381
14382 DEFUN (show_community_list,
14383 show_bgp_community_list_cmd,
14384 "show bgp community-list",
14385 SHOW_STR
14386 BGP_STR
14387 "List community-list\n")
14388 {
14389 struct community_list *list;
14390 struct community_list_master *cm;
14391
14392 int idx = 0;
14393 if (argv_find(argv, argc, "ip", &idx)) {
14394 vty_out(vty, "This config option is deprecated, and is scheduled for removal.\n");
14395 vty_out(vty, "if you are using this please migrate to the below command.\n");
14396 vty_out(vty, "'show bgp community-list <(1-500)|WORD>'\n");
14397 zlog_warn("Deprecated option: 'ip show community-list <(1-500)|WORD>' being used");
14398 }
14399 cm = community_list_master_lookup(bgp_clist, COMMUNITY_LIST_MASTER);
14400 if (!cm)
14401 return CMD_SUCCESS;
14402
14403 for (list = cm->num.head; list; list = list->next)
14404 community_list_show(vty, list);
14405
14406 for (list = cm->str.head; list; list = list->next)
14407 community_list_show(vty, list);
14408
14409 return CMD_SUCCESS;
14410 }
14411
14412 ALIAS (show_community_list,
14413 show_ip_community_list_cmd,
14414 "show ip community-list",
14415 SHOW_STR
14416 IP_STR
14417 "List community-list\n")
14418
14419 DEFUN (show_community_list_arg,
14420 show_bgp_community_list_arg_cmd,
14421 "show bgp community-list <(1-500)|WORD>",
14422 SHOW_STR
14423 BGP_STR
14424 "List community-list\n"
14425 "Community-list number\n"
14426 "Community-list name\n")
14427 {
14428 int idx_comm_list = 3;
14429 struct community_list *list;
14430
14431 int idx = 0;
14432 if (argv_find(argv, argc, "ip", &idx)) {
14433 vty_out(vty, "This config option is deprecated, and is scheduled for removal.\n");
14434 vty_out(vty, "if you are using this please migrate to the below command.\n");
14435 vty_out(vty, "'show bgp community-list <(1-500)|WORD>'\n");
14436 zlog_warn("Deprecated option: 'ip show community-list <(1-500)|WORD>' being used");
14437 }
14438 list = community_list_lookup(bgp_clist, argv[idx_comm_list]->arg, 0,
14439 COMMUNITY_LIST_MASTER);
14440 if (!list) {
14441 vty_out(vty, "%% Can't find community-list\n");
14442 return CMD_WARNING;
14443 }
14444
14445 community_list_show(vty, list);
14446
14447 return CMD_SUCCESS;
14448 }
14449
14450 ALIAS (show_community_list_arg,
14451 show_ip_community_list_arg_cmd,
14452 "show ip community-list <(1-500)|WORD>",
14453 SHOW_STR
14454 IP_STR
14455 "List community-list\n"
14456 "Community-list number\n"
14457 "Community-list name\n")
14458
14459 /*
14460 * Large Community code.
14461 */
14462 static int lcommunity_list_set_vty(struct vty *vty, int argc,
14463 struct cmd_token **argv, int style,
14464 int reject_all_digit_name)
14465 {
14466 int ret;
14467 int direct;
14468 char *str;
14469 int idx = 0;
14470 char *cl_name;
14471
14472 if (argv_find(argv, argc, "ip", &idx)) {
14473 vty_out(vty, "This config option is deprecated, and is scheduled for removal.\n");
14474 vty_out(vty, "if you are using this please migrate to the below command.\n");
14475 vty_out(vty, "'bgp large-community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:BB:CC>'\n");
14476 zlog_warn("Deprecated option: 'large-community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:BB:CC>' being used");
14477 }
14478 direct = argv_find(argv, argc, "permit", &idx) ? COMMUNITY_PERMIT
14479 : COMMUNITY_DENY;
14480
14481 /* All digit name check. */
14482 idx = 0;
14483 argv_find(argv, argc, "WORD", &idx);
14484 argv_find(argv, argc, "(1-99)", &idx);
14485 argv_find(argv, argc, "(100-500)", &idx);
14486 cl_name = argv[idx]->arg;
14487 if (reject_all_digit_name && all_digit(cl_name)) {
14488 vty_out(vty, "%% Community name cannot have all digits\n");
14489 return CMD_WARNING_CONFIG_FAILED;
14490 }
14491
14492 idx = 0;
14493 argv_find(argv, argc, "AA:BB:CC", &idx);
14494 argv_find(argv, argc, "LINE", &idx);
14495 /* Concat community string argument. */
14496 if (idx)
14497 str = argv_concat(argv, argc, idx);
14498 else
14499 str = NULL;
14500
14501 ret = lcommunity_list_set(bgp_clist, cl_name, str, direct, style);
14502
14503 /* Free temporary community list string allocated by
14504 argv_concat(). */
14505 XFREE(MTYPE_TMP, str);
14506
14507 if (ret < 0) {
14508 community_list_perror(vty, ret);
14509 return CMD_WARNING_CONFIG_FAILED;
14510 }
14511 return CMD_SUCCESS;
14512 }
14513
14514 static int lcommunity_list_unset_vty(struct vty *vty, int argc,
14515 struct cmd_token **argv, int style)
14516 {
14517 int ret;
14518 int direct = 0;
14519 char *str = NULL;
14520 int idx = 0;
14521
14522 if (argv_find(argv, argc, "ip", &idx)) {
14523 vty_out(vty, "This config option is deprecated, and is scheduled for removal.\n");
14524 vty_out(vty, "if you are using this please migrate to the below command.\n");
14525 vty_out(vty, "'no bgp large-community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:BB:CC>'\n");
14526 zlog_warn("Deprecated option: 'no ip large-community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:BB:CC>' being used");
14527 }
14528 argv_find(argv, argc, "permit", &idx);
14529 argv_find(argv, argc, "deny", &idx);
14530
14531 if (idx) {
14532 /* Check the list direct. */
14533 if (strncmp(argv[idx]->arg, "p", 1) == 0)
14534 direct = COMMUNITY_PERMIT;
14535 else
14536 direct = COMMUNITY_DENY;
14537
14538 idx = 0;
14539 argv_find(argv, argc, "LINE", &idx);
14540 argv_find(argv, argc, "AA:AA:NN", &idx);
14541 /* Concat community string argument. */
14542 str = argv_concat(argv, argc, idx);
14543 }
14544
14545 idx = 0;
14546 argv_find(argv, argc, "(1-99)", &idx);
14547 argv_find(argv, argc, "(100-500)", &idx);
14548 argv_find(argv, argc, "WORD", &idx);
14549
14550 /* Unset community list. */
14551 ret = lcommunity_list_unset(bgp_clist, argv[idx]->arg, str, direct,
14552 style);
14553
14554 /* Free temporary community list string allocated by
14555 argv_concat(). */
14556 XFREE(MTYPE_TMP, str);
14557
14558 if (ret < 0) {
14559 community_list_perror(vty, ret);
14560 return CMD_WARNING_CONFIG_FAILED;
14561 }
14562
14563 return CMD_SUCCESS;
14564 }
14565
14566 /* "large-community-list" keyword help string. */
14567 #define LCOMMUNITY_LIST_STR "Add a large community list entry\n"
14568 #define LCOMMUNITY_VAL_STR "large community in 'aa:bb:cc' format\n"
14569
14570 #if CONFDATE > 20191005
14571 CPP_NOTICE("bgpd: remove deprecated 'ip large-community-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:BB:CC>' command")
14572 #endif
14573 DEFUN (lcommunity_list_standard,
14574 bgp_lcommunity_list_standard_cmd,
14575 "bgp large-community-list (1-99) <deny|permit>",
14576 BGP_STR
14577 LCOMMUNITY_LIST_STR
14578 "Large Community list number (standard)\n"
14579 "Specify large community to reject\n"
14580 "Specify large community to accept\n")
14581 {
14582 return lcommunity_list_set_vty(vty, argc, argv,
14583 LARGE_COMMUNITY_LIST_STANDARD, 0);
14584 }
14585
14586 ALIAS (lcommunity_list_standard,
14587 ip_lcommunity_list_standard_cmd,
14588 "ip large-community-list (1-99) <deny|permit>",
14589 IP_STR
14590 LCOMMUNITY_LIST_STR
14591 "Large Community list number (standard)\n"
14592 "Specify large community to reject\n"
14593 "Specify large community to accept\n")
14594
14595 DEFUN (lcommunity_list_standard1,
14596 bgp_lcommunity_list_standard1_cmd,
14597 "bgp large-community-list (1-99) <deny|permit> AA:BB:CC...",
14598 BGP_STR
14599 LCOMMUNITY_LIST_STR
14600 "Large Community list number (standard)\n"
14601 "Specify large community to reject\n"
14602 "Specify large community to accept\n"
14603 LCOMMUNITY_VAL_STR)
14604 {
14605 return lcommunity_list_set_vty(vty, argc, argv,
14606 LARGE_COMMUNITY_LIST_STANDARD, 0);
14607 }
14608
14609 ALIAS (lcommunity_list_standard1,
14610 ip_lcommunity_list_standard1_cmd,
14611 "ip large-community-list (1-99) <deny|permit> AA:BB:CC...",
14612 IP_STR
14613 LCOMMUNITY_LIST_STR
14614 "Large Community list number (standard)\n"
14615 "Specify large community to reject\n"
14616 "Specify large community to accept\n"
14617 LCOMMUNITY_VAL_STR)
14618
14619 DEFUN (lcommunity_list_expanded,
14620 bgp_lcommunity_list_expanded_cmd,
14621 "bgp large-community-list (100-500) <deny|permit> LINE...",
14622 BGP_STR
14623 LCOMMUNITY_LIST_STR
14624 "Large Community list number (expanded)\n"
14625 "Specify large community to reject\n"
14626 "Specify large community to accept\n"
14627 "An ordered list as a regular-expression\n")
14628 {
14629 return lcommunity_list_set_vty(vty, argc, argv,
14630 LARGE_COMMUNITY_LIST_EXPANDED, 0);
14631 }
14632
14633 ALIAS (lcommunity_list_expanded,
14634 ip_lcommunity_list_expanded_cmd,
14635 "ip large-community-list (100-500) <deny|permit> LINE...",
14636 IP_STR
14637 LCOMMUNITY_LIST_STR
14638 "Large Community list number (expanded)\n"
14639 "Specify large community to reject\n"
14640 "Specify large community to accept\n"
14641 "An ordered list as a regular-expression\n")
14642
14643 DEFUN (lcommunity_list_name_standard,
14644 bgp_lcommunity_list_name_standard_cmd,
14645 "bgp large-community-list standard WORD <deny|permit>",
14646 BGP_STR
14647 LCOMMUNITY_LIST_STR
14648 "Specify standard large-community-list\n"
14649 "Large Community list name\n"
14650 "Specify large community to reject\n"
14651 "Specify large community to accept\n")
14652 {
14653 return lcommunity_list_set_vty(vty, argc, argv,
14654 LARGE_COMMUNITY_LIST_STANDARD, 1);
14655 }
14656
14657 ALIAS (lcommunity_list_name_standard,
14658 ip_lcommunity_list_name_standard_cmd,
14659 "ip large-community-list standard WORD <deny|permit>",
14660 IP_STR
14661 LCOMMUNITY_LIST_STR
14662 "Specify standard large-community-list\n"
14663 "Large Community list name\n"
14664 "Specify large community to reject\n"
14665 "Specify large community to accept\n")
14666
14667 DEFUN (lcommunity_list_name_standard1,
14668 bgp_lcommunity_list_name_standard1_cmd,
14669 "bgp large-community-list standard WORD <deny|permit> AA:BB:CC...",
14670 BGP_STR
14671 LCOMMUNITY_LIST_STR
14672 "Specify standard large-community-list\n"
14673 "Large Community list name\n"
14674 "Specify large community to reject\n"
14675 "Specify large community to accept\n"
14676 LCOMMUNITY_VAL_STR)
14677 {
14678 return lcommunity_list_set_vty(vty, argc, argv,
14679 LARGE_COMMUNITY_LIST_STANDARD, 1);
14680 }
14681
14682 ALIAS (lcommunity_list_name_standard1,
14683 ip_lcommunity_list_name_standard1_cmd,
14684 "ip large-community-list standard WORD <deny|permit> AA:BB:CC...",
14685 IP_STR
14686 LCOMMUNITY_LIST_STR
14687 "Specify standard large-community-list\n"
14688 "Large Community list name\n"
14689 "Specify large community to reject\n"
14690 "Specify large community to accept\n"
14691 LCOMMUNITY_VAL_STR)
14692
14693 DEFUN (lcommunity_list_name_expanded,
14694 bgp_lcommunity_list_name_expanded_cmd,
14695 "bgp large-community-list expanded WORD <deny|permit> LINE...",
14696 BGP_STR
14697 LCOMMUNITY_LIST_STR
14698 "Specify expanded large-community-list\n"
14699 "Large Community list name\n"
14700 "Specify large community to reject\n"
14701 "Specify large community to accept\n"
14702 "An ordered list as a regular-expression\n")
14703 {
14704 return lcommunity_list_set_vty(vty, argc, argv,
14705 LARGE_COMMUNITY_LIST_EXPANDED, 1);
14706 }
14707
14708 ALIAS (lcommunity_list_name_expanded,
14709 ip_lcommunity_list_name_expanded_cmd,
14710 "ip large-community-list expanded WORD <deny|permit> LINE...",
14711 IP_STR
14712 LCOMMUNITY_LIST_STR
14713 "Specify expanded large-community-list\n"
14714 "Large Community list name\n"
14715 "Specify large community to reject\n"
14716 "Specify large community to accept\n"
14717 "An ordered list as a regular-expression\n")
14718
14719 DEFUN (no_lcommunity_list_standard_all,
14720 no_bgp_lcommunity_list_standard_all_cmd,
14721 "no bgp large-community-list <(1-99)|(100-500)|WORD>",
14722 NO_STR
14723 BGP_STR
14724 LCOMMUNITY_LIST_STR
14725 "Large Community list number (standard)\n"
14726 "Large Community list number (expanded)\n"
14727 "Large Community list name\n")
14728 {
14729 return lcommunity_list_unset_vty(vty, argc, argv,
14730 LARGE_COMMUNITY_LIST_STANDARD);
14731 }
14732
14733 ALIAS (no_lcommunity_list_standard_all,
14734 no_ip_lcommunity_list_standard_all_cmd,
14735 "no ip large-community-list <(1-99)|(100-500)|WORD>",
14736 NO_STR
14737 IP_STR
14738 LCOMMUNITY_LIST_STR
14739 "Large Community list number (standard)\n"
14740 "Large Community list number (expanded)\n"
14741 "Large Community list name\n")
14742
14743 DEFUN (no_lcommunity_list_name_expanded_all,
14744 no_bgp_lcommunity_list_name_expanded_all_cmd,
14745 "no bgp large-community-list expanded WORD",
14746 NO_STR
14747 BGP_STR
14748 LCOMMUNITY_LIST_STR
14749 "Specify expanded large-community-list\n"
14750 "Large Community list name\n")
14751 {
14752 return lcommunity_list_unset_vty(vty, argc, argv,
14753 LARGE_COMMUNITY_LIST_EXPANDED);
14754 }
14755
14756 ALIAS (no_lcommunity_list_name_expanded_all,
14757 no_ip_lcommunity_list_name_expanded_all_cmd,
14758 "no ip large-community-list expanded WORD",
14759 NO_STR
14760 IP_STR
14761 LCOMMUNITY_LIST_STR
14762 "Specify expanded large-community-list\n"
14763 "Large Community list name\n")
14764
14765 DEFUN (no_lcommunity_list_standard,
14766 no_bgp_lcommunity_list_standard_cmd,
14767 "no bgp large-community-list (1-99) <deny|permit> AA:AA:NN...",
14768 NO_STR
14769 BGP_STR
14770 LCOMMUNITY_LIST_STR
14771 "Large Community list number (standard)\n"
14772 "Specify large community to reject\n"
14773 "Specify large community to accept\n"
14774 LCOMMUNITY_VAL_STR)
14775 {
14776 return lcommunity_list_unset_vty(vty, argc, argv,
14777 LARGE_COMMUNITY_LIST_STANDARD);
14778 }
14779
14780 ALIAS (no_lcommunity_list_standard,
14781 no_ip_lcommunity_list_standard_cmd,
14782 "no ip large-community-list (1-99) <deny|permit> AA:AA:NN...",
14783 NO_STR
14784 IP_STR
14785 LCOMMUNITY_LIST_STR
14786 "Large Community list number (standard)\n"
14787 "Specify large community to reject\n"
14788 "Specify large community to accept\n"
14789 LCOMMUNITY_VAL_STR)
14790
14791 DEFUN (no_lcommunity_list_expanded,
14792 no_bgp_lcommunity_list_expanded_cmd,
14793 "no bgp large-community-list (100-500) <deny|permit> LINE...",
14794 NO_STR
14795 BGP_STR
14796 LCOMMUNITY_LIST_STR
14797 "Large Community list number (expanded)\n"
14798 "Specify large community to reject\n"
14799 "Specify large community to accept\n"
14800 "An ordered list as a regular-expression\n")
14801 {
14802 return lcommunity_list_unset_vty(vty, argc, argv,
14803 LARGE_COMMUNITY_LIST_EXPANDED);
14804 }
14805
14806 ALIAS (no_lcommunity_list_expanded,
14807 no_ip_lcommunity_list_expanded_cmd,
14808 "no ip large-community-list (100-500) <deny|permit> LINE...",
14809 NO_STR
14810 IP_STR
14811 LCOMMUNITY_LIST_STR
14812 "Large Community list number (expanded)\n"
14813 "Specify large community to reject\n"
14814 "Specify large community to accept\n"
14815 "An ordered list as a regular-expression\n")
14816
14817 DEFUN (no_lcommunity_list_name_standard,
14818 no_bgp_lcommunity_list_name_standard_cmd,
14819 "no bgp large-community-list standard WORD <deny|permit> AA:AA:NN...",
14820 NO_STR
14821 BGP_STR
14822 LCOMMUNITY_LIST_STR
14823 "Specify standard large-community-list\n"
14824 "Large Community list name\n"
14825 "Specify large community to reject\n"
14826 "Specify large community to accept\n"
14827 LCOMMUNITY_VAL_STR)
14828 {
14829 return lcommunity_list_unset_vty(vty, argc, argv,
14830 LARGE_COMMUNITY_LIST_STANDARD);
14831 }
14832
14833 ALIAS (no_lcommunity_list_name_standard,
14834 no_ip_lcommunity_list_name_standard_cmd,
14835 "no ip large-community-list standard WORD <deny|permit> AA:AA:NN...",
14836 NO_STR
14837 IP_STR
14838 LCOMMUNITY_LIST_STR
14839 "Specify standard large-community-list\n"
14840 "Large Community list name\n"
14841 "Specify large community to reject\n"
14842 "Specify large community to accept\n"
14843 LCOMMUNITY_VAL_STR)
14844
14845 DEFUN (no_lcommunity_list_name_expanded,
14846 no_bgp_lcommunity_list_name_expanded_cmd,
14847 "no bgp large-community-list expanded WORD <deny|permit> LINE...",
14848 NO_STR
14849 BGP_STR
14850 LCOMMUNITY_LIST_STR
14851 "Specify expanded large-community-list\n"
14852 "Large community list name\n"
14853 "Specify large community to reject\n"
14854 "Specify large community to accept\n"
14855 "An ordered list as a regular-expression\n")
14856 {
14857 return lcommunity_list_unset_vty(vty, argc, argv,
14858 LARGE_COMMUNITY_LIST_EXPANDED);
14859 }
14860
14861 ALIAS (no_lcommunity_list_name_expanded,
14862 no_ip_lcommunity_list_name_expanded_cmd,
14863 "no ip large-community-list expanded WORD <deny|permit> LINE...",
14864 NO_STR
14865 IP_STR
14866 LCOMMUNITY_LIST_STR
14867 "Specify expanded large-community-list\n"
14868 "Large community list name\n"
14869 "Specify large community to reject\n"
14870 "Specify large community to accept\n"
14871 "An ordered list as a regular-expression\n")
14872
14873 static void lcommunity_list_show(struct vty *vty, struct community_list *list)
14874 {
14875 struct community_entry *entry;
14876
14877 for (entry = list->head; entry; entry = entry->next) {
14878 if (entry == list->head) {
14879 if (all_digit(list->name))
14880 vty_out(vty, "Large community %s list %s\n",
14881 entry->style ==
14882 LARGE_COMMUNITY_LIST_STANDARD
14883 ? "standard"
14884 : "(expanded) access",
14885 list->name);
14886 else
14887 vty_out(vty,
14888 "Named large community %s list %s\n",
14889 entry->style ==
14890 LARGE_COMMUNITY_LIST_STANDARD
14891 ? "standard"
14892 : "expanded",
14893 list->name);
14894 }
14895 if (entry->any)
14896 vty_out(vty, " %s\n",
14897 community_direct_str(entry->direct));
14898 else
14899 vty_out(vty, " %s %s\n",
14900 community_direct_str(entry->direct),
14901 community_list_config_str(entry));
14902 }
14903 }
14904
14905 DEFUN (show_lcommunity_list,
14906 show_bgp_lcommunity_list_cmd,
14907 "show bgp large-community-list",
14908 SHOW_STR
14909 BGP_STR
14910 "List large-community list\n")
14911 {
14912 struct community_list *list;
14913 struct community_list_master *cm;
14914 int idx = 0;
14915
14916 if (argv_find(argv, argc, "ip", &idx)) {
14917 vty_out(vty, "This config option is deprecated, and is scheduled for removal.\n");
14918 vty_out(vty, "if you are using this please migrate to the below command.\n");
14919 vty_out(vty, "'show bgp large-community-list <(1-500)|WORD>'\n");
14920 zlog_warn("Deprecated option: 'ip show large-community-list <(1-500)|WORD>' being used");
14921 }
14922
14923 cm = community_list_master_lookup(bgp_clist,
14924 LARGE_COMMUNITY_LIST_MASTER);
14925 if (!cm)
14926 return CMD_SUCCESS;
14927
14928 for (list = cm->num.head; list; list = list->next)
14929 lcommunity_list_show(vty, list);
14930
14931 for (list = cm->str.head; list; list = list->next)
14932 lcommunity_list_show(vty, list);
14933
14934 return CMD_SUCCESS;
14935 }
14936
14937 ALIAS (show_lcommunity_list,
14938 show_ip_lcommunity_list_cmd,
14939 "show ip large-community-list",
14940 SHOW_STR
14941 IP_STR
14942 "List large-community list\n")
14943
14944 DEFUN (show_lcommunity_list_arg,
14945 show_bgp_lcommunity_list_arg_cmd,
14946 "show bgp large-community-list <(1-500)|WORD>",
14947 SHOW_STR
14948 BGP_STR
14949 "List large-community list\n"
14950 "large-community-list number\n"
14951 "large-community-list name\n")
14952 {
14953 struct community_list *list;
14954 int idx = 0;
14955
14956 if (argv_find(argv, argc, "ip", &idx)) {
14957 vty_out(vty, "This config option is deprecated, and is scheduled for removal.\n");
14958 vty_out(vty, "if you are using this please migrate to the below command.\n");
14959 vty_out(vty, "'show bgp large-community-list <(1-500)|WORD>'\n");
14960 zlog_warn("Deprecated option: 'ip show large-community-list <(1-500)|WORD>' being used");
14961 }
14962
14963 list = community_list_lookup(bgp_clist, argv[3]->arg, 0,
14964 LARGE_COMMUNITY_LIST_MASTER);
14965 if (!list) {
14966 vty_out(vty, "%% Can't find extcommunity-list\n");
14967 return CMD_WARNING;
14968 }
14969
14970 lcommunity_list_show(vty, list);
14971
14972 return CMD_SUCCESS;
14973 }
14974
14975 ALIAS (show_lcommunity_list_arg,
14976 show_ip_lcommunity_list_arg_cmd,
14977 "show ip large-community-list <(1-500)|WORD>",
14978 SHOW_STR
14979 IP_STR
14980 "List large-community list\n"
14981 "large-community-list number\n"
14982 "large-community-list name\n")
14983
14984 /* "extcommunity-list" keyword help string. */
14985 #define EXTCOMMUNITY_LIST_STR "Add a extended community list entry\n"
14986 #define EXTCOMMUNITY_VAL_STR "Extended community attribute in 'rt aa:nn_or_IPaddr:nn' OR 'soo aa:nn_or_IPaddr:nn' format\n"
14987
14988 DEFUN (extcommunity_list_standard,
14989 bgp_extcommunity_list_standard_cmd,
14990 "bgp extcommunity-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
14991 BGP_STR
14992 EXTCOMMUNITY_LIST_STR
14993 "Extended Community list number (standard)\n"
14994 "Specify standard extcommunity-list\n"
14995 "Community list name\n"
14996 "Specify community to reject\n"
14997 "Specify community to accept\n"
14998 EXTCOMMUNITY_VAL_STR)
14999 {
15000 int style = EXTCOMMUNITY_LIST_STANDARD;
15001 int direct = 0;
15002 char *cl_number_or_name = NULL;
15003
15004 int idx = 0;
15005 if (argv_find(argv, argc, "ip", &idx)) {
15006 vty_out(vty, "This config option is deprecated, and is scheduled for removal.\n");
15007 vty_out(vty, "if you are using this please migrate to the below command.\n");
15008 vty_out(vty, "'bgp extcommunity-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:NN>'\n");
15009 zlog_warn("Deprecated option: 'ip extcommunity-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:NN>' being used");
15010 }
15011 argv_find(argv, argc, "(1-99)", &idx);
15012 argv_find(argv, argc, "WORD", &idx);
15013 cl_number_or_name = argv[idx]->arg;
15014 direct = argv_find(argv, argc, "permit", &idx) ? COMMUNITY_PERMIT
15015 : COMMUNITY_DENY;
15016 argv_find(argv, argc, "AA:NN", &idx);
15017 char *str = argv_concat(argv, argc, idx);
15018
15019 int ret = extcommunity_list_set(bgp_clist, cl_number_or_name, str,
15020 direct, style);
15021
15022 XFREE(MTYPE_TMP, str);
15023
15024 if (ret < 0) {
15025 community_list_perror(vty, ret);
15026 return CMD_WARNING_CONFIG_FAILED;
15027 }
15028
15029 return CMD_SUCCESS;
15030 }
15031
15032 #if CONFDATE > 20191005
15033 CPP_NOTICE("bgpd: remove deprecated 'ip extcommunity-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:NN>' command")
15034 #endif
15035 ALIAS (extcommunity_list_standard,
15036 ip_extcommunity_list_standard_cmd,
15037 "ip extcommunity-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
15038 IP_STR
15039 EXTCOMMUNITY_LIST_STR
15040 "Extended Community list number (standard)\n"
15041 "Specify standard extcommunity-list\n"
15042 "Community list name\n"
15043 "Specify community to reject\n"
15044 "Specify community to accept\n"
15045 EXTCOMMUNITY_VAL_STR)
15046
15047 DEFUN (extcommunity_list_name_expanded,
15048 bgp_extcommunity_list_name_expanded_cmd,
15049 "bgp extcommunity-list <(100-500)|expanded WORD> <deny|permit> LINE...",
15050 BGP_STR
15051 EXTCOMMUNITY_LIST_STR
15052 "Extended Community list number (expanded)\n"
15053 "Specify expanded extcommunity-list\n"
15054 "Extended Community list name\n"
15055 "Specify community to reject\n"
15056 "Specify community to accept\n"
15057 "An ordered list as a regular-expression\n")
15058 {
15059 int style = EXTCOMMUNITY_LIST_EXPANDED;
15060 int direct = 0;
15061 char *cl_number_or_name = NULL;
15062
15063 int idx = 0;
15064 if (argv_find(argv, argc, "ip", &idx)) {
15065 vty_out(vty, "This config option is deprecated, and is scheduled for removal.\n");
15066 vty_out(vty, "if you are using this please migrate to the below command.\n");
15067 vty_out(vty, "'extcommunity-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:NN>'\n");
15068 zlog_warn("Deprecated option: ‘ip extcommunity-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:NN>' being used");
15069 }
15070
15071 argv_find(argv, argc, "(100-500)", &idx);
15072 argv_find(argv, argc, "WORD", &idx);
15073 cl_number_or_name = argv[idx]->arg;
15074 direct = argv_find(argv, argc, "permit", &idx) ? COMMUNITY_PERMIT
15075 : COMMUNITY_DENY;
15076 argv_find(argv, argc, "LINE", &idx);
15077 char *str = argv_concat(argv, argc, idx);
15078
15079 int ret = extcommunity_list_set(bgp_clist, cl_number_or_name, str,
15080 direct, style);
15081
15082 XFREE(MTYPE_TMP, str);
15083
15084 if (ret < 0) {
15085 community_list_perror(vty, ret);
15086 return CMD_WARNING_CONFIG_FAILED;
15087 }
15088
15089 return CMD_SUCCESS;
15090 }
15091
15092 ALIAS (extcommunity_list_name_expanded,
15093 ip_extcommunity_list_name_expanded_cmd,
15094 "ip extcommunity-list <(100-500)|expanded WORD> <deny|permit> LINE...",
15095 IP_STR
15096 EXTCOMMUNITY_LIST_STR
15097 "Extended Community list number (expanded)\n"
15098 "Specify expanded extcommunity-list\n"
15099 "Extended Community list name\n"
15100 "Specify community to reject\n"
15101 "Specify community to accept\n"
15102 "An ordered list as a regular-expression\n")
15103
15104 DEFUN (no_extcommunity_list_standard_all,
15105 no_bgp_extcommunity_list_standard_all_cmd,
15106 "no bgp extcommunity-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
15107 NO_STR
15108 BGP_STR
15109 EXTCOMMUNITY_LIST_STR
15110 "Extended Community list number (standard)\n"
15111 "Specify standard extcommunity-list\n"
15112 "Community list name\n"
15113 "Specify community to reject\n"
15114 "Specify community to accept\n"
15115 EXTCOMMUNITY_VAL_STR)
15116 {
15117 int style = EXTCOMMUNITY_LIST_STANDARD;
15118 int direct = 0;
15119 char *cl_number_or_name = NULL;
15120 char *str = NULL;
15121
15122 int idx = 0;
15123 if (argv_find(argv, argc, "ip", &idx)) {
15124 vty_out(vty, "This config option is deprecated, and is scheduled for removal\n");
15125 vty_out(vty, "if you are using this please migrate to the below command.\n");
15126 vty_out(vty, "'no bgp extcommunity-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:NN>'\n");
15127 zlog_warn("Deprecated option: ‘no ip extcommunity-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:NN>' being used");
15128 }
15129
15130 idx = 0;
15131 argv_find(argv, argc, "permit", &idx);
15132 argv_find(argv, argc, "deny", &idx);
15133
15134 if (idx) {
15135 direct = argv_find(argv, argc, "permit", &idx)
15136 ? COMMUNITY_PERMIT
15137 : COMMUNITY_DENY;
15138
15139 idx = 0;
15140 argv_find(argv, argc, "AA:NN", &idx);
15141 str = argv_concat(argv, argc, idx);
15142 }
15143
15144 idx = 0;
15145 argv_find(argv, argc, "(1-99)", &idx);
15146 argv_find(argv, argc, "WORD", &idx);
15147 cl_number_or_name = argv[idx]->arg;
15148
15149 int ret = extcommunity_list_unset(bgp_clist, cl_number_or_name, str,
15150 direct, style);
15151
15152 XFREE(MTYPE_TMP, str);
15153
15154 if (ret < 0) {
15155 community_list_perror(vty, ret);
15156 return CMD_WARNING_CONFIG_FAILED;
15157 }
15158
15159 return CMD_SUCCESS;
15160 }
15161
15162 ALIAS (no_extcommunity_list_standard_all,
15163 no_ip_extcommunity_list_standard_all_cmd,
15164 "no ip extcommunity-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
15165 NO_STR
15166 IP_STR
15167 EXTCOMMUNITY_LIST_STR
15168 "Extended Community list number (standard)\n"
15169 "Specify standard extcommunity-list\n"
15170 "Community list name\n"
15171 "Specify community to reject\n"
15172 "Specify community to accept\n"
15173 EXTCOMMUNITY_VAL_STR)
15174
15175 ALIAS(no_extcommunity_list_standard_all,
15176 no_bgp_extcommunity_list_standard_all_list_cmd,
15177 "no bgp extcommunity-list <(1-99)|standard WORD>",
15178 NO_STR IP_STR EXTCOMMUNITY_LIST_STR
15179 "Extended Community list number (standard)\n"
15180 "Specify standard extcommunity-list\n"
15181 "Community list name\n")
15182
15183 ALIAS(no_extcommunity_list_standard_all,
15184 no_ip_extcommunity_list_standard_all_list_cmd,
15185 "no ip extcommunity-list <(1-99)|standard WORD>",
15186 NO_STR IP_STR EXTCOMMUNITY_LIST_STR
15187 "Extended Community list number (standard)\n"
15188 "Specify standard extcommunity-list\n"
15189 "Community list name\n")
15190
15191 DEFUN (no_extcommunity_list_expanded_all,
15192 no_bgp_extcommunity_list_expanded_all_cmd,
15193 "no bgp extcommunity-list <(100-500)|expanded WORD> <deny|permit> LINE...",
15194 NO_STR
15195 BGP_STR
15196 EXTCOMMUNITY_LIST_STR
15197 "Extended Community list number (expanded)\n"
15198 "Specify expanded extcommunity-list\n"
15199 "Extended Community list name\n"
15200 "Specify community to reject\n"
15201 "Specify community to accept\n"
15202 "An ordered list as a regular-expression\n")
15203 {
15204 int style = EXTCOMMUNITY_LIST_EXPANDED;
15205 int direct = 0;
15206 char *cl_number_or_name = NULL;
15207 char *str = NULL;
15208
15209 int idx = 0;
15210 if (argv_find(argv, argc, "ip", &idx)) {
15211 vty_out(vty, "This config option is deprecated, and is scheduled for removal.\n");
15212 vty_out(vty, "if you are using this please migrate to the below command.\n");
15213 vty_out(vty, "'no bgp extcommunity-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:NN>'\n");
15214 zlog_warn("Deprecated option: ‘no ip extcommunity-list <(1-99)|(100-500)|standard|expanded> <deny|permit> <LINE|AA:NN>' being used");
15215 }
15216
15217 idx = 0;
15218 argv_find(argv, argc, "permit", &idx);
15219 argv_find(argv, argc, "deny", &idx);
15220
15221 if (idx) {
15222 direct = argv_find(argv, argc, "permit", &idx)
15223 ? COMMUNITY_PERMIT
15224 : COMMUNITY_DENY;
15225
15226 idx = 0;
15227 argv_find(argv, argc, "LINE", &idx);
15228 str = argv_concat(argv, argc, idx);
15229 }
15230
15231 idx = 0;
15232 argv_find(argv, argc, "(100-500)", &idx);
15233 argv_find(argv, argc, "WORD", &idx);
15234 cl_number_or_name = argv[idx]->arg;
15235
15236 int ret = extcommunity_list_unset(bgp_clist, cl_number_or_name, str,
15237 direct, style);
15238
15239 XFREE(MTYPE_TMP, str);
15240
15241 if (ret < 0) {
15242 community_list_perror(vty, ret);
15243 return CMD_WARNING_CONFIG_FAILED;
15244 }
15245
15246 return CMD_SUCCESS;
15247 }
15248
15249 ALIAS (no_extcommunity_list_expanded_all,
15250 no_ip_extcommunity_list_expanded_all_cmd,
15251 "no ip extcommunity-list <(100-500)|expanded WORD> <deny|permit> LINE...",
15252 NO_STR
15253 IP_STR
15254 EXTCOMMUNITY_LIST_STR
15255 "Extended Community list number (expanded)\n"
15256 "Specify expanded extcommunity-list\n"
15257 "Extended Community list name\n"
15258 "Specify community to reject\n"
15259 "Specify community to accept\n"
15260 "An ordered list as a regular-expression\n")
15261
15262 ALIAS(no_extcommunity_list_expanded_all,
15263 no_ip_extcommunity_list_expanded_all_list_cmd,
15264 "no ip extcommunity-list <(100-500)|expanded WORD>",
15265 NO_STR IP_STR EXTCOMMUNITY_LIST_STR
15266 "Extended Community list number (expanded)\n"
15267 "Specify expanded extcommunity-list\n"
15268 "Extended Community list name\n")
15269
15270 ALIAS(no_extcommunity_list_expanded_all,
15271 no_bgp_extcommunity_list_expanded_all_list_cmd,
15272 "no bgp extcommunity-list <(100-500)|expanded WORD>",
15273 NO_STR IP_STR EXTCOMMUNITY_LIST_STR
15274 "Extended Community list number (expanded)\n"
15275 "Specify expanded extcommunity-list\n"
15276 "Extended Community list name\n")
15277
15278 static void extcommunity_list_show(struct vty *vty, struct community_list *list)
15279 {
15280 struct community_entry *entry;
15281
15282 for (entry = list->head; entry; entry = entry->next) {
15283 if (entry == list->head) {
15284 if (all_digit(list->name))
15285 vty_out(vty, "Extended community %s list %s\n",
15286 entry->style == EXTCOMMUNITY_LIST_STANDARD
15287 ? "standard"
15288 : "(expanded) access",
15289 list->name);
15290 else
15291 vty_out(vty,
15292 "Named extended community %s list %s\n",
15293 entry->style == EXTCOMMUNITY_LIST_STANDARD
15294 ? "standard"
15295 : "expanded",
15296 list->name);
15297 }
15298 if (entry->any)
15299 vty_out(vty, " %s\n",
15300 community_direct_str(entry->direct));
15301 else
15302 vty_out(vty, " %s %s\n",
15303 community_direct_str(entry->direct),
15304 community_list_config_str(entry));
15305 }
15306 }
15307
15308 DEFUN (show_extcommunity_list,
15309 show_bgp_extcommunity_list_cmd,
15310 "show bgp extcommunity-list",
15311 SHOW_STR
15312 BGP_STR
15313 "List extended-community list\n")
15314 {
15315 struct community_list *list;
15316 struct community_list_master *cm;
15317 int idx = 0;
15318
15319 if (argv_find(argv, argc, "ip", &idx)) {
15320 vty_out(vty, "This config option is deprecated, and is scheduled for removal\n");
15321 vty_out(vty, "if you are using this please migrate to the below command.\n");
15322 vty_out(vty, "'show bgp extcommunity-list <(1-500)|WORD>'\n");
15323 zlog_warn("Deprecated option: 'ip show extcommunity-list <(1-500)|WORD>' being used");
15324 }
15325 cm = community_list_master_lookup(bgp_clist, EXTCOMMUNITY_LIST_MASTER);
15326 if (!cm)
15327 return CMD_SUCCESS;
15328
15329 for (list = cm->num.head; list; list = list->next)
15330 extcommunity_list_show(vty, list);
15331
15332 for (list = cm->str.head; list; list = list->next)
15333 extcommunity_list_show(vty, list);
15334
15335 return CMD_SUCCESS;
15336 }
15337
15338 ALIAS (show_extcommunity_list,
15339 show_ip_extcommunity_list_cmd,
15340 "show ip extcommunity-list",
15341 SHOW_STR
15342 IP_STR
15343 "List extended-community list\n")
15344
15345 DEFUN (show_extcommunity_list_arg,
15346 show_bgp_extcommunity_list_arg_cmd,
15347 "show bgp extcommunity-list <(1-500)|WORD>",
15348 SHOW_STR
15349 BGP_STR
15350 "List extended-community list\n"
15351 "Extcommunity-list number\n"
15352 "Extcommunity-list name\n")
15353 {
15354 int idx_comm_list = 3;
15355 struct community_list *list;
15356 int idx = 0;
15357
15358 if (argv_find(argv, argc, "ip", &idx)) {
15359 vty_out(vty, "This config option is deprecated, and is scheduled for removal.\n");
15360 vty_out(vty, "if you are using this please migrate to the below command.\n");
15361 vty_out(vty, "'show bgp extcommunity-list <(1-500)|WORD>'\n");
15362 zlog_warn("Deprecated option: 'ip show extcommunity-list <(1-500)|WORD>' being used");
15363 }
15364 list = community_list_lookup(bgp_clist, argv[idx_comm_list]->arg, 0,
15365 EXTCOMMUNITY_LIST_MASTER);
15366 if (!list) {
15367 vty_out(vty, "%% Can't find extcommunity-list\n");
15368 return CMD_WARNING;
15369 }
15370
15371 extcommunity_list_show(vty, list);
15372
15373 return CMD_SUCCESS;
15374 }
15375
15376 ALIAS (show_extcommunity_list_arg,
15377 show_ip_extcommunity_list_arg_cmd,
15378 "show ip extcommunity-list <(1-500)|WORD>",
15379 SHOW_STR
15380 IP_STR
15381 "List extended-community list\n"
15382 "Extcommunity-list number\n"
15383 "Extcommunity-list name\n")
15384
15385 /* Display community-list and extcommunity-list configuration. */
15386 static int community_list_config_write(struct vty *vty)
15387 {
15388 struct community_list *list;
15389 struct community_entry *entry;
15390 struct community_list_master *cm;
15391 int write = 0;
15392
15393 /* Community-list. */
15394 cm = community_list_master_lookup(bgp_clist, COMMUNITY_LIST_MASTER);
15395
15396 for (list = cm->num.head; list; list = list->next)
15397 for (entry = list->head; entry; entry = entry->next) {
15398 vty_out(vty, "bgp community-list %s %s %s\n", list->name,
15399 community_direct_str(entry->direct),
15400 community_list_config_str(entry));
15401 write++;
15402 }
15403 for (list = cm->str.head; list; list = list->next)
15404 for (entry = list->head; entry; entry = entry->next) {
15405 vty_out(vty, "bgp community-list %s %s %s %s\n",
15406 entry->style == COMMUNITY_LIST_STANDARD
15407 ? "standard"
15408 : "expanded",
15409 list->name, community_direct_str(entry->direct),
15410 community_list_config_str(entry));
15411 write++;
15412 }
15413
15414 /* Extcommunity-list. */
15415 cm = community_list_master_lookup(bgp_clist, EXTCOMMUNITY_LIST_MASTER);
15416
15417 for (list = cm->num.head; list; list = list->next)
15418 for (entry = list->head; entry; entry = entry->next) {
15419 vty_out(vty, "bgp extcommunity-list %s %s %s\n",
15420 list->name, community_direct_str(entry->direct),
15421 community_list_config_str(entry));
15422 write++;
15423 }
15424 for (list = cm->str.head; list; list = list->next)
15425 for (entry = list->head; entry; entry = entry->next) {
15426 vty_out(vty, "bgp extcommunity-list %s %s %s %s\n",
15427 entry->style == EXTCOMMUNITY_LIST_STANDARD
15428 ? "standard"
15429 : "expanded",
15430 list->name, community_direct_str(entry->direct),
15431 community_list_config_str(entry));
15432 write++;
15433 }
15434
15435
15436 /* lcommunity-list. */
15437 cm = community_list_master_lookup(bgp_clist,
15438 LARGE_COMMUNITY_LIST_MASTER);
15439
15440 for (list = cm->num.head; list; list = list->next)
15441 for (entry = list->head; entry; entry = entry->next) {
15442 vty_out(vty, "bgp large-community-list %s %s %s\n",
15443 list->name, community_direct_str(entry->direct),
15444 community_list_config_str(entry));
15445 write++;
15446 }
15447 for (list = cm->str.head; list; list = list->next)
15448 for (entry = list->head; entry; entry = entry->next) {
15449 vty_out(vty, "bgp large-community-list %s %s %s %s\n",
15450 entry->style == LARGE_COMMUNITY_LIST_STANDARD
15451 ? "standard"
15452 : "expanded",
15453 list->name, community_direct_str(entry->direct),
15454 community_list_config_str(entry));
15455 write++;
15456 }
15457
15458 return write;
15459 }
15460
15461 static struct cmd_node community_list_node = {
15462 COMMUNITY_LIST_NODE, "", 1 /* Export to vtysh. */
15463 };
15464
15465 static void community_list_vty(void)
15466 {
15467 install_node(&community_list_node, community_list_config_write);
15468
15469 /* Community-list. */
15470 install_element(CONFIG_NODE, &bgp_community_list_standard_cmd);
15471 install_element(CONFIG_NODE, &bgp_community_list_expanded_all_cmd);
15472 install_element(CONFIG_NODE, &no_bgp_community_list_standard_all_cmd);
15473 install_element(CONFIG_NODE, &no_bgp_community_list_standard_all_list_cmd);
15474 install_element(CONFIG_NODE, &no_bgp_community_list_expanded_all_cmd);
15475 install_element(CONFIG_NODE, &no_bgp_community_list_expanded_all_list_cmd);
15476 install_element(VIEW_NODE, &show_bgp_community_list_cmd);
15477 install_element(VIEW_NODE, &show_bgp_community_list_arg_cmd);
15478 install_element(CONFIG_NODE, &ip_community_list_standard_cmd);
15479 install_element(CONFIG_NODE, &ip_community_list_expanded_all_cmd);
15480 install_element(CONFIG_NODE, &no_ip_community_list_standard_all_cmd);
15481 install_element(CONFIG_NODE, &no_ip_community_list_standard_all_list_cmd);
15482 install_element(CONFIG_NODE, &no_ip_community_list_expanded_all_cmd);
15483 install_element(CONFIG_NODE, &no_ip_community_list_expanded_all_list_cmd);
15484 install_element(VIEW_NODE, &show_ip_community_list_cmd);
15485 install_element(VIEW_NODE, &show_ip_community_list_arg_cmd);
15486
15487 /* Extcommunity-list. */
15488 install_element(CONFIG_NODE, &bgp_extcommunity_list_standard_cmd);
15489 install_element(CONFIG_NODE, &bgp_extcommunity_list_name_expanded_cmd);
15490 install_element(CONFIG_NODE, &no_bgp_extcommunity_list_standard_all_cmd);
15491 install_element(CONFIG_NODE,
15492 &no_bgp_extcommunity_list_standard_all_list_cmd);
15493 install_element(CONFIG_NODE, &no_bgp_extcommunity_list_expanded_all_cmd);
15494 install_element(CONFIG_NODE,
15495 &no_bgp_extcommunity_list_expanded_all_list_cmd);
15496 install_element(VIEW_NODE, &show_bgp_extcommunity_list_cmd);
15497 install_element(VIEW_NODE, &show_bgp_extcommunity_list_arg_cmd);
15498 install_element(CONFIG_NODE, &ip_extcommunity_list_standard_cmd);
15499 install_element(CONFIG_NODE, &ip_extcommunity_list_name_expanded_cmd);
15500 install_element(CONFIG_NODE, &no_ip_extcommunity_list_standard_all_cmd);
15501 install_element(CONFIG_NODE, &no_ip_extcommunity_list_standard_all_list_cmd);
15502 install_element(CONFIG_NODE, &no_ip_extcommunity_list_expanded_all_cmd);
15503 install_element(CONFIG_NODE, &no_ip_extcommunity_list_expanded_all_list_cmd);
15504 install_element(VIEW_NODE, &show_ip_extcommunity_list_cmd);
15505 install_element(VIEW_NODE, &show_ip_extcommunity_list_arg_cmd);
15506
15507 /* Large Community List */
15508 install_element(CONFIG_NODE, &bgp_lcommunity_list_standard_cmd);
15509 install_element(CONFIG_NODE, &bgp_lcommunity_list_standard1_cmd);
15510 install_element(CONFIG_NODE, &bgp_lcommunity_list_expanded_cmd);
15511 install_element(CONFIG_NODE, &bgp_lcommunity_list_name_standard_cmd);
15512 install_element(CONFIG_NODE, &bgp_lcommunity_list_name_standard1_cmd);
15513 install_element(CONFIG_NODE, &bgp_lcommunity_list_name_expanded_cmd);
15514 install_element(CONFIG_NODE, &no_bgp_lcommunity_list_standard_all_cmd);
15515 install_element(CONFIG_NODE,
15516 &no_bgp_lcommunity_list_name_expanded_all_cmd);
15517 install_element(CONFIG_NODE, &no_bgp_lcommunity_list_standard_cmd);
15518 install_element(CONFIG_NODE, &no_bgp_lcommunity_list_expanded_cmd);
15519 install_element(CONFIG_NODE, &no_bgp_lcommunity_list_name_standard_cmd);
15520 install_element(CONFIG_NODE, &no_bgp_lcommunity_list_name_expanded_cmd);
15521 install_element(VIEW_NODE, &show_bgp_lcommunity_list_cmd);
15522 install_element(VIEW_NODE, &show_bgp_lcommunity_list_arg_cmd);
15523 install_element(CONFIG_NODE, &ip_lcommunity_list_standard_cmd);
15524 install_element(CONFIG_NODE, &ip_lcommunity_list_standard1_cmd);
15525 install_element(CONFIG_NODE, &ip_lcommunity_list_expanded_cmd);
15526 install_element(CONFIG_NODE, &ip_lcommunity_list_name_standard_cmd);
15527 install_element(CONFIG_NODE, &ip_lcommunity_list_name_standard1_cmd);
15528 install_element(CONFIG_NODE, &ip_lcommunity_list_name_expanded_cmd);
15529 install_element(CONFIG_NODE, &no_ip_lcommunity_list_standard_all_cmd);
15530 install_element(CONFIG_NODE,
15531 &no_ip_lcommunity_list_name_expanded_all_cmd);
15532 install_element(CONFIG_NODE, &no_ip_lcommunity_list_standard_cmd);
15533 install_element(CONFIG_NODE, &no_ip_lcommunity_list_expanded_cmd);
15534 install_element(CONFIG_NODE, &no_ip_lcommunity_list_name_standard_cmd);
15535 install_element(CONFIG_NODE, &no_ip_lcommunity_list_name_expanded_cmd);
15536 install_element(VIEW_NODE, &show_ip_lcommunity_list_cmd);
15537 install_element(VIEW_NODE, &show_ip_lcommunity_list_arg_cmd);
15538 }