]> git.proxmox.com Git - mirror_frr.git/blob - bgpd/bgp_vty.c
Merge pull request #5628 from donaldsharp/rtm_getneigh
[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_errors.h"
26 #include "lib/zclient.h"
27 #include "prefix.h"
28 #include "plist.h"
29 #include "buffer.h"
30 #include "linklist.h"
31 #include "stream.h"
32 #include "thread.h"
33 #include "log.h"
34 #include "memory.h"
35 #include "lib_vty.h"
36 #include "hash.h"
37 #include "queue.h"
38 #include "filter.h"
39 #include "frrstr.h"
40
41 #include "bgpd/bgpd.h"
42 #include "bgpd/bgp_attr_evpn.h"
43 #include "bgpd/bgp_advertise.h"
44 #include "bgpd/bgp_attr.h"
45 #include "bgpd/bgp_aspath.h"
46 #include "bgpd/bgp_community.h"
47 #include "bgpd/bgp_ecommunity.h"
48 #include "bgpd/bgp_lcommunity.h"
49 #include "bgpd/bgp_damp.h"
50 #include "bgpd/bgp_debug.h"
51 #include "bgpd/bgp_errors.h"
52 #include "bgpd/bgp_fsm.h"
53 #include "bgpd/bgp_nexthop.h"
54 #include "bgpd/bgp_open.h"
55 #include "bgpd/bgp_regex.h"
56 #include "bgpd/bgp_route.h"
57 #include "bgpd/bgp_mplsvpn.h"
58 #include "bgpd/bgp_zebra.h"
59 #include "bgpd/bgp_table.h"
60 #include "bgpd/bgp_vty.h"
61 #include "bgpd/bgp_mpath.h"
62 #include "bgpd/bgp_packet.h"
63 #include "bgpd/bgp_updgrp.h"
64 #include "bgpd/bgp_bfd.h"
65 #include "bgpd/bgp_io.h"
66 #include "bgpd/bgp_evpn.h"
67 #include "bgpd/bgp_evpn_vty.h"
68 #include "bgpd/bgp_addpath.h"
69 #include "bgpd/bgp_mac.h"
70 #include "bgpd/bgp_flowspec.h"
71 #if ENABLE_BGP_VNC
72 #include "bgpd/rfapi/bgp_rfapi_cfg.h"
73 #endif
74
75 FRR_CFG_DEFAULT_BOOL(BGP_IMPORT_CHECK,
76 { .val_long = true, .match_profile = "datacenter", },
77 { .val_long = false },
78 )
79 FRR_CFG_DEFAULT_BOOL(BGP_SHOW_HOSTNAME,
80 { .val_long = true, .match_profile = "datacenter", },
81 { .val_long = false },
82 )
83 FRR_CFG_DEFAULT_BOOL(BGP_LOG_NEIGHBOR_CHANGES,
84 { .val_long = true, .match_profile = "datacenter", },
85 { .val_long = false },
86 )
87 FRR_CFG_DEFAULT_BOOL(BGP_DETERMINISTIC_MED,
88 { .val_long = true, .match_profile = "datacenter", },
89 { .val_long = false },
90 )
91 FRR_CFG_DEFAULT_ULONG(BGP_CONNECT_RETRY,
92 { .val_ulong = 10, .match_profile = "datacenter", },
93 { .val_ulong = 120 },
94 )
95 FRR_CFG_DEFAULT_ULONG(BGP_HOLDTIME,
96 { .val_ulong = 9, .match_profile = "datacenter", },
97 { .val_ulong = 180 },
98 )
99 FRR_CFG_DEFAULT_ULONG(BGP_KEEPALIVE,
100 { .val_ulong = 3, .match_profile = "datacenter", },
101 { .val_ulong = 60 },
102 )
103
104 DEFINE_HOOK(bgp_inst_config_write,
105 (struct bgp *bgp, struct vty *vty),
106 (bgp, vty))
107
108 static struct peer_group *listen_range_exists(struct bgp *bgp,
109 struct prefix *range, int exact);
110
111 static enum node_type bgp_node_type(afi_t afi, safi_t safi)
112 {
113 switch (afi) {
114 case AFI_IP:
115 switch (safi) {
116 case SAFI_UNICAST:
117 return BGP_IPV4_NODE;
118 break;
119 case SAFI_MULTICAST:
120 return BGP_IPV4M_NODE;
121 break;
122 case SAFI_LABELED_UNICAST:
123 return BGP_IPV4L_NODE;
124 break;
125 case SAFI_MPLS_VPN:
126 return BGP_VPNV4_NODE;
127 break;
128 case SAFI_FLOWSPEC:
129 return BGP_FLOWSPECV4_NODE;
130 default:
131 /* not expected */
132 return BGP_IPV4_NODE;
133 break;
134 }
135 break;
136 case AFI_IP6:
137 switch (safi) {
138 case SAFI_UNICAST:
139 return BGP_IPV6_NODE;
140 break;
141 case SAFI_MULTICAST:
142 return BGP_IPV6M_NODE;
143 break;
144 case SAFI_LABELED_UNICAST:
145 return BGP_IPV6L_NODE;
146 break;
147 case SAFI_MPLS_VPN:
148 return BGP_VPNV6_NODE;
149 break;
150 case SAFI_FLOWSPEC:
151 return BGP_FLOWSPECV6_NODE;
152 default:
153 /* not expected */
154 return BGP_IPV4_NODE;
155 break;
156 }
157 break;
158 case AFI_L2VPN:
159 return BGP_EVPN_NODE;
160 break;
161 case AFI_UNSPEC:
162 case AFI_MAX:
163 // We should never be here but to clarify the switch statement..
164 return BGP_IPV4_NODE;
165 break;
166 }
167
168 // Impossible to happen
169 return BGP_IPV4_NODE;
170 }
171
172 static const char *get_afi_safi_vty_str(afi_t afi, safi_t safi)
173 {
174 if (afi == AFI_IP && safi == SAFI_UNICAST)
175 return "IPv4 Unicast";
176 else if (afi == AFI_IP && safi == SAFI_MULTICAST)
177 return "IPv4 Multicast";
178 else if (afi == AFI_IP && safi == SAFI_LABELED_UNICAST)
179 return "IPv4 Labeled Unicast";
180 else if (afi == AFI_IP && safi == SAFI_MPLS_VPN)
181 return "IPv4 VPN";
182 else if (afi == AFI_IP && safi == SAFI_ENCAP)
183 return "IPv4 Encap";
184 else if (afi == AFI_IP && safi == SAFI_FLOWSPEC)
185 return "IPv4 Flowspec";
186 else if (afi == AFI_IP6 && safi == SAFI_UNICAST)
187 return "IPv6 Unicast";
188 else if (afi == AFI_IP6 && safi == SAFI_MULTICAST)
189 return "IPv6 Multicast";
190 else if (afi == AFI_IP6 && safi == SAFI_LABELED_UNICAST)
191 return "IPv6 Labeled Unicast";
192 else if (afi == AFI_IP6 && safi == SAFI_MPLS_VPN)
193 return "IPv6 VPN";
194 else if (afi == AFI_IP6 && safi == SAFI_ENCAP)
195 return "IPv6 Encap";
196 else if (afi == AFI_IP6 && safi == SAFI_FLOWSPEC)
197 return "IPv6 Flowspec";
198 else if (afi == AFI_L2VPN && safi == SAFI_EVPN)
199 return "L2VPN EVPN";
200 else
201 return "Unknown";
202 }
203
204 /*
205 * Please note that we have intentionally camelCased
206 * the return strings here. So if you want
207 * to use this function, please ensure you
208 * are doing this within json output
209 */
210 static const char *get_afi_safi_json_str(afi_t afi, safi_t safi)
211 {
212 if (afi == AFI_IP && safi == SAFI_UNICAST)
213 return "ipv4Unicast";
214 else if (afi == AFI_IP && safi == SAFI_MULTICAST)
215 return "ipv4Multicast";
216 else if (afi == AFI_IP && safi == SAFI_LABELED_UNICAST)
217 return "ipv4LabeledUnicast";
218 else if (afi == AFI_IP && safi == SAFI_MPLS_VPN)
219 return "ipv4Vpn";
220 else if (afi == AFI_IP && safi == SAFI_ENCAP)
221 return "ipv4Encap";
222 else if (afi == AFI_IP && safi == SAFI_FLOWSPEC)
223 return "ipv4Flowspec";
224 else if (afi == AFI_IP6 && safi == SAFI_UNICAST)
225 return "ipv6Unicast";
226 else if (afi == AFI_IP6 && safi == SAFI_MULTICAST)
227 return "ipv6Multicast";
228 else if (afi == AFI_IP6 && safi == SAFI_LABELED_UNICAST)
229 return "ipv6LabeledUnicast";
230 else if (afi == AFI_IP6 && safi == SAFI_MPLS_VPN)
231 return "ipv6Vpn";
232 else if (afi == AFI_IP6 && safi == SAFI_ENCAP)
233 return "ipv6Encap";
234 else if (afi == AFI_IP6 && safi == SAFI_FLOWSPEC)
235 return "ipv6Flowspec";
236 else if (afi == AFI_L2VPN && safi == SAFI_EVPN)
237 return "l2VpnEvpn";
238 else
239 return "Unknown";
240 }
241
242 /* Utility function to get address family from current node. */
243 afi_t bgp_node_afi(struct vty *vty)
244 {
245 afi_t afi;
246 switch (vty->node) {
247 case BGP_IPV6_NODE:
248 case BGP_IPV6M_NODE:
249 case BGP_IPV6L_NODE:
250 case BGP_VPNV6_NODE:
251 case BGP_FLOWSPECV6_NODE:
252 afi = AFI_IP6;
253 break;
254 case BGP_EVPN_NODE:
255 afi = AFI_L2VPN;
256 break;
257 default:
258 afi = AFI_IP;
259 break;
260 }
261 return afi;
262 }
263
264 /* Utility function to get subsequent address family from current
265 node. */
266 safi_t bgp_node_safi(struct vty *vty)
267 {
268 safi_t safi;
269 switch (vty->node) {
270 case BGP_VPNV4_NODE:
271 case BGP_VPNV6_NODE:
272 safi = SAFI_MPLS_VPN;
273 break;
274 case BGP_IPV4M_NODE:
275 case BGP_IPV6M_NODE:
276 safi = SAFI_MULTICAST;
277 break;
278 case BGP_EVPN_NODE:
279 safi = SAFI_EVPN;
280 break;
281 case BGP_IPV4L_NODE:
282 case BGP_IPV6L_NODE:
283 safi = SAFI_LABELED_UNICAST;
284 break;
285 case BGP_FLOWSPECV4_NODE:
286 case BGP_FLOWSPECV6_NODE:
287 safi = SAFI_FLOWSPEC;
288 break;
289 default:
290 safi = SAFI_UNICAST;
291 break;
292 }
293 return safi;
294 }
295
296 /**
297 * Converts an AFI in string form to afi_t
298 *
299 * @param afi string, one of
300 * - "ipv4"
301 * - "ipv6"
302 * - "l2vpn"
303 * @return the corresponding afi_t
304 */
305 afi_t bgp_vty_afi_from_str(const char *afi_str)
306 {
307 afi_t afi = AFI_MAX; /* unknown */
308 if (strmatch(afi_str, "ipv4"))
309 afi = AFI_IP;
310 else if (strmatch(afi_str, "ipv6"))
311 afi = AFI_IP6;
312 else if (strmatch(afi_str, "l2vpn"))
313 afi = AFI_L2VPN;
314 return afi;
315 }
316
317 int argv_find_and_parse_afi(struct cmd_token **argv, int argc, int *index,
318 afi_t *afi)
319 {
320 int ret = 0;
321 if (argv_find(argv, argc, "ipv4", index)) {
322 ret = 1;
323 if (afi)
324 *afi = AFI_IP;
325 } else if (argv_find(argv, argc, "ipv6", index)) {
326 ret = 1;
327 if (afi)
328 *afi = AFI_IP6;
329 } else if (argv_find(argv, argc, "l2vpn", index)) {
330 ret = 1;
331 if (afi)
332 *afi = AFI_L2VPN;
333 }
334 return ret;
335 }
336
337 /* supports <unicast|multicast|vpn|labeled-unicast> */
338 safi_t bgp_vty_safi_from_str(const char *safi_str)
339 {
340 safi_t safi = SAFI_MAX; /* unknown */
341 if (strmatch(safi_str, "multicast"))
342 safi = SAFI_MULTICAST;
343 else if (strmatch(safi_str, "unicast"))
344 safi = SAFI_UNICAST;
345 else if (strmatch(safi_str, "vpn"))
346 safi = SAFI_MPLS_VPN;
347 else if (strmatch(safi_str, "evpn"))
348 safi = SAFI_EVPN;
349 else if (strmatch(safi_str, "labeled-unicast"))
350 safi = SAFI_LABELED_UNICAST;
351 else if (strmatch(safi_str, "flowspec"))
352 safi = SAFI_FLOWSPEC;
353 return safi;
354 }
355
356 int argv_find_and_parse_safi(struct cmd_token **argv, int argc, int *index,
357 safi_t *safi)
358 {
359 int ret = 0;
360 if (argv_find(argv, argc, "unicast", index)) {
361 ret = 1;
362 if (safi)
363 *safi = SAFI_UNICAST;
364 } else if (argv_find(argv, argc, "multicast", index)) {
365 ret = 1;
366 if (safi)
367 *safi = SAFI_MULTICAST;
368 } else if (argv_find(argv, argc, "labeled-unicast", index)) {
369 ret = 1;
370 if (safi)
371 *safi = SAFI_LABELED_UNICAST;
372 } else if (argv_find(argv, argc, "vpn", index)) {
373 ret = 1;
374 if (safi)
375 *safi = SAFI_MPLS_VPN;
376 } else if (argv_find(argv, argc, "evpn", index)) {
377 ret = 1;
378 if (safi)
379 *safi = SAFI_EVPN;
380 } else if (argv_find(argv, argc, "flowspec", index)) {
381 ret = 1;
382 if (safi)
383 *safi = SAFI_FLOWSPEC;
384 }
385 return ret;
386 }
387
388 int bgp_get_vty(struct bgp **bgp, as_t *as, const char *name,
389 enum bgp_instance_type inst_type)
390 {
391 int ret = bgp_get(bgp, as, name, inst_type);
392
393 if (ret == BGP_CREATED) {
394 bgp_timers_set(*bgp, DFLT_BGP_KEEPALIVE, DFLT_BGP_HOLDTIME,
395 DFLT_BGP_CONNECT_RETRY);
396
397 if (DFLT_BGP_IMPORT_CHECK)
398 bgp_flag_set(*bgp, BGP_FLAG_IMPORT_CHECK);
399 if (DFLT_BGP_SHOW_HOSTNAME)
400 bgp_flag_set(*bgp, BGP_FLAG_SHOW_HOSTNAME);
401 if (DFLT_BGP_LOG_NEIGHBOR_CHANGES)
402 bgp_flag_set(*bgp, BGP_FLAG_LOG_NEIGHBOR_CHANGES);
403 if (DFLT_BGP_DETERMINISTIC_MED)
404 bgp_flag_set(*bgp, BGP_FLAG_DETERMINISTIC_MED);
405
406 ret = BGP_SUCCESS;
407 }
408 return ret;
409 }
410
411 /*
412 * bgp_vty_find_and_parse_afi_safi_bgp
413 *
414 * For a given 'show ...' command, correctly parse the afi/safi/bgp out from it
415 * This function *assumes* that the calling function pre-sets the afi/safi/bgp
416 * to appropriate values for the calling function. This is to allow the
417 * calling function to make decisions appropriate for the show command
418 * that is being parsed.
419 *
420 * The show commands are generally of the form:
421 * "show [ip] bgp [<view|vrf> VIEWVRFNAME] [<ipv4|ipv6>
422 * [<unicast|multicast|vpn|labeled-unicast>]] ..."
423 *
424 * Since we use argv_find if the show command in particular doesn't have:
425 * [ip]
426 * [<view|vrf> VIEWVRFNAME]
427 * [<ipv4|ipv6> [<unicast|multicast|vpn|labeled-unicast>]]
428 * The command parsing should still be ok.
429 *
430 * vty -> The vty for the command so we can output some useful data in
431 * the event of a parse error in the vrf.
432 * argv -> The command tokens
433 * argc -> How many command tokens we have
434 * idx -> The current place in the command, generally should be 0 for this
435 * function
436 * afi -> The parsed afi if it was included in the show command, returned here
437 * safi -> The parsed safi if it was included in the show command, returned here
438 * bgp -> Pointer to the bgp data structure we need to fill in.
439 * use_json -> json is configured or not
440 *
441 * The function returns the correct location in the parse tree for the
442 * last token found.
443 *
444 * Returns 0 for failure to parse correctly, else the idx position of where
445 * it found the last token.
446 */
447 int bgp_vty_find_and_parse_afi_safi_bgp(struct vty *vty,
448 struct cmd_token **argv, int argc,
449 int *idx, afi_t *afi, safi_t *safi,
450 struct bgp **bgp, bool use_json)
451 {
452 char *vrf_name = NULL;
453
454 assert(afi);
455 assert(safi);
456 assert(bgp);
457
458 if (argv_find(argv, argc, "ip", idx))
459 *afi = AFI_IP;
460
461 if (argv_find(argv, argc, "view", idx))
462 vrf_name = argv[*idx + 1]->arg;
463 else if (argv_find(argv, argc, "vrf", idx)) {
464 vrf_name = argv[*idx + 1]->arg;
465 if (strmatch(vrf_name, VRF_DEFAULT_NAME))
466 vrf_name = NULL;
467 }
468 if (vrf_name) {
469 if (strmatch(vrf_name, "all"))
470 *bgp = NULL;
471 else {
472 *bgp = bgp_lookup_by_name(vrf_name);
473 if (!*bgp) {
474 if (use_json) {
475 json_object *json = NULL;
476 json = json_object_new_object();
477 json_object_string_add(
478 json, "warning",
479 "View/Vrf is unknown");
480 vty_out(vty, "%s\n",
481 json_object_to_json_string_ext(json,
482 JSON_C_TO_STRING_PRETTY));
483 json_object_free(json);
484 }
485 else
486 vty_out(vty, "View/Vrf %s is unknown\n",
487 vrf_name);
488 *idx = 0;
489 return 0;
490 }
491 }
492 } else {
493 *bgp = bgp_get_default();
494 if (!*bgp) {
495 if (use_json) {
496 json_object *json = NULL;
497 json = json_object_new_object();
498 json_object_string_add(
499 json, "warning",
500 "Default BGP instance not found");
501 vty_out(vty, "%s\n",
502 json_object_to_json_string_ext(json,
503 JSON_C_TO_STRING_PRETTY));
504 json_object_free(json);
505 }
506 else
507 vty_out(vty,
508 "Default BGP instance not found\n");
509 *idx = 0;
510 return 0;
511 }
512 }
513
514 if (argv_find_and_parse_afi(argv, argc, idx, afi))
515 argv_find_and_parse_safi(argv, argc, idx, safi);
516
517 *idx += 1;
518 return *idx;
519 }
520
521 static int peer_address_self_check(struct bgp *bgp, union sockunion *su)
522 {
523 struct interface *ifp = NULL;
524
525 if (su->sa.sa_family == AF_INET)
526 ifp = if_lookup_by_ipv4_exact(&su->sin.sin_addr, bgp->vrf_id);
527 else if (su->sa.sa_family == AF_INET6)
528 ifp = if_lookup_by_ipv6_exact(&su->sin6.sin6_addr,
529 su->sin6.sin6_scope_id,
530 bgp->vrf_id);
531
532 if (ifp)
533 return 1;
534
535 return 0;
536 }
537
538 /* Utility function for looking up peer from VTY. */
539 /* This is used only for configuration, so disallow if attempted on
540 * a dynamic neighbor.
541 */
542 static struct peer *peer_lookup_vty(struct vty *vty, const char *ip_str)
543 {
544 struct bgp *bgp = VTY_GET_CONTEXT(bgp);
545 int ret;
546 union sockunion su;
547 struct peer *peer;
548
549 if (!bgp) {
550 return NULL;
551 }
552
553 ret = str2sockunion(ip_str, &su);
554 if (ret < 0) {
555 peer = peer_lookup_by_conf_if(bgp, ip_str);
556 if (!peer) {
557 if ((peer = peer_lookup_by_hostname(bgp, ip_str))
558 == NULL) {
559 vty_out(vty,
560 "%% Malformed address or name: %s\n",
561 ip_str);
562 return NULL;
563 }
564 }
565 } else {
566 peer = peer_lookup(bgp, &su);
567 if (!peer) {
568 vty_out(vty,
569 "%% Specify remote-as or peer-group commands first\n");
570 return NULL;
571 }
572 if (peer_dynamic_neighbor(peer)) {
573 vty_out(vty,
574 "%% Operation not allowed on a dynamic neighbor\n");
575 return NULL;
576 }
577 }
578 return peer;
579 }
580
581 /* Utility function for looking up peer or peer group. */
582 /* This is used only for configuration, so disallow if attempted on
583 * a dynamic neighbor.
584 */
585 struct peer *peer_and_group_lookup_vty(struct vty *vty, const char *peer_str)
586 {
587 struct bgp *bgp = VTY_GET_CONTEXT(bgp);
588 int ret;
589 union sockunion su;
590 struct peer *peer = NULL;
591 struct peer_group *group = NULL;
592
593 if (!bgp) {
594 return NULL;
595 }
596
597 ret = str2sockunion(peer_str, &su);
598 if (ret == 0) {
599 /* IP address, locate peer. */
600 peer = peer_lookup(bgp, &su);
601 } else {
602 /* Not IP, could match either peer configured on interface or a
603 * group. */
604 peer = peer_lookup_by_conf_if(bgp, peer_str);
605 if (!peer)
606 group = peer_group_lookup(bgp, peer_str);
607 }
608
609 if (peer) {
610 if (peer_dynamic_neighbor(peer)) {
611 vty_out(vty,
612 "%% Operation not allowed on a dynamic neighbor\n");
613 return NULL;
614 }
615
616 return peer;
617 }
618
619 if (group)
620 return group->conf;
621
622 vty_out(vty, "%% Specify remote-as or peer-group commands first\n");
623
624 return NULL;
625 }
626
627 int bgp_vty_return(struct vty *vty, int ret)
628 {
629 const char *str = NULL;
630
631 switch (ret) {
632 case BGP_ERR_INVALID_VALUE:
633 str = "Invalid value";
634 break;
635 case BGP_ERR_INVALID_FLAG:
636 str = "Invalid flag";
637 break;
638 case BGP_ERR_PEER_GROUP_SHUTDOWN:
639 str = "Peer-group has been shutdown. Activate the peer-group first";
640 break;
641 case BGP_ERR_PEER_FLAG_CONFLICT:
642 str = "Can't set override-capability and strict-capability-match at the same time";
643 break;
644 case BGP_ERR_PEER_GROUP_NO_REMOTE_AS:
645 str = "Specify remote-as or peer-group remote AS first";
646 break;
647 case BGP_ERR_PEER_GROUP_CANT_CHANGE:
648 str = "Cannot change the peer-group. Deconfigure first";
649 break;
650 case BGP_ERR_PEER_GROUP_MISMATCH:
651 str = "Peer is not a member of this peer-group";
652 break;
653 case BGP_ERR_PEER_FILTER_CONFLICT:
654 str = "Prefix/distribute list can not co-exist";
655 break;
656 case BGP_ERR_NOT_INTERNAL_PEER:
657 str = "Invalid command. Not an internal neighbor";
658 break;
659 case BGP_ERR_REMOVE_PRIVATE_AS:
660 str = "remove-private-AS cannot be configured for IBGP peers";
661 break;
662 case BGP_ERR_LOCAL_AS_ALLOWED_ONLY_FOR_EBGP:
663 str = "Local-AS allowed only for EBGP peers";
664 break;
665 case BGP_ERR_CANNOT_HAVE_LOCAL_AS_SAME_AS:
666 str = "Cannot have local-as same as BGP AS number";
667 break;
668 case BGP_ERR_TCPSIG_FAILED:
669 str = "Error while applying TCP-Sig to session(s)";
670 break;
671 case BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK:
672 str = "ebgp-multihop and ttl-security cannot be configured together";
673 break;
674 case BGP_ERR_NO_IBGP_WITH_TTLHACK:
675 str = "ttl-security only allowed for EBGP peers";
676 break;
677 case BGP_ERR_AS_OVERRIDE:
678 str = "as-override cannot be configured for IBGP peers";
679 break;
680 case BGP_ERR_INVALID_DYNAMIC_NEIGHBORS_LIMIT:
681 str = "Invalid limit for number of dynamic neighbors";
682 break;
683 case BGP_ERR_DYNAMIC_NEIGHBORS_RANGE_EXISTS:
684 str = "Dynamic neighbor listen range already exists";
685 break;
686 case BGP_ERR_INVALID_FOR_DYNAMIC_PEER:
687 str = "Operation not allowed on a dynamic neighbor";
688 break;
689 case BGP_ERR_INVALID_FOR_DIRECT_PEER:
690 str = "Operation not allowed on a directly connected neighbor";
691 break;
692 case BGP_ERR_PEER_SAFI_CONFLICT:
693 str = "Cannot activate peer for both 'ipv4 unicast' and 'ipv4 labeled-unicast'";
694 break;
695 }
696 if (str) {
697 vty_out(vty, "%% %s\n", str);
698 return CMD_WARNING_CONFIG_FAILED;
699 }
700 return CMD_SUCCESS;
701 }
702
703 /* BGP clear sort. */
704 enum clear_sort {
705 clear_all,
706 clear_peer,
707 clear_group,
708 clear_external,
709 clear_as
710 };
711
712 static void bgp_clear_vty_error(struct vty *vty, struct peer *peer, afi_t afi,
713 safi_t safi, int error)
714 {
715 switch (error) {
716 case BGP_ERR_AF_UNCONFIGURED:
717 vty_out(vty,
718 "%%BGP: Enable %s address family for the neighbor %s\n",
719 get_afi_safi_str(afi, safi, false), peer->host);
720 break;
721 case BGP_ERR_SOFT_RECONFIG_UNCONFIGURED:
722 vty_out(vty,
723 "%%BGP: Inbound soft reconfig for %s not possible as it\n has neither refresh capability, nor inbound soft reconfig\n",
724 peer->host);
725 break;
726 default:
727 break;
728 }
729 }
730
731 static int bgp_peer_clear(struct peer *peer, afi_t afi, safi_t safi,
732 struct listnode *nnode, enum bgp_clear_type stype)
733 {
734 int ret = 0;
735
736 /* if afi/.safi not specified, spin thru all of them */
737 if ((afi == AFI_UNSPEC) && (safi == SAFI_UNSPEC)) {
738 afi_t tmp_afi;
739 safi_t tmp_safi;
740
741 FOREACH_AFI_SAFI (tmp_afi, tmp_safi) {
742 if (!peer->afc[tmp_afi][tmp_safi])
743 continue;
744
745 if (stype == BGP_CLEAR_SOFT_NONE)
746 ret = peer_clear(peer, &nnode);
747 else
748 ret = peer_clear_soft(peer, tmp_afi, tmp_safi,
749 stype);
750 }
751 /* if afi specified and safi not, spin thru safis on this afi */
752 } else if (safi == SAFI_UNSPEC) {
753 safi_t tmp_safi;
754
755 for (tmp_safi = SAFI_UNICAST;
756 tmp_safi < SAFI_MAX; tmp_safi++) {
757 if (!peer->afc[afi][tmp_safi])
758 continue;
759
760 if (stype == BGP_CLEAR_SOFT_NONE)
761 ret = peer_clear(peer, &nnode);
762 else
763 ret = peer_clear_soft(peer, afi,
764 tmp_safi, stype);
765 }
766 /* both afi/safi specified, let the caller know if not defined */
767 } else {
768 if (!peer->afc[afi][safi])
769 return 1;
770
771 if (stype == BGP_CLEAR_SOFT_NONE)
772 ret = peer_clear(peer, &nnode);
773 else
774 ret = peer_clear_soft(peer, afi, safi, stype);
775 }
776
777 return ret;
778 }
779
780 /* `clear ip bgp' functions. */
781 static int bgp_clear(struct vty *vty, struct bgp *bgp, afi_t afi, safi_t safi,
782 enum clear_sort sort, enum bgp_clear_type stype,
783 const char *arg)
784 {
785 int ret = 0;
786 bool found = false;
787 struct peer *peer;
788 struct listnode *node, *nnode;
789
790 /* Clear all neighbors. */
791 /*
792 * Pass along pointer to next node to peer_clear() when walking all
793 * nodes on the BGP instance as that may get freed if it is a
794 * doppelganger
795 */
796 if (sort == clear_all) {
797 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
798 ret = bgp_peer_clear(peer, afi, safi, nnode,
799 stype);
800
801 if (ret < 0)
802 bgp_clear_vty_error(vty, peer, afi, safi, ret);
803 }
804
805 /* This is to apply read-only mode on this clear. */
806 if (stype == BGP_CLEAR_SOFT_NONE)
807 bgp->update_delay_over = 0;
808
809 return CMD_SUCCESS;
810 }
811
812 /* Clear specified neighbor. */
813 if (sort == clear_peer) {
814 union sockunion su;
815
816 /* Make sockunion for lookup. */
817 ret = str2sockunion(arg, &su);
818 if (ret < 0) {
819 peer = peer_lookup_by_conf_if(bgp, arg);
820 if (!peer) {
821 peer = peer_lookup_by_hostname(bgp, arg);
822 if (!peer) {
823 vty_out(vty,
824 "Malformed address or name: %s\n",
825 arg);
826 return CMD_WARNING;
827 }
828 }
829 } else {
830 peer = peer_lookup(bgp, &su);
831 if (!peer) {
832 vty_out(vty,
833 "%%BGP: Unknown neighbor - \"%s\"\n",
834 arg);
835 return CMD_WARNING;
836 }
837 }
838
839 ret = bgp_peer_clear(peer, afi, safi, NULL, stype);
840
841 /* if afi/safi not defined for this peer, let caller know */
842 if (ret == 1)
843 ret = BGP_ERR_AF_UNCONFIGURED;
844
845 if (ret < 0)
846 bgp_clear_vty_error(vty, peer, afi, safi, ret);
847
848 return CMD_SUCCESS;
849 }
850
851 /* Clear all neighbors belonging to a specific peer-group. */
852 if (sort == clear_group) {
853 struct peer_group *group;
854
855 group = peer_group_lookup(bgp, arg);
856 if (!group) {
857 vty_out(vty, "%%BGP: No such peer-group %s\n", arg);
858 return CMD_WARNING;
859 }
860
861 for (ALL_LIST_ELEMENTS(group->peer, node, nnode, peer)) {
862 ret = bgp_peer_clear(peer, afi, safi, nnode, stype);
863
864 if (ret < 0)
865 bgp_clear_vty_error(vty, peer, afi, safi, ret);
866 else
867 found = true;
868 }
869
870 if (!found)
871 vty_out(vty,
872 "%%BGP: No %s peer belonging to peer-group %s is configured\n",
873 get_afi_safi_str(afi, safi, false), arg);
874
875 return CMD_SUCCESS;
876 }
877
878 /* Clear all external (eBGP) neighbors. */
879 if (sort == clear_external) {
880 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
881 if (peer->sort == BGP_PEER_IBGP)
882 continue;
883
884 ret = bgp_peer_clear(peer, afi, safi, nnode, stype);
885
886 if (ret < 0)
887 bgp_clear_vty_error(vty, peer, afi, safi, ret);
888 else
889 found = true;
890 }
891
892 if (!found)
893 vty_out(vty,
894 "%%BGP: No external %s peer is configured\n",
895 get_afi_safi_str(afi, safi, false));
896
897 return CMD_SUCCESS;
898 }
899
900 /* Clear all neighbors belonging to a specific AS. */
901 if (sort == clear_as) {
902 as_t as = strtoul(arg, NULL, 10);
903
904 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
905 if (peer->as != as)
906 continue;
907
908 ret = bgp_peer_clear(peer, afi, safi, nnode, stype);
909
910 if (ret < 0)
911 bgp_clear_vty_error(vty, peer, afi, safi, ret);
912 else
913 found = true;
914 }
915
916 if (!found)
917 vty_out(vty,
918 "%%BGP: No %s peer is configured with AS %s\n",
919 get_afi_safi_str(afi, safi, false), arg);
920
921 return CMD_SUCCESS;
922 }
923
924 return CMD_SUCCESS;
925 }
926
927 static int bgp_clear_vty(struct vty *vty, const char *name, afi_t afi,
928 safi_t safi, enum clear_sort sort,
929 enum bgp_clear_type stype, const char *arg)
930 {
931 struct bgp *bgp;
932
933 /* BGP structure lookup. */
934 if (name) {
935 bgp = bgp_lookup_by_name(name);
936 if (bgp == NULL) {
937 vty_out(vty, "Can't find BGP instance %s\n", name);
938 return CMD_WARNING;
939 }
940 } else {
941 bgp = bgp_get_default();
942 if (bgp == NULL) {
943 vty_out(vty, "No BGP process is configured\n");
944 return CMD_WARNING;
945 }
946 }
947
948 return bgp_clear(vty, bgp, afi, safi, sort, stype, arg);
949 }
950
951 /* clear soft inbound */
952 static void bgp_clear_star_soft_in(struct vty *vty, const char *name)
953 {
954 afi_t afi;
955 safi_t safi;
956
957 FOREACH_AFI_SAFI (afi, safi)
958 bgp_clear_vty(vty, name, afi, safi, clear_all,
959 BGP_CLEAR_SOFT_IN, NULL);
960 }
961
962 /* clear soft outbound */
963 static void bgp_clear_star_soft_out(struct vty *vty, const char *name)
964 {
965 afi_t afi;
966 safi_t safi;
967
968 FOREACH_AFI_SAFI (afi, safi)
969 bgp_clear_vty(vty, name, afi, safi, clear_all,
970 BGP_CLEAR_SOFT_OUT, NULL);
971 }
972
973
974 #ifndef VTYSH_EXTRACT_PL
975 #include "bgpd/bgp_vty_clippy.c"
976 #endif
977
978 DEFUN_HIDDEN (bgp_local_mac,
979 bgp_local_mac_cmd,
980 "bgp local-mac vni " CMD_VNI_RANGE " mac WORD seq (0-4294967295)",
981 BGP_STR
982 "Local MAC config\n"
983 "VxLAN Network Identifier\n"
984 "VNI number\n"
985 "local mac\n"
986 "mac address\n"
987 "mac-mobility sequence\n"
988 "seq number\n")
989 {
990 int rv;
991 vni_t vni;
992 struct ethaddr mac;
993 struct ipaddr ip;
994 uint32_t seq;
995 struct bgp *bgp;
996
997 vni = strtoul(argv[3]->arg, NULL, 10);
998 if (!prefix_str2mac(argv[5]->arg, &mac)) {
999 vty_out(vty, "%% Malformed MAC address\n");
1000 return CMD_WARNING;
1001 }
1002 memset(&ip, 0, sizeof(ip));
1003 seq = strtoul(argv[7]->arg, NULL, 10);
1004
1005 bgp = bgp_get_default();
1006 if (!bgp) {
1007 vty_out(vty, "Default BGP instance is not there\n");
1008 return CMD_WARNING;
1009 }
1010
1011 rv = bgp_evpn_local_macip_add(bgp, vni, &mac, &ip, 0 /* flags */, seq);
1012 if (rv < 0) {
1013 vty_out(vty, "Internal error\n");
1014 return CMD_WARNING;
1015 }
1016
1017 return CMD_SUCCESS;
1018 }
1019
1020 DEFUN_HIDDEN (no_bgp_local_mac,
1021 no_bgp_local_mac_cmd,
1022 "no bgp local-mac vni " CMD_VNI_RANGE " mac WORD",
1023 NO_STR
1024 BGP_STR
1025 "Local MAC config\n"
1026 "VxLAN Network Identifier\n"
1027 "VNI number\n"
1028 "local mac\n"
1029 "mac address\n")
1030 {
1031 int rv;
1032 vni_t vni;
1033 struct ethaddr mac;
1034 struct ipaddr ip;
1035 struct bgp *bgp;
1036
1037 vni = strtoul(argv[4]->arg, NULL, 10);
1038 if (!prefix_str2mac(argv[6]->arg, &mac)) {
1039 vty_out(vty, "%% Malformed MAC address\n");
1040 return CMD_WARNING;
1041 }
1042 memset(&ip, 0, sizeof(ip));
1043
1044 bgp = bgp_get_default();
1045 if (!bgp) {
1046 vty_out(vty, "Default BGP instance is not there\n");
1047 return CMD_WARNING;
1048 }
1049
1050 rv = bgp_evpn_local_macip_del(bgp, vni, &mac, &ip, ZEBRA_NEIGH_ACTIVE);
1051 if (rv < 0) {
1052 vty_out(vty, "Internal error\n");
1053 return CMD_WARNING;
1054 }
1055
1056 return CMD_SUCCESS;
1057 }
1058
1059 DEFUN (no_synchronization,
1060 no_synchronization_cmd,
1061 "no synchronization",
1062 NO_STR
1063 "Perform IGP synchronization\n")
1064 {
1065 return CMD_SUCCESS;
1066 }
1067
1068 DEFUN (no_auto_summary,
1069 no_auto_summary_cmd,
1070 "no auto-summary",
1071 NO_STR
1072 "Enable automatic network number summarization\n")
1073 {
1074 return CMD_SUCCESS;
1075 }
1076
1077 /* "router bgp" commands. */
1078 DEFUN_NOSH (router_bgp,
1079 router_bgp_cmd,
1080 "router bgp [(1-4294967295)$instasn [<view|vrf> VIEWVRFNAME]]",
1081 ROUTER_STR
1082 BGP_STR
1083 AS_STR
1084 BGP_INSTANCE_HELP_STR)
1085 {
1086 int idx_asn = 2;
1087 int idx_view_vrf = 3;
1088 int idx_vrf = 4;
1089 int is_new_bgp = 0;
1090 int ret;
1091 as_t as;
1092 struct bgp *bgp;
1093 const char *name = NULL;
1094 enum bgp_instance_type inst_type;
1095
1096 // "router bgp" without an ASN
1097 if (argc == 2) {
1098 // Pending: Make VRF option available for ASN less config
1099 bgp = bgp_get_default();
1100
1101 if (bgp == NULL) {
1102 vty_out(vty, "%% No BGP process is configured\n");
1103 return CMD_WARNING_CONFIG_FAILED;
1104 }
1105
1106 if (listcount(bm->bgp) > 1) {
1107 vty_out(vty, "%% Please specify ASN and VRF\n");
1108 return CMD_WARNING_CONFIG_FAILED;
1109 }
1110 }
1111
1112 // "router bgp X"
1113 else {
1114 as = strtoul(argv[idx_asn]->arg, NULL, 10);
1115
1116 inst_type = BGP_INSTANCE_TYPE_DEFAULT;
1117 if (argc > 3) {
1118 name = argv[idx_vrf]->arg;
1119
1120 if (!strcmp(argv[idx_view_vrf]->text, "vrf")) {
1121 if (strmatch(name, VRF_DEFAULT_NAME))
1122 name = NULL;
1123 else
1124 inst_type = BGP_INSTANCE_TYPE_VRF;
1125 } else if (!strcmp(argv[idx_view_vrf]->text, "view"))
1126 inst_type = BGP_INSTANCE_TYPE_VIEW;
1127 }
1128
1129 if (inst_type == BGP_INSTANCE_TYPE_DEFAULT)
1130 is_new_bgp = (bgp_lookup(as, name) == NULL);
1131
1132 ret = bgp_get_vty(&bgp, &as, name, inst_type);
1133 switch (ret) {
1134 case BGP_ERR_AS_MISMATCH:
1135 vty_out(vty, "BGP is already running; AS is %u\n", as);
1136 return CMD_WARNING_CONFIG_FAILED;
1137 case BGP_ERR_INSTANCE_MISMATCH:
1138 vty_out(vty,
1139 "BGP instance name and AS number mismatch\n");
1140 vty_out(vty,
1141 "BGP instance is already running; AS is %u\n",
1142 as);
1143 return CMD_WARNING_CONFIG_FAILED;
1144 }
1145
1146 /*
1147 * If we just instantiated the default instance, complete
1148 * any pending VRF-VPN leaking that was configured via
1149 * earlier "router bgp X vrf FOO" blocks.
1150 */
1151 if (is_new_bgp && inst_type == BGP_INSTANCE_TYPE_DEFAULT)
1152 vpn_leak_postchange_all();
1153
1154 if (inst_type == BGP_INSTANCE_TYPE_VRF)
1155 bgp_vpn_leak_export(bgp);
1156 /* Pending: handle when user tries to change a view to vrf n vv.
1157 */
1158 }
1159
1160 /* unset the auto created flag as the user config is now present */
1161 UNSET_FLAG(bgp->vrf_flags, BGP_VRF_AUTO);
1162 VTY_PUSH_CONTEXT(BGP_NODE, bgp);
1163
1164 return CMD_SUCCESS;
1165 }
1166
1167 /* "no router bgp" commands. */
1168 DEFUN (no_router_bgp,
1169 no_router_bgp_cmd,
1170 "no router bgp [(1-4294967295)$instasn [<view|vrf> VIEWVRFNAME]]",
1171 NO_STR
1172 ROUTER_STR
1173 BGP_STR
1174 AS_STR
1175 BGP_INSTANCE_HELP_STR)
1176 {
1177 int idx_asn = 3;
1178 int idx_vrf = 5;
1179 as_t as;
1180 struct bgp *bgp;
1181 const char *name = NULL;
1182
1183 // "no router bgp" without an ASN
1184 if (argc == 3) {
1185 // Pending: Make VRF option available for ASN less config
1186 bgp = bgp_get_default();
1187
1188 if (bgp == NULL) {
1189 vty_out(vty, "%% No BGP process is configured\n");
1190 return CMD_WARNING_CONFIG_FAILED;
1191 }
1192
1193 if (listcount(bm->bgp) > 1) {
1194 vty_out(vty, "%% Please specify ASN and VRF\n");
1195 return CMD_WARNING_CONFIG_FAILED;
1196 }
1197
1198 if (bgp->l3vni) {
1199 vty_out(vty, "%% Please unconfigure l3vni %u",
1200 bgp->l3vni);
1201 return CMD_WARNING_CONFIG_FAILED;
1202 }
1203 } else {
1204 as = strtoul(argv[idx_asn]->arg, NULL, 10);
1205
1206 if (argc > 4)
1207 name = argv[idx_vrf]->arg;
1208
1209 /* Lookup bgp structure. */
1210 bgp = bgp_lookup(as, name);
1211 if (!bgp) {
1212 vty_out(vty, "%% Can't find BGP instance\n");
1213 return CMD_WARNING_CONFIG_FAILED;
1214 }
1215
1216 if (bgp->l3vni) {
1217 vty_out(vty, "%% Please unconfigure l3vni %u\n",
1218 bgp->l3vni);
1219 return CMD_WARNING_CONFIG_FAILED;
1220 }
1221
1222 /* Cannot delete default instance if vrf instances exist */
1223 if (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT) {
1224 struct listnode *node;
1225 struct bgp *tmp_bgp;
1226
1227 for (ALL_LIST_ELEMENTS_RO(bm->bgp, node, tmp_bgp)) {
1228 if (tmp_bgp->inst_type
1229 == BGP_INSTANCE_TYPE_VRF) {
1230 vty_out(vty,
1231 "%% Cannot delete default BGP instance. Dependent VRF instances exist\n");
1232 return CMD_WARNING_CONFIG_FAILED;
1233 }
1234 }
1235 }
1236 }
1237
1238 if (bgp_vpn_leak_unimport(bgp, vty))
1239 return CMD_WARNING_CONFIG_FAILED;
1240
1241 bgp_delete(bgp);
1242
1243 return CMD_SUCCESS;
1244 }
1245
1246
1247 /* BGP router-id. */
1248
1249 DEFPY (bgp_router_id,
1250 bgp_router_id_cmd,
1251 "bgp router-id A.B.C.D",
1252 BGP_STR
1253 "Override configured router identifier\n"
1254 "Manually configured router identifier\n")
1255 {
1256 VTY_DECLVAR_CONTEXT(bgp, bgp);
1257 bgp_router_id_static_set(bgp, router_id);
1258 return CMD_SUCCESS;
1259 }
1260
1261 DEFPY (no_bgp_router_id,
1262 no_bgp_router_id_cmd,
1263 "no bgp router-id [A.B.C.D]",
1264 NO_STR
1265 BGP_STR
1266 "Override configured router identifier\n"
1267 "Manually configured router identifier\n")
1268 {
1269 VTY_DECLVAR_CONTEXT(bgp, bgp);
1270
1271 if (router_id_str) {
1272 if (!IPV4_ADDR_SAME(&bgp->router_id_static, &router_id)) {
1273 vty_out(vty, "%% BGP router-id doesn't match\n");
1274 return CMD_WARNING_CONFIG_FAILED;
1275 }
1276 }
1277
1278 router_id.s_addr = 0;
1279 bgp_router_id_static_set(bgp, router_id);
1280
1281 return CMD_SUCCESS;
1282 }
1283
1284
1285 /* BGP Cluster ID. */
1286 DEFUN (bgp_cluster_id,
1287 bgp_cluster_id_cmd,
1288 "bgp cluster-id <A.B.C.D|(1-4294967295)>",
1289 BGP_STR
1290 "Configure Route-Reflector Cluster-id\n"
1291 "Route-Reflector Cluster-id in IP address format\n"
1292 "Route-Reflector Cluster-id as 32 bit quantity\n")
1293 {
1294 VTY_DECLVAR_CONTEXT(bgp, bgp);
1295 int idx_ipv4 = 2;
1296 int ret;
1297 struct in_addr cluster;
1298
1299 ret = inet_aton(argv[idx_ipv4]->arg, &cluster);
1300 if (!ret) {
1301 vty_out(vty, "%% Malformed bgp cluster identifier\n");
1302 return CMD_WARNING_CONFIG_FAILED;
1303 }
1304
1305 bgp_cluster_id_set(bgp, &cluster);
1306 bgp_clear_star_soft_out(vty, bgp->name);
1307
1308 return CMD_SUCCESS;
1309 }
1310
1311 DEFUN (no_bgp_cluster_id,
1312 no_bgp_cluster_id_cmd,
1313 "no bgp cluster-id [<A.B.C.D|(1-4294967295)>]",
1314 NO_STR
1315 BGP_STR
1316 "Configure Route-Reflector Cluster-id\n"
1317 "Route-Reflector Cluster-id in IP address format\n"
1318 "Route-Reflector Cluster-id as 32 bit quantity\n")
1319 {
1320 VTY_DECLVAR_CONTEXT(bgp, bgp);
1321 bgp_cluster_id_unset(bgp);
1322 bgp_clear_star_soft_out(vty, bgp->name);
1323
1324 return CMD_SUCCESS;
1325 }
1326
1327 DEFUN (bgp_confederation_identifier,
1328 bgp_confederation_identifier_cmd,
1329 "bgp confederation identifier (1-4294967295)",
1330 "BGP specific commands\n"
1331 "AS confederation parameters\n"
1332 "AS number\n"
1333 "Set routing domain confederation AS\n")
1334 {
1335 VTY_DECLVAR_CONTEXT(bgp, bgp);
1336 int idx_number = 3;
1337 as_t as;
1338
1339 as = strtoul(argv[idx_number]->arg, NULL, 10);
1340
1341 bgp_confederation_id_set(bgp, as);
1342
1343 return CMD_SUCCESS;
1344 }
1345
1346 DEFUN (no_bgp_confederation_identifier,
1347 no_bgp_confederation_identifier_cmd,
1348 "no bgp confederation identifier [(1-4294967295)]",
1349 NO_STR
1350 "BGP specific commands\n"
1351 "AS confederation parameters\n"
1352 "AS number\n"
1353 "Set routing domain confederation AS\n")
1354 {
1355 VTY_DECLVAR_CONTEXT(bgp, bgp);
1356 bgp_confederation_id_unset(bgp);
1357
1358 return CMD_SUCCESS;
1359 }
1360
1361 DEFUN (bgp_confederation_peers,
1362 bgp_confederation_peers_cmd,
1363 "bgp confederation peers (1-4294967295)...",
1364 "BGP specific commands\n"
1365 "AS confederation parameters\n"
1366 "Peer ASs in BGP confederation\n"
1367 AS_STR)
1368 {
1369 VTY_DECLVAR_CONTEXT(bgp, bgp);
1370 int idx_asn = 3;
1371 as_t as;
1372 int i;
1373
1374 for (i = idx_asn; i < argc; i++) {
1375 as = strtoul(argv[i]->arg, NULL, 10);
1376
1377 if (bgp->as == as) {
1378 vty_out(vty,
1379 "%% Local member-AS not allowed in confed peer list\n");
1380 continue;
1381 }
1382
1383 bgp_confederation_peers_add(bgp, as);
1384 }
1385 return CMD_SUCCESS;
1386 }
1387
1388 DEFUN (no_bgp_confederation_peers,
1389 no_bgp_confederation_peers_cmd,
1390 "no bgp confederation peers (1-4294967295)...",
1391 NO_STR
1392 "BGP specific commands\n"
1393 "AS confederation parameters\n"
1394 "Peer ASs in BGP confederation\n"
1395 AS_STR)
1396 {
1397 VTY_DECLVAR_CONTEXT(bgp, bgp);
1398 int idx_asn = 4;
1399 as_t as;
1400 int i;
1401
1402 for (i = idx_asn; i < argc; i++) {
1403 as = strtoul(argv[i]->arg, NULL, 10);
1404
1405 bgp_confederation_peers_remove(bgp, as);
1406 }
1407 return CMD_SUCCESS;
1408 }
1409
1410 /**
1411 * Central routine for maximum-paths configuration.
1412 * @peer_type: BGP_PEER_EBGP or BGP_PEER_IBGP
1413 * @set: 1 for setting values, 0 for removing the max-paths config.
1414 */
1415 static int bgp_maxpaths_config_vty(struct vty *vty, int peer_type,
1416 const char *mpaths, uint16_t options,
1417 int set)
1418 {
1419 VTY_DECLVAR_CONTEXT(bgp, bgp);
1420 uint16_t maxpaths = 0;
1421 int ret;
1422 afi_t afi;
1423 safi_t safi;
1424
1425 afi = bgp_node_afi(vty);
1426 safi = bgp_node_safi(vty);
1427
1428 if (set) {
1429 maxpaths = strtol(mpaths, NULL, 10);
1430 if (maxpaths > multipath_num) {
1431 vty_out(vty,
1432 "%% Maxpaths Specified: %d is > than multipath num specified on bgp command line %d",
1433 maxpaths, multipath_num);
1434 return CMD_WARNING_CONFIG_FAILED;
1435 }
1436 ret = bgp_maximum_paths_set(bgp, afi, safi, peer_type, maxpaths,
1437 options);
1438 } else
1439 ret = bgp_maximum_paths_unset(bgp, afi, safi, peer_type);
1440
1441 if (ret < 0) {
1442 vty_out(vty,
1443 "%% Failed to %sset maximum-paths %s %u for afi %u, safi %u\n",
1444 (set == 1) ? "" : "un",
1445 (peer_type == BGP_PEER_EBGP) ? "ebgp" : "ibgp",
1446 maxpaths, afi, safi);
1447 return CMD_WARNING_CONFIG_FAILED;
1448 }
1449
1450 bgp_recalculate_all_bestpaths(bgp);
1451
1452 return CMD_SUCCESS;
1453 }
1454
1455 DEFUN (bgp_maxmed_admin,
1456 bgp_maxmed_admin_cmd,
1457 "bgp max-med administrative ",
1458 BGP_STR
1459 "Advertise routes with max-med\n"
1460 "Administratively applied, for an indefinite period\n")
1461 {
1462 VTY_DECLVAR_CONTEXT(bgp, bgp);
1463
1464 bgp->v_maxmed_admin = 1;
1465 bgp->maxmed_admin_value = BGP_MAXMED_VALUE_DEFAULT;
1466
1467 bgp_maxmed_update(bgp);
1468
1469 return CMD_SUCCESS;
1470 }
1471
1472 DEFUN (bgp_maxmed_admin_medv,
1473 bgp_maxmed_admin_medv_cmd,
1474 "bgp max-med administrative (0-4294967295)",
1475 BGP_STR
1476 "Advertise routes with max-med\n"
1477 "Administratively applied, for an indefinite period\n"
1478 "Max MED value to be used\n")
1479 {
1480 VTY_DECLVAR_CONTEXT(bgp, bgp);
1481 int idx_number = 3;
1482
1483 bgp->v_maxmed_admin = 1;
1484 bgp->maxmed_admin_value = strtoul(argv[idx_number]->arg, NULL, 10);
1485
1486 bgp_maxmed_update(bgp);
1487
1488 return CMD_SUCCESS;
1489 }
1490
1491 DEFUN (no_bgp_maxmed_admin,
1492 no_bgp_maxmed_admin_cmd,
1493 "no bgp max-med administrative [(0-4294967295)]",
1494 NO_STR
1495 BGP_STR
1496 "Advertise routes with max-med\n"
1497 "Administratively applied, for an indefinite period\n"
1498 "Max MED value to be used\n")
1499 {
1500 VTY_DECLVAR_CONTEXT(bgp, bgp);
1501 bgp->v_maxmed_admin = BGP_MAXMED_ADMIN_UNCONFIGURED;
1502 bgp->maxmed_admin_value = BGP_MAXMED_VALUE_DEFAULT;
1503 bgp_maxmed_update(bgp);
1504
1505 return CMD_SUCCESS;
1506 }
1507
1508 DEFUN (bgp_maxmed_onstartup,
1509 bgp_maxmed_onstartup_cmd,
1510 "bgp max-med on-startup (5-86400) [(0-4294967295)]",
1511 BGP_STR
1512 "Advertise routes with max-med\n"
1513 "Effective on a startup\n"
1514 "Time (seconds) period for max-med\n"
1515 "Max MED value to be used\n")
1516 {
1517 VTY_DECLVAR_CONTEXT(bgp, bgp);
1518 int idx = 0;
1519
1520 argv_find(argv, argc, "(5-86400)", &idx);
1521 bgp->v_maxmed_onstartup = strtoul(argv[idx]->arg, NULL, 10);
1522 if (argv_find(argv, argc, "(0-4294967295)", &idx))
1523 bgp->maxmed_onstartup_value = strtoul(argv[idx]->arg, NULL, 10);
1524 else
1525 bgp->maxmed_onstartup_value = BGP_MAXMED_VALUE_DEFAULT;
1526
1527 bgp_maxmed_update(bgp);
1528
1529 return CMD_SUCCESS;
1530 }
1531
1532 DEFUN (no_bgp_maxmed_onstartup,
1533 no_bgp_maxmed_onstartup_cmd,
1534 "no bgp max-med on-startup [(5-86400) [(0-4294967295)]]",
1535 NO_STR
1536 BGP_STR
1537 "Advertise routes with max-med\n"
1538 "Effective on a startup\n"
1539 "Time (seconds) period for max-med\n"
1540 "Max MED value to be used\n")
1541 {
1542 VTY_DECLVAR_CONTEXT(bgp, bgp);
1543
1544 /* Cancel max-med onstartup if its on */
1545 if (bgp->t_maxmed_onstartup) {
1546 THREAD_TIMER_OFF(bgp->t_maxmed_onstartup);
1547 bgp->maxmed_onstartup_over = 1;
1548 }
1549
1550 bgp->v_maxmed_onstartup = BGP_MAXMED_ONSTARTUP_UNCONFIGURED;
1551 bgp->maxmed_onstartup_value = BGP_MAXMED_VALUE_DEFAULT;
1552
1553 bgp_maxmed_update(bgp);
1554
1555 return CMD_SUCCESS;
1556 }
1557
1558 static int bgp_update_delay_config_vty(struct vty *vty, const char *delay,
1559 const char *wait)
1560 {
1561 VTY_DECLVAR_CONTEXT(bgp, bgp);
1562 uint16_t update_delay;
1563 uint16_t establish_wait;
1564
1565 update_delay = strtoul(delay, NULL, 10);
1566
1567 if (!wait) /* update-delay <delay> */
1568 {
1569 bgp->v_update_delay = update_delay;
1570 bgp->v_establish_wait = bgp->v_update_delay;
1571 return CMD_SUCCESS;
1572 }
1573
1574 /* update-delay <delay> <establish-wait> */
1575 establish_wait = atoi(wait);
1576 if (update_delay < establish_wait) {
1577 vty_out(vty,
1578 "%%Failed: update-delay less than the establish-wait!\n");
1579 return CMD_WARNING_CONFIG_FAILED;
1580 }
1581
1582 bgp->v_update_delay = update_delay;
1583 bgp->v_establish_wait = establish_wait;
1584
1585 return CMD_SUCCESS;
1586 }
1587
1588 static int bgp_update_delay_deconfig_vty(struct vty *vty)
1589 {
1590 VTY_DECLVAR_CONTEXT(bgp, bgp);
1591
1592 bgp->v_update_delay = BGP_UPDATE_DELAY_DEF;
1593 bgp->v_establish_wait = bgp->v_update_delay;
1594
1595 return CMD_SUCCESS;
1596 }
1597
1598 void bgp_config_write_update_delay(struct vty *vty, struct bgp *bgp)
1599 {
1600 if (bgp->v_update_delay != BGP_UPDATE_DELAY_DEF) {
1601 vty_out(vty, " update-delay %d", bgp->v_update_delay);
1602 if (bgp->v_update_delay != bgp->v_establish_wait)
1603 vty_out(vty, " %d", bgp->v_establish_wait);
1604 vty_out(vty, "\n");
1605 }
1606 }
1607
1608
1609 /* Update-delay configuration */
1610 DEFUN (bgp_update_delay,
1611 bgp_update_delay_cmd,
1612 "update-delay (0-3600)",
1613 "Force initial delay for best-path and updates\n"
1614 "Seconds\n")
1615 {
1616 int idx_number = 1;
1617 return bgp_update_delay_config_vty(vty, argv[idx_number]->arg, NULL);
1618 }
1619
1620 DEFUN (bgp_update_delay_establish_wait,
1621 bgp_update_delay_establish_wait_cmd,
1622 "update-delay (0-3600) (1-3600)",
1623 "Force initial delay for best-path and updates\n"
1624 "Seconds\n"
1625 "Seconds\n")
1626 {
1627 int idx_number = 1;
1628 int idx_number_2 = 2;
1629 return bgp_update_delay_config_vty(vty, argv[idx_number]->arg,
1630 argv[idx_number_2]->arg);
1631 }
1632
1633 /* Update-delay deconfiguration */
1634 DEFUN (no_bgp_update_delay,
1635 no_bgp_update_delay_cmd,
1636 "no update-delay [(0-3600) [(1-3600)]]",
1637 NO_STR
1638 "Force initial delay for best-path and updates\n"
1639 "Seconds\n"
1640 "Seconds\n")
1641 {
1642 return bgp_update_delay_deconfig_vty(vty);
1643 }
1644
1645
1646 static int bgp_wpkt_quanta_config_vty(struct vty *vty, uint32_t quanta,
1647 bool set)
1648 {
1649 VTY_DECLVAR_CONTEXT(bgp, bgp);
1650
1651 quanta = set ? quanta : BGP_WRITE_PACKET_MAX;
1652 atomic_store_explicit(&bgp->wpkt_quanta, quanta, memory_order_relaxed);
1653
1654 return CMD_SUCCESS;
1655 }
1656
1657 static int bgp_rpkt_quanta_config_vty(struct vty *vty, uint32_t quanta,
1658 bool set)
1659 {
1660 VTY_DECLVAR_CONTEXT(bgp, bgp);
1661
1662 quanta = set ? quanta : BGP_READ_PACKET_MAX;
1663 atomic_store_explicit(&bgp->rpkt_quanta, quanta, memory_order_relaxed);
1664
1665 return CMD_SUCCESS;
1666 }
1667
1668 void bgp_config_write_wpkt_quanta(struct vty *vty, struct bgp *bgp)
1669 {
1670 uint32_t quanta =
1671 atomic_load_explicit(&bgp->wpkt_quanta, memory_order_relaxed);
1672 if (quanta != BGP_WRITE_PACKET_MAX)
1673 vty_out(vty, " write-quanta %d\n", quanta);
1674 }
1675
1676 void bgp_config_write_rpkt_quanta(struct vty *vty, struct bgp *bgp)
1677 {
1678 uint32_t quanta =
1679 atomic_load_explicit(&bgp->rpkt_quanta, memory_order_relaxed);
1680 if (quanta != BGP_READ_PACKET_MAX)
1681 vty_out(vty, " read-quanta %d\n", quanta);
1682 }
1683
1684 /* Packet quanta configuration
1685 *
1686 * XXX: The value set here controls the size of a stack buffer in the IO
1687 * thread. When changing these limits be careful to prevent stack overflow.
1688 *
1689 * Furthermore, the maximums used here should correspond to
1690 * BGP_WRITE_PACKET_MAX and BGP_READ_PACKET_MAX.
1691 */
1692 DEFPY (bgp_wpkt_quanta,
1693 bgp_wpkt_quanta_cmd,
1694 "[no] write-quanta (1-64)$quanta",
1695 NO_STR
1696 "How many packets to write to peer socket per run\n"
1697 "Number of packets\n")
1698 {
1699 return bgp_wpkt_quanta_config_vty(vty, quanta, !no);
1700 }
1701
1702 DEFPY (bgp_rpkt_quanta,
1703 bgp_rpkt_quanta_cmd,
1704 "[no] read-quanta (1-10)$quanta",
1705 NO_STR
1706 "How many packets to read from peer socket per I/O cycle\n"
1707 "Number of packets\n")
1708 {
1709 return bgp_rpkt_quanta_config_vty(vty, quanta, !no);
1710 }
1711
1712 void bgp_config_write_coalesce_time(struct vty *vty, struct bgp *bgp)
1713 {
1714 if (!bgp->heuristic_coalesce)
1715 vty_out(vty, " coalesce-time %u\n", bgp->coalesce_time);
1716 }
1717
1718
1719 DEFUN (bgp_coalesce_time,
1720 bgp_coalesce_time_cmd,
1721 "coalesce-time (0-4294967295)",
1722 "Subgroup coalesce timer\n"
1723 "Subgroup coalesce timer value (in ms)\n")
1724 {
1725 VTY_DECLVAR_CONTEXT(bgp, bgp);
1726
1727 int idx = 0;
1728 argv_find(argv, argc, "(0-4294967295)", &idx);
1729 bgp->heuristic_coalesce = false;
1730 bgp->coalesce_time = strtoul(argv[idx]->arg, NULL, 10);
1731 return CMD_SUCCESS;
1732 }
1733
1734 DEFUN (no_bgp_coalesce_time,
1735 no_bgp_coalesce_time_cmd,
1736 "no coalesce-time (0-4294967295)",
1737 NO_STR
1738 "Subgroup coalesce timer\n"
1739 "Subgroup coalesce timer value (in ms)\n")
1740 {
1741 VTY_DECLVAR_CONTEXT(bgp, bgp);
1742
1743 bgp->heuristic_coalesce = true;
1744 bgp->coalesce_time = BGP_DEFAULT_SUBGROUP_COALESCE_TIME;
1745 return CMD_SUCCESS;
1746 }
1747
1748 /* Maximum-paths configuration */
1749 DEFUN (bgp_maxpaths,
1750 bgp_maxpaths_cmd,
1751 "maximum-paths " CMD_RANGE_STR(1, MULTIPATH_NUM),
1752 "Forward packets over multiple paths\n"
1753 "Number of paths\n")
1754 {
1755 int idx_number = 1;
1756 return bgp_maxpaths_config_vty(vty, BGP_PEER_EBGP,
1757 argv[idx_number]->arg, 0, 1);
1758 }
1759
1760 ALIAS_HIDDEN(bgp_maxpaths, bgp_maxpaths_hidden_cmd,
1761 "maximum-paths " CMD_RANGE_STR(1, MULTIPATH_NUM),
1762 "Forward packets over multiple paths\n"
1763 "Number of paths\n")
1764
1765 DEFUN (bgp_maxpaths_ibgp,
1766 bgp_maxpaths_ibgp_cmd,
1767 "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM),
1768 "Forward packets over multiple paths\n"
1769 "iBGP-multipath\n"
1770 "Number of paths\n")
1771 {
1772 int idx_number = 2;
1773 return bgp_maxpaths_config_vty(vty, BGP_PEER_IBGP,
1774 argv[idx_number]->arg, 0, 1);
1775 }
1776
1777 ALIAS_HIDDEN(bgp_maxpaths_ibgp, bgp_maxpaths_ibgp_hidden_cmd,
1778 "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM),
1779 "Forward packets over multiple paths\n"
1780 "iBGP-multipath\n"
1781 "Number of paths\n")
1782
1783 DEFUN (bgp_maxpaths_ibgp_cluster,
1784 bgp_maxpaths_ibgp_cluster_cmd,
1785 "maximum-paths ibgp " CMD_RANGE_STR(1, MULTIPATH_NUM) " equal-cluster-length",
1786 "Forward packets over multiple paths\n"
1787 "iBGP-multipath\n"
1788 "Number of paths\n"
1789 "Match the cluster length\n")
1790 {
1791 int idx_number = 2;
1792 return bgp_maxpaths_config_vty(
1793 vty, BGP_PEER_IBGP, argv[idx_number]->arg,
1794 BGP_FLAG_IBGP_MULTIPATH_SAME_CLUSTERLEN, 1);
1795 }
1796
1797 ALIAS_HIDDEN(bgp_maxpaths_ibgp_cluster, bgp_maxpaths_ibgp_cluster_hidden_cmd,
1798 "maximum-paths ibgp " CMD_RANGE_STR(
1799 1, MULTIPATH_NUM) " equal-cluster-length",
1800 "Forward packets over multiple paths\n"
1801 "iBGP-multipath\n"
1802 "Number of paths\n"
1803 "Match the cluster length\n")
1804
1805 DEFUN (no_bgp_maxpaths,
1806 no_bgp_maxpaths_cmd,
1807 "no maximum-paths [" CMD_RANGE_STR(1, MULTIPATH_NUM) "]",
1808 NO_STR
1809 "Forward packets over multiple paths\n"
1810 "Number of paths\n")
1811 {
1812 return bgp_maxpaths_config_vty(vty, BGP_PEER_EBGP, NULL, 0, 0);
1813 }
1814
1815 ALIAS_HIDDEN(no_bgp_maxpaths, no_bgp_maxpaths_hidden_cmd,
1816 "no maximum-paths [" CMD_RANGE_STR(1, MULTIPATH_NUM) "]", NO_STR
1817 "Forward packets over multiple paths\n"
1818 "Number of paths\n")
1819
1820 DEFUN (no_bgp_maxpaths_ibgp,
1821 no_bgp_maxpaths_ibgp_cmd,
1822 "no maximum-paths ibgp [" CMD_RANGE_STR(1, MULTIPATH_NUM) " [equal-cluster-length]]",
1823 NO_STR
1824 "Forward packets over multiple paths\n"
1825 "iBGP-multipath\n"
1826 "Number of paths\n"
1827 "Match the cluster length\n")
1828 {
1829 return bgp_maxpaths_config_vty(vty, BGP_PEER_IBGP, NULL, 0, 0);
1830 }
1831
1832 ALIAS_HIDDEN(no_bgp_maxpaths_ibgp, no_bgp_maxpaths_ibgp_hidden_cmd,
1833 "no maximum-paths ibgp [" CMD_RANGE_STR(
1834 1, MULTIPATH_NUM) " [equal-cluster-length]]",
1835 NO_STR
1836 "Forward packets over multiple paths\n"
1837 "iBGP-multipath\n"
1838 "Number of paths\n"
1839 "Match the cluster length\n")
1840
1841 static void bgp_config_write_maxpaths(struct vty *vty, struct bgp *bgp,
1842 afi_t afi, safi_t safi)
1843 {
1844 if (bgp->maxpaths[afi][safi].maxpaths_ebgp != MULTIPATH_NUM) {
1845 vty_out(vty, " maximum-paths %d\n",
1846 bgp->maxpaths[afi][safi].maxpaths_ebgp);
1847 }
1848
1849 if (bgp->maxpaths[afi][safi].maxpaths_ibgp != MULTIPATH_NUM) {
1850 vty_out(vty, " maximum-paths ibgp %d",
1851 bgp->maxpaths[afi][safi].maxpaths_ibgp);
1852 if (CHECK_FLAG(bgp->maxpaths[afi][safi].ibgp_flags,
1853 BGP_FLAG_IBGP_MULTIPATH_SAME_CLUSTERLEN))
1854 vty_out(vty, " equal-cluster-length");
1855 vty_out(vty, "\n");
1856 }
1857 }
1858
1859 /* BGP timers. */
1860
1861 DEFUN (bgp_timers,
1862 bgp_timers_cmd,
1863 "timers bgp (0-65535) (0-65535)",
1864 "Adjust routing timers\n"
1865 "BGP timers\n"
1866 "Keepalive interval\n"
1867 "Holdtime\n")
1868 {
1869 VTY_DECLVAR_CONTEXT(bgp, bgp);
1870 int idx_number = 2;
1871 int idx_number_2 = 3;
1872 unsigned long keepalive = 0;
1873 unsigned long holdtime = 0;
1874
1875 keepalive = strtoul(argv[idx_number]->arg, NULL, 10);
1876 holdtime = strtoul(argv[idx_number_2]->arg, NULL, 10);
1877
1878 /* Holdtime value check. */
1879 if (holdtime < 3 && holdtime != 0) {
1880 vty_out(vty,
1881 "%% hold time value must be either 0 or greater than 3\n");
1882 return CMD_WARNING_CONFIG_FAILED;
1883 }
1884
1885 bgp_timers_set(bgp, keepalive, holdtime, DFLT_BGP_CONNECT_RETRY);
1886
1887 return CMD_SUCCESS;
1888 }
1889
1890 DEFUN (no_bgp_timers,
1891 no_bgp_timers_cmd,
1892 "no timers bgp [(0-65535) (0-65535)]",
1893 NO_STR
1894 "Adjust routing timers\n"
1895 "BGP timers\n"
1896 "Keepalive interval\n"
1897 "Holdtime\n")
1898 {
1899 VTY_DECLVAR_CONTEXT(bgp, bgp);
1900 bgp_timers_set(bgp, DFLT_BGP_KEEPALIVE, DFLT_BGP_HOLDTIME,
1901 DFLT_BGP_CONNECT_RETRY);
1902
1903 return CMD_SUCCESS;
1904 }
1905
1906
1907 DEFUN (bgp_client_to_client_reflection,
1908 bgp_client_to_client_reflection_cmd,
1909 "bgp client-to-client reflection",
1910 "BGP specific commands\n"
1911 "Configure client to client route reflection\n"
1912 "reflection of routes allowed\n")
1913 {
1914 VTY_DECLVAR_CONTEXT(bgp, bgp);
1915 bgp_flag_unset(bgp, BGP_FLAG_NO_CLIENT_TO_CLIENT);
1916 bgp_clear_star_soft_out(vty, bgp->name);
1917
1918 return CMD_SUCCESS;
1919 }
1920
1921 DEFUN (no_bgp_client_to_client_reflection,
1922 no_bgp_client_to_client_reflection_cmd,
1923 "no bgp client-to-client reflection",
1924 NO_STR
1925 "BGP specific commands\n"
1926 "Configure client to client route reflection\n"
1927 "reflection of routes allowed\n")
1928 {
1929 VTY_DECLVAR_CONTEXT(bgp, bgp);
1930 bgp_flag_set(bgp, BGP_FLAG_NO_CLIENT_TO_CLIENT);
1931 bgp_clear_star_soft_out(vty, bgp->name);
1932
1933 return CMD_SUCCESS;
1934 }
1935
1936 /* "bgp always-compare-med" configuration. */
1937 DEFUN (bgp_always_compare_med,
1938 bgp_always_compare_med_cmd,
1939 "bgp always-compare-med",
1940 "BGP specific commands\n"
1941 "Allow comparing MED from different neighbors\n")
1942 {
1943 VTY_DECLVAR_CONTEXT(bgp, bgp);
1944 bgp_flag_set(bgp, BGP_FLAG_ALWAYS_COMPARE_MED);
1945 bgp_recalculate_all_bestpaths(bgp);
1946
1947 return CMD_SUCCESS;
1948 }
1949
1950 DEFUN (no_bgp_always_compare_med,
1951 no_bgp_always_compare_med_cmd,
1952 "no bgp always-compare-med",
1953 NO_STR
1954 "BGP specific commands\n"
1955 "Allow comparing MED from different neighbors\n")
1956 {
1957 VTY_DECLVAR_CONTEXT(bgp, bgp);
1958 bgp_flag_unset(bgp, BGP_FLAG_ALWAYS_COMPARE_MED);
1959 bgp_recalculate_all_bestpaths(bgp);
1960
1961 return CMD_SUCCESS;
1962 }
1963
1964
1965 DEFUN(bgp_ebgp_requires_policy, bgp_ebgp_requires_policy_cmd,
1966 "bgp ebgp-requires-policy",
1967 "BGP specific commands\n"
1968 "Require in and out policy for eBGP peers (RFC8212)\n")
1969 {
1970 VTY_DECLVAR_CONTEXT(bgp, bgp);
1971 bgp->ebgp_requires_policy = DEFAULT_EBGP_POLICY_ENABLED;
1972 return CMD_SUCCESS;
1973 }
1974
1975 DEFUN(no_bgp_ebgp_requires_policy, no_bgp_ebgp_requires_policy_cmd,
1976 "no bgp ebgp-requires-policy",
1977 NO_STR
1978 "BGP specific commands\n"
1979 "Require in and out policy for eBGP peers (RFC8212)\n")
1980 {
1981 VTY_DECLVAR_CONTEXT(bgp, bgp);
1982 bgp->ebgp_requires_policy = DEFAULT_EBGP_POLICY_DISABLED;
1983 return CMD_SUCCESS;
1984 }
1985
1986 DEFUN(bgp_reject_as_sets, bgp_reject_as_sets_cmd,
1987 "bgp reject-as-sets",
1988 "BGP specific commands\n"
1989 "Reject routes with AS_SET or AS_CONFED_SET flag\n")
1990 {
1991 VTY_DECLVAR_CONTEXT(bgp, bgp);
1992 struct listnode *node, *nnode;
1993 struct peer *peer;
1994
1995 bgp->reject_as_sets = BGP_REJECT_AS_SETS_ENABLED;
1996
1997 /* Reset existing BGP sessions to reject routes
1998 * with aspath containing AS_SET or AS_CONFED_SET.
1999 */
2000 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
2001 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status)) {
2002 peer->last_reset = PEER_DOWN_AS_SETS_REJECT;
2003 bgp_notify_send(peer, BGP_NOTIFY_CEASE,
2004 BGP_NOTIFY_CEASE_CONFIG_CHANGE);
2005 }
2006 }
2007
2008 return CMD_SUCCESS;
2009 }
2010
2011 DEFUN(no_bgp_reject_as_sets, no_bgp_reject_as_sets_cmd,
2012 "no bgp reject-as-sets",
2013 NO_STR
2014 "BGP specific commands\n"
2015 "Reject routes with AS_SET or AS_CONFED_SET flag\n")
2016 {
2017 VTY_DECLVAR_CONTEXT(bgp, bgp);
2018 struct listnode *node, *nnode;
2019 struct peer *peer;
2020
2021 bgp->reject_as_sets = BGP_REJECT_AS_SETS_DISABLED;
2022
2023 /* Reset existing BGP sessions to reject routes
2024 * with aspath containing AS_SET or AS_CONFED_SET.
2025 */
2026 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
2027 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status)) {
2028 peer->last_reset = PEER_DOWN_AS_SETS_REJECT;
2029 bgp_notify_send(peer, BGP_NOTIFY_CEASE,
2030 BGP_NOTIFY_CEASE_CONFIG_CHANGE);
2031 }
2032 }
2033
2034 return CMD_SUCCESS;
2035 }
2036
2037 /* "bgp deterministic-med" configuration. */
2038 DEFUN (bgp_deterministic_med,
2039 bgp_deterministic_med_cmd,
2040 "bgp deterministic-med",
2041 "BGP specific commands\n"
2042 "Pick the best-MED path among paths advertised from the neighboring AS\n")
2043 {
2044 VTY_DECLVAR_CONTEXT(bgp, bgp);
2045
2046 if (!bgp_flag_check(bgp, BGP_FLAG_DETERMINISTIC_MED)) {
2047 bgp_flag_set(bgp, BGP_FLAG_DETERMINISTIC_MED);
2048 bgp_recalculate_all_bestpaths(bgp);
2049 }
2050
2051 return CMD_SUCCESS;
2052 }
2053
2054 DEFUN (no_bgp_deterministic_med,
2055 no_bgp_deterministic_med_cmd,
2056 "no bgp deterministic-med",
2057 NO_STR
2058 "BGP specific commands\n"
2059 "Pick the best-MED path among paths advertised from the neighboring AS\n")
2060 {
2061 VTY_DECLVAR_CONTEXT(bgp, bgp);
2062 int bestpath_per_as_used;
2063 afi_t afi;
2064 safi_t safi;
2065 struct peer *peer;
2066 struct listnode *node, *nnode;
2067
2068 if (bgp_flag_check(bgp, BGP_FLAG_DETERMINISTIC_MED)) {
2069 bestpath_per_as_used = 0;
2070
2071 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
2072 FOREACH_AFI_SAFI (afi, safi)
2073 if (bgp_addpath_dmed_required(
2074 peer->addpath_type[afi][safi])) {
2075 bestpath_per_as_used = 1;
2076 break;
2077 }
2078
2079 if (bestpath_per_as_used)
2080 break;
2081 }
2082
2083 if (bestpath_per_as_used) {
2084 vty_out(vty,
2085 "bgp deterministic-med cannot be disabled while addpath-tx-bestpath-per-AS is in use\n");
2086 return CMD_WARNING_CONFIG_FAILED;
2087 } else {
2088 bgp_flag_unset(bgp, BGP_FLAG_DETERMINISTIC_MED);
2089 bgp_recalculate_all_bestpaths(bgp);
2090 }
2091 }
2092
2093 return CMD_SUCCESS;
2094 }
2095
2096 /* "bgp graceful-restart" configuration. */
2097 DEFUN (bgp_graceful_restart,
2098 bgp_graceful_restart_cmd,
2099 "bgp graceful-restart",
2100 "BGP specific commands\n"
2101 "Graceful restart capability parameters\n")
2102 {
2103 VTY_DECLVAR_CONTEXT(bgp, bgp);
2104 bgp_flag_set(bgp, BGP_FLAG_GRACEFUL_RESTART);
2105 return CMD_SUCCESS;
2106 }
2107
2108 DEFUN (no_bgp_graceful_restart,
2109 no_bgp_graceful_restart_cmd,
2110 "no bgp graceful-restart",
2111 NO_STR
2112 "BGP specific commands\n"
2113 "Graceful restart capability parameters\n")
2114 {
2115 VTY_DECLVAR_CONTEXT(bgp, bgp);
2116 bgp_flag_unset(bgp, BGP_FLAG_GRACEFUL_RESTART);
2117 return CMD_SUCCESS;
2118 }
2119
2120 DEFUN (bgp_graceful_restart_stalepath_time,
2121 bgp_graceful_restart_stalepath_time_cmd,
2122 "bgp graceful-restart stalepath-time (1-4095)",
2123 "BGP specific commands\n"
2124 "Graceful restart capability parameters\n"
2125 "Set the max time to hold onto restarting peer's stale paths\n"
2126 "Delay value (seconds)\n")
2127 {
2128 VTY_DECLVAR_CONTEXT(bgp, bgp);
2129 int idx_number = 3;
2130 uint32_t stalepath;
2131
2132 stalepath = strtoul(argv[idx_number]->arg, NULL, 10);
2133 bgp->stalepath_time = stalepath;
2134 return CMD_SUCCESS;
2135 }
2136
2137 DEFUN (bgp_graceful_restart_restart_time,
2138 bgp_graceful_restart_restart_time_cmd,
2139 "bgp graceful-restart restart-time (1-4095)",
2140 "BGP specific commands\n"
2141 "Graceful restart capability parameters\n"
2142 "Set the time to wait to delete stale routes before a BGP open message is received\n"
2143 "Delay value (seconds)\n")
2144 {
2145 VTY_DECLVAR_CONTEXT(bgp, bgp);
2146 int idx_number = 3;
2147 uint32_t restart;
2148
2149 restart = strtoul(argv[idx_number]->arg, NULL, 10);
2150 bgp->restart_time = restart;
2151 return CMD_SUCCESS;
2152 }
2153
2154 DEFUN (no_bgp_graceful_restart_stalepath_time,
2155 no_bgp_graceful_restart_stalepath_time_cmd,
2156 "no bgp graceful-restart stalepath-time [(1-4095)]",
2157 NO_STR
2158 "BGP specific commands\n"
2159 "Graceful restart capability parameters\n"
2160 "Set the max time to hold onto restarting peer's stale paths\n"
2161 "Delay value (seconds)\n")
2162 {
2163 VTY_DECLVAR_CONTEXT(bgp, bgp);
2164
2165 bgp->stalepath_time = BGP_DEFAULT_STALEPATH_TIME;
2166 return CMD_SUCCESS;
2167 }
2168
2169 DEFUN (no_bgp_graceful_restart_restart_time,
2170 no_bgp_graceful_restart_restart_time_cmd,
2171 "no bgp graceful-restart restart-time [(1-4095)]",
2172 NO_STR
2173 "BGP specific commands\n"
2174 "Graceful restart capability parameters\n"
2175 "Set the time to wait to delete stale routes before a BGP open message is received\n"
2176 "Delay value (seconds)\n")
2177 {
2178 VTY_DECLVAR_CONTEXT(bgp, bgp);
2179
2180 bgp->restart_time = BGP_DEFAULT_RESTART_TIME;
2181 return CMD_SUCCESS;
2182 }
2183
2184 DEFUN (bgp_graceful_restart_preserve_fw,
2185 bgp_graceful_restart_preserve_fw_cmd,
2186 "bgp graceful-restart preserve-fw-state",
2187 "BGP specific commands\n"
2188 "Graceful restart capability parameters\n"
2189 "Sets F-bit indication that fib is preserved while doing Graceful Restart\n")
2190 {
2191 VTY_DECLVAR_CONTEXT(bgp, bgp);
2192 bgp_flag_set(bgp, BGP_FLAG_GR_PRESERVE_FWD);
2193 return CMD_SUCCESS;
2194 }
2195
2196 DEFUN (no_bgp_graceful_restart_preserve_fw,
2197 no_bgp_graceful_restart_preserve_fw_cmd,
2198 "no bgp graceful-restart preserve-fw-state",
2199 NO_STR
2200 "BGP specific commands\n"
2201 "Graceful restart capability parameters\n"
2202 "Unsets F-bit indication that fib is preserved while doing Graceful Restart\n")
2203 {
2204 VTY_DECLVAR_CONTEXT(bgp, bgp);
2205 bgp_flag_unset(bgp, BGP_FLAG_GR_PRESERVE_FWD);
2206 return CMD_SUCCESS;
2207 }
2208
2209 /* "bgp graceful-shutdown" configuration */
2210 DEFUN (bgp_graceful_shutdown,
2211 bgp_graceful_shutdown_cmd,
2212 "bgp graceful-shutdown",
2213 BGP_STR
2214 "Graceful shutdown parameters\n")
2215 {
2216 VTY_DECLVAR_CONTEXT(bgp, bgp);
2217
2218 if (!bgp_flag_check(bgp, BGP_FLAG_GRACEFUL_SHUTDOWN)) {
2219 bgp_flag_set(bgp, BGP_FLAG_GRACEFUL_SHUTDOWN);
2220 bgp_static_redo_import_check(bgp);
2221 bgp_redistribute_redo(bgp);
2222 bgp_clear_star_soft_out(vty, bgp->name);
2223 bgp_clear_star_soft_in(vty, bgp->name);
2224 }
2225
2226 return CMD_SUCCESS;
2227 }
2228
2229 DEFUN (no_bgp_graceful_shutdown,
2230 no_bgp_graceful_shutdown_cmd,
2231 "no bgp graceful-shutdown",
2232 NO_STR
2233 BGP_STR
2234 "Graceful shutdown parameters\n")
2235 {
2236 VTY_DECLVAR_CONTEXT(bgp, bgp);
2237
2238 if (bgp_flag_check(bgp, BGP_FLAG_GRACEFUL_SHUTDOWN)) {
2239 bgp_flag_unset(bgp, BGP_FLAG_GRACEFUL_SHUTDOWN);
2240 bgp_static_redo_import_check(bgp);
2241 bgp_redistribute_redo(bgp);
2242 bgp_clear_star_soft_out(vty, bgp->name);
2243 bgp_clear_star_soft_in(vty, bgp->name);
2244 }
2245
2246 return CMD_SUCCESS;
2247 }
2248
2249 /* "bgp fast-external-failover" configuration. */
2250 DEFUN (bgp_fast_external_failover,
2251 bgp_fast_external_failover_cmd,
2252 "bgp fast-external-failover",
2253 BGP_STR
2254 "Immediately reset session if a link to a directly connected external peer goes down\n")
2255 {
2256 VTY_DECLVAR_CONTEXT(bgp, bgp);
2257 bgp_flag_unset(bgp, BGP_FLAG_NO_FAST_EXT_FAILOVER);
2258 return CMD_SUCCESS;
2259 }
2260
2261 DEFUN (no_bgp_fast_external_failover,
2262 no_bgp_fast_external_failover_cmd,
2263 "no bgp fast-external-failover",
2264 NO_STR
2265 BGP_STR
2266 "Immediately reset session if a link to a directly connected external peer goes down\n")
2267 {
2268 VTY_DECLVAR_CONTEXT(bgp, bgp);
2269 bgp_flag_set(bgp, BGP_FLAG_NO_FAST_EXT_FAILOVER);
2270 return CMD_SUCCESS;
2271 }
2272
2273 /* "bgp bestpath compare-routerid" configuration. */
2274 DEFUN (bgp_bestpath_compare_router_id,
2275 bgp_bestpath_compare_router_id_cmd,
2276 "bgp bestpath compare-routerid",
2277 "BGP specific commands\n"
2278 "Change the default bestpath selection\n"
2279 "Compare router-id for identical EBGP paths\n")
2280 {
2281 VTY_DECLVAR_CONTEXT(bgp, bgp);
2282 bgp_flag_set(bgp, BGP_FLAG_COMPARE_ROUTER_ID);
2283 bgp_recalculate_all_bestpaths(bgp);
2284
2285 return CMD_SUCCESS;
2286 }
2287
2288 DEFUN (no_bgp_bestpath_compare_router_id,
2289 no_bgp_bestpath_compare_router_id_cmd,
2290 "no bgp bestpath compare-routerid",
2291 NO_STR
2292 "BGP specific commands\n"
2293 "Change the default bestpath selection\n"
2294 "Compare router-id for identical EBGP paths\n")
2295 {
2296 VTY_DECLVAR_CONTEXT(bgp, bgp);
2297 bgp_flag_unset(bgp, BGP_FLAG_COMPARE_ROUTER_ID);
2298 bgp_recalculate_all_bestpaths(bgp);
2299
2300 return CMD_SUCCESS;
2301 }
2302
2303 /* "bgp bestpath as-path ignore" configuration. */
2304 DEFUN (bgp_bestpath_aspath_ignore,
2305 bgp_bestpath_aspath_ignore_cmd,
2306 "bgp bestpath as-path ignore",
2307 "BGP specific commands\n"
2308 "Change the default bestpath selection\n"
2309 "AS-path attribute\n"
2310 "Ignore as-path length in selecting a route\n")
2311 {
2312 VTY_DECLVAR_CONTEXT(bgp, bgp);
2313 bgp_flag_set(bgp, BGP_FLAG_ASPATH_IGNORE);
2314 bgp_recalculate_all_bestpaths(bgp);
2315
2316 return CMD_SUCCESS;
2317 }
2318
2319 DEFUN (no_bgp_bestpath_aspath_ignore,
2320 no_bgp_bestpath_aspath_ignore_cmd,
2321 "no bgp bestpath as-path ignore",
2322 NO_STR
2323 "BGP specific commands\n"
2324 "Change the default bestpath selection\n"
2325 "AS-path attribute\n"
2326 "Ignore as-path length in selecting a route\n")
2327 {
2328 VTY_DECLVAR_CONTEXT(bgp, bgp);
2329 bgp_flag_unset(bgp, BGP_FLAG_ASPATH_IGNORE);
2330 bgp_recalculate_all_bestpaths(bgp);
2331
2332 return CMD_SUCCESS;
2333 }
2334
2335 /* "bgp bestpath as-path confed" configuration. */
2336 DEFUN (bgp_bestpath_aspath_confed,
2337 bgp_bestpath_aspath_confed_cmd,
2338 "bgp bestpath as-path confed",
2339 "BGP specific commands\n"
2340 "Change the default bestpath selection\n"
2341 "AS-path attribute\n"
2342 "Compare path lengths including confederation sets & sequences in selecting a route\n")
2343 {
2344 VTY_DECLVAR_CONTEXT(bgp, bgp);
2345 bgp_flag_set(bgp, BGP_FLAG_ASPATH_CONFED);
2346 bgp_recalculate_all_bestpaths(bgp);
2347
2348 return CMD_SUCCESS;
2349 }
2350
2351 DEFUN (no_bgp_bestpath_aspath_confed,
2352 no_bgp_bestpath_aspath_confed_cmd,
2353 "no bgp bestpath as-path confed",
2354 NO_STR
2355 "BGP specific commands\n"
2356 "Change the default bestpath selection\n"
2357 "AS-path attribute\n"
2358 "Compare path lengths including confederation sets & sequences in selecting a route\n")
2359 {
2360 VTY_DECLVAR_CONTEXT(bgp, bgp);
2361 bgp_flag_unset(bgp, BGP_FLAG_ASPATH_CONFED);
2362 bgp_recalculate_all_bestpaths(bgp);
2363
2364 return CMD_SUCCESS;
2365 }
2366
2367 /* "bgp bestpath as-path multipath-relax" configuration. */
2368 DEFUN (bgp_bestpath_aspath_multipath_relax,
2369 bgp_bestpath_aspath_multipath_relax_cmd,
2370 "bgp bestpath as-path multipath-relax [<as-set|no-as-set>]",
2371 "BGP specific commands\n"
2372 "Change the default bestpath selection\n"
2373 "AS-path attribute\n"
2374 "Allow load sharing across routes that have different AS paths (but same length)\n"
2375 "Generate an AS_SET\n"
2376 "Do not generate an AS_SET\n")
2377 {
2378 VTY_DECLVAR_CONTEXT(bgp, bgp);
2379 int idx = 0;
2380 bgp_flag_set(bgp, BGP_FLAG_ASPATH_MULTIPATH_RELAX);
2381
2382 /* no-as-set is now the default behavior so we can silently
2383 * ignore it */
2384 if (argv_find(argv, argc, "as-set", &idx))
2385 bgp_flag_set(bgp, BGP_FLAG_MULTIPATH_RELAX_AS_SET);
2386 else
2387 bgp_flag_unset(bgp, BGP_FLAG_MULTIPATH_RELAX_AS_SET);
2388
2389 bgp_recalculate_all_bestpaths(bgp);
2390
2391 return CMD_SUCCESS;
2392 }
2393
2394 DEFUN (no_bgp_bestpath_aspath_multipath_relax,
2395 no_bgp_bestpath_aspath_multipath_relax_cmd,
2396 "no bgp bestpath as-path multipath-relax [<as-set|no-as-set>]",
2397 NO_STR
2398 "BGP specific commands\n"
2399 "Change the default bestpath selection\n"
2400 "AS-path attribute\n"
2401 "Allow load sharing across routes that have different AS paths (but same length)\n"
2402 "Generate an AS_SET\n"
2403 "Do not generate an AS_SET\n")
2404 {
2405 VTY_DECLVAR_CONTEXT(bgp, bgp);
2406 bgp_flag_unset(bgp, BGP_FLAG_ASPATH_MULTIPATH_RELAX);
2407 bgp_flag_unset(bgp, BGP_FLAG_MULTIPATH_RELAX_AS_SET);
2408 bgp_recalculate_all_bestpaths(bgp);
2409
2410 return CMD_SUCCESS;
2411 }
2412
2413 /* "bgp log-neighbor-changes" configuration. */
2414 DEFUN (bgp_log_neighbor_changes,
2415 bgp_log_neighbor_changes_cmd,
2416 "bgp log-neighbor-changes",
2417 "BGP specific commands\n"
2418 "Log neighbor up/down and reset reason\n")
2419 {
2420 VTY_DECLVAR_CONTEXT(bgp, bgp);
2421 bgp_flag_set(bgp, BGP_FLAG_LOG_NEIGHBOR_CHANGES);
2422 return CMD_SUCCESS;
2423 }
2424
2425 DEFUN (no_bgp_log_neighbor_changes,
2426 no_bgp_log_neighbor_changes_cmd,
2427 "no bgp log-neighbor-changes",
2428 NO_STR
2429 "BGP specific commands\n"
2430 "Log neighbor up/down and reset reason\n")
2431 {
2432 VTY_DECLVAR_CONTEXT(bgp, bgp);
2433 bgp_flag_unset(bgp, BGP_FLAG_LOG_NEIGHBOR_CHANGES);
2434 return CMD_SUCCESS;
2435 }
2436
2437 /* "bgp bestpath med" configuration. */
2438 DEFUN (bgp_bestpath_med,
2439 bgp_bestpath_med_cmd,
2440 "bgp bestpath med <confed [missing-as-worst]|missing-as-worst [confed]>",
2441 "BGP specific commands\n"
2442 "Change the default bestpath selection\n"
2443 "MED attribute\n"
2444 "Compare MED among confederation paths\n"
2445 "Treat missing MED as the least preferred one\n"
2446 "Treat missing MED as the least preferred one\n"
2447 "Compare MED among confederation paths\n")
2448 {
2449 VTY_DECLVAR_CONTEXT(bgp, bgp);
2450
2451 int idx = 0;
2452 if (argv_find(argv, argc, "confed", &idx))
2453 bgp_flag_set(bgp, BGP_FLAG_MED_CONFED);
2454 idx = 0;
2455 if (argv_find(argv, argc, "missing-as-worst", &idx))
2456 bgp_flag_set(bgp, BGP_FLAG_MED_MISSING_AS_WORST);
2457
2458 bgp_recalculate_all_bestpaths(bgp);
2459
2460 return CMD_SUCCESS;
2461 }
2462
2463 DEFUN (no_bgp_bestpath_med,
2464 no_bgp_bestpath_med_cmd,
2465 "no bgp bestpath med <confed [missing-as-worst]|missing-as-worst [confed]>",
2466 NO_STR
2467 "BGP specific commands\n"
2468 "Change the default bestpath selection\n"
2469 "MED attribute\n"
2470 "Compare MED among confederation paths\n"
2471 "Treat missing MED as the least preferred one\n"
2472 "Treat missing MED as the least preferred one\n"
2473 "Compare MED among confederation paths\n")
2474 {
2475 VTY_DECLVAR_CONTEXT(bgp, bgp);
2476
2477 int idx = 0;
2478 if (argv_find(argv, argc, "confed", &idx))
2479 bgp_flag_unset(bgp, BGP_FLAG_MED_CONFED);
2480 idx = 0;
2481 if (argv_find(argv, argc, "missing-as-worst", &idx))
2482 bgp_flag_unset(bgp, BGP_FLAG_MED_MISSING_AS_WORST);
2483
2484 bgp_recalculate_all_bestpaths(bgp);
2485
2486 return CMD_SUCCESS;
2487 }
2488
2489 /* "no bgp default ipv4-unicast". */
2490 DEFUN (no_bgp_default_ipv4_unicast,
2491 no_bgp_default_ipv4_unicast_cmd,
2492 "no bgp default ipv4-unicast",
2493 NO_STR
2494 "BGP specific commands\n"
2495 "Configure BGP defaults\n"
2496 "Activate ipv4-unicast for a peer by default\n")
2497 {
2498 VTY_DECLVAR_CONTEXT(bgp, bgp);
2499 bgp_flag_set(bgp, BGP_FLAG_NO_DEFAULT_IPV4);
2500 return CMD_SUCCESS;
2501 }
2502
2503 DEFUN (bgp_default_ipv4_unicast,
2504 bgp_default_ipv4_unicast_cmd,
2505 "bgp default ipv4-unicast",
2506 "BGP specific commands\n"
2507 "Configure BGP defaults\n"
2508 "Activate ipv4-unicast for a peer by default\n")
2509 {
2510 VTY_DECLVAR_CONTEXT(bgp, bgp);
2511 bgp_flag_unset(bgp, BGP_FLAG_NO_DEFAULT_IPV4);
2512 return CMD_SUCCESS;
2513 }
2514
2515 /* Display hostname in certain command outputs */
2516 DEFUN (bgp_default_show_hostname,
2517 bgp_default_show_hostname_cmd,
2518 "bgp default show-hostname",
2519 "BGP specific commands\n"
2520 "Configure BGP defaults\n"
2521 "Show hostname in certain command outputs\n")
2522 {
2523 VTY_DECLVAR_CONTEXT(bgp, bgp);
2524 bgp_flag_set(bgp, BGP_FLAG_SHOW_HOSTNAME);
2525 return CMD_SUCCESS;
2526 }
2527
2528 DEFUN (no_bgp_default_show_hostname,
2529 no_bgp_default_show_hostname_cmd,
2530 "no bgp default show-hostname",
2531 NO_STR
2532 "BGP specific commands\n"
2533 "Configure BGP defaults\n"
2534 "Show hostname in certain command outputs\n")
2535 {
2536 VTY_DECLVAR_CONTEXT(bgp, bgp);
2537 bgp_flag_unset(bgp, BGP_FLAG_SHOW_HOSTNAME);
2538 return CMD_SUCCESS;
2539 }
2540
2541 /* "bgp network import-check" configuration. */
2542 DEFUN (bgp_network_import_check,
2543 bgp_network_import_check_cmd,
2544 "bgp network import-check",
2545 "BGP specific commands\n"
2546 "BGP network command\n"
2547 "Check BGP network route exists in IGP\n")
2548 {
2549 VTY_DECLVAR_CONTEXT(bgp, bgp);
2550 if (!bgp_flag_check(bgp, BGP_FLAG_IMPORT_CHECK)) {
2551 bgp_flag_set(bgp, BGP_FLAG_IMPORT_CHECK);
2552 bgp_static_redo_import_check(bgp);
2553 }
2554
2555 return CMD_SUCCESS;
2556 }
2557
2558 ALIAS_HIDDEN(bgp_network_import_check, bgp_network_import_check_exact_cmd,
2559 "bgp network import-check exact",
2560 "BGP specific commands\n"
2561 "BGP network command\n"
2562 "Check BGP network route exists in IGP\n"
2563 "Match route precisely\n")
2564
2565 DEFUN (no_bgp_network_import_check,
2566 no_bgp_network_import_check_cmd,
2567 "no bgp network import-check",
2568 NO_STR
2569 "BGP specific commands\n"
2570 "BGP network command\n"
2571 "Check BGP network route exists in IGP\n")
2572 {
2573 VTY_DECLVAR_CONTEXT(bgp, bgp);
2574 if (bgp_flag_check(bgp, BGP_FLAG_IMPORT_CHECK)) {
2575 bgp_flag_unset(bgp, BGP_FLAG_IMPORT_CHECK);
2576 bgp_static_redo_import_check(bgp);
2577 }
2578
2579 return CMD_SUCCESS;
2580 }
2581
2582 DEFUN (bgp_default_local_preference,
2583 bgp_default_local_preference_cmd,
2584 "bgp default local-preference (0-4294967295)",
2585 "BGP specific commands\n"
2586 "Configure BGP defaults\n"
2587 "local preference (higher=more preferred)\n"
2588 "Configure default local preference value\n")
2589 {
2590 VTY_DECLVAR_CONTEXT(bgp, bgp);
2591 int idx_number = 3;
2592 uint32_t local_pref;
2593
2594 local_pref = strtoul(argv[idx_number]->arg, NULL, 10);
2595
2596 bgp_default_local_preference_set(bgp, local_pref);
2597 bgp_clear_star_soft_in(vty, bgp->name);
2598
2599 return CMD_SUCCESS;
2600 }
2601
2602 DEFUN (no_bgp_default_local_preference,
2603 no_bgp_default_local_preference_cmd,
2604 "no bgp default local-preference [(0-4294967295)]",
2605 NO_STR
2606 "BGP specific commands\n"
2607 "Configure BGP defaults\n"
2608 "local preference (higher=more preferred)\n"
2609 "Configure default local preference value\n")
2610 {
2611 VTY_DECLVAR_CONTEXT(bgp, bgp);
2612 bgp_default_local_preference_unset(bgp);
2613 bgp_clear_star_soft_in(vty, bgp->name);
2614
2615 return CMD_SUCCESS;
2616 }
2617
2618
2619 DEFUN (bgp_default_subgroup_pkt_queue_max,
2620 bgp_default_subgroup_pkt_queue_max_cmd,
2621 "bgp default subgroup-pkt-queue-max (20-100)",
2622 "BGP specific commands\n"
2623 "Configure BGP defaults\n"
2624 "subgroup-pkt-queue-max\n"
2625 "Configure subgroup packet queue max\n")
2626 {
2627 VTY_DECLVAR_CONTEXT(bgp, bgp);
2628 int idx_number = 3;
2629 uint32_t max_size;
2630
2631 max_size = strtoul(argv[idx_number]->arg, NULL, 10);
2632
2633 bgp_default_subgroup_pkt_queue_max_set(bgp, max_size);
2634
2635 return CMD_SUCCESS;
2636 }
2637
2638 DEFUN (no_bgp_default_subgroup_pkt_queue_max,
2639 no_bgp_default_subgroup_pkt_queue_max_cmd,
2640 "no bgp default subgroup-pkt-queue-max [(20-100)]",
2641 NO_STR
2642 "BGP specific commands\n"
2643 "Configure BGP defaults\n"
2644 "subgroup-pkt-queue-max\n"
2645 "Configure subgroup packet queue max\n")
2646 {
2647 VTY_DECLVAR_CONTEXT(bgp, bgp);
2648 bgp_default_subgroup_pkt_queue_max_unset(bgp);
2649 return CMD_SUCCESS;
2650 }
2651
2652
2653 DEFUN (bgp_rr_allow_outbound_policy,
2654 bgp_rr_allow_outbound_policy_cmd,
2655 "bgp route-reflector allow-outbound-policy",
2656 "BGP specific commands\n"
2657 "Allow modifications made by out route-map\n"
2658 "on ibgp neighbors\n")
2659 {
2660 VTY_DECLVAR_CONTEXT(bgp, bgp);
2661
2662 if (!bgp_flag_check(bgp, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY)) {
2663 bgp_flag_set(bgp, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY);
2664 update_group_announce_rrclients(bgp);
2665 bgp_clear_star_soft_out(vty, bgp->name);
2666 }
2667
2668 return CMD_SUCCESS;
2669 }
2670
2671 DEFUN (no_bgp_rr_allow_outbound_policy,
2672 no_bgp_rr_allow_outbound_policy_cmd,
2673 "no bgp route-reflector allow-outbound-policy",
2674 NO_STR
2675 "BGP specific commands\n"
2676 "Allow modifications made by out route-map\n"
2677 "on ibgp neighbors\n")
2678 {
2679 VTY_DECLVAR_CONTEXT(bgp, bgp);
2680
2681 if (bgp_flag_check(bgp, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY)) {
2682 bgp_flag_unset(bgp, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY);
2683 update_group_announce_rrclients(bgp);
2684 bgp_clear_star_soft_out(vty, bgp->name);
2685 }
2686
2687 return CMD_SUCCESS;
2688 }
2689
2690 DEFUN (bgp_listen_limit,
2691 bgp_listen_limit_cmd,
2692 "bgp listen limit (1-5000)",
2693 "BGP specific commands\n"
2694 "BGP Dynamic Neighbors listen commands\n"
2695 "Maximum number of BGP Dynamic Neighbors that can be created\n"
2696 "Configure Dynamic Neighbors listen limit value\n")
2697 {
2698 VTY_DECLVAR_CONTEXT(bgp, bgp);
2699 int idx_number = 3;
2700 int listen_limit;
2701
2702 listen_limit = strtoul(argv[idx_number]->arg, NULL, 10);
2703
2704 bgp_listen_limit_set(bgp, listen_limit);
2705
2706 return CMD_SUCCESS;
2707 }
2708
2709 DEFUN (no_bgp_listen_limit,
2710 no_bgp_listen_limit_cmd,
2711 "no bgp listen limit [(1-5000)]",
2712 NO_STR
2713 "BGP specific commands\n"
2714 "BGP Dynamic Neighbors listen commands\n"
2715 "Maximum number of BGP Dynamic Neighbors that can be created\n"
2716 "Configure Dynamic Neighbors listen limit value\n")
2717 {
2718 VTY_DECLVAR_CONTEXT(bgp, bgp);
2719 bgp_listen_limit_unset(bgp);
2720 return CMD_SUCCESS;
2721 }
2722
2723
2724 /*
2725 * Check if this listen range is already configured. Check for exact
2726 * match or overlap based on input.
2727 */
2728 static struct peer_group *listen_range_exists(struct bgp *bgp,
2729 struct prefix *range, int exact)
2730 {
2731 struct listnode *node, *nnode;
2732 struct listnode *node1, *nnode1;
2733 struct peer_group *group;
2734 struct prefix *lr;
2735 afi_t afi;
2736 int match;
2737
2738 afi = family2afi(range->family);
2739 for (ALL_LIST_ELEMENTS(bgp->group, node, nnode, group)) {
2740 for (ALL_LIST_ELEMENTS(group->listen_range[afi], node1, nnode1,
2741 lr)) {
2742 if (exact)
2743 match = prefix_same(range, lr);
2744 else
2745 match = (prefix_match(range, lr)
2746 || prefix_match(lr, range));
2747 if (match)
2748 return group;
2749 }
2750 }
2751
2752 return NULL;
2753 }
2754
2755 DEFUN (bgp_listen_range,
2756 bgp_listen_range_cmd,
2757 "bgp listen range <A.B.C.D/M|X:X::X:X/M> peer-group PGNAME",
2758 "BGP specific commands\n"
2759 "Configure BGP dynamic neighbors listen range\n"
2760 "Configure BGP dynamic neighbors listen range\n"
2761 NEIGHBOR_ADDR_STR
2762 "Member of the peer-group\n"
2763 "Peer-group name\n")
2764 {
2765 VTY_DECLVAR_CONTEXT(bgp, bgp);
2766 struct prefix range;
2767 struct peer_group *group, *existing_group;
2768 afi_t afi;
2769 int ret;
2770 int idx = 0;
2771
2772 argv_find(argv, argc, "A.B.C.D/M", &idx);
2773 argv_find(argv, argc, "X:X::X:X/M", &idx);
2774 char *prefix = argv[idx]->arg;
2775 argv_find(argv, argc, "PGNAME", &idx);
2776 char *peergroup = argv[idx]->arg;
2777
2778 /* Convert IP prefix string to struct prefix. */
2779 ret = str2prefix(prefix, &range);
2780 if (!ret) {
2781 vty_out(vty, "%% Malformed listen range\n");
2782 return CMD_WARNING_CONFIG_FAILED;
2783 }
2784
2785 afi = family2afi(range.family);
2786
2787 if (afi == AFI_IP6 && IN6_IS_ADDR_LINKLOCAL(&range.u.prefix6)) {
2788 vty_out(vty,
2789 "%% Malformed listen range (link-local address)\n");
2790 return CMD_WARNING_CONFIG_FAILED;
2791 }
2792
2793 apply_mask(&range);
2794
2795 /* Check if same listen range is already configured. */
2796 existing_group = listen_range_exists(bgp, &range, 1);
2797 if (existing_group) {
2798 if (strcmp(existing_group->name, peergroup) == 0)
2799 return CMD_SUCCESS;
2800 else {
2801 vty_out(vty,
2802 "%% Same listen range is attached to peer-group %s\n",
2803 existing_group->name);
2804 return CMD_WARNING_CONFIG_FAILED;
2805 }
2806 }
2807
2808 /* Check if an overlapping listen range exists. */
2809 if (listen_range_exists(bgp, &range, 0)) {
2810 vty_out(vty,
2811 "%% Listen range overlaps with existing listen range\n");
2812 return CMD_WARNING_CONFIG_FAILED;
2813 }
2814
2815 group = peer_group_lookup(bgp, peergroup);
2816 if (!group) {
2817 vty_out(vty, "%% Configure the peer-group first\n");
2818 return CMD_WARNING_CONFIG_FAILED;
2819 }
2820
2821 ret = peer_group_listen_range_add(group, &range);
2822 return bgp_vty_return(vty, ret);
2823 }
2824
2825 DEFUN (no_bgp_listen_range,
2826 no_bgp_listen_range_cmd,
2827 "no bgp listen range <A.B.C.D/M|X:X::X:X/M> peer-group PGNAME",
2828 NO_STR
2829 "BGP specific commands\n"
2830 "Unconfigure BGP dynamic neighbors listen range\n"
2831 "Unconfigure BGP dynamic neighbors listen range\n"
2832 NEIGHBOR_ADDR_STR
2833 "Member of the peer-group\n"
2834 "Peer-group name\n")
2835 {
2836 VTY_DECLVAR_CONTEXT(bgp, bgp);
2837 struct prefix range;
2838 struct peer_group *group;
2839 afi_t afi;
2840 int ret;
2841 int idx = 0;
2842
2843 argv_find(argv, argc, "A.B.C.D/M", &idx);
2844 argv_find(argv, argc, "X:X::X:X/M", &idx);
2845 char *prefix = argv[idx]->arg;
2846 argv_find(argv, argc, "PGNAME", &idx);
2847 char *peergroup = argv[idx]->arg;
2848
2849 /* Convert IP prefix string to struct prefix. */
2850 ret = str2prefix(prefix, &range);
2851 if (!ret) {
2852 vty_out(vty, "%% Malformed listen range\n");
2853 return CMD_WARNING_CONFIG_FAILED;
2854 }
2855
2856 afi = family2afi(range.family);
2857
2858 if (afi == AFI_IP6 && IN6_IS_ADDR_LINKLOCAL(&range.u.prefix6)) {
2859 vty_out(vty,
2860 "%% Malformed listen range (link-local address)\n");
2861 return CMD_WARNING_CONFIG_FAILED;
2862 }
2863
2864 apply_mask(&range);
2865
2866 group = peer_group_lookup(bgp, peergroup);
2867 if (!group) {
2868 vty_out(vty, "%% Peer-group does not exist\n");
2869 return CMD_WARNING_CONFIG_FAILED;
2870 }
2871
2872 ret = peer_group_listen_range_del(group, &range);
2873 return bgp_vty_return(vty, ret);
2874 }
2875
2876 void bgp_config_write_listen(struct vty *vty, struct bgp *bgp)
2877 {
2878 struct peer_group *group;
2879 struct listnode *node, *nnode, *rnode, *nrnode;
2880 struct prefix *range;
2881 afi_t afi;
2882 char buf[PREFIX2STR_BUFFER];
2883
2884 if (bgp->dynamic_neighbors_limit != BGP_DYNAMIC_NEIGHBORS_LIMIT_DEFAULT)
2885 vty_out(vty, " bgp listen limit %d\n",
2886 bgp->dynamic_neighbors_limit);
2887
2888 for (ALL_LIST_ELEMENTS(bgp->group, node, nnode, group)) {
2889 for (afi = AFI_IP; afi < AFI_MAX; afi++) {
2890 for (ALL_LIST_ELEMENTS(group->listen_range[afi], rnode,
2891 nrnode, range)) {
2892 prefix2str(range, buf, sizeof(buf));
2893 vty_out(vty,
2894 " bgp listen range %s peer-group %s\n",
2895 buf, group->name);
2896 }
2897 }
2898 }
2899 }
2900
2901
2902 DEFUN (bgp_disable_connected_route_check,
2903 bgp_disable_connected_route_check_cmd,
2904 "bgp disable-ebgp-connected-route-check",
2905 "BGP specific commands\n"
2906 "Disable checking if nexthop is connected on ebgp sessions\n")
2907 {
2908 VTY_DECLVAR_CONTEXT(bgp, bgp);
2909 bgp_flag_set(bgp, BGP_FLAG_DISABLE_NH_CONNECTED_CHK);
2910 bgp_clear_star_soft_in(vty, bgp->name);
2911
2912 return CMD_SUCCESS;
2913 }
2914
2915 DEFUN (no_bgp_disable_connected_route_check,
2916 no_bgp_disable_connected_route_check_cmd,
2917 "no bgp disable-ebgp-connected-route-check",
2918 NO_STR
2919 "BGP specific commands\n"
2920 "Disable checking if nexthop is connected on ebgp sessions\n")
2921 {
2922 VTY_DECLVAR_CONTEXT(bgp, bgp);
2923 bgp_flag_unset(bgp, BGP_FLAG_DISABLE_NH_CONNECTED_CHK);
2924 bgp_clear_star_soft_in(vty, bgp->name);
2925
2926 return CMD_SUCCESS;
2927 }
2928
2929
2930 static int peer_remote_as_vty(struct vty *vty, const char *peer_str,
2931 const char *as_str, afi_t afi, safi_t safi)
2932 {
2933 VTY_DECLVAR_CONTEXT(bgp, bgp);
2934 int ret;
2935 as_t as;
2936 int as_type = AS_SPECIFIED;
2937 union sockunion su;
2938
2939 if (as_str[0] == 'i') {
2940 as = 0;
2941 as_type = AS_INTERNAL;
2942 } else if (as_str[0] == 'e') {
2943 as = 0;
2944 as_type = AS_EXTERNAL;
2945 } else {
2946 /* Get AS number. */
2947 as = strtoul(as_str, NULL, 10);
2948 }
2949
2950 /* If peer is peer group or interface peer, call proper function. */
2951 ret = str2sockunion(peer_str, &su);
2952 if (ret < 0) {
2953 struct peer *peer;
2954
2955 /* Check if existing interface peer */
2956 peer = peer_lookup_by_conf_if(bgp, peer_str);
2957
2958 ret = peer_remote_as(bgp, NULL, peer_str, &as, as_type, afi,
2959 safi);
2960
2961 /* if not interface peer, check peer-group settings */
2962 if (ret < 0 && !peer) {
2963 ret = peer_group_remote_as(bgp, peer_str, &as, as_type);
2964 if (ret < 0) {
2965 vty_out(vty,
2966 "%% Create the peer-group or interface first\n");
2967 return CMD_WARNING_CONFIG_FAILED;
2968 }
2969 return CMD_SUCCESS;
2970 }
2971 } else {
2972 if (peer_address_self_check(bgp, &su)) {
2973 vty_out(vty,
2974 "%% Can not configure the local system as neighbor\n");
2975 return CMD_WARNING_CONFIG_FAILED;
2976 }
2977 ret = peer_remote_as(bgp, &su, NULL, &as, as_type, afi, safi);
2978 }
2979
2980 /* This peer belongs to peer group. */
2981 switch (ret) {
2982 case BGP_ERR_PEER_GROUP_MEMBER:
2983 vty_out(vty,
2984 "%% Peer-group member cannot override remote-as of peer-group\n");
2985 return CMD_WARNING_CONFIG_FAILED;
2986 case BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT:
2987 vty_out(vty,
2988 "%% Peer-group members must be all internal or all external\n");
2989 return CMD_WARNING_CONFIG_FAILED;
2990 }
2991 return bgp_vty_return(vty, ret);
2992 }
2993
2994 DEFUN (bgp_default_shutdown,
2995 bgp_default_shutdown_cmd,
2996 "[no] bgp default shutdown",
2997 NO_STR
2998 BGP_STR
2999 "Configure BGP defaults\n"
3000 "Apply administrative shutdown to newly configured peers\n")
3001 {
3002 VTY_DECLVAR_CONTEXT(bgp, bgp);
3003 bgp->autoshutdown = !strmatch(argv[0]->text, "no");
3004 return CMD_SUCCESS;
3005 }
3006
3007 DEFUN (neighbor_remote_as,
3008 neighbor_remote_as_cmd,
3009 "neighbor <A.B.C.D|X:X::X:X|WORD> remote-as <(1-4294967295)|internal|external>",
3010 NEIGHBOR_STR
3011 NEIGHBOR_ADDR_STR2
3012 "Specify a BGP neighbor\n"
3013 AS_STR
3014 "Internal BGP peer\n"
3015 "External BGP peer\n")
3016 {
3017 int idx_peer = 1;
3018 int idx_remote_as = 3;
3019 return peer_remote_as_vty(vty, argv[idx_peer]->arg,
3020 argv[idx_remote_as]->arg, AFI_IP,
3021 SAFI_UNICAST);
3022 }
3023
3024 static int peer_conf_interface_get(struct vty *vty, const char *conf_if,
3025 afi_t afi, safi_t safi, int v6only,
3026 const char *peer_group_name,
3027 const char *as_str)
3028 {
3029 VTY_DECLVAR_CONTEXT(bgp, bgp);
3030 as_t as = 0;
3031 int as_type = AS_UNSPECIFIED;
3032 struct peer *peer;
3033 struct peer_group *group;
3034 int ret = 0;
3035 union sockunion su;
3036
3037 group = peer_group_lookup(bgp, conf_if);
3038
3039 if (group) {
3040 vty_out(vty, "%% Name conflict with peer-group \n");
3041 return CMD_WARNING_CONFIG_FAILED;
3042 }
3043
3044 if (as_str) {
3045 if (as_str[0] == 'i') {
3046 as_type = AS_INTERNAL;
3047 } else if (as_str[0] == 'e') {
3048 as_type = AS_EXTERNAL;
3049 } else {
3050 /* Get AS number. */
3051 as = strtoul(as_str, NULL, 10);
3052 as_type = AS_SPECIFIED;
3053 }
3054 }
3055
3056 peer = peer_lookup_by_conf_if(bgp, conf_if);
3057 if (peer) {
3058 if (as_str)
3059 ret = peer_remote_as(bgp, NULL, conf_if, &as, as_type,
3060 afi, safi);
3061 } else {
3062 if (bgp_flag_check(bgp, BGP_FLAG_NO_DEFAULT_IPV4)
3063 && afi == AFI_IP && safi == SAFI_UNICAST)
3064 peer = peer_create(NULL, conf_if, bgp, bgp->as, as,
3065 as_type, 0, 0, NULL);
3066 else
3067 peer = peer_create(NULL, conf_if, bgp, bgp->as, as,
3068 as_type, afi, safi, NULL);
3069
3070 if (!peer) {
3071 vty_out(vty, "%% BGP failed to create peer\n");
3072 return CMD_WARNING_CONFIG_FAILED;
3073 }
3074
3075 if (v6only)
3076 peer_flag_set(peer, PEER_FLAG_IFPEER_V6ONLY);
3077
3078 /* Request zebra to initiate IPv6 RAs on this interface. We do
3079 * this
3080 * any unnumbered peer in order to not worry about run-time
3081 * transitions
3082 * (e.g., peering is initially IPv4, but the IPv4 /30 or /31
3083 * address
3084 * gets deleted later etc.)
3085 */
3086 if (peer->ifp)
3087 bgp_zebra_initiate_radv(bgp, peer);
3088 }
3089
3090 if ((v6only && !CHECK_FLAG(peer->flags, PEER_FLAG_IFPEER_V6ONLY))
3091 || (!v6only && CHECK_FLAG(peer->flags, PEER_FLAG_IFPEER_V6ONLY))) {
3092 if (v6only)
3093 peer_flag_set(peer, PEER_FLAG_IFPEER_V6ONLY);
3094 else
3095 peer_flag_unset(peer, PEER_FLAG_IFPEER_V6ONLY);
3096
3097 /* v6only flag changed. Reset bgp seesion */
3098 if (BGP_IS_VALID_STATE_FOR_NOTIF(peer->status)) {
3099 peer->last_reset = PEER_DOWN_V6ONLY_CHANGE;
3100 bgp_notify_send(peer, BGP_NOTIFY_CEASE,
3101 BGP_NOTIFY_CEASE_CONFIG_CHANGE);
3102 } else
3103 bgp_session_reset(peer);
3104 }
3105
3106 if (!CHECK_FLAG(peer->flags_invert, PEER_FLAG_CAPABILITY_ENHE)) {
3107 SET_FLAG(peer->flags, PEER_FLAG_CAPABILITY_ENHE);
3108 SET_FLAG(peer->flags_invert, PEER_FLAG_CAPABILITY_ENHE);
3109 SET_FLAG(peer->flags_override, PEER_FLAG_CAPABILITY_ENHE);
3110 }
3111
3112 if (peer_group_name) {
3113 group = peer_group_lookup(bgp, peer_group_name);
3114 if (!group) {
3115 vty_out(vty, "%% Configure the peer-group first\n");
3116 return CMD_WARNING_CONFIG_FAILED;
3117 }
3118
3119 ret = peer_group_bind(bgp, &su, peer, group, &as);
3120 }
3121
3122 return bgp_vty_return(vty, ret);
3123 }
3124
3125 DEFUN (neighbor_interface_config,
3126 neighbor_interface_config_cmd,
3127 "neighbor WORD interface [peer-group PGNAME]",
3128 NEIGHBOR_STR
3129 "Interface name or neighbor tag\n"
3130 "Enable BGP on interface\n"
3131 "Member of the peer-group\n"
3132 "Peer-group name\n")
3133 {
3134 int idx_word = 1;
3135 int idx_peer_group_word = 4;
3136
3137 if (argc > idx_peer_group_word)
3138 return peer_conf_interface_get(
3139 vty, argv[idx_word]->arg, AFI_IP, SAFI_UNICAST, 0,
3140 argv[idx_peer_group_word]->arg, NULL);
3141 else
3142 return peer_conf_interface_get(vty, argv[idx_word]->arg, AFI_IP,
3143 SAFI_UNICAST, 0, NULL, NULL);
3144 }
3145
3146 DEFUN (neighbor_interface_config_v6only,
3147 neighbor_interface_config_v6only_cmd,
3148 "neighbor WORD interface v6only [peer-group PGNAME]",
3149 NEIGHBOR_STR
3150 "Interface name or neighbor tag\n"
3151 "Enable BGP on interface\n"
3152 "Enable BGP with v6 link-local only\n"
3153 "Member of the peer-group\n"
3154 "Peer-group name\n")
3155 {
3156 int idx_word = 1;
3157 int idx_peer_group_word = 5;
3158
3159 if (argc > idx_peer_group_word)
3160 return peer_conf_interface_get(
3161 vty, argv[idx_word]->arg, AFI_IP, SAFI_UNICAST, 1,
3162 argv[idx_peer_group_word]->arg, NULL);
3163
3164 return peer_conf_interface_get(vty, argv[idx_word]->arg, AFI_IP,
3165 SAFI_UNICAST, 1, NULL, NULL);
3166 }
3167
3168
3169 DEFUN (neighbor_interface_config_remote_as,
3170 neighbor_interface_config_remote_as_cmd,
3171 "neighbor WORD interface remote-as <(1-4294967295)|internal|external>",
3172 NEIGHBOR_STR
3173 "Interface name or neighbor tag\n"
3174 "Enable BGP on interface\n"
3175 "Specify a BGP neighbor\n"
3176 AS_STR
3177 "Internal BGP peer\n"
3178 "External BGP peer\n")
3179 {
3180 int idx_word = 1;
3181 int idx_remote_as = 4;
3182 return peer_conf_interface_get(vty, argv[idx_word]->arg, AFI_IP,
3183 SAFI_UNICAST, 0, NULL,
3184 argv[idx_remote_as]->arg);
3185 }
3186
3187 DEFUN (neighbor_interface_v6only_config_remote_as,
3188 neighbor_interface_v6only_config_remote_as_cmd,
3189 "neighbor WORD interface v6only remote-as <(1-4294967295)|internal|external>",
3190 NEIGHBOR_STR
3191 "Interface name or neighbor tag\n"
3192 "Enable BGP with v6 link-local only\n"
3193 "Enable BGP on interface\n"
3194 "Specify a BGP neighbor\n"
3195 AS_STR
3196 "Internal BGP peer\n"
3197 "External BGP peer\n")
3198 {
3199 int idx_word = 1;
3200 int idx_remote_as = 5;
3201 return peer_conf_interface_get(vty, argv[idx_word]->arg, AFI_IP,
3202 SAFI_UNICAST, 1, NULL,
3203 argv[idx_remote_as]->arg);
3204 }
3205
3206 DEFUN (neighbor_peer_group,
3207 neighbor_peer_group_cmd,
3208 "neighbor WORD peer-group",
3209 NEIGHBOR_STR
3210 "Interface name or neighbor tag\n"
3211 "Configure peer-group\n")
3212 {
3213 VTY_DECLVAR_CONTEXT(bgp, bgp);
3214 int idx_word = 1;
3215 struct peer *peer;
3216 struct peer_group *group;
3217
3218 peer = peer_lookup_by_conf_if(bgp, argv[idx_word]->arg);
3219 if (peer) {
3220 vty_out(vty, "%% Name conflict with interface: \n");
3221 return CMD_WARNING_CONFIG_FAILED;
3222 }
3223
3224 group = peer_group_get(bgp, argv[idx_word]->arg);
3225 if (!group) {
3226 vty_out(vty, "%% BGP failed to find or create peer-group\n");
3227 return CMD_WARNING_CONFIG_FAILED;
3228 }
3229
3230 return CMD_SUCCESS;
3231 }
3232
3233 DEFUN (no_neighbor,
3234 no_neighbor_cmd,
3235 "no neighbor <WORD|<A.B.C.D|X:X::X:X> [remote-as <(1-4294967295)|internal|external>]>",
3236 NO_STR
3237 NEIGHBOR_STR
3238 NEIGHBOR_ADDR_STR2
3239 "Specify a BGP neighbor\n"
3240 AS_STR
3241 "Internal BGP peer\n"
3242 "External BGP peer\n")
3243 {
3244 VTY_DECLVAR_CONTEXT(bgp, bgp);
3245 int idx_peer = 2;
3246 int ret;
3247 union sockunion su;
3248 struct peer_group *group;
3249 struct peer *peer;
3250 struct peer *other;
3251
3252 ret = str2sockunion(argv[idx_peer]->arg, &su);
3253 if (ret < 0) {
3254 /* look up for neighbor by interface name config. */
3255 peer = peer_lookup_by_conf_if(bgp, argv[idx_peer]->arg);
3256 if (peer) {
3257 /* Request zebra to terminate IPv6 RAs on this
3258 * interface. */
3259 if (peer->ifp)
3260 bgp_zebra_terminate_radv(peer->bgp, peer);
3261 peer_notify_unconfig(peer);
3262 peer_delete(peer);
3263 return CMD_SUCCESS;
3264 }
3265
3266 group = peer_group_lookup(bgp, argv[idx_peer]->arg);
3267 if (group) {
3268 peer_group_notify_unconfig(group);
3269 peer_group_delete(group);
3270 } else {
3271 vty_out(vty, "%% Create the peer-group first\n");
3272 return CMD_WARNING_CONFIG_FAILED;
3273 }
3274 } else {
3275 peer = peer_lookup(bgp, &su);
3276 if (peer) {
3277 if (peer_dynamic_neighbor(peer)) {
3278 vty_out(vty,
3279 "%% Operation not allowed on a dynamic neighbor\n");
3280 return CMD_WARNING_CONFIG_FAILED;
3281 }
3282
3283 other = peer->doppelganger;
3284 peer_notify_unconfig(peer);
3285 peer_delete(peer);
3286 if (other && other->status != Deleted) {
3287 peer_notify_unconfig(other);
3288 peer_delete(other);
3289 }
3290 }
3291 }
3292
3293 return CMD_SUCCESS;
3294 }
3295
3296 DEFUN (no_neighbor_interface_config,
3297 no_neighbor_interface_config_cmd,
3298 "no neighbor WORD interface [v6only] [peer-group PGNAME] [remote-as <(1-4294967295)|internal|external>]",
3299 NO_STR
3300 NEIGHBOR_STR
3301 "Interface name\n"
3302 "Configure BGP on interface\n"
3303 "Enable BGP with v6 link-local only\n"
3304 "Member of the peer-group\n"
3305 "Peer-group name\n"
3306 "Specify a BGP neighbor\n"
3307 AS_STR
3308 "Internal BGP peer\n"
3309 "External BGP peer\n")
3310 {
3311 VTY_DECLVAR_CONTEXT(bgp, bgp);
3312 int idx_word = 2;
3313 struct peer *peer;
3314
3315 /* look up for neighbor by interface name config. */
3316 peer = peer_lookup_by_conf_if(bgp, argv[idx_word]->arg);
3317 if (peer) {
3318 /* Request zebra to terminate IPv6 RAs on this interface. */
3319 if (peer->ifp)
3320 bgp_zebra_terminate_radv(peer->bgp, peer);
3321 peer_notify_unconfig(peer);
3322 peer_delete(peer);
3323 } else {
3324 vty_out(vty, "%% Create the bgp interface first\n");
3325 return CMD_WARNING_CONFIG_FAILED;
3326 }
3327 return CMD_SUCCESS;
3328 }
3329
3330 DEFUN (no_neighbor_peer_group,
3331 no_neighbor_peer_group_cmd,
3332 "no neighbor WORD peer-group",
3333 NO_STR
3334 NEIGHBOR_STR
3335 "Neighbor tag\n"
3336 "Configure peer-group\n")
3337 {
3338 VTY_DECLVAR_CONTEXT(bgp, bgp);
3339 int idx_word = 2;
3340 struct peer_group *group;
3341
3342 group = peer_group_lookup(bgp, argv[idx_word]->arg);
3343 if (group) {
3344 peer_group_notify_unconfig(group);
3345 peer_group_delete(group);
3346 } else {
3347 vty_out(vty, "%% Create the peer-group first\n");
3348 return CMD_WARNING_CONFIG_FAILED;
3349 }
3350 return CMD_SUCCESS;
3351 }
3352
3353 DEFUN (no_neighbor_interface_peer_group_remote_as,
3354 no_neighbor_interface_peer_group_remote_as_cmd,
3355 "no neighbor WORD remote-as <(1-4294967295)|internal|external>",
3356 NO_STR
3357 NEIGHBOR_STR
3358 "Interface name or neighbor tag\n"
3359 "Specify a BGP neighbor\n"
3360 AS_STR
3361 "Internal BGP peer\n"
3362 "External BGP peer\n")
3363 {
3364 VTY_DECLVAR_CONTEXT(bgp, bgp);
3365 int idx_word = 2;
3366 struct peer_group *group;
3367 struct peer *peer;
3368
3369 /* look up for neighbor by interface name config. */
3370 peer = peer_lookup_by_conf_if(bgp, argv[idx_word]->arg);
3371 if (peer) {
3372 peer_as_change(peer, 0, AS_UNSPECIFIED);
3373 return CMD_SUCCESS;
3374 }
3375
3376 group = peer_group_lookup(bgp, argv[idx_word]->arg);
3377 if (group)
3378 peer_group_remote_as_delete(group);
3379 else {
3380 vty_out(vty, "%% Create the peer-group or interface first\n");
3381 return CMD_WARNING_CONFIG_FAILED;
3382 }
3383 return CMD_SUCCESS;
3384 }
3385
3386 DEFUN (neighbor_local_as,
3387 neighbor_local_as_cmd,
3388 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295)",
3389 NEIGHBOR_STR
3390 NEIGHBOR_ADDR_STR2
3391 "Specify a local-as number\n"
3392 "AS number used as local AS\n")
3393 {
3394 int idx_peer = 1;
3395 int idx_number = 3;
3396 struct peer *peer;
3397 int ret;
3398 as_t as;
3399
3400 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
3401 if (!peer)
3402 return CMD_WARNING_CONFIG_FAILED;
3403
3404 as = strtoul(argv[idx_number]->arg, NULL, 10);
3405 ret = peer_local_as_set(peer, as, 0, 0);
3406 return bgp_vty_return(vty, ret);
3407 }
3408
3409 DEFUN (neighbor_local_as_no_prepend,
3410 neighbor_local_as_no_prepend_cmd,
3411 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295) no-prepend",
3412 NEIGHBOR_STR
3413 NEIGHBOR_ADDR_STR2
3414 "Specify a local-as number\n"
3415 "AS number used as local AS\n"
3416 "Do not prepend local-as to updates from ebgp peers\n")
3417 {
3418 int idx_peer = 1;
3419 int idx_number = 3;
3420 struct peer *peer;
3421 int ret;
3422 as_t as;
3423
3424 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
3425 if (!peer)
3426 return CMD_WARNING_CONFIG_FAILED;
3427
3428 as = strtoul(argv[idx_number]->arg, NULL, 10);
3429 ret = peer_local_as_set(peer, as, 1, 0);
3430 return bgp_vty_return(vty, ret);
3431 }
3432
3433 DEFUN (neighbor_local_as_no_prepend_replace_as,
3434 neighbor_local_as_no_prepend_replace_as_cmd,
3435 "neighbor <A.B.C.D|X:X::X:X|WORD> local-as (1-4294967295) no-prepend replace-as",
3436 NEIGHBOR_STR
3437 NEIGHBOR_ADDR_STR2
3438 "Specify a local-as number\n"
3439 "AS number used as local AS\n"
3440 "Do not prepend local-as to updates from ebgp peers\n"
3441 "Do not prepend local-as to updates from ibgp peers\n")
3442 {
3443 int idx_peer = 1;
3444 int idx_number = 3;
3445 struct peer *peer;
3446 int ret;
3447 as_t as;
3448
3449 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
3450 if (!peer)
3451 return CMD_WARNING_CONFIG_FAILED;
3452
3453 as = strtoul(argv[idx_number]->arg, NULL, 10);
3454 ret = peer_local_as_set(peer, as, 1, 1);
3455 return bgp_vty_return(vty, ret);
3456 }
3457
3458 DEFUN (no_neighbor_local_as,
3459 no_neighbor_local_as_cmd,
3460 "no neighbor <A.B.C.D|X:X::X:X|WORD> local-as [(1-4294967295) [no-prepend [replace-as]]]",
3461 NO_STR
3462 NEIGHBOR_STR
3463 NEIGHBOR_ADDR_STR2
3464 "Specify a local-as number\n"
3465 "AS number used as local AS\n"
3466 "Do not prepend local-as to updates from ebgp peers\n"
3467 "Do not prepend local-as to updates from ibgp peers\n")
3468 {
3469 int idx_peer = 2;
3470 struct peer *peer;
3471 int ret;
3472
3473 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
3474 if (!peer)
3475 return CMD_WARNING_CONFIG_FAILED;
3476
3477 ret = peer_local_as_unset(peer);
3478 return bgp_vty_return(vty, ret);
3479 }
3480
3481
3482 DEFUN (neighbor_solo,
3483 neighbor_solo_cmd,
3484 "neighbor <A.B.C.D|X:X::X:X|WORD> solo",
3485 NEIGHBOR_STR
3486 NEIGHBOR_ADDR_STR2
3487 "Solo peer - part of its own update group\n")
3488 {
3489 int idx_peer = 1;
3490 struct peer *peer;
3491 int ret;
3492
3493 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
3494 if (!peer)
3495 return CMD_WARNING_CONFIG_FAILED;
3496
3497 ret = update_group_adjust_soloness(peer, 1);
3498 return bgp_vty_return(vty, ret);
3499 }
3500
3501 DEFUN (no_neighbor_solo,
3502 no_neighbor_solo_cmd,
3503 "no neighbor <A.B.C.D|X:X::X:X|WORD> solo",
3504 NO_STR
3505 NEIGHBOR_STR
3506 NEIGHBOR_ADDR_STR2
3507 "Solo peer - part of its own update group\n")
3508 {
3509 int idx_peer = 2;
3510 struct peer *peer;
3511 int ret;
3512
3513 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
3514 if (!peer)
3515 return CMD_WARNING_CONFIG_FAILED;
3516
3517 ret = update_group_adjust_soloness(peer, 0);
3518 return bgp_vty_return(vty, ret);
3519 }
3520
3521 DEFUN (neighbor_password,
3522 neighbor_password_cmd,
3523 "neighbor <A.B.C.D|X:X::X:X|WORD> password LINE",
3524 NEIGHBOR_STR
3525 NEIGHBOR_ADDR_STR2
3526 "Set a password\n"
3527 "The password\n")
3528 {
3529 int idx_peer = 1;
3530 int idx_line = 3;
3531 struct peer *peer;
3532 int ret;
3533
3534 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
3535 if (!peer)
3536 return CMD_WARNING_CONFIG_FAILED;
3537
3538 ret = peer_password_set(peer, argv[idx_line]->arg);
3539 return bgp_vty_return(vty, ret);
3540 }
3541
3542 DEFUN (no_neighbor_password,
3543 no_neighbor_password_cmd,
3544 "no neighbor <A.B.C.D|X:X::X:X|WORD> password [LINE]",
3545 NO_STR
3546 NEIGHBOR_STR
3547 NEIGHBOR_ADDR_STR2
3548 "Set a password\n"
3549 "The password\n")
3550 {
3551 int idx_peer = 2;
3552 struct peer *peer;
3553 int ret;
3554
3555 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
3556 if (!peer)
3557 return CMD_WARNING_CONFIG_FAILED;
3558
3559 ret = peer_password_unset(peer);
3560 return bgp_vty_return(vty, ret);
3561 }
3562
3563 DEFUN (neighbor_activate,
3564 neighbor_activate_cmd,
3565 "neighbor <A.B.C.D|X:X::X:X|WORD> activate",
3566 NEIGHBOR_STR
3567 NEIGHBOR_ADDR_STR2
3568 "Enable the Address Family for this Neighbor\n")
3569 {
3570 int idx_peer = 1;
3571 int ret;
3572 struct peer *peer;
3573
3574 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
3575 if (!peer)
3576 return CMD_WARNING_CONFIG_FAILED;
3577
3578 ret = peer_activate(peer, bgp_node_afi(vty), bgp_node_safi(vty));
3579 return bgp_vty_return(vty, ret);
3580 }
3581
3582 ALIAS_HIDDEN(neighbor_activate, neighbor_activate_hidden_cmd,
3583 "neighbor <A.B.C.D|X:X::X:X|WORD> activate",
3584 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3585 "Enable the Address Family for this Neighbor\n")
3586
3587 DEFUN (no_neighbor_activate,
3588 no_neighbor_activate_cmd,
3589 "no neighbor <A.B.C.D|X:X::X:X|WORD> activate",
3590 NO_STR
3591 NEIGHBOR_STR
3592 NEIGHBOR_ADDR_STR2
3593 "Enable the Address Family for this Neighbor\n")
3594 {
3595 int idx_peer = 2;
3596 int ret;
3597 struct peer *peer;
3598
3599 /* Lookup peer. */
3600 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
3601 if (!peer)
3602 return CMD_WARNING_CONFIG_FAILED;
3603
3604 ret = peer_deactivate(peer, bgp_node_afi(vty), bgp_node_safi(vty));
3605 return bgp_vty_return(vty, ret);
3606 }
3607
3608 ALIAS_HIDDEN(no_neighbor_activate, no_neighbor_activate_hidden_cmd,
3609 "no neighbor <A.B.C.D|X:X::X:X|WORD> activate",
3610 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3611 "Enable the Address Family for this Neighbor\n")
3612
3613 DEFUN (neighbor_set_peer_group,
3614 neighbor_set_peer_group_cmd,
3615 "neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
3616 NEIGHBOR_STR
3617 NEIGHBOR_ADDR_STR2
3618 "Member of the peer-group\n"
3619 "Peer-group name\n")
3620 {
3621 VTY_DECLVAR_CONTEXT(bgp, bgp);
3622 int idx_peer = 1;
3623 int idx_word = 3;
3624 int ret;
3625 as_t as;
3626 union sockunion su;
3627 struct peer *peer;
3628 struct peer_group *group;
3629
3630 ret = str2sockunion(argv[idx_peer]->arg, &su);
3631 if (ret < 0) {
3632 peer = peer_lookup_by_conf_if(bgp, argv[idx_peer]->arg);
3633 if (!peer) {
3634 vty_out(vty, "%% Malformed address or name: %s\n",
3635 argv[idx_peer]->arg);
3636 return CMD_WARNING_CONFIG_FAILED;
3637 }
3638 } else {
3639 if (peer_address_self_check(bgp, &su)) {
3640 vty_out(vty,
3641 "%% Can not configure the local system as neighbor\n");
3642 return CMD_WARNING_CONFIG_FAILED;
3643 }
3644
3645 /* Disallow for dynamic neighbor. */
3646 peer = peer_lookup(bgp, &su);
3647 if (peer && peer_dynamic_neighbor(peer)) {
3648 vty_out(vty,
3649 "%% Operation not allowed on a dynamic neighbor\n");
3650 return CMD_WARNING_CONFIG_FAILED;
3651 }
3652 }
3653
3654 group = peer_group_lookup(bgp, argv[idx_word]->arg);
3655 if (!group) {
3656 vty_out(vty, "%% Configure the peer-group first\n");
3657 return CMD_WARNING_CONFIG_FAILED;
3658 }
3659
3660 ret = peer_group_bind(bgp, &su, peer, group, &as);
3661
3662 if (ret == BGP_ERR_PEER_GROUP_PEER_TYPE_DIFFERENT) {
3663 vty_out(vty,
3664 "%% Peer with AS %u cannot be in this peer-group, members must be all internal or all external\n",
3665 as);
3666 return CMD_WARNING_CONFIG_FAILED;
3667 }
3668
3669 return bgp_vty_return(vty, ret);
3670 }
3671
3672 ALIAS_HIDDEN(neighbor_set_peer_group, neighbor_set_peer_group_hidden_cmd,
3673 "neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
3674 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3675 "Member of the peer-group\n"
3676 "Peer-group name\n")
3677
3678 DEFUN (no_neighbor_set_peer_group,
3679 no_neighbor_set_peer_group_cmd,
3680 "no neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
3681 NO_STR
3682 NEIGHBOR_STR
3683 NEIGHBOR_ADDR_STR2
3684 "Member of the peer-group\n"
3685 "Peer-group name\n")
3686 {
3687 VTY_DECLVAR_CONTEXT(bgp, bgp);
3688 int idx_peer = 2;
3689 int idx_word = 4;
3690 int ret;
3691 struct peer *peer;
3692 struct peer_group *group;
3693
3694 peer = peer_lookup_vty(vty, argv[idx_peer]->arg);
3695 if (!peer)
3696 return CMD_WARNING_CONFIG_FAILED;
3697
3698 group = peer_group_lookup(bgp, argv[idx_word]->arg);
3699 if (!group) {
3700 vty_out(vty, "%% Configure the peer-group first\n");
3701 return CMD_WARNING_CONFIG_FAILED;
3702 }
3703
3704 peer_notify_unconfig(peer);
3705 ret = peer_delete(peer);
3706
3707 return bgp_vty_return(vty, ret);
3708 }
3709
3710 ALIAS_HIDDEN(no_neighbor_set_peer_group, no_neighbor_set_peer_group_hidden_cmd,
3711 "no neighbor <A.B.C.D|X:X::X:X|WORD> peer-group PGNAME",
3712 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3713 "Member of the peer-group\n"
3714 "Peer-group name\n")
3715
3716 static int peer_flag_modify_vty(struct vty *vty, const char *ip_str,
3717 uint32_t flag, int set)
3718 {
3719 int ret;
3720 struct peer *peer;
3721
3722 peer = peer_and_group_lookup_vty(vty, ip_str);
3723 if (!peer)
3724 return CMD_WARNING_CONFIG_FAILED;
3725
3726 /*
3727 * If 'neighbor <interface>', then this is for directly connected peers,
3728 * we should not accept disable-connected-check.
3729 */
3730 if (peer->conf_if && (flag == PEER_FLAG_DISABLE_CONNECTED_CHECK)) {
3731 vty_out(vty,
3732 "%s is directly connected peer, cannot accept disable-"
3733 "connected-check\n",
3734 ip_str);
3735 return CMD_WARNING_CONFIG_FAILED;
3736 }
3737
3738 if (!set && flag == PEER_FLAG_SHUTDOWN)
3739 peer_tx_shutdown_message_unset(peer);
3740
3741 if (set)
3742 ret = peer_flag_set(peer, flag);
3743 else
3744 ret = peer_flag_unset(peer, flag);
3745
3746 return bgp_vty_return(vty, ret);
3747 }
3748
3749 static int peer_flag_set_vty(struct vty *vty, const char *ip_str, uint32_t flag)
3750 {
3751 return peer_flag_modify_vty(vty, ip_str, flag, 1);
3752 }
3753
3754 static int peer_flag_unset_vty(struct vty *vty, const char *ip_str,
3755 uint32_t flag)
3756 {
3757 return peer_flag_modify_vty(vty, ip_str, flag, 0);
3758 }
3759
3760 /* neighbor passive. */
3761 DEFUN (neighbor_passive,
3762 neighbor_passive_cmd,
3763 "neighbor <A.B.C.D|X:X::X:X|WORD> passive",
3764 NEIGHBOR_STR
3765 NEIGHBOR_ADDR_STR2
3766 "Don't send open messages to this neighbor\n")
3767 {
3768 int idx_peer = 1;
3769 return peer_flag_set_vty(vty, argv[idx_peer]->arg, PEER_FLAG_PASSIVE);
3770 }
3771
3772 DEFUN (no_neighbor_passive,
3773 no_neighbor_passive_cmd,
3774 "no neighbor <A.B.C.D|X:X::X:X|WORD> passive",
3775 NO_STR
3776 NEIGHBOR_STR
3777 NEIGHBOR_ADDR_STR2
3778 "Don't send open messages to this neighbor\n")
3779 {
3780 int idx_peer = 2;
3781 return peer_flag_unset_vty(vty, argv[idx_peer]->arg, PEER_FLAG_PASSIVE);
3782 }
3783
3784 /* neighbor shutdown. */
3785 DEFUN (neighbor_shutdown_msg,
3786 neighbor_shutdown_msg_cmd,
3787 "neighbor <A.B.C.D|X:X::X:X|WORD> shutdown message MSG...",
3788 NEIGHBOR_STR
3789 NEIGHBOR_ADDR_STR2
3790 "Administratively shut down this neighbor\n"
3791 "Add a shutdown message (draft-ietf-idr-shutdown-06)\n"
3792 "Shutdown message\n")
3793 {
3794 int idx_peer = 1;
3795
3796 if (argc >= 5) {
3797 struct peer *peer =
3798 peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
3799 char *message;
3800
3801 if (!peer)
3802 return CMD_WARNING_CONFIG_FAILED;
3803 message = argv_concat(argv, argc, 4);
3804 peer_tx_shutdown_message_set(peer, message);
3805 XFREE(MTYPE_TMP, message);
3806 }
3807
3808 return peer_flag_set_vty(vty, argv[idx_peer]->arg, PEER_FLAG_SHUTDOWN);
3809 }
3810
3811 ALIAS(neighbor_shutdown_msg, neighbor_shutdown_cmd,
3812 "neighbor <A.B.C.D|X:X::X:X|WORD> shutdown",
3813 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3814 "Administratively shut down this neighbor\n")
3815
3816 DEFUN (no_neighbor_shutdown_msg,
3817 no_neighbor_shutdown_msg_cmd,
3818 "no neighbor <A.B.C.D|X:X::X:X|WORD> shutdown message MSG...",
3819 NO_STR
3820 NEIGHBOR_STR
3821 NEIGHBOR_ADDR_STR2
3822 "Administratively shut down this neighbor\n"
3823 "Remove a shutdown message (draft-ietf-idr-shutdown-06)\n"
3824 "Shutdown message\n")
3825 {
3826 int idx_peer = 2;
3827
3828 return peer_flag_unset_vty(vty, argv[idx_peer]->arg,
3829 PEER_FLAG_SHUTDOWN);
3830 }
3831
3832 ALIAS(no_neighbor_shutdown_msg, no_neighbor_shutdown_cmd,
3833 "no neighbor <A.B.C.D|X:X::X:X|WORD> shutdown",
3834 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3835 "Administratively shut down this neighbor\n")
3836
3837 /* neighbor capability dynamic. */
3838 DEFUN (neighbor_capability_dynamic,
3839 neighbor_capability_dynamic_cmd,
3840 "neighbor <A.B.C.D|X:X::X:X|WORD> capability dynamic",
3841 NEIGHBOR_STR
3842 NEIGHBOR_ADDR_STR2
3843 "Advertise capability to the peer\n"
3844 "Advertise dynamic capability to this neighbor\n")
3845 {
3846 int idx_peer = 1;
3847 return peer_flag_set_vty(vty, argv[idx_peer]->arg,
3848 PEER_FLAG_DYNAMIC_CAPABILITY);
3849 }
3850
3851 DEFUN (no_neighbor_capability_dynamic,
3852 no_neighbor_capability_dynamic_cmd,
3853 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability dynamic",
3854 NO_STR
3855 NEIGHBOR_STR
3856 NEIGHBOR_ADDR_STR2
3857 "Advertise capability to the peer\n"
3858 "Advertise dynamic capability to this neighbor\n")
3859 {
3860 int idx_peer = 2;
3861 return peer_flag_unset_vty(vty, argv[idx_peer]->arg,
3862 PEER_FLAG_DYNAMIC_CAPABILITY);
3863 }
3864
3865 /* neighbor dont-capability-negotiate */
3866 DEFUN (neighbor_dont_capability_negotiate,
3867 neighbor_dont_capability_negotiate_cmd,
3868 "neighbor <A.B.C.D|X:X::X:X|WORD> dont-capability-negotiate",
3869 NEIGHBOR_STR
3870 NEIGHBOR_ADDR_STR2
3871 "Do not perform capability negotiation\n")
3872 {
3873 int idx_peer = 1;
3874 return peer_flag_set_vty(vty, argv[idx_peer]->arg,
3875 PEER_FLAG_DONT_CAPABILITY);
3876 }
3877
3878 DEFUN (no_neighbor_dont_capability_negotiate,
3879 no_neighbor_dont_capability_negotiate_cmd,
3880 "no neighbor <A.B.C.D|X:X::X:X|WORD> dont-capability-negotiate",
3881 NO_STR
3882 NEIGHBOR_STR
3883 NEIGHBOR_ADDR_STR2
3884 "Do not perform capability negotiation\n")
3885 {
3886 int idx_peer = 2;
3887 return peer_flag_unset_vty(vty, argv[idx_peer]->arg,
3888 PEER_FLAG_DONT_CAPABILITY);
3889 }
3890
3891 /* neighbor capability extended next hop encoding */
3892 DEFUN (neighbor_capability_enhe,
3893 neighbor_capability_enhe_cmd,
3894 "neighbor <A.B.C.D|X:X::X:X|WORD> capability extended-nexthop",
3895 NEIGHBOR_STR
3896 NEIGHBOR_ADDR_STR2
3897 "Advertise capability to the peer\n"
3898 "Advertise extended next-hop capability to the peer\n")
3899 {
3900 int idx_peer = 1;
3901 return peer_flag_set_vty(vty, argv[idx_peer]->arg,
3902 PEER_FLAG_CAPABILITY_ENHE);
3903 }
3904
3905 DEFUN (no_neighbor_capability_enhe,
3906 no_neighbor_capability_enhe_cmd,
3907 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability extended-nexthop",
3908 NO_STR
3909 NEIGHBOR_STR
3910 NEIGHBOR_ADDR_STR2
3911 "Advertise capability to the peer\n"
3912 "Advertise extended next-hop capability to the peer\n")
3913 {
3914 int idx_peer = 2;
3915 return peer_flag_unset_vty(vty, argv[idx_peer]->arg,
3916 PEER_FLAG_CAPABILITY_ENHE);
3917 }
3918
3919 static int peer_af_flag_modify_vty(struct vty *vty, const char *peer_str,
3920 afi_t afi, safi_t safi, uint32_t flag,
3921 int set)
3922 {
3923 int ret;
3924 struct peer *peer;
3925
3926 peer = peer_and_group_lookup_vty(vty, peer_str);
3927 if (!peer)
3928 return CMD_WARNING_CONFIG_FAILED;
3929
3930 if (set)
3931 ret = peer_af_flag_set(peer, afi, safi, flag);
3932 else
3933 ret = peer_af_flag_unset(peer, afi, safi, flag);
3934
3935 return bgp_vty_return(vty, ret);
3936 }
3937
3938 static int peer_af_flag_set_vty(struct vty *vty, const char *peer_str,
3939 afi_t afi, safi_t safi, uint32_t flag)
3940 {
3941 return peer_af_flag_modify_vty(vty, peer_str, afi, safi, flag, 1);
3942 }
3943
3944 static int peer_af_flag_unset_vty(struct vty *vty, const char *peer_str,
3945 afi_t afi, safi_t safi, uint32_t flag)
3946 {
3947 return peer_af_flag_modify_vty(vty, peer_str, afi, safi, flag, 0);
3948 }
3949
3950 /* neighbor capability orf prefix-list. */
3951 DEFUN (neighbor_capability_orf_prefix,
3952 neighbor_capability_orf_prefix_cmd,
3953 "neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
3954 NEIGHBOR_STR
3955 NEIGHBOR_ADDR_STR2
3956 "Advertise capability to the peer\n"
3957 "Advertise ORF capability to the peer\n"
3958 "Advertise prefixlist ORF capability to this neighbor\n"
3959 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
3960 "Capability to RECEIVE the ORF from this neighbor\n"
3961 "Capability to SEND the ORF to this neighbor\n")
3962 {
3963 int idx_peer = 1;
3964 int idx_send_recv = 5;
3965 uint16_t flag = 0;
3966
3967 if (strmatch(argv[idx_send_recv]->text, "send"))
3968 flag = PEER_FLAG_ORF_PREFIX_SM;
3969 else if (strmatch(argv[idx_send_recv]->text, "receive"))
3970 flag = PEER_FLAG_ORF_PREFIX_RM;
3971 else if (strmatch(argv[idx_send_recv]->text, "both"))
3972 flag = PEER_FLAG_ORF_PREFIX_SM | PEER_FLAG_ORF_PREFIX_RM;
3973 else {
3974 vty_out(vty, "%% BGP invalid orf prefix-list option\n");
3975 return CMD_WARNING_CONFIG_FAILED;
3976 }
3977
3978 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
3979 bgp_node_safi(vty), flag);
3980 }
3981
3982 ALIAS_HIDDEN(
3983 neighbor_capability_orf_prefix,
3984 neighbor_capability_orf_prefix_hidden_cmd,
3985 "neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
3986 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
3987 "Advertise capability to the peer\n"
3988 "Advertise ORF capability to the peer\n"
3989 "Advertise prefixlist ORF capability to this neighbor\n"
3990 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
3991 "Capability to RECEIVE the ORF from this neighbor\n"
3992 "Capability to SEND the ORF to this neighbor\n")
3993
3994 DEFUN (no_neighbor_capability_orf_prefix,
3995 no_neighbor_capability_orf_prefix_cmd,
3996 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
3997 NO_STR
3998 NEIGHBOR_STR
3999 NEIGHBOR_ADDR_STR2
4000 "Advertise capability to the peer\n"
4001 "Advertise ORF capability to the peer\n"
4002 "Advertise prefixlist ORF capability to this neighbor\n"
4003 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
4004 "Capability to RECEIVE the ORF from this neighbor\n"
4005 "Capability to SEND the ORF to this neighbor\n")
4006 {
4007 int idx_peer = 2;
4008 int idx_send_recv = 6;
4009 uint16_t flag = 0;
4010
4011 if (strmatch(argv[idx_send_recv]->text, "send"))
4012 flag = PEER_FLAG_ORF_PREFIX_SM;
4013 else if (strmatch(argv[idx_send_recv]->text, "receive"))
4014 flag = PEER_FLAG_ORF_PREFIX_RM;
4015 else if (strmatch(argv[idx_send_recv]->text, "both"))
4016 flag = PEER_FLAG_ORF_PREFIX_SM | PEER_FLAG_ORF_PREFIX_RM;
4017 else {
4018 vty_out(vty, "%% BGP invalid orf prefix-list option\n");
4019 return CMD_WARNING_CONFIG_FAILED;
4020 }
4021
4022 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
4023 bgp_node_afi(vty), bgp_node_safi(vty),
4024 flag);
4025 }
4026
4027 ALIAS_HIDDEN(
4028 no_neighbor_capability_orf_prefix,
4029 no_neighbor_capability_orf_prefix_hidden_cmd,
4030 "no neighbor <A.B.C.D|X:X::X:X|WORD> capability orf prefix-list <both|send|receive>",
4031 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4032 "Advertise capability to the peer\n"
4033 "Advertise ORF capability to the peer\n"
4034 "Advertise prefixlist ORF capability to this neighbor\n"
4035 "Capability to SEND and RECEIVE the ORF to/from this neighbor\n"
4036 "Capability to RECEIVE the ORF from this neighbor\n"
4037 "Capability to SEND the ORF to this neighbor\n")
4038
4039 /* neighbor next-hop-self. */
4040 DEFUN (neighbor_nexthop_self,
4041 neighbor_nexthop_self_cmd,
4042 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
4043 NEIGHBOR_STR
4044 NEIGHBOR_ADDR_STR2
4045 "Disable the next hop calculation for this neighbor\n")
4046 {
4047 int idx_peer = 1;
4048 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
4049 bgp_node_safi(vty), PEER_FLAG_NEXTHOP_SELF);
4050 }
4051
4052 ALIAS_HIDDEN(neighbor_nexthop_self, neighbor_nexthop_self_hidden_cmd,
4053 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
4054 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4055 "Disable the next hop calculation for this neighbor\n")
4056
4057 /* neighbor next-hop-self. */
4058 DEFUN (neighbor_nexthop_self_force,
4059 neighbor_nexthop_self_force_cmd,
4060 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
4061 NEIGHBOR_STR
4062 NEIGHBOR_ADDR_STR2
4063 "Disable the next hop calculation for this neighbor\n"
4064 "Set the next hop to self for reflected routes\n")
4065 {
4066 int idx_peer = 1;
4067 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
4068 bgp_node_safi(vty),
4069 PEER_FLAG_FORCE_NEXTHOP_SELF);
4070 }
4071
4072 ALIAS_HIDDEN(neighbor_nexthop_self_force,
4073 neighbor_nexthop_self_force_hidden_cmd,
4074 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
4075 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4076 "Disable the next hop calculation for this neighbor\n"
4077 "Set the next hop to self for reflected routes\n")
4078
4079 ALIAS_HIDDEN(neighbor_nexthop_self_force,
4080 neighbor_nexthop_self_all_hidden_cmd,
4081 "neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self all",
4082 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4083 "Disable the next hop calculation for this neighbor\n"
4084 "Set the next hop to self for reflected routes\n")
4085
4086 DEFUN (no_neighbor_nexthop_self,
4087 no_neighbor_nexthop_self_cmd,
4088 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
4089 NO_STR
4090 NEIGHBOR_STR
4091 NEIGHBOR_ADDR_STR2
4092 "Disable the next hop calculation for this neighbor\n")
4093 {
4094 int idx_peer = 2;
4095 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
4096 bgp_node_afi(vty), bgp_node_safi(vty),
4097 PEER_FLAG_NEXTHOP_SELF);
4098 }
4099
4100 ALIAS_HIDDEN(no_neighbor_nexthop_self, no_neighbor_nexthop_self_hidden_cmd,
4101 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self",
4102 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4103 "Disable the next hop calculation for this neighbor\n")
4104
4105 DEFUN (no_neighbor_nexthop_self_force,
4106 no_neighbor_nexthop_self_force_cmd,
4107 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
4108 NO_STR
4109 NEIGHBOR_STR
4110 NEIGHBOR_ADDR_STR2
4111 "Disable the next hop calculation for this neighbor\n"
4112 "Set the next hop to self for reflected routes\n")
4113 {
4114 int idx_peer = 2;
4115 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
4116 bgp_node_afi(vty), bgp_node_safi(vty),
4117 PEER_FLAG_FORCE_NEXTHOP_SELF);
4118 }
4119
4120 ALIAS_HIDDEN(no_neighbor_nexthop_self_force,
4121 no_neighbor_nexthop_self_force_hidden_cmd,
4122 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self force",
4123 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4124 "Disable the next hop calculation for this neighbor\n"
4125 "Set the next hop to self for reflected routes\n")
4126
4127 ALIAS_HIDDEN(no_neighbor_nexthop_self_force,
4128 no_neighbor_nexthop_self_all_hidden_cmd,
4129 "no neighbor <A.B.C.D|X:X::X:X|WORD> next-hop-self all",
4130 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4131 "Disable the next hop calculation for this neighbor\n"
4132 "Set the next hop to self for reflected routes\n")
4133
4134 /* neighbor as-override */
4135 DEFUN (neighbor_as_override,
4136 neighbor_as_override_cmd,
4137 "neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
4138 NEIGHBOR_STR
4139 NEIGHBOR_ADDR_STR2
4140 "Override ASNs in outbound updates if aspath equals remote-as\n")
4141 {
4142 int idx_peer = 1;
4143 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
4144 bgp_node_safi(vty), PEER_FLAG_AS_OVERRIDE);
4145 }
4146
4147 ALIAS_HIDDEN(neighbor_as_override, neighbor_as_override_hidden_cmd,
4148 "neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
4149 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4150 "Override ASNs in outbound updates if aspath equals remote-as\n")
4151
4152 DEFUN (no_neighbor_as_override,
4153 no_neighbor_as_override_cmd,
4154 "no neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
4155 NO_STR
4156 NEIGHBOR_STR
4157 NEIGHBOR_ADDR_STR2
4158 "Override ASNs in outbound updates if aspath equals remote-as\n")
4159 {
4160 int idx_peer = 2;
4161 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
4162 bgp_node_afi(vty), bgp_node_safi(vty),
4163 PEER_FLAG_AS_OVERRIDE);
4164 }
4165
4166 ALIAS_HIDDEN(no_neighbor_as_override, no_neighbor_as_override_hidden_cmd,
4167 "no neighbor <A.B.C.D|X:X::X:X|WORD> as-override",
4168 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4169 "Override ASNs in outbound updates if aspath equals remote-as\n")
4170
4171 /* neighbor remove-private-AS. */
4172 DEFUN (neighbor_remove_private_as,
4173 neighbor_remove_private_as_cmd,
4174 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
4175 NEIGHBOR_STR
4176 NEIGHBOR_ADDR_STR2
4177 "Remove private ASNs in outbound updates\n")
4178 {
4179 int idx_peer = 1;
4180 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
4181 bgp_node_safi(vty),
4182 PEER_FLAG_REMOVE_PRIVATE_AS);
4183 }
4184
4185 ALIAS_HIDDEN(neighbor_remove_private_as, neighbor_remove_private_as_hidden_cmd,
4186 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
4187 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4188 "Remove private ASNs in outbound updates\n")
4189
4190 DEFUN (neighbor_remove_private_as_all,
4191 neighbor_remove_private_as_all_cmd,
4192 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
4193 NEIGHBOR_STR
4194 NEIGHBOR_ADDR_STR2
4195 "Remove private ASNs in outbound updates\n"
4196 "Apply to all AS numbers\n")
4197 {
4198 int idx_peer = 1;
4199 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
4200 bgp_node_safi(vty),
4201 PEER_FLAG_REMOVE_PRIVATE_AS_ALL);
4202 }
4203
4204 ALIAS_HIDDEN(neighbor_remove_private_as_all,
4205 neighbor_remove_private_as_all_hidden_cmd,
4206 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
4207 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4208 "Remove private ASNs in outbound updates\n"
4209 "Apply to all AS numbers")
4210
4211 DEFUN (neighbor_remove_private_as_replace_as,
4212 neighbor_remove_private_as_replace_as_cmd,
4213 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
4214 NEIGHBOR_STR
4215 NEIGHBOR_ADDR_STR2
4216 "Remove private ASNs in outbound updates\n"
4217 "Replace private ASNs with our ASN in outbound updates\n")
4218 {
4219 int idx_peer = 1;
4220 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
4221 bgp_node_safi(vty),
4222 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE);
4223 }
4224
4225 ALIAS_HIDDEN(neighbor_remove_private_as_replace_as,
4226 neighbor_remove_private_as_replace_as_hidden_cmd,
4227 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
4228 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4229 "Remove private ASNs in outbound updates\n"
4230 "Replace private ASNs with our ASN in outbound updates\n")
4231
4232 DEFUN (neighbor_remove_private_as_all_replace_as,
4233 neighbor_remove_private_as_all_replace_as_cmd,
4234 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
4235 NEIGHBOR_STR
4236 NEIGHBOR_ADDR_STR2
4237 "Remove private ASNs in outbound updates\n"
4238 "Apply to all AS numbers\n"
4239 "Replace private ASNs with our ASN in outbound updates\n")
4240 {
4241 int idx_peer = 1;
4242 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
4243 bgp_node_safi(vty),
4244 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE);
4245 }
4246
4247 ALIAS_HIDDEN(
4248 neighbor_remove_private_as_all_replace_as,
4249 neighbor_remove_private_as_all_replace_as_hidden_cmd,
4250 "neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
4251 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4252 "Remove private ASNs in outbound updates\n"
4253 "Apply to all AS numbers\n"
4254 "Replace private ASNs with our ASN in outbound updates\n")
4255
4256 DEFUN (no_neighbor_remove_private_as,
4257 no_neighbor_remove_private_as_cmd,
4258 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
4259 NO_STR
4260 NEIGHBOR_STR
4261 NEIGHBOR_ADDR_STR2
4262 "Remove private ASNs in outbound updates\n")
4263 {
4264 int idx_peer = 2;
4265 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
4266 bgp_node_afi(vty), bgp_node_safi(vty),
4267 PEER_FLAG_REMOVE_PRIVATE_AS);
4268 }
4269
4270 ALIAS_HIDDEN(no_neighbor_remove_private_as,
4271 no_neighbor_remove_private_as_hidden_cmd,
4272 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS",
4273 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4274 "Remove private ASNs in outbound updates\n")
4275
4276 DEFUN (no_neighbor_remove_private_as_all,
4277 no_neighbor_remove_private_as_all_cmd,
4278 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
4279 NO_STR
4280 NEIGHBOR_STR
4281 NEIGHBOR_ADDR_STR2
4282 "Remove private ASNs in outbound updates\n"
4283 "Apply to all AS numbers\n")
4284 {
4285 int idx_peer = 2;
4286 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
4287 bgp_node_afi(vty), bgp_node_safi(vty),
4288 PEER_FLAG_REMOVE_PRIVATE_AS_ALL);
4289 }
4290
4291 ALIAS_HIDDEN(no_neighbor_remove_private_as_all,
4292 no_neighbor_remove_private_as_all_hidden_cmd,
4293 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all",
4294 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4295 "Remove private ASNs in outbound updates\n"
4296 "Apply to all AS numbers\n")
4297
4298 DEFUN (no_neighbor_remove_private_as_replace_as,
4299 no_neighbor_remove_private_as_replace_as_cmd,
4300 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
4301 NO_STR
4302 NEIGHBOR_STR
4303 NEIGHBOR_ADDR_STR2
4304 "Remove private ASNs in outbound updates\n"
4305 "Replace private ASNs with our ASN in outbound updates\n")
4306 {
4307 int idx_peer = 2;
4308 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
4309 bgp_node_afi(vty), bgp_node_safi(vty),
4310 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE);
4311 }
4312
4313 ALIAS_HIDDEN(no_neighbor_remove_private_as_replace_as,
4314 no_neighbor_remove_private_as_replace_as_hidden_cmd,
4315 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS replace-AS",
4316 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4317 "Remove private ASNs in outbound updates\n"
4318 "Replace private ASNs with our ASN in outbound updates\n")
4319
4320 DEFUN (no_neighbor_remove_private_as_all_replace_as,
4321 no_neighbor_remove_private_as_all_replace_as_cmd,
4322 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
4323 NO_STR
4324 NEIGHBOR_STR
4325 NEIGHBOR_ADDR_STR2
4326 "Remove private ASNs in outbound updates\n"
4327 "Apply to all AS numbers\n"
4328 "Replace private ASNs with our ASN in outbound updates\n")
4329 {
4330 int idx_peer = 2;
4331 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
4332 bgp_node_afi(vty), bgp_node_safi(vty),
4333 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE);
4334 }
4335
4336 ALIAS_HIDDEN(
4337 no_neighbor_remove_private_as_all_replace_as,
4338 no_neighbor_remove_private_as_all_replace_as_hidden_cmd,
4339 "no neighbor <A.B.C.D|X:X::X:X|WORD> remove-private-AS all replace-AS",
4340 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4341 "Remove private ASNs in outbound updates\n"
4342 "Apply to all AS numbers\n"
4343 "Replace private ASNs with our ASN in outbound updates\n")
4344
4345
4346 /* neighbor send-community. */
4347 DEFUN (neighbor_send_community,
4348 neighbor_send_community_cmd,
4349 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
4350 NEIGHBOR_STR
4351 NEIGHBOR_ADDR_STR2
4352 "Send Community attribute to this neighbor\n")
4353 {
4354 int idx_peer = 1;
4355
4356 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
4357 bgp_node_safi(vty),
4358 PEER_FLAG_SEND_COMMUNITY);
4359 }
4360
4361 ALIAS_HIDDEN(neighbor_send_community, neighbor_send_community_hidden_cmd,
4362 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
4363 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4364 "Send Community attribute to this neighbor\n")
4365
4366 DEFUN (no_neighbor_send_community,
4367 no_neighbor_send_community_cmd,
4368 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
4369 NO_STR
4370 NEIGHBOR_STR
4371 NEIGHBOR_ADDR_STR2
4372 "Send Community attribute to this neighbor\n")
4373 {
4374 int idx_peer = 2;
4375
4376 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
4377 bgp_node_afi(vty), bgp_node_safi(vty),
4378 PEER_FLAG_SEND_COMMUNITY);
4379 }
4380
4381 ALIAS_HIDDEN(no_neighbor_send_community, no_neighbor_send_community_hidden_cmd,
4382 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community",
4383 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4384 "Send Community attribute to this neighbor\n")
4385
4386 /* neighbor send-community extended. */
4387 DEFUN (neighbor_send_community_type,
4388 neighbor_send_community_type_cmd,
4389 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
4390 NEIGHBOR_STR
4391 NEIGHBOR_ADDR_STR2
4392 "Send Community attribute to this neighbor\n"
4393 "Send Standard and Extended Community attributes\n"
4394 "Send Standard, Large and Extended Community attributes\n"
4395 "Send Extended Community attributes\n"
4396 "Send Standard Community attributes\n"
4397 "Send Large Community attributes\n")
4398 {
4399 int idx_peer = 1;
4400 uint32_t flag = 0;
4401 const char *type = argv[argc - 1]->text;
4402
4403 if (strmatch(type, "standard")) {
4404 SET_FLAG(flag, PEER_FLAG_SEND_COMMUNITY);
4405 } else if (strmatch(type, "extended")) {
4406 SET_FLAG(flag, PEER_FLAG_SEND_EXT_COMMUNITY);
4407 } else if (strmatch(type, "large")) {
4408 SET_FLAG(flag, PEER_FLAG_SEND_LARGE_COMMUNITY);
4409 } else if (strmatch(type, "both")) {
4410 SET_FLAG(flag, PEER_FLAG_SEND_COMMUNITY);
4411 SET_FLAG(flag, PEER_FLAG_SEND_EXT_COMMUNITY);
4412 } else { /* if (strmatch(type, "all")) */
4413 SET_FLAG(flag, PEER_FLAG_SEND_COMMUNITY);
4414 SET_FLAG(flag, PEER_FLAG_SEND_EXT_COMMUNITY);
4415 SET_FLAG(flag, PEER_FLAG_SEND_LARGE_COMMUNITY);
4416 }
4417
4418 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
4419 bgp_node_safi(vty), flag);
4420 }
4421
4422 ALIAS_HIDDEN(
4423 neighbor_send_community_type, neighbor_send_community_type_hidden_cmd,
4424 "neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
4425 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4426 "Send Community attribute to this neighbor\n"
4427 "Send Standard and Extended Community attributes\n"
4428 "Send Standard, Large and Extended Community attributes\n"
4429 "Send Extended Community attributes\n"
4430 "Send Standard Community attributes\n"
4431 "Send Large Community attributes\n")
4432
4433 DEFUN (no_neighbor_send_community_type,
4434 no_neighbor_send_community_type_cmd,
4435 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
4436 NO_STR
4437 NEIGHBOR_STR
4438 NEIGHBOR_ADDR_STR2
4439 "Send Community attribute to this neighbor\n"
4440 "Send Standard and Extended Community attributes\n"
4441 "Send Standard, Large and Extended Community attributes\n"
4442 "Send Extended Community attributes\n"
4443 "Send Standard Community attributes\n"
4444 "Send Large Community attributes\n")
4445 {
4446 int idx_peer = 2;
4447 uint32_t flag = 0;
4448 const char *type = argv[argc - 1]->text;
4449
4450 if (strmatch(type, "standard")) {
4451 SET_FLAG(flag, PEER_FLAG_SEND_COMMUNITY);
4452 } else if (strmatch(type, "extended")) {
4453 SET_FLAG(flag, PEER_FLAG_SEND_EXT_COMMUNITY);
4454 } else if (strmatch(type, "large")) {
4455 SET_FLAG(flag, PEER_FLAG_SEND_LARGE_COMMUNITY);
4456 } else if (strmatch(type, "both")) {
4457 SET_FLAG(flag, PEER_FLAG_SEND_COMMUNITY);
4458 SET_FLAG(flag, PEER_FLAG_SEND_EXT_COMMUNITY);
4459 } else { /* if (strmatch(type, "all")) */
4460 SET_FLAG(flag, PEER_FLAG_SEND_COMMUNITY);
4461 SET_FLAG(flag, PEER_FLAG_SEND_EXT_COMMUNITY);
4462 SET_FLAG(flag, PEER_FLAG_SEND_LARGE_COMMUNITY);
4463 }
4464
4465 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
4466 bgp_node_afi(vty), bgp_node_safi(vty),
4467 flag);
4468 }
4469
4470 ALIAS_HIDDEN(
4471 no_neighbor_send_community_type,
4472 no_neighbor_send_community_type_hidden_cmd,
4473 "no neighbor <A.B.C.D|X:X::X:X|WORD> send-community <both|all|extended|standard|large>",
4474 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4475 "Send Community attribute to this neighbor\n"
4476 "Send Standard and Extended Community attributes\n"
4477 "Send Standard, Large and Extended Community attributes\n"
4478 "Send Extended Community attributes\n"
4479 "Send Standard Community attributes\n"
4480 "Send Large Community attributes\n")
4481
4482 /* neighbor soft-reconfig. */
4483 DEFUN (neighbor_soft_reconfiguration,
4484 neighbor_soft_reconfiguration_cmd,
4485 "neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
4486 NEIGHBOR_STR
4487 NEIGHBOR_ADDR_STR2
4488 "Per neighbor soft reconfiguration\n"
4489 "Allow inbound soft reconfiguration for this neighbor\n")
4490 {
4491 int idx_peer = 1;
4492 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
4493 bgp_node_safi(vty),
4494 PEER_FLAG_SOFT_RECONFIG);
4495 }
4496
4497 ALIAS_HIDDEN(neighbor_soft_reconfiguration,
4498 neighbor_soft_reconfiguration_hidden_cmd,
4499 "neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
4500 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4501 "Per neighbor soft reconfiguration\n"
4502 "Allow inbound soft reconfiguration for this neighbor\n")
4503
4504 DEFUN (no_neighbor_soft_reconfiguration,
4505 no_neighbor_soft_reconfiguration_cmd,
4506 "no neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
4507 NO_STR
4508 NEIGHBOR_STR
4509 NEIGHBOR_ADDR_STR2
4510 "Per neighbor soft reconfiguration\n"
4511 "Allow inbound soft reconfiguration for this neighbor\n")
4512 {
4513 int idx_peer = 2;
4514 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
4515 bgp_node_afi(vty), bgp_node_safi(vty),
4516 PEER_FLAG_SOFT_RECONFIG);
4517 }
4518
4519 ALIAS_HIDDEN(no_neighbor_soft_reconfiguration,
4520 no_neighbor_soft_reconfiguration_hidden_cmd,
4521 "no neighbor <A.B.C.D|X:X::X:X|WORD> soft-reconfiguration inbound",
4522 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4523 "Per neighbor soft reconfiguration\n"
4524 "Allow inbound soft reconfiguration for this neighbor\n")
4525
4526 DEFUN (neighbor_route_reflector_client,
4527 neighbor_route_reflector_client_cmd,
4528 "neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
4529 NEIGHBOR_STR
4530 NEIGHBOR_ADDR_STR2
4531 "Configure a neighbor as Route Reflector client\n")
4532 {
4533 int idx_peer = 1;
4534 struct peer *peer;
4535
4536
4537 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
4538 if (!peer)
4539 return CMD_WARNING_CONFIG_FAILED;
4540
4541 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
4542 bgp_node_safi(vty),
4543 PEER_FLAG_REFLECTOR_CLIENT);
4544 }
4545
4546 ALIAS_HIDDEN(neighbor_route_reflector_client,
4547 neighbor_route_reflector_client_hidden_cmd,
4548 "neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
4549 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4550 "Configure a neighbor as Route Reflector client\n")
4551
4552 DEFUN (no_neighbor_route_reflector_client,
4553 no_neighbor_route_reflector_client_cmd,
4554 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
4555 NO_STR
4556 NEIGHBOR_STR
4557 NEIGHBOR_ADDR_STR2
4558 "Configure a neighbor as Route Reflector client\n")
4559 {
4560 int idx_peer = 2;
4561 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
4562 bgp_node_afi(vty), bgp_node_safi(vty),
4563 PEER_FLAG_REFLECTOR_CLIENT);
4564 }
4565
4566 ALIAS_HIDDEN(no_neighbor_route_reflector_client,
4567 no_neighbor_route_reflector_client_hidden_cmd,
4568 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-reflector-client",
4569 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4570 "Configure a neighbor as Route Reflector client\n")
4571
4572 /* neighbor route-server-client. */
4573 DEFUN (neighbor_route_server_client,
4574 neighbor_route_server_client_cmd,
4575 "neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
4576 NEIGHBOR_STR
4577 NEIGHBOR_ADDR_STR2
4578 "Configure a neighbor as Route Server client\n")
4579 {
4580 int idx_peer = 1;
4581 struct peer *peer;
4582
4583 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
4584 if (!peer)
4585 return CMD_WARNING_CONFIG_FAILED;
4586 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
4587 bgp_node_safi(vty),
4588 PEER_FLAG_RSERVER_CLIENT);
4589 }
4590
4591 ALIAS_HIDDEN(neighbor_route_server_client,
4592 neighbor_route_server_client_hidden_cmd,
4593 "neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
4594 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4595 "Configure a neighbor as Route Server client\n")
4596
4597 DEFUN (no_neighbor_route_server_client,
4598 no_neighbor_route_server_client_cmd,
4599 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
4600 NO_STR
4601 NEIGHBOR_STR
4602 NEIGHBOR_ADDR_STR2
4603 "Configure a neighbor as Route Server client\n")
4604 {
4605 int idx_peer = 2;
4606 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
4607 bgp_node_afi(vty), bgp_node_safi(vty),
4608 PEER_FLAG_RSERVER_CLIENT);
4609 }
4610
4611 ALIAS_HIDDEN(no_neighbor_route_server_client,
4612 no_neighbor_route_server_client_hidden_cmd,
4613 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-server-client",
4614 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4615 "Configure a neighbor as Route Server client\n")
4616
4617 DEFUN (neighbor_nexthop_local_unchanged,
4618 neighbor_nexthop_local_unchanged_cmd,
4619 "neighbor <A.B.C.D|X:X::X:X|WORD> nexthop-local unchanged",
4620 NEIGHBOR_STR
4621 NEIGHBOR_ADDR_STR2
4622 "Configure treatment of outgoing link-local nexthop attribute\n"
4623 "Leave link-local nexthop unchanged for this peer\n")
4624 {
4625 int idx_peer = 1;
4626 return peer_af_flag_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
4627 bgp_node_safi(vty),
4628 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED);
4629 }
4630
4631 DEFUN (no_neighbor_nexthop_local_unchanged,
4632 no_neighbor_nexthop_local_unchanged_cmd,
4633 "no neighbor <A.B.C.D|X:X::X:X|WORD> nexthop-local unchanged",
4634 NO_STR
4635 NEIGHBOR_STR
4636 NEIGHBOR_ADDR_STR2
4637 "Configure treatment of outgoing link-local-nexthop attribute\n"
4638 "Leave link-local nexthop unchanged for this peer\n")
4639 {
4640 int idx_peer = 2;
4641 return peer_af_flag_unset_vty(vty, argv[idx_peer]->arg,
4642 bgp_node_afi(vty), bgp_node_safi(vty),
4643 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED);
4644 }
4645
4646 DEFUN (neighbor_attr_unchanged,
4647 neighbor_attr_unchanged_cmd,
4648 "neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
4649 NEIGHBOR_STR
4650 NEIGHBOR_ADDR_STR2
4651 "BGP attribute is propagated unchanged to this neighbor\n"
4652 "As-path attribute\n"
4653 "Nexthop attribute\n"
4654 "Med attribute\n")
4655 {
4656 int idx = 0;
4657 char *peer_str = argv[1]->arg;
4658 struct peer *peer;
4659 uint16_t flags = 0;
4660 afi_t afi = bgp_node_afi(vty);
4661 safi_t safi = bgp_node_safi(vty);
4662
4663 peer = peer_and_group_lookup_vty(vty, peer_str);
4664 if (!peer)
4665 return CMD_WARNING_CONFIG_FAILED;
4666
4667 if (argv_find(argv, argc, "as-path", &idx))
4668 SET_FLAG(flags, PEER_FLAG_AS_PATH_UNCHANGED);
4669 idx = 0;
4670 if (argv_find(argv, argc, "next-hop", &idx))
4671 SET_FLAG(flags, PEER_FLAG_NEXTHOP_UNCHANGED);
4672 idx = 0;
4673 if (argv_find(argv, argc, "med", &idx))
4674 SET_FLAG(flags, PEER_FLAG_MED_UNCHANGED);
4675
4676 /* no flags means all of them! */
4677 if (!flags) {
4678 SET_FLAG(flags, PEER_FLAG_AS_PATH_UNCHANGED);
4679 SET_FLAG(flags, PEER_FLAG_NEXTHOP_UNCHANGED);
4680 SET_FLAG(flags, PEER_FLAG_MED_UNCHANGED);
4681 } else {
4682 if (!CHECK_FLAG(flags, PEER_FLAG_AS_PATH_UNCHANGED)
4683 && peer_af_flag_check(peer, afi, safi,
4684 PEER_FLAG_AS_PATH_UNCHANGED)) {
4685 peer_af_flag_unset_vty(vty, peer_str, afi, safi,
4686 PEER_FLAG_AS_PATH_UNCHANGED);
4687 }
4688
4689 if (!CHECK_FLAG(flags, PEER_FLAG_NEXTHOP_UNCHANGED)
4690 && peer_af_flag_check(peer, afi, safi,
4691 PEER_FLAG_NEXTHOP_UNCHANGED)) {
4692 peer_af_flag_unset_vty(vty, peer_str, afi, safi,
4693 PEER_FLAG_NEXTHOP_UNCHANGED);
4694 }
4695
4696 if (!CHECK_FLAG(flags, PEER_FLAG_MED_UNCHANGED)
4697 && peer_af_flag_check(peer, afi, safi,
4698 PEER_FLAG_MED_UNCHANGED)) {
4699 peer_af_flag_unset_vty(vty, peer_str, afi, safi,
4700 PEER_FLAG_MED_UNCHANGED);
4701 }
4702 }
4703
4704 return peer_af_flag_set_vty(vty, peer_str, afi, safi, flags);
4705 }
4706
4707 ALIAS_HIDDEN(
4708 neighbor_attr_unchanged, neighbor_attr_unchanged_hidden_cmd,
4709 "neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
4710 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4711 "BGP attribute is propagated unchanged to this neighbor\n"
4712 "As-path attribute\n"
4713 "Nexthop attribute\n"
4714 "Med attribute\n")
4715
4716 DEFUN (no_neighbor_attr_unchanged,
4717 no_neighbor_attr_unchanged_cmd,
4718 "no neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
4719 NO_STR
4720 NEIGHBOR_STR
4721 NEIGHBOR_ADDR_STR2
4722 "BGP attribute is propagated unchanged to this neighbor\n"
4723 "As-path attribute\n"
4724 "Nexthop attribute\n"
4725 "Med attribute\n")
4726 {
4727 int idx = 0;
4728 char *peer = argv[2]->arg;
4729 uint16_t flags = 0;
4730
4731 if (argv_find(argv, argc, "as-path", &idx))
4732 SET_FLAG(flags, PEER_FLAG_AS_PATH_UNCHANGED);
4733 idx = 0;
4734 if (argv_find(argv, argc, "next-hop", &idx))
4735 SET_FLAG(flags, PEER_FLAG_NEXTHOP_UNCHANGED);
4736 idx = 0;
4737 if (argv_find(argv, argc, "med", &idx))
4738 SET_FLAG(flags, PEER_FLAG_MED_UNCHANGED);
4739
4740 if (!flags) // no flags means all of them!
4741 {
4742 SET_FLAG(flags, PEER_FLAG_AS_PATH_UNCHANGED);
4743 SET_FLAG(flags, PEER_FLAG_NEXTHOP_UNCHANGED);
4744 SET_FLAG(flags, PEER_FLAG_MED_UNCHANGED);
4745 }
4746
4747 return peer_af_flag_unset_vty(vty, peer, bgp_node_afi(vty),
4748 bgp_node_safi(vty), flags);
4749 }
4750
4751 ALIAS_HIDDEN(
4752 no_neighbor_attr_unchanged, no_neighbor_attr_unchanged_hidden_cmd,
4753 "no neighbor <A.B.C.D|X:X::X:X|WORD> attribute-unchanged [{as-path|next-hop|med}]",
4754 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4755 "BGP attribute is propagated unchanged to this neighbor\n"
4756 "As-path attribute\n"
4757 "Nexthop attribute\n"
4758 "Med attribute\n")
4759
4760 /* EBGP multihop configuration. */
4761 static int peer_ebgp_multihop_set_vty(struct vty *vty, const char *ip_str,
4762 const char *ttl_str)
4763 {
4764 struct peer *peer;
4765 unsigned int ttl;
4766
4767 peer = peer_and_group_lookup_vty(vty, ip_str);
4768 if (!peer)
4769 return CMD_WARNING_CONFIG_FAILED;
4770
4771 if (peer->conf_if)
4772 return bgp_vty_return(vty, BGP_ERR_INVALID_FOR_DIRECT_PEER);
4773
4774 if (!ttl_str)
4775 ttl = MAXTTL;
4776 else
4777 ttl = strtoul(ttl_str, NULL, 10);
4778
4779 return bgp_vty_return(vty, peer_ebgp_multihop_set(peer, ttl));
4780 }
4781
4782 static int peer_ebgp_multihop_unset_vty(struct vty *vty, const char *ip_str)
4783 {
4784 struct peer *peer;
4785
4786 peer = peer_and_group_lookup_vty(vty, ip_str);
4787 if (!peer)
4788 return CMD_WARNING_CONFIG_FAILED;
4789
4790 return bgp_vty_return(vty, peer_ebgp_multihop_unset(peer));
4791 }
4792
4793 /* neighbor ebgp-multihop. */
4794 DEFUN (neighbor_ebgp_multihop,
4795 neighbor_ebgp_multihop_cmd,
4796 "neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop",
4797 NEIGHBOR_STR
4798 NEIGHBOR_ADDR_STR2
4799 "Allow EBGP neighbors not on directly connected networks\n")
4800 {
4801 int idx_peer = 1;
4802 return peer_ebgp_multihop_set_vty(vty, argv[idx_peer]->arg, NULL);
4803 }
4804
4805 DEFUN (neighbor_ebgp_multihop_ttl,
4806 neighbor_ebgp_multihop_ttl_cmd,
4807 "neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop (1-255)",
4808 NEIGHBOR_STR
4809 NEIGHBOR_ADDR_STR2
4810 "Allow EBGP neighbors not on directly connected networks\n"
4811 "maximum hop count\n")
4812 {
4813 int idx_peer = 1;
4814 int idx_number = 3;
4815 return peer_ebgp_multihop_set_vty(vty, argv[idx_peer]->arg,
4816 argv[idx_number]->arg);
4817 }
4818
4819 DEFUN (no_neighbor_ebgp_multihop,
4820 no_neighbor_ebgp_multihop_cmd,
4821 "no neighbor <A.B.C.D|X:X::X:X|WORD> ebgp-multihop [(1-255)]",
4822 NO_STR
4823 NEIGHBOR_STR
4824 NEIGHBOR_ADDR_STR2
4825 "Allow EBGP neighbors not on directly connected networks\n"
4826 "maximum hop count\n")
4827 {
4828 int idx_peer = 2;
4829 return peer_ebgp_multihop_unset_vty(vty, argv[idx_peer]->arg);
4830 }
4831
4832
4833 /* disable-connected-check */
4834 DEFUN (neighbor_disable_connected_check,
4835 neighbor_disable_connected_check_cmd,
4836 "neighbor <A.B.C.D|X:X::X:X|WORD> <disable-connected-check|enforce-multihop>",
4837 NEIGHBOR_STR
4838 NEIGHBOR_ADDR_STR2
4839 "one-hop away EBGP peer using loopback address\n"
4840 "Enforce EBGP neighbors perform multihop\n")
4841 {
4842 int idx_peer = 1;
4843 return peer_flag_set_vty(vty, argv[idx_peer]->arg,
4844 PEER_FLAG_DISABLE_CONNECTED_CHECK);
4845 }
4846
4847 DEFUN (no_neighbor_disable_connected_check,
4848 no_neighbor_disable_connected_check_cmd,
4849 "no neighbor <A.B.C.D|X:X::X:X|WORD> <disable-connected-check|enforce-multihop>",
4850 NO_STR
4851 NEIGHBOR_STR
4852 NEIGHBOR_ADDR_STR2
4853 "one-hop away EBGP peer using loopback address\n"
4854 "Enforce EBGP neighbors perform multihop\n")
4855 {
4856 int idx_peer = 2;
4857 return peer_flag_unset_vty(vty, argv[idx_peer]->arg,
4858 PEER_FLAG_DISABLE_CONNECTED_CHECK);
4859 }
4860
4861
4862 /* enforce-first-as */
4863 DEFUN (neighbor_enforce_first_as,
4864 neighbor_enforce_first_as_cmd,
4865 "neighbor <A.B.C.D|X:X::X:X|WORD> enforce-first-as",
4866 NEIGHBOR_STR
4867 NEIGHBOR_ADDR_STR2
4868 "Enforce the first AS for EBGP routes\n")
4869 {
4870 int idx_peer = 1;
4871
4872 return peer_flag_set_vty(vty, argv[idx_peer]->arg,
4873 PEER_FLAG_ENFORCE_FIRST_AS);
4874 }
4875
4876 DEFUN (no_neighbor_enforce_first_as,
4877 no_neighbor_enforce_first_as_cmd,
4878 "no neighbor <A.B.C.D|X:X::X:X|WORD> enforce-first-as",
4879 NO_STR
4880 NEIGHBOR_STR
4881 NEIGHBOR_ADDR_STR2
4882 "Enforce the first AS for EBGP routes\n")
4883 {
4884 int idx_peer = 2;
4885
4886 return peer_flag_unset_vty(vty, argv[idx_peer]->arg,
4887 PEER_FLAG_ENFORCE_FIRST_AS);
4888 }
4889
4890
4891 DEFUN (neighbor_description,
4892 neighbor_description_cmd,
4893 "neighbor <A.B.C.D|X:X::X:X|WORD> description LINE...",
4894 NEIGHBOR_STR
4895 NEIGHBOR_ADDR_STR2
4896 "Neighbor specific description\n"
4897 "Up to 80 characters describing this neighbor\n")
4898 {
4899 int idx_peer = 1;
4900 int idx_line = 3;
4901 struct peer *peer;
4902 char *str;
4903
4904 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
4905 if (!peer)
4906 return CMD_WARNING_CONFIG_FAILED;
4907
4908 str = argv_concat(argv, argc, idx_line);
4909
4910 peer_description_set(peer, str);
4911
4912 XFREE(MTYPE_TMP, str);
4913
4914 return CMD_SUCCESS;
4915 }
4916
4917 DEFUN (no_neighbor_description,
4918 no_neighbor_description_cmd,
4919 "no neighbor <A.B.C.D|X:X::X:X|WORD> description",
4920 NO_STR
4921 NEIGHBOR_STR
4922 NEIGHBOR_ADDR_STR2
4923 "Neighbor specific description\n")
4924 {
4925 int idx_peer = 2;
4926 struct peer *peer;
4927
4928 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
4929 if (!peer)
4930 return CMD_WARNING_CONFIG_FAILED;
4931
4932 peer_description_unset(peer);
4933
4934 return CMD_SUCCESS;
4935 }
4936
4937 ALIAS(no_neighbor_description, no_neighbor_description_comment_cmd,
4938 "no neighbor <A.B.C.D|X:X::X:X|WORD> description LINE...",
4939 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
4940 "Neighbor specific description\n"
4941 "Up to 80 characters describing this neighbor\n")
4942
4943 /* Neighbor update-source. */
4944 static int peer_update_source_vty(struct vty *vty, const char *peer_str,
4945 const char *source_str)
4946 {
4947 struct peer *peer;
4948 struct prefix p;
4949 union sockunion su;
4950
4951 peer = peer_and_group_lookup_vty(vty, peer_str);
4952 if (!peer)
4953 return CMD_WARNING_CONFIG_FAILED;
4954
4955 if (peer->conf_if)
4956 return CMD_WARNING;
4957
4958 if (source_str) {
4959 if (str2sockunion(source_str, &su) == 0)
4960 peer_update_source_addr_set(peer, &su);
4961 else {
4962 if (str2prefix(source_str, &p)) {
4963 vty_out(vty,
4964 "%% Invalid update-source, remove prefix length \n");
4965 return CMD_WARNING_CONFIG_FAILED;
4966 } else
4967 peer_update_source_if_set(peer, source_str);
4968 }
4969 } else
4970 peer_update_source_unset(peer);
4971
4972 return CMD_SUCCESS;
4973 }
4974
4975 #define BGP_UPDATE_SOURCE_HELP_STR \
4976 "IPv4 address\n" \
4977 "IPv6 address\n" \
4978 "Interface name (requires zebra to be running)\n"
4979
4980 DEFUN (neighbor_update_source,
4981 neighbor_update_source_cmd,
4982 "neighbor <A.B.C.D|X:X::X:X|WORD> update-source <A.B.C.D|X:X::X:X|WORD>",
4983 NEIGHBOR_STR
4984 NEIGHBOR_ADDR_STR2
4985 "Source of routing updates\n"
4986 BGP_UPDATE_SOURCE_HELP_STR)
4987 {
4988 int idx_peer = 1;
4989 int idx_peer_2 = 3;
4990 return peer_update_source_vty(vty, argv[idx_peer]->arg,
4991 argv[idx_peer_2]->arg);
4992 }
4993
4994 DEFUN (no_neighbor_update_source,
4995 no_neighbor_update_source_cmd,
4996 "no neighbor <A.B.C.D|X:X::X:X|WORD> update-source [<A.B.C.D|X:X::X:X|WORD>]",
4997 NO_STR
4998 NEIGHBOR_STR
4999 NEIGHBOR_ADDR_STR2
5000 "Source of routing updates\n"
5001 BGP_UPDATE_SOURCE_HELP_STR)
5002 {
5003 int idx_peer = 2;
5004 return peer_update_source_vty(vty, argv[idx_peer]->arg, NULL);
5005 }
5006
5007 static int peer_default_originate_set_vty(struct vty *vty, const char *peer_str,
5008 afi_t afi, safi_t safi,
5009 const char *rmap, int set)
5010 {
5011 int ret;
5012 struct peer *peer;
5013 struct route_map *route_map = NULL;
5014
5015 peer = peer_and_group_lookup_vty(vty, peer_str);
5016 if (!peer)
5017 return CMD_WARNING_CONFIG_FAILED;
5018
5019 if (set) {
5020 if (rmap)
5021 route_map = route_map_lookup_warn_noexist(vty, rmap);
5022 ret = peer_default_originate_set(peer, afi, safi,
5023 rmap, route_map);
5024 } else
5025 ret = peer_default_originate_unset(peer, afi, safi);
5026
5027 return bgp_vty_return(vty, ret);
5028 }
5029
5030 /* neighbor default-originate. */
5031 DEFUN (neighbor_default_originate,
5032 neighbor_default_originate_cmd,
5033 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate",
5034 NEIGHBOR_STR
5035 NEIGHBOR_ADDR_STR2
5036 "Originate default route to this neighbor\n")
5037 {
5038 int idx_peer = 1;
5039 return peer_default_originate_set_vty(vty, argv[idx_peer]->arg,
5040 bgp_node_afi(vty),
5041 bgp_node_safi(vty), NULL, 1);
5042 }
5043
5044 ALIAS_HIDDEN(neighbor_default_originate, neighbor_default_originate_hidden_cmd,
5045 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate",
5046 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5047 "Originate default route to this neighbor\n")
5048
5049 DEFUN (neighbor_default_originate_rmap,
5050 neighbor_default_originate_rmap_cmd,
5051 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate route-map WORD",
5052 NEIGHBOR_STR
5053 NEIGHBOR_ADDR_STR2
5054 "Originate default route to this neighbor\n"
5055 "Route-map to specify criteria to originate default\n"
5056 "route-map name\n")
5057 {
5058 int idx_peer = 1;
5059 int idx_word = 4;
5060 return peer_default_originate_set_vty(
5061 vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty),
5062 argv[idx_word]->arg, 1);
5063 }
5064
5065 ALIAS_HIDDEN(
5066 neighbor_default_originate_rmap,
5067 neighbor_default_originate_rmap_hidden_cmd,
5068 "neighbor <A.B.C.D|X:X::X:X|WORD> default-originate route-map WORD",
5069 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5070 "Originate default route to this neighbor\n"
5071 "Route-map to specify criteria to originate default\n"
5072 "route-map name\n")
5073
5074 DEFUN (no_neighbor_default_originate,
5075 no_neighbor_default_originate_cmd,
5076 "no neighbor <A.B.C.D|X:X::X:X|WORD> default-originate [route-map WORD]",
5077 NO_STR
5078 NEIGHBOR_STR
5079 NEIGHBOR_ADDR_STR2
5080 "Originate default route to this neighbor\n"
5081 "Route-map to specify criteria to originate default\n"
5082 "route-map name\n")
5083 {
5084 int idx_peer = 2;
5085 return peer_default_originate_set_vty(vty, argv[idx_peer]->arg,
5086 bgp_node_afi(vty),
5087 bgp_node_safi(vty), NULL, 0);
5088 }
5089
5090 ALIAS_HIDDEN(
5091 no_neighbor_default_originate, no_neighbor_default_originate_hidden_cmd,
5092 "no neighbor <A.B.C.D|X:X::X:X|WORD> default-originate [route-map WORD]",
5093 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5094 "Originate default route to this neighbor\n"
5095 "Route-map to specify criteria to originate default\n"
5096 "route-map name\n")
5097
5098
5099 /* Set neighbor's BGP port. */
5100 static int peer_port_vty(struct vty *vty, const char *ip_str, int afi,
5101 const char *port_str)
5102 {
5103 struct peer *peer;
5104 uint16_t port;
5105 struct servent *sp;
5106
5107 peer = peer_lookup_vty(vty, ip_str);
5108 if (!peer)
5109 return CMD_WARNING_CONFIG_FAILED;
5110
5111 if (!port_str) {
5112 sp = getservbyname("bgp", "tcp");
5113 port = (sp == NULL) ? BGP_PORT_DEFAULT : ntohs(sp->s_port);
5114 } else {
5115 port = strtoul(port_str, NULL, 10);
5116 }
5117
5118 peer_port_set(peer, port);
5119
5120 return CMD_SUCCESS;
5121 }
5122
5123 /* Set specified peer's BGP port. */
5124 DEFUN (neighbor_port,
5125 neighbor_port_cmd,
5126 "neighbor <A.B.C.D|X:X::X:X> port (0-65535)",
5127 NEIGHBOR_STR
5128 NEIGHBOR_ADDR_STR
5129 "Neighbor's BGP port\n"
5130 "TCP port number\n")
5131 {
5132 int idx_ip = 1;
5133 int idx_number = 3;
5134 return peer_port_vty(vty, argv[idx_ip]->arg, AFI_IP,
5135 argv[idx_number]->arg);
5136 }
5137
5138 DEFUN (no_neighbor_port,
5139 no_neighbor_port_cmd,
5140 "no neighbor <A.B.C.D|X:X::X:X> port [(0-65535)]",
5141 NO_STR
5142 NEIGHBOR_STR
5143 NEIGHBOR_ADDR_STR
5144 "Neighbor's BGP port\n"
5145 "TCP port number\n")
5146 {
5147 int idx_ip = 2;
5148 return peer_port_vty(vty, argv[idx_ip]->arg, AFI_IP, NULL);
5149 }
5150
5151
5152 /* neighbor weight. */
5153 static int peer_weight_set_vty(struct vty *vty, const char *ip_str, afi_t afi,
5154 safi_t safi, const char *weight_str)
5155 {
5156 int ret;
5157 struct peer *peer;
5158 unsigned long weight;
5159
5160 peer = peer_and_group_lookup_vty(vty, ip_str);
5161 if (!peer)
5162 return CMD_WARNING_CONFIG_FAILED;
5163
5164 weight = strtoul(weight_str, NULL, 10);
5165
5166 ret = peer_weight_set(peer, afi, safi, weight);
5167 return bgp_vty_return(vty, ret);
5168 }
5169
5170 static int peer_weight_unset_vty(struct vty *vty, const char *ip_str, afi_t afi,
5171 safi_t safi)
5172 {
5173 int ret;
5174 struct peer *peer;
5175
5176 peer = peer_and_group_lookup_vty(vty, ip_str);
5177 if (!peer)
5178 return CMD_WARNING_CONFIG_FAILED;
5179
5180 ret = peer_weight_unset(peer, afi, safi);
5181 return bgp_vty_return(vty, ret);
5182 }
5183
5184 DEFUN (neighbor_weight,
5185 neighbor_weight_cmd,
5186 "neighbor <A.B.C.D|X:X::X:X|WORD> weight (0-65535)",
5187 NEIGHBOR_STR
5188 NEIGHBOR_ADDR_STR2
5189 "Set default weight for routes from this neighbor\n"
5190 "default weight\n")
5191 {
5192 int idx_peer = 1;
5193 int idx_number = 3;
5194 return peer_weight_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
5195 bgp_node_safi(vty), argv[idx_number]->arg);
5196 }
5197
5198 ALIAS_HIDDEN(neighbor_weight, neighbor_weight_hidden_cmd,
5199 "neighbor <A.B.C.D|X:X::X:X|WORD> weight (0-65535)",
5200 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5201 "Set default weight for routes from this neighbor\n"
5202 "default weight\n")
5203
5204 DEFUN (no_neighbor_weight,
5205 no_neighbor_weight_cmd,
5206 "no neighbor <A.B.C.D|X:X::X:X|WORD> weight [(0-65535)]",
5207 NO_STR
5208 NEIGHBOR_STR
5209 NEIGHBOR_ADDR_STR2
5210 "Set default weight for routes from this neighbor\n"
5211 "default weight\n")
5212 {
5213 int idx_peer = 2;
5214 return peer_weight_unset_vty(vty, argv[idx_peer]->arg,
5215 bgp_node_afi(vty), bgp_node_safi(vty));
5216 }
5217
5218 ALIAS_HIDDEN(no_neighbor_weight, no_neighbor_weight_hidden_cmd,
5219 "no neighbor <A.B.C.D|X:X::X:X|WORD> weight [(0-65535)]",
5220 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5221 "Set default weight for routes from this neighbor\n"
5222 "default weight\n")
5223
5224
5225 /* Override capability negotiation. */
5226 DEFUN (neighbor_override_capability,
5227 neighbor_override_capability_cmd,
5228 "neighbor <A.B.C.D|X:X::X:X|WORD> override-capability",
5229 NEIGHBOR_STR
5230 NEIGHBOR_ADDR_STR2
5231 "Override capability negotiation result\n")
5232 {
5233 int idx_peer = 1;
5234 return peer_flag_set_vty(vty, argv[idx_peer]->arg,
5235 PEER_FLAG_OVERRIDE_CAPABILITY);
5236 }
5237
5238 DEFUN (no_neighbor_override_capability,
5239 no_neighbor_override_capability_cmd,
5240 "no neighbor <A.B.C.D|X:X::X:X|WORD> override-capability",
5241 NO_STR
5242 NEIGHBOR_STR
5243 NEIGHBOR_ADDR_STR2
5244 "Override capability negotiation result\n")
5245 {
5246 int idx_peer = 2;
5247 return peer_flag_unset_vty(vty, argv[idx_peer]->arg,
5248 PEER_FLAG_OVERRIDE_CAPABILITY);
5249 }
5250
5251 DEFUN (neighbor_strict_capability,
5252 neighbor_strict_capability_cmd,
5253 "neighbor <A.B.C.D|X:X::X:X|WORD> strict-capability-match",
5254 NEIGHBOR_STR
5255 NEIGHBOR_ADDR_STR2
5256 "Strict capability negotiation match\n")
5257 {
5258 int idx_peer = 1;
5259
5260 return peer_flag_set_vty(vty, argv[idx_peer]->arg,
5261 PEER_FLAG_STRICT_CAP_MATCH);
5262 }
5263
5264 DEFUN (no_neighbor_strict_capability,
5265 no_neighbor_strict_capability_cmd,
5266 "no neighbor <A.B.C.D|X:X::X:X|WORD> strict-capability-match",
5267 NO_STR
5268 NEIGHBOR_STR
5269 NEIGHBOR_ADDR_STR2
5270 "Strict capability negotiation match\n")
5271 {
5272 int idx_peer = 2;
5273
5274 return peer_flag_unset_vty(vty, argv[idx_peer]->arg,
5275 PEER_FLAG_STRICT_CAP_MATCH);
5276 }
5277
5278 static int peer_timers_set_vty(struct vty *vty, const char *ip_str,
5279 const char *keep_str, const char *hold_str)
5280 {
5281 int ret;
5282 struct peer *peer;
5283 uint32_t keepalive;
5284 uint32_t holdtime;
5285
5286 peer = peer_and_group_lookup_vty(vty, ip_str);
5287 if (!peer)
5288 return CMD_WARNING_CONFIG_FAILED;
5289
5290 keepalive = strtoul(keep_str, NULL, 10);
5291 holdtime = strtoul(hold_str, NULL, 10);
5292
5293 ret = peer_timers_set(peer, keepalive, holdtime);
5294
5295 return bgp_vty_return(vty, ret);
5296 }
5297
5298 static int peer_timers_unset_vty(struct vty *vty, const char *ip_str)
5299 {
5300 int ret;
5301 struct peer *peer;
5302
5303 peer = peer_and_group_lookup_vty(vty, ip_str);
5304 if (!peer)
5305 return CMD_WARNING_CONFIG_FAILED;
5306
5307 ret = peer_timers_unset(peer);
5308
5309 return bgp_vty_return(vty, ret);
5310 }
5311
5312 DEFUN (neighbor_timers,
5313 neighbor_timers_cmd,
5314 "neighbor <A.B.C.D|X:X::X:X|WORD> timers (0-65535) (0-65535)",
5315 NEIGHBOR_STR
5316 NEIGHBOR_ADDR_STR2
5317 "BGP per neighbor timers\n"
5318 "Keepalive interval\n"
5319 "Holdtime\n")
5320 {
5321 int idx_peer = 1;
5322 int idx_number = 3;
5323 int idx_number_2 = 4;
5324 return peer_timers_set_vty(vty, argv[idx_peer]->arg,
5325 argv[idx_number]->arg,
5326 argv[idx_number_2]->arg);
5327 }
5328
5329 DEFUN (no_neighbor_timers,
5330 no_neighbor_timers_cmd,
5331 "no neighbor <A.B.C.D|X:X::X:X|WORD> timers [(0-65535) (0-65535)]",
5332 NO_STR
5333 NEIGHBOR_STR
5334 NEIGHBOR_ADDR_STR2
5335 "BGP per neighbor timers\n"
5336 "Keepalive interval\n"
5337 "Holdtime\n")
5338 {
5339 int idx_peer = 2;
5340 return peer_timers_unset_vty(vty, argv[idx_peer]->arg);
5341 }
5342
5343
5344 static int peer_timers_connect_set_vty(struct vty *vty, const char *ip_str,
5345 const char *time_str)
5346 {
5347 int ret;
5348 struct peer *peer;
5349 uint32_t connect;
5350
5351 peer = peer_and_group_lookup_vty(vty, ip_str);
5352 if (!peer)
5353 return CMD_WARNING_CONFIG_FAILED;
5354
5355 connect = strtoul(time_str, NULL, 10);
5356
5357 ret = peer_timers_connect_set(peer, connect);
5358
5359 return bgp_vty_return(vty, ret);
5360 }
5361
5362 static int peer_timers_connect_unset_vty(struct vty *vty, const char *ip_str)
5363 {
5364 int ret;
5365 struct peer *peer;
5366
5367 peer = peer_and_group_lookup_vty(vty, ip_str);
5368 if (!peer)
5369 return CMD_WARNING_CONFIG_FAILED;
5370
5371 ret = peer_timers_connect_unset(peer);
5372
5373 return bgp_vty_return(vty, ret);
5374 }
5375
5376 DEFUN (neighbor_timers_connect,
5377 neighbor_timers_connect_cmd,
5378 "neighbor <A.B.C.D|X:X::X:X|WORD> timers connect (1-65535)",
5379 NEIGHBOR_STR
5380 NEIGHBOR_ADDR_STR2
5381 "BGP per neighbor timers\n"
5382 "BGP connect timer\n"
5383 "Connect timer\n")
5384 {
5385 int idx_peer = 1;
5386 int idx_number = 4;
5387 return peer_timers_connect_set_vty(vty, argv[idx_peer]->arg,
5388 argv[idx_number]->arg);
5389 }
5390
5391 DEFUN (no_neighbor_timers_connect,
5392 no_neighbor_timers_connect_cmd,
5393 "no neighbor <A.B.C.D|X:X::X:X|WORD> timers connect [(1-65535)]",
5394 NO_STR
5395 NEIGHBOR_STR
5396 NEIGHBOR_ADDR_STR2
5397 "BGP per neighbor timers\n"
5398 "BGP connect timer\n"
5399 "Connect timer\n")
5400 {
5401 int idx_peer = 2;
5402 return peer_timers_connect_unset_vty(vty, argv[idx_peer]->arg);
5403 }
5404
5405
5406 static int peer_advertise_interval_vty(struct vty *vty, const char *ip_str,
5407 const char *time_str, int set)
5408 {
5409 int ret;
5410 struct peer *peer;
5411 uint32_t routeadv = 0;
5412
5413 peer = peer_and_group_lookup_vty(vty, ip_str);
5414 if (!peer)
5415 return CMD_WARNING_CONFIG_FAILED;
5416
5417 if (time_str)
5418 routeadv = strtoul(time_str, NULL, 10);
5419
5420 if (set)
5421 ret = peer_advertise_interval_set(peer, routeadv);
5422 else
5423 ret = peer_advertise_interval_unset(peer);
5424
5425 return bgp_vty_return(vty, ret);
5426 }
5427
5428 DEFUN (neighbor_advertise_interval,
5429 neighbor_advertise_interval_cmd,
5430 "neighbor <A.B.C.D|X:X::X:X|WORD> advertisement-interval (0-600)",
5431 NEIGHBOR_STR
5432 NEIGHBOR_ADDR_STR2
5433 "Minimum interval between sending BGP routing updates\n"
5434 "time in seconds\n")
5435 {
5436 int idx_peer = 1;
5437 int idx_number = 3;
5438 return peer_advertise_interval_vty(vty, argv[idx_peer]->arg,
5439 argv[idx_number]->arg, 1);
5440 }
5441
5442 DEFUN (no_neighbor_advertise_interval,
5443 no_neighbor_advertise_interval_cmd,
5444 "no neighbor <A.B.C.D|X:X::X:X|WORD> advertisement-interval [(0-600)]",
5445 NO_STR
5446 NEIGHBOR_STR
5447 NEIGHBOR_ADDR_STR2
5448 "Minimum interval between sending BGP routing updates\n"
5449 "time in seconds\n")
5450 {
5451 int idx_peer = 2;
5452 return peer_advertise_interval_vty(vty, argv[idx_peer]->arg, NULL, 0);
5453 }
5454
5455
5456 /* Time to wait before processing route-map updates */
5457 DEFUN (bgp_set_route_map_delay_timer,
5458 bgp_set_route_map_delay_timer_cmd,
5459 "bgp route-map delay-timer (0-600)",
5460 SET_STR
5461 "BGP route-map delay timer\n"
5462 "Time in secs to wait before processing route-map changes\n"
5463 "0 disables the timer, no route updates happen when route-maps change\n")
5464 {
5465 int idx_number = 3;
5466 uint32_t rmap_delay_timer;
5467
5468 if (argv[idx_number]->arg) {
5469 rmap_delay_timer = strtoul(argv[idx_number]->arg, NULL, 10);
5470 bm->rmap_update_timer = rmap_delay_timer;
5471
5472 /* if the dynamic update handling is being disabled, and a timer
5473 * is
5474 * running, stop the timer and act as if the timer has already
5475 * fired.
5476 */
5477 if (!rmap_delay_timer && bm->t_rmap_update) {
5478 BGP_TIMER_OFF(bm->t_rmap_update);
5479 thread_execute(bm->master, bgp_route_map_update_timer,
5480 NULL, 0);
5481 }
5482 return CMD_SUCCESS;
5483 } else {
5484 vty_out(vty, "%% BGP invalid route-map delay-timer\n");
5485 return CMD_WARNING_CONFIG_FAILED;
5486 }
5487 }
5488
5489 DEFUN (no_bgp_set_route_map_delay_timer,
5490 no_bgp_set_route_map_delay_timer_cmd,
5491 "no bgp route-map delay-timer [(0-600)]",
5492 NO_STR
5493 BGP_STR
5494 "Default BGP route-map delay timer\n"
5495 "Reset to default time to wait for processing route-map changes\n"
5496 "0 disables the timer, no route updates happen when route-maps change\n")
5497 {
5498
5499 bm->rmap_update_timer = RMAP_DEFAULT_UPDATE_TIMER;
5500
5501 return CMD_SUCCESS;
5502 }
5503
5504
5505 /* neighbor interface */
5506 static int peer_interface_vty(struct vty *vty, const char *ip_str,
5507 const char *str)
5508 {
5509 struct peer *peer;
5510
5511 peer = peer_lookup_vty(vty, ip_str);
5512 if (!peer || peer->conf_if) {
5513 vty_out(vty, "%% BGP invalid peer %s\n", ip_str);
5514 return CMD_WARNING_CONFIG_FAILED;
5515 }
5516
5517 if (str)
5518 peer_interface_set(peer, str);
5519 else
5520 peer_interface_unset(peer);
5521
5522 return CMD_SUCCESS;
5523 }
5524
5525 DEFUN (neighbor_interface,
5526 neighbor_interface_cmd,
5527 "neighbor <A.B.C.D|X:X::X:X> interface WORD",
5528 NEIGHBOR_STR
5529 NEIGHBOR_ADDR_STR
5530 "Interface\n"
5531 "Interface name\n")
5532 {
5533 int idx_ip = 1;
5534 int idx_word = 3;
5535 return peer_interface_vty(vty, argv[idx_ip]->arg, argv[idx_word]->arg);
5536 }
5537
5538 DEFUN (no_neighbor_interface,
5539 no_neighbor_interface_cmd,
5540 "no neighbor <A.B.C.D|X:X::X:X|WORD> interface WORD",
5541 NO_STR
5542 NEIGHBOR_STR
5543 NEIGHBOR_ADDR_STR2
5544 "Interface\n"
5545 "Interface name\n")
5546 {
5547 int idx_peer = 2;
5548 return peer_interface_vty(vty, argv[idx_peer]->arg, NULL);
5549 }
5550
5551 DEFUN (neighbor_distribute_list,
5552 neighbor_distribute_list_cmd,
5553 "neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list <(1-199)|(1300-2699)|WORD> <in|out>",
5554 NEIGHBOR_STR
5555 NEIGHBOR_ADDR_STR2
5556 "Filter updates to/from this neighbor\n"
5557 "IP access-list number\n"
5558 "IP access-list number (expanded range)\n"
5559 "IP Access-list name\n"
5560 "Filter incoming updates\n"
5561 "Filter outgoing updates\n")
5562 {
5563 int idx_peer = 1;
5564 int idx_acl = 3;
5565 int direct, ret;
5566 struct peer *peer;
5567
5568 const char *pstr = argv[idx_peer]->arg;
5569 const char *acl = argv[idx_acl]->arg;
5570 const char *inout = argv[argc - 1]->text;
5571
5572 peer = peer_and_group_lookup_vty(vty, pstr);
5573 if (!peer)
5574 return CMD_WARNING_CONFIG_FAILED;
5575
5576 /* Check filter direction. */
5577 direct = strmatch(inout, "in") ? FILTER_IN : FILTER_OUT;
5578 ret = peer_distribute_set(peer, bgp_node_afi(vty), bgp_node_safi(vty),
5579 direct, acl);
5580
5581 return bgp_vty_return(vty, ret);
5582 }
5583
5584 ALIAS_HIDDEN(
5585 neighbor_distribute_list, neighbor_distribute_list_hidden_cmd,
5586 "neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list <(1-199)|(1300-2699)|WORD> <in|out>",
5587 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5588 "Filter updates to/from this neighbor\n"
5589 "IP access-list number\n"
5590 "IP access-list number (expanded range)\n"
5591 "IP Access-list name\n"
5592 "Filter incoming updates\n"
5593 "Filter outgoing updates\n")
5594
5595 DEFUN (no_neighbor_distribute_list,
5596 no_neighbor_distribute_list_cmd,
5597 "no neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list <(1-199)|(1300-2699)|WORD> <in|out>",
5598 NO_STR
5599 NEIGHBOR_STR
5600 NEIGHBOR_ADDR_STR2
5601 "Filter updates to/from this neighbor\n"
5602 "IP access-list number\n"
5603 "IP access-list number (expanded range)\n"
5604 "IP Access-list name\n"
5605 "Filter incoming updates\n"
5606 "Filter outgoing updates\n")
5607 {
5608 int idx_peer = 2;
5609 int direct, ret;
5610 struct peer *peer;
5611
5612 const char *pstr = argv[idx_peer]->arg;
5613 const char *inout = argv[argc - 1]->text;
5614
5615 peer = peer_and_group_lookup_vty(vty, pstr);
5616 if (!peer)
5617 return CMD_WARNING_CONFIG_FAILED;
5618
5619 /* Check filter direction. */
5620 direct = strmatch(inout, "in") ? FILTER_IN : FILTER_OUT;
5621 ret = peer_distribute_unset(peer, bgp_node_afi(vty), bgp_node_safi(vty),
5622 direct);
5623
5624 return bgp_vty_return(vty, ret);
5625 }
5626
5627 ALIAS_HIDDEN(
5628 no_neighbor_distribute_list, no_neighbor_distribute_list_hidden_cmd,
5629 "no neighbor <A.B.C.D|X:X::X:X|WORD> distribute-list <(1-199)|(1300-2699)|WORD> <in|out>",
5630 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5631 "Filter updates to/from this neighbor\n"
5632 "IP access-list number\n"
5633 "IP access-list number (expanded range)\n"
5634 "IP Access-list name\n"
5635 "Filter incoming updates\n"
5636 "Filter outgoing updates\n")
5637
5638 /* Set prefix list to the peer. */
5639 static int peer_prefix_list_set_vty(struct vty *vty, const char *ip_str,
5640 afi_t afi, safi_t safi,
5641 const char *name_str,
5642 const char *direct_str)
5643 {
5644 int ret;
5645 int direct = FILTER_IN;
5646 struct peer *peer;
5647
5648 peer = peer_and_group_lookup_vty(vty, ip_str);
5649 if (!peer)
5650 return CMD_WARNING_CONFIG_FAILED;
5651
5652 /* Check filter direction. */
5653 if (strncmp(direct_str, "i", 1) == 0)
5654 direct = FILTER_IN;
5655 else if (strncmp(direct_str, "o", 1) == 0)
5656 direct = FILTER_OUT;
5657
5658 ret = peer_prefix_list_set(peer, afi, safi, direct, name_str);
5659
5660 return bgp_vty_return(vty, ret);
5661 }
5662
5663 static int peer_prefix_list_unset_vty(struct vty *vty, const char *ip_str,
5664 afi_t afi, safi_t safi,
5665 const char *direct_str)
5666 {
5667 int ret;
5668 struct peer *peer;
5669 int direct = FILTER_IN;
5670
5671 peer = peer_and_group_lookup_vty(vty, ip_str);
5672 if (!peer)
5673 return CMD_WARNING_CONFIG_FAILED;
5674
5675 /* Check filter direction. */
5676 if (strncmp(direct_str, "i", 1) == 0)
5677 direct = FILTER_IN;
5678 else if (strncmp(direct_str, "o", 1) == 0)
5679 direct = FILTER_OUT;
5680
5681 ret = peer_prefix_list_unset(peer, afi, safi, direct);
5682
5683 return bgp_vty_return(vty, ret);
5684 }
5685
5686 DEFUN (neighbor_prefix_list,
5687 neighbor_prefix_list_cmd,
5688 "neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
5689 NEIGHBOR_STR
5690 NEIGHBOR_ADDR_STR2
5691 "Filter updates to/from this neighbor\n"
5692 "Name of a prefix list\n"
5693 "Filter incoming updates\n"
5694 "Filter outgoing updates\n")
5695 {
5696 int idx_peer = 1;
5697 int idx_word = 3;
5698 int idx_in_out = 4;
5699 return peer_prefix_list_set_vty(
5700 vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty),
5701 argv[idx_word]->arg, argv[idx_in_out]->arg);
5702 }
5703
5704 ALIAS_HIDDEN(neighbor_prefix_list, neighbor_prefix_list_hidden_cmd,
5705 "neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
5706 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5707 "Filter updates to/from this neighbor\n"
5708 "Name of a prefix list\n"
5709 "Filter incoming updates\n"
5710 "Filter outgoing updates\n")
5711
5712 DEFUN (no_neighbor_prefix_list,
5713 no_neighbor_prefix_list_cmd,
5714 "no neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
5715 NO_STR
5716 NEIGHBOR_STR
5717 NEIGHBOR_ADDR_STR2
5718 "Filter updates to/from this neighbor\n"
5719 "Name of a prefix list\n"
5720 "Filter incoming updates\n"
5721 "Filter outgoing updates\n")
5722 {
5723 int idx_peer = 2;
5724 int idx_in_out = 5;
5725 return peer_prefix_list_unset_vty(vty, argv[idx_peer]->arg,
5726 bgp_node_afi(vty), bgp_node_safi(vty),
5727 argv[idx_in_out]->arg);
5728 }
5729
5730 ALIAS_HIDDEN(no_neighbor_prefix_list, no_neighbor_prefix_list_hidden_cmd,
5731 "no neighbor <A.B.C.D|X:X::X:X|WORD> prefix-list WORD <in|out>",
5732 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5733 "Filter updates to/from this neighbor\n"
5734 "Name of a prefix list\n"
5735 "Filter incoming updates\n"
5736 "Filter outgoing updates\n")
5737
5738 static int peer_aslist_set_vty(struct vty *vty, const char *ip_str, afi_t afi,
5739 safi_t safi, const char *name_str,
5740 const char *direct_str)
5741 {
5742 int ret;
5743 struct peer *peer;
5744 int direct = FILTER_IN;
5745
5746 peer = peer_and_group_lookup_vty(vty, ip_str);
5747 if (!peer)
5748 return CMD_WARNING_CONFIG_FAILED;
5749
5750 /* Check filter direction. */
5751 if (strncmp(direct_str, "i", 1) == 0)
5752 direct = FILTER_IN;
5753 else if (strncmp(direct_str, "o", 1) == 0)
5754 direct = FILTER_OUT;
5755
5756 ret = peer_aslist_set(peer, afi, safi, direct, name_str);
5757
5758 return bgp_vty_return(vty, ret);
5759 }
5760
5761 static int peer_aslist_unset_vty(struct vty *vty, const char *ip_str, afi_t afi,
5762 safi_t safi, const char *direct_str)
5763 {
5764 int ret;
5765 struct peer *peer;
5766 int direct = FILTER_IN;
5767
5768 peer = peer_and_group_lookup_vty(vty, ip_str);
5769 if (!peer)
5770 return CMD_WARNING_CONFIG_FAILED;
5771
5772 /* Check filter direction. */
5773 if (strncmp(direct_str, "i", 1) == 0)
5774 direct = FILTER_IN;
5775 else if (strncmp(direct_str, "o", 1) == 0)
5776 direct = FILTER_OUT;
5777
5778 ret = peer_aslist_unset(peer, afi, safi, direct);
5779
5780 return bgp_vty_return(vty, ret);
5781 }
5782
5783 DEFUN (neighbor_filter_list,
5784 neighbor_filter_list_cmd,
5785 "neighbor <A.B.C.D|X:X::X:X|WORD> filter-list WORD <in|out>",
5786 NEIGHBOR_STR
5787 NEIGHBOR_ADDR_STR2
5788 "Establish BGP filters\n"
5789 "AS path access-list name\n"
5790 "Filter incoming routes\n"
5791 "Filter outgoing routes\n")
5792 {
5793 int idx_peer = 1;
5794 int idx_word = 3;
5795 int idx_in_out = 4;
5796 return peer_aslist_set_vty(vty, argv[idx_peer]->arg, bgp_node_afi(vty),
5797 bgp_node_safi(vty), argv[idx_word]->arg,
5798 argv[idx_in_out]->arg);
5799 }
5800
5801 ALIAS_HIDDEN(neighbor_filter_list, neighbor_filter_list_hidden_cmd,
5802 "neighbor <A.B.C.D|X:X::X:X|WORD> filter-list WORD <in|out>",
5803 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5804 "Establish BGP filters\n"
5805 "AS path access-list name\n"
5806 "Filter incoming routes\n"
5807 "Filter outgoing routes\n")
5808
5809 DEFUN (no_neighbor_filter_list,
5810 no_neighbor_filter_list_cmd,
5811 "no neighbor <A.B.C.D|X:X::X:X|WORD> filter-list WORD <in|out>",
5812 NO_STR
5813 NEIGHBOR_STR
5814 NEIGHBOR_ADDR_STR2
5815 "Establish BGP filters\n"
5816 "AS path access-list name\n"
5817 "Filter incoming routes\n"
5818 "Filter outgoing routes\n")
5819 {
5820 int idx_peer = 2;
5821 int idx_in_out = 5;
5822 return peer_aslist_unset_vty(vty, argv[idx_peer]->arg,
5823 bgp_node_afi(vty), bgp_node_safi(vty),
5824 argv[idx_in_out]->arg);
5825 }
5826
5827 ALIAS_HIDDEN(no_neighbor_filter_list, no_neighbor_filter_list_hidden_cmd,
5828 "no neighbor <A.B.C.D|X:X::X:X|WORD> filter-list WORD <in|out>",
5829 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5830 "Establish BGP filters\n"
5831 "AS path access-list name\n"
5832 "Filter incoming routes\n"
5833 "Filter outgoing routes\n")
5834
5835 /* Set route-map to the peer. */
5836 static int peer_route_map_set_vty(struct vty *vty, const char *ip_str,
5837 afi_t afi, safi_t safi, const char *name_str,
5838 const char *direct_str)
5839 {
5840 int ret;
5841 struct peer *peer;
5842 int direct = RMAP_IN;
5843 struct route_map *route_map;
5844
5845 peer = peer_and_group_lookup_vty(vty, ip_str);
5846 if (!peer)
5847 return CMD_WARNING_CONFIG_FAILED;
5848
5849 /* Check filter direction. */
5850 if (strncmp(direct_str, "in", 2) == 0)
5851 direct = RMAP_IN;
5852 else if (strncmp(direct_str, "o", 1) == 0)
5853 direct = RMAP_OUT;
5854
5855 route_map = route_map_lookup_warn_noexist(vty, name_str);
5856 ret = peer_route_map_set(peer, afi, safi, direct, name_str, route_map);
5857
5858 return bgp_vty_return(vty, ret);
5859 }
5860
5861 static int peer_route_map_unset_vty(struct vty *vty, const char *ip_str,
5862 afi_t afi, safi_t safi,
5863 const char *direct_str)
5864 {
5865 int ret;
5866 struct peer *peer;
5867 int direct = RMAP_IN;
5868
5869 peer = peer_and_group_lookup_vty(vty, ip_str);
5870 if (!peer)
5871 return CMD_WARNING_CONFIG_FAILED;
5872
5873 /* Check filter direction. */
5874 if (strncmp(direct_str, "in", 2) == 0)
5875 direct = RMAP_IN;
5876 else if (strncmp(direct_str, "o", 1) == 0)
5877 direct = RMAP_OUT;
5878
5879 ret = peer_route_map_unset(peer, afi, safi, direct);
5880
5881 return bgp_vty_return(vty, ret);
5882 }
5883
5884 DEFUN (neighbor_route_map,
5885 neighbor_route_map_cmd,
5886 "neighbor <A.B.C.D|X:X::X:X|WORD> route-map WORD <in|out>",
5887 NEIGHBOR_STR
5888 NEIGHBOR_ADDR_STR2
5889 "Apply route map to neighbor\n"
5890 "Name of route map\n"
5891 "Apply map to incoming routes\n"
5892 "Apply map to outbound routes\n")
5893 {
5894 int idx_peer = 1;
5895 int idx_word = 3;
5896 int idx_in_out = 4;
5897 return peer_route_map_set_vty(
5898 vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty),
5899 argv[idx_word]->arg, argv[idx_in_out]->arg);
5900 }
5901
5902 ALIAS_HIDDEN(neighbor_route_map, neighbor_route_map_hidden_cmd,
5903 "neighbor <A.B.C.D|X:X::X:X|WORD> route-map WORD <in|out>",
5904 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5905 "Apply route map to neighbor\n"
5906 "Name of route map\n"
5907 "Apply map to incoming routes\n"
5908 "Apply map to outbound routes\n")
5909
5910 DEFUN (no_neighbor_route_map,
5911 no_neighbor_route_map_cmd,
5912 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-map WORD <in|out>",
5913 NO_STR
5914 NEIGHBOR_STR
5915 NEIGHBOR_ADDR_STR2
5916 "Apply route map to neighbor\n"
5917 "Name of route map\n"
5918 "Apply map to incoming routes\n"
5919 "Apply map to outbound routes\n")
5920 {
5921 int idx_peer = 2;
5922 int idx_in_out = 5;
5923 return peer_route_map_unset_vty(vty, argv[idx_peer]->arg,
5924 bgp_node_afi(vty), bgp_node_safi(vty),
5925 argv[idx_in_out]->arg);
5926 }
5927
5928 ALIAS_HIDDEN(no_neighbor_route_map, no_neighbor_route_map_hidden_cmd,
5929 "no neighbor <A.B.C.D|X:X::X:X|WORD> route-map WORD <in|out>",
5930 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5931 "Apply route map to neighbor\n"
5932 "Name of route map\n"
5933 "Apply map to incoming routes\n"
5934 "Apply map to outbound routes\n")
5935
5936 /* Set unsuppress-map to the peer. */
5937 static int peer_unsuppress_map_set_vty(struct vty *vty, const char *ip_str,
5938 afi_t afi, safi_t safi,
5939 const char *name_str)
5940 {
5941 int ret;
5942 struct peer *peer;
5943 struct route_map *route_map;
5944
5945 peer = peer_and_group_lookup_vty(vty, ip_str);
5946 if (!peer)
5947 return CMD_WARNING_CONFIG_FAILED;
5948
5949 route_map = route_map_lookup_warn_noexist(vty, name_str);
5950 ret = peer_unsuppress_map_set(peer, afi, safi, name_str, route_map);
5951
5952 return bgp_vty_return(vty, ret);
5953 }
5954
5955 /* Unset route-map from the peer. */
5956 static int peer_unsuppress_map_unset_vty(struct vty *vty, const char *ip_str,
5957 afi_t afi, safi_t safi)
5958 {
5959 int ret;
5960 struct peer *peer;
5961
5962 peer = peer_and_group_lookup_vty(vty, ip_str);
5963 if (!peer)
5964 return CMD_WARNING_CONFIG_FAILED;
5965
5966 ret = peer_unsuppress_map_unset(peer, afi, safi);
5967
5968 return bgp_vty_return(vty, ret);
5969 }
5970
5971 DEFUN (neighbor_unsuppress_map,
5972 neighbor_unsuppress_map_cmd,
5973 "neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
5974 NEIGHBOR_STR
5975 NEIGHBOR_ADDR_STR2
5976 "Route-map to selectively unsuppress suppressed routes\n"
5977 "Name of route map\n")
5978 {
5979 int idx_peer = 1;
5980 int idx_word = 3;
5981 return peer_unsuppress_map_set_vty(
5982 vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty),
5983 argv[idx_word]->arg);
5984 }
5985
5986 ALIAS_HIDDEN(neighbor_unsuppress_map, neighbor_unsuppress_map_hidden_cmd,
5987 "neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
5988 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
5989 "Route-map to selectively unsuppress suppressed routes\n"
5990 "Name of route map\n")
5991
5992 DEFUN (no_neighbor_unsuppress_map,
5993 no_neighbor_unsuppress_map_cmd,
5994 "no neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
5995 NO_STR
5996 NEIGHBOR_STR
5997 NEIGHBOR_ADDR_STR2
5998 "Route-map to selectively unsuppress suppressed routes\n"
5999 "Name of route map\n")
6000 {
6001 int idx_peer = 2;
6002 return peer_unsuppress_map_unset_vty(vty, argv[idx_peer]->arg,
6003 bgp_node_afi(vty),
6004 bgp_node_safi(vty));
6005 }
6006
6007 ALIAS_HIDDEN(no_neighbor_unsuppress_map, no_neighbor_unsuppress_map_hidden_cmd,
6008 "no neighbor <A.B.C.D|X:X::X:X|WORD> unsuppress-map WORD",
6009 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6010 "Route-map to selectively unsuppress suppressed routes\n"
6011 "Name of route map\n")
6012
6013 static int peer_maximum_prefix_set_vty(struct vty *vty, const char *ip_str,
6014 afi_t afi, safi_t safi,
6015 const char *num_str,
6016 const char *threshold_str, int warning,
6017 const char *restart_str)
6018 {
6019 int ret;
6020 struct peer *peer;
6021 uint32_t max;
6022 uint8_t threshold;
6023 uint16_t restart;
6024
6025 peer = peer_and_group_lookup_vty(vty, ip_str);
6026 if (!peer)
6027 return CMD_WARNING_CONFIG_FAILED;
6028
6029 max = strtoul(num_str, NULL, 10);
6030 if (threshold_str)
6031 threshold = atoi(threshold_str);
6032 else
6033 threshold = MAXIMUM_PREFIX_THRESHOLD_DEFAULT;
6034
6035 if (restart_str)
6036 restart = atoi(restart_str);
6037 else
6038 restart = 0;
6039
6040 ret = peer_maximum_prefix_set(peer, afi, safi, max, threshold, warning,
6041 restart);
6042
6043 return bgp_vty_return(vty, ret);
6044 }
6045
6046 static int peer_maximum_prefix_unset_vty(struct vty *vty, const char *ip_str,
6047 afi_t afi, safi_t safi)
6048 {
6049 int ret;
6050 struct peer *peer;
6051
6052 peer = peer_and_group_lookup_vty(vty, ip_str);
6053 if (!peer)
6054 return CMD_WARNING_CONFIG_FAILED;
6055
6056 ret = peer_maximum_prefix_unset(peer, afi, safi);
6057
6058 return bgp_vty_return(vty, ret);
6059 }
6060
6061 /* Maximum number of prefix configuration. prefix count is different
6062 for each peer configuration. So this configuration can be set for
6063 each peer configuration. */
6064 DEFUN (neighbor_maximum_prefix,
6065 neighbor_maximum_prefix_cmd,
6066 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295)",
6067 NEIGHBOR_STR
6068 NEIGHBOR_ADDR_STR2
6069 "Maximum number of prefix accept from this peer\n"
6070 "maximum no. of prefix limit\n")
6071 {
6072 int idx_peer = 1;
6073 int idx_number = 3;
6074 return peer_maximum_prefix_set_vty(
6075 vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty),
6076 argv[idx_number]->arg, NULL, 0, NULL);
6077 }
6078
6079 ALIAS_HIDDEN(neighbor_maximum_prefix, neighbor_maximum_prefix_hidden_cmd,
6080 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295)",
6081 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6082 "Maximum number of prefix accept from this peer\n"
6083 "maximum no. of prefix limit\n")
6084
6085 DEFUN (neighbor_maximum_prefix_threshold,
6086 neighbor_maximum_prefix_threshold_cmd,
6087 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100)",
6088 NEIGHBOR_STR
6089 NEIGHBOR_ADDR_STR2
6090 "Maximum number of prefix accept from this peer\n"
6091 "maximum no. of prefix limit\n"
6092 "Threshold value (%) at which to generate a warning msg\n")
6093 {
6094 int idx_peer = 1;
6095 int idx_number = 3;
6096 int idx_number_2 = 4;
6097 return peer_maximum_prefix_set_vty(
6098 vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty),
6099 argv[idx_number]->arg, argv[idx_number_2]->arg, 0, NULL);
6100 }
6101
6102 ALIAS_HIDDEN(
6103 neighbor_maximum_prefix_threshold,
6104 neighbor_maximum_prefix_threshold_hidden_cmd,
6105 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100)",
6106 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6107 "Maximum number of prefix accept from this peer\n"
6108 "maximum no. of prefix limit\n"
6109 "Threshold value (%) at which to generate a warning msg\n")
6110
6111 DEFUN (neighbor_maximum_prefix_warning,
6112 neighbor_maximum_prefix_warning_cmd,
6113 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) warning-only",
6114 NEIGHBOR_STR
6115 NEIGHBOR_ADDR_STR2
6116 "Maximum number of prefix accept from this peer\n"
6117 "maximum no. of prefix limit\n"
6118 "Only give warning message when limit is exceeded\n")
6119 {
6120 int idx_peer = 1;
6121 int idx_number = 3;
6122 return peer_maximum_prefix_set_vty(
6123 vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty),
6124 argv[idx_number]->arg, NULL, 1, NULL);
6125 }
6126
6127 ALIAS_HIDDEN(
6128 neighbor_maximum_prefix_warning,
6129 neighbor_maximum_prefix_warning_hidden_cmd,
6130 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) warning-only",
6131 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6132 "Maximum number of prefix accept from this peer\n"
6133 "maximum no. of prefix limit\n"
6134 "Only give warning message when limit is exceeded\n")
6135
6136 DEFUN (neighbor_maximum_prefix_threshold_warning,
6137 neighbor_maximum_prefix_threshold_warning_cmd,
6138 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) warning-only",
6139 NEIGHBOR_STR
6140 NEIGHBOR_ADDR_STR2
6141 "Maximum number of prefix accept from this peer\n"
6142 "maximum no. of prefix limit\n"
6143 "Threshold value (%) at which to generate a warning msg\n"
6144 "Only give warning message when limit is exceeded\n")
6145 {
6146 int idx_peer = 1;
6147 int idx_number = 3;
6148 int idx_number_2 = 4;
6149 return peer_maximum_prefix_set_vty(
6150 vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty),
6151 argv[idx_number]->arg, argv[idx_number_2]->arg, 1, NULL);
6152 }
6153
6154 ALIAS_HIDDEN(
6155 neighbor_maximum_prefix_threshold_warning,
6156 neighbor_maximum_prefix_threshold_warning_hidden_cmd,
6157 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) warning-only",
6158 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6159 "Maximum number of prefix accept from this peer\n"
6160 "maximum no. of prefix limit\n"
6161 "Threshold value (%) at which to generate a warning msg\n"
6162 "Only give warning message when limit is exceeded\n")
6163
6164 DEFUN (neighbor_maximum_prefix_restart,
6165 neighbor_maximum_prefix_restart_cmd,
6166 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) restart (1-65535)",
6167 NEIGHBOR_STR
6168 NEIGHBOR_ADDR_STR2
6169 "Maximum number of prefix accept from this peer\n"
6170 "maximum no. of prefix limit\n"
6171 "Restart bgp connection after limit is exceeded\n"
6172 "Restart interval in minutes\n")
6173 {
6174 int idx_peer = 1;
6175 int idx_number = 3;
6176 int idx_number_2 = 5;
6177 return peer_maximum_prefix_set_vty(
6178 vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty),
6179 argv[idx_number]->arg, NULL, 0, argv[idx_number_2]->arg);
6180 }
6181
6182 ALIAS_HIDDEN(
6183 neighbor_maximum_prefix_restart,
6184 neighbor_maximum_prefix_restart_hidden_cmd,
6185 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) restart (1-65535)",
6186 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6187 "Maximum number of prefix accept from this peer\n"
6188 "maximum no. of prefix limit\n"
6189 "Restart bgp connection after limit is exceeded\n"
6190 "Restart interval in minutes\n")
6191
6192 DEFUN (neighbor_maximum_prefix_threshold_restart,
6193 neighbor_maximum_prefix_threshold_restart_cmd,
6194 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) restart (1-65535)",
6195 NEIGHBOR_STR
6196 NEIGHBOR_ADDR_STR2
6197 "Maximum number of prefixes to accept from this peer\n"
6198 "maximum no. of prefix limit\n"
6199 "Threshold value (%) at which to generate a warning msg\n"
6200 "Restart bgp connection after limit is exceeded\n"
6201 "Restart interval in minutes\n")
6202 {
6203 int idx_peer = 1;
6204 int idx_number = 3;
6205 int idx_number_2 = 4;
6206 int idx_number_3 = 6;
6207 return peer_maximum_prefix_set_vty(
6208 vty, argv[idx_peer]->arg, bgp_node_afi(vty), bgp_node_safi(vty),
6209 argv[idx_number]->arg, argv[idx_number_2]->arg, 0,
6210 argv[idx_number_3]->arg);
6211 }
6212
6213 ALIAS_HIDDEN(
6214 neighbor_maximum_prefix_threshold_restart,
6215 neighbor_maximum_prefix_threshold_restart_hidden_cmd,
6216 "neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix (1-4294967295) (1-100) restart (1-65535)",
6217 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6218 "Maximum number of prefixes to accept from this peer\n"
6219 "maximum no. of prefix limit\n"
6220 "Threshold value (%) at which to generate a warning msg\n"
6221 "Restart bgp connection after limit is exceeded\n"
6222 "Restart interval in minutes\n")
6223
6224 DEFUN (no_neighbor_maximum_prefix,
6225 no_neighbor_maximum_prefix_cmd,
6226 "no neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix [(1-4294967295) [(1-100)] [restart (1-65535)] [warning-only]]",
6227 NO_STR
6228 NEIGHBOR_STR
6229 NEIGHBOR_ADDR_STR2
6230 "Maximum number of prefixes to accept from this peer\n"
6231 "maximum no. of prefix limit\n"
6232 "Threshold value (%) at which to generate a warning msg\n"
6233 "Restart bgp connection after limit is exceeded\n"
6234 "Restart interval in minutes\n"
6235 "Only give warning message when limit is exceeded\n")
6236 {
6237 int idx_peer = 2;
6238 return peer_maximum_prefix_unset_vty(vty, argv[idx_peer]->arg,
6239 bgp_node_afi(vty),
6240 bgp_node_safi(vty));
6241 }
6242
6243 ALIAS_HIDDEN(
6244 no_neighbor_maximum_prefix, no_neighbor_maximum_prefix_hidden_cmd,
6245 "no neighbor <A.B.C.D|X:X::X:X|WORD> maximum-prefix [(1-4294967295) [(1-100)] [restart (1-65535)] [warning-only]]",
6246 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6247 "Maximum number of prefixes to accept from this peer\n"
6248 "maximum no. of prefix limit\n"
6249 "Threshold value (%) at which to generate a warning msg\n"
6250 "Restart bgp connection after limit is exceeded\n"
6251 "Restart interval in minutes\n"
6252 "Only give warning message when limit is exceeded\n")
6253
6254
6255 /* "neighbor allowas-in" */
6256 DEFUN (neighbor_allowas_in,
6257 neighbor_allowas_in_cmd,
6258 "neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
6259 NEIGHBOR_STR
6260 NEIGHBOR_ADDR_STR2
6261 "Accept as-path with my AS present in it\n"
6262 "Number of occurrences of AS number\n"
6263 "Only accept my AS in the as-path if the route was originated in my AS\n")
6264 {
6265 int idx_peer = 1;
6266 int idx_number_origin = 3;
6267 int ret;
6268 int origin = 0;
6269 struct peer *peer;
6270 int allow_num = 0;
6271
6272 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
6273 if (!peer)
6274 return CMD_WARNING_CONFIG_FAILED;
6275
6276 if (argc <= idx_number_origin)
6277 allow_num = 3;
6278 else {
6279 if (argv[idx_number_origin]->type == WORD_TKN)
6280 origin = 1;
6281 else
6282 allow_num = atoi(argv[idx_number_origin]->arg);
6283 }
6284
6285 ret = peer_allowas_in_set(peer, bgp_node_afi(vty), bgp_node_safi(vty),
6286 allow_num, origin);
6287
6288 return bgp_vty_return(vty, ret);
6289 }
6290
6291 ALIAS_HIDDEN(
6292 neighbor_allowas_in, neighbor_allowas_in_hidden_cmd,
6293 "neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
6294 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6295 "Accept as-path with my AS present in it\n"
6296 "Number of occurrences of AS number\n"
6297 "Only accept my AS in the as-path if the route was originated in my AS\n")
6298
6299 DEFUN (no_neighbor_allowas_in,
6300 no_neighbor_allowas_in_cmd,
6301 "no neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
6302 NO_STR
6303 NEIGHBOR_STR
6304 NEIGHBOR_ADDR_STR2
6305 "allow local ASN appears in aspath attribute\n"
6306 "Number of occurrences of AS number\n"
6307 "Only accept my AS in the as-path if the route was originated in my AS\n")
6308 {
6309 int idx_peer = 2;
6310 int ret;
6311 struct peer *peer;
6312
6313 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
6314 if (!peer)
6315 return CMD_WARNING_CONFIG_FAILED;
6316
6317 ret = peer_allowas_in_unset(peer, bgp_node_afi(vty),
6318 bgp_node_safi(vty));
6319
6320 return bgp_vty_return(vty, ret);
6321 }
6322
6323 ALIAS_HIDDEN(
6324 no_neighbor_allowas_in, no_neighbor_allowas_in_hidden_cmd,
6325 "no neighbor <A.B.C.D|X:X::X:X|WORD> allowas-in [<(1-10)|origin>]",
6326 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6327 "allow local ASN appears in aspath attribute\n"
6328 "Number of occurrences of AS number\n"
6329 "Only accept my AS in the as-path if the route was originated in my AS\n")
6330
6331 DEFUN (neighbor_ttl_security,
6332 neighbor_ttl_security_cmd,
6333 "neighbor <A.B.C.D|X:X::X:X|WORD> ttl-security hops (1-254)",
6334 NEIGHBOR_STR
6335 NEIGHBOR_ADDR_STR2
6336 "BGP ttl-security parameters\n"
6337 "Specify the maximum number of hops to the BGP peer\n"
6338 "Number of hops to BGP peer\n")
6339 {
6340 int idx_peer = 1;
6341 int idx_number = 4;
6342 struct peer *peer;
6343 int gtsm_hops;
6344
6345 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
6346 if (!peer)
6347 return CMD_WARNING_CONFIG_FAILED;
6348
6349 gtsm_hops = strtoul(argv[idx_number]->arg, NULL, 10);
6350
6351 /*
6352 * If 'neighbor swpX', then this is for directly connected peers,
6353 * we should not accept a ttl-security hops value greater than 1.
6354 */
6355 if (peer->conf_if && (gtsm_hops > 1)) {
6356 vty_out(vty,
6357 "%s is directly connected peer, hops cannot exceed 1\n",
6358 argv[idx_peer]->arg);
6359 return CMD_WARNING_CONFIG_FAILED;
6360 }
6361
6362 return bgp_vty_return(vty, peer_ttl_security_hops_set(peer, gtsm_hops));
6363 }
6364
6365 DEFUN (no_neighbor_ttl_security,
6366 no_neighbor_ttl_security_cmd,
6367 "no neighbor <A.B.C.D|X:X::X:X|WORD> ttl-security hops (1-254)",
6368 NO_STR
6369 NEIGHBOR_STR
6370 NEIGHBOR_ADDR_STR2
6371 "BGP ttl-security parameters\n"
6372 "Specify the maximum number of hops to the BGP peer\n"
6373 "Number of hops to BGP peer\n")
6374 {
6375 int idx_peer = 2;
6376 struct peer *peer;
6377
6378 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
6379 if (!peer)
6380 return CMD_WARNING_CONFIG_FAILED;
6381
6382 return bgp_vty_return(vty, peer_ttl_security_hops_unset(peer));
6383 }
6384
6385 DEFUN (neighbor_addpath_tx_all_paths,
6386 neighbor_addpath_tx_all_paths_cmd,
6387 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
6388 NEIGHBOR_STR
6389 NEIGHBOR_ADDR_STR2
6390 "Use addpath to advertise all paths to a neighbor\n")
6391 {
6392 int idx_peer = 1;
6393 struct peer *peer;
6394
6395 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
6396 if (!peer)
6397 return CMD_WARNING_CONFIG_FAILED;
6398
6399 bgp_addpath_set_peer_type(peer, bgp_node_afi(vty), bgp_node_safi(vty),
6400 BGP_ADDPATH_ALL);
6401 return CMD_SUCCESS;
6402 }
6403
6404 ALIAS_HIDDEN(neighbor_addpath_tx_all_paths,
6405 neighbor_addpath_tx_all_paths_hidden_cmd,
6406 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
6407 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6408 "Use addpath to advertise all paths to a neighbor\n")
6409
6410 DEFUN (no_neighbor_addpath_tx_all_paths,
6411 no_neighbor_addpath_tx_all_paths_cmd,
6412 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
6413 NO_STR
6414 NEIGHBOR_STR
6415 NEIGHBOR_ADDR_STR2
6416 "Use addpath to advertise all paths to a neighbor\n")
6417 {
6418 int idx_peer = 2;
6419 struct peer *peer;
6420
6421 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
6422 if (!peer)
6423 return CMD_WARNING_CONFIG_FAILED;
6424
6425 if (peer->addpath_type[bgp_node_afi(vty)][bgp_node_safi(vty)]
6426 != BGP_ADDPATH_ALL) {
6427 vty_out(vty,
6428 "%% Peer not currently configured to transmit all paths.");
6429 return CMD_WARNING_CONFIG_FAILED;
6430 }
6431
6432 bgp_addpath_set_peer_type(peer, bgp_node_afi(vty), bgp_node_safi(vty),
6433 BGP_ADDPATH_NONE);
6434
6435 return CMD_SUCCESS;
6436 }
6437
6438 ALIAS_HIDDEN(no_neighbor_addpath_tx_all_paths,
6439 no_neighbor_addpath_tx_all_paths_hidden_cmd,
6440 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-all-paths",
6441 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6442 "Use addpath to advertise all paths to a neighbor\n")
6443
6444 DEFUN (neighbor_addpath_tx_bestpath_per_as,
6445 neighbor_addpath_tx_bestpath_per_as_cmd,
6446 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
6447 NEIGHBOR_STR
6448 NEIGHBOR_ADDR_STR2
6449 "Use addpath to advertise the bestpath per each neighboring AS\n")
6450 {
6451 int idx_peer = 1;
6452 struct peer *peer;
6453
6454 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
6455 if (!peer)
6456 return CMD_WARNING_CONFIG_FAILED;
6457
6458 bgp_addpath_set_peer_type(peer, bgp_node_afi(vty), bgp_node_safi(vty),
6459 BGP_ADDPATH_BEST_PER_AS);
6460
6461 return CMD_SUCCESS;
6462 }
6463
6464 ALIAS_HIDDEN(neighbor_addpath_tx_bestpath_per_as,
6465 neighbor_addpath_tx_bestpath_per_as_hidden_cmd,
6466 "neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
6467 NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6468 "Use addpath to advertise the bestpath per each neighboring AS\n")
6469
6470 DEFUN (no_neighbor_addpath_tx_bestpath_per_as,
6471 no_neighbor_addpath_tx_bestpath_per_as_cmd,
6472 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
6473 NO_STR
6474 NEIGHBOR_STR
6475 NEIGHBOR_ADDR_STR2
6476 "Use addpath to advertise the bestpath per each neighboring AS\n")
6477 {
6478 int idx_peer = 2;
6479 struct peer *peer;
6480
6481 peer = peer_and_group_lookup_vty(vty, argv[idx_peer]->arg);
6482 if (!peer)
6483 return CMD_WARNING_CONFIG_FAILED;
6484
6485 if (peer->addpath_type[bgp_node_afi(vty)][bgp_node_safi(vty)]
6486 != BGP_ADDPATH_BEST_PER_AS) {
6487 vty_out(vty,
6488 "%% Peer not currently configured to transmit all best path per as.");
6489 return CMD_WARNING_CONFIG_FAILED;
6490 }
6491
6492 bgp_addpath_set_peer_type(peer, bgp_node_afi(vty), bgp_node_safi(vty),
6493 BGP_ADDPATH_NONE);
6494
6495 return CMD_SUCCESS;
6496 }
6497
6498 ALIAS_HIDDEN(no_neighbor_addpath_tx_bestpath_per_as,
6499 no_neighbor_addpath_tx_bestpath_per_as_hidden_cmd,
6500 "no neighbor <A.B.C.D|X:X::X:X|WORD> addpath-tx-bestpath-per-AS",
6501 NO_STR NEIGHBOR_STR NEIGHBOR_ADDR_STR2
6502 "Use addpath to advertise the bestpath per each neighboring AS\n")
6503
6504 DEFPY(
6505 neighbor_aspath_loop_detection, neighbor_aspath_loop_detection_cmd,
6506 "neighbor <A.B.C.D|X:X::X:X|WORD>$neighbor sender-as-path-loop-detection",
6507 NEIGHBOR_STR
6508 NEIGHBOR_ADDR_STR2
6509 "Detect AS loops before sending to neighbor\n")
6510 {
6511 struct peer *peer;
6512
6513 peer = peer_and_group_lookup_vty(vty, neighbor);
6514 if (!peer)
6515 return CMD_WARNING_CONFIG_FAILED;
6516
6517 peer->as_path_loop_detection = true;
6518
6519 return CMD_SUCCESS;
6520 }
6521
6522 DEFPY(
6523 no_neighbor_aspath_loop_detection,
6524 no_neighbor_aspath_loop_detection_cmd,
6525 "no neighbor <A.B.C.D|X:X::X:X|WORD>$neighbor sender-as-path-loop-detection",
6526 NO_STR
6527 NEIGHBOR_STR
6528 NEIGHBOR_ADDR_STR2
6529 "Detect AS loops before sending to neighbor\n")
6530 {
6531 struct peer *peer;
6532
6533 peer = peer_and_group_lookup_vty(vty, neighbor);
6534 if (!peer)
6535 return CMD_WARNING_CONFIG_FAILED;
6536
6537 peer->as_path_loop_detection = false;
6538
6539 return CMD_SUCCESS;
6540 }
6541
6542 static int set_ecom_list(struct vty *vty, int argc, struct cmd_token **argv,
6543 struct ecommunity **list)
6544 {
6545 struct ecommunity *ecom = NULL;
6546 struct ecommunity *ecomadd;
6547
6548 for (; argc; --argc, ++argv) {
6549
6550 ecomadd = ecommunity_str2com(argv[0]->arg,
6551 ECOMMUNITY_ROUTE_TARGET, 0);
6552 if (!ecomadd) {
6553 vty_out(vty, "Malformed community-list value\n");
6554 if (ecom)
6555 ecommunity_free(&ecom);
6556 return CMD_WARNING_CONFIG_FAILED;
6557 }
6558
6559 if (ecom) {
6560 ecommunity_merge(ecom, ecomadd);
6561 ecommunity_free(&ecomadd);
6562 } else {
6563 ecom = ecomadd;
6564 }
6565 }
6566
6567 if (*list) {
6568 ecommunity_free(&*list);
6569 }
6570 *list = ecom;
6571
6572 return CMD_SUCCESS;
6573 }
6574
6575 /*
6576 * v2vimport is true if we are handling a `import vrf ...` command
6577 */
6578 static afi_t vpn_policy_getafi(struct vty *vty, struct bgp *bgp, bool v2vimport)
6579 {
6580 afi_t afi;
6581
6582 switch (vty->node) {
6583 case BGP_IPV4_NODE:
6584 afi = AFI_IP;
6585 break;
6586 case BGP_IPV6_NODE:
6587 afi = AFI_IP6;
6588 break;
6589 default:
6590 vty_out(vty,
6591 "%% context error: valid only in address-family <ipv4|ipv6> unicast block\n");
6592 return AFI_MAX;
6593 }
6594
6595 if (!v2vimport) {
6596 if (CHECK_FLAG(bgp->af_flags[afi][SAFI_UNICAST],
6597 BGP_CONFIG_VRF_TO_VRF_IMPORT)
6598 || CHECK_FLAG(bgp->af_flags[afi][SAFI_UNICAST],
6599 BGP_CONFIG_VRF_TO_VRF_EXPORT)) {
6600 vty_out(vty,
6601 "%% error: Please unconfigure import vrf commands before using vpn commands\n");
6602 return AFI_MAX;
6603 }
6604 } else {
6605 if (CHECK_FLAG(bgp->af_flags[afi][SAFI_UNICAST],
6606 BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT)
6607 || CHECK_FLAG(bgp->af_flags[afi][SAFI_UNICAST],
6608 BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT)) {
6609 vty_out(vty,
6610 "%% error: Please unconfigure vpn to vrf commands before using import vrf commands\n");
6611 return AFI_MAX;
6612 }
6613 }
6614 return afi;
6615 }
6616
6617 DEFPY (af_rd_vpn_export,
6618 af_rd_vpn_export_cmd,
6619 "[no] rd vpn export ASN:NN_OR_IP-ADDRESS:NN$rd_str",
6620 NO_STR
6621 "Specify route distinguisher\n"
6622 "Between current address-family and vpn\n"
6623 "For routes leaked from current address-family to vpn\n"
6624 "Route Distinguisher (<as-number>:<number> | <ip-address>:<number>)\n")
6625 {
6626 VTY_DECLVAR_CONTEXT(bgp, bgp);
6627 struct prefix_rd prd;
6628 int ret;
6629 afi_t afi;
6630 int idx = 0;
6631 int yes = 1;
6632
6633 if (argv_find(argv, argc, "no", &idx))
6634 yes = 0;
6635
6636 if (yes) {
6637 ret = str2prefix_rd(rd_str, &prd);
6638 if (!ret) {
6639 vty_out(vty, "%% Malformed rd\n");
6640 return CMD_WARNING_CONFIG_FAILED;
6641 }
6642 }
6643
6644 afi = vpn_policy_getafi(vty, bgp, false);
6645 if (afi == AFI_MAX)
6646 return CMD_WARNING_CONFIG_FAILED;
6647
6648 /*
6649 * pre-change: un-export vpn routes (vpn->vrf routes unaffected)
6650 */
6651 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN, afi,
6652 bgp_get_default(), bgp);
6653
6654 if (yes) {
6655 bgp->vpn_policy[afi].tovpn_rd = prd;
6656 SET_FLAG(bgp->vpn_policy[afi].flags,
6657 BGP_VPN_POLICY_TOVPN_RD_SET);
6658 } else {
6659 UNSET_FLAG(bgp->vpn_policy[afi].flags,
6660 BGP_VPN_POLICY_TOVPN_RD_SET);
6661 }
6662
6663 /* post-change: re-export vpn routes */
6664 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN, afi,
6665 bgp_get_default(), bgp);
6666
6667 return CMD_SUCCESS;
6668 }
6669
6670 ALIAS (af_rd_vpn_export,
6671 af_no_rd_vpn_export_cmd,
6672 "no rd vpn export",
6673 NO_STR
6674 "Specify route distinguisher\n"
6675 "Between current address-family and vpn\n"
6676 "For routes leaked from current address-family to vpn\n")
6677
6678 DEFPY (af_label_vpn_export,
6679 af_label_vpn_export_cmd,
6680 "[no] label vpn export <(0-1048575)$label_val|auto$label_auto>",
6681 NO_STR
6682 "label value for VRF\n"
6683 "Between current address-family and vpn\n"
6684 "For routes leaked from current address-family to vpn\n"
6685 "Label Value <0-1048575>\n"
6686 "Automatically assign a label\n")
6687 {
6688 VTY_DECLVAR_CONTEXT(bgp, bgp);
6689 mpls_label_t label = MPLS_LABEL_NONE;
6690 afi_t afi;
6691 int idx = 0;
6692 int yes = 1;
6693
6694 if (argv_find(argv, argc, "no", &idx))
6695 yes = 0;
6696
6697 /* If "no ...", squash trailing parameter */
6698 if (!yes)
6699 label_auto = NULL;
6700
6701 if (yes) {
6702 if (!label_auto)
6703 label = label_val; /* parser should force unsigned */
6704 }
6705
6706 afi = vpn_policy_getafi(vty, bgp, false);
6707 if (afi == AFI_MAX)
6708 return CMD_WARNING_CONFIG_FAILED;
6709
6710
6711 if (label_auto && CHECK_FLAG(bgp->vpn_policy[afi].flags,
6712 BGP_VPN_POLICY_TOVPN_LABEL_AUTO))
6713 /* no change */
6714 return CMD_SUCCESS;
6715
6716 /*
6717 * pre-change: un-export vpn routes (vpn->vrf routes unaffected)
6718 */
6719 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN, afi,
6720 bgp_get_default(), bgp);
6721
6722 if (!label_auto && CHECK_FLAG(bgp->vpn_policy[afi].flags,
6723 BGP_VPN_POLICY_TOVPN_LABEL_AUTO)) {
6724
6725 if (bgp->vpn_policy[afi].tovpn_label != MPLS_LABEL_NONE) {
6726
6727 /*
6728 * label has previously been automatically
6729 * assigned by labelpool: release it
6730 *
6731 * NB if tovpn_label == MPLS_LABEL_NONE it
6732 * means the automatic assignment is in flight
6733 * and therefore the labelpool callback must
6734 * detect that the auto label is not needed.
6735 */
6736
6737 bgp_lp_release(LP_TYPE_VRF,
6738 &bgp->vpn_policy[afi],
6739 bgp->vpn_policy[afi].tovpn_label);
6740 }
6741 UNSET_FLAG(bgp->vpn_policy[afi].flags,
6742 BGP_VPN_POLICY_TOVPN_LABEL_AUTO);
6743 }
6744
6745 bgp->vpn_policy[afi].tovpn_label = label;
6746 if (label_auto) {
6747 SET_FLAG(bgp->vpn_policy[afi].flags,
6748 BGP_VPN_POLICY_TOVPN_LABEL_AUTO);
6749 bgp_lp_get(LP_TYPE_VRF, &bgp->vpn_policy[afi],
6750 vpn_leak_label_callback);
6751 }
6752
6753 /* post-change: re-export vpn routes */
6754 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN, afi,
6755 bgp_get_default(), bgp);
6756
6757 return CMD_SUCCESS;
6758 }
6759
6760 ALIAS (af_label_vpn_export,
6761 af_no_label_vpn_export_cmd,
6762 "no label vpn export",
6763 NO_STR
6764 "label value for VRF\n"
6765 "Between current address-family and vpn\n"
6766 "For routes leaked from current address-family to vpn\n")
6767
6768 DEFPY (af_nexthop_vpn_export,
6769 af_nexthop_vpn_export_cmd,
6770 "[no] nexthop vpn export <A.B.C.D|X:X::X:X>$nexthop_str",
6771 NO_STR
6772 "Specify next hop to use for VRF advertised prefixes\n"
6773 "Between current address-family and vpn\n"
6774 "For routes leaked from current address-family to vpn\n"
6775 "IPv4 prefix\n"
6776 "IPv6 prefix\n")
6777 {
6778 VTY_DECLVAR_CONTEXT(bgp, bgp);
6779 afi_t afi;
6780 struct prefix p;
6781 int idx = 0;
6782 int yes = 1;
6783
6784 if (argv_find(argv, argc, "no", &idx))
6785 yes = 0;
6786
6787 if (yes) {
6788 if (!sockunion2hostprefix(nexthop_str, &p))
6789 return CMD_WARNING_CONFIG_FAILED;
6790 }
6791
6792 afi = vpn_policy_getafi(vty, bgp, false);
6793 if (afi == AFI_MAX)
6794 return CMD_WARNING_CONFIG_FAILED;
6795
6796 /*
6797 * pre-change: un-export vpn routes (vpn->vrf routes unaffected)
6798 */
6799 vpn_leak_prechange(BGP_VPN_POLICY_DIR_TOVPN, afi,
6800 bgp_get_default(), bgp);
6801
6802 if (yes) {
6803 bgp->vpn_policy[afi].tovpn_nexthop = p;
6804 SET_FLAG(bgp->vpn_policy[afi].flags,
6805 BGP_VPN_POLICY_TOVPN_NEXTHOP_SET);
6806 } else {
6807 UNSET_FLAG(bgp->vpn_policy[afi].flags,
6808 BGP_VPN_POLICY_TOVPN_NEXTHOP_SET);
6809 }
6810
6811 /* post-change: re-export vpn routes */
6812 vpn_leak_postchange(BGP_VPN_POLICY_DIR_TOVPN, afi,
6813 bgp_get_default(), bgp);
6814
6815 return CMD_SUCCESS;
6816 }
6817
6818 ALIAS (af_nexthop_vpn_export,
6819 af_no_nexthop_vpn_export_cmd,
6820 "no nexthop vpn export",
6821 NO_STR
6822 "Specify next hop to use for VRF advertised prefixes\n"
6823 "Between current address-family and vpn\n"
6824 "For routes leaked from current address-family to vpn\n")
6825
6826 static int vpn_policy_getdirs(struct vty *vty, const char *dstr, int *dodir)
6827 {
6828 if (!strcmp(dstr, "import")) {
6829 dodir[BGP_VPN_POLICY_DIR_FROMVPN] = 1;
6830 } else if (!strcmp(dstr, "export")) {
6831 dodir[BGP_VPN_POLICY_DIR_TOVPN] = 1;
6832 } else if (!strcmp(dstr, "both")) {
6833 dodir[BGP_VPN_POLICY_DIR_FROMVPN] = 1;
6834 dodir[BGP_VPN_POLICY_DIR_TOVPN] = 1;
6835 } else {
6836 vty_out(vty, "%% direction parse error\n");
6837 return CMD_WARNING_CONFIG_FAILED;
6838 }
6839 return CMD_SUCCESS;
6840 }
6841
6842 DEFPY (af_rt_vpn_imexport,
6843 af_rt_vpn_imexport_cmd,
6844 "[no] <rt|route-target> vpn <import|export|both>$direction_str RTLIST...",
6845 NO_STR
6846 "Specify route target list\n"
6847 "Specify route target list\n"
6848 "Between current address-family and vpn\n"
6849 "For routes leaked from vpn to current address-family: match any\n"
6850 "For routes leaked from current address-family to vpn: set\n"
6851 "both import: match any and export: set\n"
6852 "Space separated route target list (A.B.C.D:MN|EF:OPQR|GHJK:MN)\n")
6853 {
6854 VTY_DECLVAR_CONTEXT(bgp, bgp);
6855 int ret;
6856 struct ecommunity *ecom = NULL;
6857 int dodir[BGP_VPN_POLICY_DIR_MAX] = {0};
6858 vpn_policy_direction_t dir;
6859 afi_t afi;
6860 int idx = 0;
6861 int yes = 1;
6862
6863 if (argv_find(argv, argc, "no", &idx))
6864 yes = 0;
6865
6866 afi = vpn_policy_getafi(vty, bgp, false);
6867 if (afi == AFI_MAX)
6868 return CMD_WARNING_CONFIG_FAILED;
6869
6870 ret = vpn_policy_getdirs(vty, direction_str, dodir);
6871 if (ret != CMD_SUCCESS)
6872 return ret;
6873
6874 if (yes) {
6875 if (!argv_find(argv, argc, "RTLIST", &idx)) {
6876 vty_out(vty, "%% Missing RTLIST\n");
6877 return CMD_WARNING_CONFIG_FAILED;
6878 }
6879 ret = set_ecom_list(vty, argc - idx, argv + idx, &ecom);
6880 if (ret != CMD_SUCCESS) {
6881 return ret;
6882 }
6883 }
6884
6885 for (dir = 0; dir < BGP_VPN_POLICY_DIR_MAX; ++dir) {
6886 if (!dodir[dir])
6887 continue;
6888
6889 vpn_leak_prechange(dir, afi, bgp_get_default(), bgp);
6890
6891 if (yes) {
6892 if (bgp->vpn_policy[afi].rtlist[dir])
6893 ecommunity_free(
6894 &bgp->vpn_policy[afi].rtlist[dir]);
6895 bgp->vpn_policy[afi].rtlist[dir] =
6896 ecommunity_dup(ecom);
6897 } else {
6898 if (bgp->vpn_policy[afi].rtlist[dir])
6899 ecommunity_free(
6900 &bgp->vpn_policy[afi].rtlist[dir]);
6901 bgp->vpn_policy[afi].rtlist[dir] = NULL;
6902 }
6903
6904 vpn_leak_postchange(dir, afi, bgp_get_default(), bgp);
6905 }
6906
6907 if (ecom)
6908 ecommunity_free(&ecom);
6909
6910 return CMD_SUCCESS;
6911 }
6912
6913 ALIAS (af_rt_vpn_imexport,
6914 af_no_rt_vpn_imexport_cmd,
6915 "no <rt|route-target> vpn <import|export|both>$direction_str",
6916 NO_STR
6917 "Specify route target list\n"
6918 "Specify route target list\n"
6919 "Between current address-family and vpn\n"
6920 "For routes leaked from vpn to current address-family\n"
6921 "For routes leaked from current address-family to vpn\n"
6922 "both import and export\n")
6923
6924 DEFPY (af_route_map_vpn_imexport,
6925 af_route_map_vpn_imexport_cmd,
6926 /* future: "route-map <vpn|evpn|vrf NAME> <import|export> RMAP" */
6927 "[no] route-map vpn <import|export>$direction_str RMAP$rmap_str",
6928 NO_STR
6929 "Specify route map\n"
6930 "Between current address-family and vpn\n"
6931 "For routes leaked from vpn to current address-family\n"
6932 "For routes leaked from current address-family to vpn\n"
6933 "name of route-map\n")
6934 {
6935 VTY_DECLVAR_CONTEXT(bgp, bgp);
6936 int ret;
6937 int dodir[BGP_VPN_POLICY_DIR_MAX] = {0};
6938 vpn_policy_direction_t dir;
6939 afi_t afi;
6940 int idx = 0;
6941 int yes = 1;
6942
6943 if (argv_find(argv, argc, "no", &idx))
6944 yes = 0;
6945
6946 afi = vpn_policy_getafi(vty, bgp, false);
6947 if (afi == AFI_MAX)
6948 return CMD_WARNING_CONFIG_FAILED;
6949
6950 ret = vpn_policy_getdirs(vty, direction_str, dodir);
6951 if (ret != CMD_SUCCESS)
6952 return ret;
6953
6954 for (dir = 0; dir < BGP_VPN_POLICY_DIR_MAX; ++dir) {
6955 if (!dodir[dir])
6956 continue;
6957
6958 vpn_leak_prechange(dir, afi, bgp_get_default(), bgp);
6959
6960 if (yes) {
6961 if (bgp->vpn_policy[afi].rmap_name[dir])
6962 XFREE(MTYPE_ROUTE_MAP_NAME,
6963 bgp->vpn_policy[afi].rmap_name[dir]);
6964 bgp->vpn_policy[afi].rmap_name[dir] = XSTRDUP(
6965 MTYPE_ROUTE_MAP_NAME, rmap_str);
6966 bgp->vpn_policy[afi].rmap[dir] =
6967 route_map_lookup_warn_noexist(vty, rmap_str);
6968 if (!bgp->vpn_policy[afi].rmap[dir])
6969 return CMD_SUCCESS;
6970 } else {
6971 if (bgp->vpn_policy[afi].rmap_name[dir])
6972 XFREE(MTYPE_ROUTE_MAP_NAME,
6973 bgp->vpn_policy[afi].rmap_name[dir]);
6974 bgp->vpn_policy[afi].rmap_name[dir] = NULL;
6975 bgp->vpn_policy[afi].rmap[dir] = NULL;
6976 }
6977
6978 vpn_leak_postchange(dir, afi, bgp_get_default(), bgp);
6979 }
6980
6981 return CMD_SUCCESS;
6982 }
6983
6984 ALIAS (af_route_map_vpn_imexport,
6985 af_no_route_map_vpn_imexport_cmd,
6986 "no route-map vpn <import|export>$direction_str",
6987 NO_STR
6988 "Specify route map\n"
6989 "Between current address-family and vpn\n"
6990 "For routes leaked from vpn to current address-family\n"
6991 "For routes leaked from current address-family to vpn\n")
6992
6993 DEFPY(af_import_vrf_route_map, af_import_vrf_route_map_cmd,
6994 "[no] import vrf route-map RMAP$rmap_str",
6995 NO_STR
6996 "Import routes from another VRF\n"
6997 "Vrf routes being filtered\n"
6998 "Specify route map\n"
6999 "name of route-map\n")
7000 {
7001 VTY_DECLVAR_CONTEXT(bgp, bgp);
7002 vpn_policy_direction_t dir = BGP_VPN_POLICY_DIR_FROMVPN;
7003 afi_t afi;
7004 int idx = 0;
7005 int yes = 1;
7006 struct bgp *bgp_default;
7007
7008 if (argv_find(argv, argc, "no", &idx))
7009 yes = 0;
7010
7011 afi = vpn_policy_getafi(vty, bgp, true);
7012 if (afi == AFI_MAX)
7013 return CMD_WARNING_CONFIG_FAILED;
7014
7015 bgp_default = bgp_get_default();
7016 if (!bgp_default) {
7017 int32_t ret;
7018 as_t as = bgp->as;
7019
7020 /* Auto-create assuming the same AS */
7021 ret = bgp_get_vty(&bgp_default, &as, NULL,
7022 BGP_INSTANCE_TYPE_DEFAULT);
7023
7024 if (ret) {
7025 vty_out(vty,
7026 "VRF default is not configured as a bgp instance\n");
7027 return CMD_WARNING;
7028 }
7029 }
7030
7031 vpn_leak_prechange(dir, afi, bgp_get_default(), bgp);
7032
7033 if (yes) {
7034 if (bgp->vpn_policy[afi].rmap_name[dir])
7035 XFREE(MTYPE_ROUTE_MAP_NAME,
7036 bgp->vpn_policy[afi].rmap_name[dir]);
7037 bgp->vpn_policy[afi].rmap_name[dir] =
7038 XSTRDUP(MTYPE_ROUTE_MAP_NAME, rmap_str);
7039 bgp->vpn_policy[afi].rmap[dir] =
7040 route_map_lookup_warn_noexist(vty, rmap_str);
7041 if (!bgp->vpn_policy[afi].rmap[dir])
7042 return CMD_SUCCESS;
7043 } else {
7044 if (bgp->vpn_policy[afi].rmap_name[dir])
7045 XFREE(MTYPE_ROUTE_MAP_NAME,
7046 bgp->vpn_policy[afi].rmap_name[dir]);
7047 bgp->vpn_policy[afi].rmap_name[dir] = NULL;
7048 bgp->vpn_policy[afi].rmap[dir] = NULL;
7049 }
7050
7051 vpn_leak_postchange(dir, afi, bgp_get_default(), bgp);
7052
7053 return CMD_SUCCESS;
7054 }
7055
7056 ALIAS(af_import_vrf_route_map, af_no_import_vrf_route_map_cmd,
7057 "no import vrf route-map",
7058 NO_STR
7059 "Import routes from another VRF\n"
7060 "Vrf routes being filtered\n"
7061 "Specify route map\n")
7062
7063 DEFPY(bgp_imexport_vrf, bgp_imexport_vrf_cmd,
7064 "[no] import vrf VIEWVRFNAME$import_name",
7065 NO_STR
7066 "Import routes from another VRF\n"
7067 "VRF to import from\n"
7068 "The name of the VRF\n")
7069 {
7070 VTY_DECLVAR_CONTEXT(bgp, bgp);
7071 struct listnode *node;
7072 struct bgp *vrf_bgp, *bgp_default;
7073 int32_t ret = 0;
7074 as_t as = bgp->as;
7075 bool remove = false;
7076 int32_t idx = 0;
7077 char *vname;
7078 enum bgp_instance_type bgp_type = BGP_INSTANCE_TYPE_VRF;
7079 safi_t safi;
7080 afi_t afi;
7081
7082 if (import_name == NULL) {
7083 vty_out(vty, "%% Missing import name\n");
7084 return CMD_WARNING;
7085 }
7086
7087 if (argv_find(argv, argc, "no", &idx))
7088 remove = true;
7089
7090 afi = vpn_policy_getafi(vty, bgp, true);
7091 if (afi == AFI_MAX)
7092 return CMD_WARNING_CONFIG_FAILED;
7093
7094 safi = bgp_node_safi(vty);
7095
7096 if (((BGP_INSTANCE_TYPE_DEFAULT == bgp->inst_type)
7097 && (strcmp(import_name, VRF_DEFAULT_NAME) == 0))
7098 || (bgp->name && (strcmp(import_name, bgp->name) == 0))) {
7099 vty_out(vty, "%% Cannot %s vrf %s into itself\n",
7100 remove ? "unimport" : "import", import_name);
7101 return CMD_WARNING;
7102 }
7103
7104 bgp_default = bgp_get_default();
7105 if (!bgp_default) {
7106 /* Auto-create assuming the same AS */
7107 ret = bgp_get_vty(&bgp_default, &as, NULL,
7108 BGP_INSTANCE_TYPE_DEFAULT);
7109
7110 if (ret) {
7111 vty_out(vty,
7112 "VRF default is not configured as a bgp instance\n");
7113 return CMD_WARNING;
7114 }
7115 }
7116
7117 vrf_bgp = bgp_lookup_by_name(import_name);
7118 if (!vrf_bgp) {
7119 if (strcmp(import_name, VRF_DEFAULT_NAME) == 0)
7120 vrf_bgp = bgp_default;
7121 else
7122 /* Auto-create assuming the same AS */
7123 ret = bgp_get_vty(&vrf_bgp, &as, import_name, bgp_type);
7124
7125 if (ret) {
7126 vty_out(vty,
7127 "VRF %s is not configured as a bgp instance\n",
7128 import_name);
7129 return CMD_WARNING;
7130 }
7131 }
7132
7133 if (remove) {
7134 vrf_unimport_from_vrf(bgp, vrf_bgp, afi, safi);
7135 } else {
7136 /* Already importing from "import_vrf"? */
7137 for (ALL_LIST_ELEMENTS_RO(bgp->vpn_policy[afi].import_vrf, node,
7138 vname)) {
7139 if (strcmp(vname, import_name) == 0)
7140 return CMD_WARNING;
7141 }
7142
7143 vrf_import_from_vrf(bgp, vrf_bgp, afi, safi);
7144 }
7145
7146 return CMD_SUCCESS;
7147 }
7148
7149 /* This command is valid only in a bgp vrf instance or the default instance */
7150 DEFPY (bgp_imexport_vpn,
7151 bgp_imexport_vpn_cmd,
7152 "[no] <import|export>$direction_str vpn",
7153 NO_STR
7154 "Import routes to this address-family\n"
7155 "Export routes from this address-family\n"
7156 "to/from default instance VPN RIB\n")
7157 {
7158 VTY_DECLVAR_CONTEXT(bgp, bgp);
7159 int previous_state;
7160 afi_t afi;
7161 safi_t safi;
7162 int idx = 0;
7163 int yes = 1;
7164 int flag;
7165 vpn_policy_direction_t dir;
7166
7167 if (argv_find(argv, argc, "no", &idx))
7168 yes = 0;
7169
7170 if (BGP_INSTANCE_TYPE_VRF != bgp->inst_type &&
7171 BGP_INSTANCE_TYPE_DEFAULT != bgp->inst_type) {
7172
7173 vty_out(vty, "%% import|export vpn valid only for bgp vrf or default instance\n");
7174 return CMD_WARNING_CONFIG_FAILED;
7175 }
7176
7177 afi = bgp_node_afi(vty);
7178 safi = bgp_node_safi(vty);
7179 if ((SAFI_UNICAST != safi) || ((AFI_IP != afi) && (AFI_IP6 != afi))) {
7180 vty_out(vty, "%% import|export vpn valid only for unicast ipv4|ipv6\n");
7181 return CMD_WARNING_CONFIG_FAILED;
7182 }
7183
7184 if (!strcmp(direction_str, "import")) {
7185 flag = BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT;
7186 dir = BGP_VPN_POLICY_DIR_FROMVPN;
7187 } else if (!strcmp(direction_str, "export")) {
7188 flag = BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT;
7189 dir = BGP_VPN_POLICY_DIR_TOVPN;
7190 } else {
7191 vty_out(vty, "%% unknown direction %s\n", direction_str);
7192 return CMD_WARNING_CONFIG_FAILED;
7193 }
7194
7195 previous_state = CHECK_FLAG(bgp->af_flags[afi][safi], flag);
7196
7197 if (yes) {
7198 SET_FLAG(bgp->af_flags[afi][safi], flag);
7199 if (!previous_state) {
7200 /* trigger export current vrf */
7201 vpn_leak_postchange(dir, afi, bgp_get_default(), bgp);
7202 }
7203 } else {
7204 if (previous_state) {
7205 /* trigger un-export current vrf */
7206 vpn_leak_prechange(dir, afi, bgp_get_default(), bgp);
7207 }
7208 UNSET_FLAG(bgp->af_flags[afi][safi], flag);
7209 }
7210
7211 return CMD_SUCCESS;
7212 }
7213
7214 DEFPY (af_routetarget_import,
7215 af_routetarget_import_cmd,
7216 "[no] <rt|route-target> redirect import RTLIST...",
7217 NO_STR
7218 "Specify route target list\n"
7219 "Specify route target list\n"
7220 "Flow-spec redirect type route target\n"
7221 "Import routes to this address-family\n"
7222 "Space separated route target list (A.B.C.D:MN|EF:OPQR|GHJK:MN)\n")
7223 {
7224 VTY_DECLVAR_CONTEXT(bgp, bgp);
7225 int ret;
7226 struct ecommunity *ecom = NULL;
7227 afi_t afi;
7228 int idx = 0;
7229 int yes = 1;
7230
7231 if (argv_find(argv, argc, "no", &idx))
7232 yes = 0;
7233
7234 afi = vpn_policy_getafi(vty, bgp, false);
7235 if (afi == AFI_MAX)
7236 return CMD_WARNING_CONFIG_FAILED;
7237
7238 if (yes) {
7239 if (!argv_find(argv, argc, "RTLIST", &idx)) {
7240 vty_out(vty, "%% Missing RTLIST\n");
7241 return CMD_WARNING_CONFIG_FAILED;
7242 }
7243 ret = set_ecom_list(vty, argc - idx, argv + idx, &ecom);
7244 if (ret != CMD_SUCCESS)
7245 return ret;
7246 }
7247
7248 if (yes) {
7249 if (bgp->vpn_policy[afi].import_redirect_rtlist)
7250 ecommunity_free(&bgp->vpn_policy[afi]
7251 .import_redirect_rtlist);
7252 bgp->vpn_policy[afi].import_redirect_rtlist =
7253 ecommunity_dup(ecom);
7254 } else {
7255 if (bgp->vpn_policy[afi].import_redirect_rtlist)
7256 ecommunity_free(&bgp->vpn_policy[afi]
7257 .import_redirect_rtlist);
7258 bgp->vpn_policy[afi].import_redirect_rtlist = NULL;
7259 }
7260
7261 if (ecom)
7262 ecommunity_free(&ecom);
7263
7264 return CMD_SUCCESS;
7265 }
7266
7267 DEFUN_NOSH (address_family_ipv4_safi,
7268 address_family_ipv4_safi_cmd,
7269 "address-family ipv4 [<unicast|multicast|vpn|labeled-unicast|flowspec>]",
7270 "Enter Address Family command mode\n"
7271 "Address Family\n"
7272 BGP_SAFI_WITH_LABEL_HELP_STR)
7273 {
7274
7275 if (argc == 3) {
7276 VTY_DECLVAR_CONTEXT(bgp, bgp);
7277 safi_t safi = bgp_vty_safi_from_str(argv[2]->text);
7278 if (bgp->inst_type != BGP_INSTANCE_TYPE_DEFAULT
7279 && safi != SAFI_UNICAST && safi != SAFI_MULTICAST
7280 && safi != SAFI_EVPN) {
7281 vty_out(vty,
7282 "Only Unicast/Multicast/EVPN SAFIs supported in non-core instances.\n");
7283 return CMD_WARNING_CONFIG_FAILED;
7284 }
7285 vty->node = bgp_node_type(AFI_IP, safi);
7286 } else
7287 vty->node = BGP_IPV4_NODE;
7288
7289 return CMD_SUCCESS;
7290 }
7291
7292 DEFUN_NOSH (address_family_ipv6_safi,
7293 address_family_ipv6_safi_cmd,
7294 "address-family ipv6 [<unicast|multicast|vpn|labeled-unicast|flowspec>]",
7295 "Enter Address Family command mode\n"
7296 "Address Family\n"
7297 BGP_SAFI_WITH_LABEL_HELP_STR)
7298 {
7299 if (argc == 3) {
7300 VTY_DECLVAR_CONTEXT(bgp, bgp);
7301 safi_t safi = bgp_vty_safi_from_str(argv[2]->text);
7302 if (bgp->inst_type != BGP_INSTANCE_TYPE_DEFAULT
7303 && safi != SAFI_UNICAST && safi != SAFI_MULTICAST
7304 && safi != SAFI_EVPN) {
7305 vty_out(vty,
7306 "Only Unicast/Multicast/EVPN SAFIs supported in non-core instances.\n");
7307 return CMD_WARNING_CONFIG_FAILED;
7308 }
7309 vty->node = bgp_node_type(AFI_IP6, safi);
7310 } else
7311 vty->node = BGP_IPV6_NODE;
7312
7313 return CMD_SUCCESS;
7314 }
7315
7316 #ifdef KEEP_OLD_VPN_COMMANDS
7317 DEFUN_NOSH (address_family_vpnv4,
7318 address_family_vpnv4_cmd,
7319 "address-family vpnv4 [unicast]",
7320 "Enter Address Family command mode\n"
7321 "Address Family\n"
7322 "Address Family modifier\n")
7323 {
7324 vty->node = BGP_VPNV4_NODE;
7325 return CMD_SUCCESS;
7326 }
7327
7328 DEFUN_NOSH (address_family_vpnv6,
7329 address_family_vpnv6_cmd,
7330 "address-family vpnv6 [unicast]",
7331 "Enter Address Family command mode\n"
7332 "Address Family\n"
7333 "Address Family modifier\n")
7334 {
7335 vty->node = BGP_VPNV6_NODE;
7336 return CMD_SUCCESS;
7337 }
7338 #endif /* KEEP_OLD_VPN_COMMANDS */
7339
7340 DEFUN_NOSH (address_family_evpn,
7341 address_family_evpn_cmd,
7342 "address-family l2vpn evpn",
7343 "Enter Address Family command mode\n"
7344 "Address Family\n"
7345 "Address Family modifier\n")
7346 {
7347 VTY_DECLVAR_CONTEXT(bgp, bgp);
7348 vty->node = BGP_EVPN_NODE;
7349 return CMD_SUCCESS;
7350 }
7351
7352 DEFUN_NOSH (exit_address_family,
7353 exit_address_family_cmd,
7354 "exit-address-family",
7355 "Exit from Address Family configuration mode\n")
7356 {
7357 if (vty->node == BGP_IPV4_NODE || vty->node == BGP_IPV4M_NODE
7358 || vty->node == BGP_IPV4L_NODE || vty->node == BGP_VPNV4_NODE
7359 || vty->node == BGP_IPV6_NODE || vty->node == BGP_IPV6M_NODE
7360 || vty->node == BGP_IPV6L_NODE || vty->node == BGP_VPNV6_NODE
7361 || vty->node == BGP_EVPN_NODE
7362 || vty->node == BGP_FLOWSPECV4_NODE
7363 || vty->node == BGP_FLOWSPECV6_NODE)
7364 vty->node = BGP_NODE;
7365 return CMD_SUCCESS;
7366 }
7367
7368 /* Recalculate bestpath and re-advertise a prefix */
7369 static int bgp_clear_prefix(struct vty *vty, const char *view_name,
7370 const char *ip_str, afi_t afi, safi_t safi,
7371 struct prefix_rd *prd)
7372 {
7373 int ret;
7374 struct prefix match;
7375 struct bgp_node *rn;
7376 struct bgp_node *rm;
7377 struct bgp *bgp;
7378 struct bgp_table *table;
7379 struct bgp_table *rib;
7380
7381 /* BGP structure lookup. */
7382 if (view_name) {
7383 bgp = bgp_lookup_by_name(view_name);
7384 if (bgp == NULL) {
7385 vty_out(vty, "%% Can't find BGP instance %s\n",
7386 view_name);
7387 return CMD_WARNING;
7388 }
7389 } else {
7390 bgp = bgp_get_default();
7391 if (bgp == NULL) {
7392 vty_out(vty, "%% No BGP process is configured\n");
7393 return CMD_WARNING;
7394 }
7395 }
7396
7397 /* Check IP address argument. */
7398 ret = str2prefix(ip_str, &match);
7399 if (!ret) {
7400 vty_out(vty, "%% address is malformed\n");
7401 return CMD_WARNING;
7402 }
7403
7404 match.family = afi2family(afi);
7405 rib = bgp->rib[afi][safi];
7406
7407 if (safi == SAFI_MPLS_VPN) {
7408 for (rn = bgp_table_top(rib); rn; rn = bgp_route_next(rn)) {
7409 if (prd && memcmp(rn->p.u.val, prd->val, 8) != 0)
7410 continue;
7411
7412 table = bgp_node_get_bgp_table_info(rn);
7413 if (table != NULL) {
7414
7415 if ((rm = bgp_node_match(table, &match))
7416 != NULL) {
7417 if (rm->p.prefixlen
7418 == match.prefixlen) {
7419 SET_FLAG(rm->flags,
7420 BGP_NODE_USER_CLEAR);
7421 bgp_process(bgp, rm, afi, safi);
7422 }
7423 bgp_unlock_node(rm);
7424 }
7425 }
7426 }
7427 } else {
7428 if ((rn = bgp_node_match(rib, &match)) != NULL) {
7429 if (rn->p.prefixlen == match.prefixlen) {
7430 SET_FLAG(rn->flags, BGP_NODE_USER_CLEAR);
7431 bgp_process(bgp, rn, afi, safi);
7432 }
7433 bgp_unlock_node(rn);
7434 }
7435 }
7436
7437 return CMD_SUCCESS;
7438 }
7439
7440 /* one clear bgp command to rule them all */
7441 DEFUN (clear_ip_bgp_all,
7442 clear_ip_bgp_all_cmd,
7443 "clear [ip] bgp [<view|vrf> VIEWVRFNAME] [<ipv4|ipv6|l2vpn> [<unicast|multicast|vpn|labeled-unicast|flowspec|evpn>]] <*|A.B.C.D$neighbor|X:X::X:X$neighbor|WORD$neighbor|(1-4294967295)|external|peer-group PGNAME> [<soft [<in|out>]|in [prefix-filter]|out>]",
7444 CLEAR_STR
7445 IP_STR
7446 BGP_STR
7447 BGP_INSTANCE_HELP_STR
7448 BGP_AFI_HELP_STR
7449 "Address Family\n"
7450 BGP_SAFI_WITH_LABEL_HELP_STR
7451 "Address Family modifier\n"
7452 "Clear all peers\n"
7453 "BGP IPv4 neighbor to clear\n"
7454 "BGP IPv6 neighbor to clear\n"
7455 "BGP neighbor on interface to clear\n"
7456 "Clear peers with the AS number\n"
7457 "Clear all external peers\n"
7458 "Clear all members of peer-group\n"
7459 "BGP peer-group name\n"
7460 BGP_SOFT_STR
7461 BGP_SOFT_IN_STR
7462 BGP_SOFT_OUT_STR
7463 BGP_SOFT_IN_STR
7464 "Push out prefix-list ORF and do inbound soft reconfig\n"
7465 BGP_SOFT_OUT_STR)
7466 {
7467 char *vrf = NULL;
7468
7469 afi_t afi = AFI_UNSPEC;
7470 safi_t safi = SAFI_UNSPEC;
7471 enum clear_sort clr_sort = clear_peer;
7472 enum bgp_clear_type clr_type;
7473 char *clr_arg = NULL;
7474
7475 int idx = 0;
7476
7477 /* clear [ip] bgp */
7478 if (argv_find(argv, argc, "ip", &idx))
7479 afi = AFI_IP;
7480
7481 /* [<vrf> VIEWVRFNAME] */
7482 if (argv_find(argv, argc, "vrf", &idx)) {
7483 vrf = argv[idx + 1]->arg;
7484 idx += 2;
7485 if (vrf && strmatch(vrf, VRF_DEFAULT_NAME))
7486 vrf = NULL;
7487 } else if (argv_find(argv, argc, "view", &idx)) {
7488 /* [<view> VIEWVRFNAME] */
7489 vrf = argv[idx + 1]->arg;
7490 idx += 2;
7491 }
7492 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
7493 if (argv_find_and_parse_afi(argv, argc, &idx, &afi))
7494 argv_find_and_parse_safi(argv, argc, &idx, &safi);
7495
7496 /* <*|A.B.C.D|X:X::X:X|WORD|(1-4294967295)|external|peer-group PGNAME> */
7497 if (argv_find(argv, argc, "*", &idx)) {
7498 clr_sort = clear_all;
7499 } else if (argv_find(argv, argc, "A.B.C.D", &idx)) {
7500 clr_sort = clear_peer;
7501 clr_arg = argv[idx]->arg;
7502 } else if (argv_find(argv, argc, "X:X::X:X", &idx)) {
7503 clr_sort = clear_peer;
7504 clr_arg = argv[idx]->arg;
7505 } else if (argv_find(argv, argc, "peer-group", &idx)) {
7506 clr_sort = clear_group;
7507 idx++;
7508 clr_arg = argv[idx]->arg;
7509 } else if (argv_find(argv, argc, "PGNAME", &idx)) {
7510 clr_sort = clear_peer;
7511 clr_arg = argv[idx]->arg;
7512 } else if (argv_find(argv, argc, "WORD", &idx)) {
7513 clr_sort = clear_peer;
7514 clr_arg = argv[idx]->arg;
7515 } else if (argv_find(argv, argc, "(1-4294967295)", &idx)) {
7516 clr_sort = clear_as;
7517 clr_arg = argv[idx]->arg;
7518 } else if (argv_find(argv, argc, "external", &idx)) {
7519 clr_sort = clear_external;
7520 }
7521
7522 /* [<soft [<in|out>]|in [prefix-filter]|out>] */
7523 if (argv_find(argv, argc, "soft", &idx)) {
7524 if (argv_find(argv, argc, "in", &idx)
7525 || argv_find(argv, argc, "out", &idx))
7526 clr_type = strmatch(argv[idx]->text, "in")
7527 ? BGP_CLEAR_SOFT_IN
7528 : BGP_CLEAR_SOFT_OUT;
7529 else
7530 clr_type = BGP_CLEAR_SOFT_BOTH;
7531 } else if (argv_find(argv, argc, "in", &idx)) {
7532 clr_type = argv_find(argv, argc, "prefix-filter", &idx)
7533 ? BGP_CLEAR_SOFT_IN_ORF_PREFIX
7534 : BGP_CLEAR_SOFT_IN;
7535 } else if (argv_find(argv, argc, "out", &idx)) {
7536 clr_type = BGP_CLEAR_SOFT_OUT;
7537 } else
7538 clr_type = BGP_CLEAR_SOFT_NONE;
7539
7540 return bgp_clear_vty(vty, vrf, afi, safi, clr_sort, clr_type, clr_arg);
7541 }
7542
7543 DEFUN (clear_ip_bgp_prefix,
7544 clear_ip_bgp_prefix_cmd,
7545 "clear [ip] bgp [<view|vrf> VIEWVRFNAME] prefix A.B.C.D/M",
7546 CLEAR_STR
7547 IP_STR
7548 BGP_STR
7549 BGP_INSTANCE_HELP_STR
7550 "Clear bestpath and re-advertise\n"
7551 "IPv4 prefix\n")
7552 {
7553 char *vrf = NULL;
7554 char *prefix = NULL;
7555
7556 int idx = 0;
7557
7558 /* [<view|vrf> VIEWVRFNAME] */
7559 if (argv_find(argv, argc, "vrf", &idx)) {
7560 vrf = argv[idx + 1]->arg;
7561 idx += 2;
7562 if (vrf && strmatch(vrf, VRF_DEFAULT_NAME))
7563 vrf = NULL;
7564 } else if (argv_find(argv, argc, "view", &idx)) {
7565 /* [<view> VIEWVRFNAME] */
7566 vrf = argv[idx + 1]->arg;
7567 idx += 2;
7568 }
7569
7570 prefix = argv[argc - 1]->arg;
7571
7572 return bgp_clear_prefix(vty, vrf, prefix, AFI_IP, SAFI_UNICAST, NULL);
7573 }
7574
7575 DEFUN (clear_bgp_ipv6_safi_prefix,
7576 clear_bgp_ipv6_safi_prefix_cmd,
7577 "clear [ip] bgp ipv6 "BGP_SAFI_CMD_STR" prefix X:X::X:X/M",
7578 CLEAR_STR
7579 IP_STR
7580 BGP_STR
7581 "Address Family\n"
7582 BGP_SAFI_HELP_STR
7583 "Clear bestpath and re-advertise\n"
7584 "IPv6 prefix\n")
7585 {
7586 int idx_safi = 0;
7587 int idx_ipv6_prefix = 0;
7588 safi_t safi = SAFI_UNICAST;
7589 char *prefix = argv_find(argv, argc, "X:X::X:X/M", &idx_ipv6_prefix) ?
7590 argv[idx_ipv6_prefix]->arg : NULL;
7591
7592 argv_find_and_parse_safi(argv, argc, &idx_safi, &safi);
7593 return bgp_clear_prefix(
7594 vty, NULL, prefix, AFI_IP6,
7595 safi, NULL);
7596 }
7597
7598 DEFUN (clear_bgp_instance_ipv6_safi_prefix,
7599 clear_bgp_instance_ipv6_safi_prefix_cmd,
7600 "clear [ip] bgp <view|vrf> VIEWVRFNAME ipv6 "BGP_SAFI_CMD_STR" prefix X:X::X:X/M",
7601 CLEAR_STR
7602 IP_STR
7603 BGP_STR
7604 BGP_INSTANCE_HELP_STR
7605 "Address Family\n"
7606 BGP_SAFI_HELP_STR
7607 "Clear bestpath and re-advertise\n"
7608 "IPv6 prefix\n")
7609 {
7610 int idx_safi = 0;
7611 int idx_vrfview = 0;
7612 int idx_ipv6_prefix = 0;
7613 safi_t safi = SAFI_UNICAST;
7614 char *prefix = argv_find(argv, argc, "X:X::X:X/M", &idx_ipv6_prefix) ?
7615 argv[idx_ipv6_prefix]->arg : NULL;
7616 char *vrfview = NULL;
7617
7618 /* [<view|vrf> VIEWVRFNAME] */
7619 if (argv_find(argv, argc, "vrf", &idx_vrfview)) {
7620 vrfview = argv[idx_vrfview + 1]->arg;
7621 if (vrfview && strmatch(vrfview, VRF_DEFAULT_NAME))
7622 vrfview = NULL;
7623 } else if (argv_find(argv, argc, "view", &idx_vrfview)) {
7624 /* [<view> VIEWVRFNAME] */
7625 vrfview = argv[idx_vrfview + 1]->arg;
7626 }
7627 argv_find_and_parse_safi(argv, argc, &idx_safi, &safi);
7628
7629 return bgp_clear_prefix(
7630 vty, vrfview, prefix,
7631 AFI_IP6, safi, NULL);
7632 }
7633
7634 DEFUN (show_bgp_views,
7635 show_bgp_views_cmd,
7636 "show [ip] bgp views",
7637 SHOW_STR
7638 IP_STR
7639 BGP_STR
7640 "Show the defined BGP views\n")
7641 {
7642 struct list *inst = bm->bgp;
7643 struct listnode *node;
7644 struct bgp *bgp;
7645
7646 vty_out(vty, "Defined BGP views:\n");
7647 for (ALL_LIST_ELEMENTS_RO(inst, node, bgp)) {
7648 /* Skip VRFs. */
7649 if (bgp->inst_type == BGP_INSTANCE_TYPE_VRF)
7650 continue;
7651 vty_out(vty, "\t%s (AS%u)\n", bgp->name ? bgp->name : "(null)",
7652 bgp->as);
7653 }
7654
7655 return CMD_SUCCESS;
7656 }
7657
7658 DEFUN (show_bgp_vrfs,
7659 show_bgp_vrfs_cmd,
7660 "show [ip] bgp vrfs [json]",
7661 SHOW_STR
7662 IP_STR
7663 BGP_STR
7664 "Show BGP VRFs\n"
7665 JSON_STR)
7666 {
7667 char buf[ETHER_ADDR_STRLEN];
7668 struct list *inst = bm->bgp;
7669 struct listnode *node;
7670 struct bgp *bgp;
7671 bool uj = use_json(argc, argv);
7672 json_object *json = NULL;
7673 json_object *json_vrfs = NULL;
7674 int count = 0;
7675
7676 if (uj) {
7677 json = json_object_new_object();
7678 json_vrfs = json_object_new_object();
7679 }
7680
7681 for (ALL_LIST_ELEMENTS_RO(inst, node, bgp)) {
7682 const char *name, *type;
7683 struct peer *peer;
7684 struct listnode *node2, *nnode2;
7685 int peers_cfg, peers_estb;
7686 json_object *json_vrf = NULL;
7687
7688 /* Skip Views. */
7689 if (bgp->inst_type == BGP_INSTANCE_TYPE_VIEW)
7690 continue;
7691
7692 count++;
7693 if (!uj && count == 1) {
7694 vty_out(vty,
7695 "%4s %-5s %-16s %9s %10s %-37s\n",
7696 "Type", "Id", "routerId", "#PeersCfg",
7697 "#PeersEstb", "Name");
7698 vty_out(vty, "%11s %-16s %-21s %-6s\n", " ",
7699 "L3-VNI", "RouterMAC", "Interface");
7700 }
7701
7702 peers_cfg = peers_estb = 0;
7703 if (uj)
7704 json_vrf = json_object_new_object();
7705
7706
7707 for (ALL_LIST_ELEMENTS(bgp->peer, node2, nnode2, peer)) {
7708 if (!CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE))
7709 continue;
7710 peers_cfg++;
7711 if (peer->status == Established)
7712 peers_estb++;
7713 }
7714
7715 if (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT) {
7716 name = VRF_DEFAULT_NAME;
7717 type = "DFLT";
7718 } else {
7719 name = bgp->name;
7720 type = "VRF";
7721 }
7722
7723
7724 if (uj) {
7725 int64_t vrf_id_ui = (bgp->vrf_id == VRF_UNKNOWN)
7726 ? -1
7727 : (int64_t)bgp->vrf_id;
7728 json_object_string_add(json_vrf, "type", type);
7729 json_object_int_add(json_vrf, "vrfId", vrf_id_ui);
7730 json_object_string_add(json_vrf, "routerId",
7731 inet_ntoa(bgp->router_id));
7732 json_object_int_add(json_vrf, "numConfiguredPeers",
7733 peers_cfg);
7734 json_object_int_add(json_vrf, "numEstablishedPeers",
7735 peers_estb);
7736
7737 json_object_int_add(json_vrf, "l3vni", bgp->l3vni);
7738 json_object_string_add(
7739 json_vrf, "rmac",
7740 prefix_mac2str(&bgp->rmac, buf, sizeof(buf)));
7741 json_object_string_add(json_vrf, "interface",
7742 ifindex2ifname(bgp->l3vni_svi_ifindex,
7743 bgp->vrf_id));
7744 json_object_object_add(json_vrfs, name, json_vrf);
7745 } else {
7746 vty_out(vty,
7747 "%4s %-5d %-16s %-9u %-10u %-37s\n",
7748 type,
7749 bgp->vrf_id == VRF_UNKNOWN ? -1
7750 : (int)bgp->vrf_id,
7751 inet_ntoa(bgp->router_id), peers_cfg,
7752 peers_estb, name);
7753 vty_out(vty,"%11s %-16u %-21s %-20s\n", " ",
7754 bgp->l3vni,
7755 prefix_mac2str(&bgp->rmac, buf, sizeof(buf)),
7756 ifindex2ifname(bgp->l3vni_svi_ifindex,
7757 bgp->vrf_id));
7758 }
7759 }
7760
7761 if (uj) {
7762 json_object_object_add(json, "vrfs", json_vrfs);
7763
7764 json_object_int_add(json, "totalVrfs", count);
7765
7766 vty_out(vty, "%s\n", json_object_to_json_string_ext(
7767 json, JSON_C_TO_STRING_PRETTY));
7768 json_object_free(json);
7769 } else {
7770 if (count)
7771 vty_out(vty,
7772 "\nTotal number of VRFs (including default): %d\n",
7773 count);
7774 }
7775
7776 return CMD_SUCCESS;
7777 }
7778
7779 DEFUN (show_bgp_mac_hash,
7780 show_bgp_mac_hash_cmd,
7781 "show bgp mac hash",
7782 SHOW_STR
7783 BGP_STR
7784 "Mac Address\n"
7785 "Mac Address database\n")
7786 {
7787 bgp_mac_dump_table(vty);
7788
7789 return CMD_SUCCESS;
7790 }
7791
7792 static void show_tip_entry(struct hash_bucket *bucket, void *args)
7793 {
7794 struct vty *vty = (struct vty *)args;
7795 struct tip_addr *tip = (struct tip_addr *)bucket->data;
7796
7797 vty_out(vty, "addr: %s, count: %d\n", inet_ntoa(tip->addr),
7798 tip->refcnt);
7799 }
7800
7801 static void bgp_show_martian_nexthops(struct vty *vty, struct bgp *bgp)
7802 {
7803 vty_out(vty, "self nexthop database:\n");
7804 bgp_nexthop_show_address_hash(vty, bgp);
7805
7806 vty_out(vty, "Tunnel-ip database:\n");
7807 hash_iterate(bgp->tip_hash,
7808 (void (*)(struct hash_bucket *, void *))show_tip_entry,
7809 vty);
7810 }
7811
7812 DEFUN(show_bgp_martian_nexthop_db, show_bgp_martian_nexthop_db_cmd,
7813 "show bgp [<view|vrf> VIEWVRFNAME] martian next-hop",
7814 SHOW_STR BGP_STR BGP_INSTANCE_HELP_STR
7815 "martian next-hops\n"
7816 "martian next-hop database\n")
7817 {
7818 struct bgp *bgp = NULL;
7819 int idx = 0;
7820 char *name = NULL;
7821
7822 /* [<vrf> VIEWVRFNAME] */
7823 if (argv_find(argv, argc, "vrf", &idx)) {
7824 name = argv[idx + 1]->arg;
7825 if (name && strmatch(name, VRF_DEFAULT_NAME))
7826 name = NULL;
7827 } else if (argv_find(argv, argc, "view", &idx))
7828 /* [<view> VIEWVRFNAME] */
7829 name = argv[idx + 1]->arg;
7830 if (name)
7831 bgp = bgp_lookup_by_name(name);
7832 else
7833 bgp = bgp_get_default();
7834
7835 if (!bgp) {
7836 vty_out(vty, "%% No BGP process is configured\n");
7837 return CMD_WARNING;
7838 }
7839 bgp_show_martian_nexthops(vty, bgp);
7840
7841 return CMD_SUCCESS;
7842 }
7843
7844 DEFUN (show_bgp_memory,
7845 show_bgp_memory_cmd,
7846 "show [ip] bgp memory",
7847 SHOW_STR
7848 IP_STR
7849 BGP_STR
7850 "Global BGP memory statistics\n")
7851 {
7852 char memstrbuf[MTYPE_MEMSTR_LEN];
7853 unsigned long count;
7854
7855 /* RIB related usage stats */
7856 count = mtype_stats_alloc(MTYPE_BGP_NODE);
7857 vty_out(vty, "%ld RIB nodes, using %s of memory\n", count,
7858 mtype_memstr(memstrbuf, sizeof(memstrbuf),
7859 count * sizeof(struct bgp_node)));
7860
7861 count = mtype_stats_alloc(MTYPE_BGP_ROUTE);
7862 vty_out(vty, "%ld BGP routes, using %s of memory\n", count,
7863 mtype_memstr(memstrbuf, sizeof(memstrbuf),
7864 count * sizeof(struct bgp_path_info)));
7865 if ((count = mtype_stats_alloc(MTYPE_BGP_ROUTE_EXTRA)))
7866 vty_out(vty, "%ld BGP route ancillaries, using %s of memory\n",
7867 count,
7868 mtype_memstr(
7869 memstrbuf, sizeof(memstrbuf),
7870 count * sizeof(struct bgp_path_info_extra)));
7871
7872 if ((count = mtype_stats_alloc(MTYPE_BGP_STATIC)))
7873 vty_out(vty, "%ld Static routes, using %s of memory\n", count,
7874 mtype_memstr(memstrbuf, sizeof(memstrbuf),
7875 count * sizeof(struct bgp_static)));
7876
7877 if ((count = mtype_stats_alloc(MTYPE_BGP_PACKET)))
7878 vty_out(vty, "%ld Packets, using %s of memory\n", count,
7879 mtype_memstr(memstrbuf, sizeof(memstrbuf),
7880 count * sizeof(struct bpacket)));
7881
7882 /* Adj-In/Out */
7883 if ((count = mtype_stats_alloc(MTYPE_BGP_ADJ_IN)))
7884 vty_out(vty, "%ld Adj-In entries, using %s of memory\n", count,
7885 mtype_memstr(memstrbuf, sizeof(memstrbuf),
7886 count * sizeof(struct bgp_adj_in)));
7887 if ((count = mtype_stats_alloc(MTYPE_BGP_ADJ_OUT)))
7888 vty_out(vty, "%ld Adj-Out entries, using %s of memory\n", count,
7889 mtype_memstr(memstrbuf, sizeof(memstrbuf),
7890 count * sizeof(struct bgp_adj_out)));
7891
7892 if ((count = mtype_stats_alloc(MTYPE_BGP_NEXTHOP_CACHE)))
7893 vty_out(vty, "%ld Nexthop cache entries, using %s of memory\n",
7894 count,
7895 mtype_memstr(memstrbuf, sizeof(memstrbuf),
7896 count * sizeof(struct bgp_nexthop_cache)));
7897
7898 if ((count = mtype_stats_alloc(MTYPE_BGP_DAMP_INFO)))
7899 vty_out(vty, "%ld Dampening entries, using %s of memory\n",
7900 count,
7901 mtype_memstr(memstrbuf, sizeof(memstrbuf),
7902 count * sizeof(struct bgp_damp_info)));
7903
7904 /* Attributes */
7905 count = attr_count();
7906 vty_out(vty, "%ld BGP attributes, using %s of memory\n", count,
7907 mtype_memstr(memstrbuf, sizeof(memstrbuf),
7908 count * sizeof(struct attr)));
7909
7910 if ((count = attr_unknown_count()))
7911 vty_out(vty, "%ld unknown attributes\n", count);
7912
7913 /* AS_PATH attributes */
7914 count = aspath_count();
7915 vty_out(vty, "%ld BGP AS-PATH entries, using %s of memory\n", count,
7916 mtype_memstr(memstrbuf, sizeof(memstrbuf),
7917 count * sizeof(struct aspath)));
7918
7919 count = mtype_stats_alloc(MTYPE_AS_SEG);
7920 vty_out(vty, "%ld BGP AS-PATH segments, using %s of memory\n", count,
7921 mtype_memstr(memstrbuf, sizeof(memstrbuf),
7922 count * sizeof(struct assegment)));
7923
7924 /* Other attributes */
7925 if ((count = community_count()))
7926 vty_out(vty, "%ld BGP community entries, using %s of memory\n",
7927 count, mtype_memstr(memstrbuf, sizeof(memstrbuf),
7928 count * sizeof(struct community)));
7929 if ((count = mtype_stats_alloc(MTYPE_ECOMMUNITY)))
7930 vty_out(vty, "%ld BGP community entries, using %s of memory\n",
7931 count, mtype_memstr(memstrbuf, sizeof(memstrbuf),
7932 count * sizeof(struct ecommunity)));
7933 if ((count = mtype_stats_alloc(MTYPE_LCOMMUNITY)))
7934 vty_out(vty,
7935 "%ld BGP large-community entries, using %s of memory\n",
7936 count, mtype_memstr(memstrbuf, sizeof(memstrbuf),
7937 count * sizeof(struct lcommunity)));
7938
7939 if ((count = mtype_stats_alloc(MTYPE_CLUSTER)))
7940 vty_out(vty, "%ld Cluster lists, using %s of memory\n", count,
7941 mtype_memstr(memstrbuf, sizeof(memstrbuf),
7942 count * sizeof(struct cluster_list)));
7943
7944 /* Peer related usage */
7945 count = mtype_stats_alloc(MTYPE_BGP_PEER);
7946 vty_out(vty, "%ld peers, using %s of memory\n", count,
7947 mtype_memstr(memstrbuf, sizeof(memstrbuf),
7948 count * sizeof(struct peer)));
7949
7950 if ((count = mtype_stats_alloc(MTYPE_PEER_GROUP)))
7951 vty_out(vty, "%ld peer groups, using %s of memory\n", count,
7952 mtype_memstr(memstrbuf, sizeof(memstrbuf),
7953 count * sizeof(struct peer_group)));
7954
7955 /* Other */
7956 if ((count = mtype_stats_alloc(MTYPE_BGP_REGEXP)))
7957 vty_out(vty, "%ld compiled regexes, using %s of memory\n",
7958 count, mtype_memstr(memstrbuf, sizeof(memstrbuf),
7959 count * sizeof(regex_t)));
7960 return CMD_SUCCESS;
7961 }
7962
7963 static void bgp_show_bestpath_json(struct bgp *bgp, json_object *json)
7964 {
7965 json_object *bestpath = json_object_new_object();
7966
7967 if (bgp_flag_check(bgp, BGP_FLAG_ASPATH_IGNORE))
7968 json_object_string_add(bestpath, "asPath", "ignore");
7969
7970 if (bgp_flag_check(bgp, BGP_FLAG_ASPATH_CONFED))
7971 json_object_string_add(bestpath, "asPath", "confed");
7972
7973 if (bgp_flag_check(bgp, BGP_FLAG_ASPATH_MULTIPATH_RELAX)) {
7974 if (bgp_flag_check(bgp, BGP_FLAG_MULTIPATH_RELAX_AS_SET))
7975 json_object_string_add(bestpath, "multiPathRelax",
7976 "as-set");
7977 else
7978 json_object_string_add(bestpath, "multiPathRelax",
7979 "true");
7980 } else
7981 json_object_string_add(bestpath, "multiPathRelax", "false");
7982
7983 if (bgp_flag_check(bgp, BGP_FLAG_COMPARE_ROUTER_ID))
7984 json_object_string_add(bestpath, "compareRouterId", "true");
7985 if (bgp_flag_check(bgp, BGP_FLAG_MED_CONFED)
7986 || bgp_flag_check(bgp, BGP_FLAG_MED_MISSING_AS_WORST)) {
7987 if (bgp_flag_check(bgp, BGP_FLAG_MED_CONFED))
7988 json_object_string_add(bestpath, "med", "confed");
7989 if (bgp_flag_check(bgp, BGP_FLAG_MED_MISSING_AS_WORST))
7990 json_object_string_add(bestpath, "med",
7991 "missing-as-worst");
7992 else
7993 json_object_string_add(bestpath, "med", "true");
7994 }
7995
7996 json_object_object_add(json, "bestPath", bestpath);
7997 }
7998
7999 /* Print the error code/subcode for why the peer is down */
8000 static void bgp_show_peer_reset(struct vty * vty, struct peer *peer,
8001 json_object *json_peer, bool use_json)
8002 {
8003 const char *code_str;
8004 const char *subcode_str;
8005
8006 if (use_json) {
8007 if (peer->last_reset == PEER_DOWN_NOTIFY_SEND
8008 || peer->last_reset == PEER_DOWN_NOTIFY_RECEIVED) {
8009 char errorcodesubcode_hexstr[5];
8010 char errorcodesubcode_str[256];
8011
8012 code_str = bgp_notify_code_str(peer->notify.code);
8013 subcode_str = bgp_notify_subcode_str(
8014 peer->notify.code,
8015 peer->notify.subcode);
8016
8017 sprintf(errorcodesubcode_hexstr, "%02X%02X",
8018 peer->notify.code, peer->notify.subcode);
8019 json_object_string_add(json_peer,
8020 "lastErrorCodeSubcode",
8021 errorcodesubcode_hexstr);
8022 snprintf(errorcodesubcode_str, 255, "%s%s",
8023 code_str, subcode_str);
8024 json_object_string_add(json_peer,
8025 "lastNotificationReason",
8026 errorcodesubcode_str);
8027 if (peer->last_reset == PEER_DOWN_NOTIFY_RECEIVED
8028 && peer->notify.code == BGP_NOTIFY_CEASE
8029 && (peer->notify.subcode
8030 == BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN
8031 || peer->notify.subcode
8032 == BGP_NOTIFY_CEASE_ADMIN_RESET)
8033 && peer->notify.length) {
8034 char msgbuf[1024];
8035 const char *msg_str;
8036
8037 msg_str = bgp_notify_admin_message(
8038 msgbuf, sizeof(msgbuf),
8039 (uint8_t *)peer->notify.data,
8040 peer->notify.length);
8041 if (msg_str)
8042 json_object_string_add(
8043 json_peer,
8044 "lastShutdownDescription",
8045 msg_str);
8046 }
8047
8048 }
8049 json_object_string_add(json_peer, "lastResetDueTo",
8050 peer_down_str[(int)peer->last_reset]);
8051 json_object_int_add(json_peer, "lastResetCode",
8052 peer->last_reset);
8053 } else {
8054 if (peer->last_reset == PEER_DOWN_NOTIFY_SEND
8055 || peer->last_reset == PEER_DOWN_NOTIFY_RECEIVED) {
8056 code_str = bgp_notify_code_str(peer->notify.code);
8057 subcode_str =
8058 bgp_notify_subcode_str(peer->notify.code,
8059 peer->notify.subcode);
8060 vty_out(vty, " Notification %s (%s%s)\n",
8061 peer->last_reset == PEER_DOWN_NOTIFY_SEND
8062 ? "sent"
8063 : "received",
8064 code_str, subcode_str);
8065 } else {
8066 vty_out(vty, " %s\n",
8067 peer_down_str[(int)peer->last_reset]);
8068 }
8069 }
8070 }
8071
8072 static inline bool bgp_has_peer_failed(struct peer *peer, afi_t afi,
8073 safi_t safi)
8074 {
8075 return ((peer->status != Established) ||
8076 !peer->afc_recv[afi][safi]);
8077 }
8078
8079 static void bgp_show_failed_summary(struct vty *vty, struct bgp *bgp,
8080 struct peer *peer, json_object *json_peer,
8081 int max_neighbor_width, bool use_json)
8082 {
8083 char timebuf[BGP_UPTIME_LEN], dn_flag[2];
8084 int len;
8085
8086 if (use_json) {
8087 if (peer_dynamic_neighbor(peer))
8088 json_object_boolean_true_add(json_peer,
8089 "dynamicPeer");
8090 if (peer->hostname)
8091 json_object_string_add(json_peer, "hostname",
8092 peer->hostname);
8093
8094 if (peer->domainname)
8095 json_object_string_add(json_peer, "domainname",
8096 peer->domainname);
8097 json_object_int_add(json_peer, "connectionsEstablished",
8098 peer->established);
8099 json_object_int_add(json_peer, "connectionsDropped",
8100 peer->dropped);
8101 peer_uptime(peer->uptime, timebuf, BGP_UPTIME_LEN,
8102 use_json, json_peer);
8103 if (peer->status == Established)
8104 json_object_string_add(json_peer, "lastResetDueTo",
8105 "AFI/SAFI Not Negotiated");
8106 else
8107 bgp_show_peer_reset(NULL, peer, json_peer, true);
8108 } else {
8109 dn_flag[1] = '\0';
8110 dn_flag[0] = peer_dynamic_neighbor(peer) ? '*' : '\0';
8111 if (peer->hostname
8112 && bgp_flag_check(bgp, BGP_FLAG_SHOW_HOSTNAME))
8113 len = vty_out(vty, "%s%s(%s)", dn_flag,
8114 peer->hostname, peer->host);
8115 else
8116 len = vty_out(vty, "%s%s", dn_flag, peer->host);
8117
8118 /* pad the neighbor column with spaces */
8119 if (len < max_neighbor_width)
8120 vty_out(vty, "%*s", max_neighbor_width - len,
8121 " ");
8122 vty_out(vty, "%7d %7d %8s", peer->established,
8123 peer->dropped,
8124 peer_uptime(peer->uptime, timebuf,
8125 BGP_UPTIME_LEN, 0, NULL));
8126 if (peer->status == Established)
8127 vty_out(vty, " AFI/SAFI Not Negotiated\n");
8128 else
8129 bgp_show_peer_reset(vty, peer, NULL,
8130 false);
8131 }
8132 }
8133
8134
8135 /* Show BGP peer's summary information. */
8136 static int bgp_show_summary(struct vty *vty, struct bgp *bgp, int afi, int safi,
8137 bool show_failed, bool use_json)
8138 {
8139 struct peer *peer;
8140 struct listnode *node, *nnode;
8141 unsigned int count = 0, dn_count = 0;
8142 char timebuf[BGP_UPTIME_LEN], dn_flag[2];
8143 char neighbor_buf[VTY_BUFSIZ];
8144 int neighbor_col_default_width = 16;
8145 int len, failed_count = 0;
8146 int max_neighbor_width = 0;
8147 int pfx_rcd_safi;
8148 json_object *json = NULL;
8149 json_object *json_peer = NULL;
8150 json_object *json_peers = NULL;
8151 struct peer_af *paf;
8152
8153 /* labeled-unicast routes are installed in the unicast table so in order
8154 * to
8155 * display the correct PfxRcd value we must look at SAFI_UNICAST
8156 */
8157
8158 if (safi == SAFI_LABELED_UNICAST)
8159 pfx_rcd_safi = SAFI_UNICAST;
8160 else
8161 pfx_rcd_safi = safi;
8162
8163 if (use_json) {
8164 json = json_object_new_object();
8165 json_peers = json_object_new_object();
8166 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
8167 if (!CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE))
8168 continue;
8169
8170 if (peer->afc[afi][safi]) {
8171 /* See if we have at least a single failed peer */
8172 if (bgp_has_peer_failed(peer, afi, safi))
8173 failed_count++;
8174 count++;
8175 }
8176 if (peer_dynamic_neighbor(peer))
8177 dn_count++;
8178 }
8179
8180 } else {
8181 /* Loop over all neighbors that will be displayed to determine
8182 * how many
8183 * characters are needed for the Neighbor column
8184 */
8185 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
8186 if (!CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE))
8187 continue;
8188
8189 if (peer->afc[afi][safi]) {
8190 memset(dn_flag, '\0', sizeof(dn_flag));
8191 if (peer_dynamic_neighbor(peer))
8192 dn_flag[0] = '*';
8193
8194 if (peer->hostname
8195 && bgp_flag_check(bgp,
8196 BGP_FLAG_SHOW_HOSTNAME))
8197 sprintf(neighbor_buf, "%s%s(%s) ",
8198 dn_flag, peer->hostname,
8199 peer->host);
8200 else
8201 sprintf(neighbor_buf, "%s%s ", dn_flag,
8202 peer->host);
8203
8204 len = strlen(neighbor_buf);
8205
8206 if (len > max_neighbor_width)
8207 max_neighbor_width = len;
8208
8209 /* See if we have at least a single failed peer */
8210 if (bgp_has_peer_failed(peer, afi, safi))
8211 failed_count++;
8212 count++;
8213 }
8214 }
8215
8216 /* Originally we displayed the Neighbor column as 16
8217 * characters wide so make that the default
8218 */
8219 if (max_neighbor_width < neighbor_col_default_width)
8220 max_neighbor_width = neighbor_col_default_width;
8221 }
8222
8223 if (show_failed && !failed_count) {
8224 if (use_json) {
8225 json_object_int_add(json, "failedPeersCount", 0);
8226 json_object_int_add(json, "dynamicPeers", dn_count);
8227 json_object_int_add(json, "totalPeers", count);
8228
8229 vty_out(vty, "%s\n", json_object_to_json_string_ext(
8230 json, JSON_C_TO_STRING_PRETTY));
8231 json_object_free(json);
8232 } else {
8233 vty_out(vty, "%% No failed BGP neighbors found\n");
8234 vty_out(vty, "\nTotal number of neighbors %d\n", count);
8235 }
8236 return CMD_SUCCESS;
8237 }
8238
8239 count = 0; /* Reset the value as its used again */
8240 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
8241 if (!CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE))
8242 continue;
8243
8244 if (!peer->afc[afi][safi])
8245 continue;
8246
8247 if (!count) {
8248 unsigned long ents;
8249 char memstrbuf[MTYPE_MEMSTR_LEN];
8250 int64_t vrf_id_ui;
8251
8252 vrf_id_ui = (bgp->vrf_id == VRF_UNKNOWN)
8253 ? -1
8254 : (int64_t)bgp->vrf_id;
8255
8256 /* Usage summary and header */
8257 if (use_json) {
8258 json_object_string_add(
8259 json, "routerId",
8260 inet_ntoa(bgp->router_id));
8261 json_object_int_add(json, "as", bgp->as);
8262 json_object_int_add(json, "vrfId", vrf_id_ui);
8263 json_object_string_add(
8264 json, "vrfName",
8265 (bgp->inst_type
8266 == BGP_INSTANCE_TYPE_DEFAULT)
8267 ? VRF_DEFAULT_NAME
8268 : bgp->name);
8269 } else {
8270 vty_out(vty,
8271 "BGP router identifier %s, local AS number %u vrf-id %d",
8272 inet_ntoa(bgp->router_id), bgp->as,
8273 bgp->vrf_id == VRF_UNKNOWN
8274 ? -1
8275 : (int)bgp->vrf_id);
8276 vty_out(vty, "\n");
8277 }
8278
8279 if (bgp_update_delay_configured(bgp)) {
8280 if (use_json) {
8281 json_object_int_add(
8282 json, "updateDelayLimit",
8283 bgp->v_update_delay);
8284
8285 if (bgp->v_update_delay
8286 != bgp->v_establish_wait)
8287 json_object_int_add(
8288 json,
8289 "updateDelayEstablishWait",
8290 bgp->v_establish_wait);
8291
8292 if (bgp_update_delay_active(bgp)) {
8293 json_object_string_add(
8294 json,
8295 "updateDelayFirstNeighbor",
8296 bgp->update_delay_begin_time);
8297 json_object_boolean_true_add(
8298 json,
8299 "updateDelayInProgress");
8300 } else {
8301 if (bgp->update_delay_over) {
8302 json_object_string_add(
8303 json,
8304 "updateDelayFirstNeighbor",
8305 bgp->update_delay_begin_time);
8306 json_object_string_add(
8307 json,
8308 "updateDelayBestpathResumed",
8309 bgp->update_delay_end_time);
8310 json_object_string_add(
8311 json,
8312 "updateDelayZebraUpdateResume",
8313 bgp->update_delay_zebra_resume_time);
8314 json_object_string_add(
8315 json,
8316 "updateDelayPeerUpdateResume",
8317 bgp->update_delay_peers_resume_time);
8318 }
8319 }
8320 } else {
8321 vty_out(vty,
8322 "Read-only mode update-delay limit: %d seconds\n",
8323 bgp->v_update_delay);
8324 if (bgp->v_update_delay
8325 != bgp->v_establish_wait)
8326 vty_out(vty,
8327 " Establish wait: %d seconds\n",
8328 bgp->v_establish_wait);
8329
8330 if (bgp_update_delay_active(bgp)) {
8331 vty_out(vty,
8332 " First neighbor established: %s\n",
8333 bgp->update_delay_begin_time);
8334 vty_out(vty,
8335 " Delay in progress\n");
8336 } else {
8337 if (bgp->update_delay_over) {
8338 vty_out(vty,
8339 " First neighbor established: %s\n",
8340 bgp->update_delay_begin_time);
8341 vty_out(vty,
8342 " Best-paths resumed: %s\n",
8343 bgp->update_delay_end_time);
8344 vty_out(vty,
8345 " zebra update resumed: %s\n",
8346 bgp->update_delay_zebra_resume_time);
8347 vty_out(vty,
8348 " peers update resumed: %s\n",
8349 bgp->update_delay_peers_resume_time);
8350 }
8351 }
8352 }
8353 }
8354
8355 if (use_json) {
8356 if (bgp_maxmed_onstartup_configured(bgp)
8357 && bgp->maxmed_active)
8358 json_object_boolean_true_add(
8359 json, "maxMedOnStartup");
8360 if (bgp->v_maxmed_admin)
8361 json_object_boolean_true_add(
8362 json, "maxMedAdministrative");
8363
8364 json_object_int_add(
8365 json, "tableVersion",
8366 bgp_table_version(bgp->rib[afi][safi]));
8367
8368 ents = bgp_table_count(bgp->rib[afi][safi]);
8369 json_object_int_add(json, "ribCount", ents);
8370 json_object_int_add(
8371 json, "ribMemory",
8372 ents * sizeof(struct bgp_node));
8373
8374 ents = bgp->af_peer_count[afi][safi];
8375 json_object_int_add(json, "peerCount", ents);
8376 json_object_int_add(json, "peerMemory",
8377 ents * sizeof(struct peer));
8378
8379 if ((ents = listcount(bgp->group))) {
8380 json_object_int_add(
8381 json, "peerGroupCount", ents);
8382 json_object_int_add(
8383 json, "peerGroupMemory",
8384 ents * sizeof(struct
8385 peer_group));
8386 }
8387
8388 if (CHECK_FLAG(bgp->af_flags[afi][safi],
8389 BGP_CONFIG_DAMPENING))
8390 json_object_boolean_true_add(
8391 json, "dampeningEnabled");
8392 } else {
8393 if (bgp_maxmed_onstartup_configured(bgp)
8394 && bgp->maxmed_active)
8395 vty_out(vty,
8396 "Max-med on-startup active\n");
8397 if (bgp->v_maxmed_admin)
8398 vty_out(vty,
8399 "Max-med administrative active\n");
8400
8401 vty_out(vty, "BGP table version %" PRIu64 "\n",
8402 bgp_table_version(bgp->rib[afi][safi]));
8403
8404 ents = bgp_table_count(bgp->rib[afi][safi]);
8405 vty_out(vty,
8406 "RIB entries %ld, using %s of memory\n",
8407 ents,
8408 mtype_memstr(memstrbuf,
8409 sizeof(memstrbuf),
8410 ents * sizeof(struct
8411 bgp_node)));
8412
8413 /* Peer related usage */
8414 ents = bgp->af_peer_count[afi][safi];
8415 vty_out(vty, "Peers %ld, using %s of memory\n",
8416 ents,
8417 mtype_memstr(
8418 memstrbuf, sizeof(memstrbuf),
8419 ents * sizeof(struct peer)));
8420
8421 if ((ents = listcount(bgp->group)))
8422 vty_out(vty,
8423 "Peer groups %ld, using %s of memory\n",
8424 ents,
8425 mtype_memstr(
8426 memstrbuf,
8427 sizeof(memstrbuf),
8428 ents * sizeof(struct
8429 peer_group)));
8430
8431 if (CHECK_FLAG(bgp->af_flags[afi][safi],
8432 BGP_CONFIG_DAMPENING))
8433 vty_out(vty, "Dampening enabled.\n");
8434 vty_out(vty, "\n");
8435
8436 /* Subtract 8 here because 'Neighbor' is
8437 * 8 characters */
8438 vty_out(vty, "Neighbor");
8439 vty_out(vty, "%*s", max_neighbor_width - 8,
8440 " ");
8441 if (show_failed)
8442 vty_out(vty, "EstdCnt DropCnt ResetTime Reason\n");
8443 else
8444 vty_out(vty,
8445 "V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd\n");
8446 }
8447 }
8448
8449 count++;
8450 /* Works for both failed & successful cases */
8451 if (peer_dynamic_neighbor(peer))
8452 dn_count++;
8453
8454 if (use_json) {
8455 json_peer = NULL;
8456
8457 if (show_failed &&
8458 bgp_has_peer_failed(peer, afi, safi)) {
8459 json_peer = json_object_new_object();
8460 bgp_show_failed_summary(vty, bgp, peer,
8461 json_peer, 0, use_json);
8462 } else if (!show_failed) {
8463 json_peer = json_object_new_object();
8464 if (peer_dynamic_neighbor(peer)) {
8465 json_object_boolean_true_add(json_peer,
8466 "dynamicPeer");
8467 }
8468
8469 if (peer->hostname)
8470 json_object_string_add(json_peer, "hostname",
8471 peer->hostname);
8472
8473 if (peer->domainname)
8474 json_object_string_add(json_peer, "domainname",
8475 peer->domainname);
8476
8477 json_object_int_add(json_peer, "remoteAs", peer->as);
8478 json_object_int_add(json_peer, "version", 4);
8479 json_object_int_add(json_peer, "msgRcvd",
8480 PEER_TOTAL_RX(peer));
8481 json_object_int_add(json_peer, "msgSent",
8482 PEER_TOTAL_TX(peer));
8483
8484 json_object_int_add(json_peer, "tableVersion",
8485 peer->version[afi][safi]);
8486 json_object_int_add(json_peer, "outq",
8487 peer->obuf->count);
8488 json_object_int_add(json_peer, "inq", 0);
8489 peer_uptime(peer->uptime, timebuf, BGP_UPTIME_LEN,
8490 use_json, json_peer);
8491
8492 /*
8493 * Adding "pfxRcd" field to match with the corresponding
8494 * CLI. "prefixReceivedCount" will be deprecated in
8495 * future.
8496 */
8497 json_object_int_add(json_peer, "prefixReceivedCount",
8498 peer->pcount[afi][pfx_rcd_safi]);
8499 json_object_int_add(json_peer, "pfxRcd",
8500 peer->pcount[afi][pfx_rcd_safi]);
8501
8502 paf = peer_af_find(peer, afi, pfx_rcd_safi);
8503 if (paf && PAF_SUBGRP(paf))
8504 json_object_int_add(json_peer,
8505 "pfxSnt",
8506 (PAF_SUBGRP(paf))->scount);
8507 if (CHECK_FLAG(peer->flags, PEER_FLAG_SHUTDOWN))
8508 json_object_string_add(json_peer, "state",
8509 "Idle (Admin)");
8510 else if (peer->afc_recv[afi][safi])
8511 json_object_string_add(
8512 json_peer, "state",
8513 lookup_msg(bgp_status_msg, peer->status,
8514 NULL));
8515 else if (CHECK_FLAG(peer->sflags,
8516 PEER_STATUS_PREFIX_OVERFLOW))
8517 json_object_string_add(json_peer, "state",
8518 "Idle (PfxCt)");
8519 else
8520 json_object_string_add(
8521 json_peer, "state",
8522 lookup_msg(bgp_status_msg, peer->status,
8523 NULL));
8524 json_object_int_add(json_peer, "connectionsEstablished",
8525 peer->established);
8526 json_object_int_add(json_peer, "connectionsDropped",
8527 peer->dropped);
8528 }
8529 /* Avoid creating empty peer dicts in JSON */
8530 if (json_peer == NULL)
8531 continue;
8532
8533 if (peer->conf_if)
8534 json_object_string_add(json_peer, "idType",
8535 "interface");
8536 else if (peer->su.sa.sa_family == AF_INET)
8537 json_object_string_add(json_peer, "idType",
8538 "ipv4");
8539 else if (peer->su.sa.sa_family == AF_INET6)
8540 json_object_string_add(json_peer, "idType",
8541 "ipv6");
8542 json_object_object_add(json_peers, peer->host,
8543 json_peer);
8544 } else {
8545 if (show_failed &&
8546 bgp_has_peer_failed(peer, afi, safi)) {
8547 bgp_show_failed_summary(vty, bgp, peer, NULL,
8548 max_neighbor_width,
8549 use_json);
8550 } else if (!show_failed) {
8551 memset(dn_flag, '\0', sizeof(dn_flag));
8552 if (peer_dynamic_neighbor(peer)) {
8553 dn_flag[0] = '*';
8554 }
8555
8556 if (peer->hostname
8557 && bgp_flag_check(bgp, BGP_FLAG_SHOW_HOSTNAME))
8558 len = vty_out(vty, "%s%s(%s)", dn_flag,
8559 peer->hostname, peer->host);
8560 else
8561 len = vty_out(vty, "%s%s", dn_flag, peer->host);
8562
8563 /* pad the neighbor column with spaces */
8564 if (len < max_neighbor_width)
8565 vty_out(vty, "%*s", max_neighbor_width - len,
8566 " ");
8567
8568 vty_out(vty, "4 %10u %7u %7u %8" PRIu64 " %4d %4zd %8s",
8569 peer->as, PEER_TOTAL_RX(peer),
8570 PEER_TOTAL_TX(peer), peer->version[afi][safi],
8571 0, peer->obuf->count,
8572 peer_uptime(peer->uptime, timebuf,
8573 BGP_UPTIME_LEN, 0, NULL));
8574
8575 if (peer->status == Established)
8576 if (peer->afc_recv[afi][safi])
8577 vty_out(vty, " %12" PRIu32,
8578 peer->pcount
8579 [afi]
8580 [pfx_rcd_safi]);
8581 else
8582 vty_out(vty, " NoNeg");
8583 else {
8584 if (CHECK_FLAG(peer->flags, PEER_FLAG_SHUTDOWN))
8585 vty_out(vty, " Idle (Admin)");
8586 else if (CHECK_FLAG(
8587 peer->sflags,
8588 PEER_STATUS_PREFIX_OVERFLOW))
8589 vty_out(vty, " Idle (PfxCt)");
8590 else
8591 vty_out(vty, " %12s",
8592 lookup_msg(bgp_status_msg,
8593 peer->status, NULL));
8594 }
8595 vty_out(vty, "\n");
8596 }
8597
8598 }
8599 }
8600
8601 if (use_json) {
8602 json_object_object_add(json, "peers", json_peers);
8603 json_object_int_add(json, "failedPeers", failed_count);
8604 json_object_int_add(json, "totalPeers", count);
8605 json_object_int_add(json, "dynamicPeers", dn_count);
8606
8607 if (!show_failed)
8608 bgp_show_bestpath_json(bgp, json);
8609
8610 vty_out(vty, "%s\n", json_object_to_json_string_ext(
8611 json, JSON_C_TO_STRING_PRETTY));
8612 json_object_free(json);
8613 } else {
8614 if (count)
8615 vty_out(vty, "\nTotal number of neighbors %d\n", count);
8616 else {
8617 vty_out(vty, "No %s neighbor is configured\n",
8618 get_afi_safi_str(afi, safi, false));
8619 }
8620
8621 if (dn_count) {
8622 vty_out(vty, "* - dynamic neighbor\n");
8623 vty_out(vty, "%d dynamic neighbor(s), limit %d\n",
8624 dn_count, bgp->dynamic_neighbors_limit);
8625 }
8626 }
8627
8628 return CMD_SUCCESS;
8629 }
8630
8631 static void bgp_show_summary_afi_safi(struct vty *vty, struct bgp *bgp, int afi,
8632 int safi, bool show_failed, bool use_json)
8633 {
8634 int is_first = 1;
8635 int afi_wildcard = (afi == AFI_MAX);
8636 int safi_wildcard = (safi == SAFI_MAX);
8637 int is_wildcard = (afi_wildcard || safi_wildcard);
8638 bool nbr_output = false;
8639
8640 if (use_json && is_wildcard)
8641 vty_out(vty, "{\n");
8642 if (afi_wildcard)
8643 afi = 1; /* AFI_IP */
8644 while (afi < AFI_MAX) {
8645 if (safi_wildcard)
8646 safi = 1; /* SAFI_UNICAST */
8647 while (safi < SAFI_MAX) {
8648 if (bgp_afi_safi_peer_exists(bgp, afi, safi)) {
8649 nbr_output = true;
8650
8651 if (is_wildcard) {
8652 /*
8653 * So limit output to those afi/safi
8654 * pairs that
8655 * actualy have something interesting in
8656 * them
8657 */
8658 if (use_json) {
8659 if (!is_first)
8660 vty_out(vty, ",\n");
8661 else
8662 is_first = 0;
8663
8664 vty_out(vty, "\"%s\":",
8665 get_afi_safi_str(afi,
8666 safi,
8667 true));
8668 } else {
8669 vty_out(vty, "\n%s Summary:\n",
8670 get_afi_safi_str(afi,
8671 safi,
8672 false));
8673 }
8674 }
8675 bgp_show_summary(vty, bgp, afi, safi, show_failed,
8676 use_json);
8677 }
8678 safi++;
8679 if (!safi_wildcard)
8680 safi = SAFI_MAX;
8681 }
8682 afi++;
8683 if (!afi_wildcard)
8684 afi = AFI_MAX;
8685 }
8686
8687 if (use_json && is_wildcard)
8688 vty_out(vty, "}\n");
8689 else if (!nbr_output) {
8690 if (use_json)
8691 vty_out(vty, "{}\n");
8692 else
8693 vty_out(vty, "%% No BGP neighbors found\n");
8694 }
8695 }
8696
8697 static void bgp_show_all_instances_summary_vty(struct vty *vty, afi_t afi,
8698 safi_t safi, bool show_failed,
8699 bool use_json)
8700 {
8701 struct listnode *node, *nnode;
8702 struct bgp *bgp;
8703 int is_first = 1;
8704 bool nbr_output = false;
8705
8706 if (use_json)
8707 vty_out(vty, "{\n");
8708
8709 for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) {
8710 nbr_output = true;
8711 if (use_json) {
8712 if (!is_first)
8713 vty_out(vty, ",\n");
8714 else
8715 is_first = 0;
8716
8717 vty_out(vty, "\"%s\":",
8718 (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)
8719 ? VRF_DEFAULT_NAME
8720 : bgp->name);
8721 } else {
8722 vty_out(vty, "\nInstance %s:\n",
8723 (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)
8724 ? VRF_DEFAULT_NAME
8725 : bgp->name);
8726 }
8727 bgp_show_summary_afi_safi(vty, bgp, afi, safi, show_failed,
8728 use_json);
8729 }
8730
8731 if (use_json)
8732 vty_out(vty, "}\n");
8733 else if (!nbr_output)
8734 vty_out(vty, "%% BGP instance not found\n");
8735 }
8736
8737 int bgp_show_summary_vty(struct vty *vty, const char *name, afi_t afi,
8738 safi_t safi, bool show_failed, bool use_json)
8739 {
8740 struct bgp *bgp;
8741
8742 if (name) {
8743 if (strmatch(name, "all")) {
8744 bgp_show_all_instances_summary_vty(vty, afi, safi,
8745 show_failed,
8746 use_json);
8747 return CMD_SUCCESS;
8748 } else {
8749 bgp = bgp_lookup_by_name(name);
8750
8751 if (!bgp) {
8752 if (use_json)
8753 vty_out(vty, "{}\n");
8754 else
8755 vty_out(vty,
8756 "%% BGP instance not found\n");
8757 return CMD_WARNING;
8758 }
8759
8760 bgp_show_summary_afi_safi(vty, bgp, afi, safi,
8761 show_failed, use_json);
8762 return CMD_SUCCESS;
8763 }
8764 }
8765
8766 bgp = bgp_get_default();
8767
8768 if (bgp)
8769 bgp_show_summary_afi_safi(vty, bgp, afi, safi, show_failed,
8770 use_json);
8771 else {
8772 if (use_json)
8773 vty_out(vty, "{}\n");
8774 else
8775 vty_out(vty, "%% BGP instance not found\n");
8776 return CMD_WARNING;
8777 }
8778
8779 return CMD_SUCCESS;
8780 }
8781
8782 /* `show [ip] bgp summary' commands. */
8783 DEFUN (show_ip_bgp_summary,
8784 show_ip_bgp_summary_cmd,
8785 "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR" ["BGP_SAFI_WITH_LABEL_CMD_STR"]] summary [failed] [json]",
8786 SHOW_STR
8787 IP_STR
8788 BGP_STR
8789 BGP_INSTANCE_HELP_STR
8790 BGP_AFI_HELP_STR
8791 BGP_SAFI_WITH_LABEL_HELP_STR
8792 "Summary of BGP neighbor status\n"
8793 "Show only sessions not in Established state\n"
8794 JSON_STR)
8795 {
8796 char *vrf = NULL;
8797 afi_t afi = AFI_MAX;
8798 safi_t safi = SAFI_MAX;
8799 bool show_failed = false;
8800
8801 int idx = 0;
8802
8803 /* show [ip] bgp */
8804 if (argv_find(argv, argc, "ip", &idx))
8805 afi = AFI_IP;
8806 /* [<vrf> VIEWVRFNAME] */
8807 if (argv_find(argv, argc, "vrf", &idx)) {
8808 vrf = argv[idx + 1]->arg;
8809 if (vrf && strmatch(vrf, VRF_DEFAULT_NAME))
8810 vrf = NULL;
8811 } else if (argv_find(argv, argc, "view", &idx))
8812 /* [<view> VIEWVRFNAME] */
8813 vrf = argv[idx + 1]->arg;
8814 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
8815 if (argv_find_and_parse_afi(argv, argc, &idx, &afi)) {
8816 argv_find_and_parse_safi(argv, argc, &idx, &safi);
8817 }
8818
8819 if (argv_find(argv, argc, "failed", &idx))
8820 show_failed = true;
8821
8822 bool uj = use_json(argc, argv);
8823
8824 return bgp_show_summary_vty(vty, vrf, afi, safi, show_failed, uj);
8825 }
8826
8827 const char *get_afi_safi_str(afi_t afi, safi_t safi, bool for_json)
8828 {
8829 if (for_json)
8830 return get_afi_safi_json_str(afi, safi);
8831 else
8832 return get_afi_safi_vty_str(afi, safi);
8833 }
8834
8835 /* Show BGP peer's information. */
8836 enum show_type { show_all, show_peer, show_ipv4_all, show_ipv6_all, show_ipv4_peer, show_ipv6_peer };
8837
8838 static void bgp_show_peer_afi_orf_cap(struct vty *vty, struct peer *p,
8839 afi_t afi, safi_t safi,
8840 uint16_t adv_smcap, uint16_t adv_rmcap,
8841 uint16_t rcv_smcap, uint16_t rcv_rmcap,
8842 bool use_json, json_object *json_pref)
8843 {
8844 /* Send-Mode */
8845 if (CHECK_FLAG(p->af_cap[afi][safi], adv_smcap)
8846 || CHECK_FLAG(p->af_cap[afi][safi], rcv_smcap)) {
8847 if (use_json) {
8848 if (CHECK_FLAG(p->af_cap[afi][safi], adv_smcap)
8849 && CHECK_FLAG(p->af_cap[afi][safi], rcv_smcap))
8850 json_object_string_add(json_pref, "sendMode",
8851 "advertisedAndReceived");
8852 else if (CHECK_FLAG(p->af_cap[afi][safi], adv_smcap))
8853 json_object_string_add(json_pref, "sendMode",
8854 "advertised");
8855 else if (CHECK_FLAG(p->af_cap[afi][safi], rcv_smcap))
8856 json_object_string_add(json_pref, "sendMode",
8857 "received");
8858 } else {
8859 vty_out(vty, " Send-mode: ");
8860 if (CHECK_FLAG(p->af_cap[afi][safi], adv_smcap))
8861 vty_out(vty, "advertised");
8862 if (CHECK_FLAG(p->af_cap[afi][safi], rcv_smcap))
8863 vty_out(vty, "%sreceived",
8864 CHECK_FLAG(p->af_cap[afi][safi],
8865 adv_smcap)
8866 ? ", "
8867 : "");
8868 vty_out(vty, "\n");
8869 }
8870 }
8871
8872 /* Receive-Mode */
8873 if (CHECK_FLAG(p->af_cap[afi][safi], adv_rmcap)
8874 || CHECK_FLAG(p->af_cap[afi][safi], rcv_rmcap)) {
8875 if (use_json) {
8876 if (CHECK_FLAG(p->af_cap[afi][safi], adv_rmcap)
8877 && CHECK_FLAG(p->af_cap[afi][safi], rcv_rmcap))
8878 json_object_string_add(json_pref, "recvMode",
8879 "advertisedAndReceived");
8880 else if (CHECK_FLAG(p->af_cap[afi][safi], adv_rmcap))
8881 json_object_string_add(json_pref, "recvMode",
8882 "advertised");
8883 else if (CHECK_FLAG(p->af_cap[afi][safi], rcv_rmcap))
8884 json_object_string_add(json_pref, "recvMode",
8885 "received");
8886 } else {
8887 vty_out(vty, " Receive-mode: ");
8888 if (CHECK_FLAG(p->af_cap[afi][safi], adv_rmcap))
8889 vty_out(vty, "advertised");
8890 if (CHECK_FLAG(p->af_cap[afi][safi], rcv_rmcap))
8891 vty_out(vty, "%sreceived",
8892 CHECK_FLAG(p->af_cap[afi][safi],
8893 adv_rmcap)
8894 ? ", "
8895 : "");
8896 vty_out(vty, "\n");
8897 }
8898 }
8899 }
8900
8901 static void bgp_show_peer_afi(struct vty *vty, struct peer *p, afi_t afi,
8902 safi_t safi, bool use_json,
8903 json_object *json_neigh)
8904 {
8905 struct bgp_filter *filter;
8906 struct peer_af *paf;
8907 char orf_pfx_name[BUFSIZ];
8908 int orf_pfx_count;
8909 json_object *json_af = NULL;
8910 json_object *json_prefA = NULL;
8911 json_object *json_prefB = NULL;
8912 json_object *json_addr = NULL;
8913
8914 if (use_json) {
8915 json_addr = json_object_new_object();
8916 json_af = json_object_new_object();
8917 filter = &p->filter[afi][safi];
8918
8919 if (peer_group_active(p))
8920 json_object_string_add(json_addr, "peerGroupMember",
8921 p->group->name);
8922
8923 paf = peer_af_find(p, afi, safi);
8924 if (paf && PAF_SUBGRP(paf)) {
8925 json_object_int_add(json_addr, "updateGroupId",
8926 PAF_UPDGRP(paf)->id);
8927 json_object_int_add(json_addr, "subGroupId",
8928 PAF_SUBGRP(paf)->id);
8929 json_object_int_add(json_addr, "packetQueueLength",
8930 bpacket_queue_virtual_length(paf));
8931 }
8932
8933 if (CHECK_FLAG(p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
8934 || CHECK_FLAG(p->af_cap[afi][safi],
8935 PEER_CAP_ORF_PREFIX_SM_RCV)
8936 || CHECK_FLAG(p->af_cap[afi][safi],
8937 PEER_CAP_ORF_PREFIX_RM_ADV)
8938 || CHECK_FLAG(p->af_cap[afi][safi],
8939 PEER_CAP_ORF_PREFIX_RM_RCV)) {
8940 json_object_int_add(json_af, "orfType",
8941 ORF_TYPE_PREFIX);
8942 json_prefA = json_object_new_object();
8943 bgp_show_peer_afi_orf_cap(vty, p, afi, safi,
8944 PEER_CAP_ORF_PREFIX_SM_ADV,
8945 PEER_CAP_ORF_PREFIX_RM_ADV,
8946 PEER_CAP_ORF_PREFIX_SM_RCV,
8947 PEER_CAP_ORF_PREFIX_RM_RCV,
8948 use_json, json_prefA);
8949 json_object_object_add(json_af, "orfPrefixList",
8950 json_prefA);
8951 }
8952
8953 if (CHECK_FLAG(p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
8954 || CHECK_FLAG(p->af_cap[afi][safi],
8955 PEER_CAP_ORF_PREFIX_SM_OLD_RCV)
8956 || CHECK_FLAG(p->af_cap[afi][safi],
8957 PEER_CAP_ORF_PREFIX_RM_ADV)
8958 || CHECK_FLAG(p->af_cap[afi][safi],
8959 PEER_CAP_ORF_PREFIX_RM_OLD_RCV)) {
8960 json_object_int_add(json_af, "orfOldType",
8961 ORF_TYPE_PREFIX_OLD);
8962 json_prefB = json_object_new_object();
8963 bgp_show_peer_afi_orf_cap(
8964 vty, p, afi, safi, PEER_CAP_ORF_PREFIX_SM_ADV,
8965 PEER_CAP_ORF_PREFIX_RM_ADV,
8966 PEER_CAP_ORF_PREFIX_SM_OLD_RCV,
8967 PEER_CAP_ORF_PREFIX_RM_OLD_RCV, use_json,
8968 json_prefB);
8969 json_object_object_add(json_af, "orfOldPrefixList",
8970 json_prefB);
8971 }
8972
8973 if (CHECK_FLAG(p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
8974 || CHECK_FLAG(p->af_cap[afi][safi],
8975 PEER_CAP_ORF_PREFIX_SM_RCV)
8976 || CHECK_FLAG(p->af_cap[afi][safi],
8977 PEER_CAP_ORF_PREFIX_SM_OLD_RCV)
8978 || CHECK_FLAG(p->af_cap[afi][safi],
8979 PEER_CAP_ORF_PREFIX_RM_ADV)
8980 || CHECK_FLAG(p->af_cap[afi][safi],
8981 PEER_CAP_ORF_PREFIX_RM_RCV)
8982 || CHECK_FLAG(p->af_cap[afi][safi],
8983 PEER_CAP_ORF_PREFIX_RM_OLD_RCV))
8984 json_object_object_add(json_addr, "afDependentCap",
8985 json_af);
8986 else
8987 json_object_free(json_af);
8988
8989 sprintf(orf_pfx_name, "%s.%d.%d", p->host, afi, safi);
8990 orf_pfx_count = prefix_bgp_show_prefix_list(
8991 NULL, afi, orf_pfx_name, use_json);
8992
8993 if (CHECK_FLAG(p->af_sflags[afi][safi],
8994 PEER_STATUS_ORF_PREFIX_SEND)
8995 || orf_pfx_count) {
8996 if (CHECK_FLAG(p->af_sflags[afi][safi],
8997 PEER_STATUS_ORF_PREFIX_SEND))
8998 json_object_boolean_true_add(json_neigh,
8999 "orfSent");
9000 if (orf_pfx_count)
9001 json_object_int_add(json_addr, "orfRecvCounter",
9002 orf_pfx_count);
9003 }
9004 if (CHECK_FLAG(p->af_sflags[afi][safi],
9005 PEER_STATUS_ORF_WAIT_REFRESH))
9006 json_object_string_add(
9007 json_addr, "orfFirstUpdate",
9008 "deferredUntilORFOrRouteRefreshRecvd");
9009
9010 if (CHECK_FLAG(p->af_flags[afi][safi],
9011 PEER_FLAG_REFLECTOR_CLIENT))
9012 json_object_boolean_true_add(json_addr,
9013 "routeReflectorClient");
9014 if (CHECK_FLAG(p->af_flags[afi][safi],
9015 PEER_FLAG_RSERVER_CLIENT))
9016 json_object_boolean_true_add(json_addr,
9017 "routeServerClient");
9018 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
9019 json_object_boolean_true_add(json_addr,
9020 "inboundSoftConfigPermit");
9021
9022 if (CHECK_FLAG(p->af_flags[afi][safi],
9023 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE))
9024 json_object_boolean_true_add(
9025 json_addr,
9026 "privateAsNumsAllReplacedInUpdatesToNbr");
9027 else if (CHECK_FLAG(p->af_flags[afi][safi],
9028 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE))
9029 json_object_boolean_true_add(
9030 json_addr,
9031 "privateAsNumsReplacedInUpdatesToNbr");
9032 else if (CHECK_FLAG(p->af_flags[afi][safi],
9033 PEER_FLAG_REMOVE_PRIVATE_AS_ALL))
9034 json_object_boolean_true_add(
9035 json_addr,
9036 "privateAsNumsAllRemovedInUpdatesToNbr");
9037 else if (CHECK_FLAG(p->af_flags[afi][safi],
9038 PEER_FLAG_REMOVE_PRIVATE_AS))
9039 json_object_boolean_true_add(
9040 json_addr,
9041 "privateAsNumsRemovedInUpdatesToNbr");
9042
9043 if (p->addpath_type[afi][safi] != BGP_ADDPATH_NONE)
9044 json_object_boolean_true_add(
9045 json_addr,
9046 bgp_addpath_names(p->addpath_type[afi][safi])
9047 ->type_json_name);
9048
9049 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_AS_OVERRIDE))
9050 json_object_string_add(json_addr,
9051 "overrideASNsInOutboundUpdates",
9052 "ifAspathEqualRemoteAs");
9053
9054 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_NEXTHOP_SELF)
9055 || CHECK_FLAG(p->af_flags[afi][safi],
9056 PEER_FLAG_FORCE_NEXTHOP_SELF))
9057 json_object_boolean_true_add(json_addr,
9058 "routerAlwaysNextHop");
9059 if (CHECK_FLAG(p->af_flags[afi][safi],
9060 PEER_FLAG_AS_PATH_UNCHANGED))
9061 json_object_boolean_true_add(
9062 json_addr, "unchangedAsPathPropogatedToNbr");
9063 if (CHECK_FLAG(p->af_flags[afi][safi],
9064 PEER_FLAG_NEXTHOP_UNCHANGED))
9065 json_object_boolean_true_add(
9066 json_addr, "unchangedNextHopPropogatedToNbr");
9067 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_MED_UNCHANGED))
9068 json_object_boolean_true_add(
9069 json_addr, "unchangedMedPropogatedToNbr");
9070 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_SEND_COMMUNITY)
9071 || CHECK_FLAG(p->af_flags[afi][safi],
9072 PEER_FLAG_SEND_EXT_COMMUNITY)) {
9073 if (CHECK_FLAG(p->af_flags[afi][safi],
9074 PEER_FLAG_SEND_COMMUNITY)
9075 && CHECK_FLAG(p->af_flags[afi][safi],
9076 PEER_FLAG_SEND_EXT_COMMUNITY))
9077 json_object_string_add(json_addr,
9078 "commAttriSentToNbr",
9079 "extendedAndStandard");
9080 else if (CHECK_FLAG(p->af_flags[afi][safi],
9081 PEER_FLAG_SEND_EXT_COMMUNITY))
9082 json_object_string_add(json_addr,
9083 "commAttriSentToNbr",
9084 "extended");
9085 else
9086 json_object_string_add(json_addr,
9087 "commAttriSentToNbr",
9088 "standard");
9089 }
9090 if (CHECK_FLAG(p->af_flags[afi][safi],
9091 PEER_FLAG_DEFAULT_ORIGINATE)) {
9092 if (p->default_rmap[afi][safi].name)
9093 json_object_string_add(
9094 json_addr, "defaultRouteMap",
9095 p->default_rmap[afi][safi].name);
9096
9097 if (paf && PAF_SUBGRP(paf)
9098 && CHECK_FLAG(PAF_SUBGRP(paf)->sflags,
9099 SUBGRP_STATUS_DEFAULT_ORIGINATE))
9100 json_object_boolean_true_add(json_addr,
9101 "defaultSent");
9102 else
9103 json_object_boolean_true_add(json_addr,
9104 "defaultNotSent");
9105 }
9106
9107 if (afi == AFI_L2VPN && safi == SAFI_EVPN) {
9108 if (is_evpn_enabled())
9109 json_object_boolean_true_add(
9110 json_addr, "advertiseAllVnis");
9111 }
9112
9113 if (filter->plist[FILTER_IN].name
9114 || filter->dlist[FILTER_IN].name
9115 || filter->aslist[FILTER_IN].name
9116 || filter->map[RMAP_IN].name)
9117 json_object_boolean_true_add(json_addr,
9118 "inboundPathPolicyConfig");
9119 if (filter->plist[FILTER_OUT].name
9120 || filter->dlist[FILTER_OUT].name
9121 || filter->aslist[FILTER_OUT].name
9122 || filter->map[RMAP_OUT].name || filter->usmap.name)
9123 json_object_boolean_true_add(
9124 json_addr, "outboundPathPolicyConfig");
9125
9126 /* prefix-list */
9127 if (filter->plist[FILTER_IN].name)
9128 json_object_string_add(json_addr,
9129 "incomingUpdatePrefixFilterList",
9130 filter->plist[FILTER_IN].name);
9131 if (filter->plist[FILTER_OUT].name)
9132 json_object_string_add(json_addr,
9133 "outgoingUpdatePrefixFilterList",
9134 filter->plist[FILTER_OUT].name);
9135
9136 /* distribute-list */
9137 if (filter->dlist[FILTER_IN].name)
9138 json_object_string_add(
9139 json_addr, "incomingUpdateNetworkFilterList",
9140 filter->dlist[FILTER_IN].name);
9141 if (filter->dlist[FILTER_OUT].name)
9142 json_object_string_add(
9143 json_addr, "outgoingUpdateNetworkFilterList",
9144 filter->dlist[FILTER_OUT].name);
9145
9146 /* filter-list. */
9147 if (filter->aslist[FILTER_IN].name)
9148 json_object_string_add(json_addr,
9149 "incomingUpdateAsPathFilterList",
9150 filter->aslist[FILTER_IN].name);
9151 if (filter->aslist[FILTER_OUT].name)
9152 json_object_string_add(json_addr,
9153 "outgoingUpdateAsPathFilterList",
9154 filter->aslist[FILTER_OUT].name);
9155
9156 /* route-map. */
9157 if (filter->map[RMAP_IN].name)
9158 json_object_string_add(
9159 json_addr, "routeMapForIncomingAdvertisements",
9160 filter->map[RMAP_IN].name);
9161 if (filter->map[RMAP_OUT].name)
9162 json_object_string_add(
9163 json_addr, "routeMapForOutgoingAdvertisements",
9164 filter->map[RMAP_OUT].name);
9165
9166 /* ebgp-requires-policy (inbound) */
9167 if (p->bgp->ebgp_requires_policy == DEFAULT_EBGP_POLICY_ENABLED
9168 && !bgp_inbound_policy_exists(p, filter))
9169 json_object_string_add(
9170 json_addr, "inboundEbgpRequiresPolicy",
9171 "Inbound updates discarded due to missing policy");
9172
9173 /* ebgp-requires-policy (outbound) */
9174 if (p->bgp->ebgp_requires_policy == DEFAULT_EBGP_POLICY_ENABLED
9175 && (!bgp_outbound_policy_exists(p, filter)))
9176 json_object_string_add(
9177 json_addr, "outboundEbgpRequiresPolicy",
9178 "Outbound updates discarded due to missing policy");
9179
9180 /* unsuppress-map */
9181 if (filter->usmap.name)
9182 json_object_string_add(json_addr,
9183 "selectiveUnsuppressRouteMap",
9184 filter->usmap.name);
9185
9186 /* Receive prefix count */
9187 json_object_int_add(json_addr, "acceptedPrefixCounter",
9188 p->pcount[afi][safi]);
9189 if (paf && PAF_SUBGRP(paf))
9190 json_object_int_add(json_addr, "sentPrefixCounter",
9191 (PAF_SUBGRP(paf))->scount);
9192
9193 /* Maximum prefix */
9194 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX)) {
9195 json_object_int_add(json_addr, "prefixAllowedMax",
9196 p->pmax[afi][safi]);
9197 if (CHECK_FLAG(p->af_flags[afi][safi],
9198 PEER_FLAG_MAX_PREFIX_WARNING))
9199 json_object_boolean_true_add(
9200 json_addr, "prefixAllowedMaxWarning");
9201 json_object_int_add(json_addr,
9202 "prefixAllowedWarningThresh",
9203 p->pmax_threshold[afi][safi]);
9204 if (p->pmax_restart[afi][safi])
9205 json_object_int_add(
9206 json_addr,
9207 "prefixAllowedRestartIntervalMsecs",
9208 p->pmax_restart[afi][safi] * 60000);
9209 }
9210 json_object_object_add(json_neigh, get_afi_safi_str(afi, safi, true),
9211 json_addr);
9212
9213 } else {
9214 filter = &p->filter[afi][safi];
9215
9216 vty_out(vty, " For address family: %s\n",
9217 get_afi_safi_str(afi, safi, false));
9218
9219 if (peer_group_active(p))
9220 vty_out(vty, " %s peer-group member\n",
9221 p->group->name);
9222
9223 paf = peer_af_find(p, afi, safi);
9224 if (paf && PAF_SUBGRP(paf)) {
9225 vty_out(vty, " Update group %" PRIu64
9226 ", subgroup %" PRIu64 "\n",
9227 PAF_UPDGRP(paf)->id, PAF_SUBGRP(paf)->id);
9228 vty_out(vty, " Packet Queue length %d\n",
9229 bpacket_queue_virtual_length(paf));
9230 } else {
9231 vty_out(vty, " Not part of any update group\n");
9232 }
9233 if (CHECK_FLAG(p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
9234 || CHECK_FLAG(p->af_cap[afi][safi],
9235 PEER_CAP_ORF_PREFIX_SM_RCV)
9236 || CHECK_FLAG(p->af_cap[afi][safi],
9237 PEER_CAP_ORF_PREFIX_SM_OLD_RCV)
9238 || CHECK_FLAG(p->af_cap[afi][safi],
9239 PEER_CAP_ORF_PREFIX_RM_ADV)
9240 || CHECK_FLAG(p->af_cap[afi][safi],
9241 PEER_CAP_ORF_PREFIX_RM_RCV)
9242 || CHECK_FLAG(p->af_cap[afi][safi],
9243 PEER_CAP_ORF_PREFIX_RM_OLD_RCV))
9244 vty_out(vty, " AF-dependant capabilities:\n");
9245
9246 if (CHECK_FLAG(p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
9247 || CHECK_FLAG(p->af_cap[afi][safi],
9248 PEER_CAP_ORF_PREFIX_SM_RCV)
9249 || CHECK_FLAG(p->af_cap[afi][safi],
9250 PEER_CAP_ORF_PREFIX_RM_ADV)
9251 || CHECK_FLAG(p->af_cap[afi][safi],
9252 PEER_CAP_ORF_PREFIX_RM_RCV)) {
9253 vty_out(vty,
9254 " Outbound Route Filter (ORF) type (%d) Prefix-list:\n",
9255 ORF_TYPE_PREFIX);
9256 bgp_show_peer_afi_orf_cap(
9257 vty, p, afi, safi, PEER_CAP_ORF_PREFIX_SM_ADV,
9258 PEER_CAP_ORF_PREFIX_RM_ADV,
9259 PEER_CAP_ORF_PREFIX_SM_RCV,
9260 PEER_CAP_ORF_PREFIX_RM_RCV, use_json, NULL);
9261 }
9262 if (CHECK_FLAG(p->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
9263 || CHECK_FLAG(p->af_cap[afi][safi],
9264 PEER_CAP_ORF_PREFIX_SM_OLD_RCV)
9265 || CHECK_FLAG(p->af_cap[afi][safi],
9266 PEER_CAP_ORF_PREFIX_RM_ADV)
9267 || CHECK_FLAG(p->af_cap[afi][safi],
9268 PEER_CAP_ORF_PREFIX_RM_OLD_RCV)) {
9269 vty_out(vty,
9270 " Outbound Route Filter (ORF) type (%d) Prefix-list:\n",
9271 ORF_TYPE_PREFIX_OLD);
9272 bgp_show_peer_afi_orf_cap(
9273 vty, p, afi, safi, PEER_CAP_ORF_PREFIX_SM_ADV,
9274 PEER_CAP_ORF_PREFIX_RM_ADV,
9275 PEER_CAP_ORF_PREFIX_SM_OLD_RCV,
9276 PEER_CAP_ORF_PREFIX_RM_OLD_RCV, use_json, NULL);
9277 }
9278
9279 sprintf(orf_pfx_name, "%s.%d.%d", p->host, afi, safi);
9280 orf_pfx_count = prefix_bgp_show_prefix_list(
9281 NULL, afi, orf_pfx_name, use_json);
9282
9283 if (CHECK_FLAG(p->af_sflags[afi][safi],
9284 PEER_STATUS_ORF_PREFIX_SEND)
9285 || orf_pfx_count) {
9286 vty_out(vty, " Outbound Route Filter (ORF):");
9287 if (CHECK_FLAG(p->af_sflags[afi][safi],
9288 PEER_STATUS_ORF_PREFIX_SEND))
9289 vty_out(vty, " sent;");
9290 if (orf_pfx_count)
9291 vty_out(vty, " received (%d entries)",
9292 orf_pfx_count);
9293 vty_out(vty, "\n");
9294 }
9295 if (CHECK_FLAG(p->af_sflags[afi][safi],
9296 PEER_STATUS_ORF_WAIT_REFRESH))
9297 vty_out(vty,
9298 " First update is deferred until ORF or ROUTE-REFRESH is received\n");
9299
9300 if (CHECK_FLAG(p->af_flags[afi][safi],
9301 PEER_FLAG_REFLECTOR_CLIENT))
9302 vty_out(vty, " Route-Reflector Client\n");
9303 if (CHECK_FLAG(p->af_flags[afi][safi],
9304 PEER_FLAG_RSERVER_CLIENT))
9305 vty_out(vty, " Route-Server Client\n");
9306 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
9307 vty_out(vty,
9308 " Inbound soft reconfiguration allowed\n");
9309
9310 if (CHECK_FLAG(p->af_flags[afi][safi],
9311 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE))
9312 vty_out(vty,
9313 " Private AS numbers (all) replaced in updates to this neighbor\n");
9314 else if (CHECK_FLAG(p->af_flags[afi][safi],
9315 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE))
9316 vty_out(vty,
9317 " Private AS numbers replaced in updates to this neighbor\n");
9318 else if (CHECK_FLAG(p->af_flags[afi][safi],
9319 PEER_FLAG_REMOVE_PRIVATE_AS_ALL))
9320 vty_out(vty,
9321 " Private AS numbers (all) removed in updates to this neighbor\n");
9322 else if (CHECK_FLAG(p->af_flags[afi][safi],
9323 PEER_FLAG_REMOVE_PRIVATE_AS))
9324 vty_out(vty,
9325 " Private AS numbers removed in updates to this neighbor\n");
9326
9327 if (p->addpath_type[afi][safi] != BGP_ADDPATH_NONE)
9328 vty_out(vty, " %s\n",
9329 bgp_addpath_names(p->addpath_type[afi][safi])
9330 ->human_description);
9331
9332 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_AS_OVERRIDE))
9333 vty_out(vty,
9334 " Override ASNs in outbound updates if aspath equals remote-as\n");
9335
9336 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_NEXTHOP_SELF)
9337 || CHECK_FLAG(p->af_flags[afi][safi],
9338 PEER_FLAG_FORCE_NEXTHOP_SELF))
9339 vty_out(vty, " NEXT_HOP is always this router\n");
9340 if (CHECK_FLAG(p->af_flags[afi][safi],
9341 PEER_FLAG_AS_PATH_UNCHANGED))
9342 vty_out(vty,
9343 " AS_PATH is propagated unchanged to this neighbor\n");
9344 if (CHECK_FLAG(p->af_flags[afi][safi],
9345 PEER_FLAG_NEXTHOP_UNCHANGED))
9346 vty_out(vty,
9347 " NEXT_HOP is propagated unchanged to this neighbor\n");
9348 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_MED_UNCHANGED))
9349 vty_out(vty,
9350 " MED is propagated unchanged to this neighbor\n");
9351 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_SEND_COMMUNITY)
9352 || CHECK_FLAG(p->af_flags[afi][safi],
9353 PEER_FLAG_SEND_EXT_COMMUNITY)
9354 || CHECK_FLAG(p->af_flags[afi][safi],
9355 PEER_FLAG_SEND_LARGE_COMMUNITY)) {
9356 vty_out(vty,
9357 " Community attribute sent to this neighbor");
9358 if (CHECK_FLAG(p->af_flags[afi][safi],
9359 PEER_FLAG_SEND_COMMUNITY)
9360 && CHECK_FLAG(p->af_flags[afi][safi],
9361 PEER_FLAG_SEND_EXT_COMMUNITY)
9362 && CHECK_FLAG(p->af_flags[afi][safi],
9363 PEER_FLAG_SEND_LARGE_COMMUNITY))
9364 vty_out(vty, "(all)\n");
9365 else if (CHECK_FLAG(p->af_flags[afi][safi],
9366 PEER_FLAG_SEND_LARGE_COMMUNITY))
9367 vty_out(vty, "(large)\n");
9368 else if (CHECK_FLAG(p->af_flags[afi][safi],
9369 PEER_FLAG_SEND_EXT_COMMUNITY))
9370 vty_out(vty, "(extended)\n");
9371 else
9372 vty_out(vty, "(standard)\n");
9373 }
9374 if (CHECK_FLAG(p->af_flags[afi][safi],
9375 PEER_FLAG_DEFAULT_ORIGINATE)) {
9376 vty_out(vty, " Default information originate,");
9377
9378 if (p->default_rmap[afi][safi].name)
9379 vty_out(vty, " default route-map %s%s,",
9380 p->default_rmap[afi][safi].map ? "*"
9381 : "",
9382 p->default_rmap[afi][safi].name);
9383 if (paf && PAF_SUBGRP(paf)
9384 && CHECK_FLAG(PAF_SUBGRP(paf)->sflags,
9385 SUBGRP_STATUS_DEFAULT_ORIGINATE))
9386 vty_out(vty, " default sent\n");
9387 else
9388 vty_out(vty, " default not sent\n");
9389 }
9390
9391 /* advertise-vni-all */
9392 if (afi == AFI_L2VPN && safi == SAFI_EVPN) {
9393 if (is_evpn_enabled())
9394 vty_out(vty, " advertise-all-vni\n");
9395 }
9396
9397 if (filter->plist[FILTER_IN].name
9398 || filter->dlist[FILTER_IN].name
9399 || filter->aslist[FILTER_IN].name
9400 || filter->map[RMAP_IN].name)
9401 vty_out(vty, " Inbound path policy configured\n");
9402 if (filter->plist[FILTER_OUT].name
9403 || filter->dlist[FILTER_OUT].name
9404 || filter->aslist[FILTER_OUT].name
9405 || filter->map[RMAP_OUT].name || filter->usmap.name)
9406 vty_out(vty, " Outbound path policy configured\n");
9407
9408 /* prefix-list */
9409 if (filter->plist[FILTER_IN].name)
9410 vty_out(vty,
9411 " Incoming update prefix filter list is %s%s\n",
9412 filter->plist[FILTER_IN].plist ? "*" : "",
9413 filter->plist[FILTER_IN].name);
9414 if (filter->plist[FILTER_OUT].name)
9415 vty_out(vty,
9416 " Outgoing update prefix filter list is %s%s\n",
9417 filter->plist[FILTER_OUT].plist ? "*" : "",
9418 filter->plist[FILTER_OUT].name);
9419
9420 /* distribute-list */
9421 if (filter->dlist[FILTER_IN].name)
9422 vty_out(vty,
9423 " Incoming update network filter list is %s%s\n",
9424 filter->dlist[FILTER_IN].alist ? "*" : "",
9425 filter->dlist[FILTER_IN].name);
9426 if (filter->dlist[FILTER_OUT].name)
9427 vty_out(vty,
9428 " Outgoing update network filter list is %s%s\n",
9429 filter->dlist[FILTER_OUT].alist ? "*" : "",
9430 filter->dlist[FILTER_OUT].name);
9431
9432 /* filter-list. */
9433 if (filter->aslist[FILTER_IN].name)
9434 vty_out(vty,
9435 " Incoming update AS path filter list is %s%s\n",
9436 filter->aslist[FILTER_IN].aslist ? "*" : "",
9437 filter->aslist[FILTER_IN].name);
9438 if (filter->aslist[FILTER_OUT].name)
9439 vty_out(vty,
9440 " Outgoing update AS path filter list is %s%s\n",
9441 filter->aslist[FILTER_OUT].aslist ? "*" : "",
9442 filter->aslist[FILTER_OUT].name);
9443
9444 /* route-map. */
9445 if (filter->map[RMAP_IN].name)
9446 vty_out(vty,
9447 " Route map for incoming advertisements is %s%s\n",
9448 filter->map[RMAP_IN].map ? "*" : "",
9449 filter->map[RMAP_IN].name);
9450 if (filter->map[RMAP_OUT].name)
9451 vty_out(vty,
9452 " Route map for outgoing advertisements is %s%s\n",
9453 filter->map[RMAP_OUT].map ? "*" : "",
9454 filter->map[RMAP_OUT].name);
9455
9456 /* ebgp-requires-policy (inbound) */
9457 if (p->bgp->ebgp_requires_policy == DEFAULT_EBGP_POLICY_ENABLED
9458 && !bgp_inbound_policy_exists(p, filter))
9459 vty_out(vty,
9460 " Inbound updates discarded due to missing policy\n");
9461
9462 /* ebgp-requires-policy (outbound) */
9463 if (p->bgp->ebgp_requires_policy == DEFAULT_EBGP_POLICY_ENABLED
9464 && !bgp_outbound_policy_exists(p, filter))
9465 vty_out(vty,
9466 " Outbound updates discarded due to missing policy\n");
9467
9468 /* unsuppress-map */
9469 if (filter->usmap.name)
9470 vty_out(vty,
9471 " Route map for selective unsuppress is %s%s\n",
9472 filter->usmap.map ? "*" : "",
9473 filter->usmap.name);
9474
9475 /* Receive prefix count */
9476 vty_out(vty, " %" PRIu32 " accepted prefixes\n",
9477 p->pcount[afi][safi]);
9478
9479 /* Maximum prefix */
9480 if (CHECK_FLAG(p->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX)) {
9481 vty_out(vty,
9482 " Maximum prefixes allowed %" PRIu32 "%s\n",
9483 p->pmax[afi][safi],
9484 CHECK_FLAG(p->af_flags[afi][safi],
9485 PEER_FLAG_MAX_PREFIX_WARNING)
9486 ? " (warning-only)"
9487 : "");
9488 vty_out(vty, " Threshold for warning message %d%%",
9489 p->pmax_threshold[afi][safi]);
9490 if (p->pmax_restart[afi][safi])
9491 vty_out(vty, ", restart interval %d min",
9492 p->pmax_restart[afi][safi]);
9493 vty_out(vty, "\n");
9494 }
9495
9496 vty_out(vty, "\n");
9497 }
9498 }
9499
9500 static void bgp_show_peer(struct vty *vty, struct peer *p, bool use_json,
9501 json_object *json)
9502 {
9503 struct bgp *bgp;
9504 char buf1[PREFIX2STR_BUFFER], buf[SU_ADDRSTRLEN];
9505 char timebuf[BGP_UPTIME_LEN];
9506 char dn_flag[2];
9507 afi_t afi;
9508 safi_t safi;
9509 uint16_t i;
9510 uint8_t *msg;
9511 json_object *json_neigh = NULL;
9512 time_t epoch_tbuf;
9513
9514 bgp = p->bgp;
9515
9516 if (use_json)
9517 json_neigh = json_object_new_object();
9518
9519 memset(dn_flag, '\0', sizeof(dn_flag));
9520 if (!p->conf_if && peer_dynamic_neighbor(p))
9521 dn_flag[0] = '*';
9522
9523 if (!use_json) {
9524 if (p->conf_if) /* Configured interface name. */
9525 vty_out(vty, "BGP neighbor on %s: %s, ", p->conf_if,
9526 BGP_PEER_SU_UNSPEC(p)
9527 ? "None"
9528 : sockunion2str(&p->su, buf,
9529 SU_ADDRSTRLEN));
9530 else /* Configured IP address. */
9531 vty_out(vty, "BGP neighbor is %s%s, ", dn_flag,
9532 p->host);
9533 }
9534
9535 if (use_json) {
9536 if (p->conf_if && BGP_PEER_SU_UNSPEC(p))
9537 json_object_string_add(json_neigh, "bgpNeighborAddr",
9538 "none");
9539 else if (p->conf_if && !BGP_PEER_SU_UNSPEC(p))
9540 json_object_string_add(
9541 json_neigh, "bgpNeighborAddr",
9542 sockunion2str(&p->su, buf, SU_ADDRSTRLEN));
9543
9544 json_object_int_add(json_neigh, "remoteAs", p->as);
9545
9546 if (p->change_local_as)
9547 json_object_int_add(json_neigh, "localAs",
9548 p->change_local_as);
9549 else
9550 json_object_int_add(json_neigh, "localAs", p->local_as);
9551
9552 if (CHECK_FLAG(p->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND))
9553 json_object_boolean_true_add(json_neigh,
9554 "localAsNoPrepend");
9555
9556 if (CHECK_FLAG(p->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS))
9557 json_object_boolean_true_add(json_neigh,
9558 "localAsReplaceAs");
9559 } else {
9560 if ((p->as_type == AS_SPECIFIED) || (p->as_type == AS_EXTERNAL)
9561 || (p->as_type == AS_INTERNAL))
9562 vty_out(vty, "remote AS %u, ", p->as);
9563 else
9564 vty_out(vty, "remote AS Unspecified, ");
9565 vty_out(vty, "local AS %u%s%s, ",
9566 p->change_local_as ? p->change_local_as : p->local_as,
9567 CHECK_FLAG(p->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND)
9568 ? " no-prepend"
9569 : "",
9570 CHECK_FLAG(p->flags, PEER_FLAG_LOCAL_AS_REPLACE_AS)
9571 ? " replace-as"
9572 : "");
9573 }
9574 /* peer type internal or confed-internal */
9575 if ((p->as == p->local_as) || (p->as_type == AS_INTERNAL)) {
9576 if (use_json) {
9577 if (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION))
9578 json_object_boolean_true_add(
9579 json_neigh, "nbrConfedInternalLink");
9580 else
9581 json_object_boolean_true_add(json_neigh,
9582 "nbrInternalLink");
9583 } else {
9584 if (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION))
9585 vty_out(vty, "confed-internal link\n");
9586 else
9587 vty_out(vty, "internal link\n");
9588 }
9589 /* peer type external or confed-external */
9590 } else if (p->as || (p->as_type == AS_EXTERNAL)) {
9591 if (use_json) {
9592 if (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION))
9593 json_object_boolean_true_add(
9594 json_neigh, "nbrConfedExternalLink");
9595 else
9596 json_object_boolean_true_add(json_neigh,
9597 "nbrExternalLink");
9598 } else {
9599 if (bgp_confederation_peers_check(bgp, p->as))
9600 vty_out(vty, "confed-external link\n");
9601 else
9602 vty_out(vty, "external link\n");
9603 }
9604 } else {
9605 if (use_json)
9606 json_object_boolean_true_add(json_neigh,
9607 "nbrUnspecifiedLink");
9608 else
9609 vty_out(vty, "unspecified link\n");
9610 }
9611
9612 /* Description. */
9613 if (p->desc) {
9614 if (use_json)
9615 json_object_string_add(json_neigh, "nbrDesc", p->desc);
9616 else
9617 vty_out(vty, " Description: %s\n", p->desc);
9618 }
9619
9620 if (p->hostname) {
9621 if (use_json) {
9622 if (p->hostname)
9623 json_object_string_add(json_neigh, "hostname",
9624 p->hostname);
9625
9626 if (p->domainname)
9627 json_object_string_add(json_neigh, "domainname",
9628 p->domainname);
9629 } else {
9630 if (p->domainname && (p->domainname[0] != '\0'))
9631 vty_out(vty, "Hostname: %s.%s\n", p->hostname,
9632 p->domainname);
9633 else
9634 vty_out(vty, "Hostname: %s\n", p->hostname);
9635 }
9636 }
9637
9638 /* Peer-group */
9639 if (p->group) {
9640 if (use_json) {
9641 json_object_string_add(json_neigh, "peerGroup",
9642 p->group->name);
9643
9644 if (dn_flag[0]) {
9645 struct prefix prefix, *range = NULL;
9646
9647 sockunion2hostprefix(&(p->su), &prefix);
9648 range = peer_group_lookup_dynamic_neighbor_range(
9649 p->group, &prefix);
9650
9651 if (range) {
9652 prefix2str(range, buf1, sizeof(buf1));
9653 json_object_string_add(
9654 json_neigh,
9655 "peerSubnetRangeGroup", buf1);
9656 }
9657 }
9658 } else {
9659 vty_out(vty,
9660 " Member of peer-group %s for session parameters\n",
9661 p->group->name);
9662
9663 if (dn_flag[0]) {
9664 struct prefix prefix, *range = NULL;
9665
9666 sockunion2hostprefix(&(p->su), &prefix);
9667 range = peer_group_lookup_dynamic_neighbor_range(
9668 p->group, &prefix);
9669
9670 if (range) {
9671 prefix2str(range, buf1, sizeof(buf1));
9672 vty_out(vty,
9673 " Belongs to the subnet range group: %s\n",
9674 buf1);
9675 }
9676 }
9677 }
9678 }
9679
9680 if (use_json) {
9681 /* Administrative shutdown. */
9682 if (CHECK_FLAG(p->flags, PEER_FLAG_SHUTDOWN))
9683 json_object_boolean_true_add(json_neigh,
9684 "adminShutDown");
9685
9686 /* BGP Version. */
9687 json_object_int_add(json_neigh, "bgpVersion", 4);
9688 json_object_string_add(
9689 json_neigh, "remoteRouterId",
9690 inet_ntop(AF_INET, &p->remote_id, buf1, sizeof(buf1)));
9691 json_object_string_add(
9692 json_neigh, "localRouterId",
9693 inet_ntop(AF_INET, &bgp->router_id, buf1,
9694 sizeof(buf1)));
9695
9696 /* Confederation */
9697 if (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION)
9698 && bgp_confederation_peers_check(bgp, p->as))
9699 json_object_boolean_true_add(json_neigh,
9700 "nbrCommonAdmin");
9701
9702 /* Status. */
9703 json_object_string_add(
9704 json_neigh, "bgpState",
9705 lookup_msg(bgp_status_msg, p->status, NULL));
9706
9707 if (p->status == Established) {
9708 time_t uptime;
9709
9710 uptime = bgp_clock();
9711 uptime -= p->uptime;
9712 epoch_tbuf = time(NULL) - uptime;
9713
9714 json_object_int_add(json_neigh, "bgpTimerUpMsec",
9715 uptime * 1000);
9716 json_object_string_add(json_neigh, "bgpTimerUpString",
9717 peer_uptime(p->uptime, timebuf,
9718 BGP_UPTIME_LEN, 0,
9719 NULL));
9720 json_object_int_add(json_neigh,
9721 "bgpTimerUpEstablishedEpoch",
9722 epoch_tbuf);
9723 }
9724
9725 else if (p->status == Active) {
9726 if (CHECK_FLAG(p->flags, PEER_FLAG_PASSIVE))
9727 json_object_string_add(json_neigh, "bgpStateIs",
9728 "passive");
9729 else if (CHECK_FLAG(p->sflags, PEER_STATUS_NSF_WAIT))
9730 json_object_string_add(json_neigh, "bgpStateIs",
9731 "passiveNSF");
9732 }
9733
9734 /* read timer */
9735 time_t uptime;
9736 struct tm *tm;
9737
9738 uptime = bgp_clock();
9739 uptime -= p->readtime;
9740 tm = gmtime(&uptime);
9741 json_object_int_add(json_neigh, "bgpTimerLastRead",
9742 (tm->tm_sec * 1000) + (tm->tm_min * 60000)
9743 + (tm->tm_hour * 3600000));
9744
9745 uptime = bgp_clock();
9746 uptime -= p->last_write;
9747 tm = gmtime(&uptime);
9748 json_object_int_add(json_neigh, "bgpTimerLastWrite",
9749 (tm->tm_sec * 1000) + (tm->tm_min * 60000)
9750 + (tm->tm_hour * 3600000));
9751
9752 uptime = bgp_clock();
9753 uptime -= p->update_time;
9754 tm = gmtime(&uptime);
9755 json_object_int_add(json_neigh, "bgpInUpdateElapsedTimeMsecs",
9756 (tm->tm_sec * 1000) + (tm->tm_min * 60000)
9757 + (tm->tm_hour * 3600000));
9758
9759 /* Configured timer values. */
9760 json_object_int_add(json_neigh, "bgpTimerHoldTimeMsecs",
9761 p->v_holdtime * 1000);
9762 json_object_int_add(json_neigh,
9763 "bgpTimerKeepAliveIntervalMsecs",
9764 p->v_keepalive * 1000);
9765 if (CHECK_FLAG(p->flags, PEER_FLAG_TIMER)) {
9766 json_object_int_add(json_neigh,
9767 "bgpTimerConfiguredHoldTimeMsecs",
9768 p->holdtime * 1000);
9769 json_object_int_add(
9770 json_neigh,
9771 "bgpTimerConfiguredKeepAliveIntervalMsecs",
9772 p->keepalive * 1000);
9773 } else if ((bgp->default_holdtime != SAVE_BGP_HOLDTIME)
9774 || (bgp->default_keepalive != SAVE_BGP_KEEPALIVE)) {
9775 json_object_int_add(json_neigh,
9776 "bgpTimerConfiguredHoldTimeMsecs",
9777 bgp->default_holdtime);
9778 json_object_int_add(
9779 json_neigh,
9780 "bgpTimerConfiguredKeepAliveIntervalMsecs",
9781 bgp->default_keepalive);
9782 }
9783 } else {
9784 /* Administrative shutdown. */
9785 if (CHECK_FLAG(p->flags, PEER_FLAG_SHUTDOWN))
9786 vty_out(vty, " Administratively shut down\n");
9787
9788 /* BGP Version. */
9789 vty_out(vty, " BGP version 4");
9790 vty_out(vty, ", remote router ID %s",
9791 inet_ntop(AF_INET, &p->remote_id, buf1, sizeof(buf1)));
9792 vty_out(vty, ", local router ID %s\n",
9793 inet_ntop(AF_INET, &bgp->router_id, buf1,
9794 sizeof(buf1)));
9795
9796 /* Confederation */
9797 if (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION)
9798 && bgp_confederation_peers_check(bgp, p->as))
9799 vty_out(vty,
9800 " Neighbor under common administration\n");
9801
9802 /* Status. */
9803 vty_out(vty, " BGP state = %s",
9804 lookup_msg(bgp_status_msg, p->status, NULL));
9805
9806 if (p->status == Established)
9807 vty_out(vty, ", up for %8s",
9808 peer_uptime(p->uptime, timebuf, BGP_UPTIME_LEN,
9809 0, NULL));
9810
9811 else if (p->status == Active) {
9812 if (CHECK_FLAG(p->flags, PEER_FLAG_PASSIVE))
9813 vty_out(vty, " (passive)");
9814 else if (CHECK_FLAG(p->sflags, PEER_STATUS_NSF_WAIT))
9815 vty_out(vty, " (NSF passive)");
9816 }
9817 vty_out(vty, "\n");
9818
9819 /* read timer */
9820 vty_out(vty, " Last read %s",
9821 peer_uptime(p->readtime, timebuf, BGP_UPTIME_LEN, 0,
9822 NULL));
9823 vty_out(vty, ", Last write %s\n",
9824 peer_uptime(p->last_write, timebuf, BGP_UPTIME_LEN, 0,
9825 NULL));
9826
9827 /* Configured timer values. */
9828 vty_out(vty,
9829 " Hold time is %d, keepalive interval is %d seconds\n",
9830 p->v_holdtime, p->v_keepalive);
9831 if (CHECK_FLAG(p->flags, PEER_FLAG_TIMER)) {
9832 vty_out(vty, " Configured hold time is %d",
9833 p->holdtime);
9834 vty_out(vty, ", keepalive interval is %d seconds\n",
9835 p->keepalive);
9836 } else if ((bgp->default_holdtime != SAVE_BGP_HOLDTIME)
9837 || (bgp->default_keepalive != SAVE_BGP_KEEPALIVE)) {
9838 vty_out(vty, " Configured hold time is %d",
9839 bgp->default_holdtime);
9840 vty_out(vty, ", keepalive interval is %d seconds\n",
9841 bgp->default_keepalive);
9842 }
9843 }
9844 /* Capability. */
9845 if (p->status == Established) {
9846 if (p->cap || p->afc_adv[AFI_IP][SAFI_UNICAST]
9847 || p->afc_recv[AFI_IP][SAFI_UNICAST]
9848 || p->afc_adv[AFI_IP][SAFI_MULTICAST]
9849 || p->afc_recv[AFI_IP][SAFI_MULTICAST]
9850 || p->afc_adv[AFI_IP6][SAFI_UNICAST]
9851 || p->afc_recv[AFI_IP6][SAFI_UNICAST]
9852 || p->afc_adv[AFI_IP6][SAFI_MULTICAST]
9853 || p->afc_recv[AFI_IP6][SAFI_MULTICAST]
9854 || p->afc_adv[AFI_IP6][SAFI_MPLS_VPN]
9855 || p->afc_recv[AFI_IP6][SAFI_MPLS_VPN]
9856 || p->afc_adv[AFI_IP6][SAFI_ENCAP]
9857 || p->afc_recv[AFI_IP6][SAFI_ENCAP]
9858 || p->afc_adv[AFI_IP6][SAFI_FLOWSPEC]
9859 || p->afc_recv[AFI_IP6][SAFI_FLOWSPEC]
9860 || p->afc_adv[AFI_IP][SAFI_ENCAP]
9861 || p->afc_recv[AFI_IP][SAFI_ENCAP]
9862 || p->afc_adv[AFI_IP][SAFI_FLOWSPEC]
9863 || p->afc_recv[AFI_IP][SAFI_FLOWSPEC]
9864 || p->afc_adv[AFI_IP][SAFI_MPLS_VPN]
9865 || p->afc_recv[AFI_IP][SAFI_MPLS_VPN]) {
9866 if (use_json) {
9867 json_object *json_cap = NULL;
9868
9869 json_cap = json_object_new_object();
9870
9871 /* AS4 */
9872 if (CHECK_FLAG(p->cap, PEER_CAP_AS4_RCV)
9873 || CHECK_FLAG(p->cap, PEER_CAP_AS4_ADV)) {
9874 if (CHECK_FLAG(p->cap, PEER_CAP_AS4_ADV)
9875 && CHECK_FLAG(p->cap,
9876 PEER_CAP_AS4_RCV))
9877 json_object_string_add(
9878 json_cap, "4byteAs",
9879 "advertisedAndReceived");
9880 else if (CHECK_FLAG(p->cap,
9881 PEER_CAP_AS4_ADV))
9882 json_object_string_add(
9883 json_cap, "4byteAs",
9884 "advertised");
9885 else if (CHECK_FLAG(p->cap,
9886 PEER_CAP_AS4_RCV))
9887 json_object_string_add(
9888 json_cap, "4byteAs",
9889 "received");
9890 }
9891
9892 /* AddPath */
9893 if (CHECK_FLAG(p->cap, PEER_CAP_ADDPATH_RCV)
9894 || CHECK_FLAG(p->cap,
9895 PEER_CAP_ADDPATH_ADV)) {
9896 json_object *json_add = NULL;
9897 const char *print_store;
9898
9899 json_add = json_object_new_object();
9900
9901 FOREACH_AFI_SAFI (afi, safi) {
9902 json_object *json_sub = NULL;
9903 json_sub =
9904 json_object_new_object();
9905 print_store = get_afi_safi_str(
9906 afi, safi, true);
9907
9908 if (CHECK_FLAG(
9909 p->af_cap[afi]
9910 [safi],
9911 PEER_CAP_ADDPATH_AF_TX_ADV)
9912 || CHECK_FLAG(
9913 p->af_cap[afi]
9914 [safi],
9915 PEER_CAP_ADDPATH_AF_TX_RCV)) {
9916 if (CHECK_FLAG(
9917 p->af_cap
9918 [afi]
9919 [safi],
9920 PEER_CAP_ADDPATH_AF_TX_ADV)
9921 && CHECK_FLAG(
9922 p->af_cap
9923 [afi]
9924 [safi],
9925 PEER_CAP_ADDPATH_AF_TX_RCV))
9926 json_object_boolean_true_add(
9927 json_sub,
9928 "txAdvertisedAndReceived");
9929 else if (
9930 CHECK_FLAG(
9931 p->af_cap
9932 [afi]
9933 [safi],
9934 PEER_CAP_ADDPATH_AF_TX_ADV))
9935 json_object_boolean_true_add(
9936 json_sub,
9937 "txAdvertised");
9938 else if (
9939 CHECK_FLAG(
9940 p->af_cap
9941 [afi]
9942 [safi],
9943 PEER_CAP_ADDPATH_AF_TX_RCV))
9944 json_object_boolean_true_add(
9945 json_sub,
9946 "txReceived");
9947 }
9948
9949 if (CHECK_FLAG(
9950 p->af_cap[afi]
9951 [safi],
9952 PEER_CAP_ADDPATH_AF_RX_ADV)
9953 || CHECK_FLAG(
9954 p->af_cap[afi]
9955 [safi],
9956 PEER_CAP_ADDPATH_AF_RX_RCV)) {
9957 if (CHECK_FLAG(
9958 p->af_cap
9959 [afi]
9960 [safi],
9961 PEER_CAP_ADDPATH_AF_RX_ADV)
9962 && CHECK_FLAG(
9963 p->af_cap
9964 [afi]
9965 [safi],
9966 PEER_CAP_ADDPATH_AF_RX_RCV))
9967 json_object_boolean_true_add(
9968 json_sub,
9969 "rxAdvertisedAndReceived");
9970 else if (
9971 CHECK_FLAG(
9972 p->af_cap
9973 [afi]
9974 [safi],
9975 PEER_CAP_ADDPATH_AF_RX_ADV))
9976 json_object_boolean_true_add(
9977 json_sub,
9978 "rxAdvertised");
9979 else if (
9980 CHECK_FLAG(
9981 p->af_cap
9982 [afi]
9983 [safi],
9984 PEER_CAP_ADDPATH_AF_RX_RCV))
9985 json_object_boolean_true_add(
9986 json_sub,
9987 "rxReceived");
9988 }
9989
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 || CHECK_FLAG(
9999 p->af_cap[afi]
10000 [safi],
10001 PEER_CAP_ADDPATH_AF_RX_ADV)
10002 || CHECK_FLAG(
10003 p->af_cap[afi]
10004 [safi],
10005 PEER_CAP_ADDPATH_AF_RX_RCV))
10006 json_object_object_add(
10007 json_add,
10008 print_store,
10009 json_sub);
10010 else
10011 json_object_free(
10012 json_sub);
10013 }
10014
10015 json_object_object_add(
10016 json_cap, "addPath", json_add);
10017 }
10018
10019 /* Dynamic */
10020 if (CHECK_FLAG(p->cap, PEER_CAP_DYNAMIC_RCV)
10021 || CHECK_FLAG(p->cap,
10022 PEER_CAP_DYNAMIC_ADV)) {
10023 if (CHECK_FLAG(p->cap,
10024 PEER_CAP_DYNAMIC_ADV)
10025 && CHECK_FLAG(p->cap,
10026 PEER_CAP_DYNAMIC_RCV))
10027 json_object_string_add(
10028 json_cap, "dynamic",
10029 "advertisedAndReceived");
10030 else if (CHECK_FLAG(
10031 p->cap,
10032 PEER_CAP_DYNAMIC_ADV))
10033 json_object_string_add(
10034 json_cap, "dynamic",
10035 "advertised");
10036 else if (CHECK_FLAG(
10037 p->cap,
10038 PEER_CAP_DYNAMIC_RCV))
10039 json_object_string_add(
10040 json_cap, "dynamic",
10041 "received");
10042 }
10043
10044 /* Extended nexthop */
10045 if (CHECK_FLAG(p->cap, PEER_CAP_ENHE_RCV)
10046 || CHECK_FLAG(p->cap, PEER_CAP_ENHE_ADV)) {
10047 json_object *json_nxt = NULL;
10048 const char *print_store;
10049
10050
10051 if (CHECK_FLAG(p->cap,
10052 PEER_CAP_ENHE_ADV)
10053 && CHECK_FLAG(p->cap,
10054 PEER_CAP_ENHE_RCV))
10055 json_object_string_add(
10056 json_cap,
10057 "extendedNexthop",
10058 "advertisedAndReceived");
10059 else if (CHECK_FLAG(p->cap,
10060 PEER_CAP_ENHE_ADV))
10061 json_object_string_add(
10062 json_cap,
10063 "extendedNexthop",
10064 "advertised");
10065 else if (CHECK_FLAG(p->cap,
10066 PEER_CAP_ENHE_RCV))
10067 json_object_string_add(
10068 json_cap,
10069 "extendedNexthop",
10070 "received");
10071
10072 if (CHECK_FLAG(p->cap,
10073 PEER_CAP_ENHE_RCV)) {
10074 json_nxt =
10075 json_object_new_object();
10076
10077 for (safi = SAFI_UNICAST;
10078 safi < SAFI_MAX; safi++) {
10079 if (CHECK_FLAG(
10080 p->af_cap
10081 [AFI_IP]
10082 [safi],
10083 PEER_CAP_ENHE_AF_RCV)) {
10084 print_store = get_afi_safi_str(
10085 AFI_IP,
10086 safi, true);
10087 json_object_string_add(
10088 json_nxt,
10089 print_store,
10090 "recieved"); /* misspelled for compatibility */
10091 }
10092 }
10093 json_object_object_add(
10094 json_cap,
10095 "extendedNexthopFamililesByPeer",
10096 json_nxt);
10097 }
10098 }
10099
10100 /* Route Refresh */
10101 if (CHECK_FLAG(p->cap, PEER_CAP_REFRESH_ADV)
10102 || CHECK_FLAG(p->cap,
10103 PEER_CAP_REFRESH_NEW_RCV)
10104 || CHECK_FLAG(p->cap,
10105 PEER_CAP_REFRESH_OLD_RCV)) {
10106 if (CHECK_FLAG(p->cap,
10107 PEER_CAP_REFRESH_ADV)
10108 && (CHECK_FLAG(
10109 p->cap,
10110 PEER_CAP_REFRESH_NEW_RCV)
10111 || CHECK_FLAG(
10112 p->cap,
10113 PEER_CAP_REFRESH_OLD_RCV))) {
10114 if (CHECK_FLAG(
10115 p->cap,
10116 PEER_CAP_REFRESH_OLD_RCV)
10117 && CHECK_FLAG(
10118 p->cap,
10119 PEER_CAP_REFRESH_NEW_RCV))
10120 json_object_string_add(
10121 json_cap,
10122 "routeRefresh",
10123 "advertisedAndReceivedOldNew");
10124 else {
10125 if (CHECK_FLAG(
10126 p->cap,
10127 PEER_CAP_REFRESH_OLD_RCV))
10128 json_object_string_add(
10129 json_cap,
10130 "routeRefresh",
10131 "advertisedAndReceivedOld");
10132 else
10133 json_object_string_add(
10134 json_cap,
10135 "routeRefresh",
10136 "advertisedAndReceivedNew");
10137 }
10138 } else if (
10139 CHECK_FLAG(
10140 p->cap,
10141 PEER_CAP_REFRESH_ADV))
10142 json_object_string_add(
10143 json_cap,
10144 "routeRefresh",
10145 "advertised");
10146 else if (
10147 CHECK_FLAG(
10148 p->cap,
10149 PEER_CAP_REFRESH_NEW_RCV)
10150 || CHECK_FLAG(
10151 p->cap,
10152 PEER_CAP_REFRESH_OLD_RCV))
10153 json_object_string_add(
10154 json_cap,
10155 "routeRefresh",
10156 "received");
10157 }
10158
10159 /* Multiprotocol Extensions */
10160 json_object *json_multi = NULL;
10161 json_multi = json_object_new_object();
10162
10163 FOREACH_AFI_SAFI (afi, safi) {
10164 if (p->afc_adv[afi][safi]
10165 || p->afc_recv[afi][safi]) {
10166 json_object *json_exten = NULL;
10167 json_exten =
10168 json_object_new_object();
10169
10170 if (p->afc_adv[afi][safi]
10171 && p->afc_recv[afi][safi])
10172 json_object_boolean_true_add(
10173 json_exten,
10174 "advertisedAndReceived");
10175 else if (p->afc_adv[afi][safi])
10176 json_object_boolean_true_add(
10177 json_exten,
10178 "advertised");
10179 else if (p->afc_recv[afi][safi])
10180 json_object_boolean_true_add(
10181 json_exten,
10182 "received");
10183
10184 json_object_object_add(
10185 json_multi,
10186 get_afi_safi_str(afi,
10187 safi,
10188 true),
10189 json_exten);
10190 }
10191 }
10192 json_object_object_add(
10193 json_cap, "multiprotocolExtensions",
10194 json_multi);
10195
10196 /* Hostname capabilities */
10197 json_object *json_hname = NULL;
10198
10199 json_hname = json_object_new_object();
10200
10201 if (CHECK_FLAG(p->cap, PEER_CAP_HOSTNAME_ADV)) {
10202 json_object_string_add(
10203 json_hname, "advHostName",
10204 bgp->peer_self->hostname
10205 ? bgp->peer_self
10206 ->hostname
10207 : "n/a");
10208 json_object_string_add(
10209 json_hname, "advDomainName",
10210 bgp->peer_self->domainname
10211 ? bgp->peer_self
10212 ->domainname
10213 : "n/a");
10214 }
10215
10216
10217 if (CHECK_FLAG(p->cap, PEER_CAP_HOSTNAME_RCV)) {
10218 json_object_string_add(
10219 json_hname, "rcvHostName",
10220 p->hostname ? p->hostname
10221 : "n/a");
10222 json_object_string_add(
10223 json_hname, "rcvDomainName",
10224 p->domainname ? p->domainname
10225 : "n/a");
10226 }
10227
10228 json_object_object_add(json_cap, "hostName",
10229 json_hname);
10230
10231 /* Gracefull Restart */
10232 if (CHECK_FLAG(p->cap, PEER_CAP_RESTART_RCV)
10233 || CHECK_FLAG(p->cap,
10234 PEER_CAP_RESTART_ADV)) {
10235 if (CHECK_FLAG(p->cap,
10236 PEER_CAP_RESTART_ADV)
10237 && CHECK_FLAG(p->cap,
10238 PEER_CAP_RESTART_RCV))
10239 json_object_string_add(
10240 json_cap,
10241 "gracefulRestart",
10242 "advertisedAndReceived");
10243 else if (CHECK_FLAG(
10244 p->cap,
10245 PEER_CAP_RESTART_ADV))
10246 json_object_string_add(
10247 json_cap,
10248 "gracefulRestartCapability",
10249 "advertised");
10250 else if (CHECK_FLAG(
10251 p->cap,
10252 PEER_CAP_RESTART_RCV))
10253 json_object_string_add(
10254 json_cap,
10255 "gracefulRestartCapability",
10256 "received");
10257
10258 if (CHECK_FLAG(p->cap,
10259 PEER_CAP_RESTART_RCV)) {
10260 int restart_af_count = 0;
10261 json_object *json_restart =
10262 NULL;
10263 json_restart =
10264 json_object_new_object();
10265
10266 json_object_int_add(
10267 json_cap,
10268 "gracefulRestartRemoteTimerMsecs",
10269 p->v_gr_restart * 1000);
10270
10271 FOREACH_AFI_SAFI (afi, safi) {
10272 if (CHECK_FLAG(
10273 p->af_cap
10274 [afi]
10275 [safi],
10276 PEER_CAP_RESTART_AF_RCV)) {
10277 json_object *
10278 json_sub =
10279 NULL;
10280 json_sub =
10281 json_object_new_object();
10282
10283 if (CHECK_FLAG(
10284 p->af_cap
10285 [afi]
10286 [safi],
10287 PEER_CAP_RESTART_AF_PRESERVE_RCV))
10288 json_object_boolean_true_add(
10289 json_sub,
10290 "preserved");
10291 restart_af_count++;
10292 json_object_object_add(
10293 json_restart,
10294 get_afi_safi_str(
10295 afi,
10296 safi,
10297 true),
10298 json_sub);
10299 }
10300 }
10301 if (!restart_af_count) {
10302 json_object_string_add(
10303 json_cap,
10304 "addressFamiliesByPeer",
10305 "none");
10306 json_object_free(
10307 json_restart);
10308 } else
10309 json_object_object_add(
10310 json_cap,
10311 "addressFamiliesByPeer",
10312 json_restart);
10313 }
10314 }
10315 json_object_object_add(json_neigh,
10316 "neighborCapabilities",
10317 json_cap);
10318 } else {
10319 vty_out(vty, " Neighbor capabilities:\n");
10320
10321 /* AS4 */
10322 if (CHECK_FLAG(p->cap, PEER_CAP_AS4_RCV)
10323 || CHECK_FLAG(p->cap, PEER_CAP_AS4_ADV)) {
10324 vty_out(vty, " 4 Byte AS:");
10325 if (CHECK_FLAG(p->cap,
10326 PEER_CAP_AS4_ADV))
10327 vty_out(vty, " advertised");
10328 if (CHECK_FLAG(p->cap,
10329 PEER_CAP_AS4_RCV))
10330 vty_out(vty, " %sreceived",
10331 CHECK_FLAG(
10332 p->cap,
10333 PEER_CAP_AS4_ADV)
10334 ? "and "
10335 : "");
10336 vty_out(vty, "\n");
10337 }
10338
10339 /* AddPath */
10340 if (CHECK_FLAG(p->cap, PEER_CAP_ADDPATH_RCV)
10341 || CHECK_FLAG(p->cap,
10342 PEER_CAP_ADDPATH_ADV)) {
10343 vty_out(vty, " AddPath:\n");
10344
10345 FOREACH_AFI_SAFI (afi, safi) {
10346 if (CHECK_FLAG(
10347 p->af_cap[afi]
10348 [safi],
10349 PEER_CAP_ADDPATH_AF_TX_ADV)
10350 || CHECK_FLAG(
10351 p->af_cap[afi]
10352 [safi],
10353 PEER_CAP_ADDPATH_AF_TX_RCV)) {
10354 vty_out(vty,
10355 " %s: TX ",
10356 get_afi_safi_str(
10357 afi,
10358 safi,
10359 false));
10360
10361 if (CHECK_FLAG(
10362 p->af_cap
10363 [afi]
10364 [safi],
10365 PEER_CAP_ADDPATH_AF_TX_ADV))
10366 vty_out(vty,
10367 "advertised %s",
10368 get_afi_safi_str(
10369 afi,
10370 safi,
10371 false));
10372
10373 if (CHECK_FLAG(
10374 p->af_cap
10375 [afi]
10376 [safi],
10377 PEER_CAP_ADDPATH_AF_TX_RCV))
10378 vty_out(vty,
10379 "%sreceived",
10380 CHECK_FLAG(
10381 p->af_cap
10382 [afi]
10383 [safi],
10384 PEER_CAP_ADDPATH_AF_TX_ADV)
10385 ? " and "
10386 : "");
10387
10388 vty_out(vty, "\n");
10389 }
10390
10391 if (CHECK_FLAG(
10392 p->af_cap[afi]
10393 [safi],
10394 PEER_CAP_ADDPATH_AF_RX_ADV)
10395 || CHECK_FLAG(
10396 p->af_cap[afi]
10397 [safi],
10398 PEER_CAP_ADDPATH_AF_RX_RCV)) {
10399 vty_out(vty,
10400 " %s: RX ",
10401 get_afi_safi_str(
10402 afi,
10403 safi,
10404 false));
10405
10406 if (CHECK_FLAG(
10407 p->af_cap
10408 [afi]
10409 [safi],
10410 PEER_CAP_ADDPATH_AF_RX_ADV))
10411 vty_out(vty,
10412 "advertised %s",
10413 get_afi_safi_str(
10414 afi,
10415 safi,
10416 false));
10417
10418 if (CHECK_FLAG(
10419 p->af_cap
10420 [afi]
10421 [safi],
10422 PEER_CAP_ADDPATH_AF_RX_RCV))
10423 vty_out(vty,
10424 "%sreceived",
10425 CHECK_FLAG(
10426 p->af_cap
10427 [afi]
10428 [safi],
10429 PEER_CAP_ADDPATH_AF_RX_ADV)
10430 ? " and "
10431 : "");
10432
10433 vty_out(vty, "\n");
10434 }
10435 }
10436 }
10437
10438 /* Dynamic */
10439 if (CHECK_FLAG(p->cap, PEER_CAP_DYNAMIC_RCV)
10440 || CHECK_FLAG(p->cap,
10441 PEER_CAP_DYNAMIC_ADV)) {
10442 vty_out(vty, " Dynamic:");
10443 if (CHECK_FLAG(p->cap,
10444 PEER_CAP_DYNAMIC_ADV))
10445 vty_out(vty, " advertised");
10446 if (CHECK_FLAG(p->cap,
10447 PEER_CAP_DYNAMIC_RCV))
10448 vty_out(vty, " %sreceived",
10449 CHECK_FLAG(
10450 p->cap,
10451 PEER_CAP_DYNAMIC_ADV)
10452 ? "and "
10453 : "");
10454 vty_out(vty, "\n");
10455 }
10456
10457 /* Extended nexthop */
10458 if (CHECK_FLAG(p->cap, PEER_CAP_ENHE_RCV)
10459 || CHECK_FLAG(p->cap, PEER_CAP_ENHE_ADV)) {
10460 vty_out(vty, " Extended nexthop:");
10461 if (CHECK_FLAG(p->cap,
10462 PEER_CAP_ENHE_ADV))
10463 vty_out(vty, " advertised");
10464 if (CHECK_FLAG(p->cap,
10465 PEER_CAP_ENHE_RCV))
10466 vty_out(vty, " %sreceived",
10467 CHECK_FLAG(
10468 p->cap,
10469 PEER_CAP_ENHE_ADV)
10470 ? "and "
10471 : "");
10472 vty_out(vty, "\n");
10473
10474 if (CHECK_FLAG(p->cap,
10475 PEER_CAP_ENHE_RCV)) {
10476 vty_out(vty,
10477 " Address families by peer:\n ");
10478 for (safi = SAFI_UNICAST;
10479 safi < SAFI_MAX; safi++)
10480 if (CHECK_FLAG(
10481 p->af_cap
10482 [AFI_IP]
10483 [safi],
10484 PEER_CAP_ENHE_AF_RCV))
10485 vty_out(vty,
10486 " %s\n",
10487 get_afi_safi_str(
10488 AFI_IP,
10489 safi,
10490 false));
10491 }
10492 }
10493
10494 /* Route Refresh */
10495 if (CHECK_FLAG(p->cap, PEER_CAP_REFRESH_ADV)
10496 || CHECK_FLAG(p->cap,
10497 PEER_CAP_REFRESH_NEW_RCV)
10498 || CHECK_FLAG(p->cap,
10499 PEER_CAP_REFRESH_OLD_RCV)) {
10500 vty_out(vty, " Route refresh:");
10501 if (CHECK_FLAG(p->cap,
10502 PEER_CAP_REFRESH_ADV))
10503 vty_out(vty, " advertised");
10504 if (CHECK_FLAG(p->cap,
10505 PEER_CAP_REFRESH_NEW_RCV)
10506 || CHECK_FLAG(
10507 p->cap,
10508 PEER_CAP_REFRESH_OLD_RCV))
10509 vty_out(vty, " %sreceived(%s)",
10510 CHECK_FLAG(
10511 p->cap,
10512 PEER_CAP_REFRESH_ADV)
10513 ? "and "
10514 : "",
10515 (CHECK_FLAG(
10516 p->cap,
10517 PEER_CAP_REFRESH_OLD_RCV)
10518 && CHECK_FLAG(
10519 p->cap,
10520 PEER_CAP_REFRESH_NEW_RCV))
10521 ? "old & new"
10522 : CHECK_FLAG(
10523 p->cap,
10524 PEER_CAP_REFRESH_OLD_RCV)
10525 ? "old"
10526 : "new");
10527
10528 vty_out(vty, "\n");
10529 }
10530
10531 /* Multiprotocol Extensions */
10532 FOREACH_AFI_SAFI (afi, safi)
10533 if (p->afc_adv[afi][safi]
10534 || p->afc_recv[afi][safi]) {
10535 vty_out(vty,
10536 " Address Family %s:",
10537 get_afi_safi_str(
10538 afi,
10539 safi,
10540 false));
10541 if (p->afc_adv[afi][safi])
10542 vty_out(vty,
10543 " advertised");
10544 if (p->afc_recv[afi][safi])
10545 vty_out(vty,
10546 " %sreceived",
10547 p->afc_adv[afi]
10548 [safi]
10549 ? "and "
10550 : "");
10551 vty_out(vty, "\n");
10552 }
10553
10554 /* Hostname capability */
10555 vty_out(vty, " Hostname Capability:");
10556
10557 if (CHECK_FLAG(p->cap, PEER_CAP_HOSTNAME_ADV)) {
10558 vty_out(vty,
10559 " advertised (name: %s,domain name: %s)",
10560 bgp->peer_self->hostname
10561 ? bgp->peer_self
10562 ->hostname
10563 : "n/a",
10564 bgp->peer_self->domainname
10565 ? bgp->peer_self
10566 ->domainname
10567 : "n/a");
10568 } else {
10569 vty_out(vty, " not advertised");
10570 }
10571
10572 if (CHECK_FLAG(p->cap, PEER_CAP_HOSTNAME_RCV)) {
10573 vty_out(vty,
10574 " received (name: %s,domain name: %s)",
10575 p->hostname ? p->hostname
10576 : "n/a",
10577 p->domainname ? p->domainname
10578 : "n/a");
10579 } else {
10580 vty_out(vty, " not received");
10581 }
10582
10583 vty_out(vty, "\n");
10584
10585 /* Gracefull Restart */
10586 if (CHECK_FLAG(p->cap, PEER_CAP_RESTART_RCV)
10587 || CHECK_FLAG(p->cap,
10588 PEER_CAP_RESTART_ADV)) {
10589 vty_out(vty,
10590 " Graceful Restart Capabilty:");
10591 if (CHECK_FLAG(p->cap,
10592 PEER_CAP_RESTART_ADV))
10593 vty_out(vty, " advertised");
10594 if (CHECK_FLAG(p->cap,
10595 PEER_CAP_RESTART_RCV))
10596 vty_out(vty, " %sreceived",
10597 CHECK_FLAG(
10598 p->cap,
10599 PEER_CAP_RESTART_ADV)
10600 ? "and "
10601 : "");
10602 vty_out(vty, "\n");
10603
10604 if (CHECK_FLAG(p->cap,
10605 PEER_CAP_RESTART_RCV)) {
10606 int restart_af_count = 0;
10607
10608 vty_out(vty,
10609 " Remote Restart timer is %d seconds\n",
10610 p->v_gr_restart);
10611 vty_out(vty,
10612 " Address families by peer:\n ");
10613
10614 FOREACH_AFI_SAFI (afi, safi)
10615 if (CHECK_FLAG(
10616 p->af_cap
10617 [afi]
10618 [safi],
10619 PEER_CAP_RESTART_AF_RCV)) {
10620 vty_out(vty,
10621 "%s%s(%s)",
10622 restart_af_count
10623 ? ", "
10624 : "",
10625 get_afi_safi_str(
10626 afi,
10627 safi,
10628 false),
10629 CHECK_FLAG(
10630 p->af_cap
10631 [afi]
10632 [safi],
10633 PEER_CAP_RESTART_AF_PRESERVE_RCV)
10634 ? "preserved"
10635 : "not preserved");
10636 restart_af_count++;
10637 }
10638 if (!restart_af_count)
10639 vty_out(vty, "none");
10640 vty_out(vty, "\n");
10641 }
10642 }
10643 }
10644 }
10645 }
10646
10647 /* graceful restart information */
10648 if (CHECK_FLAG(p->cap, PEER_CAP_RESTART_RCV) || p->t_gr_restart
10649 || p->t_gr_stale) {
10650 json_object *json_grace = NULL;
10651 json_object *json_grace_send = NULL;
10652 json_object *json_grace_recv = NULL;
10653 int eor_send_af_count = 0;
10654 int eor_receive_af_count = 0;
10655
10656 if (use_json) {
10657 json_grace = json_object_new_object();
10658 json_grace_send = json_object_new_object();
10659 json_grace_recv = json_object_new_object();
10660
10661 if (p->status == Established) {
10662 FOREACH_AFI_SAFI (afi, safi) {
10663 if (CHECK_FLAG(p->af_sflags[afi][safi],
10664 PEER_STATUS_EOR_SEND)) {
10665 json_object_boolean_true_add(
10666 json_grace_send,
10667 get_afi_safi_str(afi,
10668 safi,
10669 true));
10670 eor_send_af_count++;
10671 }
10672 }
10673 FOREACH_AFI_SAFI (afi, safi) {
10674 if (CHECK_FLAG(
10675 p->af_sflags[afi][safi],
10676 PEER_STATUS_EOR_RECEIVED)) {
10677 json_object_boolean_true_add(
10678 json_grace_recv,
10679 get_afi_safi_str(afi,
10680 safi,
10681 true));
10682 eor_receive_af_count++;
10683 }
10684 }
10685 }
10686
10687 json_object_object_add(json_grace, "endOfRibSend",
10688 json_grace_send);
10689 json_object_object_add(json_grace, "endOfRibRecv",
10690 json_grace_recv);
10691
10692 if (p->t_gr_restart)
10693 json_object_int_add(json_grace,
10694 "gracefulRestartTimerMsecs",
10695 thread_timer_remain_second(
10696 p->t_gr_restart)
10697 * 1000);
10698
10699 if (p->t_gr_stale)
10700 json_object_int_add(
10701 json_grace,
10702 "gracefulStalepathTimerMsecs",
10703 thread_timer_remain_second(
10704 p->t_gr_stale)
10705 * 1000);
10706
10707 json_object_object_add(
10708 json_neigh, "gracefulRestartInfo", json_grace);
10709 } else {
10710 vty_out(vty, " Graceful restart information:\n");
10711 if (p->status == Established) {
10712 vty_out(vty, " End-of-RIB send: ");
10713 FOREACH_AFI_SAFI (afi, safi) {
10714 if (CHECK_FLAG(p->af_sflags[afi][safi],
10715 PEER_STATUS_EOR_SEND)) {
10716 vty_out(vty, "%s%s",
10717 eor_send_af_count ? ", "
10718 : "",
10719 get_afi_safi_str(afi,
10720 safi,
10721 false));
10722 eor_send_af_count++;
10723 }
10724 }
10725 vty_out(vty, "\n");
10726 vty_out(vty, " End-of-RIB received: ");
10727 FOREACH_AFI_SAFI (afi, safi) {
10728 if (CHECK_FLAG(
10729 p->af_sflags[afi][safi],
10730 PEER_STATUS_EOR_RECEIVED)) {
10731 vty_out(vty, "%s%s",
10732 eor_receive_af_count
10733 ? ", "
10734 : "",
10735 get_afi_safi_str(afi,
10736 safi,
10737 false));
10738 eor_receive_af_count++;
10739 }
10740 }
10741 vty_out(vty, "\n");
10742 }
10743
10744 if (p->t_gr_restart)
10745 vty_out(vty,
10746 " The remaining time of restart timer is %ld\n",
10747 thread_timer_remain_second(
10748 p->t_gr_restart));
10749
10750 if (p->t_gr_stale)
10751 vty_out(vty,
10752 " The remaining time of stalepath timer is %ld\n",
10753 thread_timer_remain_second(
10754 p->t_gr_stale));
10755 }
10756 }
10757 if (use_json) {
10758 json_object *json_stat = NULL;
10759 json_stat = json_object_new_object();
10760 /* Packet counts. */
10761 json_object_int_add(json_stat, "depthInq", 0);
10762 json_object_int_add(json_stat, "depthOutq",
10763 (unsigned long)p->obuf->count);
10764 json_object_int_add(json_stat, "opensSent",
10765 atomic_load_explicit(&p->open_out,
10766 memory_order_relaxed));
10767 json_object_int_add(json_stat, "opensRecv",
10768 atomic_load_explicit(&p->open_in,
10769 memory_order_relaxed));
10770 json_object_int_add(json_stat, "notificationsSent",
10771 atomic_load_explicit(&p->notify_out,
10772 memory_order_relaxed));
10773 json_object_int_add(json_stat, "notificationsRecv",
10774 atomic_load_explicit(&p->notify_in,
10775 memory_order_relaxed));
10776 json_object_int_add(json_stat, "updatesSent",
10777 atomic_load_explicit(&p->update_out,
10778 memory_order_relaxed));
10779 json_object_int_add(json_stat, "updatesRecv",
10780 atomic_load_explicit(&p->update_in,
10781 memory_order_relaxed));
10782 json_object_int_add(json_stat, "keepalivesSent",
10783 atomic_load_explicit(&p->keepalive_out,
10784 memory_order_relaxed));
10785 json_object_int_add(json_stat, "keepalivesRecv",
10786 atomic_load_explicit(&p->keepalive_in,
10787 memory_order_relaxed));
10788 json_object_int_add(json_stat, "routeRefreshSent",
10789 atomic_load_explicit(&p->refresh_out,
10790 memory_order_relaxed));
10791 json_object_int_add(json_stat, "routeRefreshRecv",
10792 atomic_load_explicit(&p->refresh_in,
10793 memory_order_relaxed));
10794 json_object_int_add(json_stat, "capabilitySent",
10795 atomic_load_explicit(&p->dynamic_cap_out,
10796 memory_order_relaxed));
10797 json_object_int_add(json_stat, "capabilityRecv",
10798 atomic_load_explicit(&p->dynamic_cap_in,
10799 memory_order_relaxed));
10800 json_object_int_add(json_stat, "totalSent", PEER_TOTAL_TX(p));
10801 json_object_int_add(json_stat, "totalRecv", PEER_TOTAL_RX(p));
10802 json_object_object_add(json_neigh, "messageStats", json_stat);
10803 } else {
10804 /* Packet counts. */
10805 vty_out(vty, " Message statistics:\n");
10806 vty_out(vty, " Inq depth is 0\n");
10807 vty_out(vty, " Outq depth is %lu\n",
10808 (unsigned long)p->obuf->count);
10809 vty_out(vty, " Sent Rcvd\n");
10810 vty_out(vty, " Opens: %10d %10d\n",
10811 atomic_load_explicit(&p->open_out,
10812 memory_order_relaxed),
10813 atomic_load_explicit(&p->open_in,
10814 memory_order_relaxed));
10815 vty_out(vty, " Notifications: %10d %10d\n",
10816 atomic_load_explicit(&p->notify_out,
10817 memory_order_relaxed),
10818 atomic_load_explicit(&p->notify_in,
10819 memory_order_relaxed));
10820 vty_out(vty, " Updates: %10d %10d\n",
10821 atomic_load_explicit(&p->update_out,
10822 memory_order_relaxed),
10823 atomic_load_explicit(&p->update_in,
10824 memory_order_relaxed));
10825 vty_out(vty, " Keepalives: %10d %10d\n",
10826 atomic_load_explicit(&p->keepalive_out,
10827 memory_order_relaxed),
10828 atomic_load_explicit(&p->keepalive_in,
10829 memory_order_relaxed));
10830 vty_out(vty, " Route Refresh: %10d %10d\n",
10831 atomic_load_explicit(&p->refresh_out,
10832 memory_order_relaxed),
10833 atomic_load_explicit(&p->refresh_in,
10834 memory_order_relaxed));
10835 vty_out(vty, " Capability: %10d %10d\n",
10836 atomic_load_explicit(&p->dynamic_cap_out,
10837 memory_order_relaxed),
10838 atomic_load_explicit(&p->dynamic_cap_in,
10839 memory_order_relaxed));
10840 vty_out(vty, " Total: %10d %10d\n", PEER_TOTAL_TX(p),
10841 PEER_TOTAL_RX(p));
10842 }
10843
10844 if (use_json) {
10845 /* advertisement-interval */
10846 json_object_int_add(json_neigh,
10847 "minBtwnAdvertisementRunsTimerMsecs",
10848 p->v_routeadv * 1000);
10849
10850 /* Update-source. */
10851 if (p->update_if || p->update_source) {
10852 if (p->update_if)
10853 json_object_string_add(json_neigh,
10854 "updateSource",
10855 p->update_if);
10856 else if (p->update_source)
10857 json_object_string_add(
10858 json_neigh, "updateSource",
10859 sockunion2str(p->update_source, buf1,
10860 SU_ADDRSTRLEN));
10861 }
10862 } else {
10863 /* advertisement-interval */
10864 vty_out(vty,
10865 " Minimum time between advertisement runs is %d seconds\n",
10866 p->v_routeadv);
10867
10868 /* Update-source. */
10869 if (p->update_if || p->update_source) {
10870 vty_out(vty, " Update source is ");
10871 if (p->update_if)
10872 vty_out(vty, "%s", p->update_if);
10873 else if (p->update_source)
10874 vty_out(vty, "%s",
10875 sockunion2str(p->update_source, buf1,
10876 SU_ADDRSTRLEN));
10877 vty_out(vty, "\n");
10878 }
10879
10880 vty_out(vty, "\n");
10881 }
10882
10883 /* Address Family Information */
10884 json_object *json_hold = NULL;
10885
10886 if (use_json)
10887 json_hold = json_object_new_object();
10888
10889 FOREACH_AFI_SAFI (afi, safi)
10890 if (p->afc[afi][safi])
10891 bgp_show_peer_afi(vty, p, afi, safi, use_json,
10892 json_hold);
10893
10894 if (use_json) {
10895 json_object_object_add(json_neigh, "addressFamilyInfo",
10896 json_hold);
10897 json_object_int_add(json_neigh, "connectionsEstablished",
10898 p->established);
10899 json_object_int_add(json_neigh, "connectionsDropped",
10900 p->dropped);
10901 } else
10902 vty_out(vty, " Connections established %d; dropped %d\n",
10903 p->established, p->dropped);
10904
10905 if (!p->last_reset) {
10906 if (use_json)
10907 json_object_string_add(json_neigh, "lastReset",
10908 "never");
10909 else
10910 vty_out(vty, " Last reset never\n");
10911 } else {
10912 if (use_json) {
10913 time_t uptime;
10914 struct tm *tm;
10915
10916 uptime = bgp_clock();
10917 uptime -= p->resettime;
10918 tm = gmtime(&uptime);
10919 json_object_int_add(json_neigh, "lastResetTimerMsecs",
10920 (tm->tm_sec * 1000)
10921 + (tm->tm_min * 60000)
10922 + (tm->tm_hour * 3600000));
10923 bgp_show_peer_reset(NULL, p, json_neigh, true);
10924 } else {
10925 vty_out(vty, " Last reset %s, ",
10926 peer_uptime(p->resettime, timebuf,
10927 BGP_UPTIME_LEN, 0, NULL));
10928
10929 bgp_show_peer_reset(vty, p, NULL, false);
10930 if (p->last_reset_cause_size) {
10931 msg = p->last_reset_cause;
10932 vty_out(vty,
10933 " Message received that caused BGP to send a NOTIFICATION:\n ");
10934 for (i = 1; i <= p->last_reset_cause_size;
10935 i++) {
10936 vty_out(vty, "%02X", *msg++);
10937
10938 if (i != p->last_reset_cause_size) {
10939 if (i % 16 == 0) {
10940 vty_out(vty, "\n ");
10941 } else if (i % 4 == 0) {
10942 vty_out(vty, " ");
10943 }
10944 }
10945 }
10946 vty_out(vty, "\n");
10947 }
10948 }
10949 }
10950
10951 if (CHECK_FLAG(p->sflags, PEER_STATUS_PREFIX_OVERFLOW)) {
10952 if (use_json)
10953 json_object_boolean_true_add(json_neigh,
10954 "prefixesConfigExceedMax");
10955 else
10956 vty_out(vty,
10957 " Peer had exceeded the max. no. of prefixes configured.\n");
10958
10959 if (p->t_pmax_restart) {
10960 if (use_json) {
10961 json_object_boolean_true_add(
10962 json_neigh, "reducePrefixNumFrom");
10963 json_object_int_add(json_neigh,
10964 "restartInTimerMsec",
10965 thread_timer_remain_second(
10966 p->t_pmax_restart)
10967 * 1000);
10968 } else
10969 vty_out(vty,
10970 " Reduce the no. of prefix from %s, will restart in %ld seconds\n",
10971 p->host, thread_timer_remain_second(
10972 p->t_pmax_restart));
10973 } else {
10974 if (use_json)
10975 json_object_boolean_true_add(
10976 json_neigh,
10977 "reducePrefixNumAndClearIpBgp");
10978 else
10979 vty_out(vty,
10980 " Reduce the no. of prefix and clear ip bgp %s to restore peering\n",
10981 p->host);
10982 }
10983 }
10984
10985 /* EBGP Multihop and GTSM */
10986 if (p->sort != BGP_PEER_IBGP) {
10987 if (use_json) {
10988 if (p->gtsm_hops > 0)
10989 json_object_int_add(json_neigh,
10990 "externalBgpNbrMaxHopsAway",
10991 p->gtsm_hops);
10992 else if (p->ttl > BGP_DEFAULT_TTL)
10993 json_object_int_add(json_neigh,
10994 "externalBgpNbrMaxHopsAway",
10995 p->ttl);
10996 } else {
10997 if (p->gtsm_hops > 0)
10998 vty_out(vty,
10999 " External BGP neighbor may be up to %d hops away.\n",
11000 p->gtsm_hops);
11001 else if (p->ttl > BGP_DEFAULT_TTL)
11002 vty_out(vty,
11003 " External BGP neighbor may be up to %d hops away.\n",
11004 p->ttl);
11005 }
11006 } else {
11007 if (p->gtsm_hops > 0) {
11008 if (use_json)
11009 json_object_int_add(json_neigh,
11010 "internalBgpNbrMaxHopsAway",
11011 p->gtsm_hops);
11012 else
11013 vty_out(vty,
11014 " Internal BGP neighbor may be up to %d hops away.\n",
11015 p->gtsm_hops);
11016 }
11017 }
11018
11019 /* Local address. */
11020 if (p->su_local) {
11021 if (use_json) {
11022 json_object_string_add(json_neigh, "hostLocal",
11023 sockunion2str(p->su_local, buf1,
11024 SU_ADDRSTRLEN));
11025 json_object_int_add(json_neigh, "portLocal",
11026 ntohs(p->su_local->sin.sin_port));
11027 } else
11028 vty_out(vty, "Local host: %s, Local port: %d\n",
11029 sockunion2str(p->su_local, buf1, SU_ADDRSTRLEN),
11030 ntohs(p->su_local->sin.sin_port));
11031 }
11032
11033 /* Remote address. */
11034 if (p->su_remote) {
11035 if (use_json) {
11036 json_object_string_add(json_neigh, "hostForeign",
11037 sockunion2str(p->su_remote, buf1,
11038 SU_ADDRSTRLEN));
11039 json_object_int_add(json_neigh, "portForeign",
11040 ntohs(p->su_remote->sin.sin_port));
11041 } else
11042 vty_out(vty, "Foreign host: %s, Foreign port: %d\n",
11043 sockunion2str(p->su_remote, buf1,
11044 SU_ADDRSTRLEN),
11045 ntohs(p->su_remote->sin.sin_port));
11046 }
11047
11048 /* Nexthop display. */
11049 if (p->su_local) {
11050 if (use_json) {
11051 json_object_string_add(json_neigh, "nexthop",
11052 inet_ntop(AF_INET,
11053 &p->nexthop.v4, buf1,
11054 sizeof(buf1)));
11055 json_object_string_add(json_neigh, "nexthopGlobal",
11056 inet_ntop(AF_INET6,
11057 &p->nexthop.v6_global,
11058 buf1, sizeof(buf1)));
11059 json_object_string_add(json_neigh, "nexthopLocal",
11060 inet_ntop(AF_INET6,
11061 &p->nexthop.v6_local,
11062 buf1, sizeof(buf1)));
11063 if (p->shared_network)
11064 json_object_string_add(json_neigh,
11065 "bgpConnection",
11066 "sharedNetwork");
11067 else
11068 json_object_string_add(json_neigh,
11069 "bgpConnection",
11070 "nonSharedNetwork");
11071 } else {
11072 vty_out(vty, "Nexthop: %s\n",
11073 inet_ntop(AF_INET, &p->nexthop.v4, buf1,
11074 sizeof(buf1)));
11075 vty_out(vty, "Nexthop global: %s\n",
11076 inet_ntop(AF_INET6, &p->nexthop.v6_global, buf1,
11077 sizeof(buf1)));
11078 vty_out(vty, "Nexthop local: %s\n",
11079 inet_ntop(AF_INET6, &p->nexthop.v6_local, buf1,
11080 sizeof(buf1)));
11081 vty_out(vty, "BGP connection: %s\n",
11082 p->shared_network ? "shared network"
11083 : "non shared network");
11084 }
11085 }
11086
11087 /* Timer information. */
11088 if (use_json) {
11089 json_object_int_add(json_neigh, "connectRetryTimer",
11090 p->v_connect);
11091 if (p->status == Established && p->rtt)
11092 json_object_int_add(json_neigh, "estimatedRttInMsecs",
11093 p->rtt);
11094 if (p->t_start)
11095 json_object_int_add(
11096 json_neigh, "nextStartTimerDueInMsecs",
11097 thread_timer_remain_second(p->t_start) * 1000);
11098 if (p->t_connect)
11099 json_object_int_add(
11100 json_neigh, "nextConnectTimerDueInMsecs",
11101 thread_timer_remain_second(p->t_connect)
11102 * 1000);
11103 if (p->t_routeadv) {
11104 json_object_int_add(json_neigh, "mraiInterval",
11105 p->v_routeadv);
11106 json_object_int_add(
11107 json_neigh, "mraiTimerExpireInMsecs",
11108 thread_timer_remain_second(p->t_routeadv)
11109 * 1000);
11110 }
11111 if (p->password)
11112 json_object_int_add(json_neigh, "authenticationEnabled",
11113 1);
11114
11115 if (p->t_read)
11116 json_object_string_add(json_neigh, "readThread", "on");
11117 else
11118 json_object_string_add(json_neigh, "readThread", "off");
11119
11120 if (CHECK_FLAG(p->thread_flags, PEER_THREAD_WRITES_ON))
11121 json_object_string_add(json_neigh, "writeThread", "on");
11122 else
11123 json_object_string_add(json_neigh, "writeThread",
11124 "off");
11125 } else {
11126 vty_out(vty, "BGP Connect Retry Timer in Seconds: %d\n",
11127 p->v_connect);
11128 if (p->status == Established && p->rtt)
11129 vty_out(vty, "Estimated round trip time: %d ms\n",
11130 p->rtt);
11131 if (p->t_start)
11132 vty_out(vty, "Next start timer due in %ld seconds\n",
11133 thread_timer_remain_second(p->t_start));
11134 if (p->t_connect)
11135 vty_out(vty, "Next connect timer due in %ld seconds\n",
11136 thread_timer_remain_second(p->t_connect));
11137 if (p->t_routeadv)
11138 vty_out(vty,
11139 "MRAI (interval %u) timer expires in %ld seconds\n",
11140 p->v_routeadv,
11141 thread_timer_remain_second(p->t_routeadv));
11142 if (p->password)
11143 vty_out(vty, "Peer Authentication Enabled\n");
11144
11145 vty_out(vty, "Read thread: %s Write thread: %s FD used: %d\n",
11146 p->t_read ? "on" : "off",
11147 CHECK_FLAG(p->thread_flags, PEER_THREAD_WRITES_ON)
11148 ? "on"
11149 : "off", p->fd);
11150 }
11151
11152 if (p->notify.code == BGP_NOTIFY_OPEN_ERR
11153 && p->notify.subcode == BGP_NOTIFY_OPEN_UNSUP_CAPBL)
11154 bgp_capability_vty_out(vty, p, use_json, json_neigh);
11155
11156 if (!use_json)
11157 vty_out(vty, "\n");
11158
11159 /* BFD information. */
11160 bgp_bfd_show_info(vty, p, use_json, json_neigh);
11161
11162 if (use_json) {
11163 if (p->conf_if) /* Configured interface name. */
11164 json_object_object_add(json, p->conf_if, json_neigh);
11165 else /* Configured IP address. */
11166 json_object_object_add(json, p->host, json_neigh);
11167 }
11168 }
11169
11170 static int bgp_show_neighbor(struct vty *vty, struct bgp *bgp,
11171 enum show_type type, union sockunion *su,
11172 const char *conf_if, bool use_json,
11173 json_object *json)
11174 {
11175 struct listnode *node, *nnode;
11176 struct peer *peer;
11177 int find = 0;
11178 bool nbr_output = false;
11179 afi_t afi = AFI_MAX;
11180 safi_t safi = SAFI_MAX;
11181
11182 if (type == show_ipv4_peer || type == show_ipv4_all) {
11183 afi = AFI_IP;
11184 } else if (type == show_ipv6_peer || type == show_ipv6_all) {
11185 afi = AFI_IP6;
11186 }
11187
11188 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
11189 if (!CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE))
11190 continue;
11191
11192 switch (type) {
11193 case show_all:
11194 bgp_show_peer(vty, peer, use_json, json);
11195 nbr_output = true;
11196 break;
11197 case show_peer:
11198 if (conf_if) {
11199 if ((peer->conf_if
11200 && !strcmp(peer->conf_if, conf_if))
11201 || (peer->hostname
11202 && !strcmp(peer->hostname, conf_if))) {
11203 find = 1;
11204 bgp_show_peer(vty, peer, use_json,
11205 json);
11206 }
11207 } else {
11208 if (sockunion_same(&peer->su, su)) {
11209 find = 1;
11210 bgp_show_peer(vty, peer, use_json,
11211 json);
11212 }
11213 }
11214 break;
11215 case show_ipv4_peer:
11216 case show_ipv6_peer:
11217 FOREACH_SAFI (safi) {
11218 if (peer->afc[afi][safi]) {
11219 if (conf_if) {
11220 if ((peer->conf_if
11221 && !strcmp(peer->conf_if, conf_if))
11222 || (peer->hostname
11223 && !strcmp(peer->hostname, conf_if))) {
11224 find = 1;
11225 bgp_show_peer(vty, peer, use_json,
11226 json);
11227 break;
11228 }
11229 } else {
11230 if (sockunion_same(&peer->su, su)) {
11231 find = 1;
11232 bgp_show_peer(vty, peer, use_json,
11233 json);
11234 break;
11235 }
11236 }
11237 }
11238 }
11239 break;
11240 case show_ipv4_all:
11241 case show_ipv6_all:
11242 FOREACH_SAFI (safi) {
11243 if (peer->afc[afi][safi]) {
11244 bgp_show_peer(vty, peer, use_json, json);
11245 nbr_output = true;
11246 break;
11247 }
11248 }
11249 break;
11250 }
11251 }
11252
11253 if ((type == show_peer || type == show_ipv4_peer ||
11254 type == show_ipv6_peer) && !find) {
11255 if (use_json)
11256 json_object_boolean_true_add(json, "bgpNoSuchNeighbor");
11257 else
11258 vty_out(vty, "%% No such neighbor in this view/vrf\n");
11259 }
11260
11261 if (type != show_peer && type != show_ipv4_peer &&
11262 type != show_ipv6_peer && !nbr_output && !use_json)
11263 vty_out(vty, "%% No BGP neighbors found\n");
11264
11265 if (use_json) {
11266 vty_out(vty, "%s\n", json_object_to_json_string_ext(
11267 json, JSON_C_TO_STRING_PRETTY));
11268 } else {
11269 vty_out(vty, "\n");
11270 }
11271
11272 return CMD_SUCCESS;
11273 }
11274
11275 static void bgp_show_all_instances_neighbors_vty(struct vty *vty,
11276 enum show_type type,
11277 const char *ip_str,
11278 bool use_json)
11279 {
11280 struct listnode *node, *nnode;
11281 struct bgp *bgp;
11282 union sockunion su;
11283 json_object *json = NULL;
11284 int ret, is_first = 1;
11285 bool nbr_output = false;
11286
11287 if (use_json)
11288 vty_out(vty, "{\n");
11289
11290 for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) {
11291 nbr_output = true;
11292 if (use_json) {
11293 if (!(json = json_object_new_object())) {
11294 flog_err(
11295 EC_BGP_JSON_MEM_ERROR,
11296 "Unable to allocate memory for JSON object");
11297 vty_out(vty,
11298 "{\"error\": {\"message:\": \"Unable to allocate memory for JSON object\"}}}\n");
11299 return;
11300 }
11301
11302 json_object_int_add(json, "vrfId",
11303 (bgp->vrf_id == VRF_UNKNOWN)
11304 ? -1
11305 : (int64_t)bgp->vrf_id);
11306 json_object_string_add(
11307 json, "vrfName",
11308 (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)
11309 ? VRF_DEFAULT_NAME
11310 : bgp->name);
11311
11312 if (!is_first)
11313 vty_out(vty, ",\n");
11314 else
11315 is_first = 0;
11316
11317 vty_out(vty, "\"%s\":",
11318 (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)
11319 ? VRF_DEFAULT_NAME
11320 : bgp->name);
11321 } else {
11322 vty_out(vty, "\nInstance %s:\n",
11323 (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)
11324 ? VRF_DEFAULT_NAME
11325 : bgp->name);
11326 }
11327
11328 if (type == show_peer || type == show_ipv4_peer ||
11329 type == show_ipv6_peer) {
11330 ret = str2sockunion(ip_str, &su);
11331 if (ret < 0)
11332 bgp_show_neighbor(vty, bgp, type, NULL, ip_str,
11333 use_json, json);
11334 else
11335 bgp_show_neighbor(vty, bgp, type, &su, NULL,
11336 use_json, json);
11337 } else {
11338 bgp_show_neighbor(vty, bgp, type, NULL, NULL,
11339 use_json, json);
11340 }
11341 json_object_free(json);
11342 }
11343
11344 if (use_json) {
11345 vty_out(vty, "}\n");
11346 json_object_free(json);
11347 }
11348 else if (!nbr_output)
11349 vty_out(vty, "%% BGP instance not found\n");
11350 }
11351
11352 static int bgp_show_neighbor_vty(struct vty *vty, const char *name,
11353 enum show_type type, const char *ip_str,
11354 bool use_json)
11355 {
11356 int ret;
11357 struct bgp *bgp;
11358 union sockunion su;
11359 json_object *json = NULL;
11360
11361 if (name) {
11362 if (strmatch(name, "all")) {
11363 bgp_show_all_instances_neighbors_vty(vty, type, ip_str,
11364 use_json);
11365 return CMD_SUCCESS;
11366 } else {
11367 bgp = bgp_lookup_by_name(name);
11368 if (!bgp) {
11369 if (use_json) {
11370 json = json_object_new_object();
11371 vty_out(vty, "%s\n",
11372 json_object_to_json_string_ext(
11373 json,
11374 JSON_C_TO_STRING_PRETTY));
11375 json_object_free(json);
11376 } else
11377 vty_out(vty,
11378 "%% BGP instance not found\n");
11379
11380 return CMD_WARNING;
11381 }
11382 }
11383 } else {
11384 bgp = bgp_get_default();
11385 }
11386
11387 if (bgp) {
11388 json = json_object_new_object();
11389 if (ip_str) {
11390 ret = str2sockunion(ip_str, &su);
11391 if (ret < 0)
11392 bgp_show_neighbor(vty, bgp, type, NULL, ip_str,
11393 use_json, json);
11394 else
11395 bgp_show_neighbor(vty, bgp, type, &su, NULL,
11396 use_json, json);
11397 } else {
11398 bgp_show_neighbor(vty, bgp, type, NULL, NULL, use_json,
11399 json);
11400 }
11401 json_object_free(json);
11402 } else {
11403 if (use_json)
11404 vty_out(vty, "{}\n");
11405 else
11406 vty_out(vty, "%% BGP instance not found\n");
11407 }
11408
11409 return CMD_SUCCESS;
11410 }
11411
11412 /* "show [ip] bgp neighbors" commands. */
11413 DEFUN (show_ip_bgp_neighbors,
11414 show_ip_bgp_neighbors_cmd,
11415 "show [ip] bgp [<view|vrf> VIEWVRFNAME] [<ipv4|ipv6>] neighbors [<A.B.C.D|X:X::X:X|WORD>] [json]",
11416 SHOW_STR
11417 IP_STR
11418 BGP_STR
11419 BGP_INSTANCE_HELP_STR
11420 "Address Family\n"
11421 "Address Family\n"
11422 "Detailed information on TCP and BGP neighbor connections\n"
11423 "Neighbor to display information about\n"
11424 "Neighbor to display information about\n"
11425 "Neighbor on BGP configured interface\n"
11426 JSON_STR)
11427 {
11428 char *vrf = NULL;
11429 char *sh_arg = NULL;
11430 enum show_type sh_type;
11431 afi_t afi = AFI_MAX;
11432
11433 bool uj = use_json(argc, argv);
11434
11435 int idx = 0;
11436
11437 /* [<vrf> VIEWVRFNAME] */
11438 if (argv_find(argv, argc, "vrf", &idx)) {
11439 vrf = argv[idx + 1]->arg;
11440 if (vrf && strmatch(vrf, VRF_DEFAULT_NAME))
11441 vrf = NULL;
11442 } else if (argv_find(argv, argc, "view", &idx))
11443 /* [<view> VIEWVRFNAME] */
11444 vrf = argv[idx + 1]->arg;
11445
11446 idx++;
11447
11448 if (argv_find(argv, argc, "ipv4", &idx)) {
11449 sh_type = show_ipv4_all;
11450 afi = AFI_IP;
11451 } else if (argv_find(argv, argc, "ipv6", &idx)) {
11452 sh_type = show_ipv6_all;
11453 afi = AFI_IP6;
11454 } else {
11455 sh_type = show_all;
11456 }
11457
11458 if (argv_find(argv, argc, "A.B.C.D", &idx)
11459 || argv_find(argv, argc, "X:X::X:X", &idx)
11460 || argv_find(argv, argc, "WORD", &idx)) {
11461 sh_type = show_peer;
11462 sh_arg = argv[idx]->arg;
11463 }
11464
11465 if (sh_type == show_peer && afi == AFI_IP) {
11466 sh_type = show_ipv4_peer;
11467 } else if (sh_type == show_peer && afi == AFI_IP6) {
11468 sh_type = show_ipv6_peer;
11469 }
11470
11471 return bgp_show_neighbor_vty(vty, vrf, sh_type, sh_arg, uj);
11472 }
11473
11474 /* Show BGP's AS paths internal data. There are both `show [ip] bgp
11475 paths' and `show ip mbgp paths'. Those functions results are the
11476 same.*/
11477 DEFUN (show_ip_bgp_paths,
11478 show_ip_bgp_paths_cmd,
11479 "show [ip] bgp ["BGP_SAFI_CMD_STR"] paths",
11480 SHOW_STR
11481 IP_STR
11482 BGP_STR
11483 BGP_SAFI_HELP_STR
11484 "Path information\n")
11485 {
11486 vty_out(vty, "Address Refcnt Path\n");
11487 aspath_print_all_vty(vty);
11488 return CMD_SUCCESS;
11489 }
11490
11491 #include "hash.h"
11492
11493 static void community_show_all_iterator(struct hash_bucket *bucket,
11494 struct vty *vty)
11495 {
11496 struct community *com;
11497
11498 com = (struct community *)bucket->data;
11499 vty_out(vty, "[%p] (%ld) %s\n", (void *)com, com->refcnt,
11500 community_str(com, false));
11501 }
11502
11503 /* Show BGP's community internal data. */
11504 DEFUN (show_ip_bgp_community_info,
11505 show_ip_bgp_community_info_cmd,
11506 "show [ip] bgp community-info",
11507 SHOW_STR
11508 IP_STR
11509 BGP_STR
11510 "List all bgp community information\n")
11511 {
11512 vty_out(vty, "Address Refcnt Community\n");
11513
11514 hash_iterate(community_hash(),
11515 (void (*)(struct hash_bucket *,
11516 void *))community_show_all_iterator,
11517 vty);
11518
11519 return CMD_SUCCESS;
11520 }
11521
11522 static void lcommunity_show_all_iterator(struct hash_bucket *bucket,
11523 struct vty *vty)
11524 {
11525 struct lcommunity *lcom;
11526
11527 lcom = (struct lcommunity *)bucket->data;
11528 vty_out(vty, "[%p] (%ld) %s\n", (void *)lcom, lcom->refcnt,
11529 lcommunity_str(lcom, false));
11530 }
11531
11532 /* Show BGP's community internal data. */
11533 DEFUN (show_ip_bgp_lcommunity_info,
11534 show_ip_bgp_lcommunity_info_cmd,
11535 "show ip bgp large-community-info",
11536 SHOW_STR
11537 IP_STR
11538 BGP_STR
11539 "List all bgp large-community information\n")
11540 {
11541 vty_out(vty, "Address Refcnt Large-community\n");
11542
11543 hash_iterate(lcommunity_hash(),
11544 (void (*)(struct hash_bucket *,
11545 void *))lcommunity_show_all_iterator,
11546 vty);
11547
11548 return CMD_SUCCESS;
11549 }
11550
11551
11552 DEFUN (show_ip_bgp_attr_info,
11553 show_ip_bgp_attr_info_cmd,
11554 "show [ip] bgp attribute-info",
11555 SHOW_STR
11556 IP_STR
11557 BGP_STR
11558 "List all bgp attribute information\n")
11559 {
11560 attr_show_all(vty);
11561 return CMD_SUCCESS;
11562 }
11563
11564 static int bgp_show_route_leak_vty(struct vty *vty, const char *name,
11565 afi_t afi, safi_t safi,
11566 bool use_json, json_object *json)
11567 {
11568 struct bgp *bgp;
11569 struct listnode *node;
11570 char *vname;
11571 char buf1[INET6_ADDRSTRLEN];
11572 char *ecom_str;
11573 vpn_policy_direction_t dir;
11574
11575 if (json) {
11576 json_object *json_import_vrfs = NULL;
11577 json_object *json_export_vrfs = NULL;
11578
11579 bgp = name ? bgp_lookup_by_name(name) : bgp_get_default();
11580
11581 if (!bgp) {
11582 vty_out(vty, "%s\n",
11583 json_object_to_json_string_ext(
11584 json,
11585 JSON_C_TO_STRING_PRETTY));
11586 json_object_free(json);
11587
11588 return CMD_WARNING;
11589 }
11590
11591 /* Provide context for the block */
11592 json_object_string_add(json, "vrf", name ? name : "default");
11593 json_object_string_add(json, "afiSafi",
11594 get_afi_safi_str(afi, safi, true));
11595
11596 if (!CHECK_FLAG(bgp->af_flags[afi][safi],
11597 BGP_CONFIG_VRF_TO_VRF_IMPORT)) {
11598 json_object_string_add(json, "importFromVrfs", "none");
11599 json_object_string_add(json, "importRts", "none");
11600 } else {
11601 json_import_vrfs = json_object_new_array();
11602
11603 for (ALL_LIST_ELEMENTS_RO(
11604 bgp->vpn_policy[afi].import_vrf,
11605 node, vname))
11606 json_object_array_add(json_import_vrfs,
11607 json_object_new_string(vname));
11608
11609 json_object_object_add(json, "importFromVrfs",
11610 json_import_vrfs);
11611 dir = BGP_VPN_POLICY_DIR_FROMVPN;
11612 if (bgp->vpn_policy[afi].rtlist[dir]) {
11613 ecom_str = ecommunity_ecom2str(
11614 bgp->vpn_policy[afi].rtlist[dir],
11615 ECOMMUNITY_FORMAT_ROUTE_MAP, 0);
11616 json_object_string_add(json, "importRts",
11617 ecom_str);
11618 XFREE(MTYPE_ECOMMUNITY_STR, ecom_str);
11619 } else
11620 json_object_string_add(json, "importRts",
11621 "none");
11622 }
11623
11624 if (!CHECK_FLAG(bgp->af_flags[afi][safi],
11625 BGP_CONFIG_VRF_TO_VRF_EXPORT)) {
11626 json_object_string_add(json, "exportToVrfs", "none");
11627 json_object_string_add(json, "routeDistinguisher",
11628 "none");
11629 json_object_string_add(json, "exportRts", "none");
11630 } else {
11631 json_export_vrfs = json_object_new_array();
11632
11633 for (ALL_LIST_ELEMENTS_RO(
11634 bgp->vpn_policy[afi].export_vrf,
11635 node, vname))
11636 json_object_array_add(json_export_vrfs,
11637 json_object_new_string(vname));
11638 json_object_object_add(json, "exportToVrfs",
11639 json_export_vrfs);
11640 json_object_string_add(json, "routeDistinguisher",
11641 prefix_rd2str(&bgp->vpn_policy[afi].tovpn_rd,
11642 buf1, RD_ADDRSTRLEN));
11643
11644 dir = BGP_VPN_POLICY_DIR_TOVPN;
11645 if (bgp->vpn_policy[afi].rtlist[dir]) {
11646 ecom_str = ecommunity_ecom2str(
11647 bgp->vpn_policy[afi].rtlist[dir],
11648 ECOMMUNITY_FORMAT_ROUTE_MAP, 0);
11649 json_object_string_add(json, "exportRts",
11650 ecom_str);
11651 XFREE(MTYPE_ECOMMUNITY_STR, ecom_str);
11652 } else
11653 json_object_string_add(json, "exportRts",
11654 "none");
11655 }
11656
11657 if (use_json) {
11658 vty_out(vty, "%s\n",
11659 json_object_to_json_string_ext(json,
11660 JSON_C_TO_STRING_PRETTY));
11661 json_object_free(json);
11662 }
11663 } else {
11664 bgp = name ? bgp_lookup_by_name(name) : bgp_get_default();
11665
11666 if (!bgp) {
11667 vty_out(vty, "%% No such BGP instance exist\n");
11668 return CMD_WARNING;
11669 }
11670
11671 if (!CHECK_FLAG(bgp->af_flags[afi][safi],
11672 BGP_CONFIG_VRF_TO_VRF_IMPORT))
11673 vty_out(vty,
11674 "This VRF is not importing %s routes from any other VRF\n",
11675 get_afi_safi_str(afi, safi, false));
11676 else {
11677 vty_out(vty,
11678 "This VRF is importing %s routes from the following VRFs:\n",
11679 get_afi_safi_str(afi, safi, false));
11680
11681 for (ALL_LIST_ELEMENTS_RO(
11682 bgp->vpn_policy[afi].import_vrf,
11683 node, vname))
11684 vty_out(vty, " %s\n", vname);
11685
11686 dir = BGP_VPN_POLICY_DIR_FROMVPN;
11687 ecom_str = NULL;
11688 if (bgp->vpn_policy[afi].rtlist[dir]) {
11689 ecom_str = ecommunity_ecom2str(
11690 bgp->vpn_policy[afi].rtlist[dir],
11691 ECOMMUNITY_FORMAT_ROUTE_MAP, 0);
11692 vty_out(vty, "Import RT(s): %s\n", ecom_str);
11693
11694 XFREE(MTYPE_ECOMMUNITY_STR, ecom_str);
11695 } else
11696 vty_out(vty, "Import RT(s):\n");
11697 }
11698
11699 if (!CHECK_FLAG(bgp->af_flags[afi][safi],
11700 BGP_CONFIG_VRF_TO_VRF_EXPORT))
11701 vty_out(vty,
11702 "This VRF is not exporting %s routes to any other VRF\n",
11703 get_afi_safi_str(afi, safi, false));
11704 else {
11705 vty_out(vty,
11706 "This VRF is exporting %s routes to the following VRFs:\n",
11707 get_afi_safi_str(afi, safi, false));
11708
11709 for (ALL_LIST_ELEMENTS_RO(
11710 bgp->vpn_policy[afi].export_vrf,
11711 node, vname))
11712 vty_out(vty, " %s\n", vname);
11713
11714 vty_out(vty, "RD: %s\n",
11715 prefix_rd2str(&bgp->vpn_policy[afi].tovpn_rd,
11716 buf1, RD_ADDRSTRLEN));
11717
11718 dir = BGP_VPN_POLICY_DIR_TOVPN;
11719 if (bgp->vpn_policy[afi].rtlist[dir]) {
11720 ecom_str = ecommunity_ecom2str(
11721 bgp->vpn_policy[afi].rtlist[dir],
11722 ECOMMUNITY_FORMAT_ROUTE_MAP, 0);
11723 vty_out(vty, "Export RT: %s\n", ecom_str);
11724 XFREE(MTYPE_ECOMMUNITY_STR, ecom_str);
11725 } else
11726 vty_out(vty, "Import RT(s):\n");
11727 }
11728 }
11729
11730 return CMD_SUCCESS;
11731 }
11732
11733 static int bgp_show_all_instance_route_leak_vty(struct vty *vty, afi_t afi,
11734 safi_t safi, bool use_json)
11735 {
11736 struct listnode *node, *nnode;
11737 struct bgp *bgp;
11738 char *vrf_name = NULL;
11739 json_object *json = NULL;
11740 json_object *json_vrf = NULL;
11741 json_object *json_vrfs = NULL;
11742
11743 if (use_json) {
11744 json = json_object_new_object();
11745 json_vrfs = json_object_new_object();
11746 }
11747
11748 for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) {
11749
11750 if (bgp->inst_type != BGP_INSTANCE_TYPE_DEFAULT)
11751 vrf_name = bgp->name;
11752
11753 if (use_json) {
11754 json_vrf = json_object_new_object();
11755 } else {
11756 vty_out(vty, "\nInstance %s:\n",
11757 (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)
11758 ? VRF_DEFAULT_NAME : bgp->name);
11759 }
11760 bgp_show_route_leak_vty(vty, vrf_name, afi, safi, 0, json_vrf);
11761 if (use_json) {
11762 if (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)
11763 json_object_object_add(json_vrfs,
11764 VRF_DEFAULT_NAME, json_vrf);
11765 else
11766 json_object_object_add(json_vrfs, vrf_name,
11767 json_vrf);
11768 }
11769 }
11770
11771 if (use_json) {
11772 json_object_object_add(json, "vrfs", json_vrfs);
11773 vty_out(vty, "%s\n", json_object_to_json_string_ext(json,
11774 JSON_C_TO_STRING_PRETTY));
11775 json_object_free(json);
11776 }
11777
11778 return CMD_SUCCESS;
11779 }
11780
11781 /* "show [ip] bgp route-leak" command. */
11782 DEFUN (show_ip_bgp_route_leak,
11783 show_ip_bgp_route_leak_cmd,
11784 "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] route-leak [json]",
11785 SHOW_STR
11786 IP_STR
11787 BGP_STR
11788 BGP_INSTANCE_HELP_STR
11789 BGP_AFI_HELP_STR
11790 BGP_SAFI_HELP_STR
11791 "Route leaking information\n"
11792 JSON_STR)
11793 {
11794 char *vrf = NULL;
11795 afi_t afi = AFI_MAX;
11796 safi_t safi = SAFI_MAX;
11797
11798 bool uj = use_json(argc, argv);
11799 int idx = 0;
11800 json_object *json = NULL;
11801
11802 /* show [ip] bgp */
11803 if (argv_find(argv, argc, "ip", &idx)) {
11804 afi = AFI_IP;
11805 safi = SAFI_UNICAST;
11806 }
11807 /* [vrf VIEWVRFNAME] */
11808 if (argv_find(argv, argc, "view", &idx)) {
11809 vty_out(vty,
11810 "%% This command is not applicable to BGP views\n");
11811 return CMD_WARNING;
11812 }
11813
11814 if (argv_find(argv, argc, "vrf", &idx)) {
11815 vrf = argv[idx + 1]->arg;
11816 if (vrf && strmatch(vrf, VRF_DEFAULT_NAME))
11817 vrf = NULL;
11818 }
11819 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
11820 if (argv_find_and_parse_afi(argv, argc, &idx, &afi)) {
11821 argv_find_and_parse_safi(argv, argc, &idx, &safi);
11822 }
11823
11824 if (!((afi == AFI_IP || afi == AFI_IP6) && safi == SAFI_UNICAST)) {
11825 vty_out(vty,
11826 "%% This command is applicable only for unicast ipv4|ipv6\n");
11827 return CMD_WARNING;
11828 }
11829
11830 if (vrf && strmatch(vrf, "all"))
11831 return bgp_show_all_instance_route_leak_vty(vty, afi, safi, uj);
11832
11833 if (uj)
11834 json = json_object_new_object();
11835
11836 return bgp_show_route_leak_vty(vty, vrf, afi, safi, uj, json);
11837 }
11838
11839 static void bgp_show_all_instances_updgrps_vty(struct vty *vty, afi_t afi,
11840 safi_t safi)
11841 {
11842 struct listnode *node, *nnode;
11843 struct bgp *bgp;
11844
11845 for (ALL_LIST_ELEMENTS(bm->bgp, node, nnode, bgp)) {
11846 vty_out(vty, "\nInstance %s:\n",
11847 (bgp->inst_type == BGP_INSTANCE_TYPE_DEFAULT)
11848 ? VRF_DEFAULT_NAME
11849 : bgp->name);
11850 update_group_show(bgp, afi, safi, vty, 0);
11851 }
11852 }
11853
11854 static int bgp_show_update_groups(struct vty *vty, const char *name, int afi,
11855 int safi, uint64_t subgrp_id)
11856 {
11857 struct bgp *bgp;
11858
11859 if (name) {
11860 if (strmatch(name, "all")) {
11861 bgp_show_all_instances_updgrps_vty(vty, afi, safi);
11862 return CMD_SUCCESS;
11863 } else {
11864 bgp = bgp_lookup_by_name(name);
11865 }
11866 } else {
11867 bgp = bgp_get_default();
11868 }
11869
11870 if (bgp)
11871 update_group_show(bgp, afi, safi, vty, subgrp_id);
11872 return CMD_SUCCESS;
11873 }
11874
11875 DEFUN (show_ip_bgp_updgrps,
11876 show_ip_bgp_updgrps_cmd,
11877 "show [ip] bgp [<view|vrf> VIEWVRFNAME] ["BGP_AFI_CMD_STR" ["BGP_SAFI_WITH_LABEL_CMD_STR"]] update-groups [SUBGROUP-ID]",
11878 SHOW_STR
11879 IP_STR
11880 BGP_STR
11881 BGP_INSTANCE_HELP_STR
11882 BGP_AFI_HELP_STR
11883 BGP_SAFI_WITH_LABEL_HELP_STR
11884 "Detailed info about dynamic update groups\n"
11885 "Specific subgroup to display detailed info for\n")
11886 {
11887 char *vrf = NULL;
11888 afi_t afi = AFI_IP6;
11889 safi_t safi = SAFI_UNICAST;
11890 uint64_t subgrp_id = 0;
11891
11892 int idx = 0;
11893
11894 /* show [ip] bgp */
11895 if (argv_find(argv, argc, "ip", &idx))
11896 afi = AFI_IP;
11897 /* [<vrf> VIEWVRFNAME] */
11898 if (argv_find(argv, argc, "vrf", &idx)) {
11899 vrf = argv[idx + 1]->arg;
11900 if (vrf && strmatch(vrf, VRF_DEFAULT_NAME))
11901 vrf = NULL;
11902 } else if (argv_find(argv, argc, "view", &idx))
11903 /* [<view> VIEWVRFNAME] */
11904 vrf = argv[idx + 1]->arg;
11905 /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
11906 if (argv_find_and_parse_afi(argv, argc, &idx, &afi)) {
11907 argv_find_and_parse_safi(argv, argc, &idx, &safi);
11908 }
11909
11910 /* get subgroup id, if provided */
11911 idx = argc - 1;
11912 if (argv[idx]->type == VARIABLE_TKN)
11913 subgrp_id = strtoull(argv[idx]->arg, NULL, 10);
11914
11915 return (bgp_show_update_groups(vty, vrf, afi, safi, subgrp_id));
11916 }
11917
11918 DEFUN (show_bgp_instance_all_ipv6_updgrps,
11919 show_bgp_instance_all_ipv6_updgrps_cmd,
11920 "show [ip] bgp <view|vrf> all update-groups",
11921 SHOW_STR
11922 IP_STR
11923 BGP_STR
11924 BGP_INSTANCE_ALL_HELP_STR
11925 "Detailed info about dynamic update groups\n")
11926 {
11927 bgp_show_all_instances_updgrps_vty(vty, AFI_IP6, SAFI_UNICAST);
11928 return CMD_SUCCESS;
11929 }
11930
11931 DEFUN (show_bgp_l2vpn_evpn_updgrps,
11932 show_bgp_l2vpn_evpn_updgrps_cmd,
11933 "show [ip] bgp l2vpn evpn update-groups",
11934 SHOW_STR
11935 IP_STR
11936 BGP_STR
11937 "l2vpn address family\n"
11938 "evpn sub-address family\n"
11939 "Detailed info about dynamic update groups\n")
11940 {
11941 char *vrf = NULL;
11942 uint64_t subgrp_id = 0;
11943
11944 bgp_show_update_groups(vty, vrf, AFI_L2VPN, SAFI_EVPN, subgrp_id);
11945 return CMD_SUCCESS;
11946 }
11947
11948 DEFUN (show_bgp_updgrps_stats,
11949 show_bgp_updgrps_stats_cmd,
11950 "show [ip] bgp update-groups statistics",
11951 SHOW_STR
11952 IP_STR
11953 BGP_STR
11954 "Detailed info about dynamic update groups\n"
11955 "Statistics\n")
11956 {
11957 struct bgp *bgp;
11958
11959 bgp = bgp_get_default();
11960 if (bgp)
11961 update_group_show_stats(bgp, vty);
11962
11963 return CMD_SUCCESS;
11964 }
11965
11966 DEFUN (show_bgp_instance_updgrps_stats,
11967 show_bgp_instance_updgrps_stats_cmd,
11968 "show [ip] bgp <view|vrf> VIEWVRFNAME update-groups statistics",
11969 SHOW_STR
11970 IP_STR
11971 BGP_STR
11972 BGP_INSTANCE_HELP_STR
11973 "Detailed info about dynamic update groups\n"
11974 "Statistics\n")
11975 {
11976 int idx_word = 3;
11977 struct bgp *bgp;
11978
11979 bgp = bgp_lookup_by_name(argv[idx_word]->arg);
11980 if (bgp)
11981 update_group_show_stats(bgp, vty);
11982
11983 return CMD_SUCCESS;
11984 }
11985
11986 static void show_bgp_updgrps_adj_info_aux(struct vty *vty, const char *name,
11987 afi_t afi, safi_t safi,
11988 const char *what, uint64_t subgrp_id)
11989 {
11990 struct bgp *bgp;
11991
11992 if (name)
11993 bgp = bgp_lookup_by_name(name);
11994 else
11995 bgp = bgp_get_default();
11996
11997 if (bgp) {
11998 if (!strcmp(what, "advertise-queue"))
11999 update_group_show_adj_queue(bgp, afi, safi, vty,
12000 subgrp_id);
12001 else if (!strcmp(what, "advertised-routes"))
12002 update_group_show_advertised(bgp, afi, safi, vty,
12003 subgrp_id);
12004 else if (!strcmp(what, "packet-queue"))
12005 update_group_show_packet_queue(bgp, afi, safi, vty,
12006 subgrp_id);
12007 }
12008 }
12009
12010 DEFPY(show_ip_bgp_instance_updgrps_adj_s,
12011 show_ip_bgp_instance_updgrps_adj_s_cmd,
12012 "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",
12013 SHOW_STR IP_STR BGP_STR BGP_INSTANCE_HELP_STR BGP_AFI_HELP_STR
12014 BGP_SAFI_HELP_STR
12015 "Detailed info about dynamic update groups\n"
12016 "Specific subgroup to display info for\n"
12017 "Advertisement queue\n"
12018 "Announced routes\n"
12019 "Packet queue\n")
12020 {
12021 uint64_t subgrp_id = 0;
12022 afi_t afiz;
12023 safi_t safiz;
12024 if (sgid)
12025 subgrp_id = strtoull(sgid, NULL, 10);
12026
12027 if (!ip && !afi)
12028 afiz = AFI_IP6;
12029 if (!ip && afi)
12030 afiz = bgp_vty_afi_from_str(afi);
12031 if (ip && !afi)
12032 afiz = AFI_IP;
12033 if (ip && afi) {
12034 afiz = bgp_vty_afi_from_str(afi);
12035 if (afiz != AFI_IP)
12036 vty_out(vty,
12037 "%% Cannot specify both 'ip' and 'ipv6'\n");
12038 return CMD_WARNING;
12039 }
12040
12041 safiz = safi ? bgp_vty_safi_from_str(safi) : SAFI_UNICAST;
12042
12043 show_bgp_updgrps_adj_info_aux(vty, vrf, afiz, safiz, rtq, subgrp_id);
12044 return CMD_SUCCESS;
12045 }
12046
12047 static int bgp_show_one_peer_group(struct vty *vty, struct peer_group *group)
12048 {
12049 struct listnode *node, *nnode;
12050 struct prefix *range;
12051 struct peer *conf;
12052 struct peer *peer;
12053 char buf[PREFIX2STR_BUFFER];
12054 afi_t afi;
12055 safi_t safi;
12056 const char *peer_status;
12057 const char *af_str;
12058 int lr_count;
12059 int dynamic;
12060 int af_cfgd;
12061
12062 conf = group->conf;
12063
12064 if (conf->as_type == AS_SPECIFIED || conf->as_type == AS_EXTERNAL) {
12065 vty_out(vty, "\nBGP peer-group %s, remote AS %" PRIu32 "\n",
12066 group->name, conf->as);
12067 } else if (conf->as_type == AS_INTERNAL) {
12068 vty_out(vty, "\nBGP peer-group %s, remote AS %" PRIu32 "\n",
12069 group->name, group->bgp->as);
12070 } else {
12071 vty_out(vty, "\nBGP peer-group %s\n", group->name);
12072 }
12073
12074 if ((group->bgp->as == conf->as) || (conf->as_type == AS_INTERNAL))
12075 vty_out(vty, " Peer-group type is internal\n");
12076 else
12077 vty_out(vty, " Peer-group type is external\n");
12078
12079 /* Display AFs configured. */
12080 vty_out(vty, " Configured address-families:");
12081 FOREACH_AFI_SAFI (afi, safi) {
12082 if (conf->afc[afi][safi]) {
12083 af_cfgd = 1;
12084 vty_out(vty, " %s;", get_afi_safi_str(afi, safi, false));
12085 }
12086 }
12087 if (!af_cfgd)
12088 vty_out(vty, " none\n");
12089 else
12090 vty_out(vty, "\n");
12091
12092 /* Display listen ranges (for dynamic neighbors), if any */
12093 for (afi = AFI_IP; afi < AFI_MAX; afi++) {
12094 if (afi == AFI_IP)
12095 af_str = "IPv4";
12096 else if (afi == AFI_IP6)
12097 af_str = "IPv6";
12098 else
12099 af_str = "???";
12100 lr_count = listcount(group->listen_range[afi]);
12101 if (lr_count) {
12102 vty_out(vty, " %d %s listen range(s)\n", lr_count,
12103 af_str);
12104
12105
12106 for (ALL_LIST_ELEMENTS(group->listen_range[afi], node,
12107 nnode, range)) {
12108 prefix2str(range, buf, sizeof(buf));
12109 vty_out(vty, " %s\n", buf);
12110 }
12111 }
12112 }
12113
12114 /* Display group members and their status */
12115 if (listcount(group->peer)) {
12116 vty_out(vty, " Peer-group members:\n");
12117 for (ALL_LIST_ELEMENTS(group->peer, node, nnode, peer)) {
12118 if (CHECK_FLAG(peer->flags, PEER_FLAG_SHUTDOWN))
12119 peer_status = "Idle (Admin)";
12120 else if (CHECK_FLAG(peer->sflags,
12121 PEER_STATUS_PREFIX_OVERFLOW))
12122 peer_status = "Idle (PfxCt)";
12123 else
12124 peer_status = lookup_msg(bgp_status_msg,
12125 peer->status, NULL);
12126
12127 dynamic = peer_dynamic_neighbor(peer);
12128 vty_out(vty, " %s %s %s \n", peer->host,
12129 dynamic ? "(dynamic)" : "", peer_status);
12130 }
12131 }
12132
12133 return CMD_SUCCESS;
12134 }
12135
12136 static int bgp_show_peer_group_vty(struct vty *vty, const char *name,
12137 const char *group_name)
12138 {
12139 struct bgp *bgp;
12140 struct listnode *node, *nnode;
12141 struct peer_group *group;
12142 bool found = false;
12143
12144 bgp = name ? bgp_lookup_by_name(name) : bgp_get_default();
12145
12146 if (!bgp) {
12147 vty_out(vty, "%% BGP instance not found\n");
12148 return CMD_WARNING;
12149 }
12150
12151 for (ALL_LIST_ELEMENTS(bgp->group, node, nnode, group)) {
12152 if (group_name) {
12153 if (strmatch(group->name, group_name)) {
12154 bgp_show_one_peer_group(vty, group);
12155 found = true;
12156 break;
12157 }
12158 } else {
12159 bgp_show_one_peer_group(vty, group);
12160 }
12161 }
12162
12163 if (group_name && !found)
12164 vty_out(vty, "%% No such peer-group\n");
12165
12166 return CMD_SUCCESS;
12167 }
12168
12169 DEFUN (show_ip_bgp_peer_groups,
12170 show_ip_bgp_peer_groups_cmd,
12171 "show [ip] bgp [<view|vrf> VIEWVRFNAME] peer-group [PGNAME]",
12172 SHOW_STR
12173 IP_STR
12174 BGP_STR
12175 BGP_INSTANCE_HELP_STR
12176 "Detailed information on BGP peer groups\n"
12177 "Peer group name\n")
12178 {
12179 char *vrf, *pg;
12180 int idx = 0;
12181
12182 vrf = argv_find(argv, argc, "VIEWVRFNAME", &idx) ? argv[idx]->arg
12183 : NULL;
12184 pg = argv_find(argv, argc, "PGNAME", &idx) ? argv[idx]->arg : NULL;
12185
12186 return bgp_show_peer_group_vty(vty, vrf, pg);
12187 }
12188
12189
12190 /* Redistribute VTY commands. */
12191
12192 DEFUN (bgp_redistribute_ipv4,
12193 bgp_redistribute_ipv4_cmd,
12194 "redistribute " FRR_IP_REDIST_STR_BGPD,
12195 "Redistribute information from another routing protocol\n"
12196 FRR_IP_REDIST_HELP_STR_BGPD)
12197 {
12198 VTY_DECLVAR_CONTEXT(bgp, bgp);
12199 int idx_protocol = 1;
12200 int type;
12201
12202 type = proto_redistnum(AFI_IP, argv[idx_protocol]->text);
12203 if (type < 0) {
12204 vty_out(vty, "%% Invalid route type\n");
12205 return CMD_WARNING_CONFIG_FAILED;
12206 }
12207
12208 bgp_redist_add(bgp, AFI_IP, type, 0);
12209 return bgp_redistribute_set(bgp, AFI_IP, type, 0, false);
12210 }
12211
12212 ALIAS_HIDDEN(
12213 bgp_redistribute_ipv4, bgp_redistribute_ipv4_hidden_cmd,
12214 "redistribute " FRR_IP_REDIST_STR_BGPD,
12215 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD)
12216
12217 DEFUN (bgp_redistribute_ipv4_rmap,
12218 bgp_redistribute_ipv4_rmap_cmd,
12219 "redistribute " FRR_IP_REDIST_STR_BGPD " route-map WORD",
12220 "Redistribute information from another routing protocol\n"
12221 FRR_IP_REDIST_HELP_STR_BGPD
12222 "Route map reference\n"
12223 "Pointer to route-map entries\n")
12224 {
12225 VTY_DECLVAR_CONTEXT(bgp, bgp);
12226 int idx_protocol = 1;
12227 int idx_word = 3;
12228 int type;
12229 struct bgp_redist *red;
12230 bool changed;
12231 struct route_map *route_map = route_map_lookup_warn_noexist(
12232 vty, argv[idx_word]->arg);
12233
12234 type = proto_redistnum(AFI_IP, argv[idx_protocol]->text);
12235 if (type < 0) {
12236 vty_out(vty, "%% Invalid route type\n");
12237 return CMD_WARNING_CONFIG_FAILED;
12238 }
12239
12240 red = bgp_redist_add(bgp, AFI_IP, type, 0);
12241 changed =
12242 bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map);
12243 return bgp_redistribute_set(bgp, AFI_IP, type, 0, changed);
12244 }
12245
12246 ALIAS_HIDDEN(
12247 bgp_redistribute_ipv4_rmap, bgp_redistribute_ipv4_rmap_hidden_cmd,
12248 "redistribute " FRR_IP_REDIST_STR_BGPD " route-map WORD",
12249 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
12250 "Route map reference\n"
12251 "Pointer to route-map entries\n")
12252
12253 DEFUN (bgp_redistribute_ipv4_metric,
12254 bgp_redistribute_ipv4_metric_cmd,
12255 "redistribute " FRR_IP_REDIST_STR_BGPD " metric (0-4294967295)",
12256 "Redistribute information from another routing protocol\n"
12257 FRR_IP_REDIST_HELP_STR_BGPD
12258 "Metric for redistributed routes\n"
12259 "Default metric\n")
12260 {
12261 VTY_DECLVAR_CONTEXT(bgp, bgp);
12262 int idx_protocol = 1;
12263 int idx_number = 3;
12264 int type;
12265 uint32_t metric;
12266 struct bgp_redist *red;
12267 bool changed;
12268
12269 type = proto_redistnum(AFI_IP, argv[idx_protocol]->text);
12270 if (type < 0) {
12271 vty_out(vty, "%% Invalid route type\n");
12272 return CMD_WARNING_CONFIG_FAILED;
12273 }
12274 metric = strtoul(argv[idx_number]->arg, NULL, 10);
12275
12276 red = bgp_redist_add(bgp, AFI_IP, type, 0);
12277 changed = bgp_redistribute_metric_set(bgp, red, AFI_IP, type, metric);
12278 return bgp_redistribute_set(bgp, AFI_IP, type, 0, changed);
12279 }
12280
12281 ALIAS_HIDDEN(
12282 bgp_redistribute_ipv4_metric, bgp_redistribute_ipv4_metric_hidden_cmd,
12283 "redistribute " FRR_IP_REDIST_STR_BGPD " metric (0-4294967295)",
12284 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
12285 "Metric for redistributed routes\n"
12286 "Default metric\n")
12287
12288 DEFUN (bgp_redistribute_ipv4_rmap_metric,
12289 bgp_redistribute_ipv4_rmap_metric_cmd,
12290 "redistribute " FRR_IP_REDIST_STR_BGPD " route-map WORD metric (0-4294967295)",
12291 "Redistribute information from another routing protocol\n"
12292 FRR_IP_REDIST_HELP_STR_BGPD
12293 "Route map reference\n"
12294 "Pointer to route-map entries\n"
12295 "Metric for redistributed routes\n"
12296 "Default metric\n")
12297 {
12298 VTY_DECLVAR_CONTEXT(bgp, bgp);
12299 int idx_protocol = 1;
12300 int idx_word = 3;
12301 int idx_number = 5;
12302 int type;
12303 uint32_t metric;
12304 struct bgp_redist *red;
12305 bool changed;
12306 struct route_map *route_map =
12307 route_map_lookup_warn_noexist(vty, argv[idx_word]->arg);
12308
12309 type = proto_redistnum(AFI_IP, argv[idx_protocol]->text);
12310 if (type < 0) {
12311 vty_out(vty, "%% Invalid route type\n");
12312 return CMD_WARNING_CONFIG_FAILED;
12313 }
12314 metric = strtoul(argv[idx_number]->arg, NULL, 10);
12315
12316 red = bgp_redist_add(bgp, AFI_IP, type, 0);
12317 changed =
12318 bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map);
12319 changed |= bgp_redistribute_metric_set(bgp, red, AFI_IP, type, metric);
12320 return bgp_redistribute_set(bgp, AFI_IP, type, 0, changed);
12321 }
12322
12323 ALIAS_HIDDEN(
12324 bgp_redistribute_ipv4_rmap_metric,
12325 bgp_redistribute_ipv4_rmap_metric_hidden_cmd,
12326 "redistribute " FRR_IP_REDIST_STR_BGPD
12327 " route-map WORD metric (0-4294967295)",
12328 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
12329 "Route map reference\n"
12330 "Pointer to route-map entries\n"
12331 "Metric for redistributed routes\n"
12332 "Default metric\n")
12333
12334 DEFUN (bgp_redistribute_ipv4_metric_rmap,
12335 bgp_redistribute_ipv4_metric_rmap_cmd,
12336 "redistribute " FRR_IP_REDIST_STR_BGPD " metric (0-4294967295) route-map WORD",
12337 "Redistribute information from another routing protocol\n"
12338 FRR_IP_REDIST_HELP_STR_BGPD
12339 "Metric for redistributed routes\n"
12340 "Default metric\n"
12341 "Route map reference\n"
12342 "Pointer to route-map entries\n")
12343 {
12344 VTY_DECLVAR_CONTEXT(bgp, bgp);
12345 int idx_protocol = 1;
12346 int idx_number = 3;
12347 int idx_word = 5;
12348 int type;
12349 uint32_t metric;
12350 struct bgp_redist *red;
12351 bool changed;
12352 struct route_map *route_map =
12353 route_map_lookup_warn_noexist(vty, argv[idx_word]->arg);
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 metric = strtoul(argv[idx_number]->arg, NULL, 10);
12361
12362 red = bgp_redist_add(bgp, AFI_IP, type, 0);
12363 changed = bgp_redistribute_metric_set(bgp, red, AFI_IP, type, metric);
12364 changed |=
12365 bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map);
12366 return bgp_redistribute_set(bgp, AFI_IP, type, 0, changed);
12367 }
12368
12369 ALIAS_HIDDEN(
12370 bgp_redistribute_ipv4_metric_rmap,
12371 bgp_redistribute_ipv4_metric_rmap_hidden_cmd,
12372 "redistribute " FRR_IP_REDIST_STR_BGPD
12373 " metric (0-4294967295) route-map WORD",
12374 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
12375 "Metric for redistributed routes\n"
12376 "Default metric\n"
12377 "Route map reference\n"
12378 "Pointer to route-map entries\n")
12379
12380 DEFUN (bgp_redistribute_ipv4_ospf,
12381 bgp_redistribute_ipv4_ospf_cmd,
12382 "redistribute <ospf|table> (1-65535)",
12383 "Redistribute information from another routing protocol\n"
12384 "Open Shortest Path First (OSPFv2)\n"
12385 "Non-main Kernel Routing Table\n"
12386 "Instance ID/Table ID\n")
12387 {
12388 VTY_DECLVAR_CONTEXT(bgp, bgp);
12389 int idx_ospf_table = 1;
12390 int idx_number = 2;
12391 unsigned short instance;
12392 unsigned short protocol;
12393
12394 instance = strtoul(argv[idx_number]->arg, NULL, 10);
12395
12396 if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
12397 protocol = ZEBRA_ROUTE_OSPF;
12398 else
12399 protocol = ZEBRA_ROUTE_TABLE;
12400
12401 bgp_redist_add(bgp, AFI_IP, protocol, instance);
12402 return bgp_redistribute_set(bgp, AFI_IP, protocol, instance, false);
12403 }
12404
12405 ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf, bgp_redistribute_ipv4_ospf_hidden_cmd,
12406 "redistribute <ospf|table> (1-65535)",
12407 "Redistribute information from another routing protocol\n"
12408 "Open Shortest Path First (OSPFv2)\n"
12409 "Non-main Kernel Routing Table\n"
12410 "Instance ID/Table ID\n")
12411
12412 DEFUN (bgp_redistribute_ipv4_ospf_rmap,
12413 bgp_redistribute_ipv4_ospf_rmap_cmd,
12414 "redistribute <ospf|table> (1-65535) route-map WORD",
12415 "Redistribute information from another routing protocol\n"
12416 "Open Shortest Path First (OSPFv2)\n"
12417 "Non-main Kernel Routing Table\n"
12418 "Instance ID/Table ID\n"
12419 "Route map reference\n"
12420 "Pointer to route-map entries\n")
12421 {
12422 VTY_DECLVAR_CONTEXT(bgp, bgp);
12423 int idx_ospf_table = 1;
12424 int idx_number = 2;
12425 int idx_word = 4;
12426 struct bgp_redist *red;
12427 unsigned short instance;
12428 int protocol;
12429 bool changed;
12430 struct route_map *route_map =
12431 route_map_lookup_warn_noexist(vty, argv[idx_word]->arg);
12432
12433 if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
12434 protocol = ZEBRA_ROUTE_OSPF;
12435 else
12436 protocol = ZEBRA_ROUTE_TABLE;
12437
12438 instance = strtoul(argv[idx_number]->arg, NULL, 10);
12439 red = bgp_redist_add(bgp, AFI_IP, protocol, instance);
12440 changed =
12441 bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map);
12442 return bgp_redistribute_set(bgp, AFI_IP, protocol, instance, changed);
12443 }
12444
12445 ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf_rmap,
12446 bgp_redistribute_ipv4_ospf_rmap_hidden_cmd,
12447 "redistribute <ospf|table> (1-65535) route-map WORD",
12448 "Redistribute information from another routing protocol\n"
12449 "Open Shortest Path First (OSPFv2)\n"
12450 "Non-main Kernel Routing Table\n"
12451 "Instance ID/Table ID\n"
12452 "Route map reference\n"
12453 "Pointer to route-map entries\n")
12454
12455 DEFUN (bgp_redistribute_ipv4_ospf_metric,
12456 bgp_redistribute_ipv4_ospf_metric_cmd,
12457 "redistribute <ospf|table> (1-65535) metric (0-4294967295)",
12458 "Redistribute information from another routing protocol\n"
12459 "Open Shortest Path First (OSPFv2)\n"
12460 "Non-main Kernel Routing Table\n"
12461 "Instance ID/Table ID\n"
12462 "Metric for redistributed routes\n"
12463 "Default metric\n")
12464 {
12465 VTY_DECLVAR_CONTEXT(bgp, bgp);
12466 int idx_ospf_table = 1;
12467 int idx_number = 2;
12468 int idx_number_2 = 4;
12469 uint32_t metric;
12470 struct bgp_redist *red;
12471 unsigned short instance;
12472 int protocol;
12473 bool changed;
12474
12475 if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
12476 protocol = ZEBRA_ROUTE_OSPF;
12477 else
12478 protocol = ZEBRA_ROUTE_TABLE;
12479
12480 instance = strtoul(argv[idx_number]->arg, NULL, 10);
12481 metric = strtoul(argv[idx_number_2]->arg, NULL, 10);
12482
12483 red = bgp_redist_add(bgp, AFI_IP, protocol, instance);
12484 changed = bgp_redistribute_metric_set(bgp, red, AFI_IP, protocol,
12485 metric);
12486 return bgp_redistribute_set(bgp, AFI_IP, protocol, instance, changed);
12487 }
12488
12489 ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf_metric,
12490 bgp_redistribute_ipv4_ospf_metric_hidden_cmd,
12491 "redistribute <ospf|table> (1-65535) metric (0-4294967295)",
12492 "Redistribute information from another routing protocol\n"
12493 "Open Shortest Path First (OSPFv2)\n"
12494 "Non-main Kernel Routing Table\n"
12495 "Instance ID/Table ID\n"
12496 "Metric for redistributed routes\n"
12497 "Default metric\n")
12498
12499 DEFUN (bgp_redistribute_ipv4_ospf_rmap_metric,
12500 bgp_redistribute_ipv4_ospf_rmap_metric_cmd,
12501 "redistribute <ospf|table> (1-65535) route-map WORD metric (0-4294967295)",
12502 "Redistribute information from another routing protocol\n"
12503 "Open Shortest Path First (OSPFv2)\n"
12504 "Non-main Kernel Routing Table\n"
12505 "Instance ID/Table ID\n"
12506 "Route map reference\n"
12507 "Pointer to route-map entries\n"
12508 "Metric for redistributed routes\n"
12509 "Default metric\n")
12510 {
12511 VTY_DECLVAR_CONTEXT(bgp, bgp);
12512 int idx_ospf_table = 1;
12513 int idx_number = 2;
12514 int idx_word = 4;
12515 int idx_number_2 = 6;
12516 uint32_t metric;
12517 struct bgp_redist *red;
12518 unsigned short instance;
12519 int protocol;
12520 bool changed;
12521 struct route_map *route_map =
12522 route_map_lookup_warn_noexist(vty, argv[idx_word]->arg);
12523
12524 if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
12525 protocol = ZEBRA_ROUTE_OSPF;
12526 else
12527 protocol = ZEBRA_ROUTE_TABLE;
12528
12529 instance = strtoul(argv[idx_number]->arg, NULL, 10);
12530 metric = strtoul(argv[idx_number_2]->arg, NULL, 10);
12531
12532 red = bgp_redist_add(bgp, AFI_IP, protocol, instance);
12533 changed =
12534 bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map);
12535 changed |= bgp_redistribute_metric_set(bgp, red, AFI_IP, protocol,
12536 metric);
12537 return bgp_redistribute_set(bgp, AFI_IP, protocol, instance, changed);
12538 }
12539
12540 ALIAS_HIDDEN(
12541 bgp_redistribute_ipv4_ospf_rmap_metric,
12542 bgp_redistribute_ipv4_ospf_rmap_metric_hidden_cmd,
12543 "redistribute <ospf|table> (1-65535) route-map WORD metric (0-4294967295)",
12544 "Redistribute information from another routing protocol\n"
12545 "Open Shortest Path First (OSPFv2)\n"
12546 "Non-main Kernel Routing Table\n"
12547 "Instance ID/Table ID\n"
12548 "Route map reference\n"
12549 "Pointer to route-map entries\n"
12550 "Metric for redistributed routes\n"
12551 "Default metric\n")
12552
12553 DEFUN (bgp_redistribute_ipv4_ospf_metric_rmap,
12554 bgp_redistribute_ipv4_ospf_metric_rmap_cmd,
12555 "redistribute <ospf|table> (1-65535) metric (0-4294967295) route-map WORD",
12556 "Redistribute information from another routing protocol\n"
12557 "Open Shortest Path First (OSPFv2)\n"
12558 "Non-main Kernel Routing Table\n"
12559 "Instance ID/Table ID\n"
12560 "Metric for redistributed routes\n"
12561 "Default metric\n"
12562 "Route map reference\n"
12563 "Pointer to route-map entries\n")
12564 {
12565 VTY_DECLVAR_CONTEXT(bgp, bgp);
12566 int idx_ospf_table = 1;
12567 int idx_number = 2;
12568 int idx_number_2 = 4;
12569 int idx_word = 6;
12570 uint32_t metric;
12571 struct bgp_redist *red;
12572 unsigned short instance;
12573 int protocol;
12574 bool changed;
12575 struct route_map *route_map =
12576 route_map_lookup_warn_noexist(vty, argv[idx_word]->arg);
12577
12578 if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
12579 protocol = ZEBRA_ROUTE_OSPF;
12580 else
12581 protocol = ZEBRA_ROUTE_TABLE;
12582
12583 instance = strtoul(argv[idx_number]->arg, NULL, 10);
12584 metric = strtoul(argv[idx_number_2]->arg, NULL, 10);
12585
12586 red = bgp_redist_add(bgp, AFI_IP, protocol, instance);
12587 changed = bgp_redistribute_metric_set(bgp, red, AFI_IP, protocol,
12588 metric);
12589 changed |=
12590 bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map);
12591 return bgp_redistribute_set(bgp, AFI_IP, protocol, instance, changed);
12592 }
12593
12594 ALIAS_HIDDEN(
12595 bgp_redistribute_ipv4_ospf_metric_rmap,
12596 bgp_redistribute_ipv4_ospf_metric_rmap_hidden_cmd,
12597 "redistribute <ospf|table> (1-65535) metric (0-4294967295) route-map WORD",
12598 "Redistribute information from another routing protocol\n"
12599 "Open Shortest Path First (OSPFv2)\n"
12600 "Non-main Kernel Routing Table\n"
12601 "Instance ID/Table ID\n"
12602 "Metric for redistributed routes\n"
12603 "Default metric\n"
12604 "Route map reference\n"
12605 "Pointer to route-map entries\n")
12606
12607 DEFUN (no_bgp_redistribute_ipv4_ospf,
12608 no_bgp_redistribute_ipv4_ospf_cmd,
12609 "no redistribute <ospf|table> (1-65535) [{metric (0-4294967295)|route-map WORD}]",
12610 NO_STR
12611 "Redistribute information from another routing protocol\n"
12612 "Open Shortest Path First (OSPFv2)\n"
12613 "Non-main Kernel Routing Table\n"
12614 "Instance ID/Table ID\n"
12615 "Metric for redistributed routes\n"
12616 "Default metric\n"
12617 "Route map reference\n"
12618 "Pointer to route-map entries\n")
12619 {
12620 VTY_DECLVAR_CONTEXT(bgp, bgp);
12621 int idx_ospf_table = 2;
12622 int idx_number = 3;
12623 unsigned short instance;
12624 int protocol;
12625
12626 if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
12627 protocol = ZEBRA_ROUTE_OSPF;
12628 else
12629 protocol = ZEBRA_ROUTE_TABLE;
12630
12631 instance = strtoul(argv[idx_number]->arg, NULL, 10);
12632 return bgp_redistribute_unset(bgp, AFI_IP, protocol, instance);
12633 }
12634
12635 ALIAS_HIDDEN(
12636 no_bgp_redistribute_ipv4_ospf, no_bgp_redistribute_ipv4_ospf_hidden_cmd,
12637 "no redistribute <ospf|table> (1-65535) [{metric (0-4294967295)|route-map WORD}]",
12638 NO_STR
12639 "Redistribute information from another routing protocol\n"
12640 "Open Shortest Path First (OSPFv2)\n"
12641 "Non-main Kernel Routing Table\n"
12642 "Instance ID/Table ID\n"
12643 "Metric for redistributed routes\n"
12644 "Default metric\n"
12645 "Route map reference\n"
12646 "Pointer to route-map entries\n")
12647
12648 DEFUN (no_bgp_redistribute_ipv4,
12649 no_bgp_redistribute_ipv4_cmd,
12650 "no redistribute " FRR_IP_REDIST_STR_BGPD " [{metric (0-4294967295)|route-map WORD}]",
12651 NO_STR
12652 "Redistribute information from another routing protocol\n"
12653 FRR_IP_REDIST_HELP_STR_BGPD
12654 "Metric for redistributed routes\n"
12655 "Default metric\n"
12656 "Route map reference\n"
12657 "Pointer to route-map entries\n")
12658 {
12659 VTY_DECLVAR_CONTEXT(bgp, bgp);
12660 int idx_protocol = 2;
12661 int type;
12662
12663 type = proto_redistnum(AFI_IP, argv[idx_protocol]->text);
12664 if (type < 0) {
12665 vty_out(vty, "%% Invalid route type\n");
12666 return CMD_WARNING_CONFIG_FAILED;
12667 }
12668 return bgp_redistribute_unset(bgp, AFI_IP, type, 0);
12669 }
12670
12671 ALIAS_HIDDEN(
12672 no_bgp_redistribute_ipv4, no_bgp_redistribute_ipv4_hidden_cmd,
12673 "no redistribute " FRR_IP_REDIST_STR_BGPD
12674 " [{metric (0-4294967295)|route-map WORD}]",
12675 NO_STR
12676 "Redistribute information from another routing protocol\n" FRR_IP_REDIST_HELP_STR_BGPD
12677 "Metric for redistributed routes\n"
12678 "Default metric\n"
12679 "Route map reference\n"
12680 "Pointer to route-map entries\n")
12681
12682 DEFUN (bgp_redistribute_ipv6,
12683 bgp_redistribute_ipv6_cmd,
12684 "redistribute " FRR_IP6_REDIST_STR_BGPD,
12685 "Redistribute information from another routing protocol\n"
12686 FRR_IP6_REDIST_HELP_STR_BGPD)
12687 {
12688 VTY_DECLVAR_CONTEXT(bgp, bgp);
12689 int idx_protocol = 1;
12690 int type;
12691
12692 type = proto_redistnum(AFI_IP6, argv[idx_protocol]->text);
12693 if (type < 0) {
12694 vty_out(vty, "%% Invalid route type\n");
12695 return CMD_WARNING_CONFIG_FAILED;
12696 }
12697
12698 bgp_redist_add(bgp, AFI_IP6, type, 0);
12699 return bgp_redistribute_set(bgp, AFI_IP6, type, 0, false);
12700 }
12701
12702 DEFUN (bgp_redistribute_ipv6_rmap,
12703 bgp_redistribute_ipv6_rmap_cmd,
12704 "redistribute " FRR_IP6_REDIST_STR_BGPD " route-map WORD",
12705 "Redistribute information from another routing protocol\n"
12706 FRR_IP6_REDIST_HELP_STR_BGPD
12707 "Route map reference\n"
12708 "Pointer to route-map entries\n")
12709 {
12710 VTY_DECLVAR_CONTEXT(bgp, bgp);
12711 int idx_protocol = 1;
12712 int idx_word = 3;
12713 int type;
12714 struct bgp_redist *red;
12715 bool changed;
12716 struct route_map *route_map =
12717 route_map_lookup_warn_noexist(vty, argv[idx_word]->arg);
12718
12719 type = proto_redistnum(AFI_IP6, argv[idx_protocol]->text);
12720 if (type < 0) {
12721 vty_out(vty, "%% Invalid route type\n");
12722 return CMD_WARNING_CONFIG_FAILED;
12723 }
12724
12725 red = bgp_redist_add(bgp, AFI_IP6, type, 0);
12726 changed =
12727 bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map);
12728 return bgp_redistribute_set(bgp, AFI_IP6, type, 0, changed);
12729 }
12730
12731 DEFUN (bgp_redistribute_ipv6_metric,
12732 bgp_redistribute_ipv6_metric_cmd,
12733 "redistribute " FRR_IP6_REDIST_STR_BGPD " metric (0-4294967295)",
12734 "Redistribute information from another routing protocol\n"
12735 FRR_IP6_REDIST_HELP_STR_BGPD
12736 "Metric for redistributed routes\n"
12737 "Default metric\n")
12738 {
12739 VTY_DECLVAR_CONTEXT(bgp, bgp);
12740 int idx_protocol = 1;
12741 int idx_number = 3;
12742 int type;
12743 uint32_t metric;
12744 struct bgp_redist *red;
12745 bool changed;
12746
12747 type = proto_redistnum(AFI_IP6, argv[idx_protocol]->text);
12748 if (type < 0) {
12749 vty_out(vty, "%% Invalid route type\n");
12750 return CMD_WARNING_CONFIG_FAILED;
12751 }
12752 metric = strtoul(argv[idx_number]->arg, NULL, 10);
12753
12754 red = bgp_redist_add(bgp, AFI_IP6, type, 0);
12755 changed = bgp_redistribute_metric_set(bgp, red, AFI_IP6, type, metric);
12756 return bgp_redistribute_set(bgp, AFI_IP6, type, 0, changed);
12757 }
12758
12759 DEFUN (bgp_redistribute_ipv6_rmap_metric,
12760 bgp_redistribute_ipv6_rmap_metric_cmd,
12761 "redistribute " FRR_IP6_REDIST_STR_BGPD " route-map WORD metric (0-4294967295)",
12762 "Redistribute information from another routing protocol\n"
12763 FRR_IP6_REDIST_HELP_STR_BGPD
12764 "Route map reference\n"
12765 "Pointer to route-map entries\n"
12766 "Metric for redistributed routes\n"
12767 "Default metric\n")
12768 {
12769 VTY_DECLVAR_CONTEXT(bgp, bgp);
12770 int idx_protocol = 1;
12771 int idx_word = 3;
12772 int idx_number = 5;
12773 int type;
12774 uint32_t metric;
12775 struct bgp_redist *red;
12776 bool changed;
12777 struct route_map *route_map =
12778 route_map_lookup_warn_noexist(vty, argv[idx_word]->arg);
12779
12780 type = proto_redistnum(AFI_IP6, argv[idx_protocol]->text);
12781 if (type < 0) {
12782 vty_out(vty, "%% Invalid route type\n");
12783 return CMD_WARNING_CONFIG_FAILED;
12784 }
12785 metric = strtoul(argv[idx_number]->arg, NULL, 10);
12786
12787 red = bgp_redist_add(bgp, AFI_IP6, type, 0);
12788 changed =
12789 bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map);
12790 changed |= bgp_redistribute_metric_set(bgp, red, AFI_IP6, type,
12791 metric);
12792 return bgp_redistribute_set(bgp, AFI_IP6, type, 0, changed);
12793 }
12794
12795 DEFUN (bgp_redistribute_ipv6_metric_rmap,
12796 bgp_redistribute_ipv6_metric_rmap_cmd,
12797 "redistribute " FRR_IP6_REDIST_STR_BGPD " metric (0-4294967295) route-map WORD",
12798 "Redistribute information from another routing protocol\n"
12799 FRR_IP6_REDIST_HELP_STR_BGPD
12800 "Metric for redistributed routes\n"
12801 "Default metric\n"
12802 "Route map reference\n"
12803 "Pointer to route-map entries\n")
12804 {
12805 VTY_DECLVAR_CONTEXT(bgp, bgp);
12806 int idx_protocol = 1;
12807 int idx_number = 3;
12808 int idx_word = 5;
12809 int type;
12810 uint32_t metric;
12811 struct bgp_redist *red;
12812 bool changed;
12813 struct route_map *route_map =
12814 route_map_lookup_warn_noexist(vty, argv[idx_word]->arg);
12815
12816 type = proto_redistnum(AFI_IP6, argv[idx_protocol]->text);
12817 if (type < 0) {
12818 vty_out(vty, "%% Invalid route type\n");
12819 return CMD_WARNING_CONFIG_FAILED;
12820 }
12821 metric = strtoul(argv[idx_number]->arg, NULL, 10);
12822
12823 red = bgp_redist_add(bgp, AFI_IP6, type, 0);
12824 changed = bgp_redistribute_metric_set(bgp, red, AFI_IP6, SAFI_UNICAST,
12825 metric);
12826 changed |=
12827 bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map);
12828 return bgp_redistribute_set(bgp, AFI_IP6, type, 0, changed);
12829 }
12830
12831 DEFUN (no_bgp_redistribute_ipv6,
12832 no_bgp_redistribute_ipv6_cmd,
12833 "no redistribute " FRR_IP6_REDIST_STR_BGPD " [{metric (0-4294967295)|route-map WORD}]",
12834 NO_STR
12835 "Redistribute information from another routing protocol\n"
12836 FRR_IP6_REDIST_HELP_STR_BGPD
12837 "Metric for redistributed routes\n"
12838 "Default metric\n"
12839 "Route map reference\n"
12840 "Pointer to route-map entries\n")
12841 {
12842 VTY_DECLVAR_CONTEXT(bgp, bgp);
12843 int idx_protocol = 2;
12844 int type;
12845
12846 type = proto_redistnum(AFI_IP6, argv[idx_protocol]->text);
12847 if (type < 0) {
12848 vty_out(vty, "%% Invalid route type\n");
12849 return CMD_WARNING_CONFIG_FAILED;
12850 }
12851
12852 return bgp_redistribute_unset(bgp, AFI_IP6, type, 0);
12853 }
12854
12855 static void bgp_config_write_redistribute(struct vty *vty, struct bgp *bgp,
12856 afi_t afi, safi_t safi)
12857 {
12858 int i;
12859
12860 /* Unicast redistribution only. */
12861 if (safi != SAFI_UNICAST)
12862 return;
12863
12864 for (i = 0; i < ZEBRA_ROUTE_MAX; i++) {
12865 /* Redistribute BGP does not make sense. */
12866 if (i != ZEBRA_ROUTE_BGP) {
12867 struct list *red_list;
12868 struct listnode *node;
12869 struct bgp_redist *red;
12870
12871 red_list = bgp->redist[afi][i];
12872 if (!red_list)
12873 continue;
12874
12875 for (ALL_LIST_ELEMENTS_RO(red_list, node, red)) {
12876 /* "redistribute" configuration. */
12877 vty_out(vty, " redistribute %s",
12878 zebra_route_string(i));
12879 if (red->instance)
12880 vty_out(vty, " %d", red->instance);
12881 if (red->redist_metric_flag)
12882 vty_out(vty, " metric %u",
12883 red->redist_metric);
12884 if (red->rmap.name)
12885 vty_out(vty, " route-map %s",
12886 red->rmap.name);
12887 vty_out(vty, "\n");
12888 }
12889 }
12890 }
12891 }
12892
12893 /* peer-group helpers for config-write */
12894
12895 static bool peergroup_flag_check(struct peer *peer, uint32_t flag)
12896 {
12897 if (!peer_group_active(peer)) {
12898 if (CHECK_FLAG(peer->flags_invert, flag))
12899 return !CHECK_FLAG(peer->flags, flag);
12900 else
12901 return !!CHECK_FLAG(peer->flags, flag);
12902 }
12903
12904 return !!CHECK_FLAG(peer->flags_override, flag);
12905 }
12906
12907 static bool peergroup_af_flag_check(struct peer *peer, afi_t afi, safi_t safi,
12908 uint32_t flag)
12909 {
12910 if (!peer_group_active(peer)) {
12911 if (CHECK_FLAG(peer->af_flags_invert[afi][safi], flag))
12912 return !peer_af_flag_check(peer, afi, safi, flag);
12913 else
12914 return !!peer_af_flag_check(peer, afi, safi, flag);
12915 }
12916
12917 return !!CHECK_FLAG(peer->af_flags_override[afi][safi], flag);
12918 }
12919
12920 static bool peergroup_filter_check(struct peer *peer, afi_t afi, safi_t safi,
12921 uint8_t type, int direct)
12922 {
12923 struct bgp_filter *filter;
12924
12925 if (peer_group_active(peer))
12926 return !!CHECK_FLAG(peer->filter_override[afi][safi][direct],
12927 type);
12928
12929 filter = &peer->filter[afi][safi];
12930 switch (type) {
12931 case PEER_FT_DISTRIBUTE_LIST:
12932 return !!(filter->dlist[direct].name);
12933 case PEER_FT_FILTER_LIST:
12934 return !!(filter->aslist[direct].name);
12935 case PEER_FT_PREFIX_LIST:
12936 return !!(filter->plist[direct].name);
12937 case PEER_FT_ROUTE_MAP:
12938 return !!(filter->map[direct].name);
12939 case PEER_FT_UNSUPPRESS_MAP:
12940 return !!(filter->usmap.name);
12941 default:
12942 return false;
12943 }
12944 }
12945
12946 /* Return true if the addpath type is set for peer and different from
12947 * peer-group.
12948 */
12949 static int peergroup_af_addpath_check(struct peer *peer, afi_t afi, safi_t safi)
12950 {
12951 enum bgp_addpath_strat type, g_type;
12952
12953 type = peer->addpath_type[afi][safi];
12954
12955 if (type != BGP_ADDPATH_NONE) {
12956 if (peer_group_active(peer)) {
12957 g_type = peer->group->conf->addpath_type[afi][safi];
12958
12959 if (type != g_type)
12960 return 1;
12961 else
12962 return 0;
12963 }
12964
12965 return 1;
12966 }
12967
12968 return 0;
12969 }
12970
12971 /* This is part of the address-family block (unicast only) */
12972 static void bgp_vpn_policy_config_write_afi(struct vty *vty, struct bgp *bgp,
12973 afi_t afi)
12974 {
12975 int indent = 2;
12976
12977 if (bgp->vpn_policy[afi].rmap_name[BGP_VPN_POLICY_DIR_FROMVPN]) {
12978 if (listcount(bgp->vpn_policy[afi].import_vrf))
12979 vty_out(vty, "%*simport vrf route-map %s\n", indent, "",
12980 bgp->vpn_policy[afi]
12981 .rmap_name[BGP_VPN_POLICY_DIR_FROMVPN]);
12982 else
12983 vty_out(vty, "%*sroute-map vpn import %s\n", indent, "",
12984 bgp->vpn_policy[afi]
12985 .rmap_name[BGP_VPN_POLICY_DIR_FROMVPN]);
12986 }
12987 if (CHECK_FLAG(bgp->af_flags[afi][SAFI_UNICAST],
12988 BGP_CONFIG_VRF_TO_VRF_IMPORT)
12989 || CHECK_FLAG(bgp->af_flags[afi][SAFI_UNICAST],
12990 BGP_CONFIG_VRF_TO_VRF_EXPORT))
12991 return;
12992
12993 if (CHECK_FLAG(bgp->vpn_policy[afi].flags,
12994 BGP_VPN_POLICY_TOVPN_LABEL_AUTO)) {
12995
12996 vty_out(vty, "%*slabel vpn export %s\n", indent, "", "auto");
12997
12998 } else {
12999 if (bgp->vpn_policy[afi].tovpn_label != MPLS_LABEL_NONE) {
13000 vty_out(vty, "%*slabel vpn export %u\n", indent, "",
13001 bgp->vpn_policy[afi].tovpn_label);
13002 }
13003 }
13004 if (CHECK_FLAG(bgp->vpn_policy[afi].flags,
13005 BGP_VPN_POLICY_TOVPN_RD_SET)) {
13006 char buf[RD_ADDRSTRLEN];
13007 vty_out(vty, "%*srd vpn export %s\n", indent, "",
13008 prefix_rd2str(&bgp->vpn_policy[afi].tovpn_rd, buf,
13009 sizeof(buf)));
13010 }
13011 if (CHECK_FLAG(bgp->vpn_policy[afi].flags,
13012 BGP_VPN_POLICY_TOVPN_NEXTHOP_SET)) {
13013
13014 char buf[PREFIX_STRLEN];
13015 if (inet_ntop(bgp->vpn_policy[afi].tovpn_nexthop.family,
13016 &bgp->vpn_policy[afi].tovpn_nexthop.u.prefix, buf,
13017 sizeof(buf))) {
13018
13019 vty_out(vty, "%*snexthop vpn export %s\n",
13020 indent, "", buf);
13021 }
13022 }
13023 if (bgp->vpn_policy[afi].rtlist[BGP_VPN_POLICY_DIR_FROMVPN]
13024 && bgp->vpn_policy[afi].rtlist[BGP_VPN_POLICY_DIR_TOVPN]
13025 && ecommunity_cmp(
13026 bgp->vpn_policy[afi].rtlist[BGP_VPN_POLICY_DIR_FROMVPN],
13027 bgp->vpn_policy[afi].rtlist[BGP_VPN_POLICY_DIR_TOVPN])) {
13028
13029 char *b = ecommunity_ecom2str(
13030 bgp->vpn_policy[afi].rtlist[BGP_VPN_POLICY_DIR_TOVPN],
13031 ECOMMUNITY_FORMAT_ROUTE_MAP, ECOMMUNITY_ROUTE_TARGET);
13032 vty_out(vty, "%*srt vpn both %s\n", indent, "", b);
13033 XFREE(MTYPE_ECOMMUNITY_STR, b);
13034 } else {
13035 if (bgp->vpn_policy[afi].rtlist[BGP_VPN_POLICY_DIR_FROMVPN]) {
13036 char *b = ecommunity_ecom2str(
13037 bgp->vpn_policy[afi]
13038 .rtlist[BGP_VPN_POLICY_DIR_FROMVPN],
13039 ECOMMUNITY_FORMAT_ROUTE_MAP,
13040 ECOMMUNITY_ROUTE_TARGET);
13041 vty_out(vty, "%*srt vpn import %s\n", indent, "", b);
13042 XFREE(MTYPE_ECOMMUNITY_STR, b);
13043 }
13044 if (bgp->vpn_policy[afi].rtlist[BGP_VPN_POLICY_DIR_TOVPN]) {
13045 char *b = ecommunity_ecom2str(
13046 bgp->vpn_policy[afi]
13047 .rtlist[BGP_VPN_POLICY_DIR_TOVPN],
13048 ECOMMUNITY_FORMAT_ROUTE_MAP,
13049 ECOMMUNITY_ROUTE_TARGET);
13050 vty_out(vty, "%*srt vpn export %s\n", indent, "", b);
13051 XFREE(MTYPE_ECOMMUNITY_STR, b);
13052 }
13053 }
13054
13055 if (bgp->vpn_policy[afi].rmap_name[BGP_VPN_POLICY_DIR_TOVPN])
13056 vty_out(vty, "%*sroute-map vpn export %s\n", indent, "",
13057 bgp->vpn_policy[afi]
13058 .rmap_name[BGP_VPN_POLICY_DIR_TOVPN]);
13059
13060 if (bgp->vpn_policy[afi].import_redirect_rtlist) {
13061 char *b = ecommunity_ecom2str(
13062 bgp->vpn_policy[afi]
13063 .import_redirect_rtlist,
13064 ECOMMUNITY_FORMAT_ROUTE_MAP,
13065 ECOMMUNITY_ROUTE_TARGET);
13066
13067 vty_out(vty, "%*srt redirect import %s\n", indent, "", b);
13068 XFREE(MTYPE_ECOMMUNITY_STR, b);
13069 }
13070 }
13071
13072 static void bgp_config_write_filter(struct vty *vty, struct peer *peer,
13073 afi_t afi, safi_t safi)
13074 {
13075 struct bgp_filter *filter;
13076 char *addr;
13077
13078 addr = peer->host;
13079 filter = &peer->filter[afi][safi];
13080
13081 /* distribute-list. */
13082 if (peergroup_filter_check(peer, afi, safi, PEER_FT_DISTRIBUTE_LIST,
13083 FILTER_IN))
13084 vty_out(vty, " neighbor %s distribute-list %s in\n", addr,
13085 filter->dlist[FILTER_IN].name);
13086
13087 if (peergroup_filter_check(peer, afi, safi, PEER_FT_DISTRIBUTE_LIST,
13088 FILTER_OUT))
13089 vty_out(vty, " neighbor %s distribute-list %s out\n", addr,
13090 filter->dlist[FILTER_OUT].name);
13091
13092 /* prefix-list. */
13093 if (peergroup_filter_check(peer, afi, safi, PEER_FT_PREFIX_LIST,
13094 FILTER_IN))
13095 vty_out(vty, " neighbor %s prefix-list %s in\n", addr,
13096 filter->plist[FILTER_IN].name);
13097
13098 if (peergroup_filter_check(peer, afi, safi, PEER_FT_PREFIX_LIST,
13099 FILTER_OUT))
13100 vty_out(vty, " neighbor %s prefix-list %s out\n", addr,
13101 filter->plist[FILTER_OUT].name);
13102
13103 /* route-map. */
13104 if (peergroup_filter_check(peer, afi, safi, PEER_FT_ROUTE_MAP, RMAP_IN))
13105 vty_out(vty, " neighbor %s route-map %s in\n", addr,
13106 filter->map[RMAP_IN].name);
13107
13108 if (peergroup_filter_check(peer, afi, safi, PEER_FT_ROUTE_MAP,
13109 RMAP_OUT))
13110 vty_out(vty, " neighbor %s route-map %s out\n", addr,
13111 filter->map[RMAP_OUT].name);
13112
13113 /* unsuppress-map */
13114 if (peergroup_filter_check(peer, afi, safi, PEER_FT_UNSUPPRESS_MAP, 0))
13115 vty_out(vty, " neighbor %s unsuppress-map %s\n", addr,
13116 filter->usmap.name);
13117
13118 /* filter-list. */
13119 if (peergroup_filter_check(peer, afi, safi, PEER_FT_FILTER_LIST,
13120 FILTER_IN))
13121 vty_out(vty, " neighbor %s filter-list %s in\n", addr,
13122 filter->aslist[FILTER_IN].name);
13123
13124 if (peergroup_filter_check(peer, afi, safi, PEER_FT_FILTER_LIST,
13125 FILTER_OUT))
13126 vty_out(vty, " neighbor %s filter-list %s out\n", addr,
13127 filter->aslist[FILTER_OUT].name);
13128 }
13129
13130 /* BGP peer configuration display function. */
13131 static void bgp_config_write_peer_global(struct vty *vty, struct bgp *bgp,
13132 struct peer *peer)
13133 {
13134 struct peer *g_peer = NULL;
13135 char buf[SU_ADDRSTRLEN];
13136 char *addr;
13137 int if_pg_printed = false;
13138 int if_ras_printed = false;
13139
13140 /* Skip dynamic neighbors. */
13141 if (peer_dynamic_neighbor(peer))
13142 return;
13143
13144 if (peer->conf_if)
13145 addr = peer->conf_if;
13146 else
13147 addr = peer->host;
13148
13149 /************************************
13150 ****** Global to the neighbor ******
13151 ************************************/
13152 if (peer->conf_if) {
13153 if (CHECK_FLAG(peer->flags, PEER_FLAG_IFPEER_V6ONLY))
13154 vty_out(vty, " neighbor %s interface v6only", addr);
13155 else
13156 vty_out(vty, " neighbor %s interface", addr);
13157
13158 if (peer_group_active(peer)) {
13159 vty_out(vty, " peer-group %s", peer->group->name);
13160 if_pg_printed = true;
13161 } else if (peer->as_type == AS_SPECIFIED) {
13162 vty_out(vty, " remote-as %u", peer->as);
13163 if_ras_printed = true;
13164 } else if (peer->as_type == AS_INTERNAL) {
13165 vty_out(vty, " remote-as internal");
13166 if_ras_printed = true;
13167 } else if (peer->as_type == AS_EXTERNAL) {
13168 vty_out(vty, " remote-as external");
13169 if_ras_printed = true;
13170 }
13171
13172 vty_out(vty, "\n");
13173 }
13174
13175 /* remote-as and peer-group */
13176 /* peer is a member of a peer-group */
13177 if (peer_group_active(peer)) {
13178 g_peer = peer->group->conf;
13179
13180 if (g_peer->as_type == AS_UNSPECIFIED && !if_ras_printed) {
13181 if (peer->as_type == AS_SPECIFIED) {
13182 vty_out(vty, " neighbor %s remote-as %u\n",
13183 addr, peer->as);
13184 } else if (peer->as_type == AS_INTERNAL) {
13185 vty_out(vty,
13186 " neighbor %s remote-as internal\n",
13187 addr);
13188 } else if (peer->as_type == AS_EXTERNAL) {
13189 vty_out(vty,
13190 " neighbor %s remote-as external\n",
13191 addr);
13192 }
13193 }
13194
13195 /* For swpX peers we displayed the peer-group
13196 * via 'neighbor swpX interface peer-group PGNAME' */
13197 if (!if_pg_printed)
13198 vty_out(vty, " neighbor %s peer-group %s\n", addr,
13199 peer->group->name);
13200 }
13201
13202 /* peer is NOT a member of a peer-group */
13203 else {
13204 /* peer is a peer-group, declare the peer-group */
13205 if (CHECK_FLAG(peer->sflags, PEER_STATUS_GROUP)) {
13206 vty_out(vty, " neighbor %s peer-group\n", addr);
13207 }
13208
13209 if (!if_ras_printed) {
13210 if (peer->as_type == AS_SPECIFIED) {
13211 vty_out(vty, " neighbor %s remote-as %u\n",
13212 addr, peer->as);
13213 } else if (peer->as_type == AS_INTERNAL) {
13214 vty_out(vty,
13215 " neighbor %s remote-as internal\n",
13216 addr);
13217 } else if (peer->as_type == AS_EXTERNAL) {
13218 vty_out(vty,
13219 " neighbor %s remote-as external\n",
13220 addr);
13221 }
13222 }
13223 }
13224
13225 /* local-as */
13226 if (peergroup_flag_check(peer, PEER_FLAG_LOCAL_AS)) {
13227 vty_out(vty, " neighbor %s local-as %u", addr,
13228 peer->change_local_as);
13229 if (peergroup_flag_check(peer, PEER_FLAG_LOCAL_AS_NO_PREPEND))
13230 vty_out(vty, " no-prepend");
13231 if (peergroup_flag_check(peer, PEER_FLAG_LOCAL_AS_REPLACE_AS))
13232 vty_out(vty, " replace-as");
13233 vty_out(vty, "\n");
13234 }
13235
13236 /* description */
13237 if (peer->desc) {
13238 vty_out(vty, " neighbor %s description %s\n", addr, peer->desc);
13239 }
13240
13241 /* shutdown */
13242 if (peergroup_flag_check(peer, PEER_FLAG_SHUTDOWN)) {
13243 if (peer->tx_shutdown_message)
13244 vty_out(vty, " neighbor %s shutdown message %s\n", addr,
13245 peer->tx_shutdown_message);
13246 else
13247 vty_out(vty, " neighbor %s shutdown\n", addr);
13248 }
13249
13250 /* bfd */
13251 if (peer->bfd_info) {
13252 if (!peer_group_active(peer) || !g_peer->bfd_info) {
13253 bgp_bfd_peer_config_write(vty, peer, addr);
13254 }
13255 }
13256
13257 /* password */
13258 if (peergroup_flag_check(peer, PEER_FLAG_PASSWORD))
13259 vty_out(vty, " neighbor %s password %s\n", addr,
13260 peer->password);
13261
13262 /* neighbor solo */
13263 if (CHECK_FLAG(peer->flags, PEER_FLAG_LONESOUL)) {
13264 if (!peer_group_active(peer)) {
13265 vty_out(vty, " neighbor %s solo\n", addr);
13266 }
13267 }
13268
13269 /* BGP port */
13270 if (peer->port != BGP_PORT_DEFAULT) {
13271 vty_out(vty, " neighbor %s port %d\n", addr, peer->port);
13272 }
13273
13274 /* Local interface name */
13275 if (peer->ifname) {
13276 vty_out(vty, " neighbor %s interface %s\n", addr, peer->ifname);
13277 }
13278
13279 /* passive */
13280 if (peergroup_flag_check(peer, PEER_FLAG_PASSIVE))
13281 vty_out(vty, " neighbor %s passive\n", addr);
13282
13283 /* ebgp-multihop */
13284 if (peer->sort != BGP_PEER_IBGP && peer->ttl != BGP_DEFAULT_TTL
13285 && !(peer->gtsm_hops != 0 && peer->ttl == MAXTTL)) {
13286 if (!peer_group_active(peer) || g_peer->ttl != peer->ttl) {
13287 vty_out(vty, " neighbor %s ebgp-multihop %d\n", addr,
13288 peer->ttl);
13289 }
13290 }
13291
13292 /* ttl-security hops */
13293 if (peer->gtsm_hops != 0) {
13294 if (!peer_group_active(peer)
13295 || g_peer->gtsm_hops != peer->gtsm_hops) {
13296 vty_out(vty, " neighbor %s ttl-security hops %d\n",
13297 addr, peer->gtsm_hops);
13298 }
13299 }
13300
13301 /* disable-connected-check */
13302 if (peergroup_flag_check(peer, PEER_FLAG_DISABLE_CONNECTED_CHECK))
13303 vty_out(vty, " neighbor %s disable-connected-check\n", addr);
13304
13305 /* enforce-first-as */
13306 if (peergroup_flag_check(peer, PEER_FLAG_ENFORCE_FIRST_AS))
13307 vty_out(vty, " neighbor %s enforce-first-as\n", addr);
13308
13309 /* update-source */
13310 if (peergroup_flag_check(peer, PEER_FLAG_UPDATE_SOURCE)) {
13311 if (peer->update_source)
13312 vty_out(vty, " neighbor %s update-source %s\n", addr,
13313 sockunion2str(peer->update_source, buf,
13314 SU_ADDRSTRLEN));
13315 else if (peer->update_if)
13316 vty_out(vty, " neighbor %s update-source %s\n", addr,
13317 peer->update_if);
13318 }
13319
13320 /* advertisement-interval */
13321 if (peergroup_flag_check(peer, PEER_FLAG_ROUTEADV))
13322 vty_out(vty, " neighbor %s advertisement-interval %u\n", addr,
13323 peer->routeadv);
13324
13325 /* timers */
13326 if (peergroup_flag_check(peer, PEER_FLAG_TIMER))
13327 vty_out(vty, " neighbor %s timers %u %u\n", addr,
13328 peer->keepalive, peer->holdtime);
13329
13330 /* timers connect */
13331 if (peergroup_flag_check(peer, PEER_FLAG_TIMER_CONNECT))
13332 vty_out(vty, " neighbor %s timers connect %u\n", addr,
13333 peer->connect);
13334 /* need special-case handling for changed default values due to
13335 * config profile / version (because there is no "timers bgp connect"
13336 * command, we need to save this per-peer :/)
13337 */
13338 else if (!peer_group_active(peer) && !peer->connect &&
13339 peer->bgp->default_connect_retry != SAVE_BGP_CONNECT_RETRY)
13340 vty_out(vty, " neighbor %s timers connect %u\n", addr,
13341 peer->bgp->default_connect_retry);
13342
13343 /* capability dynamic */
13344 if (peergroup_flag_check(peer, PEER_FLAG_DYNAMIC_CAPABILITY))
13345 vty_out(vty, " neighbor %s capability dynamic\n", addr);
13346
13347 /* capability extended-nexthop */
13348 if (peergroup_flag_check(peer, PEER_FLAG_CAPABILITY_ENHE)) {
13349 if (!peer->conf_if) {
13350 if (CHECK_FLAG(peer->flags_invert,
13351 PEER_FLAG_CAPABILITY_ENHE))
13352 vty_out(vty,
13353 " no neighbor %s capability extended-nexthop\n",
13354 addr);
13355 else
13356 vty_out(vty,
13357 " neighbor %s capability extended-nexthop\n",
13358 addr);
13359 }
13360 }
13361
13362 /* dont-capability-negotiation */
13363 if (peergroup_flag_check(peer, PEER_FLAG_DONT_CAPABILITY))
13364 vty_out(vty, " neighbor %s dont-capability-negotiate\n", addr);
13365
13366 /* override-capability */
13367 if (peergroup_flag_check(peer, PEER_FLAG_OVERRIDE_CAPABILITY))
13368 vty_out(vty, " neighbor %s override-capability\n", addr);
13369
13370 /* strict-capability-match */
13371 if (peergroup_flag_check(peer, PEER_FLAG_STRICT_CAP_MATCH))
13372 vty_out(vty, " neighbor %s strict-capability-match\n", addr);
13373
13374 /* Sender side AS path loop detection. */
13375 if (peer->as_path_loop_detection)
13376 vty_out(vty, " neighbor %s sender-as-path-loop-detection\n",
13377 addr);
13378 }
13379
13380 /* BGP peer configuration display function. */
13381 static void bgp_config_write_peer_af(struct vty *vty, struct bgp *bgp,
13382 struct peer *peer, afi_t afi, safi_t safi)
13383 {
13384 struct peer *g_peer = NULL;
13385 char *addr;
13386 bool flag_scomm, flag_secomm, flag_slcomm;
13387
13388 /* Skip dynamic neighbors. */
13389 if (peer_dynamic_neighbor(peer))
13390 return;
13391
13392 if (peer->conf_if)
13393 addr = peer->conf_if;
13394 else
13395 addr = peer->host;
13396
13397 /************************************
13398 ****** Per AF to the neighbor ******
13399 ************************************/
13400 if (peer_group_active(peer)) {
13401 g_peer = peer->group->conf;
13402
13403 /* If the peer-group is active but peer is not, print a 'no
13404 * activate' */
13405 if (g_peer->afc[afi][safi] && !peer->afc[afi][safi]) {
13406 vty_out(vty, " no neighbor %s activate\n", addr);
13407 }
13408
13409 /* If the peer-group is not active but peer is, print an
13410 'activate' */
13411 else if (!g_peer->afc[afi][safi] && peer->afc[afi][safi]) {
13412 vty_out(vty, " neighbor %s activate\n", addr);
13413 }
13414 } else {
13415 if (peer->afc[afi][safi]) {
13416 if ((afi == AFI_IP) && (safi == SAFI_UNICAST)) {
13417 if (bgp_flag_check(bgp,
13418 BGP_FLAG_NO_DEFAULT_IPV4)) {
13419 vty_out(vty, " neighbor %s activate\n",
13420 addr);
13421 }
13422 } else
13423 vty_out(vty, " neighbor %s activate\n", addr);
13424 } else {
13425 if ((afi == AFI_IP) && (safi == SAFI_UNICAST)) {
13426 if (!bgp_flag_check(bgp,
13427 BGP_FLAG_NO_DEFAULT_IPV4)) {
13428 vty_out(vty,
13429 " no neighbor %s activate\n",
13430 addr);
13431 }
13432 }
13433 }
13434 }
13435
13436 /* addpath TX knobs */
13437 if (peergroup_af_addpath_check(peer, afi, safi)) {
13438 switch (peer->addpath_type[afi][safi]) {
13439 case BGP_ADDPATH_ALL:
13440 vty_out(vty, " neighbor %s addpath-tx-all-paths\n",
13441 addr);
13442 break;
13443 case BGP_ADDPATH_BEST_PER_AS:
13444 vty_out(vty,
13445 " neighbor %s addpath-tx-bestpath-per-AS\n",
13446 addr);
13447 break;
13448 case BGP_ADDPATH_MAX:
13449 case BGP_ADDPATH_NONE:
13450 break;
13451 }
13452 }
13453
13454 /* ORF capability. */
13455 if (peergroup_af_flag_check(peer, afi, safi, PEER_FLAG_ORF_PREFIX_SM)
13456 || peergroup_af_flag_check(peer, afi, safi,
13457 PEER_FLAG_ORF_PREFIX_RM)) {
13458 vty_out(vty, " neighbor %s capability orf prefix-list", addr);
13459
13460 if (peergroup_af_flag_check(peer, afi, safi,
13461 PEER_FLAG_ORF_PREFIX_SM)
13462 && peergroup_af_flag_check(peer, afi, safi,
13463 PEER_FLAG_ORF_PREFIX_RM))
13464 vty_out(vty, " both");
13465 else if (peergroup_af_flag_check(peer, afi, safi,
13466 PEER_FLAG_ORF_PREFIX_SM))
13467 vty_out(vty, " send");
13468 else
13469 vty_out(vty, " receive");
13470 vty_out(vty, "\n");
13471 }
13472
13473 /* BGP flag dampening. */
13474 if (CHECK_FLAG(bgp->af_flags[afi][safi],
13475 BGP_CONFIG_DAMPENING))
13476 bgp_config_write_damp(vty, afi, safi);
13477
13478 /* Route reflector client. */
13479 if (peergroup_af_flag_check(peer, afi, safi,
13480 PEER_FLAG_REFLECTOR_CLIENT)) {
13481 vty_out(vty, " neighbor %s route-reflector-client\n", addr);
13482 }
13483
13484 /* next-hop-self force */
13485 if (peergroup_af_flag_check(peer, afi, safi,
13486 PEER_FLAG_FORCE_NEXTHOP_SELF)) {
13487 vty_out(vty, " neighbor %s next-hop-self force\n", addr);
13488 }
13489
13490 /* next-hop-self */
13491 if (peergroup_af_flag_check(peer, afi, safi, PEER_FLAG_NEXTHOP_SELF)) {
13492 vty_out(vty, " neighbor %s next-hop-self\n", addr);
13493 }
13494
13495 /* remove-private-AS */
13496 if (peergroup_af_flag_check(peer, afi, safi,
13497 PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE)) {
13498 vty_out(vty, " neighbor %s remove-private-AS all replace-AS\n",
13499 addr);
13500 }
13501
13502 else if (peergroup_af_flag_check(peer, afi, safi,
13503 PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE)) {
13504 vty_out(vty, " neighbor %s remove-private-AS replace-AS\n",
13505 addr);
13506 }
13507
13508 else if (peergroup_af_flag_check(peer, afi, safi,
13509 PEER_FLAG_REMOVE_PRIVATE_AS_ALL)) {
13510 vty_out(vty, " neighbor %s remove-private-AS all\n", addr);
13511 }
13512
13513 else if (peergroup_af_flag_check(peer, afi, safi,
13514 PEER_FLAG_REMOVE_PRIVATE_AS)) {
13515 vty_out(vty, " neighbor %s remove-private-AS\n", addr);
13516 }
13517
13518 /* as-override */
13519 if (peergroup_af_flag_check(peer, afi, safi, PEER_FLAG_AS_OVERRIDE)) {
13520 vty_out(vty, " neighbor %s as-override\n", addr);
13521 }
13522
13523 /* send-community print. */
13524 flag_scomm = peergroup_af_flag_check(peer, afi, safi,
13525 PEER_FLAG_SEND_COMMUNITY);
13526 flag_secomm = peergroup_af_flag_check(peer, afi, safi,
13527 PEER_FLAG_SEND_EXT_COMMUNITY);
13528 flag_slcomm = peergroup_af_flag_check(peer, afi, safi,
13529 PEER_FLAG_SEND_LARGE_COMMUNITY);
13530
13531 if (flag_scomm && flag_secomm && flag_slcomm) {
13532 vty_out(vty, " no neighbor %s send-community all\n", addr);
13533 } else {
13534 if (flag_scomm)
13535 vty_out(vty, " no neighbor %s send-community\n", addr);
13536 if (flag_secomm)
13537 vty_out(vty,
13538 " no neighbor %s send-community extended\n",
13539 addr);
13540
13541 if (flag_slcomm)
13542 vty_out(vty, " no neighbor %s send-community large\n",
13543 addr);
13544 }
13545
13546 /* Default information */
13547 if (peergroup_af_flag_check(peer, afi, safi,
13548 PEER_FLAG_DEFAULT_ORIGINATE)) {
13549 vty_out(vty, " neighbor %s default-originate", addr);
13550
13551 if (peer->default_rmap[afi][safi].name)
13552 vty_out(vty, " route-map %s",
13553 peer->default_rmap[afi][safi].name);
13554
13555 vty_out(vty, "\n");
13556 }
13557
13558 /* Soft reconfiguration inbound. */
13559 if (peergroup_af_flag_check(peer, afi, safi, PEER_FLAG_SOFT_RECONFIG)) {
13560 vty_out(vty, " neighbor %s soft-reconfiguration inbound\n",
13561 addr);
13562 }
13563
13564 /* maximum-prefix. */
13565 if (peergroup_af_flag_check(peer, afi, safi, PEER_FLAG_MAX_PREFIX)) {
13566 vty_out(vty, " neighbor %s maximum-prefix %" PRIu32, addr,
13567 peer->pmax[afi][safi]);
13568
13569 if (peer->pmax_threshold[afi][safi]
13570 != MAXIMUM_PREFIX_THRESHOLD_DEFAULT)
13571 vty_out(vty, " %u", peer->pmax_threshold[afi][safi]);
13572 if (peer_af_flag_check(peer, afi, safi,
13573 PEER_FLAG_MAX_PREFIX_WARNING))
13574 vty_out(vty, " warning-only");
13575 if (peer->pmax_restart[afi][safi])
13576 vty_out(vty, " restart %u",
13577 peer->pmax_restart[afi][safi]);
13578
13579 vty_out(vty, "\n");
13580 }
13581
13582 /* Route server client. */
13583 if (peergroup_af_flag_check(peer, afi, safi,
13584 PEER_FLAG_RSERVER_CLIENT)) {
13585 vty_out(vty, " neighbor %s route-server-client\n", addr);
13586 }
13587
13588 /* Nexthop-local unchanged. */
13589 if (peergroup_af_flag_check(peer, afi, safi,
13590 PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED)) {
13591 vty_out(vty, " neighbor %s nexthop-local unchanged\n", addr);
13592 }
13593
13594 /* allowas-in <1-10> */
13595 if (peergroup_af_flag_check(peer, afi, safi, PEER_FLAG_ALLOWAS_IN)) {
13596 if (peer_af_flag_check(peer, afi, safi,
13597 PEER_FLAG_ALLOWAS_IN_ORIGIN)) {
13598 vty_out(vty, " neighbor %s allowas-in origin\n", addr);
13599 } else if (peer->allowas_in[afi][safi] == 3) {
13600 vty_out(vty, " neighbor %s allowas-in\n", addr);
13601 } else {
13602 vty_out(vty, " neighbor %s allowas-in %d\n", addr,
13603 peer->allowas_in[afi][safi]);
13604 }
13605 }
13606
13607 /* weight */
13608 if (peergroup_af_flag_check(peer, afi, safi, PEER_FLAG_WEIGHT))
13609 vty_out(vty, " neighbor %s weight %lu\n", addr,
13610 peer->weight[afi][safi]);
13611
13612 /* Filter. */
13613 bgp_config_write_filter(vty, peer, afi, safi);
13614
13615 /* atribute-unchanged. */
13616 if (peer_af_flag_check(peer, afi, safi, PEER_FLAG_AS_PATH_UNCHANGED)
13617 || (safi != SAFI_EVPN
13618 && peer_af_flag_check(peer, afi, safi,
13619 PEER_FLAG_NEXTHOP_UNCHANGED))
13620 || peer_af_flag_check(peer, afi, safi, PEER_FLAG_MED_UNCHANGED)) {
13621
13622 if (!peer_group_active(peer)
13623 || peergroup_af_flag_check(peer, afi, safi,
13624 PEER_FLAG_AS_PATH_UNCHANGED)
13625 || peergroup_af_flag_check(peer, afi, safi,
13626 PEER_FLAG_NEXTHOP_UNCHANGED)
13627 || peergroup_af_flag_check(peer, afi, safi,
13628 PEER_FLAG_MED_UNCHANGED)) {
13629
13630 vty_out(vty,
13631 " neighbor %s attribute-unchanged%s%s%s\n",
13632 addr,
13633 peer_af_flag_check(peer, afi, safi,
13634 PEER_FLAG_AS_PATH_UNCHANGED)
13635 ? " as-path"
13636 : "",
13637 peer_af_flag_check(peer, afi, safi,
13638 PEER_FLAG_NEXTHOP_UNCHANGED)
13639 ? " next-hop"
13640 : "",
13641 peer_af_flag_check(peer, afi, safi,
13642 PEER_FLAG_MED_UNCHANGED)
13643 ? " med"
13644 : "");
13645 }
13646 }
13647 }
13648
13649 /* Address family based peer configuration display. */
13650 static void bgp_config_write_family(struct vty *vty, struct bgp *bgp, afi_t afi,
13651 safi_t safi)
13652 {
13653 struct peer *peer;
13654 struct peer_group *group;
13655 struct listnode *node, *nnode;
13656
13657
13658 vty_frame(vty, " !\n address-family ");
13659 if (afi == AFI_IP) {
13660 if (safi == SAFI_UNICAST)
13661 vty_frame(vty, "ipv4 unicast");
13662 else if (safi == SAFI_LABELED_UNICAST)
13663 vty_frame(vty, "ipv4 labeled-unicast");
13664 else if (safi == SAFI_MULTICAST)
13665 vty_frame(vty, "ipv4 multicast");
13666 else if (safi == SAFI_MPLS_VPN)
13667 vty_frame(vty, "ipv4 vpn");
13668 else if (safi == SAFI_ENCAP)
13669 vty_frame(vty, "ipv4 encap");
13670 else if (safi == SAFI_FLOWSPEC)
13671 vty_frame(vty, "ipv4 flowspec");
13672 } else if (afi == AFI_IP6) {
13673 if (safi == SAFI_UNICAST)
13674 vty_frame(vty, "ipv6 unicast");
13675 else if (safi == SAFI_LABELED_UNICAST)
13676 vty_frame(vty, "ipv6 labeled-unicast");
13677 else if (safi == SAFI_MULTICAST)
13678 vty_frame(vty, "ipv6 multicast");
13679 else if (safi == SAFI_MPLS_VPN)
13680 vty_frame(vty, "ipv6 vpn");
13681 else if (safi == SAFI_ENCAP)
13682 vty_frame(vty, "ipv6 encap");
13683 else if (safi == SAFI_FLOWSPEC)
13684 vty_frame(vty, "ipv6 flowspec");
13685 } else if (afi == AFI_L2VPN) {
13686 if (safi == SAFI_EVPN)
13687 vty_frame(vty, "l2vpn evpn");
13688 }
13689 vty_frame(vty, "\n");
13690
13691 bgp_config_write_distance(vty, bgp, afi, safi);
13692
13693 bgp_config_write_network(vty, bgp, afi, safi);
13694
13695 bgp_config_write_redistribute(vty, bgp, afi, safi);
13696
13697 for (ALL_LIST_ELEMENTS(bgp->group, node, nnode, group))
13698 bgp_config_write_peer_af(vty, bgp, group->conf, afi, safi);
13699
13700 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
13701 /* Skip dynamic neighbors. */
13702 if (peer_dynamic_neighbor(peer))
13703 continue;
13704
13705 /* Do not display doppelganger peers */
13706 if (CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE))
13707 bgp_config_write_peer_af(vty, bgp, peer, afi, safi);
13708 }
13709
13710 bgp_config_write_maxpaths(vty, bgp, afi, safi);
13711 bgp_config_write_table_map(vty, bgp, afi, safi);
13712
13713 if (safi == SAFI_EVPN)
13714 bgp_config_write_evpn_info(vty, bgp, afi, safi);
13715
13716 if (safi == SAFI_FLOWSPEC)
13717 bgp_fs_config_write_pbr(vty, bgp, afi, safi);
13718
13719 if (safi == SAFI_UNICAST) {
13720 bgp_vpn_policy_config_write_afi(vty, bgp, afi);
13721 if (CHECK_FLAG(bgp->af_flags[afi][safi],
13722 BGP_CONFIG_VRF_TO_MPLSVPN_EXPORT)) {
13723
13724 vty_out(vty, " export vpn\n");
13725 }
13726 if (CHECK_FLAG(bgp->af_flags[afi][safi],
13727 BGP_CONFIG_MPLSVPN_TO_VRF_IMPORT)) {
13728
13729 vty_out(vty, " import vpn\n");
13730 }
13731 if (CHECK_FLAG(bgp->af_flags[afi][safi],
13732 BGP_CONFIG_VRF_TO_VRF_IMPORT)) {
13733 char *name;
13734
13735 for (ALL_LIST_ELEMENTS_RO(
13736 bgp->vpn_policy[afi].import_vrf, node,
13737 name))
13738 vty_out(vty, " import vrf %s\n", name);
13739 }
13740 }
13741
13742 vty_endframe(vty, " exit-address-family\n");
13743 }
13744
13745 int bgp_config_write(struct vty *vty)
13746 {
13747 struct bgp *bgp;
13748 struct peer_group *group;
13749 struct peer *peer;
13750 struct listnode *node, *nnode;
13751 struct listnode *mnode, *mnnode;
13752
13753 if (bm->rmap_update_timer != RMAP_DEFAULT_UPDATE_TIMER)
13754 vty_out(vty, "bgp route-map delay-timer %u\n",
13755 bm->rmap_update_timer);
13756
13757 /* BGP configuration. */
13758 for (ALL_LIST_ELEMENTS(bm->bgp, mnode, mnnode, bgp)) {
13759
13760 /* skip all auto created vrf as they dont have user config */
13761 if (CHECK_FLAG(bgp->vrf_flags, BGP_VRF_AUTO))
13762 continue;
13763
13764 /* Router bgp ASN */
13765 vty_out(vty, "router bgp %u", bgp->as);
13766
13767 if (bgp->name)
13768 vty_out(vty, " %s %s",
13769 (bgp->inst_type == BGP_INSTANCE_TYPE_VIEW)
13770 ? "view" : "vrf", bgp->name);
13771 vty_out(vty, "\n");
13772
13773 /* BGP fast-external-failover. */
13774 if (CHECK_FLAG(bgp->flags, BGP_FLAG_NO_FAST_EXT_FAILOVER))
13775 vty_out(vty, " no bgp fast-external-failover\n");
13776
13777 /* BGP router ID. */
13778 if (bgp->router_id_static.s_addr != 0)
13779 vty_out(vty, " bgp router-id %s\n",
13780 inet_ntoa(bgp->router_id_static));
13781
13782 /* BGP log-neighbor-changes. */
13783 if (!!bgp_flag_check(bgp, BGP_FLAG_LOG_NEIGHBOR_CHANGES)
13784 != SAVE_BGP_LOG_NEIGHBOR_CHANGES)
13785 vty_out(vty, " %sbgp log-neighbor-changes\n",
13786 bgp_flag_check(bgp,
13787 BGP_FLAG_LOG_NEIGHBOR_CHANGES)
13788 ? ""
13789 : "no ");
13790
13791 /* BGP configuration. */
13792 if (bgp_flag_check(bgp, BGP_FLAG_ALWAYS_COMPARE_MED))
13793 vty_out(vty, " bgp always-compare-med\n");
13794
13795 /* RFC8212 default eBGP policy. */
13796 if (bgp->ebgp_requires_policy
13797 == DEFAULT_EBGP_POLICY_ENABLED)
13798 vty_out(vty, " bgp ebgp-requires-policy\n");
13799
13800 /* draft-ietf-idr-deprecate-as-set-confed-set */
13801 if (bgp->reject_as_sets == BGP_REJECT_AS_SETS_ENABLED)
13802 vty_out(vty, " bgp reject-as-sets\n");
13803
13804 /* BGP default ipv4-unicast. */
13805 if (bgp_flag_check(bgp, BGP_FLAG_NO_DEFAULT_IPV4))
13806 vty_out(vty, " no bgp default ipv4-unicast\n");
13807
13808 /* BGP default local-preference. */
13809 if (bgp->default_local_pref != BGP_DEFAULT_LOCAL_PREF)
13810 vty_out(vty, " bgp default local-preference %u\n",
13811 bgp->default_local_pref);
13812
13813 /* BGP default show-hostname */
13814 if (!!bgp_flag_check(bgp, BGP_FLAG_SHOW_HOSTNAME)
13815 != SAVE_BGP_SHOW_HOSTNAME)
13816 vty_out(vty, " %sbgp default show-hostname\n",
13817 bgp_flag_check(bgp, BGP_FLAG_SHOW_HOSTNAME)
13818 ? ""
13819 : "no ");
13820
13821 /* BGP default subgroup-pkt-queue-max. */
13822 if (bgp->default_subgroup_pkt_queue_max
13823 != BGP_DEFAULT_SUBGROUP_PKT_QUEUE_MAX)
13824 vty_out(vty, " bgp default subgroup-pkt-queue-max %u\n",
13825 bgp->default_subgroup_pkt_queue_max);
13826
13827 /* BGP client-to-client reflection. */
13828 if (bgp_flag_check(bgp, BGP_FLAG_NO_CLIENT_TO_CLIENT))
13829 vty_out(vty, " no bgp client-to-client reflection\n");
13830
13831 /* BGP cluster ID. */
13832 if (CHECK_FLAG(bgp->config, BGP_CONFIG_CLUSTER_ID))
13833 vty_out(vty, " bgp cluster-id %s\n",
13834 inet_ntoa(bgp->cluster_id));
13835
13836 /* Disable ebgp connected nexthop check */
13837 if (bgp_flag_check(bgp, BGP_FLAG_DISABLE_NH_CONNECTED_CHK))
13838 vty_out(vty,
13839 " bgp disable-ebgp-connected-route-check\n");
13840
13841 /* Confederation identifier*/
13842 if (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION))
13843 vty_out(vty, " bgp confederation identifier %u\n",
13844 bgp->confed_id);
13845
13846 /* Confederation peer */
13847 if (bgp->confed_peers_cnt > 0) {
13848 int i;
13849
13850 vty_out(vty, " bgp confederation peers");
13851
13852 for (i = 0; i < bgp->confed_peers_cnt; i++)
13853 vty_out(vty, " %u", bgp->confed_peers[i]);
13854
13855 vty_out(vty, "\n");
13856 }
13857
13858 /* BGP deterministic-med. */
13859 if (!!bgp_flag_check(bgp, BGP_FLAG_DETERMINISTIC_MED)
13860 != SAVE_BGP_DETERMINISTIC_MED)
13861 vty_out(vty, " %sbgp deterministic-med\n",
13862 bgp_flag_check(bgp, BGP_FLAG_DETERMINISTIC_MED)
13863 ? ""
13864 : "no ");
13865
13866 /* BGP update-delay. */
13867 bgp_config_write_update_delay(vty, bgp);
13868
13869 if (bgp->v_maxmed_onstartup
13870 != BGP_MAXMED_ONSTARTUP_UNCONFIGURED) {
13871 vty_out(vty, " bgp max-med on-startup %u",
13872 bgp->v_maxmed_onstartup);
13873 if (bgp->maxmed_onstartup_value
13874 != BGP_MAXMED_VALUE_DEFAULT)
13875 vty_out(vty, " %u",
13876 bgp->maxmed_onstartup_value);
13877 vty_out(vty, "\n");
13878 }
13879 if (bgp->v_maxmed_admin != BGP_MAXMED_ADMIN_UNCONFIGURED) {
13880 vty_out(vty, " bgp max-med administrative");
13881 if (bgp->maxmed_admin_value != BGP_MAXMED_VALUE_DEFAULT)
13882 vty_out(vty, " %u", bgp->maxmed_admin_value);
13883 vty_out(vty, "\n");
13884 }
13885
13886 /* write quanta */
13887 bgp_config_write_wpkt_quanta(vty, bgp);
13888 /* read quanta */
13889 bgp_config_write_rpkt_quanta(vty, bgp);
13890
13891 /* coalesce time */
13892 bgp_config_write_coalesce_time(vty, bgp);
13893
13894 /* BGP graceful-restart. */
13895 if (bgp->stalepath_time != BGP_DEFAULT_STALEPATH_TIME)
13896 vty_out(vty,
13897 " bgp graceful-restart stalepath-time %u\n",
13898 bgp->stalepath_time);
13899 if (bgp->restart_time != BGP_DEFAULT_RESTART_TIME)
13900 vty_out(vty, " bgp graceful-restart restart-time %u\n",
13901 bgp->restart_time);
13902 if (bgp_flag_check(bgp, BGP_FLAG_GRACEFUL_RESTART))
13903 vty_out(vty, " bgp graceful-restart\n");
13904
13905 /* BGP graceful-shutdown */
13906 if (bgp_flag_check(bgp, BGP_FLAG_GRACEFUL_SHUTDOWN))
13907 vty_out(vty, " bgp graceful-shutdown\n");
13908
13909 /* BGP graceful-restart Preserve State F bit. */
13910 if (bgp_flag_check(bgp, BGP_FLAG_GR_PRESERVE_FWD))
13911 vty_out(vty,
13912 " bgp graceful-restart preserve-fw-state\n");
13913
13914 /* BGP bestpath method. */
13915 if (bgp_flag_check(bgp, BGP_FLAG_ASPATH_IGNORE))
13916 vty_out(vty, " bgp bestpath as-path ignore\n");
13917 if (bgp_flag_check(bgp, BGP_FLAG_ASPATH_CONFED))
13918 vty_out(vty, " bgp bestpath as-path confed\n");
13919
13920 if (bgp_flag_check(bgp, BGP_FLAG_ASPATH_MULTIPATH_RELAX)) {
13921 if (bgp_flag_check(bgp,
13922 BGP_FLAG_MULTIPATH_RELAX_AS_SET)) {
13923 vty_out(vty,
13924 " bgp bestpath as-path multipath-relax as-set\n");
13925 } else {
13926 vty_out(vty,
13927 " bgp bestpath as-path multipath-relax\n");
13928 }
13929 }
13930
13931 if (bgp_flag_check(bgp, BGP_FLAG_RR_ALLOW_OUTBOUND_POLICY)) {
13932 vty_out(vty,
13933 " bgp route-reflector allow-outbound-policy\n");
13934 }
13935 if (bgp_flag_check(bgp, BGP_FLAG_COMPARE_ROUTER_ID))
13936 vty_out(vty, " bgp bestpath compare-routerid\n");
13937 if (bgp_flag_check(bgp, BGP_FLAG_MED_CONFED)
13938 || bgp_flag_check(bgp, BGP_FLAG_MED_MISSING_AS_WORST)) {
13939 vty_out(vty, " bgp bestpath med");
13940 if (bgp_flag_check(bgp, BGP_FLAG_MED_CONFED))
13941 vty_out(vty, " confed");
13942 if (bgp_flag_check(bgp, BGP_FLAG_MED_MISSING_AS_WORST))
13943 vty_out(vty, " missing-as-worst");
13944 vty_out(vty, "\n");
13945 }
13946
13947 /* BGP network import check. */
13948 if (!!bgp_flag_check(bgp, BGP_FLAG_IMPORT_CHECK)
13949 != SAVE_BGP_IMPORT_CHECK)
13950 vty_out(vty, " %sbgp network import-check\n",
13951 bgp_flag_check(bgp, BGP_FLAG_IMPORT_CHECK)
13952 ? ""
13953 : "no ");
13954
13955 /* BGP timers configuration. */
13956 if (bgp->default_keepalive != SAVE_BGP_KEEPALIVE
13957 && bgp->default_holdtime != SAVE_BGP_HOLDTIME)
13958 vty_out(vty, " timers bgp %u %u\n",
13959 bgp->default_keepalive, bgp->default_holdtime);
13960
13961 /* peer-group */
13962 for (ALL_LIST_ELEMENTS(bgp->group, node, nnode, group)) {
13963 bgp_config_write_peer_global(vty, bgp, group->conf);
13964 }
13965
13966 /* Normal neighbor configuration. */
13967 for (ALL_LIST_ELEMENTS(bgp->peer, node, nnode, peer)) {
13968 if (CHECK_FLAG(peer->flags, PEER_FLAG_CONFIG_NODE))
13969 bgp_config_write_peer_global(vty, bgp, peer);
13970 }
13971
13972 /* listen range and limit for dynamic BGP neighbors */
13973 bgp_config_write_listen(vty, bgp);
13974
13975 /*
13976 * BGP default autoshutdown neighbors
13977 *
13978 * This must be placed after any peer and peer-group
13979 * configuration, to avoid setting all peers to shutdown after
13980 * a daemon restart, which is undesired behavior. (see #2286)
13981 */
13982 if (bgp->autoshutdown)
13983 vty_out(vty, " bgp default shutdown\n");
13984
13985 /* IPv4 unicast configuration. */
13986 bgp_config_write_family(vty, bgp, AFI_IP, SAFI_UNICAST);
13987
13988 /* IPv4 multicast configuration. */
13989 bgp_config_write_family(vty, bgp, AFI_IP, SAFI_MULTICAST);
13990
13991 /* IPv4 labeled-unicast configuration. */
13992 bgp_config_write_family(vty, bgp, AFI_IP, SAFI_LABELED_UNICAST);
13993
13994 /* IPv4 VPN configuration. */
13995 bgp_config_write_family(vty, bgp, AFI_IP, SAFI_MPLS_VPN);
13996
13997 /* ENCAPv4 configuration. */
13998 bgp_config_write_family(vty, bgp, AFI_IP, SAFI_ENCAP);
13999
14000 /* FLOWSPEC v4 configuration. */
14001 bgp_config_write_family(vty, bgp, AFI_IP, SAFI_FLOWSPEC);
14002
14003 /* IPv6 unicast configuration. */
14004 bgp_config_write_family(vty, bgp, AFI_IP6, SAFI_UNICAST);
14005
14006 /* IPv6 multicast configuration. */
14007 bgp_config_write_family(vty, bgp, AFI_IP6, SAFI_MULTICAST);
14008
14009 /* IPv6 labeled-unicast configuration. */
14010 bgp_config_write_family(vty, bgp, AFI_IP6,
14011 SAFI_LABELED_UNICAST);
14012
14013 /* IPv6 VPN configuration. */
14014 bgp_config_write_family(vty, bgp, AFI_IP6, SAFI_MPLS_VPN);
14015
14016 /* ENCAPv6 configuration. */
14017 bgp_config_write_family(vty, bgp, AFI_IP6, SAFI_ENCAP);
14018
14019 /* FLOWSPEC v6 configuration. */
14020 bgp_config_write_family(vty, bgp, AFI_IP6, SAFI_FLOWSPEC);
14021
14022 /* EVPN configuration. */
14023 bgp_config_write_family(vty, bgp, AFI_L2VPN, SAFI_EVPN);
14024
14025 hook_call(bgp_inst_config_write, bgp, vty);
14026
14027 #if ENABLE_BGP_VNC
14028 bgp_rfapi_cfg_write(vty, bgp);
14029 #endif
14030
14031 vty_out(vty, "!\n");
14032 }
14033 return 0;
14034 }
14035
14036
14037 /* BGP node structure. */
14038 static struct cmd_node bgp_node = {
14039 BGP_NODE, "%s(config-router)# ", 1,
14040 };
14041
14042 static struct cmd_node bgp_ipv4_unicast_node = {
14043 BGP_IPV4_NODE, "%s(config-router-af)# ", 1,
14044 };
14045
14046 static struct cmd_node bgp_ipv4_multicast_node = {
14047 BGP_IPV4M_NODE, "%s(config-router-af)# ", 1,
14048 };
14049
14050 static struct cmd_node bgp_ipv4_labeled_unicast_node = {
14051 BGP_IPV4L_NODE, "%s(config-router-af)# ", 1,
14052 };
14053
14054 static struct cmd_node bgp_ipv6_unicast_node = {
14055 BGP_IPV6_NODE, "%s(config-router-af)# ", 1,
14056 };
14057
14058 static struct cmd_node bgp_ipv6_multicast_node = {
14059 BGP_IPV6M_NODE, "%s(config-router-af)# ", 1,
14060 };
14061
14062 static struct cmd_node bgp_ipv6_labeled_unicast_node = {
14063 BGP_IPV6L_NODE, "%s(config-router-af)# ", 1,
14064 };
14065
14066 static struct cmd_node bgp_vpnv4_node = {BGP_VPNV4_NODE,
14067 "%s(config-router-af)# ", 1};
14068
14069 static struct cmd_node bgp_vpnv6_node = {BGP_VPNV6_NODE,
14070 "%s(config-router-af-vpnv6)# ", 1};
14071
14072 static struct cmd_node bgp_evpn_node = {BGP_EVPN_NODE,
14073 "%s(config-router-evpn)# ", 1};
14074
14075 static struct cmd_node bgp_evpn_vni_node = {BGP_EVPN_VNI_NODE,
14076 "%s(config-router-af-vni)# ", 1};
14077
14078 static struct cmd_node bgp_flowspecv4_node = {BGP_FLOWSPECV4_NODE,
14079 "%s(config-router-af)# ", 1};
14080
14081 static struct cmd_node bgp_flowspecv6_node = {BGP_FLOWSPECV6_NODE,
14082 "%s(config-router-af-vpnv6)# ", 1};
14083
14084 static void community_list_vty(void);
14085
14086 static void bgp_ac_neighbor(vector comps, struct cmd_token *token)
14087 {
14088 struct bgp *bgp;
14089 struct peer *peer;
14090 struct listnode *lnbgp, *lnpeer;
14091
14092 for (ALL_LIST_ELEMENTS_RO(bm->bgp, lnbgp, bgp)) {
14093 for (ALL_LIST_ELEMENTS_RO(bgp->peer, lnpeer, peer)) {
14094 /* only provide suggestions on the appropriate input
14095 * token type,
14096 * they'll otherwise show up multiple times */
14097 enum cmd_token_type match_type;
14098 char *name = peer->host;
14099
14100 if (peer->conf_if) {
14101 match_type = VARIABLE_TKN;
14102 name = peer->conf_if;
14103 } else if (strchr(peer->host, ':'))
14104 match_type = IPV6_TKN;
14105 else
14106 match_type = IPV4_TKN;
14107
14108 if (token->type != match_type)
14109 continue;
14110
14111 vector_set(comps, XSTRDUP(MTYPE_COMPLETION, name));
14112 }
14113 }
14114 }
14115
14116 static const struct cmd_variable_handler bgp_var_neighbor[] = {
14117 {.varname = "neighbor", .completions = bgp_ac_neighbor},
14118 {.varname = "neighbors", .completions = bgp_ac_neighbor},
14119 {.varname = "peer", .completions = bgp_ac_neighbor},
14120 {.completions = NULL}};
14121
14122 static void bgp_ac_peergroup(vector comps, struct cmd_token *token)
14123 {
14124 struct bgp *bgp;
14125 struct peer_group *group;
14126 struct listnode *lnbgp, *lnpeer;
14127
14128 for (ALL_LIST_ELEMENTS_RO(bm->bgp, lnbgp, bgp)) {
14129 for (ALL_LIST_ELEMENTS_RO(bgp->group, lnpeer, group))
14130 vector_set(comps, XSTRDUP(MTYPE_COMPLETION,
14131 group->name));
14132 }
14133 }
14134
14135 static const struct cmd_variable_handler bgp_var_peergroup[] = {
14136 {.tokenname = "PGNAME", .completions = bgp_ac_peergroup},
14137 {.completions = NULL} };
14138
14139 void bgp_vty_init(void)
14140 {
14141 cmd_variable_handler_register(bgp_var_neighbor);
14142 cmd_variable_handler_register(bgp_var_peergroup);
14143
14144 /* Install bgp top node. */
14145 install_node(&bgp_node, bgp_config_write);
14146 install_node(&bgp_ipv4_unicast_node, NULL);
14147 install_node(&bgp_ipv4_multicast_node, NULL);
14148 install_node(&bgp_ipv4_labeled_unicast_node, NULL);
14149 install_node(&bgp_ipv6_unicast_node, NULL);
14150 install_node(&bgp_ipv6_multicast_node, NULL);
14151 install_node(&bgp_ipv6_labeled_unicast_node, NULL);
14152 install_node(&bgp_vpnv4_node, NULL);
14153 install_node(&bgp_vpnv6_node, NULL);
14154 install_node(&bgp_evpn_node, NULL);
14155 install_node(&bgp_evpn_vni_node, NULL);
14156 install_node(&bgp_flowspecv4_node, NULL);
14157 install_node(&bgp_flowspecv6_node, NULL);
14158
14159 /* Install default VTY commands to new nodes. */
14160 install_default(BGP_NODE);
14161 install_default(BGP_IPV4_NODE);
14162 install_default(BGP_IPV4M_NODE);
14163 install_default(BGP_IPV4L_NODE);
14164 install_default(BGP_IPV6_NODE);
14165 install_default(BGP_IPV6M_NODE);
14166 install_default(BGP_IPV6L_NODE);
14167 install_default(BGP_VPNV4_NODE);
14168 install_default(BGP_VPNV6_NODE);
14169 install_default(BGP_FLOWSPECV4_NODE);
14170 install_default(BGP_FLOWSPECV6_NODE);
14171 install_default(BGP_EVPN_NODE);
14172 install_default(BGP_EVPN_VNI_NODE);
14173
14174 /* "bgp local-mac" hidden commands. */
14175 install_element(CONFIG_NODE, &bgp_local_mac_cmd);
14176 install_element(CONFIG_NODE, &no_bgp_local_mac_cmd);
14177
14178 /* bgp route-map delay-timer commands. */
14179 install_element(CONFIG_NODE, &bgp_set_route_map_delay_timer_cmd);
14180 install_element(CONFIG_NODE, &no_bgp_set_route_map_delay_timer_cmd);
14181
14182 /* Dummy commands (Currently not supported) */
14183 install_element(BGP_NODE, &no_synchronization_cmd);
14184 install_element(BGP_NODE, &no_auto_summary_cmd);
14185
14186 /* "router bgp" commands. */
14187 install_element(CONFIG_NODE, &router_bgp_cmd);
14188
14189 /* "no router bgp" commands. */
14190 install_element(CONFIG_NODE, &no_router_bgp_cmd);
14191
14192 /* "bgp router-id" commands. */
14193 install_element(BGP_NODE, &bgp_router_id_cmd);
14194 install_element(BGP_NODE, &no_bgp_router_id_cmd);
14195
14196 /* "bgp cluster-id" commands. */
14197 install_element(BGP_NODE, &bgp_cluster_id_cmd);
14198 install_element(BGP_NODE, &no_bgp_cluster_id_cmd);
14199
14200 /* "bgp confederation" commands. */
14201 install_element(BGP_NODE, &bgp_confederation_identifier_cmd);
14202 install_element(BGP_NODE, &no_bgp_confederation_identifier_cmd);
14203
14204 /* "bgp confederation peers" commands. */
14205 install_element(BGP_NODE, &bgp_confederation_peers_cmd);
14206 install_element(BGP_NODE, &no_bgp_confederation_peers_cmd);
14207
14208 /* bgp max-med command */
14209 install_element(BGP_NODE, &bgp_maxmed_admin_cmd);
14210 install_element(BGP_NODE, &no_bgp_maxmed_admin_cmd);
14211 install_element(BGP_NODE, &bgp_maxmed_admin_medv_cmd);
14212 install_element(BGP_NODE, &bgp_maxmed_onstartup_cmd);
14213 install_element(BGP_NODE, &no_bgp_maxmed_onstartup_cmd);
14214
14215 /* bgp disable-ebgp-connected-nh-check */
14216 install_element(BGP_NODE, &bgp_disable_connected_route_check_cmd);
14217 install_element(BGP_NODE, &no_bgp_disable_connected_route_check_cmd);
14218
14219 /* bgp update-delay command */
14220 install_element(BGP_NODE, &bgp_update_delay_cmd);
14221 install_element(BGP_NODE, &no_bgp_update_delay_cmd);
14222 install_element(BGP_NODE, &bgp_update_delay_establish_wait_cmd);
14223
14224 install_element(BGP_NODE, &bgp_wpkt_quanta_cmd);
14225 install_element(BGP_NODE, &bgp_rpkt_quanta_cmd);
14226
14227 install_element(BGP_NODE, &bgp_coalesce_time_cmd);
14228 install_element(BGP_NODE, &no_bgp_coalesce_time_cmd);
14229
14230 /* "maximum-paths" commands. */
14231 install_element(BGP_NODE, &bgp_maxpaths_hidden_cmd);
14232 install_element(BGP_NODE, &no_bgp_maxpaths_hidden_cmd);
14233 install_element(BGP_IPV4_NODE, &bgp_maxpaths_cmd);
14234 install_element(BGP_IPV4_NODE, &no_bgp_maxpaths_cmd);
14235 install_element(BGP_IPV6_NODE, &bgp_maxpaths_cmd);
14236 install_element(BGP_IPV6_NODE, &no_bgp_maxpaths_cmd);
14237 install_element(BGP_NODE, &bgp_maxpaths_ibgp_hidden_cmd);
14238 install_element(BGP_NODE, &bgp_maxpaths_ibgp_cluster_hidden_cmd);
14239 install_element(BGP_NODE, &no_bgp_maxpaths_ibgp_hidden_cmd);
14240 install_element(BGP_IPV4_NODE, &bgp_maxpaths_ibgp_cmd);
14241 install_element(BGP_IPV4_NODE, &bgp_maxpaths_ibgp_cluster_cmd);
14242 install_element(BGP_IPV4_NODE, &no_bgp_maxpaths_ibgp_cmd);
14243 install_element(BGP_IPV6_NODE, &bgp_maxpaths_ibgp_cmd);
14244 install_element(BGP_IPV6_NODE, &bgp_maxpaths_ibgp_cluster_cmd);
14245 install_element(BGP_IPV6_NODE, &no_bgp_maxpaths_ibgp_cmd);
14246
14247 install_element(BGP_IPV6L_NODE, &bgp_maxpaths_cmd);
14248 install_element(BGP_IPV6L_NODE, &no_bgp_maxpaths_cmd);
14249 install_element(BGP_IPV6L_NODE, &bgp_maxpaths_ibgp_cmd);
14250 install_element(BGP_IPV6L_NODE, &bgp_maxpaths_ibgp_cluster_cmd);
14251 install_element(BGP_IPV6L_NODE, &no_bgp_maxpaths_ibgp_cmd);
14252
14253 /* "timers bgp" commands. */
14254 install_element(BGP_NODE, &bgp_timers_cmd);
14255 install_element(BGP_NODE, &no_bgp_timers_cmd);
14256
14257 /* route-map delay-timer commands - per instance for backwards compat.
14258 */
14259 install_element(BGP_NODE, &bgp_set_route_map_delay_timer_cmd);
14260 install_element(BGP_NODE, &no_bgp_set_route_map_delay_timer_cmd);
14261
14262 /* "bgp client-to-client reflection" commands */
14263 install_element(BGP_NODE, &no_bgp_client_to_client_reflection_cmd);
14264 install_element(BGP_NODE, &bgp_client_to_client_reflection_cmd);
14265
14266 /* "bgp always-compare-med" commands */
14267 install_element(BGP_NODE, &bgp_always_compare_med_cmd);
14268 install_element(BGP_NODE, &no_bgp_always_compare_med_cmd);
14269
14270 /* bgp ebgp-requires-policy */
14271 install_element(BGP_NODE, &bgp_ebgp_requires_policy_cmd);
14272 install_element(BGP_NODE, &no_bgp_ebgp_requires_policy_cmd);
14273
14274 /* bgp reject-as-sets */
14275 install_element(BGP_NODE, &bgp_reject_as_sets_cmd);
14276 install_element(BGP_NODE, &no_bgp_reject_as_sets_cmd);
14277
14278 /* "bgp deterministic-med" commands */
14279 install_element(BGP_NODE, &bgp_deterministic_med_cmd);
14280 install_element(BGP_NODE, &no_bgp_deterministic_med_cmd);
14281
14282 /* "bgp graceful-restart" commands */
14283 install_element(BGP_NODE, &bgp_graceful_restart_cmd);
14284 install_element(BGP_NODE, &no_bgp_graceful_restart_cmd);
14285 install_element(BGP_NODE, &bgp_graceful_restart_stalepath_time_cmd);
14286 install_element(BGP_NODE, &no_bgp_graceful_restart_stalepath_time_cmd);
14287 install_element(BGP_NODE, &bgp_graceful_restart_restart_time_cmd);
14288 install_element(BGP_NODE, &no_bgp_graceful_restart_restart_time_cmd);
14289
14290 install_element(BGP_NODE, &bgp_graceful_restart_preserve_fw_cmd);
14291 install_element(BGP_NODE, &no_bgp_graceful_restart_preserve_fw_cmd);
14292
14293 /* "bgp graceful-shutdown" commands */
14294 install_element(BGP_NODE, &bgp_graceful_shutdown_cmd);
14295 install_element(BGP_NODE, &no_bgp_graceful_shutdown_cmd);
14296
14297 /* "bgp fast-external-failover" commands */
14298 install_element(BGP_NODE, &bgp_fast_external_failover_cmd);
14299 install_element(BGP_NODE, &no_bgp_fast_external_failover_cmd);
14300
14301 /* "bgp bestpath compare-routerid" commands */
14302 install_element(BGP_NODE, &bgp_bestpath_compare_router_id_cmd);
14303 install_element(BGP_NODE, &no_bgp_bestpath_compare_router_id_cmd);
14304
14305 /* "bgp bestpath as-path ignore" commands */
14306 install_element(BGP_NODE, &bgp_bestpath_aspath_ignore_cmd);
14307 install_element(BGP_NODE, &no_bgp_bestpath_aspath_ignore_cmd);
14308
14309 /* "bgp bestpath as-path confed" commands */
14310 install_element(BGP_NODE, &bgp_bestpath_aspath_confed_cmd);
14311 install_element(BGP_NODE, &no_bgp_bestpath_aspath_confed_cmd);
14312
14313 /* "bgp bestpath as-path multipath-relax" commands */
14314 install_element(BGP_NODE, &bgp_bestpath_aspath_multipath_relax_cmd);
14315 install_element(BGP_NODE, &no_bgp_bestpath_aspath_multipath_relax_cmd);
14316
14317 /* "bgp log-neighbor-changes" commands */
14318 install_element(BGP_NODE, &bgp_log_neighbor_changes_cmd);
14319 install_element(BGP_NODE, &no_bgp_log_neighbor_changes_cmd);
14320
14321 /* "bgp bestpath med" commands */
14322 install_element(BGP_NODE, &bgp_bestpath_med_cmd);
14323 install_element(BGP_NODE, &no_bgp_bestpath_med_cmd);
14324
14325 /* "no bgp default ipv4-unicast" commands. */
14326 install_element(BGP_NODE, &no_bgp_default_ipv4_unicast_cmd);
14327 install_element(BGP_NODE, &bgp_default_ipv4_unicast_cmd);
14328
14329 /* "bgp network import-check" commands. */
14330 install_element(BGP_NODE, &bgp_network_import_check_cmd);
14331 install_element(BGP_NODE, &bgp_network_import_check_exact_cmd);
14332 install_element(BGP_NODE, &no_bgp_network_import_check_cmd);
14333
14334 /* "bgp default local-preference" commands. */
14335 install_element(BGP_NODE, &bgp_default_local_preference_cmd);
14336 install_element(BGP_NODE, &no_bgp_default_local_preference_cmd);
14337
14338 /* bgp default show-hostname */
14339 install_element(BGP_NODE, &bgp_default_show_hostname_cmd);
14340 install_element(BGP_NODE, &no_bgp_default_show_hostname_cmd);
14341
14342 /* "bgp default subgroup-pkt-queue-max" commands. */
14343 install_element(BGP_NODE, &bgp_default_subgroup_pkt_queue_max_cmd);
14344 install_element(BGP_NODE, &no_bgp_default_subgroup_pkt_queue_max_cmd);
14345
14346 /* bgp ibgp-allow-policy-mods command */
14347 install_element(BGP_NODE, &bgp_rr_allow_outbound_policy_cmd);
14348 install_element(BGP_NODE, &no_bgp_rr_allow_outbound_policy_cmd);
14349
14350 /* "bgp listen limit" commands. */
14351 install_element(BGP_NODE, &bgp_listen_limit_cmd);
14352 install_element(BGP_NODE, &no_bgp_listen_limit_cmd);
14353
14354 /* "bgp listen range" commands. */
14355 install_element(BGP_NODE, &bgp_listen_range_cmd);
14356 install_element(BGP_NODE, &no_bgp_listen_range_cmd);
14357
14358 /* "bgp default shutdown" command */
14359 install_element(BGP_NODE, &bgp_default_shutdown_cmd);
14360
14361 /* "neighbor remote-as" commands. */
14362 install_element(BGP_NODE, &neighbor_remote_as_cmd);
14363 install_element(BGP_NODE, &neighbor_interface_config_cmd);
14364 install_element(BGP_NODE, &neighbor_interface_config_v6only_cmd);
14365 install_element(BGP_NODE, &neighbor_interface_config_remote_as_cmd);
14366 install_element(BGP_NODE,
14367 &neighbor_interface_v6only_config_remote_as_cmd);
14368 install_element(BGP_NODE, &no_neighbor_cmd);
14369 install_element(BGP_NODE, &no_neighbor_interface_config_cmd);
14370
14371 /* "neighbor peer-group" commands. */
14372 install_element(BGP_NODE, &neighbor_peer_group_cmd);
14373 install_element(BGP_NODE, &no_neighbor_peer_group_cmd);
14374 install_element(BGP_NODE,
14375 &no_neighbor_interface_peer_group_remote_as_cmd);
14376
14377 /* "neighbor local-as" commands. */
14378 install_element(BGP_NODE, &neighbor_local_as_cmd);
14379 install_element(BGP_NODE, &neighbor_local_as_no_prepend_cmd);
14380 install_element(BGP_NODE, &neighbor_local_as_no_prepend_replace_as_cmd);
14381 install_element(BGP_NODE, &no_neighbor_local_as_cmd);
14382
14383 /* "neighbor solo" commands. */
14384 install_element(BGP_NODE, &neighbor_solo_cmd);
14385 install_element(BGP_NODE, &no_neighbor_solo_cmd);
14386
14387 /* "neighbor password" commands. */
14388 install_element(BGP_NODE, &neighbor_password_cmd);
14389 install_element(BGP_NODE, &no_neighbor_password_cmd);
14390
14391 /* "neighbor activate" commands. */
14392 install_element(BGP_NODE, &neighbor_activate_hidden_cmd);
14393 install_element(BGP_IPV4_NODE, &neighbor_activate_cmd);
14394 install_element(BGP_IPV4M_NODE, &neighbor_activate_cmd);
14395 install_element(BGP_IPV4L_NODE, &neighbor_activate_cmd);
14396 install_element(BGP_IPV6_NODE, &neighbor_activate_cmd);
14397 install_element(BGP_IPV6M_NODE, &neighbor_activate_cmd);
14398 install_element(BGP_IPV6L_NODE, &neighbor_activate_cmd);
14399 install_element(BGP_VPNV4_NODE, &neighbor_activate_cmd);
14400 install_element(BGP_VPNV6_NODE, &neighbor_activate_cmd);
14401 install_element(BGP_FLOWSPECV4_NODE, &neighbor_activate_cmd);
14402 install_element(BGP_FLOWSPECV6_NODE, &neighbor_activate_cmd);
14403 install_element(BGP_EVPN_NODE, &neighbor_activate_cmd);
14404
14405 /* "no neighbor activate" commands. */
14406 install_element(BGP_NODE, &no_neighbor_activate_hidden_cmd);
14407 install_element(BGP_IPV4_NODE, &no_neighbor_activate_cmd);
14408 install_element(BGP_IPV4M_NODE, &no_neighbor_activate_cmd);
14409 install_element(BGP_IPV4L_NODE, &no_neighbor_activate_cmd);
14410 install_element(BGP_IPV6_NODE, &no_neighbor_activate_cmd);
14411 install_element(BGP_IPV6M_NODE, &no_neighbor_activate_cmd);
14412 install_element(BGP_IPV6L_NODE, &no_neighbor_activate_cmd);
14413 install_element(BGP_VPNV4_NODE, &no_neighbor_activate_cmd);
14414 install_element(BGP_VPNV6_NODE, &no_neighbor_activate_cmd);
14415 install_element(BGP_FLOWSPECV4_NODE, &no_neighbor_activate_cmd);
14416 install_element(BGP_FLOWSPECV6_NODE, &no_neighbor_activate_cmd);
14417 install_element(BGP_EVPN_NODE, &no_neighbor_activate_cmd);
14418
14419 /* "neighbor peer-group" set commands. */
14420 install_element(BGP_NODE, &neighbor_set_peer_group_cmd);
14421 install_element(BGP_IPV4_NODE, &neighbor_set_peer_group_hidden_cmd);
14422 install_element(BGP_IPV4M_NODE, &neighbor_set_peer_group_hidden_cmd);
14423 install_element(BGP_IPV6_NODE, &neighbor_set_peer_group_hidden_cmd);
14424 install_element(BGP_IPV6M_NODE, &neighbor_set_peer_group_hidden_cmd);
14425 install_element(BGP_IPV6L_NODE, &neighbor_set_peer_group_hidden_cmd);
14426 install_element(BGP_VPNV4_NODE, &neighbor_set_peer_group_hidden_cmd);
14427 install_element(BGP_VPNV6_NODE, &neighbor_set_peer_group_hidden_cmd);
14428 install_element(BGP_FLOWSPECV4_NODE,
14429 &neighbor_set_peer_group_hidden_cmd);
14430 install_element(BGP_FLOWSPECV6_NODE,
14431 &neighbor_set_peer_group_hidden_cmd);
14432
14433 /* "no neighbor peer-group unset" commands. */
14434 install_element(BGP_NODE, &no_neighbor_set_peer_group_cmd);
14435 install_element(BGP_IPV4_NODE, &no_neighbor_set_peer_group_hidden_cmd);
14436 install_element(BGP_IPV4M_NODE, &no_neighbor_set_peer_group_hidden_cmd);
14437 install_element(BGP_IPV6_NODE, &no_neighbor_set_peer_group_hidden_cmd);
14438 install_element(BGP_IPV6M_NODE, &no_neighbor_set_peer_group_hidden_cmd);
14439 install_element(BGP_IPV6L_NODE, &no_neighbor_set_peer_group_hidden_cmd);
14440 install_element(BGP_VPNV4_NODE, &no_neighbor_set_peer_group_hidden_cmd);
14441 install_element(BGP_VPNV6_NODE, &no_neighbor_set_peer_group_hidden_cmd);
14442 install_element(BGP_FLOWSPECV4_NODE,
14443 &no_neighbor_set_peer_group_hidden_cmd);
14444 install_element(BGP_FLOWSPECV6_NODE,
14445 &no_neighbor_set_peer_group_hidden_cmd);
14446
14447 /* "neighbor softreconfiguration inbound" commands.*/
14448 install_element(BGP_NODE, &neighbor_soft_reconfiguration_hidden_cmd);
14449 install_element(BGP_NODE, &no_neighbor_soft_reconfiguration_hidden_cmd);
14450 install_element(BGP_IPV4_NODE, &neighbor_soft_reconfiguration_cmd);
14451 install_element(BGP_IPV4_NODE, &no_neighbor_soft_reconfiguration_cmd);
14452 install_element(BGP_IPV4L_NODE, &neighbor_soft_reconfiguration_cmd);
14453 install_element(BGP_IPV4L_NODE, &no_neighbor_soft_reconfiguration_cmd);
14454 install_element(BGP_IPV4M_NODE, &neighbor_soft_reconfiguration_cmd);
14455 install_element(BGP_IPV4M_NODE, &no_neighbor_soft_reconfiguration_cmd);
14456 install_element(BGP_IPV6_NODE, &neighbor_soft_reconfiguration_cmd);
14457 install_element(BGP_IPV6_NODE, &no_neighbor_soft_reconfiguration_cmd);
14458 install_element(BGP_IPV6M_NODE, &neighbor_soft_reconfiguration_cmd);
14459 install_element(BGP_IPV6M_NODE, &no_neighbor_soft_reconfiguration_cmd);
14460 install_element(BGP_IPV6L_NODE, &neighbor_soft_reconfiguration_cmd);
14461 install_element(BGP_IPV6L_NODE, &no_neighbor_soft_reconfiguration_cmd);
14462 install_element(BGP_VPNV4_NODE, &neighbor_soft_reconfiguration_cmd);
14463 install_element(BGP_VPNV4_NODE, &no_neighbor_soft_reconfiguration_cmd);
14464 install_element(BGP_VPNV6_NODE, &neighbor_soft_reconfiguration_cmd);
14465 install_element(BGP_VPNV6_NODE, &no_neighbor_soft_reconfiguration_cmd);
14466 install_element(BGP_FLOWSPECV4_NODE,
14467 &neighbor_soft_reconfiguration_cmd);
14468 install_element(BGP_FLOWSPECV4_NODE,
14469 &no_neighbor_soft_reconfiguration_cmd);
14470 install_element(BGP_FLOWSPECV6_NODE,
14471 &neighbor_soft_reconfiguration_cmd);
14472 install_element(BGP_FLOWSPECV6_NODE,
14473 &no_neighbor_soft_reconfiguration_cmd);
14474 install_element(BGP_EVPN_NODE, &neighbor_soft_reconfiguration_cmd);
14475 install_element(BGP_EVPN_NODE, &no_neighbor_soft_reconfiguration_cmd);
14476
14477 /* "neighbor attribute-unchanged" commands. */
14478 install_element(BGP_NODE, &neighbor_attr_unchanged_hidden_cmd);
14479 install_element(BGP_NODE, &no_neighbor_attr_unchanged_hidden_cmd);
14480 install_element(BGP_IPV4_NODE, &neighbor_attr_unchanged_cmd);
14481 install_element(BGP_IPV4_NODE, &no_neighbor_attr_unchanged_cmd);
14482 install_element(BGP_IPV4M_NODE, &neighbor_attr_unchanged_cmd);
14483 install_element(BGP_IPV4M_NODE, &no_neighbor_attr_unchanged_cmd);
14484 install_element(BGP_IPV4L_NODE, &neighbor_attr_unchanged_cmd);
14485 install_element(BGP_IPV4L_NODE, &no_neighbor_attr_unchanged_cmd);
14486 install_element(BGP_IPV6_NODE, &neighbor_attr_unchanged_cmd);
14487 install_element(BGP_IPV6_NODE, &no_neighbor_attr_unchanged_cmd);
14488 install_element(BGP_IPV6M_NODE, &neighbor_attr_unchanged_cmd);
14489 install_element(BGP_IPV6M_NODE, &no_neighbor_attr_unchanged_cmd);
14490 install_element(BGP_IPV6L_NODE, &neighbor_attr_unchanged_cmd);
14491 install_element(BGP_IPV6L_NODE, &no_neighbor_attr_unchanged_cmd);
14492 install_element(BGP_VPNV4_NODE, &neighbor_attr_unchanged_cmd);
14493 install_element(BGP_VPNV4_NODE, &no_neighbor_attr_unchanged_cmd);
14494 install_element(BGP_VPNV6_NODE, &neighbor_attr_unchanged_cmd);
14495 install_element(BGP_VPNV6_NODE, &no_neighbor_attr_unchanged_cmd);
14496
14497 install_element(BGP_EVPN_NODE, &neighbor_attr_unchanged_cmd);
14498 install_element(BGP_EVPN_NODE, &no_neighbor_attr_unchanged_cmd);
14499
14500 /* "nexthop-local unchanged" commands */
14501 install_element(BGP_IPV6_NODE, &neighbor_nexthop_local_unchanged_cmd);
14502 install_element(BGP_IPV6_NODE,
14503 &no_neighbor_nexthop_local_unchanged_cmd);
14504
14505 /* "neighbor next-hop-self" commands. */
14506 install_element(BGP_NODE, &neighbor_nexthop_self_hidden_cmd);
14507 install_element(BGP_NODE, &no_neighbor_nexthop_self_hidden_cmd);
14508 install_element(BGP_IPV4_NODE, &neighbor_nexthop_self_cmd);
14509 install_element(BGP_IPV4_NODE, &no_neighbor_nexthop_self_cmd);
14510 install_element(BGP_IPV4M_NODE, &neighbor_nexthop_self_cmd);
14511 install_element(BGP_IPV4M_NODE, &no_neighbor_nexthop_self_cmd);
14512 install_element(BGP_IPV4L_NODE, &neighbor_nexthop_self_cmd);
14513 install_element(BGP_IPV4L_NODE, &no_neighbor_nexthop_self_cmd);
14514 install_element(BGP_IPV6_NODE, &neighbor_nexthop_self_cmd);
14515 install_element(BGP_IPV6_NODE, &no_neighbor_nexthop_self_cmd);
14516 install_element(BGP_IPV6M_NODE, &neighbor_nexthop_self_cmd);
14517 install_element(BGP_IPV6M_NODE, &no_neighbor_nexthop_self_cmd);
14518 install_element(BGP_IPV6L_NODE, &neighbor_nexthop_self_cmd);
14519 install_element(BGP_IPV6L_NODE, &no_neighbor_nexthop_self_cmd);
14520 install_element(BGP_VPNV4_NODE, &neighbor_nexthop_self_cmd);
14521 install_element(BGP_VPNV4_NODE, &no_neighbor_nexthop_self_cmd);
14522 install_element(BGP_VPNV6_NODE, &neighbor_nexthop_self_cmd);
14523 install_element(BGP_VPNV6_NODE, &no_neighbor_nexthop_self_cmd);
14524 install_element(BGP_EVPN_NODE, &neighbor_nexthop_self_cmd);
14525 install_element(BGP_EVPN_NODE, &no_neighbor_nexthop_self_cmd);
14526
14527 /* "neighbor next-hop-self force" commands. */
14528 install_element(BGP_NODE, &neighbor_nexthop_self_force_hidden_cmd);
14529 install_element(BGP_NODE, &no_neighbor_nexthop_self_force_hidden_cmd);
14530 install_element(BGP_NODE, &neighbor_nexthop_self_all_hidden_cmd);
14531 install_element(BGP_NODE, &no_neighbor_nexthop_self_all_hidden_cmd);
14532 install_element(BGP_IPV4_NODE, &neighbor_nexthop_self_force_cmd);
14533 install_element(BGP_IPV4_NODE, &no_neighbor_nexthop_self_force_cmd);
14534 install_element(BGP_IPV4_NODE, &neighbor_nexthop_self_all_hidden_cmd);
14535 install_element(BGP_IPV4_NODE,
14536 &no_neighbor_nexthop_self_all_hidden_cmd);
14537 install_element(BGP_IPV4M_NODE, &neighbor_nexthop_self_force_cmd);
14538 install_element(BGP_IPV4M_NODE, &no_neighbor_nexthop_self_force_cmd);
14539 install_element(BGP_IPV4M_NODE, &neighbor_nexthop_self_all_hidden_cmd);
14540 install_element(BGP_IPV4M_NODE,
14541 &no_neighbor_nexthop_self_all_hidden_cmd);
14542 install_element(BGP_IPV4L_NODE, &neighbor_nexthop_self_force_cmd);
14543 install_element(BGP_IPV4L_NODE, &no_neighbor_nexthop_self_force_cmd);
14544 install_element(BGP_IPV4L_NODE, &neighbor_nexthop_self_all_hidden_cmd);
14545 install_element(BGP_IPV4L_NODE,
14546 &no_neighbor_nexthop_self_all_hidden_cmd);
14547 install_element(BGP_IPV6_NODE, &neighbor_nexthop_self_force_cmd);
14548 install_element(BGP_IPV6_NODE, &no_neighbor_nexthop_self_force_cmd);
14549 install_element(BGP_IPV6_NODE, &neighbor_nexthop_self_all_hidden_cmd);
14550 install_element(BGP_IPV6_NODE,
14551 &no_neighbor_nexthop_self_all_hidden_cmd);
14552 install_element(BGP_IPV6M_NODE, &neighbor_nexthop_self_force_cmd);
14553 install_element(BGP_IPV6M_NODE, &no_neighbor_nexthop_self_force_cmd);
14554 install_element(BGP_IPV6M_NODE, &neighbor_nexthop_self_all_hidden_cmd);
14555 install_element(BGP_IPV6M_NODE,
14556 &no_neighbor_nexthop_self_all_hidden_cmd);
14557 install_element(BGP_IPV6L_NODE, &neighbor_nexthop_self_force_cmd);
14558 install_element(BGP_IPV6L_NODE, &no_neighbor_nexthop_self_force_cmd);
14559 install_element(BGP_IPV6L_NODE, &neighbor_nexthop_self_all_hidden_cmd);
14560 install_element(BGP_IPV6L_NODE,
14561 &no_neighbor_nexthop_self_all_hidden_cmd);
14562 install_element(BGP_VPNV4_NODE, &neighbor_nexthop_self_force_cmd);
14563 install_element(BGP_VPNV4_NODE, &no_neighbor_nexthop_self_force_cmd);
14564 install_element(BGP_VPNV4_NODE, &neighbor_nexthop_self_all_hidden_cmd);
14565 install_element(BGP_VPNV4_NODE,
14566 &no_neighbor_nexthop_self_all_hidden_cmd);
14567 install_element(BGP_VPNV6_NODE, &neighbor_nexthop_self_force_cmd);
14568 install_element(BGP_VPNV6_NODE, &no_neighbor_nexthop_self_force_cmd);
14569 install_element(BGP_VPNV6_NODE, &neighbor_nexthop_self_all_hidden_cmd);
14570 install_element(BGP_VPNV6_NODE,
14571 &no_neighbor_nexthop_self_all_hidden_cmd);
14572
14573 /* "neighbor as-override" commands. */
14574 install_element(BGP_NODE, &neighbor_as_override_hidden_cmd);
14575 install_element(BGP_NODE, &no_neighbor_as_override_hidden_cmd);
14576 install_element(BGP_IPV4_NODE, &neighbor_as_override_cmd);
14577 install_element(BGP_IPV4_NODE, &no_neighbor_as_override_cmd);
14578 install_element(BGP_IPV4M_NODE, &neighbor_as_override_cmd);
14579 install_element(BGP_IPV4M_NODE, &no_neighbor_as_override_cmd);
14580 install_element(BGP_IPV4L_NODE, &neighbor_as_override_cmd);
14581 install_element(BGP_IPV4L_NODE, &no_neighbor_as_override_cmd);
14582 install_element(BGP_IPV6_NODE, &neighbor_as_override_cmd);
14583 install_element(BGP_IPV6_NODE, &no_neighbor_as_override_cmd);
14584 install_element(BGP_IPV6M_NODE, &neighbor_as_override_cmd);
14585 install_element(BGP_IPV6M_NODE, &no_neighbor_as_override_cmd);
14586 install_element(BGP_IPV6L_NODE, &neighbor_as_override_cmd);
14587 install_element(BGP_IPV6L_NODE, &no_neighbor_as_override_cmd);
14588 install_element(BGP_VPNV4_NODE, &neighbor_as_override_cmd);
14589 install_element(BGP_VPNV4_NODE, &no_neighbor_as_override_cmd);
14590 install_element(BGP_VPNV6_NODE, &neighbor_as_override_cmd);
14591 install_element(BGP_VPNV6_NODE, &no_neighbor_as_override_cmd);
14592
14593 /* "neighbor remove-private-AS" commands. */
14594 install_element(BGP_NODE, &neighbor_remove_private_as_hidden_cmd);
14595 install_element(BGP_NODE, &no_neighbor_remove_private_as_hidden_cmd);
14596 install_element(BGP_NODE, &neighbor_remove_private_as_all_hidden_cmd);
14597 install_element(BGP_NODE,
14598 &no_neighbor_remove_private_as_all_hidden_cmd);
14599 install_element(BGP_NODE,
14600 &neighbor_remove_private_as_replace_as_hidden_cmd);
14601 install_element(BGP_NODE,
14602 &no_neighbor_remove_private_as_replace_as_hidden_cmd);
14603 install_element(BGP_NODE,
14604 &neighbor_remove_private_as_all_replace_as_hidden_cmd);
14605 install_element(
14606 BGP_NODE,
14607 &no_neighbor_remove_private_as_all_replace_as_hidden_cmd);
14608 install_element(BGP_IPV4_NODE, &neighbor_remove_private_as_cmd);
14609 install_element(BGP_IPV4_NODE, &no_neighbor_remove_private_as_cmd);
14610 install_element(BGP_IPV4_NODE, &neighbor_remove_private_as_all_cmd);
14611 install_element(BGP_IPV4_NODE, &no_neighbor_remove_private_as_all_cmd);
14612 install_element(BGP_IPV4_NODE,
14613 &neighbor_remove_private_as_replace_as_cmd);
14614 install_element(BGP_IPV4_NODE,
14615 &no_neighbor_remove_private_as_replace_as_cmd);
14616 install_element(BGP_IPV4_NODE,
14617 &neighbor_remove_private_as_all_replace_as_cmd);
14618 install_element(BGP_IPV4_NODE,
14619 &no_neighbor_remove_private_as_all_replace_as_cmd);
14620 install_element(BGP_IPV4M_NODE, &neighbor_remove_private_as_cmd);
14621 install_element(BGP_IPV4M_NODE, &no_neighbor_remove_private_as_cmd);
14622 install_element(BGP_IPV4M_NODE, &neighbor_remove_private_as_all_cmd);
14623 install_element(BGP_IPV4M_NODE, &no_neighbor_remove_private_as_all_cmd);
14624 install_element(BGP_IPV4M_NODE,
14625 &neighbor_remove_private_as_replace_as_cmd);
14626 install_element(BGP_IPV4M_NODE,
14627 &no_neighbor_remove_private_as_replace_as_cmd);
14628 install_element(BGP_IPV4M_NODE,
14629 &neighbor_remove_private_as_all_replace_as_cmd);
14630 install_element(BGP_IPV4M_NODE,
14631 &no_neighbor_remove_private_as_all_replace_as_cmd);
14632 install_element(BGP_IPV4L_NODE, &neighbor_remove_private_as_cmd);
14633 install_element(BGP_IPV4L_NODE, &no_neighbor_remove_private_as_cmd);
14634 install_element(BGP_IPV4L_NODE, &neighbor_remove_private_as_all_cmd);
14635 install_element(BGP_IPV4L_NODE, &no_neighbor_remove_private_as_all_cmd);
14636 install_element(BGP_IPV4L_NODE,
14637 &neighbor_remove_private_as_replace_as_cmd);
14638 install_element(BGP_IPV4L_NODE,
14639 &no_neighbor_remove_private_as_replace_as_cmd);
14640 install_element(BGP_IPV4L_NODE,
14641 &neighbor_remove_private_as_all_replace_as_cmd);
14642 install_element(BGP_IPV4L_NODE,
14643 &no_neighbor_remove_private_as_all_replace_as_cmd);
14644 install_element(BGP_IPV6_NODE, &neighbor_remove_private_as_cmd);
14645 install_element(BGP_IPV6_NODE, &no_neighbor_remove_private_as_cmd);
14646 install_element(BGP_IPV6_NODE, &neighbor_remove_private_as_all_cmd);
14647 install_element(BGP_IPV6_NODE, &no_neighbor_remove_private_as_all_cmd);
14648 install_element(BGP_IPV6_NODE,
14649 &neighbor_remove_private_as_replace_as_cmd);
14650 install_element(BGP_IPV6_NODE,
14651 &no_neighbor_remove_private_as_replace_as_cmd);
14652 install_element(BGP_IPV6_NODE,
14653 &neighbor_remove_private_as_all_replace_as_cmd);
14654 install_element(BGP_IPV6_NODE,
14655 &no_neighbor_remove_private_as_all_replace_as_cmd);
14656 install_element(BGP_IPV6M_NODE, &neighbor_remove_private_as_cmd);
14657 install_element(BGP_IPV6M_NODE, &no_neighbor_remove_private_as_cmd);
14658 install_element(BGP_IPV6M_NODE, &neighbor_remove_private_as_all_cmd);
14659 install_element(BGP_IPV6M_NODE, &no_neighbor_remove_private_as_all_cmd);
14660 install_element(BGP_IPV6M_NODE,
14661 &neighbor_remove_private_as_replace_as_cmd);
14662 install_element(BGP_IPV6M_NODE,
14663 &no_neighbor_remove_private_as_replace_as_cmd);
14664 install_element(BGP_IPV6M_NODE,
14665 &neighbor_remove_private_as_all_replace_as_cmd);
14666 install_element(BGP_IPV6M_NODE,
14667 &no_neighbor_remove_private_as_all_replace_as_cmd);
14668 install_element(BGP_IPV6L_NODE, &neighbor_remove_private_as_cmd);
14669 install_element(BGP_IPV6L_NODE, &no_neighbor_remove_private_as_cmd);
14670 install_element(BGP_IPV6L_NODE, &neighbor_remove_private_as_all_cmd);
14671 install_element(BGP_IPV6L_NODE, &no_neighbor_remove_private_as_all_cmd);
14672 install_element(BGP_IPV6L_NODE,
14673 &neighbor_remove_private_as_replace_as_cmd);
14674 install_element(BGP_IPV6L_NODE,
14675 &no_neighbor_remove_private_as_replace_as_cmd);
14676 install_element(BGP_IPV6L_NODE,
14677 &neighbor_remove_private_as_all_replace_as_cmd);
14678 install_element(BGP_IPV6L_NODE,
14679 &no_neighbor_remove_private_as_all_replace_as_cmd);
14680 install_element(BGP_VPNV4_NODE, &neighbor_remove_private_as_cmd);
14681 install_element(BGP_VPNV4_NODE, &no_neighbor_remove_private_as_cmd);
14682 install_element(BGP_VPNV4_NODE, &neighbor_remove_private_as_all_cmd);
14683 install_element(BGP_VPNV4_NODE, &no_neighbor_remove_private_as_all_cmd);
14684 install_element(BGP_VPNV4_NODE,
14685 &neighbor_remove_private_as_replace_as_cmd);
14686 install_element(BGP_VPNV4_NODE,
14687 &no_neighbor_remove_private_as_replace_as_cmd);
14688 install_element(BGP_VPNV4_NODE,
14689 &neighbor_remove_private_as_all_replace_as_cmd);
14690 install_element(BGP_VPNV4_NODE,
14691 &no_neighbor_remove_private_as_all_replace_as_cmd);
14692 install_element(BGP_VPNV6_NODE, &neighbor_remove_private_as_cmd);
14693 install_element(BGP_VPNV6_NODE, &no_neighbor_remove_private_as_cmd);
14694 install_element(BGP_VPNV6_NODE, &neighbor_remove_private_as_all_cmd);
14695 install_element(BGP_VPNV6_NODE, &no_neighbor_remove_private_as_all_cmd);
14696 install_element(BGP_VPNV6_NODE,
14697 &neighbor_remove_private_as_replace_as_cmd);
14698 install_element(BGP_VPNV6_NODE,
14699 &no_neighbor_remove_private_as_replace_as_cmd);
14700 install_element(BGP_VPNV6_NODE,
14701 &neighbor_remove_private_as_all_replace_as_cmd);
14702 install_element(BGP_VPNV6_NODE,
14703 &no_neighbor_remove_private_as_all_replace_as_cmd);
14704
14705 /* "neighbor send-community" commands.*/
14706 install_element(BGP_NODE, &neighbor_send_community_hidden_cmd);
14707 install_element(BGP_NODE, &neighbor_send_community_type_hidden_cmd);
14708 install_element(BGP_NODE, &no_neighbor_send_community_hidden_cmd);
14709 install_element(BGP_NODE, &no_neighbor_send_community_type_hidden_cmd);
14710 install_element(BGP_IPV4_NODE, &neighbor_send_community_cmd);
14711 install_element(BGP_IPV4_NODE, &neighbor_send_community_type_cmd);
14712 install_element(BGP_IPV4_NODE, &no_neighbor_send_community_cmd);
14713 install_element(BGP_IPV4_NODE, &no_neighbor_send_community_type_cmd);
14714 install_element(BGP_IPV4M_NODE, &neighbor_send_community_cmd);
14715 install_element(BGP_IPV4M_NODE, &neighbor_send_community_type_cmd);
14716 install_element(BGP_IPV4M_NODE, &no_neighbor_send_community_cmd);
14717 install_element(BGP_IPV4M_NODE, &no_neighbor_send_community_type_cmd);
14718 install_element(BGP_IPV4L_NODE, &neighbor_send_community_cmd);
14719 install_element(BGP_IPV4L_NODE, &neighbor_send_community_type_cmd);
14720 install_element(BGP_IPV4L_NODE, &no_neighbor_send_community_cmd);
14721 install_element(BGP_IPV4L_NODE, &no_neighbor_send_community_type_cmd);
14722 install_element(BGP_IPV6_NODE, &neighbor_send_community_cmd);
14723 install_element(BGP_IPV6_NODE, &neighbor_send_community_type_cmd);
14724 install_element(BGP_IPV6_NODE, &no_neighbor_send_community_cmd);
14725 install_element(BGP_IPV6_NODE, &no_neighbor_send_community_type_cmd);
14726 install_element(BGP_IPV6M_NODE, &neighbor_send_community_cmd);
14727 install_element(BGP_IPV6M_NODE, &neighbor_send_community_type_cmd);
14728 install_element(BGP_IPV6M_NODE, &no_neighbor_send_community_cmd);
14729 install_element(BGP_IPV6M_NODE, &no_neighbor_send_community_type_cmd);
14730 install_element(BGP_IPV6L_NODE, &neighbor_send_community_cmd);
14731 install_element(BGP_IPV6L_NODE, &neighbor_send_community_type_cmd);
14732 install_element(BGP_IPV6L_NODE, &no_neighbor_send_community_cmd);
14733 install_element(BGP_IPV6L_NODE, &no_neighbor_send_community_type_cmd);
14734 install_element(BGP_VPNV4_NODE, &neighbor_send_community_cmd);
14735 install_element(BGP_VPNV4_NODE, &neighbor_send_community_type_cmd);
14736 install_element(BGP_VPNV4_NODE, &no_neighbor_send_community_cmd);
14737 install_element(BGP_VPNV4_NODE, &no_neighbor_send_community_type_cmd);
14738 install_element(BGP_VPNV6_NODE, &neighbor_send_community_cmd);
14739 install_element(BGP_VPNV6_NODE, &neighbor_send_community_type_cmd);
14740 install_element(BGP_VPNV6_NODE, &no_neighbor_send_community_cmd);
14741 install_element(BGP_VPNV6_NODE, &no_neighbor_send_community_type_cmd);
14742
14743 /* "neighbor route-reflector" commands.*/
14744 install_element(BGP_NODE, &neighbor_route_reflector_client_hidden_cmd);
14745 install_element(BGP_NODE,
14746 &no_neighbor_route_reflector_client_hidden_cmd);
14747 install_element(BGP_IPV4_NODE, &neighbor_route_reflector_client_cmd);
14748 install_element(BGP_IPV4_NODE, &no_neighbor_route_reflector_client_cmd);
14749 install_element(BGP_IPV4M_NODE, &neighbor_route_reflector_client_cmd);
14750 install_element(BGP_IPV4M_NODE,
14751 &no_neighbor_route_reflector_client_cmd);
14752 install_element(BGP_IPV4L_NODE, &neighbor_route_reflector_client_cmd);
14753 install_element(BGP_IPV4L_NODE,
14754 &no_neighbor_route_reflector_client_cmd);
14755 install_element(BGP_IPV6_NODE, &neighbor_route_reflector_client_cmd);
14756 install_element(BGP_IPV6_NODE, &no_neighbor_route_reflector_client_cmd);
14757 install_element(BGP_IPV6M_NODE, &neighbor_route_reflector_client_cmd);
14758 install_element(BGP_IPV6M_NODE,
14759 &no_neighbor_route_reflector_client_cmd);
14760 install_element(BGP_IPV6L_NODE, &neighbor_route_reflector_client_cmd);
14761 install_element(BGP_IPV6L_NODE,
14762 &no_neighbor_route_reflector_client_cmd);
14763 install_element(BGP_VPNV4_NODE, &neighbor_route_reflector_client_cmd);
14764 install_element(BGP_VPNV4_NODE,
14765 &no_neighbor_route_reflector_client_cmd);
14766 install_element(BGP_VPNV6_NODE, &neighbor_route_reflector_client_cmd);
14767 install_element(BGP_VPNV6_NODE,
14768 &no_neighbor_route_reflector_client_cmd);
14769 install_element(BGP_FLOWSPECV4_NODE,
14770 &neighbor_route_reflector_client_cmd);
14771 install_element(BGP_FLOWSPECV4_NODE,
14772 &no_neighbor_route_reflector_client_cmd);
14773 install_element(BGP_FLOWSPECV6_NODE,
14774 &neighbor_route_reflector_client_cmd);
14775 install_element(BGP_FLOWSPECV6_NODE,
14776 &no_neighbor_route_reflector_client_cmd);
14777 install_element(BGP_EVPN_NODE, &neighbor_route_reflector_client_cmd);
14778 install_element(BGP_EVPN_NODE, &no_neighbor_route_reflector_client_cmd);
14779
14780 /* "neighbor route-server" commands.*/
14781 install_element(BGP_NODE, &neighbor_route_server_client_hidden_cmd);
14782 install_element(BGP_NODE, &no_neighbor_route_server_client_hidden_cmd);
14783 install_element(BGP_IPV4_NODE, &neighbor_route_server_client_cmd);
14784 install_element(BGP_IPV4_NODE, &no_neighbor_route_server_client_cmd);
14785 install_element(BGP_IPV4M_NODE, &neighbor_route_server_client_cmd);
14786 install_element(BGP_IPV4M_NODE, &no_neighbor_route_server_client_cmd);
14787 install_element(BGP_IPV4L_NODE, &neighbor_route_server_client_cmd);
14788 install_element(BGP_IPV4L_NODE, &no_neighbor_route_server_client_cmd);
14789 install_element(BGP_IPV6_NODE, &neighbor_route_server_client_cmd);
14790 install_element(BGP_IPV6_NODE, &no_neighbor_route_server_client_cmd);
14791 install_element(BGP_IPV6M_NODE, &neighbor_route_server_client_cmd);
14792 install_element(BGP_IPV6M_NODE, &no_neighbor_route_server_client_cmd);
14793 install_element(BGP_IPV6L_NODE, &neighbor_route_server_client_cmd);
14794 install_element(BGP_IPV6L_NODE, &no_neighbor_route_server_client_cmd);
14795 install_element(BGP_VPNV4_NODE, &neighbor_route_server_client_cmd);
14796 install_element(BGP_VPNV4_NODE, &no_neighbor_route_server_client_cmd);
14797 install_element(BGP_VPNV6_NODE, &neighbor_route_server_client_cmd);
14798 install_element(BGP_VPNV6_NODE, &no_neighbor_route_server_client_cmd);
14799 install_element(BGP_EVPN_NODE, &neighbor_route_server_client_cmd);
14800 install_element(BGP_EVPN_NODE, &no_neighbor_route_server_client_cmd);
14801 install_element(BGP_FLOWSPECV4_NODE, &neighbor_route_server_client_cmd);
14802 install_element(BGP_FLOWSPECV4_NODE,
14803 &no_neighbor_route_server_client_cmd);
14804 install_element(BGP_FLOWSPECV6_NODE, &neighbor_route_server_client_cmd);
14805 install_element(BGP_FLOWSPECV6_NODE,
14806 &no_neighbor_route_server_client_cmd);
14807
14808 /* "neighbor addpath-tx-all-paths" commands.*/
14809 install_element(BGP_NODE, &neighbor_addpath_tx_all_paths_hidden_cmd);
14810 install_element(BGP_NODE, &no_neighbor_addpath_tx_all_paths_hidden_cmd);
14811 install_element(BGP_IPV4_NODE, &neighbor_addpath_tx_all_paths_cmd);
14812 install_element(BGP_IPV4_NODE, &no_neighbor_addpath_tx_all_paths_cmd);
14813 install_element(BGP_IPV4M_NODE, &neighbor_addpath_tx_all_paths_cmd);
14814 install_element(BGP_IPV4M_NODE, &no_neighbor_addpath_tx_all_paths_cmd);
14815 install_element(BGP_IPV4L_NODE, &neighbor_addpath_tx_all_paths_cmd);
14816 install_element(BGP_IPV4L_NODE, &no_neighbor_addpath_tx_all_paths_cmd);
14817 install_element(BGP_IPV6_NODE, &neighbor_addpath_tx_all_paths_cmd);
14818 install_element(BGP_IPV6_NODE, &no_neighbor_addpath_tx_all_paths_cmd);
14819 install_element(BGP_IPV6M_NODE, &neighbor_addpath_tx_all_paths_cmd);
14820 install_element(BGP_IPV6M_NODE, &no_neighbor_addpath_tx_all_paths_cmd);
14821 install_element(BGP_IPV6L_NODE, &neighbor_addpath_tx_all_paths_cmd);
14822 install_element(BGP_IPV6L_NODE, &no_neighbor_addpath_tx_all_paths_cmd);
14823 install_element(BGP_VPNV4_NODE, &neighbor_addpath_tx_all_paths_cmd);
14824 install_element(BGP_VPNV4_NODE, &no_neighbor_addpath_tx_all_paths_cmd);
14825 install_element(BGP_VPNV6_NODE, &neighbor_addpath_tx_all_paths_cmd);
14826 install_element(BGP_VPNV6_NODE, &no_neighbor_addpath_tx_all_paths_cmd);
14827
14828 /* "neighbor addpath-tx-bestpath-per-AS" commands.*/
14829 install_element(BGP_NODE,
14830 &neighbor_addpath_tx_bestpath_per_as_hidden_cmd);
14831 install_element(BGP_NODE,
14832 &no_neighbor_addpath_tx_bestpath_per_as_hidden_cmd);
14833 install_element(BGP_IPV4_NODE,
14834 &neighbor_addpath_tx_bestpath_per_as_cmd);
14835 install_element(BGP_IPV4_NODE,
14836 &no_neighbor_addpath_tx_bestpath_per_as_cmd);
14837 install_element(BGP_IPV4M_NODE,
14838 &neighbor_addpath_tx_bestpath_per_as_cmd);
14839 install_element(BGP_IPV4M_NODE,
14840 &no_neighbor_addpath_tx_bestpath_per_as_cmd);
14841 install_element(BGP_IPV4L_NODE,
14842 &neighbor_addpath_tx_bestpath_per_as_cmd);
14843 install_element(BGP_IPV4L_NODE,
14844 &no_neighbor_addpath_tx_bestpath_per_as_cmd);
14845 install_element(BGP_IPV6_NODE,
14846 &neighbor_addpath_tx_bestpath_per_as_cmd);
14847 install_element(BGP_IPV6_NODE,
14848 &no_neighbor_addpath_tx_bestpath_per_as_cmd);
14849 install_element(BGP_IPV6M_NODE,
14850 &neighbor_addpath_tx_bestpath_per_as_cmd);
14851 install_element(BGP_IPV6M_NODE,
14852 &no_neighbor_addpath_tx_bestpath_per_as_cmd);
14853 install_element(BGP_IPV6L_NODE,
14854 &neighbor_addpath_tx_bestpath_per_as_cmd);
14855 install_element(BGP_IPV6L_NODE,
14856 &no_neighbor_addpath_tx_bestpath_per_as_cmd);
14857 install_element(BGP_VPNV4_NODE,
14858 &neighbor_addpath_tx_bestpath_per_as_cmd);
14859 install_element(BGP_VPNV4_NODE,
14860 &no_neighbor_addpath_tx_bestpath_per_as_cmd);
14861 install_element(BGP_VPNV6_NODE,
14862 &neighbor_addpath_tx_bestpath_per_as_cmd);
14863 install_element(BGP_VPNV6_NODE,
14864 &no_neighbor_addpath_tx_bestpath_per_as_cmd);
14865
14866 /* "neighbor sender-as-path-loop-detection" commands. */
14867 install_element(BGP_NODE, &neighbor_aspath_loop_detection_cmd);
14868 install_element(BGP_NODE, &no_neighbor_aspath_loop_detection_cmd);
14869
14870 /* "neighbor passive" commands. */
14871 install_element(BGP_NODE, &neighbor_passive_cmd);
14872 install_element(BGP_NODE, &no_neighbor_passive_cmd);
14873
14874
14875 /* "neighbor shutdown" commands. */
14876 install_element(BGP_NODE, &neighbor_shutdown_cmd);
14877 install_element(BGP_NODE, &no_neighbor_shutdown_cmd);
14878 install_element(BGP_NODE, &neighbor_shutdown_msg_cmd);
14879 install_element(BGP_NODE, &no_neighbor_shutdown_msg_cmd);
14880
14881 /* "neighbor capability extended-nexthop" commands.*/
14882 install_element(BGP_NODE, &neighbor_capability_enhe_cmd);
14883 install_element(BGP_NODE, &no_neighbor_capability_enhe_cmd);
14884
14885 /* "neighbor capability orf prefix-list" commands.*/
14886 install_element(BGP_NODE, &neighbor_capability_orf_prefix_hidden_cmd);
14887 install_element(BGP_NODE,
14888 &no_neighbor_capability_orf_prefix_hidden_cmd);
14889 install_element(BGP_IPV4_NODE, &neighbor_capability_orf_prefix_cmd);
14890 install_element(BGP_IPV4_NODE, &no_neighbor_capability_orf_prefix_cmd);
14891 install_element(BGP_IPV4M_NODE, &neighbor_capability_orf_prefix_cmd);
14892 install_element(BGP_IPV4M_NODE, &no_neighbor_capability_orf_prefix_cmd);
14893 install_element(BGP_IPV4L_NODE, &neighbor_capability_orf_prefix_cmd);
14894 install_element(BGP_IPV4L_NODE, &no_neighbor_capability_orf_prefix_cmd);
14895 install_element(BGP_IPV6_NODE, &neighbor_capability_orf_prefix_cmd);
14896 install_element(BGP_IPV6_NODE, &no_neighbor_capability_orf_prefix_cmd);
14897 install_element(BGP_IPV6M_NODE, &neighbor_capability_orf_prefix_cmd);
14898 install_element(BGP_IPV6M_NODE, &no_neighbor_capability_orf_prefix_cmd);
14899 install_element(BGP_IPV6L_NODE, &neighbor_capability_orf_prefix_cmd);
14900 install_element(BGP_IPV6L_NODE, &no_neighbor_capability_orf_prefix_cmd);
14901
14902 /* "neighbor capability dynamic" commands.*/
14903 install_element(BGP_NODE, &neighbor_capability_dynamic_cmd);
14904 install_element(BGP_NODE, &no_neighbor_capability_dynamic_cmd);
14905
14906 /* "neighbor dont-capability-negotiate" commands. */
14907 install_element(BGP_NODE, &neighbor_dont_capability_negotiate_cmd);
14908 install_element(BGP_NODE, &no_neighbor_dont_capability_negotiate_cmd);
14909
14910 /* "neighbor ebgp-multihop" commands. */
14911 install_element(BGP_NODE, &neighbor_ebgp_multihop_cmd);
14912 install_element(BGP_NODE, &neighbor_ebgp_multihop_ttl_cmd);
14913 install_element(BGP_NODE, &no_neighbor_ebgp_multihop_cmd);
14914
14915 /* "neighbor disable-connected-check" commands. */
14916 install_element(BGP_NODE, &neighbor_disable_connected_check_cmd);
14917 install_element(BGP_NODE, &no_neighbor_disable_connected_check_cmd);
14918
14919 /* "neighbor enforce-first-as" commands. */
14920 install_element(BGP_NODE, &neighbor_enforce_first_as_cmd);
14921 install_element(BGP_NODE, &no_neighbor_enforce_first_as_cmd);
14922
14923 /* "neighbor description" commands. */
14924 install_element(BGP_NODE, &neighbor_description_cmd);
14925 install_element(BGP_NODE, &no_neighbor_description_cmd);
14926 install_element(BGP_NODE, &no_neighbor_description_comment_cmd);
14927
14928 /* "neighbor update-source" commands. "*/
14929 install_element(BGP_NODE, &neighbor_update_source_cmd);
14930 install_element(BGP_NODE, &no_neighbor_update_source_cmd);
14931
14932 /* "neighbor default-originate" commands. */
14933 install_element(BGP_NODE, &neighbor_default_originate_hidden_cmd);
14934 install_element(BGP_NODE, &neighbor_default_originate_rmap_hidden_cmd);
14935 install_element(BGP_NODE, &no_neighbor_default_originate_hidden_cmd);
14936 install_element(BGP_IPV4_NODE, &neighbor_default_originate_cmd);
14937 install_element(BGP_IPV4_NODE, &neighbor_default_originate_rmap_cmd);
14938 install_element(BGP_IPV4_NODE, &no_neighbor_default_originate_cmd);
14939 install_element(BGP_IPV4M_NODE, &neighbor_default_originate_cmd);
14940 install_element(BGP_IPV4M_NODE, &neighbor_default_originate_rmap_cmd);
14941 install_element(BGP_IPV4M_NODE, &no_neighbor_default_originate_cmd);
14942 install_element(BGP_IPV4L_NODE, &neighbor_default_originate_cmd);
14943 install_element(BGP_IPV4L_NODE, &neighbor_default_originate_rmap_cmd);
14944 install_element(BGP_IPV4L_NODE, &no_neighbor_default_originate_cmd);
14945 install_element(BGP_IPV6_NODE, &neighbor_default_originate_cmd);
14946 install_element(BGP_IPV6_NODE, &neighbor_default_originate_rmap_cmd);
14947 install_element(BGP_IPV6_NODE, &no_neighbor_default_originate_cmd);
14948 install_element(BGP_IPV6M_NODE, &neighbor_default_originate_cmd);
14949 install_element(BGP_IPV6M_NODE, &neighbor_default_originate_rmap_cmd);
14950 install_element(BGP_IPV6M_NODE, &no_neighbor_default_originate_cmd);
14951 install_element(BGP_IPV6L_NODE, &neighbor_default_originate_cmd);
14952 install_element(BGP_IPV6L_NODE, &neighbor_default_originate_rmap_cmd);
14953 install_element(BGP_IPV6L_NODE, &no_neighbor_default_originate_cmd);
14954
14955 /* "neighbor port" commands. */
14956 install_element(BGP_NODE, &neighbor_port_cmd);
14957 install_element(BGP_NODE, &no_neighbor_port_cmd);
14958
14959 /* "neighbor weight" commands. */
14960 install_element(BGP_NODE, &neighbor_weight_hidden_cmd);
14961 install_element(BGP_NODE, &no_neighbor_weight_hidden_cmd);
14962
14963 install_element(BGP_IPV4_NODE, &neighbor_weight_cmd);
14964 install_element(BGP_IPV4_NODE, &no_neighbor_weight_cmd);
14965 install_element(BGP_IPV4M_NODE, &neighbor_weight_cmd);
14966 install_element(BGP_IPV4M_NODE, &no_neighbor_weight_cmd);
14967 install_element(BGP_IPV4L_NODE, &neighbor_weight_cmd);
14968 install_element(BGP_IPV4L_NODE, &no_neighbor_weight_cmd);
14969 install_element(BGP_IPV6_NODE, &neighbor_weight_cmd);
14970 install_element(BGP_IPV6_NODE, &no_neighbor_weight_cmd);
14971 install_element(BGP_IPV6M_NODE, &neighbor_weight_cmd);
14972 install_element(BGP_IPV6M_NODE, &no_neighbor_weight_cmd);
14973 install_element(BGP_IPV6L_NODE, &neighbor_weight_cmd);
14974 install_element(BGP_IPV6L_NODE, &no_neighbor_weight_cmd);
14975 install_element(BGP_VPNV4_NODE, &neighbor_weight_cmd);
14976 install_element(BGP_VPNV4_NODE, &no_neighbor_weight_cmd);
14977 install_element(BGP_VPNV6_NODE, &neighbor_weight_cmd);
14978 install_element(BGP_VPNV6_NODE, &no_neighbor_weight_cmd);
14979
14980 /* "neighbor override-capability" commands. */
14981 install_element(BGP_NODE, &neighbor_override_capability_cmd);
14982 install_element(BGP_NODE, &no_neighbor_override_capability_cmd);
14983
14984 /* "neighbor strict-capability-match" commands. */
14985 install_element(BGP_NODE, &neighbor_strict_capability_cmd);
14986 install_element(BGP_NODE, &no_neighbor_strict_capability_cmd);
14987
14988 /* "neighbor timers" commands. */
14989 install_element(BGP_NODE, &neighbor_timers_cmd);
14990 install_element(BGP_NODE, &no_neighbor_timers_cmd);
14991
14992 /* "neighbor timers connect" commands. */
14993 install_element(BGP_NODE, &neighbor_timers_connect_cmd);
14994 install_element(BGP_NODE, &no_neighbor_timers_connect_cmd);
14995
14996 /* "neighbor advertisement-interval" commands. */
14997 install_element(BGP_NODE, &neighbor_advertise_interval_cmd);
14998 install_element(BGP_NODE, &no_neighbor_advertise_interval_cmd);
14999
15000 /* "neighbor interface" commands. */
15001 install_element(BGP_NODE, &neighbor_interface_cmd);
15002 install_element(BGP_NODE, &no_neighbor_interface_cmd);
15003
15004 /* "neighbor distribute" commands. */
15005 install_element(BGP_NODE, &neighbor_distribute_list_hidden_cmd);
15006 install_element(BGP_NODE, &no_neighbor_distribute_list_hidden_cmd);
15007 install_element(BGP_IPV4_NODE, &neighbor_distribute_list_cmd);
15008 install_element(BGP_IPV4_NODE, &no_neighbor_distribute_list_cmd);
15009 install_element(BGP_IPV4M_NODE, &neighbor_distribute_list_cmd);
15010 install_element(BGP_IPV4M_NODE, &no_neighbor_distribute_list_cmd);
15011 install_element(BGP_IPV4L_NODE, &neighbor_distribute_list_cmd);
15012 install_element(BGP_IPV4L_NODE, &no_neighbor_distribute_list_cmd);
15013 install_element(BGP_IPV6_NODE, &neighbor_distribute_list_cmd);
15014 install_element(BGP_IPV6_NODE, &no_neighbor_distribute_list_cmd);
15015 install_element(BGP_IPV6M_NODE, &neighbor_distribute_list_cmd);
15016 install_element(BGP_IPV6M_NODE, &no_neighbor_distribute_list_cmd);
15017 install_element(BGP_IPV6L_NODE, &neighbor_distribute_list_cmd);
15018 install_element(BGP_IPV6L_NODE, &no_neighbor_distribute_list_cmd);
15019 install_element(BGP_VPNV4_NODE, &neighbor_distribute_list_cmd);
15020 install_element(BGP_VPNV4_NODE, &no_neighbor_distribute_list_cmd);
15021 install_element(BGP_VPNV6_NODE, &neighbor_distribute_list_cmd);
15022 install_element(BGP_VPNV6_NODE, &no_neighbor_distribute_list_cmd);
15023
15024 /* "neighbor prefix-list" commands. */
15025 install_element(BGP_NODE, &neighbor_prefix_list_hidden_cmd);
15026 install_element(BGP_NODE, &no_neighbor_prefix_list_hidden_cmd);
15027 install_element(BGP_IPV4_NODE, &neighbor_prefix_list_cmd);
15028 install_element(BGP_IPV4_NODE, &no_neighbor_prefix_list_cmd);
15029 install_element(BGP_IPV4M_NODE, &neighbor_prefix_list_cmd);
15030 install_element(BGP_IPV4M_NODE, &no_neighbor_prefix_list_cmd);
15031 install_element(BGP_IPV4L_NODE, &neighbor_prefix_list_cmd);
15032 install_element(BGP_IPV4L_NODE, &no_neighbor_prefix_list_cmd);
15033 install_element(BGP_IPV6_NODE, &neighbor_prefix_list_cmd);
15034 install_element(BGP_IPV6_NODE, &no_neighbor_prefix_list_cmd);
15035 install_element(BGP_IPV6M_NODE, &neighbor_prefix_list_cmd);
15036 install_element(BGP_IPV6M_NODE, &no_neighbor_prefix_list_cmd);
15037 install_element(BGP_IPV6L_NODE, &neighbor_prefix_list_cmd);
15038 install_element(BGP_IPV6L_NODE, &no_neighbor_prefix_list_cmd);
15039 install_element(BGP_VPNV4_NODE, &neighbor_prefix_list_cmd);
15040 install_element(BGP_VPNV4_NODE, &no_neighbor_prefix_list_cmd);
15041 install_element(BGP_VPNV6_NODE, &neighbor_prefix_list_cmd);
15042 install_element(BGP_VPNV6_NODE, &no_neighbor_prefix_list_cmd);
15043 install_element(BGP_FLOWSPECV4_NODE, &neighbor_prefix_list_cmd);
15044 install_element(BGP_FLOWSPECV4_NODE, &no_neighbor_prefix_list_cmd);
15045 install_element(BGP_FLOWSPECV6_NODE, &neighbor_prefix_list_cmd);
15046 install_element(BGP_FLOWSPECV6_NODE, &no_neighbor_prefix_list_cmd);
15047
15048 /* "neighbor filter-list" commands. */
15049 install_element(BGP_NODE, &neighbor_filter_list_hidden_cmd);
15050 install_element(BGP_NODE, &no_neighbor_filter_list_hidden_cmd);
15051 install_element(BGP_IPV4_NODE, &neighbor_filter_list_cmd);
15052 install_element(BGP_IPV4_NODE, &no_neighbor_filter_list_cmd);
15053 install_element(BGP_IPV4M_NODE, &neighbor_filter_list_cmd);
15054 install_element(BGP_IPV4M_NODE, &no_neighbor_filter_list_cmd);
15055 install_element(BGP_IPV4L_NODE, &neighbor_filter_list_cmd);
15056 install_element(BGP_IPV4L_NODE, &no_neighbor_filter_list_cmd);
15057 install_element(BGP_IPV6_NODE, &neighbor_filter_list_cmd);
15058 install_element(BGP_IPV6_NODE, &no_neighbor_filter_list_cmd);
15059 install_element(BGP_IPV6M_NODE, &neighbor_filter_list_cmd);
15060 install_element(BGP_IPV6M_NODE, &no_neighbor_filter_list_cmd);
15061 install_element(BGP_IPV6L_NODE, &neighbor_filter_list_cmd);
15062 install_element(BGP_IPV6L_NODE, &no_neighbor_filter_list_cmd);
15063 install_element(BGP_VPNV4_NODE, &neighbor_filter_list_cmd);
15064 install_element(BGP_VPNV4_NODE, &no_neighbor_filter_list_cmd);
15065 install_element(BGP_VPNV6_NODE, &neighbor_filter_list_cmd);
15066 install_element(BGP_VPNV6_NODE, &no_neighbor_filter_list_cmd);
15067 install_element(BGP_FLOWSPECV4_NODE, &neighbor_filter_list_cmd);
15068 install_element(BGP_FLOWSPECV4_NODE, &no_neighbor_filter_list_cmd);
15069 install_element(BGP_FLOWSPECV6_NODE, &neighbor_filter_list_cmd);
15070 install_element(BGP_FLOWSPECV6_NODE, &no_neighbor_filter_list_cmd);
15071
15072 /* "neighbor route-map" commands. */
15073 install_element(BGP_NODE, &neighbor_route_map_hidden_cmd);
15074 install_element(BGP_NODE, &no_neighbor_route_map_hidden_cmd);
15075 install_element(BGP_IPV4_NODE, &neighbor_route_map_cmd);
15076 install_element(BGP_IPV4_NODE, &no_neighbor_route_map_cmd);
15077 install_element(BGP_IPV4M_NODE, &neighbor_route_map_cmd);
15078 install_element(BGP_IPV4M_NODE, &no_neighbor_route_map_cmd);
15079 install_element(BGP_IPV4L_NODE, &neighbor_route_map_cmd);
15080 install_element(BGP_IPV4L_NODE, &no_neighbor_route_map_cmd);
15081 install_element(BGP_IPV6_NODE, &neighbor_route_map_cmd);
15082 install_element(BGP_IPV6_NODE, &no_neighbor_route_map_cmd);
15083 install_element(BGP_IPV6M_NODE, &neighbor_route_map_cmd);
15084 install_element(BGP_IPV6M_NODE, &no_neighbor_route_map_cmd);
15085 install_element(BGP_IPV6L_NODE, &neighbor_route_map_cmd);
15086 install_element(BGP_IPV6L_NODE, &no_neighbor_route_map_cmd);
15087 install_element(BGP_VPNV4_NODE, &neighbor_route_map_cmd);
15088 install_element(BGP_VPNV4_NODE, &no_neighbor_route_map_cmd);
15089 install_element(BGP_VPNV6_NODE, &neighbor_route_map_cmd);
15090 install_element(BGP_VPNV6_NODE, &no_neighbor_route_map_cmd);
15091 install_element(BGP_FLOWSPECV4_NODE, &neighbor_route_map_cmd);
15092 install_element(BGP_FLOWSPECV4_NODE, &no_neighbor_route_map_cmd);
15093 install_element(BGP_FLOWSPECV6_NODE, &neighbor_route_map_cmd);
15094 install_element(BGP_FLOWSPECV6_NODE, &no_neighbor_route_map_cmd);
15095 install_element(BGP_EVPN_NODE, &neighbor_route_map_cmd);
15096 install_element(BGP_EVPN_NODE, &no_neighbor_route_map_cmd);
15097
15098 /* "neighbor unsuppress-map" commands. */
15099 install_element(BGP_NODE, &neighbor_unsuppress_map_hidden_cmd);
15100 install_element(BGP_NODE, &no_neighbor_unsuppress_map_hidden_cmd);
15101 install_element(BGP_IPV4_NODE, &neighbor_unsuppress_map_cmd);
15102 install_element(BGP_IPV4_NODE, &no_neighbor_unsuppress_map_cmd);
15103 install_element(BGP_IPV4M_NODE, &neighbor_unsuppress_map_cmd);
15104 install_element(BGP_IPV4M_NODE, &no_neighbor_unsuppress_map_cmd);
15105 install_element(BGP_IPV4L_NODE, &neighbor_unsuppress_map_cmd);
15106 install_element(BGP_IPV4L_NODE, &no_neighbor_unsuppress_map_cmd);
15107 install_element(BGP_IPV6_NODE, &neighbor_unsuppress_map_cmd);
15108 install_element(BGP_IPV6_NODE, &no_neighbor_unsuppress_map_cmd);
15109 install_element(BGP_IPV6M_NODE, &neighbor_unsuppress_map_cmd);
15110 install_element(BGP_IPV6M_NODE, &no_neighbor_unsuppress_map_cmd);
15111 install_element(BGP_IPV6L_NODE, &neighbor_unsuppress_map_cmd);
15112 install_element(BGP_IPV6L_NODE, &no_neighbor_unsuppress_map_cmd);
15113 install_element(BGP_VPNV4_NODE, &neighbor_unsuppress_map_cmd);
15114 install_element(BGP_VPNV4_NODE, &no_neighbor_unsuppress_map_cmd);
15115 install_element(BGP_VPNV6_NODE, &neighbor_unsuppress_map_cmd);
15116 install_element(BGP_VPNV6_NODE, &no_neighbor_unsuppress_map_cmd);
15117
15118 /* "neighbor maximum-prefix" commands. */
15119 install_element(BGP_NODE, &neighbor_maximum_prefix_hidden_cmd);
15120 install_element(BGP_NODE,
15121 &neighbor_maximum_prefix_threshold_hidden_cmd);
15122 install_element(BGP_NODE, &neighbor_maximum_prefix_warning_hidden_cmd);
15123 install_element(BGP_NODE,
15124 &neighbor_maximum_prefix_threshold_warning_hidden_cmd);
15125 install_element(BGP_NODE, &neighbor_maximum_prefix_restart_hidden_cmd);
15126 install_element(BGP_NODE,
15127 &neighbor_maximum_prefix_threshold_restart_hidden_cmd);
15128 install_element(BGP_NODE, &no_neighbor_maximum_prefix_hidden_cmd);
15129 install_element(BGP_IPV4_NODE, &neighbor_maximum_prefix_cmd);
15130 install_element(BGP_IPV4_NODE, &neighbor_maximum_prefix_threshold_cmd);
15131 install_element(BGP_IPV4_NODE, &neighbor_maximum_prefix_warning_cmd);
15132 install_element(BGP_IPV4_NODE,
15133 &neighbor_maximum_prefix_threshold_warning_cmd);
15134 install_element(BGP_IPV4_NODE, &neighbor_maximum_prefix_restart_cmd);
15135 install_element(BGP_IPV4_NODE,
15136 &neighbor_maximum_prefix_threshold_restart_cmd);
15137 install_element(BGP_IPV4_NODE, &no_neighbor_maximum_prefix_cmd);
15138 install_element(BGP_IPV4M_NODE, &neighbor_maximum_prefix_cmd);
15139 install_element(BGP_IPV4M_NODE, &neighbor_maximum_prefix_threshold_cmd);
15140 install_element(BGP_IPV4M_NODE, &neighbor_maximum_prefix_warning_cmd);
15141 install_element(BGP_IPV4M_NODE,
15142 &neighbor_maximum_prefix_threshold_warning_cmd);
15143 install_element(BGP_IPV4M_NODE, &neighbor_maximum_prefix_restart_cmd);
15144 install_element(BGP_IPV4M_NODE,
15145 &neighbor_maximum_prefix_threshold_restart_cmd);
15146 install_element(BGP_IPV4M_NODE, &no_neighbor_maximum_prefix_cmd);
15147 install_element(BGP_IPV4L_NODE, &neighbor_maximum_prefix_cmd);
15148 install_element(BGP_IPV4L_NODE, &neighbor_maximum_prefix_threshold_cmd);
15149 install_element(BGP_IPV4L_NODE, &neighbor_maximum_prefix_warning_cmd);
15150 install_element(BGP_IPV4L_NODE,
15151 &neighbor_maximum_prefix_threshold_warning_cmd);
15152 install_element(BGP_IPV4L_NODE, &neighbor_maximum_prefix_restart_cmd);
15153 install_element(BGP_IPV4L_NODE,
15154 &neighbor_maximum_prefix_threshold_restart_cmd);
15155 install_element(BGP_IPV4L_NODE, &no_neighbor_maximum_prefix_cmd);
15156 install_element(BGP_IPV6_NODE, &neighbor_maximum_prefix_cmd);
15157 install_element(BGP_IPV6_NODE, &neighbor_maximum_prefix_threshold_cmd);
15158 install_element(BGP_IPV6_NODE, &neighbor_maximum_prefix_warning_cmd);
15159 install_element(BGP_IPV6_NODE,
15160 &neighbor_maximum_prefix_threshold_warning_cmd);
15161 install_element(BGP_IPV6_NODE, &neighbor_maximum_prefix_restart_cmd);
15162 install_element(BGP_IPV6_NODE,
15163 &neighbor_maximum_prefix_threshold_restart_cmd);
15164 install_element(BGP_IPV6_NODE, &no_neighbor_maximum_prefix_cmd);
15165 install_element(BGP_IPV6M_NODE, &neighbor_maximum_prefix_cmd);
15166 install_element(BGP_IPV6M_NODE, &neighbor_maximum_prefix_threshold_cmd);
15167 install_element(BGP_IPV6M_NODE, &neighbor_maximum_prefix_warning_cmd);
15168 install_element(BGP_IPV6M_NODE,
15169 &neighbor_maximum_prefix_threshold_warning_cmd);
15170 install_element(BGP_IPV6M_NODE, &neighbor_maximum_prefix_restart_cmd);
15171 install_element(BGP_IPV6M_NODE,
15172 &neighbor_maximum_prefix_threshold_restart_cmd);
15173 install_element(BGP_IPV6M_NODE, &no_neighbor_maximum_prefix_cmd);
15174 install_element(BGP_IPV6L_NODE, &neighbor_maximum_prefix_cmd);
15175 install_element(BGP_IPV6L_NODE, &neighbor_maximum_prefix_threshold_cmd);
15176 install_element(BGP_IPV6L_NODE, &neighbor_maximum_prefix_warning_cmd);
15177 install_element(BGP_IPV6L_NODE,
15178 &neighbor_maximum_prefix_threshold_warning_cmd);
15179 install_element(BGP_IPV6L_NODE, &neighbor_maximum_prefix_restart_cmd);
15180 install_element(BGP_IPV6L_NODE,
15181 &neighbor_maximum_prefix_threshold_restart_cmd);
15182 install_element(BGP_IPV6L_NODE, &no_neighbor_maximum_prefix_cmd);
15183 install_element(BGP_VPNV4_NODE, &neighbor_maximum_prefix_cmd);
15184 install_element(BGP_VPNV4_NODE, &neighbor_maximum_prefix_threshold_cmd);
15185 install_element(BGP_VPNV4_NODE, &neighbor_maximum_prefix_warning_cmd);
15186 install_element(BGP_VPNV4_NODE,
15187 &neighbor_maximum_prefix_threshold_warning_cmd);
15188 install_element(BGP_VPNV4_NODE, &neighbor_maximum_prefix_restart_cmd);
15189 install_element(BGP_VPNV4_NODE,
15190 &neighbor_maximum_prefix_threshold_restart_cmd);
15191 install_element(BGP_VPNV4_NODE, &no_neighbor_maximum_prefix_cmd);
15192 install_element(BGP_VPNV6_NODE, &neighbor_maximum_prefix_cmd);
15193 install_element(BGP_VPNV6_NODE, &neighbor_maximum_prefix_threshold_cmd);
15194 install_element(BGP_VPNV6_NODE, &neighbor_maximum_prefix_warning_cmd);
15195 install_element(BGP_VPNV6_NODE,
15196 &neighbor_maximum_prefix_threshold_warning_cmd);
15197 install_element(BGP_VPNV6_NODE, &neighbor_maximum_prefix_restart_cmd);
15198 install_element(BGP_VPNV6_NODE,
15199 &neighbor_maximum_prefix_threshold_restart_cmd);
15200 install_element(BGP_VPNV6_NODE, &no_neighbor_maximum_prefix_cmd);
15201
15202 /* "neighbor allowas-in" */
15203 install_element(BGP_NODE, &neighbor_allowas_in_hidden_cmd);
15204 install_element(BGP_NODE, &no_neighbor_allowas_in_hidden_cmd);
15205 install_element(BGP_IPV4_NODE, &neighbor_allowas_in_cmd);
15206 install_element(BGP_IPV4_NODE, &no_neighbor_allowas_in_cmd);
15207 install_element(BGP_IPV4M_NODE, &neighbor_allowas_in_cmd);
15208 install_element(BGP_IPV4M_NODE, &no_neighbor_allowas_in_cmd);
15209 install_element(BGP_IPV4L_NODE, &neighbor_allowas_in_cmd);
15210 install_element(BGP_IPV4L_NODE, &no_neighbor_allowas_in_cmd);
15211 install_element(BGP_IPV6_NODE, &neighbor_allowas_in_cmd);
15212 install_element(BGP_IPV6_NODE, &no_neighbor_allowas_in_cmd);
15213 install_element(BGP_IPV6M_NODE, &neighbor_allowas_in_cmd);
15214 install_element(BGP_IPV6M_NODE, &no_neighbor_allowas_in_cmd);
15215 install_element(BGP_IPV6L_NODE, &neighbor_allowas_in_cmd);
15216 install_element(BGP_IPV6L_NODE, &no_neighbor_allowas_in_cmd);
15217 install_element(BGP_VPNV4_NODE, &neighbor_allowas_in_cmd);
15218 install_element(BGP_VPNV4_NODE, &no_neighbor_allowas_in_cmd);
15219 install_element(BGP_VPNV6_NODE, &neighbor_allowas_in_cmd);
15220 install_element(BGP_VPNV6_NODE, &no_neighbor_allowas_in_cmd);
15221 install_element(BGP_EVPN_NODE, &neighbor_allowas_in_cmd);
15222 install_element(BGP_EVPN_NODE, &no_neighbor_allowas_in_cmd);
15223
15224 /* address-family commands. */
15225 install_element(BGP_NODE, &address_family_ipv4_safi_cmd);
15226 install_element(BGP_NODE, &address_family_ipv6_safi_cmd);
15227 #ifdef KEEP_OLD_VPN_COMMANDS
15228 install_element(BGP_NODE, &address_family_vpnv4_cmd);
15229 install_element(BGP_NODE, &address_family_vpnv6_cmd);
15230 #endif /* KEEP_OLD_VPN_COMMANDS */
15231
15232 install_element(BGP_NODE, &address_family_evpn_cmd);
15233
15234 /* "exit-address-family" command. */
15235 install_element(BGP_IPV4_NODE, &exit_address_family_cmd);
15236 install_element(BGP_IPV4M_NODE, &exit_address_family_cmd);
15237 install_element(BGP_IPV4L_NODE, &exit_address_family_cmd);
15238 install_element(BGP_IPV6_NODE, &exit_address_family_cmd);
15239 install_element(BGP_IPV6M_NODE, &exit_address_family_cmd);
15240 install_element(BGP_IPV6L_NODE, &exit_address_family_cmd);
15241 install_element(BGP_VPNV4_NODE, &exit_address_family_cmd);
15242 install_element(BGP_VPNV6_NODE, &exit_address_family_cmd);
15243 install_element(BGP_FLOWSPECV4_NODE, &exit_address_family_cmd);
15244 install_element(BGP_FLOWSPECV6_NODE, &exit_address_family_cmd);
15245 install_element(BGP_EVPN_NODE, &exit_address_family_cmd);
15246
15247 /* "clear ip bgp commands" */
15248 install_element(ENABLE_NODE, &clear_ip_bgp_all_cmd);
15249
15250 /* clear ip bgp prefix */
15251 install_element(ENABLE_NODE, &clear_ip_bgp_prefix_cmd);
15252 install_element(ENABLE_NODE, &clear_bgp_ipv6_safi_prefix_cmd);
15253 install_element(ENABLE_NODE, &clear_bgp_instance_ipv6_safi_prefix_cmd);
15254
15255 /* "show [ip] bgp summary" commands. */
15256 install_element(VIEW_NODE, &show_bgp_instance_all_ipv6_updgrps_cmd);
15257 install_element(VIEW_NODE, &show_bgp_l2vpn_evpn_updgrps_cmd);
15258 install_element(VIEW_NODE, &show_bgp_instance_updgrps_stats_cmd);
15259 install_element(VIEW_NODE, &show_bgp_updgrps_stats_cmd);
15260 install_element(VIEW_NODE, &show_ip_bgp_instance_updgrps_adj_s_cmd);
15261 install_element(VIEW_NODE, &show_ip_bgp_summary_cmd);
15262 install_element(VIEW_NODE, &show_ip_bgp_updgrps_cmd);
15263
15264 /* "show [ip] bgp neighbors" commands. */
15265 install_element(VIEW_NODE, &show_ip_bgp_neighbors_cmd);
15266
15267 /* "show [ip] bgp peer-group" commands. */
15268 install_element(VIEW_NODE, &show_ip_bgp_peer_groups_cmd);
15269
15270 /* "show [ip] bgp paths" commands. */
15271 install_element(VIEW_NODE, &show_ip_bgp_paths_cmd);
15272
15273 /* "show [ip] bgp community" commands. */
15274 install_element(VIEW_NODE, &show_ip_bgp_community_info_cmd);
15275
15276 /* "show ip bgp large-community" commands. */
15277 install_element(VIEW_NODE, &show_ip_bgp_lcommunity_info_cmd);
15278 /* "show [ip] bgp attribute-info" commands. */
15279 install_element(VIEW_NODE, &show_ip_bgp_attr_info_cmd);
15280 /* "show [ip] bgp route-leak" command */
15281 install_element(VIEW_NODE, &show_ip_bgp_route_leak_cmd);
15282
15283 /* "redistribute" commands. */
15284 install_element(BGP_NODE, &bgp_redistribute_ipv4_hidden_cmd);
15285 install_element(BGP_NODE, &no_bgp_redistribute_ipv4_hidden_cmd);
15286 install_element(BGP_NODE, &bgp_redistribute_ipv4_rmap_hidden_cmd);
15287 install_element(BGP_NODE, &bgp_redistribute_ipv4_metric_hidden_cmd);
15288 install_element(BGP_NODE,
15289 &bgp_redistribute_ipv4_rmap_metric_hidden_cmd);
15290 install_element(BGP_NODE,
15291 &bgp_redistribute_ipv4_metric_rmap_hidden_cmd);
15292 install_element(BGP_NODE, &bgp_redistribute_ipv4_ospf_hidden_cmd);
15293 install_element(BGP_NODE, &no_bgp_redistribute_ipv4_ospf_hidden_cmd);
15294 install_element(BGP_NODE, &bgp_redistribute_ipv4_ospf_rmap_hidden_cmd);
15295 install_element(BGP_NODE,
15296 &bgp_redistribute_ipv4_ospf_metric_hidden_cmd);
15297 install_element(BGP_NODE,
15298 &bgp_redistribute_ipv4_ospf_rmap_metric_hidden_cmd);
15299 install_element(BGP_NODE,
15300 &bgp_redistribute_ipv4_ospf_metric_rmap_hidden_cmd);
15301 install_element(BGP_IPV4_NODE, &bgp_redistribute_ipv4_cmd);
15302 install_element(BGP_IPV4_NODE, &no_bgp_redistribute_ipv4_cmd);
15303 install_element(BGP_IPV4_NODE, &bgp_redistribute_ipv4_rmap_cmd);
15304 install_element(BGP_IPV4_NODE, &bgp_redistribute_ipv4_metric_cmd);
15305 install_element(BGP_IPV4_NODE, &bgp_redistribute_ipv4_rmap_metric_cmd);
15306 install_element(BGP_IPV4_NODE, &bgp_redistribute_ipv4_metric_rmap_cmd);
15307 install_element(BGP_IPV4_NODE, &bgp_redistribute_ipv4_ospf_cmd);
15308 install_element(BGP_IPV4_NODE, &no_bgp_redistribute_ipv4_ospf_cmd);
15309 install_element(BGP_IPV4_NODE, &bgp_redistribute_ipv4_ospf_rmap_cmd);
15310 install_element(BGP_IPV4_NODE, &bgp_redistribute_ipv4_ospf_metric_cmd);
15311 install_element(BGP_IPV4_NODE,
15312 &bgp_redistribute_ipv4_ospf_rmap_metric_cmd);
15313 install_element(BGP_IPV4_NODE,
15314 &bgp_redistribute_ipv4_ospf_metric_rmap_cmd);
15315 install_element(BGP_IPV6_NODE, &bgp_redistribute_ipv6_cmd);
15316 install_element(BGP_IPV6_NODE, &no_bgp_redistribute_ipv6_cmd);
15317 install_element(BGP_IPV6_NODE, &bgp_redistribute_ipv6_rmap_cmd);
15318 install_element(BGP_IPV6_NODE, &bgp_redistribute_ipv6_metric_cmd);
15319 install_element(BGP_IPV6_NODE, &bgp_redistribute_ipv6_rmap_metric_cmd);
15320 install_element(BGP_IPV6_NODE, &bgp_redistribute_ipv6_metric_rmap_cmd);
15321
15322 /* import|export vpn [route-map WORD] */
15323 install_element(BGP_IPV4_NODE, &bgp_imexport_vpn_cmd);
15324 install_element(BGP_IPV6_NODE, &bgp_imexport_vpn_cmd);
15325
15326 install_element(BGP_IPV4_NODE, &bgp_imexport_vrf_cmd);
15327 install_element(BGP_IPV6_NODE, &bgp_imexport_vrf_cmd);
15328
15329 /* ttl_security commands */
15330 install_element(BGP_NODE, &neighbor_ttl_security_cmd);
15331 install_element(BGP_NODE, &no_neighbor_ttl_security_cmd);
15332
15333 /* "show [ip] bgp memory" commands. */
15334 install_element(VIEW_NODE, &show_bgp_memory_cmd);
15335
15336 /* "show bgp martian next-hop" */
15337 install_element(VIEW_NODE, &show_bgp_martian_nexthop_db_cmd);
15338
15339 install_element(VIEW_NODE, &show_bgp_mac_hash_cmd);
15340
15341 /* "show [ip] bgp views" commands. */
15342 install_element(VIEW_NODE, &show_bgp_views_cmd);
15343
15344 /* "show [ip] bgp vrfs" commands. */
15345 install_element(VIEW_NODE, &show_bgp_vrfs_cmd);
15346
15347 /* Community-list. */
15348 community_list_vty();
15349
15350 /* vpn-policy commands */
15351 install_element(BGP_IPV4_NODE, &af_rd_vpn_export_cmd);
15352 install_element(BGP_IPV6_NODE, &af_rd_vpn_export_cmd);
15353 install_element(BGP_IPV4_NODE, &af_label_vpn_export_cmd);
15354 install_element(BGP_IPV6_NODE, &af_label_vpn_export_cmd);
15355 install_element(BGP_IPV4_NODE, &af_nexthop_vpn_export_cmd);
15356 install_element(BGP_IPV6_NODE, &af_nexthop_vpn_export_cmd);
15357 install_element(BGP_IPV4_NODE, &af_rt_vpn_imexport_cmd);
15358 install_element(BGP_IPV6_NODE, &af_rt_vpn_imexport_cmd);
15359 install_element(BGP_IPV4_NODE, &af_route_map_vpn_imexport_cmd);
15360 install_element(BGP_IPV6_NODE, &af_route_map_vpn_imexport_cmd);
15361 install_element(BGP_IPV4_NODE, &af_import_vrf_route_map_cmd);
15362 install_element(BGP_IPV6_NODE, &af_import_vrf_route_map_cmd);
15363
15364 install_element(BGP_IPV4_NODE, &af_routetarget_import_cmd);
15365 install_element(BGP_IPV6_NODE, &af_routetarget_import_cmd);
15366
15367 install_element(BGP_IPV4_NODE, &af_no_rd_vpn_export_cmd);
15368 install_element(BGP_IPV6_NODE, &af_no_rd_vpn_export_cmd);
15369 install_element(BGP_IPV4_NODE, &af_no_label_vpn_export_cmd);
15370 install_element(BGP_IPV6_NODE, &af_no_label_vpn_export_cmd);
15371 install_element(BGP_IPV4_NODE, &af_no_nexthop_vpn_export_cmd);
15372 install_element(BGP_IPV6_NODE, &af_no_nexthop_vpn_export_cmd);
15373 install_element(BGP_IPV4_NODE, &af_no_rt_vpn_imexport_cmd);
15374 install_element(BGP_IPV6_NODE, &af_no_rt_vpn_imexport_cmd);
15375 install_element(BGP_IPV4_NODE, &af_no_route_map_vpn_imexport_cmd);
15376 install_element(BGP_IPV6_NODE, &af_no_route_map_vpn_imexport_cmd);
15377 install_element(BGP_IPV4_NODE, &af_no_import_vrf_route_map_cmd);
15378 install_element(BGP_IPV6_NODE, &af_no_import_vrf_route_map_cmd);
15379 }
15380
15381 #include "memory.h"
15382 #include "bgp_regex.h"
15383 #include "bgp_clist.h"
15384 #include "bgp_ecommunity.h"
15385
15386 /* VTY functions. */
15387
15388 /* Direction value to string conversion. */
15389 static const char *community_direct_str(int direct)
15390 {
15391 switch (direct) {
15392 case COMMUNITY_DENY:
15393 return "deny";
15394 case COMMUNITY_PERMIT:
15395 return "permit";
15396 default:
15397 return "unknown";
15398 }
15399 }
15400
15401 /* Display error string. */
15402 static void community_list_perror(struct vty *vty, int ret)
15403 {
15404 switch (ret) {
15405 case COMMUNITY_LIST_ERR_CANT_FIND_LIST:
15406 vty_out(vty, "%% Can't find community-list\n");
15407 break;
15408 case COMMUNITY_LIST_ERR_MALFORMED_VAL:
15409 vty_out(vty, "%% Malformed community-list value\n");
15410 break;
15411 case COMMUNITY_LIST_ERR_STANDARD_CONFLICT:
15412 vty_out(vty,
15413 "%% Community name conflict, previously defined as standard community\n");
15414 break;
15415 case COMMUNITY_LIST_ERR_EXPANDED_CONFLICT:
15416 vty_out(vty,
15417 "%% Community name conflict, previously defined as expanded community\n");
15418 break;
15419 }
15420 }
15421
15422 /* "community-list" keyword help string. */
15423 #define COMMUNITY_LIST_STR "Add a community list entry\n"
15424
15425 /*community-list standard */
15426 DEFUN (community_list_standard,
15427 bgp_community_list_standard_cmd,
15428 "bgp community-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
15429 BGP_STR
15430 COMMUNITY_LIST_STR
15431 "Community list number (standard)\n"
15432 "Add an standard community-list entry\n"
15433 "Community list name\n"
15434 "Specify community to reject\n"
15435 "Specify community to accept\n"
15436 COMMUNITY_VAL_STR)
15437 {
15438 char *cl_name_or_number = NULL;
15439 int direct = 0;
15440 int style = COMMUNITY_LIST_STANDARD;
15441 int idx = 0;
15442
15443 argv_find(argv, argc, "(1-99)", &idx);
15444 argv_find(argv, argc, "WORD", &idx);
15445 cl_name_or_number = argv[idx]->arg;
15446 direct = argv_find(argv, argc, "permit", &idx) ? COMMUNITY_PERMIT
15447 : COMMUNITY_DENY;
15448 argv_find(argv, argc, "AA:NN", &idx);
15449 char *str = argv_concat(argv, argc, idx);
15450
15451 int ret = community_list_set(bgp_clist, cl_name_or_number, str, direct,
15452 style);
15453
15454 XFREE(MTYPE_TMP, str);
15455
15456 if (ret < 0) {
15457 /* Display error string. */
15458 community_list_perror(vty, ret);
15459 return CMD_WARNING_CONFIG_FAILED;
15460 }
15461
15462 return CMD_SUCCESS;
15463 }
15464
15465 DEFUN (no_community_list_standard_all,
15466 no_bgp_community_list_standard_all_cmd,
15467 "no bgp community-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
15468 NO_STR
15469 BGP_STR
15470 COMMUNITY_LIST_STR
15471 "Community list number (standard)\n"
15472 "Add an standard community-list entry\n"
15473 "Community list name\n"
15474 "Specify community to reject\n"
15475 "Specify community to accept\n"
15476 COMMUNITY_VAL_STR)
15477 {
15478 char *cl_name_or_number = NULL;
15479 char *str = NULL;
15480 int direct = 0;
15481 int style = COMMUNITY_LIST_STANDARD;
15482
15483 int idx = 0;
15484
15485 argv_find(argv, argc, "permit", &idx);
15486 argv_find(argv, argc, "deny", &idx);
15487
15488 if (idx) {
15489 direct = argv_find(argv, argc, "permit", &idx)
15490 ? COMMUNITY_PERMIT
15491 : COMMUNITY_DENY;
15492
15493 idx = 0;
15494 argv_find(argv, argc, "AA:NN", &idx);
15495 str = argv_concat(argv, argc, idx);
15496 }
15497
15498 idx = 0;
15499 argv_find(argv, argc, "(1-99)", &idx);
15500 argv_find(argv, argc, "WORD", &idx);
15501 cl_name_or_number = argv[idx]->arg;
15502
15503 int ret = community_list_unset(bgp_clist, cl_name_or_number, str,
15504 direct, style);
15505
15506 XFREE(MTYPE_TMP, str);
15507
15508 if (ret < 0) {
15509 community_list_perror(vty, ret);
15510 return CMD_WARNING_CONFIG_FAILED;
15511 }
15512
15513 return CMD_SUCCESS;
15514 }
15515
15516 ALIAS(no_community_list_standard_all, no_bgp_community_list_standard_all_list_cmd,
15517 "no bgp community-list <(1-99)|standard WORD>",
15518 NO_STR BGP_STR COMMUNITY_LIST_STR
15519 "Community list number (standard)\n"
15520 "Add an standard community-list entry\n"
15521 "Community list name\n")
15522
15523 /*community-list expanded */
15524 DEFUN (community_list_expanded_all,
15525 bgp_community_list_expanded_all_cmd,
15526 "bgp community-list <(100-500)|expanded WORD> <deny|permit> AA:NN...",
15527 BGP_STR
15528 COMMUNITY_LIST_STR
15529 "Community list number (expanded)\n"
15530 "Add an expanded community-list entry\n"
15531 "Community list name\n"
15532 "Specify community to reject\n"
15533 "Specify community to accept\n"
15534 COMMUNITY_VAL_STR)
15535 {
15536 char *cl_name_or_number = NULL;
15537 int direct = 0;
15538 int style = COMMUNITY_LIST_EXPANDED;
15539
15540 int idx = 0;
15541
15542 argv_find(argv, argc, "(100-500)", &idx);
15543 argv_find(argv, argc, "WORD", &idx);
15544 cl_name_or_number = argv[idx]->arg;
15545 direct = argv_find(argv, argc, "permit", &idx) ? COMMUNITY_PERMIT
15546 : COMMUNITY_DENY;
15547 argv_find(argv, argc, "AA:NN", &idx);
15548 char *str = argv_concat(argv, argc, idx);
15549
15550 int ret = community_list_set(bgp_clist, cl_name_or_number, str, direct,
15551 style);
15552
15553 XFREE(MTYPE_TMP, str);
15554
15555 if (ret < 0) {
15556 /* Display error string. */
15557 community_list_perror(vty, ret);
15558 return CMD_WARNING_CONFIG_FAILED;
15559 }
15560
15561 return CMD_SUCCESS;
15562 }
15563
15564 DEFUN (no_community_list_expanded_all,
15565 no_bgp_community_list_expanded_all_cmd,
15566 "no bgp community-list <(100-500)|expanded WORD> <deny|permit> AA:NN...",
15567 NO_STR
15568 BGP_STR
15569 COMMUNITY_LIST_STR
15570 "Community list number (expanded)\n"
15571 "Add an expanded community-list entry\n"
15572 "Community list name\n"
15573 "Specify community to reject\n"
15574 "Specify community to accept\n"
15575 COMMUNITY_VAL_STR)
15576 {
15577 char *cl_name_or_number = NULL;
15578 char *str = NULL;
15579 int direct = 0;
15580 int style = COMMUNITY_LIST_EXPANDED;
15581
15582 int idx = 0;
15583
15584 argv_find(argv, argc, "permit", &idx);
15585 argv_find(argv, argc, "deny", &idx);
15586
15587 if (idx) {
15588 direct = argv_find(argv, argc, "permit", &idx)
15589 ? COMMUNITY_PERMIT
15590 : COMMUNITY_DENY;
15591
15592 idx = 0;
15593 argv_find(argv, argc, "AA:NN", &idx);
15594 str = argv_concat(argv, argc, idx);
15595 }
15596
15597 idx = 0;
15598 argv_find(argv, argc, "(100-500)", &idx);
15599 argv_find(argv, argc, "WORD", &idx);
15600 cl_name_or_number = argv[idx]->arg;
15601
15602 int ret = community_list_unset(bgp_clist, cl_name_or_number, str,
15603 direct, style);
15604
15605 XFREE(MTYPE_TMP, str);
15606
15607 if (ret < 0) {
15608 community_list_perror(vty, ret);
15609 return CMD_WARNING_CONFIG_FAILED;
15610 }
15611
15612 return CMD_SUCCESS;
15613 }
15614
15615 ALIAS(no_community_list_expanded_all, no_bgp_community_list_expanded_all_list_cmd,
15616 "no bgp community-list <(100-500)|expanded WORD>",
15617 NO_STR IP_STR COMMUNITY_LIST_STR
15618 "Community list number (expanded)\n"
15619 "Add an expanded community-list entry\n"
15620 "Community list name\n")
15621
15622 /* Return configuration string of community-list entry. */
15623 static const char *community_list_config_str(struct community_entry *entry)
15624 {
15625 const char *str;
15626
15627 if (entry->any)
15628 str = "";
15629 else {
15630 if (entry->style == COMMUNITY_LIST_STANDARD)
15631 str = community_str(entry->u.com, false);
15632 else if (entry->style == LARGE_COMMUNITY_LIST_STANDARD)
15633 str = lcommunity_str(entry->u.lcom, false);
15634 else
15635 str = entry->config;
15636 }
15637 return str;
15638 }
15639
15640 static void community_list_show(struct vty *vty, struct community_list *list)
15641 {
15642 struct community_entry *entry;
15643
15644 for (entry = list->head; entry; entry = entry->next) {
15645 if (entry == list->head) {
15646 if (all_digit(list->name))
15647 vty_out(vty, "Community %s list %s\n",
15648 entry->style == COMMUNITY_LIST_STANDARD
15649 ? "standard"
15650 : "(expanded) access",
15651 list->name);
15652 else
15653 vty_out(vty, "Named Community %s list %s\n",
15654 entry->style == COMMUNITY_LIST_STANDARD
15655 ? "standard"
15656 : "expanded",
15657 list->name);
15658 }
15659 if (entry->any)
15660 vty_out(vty, " %s\n",
15661 community_direct_str(entry->direct));
15662 else
15663 vty_out(vty, " %s %s\n",
15664 community_direct_str(entry->direct),
15665 community_list_config_str(entry));
15666 }
15667 }
15668
15669 DEFUN (show_community_list,
15670 show_bgp_community_list_cmd,
15671 "show bgp community-list",
15672 SHOW_STR
15673 BGP_STR
15674 "List community-list\n")
15675 {
15676 struct community_list *list;
15677 struct community_list_master *cm;
15678
15679 cm = community_list_master_lookup(bgp_clist, COMMUNITY_LIST_MASTER);
15680 if (!cm)
15681 return CMD_SUCCESS;
15682
15683 for (list = cm->num.head; list; list = list->next)
15684 community_list_show(vty, list);
15685
15686 for (list = cm->str.head; list; list = list->next)
15687 community_list_show(vty, list);
15688
15689 return CMD_SUCCESS;
15690 }
15691
15692 DEFUN (show_community_list_arg,
15693 show_bgp_community_list_arg_cmd,
15694 "show bgp community-list <(1-500)|WORD> detail",
15695 SHOW_STR
15696 BGP_STR
15697 "List community-list\n"
15698 "Community-list number\n"
15699 "Community-list name\n"
15700 "Detailed information on community-list\n")
15701 {
15702 int idx_comm_list = 3;
15703 struct community_list *list;
15704
15705 list = community_list_lookup(bgp_clist, argv[idx_comm_list]->arg, 0,
15706 COMMUNITY_LIST_MASTER);
15707 if (!list) {
15708 vty_out(vty, "%% Can't find community-list\n");
15709 return CMD_WARNING;
15710 }
15711
15712 community_list_show(vty, list);
15713
15714 return CMD_SUCCESS;
15715 }
15716
15717 /*
15718 * Large Community code.
15719 */
15720 static int lcommunity_list_set_vty(struct vty *vty, int argc,
15721 struct cmd_token **argv, int style,
15722 int reject_all_digit_name)
15723 {
15724 int ret;
15725 int direct;
15726 char *str;
15727 int idx = 0;
15728 char *cl_name;
15729
15730 direct = argv_find(argv, argc, "permit", &idx) ? COMMUNITY_PERMIT
15731 : COMMUNITY_DENY;
15732
15733 /* All digit name check. */
15734 idx = 0;
15735 argv_find(argv, argc, "WORD", &idx);
15736 argv_find(argv, argc, "(1-99)", &idx);
15737 argv_find(argv, argc, "(100-500)", &idx);
15738 cl_name = argv[idx]->arg;
15739 if (reject_all_digit_name && all_digit(cl_name)) {
15740 vty_out(vty, "%% Community name cannot have all digits\n");
15741 return CMD_WARNING_CONFIG_FAILED;
15742 }
15743
15744 idx = 0;
15745 argv_find(argv, argc, "AA:BB:CC", &idx);
15746 argv_find(argv, argc, "LINE", &idx);
15747 /* Concat community string argument. */
15748 if (idx)
15749 str = argv_concat(argv, argc, idx);
15750 else
15751 str = NULL;
15752
15753 ret = lcommunity_list_set(bgp_clist, cl_name, str, direct, style);
15754
15755 /* Free temporary community list string allocated by
15756 argv_concat(). */
15757 XFREE(MTYPE_TMP, str);
15758
15759 if (ret < 0) {
15760 community_list_perror(vty, ret);
15761 return CMD_WARNING_CONFIG_FAILED;
15762 }
15763 return CMD_SUCCESS;
15764 }
15765
15766 static int lcommunity_list_unset_vty(struct vty *vty, int argc,
15767 struct cmd_token **argv, int style)
15768 {
15769 int ret;
15770 int direct = 0;
15771 char *str = NULL;
15772 int idx = 0;
15773
15774 argv_find(argv, argc, "permit", &idx);
15775 argv_find(argv, argc, "deny", &idx);
15776
15777 if (idx) {
15778 /* Check the list direct. */
15779 if (strncmp(argv[idx]->arg, "p", 1) == 0)
15780 direct = COMMUNITY_PERMIT;
15781 else
15782 direct = COMMUNITY_DENY;
15783
15784 idx = 0;
15785 argv_find(argv, argc, "LINE", &idx);
15786 argv_find(argv, argc, "AA:AA:NN", &idx);
15787 /* Concat community string argument. */
15788 str = argv_concat(argv, argc, idx);
15789 }
15790
15791 idx = 0;
15792 argv_find(argv, argc, "(1-99)", &idx);
15793 argv_find(argv, argc, "(100-500)", &idx);
15794 argv_find(argv, argc, "WORD", &idx);
15795
15796 /* Unset community list. */
15797 ret = lcommunity_list_unset(bgp_clist, argv[idx]->arg, str, direct,
15798 style);
15799
15800 /* Free temporary community list string allocated by
15801 argv_concat(). */
15802 XFREE(MTYPE_TMP, str);
15803
15804 if (ret < 0) {
15805 community_list_perror(vty, ret);
15806 return CMD_WARNING_CONFIG_FAILED;
15807 }
15808
15809 return CMD_SUCCESS;
15810 }
15811
15812 /* "large-community-list" keyword help string. */
15813 #define LCOMMUNITY_LIST_STR "Add a large community list entry\n"
15814 #define LCOMMUNITY_VAL_STR "large community in 'aa:bb:cc' format\n"
15815
15816 DEFUN (lcommunity_list_standard,
15817 bgp_lcommunity_list_standard_cmd,
15818 "bgp large-community-list (1-99) <deny|permit> AA:BB:CC...",
15819 BGP_STR
15820 LCOMMUNITY_LIST_STR
15821 "Large Community list number (standard)\n"
15822 "Specify large community to reject\n"
15823 "Specify large community to accept\n"
15824 LCOMMUNITY_VAL_STR)
15825 {
15826 return lcommunity_list_set_vty(vty, argc, argv,
15827 LARGE_COMMUNITY_LIST_STANDARD, 0);
15828 }
15829
15830 DEFUN (lcommunity_list_expanded,
15831 bgp_lcommunity_list_expanded_cmd,
15832 "bgp large-community-list (100-500) <deny|permit> LINE...",
15833 BGP_STR
15834 LCOMMUNITY_LIST_STR
15835 "Large Community list number (expanded)\n"
15836 "Specify large community to reject\n"
15837 "Specify large community to accept\n"
15838 "An ordered list as a regular-expression\n")
15839 {
15840 return lcommunity_list_set_vty(vty, argc, argv,
15841 LARGE_COMMUNITY_LIST_EXPANDED, 0);
15842 }
15843
15844 DEFUN (lcommunity_list_name_standard,
15845 bgp_lcommunity_list_name_standard_cmd,
15846 "bgp large-community-list standard WORD <deny|permit> AA:BB:CC...",
15847 BGP_STR
15848 LCOMMUNITY_LIST_STR
15849 "Specify standard large-community-list\n"
15850 "Large Community list name\n"
15851 "Specify large community to reject\n"
15852 "Specify large community to accept\n"
15853 LCOMMUNITY_VAL_STR)
15854 {
15855 return lcommunity_list_set_vty(vty, argc, argv,
15856 LARGE_COMMUNITY_LIST_STANDARD, 1);
15857 }
15858
15859 DEFUN (lcommunity_list_name_expanded,
15860 bgp_lcommunity_list_name_expanded_cmd,
15861 "bgp large-community-list expanded WORD <deny|permit> LINE...",
15862 BGP_STR
15863 LCOMMUNITY_LIST_STR
15864 "Specify expanded large-community-list\n"
15865 "Large Community list name\n"
15866 "Specify large community to reject\n"
15867 "Specify large community to accept\n"
15868 "An ordered list as a regular-expression\n")
15869 {
15870 return lcommunity_list_set_vty(vty, argc, argv,
15871 LARGE_COMMUNITY_LIST_EXPANDED, 1);
15872 }
15873
15874 DEFUN (no_lcommunity_list_standard_all,
15875 no_bgp_lcommunity_list_standard_all_cmd,
15876 "no bgp large-community-list <(1-99)|(100-500)|WORD>",
15877 NO_STR
15878 BGP_STR
15879 LCOMMUNITY_LIST_STR
15880 "Large Community list number (standard)\n"
15881 "Large Community list number (expanded)\n"
15882 "Large Community list name\n")
15883 {
15884 return lcommunity_list_unset_vty(vty, argc, argv,
15885 LARGE_COMMUNITY_LIST_STANDARD);
15886 }
15887
15888 DEFUN (no_lcommunity_list_name_expanded_all,
15889 no_bgp_lcommunity_list_name_expanded_all_cmd,
15890 "no bgp large-community-list expanded WORD",
15891 NO_STR
15892 BGP_STR
15893 LCOMMUNITY_LIST_STR
15894 "Specify expanded large-community-list\n"
15895 "Large Community list name\n")
15896 {
15897 return lcommunity_list_unset_vty(vty, argc, argv,
15898 LARGE_COMMUNITY_LIST_EXPANDED);
15899 }
15900
15901 DEFUN (no_lcommunity_list_standard,
15902 no_bgp_lcommunity_list_standard_cmd,
15903 "no bgp large-community-list (1-99) <deny|permit> AA:AA:NN...",
15904 NO_STR
15905 BGP_STR
15906 LCOMMUNITY_LIST_STR
15907 "Large Community list number (standard)\n"
15908 "Specify large community to reject\n"
15909 "Specify large community to accept\n"
15910 LCOMMUNITY_VAL_STR)
15911 {
15912 return lcommunity_list_unset_vty(vty, argc, argv,
15913 LARGE_COMMUNITY_LIST_STANDARD);
15914 }
15915
15916 DEFUN (no_lcommunity_list_expanded,
15917 no_bgp_lcommunity_list_expanded_cmd,
15918 "no bgp large-community-list (100-500) <deny|permit> LINE...",
15919 NO_STR
15920 BGP_STR
15921 LCOMMUNITY_LIST_STR
15922 "Large Community list number (expanded)\n"
15923 "Specify large community to reject\n"
15924 "Specify large community to accept\n"
15925 "An ordered list as a regular-expression\n")
15926 {
15927 return lcommunity_list_unset_vty(vty, argc, argv,
15928 LARGE_COMMUNITY_LIST_EXPANDED);
15929 }
15930
15931 DEFUN (no_lcommunity_list_name_standard,
15932 no_bgp_lcommunity_list_name_standard_cmd,
15933 "no bgp large-community-list standard WORD <deny|permit> AA:AA:NN...",
15934 NO_STR
15935 BGP_STR
15936 LCOMMUNITY_LIST_STR
15937 "Specify standard large-community-list\n"
15938 "Large Community list name\n"
15939 "Specify large community to reject\n"
15940 "Specify large community to accept\n"
15941 LCOMMUNITY_VAL_STR)
15942 {
15943 return lcommunity_list_unset_vty(vty, argc, argv,
15944 LARGE_COMMUNITY_LIST_STANDARD);
15945 }
15946
15947 DEFUN (no_lcommunity_list_name_expanded,
15948 no_bgp_lcommunity_list_name_expanded_cmd,
15949 "no bgp large-community-list expanded WORD <deny|permit> LINE...",
15950 NO_STR
15951 BGP_STR
15952 LCOMMUNITY_LIST_STR
15953 "Specify expanded large-community-list\n"
15954 "Large community list name\n"
15955 "Specify large community to reject\n"
15956 "Specify large community to accept\n"
15957 "An ordered list as a regular-expression\n")
15958 {
15959 return lcommunity_list_unset_vty(vty, argc, argv,
15960 LARGE_COMMUNITY_LIST_EXPANDED);
15961 }
15962
15963 static void lcommunity_list_show(struct vty *vty, struct community_list *list)
15964 {
15965 struct community_entry *entry;
15966
15967 for (entry = list->head; entry; entry = entry->next) {
15968 if (entry == list->head) {
15969 if (all_digit(list->name))
15970 vty_out(vty, "Large community %s list %s\n",
15971 entry->style ==
15972 LARGE_COMMUNITY_LIST_STANDARD
15973 ? "standard"
15974 : "(expanded) access",
15975 list->name);
15976 else
15977 vty_out(vty,
15978 "Named large community %s list %s\n",
15979 entry->style ==
15980 LARGE_COMMUNITY_LIST_STANDARD
15981 ? "standard"
15982 : "expanded",
15983 list->name);
15984 }
15985 if (entry->any)
15986 vty_out(vty, " %s\n",
15987 community_direct_str(entry->direct));
15988 else
15989 vty_out(vty, " %s %s\n",
15990 community_direct_str(entry->direct),
15991 community_list_config_str(entry));
15992 }
15993 }
15994
15995 DEFUN (show_lcommunity_list,
15996 show_bgp_lcommunity_list_cmd,
15997 "show bgp large-community-list",
15998 SHOW_STR
15999 BGP_STR
16000 "List large-community list\n")
16001 {
16002 struct community_list *list;
16003 struct community_list_master *cm;
16004
16005 cm = community_list_master_lookup(bgp_clist,
16006 LARGE_COMMUNITY_LIST_MASTER);
16007 if (!cm)
16008 return CMD_SUCCESS;
16009
16010 for (list = cm->num.head; list; list = list->next)
16011 lcommunity_list_show(vty, list);
16012
16013 for (list = cm->str.head; list; list = list->next)
16014 lcommunity_list_show(vty, list);
16015
16016 return CMD_SUCCESS;
16017 }
16018
16019 DEFUN (show_lcommunity_list_arg,
16020 show_bgp_lcommunity_list_arg_cmd,
16021 "show bgp large-community-list <(1-500)|WORD> detail",
16022 SHOW_STR
16023 BGP_STR
16024 "List large-community list\n"
16025 "Large-community-list number\n"
16026 "Large-community-list name\n"
16027 "Detailed information on large-community-list\n")
16028 {
16029 struct community_list *list;
16030
16031 list = community_list_lookup(bgp_clist, argv[3]->arg, 0,
16032 LARGE_COMMUNITY_LIST_MASTER);
16033 if (!list) {
16034 vty_out(vty, "%% Can't find large-community-list\n");
16035 return CMD_WARNING;
16036 }
16037
16038 lcommunity_list_show(vty, list);
16039
16040 return CMD_SUCCESS;
16041 }
16042
16043 /* "extcommunity-list" keyword help string. */
16044 #define EXTCOMMUNITY_LIST_STR "Add a extended community list entry\n"
16045 #define EXTCOMMUNITY_VAL_STR "Extended community attribute in 'rt aa:nn_or_IPaddr:nn' OR 'soo aa:nn_or_IPaddr:nn' format\n"
16046
16047 DEFUN (extcommunity_list_standard,
16048 bgp_extcommunity_list_standard_cmd,
16049 "bgp extcommunity-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
16050 BGP_STR
16051 EXTCOMMUNITY_LIST_STR
16052 "Extended Community list number (standard)\n"
16053 "Specify standard extcommunity-list\n"
16054 "Community list name\n"
16055 "Specify community to reject\n"
16056 "Specify community to accept\n"
16057 EXTCOMMUNITY_VAL_STR)
16058 {
16059 int style = EXTCOMMUNITY_LIST_STANDARD;
16060 int direct = 0;
16061 char *cl_number_or_name = NULL;
16062
16063 int idx = 0;
16064
16065 argv_find(argv, argc, "(1-99)", &idx);
16066 argv_find(argv, argc, "WORD", &idx);
16067 cl_number_or_name = argv[idx]->arg;
16068 direct = argv_find(argv, argc, "permit", &idx) ? COMMUNITY_PERMIT
16069 : COMMUNITY_DENY;
16070 argv_find(argv, argc, "AA:NN", &idx);
16071 char *str = argv_concat(argv, argc, idx);
16072
16073 int ret = extcommunity_list_set(bgp_clist, cl_number_or_name, str,
16074 direct, style);
16075
16076 XFREE(MTYPE_TMP, str);
16077
16078 if (ret < 0) {
16079 community_list_perror(vty, ret);
16080 return CMD_WARNING_CONFIG_FAILED;
16081 }
16082
16083 return CMD_SUCCESS;
16084 }
16085
16086 DEFUN (extcommunity_list_name_expanded,
16087 bgp_extcommunity_list_name_expanded_cmd,
16088 "bgp extcommunity-list <(100-500)|expanded WORD> <deny|permit> LINE...",
16089 BGP_STR
16090 EXTCOMMUNITY_LIST_STR
16091 "Extended Community list number (expanded)\n"
16092 "Specify expanded extcommunity-list\n"
16093 "Extended Community list name\n"
16094 "Specify community to reject\n"
16095 "Specify community to accept\n"
16096 "An ordered list as a regular-expression\n")
16097 {
16098 int style = EXTCOMMUNITY_LIST_EXPANDED;
16099 int direct = 0;
16100 char *cl_number_or_name = NULL;
16101 int idx = 0;
16102
16103 argv_find(argv, argc, "(100-500)", &idx);
16104 argv_find(argv, argc, "WORD", &idx);
16105 cl_number_or_name = argv[idx]->arg;
16106 direct = argv_find(argv, argc, "permit", &idx) ? COMMUNITY_PERMIT
16107 : COMMUNITY_DENY;
16108 argv_find(argv, argc, "LINE", &idx);
16109 char *str = argv_concat(argv, argc, idx);
16110
16111 int ret = extcommunity_list_set(bgp_clist, cl_number_or_name, str,
16112 direct, style);
16113
16114 XFREE(MTYPE_TMP, str);
16115
16116 if (ret < 0) {
16117 community_list_perror(vty, ret);
16118 return CMD_WARNING_CONFIG_FAILED;
16119 }
16120
16121 return CMD_SUCCESS;
16122 }
16123
16124 DEFUN (no_extcommunity_list_standard_all,
16125 no_bgp_extcommunity_list_standard_all_cmd,
16126 "no bgp extcommunity-list <(1-99)|standard WORD> <deny|permit> AA:NN...",
16127 NO_STR
16128 BGP_STR
16129 EXTCOMMUNITY_LIST_STR
16130 "Extended Community list number (standard)\n"
16131 "Specify standard extcommunity-list\n"
16132 "Community list name\n"
16133 "Specify community to reject\n"
16134 "Specify community to accept\n"
16135 EXTCOMMUNITY_VAL_STR)
16136 {
16137 int style = EXTCOMMUNITY_LIST_STANDARD;
16138 int direct = 0;
16139 char *cl_number_or_name = NULL;
16140 char *str = NULL;
16141 int idx = 0;
16142
16143 argv_find(argv, argc, "permit", &idx);
16144 argv_find(argv, argc, "deny", &idx);
16145
16146 if (idx) {
16147 direct = argv_find(argv, argc, "permit", &idx)
16148 ? COMMUNITY_PERMIT
16149 : COMMUNITY_DENY;
16150
16151 idx = 0;
16152 argv_find(argv, argc, "AA:NN", &idx);
16153 str = argv_concat(argv, argc, idx);
16154 }
16155
16156 idx = 0;
16157 argv_find(argv, argc, "(1-99)", &idx);
16158 argv_find(argv, argc, "WORD", &idx);
16159 cl_number_or_name = argv[idx]->arg;
16160
16161 int ret = extcommunity_list_unset(bgp_clist, cl_number_or_name, str,
16162 direct, style);
16163
16164 XFREE(MTYPE_TMP, str);
16165
16166 if (ret < 0) {
16167 community_list_perror(vty, ret);
16168 return CMD_WARNING_CONFIG_FAILED;
16169 }
16170
16171 return CMD_SUCCESS;
16172 }
16173
16174 ALIAS(no_extcommunity_list_standard_all,
16175 no_bgp_extcommunity_list_standard_all_list_cmd,
16176 "no bgp extcommunity-list <(1-99)|standard WORD>",
16177 NO_STR IP_STR EXTCOMMUNITY_LIST_STR
16178 "Extended Community list number (standard)\n"
16179 "Specify standard extcommunity-list\n"
16180 "Community list name\n")
16181
16182 DEFUN (no_extcommunity_list_expanded_all,
16183 no_bgp_extcommunity_list_expanded_all_cmd,
16184 "no bgp extcommunity-list <(100-500)|expanded WORD> <deny|permit> LINE...",
16185 NO_STR
16186 BGP_STR
16187 EXTCOMMUNITY_LIST_STR
16188 "Extended Community list number (expanded)\n"
16189 "Specify expanded extcommunity-list\n"
16190 "Extended Community list name\n"
16191 "Specify community to reject\n"
16192 "Specify community to accept\n"
16193 "An ordered list as a regular-expression\n")
16194 {
16195 int style = EXTCOMMUNITY_LIST_EXPANDED;
16196 int direct = 0;
16197 char *cl_number_or_name = NULL;
16198 char *str = NULL;
16199 int idx = 0;
16200
16201 argv_find(argv, argc, "permit", &idx);
16202 argv_find(argv, argc, "deny", &idx);
16203
16204 if (idx) {
16205 direct = argv_find(argv, argc, "permit", &idx)
16206 ? COMMUNITY_PERMIT
16207 : COMMUNITY_DENY;
16208
16209 idx = 0;
16210 argv_find(argv, argc, "LINE", &idx);
16211 str = argv_concat(argv, argc, idx);
16212 }
16213
16214 idx = 0;
16215 argv_find(argv, argc, "(100-500)", &idx);
16216 argv_find(argv, argc, "WORD", &idx);
16217 cl_number_or_name = argv[idx]->arg;
16218
16219 int ret = extcommunity_list_unset(bgp_clist, cl_number_or_name, str,
16220 direct, style);
16221
16222 XFREE(MTYPE_TMP, str);
16223
16224 if (ret < 0) {
16225 community_list_perror(vty, ret);
16226 return CMD_WARNING_CONFIG_FAILED;
16227 }
16228
16229 return CMD_SUCCESS;
16230 }
16231
16232 ALIAS(no_extcommunity_list_expanded_all,
16233 no_bgp_extcommunity_list_expanded_all_list_cmd,
16234 "no bgp extcommunity-list <(100-500)|expanded WORD>",
16235 NO_STR IP_STR EXTCOMMUNITY_LIST_STR
16236 "Extended Community list number (expanded)\n"
16237 "Specify expanded extcommunity-list\n"
16238 "Extended Community list name\n")
16239
16240 static void extcommunity_list_show(struct vty *vty, struct community_list *list)
16241 {
16242 struct community_entry *entry;
16243
16244 for (entry = list->head; entry; entry = entry->next) {
16245 if (entry == list->head) {
16246 if (all_digit(list->name))
16247 vty_out(vty, "Extended community %s list %s\n",
16248 entry->style == EXTCOMMUNITY_LIST_STANDARD
16249 ? "standard"
16250 : "(expanded) access",
16251 list->name);
16252 else
16253 vty_out(vty,
16254 "Named extended community %s list %s\n",
16255 entry->style == EXTCOMMUNITY_LIST_STANDARD
16256 ? "standard"
16257 : "expanded",
16258 list->name);
16259 }
16260 if (entry->any)
16261 vty_out(vty, " %s\n",
16262 community_direct_str(entry->direct));
16263 else
16264 vty_out(vty, " %s %s\n",
16265 community_direct_str(entry->direct),
16266 community_list_config_str(entry));
16267 }
16268 }
16269
16270 DEFUN (show_extcommunity_list,
16271 show_bgp_extcommunity_list_cmd,
16272 "show bgp extcommunity-list",
16273 SHOW_STR
16274 BGP_STR
16275 "List extended-community list\n")
16276 {
16277 struct community_list *list;
16278 struct community_list_master *cm;
16279
16280 cm = community_list_master_lookup(bgp_clist, EXTCOMMUNITY_LIST_MASTER);
16281 if (!cm)
16282 return CMD_SUCCESS;
16283
16284 for (list = cm->num.head; list; list = list->next)
16285 extcommunity_list_show(vty, list);
16286
16287 for (list = cm->str.head; list; list = list->next)
16288 extcommunity_list_show(vty, list);
16289
16290 return CMD_SUCCESS;
16291 }
16292
16293 DEFUN (show_extcommunity_list_arg,
16294 show_bgp_extcommunity_list_arg_cmd,
16295 "show bgp extcommunity-list <(1-500)|WORD> detail",
16296 SHOW_STR
16297 BGP_STR
16298 "List extended-community list\n"
16299 "Extcommunity-list number\n"
16300 "Extcommunity-list name\n"
16301 "Detailed information on extcommunity-list\n")
16302 {
16303 int idx_comm_list = 3;
16304 struct community_list *list;
16305
16306 list = community_list_lookup(bgp_clist, argv[idx_comm_list]->arg, 0,
16307 EXTCOMMUNITY_LIST_MASTER);
16308 if (!list) {
16309 vty_out(vty, "%% Can't find extcommunity-list\n");
16310 return CMD_WARNING;
16311 }
16312
16313 extcommunity_list_show(vty, list);
16314
16315 return CMD_SUCCESS;
16316 }
16317
16318 /* Display community-list and extcommunity-list configuration. */
16319 static int community_list_config_write(struct vty *vty)
16320 {
16321 struct community_list *list;
16322 struct community_entry *entry;
16323 struct community_list_master *cm;
16324 int write = 0;
16325
16326 /* Community-list. */
16327 cm = community_list_master_lookup(bgp_clist, COMMUNITY_LIST_MASTER);
16328
16329 for (list = cm->num.head; list; list = list->next)
16330 for (entry = list->head; entry; entry = entry->next) {
16331 vty_out(vty, "bgp community-list %s %s %s\n", list->name,
16332 community_direct_str(entry->direct),
16333 community_list_config_str(entry));
16334 write++;
16335 }
16336 for (list = cm->str.head; list; list = list->next)
16337 for (entry = list->head; entry; entry = entry->next) {
16338 vty_out(vty, "bgp community-list %s %s %s %s\n",
16339 entry->style == COMMUNITY_LIST_STANDARD
16340 ? "standard"
16341 : "expanded",
16342 list->name, community_direct_str(entry->direct),
16343 community_list_config_str(entry));
16344 write++;
16345 }
16346
16347 /* Extcommunity-list. */
16348 cm = community_list_master_lookup(bgp_clist, EXTCOMMUNITY_LIST_MASTER);
16349
16350 for (list = cm->num.head; list; list = list->next)
16351 for (entry = list->head; entry; entry = entry->next) {
16352 vty_out(vty, "bgp extcommunity-list %s %s %s\n",
16353 list->name, community_direct_str(entry->direct),
16354 community_list_config_str(entry));
16355 write++;
16356 }
16357 for (list = cm->str.head; list; list = list->next)
16358 for (entry = list->head; entry; entry = entry->next) {
16359 vty_out(vty, "bgp extcommunity-list %s %s %s %s\n",
16360 entry->style == EXTCOMMUNITY_LIST_STANDARD
16361 ? "standard"
16362 : "expanded",
16363 list->name, community_direct_str(entry->direct),
16364 community_list_config_str(entry));
16365 write++;
16366 }
16367
16368
16369 /* lcommunity-list. */
16370 cm = community_list_master_lookup(bgp_clist,
16371 LARGE_COMMUNITY_LIST_MASTER);
16372
16373 for (list = cm->num.head; list; list = list->next)
16374 for (entry = list->head; entry; entry = entry->next) {
16375 vty_out(vty, "bgp large-community-list %s %s %s\n",
16376 list->name, community_direct_str(entry->direct),
16377 community_list_config_str(entry));
16378 write++;
16379 }
16380 for (list = cm->str.head; list; list = list->next)
16381 for (entry = list->head; entry; entry = entry->next) {
16382 vty_out(vty, "bgp large-community-list %s %s %s %s\n",
16383 entry->style == LARGE_COMMUNITY_LIST_STANDARD
16384 ? "standard"
16385 : "expanded",
16386 list->name, community_direct_str(entry->direct),
16387 community_list_config_str(entry));
16388 write++;
16389 }
16390
16391 return write;
16392 }
16393
16394 static struct cmd_node community_list_node = {
16395 COMMUNITY_LIST_NODE, "", 1 /* Export to vtysh. */
16396 };
16397
16398 static void community_list_vty(void)
16399 {
16400 install_node(&community_list_node, community_list_config_write);
16401
16402 /* Community-list. */
16403 install_element(CONFIG_NODE, &bgp_community_list_standard_cmd);
16404 install_element(CONFIG_NODE, &bgp_community_list_expanded_all_cmd);
16405 install_element(CONFIG_NODE, &no_bgp_community_list_standard_all_cmd);
16406 install_element(CONFIG_NODE, &no_bgp_community_list_standard_all_list_cmd);
16407 install_element(CONFIG_NODE, &no_bgp_community_list_expanded_all_cmd);
16408 install_element(CONFIG_NODE, &no_bgp_community_list_expanded_all_list_cmd);
16409 install_element(VIEW_NODE, &show_bgp_community_list_cmd);
16410 install_element(VIEW_NODE, &show_bgp_community_list_arg_cmd);
16411
16412 /* Extcommunity-list. */
16413 install_element(CONFIG_NODE, &bgp_extcommunity_list_standard_cmd);
16414 install_element(CONFIG_NODE, &bgp_extcommunity_list_name_expanded_cmd);
16415 install_element(CONFIG_NODE, &no_bgp_extcommunity_list_standard_all_cmd);
16416 install_element(CONFIG_NODE,
16417 &no_bgp_extcommunity_list_standard_all_list_cmd);
16418 install_element(CONFIG_NODE, &no_bgp_extcommunity_list_expanded_all_cmd);
16419 install_element(CONFIG_NODE,
16420 &no_bgp_extcommunity_list_expanded_all_list_cmd);
16421 install_element(VIEW_NODE, &show_bgp_extcommunity_list_cmd);
16422 install_element(VIEW_NODE, &show_bgp_extcommunity_list_arg_cmd);
16423
16424 /* Large Community List */
16425 install_element(CONFIG_NODE, &bgp_lcommunity_list_standard_cmd);
16426 install_element(CONFIG_NODE, &bgp_lcommunity_list_expanded_cmd);
16427 install_element(CONFIG_NODE, &bgp_lcommunity_list_name_standard_cmd);
16428 install_element(CONFIG_NODE, &bgp_lcommunity_list_name_expanded_cmd);
16429 install_element(CONFIG_NODE, &no_bgp_lcommunity_list_standard_all_cmd);
16430 install_element(CONFIG_NODE,
16431 &no_bgp_lcommunity_list_name_expanded_all_cmd);
16432 install_element(CONFIG_NODE, &no_bgp_lcommunity_list_standard_cmd);
16433 install_element(CONFIG_NODE, &no_bgp_lcommunity_list_expanded_cmd);
16434 install_element(CONFIG_NODE, &no_bgp_lcommunity_list_name_standard_cmd);
16435 install_element(CONFIG_NODE, &no_bgp_lcommunity_list_name_expanded_cmd);
16436 install_element(VIEW_NODE, &show_bgp_lcommunity_list_cmd);
16437 install_element(VIEW_NODE, &show_bgp_lcommunity_list_arg_cmd);
16438 }